Если по каким-либо причинам вам необходимо обеспечить работу OpenVPN на 5000 порту (использовался ранее в OpenVPN) при включенном SELinux, то прийдется вручную создавать модуль SELinux.
Допустим мы:
1. Установили OpenVPN, прописали port 5000 в /etc/openvpn/server.conf
2. Добавили правила в /etc/sysconfig/iptables
-A INPUT -m state --state new -m udp -p udp --dport 5000 -j ACCEPT
3. Добавили правило в SELinux
# semanage port -a -t openvpn_port_t -p udp 5000
/usr/sbin/semanage: Port upd/5000 already defined
4. При запуске OpenVPN
# service openvpn start
получили [FAILED]
в логе openvpn.log увидели
TCP/UDP: Socket bind failed on local address [undef]:5000: Permission denied
в /var/log/audit/audit.log наблюдаем строчку
type=AVC msg=audit(xxxxx): avc:denied { name_bind } for pid=xxx comm="openvpn" src=5000 scontext=unconfined_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:commplex_port_t:s0 tclass=udp_socket
Что делаем? Модуль правил для SELinux.
1. Копируем выше обозначенную строчку из audit.log в файл OPENVPN5000.audit
2.
# cat OPENVPN5000.audit | audit2allow -m audit > OPENVPN5000.te
# cat OPENVPN5000.te
module audit 1.0;
require {
type openvpn_t;
type commplex_port_t;
class udp_socket name_bind;
}
#=========== openvpn_t ==============
allow openvpn_t commplex_port_t:udp_socket name-bind;
3. Проверяем и собираем модуль
# checkmodule -M -m -o OPENVPN5000.mod OPENVPN5000.te
4. Упаковываем модуль
# semodule_package -o OPENVPN5000.pp -m OPENVPN5000.mod
5. Загружаем упакованный модуль
# semodule -i OPENVPN5000.pp
Вот теперь можно успешно перезапусить OpenVPN на 5000 порту
# service openvpn restart
среда, декабря 14, 2011
вторник, декабря 13, 2011
CentOS 6.2+OpenVPN 2.2.1+iptables v1.4.7+SELinux
Отличный рабочий инструмент для удаленного администрирования сетей. Исходим из следующей конфигурации:
INTERNET --- eth0 (XXX.XXX.XXX.XXX) | eth1 (192.168.X.1) --- LAN (192.168.X.0/24)
Минимальная CentOS 6.2, iptables v1.4.7 и selinux (Policy v.24) установлены по умолчанию. Установим и настроим OpenVPN Server на работу по протоколоу UDP и порту YYYY.
1. Обновляем CentOS 6.2
# yum update
2. Подключаем репозиторий EPEL к yum
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
3. Устанавливаем OpenVPN
# yum --enablerepo=epel -y install openvpn
# openvpn --version
OpenVPN 2.2.1 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Sep 12 2011
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
Generating a 1024 bit RSA private key
........++++++
.......++++++
writing new private key to 'server.key'
-----
...
-----
INTERNET --- eth0 (XXX.XXX.XXX.XXX) | eth1 (192.168.X.1) --- LAN (192.168.X.0/24)
Минимальная CentOS 6.2, iptables v1.4.7 и selinux (Policy v.24) установлены по умолчанию. Установим и настроим OpenVPN Server на работу по протоколоу UDP и порту YYYY.
1. Обновляем CentOS 6.2
# yum update
2. Подключаем репозиторий EPEL к yum
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
3. Устанавливаем OpenVPN
# yum --enablerepo=epel -y install openvpn
# openvpn --version
OpenVPN 2.2.1 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Sep 12 2011
4. Копируем примеры файлов конфигураций из пакета в /etc/openvpn
# cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn/
5. Редактируем конфигурацию
# vi /etc/openvpn/server.conf
Меняем/добавляем следующие строчки
32 port YYYY
53 dev tun0
78 ca /etc/openvpn/easy-rsa/keys/ca.crt
79 cert /etc/openvpn/easy-rsa/keys/server.crt
80 key /etc/openvpn/easy-rsa/keys/server.key # This file should be kept secret
87 dh /etc/openvpn/easy-rsa/keys/dh1024.pem
138 push "route 192.168.X.0 255.255.255.0" # Наша внутреняя сеть
276 status /var/log/openvpn-status.log
285 log /var/log/openvpn.log
286 log-append /var/log/openvpn.log
Сохраняем
6. Копируем пакет управления RSA ключами из поставки OpenVPN в /etc/openvpn/easy-rsa, копируем файл openssl-1.0.0.cnf в openssl.cnf и создаем папку keys
# cp -R /usr/share/openvpn/easy-rsa/2.0 /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
# cp openssl-1.0.0.cnf openssl.cnf
# mkdir keys
7. Редактируем поля по умолчанию для вновь создаваемых сертификатов
# vi vars
63 # Don't leave any of these fields blank.
64 export KEY_COUNTRY="RU"
65 export KEY_PROVINCE="RU"
66 export KEY_CITY="DefaultCity"
67 export KEY_ORG="DefaultCompany"
68 export KEY_EMAIL="hi@defaultcompany.com"
69 export KEY_EMAIL=hi@defaultcompany.com
70 export KEY_CN=vpn.defaultcompany.com
71 export KEY_NAME=changeme
72 export KEY_OU=MainOffice
8. Выполняем скрипт установки переменных
# source ./varsNOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
9. Чистим папку с ключами
# ./clean-all
10. Генерируем сертификат и ключ для своего центра сертификации
# ./build-ca
Generating a 1024 bit RSA private key
.................++++++
......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Generating a 1024 bit RSA private key
.................++++++
......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]: # введи FQDN
Name []: server-ca # укажи к примеру server-ca
Email Address [hi@defaultcompany.com]:
Name []: server-ca # укажи к примеру server-ca
Email Address [hi@defaultcompany.com]:
11. Генерируем сертификат и ключ для сервера
# ./build-key-server server Generating a 1024 bit RSA private key
........++++++
.......++++++
writing new private key to 'server.key'
-----
...
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]: # введи FQDN
Name []: server # укажи к примеру server
Email Address [hi@defaultcompany.com]:
Name []: server # укажи к примеру server
Email Address [hi@defaultcompany.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
...............
Certificate is to be certified until Jul 12 09:30:07 2021 GMT (3650 days)
Sign the certificate? [y/n]:y
Certificate is to be certified until Jul 12 09:30:07 2021 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
Write out database with 1 new entries
Data Base Updated
12. Генерируем параметр DH
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
13. Генерируем сертификат и ключ для клиента employee01
# ./build-key-pass employee01
Generating a 1024 bit RSA private key
..................++++++
..................++++++
writing new private key to 'client.key'
Enter PEM pass phrase: # установи пароль
Verifying - Enter PEM pass phrase: # повтори пароль
-----
...
-----
Generating a 1024 bit RSA private key
..................++++++
..................++++++
writing new private key to 'client.key'
Enter PEM pass phrase: # установи пароль
Verifying - Enter PEM pass phrase: # повтори пароль
-----
...
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]: employee01 # введи наименование клиента
Name []: employee01 # укажи наименование клиента
Email Address [hi@defaultcompany.com]: employee01@defaultcompany.com
Name []: employee01 # укажи наименование клиента
Email Address [hi@defaultcompany.com]: employee01@defaultcompany.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
...
Certificate is to be certified until Jul 12 09:31:14 2021 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
14. Устанавливаем утилиты управления SELinux
# yum -y install policycoreutils-python
15. Разрешаем udp на порту YYYY в SELinux
# semanage port -a -t openvpn_port_t -p udp YYYY
16. В iptables перед строчками, запрещающими все INPUT и FORWARD
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
пишем
#************* eth0:YYYY (openvpn)
-A INPUT -i eth0 -p udp --dport YYYY -j ACCEPT # Заменяем порт YYYY на нужный
-A INPUT -i tun0 -s 10.8.0.0/24 -d 192.168.X.1 -j ACCEPT # 10.8.0.0 может быть изменена в конфигурации OpenVPN
-A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.X.0/24 -j ACCEPT
-A FORWARD -i eth1 -o tun0 -s 192.168.X.0/24 -d 10.8.0.0/24 -j ACCEPT
#
Примечания
A) Если клиент запускается не под администратором и в логах клиента вы видите что типа
Tue Jan 10 11:22:07 2012 NOTE: FlushIpNetTable failed on interface [19] {57E7BDA3-3906-4728-9E60-D6A1F3057423} (status=5) : Отказано в доступе.
Значит не хватает прав и нужно запускать под администратором (запуск от имени, run as)
B) Клиентская конфигурация поддерживает относительные пути и если у вас много разных openvpn серверов и вы хотите разнести ключи и сертификаты по папкам, на к клиентской конфигурации вполне можно указывать
ca "sever01\\ca.crt"
cert "server01\\employee01.crt"
key "server01\\employee01.key"
Пути будут относительно местоположения файла конфигурации, то есть относительно папки config инсталляции OpenVPN (например C:\Program Files\OpenVPN\config)
C) Чтобы в логах сервера /var/log/openvpn.log постоянно не сыпалось сообщение
D) Если на сервере используется директива ifconfig-pool-persist /etc/openvpn/ipp.txt, при включенном SELinux и в логах ловите
Note: cannot open ipp.txt for READ/WRITE
пробуйте
# restorecon -v './ipp.txt'
E) Если в целях совместимости с предыдущими версиями OpenVPN вы захотите оставить его на порту 5000, прийдется создавать модуль для SELinux. Об этом другая заметка http://www.olegsmith.com/2011/12/selinux-openvpn-5000.html
Использованные материалы
Install/Configure OpenVPN
http://www.server-world.info/en/note?os=CentOS_6&p=openvpn
15. Разрешаем udp на порту YYYY в SELinux
# semanage port -a -t openvpn_port_t -p udp YYYY
16. В iptables перед строчками, запрещающими все INPUT и FORWARD
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
пишем
#************* eth0:YYYY (openvpn)
-A INPUT -i eth0 -p udp --dport YYYY -j ACCEPT # Заменяем порт YYYY на нужный
-A INPUT -i tun0 -s 10.8.0.0/24 -d 192.168.X.1 -j ACCEPT # 10.8.0.0 может быть изменена в конфигурации OpenVPN
-A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.X.0/24 -j ACCEPT
-A FORWARD -i eth1 -o tun0 -s 192.168.X.0/24 -d 10.8.0.0/24 -j ACCEPT
#
17. Рестартим iptables
# service iptables restart
18. Запускаем openvpn
# service openvpn start
19. Проверяем что сервис открыл порт
# netstat -nlp | grep YYYY
19. Проверяем что сервис открыл порт
# netstat -nlp | grep YYYY
20. Ставим OpenVPN в автозапуск
# chkconfig openvpn on
Теперь настраиваем клиента на Windows 7
21. Скачиваем клиента по адресу http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe
22. Забираем файлы сервера
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/employee01.crt
/etc/openvpn/easy-rsa/keys/employee01.key
и помещаем их в папку config инсталляции OpenVPN (C:\Program Files (x86)\OpenVPN\config)
23. Создаем файл конфигурации employee01.ovpn
client
dev tun0
proto udp
remote XXX.XXX.XXX.XXX YYYY # Замени на IP и порт
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert employee01.crt
key employee01.key
ns-cert-type server
comp-lzo
verb 3
24. Запускаем OpenVPN клиента, на трее меню connect
Примечания
A) Если клиент запускается не под администратором и в логах клиента вы видите что типа
Tue Jan 10 11:22:07 2012 NOTE: FlushIpNetTable failed on interface [19] {57E7BDA3-3906-4728-9E60-D6A1F3057423} (status=5) : Отказано в доступе.
Значит не хватает прав и нужно запускать под администратором (запуск от имени, run as)
B) Клиентская конфигурация поддерживает относительные пути и если у вас много разных openvpn серверов и вы хотите разнести ключи и сертификаты по папкам, на к клиентской конфигурации вполне можно указывать
ca "sever01\\ca.crt"
cert "server01\\employee01.crt"
key "server01\\employee01.key"
Пути будут относительно местоположения файла конфигурации, то есть относительно папки config инсталляции OpenVPN (например C:\Program Files\OpenVPN\config)
C) Чтобы в логах сервера /var/log/openvpn.log постоянно не сыпалось сообщение
"Need IPv6 code in mroute_extract_addr_from_packet" необходимо для виртуального сетевого адаптера TAP-Win32 Adapter V9 убрать галку напротив использования протокола IP v6.
D) Если на сервере используется директива ifconfig-pool-persist /etc/openvpn/ipp.txt, при включенном SELinux и в логах ловите
Note: cannot open ipp.txt for READ/WRITE
пробуйте
# restorecon -v './ipp.txt'
E) Если в целях совместимости с предыдущими версиями OpenVPN вы захотите оставить его на порту 5000, прийдется создавать модуль для SELinux. Об этом другая заметка http://www.olegsmith.com/2011/12/selinux-openvpn-5000.html
Использованные материалы
Install/Configure OpenVPN
http://www.server-world.info/en/note?os=CentOS_6&p=openvpn
пятница, декабря 02, 2011
Дебаг правил iptables в CentOS 6.2
Дебажить правила для iptables удобно с помощью логирования, при котором логи файрволла пишутся в отдельный файл. Для этого надо в iptables добавить директивы логирования пакетов и настроить систему логирования CentOS на запись этих сообщений в отдельный файл.
1. Добавляем директивы логирования пакетов в iptables
Допустим базовый конфигурационный файл /etc/sysconfig/iptables выглядит так# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited.
Последними двумя строками отклоняются все INPUT и FORWARD пакеты, которые не подошли правилам выше.
ПЕРЕД этими строчками добавляем следующие директивы
#************* for debug
-A INPUT -j LOG --log-level DEBUG --log-prefix "[FW INPUT]:"
-A FORWARD -j LOG --log-level DEBUG --log-prefix "[FW FORWARD]:"
То есть мы указали в iptables, что все пакеты, не прошедшие по правилам выше директив логирования должны логироваться.
2. Перезапускаем iptables
# service iptables restart
3. Настраиваем rsyslog для записи логов iptables в отдельный файл
Для того, чтобы записать именно сообщения iptables, отфильтруем их на основании уровня логирования DEBUG.
Редактируем vi /etc/rsyslog.conf
# vi /etc/rsyslog.conf
Добавляем в секцию #### RULES ####
kern.debug /var/log/iptables.log
Что означает писать все сообщения ядра уровня логирования DEBUG в файл /var/log/iptables.log
4. Перезапускаем rsyslog
# service rsyslog restart
Теперь все, что не подошло имеющимся правилам и будет отброшено, будет записываться в файл /var/log/iptables.log. По этим данным легко понять какие пакеты мы упустили при написании правил.
воскресенье, ноября 06, 2011
Не используйте Microsoft Remote Desktop Connection for Mac
Не используйте Microsoft Remote Desktop Connection for Mac для администрирования Windows сервера, на котором крутится виртуалка vmware с текстовой консолью linux-сервера или выполняется управление консольным linux-сервером помощью vSphere client. Целые сутки были потрачены на выяснение того, что в MS RDP для Mac "залипает" клавиатура в текстовой консоли, поэтому мне ни разу не удавалось даже залогинится на виртуалку. При этом в X-ах все нормально. Актуально для самой последней версии 2.1.1 (110309).
CentOS 6.0 NFS v4 и MacOS X 10.6
Возникла задача развернуть NFS на CentOS 6.0, экспортировать папку и подключить ее в Mac OS X 10.6. Как всегда есть особенности.
1. Открываем порт NFS в файрволле
# system-config-firewall-tui
1. Открываем порт NFS в файрволле
# system-config-firewall-tui
галку напротив NFS4
2. Инсталлируем NFS
аналогично параметр указывается при подключении через GUI.
2. Инсталлируем NFS
# yum install nfs-utils nfs4-acl-tools
3. Настраиваем экспорт
# vi /etc/exports
3. Настраиваем экспорт
# vi /etc/exports
добавили строчку для экспорта папки /tmp, параметр insecure обязателен
/tmp *(rw,insecure)
сохранили (:w, :q)
4. Экспортируем настройки
# exportfs -a
5. Рестрартуем nfs
# service nfs restart
если пишет "Cannot register service: RPC: Unable to receive; errno = Connection refused rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).", значит не поднялся rpcbind, перепускаем его
# service rpcbind restart
# service nfs restart
С серверной частью все. Теперь Mac OS X 10.6.
Подключить папку можно по мануалу http://www.cyberciti.biz/faq/apple-mac-osx-nfs-mount-command-tutorial/, но надо иметь ввиду, что реализация в NFS v4 в 10.6 на уровне alpha и версию надо обязательно указывать в параметром vers=4.0alpha.
mkdir /Users/Shared/tmp
mount -t nfs -o vers=4.0alpha NFSServer:/tmp /Users/Shared/tmp
/tmp *(rw,insecure)
сохранили (:w, :q)
4. Экспортируем настройки
# exportfs -a
5. Рестрартуем nfs
# service nfs restart
если пишет "Cannot register service: RPC: Unable to receive; errno = Connection refused rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).", значит не поднялся rpcbind, перепускаем его
# service rpcbind restart
# service nfs restart
С серверной частью все. Теперь Mac OS X 10.6.
Подключить папку можно по мануалу http://www.cyberciti.biz/faq/apple-mac-osx-nfs-mount-command-tutorial/, но надо иметь ввиду, что реализация в NFS v4 в 10.6 на уровне alpha и версию надо обязательно указывать в параметром vers=4.0alpha.
mkdir /Users/Shared/tmp
mount -t nfs -o vers=4.0alpha NFSServer:/tmp /Users/Shared/tmp
аналогично параметр указывается при подключении через GUI.
среда, ноября 02, 2011
CentOS VM Clone на VMWare
Чтобы поднять интерфейсы в CentOS на свежесклонированной виртуальной машине делаем следующее:
1. Ищем mac-адреса имеющихся интерфейсов (их также можно посмотреть в настройке виртуальной машины)
# cat /var/log/dmesg | grep -i eth
2. Удаляем все записи с неизвестными нам mac адресами (как правило две первых записи) в файле /etc/udev/rules.d/70-persistent-net.rules
# vi /etc/udev/rules.d/70-persistent-net.rules
3. Добавляем нужные mac-адреса в настройки каждого интерфейса
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
строчка HWADDR=XX:XX:XX:XX:XX:XX
4. Ребутимся
# reboot
1. Ищем mac-адреса имеющихся интерфейсов (их также можно посмотреть в настройке виртуальной машины)
# cat /var/log/dmesg | grep -i eth
2. Удаляем все записи с неизвестными нам mac адресами (как правило две первых записи) в файле /etc/udev/rules.d/70-persistent-net.rules
# vi /etc/udev/rules.d/70-persistent-net.rules
3. Добавляем нужные mac-адреса в настройки каждого интерфейса
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
строчка HWADDR=XX:XX:XX:XX:XX:XX
4. Ребутимся
# reboot
понедельник, октября 31, 2011
Ссылки 2011-11
Open unofficial storage performance thread with VMware vSphere
http://communities.vmware.com/thread/197844?start=330&tstart=0
PXE загрузка ESXi с конфигами
http://www.vm4.ru/2009/04/pxe-esxi.html
Install VMware Tools on CentOS 5.6 with YUM
http://jameshouse.org/2011/05/25/install-vmware-tools-on-centos-5-6-with-yum/
Can I grow an existing virtual disk (.vmdk file)?
http://vmfaq.com/entry/10/
Duplicate VMDK UUIDs are created when virtual machines are deployed from a template
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2006865
Установка Nginx в CentOS 6
http://libnix.com/install-nginx-centos-6.html
Подключение EPEL в CentOS 6.0http://dimugric.wordpress.com/2011/07/20/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-epel-%D0%B2-centos-6-0/
Big Data News
http://www.scoop.it/t/big-data-news/
MapReduce example using Akka Actors
https://gist.github.com/1123718
k-Means Clustering with MapReduce
http://codingwiththomas.blogspot.com/2011/05/k-means-clustering-with-mapreduce.html
K-Means Clustering in Map Reduce
http://horicky.blogspot.com/2011/04/k-means-clustering-in-map-reduce.html
K-Means Clustering
https://cwiki.apache.org/confluence/display/MAHOUT/K-Means+Clustering
http://communities.vmware.com/thread/197844?start=330&tstart=0
PXE загрузка ESXi с конфигами
http://www.vm4.ru/2009/04/pxe-esxi.html
Install VMware Tools on CentOS 5.6 with YUM
http://jameshouse.org/2011/05/25/install-vmware-tools-on-centos-5-6-with-yum/
Can I grow an existing virtual disk (.vmdk file)?
http://vmfaq.com/entry/10/
Duplicate VMDK UUIDs are created when virtual machines are deployed from a template
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2006865
Установка Nginx в CentOS 6
http://libnix.com/install-nginx-centos-6.html
Подключение EPEL в CentOS 6.0http://dimugric.wordpress.com/2011/07/20/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-epel-%D0%B2-centos-6-0/
Big Data News
http://www.scoop.it/t/big-data-news/
MapReduce example using Akka Actors
https://gist.github.com/1123718
k-Means Clustering with MapReduce
http://codingwiththomas.blogspot.com/2011/05/k-means-clustering-with-mapreduce.html
K-Means Clustering in Map Reduce
http://horicky.blogspot.com/2011/04/k-means-clustering-in-map-reduce.html
Fast Clustering using MapReduce
http://arxiv.org/pdf/1109.1579v1
K-Means Clustering
https://cwiki.apache.org/confluence/display/MAHOUT/K-Means+Clustering
Clustering in the Cloud
http://ecommons.txstate.edu/cgi/viewcontent.cgi?article=1018&context=cscitrep&sei-redir=1&referer=http%3A%2F%2Fwww.google.ru%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dmapreduce%2520clustering%26source%3Dweb%26cd%3D2%26ved%3D0CDIQFjAB%26url%3Dhttp%253A%252F%252Fecommons.txstate.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1018%2526context%253Dcscitrep%26ei%3DgUvJTqjiJdDV4QSXjIk9%26usg%3DAFQjCNFzy49Ehr1PfWkBDx9yoL1GU2OdtQ#search=%22mapreduce%20clustering%22
воскресенье, октября 30, 2011
CentOS 6.2+nginx 1.0.11 (reverse-proxy)+iptables
Имеем минимальный CentOS 6.2. Ставим и настраиваем nginx 1.0.11 как reverse-proxy для кучи сайтов в LAN. Схема следующая
INTERNET --- eth0 (XXX.XXX.XXX.XXX) | eth1 (192.168.X.1) --- LAN (192.168.X.0/24)
1. Апдейтим CentOS 6.2
# yum update
2. Устанавливаем repo с nginx прямо с http://nginx.org/
# rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
3. Устанавливаем nginx 1.0.11
# yum install nginx
4. Настраиваем reverse-proxy
# vi /etc/nginx/nginx.conf
5. Добавляем в секцию http
upstream site01 {
server 192.168.X.20:80; # меняем адрес на свой внутренний веб-сервер
}
server {
listen 80;
server_name site01.defaultcompany.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
location / {
proxy_pass http://site01;
}
}
#************* eth0:80,443 (http)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
#
INTERNET --- eth0 (XXX.XXX.XXX.XXX) | eth1 (192.168.X.1) --- LAN (192.168.X.0/24)
1. Апдейтим CentOS 6.2
# yum update
2. Устанавливаем repo с nginx прямо с http://nginx.org/
# rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
3. Устанавливаем nginx 1.0.11
# yum install nginx
4. Настраиваем reverse-proxy
# vi /etc/nginx/nginx.conf
5. Добавляем в секцию http
upstream site01 {
server 192.168.X.20:80; # меняем адрес на свой внутренний веб-сервер
}
server {
listen 80;
server_name site01.defaultcompany.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
location / {
proxy_pass http://site01;
}
}
6. Настраиваем iptables
# vi /etc/sysconfig/iptables
Перед последними строками
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
Перед последними строками
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
Пишем
#************* eth0:80,443 (http)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
#
7. Рестартим nginx
# service nginx restart
Теперь если defaultcompany.com указывает на ваш сервер, то по адресу http://site01.defaultcompany.com будет опубликовано http://192.168.X.20:80.
Конвертируем образ диска Virtualbox в VMware на Mac
Средствами Virtualbox должно работать так
vboxmanage internalcommands converthd -srcformat VDI d:\Path\HardDisks\WindowsVista.vdi -dstformat VMDK d:\Path\HardDisks\WindowsVista.vmdk
Но у меня полученный образ с VMware Fusion 4 не заработал. А вот конвертация в два шага - работает
VBoxManage internalcommands converthd -srcformat VDI -dstformat RAW srcpath\src.vdi dstraw\dst.raw
VBoxManage convertfromraw -format VMDK dstraw\dst.raw dstvmdk\dst.vmdk
http://unclejoda.blogspot.com/2011/05/virtualbox-vmware.html
Другой вариант - использование VMware vCenter Converter™
Ставим внутри виртуальной машины Converter, выбираем ее же для конвертирования, сохраняем vmdk на общем диске.
Диск будет фрагментирован 2 Гб файлами, для объединения запускаем
/Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager –r thefirstfile.vmdk –t 0 singlefile.vmdk
http://www.mahmoudthoughts.com/2009/07/merge-2gb-vmdk-files-to-one-single-vmdk.html
При любом варианте следует иметь ввиду, что динамически расширяемые диски будут разворачиваться полностью, а значит если размер изначально был взят с запасом, то для его конвертации может и места не хватить.
vboxmanage internalcommands converthd -srcformat VDI d:\Path\HardDisks\WindowsVista.vdi -dstformat VMDK d:\Path\HardDisks\WindowsVista.vmdk
Но у меня полученный образ с VMware Fusion 4 не заработал. А вот конвертация в два шага - работает
VBoxManage internalcommands converthd -srcformat VDI -dstformat RAW srcpath\src.vdi dstraw\dst.raw
VBoxManage convertfromraw -format VMDK dstraw\dst.raw dstvmdk\dst.vmdk
http://unclejoda.blogspot.com/2011/05/virtualbox-vmware.html
Другой вариант - использование VMware vCenter Converter™
Ставим внутри виртуальной машины Converter, выбираем ее же для конвертирования, сохраняем vmdk на общем диске.
Диск будет фрагментирован 2 Гб файлами, для объединения запускаем
/Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager –r thefirstfile.vmdk –t 0 singlefile.vmdk
http://www.mahmoudthoughts.com/2009/07/merge-2gb-vmdk-files-to-one-single-vmdk.html
При любом варианте следует иметь ввиду, что динамически расширяемые диски будут разворачиваться полностью, а значит если размер изначально был взят с запасом, то для его конвертации может и места не хватить.
вторник, октября 11, 2011
Установка VMWare Tools в CentOS без доступа к сети
Установка VMWare Tools в CentOS без доступа к сети
1. Подключаем DVD с образом CentOS к виртуальной машине (после установки образ отключается!)
1. Монтируем DVD с дистрибутивом CentOS
# mkdir /media/CentOS
# mount /dev/dvd /media/CentOS
2. Подключаем репо с DVD CentOS
# vi /etc/yum.repos.d/CentOS-Media.repo
enablerepo=1
3. Устанавливаем gcc, kernel-devel
# yum --disablerepo=\* --enablerepo=c5-media install gcc kernel-devel
4. Отключаем DVD с дистрибутивом CentOS
# umount /media/CentOS
5. Жмем кнопку Install VMWare tools
6. Монтируем CD с VMWare tools
# mount /dev/cdrom /mnt
7. Распаковываем VMWare tools
# tar -C /tmp -zxvf /mnt/VMwareTools-X.X.X-XXXXXX.tar.gz
8. Демонтируем CDROM
# umount /mnt
9. Запускаем инсталлятор VMWare tools
# cd /tmp/vmware-tools-distrib
# ./vmware-install.pl
10. Отвечаем на все вопросы инсталлятора. Можно все оставить по умолчанию.
11. Ребутимся
# reboot
1. Подключаем DVD с образом CentOS к виртуальной машине (после установки образ отключается!)
1. Монтируем DVD с дистрибутивом CentOS
# mkdir /media/CentOS
# mount /dev/dvd /media/CentOS
2. Подключаем репо с DVD CentOS
# vi /etc/yum.repos.d/CentOS-Media.repo
enablerepo=1
3. Устанавливаем gcc, kernel-devel
# yum --disablerepo=\* --enablerepo=c5-media install gcc kernel-devel
4. Отключаем DVD с дистрибутивом CentOS
# umount /media/CentOS
5. Жмем кнопку Install VMWare tools
6. Монтируем CD с VMWare tools
# mount /dev/cdrom /mnt
7. Распаковываем VMWare tools
# tar -C /tmp -zxvf /mnt/VMwareTools-X.X.X-XXXXXX.tar.gz
8. Демонтируем CDROM
# umount /mnt
9. Запускаем инсталлятор VMWare tools
# cd /tmp/vmware-tools-distrib
# ./vmware-install.pl
10. Отвечаем на все вопросы инсталлятора. Можно все оставить по умолчанию.
11. Ребутимся
# reboot
вторник, октября 04, 2011
CentOS minimal на VMWare
После установки CentOS minimal на VMWare без EasyInstall сетевые интерфейсы отключены. Чтобы их поднять
1. Редактируем настойки интерфейсов (на примере eth0)
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
если dhcp, добавляем BOOTPROTO="dhcp"
если статика, указываем
BOOTPROTO="none"
1. Редактируем настойки интерфейсов (на примере eth0)
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
если dhcp, добавляем BOOTPROTO="dhcp"
если статика, указываем
BOOTPROTO="none"
IPADDR=192.168.X.X
NETMASK=255.255.255.0
GATEWAY=192.168.X.X
TYPE=Ethernet
2. Рестартим сервис
# service network restart
Апдейтим систему
NETMASK=255.255.255.0
GATEWAY=192.168.X.X
TYPE=Ethernet
2. Рестартим сервис
# service network restart
Апдейтим систему
# yum update
Далее устанавливаем VMWare Tools
1. Устанавливаем gcc, kernel-devel
# yum install gcc kernel-devel
2. В VMWare жмем кнопку Install VMWare tools. Монтируем CD с VMWare tools
# mount /dev/cdrom /mnt
4. Распаковываем VMWare tools
# tar -C /tmp -zxvf /mnt/VMwareTools-X.X.X-XXXXXX.tar.gz
5. Демонтируем CDROM
# umount /mnt
Далее устанавливаем VMWare Tools
1. Устанавливаем gcc, kernel-devel
# yum install gcc kernel-devel
2. В VMWare жмем кнопку Install VMWare tools. Монтируем CD с VMWare tools
# mount /dev/cdrom /mnt
4. Распаковываем VMWare tools
# tar -C /tmp -zxvf /mnt/VMwareTools-X.X.X-XXXXXX.tar.gz
5. Демонтируем CDROM
# umount /mnt
6. Устанавливаем Perl
# yum install perl
7. Запускаем инсталлятор VMWare tools
# cd /tmp/vmware-tools-distrib
# ./vmware-install.pl
8. Отвечаем на все вопросы инсталлятора. Можно все оставить по умолчанию.
9. Ребутимся
# reboot
7. Запускаем инсталлятор VMWare tools
# cd /tmp/vmware-tools-distrib
# ./vmware-install.pl
8. Отвечаем на все вопросы инсталлятора. Можно все оставить по умолчанию.
9. Ребутимся
# reboot
вторник, сентября 27, 2011
Ссылки 2011-09
Scala School! From ∅ to Distributed Service
http://twitter.github.com/scala_school/
Akka and Async HTTP Client
http://wijaya.posterous.com/akka-and-async-http-client
Evaluating Text Extraction Algorithms
A personalized iPad magazine that gets smarter as you use it.
http://www.zite.com/
Поставки 16-ядерных серверных чипов AMD Interlagos на архитектуре Bulldozer стартовали
http://www.ferra.ru/ru/system/news/2011/09/07/amd-ships-first-interlagos/
use sbt 0.11.0 with Lift
https://github.com/lacy/lift-quickstart
http://twitter.github.com/scala_school/
Akka and Async HTTP Client
http://wijaya.posterous.com/akka-and-async-http-client
Evaluating Text Extraction Algorithms
http://tomazkovacic.com/blog/122/evaluating-text-extraction-algorithms/
This project extends the original Boilerpipe HTMLHighlighter to support extracting HTML with images.
https://github.com/gregbayer/boilerpipe
This project extends the original Boilerpipe HTMLHighlighter to support extracting HTML with images.
https://github.com/gregbayer/boilerpipe
http://www.zite.com/
Поставки 16-ядерных серверных чипов AMD Interlagos на архитектуре Bulldozer стартовали
http://www.ferra.ru/ru/system/news/2011/09/07/amd-ships-first-interlagos/
https://github.com/lacy/lift-quickstart
суббота, сентября 24, 2011
AWS EC2: Debian + Sun Java + Jetty 6
берем AMI debian-6.0-squeeze-base-x86_64-20110417 (ami-35b68141), создаем, генерим ключи, откарываем порты ssh, 8080 в Security Groups
заходим на машину
обновляем Debian
ставим Sun Java
ставим Jetty 6.x
редактируем конфиг Jetty
чтобы стартовал пишем
чтобы слушал всех пишем
запускаем сервис
идем на http://instance_public_DNS.com:8080/ и радуемся
чтобы что-нибудь закачивать на машину с использованием GUI (например MacFusion) добавляем ключи в хранилище http://bohuco.net/blog/2011/01/mount-amazon-ec2-with-mac-osx/
заходим на машину
# ssh -i /path/to/key root@instance_public_DNS.comобновляем Debian
# apt-get updateставим Sun Java
# apt-get install sun-java6-jreставим Jetty 6.x
# apt-get install jettyредактируем конфиг Jetty
# vi /etc/default/jettyчтобы стартовал пишем
NO_START=0чтобы слушал всех пишем
JETTY_HOST=0.0.0.0запускаем сервис
# service jetty startидем на http://instance_public_DNS.com:8080/ и радуемся
чтобы что-нибудь закачивать на машину с использованием GUI (например MacFusion) добавляем ключи в хранилище http://bohuco.net/blog/2011/01/mount-amazon-ec2-with-mac-osx/
понедельник, сентября 12, 2011
timestamp in filename
2012 год на дворе, а в windows до сих пор сложно получить строку вида yyyy-MM-dd-hh-mm в командных файлах без программирования. В основном все вырезают кусочками нужные части из %date% (для года %date:~6,4%) и %time%. Все это сразу перестает работать в другой локали. Потом приходится думать что делать с отсутствующими leading zero в месяцах-днях-часах-минутах. Я для себя остановился на следующей версии
set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%
Через wmic получаем нужные строчки, парсим, где надо добавляем нули.
Ну не мытьём, так катанием.
В итоге скрипт по сохранению базы древнего MS SQL 2000, со структурой хранения
\SQLBackup\yyyy-MM\yyyy-MM-dd\SQLDB-yyyy-MM-dd-hh-mm.bak
относительно местоположения скрипта может выглядеть так
REM __________________ Edit area _______________________
set folder=SQLBackup
set filename=SQLDB
REM _________________________________________________
set cmdpath=%~dp0
set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%
set yyyy_mm=%year%-%month%
set yyyy_mm_dd=%year%-%month%-%day%
set yyyy_mm_dd_hh_mm=%year%-%month%-%day%-%hour%-%minute%
mkdir "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%"
osql -E -Q "BACKUP DATABASE CorpDB TO DISK = '%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.bak';" -o "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.log"
set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%
Через wmic получаем нужные строчки, парсим, где надо добавляем нули.
Ну не мытьём, так катанием.
В итоге скрипт по сохранению базы древнего MS SQL 2000, со структурой хранения
\SQLBackup\yyyy-MM\yyyy-MM-dd\SQLDB-yyyy-MM-dd-hh-mm.bak
относительно местоположения скрипта может выглядеть так
REM __________________ Edit area _______________________
set folder=SQLBackup
set filename=SQLDB
REM _________________________________________________
set cmdpath=%~dp0
set "exec=wmic path win32_LocalTime get Year^,Month^,Day^,Hour^,Minute /value"
for /f "tokens=1,2 delims==" %%i in ('%exec%') do 2>nul set "%%i=%%j"
set month=0%month%
set month=%month:~-2%
set day=0%day%
set day=%day:~-2%
set hour=0%hour%
set hour=%hour:~-2%
set minute=0%minute%
set minute=%minute:~-2%
set yyyy_mm=%year%-%month%
set yyyy_mm_dd=%year%-%month%-%day%
set yyyy_mm_dd_hh_mm=%year%-%month%-%day%-%hour%-%minute%
mkdir "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%"
osql -E -Q "BACKUP DATABASE CorpDB TO DISK = '%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.bak';" -o "%cmdpath%%folder%\%yyyy_mm%\%yyyy_mm_dd%\%filename%-%yyyy_mm_dd_hh_mm%.log"
четверг, августа 11, 2011
liftweb 2.4 и sbt 0.10.1
В корне проекта создаем build.sbt
старую папку project переименовываем в project-old
создаем новую папку project
в project/plugins/build.sbt пишем
name := "projectname"
scalaVersion := "2.9.0"
seq(webSettings :_*)
libraryDependencies ++= Seq(
"net.liftweb" %% "lift-webkit" % "2.4-M1" % "compile->default",
"net.liftweb" %% "lift-mapper" % "2.4-M1" % "compile->default",
"net.liftweb" %% "lift-wizard" % "2.4-M1" % "compile->default")
libraryDependencies ++= Seq(
"junit" % "junit" % "4.5" % "test->default",
"org.mortbay.jetty" % "jetty" % "6.1.22" % "jetty",
"javax.servlet" % "servlet-api" % "2.5" % "provided->default",
"com.h2database" % "h2" % "1.2.138",
"ch.qos.logback" % "logback-classic" % "0.9.26" % "compile->default"
)
scalaVersion := "2.9.0"
seq(webSettings :_*)
libraryDependencies ++= Seq(
"net.liftweb" %% "lift-webkit" % "2.4-M1" % "compile->default",
"net.liftweb" %% "lift-mapper" % "2.4-M1" % "compile->default",
"net.liftweb" %% "lift-wizard" % "2.4-M1" % "compile->default")
libraryDependencies ++= Seq(
"junit" % "junit" % "4.5" % "test->default",
"org.mortbay.jetty" % "jetty" % "6.1.22" % "jetty",
"javax.servlet" % "servlet-api" % "2.5" % "provided->default",
"com.h2database" % "h2" % "1.2.138",
"ch.qos.logback" % "logback-classic" % "0.9.26" % "compile->default"
)
старую папку project переименовываем в project-old
создаем новую папку project
в project/plugins/build.sbt пишем
resolvers += "Web plugin repo" at "http://siasia.github.com/maven2"
//Following means libraryDependencies += "com.github.siasia" %% "xsbt-web-plugin" % "0.1.1-""
libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-web-plugin" % ("0.1.1-"+v))
//Following means libraryDependencies += "com.github.siasia" %% "xsbt-web-plugin" % "0.1.1-
libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-web-plugin" % ("0.1.1-"+v))
sbt 0.10.1 в Mac OS X
cd ~
wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.10.1/sbt-launch.jar
sudo mv sbt-launch.jar /usr/local/bin/sbt-launch.jar
echo "java -Xmx512M -jar /usr/local/bin/sbt-launch.jar \"\$@\"" | sudo tee /usr/local/bin/sbt
sudo chmod +x /usr/local/bin/sbt
wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.10.1/sbt-launch.jar
sudo mv sbt-launch.jar /usr/local/bin/sbt-launch.jar
echo "java -Xmx512M -jar /usr/local/bin/sbt-launch.jar \"\$@\"" | sudo tee /usr/local/bin/sbt
sudo chmod +x /usr/local/bin/sbt
Ссылки 2011-08
Scala
The Builder Pattern in Scala
http://www.earldouglas.com/the-builder-pattern-in-scala
Migrating to sbt 0.10: Lift
http://www.assembla.com/spaces/liftweb/wiki/Using_SBT
http://moreindirection.blogspot.com/2011/06/migrating-to-sbt-010-lift.html
http://d.hatena.ne.jp/k4200/20110711/1310354698
http://stackoverflow.com/questions/6718266/lift-does-not-build-with-sbt
Scala:match tuple with null
http://daily-scala.blogspot.com/2010/01/matching-nulls.html
http://stackoverflow.com/questions/2024841/match-tuple-with-null
Asynchronous Network I/O with Scala Continuations
http://www.earldouglas.com/asynchronous-network-io-with-scala-continuations
Introducing ElasticMQ: Scala SQS alternative
http://www.warski.org/blog/2011/08/introducing-elasticmq-scala-sqs-alternative/
Scala presentation by Aleksandar Prokopec
http://www.slideshare.net/loicd/scala-presentation-by-aleksandar-prokopec
northeast scala symposium materials
http://www.nescala.org/2011/
oAuth
Simple OAuth library for Java
https://github.com/fernandezpablo85/scribe-java
Consuming the Twitter API in Scala with Scribe
http://www.earldouglas.com/consuming-the-twitter-api-in-scala-with-scribe
OAuth using Scribe with Yahoo API
http://ashwinrayaprolu.wordpress.com/2011/05/12/oauth-using-scribe-with-yahoo-api/
https://github.com/fernandezpablo85/scribe-java/issues/99
jQuery plugin for Twitter OAuth via popup window (Facebook style)
http://zuzara.com/blog/2010/05/15/jquery-plugin-for-twitter-oauth-via-popup-window-facebook-style/
Which Google api to use for getting user's first name, last name, picture, etc?
http://stackoverflow.com/questions/2108537/which-google-api-to-use-for-getting-users-first-name-last-name-picture-etc
jQuery
Sticky - An unbelievably simple notification system for jQuery
http://thrivingkings.com/sticky/
Badger - Super sexy iOS style badges for jQuery
http://thrivingkings.com/badger/
JavaScript QrCode Generator
http://codecanyon.net/item/javascript-qrcode-generator/full_screen_preview/407938
Cross Domain
easyXDM - Cross-Domain Messaging made easy
http://easyxdm.net/wp/
Cross-domain, cross-browser IFRAME RESIZING
http://stackoverflow.com/questions/153152/resizing-an-iframe-based-on-content
Secure Cross Domain iFrame Communication
http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/
Icons
http://creattica.com/icons/latest
Hadoop
Hadoop в Facebook
http://abava.blogspot.com/2011/07/hadoop.html
Usability
Web design patterns
http://patterntap.com/
Photoshop
Corporate Business – Design a Modern & Stunning Web Layout
http://www.psd.p2ptuts.com/corporate-business-design-modern-stunning-web-layout/
Human Statue Effect : Cursed by Medusa
http://www.psd.p2ptuts.com/human-statue-effect-cursed-medusa/
How to Create Skin for the Cube
http://www.psd.p2ptuts.com/create-skin-cube/
Business idea
Интернет-шоппинг в метро
http://coolidea.ru/2011/07/07/shopping-v-metro/
Finance
Доходность комодов, фьючерсов, валют и пр. за год - лучше всего показало себя серебро
http://finviz.com/futures_performance.ashx?v=16
The Builder Pattern in Scala
http://www.earldouglas.com/the-builder-pattern-in-scala
Migrating to sbt 0.10: Lift
http://www.assembla.com/spaces/liftweb/wiki/Using_SBT
http://moreindirection.blogspot.com/2011/06/migrating-to-sbt-010-lift.html
http://d.hatena.ne.jp/k4200/20110711/1310354698
http://stackoverflow.com/questions/6718266/lift-does-not-build-with-sbt
Scala:match tuple with null
http://daily-scala.blogspot.com/2010/01/matching-nulls.html
http://stackoverflow.com/questions/2024841/match-tuple-with-null
Asynchronous Network I/O with Scala Continuations
http://www.earldouglas.com/asynchronous-network-io-with-scala-continuations
Introducing ElasticMQ: Scala SQS alternative
http://www.warski.org/blog/2011/08/introducing-elasticmq-scala-sqs-alternative/
Scala presentation by Aleksandar Prokopec
http://www.slideshare.net/loicd/scala-presentation-by-aleksandar-prokopec
northeast scala symposium materials
http://www.nescala.org/2011/
oAuth
Simple OAuth library for Java
https://github.com/fernandezpablo85/scribe-java
Consuming the Twitter API in Scala with Scribe
http://www.earldouglas.com/consuming-the-twitter-api-in-scala-with-scribe
OAuth using Scribe with Yahoo API
http://ashwinrayaprolu.wordpress.com/2011/05/12/oauth-using-scribe-with-yahoo-api/
https://github.com/fernandezpablo85/scribe-java/issues/99
jQuery plugin for Twitter OAuth via popup window (Facebook style)
http://zuzara.com/blog/2010/05/15/jquery-plugin-for-twitter-oauth-via-popup-window-facebook-style/
Which Google api to use for getting user's first name, last name, picture, etc?
http://stackoverflow.com/questions/2108537/which-google-api-to-use-for-getting-users-first-name-last-name-picture-etc
jQuery
Sticky - An unbelievably simple notification system for jQuery
http://thrivingkings.com/sticky/
Badger - Super sexy iOS style badges for jQuery
http://thrivingkings.com/badger/
JavaScript QrCode Generator
http://codecanyon.net/item/javascript-qrcode-generator/full_screen_preview/407938
Cross Domain
easyXDM - Cross-Domain Messaging made easy
http://easyxdm.net/wp/
Cross-domain, cross-browser IFRAME RESIZING
http://stackoverflow.com/questions/153152/resizing-an-iframe-based-on-content
Secure Cross Domain iFrame Communication
http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/
Icons
http://creattica.com/icons/latest
Hadoop
Hadoop в Facebook
http://abava.blogspot.com/2011/07/hadoop.html
Usability
Web design patterns
http://patterntap.com/
Photoshop
Corporate Business – Design a Modern & Stunning Web Layout
http://www.psd.p2ptuts.com/corporate-business-design-modern-stunning-web-layout/
Human Statue Effect : Cursed by Medusa
http://www.psd.p2ptuts.com/human-statue-effect-cursed-medusa/
How to Create Skin for the Cube
http://www.psd.p2ptuts.com/create-skin-cube/
Business idea
Интернет-шоппинг в метро
http://coolidea.ru/2011/07/07/shopping-v-metro/
Finance
Доходность комодов, фьючерсов, валют и пр. за год - лучше всего показало себя серебро
http://finviz.com/futures_performance.ashx?v=16
понедельник, июня 27, 2011
Быстрая компиляция scala-проекта в IDEA
Утомительная компиляция scala-проекта может быть ускорена использованием быстрого компилятора scala fsc (fast scalac). В IDEA меню Project/Settings, Compiler/Scal Compiler, галка Use fsc. Естественно, перед компиляцией проекта сервер компиляции должен быть запущен. Для этого один раз создаете конфигурацию Edit Configuration, плюсик (Add new configuration), Scala Compilation Server, назвать fsc. Запуск сервера компиляции стандартный.
Дополнительная ссылка
http://grahamhackingscala.blogspot.com/2010/10/turn-fsc-fast-scala-compiling-on-in.html
Дополнительная ссылка
http://grahamhackingscala.blogspot.com/2010/10/turn-fsc-fast-scala-compiling-on-in.html
четверг, июня 02, 2011
Links 2011-06
HTML
A new micro clearfix hack
http://nicolasgallagher.com/micro-clearfix-hack/
Что тут скажешь? Уже 2011 год а веб-дизайнеры все ищут пути правильно уложить div с float во всех браузерах.
Improved Internet Explorer Targeting through Body Classes
http://misteroneill.com/improved-internet-explorer-targeting-through-body-classes/
А так же метят IE условными комментариями
Scala
10 Scala One Liners to Impress Your Friends
http://solog.co/
http://solog.co/47/10-scala-one-liners-to-impress-your-friends/
Мелкие полезняшки типа
val pairs = List("C", "Procedural", "Java", "Object-Oriented", "Haskell", "Functional", "Scala", "Multi-Paradigm")
val map = pairs.grouped(2).map(pair => (pair(0), pair(1))).toMap
println(map)
Prints:
Map(C -> Procedural, Java -> Object-Oriented, Haskell -> Functional, Scala -> Multi-Paradigm)
Functional Testing with Selenium WebDriver and Scala
http://solog.co/44/functional-testing-with-selenium-webdriver-and-scala/
Лаконично выглядит тестирование с силениумским FirefoxDriver
val driver = new FirefoxDriver
driver.get("http://maps.google.com")
// verify we retrieve the page and have the title
"Google Maps" should "have the proper title" in {
assert(driver.getTitle() === "Google Maps")
}
it should "be able to perform a query" in {
// get form element
val inputElement = driver.findElement(By.name("q"))
// type in search query
inputElement.sendKeys("San Francisco")
// submit form
inputElement.submit
}
Отличный метод для создания round corners,
http://www.smashingmagazine.com/2011/02/07/mastering-photoshop-noise-textures-gradients-and-rounded-rectangles/
A new micro clearfix hack
http://nicolasgallagher.com/micro-clearfix-hack/
Что тут скажешь? Уже 2011 год а веб-дизайнеры все ищут пути правильно уложить div с float во всех браузерах.
Improved Internet Explorer Targeting through Body Classes
http://misteroneill.com/improved-internet-explorer-targeting-through-body-classes/
А так же метят IE условными комментариями
Scala
10 Scala One Liners to Impress Your Friends
http://solog.co/
http://solog.co/47/10-scala-one-liners-to-impress-your-friends/
Мелкие полезняшки типа
val pairs = List("C", "Procedural", "Java", "Object-Oriented", "Haskell", "Functional", "Scala", "Multi-Paradigm")
val map = pairs.grouped(2).map(pair => (pair(0), pair(1))).toMap
println(map)
Prints:
Map(C -> Procedural, Java -> Object-Oriented, Haskell -> Functional, Scala -> Multi-Paradigm)
Functional Testing with Selenium WebDriver and Scala
http://solog.co/44/functional-testing-with-selenium-webdriver-and-scala/
Лаконично выглядит тестирование с силениумским FirefoxDriver
val driver = new FirefoxDriver
driver.get("http://maps.google.com")
// verify we retrieve the page and have the title
"Google Maps" should "have the proper title" in {
assert(driver.getTitle() === "Google Maps")
}
it should "be able to perform a query" in {
// get form element
val inputElement = driver.findElement(By.name("q"))
// type in search query
inputElement.sendKeys("San Francisco")
// submit form
inputElement.submit
}
Отличный метод для создания round corners,
http://www.smashingmagazine.com/2011/02/07/mastering-photoshop-noise-textures-gradients-and-rounded-rectangles/
пятница, мая 27, 2011
Бизнес в России
http://www.forbes.ru/svoi-biznes-opinion/biznes-i-vlast/67883-pochemu-ya-zaregistriroval-svoi-startap-ne-v-rossii
среда, мая 04, 2011
Foursquare Rogue и Lift 2.3
Rogue это Lift/MongoDB query DSL. Последня версия 1.0.9 тянет за собой Lift 2.4-SNAPSHOT, а в ней еще не все красиво, поэтому если собираете проект на Lift 2.3 с Rogue 1.0.9, не забудьте отучить Rogue собирать за собой зависимости с помощью intransitive() в sbt. Как-то так:
import sbt._
class LiftProject(info: ProjectInfo) extends DefaultWebProject(info) {
val liftVersion = "2.3"
// uncomment the following if you want to use the snapshot repo
// val scalatoolsSnapshot = ScalaToolsSnapshots
// If you're using JRebel for Lift development, uncomment
// this line
// override def scanDirectories = Nil
override def libraryDependencies = Set(
"net.liftweb" %% "lift-webkit" % liftVersion % "compile" withSources(),
"net.liftweb" %% "lift-record" % liftVersion % "compile" withSources(),
"net.liftweb" %% "lift-proto" % liftVersion % "compile" withSources(),
"net.liftweb" %% "lift-util" % liftVersion % "compile" withSources(),
"net.liftweb" %% "lift-common" % liftVersion % "compile" withSources(),
"net.liftweb" %% "lift-mongodb-record" % liftVersion % "compile" withSources(),
"com.foursquare" %% "rogue" % "1.0.9" withSources() intransitive(),
"org.mortbay.jetty" % "jetty" % "6.1.22" % "test->default",
"junit" % "junit" % "4.5" % "test->default",
"ch.qos.logback" % "logback-classic" % "0.9.26",
"org.scala-tools.testing" %% "specs" % "1.6.7" % "test->default",
"org.scalatest" % "scalatest" % "1.3" % "test->default",
"com.h2database" % "h2" % "1.2.138"
) ++ super.libraryDependencies
//override def dependencyPath = webappPath / "WEB-INF" / "lib"
}
среда, апреля 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 как список исключений
а потом добавляем в этот файл строчку .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:
2. Если репозиторий EPEL в yum не установлен, добаляем:
4. Ставим PostgreSQL или MySQL
Для MySQL
Для PostgreSQL
5. Создаем базу redmine (не забываем поменять пароль changeme)
Для MySQL
6. Ставим Ruby 1.9.2
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)
1.6.2
8. Ставим rake и rails
9. Гемы для работы с MySQL или PostgreSQL
Для MySQL
Для PostgreSQL
10. Ставим нужные версии гемов
11. Распаковываем Redmine 1.1.2
12. Настраиваем database.yml в Redmine, пользователя redmine создадим позже
Для mySQL:
14. Редактируем environment.rb
Убираем комментарий с 5 строчки
После 55 строчки добавляем
15. Создаем структуру базы, загружаем данные
16. Переименовали dispatch.rb
17. Добавляем пользователя redmine, от которого будет запускаться Thin
18. Настроили права доступа для пользователя redmine к Redmine
19. Ставим и настраиваем сервер Thin
20. Создаем файл конфигурации Thin /etc/thin/redmine.yml
21. Настраиваем nginx
в секцию http добавили:
22. Проверили как все работает вместе
зашли на http://localhost, admin:admin, Порадовались работающему Redmine
23. Добавили в автозагрузку thin и nginx
24. Устанавливаем git
25. Добавляем пользователя git для gitolite, включаем пользователя redmine в группу git
26. Устанавливаем gitolite
27. Создаем папку для репозитория gitolite даем права на нее пользователю и группе git.
28. НА ЛОКАЛЬНОЙ РАБОЧЕЙ СТАНЦИИ генерируем ssh-ключ (ssh-keygen -t rsa) , с которым будет проиницалиализирован gitolite и с который будет использован для удаленного доступа к конфигурации gitolite. Переписываем ключ на сервер в директорию /tmp. Пусть файл публичного ключа называется id_rsa.pub.
29. Инициализируем gitolite
Меняем переменную $REPO_UMASK, которая устанавливает маску прав (umask, http://www.giocc.com/public-repositories-in-gitolite-with-umasks.html) для файлов и директорий репозитория
Меняем переменную $REPO_BASE для указания пути к месту хранения репозитория.
30. Тестируем работу gitolite. НА ЛОКАЛЬНОЙ РАБОЧЕЙ СТАНЦИИ клонируем созданный gitolite по умолчанию проект testing.git, создаем, добавляем, коммитим и пушим на сервер файл.
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
1. Как всегда обновляем CentOS:
# yum update2. Если репозиторий 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. Ставим nginxname=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
# yum install nginx4. Ставим PostgreSQL или MySQL
Для MySQL
# yum install mysql mysql-server mysql-develДля PostgreSQL
# yum install postgresql postgresql-server postgresql-devel5. Создаем базу redmine (не забываем поменять пароль changeme)
Для MySQL
# /sbin/service mysqld start# mysql -u root -pmysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'changeme';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
Для PostgreSQLmysql> create user 'redmine'@'localhost' identified by 'changeme';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
# /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
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 -vruby 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 -v1.6.2
8. Ставим rake и rails
# gem install rake# gem install rails9. Гемы для работы с MySQL или PostgreSQL
Для MySQL
# gem install mysqlДля PostgreSQL
# gem install fastthread# gem install pg10. Ставим нужные версии гемов
# gem install -v=0.4.2 i18n# gem install -v=0.8.3 rake# gem install -v=1.0.1 rack11. Распаковываем 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.gz12. Настраиваем 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:adapter: mysql
database: redmine
host: localhost
username: redmine
password: changeme
encoding: utf8
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: changeme
encoding: utf8
schema_search_path: public
13. Создаем хранилище сессий rakeadapter: postgresql
database: redmine
host: localhost
username: redmine
password: changeme
encoding: utf8
schema_search_path: public
# rake generate_session_store14. Редактируем 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
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_data16. Переименовали dispatch.rb
# mv public/dispatch.rb.example public/dispatch.rb17. Добавляем пользователя redmine, от которого будет запускаться Thin
# /usr/sbin/useradd redmine18. Настроили права доступа для пользователя 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 install20. Создаем файл конфигурации Thin /etc/thin/redmine.yml
# vi /etc/thin/redmine.ymlpid: /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
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 добавилиserver unix:/tmp/redmine.0.sock;
}
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;
}
}
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 on24. Устанавливаем git
# yum install git25. Добавляем пользователя git для gitolite, включаем пользователя redmine в группу git
# /usr/sbin/useradd git# /usr/sbin/usermod -a -G git redmine26. Устанавливаем 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/hooks27. Создаем папку для репозитория gitolite даем права на нее пользователю и группе git.
# mkdir /var/gitrepo# chown git:git /var/gitrepo# chmod 755 /var/gitrepo28. НА ЛОКАЛЬНОЙ РАБОЧЕЙ СТАНЦИИ генерируем 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 master31. Создаем тестовый проект в 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/
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. Выглядит это так:
Из скрипта понятно, что в историю выводим последние 20 коммитов. Запуская скрипт из директории с репозиторием Git, создается xml-файл секции DocBook с таблицей коммитов под наименованием gitlog.xml. Осталось собрать книгу и вставить в нужное место нашу табличку.
Собираем книгу book.xml:
видно, что в книге есть вставки предисловия и трех глав. Собираем предисловие (preface.xml):
Обращаем внимание на вставку gitlog.xml. Ну и пример сгенерированной секции:
При печати документа в PDF будет получен вполне сносный результат:
В качестве стандарта для технической документации возьмем 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
Наиболе адекватный визуальный 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
после не забываем поменять UUID: VBoxManage internalcommands sethduuid C:\path\to\hd.vdi
суббота, марта 26, 2011
Собираем проект GWT 2.1.1+UIBinder+ Gxt-UIBinder 0.9 + Gxt 2.2.3 в IDEA
Эта заметка ориентирована на тех, кому хочется посмотреть на возможности связки GWT и ExtGWT с использованием UIBinder. Напомню, GWT это Google Web Toolkit, фреймворк, основная идея которого заключается в компиляции Java кода в оптимизированный клиентский Javascript, который будет исполняться на странице в браузере, формировать UI приложения и запросы к серверной стороне по протоколу GWT-RPC. Начиная со второй версии GWT из инкубатора вылез проект UIBinder - работа которого заключается в декларативном формировании дизайна UI - то есть не кодом, а разметкой. С UIBinder можно лаконичнее реализовывать обработчики событий, поскольку появились соответствующие аннотации. Это упростило работу с проектами, в которых имеет большое количество различных компоновок.
С другой стороны есть достаточно известные профессиональные библиотеки js-контролов ExtJS от sencha, среди которых предлагаются и интеграционные реализации с GWT - ExtGWT. Как обычно это бывает, костыль оказывается в отсутствии тесной интеграции - производители не поставляют варианты взаимодействия UIBinder и ExtGWT. Но нашелся умелец, который взялся за исправление ситуации и создал проект Gxt-UIBinder.
Попробуем с нуля создать GWT-проект в IDEA, подключить ExtGWT, Gxt-UIBinder и сделать простейшую компоновку.
Создаем GWT-проект в IDEA
1. File - New Project - Create Project from scratch
2. Назвали проект testextgwt
3. Указали что это Java модуль
4. Сказали сделать папку для сырцов
5. Выбрали фасет Google Web Toolkit. GWT SDK скачали именно версию2.1.1!!! С версией GWT 2.2.0 наша связка работать не будет!
6. Указали сделать пример с неймспейсом com.MySampleApplication
7. Запустили проект
8. Установили расширение GWT Developer Plugin к Google Chrome
9. Убедились что hello world, созданный средой работает
Далее подключаем ExtGWT
1. Идем на сайт http://www.sencha.com/, ExtGWT, Download Ext GWT 2.2.3. Распаковываем.
2. В нашем проекте в папке war создаем папку extgwt
3. Из папки /resource дистрибутива ExtGWT переносим все в папку /war/extgwt проекта
4. В основной html странице проекта testextgwt.html после подключения testextgwt.css подключаем стили extgwt <link rel="stylesheet" type="text/css" href="extgwt/css/gxt-all.css" />
5. В нашем проекте в папке war/WEB-INF создаем папку lib
6. Переносим файл gxt-2.2.3-gwt22.jar из корня дистрибутива ExtGWT в папку /war/WEB-INF/lib
7. В IDEA идем в меню File - Project Structure - Libraries. Там видим запись gwt-user.
8. Нажимаем кнопку "+" для добавления новых библиотек. Создаем с именем gxt.
9. Нажимаем кнопку "Attach Classes", выбираем web/WEB-INF/lib/gxt-2.2.3-gwt22.jar
10. В файле testextgwt.gwt.xml в секцию module после строки <inherits name='com.google.gwt.user.User'/> добавили строку <inherits name='com.extjs.gxt.ui.GXT'/>
Подключаем Gxt-UIBinder
1. Идем на http://code.google.com/p/gxt-uibinder/, скачиваем gxt-uibinder-0.9.jar
2. Положили библиотеку в war/WEB-INF/lib
3. Идем на http://code.google.com/p/gwt-customuibinder/, скачиваем gwt-customuibinder-0.1.jar
4. Положили библиотеку в war/WEB-INF/lib
5. Добавляем эти библиотеки в проект IDEA: идем меню File - Project Structure - Libraries. Ранее созданная gxt. Нажимаем кнопку "Attach Classes", выбираем web/WEB-INF/lib/xt-uibinder-0.9.jar и web/WEB-INF/lib/gwt-customuibinder-0.1.jar
6. В файле testextgwt.gwt.xml в секцию module после строки <inherits name='com.extjs.gxt.ui.GXT'/> добавили строку <inherits name="com.jhickman.web.gwt.gxtuibinder.GxtUiBinder" />
Декларируем компоновку MyDockLayoutPanel.ui.xml в com.mySampleApplication.client
Помещаем реализацию панельки с контролами MyDockLayoutPanel.java в com.mySampleApplication.client
Реализуем EntryPoint.onModuleLoad() в mySampleApplication.java из com.mySampleApplication.client
Все. Что мы должны увидеть - кучу панелек, на центральной две кнопки - одна родная GWT, другая от ExtGWT. Как видно все по полочкам - представление отдельно, логика отдельно. Благодаря аннатациям UIBinder код вполне лаконичен.
PS: закончил писать заметку - вышла новыя версия gwt-customuibinder-0.2.jar, которая должна быть совместима с GWT 2.2.0. Пробуйте.
С другой стороны есть достаточно известные профессиональные библиотеки js-контролов ExtJS от sencha, среди которых предлагаются и интеграционные реализации с GWT - ExtGWT. Как обычно это бывает, костыль оказывается в отсутствии тесной интеграции - производители не поставляют варианты взаимодействия UIBinder и ExtGWT. Но нашелся умелец, который взялся за исправление ситуации и создал проект Gxt-UIBinder.
Попробуем с нуля создать GWT-проект в IDEA, подключить ExtGWT, Gxt-UIBinder и сделать простейшую компоновку.
Создаем GWT-проект в IDEA
1. File - New Project - Create Project from scratch
2. Назвали проект testextgwt
3. Указали что это Java модуль
4. Сказали сделать папку для сырцов
5. Выбрали фасет Google Web Toolkit. GWT SDK скачали именно версию2.1.1!!! С версией GWT 2.2.0 наша связка работать не будет!
6. Указали сделать пример с неймспейсом com.MySampleApplication
7. Запустили проект
8. Установили расширение GWT Developer Plugin к Google Chrome
9. Убедились что hello world, созданный средой работает
Далее подключаем ExtGWT
1. Идем на сайт http://www.sencha.com/, ExtGWT, Download Ext GWT 2.2.3. Распаковываем.
2. В нашем проекте в папке war создаем папку extgwt
3. Из папки /resource дистрибутива ExtGWT переносим все в папку /war/extgwt проекта
4. В основной html странице проекта testextgwt.html после подключения testextgwt.css подключаем стили extgwt <link rel="stylesheet" type="text/css" href="extgwt/css/gxt-all.css" />
5. В нашем проекте в папке war/WEB-INF создаем папку lib
6. Переносим файл gxt-2.2.3-gwt22.jar из корня дистрибутива ExtGWT в папку /war/WEB-INF/lib
7. В IDEA идем в меню File - Project Structure - Libraries. Там видим запись gwt-user.
8. Нажимаем кнопку "+" для добавления новых библиотек. Создаем с именем gxt.
9. Нажимаем кнопку "Attach Classes", выбираем web/WEB-INF/lib/gxt-2.2.3-gwt22.jar
10. В файле testextgwt.gwt.xml в секцию module после строки <inherits name='com.google.gwt.user.User'/> добавили строку <inherits name='com.extjs.gxt.ui.GXT'/>
Подключаем Gxt-UIBinder
1. Идем на http://code.google.com/p/gxt-uibinder/, скачиваем gxt-uibinder-0.9.jar
2. Положили библиотеку в war/WEB-INF/lib
3. Идем на http://code.google.com/p/gwt-customuibinder/, скачиваем gwt-customuibinder-0.1.jar
4. Положили библиотеку в war/WEB-INF/lib
5. Добавляем эти библиотеки в проект IDEA: идем меню File - Project Structure - Libraries. Ранее созданная gxt. Нажимаем кнопку "Attach Classes", выбираем web/WEB-INF/lib/xt-uibinder-0.9.jar и web/WEB-INF/lib/gwt-customuibinder-0.1.jar
6. В файле testextgwt.gwt.xml в секцию module после строки <inherits name='com.extjs.gxt.ui.GXT'/> добавили строку <inherits name="com.jhickman.web.gwt.gxtuibinder.GxtUiBinder" />
Декларируем компоновку MyDockLayoutPanel.ui.xml в com.mySampleApplication.client
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:gxt='urn:import:com.extjs.gxt.ui.client.widget.button'
>
<ui:style>
.eastPanel {
background-color: #F60;
}
.westPanel {
background-color: #EEE;
}
.northPanel {
background-color: #39F;
}
.southPanel {
background-color: #99C;
}
.centerPanel {
background-color: #FFC;
}
</ui:style>
<g:SplitLayoutPanel>
<g:north size='60' unit='EM'>
<g:FlowPanel styleName="{style.northPanel}">
<g:Label>This is the NORTH panel</g:Label>
</g:FlowPanel>
</g:north>
<g:west size='200' unit='EM'>
<g:FlowPanel styleName="{style.westPanel}">
<g:Label>This is the WEST panel</g:Label>
</g:FlowPanel>
</g:west>
<g:center>
<g:FlowPanel styleName="{style.centerPanel}">
<g:Label>This is the CENTER panel</g:Label>
<g:HTMLPanel>
GWT Button: <g:Button ui:field="button">button</g:Button>
ExtGWT Button: <gxt:Button text="submit" ui:field="extbtn" />
</g:HTMLPanel>
</g:FlowPanel>
</g:center>
<g:east size='200' unit='EM'>
<g:FlowPanel styleName="{style.eastPanel}">
<g:Label>This is the EAST panel</g:Label>
</g:FlowPanel>
</g:east>
<g:south size="60" unit='EM'>
<g:FlowPanel styleName="{style.southPanel}">
<g:Label>This is the SOUTH panel</g:Label>
</g:FlowPanel>
</g:south>
</g:SplitLayoutPanel>
</ui:UiBinder>
Помещаем реализацию панельки с контролами MyDockLayoutPanel.java в com.mySampleApplication.client
package com.mySampleApplication.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.jhickman.web.gwt.gxtuibinder.client.GxtEvent;
import com.jhickman.web.gwt.gxtuibinder.client.GxtUiHandler;
public class MyDockLayoutPanel extends Composite {
interface MyDockLayoutPanelUiBinder extends UiBinder<DockLayoutPanel, MyDockLayoutPanel> {
}
private static MyDockLayoutPanelUiBinder ourUiBinder = GWT.create(MyDockLayoutPanelUiBinder.class);
public MyDockLayoutPanel() {
DockLayoutPanel rootElement = ourUiBinder.createAndBindUi(this);
initWidget(rootElement);
}
@UiField com.google.gwt.user.client.ui.Button button;
@UiHandler("button")
void handleBtnClick(ClickEvent e) {
Window.alert("Hello, AJAX");
}
@UiField com.extjs.gxt.ui.client.widget.button.Button extbtn;
@GxtUiHandler(uiField="extbtn", eventType= GxtEvent.Select)
public void submitForm(com.extjs.gxt.ui.client.event.ButtonEvent event) {
MySampleApplicationService.App.getInstance().getMessage("Hello, World!", new MyAsyncCallback(extbtn));
}
private static class MyAsyncCallback implements AsyncCallback<String> {
private com.extjs.gxt.ui.client.widget.button.Button btn;
public MyAsyncCallback(com.extjs.gxt.ui.client.widget.button.Button btn) {
this.btn = btn;
}
public void onSuccess(String result) {
btn.setText(result);
}
public void onFailure(Throwable throwable) {
btn.setText("Failed to receive answer from server!");
}
}
}
Реализуем EntryPoint.onModuleLoad() в mySampleApplication.java из com.mySampleApplication.client
public void onModuleLoad() {
RootLayoutPanel.get().add(new MyDockLayoutPanel());
}
Все. Что мы должны увидеть - кучу панелек, на центральной две кнопки - одна родная GWT, другая от ExtGWT. Как видно все по полочкам - представление отдельно, логика отдельно. Благодаря аннатациям UIBinder код вполне лаконичен.
PS: закончил писать заметку - вышла новыя версия gwt-customuibinder-0.2.jar, которая должна быть совместима с GWT 2.2.0. Пробуйте.
IDEA + Jetty plugin +Jetty 7: java.net.BindException: Address already in use
При использовании Jetty plugin в IDEA с Jetty 6 в конфигурации контейнера сервлетов обязательно указывается использование jetty.xml из /etc дистрибутива. Судя по всему в Jetty 7 стандартная конфигурация запускается по умолчанию и поэтому указание ее использования в IDEA черевато попыткой второго запуска контейнера сервлетов. Таким образом для Jetty 7 нужно убирать галку напротив jetty.xml, иначе получите стандартный java.net.BindException: Address already in use. Делайте как на картинках для каждой версии.
понедельник, февраля 14, 2011
CentOS 5.5+Nginx+Jetty
Используем CentOS 5.5 как сервер, Nginx как фронтенд-reverse-proxy, пересылающий запросы в jetty. Настройка с самого нуля.
1. Ставим CentOS 5.5 как сервер. Без ГУИ. Не забыли yum update.
2. Открываем в SELinux http(s):
[user@localhost ~]# system-config-securitylevel-tui
там Security Level: Enabled, лезем в Customize и открываем порты WWW, Secure WWW.
3. Устанавливаем и настраиваем nginx:
a) Добавляем репозиторий Yum CentALT:
[user@localhost ~]# cat > /etc/yum.repo.d/centalt.repo
[CentALT]
name=CentALT Packages for Enterprise Linux 5 - $basearch
baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
enabled=1
gpgcheck=0
b) [user@localhost ~]# yum install nginx
c) Проверили что nginx работает
[user@localhost ~]# services nginx start
[user@localhost ~]# telnet localhost 80
d) Добавили nginx в автозагрузку:
[user@localhost ~]# chkconfig --levels 235 nginx on
4. Устанавливаем Oracle Java 1.6:
a) Скачали java
[user@localhost ~]# wget ссылка_на_нужную_версию_jdk_или_jre_RPM!_c_http://www.oracle.com/technetwork/java/javase/downloads/index.html
b) Установили [user@localhost ~]# sh jdk-6u24-linux-*-rpm.bin
c) Если ранее был openjdk, альтернативим
[user@localhost ~]# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_24/jre/bin/java 100
[user@localhost ~]# alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_24/jre/bin/javac 100
[user@localhost ~]# alternatives --config java
[user@localhost ~]# alternatives --config javac
5. Устанавливаем Jetty 7:
a) Скачали jetty
[user@localhost ~]# wget http://download.eclipse.org/jetty/stable-7/dist/jetty-distribution-7.3.0.v20110203.tar.gz
b) Распаковали в /opt (по умолчанию все должно быть в /opt/jetty)
[user@localhost ~]# tar -xvzf jetty-distribution-7.3.0.v20110203.tar.gz -C /opt
c) Переименовали папку opt/jetty-distribution-7.3.0.v20110203 в opt/jetty
[user@localhost ~]# mv /opt/jetty-distribution-7.3.0.v20110203/ /opt/jetty
d) Скопировали в /etc/init.d скрипт jetty.sh
[user@localhost ~]# cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
e) Запустили сервис
[user@localhost ~]# service jetty start
f) Проверили что все работает
telnet localhost 8080
g) Добавили jetty в автозагрузку:
[user@localhost ~]# chkconfig --levels 235 jetty on
6. Настраиваем nginx как прокси для jetty
a) Редактируем конфиг ngnix
[user@localhost ~]# vi /etc/nginx/nginx.conf
Делаем чтобы выглядело так
server {
listen 80;
server_name mydomain.com www.mydomain.com;
access_log /var/log/nginx_67_log main;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
b) Перезапускаем nginx, проверяем
service nginx restart
telnet localhost 80
7. Настраиваем правильное использование X-Forwarded-For в Jetty
a) [user@localhost ~]# vi /opt/jetty/etc/jetty.conf
b) В секцию addConnector добавили forwarded
<call name="addConnector">
<arg>
<new class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<set name="host"><property name="jetty.host" /></Set>
<set name="port"><property name="jetty.port" default="8080"/></Set>
<set name="maxIdleTime">300000</Set>
<set name="Acceptors">2</Set>
<set name="statsOn">false</Set>
<set name="confidentialPort">8443</Set>
<set name="lowResourcesConnections">20000</Set>
<set name="lowResourcesMaxIdleTime">5000</Set>
<!-- добавили forwarded! -->
<set name="forwarded">true</Set>
</New>
</Arg>
</Call>
c) Рестартанули jetty
[user@localhost ~]# service jetty restart
Материалы:
http://vexell.ru/2011/01/%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-nginx-%D0%BD%D0%B0-centos-5/
http://easylinux.ru/node/289
http://stackoverflow.com/questions/266931/how-to-configure-nginx-to-work-with-jetty6-webserver
1. Ставим CentOS 5.5 как сервер. Без ГУИ. Не забыли yum update.
2. Открываем в SELinux http(s):
[user@localhost ~]# system-config-securitylevel-tui
там Security Level: Enabled, лезем в Customize и открываем порты WWW, Secure WWW.
3. Устанавливаем и настраиваем nginx:
a) Добавляем репозиторий Yum CentALT:
[user@localhost ~]# cat > /etc/yum.repo.d/centalt.repo
[CentALT]
name=CentALT Packages for Enterprise Linux 5 - $basearch
baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
enabled=1
gpgcheck=0
b) [user@localhost ~]# yum install nginx
c) Проверили что nginx работает
[user@localhost ~]# services nginx start
[user@localhost ~]# telnet localhost 80
d) Добавили nginx в автозагрузку:
[user@localhost ~]# chkconfig --levels 235 nginx on
4. Устанавливаем Oracle Java 1.6:
a) Скачали java
[user@localhost ~]# wget ссылка_на_нужную_версию_jdk_или_jre_RPM!_c_http://www.oracle.com/technetwork/java/javase/downloads/index.html
b) Установили [user@localhost ~]# sh jdk-6u24-linux-*-rpm.bin
c) Если ранее был openjdk, альтернативим
[user@localhost ~]# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_24/jre/bin/java 100
[user@localhost ~]# alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_24/jre/bin/javac 100
[user@localhost ~]# alternatives --config java
[user@localhost ~]# alternatives --config javac
5. Устанавливаем Jetty 7:
a) Скачали jetty
[user@localhost ~]# wget http://download.eclipse.org/jetty/stable-7/dist/jetty-distribution-7.3.0.v20110203.tar.gz
b) Распаковали в /opt (по умолчанию все должно быть в /opt/jetty)
[user@localhost ~]# tar -xvzf jetty-distribution-7.3.0.v20110203.tar.gz -C /opt
c) Переименовали папку opt/jetty-distribution-7.3.0.v20110203 в opt/jetty
[user@localhost ~]# mv /opt/jetty-distribution-7.3.0.v20110203/ /opt/jetty
d) Скопировали в /etc/init.d скрипт jetty.sh
[user@localhost ~]# cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
e) Запустили сервис
[user@localhost ~]# service jetty start
f) Проверили что все работает
telnet localhost 8080
g) Добавили jetty в автозагрузку:
[user@localhost ~]# chkconfig --levels 235 jetty on
6. Настраиваем nginx как прокси для jetty
a) Редактируем конфиг ngnix
[user@localhost ~]# vi /etc/nginx/nginx.conf
Делаем чтобы выглядело так
server {
listen 80;
server_name mydomain.com www.mydomain.com;
access_log /var/log/nginx_67_log main;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
b) Перезапускаем nginx, проверяем
service nginx restart
telnet localhost 80
7. Настраиваем правильное использование X-Forwarded-For в Jetty
a) [user@localhost ~]# vi /opt/jetty/etc/jetty.conf
b) В секцию addConnector добавили forwarded
<call name="addConnector">
<arg>
<new class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<set name="host"><property name="jetty.host" /></Set>
<set name="port"><property name="jetty.port" default="8080"/></Set>
<set name="maxIdleTime">300000</Set>
<set name="Acceptors">2</Set>
<set name="statsOn">false</Set>
<set name="confidentialPort">8443</Set>
<set name="lowResourcesConnections">20000</Set>
<set name="lowResourcesMaxIdleTime">5000</Set>
<!-- добавили forwarded! -->
<set name="forwarded">true</Set>
</New>
</Arg>
</Call>
c) Рестартанули jetty
[user@localhost ~]# service jetty restart
Материалы:
http://vexell.ru/2011/01/%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-nginx-%D0%BD%D0%B0-centos-5/
http://easylinux.ru/node/289
http://stackoverflow.com/questions/266931/how-to-configure-nginx-to-work-with-jetty6-webserver
Подписаться на:
Сообщения (Atom)
Мой список блогов
-
-
Notes on LLMapгод назад
-
Строительноегод назад
-
Будем честными ...год назад
-
Highscalability is Up For Sale2 года назад
-
-
-
-
-
Go Composition vs Inheritance6 лет назад
-
Welcome, Prashanth!6 лет назад
-
Top Developer Collaboration Tools6 лет назад
-
Транспортный микс7 лет назад
-
-
Исповедь скрам тестера7 лет назад
-
-
Running JRuby on the Graal JIT7 лет назад
-
-
-
Скрепкус гигантус8 лет назад
-
Мои твиты8 лет назад
-
-
-
6990 рублей9 лет назад
-
-
Смирение и американские боеголовки9 лет назад
-
-
-
-
-
-
Measuring Activity Startup Time10 лет назад
-
-
-
-
-
Рассказ жителя Мариуполя из первых рук12 лет назад
-
-
Grails - Convention over Configuration12 лет назад
-
$ (dollar) prefix for angularJS12 лет назад
-
-
-
-
Блог закрыт!12 лет назад
-
-
Websphere portal. Create pages programmatically13 лет назад
-
-
-
Tweetbot для Mac13 лет назад
-
Scala-IO Core: Unmanaged Resources13 лет назад
-
Использование шрифтов в JasperReports13 лет назад
-
Аудит менеджмента качества13 лет назад
-
-
Windows 8 Camp14 лет назад
-
-
-
Переезд14 лет назад
-
CSP15 лет назад
-
-
Графоманам15 лет назад
-
ListView Multiple Selection 215 лет назад
-
-
-
UnitOfWork & IdentityMap17 лет назад
-
-
-
-
-
-
-
-
-



