среда, 1 мая 2013 г.

Mojolicious и зависимости на mojo::*

Решая задачу по построению статического сайта я выбрал wget и mojo.

Отличный шаблонизатор, простота роутов, все радует.

Но, о том что "просто работает" писать скучно - мы этого просто не замечаем.

Напишу о неприятностях.

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

Ну для простеньких вещей типа
<%= l Contacts %>
Выведет "Контакты" и "Contacts" в зависимости от роута и/или url.

Задача простая, но велосипедов лучше не плодить, заглянул в CPAN.

Конечно же, там нужный модуль уже есть: Mojolicious-Plugin-I18N, ну кто б сомневался. Судя по описанию - то что нужно. Дата свежая. Отлично. Рабочего кода - 300 строчек вместе с документацией. Будем подключать.

Пару слов как выглядит мой проект.

Это взятый с github mojolicious , ну просто git clone ....
и сунутый туда подмодулем мое приложение git submodule add ....

Идеальное работающая вещь. Как ее разворачивать на других серверах?

git clone, git submodule update, раз и работает.

Метод это мне очень нравится, он много кем используется, ну например symfony.
Я использую такой же метод для vimfiles, когда .vim лежит в git и субмодулями прикручены всевозможные модули.

Обновление, разворачивание, централизованное управление через puppet, все эти задачи выполняются на раз. Легко и приятно.

Ок, пробую проецировать этот метод, на модуль mojo..-i18n. Ответим на вопрос, куда в дерево каталогов его нужно импортировать.

Ответ: эээ, ааа, мммм.....

Да никуда. В таком виде, его не подключить.

Связываюсь с автором, спрашиваю, он предлагает варианты
а) ставить через cpan
б) писать Makefile.pm
в) использовать carton (некая реинкарнация bundler)

Т.е. убить легкий деплой, получить проблемы с контролем совместимости версий,  вводить новые (абсолютно ненужные)  сущности.
И все ради чего? 200 строк кода?

А если таких модулей нужно будет 20 штук?

Для этой задачи обошелся собственным кодом в 50 строчек.

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

Идеал - добится такого же легкого подключения как bundle в symfony .
git submodule add ...
echo "use mymodule" >> site.pm

Иначе, смысл перла без cpan? Переизобретать колесо?

Рад буду, советам, комментариям, размышлениям.


UPD:
Благодаря комменту Viacheslav Tykhanovskyi, решение найдено.

mkdir -p contrib
git submodule add git://github.com/sharifulin/mojolicious-plugin-i18n.git contrib/mojolicious-plugin-i18n

Добавляем в script/myapp
unshift @INC, "$_" for glob "$FindBin::Bin/../contrib/*/lib";
и в lib/myapp.pm
  $self->plugin('Mojolicious::Plugin::I18N');

Чтож, получилось неплохо.

Static site generator - wget

Захотелось тут сделать простенький сайт, static html.

Но, уже после первой страницы, даже не смотря на zencoding-vim я заскучал.
Хочется же общего шаблона, сквозных автоматических ссылок, словаря локализации, и такого прочего.

А что если понадобится внести изменение в заголовок? Править 20 файлов?

Нет уж.

Все таки нужен пусть простенький, но generator.

Изучив существующие проекты, я, признаться, расстроился.
Конечно, их авторы решали свои задачи, и это нормально.
Но ставить стопицот велосипедов для генерации одной html страницы, ну перебор же.
Зачем питонеры и рубисты все переизобретают, я не понимаю.
Зачем им свой make, зачем им свой apt?

Мягко говоря - не проникся я.

Но, на интересную мысль меня они натолкнули.

Ведь static site generator у нас уже есть, с 1996 года.

Конечно же, это wget ;)

Т.е. строим свой сайт с своим любым инструментом/фреймворком/шаблонизатором, и скармливая его wget-у, получаем на выходе нужные странички.






пятница, 26 октября 2012 г.

Freeradius + mpd без проверки реквизитов.

Возникла смешная задача.
Есть серверы с mpd5 терминирующие pppoe , они за авторизацией обращаются к радиусу, встроенному в биллинг.

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

Но возникла задача по обслуживанию машины с биллингом. Нужно останавливать.

Идея - на время работ с "боевым" радиусом. Поднять freeradius рядом, который бы на любую связку login/pass давал ACCEPT и какое нить среднее ограничение скорости. На время работ.

Добавляем dictionary.mpd


VENDOR  mpd 12341                                                                                                
                                                                                                                 
BEGIN-VENDOR    mpd                                                                                              
                                                                                                                 
ATTRIBUTE   mpd-rule     1  string                                                                              
ATTRIBUTE   mpd-pipe     2  string                                                                              

ATTRIBUTE   mpd-queue    3  string                                                                              
ATTRIBUTE   mpd-table    4  string                                                                              

ATTRIBUTE   mpd-table-static    5   string                                                                      

ATTRIBUTE   mpd-filter   6  string                                                                              

ATTRIBUTE   mpd-limit    7  string                                                                              
ATTRIBUTE   mpd-input-octets    8   string                                                                      

ATTRIBUTE   mpd-input-packets   9   string                                                                      
ATTRIBUTE   mpd-output-octets   10  string                                                                      

ATTRIBUTE   mpd-output-packets  11  string                                                                      
ATTRIBUTE   mpd-link     12 string                                                                              
ATTRIBUTE   mpd-bundle   13 string                                                                              

ATTRIBUTE   mpd-iface    14 string                                                                              

ATTRIBUTE   mpd-iface-index 15  integer                                                                        

ATTRIBUTE   mpd-input-acct  16  string                                                                          

ATTRIBUTE   mpd-output-acct 17  string                                                                          
ATTRIBUTE   mpd-drop-user    154    integer                                                                      
                                                                                                                 
END-VENDOR mpd

Вписываем его в dictionary
 $INCLUDE dictionary.mpd
Правим raddb/users:
 DEFAULT Auth-Type := Accept
     mpd-limit = "out#1=all shape 10240000 pass ",
     mpd-limit += "in#1=all rate-limit 2048000 pass",
     Framed-Pool = "local",

В mpd.conf:
    set link enable pap                                                                                          
    set link no chap-md5                                                                                        
    set link no chap chap-msv1 chap-msv2  

chap запрещаем, ибо оно от радиуса хочет всякие там  MS-CHAP2-Success и прочую ерунду.

Теперь можно логиниться с любым паролем и именем пользователя.

Можно  было б не использовать радиус вообще, просто запретить авторизацию на mpd , но не ясно как тогда выставить лимиты.


среда, 29 августа 2012 г.

Снова проблемы mysql slave

Периодично, каждый месяц, репликация mysql застревает по непонятной причине.

Last_Error: Could not parse relay log event entry. The possible reasons are: the master’s binary log is corrupted (you can check this by running ‘mysqlbinlog’ on the binary log), the slave’s relay log is corrupted (you can check this by running ‘mysqlbinlog’ on the relay log), a network problem, or a bug in the master’s or slave’s MySQL code. If you want to check the master’s binary log or slave’s relay log, you will be able to know their names by issuing ‘SHOW SLAVE STATUS’ on this slave.

Все возможные эмоции по поводу mysql master-slave репликации , я уже испытал давно, теперь это просто рутина. Уже даже не раздражает.

Вот к примеру, вопрос о репликации оставшийся без ответа:
Вопросик на serverfault.com

Раньше я всегда разворачивал на слайве бекап из mysqldump и запускал репликацию по новой.

И вдруг сегодня внезапно решил попробовать запустить тупо ее заново с того же места не пересоздавая.

stop slave
сhange master to master_log_file=Relay_Master_Log_File,master_log_pos=Exec_Master_Log_Pos
start slave

бгг, и оно тупо работает. Мде.


вторник, 14 августа 2012 г.

Youtube и типа контекстная реклама

Попробовал посмотреть вчера с youtube подборку мелких роликов.
Плейлист штук на 200, все короткие на пару минут.

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

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

И второе, я уверен гугл знает про меня все. Иногда я заказываю сводки по своим действиям в гуглоаакунте, и то что мне присылают в отчете: поисковые запросы, +1, круги, письма и прочее, достаточно что бы узнать про меня больше чем могут знать школьные друзья.
Меня это беспокоит, но слабо. Как то привык  уже.

И внезапно, вся реклама с ютуба все 200 рекламных роликов были про ежедневные прокладки и какой то женский шампунь. На месте рекламодателей, я б мягко говоря расстроился. 200 показов "мимо".
У них нечего мне показать? Они меня спутали с кем то? Нет никакого контекста?
Тупые производители прокладок оплатили столько показов что приходится показывать всем?

Какой ответ верный?

вторник, 31 июля 2012 г.

Легкий sqlite и тяжелый postgres

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

CREATE TABLE t007 (filename text,txn text,sum int,orderid int);
CREATE INDEX f_007 on t007(filename);
CREATE INDEX t007_txn on t007(txn);


Ну и полный список используемых запросов:
select max(filename)
update  set ... where txn=?
insert into ... (filename,txn,sum) values (?,?,?)
select ... from  where orderid is null

Стоял выбор, что использовать для такого примитива? Я сходу выбрал sqllite , что б не морочится с СУБД.

Через месяцок мне надоела нагрузка на i/o (что оно вообще делает то с диском, непостижимо), и я поставил postgre и перенес этот примитив туда.  Благо perl и dbi.

Бгг. Результат впечатляет.  sqlite такой lite. Только держись.

Первый и видимо последний опыт с ним.

воскресенье, 12 февраля 2012 г.

Прощай brz


Удаляется пакет bzrtools ...
(Чтение базы данных ... на данный момент установлен 314181 файл и каталог.)
Удаляется пакет bzr ...
Вычищаются файлы настройки пакета bzr ..

Прощай bzr , навсегда запомню тебя как открывшего для меня DCVS
Но сейчас, нет ни одной задачи, которую бы git не выполнил лучше.

Последний проект из bzr конвертировал.

четверг, 2 февраля 2012 г.

Twitter bootstrap2 & css frameworks

Совсем недавно писал про
Абырвалг: less.js & css frameworks : меньше боли с css

где не рекомендовал twitter bootstrap , как недоделанный.

И тут внезапно на днях обнаружил что они выпустили bootstrap2.

Поковырялся с ним, и могу сказать, что это же большие разницы.

Теперь уже не хочется и смотреть на всяческие elastic и прочее.

В общем - рекомендую!


И заодно, что б два раза не вставать, рекомендую - Simpliste максимально простой css framework для несколько-страничных-сайтов.



среда, 1 февраля 2012 г.

Выборы, выборы... есть ли смысл быть наблюдателем?

В сети много спекуляций на тему:

  • стоит ли участвовать в выборах президента, 
  • стоит ли быть наблюдателем 
  • и прочее прочее.

Я считаю, дело стоящее.

Да, выборы безальтернативны.

Да, лучше что б выбрали Путина из имеющегося зоопарка.
Господам рэволлюционерам прошу не беспокоится, на данный момент мне все равно ПОЧЕМУ нет альтернативы, факт в том что ее нет.

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

К тому же время сейчас шоколадное.
Столько взбередивших рэволлюционеров, столько желающих ходить строем на митинги и кричать там про миллионы младенцев которых Путин ест на завтрак.
Если каждый десятый пойдет наблюдателем - мы получим прозрачные честные выборы. Мечту этих самых активных...

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

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

  • "А пойду голос за жирика отдам, пусть он всей стране покажет кузькину мать"
  • "Нам на работе сказали он за народ, пойдем за него"
и в таком духе, просто зашкаливает. 
Мне реально страшно, что будет если им действительно дать чего то выбирать. 
Им наплевать на себя, лишь бы соседу не сладко было.

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

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


Массовый рестарт сессий mpd

Биллинг у меня, по непонятной причине, перестал рвать соединения клиентов в 00-00 первого числа каждого месяца.
Странно, но привычно. То одно отпадет то другое. Везет мне с биллингами всю мою жизнь.

Помня что перезапуск процесса mpd бывает приводит к зависшим netgraph нодам -  что как то не аккуратненько, захотелось тупо сделать close на каждую сессию.

За пару минут вот такой вот скриптик перла родился:

use Net::Telnet ();      
                                                                                                                                                                                                                  my $t = new Net::Telnet(Host => $hostname,                                                                               
        Port => $port,                                                                                                   
        Binmode => '\015\012',                                                                                           
        Prompt => '/\[.*\]/',                                                                                            
        Timeout => 10);                                                                                                  
$t->login($login, $pass);                                        
foreach($t->cmd("show sessions"){                                                                                                         
    my @attr=split /\s/;                                                                                                 
    my $iface=$attr[0];                                                                                                  
    $t->cmd("iface ". $iface);                                                                                           
    $t->cmd("close");                                                                                                    
    print "$iface closed \n";                                                                                            
}              

Тупо, но просто.
                                                                                                         
    

пятница, 27 января 2012 г.

Vundle для vim

Сколько помню, всегда у меня в vim была строка статуса, такая:
т.е. самая обычная.

Захотелось чего нибудь нового, натолкнулся на такой проект: https://github.com/Lokaltog/vim-powerline.

С него косвенно попал на https://github.com/gmarik/vundle

Ёпрст, какая прекрасная идея этих vundle.
При всех плюсах вима, ущербная система плагинов утомляла всегда.

За две секунды сделал powerline


И теперь, с vundle , совершенно без проблем можно поизучать всю огромную кучу плагинов с github. Ура!




четверг, 26 января 2012 г.

Skype: чем заменить?

Побаловался скайпом на андроиде.
На удивление работает даже на gprs сетях.
Не ожидал.

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

Но у скайпа есть несколько минусов, которые я вряд ли переживу:

  1. Закрытый протокол
  2. Хозяин - корпорация зла
  3. Нет прозрачной интеграции с xmpp/asterisk и тд. В 21 то веке.
Какие альтернативы посоветуете?

среда, 25 января 2012 г.

Доменные имена - каков прогноз?

С момента как firefox и google chrome совместили строку поиска и адресную строку, я задумался, какое будущее у доменных имен?

Что в прошлом доменное имя было очень важно,  думаю не стоит и рассказывать.
Целый бизнес - киберсквоттеры - получили не один бутерброд с икрой.
Даже относительно крупные игроки типа nic.ru, устраивали смешные втюхивания своих доменов .рф, да и неплохо зарабатывают на аукционах.

А сейчас? Куда движемся?
Несколько фактов:

  1. Раньше домохозяйка введя в адресную строку "коржик как испечь" получала непонятную для нее ошибку, и срочно звонила знакомым с вопросом "как быть". Долгими годами приучалась ввести сначала гугл или яндекс. Теперь это в прошлом, не знаю ни одного браузера который будет тупить. Разве что опера (ничего про нее не знаю, но испытываю "теплые" чувства по прошлому опыту, так что могу допустить)
  2. В логах и инструментах гугла для вебмастеров, на своих сайтах я все больше вижу входов пользователей с поисковых запросов где имя домена набрано кириллицей например, или еще какими то ошибками. И однако эти люди же попадают куда нужно.
  3. Обратите внимания на монстров, большие корпорации, мне кажется что они все меньше и меньше парятся за доменные имена. Они большие, неудобные и запомнить их невозможно. Любой кулхацкер и сео Вася, убил бы своего клиента за такой домен.
  4. Обратите внимание с какой скоростью появляются новые доменные имена первого уровня. Время когда их можно было перечислить давно позади. По сути, инфляции уникальности такова, что я думаю скоро мы позабудем про региональные домены типа ru. Любой желающий сможет получить трехбуквенный типа n.il или t.co
Я для шуточного эксперимента попробовал кое какие свои сайтики продублировать на поддоменах с именами типа ajsdjasjdajjsadsaaswq.my-site.ru , выждал время когда все проиндексируется гуглами и прочим. Сделал редиректы. Спустя месяц - трафик вернулся.
Либо люди сделали закладки (сомнительно) либо они и не ходили с адресной строки.
Я для себя выводы сделал. Думаю популярность и важность доменов мы пережили.
Киберсквоттерам горячий привет,и пожелание найти себя на ниве сельского хозяйства.

вторник, 24 января 2012 г.

Их нравы: Частная лавочка

Во время песен и плясок вокруг ТСЖ обратил внимания на интересный факт.

Как по вашему, можно быстро дискредитировать руководителя.
От какого ярлыка он уже не сможет отмыться?
Что смешает его с грязью , в глазах жильцов?

Для меня это было неожиданностью но ответ прост: нужно обвинить его что он из предприятия устроил "частную лавочку".

Всё, кровь в глазах, ненависть, ЧАСТНУЮ ЛАВОЧКУ!!!!!!!!
"Как он посмел."

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

Откуда это? не знаю.

Но размышления об этом феномене - как минимум интересны.

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

Поддерживай тут не поддерживай частное предпринимательство, ничего не изменится.
Всегда всем должен, не жди пощады случись чего.

Еще интересный факт, помню когда кризис в США только начинался, я где то читал, что жители какого то штата завалили патентные бюро и муниципалитеты - изобретениями и бизнес-планами. Получать патенты, и получать ссуды под бизнес.
Верите что такое у нас возможно?
Что б не идти на биржу безработных, что бы не требовать компенсаций, подачек, чего угодно, что б не требовать раскулачить сограждан, "поотнимать эти коттеджи наворованные", а вместо этого сидеть и рисовать план кафешки, ожидаемую прибыль, высчитывать число мест и искать поставщиков, можете такое представить хотя бы гипотетически?

понедельник, 23 января 2012 г.

Приключения: сбойнувший mysql backup с помощью master-slave


Есть у меня база mysql , среднего размера , гигов 20, досталась с биллингом.
Так как данные очень важные, вместо периодичных бекапов было настроено два slave для нее.
Пару раз в месяц заглядывал, как там , идет ли репликация, да и забыл со временем.

А сегодня внезапно на том сервере с базой, сразу два винта отчаянно забили в smartd , предупреждая о скорой смерти.

Заглянув в слейвы заметил там очень, очень давнюю ошибку:
 Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Ну, другими словами получилась ситуация. то ли мастер послал кривой binary log, толи по сети он испортился, но слейвы проиграть его не смогли, и застопорились на этой position.

Причем у одного из слейвов был настроен relay-log-space-limit, и в какой то момент он просто перестал получать новые логи.

Дальше начинается цирк с конями. Какие то данные из /var/db/mysql видимо не читаются совсем.
Поэтому сделать чистый mysqldump не получается. В какой то момент сервер начинает так тупить часами, что дождаться невозможно.

В итоге предстоит восстановить текущее состояние базы, из древней базы slave, застопоренной репликации и горы бинарных логов.
Тот слейв что не имел relay-log-space-limit, до сих пор получает их в актуальном режиме. Но не "проматывает" их в свою копию БД.

Погуглив, нашел вот такую инструкцию
http://voituk.kiev.ua/2009/09/17/mysql-slave-could-not-parse-relay-log-event-entry/

у меня ситуация очень похожа, за исключением мелких нюансов, но что б не морочить голову опишу целиком:

  1. Средствами файрвола запретил все конекты к master за исключением слейва, что б состояние базы не менялось и слейв догнал. Если у вас в базу никто интенсивно не пишет, вам вероятно это не надо. Но у меня пишет толпа клиентов, глазами не уследить за position в логе. Тормознул на пяток минут, подождал пока трафик на slave не упал.
  2. Остановил слейв. stop slave
  3. Сбросил логи на мастере,что б не высчитывать позицию в бинарном логе -  flush logs 
  4. Сбросил логи на слейве. flush logs 
  5. Обойдя ошибку, позицию которую знаю из show slave status , преобразовал бинарный лог в sql с помощью mysqlbinlog, и загрузил этот sql в базу с помощью mysql --force
  6. Затем написал простенький скриптик на перле который "развернул" и "загрузил" в базу все остальные бинарные логи, у меня их огромная толпа оказалась.
  7. Тормозим slave mysqld
  8. Подменяем файл relay-log.info вписывая туда последний не загруженный relay log
  9. Запускаем slave mysqld
  10. Устанавливаем позицию репликации , slave set master=... в новый master log
  11. Стартуем репликацию. start slave
Вроде бы обошлось , и получил базу на "текущий момент".
Можно выкидывать старые сбойнувшие винты, и делать замену.
Но осадочек конечно остался. Нельзя ли было вместо всего этого кошмарного геморроя предусмотреть slave skip to=... по relay логу.

воскресенье, 22 января 2012 г.

ТСЖ: хроники дурдома.

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

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

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

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

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


  • Наши люди категорически неспособны решать рабочие вопросы в безличном, рабочем порядке. Если кто либо, желая сделать лучше для всех, допустит ошибку - "бабы" сожрут его, никогда ни смогут понять что личных мотивов тут нет.Ну , например, если нанятая в подряд фирма выполнит свои работы с огрехами, то не уже не важно, исправит ли их председатель, накажет ли деньгами, или заставит доделать - он уже навсегда получил имидж - либо "сват его делал за откат", либо "бомжей каких то нанял", либо "специально навредить хотел". А отсюда прямое следствие - в выигрышном положении тот, кто никогда, ничего не делал и, не дай бог, и не собирается. Только популизм, только обещания.
  • Выше написал слово "бабы" - уверен это не вежливо, но я не могу себя заставить назвать ЭТО как либо иначе. Это просто жесть. Жестяная жесть из таких которых и  не ожидаешь. Две-три истерички способны в руины разнести любое благое начинание. Они невменяемы, громки, орут строго одновременно, логика их такова, что я не хочу даже представлять себе что там в голове творится у них. Заткнуть их невозможно ничем. Я не знаю помогли бы какие нить физические наказания типа кнута, или только отстрел,. но факт что без этого их не успокоить. Одно из двадцати общих собраний успевает обсудить случайный вопрос из повестки дня до возникновения истерики среди этого контингента. В остальные 19 собраний, нет даже и шанса.
  • Еще интересное гендерное наблюдение. Что может оправдать любого председателя, за любо промах перед лицом ""бабьего" коллектива? Да , запросто. Одна лишь фраза : "она же женщина , откуда ей знать". Все, все вопросы сняты. Вопрос если она ничего не знает что ей делать в председателях - кощунственный. Озвучь его и ты навсегда изгой, тебя не простят и за 50 лет. Отсюда второе следствие - председатель и члены правления должны не только заниматься популизмом но и обязательно быть женщинами, никогда ни занимавшимся вопросами экономики, благоустройства, строительства.
  • Оправдываясь за предыдущие два пункта отмечу, что полным полно и на собраниях, и в письменных воззваниях, бывает спокойных, здравомыслящих, понимающих и логичных женщин. Это действительно так, только они не делают никакой погоды.
  • В целом про уровень дискуссий.  Это очень, очень полезны урок, особенно юным демократам. Соберите жителей любого многоэтажного дома, попробуйте принять очевидную простую резолюцию, ну например "земля круглая", уверяю вас, вам понравится. Вероятно один единственный этот опыт расскажет вам больше про демократию чем все учебники вместе взятые. Ну и отсюда следствие, приоритет будет у того председателя, который избежит обсуждать любой конкретный вопрос. Что угодно: инопланетяне, йети, результаты ногомяча , будет в разы лучше для карьеры председателя чем например вопрос отопления.
  • Юристы. Зачем они и кому. Для судов? нет, вобщем то... Для судов может быть и тоже, но это вторично. Первичная их функция (в сознании жителей) такая, мы дескать тут все сразу много несем несем пурги, сами не можем понять ни себя, ни друг друга, никто ни кого. Нужно что б пришел юрист нас послушал и записал все в готовый проект, так что б мнение каждого учел. Т.е. некий такой волшебник, который из говна сделает конфетку. Найдет мысль там где ее нет. Откуда такое представление о юристах - понятия не имею. Расскажите , если кто то знает.
Продолжение следует.


простая db schema c помощью graphviz

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

Кому то возможно удобнее открыть что то типа Draw и наваять там.
Но я предпочитаю graphviz, по следующим причинам:

  1. Ненавижу мышиную возню. таскать эти квадратики , рисовать стрелочки, выравнивать руками.
  2. Предпочитаю plain text формат хранения , который хранится рядом с кодом в vcs, диффы которого понятны на взгляд. Где что добавили, когда. 
  3. Получить c помощью graphviz любой графический формат, хоть растровый , хоть векторный, вывести на печать - задачи тривиальные.
Короткий листинг, шпаргалка для себя, как делать такие простейшие схемы:


digraph G {
    graph [rankdir="LR"];
    node [fontsize = "14" style=bold];
    Customers [label="Customers | <CustomerID> CustomerID| email | ... " shape="record"];
    Orders [label="Orders | <OrderID> OrderID | <CustomerID> CustomerID|  Date | Amount | ... " shape="record"];
    OrderDetails [label="OrderDetails | <OrderID> OrderID | <pid> ProductID | Count | ... " shape="record"];
    Products [label="<tb> Products | <pid> ProductID | Name | Description | ... " shape="record"];
    Orders:CustomerID-> Customers:CustomerID;
    OrderDetails:OrderID-> Orders:OrderID;
    OrderDetails:pid-> Products:pid;
    label="DB Schema";
    fontsize="20";
}   
Результат: