Апрель 2009

Приоритеты операций

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

Программист, помни, на собеседовании всегда найдется человек, который высушит тебе мозги приоритетами операций и вот такой вот фигней - $a = ++$b - $a * ($b--) > 5 ? ++$a^$b : $b-=5;

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

(далее…)

Как выбрать стальную дверь. Установка дверей (железные двери и стальные двери) в Киеве.

REGEXP и RLIKE

20.04.2009

Наткнулся недавно в коде проекта на вот такую вот конструкцию:

...AND (`struct`.`regions` = "" OR `struct`.`regions` REGEXP "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.$current_region_id.'\"\;).*\}$" OR `struct`.`regions` REGEXP "^a:[0-9]+:\{.*(i:[0-9]+;s:[0-9]+:\"'.ALL_REGIONS_ID.'\"\;).*\}$" OR `struct`.`regions` REGEXP "^a:[0-9]+:\{+(i:[0-9]+;s:[0-9]+:\"0\"\;)*\}$" )...

и не сразу вкурил что это за загадочный REGEXP. Оказалось что это синоним старого доброго RLIKE, ну точнее последний синоним первого :) так-то :)

This page contains both secure and nonsecure items

17.04.2009

Недавно наткнулся на хабре на стетейку о «//» в ссылках, т.е. идея писать абсолютные пути без указания протокола типа http://ya.ru заменять на //ya.ru/.

Не буду копипастить - статья лежит тут: http://bolknote.ru/2009/04/04/~2074 советую прочитать всем.

Раскажу я о том, что это может поправить. Так вот, дело в том, что когда IE подгружает страницу по https, в которой есть ссылки на цсски или джээсники по http - ругается, дескать "This page contains both secure and nonsecure items". Такой баг я поймал когда прикручивал WorldPay - там страница ответа подгружается системой и отображается как своя - т.е. ваша страница ответа будет по урлу http://www.worldpay.com/etc.... Ясное дело, что если ссылки в урлах относительные - то css не загрузится и дизайну кабзда :) поэтому ссылки делаются абсолютными - ну а если они генерятся автоматом - то путь на них будет по http - вот и получаем такой варнинг. Если же пользоваться «Common Internet Scheme Syntax», то все будет окей :) жаль что я не знал этого пару лет назад :(

Тег <colgroup>

17.04.2009

Ширина ячеек таблицы - отдельная песня для создания сайтов. В больших таблицах, где линий много, тегов <td> еще больше. Чтобы указать ширину ячеек один раз - я обычно указывал ее только для первой линии (т.е. для td-шек 1-й tr-ки), а остальные уже подстраивались под первую. Если же таблица генерилась циклом, то width получалось был в каждой ячейке.

(далее…)

Тег <nobr>

17.04.2009

Мне нравится работать в команде опытных ребят, постоянно тибрим друг у друга идеи и учимся чему-нить. На этот раз открытием для меня стал тег <nobr>. Я раньше часто мучался, выискавая место куда можно тыркнуть nowrap, а оказывается все гораздо проще:

Тег <NOBR> (NO BReak line) запрещает перевод строки. Бывают случаи, когда возникает надобность в операции противоположного назначения – запретить перевод строки. Текст, заключенный между тэгами <NOBR> и </NOBR>, будет гарантированно располагаться в одной строке без переноса на другую. Длинная строка не уместится на экране, и для ее просмотра придется использовать горизонтальную полосу прокрутки. Закрывающий тег обязателен

Атрибутов нет, хотя какие-тут могуть быть аттрибуты :)

Поиск через POST

12.04.2009

Концепция "Friendly URLs " в последнее время полностью извратила метод GET протокола HTTP. Никаких тебе index.php?path='blog'&record_id=100500 - все разделено слешами, даже этот пост, сайт без mod_rewrite кажется просто неполноценным. Однако остались еще места, где GET незаменим. Одно из таких мест - форма поиска.

У многих программистов (как правило, начинающих) в голове почему-то строится странное соответствие: формы = POST. Понятное дело, форма авторизации - постом, ибо показывать кому-то логин-пароль в урле - брррр, контактная форма - тоже пост и т.п.

(далее…)

CSV-парсеры

11.04.2009

CSV - один из форматов файлов. Удобен он тем, что позволяет заказчикам, непросвященным в вопросах технологий редактировать данные в обычном экселе, а программистам легко забирать то что они там понаписали. Заказчик делает обычную таблицу, сохраняет ее в формате csv - и получается файлик, в котором записи разделены по определенным правилам.

1. Каждая строка - это отдельная запись;

2. Записи разных колонок разделяются определенным разделителем (в основном зяпятая или точка с запятой);

3. Если в записи есть разделитель, то запись берется в кавычки;

4. Если в записи есть кавычки, то они представляются в виде 2-х кавычек;

(далее…)

Избавиться от LIMIT через id последней записи

11.04.2009

Иногда нужно перебрать много записей из базы. Если таблицы большие, то сразу выбрать все - довольно тупое решение, поэтому обычно выбираются записи с лимитом. Вначале первые N, потом от N до 2N и т.д.  Недавно я узнал, что использовать конструкцию с лимитом ( LIMIT n, m ) на больших таблицах - не верно, потому что при выборке скажем:

SELECT * FROM table WHERE true LIMIT 100500, 100;

вначале выберутся 100600 записей, а потом отбросятся 100500, т.е. в двусторонних лимитах вначале выбирается все до последнего предела, а потом уже отбрасывается то что не нужно. Я раньше как-то не задумывался, но на огромных таблицах - это просто фатально для базы :)

Оказалось, что есть решение и для этой проблемы. Вполне логичное, но пока яблоко не упадет бывает так и не догадаешься до очевидных вещей. Суть идеи в том, чтобы помнить не позицию, а последний айдишник записи, его подставлять в WHERE и уже потом делать односторонний быстрый лимит.

Например:

SELECT * FROM table WHERE id>100500 LIMIT 100;

Такое будет гораздо быстрее работать на больших базах (а иногда только оно и будет работать :) ). Конечно, не самый красивый костыль, но какой есть :)

href=”#” vs. href=”javascript: ;”

11.04.2009

Ссылки, как известно, не всегда нужно делать именно ссылками, иногда нужно чтобы они выполняли роли кнопок - чтобы по событию на клик отрабатывал нужный скрипт. В таких случаях, понятное дело, нужно, чтобы по клику на ссылку страница не перегружалась. И делают это обычно через жопу, а именно как:

<a href="#" onclick="return someScript(this);" >Ссылка</a>

И вроде бы все соответствует тому, что нужно - ссылка не нажимается, перехода на другую страницу не происходит - солнце светит, птички поют, тестеры и заказчик довольны - все кул. НО! это пока не появляется вертикальной прокрутки на странице и пользователь ее не прокрутит вниз до того как нажмет на такую ссылку. Потому что как только он это сделает, прокрутка магическим образом прокрутится вверх :)

Проблема такого подхода собственно в том, что в html по ссылкам можно переходить не только на другие страницы - но и прокручиваться к элементам текущей. Сделано это через так называемые якоря. То есть, если к примеру, в каком-то месте страницы у нас есть:

<div id="aaa">дивка</div>

и есть ссылка:

<a href="#aaa">ссылка</a>

то по клику на ссылку - произойдет прокрутка к блоку div.

Если же указано просто href="#", то почему-то, браузеры считают что нужно сделать прокрутку в самое начало страницы.

Помнится, я долго бился с этой проблемой - и таки нашел альтернативу:

<a href="javascript: ;">ссылка</a>

По клику - никуда он не переходит и никуда ничего не прокручивает :)

alert anchor-а выдает то что в href :(

10.04.2009

3 часа времени убил недавно на непонятное поведение браузеров. Было у меня примерно следующее:

<div id="aa">

<a href="javascript: ;">Ссылочка</a>

<a href="javascript: ;">и еще ссылочка</a>

<a href="javascript: ;">и еще</a>

</div>

через jQuery дергаю массив ссылок:

var links = $('#aa a');

и когда пробегаюсь по ним циклом - то при алерте элемента (другими словами, alert(a), где a - anchor) - получаю текст "javascript: ;".

2,5 часа я думал что дело в том как я выбираю данные в массив - мне казалось что цикл пробегает по полям <a /> и выводит собственно их, пробовал даже через $('#aa').getElementsByTagName('a'), но потом оказалось, что браузеры почему-то ведут себя неадекватно, если делается alert по <a />.

К примеру:

<a id="diablog" href="http://www.diablog.ru">Диаблогъ</a>
<span id="oneone">АДЫНАДЫН</span>
<script type="text/javascript">
alert(document.getElementById('diablog'));
alert(document.getElementById('oneone'));
</script>

Про спан все честно скажут, что это Object HTMLElement (Opera),  Object HTMLSpanElement (FF) и просто object в IE6, а вот зато про анчор - тупо выведется то, что в параметре href.

this is kind of magic o-o-ou :)

autocomplete=”off”

10.04.2009

На заре моей программистской деятельности был популярен один из тупых багов от тестеров - "Опера подсвечивает оранжевым поля, а это ни разу не по дизайну", который естесственно возникал из-за того, что пользователь "запомнил пароль и логин" - и опера таким макаром говорила о том, что данные под эти поля у нее таки есть. Тестеров есесна отправляли с этим багом нахуй к разработчикам оперы, однако недавно я узнал, что оказывается, можно сделать так, чтобы браузер вообще ничего не запоминал и не предлагал пользователю это сделать. Ежу ясно, что самый интуитивный алгоритм - это просто втупую менять параметры инпутов, чтобы даже если и запомнилось что-то - то уже железно не то, что в очередной раз отобразится на сайте. Но, оказалось, можно и проще...

(далее…)

Fulltext Index в MySQL и встроенный поиск

07.04.2009

С самой первой книжки по пхп, поиск по сайту у меня ассоциировался с конструкцией LIKE в MySQL. На не очень навороченных сайтах и на не очень навороченных поисках - она работала на ура, даже если полей, по которым шел поиск, было много. На маленьких сайтах вообще многое допустимо :) Однако, как только надо было сделать что-нить более или менее серьезное на этом фронте - как сразу LIKE шел в топку из-за своих тормозов. И не важно что это было - Sphinx, Lucene или написанный самим заказчиком типа мегаиндексатор (было однажды и такое) - возможности MySQL отметались  - и задача поиска переносилась на другие приложения. И только недавно я узнал, что оказывается MySQL сама отлично умеет все это делать!

(далее…)

Грабли: json, eval и скобки

06.04.2009

Несмотря на то, что в слове AJAX последняя буква явно показывает на то что пересылаться должны таки xml-ники, на деле это очень не удобно, громоздко и геморойно. Раньше, когда я использовал Prototype.js я просто юзал Ajax.Updater - генерил html-код на серваке - и напрямую вставлял его куда надо.  Потом, поняв, что под прототайп не так уж много чего и есть - перешел на jQuery - и познакомился с json-ом.

И все бы зашибись - jQuery с ним работает как с родным (впрочем для javascript-а) он и есть родной, на обработку приходят уже сгенерированые объектики и т.п. все было классно и супер пока мне не попался проект, написанный с использованием прототайпа. Естесственно, на стороне сервера я по-привычке сделал json_encode - однако на клиент пришла именно что строка json. Что с ней делать я не знал - и полез курить гугл. Оказалось, что надо сделать eval, что вполне логично, потому что запись json - это ничто иное как короткая запись анонимного объекта javascript. Но это не работало. Никак. Ваще никак. json = eval(responseText) никак не хотел работать хоть ты убейся. Полчаса я пытался допереть в чем же все-таки дело, оказалось, что в такой записи json надо обрамлять скобками, т.е.:

json = eval( '(' + responseText + ')' );

вот так. Почему - хз. Перед тем как писать эту статью я честно перерыл все что можно было перерыть, но так и не смог найти, собсна почему это нужно делать именно так. Все что я нашел, это какую-то муть про Invalid Label, почему же она возникает тоже не понятно ни разу. Тем не менее, сути дела это не меняет - грабли с json-ом и евалом так и будут граблями, которые просто нужно запомнить как таблицу умножения и никогда на них не наступать :)

Указание типов в параметрах методов vs phpDoc

03.04.2009

php5 подарил нам всем много классных и удобных вещей, однако многие из них как обычно у ребят из Зенда - просто недоделаны до конца. Одна из таких вещей - это подобие строгой типизации, точнее возможность такую сделать. Как правило, люди, которые долго программируют в пхп и так пишут типы принимаемых в методах переменных (ну и возвращаемых тоже) - в основном для того, чтобы это подхватывалось IDE - и можно было вызывать посказки и не париться.

(далее…)

Когда private поля начинаются с подчеркивания :(

01.04.2009

Мир php такой, каким мы видим его сейчас очень во-многом из-за того, что славные ребята из Зенда, создав язык программирования бросили разработчиков на полпути, так и не сделав своего фреймворка или cms-ки вовремя, породив множество различного рода (как правило кривых) решений от кучи разработчиков - ну и разумеется кучу различных стандартов написания кода. Одним из больных мест стали private поля и методы. Если вспомнить php4, то там объекты по сути были массивами, к которым кое-как прикрутили функции, поэтому ессественно, что указать область видимости там было невозможно. Так родился костыль :)

(далее…)


Информеры с тИЦ и PR: получить код для сайта
купить деревянные окна