Hatred's Log Place

DON'T PANIC!

Apr 3, 2010 - 3 minute read - programming

Qt Creator и Generic Projects

Или: можно ли использовать Qt Creator не для Qt? Если коротко - можно.

Почему он? Потому что оказалось, что он достаточно функционален в мелочах, в частности индексирования кода и автодополнения. Крайне удобен в применении его Locator (что вызывается по стандартному сочетанию клавиш Ctrl+K), применение Локатора вообще сводит использование мыши в Qt Creator к минимуму (что удивительно для среды ориентированной на тулкит Qt4 и создание, в основном, графических приложений). Да, правда обвыкнутся по началу нужно, но потом… Если плагин ( http://gitorious.org/creator-plugins), который добавляет функционал по автоматическому созданию реализации функции/метода по его прототипу, так же Я, до того, как узнал про этот плагин, делал свой патч, со схожим функционалом. В общем, все что нужно для удобной работы с проектом (навигация, дополнения, подсветка синтаксиса, отстройка, отладка и т.п.) здесь есть.

Осталось понять, как это добро использовать. Вопросов нет, когда речь идет о родных средствах, типа .pro файла и qmake, а вот при использовании с не qmake/cmake проектами, можно воспользоваться Generic Project, который используют вашу систему сборки, не вмешиваясь в неё. Подробности всегда можно посмотреть на официальном сайте: http://doc.qt.nokia.com/qtcreator-snapshot/creator-project-generic.html

Собственно по ссылке выше и рассказано все, что нужно знать. Тезисно:

  1. используется ваша система сборки, порядок шагов по сборке можно задать в свойствах проекта, по умолчанию, это выполнение команды make all, соответственно там можно задать любую нужную последовательность, которая соответствует вашей системе сборки.
  2. аналогично задаются шаги по очистке проекта.
  3. аналогично задается цель для запуска.
  4. аналогично задаются зависимости между проектами (они должны быть открыты).
  5. при создании указывается директорий вашего проекта, по умолчанию просканируется дерево и добавятся все *.c, *.cpp, *.cc, *.h, *.hpp файлы (как сказано - все известные типы).
  6. после создания проекта и сохранения настроек на диске будет создано несколько файлов: * project_name.files - тут список файлов входящих в проект, обычно исходники, в помощь парсеру, можно править вручную, обновляются автоматически, при добавлении файла в проект из самого Creator’а * project_name.includes - тут список include директорий, в помощь парсеру, можно править вручную * project_name.config - заявляется как обычный C файл, в котором можно записывать ваши макроопределения:#define VERSION "0.0.1" и т.п. * project_name.creator - собственно сам файл проекта, его открывать в Creator’е для загрузки проекта, сейчас никаких настроек больше не содержит. * в процессе работы появится файл project_name.creator.user в котором будут сохранены ваши параметры сборки, очистки проекта, информация о запускаемых модулях.

Теперь как это можно использовать? Покажу на примере своего небольшого Makefile:

PROJECT_NAME=empty-test
EXE = $(PROJECT_NAME)

CC = gcc
CXX = g++

CFLAGS   += -include $(PROJECT_NAME).config
CXXFLAGS += -include $(PROJECT_NAME).config

BIN_DIR = bin

SRC_CPP = ${shell cat $(PROJECT_NAME).files | grep '.cpp$$'}
SRC_C   = ${shell cat $(PROJECT_NAME).files | grep '.c$$'}

OBJ := $(SRC_CPP:.cpp=.o)
OBJ += $(SRC_C:.c=.o)

.PHONY : all clean

all: $(OBJ)
	$(CXX) -o $(BIN_DIR)/$(EXE) $(LDFLAGS) $(OBJ)

%.o : %.cpp
	$(CXX) -c $(LDFLAGS) $(CFLAGS) $(CXXFLAGS) $< -o $@

%.o : %.c
	$(CC) -c $(LDFLAGS) $(CFLAGS) $< -o $@

clean:
	rm -f $(OBJ) $(BIN_DIR)/$(EXE)

Что тут делается, во первых - автоматически получается список файлов проекта из project_name.files, далее, компилятором автоматически подключается project_name.config, и все объявленные там макросы будут доступны внутри кода.

Естественно тут нет и намека на множественные цели, но проект можно разбивать на подпроекты, их зависимости друг от друга задавать в Creator’е, а самих объединять в рабочие области (workspace). В общем и целом - ограничено все только вашей фантазией, и, по сути, данные действия превращают Qt Creator в продвинутый редактор кода, с базовыми функциями управления проектами, чего часто бывает достаточно.

Да, индексация проекта происходит при его загрузке, что требует времени, поэтому есть лишний повод бить большие проекты на части :)

Apr 1, 2010 - 1 minute read - programming

Qwt - Qt виджеты для технических приложений

Ссылка в мемориз: http://qwt.sourceforge.net/

Из описания: библиотека включает визуальные виджеты, вспомогательные не визуальные классы, полезные в первую очередь для программ технической направленности. Так виджет для 2D построений предоставляет возможности масштабирования, ползунки, круговые органы управления, компасы, термометры, колеса прокрутки, кнопки для контроля или отображения значений переменных, массивов и т.д. Посмотреть все это добро можно на снимках: http://qwt.sourceforge.net/controlscreenshots.html

Библиотека распространяется на условиях модифицированной версии GPL, и достаточно либеральными исключениями, в частности разрешается статическая линковка, без раскрытия исходников, обязательному открытию подлежат только изменения в самой библиотеке. Подробности: http://qwt.sourceforge.net/qwtlicense.html

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

  • QwtPolar, виджет для построения в полярной системе координат
  • QwtPlot3D, виджет для 3D построений и использованием OpenGL.
  • QtiPlot, готовое приложение, использующее виджет QwtPlot, для анализа и построения данных.

Существуют биндинги к питону и ruby.

Для пользователей ArchLinux в extra есть пакеты:

  • extra/qwt
  • extra/qwtplot3d Т.е. сама библиотека и её 3D вариант.

Mar 25, 2010 - 2 minute read - life

Про часовые пояса

Навеяно 615012 от камрадки mountain-diu

У всех на слуху очередное нововведение нашего замечательного правительства, о сокращении количества часовых поясов. Что не за очередное блеяние с экрана в исполнении ВВП или МДА, то бред полнейший. А все как мыши: плачут, колются, но продолжают жрать кактус.

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

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

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

или:

Недовольны и жители Камчатского края, что отныне и без того короткий световой день (особенно зимой) стал еще меньше. Правда, теперь жители Чукотки и Камчатки в новогоднюю ночь будут смотреть обращение президента не в час ночи, а в полночь. о да! как же, не услышат ровно в 12 часов очередную порцию бреда с экрана телевизора..

Или вот, про переход на 5 часовых поясов: Россия с 5 часовыми поясами - полнейший абсурд хоть и натянутые выкладки, но все равно виден весь бред сего творения.

Ну и ещё один пример отжига в подтверждение первой ссылки: Чукотка перейдет из девятого часового пояса в восьмой:

12 марта дума Чукотского автономного округа поддержала идею о переходе региона в восьмой часовой пояс из девятого. Соответствующее обращение было направлено премьер-министру России Владимиру Путину. Сейчас временная разница между Москвой и Чукоткой — девять часов.

и сразу же:

Стоит отметить, что работники чукотского филиала Северо-восточного НИИ идею о переходе из одного часового пояса в другой не поддержали. “Смена временного пояса скажется на здоровье и производительности труда жителей”, — считают они.

Да нахрена эти ученые нужны, зачем нужна эта какая-то РАН (особенно с последними порывами лихо реформировать академию)!

PS у меня ощущение, что вместо людей в думах у нас зомби и/или манекены, а решения принимает электронный (или даже механический) бредогенератор.

Mar 23, 2010 - 3 minute read - linux programming

Графический индикатор разряда батареи в IceWM

Решил тут собрать небольшое окружение на основе IceWM, вернуться, так сказать к истокам (работал он у меня в бытность ещё P100/24RAM). Но т.к. теперь ему предстояло работать на ноутбуке, в режиме питания от батареи было бы хорошо иметь возможность наблюдать статус разряда.

Mar 23, 2010 - 1 minute read - life

Хрень

Можно сказать научно-популярный фильм, да.

Mar 20, 2010 - 1 minute read - programming

Не люблю цитатники, но...

это меня проняло:

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

Отсюда: http://ibash.org.ru/quote.php?id=12598 по наводке l1feh4ck3r’а

Mar 20, 2010 - 2 minute read - programming

Повелся :-)

Задачка: http://bishop-it.ru/2010/03/codeinrussian

Ну там в комментах я написал, в gcc такое не проканывает (пока точно известно, что проканывает в MSVC, а как дела обстоят с компиляторами Intel/Sun/Borland мне не известно). Но… в транслите так же сделал вариант: http://codepad.org/zEs0pjLl или тут:

/*
 * Собирать: 
 *      gcc -include stih.h -o stih stih.c
 * Посмотреть вывод препроцессора:
 *      gcc -E -include stih.h -o stih stih.c
 */

/*
 * stih.h
 */
#include <stdio.h>

#define NACHALO int main() {<br/>
                  char *out = NULL; <br/>
                  char *txt = NULL; <br/>
                  FILE *fp  = NULL;
#define KONETS    return 0;}
#define PROGRAMMY

#define Vyvedi
#define tekst
#define na
#define v
#define ekran out = NULL
#define fajl out =

#define nachalo ; if (out == NULL) <br/>
                    fp = stdout;<br/>
                  else <br/>
                    fp = fopen(out, "w"); txt =
#define konets ; if (fp != NULL)<br/>
                 {<br/>
                  if (txt != NULL) fprintf(fp, "%s", txt);<br/>
                  if (fp != stdout) fclose(fp); <br/>
                 }
#define teksta


/*
 * stih.c
 * Тут перевел в транслит, т.к. gcc (только ли он?) не поддерживает #define РУССКИЙ
 * в общем, сути не меняет
 */
NACHALO PROGRAMMY

Vyvedi tekst na ekran

nachalo teksta
"YA pomnyu chudnoe mgnoven'e: <br/>n<br/>
Peredo mnoj yavilas' ty, <br/>n<br/>
Kak mimoletnoe viden'e, <br/>n<br/>
Kak genij chistoj krasoty."
konets teksta

Vyvedi tekst v fajl "Stikh.txt"

nachalo teksta
"V tomlen'yakh grusti beznadezhnoj<br/>n<br/>
V trevogakh shumnoj suety,<br/>n<br/>
Zvuchal mne dolgo golos nezhnyj<br/>n<br/>
I snilis' milye cherty."
konets teksta

KONETS PROGRAMMY

Mar 16, 2010 - 1 minute read - programming

Emacs и автодополнение

Есть такой пакет CEDET, в прошлом посте дал ссылочку на статью Алекса Отта по его настройке.

Захотелось получить красивое меню автодополнения после ввода . или -> в C/C++ программах. Изучая его же конфиги (начинающим, и не только - рекомендую, есть интересности, в частности - автовставка шаблона при создании нового файла) наткнулся на интересную минорную моду: company-mode, которая то, что мне нужно и делает. Причем, по ходу ввода - выбор в меню изменяется.

Подкатом картинка, которая демонстрирует как это работает у меня.

Mar 15, 2010 - 1 minute read -

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

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

Mar 11, 2010 - 3 minute read - 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-убунтоиды ими уже на форуме поддостали :)