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

24 септември 2008

Трябват ни повече псувни във вестниците!

Нямах няколко дни нет, за това не ъпдейтвах от известно време. Днес, понеже ми пуснаха отново нета, реших да понаваксам малко от изпуснатото. Разбира се, в предишен блог пост бях споменал че svejo.net ми е безполезен сайт, защото голяма част от съдържанието ми е безинтересно, за разлика от други подобни сайтове, които посещавам, обаче от там ми идва трафик понякога, така че от време на време преглеждам ако има някакви коментари оставени там за публикациите ми, или ако случайно намеря някой интересен пост, и днес чета че някакви мутри пребили някакъв журналист. Хм, да взема да блогвам за това ли? Нее, не е в мой стил, може би сте забелязали че избягвам поличитески теми, май само един път писах за Русия и Грузия и толкоз. Политика, икономика, социология, майната му на това, аз съм нърд, кефя се на технологии, музика, изкуство, за това блогвам. Разбира се реших поне да спомена това събитие с журналиста, всъщност, ще спомена още някой неща, които други блогери крещят, става въпрос за оня протест, срещу шпионирането, както и онова дето ония мутри щели да махат анонимноста на нета, или някакви такива измислици, защо не блогвам за тея работи? Имат общо със технологията до известна степен, интернетът е основната технология, която позлвам, засяга ме. Е, други хора блогван за това, още един, дето само говори не му трябва на блогосферата, трябват ни повече артисти. Ами, всъщност майната му на всичко. Да сменим темата на нещо което ИМА значение. Например, майната му, не ми се блогва, пише ми се поезия:

Шибаните хора, с шибани идеали,
шибани ченгета, с шибани морали,
шибани дебелаци, и шибани лайняри,
майната им,
шибана е тайната им,
със лопати в гъзовете,
всички просяци ще мрете!


Толкова много обичам тая шибана дума, шибано, шибано, шибано....

19 септември 2008

"Python: червеното хапче" preview II

Вчера бачках доста до късно и свърших с първата част на туториъла. Както може би някой от вас знаят, тази първа част е базирана изцяло на блог постовете за python, които пуснах тук, някой от тях бяха напълно пренаписани, някой само леко редактирани(най леко редактирах и най популярния пети пост). Добавих и още една глава, за модулите и импортирането, първата и версия, която вчера написах със едва отворени очи, сега ви предоставям за четене, не знам дали няма да я променя до деня в който излезе целия туториъл, всъщност, този ден все още е неизвестен, защото все още не съм сигурен колко време ще ми отнеме да напиша втората част. Както може би сте разбрали от предишни постове, тя ще ви учи как да чертаете на екрана с модула turtle, и за това беше добра идея да добавя и малко информация за модулите и импортирането, вместо да го обяснявам във втората част. Ето и самата глава:



В програмирането обикновено когато програмата стане достатъчно голяма, тя започва да се разделя на отделни модули с логика. Тези модули са отделни файлове със код. Тези същите файлове които завършват с .py. Понякога имаме нужда от допълнителни инструменти(функции и класове) и ще открием че някой вече е написал нещо което ще ни свърши работа. Вместо да пишем свои собствени инструменти, няма да е лошо ако можехме да вземем на готово чужди такива. Python идва в комплект със доста голямо количество библиотеки и модули, които можем да използваме, също така понякога ние самите ще си напишем библиотеки под формата на други модули, и ще искаме да можем използваме функциите и класовете от тях и в новата си програма. За целта ще можем да използваме конструкцията import. Нищо сложно, просто създаваме една функция, да речем от горните примери функцията square в папката ви C:\mypython\:

square=lambda x: x*x

Този код го запишете в файла square.py. Отворете command prompt-а и напишете следната команда:

cd c:\mypython\


С тази команда се придвижвате към директорията в която е вашия файл. След това стартирайте python като напишете следното за уйндолс:

c:\python25\python.exe


А за Линукс е просто python.
Сега можете да импортирате файла си със командата import:

>>>import square


Сега имаме достъп до имената във square, там има само едноименната функция:

>>>square.square(4)
16


Сега ако искаме да добавите функция във файла си, и после да я имате в интерпретатора, може да използвате функцията reload() която презарежда импортирани файлове. Да речем че добавим следната функция към файла ни:

def sumofsquares(x,y):
return square(x)+square(y)


Сега в интерпретатора пишем:

>>>reload(square)
>>>square.sumofsquares(4,4)
32


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

>>>from square import square
>>>square(4)
16


Можем също така да импортираме неща и да им даваме имена:

>>>from square import square as sq
>>>sq(4)
16


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

>>>from square import*
>>>square(4)
16
>>>sumofsquares(4,4)
32


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

18 септември 2008

Безплатни онлайн курсове от Станфорд

Тук може да си изтеглите безплатни курсове и материали(задачи за домашни, изпитни материали) от Станфорд. Курсовете са 10 и обхващат различни теми, компютърни науки, роботика, електронно инжинерство, изкуствен интелект... Лично аз си тегля в момента всички лекции и тази година ще си ги гледам на mp4-ката.

"Python: червеното хапче" preview

Това доста тъпо заглавие което измислих, вдъхновен от матрицата, е на туториълът за който говоря доста от отдавна. Напредвам сериозно, вече написах почти половината от първата част, която ще е базирана на блог постовете които публикувах тук, но малко по добре написани, и поносими за четене. Ето бета версия на втора глава, която обяснява как се изпълнява код. Вчера я пренаписах за 3-ти път:


В тази глава ще ви запозная със основните неща които трябва да знаете. Вече видяхте как се изпълнява код. Сега по подробно. Кодът се изпълнява по 2 начина. Първия е като се пише директно в интерпретатора, този който започва със >>> . Другия начин е да се запишете кодът във файл, и да се отвори със Python. Файловете винаги завършат със .py. Когато пишем код директно в интерпретатора, ние ще видим резултатът веднага, но кодът няма да бъде запазен, той се губи в мига в който затворите интерпретатора. За да не се губи код, съхранявайте го във .py файлове. Стартирането е под Линукс е лесно, само отваряте интерпретатора и пишете python file.py, където file.py е вашата програма, интерпретаторът ще отвори файла, ще го изпълни и ще върне резултат. При уйнсолс нещата са малко по сложни. Вече споменах че можете да използвате IDLE. Препоръчвам ви да си направите папка директно във C:\, за да ви е лесно да я отворите. В нея ще съхранявате всичките си файлове, разбира се става и на всякъде, но аз предпочитам адреса да е кратък, за да не печатам много. Да речем, създайте папката с името mypython във C:(или ако предпочитане някоя друга папка) Сега пътят до папката е C:\mypython\ . Да речем че там сме съхранили файла от миналата глава, сега имаме файла C:\mypython\stupid.py, за да го стартираме имаме 2 избора, първия е със дясното копче на мишката да дадем edit with IDLE, след което даваме на Run->run module и би трябвало да видите изписан резултатът на екрана във другия прозорец с интерпретатора. Не е толкова трудно, сега по трудния вариант, макар и командния ред в уйндолс да е малко черна магия, всъщност нещата са доста лесни. Отворете command prompt-а от старт менюто, както виждате, той ви показва в коя директория се намирате. За да използвате командния промпт, първо трябва да добавите python към него, за целта напишете

path=c:\python25\;%path%

Това ще добави python към командния ред, и ще си спестите малко писане, сега можете да отворите файла stupid.py като напишете:

python c:\mypython\stupid.py


Готово, вече стартирахте програмата си. Малко много говорих за уйндолс, но предполагам че доста от вас ползват него. Ако искате да научите повече, поразровете се в нета.
Има още нещо което трябва да научите. Това са коментарите. Коментарът е текст, който интерпретаторът игнорира, той не се изпълнява от компютърът, а е само там за да могат програмистите да оставят малки съобщения за други програмисти, или за себе си за в бъдеще, нещо като малки бележки, например обяснение защо този код е написан така или бележка която да напомня че даден код трябва да се пренапише, или че има грешка в даден код. Ето как изглеждат коментарите:

#Този текст е коментар, той започва със знакът '#',
#всеки ред със решетка в началото си е коментар
#и се се игнорира от #интерпретаторът.
#Те могат да се разпространяват на много редове,
# но трябва всеки да започва с решетка

Има и още един вид коментари, със тройни кавички ''' '''(“““ “““ също става), който може да се простира на много редове:

'''Този коментар е на много
редове
само трябва текста да започва и завършва с тройни кавички'''

15 септември 2008

Даскалото почва, за щастие последна година!

Когато събереш хората от моя клас, обикновената дискусията протича по следния начин:

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

  • Дискусия за големия адронен корайдер

  • дискусия за теорията на струните(свързано с горното)

  • дискусия за квантовата физика и шанса да премина през една стена, определен от квантовата механика

  • дискусия за дядо коледа, дали е капиталист или социал декомкат, стигнахме до извода че е християн-демократ

  • дядо мраз и комунистите

  • северния полюс и комунистите

  • Дискусия за KRS One, ако не знаете кой е той, намерете си музиката му, той е философ и учител, и хардкор рапър.


Днешния блог пост е по кратък. Тъй като почва даскалото може да очакване 2 неша:


  1. Ще ъпдейтвам по рядко, около 3 пъти седмично, може и по рядко, или по често, зависи от това колко ми е напрегната програмата, не се сърдете, няма да ви липсвам.

  2. Ще пиша по технически неща, или най малкото една ли ще има блогове като този, или разни философски есета като предишния пост. Ако напиша нещо интересно обаче, ще го публикувам, просто няма да ми е това фокусът, блогът ми си е и винаги ще бъде технологично ориентиран.


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

14 септември 2008

Перфекционизъм

Перфекционизъм


Версия 4*

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

Какво е перфекционизъм? Преди време тренирах паркур. Основната идея във паркура, е че всеки може да прескочи парапет, важното е да го направиш с финес и елегантност, и да изразходваш най малко енергия. Идеята не е да правиш пируети и да се фукаш с трикчета, а да се придвижиш от точка А до точка Б най ефективно. Това е нещото което прави паркура освен спорт и изкуство. Перфекционизмът е стремежът да подобряваш това което правиш, в същото време опитът ти те кара да подобряваш самият себе си.

Започнах да се стремя към перфекционизъм от скоро, дни всъщност. Може би защото започнах да пиша повече, и забелязах че мога да се справя по добре, полагам толкова усилие. Програмиране, рисуване и блогване са 3-те ми хобита. Напоследък най много пиша, на второ място кодирам, и най малко рисувам. Преди винаги съм рисувал с химикал малки карикатури и комикси, сега рисувам с молив, и открих, че ползвам гумата доста често, очевидно стремежът към съвършенство се е пренесъл и там.

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

Не съм особено добър художник, или програмист, или писател(ър..блогер...ъ..не съм писател..) , постоянно уча нови неща и се стремя към подобрение. Ако сте чели по старите ми блог постове, повечето са УЖАСНИ, особено онези за Python, те са супер скапани, нищо чудно че вече пренаписах половината за pdf варианта на туториъла, те са просто ужасни и плачеха за редакция. Надявам се самия туториъл да стане добре, полагам доста труд.

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

Въпреки това, след няколко седмици(редакция: 1 час :D)ще отворя този документ и ше си кажа “Можех да се справя и по добре“, и все пак тази реакция е по добра от колкото сегашното “Как съм могъл да напиша това? Заслужавам анална клизма за наказание“. Това е нормално, ако нещо дори малко не те накара да искаш да го промениш, не си истински перфекционист.


*Първата версия беше половин страница, изхвърлих я напълно, втората беше 2 страници, от тези 2 страници остана само първите 2 параграфа, третата версия ми хареса и само леко я коригирах, когато я поствах, което означава че на практика това е 4-та версия. Писането общо отне 5 часа.

10 септември 2008

XKCD, или как се научих да не се притеснявам и да обичам математиката! част 1

XKCD е известен уеб комикс, създаден от Рандъл Мънроу . Рандъл е физик и програмист и супер забавен човек. А комиксът му е един от най популярните в интернетите(Джордж Буш така ги нарича "The Internets"). Този пост е посветен на XKCD и представлява списък на някой от любимите ми комикси, те са над 470 и продължават да растът със скорост от 3 комикса на седмица. Комиксът е за романтика, сарказъм, математика и език и е супер забавен.

Schrodinger

Това е 45-тия подред комикс, ако не разбирате от квантова физика поне малко, и ако не знаете за котката на Шрьодингер няма да разберете този комикс :D Също така не забравяйте да сложите мишката си на картинката, Alt- текстът който се появява го има във всеки комикс на XKCD

Science

Науката работи кучки! За да разберете това ви трябва това Става въпрос за фоновата радиация на вселената и т.н


Useless

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

Valentine - Karnaugh


И отново Wikipedia на помощ!


Abusive Astronomy

Обидна астрономия :D Задници!


Classhole

Задник от класа(класник!?!)

Su Doku

Бинарно судоку :D

Iambic Pentameter

http://en.wikipedia.org/wiki/Iambic_pentameter
Това почти ми върна интереса към литературата :D

Paths


Това и аз съм го правил :D

Digital Rights Management


Fuck the RIAA

Velociraptors


Авторът Рандъл има някъква фобия от раптори, и има основание, рапторите са опасни!!!

Gravitational Mass


Комиксът си се коментира сам.


Jacket

Това е супер смешно ако го преведеш на бг :D

Pwned

Ако CS беше текстова игра :D

Profile Creation Flowchart
'

Как се създава AIM профил :D


Binary Heart


и ние програмистите имаме сърца :D

Moral Relativity


Не е задължително за този комикс, но е добре да почетете малко Айнщайн

Parallel Universe



Един от най странните комикси.


Firefox and Witchcraft - The Connection?

всички които използваме firefox сме вещици, запомнете, библията е closed source :D


Riemann-Zeta

http://en.wikipedia.org/wiki/Riemann_zeta_function

Computational Linguists

това вече е малко прекалено :D


Pong

Това е просто брутално смешно :D


Centrifugal Force

Джеймс Бонд, физик :D


Blogofractal

Този изисква два линка:


http://en.wikipedia.org/wiki/Blogosphere


http://en.wikipedia.org/wiki/Fractal



dPain over dt

математиката понякога боли :D



Myspace


Мразя аутоплей!!! За това използвам flashblock.


Substitute

На живот и смътр!!! :D


Pointers

Някой ден трябва да си дочета K&R.


Join Myspace

моя акаунт не е ъпдейтванот както осъзнах че в Myspace няма нищо друго интересно освен снимки от концерти на някой банди които харесвам.


Mispronouncing

ф момента благвам това в моя уабсайт :D

Sandwich


най известния xkcd комикс!


Grownups


9 месеца и 10 дена съм официално възрастен, чувството е гадно.


Cryptography


трябва да чета повече за криптографията, тук имам бяло поле в главата си :D

Beliefs

Ако сред вас има креационисти, ищо, съществуването ви си е достатъчно наказание :D


Search History


и при мен е същото, но заменете раптори със бира.

Commented

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


Angular Momentum

романтика+наука=XKCD


Donald Knuth

Ако не знаете кой е Доналд Кнут->http://en.wikipedia.org/wiki/Donald_Knuth

String theory

http://en.wikipedia.org/wiki/String_Theory

откачена работа?!


Movie Seating

в alt-текста се споменава за пътуващия продавач, ако не знаете за този проблем:
http://en.wikipedia.org/wiki/Travelling_salesman_problem


Alice and Bob

отново криптография :D http://en.wikipedia.org/wiki/Alice_and_Bob

това са любимите ми xkcd комикси от първите 177 комикса, ако не ме мързи ще има и още части, но едва ли, това "част 1" в заглавието е просто застраховка че ако някой ден ми доскучее, ще имам извинение да препрочета комиксите по още веднъж :D

08 септември 2008

Import turtle

Открих един модул за Python наречен turtle. В момента пиша и туториъл за него, който ще бъде включен във pdf туториълът ми за Python който е базиран на поредицата от туториъли които постнах тук(само че добре оформен, с цветен код и повече инфо и екстри + още няколко глави, които може би ще постна и тук).

Та модулът turtle е доста интересна играчка, ако някой от вас знаят какво е LOGO, това е език за деца, при който се пишат команди с които се управлява една "костенурка" на един екран и се чертаят фигурки и такива неща. Страхотен език, учил съм го като малък, и когато открих модулът turtle, който позволява да се чертаят такива неща и в Python направо онемях и започнах да си играя веднага. Написах няколко функции които чертаят готини фигури. Първата функция чертае кръг, модулът има вградена функция за чертане на кръг, но тя е доста бавна, за целта пиша ето този код:

import turtle

def circle():
for x in xrange(360):
turtle.forward(1)
turtle.left(1)

първия ред импортира функциите в turtle(в туториълите не съм говорил много за модули и импортиране, но в pdf-а ще има инфо за това). След това функцията просто изпълнява едни и същи действия 360 пъти, чертае черта дълга един пиксел, след това променя посоката си с 1 градус, така след 360 итерации получаваме кръг. Това е доста яко, реших да видя дали можем да получим нещо по сложно, реших да начертая сложен кръг, съставен от малки кръгове, така че да прилича на спирала, за целта написах тази функция:

def ccircle(f):
for x in xrange(360):
circle()
turtle.up()
turtle.forward(f)
turtle.left(1)
turtle.down()

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

def cccircle(n):
if n:
ccircle(n)
cccircle(n-1)

Тук виждаме един доста готин трик наречен рекурсия, всъщност в туториълът този пример ще се използва именно за да се обясни рекурсия. На кратко докато n има някаква стойност(не е 0) ще се чертае кръг от кръг(ccircle) със аргумент n, след това ще се вика същата тази функция cccircle със n-1, по този начин това е нещо като цикъл, можем да получим същия резултат ето така:

while n:
ccircle(n)
n-=1

така n си променя стойноста, при всеки while. това отнема доста време, чертането е бавно, все пак ако дадем на n аргумент 5, това означава че първите 2 функции от circle()(turtle.forward(1),turtle.left(1)) ще трябва да се извикат общо 1296000 пъти, като включим 4-те функции от ccircle които трябва да се извикат 1800 пъти, нещата стават тежки, отнема минути, не знам точно колко, но определено ще ви доскучае ако го гледате как чертае. И сега да стигна до интересната част. turtle има едан функция turtle.fill() която може да запълва фигури, за да я запълни първо трябва да напишем turtle.fill(1) и след това да начертаем фигурата и след това да напишем turtle.fill(0) и фигурата ще се запълни. Ако опитате да запълните горната супер сложна фигура резултатът ще е трагичен. при мен(3.4 гх,1гб рам) за няколко минути целия ми комп замря, след това крашна python,bash,прозореца на който се чертаеше както и двата ми прозореца на firefox които бяха отворени. Явно да запълниш 648000 кръга е трудна задача :D

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

07 септември 2008

Диктатурата в Опън Сорса

Днес се замислих върху един аспект на разработката на софтуер, върху който в последните месеци не съм се замислял особено. Преди няколко години открих концепцията на отворения код и свободния софтуер. Като цяло идеята ми хареса, но какво разбира едно 16 годишно пишлеменце без понятие от програмиране? Преди близо 13 месеца преминах напълно на Линукс, и разбира се започнах да попивам още повече информация относно тази култура, която дойде с операционната система(културата в последствие се оказа много по благотворно за мен, от колкото самата система, всичко което правя на Линукс, го мога и на уйндолс, но я няма културата). Гледах всеки възможен документален филм, четох много туториъли, както и статии за културата, също така и технически такива. Най- важното от тях се оказа Как да стана хакер. То се оказа важно, защото ме вдъхнови отново да се занимавам с програмиране, дейност с която бях решил да не се занимавам, поради тъпи причини, най- важната от тях беше че ще ми се наложи да работя в офис, зад компютър докато се пенсионирам, със шеф и ще трябва да пиша код по цял ден и общо взето че ще имам скучна работа. Разбира се опън сорс-а ми отвори очите, че има и забавна страна на нещата, всички тези хора пишат код за без пари, най- вероятно е забавно? Защо ще го правят иначе. Това есе беше общо взето началото . По късно следваха есетата на Поул Греам. От тях открих още един начин да избягаш от така наречената “Ферма с кубчета“ , той говори за малки компании, стартирани от хакери, в които те имат контрол, а не мениджърите и хората в костюми. Тези компании наречени “Start-up's“ Са малки, езиците на които се пише софтуера са забавни и мощни(python, ruby), а не скучни и корпоративни(java,C#). Продуктите са интересни и полезни(reddit, youtube) а не скучни(windows, IE). Опън сорс софтуерът и старт-ъп компаниите имат много общи черти, и нерядко са полезни един на друг. Някой от общите им неща са:


  • И двете в повечето случаи се управляват от хакери

  • Като цяло са интересни технологии

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

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

  • И двата вида организации са очевидно непрофесионални. При опън сорса това е очевидно, повечето от тези хора са аматьори, които пишат код през свободното си време, всъщност това не е съвсем вярно, защото повечето всъщност са професионалисти, а на някой дори им е работата да пишат опън сорс. Вторите също са професионалисти, защото ръководят компания, но тази компания е малка и тези хора са предимно млади момчета със лаптопи в апартамент, или малък офис. Те не си говорят с пауърпойнт презентации, а си говорят докато пият кафе, не си обличат костюми, а си карат с дънки, не работят от 9 до 5, а когато им се работи. Последното изречение е горе долу вярно и за двете групи.

  • Много често членове на една група, са и членове на друга. Отличен пример са създателите на Django, уеб фреймуъркът за Python, който набира популярност. Създателите му Адриан Холовати и Джейкъп Каплан-Мос работели за малък вестник, когато създават кодът на това което в последствие се превръща в Django, днес Адриан има своя компания, но продължава работа върху опън сорс проектът си Django. Това не е изненадващо, тези хора са едни и същи, те са хакери, културата им е една, просто формата на проектите им е различна. Някой проекти просто трябва да са компании за да могат да оцелеят(youtube), защото имат нужда от силен централизиран контрол, а други не могат да оцелеят като компании(Django), защото опън сорс алтернативите биха ги смачкали(колко от любимите ви сайтове са написани на .net?)



Темата на поста е относно благотворителните диктатори. Може да сте чували термина Benevelont dictator for life(BDFL) Някой от по известните лидери в опън сорс обществото носят тази титла. Горните Адриан Холовати и Джейкъб Каплан-Мос са диктаторите на Django, Гуйдо Ван Россум е диктаторът на Python, Матц е диктаторът на Ruby, DHH е на Rails. Повечето опън сорс проекти имат нужда от някаква силна личност която да води проекта. В повечето случаи това е човекът започнал проекта, но това не е задължително. Няма да влизам в подробности относно вътрешната структура на различните проекти, Ерик Реймънд както винаги се е справил по добре от колкото аз ще мога някога.

Ето някой мои мисли които имах днес докато разсъждавах за начина по който тези проекти се ръководят, както и вътрешната структура на млади компании за които съм чел, както и мисли вдъхновени от горното есе:


  • Ето още нещо което е общо между опън сорс проекти и старт-ъп компании. И двете обикновено започват от един(или няколко) програмисти, със даден проблем който искат да решат. Без значение дали е липсата на добър опън сорс уеб фреймуърк за Python или липсата на свестен сайт за споделяне на снимки, или нещо от сорта, всичко започва с нечия неволя, като резултат обикновено проектите не започват със комерсиална цел, в много случаи дори и компаниите не започват с такава цел, а се превръщат в компании в последствие.

  • За да оцелее проектът в последствие той се превръща или в по голям опън сорс проект, или става компания, понякога става и двете едновременно(Ubuntu)

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

  • Диктаторът(или CEO-то) слуша внимателно какво казват потребителите, както и разработчиците, и взема решения базирано на това, понякога обаче не го правят. Ето това е взето от сайта на Python описващо това какво става ако общността не може да вземе консесусно решение по даден въпрос:


If a thread has gone on for dozens or hundreds of posts with no clear consensus emerging, one of two things will happen. Either Guido will make a BDFL pronouncement, which consists of him saying "We'll do it this way", or he's given up on the thread and isn't reading it at all any more. In either case, there's little point in continuing the discussion.


  • Работата на диктаторът/шефът е да движи разработката, и да не позволява на работата да замре, ако софтуерът не напредва като развитие и опън сорс проекта и компанията са застрашени от смърт. Ако Линукс спре да получава пачове, най вероятно ще минем на BSD(или ако сте BSD фенове, приемете метафората на обратно, ако FreeBSD спре да се ъпдейтва, минавате на OpenBSD или Linux)

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


Това е нормално в Старт-ъп модела, но опън сорса е демократична система, нали? Истината е че опън сорса не е демокрация, а дарвинизъм. Също като старт-ъп компаниите, опън сорс проектите трябва да оцеляват, трябва да се развиват, за целта им трябва силна воля, която големи общности трудно могат да предоставят(има изключения разбира се). Илюзията за демократичност идва от нуждата от опозиция, както и обратната връзка на потребителите, тези неща са много важни за “животните“ , каквито са опън сорс проектите и старт-ъп компаниите. Те нямат привилегията на монополисти. Истината е че те не си приличат само защото се управляват от един и същ вид хора, а защото средата им и опасностите които ги дебнат са близки, те не са от различни планети, за това е логично че и двете имат дробове с които да дишат, и имат очи с които да виждат, и имат нервна система, която е близка, общо взето и двата модела са земни и живеят в истинския свят, ако не живеят в истинския свят в повечето случаи умират(Gnu Hurd, pets.com).


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

06 септември 2008

Twitter имал полза

Може да сте чували за http://twitter.com. Това е популярен инструмент за микро-блогинг. Дълго време не се занимавах с него, защото ми е беше безполезен, много хора го ползват просто за да пишат какво правят, и тъпите им MySpace приятели да знаят какво правят, сякаш на някого му пука. Пример:

Мия си косата- 45 minutes ago

чопля си носа- 30 minutes ago

Сърби ме скротумът- 15 minutes ago

Може да видите че имам малък Twitter уйджет в блога ми. Идеята ми е че вече имам стабилно количество посетители(разбирайте че всекидневно поне 10 човека влизат тук :D) И сега вместо да ми се налага по междудругото в различин блог постове да пиша разни дребни новини, свързани с нещо което съм написал в някой друг пост по междудругото, просто ще преместя тази цяла линия от мисли в тои малък уйджет за малки новини свързани с това какво правя, и с какво се занимавам(няма да видите неща от рода на "Сърби ме скротумът" Освен ако не съм пиян. Повечето неща ще са новини свързани с блога, аз не съм много интересен(всъщност съм интересен, но не ми е интересно да се правя на интересен) за това ще пиша повече за нещата които правя свързани с блога или други мои проекти, от колкото за нещата които правя свързани с други дейности от живота ми, като личната ми хигиена и състоянието на скротумът ми. А сега просто за забавление, незнам дали знаете, но Twitter имаха доста проблеми с големия брой потребители които се бяха навлекли по едно време, и сайтът им досат често крашваше, като пародия на това ето едно клипче:

http://www.techcrunch.com/2008/08/08/the-rise-and-fall-of-twitter/

03 септември 2008

Yagcbp: yet another google chrome blog post

Въпреки заглавието този пост няма да е точно за новия гугъл супер джаваскрипт мега браузър, а за послредствията от него. Какво знаем за този браузър? Че ще е ефективен при много отворени табове, и че има нова супер мощна джаваскрипт виртуална машина. Това означава 2 неща, първо край на firefox краш-овете. Arena-bg има лошото свойство да срива браузарът ми когато отворя прекалено много страници на веднъж, въпреки че използвам flash-block за да блокирам огромното количество спам на тракера им. Ако изключа Flash-block нещата стават още по непоносими, защото сега и целия ми компютър(сравнително мощна машина работеща с Линукс) започва да се държи нестабилно. Сега този проблем е до някъде решен с chrome до известна степен, всеки таб е отделен процес, и джаваскрипт трябва да върви доста по стабилно, също така и ако някой таб излезе извън контрол, няма да крашне целия ми браузър, както става сега. До този момент firefox беше най- добрия браузър който съм ползвал, но най доброто беше супер скапано, крайно време е да се размърдат и да оправят лайняния си ураган наречен интернет. Със новата джаваскрипт виртуална машина, имаме шанс да видим нова революция в нета. Все повече и повече приложения се изнасят в облакът, един от най тъпите термини които някога съм чувал, по добър от "потокът" ако някой си спомня един от епизодите на "До краен предел" преди години, когато всички хора имаха чипове в главата им, които ги свързват с интернета, който се нарича потока, днес сме почти на това ниво. iPhonе-ът ни помага доста в това направление, ако можехме да имплантираме iPhone-а в главите си, животът щеше да е толкова по лесен(сериозно, намерете си "до краен предел" почти всички епизоди са брутално яки, а този с потока е направо предсказание за бъдещето, правен е преди идеята за web 2.0 да излезе, така че говорим за качествена научна фантастика). Всичко това със тоя облък и тоя хром и тоя i телефон и всички тея втори версий на нещата накара много хора да се занимават със една тъпа тема. От известно време хората започваха да определят браузърът като новата операционна система, твърдейки че скоро няма да има много значение на каква система работиш, дали е линукс, макинтош, уйндолс или iPhone-а, или чип закован за челото ти, важното е че всичко някой ден ще се върши на сървърът и ще ти пращат просто html-страници. След това се появява AJAX и ОУ МАЙ ФЪКИНГ ГОД колко ужасии съм виждал. за всеки добър AJAX сайт има 100 сайта тип "Вижте ме, имам javascript и хвърчащи букви" Десет години преди тези хора имаше едни други хора които правеха сайтове тип "Вижте ме използвам blink html таговете и анимирани gif-ове и имам мигащ текст и дразнещи реклами" После се появиха и сайтове тип "Вижте ме, имам FLASH и сайта ми се зарежда 4 минути!". Blizzard на теб говоря, трябва да направите toggle flash по видимо, или направо да разкарате flash-а, не всички живеем в Корея, и не всички имаме достъп до гигабитови интернет връзки!(това е преувеличение разбира се, но аз живея в град където за 20 лева получаваш 10 пъти по малко от колкото получаваш в софия за същите пари, говорим за интернет достъп).

AJAX означава "Джаваскрипт вече работи", разбира се има някой много готини AJAX сайтове, но в много случаи може да се мине без помията. Разбира се сега AJAX и Chrome променят малко играта, идеята за облакът е че приложенията ще работят на сървърът, а браузърът ще е просто интерфейса. Нещата се променят сега, когато javascript не само работи, но работи като хората. Това отваря врати към възможността да набутаме още говна в браузърът, но и също така да родим гениални приложения, разбира се съотношението както винаги е 100 към 1 в полза на лайняния отбор. По мое мнение хората които се надяваха десктопа да умре и да набутат всичко в облака, малко са преебани, защото сега браузърът става десктопа, а облакът е просто облакът който е още един инструмент и ресурс до който потребителят има достъп. Вместо KDE вече ще ползваме Chrome и вместо c++ ще ползваме javascript(Някой хора се радват че няма да им се налага да пишат C++, но хора като мен се ужасяват, защото ще трябва да пишем javascript, сами преценете кое е по лошо). Тези нови тенденций накараха разни хора да се замислят за предефиниране на терминът "Операционна система", вече операционната система от програма която управлява ресурси и прави връзка между хардуера и приложенията, се превръща в браузър, който управлява ресурси и осъществява връзката между Low-level операционната система и уеб приложенията, които се изпълняват в браузърът. Това е БулШит! Ето статията от която разбрах за тези циркулиращи идеи(преди само го бях чувал като метафора, но не и като реално предложение за терминология)

Тази статия беше постната на Hacker News и нялокло минути след като я прочетох написах първия коментар:

http://news.ycombinator.com/item?id=293816

за сега имам най много положителни гласове в цялата тема:

http://news.ycombinator.com/item?id=293792

Превод на коментарът ми:


Вече има термин за това в какво се превръща браузарът:

http://en.wikipedia.org/wiki/Operating_environment

Защо хората се карат? Вместо приложението да работи върху Х или в Bash, ще работи в браузърът, няма смисъл от спорове.

пп Всъщност си измислих термина "оперативна среда" И като го проверих в гугъл, той вече го е имало


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

Истината е че в началото беше шел-а, Bash и още куп други, по късно се е създаден Alto PC-то(технически погледнато е било доста преди bash и дори преди Bourne Shell) и начинът по който използваме компютрите си се промени(е от 68-ма до 84-та има един период в който повечето хора дори не са чували за домашен компютър, а после период от 84-та до 91-ва когато повечето хора не са чували за мишката, но все тая). След това е измислен Х, и по късно KDE и Gnome за уникс, както и windows за DOS се появяват, това всичко за оперативни среди, нещо в което ти работи програмата, днес имаме доста оперативни среди, всякакви, почти всеки различен модел телефон си има различна оперативна среда, а уникс света е разпилян на десетки уйндол мениджъри и шелове, програмирането на истински мулти-платформени приложения беше ад. 90-те, странното е че през това десетилетие 90%+ от програмистите пишат за една единствена платформа(днешно време предимно игнорирана) Проблем няма, повечето хора си пишат С++ за win32 и не се притесняват. появата на мобилни устройства направо ги разтърсват, windows CE се появява и се проваля, и това странно нещо интернет също се появява, но не се проваля, хората които не го разбират се провалят(.com мехурат е причинен най вече от тъпи ню-йорк бизнес курвета, не от лоша технология, ако сте гледали филма Август, хора като главния герой са виновни). Идва Sun, и JAVAAAAAA, "най после език от който не ме боли десния лоб" Възкликнали умните C++ програмисти, "най после мултиплатформена система за програмиране на мулти платформени решения" казали тъпите C++ програмисти, "Sun Sux" казали Unix C++ програмистите и си продължили живота. Java се проваля в ролята си на език за писане на приложения които да работят в браузарът, поради няколко причини, първо Java съкс, и Sun съкс, второ тогава интернет връзката е била по скапана, и трето по дяволите, някога да сте ползвали Java аплет в нета? Не съм виждал свестен Java аплет в живота си, всеки един е бил боклук, и не е работил както хората, понякога не е работил с нищо друго освен IE6. И за това години наред хората си мислят, няма проблем, ще напишем perl скриптове които да генерират html-а и cgi скриптове за да ги пращаме до браузърите и така се ражда идеята за облакът. По късно идва php и лайняния ураган става все по мощен, после идва и RoR и в лайняния ураган започват да хвърчат и рубини, но кой иска да е сред ураган в който остри рубини хвърчат с 200 километра в час във всички посоки? да не броим и лайната. Javascript е само едно от проклятията на нета и само един от различните цветове говна в нета. Crome е една от първите стъпки да укротим този лайнян ураган, от милиони некадърни php програмисти, и от милиони ужасни флаш сайтове, и отекуп ужаси. Ето лошата страна, тези неща няма да изчезнат, просто ще се появят повече рубини и повече качествени приложения, така че ще имаме избор и ще можем да игнорираме лайната. А какво е бъдещето на десктопа? Близкото бъдеще е много добро, някой виждал ли е на скоро KDE? Красота! Уеб приложенията няма да могат да настигнат много от функционалността на десктоп приложенията с години, едва ли ще видим QT еквивалент написан на javascript скоро(Говоря не в смисъла на javasript библиотеки, а за javascript библиотеки със еквивалентна мощ и леснота на разработване). Също така ще отнеме известно време докато се появят и други скриптови езики за браузарът, за сега Ruby и Python се използват за server side програмиране, а javascript е за client side, кога ще можем да пишем изцяло на Python всичко от моделите, до интерфейса в браузарът? Нещата са близо и има положителна разработка в тази насока, вече дори може да се ползва Ruby заедно със Crome javascript виртуалната машина(и е по бързо от оригиналното ruby) Нещата изглеждат добре, Скоро ще имаме мобилност и компютри които струват 50 долара ще имат същите възможности като този за 500 долара сега, или поне за потребителска работа(офис, филми, музика) iPhone-ът е първата стъпка. Информацията ти ще е по сигурна защото ако си изпуснеш лаптопа, имаш 10 бекъпа в нета, и имаш безжичен интернет почти на всякъде къдет оима цивилизация. Дали друг подобен лайнян ураган като уеб ураганът от 90-те и 00-те(иронично е че всеки век започва с знака за тоалетна, един вид започваме добре, означава че миналия век сме се хранили добре) е възможен, но не ми се занимава да предсказвам далечното бъдеще, нямам представа какво ще е то.


пп Вече работя върху pdf версия на python турориълът ми, ще бъде редактирано, ще има синтактично оцветяване и още материали които не съм поствал тук, очаквайте до края на седмицата, ако не ме пребият някъде преди това, или ако не се напия прекалено много утре и в други ден, и в по други ден.

02 септември 2008

Любими песни от лятото

Лятото е към края си, и реших да си направи кратък списък с песните които слушах това лято. Last.fm е удобен инструмент, но информацията от сайта е сортирана, така че да има тематичон летни песни в нея, както и няколко песни, които не съм слушал много лятото, но определно ми харесват. http://www.last.fm/user/Pavelludia/charts?rangetype=3month&subtype=tracks тук може да видите песните които съм слушал през последните 3 месеца, това е пълен списък, от тях сега ще отделя по летните :D

1. Sublime – Burritos слушана 34 пъти за последните 3 месеца, това не включва мп3-ката ми разбира се :D Доста готина песен, на една мнооого яка банда! Сублайм общо взето бяха лятната ми банда, това лято бяха с мен всеки ден, докато закусвах, докато четях, докато спортувах, докато спах дори(когато спа през деня, ако съм изморен, си оставям музиката да свири). Любима банда, въпреки че и слушам от сравнително скоро.

2. Sublime – Pawn Shop 25 пъти слушана песен, отново сублайм

3. Q-check – Смокиня. Невероятна банда на име Кю-чек(точно така се казва бандата, и не е случайно) Енергичен пънк, смесен със ска и реге, и малко диско и поп- фолк за вкус(извратено :D) готина банда, с готини песни, мисля че трябва да ги има из нета безплатно някъде, намерете си ги, не съм чувал подобна банда никога!

4. Joey Ramone – What a Wonderful World От скоро слушам и The Ramones, първата пънк банда, доста готина песен, кавър разбира се, изпълнена от Джоуи Рамоун, вокалиста на The Ramones. I see skies of blue, and clouds of white...

5. Jimi Hendrix – Purple Haze О Джими, трябва ли да споменавам повече?

6. Уйкеда – Да Живее Революцията. Уйкеда разбира се, и тази невероятна готина песен, освен лятно, тропическо и революционно звучене, тази песен има и разбира се известна романтичност, особено за нас, хората вдъхновени от различни исторически революций, макар и понякога да ни е нужна известна мъдрост за да преценим последствията от тези революций, пак е по добре да ги има, динамичноста е важно нещо, застоялата вода освен жабуняк, друг живот няма!

7. Q-check – Махмурлук блус. Отново Кю-чек, тази песен наистина е кючек, защото след известна пънк/ска/регге част в началото, започва пънк/ска/регге кючека със елементи откраднати от великия АМЕТ!!! Да чуеш Гъци Гъци съпроводено от брутални китари и мощни барабани е наистина освежаващо, и трябва да знаем че ние, хората обичащи музиката, не трябва да мразим чалгата, а трябва да и се смеем, друго не заслужава, трябва да се смеем и да се наслаждаваме на живота, без омраза към чалгата, само с подигравки :D

8. Обратен Ефект – Колю Пияндето. Някой спомня ли си тая банда? Разбира се че ги помните, лятото е перфектното време да си ги спомните, да живее ска/регге/пънка!!!

9. Mark Foggo's Skasters – What a lovely day for a hanging Тази много готина ска банда трябва да е на списъкът на всеки ска-маниак, защото марк фогго и неговите скейтъри разбиват, макар и тази песен да не е най-емблематичната им(по любима ми е тази за хашиша) пак е невероятно готина!

10. Обратен Ефект – Плис-ПЛИС Морски Бриз. Отново Обратен ефект, и този път със друга тяхна невероятна лятна песен.

11. Q-check – Шопска салата. Може да сте чували тази песен, пее се нещо от сорта на "Обичам шопската салата, мастика ледена да пия..." На татъка не знам текста, това е някъква чалга пак, но разбира се в ска-регге вариант звучи супер невероятно мега унищожително ЯКО!

12. The Paley Brothers/Ramones – Come On Let's Go Тази песен е вероятно по стара от вас, Тази версия е записана през 79-та година от тандема The Paley Brothers/Ramones, Рамоунс свирят инструментала, а другите там са по вокалите. Оригинала е написан и изпълнен от Ричи Валенс(Ричард Валенсуела) Може да сте го чували, през 50-те записва La Bamba, Donna и тази песен Come on let's Go, този кавър на The Ramones е приличен, и ме кефи доста, рокен рол форевър!!

13. Bob Marley – Redemption Song как може да минем без Боб марли? Очуден съм че съм слушал толкова малко боб марли лятото, повече го слушам на mp3-та и за това вероятно го няма никакъв във класацията ми.

14. Crowfish – Apart. Момчетата от варна са доста готини, макар и да не слушам точно този стил много, и макар и да не слушам точно тази банда много, все пак ги смятам за яки.

15. Уйкеда – А ми да не би да съм се пак объркал Отново уйкеда, и отново невероятна песен, в тази се пее за изгревите, през седмицата в която се будех в 5 сутринта, защото не можех да спа през ноща(незнам защо, но една седмица просто не можех да спя) досат често посрещах изгревите с тази песен.

16. Уйкеда – Уйски с фъстъци Отново уйкеда, уйски с фъстъци, супер песен, и на мен ми е кофти че пия сам понякога :D

17. Plastic Bo. – Шахта. След бутилка и половина, люта гроздова ракия, кющата си да намеря, тръгнах смело на бургия, тротоара ляв не давах, и десния си беше мой, след паважната екзема, сякъш бях участник в бой, лошо е да пиеш нещо, с градус близък до бензин, после я прегърнах страстно и целия останах син" СУпер банда от Асенов град, дори имам последния им албум на оригинално СД, заслужава си парите!

18. Jimi Hendrix – All Along the Watchtower Отново Джими, Никой не може да го надмине, никога!

19. Sublime – Smoke Two Joints Песен, която доста често се присвоява на Боб Марли, не, той няма такава песен, оригиналната песен е от The Toyes, и е написана през 83-та, кавърът на Sublime има едно изпълнение на живо, при което гласът на Брадли Ноуел(вокала на Sublime) малко напомня този на Боб Марли, но не е негова песен. Може да ми вярвате, ако не на мен, то на уйкипедия http://en.wikipedia.org/wiki/Smoke_Two_Joints

20. Plastic Bo. – Старата пловдивска Свършвам отново с Plastic Bo. тази песен, за разлика от повечето гореспоменати, я притежавам легално, чрез СД, купено, с пари, да! Голям кеф е да слушаш тази песен във Flac, вместо във гадния mp3 формат!!


И така, ако погледнете профиал ми в last.fm и линкът от горе, ще видите че това лято съм слушал доста по тежки неща, които не бихте си пуснали на плажа докато лежите и пиете мастика. И все пак не ми пука! Обичам всякъква музика, видяхте, дори и чалга до някъква извратена и ограничена степен :D Да живее Хардкора, пънка, регето, ска-то, хип-хоп-а, джаз-а, рокенрол-а, блус-а, метъла(щях да го забравя) и всеки друг откачен стил който слушах това лято!

Първи стъпки в програмирането с Python. част 8. Нещата от живота

Index:
1.Интродукция
2.В началото бе словото
3.Ю толкинг ту ми?
4.Ужаст и страхопаника
5.Императорът и дракона
6. Драконът и Императора
7.Писна ми да измислям тъпи имена


8. Нещата от живота

Стигнахме до последната част от каквото и да е това което го пиша. Днес ще говорим за нещата. Какво е едно нещо? Ами това е нещо което има някакви свойства, може да правиш нещо с него, и понякога то самото може да прави нещо. Какво е свойство? Това е също нещо, свойствата също имат свойства, може да правиш неща със свойствата и понякога те самите могат да правят неща, А какво е "Способността на нещото да прави" нещо? също е нещо, също има някакви свойства и също може да правиш нещо с тази способност на нещата. Обърках ли ви? Това е обектно ориентираното програмиране: Най лесния начин да си заслужиш боя, като напишеш програма, 80% от която е ненужна архитектура и изпълнява просто административна функция. Кой ще те бие ли? Всеки който има нещастието да работи с теб някой ден :D До тук с абстракциите.(чети от тук на татък почвам с истинските абстракции, а не абстракции на абстракциите)

В обектно ориентираното програмиране най основния елемент е така наречения клас. Класовете са един вид описание на нещата, на обектите. В python на теория всичко е обект, защо само на теория? Няма да ви обяснявам, вече сте достатъчно объркани. Обектите имат свойства, които в някой езици се наричат точно така, "свойства" или properties, в python обаче им викаме атрибути, т.е. нещо което принадлежи на обекта. Обектите с които можеш да правиш нещо с класовете, и способността им да правят те самите нещо се наричат методи. Вече разглеждахме тези неща, методът е подобно на функция нещо, което се съдържа в класа и или променя самия клас, или извършва някакво действие в зависимост от класа. Да разгледаме един клас:

class classs:
i=1222
def pp(self):
return self.i


Този клас на име classs има един атрибут и един метод, атрибутът i е равен на 1222, а методът му pp връща този атрибут. Методът се дефинира също като функция, само че първия аргумент е self. Няма да разберете self ако го обясня точно сега, ще ви стане ясно след момент. Класът е просто описание на нещо, той обяснява как нещо работи, какво има в това нещо и как се казва класът от такива неща(от там идва и името на конструкцията). За да имаме наистина нещо с което можем да работим трябва да го създадем, използвайки класът като негово описание. Това е по просто от колкото може да си представите:

>>>x=classs()
>>>x.i
1222
>>>x.pp()
1222

Действието от първия ред се нарича инстанциране, т.е. създаваме обекта тип classs. Сега х е обект и има атрибут i и метод pp() до които имаме достъп. както виждате от горния пример. Сега е времето да обясна self. Това е нещо като псевдоним за името на инстанцията. Методът pp() трябва да ръвне като стойност един от атрибутите на x, но понеже това е само описание на обекта, а не истинския обект, не знаем как ще се казва той, за това първия аргумент на методите винаги е self, за да имаме достъп до имената в обекта(в случая това е x но е същата файдата като sluchainoimenaobect, все ти трябва self). Това self дразни много хора, разбира се на мен не ми пука, защото не пиша много обектно ориентиран код, и ако мога го избягвам(невъзможна задача понякога, или поне непрактична).

Вече ви обяснявах за средите и за пространствата от имена, класовете в своята същност са точно това: среди с имена. В тях се съдържат имената и дефинициите на методите и атрибутите, единствената разлика е че сега е в отделно пространство от имена, както при функциите, ако си спомняте, там всяка променлива е локална, вътре във функцията, тук тези променливи са локални вътре в обектът. Достъп до тези имена имаме чрез точката x.i означава "дай ми i, който е от пространството x" Без значение дали е от клас, или модул. Не съм обяснявал модулите, но на кратко това са файловете с .py на края, в които си пишете кодът, те са модули, и също са пространства от имена, като класовете и също съдържат имена и променливи(тези които вие пишете). Всъщност класовете и модулите са на теория почти едно и също нещо, контейнер с имена и функции. Може дори да слагате вътрешни класове в класовете си, те са един вид отделни програми(или поне така може ад мислите за тях). Не знам тук какво успяхте да разберете от това обяснение, но когато аз учех тези идеи не ми беше лесно. Не случайно ви обърках в началото, защото наистина е объркващо. Веднъж схванете ли простите концепции обаче, ще разберете че обектно ориентираното програмиране в същността си е тривиално. Поради тази причина и е доста често експлоатирано по нехуманни начини, но в повечето случаи лош обектно ориентиран код не означава катастрофа, а по скоро купчина неприятности, които просто се трупат, и не могат да навредят докато не се натрупат МНОГО. Убунту има 46433(правилно сте прочели) бъгове, и това са само отворените, има около 21342 непотвърдени, и от всички тези само 28 са критични, трябва да благодарим на обектно ориентираното програмиране, където бъговете са трудно доловими и лесни за постигане, с достатъчно невнимание. За да не е сухо съвсем вашето дърво със знание, да го напоим още малко, със знание за наследяването. Да речем че имате един тип нещо, и искате да имате друг тип нещо, който е като другото, но по раклично, да речем, имате клас голф, и друг клас мерцедес, те са общо взето същите, само че мерцедесът има друга цена :D, може да създадем един клас car и два субкласа golf и merc:

class car:
type="automobile"
country="Germany"
def action(self):
print "moveing"

c=car()
>>> c.type
'automobile'
>>> c.country
'Germany'
>>> c.action()
moveing
class golf(car):
def action(self):
print "moveing loud"

>>> g=golf()
>>> g.action()
moveing loud
>>> g.type
'automobile'
>>> g.country
'Germany'
class mercedes(car):
def action(self):
print "moveing with style, bitch"

>>> m=mercedes()
>>> m.action()
moveing with style, bitch

class golf3(golf):
def action(self):
print "chalga, bitch!"

>>> g3=golf3()
>>> g3.action()
chalga, bitch!
>>>

Да видим какво разбрахме от тук, мерцедес и golf са коли, те са от германия и са тип автомобил, също така колата се движи, голфа се движи шумно, а мерцедесът със стил, имаме и golf3 който е тип голф, който освен шумно се движи и с чалга! Виждате добре синтаксисът и вероятно разбирате че това е умствен модел, за това какво ние разбираме под нещо, което съществува. Можем да си мислим колкото си искаме, за компютърът този модел е само пространство от имена, със методи и атрибути, които ние може да наричаме така, но те са просто променливи и функции. Става въпрос за мислене, ние възприемаме света като изгладен от тези неща които съществуват, а в програмирането работим със абстрактни концепции, които не съществуват извън нашите глави и в представата на компютъра за нашето разбиране. Всичко което използвате като софтуер, е просто метафора, за инструмент, нещо което ползвате за да постигнете нещо. И ето с какво ни оставя обектно ориентираното програмиране на края:

С много мощен инструмент за моделиране на обекти от истинския свят, система за абстракция, която може да се използва по много гъвкави начини, както и много прост синтаксис, бихте се съгласили с мен че класовете имат по прост синтаксис от изразите генератори, да речем. Също така имаме начин да създаваме свои инструменти за работа в самия език, можете да напишете своя версия на списъкът, който да им само 10 елемента, а не безкраен брой, знаков низ, който да може да се променя на място, и да не е непроменяем, както е сега в езикът. Разбирате за каква мощ говорим нали? Обектноориентираното програмиране е инструмент, но трябва да сте мъдри с него, той не всемогъщ и всезнаещ и всеможещ, и лесно може да се увлечете в програмистка авантюра и да произведете код, който буквално прилича на спагети.


Изход: Това беше последната част от тази поредица за python, имам план да я вкарам в едно лесно pdf-че и може би да поразширя съдържанието и да оправя някой гафове в другите части, така че да става за четене, също така ще има и други поредици, python е единствения език за който мога да блогвам, този наръчник едва ли ще е много полезен за всеки, той е върхът на върхът на върхът на айсберга, но python е толкова прост, и толкова прозрачен, че под водата няма много айсберг, така че ако подхванете сериозно езика, едва ли ще бъдете изненадани прекалено много от него. От тук не можете да научите езика, идеята беше да направя нещо като въведение, така че ако някой се интересува от езика, да го изгоня с правописните си грешки и лош стил на писане, и ако наистина е мераклия да го накарам да търси другаде материали и да се научи добре на езика. Python е лесен и забавен език, писането на това беше забавно, дори никой да не го харесва, пак беше забавно и се накефих, също така открих колко скапан е blogger редактора за писане на код в него и форматирането му правилно. Майната му, pdf-а ще си има и оцветяване и всичко :D Майната му на html!

01 септември 2008

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

Index:
1.Интродукция
2.В началото бе словото
3.Ю толкинг ту ми?
4.Ужаст и страхопаника
5.Императорът и дракона
6. Драконът и Императора





7.Писна ми да измислям тъпи имена

Днес бях обещал класове, Всъщност като се замисля май не обещах нищо, така че ще си позволя вместо с класове, днес да се запознаем с функциите генератори, с изразите генератори, и с генератори на списъци. Също ще засегна малко и темата за итераторите. Май стана много.
И така, спомняте си как можем да използваме for за да преминем през всички елементи на дадена последователност, това се нарича итериране. Итераторите са обекти които имат метод next(), т.е. обекти които дават някакъв резултат, когато извикате методът next() върху тях. Не съм обяснявал методите, но на кратко, това са тези неща, които приличан на функций, които следват след даден обект и точка след него, да речем имаме списък x=[1,3,2,4,6,5] и след това напишем x.sort() и ще x ще е преобразуван на [1,2,3,4,5,6], това е различно от функциите, защото методите са вътрешни на обектите(числа, списъци и т.н.), а функциите са външни, в повечето случаи методите променят самия обект, а функциите връщат друг обект като резултат(това не винаги е така). След краткото обяснение на методите, да се върнем на итераторите. Същия този списък x който сега е [1,2,3,4,5,6] ще го направим на итератор, както прави for цикълът.

>>>x=iter(x)

x сега е итератор, можем да използваме методът next() върху него:

>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
4
>>> x.next()
5
>>> x.next()
6



както виждате, методът next() връща следващия елемент от итератора, по този начин ако има много елементи в списъкът, for ще е по бърз като изпълнение, защото само по 1 стойност от списъка се обработва на веднъж, вместо целия списък. Това има по общо приложение.

Генераторите са подобни неща, те са функции, които вместо return използват думичката yield. "Само това ли?" ще си кажете вие, и "Не съвсем" ще ви отговоря аз. Тази функция, която използва yield вместо return връща обект генератор, който е като итератора, т.е. можем да минем през него с for и можем да използваме метода next(), всеки път когато бъде повикан този метод, получаваме генерирана стойност. Да видим подобен пример:

def gen(list):
for x in list:
yield x


когато повикаме функцията x=gen([1,2,3,4,5,6]) получаваме x който е генератор:

>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
4
>>> x.next()
5
>>> x.next()
6





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

Сега ще поговоря малко за list comprehentions или генератори на списъци, и изразите генератори(genrator expretions). Първите се използват по често от вторите, ще ги обясня и двете. Горния примерен х може да бъде получен и по следния начин:

x=(x for x in xrange(1,6))


тук (x for x in xrange(1,6)) е израз генератор, генераторът се слага в кръгли скоби и в него се пише изразът x for x in xrange(1,6), това е малко слошно за обяснение, ето как може да се прочете, за да ви е по ясно, "дай ми x за всяко x във интервала от 1 до 6, и го сложи в генератор. Това ще ви стане по ясно, като обясня генераторите на списъци. Те имат почти същия синтаксис, но се пишат в квадратни скоби вместо в кръгли([]), и връщат списък вместо генератор, ето как:

>>>x=[x for x in xrange(1,6)]
>>>x
[1,2,3,4,5,6]


сега разбирате ли? "Направи списък в който всеки елемент е елемент от обхвата 1 of 6", можем да го направим да създава списък със четни или нечетни числа по следния начин:


>>>x=[x for x in xrange(1,6) if x%2 != 0]
>>>x
[1,3,5]


Този код връща само нечетните числа, чете се "създай списък, в който всеки елемент е елемент от обхвата 1 до 6, ако остатъкът от деление с 2 е различен от 0" Спомнете си делението с остатък, ако разделите 4 на 2 няма остатък, но 3 делно на 2 дава остатък 1, ако сте в 2-ри клас де :D Това прави операторът %. Същото става и със изразите генератори, само че вместо списък ще върнат генератор който има само нечетни елементи.

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