среда, 31 декабря 2008 г.

прошел год...

В конце года принято подводить итоги, и строить планы на следующий год. Сочинения в стиле "как я провел лето" мну никогда особо не нравились, но все-таки попробую :)

Во-первых, праздник для этого блога по-своему двойной - если судить под дате первого поста - блогу неделю назад стукнуло два года. Не так много написано за эти два года здесь, - в общей сложности чуть меньше 50 постов, особой посещаемостью хвастаться не приходится, но, по большому счету я не гонюсь за количеством постов, или толпами читателей. К постам в блоге я отношусь как к своеобразным "заметкам на полях", приятно что есть люди, которым эти заметки так или иначе были интересны. Где-то в середине года, если судить по количеству постов - блог заметно оживился, я старался писать сюда хотя бы раз в две недели, к сожалению осенью такой темп поддерживать не получилось - много болел, и никакого настроения писать не было. Хотя, по-прежнему, тем в рукаве немного есть.

Кроме блога, в сети я постоянно присутствую только в одном месте - на linuxforum'е, и собственно, около года числюсь там в модераторах нескольких разделов. Модераторство на таком ресурсе как Линуксфорум - штука нервная, иногда достаточно сложная - людей много, люди разные, всем не угодишь, и компромиссы даются не всегда легко, но ресурс жив, работает, туда приходят люди, получают ответы, учавствуют в обсуждениях, посему, есть надежда что все что я делают там - делается не зря. С недавнего времени(спасибо k0sh) я есть еще и на Хабре - пока смотрю по сторонам, чего-то подобного в моей RSS-Ленте явно раньше не хватало (:

Среди событий/открытий года я бы выделил для себя два:
  • покупка MacBook, я наконец-то увидел что есть Mac, что есть OS X. Ощущения по-прежнему неоднозначные, и иногда мне не хватает Linux'а, но этот пост, как и все остальные, написанные с мая месяца, я пишу из Firefox в Leopard'е, и вобщем-то мне это нравится. Игры с установкой и настройкой операционной системы, сменились играми в программирование - и это мне тоже нравится (:
  • второе открытие года - это подкасты. медленно, но упорно, оффлайновые радиопередачи, созданные любителями, вошли в мою повседневную жизнь.
Еще: я прочитал все семь томов Гарри Поттера и посмотрел все фильмы(вернее наоборот - сначала посмотрел - потом прочитал), посмотрел первые два сезона Heroes, House M.D. и Eureka, нашел и пересмотрел Twin Peaks, нашел и пересмотрел фильмы про Гардемарин, купил Nikon D40, прочитал "Детей Капитана Гранта", и последнюю книгу из серии Альфреда Шклярского про Томека - "Томек в Гран-Чако", и это все мне тоже понравилось!

"Робочий" год прошел достаточно сложно - около десятка достаточно тяжелых миграций, с кучей проблем, и поводов возненавидеть FrontPage, ASP.Net, и ColdFusion. Тем не менее мы получили опыт, информацию к размышлению, и некоторое представление о том как улучшить процесс, что само по себе полезно. Есть сложные и интересные вещи, которые предстоит сделать в следующем году, возможно, кое о чем, о чем можно говорить, я расскажу на страницах этого блога.

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

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



Вместо новогодней открытки, есть вот такая фотка из Киева :) Простите за качество - делал за час до поезда на бегу, не обратил внимание на то что с настройками не все хорошо :)

среда, 26 ноября 2008 г.

/etc/passwd: удаляем неугодных :)

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


Не так давно на работе подкинули задачку - есть у нас, скажем,
достаточно большой файл паролей: /etc/passwd, на 500.000+
пользователей,и есть список пользователей - штук 100.000, которые надо
из этого файлика убрать, за разумный период времени и скромно расходуя
ресурсы. Что делать, и как дальше жить?


Вообще строки из файлов удалять - ума много не надо: sed -e
'//d' filename и вперед. Но, ежели и строк много и файл не
маленький, то растянуться удовольствие в стиле cat users | while read
i; do sed -ie '/^'$i':/d' "$i"; done может очень надолго. Более
быстрый вариант - это когда за один раз удалять, скажем не одну
строку, а несколько тысяч:



n=0;
cat test_passwd_list |
while read i ; do
echo -n "${i}|" ;
let n =1 ;
if [ "${n}" -gt 2000 ] ; then
echo ;
n=0 ;
fi ;
done |
while read users ; do
sed -i -r -e "/^${users}:/d" test_passwd ;
done

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


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




#!/usr/bin/perl

use strict;
use warnings;
my $in = 2;
my $off = 0;
my %hash;
while(<>){
chomp;
my $s = $_;
push(@{$hash{substr($s,$off,$in)}}, $s);
}

open(FILE,"/Users/diesel/scripts/passwdsplit/test_passwd");
while(<FILE>){
my $s = $_;
my $t = 0;
my ($sub,undef) = split(/:/,$s);
foreach my $item ( @{$hash{substr($s,$off,$in)}}){
if ($item eq $sub){
$t = 1;
last;
}
}
print $s unless $t == 1;
}


Собственно эта штука написанная не думая отработала свои 2 минуты,
сделала то что требовалось и проблема была решена. Но я не успокоился
:)


Играясь с значением переменных $in и $off уже на тестовых файлах, я
понял что чем больше строку мы кладем в хэш, тем быстрее все
работает, при этом все это дело не так уж много памяти жрет. Поэтому
возникло желание засунуть в хэш весь файл с юзернеймами, которые надо
удалить - с самого начала это в голову не пришло - боялся что перлу
поплохеет. Оказывается не плохеет и вот такой вариант:




diesel@indie:~/scripts/passwdsplit$ cat noregexp1.pl
#!/usr/bin/perl

use strict;
use warnings;

my %hash;
open(FILE1,$ARGV[0]);
while(<FILE1>){
chomp;
# my $s = $_;
$hash{$_} = "1";
}

open(FILE2,$ARGV[1]);
while(<FILE2>){
my ($sub,undef) = split(/:/);
print $_ unless $hash{$sub};
}


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



diesel@indie:~/scripts/passwdsplit$ cat noregexp.rb
#!/usr/bin/ruby

hash = Hash.new;
File.open(ARGV[0]) do |file|
while ! file.eof? do
hash[file.readline.chomp] = 1;
end
end
File.open(ARGV[1]) do |file|
while ! file.eof? do
s=file.readline;
unless hash[s.split(":")[0]]
print s
end
end
end

которой на выполнение той же задачи понадобилось секунд
пять. Другой человек, с которым я работаю решил попытать счастье с
С++'ным STL, и binary search в vector(да простят меня гуру, если я
сказал что-то не так). Его binary search занял примерно те же пять секунд
что и ruby-скрипт, равно как и моя переделка с использованием map:




#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;

int main(int argc, char *argv[]) {
string buff;
map<string,char> hash;

ifstream ex(argv[1]);
if (ex.is_open()){
while(!ex.eof()) {
getline(ex, buff);
hash[buff] = '1';
}
ex.close();
}

ifstream in(argv[2]);
if (in.is_open()){
while(!in.eof()) {
getline(in, buff);
string usr(buff.substr(0, buff.find(":", 0)));
if ( hash.find(usr) == hash.end() ){
cout<<buff<<endl;
}
}
}
in.close();
return 0;
}



Что вобщем-то не плохо, но несколько странно. Я расчитывал что оно
догонит и перегонит перл :). Чтобы догнать и перегнать перл оказалось
нужно заменить cout<<buff<<endl на банальный
printf("%s,\n",buff.c_str()).

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

воскресенье, 19 октября 2008 г.

bash и время, Хабровое :)

Недавно на Хабре натолкнулся на немного странную заметку. Собственно речь идёт о возможности в стандартном приглашении bash установить показ времени. Автор утверждает что подобная штука позволяет здорово улучшить контроль за использованием времени. Удивился, что в коментах очень много "спасиб" и прочих восторженных отзывов - я к подобному импрувменту отношусь с некоторым непониманием. К сожалению или к счастью на Хабре меня нет, и коментить я там соответственно не могу, поэтому несколько мыслей по поводу, здесь.

Когда-то я пробовал вставлять время в приглашение bash, но от подобного решения отказался практически сразу, вернувшись на стандартное user@host:directory. Во-первых, приглашение получается сильно длинным, а потому с одной стороны - сложно вычленить из него то что надо в текущий момент; с другой - остается меньше места для того чтобы собственно вводить команды. Вариант двухстрочного приглашения мне никогда не нравился - выглядит как-то коряво, и часто избыточно.

Во-вторых, важно понимать какое именно время показывается - это фактически время появления текущего приглашения bash: использовать его как источник точного времени нельзя - оно не меняется до тех пор пока ты не вызовешь новое приглашение, использовать его для какого-либо "трэкинга" потраченного на набор команд времени тоже не особо удобно, поскольку, при активном использовании терминала строки очень быстро исчезают с экрана.

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

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





воскресенье, 21 сентября 2008 г.

телефонное :)

В прошлом посте я собирался рассказать немного про другое, жалобы на жизнь вырвались самопроизвольно, и раз уже вырвались, то пусть будут, для разнообразия :)

Оставшись без интернета, и понимая что, быстро это все не подчинят, я в очередной раз задумался о том что неплохо было бы иметь какой-то резервный способ попадания в сеть. Привычки – страшная вещь, а я как-то уже свыкся с мыслью что компьютер постоянно подключён к глобальной паутине, и если чего надо, то легче это искать именно в глобальной паутине, а не хранить у себя на жестком диске. В эпоху модемного интернета, когда считалось время проведенное в сети, конечно же было по-другому: книги, странички, всякая мелкая дрянь, по быстрому сохранялась на жесткий диск, а потом в офф-лайне, это дело неспешно разгребалось. С тех давних времен у меня гигабайт десять книг, которые когда-то качались на “всякий случай”, и большая часть из которых так до сих пор и не прочитана. Сейчас те же книги скачиваю я по мере надобности, а ссылки на программы и статьи которые в свободное время надо будет посмотреть хранятся в виде закладок(некоторые в браузере, некоторые еще и в del.icio.us). Поэтому когда доступа в интернет нет совсем – то за компьютером становится грустно и скучно – ибо информационный голод.

Наверное самый доступный способ “резервного” доступа в сеть – через мобильник. К сожалению телефон мой достаточно старый SE K300i, в качестве Bluetooth-gprs-модема использовать его не получится, поскольку собственно никакого Bluetooth там с рождения не было. Через USB к компутеру телефон подключить конечно же можно, но USB шнурка у меня для него нет, да и насколько я помню в общем случае шансы заставить работать первый попавшийся телефон в Linux'е через USB, в качестве модема были не очень большие. Что-то работало as is из коробки, что-то, по отзывам, танцев с бубном больших требовало. Тратить время на подобные развлечения как-то совсем не хочется сейчас. Короче говоря, в очередной раз возникло желание таки купить новый телефон с блутузом, через который будет относительно легко в случае необходимости, хоть какой-то доступ в всемирную паутину иметь.

Не знаю что там говорят и думают профессионалы в сфере мобильников, на меня как простого потребителя “предложение” на рынке телефонов, смартфонов и прочего околозвонящего стаффа производит какое-то удручающее впечатление. В моем понимании телефон или смартфон, должен во-первых прилично выглядеть – это та штука которую ты всегда носишь с собой, соответственно смотреть на нее, держать ее в руках должно быть по крайней мере приятно. С другой стороны, телефон естественно должен уметь хорошо справляться со своими прямыми телефонными обязанностями: звонить, принимать звонки, слать все шо можно послать, и принимать все что могут послать тебе :). Ну и совсем с третьей стороны идет всякий дополнительный функционал, которым на данном устройстве должно быть удобно пользоваться. И вообще отлично было бы получить это все по вменяемой цене(а не iPhone по цене MacBook'а) :).

И, странное дело, толи у меня какое-то атрофированное чувство прекрасного, толи большая часть телефонов – таки какой-то невообразимый отстой(я про внешний вид конечно же). Встречаются, конечно, приятные исключения, но они часто “за дорого”.

Поскольку телефона который “на меня бы смотрел и просил купить”, я так и не увидел, то купил первый попавшийся, лишь бы звонил, да блютуз имел. Первый попавшийся оказался тоже продуктом Sony Ericsson, на этот раз под кодовым номером K660i. Не смотря на страшноватый внешний вид, явный пeреизбыток функциональных кнопок, не очень удобный, как по мне, “джойстик”, - “игрушка” оказалась весьма приятной :). Интерфейс достаточно сильно похож на интерфейс старого телефона, правда, с “продвинутыми” особенностями, поэтому сильно привыкать не к чему.

Кроме всего прочего, телефон этот поддерживает не только собственно GSM-стандарт, но и UMTS – это один из вариантов 3G-сети. На Украине через UMTS работает Utel – это какое-то дочернее подразделение национального оператора “проводной” связи – Укртелекома, которое соответственно мобильные услуги предоставляет. Заварили они всю эту кашу не так давно, но, насколько я понимаю, успели покрыть 3G-сетью все областные центры. Раз телефон этой радостью пользоваться позволяет – решил попробовать, все-таки обещаны гораздо большие скорости интернета, чем через тот же GPRS.

Купил один из их prepaid пакетов, за 100 украински гривней(около 20 баксов). На счет соответственно легло 50 + “подарили” 1Гб траффика. Вот уже три дня как этим всем пользуюсь. Что здесь можно сказать:
  • скорости при скачивании достаточно не плохие – браузер показывал от 20Kb/s до 80 Kb/s, - с разных серверов, по разному – как и везде. До обещанных 3Mbit/s, конечно далеко, но и так неплохо.
  • По ssh работать вполне терпимо.
  • За три дня улетело около 300 Мб, удивлен, не думал что такой прожорливый, это при том что все-таки интернет включен не все время.
  • Время от времени соединение вылетает – не знаю вина это MacBook'а, телефона или оператора, максимум около трех часов в он-лайне удалось продержаться пока что.
  • На MacBooke' коннект настраивается несколькими кликами – доволен что не пришлось много думать :)
  • При постоянном включеном bluetooth и интернете в 3G-сети, аккумулятора телефона хватает на день – маловато, однако.
Подводя итоги – эксперимент относительно удачен: резервный способ доступа в сеть есть, и даже вроде как более продвинутый чем предполагалось.

суббота, 20 сентября 2008 г.

... телефонная поддержка ... ощущения

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


Где-то с середины недели у нас с переменным успехом идет дождь, как следствие - придя в среду вечером домой, с "радостью" обнаружил что интернета нет, ближайший шлюз не пингуется, и, видимо, в том не моя вина, а вина "той штуковины на крыше". В четверг утром решил позвонить в провайдерский суппорт.


Вообще, если говорить о моем отношении к разного рода службам поддержки вообще, и телефонной поддержке в частности - "не люблю". Тут скорее "не люблю" в мягкой форме - с большим уважением отношусь к людям работающим в подобных сервисах, поскольку понимаю, что, например, мне было бы сложно выдержать звонки от 10-20-30... клиентов в день, каждый день, и оставаться спокойным, добрым, и желающим помочь. Причем: клиентов не всегда адекватных, раздражённых возникшей проблемой и так далее. Уж очень близко к сердцу процесс общения as is я воспринимаю, чтобы допускать подобное перенасыщение общением. "Не люблю" поддержку вообще, и телефонную поддержку особенно, прежде всего в плане необходимости куда-то звонить, кому-то писать, чего-то спрашивать. Так же не очень люблю, например, интернет-магазины у которых в процессе приобретения товара предусмотрено обязательное живое общение с менеджером. Я пришел к вам на сайт, заполнил необходимые формы, сказал все что хотел сказать, - пришлите мне то что я просил, и до свидания, до следующей покупки. Если бы я хотел поговорить - я бы пошел в обычный оффлайновый магазин.


Мой интернет-провайдер в плане поддержки - контора весьма странная, с немного наплевательским отношением к клиентам. Клиентам удобно иметь поддержку 24x7, клиентам удобно иметь разные способы достучаться к службе поддержки, клиентам еще много чего удобно. А получаем мы поддержку с 10 до 18-ти(если память не изменяет), исключительно в рабочие дни, и исключительно по телефону. Через традиционные для Internet-компаний ICQ, e-mail, или сетевой форум поддержка официально не осуществляется. Ок, хорошо, я работаю в достаточно нестандартное время, ухожу из дому где-то в половине двенадцатого дня, и достучаться туда в официальные часы приема для меня проблемы не составляет. Но процент людей с нестандартным графиком работы скорее всего близок к уровню статистической погрешности. А декларировать проблему находясь за несколько десятков километров от собственно компьютера никакого принципиального смысла не имеет.


Так или иначе, позвонил я в четверг в службу поддержки. Диалог примерно такого плана между нами состоялся:



Я: Добрый день, со вчерашнего дня не работает интернет. Адресс:...,IP: .... .
Первый голос[Раздраженный]: Что вы меняли?
Я: Ничего не менял. Пришел с работы домой, сети нет, интернета соответственно тоже. С роутера шлюз не пингуется. Роутер показывает что кабель в него воткнут.
Первый голос: Какой IP?
Я: ...IP....
[пауза]
Первый голос: Не, давайте все-таки попробуем проверить ваши настройки. Там внизу панелька, рядом с часиками....
Я: Эээ... подождите какая панелька с часиками. Ваша сеть воткнута в роутер, с роутера ее не видно.
Первый голос: а машины внутри сети видно?
Я: Да.
Первый голос: сколько машин?
Я: три.
Первый голос: Давайте проверим настройки роутера.
Я:[Начинаю считывать настройки]
[Очень долгая пауза, не знаю шо и думать]
Второй голос: Добрый день, не могли бы вы напомнить вашу проблему.
Я: [напоминаю]
[пауза]
Второй голос: будьте сегодня дома с одиннадцати до часу, наши ребята к вам подъедут. Да, в вашем доме нас председатель не пускает на чердак, поэтому возьмите у него ключи от чердака, вашу машину протестить они конечно смогут, но если проблема не в ней - то на чердак сами они не зайдут.
Я: эээ подождите. с одиннадцати до часу никак не получится - мне на работу надо
Второй голос: а когда получится?
Я: Завтра?
Второй голос: ок завтра с одиннадцати до часу....
Я: а раньше нельзя?
Второй голос: нет, они выходят с одиннадцатти.
Я: ок, тогда не будем пока назначать время, возможно у кого-то еще с нашего дома получится днем быть дома, если нет - я перезвоню.


Возможно я где-то не прав, и хочу слишком много, за те 25 баксов, которые ежемесячно, в срок, платятся в кассу интернет-провайдера. Но: почему я должен быть дома еще и для того чтобы подчинили интернет, вместо того чтобы в это время быть себе спокойно на работе. Почему я должен договариваться с мифическим председателем, по поводу ключей, поскольку данная компания это не осилила сделать. Почему проблемы которые не должны быть моими проблемами с лёгкостью перекладываются на мои плечи?


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

среда, 17 сентября 2008 г.

Richard Wright, R.I.P.

15 сентября, в возрасте 65 лет, умер от рака один из отцов-основателей Pink Floyd - клавишник Richard Wright.

Думаю какие-либо комментарии излишни.

воскресенье, 14 сентября 2008 г.

текстовые редакторы, vim :)

Первое мое продолжительное знакомство с Linux прошло под флагом Slackware, и в Slackware, для правки конфигов, я пользовался штукой под названием jed. Это такой маленький, кроссплатформенный редактор, в котором по-умолчанию используются emacs-like сочетания клавиш, но как на мой вкус - более дружелюбный к новичку, чем тот же консольный вариант emacs'а. Для конфигов было достаточно, скриптописательством и прочим программированием я в linux тогда не баловался, а то что текст можно себе спокойно писать не в Word'е, - представлял с трудом. Попытки отредактировать что-нибудь в vim'е заканчивались как и у многих перезагрузкой системы, так как выйти из этого чудо-редактора по-другому не представлялось возможным. По-сути, переход на vim, и переход на Debian, для меня происходили примерно в одно и то же время, - где-то три года назад. С тех пор vim - мой основной текстовый редактор для написания и редактирования кода, и попытки пользоваться чем-то другим, как правило заканчиваются правкой .vimrc.

Последние пару недель, я активно заинтересовался ruby, книга Хэла Фултона, купленная уже достаточно давно ждала своего часа, час, кажется пришел. Пользуясь некоторым затишьем на работы, стал понемного вникать в основы этого чудо-языка. Первые ощущения - это такая себе смесь perl'а и python'а с присущей perl'у выразительностью и компактностью, и python'овским простым, относительно синтаксиса, ООП. То что видел - понравилось, думаю, что некоторые задумки буду делать на ruby. В связи с этим всем, в очередной раз решил посмотреть чего там есть интересного для ruby в мире текстовых редакторов.

Textmate - наверное один из самых популярных редакторов для OS X, предлагают купить за 39 евро. Есть своеобразный "младший брат"(хотя никакого кровного родства насколько я помнимаю нет) - textwrangler - за бесплатно. Ничего особо хорошего или особо плохого по поводу сказать не могу - неплохие текстовые редакторы, с подстветкой синтаксиса, с возможностью эту подсветку настроить как хочется, с некоторыми полезными фичами собственно для разработки - типа коментирования выделенной области кода, автодобавления скобочек, и так далее и тому подобное. У меня они ассоциируются с любимым многими windows-пользователями notepad++ - хотя и тот и другой выглядят пристойней(впрочем это свойствнно OS X -приложениям вообще). За что платить 40 евро, и вообще зачем оно мне могло бы быть надо - не заметил. Хотя есть одна фича в них, которая может быть полезна:



На скриншоте TextWrangler, в котором открыто для редактирования несколько файлов - как видим он отображается справа, в такой себе менюшке, которую при желании можно спрятать. А вот что-то похожее, в более традиционном для unix-систем редакторе:


Это Aqua Emacs - одна из версий GNU Emacs для OS X, с плагином(или как это правильно назвать?) ecb. В верхней части указанный мной места файловой системы, внизу - история открытых файлов. О том как такое сделать можно почитать вот тут: http://sodonnell.wordpress.com/2007/06/13/the-emacs-code-browser/, о ruby+emacs есть неплохой скринкаст: http://platypope.org/yada/emacs-demo/ в котором прелести ruby mode для emacs раскрываются, на вид вкусно, но пока я пас.

Дольше всего я проигрался с eclipse:
И даже ловлю себя на мысли что не так уже и плохо по "look and feel", хотя наверное в какой-то мере и граничит с "из пушки по воробьям" .

Возвращаясь на vim, после странной и долгой экскурсии, опробовал несколько новых плагинов. NERD Tree - дает возможность шататься по файловой системе, открывая файлы, в том числе и в новых табах, достаточно интересная штука:

Другая интересная штука плагин позволяющий листать Man, perldoc, info страницы не выходя из vim: ManPageView - давно хотел чего-то подобного, просто набираем :Man perl, и получаем man-страницу в vim'е так же как если бы мы смотрели vim'овский help(полноценно работает на vim 7.2). Ну и третий плагин на скриншоте - BufferExplorer - думаю, комментарии излишни.

Из понравившихся фич, которым пока не нашел адекватной замены в vim - "автодописывание" end, после объявления класса, метода, или блока с do, в ruby. Правда, особо не искал.

четверг, 11 сентября 2008 г.

Время сомнительных релизов :)

Только ленивый в последнее время ничего не писал про Google Chrome - новый браузер с открытыми исходниками от Google, основанный на WebKit. Не смотря на то что вроде бы и предмета для разговора как такового нет - под Linux и OS X Chrome только обещают(по последним прогнозам - в течении полугода) - линуксоидов и маководов как раз таки тема заинтересовала больше всего, - про выход нового браузера я узнал из новостной ленты как раз таки яблочного сайта, а блоги линуксоидов пестрят восторженными заметками о новом чудо-продукте от Google. Поскольку работа моя так или иначе связана с web'ом, и браузер был и остается одним из основных рабочих инструментов - не попробовать новый браузер, который обещает быть популярным, хотя бы благодаря брэнду Google, я не мог. Поставили мы это дело на работе, на достаточно слабую по современным коредуровым меркам машину(впрочем, по другим меркам это будет "обычный офисный компьютер")... по правде сказать ожидал чего-то большего.

Способ установки как бы намекает на то что компьютер без подключения к интернет - уже не компьютер. Вы скачиваете инсталятор, а инсталятор, уже в ходе установки докачивает то что считает необходимым. На одном из форумов встретил ссылку на portable-версию, в которую уже фактически все включено, но это все-таки продукт третьей стороны, так сказать. Обещанного быстрого запуска не видел - запускается не быстро, скорее всего сравнимо с тем как запускается firefox или opera - +/- пара секунд тут особой роли не играют. С обещанной скоростью работы - тоже не совсем понятно. Смотрели два раза, на разных документах с docs.google.com, первый раз, на более мелком документе, оно достаточно сильно тормозило и глючило - по-сути даже хуже второго firefox'а, второй раз - хорошо и шустро все открыло. Хотя если сравнивать с третьим фоксом - какой-то сильной реактивности незаметно: на слабой машине работа с теми же google docs напоминает тебе о том что все-таки там веб-приложение в браузере, а не open office с локальным документом(на MacBook'e это, кстати, уже не так ощутимо). Попытка синхронизировать документы для оффлайновой работы закончилась ничем, а первый выход из браузера увенчался виндовым рантайм еррором(повторить правда не удалось). Удобство работы по десятиминутному знакомству оценить сложно - хотя судя по всему пока что штука явно не предназначена для запуска кучи вкладок - каждая вкладка, запускаемая в отдельном процессе - с одной стороны хорошо, с другой стороны - это все-таки трата памяти и прочих системных ресурсов, да и вроде как интерфейс на наращивание вкладок реагирует не так как бы этого хотелось.

В догонку к новости о релизе нового браузера, кстати, появилась в желтой прессе очередная заметка о том что Google свою ОС разрабатывает , правда на сейчас исходная ссылка уже не открывается. Хотя тенденция немного устрашает: google, google applications, google browser, google OS, и вот твой компьютер - больше не твой компьютер, а просто тонкий клиент к сервисам google. И все хорошо просматриваемо и контролируемо, и если уж забанят на гугле - то хоть вешайся :)

Другим странным релизом порадовал нас yandex, Достаточно долго yandex имеет свой jabber-сервис, сейчас они выпустили еще и собственный клиент к этому сервису:http://online.yandex.ru/. Сначала клиент появился под Windows, потом еще и версии под OS X, и Linux выкатили. Построено это все вокруг известного в узких кругах psi, но в отличии от самого psi, с его весьма странным, сомнительного удобства, интерфейсом, jabber-клиент от yandex - простой, и явно ориентирован на блондинистую часть населения рунета :) Кроме простоты, и красоты в windows-понимании(чем ярче - тем круче) есть еще, конечно, и тесная интеграция с сервисами yandex, наверное полезно тем кто этими сервисами пользуется.

Ну и на закуску: небезызвестная яблочная компания, в ходе недавней презентации под гордым названием Let's Rock представила публике iTunes 8, и обновленную линейку iPod'ов. По большому счету в новых iPod'ах не увидел ничего из-за чего бы можно было бы выбросить на помойку старый, и бежать в магазин в поисках следующего: поменяли дизайн, добавили пару фич сомнительной необходимости, - да и все собственно. В новом iTunes значимых изменения два: в интерфейсе теперь более продвинутый браузер по музыкальной коллекции:

в функциональность добавили так называемые "Genius playlist" - делает оно ровным счетом тоже самое что last.fm - смотрит на то что ты слушаешь, сравнивает с тем что слушают другие, и предлагает купить аналогичные вещи в iTunes Store. По большому счету, ни обложки которые берутся из iTunes Store, ни Genius Playlists которые тоже на основе iTunes Store построены, без доступа к самому iTunes Store неюзабельны, а официально iTunes Store c Украины недоступен. Я бы тут как раз более тесную интеграцию с last.fm предпочел бы, но видимо не судьба :) Да, кстати о птичках, кому интересно, в самом last.fm меня можно найти вот тут.

Вобщем, вроде бы и шумные интересные релизы, а того чем бы я мог реально воспользоваться из всего это добра - не вижу.

воскресенье, 24 августа 2008 г.

Ruby, jabber,etc...

Еще в седые времена было сказано - самый правильный способ разобраться с языком программирования - писать на нем программы. Можно прочитать несколько книжек, перерыть массу туториалов, но без реальной практики толку от этого всего будет не очень много. Можно, конечно, еще пытаться выполнять задачки которыми иногда автора свои книжки насыщают, и смею заметить польза от этого будет, но часто подобные задачки с одной стороны к реальному миру отношение имеют посредственное(хотя и позволяют закрепить на практике то о чем было рассказано в теории), а с другой - в силу своей надуманности, не особо то и интересны. После изучения какого-то базового уровня, полезно посматривать в сторону собственных практических экспериментов: даже если код будет корявым, даже если для того чтобы работало как надо - прийдется переделать все с нуля, - в последствии новые знания будут ложится на хоть как-то сдобренную почву, а не висеть в воздухе, и как бы применить ту или иную advanced фичу языка будет понятней гораздо лучше, чем если бы вы просто читали страницы учебника. Примерно так я разбирался с perl'ом, который сейчас достаточно активно использую.

В последнее время perl в около-IT'шной среде принятно ругать(это наверное тема для отдельного разговора), а хвалят в связи с этим чаще всего python, иногда ruby. C python'ом я когда-то игрался, и мне даже нравилось, но сейчас особых чувств к этому языку не испытываю. С ruby как-то особо не сталкивался, хотя судя по отзывам штука достаточно интересная. Во время небольшой передышки на работе нахватался кусков из книг, а вчера в очередной раз посетило желание поиграться с jabber'ом. Погуглив на предмет библиотек для работы с XMPP, для Ruby, нашел XMPP4R, которая оказалась чудовищно простой в обращении, даже с моим минимальным знанием самого ruby.

Вобщем первоначальная задача достаточно банальна - на моем домашнем сервере крутится некий сервис, который сам по себе не очень стабилен, и иногда требует перезапуска - фактически чего-то типа /etc/init.d/servicename restart. Обычно я логинюсь туда по ssh, делаю это черное дело, и до следующего раза(условие рестарта достаточно призрачное - поэтому заскриптовать делать это автоматически не получится). Хочется чтобы я мог сказать jabber боту, который будет запущен с того сервера - restart, а он уже сам запустит нужные команды для переазпуска. С помощью google и ruby у мну получился такой маленький бот, который способен посмотреть что ему ввели, и в зависимости от правильности ввода, или выполнить то что требуется, или послать нафиг :) В качестве примера здесь будет не рестарт сервиса, а выполнение команды dig, в случае если вы напишите что-то похожее на имя домена, или же предложение ввести имя домена, если то что вы ввели слабо походит на домен. Возможно кому-то будет полезно :)



#!/usr/bin/ruby
require 'xmpp4r/client'
include Jabber

def usage
puts "Usage: " $0 " jid password destination-jid"
exit
end

def reconnect(cl,password)
cl.connect
cl.auth(password)
cl.send(Presence.new.set_type(:available))
puts `date`
end

#Jabber::debug = true

jid = ARGV[0]
password = ARGV[1]
to = ARGV[2]
unless jid && password
usage
end

cl = Client::new(jid "/BOT-MODE")
cl.connect
cl.auth(password)

cl.on_exception { sleep 5; reconnect(cl,password) }

cl.send(Presence.new.set_type(:available))

if to
subject = "XMPP4R test"
body = "Give me a domain name and I will do some magic for you"
m_to = Message::new(to, body).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to
end

mainthread = Thread.current

cl.add_message_callback do |m|
if m.body =~ /^[a-zA-Z0-9.-] \.[a-zA-Z.]{2,5}$/
dig = "\n"
dig = `dig noall answer #{m.body}`
dig = "===========\n"
dig = `dig noall answer NS #{m.body}`
dig = "===========\n"
dig = `dig noall answer MX #{m.body}`
dig = "===========\n"

m_to = Message::new(m.from, dig ).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to

elsif m.body != nil
body = "Give me a domain name and I will do some magic for you"
m_to = Message::new(m.from, body).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to
puts "response sended to #{m.from}"
end
puts m.from,m.type, m.body if m.body != nil
end

### keep alive
Thread.new do
while true do
if cl.is_connected?
cl.send(Presence.new)
else
reconnect(cl,password)
end
sleep 30;
end
end
Thread.stop
cl.close

Готовый файл можно стянуть отсюда: http://muaddeep.googlepages.com/jabber-cl.rb, комменты от знатоков приветствуются. На что здесь нужно обратить внимание:
  • если вы настраиваете add_message_callback так чтобы отвечать всем кто вам что-либо напишет, то нужно обратить внимание что ответы эти будут идти и на всякие presense notifications, и есть риск заспамить всех кто в данный момент в он-лайн. Поэтому нужно проверять что в message body точно что-то есть.
  • Полезной является практика напоминать серверу о своем присутствии(иначе соединение разрывается, а скрипт сегфолтится), а так же автоматически переконнекчивать бота в случае если соединение все-таки разорвалось(на домашнем jabber-сервере соединение разорвалось где-то через час, на "настоящих" все происходит гораздо быстрее).
  • Статьи рекомендованные на http://home.gna.org/xmpp4r/ и примеры которые идут с пакетом, многое объясняют :)
Всех кого это касается с Днем Независимости! До новых встречЪ.:)

пятница, 8 августа 2008 г.

CLI, as I use it. Part 2. awk.

Когда речь заходит о работе с таблицами, прежде всего в голову приходит конечно же небезызвестный MS Excel, или его аналоги: Open Office Calc, Google Spreadsheets и так далее. Эти средства конечно же неплохо визуализируют данные, и хороши если данные сами по себе представляют для нас какую-либо ценность. Если же нам с этими данными нужно какие-то активные манипуляции провести, выбрать какую-либо их часть, а потом на основе этой выборки, еще чего-нибудь сотворить - все сразу становится сложным, непонятным, и совсем неинтуитивным. Тогда следует вспомнить что и в бинарном xls, и в xml'ном ods все сложности и навороты связаны прежде всего с тем что: нужно сохранять оформление таблиц, нужно где-то сохранять информацию о использовании тех 80% функциональности, которые редко кто использует(Вы часто строите трехмерные диаграммы в офисном пакете? - я, например, последний раз это делал на уроках информатики в школе ... тем не менее если вдруг решитесь - это все богатство легко уместится в xls или ods).

А для представления обычной таблицы, достаточно ведь гораздо меньшего! В простейшем случае строки таблицы могут быть строками текстового файла, а поля в каждой строке разделятся каким-либо символом(или символами), которы никогда в самих полях не встретится. Для более сложных случаев можно использовать csv.

Подобные текстовые таблицы встречаются в unix-системах на каждом шагу, наиболее известным примером может быть файл /etc/passwd.

Как я уже писал в первой части для работы с подобными таблицами удобной может быть утилита awk(1).

awk - язык програмирования, который неплохо подходит для обработки форматированных текстовых данных. Первая версия интерпретатора awk появилась еще на заре unix'состроения и с тех пор ту или иную реализацию можно найти практически в любой unix, или unix-подобной системе. Насколько я понимаю, в современных linux'ах awk встречается в виде gawk - версия awk от проекта GNU; а так же в более легком, но немного урезанном по функциональности варианте - mawk. mawk, например, по-умолчанию устанавливается в Debian. Основная функциональность одинакова во всех возможных вариантах, различия как правило в деталях.


Интерпретатор awk можно вызывать либо с указанием файла сценария:


awk [параметры] -f 'имя файла сценария' [файл(ы)]

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


awk [параметры] 'сценарий' [файл(ы)]

где "[файл(ы)]" - имя файла или файлов которые awk-сценарий и будет обрабатывать.


awk-сценарий выполняется над каждой строкой входного файла, исключение представляют собой блоки BEGIN{} и END{}, которые выполняются соответственно в начале, и в конце работы сценария (условно говоря - перед началом чтения файла(ов) и после того как прочитана последняя строка).

Каждая обрабатываемая строка, доступна awk-сценарию через переменную $0. Если исходный файл представляет собой текстовую таблицу,разбитую на поля каким-то определенным разделителем, то в переменных $1,$2,...$n окажутся значения этих полей. По-умолчанию, разделителями считаются пробельные символы; задать свой вариант разделителя можно либо в блоке BEGIN, или с помощью параметра -F. Например, логины пользователей из /etc/passwd можно вывести следующим образом:


diesel@indie:~$ awk -F: '{print $1}' /etc/passwd
diesel@indie:~$ awk 'BEGIN{FS=":"} {print $1}' /etc/passwd

Программа на awk представляет собой набор блоков, каждый блок состоит из условия, и списка команд которые будут выполнятся если условие истинно. Команды в блоках заключаются в фигурные скобки. Блок перед которым не стоит никаких условий, например {print $1} из примера выше, будет выполняться на каждой обрабатываемой строке.

В качестве условия может выступать регулярное выражение заключенные в символы // - в таком случае с регулярным выражением будет сравниваться вся входная строка; операции сравнения с регулярным выражением, например $1~/regexp/ или $1!~/regexp/; а так же другие операции отношения, например $1 == "test". Допустим, вывести логины пользователей, которые начинаются с буквы d можно вот таким вот нехитрым образом:
diesel@debian:~$ awk -F: '/^d/{print $1}' /etc/passwd
daemon
diesel

В отличии от shell, или скажем perl, имена переменных в awk не предваряются символом $ . Конструкция вида $a будет трактоваться как "поле, номер которого, содержится в переменной a", Например результат выполнения команды:awk -F: '/^d/{a=1; print $a}' /etc/passwd, будет аналогичен тому что мы получили в предыдущем примере. Существует стандартная переменная NF в которой содержится колличество полей в текущей строке, print $NF напечатает содержимое последнего поля, print $(NF-1) - содержимое предпоследнего, и так далее.

Кроме NF, и FS следует обратить внимание еще на несколько специальных переменных: RS, OFS, ORS. RS(Record Separator) - задает разделитель строк("записей") нашей виртуальной текстовой таблицы. По-умолчанию, - перевод строки, но в блоке BEGIN{} это легко исправить. Допустим у нас есть файл вида:
diesel@debian:~$ cat test
Name: John Smith
Town: New Yourk

Name: Alex Diesel
Town: Nikolaev

В котором разделителем полей является перевод строки(\n), а разделителем строк таблицы - пустая строка(\n\n); Превратить это в более "табличную" форму можно вот так:

diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"} {print $1" "$2}'
Name: John Smith Town: New Yourk
Name: Alex Diesel Town: Nikolaev

Конкатенация строк, как видите, до боли проста, просто записываем подряд все строки которые нам хочется соединить(пробельные символы вне кавычек не учитываются, поэтому print $1 " " $2 сделает ровно тоже самое). Хотя в данном случае было бы неплохо не ставить после каждой переменной один и тот же разделитель, а задать общий разделитель для строк которые мы печатаем в print, для этого можно воспользоваться еще одной специальной переменной: OFS(Output Field Separator):

diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print $1,$2}'
Name: John Smith;Town: New Yourk
Name: Alex Diesel;Town: Nikolaev

А если мы хотим еще и сохранить исходный разделитель строк(\n\n), то к нашим услугам будет переменная ORS(Output Record Separator):


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"; ORS="\n\n"} {print $1,$2}'
Name: John Smith;Town: New Yourk

Name: Alex Diesel;Town: Nikolaev


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

Иногда хочется при выводе результатов произвести некоторые замены, например, нам не очень сильно нужны "Name:" и "Town:", из предидущего примера. Конечно, можно воспользоваться sed'ом:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print $1,$2}' |sed -e 's!Name: !!g; s!Town: !!g'
John Smith;New Yourk
Alex Diesel;Nikolaev

но можно обойтись и awk, благо есть целый набор функций для операций со строками, например gensub:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print gensub("^Name: ","","",$1),gensub("^Town: ","","",$2)}'
John Smith;New Yourk
Alex Diesel;Nikolaev

Функция ожидает указания: того что заменяем, того на что заменяем, опций для замены(здесь фактически можно указать только "g", - глобальная замена в строке - то есть заменять все найденные совпадения, а не только первое), и собственно строки в которой замену проводить, а возвращает строку-результат замены. Если gensub в вашей версии awk нет, скорее всего окажется gsub, gsub не возвращает результата замены, а сохраняет результат в той же самой переменной в которой мы дадим ей строку(возвращает эта функция как раз таки колличество проведенных замен, поэтому и возможности указать"g" в качестве опции не имеет, итого колличество параметров на один меньше), получится несколько длинее, но результат будет достигнут:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"}
{ gsub("^Name: ","",$1);
gsub("Town: ", "", $2);
print $1,$2
}'
John Smith;New Yourk
Alex Diesel;Nikolaev

Фактически, основная сфера использования awk - мелкие однострочники, иногда в состве shell-скриптов, сценариев на awk, занимающих более 20 строк я видел достаточно мало, - сколько-нибудь большие скрипты предпочитают писать на "олдскульном" perl, или "модных" ныне python, и ruby. В составе shell-скриптов иногда хочется передать awk значение какой-нибудь shell-переменной. Самый простой способ(но не единственный) это сделать вот так:


diesel@debian:~$ cat passwd_pattern.sh
#!/bin/bash
awk -F: '$1~/'$1'/{print $1}' /etc/passwd;

В качестве второго $1 подставится значение переменной $1 из shell'а - первый параметр переданный shell скрипту, например:


diesel@debian:~$ ./passwd_pattern.sh ^d
daemon
diesel

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


diesel@debian:~$ cat ./passwd_pattern.sh
#!/bin/bash
awk -F: '$1~/'$1'/{print "userdel " $1}' /etc/passwd;
diesel@debian:~$ ./passwd_pattern.sh ^d
userdel daemon
userdel diesel
diesel@debian:~$ ./passwd_pattern.sh ^d |sh

В awk вобщем-то есть и условный оператор, и разнообразные циклы, и еще много разных функций, обо всем этом рекоменду читать при необходимости man-страницу, там достаточно подробно все рассказано. Пост все-таки про "as I use it", и тот subset awk, который я использую, описан выше. На закуску сегодня будет еще один пример.


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

Допустим таблица база данных имеет вот такую структуру:


CREATE TABLE downloads(
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(30),
filename VARCHAR(256) ,
size BIGINT,
host VARCHAR(30),
ip VARCHAR(16),
action VARCHAR(8),
duration VARCHAR(8),
time timestamp NULL default NULL,
success TINYINT,
PRIMARY KEY (id)
);

Лог, который пишет proftpd по умолчанию выглядит вот таким вот образом:


Sun Jan 13 16:24:12 2008 222 192.168.62.53 40622476 /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb b _ o a ftp 1 * c
Sun Jan 13 16:24:24 2008 11 192.168.62.53 9030846 /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj7-0_4.1.1-20_i386.deb b _ o a ftp 1 * c
Sun Jan 13 16:24:24 2008 0 192.168.62.53 80180

А вот небольшой скрипт, который эти непонятные строки, превращает в что-то более полезное и осмысленное:


#!/bin/bash

FILENAME=$1;

if [ x"$FILENAME" == "x" ]; then
echo " Script for converting proftpd logs into mysql queries. Usage: $0 ";
exit;
fi

awk '{
if ( $18 == "c"){
success="1";
}else{
success="0";
}

month=$2;

sub("Jan","01",month);
sub("Feb","02",month);
sub("Mar","03",month);
sub("Apr","04",month);
sub("May","05",month);
sub("Jun","06",month);
sub("Jul","07",month);
sub("Aug","08",month);
sub("Sep","09",month);
sub("Oct","10",month);
sub("Nov","11",month);
sub("Dec","12",month);

time=$1" "$2" "$3" "$4" "$5;
time=$5"-"month"-"$3" "$4;
print "INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)"
print "VALUES (\""$14"\",\""$9"\",\""$8"\",\""$7"\",\""$7"\",\"RETR\",\""$6"\",\""time"\",\""success"\");";
}' "$FILENAME"


Работает это все примерно вот так:
diesel@debian:~$ ./proftpd-for-blog.sh test_log
INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)
VALUES ("ftp","/srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb","40622476","192.168.62.53","192.168.62.53","RETR","222","2008-01-13 16:24:12","0");
INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)
VALUES ("ftp","/srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj7-0_4.1.1-20_i386.deb","9030846","192.168.62.53","192.168.62.53","RETR","11","2008-01-13 16:24:24","0");
diesel@debian:~$ ./proftpd-for-blog.sh test_log | mysql -u root test_for_blog
diesel@debian:~$ mysql -e 'select * from downloads limit 1 \G' -u root test_for_blog
*************************** 1. row ***************************
id: 1
username: ftp
filename: /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb
size: 40622476
host: 192.168.62.53
ip: 192.168.62.53
action: RETR
duration: 222
time: 2008-01-13 16:24:12
success: 0

Да, конечно, INSERT можно(и даже нужно) не повторять на каждой строке, как модифицировать для этого написанное мной, предлагаю подумать самостоятельно. А я спешу откланяться, до новых встречь!

CLI, as I use it. part 1.

Не смотря на то что Linux-системы уже давно радуют нас хоть как-то развитыми графическими средами, еще сильно средневековое поверье о том что Linux - это прежде всего командная строка, и все надо делать с помощью командной строки. Как и любое другое поверье, какое-то отношение к реальности это, конечно же, имеет, но все же весьма опосредованное. Во-первых, каждый скажет, что далеко не обязательно все делать используя CLI-средства, многие современные системы можно установить и настроить для работы совсем к ним не прибегая. Во-вторых, неизвестное всегда страшит, в случае консоли боятся ее не стоит, лучше научится худо-бедно пользоваться - никогда не помешает, а может даже и помочь.

Достаточно много всего про shell, и традиционные unix-утилиты написано, но вопросы у людей все-равно продолжают возникать, никуда от этого не денешься. Я не собираюсь перекрывать мировой опыт использования unix с момента зарождения - мой личный достаточно скромен, равно как не хочу писать очередной туториал для новичков. Просто некоторые заметки о том как я этим всем пользуюсь, с некоторыми лирическими отступлениями.

Так или иначе, многим из нас приходится ежедневно работать с текстовой информацией. Часть информации ценна сама по себе - например, если вы продолжаете читать этот пост, то какую-то ценность для вас, информация здесь изложенная представляет. Есть же и такая текстовая информация, которая становится нам интересной после некоторой обработки. Возьмем например святая-святых всех линуксоидов - исходники ядра - очень много текстовых файлов, в которых сам черт ногу сломит. А "много" - это сколько?
diesel@debian:/usr/src/linux-2.6.20$ find -type f|wc -l
23638
Ого, и места же это добро наверное занимает много?


diesel@debian:/usr/src/linux-2.6.20$ du -hs .
283M
Не мало, да. Сколько же труда, пота и крови в это все вложено!

diesel@debian:/usr/src/linux-2.6.20$ grep -irE 'fuck' . |wc -l
51
Ага, программисты не стеснялись выражать своих чувств! Интересно, а что давалось тяжелее всего?

diesel@debian:/usr/src/linux-2.6.20$ grep -irE 'fuck' . |cut -d/ -f2 |sort | uniq -c |sort -n
1 Documentation
1 lib
2 fs
2 sound
4 include
5 net
12 drivers
24 arch
И вот уже какая-то ценность от огромной кучи непонятных файлов, после соответствующей обработки начинает появляться :). Пусть даже в данном конкретном случае ценность весьма относительная, аналогичная конструкция иногда оказывается действительно полезной.

Для себя могу выделить две большие группы задач, которые приходится решать достаточно часто, используя традциционные unix-утилиты: различного рода переформатирование текстовой информации, например, если мы имеем .csv файл, а хотим из этого дела сделать sql-дамп для того чтобы загнать потом этот csv в базу данных; а так же поиск и замена - тут я думаю примеров не надо. Так уже сложилось что для разного рода переформатирований чаще всего используется awk; традиционными инструментами для поиска и замены конечно же являются grep и sed; конечно же есть еще и перловые однострочники, но с одной стороны - это тема для совсем отдельного разговора; с другой - с однострочным perl'ом я знаком достаточно посредственно, поэтому много на эту тему рассказать не могу, perl чаще всего использую для "клинических" случаев, которых не так уже и много.

Пожалуй, на этом месте поставлю финальную точку, дабы не делать пост уж слишком длинным, а в следующих постах посмотрим на каждую из задач более подробно и с примерами.

суббота, 2 августа 2008 г.

podcasts vs. me

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

mp3-плейер, который я с собой постоянно таскаю у меня уже где-то года полтора, сначала был T.sonic 610, сейчас iPod Video, но за все время, единственное что удалось прослушать из аудиочтива - был какой-то рассказ, которого хватило на несколько поездок на работу. Сам читаю я хоть и достаточно быстро, но иногда останавливаясь, подумывая о том что прочитал, могу даже зависнуть надолго над обдумыванием мысли. Когда же текст читается тебе в уши, то успеваешь фактически только сам текст и ловить, а вот мысленное пережевывание полученной информации - теряется. Если же задумаешься - то потеряешь текст, прийдется отматывать назад. Нажимать на паузу - тоже так себе выход, ибо мысль о том что "я сейчас подумаю мысль, а потом продолжу", сама по себе перебивает мысль о которой хотел подумать :) Вобщем грустно это все как-то и неинтересно.

Причем тут все еще надо домножить на то что "плотность" информации в книгах гораздо выше чем плотность информации в обычном разговоре, - писатель ведь мог вымучивать свое творение годами! - в отличии от импровизирующих радиоведущих. Разговорное радио, кстати, я воспринимаю достаточно неплохо, и наше украинское Радио Эра, вещающее в FM-диапазоне, часто слушаю на кухне, пока готовлю еду, или эту еду поглощаю(да, я иногда не ем за компьютером). По ту сторону радиоэфира все-таки сидят такие же люди, как и все мы, и стараются говорить так чтобы было понятно и интересно.

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

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

Прослушивать это все дело можно по разному, один из типичных случаев: подписываемся на RSS-ленту подкаста, через программу которая знает о том что такое подкаст, и как это все дело качать. При адпейтах в RSS-ленте программа скачивает новые выпуски подкастов, а уж вы потом решаете как и где это добро слушать. В роли такого подкаст-агрегатора скорее всего может выступать ваш плейер. Под Mac'ом - это конечно же iTunes, под Linux с этим могут управляться например Amarok или Rythmbox. Если же в роли плейера на котором подкасты будут слушаться выступает iPod, то собственно с помощью этих самых программ их можно на iPod и скинуть.

Сразу скажу - идеального плейера, который умел бы еще и подкасты собирать я для себя пока не нашел. Под Mac'ом пользуюсь iTunes, основная проблема с ним, - иногда он недокачивает файлы, но никак об этом не сигнализирует. В итоге получается трэк длиной меньшей, чем оригинальный подкаст, и как всегда об этом узнаешь когда дослушал до конца, но оказывается что это еще не конец. Приходится удалять файл и перекачивать заново, что в iTunes как-то не очень-то и удобно делать(я бы сказал совсем неудобно). Конечно же, в плане копирования на iPod тут проблем не возникает. Есть также некоторые непонятки в плане управления тэгами подкастов, - которые не всегда прописываются одинаково, что не хорошо смотрится на "железном" плейере.

В Amarok проблем с загрузкой не встречал - если файл недокачан - он честно об этом пишет. Кроме того есть возможность достаточно легко ассоциировать скачанный сторонними программами файл, с конкретным подкастом в ленте. Тут, традиционно возникают проблемы с загрузкой этого всего добра на плейер: у меня терялись так называемые "show notes", терялась эмблема подкаста, про то что могут быть еще и видеоподкасты похоже Amarok тоже не в курсе. Про Rythmbox единственное что могу сказать - как-то оно работало, что-то даже качало, правда удобным мне этот плейер не показался, и не смотря на всю мою любовь в Gnome, в качестве плейера я все же использую Amarok.

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

По поводу того где стоит искать сами подкасты. В рунете, насколько я понимаю, есть два подкаст-каталога: http://rpod.ru, и http://podfm.ru. Кроме того некоторые сайты имеют собственные подкасты, а некоторые большие подкасты имеют собственные сайты, с которых рекомендуется и подписываться на соответствующие RSS-ленты.

rpod.ru - старейшая, и до недавнего времени единственная подкаст-директория, на просторах рунета, проект небезызвестного в узких кругах Василия Стрельникова. Через rpod собственно мое знакомство с миром подкастинга началось, но особого фанатизма, или же интереса к сайту как-то не возникает. Возникает ощущение свалки - можно найти и очень хорошие интересные вещи, но среди груды мусора попробуй их рассмотри. Сайт выглядит не больно-то и приятно, имеет вполне сложившуюся "тусовку", с которой, судя по коментам к подкастам, особо много общего у меня нет.

podfm - проект достаточно молодой, появился совсем недавно, подкастов там не так много, но, похоже, в процентном соотношении вменяемости и мусора, у rpod'а выигрывает. Интерфейс тоже как-то поприятнее будет.

Что слушаю я сам, и что мог бы порекомендовать послушать заинтересовавшимся. Стоит обратить внимание на творчество человека с ником Umputun. Во-первых, один из самых популярных в рунете подкастов - Радио-Т - еженедельный IT-подкаст, посвященный в основном обсуждение новостей, сплетен, слухов из около IT-шного мира. Ведущие - собственно сам Umputun,Bobuk, и с недавнего времени gray, - имеют большой опыт работы в IT-cфере, и каждую неделю делятся этим опытом с слушателями. Во-вторых, есть сольный подкаст Umptun тоже еженедельный в котором он делится своими впечатлениями за неделю. Подкаст менее хай-технический, но все же послушать приятно. Приятно в том числе и потому что Umputun много внимания уделяется качеству звука, своими опытами в этом направлении он делится в своем третьем подкасте - Теория и Практика Звукозаписи. Если вы решили записывать подкасты, и хотите чтобы это звучало более-менее пристойно - вам туда :). Не уходя далеко от Радио-Т, советую так же обратить внимание на подкаст gray'а "IT-мысли". Из подкастов на линуксовую тематику, нашел на podfm L-talk - послушать интересно, пока подводит качество звука.

Из подкастов "о жизни" - стоит обратить внимание на личную подкаст-ленту Артема Росновского, - автор настоящий радиоведущий, работает на радио Маяк, в свободное от работы время активно занимается продвижением подкастинга в массы. Подкаст хорошо поднимает настроение после тяжкого трудового дня :). До недавнего времени интересно было слушать "подкаст ни о чем" - Кадры. Соведущая Кадров - Оляпка - была в свое время соведущей Радио-Т, второй ведущей - Рахим(freetonik) - известен еще несколькими своими подкастами, а так же сайтом о подкастинге - http://www.podcastim.ru/. Последний выпуск "Кадров" который я слышал(он не последний из тех что есть на сайте) - как-то совсем не понравился, сложно сказать почему - наверное уж слишком много развязанности, и "ниочемности", первые выпуски были приятнее. Если запал новизны пропал, и подкаст вышел на свои обычные рейки, то пожалуй, от этих реек я отпишусь.

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

Ну и напоследок еще один IT-подкаст - Хабракаст - не смотря на не очень хороший звук - интересно. Подкаст делается по мотивам известного в рунете портала: habrahabr.ru. Однозначного отношения к Хабру у меня нет - все думаю может зарегистрироваться там, но как-то понимания того чего же там делать, не возникает. С одной стороны вроде и интересная штука; с другой - какая-то непрозрачно-враждебная в отношении новых пользователей. А подкаст слушается неплохо :)

Вот примерно и все что хотелось рассказать. Хм. вернее хотелось возможно и больше, но кажется и так пост каким-то уж очень большим получается, поэтому на этом месте резрешите откланятся. А слушаете ли подкасты вы? Чего бы интересного могли бы порекомендовать?

Книжное.

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

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

Если вспоминать более-менее не технические книги которые я за последние время прочитал, то вспоминается только одна, да и та с "привкусом" IT - очередная вариация на тему истории Apple и жизнеописаний Стива Джобса: iKona, Стив Джобс, Вильяма Л. Саймона и Джеффри С. Янга. Как показывают результаты гугления - это дело легче скачать, чем купить, хотя, у меня оно бумажное - так уж получилось. Книга не блещет особой литературной стройностью, но может быть интересна, для тех кому по каким-то причинам интересна сама тема. Про историю Apple и ее основателя написано достаточно много, даже на русском языке - это далеко не первый опус на эту тему, но почитать, наверное, какой-то смысл есть. Читать с монитора, или покупать бумажную - тут уж выбор каждый делает персонально, я, например, предпочитаю бумажные варианты, ибо как-то к чтению с монитора так привыкнуть и не смог, равно как с трудом понимаю читающих с мобильных телефонов и прочих девайсов в транспорте.

Совсем недавно где-то в RSS-лентах попалась ссылка на другой в достаточной мере интересный, околоITшный полулитературный опус Игоря Ашманова "Жизнь внутри пузыря". История времен небезизвестного "краха доткомов", где через призму работы автора над одним известным интернет-проектом показываются тогдашние реалии, которые неплохо и сегодняшним днем коррелируют. Полезные зарисовки, мне кажется.

Вобщем, какой-то небогатый набор, да и то все какое-то околокомпьютерное. Вроде и просится на язык фраза "надо бы и о душе подумать", но как-то думать особо не хочется. Да, думать как-то совсем не хочется :)

среда, 16 июля 2008 г.

Forum vs. Blogs. Попытка номер два.

Почему попытка номер два - я вобщем-то так назвал предыдущий пост про железо, не думал что железные размышления растянутся на многовато, а когда постил уже - забыл поменять топик, поэтому, возможно кому-то в RSS заголовок пришел совсем не тот который должен был прийти :)
Второе замечание - предыдущий же пост, включая немного кривоватую фотографию был набран и отправлен с помощью blogger-клиента Petrus Blogger: http://www.panteleyev.org/petrus-blogger/. Спасибо Dr.AKULAvich за подсказку. Во-первых скриншот:





Что могу сказать по поводу, из плюсов: он таки-да постит в блог, таки да умеет загружать картинки почти так же как это делается через вэб интерфейс; есть возможность редатировать и в pure html и в WYSIWYG. То есть по-сути все базовые вещи умеет, и пользоваться для постинга в блог этим можно. Чего не понравилось: во-первых немного странноватые интерфейс типа "окна в окне" - это особенность той java-библиотеки на которой он написан, или это задумка авторов такая? Во-вторых, для многих, возможным недостатком будет то что это счастье вобщем-то на java написано - мне как-то по большому счету пофигу. Далее - не понравилось окно выбора файлов - это не "нативное" Маковское окно, а что-то чужеродное, превьюшек выбираемых картинок оно не показывает. Ну и последнее - нет в нем проверки правописания - для мну как человека страшно безграмотного - хоть какой-то спеллчекер быть должен. Вобщем пока что штуковина на любителя, - возможно кому-то понравится, мне вот как-то идея прикрутить к emacs'у возможность постить почему-то нравится больше.


Переходя от блог-клиентов, к собственно задекларированной теме. Я не отношусь к любителям веб-форумов, да и любых веб-ориентированных штук в частности. Cтранным исключением тут будут только google docs - этот он-лайн сервис мне нравится значительно больше чем настольные офис'ы - в силу своей он-лайновости Google'у было сложно вогнать туда "всю ненужную мощь", и в итоге получилось неплохо. Но вобщем и в целом - хоть к постоянному прибыванию на всякого рода веб-ресурсах я привык, но особого восторга это прибывание у меня не вызывало и не вызывает. Более спартанские male-lists, и newsgroups, просматриваемые в любимом клиенте - как-то гораздо более привлекательней выглядят, по крайней мере для меня. Наверное поэтому и про блог-клиенты я тут заговорил, - дабы еще одним сомнительным вэб-приложением не пользоваться.Но так или иначе на веб-ресурсах, в основном форумах, я есть, есть досточно давно, и вобщем-то уходить от туда не собираюсь, если не забанят :) Основные форумы на которых я стараюсь бывать регулярно - linuxforum.ru, linuxforum.org.ua, forum.posix.ru; иногда еще забредаю на форумы местной локалки, хотя в списке приоритетов они где-то очень далеко. Вот что думается.



В свое время linuxforum.ru был таким себе клубом по интересам, заходили туда линуксоиды, флеймили по теме и о жизни, между делом помогая новичкам советами как освоится в новой для них системе. Даже не в самом начале, а два года назад, когда я туда пришел - все оставалось примерно так. Форум рос, и продолжает расти(и с какой-то стороны это радует) - но основной прирост все-таки идет не засчет вменяемых пользователей с которыми можно на равных пофлеймить по теме, а засчет страждущих новичков, которым нужен конкретный ответ на конкретный вопрос. В итоге некоторые разделы форума у мну вызывают легкое дежа-вю с такой-себе суппортовой тикет-системой(дежа-вю конечно усиливается тем что работать собственно с вполне себе настоящими тикетами приходится достаточно регулярно). Естественно когда ты в n-ый раз объясняешь как установить загрузщик, или поменять раскладку, собственно суть и смысл публичного общения - самовыражение - в достаточной мере теряется. Фактически таже хрень в некоторой степени укпрепляется и нашей модераторской позицей. И в то же время сами модераторы, и остальные "старички" в обсуждениях всплывают достаточно редко, не надолго, а чаще всего просто молчаливо читают, или тыкают в правила. В итоге это все осточертивает - и очередной модератор тихо и мирно(или не очень тихо, и не очень мирно, что вобщем к сути дела не относится) - сваливает, и начинается набор новых жертв.


Куда уходят с линуксфорума - не знаю, многих видел на ЛОРе, других - юниксинфо, кто-то был и есть на позикс,ру и так далее, у каждого свой путь. Как по мне - уходить еще на один форум, который в итоге превратится в очередную бездушную систему тикетов - смысла не имеет. Не нужно оно. В этом случае все-таки блогосфера, кажется более привлекательной штукой. Пост в свой блог - это в любом случае самовыражение, выражает оно твои мысли, по теме которая тебя так или иначе интересует - иначе зачем постить? Тоже самое относительно комментаторов - комментарии выражают мысли людей, которых данный пост чем-то заинтересовал. При разумном подходе к выбору читаемых блогов шансов увидеть в них вопросы типа "не могу раскладку переключить, фрэнды помогите", пожалуй, если не совсем нет, то почти нет. Да и потеряется оно такое на общем фоне. Правда, это касается отдельно взятого блога, и отдельно взятых читаемых других блогов. "блогосообщества" - типа LJ, или хабра, все-таки во что-то нездоровое при большом наплыве народу рискуют превратится. Правда, есть и обратная сторона медали - чтобы твой блог начали читать и интересно комментить, нужно все-таки время и силы потратить; на форуме с этим проще - прочитают твой пост так или иначе очень многие :)


Вот такие мысли странные. Получается как в той русской поговорке - там хорошо, где нас нет.

Hardware, мысли вслух

Вчера, возвращаясь домой, вот такую вещь подумал: я, да и многие из тех кого я знаю, очень большую часть зарабатываемых денег тратим на покупку новых железяк. У меня железяк скопилось достаточное колличество, ввиду того что отдельные куски своих систем я апгрейжу иногда, а старые девайсы продавать как-то особо не тянет; даже наоборот - стоит тут несколько старых девайсов, которые были куплены на поиграться для прикола. Вот что интересно в этом контексте - достаточно большую часть своего времени мы проводим собственно на работе - это как минимум 8 часов + около двух часов на то чтобы доехать туда и обратно. Если добавить к этому времени около восьми часов на сон, а так же не очень большое желание сидеть за компом еще и дома - у меня, например, такое все чаще появляется, особенно после того как появилась возможность слушать музыку фактически без помощи компьютера, - и вобщем-то не так уж и много времени остается на то чтобы с домашними крутыми железякими какие-то странности вытворять, разве что на выходных. Я собственно к чему веду - получается так что мы работаем, либо ради того чтобы достаточно ощутимую часть своих доходов оставлять вобщем-то в той же IT-отрасли, на которую работаем - это с одной стороны; с другой - если вы свои железяки еще и собственно для работы используете(я вот даже про несколько случаев слышал когда фактически домашний десктоп переносился на работу) - это получается работа ради покупки средств производства.


Какая-то нездоровая ситуация вырисовывается.

Вот кому интересно мой домашний беспорядок, снималось на Новый Год, сейчас есть еще как минимум два девайса которые появились позже :)


воскресенье, 13 июля 2008 г.

blogclients. scribefire. emacs.

Не знаю читают ли меня продвинутые блогеры - в списках рекомендуемой литературы в чужих блогах ссылок сюда не помню, и судя по google analitics, большАя часть посетителей сюда приходит из поисковиков и второй раз не возвращается. В любом случае - если вы ведете блог, и вам есть чего сказать по теме - будет интересно послушать.

Практически все заметки этого блога были написаны собственно в редакторе blogger'а. Не знаю в какой мере это можно считать извращением - особых изысков при вбивании текста мне вобщем-то не надо, а всякие мелких приятностей типа визуального редактора, и возможности при необходимости подправить HTML - вобщем-то хватало. Несколько постов, ЕМНИМ, я писал в vim'е, а потом просто копипейстал в блог, и доводил до презентабельного вида, два из трех поста про Mac-ощущения, как я уже говорил, писались в NeoOffice, а потом так же копировалось в блоггер, и через блоггерский движок уже подставлялись туда картинки.

Про то что есть софт для публикации сообщений в блоги я слышал краем уха с достаточно давних пор, правда никак руки не доходили попробовать. Но вот не далее как вчера, копаясь в рекомендуемых extensions для firefox3 на addons.mozilla.org набрел на scribefire - плагин для публикации сообщений в блоги(https://addons.mozilla.org/ru/firefox/addon/1730) - и решил попробовать. Авось понравится, и я буду по два поста в день строчить. Список блог-хостингов и движков которые поддерживаются плагином можно найти по адрессу: http://blog.scribefire.com/help/supported-services/. http://www.blogger.com/ в них значится, и вобщем-то оно действительно к нему коннектится, получает список уже опубликованных постов, насколько я понимаю позволяет редактировать их, и новые посты постить.

Из удобностей - простой текстовый редактор, который позволяет и редактировать в режиме - "шо вижу, то и будет", и править HTML непосредственно. Как я уже говорил - навигация и возможность редактирования уже опубликованных сообщений, возможность все это дело постить непосредственно в блог, через соответствующие API. Если залогинится на блоггер, то появляется еще и такая себе дополнительная панель с сомнительной полезности функционалом.

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

Вобщем начал я писать предыдущий пост, и захотелось мне первый скриншот с xmonad в mac'е добавить, но тут ждало меня первое разочарование - картинку выбрал, сказал "юзай API для загрузки"(потом FTP тоже попробовал), оно начало делать вид что что-то загружает, и делало вид этот где-то минут пять, пока я ходил за новой порцией чая. Вобщем так картинка никуда и не загрузилась. "Ну и черт с ним, картинки можно добавить потом через веб-интерфейс" - подумал я, и продолжил вымучивать из себя слова и вбивать их в СкрайбФайровский текстовый редактор.

Долго ли, коротко ли, но по прошествии некоторого времени браузер подвис, а секунд через тридцать, когда я уже успел испугаться, что плод моих творческих мучений сгинул в Лету, получил я от браузера окошко - так мол и так, firebug(да, он где-то там крутится) висит, не хотите ли это безобразие прекратить, я сказал что хочу - и вроде бы как все растормозилось, но не успел я перевести дух, как все началось по новому кругу. Вобщем в какой-то момент мне удалось скопировать уже написанное, вставить в Aqua Emacs(это такой Mac'овский гламурный user-frendly порт GNU/Emacs), и фактически, бОльшую часть поста я написал в этом самом Aqua Emacs. В отлиии от vi(m) emaсs'ом в его GUI-реинкарнациях можно пользоваться даже ничего о нем не зная - правда тогда он будет мало чем отличаться от блоконта, но нужно ли для написания поста в блог что-то круче блокнота - это тот еще вопрос.

Вобщем вот такой вот немного странный опыт ScribeFire получился. Этот пост я продолжил набирать в Aqua Emacs - вполне себе редактор для plain-text, хотя и явно "из пушки по воробьям". Правда при русской раскладке отказываются работать хоткеи - но вобщем-то не не только emacs этим страдает - пережить вполне себе можно.

Во время написания этих строк, подумал что вполне себе может быть клиент blogger'а для emacs'а - ведь API вполне себе открыт, и таки да - первой же ссылкой google наставил меня на путь истинный: http://buzz.blogger.com/2007/03/emacs-client-for-blogger.html. Правда вот запостить с помощью этого дела пока ничего не получилось.

А как постите свои посты Вы?

Mac Notes.

Хотел начать пост с того что пишу я это все в свежеустановленной Федоре, а MacBook отдыхает рядом, но в итоге все-таки получается наоборот - размеры берут свое - лежать на диване с MacBook'ом гораздо приятнее. Лежать с кем-то более живым, конечно, еще более приятней, но и маленький белый брат, за неимением лучшего, пожалуй, сойдет.

Как-то я не особо продуктивно пишу в блог - и сколько не обещаю сам себе исправиться и писать регулярно - исправиться не получается. Слишком много составляющих должны сойтись дабы появилось время, желание и возможность черкнуть сюда пару новых строк. Собственно от дневниковых записей в стиле "сегодня был в кино. терминатор-3 - полный ацтой, Рэмбо наше фсе" я стараюсь удерживаться, а большие темы все-таки требуют некоторого времени для подготовки. Но есть так же много мелочи, которые на многословные комментарии особо не тянут, но отложить их в памяти хочется.. Могу проаннонсировать желание отдельно описать то как я настраивал свой proftpd, а так же давно зреет в мозгу ода тайловым файловым менеджерам вообще, и xmonad в частности. Правда дабы такую оду воспеть надо все-таи допилить свой конфиг до состояния, когда хотя бы я сам буду им доволен.

Да, к слову про xmonad, запустил его на OS X, в тамошних Х-ах, пока что just for fun - де-факто из Х-овых приложений у меня там только xterm и xclock из стандартной поставки Xquartz, поэтому особо на практике пользоваться там нечем. Выглядит это все примерно вот так:


С другой стороны заметил какие-то глюки с копированием из/в xterm запущенного в Xquartz, глюки примерно с тем что фактически копирование позволяется в один конец - если копирвать из xterm - все хорошо и замечательно, если копировать из не-иксового приложения в xterm - ничего не получается. Да, особой дружбы с русской раскладкой, тоже не замечено, а при коннекте через XDMPC к linux-машине особой дружбы и с английской раскладкой почему-то нет - такое ощущение что клавиши начинают спецсимволы какие-то генерировать. Возможно оно где-то докручивается и донастраивается, но ощущение вобщем-то испорчено. Судя по http://forums.macosxhints.com/showthread.php?t=80171 в Леопарде с Х-ами не все так хорошо как хотелось бы... возможно не только с Х-ами :). Вобщем идеального софта - нет, и я бы даже не сказал что софт производимый в Apple, на общем фоне sucks less. Просто немного по-своему :-).

Продолжая Mac'овскую тему - фактически последние две недели я проработал на MacBook - и дома, и в оффисе. Честно говоря не знаю насколько это распространенная практика разрешать или запрещать сотрудникам работать на их собственных лэптопах в оффисе, и насколько часто люди этим запретом пренебрегают, или наоборот такой дозволенностью пользуются. У нас подобные штуки мягко говоря не практикуются, хотя особых причин на это со своей колокольни не наблюдаю.

По итогам двух недель ощущения получились самые смешанные. С одной стороны - достаточно удобно использовать одно и то же окружение и дома и на работе, не заботясь о синхронизации настроек, данных, не путаясь в очень разных клавиатурах, хоткеях и так далее(хотя по правде сказать, между двумя разными клавиатурами я переключаюсь достаточно легко - вот с третьей уже может возникнуть путаница). С другой стороны я не очень много времени провожу за компьютером, дома в будние дни - вечером(а вернее ночью) не остается особого желания после рабочего дня, утром - разве что новости да форум читаю за чашкой чая - особо вобщем-то с новой системой не наиграешься - а с новой игрушкой хочется как известно играться все время. Правда, совсем "на поиграться" времени особо не остается и на работе - последние несколько недель(heh, по большому счету последние несколько месяцев) - были достаточно напряженными, даже не смотря на попытки переложить со своих плечей на чужие как можно больше всего. Вобщем спасибо Маку за то что скрасил трудовые будни. Думаю для более комфортной работы - надо бы вставить побольше памяти, хотя и с гигом вобщем-то достаточно комфортно, при том что практически сутками открыт Neo Office.

"Рабочим" приобретением в наборе софта стал блокнотик sidenote(http://www.chatelp.org/?page_id=5) - не скажу что тянет не полную замену Tomboy, которым я пользуюсь в linux, но из соображений цена/качество чего-то лучшего не нашел пока. В данном случае цена/качество - это даже не про сумму в долларах(sidenote бесплатен, но к сожалению без исходников) ... большая часть приложений из списка: http://theappleblog.com/2007/01/22/note-taking-application-faceoff/ показалась какими-то монстрами(по-сути с соответствующей ценой) - мне настолько продвинутого не сильно-то и надо. Что есть в sidenote? - работает оно примерно по тому же принципу что и автоскрытие панелей: закрепляется это дело в какой-то части воркспейса, при наведении на него - всплывает окно с заметками. Список заметок "одноуровневый" - строить сложных иерархий нельзя, - правда можно заголовки заметок раскрашивать. В принципе, сложных "деревьев" на основе заметок делать мне как-то и не особо надо. Прикреплена эта штука у меня по левому борту, spaces настроены так чтобы видеть окно sidenote на каждом воркспейсе - если активно эти самые spaces использовать - весьма полезная настройка. Из того что немного напрягает - по ширине увеличить размер окна можно до некоторых пределов, - по высоте - ну совсем никак. Умолчательное поведение - когда мышка покидает просторы окна sidenote'а - это окно быстренько сворачивает, а тебя перекидывает на приложение которое было активно до этого - если приложение было активно на другом воркспейсе - перекидывает на другой воркспейс - иногда раздражает. Ну еще и берет свое известная паранойя - разные данные туда попадают, некоторые никому показывать нельзя, а фиг его знает не шлет ли это счастье эти заметки куда-нить за моря океаны.

Да, вот как раз в связи с тем что надо было настроить показ окна sidenote на всех рабочих столах, заметил наконец-таки соответствующую настройку в конфигураторе spaces, сразу же добавил туда сложившуюся схему растаскания окон по рабочим столам:




ПостСкриптум: Хм. Вобщем-то начинал я с Федоры, и этот пост планировался совсем про другое, но неожиданно получились вот такие вот Mac Notes, ну может оно и к лучшему. Про Федору вот что хочу сказать. Вчера на моем столе оказался подопытный кролик - второй ноут, на который хотелось поставить новую систему, и фактически три десктопных дистрибъютива вышедшие за последнее время: Fedora 9, Ubuntu 8.04, openSuSE 11. Подумалось об удивительной(?) схожести всех трех систем ... ну в какой-то мере схожести. Все три являются по-сути достаточно сложными системами "внутри", с вполне неплохой "наследственностью". Наборы доступных пакетов - вполне себе сопоставимы, где-то лучше, где-то хуже, но вцелом есть почти все что хочется. В каждой из систем есть свои мелкие глюки, в одной что-то сделано лучше, чем в другой. Не смотря на заискивания перед новичками - во всех трех будет вполне себе комфортно работаться опытному вменяемому пользователю(себя вменяемым считаю, некоторый опыт вобщем-то тоже где-то есть в наличии). Вобщем-то нет никакой разницы какую из них ставить по большому счету - нет. Поставил Федору - она уже записана на ДВД, SuSE еще бы надо было записывать, а Ubuntu мне как-то субъективно все-таки не нравится - лучше тогда уже Дебиан, но конструировать систему сейчас не хочется, хочется так чтобы надо было настраивать только то что действительно надо :). Поставил. Работает.

воскресенье, 22 июня 2008 г.

MacBook, первые ощущения :) Часть третья. Последняя.

Где-то с ноября прошлого года я начал активно использовать так называемые tilling windows managers. Долго примерялся к wmii и dwm, но в итоге установил свой выбор на ion3 который достаточно долго просуществовал на родимом десктопе. Позже начал поглядывать в сторону xmonad – уж очень сильно подкупила интеграция этого чуда хаскелловской мысли в мой любимый Gnome. Собственно связка Gnome+xmonad в данный момент в linux'е для меня является рабочей, не смотря на то что конфиг еще не допилен, и оставляет желать лучшего.

Большие опасения при покупке Мака как раз вызывало то что нормального тайлинга с OS X совместить не получится. Да, можно собрать любой виндовс менеджер и гонять это все дело в Х-ах, но при этом свою прямую задачу – управление окнами, он так же будет выполнять только в этих самх Х-ах, и сочетать приятное с полезным не получится. В принципе, где-то так оно и есть на самом деле. Правда, некоторые продвинутые возможности для управления окнами доступны через AppleScript, нашел буквально сегодня и особо пока не вникал. Вот например http://www.doernte.net/software практический пример использования

Если постараться сформулировать коротко то на чем основана моя любовь к tilling WM's – то это будет что-то примерно “все под рукой”. Я как правило не раскладываю максимизированные окна по разным рабочим столам, очень редко использую больше двух рабочих столов, чаще всего один с намертво вколоченной схемой рассположения “фреймов”. Чтобы было понятно о чем идет речь:


Полоска справа отведена в основном под ростер и tomboy, и еще пару мелочей, которые туда отлично влазят. В верхнем фрейме чаще всего firefox, thunderbird, чат, office итд, в нижнем – терминал(ы). Такая схема кажется мне удобной для большинства рабочих задач, в основном из-за статического расположения окон - подгонять размеры, ресайзить, а потом случайным жестом мышки это все сбивать - не очень интересно. С другой стороны – тыкать мышей в заголовок окна которое хочешь увидеть гораздо логичней, чем тыкать в панель задач и ждать что нужное окно появится совсем в другом месте, никак не связанном с положением “кнопки” на панеле задач, перекроет между делом что-то нужное, и снова нужно будет двигать, ресайзить, и далее по списку :) Но Leopard тайлинга в состоянии по-умолчанию не умеет, и очевидных способов заставить уметь нативно я к сожалению пока не нашел. Если кто знает – подскажите – will be appreciated.

Но кое-что быстрой зубастой кошке все-таки под силу. Итак, все очевидные удобства организации рабочего места стоят на нескольких “китах”. Во-первых, конечно-же dock. В OS X нет привычной многим панели задач, с ее неприменными атрибутами: кнопкой “Пуск”, кнопками быстрого запуска, списком окон открытых приложений и треем. И вобщем-то не зря нет – по-факту традиционная windows-style панель – это размножение ненужных вам сущностей. Это как минимум два способа запуска приложения, и как минимум два места через которые до запущеного приложения можно добраться; причем стиль работы здесь примерно один и тот же – если не нашел нужного в одном месте – смотри в другом. Зачем это все если можно сделать гораздо проще? - одна “кнопка” может служить и для запуска приложения, и для индикации какой-то ифномации о текущем состоянии дел, и для того чтобы добраться до нужного окна, ну и некоторые функции по управлению собственно самим приложением можно осуществлять. Самая ближайшая аналогия – это если бы кнопки быстрого запуска были еще и треем. В среднем не так много программ используется ежедневно, все их можно поместить в dock и по мере необходимости запускать. Да, аналоги дока есть под линукс, но полного look & feel'а они не передают, а look без feel'а - пустая трата рабочего пространства.

По-дефолту dock располагается внизу, он достаточно большой, и красиво-трехмерный. Я сделал его поменьше, и подсмотрев на чужом рабочем столе идею - перенес его вправо. Все-таки место по горизонтали мне не так дорого как лишнее место по вертикали. Кроме того как-то эта вся трехмерная красивость для постоянного использования мне не то чтобы сильно понравилась, поэтому с помощью замечательной утилитки SuperDocker привел это все счастье к более уравновешенному виду:


С SuperDocker следует быть поосторожнее несколько раз при изменении конфигурации дока он этот док убивал – как вернуть безболезненно док на место я еще не знаю, поэтому просто перезагружался(вернее перезагружался сложно, но это другая история).

Следующей леопардовой удобностью будут знакомые пользователям linux рабочие столы, здесь это называется “spaces”. Насколько я помню по-дефолту предлагалось использовать четыре – в принципе все четыре я и использую: один для терминала(ов), один для почты, один для браузера, и еще один для всего остального. Распределение не очень четкое, но стараюсь соблюдать. Переключение между рабочими столами по-дефолту на Cmd+стрелочка, переключение устроено удобно – так что с любого стола можно попасть на любой(можно перемещаться по диагонали). Вобщем, очень добротно сделанная штука, - пользоваться с дефолтными настройками гораздо приятнее чем рабочими столами в тех де кедах или Гноме. По сути, каждому приложению – свой рабочий стол может быть во многом неплохой заменой тайлингу(но не полной, и местами неудобной).

Еще одна штука которой я активно пользуюсь: active screen corners. Пользователям компиза и иже с ним должно быть знакомо – подводишь мышу в какой-то из углов экрана и при этом выполняется какое-то определнное действие. У меня это:

левый верхний угол – первью окон на рабочем столе(достаточно быстрый и удобный способ переключения между окнами мышей),





левый нижний угол – превью рабочих столов(опять же быстрый и удобный способ переключится между рабочими столами с помощью мыши + перетащить на какой-то рабочий стол окно приложения),



ну и правый верхний - just for fun – dashboard.



В dashboard я в основном смотрю прогноз погоды ( хех, прикольная штука), и параметры состояния компутера ( Торонтовское время тоже иногда полезно знать, да :) )

Предвосхищая комментарии типа “в линуксе это тоже можно сделать”. Да, я знаю что можно, - пробовал разные варианты доков, игрался с компизом, бериллом – эффекты такие есть естественно – смотрится прикольно, но вот пользоваться этим каждый день откровенно неудобно, - похвастаться перед гостями – да, можно, - но реально использовать – у меня не получается – какое-то оно все мыльное, сколькое, местами слишком плавное, местами слишком резкое и так далее. На маке оно работает так как должно работать – красиво и удобно, и без лишних мучений с настройкой. compiz – это не тот WM который я готов настраивать долго и упорно – либо сразу хорошо, либо досвиданья – пока получается “досвиданья” :)

Еще одна маковская особенность – меню приложений располагается не в окне самого приложения, а вверху экрана, поскольку меню все-равно чаще всего не занимает всю ширину – остальное место отдано под различные индикаторы. Опять же – почти тоже самое можно настроить в КДЕ, но там насколько я помню индикаторы в эту менюшку всунуть нельзя было – итого все-равно нужно было куда-то еще лепить вторую панель. Пользоваться этим достаточно удобно - для того чтобы добраться до меню активного приложения достаточно просто дернуть мышкой вверх, и подвести ее к нужному пункту – это немного быстрее чем аккуратно подводить мышку к нужному пункту в меню приложения. Особенно если это не мышка а тачпад :)

Тачпад удобный, опять же feel гораздо приятнее чем на обычном ноутбуке. Возможности по настройки приятно удивили. Кроме просто перемещения курсора: возможность горизонтальной и вертикальной прокрутки – если прикасаться к тачпаду не одним, а двумя пальцами, “двойное дотрагивание” одним пальцем – щелчок левой кнопкой мыши, тоже самое но двумя пальцами – правой. Кнопка у тачпада одна :) - чтобы клинкнуть ею как правой кнопкой мыши нужно еще зажать Ctrl. В этом есть свои плюсы – попасть не по той кнопке будет проблематично :)

Для тех кто привык пользоваться мышкой в Windows или Linux, поведение мыши в Mac OS может показаться несколько необычным. Суть проблемы примерно в том что Mac'овский подход почти исключает “ускорение” мыши. Подробнее это все описано , например вот тут: http://db.tidbits.com/article/8893 так же можно почитать: http://www.codinghorror.com/blog/archives/000977.html и http://www.microsoft.com/whdc/archive/pointer-bal.mspx. Утилитка: http://www.knockknock.org.uk/mac/ для Леопарда собирается и вполне себе работает. В какой-то мере помогает вернуть привычный способ движения грызуна.


Чуть более подробно о программах.
  • браузер – firefox 3 , ставил еще как релиз-кандидат, слышал что второй фокс под маком работает как-то не очень, - ничего не могу сказать, даже не пытался ставить. Расширения – пожалуй что тема для отдельного разговора – они платформо независимые. Единственное что в этом плане хочется заметить – тема GrApple Delicious(blue) – выглядит как-то более по-маковски, firefox становится совсем похожим на местную safari. Про safari ничего ни хорошего, ни плохого говорить не буду – особых причин на то чтобы заменить ею привычный мне firefox не вижу. Где-то валяется скаченная opera 9.5 – но что-то руки не дошли пока поставить.
  • mail-клиент - thunderbird. Таки нашел куда в эппловском Mail.app засунули фильтры, но это не единственный вопрос к этому мейл-клиенту, да и менять опять таки привычный и проверенный thunderbird на странное Apple'овское изобретение, пожалуй все-таки не буду.
  • im-клиент – adium. Adium – это такой свободный мультипротокольный im-клиент, написанный поверх pidgin'овской libpurple. Как ни странно, но Pidgin мне кажется более удобным и очевидным, но увы, с GTK под OS X не все так хорошо как хотелось бы, потому пока что Adium. На местный iChat смотрел – не понравилось. Больше всего убило абсолютно странное желание иметь для каждого включенного аккаунта свой ростер – это я почему еще вспоминать должен в каком ростере кого искать? Возможно такое странное поведение где-то отключается, но кажется это такая фича которую надо включать по требованию, а не искать где выключить.
  • office – целая куча оффисов есть под маки, включая всем любимый ms office, его свободный конкурент Open Office, ну и Apple'овский iWork. Основным “рабочим” офисным пакетом для меня безусловно является он-лайновый Google Docs. Некоторые вещи приходится редактировать оффлайново, но это от случая к случаю. Для таких случаев поставил NeoOffice – это такой себе порт OpenOffice на Mac, вполне приличный, как на мой неискушенный взгляд. Работал с таблицами, вот сейчас этот пост пишу в NeoOffice Writer'е – вроде неплохо :)
  • терминал – пока что Terminal.app. Судя по тому что по предидушим четырем пунктам выбор редакции пал на не-Apple'овское решение, логичным было бы поискать замену и этому, хотя и тут вроде как раз все устраивает. Про странную проблему с bashrc уже рассказывал. Из того что может быть необычно для привыкших работать в терминале под linux'ом или виндой – по умолчанию Home/End настроены на “scroll to the start/end of the buffer”, а привычная их функциональность повешена на shift+home/shift+end. Если учесть еще что на буке home/end это на самом деле Fn+<- Fn+->, - нас по-сути заставляют давить три клавиши, для такой вобщем-то весьма обычной операции. Можно просто поменять хоткеи местами. Странно что настройки хоткеев для каждой конкретной темы свои, для чего такие сложности - немного непонятно.
  • мультимедия – iTunes для аудио и подкастов, vlc для фильмов. perian качал, пробовал поставить - что то не захотел ставится он, да собственно и не очень нужно: vlc мну устраивает полностью – умеет играть, ну и пусть себе играет :) iTunes'ом я пытался пользоваться и под виндой – какой-то он там тормозной и глючный, особенно если речь идет о работе с iPod'ом. Под Mac'ом тормозов и глюков не замечал, ну разве что странная привычка недокачевать подкасты. Недокачает, сохранит, и хрен его убедишь что перекачать надо – кнопки “перекачать” не предусмотрено, и алгоритм исправления примерно такой: удалить старый трек, обновить список подкастов в ленте(что само по себе как-то непросто), закачать заново.
  • console tools – бродя по сайту apple наткнулся на замечательный сборник классических unix'овых утилит которые в OS X не попали – http://rudix.org/. Вобщем-то оно для Tiger'а но на Leopard вроде поставилось. И даже ничего не упало. Во всяком случае пока губительных последствий не ощущается :)

Ну вот примерно и все что хотелось рассказать о первом опыте работы с OS X. C момента покупки прошло чуть более месяца, пока что не жалею. Я далек от идеализации MacBook'a как единственного правильного ноута, и Mac OS X как единственно правильной системы. Есть здесь и свои плюсы и свои минусы, и свои удобства и свои странности. Выпячивая глаза кричать “Mac наше фсе” пожалуй не буду, но и отговаривать тоже не стану. Если интересно – попробовать стоит, в конце-концов если не понравится можно поставить винду или Linux, и особо не парится по этому поводу :)