30 декември 2008
Не слагайте сняг в сайтовете си!
21 декември 2008
Бесеница в ~60 реда python код
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
Булшит детектор
Всъщност повечето булшит в този свят ползва познати схеми и модели на разпространение и влияние, така че за да изостри човек усещането си за булшита, трябва просто да научи как той работи. Прост пример: Телевизионна реклама. Повечето хора не разбират колко сериозно се ебават с мозъците им, защото идеята е да се прави незабележимо и за дълъг период от време. От близо година избягвам да гледам телевизия и когато гледам, забелязвам колко невероятно баламски са рекламите които се пускат по телевизията, за мен са прозрачни. Повечето трикове които се използват за да ни измамят са прости и ясни, ето някой от тях:
Повтаряй името на марката за да се набие в главите на хората
Представяй образи с които хората да могат да се асоциират
Използвай кратки набиващи се в главата фрази, за да асоциират определени думи със продукта ти
и т.н. Повечето от тези неща са ясни, и причината поради която работят е че повечето хора не се замислят за това, не е и нужно, тяхното подсъзнание ще свърши цялата работа вместо тях. Един добър начин да се предпазите от този вид булшит е просто да не го гледате, ще се учудите какви положителни ефекти върху живота ви ще окаже отказът от телевизия. Освен повече свободно време, това че мозакът ви не се промива от реклами също помага. Когато имам рядкото щастие(играта на думи не е случайна) да гледам телевизия, обикновено рекламите не ми действат, поради 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
След дълги бъзикания успях да си настроя клиента да се свързва със сървъра, да ме идентифицира и да ме свързва с каналите които искам. За съжаление, някой канали ,като #python и #clojure, изискват идентификация(ника ми да е регнат) за да мога да се включа в тях. Проблемът е че когато се свързвам към сървъра, клиента ми се опитва да влезе в тези канали преди да съм се идентифицирал с паролата си. Като решение на този проблем аз първоначално се идентифицирах, и след това се реджойнвах в каналите които искат идентификация, но това е доста тъпо, защото трябва да върша ненужни действия. Решението което открих беше в едно поле което ми позволяваше да пращам автоматично команди към сървъра при самого свързване, в това поле просто въведох командата за идентификация и командите за джойнване в годните 2 канала, а останалите канали въведох в полето за канали към които автоматично да ме присъедини.
Трябва да спомена че лъркването е доста забавно, научих някой интересни неща, irc не е само за пишлемета без работа(една от причините да се изнеса от там преди години, просто го надрастнах). Никът ми там е pavelludiq, ако на някой му се говори за технологии и глупости.
11 декември 2008
От Vim към gVim

А ето и gVim със новия шрифт и цветова схема:

Предполагам че ще се съгласите с мен, че освен естетическа стойност, новата среда е и по приятна към очите, защото е по малко контрастна.
Ако някой се интересува, файла от втория скриин е от стандартната библиотека на Python3.0 и се казва parse.py и е част от модула urllib, и се използва за парсване на url-и. Доста готино четиво.
08 декември 2008
reStructuredText към html. Скрипт.
Какво е Rest? Това е markup език, но доста по прост от html, в повечето случаи се използва за писане на документация, която после се конвертира в html,pdf,LaTeX и др. формати. Основното предимство на този език е че е мнооого прост. Мога да ви науча на повечето от важните неща на няколко реда, ето един .rst файл, да речем test.rst:
========
Заглавие
========
1. Първа точка
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст::
def some_code(param):
for x in param:
do_someshit()
a) това е под хараграф
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
b) това е друг под параграф:
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
2. Втора точка
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
този файл дори има и грешка при подточка а) :D
Както виждате заглавието е обградено от горе и от долу със '=', което го прави голямо заглавие, подзаглавията, макар и че няма такива в този пример, са само подчертани. За заглавия и подзаглавия може да се използват всякакви знаци('#','@','=','$','-' и др.) Важното е заглавието да е покрито от началото си до края със еднаквите знаци от горе и от долу(няма да работи ако са по къси от заглавието, или ако имат различна дължина), а подзаглавията трябва да са подчертани.
Както може би предполагате, точките и подточките са си част от Markup-а на езика и те дефинират подпараграфи и списъци. А самите параграфи са просто блокове от текст със празни пространства от горе и от долу. Блоковете с код са отместени на дясно, и на предния параграф има двойни двоеточия(::) които по късно стават на единична двоеточие(:). Сега вече знаете достатъчно reStructuredText за да пишете добри документи, за повече подробности посетете сайта им.
Сега, за да ги конвертирате в html или друг формат ви трябва някакъв инструмент, един от най добрите инструменти е Sphinx. Това е изключително мощен инструмент, с чиято помощ е генерирана документацията на python. За моя скрипт аз използвах модула docutils. Ето скриптът:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#convert a bunch of RestructuredText files to html
#version 0.3.14
from docutils.core import publish_string
import sys
def read_file(f):
"""reads the file, returns a string"""
i=open(f,'r')
z=i.read()
i.close()
return z
def converter(rst):
"""turns the rst formated string in to html and returns is as a str"""
return publish_string(source=rst,writer_name='html')
def write_to_file(name,content):
"""writes the html string to a file"""
name=name[:-4]+'.html' #turn .rst into .html
o=open(name,'w')
o.write(content)
o.close()
if __name__=='__main__':
for f in sys.argv[1:]:
i=read_file(f)
i=converter(i)
write_to_file(name=f,content=i)
ако искате да го използвате, просто го запишете в някакъв файл и му дайте права за изпълнение, и го стартирайте:
$./фяйл списък с файлове за конвертиране
всеки файл ще бъде конвертиран във съответния html файл със същото име(но различно разширение, от .rst на .html) Ето изходът от горния rest файл:
Заглавие
Заглавие
- Първа точка
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст:
def some_code(param):
for x in param:
do_someshit()
- това е под хараграф
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
- това е друг под параграф:
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
- Втора точка
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Надявам се този пост да е бил полезен до някъде :D
06 декември 2008
"Трябва да намеря антидота"- гадна седмица без кофеин
Това доведе до една кофти седмица, всеки който е пристрастен физически към нещо(кафе, цигари, хероин) ще ви каже че ако спрете веществото към което сте привикнали изведнъж, ще се чувствате гадно. В моя случай симптомите на абстиненция включваха главоболие, умора, трудност при концентриране, раздразнителност и режимът се скапа, вместо 8 почнах да ставам в 11 и вместо в 3 почнах да си лягам в 8, и после да ставам посред нощ и да си лягам в 4. Не че и преди не съм бил така, но обикновенно е било планирано и съм бил в контрол, сега просто заспивам на клавиатурата в 7:30 вечерта.
Като следствие от това, можете да се сетите че тази седмица не свърших почи нищо полезно от нещата които си бях планирал. Намерих време да работя по един доста интересен програмистки пъзел(за който ще блогвам някой ден), но освен тези 3 часа, тази седмица си беше непродуктивна. Опитах да седна и да чета, но общо взето просто ми се доспиваше, или главата ме болеше прекалено много за да мога да свърша каквото и да било.
Днес най накрая започнах да се чувствам по добре, благодарение на факта че пикът на абстиненцията, вчера, отмина, а и също така започнах да вдигам гирите от из под леглото ми и това определено помага да не полудея. Утре ако е хубаво времето може и да се кача на платото(Шуменското) и да побягам, това определено ще помогне.
Оставям ви със един от класическите дилбърт комикси:

02 декември 2008
Типичен случаен блог пост, от типичен случаен блог
Днес вместо типичните 3 изпих само 2 кафета, едно сутрин и едно на обяд, заради сривът ми вечерта около 8 снощи, при който заспах пред компютъра за 1 час, когато се събудих, видях че съм си сложил възглавничка на бюрото, странното е че не си спомням. След като се събудих, вечерях и си легнах, малко преди това пуснах един туит(звучи тъпо на англииски и още по тъпо на български): http://twitter.com/pavelludiq/status/1032850787
Поради това че нивата на аденозин в мозака ми са супер повишени, заради прекомерната употреба на кафе и кола, и заради намалената ми доза днес, този пост ще е случаен. Виждате ги постоянно в svejo.net. Нищо особено, проосто някой си пуска тъпи снимки в блога, които всеки който сърфира в нета повече от половин час на ден, по дълго от няколко години, е виждал. Или блог тип дневник, тези са най дразнещи, въпреки това всеки блогър, включително и аз го прави! Кво ми пука кво си праил днеска, ако е нещо което ще забравиш след 2 дни, най добре не го споделяй! Или тъпите постове тип "Образовай се мухльо", които вземат някъква концепция или термин за който блогърът е чувал и е прочел някъде нещо, и е решил да сподели знанието. За това престъпление против блогосферата съм виновен и аз, разбира се, ако погледнете последните ми 4 поста, те са точно нещата които не бих чел, най лошото за тях е че са разделени на 4 части, за да имам повече трафик в статистиката ми. Хитро а? Мразя сайтове които разделят статиите си на части, и още повече мразя блогове които го правят със отделни постове, разделени помежду им с определен интервал от време, понякога доста дълъг, със жалката цел да привлекът вниманието ви по 2 начина:
1-во след като видите едно заглавие повече от 1-2 пъти в svejo, подсъзнанието ви се адаптира към това и любопитството надделява при някой хора, това разбира се означава повече трафик за мен(гарантирам ви че работи, миналага седмица беше почти рекордна)
2-ро гради суспенс, очаквате нещо, нямате търпение да дойде утрешния ден за да прочетете още следвнащия пост. Това разбира се има и страничен ефект, свързан с първото, когато влезете повече от 1-2 пъти в даден блог, го запомняте, макар и бегло, и може да се върнете, или ако се върнете, някой ден може да прочетете и по стари постове, просто от любопитство.
След като обясних защо заслужавам линчуване, или диплома по маркетинг, зависи от гледната точка, нека продължа на татък.
Философските блог постове, о буда, и ти света майко на пресветия собственик на РАЯ И ЗЕМЯТА АД(АД-акционерно дружество, майтап, за по бавните от вас), колко мразя този тип постове. Случайно и този който четете е от тях. Някакъв случаен човек пише и разсъждава за случайни теми свързани с нашето ежедневие, начин на живот, емоционално и морално здраве и общо взето все познатата ни дървена философия.
Следват разбира се политическите публикации, тук ще кажа само че не чета такива, а само кликвам на линковете на някой от по интересните, защото аз кликвам на много слуайни линкове, които не чета по късно, защото съм хроничен прокрастинатор, който не е пил кафе този слетобед и тази вечер е супер сънен и пише блог.
Ето и последния вид блогове, тези които пускат линкове към тъпи клипове в нета:
Diarrhea pockets cooool: