2012年12月22日土曜日

Ext JS4でコンボボックスのローディングマスクが止まらない

ExtJSのコンボボックスで、ローディングマスクが出っぱなしで選択できないという現象が出ちゃって困ってました。
よくある県のコンボボックスを選んだら市のコンボボックスの内容が変わるみたいなアレです。
この2番目のコンボボックスで問題は起きました。
色々頑張ったけど解決せず。
そしてExtJSのフォーラムでそれらしいのを発見
ビンゴでした。

オチとしては ExtJS4.1を使いなさいと。
そもそもなんで4.0.7を使ったんだろ…

Ext JS Community Forums 4.x / Ext: Q&A / Problem with a never ending loading mask

Ext JS + jax-rs (jerseyでちょっとハマり)

Ext JS + jax-rsってのをやってます。

いいですね。コレ。
やりたいことはだいたい出来ます。いままでExt JSをやらなかったことをちょっと後悔。
jax-rsはjersey使ってます。

Spring + myBatis + jersey ( + struts2) という構成。


そんなJerseyで軽くハマりまして。
いつもの様にまずはググって出てきたサイトを参考にしながら作ってみたんだけど、JSONをPOJOにマッピングするのってが動かない。
色々調べたら、サーブレットのinit-paramに、↓↓こんなの↓↓


 com.sun.jersey.api.json.POJOMappingFeature
 true

が要ると。
Jerseyのドキュメントにモロに書いてありますね。
ちゃんと読みましょう。


Jerseyの黄色いジャージって、ランス・アームストロングマイヨジョーヌのイメージなんだろうなって思うのですが、剥奪されちゃってアレですね。
でもグレッグ・レモンもツール連勝のアメリカ人レジェンドなのよん。

2012年11月17日土曜日

もろもろの認証をLDAPにする with OpenDJ

Apacheの基本認証(Subversion用)とredmineとjenkinsの認証をLDAPにする。
他にも増えそうだし、バラで管理するのは面倒なので。
LDAPサーバはOpenDJを選択。
以前OpenAM(OpenSSO)をいじったことがあって、あれはOpenDJ(OpenDS)がセットなので何となく慣れがあるような気がしたが、気がしただけだった。

1. OpenDJのインストール

  • OpenDJをgetしてunzip
# wget http://download.forgerock.org/downloads/opendj/2.5.0-Xpress1/OpenDJ-2.5.0-Xpress1.zip
# unzip OpenDJ-2.5.0-Xpress1.zip
  • 出来たディレクトリに移動してセットアップ
# ./setup --cli (← CUIでのセットアップはこのオプション)
  • 初期ルートユーザー DN
  • パスワード
  • 自己署名証明書の生成に使用される完全修飾ホスト名または IP アドレス
  • ポート(デフォルト:389)
  • 管理コネクタのポート(デフォルト:4444)
  • ベースDN
  • SSLを有効にするかどうか
  • LDAPSのポート
  • Start TLSを有効にするかどうか
  • 証明書サーバーのオプション:
を答えて出来上がり。
  • OS起動時に起動されるように設定
# /openDJをインストールしたディレクトリ/bin/create-rc-script --outputfile /etc/init.d/opendj
# chkconfig opendj on

2. LDAPにユーザ登録

  • WindowsにOpenDJをインストール(展開しただけ)して、コントロールパネルを使って登録。
  • LDAP検索用ユーザも作る
  • jenkinsの管理者ユーザも作る

3. Apacheの基本認証(Subversion用)

  • こんな感じ。
AuthType Basic
AuthName "なんか名前"
AuthBasicProvider ldap
AuthzLDAPAuthoritative off  #ldapがダメでもほかの認証に行かない
AuthLDAPURL ldap://hostname/ou=people,dc=foo,dc=bar?uid
AuthLDAPBindDN "cn=LDAP,ou=people,dc=foo,dc=bar"
AuthLDAPBindPassword "yourpassword"
Require valid-user

4. redmineのLDAP認証設定

  • 管理ユーザでログインして、設定 > LDAP認証 で "新しい認証方式”を登録。設定例は↓↓↓こんな感じ。
名称:ONE STEP BEYOND
ホスト:hostname
ポート:389
アカウント:cn=LDAP,ou=people,dc=foo,dc=bar
パスワード:*********
検索範囲:ou=people,dc=foo,dc=bar
LDAPフィルタ:
ログイン:uid
名前:givenName
苗字:sn
メールアドレス:mail
  • LDAP認証したいユーザの”認証方式”をLDAP認証で作ったものに変更。

5. jenkinsのLDAP認証設定

  • 管理ユーザでログインする。
  •  jenkinsの管理 > システムの設定 で アクセス制御-ユーザ情報のラジオボタンで"LDAP"を選択。
  • ”高度な設定”ボタンを押して、LDAPの情報を登録。
サーバー:hostname
root DN:dc=foo,dc=bar
未指定を許可(チェックボックス):チェックしない
User search base:oc=people
User search filter:uid={0}
Group search base:
管理者のDN:cn=LDAP検索ユーザ,ou=people,dc=foo,dc=bar
管理者のパスワード:*********
  • jenkinsはユーザごとに認証方式を選択できないので、設定を登録したらログアウトしないで別のブラウザでログイン可能かどうか確認する。

6.pam

sshでしか入らないので、OSの認証ってsuぐらいしか使わない。ということはほぼ使わない。
というわけで今回はやめ。

2012年11月10日土曜日

redmine code reviewプラグインのインストール

code review プラグインを入れたので、とりあえず書いておく。


redmine2.0.4にbacklogs0.9.26が入っている状態からインストール
まず、redmine_code_review0.6.0はredmine2.1が要るので入りません。0.5.0を入れます。
  • redmine_code_review-0.5.0をget
# wget https://bitbucket.org/haru_iida/redmine_code_review/downloads/redmine_code_review-0.5.0.zip
  • pluginsディレクトリに展開
  • bundle install
# bundle install --without development test postgresql sqlite
You cannot specify the same gem twice with different version requirements. You specified: simplecov (~> 0.6) and simplecov (>= 0)
と言われる。
redmine_backlogsのGemfileには "~> 0.6"が指定されているが、redmine_code_reviewの方はされていない。
redmine_code_review/Gemfileも
gem "simplecov", "~>0.6"
に書き換えてやりなおし。
  • マイグレート
# RAILS_ENV=production rake db:migrate_plugins 
  • オーナーをapacheに
# chown -R apache:apache redmineのインストールディレクトリ

なんかするたびにchownするのも忘れそうなので、apacheにsu出来るようにしようかな。
そもそもapacheとかmysqlの設定が/etcあたりにあったりするLinuxのデフォルト設定がいまだに違和感のあるSunOS/Solaris育ち。でもLinuxに慣れた人に触ってもらう事を考えるとあまりいじらない方がいいのかなと…

インストール作業はこれで終了。 

2012年11月9日金曜日

redmineとjenkinsの仕込み #4(SSL化編)


#3の続き。
redmineとjenkinsのSSL化


18. mod_sslのインストール

  • rootになる
  • mod_sslをインストール
#yum -y install mod_ssl

19. オレオレ証明書を作る 

  • 証明書の有効期限を長くする
/etc/pki/tls/certs/Makefileに "-days 365" ってのが3カ所あるので書き換える
  • 証明書を作る 
# make server.crt
umask 77 ; \
        /usr/bin/openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus
................+++
...................+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
umask 77 ; \
        /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 3650 -out server.crt -set_serial 0
Enter pass phrase for server.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) [XX]:JP
State or Province Name (full name) []:Aichi
Locality Name (eg, city) [Default City]:Nagoya
Organization Name (eg, company) [Default Company Ltd]:ONE STEP BEYOND
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ホスト名
Email Address []:メールアドレス
  • apache起動時にパスワードを要求されないようにサーバー用秘密鍵からパスワード削除
# openssl rsa -in server.key -out server.key

20. apacheの設定 

  • ssl用のDocumentRootを作る
/var/www/secure としてみた
# mkdir /var/www/secure
  • redmineのシンボリックリンクこっちに張る
# ln -s /usr/local/redmine-2.0.4/public /var/www/secure/redmine
  • 元のシンボリックリンクを消す 
# rm /var/www/html/redmine
  • 設定ファイル /etc/httpd/conf.d/ssl.conf はサンプルをベースに、以下の3カ所を編集
DocumentRoot "/var/www/secure/html"
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/certs/server.key
  • jenkinsの設定をSSLの方に引っ越す 
/etc/httpd/conf.d/ajp.confの中身を/etc/httpd/conf.d/ssl.confに引っ越し
/etc/httpd/conf.d/ajp.confを削除
  • オーナーをapacheに
# chown -R apache:apache /var/www/secure 
  • apche再起動
# /etc/init.d/httpd restart
  • EC2のSecurityGroupでHTTPSを開ける
  • httpsでアクセスできるかテスト
https://ホストですがな/redmine
  • /redmineと/jenkinsはhttpでアクセスがあったらhttpsに飛ばす設定にする
/etc/httpd/conf.d/rewire.conf を以下の内容で作成
<IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteLog "logs/rewrite_log"
      RewriteLogLevel 0
      RewriteCond %{SERVER_PORT} !^443$
      RewriteRule ^/redmine https://%{HTTP_HOST}/redmine [L,R]
      RewriteRule ^/jenkins https://%{HTTP_HOST}/jenkins [L,R]
</IfModule>
  • apache再起動
# /etc/init.d/httpd restart
  •  ちゃんとrewriteされるかをテスト
http://ホストですがな/redmine
http://ホストですがな/jenkins
でアクセスしたら
https://ホストですがな/redmine
https://ホストですがな/jenkins
になればOK。

redmineとjenkinsの仕込み #3(jenkins on glassfish編)

#2の続き。
jenkinsを仕込む。アプリケーションサーバはglassfishを使う。
glassfishを選択した理由は何となく。


11. JDK7を入れる

  • Linux x64のtarballをsunじゃなくてOracleのサイトからダウンロード、/usr/local に展開。
  • #ln -s /usr/local/jdk1.7.0_09 /usr/local/java (←いつもデフォルトのJAVA_HOMEをこれにしている)
  • JAVA_HOMEを /usr/local/java にする
  • PATHの先頭に $JAVA_HOME/bin を入れる

13. glassfish実行ユーザを作成する

rootで動かすのはちょっとね。
# adduser glassfish

14 .glassfishを入れる

  • multilingualインストーラーパッケージをget
#wget http://download.java.net/glassfish/3.1.2/release/glassfish-3.1.2-unix-ml.sh
  • CUIインストールのためにanswerファイルをあらかじめ作る
InstallHome.directory.INSTALL_HOME=/usr/local/glassfish-3.1.2
License.license.ACCEPT_LICENSE=0
RegistrationOptions.regoptions.CREATE_NEWACCT=CREATE_NEWACCT
RegistrationOptions.regoptions.DUMMY_PROP=
RegistrationOptions.regoptions.SKIP_REGISTRATION=SKIP_REGISTRATION
RegistrationOptions.regoptions.USERNAME=
RegistrationOptions.regoptions.USERPASSWORD=
RegistrationOptions.regoptions.USE_EXISTINGACCT=USE_EXISTINGACCT
SOAccountCreation.accountinfo.COMPANYNAME=
SOAccountCreation.accountinfo.COUNTRY=
SOAccountCreation.accountinfo.COUNTRY_DROP_DOWN=
SOAccountCreation.accountinfo.EMAIL=
SOAccountCreation.accountinfo.FIRSTNAME=
SOAccountCreation.accountinfo.LASTNAME=
SOAccountCreation.accountinfo.PASSWORD=
SOAccountCreation.accountinfo.REENTERPASSWORD=
glassfish.Administration.ADMIN_PASSWORD=管理者パスワード
glassfish.Administration.ADMIN_PORT=4848
glassfish.Administration.ADMIN_USER=管理者ユーザ名
glassfish.Administration.ANONYMOUS=ANONYMOUS
glassfish.Administration.LOGIN_MODE=true
glassfish.Administration.HTTP_PORT=8888
glassfish.Administration.NON_ANONYMOUS=NON_ANONYMOUS
updatetool.Configuration.ALLOW_UPDATE_CHECK=true
updatetool.Configuration.BOOTSTRAP_UPDATETOOL=true
updatetool.Configuration.PROXY_HOST=
updatetool.Configuration.PROXY_PORT=
  • インストーラー実行
# sh ./glassfish-3.1.2-unix-ml.sh -a answer -s
SETTING UP DOMAIN FOR SILENT INSTALL...
Executing /usr/local/glassfish-3.1.2/glassfish/bin/asadmin --user admin --passwordfile - create-domain --savelogin --checkports=false --adminport 4848 --instanceport 8080 --domainproperties=jms.port=7676:domain.jmxPort=8686:orb.listener.port=3700:http.ssl.port=8181:orb.ssl.port=3820:orb.mutualauth.port=3920 domain1
/usr/local/glassfish-3.1.2/glassfish/bin/asadmin --user admin --passwordfile - create-domain --savelogin --checkports=false --adminport 4848 --instanceport 8080 --domainproperties=jms.port=7676:domain.jmxPort=8686:orb.listener.port=3700:http.ssl.port=8181:orb.ssl.port=3820:orb.mutualauth.port=3920 domain1 Adminのポート4848を使用しています。
HTTP Instanceのポート8080を使用しています。
JMSのポート7676を使用しています。
IIOPのポート3700を使用しています。
HTTP_SSLのポート8181を使用しています。
IIOP_SSLのポート3820を使用しています。
IIOP_MUTUALAUTHのポート3920を使用しています。
JMX_ADMINのポート8686を使用しています。
OSGI_SHELLのデフォルト・ポート6666を使用しています。
JAVA_DEBUGGERのデフォルト・ポート9009を使用しています。
指定されたロケール[ja_JP]のファイルが[/usr/local/glassfish-3.1.2/glassfish/lib/templates/locales/ja_JP/index.html]に見つかりませんでした。デフォルト(en_US)のindex.htmlをかわりに使用します。
自己署名付きX.509サーバー証明書の識別名です:
[CN=ip-10-132-18-23.ap-northeast-1.compute.internal,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=California,C=US]
自己署名付きX.509サーバー証明書の識別名です:
[CN=ip-10-132-18-23.ap-northeast-1.compute.internal-instance,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=California,C=US]
ドメインの初期化子が見つかりません。カスタマイズの手順を省略します
ドメインdomain1が作成されました。
ドメインdomain1の管理ポートは4848です。
ドメインdomain1によって、パスワードなしでユーザー"admin"として管理ログインできます。
このドメイン[domain1]の管理ユーザー名[admin]
に関連するログイン情報が
[/root/.asadminpass]に正常に格納されました。
このファイルが保護されたままであることを確認します。
このファイルに格納された情報は、
このドメインを管理するためにasadminコマンドによって使用されます。
コマンドcreate-domainは正常に実行されました。
  • というわけで、ADMIN_USER,ADMIN_PASSWORD,HTTP_PORTとかがなんだか無視されてるみたいだ。「ドメインの初期化子が見つかりません。カスタマイズの手順を省略します」ってのがどうアレみたい。うーんまあいいや。
  • glassfishユーザのモノにする
# chown -R glassfish:glassfish /usr/local/glassfish-3.1.2
  • EC2のSecurity Groupで、4848を開ける。
    8080は空けないで、ajpを使ってapacheを通して公開することにする。(そうしなければならない理由もないけどね)
  • domain1を起動
glassfishユーザになる
.bashrcで/usr/local/glassfish-3.1.2/bin をPATHに追加
$ asadmin start-domain domain1
  • 管理コンソールをSSLにする
4848にアクセスすると
Secure Admin must be enabled to access the DAS remotely.
って言われる。リモートからの管理コンソール利用はenable-secure-admin を指定しないといけないと。
コンソールで以下のコマンドを実行する
# asadmin --host localhost --port 4848 enable-secure-admin
remote failure: 少なくとも1つの管理ユーザーに空のパスワードがありますが、セキュ リティ保護された管理では許可されません。change-admin-passwordコマンドまたは管理 コンソールを使用して、空でないパスワードを管理アカウントに作成してください。
って言われるので、
$ asadmin --host localhost --port 4848 change-admin-password
でパスワードを設定。そしてやり直し。
$ asadmin --host localhost --port 4848 enable-secure-admin
  • domain1 を再起動してアクセスの確認 
# asadmin restart-domain domain1
これで http://インストールしたホスト:4848 にアクセスすると https://インストールしたホスト:4848 にリダイレクトされるようになる。ログインできることを確認。 
  • rootに戻って起動スクリプトを作る /etc/init.d/glassfish-domain1
#!/bin/bash
#
# glassfish:          Startup script for Glassfish Application Server.
#
# chkconfig: 3 80 05
# description:      Startup script for domain1 of Glassfish Application Server.
GLASSFISH_HOME=/usr/local/glassfish-3.1.2
export GLASSFISH_HOME
JAVA_HOME=/usr/local/java
export JAVA_HOME
GLASSFISH_OWNER=glassfish
export GLASSFISH_OWNER
start() {
        echo -n "Starting Glassfish: "
        su $GLASSFISH_OWNER -c "$GLASSFISH_HOME/bin/asadmin start-domain domain1
> /dev/null 2>&1"
}
stop() {
        echo -n "Stopping Glassfish: "
        su $GLASSFISH_OWNER -c "$GLASSFISH_HOME/bin/asadmin stop-domain domain1
> /dev/null 2>&1"
}
restart() {
        echo -n "Stopping Glassfish: "
        su $GLASSFISH_OWNER -c "$GLASSFISH_HOME/bin/asadmin restart-domain domai
n1 > /dev/null 2>&1"
}
# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        *)
                echo $"Usage: glassfish {start|stop|restart}"
                exit
esac
  • OS起動時設定
# chkconfig glassfish-domain1 on

15. jenkinsをデプロイする

  • jenkins.warをhttp://jenkins-ci.org/ からgetする
  • glassfishの管理コンソールにログイン
https://ホストですがな:4848
  • jenkins.warを deployする

16. mod_proxy_ajpでapache連携するための設定

  • またglassfishユーザになって以下のコマンド
$ asadmin create-network-listener --listenerport 8009 --protocol http-listener-1 --jkenabled true jk-connector
  • rootに戻る 
  • /etd/httpd/conf.d/ajp.conf を作る
<Location /jenkins>
  ProxyPass ajp://localhost:8009/jenkins
</Location>
  • httpdを再起動
  • http://ホストですがな/jenkins にアクセスしてみる

17. Jenkinsのセキュリティを有効化

  • Jenkinsの管理 > ユーザーの管理 で管理者用ユーザを作る
  • Jenkinsの管理 > システムの設定 でセキュリティを有効にする
  • 『セキュリティの有効化』をチェック アクセス制御は『enkinsのユーザーデータベース』を選択 権限管理は『行列による権限設定』を選択
  • さっき作った管理者ユーザに権限を付与
  • 匿名ユーザから全権限を削除



今日はここまで。


2012年11月8日木曜日

redmineとjenkinsの仕込み #2(redmine編)

#1の続き。 redmine + backlogsをインストール。


6. ruby のインストール

  • まずyamlを入れる 
 # wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
展開してそのディレクトリへ移動
# configure
# make
# make install
  • ruby 1.9.3 のインストール
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p286.tar.gz
# configre
# make
# make install
  • bundlerのインストール
gem install bundler --no-rdoc --no-ri

7. mysqlセットアップ

  • /etc/my.cnf編集
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld]
datadir=/vol1/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# utf8
character-set-server=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
default-character-set=utf8
  • mysqldの起動とOS起動時設定
/etc/init.d/mysqld start
chkconfig mysqld on
  • 一応キャラクタセットを確認
# mysql -uroot
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
  • rootユーザのパスワード設定
mysql> use mysql;
mysql> update user set password=password('*******') where user='root';
mysql> delete from user where user='';
mysql> flush privileges;
  • redmineデータベース作成
mysql> create database redmine default character set utf8;
mysql> grant all on redmine.* to redmine@localhost identified by '*******';
mysql> flush privileges;
  • mysqlのCバインディングをインストール
# gem install mysql2

8. redmineのインストール

  • redmine2.0.4 をget
# wget http://rubyforge.org/frs/download.php/76444/redmine-2.0.4.tar.gz
  • /usr/localに展開
  • config/database.yml を作る
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: ********
  encoding: utf8
  • config/configuration.yml を作る
default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25
  • Gemパッケージのインストール
redmineインストールディレクトリで
#bundle install --without development test postgresql sqlite
  • Redmineの初期設定とデータベースのテーブル作成
redmineインストールディレクトリで
# rake generate_secret_token
# RAILS_ENV=production rake db:migrate
# RAILS_ENV=production rake redmine:load_default_data
  • Passengerのインストール
# gem install passenger --no-rdoc --no-ri
  • PassengerのApache用モジュールのインストール
# passenger-install-apache2-module

9.Apacheの設定

  • /etc/httpd/conf.d/passenger.conf を作成
RackBaseURI /redmine
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18
PassengerRuby /usr/local/bin/ruby
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerUseGlobalQueue on
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerSpawnMethod smart
RailsAppSpawnerIdleTime 86400
RailsFrameworkSpawnerIdleTime 0
  • redmineをドキュメントルートにシンボリックリンク(/redmineでアクセスできるように)
# ln -s redmineのインストールディレクトリ/public /apcheのドキュメントルート/redmine
  • apache上で動かすのでオーナーをapacheにする
# chown -R apache:apache redmineのインストールディレクトリ
  • apacheの設定チェックと再ロードとOS起動時設定
# /etc/init.d/httpd configtest
# /etc/init.d/httpd graceful
# chkconfig httpd on
  • http://仕込んだサーバ/redmie にアクセスして確認
  • adminのパスワードを変える
  • adminじゃない管理ユーザを作る
  • 作った管理ユーザでログインしてadminをロックする

10. backlogsを入れる

基本的にbacklogsサイトの手順に従えばOK。
  • backlogsをget
pluginsディレクトリで
# git clone git://github.com/backlogs/redmine_backlogs.git
# cd redmine_backlogs
# git tag (バージョンのリストを確認)
# git checkout v0.9.26 (最新をチェックアウト)
  • XML関係のライブラリをインストール
# yum install -y libxml2 libxml2-devel libxslt libxslt-devel
  • bundle install
# bundle install --without development test postgresql sqlite
You cannot specify the same gem twice with different version requirements. You specified: test-unit (>= 0) and test-unit (= 1.2.3)
と言われる。
redmine_backlogsのtest-unitは
gem "test-unit", "=1.2.3" if RUBY_VERSION >= "1.9"
となっていて、1.2.3を指定しているが、redmine本体の方のGemfileはそれがない。
本体の方のGemfileでも"=1.2.3"を指定するように書き換えて再実行。
  • holydaysをインストール
holidaysは1.0.3を入れてからじゃないと調子悪いらしい
# gem install holidays --version 1.0.3
# gem install holidays
  • 環境変数RAILS_ENVを設定しちゃう
export RAILS_ENV=production
  • マイグレート
# bundle exec rake db:migrate
  • おまじない
# bundle exec rake tmp:cache:clear
# bundle exec rake tmp:sessions:clear
  • インストール
# bundle exec rake redmine:backlogs:install
  •  オーナーをapacheに
# chown -R apache:apache redmineのインストールディレクトリ
  • httpdを再起動
# /etc/init.d/httpd restart 
  • redmineにアクセスしてbacklogsがインストールされていることを確認


今日はここまで。

Cockburnのユースケース実践ガイド

”ユースケース実践ガイド―効果的なユースケースの書き方”という本がある。
アリスター・コーバーン氏が書いたとてもイイ本。
僕がこの本を手にしたのはもう10年前になる。


つかみどころが無いユースケース。特に初めはどう書いたらいいか迷いまくって、うまく書けない。
この本はその『つかみどころ』を教えてくれる。この本に出合って、「ユースケースって使える」って思った。例もたくさん示されていてわかりやすい。
ユースケースをしっかりガッツリ書くやり方が示されている。実際の開発にあたっては、もうちょっと簡単に書くとしても、一度この本を読んでおいた方がいい感じに書けるはずだ。
ホントにいい本だと思う。

このブログのサイドバーに、Amazonのウィジェットがある。
このウィジェットにある本は全て僕が持っている本だから、自分では特に気にして見ないんだけど、たまたまこの”ユースケース実践ガイド”の値段が7,246円になっていたのに気づいた。定価は3,800円なので倍近い値段だ。
思わずクリックしてみたら、出品者からお求めいただけます。と来た。
なんとこの良書がもう絶版か? とても残念な事だ。

この本の価値は7,246円~という中古の値段が物語っている。
ユースケースで迷いとかある人は、高くてもこの本を入手することをお勧めする。


2012年11月7日水曜日

redmineとjenkinsの仕込み #1(土台編)

今のおオシゴトの為にEC2redminejenkinsを仕込んだので覚え書き。

1. EC2 Instanceを作る

  • Region:US West (Oregon) (Tokyo, N. Californiaよりちょっとお安いので。)
  • AMI:Amazon Linux AMI 2012.09 64bit
  • Instance Type: M1 Small(m1.small)
  • Security Group: 使うポートを開ける
  • Elastic IPを今作ったEC2インスタンスに割り当て
  • ホスト名を決めてDNSに登録

2. ユーザの設定

端末はteratermを使う。puttyはpemファイルを変換するとか面倒。同じ理由でSFTPはBitKinexを使う。
  • ec2-userでログイン(インスタンス生成の時に作ってダウンロードした鍵ファイル使用)
  • まずrootのパスワードを設定($ sudo passwd root)
  • rootになってec2-userのパスワードを変える(# passwd ec2-user)
  • 通常使うユーザを作る(仮にuser1とする)
  • teratermでuser1用にSSH鍵生成
  • 公開鍵をサーバへ転送(teratermのSCPを利用)
  • user1のホームに.sshディレクトリを作成
  • # cat ec2-userのホームに転送されている公開鍵ファイル » .ssh/authorized_keys
  • # chown -R user1:user1 .ssh
  • # chmod 600 .ssh/authorized_keys
  • # chmod 700 .ssh
  • # rm ec2-userのホームに転送されている公開鍵ファイル
  • 一旦出てuser1で入りなおしてみる
  • 無事入れたら.bashrcをお好みで編集 
  • またrootになる
  • timezoneをAsia/Tokyoにする
    # rm /etc/localtime; ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

3. sendmailはウザいのでpostfixにする

  • postfixとmailxをインストール
#  yum -y install postfix
#  yum -y install mailx
  • /etc/postfix/main.cfを編集
myhostname = FQDNでホスト名
mydomain = ドメイン
myorigin = $mydomain
mynetworks_style = host
  • /etc/aliasesを編集してnewaliases
  • sendmail停止
# /etc/init.d/sendmail stop
  • MTAを切り替える
# alternatives —config mta (←このコマンドで切り替える)
There are 2 programs which provide ‘mta’.

Selection    Command
———————————————————————-
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix
Enter to keep the current selection[+], or type selection number: 2 (←2のpostfixを選択)
  • postfixの起動とOS起動時の設定
# /etc/init.d/postfix start
# chkconfig postfix on
# chkconfig sendmail off
  • テスト
# mail 誰@何処

4. ルートパーティションの8Gだけだと足りなくなりそうなのでEBSボリュームを作ってマウント

  • EC2コンソールでEBSボリュームを一つ作成
  • EC2インスタンスにアタッチ
  • ファイルシステムを作る
 # yes | mkfs -t ext4 /dev/sdf
  • /etc/fstabを編集
# /dev/sdf    /vol1       ext4    defaults        1   2
  • /vol1をマウント

5. 色々要る物をインストール

# yum -y groupinstall "Development Tools"
# yum -y install openssl-devel readline-devel zlib-devel curl-devel
# yum -y install httpd httpd-devel
# yum -y install mysql-server mysql-devel
# yum -y install ImageMagick ImageMagick-devel
# yum -y install emacs
# yum -y install telnet


今日はここまで。

2012年9月9日日曜日

“高リスク制約を抜き出して、そこだけは、設計を十分に行え。そうでない部分は変更可能性を保ち、アジャイルに進めるべし、ただし、高リスク制約は思ったよりも多くないぞよ。となる。”


データモデリングが高リスク制約だとしたら(そうであることは少なくないと思う)、しっかりデータモデリングをして『確定』させるべきという事になる。ちなみに私はこのことが『アジャイル』と相反する事とは思えない。データモデルがアプリケーション(機能)の土台なり骨格であるのであれば、それはイテレーション0でやるって事でどうだろう。ここは意見が分かれる所かもしれないが。各機能の作りこみに先立って設計すべきことはデータモデル以外にもいろいろある。
データモデル全体が『高リスク』であるかどうかはそのシステムによって色々だろう。リスクの高い部分も低い部分もあるはず。また、他システムとの共有や連携、パフォーマンス上の問題などの『制約』もあるはず。そういう分類もしておく必要がある。
いずれにしてもデータモデルの『変更可能性』を完全に排除する事は難しい。
データモデルの変更による影響を素早く導き出せる事と、実際にその手戻り作業を素早く行えるという事を目指すべきではないかと思う。
アジャイルの「ライトウィング」と「レフトウィング」:An Agile Way のライトウィングである技術的なプラクティスを実践していないのであれば、それを実践するだけでも相当変わるだろう。
また、永続化層に何を使うかによっても、結構手数に違いが出るところだと思う。
アジャイルであろうがなかろうが、足枷を外す、または錘の重量を軽くする工夫を常に考えていけばいい。

2012年8月20日月曜日

“一方、必要な情報を関係者だけに伝送し、読んだかどうかを確認できず、情報共有した「アリバイ」だけを残せるメールは、日本の組織においてきわめて都合がよいというわけだ。「件名」を活用することで、グループウェアや掲示板に登録するようなこともまでメーリングリストに流しつつ、場合によっては、「送りましたよね」という履歴を確保しつつ、メーリングリストの本数を増やすことで関係者を思考停止に陥らせ、議題を決定事項としてしまう高度なテクニックもある。”


っていうか全部読んでいられない。
何度かこういう会話をした。
Kさん(仮名):読んでないの?
私:すいません。たぶん読んでないですね。
Kさん:メールはちゃんと読んでよ。
私:全部読んだら『生産的な』仕事する時間が無くなりますから。
Kさん:…。 
しかし『風通しを良くしすぎない日本型の情報共有ツール』なんて面倒な事考えたくない。
風通しが悪い状態はダメ。
日本型情報共有ツールをどうにかすることを考えるより、風通しが良い状態を作り出す事を考えないとおそらく何も変わらない。
変えたいと思っている人はそれなりに居ると思う。酒の席での文句は多いのだから。
そう思っている全員が、本気で動き出すと結構簡単に変われるのではないかとも思う。 
Source: ascii.jp

2012年5月1日火曜日

“SOAはSOAPのような標準を構成するテクノロジースタックからアーキテクチャ原則へと変化していると考えているようだ”


なんちゅうか、元々”アーキテクチャ原則”だったと思ってました。少なくとも私はそういう認識だった。だって”Service Oriented Architecture”ですから。
SOAPやらWS-*やらっていうその”テクノロジースタック”は、それを実現するためのものだと、そういう認識だったな。
”今やSOAという言葉にはマイナスのイメージがある”というのは、まあそうかなと思う。
ただし、『SOAP,WS-*はややこしくて使えないよ』という意見に関しては、そう思わない。だってややこしいことやりたくて存在してるものだと思うから。
Source: infoq.com

2012年4月29日日曜日

“技術的負債だらけのプロジェクトに「人員投入」して、多大なコストをかけ続けるでしょう。開発者が技術的負債が増えるのを軽減したり防ぐのに必要なスキルや習慣には投資しません。”

InfoQ: 2012年、アジャイルの雲行きは?予想を振り返る

これは、技術的負債がそこに存在するという事を認識できているかどうかって話だと思う。
受け入れる側、また、マネージャがそういう評価をすることができるか?という話。能力的にも政治的にも。
システムは作ってる時間よりも使ってる時間の方がはるかに長い。
『カットオーバー』は始まりであり、終わりではない。
技術的負債を返済するのは誰か?

Source: infoq.com

ドライアイでBABOK


右目の違和感みたいなのが気になっていて、やっと眼科に行ってきた。
ドライアイだそうだ。
今まで比較的健康だっただけに、ちょっと面倒だなって思ってしまう。
でもこの程度の事で済んでいるうちはラッキーだと思うことにする。
今更ながら、BABOK2の本を読んだりしている。 
ビジネスアナリストは、ステークホルダーがあらわした要望だけにとらわれず、新のニーズを引き出すことに責任を負う。
とある。
これは、個人としては結構前から意識していた事でした。そして、なかなか実践できていない事でもある。実際、ステークホルダーだけで要求を明確に正確に定義することは困難なことは少なくない。出来ないと思って最初から言わないことだってあるし、テクノロジーが新しい要求を導き出すことだってある。人間関係やその組織の空気感、その時の各担当者のモチベーションが大きく影響することだってある。
真のニーズ、『ホントはこうでしょ』ってのを引き出して、ちゃんと裏付けありで定義すること。これを強く意識したいと思う。
 ホントは今日一気に読み進めたかったんだけど、瞳を広げる目薬の影響で今日は目のダメージが…もう戻ったけどね。

2012年4月27日金曜日

ひと区切り


本日で、あるお仕事が終了。
プロジェクトは継続中なんだけど、私は離脱。
このお仕事では、なんとC言語のプログラムをちょっと書きました。
emacsでCを書くなんてのは随分とやってなかったけど、体が覚えてましたな。
ありがとうございました。

2012年4月20日金曜日

納得できそうでできない事


プロジェクトメンバーの平均的スキルに合わせた設計、開発手法を選択するという事。
まあ必然と言えば必然なんだけど、本当にそれでいいのかと思う。
エンジニアのスキルが不足していることによって、最良の選択ができないとした場合、その『最良』を選択できなかったことの不利益を被るのは最終的にユーザだ。
ちゃんと使える要求管理をするとか、モデル駆動とか、すべてが大きなハードルでもない。100歩譲って『今わからないからやらない』は受け入れるとしても、明日、半年後、一年後はわかるようになっていないとずっと同じことを繰り返すことになる。これは誰にとっても不幸なことだ。
プロジェクトはエンジニアの技術追求の場ではないので、妥協チックに折り合いをつけることはたくさんあって当然だと思う。
ただ、その時に、これが現時点のベストだと納得しながらも、ほんのりと悔しさみたいなモノを感じる、そういうマインドをマネージャもエンジニアも持ったらいいと思う。