29 июня 2015 г.

Eclipse Mars, GTK+ 3, Adwaita и маленький CSS-напильник

С переходом на новый Eclipse Mars, я решил кое-что ещё поменять в своей жизни. Хотя правильнее сказать, что сам Eclipse предложил мне эти изменения, а я не стал сопротивляться. Как известно, Eclipse Mars теперь по умолчанию использует GTK+ версии 3. Для второй версии GTK+ у меня уже много лет стоит тема oxygen-gtk. Страшненькая, да... но уже привычная. Поэтому как-то даже мысли не возникало попробовать поменять её. А тут оказалось, что для GTK+ 3 у меня вообще эта тема не стоит, и используется тема по умолчанию, которая называется Adwaita. И что-то я так поглядел на неё, и в принципе мой глаз посчитал её чуть менее страшной и чуть более секси, чем oxygen-gtk. Осталось только решить несколько бросившихся сразу в глаза проблем.

Проблемы

Проблема 1. Какое-то неадекватно большое значение padding у большинства GUI-элементов.


Проблема 2. Странный tooltip для javadoc с белым шрифтом на чёрном фоне.

 
Проблема 3. Смазанные шрифты после скролинга некоторых окон (Project Explorer, Package Explorer, Outline). Особенно ярко проблема проявляется, если скролить колесом мыши.


Решение

В GTK+ 3 для описания тем больше не используются rc-файлы собственного формата. Теперь для стилизации применяются более понятные CSS-подобные файлы.

Проблемы 1 и 2 решаются созданием файла ~/.config/gtk-3.0/gtk.css со следующим содержанием:
* {
    padding: 1px;
}

GtkToolbar {
    padding: 2px;
}

GtkMenuBar {
    padding: 2px;
}

GtkMenuItem {
    padding: 2px 6px;
}

.tooltip {
    background-color: #CAE1FF;
    color: #333;
    text-shadow: none;
}

Кратко поясню. Сначала устанавливаем padding абсолютно для всех элементов равным 1px. Затем для элементов GtkToolbar, GtkMenuBar и GtkMenuItem делаем отступы чуть более разумными. CSS-класс tooltip вероятно прописан где-то в коде и назначен, как для всплывающего окна javadoc, так и для хинтов различных графических элементов. Свойство text-shadow необходимо, чтобы ликвидировать тень текста хинта, которая становится заметной и неуместной после изменения его фона и цвета текста:


Обратите внимание, что файл ~/.config/gtk-3.0/gtk.css будет действовать и переопределять стили для любой темы GTK+ 3, выбранной пользователем, у которого в домашнем каталоге есть этот файл, а не только для темы Adwaita.

Проблему 3 я решил довольно тупо, сняв флажок с Use mixed fonts and colors for labels в настройках внешнего вида (Window / Preferences / General / Appearance). Мне легче смириться с одноцветным черным лейблом, чем с таким поломанным шрифтом.

Тут я вынужден обновить сообщение и добавить, что после решения проблемы 3 появилась проблема 4 :) которая выглядет, как практически нечитаемый выбранный пункт во всплывающем окне автодополнения.


Эта неприятность также фиксится добавлением некоторых строчек в gtk.css:
GtkTreeView:selected {
    color: #FFF;
    background-color: #4A90D9;
}

Результаты






Ссылки

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

Когда терпение кончилось

Спустя некоторое время, должен признать, что это далеко не все глюки с UI, которые мне повстречались при использовании GTK+ 3 в Eclipse. И у меня больше нет сил подкручивать эти гайки. Я устал, я ухожу. Теперь перед запуском Eclipse у меня выполняется export SWT_GTK3=0, что заставляет Eclipse использовать GTK+ 2 по старинке.

10 июня 2015 г.

Перенос существующей базы данных Redmine с SQLite на PostgreSQL

Разглагольствовать не буду. Скажу лишь, что попробовал несколько различных способов, кроме ручного исправления дампа SQLite, ибо лень. Самым простым и жизнеспособным оказался метод с использованием программы Taps. Эта чудо-ruby-штука поднимает http-сервер с подключением к базе данных А и позволяет с помощью клиента выполнять обмен данными между этой базой А и какой-либо базой Б, даже если они управляются различными СУБД. Конечно, её возможности не безграничны, но для миграции базы данных Redmine их хватило.

Все ниже описанные действия выполнялись на openSUSE 13.2.

Кратко и по сути

1. Установить через RubyGems программу Taps:
gem install taps
2. Подготовить базу данных PostgreSQL для Redmine:
createuser -U postgres redmine
psql -U postgres
postgres=# ALTER USER redmine WITH PASSWORD 'redmine_password';
postgres=#\q
createdb -U postgres -O redmine redmine
3. Запустить сервер Taps с подключением к новой созданной в PostgreSQL базе для Redmine:
taps.ruby2.1 server postgres://redmine:redmine_password@localhost/redmine taps taps_password
4. Используя клиент Taps, запушить все данные из исходной базы SQLite в PostgreSQL:
taps.ruby2.1 push sqlite:///usr/local/redmine/db/redmine.db.sqlite3 http://taps:taps_password@localhost:5000
5. Не забыть изменить настройки подключения к БД в Redmine (redmine/config/database.yml):
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "redmine_password"
5. Перезапустить Redmine

Грабли

При запуске сервер валится приблизительно с такой портянкой:
/usr/lib/ruby/gems/2.1.0/gems/sinatra-1.0/lib/sinatra/base.rb:298:in `': uninitialized constant Tilt::CompileSite (NameError)
        from /usr/lib/ruby/gems/2.1.0/gems/sinatra-1.0/lib/sinatra/base.rb:297:in `'
        from /usr/lib/ruby/gems/2.1.0/gems/sinatra-1.0/lib/sinatra/base.rb:21:in `'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:73:in `require'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:73:in `require'
        from /usr/lib/ruby/gems/2.1.0/gems/taps-0.3.24/lib/taps/server.rb:1:in `'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:73:in `require'
        from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:73:in `require'
        from /usr/lib/ruby/gems/2.1.0/gems/taps-0.3.24/lib/taps/cli.rb:61:in `server'
        from /usr/lib/ruby/gems/2.1.0/gems/taps-0.3.24/lib/taps/cli.rb:27:in `run'
        from /usr/lib/ruby/gems/2.1.0/gems/taps-0.3.24/bin/taps:6:in `'
        from /usr/bin/taps.ruby2.1:23:in `load'
        from /usr/bin/taps.ruby2.1:23:in `
'
В этом случае необходимо проверить какие версии библиотеки Tilt у вас установлены:
zypper se -s tilt
Если среди установленных есть Tilt версии 2, то необходимо её снести и поставить 1.4. Как правило, zypper сам ставит версию 1.4 вместо удалённой 2.

Ещё

Уже после публикации этой статьи, я наткнулся ещё на одну чудо-ruby-штуку под названием YamlDb. Жалко, что она сразу мне не попалась, меньше бы времени потратил. И на Хабре давно уже есть статейка.