• Доступность Moodle по двум доменным именам или IP-адресам

    НЕ МОЁ. Оригинал статьи тут:

    Возникла необходимость, чтобы Moodle был доступен по двум доменным именам, на самом деле, в моем случае, нужно было сделать, чтобы Moodle был доступен по двум разным IP адресам. Да, соглашусь, что лучше сделать доступ по одному доменному имени. Читал о том, что на сервере удобно иметь две сетевые карты и т.д.

    Я решил сделать небольшую настройку, которая бы позволяла работать moodle на любом IP адресе или домене, осознаю, что это может быть не совсем безопасно, ведь это даст возможность отправить данные с любого хостинга и повышает вероятность взлома... Но, на данный момент это единственный выход для меня.

    Вся загвоздка в значении свойства wwwroot объекта  $CFG в файле config.php. Во время установки туда сохраняется имя домена или IP адрес, к которому обратился пользователь и произвел установку Moodle.

    Лечится (ломается) все следующим образом:

    находим строку типа:

    $CFG->wwwroot =′http://my-domain.ru/′;

    заменяем на:

    $CFG->wwwroot =′http://′.$_SERVER[′HTTP_HOST′];

    Так же значение wwwroot интересно тем людям, которые переносят Moodle с локального хостинга на арендуемый сервер. Или когда необходимо иметь доступ к LMS Moodle из внутренней сети учебного заведения и внешней (многие учебные заведения создавая свой сервер сталкиваются с такой необходимостью).

    Другие способы решения проблемы, но придется поплясать с бубном:



  • Unity3D: Исключение NullReferenceException при переключении платформы на Android

    NULLREFERENCEEXCEPTION IN MOBILECONTROLRIG.ENABLECONTROLRIG AFTER SWITCHING PLATFORM IN EDITOR

    Steps to repro:

    1. Open attached project;
    2. Go to BuildSettings (File -> Build Settings);
    3. Select any other available platform (i.e. WebGL);
    4. Click Switch Platform.

    Expected result:
    Platform is switched without errors.

    Actual result:

    Error:

    NullReferenceException
    UnityStandardAssets.CrossPlatformInput.MobileControlRig.EnableControlRig (Boolean enabled) (at Assets/Standard Assets/CrossPlatformInput/Scripts/MobileControlRig.cs:89)
    UnityStandardAssets.CrossPlatformInput.MobileControlRig.CheckEnableControlRig () (at Assets/Standard Assets/CrossPlatformInput/Scripts/MobileControlRig.cs:82)
    UnityStandardAssets.CrossPlatformInput.MobileControlRig.OnActiveBuildTargetChanged (BuildTarget previousTarget, BuildTarget newTarget) (at Assets/Standard Assets/CrossPlatformInput/Scripts/MobileControlRig.cs:98)
    UnityEditor.Build.BuildPipelineInterfaces.OnActiveBuildTargetChanged (BuildTarget previousPlatform, BuildTarget newPlatform) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:345)
    UnityEditor.Build.BuildPipelineInterfaces:OnActiveBuildTargetChanged(BuildTarget, BuildTarget)

    Notes:

    - Reproducible in 2017.2.0b3, 2017.1.0f3;
    - The code doesn′t compile in 5.6.1p2;
    - Reproducible on Windows 10;
    - Uncommenting line 82 in ′MobileControlRig.cs′ script fixes the issue.


    Solution:

    Change de namespace to
    namespace Standard_Assets.CrossPlatformInput.Scripts

    if has error about UnityEngine dont found, use
    #if UNITY_EDITOR
    using UnityEditor;
    #endif



  • Unity3D: Вводная в синтаксис

    Представлен систаксис на Javascript

    Игровой объект


    Создание нового игрового объекта с именем MyObject.

    var myObject = new GameObject("MyObject");

    Созданный объект будет доступен по ссылку myObject.

    Поиск объекта по его имени.

    var myObject = GameObject.Find("MyObject");



    Теги можно использовать для помечания группы объектов со сходными свойствами, либо использующиеся в единой сцене.
    Поиск объекта по тегу, возвращает единственный объект:

    var myObject = GameObject.FindWithTag("MyTag");



    Возвращает список всех объектов с указанным тегом:

    var objectList = GameObject.FindGameObjectsWithTag("MyTag");



    Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:

    var isCompare = GameObject.CompareTag("MyTag");



    Уничтожение объекта:

    Destroy(myObject);



    Уничтожение объекта через минуту, после его создания:

    Destroy(myObject, 60);





  • История ProjectStalker

    Сегодня хотелось бы вспомнить один, как сейчас модно говорить, "стартап", один из немногих проектов, который в конечном итоге достиг задуманного результата. Проект был построен на энтузиазме участников, он не подкреплялся материально, не привлекал пожертвования. Вообще-то, честно говоря, проект прожил так долго лишь благодаря "упёртости" (в хорошем смысле слова) руководителя этого начинания. Зовут его Алексей Калачёв, на форуме 4PDA зарегистрирован под ником "Akkelman". Кому будет интересно, вот адрес его странички ВКонтакте.

    Но перейдём к самой истории. Давным-давно, в 2012 году, на форуме 4PDA появилась тема "S.T.A.L.K.E.R. mobile". Автором темы был некто sneek94. Он вынашивал идею сделать порт игры "S.T.A.L.K.E.R. - Тени Чернобыля" с PC на платформу Android. В качестве движка был выбран Unity. Первые сборки включали в себя небольшую локацию, которая была затекстурена в сталкерском стиле (ржавое железо и т.п.). В них можно было только бегать и смотреть по сторонам.

    Народу на форуме очень понравилась эта идея. Вместе с тысячами школьников, почуявших, что, возможно, появится шанс похвастаться перед одноклассниками "тем самым Сталкером на моем телефоне", подтянулись и знающие люди, профессионалы Unity. Они помогли топикстартеру прикрутить к проекту грамотное тач-управление, даже оружие и некоторых мобов. Игра оживилась, но тут произошло то, что заставляло закрывать проект и более продвинутых разработчиков.

    Продолжение - под катом.



  • Клонирование объекта в Javascript

    Метод Object.assign() используется для копирования значений всех собственных перечисляемых свойств из одного или более исходных объектов в целевой объект. После копирования он возвращает целевой объект.

    Метод Object.assign() копирует из исходных объектов в целевой объект только перечисляемые и собственные свойства. Он использует внутренний метод [[Get]]на исходных объектах и внутренний метод [[Set]] на целевом объекте, так что он также вызывает геттеры и сеттеры. Именно поэтому он присваивает свойства вместо простого копирования или определения новых свойств. Это поведение может сделать метод непригодным для вливания новых свойств в прототип, если вливаемые исходные объекты содержат геттеры. Вместо него для копирования в прототипы определений свойств, включая признак их перечисляемости, следует использовать методы Object.getOwnPropertyDescriptor()и Object.defineProperty().

    Копируются свойства типов как String, так и Symbol.

    В случае возникновения ошибки, например, когда свойство является незаписываемым, возбуждается исключение TypeError, а целевой объект targetостаётся неизменным.

    Обратите внимание, что метод Object.assign() не выкидывает исключения, если в качестве исходных значений выступают null или undefined.


    Пример: клонирование объекта

    var obj = { a: 1 };
    var copy = Object.assign({}, obj);
    console.log(copy); // { a: 1 }

    Пример: слияние объектов

    var o1 = { a: 1 };
    var o2 = { b: 2 };
    var o3 = { c: 3 };
    var obj = Object.assign(o1, o2, o3);
    console.log(obj); // { a: 1, b: 2, c: 3 }
    console.log(o1); // { a: 1, b: 2, c: 3 }, изменился и сам целевой объект.

    Больше информации тут



  • Из старого: Схема организационно-технического построения системы оповещения на базе КТС П-166

    Схема была сделана для организации, занимающейся подготовкой пожарных и работников МЧС в качестве одного из интерактивных учебных пособий.

    Комплекс технических средств оповещения предназначен для создания автоматизированных систем централизованного оповещения, в том числе локальных систем оповещения потенциально опасных объектов, с целью обеспечения оповещения органов управления, должностных лиц и населения об угрозе возникновения или о возникновении чрезвычайных ситуаций.

    Схема разработана на Adobe Flash. Интерфейс очень простой. Поскольку размер окна, где она будет отображаться, был слишком мал, а схемк должна быть читаемой, было решено сделать что-то вроде поэкранного скроллинга. Была добавлена анимация и всплывающие подсказки при наведении на узлы схемы.

    Схема не доделана, нарушен порядок слоёв и присутствуют еще несколько "артефактов". Не пригодилась, поэтому теперь лежит в архиве.



  • PHP + cURL. Парсинг сайта с формой авторизации. Шаг 2

    Итак, нам удалось подключиться к сайту, получать от него COOKIE и отдавать их обратно вместе с другими заголовками, создавая видимость работы обычного браузера. Но как мы узнаем, прошла ли авторизация? Самым простым способом мне показалось найти в полученном коде код кнопки "Logout", которая присутствует на странице, если пользователь успешно авторизовался.

    function isAuth( $data ) {
      $flag = false;
      preg_match_all( ′/<button[^>]+?[^>]+>(.*?)</button>/i′, $data, $m );
      foreach( $m[ 1 ] as $a ) {
        if ( $a == ′Logout′ ) {
          $flag = true;
        }
      }
      return $flag;
    }
    if ( isAuth( $data ) ) {
      echo ′Авторизованы!′;
    } else {
      echo ′Не авторизованы!′;
    }



  • PHP + cURL. Парсинг сайта с формой авторизации. Шаг 1

    Бывают ситуации, когда надо получить контент множества страниц сайта-каталога. Но, как назло, каталог виден только тем пользователям, которые прошли процедуру авторизации. Как же быть?  Использовать PHP+cURL.

    Сначала смотрим код формы авторизации и ищем названия переменных, которые передаются скрипку авторизации, и url самого скрипта:

    <form id="loginForm" action="/SignonMain.aspx" method="post">
      <div>
        <div class="login-module-label float-left">LOGIN</div>
        <div class="float-left login-label-margintop">Username *</div>
        <div class="float-left"><input class="login-module-inputs" type="text" id="menuUserName" name="menuUserName"></div>
        <div class="float-left login-label-margintop">Password *</div>
        <div class="float-left"><input class="login-module-inputs" type="password" id="menuPassword" name="menuPassword"></div>
        <button type="button" class="button ladda-button npa-btn" id="bMainMenuLogin" data-style="expand-right">
          <span class="ladda-label">LOGIN</span>
        </button>
      </div>
    </form>

    Ага, имена переменных - "menuUserName" и "menuPassword", путь к скрипту - "/SignonMain.aspx". 

     function connect() {
      $ch = curl_init();
      curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" );
      curl_setopt( $ch, CURLOPT_URL, $site_url . ′/SignonMain.aspx′ ); // отправляем на
      curl_setopt( $ch, CURLOPT_HEADER, 0 ); // пустые заголовки
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // возвратить то что вернул сервер
      curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // следовать за редиректами
      curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 30 );// таймаут
      curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );// просто отключаем проверку сертификата
      curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); // Не проверять Host SSL сертификата
      curl_setopt( $ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . ′/cookie.txt′ ); // сохранять куки в файл
      curl_setopt( $ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . ′/cookie.txt′ );
      curl_setopt( $ch, CURLOPT_POST, 1 ); // использовать данные в post
      curl_setopt( $ch, CURLOPT_POSTFIELDS, array(
        ′menuUserName′ => $username,
        ′menuPassword′ => $password
      ) );
      $data = curl_exec( $ch );
      return $ch;
    }



  • Редизайн сайта

    Наконец-то у меня дошли руки и до своего собственного сайта. А то, как говорится, "сапожник без сапог". Смешно, конечно, но так оно и было. Переделал всю структуру, сделал сайт в форме блога. Портфолио вынес отдельным разделом, а новостная лента теперь - непосредственно блог.

    Удачной идеей мне показалось сделать привязку каждой записи к одной или нескольким подкатегориям, чтобы в дальнейшем можно было фильтровать результаты отображения записей по нужной теме, например, "Программирование".

    Добавил также систему комментариев к записям. Пока простенькую, но на этапе тестирования сойдет.

    Осталось сделать регистрацию и авторизацию, а также раздел "Всякоразности", в котором буду собирать информацию о промежуточных проектах, выполненных мною.



Загрузка...

Войти на сайт

Регистрация