09 октомври 2008

C, сагата продължава

Така и не научих С. Лятото четох, пробвах разни неща, писах малко код, обаче не прочетох K&R до края. Вместо това задълбах червата на python, и започнах да изучавам синтактичните особености и детайли на езика, също така подхванах и до известна степен Scheme. Та защо днес си отворих отново тази пуста книга за С, този архаичен език от 70-те? Ами просто е, след като изгледах последните няколко лекции от поредицата SICP, видях че в тези лекции, предназначени да те научат на Lisp, въобще не са предназначени да направят това. Идеята е да премахнат "магията".

Ще поясня, лекциите се занимават с различни конкретни проблемни области от компютърните науки, като динамични езици, функционално програмиране, рекурсивни алгоритми, вложени езици, pattern matching, логическо програмиране, и писане на интерпретатори за такива езици. Това всичкото в 10 лекции(всяка от по 2 части). В предишна лекция бяха описали целия мета циркулярен интерпретатор на лисп, написан на лисп, т.е. лисп е самосъдържащ се език, който е дефиниран чрез себе си, и се самоинтерпретира, или нещо такова. Но в една от следващите лекции, направиха нещо интересно. Описаха абстрактен модел на компютър, такъв с регистри, стек, контролер и т.н. Освен абстрактния модел на компютър, дефинираха и вложен в lisp синтаксис, с който да описвах процесите в този псевдо компютър(псевдо асемблер, с лисп синтаксис). Идеята беше да премахнат магията.

Този мета циркулярен интерпретатор за лисп, написан на лисп, има много магия в него. На какво е написан лисп, че да може да се самоинтерпретира, с този прост интерпретатор(събра се на 5 дъски!)? След това започнаха да описвах процесите в тази машина, давайки пример с итеративен и рекурсивен алгоритъм. И двата са дефинирани по рекурсивно със lisp синтаксис, но интересното е какво става в интерпретатора, начинът по който единия и другия алгоритъм пълни и празни стека, показва доста ясно каква е разликата между рекурсия и итерация, дори и ако изглеждат синтактично еднакви, защото са дефинирани рекурсивно, процесите които описват са различни.

След като обясниха процесът, който става в регистрите и стека, магията изчезна. Това някак си промени мирогледа ми за С, проблемът ми е че се опитах да пиша python на С, това освен че е глупаво, е и невъзможно, без да напиша python интерпретатор, преди това. С е език от ниско ниво, един вид абстрактен асемблер. Сега с нов поглед върху проблема, се надявам най накрая да разбера тоя шибан език, и тая шибана Фон Нойманова архитектура.

06 октомври 2008

Дилема. С какво хоби да си запълня свободното време?

Снощи не публикувах допълнителен блог пост, защото гледах лекции за програмиране от 86-та година. Ако не бях, снощи щях да пусна блог пост относто reStructuredText и Sphinx. Тези теми са интересни, и някой ден ще им обърна внимание, но днес ми се пише за нещо друго. След като един вид завърших проекта си за игра морски шах, и след като публикуах черновата на туториъла ми за Python, започнах да се чудя, какво да правя. Да, туториъла все още има нужда от работа, и трябва да напиша 2-рата част, също така, морския шах още няма изкуствен интелект. Обаче на мен тези неща не са ми толкова интересни, колкото бяха, когато си казах че искам да ги направя. Време е да си намеря други проекти, нещо което да ми е интересно, и върху което да си блъскам главата няколко седмици, и по възможност да прави нещо истинско.

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

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

От друга страна обаче, напоследък се заинтересовах от електроника и схеми, може да се задълбоча в тази област.
Или пък да си изтегля документацията на Django и да пробвам да си направя някакъв сайт.

Или пък, може да пробвам да се науча да играя шах като хората, или поне да оцелея повече от 5 хода.

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

05 октомври 2008

Документацията на Python

Днес ъпдейтнах версията ми на python до 2.6, и най якото нещо за нея е, че новата версия има и нова документация, или по скоро нов сайт за документация. Ето как изглеждаше документацията за предишната версия 2.5 . А ето как изглежда тя за 2.6 . Освен готиния редизайн, новия сайт е много добре организиран, намерих някой неща, които и да ги е имало преди в документацията, не съм ги намерил. Да започнем с преглед на нещата, на заглавната страница ще намерите:

Новите неща в Python 2.6

Туториъл(по добър от моя :D)

Наръчник за употреба на различни платформи

Описание на синтаксиса и елементите на езика

Описание на стандартната библиотека

Колекция от интересни How-to-а(след малко ще задълбоча тук)

Наръчник, за това как да се пишат С/С++ разширения

Както и съответната документация за C/C++ API-а

Как да се инсталират модули

Как да се дистрибутират модули

И как да се пише ефективно документация за Python

Други неща в списъкът са и различни индекси и справочници.

Това на което искам да обърна особено внимание са How to-тата, ето какво включват те:

Как да пропагандираме Python пред тъпите си шефове

Как да портваме библиотеки към 3.0

Как да програмираме използнвайки curses(това ми е четивото за довечера)

Няколко примера за лош стил

Как да пишем функционален код(това ще се прегледа по късно, имам особено отношение към функционалното програмиране)

Regular expressions Voodoo

Socket-и

Уникод

urllib2

и най накрая:

как да използваме Python в мрежата.

Защо подяволите няма повече проекти с такава документация, да разбирам че python ми е почти набор, и хората са имали време да напишат това, обаче погледнете да речем Django, тяхната документация е страхотна, за разлика от документацията на brainfuck(това е истински език, доказателство е emacs lisp имплементацията за него :D)

Черновата на туториълът за Python е готова

Водейки се от опън сорс философията "пускай често, пускай бързо", днес ще пусна първата версия на туториъла ми за Python, кръстен иронично от мен "Python:червеното хапче". Иронично е защото всички знаят че Ruby е червения език, а Python е синкаво жълт :D. Представям ви първите чернови, за сега съдържащи само първа част, втората е в прекалено начален стадии за да се показва на хора, като се има в предвид колко пъти пренаписах само тази първа част :D Ето самите чернови:

Чист текст

PDF версия

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

Update 14.10.08: днес започна работа по втората част. Подробности тук.

30 септември 2008

Бъг Ми

Както споменах снощи, днес ще разгледаме гадния бъг от играта ми на морски шах(сорс и обяснения тук). Ако не разбирате Python няма да ви е лесно, за щастие имам няколко много зле написани блог поста, които обясняват по прост и тъп начин нещата.

Започваме от самото начало, играта представлява един списък от 3 други списъка, които представляват редовете на матрицата, в която се съхраняват позициите. ето как изглежда:

matrix=[[[], [], []], [[], [], []], [[], [], []]]


С функцията printmatrix() принтираме на екрана матрицата както трябва:


[[], [], []]
[[], [], []]
[[], [], []]


Това е полето. Следващата стъпка е да се създаде списък със неговите елементи(редове, колони, диагонали):

#първия списък от матрицата е и първия ред
#съответно същото се отнася и за другите редове
row1=matrix[0]
row2=matrix[1]
row3=matrix[2]

#съответните колони са съответните
#редове от списъците, първите елементи
#cа от първата колона, и т.н.
col1=[x[0] for x in matrix]
col2=[x[1] for x in matrix]
col3=[x[2] for x in matrix]

#диагоналите са ясни, надявам се.
diag1=[matrix[0][0],matrix[1][1],matrix[2][2]]
diag2=[matrix[2][0],matrix[1][1],matrix[0][2]]


и самия списък rcd(съкратено от редове, колони и диагонали):

rcd=(row1,row2,row3,col1,col2,col3,diag1,diag2)


Имаме функция която ще провери дали в някой от тези елементи има 3 еднакви елемента(X или O), имаме и функция която ще върти ходовете за да определи кой е победител и т.н., няма да се занимавам с цялата програма, основната идея беше да имам списък от елементите, и за да видим дали след някой от ходовете, нямаме печеливша тройка. Оказа се че програмата не работи както трябва, ако направиш печеливша 3-ка по диагонал или колона, не печелиш. първия ми заподозрян беше функцията good(), предположих че може би тя не си върши работата правилно. След блъскане на главата ми с нея, си легнах, без решение. След като спах около 1 час, се събудих, сетил се за причината. Все още нямах решение, просто станах, записах причината на едно листче, и си легнах. На листа е записано "списъкът се променя, но колоните и диагоналите-не". Сетих се къде е проблема, списъкът е съставен от списък със списъци. Списъците могат да се променят, това е цялата идея, имам един глобален списък, който променям, след това инспектирам, но колоните и диагоналите са указатели към първоначалните елементи([]), които по късно се заменят със X или O, докато редовете са указатели към целите списъци от списъци([[],[],[]]), което означава че row1,2 и 3 се променят по очакванията, но col1,2,3 и diag1 и 2, не се променят както трябва. Първото решение беше да се сложи всичко това във функция която да рефрешва съдържанието на всички елементи, това е и прословутия хак, около който се върти всичко:


def refresh():
row1=matrix[0]
row2=matrix[1]
row3=matrix[2]
col1=[x[0] for x in matrix]
col2=[x[1] for x in matrix]
col3=[x[2] for x in matrix]
diag1=[matrix[i][i] for i in xrange(3)]
diag2=[matrix[i][m] for (i,m) in zip((2,1,0),xrange(3))]
#най- грозния ред:
global rcd
rcd=(col1,col2,col3,row1,row2,row3,diag1,diag2)


Забелязвате че просто на променливите им ъпдейтваме съдържанието, имаме една глобална променлина rcd, която приема нужните стойности, и след това с good() можем да я проверим за съвпадения(в тази версия на сорса, вече се казва same()). Този код работи, втората версия от горния линк е работеща игра на морски шах, работи и няма този бъг. Всъщност бъгът си е там, но просто сме го заоликолили. Истинския проблем е че зависех от един куп глобални променливи, които се променят постоянно и трябва да им следя състоянието. Това доведе до проблеми, и след като ги пооправих, да не си личи кафявото по гащите ми, реших да преработя програмата използвайки идеите на функционалното програмиране. Резултатът е пет функции, и сериозно опростяване, виждате в първия линк колко прост е кода в 3-тата версия, по къс е и няма глобални променливи, спестих и локални променливи на местата където можех, също така се опитах да изолирам до някъде страничните ефекти(присвояване, принтиране), но не се увлякох особено много, можех да напиша програмата в още по функционален стил, можеше и да я напиша на scheme(може да пробвам), можех да се гавря с езика, както тук са направили колегите. Но разбира се аз не съм от тея които бъркат пръднята с аналния оргазъм, за това реших да не насилвам python да го правя на lisp.

Това беше един сравнително приличен пример за използването на полезни функционални идеи, във един обектно ориентиран език(ооп понякога е просто процедурно програмиране, със фънки синтаксис).

29 септември 2008

Липсвах ли ви?

Този пост е нещо като равносметка за последната 1 година, малко сме далече от нова година, ама аз не движа по човешкия календар(прекалено съм готин за да се подчинявам на човешките дати). Най вече ще говоря за прогреса ми с програмирането. Определено има напредък. Почваме с нещата които съм изчел:

  • Прочетох един куп книги до край, това не ми се е случвало много често. Сред тях „Да научим Python“. „Dive into Python“ и „Learn Scheme in a fixnum of days“. Преди малко повече от година прочетох и Unix на Крис Херборт, интересна книга, която не е особено добра, но свърши работата си да ме научи на най-най- основните неща свързани със Линукс, също така ме запали по Vim, въпреки че информацията за него вътре е прекалено малко.

  • Прочетох много книги до половината(или някъде между първата и последната страница). Това включва „Програмния език С“ на Керниган и Ричи, „SICP“ на Абелсън и Сусман(също така изгледах и половината лекции от поредицата, препоръчвам на всички маниаци), „Programing Python“, книга която тежи колкото мен(65 кила), „Езицици за функционално и логическо програмиране I-ва част“ на М. Тодорова, книгата ми се струва свястна, но в нея има прекалено много математически формули(математическата нотация може да бъде доста грозна, ако си развален от python), както и безсмислени схеми и диаграми, които не ми говорят нищо, дори няма легенда за тях(личи си че е учебник за студенти, не е писан за простосмъртни като мен). Иначе не е лоша книга, смятам да я довърша. Други книги от този параграф са и учебника ми по физика от 8-ми клас(сетих се).

  • Много, много блог постове, ама много, казвам много, разбирайте че цялото ми лято е прекарано в програмистката блогосфера(hacker news, reddit). Научих доста от други хора като мен, обикновени програмисти, които си пишат относно разни глупости които ги кефят.


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

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

Днес свърших един мой малък проект(незнам дали е свършен, но е по добре от вчера). Става въпрос за играта ми на морски шах, написана на python. Първата версия я пуснах август, преди няколко дена открих бъг(не бях пипал играта от доста време и за това ми трябваше толкова дълго), поправих бъгът с един бърз хак(някой ден ще блогвам специално за него, като контра пример за това как не бива да изглеждат хаковете). Днес разсъждавах как да подобря програмата. Нямаше причина да я подобрявам, работеше и нямаше бъгове, защото я тествах доста дълго, ако във всичките и 60 реда код имаше бъг, шях да го намеря. Но кодът беше доста грозен, ама много грозен. Не го пренаписах, може да се каже че го префасонирах в по елегантен вид, сега е 45 реда, и е по приятна гледка. Когато писах кода, вкарах в действие знание, което имах от функционалното програмиране и Scheme, което означава че е добра идея да се знае за това, защото първото ми решение беше нещо като заобиколка на проблема, когато префасонирах кода във функционален стил, проблемът го нямаше вече, ако бях започнал така още от началото, нямаше да има този гаден бъг. Но това е животът, днес помъдрях още малко, осъзнах че си е струвало четенето, сега е време да пиша повече код. Ако някой се интересува от играта, тук може да видите развитието на кода, с обяснения от моя страна. Приемете това като извинение, защото ме мърди за блогвам за него, вече съм го описал в темата във форума, но определено ще напиша пост специално за хака със refresh(). Лека нощ и приятни сънища, сбогом, леща нощ...

25 септември 2008

Жълто, ама не е злато.

Случвало ли ви се е да си напишете ника в google или друга търсачка и да намерите нещо което сте писали отдавна, от което да ви е срам? На мен ми се случва учудващо често. Ето на какво попаднах:

http://dreal.net/wiki/index.php/%D0%A5%D0%B0%D1%80%D0%B4%D0%BA%D0%BE%D1%80


http://dreal.net/wiki/index.php/Pavelludiq


Мамка му. Първото дори не е смешно, ако не сте запознати със състава на пънкарскaтa и хардкор субкултури. Препоръчвам ви да отворите линковете на своя отговорност. Имам чувството че съм поумнял от тогава, вие какво мислите?