
В процессе работы над Pastemark (пост-анонс) мне понадобилось, во-первых, написать довольно сложный букмарклет и, во-вторых, сделать динамическую генерацию букмарклетов с разными параметрами. Не возьмусь претендовать на новизну, а лишь просто поделюсь найденным мною подходом.
Для тех, кто с ними еще не сталкивался с букмарклетами, букмарклет — это разновидность закладки, но от обычной закладки он отличается тем, что вместо адреса страницы в ней записан скрипт, как правило не очень большой.
Спектр применений букмарклетов довольно широк: от простого изменения размера шрифта на текущей странице до анализа ее содержимого и передачи извлеченных данных какому-нибудь третьему сервису. В качестве примера можно привести букмарклет твиттера.
Кроме того, букмарклет — это практически единственный шанс для честного вебмастера выполнить свой код в контексте чужого сайта (-:
Собственно, ответ уже дан в предыдущем параграфе. Фактически, букмарклет занимает промежуточную роль между скриптами на сайте и расширением браузера: его функциональность все еще ограничена по сравнению с полноценным расширением, но он уже не привязан к какому-то одному сайту. Еще одна приятная сторона — один и тот же букмарклет может работать во всех браузерах сразу, включая те, которые не поддерживают расширения как таковые (реверанс в сторону мобильных браузеров).
Основные концепции написания букмарклетов хорошо изложены в статье на javascript.ru. Я же не буду лишний раз повторяться и сразу перейду к своей методике.
Мы все привыкли писать нормальные JS-функции, пользуясь IDE или просто блокнотом, а букмарклеты требуют от нас вытягивать весь код в одну строчку да еще и экранировать, что довольно муторно. Поэтому логично переложить эту работу на программу, а еще лучше — позволить программе самой себя приводить в нужный вид.
И так, прежде всего, нам нужно написать функцию, из которой мы будем делать букмарклет. Здесь нам все близко и знакомо, лишь только вместо привычного синтаксиса
function my_bookmarklet() { /* ... */ }
Мы прибегнем к альтернативному варианту:
var my_bookmarklet = function(arg1, arg2) { /* ... */ }
Это связано с тем, что в букмарклете нам нужна не именованная функция, а анонимная, чтобы не засорять пространство имен и избежать конфликтов.
После того, как мы написали функцию, нам нужно превратить ее в букмарклет. Краткости ради я сразу приведу фрагмент кода, выполняющий эту функцию:
// Ключевой момент: делаем из анонимной функции строку с ее исходниками. var code = my_bookmarklet.toString(); // Вырезаем однострочные и многострочные комментарии. code = code.replace(/\/\/.*/g, ""); code = code.replace(/\/\*[\s\S]*\*\//, ""); // Заменяем переносы строк пробелами code = code.replace(/\n/g, " "); // Вырезаем повторяющиеся пробелы. Если у вас внутри строковых литералов // есть повторяющиеся пробелы, то этого лучше не делать. code = code.replace(/\s+/g, " "); // Генерируем uri, при этом экранируем спецсимволы. var link = encodeURI("javascript:void("+code+"(\""+value_for_arg1+"\", \""+value_for_arg2+"\"))");
Обратите внимание на переменные value_for_arg1 и value_for_arg2. Если вам нужно (как в моем случае) генерировать параметризованные букмарклеты, то вы можете это легко реализовать, передавая параметры вашей анонимной функции.
Далее с переменной link можно делать все, что хотите — генерировать и вставлять на страницу ссылку с этим значением href, отображать просто так или что вам еще в голову придет.
Есть только одни грабли, на которые легко попасться в процессе написания букмарклета таким способом: ни в коем случае нельзя пользоваться какими-либо функциями или переменными, объявленными вне экспортируемой функции, ведь во время исполнения букмарклета (а это почти наверняка произойдет не на вашем сайте и в чужом окружении) все они доступны не будут. Я, кстати, на эти грабли тоже наступил, правда, довольно быстро это обнаружил и исправился.
В качестве итога еще раз перечислю все бонусы, которые мы получаем при разработке букмарклетов таким способом:
Сила мира open source — сообщество. Фокус силы — его ядро, те, кто поддерживают, развивают свой любимый продукт. И помогают другим полюбить его. Я пишу для тех, кто волей судьбы стал таким человеком, добровольно взвалив на себя тяжелый труд тех поддержки.
Мы выбираем технологию, мы ее любим, холим и пытаемся развивать просто потому, что она нам нравится. Но таких, как мы, мало. Большая часть сообщества — простые пользователи, им не важна технология и ее внутренняя красота, а результат. То, что интересно нам, не интересует их. То, что нам очевидно, для них выглядит бессмыслицей.
Какие бы глупые вопросы он не задавал. Я готов поспорить, что любой из нас начал свое знакомство с IT с глупого вопроса. И на этот вопрос был дан понятный ответ. Прошедшие годы ничего не изменили, и новички по-прежнему имеют право на понятный ответ.
Уважай себя. Делай так, чтобы тебя уважали другие. «Боятся — значит уважают» — это не про нас. Да и вообще ни про кого, если уж на то пошло.
...то проблема скорее всего в тебе. Не спорю, очень достает отвечать на одни и те же вопросы, но такова твоя обязанность. Если сил больше нет — возьми тайм-аут, отдохни, пока не будешь готов снова и снова давать ссылки на фак. Возможно, этот тайм-аут окажется длинной на всю оставшуюся жизнь, но в этом нет ничего страшного, надо уметь вовремя уйти. Свои нервы дороже.
Дублирую сюда мой пост на Хабре:
GRUB, безусловно, является самым продвинутым загрузчиком на сегодняшний день, и за это любим админами и разработчиками по всему миру. Его функционал настолько широк, что он практически монополизировал рынок загрузчиков в мире *NIX, а некоторые вообще говорили, что GRUB2 — это скорее маленькая операционная система, чем просто загрузчик. Эдакий швейцарский нож в мире загрузчиков.
Но в этот раз я хочу обратить внимание на то, что с помощью швейцарского ножа можно не только открывать консервы, но и вырезать неприличные слова на парте.
Ситуация, когда в BIOS заблокирована загрузка со внешних носителей, — отнюдь не редкость. Делается ли это из соображений безопасности или иных причин не так уж и важно. Важно то, что GRUB может помощь нам преодолеть этот барьер. Ниже описана последовательность действий, которая позволит нам загрузиться с флешки.
Shift
).c
и входим в интерактивный режим.root (hd1)
для GRUB Legacy или set root=(hd1)
для GRUB2chainloader +1
boot
Если вы все сделали правильно, то в результате вы успешно загрузитесь со своей флешки, несмотря на запрет в биосе. Опытным путем мне удалось выяснить, что метод не работает если ваша материнка не умеет грузиться с usb или не опрашивает устройства при каждой загрузке (как, например, на моем eee PC при включенном Boot Booster).
Лирическое отступление: этот метод мне удалось опробовать в одном из терминальных классов нашего университета, где на компах стояли в дуалбуте винда с линуксом. Прелесть того случая в том, что факультетский сервер экспортировал /home по NFS и та терминалка была занесена в разрешенные подсети. В результате, мне удалось прочитать домашние каталоги пользователей того сервера и уйти так никем и незамеченным.
Опять-таки, ситуация, когда пароль рута не сообщают конечным пользователям компьютера, ни у кого удивления не вызывает. Однако все тот же GRUB поможет нам это досадное ограничение обойти. В отличие от предыдущего способа, удобного для доступа в духе «незаметно пришел, скопировал и ушел, не наследив», этот способ удобнее для внесения нужных нам изменений в установленную систему. Кроме того, для этого нам уже не нужны никакие флешки.
e
мы сразу попадаем в режим редактирования, а в GRUB Legacy нужно нажать e
первый раз, выбрать строку для редактирования и еще раз нажать e
.quiet
и splash
, если они есть, и дописываем в конец single init=/bin/bash
Ctrl+X
, а если GRUB Legacy — Esc
и потом b
В результате мы загрузимся в рутовую консоль безо всяких паролей и ненужных вопросов.
И GRUB2, и GRUB Legacy предоставляют возможность ограничить доступ к интерактивному режиму и редактированию с помощью директивы password
. Подробности описаны в руководстве по GRUB2 и GRUB Legacy. В обоих случаях манипуляции весьма просты и не требуют много времени.
В общем, да, ничего нового я не сказал — все это можно нагуглить, например так. Однако, проблема от этого меньше не становится, наоборот. Более того, если с января в школа действительно поставят linux, то желающих считерить или просто «похакать терминалку» станет на порядок-другой больше. И не стоит недооценивать школьников — найдутся и те, кто умеют гуглить. Если же принять во внимание лирическое отступление, которое я сделал в первой части, то тут еще и поле для утечки данных. Думаю, каждый сможет придумать еще пару способов применения.
В этом посте я процитирую свой ответ на одно из заданий в олимпиаде по веб-технологиям, о которой я писал в прошлом посте. Задание формулировалось примерно так: придумать концепт файлохранилища, полезного для пользователя и владельца, описать возможные схемы монетизации.
Вот что мне удалось сочинить за час, который я потратил на это задание:
Для удобства я сразу оговорю значение терминов, которыми буду пользоваться ниже.
Учитывая последние тенденции (которые некоторыми называются web 3.0) для создания успешного файлового хранилища стоит следовать трем важным условиям:
Из этих посылок можно прийти к таким выводам относительно свойств файлового хранилища:
Контекстная.
Реклама, отображающаяся посетителю во время его нахождения на сайте. Обязательно - тематический таргеттинг согласно интересам пользователя. В частности, прямая реклама от рекламодателей или ссылки на похожие/потенциально интересные пользователю платные публичные файлы, размещенные в хранилище.
Медиа-реклама.
Реклама, интегрируемая непосредственно в содержимое файла. Возможные варианты:
При этом хранится и не модифицированная версия файла, чтобы иметь возможность корректно заменять рекламу и предоставлять файл пользователю в исходном виде.
Пользователь (владелец файлов):
Посетитель:
Что же можно сказать в заключении? С одной стороны, мне кажется, такой сервис не остался бы невостребованным. Он действительно будет удобен и полезен и для пользователя, и для посетителя.
В то же время, создание такого сервиса и раскрутка потребуют просто гигантских усилий и инвестиций, что под силу лишь команде хороших спецов, при чем самых разных направлений - и администрирование, и системное/сетевое программирование, и веб-программирование, и дизайн, и маркетинг в конце концов. И не факт, что я бы вообще рискнул ввязаться в такой проект, даже если бы меня сейчас не ограничивал универ.
PS. Среди моих читателей обнаружен хороший человек по имени Павел, который в своем блоге популярно пишет обзоры про разные компьютерные технологии и личности, к ним причастные. Кто не подпишется - сам себе злобный Буратино.
Публикую перевод статьи API Battle Plans: Fighting for Next, давным-давно сделанный мною в рамках акции 50 лучших SEO-постов 2009 года и благополуно забытый в пылу учебы и работы :) Только чейчас наткнулся на него в Гуглодоках, когда искал кое-какие материалы по одной интересующей меня теме. Тем не менее, лучше уж поздно, чем никогда, посему публикую.
В наши дни API достигли такого уровня зрелости, что все три ключевые компоненты Веба - контент, службы и данные можно легко получить с их помощью. Результатом этого процесса стало ничто иное как рождение новго Веба. Более умного Веба, предоставляющего более релевантную информацию, более удобного и дающего более широкие возможности получения прибыли. После того, как стали очевидны преимущества этого подхода, у современных компаний не осталось иного выбора, кроме как поддерживать суперструктуру API, столпами которой являются контент, сервисы, разработка и аналитика.
Последние комментарии
/Манул/ 6 дней 15 часов назад
/Alek$/ 1 неделя 23 часа назад
/Манул/ 1 неделя 1 день назад
/Манул/ 1 неделя 1 день назад
/Alek$/ 2 недели 5 дней назад
/wlad2/ 2 недели 6 дней назад
/Александр/ 5 недель 2 дня назад
/Александр/ 5 недель 2 дня назад
/Alek$/ 5 недель 5 дней назад
/dasha/ 5 недель 6 дней назад