2013年11月27日水曜日

【python】easy_installでインストールしたパッケージの一覧を確認する方法

python2.6の場合

cat /usr/lib/python2.6/site-packages/easy-install.pth

2.4の場合は「python2.6」->「python2.4」に変更すれば確認可能です

easy_installはpythonのバージョンごとにインストールしているパッケージを管理しているため、2.6でインストールしたパッケージは2.4でもインストールしないと使用することはできません

【PHP】GoogleCustomSearchAPIを使って検索結果を取得する

<?php
require_once "HTTP/Client.php";

# define
$api_key = 'Please input your api_key';
$custom_search_key = 'Please input your google custom search id';
$input_file = 'keyword_list.csv';
$result_file = 'result.tsv';
$sleep_time = 10;

$csv = array();
$fp= fopen($input_file, "r");
$fp2 = fopen($result_file, "w");

while (($data = fgetcsv($fp, 0, ",")) !== FALSE) {
  $csv[] = $data;
}
fclose($fp);
#var_dump($csv);

$client =& new HTTP_Client();
for ($i = 1; $i < count($csv); $i++) {
  $keyword = $csv[$i][1];
  $urlStr  = "https://www.googleapis.com/customsearch/v1?key=" . $api_key . "&cx=". $custom_search_key . "&q=" . urlencode($keyword) . "&alt=json";
  #echo $urlStr;
  fwrite($fp2, $i . "\t" . $keyword . "\t");

  $client->get($urlStr);
  $response = $client->currentResponse();
  $json = json_decode($response['body'], true);
  if (array_key_exists('items', $json)) {
    $items = $json['items'];
    for ($j = 0; $j < count($items); $j++) {
      #var_dump($items);
      $items_info = $items[$j];
      fwrite($fp2, str_replace(array("\r\n","\r","\n"), '', $items_info['title']) . "\t" . str_replace(array("\r\n","\r","\n"), '', $items_info['snippet']) . "\t");
      #echo 'title : ' . str_replace(array("\r\n","\r","\n"), '', $items_info['title']) . "\r\n";
      #echo 'snippet : ' . str_replace(array("\r\n","\r","\n"), '', $items_info['snippet']) . "\r\n";
    }
  }
  fwrite($fp2, "\r\n");
  sleep($sleep_time);
}
fclose($fp2);
?>

■準備
1. APIキーの取得
GoogleCloudConsole (https://cloud.google.com/console) にアクセスしてAPIキーを取得します
Registered appsから取得します
取得したAPIキーは上記ソースコード中の「$api_key」の部分にセットします

2. カスタム検索エンジンIDの取得
Googleカスタム検索 (https://www.google.co.jp/cse/all) にアクセスして検索エンジンIDを取得します
検索エンジンがない場合は Add から検索エンジンを作成してください
ポイントとしては検索するサイトに「www.google.co.jp/*」を入力し
作成後の編集画面で検索サイトの部分を「追加したサイトを重視して、ウェブ全体を検索する」を選択します
検索エンジンが作成できたら
基本 -> 詳細 -> 検索エンジンID をクリックしてIDを取得します
取得した検索エンジンIDは上記ソースコード中の「$custom_search_key」の部分にセットします

3. HTTP_Clientのインストール
pear install HTTP_Client
※pear自体のインストールに関しては→http://kakakikikeke.blogspot.jp/2013/11/phppearphp.html

2013年11月26日火曜日

pythonのバージョンをアップデートするとyumが動かなくなるときの対応

■環境
CentOS 5.9
python 2.4.3 -> 2.6.8

■エラー内容
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.6.8 (unknown, Nov 7 2012, 14:47:45)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)]

If you cannot solve this problem yourself, please go to
the yum faq at:
http://wiki.linux.duke.edu/YumFaq

■対処方法
emacs /usr/bin/yum
上記のファイルの先頭部分を変更
#!/usr/bin/python
↓
#!/usr/bin/python2.4
明示的に2.4のバージョンのpythonを使うように変更しましょう

2013年11月24日日曜日

【PHP】csvに書かれているキーワードの一覧からGoogle検索を実施するスクリプト(非推奨)

<?php
require_once './simple_html_dom.php';

$csv = array();
$input_file = 'keyword_list.csv';
$fp= fopen($input_file, "r");
$result_file = 'result.csv';
$fp2 = fopen($result_file, "w");
$search_result_count = 10;
$sleep_time = 10;

while (($data = fgetcsv($fp, 0, ",")) !== FALSE) {
  $csv[] = $data;
}
fclose($fp);

#var_dump($csv);

for ($i = 1; $i < count($csv); $i++) {
  $keyword = $csv[$i][1];
  $urlStr  = "http://www.google.co.jp/search?num=$search_result_count&q=" . urlencode($keyword) . '&ie=utf-8&oe=utf-8';
  $html = file_get_html($urlStr);

  $lcnt = 1;
  fwrite($fp2, $i . ',' . $keyword . ',');
  $result = '';
  foreach($html->find('h3[class=r]') as $e) {
    $result_title = preg_replace('/<a href=(.+?)>/', '', $e->outertext);
    $result_title = preg_replace('/<b>|<\/b>|<\/a>|<h3 class="r">/', '', $result_title);
    $result_title = preg_replace('/<\/h3>/', '', $result_title);
    $result = $result . $result_title . ',';
    $lcnt++;
  }
  $result = rtrim($result, ",");
  fwrite($fp2, $result . "\r\n");
  sleep($sleep_time);
}
fclose($fp2);
?>

simple_html_dom.php は
http://sourceforge.net/projects/simplehtmldom/files/
からダウンロードして上記スクリプトと同じディレクトリ内において実行ください

ちなみにこのスクリプト内で実施している検索はGoogle Search APIを使用しておらず頻繁に利用するとGoogleからBANされ、結果がすべて302にリダイレクトされます
大量に使用する場合はちゃんとGoogle Search APIを利用してください

2013年11月23日土曜日

elasticsearch+kibana3で /var/log/messages を簡単に解析してみた

■事前準備

■/var/log/messagesを解析
1. 解析スクリプトを使ってelasticsearchにデータを投入
以下のスクリプトを適当な場所に配置し実行します
事前に「elasticsearch -f」でelasticsearchを起動しておいてください
#!/bin/sh

count=1
cat /var/log/messages | while read line
do
  date=`echo ${line} | awk '{print $1,$2,$3}'`;
  hostname=`echo ${line} | awk '{print $4}'`;
  message=`echo ${line} | awk '{for(j=5;j<NF;j++){printf("%s ",$j)}print $NF}'`;
  timestamp=`date "+%Y-%m-%d %H:%M:%S"`
  #echo ${date} ${hostname} ${message}
  curl -X POST http://localhost:9200/system/message/${count} -d "{\"date\":\"${date}\",\"hostname\":\"${hostname}\",\"message\":\"${message}\",\"@timestamp\":\"${timestamp}\"}"
  echo ${count};
  count=`expr ${count} + 1`;
done
内容としては/var/log/messagesをdateとhostnameとmessageに分割してelasticsearchにPOSTしています
/var/log/messages全行を処理してデータを投入します

2. @timestampの_mappingを変更する
@timestampフィールドは「type」が「date」でなければいけません
上記スクリプトで投入したデータは「type」が「string」になってしまっているので「date」に変換してあげます
現状のmappingは以下のコマンドで取得できます
curl -X GET http://localhost:9200/system/message/_mapping

elasticsearchにはmappingというメタ情報を持っており、これをPUTで更新してあげることで type を変更します
また、mapping は一回データを投入したあとではすでにmappingが確定してしまっているため一度削除してから更新する必要があります

curl -X DELETE http://localhost:9200/system/message/_mapping
curl -X PUT http://localhost:9200/system/message/_mapping -d '{"message": {"dynamic":"true","properties": {"@timestamp" :{"type":"date", "format":"YYYY-MM-dd HH:mm:ss"},"date":{"type":"string"},"hostname":{"type":"string"},"message":{"type":"string"}}}}'
※タイムスタンプ形式で「T」や「Z」が入ってしまうパターンがありますが入れないほうがいいです、うまくelasticsearchがパースできずグラフがうまく表示されないことがあります

これでelasticsearch側のデータ登録は完了です
あとはkibana3で可視化してみます

3. kibana3でグラフ作成
http://localhost:9200/kibana
にアクセスし画面下部の「Blank Dashboard」をクリックします


ダッシュボードの設定画面が表示されるので画面右上のダッシュボード設定ボタンをクリックします


Generalからダッシュボードの名前を設定します


Indexから登録したデータのindexのみを表示するようにします(デフォルト「_all」なのでそれでも問題ないです)


次にダッシュボードに戻り右下にある「ADD A ROW」をクリックします
グラフを表示するための行を追加していきます


行を追加できるダイアログが表示されますので title に「pie」「histogram」「table」の3つを入力して Create Row をクリックします


各行にパネルを追加していきます
画面の構成は「ダッシュボード」->「ロウ」->「パネル」の順で構成されています
先ほど3つのロウを追加したので1つ目の「pie」からパネルを追加していきます
ダッシュボードの左にある「Add panel to empty row」をクリックします


パネルを追加するダイアログが表示されますのでプルダウンから「pie」を選択し Add Panel をクリックしてパネルを追加します


同様に「histogram」「table」をプルダウンから選択して追加していきます
先ほどと違うのはspanの欄に 12 を入力して横いっぱいのパネルを作成します




追加後に以下のようになればOKです
事情により_idと_indexのみ表示しています
カラムの絞り込みはtableパネルで左の項目から表示したい項目にチェックをすると絞り込みが可能です


これで最低限のグラフの作成は完了です
肝はヒストグラムで@timestampがうまくparseできないとグラフが描画されません
また、ヒストグラムで表示しているのは「指定した期間内でヒットするデータの数」になるので細かく時系列ごとに見たい場合(秒間リクエスト数など)は範囲を1mや5m等の短い時間で指定することで見たいグラフが表示されるかと思います
今回使用したデータテストデータなのです、timestampも適当ですが、実際にはログのtimestampをうまくparseしてそれをelasticsearchに登録する感じになると思います

※今回elasticsearchに投入したデータだと以下のようなヒストグラムを見ることができるようになります
Interval:1s Line, Points, Stack:ON



■Tips
作成したグラフを保存する場合は右上のフロッピーのようなアイコンから「Save」->「Advanced」->「Set as my home」をクリックすると次回ダッシュボードアクセス時に今回作成したダッシュボードが表示されます
違いダッシュボードを作成したい場合は「Clear my home」をクリックすると次回アクセス時に初回画面が表示されるようになります

2013年11月22日金曜日

【emacs】php-modeのインストール方法

■環境
CentOS 5.9
GNU Emacs 23.4.1

■インストール手順
http://downloads.sourceforge.net/project/php-mode/php-mode/1.5.0/php-mode-1.5.0.tar.gz?r=http%3A%2F%2Fphp-mode.sourceforge.net%2F&ts=1384992949&use_mirror=jaist
tar zvxf php-mode-1.5.0.tar.gz
cd ~/.emacs.d/site-lisp/
mv /var/tmp/php-mode-1.5.0 .

emacs ~/.emacs
以下を追記する
(load-file "~/.emacs.d/site-lisp/php-mode-1.5.0/php-mode.el")
(push '("\\.php$" . php-mode) auto-mode-alist)

■動作確認
emacsを再起動(Ctrl+x, Ctrl+cで抜けて起動するだけ)
emacs sample.php
とすると以下のような感じで色付けされます

Githubで公開しているchefのemacs cookbooksも対応しました
https://github.com/kakakikikeke/cookbooks-emacs

2013年11月20日水曜日

【AWS】SimpleQueueServiceクイックスタート for PHP(pear編)

■環境
CentOS 5.9 64bit
PHP 5.3.3
pear 1.9.4

■クイックスタート
1. pearでawsのphp用のファイルをダウンロードしてくる
pear install Services_Amazon_SQS-0.3.0
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
downloading Services_Amazon_SQS-0.3.0.tgz ...
Starting to download Services_Amazon_SQS-0.3.0.tgz (34,121 bytes)
.........done: 34,121 bytes
downloading HTTP_Request2-2.1.1.tgz ...
Starting to download HTTP_Request2-2.1.1.tgz (99,151 bytes)
...done: 99,151 bytes
install ok: channel://pear.php.net/HTTP_Request2-2.1.1
install ok: channel://pear.php.net/Services_Amazon_SQS-0.3.0
※このときpearのバージョンが1.9.2以上ないとERRORとなりインストールできませんのでpearのバージョンが古い方はpearのバージョンをアップグレードしてください

2. アクセスキーとシークレットキーの取得
https://portal.aws.amazon.com/gp/aws/securityCredentials
アクセスしawsのアカウントでログインします

vim /usr/cfg/Services_Amazon_SQS/sqs.ini
に取得したアクセスキーとシークレットキーを記載します
※「sqs」とコマンドを打つとエラー文中に設定ファイルを記述する箇所が表示されますので上記の設定ファイルがない場合は自分の環境の設定ファイルの場所を確認してください
※アクセスキーとシークレットキーを設定後に「sqs」と打つと指定できるコマンドの一覧が表示されます

3. コマンドから実行する
pear経由で実行するとbash上でコマンドとして実行しSQSにアクセスすることができるようになります
デフォルトのリージョンは「us-east-1」に作成されるようです
・キューを作成する
  sqs create kaka_queue001
・キューの一覧を取得する
  sqs list
・メッセージを送信する
  echo "test" | sqs send http://queue.amazonaws.com/000000000000/kaka_queue001
・メッセージを受信する
  sqs receive http://queue.amazonaws.com/000000000000/kaka_queue001
※MaxNumberOfMessagesは指定できないので1つずつ受信する
・キューを削除する
  sqs delete http://queue.amazonaws.com/000000000000/kaka_queue001
※000000000000の部分はアカウントごとに設定されているIDを入力します
※Queue URLは「sqs list」でも取得で取得できた値をそのまま入力すればOKです

4. ソースコードから実行する
vim sqs_test.php
<?php
  require '/usr/share/pear/Services/Amazon/SQS/Queue.php';

  $accesskey='your accesskeyId';
  $secretkey='your secretkeyId';
  $accountId='your accountId ex) 000000000000';
  $queueName='kaka_queue001';
  $queueURL='http://queue.amazonaws.com/' . $accountId . '/' . $queueName;

  // send message
  $sqs=new Services_Amazon_SQS_Queue($queueURL, $accesskey, $secretkey);
  try {
    $sqs->send('test message');
  } catch (Services_Amazon_SQS_Exception $e) {
    trigger_error($e->getMessage());
  }
?>

php sqs_test.php
とするとkaka_queue001に「test message」というメッセージが送信されます

どうやら最近はpearでやるよりかはcomposerでやるほうがモダンらしいので
次回はcomposerでもやってみたいと思います

■参考

2013年11月19日火曜日

【PHP】pearをバージョンアップする方法

■バージョンアップ手順
wget http://pear.php.net/go-pear.phar
php go-pear.phar
※以下バージョンアップ実行時の標準出力

Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix) : /usr
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/bin
5. PHP code directory ($php_dir) : /usr/share/pear
6. Documentation directory : /usr/docs
7. Data directory : /usr/data
8. User-modifiable configuration files directory : /usr/cfg
9. Public Web Files directory : /usr/www
10. Tests directory : /usr/tests
11. Name of configuration file : /etc/pear.conf

1-11, 'all' or Enter to continue:
Beginning install...
Configuration written to /etc/pear.conf...
Initialized registry...
Preparing to install...
installing phar:///var/tmp/go-pear.phar/PEAR/go-pear-tarballs/Archive_Tar-1.3.11.tar...
installing phar:///var/tmp/go-pear.phar/PEAR/go-pear-tarballs/Console_Getopt-1.3.1.tar...
installing phar:///var/tmp/go-pear.phar/PEAR/go-pear-tarballs/PEAR-1.9.4.tar...
installing phar:///var/tmp/go-pear.phar/PEAR/go-pear-tarballs/Structures_Graph-1.0.4.tar...
installing phar:///var/tmp/go-pear.phar/PEAR/go-pear-tarballs/XML_Util-1.2.1.tar...
install ok: channel://pear.php.net/Archive_Tar-1.3.11
install ok: channel://pear.php.net/Console_Getopt-1.3.1
install ok: channel://pear.php.net/Structures_Graph-1.0.4
install ok: channel://pear.php.net/XML_Util-1.2.1
install ok: channel://pear.php.net/PEAR-1.9.4
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
PEAR: To install optional features use "pear install pear/PEAR#featurename"

The 'pear' command is now at your service at /usr/bin/pear

** The 'pear' command is not currently in your PATH, so you need to
** use '/usr/bin/pear' until you have added
** '/usr/bin' to your PATH environment variable.

Run it without parameters to see the available actions, try 'pear list'
to see what packages are installed, or 'pear help' for help.

For more information about PEAR, see:

http://pear.php.net/faq.php
http://pear.php.net/manual/

Thanks for using go-pear!

上記でpearのバージョンアップは完了です
1-11の数字の入力を求められるところはとりあえずEnterを入力すれば問題ありません
実際にinstallされたpearのバージョンを確認する方法は「pear list」でPEARのバージョンを確認してください
2013/11/19現在でバージョンアップした際のPEARのバージョンは「1.9.4」でした

■Tips(バージョンアップできないときによく出るエラー)
pear upgrade PEAR-1.5.4
ERROR: unable to unpack /tmp/tmpACbIi9/Structures_Graph-1.0.4.tgz
http://stackoverflow.com/questions/8571925/upgrading-pear-on-x86-64-gnu-linux

2013年11月16日土曜日

【Java】HashMapを「=」でコピーすると参照元のマップオブジェクトのデータも削除される

まずはサンプルソースと結果を御覧ください

■サンプルソースコード1
package com.kakakikikeke.sample.test;

import java.util.HashMap;

public class Test {

 public static void main(String[] args) {
  HashMap<String, String> map1 = new HashMap<String, String>();
  map1.put("key1", "value");
  map1.put("key2", "value");
  System.out.println("* before");
  for (String key: map1.keySet()) {
   System.out.println(key);
   System.out.println(map1.get(key));
  }

  HashMap<String, String> map2 = map1;
  map2.remove("key1");
  System.out.println("* after");
  for (String key: map1.keySet()) {
   System.out.println(key);
   System.out.println(map1.get(key));
  }
 }

}

■結果1
* before
key2
value
key1
value
* after
key2
value

■サンプルソースコード2
package com.kakakikikeke.sample.test;

import java.util.HashMap;

public class Test {

 public static void main(String[] args) {
  HashMap<String, String> map1 = new HashMap<String, String>();
  map1.put("key1", "value");
  map1.put("key2", "value");
  System.out.println("* before");
  for (String key: map1.keySet()) {
   System.out.println(key);
   System.out.println(map1.get(key));
  }

  HashMap<String, String> map2 = new HashMap<String, String>(map1);
  map2.remove("key1");
  System.out.println("* after");
  for (String key: map1.keySet()) {
   System.out.println(key);
   System.out.println(map1.get(key));
  }
 }

}

■結果2
* before
key2
value
key1
value
* after
key2
value
key1
value

■考察
サンプルソースコード1では作成したmap1を「=」でmap2に代入しています
そのあとにmap2に対してremoveを実行します
すると、代入したmap1からデータが削除されていることがわかります

これを回避する方法としてサンプルソースコード2を見て下さい
ソースコード2で緑色が付いている部分でmap1からmap2にオブジェクトをコピーしています
ソースコード1では単純に「=」で代入してましたが、今度はHashMapのコンストラクタの引数としてmap1を指定しています
単純にmap2のオブジェクトを新規で作成しているだけですが、サンプルソースコード2のほうはmap2側のデータをremoveしてもmap1側には影響していません

上記を踏まえてこの現象をまとめると
  • ソースコード1はmap1とmap2が同じデータを見ているためmap1側にも影響があった
  • ソースコード2はmap1と全く同じデータを持つmap2オブジェクトを新規で作成したためmap1側には影響がなかった
ということになります

考えてみると当たり前かもしれませんが、HashMapをコピーしたいという場合に結構陥りそうな罠なのかと思いました

2013年11月15日金曜日

【AWS】SimpleQueueServiceクイックスタート for Java

■環境
Windows7 64bit
eclipse 3.7(Indigo)
Java 1.7.0_03
AWS SDK for Java 1.6.5

■クイックスタート
1. AWS のSDKをダウンロードする
http://aws.amazon.com/jp/tools/
ダウンロードしたSDKでSQSも使えるようになっています

2. eclipseでJavaプロジェクトを作成する
特に設定する項目はなし
プロジェクト名を適当に設定して作成する
プロジェクトを作成した各種ライブラリを配置するようのディレクトリ「lib」を作成する

3. ダウンロードしたzipファイルを解凍しjarファイルをeclipse上のプロジェクトにコピーする
解凍したファイルの中に「lib/aws-java-sdk-1.6.5.jar」があるのでそれを先ほど作成したeclipseのプロジェクト「lib」ディレクトリにコピーする
同様に「third-party/*」内のファイルをすべてプロジェクトの「lib」配下にコピーする

4. ビルドパスを通す
先ほどlib配下に配置したaws-java-sdk-1.6.5.jarとthird-party配下のjarファイルをビルドパスに追加します
プロジェクトを右クリックして「ビルド・パス」->「ビルド・パスの構成」から追加するか
jarファイルを右クリックし「ビルド・パス」->「ビルド・パスに追加」を実行してビルドパスを追加します

5. サンプル実行クラスと設定ファイルのコピー
解凍したファイルの中に「samples/AmazonSimpleQueueService/SimpleQueueServiceSample.java」をeclipseプロジェクトの「src」内にコピーします
解凍したファイルの中に「samples/AmazonSimpleQueueService/AwsCredentials.properties」をeclipseプロジェクトの「src」内にコピーします

6. アクセスキーとシークレットキーの取得
https://portal.aws.amazon.com/gp/aws/securityCredentials
アクセスしawsのアカウントでログインします
プロジェクト内にコピーしたAwsCredentials.propertiesを開き「accessKey」「secretKey」に上記で取得したアクセスキーとシークレットキーを入力します

7. サンプルクラスの実行
eclipseからSimpleQueueServiceSample.javaを実行します
キューの作成 -> キュー一覧の表示 -> メッセージの送信 -> メッセージの受信 -> メッセージの削除 -> キューの削除
という順にリクエストが呼ばれていきます

以上でサンプルの実行は完了です
サンプルクラスに対して適宜コメントを入れることでキューの削除やメッセージの削除を抑制することが可能です

■Tips
プロキシの設定
sqsオブジェクトを作成している部分で以下のようにconfを設定しオブジェクト生成するように変更します
ClientConfiguration conf = new ClientConfiguration();
conf.setProxyHost("proxyhostname");
conf.setProxyPort(8080);
AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
AmazonSQS sqs = new AmazonSQSClient(credentialsProvider, conf);

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
がcloudfrontとs3の部分で警告表示されますが特にsqsでは問題なくキューやメッセージは作成、送信されます

リクエストの投げ方は基本的に「hogehogeRequest」クラスのオブジェクトを作成しパラメータ等を設定した上でAmazonSQSのhogehogeメソッドで呼び出す感じになります
ex) SetQueueAttributesを呼び出す場合
SetQueueAttributesRequest sqaRequest = new SetQueueAttributesRequest();
sqaRequest.setQueueUrl(queueUrl);
HashMap attributes = new HashMap();
attributes.put("DelaySeconds", "900");
sqaRequest.setAttributes(attributes);
sqs.setQueueAttributes(sqaRequest);

2013年11月14日木曜日

Jenkinsからメモ帳を開く方法

■概要
Jenkinsのビルドでnotepad.exe等を指定するとバックグランドでメモ帳が開かれて見ることができません
今回はJenkinsがバッググラウンドで開いたnotepad.exeを見る方法を紹介します

■環境
Windows7 64bit
Jenkins 1.538

■設定方法
1. スタート -> すべてのプログラム -> 管理ツール -> サービスからJenkinsサービスのプロパティを開く
(ローカルコンピュータ)Jenkinsのプロパティダイアログが表示されます
ログオンタブを開いてローカルシステムアカウントの「デスクトップとの対話サービスに許可」をONにします
以下のようにしてください

2. Jenkinsを再起動します
先ほどの管理ツールから「サービスの再起動」を実施すればOKです

3. メモ帳を開くビルドの作成
適当に作成します
ポイントとしては「Windowsバッチコマンドの実行」ビルドを以下のように設定します

作成できたらそのままビルドを実行します

4. 対話型サービスの検出からメッセージを表示する
ビルドを実行するとタスクバーに「対話型サービスの検出」というタスクが出現します
ここで「メッセージの表示」をクリックします

5. バックグラウンド側の状況を確認する
するとJenkinsが実行されているバックグラウンドの状況を確認することができます
別のデスクトップが立ち上がるイメージでそこに実行したメモ帳が開かれていることが確認できると思います
※スクリーンショットが取れなかったので実写になっています

このデスクトップ上で開かられているメモ帳を閉じるとJenkins側のジョブも終了します
ジョブはnotepad.exeが開かれている間実行され続けますので、上記画面で閉じるかtaskmgrからプロセスを強制的に停止する必要があります

いちおうこれでJenkinsからメモ帳や他のGUI系のアプリを開くことができるようになりましたが、
毎回、対話型サービスの検出を表示するとしないと表示されないので結構微妙かもしれません
他のやり方があるといいのですが。。

■参考サイト

2013年11月13日水曜日

Windows上のJenkinsでjavaが実行できない

前回
http://kakakikikeke.blogspot.com/2013/08/windowsjenkins.html
の記事でWindows上で実行する際の注意事項を紹介しましたが
どうやらJenkinsが読みにいく環境変数が「ユーザ環境変数」ではなく「システム環境変数」を読みに行っているようです
原因としては環境変数周りなのですが、今回は現象として以下のようなことが確認できました

■現象
  • Jenkinsをローカルシステムではなくログインしているユーザのプロセスとして立ち上げてもシステムの環境変数を読みに行っている
  • そのためJenkins上でユーザ環境変数が有効になっていない
  • システムの環境変数のPATHにJAVA_HOME変数を使ってPATHが設定してあった
  • システムの環境変数側にJAVA_HOME変数の定義がなかった
  • なのでシステム環境変数側のPATHにjavaコマンドまでのパスがうまく通っていなかった

■対策
  • システム環境変数側のPATHに設定してあるをjavaコマンドまでのパスをJAVA_HOME変数で参照するのではなくちゃんとパスを入力してあげた(C:\からはじまるパス)
  • 上記はシステム環境変数側にJAVA_HOME変数を追加してあげても対応可能かと思われます
  • Jenkinsを再起動し、うまくjavaコマンドが動作することを確認した(再起動しないと環境変数も反映されないようです)

Windows上でJenkinsを動かす場合は環境変数周りで苦しめられそうです
環境変数にスペースとか入っているとそれが原因でうまく変数が読み込めないみたいなこともありそうです。。。

2013年11月12日火曜日

mongodumpとmongorestoreのメモ

■環境
mongo 2.4.6
CentOS 5.9 64bit

■ダンプ
  • mongodump
  • すべてのDB情報をダンプする、ポートは27017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1
  • test1のDB情報をダンプする、ポートは27017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1 --port 30717
  • test1のDB情報をダンプする、ポートは37017、ダンプ元ホストはlocalhost、ユーザ認証なし
  • mongodump --db test1 --port 30717 --host localhost -u guest -p hogehoge
  • test1のDB情報をダンプする、ポートは37017、ダンプ元ホストはlocalhost、ユーザguestでhogehogeパスワードで認証

■リストア
  • mongorestore
  • ./dump配下のすべてのDBをリストアする
  • mongorestart --db test1 ./dump/test1
  • test1 DBに対して./dump配下のtest1 DBをリストアする
  • mongorestore -d [db_name] -c [collection_name] [bson_file_name].bson
  • 特定のコレクションだけを指定してリストアする「--port」を指定することも可能

■Tips
mongoは起動中でもダンプ、リストアをすることが可能

2013年11月11日月曜日

kibana3をインストール

■環境
CentOS 5.9
elasticsearch 0.90.5
kibana 3.0.0

■前提条件
前回elasticsearchのインストールを実施しました
http://kakakikikeke.blogspot.jp/2013/10/elasticsearch.html
今回はelasticsearch用のWebUI「kibana3」をインストールし簡単な使い方を紹介します

またWebサーバが必要なのでapacheを事前にインストールしておいてください

■kibana3インストール
wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0milestone4.tar.gz
tar xvzf kibana-3.0.0milestone4.tar.gz

mv kibana-3.0.0milestone4 /usr/local/
cd /usr/local
ln -s kibana-3.0.0milestone4/ kibana
cd /usr/local/kibana
vim config.js
elasticsearch: "http://"+window.location.hostname+":9200",
※elasticsearchが起動しているホスト名とポート名に変更がある場合は上記を変更します
cd /var/www/html
ln -s /usr/local/kibana kibana

service httpd start
elasticsearch -f
※httpdでkibanaが起動します、elasticsearchも起動します

■動作確認
http://localhost/kibana/
にアクセスしダッシュボードにアクセスできることを確認します

ダッシュボードの右側にいろいろと説明があります、要約すると
  • ブラウザは最新版のchrome or firefox or safari か IE9以上を使って下さい
  • webserverをインストールしてください
  • Elasticsearchをインストールしてください
  • WebサーバとElasticsearchが同じホストにインストールされているのであれば特に設定は不要です
  • 違うサーバで動作している場合はconfig.jsの設定を変更してください
  • Logstashユーザの場合は専用のUIがすでに用意されています
  • そうじゃない場合は以下の3つから選択してください
  • サンプル用のダッシュボード
  • データだけ読み込んだダッシュボード
  • 何も設定していないダッシュボード
サンプル用のダッシュボードを選択するとすでにElasticsearchに入れたデータをグラフで見ることができます

とりあえず今回はインストールまでなので次回あたりでオリジナルのグラフが見れるようにしてみたいと思います

■参考サイト

2013年11月9日土曜日

【mongo】DBアクセス時に認証を追加する方法

■環境
mongo 2.4.6
CentOS 5.9 64bit

■認証設定
とりあえず通常通りmongoを起動します
mongod

今回はtest1というDBに対して権限を追加します
use test1
db.addUser({user:"guest",pwd:"hogehoge",roles:["dbAdminAnyDatabase","readWrite"]})
test1というDBに対してのみ認証設定を実施するので他のDBに対しては操作することはできません
なので他のDBに対しても操作したい場合はtest1にした処理を同様に他のDBにも実施する必要があります

「dbAdminAnyDatabase」はroles名です、指定できるrole名の一覧は以下を参照してください
http://docs.mongodb.org/manual/reference/user-privileges/

adminコレクションに対しても認証させたい場合は「use admin」を実施したあとで同様のaddUserを実施してください
よくわからないのですが、ユーザ追加のクエリは若干時間がかかります(と言っても数秒です)

■認証ありでのmongod起動
一旦、mongodを停止します( kill or db.shutdownServer() )
認証モードでmongodを起動します
mongod --auth
これで認証が必要な状態でmongodが起動しました

再度、mongoでログインして「show dbs」等を実行しようとすると以下のエラーになるかと思います
Tue Nov  5 12:48:22.596 listDatabases failed:{ "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/mongo.js:46

先ほど追加したユーザでmongoにログインしてみます
mongo test1 -u guest -p hogehoge
show collections を実行するとコレクションの一覧を確認することができると思います
show dbs は他のDBに触ることになるのでエラーとなります
test1 配下のコレクションに関してはfindやsaveができます
ログインの方法はdb.auth("guest", "hogehoge")でも可能です

■参考サイト

2013年11月6日水曜日

【PHP】pearというphpのパッケージマネージャを使ってみた

■環境
CentOS 5.9 64bit
PHP 5.3.3
pear 2.3.0
apache 2.2.3

■pearインストール
yum -y install php-pear
  • pear list # インストールしてあるモジュールを表示
  • pear list-all # インストール可能なモジュールを一覧表示する
  • pear install hoge  # hogeパッケージをインストールする
  • pear uninstall hoge # hogeパッケージをアンインストールする
  • pear version # pearのバージョンを確認する
pear だけ入力すると各種指定できるコマンドを確認できます

■pear動作検証
※apache上でphpが動作する環境が構築されている前提とします

vim sample.php
以下の内容をコピーします
<?php
    echo "check_ip <br>";
    require_once "/usr/share/pear/Net/CheckIP.php";
    $isip = Net_CheckIP::check_ip("192.168.1.1");
    if ($isip) {
        echo "$isip";
    }
?>

mv sample.php /var/www/html
「/var/www/html」はapacheのDocumentRootです、必要に応じて適宜変更してください
まずこの状態で
http://hostname/sample.php
にアクセスすると「check_ip」とだけブラウザに表示されると思います
つまり、Net_CheckIP::check_ip関数がうまく呼べていない状態で最後の「check ip finish」が表示されていない状況となります

次にpearでモジュールをインストールしてみます
pear install Net_CheckIP
インストール後に再度
http://hostname/sample.php
にアクセスすると
「1 check ip finish」と追加で表示されていることがわかるかと思います
つまり、Net_CheckIP::check_ip関数がうまく呼べたことを意味しておりpearによりインストールしたモジュールが有効になっていることがわかります

ついでにcheck_ipで指定している「192.168.1.1」を「192.168.1.a」とかにして
再度ブラウザで確認すると今度は「check ip finish」の部分だけが表示され if の中に入っていないことがわかります

■Tips
pearでinstallすると.phpファイルがローカルマシン上にダウンロードされるようでデフォルトのままだと「/usr/share/pear」配下に配置されるようです
今回はyumでpearをインストールしたのでyumでインストールした場合は上記パスになると思われます

モジュールの読み込みは「require_once」を使っていますが「require」でも問題ないです

■参考サイト

2013年11月5日火曜日

【Linux】コマンドの結果がファイルにリダイレクトされない場合の対処方法

pear > pear_help.txt 2>&1

「2>&1」を末尾に追加してあげます
上記はpearでコマンドに引数が表示されない場合ヘルプが表示されるのですが、「2>&1」がないとうまくファイルに結果をリダイレクトできません
これはpearのヘルプが標準エラーとして出力されているせいで、「2>&1」を付与しない場合は標準出力のみをリダイレクトするので
ファイルには何も出力されない状況となります

「2>&1」は標準エラーを標準出力に複製する命令になるので標準出力となった結果がファイルに出力されるようになります

2013年11月3日日曜日

Growlと連携してRedmineのチケットが自分に来た時に通知してくれるRubyスクリプト

https://gist.github.com/kakakikikeke/7289446

Gistでソースコードを公開しました
Rubyで作っています

■環境
Windows7 64bit
Ruby 2.0.0p195
Growl 2.0.9.1

■インストール方法
1. 事前準備

2. 必要なgemのインストール
コマンドプロンプトを開いて以下のコマンドを実行し必要なモジュールをインストールします
デフォルトでインストールされているモジュールもありますので必要に応じて実行してください
gem install json
gem install open-uri
gem install mail
gem install date

3. スクリプト設定
Gistからダウンロードしたcheck_ticket.rbをGrowlをインストールしたディレクトリに配置します
配置したcheck_ticket.rbに対して「rubyw.exe」で開くようにプログラムを紐付けます
※ruby.exeではなくrubyw.exeを紐付けてください、rubyw.exeを紐付けることで実行時にコマンドプロンプトを表示させないようにします

check_ticket.rbの以下の項目を設定してください
  • user_id・・・redmine上で管理されているユーザのIDを入力します、URLに表示される「query_id=」の数字を入力します
  • username・・・redmineにログインするユーザ名を入力します
  • password・・・redmineにログインするユーザのパスワードを入力します
  • redmine_hostname・・・redmineが動作しているドメインもしくはIPアドレスを入力します
  • redmine_port・・・redmineが動作しているポートを指定します、80番の場合も省略せずに入力してください
  • proxy_hostname・・・プロキシのホスト名またはIPアドレスを指定します(プロキシを利用する場合は23行目のopen_uriの部分のコメントアウトを切り替えてください)
  • proxy_port・・・プロキシが動作しているポート番号を入力します、80番の場面も省略せずに入力してください

4. Windowsタスクスケジューラの設定
タスクスケジューラを開き右上「タスクの作成」を選択します
名前、説明は適当に入力します(「Redmineチケット通知」とかにしておきましょう)
タスクの実行は「毎日」で設定します(あとで更に設定変更します)、間隔も1日で大丈夫です
タスクの実行は「プログラムの開始」を選択し、プログラムにダウンロードしてGrowlのインストールディレクトリに配置したcheck_ticket.rbを参照から選択します
そのまま確認画面にいってOKを押下してタスクを作成します

作成したタスクが一覧に表示されるのでプロパティを表示します
トリガータグから編集を選択し「トリガーの編集」ダイアログを表示します
繰り返し間隔を「1分間」に設定し、継続時間を「無期限」に設定します
繰り返し間隔はプルダウンに1分間というのがないのですが、5分間を選択したあとにプルダウンを編集して1に変更してください


これで設定は完了です
うまく動作しない場合はcheck_ticket.rbをデバッグしてエラーが出ていないか確認してください

■Tips
デバッグしたい場合は以下の内容のファイルをGrowlのインストールディレクトリに配置して実行してください
rubyの実行内容がコマンドプロンプトに表示されます
cd C:\Program Files (x86)\Growl for Windows
ruby check_ticket.rb

現状の設定だと過去5分間に更新されたチケットを通知します
なので1分毎に回るタスクだと一回の更新で通知が3から4件ほど来てしまいます
通知を減らしたい場合は時間をbefore_minute変数の時間を「60*5」ではなく「60*2」とかにしてください

2013年11月2日土曜日

Jakarta HTTPClientを使ってREST-APIのリクエストを送信してみた

https://github.com/kakakikikeke/java-http-client-sample

Gitでソースコードを公開しました
Javaで作っています
REST-APIで必要なGET,POST,PUT,DELETEのリクエストを送信することができます