среда, декабря 27, 2006
ДДД: За тех, кто в море — последний новогодний плакат в этом году
Перенесёмся на капитанский мостик... все перенеслись? (Кажется, у нас пропала палуба...)
Да и бог с ней, с палубой. Контейнер всё равно не тонет. Мы умеем писать пальцем по стеклу — ещё бы, столько лет в мореходке.
Контейнеры плодятся, как дрозофилы. Лёгкая вестибулярная дезориентация.
Раз уж стало нас шкивать, не пора ли нам поддать...
Намусорили, добавили мелких деталей... На этом можно и остановиться. Чистое рабочее время — около четырёх часов.
вторник, декабря 26, 2006
За окном туман — вот такой хреновый декабрь
Ужасно сонная погода, ощущение полного лунатизма.
Лунатическая работа, что тут удивляться результатам :-)
It's dreamy weather we're on
You waved your crooked wand
Along an icy pond,
with a frozen moon.
ДДД: Постер-портрет — новогоднее
Снова Xara Xtreme. Это ростовая фигура оформления праздничного зала. По совместительству — аттракцион:
что отлично сочетается со зловещей улыбкой: ну-ну, попади давай... Не знаю, как бороться с этим выражением лица — выходит таким, и всё тут.
Будет печататься в полный рост на глянцевой бумаге, вырезаться и клеиться на стену. Перед ней предложу поставить ритуальный столик с напитками. Если вдруг кто подойдёт с пустыми руками :-)
Наблюдая жизнь: О времени. Без вывода.
На зимние каникулы улетаю в Вьюжно-Сахалинск. Посчитал — вышло, что не видел зимнего Сахалина 16 лет. Я мог поклясться, что вдвое меньше. Отчего так?
Мы имеем дело с такими объёмами времени («каждый миг может быть бесконечностью» — дон Хуан), что голова совершенно не способна оперировать ими, и вынуждена упрощать до приемлемых схем. Как именно происходит это упрощение — зависит от возраста.
Заметил, что дети часто говорят «давно» и почти никогда — «скоро». Наверное, оттого, что всё прошлое в пропорциях их жизни действительно было страшно давно: прошлогодний снег выпадал четверть жизни назад! Девятилетний ребёнок говорит «давно» о событии, произошедшем позавчера или третьего дня. Что же касается его будущего, то оно настолько заполнено временем, что в нём почти нет «скоро» — всё гдееее-то там.
С возрастом мы всё чаще говорим о прошлом — «недавно». Университет закончил — недавно. Выпускная ночь под моросящим дождём — недавно. Глисты в детском саду, и те не так давно были.
А в будущем всё — «скоро». Новый Год уже, считай, прошёл. Там и лето.
Старики могут бесконечно говорить о прошлом и помнят цену на социалистическую водку с точностью до копейки (3,62), но в будущем их интересует лишь одно скорое событие — собственные похороны.
Здесь есть заключение, до которого я не могу дотянуться. Есть прямая связь между изменением видения жизни и естественной смертью. Но понять её можно, лишь вырвавшись из плоскости, а вот с этим как раз проблемы. Может быть, как-нибудь потом. Скоро :-)
P. S. Из всего сказанного — практический совет. Общаясь с людьми, обязательно отмечайте их манеру выбирать между «давно» и «недавно», «скоро» и «нескоро». Это поможет вам не поднимать серьёзных тем с детьми и не говорить о молодых делах с теми, кто в душе — старики.
понедельник, декабря 25, 2006
ДДД: «Колизей» — постер пива Kellers
В зале супермаркета «Колизей» есть малоприметная стойка с краниками, из которых можно набрать разливного пива Kellers. Совсем малоприметная. Выглядит скорее как забытая мебель. Поэтому над ней решили повесить плакат 1х1,3 м. с рекламой пива.
Сюжет ясный: Kellers по-немецки — подвал (собственно, так называется пивоварня во Владивостоке, где это пиво делают). Картинка сделана в Блендере:
Отдельно в Фотошопе наложены надписи, в том числе и надпись мелом на бочонке "Fur Russland mit Liebe", что, по моим представлениям, должно значить «Для России с любовью» на немецком — если же я ошибаюсь, то пусть случайно заглянувший в тот уголок супермаркета немец меня простит. Пиво хотя и родом из Владивостока, оборудование и ингредиенты имеют немецкое происхождение (как утверждает брошюрка), так что немецкий акцент на плакате выглядит допустимо.
На случай, если захочется попробовать это пиво во Владивостоке, перепечатываю из брошюрки точки, где его наливают:
- «Дон Ромарио», Народный, 28.
- «Русский», Посьетская, 23.
- «Узбекистан», Луговая, 52-а.
- «Волшебный колокольчик», Светланская, 48 ("Her tassles are tangled, and what's worse, my jingle won't jangle..." — просто вспомнилось о колокольчиках).
- «Гараж», Алеутская, 45-а.
Ну а в Находке — в «Колизее». Надо взять попробовать.
четверг, декабря 21, 2006
ДДД: «Палеодеревня» — грамота
Быстрая грамота по мотивам постера. Заполняется от руки, печать можно ставить прямо в полымя :-)
Доработка:
Не нравится мне эта аббревиатура «НОМО» там внизу. Я её читаю исключительно по-латински, и она прямо глаза царапает.
вторник, декабря 19, 2006
ДДД: «Находка Ре» — новогодние открытки
Лицевая сторона (общая):
Оборот, первая разновидность:
и вторая:
Обороты различаются лишь телефонами да набором персонажей, поскольку партнёры разных регионов работают с разными специалистами.
Московские открытки заворачиваются в плотную дизайнерскую бумагу, обвязываются бечёвкой и скрепляются сургучом. Открытки, рассылаемые из Находки, обёрнуты в оранжевую креп-бумагу, внутрь которой всыпаны конфетти и дождик.
Открытка 2006 года тоже была двусторонней, но представляла собой новогоднюю игрушку-самоделку вместе с инструкцией по сборке:
ДДД: «Води осторожно» — календарик
Интересно, насколько резало бы глаз расположение руля жителю средней полосы :-) Для опоры при рисовании использовал фото изнутри своей машины.
Рисунок в «детском» стиле (в кавычках, потому что лишь отдельные взрослые уникумы способны нарисовать истинно детский рисунок). Как и всё в последнее время, сделано в обожаемой Xara Xtreme.
Согласованный вариант выглядит так:
Изменения в тексте объясняются следующим диалогом по ICQ:
*** (15:10:57 19/12/2006)
надпись на календарике - Помнишь себя ребенком
Рули осторожно
852138 (15:11:18 19/12/2006)
если "помнишь", то надо вопросительный знак
*** (15:11:48 19/12/2006)
давай поставим и уже решим
надо просто глянуть, как оно будет все вместе смотреться
852138 (15:12:16 19/12/2006)
потом, "рулить" - это именно вертеть рулём
а "водить" - шире: это и скорость, и манера езды
мне кажется, "води" лучше
но, в общем, как скажете
*** (15:15:00 19/12/2006)
попадаются очень интересные люди, и такое слово, как "води", начнет ассоциироваться с... "вводи"
а не хотелось бы
852138 (15:15:18 19/12/2006)
УЖОС
мне в голову не пришло
ага, ок, пусть рулят
*** (15:15:19 19/12/2006)
поэтому слова приходится выбирать
тем более в контексте с детьми
852138 (15:16:37 19/12/2006)
вспомни себя ребёнком... вводи осторожно... ГАГАГАГАГАГА мы тут катаемся
*** (15:17:37 19/12/2006)
ну вот! а тут каждый второй будет издеваться
Популярная механика: Google Earth
Первое, что пришло в голову — проверить достоверность данных. «Прилетел» в Южно-Курильск и взглянул примерно от своего тамошнего дома через бухту на вулкан Менделеева и сопку Лысую — пейзаж, вытатуированный на сердечной мышце каждого ю-курильчанина:
Оказалось достаточно похоже, если сравнить с аналогичными фотографиями:
Потом сделал то, что когда-то не удалось из-за строгости правил у пограничных вертолётчиков — облетел остров по берегу.
Из действительно полезных возможностей — прокладка маршрутов с измерением расстояния и высоты над уровнем моря. Как будет пара свободных часов, отправлюсь в Бийск провесить Чуйский тракт :-)
Второе — привязка маршрутов и мест к GPS-координатам. Правда, GPS-приёмника у меня пока нет, но теперь появился смысл о нём подумать.
Третье — то, на что я бухтел в заметке о веб-альбомах Picasa. Из Google Earth можно сохранить KMZ-файл места, опубликовать его на веб-сервере и дать на него ссылку. Это ещё не настоящая интеграфия с веб-альбомом, конечно, но уже что-то.
В связке с Google SketchUp (скачанной, но ещё не смотренной) можно даже построить на местности трёхмерное здание и отправить его в 3D Warehouse, чтобы весь мир узнал, как выглядит ваш дом, ваш сарай и ваша собачья будка.
Дальше играться некогда, хотя и ужасно хочется. Работа стынет.
пятница, декабря 15, 2006
Популярная механика: Новая Picasa - наконец-то
Осталось дождаться, когда Google осенит, что к видовым фотоальбомам просто напрашивается интеграция с Google Maps.
среда, декабря 13, 2006
Наблюдая жизнь: Пятнадцать афоризмов о правде
1. Большинство тех, кто «хочет правды», хотят её как неведомой экзотики.
2. Нелжецы, наркоманы и педофилы заслуженно ненавидимы обществом как порочные и больные люди.
3. Обличающие ложь не понимают, что исчезни она вдруг — и половина людей немедленно поубивают друг друга, а оставшиеся уйдут в запой и депрессию.
4. Невозможно одновременно быть правдивым и иметь самолюбие. Как ты скажешь правду о себе? Как ты сможешь её услышать?
5. Чистая правда подобна медицинскому спирту: глотается трудно, эффект ужасен. Правда приятна, когда разведена до 40% и охлаждена до нуля.
6. Простодушных людей мало; из тех, что имеются, почти все прикидываются такими из хитрости.
7. (Перефразируя Конфуция) Человек рождается босым и правдивым, а хоронят его чаще всего лжецом в туфлях.
8. Следовать правде — как ходить босиком: поначалу это больно и кроваво, а в итоге — бессмысленно, потому что даже человеку с железными ступнями неприлично ходить по городу босым.
9. Перестань обманывать человека — и он немедленно займётся самообманом.
10. Какая правда возможна в обществе, где свежее дыхание — то же, что приятный запах изо рта?
11. Говорящий правду чаще всего искренне лжёт.
12. Чтобы узнать правду, нужно отказаться от права обвинять. Но чтобы жить с правдой, нужно не обвинять даже в душе.
13. Кто считает, что узнал правду, скорее всего, просто открыл новые горизонты лжи. Сомневаюсь, что в конечном итоге за этими горизонтами есть какая-то правда.
14. Таким образом, правда недостижима в своей бесконечности; как следствие, любая законченная мысль — это
15. Нет смысла спешить узнать правду, потому что мы будем жить вечно.
Наблюдая жизнь: естественный самоотбор
Во времена, когда имел смысл вопрос «Какой русский поисковик лучше?», долго не мог определиться между «Яндексом» и «Апортом». Оба были одинаково хороши (вернее, плохи). Потом «Апорт» сам решил проблему, добавив на свою начальную страницу всплывающую рекламу. С тех пор (годы) там не был. Решил, что люди, ставящие свою главную задачу — поиск — позади минутной выгоды, не смогут и поиск сделать хорошо. Так оно и вышло.
Сегодня прочитал в «Yтре» отвратительно бездарную рекламу Nemiroff под видом новости. Это решило вопрос, какой из двух очень похожих источников новостей — «Известия» или «Yтро» — читать. Если в «Известиях» и держат своих читателей за быдло, то делают это более интеллигентно :-)
понедельник, декабря 11, 2006
ДДД: Календарик «Палеодеревни»
Подумал, что на календарике толком всё равно ничего не покажешь (для этого есть форматы покрупнее), поэтому надо дать мысль. Например, о том, что история — это не прошлое, и всё, что было и будет, существует здесь и сейчас. Что практически является цитатой из Кастан(ь)еды, и осталось только найти эту точную цитату из «Сказок о силе» — где дон Хуан говорит, что знание бесполезно для того, кто к нему не готов:
Do you know that at this very moment you are surrounded by eternity? And do you know you can use that eternity, if you so desire? Do you know that you can extend yourself forever in any direction and use it to take the totality of yourself forever in any direction? Do you know that one moment can be eternity? If you had enough personal power, my words alone would serve as a means to round up the totality of yourself and get to the crucial part of it out of the boundaries in which it is contained.
С одной стороны, забавно задавать на календарике такой вопрос (учитывая, что он в первую очередь предназначен для раздачи школьникам). С другой стороны, у кого ещё такое спрашивать. Не у взрослых же :-)
Оборот:
пятница, декабря 08, 2006
ДДД: Дед Мороз на тройке лихих пароходов — новогодний плакат в процессе
Первые 15 минут работы. Грубая прикидка ракурса. В 4-м классе приятель научил меня рисовать в этом ракурсе рыболовную шхуну. Думаю, его тоже научили :-) а первоначальный рисунок руки безвестного мастера был наколот на чьей-то волосатой рыбацкой груди.
Первые 30 минут работы. Всегда мечтал накладывать блики и тени просто голыми руками, без муторных бленд. Xara в этом прекрасна. Набросал, врезал в родительский контур (там это там это называется ClipView, и гооораздо удобнее кореловского PowerClip) — всего-то три-четыре простых фигуры, а смотрится...
Четыре часа работы. Левое судно практически готово, остальные два — наполовину. Набросал воду, центральный бурун мне не нравится, а левый — нормально, живой. Прикинул контур Д. Мороза. Протянул первую цепь, она плохо сделана в деталях (заметно, что звенья не продеты).
Та же стадия, более крупно первое судно. Множество недостоверностей и упрощений в деталях, но это всё-таки плакат! Вообще определить степень достаточной достоверности — задача настолко важная, насколько и трудная. Это баланс между временем и качеством, не выдержишь его — будет фуфло или срыв.
Шесть с половиной часов работы. Лицо Д. М. плохо, но уже не похоже на плод греха Брежнева с Чингисханом. Пароходы мне явно удаются лучше :-) Возвращаясь к теме деталей — Д. М. выглядел как аппликация первоклашки, пока я не догадался, что перегрузил его (особенно лицо) массой лишних деталей. Провёл безжалостную зачистку, и всё стало гораздо яснее.
Восемь часов работы. На этом решил остановиться. Местами схалтурил, конечно: видно, что правый бурун — зеркальная копия центрального, ну и в деталях много недоработок. Но для своей задачи плакат готов, а с нетрезвых глаз — так и может показаться кому-то прекрасным.
Задача, на которую отводил пару часов — добавление снежинок — заняла 15 минут, потому что вовремя обнаружил, что Xara позволяет создавать совершенно фотошоповские кисти с множеством параметров, а потом этими кистями можно рисовать. Так что все снежинки — не что иное, как несколько волнистых контуров. О вариации размеров снежинок, поворота, распределения по кривой заботится программа благодаря рандомизации совершенно всех параметров кисти.
Из подвохов Xara Xtreme.
1. Максимальный размер рисунка — около 2,7 метров, что вовсе не много. Этот, например, должен печататься крупнее. Поэтому сохранил его в TIFF (размеры TIFF, похоже, не ограничиваются — во всяком случае, 6 на 7-с-чем-то тысяч точек Xara позволила создать).
2. CMYK делает плохо! Нужно сохранять в 24-битный файл и делить в Фотошопе.
3. При увеличении рисунка полезно помнить, что размер размывки объектов имеет пределы, и сильно размытые контуры в эти пределы упрутся, то есть размывка станет резче. Бороться с этим невозможно. Только рисовать мельче и сохранять в TIFF с нужным размером.
вторник, декабря 05, 2006
Популярная механика: Xara Extreme
Новогодняя тема началась с этого рисунка, на который потратил два дня. Из них полтора ушло на прикидки то так, то эдак: рисовать это в Блендере, или набросать в Кореле и свести в Фотошопе, или сделать всё в Кореле? Все три пути какие-то несподручные.
Тут (совпадений в природе не бывает!) мне в руки пришла Xara Extreme. Полчаса осваивался, пару часов рисовал, доучиваясь на ходу. Это, конечно, очень далеко от образцов из их галереи, но для пробного подхода — нормально. Возможности у программы о-о-о-огромные, хотя на первый взгляд она кажется игрушкой, и на второй тоже.
(астрологический круг на переднем плане — фото, конечно).
Седьмой год — семёрка — для сопровождения рисунка сразу вспомнился сюрреалистический космобред Сида Барретта, "Chapter 24" из «Волынщика у врат рассвета»:
It forms when darkness is increased by one.
Change returns success
Going and coming without error.
Action brings good fortune.
Sunset, sunrise.
Это для иностранных адресатов. Что написать на русском — пока ума не приложу.
На днях надо браться за большой новогодний плакат на тему «Дед Мороз верхом на трёх лихих пароходах». Ещё сегодня утром мне казалось, что, кроме Corel DRAW, вариантов нет. Сейчас я что-то уже не так уверен...
P. S. Xara Extreme выпущена как open source под Linux. Поразительная новость в свете установки SuSE на рабочий компьютер, запланированной на затяжные новогодние каникулы.
пятница, декабря 01, 2006
Популярная механика: битва с кэшем
Вот такой странный и вредный прокси где-то у них стоит. Обновления текстов он ловит нормально, а фотографии в нём застревают, как мухи в сиропе. Всевозможные заголовки, запрещающие кэширование, не помогают: они относятся к странице, а на фотки прокси их действие не распространяет.
Пришлось плюнуть и написать:
<?php
if (strlen($_SERVER['QUERY_STRING'])<12){ $jpeg=$_SERVER['QUERY_STRING'].".jpg";
// $ROOT надо сперва определить
$jpegpath=$ROOT."/data/".$jpeg;
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
header("Content-type: image/jpeg\n");
header("Content-transfer-encoding: binary\n");
header("Content-length: " . filesize($jpegpath) . "\n");
$fp = fopen( $jpegpath, "r" );
fpassthru( $fp );
fclose($fp);
}
?>
Этот скрипт, будучи сохранён под именем jpeg.php, берёт строку запроса, приставляет к ней ".jpg", ищет в указанном каталоге файл с получившимся именем и отправляет его клиенту как JPEG, предварительно выставив всяческие запреты на кэширование.
Знаете, сработало.
Единственное, что в реальной жизни вместо смешного ограничения на 12 знаков в строке запроса, надо эту строку более жёстко фильтровать. Потому что выдавать с сервера файлы по произвольному вводу клиента — отвратительная идея. Но речь-то сейчас шла не о хакерах, а о том, как победить непокорный кэш у провайдера.
понедельник, ноября 27, 2006
Наблюдая жизнь: Языковой парадокс
Что характерно, ещё ни один англичанин не упрекнул меня в том, что я говорил с ним по-английски.
пятница, ноября 24, 2006
Протокол идеи: «Находка Ре» — эксперименты над логотипом.
Дань театру отдаётся формально: листовка должна иметь вид театральной программки. С этим ясно. Как быт с защитой?
Пролистал фотобазы по релевантным словам в надежде встретить что-то готовое. Но ни от чего сердце не ёкнуло. Зонтики, пляжные очки, противогазы... презервативы. Банально.
Может, от лого?
Лого абстрактное — апельсиновый круг в чёрной окантовке:
Размещается в обрез, так, что видна всегда лишь половина круга:
Что такое полкруга? А если так или так (благо это не регламентируется, и обрезать можно с любой стороны):
Ммм... первое напоминает чашу, второе — её же вверх дном. В чаше нечто может лежать, а с неё — скатиться. При чём тут защита? Защита даёт — снова банально — надёжность, устойчивость... Вот! Шарик в чашке всегда будет стремиться в устойчивое положение, а шарик на шаре — всегда неустойчив. Это очевидно, и второй пример вообще припоминается как что-то читанное в детстве в популярной литературе (два шара в идеале соприкасаются лишь одним атомом каждый). Идея есть, надо теперь изобразить её в схеме: в Corel DRAW, нарочито схематично:
Честно говоря, исходный логотип в этом трудновато опознать. Надо показать эту связь, а лучше — предложить зрителю самому её построить.
Если покрутить эти схемы в пространстве так и эдак, обнаруживается забавное: при взгляде сверху они будут идентичны: круг в круге. Вот и интрига. Делаем на обложке:
А на развороте — сам материал.
По ходу из этих схем рождается и фраза-девиз: «Перестрахование есть наука о превращении неустойчивых положений в устойчивые». Она пусть пройдёт через всю страницу и выведет на традиционный логотип в обрез, который мы (почему нет?) дополним нашим шариком в устойчивой позиции.
О как.
Теперь послесловие о вреде излишней придумчивости. Дело в том, что для раздачи в театре требовалась просто программка, без изысков, скорее — даже стилизованно-утилитарная. Так что идея была высоко оценена и застолблена для дальнейшего применения, но — не в конкретном случае. То есть, будучи попрошен сделать табуретку, я изготовил рояль. Есть минус: нету табуретки. Но есть и плюс: рояль дороже стоит.
А табуретку я слеплю.
понедельник, ноября 13, 2006
пятница, ноября 10, 2006
Популярная механика: Бычок — смоляной бочок
Оказалось, что чёрный список — лишь часть их системы, призванной активно противодействовать спаму. Как они это делают?
На почтовом сервере устанавливается модифицированный демон TCP/IP. Приняв входящее соединение на порту 25, он проверяет IP-адрес противоположной стороны по чёрному списку спамеров. Если адрес там присутствует, демон устанавливает размеры пакета и окна такими маленькими, что передать данные таким соединением почти невозможно; более того, он никогда не подтверждает получение пакетов, заставляя удалённый сервер повторять отправку снова и снова. В результате противоположная сторона тратит массу ресурсов на совершение бесполезной работы, что, по сути, представляет собой DoS-атаку наоборот.
Свой «нехороший» демон они называют tarpit, то есть «смоляная яма». По-нашему, это как раз Бычок — Смоляной бочок из детской сказки (было такое липкое западло, если помните).
Занимательное решение проблемы спама, но очень сомнительное. Чёрный список — вещь двоякая, и мало какой из почтовых серверов никогда ни в один не попадал. Одно дело — решать проблему недоставки почты, и совсем другое — вызволять свой сервер из смоляной ямы.
Кроме того, такой демон с точки зрения американского DMCA является «незаконным коммуникационным устройством», поскольку «способен... содействовать нарушению... коммуникационного обслуживания без выраженного согласия или выраженного разрешения провайдера коммуникационного обслуживания». Иными словами, берите у спамеров письменное разрешение гнобить их серверы, и американский закон вас благословит :-)
Что же касается отечественного законодательства (не такого изощрённого в этой области), то читаем знаменитую «антихакерскую» статью 273, ч. 1:
1. Создание программ для ЭВМ или внесение изменений в существующие программы, заведомо приводящих к несанкционированному уничтожению, блокированию, модификации либо копированию информации, нарушению работы ЭВМ, системы ЭВМ или их сети, а равно использование либо распространение таких программ или машинных носителей с такими программами -
наказываются лишением свободы на срок до трех лет со штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев.
Так что и у нас смоляной бычок вне закона. А, знаете, даже как-то немного жаль :-)
среда, ноября 08, 2006
ДДД: Helena Elange: дизайн DVD
Заодно узнал, что prêt à porter значит «готовое платье» (буквально «готово для носки») на французском. Haute couture и prêt à porter, похоже, соотносятся как машины на всемирных автошоу и то, что ежедневно ездит по улицам :-)
Дизайн этого DVD дополняет охапку оформительской работы, сделанной для дома Helena Elange (см. каталог, пригласительные билеты).
пятница, ноября 03, 2006
среда, ноября 01, 2006
Популярная механика: AJAX не так ужасен, часть 2.
1. Всё взаимодействие с сервером происходит всего лишь через две функции: Ajax.Request() и Ajax.Update(). Разница между ними в том, что первая отправляет запрос на сервер, а вторая — ещё и ожидает ответных данных и помещает эти данные как innerHTML в элемент страницы, идентификатор которого ей был передан. Таким образом, для динамического вывода данных в страницу нужно: а) создать элемент-контейнер (<div id="'updatable'"></div>); б) вызвать функцию Ajax.Update('updatable', .... ). Метод вызова (get/post), параметры — всё это и многое другое можно передать в аргументах функции, всё это подробно описано в документации.
2. На любой поименованный элемент страницы всегда можно сослаться через функцию-доллар как $('id'). Никакого шаманства с поиском объекта в зависимости от типа браузера.
3. Содержимое элемента всегда можно адресовать функцией доллар-эф: $F('id'). Так, если есть поле формы с идентификатором 'afield', то текст в этом поле можно получить, вызвав $F('afield'); и установить так же.
4. Этого уже достаточно для работы. Но ещё полезно знать, что функция-доллар позволяет легко устанавливать любой атрибут объекта: $('id').display='visible'; более того, установка самых популярных атрибутов для удобства реализована специальными функциями. Так, для переключения видимости объекта не нужно выяснять, видим ли он в данный момент — просто вызовите $('id').toggle;. Полный список этих дополнительный функций — в документации.
5. Ожидайте подводных камней с кодировками. У меня на тестовом сервере получение данных в фоне проходило нормально, а на production сервере они стали приходить в UTF-8. Проблема решилась отправкой заголовка перед началом вывода данных из скрипта:
header('Content-Type: text/html; charset=windows-1251');
А ещё лучше сразу делать весь проект в UTF-8, потому что оправка заголовка решает только половину проблемы (передачу данных в браузер), а есть и вторая половина — передача на сервер методом post, и здесь так просто не отделаешься.
Пока всё, но этот список я ещё буду пополнять.
четверг, октября 26, 2006
Популярная механика: AJAX не так ужасен
Я слышал, что Web 2.0 — это AJAX. Обладание этой главной тайной дало сил двигаться дальше.
AJAX — это в первую очередь Javascript. Я посмотрел скрипты, которыми Google Mail творит свою престидижитацию, и понял, что этого я не осилю никогда. Ну не вышло у меня с Javascript брака по расчёту. Я его не люблю, и это взаимно.
Мне нужно было, чтобы я писал на PHP, а получил AJAX. Я нашёл какие-то полуразработанные библиотеки и понял, что они: а) уж очень полуразработаны; б) в итоге генерируют всё тот же Javascript. И ещё понял, что когда-то уже это проходил. А именно, когда мне предстояло переписать большой сайт с ASP (освоенный благодаря детскому греху по имени VisualBasic) на неведомый мне PHP. В тот раз я пытался найти инструменты, которые это бы сделали за меня. Тогда поиски убедили меня в необходимости изучить-таки PHP, и это оказалось благом. Опыт подсказывал, что не нужно залипушных библиотек, нужно запастись кофе и цитрамоном и понять-таки этот чёртов AJAX.
Google сразу посоветовал обратить внимание на Prototype. Я обратил. Потом обратил ещё раз. Я обращал примерно по часу в день, и заметил, что с утра всё кажется очень просто, а вот под вечер — совершенно безнадёжно. Поэтому на утро 26 котября я запланировал историческое событие — Первое Употребление AJAX.
Сейчас начало двенадцатого. Первое употребление потребовало часа. Только что я нажал в Firefox на ссылку на своей пробной странице и получил несколько строк, означавшие успех: щелчок мышки запустил механизм Ajax.Updater, который на заднем плане обратился к скрипту на PHP, получил данные и вывел их в нужное место. Всего делов-то.
Технически всё действительно просто, но испытал огромные сложности с головой. Ужасно трудно сломать в голове стену в полтора кирпича, по одну сторону которой — неподвижная веб-страница в браузере, по другую — абсолютно подвижный скрипт, порождающий эту страницу на сервере. Всё стало текучим: страница конструирует саму себя, сама обращается к серверу, а скрипт (нет, не так: Скрипт!) разжалован в мальчики на побегушках: поднёс данные, положил, и пшёл вон.
Я мог бы скопировать пример и увидеть его в работе за полминуты. Но нужно было осознать. Разобрать стену.
Теперь скучным языком. Под Web 2.0 главным образом понимается стиль построения документов, когда полностью задействуются возможности Document Object Model. Это значит, что любой элемент в документе может принимать события и создавать их, изменяя себя или другие элементы. Самое смешное, что в этом — ни капли нового. Web 2.0 — это Web 1.0, возможности которого наконец стали использовать.
Это всё равно что проездить на машине год, ни разу не переключившись на третью передачу. Переключись — и машина покажется другой.
Я написал много лирики и мало практических советов. Советов и так в избытке. Присматривающимся к технологии AJAX посоветую начать с библиотеки Prototype, делающей вещи по-настоящему простыми. Там разбираются примеры и даются ссылки на другие примеры. Дерзайте. Возможно, на разбор вашей личной стены вам потребуется не три дня :-)
вторник, октября 24, 2006
Популярная механика: Потеть и списывать всласть
- сам алгоритм, изложенный во всех профессиональных учебниках и используемый ежедневно массой людей; ни на
- буковки, которыми я набрал этот Яваскрипт, равно как и на электроны, ислученные ЭЛТ моего монитора в процессе работы;
я решил, что безвестный коллега по цеху, сделав Ctrl-C/Ctrl-V, не совершил ничего предосудительного. Его попросили реализовать классическую схему подсчётов, «как у вон тех». Перед ним был выбор: написать всё с нуля (чистая совесть и ещё один изобретённый велосипед) или взять готовое (здравый смысл). Он выбрал второе, и я его поддерживаю. Единственное, что о чём я его попросил — вернуть в код мой комментарий с именем и координатами.
Эту либеральность никто не обязан разделять, и для таких людей есть даже готовые решения, скрывающие драгоценный код от любопытных глаз. Это при том, что главная гарантия надёжности замка — недоступность ключа; в случае с Яваскриптом, передающимся всякому и каждому пользователю при работе со страницей, этой гарантии не существует по определению. Посмотрим на примере.
Возьмём онлайновый калькулятор специфических расчётов с некоего (реально существующего) сайта. Пытаемся взглянуть на код... Фиг вам! Там фреймы; при попытке открыть ссылку нужного нам фрейма напрямую мы получаем страницу со словами «Копирование запрещено!». Посмотреть исходник по контекстному меню тоже нельзя: нажатие правой кнопки мыши перехватывается яваскриптом: «Sorry, that function is disabled».
Обходятся эти навороты обидно просто. Откроем блокнот, Файл — Открыть... — и вводим как имя файла известный нам URL Очень Тайной Страницы. Смешно, правда? Весь оберегаемый код попадает в блокнот.
Что внутри?
Несложный и ясный код, но он... нигде не вызывается :-) А при расчётах вызываются таинственные функции xxx(), yyy() и т. п. Где они определены? А не видно!
Ладно, просто сохраним страницу на свой сервер и откроем в браузере. Оба-на! Опять «Копирование запрещено!».
Исследуя исходник ещё раз, находим место, где собака зарыта:
<script language="JavaScript"><!--
function Decode() {
d("4!--4sqhbqd34pghb cmVq=< pusq="0nQJ9QBMSU034t34cfuh" cb6jq="">
Дальше ещё на экран такой белиберды, в которой чистым русским языком читается и строка «Копирование запрещено!». Очевидно, эта функция восстанавливает зашифрованную часто кода, где проверяется текущий адрес страницы (и если он неверен, то «Копирование запрещено!») и определяются функции-призраки xxx() сотоварищи.
Функции Decode и её напарник codeIt восстановят недостающий код только внутри браузера и модифицируют страницу так, что она станет работоспособной. Вот этот момент в исходнике:
<script language="JavaScript"><!--
Decode();document.write(ky);//--></script>
Расшифрованный функцией Decode() код внутри браузера хранится в переменной ky. Вот она, ахиллесова пята. Создаём новую страницу, копируем в неё пару функций Decode()/codeIt() вместе с махинациями над переменной ky, но выводим содержимое этой переменной не в текст документа, а в поле формы <textarea>:
<form name="form1">>
<textarea name="textarea" cols="100" rows="50"></textarea>
</form>
<SCRIPT LANGUAGE="JavaScript"><!--
Decode(); document.form1.textarea.value=ky;</SCRIPT>
Открываем эту страничку в браузере — и что мы видим в текстовом поле? :-)
<!--<CENTER><FONT SIZE=4 FACE="Helvetica"><B><SPAN
style="background-color: #000000"><font color=#FF0000>U</font><font
color=#FF3300>N</font><font color=#FF6600>R</font><font
color=#FF9900>E</font><font color=#FFCC00>G</font><font
color=#FFFF00>I</font><font color=#CCFF00>S</font><font
color=#99FF00>T</font><font color=#66FF00>E</font><font
color=#33FF00>R</font><font color=#00FF00>E</font><font
color=#00FF33>D</font><font color=#00FF66> </font><font
color=#00FF99>E</font><font color=#00FFCC>N</font><font
color=#00FFFF>C</font><font color=#00CCFF>O</font><font
color=#0099FF>D</font><font color=#0066FF>I</font><font
color=#0033FF>N</font><font color=#0000FF>G</font><font
color=#3300FF> </font><font color=#6600FF>B</font><font
color=#9900FF>Y</font><font color=#CC00FF> </font><font
color=#FF00FF>U</font><font color=#FF00CC>S</font><font
color=#FF0099>E</font><font color=#FF0066>R</font></B></SPAN><FONT
SIZE=1><BR><BR>< < this header will be removed once
you are registered > ></FONT></FONT><HR></CENTER>--><SCRIPT>
if(location.href.search('ttp://www.trueurl')<0 || self.parent.frames.length==0) {window.setTimeout('document.write("Копирование запрещено!")',1) ;}
function xxx(n, d) {return MM_findObj(n ,d)}
function zzz() {return Z_N()}
function sss() {return MM_changeSelect()}
function yyy(objName,x,NameS) {return MM_setTextOfSelect(objName,x,NameS)}
function eee(objName,x,NameS) {return MM_setTextOfSelect_s(objName,x,NameS)}
function vvv(objName,x,NameS) {return MM_setTextOfSelect_v(objName,x,NameS)}</SCRIPT>
Большая часть зашифрованного фрагмента содержит красочное сообщение о том, что использовалась незарегистрированная версия шифровальной утилиты :-) А вот и искомые проверки: если текущий URL не содержит подстроки «ttp://www.trueurl» или документ не находится в фрейме, показать кукиш. Ниже — определения функций-призраков, которые просто зеркалят уже давно прочитанные нами функции. Они-то нам и нужны. Выбросив из первоначального текста страницы все Decode()/codeIt() и вставив вместо них эти определения, мы полностью восстанавливаем её функциональность.
Видит бог, это было несложно.
Разработчикам, стремящимся во что бы то ни стало сохранить свои драгоценные буковки, можно только посоветовать осваивать модные нынче технологии Web 2.0, где не обязательно открывать клиенту все функции манипулирования данными, а можно просто прозрачно передавать новые данные в ходе сеанса.
А можно посоветовать другое: смотреть на вещи шире, не заставлять людей делать заново уже сделанную вами работу — тем более что вам от этого ни холодно, ни жарко. «Когда дело сделано, человек должен удалиться», — говорил Конфуций; он, конечно, не был силён в веб-разработке, но разбирался в более фундаментальным вещах :-) И последнее: ценно не то, что вы сделали (это уже стреляный патрон), а ваш потенциал, украсть который никак нельзя :-) Поэтому закончим здесь цитатой, вынесенной в заголовок, но в более развёрнутой форме:
Я их всех позади оставил потеть и списывать всласть.
Редъярд Киплинг, «Мэри Глостер».