Doomed to Wordpress (circa 1993)

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


[] 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-/


[] 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

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

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

https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%9A%D0%B0%D0%BA%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%D0%BA%D0%BE%D0%BF%D0%B8%D1%8E_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D0%B8


[] 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):


[] 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

2015/04/30 w2g

Обнаружил какой-то скрипт w2g. Он должен отображать веб-сайты в гофере, т.е. проксирует запросы из гофера в веб. Вернее, я давно его уже заметил. Но не могу понять, откуда он взялся и я ли его вообще написал. Самая ранняя версия у меня на компе датируется 14.02.2005. Концы строк досовские, т.е. делалось в винде. В инете не ищется (хотя странно, неужели никто такого не делал?).

Некоторые фрагменты вообще на меня не похожи:

#replace <head> leave just title
#all the reat tags leave content only :)))

или

print &convert($text);

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

$data = "GET /$path HTTP/1.0\nHost: $host\nUser-Agent: Web 2 Gopher (gopher://gopher.rp.spb.su/)\n\n";

Почему HTTP/1.0? Я сам пробовал вообще этот скрипт?

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

UPD. Попробовал. Оно работает! Даже довольно неплохо. Будем продолжать.


[] permanent link

2014/05/12 4channels

Сегодня попробовал настроить 2 звуковые карты на 1 компе, чтобы можно было записывать 4 канала.

cat /proc/asound/cards:

 0 [CK8S           ]: NFORCE — NVidia CK8S
                      NVidia CK8S with ALC655 at irq 22
 1 [Live           ]: EMU10K1 — SB Live! Value [CT4832]
                      SB Live! Value [CT4832] (rev.8, serial:0x80271102) at 0xa000, irq 17
 2 [CODEC          ]: USB-Audio — USB Audio CODEC
                      Burr-Brown from TI USB Audio CODEC at usb-0000:00:02.0-1, full speed

JACK config:

/usr/bin/jackd -dalsa -dhw:2,0 -r48000 -p256 -n2

Запуск alsa_in с такими параметрами

alsa_in -d hw:1 -j SBLIVE_IN -p 512 -n 2

не дал никаких xrun'ов.

Пробуем -p 256 Выдаётся отладочная инфа типа:

delay = 252
delay = 252
delay = 524
delay = 521
delay = 252
delay = 252
delay = 524
delay = 252
delay = 515
delay = 255
delay = 254
delay = 618
delay = 252
delay = 517
delay = 251
delay = 252
delay = 666
delay = 252
delay = 255
delay = 525
delay = 255
delay = 251
delay = 252
delay = 648

но на слух ничего не ощущаю. В настройках jack надо вручную соединять выводы SBLIVE_IN со входами ardour.

Но, честно говоря, раз с -p 512 такого не было и на слух было нормально, то возможно лучше так и оставить.

На всякий случай ещё пробую запустить jack как

/usr/bin/jackd -dalsa -dhw:2,0 -r48000 -p128 -n2

И потом запускаю

alsa_in -d hw:1 -j SBLIVE_IN -p 256 -n 2

Сообщений delay нет!

Но, собственно, что это даёт? Если я буду записывать 4 канала одновременно, задержка на них по идее будет одинаковая, а вероятность xrun всё-таки при уменьшении -p повышается?

В документации сказано, что нет смысла делать -p у alsa_in меньше, чем у jackd. Очевидно, и равным тоже нет смысла.


[
] permanent link

2014/04/03 perligata

http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html

Гениальная идея. Даже не из-за латыни, а из-за семантического переосмысления аргументов функций. Подобное было бы уместнее скорее даже в функциональном языке. (Кроме того, наличие подобных парсеров подсказывает, что и Kivi можно реализовать на Perl.)


[] permanent link

2014/01/20 frescobaldi

Вернулся из Мск с навязчивым желанием поставить frescobaldi. Как оно пакетировано в Дебиане, это ужас. Версия 1.x тянет за собой пол-KDE. Версия 2.x требует python-qt4 >= 4.8, который тянет за собой пол-Wheezy. Последнее, вообще, очень уж типично для питонщиков: смысл этого требования в том, что начиная с какой-то версии frescobaldi и/или Питона изменилось кол-во аргументов у одной функции. Попытки собрать что-либо из исходников тоже упёрлись в строгие зависимости от определённых версий питоньих библиотек и вытягивание половины дистрибутива для сборки deb-пакетов. (Туплю и лень всё описывать.)

Потом ещё долго разбирался с вопсроизведением midi в frescobaldi, так или иначе, ZynAddSubFX не работает, работает timidity, которое теперь запускаю вручную так:

/usr/bin/timidity -Os -iAD

Пакет timidity-daemon по непонятным причинам мне ничего не поставил в init.d (?!).

Что в итоге получилось с frescobaldi, я почему-то не записал. Сейчас у меня стоит версия 2.0.8 в /usr/local/bin/. Видимо, просто из исходников поставил.


[
] permanent link

2013/12/25 sine

Генерация сигналов:

ecasound -i tone,sine,400,0 -o jack,system (уровень)

tones -f -s 48000 -w packs.wav -v 3 400 1000 2000 4000 8000 10000 12000 13000 14000 15000 16000 (пачки)

Файл packs.wav затем вручную переделал в стерео и добавил 5 мс тишины в конец и потом:

ecasound -i:audioloop,packs.wav -o jack,system


[
] permanent link

2013/12/18 wheezy

Вчера и сегодня ставил Debian Wheezy, jackd и аудиопрограммы на отдельный комп для аудиообработки.

В очередной раз убеждаюсь, что чётные релизы Дебиана хорошие, а нечётные — какое-то сырое недоделанное не пойми что. Особой разницы в наборе софта по сравнению со Squeeze нету, зато разломано многое из того, что работало.

В частности, jackd не запускается без dbus-x11, который однако не указан в зависимостях. И это не первый случай, замеченный в этом дистрибутиве. Если раньше проблемой было, что в зависимостях постоянно указывались программы, которые на самом деле для данной программы не нужны, то теперь противоположная крайность, не указывают нужное.


[
] permanent link

2013/12/10 stauropygial

Для ставропигиального сайта я теперь рассматриваю как варианты Titanium и Mason/Poet. Причём Titanium в качестве шаблонизатора использует либо Petal, либо CGI::Application::Plugin::Mason. Но вообще вроде и без шаблонизатора можно обойтись? Или как?

Не исключено, что на нынешнем сервере я не смогу ставить новые модули. Апач с мод_перл также не поставить уже. Вместо CGI.pm можно использовать CGI::Simple.


[
] permanent link

2013/11/28 perl cms

Начинаем рассмотрение простых perl CMS и блоггерских движков.

Список: http://www.perlmonks.org/?node_id=197267

Galileo CMS: http://galileo-cms.herokuapp.com/page/about http://search.cpan.org/~jberger/Galileo-0.030/lib/Galileo.pm

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

Thraxil: http://thraxil.org/ http://thraxil.org/code/

OpenJournal: http://grohol.com/downloads/oj/ Посмотрел, с кириллицей похоже не будет работать. Тоже довольно примитивно всё вообще.


[] permanent link

2013/11/24 perl framework

Нужны 2 движка, для нового ставропигиального сайта (поддержка noSQL пригодится) и для кассетного сайта (нужна простая обработка и валидация форм, поддержка простой SQL базы). (Можно ли для ставропигиального сайта задействовать scoop? Или это ненужное усложнение, привносящее зло интерактивности? scoop скорее для Бакунисты бы подошёл, коли на то пошло.)

Mojolicious / Mojolicious::Lite — не нашёл, в чём между ними разница. Есть валидатор форм, не очень удобопонятный. Насколько я понял, там развитый server-side user agent и он годится скорее для сайтов с подгрузкой содержимого и отправкой форм на сторонние сайты, т.е. интеграция с соцсетями и прочий веб 2.0. Как я понял, есть всякие фичи для стриминга, многопоточного аплоада/даунлоада, вебсокеты и т.п. Модный фреймворк, позиционируется как Real-time web framework. Параметры форм доступны через $self->req->param, но неясно, можно ли как-то автоматизировать их проверку и сделать им какие-то описания или объявления.

CGI::Builder, пишут, имеет поддержку валидации форм, в отличие от CGI::Application. Apache::CGI::Builder работает под mod_perl.

CGI::Framework — есть примитивный механизм валидации, т.е. как в Масоне примерно, вручную всё пишешь, удобство в том, что это выделяется в отдельную функцию.

CGI::Builder построен на CGI::Application, а Framework нет.

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

Titanium умеет валидацию форм через Data::FormValidator. Думаю, так можно и самому сделать. Titanium is simply a more user-friendly packaging of the mature CGI::Application framework and some useful plugins. У него вроде есть приличные средства отладки без веб-сервера. Он работает с FastCGI и mod_perl. Я так понимаю, при наличии Титаниума рекомендуется использовать его, а не чистый CGI::Application. Мне не нравится, что там используется HTML::Template (или TT через плагин). (Впрочем, их кажется использует всё, что происходит от CGI::Application или им инспирировано.) С DBI работает напрямую. В примерах CGI::Application сказано, что DBIx::Class тоже кое-где используется.

Но в принципе, если бы не плохие темплейты и CGI-ориентированность, эти движки (основанные на CGI::Application) довольно простые и достойны внимания.

Mason 2 это Moose, отпадает. Кроме того, это теперь сугубо темплейтный движок, вся веб-интеграция делается через Poet и PSGI. Соответственно и Poet отпадает. С другой стороны, пишут, что Moose не такой уж и страшно медленный (overhead at compile time), а напрямую с ним там работать не надо. В Поэте создаётся удобная структура каталогов для серьёзного проекта, но для маленького сайта это слишком.

Catalyst все пишут, что слишком сложен и рассчитан на большие проекты. Не проверял.

Dancer мне патологически не нравится название. Хотя в целом он довольно прост. Собственный темплейтный движок либо TT.

Короче непонятно, что и делать, CGI::Application кажется логичнее всего, но темплейты не нравятся. Есть правда CGI::Application::Plugin::AnyTemplate, к-рый поддерживает Petal, но это тоже наверно перебор. Вроде у Титаниума есть возможность написать свой темплейтный плагин. Есть также CGI::Application::Plugin::Mason.

Есть ещё Template::TAL (и HTML::AsSubs и Template::Declare, которые продолжают мою идею о ненужности работать напрямую с HTML в веб-приложениях, хотя у меня это скорее достигается за счёт чёткой логической структуры документа). Text::Template очень хорош. Petal поддерживает metal, а Template::TAL нет.

По поводу ставропигиального сайта, как мы будем хранить данные и какие будут шаблоны? Самый простой вариант — хранить всё в виде текстовых файлов, отображать их в гофере и добавлять разметку в вебе. Раз никакой объектной базы не находится. Нужно продумать чёткую структуру каталогов для этих файлов или какой-то механизм тип moles, позволяющий держать несколько документов в одном файле. Так, нужно будет составлять список и брать метаданные всех релизов из всех файлов. Или всё-таки база?


[
] permanent link

2013/09/03 fontlab

Несколько дней трахался с запуском Fontlab 2.5 под Wine. Scanfont сразу запустился, а собственно Fontlab (FLW.EXE) выдаёт

err:fixup:apply_relocations No implementation for WIN87EM.__FPMATH, setting to 0xdeadbeef
fixme:hook:SetWindowsHookEx16 System-global hooks (2) broken in Win16
wine: Unhandled page fault on read access to 0x0000dea8 at address 0x1587:0x000000ed (thread 0019), starting debugger...
Unhandled exception: page fault on read access to 0x0000dea8 in 16-bit code (1587:00ed).

Решилось установкой оригинального виндового win87em.dll в каталог с Фонтлабом и удалением (переименованием) win87em.dll16 в /usr/lib/wine. Только так. Через WINEDLLOVERRIDES или как-либо ещё 16-bit DLL не оверрайдится, по кр. мере я не нашёл к этому способа. Возможно, проще было бы что-то сделать с win87em.dll16 в /usr/lib/wine (он содержит строку kernel32.dll) или поставить отдельный Вайн для Фонтлаба.

Заработало также Wine 1.6 как

WINEPREFIX=/home/rp/wine16/data WINEDLLOVERRIDES="win87em.dll16=n" WINEDEBUG=loaddll ~/wine16/bin/wine FLW.EXE

(в дебиане у меня Wine 1.0). Разница в том, что в 1.4 и 1.6 есть отдельный файл lib/wine/win87em.dll16.so. Фокус прокатил и в 1.4, которое я перед этим безуспешно пробовал ставить из Wheezy и не понял, как отключить multiarch.

Кажется, проще всего собрать отдельно 1.6+Фонтлаб.


[
] permanent link

2013/07/31 jackd

Второй вечер мучился с jackd на acer. На dell я тоже с ним в своё время много провозился, но внезапно всё заработало, и я не записал как. В этот раз при установке сразу задал для группы audio настройки

@audio — rtprio 95 @audio — memlock unlimited

но и после этого сыпались ошибки типа

JackAudioDriver::ProcessAsync: read error, skip cycle JackPosixMutex::Unlock res = 1

Оказалось, надо "Выборок в буфере" увеличить до 2048. Но качество всё равно неприемлемое. В jamin кроме того всё равно xrun'ы. Мне надоело с этим бороться.

Потом оказалось, что в vlc проблема не наблюдается (только в Totem). Но vlc и сам по себе неплохо усиливает звук, чего я и хотел добиться от jack.


[
] permanent link

2013/05/29 stauropygial

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

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

А пока так: rsync на zayats синхронизирует некий локальный бэкап с гофером на vds. Оттуда уже Plone берёт каталог и т.п. В свою очередь, некие скрипты на vds синхронизируют свой локальный каталог с Plone (documentstextview).

Вообще надо все сайты переделывать, чтобы все данные хранились в гофере, а веб-интерфейсы уже можно любые. Вообще можно ещё всё хранить в объектных БД и гофер будет интерфейсом к ним.


[
] permanent link

2013/05/24 opensearch

Open Search, замена гуглу. Есть некий единый язык запросов, а поисковый софт на серверах может быть любым: пользователь отправляет запрос на едином языке запросов, и сервер уже транслирует его в то, что̀ надо реальному поисковому движку. Т.о. в качестве бэкенда могут быть любые поисковые движки.

Только название лучше взять какое из бестиария.

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


[
] permanent link

2013/05/23 gopherscript

gopherscript — реализация недостающих фич протокола gopher на клиенте. Поскольку я буду делать клиент для emacs, то gopherscript будет представлять собой расширение Emacs Lisp. Недостающие фичи — например, MIME-типы (хотя уже есть в gopher+), кодировки, гиперссылки и картинки в тексте. Вопрос в том, как скрыть gopherscript от клиентов, его не понимающих. Возможный вариант: клиент делает запрос к файлу .gopherscript в данном каталоге (т.е. при любом запросе типа 1). В этом файле описано поведение клиента для всех элементов меню. Минус: нужно поддерживать одновременно gophermap и .gopherscript. Кроме того, содержимое каталога выводится и при некоторых других запросах (с типом 7, например).

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


[
] permanent link