Блог
Читать записи с меткой «программирование»
20 Марта 2010, 17:20
Офигеть. О чём думали разработчики MySQL, когда запретили использовать значение по-умолчанию NOW() и CURRENT_TIMESTAMP для полей типа datetime? По-моему, это совершенно неудобно и необъяснимо, но таков факт. Как они это назвали, это документированные ограничения.
Куда катится этот мир?..
Ну и да, чтобы два раза не ходить, они предлагают использовать timestamp и default CURRENT_TIMESTAMP, но здесь тоже есть ограничения. А может и фиг с ними, до 2037 года так много всего изменится
4 Февраля 2010, 17:46
Рано или поздно у многих возникает необходимость в подобных извращениях, как поднять под Windows XP memcached и заставить это дело работать с PHP 5.3. Вот и мне пришлось.
Для начала понадобится скачать порт под винду отсюда: http://www.splinedancer.com/memcached-win32/, там нужно выбрать внизу Memcached Binaries. Инструкция по установке есть там же, но всё сводится к следующему.
- распаковываем содержимое архива куда-нибудь, например, в c:\memcached
- запускаем «memcached -d install». Это установит мемкеш как сервис
- для запуска мемкеша испольузется memcached -d start, для остановки — memcached -d stop
То же самое можно делать и через управление сервисами (правый клик на «Мой компьютер»/управление/службы и приложения/службы).
Чтобы всё это подружить с PHP, нужно скачать соответствующий модуль. Поскольку PECL под Windows уже давно пишет, что «The pecl4win build box is temporarily out of service. We're preparing a new build system.» (временно недоступен, строим новую систему), то за нужным файлом придётся идти сюда: http://downloads.php.net/pierre/, и там уже выбирать по ключевым словам в названиях «memcache» и «5.3», я себе скачал php_memcache-cvs-20090703-5.3-VC6-x86.zip, всё подхватилось.
Соответственно, последний этап — скопировать php_memcache.dll в папку с расширениями PHP (ext в том месте, где лежит php) и в php.ini добавить extension=php_memcache.dll
Ну и не забываем перезапустить apache :)
13 Января 2010, 22:53
Думаю, что есть два основных направления при создании чего-либо: делать это самому и пользоваться уже готовым. Можно сказать, что это две границы, между которыми туда-сюда ходит каждый, потому что каждый что-то знает в определённых областях, не зная ничего в других.
У меня достаточно много навыков, и я их постоянно стремлюсь прокачивать, хотя не всё времени всё равно не хватает, поэтому процесс идёт некоторыми волнами, среди которых выделяются основные. В далёком 1997 году, когда я только начинал заниматься веб-разработкой, я использовал разные cgi-скрипты для обратной связи. Потом я научился делать всё сам, контролируя каждую тонкость. Даже сейчас меня не покидает мысль реализовать-таки свой движок, взяв лучшее от ZF и Symfony.
С 1997 года прогресс сделал огромный шаг, и теперь есть Генератор форм обратной связи — простой и гибкий инструмент. Вдохновляет на то, чтобы потихоньку заниматься-таки созданием своего полу-фреймворка, полу-цмски. А то скоро чудовищность и избыточность существующих фреймворков будет по-настоящему пугать.
9 Января 2010, 01:12
Решил, что в новом движке и комментарии, и деление на сообщества будет реализовано с использованием вложенных множеств в применении к деревьям. Это даст достаточно хорошую гибкость, плюс весь функционал можно будет переложить на СУБД, реализовав операции добавления, удаления и перемещения через хранимые процедуры.
Пока я достаточно легко сделал (но ещё не проверил) добавление и удаление элементов. А вот с перемещением там нужно подумать, как красиво сделать. В принципе оно может понадобиться только в случае переноса сообщества из ветки в ветку (не знаю, буду ли я вообще это делать) и сортировки списка сообществ в пределах одного подуровня (это было бы хорошо, конечно).
Там ничего особо сложного нет, но нужно сразу многое держать в голове, чтобы потом не было неожиданных ошибок или глюков, которые проявились в том механизме, который придумал я. Как всегда, самое сложное — это сделать первую рабочую версию, которую можно будет легко расширять и дорабатывать. Если вообще придётся это делать :)
Из этого, собственно, опыт и складывается: бесконечная спираль реализации и улучшений, когда, смотря на старый код, думаешь «Какой кошмар».
_______________
При съёмке или постановке в театре часто используется свет Osram как хорошо зарекомендовавший себя.
6 Января 2010, 01:54
Не так резво, как хотелось бы, но всё же я продолжаю разрабатывать чудесный новый движок, на который потом буду переводить все проекты. Правда в процессе оказывается, что прям не знаешь, за что браться. Хорошо хоть, что я смастерил инструмент для создания классов моделей из описания, чтобы их можно было использовать в Zend Framework. На это ушло около двух дней, но зато теперь достаточно просто в массив забить информацию о полях, и на выходе будут три готовых класса, требующих (если требующих) минимальной доработки.
Потом, пока всё это дело реализовывал для управления, пришёл к выводу, что в базе есть лишние таблицы. Правда есть ещё некоторые вещи, ведущие к избыточности, но я пока не могу понять, как сделать так, чтобы всё было красиво и на сто процентов целостно. Пока оставлю с избыточностью до той поры, пока не осенит великой мыслью.
В общем я надеюсь за оставшиеся несколько дней доделать свой чудесный инструмент, первым делом перезапустить на нём Совию, а потом приняться за блог. И похоже, что нужно будет менять хостинг, потому что там и хранимые процедуры, и триггеры используются активно, а на текущем хостинге, где сейчас этот сайт хостится, с триггерами всё плохо. Но это пока вопрос на месяц или около того
__________________
Есть компания Trade Motors, у которой есть замечательный интернет магазин запчастей, где в свою очередь можно многое найти.
31 Декабря 2009, 02:16
Не знаю, сколько часов у меня ушло на создание чудесного инструмента по превращению массива с описанием моделей и заготовок классов в сами классы моделей. За это время я ручками, наверное, мог был уже достаточно многое создать, но лучше ведь день потерять, а потом за пять минут долететь.
Теперь мне достаточно просто набросать структуру базы в массиве, запустить волшебный скрипт, и у меня будет всё готово, успевай только прописывать в контроллерах взаимодействие. Так что движок становится всё более и более гибким. Жаль только, что я не успеваю в этом году его доделать, а то бы с пасофом можно было бы на него перевести все проекты: Совию сразу первого января, а остальные — в течение недели. А теперь придётся за эти 10 дней всё-таки добивать по-быстрому Совию (надеюсь, что сейчас это будет уже легко, так как нудный этап создания моделей теперь преодолевается быстро), а потом уже подбивать все остальные.
Успеть бы всё это, не погрязнув в лени
:)
____________
Часто бывает так, что оказываешься в людном месте, а туалетная кабина — единственное, что нужно в этот момент. Надо увеличивать их число, я считаю.
18 Декабря 2009, 00:43
Сегодня доделал для нового движка систему восстановления паролей. Постепенно всё это дело принимает всё более и более приличные формы. Не знаю, насколько реальны шансы успеть всё доделать до конца этой недели, но хотя бы каркас существующего функционала хотелось бы доделать, а то уже как-то начинает раздражать состояние вечной беты.
Даже в этом блоге в части разделов творится фигня. Не говоря уже о том, что всё построено на достаточно старых версиях. Ну и ещё много о чём :)
Конечно, хорошая проработка требует большого количества времени, потому что идёт разделение на достаточно большое количество слоёв. Но зато потом что-то изменять будет намного легче. Я ожидаю, что в конце этапа получится универсальный движок сайта, где есть пользователи с разделением ролей и ориентация на сообщество. Позже, может быть, выложу прототипы, хотя не уверен, что стоит это делать. А потом уже переведу остальные свои проекты на этот движок и либо буду аврально дорабатывать до следующей вехи, либо займусь своим проектом «инвентарь», который я так лихо начал и так же быстро приостановил :)
Ещё уже достаточно долгое время я придерживаюсь стиля держать строку кода в пределах 80 символов. Это и правда очень положительным образом сказывается на читаемости кода и заставляет выделять некоторые операции в отдельные методы, когда количество проверок оказывается таким, что отступов в коде получается много, и запас по длине строки становится совсем небольшим. Зато логически в таких местах прям просится выделение в отдельный метод.
Конечно, есть оговорки для случаев с очень длинными именами классов и константами в них. Но пока в ZF это удаётся разруливать, в отличие от Symfony, где константы приходится использовать в очень многих местах, и эти константы очень длинные :)
Эффектом от завершения нового движка скорее всего будет резкий скачок в количестве проектов, а на фоне того, что аренда выделенного сервера становится всё более доступной, нужно будет разносить эти проекты по разным серверам, а не одним скопом держать, как сейчас, тем более, что посещаемость потихоньку растёт.
7 Декабря 2009, 13:23
Решил-таки составить нормальное регулярное выражение для вычленение IP-адреса из заголовков и прочего. Задача достаточно простая: нужно найти 4 октета, разделённых точкой, которые при этом могут принимать значение от 0 до 255.
Сначала придумаем выражение для одного октета, это будет (25[0-5]|2[0-4]\d|1\d{2}|\d{1,2}).
Дальше в коде, в зависимости от задач нужно будет его применить. Я придерживаюсь такой стратегии: в базе в MySQL адрес хранить в виде целого, конвертируя значение через php-функцию ip2long() на входе и long2ip() на выходе. В PostgreSQL для этого есть тип данных CIDR.
Получается примерно так:
$octet = '(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})';
$cutPattern = "/^{$octet}\.{$octet}\.{$octet}\.{$octet}.*/";
$matchPattern = "/({$octet}\.){3}{$octet}/";
Для записи в базу берём результат preg_replace($cutPattern, '$1.$2.$3.$4', $remote_addr); тогда у нас возьмётся только начальный кусок (иногда бывает, что в заголовок попадает несколько адресов через запятую).
Для простого соответствия достаточно будет preg_match($matchPattern, $temote_addr);
В $remote_addr у нас хранится, соответственно, адрес. Обычно это $_SERVER['REMOTE_ADDR'], но это частный случай.
В общем виде шаблон такой: ((25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})
Для случаев особой паранойи можно в начале добавить ^ (признак начала строки).
22 Ноября 2009, 14:38
Я как-то задавался вопросом, в чём отличие версий PHP, скомпилированных под VC6 и VC9, и обратил внимание, что у меня нормально работала только VC6. Как оказалось, ответ указан прямо в разделе загрузки на php.net :)
Если вы используете PHP с Apache 1 или Apache2, взятыми с apache.org, используйте версии PHP VC6.
Если вы используете PHP с IIS, нужно использовать версии PHP VC9.
Версии VC6 скомпилированы родным компилятором Visual Studio 6.
Версии VC9 скомпилированы компилятором Visual Studio 2008 и содержат улучшения в быстродействии и стабильности. Для использования версий VC9 у вас должны быть установлены Microsoft 2008 C++ Runtime (x86) или Microsoft 2008 C++ Runtime (x64).
Не используйте версию VC9 с бинарниками, взятыми с apache.org.
8 Октября 2009, 12:09
Наткнулся на такую проблему, что в PHP CLI при вызове pg_connect() получается ошибка Segmentation fault.
Немного поискав, я очень быстро нашёл решение. Дело в порядке вызова расширений. Если строку «extension=curl.so» поставить после «extension=pgsql.so», проблема волшебным образом решается.
1 Сентября 2009, 18:16
Если нужно удалить элемент из массива JS, лучше всего использовать метод splice(). Как пример: my_array.splice(index, howMany), где index — это индекс элемента, а howMany — сколько элементов удалять (если нужно убрать только один, просто передать «1»).
30 Июля 2009, 01:22
Оценил по достоинству вариант разработки сайта с составлением прототипа перед тем, как приступать к непосредственному воплощению функционала в жизнь. Вернее, получилось примерно наполовину так, наполовину сяк, но в данном случае сам проект простой.
Когда сначала делаешь прототип, приходит более полное понимание, как и что должно взаимодействовать, и потом проще даже в каркасном варианте осуществлять программирование функционала.
То есть сначала должна быть идея, что сделать. Потом эта идея оформляется в небольшую схемку, что примерно будет. Потом эта схема за несколько шагов преобразуется в прототип, потом прототип дорабатывается, и только потом делается основной функционал. Возможно, что одновременно с непосредственным программированием идут поправки в прототип, но они уже несущественные.
Как пример, в чём можно создавать прототипы, — программа axure.
29 Июня 2009, 16:20
Достаточно простой метод, но мало ли, пригодится кому.
function removeElement(elementId)
{
element = document.getElementById(elementId);
if (element) {
element.parentNode.removeChild(element);
}
}
2 Июня 2009, 00:16
Опробовал на днях в работе Sphinx Search. Что я могу сказать
Впечатляет, даже очень :) Работает быстрее, чем полнотекстовый поиск PostgreSQL (вернее он работает моментально, а слон делает за это 16 миллисекунд, что тоже можно считать моментальным), да и результаты более релевантными оказываются. Надо будет прикрутить его сюда и на Совию, как свободное время выдастся.
А как придёт время, дам ссылку на проект, в котором уже реализовано (пока эта версия в стадии разработки).
Встало, конечно, не без проблем, но они решились очень быстро. Во-первых, в документации была ошибка или умышленная дезинформация (но это было сразу заметно). Во-вторых, не сразу дошло, что в конфигурации надо было заменить @CONFDIR@ на реальный путь. Хорошо хоть в сообщениях об ошибках было написано, что ему не нравилось.
25 Апреля 2009, 02:08
В продолжение поста про падение apache под windows из-за библиотеки php_mysql.dll.
Всё дело в том, что в PHP 5.2 используется старая библиотека для MySQL (5.0.30), из-за чего при попытке работать с MySQL 5.1.30 и выше всё просто-напросто падает.
Поискав, я нашёл, казалось бы, решение: добрые люди скомпилировали новую библиотеку из исходников mysqlnd, но в моём случае это тоже ничего не дало: phpinfo() показывал наполовину правильную версию, но при работе всё равно всё отваливалось.
Тогда я решил применить радикальный метод и поставить у себя PHP 5.3.0 RC1. Поскольку дома всё равно всё используется только для разработки, то это не так страшно.
Короче говоря, оно подхватилось нормально, но с php_mysqli.dll всё равно работает через жопу, поэтому лучше всё пускать через PDO mysql. По крайней мере, ничего не отваливается (на данный момент).
И да, PHP 5.3, взятый из скомпилированного под VC9 тоже падал и тянул за собой Apache. Версия из-под VC6 работает нормально. Только пришлось скопировать libhttpd.dll из апачевского каталога (Apache/bin/), потому что на него завязан php5apache2_2.dll.
20 Апреля 2009, 23:57
Одно могу сказать с уверенностью: похоже, что эти три вещи несовместимы. То ли это мировой семитский заговор, то ли разработчики PHP случайно сунули не ту библиотеку для работы с MySQL, но факт остаётся фактом: эта срань работает только частично под мастдаем и нормально под никсами.
Уроды, уроды
Похоже, что локально придётся ставить MySQL 5.0 снова.
Продолжение
Предыстория
12 Апреля 2009, 16:25
Офигеть. Не знаю пока точно, кто виноват, но наткнулся на следующую проблему: Апач падает при вызове в PHP-сценарии $table->info(Zend_Db_Table_Abstract::COLS), где $table — это экземпляр Zend_Db_Table_Abstract (всё работает через mysqli).
При вызове этого метода apache падает с критической ошибкой, а в логи идёт «Ошибка приложения httpd.exe, версия 2.2.11.0, модуль php_mysqli.dll, версия 5.2.9.9, адрес 0x00002b6b.».
Система такая: Apache 2.2.11, PHP 5.2.9-2, MySQL 5.1.32. Всё это работает с Zend Framework 1.7.8.
Буду искать, в чём дело.
Нашёл :). Под виндой оно просто не работает с MySQL 5.1
31 Марта 2009, 00:25
Пришёл к выводу, что среди прочих есть два метода разработки.
Один заключается в том, чтобы делать всё небольшими кусками и тут же смотреть, что получается. Его плюс в том, что сразу видно результат. Минус — может остаться очень много недоделок.
Второй — сначала всё сделать «в теории», без просмотра результата, и потом уже анализировать целое. В этом случае обычно получаем готовый продукт, но очень большая вероятность ошибок (в первом методе они видны сразу).
Раньше я больше разрабатывал по первому методу, сейчас склоняюсь ко второму.
26 Марта 2009, 23:42
Вторые грабли, помимо «Указанный модуль не найден», — это сообщение «Операционная система не может запустить %1» (или же «Operating system cannot run %1», или просто «\xce\xef\xe5\xf0\xe0\xf6\xe8\xee\xed\xed\xe0\xff \xf1\xe8\xf1\xf2\xe5\xec\xe0 \xed\xe5 \xec\xee\xe6\xe5\xf2 \xe7\xe0\xef\xf3\xf1\xf2\xe8\xf2\xfc %1.» в логах апача).
Эта фигня возникает при попытке загрузить библиотека для шифрования (не только для php_pgsql.dll, но и для php_curl.dll). Если файлы libeay32.dll и ssleay32.dll остаются в корне PHP, а путь прописывается только в path, то похоже, что возникают какие-то конфликты с другими версиями этих библиотек.
Эту проблему я решил копированием указанных библиотек в system32.
26 Марта 2009, 21:26
Сегодня наткнулся на достаточно неприятную ошибку при загрузке модуля PostgreSQL в PHP. Модуль не подцеплялся, а в логах оседало примерно вот что:
Unable to load dynamic library 'c:/php/ext/php_curl.dll' - Specified module could not be found in Unknown on line 0, или же «\xcd\xe5 \xed\xe0\xe9\xe4\xe5\xed \xf3\xea\xe0\xe7\xe0\xed\xed\xfb\xe9 \xec\xee\xe4\xf3\xeb\xfc» (Указанный модуль не найден) в русской версии винды.
Сначала я думал, что дело может быть в libpq.dll, но оказалось, что всё намного проще.
Как обычно, гады, которые писали систему, не удосужились сделать сообщения об ошибках «с человеческим лицом», поэтому чтобы понять, чего же от нас хочет несчастный интерпретатор, нужно искать зависимости в библиотеках (можно использовать программу «depends.exe»).
Так вот: в случае дома оказалось, что он не видел всего двух DLLек: php5ts и libpq. Вариант решения — просто скопировать их в system32 (libpq.dll, php5ts.dll, libeay32.dll, ssleay.dll). Если чего-то не хватает, поискать локально и в случае обнаружения скопировать в system32. Если нет, искать в сети.
Другой способ — добавить путь к PHP в path. И у того, и у другого способа есть свои плюсы и минусы.
2 Ноября 2008, 00:00
Вот интересные грабли.
Запрос SELECT DATE_FORMAT(d_Date, '%W'), DAYNAME(DATE(d_date)) FROM `dream_main` WHERE `d_level` > 0 ORDER BY RAND() LIMIT 1; по идее должен выдавать два одинаковых столбца. Но при использовании DAYNAME() совместно с ORDER BY RAND() русский текст обрезается: выводятся первые 4 символа и половина пятого. Кодировка — UTF-8
Кто знает, как от этого избавиться? Я пока придумал только вариант с date_format(), и он меня устраивает, но хотелось бы знать причину такого безобразия.
SET @@lc_time_names = 'ru_RU'; естественно выполняется.
Собственно эта штука используется в Совии для вывода случайного сна.
25 Сентября 2008, 00:00
Это пост о том, как не надо программировать
А знаете ли вы, что на www.ren-tv.com используется Postgres, а доступ осуществляется с такими параметрами: "dbname=rentv_www user=rentv"?
Если нет, то знайте.
Информация к размышлению
Ламеры?
16 Сентября 2008, 00:00
Думаю, что многим приходилось натыкаться на грабли «Commands out of sync; you can't run this command now» при работе с PHP и MySQL. У нас такое происходило при попытке вызвать две хранимые процедуры подряд. Сегодня я нашёл решение этой проблемы (правда его наверняка можно доработать и сделать более красивым).
Считаем, что foo() принимает на вход tinyint и содержит «SELECT 1», а bar() не принимает на вход ничего и содержит «SELECT 2». $link содержит готовое соединение с базой (mysqli).
$link->real_query('CALL foo(1)');
do {
$res = $link->use_result();
if (!empty($res)) {
while ($row = $res->fetch_row()) {
print_r($row);
echo '<br />';
}
$res->close();
} else {
echo 'empty<br />';
}
} while ($link->next_result());
echo '<hr />';
$link->real_query('CALL bar()');
do {
$res = $link->use_result();
if (!empty($res)) {
while ($row = $res->fetch_row()) {
print_r($row);
echo '<br />';
}
$res->close();
} else {
echo 'empty<br />';
}
} while ($link->next_result());
26 Июня 2008, 00:00
В очередном порыве сделать всё красиво и правильно, я решил сначала прогнать получившуюся схему базы через explain в MySQL на тех запросах, которые буду использовать в процессе работы дальше.
И нифига ж себе, как оказывается отличалось моё представление о работе оптимизатора от того, что на самом деле.
Большим плюсом этого оказалось то, что я решил избавиться от некоторых индексов (которые по сути не использовались бы никогда), создать некоторые новые, а вместе с удалением лишних индексов избавиться от лишнего функционала, который, опять же, не был бы востребован :)
В планах переделать Совию с нуля, придя в том числе и к новой идеологии. Сроки называть не буду, потому что каждый раз, когда я решал к какой-то дате открыть что-то, получалась фигня. Пока продвижение есть, и это уже хорошо :)
23 Июня 2008, 00:00
Решил перенести часть логики (в будущем) блога с PHP на MySQL, переписав функцию добавления комментария с PHP на SQL и сделав хранимую процедуру. И вот что вышло :) Пока проверял только руками.