30 декабря 2007

Ещё про cut в blogger

Поскольку что-то там к нам мчится, решил сделать подарок всем пользователям блоггера и рассказать, как я реализовал сворачивание постов.
Зачем? Чтобы сворачивать очень длинные посты вроде моих статей из OpenSource
Почему не стандартное решение, которое предлагает google? Потому что это скучно, требует перезагрузки страницы, обрезает пост в rss, что есть позор для автора. К тому же у меня чесались руки попробовать jQuery.

Итак:

Пока что вариант работает только для расширенных шаблонов.

1. Для начала читаем тут, добавляем в шаблон внутрь тэга head такой код:
<script src='http://leonid.phoenix.googlepages.com/script4blogger.js' type='text/javascript'/>
<script src='http://jqueryjs.googlecode.com/files/jquery-1.2.1.pack.js' type='text/javascript'/>
<style>
<b:if cond='data:blog.pageType != "item"'>
.cut {display:none;}
<b:else/>
.cut {display: block;}
</b:if>
</style>
Ссылки на изображения прописаны в скрипте, подключаемом первой строчкой. Их можно изменить и выложить скрипт на те же google pages или любой другой хостинг.

2. Потом ищем строку <data:post.body/> и заменяем на
<b:if cond='data:blog.pageType != "item"'>
<div class='pxpostwrap' expr:id='data:post.id'>
<data:post.body/>
</div>
<b:else/>
<data:post.body/>
</b:if>

3. При написани поста сворачиваемый текст помещаем в такой тэг
<div class="cut" id="cut">
</div>

4. Если хотите отблагодарить - нарисуйте мне кнопку для скрытия - показа поста.
Happy blogging!

Про Python и работу с не unicode файловыми системами

Для хранения текстовой информации используется unicode, это аксиома.
Однако, бывают ситуации, когда это невозможно. Простейший пример - ФС вроде vfat, которые не только не поддерживают юникод, но и имеют определённые ограничения на имена файлов (подробнее - тут). Несмотря на это она повсеместно используется во всевозможных девайсах от USB Mass Storage или, проще говоря, флэшек и заканчивая кпк и фотоаппаратами.
Обходится это достаточно просто, вот кусок кода на питоне:

enc = os.environ['LANG'].split(".")[1]
str = re.sub('[|?*<>:+\[\]\"\\\]*','',str.encode(enc,"ignore"))
Я это использовал для приведения имён файлов к своей локали для дальнейшего копирования на смонтированную флэшку.
Happy coding!

28 декабря 2007

powered by Русский Язык

Возникла у меня тут идея одна пропагандистского толка.
Про свиристелки я уже говорил, но так ведь не все думают, и вешают всякие бестолковые кнопочки. А мне вот захотелось толковую сделать - с надписью, как в сабже. И чтоб вела на какой-нибудь орфографический словарь на озоне. И по всем правильным блоггерам распространить. Только вот не художник я.
Конечно, это всё равно что с бурной рекой воевать и лучше бы было вернуть розги в школы (с улыбкой вспомнил свою очень строгую но справедливую учительницу русского), но меня бы такая свиристелочка грела.

26 декабря 2007

Заработался

> uptime
00:33:53 up 21 days, 7:55
Что-то я заработался...

Ruby, QtRuby, Qt4 и Windows

Однажды мне нужно было быстро написать гуёвое приложение под win32, при этом производительность не была важна.
Что я делал в таких случаях под Linux? GUI писался (вернее, просто накидывались формы) на Qt, функционал на руби, всё это замечательно работало благодаря связке QtRuby. Использовать же "родные" для Windows решения вроде с момента изучения ненавистного MFC или почившей Delphi не хотелось, да и лицензионная сторона вопроса всё-таки существует. Решение сделать всё с привычними инструментами казалось вполне логичным.
И тут оказалось, что подобных биндингов под win32 нет. То есть руби есть, Qt есть а привязок нет.
Непорядок, подумал я. Язык портируемый, даже под свой PocketPC я нашёл сборку. Библиотека тоже работает на всём, включая телефоны, а под Windows, столь гордящейся своей распространённостью, пути застаивить это работать вместе нет.
Гугль в помощь, сказал я себе, и нашёл вот тут неофициальную сборку библиотеки с нужными привязками. Всё работает отлично, не хуже, чем в Linux.
Кстати, о той страничке. Нормальный английский текст внизу страницы :)

Rails 101

А цитаты к презентации, подобраны со вкусом.


“I always thought Smalltalk would beat Java. I just
didn’t know it would be called ‘Ruby’ when it did”


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

Bells and whistles

То, чего никогда не будет в этом блоге - это bells and whistles (свиристелки и пр.)
Об этом как всегда смачно рассказано здесь и здесь.
По поводу первого. Я пользуюсь онлайн-букмарками. Одними, а не всеми тридцатью, которые обычно натыкивают под постом. Поэтому я на панель своего браузера вытащил ровно один букмарклет - "добавить в этакую службу закладок". Если тот сервис, которым вы пользуетесь, не потрудился создать для вас даже букмарклет, зачем же вы им пользуетесь? Вопрос закрыт.
Второе. Необходимости компенсировать отсутствие величин в других местах я не испытываю. Единственный счётчик, который признаю - от фидбёрнера.
Третье. Блог технофильский, картинок не будет. Будет код, будут конфиги - будет и syntax highlightning.
KISS!

Ruby 1.9

Он не только goes faster, он уже здесь! А я-то чуть было не проспал...
Так что вдогонку предыдущему посту сия новость как нельзя кстати.

Про реализации Ruby

Из статьи со сравнением реализаций языка Ruby напрашивается несколько далеко идущих выводов.
Заметна тенденция ускорения Ruby. Ruby goes faster. Это устраняет один из основных недостатков Ruby как языка и RoR как платформы. Вкупе со скоростью разработки приложений это привлечёт людей, особенно новых в данной области. It makes Ruby production ready.
Появляются реальные альтернативы. Чего стоит один JRuby, не только не уступающий нынешнему RMI, но и приносящий с собой всю Java инфраструктуру. It makes Ruby enterprise ready.
И хотя всё это пока лишь тенденции, их определенно стоит иметь в виду.

25 декабря 2007

Увы, Microsoft традиционно пребывает в состоянии творческого безумия, и правая рука у него не знает, что делает левая...
— from

Какие-то ассоциации сплошь пошлые возникают...

24 декабря 2007

Ещё о text editors over IDEs

Опрос подтверждает утверждение, что разработчики на Rails/Ruby предпочитают текстовый редактор средам разработки. Конечно, нужно помнить, что некоторые редакторы сами по себе почти среды разработки (вспомним, как можно обвешать Vim/Emacs).
Интересный момент - лидер забега. Это уже, похоже, традиция не хуже LAMP - Rails on Mac with TextMate.

Про OPML

Вместо того, чтобы перегружать блог всевозможными ссылками, сделал проще (yeah, KISS!) - выложил OPML с некоторыми своими фидами. Из них можно сделать определённые выводы о круге моих профессиональных интересов и заодно узнать, кого я читаю. Просто импортируйте его в свой RSS агрегатор.

22 декабря 2007

text editors over IDEs

Отличная статья, привлёкшая меня, помимо прочего, строчкой "One of the secrets of the Ruby community is why many developers prefer text editors over IDEs".
Это ещё одна вещь, за которую я люблю руби - он не требует использовать что-то кроме моего любимого Vim. И действительно, посмотришь какой-нибудь скринкаст, посвящённый разработке на руби - показаны в лучшем случае три программы: браузер, текстовый редактор и терминал.

20 декабря 2007

Про Python

Недавно ковырял одну программу, написанную на питоне, для добавления туда необходимого мне , но не предусмотренного автором функционала. Оставив в стороне свою неприязнь к питону как к языку, как истинный гик залез в код и дописал (отослав разработчику патч, конечно же, ave Open Source). И подумал - а не пересмотреть ли мне своё отношение к питону? Благо и преимуществ у него хватает, и кроссплатформенность связок питона с GTK, QT и wxWidgets всегда на руку, да и допиливание той самой программы не сильно меня напрягло. И совсем уж было решил взяться за изучение (ну или хотя бы запланировать таковое на будущее), да наткнулся на статью. И как-то пыл остыл, сомнения вернулись.
Видна какая-то неряшливость в реализации вроде бы очевидных операций в языке, отсутствие какого-то строгого единого дизайна.
Подожду, пожалуй, питона 3.0. Может быть, и возьмусь.

Про Win XP SP3

Win XP SP3
Да, а ещё заявляли о прекращении поддержки XP. А не тут-то было, опрометчиво заявили. Потому что никто всерьёз использовать новогодний выкидыш корпорации не стал. Хороводы вокруг поводили, повздыхали, повсплёскивали руками - и оставили в стороне.
Думается мне, что прекращение поддержки XP будет одним из шагов с самыми тяжёлыми последствиями.

19 декабря 2007

Убунту - Эффект бабочки

На одном из модерируемых мною форумов в очередной раз мне задали вопрос: что ставить? Какой дистрибутив посоветовать владельцу ноутбука, если он уже имел неудачный опыт установки другого? Мой ответ был из одного слова: ubuntu.

Почему так? Ведь автор этих строк не является ни ярым сторонником, ни даже постоянным пользователем данного дистрибутива, используя для работы Gentoo Linux. В данной статье я попытаюсь упорядочить мысли по этому поводу.

Аргумент 1. Сообщество.
За довольно короткий срок вокруг Ubuntu сформировалось впечатляющее по размерам сообщество. И процесс продолжается и будет продолжаться, в сообщество будут приходить пользователи других дистрибутивов и новички. Достигнутая масса критическая и будет притягивать пользователей. Посмотрите на небезызвестный сервис ICQ и вы поймёте, о чём я говорю.
Что это даёт. Мощную самоподдержку пользователей и отдачу разработчикам. В блогах рунета на разные голоса произносится фраза: "Решение моего вопроса нашлось на форумах Ubuntu, хотя это слово и не стояло в поисковом запросе."

Аргумент 2. Основа.
"Я стоял на плечах гигантов",-пишет в своей книге Just 4 Fun автор ядра Linux Линус Торвальдс. Марк Шатллворт поступил аналогично и "забрался на плечи" Debian. И это обеспечило сразу два преимущества, качественное и количественное.
Формат пакетов dpkg и система управления ими являются, на мой взгляд, самыми технологически совершенными среди бинарных, уступая по гибкости лишь всевозможным портируемым. В то же время бинарность пакетов обеспечивает простоту работы с ними - ведь распаковать проще и быстрее, чем собирать из исходных текстов, пусть и автоматизированно.
Второе преимущество - совместимость с Debian. Вы когда-нибудь пробовали установить rpm пакет в Mandriva из некогда родительского Red Hat'а? Зачастую пустая трата времени. Пользователям Ubuntu доступен весь огромный (один из самых крупных) репозитарий пакетов Debian а также его неофициальные репозитарии.

Аргумент 3. Простота.
Давно не секрет, что установить Linux, используя современные графические программы установки, зачастую проще и удобнее, чем что либо. В Ubuntu эта тенденция возведена в абсолют. Перед глазами множество примеров того, как люди вдруг ставят и начинают пользоваться, махнув рукой на многолетнюю привычку к Windows. Одного такого человека я вижу каждый день. Он задаёт вопросы, пробует и ошибается - но не отказывается, как отказался от Windows и нескольких других дистрибутивов Linux.

Аргумент 4. Толерантность.
Устойчивым определением в рядах пользователей Linux стало слово "красноглазик". С остервенением фанатиков готовы они проповедовать идеалы OSS и калёным железом клеймить несогласных. Существует несколько дистрибутивов, все компоненты которых лицензированы только под GPL. Удобство использования таких дистрибутивов в условиях современных реалий вызывает сомнения.
Вместо этого Ubuntu даёт возможность пользоваться закрытым и платным ПО. Пользователи дистрибутива не страдают от отсутствия драйверов для их устройств и кодеков для их медиаконтента. А удобство установки всего необходимого (во многом проистекающее из второго пункта) заставляет бывалых линуксоидов широко улыбаться.

Кажется, недаром для названия такого дистрибутива выбрано "древнее африканское слово, означающее "гуманизм"". И уж если не пользоваться, то рекомендовать я буду именно его.

17 декабря 2007

Про Блог.ру

Проект красивый. Но ещё слишком молодой и потому корявый донельзя.
Откуда такой негатив. Ну хотя бы от импорта. Импорт хромает на обе сломанные ноги. Или извещения - то же самое. Вчера свалилось на мыло извещение, полез читать - оказывается ещё про пару комментов меня никто не уведомил. Спам в комментариях.
Чтобы сказать хоть что-то хорошее - потенциал есть. А так... "It smells like rock'n'roll"

05 ноября 2007

Про аддоны

Фраза со страницы аддонов браузера Флок как нельзя лучше показывает вообще всю ситуацию с аддонами у основанных на мозилле браузеров.
You should also keep in mind that some extensions affect the performance of Firefox and Flock. We cannot guarantee speedy Flock performance if you have extensions installed, so we suggest choosing your extensions wisely.
В общем, полный швах.

03 ноября 2007

Про тэги

Вот однажды я жаловался на то, что треки не подписывают. Сегодня на том самом материале проверил - Easy Tag нашла, подписала и переименовала файлы за 4 клика мышью. Я в полном восторге. Да и вообще, раньше я эту программу сильно недооценивал, считая её интуитивно непонятной. Недавно мнение поменялось, когда я довольно быстро причесал всю имеющуюся на винтах музыку.

[I] media-sound/easytag
Available versions: 2.0 (~)2.1.2 (~)2.1.3 {aac flac mp3 speex vorbis wavpack}
Homepage: http://easytag.sourceforge.net
Description: GTK+ utility for editing MP2, MP3, MP4, FLAC, Ogg and other media tags

Про грамотность

Неизменно раздражает безграмотность в сети. Открываешь умную с виду статью - и тут же закрываешь, потому что "не столько пахнет, сколько глаза режет".
И это говорит не только об образованности людей, но и об их душевной лени. Показателен хабр - сборище безграмотных ИТ специалистов, не "асиливших" или поленившихся даже не настроить, а воспользоваться встроенным в браузер спеллчекером. Про семантические и прочие ошибки я уже не говорю. У нас уже давно говорят не на русском, а на смеси французского с нижегородским.
Тем приятнее читать блоги вроде Прочитано.ру Блог этой девушки читаешь как солидный журнал с младшим и старшим редактором в штате. А ведь постинг у ней, как я понимаю, сопутствует прочтению новостей.

Про коврик для мышки

Навеяно.
Мне самым бесполезным околокомпьютерным предметом видится коврик для мыши. Я не знаю, зачем он нужен.

  1. Мышки сейчас как минимум оптические, так что качества поверхности им не важны (такие как отражающая способность, ровность, чистота), там нет механики и нечему ломаться.
  2. Ещё один предмет в настольном бардаке, который ещё и имеет тенденцию по нему перемещаться.
  3. Сознательное ограничение рабочего пространства. Представьте себе, что у вас монитор вместе со своим разрешением вырос ну раза в 3 хотя бы. Так пусть и пространство растёт. Нет, вы будете точнее целиться. Ужасно.
  4. А рисуют на них что? Всяких дурацких зверушек и голых тёлок. Проще тогда по эротическому журналу мышкой елозить.
  5. Иногда попадаются единственные имеющие смысл коврики, с так называемой сиськой (силиконовая подставка под запястье). Да, запястье от твёрдых поверхностей устаёт. Но не приковывать же его к этой сиське! Пусть оно свободно перемещается вместе с рукой по всей правой (левой) половине стола. В виде теннисного напульсника, длинного рукава, перчатки без пальцев...

В общем, я свой коврик давно уже потерял.

01 ноября 2007

FFox + Linux = :(

Давно подозревал, что ффокс под линуксом откровенно выделывается. Результат The Acid2 Test

Про OpenID

Сегодня пытался пощупать в деле ещё одно веяние. А именно OpenID. Ну а поводом для этого была регистрация в тэйсти (про который читать лучше в Интернетных Штучках). Итак.
OpenID, предоставляемый ЖЖ, работать отказался. Да, показывается формочка с подтверждением запроса, после оного возврат обратно в тэйсти... и всё. Ни та ни другая сторона не сообщают об ошибке.
Полез в вики, почитал, попробовал сервис MyOpenID. Вот если подобный сервис и делать, то только так. Отлично, приятно. Да, это пеар.
Потом появилась мысль - вроде технология должна сокращать количество регистраций, на деле я ещё раз зарегистрировался. Ну ладно, ЖЖ в лужу сел, может у них там неполадки какие (хотя OpenID был придуман одним из основателей ЖЖ), но ведь нас не только ЖЖ посчитал. Иных уж нет, а те все в Гугле. А раз уж Гугль использует сквозную авторизацию на своих сервисах, почему бы ему и внешнюю авторизацию не сделать? Ну хоть бы ещё одним сервисом, в виде приложения к гугль аккаунту... ан нет. Вот что пророчат в блогах. Мне кажется, что вариант первый устроит всех. Гуглю от этого - много пеара (ну клёво же, вместо логинов везде ссылки на Гугль) и респекта от пользователей, мало головной боли (формат-то открыт), чётко подчиняющийся общей схеме сервис. Второй вариант устроит разве что сам Гугль. Ну и часть особо фанатичных юзеров. Третий вариант никого не устроит.
Вот тут ещё seobaby пишет про OpenID vs. другие ID Интересен последний абзац:
Хотя система и разрознена, OpenID все же не снимает с повестки дня вопрос о приватности пользователей – не все хотят, чтобы все их аккаунты «были собраны» в одном месте. Да и вообще, полностью ли децентрализована система? Все-таки рано или поздно наметится один явно лидирующий провайдер. А какое-либо нарушение равновесия может поставить нейтральность системы под вопрос..
А по сути ничего не напоминает? Система децентрализована, да. Как электронная почта. И если сейчас не начнётся активная возня на этом поле, то таки да, наметятся гиганты, первыми увидевшие всю интересность и вкусность технологии. Но к каким-то катаклизмам это не приведёт, как это было и с почтой. Ибо поднять корпоративный OpenID провайдер имхо проще, чем корпоративный почтовик ;)

Портеж умер. Да здравствует портеж!

Сегодня пришёл к ситуации, когда после
emerge -uDN
emerge --depclean
выдал потрясающее:
Packages installed: 936
Packages in world: 118
Packages in system: 55
Unique package names: 936
Required packages: 672
Number removed: 264

То есть 264 пакета (больше четверти) либо лишние в системе, либо должны быть обновлены, но почему-то не обновились. Среди них очень важные, типа k3b, proftpd, privoxy... В общем, тулз первой необходимости среди них набралось на 3 строки в терминале, и на 40 М даунлоада. Я, конечно, силён в чёрной магии генту, и списочек отмерженных пакетов у меня под рукой, чтобы ничего не забыть. Но что-то мне говорит, что такой ситуации возникнуть не должно было.
Обновлятся, может, чаще?..

28 октября 2007

Про rm

Ситуация. Я, не вполне проснувшийся после обеда, сажусь к компу. Происходит такой диалог:
[15:04:04] <Andron> помощь нужна,
[15:04:56] <Andron> есть каталог в нём накопилось дофига файлов, около 11тыс., нужно их грохнуть
[15:05:11] <Andron> ...но:
[15:06:03] <Andron> делаю: rm -f ./*
а он мне: bash: /bin/rm: Argument list too long
и нифига не удаляет :(
[15:06:04] <leonid.phoenix> рм ругается, что аргументов много?
[15:06:14] <leonid.phoenix> а, ну вот.
[15:06:36] <leonid.phoenix> да всяко можно сделать
[15:06:59] <leonid.phoenix> rm `ls | head -n 1000`
[15:07:18] <leonid.phoenix> и так 11 раз
[15:11:59] <Andron> спасибо!!!
[15:12:02] <Andron> помогло!!!
Интересно тут несколько моментов. На такие вещи я напарывался хоть и очень редко, но бывало, и каждый раз изобретал какой-нибудь новый велосипед. Тут же спросонья выдал один из самых коротких и простых. Ну цикл ещё можно было бы прикрутить, например, так:

while (rm `/bin/ls| head -n 1000`);do done;

О природе мэшапов.

Столкнулся с таким понятием как мэшап (примеров им - легион, довольно часто освещаются Интернетными Штучками). И чем больше вникал в суть явления, тем более знакомым оно мне казалось. Наконец я понял, что же именно так знакомо в этом.
Мэшапы - типичный пример Unix-way, перенесённый в несколько другую сферу. Берём контент с одного сервиса. пропускаем через несколько пайпов - voila, перед нами новый сервис, обладающий синергией. Существенное отличие от привычного Unix-way в том, что контент далеко не всегда plain text.

26 октября 2007

Torrent как основной протокол передачи контента.

По мотивам поста.
Мне вообще кажется, что для распространения практически любого контента торренты гораздо удобнее стандартных http и ftp и имеют много преимуществ помимо описанного в посте.
Несколько примеров.
Если бы убунту не распространялась ещё и через торрент, я думаю, все её сервера не выдержали бы такого DDoS'а со стороны её же добрых пользователей.
Майкрософт разрабатывает свой протокол передачи данных (сильно похожий на торренты, но всё же свой).
Появляются торрент-комбайны, например, ориентированный на мультимедиа контент Vuze , брат одного из популярных торрент-клиентов Azureus. Имхо, эта область - мультимедиа вещание в сети - первый кандидат на освоение торрентов.

10 октября 2007

Кпк + Bluetooth + Linux box

В наше время всё больше ценится мобильность. Соответственно, всё большее распространение получают всевозможные мобильные устройства вроде смартфонов, наладонников и коммуникаторов. И одним из важных достоинств этих устройств является возможность выхода в сеть из любой точки делового маршрута. И смартфоны и коммуникаторы решают этот вопрос с помощью GPRS, простые наладонники без GSM модуля могут использовать сотовый телефон. Но иногда бывает целесообразнее использовать существующее высокоскоростное стационарное подключение одного из рабочих мест. Да и доступ к внутренней сети дома или офиса иногда бывает необходим. И в связывании рабочей станции и наладонника без проводов нам поможет Bluetooth.

Итак, вводные данные. Bluetooth адаптер, КПК под одной из разновидностей Windows mobile и стационарная рабочая станция с Linux на борту. В моём случае это USB Bluetooth брелок, HP iPAQ под управлением Win Mobile 2003 и Gentoo 2006.1.

Понадобятся пакеты bluez-libs, bluez-utils, iptables, ppp. Устанавливаем. Если ядро собрано самостоятельно - включаем в нём Networking -- Bluetooth subsystem support и всё нижележащее, также не забываем включить iptables и поддержку цели MASQUERADE в нём (Networking -- Networking options--Network packet filtering (replaces ipchains) -- IP: Netfilter Configuration -- MASQUERADE target support). Записываем в /etc/bluetooth/pin какое-нибудь число (будет применяться для подтверждения соединения, нам не важно). Редактируем /etc/bluetooth/rfcomm.conf, дабы он принял примерно такой вид:

rfcomm0
{
# автоматически биндить устройство при запуске
bind yes;
# MAC должен быть закомментирован
#
# device 11:22:33:44:55:66;
#
# RFCOMM канал для соединения
channel 2;
#Метка
comment "Bluetooth Access Point";
}


Если у вас запущены какие-то Bluetooth-сервисы, то правильно выберите канал, он должен быть уникальным. Для удобства можно зайти в /etc/bluetooth/hcid.conf и изменить name на что-то более понятное, например так:

name "BlueZ Access Point at %h";

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

Теперь /etc/ppp/options. У меня он был почти пуст. Добавляем (или меняем соотв. значения):

noauth
ms-dns 216.148.227.62
ms-dns 204.127.202.2

где IP - IP вашего DNS сервера (можно скопировать из /etc/resolv.conf)

На этом единовременные подготовления Большого Брата закончены. Теперь действия, которые должны быть выполнены при загрузке системы. Я оформил это в виде rc скрипта для своей системы, если же у вас sys V init (стиль скриптов загрузки, используемый в большинстве образованных от Redhat дистрибувов), замените его на аналогичный sh скрипт, убрав из него функцию depend и вызовы ebegin и eend.

#!/sbin/runscript

depend() {
use net
use iptables
after sshd
after bluetooth
after logger }

start() {
#modprobe rfcomm
#modprobe hci_usb
ebegin "Starting btlan"
[ -a /dev/rfcomm0 ]|| mknod /dev/rfcomm0 c 216 0
[ -a /dev/rfcomm1 ]|| mknod /dev/rfcomm1 c 216 1
[ -a /dev/rfcomm2 ]|| mknod /dev/rfcomm2 c 216 2
[ -a /dev/rfcomm3 ]|| mknod /dev/rfcomm3 c 216 3

hciconfig hci0 up
hcid
sdptool add SP
sdpd
rfcomm bind all
dund --listen --msdun --channel 2 10.20.4.89:10.0.0.111
echo '1' &gt; /proc/sys/net/ipv4/ip_forward
# use a different ppp0 name if your server's incoming
#internet connection is coming from a different device
#(e.g. might be sit0 or ppp1, depending how your Linux is connected to the outside world).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -i ppp1 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
eend 0
}

stop() {
ebegin "Stopping btlan"
killall dund
rfcomm release all
killall sdpd
sdptool del SP
killall hcid
hciconfig hci0 down
[ -a /dev/rfcomm0 ]&& rm -f /dev/rfcomm0
[ -a /dev/rfcomm1 ]&& rm -f /dev/rfcomm1
[ -a /dev/rfcomm2 ]&& rm -f /dev/rfcomm2
[ -a /dev/rfcomm3 ]&& rm -f /dev/rfcomm3

eend 0 }

Несколько комментариев. У меня всё, касающееся Bluetooth было вкомпилировано в ядро, поэтому запуск modprobe для загрузки нужных модулей мне был не нужен. Возможно, вам потребуется загрузить и другие модули. В вызове dund первый IP - мой внутренний IP сети провайдера, получаемый по DHCP. Второй - будущий IP КПК. В первом вызове iptables интерфейс ppp0 заменяется на тот, с которого ваш Linux box получает интернет. Во втором вызове - ppp1 заменяется на первый незанятый ppp интерфейс.

Обратите внимание на функцию depend. Её запись означает, что данный скрипт требует работающей сети, iptables, sshd (как одно из возможных применений - в качестве пульта дистанционного управления ББ, вам, возможно, не понадобится) и после запуска служб bluetooth и журналирования. Исходя из этого, определите место для данного скрипта в вашей системе инициализации. Теперь при загрузки система будет предоставлять Bluetooth соединение. Если же вы носите Bluetooth брелок с собой, то можно настроить и автоматическое подключение устройства и создание Bluetooth сети, за это будет отвечать udev. Например у меня в директории /etc/udev/rules.d было установлено правило 70-bluetooth.rules, которое ссылалось на выполняемый при под- и отключении Bluetooth устройств скрипт:

KERNEL=="hci[0-9]*", RUN+="/lib/udev/bluetooth.sh"

который проверяет, подключили или отключили устройство и инициализирует его (добавленные мною строки заканчиваются пустым комментарием):

#!/bin/sh
#
# bluetooth.sh: udev external RUN script
#
# Copyright 2005-2006 Henrik Brix Andersen
# Distributed under the terms of the GNU General Public License v2

script=/etc/init.d/bluetooth
btlan=/etc/init.d/btlan #

# Find out where sysfs is mounted. Exit if not available
sysfs=`grep -F sysfs /proc/mounts | awk '{print $2}'`
if [ "$sysfs" = "" ]; then
echo "sysfs is required"
exit 1
fi

if [ ! -d $sysfs/class/bluetooth/hci[0-9]* ]; then
if $script --quiet status; then
$btlan stop #
$script stop
fi
else
if ! $script --quiet status; then
$script start
$btlan start #
fi
fi

Настройка клиента проста. Включаем Bluetooth, запускаем Bluetooth менеджер, создаём новое соединение, выбираем Explore bluetooth device, там выбираем свою точку доступа, среди предоставляемых ей сервисов выбираем LAN Acces Point. В Bluetooth менеджере создаётся ярлык. Запускаем. Предлагается ввести логин и пароль, оставляем пустыми все поля. Вы в сети.
Когда я покупал Bluetooth брелок, на коробочке с ним было гордо написано: "Built for Mac OS X" и "Designed for Microsoft Windows XP". И знаете что? Я её выкинул. Потому что поставляемым с брелоком ПО, достаточно неплохим, должен отметить, я аналогичного функционала добиться не смог.

Vim like zsh keymapping


Данная статья посвящена исключительно настройке клавиатурных привязок в zsh в стиле vim, во избежание повторений общих советов в статье нет.

В одном из обзоров редактора vim я встретил фразу, смысл которой сводится к следующему - очень многое в UNIX основано на подобии, поэтому изучение данного редактора для относительно опытного пользователя не должно представлять трудности.
Многие разработчики отталкиваются от этого подобия и делают приложения чем-то похожими либо на vim, либо на emacs, либо на оба редактора. Именно так поступили создатели zsh, предоставив пользователю на выбор четыре схемы "привязок горячих клавиш" для редактора коандной строки - emacs, viins, vicmd и .safe (две схемы для vim для эмуляции разных его режимов).
Я люблю vim и постоянно использую его и только его, под какой бы операционной системой ни оказался, благо его порты есть под самую разнообразную экзотику. И в ходе очередного витка изысканий по настройке zsh было принято решение - для эффективности и унификации использовать схему привязок vim. Однако чувство незаконченности и неудобства не покидало меня. И выход был найден - создать свои схемы привязок на основе уже существующих, воспользовавшись поистине безграничными возможностями настройки zsh.
Итак, открываем ~/.zshrc.

1. Создадим две схемы на основе существующих (по одной на режим вставки и командный):

#vi insert mode like keybindings
#defining something more usable than the defaults vi bindings
#creating two keymaps
bindkey -N myviins viins
bindkey -N myvicmd vicmd

2. Исправим досадное недоразумение - zsh никак не отображает текущий режим - напишем свои переключения:

#defining widgets, to switch between them
function my_viins_to_vicmd(){print -n "\033]0;zsh\a";bindkey -A myvicmd main}
function my_vicmd_to_viinsi(){print -n "\033]0;zsh INSERT\a";bindkey -A myviins main}
function my_vicmd_to_viinsa(){print -n "\033]0;zsh INSERT\a";zle vi-forward-char;bindkey -A myviins main}
zle -N my_viins_to_vicmd
zle -N my_vicmd_to_viinsi
zle -N my_vicmd_to_viinsa
bindkey -M myviins '^[' my_viins_to_vicmd
bindkey -M myvicmd 'i' my_vicmd_to_viinsi
bindkey -M myvicmd 'a' my_vicmd_to_viinsa

Теперь в заголовке эмулятора терминала будет отображаться режим вставки.

3. Небольшая полезняшка - памятка с текущими привязками:

function list_mappings(){bindkey}; zle -N list_mappings
bindkey -M myvicmd ':map' list_mappings

4. сделаем свой режим вставки режимом по умолчанию:

#setting my vi-like insert mode by default
bindkey -A myviins main

5. Исправим непривычное поведение некоторых клавиш (адаптация общего совета Алексея Федорчука)

#making work some special keys
bindkey "\e[2~" yank
bindkey "\e[3~" delete-char
bindkey "\e[5~" up-line-or-history
bindkey "\e[6~" down-line-or-history
bindkey "\e[A" up-line-or-search ## up arrow for back-history-search
bindkey "\e[B" down-line-or-search ## down arrow for fwd-history-search

#making work Home and End keys in both modes
case $TERM in
linux)
bindkey -M myviins "\e[1~" beginning-of-line
bindkey -M myviins "\e[4~" end-of-line
bindkey -M myvicmd "^[[1~" beginning-of-line
bindkey -M myvicmd "^[[4~" end-of-line
;;
*xterm*|rxvt|(dt|k|E)term)
bindkey -M myviins "\e[H" beginning-of-line
bindkey -M myviins "\e[F" end-of-line
bindkey -M myvicmd "\e[H" beginning-of-line
bindkey -M myvicmd "\e[F" end-of-line
;;
esac

Ну и напоследок небольшой пример, показывающий, как писать виджеты ("задача виджета выполнять некое малое действие") в стиле команд vim и привязывать их к клавиатурным сочетаниям.
Иногда возникает потребность быстро заменить один из аргументов в вызове программы:

kill -HUP foobar
kill -9 foobar

это и будет делать мой виджет.
Сначала объявляем функцию, которая будет это делать:

#simple widget, wich deletes N-th parameter (word) in line
killparam()
{
zle beginning-of-line
zle vi-forward-word -n ${NUMERIC:-1}
zle delete-word -n 1
zle vi-delete-char -n 1
zle my_vicmd_to_viinsi
}

затем провозглашаем её виджетом:

zle -N killparam

и привязываем к горячей клавише:

bindkey -M myvicmd 'k' killparam

При написании виджета для простоты я использовал только уже готовые виджеты самой zsh, вызывая их с помощью команды zle. Обратите внимание на передачу параметра второму из них - если $NUMERIC не определён, будет передана еденица. Всем остальным виджетам предписано выполняться строго один раз, даже если $NUMERIC задан (-n 1).
Теперь, чтобы удалить -HUP в указанном примере достаточно в режиме редактирования набрать 1k или просто k ( если набрать 2k, то будет удалено второе слово и так далее).
Таким образом я избавился от неинформативности оболочки, странного поведения привычных вещей и научил её выполнять новые трюки.

Два колеса и пять педалей - катаемся на нестандартных мышках


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

Прежде всего мы должны убедиться, что X сервер правильно работает с мышкой. Вопросы использования мышек в консоли оставим эстетам, не разделяющим моего мнения о том, что мышка в консоли вообще явление необязательное, тем более такая. Рассмотренная конфигурация - Xorg 7.x, A4 tech WOP-49 (5 нажимаемых кнопок включая одно из колёс, 2 колеса).
Отправляемся в xorg.conf и в соответствующей секции вносим изменения:

Option "Protocol" "ExplorerPS/2"
Option "Buttons" "9"
Option "ButtonMapping" "1 2 3 8 9"
Option "ZAxisMapping" "4 5 6 7"

Первой строчкой указываем протокол, второй - количество кнопок мыши, третьей - нажимаемые кнопки, четвёртой - движения колёс. Как вы видите, боковые кнопки идут после колёс и в случае с одним колесом это могло бы выглядеть так:

Option "ButtonMapping" "1 2 3 6 7"
Option "ZAxisMapping" "4 5"

Итак, все манипуляции с мышью, кроме перемещения, X сервер воспринимает как нажатия кнопок. Соответственно, в моём случае 1,2,3,8,9 обозначают левую, среднюю, правую и две боковые кнопки, а 4,5,6,7 - движения колёс. И именно нажатиями кнопок я буду всё это называть для унификации в дальнейшем.

Запускаем X сервер и убеждаемся, что всё работает правильно. Можно покрутить какой-нибудь документ в книжной ориентации в обоих направлениях. Но окончательный вердикт вынесет утилита xev. При получении каких либо событий она отправляет их описание в консоль. И если на нажатия боковых кнопок в её выводе присутствует button 8 и button 9 (6 и 7 для одноколёсной мыши), значит, всё нормально и кнопки видны X серверу.

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

Для этого нам понадобятся xbindkeys и xvkbd из одноименных пакетов. Вся магия будет совершаться при помощи следующих строк в ~/.xbindkeysrc:

"xvkbd -xsendevent -text "\[Control_L]\[KP_Divide]""
b:8
"xvkbd -xsendevent -text "\[Control_L]\[KP_Multiply]""
b:9

То есть боковые кнопки будут эмулировать Ctrl+* и Ctrl+/. Такие комбинации выбраны потому что одной рукой их выполнять неудобно а значит использоваться они будут вряд ли. Комбинацию можете подобрать и сами, воспользовавшись значением keysym для клавиши, определить которое можно при помощи всё той же xev. Запись кода в качестве параметра xvkbd должна выглядеть как \[keysym].
Вот так, слегка пошуршав двумя конфигами, мы добились желаемого.

09 октября 2007

Cut в Blogger

Реализовал сворачивание длинных постов в Блоггере на манер ЖЖ (см. предыдущий пост). Не удержался от пижонских эффектов.

01 октября 2007

intro

Этим полукреслом мастер Гамбс начинает новую партию мебели...
Этим постом начинается новый блог. Посвящён он будет в основном Linux и свободному ПО, однако в нём будет место и для тем из других областей IT.