понедельник, 25 апреля 2011 г.

Redmine готовый к развёртыванию на серверах приложений

Если у вас есть необходимость развернуть Redmine на сервере приложений типа Tomcat, то у вас есть такие пути:
- скачать исходники, обложиться мануалами, и потратить день-два, чтобы решить все траблы;
- или скачать предлагаемый файл WAR, подправить пару настроек, и получить рабочую систему в течение 15 минут.

Итак, качаем файл (за основу был взят Redmine 1.1.2-devel).

Внутри находиться схема с таблицами, которую необходимо воссоздать в базе.
redmine-VERSION.war\WEB-INF\config\redmine_default_data.sql
Реквизиты для первого входа стандартные для Redmine: admin/admin.
Сейчас схема только на русском, но планируется и английская версия.

Теперь, необходимо указать реквизиты для соединения.
redmine-VERSION.war\WEB-INF\config\database.yml
# MySQL (default setup).
production:
  adapter: jdbc
  url: jdbc:mysql://YOURSERVER.com:3306/DBNAME
  driver: com.mysql.jdbc.Driver
  username: YOURNAME
  password: YOURPASSWORD
  encoding: utf8
Последний по списку, но не по значимости, шаг. Настройка безопасности.
Необходимо сгенерировать уникальный ключ.
redmine-VERSION.war\WEB-INF\config\initializers\session_store.rb
# This file was generated by 'rake config/initializers/session_store.rb',
# and should not be made visible to public.
# If you have a load-balancing Redmine cluster, you will need to use the
# same version of this file on each machine. And be sure to restart your
# server when you modify this file.
 
# Your secret key for verifying cookie session data integrity. If you
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
ActionController::Base.session = {
  :key => '_redmine_session',
  #
  # Uncomment and edit the :session_path below if are hosting your Redmine
  # at a suburi and don't want the top level path to access the cookies
  #
  # See: http://www.redmine.org/issues/3968
  #
  # :session_path => '/url_path_to/your/redmine/',
  :secret => '30e7cb1c1f4342cf1a3c42023a4d8ebf363792f63e711e3682b0a69ec42defd8d936c3a8aa556b40'
}

Можно использовать онлайновый HEX-генератор (только уберите пробелы и переносы).

И на этом всё, вы готовы к развёртыванию в сервере приложений.
Я проверял этот файл в Tomcat 6.0.26 на локальной машине, и в сервисе Cloudbees.com.
Везде работает великолепно.
Выше были перечислены только минимально-необходимые для успешного старта шаги. Теперь, когда и у вас развёртывание завершено, приступайте настройке остальных параметров, если есть такая необходимость:
redmine-VERSION.war\WEB-INF\config
Надеюсь кому-то это окажется полезным и сэкономит время.

Redmine 1.1.2 devel deploy ready WAR file

If you want to deploy Redmine to servlet container such as Tomcat, then you have two ways:
- download redmine source codes, read a lot of instructions, and spent about day or two to resolve all conflicts;
- or you just download my war-file, edit few settings, and you're done in 15 minutes.

Here's the file.

In the war-file you should find initial table scheme and run it on your database.
redmine-VERSION.war\WEB-INF\config\redmine_default_data.sql

Sorry guys, in this file it is on Russian, but I can make in English one, if you request me.

After that you should correct
redmine-VERSION.war\WEB-INF\config\database.yml

And the last step but not least is security. You should generate your own unique secret key.
redmine-VERSION.war\WEB-INF\config\initializers\session_store.rb

# This file was generated by 'rake config/initializers/session_store.rb',
# and should not be made visible to public.
# If you have a load-balancing Redmine cluster, you will need to use the
# same version of this file on each machine. And be sure to restart your
# server when you modify this file.

# Your secret key for verifying cookie session data integrity. If you
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
ActionController::Base.session = {
:key => '_redmine_session',
#
# Uncomment and edit the :session_path below if are hosting your Redmine
# at a suburi and don't want the top level path to access the cookies
#
# See: http://www.redmine.org/issues/3968
#
# :session_path => '/url_path_to/your/redmine/',
:secret => '116315a0b6f594fa95bf163fce376b36de6bc53936327c4577f3f64f8e4c15af60eda37e4ff9562d'
}

You may use this online hex generator, for example (just remove the spaces).

And that's all, you're ready to deploy.
I've tested this file on the local machine and on Cloudbees.com service.
It works just fine on both.

воскресенье, 10 апреля 2011 г.

Удалённая проверка источника питания на MacBook

Бывают разные случаи, когда полезно проверить подключен ли ноутбук к электросети.
Первый вариант, через VNC или Apple Remote Desktop загрузиться и посмотреть состояние в графическом режиме.
Но есть способ автоматизировать процесс.
В комплекте с MacOS идёт консольная утилита system_profiler.
Если её запустить просто так, то будет выдана куча системной информации.
Чтобы выделить только нужное, существует набор фильтров.
С полным списком можно ознакомиться командой:
$ system_profiler -listDataTypes
Available Datatypes:
SPHardwareDataType
SPNetworkDataType
SPSoftwareDataType
SPParallelATADataType
SPAudioDataType
SPBluetoothDataType
SPCardReaderDataType
SPDiagnosticsDataType
SPDiscBurningDataType
SPEthernetDataType
SPFibreChannelDataType
SPFireWireDataType
SPDisplaysDataType
SPHardwareRAIDDataType
SPMemoryDataType
SPPCIDataType
SPParallelSCSIDataType
SPPowerDataType
SPPrintersDataType
SPSASDataType
SPSerialATADataType
SPUSBDataType
SPAirPortDataType
SPFirewallDataType
SPNetworkLocationDataType
SPModemDataType
SPNetworkVolumeDataType
SPWWANDataType
SPApplicationsDataType
SPDeveloperToolsDataType
SPExtensionsDataType
SPFontsDataType
SPFrameworksDataType
SPLogsDataType
SPManagedClientDataType
SPPrefPaneDataType
SPStartupItemDataType
SPSyncServicesDataType
SPUniversalAccessDataType
Нас интересует только подсистема питания SPPowerDataType.
Выполняем:
$ system_profiler SPPowerDataType
Power:

    Battery Information:

      Model Information:
          Serial Number: 9G951015R4M1A
          Manufacturer: DP
          Device name: bq20z951
          Pack Lot Code: 0000
          PCB Lot Code: 0000
          Firmware Version: 0042
          Hardware Revision: 0001
          Cell Revision: 0122
      Charge Information:
          Charge remaining (mAh): 8346
          Fully charged: No
          Charging: No
          Full charge capacity (mAh): 11999
      Health Information:
          Cycle count: 99
          Condition: Normal
      Battery Installed: Yes
      Amperage (mA): -3316
      Voltage (mV): 7665

    System Power Settings:

      AC Power:
          System Sleep Timer (Minutes): 60
          Disk Sleep Timer (Minutes): 0
          Display Sleep Timer (Minutes): 60
          Automatic Restart On Power Loss: No
          Wake On AC Change: No
          Wake On Clamshell Open: Yes
          Wake On LAN: Yes
          Display Sleep Uses Dim: Yes
          GPUSwitch: 2
      Battery Power:
          System Sleep Timer (Minutes): 10
          Disk Sleep Timer (Minutes): 0
          Display Sleep Timer (Minutes): 7
          Wake On AC Change: No
          Wake On Clamshell Open: Yes
          Current Power Source: Yes
          Display Sleep Uses Dim: Yes
          GPUSwitch: 2
          Reduce Brightness: Yes

    Hardware Configuration:

      UPS Installed: No

    AC Charger Information:

      Connected: No
      Charging: No

Предпоследняя строчка
Connected: Yes
показывает, что подключен внешний источник питания.
И, наоборот,
Connected: No
говорит, что в настоящее время ноутбук работает от батареи.
А показатель
Charge remaining (mAh): 5893
уведомляет об оставшемся заряде. Зная
Full charge capacity (mAh): 12008
можно посчитать процент заряда.
Все необходимые нам индикаторы не составляет особого труда вычленить с помощью grep/awk, или, указав ключ -xml, распарсить результат с помощью Scala/Groovy.
Можно использовать Automator, в нём имеется встроенный компонент "Профиль системы" с аналогичным функционалом.
Теперь, с помощью cron, того же Automator и т.п. можно настроить, чтобы при падении заряда ниже какого-то уровня, отправлялось смс, почта и другие уведомления для принятия мер: воткнуть вилку в розетку или усыпить машину, если невозможно первое.

суббота, 9 апреля 2011 г.

Eclipse, Android: ошибка "Conversion to Dalvik format failed with error 2"

Оптимизировал я какое-то время назад работу Eclipse. Начитался разных форумов. Написал кучу разных опций в eclipse.ini. Полкучи потом выкинул. Файл принял вид:

-startup
../../../plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
../../../plugins/org.eclipse.equinox.launcher.cocoa.macosx_1.1.2.R36x_v20101019_1345
-server
-nosplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms1024m
-Xmx1024m
-XX:PermSize
512m
-XX:MaxPermSize
512m
-XX:+UseParallelGC
-XX:+AggressiveOpts

Всё было хорошо. Всё работало быстро и я забыл про это подкручивание.

Потом какое-то время работал в Intellij Idea (рефакторинг у них непревзойдённый, конечно).

А тут мне понадобился удобный эклипсовский плагин от Questoid для доступа к SQLite-базе прямо из DDMS.
Запускаю среду, а оно мне выдаёт на любой проект.
Conversion to Dalvik format failed with error 2

Раз в Intellij Idea собирается нормально, то проблема явно локально-эклипсовая.
Два часа блуждал по сети, перепробовал кучу способов, пока не наткнулся на
http://code.google.com/p/android/issues/detail?id=9883

Убрал из конфига
-XX:+AggressiveOpts

Работает, зараза!

Мораль, излишняя оптимизация - зло.