Последнее в категории Не Perl

Шаблонизаторы — зло.

use XSLT or die.

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. Коллега сообщает о том, что закончил еще один геосервис, который мы давно хотели сделать.

После вечернего моциона по Тверскому бульвару мне пришла мысль о том, что ведь в C++ довольно просто создать функцию say(), которая будет работать и с числами, и со строками :-)

#include<iostream>

template<typename T> void say(T value) {
    std::cout << value << "\n";
}

int main() {
    say(42);
    say(3.14);
    say("Perl");
    
    return 0;
}

say say say

| Комментариев: 3

Фрагмент из тестового файла, который мне потребовался, чтобы проверить работу части проекта, написанного на C++:

void say(double value) {
    std::cout << value << "\n";
}

int main() {
    say(calc("1+2"));

    return 0;
}

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

В статусе job-сервера такие задачи видны с «перекошенным» счетчиком:

new_feature 14 0 0

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

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

Пользоваться новой командой крайне просто:

$ telnet localhost 4730
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
status
new_feature 14 0 0
.
rmfunc new_feature
OK
status
.

Запрос на удаление функции, для которой существует «живой» воркер, завершается с ошибкой ERR there are still connected workers.

P. S. Сейчас весь код находится в отдельной ветке.

10+

| Комментариев: 6

На основе записей в трудовой книжке.

1999, Москва

— Я программирую на Perl. Особенность в том, одно и то же действие можно записать по-разному. Это и непривычно, и немного сложно, но интересно.

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

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

2000—2010, Москва

С этого года Perl стал меня кормить. За десять лет я совершенствовал себя и свои знания в журнале «Радио», фонде научных исследований «Прагматика культуры», студии Артемия Лебедева (да-да, там я тоже делал некоторые вещи на перле), российском информационном агентстве «РИА Новости», компании Q1 и в ООО «Гностик».

2010, Амстердам

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

Вчера двухсполовинойлетний Даниил Андреевич нарисовал вот такую штуку.

Чтобы снять неясность о том, что родитель увидел в рисунке своего ребенка, привожу рядом другую картинку — логотип с pm.org.

Про хеш

| Нет комментариев

Знаете ли вы, что у слова hash есть и другое значение? :-)

В Амстердаме, например, в сувенирных магазинах можно купить чупа-хеш.

hash

Соль минор

| Нет комментариев

Я хотел написать про одно, а напишу про другое.

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

Например, модуль GD::Chord::Piano рисует такие простые картинки:

chord.png

Интерфейс крайне прост и приятен:

use GD::Chord::Piano;
my $im = GD::Chord::Piano->new;
print $im->chord('Gm')->png;

Все, что требуется, — передать название аккорда методу chord. Этот пример скопирован из документации к модулю.

А вот другой модуль — Music::Image::Chord, который, судя по названию и описанию, должен делать нечто похожее.

Но если скопировать пример из документации, то ничего не работает:

Use of uninitialized value in division (/) at /usr/local/lib/perl5/site_perl/5.10.0/Music/Image/Chord.pm line 152.
Can't use an undefined value as a HASH reference at /usr/local/lib/perl5/site_perl/5.10.0/Music/Image/Chord.pm line 153.

Нет, можно конечно продолжить разбираться, но не хочется.

К сожалению, такое весьма часто такое случается с примерами в книгах, причем не из-за того, что у автора и читателя оказались компиляторы разных версий. А ведь это так просто — скопипейстить код из набранной рукописи и проверить ее.

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

В качестве офтопика можно вспомнить историю, расказанную создателем Бейсика Томасом Курцом о том, что какой-то аспирант написал компилятор PL/1 без отладки, впервые запустив его только после того, как код был полностью написан:

...he worked at Darthmouth in the computer center. He wrote a PL/1 compiler, and it's a big thing, and he checked it, and looked at it, and so on, but he never tested it, he never ran it until it was all done. You know, 20,000 or 30,000 lines of code, and the only test he did was to read it. Then he ran it and it worked the first time!

В той же книге рассказано и о том, что означат отладка для создателя C++ Бьярна Страуструпа:

— How do you debug? Do you have any suggestion for C++ developers?
— By introspection. I study the program for so long and poke at it more or less systematically for so long that I have sufficient understanding to provide an educated guess where the bug is.

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

PHP на перле

| 1 комментарий

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

На сегодняшнем сайте php.net в разделе Downloads лежат только дистрибутивы последних версий 5.2.11 и 5.3. На странице Releases есть более глубокий архив, но все равно не дальше третьей версии.

Есть еще отдельная музейная страница, на которой числится ссылка на первую версию. Но в дистрибутиве php-108.tar.gz оказываются только исходники на C. Все, что может привлечь внимание — занятное имя одного из файлов: phpl.c.

Теперь (почему бы было не начать с этого :-) идем в раздел истории, где выясняется следующее:

PHP succeeds an older product, named PHP/FI. PHP/FI was created by Rasmus Lerdorf in 1995, initially as a simple set of Perl scripts for tracking accesses to his online resume. He named this set of scripts 'Personal Home Page Tools'. As more functionality was required, Rasmus wrote a much larger C implementation...

Иными словами, зачаток все-таки был написан на перле, но в первый публичный релиз вошел код, написанный на C. И назывался он уже не Perlsonal Home Page Tools, а составным именем Personal Home Page / Forms Interpreter.

О релизе Расмус Лердорф сообщил в NNTP-группе comp.infosystems.www.authoring.cgi. В этом письме содержится только одно упоминание о перле:

You do not need access to Perl or Tcl or any other script interpreter

(Впрочем, в правилах самой группы числится рекомендация о том, что прежде, чем задать вопрос по CGI, надо заглянуть на страницу Perl FAQ.)

В общем, PHP действительно предшествовали какие-то Perl-скрипты, но публичная версия с самого начала была написана на C.

Страницы

  • img

Об архиве

Эта страница содержит последние записи категории Не Perl.

Предыдущая категория — Мероприятия.

Следующая категория — Обучение.

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