понедельник, 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 формат, даже с некоторыми расширениями.

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

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

Выпуск 2 - работа в "потоке", язык Dart, видео лекции


Работа в режиме "Потока"

Цитирую:

Во время работы в одиночестве человек в идеале находится в состоянии, которое психологи называют потоком. Поток – это состояние глубокого, почти медитативного погружения в работу. В этом состоянии человек испытывает лёгкое чувство эйфории и не замечает течения времени: «Я начал работать. Когда оторвался, прошло уже три часа». Человек не прикладывает сознательных усилий, потому что работа, кажется, идёт потоком. Вы часто бывали в этом состоянии, поэтому нам не нужно его описывать.
Не все виды работы требуют состояния потока для достижения хорошей производительности, но для любого, кто связан с проектированием, дизайном, разработкой, письмом или подобными задачами, поток – необходимость. Это задачи, требующие сильного импульса. И только в потоке подобная работа продвигается хорошо.
К сожалению, поток нельзя «включать» по желанию. Требуется медленное погружение в предмет, не менее пятнадцати минут концентрации, прежде чем появится это состояние. В период погружения вы особенно чувствительны к шуму и остановкам. Шумная среда может затруднить или сделать невозможным вход в поток.
Из потока вас может легко вывести направленное непосредственно на вас воздействие (скажем, ваш телефон) или назойливый шум («Внимание! Сообщение для Пола Портулаки! Пол Портулака, позвоните по внутреннему номеру…»). После каждого такого вмешательства требуется дополнительное время для возврата в поток. И в это время работа стоит на месте.

Это одна из наиболее важных отложившихся в моей голове мыслей из замечательной книги "Человеческий фактор. Успешные проекты и команды" ("Peopleware") от не менее замечательных Тома Демарко и Тимоти Листера.

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

В инете книга есть в бесплатном  украденном виде:
http://flibusta.net/b/72962

Купить можно в Ozon или в любых других местах:
http://www.ozon.ru/context/detail/id/2338486/


Видео-лекции

Опубликовали видео-лекции с Yet Another Conference (проводит Яндекс, приглашают разных людей). Самое интересное оттуда лекции из 3-го зала про БЭМ в разных его проявлениях. Сам ещё не смотрел, но собираюсь. Вова смотрел в прямом эфире, ему понравилось, рекомендует.

http://yac2011.yandex.ru/

Есть и другие интерсные видео опубликованные за последнее время, ссылки тут:
http://habrahabr.ru/blogs/webdev/130137/



PHP Tips & Tricks

Если вы хотите разбить строку, где что-то написано через запятую или другой делитель, используйте:

$sites = preg_split('/[\s,]+/ums', $sitesString);

а не просто метод explode. Это позволит игнорировать пробелы.


Pomodoro - часть 2

Ещё несколько соображений по использованию pomodoro, а вернее его модификации (см. первый выпуск).

Ещё плюс: уходя домой я теперь могу взять список завершённых дел за день и порадоваться, раньше мне иногда казалось, что день прошёл, а я нифига не сделал.

Я начала делать список задач на день вечером, теперь могу говорить наверняка, это удобно. Можно выиграть 20-30 минут утром, когда тихо и спокойно на важные задачи.


По офису

я описал мониторы:
http://wiki.rusoft.lan/doku.php?id=office:monitor:start

и обновил список вирт. машин (поднял обратно с WinXP + IE6):
http://wiki.rusoft.lan/doku.php?id=office:test-comp


Dart

Интересная разработка от Google - новый язык Dart. Один из претендентов (не первый и не последний, по правде говоря) на замену JavaScript в вебе. При этом позволяет исполнять код на серверной части в вирт. машине. Скорость обещают сравнимую с компилируемым кодом.

В браузере может исполняться и сейчас транслируясь в JavaScript (поддерживает современные браузеры), но так он работает медлено. Позже обещают внедрить также <script type="application/dart"></script>, но это пока не сделано даже в Chromium или Chrome. Внутри есть API по обращению к Dom дереву документа и окну, очень похожий на JavaScript'овский.

Язык с опциональной типизацией, что уже само по себе прикольно. Работа с "традиционными" классами более нативная, чем в JavaScript. Поддерживаются getter/setter. Есть возможность писать реальный (а не псевдо, как на JS) много поточный код, по методологии акторов, называется Isolate. Поток исполняется в своей отдельной области памяти, общение через отправку сообщений.

http://www.dartlang.org/



Совет

В вашем inbox в почтовой ящике должно быть только то, что ещё требует ответа или действия, всё остальное нужно расскладывать по папкам в архив.
Идеальный inbox - пустой inbox.


P.S.

Интересный комментарий от Тимофея на прошлый выпуск.

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

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

Выпуск 1 - вступление, летнее время и помидорки




Всем привет.

Начну выпуск новостей по разным вопросам, которые интересны лично мне (это основной критерий :) ) и возможно будут интересны вам.

Общие темы примерно такие:

  •  управление временем (собственным и чужим)
  •  личное развитие
  •  новые интересные технологии и научные открытия
  •  бизнес-литература


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

Оставляйте комментарии (они пока открыты даже анонимам, но если будут спамить, закрою).
Также с удовольствием включу ваши заметки/новости в выпуск с указанием авторства, если они подходят под общую тематику.


Летнее время

Всем рекомендуется вспомнить, что в октябре этого года РФ не будет переводить часы с летнего времени и мы останемся жить в GTM+4. Если не обновить информацию об этом, операционные системы автоматически переведут время в последнее ВС октября.

В linux на Debian за это отвечает пакет tzdata, обновить данные так:
sudo apt-get update
sudo apt-get install tzdata

Обновлять всю систему не нужно. В Ubuntu исправленные пакеты доступны во всех версиях, начиная с 8.04 (в updates репозитории). Исправления по этому пакету безопасно выполнять в production, не останавливая сервер.


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

Очевидная идея, которую я ранее для себя не формализовал:

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

Продуктивность - это возможность работать меньше, а делать при этом больше!

"Помидорная техника"

Она же Pomodoro technique.
Вводная статья: http://tim.com.ua/2009/10/pomodoro-technique/

Попробовал на себе в каноническом виде, не понравилось, но несколько практик перенял.

Не понравилось, что при отрезках 25 мин на задачи, мои задачи часто прерывались, когда я только начинал входить в раж (это действительно особое состояние работы мозга, расскажу в след. выпуске). Если после этого ещё 5 минут отдохнуть, задачу надо было начинать, как с нуля.

Понравилось и что я перенял:
Я и так всегда составлял список дел и проектов, которые у меня есть (по GTD), но они были отсортированы только по 4-м приоритетам. Я приходил с утра, брал какую-нибудь задачу из списка, делал, возвращался к списку, заново его изучал, думал, что теперь лучше делать, брал следующую задачу и т.д.

Теперь я делаю так.

  1. Прихожу с утра смотрю на свои задачи и проекты (ежедневный пересмотр по GTD).
  2. Выбираю список задач на сегодня, сортирую так, чтобы в данном порядке их было выполнять интересно и приятно =)
  3. Распечатываю этот список.
  4. На распечатке записываю, сколько времени и сколько рабочих отрезков ушло на задачу. Если меня прервали в процессе ненадолго ставлю пометку.
  5.  Если в процессе появилась новая задача, добавляю её в список на бумажке.


Трачу на этот процесс 5-20 минут, не спешу с ним, подхожу основательно, добавляю в процессе в список задачи, про которые забыл.

Задачи не обязательно выбираю по приоритету.  Выбираю только то, что точно успею за день (если что-то в списке осталось - это плохо, лучше составить ещё список). Микширую задачи с разной спецификой, чтобы не уставать от однотонности.

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


Если занимаюсь какой-то задачей на остальные стараюсь не обращать внимания, в т.ч. на почту и jabber.

Возможно позже попробую перенести пересмотр задач на вечер, чтобы с утра на свежую голову и сразу в бой! (... но это противоречит моим привычкам и GTD, так что пока не пробывал).

Совет

Всегда записывайте в отдельный список, кто и чего вам должен написать, предоставить, сделать. Добавляйте данные о том от кого вы это ждёте и когда начали ждать.