08 януари 2009

Последен пост!

Този блог е мъртъв. Новия ми блог може да бъде намерен на:

http://trikolka.blogspot.com/

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

07 януари 2009

Ново приключение!

Понеже вече нямам особено много време за блогване и програмиране, реших да пенсионирам този блог. Първият пост тук е направен на 25 Юли 2008 година. Това е доста време. За това време сайтът е посетен от 1213 човека. Мамка му! Средно по 300 на месец! 60% от тези хора са влизали тук само веднъж. Тяхна загуба. 14 човека сте влизали повече от 200 пъти(вие не спите ли бе :D). Този блог е първия ми сериозен опит в блогерството. Въпреки усилията ми имам чувството че не успях да постигна много. Целта на този блог е била да се науча да блогвам. Научих се вместо това да пиша(полуграмотно) интересни неща. Научих доста неща за публиката ми(благодарение на гугъл аналитикс) и също така научих много неща за себе си.

Въпреки че пенсионирам блога, аз далеч не съм готов да се пенсионирам. Това че съм доста зает сега с учене не означава че няма да намирам време за блогване, дори съм по убеден че трябва да намеря такова време. Много скоро ще стартирам нов блог с който смятам да ви сритам шибаните задници! Точно така, новия блог ще има супер сили, като например ще може да говори с риби! :D

Искам да благодаря на svejo.net за тези 60% от 1213 човека, които са посетили сайта ми само веднъж! Повечето са от вас :D Другата част, макар и по малка, е по важна за мен, и смятам да даря тази аудитория със супер мега екшън блогинг!

Искам да благодаря на тези 14 човека които са влизали в сайта ми повече от 200 пъти! Сериозно, макар да сте само 0.75% вие сте най важните :D

В крайна сметка този блог е провал, но беше забавен провал. Готов съм за следващия си провал. Дано е интересен провал. Имам чувството че ме чака провал, но...

03 януари 2009

Може би последния ми проект до лятото приключи...

Тази ваканция беше най яката от години. Миналата беше доста яка, защото отидох на хардкор феста в София, но това беше 1 ден и ми струваше 20 кинта. Тази година обаче удоволствието дойде от продуктивността, която демонстрирах.

Още от ноември се чудех какъв проект да подхвана за ваканцията. Първоначално си мислех за всякакви щуротии, които нямаше да мога да свърша никога, пък камо ли за 10 дена в къщи. В последната седмица преди ваканцията реших да науча Common Lisp. Вече знаех Scheme и реших че няма да е толкова трудно, отворих Practical Common lisp и прочетох първите 2 глави, след което се отказах. Ето как мина процесът. Докато четох книгата се сетих че вече знам Scheme и ще е добра идея, вместо да си губя времето в учене на нов език, да взема да си изцапам ръцете и да напиша нещо на scheme. Реших да е някъкво уеб приложение, защото това е модерно сега. Като отворих документацията на plt scheme се сетих че вече знам python много по добре от колкото знам scheme и че ако искам да свърша нещо за 10 дена, ще трябва да е на python. След като избрах любимия ми език python за основа на новия ми проект, реших да го напиша използвайки cherry py, известен http фреймуърк. Изтеглих си една книга за него и започнах да чета. След около половин час реших че вече имам малко опит със Django, една от най популярните python уеб фреймуърки и че би било глупаво да програмирам на нещо толкова low-level като cherry-py, освен ако наистина нямам нужда от предимствата на минимализмът му. И така в рамките на 2 дни преминах през целия този процес и реших да напиша новия си супер сайт на python със Django. Този проект го бях мислил още септември, когато излезе Django 1.0, но за съжаление в същия този месец се появи гадното даскало и нямах особено време(всъщност имах, но обичам празните извинения).

И така проектът ми за блог със Django се върна от света на мъртвите и започнах работа по него. Първите 2 дена от ваканцията четях документацията на Django, туториълът им е доста добър, преминах през него, и на края ми казаха че това е било само 10% от документацията!!! Стресирах се от това колко още имам да чета и си изтеглих всички епизоди на "Терминатор: Хрониките на Сара Конър" и прекарах 2 дни гледайки това. Бих го нарекъл супер прокрастинация. След като изхабих 2 дни в зомбирано състояние(22 епизода със една почивка от 5 часа да се наспя, по средата) се върнах към джанго. Започнах да чета за HTML и CSS, имам само повърхностни познания по HTML и почти никакви познания по CSS, след като прегледах сорса на няколко сайта, имах от къде да започна, и написах шаблона за сайта ми. 2 дни го работих. Може да се каже че като първи опит се е получил прилично, но истината е че е говно и за това няма да ви покажа как изглежда. Също така изглежда още по зле под IE6 и firefox под уйндолс, въпреки че е направен за firefox на линукс, проблемът е във шрифтовете, но ме мързеше да ги оправям.

Следващите 2 дни работих върху бекенд-а на сайта. Django е цар тук, кодът който трябваше да напиша за да имам прост блог беше супер малко! Ама наистина малко. Както туториълът си го казва:

Take a few minutes to marvel at all the code you didn't have to write.


Повечето време само четох документация и почти не писах код, въпреки това имам напълно функционален блог. Вчера реших че няма да го хоствам никъде. Доволен съм от Blogger, а и беше забавен проект, научих доста, а и нямам нерви да доразвия кода и да поддържам сайта, за това по добре да го оставя като добър спомен, и да премина към други предизвикателства. И така след като няколко месеца си търсих извинение за да не се занимавам с Django, изведнъж този проект все едно се бореше да се роди, бореше се 2 дни и заради него не научих common lisp, не задълбочих познанията за scheme и не научих cherry-py, но за сметка на това разбрах че не ставам за уеб дизайнер, но доста хитро се справих със генерализирането на моделът ми за базата данни. Вместо да имам 3 модела за блог пост, есе и проект, написах само един модел за entry и добавих таг за тип, това означава че вместо да пиша 3 почти идентични класа, имах 1. За сметка на това CSS-а ми е супер грозен :D

Сега днес и утре са последните ми 2 свободни дни. 12-ти клас съм и няма да имам повече ваканции, имам да уча за матурите и наистина ми е кофти че няма да мога да се втурвам в подобни преживявания до лятото. Може би един от последните ми проекти преди ваканцията ще е през януари. А кой знае, може да открия начин да съвместя програмирането и ученето и да се забавлявам втория срок, като в същото време се подготвя за изпитите ми и т.н. Дори смятам да направя точно това, само че не съм преминал през детайлите, трябва да медитирам върху проблема. Знам само че това ще бъде жестоко лято!

30 декември 2008

Не слагайте сняг в сайтовете си!

Сериозен съм. Дори и wordpress.com/ имат шибан сняг на сайта им, ако това не беше достатъчно, фонът им е БЯЛ! Бял фон, бял сняг, имам чувството че ослепявам. Текста е нечетим. Не са само те, много сайтове слагат такъв сняг за "Празнично настроение". Майната ви, това не е 90-те и вие нямате право да ползвате сняг и нямате право да изполвате blink тагове в html-а си. Повече ме е грижа за очите ми от колкото за празничното настроение! Весели празници на всички останали, които имат акъл и не ни тормозят с "настроението си".

21 декември 2008

Бесеница в ~60 реда python код

Една от първите програми които бях написал докато учех python беше игра на бесеница. Мъчих се върху нея със дни и накрая се отказах. Вчера докато наливах бира и водка(голяма грешка) се сетих къде съм cгрешил преди толкова време и днес от скука написах кода. Сега ще го споделя, макар да е доста "бърз" и да съдържа някой доста не-елегантни части, работи и дори е забавно :D

hangman.py:


#!/usr/bin/env python
#-*- coding: utf-8 -*-

from random import choice
from hangman_lib import hang,wordlist

def find_index(word,char):
"""find all the positions of char in word"""
index_list=[]
for i in range(len(word)):
if word[i]==char:
index_list.append(i)
return index_list

def replace_letter(blank,word,char):
"""insert char in the positions, where char apears in word"""
index_list=find_index(word,char)
for i in index_list:
blank[i]=char
return blank

def inp():
"""validate input, only 1 letter per turn.
Also, some recurtion-foo at the end :D"""
i=raw_input(u"вход=>".encode('utf-8'))
if len(i)==1:
return i
else:
print "one letter at a time"
return inp()

def win(blank, word):
"""check if we win"""
if blank == word:
return True
else:
return False

def main(blank,word,lives):
"""main function, some more recurtion-foo here :D"""
print blank
if lives >0:
char=inp()
if char in word:
blank=replace_letter(blank,word,char)
if win(blank,word):
print "you win"
print word
else:
main(blank,word,lives) #recurse with new blank
else:
print hang[lives-1] #hang is the dict with the graphics
print 'you have %s lives left' %(lives-1)
main(blank,word,lives-1) #recurse with one live less
else:
print hang[0]
print "you lose!"
print word

if __name__=='__main__':
print hang[9]
word=choice(wordlist) #choice chooses a random item from a list
main(['_']*len(word),list(word),9) #blank is initialy only
# ["-"]*len(word)
#word is list(word),
#because blank is list
#and word must be list
#to compare them


а ето и другия файл hangman_lib.py(излъгах че е само в 60 реда, но лесно мога да събера целия файл на 2 много дълги реда:


wordlist=["boy","man","kid","worm","word","disk",
"hello","phone","desck","camera","python",
"marker","notepad","hangman","piramid",
"bullshit","hardcore","octopuss"]

hang={
0:
"""
_____
| |
| o
| /|\
| |
| /\\
|__________""",

1:
"""
_____
| |
| o
| /|\
| |
| /
|__________""",

2:
"""
_____
| |
| o
| /|\
| |
|
|__________""",

3:
"""
_____
| |
| o
| |\
| |
|
|__________""",

4:
"""
_____
| |
| o
| |
| |
|
|__________""",

5:
"""
_____
| |
| o
|
|
|
|__________""",

6:
"""
_____
| |
|
|
|
|
|__________""",

7:
"""
_____
|
|
|
|
|
|__________""",

8:
"""

|
|
|
|
|
|__________""",

9:
"""






__________""",
}

16 декември 2008

Булшит детектор

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

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

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

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

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

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

Какво не е наред с горния абзац? Булшит детекторът ми се включи и ми каза че пиша простотии. Всеки човек който се занимава с креативна дейност е способен да засича дефектите в своята продукция, а ако не е способен, обикновено продуцира говна. Няма две мнение по въпроса, ако не можеш да видиш къде грешиш, няма да поправиш грешките си, а надеждата че няма да згрешиш е фалшива, в най добрия случай. Това е вярно не само за писането, както споменах, вярно е за всякакъв вид креативна дейност, освен експресионизма, разбира се, там целта е да се продуцира булшит, за да се шокират хората, или да се разсмеят, което си изберете. При програмирането, това е едно от основните умения които са необходими за да можеш да си вършиш работата, нарича се ДЕБЪГВАНЕ И РЕФАКТОРИРАНЕ. Точно така, дебъгерите са просто специализирани автоматични булшит детектори. Но да оставим на страна дебъгерите, говоря за естествения булшит-метър, който повечето програмисти би трябвало за развият от рано в кариерата си(както аз правя в момента, защото съм в доста ранен етап от кариерата ми, ако не сте забелязали, съм на 18).

Друг термин, който се шири из международната, и по специално- англо-езичната, блогосфера е "code smell". Вероятно е случайно това че проблемите с код(и като цяло дизайна на системата ви) се наричат "миризми", а вътрешния усет за тези проблеми се нарича "детектор за бикови говна", всъщност може да го наричате просто "нюх", но това е по скучното му наименование. Такива "миризми" са 2 вида, едните са специфични, а другите са универсални, специфичните, както името намеква, са специфични за езика, фреймуйрка или като цяло парадигмата с която изразявате идеите ви с редактора(в повечето случаи зле). Ето няколко примера, които ако имате достатъчно чувствителен "нюх"(по кратко е от булшит детектор), би трябвало да ви напомнят да си рефакторирате кода:

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

realy_long_method_name_that_bugs_me_alot()
realy_long_method_name_that_bugs_me_sometimes()
realy_long_method_name_that_bugs_me_FUCK!!!()

Това определено би трябвало да мирише на гадно!

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

Повтарящ се код. Дрън, дрън...

Големи класове, големи функции...

Общо взето би трябвало да е ясно какво се опитвам да ви кажа, пишете lean and mean Код, а не big papa bear код(ебахти метафората :D) Колегата блогър Джеф Атууд го е обяснил и ме мързи да повтарям думите му, просто ще инклуудна списъкът му, за да няма повтарящ се текст. Простото е по добро от сложното, краткото е по добро от обширното и всички тея други неща които би трябвало да знаете, ако сте програмисти.

Ето какво означава добре трениран булшит детектор:

1.Забелязвате много малки и дразнещи неща, които повечето хора игнорират, защото ги вземат за дадено, това са всякакви нередности или неефективности в света.
2. Осъзнавате че тези частни нередности са просто инстанции на по общи и фундаментални проблеми със света, в много случаи причинени от един особен вид плешиви маймуни, които го обитават.
3. Категоризиране на различните видове нередности в общи категории и търсене на уместни и ефективни решения.

Това общо взето сумира професията на програмистите :D Лека нощ, надявам се че не ви пречи факта че светът е покрит с "урина и фекалии", защото иначе ще ви е много кофти да живеете, спокойно, свиква се :D

13 декември 2008

Завръщане в IRC

От години не съм стъпвал в irc, но днес се регнах в irc.freenode.net и цял ден Lurck-вам в #python, #python-dev, #clojure, #django, #django-dev и #vim. Наложи ми се да си припомня много неща за IRC, които бях забравил, за щастие kubuntu идва с един доста приличен клиент "konversation", разбира се както всичко в kde и тук С е заменено с K :D.

След дълги бъзикания успях да си настроя клиента да се свързва със сървъра, да ме идентифицира и да ме свързва с каналите които искам. За съжаление, някой канали ,като #python и #clojure, изискват идентификация(ника ми да е регнат) за да мога да се включа в тях. Проблемът е че когато се свързвам към сървъра, клиента ми се опитва да влезе в тези канали преди да съм се идентифицирал с паролата си. Като решение на този проблем аз първоначално се идентифицирах, и след това се реджойнвах в каналите които искат идентификация, но това е доста тъпо, защото трябва да върша ненужни действия. Решението което открих беше в едно поле което ми позволяваше да пращам автоматично команди към сървъра при самого свързване, в това поле просто въведох командата за идентификация и командите за джойнване в годните 2 канала, а останалите канали въведох в полето за канали към които автоматично да ме присъедини.

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