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, ако на някой му се говори за технологии и глупости.

11 декември 2008

От Vim към gVim

Ако имате толкова свободно време колкото мен, най- вероятно сте се натъквали на статии от рода на "from vim to emacs" или "from emacs to textmate", или каквато и да е комбинация от редактори,операционни системи или браузари. Днес аз реших да премина от конзолната версия на Vim, към неговата графична версия gVim и причината за това е... изцяло естетическа, инсталнах си нов шрифт и нова схема за оцветяване. Шрифтът се казва Monaco и ако сте гледали онези тъпи(добре де, преувеличавам тук) Ruby или Rails презентации направени на макове, ще видите че всички ползват този шрифт. Шрифтът е готин, но под линукс изглежда супер гадно в конзолата, за това там предпочитам стандартния Monospace шрифт, или Bitstream Vera Sans Mono, но това само там, Monaco изглежда грозно в конзолата. Също така си смених цветовата схема, сега ползвам wombat, който също не е подходящ за конзолата. Ето няколко скриина, единия вече сте го виждали в поста ми за това как използвам Linux:




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




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

Ако някой се интересува, файла от втория скриин е от стандартната библиотека на Python3.0 и се казва parse.py и е част от модула urllib, и се използва за парсване на url-и. Доста готино четиво.

08 декември 2008

reStructuredText към html. Скрипт.

Днес написах един доста прост скрипт който конвертира .rst(reStructuredText) файлове в html. Може и да съм блогвал за ResT преди, но ако не съм, този пост ще е малко по подробен от всичко което може би съм споменавал.

Какво е 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 файл:








Заглавие




Заглавие




  1. Първа точка


Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст:



def some_code(param):
for x in param:
do_someshit()


  1. това е под хараграф


Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,



  1. това е друг под параграф:


Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,



  1. Втора точка


Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,
Това е параграф, той е просто текст,Това е параграф, той е просто текст,







Надявам се този пост да е бил полезен до някъде :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: