2012-09-01

September 1st, 2012 by Vasil Kolev

Докато си вися на Aniventure, малък status update:

Лекции записваме всякакви. Последно беше crash course в django, още записваме лекциите на курса по микроелектроника (които успяват да направят по една non-stop лекция от 19:30 до 23:00 без някой да припадне) и се появяват всякакви нови идеи, от които вероятно ще се реализират 10% и ще пак ще се запълни времето на лаба.
(всъщност, всякакви интересни идеи за лаба се приемат, мисля, че си го пише на сайта :) )

Аз имам идеи за две лекции – едната е как става поддръжката на 700-800 машини (системата в hotfile), за която вече имам фирменото съгласие, другата е депресията, самоубийствата и другите такива весели неща (за която все повече и повече говоря в последно време, наскоро на един рожден ден се напих и говорих около 3-4 часа по темата). Не е ясно дали ще мога да реализирам и двете (за втората още не съм сигурен, че искам да се захвана, на първата съм готов на 30-40%).

Също така, търся някой да помогне с малко javascript, да направим нещата на va.ludost.net гледаеми през някой flash player – самите файлове нямат проблем, модула за seek-ване ще го добавя в web сървъра тия дни, само някой трябва да направи свързващия момент. Ако се намира желаещ, да се обади, ще седнем някой ден в лаба и ще попишем :)

2012-08-22 RBL за български спам

August 22nd, 2012 by Vasil Kolev

След като много време се каних и не го свърших, Велин направи RBL за източници на български спам. Попълнен е от един списък мои правила и един негов, репликиран е на три машини с добра свързаност и може да се ползва свободно от който си иска (на собствена отговорност, as usual).

Update: Правило за spamassassin:

header FCCF_BG_RBL      eval:check_rbl('fccf_bg','rbl.fccf.net')
describe FCCF_BG_RBL    rbl.fccf.net for sources of Bulgarian spam
score FCCF_BG_RBL       3.5 3.5 3.5

(score-овете вече може да си ги настроите както искате)

2012-08-20 streaming & recording howto

August 20th, 2012 by Vasil Kolev

Понеже тия дни ме е хванала словесната диария, седнах и описах как правя записите и streaming-а, с надеждата и други хора да се възползват от това, както и да има някой друг, който да го прави вместо мен в lab-а от време на време.

Пишете, ако имате корекции, идеи и т.н., онова там е wiki, така че може директно да добавяте и там.
(в момента с Андрей правим експерименти да записваме screencast в лаба, после ще опиша опита и от това забавление)

2012-08-20 Ratio

August 20th, 2012 by Vasil Kolev

Киро (voland) (който има общо с организацията на събитието) ме зариби да ида на Ratio, което ще се проведе на 29.09 в София (подробности за къде и т.н. има на сайта).

Изглежда интересно, лекторите нямат вид на идиоти и като цяло не ми се вижда bullshit конференция като TED. Има някакъв минимален вход (може да се види на link-а за регистрация) и online продажбата на билети работи (трудно, мъчително и с бъгове, но върши работа).

(disclaimer: не са ми плащали, това не е реклама, на мен наистина ми изглежда интересно)

2012-08-18

August 18th, 2012 by Vasil Kolev

Докато вися на палачинките при Кънев, няклко кратки неща.

Продължават да се качват записите за курса по микроелектроника.

Вчера почти без да искам засякох Марио Пешев да води лекция в лаба (така е, като не гледам календара) и съответно го записах и качих (не го stream-нах, понеже никой не знаеше). Има лекция за Django след две седмици, тя също ще се записва/stream-ва, а аз ще чета календара по-често.

Тия дни release-наха MusOpen DVD-то със записи на изпълнения на класическа музика под отворен лиценз, съответно имам с какво да направя хубав фон на постоянно висящото излъчване на stream-а на лаба, та като събера желание ще пусна да върви нещо там.

Записи от VarnaConf 2012

August 16th, 2012 by Vasil Kolev

Записите могат да бъдат намерени в wiki-то на va.ludost.net или директно в http://va.ludost.net/files/varnaconf/2012/ (директорията с файловете).

Звукът е ремонтиран донякъде (почистване на шум и усилване) и би трябвало да е донякъде разбираем, за в бъдеще ще се вкарва директно от пулта в камерата, само да се снабдя с нужния хардуер. Също така няма отпечатъци от пръсти по обектива, размазаните неща, които се виждат на екрана на проектора са просто как някой по погрешка е драснал на него и се е опитал да го изтрие с гъбата.
Оставил съм всички представяния и announcement-и, понеже е важно да документираме първите стъпки на MC Стефан Кънев за поколенията. Препоръчвам на всички конференции в България да го канят да върши тоя тип работа, ще им се увеличи посещаемостта :)
(най-малкото той си има приличен фен клуб)

2012-08-16 записи/streaming на курса по микроелектроника в initLab

August 16th, 2012 by Vasil Kolev

За летния курс по микроелектроника в initLab – записите могат да се видя в wiki-то на va.ludost.net или направо в директорията там, за момента е качена уводната лекция от вторник. Stream-а ще е достъпен на http://stream.ludost.net/lab.ts (оправих в общи линии проблема и няма нужда да се дописва и порта).

(май съм готов със записите от varnaconf, ако бъдат харесани от няколко човека, ще пусна link и тук).

2012-08-13 Лекцията ми от VarnaConf (tldr)

August 13th, 2012 by Vasil Kolev

Това е лекцията ми от varnaconf – “Какво ми се иска да знаеха програмистите (а явно не го знаят)”.
(имаше няколко различни заглавия в тоя смисъл, не успях да подбера най-грубото)

Може би най-важното е да знаят, че имам лопата и си я държа под ръка…

Иначе, малко по-сериозно, да почна от там защо изобщо реших да водя лекцията. Пряко свързана е с работата ми и реално представлява мрънкане/оплакване от някаква част от проблемите, с които съм се срещал и не съм очаквал, че ще се срещна.
Моята работа по принцип е да карам неща, писани от други хора да работят. Това включва много debug-ване (което ми е едно от любимите занимания), много четене на код и малко писане. Държа да си кажа, аз не мога да пиша кой-знае колко добре, липсва ми времето и желанието за толкова съсредоточаване (ttee ми отне няколко дни, а не би трябвало).
Четенето на код е основно да разбера защо нещо не работи (или понякога как изобщо работи), съответно с мисъл за бъдещето обяснявам на хората къде е проблема, как може да се оправи, как аз съм го оправил, така че в бъдеще да не видя същото нещо. За съжаление ако историята ни учи на нещо, то е, че хората не се учат от историята, та моите опити са доста неуспешни. Приемете това като едно просто изливане на мъката.

Спрях се на два типа проблеми – теоретични и от неинформираност, понеже бях ограничен в 30 минути, но ще се опитам да засегна нещата в по-голяма дълбочина тук.

Ще започна с първия теоретичен проблем – copy-paste.
Copy-paste е метод за разпространение на грешката. Не мога да преброя колко пъти съм видял код, копиран няколко пъти и във всичките места със същата грешка. Човек би си помисли, че това е понеже няма как да се избегне (наистина има такива случаи), но най-често изглежда или като мързел от страна на програмиста, като липса на абстрактно мислене или като непознаване на езика и средствата на разработка. Голяма част от повторения код изглежда като писан от хора, които не са наясно че има неща като for цикли, функции, макроси и т.н..
Доколкото знам, започват да се появяват инструменти, които поне могат да откриват такива неща, но не съм забелязал сериозната им употреба. Тези неща много лесно се хващат с четене на кода (deja vu, “това някъде съм го виждал) и е едно от нещата, които code review може лесно да хване.

Умното писане ми е друг проблем. Много често се случва след-начинаещ програмист да открие нова възможност на езика, нов lib, нов метод на писане и да започне да го прилага навсякъде, където види, просто защото му се вижда много готин. Така се прилага безсмислено сложно средство за решаване на прости проблеми, което прави debug-ването много трудно, защото както е казал Браян Кърниган, “дебъгването е два пъти по-сложно от програмирането, така че ако програмирате с пълния си капацитет, не сте достатъчно умен да да го дебъгвате после”.
Някои езици много улесняват подобни неща, например Perl и C++. Мнението на Al Viro за C++ и защо не се ползва за kernel-а много добре показва проблема – накратко, езикът има твърде много възможности, всеки програмист свиква с някакво под-множество от тях, и когато в един проект се съберат да пишат няколко човека, се получава страшна смесица от стилове.
(на лекцията бях казал грешно, че идва от Линус, но мисля, че говорех за това, доста отдавна съм го чел)
По принцип често ме викат, когато трябва да се debug-не нещо такова супер сложно и омазано и най-честото нещо, което казвам е, че трябва да се пренапише.
(За пример за умен код давам примерните реализации на fizzbuzz, ако някой някога ми напише нещо като последната в production код, ще трябва да има преди нея поне толкова голям коментар, който обяснява защо е написано така и как точно работи)

Проблемът с валидацията може би ще иска отделна публикация, лекция, учебник, курс или религия по темата. Факт е, че след толкова години security и всякакви подобни проблеми никой не проверява получените данни.
(след малко дискусии с Кънев и още няколко човека искам да обясня, че например трансформирането на данните до вид, който е валиден също е вид валидация, т.е. правилното escape-ване например)
Докато водих лекции на едни ученици около летния лагер на БАН преди година-две във Варна, присъствах на тяхно предаване на проект, който представляваше симулация на банкомат – в общи линии му се подаваше сума и програмата по някакъв начин казваше в какви банкноти и по колко ще я върне. Имаше всякакви красиви реализации и т.н., но повечето изгърмяваха по неприятен начин (или зацикляха, или програмата умираше) на всичко, което не беше съвсем валидно – отрицателни числа, дроби, такива, за които нямаха типове банкноти – само защото нямаха няколко прости проверки в началото и вярваха, че входът ще е верен.
(това с вярването сигурно работи в религиите, но не и в програмирането)
Елементарното нещо – да се направи проверка още на входа на данните, се пропуска от всички. Много често ако има валидация, е от типа “shotgun” (т.е. все едно сте лепнали кода на стената и от далече сте стреляли по него с пушка със сачми, и където е паднала сачма там сте сложили проверка за нещо) и повече пречи, отколкото помага.
Друга такава елементарна грешка е идеята “аз пиша клиента и сървъра за нещо, значи данните ще са ми верни и няма защо да ги проверявам”, което е така до момента, в който някой друг се добере до този интерфейс и започне да праща там. Резултатите от това варират между викове “кой го е писал това” и вопли “как са ни хакнали и са ни потрили всичко?”…
Вариация на предното е “само аз пиша в базата, знам какво е и няма нужда да го проверявам” – имаше няколко случая на cross-site scripting през такива проблеми.
И нещо, за което малко хора се сещат изобщо, а на малкото останали хора, които държат на performance (като например game developer-ите) им е противопоказно е defensive programming-а – да се прави допълнителна проверка на още няколко места, понеже в крайна сметка всички допускаме грешки, нормално явление е да ги допускаме и е добре да ги хващаме. Пряко следствие от това е, че assert-ите не се пускат само в debug код, а и в production.

Като допълнение към валидацията, което не можах да разпъна добре на лекцията е, че няма замисляне колко сложни да се правят протоколите, така че да са лесни за валидация. Писах за лекциите от 28c3 и по-точно за Packet-in-packet атаката и за the science of insecurity, така че няма да повтарям (много), но е важно да правим всичко така, че да ни е нужен максимално прост апарат за обработката и валидацията му – колкото повече от нещата ни могат да се разберат и обработят с краен автомат например, толкова по-добре. В противен случай можем да се озовем в ситуацията на антивирусния софтуер, който спрямо математическата теория не може да бъде направен да работи напълно правилно.
(Проблемът там е като следствие от теоремата на Гьодел, която казва, че вътре в една система не можем да проверим дали всяко твърдение в нея е вярно или невярно, т.е. няма как със средствата на машина на Тюринг да валидираме друга машина на Тюринг)

И за пример за невъзможна за валидиране и използва сериозно система ще дам комбинацията от HTML5 и CSS3 (без JavaScript), която се оказва, че е Turing-complete.

След чистата теория нека да хванем няколко по-преки проблема.

“I don’t believe in miracles, I rely on them” изглежда да е стандартна програмистка философия. Трудно се схваща, че почти всичко може да върне грешка и съответно трябва да се направи нещо, ако това се случи. Като за начало, имам две парчета код за пример. Първото е “наивната версия”:

#define BUFSZ 8192
int fd0, fd1;
size_t len;
char buff[BUFSZ];

fd0 = open(file1, O_RDONLY);
fd1 = open(file2, O_RDWR);

while ( (len = read(fd0, buff, BUFSZ) !=0 ) ) {
	write(fd1, buff, len);
}

close(fd0);
close(fd1);

Второто е ремонтираната (DIE трябва да печата име на файл, име на функция, ред, подадения string и strerror(errno)):

#define BUFSZ 8192
#define DIE()...

int fd0, fd1;
size_t len;
char buff[BUFSZ];

if ( ( fd0 = open(file1, O_RDONLY) ) <0 ) DIE("open fd0");
if ( ( fd1 = open(file1, O_RDONLY) ) <0 ) DIE("open fd1");

while ( (len = read(fd0, buff, BUFSZ) > 0 ) ) {
	if ( write(fd1, buff, len) < len) DIE("writing");
}
if (len<0) DIE("reading");
close(fd0);
close(fd1);

(Оставил съм втората версия както ми е в презентацията, с грешките от един copy-paste. И аз съм идиот, това го видях на самата лекция, когато ми го посочиха)

Разликата е ясна, и примери от първия тип може да се срещат къде ли не. Най-често съм виждал такива неща при php програмистите, което може би идва от това, че понеже всяка маймуна може да пише на php, твърде много маймуни са започнали да го правят.

Втората версия не прави някаква магия и да решава проблема – тя просто ни дава едно важно свойство, наречено “failfast”, т.е. програмата да прекрати изпълнението си колкото се може по-скоро след като стане ясно, че не може да го завърши правилно. С код с подобно поведение и няколко други прекрасни неща, като идемпотентност на изпълнението (много дразнеща дума, значи в общо линии че ако кодът се изпълни 1 или N пъти, резултатът в крайното състояние ще е все същия, т.е. можем да повтаряме колкото си искаме) и ACID свойства можем да правим истински работещи системи, а не такива, които се чупят, като някой ги погледне накриво.

Fallacies of distributed computing са друго нещо, което много ми се искаше да е известно на повечето програмисти. Много често хората пропускат колко гнусно нещо като поведение е мрежата. Ще се спра накратко на няколко от проблемите:

Мрежата не е с нулева латентност – усеща се когато например се изисква два компонента да работят синхронно и да си разменят постоянно съобщения, за да си синхронизират състоянието. Тогава дори бързата локална мрежа ще вкара сериозни забавяния, а в момента, в който минем на нещо на по-дълги разстояния, повечето такива неща просто спират да работят.
Това е и едно от нещата, които не можем да очакваме по-добрия хардуер и физиката да поправят, понеже поне до момента няма нещо, което да можем да използваме за предаване на данни и да е по-бързо от скоростта на светлината.

Пропускателната способност не е безкрайна – понякога хората не се усещат, че предаването на указател към огромни данни през мрежата не става точно така.

Мрежата не е reliable – нормално е за мрежата да губи пакети, да изчезва, да има jitter, а ако е internet е нормално това да е още по-зле. Съответно не може да се пише какъвто и да е софтуер, който я използва без да се имат в предвид тези failure modes и да се взимат мерки за тях.

Мрежата не е сигурна – може да се подслушва, някой да се представя за някой друг и т.н. и т.н. и т.н., неща, които ги чуваме даже по новините и все пак никой не се сеща да ползва криптография.

Накратко, мрежата ви мрази.

Накратко два доста конкретни проблема от ползването на version control-а – още не се преподава сериозно, хората започват да го учат в движение в първата си работа и това води до всякакви проблеми, например до ползване на CVS или до това ако двама човека работят заедно, да седят един до друг и да си разменят файлове по skype.

Първият проблем от неяснотата как се използват VCS (version control systems) е че когато кажеш на някой “branch-ни това, за да работим спокойно по trunk-а” изобщо не те разбират, а като обясниш “направи копие еди-къде-си”, хората просто взимат файловете и ги add-ват наново там, което води до загуба на history-то. След като им се посочи грешката, те продължават да не схващат защо това е такъв проблем, понеже за тях VCS-а е само backup и commit messages са някакъв бълвоч, който никой не гледа, а когато потрябва да се гледат, вече е късно.
(Много е забавно да се анализират всички commit messages на някоя фирма и да се види кои са най-често срещаните думи. Моята любима (беше на 10то място в една фирма) е “blahovina”)

Вторият проблем е как като се прави някакъв сайт, редовно се слага config файла в repository-то. Понеже този файл е различен за production-а, staging-а и за машините на developer-ите, редовно се случва някой да го commit-не от грешната машина и да го update-не в production-а, чупейки всичко. Двете решения, за които аз знам са или да се прави template на този файл и само той да стои в repo-то, а другото е да се detect-ва средата и да се load-ват подходящите настройки (както прави rails, доколкото схванах).

И един bonus за четящите тук – нещо, което не можах да спомена в лекцията, но обсъждахме доста подробно след това, външните dependencies на един проект, кой носи отговорност за тях и как се update-ват. Ще говоря основно за неща, които се deploy-ват по сървъри, но има доста паралели и с end-user-ския софтуер.

По принцип имаме два варианта. Единият е да използваме външните неща от дистрибуцията/операционната система, оставяйки на тях отговорността (и подбирайки ги правилно, например да ползваме debian stable или centos или rhel), другия е ние да си ги вкараме в проекта и да си носим отговорността за тях.

Много проекти се спират на втория вариант, след което обаче забравят какво са вкарали, или пък дават зависимости през външна пакетна система (например ruby gem-ове) и пак забравят да ги update-ват. Или не забравят да ги update-ват, но не смеят, понеже ще се счупи нещо. Или ще update-нат цялото нещо към най-новата версия заради някакъв супер готин нов feature и ще потрошат цялата система.

За това хората, които не разбират как се прави това, не трябва да го правят – ако човек не участва в оперативната работа (я като админ, я като част от devops екип), по-добре да остави на другите да му кажат версии и външни пакети, за да може да се работи стабилно и без downtime. Като малка реклама на debian stable (и донякъде ubuntu server lts), те правят дистрибуция много подходяща за сървъри, понеже въпреки, че са със стари пакети, те реално за живота на дистрибуцията винаги backport-ват важните patch-ове (основно за security проблеми), така че системата е едновременно и сигурна и не се променя поведението ѝ.

Специално за външните dependencies също мога да направя цяла отделна лекция, в която да си излея мъката.

За всички, преживели изчитането на това – снимка на обстановката, в която спах във Варна :)

(най-много ме зарадваха силно невярващите погледи на някои хора от залата, т.е. има надежда, че има програмисти, които знаят тия неща)

2012-08-12 VarnaConf

August 12th, 2012 by Vasil Kolev

Вчера беше VarnaConf.

Като увод, защо се случи цялото нещо – Радослав Станков (Радо) и още някой разбрали, че ще се засекат във Варна, мислили какви лекции да направят в локалния hackerspace, след което решили, че няма лошо да направят една конференция, Радо пуснал няколко mail-а до университетите някой дали има свободна зала и от Варненския свободен отговорили. В началото бяха 4 лектора, после в един момент 11, питаха ме и мен дали искам да правя записа и streaming-а, и така за две седмици се случи цялото нещо.
(Радо може да му хрумне да напише нещо по-подробно по въпроса, ако реши да върне блога си от мъртвите)

Аз пристигнах в четвъртък във Варна с Жоро Митев, като преди това бях пратил кашона с техниката по куриери. Видяхме локалния hackerspace (Varnalab), където вечерта Кънев изнесе 3 часа лекция за vim, видяхме се с локалните хора и изобщо си изкарахме весело.

В петък отидохме до Варненския Свободен Университет, за да разположим техниката и да видим залата (за която преди това Радо ми беше пратил малко снимки), което направихме за час-два (за какво можеше да стане по-добре – след малко). Последва мотаене, ядене, пиене и пак лекция във VarnaLab за увод в Ruby (пак от Кънев – после аз съм обичал да говоря много :) ).

Самата конференция беше много добра. Започнахме с 20тина минути закъснение (Радо закъсня, трудно ми е да му го простя, щото е спал повече от мен), но всичко си работеше и с много усилия успяхме горе-долу да спазим половината график. Имаше 80-100 човека (очакванията на всички бяха за 2-3 пъти по-малко), съответно има сериозен шанс това да стане редовно ежегодно събитие.

От лекциите си спомням следното:

Радо направи много хубава лекция за как добре да пишем и ремонтираме код;
Стефан (Кънев) изнесе стандартния си вид представление/лекция (имаме голям късмет, че не е религиозен лидер), която по броя slide-ове и информация в тях трябваше да е около час и половина, а той имаше по програма половин час;
Митьо (Димитър Димитров) говори за Ruby on Rails, като за разлика от Кънев имаше slide-ове и информация за 3 часа;
Андрей Радев показа “Как да превземем света с vim” и надмина показаното от Стефан в четвъртък. Накрая обясняваше как човек може да си направи с vim не само собствен lightsaber, но и lightsaber chainsaw, или дори lightsaber chainsaw nunchaku (с което съм напълно съгласен). Демонстрацията му в рамките на 10 минути на няколкото модула/скрипта, които той сам си е писал мисля, че напълно шашна публиката;
Калин Чернев говори за hackerspace-ове;
Аз мрънках от програмисти (презентацията ми в pdf или odp), вероятно ще разпиша цялата си лекция като blog post в идните дни;
И Христо Дешев разказа за полифазното спане, или как да спим по-малко, като спим да речем по половин час на всеки 4 или различни други варианти.
(имаше още две лекции, но бях доста отнесен/зает, за да ги слушам)

Важен feature на лекцията беше, че на обяд имаше безплатна пица за всички присъстващи (и понеже аз стоях при техниката, Митьо ме спаси от гладна смърт, като ми донесе няколко парчета).
(изобщо във Варна живях основно на пици, те са перфектната храна)

Последва after-party в някаква пицария – хапнахме, пийнахме, говорихме, говорихме, говорихме на хиляди теми, след което аз се прибрах да спя, и след няколко часа трябва да се метна на автобуса и да се прибера в София.

От сега да се извиня за качеството на звука в stream-а – явно ще трябва да си нося слушалки следващия път, понеже в лудницата и слушането на колонките на лаптопа не съм схванал колко точно шум има, който има шанс да почистим от записите. За следващия път ще вкарам звука от пулта директно в камерата, като понеже това директно с кабели вероятно няма да стане, ще търся тия дни някакво устройство за безжичен пренос на звук (или ще убеждавам кръжока по електроника, че ще им е интересно да сглобят нещо такова).
(имаше и оплаквания, че имало отпечатъци по обектива на камерата – нямаше, просто екранът, на който прожектирахме имаше размазвания от това, че някакви хора бяха драскали по него и се бяха опитвали да го трият…)

(Имам примерен отрязък от звука, в който Кънев представя лектора и после лектора говори известно време, ако някой има идеи какво би помогнало като филтри и т.н., моля да каже)

А догодина може да е два дни, или с два потока, да има повече хора (не се засякохме с летния ученически лагер на БАН, където ходят учениците, класирали се по олимпиадите по информатика и информационни технологии, и на тях щеше да им е интересно) и да не почваме в ранната сутрин (т.е. 9:20) :) (разбира се, като запазим колко лесна беше организацията :) )

(а в моя pipeline вече са два post-а – как се прави streaming/запис/encoding/рязане, и онова мрънкане за програмистите, някой ден ще ги напиша)

2012-08-05 VarnaConf

August 5th, 2012 by Vasil Kolev

На 11.08 (събота) във Варна, във Варненският Свободен Университет ще се проведе VarnaConf – еднодневна конференция за developer-и. Аз ще имам една кратка лекция там (основно мрънкане), но се очертава да има по-интересни неща, програмата и лекторите могат да се видят на сайта.

Ще се stream-ва (освен ако нещо тотално не се сбози) на http://stream.initlab.org:8787/vc.ts, където в момента върви на loop едно клипче с програмата и “Too Tight” на Falik за фон. Мисля, че с vlc най-добре ще може да се гледа, но до събота има много време всички да тестват и да кажат дали имат някакви проблеми (и да си ги решат). Ако има желаещи, в София в initLab може да се организира прожекция – има всичко нужно за целта, само някой трябва сутринта да отвори.
(може като Радо се събуди по някое време да предложи по-хубав клип и някаква друга creative commons музика)

Вероятно ще пътувам няколко дни преди конференцията за Варна, та ще имам време да вися във VarnaLab и да преча на хората (най-вече на Кънев, който иска да върши работа и да води полезни workshop-и на хората). Ако някой му се намира по-интересна идея за моето време там (невключваща плаж и други подобни гадости) да пише.
Също така, ако някой там може да откликне на някаква част от тоя ми призив, също да пише :)

Update: Оправих url-то на stream-а, бях пропуснал порта (8787).

Threaded tee

July 21st, 2012 by Vasil Kolev

Понеже не намерих нещо такова (след малко търсене) преправих един стар 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 лекция “Дребен пример от разпределеното програмиране”

July 18th, 2012 by Vasil Kolev

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

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

Става въпрос за тип задача, която не намерих в 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 комикси, които чета

July 13th, 2012 by Vasil Kolev

Пак стигнах до поредния момент, в който съм предрусал с четене и ми е трудно да хвана няколкото висящи книги, та ще взема да пиша. Понеже в общи линии съм си написал лекцията за вторник, ето опит за сглабяне на списък на всичките 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 пак лекция

July 12th, 2012 by Vasil Kolev

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

Sysadminday – 2012

July 12th, 2012 by Vasil Kolev

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

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

July 7th, 2012 by Vasil Kolev

Мина лекцията в 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 книжна лекция

July 3rd, 2012 by Vasil Kolev

От 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

July 1st, 2012 by Vasil Kolev

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: Още по-добро обяснение.

2012-06-19 какъв ни е проблемът с нещастието?

June 19th, 2012 by Vasil Kolev

Четейки си поредната книга (“Coming of age on Zoloft”) и говорейки си с разни хора и четейки различни публикации, започвам да се чудя – кога стана лошо и болестно човек да е нещастен?

Има различни причини хората да се чувстват нещастни. От една страна, може да е чисто биологичен дефект и липса на невротрансмитери, но от друга страна може просто мозъкът да ни казва, че трябва да направим нещо – нещастието, депресията и т.н. са стандартният механизъм да искаме да потърсим промяна, начинът да ни се каже, че трябва да го направим. Начинът да схванем, че нещата около нас не са добре и че трябва да се променят, че вероятно ние самите трябва да направим нещо.

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

Може би културата ни има нужда да схване и да каже, че да си нещастен е нормално, дори полезно за самото общество, защото без нещастни хора много интересни неща нямаше да ги има. Стремежът към щастие ни бута напред, нека да не го режем и обявяваме за нещо лошо.

Гледам как прилична част от хората, които познавам пият или са пили антидепресанти, например и си мисля, че не би трябвало да е нужно. Да, помагат, карат ни да се чувстваме (по-) щастливи, може да ни помогнат да прескочим някоя сериозна дупка в живота си, но те трябва да са нещо крайно като средство и когато имаме проблем, да си го решаваме – дали сами, чрез правене на нещо, дали чрез говорене с другите или някакви групови действия.

Не се притеснявайте да сте нещастни, не се притеснявайте да искате да не сте и да правите нещо по въпроса. Полезно е:)

2012-06-18 избрани неща от прочетените в последно време книги

June 18th, 2012 by Vasil Kolev

Понеже почти не успях да спя днес (заспах в 8 сутринта) и ми е трудно да чета, ще взема да попиша.

Отдавна не съм писал за книгите, които чета (освен малко ревюта в goodreads), та ето малко избрани:

Изчетох цялата поредица “Тъмната кула” на Стивън Кинг (без “The wind through the keyhole”, която излезе наскоро и хронологично трябва да е някъде по средата между останалите). Може би не трябваше да го правя, защото след това не знам дали имам желание да чета каквото и да е дръго от него, няма как да се сравни и да е по-добро, та вероятно ще чакам да я позабравя.

Прочетох и Liars and Outliers на Брус Шнайер, книгата си струва да се изчете като нещо, което дава базова идея за поведението на различните човешки общества.

Преиздали са “Секретното дело за лагерите” на Христо Христов.

Почнал съм да раздавам копия на Правопис и пунктуация на българския език.

Заслужават да се споменат: The Death of Feminism на Phyllis Chesler (доста хубаво описание на проблемите на феминисткото движение), Cathedral, Forge & Waterwheel: Technology & Invention in the Middle Ages (харесах си я от Патрик Ротфус), Redshirts на John Scalzi (освен всичко, страхотна гавра със Star Trek), The Old New Thing: Practical Development Throughout the Evolution of Windows на Raymond Chen (книгата ме направи адски щастлив, че никога не съм писал за windows), Out of Mao’s Shadow на Phillip Pan (доста добра книга за Китай) и Wild thing на Josh Bazell (втора книга за Peter Brown, даже като гледам са я издали и на български, много приятно четиво и то ме насочи да прочета “Out of Mao’s Shadow” и “Methland”).

Специално внимание заслужава Sex at Dawn: The Prehistoric Origins of Modern Sexuality на Cristopher Ryan и Cacilda Jethá, заедно с “Blindsight”, “Woman’s Inhumanity to Woman” и “The Organization Man” влиза в категорията “книги, които сериозно отварят очите”. Вероятно трябва да я дават на учениците да я четат, заедно с литературата по полово обучение.

Останалото може да се види в goodreads, ако не ме домързи, някой път ще напиша export, който да сипва post в блога от последните X прочетени книги.