2014年2月28日金曜日

PhpZabbixApiを使って指定してZabbixのアクションの有効/無効を切り替えるPHPスクリプト

スクリプトはGistにて公開しています
https://gist.github.com/kakakikikeke/9222910

■Version
Zabbix 2.0.3
PHP 5.3.3

■Configuration
$api = new ZabbixApi('http://zabbix_server_hostname/api_jsonrpc.php', 'zabbix_user_name', 'zabbix_user_password');
  • zabbix_server_hostname・・・zabbixサーバのホスト名またはIPアドレスを設定
  • zabbix_user_name・・・zabbixにログインするユーザ名
  • zabbix_user_password・・・zabbixにログインユーザのパスワード
を設定してください

■How to use
change_action_status.php test 1
1つ目の引数はアクション名
2つ目の引数は有効/無効フラグ

アクション名は部分一致に対応しているので条件に合致するアクションすべてのステータスを変更します
すべてのアクションに対して実施したい場合は「""」をアクション名に指定します
フラグは0が有効で1が無効に切り替わります

■Tips
部分一致になってしまうのは、search パラメータがデフォルトだと部分一致に対応してしまっているため(おそらく完全一致にすることもできると思う)
内部的にはaction.getを呼び出し検索に引っかかったアクションのactionidを元にaction.updateを呼び出している

■参考サイト

2014年2月27日木曜日

Windowsにmongodbをインストール

■環境
Windows7 64bit
MongoDB 2.4.9

■インストール
ダウンロードページから最新のバージョンのzipファイルをダウンロードします
http://www.mongodb.org/downloads
(2014/02/24の段階では2.4.9がダウンロードされました)

zipファイルを展開してできたファイルを名前変更します
mongodb-win32-x86_64-2008plus-2.4.9

mongodb
名前変更したファイルをCドライブ直下のディレクトリに移動します「C:\mongodb」
mongo用のデータディレクトリを作成します
これもCドライブ直下に作成します「C:\data\db」を作成してください

起動はコマンドプロンプトから実施します
cd c:\
C:\mongodb\bin\mongod.exe
上記のコマンドを実行してフォアグランドでmongodbがで起動できると思います

■接続確認
もう1つのコマンドプロンプトを立ちあげて接続テストをしてみます
C:\mongodb\bin\mongo.exe
と実行してください、先ほど立ちあげたmongodbサーバに接続できるかと思います

サーバ側のログにも
[initandlisten] connection accepted from 127.0.0.1:55924 #1 (1 connection now open)
という接続を確認するログが出ています

あとはmongoコマンドを実行していけばOKです(以下は例となります)
show dbs
use test
db.db.test_collection1.save({"_id":null});
db.db.test_collection1.pretty();

■参考

2014年2月26日水曜日

GoogleDrive起動時に「このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。」

原因は

Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)

がインストールされていないためでした
http://www.microsoft.com/ja-jp/download/confirmation.aspx?id=5582
にアクセスしてインストーラをダウンロードしインストールしてください
インストール完了後に再度、Google DriveのSetupを実施すればエラーが出ないで次に進めます
お試しあれー

■参考サイト

2014年2月25日火曜日

Firefoxのブックマークツールバーのfaviconを取得する方法

Firefox Syncなどを利用してブックマークを共有したときに
まだ一度もアクセスしていないとブックマークツールバーにあるfaviconがブランクで表示されてしまいます


※こんな感じ

特に自分の場合はプラグインで「Roomy Bookmarks Toolbar」を使っておりfaviconが表示されないと何のサイトかひと目で判断がつきません
このときにfavicon情報をすべて取得する方法を紹介します

まずメニューバーからブックマーク -> すべてのブックマークを表示でブックマークの管理画面を開きます
ブックマークツールバーをクリックして一覧を表示します


ここと同じ階層にフォルダを一つ作成します
右クリックから新規フォルダを選択して新規フォルダ名を入力し作成します(ここではフォルダ名をtmpとします)
作成したtmpフォルダにブックマークツールバーにあるブックマークをすべてコピペします


完了したらブックマークの管理ダイアログは閉じてしまいます
ブックマークツールバーに先ほど作成したtmpフォルダがあると思いますので
右クリックから「タブですべて開く」を実行してください
すべてのブックマークが一斉に開かれサイトが表示されると同時にfaviconも埋まっていくのがわかるかと思います
開くブックマークの数にもよりますが当然一斉に開くのですべてを開ききるまでに結構時間がかかります


※アクセス完了後

すべて開き終えたら作成したtmpフォルダは削除してしまって問題ないです


以上で紹介は終了です
一応、これでfaviconは埋められますが、なんかもうちょっといい方法がないのかなー

2014年2月23日日曜日

【Java】SpringFrameworkを使って簡単なWebAPIを作成してみた

■環境
Mac OSX 10.8.5
Eclipse Kepler 4.3
Java 1.6.0_65
Maven 3.1.1
SpringFramework 4.0.3

■環境準備
1. Mavenプロジェクトを作成する
eclipseを開き New -> Other -> MavenProject を選択し Next をクリックします


次もデフォルトのままNextをクリックします


プロジェクトのarchetypeを設定します
GroupIdがorg.apache.maven.archetypes、ArtifactIdがmaven-archetype-quickstart を選択します


作成するプロジェクトのGroupIdとArtifactIdを選択する画面になりますので適当に入力します
ここでは以下の通り入力しました
  • GroupId・・・com.kakakikikeke.sample
  • ArtifactId・・・java-spring-sample
パッケージ名は自動で生成されるのでjava-spring-sampleの部分を削除しました

入力が完了したらFinishをクリックします

2. pom.xmlの作成
以下の内容のpom.xmlを作成します
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelversion>4.0.0</modelversion>

     <groupid>com.kakakikikeke.sample</groupid>
     <artifactid>java-spring-sample</artifactid>
     <version>1.0</version>
     <packaging>jar</packaging>

     <name>java-spring-sample</name>
     <url></url>

     <properties>
          <project .build.sourceencoding="">UTF-8</project>
          <start-class>com.kakakikikeke.sample.Application</start-class>
     </properties>

     <parent>
          <groupid>org.springframework.boot</groupid>
          <artifactid>spring-boot-starter-parent</artifactid>
          <version>1.0.0.RC3</version>
     </parent>

     <dependencies>
          <dependency>
               <groupid>junit</groupid>
               <artifactid>junit</artifactid>
               <scope>test</scope>
          </dependency>
          <!-- for spring -->
          <dependency>
               <groupid>org.springframework.boot</groupid>
               <artifactid>spring-boot-starter-web</artifactid>
          </dependency>
          <dependency>
               <groupid>com.fasterxml.jackson.core</groupid>
               <artifactid>jackson-databind</artifactid>
          </dependency>
     </dependencies>

     <build>
          <plugins>
               <plugin>
                    <artifactid>maven-compiler-plugin</artifactid>
               </plugin>
               <plugin>
                    <groupid>org.springframework.boot</groupid>
                    <artifactid>spring-boot-maven-plugin</artifactid>
               </plugin>
          </plugins>
     </build>

     <repositories>
          <repository>
               <id>spring-snapshots</id>
               <url>http://repo.spring.io/libs-snapshot</url>
               <snapshots>
                    <enabled>true</enabled>
               </snapshots>
          </repository>
     </repositories>
     <pluginrepositories>
          <pluginrepository>
               <id>spring-snapshots</id>
               <url>http://repo.spring.io/libs-snapshot</url>
               <snapshots>
                    <enabled>true</enabled>
               </snapshots>
          </pluginrepository>
     </pluginrepositories>
    
</project>
springのライブラリのダウンロードとmavenビルド時に必要なgoalsを使用するためにプラグインを追加しています
junitのdependencyに関しては削除しても問題ありません(maven-archetype-quickstartから作成すると自動で追加されてしまうものです)
properties.start-classの値に関してはパッケージ名やこのあと作成するApplicationクラスの名称が異なる場合には適宜変更してください

3. クラス作成
以下3つのクラスファイルを作成したパッケージ配下に作成してください
com.kakakikikeke.sample.Greeting.java
package com.kakakikikeke.sample;

public class Greeting {

     private final long id;
     private final String content;

     public Greeting(long id, String content) {
          this.id = id;
          this.content = content;
     }

     public long getId() {
          return id;
     }

     public String getContent() {
          return content;
     }
}
com.kakakikikeke.sample.GreetingController.java

package com.kakakikikeke.sample;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreetingController {

     private static final String template = "Hello, %s!";
     private final AtomicLong counter = new AtomicLong();

     @RequestMapping("/greeting")
     @ResponseBody
     public Greeting greeting(
               @RequestParam(value = "name", required = false, defaultValue = "World") String name) {
          return new Greeting(counter.incrementAndGet(), String.format(template,
                    name));
     }
}
com.kakakikikeke.sample.Application.java

package com.kakakikikeke.sample;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

     public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
     }
}
Application.javaは名称を変更した場合はpom.xmlのstart-classの定義も変更してください

4. mavenビルドの実行
Run Configurations からmavenの新規ビルドを作成してください
新規作成画面で以下のように設定します

入力が必要な箇所はName, Base directory, Goalsの3箇所です
入力が完了したら Apply -> Run としてください
ビルドが失敗する場合はGoalsの設定を「mvn clean package spring-boot:repackage」に変更して再度ビルドしてください
target/java-spring-sample-1.0.jarが作成できていればビルド成功となります

5. jarの実行と動作確認
jarの作成が完了したらjarを実行してアプリを起動します
プロジェクトのフォルダに移動してターミナルから以下のコマンドを実行してください
java -jar target/java-spring-sample-1.0.jar
エラーなく起動すれば起動完了です

ターミナルはそのままにしてブラウザでhttp://localhost:8080/greetingにアクセスしてみてください
JSONのレスポンスが返ってくるかと思います
「?name=hoghoge」のようにパラメータを付与するとブラウザの表示も変化するのがわかると思います

以上でSpringFrameworkを使った簡単なAPIの実装は完了です
SpringFrameworkには他にもいろいろな機能が揃っているのでこれをベースに機能の拡充をしていくのもいいかと思います

■参考サイト

2014年2月22日土曜日

checkinstallをインストールしてrpmパッケージを作成してみた

■環境
CentOS release 5.10 (Final)
rpmbuild 4.4.2.3

■checkinstallインストール手順
yum -y install rpm-build
cd /usr/local
git clone http://checkinstall.izto.org/checkinstall.git
cd checkinstall
make
make install
which checkinstall
  ※/usr/local/sbin/checkinstall にインストールされた

cd /usr/local/lib64/
ln -s /usr/local/checkinstall/installwatch/installwatch.so
  ※installwatch.soのシンボリックリンクを貼っています、/usrl/local/lib 配下へのシンボリックリンクはあったのですが、lib64 配下にはなかっで作成しました
  ※checkinstallが内部的に使用しているようです、上記は環境によってはちゃんとリンクされるので不要かもしれません

■checkinstallを試しに使ってみる
cd /var/tmp/
wget http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p484.tar.gz
tar zvxf ruby-1.9.3-p484.tar.gz
cd ruby-1.9.3-p484
./configure
checkinstall

  ※今回インストールした環境では「./configure」する環境が事前に整っていました、configure時にエラーが出る場合は各自yum等でパッケージをインストールしてから再度configureしてください
  ※checkinstallコマンドを実行すると、つらつらログが流れはじめるかと思います、途中で作成するパッケージの種類を聞かれるのでRPM(R)を入力します
  ※パッケージの情報を変更する場合は、そのあとに1から11の番号でパッケージの各項目を編集できるところがありますのでそこで設定します、ここで設定した情報は「rpm -qi」等のコマンドでパッケージの情報を確認するときに表示される情報となります
  ※checkinstallが完了するまでは結構時間がかかります、マシンの性能に左右される点もあるかと思いますがrubyは30分程度かかりました

/usr/src/redhat/RPMS/x86_64/ruby-1.9.3-p484-1.x86_64.rpm
に作成されたrpmがありました

■作成したrpmを試しにinstallしてみる
rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.9.3-p484-1.x86_64.rpm
準備中...                ########################################### [100%]
1:ruby-1.9.3             ########################################### [100%]
[root@localhost ruby-1.9.3-p484]# ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
[root@localhost ruby-1.9.3-p484]# which ruby
/usr/local/bin/ruby
[root@localhost ruby-1.9.3-p484]# rpm -qi ruby-1.9.3-p484-1.x86_64
Name        : ruby-1.9.3                   Relocations: (not relocatable)
Version     : p484                              Vendor: (none)
Release     : 1                             Build Date: 2014年02月18日 10時43分43秒
Install Date: 2014年02月18日 10時49分43秒      Build Host: localhost
Group       : Applications/System           Source RPM: ruby-1.9.3-p484-1.src.rpm
Size        : 255750452                        License: GPL
Signature   : (none)
Packager    : checkinstall-1.6.3
Summary     : This is a test ruby package.
Description :
This is a test ruby package.

無事インストールもできた

2014年2月21日金曜日

eclipseでmaven-android-pluginを使ってapkファイルを作成してみた

■環境
Windows 7
Eclipse Juno 4.3
※Android Development Tools for Eclipse と Android for Maven Eclipse プラグインのインストールも必要です
Android Development Tools(ADT)20130514
※事前にeclipseおよびADTのインストールは完了しているものとします

■手順
1. JDK1.6のインストール
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html
からJDK1.6の最新版のupdateをダウンロードします
ダウンロードにはOracleのアカウントが必要になりますのでない場合は作成してください
2014/02/19時点での1.6の最新は「update 65」でした
.exeファイルをダウンロードしインストールしたらeclipse上にJDKを登録します
Window -> Preferences -> Java -> Installed JREs
から設定します

2. maven3.1.1のインストール
http://maven.apache.org/download.cgi
から3.1.1以上のmavenをダウンロードします
zipファイルを展開後、適当な場所に配置すればインストール完了です
インストール完了後はeclipseにmaven3.1.1を登録してあげます
Windows -> Preferences -> Maven -> Installations -> Add
から配置したパスを選択すれば完了です

3. ANDROID_HOMEの確認
環境変数にANDROID_HOMEが設定されているか確認してください
設定がない場合は環境変数の追加を実施してください
コントロールパネル -> システムとセキュリティ -> システム -> システムの詳細設定 -> 環境変数 -> 新規
※ユーザー環境変数に追加してください
※Macの場合は.bash_profileにANDROID_HOMEの設定を記載してください

4. mavenプロジェクトへのコンバート
eclipseからAndroidプロジェクトをmavenプロジェクトにコンバートします
プロジェクトを右クリック -> Configure -> Convert to Maven Project
mavenプロジェクトに変更するとプロジェクトの再ビルドが走ります

おそらくJDKのエラーがでるのでプロジェクトに設定されているJavaをインストールしたJDK1.6に変更します
プロジェクトを右クリック -> Build Path -> Configure Build Path
でデフォルトで設定されているJRE1.5を選択しEditからインストールしたJDK1.6に変更します

5. pom.xmlの編集
以下はサンプルとなります
ポイントとなる部分を説明します
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.example</groupId>
 <artifactId>android_ncmb_sample</artifactId>
 <version>1.0</version>
 <packaging>apk</packaging>
 <name>android_ncmb_sample</name>

 <dependencies>
  <dependency>
   <groupId>com.google.android</groupId>
   <artifactId>android</artifactId>
   <version>4.1.1.4</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>com.google.android</groupId>
   <artifactId>support-v4</artifactId>
   <version>r7</version>
  </dependency>
  <dependency>
   <groupId>org.twitter4j</groupId>
   <artifactId>twitter4j-core</artifactId>
   <version>3.0.5</version>
  </dependency>
  <dependency>
   <groupId>local.lib1</groupId>
   <artifactId>gcm</artifactId>
   <version>1.0.2</version>
  </dependency>
  <dependency>
   <groupId>local.lib2</groupId>
   <artifactId>NCMB</artifactId>
   <version>1.2.0</version>
  </dependency>
 </dependencies>

 <build>
  <sourceDirectory>src</sourceDirectory>
  <resources>
   <resource>
    <directory>src/resource</directory>
   </resource>
  </resources>
  <plugins>
   <plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>3.8.2</version>
    <configuration>
     <sdk>
      <path>${env.ANDROID_HOME}</path>
      <platform>19</platform>
     </sdk>
    </configuration>
    <extensions>true</extensions>
   </plugin>
  </plugins>
 </build>
</project>

まず<plugins>タグを使って本題のmaven-android-pluginを有効にします
<version>タグに設定する値は最新のプラグインのバージョンを入力するようにしてください
<platform>タグにはAndroid SDK ManagerでインストールしてあるSDKのバージョンを入力してください、ここも最新のバージョンを入れておけば問題ないです

次に<packaging>タグをjarからapkに変更します
apkの指定はmaven-android-pluginをpom.xmlに定義していないとエラーとなります

3つ目にAndroidのコンパイルに必要なライブラリを定義します
<groupId>com.google.android</groupId>
のgroupIdに属するライブラリ2つを追加します

なおpom.xmlのdependencyでmavenのセントラルリポジトリからjarをダウンロードできる場合はローカル側のjarファイルは削除して問題ないです
後述しますがmavenのセントラルリポジトリに存在しないjarファイルはそのまま残しておいてください、あとでローカルのmavenリポジトリに登録します
(なので上記pom.xmlを記載しても現段階ではローカルリポジトリにjarが登録されていないのでエラーになるかと思います)

6. ソースコードおよびリソースファイル(プロパティファイル)の確認
同じくpom.xmlの説明になりますがソースコードおよびリソースファイルが存在するパスを<sourceDirectory>および<resources> -> <resource> -> <directory>でちゃんと定義してください
mavenのデフォルト設定の場合、ソースコードは「src/main/java」でリソースファイルは「src/main/resources」となります
今回は既存のAndroidプロジェクトからmavenプロジェクトへコンバートしているのでディレクトリが掘られていません
なのでpom.xmlでデフォルトとは違うソースのパスを指定してあげる必要があります
(src/main/javaとsrc/main/resourcesを作成してそれぞれにソースとリソースファイルを移動して対応しても問題ないとは思います(未検証))

7. ローカルリポジトリへjarの登録
mavenのセントラルリポジトリに存在しないjarファイルをローカルのリポジトリに登録します
実はmaven-android-pluginではscopeにsystemを利用することができないらしく、ダウンロードできないjarはローカルに登録してから参照する必要があります
http://code.google.com/p/maven-android-plugin/issues/detail?id=422

ローカルリポジトリへのjar登録はmavenコマンドかeclipseから実施する必要があります
mavenコマンドの場合はpom.xmlが配置しているパスで以下のコマンドを実行してください
mvn install:install-file -Dfile=libs/gcm.jar -DgroupId=local.lib1 -DartifactId=gcm -Dversion=1.0.2 -Dpackaging=jar

eclipseから実施する場合は
Run Configurations -> Maven Build -> New
でBase directoryにプロジェクトを選択したあとGoalsに「install:install-file」を設定しkey-valuesでパラメータを追加できるのでAddから以下のパラメータをそれぞれ追加します
  • file -> libs/gcm.jar
  • groupId -> local.lib.1
  • artifactId -> gcm
  • version -> 1.0.2
  • packaging -> jar
最終的には画面のようになっていればOKです、設定が完了したらApply -> Runとして実行します

この作業は使用するjarの数だけパラメータを変更して実施する必要があります
ただ、ビルド時に毎回実施する必要はなく、一度登録すれば再度ローカルのリポジトリに登録する必要はありません
ローカルのリポジトリに登録完了後も念のためjarファイルはプロジェクト内に残しておきましょう

8. apkファイルの作成
ようやくここまで来ました。。。
あとはgoalsに「clean install」を指定してmavenビルドすれば完了です
失敗する場合はeclipseに設定されているJavaやmavenのバージョンを再度確認してください
あとはTipsにトラブルシューティング的なことも記載しているのでそちらも御覧ください

以上で設定は完了です
今回は既存のandroidプロジェクトをmaven化しましたが、m2e-androidなるプラグインもあるようで、それのquickstartを使う方法もあるようです
全体的に結構大変でした。。。特にscopeにsystemが使えないのはハマりました

■Tips
・dex2jar
作成されたapkファイル内にclasses.dexというバイナリファイルがあります
これがAndroid上で動作するために必要なファイルなのですが、逆コンパイルしてJavaのソースコードを確認することができます
dex2jarがそのためのツールでdexふぁいるからjarファイルにファイル形式をコンバートしてくれます
.apkファイルはただのアーカイブファイルなので解凍したあとにclasses.dexに対してツールを実行すればOKです
http://code.google.com/p/dex2jar/downloads/list

・Plugin execution not covered by lifecycle configuration: com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.2:generate-sources (execution: default-generate-sources, phase: generate-sources)
上記がエラーに対してはeclipseの場合はQuickFixから修正すればOKです、QuickFixの上から2番目のやつを選択すればOKです
Mark goal generate-sources as ignored in Eclipse build on Eclipse preferences (experimental)

・No Android SDK path could be found.
Android SDKへのパスがうまく通っていません
ANDROID_HOMEを設定しましたが、その環境変数をeclipseがうまく認識していない可能性があります
システムを再起動してみたり、Macの場合はlaunchctlから環境変数を再度設定してからeclipseを起動してください

2014年2月19日水曜日

Jenkinsで他のJenkinsにジョブをインポートする方法

■実施方法
  1. Jenkinsのデータがある「jobs」ディレクトリ配下のジョブ名のディレクトリをコピー(またはリモードサーバに転送)
  2. 例えば「/root/.jenkins/jobs/job_name」など
  3. コピー(または転送)を実施したあとにインポートする側のJenkinsの再起動を実施
  4. コピーしたディレクトリ名のジョブをUI上で確認

以上です、簡単

上記の動作からJenkinsが同名のジョブを持つことができないのも納得かと思います
※同一ディレクトリ配下に同名のディレクトリを作成することはできないので

あとポイントとしてはディレクトリの権限で

Jenkins自体の動作はjenkinsユーザで行っているのにコピー作業をrootユーザで実施してしまったためにインポートしたジョブの権限がrootになってしまった

なんてことが発生しJenkinsがうまく起動できないことがあると思います
そんな場合は「chown -R jenkins:jenkins copy_job_name」などと実行してコピーしたジョブのディレクトリとその配下全体をjenkinsユーザの権限にしてから再起動すればOKです

基本的にJenkinsはディレクトリやファイルを元に動作しているので
これを応用してDropboxやGoogleDrive等のクラウドストレージサービスを使ってデータフォルダを共有すれば同じJenkinsデータを異なる端末で共有することもできると思います
※すいません、未検証です。。。

■参考サイト

2014年2月17日月曜日

Jenkinsで下流プロジェクトにビルドパラメータを渡す方法

■環境
Jenkins 1.525

■設定方法
1. Parameterized Trigger Plugin のインストール
Jenkinsの管理 -> プラグインの管理からParameterized Trigger Pluginを選択しインストールします
インストール完了後Jenkinsを再起動してください

2. 上流ジョブの作成
まずはビルドのパラメータを設定します
ジョブの設定の上部で「ビルドのパラメータ化」のチェックボックスをONにします
名前(変数名)やデフォルト値、説明は適当に設定してください


次にポイントの「ビルド後の処理の追加」で「Trigger parameterized build on other projects」を選択します


ビルド後の処理を追加したら
「Projects to build」
に下流のジョブをを設定します、ここでは下流のジョブを batch______test2 としています
下流ジョブを設定すると上流ビルドの終了後に自動で実行されるようになります
「Add Parameters」
も設定します、上流ジョブで設定されたパラメータを下流に渡すための「Current build parameters」を選択します
これで上流ジョブで設定されたパラメータを下流のジョブに渡すことができます


設定する箇所は以上です
あとは適宜必要なジョブの設定を追加してください

3. 下流ジョブの作成
特に設定することはありません、上流のジョブで設定されたパラメータを使用するビルドを作成してください
下流ジョブが自動で実行されるための設定は下流ジョブ側で実施する必要はありません
パラメータを使う方法は今回の場合だとパラメータの名前をTEXTと設定しているので「${TEXT}」のように使用します
適当にechoとかして表示するとパラメータが引き継がれていることがわかると思います

設定は以上で完了です
あとはBuild PipeLine Pluginがインストールされている場合は上流ビルドの流れをパイプラインで表示すると上流 -> 下流の流れが自動で設定されていることがわかるかと思います

2014年2月16日日曜日

Jenkinsを再起動する方法

http://jenkins-server-name/safeRestart/
とか
http://jenkins-server-name:8080/safeRestart/
とか
http://jenkins-server-name:8080/jenkins/safeRestart/

というURLにアクセスすると再起動を実施できます
ポイントはsafeRestartというパスにアクセスすると再起動できるというところです

Tomcat上で動作している場合は「service tomcat restart」等でJenkinsの再起動も可能ですが
chefでインストールした場合やwarを直接指定して動作させている場合にはプロセスを一度killしてから再度warを指定してJenkinsを起動する必要があります

それが面倒な場合にはURLでsafeRestartにアクセスすれば再起動を実施することができます
自分はいつもchefでJenkinsをインストールするので、トップ画面上部の説明の部分に再起動用のリンクを貼るようにしています
<a href="http://jenkins-server-name:8080/safeRestart">Jenkins再起動</a>

2014年2月14日金曜日

Jenkinsでワイルドカードを使う方法

■環境
Jenkins 1.550

■使い方
ワイルドカードを使いたい場合はフルパスを使ってアスタリスクを指定します
厳密に言うと「実行したジョブのworkspaceがカレントディレクトリ」になっているのでそこからの相対パスで指定すれば絶対パスである必要はありません

pwd コマンドのみを実行するビルドの結果を見てみるとカレントディレクトリが実行したジョブのworkspace配下であることがわかります


なので例えば「/var/tmp/test/」配下のファイルをすべて削除するというビルドを作成する場合は
「rm /var/tmp/test/*」
と指定するか
「rm ../../../../../var/tmp/test/*」
とする必要があります

カレントディレクトリの場所を把握して、相対パスで指定するのが面倒かなと感じたので冒頭で「フルパスを指定します」と書いた次第です
ちょっとはまりそうだったのでメモとして残しておきました

2014年2月10日月曜日

GithubのWebHookを使ってJenkinsのビルドを実行する方法

■概要
Githubはpushしたときにいろいろなサービスに「pushした」ということを通知する機能(Service Hooks(WebHook))があります
今回はWebHookの機能を使ってpushされたらビルドを実行するという流れをJenkinsで実現したいと思います

■環境
Windows Server 2008R2
Jenkins 1.549
※JenkinsサーバがWindows上で動作している環境で試しました
※Linux上のJenkinsでも問題なく動作するかと思います

■設定方法
1. Githubプラグインのインストール(Jenkins側設定)
Jenkinsの管理 -> プラグインの管理 -> 利用可能
で右上の検索窓に「github」と入力します
絞りこまれた一覧の中に「GitHub Plugin」という名前のプラグインがありますのでチェックしダウンロードして再起動後にインストールをクリックしてインストールを開始します
自動でインストールが始まりますので完了するまで待ちます

2. WebHookで実行するジョブの作成(Jenkins側設定)
Jenkins上でWebHookされた場合に実行するジョブを作成します
ジョブ作成時のポイントは
  • GitHub project の欄にリポジトリのURLを記載します、記載するURLはブラウザで表示する際のURLを入力してください
  • ソースコード管理 -> Git で GithubのgitリポジトリのURLを記載します、git://から始めるURLを記載してください、git clone用のURLの「https://」の部分を「git://」に変更すればOKです
  • ビルド・トリガ -> Build when a change is pushed to GitHub のチェックボックスをONにします
あとはいつも通りビルドを作成すれば大丈夫です

3. WebHookの設定(Github側設定)
WebHookを実施するリポジトリに設定します
リポジトリのトップ画面から右側にあるSettingsをクリックします


遷移した画面左側、Service Hooksをクリックします


WebHook可能なサービスの一覧が表示されますので中段より下のほうにある「Jenkins(GitHub Plugin)」をクリックします


Jenkins Hook Urlに通知を送信するJenkinsサーバのエンドポイントを入力します
hostnameやportは適宜変更してください、パスの後ろに記載されている「github-webhook/」は必ず入力してください
ActiveのチェックボックスをONにします


入力が完了したらUpdate settingsをクリックします
今回、JenkinsのGithub Pluginを使用していますが、その場合に後ろのパスの部分は必須の項目となります
またサンプルのURLはhttpで接続しています、どうやらhttpsだと証明書の関係等でうまく通知が受け取れないことがあるので、できればhttpで受け取ってください

4. GithubからのIPを許可する
これでGibHubからJenkinsサーバに通知が来るようにはなりました
FW等でアクセス拒否をしている場合にはGithubのIPアドレスを許可する必要があります
GithubのIPアドレスはGithubのMetaAPIで確認することが可能です
https://api.github.com/meta
2014/02/06時点では「192.30.252.0/22」が返却されました
WebHookからビルドがうまく動かくなった場合はIP変わっている可能性もありますので定期的に確認してみてください

5. 動作確認
GithubからWebHookのテストを実行することが可能です
JenkinsのURLを設定した画面で「Test Hook」をクリックするとJenkins側に通知を送信することができます
「Test payload deployed!」と表示されればGithub側は通知したことになります(あくまでも通知をしたということだけがわかるので、ちゃんとJenkins側が受け取っているかはここではわかりません)

Jenkins側に戻って設定したジョブから「GitHub Hook Log」を見るとTest Hookしたログが残っているかと思います
また同時にビルドが実行されていることも確認できるかと思います
ビルドされる条件はもちろんWebHookが来たらなのですが、gitの情報が変更されていない場合はビルドは実行されません
なので連続でTest Hookを実行してもgitの情報は変更されていないため連続でビルドは実行されません

以上です、githubのソースコードをCIするための基本となる動作を紹介しました

2014年2月8日土曜日

Nexus7を修理に出す方法

■背景
Nexus7の液晶が突如表示されなくなり真っ暗の画面のままになってしまいました
特に強い衝撃を与えたわけではないのですが、発生してしまいました(日頃から持ち歩いていたので小さいな衝撃はあったと思いますが)
強制再起動(スタート+音量の上下長押し)や数日充電してからの電源ON等も試してみましたがうんとも言わず
ただ、電源は入っているようでうっすら砂嵐のような線が表示されているのは確認できたので、液晶自体が壊れてしまった感じがします
どうしようもないので、修理に出すことにしました
ググったりすると結構Nexus7を修理に出したりしている人がいたので自分もその手順をまとめておきました
参考になれば。。。ちなみに旧Nexus7です(2013年に発売されたモデルではありません)

■手順1. Asusのサポート窓口へ問い合わせ
電話でもOKですが中々つながらないとのことだったのでメールで問い合わせしました
以下のURLにアクセスします
https://vip.asus.com/VIP2/Services/QuestionForm?lang=ja-jp

問い合わせ用のフォームにアクセスできますので必要な情報を入力して問い合わせ情報を送信します
以下フォーム入力時のポイントです
  • 1番はじめのカテゴリは「技術サポート」を選択
  • シリアル番号はNexus7購入時の箱の側面に記述されている「CSSN」ではじまる番号を入力
  • 製品タイプは「Eee Pad」を選択
  • 製品タイプを選択すると製品モデルが自動で読み込まれるので「Nexus7」を選択
  • 問題点に現象をいろいろ記載(今回の場合だと液晶がおかしい点と強制再起動しましたとかを書きました)
  • 送信時に確認画面が無いので一番下の「送信」を押下するといきなり送信されるので送信する際には注意すること
問い合わせが完了すると完了メールが来ます
そして、自分は完了メールが来た翌日くらいにAsusの担当者からメールが来ました
メール本文を記載することはできませんでしたが内容を要約すると「その現象は修理しないと直らないのでNexus7を修理に出して下さい」とのことでした

■手順2. 必要な書類の作成、収集
修理に必要な書類は全部で4つです
  • 修理依頼書
  • 購入日(購入店)を確認することができる書類
  • 保証書
  • 佐川急便の着払い用伝票

まず「修理依頼書」ですが、これはAusuの公式ページからダウンロードできます
メールの返信にURLが記載されていました
http://support.asus.com.tw/images/file/ASUS%20Japan%E4%BF%AE%E7%90%86%E4%BE%9D%E9%A0%BC%E7%A2%BA%E8%AA%8D%E6%9B%B8.pdf
ダウンロードし必要な情報を手書きで記載します
1. で問い合わせた際と同じような情報を記載します
(もしかすると問い合わせをしないでいきなり書類を集めて送りつけても問題ないかもしれませんが。。。)
途中、同意するか否かみたいな項目がありますが基本は同意したほうがいいと思います
たぶんデータが初期化されたり、変なことされるけど、修理して直る可能性が高くなるんだと思います
修理の見積もりの部分に関しては何でもいいと思います、いろいろとWebで情報を探してみるとNexus7系の修理は基本「無料修理」か「無料新品」交換なのでどれを選択しても問題はないかと思います
ちなみに自分は「不要(連絡なしの修理可)」にしました
記載が完了したらOKです

次に「購入日(購入店)を確認することができる書類」です、もしかするとこれが一番収集しにくいかもしれません
フォーマットは問いません、購入時のメールであったりレシートであったり日付と店舗名が記載されていればOKです
自分はGooglePlayで購入したのでGooglePlayの購入完了メールを印刷して同梱しました
また、不確定ではありますがNexus7購入時に同梱されている保証書に購入店舗の情報が記載もしくは店舗印が押されていれば、それでも大丈夫かもしれません
とにかく「時期」と「場所」がわかればOKです
なんでこんな情報が必要なのかはわかりませんが、保証期間とか購入日あたりに出荷されたNexus7のバグ状況とかを確認するのに使うんでしょうか
とりあえず何かしら集められればOKです、修理に出すときに同時に梱包する必要があるので紙等に印刷しておいてください

3つ目に「保証書」です
これはNexus7を正規に購入していれば必ずついているものだと思います
中古やネットオークションだとついていない可能性があるかと思います
これは特に記載する必要はないかと思います、そのまま送付物に同梱してください

4つ目に「佐川急便の着払い用伝票」です
これは佐川急便に問い合わせるしかありません(Webで伝票を印刷できるサービスもあるようですが、問い合わせたほうが楽です)
問い合わせはお住まいの地域の担当営業所の集荷案内に問い合わせしてください
佐川急便のホームページから担当営業店を検索できるので検索し、そこに集荷案内の電話番号がありますのでそこに電話してください
http://www.sagawa-exp.co.jp/search/branch_search/
集荷の依頼と同時に着払い伝票も持ってきてもらうように伝えて下さい
集荷時に伝票を持ってきてくれるので直接そこでAsusの修理専用の宛先を記載してそのまま発送することができます
もちろん事前に伝票だけ持ってきてもらうことも可能です
Asusの宛先は問い合わせメールの返信に記載してあります、一応自分は以下の宛先が記載してありました
住所:〒136-0075 東京都江東区新砂2-2-11 佐川東京ロジスティクスセンター5F
宛先:エイスースジャパン修理サービスセンター 宛
電話番号:0800-123-2787
地域によっては異なる可能性もあるので正確にはAsusからの返信メールを参照するようにしてください

■手順3. 修理品の発送
書類の準備が完了したらあとは梱包して発送するだけです
梱包は簡易梱包でもいいですが、小さめのダンボールを用意してそこに「Nexus7本体」+「書類4部」を同梱するのがいいと思います
緩和材もできればいれたほうがいいと思います、Nexus7本体が入っているのですでに壊れているとはいえ更に悪化させないためには緩和剤を入れたほうがいいでしょう
緩和剤がない場合は新聞紙やビニール袋を詰めても緩和剤の代わりになります
あとは着払い伝票の貼り付けて発送すればOKです
集荷に来てもらってもいいし、営業店舗が近ければ直接持って行っても問題ないです

■手順4. 修理したNexus7の到着
あとはひたすら修理されるのを待ちます
だいたい手元に戻ってくるまでに発送から2週間くらいはかかると思っていてください
自分は発送(2014/1/25)から11日後(2014/02/05)に戻ってきました
また、修理完了後にサポートに関するアンケートがメールで届いたので回答しておきました

以上です
修理出すことがあれば参考にしていただければと思います

2014年2月7日金曜日

Macにtmux をインストールする方法

■環境
Mac OSX 10.8.5
Homebrew 0.9.5
tmux 1.8

■インストール方法
1. Homebrewのインストール
HomebrewというMacパッケージ管理ツールがありこれを使用すると簡単にtmuxをインストールすることが可能です
Homebrewのインストール方法は以下を参照ください
http://kakakikikeke.blogspot.com/2014/02/machomebrew.html

2. tmuxのインストール
brew install tmux
※インストールはこれだけで完了です

3. .tmux.confの配置と設定
上記だけでもtmuxはすでに使用できる状態ですが、prefixキー等を変更したくなることがあるかと思います
Linuxの場合は実行するユーザのホームディレクトリ配下に「.tmux.conf」を配置し実行すればOKでした

以上です
Macにtmuxをインストールするのは結構たいへんなイメージだったのですが、これで簡単にインストールできました

2014年2月6日木曜日

【Mac】Homebrewをインストールする方法

■環境
Mac OSX 10.8.5
Homebrew 0.9.5
ruby 1.9.3p448

■インストール方法
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

P.S 20141223
ワンライナーのインストール方法が変わっていたので修正しました
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

※rubyをインストールしていない方はrubyを際にインストールしてください
※自分はめんどうなのでchefと一緒にインストールしました
http://kakakikikeke.blogspot.jp/2013/03/chefomnibus.html

■使い方
・インストール
  brew install mysql
・インストール情報の表示
  brew info mysql
・インストール済みパッケージの表示
  brew list
・インストールしたいパッケージの検索
  brew search mysql
・アンインストール
  brew uninstall mysql
・アップデート
  brew update mysql
・サードパーティリポジトリの追加
  brew tap username/repository
・サードパーティリポジトリの確認
  brew tap
・その他、指定できるオプションの表示
  brew

■仕組み
brewはrubyで出来ています
インストールしたパッケージは/usr/local/Cellar/配下で各バージョンごとに管理されています
バイナリの実態は/usr/local/bin/配下にシンボリックリンクが貼られることで実行できるようになっています

2014年2月5日水曜日

SSHの公開鍵ノンパス認証で「You are required to change your password immediately」

hostname1 -> hostname2
に公開鍵認証を使ってsshのノンパスログインをしようとしたのですが
以下のようなエラーが出力されてうまくできませんでした

You are required to change your password immediately (root enforced)
Last login: Wed Feb 5 11:37:38 2014 from xxx.xxx.xxx.xxx
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user nifbat.
Changing password for nifbat
(current) UNIX password:

hostname1ではssh-keygenコマンでを使ってid_dsa.pubとid_dsaファイルをパスワードなしで作成し
hostname2には上記で作成したid_dsa.pubファイルをauthorized_keysに書き込みました
.sshやauthorized_keysの権限は正しく設定されています

なぜだろうと悩んだ挙句、原因はログインしようとしているユーザにパスワードが設定されていないことが原因でした
passwdコマンドでパスワードを設定すれば問題ないのですが、以下の方法でも対応できましたので紹介しておきます

vim /etc/shadow
nifbat:.....:0:0:99999:7:::
↓
nifbat:.....:1:0:99999:7:::

shadowファイルを編集して強制的にパスワードが設定されているようにする方法です
どうしてもpasswdでパスワードを設定したくない場合にはこれでも解決できます

2014年2月4日火曜日

Travisを使ってみた

■概要
Travisとはgithubと連携したオープンなCI(Continuous Integration)ホスティングサービスです
JenkinsのようなCIサーバを独自で構築する必要がなくなるというのがメリットです
Githubのアカウントが必須となりますのでお持ちでない方はまずはGithubのアカウントを作成してください

■使い方
1. Travisへのログイン
https://travis-ci.org/
にアクセスします
右上の「Sign in with Github」をクリックします

※クリックすると拡大されます

GithubのOAuthのページにリダイレクトされるのでTravisからのアクセスを許可します

2. WebHook機能のON
初回ログイン時にはTravisがGithubからリポジトリの情報を取得するため多少時間がかかります
リポジトリの情報の取得が完了すると以下のようなリポジトリ一覧が表示されるかと思います


Travisと連携したい自分のリポジトリを選択し右側のON/OFFトグルボタンをONにします


これでGithubとTravisとのWebHookによる連携が完了しました、WebHook機能を使うことでGithubにpushされた情報をTravis側に通知してあげることができます、それによりpushをトリガーとしてTravisが自動実行されるようになります

3. .travis.ymlファイルの作成
Travisと連携したリポジトリのルート直下に「.travis.yml」ファイルを作成します
.travis.ymlファイルはTravis上で実行するビルドのルールを記載するものです
今回はJavaのリポジトリをTravisでビルドさせるために以下のように.travis.ymlファイルを記載しました
language: Java
jdk:
  - oraclejdk7
  - openjdk6
  - openjdk7
.travis.ymlの書き方は参考サイトに記載されているGetting Startedのページに各言語ごとの簡単なサンプルが記載されています
また、そこから各言語ごとの詳細な設定方法のページへもリンクしているので詳細はそちらを御覧ください

今回設定したのサンプル通りですが、見ての通りJDKを複数バージョン指定することができます
Travisは指定したバージョン分ビルドを実行してくれるため所謂、クロスプラットフォーム分散ビルド的なこともTravis上で実現することが可能となっています
(いちいち各バージョンごとのビルド環境を構築するのって大変ですからね。。。)

4. git push
あとは作成した.travis.ymlファイルをGithubにコミットすれば完了です
WebHookの情報はすぐにTravis側に通知されるようなのでTravis側のビルド結果を確認してみましょう


結果の詳細を確認することができるかと思います
各JDKごとのビルド結果を見れることはもちろん、Jobからリンクを辿って確認すれば実際に裏側で実行されたコマンドベースの結果を閲覧することも可能です

今回は残念ながら全部のビルドが失敗しているようですが、コマンドの結果を見てみるとSeleniumのテストをmaven経由で実行しておりX環境がないためにエラーとなっていました
https://travis-ci.org/kakakikikeke/java-selenium-ui-test/jobs/18171596
いろいろ調べてみるとSeleniumのようなUIテストもTravis上で実行する方法があるようなので次回Seleniumを実行する方法でも紹介できればと思っています

今回紹介する内容は以上です
基本中の基本の部分だけなのであとはビルドの内容をどうするかをもっと詳細に決めていく必要があります

■Tips
プライベートリポジトリに対応したプライベート版のTravisもあるようです、プライベート版は有料でご利用できます
基本的にTravisはパブリックなサービスなのでビルド結果は誰でも閲覧することが可能となっています
なのでパスワードや見られてはいけない情報などがビルド結果に出ないように注意してください

今回実はmavenプロジェクトだったのですが、.travis.ymlファイルにmavenプロジェクトであることを記載していないのに自動でmavenビルドしてくれました
仕組みは詳しく調べていないので分かりませんが、pom.xmlファイルの存在等を調べて自動で判断してくれているのかもしれません

■参考サイト