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:

28 ноември 2008

Прокрастинация. Опити за контра-атака към мързелът. Част 4(финал)

Това е последната част.

Стратегии за решаване на проблема

В предишния пост дефинирах проблемът. Сега ще се опитам да намеря решение.

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

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

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

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

Да погледнем например следния сценарии: докато си сърфирам ми хрумва идея, и първата ми работа е да си я запиша, за да я свърша по късно, след като свърша другите неща на дългия ми списък, който не чета. Ако идеята е много интересна, може да я започна още на момента, но обикновено със започването, firefox остава отворен и си сърфирам паралелно, като прескачам от едната на другата задача. Ако свърша нещо, обикновено сейвам за да довърша по късно, и обикновено не отварям отново задачата на същия ден. Идеята е сега да мога да стартирам дадена задача и да мога да работя само върху нея за определен интервал от време. Това ще стане чрез изключване на нета и колонките ми. Въпреки че е груб хак, този трик би трябвало да свърши работа(всички тези постове са написани за 3 часа прекарани без нет).

Макар и да е трудно, това има ефект и помага. Определено изпитвам нуждата да си отворя браузарът, или най малкото да се разходя из стаята докато слушам музика, но не бива да се разконцентрирам, и за това се напъвам да изкарам още малко. Въпросът е обаче, кога ще си изключвам кабела? Очевидно е че много често просто ще ме домързи да го правя, но се надявам с времето да няма нужда от това. Последните 3 часа не бяха толкова зле, и съм сигурен че си заслужих следващите 4 часа уеб комикси(завърших това в 23ч).

27 ноември 2008

Прокрастинация. Опити за контра-атака към мързелът. Част 3

Днес ще направя малко анализ на сегашното ми поведение:

От първия пост:

"Ставам към 8-9, правя си кафе, ям баничка за закуска с кафето, отварям Firefox и преглеждам комиксите които следя докато закусвам. Като свърша преглеждам блоговете които следя. Като свърша преглеждам социалните новинарски сайтове които следя(Hacker News, Reddit) и чета почти всичко което сметна за интересно. След това преглеждам видеотата в Youtube от каналите към които съм субскрайбнът, след това обядвам(не винаги) и отивам на даскало към обяд. В даскало тъпея 7 часа, защото уча английски, литература и история от 12 години и малко ми омръзна(особено английския). След това вечерта обикновено изигравам една-две бързи партии на шах срещу компютъра ми, или играя малко Starcraft или lock on. След това ребуутвам отново в линукс и преглеждам блогосферата отново по гореописания начин, проверявам групите ми в гугъл, мейлинг листите в които съм записан и след това блогосферата отново, след това отново блогосферата и пак комикси до 2-3 часа сутринта. По добре е от нищо нали :D. "

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

9ч. ставам
между 9ч и 12ч имам 3 свободни часа, част от които губя.
Между 12ч и 19ч имам 7 часа в даскало(или на път от и към даскало) в които не правя нищо полезно.
От 19ч до 3ч сутринта имам 8 часа, които могат да се използват пълноценно.

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

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

Вечерта е интересното време. Това време има потенциал.

След дълги размишления, осъзнах проблемът ми в неговата цялост. Имам проблем с концентрацията. Години на използване на Интернет и преди това години на гледане на телевизия са оптимизирали мозъкът ми за бързото сортиране на информация. Моето желание е просто да мога да седна и да върша нещо полезно с часове наред, без да почувствам нужда да проверя имейла ми, или да прегледам новините. Това което НЕ искам е да се боря с прокрастинацията ми. Въпреки че съм пристрастен към интернета, не искам да се боря, просто искам да се фокусирам по добре върху нещата които искам да правя. Искам да мога да седна и да чета книга, и да прочета повече от 10 страници на веднъж, искам да седна и да почна да пиша код, без да отварям firefox за да се разсейвам, искам да седна и да напиша някой блог пост, без да се боря със нуждата ми да си губя времето.

Имам нужда от прокрастинацията, за да върша работата си. Имам нужда да си губя времето и съзнанието ми да се лута безцелно на посоки. Тази хаотичност ми дава много идеи, някой от тях добри. Ако не бях мързелив, много от идеите ми нямаше да ги има. Тази хаотичност е определяща за личността ми. Но искам и да мога да върша работа. Както се казва на английски: "Get shit done".


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

26 ноември 2008

Прокрастинация. Опити за контра-атака към мързелът. Част 2

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

Дребните задачи:

Съществуват 2 вида задачи, малки и бързи, и големи и трудни. Малките и бързи обикновено стават за няколко часа и не изискват много концентрация(както разказът ми от предишния пост). Големите и трудни изискват много време и концентрация.

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

To-do списъци:

Тези неща не са особено полезни. Имат и своите положителни и отрицателни страни. Да речем че имате един куп неща за правене и ги компилирате в удобен To-do списък, тези задачи могат да бъдат или бързи и лесни, т.е. Можете да минете през списъкът за няколко часа или по малко, например "изхвърли боклука", или могат да бъдат съставени от няколко ясни и големи задачи, като например задача от типа на "Реши проблема си с прокрастинацията. По мое мнение този тип списъци биха били удобни за краткосрочни и малки задачи, но не особено полезни при големите, причината е че ако имате големи цели, е добра идея да имате и гъвкавост, докато дребните задачи можете да решите бързо, само ви трябва малко мотивация. Проблемът с тези малки списъци е че те никога не остават празни.Прокрастинация-2

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

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

Големи и трудни задачи:

В миналия пост коментирах дребните и досадни задачи, които просто трябва да свършите. Хубавото при мен е че те са малко, и могат да се свършат бързо, въпрос е само на малко дисциплина. За сметка на това обаче, списъкът ми с големи задачи е огромен. В него има задачи от естеството на "Прочети книга X", "Напиши дълго есе за прокрастинацията","Спри глобалното затопляне","Спаси косатките от изчезване" и др. Този списък е доста по труден, не просто заради трудността на задачите, проблемът идва от това да започнеш, и да продължиш да правиш нещо за дълги периоди от време(повече от няколко часа). Такава дейност е програмирането, и до сега не съм седял пред редактора повече от 2 часа без да отворя файърфокс и да си пусна youtube. Очевидно е че имам проблем с концентрацията за дълъг период от време, именно това се опитвам да реша, двата проблема са А)"Започни да работиш" и Б)"Продължи да работиш", вече C)"Завърши проекта" е нещо което я стане, я не. Понякога е дори по добре да не завършите нещо, и просто да убиете проекта, понякога е по добре и просто да не започвате нещо. За тази гъвкавост говорех, когато казах че To-do списъците не са особено полезни за подобен род задачи. За сметка на това обаче, можете да ги използвате за вътрешна организация на проекта. Един от най често срещаните съвети при проблемна прокрастинация сред програмистите е просто да разделиш проблема на малки под-проблеми, които да може да свършиш бързо и един по един, както правиш с дребните задачи. Това не е подходящо за всякакъв вид дейности, но е един трик повече в арсенала ви против прокрастинацията.


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

25 ноември 2008

Прокрастинация. Опити за контра-атака към мързелът. Част 1

Въведение


Прокрастинация означава вършене на някаква незначителна дейност, или отлагане извършването на някаква друга дейност. Да речем ако четеш този блог, вместо да учиш за утрешния тест, това е прокрастинация. Поул Греам(да, той е писал за всичко) е написал страхотно есе(дори 2) на темата. Good and bad procrastination и Disconecting distraction. Той определя 2 вида прокрастинация добра и лоша. Лошата е ясна, имаш важна работа, но вместо това не вършиш нищо, или вършиш нещо не особено полезно(като да четеш блога ми например). Полезната прокрастинация е когато вършиш нещо важно, но игнорираш други по маловажни неща, които трябва да се свършат, например работиш върху нещо(тъй като това е програмистки блог, да речем че е програма) и си толкова фокусиран, че не си се бръснал от седмици, купчината с чинии в стаята ти расте и имаш 20 бутилки от кола на шкафа ти, чакащи те да ги изхвърлиш. Поул твърди че вместо да се борим с прокрастинацията, по добра идея е да максимизираме добрата прокрастинация, и да минимизираме лошата.

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


Основно описание на проблема:


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

Отне ми 2 месеца да си подам документите за шофьорската книжка. 3 седмици се мотах докато отида да се запиша на курс в БЧК за първа помощ, после 1 седмица чаках, после 1 седмица ме домързя да си потърся дипломата от 9-ти клас, после още толкова отлагах медицински преглед и накрая 2 седмици се чудих кога ще ми е удобно да отида да си подам документите. Разбира се много обичам да вися по гишетата и да се занимавам с българската бюрокрация, и явно заради това подсъзнанието ми(в някой случаи и съзнанието) отлагаше целия процес.


Ето как минава денят ми:


Ставам към 8-9, правя си кафе, ям баничка за закуска с кафето, отварям Firefox и преглеждам комиксите които следя докато закусвам. Като свърша преглеждам блоговете които следя. Като свърша преглеждам социалните новинарски сайтове които следя(Hacker News, Reddit) и чета почти всичко което сметна за интересно. След това преглеждам видеотата в Youtube от каналите към които съм субскрайбнът, след това обядвам(не винаги) и отивам на даскало към обяд. След това вечерта обикновено изигравам една-две бързи партии на шах срещу компютъра ми, или играя малко Starcraft или lock on. След това ребуутвам отново в линукс и преглеждам блогосферата, отново по гореописания начин, проверявам групите ми в гугъл, мейлинг листите в които съм записан и след това блогосферата отново, след това отново блогосферата и пак комикси до 2-3 часа сутринта. По добре е от нищо нали :D.

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

20 ноември 2008

Маймунизаторски скрипт

Един приятел ме помоли да напиша програма която да превежда кирилица на език от рисунки, като за всяка буква има съответната рисунка. Понеже още не ми е дал самите рисунки и другите детайли които ми трябват, не мога да започна работа. Но понеже нямах какво да правя начатках този бърз скрипт, написан на python3.0, защото имах проблем с unicode-а при 2.5, поради unicode проблеми, все още не мога да си инсталирам и python2.6, но все тая. Ето скрипта, който превръща кирилица в латиница:


#!/usr/bin/env python
import sys

letters={
"а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"j","з":"z",
"и":"i","й":"i","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p",
"р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch",
"ш":"sh","щ":"sht","ъ":"a","ь":"","ю":"ju","я":"ja","А":"A",
"Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"J","З":"Z","И":"I",
"Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R",
"С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh",
"Щ":"Sht","Ъ":"A","Ь":"","Ю":"Ju","Я":"Ja"}

def parse(inp):
inp.split(" ")
for word in inp:
yield word

def translate(word):
newd=""
for char in word:
if char in letters.keys():
newd=newd+letters[char]
else:
newd=newd+char
return newd

def main():
inp=open(sys.argv[1])
output=''
for x in [translate(word) for word in parse(inp.read())]:
output+=x
print(output)

if __name__=="__main__":
main()


А що се отнася до програмата която трябва да се занимава с изображенията, най вероятно ще използвам PIL, проблемът е че PIL още няма потдръжка за python3.0 и за това ще трябва или да разбера от къде ми идва проблема с уникода при 2.5 или да търся начин да хакна горния скрипт, така че да вика python2.5 и да му подава латинизирания текст, така че да може да се направят изображенията. С други думи преебан съм.

15 ноември 2008

Как използвам линукс?

Попадайки на тази интересна статия How I Use My Mac и отговорът към нея How I Use My Dell реших да напиша нещо подобно, но понеже нямам лаптоп от известна марка(все още, аз съм от dell феновете) реших да пиша за линукс десктопа ми.

ХАРДУЕР

Машината ми е прилична intel pentium 4 3.4 Ghz клокнат до 3.6, 1gb рам и една доста скапана видео карта, която трябва да сменя скоро(nvidia 7300 LE). Мониторът е 17 инчов LG и ми е малък вече, трябва да си взема нещо с по голям цолаж. Когато си го взех беше доста мощен, но така е, след две години ще мога да го разменя за зарядно за телефон и ще мога да се фукам че съм направил супер зделка.

ОПЕРАЦИОННА СИСТЕМА

Kubuntu 8.04, 8.10 се оказа доста бъгаво, за това се върнах към доброто старо KDE3 и hardy heron. ще чакаме 9.04.

БЕКЪП

Повечето от по важните ми неща са текстови файлове и музика. Музиката ми е на отделен партишън, защото е трудно да я възтановяваш от дискове(40 гб), текстовите файлове ги съхранявам със една програма на име dropbox. Тази програма създава една папка dropbox и я синхронизира между онлайн папката ви(2гб) и другите ви машини свързани с акаунта ви. Доста е удобно за бекъп на малки файлове, използвам го и за прехвърляне на файлове от уйндолс на линукс без да трябва да маунтвам линукс партишъните ми под уйндолс, защото съм патил от това. Линукс версията е просто nautilus плъг-ин, което означава че трябваше да го инсталирам(ъх гаден gnome интерфейс), но не е проблем, ако можете да толерирате gnome библиотеките които трябва да се инсталират със тая програма. Хубавото е че поне интерфейса и е open source така че някой някой ден ще може да направи KDE версия.

ДЕСКТОП

ето скрииншот:



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

Виждате че имам 8 десктопа от които използвам само 4-6 макс, това е така защото ако имах 6 редовете нямаше да са в пропорция 1 към 2 и нямаше да е толкова красиво :D Самия ми панел както казах е прозрачен и е с размери 90% от широчината на екрана и е висок 40 пиксела, което е по малко от настройките на кубунту, не обичам да пилея вертикално пространстро(па дори и 14 пиксела).

Софтуер. Освен Firefox, amarok, ktorrent, kaffeine и okular май не ползвам други десктоп програми, повечето ми работа е във firefox, okular и в конзолата.

ТЕРМИНАЛ

В конзолата използвам най вече vim и python интерпретатора, за python няма да говоря, но ето vimrc файла ми:


"spaces when tab is pressed:
set expandtab
" do not break lines when line lenght increases
set textwidth=0
" user 4 spaces to represent a tab
set tabstop=4
set softtabstop=4
" number of space to use for auto indent
" you can use >> or << keys to indent current
" line or selection
" in normal mode.
set shiftwidth=4
" Copy indent from current line when starting
" a new line.
set autoindent
" makes backspace key more powerful.
set backspace=indent,eol,start
" shows the match while typing
set incsearch
" case insensitive search
set ignorecase
" show line and column number
set ruler
" show some autocomplete options in status bar
set wildmenu
"show line numbers
set number
" share clipboard with windows clipboard
set clipboard+=unnamed
" minibufexplorer settings:j
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchWindows = 1

"autoread chaneged files (me)
set autoread
set background=dark
colorscheme torte
syntax on

"indent plugin
filetype indent on " load indent.vim

" this turns on hlsearch, but clears the
" highlighting when Enter is hit
" show a menu of matches when doing completion
set wildmenu
" highlight the current search pattern
set hlsearch
" shows the current filename and path
" in the term title.
set title
" in normal mode enter clears search highlight
nnoremap :nohlsearch
if version >= 700
"set cusorline " highlight the line with the cursor
set numberwidth=4 " width of line numbers
endif


Ето и скриин:



Това е за сега Thththats all folks!

12 ноември 2008

Спрете IE6

Може би се досещате от характера на постовете ми че не съм особен фен на microsoft, въпреки това вече преминах през вманиачените си "анти" тинейджърски години и съм доста по толерантен, що се отнася до потребителските технологии. В последните години Майкрософт загубиха много от властта си, благодарение на уеб технологиите и нарастващата популярност на ubuntu и MacOSX. Но все още живеем в сянката на Internet Explorer 6. Причината е че браузърът е една от най важните програми в днешно време, но много хора още използват остарелия IE6, а той е на 7 години! Точно така, 7 годишна дупка между интернетът за който е създаден и интернетът който е днес. Преди 7 години Майкрософт бяха всевишни и можеха да си позволят да пробутат продукт като IE6, защото те диктуваха правилата, днес технологичния свят е много по децентрализиран и е пълно с алтернативи на всичко, но защо IE6 още съществува? Две причини:

1)Потребителите не го ъпдейтват. Не бихме могли да им се сърдим, по скоро трябва да ги съжаляваме. Тези хора се свързват проблемите си със сигурността със факта че използват остаряла технология. Те не са длъжни да разбират това, те са просто хора, невежи, но хора със живот. Ако не виждат полза, няма да ъпдейтнат браузърът си до 7-ма версия, и със сигурност няма да си го сменят със някой по добър. Това е подхранено и от провала на Виста, тази операционна система може да не е много по добра от ХП, но поне идва със IE7, което си е напредък.

2)Сайтовете го поддържат. Това също е разбираемо, защото ако не го поддържат, губят много потребители и съответно приходи. Радвам се че 60% от посетителите на този блог ползват firefox и само 25% IE, от тези 25, половината са със IE6, което е доста малко, но ако сайта ви има милиони посетители, ситуацията е различна, това са хиляди изгубени потребители, а като добавим и факта че блога ми не привлича толкова много типични IE6 потребители, за един комерсиален сайт ситуацията е съвсем различна.

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

Опит да намерят решение на този проблем правят хората зад проекта Stop IE6. Сайтът се опитва да образова хората относно нуждата да ъпгрейднат браузърът си. За дизайнерите на сайтове също така са предоставени 2 скрипта с които могат да "накарат" потребителите на IE6 да преминат на IE7 или 8 или дори още по добре, на някой от алтернативните браузъри. Единия е толерантен и изкарва съобщение, което може да се игнорира, а другия е безмилостен и блокира достъпът на тези потребители с Интернет експлорер с версия под 7.

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

09 ноември 2008

Beginning Unix Ревю

Вече 3-ти ден чета Beginning Unix (Programmer to Programmer). Преминах през по голямата част на книгата, но прескачах на местата които не ми се струваха толкова интересни. Такива места бяха например главите посветени на редактора Vi и на perl(От Vi разбирам, а perl ще науча някой друг път).

Това което ме впечатли е че във скромния обем от 450 страници са събрани толкова много неща. Ето съкратен списък на нещата които покрива книгата(някой по подробно, други по постно):

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

Обясняват се потребителите и групите, както и управлението им

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

Обяснение на някой от по сложните команди.

редактиране с Vi, това го пропуснах.

Регулярни изрази, sed и awk това го преминах на бързо, имам отделна книга от която ще уча регулярни изрази, а sed и awk ми се струват интересни инструменти, но няма да се занимавам за сега да се задълбочавам.

Управление на процеси и задачи.

Следва глава посветена на изпълнението на задачи в определено време.

Глава посветена на сигурността

Две глави посветени на shell скриптове(точно стигнах до тях, не съм чел на татък).

Следват една глава за системните log-ове, и една за мрежовите способности на уникс

Следва една солидна глава посветена на perl, няма да я чета, но имам чувството че ще ми се наложи да науча този език някой ден.

Следващата глава е за правене на back-up-и и една глава за инсталирането на програми от сорс, и двете неща знам как да правя, но може да ги прегледам, останалите две глави са за потребителите на mac OS 9 и Windows, идеята е да им покаже как да минат на уникс(mac os X в първия случай). Няма да чета.

Това означава че трябва само да прочета главите посветени на shell скриптовете и съм готов с тази прилична книга. Както виждате, тази обширна гама от теми които книгата съдържа и дават доста точки, въпреки че е предназначена за начинаещи, е добра и за хора с малко повече опит(като мен).

Първата книга която реших да прочета в петък беше linux bible, но тя след като преминах през съдържанието се оказа че повечето от главите са инструкции за инсталиране на различните дистрибуции, вероятно е полезна ако сте напълно начинаещ и се чудите как да започнете. Следващата книга която смятам да погълна е The Debian System: Concepts and Techniques. Все още не знам кога ще ми остане пак време, както стана този уйкенд, но се надявам да намеря такова.

06 ноември 2008

Rootless root

Може и да знаете за тази колекция от Unix притчи, но ако не я знаете, прочетете тази, и ако имате време, прочетете и другите.

Имам чувството че познанията ми по Unix са наистина повърхностни и че имам нужда наистина да овладея тази система. За целта ще се отдам на медитация, четене и писане на shell скриптове(най вероятно на python и bash). Ето какво знам да правя под Linux:

1. Имам средни познания по Vim.

2. Когато кубунту си ъпдейтне ядрото прекалено много пъти, знам как да редактирам menu.lst файла ми, за да не ми се налага да избирам между десет ядра, когато grub boot-не.

3. Знам как да се ориентирам във файловата система със cd,ls и други команди

4. Знам как да си настроя клавиатурата от xorg.conf, така че да използвам dvorak и bg вместо us.

5. Най важното е че знам как да използвам man командата :D

Знам и още куп други неща, но това вече са отделни програми(apt,htop и др.) Това е общо взето минимума който трябва да се знае за да има един човек право да стои неизбръснат повече от 1 седмица, ако стоиш така с брадата си, без да знаеш повече, не я заслужаваш и трябва да се избръснеш(unix 1337-неса се измерва по брадата :D). Това е и една от причините поради които заминавам за планината с няколко Unix книги и едно Arch CD(не че не съм инсталирал Arch и преди, но не съм го овладял). Както казва негъра, който сега управлява половината свят "It's Time for chage".

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


PS2(уоу). Защо шибания python2.6 не иска да се компилира на шибаното кубунту!!!!

03 ноември 2008

Ъпдейт относно туториъла(отново)

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

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

Други новости около мен, които бих написал в twitter, но ме мързи са:

Зарибих се да играя шах, супер слаб съм, но се уча.

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

Даскалото си е все така скука, но имам най високата оценка по математика от целия клас, на последното контролно: 4.50 :D супер много, но повечето други хора имат 2-ки и 3-ки, а само аз имам едно гордо 5 в дневника, имам уча повече по математика.

Това е за сега.

01 ноември 2008

Публикуваха един от постовете ми в новия Home Linux

Вчера излезе новия брой на Home Linux. Статията ми диктатурата в опън сорса е на 5-та страница, отделени са и 3. Искам да благодаря на хората които правят този проект, въпреки че сте пълни аматьори в сферата на публицистиката, си личи че се кефите на проекта си. Обаче се надявам следващия път да има повече материали, сериозно момчета, този брой сте си го изсмукали из пръстите. Стига съм се фукал с това че са ме публикували някъде.

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

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

28 октомври 2008

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

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

26 октомври 2008

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

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


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

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

class AttrDict(dict):

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

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


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


class AttrDict(dict):

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

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

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



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

21 октомври 2008

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

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

class AttrDict(dict):

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

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


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

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


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

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


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

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


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

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


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

20 октомври 2008

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

Извинение

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

Време

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


Мотивация


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


Идеи

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

Заключение

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

14 октомври 2008

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

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



II-ра част

1. Въведение

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

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

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

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

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

turtle.forward()

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

turtle.backward()

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

turtle.left()

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

turtle.right()

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

turtle.up()

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

turtle.down()

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

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

12 октомври 2008

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

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

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

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

11 октомври 2008

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

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



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

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

09 октомври 2008

C, сагата продължава

Така и не научих С. Лятото четох, пробвах разни неща, писах малко код, обаче не прочетох K&R до края. Вместо това задълбах червата на python, и започнах да изучавам синтактичните особености и детайли на езика, също така подхванах и до известна степен Scheme. Та защо днес си отворих отново тази пуста книга за С, този архаичен език от 70-те? Ами просто е, след като изгледах последните няколко лекции от поредицата SICP, видях че в тези лекции, предназначени да те научат на Lisp, въобще не са предназначени да направят това. Идеята е да премахнат "магията".

Ще поясня, лекциите се занимават с различни конкретни проблемни области от компютърните науки, като динамични езици, функционално програмиране, рекурсивни алгоритми, вложени езици, pattern matching, логическо програмиране, и писане на интерпретатори за такива езици. Това всичкото в 10 лекции(всяка от по 2 части). В предишна лекция бяха описали целия мета циркулярен интерпретатор на лисп, написан на лисп, т.е. лисп е самосъдържащ се език, който е дефиниран чрез себе си, и се самоинтерпретира, или нещо такова. Но в една от следващите лекции, направиха нещо интересно. Описаха абстрактен модел на компютър, такъв с регистри, стек, контролер и т.н. Освен абстрактния модел на компютър, дефинираха и вложен в lisp синтаксис, с който да описвах процесите в този псевдо компютър(псевдо асемблер, с лисп синтаксис). Идеята беше да премахнат магията.

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

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

06 октомври 2008

Дилема. С какво хоби да си запълня свободното време?

Снощи не публикувах допълнителен блог пост, защото гледах лекции за програмиране от 86-та година. Ако не бях, снощи щях да пусна блог пост относто reStructuredText и Sphinx. Тези теми са интересни, и някой ден ще им обърна внимание, но днес ми се пише за нещо друго. След като един вид завърших проекта си за игра морски шах, и след като публикуах черновата на туториъла ми за Python, започнах да се чудя, какво да правя. Да, туториъла все още има нужда от работа, и трябва да напиша 2-рата част, също така, морския шах още няма изкуствен интелект. Обаче на мен тези неща не са ми толкова интересни, колкото бяха, когато си казах че искам да ги направя. Време е да си намеря други проекти, нещо което да ми е интересно, и върху което да си блъскам главата няколко седмици, и по възможност да прави нещо истинско.

Намирането на нов проект е вариант, друг вариант е да прочета документацията на споменатия горе reStructuredText и да работя върху туториъла, използвайки го. Или пък да се посветя на някое от другите ми многобройни и интересни хобита, които не съм практикувал от известно време, или пък да си намеря нови. Общо взето съм в нещо като мини- криза.

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

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

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

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

05 октомври 2008

Документацията на Python

Днес ъпдейтнах версията ми на python до 2.6, и най якото нещо за нея е, че новата версия има и нова документация, или по скоро нов сайт за документация. Ето как изглеждаше документацията за предишната версия 2.5 . А ето как изглежда тя за 2.6 . Освен готиния редизайн, новия сайт е много добре организиран, намерих някой неща, които и да ги е имало преди в документацията, не съм ги намерил. Да започнем с преглед на нещата, на заглавната страница ще намерите:

Новите неща в Python 2.6

Туториъл(по добър от моя :D)

Наръчник за употреба на различни платформи

Описание на синтаксиса и елементите на езика

Описание на стандартната библиотека

Колекция от интересни How-to-а(след малко ще задълбоча тук)

Наръчник, за това как да се пишат С/С++ разширения

Както и съответната документация за C/C++ API-а

Как да се инсталират модули

Как да се дистрибутират модули

И как да се пише ефективно документация за Python

Други неща в списъкът са и различни индекси и справочници.

Това на което искам да обърна особено внимание са How to-тата, ето какво включват те:

Как да пропагандираме Python пред тъпите си шефове

Как да портваме библиотеки към 3.0

Как да програмираме използнвайки curses(това ми е четивото за довечера)

Няколко примера за лош стил

Как да пишем функционален код(това ще се прегледа по късно, имам особено отношение към функционалното програмиране)

Regular expressions Voodoo

Socket-и

Уникод

urllib2

и най накрая:

как да използваме Python в мрежата.

Защо подяволите няма повече проекти с такава документация, да разбирам че python ми е почти набор, и хората са имали време да напишат това, обаче погледнете да речем Django, тяхната документация е страхотна, за разлика от документацията на brainfuck(това е истински език, доказателство е emacs lisp имплементацията за него :D)

Черновата на туториълът за Python е готова

Водейки се от опън сорс философията "пускай често, пускай бързо", днес ще пусна първата версия на туториъла ми за Python, кръстен иронично от мен "Python:червеното хапче". Иронично е защото всички знаят че Ruby е червения език, а Python е синкаво жълт :D. Представям ви първите чернови, за сега съдържащи само първа част, втората е в прекалено начален стадии за да се показва на хора, като се има в предвид колко пъти пренаписах само тази първа част :D Ето самите чернови:

Чист текст

PDF версия

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

Update 14.10.08: днес започна работа по втората част. Подробности тук.

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(). Лека нощ и приятни сънища, сбогом, леща нощ...