Проблеми с 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 | Leave a 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 Miscellaneous, Programming | Leave a comment

Колелца за кънките

Имам кънки (ролери) Worker Madrid

Обаче ги карах доста и по доста неравни терени. Наръбиха се и се изтъркаха колелцата и прецаках няколко лагера.

Тъгнах на лов за колелца. Първо отидох в магазина откъдето ги бях взел – Яко. Нямаше колелца, нямаше и лагери пълен комплект. Лагарите са по 2 на колело, общо 16 за двете кънки. Потърсих и по главната – нищо. Това стана преди началото на тази зима. Миналата седмца – същото, в якото имаха само 1 комплект лагери – за 1 кънка, колела нямаха моя размер. Естествено че не ми трябва за едната само!

Реших да си поръчам от ролери.нет Гледах, гледах и реших да взема следното:

  • Колела Final Outdoor – 85А твърдост
  • Лагери ABEC 7, понеже нямаше 9
  • междуосие
  • Болт, за да махна спрачката, при нея болтът е по-дълъг

За жалост, като добавих в количата лагерите и ми каза че няма в наличност в склада, а на мен много ми се кара … смених ги с abec 5

На следващия ден ми звъннаха за да потвърдя поръчката. Последва един доста дълъг разговор, че вероятно съм си сгрешил частите. Обясниха ми, че междуосията вероятно не са за моите кънки. От болт – нямам нужда, с шайби ставало 🙂 . Казах за лагерите и казаха че ако имат по-хубави ще сложат. Имах работа и им споделих какви кънки имам и каква ми е нуждата – колела и лагаери, бюджетът – 100лв, да пращат каквото сметнат за добре. Евала че не ми изпратиха части които няма да ми трябват 🙂

Конкретните редакции:

Здравейте,
Благодарим за Вашата поръчка. След телефонния разговор който проведохме, промених Вашата поръчка както следва:
– премахнах 8мм междуосия от поръчката (те не са за фитнес ролери).
– премахнах 8мм болт от поръчката. Може да използвате метални шайби закупени от близката желязария за да запълнете празното място което оставя спирачката. Сложете равномерен брой шайби от двете страни на болта за да се запази баланса. Отворът на шайбите трябва да е минимум 7мм.
– добавих 6мм междуосия които са за фитнес ролери.
За съжаление за да се съберем в бюджета от 100 лева, лагерите трябва да са стандартни ABEC5 или ABEC7. Ако в склада ни имаме налични ABEC7 2 броя туби, ще сменя в поръчката лагерите от 5 на 7.
Искате ли да Ви сглобим колелата, междуосията и лагерите преди да Ви ги изпратим?
Поздрави,
Калин

Днес пратката пристигна. Обаче при мен колелцата имат междуосия с уши и ако не ги сложа не мога да стегна болтовете; сложих си старите междуосия 🙁 . Следващият път директно нови кънки ще вземам, то се е видяло че колела + лагери, за да са хубави излиза към 150лв. Дразни ме как станаха в момента нещата и ще трябва да взема и шина, която не знам дали ще е съвместима с това което имам, а това е над 100лв разход. Затова на сигурено – влака до София и взимам за 300-400лв едни стабилни кънки. Колелцата ми се виждат супер – днес ги сифтосах. Имаше вятър 30-50км/час, на моменти като ме духнеше отзад по силно и карах с над 30, само гледах да не мина през пръчка/листо; за щастие поради наличието на стабилен вятър нямаше много хора на гребната 🙂

Благодаря roleri.net, надявам се с тези колела да изкарам поне 600км 🙂

Posted in Rollerblade | Leave a comment

Минах на Debian Testing

Омръзна ми да седя с някакви стари пакети и реших да мина на testing 🙂

Ati drivers fix

Уж всичко се ъпдейтна без проблем, работеше си 2-3 дни. Реших да изгледам филм, пускам филма, зарежда VLC-то и тряс KDM-то се рестартира. Пробвам втори, трети път – същото. WTF. Пусках някакви видео тестове – всичко е ОК. Пускам 1080p видеа в youtube – ок е всичко.

Чета из google … нищо, всякакви фикстове не работят. След 3 преинсталации ( да, предположих че не що е счупено и ъпдейтнах до unstable, после наново на stable, testing, наново направо testing, stable после testing). Проблемът се появява точно след като инсталирам на ati driver-ите.Попаднях на някакъв форум (за съжаление не помня кой и линк не мога да намеря, ако някой го засече да ми пише да им сложа линкче)  че проблемът бил накъде player-а рендира. Т.Е. фикса е следния:

  • Отварята player-а (аз ползвам VLC)
  • Tools
  • Preferences
  • Video
  • Output
  • GLX (XCB)

Това е!

Фикс за smartSvn

Изтеглете си на sun java-та от сайта им. Понеже имало някакви лицензионни проблеми и я няма по репотата. Разархивирайте я някъде и в smartsvn.sh на 5-6 ред имате

# To specify an alternative Java Runtime Environment, uncomment the following line and edit the path

След него добавете

SMARTSVN_JAVA_HOME=/home/potaka/programs/java-sun/latest

като /home/potaka/programs/java-sun/latest се сменя според това къде ви е java-та

 

NetBeans не тръгва.

Пускам го през конзолата – нищо, няма логове във /var/log/

И NetBeans ще работи с sun java, за целта:

отваряте <netbeans dir>/etc/netbeans.conf

и променяме следния ред

netbeans_jdkhome=”/home/potaka/programs/java-sun/latest”

като /home/potaka/programs/java-sun/latest се сменя според това къде ви е java-та

Но при мен това не беше достатъчно. Не знам как стигнах до решението, но то е: изтривате всичко от ~/.netbeans/7.1 и тръгва като пушка.

Posted in Debian, Linux | Leave a comment

Статистика за 2011 година

Вътрешни гуми около 5бр х 7лв = 35лв

Курбели 50лв

Колодки 4лв + 6лв = 10лв

Капли 35лв + 7лв изправяне = 42лв

Батерии 9лв

Тромба 50лв

Фар 22,5лв + 66лв

Смазка за верига 10лв

Раница 75лв

Шал 3лв

Шапка 8лв

Ръкавици 18лв

Лепенки/лепило 10лв … може би

Чантички 32лв

Скоростомер 35лв

Торбичка 1,5лв

Щанги 4,5лв

Ключ 15: 12лв

Очила: 2х20лв

Всичко: 466,5лв

Изминати километри от средата на лятото: 3360

Със сигурност съм изпуснал нещо, също имам 2 рестарта на скоростомера за които не помня километри.

За смяна: верига, вилка, задна главина, седалка.

Не съм включил в статистиката една пневмония 🙂

 

Статистика 2012

 

Posted in mtb | Leave a comment