28 октомври 2008

Ъпрейтвам до Kubuntu 8.10

Няма да чакам финалната версия, и няма да ъпдейтвам нормално. Ще направя фреш инсталация, и без това сега имам прекалено много странни пакети, които не използвам, а факта че още ползвам KDE 3.5.9 усложняа ъпдейта още повече. Очаквайте по късно(утре най вероятно) първите ми впечатления от новото дистро.

26 октомври 2008

Синтактично оцветяване

Реших да добавя синтактичо оцветяване към блога си. Нещата са доста прости, има блогер плъгин, с който да оцветявам кода си. Трябва само да оставите полето със заглавието празно, защото иначе страницата на блога ви ще има заглавие, без съдържание(плъгинът е просто javascript който ще оцветява кода ви). След това просто добавете кода си и го сложете във:


До сега използвах само

Ето резултата:

class AttrDict(dict):

def __getattr__(self, name):
if name in self:
return self[name]
raise AttributeError('%s not found' % name)

def __setattr__(self, name, value):
self[name] = value


Но сега ето какво получавам:


class AttrDict(dict):

def __getattr__(self, name):
if name in self:
return self[name]
raise AttributeError('%s not found' % name)

def __setattr__(self, name, value):
self[name] = value

Използвах таговете:



Надявам се промяната да ви хареса, ако имам време ще ъпдейтна и някой от старите блог постове.

21 октомври 2008

Речник с директен достъп до стойностите в Python

Често попадам на интересни хакове в python, които с помощта на някакъв странен клас, със странни нечетими методи, успява на направи нещо готино с езика, но от друга страна е супер грозно. Днес попаднах на един прост и елегантен хак, който не е грозен, а напротив, дори е красив. Ето кода който намерих:

class AttrDict(dict):

def __getattr__(self, name):
if name in self:
return self[name]
raise AttributeError('%s not found' % name)

def __setattr__(self, name, value):
self[name] = value


Както виждате този клас описва речник, който има странни __getattr__ и __setattr__ методи, които му придават чара. Общо взето, този код дефинира нов вид речник, със директен OO достъп, да речем че направим това:

person = AttrDict({'id': 5})


Виждате че personе инстанция на този клас, който пък от своя страна наследява от инстанция на метакласът dict, т.е. казваме му да наследи всичките атрибути и методи на речника {'id': 5}, но всеки речник, би свършил работа, ако бяхме оставили скобите празни, само щяхме да имаме празен речник от новия тип. Сега, новите атрибути __settattr__ и __getattr__, които горния клас предефинира, имат готин ефект:

print person.id # 5
person.id = 6
print person.id # 6


Това е синтактична захар за това:

print person[id] # 5
person[id] = 6
print person[id] # 6


Елегантно и красиво, но ето и недостатъка, не може да използвате литерали(числа, например), като ключове в речника, или поне няма да можете да имате достъп до тях, т.е. Това не работи:

person = AttrDict({1: 5})
person.1 #изписва грешка
person[1] #връща 5


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

20 октомври 2008

Преосмисляне на блогинг стратегията ми.

Извинение

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

Време

Тук споменах че ще блогвам по рядко, причината е че даскалото почна и имах по малко свободно време. Ето една неефективност. Не организирам свободното си време достатъчно добре. За съжаление няма много какво мога да направя тук. Денят ми е разцепен на сутрин и вечер, следобедът ми е в даскало(90% от което е загуба на време и ресурси). Наистина е неприятно това че всеки ден трябва да прекарвам 7 часа затворен някъде, без да има особена полза от това(имам 2 часа математика и 1 физика на седмица, всичко друго е шум). Хмм, дойде ми добра идея, да направя скриптче което да брои дните до абитуриентската.


Мотивация


Колкото и малко свободно време да имам, ако не го прахосвам с тъпи неща(като 6 часов knights of honor маратон, или рисуване на грозни комикси, или гледане на самурайски филми от 50-те) обикновено или се уча да програмирам(като програмирам) или пиша туториъла, за да се учат други да програмират, или уча математика(за шибаната матура) или правя нещо друго, което бих сметнал за продуктивност. Не мисля че е толкова интересно да блогвам само за шибания ми туториъл, малко се изтърква. За матурата също не е интересно блогването(все още ми е гадно че ще трябва да правя матура по български). А и не пиша толкова много код, че да блогвам за него(може би трябва да правя точно това).


Идеи

Разбира се, всичко опира до идеите. Отне ми 6 дни да измисля това, а дори този пост е изсмукан из пръстите ми. Не че нямам за какво да пиша, просто идеите ми се струват ТЪПИ. Днес в един блог прочетох едно интересно решение на този проблем.(това звучи като реплика от виц, "днес в един блог прочетох, защо понито не може да се разкрещи на орела, защото е малък кон" извинете за това) Просто записвам голямо количество идеи и след това започвам да ги пиша една по една, и ако са добри, ги поствам, така мога да имам по равномерен режим на постване, вместо да поствам 3 статии в първите 3 дена на седмицата и след това да мълча 6 дена, мога да ги разпределя по 1 на 2 дни, и така ще трафика ми няма да е на такива пикове и долове, както е сега. Това е защото сега просто си отварям writer-a(Open Office, да няма объркване) и пиша нещо, ако е сравнително добро го трия и пиша на ново и ако е достатъчно добро, го поствам.(този пост няма да бъде пренаписан, само прередактиран на места) Сега може да пробвам друга стратегия, пиша каквото мога, за да имам запас от статии, така ще е по добре за всички.

Заключение

Освен по добрата организация на времето, повече мотивация, и по добри идеи, както и по редовно постване, този блог се нуждае и от сериозен маркетинг, и не говоря само за svejo.net(90% от посетителите ми от там ползват win+IE(половината от тях с IE6!@!), хора,очевидно без самоуважение, далеч от аудиторията за която пиша). Със повече публика, ще има и повече критика и по голямо качество.

14 октомври 2008

Казанът вече ври, II-ра част на туториълът ми за python

Кодът за тази II-ра част е готов от толкова време, просто не намерих време да напиша самия туториъл. Сега понеже съм болен, имам повече време, и може да очаквате да е готов след известно време, дори не знам днескашната дата, така че финална дата няма да давам. И все пак, когато II-рата част е готова, ще се слее с I-вата и ще бъдат форматирани със reStructuredText и издадени в 3 варианта, първия е сорса на reStructuredText файла, html версия и pdf. За сега мога да ви дам само черновите на първите 2 глави. Това е все още първия текст, който съм написал И ЗАДЪЛЖИТЕЛНО ЩЕ БЪДЕ ПРЕНАПИСАНО, но до тогава, ви оставям с краткия текст, който написах днес, борейки се с треската си, и главоболието, и умората...



II-ра част

1. Въведение

Втората част е на този туториъл е по практически настроена от предишната. Това ще рече, че ще има повече код, освен това, ще може да видите веднага(почти) резултата от своя код. Това ще се постигне чрез модула turtle. Този модул е част от python и е предназначен за просто чертане на екрана. Подобно е на езика Logo, ако някой преди това е учил logo, знае че там имате една "костенурка", и и давате команди, на къде да върви, и където отиде, оставя следа. По този начин, като и даваме поредица от команди, можем да чертаем по сложни фигури. В тази част подходът ми ще е най вече да ви науча как да използвате мощните функции на python, за да чертаете сложни геометрични фигури. Не оставайте с погрешно впечатление, идеите с които ще се запознаем, въобще не са детска работа. Надявам се че ще се забавлявате, или ще полудете от отчаяние, все ми е тая, честно казано.

2. Какво имаме в инвентара

Шесте основни функции, с които ще работим са:

turtle.forward()
turtle.backward()
turtle.left()
turtle.right()
turtle.up()
turtle.down()

Това са основните функции с които ще се занимаваме, ще обясня за всяка една по късно. Има още няколко, които не са чак толкова важни, някой от тях ще използваме, други не. Ще обясня за всяка от тях, когато ги срещнем. Сега да поясня относно горните шест функции:

turtle.forward()

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

turtle.backward()

общо взето същото, но на обратно.

turtle.left()

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

turtle.right()

същото, но на дясно.

turtle.up()

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

turtle.down()

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

Това е общо взето, всичко друго което трябва да знаете, е в първата част.

12 октомври 2008

ViViVi редактора на звяра

Vim е страхотен редактор, както и предшественикът му Vi. До скоро се задоволявах само с начални познания с този редактор, но когато посегнах да редактирам текс със Kate, осъзнах че нещо не е наред. Не познавах редактора достатъчно добре за да го владея и като последствие, не можех да редактирам така ефективно, както мога със Kate. Но kate е подсладена вода, няма истинска мощ, освен няколко евтини калории. За това вчера се занимавах с бъзикане на .vimrc файла ми. Освен че се опитвах да разбера какво правят всичките тея работи(за щастие беще добе коментиран), си го модифицирах и сега съм сравнително доволен.

Днес цял ден чета една книга за Vim. Освен че я чета и изпробвам съветите, си записвам в едно тевтерче разни команди, имам си свестен cheat sheat, но е добре да записваш нещата с ръка, помага за запомнянето на нещата. Необходимо е човек да се потруди за да получи мощта на Vim, това не ви е подсладена вода.

Едно от основните усещания, което редактора оставя в теб, докато работиш, е това че ти си шефа, точно това усещане ме привлича и към Linux. Но за да си шефа, трябва и да си компетентен. Колкото повече се трудя сега, да науча трикчетата, толкова по малко ще се мъча после, когато редактирам, защото ще го правя ефективно и лесно.

11 октомври 2008

XKCD обичат дискавъри ченъл.

Ето тази реклама на дискавъри:



беше превърната преди известно време във пародия на уебкомикса XKCD

Най якото е че това е поредния случай когато животът имитира комиксът. Преди това, нинджи нападнаха Ричард Столман, заради комикс, в който се бие с нинджите на Майкрософт, в друг комикс пък някъкви хора залепят шах фигури за дъската, и се снимат така на влакчето на ужасите, със замислени физиономии, това е правено повече от веднъж. Има и други случаи. Ето поредния пример, горната реклама, след като беше направена на комикс, сега е направена на видео клип:

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: днес започна работа по втората част. Подробности тук.