Update към Xdebug 2.2.0

Гледам излязла в версия 2.2.0 и веднага ъпдейтвам. Минават някакви букви в конозлата и всичко изглежда ОК. На другия ден пак пиша pear upgrade и същото, на по-следващия ден – същото. Зачетох се и какво да видя:

Build process completed successfully
Installing ‘/usr/lib/php5/20100525/xdebug.so’
Segmentation fault

Но си работеше и беше обновено. Поразрових се грешката.

Намерих http://bugs.xdebug.org/print_all_bug_page_word.php?search=&sort=%27&dir=DESC&type_page=html&export=-1&show_flag=0

Понеже вече има xdebug.so нещо се омотавал ъпдейтера. Но все пак пренаписвал(override) xdebug.so и само не се отбелязвало че ъпдейтва е успешен – заради това 3 поредни дни инсталирам един и същи ъпдейт.

Решението: премахваме файла /usr/lib/php5/20100525/xdebug.so най-добре да го преместим, за да го имаме за всеки случай.

След това пускаме pear upgrade, ще даде съобщение че го няма xdebug.so и ще сканира всички файлове. Накрая всичко би трябвало да приключи успешно

Build process completed successfully
Installing ‘/usr/lib/php5/20100525/xdebug.so’
upgrade ok: channel://pecl.php.net/xdebug-2.2.0
configuration option „php_ini“ is not set to php.ini location
You should add „extension=xdebug.so“ to php.ini

Posted in php, Xdebug | Leave a comment

Статистика за 2012

800лв Cross parallax

21лв джобни инструменти

6лв верига

21лв скоростомер

10,50лв смазка finishline

12лв Отразителна жилетка

2лв лепенки за гуми

2,50лв инструмент за почистване на задни венци

15лв ухо

10,70лв мултифункционална кърпа, светлоотразителни лени, батерии(cr2032)

5лв силиконова смазка, на промоция :)

Posted in mtb | 5 Comments

Смяна на верига и реглаж на дерайьор

Взех ново колело ( cross parallax, но за това ще пиша в друга тема ) и реших да стегна малко ferrini-то. Най-проблемната част са ми скоростите и движенията. То другугото е неподвижно и или е здраво или не. Днес бях до магазина на maxcom в тракия.


Вижте по-голяма карта

Взех си за 21лв инструмент за сглобяване на верига, към него има и няколко шестограми. Реших че ще седи вкъщи и за 2-3-4 ремонта ще издържи. Да ама, не. Още със свалянето на старата верига го изкривих брутално – така че взимайте си качествени инструменти. Ако бях взел нещо добро щеше да ми излезе 50-60лв, сега ще ми излезе 70-80 :( Също и изпазарувах 2 метра верига.

Как се сменя верига може да прочетете в mtb-bg. С доста зор смених веригата. Време е за ‘нежна’ настройка на дерайльора ( как да регулираме дерайьора може да прочетете отново в мтб-бг) Опъвъх, въртях…нищо брат…все едно имам едно копче, което генерира произволен резултат. По едно време открих че се е разхлабила свръзката между дерайльора и рамката (ухото).

Posted in mtb | 2 Comments

Проблеми с upgrade към php 5.4

Вчера ъпгрейднах към php 5.4, но чак днес ми се наложи да тествам нещо и ооо изненада suhosin apc и xdebug не работят.

Решение:

всички файлове от директория

/usr/lib/php5/20090626

не ни трябват, трябва да ги имаме в

/usr/lib/php5/20100525

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

Задавайте пълен път, например

zend_extension=/usr/lib/php5/20100525/xdebug.so

extension=/usr/lib/php5/20100525/apc.so

suhosin не ползвам и го изключих, apc & xdebug работят като пушка :)

Posted in php, Xdebug | 1 Comment

Dependency Injection – добър дизайн или излишно усложняване

В университета имахме да пишем есе за DI – добро или лошо. Харесали са това което сглобих за час и половина след катеренето … та реших да го споделя.

Dependency Injection и Inversion of

Control – добър дизайн или излишно

усложняване

Ангел Коилов

ф.н. 0801261017

Един от известните шаблони за дизайн е Dependency injection. Идеята му е, че когато създаваме функионалност, не трябва да я правим така, че да работи за точно определен случай с точно определени данни.

Да кажем че имаме програмист на име Иван. Иван знае за какво е и кога е добре да се използва Dependency injection. Той е написал функционалност за копиране. Използва абстракни класове за реализирането. Кодът му изглежда по следния начин Copy(Reader& r, Writer& w) . Всичко е супер и Ваньо има възможност да ползва Copy() с „четене” от бар код, клавиатура и скенер; може също да „пише” върху принтер, да изкарва резултата на монитора и да го щампова върху тениски. В съседното село живее върло компютърно гуру, известно в онлайн общоносттва като Авксений Хакера. Авксении има „уникалната” дарба да пише вируси за skype, да сваля данни от компютрите на приятелите с предварително инсталиран ftp сървър, да прейнсталира „бозата” и да решава задачите за девети клас по информатика. Гуруто вижда какво е направил Иван и веднага му удва на ум, че проекта който „пише” в момента се нуждае от точно такава функционалност. Авксении разработва онлайн магазин, подобен на ebay, но ще е с повече продукти и по-евтини, ще има търсачка подобна на google, но по-добра; ще е нещо супер-хипер мега яко. Ненадминатия ни компютърджия безпогрешно разпознава къде е необходимо да се използва черната магия наречена Dependency injection,а именно в стандартния изход. За целта се прави функция от вида echoCool(echoAble $object, outputAble $output). Така всичко което ще се подава на браузера, ще трябва да минава през тази функция. Цялата идея е, че ще трябва всеки ден в 00:00 часа, да пускаме един скрипт да праща „информативни” смс-и до „абониралите” се „потребители” за новите стоки и промоции. Обеден в себе си, Авксений смело пренаписва 6000 реда вложени if-ове и switch-ве. Най-накрая всичко е говото и навсякъде се ползва echoCool(). Всички string-ове са заменени с класове, който имат метод print(). За да защитим систамата си от пишман-хакери по подразбиране print() има параметър и всъщност излежда по следния начин: print($useHtmlSpecialChars = true), за да не се налага на владетеля на тъмната страна на бинарния код да пише на толкова много места досадното escape-ване за browser-ите. Написваме и модулът за sms-те. Той за втори параметър на echoCool подава такъв параметър, че резултатът се съхранява във файл, за да не товарим базата, за всеки потребител се изчита файла и се праща съобщение. Всичко е супер яко. Авксений си щрака с пръсти по цял ден и чат пат дописва някой if. Един леко мъглив следобед в творението на Авксении се появява стока със странното име „Nice cool <<pro>>“. Проблемът е че по подразбиране $яке->print() връща като резултат „Nice cool &lt;&lt;pro&gt;&gt;”, така трябва да се пусне към browser-а; но не и към sms центъра, защото „>“ не е специален знак. Творението, връх на инженерната мисъл не работи както трябва. Авторът му получава все повече грешни sms-и. Време е за fix. Владетелят на тъмната страна веднага измисля супер ефективен и бърз фикс.


echoCool(echoAble $object, outputAble $output) {

$text = $object->print();

if (get_class($output) == 'sms') {

$text = htmlspecialchars_decode($text);

}

$output->out($text);

}

Стана така, че нашият шаблон е „immobile” защото зависи от конкретната имплементация на print(). Въпреки че ще напишем fix-овете на едно място, това си остава лош код.

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

  • Класът – на места нямаме нужда от клас, даже нямаме нужда от функция, а просто извеждане на string. В този случай, не само че забавяме значително операцията, поради нуждата от създаване на обект, но и трябва да напишем това създаване някъде – ненужен код
  • Зареждането на класа от autoloader, всеки нов клас колкото и малко да е – забавя.
  • Функцията – бави с проверките, бави с това че извиква методи.
  • Interface – това, по принцип означава още един inteface за доста класове, още един файл, още бавене при създаването на класа.

Всичко това от горе, ще повлияе на

  • кеширането – първоначалното зареждане – четем няколко файла повече
  • opcode кеширането – кешираме повече информация.
  • Значилно забавяне на дебъгването на проекта – за да проследим какво прави print() трябва да влезем във функцията echoCool()
  • Ненужния код го пазим в системите за контрол на версиите. Всички си пазим тези backup-и на много места и по много
  • „Пиши кратко и разбирамо”, за жалост средностатистическия програмист има нужда от доста време да разбере шаблоните за дизайн. А щом използваме Dependency injection със сигурност ще ползваме и други, така на начинаещите ще им отнеме много време да навлязат даже и в най-простите неща.

Всеки шаблон е направен да решава определен проблем, това важи и за Dependency injection, няма магически начин по който да решаваме всички проблеми. Трябва да знаем какво, как, защо и къде да го ползваме. Често се ползва Singleton за пазене на инстанцията за връзка с базата данни, но когато се появи нужда от втора връзка към друга база едно ужасно решение е „Нека добавим параметър към getInstance()”, е да ама това всещност вече не е singleton.

Dependency injection е добър в следните ситуации:

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

Dependency injection не е добър в следните ситуации:

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

Ако винаги използваме Dependency injection с идеята, че ще можем лесно да променяме нещата определено сме в грешка. Архитектурата на software-а ни със сигурност има места на които това е възможно и без конкрения шаблон, а както спонемах неговото ползване има значително отрицателно влияне върху производителността. Dependency injection улеснява unit testing-а,а това е голям плюс.

Като заключение ще повторя по-горе казаното: Dependency injection е шаблон за дизайн. Всеки шаблон е добър за това, за което е измислен. Няма шаблон който трябва да се използва винаги и навсякъде, ако някой се е натъкнал на такъв – моля да сподели.

източници:

http://www.objectmentor.com/resources/articles/dip.pdf

http://www.potstuck.com/2009/01/08/php-dependency-injection/

http://www.tonymarston.net/php-mysql/dependency-injection-is-evil.html

Posted in Общи, Програмиране | Leave a comment