Doomed to Wordpress

Serious Reflections During the Life of Jeremy Fisher

   

Subscribe
Subscribe to a syndicated feed of my weblog, brought to you by the wonders of RSS.

Flavours
There's more than one way to view this weblog; try these flavours on for size.

  • index
  • circa 1993
  • RSS
  • Links
    These are a few links to my other sites.

  • Ставропигиальныя Пластинки
  • Анкылым
  • Русское Шрифтовое Зало
  • Gopher (Proxied)
  • More about Gopher
  •        

    2020/05/27 craft programming

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

    (под заглавием «Working with end users is hard» написано для обоснования идеи крафтового программирования)

    permanent link

    2020/05/18 google spam

    Уже пару месяцев слежу вот за этой любопытной статистикой:

    https://www.spamhaus.org/statistics/networks/

    • топ-10 худших провайдеров, поддерживающих спам. Под поддержкой спама имеется в виду предоставление услуг спамерам за деньги или непрепятствование их действиям в сетях данных провайдеров. Так вот, Гугл стабильно на первых местах в топе (последние недели на первом), Майкрософт там тоже одно время обретался. Остальное — китайские провайдеры (ничего о них конкретного не знаю) и fos-vpn.org (как я понял, спамерская сеть, маскирующаяся под поборников Тора и прикрывающаяся риторикой о свободе интернета).

    Самое отвратительное то, что как раз именно из-за идиотской спам-политики этого самого Гугла стало почти совершенно невозможно пользоваться электронной почтой. Изначальная прекрасная идея электронной почты как сети многочисленных мелких почтовых сервисов, приблизительно копирующей устройство физической, бумажной почты, была фактически убита крупными провайдерами, и Гуглом в первую очередь. Я уже давно не могу нормально пользоваться ящиками, расположенными на моих личных серверах или на удобных мне серверах малоизвестных провайдеров именно из-за идиотских спам-фильтров Гугла и прочих, которые автоматом отправляют в спам всё, что̀ не пришло с их серверов или с серверов пары-тройки других почтовых гигантов.

    По ссылке мы видим истинное лицо этих лицемерных борцов со спамом.

    permanent link

    2020/04/01 frameworks vs diy

    Мне всегда казалось, что для программиста не должно быть проблемой что-то запрограммировать. По крайней мере, поиск готового стороннего решения я всегда считал уместным в том случае, если существует решение, в точности решающее задачу. Если оно решает её не в точности, то, выбрав путь готового решения, приходится либо переформулировать задачу, что̀ мне кажется неверным путём, потому что следует исходить из цели, а не из ограниченности инструментария (либо, значит, цель не столь важна — но сто́ит ли тогда ею и заниматься?), либо переделывать найденное «готовое» решение, что предполагает затраты времени и сил на обучение его внутренней архитектуре, без знания которой модификации будут дилетантскими и рискованными, затруднение поддержки в будущем (в случае, если новые версии готового решения окажутся несовместимы с изменениями и опять потребуется всё переделывать), да и просто архитектура готового решения может не предполагать вмешательств, в этом случае понадобится замена решения и затраты времени и сил на поиск и внедрение нового. В общем, мне всегда казалось, что проще написать всё самому, ибо, повторюсь, для программиста это не должно составлять проблемы, ибо он на то и программист, чтоб программировать, а не гуглить.

    Целый день писал тесты для сайта на Poet/Mason. Сразу скажу, что эту архитектуру для данного сайта выбрал я давно, сознательно и пока что не было случая, чтобы мне приходилось горько об этом жалеть. Конечно, сама идея шаблонизатора как некоего дополнительного недоязыка, который приходится осваивать разработчику и который требует особого интерпретатора, дурна и её следует избегать. Масон несколько оправдывается, во-первых, чрезвычайно удобной идеей объектно-ориентированных шаблонов (что̀, впрочем, некоторые считают как раз его недостатком; при этом я не рассматриваю всё объектно-ориентированное как благо, но в данном случае это прекрасный пример уместности ООП), во-вторых, минимальностью самого синтаксиса шаблонов: по сути, есть только маркеры, указывающие, интерпретировать ли данный код как perl или html, а всё остальное можно и не использовать. (Я говорю о Mason 2; судя по масоновской рассылке, до сих пор многие сидят упорно на Mason 1; тот куда больше похож на классический шаблонизатор или php, и я не понимаю этих людей.)

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

    Начинается всё с того, что мне надо для тестов переопределить пару параметров в конфиге. С удивлением обнаруживаю, что возможность вручную выставить значение ($conf->set(...)) не предусмотрена! И сознательно, т.к. это, дескать, дурной тон, менять конфиги где попало. "Setting and resetting of configuration values will make it much more difficult to read and debug code!" Да, разумеется, особенно с таким синтаксисом, который всё же предусмотрен — с оговоркой, что исключительно для тестирования — чтобы временно поменять значение для данной лексической области видимости:

    my $lex = $conf->set_local({key => 'value', ...});
    

    В моём случае это сработало. Но, учитывая, сколь разными могут быть ситуации тестирования и специфику областей видимости в perl, тем более в Moose, не удивлюсь, если будет работать не всегда (например, когда придётся разбить код данных тестов на несколько модулей/функций, а общий код, содержащий как раз эти изменения конфига, вынести отдельно). Надо ли говорить, что если бы фрэймфорк писал я, не было бы такого ограничения. Когда я работаю с чужим кодом, возможность оперативно изменить значение из конфига в любом месте кода и быстро увидеть результат, вместо того чтобы городить отдельные тестовые конфиги или создавать их в памяти, требуется постоянно. (А тут кстати даже и создать конфиг нельзя, не прибегая к файлу. Конфиг почему-то всегда считывается из файлов, причём имена файлов хардкодные! Конечно, я могу переопределить класс конфига и всё это там сделать. В будущем я так и сделаю. Но на выяснение неизбежности этого весь день и ушёл. Дело осложнялось тем, что ряд параметров ещё и устанавливается в значения по умолчанию в других местах и через конфиг не переопределяется, хотя неработающий пример приведён в документации, но это уже можно считать багом. А если бы речь шла не о тестах, а о чём-то более срочном и важном?)

    Мало того! И масоновский компонент нельзя создать на лету, поскольку иного способа его создания, кроме чтения из файла, не предусмотрено! Приходится городить кучу временных файлов. К чему объектноориентированность шаблонов, если такой шаблон, представленный в программе объектом, нельзя создать как любой другой объект?

    Некоторые объекты являются синглтонами, но нет возможности переинициализировать их либо работать в каждом тесте с заново создаваемым объектом. Использование синглтона само по себе тут оправдано, но возможность заменить/переинициализировать его для тестирования является очевидной необходимостью. (Допускаю, что в некоторых реализациях данного паттерна это технически или идеологически невозможно. Но в perl препятствий к этому я не вижу.)

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

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

    permanent link

    2020/03/30 fossil

    http://fossil-scm.org/home/doc/trunk/www/fossil-v-git.wiki

    Так хорошо ругают git, что даже захотелось попробовать (fossil, в смысле, попробовать).

    permanent link

    2019/06/14 UR

    Я обнаружил UR как возможную альтернативу KiokuDB, но на самом деле это скорее альтернатива Moose, ориентированная более на табличные объекты. Как известно, нормальный ORM для Moose мне пока так и не удалось найти.

    https://metacpan.org/pod/UR

    permanent link

    2019/06/12 openinteract

    Вот ещё пример абсолютно неизвестного, непризнанного и забытого, но, возможно, достойного приложения на перл:

    https://metacpan.org/pod/distribution/OpenInteract/OpenInteract/Intro.pod

    В редких упоминаниях в интернете рекомендуется сравнивать его с Zope. Как я понимаю, там тоже веб-интерфейс к собственной объектной БД. Но, опять же, это Apache/mod_perl. Сколько хорошего софта погублено и обречено на забвение из-за ориентации на эту оказавшуюся провальной платформу.

    permanent link

    2018/05/02 masonsql

    Вот, похоже, серьёзный и используемый в бою фрэймворк (на Mason1, правда) — опять же никакой инфы нигде, кроме пары постов в рассылке Масона и пары объявлений о найме работников для портирования на Mason2.

    https://www.leader.it/Portal/MasonSQL

    permanent link

    2018/04/27 interchange

    Удивительно, но есть вполне рабочее решение для e-коммерции на Perl, существует с 1995 г., последний коммит 20 дней назад, никакой инфы — нигде! Нашёл совершенно случайно.

    http://www.icdevgroup.org/i/dev/

    Существенный недостаток, конечно — собственный шаблонизатор.

    permanent link

    2017/12/11 more perl cms

    Начал сайт на ShinyCMS и вскоре увидел, что там нет такой элементарной вещи, как привязка постов блога к секциям. Технически заложена возможность нескольких блогов, но к ней ней интерфейса не то что в админке, а даже в коде толком нету (при создании поста в блоге id блога хардкодится).

    Полез в инет и, изучая сайты, сделанные на оной ЦМС, наткнулся на удивительные вещи.

    http://rperl.org/ — компилятор перл, якобы сопоставимый с C/C++/Fortran и, в отличие от множества подобных проектов, вроде бы даже продакшен-уровня. Та же компания собирается в 2018 выпускать rperl-enabled смартфон (http://www.autoparallel.com/products/genius/), так что всё серьёзно. Правда, сайт http://cloudforfree.org/, который должен предоставлять какие-то облачные сервисы с этим самым rperl, не работает, потому что перегружен.

    Оттуда вышел на ещё разные проекты улучшения перла, правда, не столь амбициозные: http://perl11.org/

    Помимо этого, обнаружились ещё несколько ЦМС:

    http://wiki.cyclone3.org/index.php/Cyclone3Frameworkinstallation — какой-то невероятно амбициозный проект, не решусь опробовать; как я понимаю, состоит из серверной части под апачем (фрэймворк) и клиентской — внимание! — на XUL! При этом последние обновления совсем недавние и, похоже, активно развивается. Уже апач в 2017 г. странен, но только что похороненный Мозиллой XUL — это совсем за пределами разумения. Хотя я, конечно, за XUL. Демо не нашёл.

    http://xims.info/about.html — нечто заброшенное в 2013 г. Вроде нормально выглядит и даже интерфейс напоминает Zope, но настолько древний код, что даже Seamonkey всё перекорёживает.

    http://cms.simpleness.org/about/for_developers — меня настолько шокируют шрифты, что всерьёз не могу воспринимать. Демо выглядит как сырое поделие, ссылка здесь только для полноты картины.

    https://www.dreamwidth.org/site/opensource — как я понял, форк ЖЖ. Поддерживается. https://github.com/dreamwidth/dw-free

    Понемногу смирился с TT, при некоторой настройке (INTERPOLATE=1, OUTLINE_TAG, собственные TAGS) вполне можно пользоваться.

    permanent link

    2017/12/04 perl wiki

    Twiki и Foswiki, насколько я понимаю, часто используются как CMS. На них поэтому также надо обратить внимание.

    Сайты на Foswiki: http://foswiki.org/About/ExampleSites

    У Twiki такой странички не нашёл.

    permanent link

    2017/11/30 HTML Zoom

    Вот ещё интересный шиблонизатор:

    http://search.cpan.org/~jjnapiork/HTML-Zoom-0.009009/lib/HTML/Zoom.pm
    

    Синтаксис не очень, но идея хороша.

    UPD (14.12.2017): Вообще много подобного есть. Достаточно посмотреть Catalyst::View::* на CPAN.

    permanent link

    2017/11/28 rapidapp

    http://www.rapidapp.info/ — очень навороченный фреймворк на перле и js, настолько, что напоминает битрикс по интерфейсу. На Каталисте. Отмечу для себя, но лезть не буду.

    Внимание! У них есть интерфейс для создания CRUD: https://metacpan.org/pod/rdbic.pl Есть и интерфейс к файловой системе. JS отпугивает, впрочем.

    permanent link

    2017/10/30 shinycms

    Поставил ShinyCMS 0.9.1 так:

    perl Makefile.PL
    make
    

    установит модули. Перед этим должны быть установлены Module::Install и Module::Install::Catalyst. (На сервере с FreeBSD после этого установилось не всё. Пришлось повторно запускать make. XML::Feed не поставился, доставил из портов. Оттуда же пришлось ставить не упомянутые в качестве зависимостей DBI и DBD::mysql.)

    (UPD: проще cpanm -v --installdeps . Могут возникнуть проблемы с тестами для DBIx::Class::Schema::Loader. Это из-за бага в Hash::Merge, поэтому нужен Hash::Merge версии 0.200.)

    Базу надо создать вручную:

    mysql -u root
    mysql> create database shinycms character set utf8 collate utf8_general_ci;
    

    и далее создать юзера и заполнить таблицы тестовыми данными:

    mysql -u root < docs/database/mysql-create-user.sql
    ./bin/database/build-with-demo-data
    

    Важно! Базу нужно сразу создавать с кодировкой utf8, и в конфиге shinycms.conf внести следующие изменения для работы с юникодом:

    encoding utf8
    

    в начале,

    mysql_enable_utf8 1
    

    в разделе connect_info, а в разделе View::HTML:

    ENCODING           utf-8
    

    (вообще я конечно уже думаю, чем и как заменить этот ужасный TT).

    Кроме того, для использования юникода в конфиге надо ещё добавить

    -UTF8 => 1
    

    в параметры драйвера конфига General в файле ShinyCMS.pm (строка 44). Иначе, например, название сайта в конфиге будет не написать кириллицей.

    Запускаем:

    ./script/shinycms_server.pl
    

    Админка:

    http://localhost:3000/admin/ (admin:changeme)
    

    Любопытно, что здесь также используется принцип построения страницы из "кирпичиков". Хотя, как я понял, всё же существуют и рукотворные шаблоны, куда эти кирпичики вставляются в качестве элементов.

    permanent link

    2017/09/15 perl crud

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

    https://metacpan.org/pod/App::AutoCRUD

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

    permanent link

    2017/08/31 more perl cms

    Ещё нечто древнее, но может быть полезно для реализации конкретных фич, которых не хватает современному софту: SSO и подобное.

    http://krangcms.com/

    http://cms.metadot.com/index.pl?iid=2558

    (Update 2020-06-04: сайт Metadot уж не открывается, а вот Krang, судя по скриншотам, в своё время может и мог бы составить конкуренцию Вордпрессу с точки зрения пользователя.)

    permanent link

    2017/08/20 shinycms

    Вот такое ещё есть, тоже Каталист, но поскольку уже нашёл себе занятие в виде двух прежде описанных систем, то пока оставлю здесь ссылки:

    http://shinycms.org/pages/main/sites https://github.com/denny/ShinyCMS

    Тоже всё модное, под докер заточено.

    permanent link

    2017/08/19 pearlbee

    Продолжаем разбор подводных камней при установке модных CMS на перл.

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

    cpanm --installdeps .
    

    Для Authen::Captcha нужен libgd-dev.

    Создаём базу:

    mysql -u root < db_patches/create_tables.sql
    

    Далее запускаем:

    plackup -R lib/ bin/app.pl
    

    Пытаемся зайти в админку (юзер admin, пароль password) по адресу http://localhost:5000/admin (именно так, без слэша: /admin/ не работает! вот как так?) и видим:

    Failed to render template: file error — /admin/posts/add.tt: not
    found
    

    И так на всех страницах админки. Оказалось, что в новых версиях Dancer не работают следующие конструкции в модулях админки (lib/PearlBee/Admin/*):

       template '/admin/posts/list',
    

    Нужно без начального слэша. Я сначала убрал слэши, но это довольно много автозамены во всех модулях админки. Потом подумал, когда выяснились ещё несовместимости, что лучше ставить старые версии Dancer и других внешних зависимостей, раз уж с этим столько проблем. (На самом деле это конечно не очень правильно и лучше было пропатчить модули, но как мы увидим далее, будут ещё проблемы с DBIC-плагином и его тоже надо будет ставить более ранней версии, которая наверняка зависит от соответственно более ранней версии Dancer.)

    Ставим версию 0.11, которая была на момент выпуска релиза PearlBee.

    Пока что не ставится. Доставляем модули:

    Crypt::URandom
    Math::Random::ISAAC::XS
    Scope::Upper
    URL::Encode::XS
    CGI::Deurl::XS
    JSON::XS
    

    Ошибка в следующем:

    t/charset_server.t ......................... Use of uninitialized value in socket at /home/rp/perl5/perlbrew/perls/perl-5.24.2/lib/site_perl/5.24.2/HTTP/Server/Simple.pm line 705.
    socket: Bad file descriptor at /home/rp/.cpanm/work/1503222303.8257/Dancer2-0.11/blib/lib/Dancer2/Core/Runner.pm line 154.
    cannot open port: 127.0.0.1:34612 at /home/rp/perl5/perlbrew/perls/perl-5.24.2/lib/site_perl/5.24.2/Test/TCP.pm line 53.
    

    И так далее, как я понимаю, во всех тестах, где надо создавать сокеты.

    Сил разбираться с этим нету. Ставим через --force.

    Dancer2::Plugin::REST нужно также поставить версии на момент релиза 1.0, иначе Dancer ругается на несоответствие версий.

    cpanm --force -v Dancer2::Plugin::REST@0.21
    

    (--force, потому что опять тесты из-за сокета не проходят.)

    И удивительное дело! Тут я собирался было писа́ть, что надо ставить старую версию Dancer2::Plugin::DBIC, ибо ранее с последней версией у меня не сохранялись статьи. Однако этого не потребовалось. Всё сохраняется.

    Перл v5.24.2 under perlbrew.

    Ещё такая особенность, что используются внешние скрипты с ajax.googleapis.com — без них часть функционала админки не работает.

    Тестов, кстати, по сути тоже нету.

    Возникает вопрос. Как современные программисты пишут и тестят всё это вообще? Про CiderCMS молчу, она не имеет релизов. Но тут? Релиз 1.0 — немногие перл-модули достигают такого. Куча хвалебных публикаций. Всё наимоднейше выглядит, дизайн на JS-фреймворке, Github, MVC: всё моднейшее и современнейшее, что̀ придумано на перл — всё пущено в дело. Аккуратнейший код, всё по правилам Modern Perl — и на̀ тебе, пытаешься ставить и ничего не работает. Это, конечно, вопрос также и к авторам модных фреймворков — они что̀, не в курсе, что их трудами пользуются люди и обратную совместимость нарушать не надо? Или так уже все погрязли в своём гетто что только для себя пишут?

    Вот кстати описание работающей системы, которой автор, кажется, доволен: http://perltricks.com/article/69/2014/2/17/Is-PearlBee-Perl-s-next-great-blogging-platform-/

    UPD (17.11.2017): Когда попытался ставить не на локалхосте, обнаружилось следующее. Изменения в конфиге не отображаются даже при перезапуске сервера — оказалось, старые настройки сохранялись в сессии!!! Настройки, хранящиеся в базе и меняемые через админку, не сохраняются. Симптомы напоминали прежние неудачи из-за несоответствия версий Dancer2::Plugin::DBIC, но установка старой версии не помогла. Вывод: для продакшена движок не годен. Хотя, понятно, всё это поправимо.

    permanent link

    2017/08/17 cidercms

    Так получилось, что мне снова пришлось срочно взяться за поиск подходящей блоггерской CMS на perl.

    CiderCMS оказалась на удивление архитектурно вменяемой вещью, вдохновлённой Zope, то есть тем, что я долго мечтал сделать с нуля самостоятельно. Следовательно, удобной скорее для разработчика, чем для конечного пользователя с админскими правами. Странно, что когда всё заработало, я увидел, что всё удивительно знакомо и получается, что я уже ставил её раньше. Но учитывая насколько сложно было разобраться, странно, что я об этом ничего не помню. Да и сохранившихся следов такой установки (инстансов) ни на одном компе не обнаружил.

    Мне пришлось установить из репозитория Module::Install. Впоследствии оказалось, что там была версия 1.17 и она годится, а вот 1.18 (текущая в CPAN) уже нет. Кроме того, выяснилось, что нужен модуль Module::Install::Catalyst (в дебиане в пакете libcatalyst-devel-perl — у меня был установлен, но крайне сложно было понять, откуда. В perlbrew -

    cpanm -v Catalyst::Devel
    

    Тогда выяснилось, что и Module::Install 1.18 годится. Вообще у Module::Install оказалась такая неприятная черта, что он меняет содержимое каталога и так его и оставляет (добавляет каталог inc). В случае экспериментов с разными версиями модуля/ей создаёт немалую путаницу. Ещё нужна библиотека imlib2 для Image::Imlib2.

    Далее, если верить README, достаточно было сказать perl Makefile.PL && make, запустить тестовый сервер прямо оттуда же (script/cidercms_server.pl) и создать инстанс через веб: http://localhost:3000/system/create. Упомянуто, что тесты создают инстанс и заполняют его, поэтому, чтобы сразу посмотреть на всё готовое, я запустил и make test.

    Для тестов нужно ещё доставить:

    Test::WWW::Mechanize::Catalyst
    DBD::Pg (нужна libpq-dev)
    Catalyst::Plugin::Authentication
    Regexp::Common::Email::Address
    Hash::Merge
    WWW::Mechanize::TreeBuilder
    HTML::TreeBuilder::XPath
    

    Когда тесты не проходили, я обратил внимание на повторяющиеся упоминания DBD::Pg и на то, что создание инстанса по указанному выше урлу выдаёт ошибку подключения к базе. Исследование кода показало, что требуется постгрес, хотя в README об этом не слова.

    Постгресу требуется существующая база cidercms и доступ к ней без логина и пароля, т.е. с правами текущего юзера. Кстати, почему-то параметры подключения хардкодно заданы в CiderCMS::Model::DB, а не в каком-либо конфиге. Странный недочёт для столь аккуратно и модульно сделанной системы.

    Итак, рутом делаем следующее:

    root@acer:~# su — postgres
    postgres@acer:~$ createuser rp
    postgres@acer:~$ createdb -O rp cidercms
    

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

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

    could not copy template textfield.zpt
    

    и далее соответственно

    unknown type: textfield
    

    ).

    permanent link

    2017/01/06 rewrite+userdir

    Как известно, mod_rewrite не дружит с mod_userdir. По крайней мере, я о таком где-то слышал. В моём случае это выразилось в том, что внутри userdir (т.е. при запросе к адресу типа http://localhost/~userdir/...) не отрабатывал внутренний редирект на /home/userdir/public_html/... Ошибка выглядела так:

    File does not exist: /var/www/home

    Исправилось добавлением симлинка /var/www/home -> /home

    permanent link

    2016/11/03 dns

    Нынешняя система ДНС чрезвычайно расточительна. Аццкое количество машинного и человеческого времени уходит на разрешение имён (не всегда успешное). Нужны объективные имена хостов, связанные с маршрутизацией. Пока это не так, придётся видимо везде локальные кэширующие НСы ставить, в том числе на телефоны, где постоянное отваливание ДНС и невозможность различить всякие элементарные facebook.com вообще бесит. ДНС гугла не предлагать. Надо глянуть, что̀ умеет всякий dnsmasq, который ныне по умолчанию ставится на многие дистрибутивы и девайсы.

    permanent link

    2016/10/31 undelete

    Вчера сломалась кнопка блокировки экрана на N900, теперь мучаюсь: чтобы заблокировать телефон, нужно не надавить одну удобную кнопку, а сделать 2 более сложных телодвижения. Неудобно настолько, что к телефону почти не прикасаюсь: понял, кстати, что таков может быть способ избавления от телефонной зависимости. Тем не менее, в заметки иногда залезал, хотя 100 лет уже как знаю, что ничего важного в телефоне хранить нельзя и утрачиваю заметки тоже далеко не первый раз. Пытаясь заблокировать экран после добавления мысли в заметку (мысль была о том, что надо автографы давать по-письменному лягушачему, раз уж так их у меня все норовят взять) и нервничая при этом по разным другим поводам, нажал случайно на "Завершить текущую задачу" — заметка при этом с какого-то хера не сохранилась! Мало того, очистилась. (Надо отметить, что заметки вообще оказываются очень уязвимы к таким вещам на всех Нокиях, независимо от ОС.) Расстроенный, пытался утешать себя тем, что ничего ценного в файле не было (потом, после восстановления, оказалось, что это отнюдь не так).

    Итак, встал вопрос, как восстановить без вести пропавший файл на телефоне с ОС Maemo. Недолгое изучение интернета показало, что достаточно обойтись grep (GNU) и dd. Рецепт отсюда: http://unix.stackexchange.com/questions/149342/can-overwritten-files-be-recovered.

    Вспоминаем, что̀ было в утерянном файле. Помню, что там был стих про Монако.

    Nokia-N900:~# /usr/bin/gnu/fgrep -a -b "онако" /dev/mmcblk0p1
    

    Результат выдаёт ряд строк вида

    5616632126:<br>в княжестве монако
    5632426302:<br>в княжестве монако
    5757927742:<br>в княжестве монако
    5758976318:<br>в княжестве монако
    5759303998:<br>в княжестве монако
    5759435070:<br>в княжестве монако
    5759566142:<br>в княжестве монако
    5762580798:<br>в княжестве монако
    5775819070:<br>в княжестве монако
    

    Далее просматриваем наугад отдельные фрагменты:

    Nokia-N900:~# dd if=/dev/mmcblk0p1 count=1 skip=$(expr 5616632126 / 512)
    

    Обнаруживаем в некоторых уже более недавние (вчерашние) записи, уточняем по специфическим словам из них:

    Nokia-N900:~# /usr/bin/gnu/fgrep -a -b "мастеркит" /dev/mmcblk0p1
    

    И получаем 2 фрагмента (далее происходит "Cannot allocate memory", но спасибо, что хоть эти отыскались), один из которых кажется совсем свежим. Опытным путём подбираем нужное количество блоков и получаем вполне пригодный текст убитого файла.

    Nokia-N900:~# dd if=/dev/mmcblk0p1 count=22 skip=$(expr 5973475720 / 512) > /home/user/restored.note.html
    

    Мораль: 1) хватит уже наконец записывать что-либо в телефон; 2) как же прекрасно держать все свои записи в human readable формате; 3) как же прекрасно иметь на телефоне нормальную операционную и файловую системы (последнее хорошо тем, что сохранилась куча версий файла и они не были фрагментированы).

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

    UPD (Псков, 03.11.2016): ну а вот как обходиться без заметок в телефоне, когда едешь во тьме в автобусе без света, без фонарика (он есть в телефоне, но я забыл про него, да и писа́ть с фонариком неудобно), а мысли так и лезут?

    permanent link

    2016/10/17 simple

    В условиях кодинга веб-приложений в путешествии с мобильника Plack оказался малопригоден. Впрочем, цги под классическим веб-сервером (Apache/nginx) тоже, несмотря на доступность их для maemo. (Установка туда plack даже не рассматривается, ибо превзошла бы возможности моего терпения). Решил перейти на запуск цги-приложений под HTTP::Server::Simple, HTTP::Daemon или httpi.

    UPD: как раз httpi оказался привередливее всех, а Plack почти что полностью ставится, если вручную доставить некоторые модули. Компилятор не нужен.

    permanent link

    2016/10/14 offline

    Некий (и далеко не единственный, как оказывается) софт для создания оффлайновой копии википедии:

    http://wiki.kiwix.org/wiki/Main_Page

    И официальные дампы оной:

    очень длинная ссылка

    permanent link

    2016/08/22 pl2sql

    А вот ещё интересное:

    http://search.cpan.org/~tqisjim/NoSQL-PL2SQL-1.21/lib/NoSQL/PL2SQL.pm

    Но вот зачем там промежуточный XML?

    permanent link

    2016/08/17 prophet

    Случайно нашёл вот такую БД, о которой ничего не известно, но кажется она почти мне подходит:

    http://search.cpan.org/~ioanr/Prophet-0.751/

    Смущает только, что оно для small и medium баз.

    И там же, оказывается, используется подходящий мне шаблонизатор:

    http://search.cpan.org/~alexmv/Template-Declare-0.47/

    permanent link

    2016/08/12 dezi

    http://dezi.org/ — поисковик на Перл, форк Swish, что уже хорошо. При этом сайт на вордпрессе. Пока не пробовал, боюсь разочароваться. Не люблю это всё бесчисленные апачины отпрыски (там Apache Lucy используется), но если это будет работать, то почему бы не начать уже сейчас.

    permanent link

    2016/04/28 perl dom

    "I'm not a fan of template languages, preferring DOM manipulation."

    http://blogs.perl.org/users/toby_inkster/2012/10/in-a-simple-mojoliciousdbi-example.html

    Там же ссылка на CR(UD) для Mojolicious в несколько строчек:

    http://blogs.perl.org/users/joel_berger/2012/10/a-simple-mojoliciousdbi-example.html

    permanent link

    2016/04/02

    Глокая куздра как критерий русскости

    Уже много лет я думаю о создании нормального поисковика для посрамления корпоративного поделия Гугла.

    Однажды я даже пытался было взяться за одну из подзадач этого дела — распознавание языка и анализ морфологии. И оказалось, что практически все существующие морфологические анализаторы работают со словарями — конечными наборами данных. Практически все определители языка используют всё те же словари, N-граммы (которые также получены из словарей или из текстов) и/или рассчитаны на обучение — то есть не работают «из коробки», и успех их зависит от качества исходных словарей или текстов и старательности обучающего.

    При таком подходе создание морфологических анализаторов для малых языков (либо мало представленных в электронном виде) упирается в непосильную задачу составления словарей или поиска приемлемых текстов (которые, в свою очередь, в интернете найти не так-то просто из-за отсутствия способа опознать данный язык).

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

    В советское время была выпущена книжка «Определитель языков мира по письменности», а в «Химии и жизни» была статья «Как узнать незнакомый язык». Книжку я лишь скачал и ещё не читал, но статья на неё ссылается. Статьёй же я всё детство зачитывался. Описанный там способ мне всегда казался само собой разумеющимся. Точно так же обычно построены определители животных или растений: ищется в тексте некий признак (буква, буквосочетание, служебное слово), в зависимости от результата ищется следующее, пока не пройдём всю череду признаков, уникально идентифицирующих язык.

    Исходить нужно из того, что словарный подход вообще не работает в некоторых случаях. Например, знаменитую фразу «Глокая куздра штеко будланула бокра и курдячит бокрёнка» наше сознание легко идентифицирует как русскую, хотя слов таких в словарях нет (кроме «и»), мало того, даже отдельные вырванные из неё подфразы типа «штеко будланула» или «куздра курдячит» вполне могут быть опознаны как русские или по крайней мере (восточно-)славянские.

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

    UPD: Уже закончив эту заметку, я обнаружил и стал читать книжку венгерской переводчицы Като Ломб «Как я изучаю языки», где она рассказывает, как самостоятельно «расшифровывает» язык, в том числе склонение и спряжение. Естественно, такая расшифровка возможна лишь при некотором знании других языков, родственных или типологически близких расшифровываемому. Однако это всё равно позволяет ограничить набор требуемых исходных данных. Вот несколько цитат из книги, иллюстрирующих метод:

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

    А однажды на рассвете, в конце декабря, я приступила к самостоятельной расшифровке первого китайского предложения. Было уже совсем поздно, когда я добилась результата.

    Я без промедления купила роман Ивана Ольбрахта «Анна-пролетарка» и, пользуясь своим уже привычным способом, распутала по тексту загадку склонений и спряжений.

    Прочтя книгу, я проверила себя по хорошему учебнику Рудольфа Кирая, верно ли я вывела из текста основные грамматические правила.

    permanent link

    2016/03/04 template pod

    Сегодня, моясь в ванной, подумал, что можно было бы в качестве шаблонизатора на все случаи жизни использовать POD. Потом понял, что таким образом можно и включать куски кода в шаблоны — файл шаблона будет обычным перл-скриптом с чередованием кода и pod. На выходе получаем HTML.

    Идея настолько проста, что я подумал, что Template::POD, конечно же, уже существует. Принялся его искать -- но нет! вроде как нету такого. Нашёл только вот это: http://search.cpan.org/dist/WriteAt/ — для pod6. И его же: http://search.cpan.org/~zag/WebDAO-2.25/. Там автор, как я понял, вообще отказывается от вывода в HTML в пользу JSON/XML, что мне вовсе не требуется, я собирался просто генерить вывод чем-то вроде pod2html.

    permanent link

    2016/01/18 cidercms

    CMS от мэйнтэйнера Petal:

    http://cidercms.org/

    https://github.com/niner/CiderCMS

    permanent link

    2016/01/07 updates

    Навязывание обновления софта переходит уже всякие границы. К сожалению, это затронуло и FreeBSD и Perl.

    Решил сегодня наконец обновить порты с уязвимостями. Среди них был libidn (как я потом подумал, непонятно зачем мне вообще нужный). И вот он стал требовать обновить перл до 5.18, хоть ты тресни. У меня шевельнулась, конечно, мысль, что за этим последует обновление половины системы, поскольку перл многое ставил в разные там lib/perl/5.16. Однако я наивно понадеялся, что апгрейд как-то разрулит эту ситуацию. Автоматическое обновление всех зависимых от перла портов также не заказал. Не люблю обновление без объективных причин, коими считаю недостатки непосредственно в обновляемом софте, а не в том, от которого он зависит. Тем более что зависимости зачастую выставлены не пойми по какому принципу, а у меня нету времени с каждым портом разбираться, действительно ли ему нужен такой-то перл.

    Короче, итог: весь день сегодня сижу и обновляю перловые модули. День угроблен. Из-за того, что с какой-то радости разработчикам перла взбрело в голову перейти на нынешнюю систему выпуска релизов. Опять же, я не считаю, что релизы должны выпускаться без объективных причин и что наступление какой-то ежеквартальной даты к таковым причинам относится.

    permanent link

    2016/01/03 wxwidgets

    В Audacity меня долгое время раздражало, что сто́ит отойти от компа, как оно начинает безбожно жрать CPU. Оказывется, это баг wxWidgets-2.8.10.

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

    Это версия библиотеки из Debian 6. За всё время существования дистрибутива исправление сделано не было.

    permanent link

    2015/12/31 results

    Подведу некоторые итоги запуска сайта http://rp.spb.su/slugs/ и русскоязычной версии гофера (пока только раздел gopher://gopher.rp.spb.su/1/ru/books) и веб-интерфейса к нему.

    Оказалось, blosxom не так уж идеален, ибо не позволяет многих вещей (либо они делаются с трудом):

    1) Задавать произвольные сортировки

    2) Перемещать пост из категории в категорию. Я никак не могу отказаться от идеи хранить контент таких сайтов в текстовых файлах, но идея физически их хранить в дереве каталогов, которое и отображается клиенту как путь к файлу в адресе, всё более кажется тупиковой. Это и к гоферу относится. Я уже много размышлял об опасностях отождествления дерева меню гофера с файловой системой. Возможно, более правильно хранить весь контент на одном уровне, как в n4u (что мне сначала там не нравилось и что я хотел исправить). А доступ к нему уже делается через различные иерархии. Как я понимаю, в Zope что-то подобное, только в отношении доступа к методам и свойствам (acquisition). Подумал, что можно рядом с файлом .txt (и его VIEWS типа .pdf, .html) хранить также файлы .abstract и .metadata. Тоже текстовые. Там и перечислять иерархии, через которые доступен файл. Вопрос в том, как автоматически изменять что-то в этих файлах, если что-то изменится в дереве иерархий (таксономий).

    Таким образом, иерархическое дерево будет чисто виртуальным, а в файловой системе будет другое — со служебными каталогами. Например, можно хранить все .txt в /data, метаданные в /metadata, views в /views/pdf/ и т.п.

    На данный момент это можно попробовать реализовать внутри какого-то одного каталога через gopherhandler.

    3) Так и не придумал приемлемый формат файла меню.

    Ado заглохло. Galileo вот зато развивается, 1 ноября был коммит. Учитывая, что я отказался от идеи значимой вложенности разделов сайта, он мне, может быть, и подошёл бы.

    permanent link

    2015/10/10 robots

    Я и раньше много размышлял о бесполезности файла robots.txt. Что злоумышленника он всё равно не остановит (и даже даст подсказку, куда лезть), а порядочного человека лишит возможности найти поисковиком документы, которые тем не менее вполне доступны публично (иначе зачем было бы возиться с robots.txt). Кроме того, убогий общепринятый синтаксис этого файла и не позволяет скрыть нужное с приемлемой гибкостью — из-за чего придуманы расширения, которые понимает тот или иной конкретный поисковик. В итоге мы вообще не застрахованы от индексирования более-менее сложных адресов всеми остальными.

    Сегодня искал в инете последнюю версию шрифта Old Standard. Он есть в Дебиане, я как-то не особо им пользовался, предпочитая самодельные аналоги, но потом обнаружил, что шрифт сделан с толком, содержит многое из того, чего в самодельных шрифтах не хватало, прочитал документацию и убедился, что создатель шрифта Алексей Крюков ориентировался на правильные образцы, работал со знанием дела и вообще шрифт как будто для меня и сделан. Меня только смущало не очень ровное расположение символа COMBINING TILDE над буквой œ (что в моём стихе "Французы" должно было означать назализацию ё). Решил узнать, есть ли более новая версия, в которой это могло быть исправлено. Везде указан официальный сайт шрифта — http://www.thessalonica.org.ru. Но там только рекламная страница хостинг-провайдера. На каком-то форуме прочитал, что уже несколько лет назад страница не работала (почему тогда домен до сих пор существует? кто за него платит? и Гугл, кстати, подмены не замечает и сайт находит). Ладно, иду на archive.org, а там — видите ли, этот сайт не сохранился у нас, так как robots.txt это запрещает. Смотрю, и в кэше Гугла и Яху ничего нет, по той же причине. Смотрю robots.txt, а там и правда:

    Host: thessalonica.org.ru
    User-Agent: *
    Disallow: /
    

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

    permanent link

    2015/08/26 wikipedia

    О запрещении Википедии. Я вот давно удивляюсь, почему её архитектура такова, что недоступность сайта делает недоступным весь контент, для которого этот сайт был лишь одним из, казалось бы, множества возможных интерфейсов. Это как если бы в эпоху, когда не было интернета, мы почитать некую книгу ходили бы в библиотеку, которую достаточно было бы закрыть, чтоб нас этой книги лишить: больше, видите ли, ни у кого её нет, и библиотека одна-единственная в мире. Зачем Википедии эта централизация и завязка на веб-морду, непонятно. И почему тогда нет никаких официальных зеркал? Нет никакой лазейки, которая позволяла бы открыть версию с недоступного домена через доступный? (Скажем, по адресу http://en.wikipedia.org/?lang=ru открывалась бы русская версия.) Почему нету официального клиента, который автоматически сохранял бы юзеру локальные копии статей, всех или избранных? Контент логично хранить под контролем версий, тогда такая программа представляла бы собой просто визуальную оболочку к выбранной системе контроля версий. Тогда было бы проще простого и поднять зеркало Википедии где угодно. Конечно, не исключено, что это приведёт к росту вандализма и расплождению разных версий одного и того же — все не будут же исправно обновляться, а кто-то нарочно будет вносить угодные ему правки в копии на своих зеркалах. Но это неизбежно в любой технически сложной системе, пользователи которой различаются по уровню её понимания. Спасением была бы отдельная копия на собственном компе у каждого юзера. Впрочем, в эпоху облаков удивляться нечему. Предсказываю, что Википедию рано или поздно купит Гугл. И встроит всё, о чём я пишу, в Хром, ChromeOS, Андроид и иные свои грядущие поделия.

    UPD: оказалось, что всë же можно как скачать оффлайновый архив википедии, так и развернуть его, даже несколькими способами (14.08.2016). Непонятно, почему никто или почти никто так не делает.

    permanent link

    2015/08/25 php

    Разбираю сайт на старой Джумле, не работающей на современном PHP, а там такое:

    } else if (strstr($target, '->')) { // object->method
        // use a stupid name ($objet_123456789 because) of problems when the object
        // name is the same as this var name
        list($object_123456789, $method) = explode('->', $target);
        global $$object_123456789;
        $result = call_user_func_array(array($$object_123456789, $method), $arguments);
    

    permanent link

    2015/08/20 online

    Я наконец решил скопировать данный блог с локалхоста на общедоступный веб-сервер. Изначально, конечно, я собирался выложить его в гофере. Но это оказалось, как ни странно, непросто: я уже и раньше предполагал, что монолитность bucktooth рано или поздно помешает мне добавлять новшества, что и произошло. Блог отличается от прочего контента моих гофер-серверов. Записи выводятся в обратном хронологическом порядке, названия у них генерируются из имени файла и проч. При этом я уже почти доделал веб-версию на blosxom, и мне казалось, что не проблема заставить его выводить (в качестве особого flavour) ещё и гофер-меню. Это действительно можно сделать. Однако если вызывать blosxom из bucktooth, цена этого будет слишком велика: inetd -> buckd -> gophermap -> blosxom. Ибо невозможно запустить blosxom ни в обход buckd, ни напрямую не то что загрузить его в процесс buckd, а хотя бы даже вызвать из него! И виноват тут не blosxom — его-то можно было бы совсем немножко доработать (хотя и этого не хотелось бы — я не собирался делать свой форк blosxom'а, без этого дел хватает). Но buckd пришлось бы переделать почти полностью. Я очень уважаю Кэмерона Кайзера и всё, что он делает для гофера, но его стиль кодинга меня всегда как-то коробил. Bucktooth работает как часы, но оказывается совершенно нерасширяемым, а простота оборачивается провалами производительности, подобными описанному выше, в более-менее сложной конфигурации, где нужны кастомные меню директорий, загрузка сторонних модулей, да что угодно.

    Поэтому блог висит в вебе и ищется решение, как модулизировать bucktooth.

    permanent link

    2015/08/11 object storage

    В поисках объектного хранилища (аналога ZODB) посмотреть на:

    Update (21.12.2016):

    Update (17.12.2017):

    Pixie удалено с CPAN. Tangram описывается в документации в первую очередь как ORM, хотя в то же время и persistent object storage. В то время как у Simon Cozens в Advanced Perl Programming — как объектная БД. Поддерживает транзакции. Почему-то мне как-то не нравится он.

    permanent link

    2015/05/17 python

    Питон такой питон. Уже несколько дней пытаюсь поставить Anki на все свои maemo-девайсы. Кто бы мог подумать, что незапускающиеся графические приложения придётся запускать из консоли, чтобы посмотреть на всё те же предсказуемые ошибки питона: то ему нужна версия такого-то API 0.7, а у меня 0.8, то нужна версия модуля x.y.z, а у меня z+1 или z-1, и всё в том же духе. Составители пакетов для Maemo также не могут нормально указать зависимости — поставив всё, что требуется, всё равно не удаётся запустить программу, из консоли узнаёшь, что нужно доставить ещё пару пакетов. Это конечно не относится прямо к питону, но мне теперь кажется, что характеризует мышление пишущих на нём.

    permanent link

    2015/05/11 gopher link

    Надо для брожения умов и раскачивания лодки вставлять в head всех сайтов что-то такое:

    <link rel="alternate" type="application/gopher-menu" title="Gopher"
    href="gopher://gopher.rp.spb.su/1/stauropygial">
    

    Это для меню, а для отдельного файла тип может быть и text/plain, но ссылка всё равно на гофер.

    Ещё можно (нужно ли?) как-то указать проксированную версию гофера.

    permanent link