phing.tasks.ext.SvnExportRevisionDiffTask

В последнее время в посещаемых мною форумах и конференциях часто всплывает тема деплоя php-приложений на production-сервер. Я решил поделиться собственным рецептом.

В распоряжении имеется:

  1. svn-репозитарий с проектом.
  2. ftp-доступ к рабочему серверу.
  3. установленный и готовый к тяжёлой рутине phing

Сценарий работ следующий:

  1. Сделать экспорт кода из svn
  2. Подготовить его к загрузке (например убрать комментарии, “склеить” мелкие в один большой, удалить лишнее и т.п.)
  3. Проверить на наличие ошибок (они могли попасть в репозитарий или образоваться на предыдущем шаге)
  4. Закачать полученное на рабочий сервер.

Всё вроде бы просто, но смущает один момент – экспорт всего и вся. Со времени последнего обновления на сервере в репозитарии обновились 3 файла, а экспортировать нужно всё? Никак нет! Экспортировать будем только то, что изменилось. То есть первый шаг сценария будет выглядеть так:

  1. Получить последнюю версию проекта на сервере – RevFrom
  2. Получить последнюю версию проекта в репозитарии – RevTo
  3. Экспортировать файлы, которые изменились или добавились c RevFrom до RevTo

Версию рабочего проекта, не мудрствуя лукаво, предлагаю хранить в текстовом файле. Например revision.txt. Версию проекта в репозитарии поможет узнать SvnLastRevisionTask. Неясным остался лишь момент – каким образом выяснить какие файлы изменились. Те, кто пользовались TortoiseSVN наверняка знают о чудесной его возможности – сравнить две ревизии и экспортировать “разницу”. Но svn в чистом виде такой возможности не предоставляет. Так что пришлось немного поработать.
(more…)

25.02.08  |  , ,  | 4 comments

jQuery 1.2.3

.4.5.6.7…

Тихо и незаметно зарелизился jQuery:

jquery-1.2.3.js, jquery-1.2.3.min.js, jquery-1.2.3.pack.js

Поскольку официального анонса пока нету, перечислю “вкусности” сам:
Вот официальный анонс, а ниже мой:
(more…)

07.02.08  |   | 3 comments

HTTP в картинках


Замечательный документик. В доступной форме книжки-раскраски представляет то, что должен знать каждый веб-программист.
Да и вообще на сайте этого дяди Alan-а есть чем поживиться пытливому уму разработчика, рекомендации, так сказать, лучших собаководов…

30.01.08  |   | 2 comments

NULL без палочки

Второй раз сталкиваюсь с неспортивным поведением со стороны MSSQL. И дабы встретив третий не тратить на него полдня документирую.

Имеется:

  1. два слинкованных MSSQL-сервера
  2. подключение к одному из них
  3. хранимая процедура на другом

Требуется:

  • вызвать эту процедуру c набором параметров и получить результат.

Решение:

exec LINKED_SERVER.SELECTED_DATABASE.dbo.procedure_name @param_2=value, @param_1=value, @param_3=value…

Ничего не предвещает беды. Небо чистое, коннект уверенный, лаг умеренный… и тут… растёт напряжение, давит тишина, в жилах стынет кровь и появляется леденящий душу ПИЗДЕЦ!

Я не случайно параметры написал “вразнобой”. Казалось бы ничего криминального – они же именованы. И всё отлично покуда все параметры принимают какие-либо значения. Но как только окажется что @param_2=null (или @param_1) вы будете приятно удивлены загадочными сообщениями вроде “а почему это параметр_2 не передан?” или “зачем параметр_1 ты передал мне два раза?”. И будете долго биться в истерике, когда окажется, что выполняя запрос сразу на нужном сервере, вы получаете нормальный результат без каких-либо сообщений об ошибках. Мистика?

Как удалось выяснить – параметр, который null на линкованный сервер попадает уже без имени (т.е. не “@param_2=null, @param_1=value, @param_2=value”, a “NULL, @param_1=value, @param_3=value” и как следствие – этот самый NULL в данном случае будет считаться первым входным параметром в процедуре…

Решение было тривиальным(и глупым) – вынести все параметры, которые могут быть null, в конец объявления. Но если кто-то объяснит суть описываемого явления, и красивый выход из такого положения – буду очень признателен.

jQuery 1.2.2

К своему “второгодию” jQuery решил явиться миру обновлённым.

Много исправлений направленных на ускорение и “устабилизацию”.
Решена крайне досадная проблема с тем, что $(document).ready не срабатывал в IE если, документ находился в [и]фрейме.
Из новшеств – этот самый $(document).ready(func) теперь можно писать в более привычном виде через $.bind – $(document).bind(‘ready’,func);
Появились два новых event-а – mouseenter и mouseleave, которые вероятно скоро пойдут в массы в качестве основы для разнообразных dropdown-менюшек.
В “ajax”-части добавились “умолчальные” заголовки Accept, для разных типов dataType. (зачем это надо? и что из этого выйдет ?)

Перед тем как обновиться не забудьте – некоторые плагины могли “сломаться” – будьте готовы поработать напильником…

15.01.08  |   | 2 comments

Да не грузитесь вы так, партнёры.

Уважаемый MiRacLe, запиши и запомни: если какая-то определённая страница в FireFox выглядит или работает не так как задумано (при этом никаких видимых ошибок http или js нет, другие страницы на этом и других ресурсах работают и выглядят привычно, и что уж совсем необычно – эта страница полноценно функционирует в IE и других недобраузерах Opera), то в первую очередь нажми Ctrl-Shift-B и посмотри – не заблокировал ли AdBlock Plus какой-нибудь из необходимых для работы файлов.
Уважаемый Denis, спешу вас проинформировать, что вы очень сильно ошибаетесь, когда пишите, что partners в .ru это всегда реклама.

За свою недолгую трудовую деятельность с моих верфей в большое плавание ушли сотни полторы разных сайтов, из них где-то две трети содержали раздел “Партнеры”, и вы не поверите – почти все расположены по URL, содержащему “partners”. И это совсем не та реклама, которую, как мне кажется, призван блокировать adblock plus. Я заранее напишу вам спасибо за то, что вы пересмотрите правило /^http\:\/\/.*[^a-z](partners?|promo|sponsor)[^a-z]/$~stylesheet сделав его более толерантным что ли. Ну а вообще спасибо, за ваш нелёгкий труд!

12.01.08  |   | стань первым

border-spacing для IE

Update: 06.11.08
ЕЩЁ раз обращаю внимание тех, кто бездумно скопирует и будет использовать приведённый рецепт (судя по количеству почитателей этого поста, сектантов культа Режь-Клей тьма) – если вам нужен border-spacing: 0, прочитайте ДО КОНЦА, а лучше сразу последнюю строчку.

Делюсь грязным хаком, для добавления поддержки border-spacing в IE. Собственно сам css:

table {
border-spacing: 50px; /* для всех кто в теме */
scrollbar-face-color: expression( runtimeStyle.scrollbarFaceColor = '#fff', cellSpacing = parseInt(currentStyle['border-spacing'])); /* угадайте кто?*/
}

Ну и пояснения: суть кода думаю ясна – вместо border-spacing, задать аналогичный cellspacing. Единственный (на мой взгляд) недостаток – считаю что border-spacing задан в px. Желающим поизвращаться поупражняться в переводе из других единиц – милости прошу.

Ну и вкратце о магический пассах, которые сплетены вокруг рабочего кода – они нужны для того чтобы expression выполнился ровно один раз (любопытным предлагаю заменить в вышепреведённом заклятье runtimeStyle… на alert(“Интересно как же часто я покажусь?”) ).

А за разъяснениями о runtimeStyle, currentStyle и разнице между ними отправляю к источнику сей мудрости – докладу о “тонком css” для IE с Client Side’2007.

Update: описанный хак нужен лишь в случае если border-spacing отличен от нуля, в противном случае используется border-collapse: collapse.

Update 20.03.2009 Почему перестало работать в IE8 ?

13.12.07  |  ,  | 2 comments

Performance Optimization WordPress Plugins by W3 EDGE