четверг, 21 октября 2010 г.

Коды кнопок добавления в социальные закладки (Share Button Codes)

Так как часто приходится встраивать кнопки закладок для всякого рода социальных ресурсов решил создать памятку, чтобы все были в одном месте.

Код формирования ссылки для сервиса Facebook:
http://www.facebook.com/sharer.php?u={ссылка на страницу}
Код формирования ссылки для сервиса Twitter:
http://twitter.com/home/?status={заголовок страницы}+{ссылка на страницу} 
Код формирования ссылки для сервиса Google Buzz:
http://www.google.com/buzz/post?url={ссылка на страницу}&title={заголовок страницы}
Код формирования ссылки для сервиса Я.ру:
http://my.ya.ru/posts_add_link.xml?URL={ссылка на страницу}&title={заголовок страницы}
Код формирования ссылки для сервиса Вконтакте:
http://vkontakte.ru/share.php?url={ссылка на страницу}
Код формирования ссылки для сервиса LiveInternet:
http://www.liveinternet.ru/journal_post.php?action=n_add&cnurl={ссылка на страницу}
Код формирования ссылки для сервиса Livejournal:
http://www.livejournal.com/update.bml?event={ссылка на страницу}&subject={заголовок страницы}
Код формирования ссылки для сервиса Memori:
http://memori.ru/link/
Код формирования ссылки для сервиса Мой Мир (mail.ru):
http://connect.mail.ru/share?share_url={ссылка на страницу}
Возможно ещё что-то упустил - смело пишите в комментариях - добавлю.

четверг, 24 июня 2010 г.

Программист должен проверять результат своей работы перед передачей в тестирование

Читая сегодня Хабр не смог удержаться, чтобы не процитировать золотые слова, с которыми я согласен на все 100%:

Программист должен проверять результат своей работы перед передачей в тестирование
«Моё дело писать код, а их дело проверять», «Ну а их-то зачем понанимали?» — можно услышать в таких командах. Это элементарное отсутствие гигиены, работа ради «отписаться». Где вы видели журналиста, который не перечитывает свою статью перед тем, как передать её в редакцию? Если в коллективе есть программист, который проповедует такой подход, его нужно как можно скорее ликвидировать. Какой бы он ни был классный специалист.

MySQL поиск и удаление дубликатов в таблице

Как найти и удалить дубликаты в таблице MySQL? - оказывается это довольно частый вопрос, возникающий на практике, особенно когда надо установить UNIQUE constraint.

Задачу поиска дубликатов в SQL-таблице всегда можно решить таким простым запросом:

SELECT login, COUNT(login) AS cnt
FROM users GROUP BY login
HAVING ( COUNT(login)>1 );

Этот запрос вернёт все дубликаты login из таблицы пользователей. Ситуация несколько искусственна, на практике врядли будут дубликаты логинов в таблице пользователей, но для примера запроса сгодится.
Другой вариант, возможно более прост для понимания, при SELECT-е сделать простой JOIN таблицы самой на себя. К примеру, есть таблица scriptsettings с настройками какого-то скрипта, в ней нужно найти все дубликаты, где param (имя параметра) и group (логическое название группы параметров) дублируются. Запрос через JOIN примет вид:

SELECT s1.id AS id1, s1.group, s1.param, s2.id AS id2 FROM scriptsettings s1
INNER JOIN scriptsettings s2 ON s2.id>s1.id AND s1.param=s2.param AND s1.group=s2.group;

Удаление дубликатов из таблицы так же можно сделать простым JOIN таблицы самой на себя:

DELETE s1 FROM scriptsettings s1, scriptsettings s2 WHERE s1.param=s2.param AND s1.id>s2.id;

Пока писал, в голову пришёл более лаконичный и элегантный способ удаления дубликатов при помощи MySQL:

ALTER IGNORE TABLE scriptsettings ADD UNIQUE INDEX(param);

среда, 16 июня 2010 г.

Regexp to replace placeholders at string (замена плейсхолдеров в строке на элементы массива)

Довольно часто встречается задача подстановок каких-либо значений из ассоциативного массива  в определённые места в строке. Думаю, многие повседневно сталкиваются с ней при формировании персонализированных email-писем, формировании мультиязычных сообщений пользователю с подстановками из личных данных и других повседневных задачах.
Задача замены плейсхолдеров, или так называемых меток-заполнителей, в строке на соответствующие элементы ассоциативного массива может быть решена несколькими способами, но, на мой взгляд, самый элегантный способ - при помощи preg-а (регулярных выражений).
Допустим, у нас есть ассоциативный массив с подстановками $placeholders, и строка $str c метками-заполнителями вида {var_name}, в которой нужно произвести замену на соответствующие значения из массива. Решение на PHP будет выглядеть следующим образом:
$placeholders = array("name"=>"User", "link"=>"http://webaurum.blogspot.com");
$str = "Hello {name}, you are here {link}";
echo preg_replace('~\{\w+\}~e', '@$placeholders$0', $str);
echo preg_replace( '/\{(\w+)\}/e', '@$placeholders["\\1"]', $str);
Две последние строки абсолютно идентичны по функциональному назначению, я их просто привёл для примера, может кому-то будет понятнее второй вариант. Обе последние строки вернут результат:
Hello User, you are here http://webaurum.blogspot.com
Реализация работает быстро и элегантно, использую во многих собственных проектах.

понедельник, 17 мая 2010 г.

ICANN разрешила в domain names кириллицу и другие алфавиты. А как же совместимость?!

Новые правила позволят использовать в доменных именах 100 тысяч новых символов. В ICANN новые правила наименования доменов называют крупнейшим техническим изменением Интернета за все время его существования. Но это изменение к лучшему ли?
Россия, по-моему, одна из первых начала регистрировать домены в зоне .РФ. Зашёл на правительственный сайт http://правительство.рф и уже это нововведение вызвало у меня улыбку.
Домен-то написан кириллицей, но все внутренние линки остались латиницей. =) Бред, имхо, всю затею и удобство свели на нет. Смешно смотрится адрес вида http://правительство.рф/staff/.

Ещё меня заинтересовало - как будут работать все современные браузеры с кириллицей в адресной строке. Проверил во всех основных, что у меня стояли на рабочем компьютере. Оказалось что нормально варит только Opera 10.53, не корёжит символы и отображает во всех URL-ах нормальное написание. Тот же Firefox и остальные собратья при вводе в адресную строку заветного адреса вели себя ненормально, но открыть сайт смогли. Firefox при вводе "правительство.рф" затем заменил этот адрес на ненормальный "http://xn--80aealotwbjpid2k.xn--p1ai/#", но сайт открыл успешно. А Google Chrome и вовсе неправильно отреагировал. Получив адрес "правительство.рф" он сразу пошёл искать его в поисковике гугл, вместо того, чтобы просто открыть этот адрес. Там, нажав на первой странице результатов поиска на соответствующей ссылке, я уже смог попасть на требуемый сайт.

Самое главное, что меня расстроило, это нюансы разработки сайтов и другого ПО, при таком нововведении. Представьте сколько проблем будет в заготовленных скриптах определения корректности введенного e-mail или валидации URL. Попробуйте в практически любой подобный скрипт внести русские символы. С мобильными устройствами тоже проблемы: не все смогут попасть на заветные сайты, так как вообще не предусмотрена возможность ввода символов отличных от латиницы. Вся интернациональность ломается на корню, люди с других стран, просто не смогут зайти на ваш сайт, даже зная язык, потому что у них на клавиатуре нет таких символов. А как же старые стандарты и реализации? Тот же RFC 2821 (Simple Mail Transfer Protocol), www.ietf.org/rfc/rfc2821.txt, что, тоже переписывать и создавать новые стандарты?!

Необходимо переписать тонны кода, который уже отлажен и работает годами!
Я против таких сомнительных прорыров в Интернете.

вторник, 11 мая 2010 г.

Странное поведение query builder-а Kohana

Не перестаю удивляться всяким мелочам и неприятностям из Kohana PHP 5 Framework. Я сравнительно недавно на него перешёл, до того использовал в основном CodeIgniter. Как известно, Кохана зародилась как форк от CodeIgniter, из-за недостаточно быстрого развития и исправления ошибок в CI. Вокруг Kohana образовалось своё новое, мощное, комьюнити, которое все время единогласно твердит что наш framework лучше чем CI, меньше ошибок, более оптимизированный, быстрый… но не так это всё, на практике, увы.
Я всё больше и больше разочаровываюсь в их документации, в отсутствии обратной совместимости от версии к версии в большинстве модулей. Это из того, что я уже могу с уверенностью сказать, после полутора месяцев её использования. Думаю, что ситуация исправится в ближайшее время в лучшую сторону, но главное чтобы у этого фреймворка были свои сторонники и не разбегались уже приобретённые.
Яркий пример, который я только что поймал, на ровном месте – это использование метода update() из query builder. Использовал такую вот нехитрую конструкцию:

$db->update("news", Array('status'=>0));

Куда уже проще запрос?! – Необходимо поставить всем элементам таблицы News статус равный 0. Но Кохана завалилась, с ошибкой:

> ttm/system/libraries/drivers/Database/Mysql.php [392]:
There was an SQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 - UPDATE `news` SET `status` = 0 WHERE


Понятное дело, но зачем where сюда приплели, если даже нет условия? Мне нужно сделать Update для всех элементов таблицы.
Решение тут, конечно, простое – использовать условие-пустышку, но неприятный осадок всё-таки остался:

$db->where('status', 1)->update("news", $data);

Я использую не самую свежую версию KOHANA_VERSION = 2.3.2, но не думаю что ситуация сильно поменялась в следующих. Боюсь обновляться, чтобы проект не завалился где-то в другом месте на финишной стадии разработки =)

воскресенье, 25 апреля 2010 г.

Медиаплеер Uppod, сервис создания плееров для сайта

Так как интернет соединение всё шире и шире в наших домах, то мультимедиа в web-е уже давно никого не удивляет и тем более не раздражает из-за экономии трафика. Сегодня ни один более-менее крупный проект, с хорошей социальной и медиа составляющей, не обходится без просмотра/прослушивания видео или музыки непосредственно онлайн, не скачивая файл на комьютер. Для этого используются Flash плееры, об одном из них и пойдёт речь.

Так как мои познания во Flash и ActionScript скудны, пришлось искать бесплатные инструменты для воспроизведения видео и музыки, так как написать самостоятельно такую вещь у меня займёт много времени. Пересмотрев несколько пар таких плееров, остановился на сервисе uppod.ru.


Понравился плеер тем, что умеет воспроизводить практически всё, что можно придумать, точнее всё что поддерживается технологией Flash (список привёл для flash-плеера с версии 9.0.115.0):
  • Стандарт видео: Flash video (H.263), MPEG-4 (H.264 — HD)
  • Форматы видео: FLV, F4V, MP4, MOV, M4A, MP4V, 3GP и 3G2
  • Аудио: AAC (HE, LC)
  • Кодеки видео: On2 VP6, Sorenson Spark, H.264
  • Кодеки аудио: MP3 (11, 22, 44 кГц)
Но это не главное, чем он взял меня и чем выделяется среди остальных конкурентов. Самое главное, что мне требовалось от плеера для сайта – возможность кастомизации под свои нужды: возможность гибко настроить внешний вид, задать какие элементы интерфейса должны быть, какого цвета, размера и т.д. Тут flash медиаплеер Uppod значительно обгоняет всех остальных в плане количества и гибкости настроек. На сайте сервиса даже есть визуальный редактор стилей, в котором можно за 5 минут сварганить, что нужно именно в вашем конкретном случае.

Второе важное для меня требование – это отсутствие их рекламы и контекстной рекламы в интерфейсе. Бесплатный аккаунт сервиса Uppod не имеет практически никаких ограничений, и совсем не обязательно покупать версию PRO. Это ОГРОМНЫЙ плюс для проектов, не имеющих финансовой поддержки.

Приведу список основных возможностей, которые взял с их оффсайта:
  • поддержка плейлистов различных конфигураций; 
  • возможность скрывать прямые ссылки на файлы с помощью кодирования; 
  • мультиязычный интерфейс; 
  • возможность выбирать состав панели управления (более 20 кнопок и индикаторов можно установить в любой последовательности); 
  • пользовательские подсказки; 
  • полноэкранный режим для видео; 
  • поддержка стримминга и псевдопоточной загрузки; 
  • подключение веб-камеры; 
  • горячие клавиши; 
  • в интерфейсе нет рекламы; 
  • и еще много-много всего.
Есть тут и возможность управлять плеером через JavaScript. В общем, практически всё, что можно придумать разработчики учли в медиаплеере Uppod. Лучше плеера для сайта и не найти, настоятельно рекомендую.

понедельник, 22 марта 2010 г.

Типичный цикл разработки программного обеспечения

Думаю, кто работает в более-менее крупной IT-компании, взглянет эти этапы разработки программного обеспечения и скажет "...блин, ведь у нас точно так же!..". Я более чем уверен.

Итак, типичный цикл разработки программного обеспечения:

1. Программист пишет код, который, по его мнению, не содержит багов.
2. Продукт тестируется. Находится 20 ошибок.
3. Программист исправляет 10 ошибок и объясняет отделу QA, что остальные 10 - не баги, а фичи.
4. Отдел тестирования отправляет на доработку 5 старых багов и находит еще 15 новых.
5. Пункты 3 и 4 повторяются еще три раза.
6. В связи с маркетинговым давлением и слишком необдуманным анонсированием продукта, основанным на очень оптимистическом плане разработки, продукт уходит в релиз.
7. Пользователи находят 137 новых багов.
8. Программиста, писавшего продукт и получившего за него оплату, нигде не могут найти.
9. Нанятая в спешном порядке новая команда программистов исправляет почти все 137 багов, но при этом добавляет еще 456 новых.
10. Первоначальный программист высылает низкооплачиваемому отделу тестирования открытку с Фиджи. Весь отдел тестирования увольняется.
11. Компания поглащяется конкурирующей фирмой за прибыль, полученную от продажи их продукта, в котором 783 бага.
12. Советом директоров нанимается новый исполнительный директор. Он нанимает программиста чтобы переписать код с нуля.
13. Программист пишет код, который, по его мнению, не содержит багов...

Чистая жизненная правда!

вольный перевод жизненной правды отсюда

четверг, 11 марта 2010 г.

Вёрстка, "overflow:hidden" для ячейки таблицы

Появилась задача сверстать таблицу так, чтобы столбцы и ячейки table не разъезжались, не тянулись, при изменении количества содержимого внутри ячейки. Оказалось, не всё так просто. Повесив свойство overflow:hidden для ячейки таблицы - не будет работать. Как растягивал таблицу контент внутри ячеек, так и будет тянуть.

Нашёл, что к тегу <table> или к элементу, у которого свойство display установлено как table или inline-table можно применять свойство:

table-layout: auto | fixed

Применив для таблицы table-layout:fixed задача решилась сама собой, таблицу не растягивает, но и скролл не появляется.

Дело в том, что значение fixed ещё при этом и повышает производительность построения таблиц. Ширина колонок в этом случае определяется либо с помощью тега <col>, либо вычисляется на основе первой строки. Если данные о форматировании первой строки таблицы по каким-либо причинам получить невозможно, в этом случае таблица будет делиться на колонки равной ширины. При использовании этого параметра содержимое, которое не помещается в ячейку указанной ширины, будет «обрезано» либо наложено поверх ячейки.

Работает под браузерами: IE6+, IE7+, Firefox 2+, Firefox 3+, Opera 9.52+, Safari 3.1+, Chrome 0.3+.

понедельник, 15 февраля 2010 г.

Странности JavaScript. Или это всё-таки JS особенности?

Сегодня набрёл на отличную подборку не сразу объяснимых странностей JavaScript. Например:

//1.
Number.MIN_VALUE > 0; // true or false?
//2.
typeof null; // what type?
null === Object; // true or false?
//3.
NaN === NaN; // true or false?
//4.
typeof NaN; // what type?


Как думаете, что каждая из строчек вернёт, хорошенько подумайте. А потом проверьте себя:

  1. true 
  2. object и false
  3. false
  4. number

На самом деле если подумать над этим, то есть вполне логическое объяснение на каждый из пунктов, но не все так сразу очевидно. Например, необычное поведение NaN — требование IEEE 754, общее для всех языков программирования. Необходимо чтобы типу Number можно было присвоить NaN, но при этом не был равен ничему другому. Так же, с логической точки зрения можно объяснить все вышеприведенные пункты, все были при здравом уме и памяти, когда разработчики закладывали такое поведение JS.

Кому интересно продолжение, есть целый сайт, посвящённый "странностям" JS - wtfjs.com

понедельник, 1 февраля 2010 г.

Google Reader научился отслеживать изменения на сайте без RSS-потоков

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

Для добавления в агрегатор нужных веб-ресурсов без RSS-канала,  достаточно ввести их адрес в поле подписки. Все происходящие на сайте изменения начинают отслеживаться, а пользователям приходят соответствующие уведомления, включая модифицированные фрагменты веб-страниц. Думаю, что это происходит путём сравнения проиндексированных google-bot-ом страниц, и выдаче разницы на сайте.

Сейчас поддерживается только англоязычный контент в HTML-формате, обновление содержимого фреймов не распознается, понятное дело.

Если вы не хотите, чтобы агрегатор Google Reader мог "сканировать" вашу страницу таким образом, а только через существующие RSS-каналы, то вы можете поставить в заголовке страницы следующий текст:

<meta name="googlebot" content="noarchive">

Гугл рулит, всё лучше и лучше их сервисы, скоро станут монополистами во всех отраслях web-сервисов.

пятница, 22 января 2010 г.

Новый jQuery 1.4 + обновлённый jQuery CheatSheet

Не так давно вышла оновлённая библиотека jQuery 1.4, краткий список новшеств приведу ниже.

  • метод live полностью переделали, теперь он поддерживает во всех браузерах такие события, как: submit, change, mouseenter, mouseleave, focus, blur.
  • подкорректировано поведение метода add.
  • сильно увеличена производительность функций для работы с Document object model (в частности append, prepend).
  • стали быстрее работать функции find, empty, remove, addClass, removeClass, hasClass, attr и css.
  • добавлена jQuery.noop() - функция, которая ничего не делает.
  • новая вспомогательная функция jQuery.contains(container, contained), позволяющая проверить существование элемента DOM внутри другого элемента DOM.
  • добавлен весьма полезный метод .delay(duration, [queueName]), которые позволяет установить таймер задержки выполнения следующего пункта очереди.
  • и много других приятных дополнений, о которых можно почитать на официальном сайте jQuery.

Кстати, если нужно, вот ссылка на обновлённую шпаргалку по API jQuery 1.4 (cheetsheet)

пятница, 8 января 2010 г.

Интересные факты про термин "чаевые" ("tips")

Никогда раньше не задумывался о происхождении термина "давать на чай". Я знал, что он происходит именно от английского слова tips, но почему чай?! - Оказывается, сам термин "чаевые" появился в Англии ещё в первой половине XVIII века, а точнее в 30-х годах, связан он, как ни странно, именно с чаем. В этот период в Соединенном королевстве было модно пить чай на специально оборудованных верандах в парках и скверах. Видимо, расторопность официантов и тогда была не на высоте, поэтому на столах появились особые коробочки с аббревиатурой T.I.P.S. (To Insure Prompt Service) – "Для оплаты быстрого обслуживания". В общем, – хочешь быстро получить горячий чай – добавь небольшую сумму сверх счета. Постепенно английский термин tips и русский "чаевые" распространился и на все остальные сферы обслуживания.

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting