Archive for July, 2012

Threaded tee

Saturday, July 21st, 2012

Понеже не намерих нещо такова (след малко търсене) преправих един стар source да прави нещо като unix-кото tee, но thread-нато и без да пише на stdout. Трябваше ми, за да мога да записвам изхода на dvgrab и едновременно с това да го пращам към vlc, което да го stream-ва навън.

Може да се свали от /progs/ttee-0.1.tgz. Има някакви остатъци от старата задачка вътре (която беше нещо такова, само че с четене от unix domain datagram socket и само един output, в mysql), ако някой много много много държи, може да си го качи някъде в github, само да каже да сипя вътре в архива, че е public domain като лиценз.
(а по някое време мисля да напиша подробно за как stream-ваме и записваме в initLab)

Update: Оправена версия – /progs/ttee-0.2.tgz, с нормален ring buffer и с малко git history вътре.
Update 2: Работеща версия – /progs/ttee-0.3.tgz, оправени няколко бъга, които водеха до загуба на данни.
(решението ми хрумна в 4:30 сутринта и вместо да спя, patch-вах)

2012-07-18 лекция “Дребен пример от разпределеното програмиране”

Wednesday, July 18th, 2012

Мина лекцията във вторник, има запис и може да си свалите пълния архив с презентацията и парчетата псевдокод.

Отделно ето я и самата презентация.

Става въпрос за тип задача, която не намерих в design patterns, и за която има различни парчета софтуер, които правят нещо подобно (rabbitmq, gearman). Основната причина да се пише от нулата, вместо да се ползва нещо готово е, че се интегрира много по-добре в съществуващата система и така е доста по-просто, отколкото да се добавя още някакво парче код.
(и е интересна задача :) ).
Имам в практиката си три реализации, като това, което показвам прилича най-вече на една от тях, система за encode-ване в няколко формата на видео. Имаме много сървъри, които се занимават с encode-ването (cli.*) и които си взимат задачи от централен диспечер (srv.*), който има някакъв вариант да пази persistent state (в моя случай – база данни). Задачите са индемпотентни, т.е. могат да бъдат изпълнени повече от един път, ако се наложи.

Езикът, който съм ползвал в примерите е в общи линии псевдокод, който прилича на смесица от perl и php. Странните неща в него са, че има мнoжествено връщане (т.е. конструкция от типа $a, $b = f()) и че respond в srv.* връща отговор на клиента и излиза, т.е. прилича малко на return. man pages описват семантиката на fork и wait.

Начален вариант на решението би бил с този диспечер и този клиент.

Първият проблем, който се вижда е, че ако сървърът не успее да свърши задачата, няма как да го съобщи на диспечера. Това лесно се коригира с добавяне още на един тип заявка към диспечера:
Версия 1: диспечер и diff от предишната версия, клиент и diff от предишната версия.

Вторият проблем е какво става, ако заявим, че искаме задача, диспечера ни я задели, но не получим отговора? Ако нямаме обработка на този случай, в такива ситуации ще се натрупват задачи, които се водят, че се обработват и реално никой не ги е взел. Решението, до което аз стигнах е да добавя на всеки сървър transaction id и при заделяне на задача диспечерът да отбелязва сървъра и transaction id. Ако клиентската част подаде заявка за нова задача и не получи отговор, трябва специално да подаде обратно заявка за “cancel”, за да сме сигурни, че неполучената задача е върната в pool-а на свободните задачи.
Версия 2: диспечер и diff от предишната версия, клиент и diff от предишната версия.

Третият проблем е рестартирането на някой от сървърите, които обработват задачи – например поради спрял ток. Когато той се стартира отново, според диспечера ще има няколко задачи, които той обработва и за които той не знае. Решението е просто – добавя се тип заявка, която се подава при рестарт и почиства работещите задачи за даден сървър.
Версия 3: диспечер и diff от предишната версия, клиент и diff от предишната версия.

Четвъртият проблем (който би трябвало да е един от първите) е колко често и кога да се опитваме да повторим заявка към сървъра. Всяка заявка, която може да подадем може да стигне, но може и да не стигне до сървъра, или ако стигне, нямаме гаранция, че ще получим отговор. Съответно трябва да добавим към srv_request() в клиентската част логика колко пъти и как да опитва – само веднъж, много пъти или безкрайно. Заявяването на задача трябва да се изпълнява точно един път, останалите неща – докато се получи отговор.
(от “много пъти” смисъл в повечето случаи няма и би трябвало да го махна от кода)
Друг проблем, който се вижда доста бързо е, че ни трябва нещо от типа на exponential backoff, за да разредим честотата на опити от страна на сървърите към диспечера. Това се прави, за да се избегне ситуация от която след restart изведнъж се изсипват твърде много заявки в/у диспечера и има шанс да го претоварят. Същото нещо може да се види и в доста мрежови протоколи, например TCP.
Версия 4: клиент и diff от предишната версия.

Петият проблем е да ограничим колко товарим себе си (и донякъде сървъра), като ограничим броя задачи, които изпълняваме. Прави се сравнително просто, с брояч на вървящите в момента child процеси.
Версия 5: клиент и diff от предишната версия.

Шестата версия е основно дописване и доподреждане на кода, с оправяне на няколко проблема, които само ми хрумнаха и не съм виждал на живо. Едното нещо е валидация на state на определена задача, другото е един race condition м/у fetch и cancel (който по принцип не трябва да може да се случи).
Версия 6: диспечер и diff от предишната версия.

Има функционалност, която по различни причини не е дописана в този код:

– да връщаме на всеки сървър колко да изчака, преди пак да пита за задача, като метод за flow control.
– job timeout/job restart – да решаваме по някакъв начин кога да рестартираме определена задача (понеже е възможно сървърът и да е умрял и да не се е върнал повече). Това не пасва добре в текущия код, т.е. трябва да се напише отделен компонент, който се вика периодично или работи като демон при диспечера, който да изпълнява тази функционалност, а самата логика за това зависи твърде много от контекста.
– Log на всички събития – животоспасяващ при всякакво дебъгване.
– Monitoring и аларми при различни състояния, дефинирани като проблемни (твърде много чакащи задачи, твърде много обработвани и т.н.) – пак трябва да е в отделен от тези два компонента.

2012-07-13 комикси, които чета

Friday, July 13th, 2012

Пак стигнах до поредния момент, в който съм предрусал с четене и ми е трудно да хвана няколкото висящи книги, та ще взема да пиша. Понеже в общи линии съм си написал лекцията за вторник, ето опит за сглабяне на списък на всичките online комикси, които чета. Част от тях са ми в агрегатора, част са един голям bookmark folder, който отварям целия след 11 сутринта да видя какво ново е излязло.

Списъкът е tldr, може да го изнеса директно в отделен page вместо като post.

(По принцип списък с почти всички web комикси може да се намери в comixmix. Преди около година попаднах на една тяхна класация, след което се хванах да прегледам целия списък и да сихареса неща за четене. Наскоро свърших с преравянето на списъка и изчитането на написаното досега от тия, дето ми харесаха, чувствам се все едно съм прочел internet-а. Почти като след като прочетох целия bash.org за пръв път.)

xkcd би трябвало да е познат на всички, със stick фигурите си, математиката и другите весели неща.
Abstruse goose – другарчето на xkcd.
Romantically apocalyptic – странен, малко руски като усещане, с много добър art.
Всички обичат Дилбърт.
Megatokyo – много добре нарисуван, много хубава история, но си го наваксвам от време навреме, понеже се движи много бавно.
Candi comic – не знам защо още го чета, може би донякъде заради историята.
Sinfest – един от великите.
Questionable content – един от великите, авторът му прави и доста добра музика (групата се казва Deathmøle, писал съм по темата).
Gunnerkrigg court – много добра история и много добър вид, пак от категорията на великите.
Johnny Wander – проект на двама автори на комикси, основно one-shot неща, доста интересно и добре направено.
Poisoned Minds (или SSDD) – чета от много време, може би основно заради идеите и философията на автора.
Unshelved – библиотекарски комикс, от него си намирам понякога нещо за четене.
Between failures – комикс за работещите в един голям магазин, интересен за разлика от повечето такива.
Dead winter – зомби апокалипсис. Стилът на рисуване е доста различен от останалото и много добър.
Prequel adventure – леко странна, напомняща на стари quest-ове история, но с различна реализация (много хора пишат в един форум и са нещо като подсъзнанието на героите). Според мен – рядко добро.
Scary go round – попаднах на него от overcompensating, английски автор на комикси, пише интересни истории.
Menage a 3 – секс.
Sorcery 101 – fantasy комикс, доста добър.
Wolf wears wool – върколашка история, още в началото.
Sequential art – комикс с приятна история и много добър grayscale art.
Skull Kickers – fantasy, като качество надминава повечето неща, които могат да се намерят online.
Max Overacts – не мислех, че комикс за хлапе с актьорски наклонности ще ми е интересен, но сбърках.
PVP online – комикс за game списание, води се от класическите.
Pictures of you – весела и доста дълбока история.
Powernap – комикс за човек, който трябва да спи в свят, в който никой не спи.
A Redtail’s Dream – приказка.
String Theory – историята ми стана много интересна.
Bear nuts – комикс за мечетата в зоопарка. Пълен с груби, грозни и просташки моменти.
Spacetrawler – клони към твърда фантастика (не само защото е в космоса) и историята е интересна.
Lady Sabre and the Pirates of the Ineffable Aether – летящи морски кораби, още го чета за да видя колко интересен ще стане.
Flaky pastry – това го чета само за да видя какво ще стане.
Yellow peril – все още започва, но е обещаващ.
Left-over soup – историята съвсем малко ми напомня Questionable content, философията на автора е интересна.
Life and Death – комикс за Steve, който изпълнява длъжността “Смърт”. Весела история, съвсем леко изтъпява на моменти.
Next town over – steampunk история в дивия запад. Историята изглежда интересна.
Paranatural – пак добра история.
Legend of Bill – леко глупав fantasy.

Понеже са много и да не го казвам всеки път, one-shot весели комикси:
Saturday Morning Breakfast Cereal – велик, вероятно сте попадали на неща от него къде ли не.
Cyanide and happiness – груб, просташки, виждали сте го. Класически.

Systems – комикс, използваш стандартните знаци (например означението за мъжка тоалетна е главния герой), с добро чувство за хумор.
Scenes from a Multiverse – стандартни ситуации в странни светове.
Channelate
Poorly drawn lines – весел и груб.
Bug – доста забавен.
Wulff-Morgenthaler (или вече WuMo) – доста груб и NSFW. Радва.
Head trip – случки около авторката.
Three panel soul – случки около живота на автора (който преди това беше един от авторите на applegeeks).
Overcompensating – странно и ми е останало по навик да го чета.
AmazingSuperPowers

Pigs in Maputo – проект на една девойка, която рисува на лисчета.
Pigs in math – пак проект на същата девойка.
Pigs incorporated – пак проект на същата девойка.
Savage Chicken – комикси на post-it бележки. С кокошки.

2012-07-12 пак лекция

Thursday, July 12th, 2012

Ще водя още една лекция в initLab във вторник (17.06) от 19:30. Пак ще се stream-ва на http://tyler.ludost.net:8787/lab.ts и пак през irc ще могат да се задават въпроси.

Sysadminday – 2012

Thursday, July 12th, 2012

27 юли, от 19:00 в мазето на “Кривото” на ъгъла на “Дондуков” и “Будапеща” ще си празнуваме пак sysadminday. Всякакви админи и подобни са поканени :)

2012-07-07 книжната лекция в initLab

Saturday, July 7th, 2012

Мина лекцията в initlab за книгите. Имаше десет книги в първоначалния план, но накрая говорих и за още две.

Първоначалният списък:
(link-овете са към goodreads, от там може да се ориентирате лесно)

За писането: Мемоари на занаята на Стивън Кинг, заедно с Правопис и пунктуация на българския език (издателство на БАН).

Хората трябва да могат да пишат и да ползват собственият си език.

Shooting an Elephant на Джордж Оруел.

Събрани есета. Показват колко добре умее да пише Оруел, съдържат класическото му (и цитирано от всички) есе за как се пише, както и много неща за истинския журнализъм, езика и истината. Няколко цитата:
“Political language is designed to make lies sound truthful and murder respectable, and to give an appearance of solidity to pure wind. ”
“The greatest enemy of clear language is insincerity.”
“Journalism is printing what someone else does not want printed: everything else is public relations.”

Дзен и изкуството да се поддържа мотоциклет на Робърт М. Пърсиг.

Философска книга. В нея всеки намира ралзични интересни неща – някой спомена как цялата книга според един негов приятел била за музика, според мен е за технологии, сигурно има и други мнения. Една от главите беше поредния тласък да спра да преподавам във ФМИ и да мисля друг вариант.

The Invisible Gorilla and Other Ways Our Intuition Deceives Us на Christopher Chabris и Daniel Simons

Книгата, която ме накара най-накрая да направя подобна лекция. Описва колко много грешим и се лъжем сами. Понеже ме мързи, подробности има в ревюто ми (или може някой път да напиша цял post).

The Psychopath Test на Jon Ronson

От нея се запалих да чета неща по тема психиатрия.

Liars and Outliers на Bruce Schneier

“Приложение на теория на игрите за обществото”

Промиване на мозъци – психологията на тоталитаризма на Робърт Лифтън

Вече съм писал за нея

Masters of Doom на David Kushner

Историята на хората, направили id Software. Който не знае кой е John Carmack определено трябва да я прочете.

Kingpin: How One Hacker Took Over the Billion-Dollar Cybercrime Undergroundна Kevin Poulsen

Историята на Iceman (една от големите фигури в credit card fraud средите).

Better: A Surgeon’s Notes on Performance на Atul Gawande

Хирург, който обяснява как приложението на прости статистически и технически методи може да подобри ефективността на работата. Много от нещата са приложими в нашата област (и много не са).

Две книги, които не бяха в списъка:

Sex at dawn: The Prehistoric Origins of Modern Sexuality на Christopher Ryan, Cacilda Jethá

Основно еволюционна биология. Да цитирам Voland, “не е задължително да сте съгласни, но трябва да я прочетете”.

Blindsight на Peter Watts

Заради тази книга прочетох “The invisible gorilla” и още няколко книги. Едно от най-най-добрите неща в твърдата фантастика в последните години, вече и съм писал за нея. Книгата е под creative commons лиценз и всеки лесно може да намери откъде да я свали за каквото устройство иска.

Самата лекция мина средно добре. Дрънках два часа, като можеше вероятно да се събера в един, но се получи доста интересна дискусия. Също така се получи хората да гледат отдалечено streaming-а и да задават въпроси през irc. Записът се encode-ва и ще пусна link като е готов.

Има още много книги, за които бих говорил (някои от тях споменах). Може и да се направи дискусия върху връзките между тях, например цялостна дискусия за social engineering-а и защитата от него в светлината на “The Invisible Gorilla”, “Ghost in the Wires” (автобиографията на Кевин Митник), “Liars and Outliers”, “Kingpin” и още каквото се сетим…

Какво мислите за лекция за книги по следната тематика:
“компютърно-историческа” (като “Kingpin” и “Masters of Doom”)
“твърда фантастика” (“Blindsight”)
“Neal Stephenson”
или просто пак такава мешаница от теми?

Update: на streaming-а е имало в пиковия момент 15 човека. Изглежда има достатъчно интерес да се прави пак :)

Update 2: Запис.

Update 3: Списък с всички книги, за които бих говорил по темата, по идея на Ники Бачийски.

2012-07-03 книжна лекция

Tuesday, July 3rd, 2012

От 14:30 в събота (7 юли) в initLab ще направя лекция по темата “10 не-техническо-компютърджийски книги, интересни за компютърджии” (още работя по заглавието).
(часът е избран така че всички да са станали, които го правят – обядвали и да е преди концертите)

Спрямо четенето има различни групи хора.

Има такива, които не могат да четат – поради болест, неграмотност и т.н. – за тях аз нямам какво да направя. Има хора, които обаче могат и или си търсят какво, или не знаят за дадени книги и че биха им били интересни. Целта на тази лекция е да се покажат в няколко области интересни книги, които биха се харесали на хора с компютърджийски и подобни интереси.
(още работя по списъка книги)

Лекцията ще се излъчва на http://tyler.ludost.net:8787/lab.ts , ще има запис на va.ludost.net. Вероятно ще блогна казаното на лекцията след това.
Ако някой иска да задава въпроси, но няма да присъства на място – в irc на marla.ludost.net ще има канал #initlab и се надявам да намеря кой да стои там и да ми предава въпросите.

2012-07-01 leap second

Sunday, July 1st, 2012

Jul 1 02:59:59 marla kernel: [3317066.443888] Clock: inserting leap second 23:59:60 UTC

Полезна команда: /etc/init.d/ntp stop; date; date `date +”%m%d%H%M%C%y.%S”`; date; /etc/init.d/ntp start

(при някой може да е ntpd, видях го в outages листата)

Поради високосната секунда, която се появи снощи доста java приложения, firefox/iceweasel и някои версии на mysql, всичкото това под някои linux kernel-и и при още няколко условия зависват/започват да ядат много CPU. Горната команда помага, по принцип и с рестарт на приложението.

Моите наблюдения:
Стандартен debian-ски mysql със стандартен debian-ски kernel (stable) няма проблем на две машини (marla и tyler);
mysql 5.5.25-1~dotdeb.0 в/у debian stable имаше проблема;
tomcat6 на debian stable има проблема (tyler);
jenkins на debian stable има проблема;
virtualbox на ubuntu 10.10 (2.6.32-41-generic) и debian testing (3.2.0-2-amd64) virtualboxsvc-то има проблема (на phyllis);
gentoo с mysql 5.1 при ядро 3.3.6 (компилирано от мен) няма проблема;
debian testing с iceweasel има проблема;

Събирам още информация.

(12:47) Данни от Весо: RHEL6, kernel-2.6.32-220.23.1.el6.x86_64, mysql 5.1.61-1.el6_2.1 няма проблема.
(13:01) Данни от Пейо: fedora 15, kernel 2.6.43.2-6, mysql-5.5.22-1.fc15.x86_64 няма проблема.

Update: Хубаво обяснение на проблема.
Update 2: Още по-добро обяснение.