2011-01-19

Функция преобразования даты из ISO 8601

Потребовалось обработать логи в которых дата хранилась примерно в таком формате 2010-12-03T18:34:33-0500. К сожалению в PHP нет толковой функции для преобразования строкового представления даты в timestamp. Как показала практика strtodate совершенно не учитывает последние четыре знака в строке которые она просто отбрасывет.

Пришлось парсерить строчку ручками и вот что получилось:

function covertdate($date){
	preg_match('/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})([-+])(\d{2})(\d{2})/', $date,$res);
	list($d,$year,$month,$day,$hour,$minute,$second,$digit,$zonehours,$zoneminutes) = $res;
	
	$offset = ((int)($digit."1"))*($zonehours*3600+$zoneminutes*60);
	
	$timestamp = gmmktime($hour,$minute,$second,$month,$day,$year)-$offset;
	return $timestamp;
}

 

 

Коментариев: 1

 
  2010-12-14

Графики на SVG/VML

Мне никак дает покоя Google Charts...

Наиболее популярными библиотеками для построения графиков на сегодняшний день являются JPGraph и Google Charts. Решение от Google - замечательное, удобное, простое, графики очень симпатичные. Однако, все графики генерируются на чужом сервере (речь идет о графиках построенных через URL API). Пользователю разрешается создать ограниченное количество графиков а потом его могут забанить. Конечно, это количество большое, но меня немного смущает сама возможность быть забаненным из за превышения количества показов. Кроме того, сервер гугла я не контролирую и никто не может гарантировать, что этот сервис будет работать вечно, или что завтра на моих графиках не появится реклама, или внешний вид этих графиков не будет изменен на тот, который мне не нравится.

Между тем, задача сделать график на экране компьютера под силу школьнику освоившему курс информатики (мы такое, помню делали в старших классах). Так зачем же отдавать такие "сложные" вычисления серверу гугла?

JPGpaph дает возможность создавать графические изображения на своем сервере, но все равно это — графические изображения, со всеми присущими графическим изображениям ограничениями.

У растровых графиков есть один недостаток — их полная неинтерактивность. На растровый график невозможно добавить эффекты анимации при наведении мышкой, нельзя добавить гиперссылки (imagemap не в счет). Так как изначально природа графиков векторная — лучшим решением будет использовать векторный движёк вместо растрового. У вектора есть несколько неоспоримых преимуществ - не нужно передавать изображения по сравнительно узким каналам связи - передается только сама информация для построения графика, при этом рендеринг изображения происходит на машине клиента.

На сегодняшний день в вебе наиболее популярными являются несколько технологий - Adobe Flash, Microsoft Silverlight и Canvas/SVG/VML. Выбирая между Canvas и SVG я отдаю предпочтение последнему так как эта технология позволяет создавать по настоящему интерактивные эффекты и ближе к VML используемому в браузерах от Microsoft.

Используя ztools создал несколько компонентов для построения различных графиков и диаграмм:

 

Конечно, эти компоненты еще не совершенны, это даже не бета версия. Но уже лучше чем ничего. Главным отличием от аналогичных являются: открытость исходного кода, простота, и (надеюсь) удобство использования. Замечания, пожелания, багрепорты и фичреквесты приветствуются.

 

 

Коментариев: 1

 
  2010-12-06

Векторные часики

Для одного из проектов сделал вот такие вот часики. Они должны работать во всех популярных браузерах включая IE6+, FireFox, Safary, Opera. Для визуализации в Internet Explorer используется VML для других браузеров SVG.

 
 

Оставить комментарий

 
  2010-12-03

Полезное применение static переменных

Иногда бывает необходимо в какой либо функции находить какую либо информацию, сохраненную в MySQL табличке по её ID. При этом количество элементов в табличке может быть небольшим, а вот количество вызовов такой функции, наоборот большим. Каждый раз вызывать "select ... from" будет расточительно, вставить справочную табличку через JOIN не всегда возможно. Было бы логично сохранить где-либо все значения справочной таблички а потом брать по ключу (табличка как я уже сказал небольшая). Самое лучшее решение, которое я придумал на сегодня — это воспользоваться static переменным (их можно применять не в только для синглитонов)

static function getDocumentTypeName($type_id){
    static $cache;
    if (!isset($cache)){
        $cache = Db::selectAssoc("select type_id, type_name from doc_types");
    }
    return $cache[$type_id];
}

При этом переменныя $cache остается в области видимости самой функции, что очень удобно, заполняется она один единственный раз при первом вызове функции.

 

Оставить комментарий

 
  2010-11-03

Векторный графический редактор на JavaScript

На сайте ztools.org создал небольшой векторный графический редактор. Реализованы пока всего три вида объектов - линия, овал и прямоугольник. Редактор сам по себе примитивный и сделан исключительно с целью демонстрации возможностей библиотеки ztools а также для отладки работы с векторной графикой.

Что самое приятное, так это то, что код редактора, без учета библиотечных файлов содержит всего около четыреста строк.

Для прорисовки векторной графики в IE используется VML а в остальных браузерах SVG. В идеале, хочется сделать что то вроде библиотеки Raphael Дмитрия Барановского, но Raphael это вещь в себе, хотя и совершенно волшебная, мне же хочется сделать библиотеку для работы с векторной графикой на базе ztools. С его объектно-ориентированными возможностями можно будет создавать вещи нереализуемые при помощи классического HTML/CSS

 

Коментариев: 3

 
  2010-09-20

Вертикальный текст в HTML

Как я уже писал, в HTML совершенно нет возможности размещать текст по-вертикали. Правда, сильно ограниченные возможности присутствуют в Internet Explorer, правда, у этого способа я обнаружил один баг — при предварительном просмотре печати текст оказывается зеркально отраженным, видимо, второй фильтр не применяется.

Хотелось бы найти универсальный способ отображать вертикальный текст по-вертикали во всех браузерах и по возможности без глюков. Как говорится если нельзя, но очень хочется, то можно.

Создал небольшой скрипт для отображения текста по-вертикали. Код получился сравнительно небольшим. Скрипт использует VML под IE и SVG под остальными браузерами.

Внешний вид полностью настраивается при помощи CSS и Javascript. Здесь можно скачать архив, а здесь увидеть как это работает в живую.

Выложенный пример тестировался на IE6-IE7, Firefox2, Google Crome, Opera и Safary.

 

Коментариев: 6

 
  2010-08-15

Как подружить UTF-8 и PHP

При работе с UTF-8 привычные функции работы со строками перестают корректно работать. В этом не трудно убедиться если сохранять исходник страницы в UTF-8:

print strlen("тест");  //8

Вместо привычных strlen, strpos, substr следует использовать соответствующие многобайтные аналоги: mb_strlen, mb_strpos, mb_substr. Но это делает код плохо портируемым под другие кодировки, увеличивает вероятность ошибок, и вообще это не удобно. К счастью расширение mbstring позволяет переопределить эти функции автоматически.

добавляем в .htaccess

php_value mbstring.internal_encoding "UTF-8"
php_value mbstring.func_overload 7
 

проводим эксперимент:

print strlen("тест");  //4

...что и требовалось доказать. Конечно, теперь всегда нужно иметь в виду, что при вызове strlen на самом деле вызывается mb_strlen это всегда нужно учитывать, особенно, если ваш файл будет сохранен не в UTF-8, но зато код станет хорошо портируемым и не зависящим от кодировки исходников.

P.S. Как показала практика, такое решение полезно только если проект маленький, если же вы собираетесь использовать сторонниие библиотеки, то лучше все же создать дополнительный уровень абстакции для работы со строками - простая подмена функций приводит к непредсказуемым результатам!

 

Оставить комментарий

 
  2010-06-03

Android

Ответье мне на вопрос. Не понимаю. Andorid - это нормальная Линукс среда, с виртуальной памятью, с нормальным разделением прав, со всеми возможными средствами ввода вывода, ядром... Нахрена спрашивается запускать приложения в собственной виртуальной Java машине? Там где каждый дополнительный такт процессора означает увеличение потребляемой мощности они запускают приложения собранные не из машинных кодов а используя Java байткод, который еще неизвестно как выполняется Java машиной... Что - линукс недостаточно защищен? Неужели ребята просто заинтересованы чтобы рынок приложений для Android был только для Android, а всевозможные уже написанные приложения для Linux были бы несовместимыми с Android-мобильниками - попахивает обыкновенным саботажем.

UPD. Нашел ответ: Android построен на ядре Linux, а прикладные приложения выполняются в виртуальных машинах (sandbox) и для их разработки используется Java. Или, вернее, язык с синтаксисом Java и библиотеки аналогичные Java SE. А в качестве среды исполнения вместо JVM используется виртуальная машина Dalvik.

...все дело в лицензионной политике. В случае с Java ME, Sun продемонстрировала просто чудеса иезуитства изобретательности, выпустив ее сразу под двумя лицензиями: GPLv2 и коммерческой. А это вынуждает производителей, использующих Java ME либо открывать весь свой код, либо... платить Sun :)

Естественно, все это не укладывалось в рамки политики, которую избрал Google для продвижения Android. В отличие от Sun, у которой хорошие юристы, Google решил положиться на своих инженеров и... создал свою реализацию виртуальной машины. Причем, Dalvik - это не просто новая реализация JVM (которую все едино пришлось бы лицензировать в Sun), Dalvik вообще не использует Java байт-код (вернее байт-код, полученный в результате компиляции в design-time преобразуется в dex формат, который и используется в run-time). В общем, инженеры Google обставили лоеров Sun.

В то время как Apple делает iPhone невероятно сладким, лакомым кусочком для разработчиков игр, но в тоже время делает его и невероятно закрытым. Google не только делает Andriod открытым для разработчиков мобильных устройств но и дает возможность миллионам существующих Java программистов стать разработчиками под Andriod.

А ведь умно...

 

Оставить комментарий

 
  2010-03-22

Полезное свойство функции substr в PHP

Функция substr служит для взятия подстроки, синткасис у нее следующий:

string substr ( string string, int start [, int length] )

Допустим, вам нужно отрезать последний символ, знатоки Javascript или Си напишут примерно следующее:

$s = 'some string1';
$s = substr($s,0,strlen($s)-1); //some string

пока терпимо, хотя код уже явно громоздкий и трудный для понимания, задача усложняется если нужно получить несколько последних символов в строке:

$s = 'some string123';
$s = substr($s,strlen($s)-4); //123

понять что делает этот код довольно трудно, несмотря на то что его назначение тривиальнейшее.

К счастью в PHP в substr можно использовать ОТРИЦАТЕЛЬНЫЕ ЗНАЧЕНИЯ для стартового символа и длинны:

//пример первый
$s = 'some string1';
$s = substr($s,0,-1); //some string

//пример второй
$s = 'some string123';
$s = substr($s,-3); //123

 

Кака видно, в этом случае код читается на порядок проще. Ничего подобного нет ни в Си ни в JavaScript, а жаль.

 

Коментариев: 4

 
  2010-02-08

Вредные советы PHP программистам

- делайте функции как можно длиннее. Прошли времена глупых и тупых программистов, если комуто в падлу прочитать код на пятисяти скринах - разжаловать его в грузчики!

- побольше глобальных перемнных. Глобальные переменные жрут память - ну и фиг с ней, пусть клиент купит еще планочку - не  разорится

- в жопу комментарии. Кому надо сам разберется что к чему!

- у функций должно быть побольше аргументов. И функции должны возвращать как можно больше полезной информации - те кому прийдется разбираться в вашем коде будут счастливы.

- чем больше листинг тем круче. Если в файле листинга меньше десяти тысяч строк кода - это и не листинг вовсе.

 

Коментариев: 1