la eterna aŭtuno interne

Ты можешь жить вскользь, ты можешь жить влет, на касты всех людей деля,

Мол, этот вот — крут, а этот вот — нет, а этот, мол — так, ни то и ни сё.

Но я увидел вальс в твоих глазах — и нет опаснее свидетеля,

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

Не бойся — я смолчу, останусь навсегда Египетским ребусом,

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

Возьми и оглянись — ты видишь? Серый волк несется за троллейбусом,

А значит — ты в строю, тебя ведет вальс веселою тропой, как прежде — след в след.

—Олег Медведев «Вальс Гемоглобин»


Premature standardization is much worse than premature optimization ©


Ночь, сердцевина нижних мнёвников (т.е. вокруг буераки и склады), троллейбус заклинило. Водила: "мужики, троллея застряла, давайте толкнем". It's Russia, никто не удивился. Встали, вчетвером сдвинули, троллея отцепилась от троса, поехали дальше...



Bye-bye Drupal!

Всех с наступающими новогодними праздниками!

12 лет назад эта штука со странным названием Drupal была совсем неизвестна в рунете. Я тогда перебирал все доступные в opensource CMS, в поисках удобного для своих скромных нужд инструмента и обнаружил любопытный код, даже выглядевший рабочим, и ко всему с загадочной терминологией — ноды, термы, таксономия (сколько потом споров было вокруг русских переводов!). CMS сразу понравилась и я использовал ее в паре своих сайтов. Мне всегда импонировали идеи opensource, в особенности проекта GNU, поэтому пообщавшись с тогдашними немногими разработчиками Drupal я убедился, что хочу поддерживать их начинание под GNU GPL и привлечь к этой новой системе внимание в рунете. Так на домене drupal.ru в конце 2003 года появился сайт в публичном доступе. Вместе с японцами, мы стали первыми национальными сообществами вокруг drupal.org. Первые посетители drupal.ru, сохранившиеся в базе датируются уже 2004 годом, когда после первых экспериментов и переустановок сайт заработал постоянно.

Группа заинтересовавшихся людей вокруг сайта возникла довольно быстро. Я благодарен этим людям, за их помощь, за первые полезные ответы на сайте, первые локализации интерфейса — благодаря им Drupal начал обретать у нас популярность. К сожалению, я уже не вспомню всех имен и многие остались знакомы только по никам, как оно и водится в открытых общественных проектах. Поэтому, чтобы не обидеть кого-либо из участвоваших в жизни drupal.ru, не упомяну в этом письме имен вообще.

Потом было много всего, удачного и неудачного, вместившегося в годы движения вверх вместе с открытым проектом Drupal. Получившиеся хорошо и получившиеся хреново сайты, какие-то фирмы, пытавшиеся озолотиться на "бесплатном" софте, полезные и не особо модули выложенные в опенсорс, образование устоявшейся группы посетителей сайта, достаточной, чтобы начать именоваться сообществом; первые встречи в офлайне, первый семинар по Drupal в Москве в 2008 и Drupal Day в 2009, неудавшиеся кэмпы позже, встречи DrupalCafe и личное разочарование во всей этой усложняющейся с каждой версией "платформе", лежащей поверх, не способствующего упорядочению хаоса, языка PHP. Нет, я не хочу вдаваться в холиварные технологические дискуссии, поэтому не отвечу на комментарии и вопросы. Каждый выбирает свой путь в IT по своим субъективным представлениям, нет никаких "лучших" технологий — это вероятно, единственная истина. Я нашел лучшие технологии персонально для себя и с интересом ими занимаюсь. Возможно в будущем найду что-то еще более субьективно лучшее, даже нет смысла загадывать. Ключевой посыл моего письма в другом: opensoure — интересный способ вложения времени своей жизни, если ты не жаждешь при этом озолотиться или прославиться. Дальше, все может пойти любым рандомным путем, в любом случае проведешь время интересно.

К сожалению для drupal.ru, эта потеря личной мотивации не могла пройти незаметно: я убедился, что все эти демократические и стихийные сообщества в сети держатся на устойчивом лидерстве, а я его больше не мог предоставить. И не было очевидно, в чьи руки его передавать. В какие-то моменты, пожалуй, я отнесся слишком щепетильно к поступавшим предложениям. Кто-то обещавший все обновить, исправить и улучшить, как было видно, сам погрязал в своих делах, а кто-то напротив имевший огромный энтузиазм имел время, но честно, я бы не доверил ему и мейнтейнинг домашней странички. Возможно я слишком долго выбирал и те кто не выдержал, начали искать свои пути и строить новые сообщества, решив, что drupal.ru выйдет в ноль. Я остаюсь уверен в накопленном запасе прочности этого сайта, поскольку не столько я, но многие уважаемые мной люди вкладывались в этот запас несколько лет, так что при регулярном уходе drupal.ru можно поднять до самых неожиданных высот.

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

Oфициально уведомляю этим письмом, что домен drupal.ru больше мне не принадлежит (технически, на момент написания этого текста, домен в процессе передачи) и не надо отправлять почту на адрес axel@drupal.ru, меня там нет.

Прочитавшему это письмо счастья: разошли это письмо пяти своим друзьям и трафик на твоем сайте внезапно вырастет в 5 раз!

Копия этого письма будет находиться всегда по адресу: http://drupal.ru/node/126548

Ĝis!


Use plantuml class diagram for relational database design

I like to use plantuml for UML diagrams as it faster to write UML with keyboard than to draw it with mouse. Plantuml is Java tool, easy installed and works on any java-supported platform where graphviz works. Internally plantuml uses graphviz to do all job for placing and drawing objects on the canvas.

From time to time I need to design structures for relational databases. Visualization or relational DB looks closely to UML class diagrams so I use plantuml for it purpose. Of course it will nice to automatically generate not only visual representation but also SQL instructions. Plantuml uses simple text format so it not difficult to convert it to SQL. I wrote simple script on Python for a generating MySQL DDL. It uses a notation for UML protected/public fields for hints where to create primary keys and indexes in SQL. So you may define PKs with # prefix in field name (it mean protected field in plantuml) and define index fields with + prefix (plantuml use if for public fields). Field type noted after field name as is. Also you may use one line comments after -- in the end of string. For example class definition:

@startuml

class dummy {
  Sample table.
  ==
  #id int(10)
  field1 int(10)
  field2 varchar(128)
}

@enduml

will be converted to SQL:

CREATE TABLE IF NOT EXISTS dummy (
  id               INT(10),
  field1           INT(10),
  field2           VARCHAR(128),
  PRIMARY KEY (id));

Script code in public domain: github.com/grafov/plantuml2mysql.

/file/database.png

UPD. Another way to use plantuml for database modeling: plantuml.sourceforge.net/qa/?qa=331/database-modeling.


My current workspace

  • Calculate/Gentoo GNU/Linux (but recently I moved to a more funny distro GuixSD)
  • fish shell (but still used bash for root) with z-fish for dir jumping
  • I3 tiling window manager + slim desktop manager + slock screen locker with little modificatios
  • xbindkeys + xcape for more detailed keyboard control
  • my own keyboard layout (colemacs with shift-shift layout switcher
  • rxvt-unicode terminal in client/server mode
  • Firefox (now Icecat in GuixSD) for inet browsing
  • Emacs for all my needs include extensions:
    • org-mode
    • helm
    • projectile
    • yasnippet
    • company

Emacs and Guix certainly require more words and I'll tell about them later.


Фортепиано

Пока нахожусь в промежутками между старой работой и новой, решил отвлечься на что-нибудь некомпьютерное. Купил дочке пианино. Или всё же себе? :) Во всяком случае старое желание разобраться с этой аналоговой кучей чёрных и белых клавиш, так до сих по нереализованное, всплыло вновь и одолело. Нашёл самоучитель, читаю матчась, практикуюсь в освоении незнакомой раскладки. 88 клавиш, это ведь меньше чем на PC ;) В детстве был аккордеон, но лень в необходимости растягивания и сжимания мехов тогда пересилила любопытство. Здесь по счастью мехов не наблюдается, всё очень эстетично так сделано. Я рад, что вы за меня порадовались, но я эти сентенции не к тому начал, а вот к чему. Я вам полезный совет сейчас дам. И кстати, совершенно бесплатно. Приобщитесь к прекрасному, купите себе пианино. Рояль не всем подойдёт ввиду габаритов, а пианино вполне себе компактный агрегат. Старые пианино ещё советских времён сейчас совсем ничего стоят. Серьёзно, их отдают даром. Или за очень по-моему небольшие деньги в 2-4 тыс. рублей. Ещё столько же обойдётся перевозка + столько же настройка. Я вот нашёл сам инструмент бесплатно, 4 тыс. отдал за перевозку, 3 тыс. за настройку. Цены даны по Москве, что почём в других местах не скажу, не интересовался, но меня такой порядок цен устроил. И также удивил. Раньше в советские времена за пианино люди отдавали больше своей зарплаты, ещё 25 рублей вроде где-то обходилась настройка. Сейчас же в сравнении с нынешними зарплатами (ок, здесь я тоже про Москву только) таки оно совсем даром обходится. Настоящее советское пианино марки "Заря", где-то 40-50 летней выдержки, отлично звучащее. Хотите чешское тех же времён или немецкое столетней давности? Да не вопрос, в москве десятки объявлений можно найти. Правда чем старее, тем больше вероятность, что потребуется ремонт. У меня по счастью обошлось без этого, кроме подклейки одной клавиши. Но тут надо смотреть и выбирать, нужен ли антиквариат дома или просто хочется поучиться играть. Как вариант, можно найти уже отреставрированные спецами инструменты где-то от 5 тыс. и выше с некоторой гарантией, что ремонт не встанет дороже перевозки и настройки.

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

Жаль также, что в России практически прекратили производство пианино и роялей несколько лет назад. Загнулось всё достаточно быстро в 90х понятно почему, но затем в 00х попытались возродить дело и завод в Москве выпускал неплохие модели, но не смог выдержать конкуренции, в итоге современные пианино сейчас везут из Китая...

Чтобы не сочли за рекламу, ссылок никаких специально не даю. Сами найдёте в сети. Хотя если кому интересно, могу рекомендовать настройщика, меня его работа порадовала (пишите в почту).

/file/piano.jpg


FSF User Liberation

Why we need to reject proprietary software like DRM?


My choice of golang libs

This text will be updated when new libs found. It just my personal top of best libs for Go language for misc purposes. Where "best" causes defined by my personal tastes only.

Logging

Databases

Web

Referenced benchmarks:

  • https://github.com/julienschmidt/go-http-routing-benchmark
  • https://github.com/tyler-smith/golang-sql-benchmark


Use 432 Hz.


A little piece of sysadmin humor. Just execute it under root:

# cat "test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

Then read explanation of the regexp here.


Keyboard for Emacs layout research

Кратко, причины и цели:

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

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

Недели три как поменял себе шрифты в Emacs, сменив доставлявший меня последний десяток лет fixed 10x20 на Inconsolata. Три дня потом не мог спокойно кюшать программировать, начертанием буковок любовался. А на днях начал давно задуманное, сменил таки раскладку с QWERTY на более удобную. Ощущения поначалу странные, но то что оно удобнее пальцам ощутимо сходу. После обезьяньих прыжков с qwerty вероятно любая случайная раскладка будет удобней (разве что кроме TNWMLC). У меня это не первая попытка освоить альтернативу. Но прошлые разы не устраивали по тем или иным причинам. Осмысливая прошлые провалы я понял причины своего неприятия. Альтернативные раскладки стремятся быть лучшими во всём с претензией на оптимальность. Действительно, расположение рук и движения пальцев на них приятней, но вот отсутствие совместимости с привычными программами — для меня основная проблема перехода. Есть впрочем варианты, где это в некоторой степени учли — Colemak к примеру, оставив Ctl+XCV в привычных местах. Но я практически живу в GNU Emacs, где клавиши управления расположены совсем по-другому (к примеру для копирования-вставки это Alt+W, Ctl+Y). Биндинги Emacs это ведь, тяжёлое наследие клавиатуры Symbolics, но на ней хотя бы в управляющих клавишах недостатка не было. Colemak же в этом плане никак не помогает, он заточен под Wordstar-стиль, принятый в продуктах под Windows и в этом думаю, причина моей неудачи с прошлой попыткой перехода. Поэтому подойдя к задаче с другой стороны, продумал раскладку, которая будет не столько улучшать параметры эргономики (на дефолтных клавиатурах это в принципе слабодостижимо), сколько улучшит параметры управления привычными себе программами. Без претензий на универсальность. Для меня основные програмы — это Emacs и шелл, последний также с раскладкой от Emacs. Дополнительно ещё парочка простых редакторов вроде godit, клонов Emacs. В качестве браузера всё чаще возращаюсь к Firefox, которым с плагином оказалось удобно управлять также через имаксовые биндинги. Короче, привык я к Emacs и решения предлагаемые Colemak и подобными «универсальными» раскладками мне только мешают. В собственной раскладке Colemacs (немного привычный уже Colemak был взят за основу) разместил клавиши управления курсором и наиболее частыми режимами в на мой взгляд удобных местах. Управление курсором, расположенное в QWERTY на разных руках, перенёс под левую руку (AEPNBF теперь удобно управляются одной рукой при зажатой правой рукой управляющей клавише Ctl/Alt). Частые клавиши сохранения и переключения режимов XCS вынесены под правую руку. Популярность команд редактирования Emacs бралась по исследованию http://ergoemacs.org/emacs/command-frequency.html. Заодно уменьшил нагрузку на правую руку, т.к. она отвлекается на мышку. Погоняв результаты подбора на симуляторе carpalx остался удовлетворён полученным. Цифры верхнего ряда ушли за Shift, по умолчанию нажимаются спецсимволы — решение не для всех применений, но в моём случае под программирование на си-подобных языках так удобнее. А длинные комбинации чисел можно набирать на доп. клавиатуре. Выбор параметров по определению субъективен, требуются уточнения и правду выявит только эксперимент на себе. Поэтому осталось это счастье освоить, чем я и занялся сразу же. Три дня ушло на подбор раскладки и базовое освоение в процессе. Клавиши уже все запомнил, но пока моторная память не срабатывает, приходится задумываться над каждым нажатием (помогает старый способ освоения — печать с закрытыми глазами). Расчитываю за месяц набрать исходную скорость набора. Конечно QWERTY никуда не денется, т.к. хоть иногда, но бывает нужно чего-нибудь набирать на чужих клавиатурах, но по прошлому опыту — знание трёх раскладок не проблема. Без задержек во времена перехода с дописишных компьютеров на PC переключался между JCUKEN/QWERTY/ЙЦУКЕН.

keyboard image

Исследования по клавиатуре с настройками для X Window выложены на github, но это начало. Полагаю, понадобится не менее года на финальную выверку раскладки. После чего можно предлагать её знакомым емаксоидам. В планах: уточнение модели использования клавиатуры человеком, т.к. методики предлагаемые carpalx и прочими выглядят неполными. Также любопытно опробовать клавиатуры, где вопросы эргономики решены «аппаратно», сменой их расположения в пространстве и изменением формы, а не простым ремапом (я про Maltron, ErgoDox, Catboard, DataHand и подобные радикальные варианты).

В тему:

  • http://colemak.com/Alternative_layouts
  • http://mkweb.bcgsc.ca/carpalx/?
  • http://ergoemacs.org/emacs/emacs_best_keyboard.html
  • http://ergoemacs.org/emacs/ergonomic_emacs_keybinding.html
  • http://dacap.com.ar/programming/keyboard-layout/

Напоследок простой хинт по оптимзации раскладки, если всё выше показалось слишком мудрёным путём. Сделай ремап CapsLockBackspace. Это очень разгрузит правый мизинец, на клавиатурах сильно нагруженный длинным переходом вправо-верх за клавишей удаления (btw в шелле есть удобная привязка Ctl+H для этой цели, но кроме шелла есть другие программы). Кстати, этот совет предлагают Colemak и Normann. Только помни, начав с ремапа одной клавиши, ты уже не сможешь остановиться :)

Дополнение. Сюда же в тему ссылки на используемые мной утилиты для ремапа клавиш:

  • https://github.com/r0adrunner/Space2Ctrl – эта штука позволяет замапить Ctrl на пробел, так что по нажатию Space+Key получаем аналог нажатия Ctrl+Key, а сам пробел per se срабатывает по отжатию, если не была нажата другая клавиша. Не совсем удобно, но это пока лучшее, что удалось найти по теме.
  • https://github.com/grafov/shift-shift – вот этот костыль я использую для переключения рус/лат по нажатию Shift. LShift это всегда латинская раскладка, RShift – всегда русская. Для переключения регистра букв любой из Shift срабатывает, когда он нажат в сочетании с буквенной клавишей. Это позволяет не смотреть на всякие индикаторы, т.к. проще лишний раз ткнуть правильный Shift для гарантированного включения раскладки, через время становится привычкой и уменьшает число ошибок в наборе. Автодетектилки раскладки стали после этого не нужны.

Дополнение №2. Нашёл настраиваемую утилиту для использования модификаторов как одиночных клавиш: https://github.com/alols/xcape/, заменил ею space2ctl.


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

—Аукцыон, Бобэоби.


Утилиты для работы с вебсокетами

Понадобилась отладка клиент-сервера с вебсокетами на Go. Под вебсокеты в Go имеются две библиотеки:

Традиционных утилит под отладку HTTP здесь недостаточно, с вебсокетами по сути мы работаем с другим протоколом, HTTP используется только для инициализации соединения. Поюзав разные онлайновые сервисы, сделал для локальной отладки пару простых утилит — клиент и сервер. Клиент позволяет отправлять произвольные тексты на сервер (text messages в протоколе вебсокетов), сервер работает в режиме «эхо», отфутболивая запросы обратно клиенту. Плюс клиент и сервер обмениваются пингами, как того желают реализации вебсокетных приложений. Логи разной степени подробности валятся на экран, по идее этого достаточно. Глубокого анализа и вывода дампов утилиты принципиально не предполагают, т.к. для этого есть готовые средства — я использую для таких целей Wireshark. Код утилит небольшой, при необходимости, полагаю, несложно будет адаптировать их под другие задачи. Код на гитхабе под GPL.

Готовые бинарники можно скачать отсюда:

Для самостоятельной пересборки понадобится go-окружение и установка нескольких доп. пакетов:

 go get github.com/gorilla/websocket
 go get github.com/kdar/factorlog
 go get github.com/peterh/liner
  • websocket — библиотека из фреймворка Gorilla, я к ней как-то больше привык, ещё со времён черновых версий протокола, до принятия RFC4655.
  • factorlog — мой любимый логгер, с цветатым выводом
  • liner — удобная либа для реализации интерактивных CLI

Сам набор утилит можно забрать с гитхаба:

 git clone http://github.com/grafov/websocket-utils

Сервер по умолчанию слушает на порту 48084 локального интерфейса, с помощью параметра -listen это можно исправить. Клиенту указываем куда коннектиться с помощью -bind. Для более подробного вывода происходящих событий параметры -verb и -debug.

Клиент позволяет отправлять на сервер содержимое файлов:

  < sample-file.json

Или результат исполнения внешних команд:

  ! ls *.txt

Сервер и клиент поддерживают работу как друг с другом, так и с любыми валидными реализациями вебсокетов. Например:

 wsclient -bind=echo.websocket.org

Этот материал на google+.


Ideal text processing environment architecture

Text editor is my main tool in interaction with computer (beside shell) and I tried many of them — from classic Vi and modern Acme to overbloated Eclipse and hipster Sublime. Long time I use GNU Emacs and mostly satisfied with it. But I want more :) I think central problem of Emacs is it conservative way for output — it tries to use text only interface where possible and where not (though Emacs allows and use graphics output actively too). I think ideal text processing must use supplementary graphics tools for many purposes — wysivyg texts output, show infographic, represent program control structures and so on.

Just my some thoughts about ideal text processing architecture (so I included text editing in more general area of «text processing»):

  1. Text processing split between user interaction layer, core text processor and i/o layer.
  2. I/O layer consists of drivers for external sources (like network filesystems, clouds etc.) and local
  3. Core with text editor API must works as daemon under neutral user account (like nobody). Daemon mode allow to restart application rarely.
  4. External applications used for presentation like browser for HTML/JS apps, editors (emacs, vi etc.) for text editing, image viewers and so on.
  5. Core scripted with some domain specific language based on Forth or Lisp.

Interaction between layers:

  1. Client-server architecture where presentation layer is client and core text processor is server.
  2. Core and i/o layer use TCP.
  3. Core offers REST HTTP/JSON and Websockets API for external programs.
  4. Core use X protocol to run programs from presentation layer (under end user accounts).

Top level arch view:

Top level arch view


Библиотека для броадкастов через каналы в go

С каналами в Go можно делать много разных забавных вещей, но вот броадкасты из коробки на них не получишь. Поискав по интернету сделал пакет для броадкаста любых данных (interface{}) через каналы. Откуда-нибудь (логично из другой горутины, иначе зачем весь огород) приконнекчиваемся к broadcast-группе, общение идёт через два канала — на приём и передачу. На приём канал у каждого участника группы свой, на передачу — общий для всех. Диспетчер разруливает полученные сообщения и переправляет их остальным участникам. Посмотрел более эстетские варианты, где сообщения передаются по цепочке от участника участнику, попробовал свою реализацию в таком стиле — сложновато выходит по структурам данных, хотя идея красивая. В итоге реализовал простую схему с диспетчером.

http://github.com/grafov/bcast/

BTW, для случая когда надо уведомить остальные горутины о завершении к.-л. процесса удобно использовать close() — http://nf.wh3rd.net/10things/#11, но для постоянного обмена сообщениями этот способ не катит.

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

group := bcast.NewGroup() // create broadcast group
go bcast.Broadcasting(0) // accepts messages and broadcast it to all members

Можно слушать броадкасты ограниченное время (параметр длительности передаётся в Broadcasting) убедился что бывает нужно и чем городить известный паттерн с таймаутом на каналах, встроил его в слушатель:

bcast.Broadcasting(2 * time.Minute) // if message not arrived during 2 min. function exits

Теперь можно соединяться из разных там горутин:

member1 := group.Join() // joined member1 from one routine
defer member1.Close() // optional close
member1.Send("test message") // broadcast message

Метод bcast.Send принимает тип interface{} поэтому можно передавать что угодно:

member1.Send(group) // передадим сам объект группы броадкастов, не уж знаю зачем

Коннектимся откуда-нибудь ещё:

member2 := group.Join() // joined member2 form another routine
val := member1.Recv() // broadcasted value received

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

val := <-*member1.In // each member keeps pointer to its own input channel


# killall --regexp .*


I, pet goat II

A story about...


Simple HTTP-proxy in Go language

Just an simple example of Go code for HTTP reverse proxy. With usage of Go standard library the code is really short:

package main

import (
     "flag"
     "net/http"
     "net/http/httputil"
     "net/url"
     "time"
     "log"
)

func main() {
     var src, dst string
     flag.Parse()
     args := flag.Args()
     if len(args) >= 1 {
             dst = args[0]
     } else {
             dst = "127.0.0.1:8080"
     }
     if len(args) == 2 {
             src = args[1]
     } else {
             src = ":80"
     }
     u, e := url.Parse(dst)
     if e != nil {
             log.Fatal("Bad destination.")
     }
     h := httputil.NewSingleHostReverseProxy(u)
     s := &http.Server{
             Addr:           src,
             Handler:        h,
             ReadTimeout:    10 * time.Second,
             WriteTimeout:   10 * time.Second,
             MaxHeaderBytes: 1 << 20,
 }
 log.Fatal(s.ListenAndServe())
 }

Usage:

./revproxy dst src


Проплывают облака, это жизнь проплывает, проходит,

привыкай, привыкай, это смерть мы в себе несем,

среди черных ветвей облака с голосами, с любовью…

Проплывают облака…

—И.Бродский


Отправка чего-нибудь куда-нибудь из Emacs по TCP

Короткий рецепт отправки содержимого текущего буфера по TCP. Отправляет весь текст буфера, затем открывает отдельный фрейм в нижней половине экрана, куда возвращает результат. Бинарные данные гонять не особо будет удобно, а вот для тестирования текстовых протоколов вроде HTTP самое оно. За основу взял примеры кода с EmacsWiki. Мне такая функция понадобилась для отправки запросов на сайт и просмотра результатов вместе с HTTP-заголовками, обернул её только для интерактивного вызова. Получился простой такой редактор HTTP, а больше и не требовалось.

Если нужен полноценный tcp-клиент, то вот тут есть: http://www.emacswiki.org/emacs/tcp-client.el/

UPD В более завершённом для тестирования HTTP виде для Emacs нашелся такой код: https://github.com/hassy/http-twiddle/.


Разметка диска с XFS и LVM

Данную схему применяю как на серверах, так и на десктопах, кроме разве нетбуков. Организация ФС в юниксе удобна сама по себе с её схемой включения файловых систем в общее дерево директорий. По сравнению drive letters куда меньше мороки. LVM добавляет ещё больше удобств устраняя привязку размеров разделов к размеру диска: добавляем в LVM ещё один диск и создаём себе разделы («тома» по LVM-ному), не заботясь о том насколько они совпадают с размерами физических дисков — часть раздела LVM может разместить на одном диске, часть на другом.

Даже при одном диске в компьютере LVM удобен, так как упрощает управление разделами. При установке ОС сложно бывает предвидеть, какая ФС сколько потребует места и размечая диск на разделы нетрудно промахнуться в расчете, удалять и объединять разделы позже — муторная операция. С LVM можно создавать разделы и не думать, какой из них с каким граничит. Когда в разделе больше нет надобности или требуется его увеличить, или уменьшить для освобождения места, то LVM позволит это легко сделать.

Если говорить о ресайзе (изменении размера) разделов LVM, то очевидно, что на разделе размещена какая-нибудь файловая система и она также должна поддерживать ресайз, желательно с минимумом сложностей. Когда я впервые разбирался с LVM и выбирал подходящую для ресайза ФС остановился на XFS. Критерием выбора была её возможность ресайза без отмонтирования, на живой системе, на которую например в это время может вестись запись файлов. На то время это была единственная ФС с такой возможностью. С выходом 2.6.(не помню какой минорной версии) такую же функцию добавили в extfs, но я уже привык к xfs и серверах использую именно её в паре с LVM, на десктопе LVM+ext4 (хотя и xfs тоже, так как ресайз в ней очень быстрая операция). Особенно удобен ресайз без отмонтирования на серверах, когда нужно срочно добавить место на ФС не останавливая работу использующих её программ, например срочно увеличить раздел под базу данных. Можно даже увеличить раздел рутового раздела, без перезапуска сервера и всяких ухищрений с загрузкой LiveCD и пр.

В ресайзе xfs есть ограничение: можно увеличить размер, но нельзя его уменьшить. Размер может только расти. Поначалу это меня напрягало, но потом заметил, что надобность в уменьшении разделов возникает очень редко. Особенно, если при установке системы выделять места по минимуму, оставляя свободный пул блоков в LVM незадействованным. А потом по мере надобности, смотря какая ФС быстрее отъедает место — увеличивать её. Удаление требовалось только в одном случае: свободное место в LVM исчерпано, а добавить его к какой-то ФС понадобилось. Но как ни странно, такая ситуация возникает реже, чем можно предположить, во всяком случае на серверах под вебпроекты, с которыми я в основном имел дело. А вот на десктопе эту проблему теперь решает ext4, с ресайзом в обе стороны. В принципе и на сервере ext4 ничего не мешает использовать, но у меня к XFS личные предпочтения ввиду других её интересных фич, о которых как-нибудь позже под настроение.

Хочется подробностей? Вот тут доходчиво про работу LVM: http://xgu.ru/wiki/LVM, а про ресайз назову только магические слова xfs_growfs и resize2fs. Гугл в помощь.


Идея: Galaxy Note как графический планшет

На маркете туча программ для использования телефона в качестве [очень неудобного] тачпада. А вот любопытно, кто-нибудь пробовал адаптировать Galaxy Note как планшет для рисования? Стилус не самый плохой, реагирует на силу нажатий, плюс мультитач. Размер конечно маловат для планшета (5,4"), но это сравнимо с младшими моделями Wacom Bamboo — 6.8". Задержки 150-200ms через Wifi или Bluetooth по-моему приемлемы, тот же Wacom к слову делал блютусные планшеты. Конечно, в результате из хорошего смартфона можно получить планшет для рисования весьма низкобюджетных характеристик, да и готовый Wacom-овский планшет у жены вон валяется, но очень уж с технологической точки интересно. Поиск проекта реализующего такое по маркету ничего не дал, в интернете тоже…


HULK DoS tool ported to Go

I just ported HULK DoS tool to Go language. Go source code a little shorter due to simplify the thread flow control — goroutines and channels provide a compact and expressive code, as the whole net/http package.

In the process of porting was found that keep-alive in the Python version is not supported. This is noted in "HULK vs. THOR - Application DoS Smackdown"" and confirmed in discussions at Stackoverflow — so1, so2, so3. Seems like it need use alternative for urllib2. In the golang version of net/http there is not such problem with keep-alive and if the server supports persistent connections and returns a Connection: keep-alive, then the request is repeated in an already created client.

Also in the "HULK vs. THOR" noted about strictly defined order of the request headers in urllib2, which is used to create the rule for ModSecurity. Golang package net/http uses sorting for headers by their names. So Golang version also writes headers in strictly defined order. Therefore GoHULK easily blocked by the same rule as described in the article but with a different order of header fields:

SecRule REQUEST_HEADERS_NAMES ".*" "id:'11',chain,phase:1,t:none,log,drop,msg:'Request Header Ordering Alert: Potential Attack Tool - GoHULK DoS.',setvar:'tx.header_order2=%{tx.header_order2}, %{matched_var}'"
SecRule TX:HEADER_ORDER2 "@streq , Host, User-Agent, Accept-Charset, Cache-Control, Connection, Keep-Alive, Referer, Accept-Encoding""

Sources: http://github.com/grafov/hulk (for reference I placed original hulk.py in the repository).

Sample syntax:

$ GOMAXPROCS=4 HULKMAXPROCS=4096 hulk -site http://example.com/example.php 2>/tmp/errlog

To interrupt execution use <kbd>Ctl</kbd>+<kbd>C</kbd>.

Resume. HULK is a DoS toy, easily blocked if need and I not understand why so much noise around this utility. But Python and Go code may be useful for learning purposes and it's my point of view to this thing. Though you may slow down badly configured webserver or site with this toy (I overload Drupal7 + boost cache on dedicated server as boost under hulk recreate caches for each new unique GET-param and filled up cache directory with bunch of useless files), so use it wisely.

Note: hulk.py was writen by Barry Shteiman. I'm not related to this code. I just placed its code for a reference in my repo when ported Barry's tool from Python.

Update: it seems like utility still used by other people and either included into BlackArch Linux distro. So I updated code a bit.


Hulk utility on Ubuntu threads error

Day ago I tried HULK DoS tool on a server at my work. Hulk can't run on my netbook with Ubuntu Precise and failed with exception (python 2.7):
-- HULK Attack Started --
Traceback (most recent call last):
  File "Downloads/hulk.py", line 153, in 
    t.start()
  File "/usr/lib/python2.7/threading.py", line 494, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread
To fix it you will need increase stack size limit in the shell: # ulimit -s unlimited Initially it was: $ ulimit -s 8192 BTW, server wins a battle vs hulk.


Одним нажатием меньше: эргономика в slock

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

На днях обнаружил, что в новой версии проблему уведомления о вводе изящно решили, без задействования специальных индикаторов — при нажатии клавиши экран меняет цвет на лиловый, при отмене ввода — возвращается к чёрному. Nice, то что нужно. Но таки не удержался и форкнул их репозиторий на github; внёс минимальное изменение — убрал необходимость <kbd>Enter</kbd> после ввода пароля. А действительно, зачем он там? Лишнее нажатие раздражает.

А в этой версии не раздражает: https://github.com/grafov/slock :)

/file/black-screen.png

На иллюстрации выше — чудесный скринсейвер slock в работе.


Как отыскать того, кто всегда со мной,

как отличить от бесчисленных двойников,

если его тень - за моей спиной,

если его свет - из моих зрачков?

Без оглядки - лопатки, пятки - за ним бежать,

мимо стражи скользить сновидением, не дыша...

Дщери иерусалимские, как дышать,

если его тело - моя душа?

—Вера Павлова


Мои доклады на Drupal Camp Kyiv 2009

А вроде и не так давно это было… Местами ещё актуально, хотя байтов с той поры много утекло. Видео и презенташка. Второй мой доклад в съёмку тогда не попал, а слайды без пояснений бестолковы.

Read more…


ॐ तारे तुत्तारे तुरे स्व


  • Shares:

Share