Инструменты пользователя

Инструменты сайта



// Мой "C/C++ Coding Style" версия 1.1 + Astyle

Подправил малость стандарт кодирования для своих проектов, из изменений:

  • Для функций, в которых производятся действия по инициализации допускается использовать префикс init (сокращенный вариант initialize)
  • Убрана жесткая рекомендация по использованию 0 вместо NULL в C++
  • Добавлена рекомендация использовать calloc вместо malloc в C
  • Добавлена рекомендация добавлять пробел после ключевого слова языка и открывающей скобкой
  • Рекомендация не использовать одиночные блоки if, while, for и т.п.
  • Добавлена рекомендация по использованию astyle с учетом стандартов перечисленных здесь.

Более подробно про Astyle.

Сама программа является достаточно мощным форматировщиком кода, причем с приятной документацией (для почти всегда достаточно простого astyle –help).

Моя команда astyle выглядит так:

astyle --style=ansi --indent=spaces=4 \
          --indent-classes --indent-switches --indent-preprocessor --indent-col1-comments \
          --max-instatement-indent=24 --min-conditional-indent=4 \
          --pad-oper --pad-header --unpad-paren --add-brackets \
          --convert-tabs --align-pointer=name \
          <source_file_name> 

По опциям пробежимся (за подробностями в astyle –help):

  • –style=ansi - базовый стиль форматирования, что бы на каждый чих установки не делать
  • –indent=spaces=4 - выравнивание пробелами, использовать 4 оных
  • –indent-classes - делать отступ для protected:, private: и т.д.
  • –indent-switches - делать отступ у case внутри switch
  • –indent-preprocessor - отступ у многострочных макроопределений
  • –indent-col1-comments - делать отступ однострочным комментариям (???)
  • –max-instatement-indent=24 - при разбивке выражения на строки, следующая строка обычно выравнивается по предыдущей, в частности, по открывающей скобке. Это опция ограничивает максимальный отступ в 24 символа
  • –min-conditional-indent=4 - ??? задал по аналогии :)
  • –pad-oper - делает отступы вокруг операторов, после запятых, точек с запятой, если просто - делает более удобочитаемыми математические выражения
  • –pad-header - делает отступы после ключевых слов языка и перед открывающимися скобками (у if, while, for и т.д.)
  • –unpad-paren - а вот ненужые удаляет (типа после функции), можно использовать только когда нужно
  • –add-brackets - обрамляет однострочные блоки в фигурные скобки
  • –convert-tabs - преобразует табуляцию в пробелы (эквивалентное количество, задано выше)
  • –align-pointer=name сдвигает *, & в определении к имени переменной, т.е. преобразует char* ptr или char * ptrchar *ptr

// QAvr - графический интерфейс для работы с avrdude

Подготовил и выложил пилотную версию 0.1

Подробности: QAvr

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

// Arduino как программатор для контроллеров Atmel и сопутствующий софт

За последние дни окончательно убедился, что Arduino не просто игрушка, а настроящие ворота для начинающих постигать мир программирования микроконтроллеров Atmel.

К чему это я, а к тому, что плата Arduino может выступить в роли программатора для самостоятельных конструкций на контроллерах. Как минимум существует два варианта, про которые можно прочитать на сайте http://freeduino.ru: http://freeduino.ru/arduino/isp.html.

Меня больше заинтересовал вариант BitBang программатора, т.к. не нужно каждый раз заливать прошивку в Arduino, когда нужно прошить внешний контроллер. Кроме того, можно прошить сам контроллер в кроватке (допустим если вышел из строя, количество же циклов перезаписи ограничено или залить обновленный boot loader).

В статье выше сказано, что подходят не все платы, это верно, но главное, что бы это была USB плата и на ней был чип FT232R/FT232RL, а вот разьём X3 можно распаять и самому (как это сделал Я - при помощи олово-отсоса очистил отверстия, поставил планочку и пропаял).

Но на этом наши приключения не заканчиваются. Возникает вопрос - чем шить? Ведь BitBang («ножкодрыгание») это достаточно не стандартная для общепринятых API процедура. Соответственно этим нужно заниматься через специализированные библиотеки, коих под Linux я раскопал две для чипов от FTDI:

  • libftd2xx - закрытая (проприетарная) библиотека от производителя, есть в вариантах для i686 и x86_64 (и естественно для Windows), скачать можно тут: http://www.ftdichip.com/Drivers/D2XX.htm, там в же в архиве есть заголовочные файлы, а на сайте можно скачать PDF с руководтством программиста. Вообще, там же рекомендую скачать и документацию на саму микросхему FT232R/FT232RL и информацию про работу в BitBang режиме (дальше потребуется). Библиотека доступна в ArchLinux через AUR.
  • libftdi - библиотека с открытыми исходными кодами, из зависимостей только libusb, а так как последняя может быть собрана и для Windows, теоретически и данная библиотека тоже. Домашняя страница: http://www.intra2net.com/en/developer/libftdi/download.php, имеется так же в репозитории extra в ArchLinux.

Для первой библиотеки (libftd2xx), есть набор патчей для avrdude. На сайте FreeDuino есть ссылка на сборку для Windows. Я выложил в AUR правила для сборки последней версии avrdude с этими патчами: avrdude-serjtag (потому как патчи изначально родились в недрах проекта serjtag).

На сайте libftdi лежит патч для древней версии uisp, поэтому подумав, и потратив 1.5 дня сделал на основе патчей serjtag свой патч ftdi-bitbang-5.10-1.patch, который использует эту библиотеку. Проверил прошивая и устанавливая fuse-биты на ATTiny2313. Естественно сделал правила для сборки и поместил в AUR: avrdude-ftdi. Вариант, если нужно отстроить на архитектуру отличную от x86/x86_64 или если бинарная версия проприетарной библиотеки рушится на вашей системе (тем более, что обновлялась она с 2008 года).

Вот тут товарищ Di Halt более подробно рассказывает про программатор на такой же микросхеме, которая стоит на Arduino. Там он говорит об одной неприятной особенности: после прошивки не отпускается линия RESET и решает проблему аппаратно. Можете поступить так же, но оказалось что, что в исходных кодах avrdude достаточно добавить одну строчку - выставление высокого уровня на линии RESET перед закрытием порта и выходом. Патч делающий это для использования с libftd2xx и набором патчей serjtag можно поглядеть тут: http://aur.archlinux.org/packages/avrdude-serjtag/avrdude-serjtag/clean-reset-pin.diff. При сборке пакетов avrdude-serjtag и avrdude-ftdi изменения отраженные в этом патче уже применены, так что, счастливым обладателям ArchLinux достаточно просто собрать и поставить пакет :)

Немножно хотел бы остановиться на описании программатора в конфигурационном файле avrdude.conf, особенно назначение цифр для задания линий. Выглядит это примерно так:

#arduino duemilanove
programmer
  id    = "duemilanove";
  desc  = "FT232R Synchronous BitBang";
  type  = ft245r;
  miso  = 3;  # CTS X3(1)
  sck   = 5;  # DSR X3(2)
  mosi  = 6;  # DCD X3(3)
  reset = 7;  # RI X3(4)
;

programmer
  id    = "ft245r";
  desc  = "FT245R Synchronous BitBang";
  type  = ft245r;
  miso  = 1; # D1
  sck   = 0; # D0
  mosi  = 2; # D2
  reset = 4; # D4
;

Не мог понять, пока не почитал внимательно приложение к даташиту FT232R подробно рассказывающее про Bit Bang режимы этой микросхемы. Если коротко: для программатора нужно 4 линии, микросхема предоставляет 8 линий, на которых можно играться уровнями. Естественно в каждом конкретном программаторе могут использоваться любые 4 из этих 8ми линий.

Каждая линия отражает бит с номером от 0 до 7. На Arduino на разъем X3 выведены контакты микросхемы с номерами 11, 9, 10, 6, подключаемых по следущей схеме:

11 - MISO
 9 - SCK
10 - MOSI
 6 - RESET

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

Имя линии Номер вывода микросхемы Имя вывода Номер вывода разъема X3 Номер/Имя бита (согласно таблицы)
MISO 11 CTS 1 D3
SCK 9 DSR 2 D5
MOSI 10 DCD 3 D6
RESET 6 RI 4 D7

Смотрим на последнюю колонку: вот они откуда и берутся эти самые 3, 5, 6, 7 в описании программатора в avrdude.conf. Т.е. эти номера - это номера битов. С остальными программаторами дело обстоит схожим образом. Одного я не понял, почему этого нет в документации? Или плохо искал?

На этом пока все, сейчас обощаю идеи о среде разработки (на данный момент на базе Makefile) и опубликую заметку.

// Image Ruler 0.98

Image Ruler - небольшой приложение для измерений на сканированных изображениях, например картах.

По сути анонс, хотя версии были уже выложены.

Оформил страницу проекта и выложил в для скачивания версию 0.98, по сравнению с 0.0.3 изменения:

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

К версии 1.00 думаю будет сделано следующее:

  • краткое руководство
  • измерение в единицах отличных от миллиметров
  • оптимизация получения мета-информации из изображения
  • перевод на CMake и добавление правил для установки (make install)
  • иконку :-) кстати, кто предложит, должна отображать суть - измерения.

// Документация для проектов

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

Как жаль что очень многие современные разработчики в сфере FOSS не читали статью от туда:

И не знают про цикл статей «Writing Documentation» в этой самой LinuxGazette:

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

Люди, разработчики, программисты! Пишите документацию! Хорошая документация очень привлекает внимание к проекту, помогает разобраться в нем, легче написать какие-то модификации, патчи и, в конечном итоге, помочь ему и вам.

Примеры отвратительного документирования? Да пожалуй почти все творения FreeDesktop.org (по моему мнению, так их деятельность, это диверсия в рядах FOSS), к примеру HAL, для которого сначала написали реализацию, и, по-моему, до сих пор не существует спецификации, как результат - им показалось что HAL тяжел, разделили его на отдельные демоны-сервисы, а кто был завязан на него получили головную боль (особенно кто пользовался монтированием флешек/дисков, или тот же Xorg, которому пришлось придумывать свою систему для настроек подключенных на горячую устройств ввода).

Или xdg-utils… посмотрите man xdg-open (навеяно дискуссией в #archlinux-ru@FreeNode), вроде и есть, ну никакой ясности не вносит - кто, что будет открывать, какие браузеры или переменные окружения будут использоваться, какие окружения рабочего стола поддерживаются.

Ну и последнее, вы что нибудь можете сказать о загадочной утилите ck-launch-session из комплекта PolKit? Нет? Да она даже на –help или -h подсказки не выдает, кто она и что делает. А ведь применяется много кем, кто не использует gdm/kdm/etcdm, в знакомой мантре в .xinitrc:

exec ck-launch-session startkde

// Cmake, Qt4 и кросс-компиляция

Есть у меня проектик, он как тестовый полигон, хоть код и достаточно в большом количестве поддается только одной характеристике: исторически сложилось. Но на нем первом я опробовал кросс-компиляцию для Windows из Linux. Теперь его же перевел в обучающих целях на Cmake. Однако, все новое не должно отменять старых достижений, как следствие встал вопрос - а как теперь делать сборку для Windows?

С учетом того, что система сама по себе пока малознакома, решил понапрягать гугл (точнее: http://google.com/linux)

Почти сразу нашел две статьи мини-цикла:

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

Именно по вышеуказанной причине я решил продолжить изыскания. Поиском по готовым модулям Cmake нашел упоминание некой директивы CMAKE_TOOLCHAIN_FILE, которая, по внутреннему ощущению, должна была мне помочь.

Дальнейший поиск привел меня на вики самого Cmake: How to use MinGW to cross compile software for Windows, где было сказано про тот самый toolchain file. С минимальными изменениями поместил его в каталог cmake в корне дерева проекта.

Ниже приведу листинг этого файла, назвал его win32-x-mingw32.cmake, в адоптации для ArchLinux:

win32-x-mingw32.cmake
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
 
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i486-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i486-mingw32-g++)
SET(CMAKE_RC_COMPILER i486-mingw32-windres)
 
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /usr/i486-mingw32)
 
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 
# next options is needed by some cases
#set(CMAKE_EXE_LINKER_FLAGS
#    ${CMAKE_EXE_LINKER_FLAGS}
#    -Wl,-subsystem,windows
#    -Wl,-enable-auto-import
#    -Wl,-enable-runtime-pseudo-reloc)
 
# Uncomment this if you have problem: unrecognized option '-rdynamic'
#set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
 
set(MINGW32 1)

Это, конечно, не все, остались последние штрихи.

Использование данного тулчайна приведет к установке переменной CMAKE_CROSSCOMPILING, на основании этого, перед вызовом

find_package(Qt4 REQUIRED)

или аналогичного, достаточно вставить (в случае ArchLinux и пакета mingw32-qt из AUR или моей репы mingw32) следующий код:

if(CMAKE_CROSSCOMPILING)
  set(QT_HEADERS_DIR "/usr/i486-mingw32/include")
  set(QT_LIBRARY_DIR "/usr/i486-mingw32/lib")
endif()

После этого сборка осуществляется примерно так:

mkdir win32-build
cd win32-build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/win32-x-mingw32.cmake ..
make

Все! :)

PS проверено на Cmake 2.8.1 и Qt 4.6.2

Updated: обновлён файл тулчейна

// Crowns 0.4.0

Выпустил версию 0.4.0 из основных изменений:

  • добавлена поддержка подложки (фоновой картинки), для реализации отображения синнузий
  • поддержка импорта из текстовых файлов данных с возрастом, плюс реализована совместимость со старыми форматами
  • оптимизация отрисовки проекций крон: реализована отрисовка кривыми Безье
  • экспорт построений в SVG

Как обычно версия для Windows отстроена путем кросс-компиляции, требуется тестирование.

Полный список изменений: ChangeLog
Скачать: Download

// Интересная нотация switch/case в gcc

Относится к расширениям gcc, не претендует на переносимость, но все же: в gcc у case можно указывать диапазоны значений:

case LOWVAL ... HIVAL:

Например:

switch(var) 
{
     case 0 ... 2:
        /* какой-то код */
        break;
     case 3 ... 5:
        /* какой-то другой код */
        break;
     default:
        /* что делаем, когда ничего не помогает */
}

этот код эквивалентен такому:

switch(var) 
{
     case 0:
     case 1:
     case 2:
        /* какой-то код */
        break;
     case 3:
     case 4:
     case 5:
        /* какой-то другой код */
        break;
     default:
        /* что делаем, когда ничего не помогает */
}

ЗЫ про одно полезное расширение gcc я уже писал: 0b00100100

// 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 в продвинутый редактор кода, с базовыми функциями управления проектами, чего часто бывает достаточно.

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

// 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 вариант.

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

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

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

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

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

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

// Повелся :-)

Задачка: 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() {\
                  char *out = NULL; \
                  char *txt = NULL; \
                  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) \
                    fp = stdout;\
                  else \
                    fp = fopen(out, "w"); txt =
#define konets ; if (fp != NULL)\
                 {\
                  if (txt != NULL) fprintf(fp, "%s", txt);\
                  if (fp != stdout) fclose(fp); \
                 }
#define teksta


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

Vyvedi tekst na ekran

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

Vyvedi tekst v fajl "Stikh.txt"

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

KONETS PROGRAMMY

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

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

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

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

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

Сначала поставлена задача: удалить рекомендации в своем блоге на 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| \[||'`
  else
    next_num=`cat $tmp_file | grep 'Older ->' | awk -F'|' '{print $2}' | awk -F']' '{print $1}' | sed 's| \[||'`
  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 \
              | grep '\[[0-9]*\]#[0-9]*,' \
              | grep 'now\|ago' \
              | awk '{print $1}' \
              | sed 's|^\[[0-9]*\]||;s|,$||' \
              | 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
+++ /usr/share/perl5/XML/Stream.pm 2009-05-26 13:53:04.000000000 +0400
@@ -1160,7 +1160,7 @@
                $self->{SOCKETS}->{*STDIN} = $sid;
        }
 
-       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-убунтоиды ими уже на форуме поддостали :)

// Porting Unix Software

Пользительная книжка, не лишне держать под рукой:
http://www.lemis.com/grog/Documentation/PUS/

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

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

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

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

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

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

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

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

Из дополнительных пунктов:

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

Ссылки в тему:

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

// 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!

// ./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> - описываем зависимости, проверка на которые будет проводиться:
        <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> - добавляет пути поиска модулей для <dep></dep>
  • <qt3 /> - конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)

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

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

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

// MODx Wayfinder: неконсистентность hereClass и hereTpl

Без лишней теориотизации, настроения нет.

Есть иерархия документов, которые образуют различную вложенность меню:

  1. Пункт бокового меню
    1. Подменю 1
    2. Подменю 2
      1. Подменю в папке 1
      2. Подменю в папке 2 ← этот документ выбран
    3. Подменю 3

В этой схеме отмечено, какой документ выбран, т.е. открыт, так вот, у всего, что выделено жирным - будет установлен класс, заданный в hereClass, но только у того который обозначен жирным курсивом - будет применен hereTpl.

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

--- wayfinder.inc.php.orig	2010-02-15 23:14:08.000000000 +1000
+++ wayfinder.inc.php	2010-02-15 23:57:03.000000000 +1000
@@ -152,7 +152,7 @@
             $usedTemplate = 'parentRowHereTpl';
         } elseif ($resource['id'] == $modx->documentObject['id'] && $this->_templates['innerHereTpl'] && $resource['level'] > 1) {
             $usedTemplate = 'innerHereTpl';
-        } elseif ($resource['id'] == $modx->documentObject['id'] && $this->_templates['hereTpl']) {
+        } elseif ($this->isHere($resource['id']) && $this->_templates['hereTpl']) {
             $usedTemplate = 'hereTpl';
         } elseif ($resource['isfolder'] && $this->_templates['activeParentRowTpl'] && ($resource['level'] < $this->_config['level'] || $this->_config['level'] == 0) && $this->isHere($resource['id'])) {
             $usedTemplate = 'activeParentRowTpl';

Т.е. простое сравнение заменяем на поиск того, что Id документа есть среди потомков при построении вышестоящих пунктов меню.

А эта бага меня часа 4 упорно уверяла, что я тупее паровоза.

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

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

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

  • непонятно работает автодополнение
  • на 500 строках и больше начинает ощутимо поддтормаживать

// C/C++ Coding Style

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

В общем вот: C++ Coding Style

По ходу будет дополняться.

// Medit: работает с FreePascal

Продолжаем цикл статей :-) ну и в предверии семинара.

Для начала создадим фильтр, вид его будет такой:

<filter id="FreePascal" name="FreePascal">
  <match what="stdout" pattern="(?P&lt;file&gt;[^:]+)\((?P&lt;line&gt;\d+)[,0-9]*\) Error:.*" style="output-error" />
  <match what="stdout" pattern="(?P&lt;file&gt;[^:]+)\((?P&lt;line&gt;\d+)[,0-9]*\) Fatal:.*" style="output-error" />
</filter>

В отличии от бейсика, файл синтаксиса для паскаля уже есть, поэтому здесь мы не будем делать каких-то движений.

После создаем инструмент Run Pascal, файлы - *.pas; тип - Команда оболочки; вывод - Панель вывода; фильтр - FreePascal, сам код такой:

fpc $DOC
if [ $? -eq 0 ]; then
  xterm -e "bash -c 'cd $DOC_DIR; ./$DOC_BASE; read -p \"Нажмите ENTER для продолжения\"'"
fi

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

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

// Qt4 и кросскомпиляция для win32

Попытаюсь пошагово оформить инструкцию, как делал у себя.

Для начала ставим пакеты (верно для ArchLinux, для других названия будут или аналогичными, или похожими):

pacman -S mingw32-binutils mingw32-gcc mingw32-runtime mingw32-w32api qt wine

Далее, мы должны взять Windows-версию библиотеки Qt4. Берем отсюда (текущая версия 4.6, хотя лучше взять ту, которая у вас в дистрибутиве, в момент написания, это: 4.5.3, кроме того, берем ту, что дял MinGW и, мы же православные, LGPL):
http://qt.nokia.com/downloads/windows-cpp (получим самую последнюю версию)

или отсюда:
http://get.qt.nokia.com/qt/source/

Я беру 4.5.3:

wget -c http://get.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe

После скачивания, нам поможет wine, дабы установить библиотеку1). Если у вас возникают какие ошибки и wine отваливается, попытайтесь удалить каталог ~/.wine и запустить процесс заново.

Предварительно делаем такой финт ушами:

ln -s /usr/i486-mingw32 ~/.wine/drive_c/MinGW

Пусть потом установщик думает, что у нас реальный MinGW стоит, в частности - библиотека mingwm10.dll, которую вы должны предоставить в целевой используемой системе, как и необходимые dll от Qt.

Итак:

wine qt-win-opensource-4.5.3-mingw.exe

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

~/.wine/drive_c/Qt/VERSION

где VERSION это версия, в нашем случае - 4.5.3

Далее, для своего удобства, хотя это может и быть идеологически неверным, я делаю следующие пассы от root:

(1) mkdir /opt/qt4-win32
(2) cp -a /home/USER/.wine/driver_c/Qt/VERSION /opt/qt4-win32/
(3) ln -s /opt/qt4-win32/VERSION /opt/qt4-cross

где (1) - создаие каталога в общедоступной системной директории, (2) - копирование нашей установленной версии Qt4 в этот самый общедоступный каталог (USER - имя пользователя от которого происходила установка), (3) - делаем симлинк на нашу рабочую версию, этот симлинк я буду использовать в описании spec-файла для qmake.

Следующий шаг, создание спека для Qmake (любителям других систем сборок - велком с дополнениями).

Хотя создание это громко сказано, в комплекте поставки есть спек:

/usr/share/qt/mkspecs/win32-g++

для работы с mingw32 в среде Windows, нам надо его только немного модифицировать, поэтому делаем копию:

cp -a /usr/share/qt/mkspecs/win32-g++ /usr/share/qt/mkspecs/win32-cross-g++

Переходим в /usr/share/qt/mkspecs/win32-cross-g++ и, можно наложить такой патч, бай ми:

diff -Nur win32-g++/qmake.conf win32-cross-g++/qmake.conf
--- win32-g++/qmake.conf	2009-10-08 09:30:49.000000000 +1100
+++ win32-cross-g++/qmake.conf	2009-04-10 13:56:14.809651570 +1100
@@ -14,7 +14,7 @@
 QMAKE_EXT_OBJ           = .o
 QMAKE_EXT_RES           = _res.o
 
-QMAKE_CC		= gcc
+QMAKE_CC		= i486-mingw32-gcc
 QMAKE_LEX		= flex
 QMAKE_LEXFLAGS		=
 QMAKE_YACC		= byacc
@@ -27,7 +27,7 @@
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
-QMAKE_CXX		= g++
+QMAKE_CXX		= i486-mingw32-g++
 QMAKE_CXXFLAGS		= $$QMAKE_CFLAGS
 QMAKE_CXXFLAGS_DEPS	= $$QMAKE_CFLAGS_DEPS
 QMAKE_CXXFLAGS_WARN_ON	= $$QMAKE_CFLAGS_WARN_ON
@@ -41,18 +41,18 @@
 QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
 QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
 
-QMAKE_INCDIR		=
-QMAKE_INCDIR_QT		= $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT		= $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR		= /usr/i486-mingw32/include
+QMAKE_INCDIR_QT		= /opt/qt4-cross/include
+#QMAKE_INCDIR_QT         = /usr/include
+QMAKE_LIBDIR_QT		= /opt/qt4-cross/lib
 
 QMAKE_RUN_CC		= $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CC_IMP	= $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
 QMAKE_RUN_CXX		= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CXX_IMP	= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
-QMAKE_LINK		= g++
-QMAKE_LINK_C		= gcc
-QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LINK		= i486-mingw32-g++
+QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s
@@ -72,35 +72,26 @@
 QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
 QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain
 
-!isEmpty(QMAKE_SH) {
-    MINGW_IN_SHELL      = 1
-	QMAKE_DIR_SEP		= /
-	QMAKE_COPY		= cp
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= mv
-	QMAKE_DEL_FILE		= rm
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS = test -d
-} else {
-	QMAKE_COPY		= copy /y
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= move
-	QMAKE_DEL_FILE		= del
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS	= if not exist
-}
-
-QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe
-QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe
-QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe
+
+MINGW_IN_SHELL      = 1
+QMAKE_DIR_SEP		= /
+QMAKE_COPY		= cp
+QMAKE_COPY_DIR		= cp -a
+QMAKE_MOVE		= mv
+QMAKE_DEL_FILE		= rm -rf
+QMAKE_MKDIR		= mkdir -p
+QMAKE_DEL_DIR		= rm -rf
+QMAKE_CHK_DIR_EXISTS = test -d
+
+QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
+QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
+QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc
 
 QMAKE_IDL		= midl
 QMAKE_LIB		= ar -ru
-QMAKE_RC		= windres
+QMAKE_RC		= i486-mingw32-windres
 QMAKE_ZIP		= zip -r -9
 
-QMAKE_STRIP		= strip
+QMAKE_STRIP		= i486-mingw32-strip
 QMAKE_STRIPFLAGS_LIB 	+= --strip-unneeded
 load(qt_config)

или на основании этого патча, внести изменения самостоятельно.

Видно, что основные отличия это:

  • указание компилятора
  • указание путей
  • указание разделителя директорий (принудительно) и системных команд, типа копирования или переименования.

На основе этого можете делать свои правки, готовый файл спека, кому нужно - вышлю.

Второй файл qplatformdefs.h в редактировании не нуждается.

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

Ну и последние акт, запускаем qmake так:

qmake -spec win32-cross-g++ file.pro
make

Вот собственно и все, если код написан правильно и корректно, то все должно собраться и слинковаться.

PS повторюсь: не забудьте в дистрибуцию добавить нужные для работы DLL в частности mingwm10.dll (его можно взять из поставки mingw32)

PPS Полезная ссылка для Арч-юзеров, вообще для кросскомпиляции: http://aur.archlinux.org/packages.php?K=mingw32, там в том числе есть пакет mingw32-qt, в первом коменте к которому PKGBUILD собирающий пакет с Qt 4.5.3 для mingw32

1)
в общем мы можем взять копию установки с какой нить Windows-машины, разницы никакой, или попытаться собрать самому из исходников

// Серия статей на IBM DeveloperWorks "Программирование на Qt"

Впринципе очередной пересказ документации и прочих книжек, но пусть тут будет, достаточно подробно и интересно:

// Medit: работаем с FreeBasic

По аналогии с medit: 'PHP check syntax' tool создаем фильтр для FreeBasic Compiler:

<filter id="FreeBasic" name="FreeBasic">
  <match what="stderr" pattern="(?P&lt;file&gt;[^:]+)\((?P&lt;line&gt;\d+)\) error \d+:.*" style="output-error" />
  <match what="stdout" pattern="(?P&lt;file&gt;[^:]+)\((?P&lt;line&gt;\d+)\) error \d+:.*" style="output-error" />
</filter>

Дополнительно, помещаем файл синтаксиса для Бейсика в директорию ~/.local/share/medit/language-specs, предварительно распаковав: basic.lang.gz

После создаем инструмент Run Basic, файлы - *.bas; тип - Команда оболочки; вывод - Панель вывода; фильтр - FreeBasic, сам код такой:

fbc -lang qb $DOC -Wl -L/usr/share/freebasic/lib/linux/
if [ $? -eq 0 ]; then
  termit -e "bash -c '$DOC_DIR/$DOC_BASE; read -p \"Hit <Enter> for continue\"'"
fi

Вместо эмулятора терминала termit можно использовать xterm, функционал сохранится. Клавишу для запуска рекомендую F9, т.е. классическая F5 уже занята для перезагрузки документа.

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

Стоит отметить, что используя графические режимы (типа «screen 9») программы запускаются в виде окна, перевести в полноэкранный режим можно нажатием сочетания клавиш Alt-Enter, текстовые программы будут вести диалог в текстовом окне терминала.

Все, пробуйте :)

// Текстовый редактор Medit

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

Требования

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

  1. т.к. нужно редактировать код, нужна подсветка синтаксиса, должна быть возможность создавать свои схемы подсветки
  2. автоотступ, как при вводе кода, так и при обычном текстовом редактировании
  3. отображение номеров строк, мне привычно - отдельной колонкой
  4. многооконный интерфейс образованный вкладками
  5. отступ блока кода и обратный отступ
  6. фолдинг - сокрытие блока кода
  7. поддержка кодировки текста
  8. поддержка поля вывода для внешних команд
  9. собственно вызов внешних команд
  10. боковые панели для быстрой навигации по дереву каталогов и открытия файлов (удобно работать в проекте)
  11. расширяемость - простые средства добавления нового функционала, без написания кода.

Знакомимся - MEdit

Повторю то, что кратко сказал в первом посте про данный редактор:

MEdit2) замечательный редактор, написанный на Gtk, пока, за малым исключением, удовлетворяет все мои запросы. Корнями уходит графическому интерфейсу GGAP3) для GAP4).

Теперь же давайте рассмотрим его соответствие моим требованиям к хорошему текстовому редактору:

  1. подстветка синтаксиса: есть, описание в xml файлах, можно делать свои схемы
  2. автоотступ: есть
  3. отображение номеров строк: есть
  4. многооконный интерфейс образованный вкладками: есть
  5. отступ блока кода и обратный отступ: есть, в конфигурации по-умолчанию клавишами Tab и Shift+Tab соответственно
  6. фолдинг: нет, но как оказалось, в тех редакторах, что он есть, мною не использовался.
  7. поддержка кодировки текста: есть, но иногда после переключения нужно делать File → Reopen With Codepage…
  8. поддержка поля вывода для внешних команд: есть + поддержка фильтров, но это подробнее позже
  9. собственно вызов внешних команд: есть, через механизм Инструментов (или Тулов, от английского Tools)
  10. боковые панели для быстрой навигации по дереву каталогов и открытия файлов: есть
  11. расширяемость: есть, через механизм плагинов (C или Python), через механизм Инструментов, которых реализован ооооочень удобно.

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

Инструменты

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

Сами инструменты могут быть описанием программы на встроенном Python, LUA или быть командой оболочки (в большинстве случаев - BASH).

Общие параметры для всех языков, это:

  • Включен - определяет включен инструмент или нет
  • Файлы - задает, в случае открытия какого файла будет доступен данный инструмент (например в зависимости от того файл какого языка мы редактируем). Тут могут быть заданы маски файлов, выражение типа: langs: c++, c, pascal или регулярное выражение типа: regex:\.[ch]$. Пустое значение подразумевает что доступно при редактировании всех документов. На основе этого я сделал свой тул для валидации кода php.
  • Параметры - определяют при каких условиях инструмент будет отрабатывать, представляет собой разделенный запятыми список:
    • need-doc - документ должен быть открыт
    • need-file - инструмент не будет работать для новых, ещё не сохраненных на диск файлов
    • need-save - документ будет сохранен перед выполнением команды
    • need-save-all - все открытые документы будут сохранены перед выполнением команды

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

Для Типа команды «Команда оболочки» доступны так же следующие параметры:

  • Ввод - что будет посылаться на стандартный ввод команды, скрипт должен уметь принимать стандартный ввод
  • Вывод - куда будет посылаться вывод команд:
    • Ничего - никуда, редактор будет недоступен пока команда не завершится
    • Ничего, асинхронно - никуда, можно сразу продолжать работу с редактором
    • Панель вывода - собственно текст будет выведен в панель вывода, к этому выводу можно определить фильтр, о чем скажу ниже
    • Последние пункты соответственно вставят результаты или в текущую позицию в документе или в новый документ.
  • Фильтр - как будет восприниматься текст в панели вывода. Например, если это сообщения компилятора, можно выделить строки содержащие сообщения об ошибках компиляции, подсветить их красным и сделать возможность перехода на строку с ошибкой по клику мыши. Определено несколько стандартных фильтров:
    • Default - ничего не подствечивает, если строка вывода начинается с имя_файла:номер_строки то по клику по такой строке будет произведена попытка открыть файл и перейти на указанную строку.
    • Остальные специфичны для конкретных применений. Посмотреть их описания можно в /usr/share/moo/filters.xml

Описания языка LUA и Python можно посмотреть в справочном руководстве к редактору, в формате HTML, если он у вас установлен по тем же путям, то можно открыть по этой ссылке: file:///usr/share/doc/medit/help/sect-user-tools.html

Для SHELL скриптов, как самых простых в реализации, рассмотрим переменные окружения к которым можно обращаться:

  • $DOC - имя документа без пути к нему
  • $DOC_DIR - полный путь к документу
  • $DOC_BASE - имя документа без расширения (последнего элемента отделенного точкой)
  • $DOC_EXT - расширение документа
  • $LINE - номер строки в которой стоит курсор
  • $DATA_DIR - директория в которой хранятся настройки medit, бывает удобно, что бы некоторые сценарии сохраняли или читали от туда свои настройки.

Как реализовывать конкретный функционал, уже удел вашей фантазии.

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

Остальное

Тут кратко рассмотрю основные интересности о medit:

  • описание синтаксиса можно сохранять в пользовательскую директорию: ~/.local/share/medit/language-specs
  • свои фильтры можно добавлять в файл ~/.local/share/medit/filters.xml причем нужно писать только сам фильтр, например:
    <filter id="php-syntax-check" name="php-syntax-check">
      <match what="stderr" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)" style="output-error" /
      <match what="stdout" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)" style="output-error" /
    </filter>

    без всяких дополнительных обрамлений.

Собственно пока всё, будет дополняться.

// medit: 'PHP check syntax' tool

Medit5) замечательный редактор, написанный на Gtk, пока, за малым исключением, удовлетворяет все мои запросы. Корнями уходит графическому интерфейсу GGAP6) для GAP7). Будет время, напишу более полную заметку про него, благо, писать есть что.

Но сегодня рассмотрим вопрос создания тула 'PHP syntax check'.

Делаем тул

Первым делом идем в Изменить → Параметры → Инструменты вкладка Панель инструментов и создаем новый инструмент, даем ему имя 'PHP syntax check' и нажимаем Enter. Далее заполняем поля инстумента:

  • Файлы: langs:php
  • Параметры: need-doc или need-save (подробности в документации)
  • Тип команды: команда оболочки
  • Вывод: Панель вывода
  • В окне ввода скрипта пишем:
    php -l $DOC

Все, сохраняем, выходим. Теперь, когда мы будем редактировать php скрипт, у нас в меню Инструменты будет появляться пункт 'PHP syntax check', вывод по которому будет производиться в окно вывода.

Оптимизируемся

Тул работает, но если возникает ошибка, удобно было бы переходить по клику по не в окне вывода в нужное место документа.

Вспоминаем, что при создании инструмента был пункт Фильтр… Они нужны как раз, что бы Medit из потока вывода мог выбрать для себя нужные данные, на основе которых сделать какие-то действия. Только для наших задач фильтра нет. Нет, так создадим!

Идем в ~/.local/share/medit и создаем там файл filters.xml с, примерно, таким содержимым:

<filter id="php-syntax-check" name="php-syntax-check">
  <match what="stderr" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)"/>
  <match what="stdout" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;\d+)"/>
</filter>

Описания формата нет, а мои изыски на официальной вики канули в лету, поэтому пока так:

  • ?P<file>8) говорит Medit, что в этой позиции находится имя файла.
  • ?P<line>9) говорит Medit, что в этой позиции идет строка.

Все остальное - обычные регулярные выражения. Более подробные применения фильтров, можно глянуть в /usr/share/moo/filters.xml, особенно пасы с pop/push

Теперь идем обратно в Изменить → Настройки → Инструменты, 'PHP syntax check' и в качестве фильтра выбираем наш 'php-syntax-check' сохраняемся. Теперь если при проверке синтаксиса вылетит ошибка, мы можем перейти на неё, просто щелкнув по строчке с сообщением о ней.

В качестве дополнительного тюнинга, идем Изменить → Настройка горячих клавиш, в списке находим 'PHP syntax check' и задаем горячую клавишу, я задал F9.

Несколько снимков экрана, всё кликабельно:

Настройка инструмента

Настройка горячей клавиши, пример работы на заднем фоне

// Arduino: небольшой отчет по мастер-классу

Итак, в субботу случилось данное событие, всех и себя поздравляю :)

Все исходники по семинару (презентация, схемы, разводка, листинги программ) приложены в конце статьи.

Количество пришедшего народу несколько порадовало, хотя очень расстроило, что не было никого из политена (народное название ДВГТУ), кто сейчас там учится или преподает, особенно электрические машины, ведь, по сути, я продемонстрировал готовый вариант ШИМ управления двигателем, и применить подобную наработку в какой нибудь курсовой или дипломной работе - милое дело.

Вот новых лиц было малова-то: с Русланом Остапенко (учитель информатики из села Раздольного) приехали 4 школьника, надеюсь им было интересно и информация хоть частично осядет в их головах, и было 2 студента из ДВГУ— увидели объявление, заинтересовались.

В общем, главное, что был интерес.

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

В общих чертах рассказал что собой представляет плата Arduino, какие внешние интерфейсы предоставляет.

После беглого знакомства, перешли к демонстрации, того, что я сказал словами.

Первый пример, был типичным из оперы «Hello, world!», я назвал его - «Hello, Arduino!», представляет собой простейшую программку, которая дрыгает 13м цифровым выходом, устанавливая там поочередно высокий и низкий уровень. Сердобольные разработчики подумали о начинающих, что бы они смогли сделать быстро свой первый проект: на 13ю ногу посадили светодиод. Так что, дрыгая ногой, мы заставляем мигать его, получается простейший маячок :)

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

Результат - тот же маячок, только звуковой.

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

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

Далее, думаем, а ведь дергая ногой мы тоже формируем прямоугольные импульсы, а следовательно… А следовательно, что бы издавать звук морзянки, нам даже не нужна никакая внешняя схема!

В качестве примера генерации звука, я ограничился только бип-бип, дальше - полет фантазии.

После этого перешли к ШИМ 10), и опять таки, ничего сложного, по сути, то же дерганье ногой.

Демонстрационный стенд представлял собой ключ на мощном полевом транзисторе, для коммутации силовой цепи, кулер на 12В от старого компьютерного блока питания и сам блок питания стандарта АТ.

Программная часть была реализована с помощью программного ШИМ (без задержек) и с помощью ШИМ на таймере (используя только стандартную библиотеку Arduino 11)). Там же было реализовано базовое взаимодействие с пользователем через терминальную программу (в демонстрации использовал screen /dev/ttyUSB0 9600).

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

Затем перешли к вопросу: а можно сделать гирлянду на новый год? Можно, вот только 14ти светодиодов будет явно маловато, в случае индивидуального управления. Как быть? А так же, как быть, если для управления не хватает 14 цифровых выходов? Ответ находим листая даташиты (по русски - спроврочные листки) на микросхемы логики 74й серии (можно и любую другу, главное фантазия и предоставляемые возможности), находим там чудный образец 74HC595 - сдвиговый регистр 12).

Из всего умного: при помощи трех интерфейсных проводков (стробирование, клок и данные), накачиваем побитово байт в микруху, после чего переключаем состояние строба с высокого на низкий уровень, и заданные байтом биты становятся активными на выходах микросхемы. В итоге имеем преобразование - 3 выхода в 8. Но и это не все! Есть чудный выход 7', туда начинает вылазить, что не поместилось в 8 бит, а следовательно, мы можем их цеплять последовательно, получая на тех же самых 3х выходах 8-16-24 и т.д., главное, что бы быстродействия хватило :)

Подробнее популярно про сдвиговый регистр можно прочитать на сайте http://easyelectronics.ru, там же есть хак, как можно управлять регистром по 2м и даже 1 проводу (встречу в производстве - убью, такая фраза про это решение :))

Для демонстрационного стенда нарисовал схемку (gschem13)), сделал разводку (pcb14)) и по технологии ЛУТ сделал печатную плату, сделал с таким расчетом, что бы можно однотипные наращивать в каскады без пайки.

Программная часть представила собой 1 функцию для вывода байта в сдвиговый регистр и вывод цифр от 0 до 255 (от 0b00000000 до 0b11111111 в бинарном виде), индикация - светодиодами.

Теперь можно и собрать гирлянду и управлять сегментными индикаторами, на которые нужно много ног. Но помимо сегментных индикаторов, есть и LCD дисплеи на чипе HD4478015), по сути является стандартом де-факто. Демонстрационный стенд для подключения этого индикатора по 8битной и 4битной шине был следующим после сдвигового регистра. Программная часть была сделана на собственных функциях (полностью своя реализация работы с дисплеем, используя только справочный листок) и на библиотеки LiquidCrystal, идущий вместе с ПО Arduino.

Уже после семинара, я подключил данный индикатор через сдвиговый регистр, сделав так, что теперь на индикатор тратится 4 вывода, 3 из которых управляют сдвиговым регистром, а 1 заведен на Enable вывод LCD (без этого работа получалась не стабильной, где-то слетали тайминги и индикатор начинал сходить с ума).

На этом мои демонстрационные примеры закончились, и сделали небольшой экспромт: Руслан Остапенко, привез свой модуль Arduino с подключенным цифровым температурным датчиком DS18B20 с выводом строки с температурой на последовательный порт. Соединили RX/TX выходы Arduino, на моем модуле, настроил прием строки и вывод её на дисплей. Монстрообразно, нннно :)

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

В общем, Arduino хороший способ окунуться в мир микроконтроллеров, без опасности утонуть :)

PS Фото предвидятся.:

Материалы по мастер-классу

  • arduino_seminar_files.tar.bz2 - презентация, схемы, разводка печатных плат, исходные коды для Arduino, схема модуля Arduino 2009 + бонусом мои компоненты для schem и pcb
  • Справочные листки используемых компонент:

Полезные ссылки

10)
ШИМ (или PWM) - Широтно Импульсная Модуляция (Pulse Width Modulation)
11)
Подробнее - EN/RUS
12)
Что такое и с чем едят, а так же варианты другой логики - EN/RU
15)
Подробности - EN/RUS

// 0b00100100

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

Но суть не в том, там команды формируются битами и битами же в байте задаются её параметры. По классике жанра делаются примерно такие дефайны в шестнадцатеричном виде:

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

или в восьмеричном:

#define BIT0 0001
#define BIT1 0002
#define BIT2 0004
#define BIT3 0010
#define BIT4 0020
#define BIT5 0040
#define BIT6 0100
#define BIT7 0200

тут нетрудно проследить закономерности, разделив биты в группы по 4 (в hex представлении) или по 3 (начиная с нулевого, в oct представлении).

Но голова не резиновая, решил поискать, а не придумали что в C/C++ для непосредственного задания констант в битовом представлении.

Оказалось - придумали, по крайней мере в компиляторах GCC и GCC-AVR можно задавать непосредственно битовое число, используя префикс 0b:

#define BIT0 0b00000001
#define BIT1 0b00000010
#define BIT2 0b00000100
#define BIT3 0b00001000
#define BIT4 0b00010000
#define BIT5 0b00100000
#define BIT6 0b01000000
#define BIT7 0b10000000

или (кому как более наглядно):

#define BIT0 0b1
#define BIT1 0b10
#define BIT2 0b100
#define BIT3 0b1000
#define BIT4 0b10000
#define BIT5 0b100000
#define BIT6 0b1000000
#define BIT7 0b10000000

Не ручаюсь абсолютно на совместимость с другими компиляторами (да и нет её скорее всего), но интересно было бы узнать как там обстоят дела с подобной bin-нотацией констант.

PS да, объединять потом в нужное число или исключать нужные биты:

unsigned char c1 = BIT0 | BIT4 | BIT7; /* включить биты */
unsigned char c2 = c1 ^ BIT4; /*выключить биты */
if(c1 & BIT4) {} /* проверить установку бита */

UPD:
Вот выдержка из документа по GCC, страница 556:

6.56 Binary constants using the ‘0b’ prefix
nteger constants can be written as binary constants, consisting of a sequence of ‘0’ and ‘1’ digits, prefixed by ‘0b’ or ‘0B’. This is particularly useful in environments that operate a lot on the bit-level (like microcontrollers).

Секция 6 этого документа зовется «Extensions to the C Language Family», в начале этой секции говорится:

GNU C provides several language features not found in ISO standard C. (The ‘-pedantic’ option directs GCC to print a warning message if any of these features is used.) To test for the availability of these features in conditional compilation, check for a predefined macro GNUC, which is always defined under GCC.
These extensions are available in C and Objective-C. Most of them are also available in C++. See Chapter 7 [Extensions to the C++ Language], page 547, for extensions that apply only to C++.
Some features that are in ISO C99 but not C89 or C++ are also, as extensions, accepted by GCC in C89 mode and in C++.

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

// Пишите код так...

Проняло:

Стив Макконнелл:

«Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».

// Кроссплатформенная разработка ПО

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

  • вообще создать вменяемый инструментарий, а то наши уважаемые био-ботаники до сих пор то, что делает программа, чертят на миллиметровке, а замеров может быть до 1.5 и более тысяч…
  • создать программу кроссплатформенной, для чего выбрана библиотека QT4.
  • ну и вспомнить старое забытое, да потрудиться на благо родной науки.

В процессе написания, иногда возникают проблемы или трудности, кутишного Assistant практически всегда хватает, но иногда что-то всё равно не идет, и нужна сторонняя справочная информация. В результате поисков случайно наткнулся на сайт http://www.crossplatform.ru - много информации на русском языке для написания кроссплатформенных программ, по QT4, в частности, ооооочень много материалов на русском, пользуйтесь :-)

// date +%j

Сегодня эта команда выдала:

[hatred@gaz ~]$ date +%j
256

С Днем Программиста! :-)

// фикс отображения иконок приложений в lxpanel

Поставил как среду себе LXDE, подробности описывать не буду, или потом.

Первое что бросилось в глаза: в таскбаре панели lxpanel не отображаются иконки приложений, точнее отображается, но дефолтные. Покурил исходники, покурил исходники плагина, соотстветствующего, из XFCE4, покурил библиотечку libwnck. И вот родилось решение, даже два: просто и сложное.

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

Оба решения требуют патчинга одного файла в исходниках lxpanel

  • простое решение, фиксится только одна строчка. Иконки у QT приложений отображаются крайне некузяво (черно-белые).
  • сложное решение, фикса на много строчек :) но отображаются все иконки нормально. Идея позаимствована из кода libwnck, которые, согласно комментам, позаимствовали код у метасити, вот такая чехорда.

Да, в сложном решении иконки как-то съехавшими получаются, чуток,не напряжно на глаз мозолит, если кто скажет где я ошибку сделал, буде премного благодарен, ибо дело к ночи и так со вставленными спичками фикс пишу и этот отчет страпаю :)

Ссылки:

// cuneiform-linux

На заметку: https://launchpad.net/cuneiform-linux

Проект портирования распознавалки CuneiForm под Linux

// D programming language

Немного заинтересовался сабжем. Собственно небольшая компиляция опыта.

Компилятор

Пока однозначно GDC - бакенд для gcc. На сайте подробные инструкции как собирать. Для ArchLinux есть в AUR:

  • gdc-bin - бинарная сборка, дабы не мучаться (для AMD64 есть).

Туториалы и документация

Небольшой туториал для начинающих: http://www.dprogramming.com/tutorial1.php

Документация: http://www.quit-clan.de/docwiki/view.php?pageid=1

Стандартная библиотека Phobos от DigitalMars: http://www.digitalmars.com/d/2.0/phobos/phobos.html

Learn to Tango with D (eng) http://www.dsource.org/projects/tango/wiki/LearnToTangoWithD

A Postmortem of Game Programming with Digital Mars (eng) http://www.gamedev.net/reference/articles/article2451.asp

Регулярные выражения: http://www.digitalmars.com/d/2.0/regular-expression.html

Исключения: http://www.digitalmars.com/d/2.0/exception-safe.html

Русский форум по языку: http://forum.dprogramming.ru

Примеры кода

В AUR нашел игрушку на D: torus-trooper

Расчет площади круга: http://www.dprogramming.com/CA_prompt.html

Пример работы с файлами: http://www.dprogramming.com/FileTutorial.html

Различные проекты: http://dsource.org/projects/

Биндинги и библиотеки

Хидеры для SDL и GL: http://shinh.skr.jp/d/porting.html

Коллекция D биндингов к C библиотекам, полезные в разработке мультимедийных приложений: http://www.dsource.org/projects/derelict

Коллекция GUI биндингов и библиотек: http://www.prowiki.org/wiki4d/wiki.cgi?action=browse&amp;id=GuiLibraries&amp;oldid=AvailableGuiLibraries. Видно что стандартная библиотека основана на SWT, думается что и поддтормаживать будет аналогично, инетересена так же реализация биндингов FLTK: http://dronten.googlepages.com/fltk4d, а так же TK: http://www.algonet.se/~afb/d/dtk.html, wxD - биндиниги для wxWidgets: http://wxd.sourceforge.net/

Биндинги GTK+ к D: http://dsource.org/projects/gtkd

Утилиты для разработки

Интересная утилита для преобразования сишных хидеров в формат D: http://dsource.org/projects/h2d. Кроме неё следует посмотреть на этот проект для генерации биндингов: http://dsource.org/projects/bcd, или информацию на официальном сайте: http://www.digitalmars.com/d/2.0/htomodule.html

Патчи к GDB для отладки программ на D: http://dsource.org/projects/gdb-patches

Среда разработки для D: http://dsource.org/projects/poseidon. Либо можно использовать Code::Blocks, для ArchLinux можно утянуть из AUR: http://aur.archlinux.org/packages.php?ID=14922

// Книги по Qt4

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

UPD:

И вообще сайт с электронной компьютерной литературой: http://www.ebookscomputer.ru/

// Полезные доки

Изучаем tput

Что такое tput?

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

Читать далее...

Ассемблер в Linux для программистов C

Эта книга ориентирована на программистов, которые уже знают C на достаточном уровне. Почему так? Вряд ли, зная только несколько интерпретируемых языков вроде Perl или Python, кто-то захочет сразу изучать ассемблер. Используя C и ассемблер вместе, применяя каждый язык для определённых целей, можно добиться очень хороших результатов. К тому же программисты C уже имеют некоторые знания об архитектуре процессора, особенностях машинных вычислений, способе организации памяти и других вещах, которые новичку в программировании понять не так просто. Поэтому изучать ассемблер после C несомненно легче, чем после других языков высокого уровня. В C есть понятие «указатель», программист должен сам управлять выделением памяти в куче, и так далее — все эти знания пригодятся при изучении ассемблера, они помогут получить более целостную картину об архитектуре, а также иметь более представление о том, как выполняются их программы на C. Но эти знания требуют углубления и структурирования.

Хочу подчеркнуть, что для чтения этой книги никаких знаний о Linux не требуется (кроме, разумеется, знаний о том, «как создать текстовый файл» и «как запустить программу в консоли»). Да и вообще, единственное, в чём выражается ориентированность на Linux, — это используемый синтаксис ассемблера. Программисты на ассемблере в DOS и Windows используют синтаксис Intel, но в системах *nix принято использовать синтаксис AT&T. Именно синтаксисом AT&T написаны ассемблерные части ядра Linux, в синтаксисе AT&T компилятор GCC выводит ассемблерные листинги и т. д.

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

Читать далее...

// Lazarus

Давно слышал, всё никак не собирался посмотреть. А суть что: это IDE для программирования на FreePascal написанное на GTK1 (да-да, именно на первой версии). Уже стало уныло, правда?

Но дальше следует, что это не просто новая IDE, а это суть создание аналога Delphi, в свободном виде, и, знаете - это здорово получилось, вплоть до того что работают некоторые юниты для Delphi 6-7. Меня больше впечатлило, что итоговая программа буквально одним движением может стать написанной на GTK1 или GTK2 или вообще на QT4, короче, для быстрого «на набросать» приложение вполне себе так подручное средство.

UPD: очепятка, не Zalarus, а Lazarus

// DigiKam Picasaweb и kipi-plugins

Собственно в продолжении вот этой темы

Сделал патч для kipi-plugins 0.1.5rc2

Нашел схожий по тематике Bug-Report на bugs.kde.org:

И запостил туда своё решение проблемы.

// Picasaweb и digiKam

Курил сегодня kipi плагин для digiKam, который позвоялет аплодить картинки в галереи picasaweb (http://picasaweb.google.com/adrozdoff). Теперь умеет то что должен уметь, и что было недоступно по каким-то непонятным причинам:

  • отображать список галерей
  • в списке галерей отображать не только общедоступные галереи
  • аплодить файлы в галереи, имя которых состоит не из одного латинского слова

Сейчас спать очень хочется, чуть позже выложу патч для версии kipi-plugins 0.1.5rc1

// Tcl он же тикль

Интересная коллекция ссылочек, итак начнемс:

  • PLEAC-Tcl – Коллекция решённых на Тикле задач, из описания с сайта:
Following the Perl Cookbook (by Tom Christiansen and Nathan Torkington, published by O'Reilly) spirit, the PLEAC Project aims to gather fans of programming, in order to implement the solutions in other programming languages.

In this document, you'll find an implementation of the Solutions of the Perl Cookbook in the Tcl language.
  • http://tclstudy.narod.ru – Уроки Tcl/Tk на русском, статьи, примеры, минимальный дистрибутив. Очень полезно будет новичкам.
  • Visual Tcl – Из названия понятно, для быстрого проектирования интерфейсов на Tk

// День программиста, Free!Music и прочите радости

День программиста

Вчера было 13 Сентября, это 256 день в году, кому не известно - 256 день в году (12 сентября в високосные годы и 13 сентября в невисокосные годы) вляется неофициальным праздником - День программиста, я как представитель данной профессии с радостью принимаю поздравления и поздравляю всех своих коллег по цеху. Посмотреть информацию на ru.wikipedia. И еще материалы, по большей части чуть юморные:

FREE!MUSIC

Таня поделилась информацией по проекту Free!Music. Вот собственно ссылка на запись в её блоге на ЗБГ и на LiveJournal

Манифес Free!Music:

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

Подробнее...

Про QNX

Читая новости на LOR'е нактунлся на такую: QNX Neutrino становится открытым Я очень рад буду попользоваться этой операционкой, ибо юзая демки на дискетках куда на 1.44 мега помещалась сама ось, драйвера для сетевухи, файловый менеджер и интернет-браузер, понял что данная ось заслуживает хотя бы того, что с ней нужно подробнее разобраться. К сожалению сразу после этого мне не удалось достать полноценные инсталляции QNX, а потом и интерес немного поугас.

Небольшая справка:

QNX — коммерческая POSIX-совместимая операционная система реального времени, предназначенная преимущественно для встраиваемых систем. Считается одной из лучших реализаций концепции микроядерных операционных систем.

Подробнее...

Графика, графики и OpenGL - MathGL

Опять таки, уперто с ЛОРа: http://www.linux.org.ru/view-message.jsp?msgid=2139780

Смысл, библиотека и готовый FrontEnd для рисования математических графиков, возможности обширные, есть часть которые уже реализаованы в Gnuplot, но есть куча таких что Gnuplot и не снились. Отрадно что разработчик - наш соотечественник. Скорее всего возьмусь делать и комитить PKGBUIL для Arch Linux и буду зеркалить актуальные файлы у себя на машине.

Ссылки:

UniConverter

Утилита позволяющая конвертировать файлы различных векторных форматов друг в друга. Отрадно что есть поддрежка CorelDraw версий с 7 по 13 (последняя на текущий момент). В планах импортера для форматов M$ Visio

Ссылки:

Ну и в догонку, ссылка на сайт www.linuxgraphics.ru - Заношу в полезные ссылки.

// 2007.06.05 Вот уже совпадения

За последний год меня подобные совпадения уже чуть ли не преследуют: только начал вспоминать снова Emacs и использовать его как среду кодирования, при этом посыпая голову пеплом, что версия текущая уже достаточно старая (2007.05.31 Emacs), и вот оппа… буквально 2го июня выходит в свет официальная версия Emacs 22.1. Ура.

Домашняя страница сея чуда: http://www.gnu.org/software/emacs/
Обсуждение на ЛОР'е: http://www.linux.org.ru/view-message.jsp?msgid=1951939

Тут еще попалась статья, точнее руководство по портированию .NET приложений в Mono:
http://www.mono-project.com/Guide:_Porting_Winforms_Applications

На ЛОРе же наткнулся на статью Трафик-компрессор для пользователей Dial-Up Скорее всего попробую поднять что бы давать доступ по GPRS когда с телефона сидеть буду.

И еще интересное: Потоковое вещание с помощью mpd и icecast

Ага, тут еще попалась инфа что вышла новая версия (правда RC) текстового WYSIWYM процессора LyX, давно его не пробывал использовать, а тут говорят даже появилась QT4 морда (почему-то у меня какая-то слабость к этой библиотеке). Нужно будет попробывать, а если кратко: основа форматирования TeX. Имеется возможность вмешиваться в исходный код документа. Больше пока ничего сказать не могу, сам ипользую для сложного форматирования LaTeX (дистрибутив TeXLive) (и морду texmaker (раньше было Kile)), а для простых записок - или простой текстовый редактор, какой под руку попадется, или OpenOffice.org.ru.
Домашняя страница

// 2007.05.21 Полезные ссылки

  • Для Firefox:
    • Download Statusbar - Надстройка над стандартным менеджером закачек Firefox'а, позволяет возобновлять закачки.
    • DownThemAll! - позволяет закачать все файлы с текущей страницы. Удобно для стягивания во время серфинга с FTP или HTTP архивам.
    • Вообще еще можно посмотреть статьи на iXBT тут и тут
  • Программинг:
  • Ну и в догонку, относительно ArchLinux:

// 2007.04.16 Ядра, винты, Qt4

Kernel Panic

Что-то вот вылетело. Вчера решился таки убить нафиг Arch32 систему и переселить на постоянное место жительства Arch64 со старого Seagate на Maxtor. Дал отмашку:

[root: ~]# mount /dev/hda5 /mnt/hda5
[root: ~]# cd /mnt/hda5
[root: hda5]# dump -f - / | restore -r -f -

Через несколько минут имею в своём расположении… ага щаз, «перенесенную систему», Kernel Panic с пояснением: Hardware Exception (fail sync).

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

Ладно, систему я таки перенес, делая покаталожно dump -f - /bin(usr,etc,…) | restore -r -f -; sync; sync; sync

Qt4

Потом решил вспомнить навыки программирования на Qt… Да что там, сразу на Qt4 ;)
Оказалось что того что знал на Qt3 уже достаточно устарело, пришлось заново штудировать инфу.

В результате нашел небольшую, куцую но.. мне достаточную IDE QDevelop, которая вообще, сама написана на Qt4, кроме того OpenSource и еще, есть бинарники для Window$.

Далее несколько ссылочек:

В общем пока вот все.