среда, апреля 27, 2011

Дебаг javascriptMVC в Google Chrome на Mac

open -b com.google.chrome --args --disable-web-security или
open -b com.google.chrome --args --allow-file-access-from-files
нужно делать, что бы дебажить локально проект на javascriptMVC в Google Chrome. И все из-за Access-Control-Allow-Origin.
Вообще это касается любого проекта, использующего jQuery $.get

воскресенье, апреля 17, 2011

Игнорирование в Git

При работе на Mac рано или поздно станет вопрос об игнорировании файла .DS_Store
Чтобы игнорировать этот файл глобально для пользователя указываем Git файл ~/.gitignore как список исключений
git config --global core.excludesfile ~/.gitignore
а потом добавляем в этот файл строчку .DS_Store
echo .DS_Store >> ~/.gitignore

Ставим Redmine 1.1.2 и Git сервер на CentOS 5.5

Формула: Redmine + MySQL/PostgreSQL + Gitolite + Nginx в 31 шаг


1. Как всегда обновляем CentOS:
# yum update

2. Если репозиторий EPEL в yum не установлен, добаляем:
# vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 5 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch/debug
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-debug-5&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 5 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/5/SRPMS
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-source-5&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=0
3. Ставим nginx
# yum install nginx

4. Ставим PostgreSQL или MySQL
Для MySQL
# yum install mysql mysql-server mysql-devel
Для PostgreSQL
# yum install postgresql postgresql-server postgresql-devel

5. Создаем базу redmine (не забываем поменять пароль changeme)
Для MySQL
# /sbin/service mysqld start
# mysql -u root -p
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'changeme';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
Для PostgreSQL
# /sbin/service postgresql start
# sudo -s -H -u postgres
# psql
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'changeme' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine TEMPLATE=template0;
\q

6. Ставим Ruby 1.9.2
# yum -y install gcc gcc-c++ zlib-devel openssl-devel readline-devel
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz
# tar xzvf ruby-1.9.2-p180.tar.gz
# cd ruby-1.9.2-p180
# ./configure --enable-shared
# make
# make install
# ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

7. Ставим rubygems 1.6.2 (В 1.7.1 ошибка http://stackoverflow.com/questions/5520333/rails-3-install-error-invalid-value-for-cert-chain, если что с 1.7.1 можно откатиться gem update --system 1.6.2)
# wget http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz
# tar xvf rubygems-1.6.2.tgz
# cd rubygems-1.6.2
# ruby setup.rb
# gem -v
1.6.2

8. Ставим rake и rails
# gem install rake
# gem install rails

9. Гемы для работы с MySQL или PostgreSQL
Для MySQL
# gem install mysql
Для PostgreSQL
# gem install fastthread
# gem install pg

10. Ставим нужные версии гемов
# gem install -v=0.4.2 i18n
# gem install -v=0.8.3 rake
# gem install -v=1.0.1 rack

11. Распаковываем Redmine 1.1.2
# cd /usr/local/share
# wget http://rubyforge.org/frs/download.php/74419/redmine-1.1.2.tar.gz
# tar xzvf redmine-1.1.2.tar.gz

12. Настраиваем database.yml в Redmine, пользователя redmine создадим позже
# cd /usr/local/share/redmine-1.1.2
# mv config/database.yml.example config/database.yml
# vi config/database.yml
Для mySQL:
production:
adapter: mysql
database: redmine
host: localhost
username: redmine
password: changeme
encoding: utf8
Для PostgreSQL:
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: changeme
encoding: utf8
schema_search_path: public
13. Создаем хранилище сессий rake
# rake generate_session_store

14. Редактируем environment.rb
# vi config/environment.rb
Убираем комментарий с 5 строчки
ENV['RAILS_ENV'] ||= 'production'
После 55 строчки добавляем
if Gem::VERSION >= "1.6.2"
module Rails
class GemDependency
def requirement
r = super
(r == Gem::Requirement.default) ? nil : r
end
end
end
end

15. Создаем структуру базы, загружаем данные
# RAILS_ENV=production rake db:migrate
# RAILS_ENV=production rake redmine:load_default_data

16. Переименовали dispatch.rb
# mv public/dispatch.rb.example public/dispatch.rb

17. Добавляем пользователя redmine, от которого будет запускаться Thin
# /usr/sbin/useradd redmine

18. Настроили права доступа для пользователя redmine к Redmine
# chown -R redmine:redmine /usr/local/share/redmine-1.1.2
# find /usr/local/share/redmine-1.1.2 -type d -exec chmod 755 {} \;
# find /usr/local/share/redmine-1.1.2 -type f -exec chmod 644 {} \;

19. Ставим и настраиваем сервер Thin
# gem install thin
# thin install

20. Создаем файл конфигурации Thin /etc/thin/redmine.yml
# vi /etc/thin/redmine.yml
pid: /tmp/thin.pid
group: redmine
timeout: 30
log: /var/log/nginx/thin.log
max_conns: 1024
require: []

environment: production
max_persistent_conns: 512
no-epoll: true
servers: 1
daemonize: true
socket: /tmp/redmine.sock
chdir: /usr/local/share/redmine-1.1.2
user: redmine
group: redmine

21. Настраиваем nginx
# vi /etc/nginx/nginx.conf

в секцию http добавили:
upstream thin {
server unix:/tmp/redmine.0.sock;
}
в секцию server добавили
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

if (-f $request_filename) {
break;
}
if (!-f $request_filename) {
proxy_pass http://thin;
break;
}
}

22. Проверили как все работает вместе
# /sbin/service thin start
# /sbin/service nginx start
зашли на http://localhost, admin:admin, Порадовались работающему Redmine

23. Добавили в автозагрузку thin и nginx
# /sbin/chkconfig --level 345 thin on
# /sbin/chkconfig --level 345 nginx on

24. Устанавливаем git
# yum install git

25. Добавляем пользователя git для gitolite, включаем пользователя redmine в группу git
# /usr/sbin/useradd git
# /usr/sbin/usermod -a -G git redmine

26. Устанавливаем gitolite
# cd /tmp
# git clone git://github.com/sitaramc/gitolite
# cd gitolite
# mkdir -p /usr/local/share/gitolite/conf /usr/local/share/gitolite/hooks
# src/gl-system-install /usr/local/bin /usr/local/share/gitolite/conf /usr/local/share/gitolite/hooks

27. Создаем папку для репозитория gitolite даем права на нее пользователю и группе git.
# mkdir /var/gitrepo
# chown git:git /var/gitrepo
# chmod 755 /var/gitrepo

28. НА ЛОКАЛЬНОЙ РАБОЧЕЙ СТАНЦИИ генерируем ssh-ключ (ssh-keygen -t rsa) , с которым будет проиницалиализирован gitolite и с который будет использован для удаленного доступа к конфигурации gitolite. Переписываем ключ на сервер в директорию /tmp. Пусть файл публичного ключа называется id_rsa.pub.

29. Инициализируем gitolite
# su git
# git config --global user.email "git@server"
# git config --global user.name "git"
# gl-setup /tmp/id_rsa.pub

Меняем переменную $REPO_UMASK, которая устанавливает маску прав (umask, http://www.giocc.com/public-repositories-in-gitolite-with-umasks.html) для файлов и директорий репозитория
$REPO_UMASK = 0022
Меняем переменную $REPO_BASE для указания пути к месту хранения репозитория.
$REPO_BASE="/var/gitrepo"


30. Тестируем работу gitolite. НА ЛОКАЛЬНОЙ РАБОЧЕЙ СТАНЦИИ клонируем созданный gitolite по умолчанию проект testing.git, создаем, добавляем, коммитим и пушим на сервер файл.
# git clone git@server:testing.git
# cd testing
# echo "This is test file" >testfile.txt
# git add .
# git commit -m “This is first commit”
# git push origin master

31. Создаем тестовый проект в Redmine и указываем ему в качестве Git-репозитория testing.git
В Redmine меню Projects-New project. Name=testing, Identifier=testing, Save. Меню Settings-Repository. SCM=Git, Path to .git directory=/var/gitrepo/testing.git
Сохранили, и если все сделано правильно в меню Repository наслаждаемся результатом )))

Материалы

О Redmine
http://www.redmine.org/
О gitolite
https://github.com/sitaramc/gitolite
О том как поставить Redmine и gitolite
http://eugenkiss.com/blog/2010/installing-redmine-gitolite-ubuntu-10.04/
О том как настраивать репозиторий Git в Redmine
http://www.redmine.org/projects/redmine/wiki/RedmineRepositories#Git-repository
О том как инсталлировать Redmine на mysql, apache, passenger
http://www.systmbx.com/redmine/how-to-install-redmine-on-centos-5-5
Про настройку прав на вновь создаваемые файлы в репозитории gitolite
http://www.giocc.com/public-repositories-in-gitolite-with-umasks.html
HOWTO: Ubuntu 10.04 + redmine + nginx + gitosis
http://garfeild.ru/blog/projects/howto-ubuntu-10-04-redmine-nginx-gitosis
Про даунгрейд рубигемов
http://stackoverflow.com/questions/5520333/rails-3-install-error-invalid-value-for-cert-chain

вторник, апреля 12, 2011

Git на Windows

Поскольку у новичков возникают проблема с установкой и использованием Git на Windows решил что это стоит описать. Делаем все в 7 шагов
1. Пошли на http://code.google.com/p/msysgit/downloads/list и скачали последнюю вресию Git-1.7.X-preview2011XXXX.exe
2. Установили, без особенностей
3. Установили переменную окружения HOME в текущий профиль пользователя (Компьютер, Свойства, Дополнительные парамеры, Переменные окружения, Создать, HOME, значение к примеру c:\Users\you)
4. Запустили Git bash
5. В консоли генерируем ssh-ключ:

#ssh-keygen -C "user@mail.com" -t rsa

Путь оставляем по умолчанию, убеждаемся что он верный и соотвествует папке $HOME\.ssh, пароль обязательно вводим
Ключ запишется в папку $HOME\.ssh . Если не запишется - что-то сделали не так.
6. Сгенерированный файл с публичным ключем $HOME\.ssh\id_rsa.pub отдаем админу Git-сервера. Он пропишет для Вас доступ куда надо.
7. Запустили Git-GUI, в меню Редактирование-Опции ОБЯЗАТЕЛЬНО указали имя пользователя и почтовый адрес, поставили кодировку utf-8
или через консоль
git config --global user.name "Your Name"
git config --global user.email "you@example.com"


Ну дальше все по мануалу: конируем/добавляем/коммитим/пушим = git clone git@server:project.git / git add . / git commit -m "Commit text" / git push

Кстати, отличный мануал на русском http://progit.org/book/ru/

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

DocBook 5 + Git log

При создании технической документации на информационные системы принято одной секцией давать таблицу с историей изменения документа. Если при написании документации используются системы контроля версий, то грех не автоматизировать процесс создания этой таблицы.
В качестве стандарта для технической документации возьмем DocBook 5. Поскольку в конечном итоге это xml файл, к нему применимы XInclude, а значит таблицу можно вынести в отдельную секцию и просто вставлять в главу книги или статью. Будем считать, что в таблице нам надо только два поля - Дата изменения и Содержание изменения с именем Автора. Эти данные надо взять из системы контроля версий. Лично мне нравится Git и все необходимые данные можно получить из git log с опцией --format. К примеру git log --format=format:"%ai|%an,%ae:%s" выдаст что-то типа 2011-04-09 23:23:24 +0400|Author,user@mail.com:Commit subject. Будем использовать символ "|" для разделения полей. Скорее всего такой генератор прийдется тюнить под свои нужды для каждого проекта, поэтому сделаем все в виде скрипта на python. Выглядит это так:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess

gitlog = subprocess.Popen(['git','log', '--format=format:"%ai|%an,%ae: %s"', '-n 20'], stdout=subprocess.PIPE)

f = open('gitlog.xml', 'w')
f.write(
"""<?xml version="1.0" encoding="UTF-8"?>
<sect1 xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>История изменений документа</title><table xml:lang="ru"><caption>История изменений</caption><col width="20%"/><col width="80%"/>
<thead><tr><th>Дата</th><th>Содержание</th></tr></thead>
<tbody>
"""
)

while True:
line = gitlog.stdout.readline()
if line != '':
line= line[1:len(line)-2]
cols=line.split("|")
f.write("<tr><td>"+cols[0]+"</td><td>"+cols[1]+"</td></tr>")
else:
break

f.write("</tbody></table></sect1>")
f.close()

Из скрипта понятно, что в историю выводим последние 20 коммитов. Запуская скрипт из директории с репозиторием Git, создается xml-файл секции DocBook с таблицей коммитов под наименованием gitlog.xml. Осталось собрать книгу и вставить в нужное место нашу табличку.
Собираем книгу book.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbookxi.rng" type="xml"?>
<book xmlns="http://docbook.org/ns/docbook" 
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:lang="ru"
>
<info>
<title>Единая федеральная информационная система ВОРЕНОИЦПУРРОК (подпрограмма 2012-2130 годы)</title>
<author>
<orgname>Федеральная служба ВОРЕНОИЦПУРРОК</orgname>
<address>
<city>Дефолт-сити</city>
<street>Дефолт-стрит</street>
<postcode>000000</postcode>
<country>Снежная Нигерия</country>
</address>
<email>effective.manager@kremlin.ru</email>
</author>
</info>

<xi:include href="preface.xml"/>
<xi:include href="chapter01.xml"/>
<xi:include href="chapter02.xml"/>
<xi:include href="chapter03.xml"/>    

</book>

видно, что в книге есть вставки предисловия и трех глав. Собираем предисловие (preface.xml):
<?xml version="1.0" encoding="UTF-8"?>
<preface xmlns="http://docbook.org/ns/docbook" version="5.0" xmlns:xi="http://www.w3.org/2001/XInclude" xml:lang="ru">
<title>Предисловие</title>
<sect1><title>Кому нужна Единая федеральная информационная система ВОРЕНОИЦПУРРОК?</title>
<para>Размах тотального оболванивания электората в условиях бурного развития современных информационных технологий
ставит вопрос о необходимости новой волны активизации процессов закупки государством воздуха в форме информационных систем.
Безграничные возможности осуществления этих мероприятий за счет государственного бюджета или доходов государственных предприятий,
являющимися естественными или неестественными монополиями, позволят значительно укрепить личные активы государственных
эффективных менеджеров. Разработка и внедрение системы ВОРЕНОИЦПУРРОК, наравне с созданием аналогичных систем
ЕГАИС, ЕФИСН, ГКН, ГИСТЭК, ЕГИС ОТБ, ЕГС-АБЫРВАЛГ и др.,
позволит значительно увеличить отрицательное значение Коэффициента Полезного Действия (КПД)
процессов во всех областях деятельности на ближайшие 119 лет.
</para>
</sect1>
<!-- А вот здесь вот changelog от Git -->    
<xi:include href="gitlog.xml"/>   

</preface>

Обращаем внимание на вставку gitlog.xml. Ну и пример сгенерированной секции:
<?xml version="1.0" encoding="UTF-8"?>
<sect1 xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>История изменений</title>
<table xml:lang="ru"><caption>Таблица истории изменения</caption>
<col width="20%"/><col width="80%"/>
<thead><tr><th>Дата</th><th>Содержание</th></tr></thead>
<tbody>
<tr><td>2011-04-10 03:42:11 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Коллеги подсказали, 
что сейчас самая модная сумма - триллион, для достижения такой суммы придумал еще две статьи расходов и
описал их в секциях 3.5 и 3.6
</td></tr>
<tr><td>2010-04-09 23:23:24 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: В связи с тем, что друг семьи тоже решил
стать эффективным государственным менеджером, заложил основы для создания
подпрограммы развития системы ВОРЕНОИЦПУРРОК с 2130 по 2200 годы
</td></tr>
<tr><td>2009-04-09 20:24:28 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Удалил секцию 3.2 по причине того, что 5
процентов отката от ВОРЕНОИЦПУРРОК, причитающегося мне, отдали сыну моего
начальника. Вот пусть эту секцию сотрудники его департамента и пишут.
</td></tr>
<tr><td>2008-04-09 20:23:53 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Написал главу 5, на вырученные деньги, по
совету друзей, купил виллу на Лазурном берегу и французское гражданство.
</td></tr>
</tbody></table></sect1>



При печати документа в PDF будет получен вполне сносный результат:

суббота, апреля 09, 2011

DocBook 5 + Кириллица в PDF

Есть отличный официальный стандарт OASIS для написания технической документации с наименованием DocBook (http://docbook.org/). Сейчас в ходу 5 версия. Из xml DocBook с использованием xsl можно получить xhtml одной страницей, xhtml по главам, PDF (+Apache FOP), ePub, WinHelp. Все ради того, чтобы сырцы технической документации были в одном месте, подвергались номальному версионному контролю, а из них генерировали ту форму документации, которая требуется. Обычно требуется только 3 вещи: (x)html одной страницей, (x)html по главам и книжка PDF.
Наиболе адекватный визуальный toolchain для работы с DocBook, на мой взгляд, предлагает http://www.oxygenxml.com/. В коробке все что нужно для работы, включая Apache FOP.

Если вы будете создавать документы на кириллице, то с xhtml проблем не возникнет. А при генерации PDF с xsl из коробки вместо кириллицы получите решетки - символы хеша (#). Вот наименования фонтов, с которыми PDF у меня выглядел нормально:
Arial
Arial Unicode MS
Courier New

Чтобы все заработало присвойте значению body.font.family и title.font.family наименование нужного фонта.

Вообще проблемы с русским возникают из-за Apache FOP. Вот здесь хорошие советы по решению вопроса http://www.sql.ru/forum/actualthread.aspx?bid=38&tid=491835&pg=1
Еще ссылки по теме:
http://forum.vingrad.ru/forum/topic-294568.html
http://www.sagehill.net/docbookxsl/AddFont.html
http://www.oxygenxml.com/doc/ug-oxygen/tasks/add-font-to-builtin-FOP-simplified.html

воскресенье, апреля 03, 2011

Клонирование машин VirtualBox

Кратко: VBoxManage clonehd <filename> <outputfile>
после не забываем поменять UUID: VBoxManage internalcommands sethduuid C:\path\to\hd.vdi

Мой список блогов