19 апреля 2009
Сегодня утром мне захотелось посмотреть, как над Европой распространяется облако вулканического пепла (тем более, что моя коллега, на прошлой неделе поехавшая в Берлин, до сих пор не может оттуда выбраться).
Хотелось, чтобы эта карта автоматически обновлялась, хотя бы отдаленно напоминала спутниковые снимки, и была в минимальной степени похожа на метеосводки.
Интересных источников не обнаружилось, зато (в очередной раз) нашелся сайт flightradar24.com, с которого можно было снимать регулярные скриншоты.
10:57. Коммит. Ревизия 5022.

Карта хорошая, но обновлять ее вручную совсем не хочется. Ищу дальше, где бы разжиться списком закрытых аэропортов. Находится (в очередной раз) нечто лучшее — сайт flightstats.com, на котором текущий статус аэропорта не только показан, но еще и проградуирован по пятибальной шкале. Ура, на коленке пишу скрипт.
#!/usr/bin/perl
use v5.10;
use strict;
use LWP::Simple;
my $xml = "<?xml version=\"1.0\"?>\n<delays>\n";
open my $list, '<', 'europe.list';
while (<$list>) {
chomp;
my ($cc, $iata, $name) = split /\t/;
my $page = get_airport_status($iata);
$xml .= <<XML;
<item cc="$cc" iata="$iata" name="$name" index="$delay_index"/>
XML
}
close $list;
$xml .= "</delays>\n";
if (length $xml > 100) {
open my $out, '>', 'airport-status.xml';
print $out $xml;
close $out;
}
12:24. Копи-пейст XSLT, формирующего список, коммит. Ревизия 5024.

Эта первая версия сохраняет все данные в XML-файле, который очень легко подключается к сайту, избавляя от массы хлопот при быстром старте.
Прошу коллегу поставить скрипт в крон, подвязать к аэропортам координаты и отправляюсь в офис.
Тем временем проект анонсируется и мы получаем первые пользовательские баг-репорты.
В офисе коллегиально решили, что по разным причинам будет удобнее перенести информацию в базу данных, и мимоходом (совсем неожиданно) приходит мысль дополнить наш движок методом, который одним махом превращает SQL-запросы в XML-данные, избавляя от необходомости многократно писать мелкие функции, извлекающие данные. (В частности, в примере, идущем в составе с WWW::Page, часть методов примитивно дампят в XML соответствующие таблицы базы, и этот подход — тупо вывалить данные из базы, переложив их обработку на XSLT, — оказался очень продуктивным и работает не первый год.)
17:37. Ревизия 5042.
sub sql {
my ($this, $page, $node, $args) = @_;
my $sql = $args->{sql} or return $node;
$node->setAttribute('name', $args->{name});
my $sth = dbh->prepare_cached($sql);
$sth->execute();
while (my $row = $sth->fetchrow_hashref) {
add_node($node, 'item', $row);
}
return $node;
}
Опять колбасим XSLT, чтобы переключиться на новый формат данных, а попутно переводим фетчер на работу с базой данных. (Тем временем, сайт продолжает исходно работать, регулярно обновляя список закрытых аэропортов.)
В это время подключается третий коллега, который улучшает клиентскую JavaScript-сортировку таблицы со списком. А четвертый потом делает еще одно изменение в коде, которое улучшило сортировку колонки со статусом задержек рейсов.
Тем временем созревает (зреющая еще с обеда) идея вместо скриншотов показывать гугловую карту и насыпать на нее разноцветное конфети, отображающиее статус европейских аэропортов.
19:12. Ревизия 5051.
Perl-программист берется за JavaScript-API Гугл-карт, и находит, что сделать замыкание в яваскрипте — это совсем не так просто, как в перле. Тем не менее, коммит, все работает, а карта обновляется автоматически (а вдобавок еще и зумится, а каждый маркер — еще и ссылка).

Добавляю легенду, прошу перекрасить конфети.
Можно с честной совестью идти домой, но хочется — раз уж мы все знаем про аэропорты — поместить статус и на страницу аэропорта.
20:14. Раз, два, ревизия 5058.

Имеем работающее, полезное и злободневное приложение — «Задержки рейсов в аэропортах Европы», списком и на карте.
Итого, за день — пяток тикетов, сорок коммитов, фан и радость.
- Ticket #860 (airport-status в cron) created by ash
- Ticket #861 (Автоматизировать карту аэропортов) created by ash
- Ticket #862 (Карта аэропортов Европы.) created by hsw
- Ticket #863 (Перекрасить шкалу задержек) created by ash
- Ticket #864 (Вынести в локаль строки из сервисов про задержки рейсов) created by ash
Любители методик разработки, составители техзаданий, идеологи фокус-групп никогда, неуместноых тестирования и рефакторинга не смогли бы добиться такого.
P. S. 22:44. Коммит, ревизия 5062. Коллега сообщает о том, что закончил еще один геосервис, который мы давно хотели сделать.