среда, 28 марта 2012 г.

A HREF. Выпуск 1

Вступление


A HREF - это новый раздел этого блога.

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

Подсмотрев идею у link-блога addmeto.cc, я решил эти ссылки публиковать раз в неделю AS IS. В новостях Русофта такие выпуски я анонсировать не буду (кроме этого первого), поэтому если интересно получать выпуски оперативно подпишитесь на RSS ленту тега "href" этого блога.

Тематика ссылок как и у всего блога. Ссылки буду разбивать на группы, часть ссылок особенно по началу будут из старых запасов.

События

  • Отчет о конференции #MBLT12 - обзор конференции по мобильным технологиям от моб. приложений до коммуникаций, позже обещаю материалы и видео.

Разработка


Продуктивность, бизнес


Прочее

  • Рекурсивный zip-архив - про квайны я давно знал, теперь придумали тоже самое для .zip .gz архивов, круто
  • Голографическая реальность - необычная модель построения и происхождения вселенной, которая спорна, но может быть со временем подтверждена опытами. Даже со своей институтской физикой я понял меньше половины :) но интересно.

четверг, 15 марта 2012 г.

Выпуск 8. Hello GIT!

Очередной спец. выпуск.


Hello GIT!

Как я уже писал в новостях Русофта у нас построена вся инфраструктура для использования GIT вместо SVN.

На GIT уже успешно переехал ЕИС, в ближайший месяц-два переедет PortalEngine (движок ЕИС).

Ниже предлагаю части письма, которые я писал нашему ген. директору, когда обосновывал переход на GIT. Они ответят вам на вопрос "Зачем GIT, какой от него PROFIT?" (с нетехнической точки зрения). На многие технические вопросы для программистов я уже ответил в Вики.



Git

GIt - это система работы с исходным кодом (аналог используемого нами сейчас SVN). У неё есть важные технические отличия от SVN.

Углубляться в них не буду. Главное, что они позволяют добавиться нескольких преимуществ в разработке:

  • Возможность изолирования изменения по одной или нескольким задачам (в т.н. "ветку"). При это над веткой может работать несколько человек, а по её готовности и проверке она "вливается" в основной код (основную ветку).
  • Что в свою очередь позволяет более гибко выпускать обновления и исправления на рабочем сервере. Сейчас нередко ситуация когда нужно выпускать очередное обновление, а какая-то одна задача тормозит процесс, но простым способом "выкинуть" её из текущего кода. С Git таких проблем нет. 
  • GIT упрощает Hot Fixes, когда на уже выпущенной на рабочий сервер версии есть ошибки и нужно внести изменения. С SVN часто бывало, что наша разработка уже ушла вперёд и просто так протестировать и выложить исправления мы не можем. С GIT это решается более просто.
  • GIT "поощряет" часты и маленькие "коммиты" (фиксацию изменений), в отличии от SVN где коммит часто у разработчика результат работы за день-два. Чем меньше коммит, чем проще в последующем анализировать историю при поиске ошибок и объединения изменений.
  • В GIT возможна организации различных хитрых подходов к разработке. Например, когда в production (рабочую) версию системы разработчики не могут сами внести изменения, а только через руководителя проекта. Он проверяет изменения и после этого подтверждаю их внесение. Для начала у нас будет коммунизм, но со временем я буду вводить некоторые "бюрократические" схемы.
  • GIT быстрее чем SVN, хотя для нас это не особо критично.
  • С GIT в случае падения сервера с репозиторием, мы сможем полноценно продолжить работу, ничего не потеряв (один из нас может "назвать" себя сервером и работать, как раньше).

Чтобы перейти на GIT код ЕИС переписывать никак не нужно, но нужно поменять некоторые автоматические утилиты, которые мы используем при разработке и которые были завязаны на SVN:

  • сбор ядра Pe
  • обновление ядра в ЕИС
  • сбор обновлений для рабочего ЕИС



P.S.

Напомню, что с удовольствие опубликую в блоге любые ваши рассуждения на темы, которые могут быть полезны сотрудникам Русофт (с оговоркой, что блог публичный, поэтому обойдетесь без откровенных indside'ов).

понедельник, 5 марта 2012 г.

Выпуск 7. PHP 5.4 released

И так вышел релиз php 5.4.

Список нововведений, несовместимостей и руководство по миграции можно посмотреть на сайте php.net, полный change log тоже доступен.



Язык / интерпретатор

Из наиболее интересных изменений в языке/интерпритаторе:

Trait (типажи)

Cм. мою статью на Хабре, я её также собираюсь обновить, так как в релизе появилось пару новых полезных возможностей).

Dereferencing (разыменование)

Появилось для array и объектов, проще объяснить на примере:


    //array
    function abc() {
       return array('year' => 2012, 'month' => 12);
    }
    $year = abc()['year'];

    //object
    ( new DateTime() )->format('d.m.Y H:i'); 
    //обратите внимание на скобки, без них так не сработает


Тестовый сервер

Для разработки нужд теперь можно поднимать тестовый веб-сервер, прямо из php command line. Хороший вариант для тех, кто ленится разворачивать у себя на Windows тестовую машину (для linux это проще).

Не вздумайте использовать в production.

Подробности в документации.

Закопали наконец Выкинули magic_quotes и safe_mode.


Короткая запись массива и хеш-массива

    $a = ['title' => 'Yo', 'tags' => ['rap', 'yo']]; 
    $b = array('title' => 'Yo', 'tags' => array('rap', 'yo'));
    $a === $b; // => true

Closure с поддержкой $this, которые можно "перевешивать"

Примерно как Function.prototype.apply, Function.prototype.call в php.
Про это напишу подробнее когда-нибудь позже. Например, это позволит динамически "собирать" функциональность объектов.

Пока см. manual.


Стандартная библиотека

Из наиболее интересных изменений библиотеки:

  • json_encode с флагом поддержки прямого unicode (без escape последовательностей, типа \u****,  теперь просто в UTF-8) - позволит ускорить обработку таких json в браузере и формирование на сервере
  • реализация объекта сессий (вместо набора кучи фукнций)
  • новые SPL классы (а вы ещё не знаете/не используете SPL? Срочно читать manual).

Не совместимости

Большинство заметит только пару новых reserved words и удаленые древние фукнции:
session_is_registered(), session_register() и session_unregister().

Полный список.


Спасибо Вове А. за помощь в написании статьи.

пятница, 27 января 2012 г.

Выпуск 6. Короткий

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



Продуктивность




Программирование

вторник, 13 декабря 2011 г.

Выпуск 5. Поток, зона комфорта и алгоритмы сортировки

В этот раз коротко.


Ещё раз про поток

Я уже упоминал поток раньше, вот вам ещё немного по этой теме:


Git победил

В непростом бою Git vs Mercurial для использования в проекте ЕИС победил Git.

Причины: 
  • в данный момент - лучшая интеграция в PHPStrorm и многие другие инструменты для разработки,
  • хорошее руководство в виде GitHowTo и Pro Git.
К Mercurial я по прежнему отношусь очень хорошо, во многих аспектах он лучше Git.


Зона комфорта

Не хочу пересказывать слова умных людей, вот вам две ссылки и цитата:

<...> человек в своей зоне комфорта пребывает в бездействии по отношении ко всему новому, ко всему непривычному, к новому опыту, к новым знаниям, ко всему, что может вызвать хотя бы малейший дискомфорт <...>.
Поэтому зону комфорта нужно расширять за счет огромнейшей зоны дискомфорта. Ведь именно в зоне дискомфорта лежат наши пока не достигнутые цели, пока необретенные знания, новый опыт и много-много всего другого.
 
(Мария Евграшина, tim.com.ua) 
Зона комфорта и бездействие от незнания
Зона комфорта и точки бифуркации

Развитие не возможно без преодоления трудностей!

Алгоритмы сортировки

Во-первых, интересный ресурс sorting-algorithms.com, где можно визуально посмотреть и оценить различные алгоритмы сортировки, их производительность для различных входных данных.

Во-вторых, статья про один из самых молодых общих алгоритмов сортировки TimSort, обладающий хорошей скоростью. Он уже заменил классический Qsort в python и java. По сути TimSort является удачной комбинацией ранее известных принципов.


Совет

Как ускорить вход по ssh - заметка в вики.


среда, 16 ноября 2011 г.

Выпуск 4. Супермены, будьте реалистами


I'm a superman!

Супермены (они же "герои", они же "трудоголики"), распространённая проблема, которую я встречал в своей жизни не раз. Кто они? Это люди, которые готовы работать до потери сил, в любой день, в любое время. Они могут сидеть на работе по 12 часов и ещё работать в выходные. При этом некоторым из них нравиться осознавать мазохистский факт того, что они делают что-то невозможное. Им нравится факт того, что они ничего не жалеют ради любимой работы.

По началу я тоже восхищался такими людьми. Сам я на такое никогда не был способен, а все попытки работать много заканчивались не удачно. Чуть позже я стал находить упоминание этой проблемы в книгах и пришёл к совершенно противоположному мнению. Цитата:

<...> трудоголизм не только не обязателен, он глуп. Работать больше не значит больше заботиться об успехе бизнеса или больше выполнять. Это значит только то, что вы больше работаете. 
В итоге трудоголики создают больше проблем, чем решают. Во-первых, подобный стиль работы не может быть стабильным долгое время. И когда человек «перегорит», а это обязательно случится, последствия будут очень серьезными.  
<...> Трудоголики даже создают кризисы. Они не пытаются стать более эффективными, потому что на самом деле любят работать внеурочно. Им нравится чувствовать себя героями. Они создают проблемы (часто неосознанно), чтобы затем просто начать больше работать.
<...>На самом деле трудоголики не выполняют больше, чем нетрудоголики. Они могут заявлять, что являются перфекционистами, но это означает только трату времени на шлифовку незначительных деталей вместо того, чтобы переходить к следующей задаче. 
<...> Трудоголики – не герои. Они не берегут время, они просто сжигают его. Настоящий герой уже давно дома, он нашел более быстрый способ завершить свои дела.

Это часть из книги "Rework: бизнес без предрассудков", о ней и её предшественнице "Getting real" ниже.


Getting real, Rework

Это две книжки от известной компании 37signals (ага, та самая, которая создала BaseCamp и фреймворк Ruby on Rails).

Первая - "Getting real" крайне рекомендуется всем, особенно разработчикам и руководителям проектов. Книга состоит из 91 эссе, разбитых на 16 глав, и содержит много конкретных советов, как сделать лучше то, чем вы занимаетесь. Также это очередная книжка_которая_учит_нас_жить, но в отличии от многих других, делает это изящно и не навязчиво. Книга сделана короткой, намеренно короткой (прочитав книгу становится понятно, почему). При этом по количеству единиц смысла она превосходит многие многостраничные безнес-трактаты, которые мне приходилось читать.

Книга доступна свободно на сайте авторов, в том числе в переводе на русский.


Вторая - "Rework: Бизнес без предрассудков". Является идеологическим продолжением первой книги, но в основном с уклоном в бизнес сферу и управление персоналом. Стоит оговорится, что книга не столь однозначная, как Getting Real. Некоторые считают что это взгляд на бизнес из песочницы. Книга наделала не мало шума, есть как и фанаты, так и ярые противники. Я по какой-то причине не осилил её дочитать :) , возможно повторю попытку в ближайшее время.

Книгу можно подобрать на флибусте или купить в Озоне. Более подробное описание есть у М-И-Ф, которые её и издали в России.


DVCS: GIT & Mercurial

Прочитал две "канонические" книги про распределённые системы контроля кода: "ProGit" и "Mercurial: The Definitive Guide".

Как книжка мне больше понравилась "ProGit", как система контроля ревизий - Mercurial. Для тех кто, просто хочет узнать, что такое DVSC, лучше начать с ProGit, без этого в "Mercurial: The Definitive Guide" будет не понятно около половины текста :)

Я сейчас для себя начал активно использовать обе эти системы, чтобы понять на практике их отличия. После нового года, участь перехода на DVCS ждёт всех кто работает над ЕИС. Кто не спрятался, я не виноват.

Книги доступны полностью свободно и в разных форматах:
ProGit - сайт, на английском, в переводе на русский.
Mercurial: The Definitive Guide - сайт, на английском, в переводе на русский.

понедельник, 24 октября 2011 г.

Выпуск 3. Работа с датами в php


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


Совет

Если вам написал заказчик с проблемой, которую вы не можете решить или даже рассмотреть сегодня, обязательно напишите ему, что вы задачу приняли, но сможете ей заняться не сразу. Например, "Да, вашу проблему вижу. Я её смогу исследовать в ближайшие 2 дня, исправлю не позже чем за 2 недели".

Благодаря такому подходу:

  1. заказчик будет доволен и видит, что вы про него не забыли
  2. заказчик будет знать, хотя бы примерно, когда ждать рез-та
  3. заказчик будет понимать, что вы работаете не только с ним и что любая его задача не обязательно выполняется в режиме "всё бросить и начать делать". Со временем он начнёт четче для себя представлять какие задачи для него сейчас приоритетнее, а какие были результатом мимолётного желания и могут подождать некоторое время.


Ну и без фанатизма, иногда действительно нужно всё бросить и делать, но не так часто, как это кажется.




Работа с датами в php


Разберёмся, как работать с датами в php и вообще. Это является проблемой для некоторых, о чём я могу судить по вопросам, которые иногда мне задают.



Time zone

Для начала правильно настройте текущую временную зону (TZ) в php и базе данных. В php смотрите на функцию date_default_timezone_set, в mysql - http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html. В mysql можно задать как дефолтную временную зону, так и зону для каждого соединения.

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



Форматы

Сначала разберемся с форматами.

1. Строки без временной зоны. Если вы используете дату в "стиле mysql" (YYYY-MM-DD HH:MM:SS) или подобных человеко-читаемых строковых форматах, где не содержится информация о временной зоне, всегда согласовывайте в какой временной зоне будут данные. Если вопрос идёт о каком-то внешнем API (как получение, так и приём), лучше всегда использовать форматы с указанием временной зоны или не зависящие от неё. На крайний случай согласовать временные зоны и нормализовать данные при обработке.

2. Строки с указанием временной зоны. Например, как в заголовках HTTP - "Thu, 19 Nov 1981 08:52:00 GMT". Основная проблема таких дат - их парсинг. Из-за неразберихи в форматах браузеры, например, хранят эту дату для If-Modified-Since напрямую в том виде, как передавал сервер. Использовать такое представления для внутреннего хранения не рекомендуется.

3. Timestamp, (micto timestamp) - это уже число, а не строка. Показывает кол-во секунд (микросекунд) с 00:00:00 01.01.1970 UTC. Не все знают, что это значение TZ независимо! Оно отсчитывается от времени по гринвичу (UTC), не зависимо от того, какую временную зону вы используете. Т.е. при преобразовании строка -> timestamp и обратно *важно*, какую временную зону вы используете. Например, в strtotime при работе в временной зоне MSK от полученного после парсинга значения даты вычитается 4 часа, затем считает timestamp. В обратную сторону аналогично. Зато если у вас есть время в виде timestamp вы можете не думать о TZ. Это подходящий формат для использования в API.

Важно ещё помнить, что отсчитывается timestamp от 1970 года и, например, хранить даты рождения в таком формате нельзя (ну по крайней мере ещё ближайшие лет 100, потом уже будет можно :) ), а вот записи в журнале изменения это самое оно.


Перевод форматов в php

1. Перевод строка -> timestamp:

1.1 strtotime

$timestamp = strtotime($dateString);


где можно безопасно использовать форматы, типа "YYYY-MM-DD HH:MM:SS" и некоторые другие. Обработка происходит "магическим" методом, поэтому ...

1.2 strptime

Для более точного задания формата можно использовать strptime. Только она возвращает не timestamp, а набор распознанных данных, но можно написать не сложную функцию по преобразованию уже в timestamp. Всё это актуально для php 5.1+, для более старых версий нужно найти реализацию strptime на чистом php.

1.3 через DateTime класс

Актуально для php 5.3+

$mydate = DateTime::createFromFormat('d-M-Y', '15-Feb-2009');
echo $datetime->format('U');

Плюс в том, что форматов поддерживается очень много, минус в том, что формат задаётся в формате, близком к функции date, а я, например, больше люблю формат strftime (%Y-%m-%d).


2. Timestamp -> строка

2.1 strftime

strftime(%Y-%m-%d %H:%M:%S, $timestamp);

2.2 date

date('Y-m-d H:i:s', $timestamp)

2.3 через класс DateTime

$mydate = DateTime::createFromFormat('@'.$timestamp);
$mydate->format('Y-m-d H:i:s');
strftime('%Y-%m-%d %H:%M:%S', (int) $mydate->format('U')); 
//но так ещё нужна проверка на unix эпоху


Операции с датами

И так, до 5.2 практически единственным способом операций с датами было использование strtotime, который позволяет писать так:

$tmpstmp = strtotime('now +1 week');
$tmpstmp = strtotime('2011-10-24 12:00:00 +1 month -5 days');

Но опять же из-за "магического свойства" этой функции, иногда были проблемы. Для обхода проблем нагородили кучу сложных способов, например, кто видел реализация Zend_Date, тот в цирке больше не смеётся. Плюс ко всему ниже unix эпохи (1970 год), опуститься нельзя.

В php 5.2 появился новый класс DateTime, а в php 5.3 к нему добавилось пару полезных возможностей. Теперь его можно рекомендовать в виде основного инструменты работы с датами. Там возможны любые операции:
- вычитание дат (DateTime) - (DateTime) = (DateInterval)
- добавление/вычитание из даты: (DateTime) +- (DateInterval) = (DateTime)
- форматирование (см. примеры выше)
- распознание строковых представлений (см. примеры выше)
- работа с временными зонами и пр.

Класс работает с датами от 0 до 9999 года (в "кишочках" используется 64bit целое число).
Крайне рекомендую.

Подроблее читайти manual - http://ru.php.net/manual/en/class.datetime.php

В PE/ЕИС я собираюсь немного похимичить с этими классами, чтобы заставить их принимать strftime формат, даже с некоторыми расширениями.

Результатом поделюсь со всеми желающими.