суббота, 15 ноября 2014 г.

Настройка шрифта в Ubuntu

В директории ~/.config/fontconfig/font.conf находятся настройки шрифтов. Для управления сглаживанием, хинтингом нужно использовать этот файл.

Мой конфиг представлен ниже:
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

  <match target="pattern">
    <edit name="dpi" mode="assign">
      <double>96</double>
    </edit>
  </match>


 <!-- Disable sub-pixel rendering.
 X detects it anyway, and if you set this as well, it just looks really horrible  -->
<match target="font" >
<edit mode="assign" name="rgba" >
<const>none</const>
</edit>
 </match>
 <match target="font" >
<edit mode="assign" name="hinting">
<bool>true</bool>
</edit>
 </match>
 <match target="font" >
<edit mode="assign" name="hintstyle">
<const>hintfull</const>
</edit>
 </match>

<match target="font">
  <edit mode="assign" name="antialias">
    <bool>true</bool>
  </edit>
</match>

 <match target="font">
   <test qual="any" name="family" compare="eq">
     <string>Verdana</string>
     <string>Arial</string>
     <string>sans-serif</string>
     <string>Courier New</string>
   </test>
   <edit mode="assign" name="antialias">
     <bool>false</bool>
   </edit>
 </match>

<!-- Helvetica is a non true type font, and will look bad.
 This replaces it with whatever is the default sans-serif font -->
 <match target="pattern" name="family" >
<test name="family" qual="any" >
<string>Helvetica</string>
</test>
<edit mode="assign" name="family" >
<string>Verdana</string>
</edit>
 </match>

 <dir>~/.fonts</dir>

</fontconfig>

ps man fonts-conf 

четверг, 9 октября 2014 г.

Настройка wifi на Lenovo b590 под Astra Linux

Для настройки встроенного модуля wifi на ноутбуке Lenovo B590 под Astra Linux необходимо установить пакет из ubuntu bcmwl-kernel-source_6.20.155~bdcom-0ubuntu0.0.2_amd64.deb
ps ранние версии драйвера не работают

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

Ubuntu не видит мой wi-fi

Ноутбук леново не видит мою сеть wi-fi. Остальные видит, а мою нет. Причем сеть не скрытая, другие устройства ее видят. Роутер dlink. Решение: изменить канал в настройках роутера, поставил auto, теперь видит.

http://kosumosu.ru/index.php?id=75

пятница, 1 августа 2014 г.

Создание пользователя и установка прав в MYSQL

GRANT SELECT ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON db_name.* TO 'username'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'username'@'localhost'

вторник, 29 июля 2014 г.

Двусторонняя синхронизация удаленных директорий (unison и incron)

Для двусторонней синхронизации двух и более директорий, размещенных на разных узлах, отлично подходит утилита unison. Основным отличием от других инструментов зеркалирования является ее способность производить синхронизацию в обе стороны на основании реплик каждого узла.
Утилита incron позволяет отслеживать события файловой системы в определенном каталоге, и по любому событию запускать определенный скрипт. Это позволяет автоматизировать синхронизацию двух каталогов, если в исполняемом скрипте запускать команду unison. Это при условии, что настроек беспарольный доступ по ssh на другую машину. Нужно уточнить, чтобы работал беспарольный доступ из скрипта, необходимо экспортировать переменную окружения HOME=dir для пользователя, от которого производится беспарольный доступ.
Подробнее в материалах ниже:
http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html
http://rbgeek.wordpress.com/2012/08/30/file-synchronization-between-two-ubuntu-servers-using-unison/
http://www.cyberciti.biz/faq/unison-file-synchronizer-tool/
http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
http://stackoverflow.com/questions/1034243/how-to-get-a-unix-script-to-run-every-15-seconds

понедельник, 7 июля 2014 г.

Подключение к инету через прокси в eclipse

В eclipse, начиная с версии luna, изменился подход к аутентификации к прокси серверу для инета. Ранее необходимо было указывать в имени пользователя еще и домен (ELINS\serkin), теперь этого не требуется (просто имя пользователя, serkin)

пятница, 4 июля 2014 г.

Установка и настройка необходимых пакетов для чистой ubuntu или mint

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install aptitude mc ncdu zsh xneur pidgin kmail ttf-mscorefonts-installer krusader openssh-server python-svn subversion git g++-4.8 gcc-4.8 g++ gcc cmake qtcreator

chsh -s /bin/zsh

# java от oracle (необязательно, openjdk справляется)
java -version
sudo apt-get remove openjdk*
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer


ps: при наличии прокси к инету лучше зайти под sudo (например, sudo mc) и выполнять команды без предварительной sudo. Это позволит выполнить инсталляцию ttf шрифтов и java от oracle, т.к. они обращаются дополнительно к внешним ресурсам. Хотя в случае, если в /etc/sudoers настроены Defaults на окружение пользователя, то это делать необязательно

вторник, 10 июня 2014 г.

Создание deb пакета с произвольным содержимым

Частенько возникает необходимость собрать пакет с какими либо файлами, из которых скомпилировать ничего нельзя. В моём случае это чаще всего самописные bash-скрипты, файл с public ключами ssh… Ещё интересная идея так же паковать архивы.
В рассмотренном ниже примере мы создадим один deb пакет с аж тремя вкусными штуками:
1) конфигурационные файлы nginx с нашего сервера
2) файл с public ключами для авторизации обладателей закрытой части этих ключей на сервере рутом
3) скрипт /usr/bin/ourscript.sh (неважно что он делает, по сути)
Принцип одинаковый, просто мне удобно показать сразу три примера. Пакет будет называться nginxsuperconfig
Предрекая вопросы «а зачем тебе fakeroot, если всё делаешь рутом?». Удобно. А главное — просто и быстро.
Начнем-с с создания нужных каталогов и копирования в эту структуру нужных нам файлов. Каталог DEBIAN должен быть написан именно большими буквами. Остальные каталоги — воссоздание структуры необходимых нам файлов с условным корнем в виде каталога /root/builder/nginxsuperconfig/. То есть всё, что лежит в этом каталоге (кроме DEBIAN) просто распакуется в корень. Как будто вы создадите tarболл с содержимым этого каталога и распакуете его в корень.
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/DEBIAN
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/etc
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/usr/bin
root@builder:~# mkdir -p /root/builder/nginxsuperconfig/root/.ssh
root@builder:~# cp -r /etc/nginx /root/builder/nginxsuperconfig/etc
root@builder:~# cp /usr/bin/ourscript.sh /root/builder/nginxsuperconfig/usr/bin/
root@builder:~# cp /root/.ssh/authorized_keys /root/builder/nginxsuperconfig/root/.ssh/
Теперь нам понадобится написать файлы, описывающие свойства пакета. Обязательным является только файл DEBIAN/control. Для примера я ещё напишу несколько скриптов — один из них будет выполняться перед установкой пакета, второй — по окончанию и ещё один — при удалении пакета.
Напишем файл control:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/control
Я перечислю обязательные поля. На самом деле туда можно много чего написать, но это уже лучше поискать в сети:
Package: nginxsuperconfig
Version: 1.0-1
Section: misc
Priority: extra
Maintainer: inkvizitor68sl 
Architecture: all
Depends: nginx, openssh-server, bash
Description: Example package
Package with nginx configs, ssh keys, example script.
Немного прокомментирую.
Package — название пакета.
Version — версия. Через дефис пишем «номер сборки». Например, если вы слегка поправили файл в содержимом, но версия пакета не сменилась. В данном случае мы сами решаем какая у нас версия, потому можно не париться и всегда ставить версия-1
Section — для случаев рассмотренных в примере больше всего подходит misc
Priority — аналогично, подходит extra
Maintainer — ваше имя/ник и почта
Depends — в простейшем случае через запятые перечисляем имена пакетов, которые должны быть установлены, чтобы ваш пакет работал. В нашем случае — nginx (мы же для него конфиг льем), openssh-server (а зачем ключи, если ssh сервера нет?), bash, без которого не запустится наш скрипт.
Description — строка с кратким описанием пакета (не более 70 символов). Следующие строки — полное описание пакета. Перенос строки — точка.
Теперь создадим нужные скрипты.
Выполняемый перед инсталляцией:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/preinst
#!/bin/bash
mv /etc/nginx /etc/nginx.bak
mv /root/.ssh/authorized_keys /root/.ssh/authorized_keys.old
Выполняемый после инсталляции:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/postinst
#!/bin/bash
/etc/init.d/nginx restart
chmod +x /usr/bin/ourscript.sh
Выполняемый после удаления:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/postrm
#!/bin/bash
rm -r /etc/nginx
mv /etc/nginx.bak /etc/nginx
rm /root/.ssh/authorized_keys
mv /root/.ssh/authorized_keys.old /root/.ssh/authorized_keys
Ещё можно создать выполняемый перед удалением скрипт:
root@builder:~# editor /root/builder/nginxsuperconfig/DEBIAN/prerm
В общем-то всё готово к сборке пакета:
root@builder:~# cd /root/builder/
root@builder:~# fakeroot dpkg-deb --build nginxsuperconfig

Мы получим файл nginxsuperconfig.deb. Неплохо его ещё переименовать, чтобы в названии содержалась версия:
root@builder:~# mv nginxsuperconfig.deb nginxsuperconfig_1.0-1.deb
Вот в общем-то и всё. Напоминаю, что это простейший пример. Я не ставил перед собой задачи написать очередной огромный непонятный мануал про сборку пакетов. Я постарался описать именно простейший способ собрать свой собственный deb пакет с данными. Ах да, не забудьте, что таким способ можно собрать метапакет для личного использования. То есть пакет, который сам ничего не содержит, зато по зависимостям тянет всё нужное.
Куда слать вопросы, думаю, знаете =)

ИСТОЧНИК: https://debian.pro/426

воскресенье, 8 июня 2014 г.

Стили для kde

Оформление рабочей среды:
Оформление окон - forman или chrome grayscale
Тема рабочего стола - Invisible или Oxygen (black)

среда, 4 июня 2014 г.

Фикс управления яркостью в Ubuntu 14.04

http://itsfoss.com/fix-brightness-ubuntu-1310/

sudo touch /usr/share/X11/xorg.conf.d/20-intel.conf
sudo mcedit /usr/share/X11/xorg.conf.d/20-intel.conf

Section "Device"
        Identifier  "card0"
        Driver      "intel"
        Option      "Backlight"  "intel_backlight"
        BusID       "PCI:0:2:0"

EndSection

воскресенье, 18 мая 2014 г.

lenovo b590 broadcom 43142 wifi adapter on ubuntu 12.04

Из коробки в убунту 12.04 wifi модуль не поднимается. Необходимо установить пакет
sudo aptitude install bcmwl-kernel-source

Восстановлени ldap для openfire

При изменении параметров ldap админами или случайном вводе неверных параметров невозможно подключиться к веб-интерфейсу из-за некорректных настроек. Для исправления проблемы нужно зайти в БД openfire и исправить неверное свойство в таблице настроек.

Например,
update ofProperty set propValue='DC=elins,DC=internal' where name = 'ldap.baseDN';
update ofProperty set propValue='srv-dc-07' where name = 'ldap.host';

четверг, 6 марта 2014 г.

Хранение объектов БД в памяти

В одном проекте появилась идея загрузить объекты из БД один раз, и работать с моделью домена в памяти, т.е. исключить постоянные запросы к БД. По необходимости выполнять сохранение данных в БД. По сути, в этом случае БД является просто хранилищем данных. В этом проекте в теории не могло быть больше двух клиентов, одновременная работа с одними и теми же данными тоже не должна была вестись. Так что идея вроде здравая. И использование методики разработки корпоративных приложений, когда хранение объектов в памяти клиентов может привести к рассогласованности с БД и нужно выполнять сохранение в БД как можно чаще, не требуется.
Но  оказалось, что при работе с ORM (qxorm) сложно обеспечить двустороннюю связь объектов на уровне указателей. Т.е. при наличии кода
MapPtr map(new Map());
qx::dao::fetch_by_id_with_relation("*->*->", map);
MapPtr mapFromRelation = map->programs().first()->map();

В результате map.data() не равен mapFromRelation.data(). Получается, что один объект может быть загружен несколько раз, и нельзя опираться на их идентичность на уровне указателей. Т.е. изменения атрибутов одного никак не повлияют на другого. И мы получим рассогласованность данных на GUI.
Была предпринята попытка добавить ленивую загрузку (lazy load) совместно с картой объектов (Identity Map). Но ничего конкретного не вышло, добавились другие проблемы: как  при удалении элемента очищать все зависимости из IM. К тому же не нравился подход к выборке коллекции объектов из IM, сначала приходилось выполнять запрос, затем искать в карте объектов и только после этого возвращать результат.

ps: при хранении в памяти всей модели предметной области для обеспечения целостности, чтобы не было проблем при сохранении со всеми реляциями предполагалось, что при добавлении/редактировании/удалении объектов будет обязательно выполняться метод validate().

Redmine plugins

При подключении плагина редмайна имя при регистрации должно совпадать с именем каталога плагина. В противном случае, не находит вьюхи и все такое.

Автоматизация тестирования rails приложений RSpec, Cucumber, Capybara

RSpec используется для тестирования бизнес логики.
По Cucumber и Capybara, скажу так: «огурец» будем использовать, как «парсер» текста интеграционных тестов, Capybara — как прослойку между Cucumber и драйвером, а так же для написания шагов автоматизации. Иными словами… на cucumber мы пишет наши тесты простым языком, а сами шаги реализуем с использованием Capybara. А Capybara уже взаимодействует с webdriver'ом, но это уже совсем другая история

Редактирование объектов с обновлением в разных вьюхах

Существует несколько подходов к редактированию объектов, когда требуется динамическое обновление связанных элементов в других представлениях. В качестве примера можно рассмотреть ГИС систему, в которой на карту требуется наносить точки с определенными атрибутами, главные из которых - это широта и долгота. В системе предусмотрено два вида отображения точек: в табличном списке и на карте ГИС. Редактирование точек можно производить при помощи дополнительного окна с детальной информацией по точке, а также с помощью перемещения точек непосредственно на карте. При этом, во всех представлениях должны динамически изменяться атрибуты. Возможные варианты редактирования:
  1. из окна редактирования без явной кнопки save (типа редактор свойств) или из карты. Объекты хранятся в памяти и всегда используются один указатель во всех представлениях. При изменении свойства объекта испускается сигнал об изменении, на который подписаны представления. Представления обновляются по этому сигналу. По сути это классический Model-View. Одна модель - много наблюдателей. В качестве модели выступает Point
  2. из окна редактирования точки с наличием кнопки save или из карты (save срабатывает при отпускании точки на карте). При хранении объектов в памяти динамическое обновление будет выполняться, но по кнопке save фиксация изменений может не пройти (например, запись в БД). В этом случае нужно по кнопке отмена откатить изменения. Соответственно, необходим клон объекта на момент начала редактирования, чтобы из него можно было восстановить начальное состояние. 
  3. при работе с БД, ормом и passive view, когда на уровне представления хранятся только идентификаторы объектов и загруженные атрибуты. Очевидно, необходим дополнительный объект, который бы занимался оповещением объектов уровня представления. По событию обновления координат, обновлялись бы другие представления. При невозможности сохранения или отмене проводилось бы соответствующее  оповещение.
Если не нужно автоматическое обновление на всех представлениях в динамике, а только по факту успешного сохранение, то можно при вызове окна редактора заполнять контролы данными из объекта (по сути копия данных), по кнопке сохранить извлекаем данные из контролов во временный объект, сохраняем, если успешно, то обновляем атрибуты исходного (для случая хранения объектов в памяти). В случае passive view исходного не будет, нужно просто запросить новые данные для вью. Т.е. в случае работы с БД получаем из контролов данные, сохраняем, оповещаем по id, что сохранение прошло, всем заинтересованным обновиться, они выбирают свежие данные из БД и обновляют вью.

среда, 19 февраля 2014 г.

Ускорение компиляции cmake cotire

Для ускорения компиляции при использовании cmake существует инструмент
https://github.com/sakra/cotire. Но возникли проблемы его применения совместно с ccache. Не получилось настроить, чтобы ccache кешировал precompiled header, сгенерированный cotire. В итоге пересборка проходит долго, столько же времени, сколько занимает сборка при отсутствии ccache. Пока остановились на использовании связки distcc + ccache, без cotire.

ccache и precompiled header

ccache поддерживает работу в precompiled header

Precompiled headers

ccache has support for GCC’s precompiled headers. However, you have to do some things to make it work properly:

You must set CCACHE_SLOPPINESS to time_macros. The reason is that ccache can’t tell whether __TIME__ or __DATE__ is used when using a precompiled header.

You must either:

use the -include compiler option to include the precompiled header (i.e., don’t use #include in the source code to include the header); or

add the -fpch-preprocess compiler option when compiling.

If you don’t do this, either the non-precompiled version of the header file will be used (if available) or ccache will fall back to running the real compiler and increase the statistics counter “preprocessor error” (if the non-precompiled header file is not available).

http://ccache.samba.org/manual.html#_precompiled_headers