Hatred's Log Place

DON'T PANIC!

Mar 15, 2010 - 1 minute read - Comments -

Emacs и пустые меню

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

Собственно вот так это выглядит, открыт C-файл и выбран пункт меню C:

Поиск привел на английски форум ArchLinux: http://bbs.archlinux.org/viewtopic.php?id=83860, собственно от туда варианты решения: 1. выполнять команду: M-x accelerate-menu 2. установить переменную окружения GDK_NATIVE_WINDOWS перед запуском Emacs:bashexport GDK_NATIVE_WINDOWS=1

И сразу на правах рекомендации: Doxymacs

И ещё одна рекомендация, статья Алекса Отта по настройке CEDET: http://alexott.net/ru/writings/emacs-devenv/EmacsCedet.html

Mar 11, 2010 - 3 minute read - Comments - programming

Делать было вечером, делать было нечего

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

Код:

#!/bin/bash

### Удаляет ваши сообщения или рекомендации с Juick.com

# section может быть: blog, recomm
section="blog"
# имя блога, по сути - ваш ник
blog="vasya"

# Jabber account, в котором у вас зарегестрирован juick@juick.com
jname="vasya.pupkin"
jpass="superpassword"
jserv="jabber.ru"

## BEGIN ##
u="http://juick.com/$blog/?show=$section"
tmp_file=tmp_$section.txt
while true
do
  # посты со страницы будут удалены, соответственно их место
  # займут более старые
  lynx -dump "$u" > $tmp_file

  # Вычленяем ссылку на следующу страницу
  tmp=`cat $tmp_file | grep 'Older ->' | grep '|'`
  if [ -z "$tmp" ]; then
    next_num=`cat $tmp_file | grep 'Older ->' | awk -F']' '{print $1}' | sed 's| <br/>[||'`
  else
    next_num=`cat $tmp_file | grep 'Older ->' | awk -F'|' '{print $2}' | awk -F']' '{print $1}' | sed 's| <br/>[||'`
  fi
  # да, этаким мы сделаем trim, сделайте при помощи sed, будет элегантней (и просто)
  next_num=`echo $next_num | awk '{print $1}'`
  next_link=`cat $tmp_file | grep "$next_num. http://" | grep "show=$section" | grep 'page=' | awk '{print $2}'`

  cat $tmp_file <br/>
              | grep '<br/>[[0-9]*<br/>]#[0-9]*,' <br/>
              | grep 'now<br/>|ago' <br/>
              | awk '{print $1}' <br/>
              | sed 's|^<br/>[[0-9]*<br/>]||;s|,$||' <br/>
              | while read line
              do
                post_num=`echo $line | sed 's|^#||'`
                action="D"

                [ x"$section" = x"recomm" ] && action='!'

                echo "Delete/unrecomend post: $line (http://juick.com/$post_num)"
                echo "$action $line" | sendxmpp -u $jname -p "$jpass" -j $jserv -s 'bye' juick@juick.com

                sleep 10
              done

  # А вот когда указателя на следующую страницу не будет, тогда выходим
  if [ -z "$next_num" ]; then
    break;
  fi
done

Для чего не спрашивайте, просто стало интересно написать :) Для работы нужно: * bash * lynx * sendxmpp

Счастливые арчеводы могут первые два пункта поставить из репозиториев, а sendxmpp собрать из AUR: http://aur.archlinux.org/packages.php?ID=17929

UPD: спасибо камраду sandr1x , в Ubuntu/Debian работа программы sendxmpp (там кстати её версия указана как 1.18, хотя актуальная - 0.0.8) завершается с ошибкой:

Can't use an undefined value as a HASH reference at /usr/share/perl5/XML/Stream.pm line 1165.

С подобным поведением сталкивались на работе когда настраивали sendxmpp для отправки уведомлений. Решение такое: открываем файл /usr/share/perl5/XML/Stream.pm переходим на строку указанную в ошибке (1165), находим чуть выше ее строку:

    delete($self->{SIDS}->{$currsid});

и заменяем на:

       delete($self->{SIDS}->{$currsid}) unless $currsid eq $sid;

Примерный патч выглядит так:

--- /usr/share/perl5/XML/Stream.pm.orig 2007-07-10 21:16:47.000000000 +0400
@@ -1160,7 +1160,7 @@
                $self->{SOCKETS}->{*STDIN} = $sid;
        }

1.       delete($self->{SIDS}->{$currsid});
+       delete($self->{SIDS}->{$currsid}) unless $currsid eq $sid;

    if (exists($self->GetRoot($sid)->{version}) &&
        ($self->GetRoot($sid)->{version} ne ""))

Файл принадлежит пакету libxml-stream-perl версии 1.22 в ArchLinux это пакет perl-xml-stream версии 1.23, там данные исправления уже присутствуют, так что если есть возможность - обновляемся, или ставим Arch, правда не задаем глупых вопросов, а то новоявленные арчеводы ex-убунтоиды ими уже на форуме поддостали :)

Mar 10, 2010 - 1 minute read - Comments - programming

Porting Unix Software

Пользительная книжка, не лишне держать под рукой:

http://www.lemis.com/grog/Documentation/PUS/

Книжка представлена в виде единого PDF и отдельных PDF для каждой части.

И прицепом: Object-Oriented Programming With ANSI-C

Если у кого есть ссылка на переводы - киньте в комменты.

Mar 7, 2010 - 2 minute read - Comments - linux

Из одной установки ArchLinux

Подогнали тут машинку, мамка Asus CUBX-L, процессор Intel Celeron 600MHz, RAM около 415Mb (free кажет 416800Kb, что-то не могу подобрать комбинацию, там 3 планки стоят). У меня вообще в последнее время какая-то тенденция с оживлением всякого старого железа, лотеком прям себя ощущаю.

Образ с которого устанавливаюсь 2009.08, так вот, на машинке или сам привод немного подгоняет, или диск так записан (возможности проверить на другом нет), но при попытке установке пакетов, вылетает на том, что не может проверить контрольные суммы у некоторых пакетов. Причем, установка пакетов у меня выбрана не с диска, а с сети - благо у меня локальное зеркало есть. Это навело на мысль - удалить пакеты, чтобы перезакачались: была такая проблема на моём EeePC - подглючивала сетевая карта.

Сказано - сделано. Иду в /mnt/var/cache/pacman/pkg и… правильно, пытаюсь удалить некорректные пакеты, а оно мне что? А оно мне говорит - а нет таких файлов. Опппппааааа… ЧДКВ?

Смотрю какой командой запускается pacman: pacman –root /mnt –config /tmp/pacman.conf –noconfirm -S <список пакетов>

Смекаю, я же зеркало выбирал, значит должно быть отражено в конфигурационном файле, а вдруг там ещё что, понаписано… Открываю: nano /tmp/pacman.conf

и что я вижу? там в секции [options] указаны два параметра для CacheDir, один верно ведет в /mnt/var/cache/pacman/pkg, а другой, на те пакеты, что на диске: /src/… и так получилось, что пакеты, на которые ругалось, не изменились с августа прошлого года, а т.к. диск/привод гонят - прочитаться не смогли, на что ругнулось, что контрольные суммы не получилось просчитать.

Удаляю эту строчку, после чего возвращаюсь на пункт Install packages и пробую заново устанавливать пакеты - удача :)

To be continued…

Feb 28, 2010 - 2 minute read - Comments -

Несколько заметок по работе с Gitorious.org

Сам проект - git-хостинг. Там же хостятся проекты Qt (http://blog.gitorious.org/2009/05/11/welcome-qt/, http://qt.gitorious.org/), Qt Creator (http://qt.gitorious.org/qt-creator).

  1. регистрируемся, но, т.к. это не рашин стартап, поддерживается и вход по OpenID , что мне очень удобно и вкусно.
  2. при помощи ssh-keygen сгенерируйте ключ: cd ~/.ssh ssh-keygen -f id_rsa_gitorious
  3. после в веб-морде: Your dashboard (вверху) -> Manage SSH keys (в главной области окна) -> Add SSH key (в колонке справа), вставить туда содержимое ~/.ssh/id_rsa_gitorious.pub и жмякнуть Save
  4. у себя же, создать файл ~/.ssh/config, в котором должно содержаться примерно следующее: Host gitorious.org IdentityFile ~/.ssh/id_rsa_gitorious что бы для сайты автоматом выбирался нужный ключ.

Теперь несколько заметок по работе.

  • заходим в нужный проект, выбираем репозиторий, в колонке справа появляется возможность клонировать репу. На ней делать изменения и потом комитить мерж-реквесты.
  • создать свой проект: Your dashboard -> Create a new project… (колонка справа) дальше все понятно: задать нужные поля, выбрать лицензию и т.д.
  • в проекте можно создавать репозитории, находясь в проекте: Add repository… в колонке справа, после создания проекта, будут даны рекомендации, что нужно сделать, что бы залить его после (подготовительные шаги для ssh мы сделали выше)

Пока не существует возможности создать приватный репозиторий, но работа ведется: http://groups.google.com/group/gitorious/browse_thread/thread/af08be1e6dd70b95/614e96c2f886b7fb?lnk=gst&q=private#614e96c2f886b7fb

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

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

Сам код Gitorious хостится здесь же, можно скачать и развернуть подобную систему у себя. Для пользователей ArchLinux доступен через AUR: http://aur.archlinux.org/packages.php?ID=34713

И есть одно больше отличие от того же github.com (ещё я там не нашел вход по OpenID), это то, что место для пользователя нелимитировано, есть только одно ограничение: объем трафика в месяц не больше 500 Мб, но если нужно залить большой проект - все решается, вот ответ от создателя проекта: >> I’m new one here and I want to ask about the space for repositories. >> How much disk space is given for account? > > As much as you need, with one big disclaimer; that you let us know > beforehand if plan on pushing any repositories larger than around > 500MB, it’s just nice behavior considering the freedom you have to let > us know first :)

Взято: http://groups.google.com/group/gitorious/browse_thread/thread/206efb9f1ea5f99b/a656b005f1e0ed80?lnk=gst&q=limit#a656b005f1e0ed80

Feb 21, 2010 - 3 minute read - Comments - programming

Мысли по написанию программ

Агрегация собственного опыта, идей, мыслей.

Итак, по шагам.

  1. Самое первое - решить, а нужно ли? возможно уже существует более лучшее решение, в котором легче допилить, то, что тебя не устраивает?
  2. Берем бумажку, блокнот (блокнот - лучшее оружие вор^Wпрограммиста!), и пишем те задачи которые должна решать программа, эдакие основные фичи, глобальные юзкейсы.
  3. Продумываем, при помощи того же блокнотика, интерфейс, если он есть.
  4. По результатам берем, рисуем блок-схему, для начала укрупненную. Особенно это нужно для диалоговых приложений.
  5. Далее начинаем детализировать блок схему, в виде отдельных схем описываем отдельные алгоритмы, помогает продумывать в том числе и общую архитектуру.
  6. Если нужна база данных, начинаем чертить таблички, придумывать поля, смотреть какого типа они должны быть, придумывать связи
  7. Когда уже получится достаточно стройная картина, обязательно переложить все это в электронный вид - если проект закрытый, будет самим легче разобраться, а если OpenSource - то сторонним разработчикам.
  8. Выбираем инструментарий: тут в основном язык, библиотеки (в том числе с опорой на лицензию, для собственного использования - пофиг, но если планируешь распространять, то озадачься).
  9. Распечатываем алгоритмы, обклеиваем ими стену - что бы всегда было перед глазами, что бы в любой момент можно было увидеть цельную картину проекта, какие части как между собой взаимодействуют.
  10. Глядим на все это дело, начинаем думать, какими структурами языка это все реализовывать: что засунуть в структуру, что - в класс, какие классы будут базовыми, какие наследоваться, какие интерфейсы внутри классов, делаем пометки на той же бумажке (результаты уже не нужно будет заносить в комп, точнее не нужно в том виде, в каком вы их, эти пометки делали).
  11. Может и не логичное место: придумайте правила оформления кода (мои заметки можно глянуть тут), от себя хочу сказать - все равно какой он будет главное:
    • соблюдайте его на протяжении всего проекта
    • используйте отступы и пусты строки для оформления блоков - читабельность кода увеличивается в разы
    • не чурайтесь комментариев (немного далее)
  12. Про комментарии сказано было, но я рекомендую сразу подумать и о системе документирования самого кода, API библиотек и тому подобного. Для себя использую Doxygen, в коде просто вставляются комментарии в нужной форме, но основе которых, при помощи Doxygen генерируется документация на код в формате HTML/RTF/man
  13. Ну, наверное, в основном - все. Для проверки - перейдите к пункту 1 :simple_smile:

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

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

Ссылки в тему: * Блок-схемы: * http://habrahabr.ru/blogs/xkcd_ru/47126/ - учимся читать :) * http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA-%D1%81%D1%85%D0%B5%D0%BC%D0%B0 * http://mini-soft.ru/soft/vba/r_2.php - тут есть хороший пример реализации switch * Почитать книжку Эрика Рейнмонда “Искусство программирования для Unix”: * http://www.faqs.org/docs/artu/ * http://book.usde.ru/3788-iskusstvo-programmirovanija-dlja-unix.html

PSПишите код так…

Feb 19, 2010 - 5 minute read - Comments - life

Torrents.Ru ---> RuTracker.Org

На правах кросс-постинга: http://serj-nickel.livejournal.com/139844.html

От себя: предлагаю также репостить, и поддержать петицию.


//Уважаемые пользователи!

18 февраля 2010 года компанией “Ру-Центр” (Москва, Ленинградский проспект, д.74, корп.4, тел +7 (495) 994-46-01 +7 (495) 737-06-01, www.nic.ru ) без предупреждения, и какого либо уведомления было приостановлено делегирование домена TORRENTS.RU. По информации из “Ру-Центра” “Делегирование домена TORRENTS.RU приостановлено на основании Постановления следственного отдела по Чертановскому району Прокуратуры г.Москвы от 16.02.2010г”.

В “Ру-Центр” направлен соответствующий запрос, однако, весьма вероятно, что выяснение обстоятельств займет некоторое время, в течение которого адрес torrents.ru будет недоступен. В связи с этим мы вынуждены были в срочном порядке сменить доменное имя на rutracker.org.//

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

Самая “частная” мысль: какого чёрта?! Во-первых, что это за “приостановление делегирования”? Я что-то не пойму - там что, есть решение суда?! Я не юрист, но с позиции здравого смысла мне кажется, что в столь экстренном порядке что-то закрывать можно лишь в том случае, когда это реально угрожает чьей-то безопасности. А здесь что происходит? 16 февраля накатали какую-то там бумагу - и через два дня уже всё готово, всё закрыто? Ну допустим, в России плохой суд, нечестный и коррупционный, но здесь-то не было никакого суда! Пиздец, короче. Видимо, в сраной рашке этой стране любой чиновник имеет право закрыть что угодно. В таком случае заявляю о скором издании Постановления о закрытии к ебёной матери следственного отдела по Чертановскому району прокуратуры г.Москвы от 18.02.2010г. Во-вторых, уж кто-то, а Торрентс.ру был максимально лоялен к правообладателям. В правилах там написано, что каждый запрос с документально подтверждёнными правами на материалы, выложенные на трекере, приведёт к удалению соответствующих раздач, и так в самом деле происходило! Я ещё как-то могу понять мотивы суда над Pirate Bay - эти ребята делали то же, но открыто называли себя пиратами, игнорируя все попытки с ними договориться. При этом в их родной Швеции был громкий судебный процесс, длившийся несколько месяцев, имевший огромнейший резонанс (взять хотя бы место Пиратской партии в Европарламенте!). Да и в Рунете большинство трекеров не отличается особым рвением оставаться в правовом поле. Торрентс.ру - исключение. И тем не менее наехали именно на него.

Мысль номер два: все эти т.н. правообладатели (если это они) не ведают, что творят. Ежу понятно, что файлообмен в том или ином виде победил. Нужно пытаться извлекать из этого выгоду, а не устраивать бессмысленные репрессии. Неужели они не знают, что помимо более 9000 копий экранки фильма “Аватар”, который можно найти в любой локальной сети, Торрентс.ру - хранилище ссылок на редчайшие материалы, купить которые легально просто невозможно даже в Москве, не говоря уже о провинции?! Взять хотя бы первый фильм Тарантино, оцифрованный и переведённый, как и сотни других раритетов, энтузиастами! А помните последний фильм братьев Коэн, который в нашей отсталой северной стране даже в прокат не вышел? А что насчёт собственных оцифровок виниловых пластинок? Что, в конце концов, насчёт авторских раздач, которых не так мало, как может показаться? Подскажите, где это взять легально? На Горбушке? Может быть, проведя полдня и пройдя пять километров вдоль прилавков, я таки найду половину того, чего искал. Но это в столице. А как насчёт Тулы и Рязани, не говоря уже о Барнауле и Томске? А что насчёт русскоязычного населения за рубежом? Думаете, православный храм в центре Парижа для эмигрантов полезнее, чем возможность смотреть русское кино и слушать русскую музыку? Не думаю. Пока государство занималось чёрт знает чем, люди сами решили для себя проблему культурного голода. Более объёмной и при этом структурированной коллекции произведений искусства на русском языке в свободном доступе объективно нет. Было бы чертовски несправедливо, если бы такой проект погиб из-за чьей-то банальной жадности. Торренты - дело огромной важности, действительно объединяющее носителей русскоязычной культуры по всему миру. Дадут фору любым хвалёным нацпроектам - факт.

И, наконец, третья мысль. Железным аргументом структур, пытающихся помешать свободному файлообмену, является такой: “Это незаконно!” Ах, вот ведь радетели за законность нашлись! Но даже не в этом суть. Суть в том, что закон для человека, а не человек для закона. Если реалии изменились, общество должно иметь право издать новые законы, этим реалиям соответствующие. Атеизм, гомосексуализм, эвтаназия - все эти вещи ещё совсем (по историческим меркам) недавно были под запретом. А, например, расовая сегрегация была в порядке вещей. Однако общество изменилось, и в процессе своего развития поменяло взгляды на эти вещи и, как следствие, к власти пришли люди, которые привели законодательство в соответствие с ними. Так происходит в идеале; так должно происходить. Грустный же вывод напрашивается сам собой: по видимому, в России проделать подобную корректировку законодательства мы не в силах.

PS Некоторое время назад я открыл статистику ThePirateBay.org и Torrents.ru и увидел, что количественные показатели (число зарегистрированных пользователей, раздач, сидов, личеров) у них очень близки. Принимая во внимание, что Бухту называют трекером номер один в мире, и что информация на его русскоязычном аналоге куда как лучше структурирована, я испытал чувство, которое испытываю довольно редко - гордость за то, что именно люди, которые говорят со мной на одном языке, собрали, по видимому, крупнейшую коллекцию своей культуры. Я увидел, что они испытывают потребность в культурном обмене друг с другом, что многим из них правда интересно и доставляет удовольствие потратить своё время и силы на поиск, оцифровку, перевод материала - и выложить его в свободный доступ, не прося ничего взамен, а лишь ожидая, что с ними так же поделятся чем-нибудь полезным.

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

PPS http://www.girus.ru/petition/33/

UPD Желающие сделать перепост - делайте! (с кнопочкой не вышло, но и вручную это не так сложно)

Feb 19, 2010 - 1 minute read - Comments - linux

info с человеческим лицом

Все знают про man страницы (man чаво?) и удобную программу apropos, все, надеюсь, ими активно пользуются.

Все знают и про info-страницы, рожденные в недрах проекта GNU, но, управление у программы info достаточно… неудобное, just for me.

Вчера дошли руки, посмотреть альтернативный браузер документации в формате инфо. Но моей лени хватило только набрать команду pacman -Ss info, среди вывода нашел такое:

community/pinfo 0.6.9-3
    A hypertext info file viewer

Поставил, запустил… Ну все, теперь и info активно пользоваться будут: * навигация в стиле links/elinks/w3m, вперед-назад - по Enter и стралками влево-вправо * выход - q * поиск - s или / * список всех топиков - d или b * переход к узлу - g просто и со вкусом. Внешние ссылки открываются, по умолчанию, в lynx, но, думаю (не разбирался пока), заменить на что-то своё будет не проблема.

Ну и снимок:

Feb 19, 2010 - 2 minute read - Comments - programming

Geeqie и закачка картинок на ImageShack

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

Итак, что потребуется * imageshack-upload из одноименного пакета, Арчеры могут поставить пакет из AUR * xmessage или zenity для формирования диалога изменения разрешения картинки

Начнем…

Запускаем Geeqie, идем: Edit -> Preferences -> Configure editors. Откроется окно настройки редакторов, которые могут вызываться из Geeqie.

Нажимаем Create. Появится окно создания нового инструмента, где в основном окне ввода расположен шаблон, который можно подправить под себя. Начинаем с того, что в нижем окне ввода заменяем new.desktop на что-то вроде: ImageShackUpload.desktop. В качестве тела .desktop файла вставляем:

[Desktop Entry]
Version=1.0
Type=Application
Name=Image Shack Upload

# If you have zenity installed use:
#
#   cmd="zenity --list --text='$Q' --column='Selector' --column='Size' --radiolist TRUE No FALSE 1024x768 FALSE 800x600 FALSE 640x480 FALSE 400x300 || echo No" 
#
# if you have xmessage installed use:
#
#   cmd="xmessage -print -buttons 'No,1024x768,800x600,640x480,400x300' '$Q'" 
#
# If you use other dialog system, configure it, or use next command for disable resoultion selection:
#
#   cmd="echo No"
#
Exec=Q="Resize image before upload?"; cmd="zenity --list --text='$Q' --column='Selector' --column='Size' --radiolist TRUE No FALSE 1024x768 FALSE 800x600 FALSE 640x480 FALSE 400x300 || echo No"; size=`eval $cmd`; (for img in %F; do send_img=$img; if [ x"$size" != x"No" ]; then base=`basename $img`; noext=`echo $base | sed 's/.[A-Za-z0-9]*$*'`; ext=`echo $base | sed "s/^$noext*"`; send_img="/tmp/${noext}_$size$ext"; convert -scale $size $img $send_img > /dev/null 2>&1 || send_img=$img; fi; imageshack-upload $send_img 2>&1 | grep '^http:'; done)

# Desktop files that are usable only in Geeqie should be marked like this:
Categories=X-Geeqie;
OnlyShowIn=X-Geeqie;

# Show in menu "File"
X-Geeqie-Menu-Path=FileMenu/FileOpsSection

# This is a filter - $GEEQIE_DESTINATION is required
X-Geeqie-Filter=false

# It can be made verbose
X-Geeqie-Verbose=true

В зависимости от того, стоит у вас zenity/xmessages - вы должны заменить команду cmd=“…” на нужно вам. Кроме того, настройки тут говорят - располагать пункт в меню File. Нажимаем Save, возвращаемся опять в окно настройки инструментов, где наблюдаем и наш новосозданный инструмент. Закрываем.

Теперь выбираем файлы за для закачки и идем File -> Image Shack Upload, появляется диалог, в котором нам предстоит выбрать разрешение, в которое пережмется картинка, или No, если изменение размера не нужно. После закрытия окна начнется процесс закачки (если кстати прервать нельзья, только с соседнего терминала чем-то вроде killall curl), ссылки на закачанные файлы будут выведены в окне, откуда их можно скопировать и вставить в нужное вам место.

Enjoy!

Feb 18, 2010 - 1 minute read - Comments - linux

Церковь vs Linux

На правах юмора, бояна и кросспостинга


навеяно #536746, почему христианская церковь, не одобряэ Linux (да, это относится так же и к Unix): 1. там часто фигурирует число зверя – 666 2. там говорится про вилы (а чем черти колют грешников) – fork() 3. там часто фигурируют демоны 4. там часто взучат призывы убить (kill) и убить всех (killall) 5. очень часто упоминается про убийство родителей и детей 6. там обитают зомби 7. там ложь — это истина (общепринято: 1 – true, 0 – false, так в оболочке, нормальное завершение процесса, это код возврата – 0) 8. из #536746: тут ведется пропаганда детской порнографии (cp)

что ещё?

Отдельно, то, что не подходит как обощение, частно для конкретного дистрибутива/семейства 1. у FreeBSD вообще черт на логотипе 2. Толстый пингвин на логотипе — пропаганда чревоугодия

тут тоже – что ещё?

Feb 18, 2010 - 3 minute read - Comments - programming

./configure для qmake-based проектов

./configure для qmake-based проектов

Что бы очень не заморачиваться с формированием ./configure скрипта (и configure.exe программы для windows) при помощи autotools, когда вся их мощь не очень нужна, поможет проект qconf

Для Арчеводов, можно собрать из AUR svn версию: http://aur.archlinux.org/packages.php?ID=18686

Далее, на правах вольного пересказа английского README.

Intro

Итак, собираем, устанавливаем. Далее идем в корень вашего проекта, где лежит qmake файл, cоздаем там, для примера, файл myproject.qc примерно следующего содержания (это xml файл):

<qconf>
  <name>myproject</name>
  <profile>myproject.pro</profile>
</qconf>

дале пускаем: qconf myproject.qc

На выходе получаем скрипт ./confugure с функционалом, в базовой части соответствующей autotools.

Если запустить без аргумента, будет выбран первый найденный .qc файл, если их найдено не будет - автоматически будет выбран первый .pro файл, и на основе его собран минимальный .qc файл (как в примере выше).

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

Итак, на этот момент мы имеем готовый ./configure скрипт, который запускаем без параметров или смотрим ./configure --help.

Как это работает

После запуска ./configure, будет сформирован файл conf.pri, в котором будут содержаться различные переменные, отвечающие за сборку, основные из которых: * PREFIX * BINDIR * LIBDIR * QTDIR

Этот файл вы можете включать в ваш .pro файл: include(conf.pri)

Т.е. обобщая, как это работает: qconf формирует, на основе .qc файла, скрипт ./configure, который, будучи запущенным, выполняет нужные вам проверки, создает conf.pri, запускает qmake для вашего .pro файла, который (как я выше написал) может включать conf.pri файл (соответственно, все что будет записано в conf.pri - будет доступно для qmake).

Возможные директивы для .qc файла

  • <name>NAME</name> - имя проекта
  • <profile>FILE.pro</profile> - .pro файл проекта
  • <dep>...</dep> - описываем зависимости, проверка на которые будет проводиться:xml <dep type="qt41"> <required/> <!-- обязательная зависимость --> </dep> тут:
    • "type" - определяет модуль (примеры модулей идут вместе с qconf, правда только два: qt31.qcm и qt41.qcm). Если type задана как pkg, проверка происходит при помощи pkg-config (выводы –libs и –cflags будут добавлены при компиляции):
      • опрашивается параметры:
      • "name"
      • "pkgname"
      • "version" в которой могут содержаться знаки отношения: “>=”, “<=“, иначе принимается “=”
    • <required /> - определяет обязательность зависимости
    • <disabled /> - зависимость выключена
  • <arg>DESRIPTION</arg> - дополнительные агрументы для скрипта ./configure, сам аргумент будет доступен через переменную окружения QC_NAME (большими буквами, можно достучаться в модулях проверки через getenv), включают атрибуты:
    • "name" - имя
    • "arg" - значение
  • <lib /> - включает режима, когда собираемый проект - библиотека
    • <static /> - в случае, если <lib />, собирать статическую библиотеку
  • <noprefix /> - очищает PREFIX
  • <nobindir /> - очищает BINDIR
  • <prefix>PATH</prefix> - задаем PREFIX (по умолчанию: /usr/local)
  • <bindir>PATH</bindir> - задаем BINDIR (по умолчанию: PREFIX/bin)
  • <incdir>PATH</incdir> - задаем INCDIR (по умолчанию: PREFIX/include)
  • <libdir>PATH</libdir> - задаем LIBDIR (по умолчанию: PREFIX/lib)
  • <datadir>PATH</datadir> - задаем DATADIR (по умолчанию: PREFIX/share)
  • <qtdir>PATH</qtdir> - задаем QTDIR
  • <moddir>PATH</moddir> - добавляет пути поиска модулей для
  • <qt3 /> - конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)

Да, пример где используется - psi, там же, в директории qcm можно найти очень много приятных модулей проверки.

Ну и да, это всего лишь помощь к qmake, но не замена. Его тоже настраивать нужно. И читать руководства по нему.

PS пока очень сумбурно, потому как, сейчас сам только с ним столкнулся, потом будет дополняться, уточняться.

Feb 13, 2010 - 1 minute read - Comments -

Бортовой журнал переехал на главную

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

Информация о ресурсе переехала на страницу “О ресурсе”, и приобрела чуть более линейный вид.

За сим - всё.

Feb 11, 2010 - 4 minute read - Comments - programming

Qt Creator и автоматическое создание реализации метода/прототипа

UPD: Информация больше не актуальна, теперь подобные средства кодогенерации встроены в Qt Creator.

Долгое время пользовался для написание программ, с использованием Qt4 интегрированную среду разработки QDevelop, и хотя она почти всем устраивает, за несколькими исключениями: * непонятно работает автодополнение * на 500 строках и больше начинает ощутимо поддтормаживать