vitus_wagner: My photo 2005 (Default)

тут у меня недавно сломался фоссил на сервере wagner.pp.ru (ну и spacians.net соответственно). Ну как сломался - вики показывает, тикеты работают, но при попытке сделать clone или sync по https говорит "Server doesn't reply". Первое время мне было лень с этим разбираться, и я спокойно синкался по ssh. Хотя вообще это неправильно, потому что клонировать по https мои репозитории может кто угодно. А так у "кого угодно" остается только опция лезть git-овское зеркало на github, которое не для всех репозиториев есть.

Наконец разобрался и починил. Оказалось что дело в паранойе апачевской команды. Почему-то там c версии 2.4.59 отключили по умолчанию передачу клиенту HTTP-заголовка Content-Length, выданного CGI-скриптами. Переменная, которая это включает обратно называется ap_trust_cgilike_cl.

О чем теперь честно написано в доке по настройке fossil как cgi. В коммите от 17 апреля сего года фоссиловцы даже научили свой клиент работать без заголовка Content-Length, раз уж апач не хочет его передавать.

В документации на apache в разделе переменные среды специального назначения это даже описано. А вот в описании mod_cgi и в тьюториале Servinng Dynamic Content with CGI нет.

Злые они (в смысле apache), уйти что ли от них на lighttpd? (у того вроде функциональнсти хватает для моих нужд). Или что у нас еще такое есть из небольших и легких вебсерверов, предназначенных не для монструозных проектов на php или django, а в первую очередь для статики и немножко всего остального? Фронтэнд-прокси переросток от Сысоева не предлагать. Он как раз для монструозных проектов. Его на личный сервер ставить, это все равно что удобрения на дачный участок на Белазе возить.

Основная проблема с которой я сейчас столкнулся, это, по-моему ориентация Apache на shared hosting. Потому как откуда еще может вознинуть идея что программе, лежащей на том же компьютере, что и сам веб-сервер, можно не доверять?

vitus_wagner: My photo 2005 (Default)

При переезде сервера выяснил, что спейсианские часы, размещенные в правом верхнему углу страниц сайта https://spacians.net перестали идти. И вместо мегасекунд с начала эпохи, и вместо земного времени показывают нули.

Полез разбираться. Обнаружил в часах две проблемы

1) В замоммиченном в фоссил-репозиторий скрипте в двух местах отсутствали точки с запятой. Когда я пять лет назад это писал, браузеры такое кушали. Теперь перестали.

2) fossil на котором работает данный сайт, вдруг начал проявлять немеряную паранойю по поводу Content-Security-Policy и выдавать этот заголовок с очень рестриктивным значением. Так что даже встроенный в html тэг <script> не работает. Освоить правильную пляску с бубном чтобы работало со встроенной csp я не сумел, и вынужден был ее ослабить до default-src 'self' script-src 'self' 'unsafe-inline'.

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

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

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

В результате написался вот такой скриптик:

#!/bin/sh
netstat -nlpt 2>/dev/null| 
awk '/fossil/  {split($7,a,"/");print "http://" $4, a[1];}'| 
while read url pid; do
    echo "$url $(readlink /proc/$pid/cwd) $pid"
done

В смысле, смотрим на каких tcp-портах слушают исполняемые файлы по имени fossil и из /proc добываем их cwd. В выводим табличку url, рабочая директория pid (куда SIGINT слать при необходимости).

Будет не лень можно будет поразвивать:

  • добавить функциональность "прибить по имени рабочей директории"
  • или "прибить все кроме текущего проекта".
  • табличку заголовком украсить.
  • сделать чтобы при отсутствии запущенных fossil ui выдавался ненулевой код завершения.
  • сделать команду "запустить fossil ui для данного проекта или открыть в браузере, если он уже запущен
  • Если рабочий каталог в ${HOME} текущего пользователя, заменить в имени директории полный путь ${HOME} на тильду.
vitus_wagner: My photo 2005 (Default)

Обнаружил сущестование в vim таких полезных событий для автокоманд как BufReadCmd и BufWriteCmd.

В результате теперь у меня получилось сделать плагин (который лежит в ~/.vim/plugin/fossilwiki.vim)

и умеет открывать и сохранять странички по именам вида wiki://Название.

При этом, если страничка была открыта через этот плагин, на ,l назначается команда превращения текущего слова/выделенного текста в маркдауновскую ссылку, а если нет, то нет.

Осталось повесить на <Enter> переход по такой ссылке (уже имеющейся в тексте) и, пожалуй уже можно будет хвастаться в фоссиловской рассылке. Здесь я как-то пока не соображу, как определить текующую позицию курсора, и как от неё искать границы ссылки.

Текст плагина пока такой:

augroup fossilwiki
au! * wiki://*
au BufReadCmd wiki://* let s:page=shellescape("< amatch>:t")
\ |exe "r !fossil wiki export ".s:page
\ . "\|\| fossil wiki create ".s:page." /dev/null"
\ | :%s/^M$//e
\ | set filetype=markdown |doau BufReadPost
au BufReadPost wiki://* :map < buffer> ,l lbcw[< Esc>pa](wiki?name=< Esc>pa)< Esc>
au BufReadPost wiki://* :vmap < buffer> ,l da[< Esc>pa](wiki?name=< Esc>
\:let @@=substitute(@@,' ','+','g')< CR>pa)< Esc>
au BufWriteCmd wiki://* exe "w !fossil wiki commit "
\.  shellescape("< amatch>:t") . " -M text/x-markdown"
\| set nomodified
augroup end

(бэкслеш с начале строки это признак продолжения команды с предыдущей строки. Чтобы не было слишком длинных строк.)

И еще тут есть один грязный хак, который унаследован от шелловского скрипта, использовавшегося раньше - если страница не существует, она создается (пустая) в момент чтения. Возможно, правильнее было бы заводить buffer-local переменную, которая бы содержала слово create если страницы не существует, и слово commit, если существует. Но это я еще не разобрался с неймспейсами в vim.

P.S. А чтобы дримвидсовский конвертер маркдауна не принимал вимовские токены в угловых скобках за незакрытые html-тэги, пришлось везде после < пробелов навставлять, так как почему-то &lt; он понимает в обычном тексте, но не в преформаттед блоке. А на тэги ругается и в нём тоже.

vitus_wagner: My photo 2005 (Default)

Вот такие я себе завел макросы в vimrc:

au FileType markdown :map <buffer> ,l lbcw[<Esc>pa](wiki?name=<Esc>pa)<Esc>
au FileType markdown :vmap <buffer> ,l da[<Esc>pa](wiki?name=<Esc>:let @@=substitute(@@,' ','+','g')<CR>pa)<Esc>

Первый макрос простой, он работает если выделения нет и конвертирует слово под курсором в маркдауновскую ссылку на wiki. Но в нем есть хитрый хак - это первая команда 'l'.

Дело в том что команда b (переход в начало слова) в vim, переходит в начало следующего слова, если курсор уже находится в начале слова. А если курсор находится в пробеле после слова, переходит все равно в начале слова. То есть последовательность lb переводит в начало текущего слова, даже если мы там уже и были. И даже если были в его конце.

Ну а дальше все просто. Командой c мы удаляем слово (при этом оно попадает в неименованный буфер) вставляем скобку, слово, еще скобку, фиксированное начало url, еще раз слово, закрывающую скобку.

Вот со вторым вариантом хитрее. Если у нас есть выделенный фрагмент из несколькоих слов, мы его забираем в буфер, потом в квадратных скобках вставляем как есть, а потом надо прежде чем добавлять его как часть URL заменить плюсы на пробелы. Что мы и делаем заменяя значение переменной @@ (которая есть неименованный буфер) на результат применения к ней же функции substitute().

Надо бы туда добавить вторую функцию substitute, чтобы эскейпила скобки. Но я сходу не соображу сколько бэкслэшей надо в этом месте ставить чтобы после выполнения всех раундов подстановки остался только один. Можно, конечно, на %28 и %29 менять, но процент тоже эскейпить надо правильно.

Еще бы исхитриться замэпить Enter чтобы он по ссылке переходил, как это сделано в vimwiki. Но я читать чужие продвинутые vimscript еще не научился, поэтому не понял, как там опознают ссылки.

vitus_wagner: My photo 2005 (Default)
Ричард Хипп очень не любит поисковых ботов. Поэтому fossil предпринимает всякие меры чтобы боты по репозиториям не лазили. К сожалению, на мой взгляд, он несколько перегибает палку.

Поэтому недавно я обнаружил что все мои фантастические вики не индексируются.

Сейчас подправил настройки на spacians.net, Галактической федерации, Русалках, Ясмине и Технократах и Имперцах. Вроде теперь должны пускать бота погулять по вики и по форматированным выложенным текстам.

Посмотрим, проиндексирует или нет.

P.S. Данный пост, естественно, является наживкой для бота - крупные блогсайты они индексируют довольно оперативно, пусть отсюда по ссылкам пойдет.
vitus_wagner: My photo 2005 (Default)
Тут в связи с переездом всех моих сюжетов в единую платформу - fossil, решил заодно проверить, много ли у меня в соотвествующих wiki висячих ссылок.

Написал скриптик ) и погонял его на все репозитории.

Результат

репозиторийвсего страницвисячих ссылок
Русалки340
Ясмина2060
Спейсиане226122
Галактическая Федерация76116


Что удивительно - наиболее давно разрабатываемая реальность - самая бедная (тем более что я знаю, что там еще многие существующие страницы нуждаются в серьезной доработке. Я, например на страницу Вента не залил ни одной из нарисованных еще четверть века назад и давно отсканированных карт Венты.

Все плохо и в вики по единственной законченной книге - спейсианской. Там, кстати, могут быть посчитаны не все висячие ссылки, поскольку там присутствуют страницы в формате Fossil Wiki, а вышеприведенный скрипт парсит только markdown.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

August 2025

S M T W T F S
     1 2
3456789
10111213141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 3rd, 2025 07:44 pm
Powered by Dreamwidth Studios