2014年11月1日土曜日

OpenStack Novaで起動したインスタンスが 勝手にshutoffになる

以下の環境でOpenStack Icehouseをインストールし、インスタンスを起動したところ、しばらく経つとすべてのインスタンスの状態がshutoffとなる現象に遭遇しました。
結論としては現在は未解決です。

ホストOS
 CentOS6.5

ゲストOS
 CentOS6.5(VirtualBOXで動作):OpenStackインストール

環境をクリーンにしようとするたびに、ホストOSのインストール及び、OpenStackのインストール&設定を行うことが手間であったため、はやり(?)のVagrant+VirtualBoxを使った環境を作成しました。

順調に動作しているように思われたのですが、OpenStack上で動作させるVMをcirros OS以外にしたところ、本事象に遭遇。解決できずにいます。

ホストOSに直接OpenStackをインストールをしているときは、問題は発生していません。
違いは、OpenStack Novaのvirt_typeをkvmからqemuに変更しているくらいです。

そうすると、原因は、Novaが利用しているqemuにあるのでしょうか。。。
どうやって調べるか・・・

ちなみに、本事象は海外の方も遭遇しているらしく、Webの質問サイトで散見されました。しかしながら解決せずに質問スレッドが終了しており、残念な結果となっています。


2014年8月30日土曜日

mavenによるtomcat7へのWarファイルのデプロイの流れ

tomcat7にWarファイルをデプロイしたときの作業の流れ。
当然ですが、mavenと、tomcatは予め準備しておきます。

今回は、eclipseのm2eというプラグインを利用して実行しました。

まず、tomcatサーバ側の準備。
Warファイルのデプロイのためには、デプロイの権限が必要となります。
tomcatの"tomact-users.xml"というファイルに以下を追加します。
<tomact-users>
  <role rolename="manager-gui" />
  <role rolename="manager-script" />
  <user  username="tomcat" password="password" roles="manager-gui,managerscript" />
</tomact-users>
※ tomcat-usersが存在している場合は記載する必要はありません。

    username, passwordは環境に合わせて変更してください。

上記の設定を行った上で、Tomcatを起動、もしくは再起動する。


次は、デプロイ側の設定。デプロイするサーバや、パスの設定をします。

pom.xml
<biuld>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <url>http://localhost:8080/manager/text</url>
        <server<remotetomcat</server>
        <path>/hello</path>
      </configuration>
    </plugin>
  </plugins>
</biuld>

settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <servers>
    <server>
      <id>remotetomcat</id>
      <username>hiroyuki</username>
      <password>hiroyuki</password>
    </server>
  </servers>
</settings>




あとは、m2eのプラグインから tomcat7:deploy を実行するとデプロイができます。
※2回目以降は、tomact7:redeployでないと失敗します。
 deployは上書き禁止モードのようです。

意外と簡単だった。でも、このデプロイはセキュリティ的にはどうなんだろうか。外部からモジュール置き換えができるのは便利だけどテスト環境だけに留めたい・・・。

参考にしたサイト
http://blog.horimisli.me/entry/2012/07/13/231000

2014年7月19日土曜日

jsonschema2pojo 妥当性チェック

jsonschema2pojoを使ってjackson用のクラスファイルを作成してみましたが、json schemaの妥当性のチェックがソースとして反映されてないようです。

デフォルトの指定ではバリデーションは有効にならないようです。
https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference

ということで、以下から、jarファイルをダウンロードして前回作成したプロジェクトの"libs"に追加します。
http://mvnrepository.com/artifact/javax.validation/validation-api/1.0.0.GA

さらに、build.xmlを以下のように置き換え

<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">

<taskdef name="jsonschema2pojo" classname="org.jsonschema2pojo.ant.Jsonschema2PojoTask">
<classpath>
<fileset dir="libs">
<include name="*.jar" />
</fileset>
</classpath>
</taskdef>

<target name="generate">
<jsonschema2pojo source="src/address.json"
targetDirectory="gen" targetPackage="com.example"
includeJsr303Annotations="true" />
</target>

</project>



これで実行すると妥当性チェックをしてくれそうなJavaクラスが生成されます。
※実際にチェックされるのかは後でやります。

jsonスキーマからJavaクラス生成でparseエラーが出る場合は、antの引数に、"-verbose"を指定すると問題の箇所が特定できます。1つ1つ順番に潰していってください。

Json Schemaを追加ってJavaクラスを生成する

必要があったので、Json Schemaがどんなものなのか確認する意味を含めてJson SchemaからJavaクラスを生成してみました。

いつもEclipseを利用して作業を行っているため、今回の生成もEclipseを利用します。
以下のサイトを参考にしました


1. Eclipseにプロジェクトを作成し、build.xmlファイルを準備します。
build.xmlファイルには、以下のコードを貼り付けておきます。

<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">

<taskdef name="jsonschema2pojo" classname="org.jsonschema2pojo.ant.Jsonschema2PojoTask">
<classpath>
<fileset dir="libs">
<include name="*.jar" />
</fileset>
</classpath>
</taskdef>

<target name="generate">
<jsonschema2pojo source="src/address.json"
targetDirectory="gen" targetPackage="com.example" />
</target>

</project>


<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">


2. 必要なJarファイルをダウンロードし、プロジェクト内の"libs"フォルダへ配置します。
必要なJarファイル一覧は、jsonschema2pojo -Githubの"The Ant Task"にありますが、一部ライブラリの追加、変更が必要でした。
追加
・Appache commons lang 3
変更
・codemodel2.4 → codemodel2.6

3. buildの実行
Buildfile: /Users/XX/Documents/workspace/jsonschema2java/build.xml
generate:
BUILD SUCCESSFUL
Total time: 615 milliseconds

完成


2014年5月2日金曜日

約数の数

先日、Topcorder Single Round Match 466 DIV 2の500ポイントの問題を考えていましたが、解き方が全くわかりませんでした。

問題は、以下のとおりです。
    
Bob likes to play the lottery, but it's so hard to win without cheating. Each lottery ticket has an identifier which contains exactly n decimal digits. If an identifier contains only '0's, it is considered a winning ticket. Otherwise, the identifier is interpreted as a positive integer X written in decimal notation (possibly with leading zeros). If X has an odd number of positive integer divisors, it is a winning ticket, otherwise, it is not. A positive integer is a divisor of X if it divides X evenly. 



Unfortunately, Bob only has enough money to buy one ticket, and he cannot see the identifier before buying a ticket. Therefore, he decides to cheat by buying a ticket and modifying its identifier to make it a winning ticket. In a single change operation, he can choose one digit, erase it, and print some other digit in the same position. No other types of modifications are allowed. He can perform any number of these change operations, but he wants to perform as few as possible to minimize the risk of getting caught. 



You are given a String ID, the initial identifier on Bob's ticket. Return the minimal number of change operations necessary to transform the identifier into a winning one. If the initial identifier is already a winner, return 0.
要するに求めるのは、与えられたIDがすべて0にするのか、それとも約数が奇数個ある値に変換するかどちらか変更する数値の数の少ない手番数を答えなさいというもの。

情けないことに、約数が奇数個ある。というものがどんな数値なのか思いつきませんでした。(1つ1つ書いてみればわかったかもしれない)

地道に書いてみると以下のようになる。

1 = 1
2 = 1, 2
3 = 1, 3
4 = 1, 2, 4
5 = 1, 5
6 = 1, 2, 3, 6
7 = 1, 7
8 = 1, 2, 4, 8
9 = 1, 3, 9
10 = 1, 2, 5, 10
11 = 1, 11
12 = 1, 2, 3, 4, 6, 12
13 = 1, 13
14 = 1, 2, 7, 14
15 = 1, 3, 5, 15
16 = 1, 2, 4, 8, 16
17 = 1, 17
18 = 1, 2, 3, 6, 9, 18

ちなみに約数の数を数えるには、素因数分解をすると良いらしい。
18 = 2^1 * 3^2   ( 2 * 3 = 6個 累乗の数+1同士をかけると約数のパターン数がでる)

1〜18までの値で、約数が奇数となるのは、以下のとおり
1,4,9,16

規則性を見つけるとしたら、
1^2, 2^2, 3^2, 4^2, ..... となるから、ある値の2乗の値は、約数が奇数であることになる。

数学的な証明は目的としないので省略しますが・・・

これがわかると、あとは約数が奇数の数値に変えるのが手番が少ないのか、すべて0にするのが手番が少ないのかを考えればよいだけになる。

頭の硬くなった年代にはちょっとむずかしい問題でした・・・orz




2014年3月15日土曜日

GL04PとOCNのSIMカードを利用した通信費用削減の効果

2013年の12月からGL04Pを利用してしばらく経ちました。
携帯料金の平均的な金額はかなり下がり、以前は10,000円こえることもありましたが、現在はなんと2,000円。

パケ放題が馬鹿らしいくらい。

ただ、ちょっと通信がおそかったり、手間がかかるのが面倒な時がある。それが許容できれば経済的。


iostatの勘違い(redhat系)

正しく表示内容を理解していなかったといえばそれだけだけど・・・。
iostatの%utilのディスクビジー率。この値が大きければディスクが忙しいというイメージ。
だいたいあっていそうなので真剣に向き合わないで放置してましたが・・・。

ディスクビジーってなんだよ。って思うと不信感が出てきます。

%util は結局のところ、ディスクIOがどのくらい処理されていたかを示しているだけでこいつに振り回される必要はないと気づいた。
性能を表しているわけでもないし、この値が大きくても慌ててはいけないと。

ディスクIOがどのくらい処理されていたか、ということは、iostatなどの値で考えると次のようになる。

  svctm * ( r/s + w/s ) / 単位時間  (単位時間とは、iostatなどの情報の採取間隔と考えておいてください)
  参考:http://d.hatena.ne.jp/yohei-a/20110711/1310396665

この式を眺めていると気づくのは、%utilの値が大きくなる場合がいくつかあります。

  1. svctm(IOリクエストの平均処理時間(msec))が長い。
  2. r/s(1秒間あたりのread発行回数) か w/s(1秒間あたりのwrite発行回数)が多い
上記のいづれかが原因で%utilが大きな値を示しているかが重要です。
1msecで処理できているw/sが1000回実行された場合と、1secで処理できているw/sが1回実行された場合。どちらも%utilは同じ値です。
落ち着きましょう。(自分)

iostatには、他にもありますが、それはまた次の機会で