Categories
Статии

Няколко съвета към Data.bg

Прилагам няколко съвета към екипа на Data.bg, за подобряване на качеството на услугите им.

  1. Отрикийте магията на stripslashes и я приложете за табовете:  “Постове от блогове”, “Теми от форума”
  2. Всяка смяна на таба “Последни новини”, “Най-четени”, “Най-коментирани”, “Теми от форума”, “Постове от блоговете” и дъщерните на последните два, води до извикване на AJAX, за тяхното обновление. Дори и да правите кеш от сървърната страна, направете такова и от страна на клиента. Ще си спестите много ненужни заявки така.
  3. Разкарайте fade ефекта със смяната на новините от началната страница – направо ми скапва процесора ( Intel Core Duo ) и създава лъжливото впечатление за бавно работещ сайт.
  4. Като съм почнал с разкарването – оставете основните градове в България в кутията с “Времето”. В момента има към 50 града, а може спокойно, без да ощетите никого да ги редуцирате до 5-6 и така да си спестите излишни интерации на PHP-то.
  5. Спокойно може да премахнте и “Телевизия”. Толкова надолу е, че според мен никой не чете тази зекция.
  6. Смачакйте general.js – Ще спестите няколко К трафик.
  7. Страшно много етикети в “Новини”. Мислите ли, че някои наистина ги чете и използва? Клъценете 2/3-ти от тях.
  8. Сериозно помислите над въпроса дали ви трябва секция “Блогове”. Ако някой иска да започне сериозен блог – той ще го направи като си вземе домейн или да използва една от многото безплатни и надеждни услуги. Вашата такава, ще се напълни с много, много, много ненужни постове. Повечето хора ще напишат една, две теми и ще се окткажат. Може би просто не сте развили услуга все още, но според мен е по-добре да се откажете от нея.
  9. Имате сташно много информация. “Новини”, “Блогове”, “Форум” …  И от всичките вадите последните 10-15 … не съм убеден, че е необходимо толкова много последни съобщения да имате.

Това са по-основните неща, които забелязвам. Надявам се да вземете впредвид някои от тях. И ако изпълните поне една от тях, то моля ви, отделете няколко часа да премахнете и грешките при HTML валидация ( 32 към момента ). Доставете ми това удоволствие.

Categories
Работа Статии

Статични данни, PHP, урок 2

Ситуацията е следната – имам няколко обекта, които онаследяват някакъв клас. В родителският клас има методи, които връщат определени суми. При първоначалният ми план, бях направил всеки метод ( три метода ) да си определя сумата с отделна заявка – т.е. три заявки на обект умножени по четири класа т.е. заявките към базата стават дванадесет. Ето примера:

class A {

public function A1() {
// DB Query
}
public function A2() {
// DB Query
}
public function A3() {
// DB Query
}
}

class B extends A {

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}

class C extends A {

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}

class D extends A {

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}

class E extends A {

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}

$B = new B();
$B->A1();
$B->A2();
$B->A3();

$C = new C();
$C->A1();
$C->A2();
$C->A3();

$D = new D();
$D->A1();
$D->A2();
$D->A3();

$E = new E();
$E->A1();
$E->A2();
$E->A3();

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

До тук добре. Всичко работи, но скоростта опрделено не е оптимизирана. Дванадесет заявки са много. Затова измислих следното решение. Добавих допълнителен метод в родетелският клас, който извлича всичките суми, чрез вътрешни заявки ( sub query / queries ), създава се  инициализиращ масив, а останалите методи ще обръщат към него. Да де, ама така излиза, че пак ще се правят 12 заявки, като този път ще са и по-сложни. И да и не. Тук идват на помощ статичните данни. Инициализираме един статичен масив във всеки от дъщерните класове, който ще предваме по референция. При извикването на метода, който извлича всичките данни ще се прави проверка, дали тези данни са вече записани в статичният метод – ако да използваме тях, ако не са – извличаме ги. Ето и примера:

class A {

public function A0( &$arr ) {
if( sizeof( $arr ) == 0 ) {
// Извлечи, обработи и запиши данните в $arr масива
}
return $arr;
}

public function A1() {
$a = $this->A0();
return $a[‘A1Result’];
}
public function A2() {
$a = $this->A0();
return $a[‘A2Result’];
}
public function A3() {
$a = $this->A0();
return $a[‘A3Result’];
}
}

class B extends A {

protected static $arr;

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}

public function A0() {

return parent::A0( &$arr );
}
}

class C extends A {

protected static $arr;

public function B() {
parent::__construct(); // Задавам нови насройки на базата
}

public function A0() {

return parent::A0( &$arr );
}
}

//  Тук кодът продължава като първият пример

Ако нещо не сте разбрали или имате предложения – чувствайте се свободни да пишете коментари.

Categories
Статии

Как се вграждат субтитри във видео

Колежката Моника ме помоли да й обесня как се вграждат субтитри във видео. Естветвено, че казах, че знам как става ( няма да се излагам, я ) и направих едно търсене в Google. Попаднах на следният софтуер – Avidemux. Обеснявам как се прави. Четете, че няма да повтарям 🙂

1. Изтеглете и инсталирайте Avidemux.
2. Отворете Avidemux
3. Натискате бутона “Open” и намирате видеото, на което искате да вградите субтири. Пак натискате Open.
4. Ще ви попита дали да изгради VBR Time Map – кажете му “Build Time Map”.
5. След това много нахално ще ви каже, че index-ът ви не е “up to date” – направете го “up to date”.
6. За удобство изберете от падащото меню, до бутона Calculator, “Slide”. Така ще се показва и оригиналното видео и това, което би трябвало да изглежда след като бъдат изпълнени вашите инструкции.
7. Изберете Video -> Filters -> Subtitles -> Subtitler и натиснете бутонът “+”.
8. Изберете субтирите, които искате да вградите от полето “Subtitle file”. OK и Close.
9. Не забравяйте, ако вграждате субтири на български език, да изберете Cyrillic за кодиране на знаците или UTF-8 ( Вижте чрез Preview бутона кой тип би ви свършил работа )
10.  Би трябвало да се върнете на главният прозорец. В ляво ще видите три секции с удебелн шрифт “Video”, “Audio” и “Format”. За видео изберете “MPEG-4 ASP (xvid4)”.
11. Натиснете бутона Save и въведете името и мястото за запазвне на новият файл.
12. Изчакайте докато приключи кодирането ( около 1 час на дву-ядреният ми 1.5GHz Intel за 700MB филм)
13. Купувате ми Загорка 🙂

Categories
Работа Статии

Как да сменим ДДС-то и цените да останат същите

Миналият понеделник във Великобритания промениха процентът на тяхното ДДС ( VAT ), като мярка за справяне с глобалната икономическа криза. От 17.5% го намалиха на 15%. Разбира се, това трябваше да се отрази и в магазините за електронна търговия. Някои от тях просто смениха процента и така цените им с ДДС намаляха, но други решиха да запазят старите си цени като увеличат първоначалната цената, на която се изчислява това ДДС. Ето и една формула за MySQL как се прави това:

UPDATE products SET products_price = products_price + ROUND( ( products_price * 1.175 – products_price * 1.15 ) / 1.15, 2 ) WHERE 1 = 1

Това работи за osCommerce софтуер, но лесно може да го нагодите да работи и за вашата система.

Categories
Работа Статии

Campaign Monitor, PHP4

Като работа за последният ми проект, трябваше да интегирам Campaign Monitor ( все го бъркам с Manager ). Това е софтуер за бързо и лесно изпращане на писма до клиенти ( т.е. масово спамене ). За мой лош късмет, точно в момента разработчиците решават, че трябва да внесат промени и премахват примерите ( samples ) и инструментите за работа с API-то им ( API kit ). Логично веднага почнах да търся дали някой добър човечец не е написал подобен клас и след няколко проби през Google попаднах на следния Campaign Monitor клас ( Campaign Monitor class ) написан от Keri Henare ( Кери Хенаре ще го преведа на български ). До тук добре, нали? Проблемът се появи когато видях, че класът е написан за PHP 5, в което няма нищо лошо, стига сървърът, на който е проектът да не беше на PHP 4. Ще кажете “Голям прас. Драсни един handler за PHP5 и всичко ще заспи”. И при други обсоятелства бих се съобразил с вас, но никак не исках да превключвам версията на сървъра, защото проектът не съм го писал изцяло аз, а е доста посещаван сайт и не знам откъде може да изкочи проблем ).

Затова реших да преправя класът от PHP5 към PHP4. След като разкарах private, public, protected декларациите за функции и данни, след като премахнах статичните извиквания или добавих обекти за тях се заех с функционалността. Буднах малко тук, малко там … и в крайна сметка се оказа, че трябва да бутна мнооого сериозно по функцията за превръщане на XML към Array ( XML to Array ). Бе направо я изтрих и я написах отново, само че да работи за PHP4.

И тук дойде другата ми изненада. domxml_open_mem фунцкията не съществува в PHP5!? Защо сте я махнали, бре? На кого му пречеше? Това е проблем, защото знам ли кога hosting компанията ще реши масово да премине на PHP5 ( а защо не го е направила до сега? ) и трябваше да си подсигуря стабилността ( сравнително ) на моята работа и на PHP5. Тук за пореден път много полезен се оказа Google. Оказа се, че фунцкиите за DOMXML ги има написани на PHP, а не за PHP. Copy/paste, една проверка дали е PHP 5, малко тестове на PHP5 сървър и съм готов.

Вдъхновен от Open Source движението реших да публикувам PHP4 версията на Campaign Monitor класът, както и съпровождащият го клас за правилна работа с XML на PHP5.

Campaign Monitor for PHP4 including Dom-xml-php4-to-php5

Не вярвам на някой да му потрябва, но знае ли човек ….

Categories
Лично творчество Статии

Singleton, static и други подобни PHP щуротии

Какво точно е Singleton и какво са статичните данни? На този въпрос се опитват да си отговорят колегите от BGDev. Тук ще се опитам да хвърля малко светлина по въпроса.

Първо що е то статична данна?

Статични данни са такива, които са “живи” през целият период на изпълнение на приложението. Най-добре ще ме разберете с пример.

function static_test() {

static $a = null;

if( $a == null ) {
$a = 1;
echo ‘Първо извикване на функцията’;
} else {
echo ‘Всяко следващо’;
}
}

static_test();
static_test();

Ха сега, познайте какво ще се покаже при първото и после и при второто извикване?

След като очевидно схванахте как се използват статични данни нека да спомена, че за да може да имате достъп до статични данни в клас ( PHP, Java, а предполагам и други езици ) трябва да дефинирате метода си като статичен. Готиното на статичните методи, е че можете да ги извиквате без да се нуждаете от  създаване на обект. Пак пример?

class StaticTest {

private static $test = “test”;

public function getTestNonStatic() {
echo $this->test;
}

public static function getTest() {
echo self::$test . ‘<br />’;
}
}

$StaticTest = new StaticTest();
$StaticTest->getTestNonStatic();

StaticTest::getTest();

Въпросният код дава следният изход:

Notice: Undefined property: StaticTest::$test in …
test

T.e. имате достъп до статични данни само от статични методи.

Сега малко за Singleton. Няма да обеснявам какво е Singleton, а направо ще ви покажа пример за Database клас, който използва такъв шаблон.

class Database {

private static $instance = null;

public static function getInstance() {
if( !self::$instance instanceof self ) {
self::$instance = new self;
}
return self::$instance;
}

private function __construct() {
global $host, $user, $pass, $dbname;

$this->connect( $host, $user, $pass, $dbname );
}

private function connect( $host, $user, $pass, $dbname ) {

$this->host = $host;
$this->user = $user;

echo ‘Host: ‘ . $host . ‘<br />’;
echo ‘User:’ . $user . ‘<br />’;
echo ‘Pass:’ . $pass . ‘<br />’;
echo ‘Name:’ . $dbname . ‘<br /><br />’;
}

public function query( $sql ) {

echo ‘Host: ‘ . $this->host . ‘<br />’;
echo $sql . ‘<br /><br />’;
}
}

$host = $user = $pass = $dbname = “Testing”;

$DBI = Database::getInstance();
$DBI->query( “SELECT .. “);

$DBI2 = Database::getInstance();
$DBI2->query( “INSERT INTO ..” );

Тук ще се наложат малко пояснения явно. ОК. Singleton шаблона е перфектен за извикване на инстанция на клас за връзка с база от данни. Защо? Защото хем е глобален т.е. можем от всяко кътче на PHP кода да си го да извикаме, хем прави само един път връзка към базата … а не 100, ако създавахме обект всеки път. Когато създаваме $DBI обекта, чрез статичният метод getInstance() всъщност се прави проверка дали вече е създаден въпросният обект. Ако не .. тогава правим нов, ако е – връщаме инстанция към него и го използваме. Катко забелязвате ( всъщност може да забележите тук 🙂 ) Данните за host, user, pass и т.н.т. се показват само един път от connect метода т.е. тук симулирам достъп до базата де .. но виждате резултатът. Та това е “сложният” Singleton шаблон.

Ако имате въпроси използвайте формата за коментари по надолу 🙂

Categories
Без коментар Статии

Софийски градски транспорт

Прибрайки се днес след поредният ми неуспешен опит да се добера до касите на банка ДСК, аз реших да се прибера с митичният автобус номер 88. За хората, които не са от София, трябва да спомена, че този автобус идва на високосна година, но за сметка на това поема огромен маршрут от Дружба, през Младост, Дървеница, Дианабад, Лозенец, та чак до Хладилника. Оставяйки фактът, че автобусът не е един най-редовите ще се спра на една случка, която много добре описва манталитетът на българите и не е трудно да си отговорим на въпроса, защо “аджеба” Европейският Съюз ни спря 220 млн. евро.

Когато съм в автобус обичам да пътувам прав – аз не съм много малък по размери и така имам по-голяма свобода. Неволно или не, бях застанал до една възрастна дама с балтон, тъмни очила и кожена чанта – жена, която е над средната класа. Въпросната дама, която се качи след мен, седна на седалката, на която по стар софийски обичай беше оставено билетче от предишен редовен пътник – трик, който използваме всички, за да минем “по-тънко”. Нейният събеседник също намери такъв билет, но той започна да се осъмнява във валидността му. Тогава жената започна да разказва случка как преди известно време се качила в автобус ( 280 мислила, че бил ) и освен на нейната имало билетче и на съседната седалка. Тогава на седалката до нея седнала друга жена, която смачкала използваният билет и си продупчила нов – нещо, което трябва да правим всички. Коментарът на дамата, за която ви разправям, бе “Бях силно възмутена – как е възможно такова нещо. Да си продупчиш нов билет, кото можеш да използваш стар”.

Случката е повече от безобидна, но показва какво е отношението на нас българите – гледаме да минем на аванта, и когато някой се опита да ни покаже как трябва да се прави, ние хвърляме огън и жупел по него. Тук бяха “спестени” 2лв., които при два милиона население на София ( сигурно са и повече ), оставят много сериозна дупка в бюджета на Софийска Компания за Градски Транспорт.

Автобусите са в ужасно състояние ( 88, 413, 305, 76, 75 ), не се отопляват, ако завали дъжд навън то задължително ще завали и в автобуса, много често се чупят на оживени булеварди, закъсняват, не са редовни, доста пъти не спират на по-малките спирки, на които няма хора, не винаги в автобуса се продават билети от шофьора, има по 6 човека на квадратен метър …. проблемите нямат край. Представете се на мястото на шофьора на 94 – след като влезе по Симеоновско шьосе през целият си път до Ректората и пак обратно през бул “Евлоги Георгиев” до връщането му в Дианабад – през цялото това време автобусът е в задръстване и се кара на “първа – спирачка, първа, втора – спирачка”. Ужасно е! Както за водача, така и за пътниците.

Спирам до тук! Темата няма край. Лично аз използвам карта за всичките линии със студентско намаление и ми излиза точно 17лв. на месец. Съветвам ви и вие да си направите такива.

Categories
Без коментар Работа Статии Черна дупка .. ой ой ой

Какво ще се случи със Земята, ако ние изчезнем

2 ден – Метрата ще се наводнят от изходните води.

7-ден – Ядрените реактори ще спрат да се охлаждат.

1 година – В света ще оцелеят повече от 10 милиона птици. Съобщителните и токовите кули ще се разпаднат. Градовете ще се напълнят с животни.

3 години – Течовете от газовите тръби ще станат причина за пожари и взривове. Структурите на сградите ще станат нестабилни. Поради липса на топлина в тях ще изчезнат хлебарките.

10 години – Покривите на повечето сгради ще се разпаднат в резултат на корозия и взаимодействие на различни химични елементи.

20 години– Всички железни постройки ще почнат да се разрушават. Ще изчезне и Панамския канал.

100 години – Популацията на слоновете ще се увеличи повече от 20 пъти. Малките хищници, като например лисиците ще са на ръба на изчезване, поради появата на друг техен конкурент-домашните котки.

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

500 години– Останките от градовете ще бъдат завладяни от обилна растителност.

15 000 години – Повечето градове ще отстъпят пред появата на ледников период. Единственото, което ще остане сравнително цяло, това ще бъдат повечето подземни конструкции.

35 000 години
– Веществата, които замърсяват околната среда още от времето на човека най-накрая ще се абсорбират. Но пълното пречистване от кадмий например, ще отнеме още 75 000 години.

100 000 години – Нивото на въглероден диоксид в атмосферата ще се върне към това, което е било преди появата на човека.

250 000 години – Радиацията,породена от експлозии на атомни бомби и радиацията в Чернобил, ще спрат да бъдат опасни.

2 000 000 години – Възможно е някои животни да добият способност да разлагат пластмасовите изделия и да ги ядат.

8 500 000 години – Останките от някои архитектурни обекти като паметници и сгради все още ще се разпознават, ако не са били разрушени от земетресенията.

3 милиарда години – На Земята все още ще съществува живот, но такъв какъвто едва ли можем да си представим.

6,5 милиарда години – Земята ще се стопи под влияние на Слънцето, което вече ще е погълнало някои планети-неизбежния край на Земята.

Вечност – Останките от спътниците ще продължават да обикалят Космоса като единствена следа от съществуването на човека.

Можете да прочетете оригиналът на статията както и да видите повече снимки в блога “Бикинимедия”.

Categories
Статии

За vbox7

Ще направя списък с нещата, които не ми харесват в популярният български сайт vbox7.com. Целта ми не е да сипя кал по тях, а ги казвам с надеждата да ги оправят.

  1. Липса на дизайн – За сайт, който генерира трафика си от видео клипове наистина не е необходим тежък и претрупан дизайн. Но в момента сайтът има няколколко блока, наклонени линии за background и преобладаващият цвят е розовото. YouTube е перфектен в това отношение!
  2. Липса на оригиналност – цялата функционалноста е копирана от по-големите братя. Много бих искал да видя “клип preview” ( не е оригинално, но малко сайтове го предлагат ). Live Playlist би било много полезно, особенно за гледане на сериали. Иначе бутона за стартиране от началото на клипа ми допада.
  3. Видео player-ат им е много третрупан. Времевата линия не мисля, че толкова използвана, че трябва да заема централното място. Липсват tooltip-ове кой бутон какво прави и човек трябва да експериментира, а от бутона за вътрешно смаляване на клип не виждам никакъв смисъл. Контрола на звука е много голям и спокойно може да го направят като YouTube.
  4. При пълен екран се получава голям черен background и дебела бяла лента от контролите. Направето го поне прозрачен или да изчезва след 5 секунди примерно.
  5. Повечете функционалностти, който са свързани с оцента и фаворитизирани на клипа изискиват от потребителите да са влезли, но ако се опитам да ги използвам когато съм “гост” ме препраща към страницата за вход и прекъсва гледането на клипа ми. Нека при “гост” разглеждане да се споменава, че има такива функционалностти, но те да не са активни. За щастие тук вече има tooltip-ове. Ето, че можело 🙂
  6. Когато заглавието на клип е по-дълго от N символа текстът се отрязва и потребителят няма никакъв шанс да разбере какво е пълното име. Използвайте title аргументите по предназначение.
  7. Занемарена поддръжка на корпоративният блог. Аз обичам да чета какво се случва из големите компании и това, че хората от vbox7 пишат на 2 месеца един път не ми е достатъчно. Предполагам, че има и други 🙂
  8. Очаквайте продължение ….

Ще си кажете, че използвам доста примери с YouTube, а всъщност имам точка за слаба оригиналност, нали? Така се получава 🙂

Categories
Статии

Flash, урок 1

От известно време се занимавам доста с Flash. Последното ми предизвикателство беше да направя skin за FLVPlayback компонент, който освен стандартните бутони за пускане, паузиране, цял екран и лента за прогреса, трябваше да има и часовник, който да показва колко време остава до краят на клипа, или колко време е изминало до сега от пускането му. Прилагам кодът, който не съм измислил аз, но ми отне доста време докато го намеря и накарам да работи под Action Script 3

var minutes:Number = 0;
var seconds:Number = 0;
var totalMinutes:Number = 0;
var totalSeconds:Number = 0;

var l:Object = new Object();
l.enterFrame = function() {
totalMinutes = Math.floor(video_mc.totalTime / 60);
totalSeconds = Math.floor(
video_mc.totalTime) % 60;
minutes = Math.floor(
video_mc.playheadTime / 60);
seconds = Math.floor(
video_mc.playheadTime) % 60;
my_ta.text = ((minutes < 10) ? “0” + minutes : minutes) + “:” + ((seconds < 10) ? “0” + seconds : seconds) + ” / ” + ((totalMinutes < 10) ? “0” + totalMinutes : totalMinutes) + “:” + ((totalSeconds < 10) ? “0” + totalSeconds : totalSeconds);
}
addEventListener( Event.ENTER_FRAME, l.enterFrame );

Този код го слагате в Actions layer-а на вашият скин. Създавате си динамичен текст с име “my_ta” и времето ще почне да се показва 🙂

От показаното тук мисля, че лесно може да се ориентирате какво точно става. Повечето уроци из нета са свързани с показването на времето при “stateChange”, който се активира само при кликане на play/pause бутона.