2014-10-24

О времени

Федеральный закон от 21.07.2014 N 248-ФЗ «О внесении изменений в Федеральный закон «Об исчислении времени» доставил много попоболи.

На час назад
Таймзоны у нас не просто поменялись, еще и добавились новые. Если посмотреть ченджлоги Time Zone Database, то выходит:
  • большинство часовых поясов передвигаются на час назад
  • Магаданская область (Asia/Magadan) и Забайкальский край передвигаются на два часа назад
  • Чукотка (Asia/Anadyr), Камчатка (Asia/Kamchatka), Кемерово (Asia/Novokuznetsk), Самара и Удмуртия (Europe/Samara) не переводят часы
  • Asia/Novokuznetsk переименовывается из NOVT в KRAT
  • из Asia/Yakutsk выделяется новая таймзона Asia/Chita (и переводится на два часа назад)
  • из Asia/Magadan выделяется новая таймзона Asia/Srednekolymsk (и переводится на один час назад)
Админам Читы и Республики Саха необходимо не только обновить пакеты, но и поменять таймзоны.

Да какая разница

С обновлениями все, кстати, плохо. Нужная версия tzdata (а именно 2014f или новее) появилась в Debian Wheezy лишь с неделю назад, а до Squeeze так еще и не докатилась (хоть вроде смержили 20 октября).
В Java все получше. Обновления доступны еще с августа. Вот только ни в один JDK, даже самый распоследний, они не входят. Так что нужно самостоятельно скачать TZUpdater и выполнить его с правами администратора в вашей Java системе.
В Windows своя отдельная боль. Таймзон там сильно меньше, чем в стандартной Time Zone Database, а значит менять зону руками придется почти всем.
Вот что произойдет этой ночью (там где будет перевод на один час):
Показания часовВремя
00:00 - 00:59старое летнее время
01:00 - 01:59старое летнее время
01:00 - 01:59новое зимнее время
02:00 - 02:59новое зимнее время
Показания часов между часом и двумя ночи будут повторены дважды, но с разным смещением относительно UTC.
Отсюда следуют интересные выводы по поводу хранения времени (во всяких ваших БД). Которые касаются любых переходов между зимним и летним временем. Просто, за последние три года (последний раз мы переходили на летнее время весной 2011) все как-то расслабились и породили системы, которые работают со временем неправильно.
Неправильно хранить и передавать часы-минуты-секунды в локальном часовом поясе без указания явного смещения относительно UTC. Ибо локальное смещение, как мы видим, дело непостоянное и у вас либо час пропадет, либо будут неоднозначности. Как в данном случае, когда между часом и двумя ночи будет дважды. Впрочем, тесты показывают, что неоднозначности разрешаются в пользу нового зимнего времени. И этот способ, блин, используется сильно чаще, чем следует.
Правильно хранить и передавать часы-минуты-секунды с явным указанием текущего смещения относительно UTC. В этом случае неоднозначности не возникает и все ок. Именно такой формат подразумевается стандартом ISO 8601, что-то вроде YYYY-MM-DDThh:mm:ss±hh.
Правильно хранить и передавать часы-минуты-секунды в UTC с явным подразумеванием, что это UTC. UTC не переходит на летнее время, и пока не будет переходить — все ок. Именно такой формат подразумевается ISO 8601 с Z суффиксом: YYYY-MM-DDThh:mm:ssZ.
Правильно хранить и передавать часы-минуты-секунды в виде Unix Timestamp, т.е. числа секунд (или миллисекунд), прошедших с 1 января 1970 года UTC. Таймстамп — это вполне себе глобальный и надежный счетчик времени. Тут лишь есть небольшая проблема с представлением дат ранее 20 века и позднее 2038 года. Однако с повсеместным переходом на 64битные ОС это уже не актуально.
P.S. Надеюсь, я не сильно опоздал с этим постом :)

UPD: В мобильном мире все тоже плохо. Я полагаю, что 90% устройств вообще никогда не получат нужные обновления таймзон. В исходниках Android свежий tzdata имеется только в Android L Preview. Впрочем, для Android есть рутованная таблетка. Не пробовал, но не вижу причин, почему не будет работать.
Дали

2014-10-12

О документации

У нас тут, в продуктовой компании, где кучка гениальных, но узкоспециализированных, разработчиков, пришлось задуматься о документации. Я рассматриваю документацию как способ коммуникации. Устные коммуникации, конечно, работают. Но когда мысль выражена грамотно и письменно, когда потратишь время, чтобы выразить то, что в голове накопилось, тогда и сам понимаешь, что к чему.
Взаимопонимание
К тому же не стоит исключать фактор автобуса. При наличии документации исчезновение разработчика все же менее болезненно. Интуитивно это понимают все, и я много раз наблюдал, когда последние две недели работы бедный сотрудник документирует все то, над чем работал предыдущие два года.
Конечно, лучшая документация — это код. С этим я абсолютно согласен. Вот только лучшая она по показателю «полноты». А вот по показателю «читабельности» — она одна из худших. Дело тут даже не в том, хороший или плохой код. Даже если код хороший, не все умеют его читать.
Вот мне, например, как архитектору, приходится разбираться, как код на JavaScript формирует JSON-RPC вызов через WebSocket, все это доходит до Java, где вызывается процедура на PL/SQL, которая уже и модифицирует актуальные данные. Все эти нюансы можно прочесть в коде. Вот только читать надо на трех упомянутых языках. И далеко не все это могут, как оказалось. (А потом еще JetBrains удивляется, зачем мне нужна поддержка Objective C в IntelliJ IDEA).
Цепочка вызовов
Так что, кроме кода, нужна еще и документация на человеческом языке. Причем в первую очередь хочется видеть документацию о вызовах, о публичном API. Ибо именно это есть взаимодействие компонентов вашей системы. Возможно, то самое, ради чего её и создавали.
Яве повезло. В ней есть JavaDoc. Ну, в общем-то, подобные штуки есть для всех приличных языков. А для документирования, например, REST API, существуют свои инструменты. К сожалению, все эти штуки часто ограничены своими языками и платформами. И построить сквозную документацию не получится.
Поэтому я все же предпочитаю, чтобы публичное API документировалось вручную. Все же публичное API — это сильно меньше, чем все публичные методы всех классов ;)
Описание API отнесем к Спецификациям. Описанию того, что уже сделано и как оно уже работает. А еще есть Требования. То самое ТЗ (Техническое Задание), имея которое, Программист перевернет Землю.
Тут наблюдается интересная трансформация. Требования пишутся словами «следует», «необходимо», «должен», в будущем времени. Теми самыми формами модальности, прекрасно описанными в RFC 2119. Хорошо RFC, они как раз и описывают, как должна функционировать будущая сферическая система, которая реализует данный стандарт. А вот Спецификации пишутся в настоящем времени и безо всякой модальности.
И вот наступает некий момент (растянутый на все время разработки :), когда Требования превращаются в Спецификации. То, что необходимо сделать в будущем, становится реализованным настоящим. Как выразить этот переход в документации (и надо ли вообще), я еще не придумал. То ли сразу писать Требования, будто они уже сделаны. То ли Требования должны оставаться Требованиями, а Спецификации конкретной реализации оставаться Спецификациями.
Требования становятся Спецификациями
А еще есть другие виды документов. Например, менеджерские. Результаты митингов, заполняемые чеклисты и прочее и прочее. Их тоже надо где-то хранить.
Я вообще стараюсь все записывать. Ничего не хранить в голове дольше двух дней. Как только какая-то проблема сформулировалась — записать. Как только придумали кучу способов решения проблемы — записать. Как только выбрали наиболее приемлемый способ и придумали, как его запилить, — записать. Вспоминая фактор автобуса. Да и просто, чтобы не нагружать сильно моск.
Любопытно, что в ходе таких мозгодампов рождаются документы, не очень похожие на приличную документацию. (А иногда и посты в блог :) Это описания экспериментов, сравнение различных технологий и решений, муки выбора. Совсем совсем не то, что выйдет в продакшен. Но я считаю, что такие вещи тоже нужно хранить. Чтобы ответить потом на вопрос: «А почему так, собственно?»
Мы юзаем Confluence. Самая лучшая Wiki из тех, что я использовал. Хоть и платная. И со своими странностями. Например, зачем перешли на WYSIWYG вместо вики разметки, мне не очень понятно. Но — не напрягает.
Кстати, как язык разметки что-то в последнее время сильно предпочитаю Markdown. Если кто подскажет хорошую wiki с Markdown разметкой, скажу спасибо.
А вот для диаграммок лучше PlantUML ничего не знаю. Но про это я уже писал. От wiki лишь хочется прозрачной интеграции PlantUML в любой документ.
Впрочем, иногда у wiki не хватает интерактива. Все хорошо, пока один документ редактируется одним человеком. Но когда нужно писать вместе и одновременно, да еще и оставляя по тексту комментарии... Тут помогает Google Drive. Все же совместное онлайн редактирование — это круто. Но в Google Drive очень туго со структурой (папки — неудобны) и ссылками (ссылка на документ — нечитаема). Тут ближе к классическому вебу, где каждый документ сам по себе. В wiki же документы ближе друг к другу. Да, хочу wiki движок с возможностью одновременного онлайн редактирования :)
Document All the Things!
В общем, документируйте все, что документируется. Храните документацию в надежном и доступном месте. И помните, что документация, хоть нужна и полезна, все же — не главное.

2014-10-05

О Питере

Погулял одиннадцать дней отпуска всей семьей в Санкт-Петербурге. Собственно, не первый раз в Питере. Но так долго — впервые.
Питер — по-прежнему Питер. Красив и своеобразен. Потрясающие дома. Зеленая трава. Цветущие одуванчики.
Кстати, зря говорите, что осенью в Питере делать нечего. Неправда. Осень тут очень красивая. Желтые листья на зеленой траве. Тепло. Ну и почти нет дождей.


В музеи не ходили. Потому что с дитёнком. Зато обошли много парков и садов.
У площади Александра Невского есть замечательный Митрополичий сад. Самый дикий из посещенных. Дубы и клены. Красота.


Сходили к Смольному. Не тот, который институт благородных девиц (хотя он тоже рядом). А Смольный собор. Еще там рядом расположился факультет международных отношений Петербуржского универа и администрация города. А вокруг — прекрасные сады. Хорошо студентам и чиновникам.


Продолжили в Петергофе. Ну это тот самый, который Петродворец. Где сам дворец, Нижний парк, Верхний сад, фонтаны и все такое. За вход в дворец-музей берут денег. Также как за вход в Нижний парк.
Добирались до Петергофа по воде. На чудесном «Метеоре». Дорого. Зато можно посмотреть Финский залив во всей красе. Серое небо. Серое море. И они сливаются. Пристань находится за Нижним парком, а значит обязательно придется платить за вход в него. Так что этот способ путешествия — исключительно для туристов. Которыми мы и являлись.


А можно добраться на электричке. От Балтийского вокзала. Дешево. Только до самого Петродворца — несколько автобусных остановок. Для туристов — не очень. А просто погулять по городу — само то.
Ведь в Петергофе, кроме Петродворца, фонтанов, сильно туристских и ухоженных парков и садов, есть на что посмотреть. Колонистский парк. Ольгин пруд. Собор святых апостолов Петра и Павла. Да и вообще, после Петербурга, город тихий и спокойный. Нет домов выше четырех этажей.


Обитались в мини-отеле «Пилау». Рекомендую. Не дорого и весьма уютно. А вот одноименный хостел не рекомендую. Там, конечно, тоже уютно. Но не хватает такой хостелоспецифичной штуки, как общее пространство. Ну кухня (без окон), конечно, есть. А вот места для посидеть-покодить — нет.
Питались где попало :) Рекомендую Столовую №1 на Невском возле «Гостиного двора», и «Пышки и чебуреки» на перекрестке Разъезжей и Загородного проспекта. Также неплохо было в «Хачапурной» на Рубинштейна. Да, что-то попёрла грузинская кухня. Или в Питере её как-то по-особому аутентично готовят? А еще «Крошка картошка» неплоха. Это если из фастфуда, который несколько дороже столовых и мелких кафешек.
В Московский парк Победы лишь забрели. Детская площадка оказалась сильно популярнее среди моей дочи, чем другие развлечения.


В воскресенье хотели прогуляться по Крестовскому острову. Но забрели в парк аттракционов «Диво Остров», где и застряли почти на весь день. Я не удержался, и прокатился на большущих американских горках, оформленных в дикозападном стиле, но почему-то называющихся «Большая русская горка». Ну а самым лучшим аттракционом был вертолет, объезжающий детские площадки на высоте второго этажа. Монорельсовый вертолет с педальным приводом.
В ЦПКиО на Елагином острове так и не попали. Хотя вид отдыхающих петербуржцев с другого берега Невки вызывал зависть. Зато купили билеты в дельфинарий.


Посетили Ленинградский зоопарк. Лучший зоопарк, из тех что я видел, в категории «ассортимент животных». Впрочем, жирафы, пантеры и крокодилы проиграли детской площадке, по уделённому вниманию. Кстати, вы знали, что жираф спит лишь два часа в день?


В качестве персонального развлечения напросился в офис JetBrains. Если кто не в курсе, эта замечательная компания родом из Питера. Они весьма уютненько расположились на семи этажах бизнес-центра на Кадетской линии Васильевского острова, где начинается Большой проспект. Семь этажей и все оформлены в разных цветах. Тренажерных залов, спортивных площадок и бассейнов (как у Mail.ru) не заметил. Ну и правильно, тут же работают, а не живут. За экскурсию спасибо Филиппу Торчинскому.


Шоу в дельфинарии было крутым. Морских львов в Нью-Йорке видел. Тут тоже была парочка. А вот дельфинов, моржей и белух вижу вживую впервые. Класс! Не думал, что эти чудесные дельфины могут везти на себе человека, и еще и выкидывать его из воды. Очень грустно только, что все животные, похоже, и живут в этом бассейне. Пусть и стометровом.


Съездили в Гатчину. Там, где музей-заповедник, дворец и снова парк. На электричке снова с Балтийского вокзала. Местные ходят в самый дальний конец этого парка к роднику и затариваются литрами тамошней воды. Когда, уже на обратном пути, мы устали и уселись на лавку, нас поймала баба Тамара. Пообещала долгой счастливой жизни до девяносто трех лет. Выцыганила сто пятьдесят рублей. Ну что ж. Проверим.


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


Посетили Михайловский и Летний сады. Обошли кругом и изфотографировали Спаса-на-Крови. Уютненько, мило и куча туристов.


В Летнем саду наткнулись на «Театр Кукол Быстрого Реагирования». Крутой мужик с самодельным гитаробанджо, кучей других инструментов и куклой умудрялся одновременно играть на этом всём, управлять куклой и развлекать детишек. Дети были не просто зрителями, а участниками концерта, можно было взять инструмент и присоединиться. Нашей доче так понравилось, что пиарю сей театр здесь.


Напоследок сходили в Ботанический сад. Осень в ботаническом саду — грустное время. Все отцветает. Но всяких роз и кактусов — много. Надо будет весной сходить.


Центр Петербурга напоминает мне Манхэттен. Те же каменные джунгли. Только сильно пониже. Ни одного деревца. А если есть кучка деревьев — то это уже отдельный сад или парк, со своим именем и длинной историей.
А так Питер очень похож на Омск. Или скорее Омск похож на Питер. Осталось только шаурму переименовать в шаверму.
К черту слова, смотрите фотки.