2015年9月21日月曜日

Cloud Foundry をオールインワンで動かしてみる

構築にはcf-vagrant を利用しようと思います。VM上に構築するのが簡単そうだからです。


構築マシンはMacです。バージョンは10.10.3 Yosemite です。
現在、このマシンにはruby 2.0.0p481 がインストールされています。

cf-vagrantはRuby 1.9.3 が必要なようなので、バージョンの変更が必要です。
ただし、以下を利用することで、複数バージョンのrubyを管理できるそうです。



上記の内容を参考に ruby 1.9.3 をインストールしました。これで、vagrantを利用した構築が開始できます。

作業を進めていたところ、以下のエラーが。
$ rake host:bootstrap
==> Init Git submodules
fatal: reference is not a tree: 6ab29695b29793252d564a2f1eae86d7b041ede7
Unable to checkout '6ab29695b29793252d564a2f1eae86d7b041ede7' in submodule path 'dea_ng/buildpacks/vendor/nodejs'
Failed to recurse into submodule path 'dea_ng'
どうやら他の人も遭遇しているようですが、解決策はまだ提示されていません。(探し方が足りないのかもしれないですが)

rake host:bootstrap
https://github.com/Altoros/cf-vagrant-installer/issues/112

 先は長そうです。

---------------
2015年9月23日 追記

git についてあんまわかってなかったです。(今もわかってないですが)
エラーはよく読むと、CommitIDが該当するものがないというもの。よくわからないですが、submodule側か、親のどちらかが古い情報を参照しているか誤った情報を参照しているか。。。

ということで、キャッシュを削除してみました。

$ git rm --cached dea_ng
そしたら、rake host:bootstrapはエラーなく実行できました。
しかし、次の問題が。

==> cf-install: ================================================================================
==> cf-install: Recipe Compile Error
==> cf-install: ================================================================================
==> cf-install: 
==> cf-install: 
==> cf-install: Chef::Exceptions::RecipeNotFound
==> cf-install: --------------------------------
==> cf-install: could not find recipe server for cookbook mysql
==> cf-install: 
==> cf-install: 
==> cf-install: [2015-09-23T08:25:24+00:00] ERROR: Running exception handlers
==> cf-install: [2015-09-23T08:25:24+00:00] ERROR: Exception handlers complete
==> cf-install: Chef Client failed. 0 resources updated
==> cf-install: [2015-09-23T08:25:24+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> cf-install: [2015-09-23T08:25:24+00:00] FATAL: Chef::Exceptions::RecipeNotFound: could not find recipe server for cookbook mysql
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

MySQLのレシピがないって。ないって言われてもな・・・。 

2015年2月24日火曜日

Android StudioでRobolectric を使ったプロジェクトのサンプルを作ったけど

あんまり利用する必要がないことに気づいた。

導入方法は日本語でもたくさんあるし、みなさん丁寧に書いてるので補足も必要ないほどです。

一応URLだけでも。
https://bitbucket.org/nekoscapeproject/robolectric_template

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