2013年10月31日木曜日

mavenとtestngでJavaのテストコードをモダンに開発

■概要
rubyやpython, phpなどのスクリプト言語にあるパッケージ管理ツール「gem」「easy-install」「composer」などを使って
サーバサイド上で簡単にソースが書けちゃうってやつを頑張ってJavaでやるとこうなったというのを紹介します
頑張れば、できなくなないです。。。

■環境
CentOS 5.9 64bit
maven 3.1.0
Java 1.7.0_05
※Javaのインストールに関しては
http://kakakikikeke.blogspot.jp/2012/06/centosjenkinsjavatomcatantgit.html
※mavenのインストールに関しては
http://kakakikikeke.blogspot.jp/2013/10/maven.html

■開発
1. mvnプロジェクトを作成する
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.kakakikikeke.test -DartifactId=Sample_Test

2. testngをダウンロードする
vim pom.xml
<dependencies>...</dependencies>の間に以下を追記する
※記載したあ、とデフォルトで入っているJUnitのdependencyの記載を削除して大丈夫です
<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.3.1</version>
  <scope>test</scope>
</dependency>
mvn clean
mvn compile

すると以下のローカルのリポジトリにパスにjarファイルがダウンロードされます
/root/.m2/repository/org/testng/testng/6.3.1/
※mvn clean と mvn compile はやらなくても記載して保存した段階で勝手にmavenがダウンロードしてきてくれます

3. テストケースを書く(サンプル)
vim src/test/java/com/kakakikikeke/test/AppTest.java
package com.kakakikikeke.test;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;

public class AppTest {

  @BeforeTest
  public void beforeTest() {
    System.out.println("beforeTest");
  }

  @AfterTest
  public void afterTest() {
    System.out.println("beforeTest");
  }

  @Test
  public void TestCase1() {

  }
}
と記載したら

mvn clean
mvn test-compile
mvn test

でtestngのテストが実行されます
あとはTestCase1に肉付けして行ったり、TestCase2を作成したりすれば一応「mvn」コマンドだけでテストケースを書いて実行することができます


とここまで環境が整っていざ開発となると、実は正直かなりめんどくさかったです。。。
以下、具体的にいけてない感じた点です
  • ライブラリを追加するときにいちいち maven repository から必要なライブラリを見つけてそのXML情報をpom.xmlに記載する必要がある
  • maven repository の検索性能がイマイチで自分が必要としているライブラリがなかなか見つからない
  • 全然関係ないライブラリを追加していることがある
  • mvn clean から test までの流れを毎回やるのが正直めんどくさい(シェルを一つ書いて一回でできるようにするとか独自のgoalを作るとかはありますが)
  • やっぱりJavaはサジェストがエディタににないと厳しい(このへんは emacs とかでもなんとかなりますが、準備が大変。。。)
といった印象を受けました
最終的にはあきらめて「mvn eclipse:eclipse」とかでeclipse形式に吐き出してeclipseにインポートして開発するのが一番楽なのかなと思ってしまった次第です
本当に枠組みだけ作るのであれば紹介した手順だけでもいいのかなーと思いました

2013年10月30日水曜日

【Windows7】デスクトップに通知できるgrowlをインストール

■概要
growl(ぐろーる)はMac用に作られたデスクトップ通知アプリです
今回はWindows7版のgrowlをインストールして通知テストを実施したいと思います

■growlのインストール
http://www.growlforwindows.com/gfw/
のサイトからWindows版のgrowlをダウンロードします
2013/10/25段階での最新版は2.0.9でダウンロードリンクは以下にありました


インストール時は特に何も気にすることなくNextと押していけば大丈夫です
デフォルトの設定だと「C:\Program Files (x86)\Growl for Windows」にインストールされるようです

■基本設定
まず、growlを起動します
起動するとタスクトレイにgrowlのアイコンが出現するのでダブルクリックで設定ダイアログを表示します
・General → Automatically start Growl at login にチェックをする
とりあえず上記のみ設定しました

次に、コマンドプロンプトを立ちあげて以下のように実行します
cd C:\Program Files (x86)\Growl for Windows
growlnotify.exe aaa
growlは基本的にコマンドから実行して使います
上記を実行するとデスクトップ上に通知が表示されると思います

そして、growlのApplicationタブを選択すると先ほど実行したコマンドがアプリケーションとして追加されます
通知のデザイン等を変更できるのでお好みに合わせて変更してください(任意)

とりあえずインストールとテスト通知は以上です
アプリを自分で追加することで独自の通知をすることは可能ですが、すでにたくさんのアプリがあるので以下から取得することも可能です
http://www.growlforwindows.com/gfw/apps.aspx

時間があったら独自の通知アプリでも作ってみたいと思います

2013年10月29日火曜日

【Zabbix】net.tcp.serviceを使う際の注意事項

■環境
CentOS 6.3 64bit
Zabbix 2.0.3

■注意事項
net.tcp.serviceはポートの状態を確認することができるキーです
LISTEN可能な状態なら1が返ってきます

net.tcp.serviceは引数を3つ設定でき
  • 1つ目はプロトコル(ssh、service.ntp、ldap、smtp、ftp、http、pop、nntp、imap、tcpのいずれか1つを指定)
  • 2つ目はIPアドレス
  • 3つ目はポート番号
を指定するのですが、LISTENしているIPアドレスによって2つ目の引数の設定に注意してください

以下具体例です
  • ポート10052が127.0.0.1でLISTEN -> net.tcp.service[tcp,,10052]
  • ポート10052が0.0.0.0でLISTEN -> net.tcp.service[tcp,,10052]
  • ポート10052が192.168.1.10でLISTEN -> net.tcp.service[tcp,192.168.1.10,10052]

何も指定しないとデフォルト監視しに行くのIPアドレスは「127.0.0.1」となります
0.0.0.0でLISTENしている場合は127.0.0.1でもアクセスできるので何も指定しなくても大丈夫です
厄介なのが192.168.1.10(とかプライベートIP系)でLISTENしている場合で
IPアドレスを指定しないと127.0.0.1に聞きに行ってしまうのでうまく監視できません
なのでちゃんとIPを指定してあげないとずっと「0」が返ってきてしまいます

ブログ等の紹介はIPアドレスまでちゃんと指定しているケースが少ないので
ちゃんと引数が何を意味しているのかはちゃんと調べないとダメですね

■参考サイト

2013年10月28日月曜日

2013年10月27日日曜日

mavenコマンドの使い方(主にgoal)について調べたのでメモ

■環境
CentOS 5.9 64bit
maven 3.1.0
Java 1.7.0_05
mavenのインストール方法は以下を参照
http://kakakikikeke.blogspot.jp/2013/10/maven.html

■プロジェクトの作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app

通常のJavaプロジェクトを作成する場合のパラメータです
archetypeGroupIdは後述にもありますが、mavenで用意されたテンプレートみたいなものを設定します(独自で作成することも可能)
groupIdはいわゆるパッケージ名です
artifactIdはいわゆるプロジェクト名です

コマンド実行時に入力が必須の部分もあるので入力必須の項目のサンプルを以下に記載します
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 312:
  enter入力
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
  enter入力(1.1)
Define value for property 'version':  1.0-SNAPSHOT: :
  enter入力
確認
  Confirm properties configuration:
  groupId: com.mycompany.app
  artifactId: my-app
  version: 1.0-SNAPSHOT
  package: com.mycompany.app

■goal検証
maven自体にはgoalと呼ばるmvnコマンドに渡す引数がいろいろと用意されており
そのgoalの指定によりjarを作ってくれたりとかテストしてくれたりとか.classファイルを作ってくれたりとか振る舞いが変わってきます
基本はこのgoalの種類と動きがある程度わかっていればmvn自体は使えるようになると思います

またプラグインという概念があり、振る舞いをいろいろと変更、拡張できるのでメジャーなプラグインさえ覚えておけば大丈夫だと思います
プラグインは独自で作成することも可能です

ここで紹介するgoalやプラグインが全てではないので他のgoalについては以下のページなどを確認してください
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

以下で紹介するコマンドはプロジェクト配下のディレクトリ(今回だとmy-app)配下でpom.xmlがあるところで実行してください

・mvn compile
target/classes 配下にjavaコンパイルした.classファイルを作成してくれます

・mvn test-compile
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成してくれます

・mvn test
target/classes 配下にjavaコンパイルした.classファイルを作成し
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成し
target/surefire-reports 配下にテスト結果を作成してくれます
mavneデフォルトのテストツールは「JUnit」となっておりpom.xml内でdependencyが定義されています

・mvn package
target 配下にjarファイルを作成し
target/classes 配下にjavaコンパイルした.classファイルを作成し
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成し
target/mavne-archiver 配下にpom.properties(プロジェクトのメタ情報ファイル?要調査)を作成し
target/surefire-reports 配下にテスト結果を作成してくれます
「jar:jar」「compile」「test-compile」「test」等をまとめて実行してくれるgoalです
test結果に関してはSurefireプラグインというプラグインを使っているようでテスト結果を統計的に見れるファイルも作成してくるようです
http://maven.apache.org/surefire/maven-surefire-report-plugin/

・mvn clean
target ディレクトリを削除してくれます
「compile」「test-compile」「test」「package」等を実行する前には実行する必要があります

・mvn install
作成した成果物(jarファイル)をローカルのmavenリポジトリに配備してくれます
具体的なパスは例えばrootユーザで実行した場合は
/root/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/
配下にjarやxmlファイルを展開してくれます
他のプロジェクトが成果物を参照する必要がある場合に実施します

・mvn archetype:generate
指定できる主なオプションは以下があります
  • -DarchetypeGroupId・・・作成するプロジェクトの元となるarchetypeを入力します
  • -DgroupId・・・パッケージ名を入力します
  • -DartifactId・・・プロジェクト名を入力します
groupIdやartifactIdは任意の値を入力することができます
archetypeGroupIdに関してはMavenCentralで公開されているarchetypeGroupIdを指定しなければいけません
ただ量が膨大で覚えるのはほぼ不可能です
なので省略することもでき、省略した場合はプロジェクトを作成するときにどのarchetypeGroupIdを使用するか選択することができます
一覧がずっと出てきて番号を入力することでarchetypeGroupIdを選択することができます
ただ、この一覧もものすごい量が出てくるので選択するのが結構大変です

・mvn site
pom.xmlをもとにプロジェクトの情報をHTML形式に吐き出してくれます
現在使用しているプラグイン読み込んでいるjarファイルの一覧等が確認できます

・mvn idea:idea
InteliJ形式のフォルダ構成に変換してくれる
InteliJからインポートすればコマンドで作成したプロジェクトをInteliJ上で開発できます
my-app.iml, my-app.ipr, my-app.iwsを作成してくれます

・mvn eclipse:eclipse
上記のeclipse版
.classpath, .projectを作成してくれます

■プラグインに関して
主なプラグインについて紹介します
デフォルトの状態でもメジャーなプラグインはすぐに使える状態にあります

・mvn jar:jar
target 配下にjarファイルを作成してくれます
http://maven.apache.org/plugins/maven-jar-plugin/

・mvn war:war
target 配下にwarファイルを作成してくれます
http://maven.apache.org/plugins/maven-war-plugin/

今回の場合通常のJavaプロジェクトでWebアプリ用のプロジェクトではないので失敗すると思います
具体的にはweb.xmlの定義に失敗するのですが、冒頭のプロジェクト作成時の
archetypeGroupIdをwebアプリ用で指定してプロジェクトを作成するとwarファイルの作成もうまくいきます
サンプルは以下の通りです
mvn archetype:generate -DarchetypeGroupId=maven-archetype-webapp -DgroupId=com.mycompany.web.app -DartifactId=my-web-app

他のarchetypeGroupId関しては以下を参照してみてください
http://maven.apache.org/guides/introduction/introduction-to-archetypes.html

■所感
mavenリポジトリがグローバルにアクセスできないと使えないのでグローバルに接続できる環境は必須
プロキシ等の環境の場合、pom.xmlを修正しないといけない等、若干ハードルが高くなる

■参考

2013年10月26日土曜日

elasticsearchを試してみた

■環境
CentOS 5.9
Java 1.7.0_05
elasticsearch 0.90.5

■elasticsearchインストール
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.tar.gzs
tar xvzf elasticsearch-0.90.5.tar.gz
mv elasticsearch-0.90.5 /usr/local/
cd /usr/local/
ln -s elasticsearch-0.90.5/ elasticsearch

vim /root/.bashrc
export ELASTIC_SEARCH=/usr/local/elasticsearch
export PATH=$ELASTIC_SEARCH/bin:$PATH
source /root/.bashrc

elasticsearch -f
netstat -an | grep 9200
最終的に9200ポートでLISTENしていればインストールおよび起動は完了

■サンプル実行
1. サンプルデータの投入
curl -X POST http://localhost:9200/dictionary/name/1 -d '{"famiry_name":"kaka","first_name":"abc","email" :"sample@sample.email.com","age":20}'
curl -X POST http://localhost:9200/dictionary/name/2 -d '{"famiry_name":"kaka","first_name":"def","email" :"sample@sample.email.com","age":20}'
curl -X POST http://localhost:9200/dictionary/name/3 -d '{"famiry_name":"kaka","first_name":"ghi","email" :"sample@sample.email.com","age":20}'
curl -X POST http://localhost:9200/dictionary/name/4 -d '{"famiry_name":"kaka","first_name":"jkl","email" :"sample@sample.email.com","age":20}'
curl -X POST http://localhost:9200/dictionary/name/5 -d '{"famiry_name":"kaka","first_name":"mno","email" :"sample@sample.email.com","age":20}'
「/hoge/foo/n」のような感じでパスを自由に設定することができます
n の部分は数字を設定する必要があります
最後の数字の n 部分を変えてデータをPUTしないと同じデータをタダ上書きするだけなので注意が必要です

2. サンプルデータの取得(キーワード検索)
curl -X GET http://localhost:9200/dictionary/name/_search -d '{"query":{"match":{"famiry_name":"kaka"}},"size":10,"from":0}'
「/hoge/foo/_search」というパスにリクエストすることで検索することができます
今回はcurlコマンドなので-dでリクエストのbody部分を設定します
1. で登録した全てのデータが返ってくるはずです
sizeとfromはmysqlで言うところのlimitで範囲を指定して取得する場合などに使えます(デフォルトはsize:10, from:0のようです)
クエリの指定方法はたくさんありますので他のクエリの指定方法は以下を参考にしてみてください
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-uri-request.html

3. サンプルデータの取得(部分一致検索、正規表現検索)
curl -X GET http://localhost:9200/dictionary/name/_search -d '{"query":{"regexp":{"famiry_name":"ka.*"}},"size":10,"from":0}'
基本的な指定は2. と同様ですが「match」ではなく「regexp」を使用しております
使用できる正規表現は以下に詳しく記載があります
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html

今回は以上です
elasticsearchはすべてをREST-API経由で実行するツールとなっています
データの検索に特化しており、全文検索や位置検索もできるようになっています
また応用編ですがhadoopにも対応しているので簡単にスケールアウトできるようです(未調査)

次回はelasticsearch用のWeb UI「kibana」でも試してみたいと思います

■Tips
・登録したすべてのルートパス(indexes)を表示する方法
curl -X GET http://localhost:9200/_aliases
・不要なindexesを削除する方法(_riverというindexes配下のデータをすべて削除する)
curl -XDELETE 'http://localhost:9200/_river

■参考

2013年10月24日木曜日

shellでjsonをパースする方法(メモ)

■概要
https://github.com/dominictarr/JSON.sh
を使用した方法を紹介します

■環境
CentOS 5.9
bash 3.2.25
Linux kernel 2.6.18-238.el5 x86_64

■設定(インストール)
wget https://github.com/dominictarr/JSON.sh/archive/master.zip
unzip master.zip
mv JSON.sh-master/ /usr/local/
ln -s JSON.sh-master/ json_parse
cd /usr/sbin/
ln -s /usr/local/json_parse/JSON.sh json_parse

■動作確認
echo '{"key":"value","key2":"value2","key3":{"food":"potate"}}' | json_parse -b
["key"] "value"
["key2"]        "value2"
["key3","food"] "potate"

「-b」を指定すると入力したjson情報は出力しません

2013年10月21日月曜日

sshで多段プロキシする方法

■環境
Windows7 64bit
git bash version 1.8.3-preview20130601

■背景
  • WinSCPでsshプロキシが使えない環境だったので泣く泣くscpコマンドで対応する
  • git bashはデフォルトでsshコマンドが使えるのでgit bashで代用した
  • ※Linux上のsshでも同様の設定で対応可能

■設定
1. git bashを立ち上げる
2. cd
3. vim .ssh/config
4. 以下を記載する
Host host001
  User root
  Hostname 192.168.1.100
  IdentityFile ~/.ssh/host001_key.pem
  ProxyCommand ssh hostproxy001 nc %h %p
Host hostproxy001
  User root
  Hostname 192.168.1.10
  IdentityFile ~/.ssh/hostproxy001_key.pem
  ProxyCommand ssh hostgate nc %h %p
Host hostgate
  User kakakikikeke
  Port 1022
  Hostname 192.168.1.200
上記の設定で「ssh host001」と実行すると
  • 「hostgate」にユーザ「kakakikikeke」でポート「1022」を使ってパスワード認証をし次にhostgateから
  • 「hostproxy001」にユーザ「root」で公開鍵をを使ったパスフレーズ認証をしhostproxy001から
  • 「host001」にユーザ「root」で公開鍵を使ったパスフレーズ認証を行う
なので合計3回のパスワードを聞かれることになる

~/.ssh/host001_key.pemと~/.ssh/hostproxy001_key.pemの公開鍵はgit bashを実行するWindows上にある必要があり
デフォルトだと「C:\Users\[user_name]\.ssh」がconfigファイルを保存するパスになっている様子
git bash上でcdコマンドを実行すると上記のカレントに移動することができる

同じ経路でsshしたいホストを増やしたい場合はhost001と同様の記載でIPの部分を変更すれば他のホストにもsshログインできるようになる

また、この状態で「scp host001:/var/tmp/test.txt .」を実行することでリモートからコマンド一発でファイルを転送することができる
(パスワードを3回入力する必要あり)

2013年10月18日金曜日

Jekyll でカテゴリを設定する方法

例えばある_post配下の記事(test.md)に対してカテゴリを設定したい場合は

vim _post/test.md

---
layout: post
title: テスト記事
date: 2013-10-15
category: sample
---

・・・以下、markdownが続く

とmarkdownファイルの冒頭に追記することで「jekyll build」を実行すると

_site/sample/2013-10-15/test/index.html

といった感じでcategory用のフォルダを自動的に作成してくれます

_config.ymlファイルは以下のような設定にしておきます

permalink: /:categories/:year-:month-:day/:title

たぶんこれでできると思います

2013年10月16日水曜日

Jenkins経由でjekyll buildを実行すると「invalid byte sequence in US-ASCII」

ジョブにシェルの実行を一個追加して jekyll コマンドを実行する前に

export LANG=ja_JP.UTF-8

を追加すれば解決した
需要はないだろうが備忘録として

2013年10月15日火曜日

【python】sphinxのインストールとサンプル動作まで

■環境
CentOS 5.9
python 2.6.8
sphinx 1.2b3

■各種インストール
1. easy_installインストール
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
Downloading http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg
Processing setuptools-0.6c11-py2.4.egg
creating /usr/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.egg
Extracting setuptools-0.6c11-py2.4.egg to /usr/lib/python2.4/site-packages
Adding setuptools 0.6c11 to easy-install.pth file
Installing easy_install script to /usr/bin
Installing easy_install-2.4 script to /usr/bin

Installed /usr/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.egg
Processing dependencies for setuptools==0.6c11
Finished processing dependencies for setuptools==0.6c11

2. sphinxインストール
easy_install sphinx
Searching for sphinx
Reading http://pypi.python.org/simple/sphinx/
Best match: Sphinx 1.2b3
Downloading https://pypi.python.org/packages/source/S/Sphinx/Sphinx-1.2b3.tar.gz#md5=10d0bffdf01f0eddd57b9e0af0623457
Processing Sphinx-1.2b3.tar.gz
Writing /tmp/easy_install-VMYPoO/Sphinx-1.2b3/setup.cfg
Running Sphinx-1.2b3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-VMYPoO/Sphinx-1.2b3/egg-dist-tmp-nTgP_U
warning: no files found matching 'README'
no previously-included directories found matching 'doc/_build'
Adding Sphinx 1.2b3 to easy-install.pth file
Installing sphinx-apidoc script to /usr/bin
Installing sphinx-build script to /usr/bin
Installing sphinx-quickstart script to /usr/bin
Installing sphinx-autogen script to /usr/bin

Installed /usr/lib/python2.6/site-packages/Sphinx-1.2b3-py2.6.egg
Processing dependencies for sphinx
Searching for Jinja2>=2.3
Reading http://pypi.python.org/simple/Jinja2/
Best match: Jinja2 2.7.1
Downloading https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.1.tar.gz#md5=282aed153e69f970d6e76f78ed9d027a
Processing Jinja2-2.7.1.tar.gz
Writing /tmp/easy_install-5UTFwS/Jinja2-2.7.1/setup.cfg
Running Jinja2-2.7.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-5UTFwS/Jinja2-2.7.1/egg-dist-tmp-ugTvwR
warning: no files found matching '*' under directory 'custom_fixers'
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no previously-included files matching '*.pyc' found under directory 'jinja2'
warning: no previously-included files matching '*.pyc' found under directory 'docs'
warning: no previously-included files matching '*.pyo' found under directory 'jinja2'
warning: no previously-included files matching '*.pyo' found under directory 'docs'
Adding Jinja2 2.7.1 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/Jinja2-2.7.1-py2.6.egg
Searching for docutils>=0.7
Reading http://pypi.python.org/simple/docutils/
Best match: docutils 0.11
Downloading https://pypi.python.org/packages/source/d/docutils/docutils-0.11.tar.gz#md5=20ac380a18b369824276864d98ec0ad6
warning: no files found matching 'MANIFEST'
warning: no files found matching '*' under directory 'extras'
warning: no previously-included files matching '.cvsignore' found under directory '*'
warning: no previously-included files matching '*.pyc' found under directory '*'
warning: no previously-included files matching '*~' found under directory '*'
warning: no previously-included files matching '.DS_Store' found under directory '*'
zip_safe flag not set; analyzing archive contents...
docutils.parsers.rst.directives.misc: module references __file__
docutils.writers.docutils_xml: module references __path__
docutils.writers.s5_html.__init__: module references __file__
docutils.writers.odf_odt.__init__: module references __file__
docutils.writers.html4css1.__init__: module references __file__
docutils.writers.pep_html.__init__: module references __file__
docutils.writers.latex2e.__init__: module references __file__
Adding docutils 0.11 to easy-install.pth file
Installing rst2html.py script to /usr/bin
Installing rst2s5.py script to /usr/bin
Installing rst2pseudoxml.py script to /usr/bin
Installing rst2latex.py script to /usr/bin
Installing rstpep2html.py script to /usr/bin
Installing rst2xetex.py script to /usr/bin
Installing rst2man.py script to /usr/bin
Installing rst2odt_prepstyles.py script to /usr/bin
Installing rst2xml.py script to /usr/bin
Installing rst2odt.py script to /usr/bin

Installed /usr/lib/python2.6/site-packages/docutils-0.11-py2.6.egg
Searching for Pygments>=1.2
Reading http://pypi.python.org/simple/Pygments/
Best match: Pygments 1.6
Downloading https://pypi.python.org/packages/2.6/P/Pygments/Pygments-1.6-py2.6.egg#md5=2584ae5795d01cefbff0744136df3f65
Processing Pygments-1.6-py2.6.egg
creating /usr/lib/python2.6/site-packages/Pygments-1.6-py2.6.egg
Extracting Pygments-1.6-py2.6.egg to /usr/lib/python2.6/site-packages
Adding Pygments 1.6 to easy-install.pth file
Installing pygmentize script to /usr/bin

Installed /usr/lib/python2.6/site-packages/Pygments-1.6-py2.6.egg
Searching for markupsafe
Reading http://pypi.python.org/simple/markupsafe/
Best match: MarkupSafe 0.18
Downloading https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.18.tar.gz#md5=f8d252fd05371e51dec2fe9a36890687
Processing MarkupSafe-0.18.tar.gz
Writing /tmp/easy_install-R1K6UA/MarkupSafe-0.18/setup.cfg
Running MarkupSafe-0.18/setup.py -q bdist_egg --dist-dir /tmp/easy_install-R1K6UA/MarkupSafe-0.18/egg-dist-tmp-Gp3OgU
Adding MarkupSafe 0.18 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/MarkupSafe-0.18-py2.6-linux-x86_64.egg
Finished processing dependencies for sphinx

上記のようになればインストール完了です

■サンプル作成
sphinx-quickstart
Welcome to the Sphinx 1.2b3 quickstart utility.

Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).

Enter the root path for documentation.
> Root path for the documentation [.]:

You have two options for placing the build directory for Sphinx output.
Either, you use a directory "_build" within the root path, or you separate
"source" and "build" directories within the root path.
> Separate source and build directories (y/N) [n]:

Inside the root directory, two more directories will be created; "_templates"
for custom HTML templates and "_static" for custom stylesheets and other static
files. You can enter another prefix (such as ".") to replace the underscore.
> Name prefix for templates and static dir [_]:

The project name will occur in several places in the built documentation.
> Project name: test
> Author name(s): kakakikikeke

Sphinx has the notion of a "version" and a "release" for the
software. Each version can have multiple releases. For example, for
Python the version is something like 2.5 or 3.0, while the release is
something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
just set both to the same value.
> Project version: 0.1
> Project release [0.1]:

The file name suffix for source files. Commonly, this is either ".txt"
or ".rst".  Only files with this suffix are considered documents.
> Source file suffix [.rst]:

One document is special in that it is considered the top node of the
"contents tree", that is, it is the root of the hierarchical structure
of the documents. Normally, this is "index", but if your "index"
document is a custom template, you can also set this to another filename.
> Name of your master document (without suffix) [index]:

Sphinx can also add configuration for epub output:
> Do you want to use the epub builder (y/N) [n]:

Please indicate if you want to use one of the following Sphinx extensions:
> autodoc: automatically insert docstrings from modules (y/N) [n]:
> doctest: automatically test code snippets in doctest blocks (y/N) [n]:
> intersphinx: link between Sphinx documentation of different projects (y/N) [n]:
> todo: write "todo" entries that can be shown or hidden on build (y/N) [n]:
> coverage: checks for documentation coverage (y/N) [n]:
> pngmath: include math, rendered as PNG images (y/N) [n]:
> mathjax: include math, rendered in the browser by MathJax (y/N) [n]:
> ifconfig: conditional inclusion of content based on config values (y/N) [n]:
> viewcode: include links to the source code of documented Python objects (y/N) [n]:

A Makefile and a Windows command file can be generated for you so that you
only have to run e.g. `make html' instead of invoking sphinx-build
directly.
> Create Makefile? (Y/n) [y]:
> Create Windows command file? (Y/n) [y]:

Creating file ./conf.py.
Creating file ./index.rst.
Creating file ./Makefile.
Creating file ./make.bat.

Finished: An initial directory structure has been created.

You should now populate your master file ./index.rst and create other documentation
source files. Use the Makefile to build the docs, like so:
   make builder
where "builder" is one of the supported builders, e.g. html, latex or linkcheck.

緑の部分で色付けした「プロジェクト名」「作者」「バージョン(開発バージョンとリリースバージョン)」の3つだけ適当に入力して後はEnterを入力で問題ありません
プロジェクトが作成できたらさっそくビルドします

make html
sphinx-build -b html -d _build/doctrees   . _build/html
Making output directory...
Running Sphinx v1.2b3
loading pickled environment... not yet created
building [html]: targets for 1 source files that are out of date
updating environment: 1 added, 0 changed, 0 removed
reading sources... [100%] index

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index

writing additional files... genindex search
copying static files... done
copying extra files... dumping search index... done
dumping object inventory... done
build succeeded.

Build finished. The HTML pages are in _build/html.

_build/html配下に静的ファイルが生成されます
_build/html配下をapache等のDocumentRoot配下にコピーして確認してみます
EX)
cp -ipr _build/html/ /var/www/html/sphinxtest/

http:///localhost/sphinxtest
にアクセスして以下の画面が表示さればOKです

2013年10月14日月曜日

ftpサーバの構築方法

■環境
CentOS 6.4 64bit
vsftpd 2.2.2

■設定
1. vsftpdのインストール
yum -y update
yum -y install vsftpd

2. ftp用ユーザの作成
useradd ftpguest001
passwd ftpguest001
(パスワードを設定する)
echo ftpguest001 >> /etc/vsftpd/chroot_list

3. ACL確認
構築したftpサーバに対してクライントから21番ポートで接続できることを確認する
できない場合はiptablesやルータのFWが防がっていないか確認する

4. 起動
service vsftpd start
netstat -an | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

5. 動作確認
今回はwinscpで接続してみました
ftpモードにして作成したユーザ情報を入力しログインしてみてください


ログインできなければiptablesやFWが21番ポートを開放しているかどうか確認してください

2013年10月12日土曜日

【capistrano】Stage not set, please call something such as `cap production deploy`, where production is a stage you have defined.

capistranoが3.0になったら既存のレシピが動かなくなってしまった
どうやらレシピを置く階層とか変わったみたい・・・
とりあえず3.0をuninstallしたけど、いずれ対応しないとですね

gem uninstall capistrano

Select gem to uninstall:
 1. capistrano-2.15.4
 2. capistrano-3.0.0
 3. All versions
> 2
Successfully uninstalled capistrano-3.0.0

2013年10月11日金曜日

【Ruby】Jekyll のインストールとサンプル実行

■環境
CentOS 5.9
jekyll 1.2.1
ruby 1.9.3p125
gem 2.1.4
※rubyとgemのインストールは以下を参考にしてみてください
http://kakakikikeke.blogspot.jp/2012/07/rubychef.html
http://kakakikikeke.blogspot.jp/2013/03/chefomnibus.html

■インストール手順
1. 初期設定
gem install jekyll --no-rdoc --no-ri

vim index.md
---
layout: layout
title: test jekyll
---
#Welcome to my jekyll
jekyll build
jekyll server

でブラウザからhttp://localhost:4000/にアクセスしてページが表示されることを確認する

2. レイアウト設定
mkdir _layouts
touch _layouts/layout.html
vim _layouts/layout.html
<!DOCTYPE html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  <title>{{ page.title }}</title>
</head>
<body>
  {{ content }}
  <p>- rendered with layout template -</p>
</body>
jekyll build
jekyll server

でブラウザからhttp://localhost:4000/にアクセスしてページが表示され若干レイアウトが変わっていることを確認する

■Tips
「no access permission to `/'」が出る場合は権限等を確認してみてください

■メモ
.mdファイルの中ではLiquidテンプレートというruby構文がmarkdown記法以外にも使える
グローバル変数としてpageとsiteという変数が使用できる
_config.ymlにはサイト全体の設定や変数を定義できる
_post配下には記事用のmarkdownを作成し配置する
_layoutsフォルダ配下には全体の構成を管理するhtmlテンプレート配置する
_site配下には実際に作成されたhtmlファイルやcssファイルが配置される
_site配下をapache上のDocumentRootにデプロイするとそのままサイトとして見れる


■参考サイト

P.S 20151116
最近だと jekyll new というコマンドがありこれでテンプレートとなるサイトを一発で作成できるみたい

  • cd work
  • jekyll new .
  • jekyll server

work ディレクトリ配下は空でなければいけません

2013年10月8日火曜日

Tomcatですでにデプロイされているwarファイルをリモートデバッグしてみた

■環境
・ローカル
Windows7 64bit
eclipse 3.8
・リモート
Java 1.7.0_17
Tomcat 7.0.32.0
※Tomcatはchefでインストールした際の設定方法を記載します
参考URL:http://kakakikikeke.blogspot.jp/2013/06/cheftomcatjvm.html

■概要
どうしもローカルのeclipse上でWebアプリケーションをデバッグできない状態だけど
リモート環境(今回はクラウド上のサーバ)だったらwarが展開されサービスの動作確認が出来る場合に
リモートの環境を使ってあたかもローカルでデバッグしているかのようにできる手法を紹介します

■設定
1. Tomcatの起動オプション修正
8000番でLISTENしローカルから接続するようにします
起動ファイルを以下のように設定し起動時にリモートデバッグが有効になるようにします

vim /etc/default/tomcat7
JMX_OPTS="$JMX_OPTS\
-Xdebug\
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"

service tomcat7 restart

netstat -an | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:*            LISTEN

8000番でLISTENしていることを確認する

2. Eclipse設定
ローカル側に存在するリモート側に展開されているプロジェクトを右クリックし
デバッグ→デバッグの構成をクリック
開いたダイアログから「リモートJavaアプリケーション」を探しダブルクリックするとプロジェクト名のデバッグ構成が作成されます

※都合によりプロジェクト名はマスクしてあります

ホスト(IPアドレス)、ポートを設定してデバッグを押下します
また、デバッグする前にbreakpointをローカル側のソースに設定しておきましょう
eclipse上のパースペクティブもデバッグ用のパースペクティブに変更しておくといいと思います

3. 実際にリクエストをサーバに送る
breakpointでサーバ側のプログラムが停止します
ブラウザでリクエストを送った場合はブラウザが読み込み中等で停止していることが確認できるかと思います

■Tips
  • リモートサーバ上で8000番をLISTENするのでローカル -> 8000/tcp -> リモートの通信ができるようにFWの設定等を変更します
  • サーバ側でnetstat -an | grep 8000を実行してESTABLISHEDになっていることを確認しましょう
  • ESTABLISHEDになっていない場合はeclipse側のプロキシの設定やFWの設定を疑いましょう
  • リモート側のソースコードとローカル側のソースコードが常に同期しているようにしてください、差分があるとうまく動作しないことがあるようです

2013年10月5日土曜日

GMOとくとくBBでWiMAXを申し込んだときに初期設定としてやったことメモ、改めGMOとくとくBBを解約するときの超注意点

P.S 20141111
P.S 20141127 再度問い合わせをしたことに関して追記しました
P.S 20141128 解約できた旨を追記しました

■違約金に関して
今後ボクみたいな方がでないために記載しておきます
今回申し込んだキャンペーンは以下の通りです(終了しているキャンペーンなのでリンク切れになっていたらすいません)
http://gmobb.jp/lp/s-golden-max/

簡単にキャンペーンの概要を説明すると
  • キャンペーン期間中は割引です
  • キャンペーン期間が切れると通常料金です
  • 更新付きがあってその月であれば違約金が無料です(それ以外は15,600円がかかります)
という感じです

ポイントは更新月でキャンペーンによると13ヶ月目が更新月のようです
私は2013/10に端末をアクティベーションしました


なのでボクの認識では2014/11が更新月かと思っていました
ただ心配だったので2014/10に一度、管理UIにアクセスして解約できるか確認をしました
「サービス・オプションの削除と解約」で解約できるようなので確認したのですが、解約ボタンが表示されておらずできませんでした

なので、2014/10は解約月ではないだろうと思いとりあえず放置しました

そして2014/11になって再度UIを確認したのでまだボタンがなく、ちょっと心配になったので問い合わせフォームから問い合わせしてみました
そのときのメールの内容は以下の通りです(2014/11/06 フォームから問い合わせ)
昨年10月に以下のキャンペーンから申し込みを行いました
http://gmobb.jp/lp/s-golden-max/
今日まで問題なく便利に使わせていただいております。

さて、使用させていただいてから今月(2014年11月)で
13ヶ月目となりました
上記キャンペーンの内容を再度確認したところ13ヶ月目は
更新月で解約できるはずなのですが、
BBnaviのサービスオプションの削除解約に解約ボタンが表示されません。
今月中の解約であれば違約金等も発生しないとキャンペーンの
内容に記載がありましたので今月中に解約したいのですが
どうすればよろしいでしょうか。

お手数ですが、ご教授ください。
以上

と問い合わせてリプライが来たのが以下です
件名
---------------------------------------------------------------
フォームからのお問い合わせ


お問い合わせ内容/Discussion Thread
---------------------------------------------------------------
回答 メール(お客様センター) - 2014/11/11 15:58
hoge fuga 様

お問い合わせありがとうございます。
GMOとくとくBB お客様センター です。


ご連絡が遅くなり申し訳ございません。

本件、hoge様の契約更新月が2014年10月でございまして、
現在解約されますと15,600円(税別)の違約金が発生いたします。

つきましては、WiMAX2+にお乗換えをいただけますと、
こちらは免除が可能でございますので、
ご検討いただけますと幸いです。

なお、弊社会員様サポート、BBNAVI内の現在ご利用中のサービス
確認の項目内のバナーからお手続きをいただけますと、
違約金無しでのWiMAXの解約、初期費用無料でのWiMAX2+の
発送手配が自動で処理されますので、お願い申しあげます。

なお、そのうえでご解約ご希望でございましたら、
恐縮ではございますが11月20日までにこちらへご返信いただけましたら
特例でメールでの11月末解約をご手配いたします。


今後ともGMOとくとくBBをよろしくお願い申しあげます。
どうやら2014/10が更新月だったようです
つまり、更新月であっても管理UIのBBNaviでは解約ボタンは表示されません
おそらくですが、更新月で解約されると違約金が取れないのでわざと出していないのかなと思います
あとは13ヶ月目が更新月とキャンペーンのページでは記載されていましたが、端末のアクティベーションから13ヶ月目でもないようです
この辺りはもしかすると単純に嘘をつかれているだけかもしれませんが。。。

で結局自分は違約金を支払って解約することにしました
違約金を払うのは嫌ですが、何よりサービスのスペックが利用者にわかりづらすぎるサービスを使いたくなかったので違約金を払ってでも解約しました

今回は自分にとって残念な結果になってしまいましたが、どこのプロバイダもサポートはこんな感じなのでしょうか。。。
皆さんはこんな目に合わないようにしてください

■1度目のレスポンスからその後
実は上記の連絡があってから解約の連絡をしました
連絡はTo:を info@gmobb.jp にして受信できたGmailからそのまま返信しました
返信ないようは以下の通り
ご担当者さま

問い合わせ番号
xxxxxx-xxxxxx
になります。

ご確認ありがとうございます。

違約金のかからない更新月で解約しようと思ったのですが残念です。

10月にもUIから解約を試みたのですが解約ボタンがなく、それで11月が更新月かと思い
11月もUIで解除を試みたのですが解除ボタンがなく、問い合わせさせていただいた次第です。
UIにも
「ご解約のオンラインお手続きは、ご利用中の全てのサービスとオプションサービスがご解約可能でな状態である必要があります。最低利用期間内のサービスが1つでもある場合は、オンラインでのお手続きはいただけません。」
とあったのでまだ更新月ではないのかと思ってしまいました。
ボタンが表示されていなくても更新月になっていることがあるとは気が付きませんでした。

違約金は払いますので解約でお願いします。
また、解約日は選択できますでしょうか。
締め日は20日とありましたので、可能であればギリギリまで使用させていただければと思います。

以上
これは11.11に1度目の返信が来た直後に返したので11.11にこちらが返したことになります

そして1週間ほど待ちましたが音沙汰なく
さすがにお金絡みなので以下のメールを再度送信しました
ご担当者さま

問い合わせ番号
xxxxxx-xxxxxx
になります。

11/11に返信させていただいた件いかがでしょうか。
次月も迫っておりますのでご確認よろしくお願いします。


以上
このメールは11.22に送信していました
なので1度目の返信から、11日後に催促メールを出しています

そして、11.27に追記した現在上記に関しても全く音沙汰がないのでしびれを切らして
https://help.gmobb.jp/app/ask/?btn_id=faq_askから再度問い合わせを実施しました
受付完了の自動返信は速攻できましたが、さてどうなることやら。。。

Gmailは無効に弾かれているという可能性もありますが、特にGmailを弾くなんて記載はWebになかったのでないとは思うのですが(自分が探せていない可能性ももちろんありますが)
これで迷惑客だからと言って完全に無視されているとわかったら結構おそろしいですね
お名前.com とかの問い合わせでも結構ヒドイ仕打ちを受けているかたもいるようで。。。
GMOさんってこんな感じなんですかね。。。

設定方法を書くだけの記事だったのに完全に問い合わせ状況を記録する備忘録になってしまいました

■フォームから再問い合わせしてその後
さすがに返信がきました
結論的にはやはり、違約金を払っての解約になりました
そして、返信は1つ目の問い合わせと2つ目の問い合わせに対して2通きました
それぞれこんな感じ

1つ目の問い合わせに対する返信(ようやく来た返信)
件名
---------------------------------------------------------------
フォームからのお問い合わせ


お問い合わせ内容/Discussion Thread
---------------------------------------------------------------
回答 メール(お客様センター) - 2014/11/27 17:21
hoge fuga 様

お問い合わせありがとうございます。
GMOとくとくBB お客様センター です。

このたびは、ご案内にお時間をいただいており、まことに申し訳
ございません。

お問い合わせ下さいました件について、すでに別のメールでのご
返信で対応させていただきましたので、このメールでのご返信は
控えさせえていただき、内容をご確認いたした報告のみとさせて
いただきます。

他にご不明点がございましたら、お手数ですが再度お問い合わせ
下さい。

今後ともGMOとくとくBBをよろしくお願い申しあげます。

2つ目の問い合わせに対する返信(催促したやつ)
件名
---------------------------------------------------------------
フォームからのお問い合わせ


お問い合わせ内容/Discussion Thread
---------------------------------------------------------------
回答 メール(お客様センター) - 2014/11/27 17:17
hoge fuga 様

お問い合わせありがとうございます。
GMOとくとくBB お客様センター です。

このたびは、ご案内にお時間をいただいており、まことに申し訳ござい
ません。
現在、GMOとくとくBBお客様センターへのお問い合わせが、非常に混雑
いたしております。

弊社からのご回答にお時間を頂戴しており、お客様にご迷惑をおかけい
たしておりますことを、深くお詫び申しあげます。

このたびはご解約をご希望とのことでお伺いいたしましたので、ご連絡
いただきましたご登録住所へ解約申請書の発送を手配させていただきま
した。書類がお手元に届かれましたら、必要事項をご記入の上、弊社まで
郵送にてご返送くださいますようお願い申しあげます。

1週間以内にはお手元に到着するかと存じますが、万が一ご確認いた
だけない場合は郵便事故などの可能性も考えられます。その場合、
お手数ではございますが、再度弊社までご連絡くださいますようお
願い申しあげます。

ご案内させて頂きましたとおり、書類のご返送前ではございますが
2014年11月末日でのご解約でお手配させていただきましたので、
何卒よろしくお願い致します。

今回は大変残念ではございますが、また機会がございましたら弊社
サービスのご利用を心よりお待ち申しあげます。

今後ともGMOとくとくBBをよろしくお願い申しあげます。

だそうな
とりあえず解約はできましたが、紙の資料にも解約の旨を書かなければいけないらしいです
メールの文面では解約できていると書いていましたが書類はまだ届いてもいないので、今月中に返信できなくても解約になるのか心配です
これで解約になっていなかったら、恐ろしいです。。。

このメールを見ると「忙しい」を理由に返信できなかったと言っていますが
おそらく自分のスーパー予想ですが
  • 内部の情報共有や処理フローに不備がある
  • エスケレーションフローが良くない
  • エスカレーションしてから本体からの回答が全然ない
あたりが返信が遅くなった根本的な原因だと思います
確かにサポートの件数もすごい量だと思いますが、それを捌けるだけのシステムができていないのだと思います

あと今回の最終的な結論で
こちらは違約金を払わなくていいようにWebでいろいろ調べて手続き準備も万全だったのに違約金を払って解約になった
ということに関する原因ですが
こちらが10月の段階で問い合わせしなかったというのも原因の1つにあると思いますがサービス面から見ると
  • 解約が問い合わせでないとできないことがWebに明記されていない(登録時もなかった気がする、自分の調査不足かもしれませんが)
  • 解約以外の契約に関する情報が探しづらい、明記していない(利用月から13ヶ月目の定義が曖昧すぎる、今回は騙されただけかもしれませんが)
  • 解約するためのUIがダメすぎてユーザに混乱を与えてしまった(これが一番の原因だと思う)

あたりでしょうか
あと、今回の件でいろいろ調査したのですが、UQ-WiMAXの契約規約で1年契約が廃止になったのも混乱を招いた原因の1つかもしれません
自分が契約したときはまだ1年契約プランがあったけど、その途中で廃止になった的な
それでも契約時は1年解約OKだったので、解約させてほしいとは思いますが

何はともあれ無事終了です(まだ書類の返信があるみたいですが)
こういうお金が絡むドロドロしたやりとりはBtoCサービスでは非常に多いと思います
どっちが悪いという話ではないと思いますが、もう少し契約規約や金額面、利用ルールを見える化してほしいなと改めて思いました

同じような境遇に合っている方がいました
http://shinsuke789.hatenablog.jp/entry/2014/06/10/120039


以下設定方法

↓↓↓↓↓↓


■機種
MobileSlim

■初回アクセス
MobileSlim(端末)の裏にSSIDとPWが記載されているので接続
※基本はこのままで何も設定しなくてもインターネットはできます

■設定したこと
192.168.1.1にブラウザアクセスして設定
「admin」パスワードでログイン(初期設定すると必ずadminになるようです)
セキュリティー設定(基本)→ログインパスワードでパスワードを変更
セキュリティー設定(基本)→Wi-Fi 設定でSSIDとWi-Fiパスワードを変更
詳細設定→ファイアウォールで「インターネットからPINGを有効にする」をOFFにする
詳細設定→ルーター機能設定の「Port Forward機能」でポート追加

とくとくBBnaviから設定
ログイン後、現在ご利用中のサービス確認→WiMAX接続サービスのグローバルIPオプション追加でグローバルIPを追加

■機能メモ
  • 時刻設定はデフォルトでJSTになっており、ntpサーバの設定もされているのでそのまま(NICTのNTPサーバだった)
  • セキュリティー設定(基本)→セキュリティー設定(詳細)でアクセスコントロール(ACL)の設定ができる、アクセスさせたいIPや拒否したいIPを追加できる
  • 詳細設定→ファイアーウォールでグローバルから端末へのログインを許可することができる(むしろこれしかFW設定ができない)
  • 詳細設定→ ルーター機能設定でいろいろなネットワークの設定ができます
    • Universal PnP
    • VPNパススルー
    • DMZ Host機能
    • Port Forward機能
    • DHCP Server(DHCP ServerIP変更、固定IP振り機能、
    • USB データモード設定(USB接続を有効/無効にできる設定)
  • WebUIから端末の再起動や初期化ができます
  • 端末のランプは左から「充電」「WiMAX接続状況」「電波状況」、緑で点滅もしていない状態がもっともいい状態です
  • グローバルIPは24時間でリフッシュされるようです(BiglobeのWiMAXのときはルータを再起動しないと変わらなかった気がします)

2013年10月4日金曜日

Jenkinsで分散ビルド(mavenビルド編)

■概要
スレーブノードを一台追加してそのノードでビルドを実行してみます
ビルド内容はmavenビルドです
mavenビルドでできた成果物を保存するところまでやってみます

■環境
・マスタノード
CentOS 6.3
Jenkins 1.517
・スレーブノード
Java 1.7.0_17
Maven 3.1.0

■設定
1. スレーブノード追加
Jenkinsの管理→ノードの管理→新規ノード作成
ノード名:node001
ダムスレーブにチェックを入れてOKを押します

次に、ノードの設定です
適当でも大丈夫ですが、自分は以下のように設定しました
説明:mavenビルドを実行するためのノード
同時ビルド数:1
リモートFSルート:/var/tmp/jenkins_slave
ラベル:maven
用途:このマシンを特定ジョブ専用にする
起動方法:SSH経由でUnixマシンのスレーブエージェントを起動
ホスト:node001
認証情報:Manage Credentialsでnode001のSSHのログインユーザ名とパスワードを設定してからここで選択します、秘密鍵認証での設定も可能です
可能性:可能な限りオンラインのままにする

SSHユーザ名と秘密鍵では
Scope:秘密鍵
ユーザー名:root
秘密鍵:Jenkinsマスター上のファイルからでpemファイルのパスを指定、パスフレーズが必要な場合は高度な設定からパスフレーズを入力してからsave
このとき鍵に権限がないとsshのログインでエラーになるので誰でも読み込める権限(666)あたりにしておきます

転送するファイルは「slave.jar」です
slave.jarはJenkinの本体でる「jenkins.war」の中に存在しています
一度、unzip等で展開して抽出してください、抽出したslave.jarを転送すればOKです
転送するパスはノードを追加するときに設定したリモートFSルートのパス「/var/tmp/jenkins_slave」配下に配置します

saveを押下後、slaveに対してSSH経由で必要なjarファイルをリモートFSルートで設定したディレクトリ配下に配置します
エラーがでなければスレーブノードの追加完了です

slaveノードでは mvn コマンドを実行するのでインストールされていない場合は以下を参考にmavenをインストールしてください
http://kakakikikeke.blogspot.jp/2013/10/maven.html
slaveノードがmavenを実行するときに外部のmavenリポジトリからjarを取得する流れがあるのでグローバルにアクセスできるネットワークも必要となります

2. スレーブノードでビルドするジョブの作成
今回はスレーブノードでmavenビルドを実行するためのジョブを作成します
流れとして
①ソースコード転送→②mavenビルド→③成果物デプロイ
の流れを作りたいと思います

①ソースコード転送
はじめにスレーブノードに対してソースコードをコピーするジョブを作成します
自分はgitからソースをcloneしているのでそれをtarで固めたあとにnode001に転送しています
転送するときはcapistranoのuploadを使っています
この辺はやり方がいろいろありますが、とりあえず転送できればOKです
※scpでもsftpでもftpでもOKです

②mavenビルド
mavenビルド用のジョブを作成します
基本はいつも通り作成するので作成時のポイントだけ

「実行するノードを制限」の部分で先ほど作成したノードで実行するように制限します
今回は maven というラベルでノードを作成したので「maven」と入力します

ビルドで「Mavenの呼び出し」を選択してゴール、pom.xmlのパスを設定します
①のジョブが配置したpom.xmlの場所をフルパスで指定すれば大丈夫です
ただ、pom.xmlの中でソースファイルの場所等を相対的に指定している場所があるのならpom.xmlがあるパスまでcdしてからmvnを実行したほうが無難です

プロファイルの指定もしたい場合はゴールの部分に「-Phogehoge」プロファイルの指定をしちゃえば大丈夫です
また実際に作成されたjarファイルやwarファイルはビルドの設定で成果物を残すようにしておくと、リモートFSルート配下にworkspaceディレクトリができ、その配下のジョブ名ディレクトリ配下にできます

③成果物デプロイ
これもどんな方法でもいいですが、自分の場合はスレーブノードにcapistranoがインストールされていないので単純にscpでデプロイしました
デプロイする前にssh経由でバックアップを取得しておくといいでしょう
scpやsshの場合はノンパスのssh接続をできるようにしておくと、なお楽にはなります

あとはgitからcloneする場合はcloneするビルドを実行すればいいし
すでにcloneしてあるならソースを転送するビルドから実行すればmavenビルドが走って成果物ができデプロイされる流れとなります
mavenビルドのジョブのサンプルだけ載せておきます
※見せられないところはマスクしてます、ビルドの手順の設定のところなど参考にしてみてください

■参考サイト

2013年10月3日木曜日

mongoのレプリカセット構成を修正する方法

■概要
stateStrが突如「RECOVERING」のまま動かないとか
「STARTUP2」のまま何も始まらない
というときにとりあえず同じデータのまま再度レプリカセット構成でサービスを再開したい
というどうしようもないときには使えそうなのでメモしておきます

■環境
CentOS 6.3
mongo 2.4.5
※2台構成(host001, host002)の5ノード構成(20001から20005)で1台がスレーブ1台がバックアップ用途とする

■手順
  1. レプリカセットとして動作しているノードを全て停止
  2. kill or db.shutdownServer()で停止します
  3. PRIMARYとして動作させたいノード配下のデータ以外すべて削除する(ノード用の空ディレクトリだけ残しておく)
  4. EX) node01はデータあり、node02,03,04,05は空ディレクトリだけ用意
  5. PRIMARY用のノードディレクトリ配下のlocal.*をすべて削除する
  6. EX) node01配下のlocal.*ファイルを削除する(もしくは避ける)
  7. 全ノード起動(この時点でreplicaset構成が解消されている)
  8. mongo --port 20001
  9. PRIMARYにしたいノードに対してmongoコマンドで対話形式になる
  10. cfg={ "_id":"rs1", "version":1, "members":[ { "_id":1, "host":"host001:20001" }, { "_id":2, "host":"host001:20002" }, { "_id":3, "host":"host001:20003" }, { "_id":4, "host":"host002:20004", "votes":0, "priority":0, "slaveDelay":3600 }, { "_id":5, "host":"host002:20005", "votes":0, "priority":0 } ] }
  11. cfgを作成
  12. rs.initiate(cfg)
  13. レプリカセットを再構成する
rs.initiate(cfg)後に順次PRIMARY、SECONDARYとノードが構築されていくと思います
もうどうすることもできなくなったらやってみてください

2013年10月2日水曜日

mavenのインストール方法

■環境
CentOS 5.9
Java 1.7.0_05
※JAVA_HOME等の設定まで必要
maven 3.1.0

■インストール方法
cd /var/tmp
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz
  ※wgetできない場合はhttp://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/にアクセスして存在しているmavenバージョンに変更してからwgetしてください
tar xvzf apache-maven-3.1.0-bin.tar.gz
mv apache-maven-3.1.0 /usr/local/
cd /usr/local/
ln -s apache-maven-3.1.0/ maven

vim /root/.bashrc
export M2_HOME=/usr/local/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
source /root/.bashrc

mvn -v
Apache Maven 3.1.0 (893ca28a1da9d5f51ac03827af98bb730128f9f2; 2013-06-28 11:15:32+0900)
Maven home: /usr/local/maven
Java version: 1.7.0_05, vendor: Oracle Corporation
Java home: /usr/local/java/jdk1.7.0_05/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.18-238.el5", arch: "amd64", family: "unix"

■参考サイト

2013年10月1日火曜日

【Tomcat】catalina.outのログローテーションを設定する方法

■環境
CentOS 6.3
Apache Tomcat/7.0.32
※chefのcookbooksにてtomcatインストールした場合の設定方法となります
http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html

■概要
tomcatの起動や停止に関するログを記録するcatalina.outですが、
こいつはtomcatのconf/logging.propertiesというログローテーションを定義するプロパティで
ちゃんと日次でローテーションしてくれるはずなのですが、tomcatがずっと起動している場合
ローテーションで日付付きのファイル自体は作成させるのですが、ログ自体はずっとcatalina.outというログファイルに吐き続けるため
catalina.outがどんどん肥大化していってしまいます

そんな場合にちゃんとローテーションしたタイミングでcatalina.outも切り替えてくれる方法を記載します
他にも方法はあると思いますので参考程度に見て下さい

■設定方法
vim /etc/init.d/tomcat7

以下を編集
$SU "$TOMCAT_USER" -c "touch $CATALINA_OUT"
↓
#$SU "$TOMCAT_USER" -c "touch $CATALINA_OUT"

org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 &
echo \$! > "$CATALINA_PID"
↓
org.apache.catalina.startup.Bootstrap "$@" start >/dev/null 2>&1 &
echo \$! > "$CATALINA_PID" | /usr/sbin/rotatelogs $CATALINA_BASE/logs/catalina.%Y-%m-%d.log 86400 540

service tomcat7 restart
サービスを再起動

lsof | grep catalina.out
catalina.outを掴んでいるプロセスがいないことを確認する

rm catalina.out
df -h
ディスク容量が大きくなっていることを確認する
ここでディスク容量が減らなかったりするとまだcatalina.outをtomcatが掴んでしまっており見た目は削除されたファイルですが、
実は裏ではcatalina.outにログを吐き続けているためどんどん肥大化しディスクサイズを逼迫していきます

rotetelogsはインストールされている環境に合わせてパスを変更してください
引数に86400を指定することで毎日0時にローテーションするようになります

また今回はchefでインストールしたtomcatの場合を紹介しましたが他の方法でインストールした場合もほぼ同様に設定可能です
/usr/local/tomcat/bin/catalina.sh
等の起動スクリプトに同じような記述があるのでそこを編集すれば問題ありません