четвъртък, 24 юли 2008 г.

Отворен код, затворен код - there is no spoon!

Чета в блога на Йовко разни размисли на тема "отворен код", "Apple", и други такива. Разни хора коментират абстрактно и обобщено - затова пък искам да споделя един конкретен пример. Това беше преломния момент, в който осъзнах силата на софтуера с отворен код и станах негов горещ привърженик, защитник и популяризатор.
Като първокурсник (пост-Жан-Виденово време), моите родители с нечовешки усилия успяха да съберат 600 долара (колосална сума - за разлика от сегашните мизерни, обезценени щатски хартийки с мъртви президенти). С тази "пачка" от шест хартийки, си купих PC - 300Mhz-ов дзвер с 64Mb и 15-ска монитор. Лудница - радост до тавана. Видео картата беше S3 Savage 3D, произведена от вече фалирала компания (к'во да се прави - shit happens). Тъпото беше, че в зората на DivX всички филми, които пусках на тази карта имаха гадна розова линия на най-долния ред, вероятно бъг на самата карта. Тъпо, но нищо не можех да направя освен да разтегля изображението малко надолу с настройките на монитора, за да не се виждат последните 2-3 реда пиксели. Low-tech решение на hi-tech проблем. Може би от тогава си държа task bar-a в горната част на екрана - да не се отрязва на половина. Чесно - на бях се замислял, а винаги са ме питали защо е там. После пък разбрах, че Mac-вете били така. След известно време и 2-3 преинсталации на Windows 98 по-късно, реших да пробвам тази нова "програма" Linux. След дълга, неравностойна борба и без Интернет, най-накрая успях да си настроя X сървъра, само и само да установя, че проблема с розовата линия консистентно се появява и под свободната ОС. Още по-тъпо. Тогава ми хрумна да приложа хардуерното решение с монитора - този път софтуерно - защо не разтегля изображението в самия плейър. Отворих изходния код на любимия си mplayer, и там на ред 480 в на libvo/vo_xv.c, леко промених (отбелязано с червено) следния страховит ред:

XvPutImage(mDisplay, xv_port, vo_window, vo_gc,
xvi, 0, 0, image_width, image_height + 3,
drwX - (vo_panscan_x >> 1), drwY - (vo_panscan_y >> 1),
vo_dwidth + vo_panscan_x,
vo_dheight + vo_panscan_y);

Voilà, както казват румънците - леко разтеглих изображението, така че да покрива тази гадна розова линия долу. Вече можех да гледам филми без да ми се набива в очите този дефект. В този момент осъзнах каква сила дава възможността да промениш изходния код на една програма. Няма да чакаш да излязат нови версии, драйвери, или да се чудиш как да заобиколиш някой проблем. Ако ножа опре до кокала - отваряш кода, четеш, променяш и се надяваш да тръгне. Не е лесно - но пък удоволствието след това си заслужава.
~~~
Години по-късно, продължавам да правя малки хакове за да си подкарам това или онова - без да чакам някой друг да свърши работата вместо мен.

Няма коментари: