суббота, 31 декабря 2016 г.

Релиз r49-20161231



Версии компонентов:
  • libtoxic v7.5.4
  • cr49 v1.3.0
  • Qr49 v3.12.6
Изменения:
  1. libtoxic: устранена ошибка, приводящая к появлению мусора в отчете ReportGAS_OST_37.001.234-81 при некоторых сочетаниях исходных данных;
  2. Qr49: некоторые внутренние улучшения;
  3. Общее: сборка под Windows выполнена с использованием Qt версии 5.7.1.

Релиз reup-1.11.0


Да, вот так после 1.7.0 сразу 1.11.0. На самом деле скачка не было, просто промежуточные версии не публиковались. Из изменений в 1.11.0: обеспечена работа с файлами edc, оптимизированы правила генерации makefile, незначительные внутренние улучшения.

четверг, 29 декабря 2016 г.

Emacs Lisp. Конвертирование массива ASCII в текст и обратно

По работе мне достаточно часто приходится работать с текстовыми файлами, содержащими строки в виде массивов ASCII, где значения отдельных символов разделены точкой с запятой. Что-то типа "118;50;48;49;54;49;50;50;57". Разумеется, хотелось бы увидеть эту информацию в более комфортном для человека виде, как то "v20161229", откорректировать и преобразовать обратно в массив ASCII. Так как с текстом я почти всегда работаю в emacs, то самым логичным решением было бы написать пару функций на emacs lisp. Тем более, что пользоваться какими-то приложениями, таская текст из редактора в буфер, потом в специальный конвертер, потом опять в буфер и, наконец, обратно в редактор, ну вообще не вариант.
Код функций получился вот таким.
(defun pa23-ascii2text (start end)
  "Convert ASCII codes to text."
  (interactive "r")
  (let ((text))
    (progn
      (setq line  (buffer-substring-no-properties start end))
      (setq ascii (split-string line ";"))
      (mapc
       (lambda (code)
         (push (string-to-number code) text)
         )
       ascii )
      )
    (delete-region start end)
    (insert (apply 'string (reverse text)))
    )
  )

(defun pa23-text2ascii (start end)
  "Convert text to ASCII codes."
  (interactive "r")
  (let ((temp) (ascii))
    (progn
      (setq temp (string-to-list (buffer-substring-no-properties start end)))
      (mapc
       (lambda (code)
         (setq ascii (concat ascii (number-to-string code) ";"))
         )
       temp )
      )
    (delete-region start end)
    (insert (substring ascii 0 -1))
    )
  )
Работа с функциями выглядит следующим образом: выделяем нужный текст, вызываем соответствующую функцию, выделенный текст будет заменен выхлопом функции.

пятница, 12 августа 2016 г.

ICU for Windows (MinGW)

Для одного из проектов мне потребовался драйвер qsqlite с поддержкой icu. Разумеется, для пересборки драйвера мне, в данном случае, потребовались также и сами библиотеки icu, которые, ввиду отсутствия необходимых бинарников, пришлось собирать из исходников.
Для тех, кто под Windows тоже использует gcc, я решил выложить бинарники icu на sourceforge. Пожалуйста, пользуйтесь.

вторник, 12 апреля 2016 г.

Arch Linux. Глобальные настройки сглаживания шрифтов

Похоже, что какое-то из последних обновлений отключило мне сглаживание шрифтов в системе. Я много работаю с текстом, поэтому для меня очень важно, чтобы шрифты выглядели идеально, причем во всех программах.
Для GTK2 мы можем использовать такие удобные конфигураторы как lxappearance или obconf, гномофилы в курсе о gnome-tweak-tool. Но даже если мы зарядим необходимые настройки сглаживания шрифтов во всех этих программах, то тот же Firefox все равно будет выглядеть паршиво.
Что же делать? Понятно что - идти в каталог /etc/fonts. Здесь вы найдете каталог с доступными конфигурациями шрифтов (conf.avail) и каталог с символическими ссылками на используемые системой файлы из этих доступных (conf.d). Мне необходимо было включить полный хинтинг и субпиксельное отображение rgb. Для этого я создал символические ссылки в каталоге /etc/fonts/conf.d на файлы /etc/fonts/conf.avail/10-hinting-full.conf и /etc/fonts/conf.avail/10-sub-pixel-rgb.conf. Вот и все. Теперь у меня опять все четко.

понедельник, 11 апреля 2016 г.

Emacs. Горячие клавиши в русской раскладке

Для использования горячих клавиш emacs в русской раскладке клавиатуры необходимо добавить в файл конфигурации следующий код
(defun cfg:reverse-input-method (input-method)
  "Build the reverse mapping of single letters from INPUT-METHOD."
  (interactive
   (list (read-input-method-name "Use input method (default current): ")))
  (if (and input-method (symbolp input-method))
      (setq input-method (symbol-name input-method)))
  (let ((current current-input-method)
        (modifiers '(nil (control) (meta) (control meta))))
    (when input-method
      (activate-input-method input-method))
    (when (and current-input-method quail-keyboard-layout)
      (dolist (map (cdr (quail-map)))
        (let* ((to (car map))
               (from (quail-get-translation
                      (cadr map) (char-to-string to) 1)))
          (when (and (characterp from) (characterp to))
            (dolist (mod modifiers)
              (define-key local-function-key-map
                (vector (append mod (list from)))
                (vector (append mod (list to)))))))))
    (when input-method
      (activate-input-method current))))
(cfg:reverse-input-method 'russian-computer)

Данное решение было найдено здесь http://reangdblog.blogspot.com/2015/05/emacs.html

понедельник, 21 марта 2016 г.

QSqlRelationalTableModel и setFilter()

При использовании класса QSqlRelationalTableModel для работы с таблицей БД, содержащей внешние ключи, я столкнулся с проблемой установки фильтров посредством функции setFilter(). К сожалению, документация Qt не изобилует объяснениями по работе с данной функцией (что для Qt весьма нетипично), а стоило бы кое-что прояснить...
Особенность заключается в том, что для фильтрации данных по столбцу, для которого вы установили, к примеру
my_relation_table_model->setRelation(3, QSqlRelation("customers", "id", "name"));
фильтр будет выглядеть следующим образом
my_relation_table_model->setFilter("relTblAl_3.name='" + some_text + "'");
Вы поняли? Такая дикая неочевидность, да еще и никак не отраженная в документации, меня весьма удивила.

Спасибо вот этой заметке. Сам бы я долго гадал.

Qt. Деактивация консольного окна в приложении с GUI

Если по каким-либо причинам запуск вашего приложения с GUI на Qt происходит совместно с консольным окном (случается под Windows, например, при использовании функционала из модуля testlib), а оно вам совсем не надо, то не отчаивайтесь, все поправимо ) Для деактивации консольного окна необходимо добавить в файл проекта следующие указания
QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,windows

sqlite и таблицы с внешними ключами

Если вы столкнулись с тем, что у вас не работают внешние ключи в базе данных sqlite, то я более, чем уверен, что вы забыли о том, что первым запросом к такой БД должен быть
PRAGMA foreign_keys=ON

sqlite. Экспорт и импорт данных на примерах

В данной заметке я хочу привести примеры экспорта и импорта данных при работе с sqlite. Будем использовать утилиту sqlite3.

Пример экспорта таблиц базы в файлы формата csv.
[pa23@pa23comp 1]$ sqlite3 my_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .tables
table1  table2
sqlite> .header on
sqlite> .mode csv
sqlite> .once table1.csv
sqlite> select * from table1;
sqlite> .once table2.csv
sqlite> select * from table2;
sqlite> .exit
[pa23@pa23comp 1]$ ls
my_database.db  table1.csv  table2.csv
[pa23@pa23comp 1]$ 
Пример импорта данных из файлов csv в таблицы базы.
[pa23@pa23comp 1]$ ls
my_database.db  table1.csv  table2.csv
[pa23@pa23comp 1]$ sqlite3 my_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .tables
table1  table2
sqlite> .mode csv
sqlite> .import table1.csv table1
sqlite> .import table2.csv table2
sqlite> .exit
[pa23@pa23comp 1]$ 
Пример сохранения схемы базы данных в файл sql.
[pa23@pa23comp 1]$ ls
my_database.db
[pa23@pa23comp 1]$ sqlite3 my_database.db .schema > my_database_schema.sql
[pa23@pa23comp 1]$ ls
my_database.db  my_database_schema.sql
[pa23@pa23comp 1]$ cat my_database_schema.sql 
CREATE TABLE table1 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
CREATE TABLE table2 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
[pa23@pa23comp 1]$ 
Пример полного бэкапа базы данных в файл sql (схема и данные).
[pa23@pa23comp 1]$ ls
my_database.db  my_database_schema.sql
[pa23@pa23comp 1]$ sqlite3 my_database.db .dump > my_database_dump.sql
[pa23@pa23comp 1]$ ls
my_database.db  my_database_dump.sql  my_database_schema.sql
[pa23@pa23comp 1]$ cat my_database_dump.sql 
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE table1 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
INSERT INTO "table1" VALUES(1,'Yaroslavl');
INSERT INTO "table1" VALUES(2,'Vologda');
INSERT INTO "table1" VALUES(3,'Kostroma');
INSERT INTO "table1" VALUES(4,'Ivanovo');
CREATE TABLE table2 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
INSERT INTO "table2" VALUES(1,'Volga');
INSERT INTO "table2" VALUES(2,'Toshnya');
INSERT INTO "table2" VALUES(3,'Kostroma');
INSERT INTO "table2" VALUES(4,'Uvod');
COMMIT;
[pa23@pa23comp 1]$ 
Пример восстановления базы данных из скрипта sql.
[pa23@pa23comp 1]$ ls
my_database.db  my_database_dump.sql  my_database_schema.sql
[pa23@pa23comp 1]$ sqlite3 my_new_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .read my_database_schema.sql 
sqlite> .exit
[pa23@pa23comp 1]$ 

пятница, 11 марта 2016 г.

Emacs Lisp. HEX to DEC and DEC to HEX

Последнее время частенько требуется по-быстрому перевести значения каких-нибудь параметров из hex в dec или наоборот. Наш самый надежный друг и товарищ Emacs всегда под рукой, а его служебный буфер *scratch*, в котором можно выполнять код Emacs Lisp, всегда готов услужить. Калькуляторами я не пользуюсь давно, ибо с помощью Emacs прикинуть какие-то цифры весьма и весьма удобно. И не только прикинуть, а еще и сконвертировать из одной системы счисления в другую. Да, я знаю о встроенном в Emacs калькуляторе, но работать с кодом Emacs Lisp, лично мне, как-то удобнее.
Итак, для того, чтобы преобразовать десятичное число в шестнадцатеричное или наоборот, следует воспользоваться встроенной в Emacs Lisp функцией format. Привожу примеры ее использования.
(format "%d" #x07d0)
"2000"

(format "%x" 505)
"1f9"

(format "%04x" 505)
"01f9"

(upcase (format "%04x" 505))
"01F9"