Показват се публикациите с етикет develop. Показване на всички публикации
Показват се публикациите с етикет develop. Показване на всички публикации

понеделник, февруари 28, 2011

Грешката - А не, ти халюцинираш

Ако има нещо наистина изнервящо в софтуерния свят, то това е грешката "А не, ти халюцинираш".

Да обясня, това най-често се случва на обикновените потребители, но и редовия developer не е застрахован, ситуацията е следната, вие най-невинно съобщавате:
- "Функцията Х не работи !" или "Функцията Х хвърля грешки!"
Отговора е пределно ясен:
- При мен няма такъв проблем.

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

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

Имало е доста случаи, в които  (как пък да му се не види) програмиста бил гледал на друго място в програмата и там проблем нямало. 
В други пък просто не могъл да забележи 50 редова грешка изпляскана на половин екран. Е че тя е мъничка, как да я види?


След като сте осъзнали, че имате проблема "А не, ти халюцинираш", започва една епична битка в която се опитваш да обясниш на софтуерния гуру, че не си вземал LSD скоро и това е реален проблем, който ти пречи на работата. Трябва да сте особено нагли, защото никой самоуважаващ се програмист не би рискувал да си наруши душевния комфорт дебъгвайки 2-3 реда код.
Много ясно трябва да обясните, че "Проблема при мен го няма" не е отговор и ако трябва, въпросния специалист ще си вдигне задника и ще дойде на място, щом при него "няма такова нещо".

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

вторник, юли 27, 2010

Коментари в кода

В момента работя по един open source проект и попаднах този коментар:

*This one is really quick and dirty because I want to finish this and catch
* the bus. Need to be redone ASAP
Човека трябвало да хване автобуса :)


Сетих се, преди време ми подариха една книжка - Code Complete. Там пишеше нещо от типа, че ако ти се налага да напишеш коментар, който да пояснява някакъв завързан хак, по-добре да го изтриеш, пренапишеш или в краен случай да оставиш  @todo коментар.
Автора на кода след този коментар, очевидно е осъзнавал, че кода му е мазало и трябва да се пренапише, само че ... получава се следното

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

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

Сега някои хора ще кажат, че това е принципен проблем на софтуера с отворен код (нали, Наско), но всъщност проблема е другаде. Проблема е в лидера на проекта и в това, че е пуснал това парче код в стабилната версия. За това BSD феновете толкова много се гордеят с "перфектния" си код, защото такива допълнения се отхвърлят много преди въобще да стигнат production версията. Въпреки базарния модел на софтуера с отворен код, винаги съм бил привърженик на идеята за силна фигура на върха, която да има последната дума по всеки въпрос. От тук идва разликата между добрия софтуер и сбирщината от хакове.

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

петък, юни 25, 2010

PHP IDE-та, редактори, среди или който както им вика

IDE или Integrated development environment кое е по-добро според вас ? (ще го уточним в движение)

Пробвал съм наистина доста IDE-та, под доста операционни системи и обикновено мнението ми за тях се движат от "Обикам го" до "Боклук".
Да уточним нещо PSPad, Notepad++, Gedit и другите подобни не са среди за разработка, ако ги смятате за такива ползвайте поне Nano, има същата функционалност при това с по-хубав syntax highlightning. PSPad има едно единствено предимство пред останалите в тази категория - вградения ftp клиент, но това пък е свързано с една порочна практика да се работи директно на сървъра. Notepad++ винаги го слагам под Windows, но никога, абсолютно никога не го използвам за друго освен редактиране на конфигурационни файлове.

След като оплюхме останалите да кажа какво съм харесал до момента:

си е "оригиналното" IDE за php. Все пак го правят Zend и уж е най-доброто и най-невероятното и т.н. Може и да било така, но от версията от която аз започнах да го ползвам - 6, вече бяха започнали да ползват за основа Eclipse и според мнението на повечето ми тогавашни колеги това много го е развалило. При версия 7 нещата бяха по-лъскави, но не и оправени. Както и да, аз лично смятам, че е нелоша среда, но страда от Windows синдрома - колкото повече го ползваш, толкова по-лагаво става, докато накрая не започне на крашва, да чупи файлове и т.н. Неприятна картинка. Особено много "обича" import на големи проекти - пригответе си кафенце, пакет цигари и вестник.


или PHP Development Tools си е чисто и просто Eclipse за php писачи. На теория би трябвало да бъде почти същото като Zend, ама не е. Никак не е лошо, но спрямо комерсиалния си братовчед е доста по-бавничко като autcomplete примерно. В началото го отдавах на бавния ми лаптоп, тъй като вкъщи бях с него, а на работа с Zend, но когато ги пробвах на една и съща машина разликата е осезаема. Ако не искате да си купувате (или да си "купувате" по другия начин) софтуера това е един от възможните избори.

Когато го пробвах за пръв път разбрах какво се има предвид под Integrated. Идва с доста благинки - вграден уеб сървър, DB manager, терминален клиент, четец на документация, php, дебъгер и още какво ли не. Освен това в сравнение с eclipse базираните среди е доста пъргаво. Вградения уеб сървър става за основните неща, но ако ви трябва mod_rewrite искате или не, ще си слагате отделно apache (което между другото не е проблем за PHPED. Db manager-a става колкото да си погледнете как ви се казват полетата на таблиците, но не върши работата на phpmyadmin или пък MySQL Workbench. Идеята да отвориш ssh терминал като таб в редактора все още ми изглежда странна, но пък не е чак толкова неудобно. Ако пък сте свикнали да проверявате документацията в php.net, вградения четец за chm файлове ще ви е полезен само ако сте offline.
Autocomplete има, но определено не е на нивото на Zend и PDT, но за сметка на това е доста по-бърз и поддържа code templates. Аз примерно си бях направил шаблончета за controller-и модели в codeigniter така че за да създам нов такъв трябваше просто да напиша името му. Бързо и удобно.
Това е може би най-пълното IDE за PHP, идва с почти всичко необходимо, но все пак някои неща куцат.

е новата ми любов. Дълго време го смятах за запазена територия за java-ери, но се оказа че не е така. Поддържа почти всичко, което и останалите, изглежда мазничко и работи прилично бързо. Има някаква доста странна поддръжка за табулации и не се разбира много с останалите, но иначе е супер. Това заради, което ми допадна най-много е, че има пакет за java, c++ и php в едно, а на мен напоследък ми се налага да пиша и на трите. Добро е, пробвайте.

Под Mac нямам голям опит, но така като гледам масово се използва TextMate и TextWrangler, което не го разбирам особено. Най-доброто, което съм ползвал е Coda, за него определението е само едно - мазничко, но пък под Mac всичкия софтуер влиза в тази категория :)


Update: Пробвах Komodo Edit, поработих с NetBeans, нещо не ми харесаха. Не знам какъв компютър ми трябва, но с core i7 дразнещо много се бави NB.
Върнах се обратно на PhpED

Бачках няколко дена под линукс. Бях забравил какво е да се пише html/css без Dreamweaver - ужасно е. Кой каквото ще да говори по-добър autocomplete от DW за html/css не съм виждал, той просто чете мисли.

Другото интересно е как различните IDE-та гледат на autocomplete-a. Понеже на CodeIgniter библиотеките се зареждат по начин по който никое IDE не може да ги autocomplete-не, единствено PhpED се съгласява с мен, че съществуват такива обекти и започва да ги "разбира", всички останали продължават да предлагат каквото вече са си решили, че трябва.

четвъртък, юни 24, 2010

Използване на CI Active Record в скрипт извън CodeIgniter


Добре, ясно, ползвате CodeIgniter и ви се налага да напишете някакъв малък скрипт (примерно нещо, което ще се изпълнява с cron) и се налага да правите някакви си нещица с базата данни.

Правите си една папка "scripts" и започвате да блъскате вътре някакви неща. Въпроса, е че вече сте свикнали с Active Record библиотеката на CodeIgniter и искате да продължите да си я ползвате вместо омразните - mysql_query(), mysql_fetch_object() и т.н.
Оказа се, че това става доста лесно :

// set paths
$current_path = __DIR__;
$current_path = str_replace("\\", '/', $current_path); // w32 paths
// тук може би ще ви трябва още малко оправяне на пътищата :)

define(PROJPATH, $current_path . "/");
define(BASEPATH, $current_path . "/system/");
define(APPPATH, PROJPATH . 'application/');
define(EXT, '.php');

// load active record DB
include(BASEPATH . 'codeigniter/Common.php');
include(BASEPATH . 'database/DB.php');
$db =& DB();



Това е. Вече имате променлива $db и можете да си ползвате любимия $db->get() :)

Уточнение: Ако пътищата ви се струват странни: при мен system и application папките са на едно равнище във файловата структура и за това съм си дефинирал константа PROJPATH която е един вид ../system и ../application.
структурата е нещо като :
/project
//application
//system
//scripts
При този начин на зареждане Active Record ще ползва стандартните настройки за връзка с базата данни в /application/config/database.php, тоест няма нужда ръчно да задавате отново username, pass и db.

неделя, октомври 11, 2009

50% Software Developer

Не съм писал отдавна, бла-бла-бла, да не продължавам.

Гледайте сега, имаме при нас един юноша бледен, той се казва Гошко (примерно) и като чудо е software developer. За незапознатите, това означава, че пие много кафе и постоянно се цъкли в монитора.
Гошко е типичен програмист и един ден му идва поредната гениална идея за невероятен продукт, който ще избие рибата и ще му донесе много пари. И понеже Гошко е същинското клише за програмист просто сяда и започва да пише.
Няма да говоря за това, че Гошко не сяда да си направи дизайна на приложението, че не предвижда време за тестване и документиране и т.н., дори ще пропусна 3 месеца упорит труд и гениални програмистки решениея.
След тези 60 дни работа, Гошко продължава да седи пред компютъра с все по-разтревожен поглед. В крайна сметка той има приложение, което е трябвало да бъде готово преди 2 месеца и от тогава е завършено на 99% докато не му дойде на ум поредната изключително важна функционалност, без която продукта му няма да е завършен и той се хвърля да пише и нея.

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

От известно време чета блога на Джоел Сполски (въобще така трябва да му се пише името), та там споменава нещо много интересно (четох го отдавна и не ми се търси точен линк).
Той предлага следното решение. Сядаш и се правиш списък с всички необходими според теб компоненти. Да речем, че са общо 100. От тях внимателно избираш 50-те най-важни и ги имплементираш.
Какво се получава. Имаш продукт за много по-малко време, но с половината функционалност, та той на практика е незавършен.
Това, което казва Джоел е, че всъщност въобще не е така. Пускайки продукта с половината от предвидената функционалност, всъщност е много хитър план да си спестиш време и да разбереш от какво потребителите наистина имат нужда. Все пак нали идеята е, че всяка програма прави по едно нещо, дори да вградят в MS Office възможност да прави кафе, той пак ще си е офис пакет и потребителите му ще го купуват заради именно тази му функция, а не заради кафето.
Примера, който се даваше в поста беше за Apple и това, че пуснаха iPhone без copy/paste. На пръв поглед това е нещо, без което нито един "компютър" не би могъл да се пусне. Но Apple го пуснаха. При това телефона си стана доста успешен без дори да има copy/paste, представяте ли си.
Както и да е, потребителите ревнаха, че си нямат възможност да копират и залепят, от Apple казаха "No problem" и при следващия релийз на софтуера за телефона им пуснаха тази функционалност. Елементарно.
Идеята да пуснеш само 50% от функциите е много проста, пускаш основните неща и когато някой клиент ревне "Ама няма ми го това ..." просто си отваряш списъчето, поглеждаш и си казваш "Аха, това хубаво съм го мислил, добре, ще го напиша" или пък "Брей, не съм се сетил за това". Така в крайна сметка пишеш наистина необходимите 80% функции и като бонус получаваш едно разтегляне на нещата във времето, което ти дава възможност да обмислиш всичко по-добре.
Просто се оказва доста трудно да започнеш нещо голямо и да го завършиш "на един дъх"

Когато аз попаднах в ситуацията на Гошко, направих нещо подобно, нацепих проекта на много по-малки подпроекти, набелязах им основната функционалност и започнах да ги правя едно по едно. В началото първия release беше само с един работещ компонент, всичко останало седеше на "to be implemented", но клиента беше доволен защото основния компонент беше готов и работеше, плюс това му бях обяснил, че нещата ще стават постепенно, а той редовно виждаше някакъв прогрес.
Разбира се тогава не бях чел статията на Джоел и не знаех какво точно правя, но се получи.

Да кажем, че смислените ми проекти се броят на пръстите на ръцете ми, интересно е по-experienced програмистите да кажат какво мислят по-въпроса.

неделя, юни 14, 2009

Web browser-ски истории

Преди да започна на философствам, да си излея мъката.
Оставям си лаптопа пуснат и излизам като само заключвам екрана за да не пипат любопитни хорица. Прибирам се на следващия ден. Пиша си паролата, влизам.
Всичко сече зверски. Системата е тотално неизползваема. 100% cpu usage. top показва, че най-времезаемащия процес е firefox с 2%. Имам 1gb RAM, заети около 400MB, swap 960MB от 1GB.
Swapoff твърди, че не може да освободи партишъна. Чудя се дълго време какво става.
Оказва се, че след убиване на Firefox (който по принцип не се спира) се освобождават 150MB RAM и 700MB swap! wtf !!!
Нямам идея какво прави тоя браузър и какви мамка му ги пише в тоя swap.

Колкото повече се увеличава числото след името Firefox, браузъра става все по-функционален, но и все по-тежък. За сравнение един тъп уеб четец като Opera направо кърти по отношение използване на памет и скорост. А уж нямат тази огромна потребителска база, нямат същия брой разработчици и т.н., а все пак се справят прекрасно, колкото и да не искам да го призная.
Firefox сякаш продължава да трупа потребителска база, осланяйки се само на стара слава. А борбата при браузърите става все по-ожесточена след като google се настаниха на масата с намерение да вземат голямо парче от тортата. Първите бета версии на google chrome за linux и mac вече са факт, а фурора, който предизвика излизането на версията за windows просто не се нуждае от коментар.
Microsoft май последни осъзнаха, че пазара на уеб браузърите не им принадлежи по право и набързо се втурнаха да вадят нови версии на своя печално известен Internet Explorer.
Opera без да вдига много шум вади версия след версия, всяка следваща стъпка е точно на мястото си и се радва на почти фанатични потребители.
Май само Apple от самото начало имаха ясна визия какво ще правят с техния Safari, но пък и тях никой не ги притиска - нямат конкуренция на Mac платформата и никога не са имали амбициите да направят нещо сериозно в света на така презираните PC-та.
Единствения останал жокер в ръкава на Firefox е неговота функционалност, но ако не се направи нещо по въпроса с бъговете и бавната работа, просто няма как да продължат нещата нагоре.

Наскоро се замислих много за нещата около браузърите покрай един нов проект наречен uzbl. Момчетата, които го разработват твърдят, че никой от съвременните браузъри не следва unix философията, че всяка програма трябва да прави само по едно нещо и то да го прави добре. Те казват, че не им трябва сложен потребителски интерфейс, искат удобство и най-важното - казват, че всичко - от табове, през bookmarks, до ad-blocker трябва да става извън браузъра в отделни скриптове.
Пробвах го, отзад стои webkit, използва режими на работа както VI, скритповете за bookmark и download са на тъп bash и е най-бързия браузър, който някога съм ползвал просто защото няма какво да го затормози.
Ясно е, че uzbl не е продукт за всеки, малко хора ще се хванат да разучат shortcut-ите и да настроят браузърчето така че наистина да им е удобно. Накратко тази програмка никога няма да добие голяма популярност, но отваря някои много интересни въпроси относно това как се прави качествен софтуер.

btw, Виктор (един приятел от Русе) му хареса идеята на uzbl и направи един негов си клонинг на qt, който си има дори и табове. Ако се реши да се доразвие проектчето, ще пуснем малко source пък да видим... :)

четвъртък, юни 04, 2009

PHP method chaining

class Chain{

  var $text;

  function addHello(){
   $this->text .= "Hello ";
   return $this;
  }

  function addWorld(){
   $this->text .= "World!";
   return $this;
  }

  function getText(){
   return $this->text;
  }
}

$obj = new Chain();
$text = $obj->addHello()->addWorld()->getText();
echo $text;
?>
Резултат:


Hello World!


Ей така можете да си chain-вате методи в php. Примера е идиотски, но показва общата идея без излишни глупости :)
Къде може да се използва вие си знаете. Аз писах едни active record нещица. Пести писане и най-малкото така кода ми изглежда по-добре :)

сряда, април 29, 2009

Писане на PHP конзолни скриптове


Успях хубаво да си счупя Linux-а, опитвайки се да инсталирам една операционна система, която упорито твърди, че не иска да се инсталира на PC. След някои хора - потоп, след тая ОС(която не искам да споменавам) - reinstall :)
Та, успях да си спася htdocs, но понеже не съм от най-умните забравих да си копирам конфигурационните файлове. В следствие на това като си връщам нещата обратно трябва да си направя наново и всичките виртуални хостове.
За да се добави такъв хост трябва да редактирате 2 файла и да се направи една директория, което си е работа, а и когато трябва да го направиш много пъти, нещата не придобиват никак приятен вид.
И понеже съм си originaly мързелив реших да го направя със скрипче.
btw, винаги съм твърдял, че е по-добре да загубя 20 минути в писане на някаква глупост, отколкото да губя 10 правейки го на ръка и затъпявайки :)
Само да вметна, че пиша уеб шитни и хич не се радвам когато трябва да се правя на Linux администратор и за това ползвам xampp (в случай, че се зачудите за странните пътиша). Един такъв админ ще се хване и ще напише скрипта на bash и той вероятно ще изглежда нещо като това:


#!/bin/bash

#some backup
cp /opt/lampp/etc/extra/httpd-vhosts.conf /opt/lampp/etc/extra/httpd-vhosts.conf.backup
cp /etc/hosts /etc/hosts.backup

# creating some stupid vars :P
while read line
do
file="${file}${line} \n" ;
done < "/etc/hosts";

new_host="127.0.0.1 ${1} \n";
new_vhost="
\n
\t DocumentRoot /opt/lampp/htdocs/${1}/ \n
\t ServerName ${1} \n
\n \n";
new_dir="/opt/lampp/htdocs/${1}/";

#creating new virtual host
mkdir $new_dir;
chmod 755 $new_dir;
echo -e $new_vhost >> /opt/lampp/etc/extra/httpd-vhosts.conf
echo -e $new_host > /etc/hosts;
echo -e $file >> /etc/hosts;

#restarting the server
/opt/lampp/lampp restart

За да добавите нов виртуален хост просто изпълнявате:
./addvhost.sh test

И скрипта ще свърши останалото за да се добави хост с име "test".
Колкото и да е powerfull bash-а, не пиша по цял ден на него и примерно тоя скрипт ми отне около 15 минути, основно защото половината време трябваше да чета документация.
Ако сте като тъп уеб дИвелъпър като мене и php ви е по-удобен, вече (то не е много отскоро ама айде) можете да напишете същото и на php.
Нещо като това:

#!/opt/lampp/bin/php
$param = $_SERVER['argv'][1];

//create backups
copy('/etc/hosts', '/etc.hosts.backup');
copy('/opt/lampp/etc/extra/httpd-vhosts.conf', '/opt/lampp/etc/extra/httpd-vhosts.conf.backup');

// set some vars
$hosts_file = file_get_contents('/etc/hosts');
$vhosts_file = file_get_contents('/opt/lampp/etc/extra/httpd-vhosts.conf');

$new_host = "127.0.0.1 \t $param \n";
$new_vhost = "
\n
\t DocumentRoot /opt/lampp/htdocs/$param/ \n
\t ServerName $param \n
\n \n";
$new_folder = "/opt/lampp/htdocs/$param/";

// creating vhost
mkdir("/opt/lampp/htdocs/$param/", 0755);

$fh = fopen('/etc/hosts', 'w');
fwrite($fh, $new_host);
fwrite($fh, $hosts_file);
fclose($fh);

$fh = fopen('/opt/lampp/etc/extra/httpd-vhosts.conf', 'w');
fwrite($fh, $vhosts_file);
fwrite($fh, $new_vhost);
fclose($fh);

// restart the server
$output = shell_exec('/opt/lampp/lampp restart');
echo $output;
?>

За да си свърши работа скрипта иска да му кажете нещо от типа:
./addvhost.php test

Както виждате нищо страшно. Върши абсолютно същата работа и не съм засичал, но ми се струва, че ми отне половината от времето на bash-a.

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

За добро или лошо php се мъчи да излезе от сървърната среда и да се превърне в пълноправен език за административни скриптове и дори desktop приложения(phpgtk).
Наскоро гледах някъде в нета сравнение на езиците за програмиране и корабите. Примерно java беше описана като огромен транспортен кораб, който върши много неща, но не е много приятен за каране.
Там php беше сравнен с малък риболовен кораб - малък, бърз и върши точно това, за което е направен.
За мен лично така и трябва да си останат нещата, но нищо не пречи на php да се пробва при десктоп приложенията.

edit: За времето за което написах тези скриптове и този пост, можеше да си свърша работата, но нямаше и да е наполовина по-забавно :)

сряда, март 25, 2009

Как да превърнем gedit в IDE за C++

Ако ползвате GNOME, то е твърде вероятно да използвате и gedit и ако като мен от време на време ви се налага да пишете на C++, а не ви се занимава с големи и тежки IDE-та то вероятно този съвет ще ви е от полза.
Простичкия но мощен gedit има много готини модули. Можете да ги видите като накликате Редактиране / Настройки и отидете на таба Модули. От там активирайте модула "Външни инструменти" и наснете бутона за насктройките му. От там добавете нов Tool и наблъскайте вътре следните настройки.

Description: Коплиране на C++ файл
Shortcut key: F5
Command: g++ $GEDIT_CURRENT_DOCUMENT_NAME -o ${GEDIT_CURRENT_DOCUMENT_NAME%.*}
Input : Нищо
Output: Показване в долния панел
Aplicability: Всички документи

Благодарение на това ще можете с бутона F5 да компилирате автоматично файла, който сте отворили. Това ще компилира само 1 файл, ако искате да компилирате по-големи проекти, то вече има добавена функция, с shortcut key "ctrl + F8", която търси makefile.

Следва добавяне на следващ контрол:
Description: Изпълнение на програма
Shortcut key: F6
Command: ./${GEDIT_CURRENT_DOCUMENT_NAME%.*}
Input : Нищо
Output: Показване в долния панел
Aplicability: Всички документи

От тук нататък остава само coding, натискате F5 за да компилирате и ако няма никакви грешки F6 за да изпълните програмата си.
Лесно и бързо, перфектно за писане на малоумни програми за университета :) :P

П.П. Надявам се няма нужда да обяснявам как това може да работи с C или който и да било друг език и компилатор :)

вторник, ноември 18, 2008

10 advanced съвета за по-добро PHP програмиране


Под това време днес в едно дизайнерско списание, което от време на време гледам (`щото който не може само гледа) излиза статия озаглавена 10 Advanced PHP Tips To Improve Your Programming или в свободен превод 10 съвета за напреднали php програмисти подобрят кода си. Не съм някакъв гуру, но имам няколко коменара по темата.
Ето ги и съветите:

1. Използвайте SQL injection cheat sheet
Често казано не успях да разбера какво точно имат в предвид под cheat sheet, но аз отдавна не филтрирам нищо ръчно. Примерно в CodeIgniter, Active Record класа върши филтрирането за sql injection и в security helper-a си има функция за филтриране срещу xss.

2. Знайте разликата между операторите за сравняване.
Тук съм много съгласен. Признавам си, че едва преди месец-два научих разликата между "==" и "===", просто преди това не бях обръщал никакво внимание.
Не че има много общо, но пък аз често в бързина правя грешката да слагам едно "=" вместо две. За незапознатите с php - едно "=" присвоява стойност, а "==" сравнява променливи. Наскоро също ми дадоха един интересен съвет да избегна това, който обаче работи само ако сравнявате променлива с число(примерно), тоест когато не сравнявате 2 променливи.
Тоест, ако сгрешат, повечето хора пишат следния код:

if($a=1){ blah();}

което вместо да сравни променливата с 1, просто й присвоява стойност 1 и винаги връща TRUE, от където пък може да станат много проблеми. Ако обаче вместо това напишем:
if(1=$a){ blah();}

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

3. Избегнете else
Тук дават един интересен пример. Този код:
if( някакво условие) {
$a=5;
} else {
$a=10;
}

може да се преработи така:
$a=10;
if( някакво условие ){

$a=5;
}

Като според тях втория пример е по-добър. Аз лично не виждам съществена причина това да е така, дори мисля, че втория код е малко по-объркващ, въпреки че е по-елегантен. Unix гурутата винаги са учели, че не трябва да се стремим да пишем хитър код, а възможно най-тъп, в смисъл възможно най-лесно разбираем от следващия, който ще седне да работи по този проект след теб. Това е съществено за един open source проект, защото ако кода е омазан от някой "юноша бледен", който се е скъсал да пише странни недокументирани workaround-и, ще е доста трудно някой да допише нещо и от там вече всичко умира :)

4. Избегнете скобите
Знаете, че можете да напишете
if( някакво условие) {
something();
} else {
something_else();

}

така:
if(някакво условие) something();
else something_else();

Твърдо, ама твърдо съм против това. Пестиш 2 скоби, 1-2 реда и губиш няколко минути на човека след теб за да разбере какво правиш! В случая, който съм показал е лесно да се види какво става, но представте си, че имате няколко вложени if-else конструкции, тогава вече наистина става голямо мазало, защото не се вижда кое къде започва, къде свършва и т.н. Скобите не са за php парсера, те са за вас.
Моля ви, не го правете това, не пишете без скоби!

5. Използвайте str_replace() вместо ereg_replace() and preg_replace()
Това специално не го знаех, но според тях str_replce е 61% по-бързо от ereg_replace и preg_replace. Не че и без това съм се засилил да праскам regular expressions, където трябва и не трябва. Проста причина, повече време ми отнема да измисля regex-а вместо да си прасна str_replace. Това може да не е така за всички, но поне при мен е така. Мисля, че ще е хубаво да се има в предвид.
Този съвет го одобрявам :)

6.Използвайте троични оператори
Не! Моля ви, това също не го правете. Всеки път когато видя троичен оператор отделям 5 качествени минути в красноречиви поздрави към майката на предишния програмист.
Вече обясних защо, за мен това ненужно усложнява кода. Нека си се придържаме към тъпата двуична логика.

7. Използвайте memcached
Признавам, че тук нямам опит, но щом те така казват, да предположим, че тоя съвет е валиден. Евентуално за това, други хора могат да кажат по-компетентно мнение.

8. Използвайте framework
Както вече споменах аз си харесвам CodeIgniter и си използвам него. Имам един колега от университета, с който често спорим на тази тема. Той твърди, че не трябва да се ползват никакви готови framework-ове, че дори и template системи, смята че бавят излишно. Аз пък смятам, че няма нужда да си блъскаш главата да пишеш едни и същи неща по 1000 пъти и то при положение, че някой вече ги е написал вместо теб. Ако пък нямате отделен дизайнер наистина не виждам голям смисъл да се ползва template система. Всеки си избира сам, но аз препоръчвам наистина да ползвате framework.

9. Използвайте правилно suppression оператора
Нямам идея как се превежда suppression оператор на български, става въпрос за символа @ използван като оператор. Иначе каква е идеята?
if (isset($albus)){
$albert = $albus;
}else{
$albert = NULL;

}

е еквивалентно на:
$albert = @$albus;

Проблема е, че ако го напишете по-втория начин се изпълнява 2 пъти по-бавно, защото @ се използва неправилно. Правилното използване е чрез референция:
$albert =& $albus;

Според мене това е само за фанатици на тема скорост, въпреки че е интересно :)

10. Използвайте isset вместо strlen
Това е доста интересно приложение на isset, за което не бях се сещал. Ако искате да определите дължината на даден стринг е нормално да използвате:
echo strlen($str);
Но примерно ако примерно искате да проверите дали някъв низ не е по-къс от определен брой символи:
if (isset($str[9])) {
echo 'низа е равен или по-дълъг от 10 символа';
} else {
echo 'низа е по-къс от 10 символа';
}

По-добре било да се ползва isset защото било 5 пъти по-бързо от strlen. Важно е да се отбележи, че strlen е опимизиран да прави точно това и се справя по-бързо с по-големи низове. Strlen обаче е по-бърз при малки проверки като тази от примера.
Има и една екстра. Ако бяхме написали кода така:
if(strlen($str) > 9) { ...

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

Повечето съвети в статията на Smashing Magazine (според мен) са или грешни или излишни и не чак толкова необходими. Какъв е извода ?
Дизайнерите да си гледат дизайна и да не се бутат, където не им е работа :D
(както и обратното).

четвъртък, ноември 13, 2008

За българо-индонезийската дружба

Напоследък пиша някакви бози, та ми се наложи да направя нещо като slideshow, което постоянно "върти" дадени картинки, като всяка от тях е линк към определено място.
Не ми се обяснява точно каква му е идеята, надявам се скоро да ви покажа :)
Та, тъй като съм прост php-ер и грам не вдявам от флаш, започнах да търся готово решение.
Първото на, което попаднах беше това. Най-доброто, което намерих въобще, има си бутони за навигация, всичко се настройва през един тъп xml и изобщо - песен. Само че ... 49$. Аз ако имах 49$ щях ... абе не знам какво ама нямаше да ги дам за това.
Следващото също беше добро, но пък там също ми искаха пари. Не че съм за 20$ ама ...
Накрая стигнах до този клас на индонезиеца Adi Setiawa, който беше написал половината решение. Неговия клас нямаше възможност да слага линкове към всеки слайд. Малко ровене, малко четене и благодарение на помощта на neter (от linux-bg.org форума) успяхме да сглобим необходимата функция.
btw, оказа се, че php разполага с доста powerful библиотека за работа с флаш - ming. За съжаление е още beta и документацията яко куца.
С Adi Sеtiawa си разменихме по 1-2 мейла и преди малко му пратих новата версия на класа, която вероятно ще публикува.
Идеята не е толкова за това, че съм успял да си напиша някакво тъпо flash slideshow, просто е готино да видиш на практика, че open source модела наистина работи, макар и в такива малки мащаби.
За момента, единственото, което няма новата версия на slideshow-то, а ми се иска да има, е навигация между слайдовете, но и за това има време. Все ще се намери някой добър финландец да го напише ;)







source code

четвъртък, август 28, 2008

В търсене на Балмъровата точка ...

В търсене на Балмъровата точка документацията започна да се размазва по екрана ....Резултата: Излизам да си допия :)
http://xkcd.com/323/

понеделник, август 25, 2008

Krumo - по-лесния начин


Понеже напоследък се правя на php developer често ми се налага да прекарвам "приятни" часове в debug-ване. И тъй като тази работа и без това е бавна и изнервяща, днес намерих начин да я направя поне малко по-човешка. Става въпрос за един български проект - Krumo.
Автора на проекта е небезизвестния Mrasnika. Странното е, че разбрах този факт малко след като тествах приложението защото сайта е на английски и по нищо не дава вид, че се разработва от българи/н.
Идеята му е, че вместо да се използва var_dump и print_r, които изкарват един доста inhumane output, е по-лесно да се използва доста по-красивия и лесен за разбиране интерфейс на krumo.
В случая съм принтнал $_POST и един стринг, който ми държи заявката към mysql. Можете да видите на шот-а, че всички масиви и променливи, които се извеждат от krumo излизат в приятни drop down блокове (ще ме извинявате за английския), което пък е много удобно ако на страницата и без това имате 1000 други елемента.
Инсталацията изисква просто да настроите url-ите в един конфигурационен файл и да include-нете class.krumo.php. След това просто викате :
krumo($_POST)
или каквото там ви трябва.














На по-малките картинки съм принтнал три пъти един и същ масив.
Първия път е просто:
print_r($array);
Изхода е около 3 екрана и ако ви се струва ок, то значи нещо наистина не ви е наред :D
Втория път съм приложил ултра мега хакерския метод за оформяне:
echo "pre";
print_r($array);
echo "/pre";
(стрелките на html таговете ги няма заради blogger, rrrr)
Това до някъде оправя положението, но този път изхода е около 7-8 екрана.
Третия вариант е просто:
krumo($array);
Сгънато заема 2-3 реда и можете по отделно да видите всеки елемент от масива.
Сами можете да видите разликата.
Опитайте го, вярно е, че можете и без него, но пък така е доста по-лесно.

* това не е платена публикация :P

четвъртък, юни 05, 2008

Blog upgrade

Днес най-после се хванах да си пооправя блог-а. Както вероятно виждате, сменил съм темата. Добавих под header-а някои по-важни линкове - към галерията ми в Picassa, към Twitter страничката ми и към профила ми в Myspace. Изкарал съм RSS бутонче на по-видно място. Направих едно леко реорганизиране на етикетите защото беше настанала същинска кочинка :)
Сложих и бутон към svejo, така че ако харесате някоя статия ще ви е доста по-лесно да я добавите към svejo.
Навярно си спомняте, че преди време бях стартирал втори блог Моята призма , този блог изпълни своята роля като емоционален отдушник, но мисля, че вече нямам нужда от него. За това преместих всички статии от там в този блог със същите дата и час на публикуване. Всички те са с етикет myprism.
Това е, което ми идва на ум за сега. Ако мислите, че може да подобря още нещо, споделете го с мен :)
Бих се радвал и ако отделите 10 секунди за да ми кажете какво мислите за новия вид на блога.

понеделник, февруари 04, 2008

RSS Feed? - няма проблеми

RSS-а е много готино нещо, но аз съм мързелив човек и не ми се занимава с писане на неща, които вече някой друг е написал. :)

Искам да ви представя едно истинско откритие FeedCreator, един много готин клас, с който буквално за минути пускате RSS Feed. Кратко лирическо отклонение - SourceForge rullz !!! На мен ми отне около 20 минути, но ако предположим, че имате мозък, не сте си омазали базата данни и използвате utf-8 ще ви отнеме най-много 5 мин.
Някои много важни неща, за хората, които смятат да го ползват. НЕ слагайте html тагове заедно с текста в базата данни. Аз преди 6 месеца така започнах и сега си чупя главата, а пък както вече споменах съм прекалено мързелив за да седна и да ги оправя. В конкретния случай бях започнал да си пиша филтър, който ги маха преди да ги подаде към feed creator-а, но внезапно ми хрумна идеята, че съществува strip_tags. Както обича да казва майка ми - "Малко акъл да имаш, ама на време да ти дойде". Съдбъ ...
2-ро: В случай, че използвате cp1251 като encoding (както мен), трябва да ви уведомя, че това не е много добра идея. По подразбиране (демек по дефолт) FeedCreator работи с utf-8 и си има много добра причина за това - такъв е стандарта. Все пак тази настойка може да се промени с малко ровичкане из класа. Добре, че не всички хардкод-ват като мен. :P (май споменах, че съм мързелив тип).
И накрая да не забравите да си валидизирате feed-a от тук. Не би трябвало да плюе грешки, поне при мен всичко си беше ок, само дето ме предупреди, че cp1251 sux.
И като цяло това са ми съветите, помощ при подкарването не мисля, че ще му трябва, много хубав пример са си дали хората в пакета.

edit: Firefox, Safari и Opera нямат никакви проблеми с feed-a, но Internet Explorer 7 твърди, че такова животно като RSS feed с cp1251 encoding няма. При което отказва въобще да го чете. Има начин да се прекодира с php, но аз нямам намерение да го правя, щом за сега никой не ме кара.

четвъртък, септември 13, 2007

Честит ден на програмиста

Честит ден на програмиста на всички, които се чувстват такива.
Аз го празнувам пишейки менюто на DINX, реших така да се казва проекта. Съкращението е от Do I Need X. Все още търся по-добри предложения за име. След като свърша по-голямата част от работата ще пусна и едно сайтче на проекта и ще напиша тук по-подробно.
Довечера може да заформим едно beer парти.

Денят на програмиста е неофициалният празник на програмистите, отбелязва се на 256-тия ден от годинатаЧислото 256 (256 = 28) е избрано, защото това е броят числа, които могат да се изразят с помощта на един байт (8 битa). През високосните години този празник се пада на 12 септември, през невисокосните - на 13 септември.

сряда, септември 12, 2007

Бого, SEO, save-darina, авто стоп и мешана салатка в Бръшлен

Ако се чудите защо на невероятно тъпите заглавия, които измислям на последък, искам да ви споделя, че просто не мога да пиша само за по една тема и по-добро не мога да измисля. Неккъф хаос се получава. Та ...
Помните ли състезанието по SEO, на което мислех да участвам ? Преди минути прочетох една доста интересна идея тук
На който не му се влиза, накратко: Слагате линк към блога на Богомил "Бого" Шопов с текст яицазимитпо лъгуг. Така му "правите хубаво" за пред google и той печели състезанието. След това дарява 1000 лева на save-darina.org и ... това е. Ако ви харесва идеята - давайте. :)
Второто нещо за което исках да пиша е, че за първи път в живота си пътувах на стоп и беше супер готино. При това е доста евтино ;) Пропътувах само 30 километра, до село Бръшлен русенско, но по-важното е, че стигнах целта си. По принцип не бих тръгнал ей така, сам, с една раница на гърба по магистралата да мятам палци, но обстоятелствата бяха малко по-екстремни. Бях сам на някакъв главен път, а след 1-2 часа щеше да се стъмни и тогава вече положението щеше да е много по-кофти.
Отидох там, хапнахме, пийнахме, денсихме и както винаги не ме оставиха да спя. За това в момента съм леко зле и едвам пиша. Утре сигурно ще оправям правописни грешки. Велик си Мите, само ти можеш да държиш цяла нощ 6 човека будни без да те пребият.
Трето и май последно. Новата ми мания е да накарам 200 мегахерцовия изрод в другата стая да работи като напълно нормална десктоп машина (разбирайте слушане на музика, браузване в интернет, чат, записване на дискове и гледане на филми). Естествено с Linux, естествено без X, ще се опитам да го направя основно на bash с ncurses и framebuffer. За момента съм подкарал музиката и браузъра. Да гледаш картинки в конзолен браузър е супер :) Ако поддържаше и CSS щеше да е убийствено. Филмите тръгват, но mplayer много се задъхва.
Та мисля това да го стартирам като проект за дистрибуция или нещо от сорта. Подробности ще пиша в някой отделен пост. Ако ви харесва идеята, драснете някой ред и може да поработим заедно (Викторе не се скатавай!). Само да вметна, това е единствения ми проект в последната 1 години с некомерсиална цел. Явно много съм пропаднал. Преди малко започнах да пиша някои неща и мога да ви кажа, че удоволствието да пишеш само за себе си е в пъти по-голямо.

събота, септември 01, 2007

Започна SEO състезанието

Преди около час започна SEO състезанието организирано от WebMasterBG.org. Наградния фонд е 1000 лева, което мисля, че е добра сума. Целта до 1 декември 2007г. да "избутате"
вашия сайт на първо място при търсене на "яицазимитпо лъгуг". Как са го измислили това е пълна мистерия. Преди един час такава комбинация от думи не е съществувала в интернет, по времето когато пиша този пост вече има 4 резултата. :)
Хората не спят (и в буквалния и в преносния смисъл). :)
Аз мисля да се включа, но на олимпийския принцип (по-важно е участието), просто защотото нямам шансове за победа, но се надявам да науча много покрай състезанието. Добре е да се спомене, че по регламент победителя трябва да каже какви техники е използвал за да популяризира сайта си. Ако не друго, то поне ще бъде интересно да наблюдавам борбата на най-добрите в бранша и "Нека по-добрия победи!" :)

By the way, намерих си много хубава книжка- Professional Search Engine Optimization with PHP. Има доста интересна концепция и пише "хубави" неща. Снощи като я започнах четох до 10 часа сутринта и мисля като публикувам този пост да продължавам да чета. Тъкмо може да науча нещо за състезанието. :)

edit: Прозрях го !!! Яицазимитпо лъгуг всъщност е "гугъл оптимизация"! :D
Просто нали :)
edit2: И моя блог се появи при търсене на тази ключова дума. Забележете как всички, които са публикували думата в блога/сайта си са го направили с удебелен текст. Защо ? Ами погледнете някои от статиите за SEO по долу.

четвъртък, април 26, 2007

Нов дизайн за борците

Въпреки че не съм много силен в тази област, направих нов дизайн за сайта unak-loko.org. Може да споделите мнението си тук, не бъдете прекалено критични :)

сряда, април 11, 2007

Оттървах се !!!

Ако все още има някой, който не е разбрал - спечелих отлична грамота на състезанито по ИТ в Св. Константин и Елена. Това означава, че вече съм приет в Пловдивския :)
Всички други сега тръгват по изпити, а аз се оттървах.
Радостта някакси остана на заден план, тъй като съм затрупан с работа и следват още 2 състезания. Очаквах, че ще ми е по-весело, когато получа грамотата, но тогава бях прекалено уморен, а сега нямам време да се радвам. Чак сега ми остана малко за да напиша нещо в блога.
Това училище ме побърква. Седим и абсолютно нищо не правим, само си губим времето. Това са 5-6 часа дневно, които са безвъзвратно загубени. Ако си взема лаптоп може и това да се поправи :)

П.С. Новия Kultur Shock е просто велик. \m/