• История 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;
    }



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

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

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

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

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



  • Мои сайты образца 2001 года

    Ковыряясь в веб-архиве (https://web.archive.org) по рабочей необходимости, внезапно решил проверить: а не сохранились ли в нем сайты, которые я делал на заре своей веб-деятельности? Самые старые сайты, я, к сожалению, не нашел, видимо, в то время "машина времени" еще не работала. Но парочку утерянных проектов все-таки удалось выцепить из цепких лап временного краулера ). Было принято решение возродить их к жизни.

    Один из этих сайтов, располагающийся ранее на домене http://movies.samara.ru, представлял из себя ни что иное, как банальный варезник с кучей пиратских цифровых версий фильмов. В начале 2000-х такие сайты были довольно актуальны, так как видеокассеты из обихода еще не вышли, а DVD - не совсем вошли. Перспектива смотреть фильмы на экране компьютера была очень заманчивой. Как раз стали входить в моду видеокодеки типа DivX, Xvid и т.п.

    Главной проблемой распространения фильмов через интернет в то время были маленькие скорости обмена информацией почти у всех, имеющих доступ в интернет. Как правило, это был модем на 33 или 56Кбит/с, до которых все равно не дотягивал по причине несовершенства телефонных сетей. 

    Вторая проблема покажется сейчас нелепой для большинства нынешних интернет-пользователей. Фильм было попросту некуда выложить для того, чтобы предоставить к нему доступ другим людям. Вариантов было несколько:

    • Можно было попробовать сжать качество видео и звука, что превращало фильм в набор мутных слайдов и шипящим звукорядом, но зато уменьшало его объем в разы.
    • Самый распространенный способ - воспользоваться одним их бесплатных онлайн-хранилищ. Но, если учитывать, что места они предоставляли очень немного, в районе 5-10 мегабайт, приходилось делать 15-20 учетных записей для каждого фильма, разбивать видео на куски, архивируя с паролем, в котором хорошим тоном считалось указывать адрес своего варез-ресурса, и закачивать в хранилище. В итоге пользователю предлагалось скачать кучу маленьких файлов, потом собрать их в один файл в архиваторе, не забыв правильно ввести пароль. Если один из файлов был поврежден - сами понимаете, получалась большая печалька.
    • Были целые форумы, посвященные поиску публичных и не очень FTP-аккаунтов, на которые можно было закачать фильм. Жили такие аккаунты недолго, админы серверов, с которых в разы возрастал входящий и исходящий трафик (кстати, местами очень даже не бесплатный), быстренько прикрывали лавочку, оставляя десятки кинолюбителей с носом.

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

    В общем, не думаю, что сайт представляет хоть какую-то ценность как для человечества в целом, так и для меня в частности. Переходим к следующему.

    Когда-то я был ярым фанатом сериала "Секретные материалы". Собирал книжки, видеокассеты, любую информацию о героях данного произведения Криса Картера. С появлением интернета стал собирать оцифрованные копии эпизодов, саундтреки сериала и фильмов, и в результате появился сайт, который я назвал "X-Files Forever". Там я постарался собрать информацию обо всем, что имелось у меня в наличии по теме "Секреток", и разбавлял все это новостями о паранормальном и непознанном, которые находил на разных тематических ресурсах. На сайте действовал небольшой интернет-магазинчик, где можно было купить сборник эпизодов, порой даже с моим переводом и дубляжом (да, парочку эпизодов я перевел сам, в сети было сложно достать русскоязычный перевод сериала).

    Пока я восстановил только главную страничку. Она лежит по адресу http://blackrid.ru/xfiles. Думаю, как будет время, восстановлю другие страницы. Это - гид по эпизодам, биографии персонажей сериала и актеров, которые их сыграли, сборники музыки, фотографии. Магазин, по понятным причинам, оживлять не буду ) В общем, посмотрим, как дальше пойдет дело.







  • Фриланс для программистов: подборка лучших сайтов

    Взято с сайта https://proglib.io - https://proglib.io/p/freelance/

    Многие ищут фриланс для программистов, но далеко не все знают, где искать. Мы составили список ресурсов, которые вас заинтересуют.

    Разберемся, что представляет из себя фриланс для программистов, и как быстро освоиться на приведенных ниже сайтах.

    1. FL

    Говорят, что фрилансеры здесь варятся в собственном соку. И это отчасти правда, ведь те, кто успел запрыгнуть в ТОП с самого начала работы сайта, прочно там засели. У вас, естественно, не будет столько заказов, сколько у «избранных», что, тем не менее, не означает отсутствие работы у «простых смертных».

    Для фрилансеров существует множество категорий, так что каждый найдет свою специализацию. Другое дело, что FL с давних пор платный. Если изначально лишь некоторые заказчики делали заказы доступными для исполнителей с PRO-аккаунтами, то теперь, чтобы оставить комментарий под любым заказом, нужно этот самый аккаунт иметь. А это ни много ни мало почти 1700 руб./мес. И ведь не факт, что отобьются…

    Куда комфортнее себя чувствуют работодатели: можно брать PRO, а можно и не брать. Ответов по проекту в любом случае будет море. Да и дешевле обходятся вебмастерам все эти PRO-плюшки.

    Несправедливо, да. Но привыкайте: золотое правило фриланса – заказчик всегда прав.

    Остальное - под катом )



Загрузка...

Войти на сайт

Регистрация