2017年10月1日日曜日

ブログを移行しました

タイトルのまんまですが、ブログを移行しました!
移行先はこちらになります!
http://blog.t-zomu.com/ 

GitHub Pages を仕事で少し使ったら便利でたまらなくなってきたので、
こちらに移行する所存であります。

2016年11月26日土曜日

SpringBootに慣れなければ、困り果てる未来が見える

僕は、普段業務アプリケーションを作るエンジニア(プログラマー寄り)であり、
メインの言語としてJavaを使っている。
そしてフレームワークはここ最近ずっとSpringだ。
やっとJava8にも慣れ始めて、いい感じのコードの3歩手前くらいは書けているような気がしている。

フレームワークはSpringを利用していると書いたが、
実はまだSpringBootに手を出していない・・・(趣味程度で触ってはいるが、がっつり書いてない)
もう1年以上前から、技術調査をするとBoot系のサンプルコードばっかり見るようになっているのに、いかんせんあの省略だらけのアプリが気に入らず、、、本腰入れて移行できていない。
プラスの理由としては、、仕事でもBootをあまり利用しないからでもあるのだが。。。

でも、今後確実にBootが使えないと生き残れないような気がしている。
Mavenのアーキタイプを利用すれば、割と前準備的なものは省略できており、
今でもスタートアップの速さは割といい感じだが、技術情報を集める際にサンプルコードがマッチしないのでは割と面倒だ。
まぁまぁそんな理由で将来的に困るのではなかろうか?と思っている。

2015年10月12日月曜日

ちょこっとpomメモ

<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>sample</groupId>
<artifactId>sample</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>
<java.version>1.7</java.version>
<encoding>UTF-8</encoding>
</properties>

<build>

<!-- リソース定義 -->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/gen-resources</directory>
</resource>
</resources>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>

<!-- ソースディレクトリを設定 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/gen-java</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>

<!-- CheckStyle -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.16</version>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<configuration>
<!-- チェックルールのパスを指定 -->
<configLocation>config/checkstyle/sun_checks.xml</configLocation>
<!-- 静的解析にて警告が見つかった場合にビルド失敗とするかどうか -->
<failOnViolation>false</failOnViolation>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>

<!-- FindBugs -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>process-classes</id>
<phase>process-classes</phase>
<configuration>
<xmlOutput>true</xmlOutput>
<failOnError>false</failOnError>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>

<!-- PMD -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.5</version>
<executions>
<execution>
<id>process-classes</id>
<phase>process-classes</phase>
<configuration>
<linkXref>true</linkXref>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
<targetJdk>1.7</targetJdk>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>


</plugins>
</build>

<!-- 環境プロファイル定義 -->
<profiles>
<!-- 単体試験環境 -->
<profile>
<id>ut1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<resource>
<directory>src/main/sg-resources/ut1</directory>
</resource>
</resources>
</build>
</profile>
<!-- 単体試験環境2 -->
<profile>
<id>ut2</id>
<build>
<resources>
<resource>
<directory>src/main/sg-resources/ut2</directory>
</resource>
</resources>
</build>
</profile>
<!-- 結合試験環境 -->
<profile>
<id>SI</id>
<build>
<resources>
<resource>
<directory>src/main/sg-resources/si</directory>
</resource>
</resources>
</build>
</profile>
<!-- 総合試験環境 -->
<profile>
<id>IT</id>
<build>
<resources>
<resource>
<directory>src/main/sg-resources/it</directory>
</resource>
</resources>
</build>
</profile>
<!-- ステージング環境 -->
<profile>
<id>ST</id>
<build>
<resources>
<resource>
<directory>src/main/sg-resources/st</directory>
</resource>
</resources>
</build>
</profile>

</profiles>

<!-- レポート定義 -->
<!-- <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> 
<artifactId>findbugs-maven-plugin</artifactId> <version>3.0.0</version> <configuration> 
<visitors>FindDeadLocalStores,UnreadFields</visitors> </configuration> </plugin> 
</plugins> </reporting> -->


</project>drふぇ

2015年8月24日月曜日

インフラ関連のスキル不足

僕はアプリケーションのエンジニアであるので、インフラ関連には全く疎い。
少し前に要件定義を行う業務に携わることがあった。
下請け業者で働く僕はあまり経験がなく、新鮮だった。

要件定義は、僕がやってきたような「よし、仕様決めてプログラム作るぜ!」というような段階でないことは当たり前だが、僕のようなアプリケーションのエンジニアの出番があまりないのだな。と感じた。

出番がないというのは間違った言い回しかもしれないが、
どちらかというと、本当に役に立ちそうな工程はもう少し後だなと感じた。
一方、真逆の事を言うようだが上流工程からアプリケーションのエンジニアがいた方がいいなと感じる部分も多々あった。

ちょっと話題がずれてるから立て直す。。。。
最初に表題を書いたときに言いたかったことは、インフラ関連の知識が僕に不足しているということ。

「あ、そう、がんばれよ!」と言う声が聞こえてきそうだが、ここには届かない。
結局要件定義の非機能要求の部分(いわゆるシステムが動作するアーキティクチャとか)ではインフラ関連の話題がとても多い。当たり前か。。。。

WEBサーバーはこれ、
アプリケーションサーバーはこれ、
ロードバランサはこれ、
データベースはこれ、
ジョブスケジューラはこれ、
ログ関連の規約はこうする、
構成管理はこうする、
試験環境、ステージング環境、本番環境はこうする、
etc...

最初に書いている方は、割と自分でも話に混じったりできるのだが、
あとになってくると辛いものがあった。。。
単純に悔しいのと、自分でもどうにかできるようになりたいのと、
「僕はアプリケーションのエンジニアであるので、インフラ関連には全く疎い。」
とかいうのはダサいので勉強しなきゃな。。。。

世の中のアプリケーションエンジニアはみんなどうしているのだろう。。。

僕は割とでかいプロジェクトばっかり回ってるからなのか。
今までアプリケーションの勉強ばかりしてきてしまった感がある。(興味本位でちょいちょいVPSとか触ってる程度)
規模が小さい開発は全てやらなきゃいけないから力が付くよと言われた理由はこの辺りにあるのかな。







2015年5月17日日曜日

Mac上のMavenでみているJavaのバージョンがおかしい。。。

何きっかけでおかしくなったのかわからないが、、、
「mvn -v」とかでみるとJavaのバージョンがおかしくなってた。
今入れているJavaは1.8のはずが、なぜか1.6とかになってる。

いろいろググったが、mvnコマンド実行する前にexportしろ的なことしか
なさそうに思えた。僕は面倒なのでできればそれをやりたくない。

「mvn -v」を実行すると、MavenHomeなるものが見える。
どうやら、「/usr/local/Cellar/maven31/3.1.1/libexec/bin」っぽい。

そこに、どう見ても実行ファイルっぽい「mvn」があったんで
そこの中を修正して強制的に1.8を見せることにした。
すごく適当なメモだが、以下のような感じ

 83 
 84 export JAVA_HOME=`/usr/libexec/java_home`
 85 
 86 if [ -z "$JAVA_HOME" ] ; then
 87   if [ -r /etc/gentoo-release ] ; then
 88     JAVA_HOME=`java-config --jre-home`
 89   fi

 90 fi


とりあえず、忘れないようにメモしただけ…

2014年10月15日水曜日

入力デバイスに夢中になりすぎて…無駄遣いをしているが止まらぬ物欲

今年の7月にHappyHackingKeyboardを3台も買ってしまった。
ProJPが2台(白/墨)
Pro2が1台(墨)

全部ヤフオクで買った中古状態いいやつだけどね…。
申し訳ない無駄に入札争ってしまった方々。。。。


結局会社でProJPの墨を使い、家ではPro2墨を使っている。
家のPCがMacであるためカーソルキーがないのを差し引いてもPro2の方が使いやすい事が分かった。

理由は、コマンドキーがおっきいから。
あと使わないキーがごちゃごちゃしてなくていい。
まぁそれだけです。

だけども、会社と家でキーレイアウトが変わるのもつらいので、、、
Pro2を買い足したい…

早く、Type-Sの墨を出すのだPFU殿。

2013年6月9日日曜日

Ubuntu 12.04LTS ~リモートアクセスのrootを有効にする~

まずは、以下でsshをインストール


sudo apt-get install ssh


デフォルト状態では、rootでのログインが可能となっているらしい。
だが、Ubuntu自体にrootを利用する設定を行っていなかったのでログインできなかった。
なので、以下でrootのパスワードを設定してやる必要があった。


sudo passwd root
(パスワードを2回聞かれるので設定)


ここまでくれば、UbuntuへMacからSSHで接続可能だ。

 

ssh 192.168.XXX.XXX -l root


【参考】
http://www.server-world.info/query?os=Ubuntu_12.04&p=initial_conf&f=2
http://d.hatena.ne.jp/Fiore/20080228/1204174833

2013年3月5日火曜日

POIの実装の選択肢

Apache POI といえば、言わずと知れたJavaでExcelを扱うための便利なライブラリ。
Excelを扱ういろんなJavaのライブラリやツールが存在するが、内部はPOIでした。
なんてことが良くあるくらい鉄板ライブラリ。

POIは、ツールで利用する程度の実装ならあまり気にしないが、
とても多くのメモリを消費する。
それは、実ファイルサイズの10〜20倍くらいまで飛躍する。
また、Office2007以降のExcelファイルを扱う場合にとても顕著に現れる。

なので、本番システムでPOIを利用する場合には、メモリ問題に意識を置く必要がある。
(本番システムでPOIを使うのはどうかと思うが、仕方ない場合)


POIには、大きく2つのモデルが存在する。
以降の話はOffice2007を前提とする。

◆ユーザモデル
 ユーザモデルは、ExcelのBookを丸ごと読み込んでマクロ感覚で扱える。
 一般的にググって出てくるネタは大抵がこのユーザモデルの場合が多い。
 このユーザモデルは、Excelを丸ごと読み込むってところで
 大量のメモリを消費してしまう。
 そのかわりとても簡易的なコードで分かりやすく扱えるメリットを持つ。

◆イベントモデル
 イベントモデルは、Excelの情報をシート単位でメモリ上にあげて処理を行える。
 これは、Office2007をZIP解凍したことのある人はすぐにピンとくるだろうが、
 シート毎に別れているXMLを読んでいる訳である。
 従って、内部ではXMLの解析となる。
 
 イベントモデルは、メモリの消費量を抑えるためのものであるため
 当然ながらXMLの解析はSAXで行う。

 XSSFReaderというクラスがSAXパーサとして公開されており、
 1セルごとのイベントをユーザがハンドリングするためのインタフェースを
 インナークラスとして定義している。
 従って、ユーザはこのインナークラスを実装したコンテンツハンドラを実装する。
 
 ただ、日本で使用する場合には注意点がある。
 POI(3.8)で確認した時に、漢字を読み込むと以下のように取得される事象があった。

 Excel上の文字列:「亜」
 POIで読み込んだ文字列:「亜ア」
 
 これは、バグでSharedStringTableという辞書みたいなXMLに記載されている
 マルチバイトの文字列で東アジア圏内の発音のために用意されているタグを
 POIが意識していないためである。

 この事象を修正するには、自分でSharedStringTableのパーサを修正するか、
 POIのバグFix版を使うしかないだろう。


上記が、いわゆる2大処理方式となる。
その他に、書き込み限定で利用できるストリーミングユーザモデルというものもある。
これについては、また別の機会に書く事にする。

2012年11月4日日曜日

Ubuntu 12.04LTS Eclipseのインストール

自宅のUbuntuにEclipseをインストールする。
ここで開発をすることは特にないが、とりあえずUbuntu上でデバッグ環境を整えて置きたかった。

Eclipseのインストールは、ソフトウェアセンターで「Eclipse」をインストールするだけでOK。
以降は、その他もろもろ自分がインストールしたかったものについてのメモとなる。


▼日本語化

ソフトウェアセンターにて、Eclipseを検索すると、以下のソフトが見つかる。
 「Japanese Language package for Eclipse using Dynamic AOP, Pleiades」
 こいつをインストール。
  
 インストール先は、以下みたい。
 /usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades

 適応するところまで、自動でやってくれんのかと期待したがそれは無理みたいだ。
 
 ・日本語化を適応する方法
  
  Eclipseのiniファイルに一行足すだけでよかった。
  
 
$ sudo vim /usr/lib/eclipse/eclipse.ini
-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar 
起動すると、日本語が適応されているので安心安心。


▼SVN

SVN上に普段ソースの管理を、行っているのでSVNとアクセスできないとキツい。
 なので、「Subversive」をインストールした。

 これは、Eclipseからインストールを行った。
 ヘルプ→新規ソフトウェアのインストールからまぁいろいろやって入れた。
 ここは面倒なので割愛する。

 ちょこっとだけハマったところは、SVNコネクターの指定をしていなかったのか、
 最初に選ぶのをミスったのか知らないが、設定されていなくてリポジトリを見ることができなかった。

 結局、もう一度新規ソフトウェアのインストールからSVNコネクターを
 「SVNKit 1.5.3」とかでインストールして設定したらうまくいった。



Ubuntuのソフトウェアセンター

家の旧WindowsマシンをUbuntuにしてしまっているが、
これが便利というか使いやすくなっていて重宝する。

特にソフトウェアセンターなるものがあって、すぐに必要なソフトを入れれるからだ。
いわゆるMacのAppStoreみたいなノリだと思う。

ここにSVNやらMySQLやらもあるのでびっくりする。
しかもインストールってするだけで簡単に入っちゃう。

今までコマンドラインで面倒なことをいろいろしなきゃダメだった分、
とても便利に感じる。

うん、ただそれだけ。

2012年9月5日水曜日

Selenium2-WebDriver 本格運用するには①

Selenium2のWebDriverを本格運用するには、カスタマイズが必要不可欠みたいだ。
なぜなら、単純にSeleniumIDEでエクスポートしたJavaファイルを実行しても実行できないから。

例えば、FireFoxで動作指せようとした場合、
JavaのシステムプロパティにFireFoxの実行ファイルのパスを設定しなければならなかったりする。

System.setProperty("webdriver.firefox.bin","FireFoxの実行ファイルのパス");

Chrome、IEでは同様にドライバのパスをシステムプロパティに設定してから
WebDriverを生成しなきゃならない。(他の方法もあるのだが似たようなもんだ)

これでは、システマティックにみんなが利用しやすくするには
独自カスタマイズをしなきゃ無理だ。
おそらく、カスタマイズして使ってくれっていうスタンスなんだろうが。



一番手っ取り早い解決は、プロパティファイルに切り出してしまう事。
以下みたいに。
webdriver.firefox.bin=FireFoxの実行ファイルのパス

そして、それをロードしたものをシステムプロパティに入れてしまえば良い。 とりあえず、僕はそうしている。

小ネタだがChromeドライバは、簡単に取得できるが最新版を取り続けていないといきなり動かなくなったりする。 特にChromeの自動更新をONにしてる人とか。

2012年9月3日月曜日

Thymeleafが気になって仕方がない

Javaでツールを作っているときに、
ツールの結果としてHTML出力って方法を僕は取りがち。(どーでもいい)

僕が取る手段は、いつも以下の2つのどちらかにしてしまう。
•XSLT
•Velocity

XSLTは、割と最後まで組むのが面倒だから本気モード以外ではあんまり利用しないかも。
JavaScriptとか埋め込むのも&&とかを&amp;にしたりとだるいしね。。。

XSLTもVelocityも割と使われてる技術だろうし、資料もいっぱいあるし良いのだが、
まずプロト的なHTMLを作成して、それに合わせてXSLなりVMを組まなきゃダメ。
しかも修正するとなると、割と面倒だ。


そんな悩みを解消してくれそうなものがあった。
Thymeleaf 

プロトHTMLをそのままテンプレートとしても使えるらしい。
狙いは当然ながらデザイン会社にWEBデザインを委託するような開発だろう。
デザイン会社さんが作ったプロトHTMLをそのまま使っちゃえということ。

これは試してみないとなぁ。。。早めに試したいところです。

Selenium2-WebDriver

2010年8月、なんか業務が暇だったのかよく覚えてないが
WebブラウザをJavaで操作したいと思ってた。(スクレイピングネタとかだっけな…)

そのときに、ググった結果以下の2つがヒットした。
•Selenium
•WebDriver

そのときは、ちょこっとWebDriverを触って終わった。
そんで僕が、SpringやらJSFやらCassandraに打ち込んでいる1年間に、
SeleniumがWebDriverを統合しちゃってて、それを半年後に知った僕は今更打ち込み始めている。

現在のSelenium2には、大きく分けて以下があるようだ。
•SeleniumIDE
•SeleniumRC(RemoteControl)
•SeleniumGrid
•SeleniumWebDriver


SeleniumIDE FireFoxのプラグインとして提供されている、Seleniumのテストケース/テストスイーツを作成するための物だ。
これはすごく便利でWebブラウザ上のオペレーションを記録でき、その内容をそのままJavaやPHPといった多数の言語のテストケースにエクスポートが可能である。



SeleniumRCこれは、前から存在しているSeleniumのテストツール本体。 テストサーバを建てて、そのサーバに対して上記のIDEで作成したテストケース/テストスイーツを喰わせることによってテストを行う。テストサーバといってもjarを実行するだけのとても簡単な手順だった。このSeleniumRCはレポートも出してくれるのだが、僕が期待したクオリティではなかった。


SeleniumGrid SeleniumRCを複数たてて、その前にハブとか呼ばれるものを1個建てて分散させてテストを実行させるためのもの。
それ以上は調べてない。。。。


SeleniumWebDriver RC、Gridとは異なる実行形態のテストツール。 単純Javaアプリケーションでも容易に利用ができ、拡張性も高い。 WebDriverは、SeleniumRCがJavaScriptで動くのに対してWebブラウザ自体や、ドライバを介してブラウザを操作するイメージを僕は持っている。故にJavaScriptのセキュリティの壁を乗り越えたテストケースを組めるみたい。

僕が興味があるのは、WebDriver。
そして目下勉強中。。。。
困った事とか、ちょこちょこ書いていきます。

Seleniumは、業界の敵なのかもしれないが、、、
無駄なコストとも思える回帰テストを嫌がる雇い主や作業者は山ほどいるはずだ。
ただ、サクッと使いこなせるのであればもうちょっと広まってていいはず。
早めに使いこなせるようになって生き残らねば…



2012年7月1日日曜日

LinkStationへのHDD増設

普段家で、LinkStationを利用しているがその容量足りなくなってきたので
増設することにしたときのメモ。
モデル名は「LS-QL F/W 1.05」らしい。もうすごい前に買ったので忘れてたのだが。。。

まず、HDDはよくわからんので価格.comで評価があんまり悪くない+安いので
WesternDigitalのWD20EARXを使用することにした。

「LinkStation HDD増設」とかでググると割と難しく書いてる人々がいて
正直怖かったんだが自分はあっけなくできた。(RAIDは元々組むつもりないんで外付けHDD気分でいい。)

【手順】

1.LinkStastionの電源をOFFり、LANケーブル、電源ケーブルを抜く。

 2.買ってきたHDDを元々付属の拡張ケースに付けて取り付ける。
このとき、スロット1はそのまま前からあるHDDが刺さってるので
スロット1とスロット2が埋まっている状態。

 3.電源を入れる。(自分はLANケーブルも刺した。)
    とりあえず、スロット2のランプがオレンジ色になる。

 4.WEB設定ページを見ると、スロット2がエラーみたいな事が書いてあるので
    フォーマットしてやる。
フォーマットは、WEB設定の「ディスク管理」->「フォーマット」から
    簡単にできる。形式は「XSF」

 5.あとは待つだけ。割と長かった。。。。
    ディスクチェックも勝手にやってるっぽい。
    LinkStationのランプが青色になったら、WEB設定の「共有フォルダ管理」から
    増設したHDDの共有フォルダを新規追加してやるだけでOK。

こんなに簡単にできるんなら、あと2TBくらい増設してもいいなぁ。と思った。


2011年11月12日土曜日

VBAでツールを作るのはもうやめようか。

業務でしばしばエクセルVBAを用いたツールを作ってきた。
簡易ツールもあるが、かなり業務を遂行する上で必須となるようなツールも作ってきた。

はじめて触れたのは新人のころで実行環境と開発環境がエクセル1個で済み、
マクロの保存なんかですぐにコードが保存できる点なども勉強しやすくこれはいいと思って
食い入るように勉強したのを覚えている。

ただ、最近はVBAでツールを作成することに少し疑問を抱いてきた。(重要度が高いツールに限る)

業務上必須となるようなツール。
例えば開発ルーチンに組み込まれるようなツール。
ソースの自動生成とか。試験ツールとか。

こういったツールは、開発の状況次第でメンテナンスが頻繁に発生したりする物だと思う。
エクセルVBAをわざわざ使うということは、そのツールの扱うデータはエクセルである場合がほとんどである。
エクセルVBAはエクセルのデータを参照する場合にはとても楽で悪いところが見当たらないように思える。
だが、メンテナンスが頻繁に発生する場合に以下の観点でエクセルVBAはとても扱いづらい。

・バージョンの管理
・使用者へのアップデート通知とその徹底
・メンテナンスを行う人間の教育


バージョンの管理について
エクセルVBAは開発環境自体がエクセルのVBエディタ機能を利用する。
そしてツールのコードは、フォーム、モジュール、クラスと分かれるがこれはエクセル形式として
内部にまとまってしまっている。
これらのコードのバージョン管理をきちんと行おうとすると?
それらをエクスポートして別管理としなければならない。
しかもそれらはまたインポートするなんて手間もかかる。

使用者へのアップデート通知とその徹底
バージョン管理ソフトにツール本体を管理させておいて、周知して最新版を使って下さい。
これならあまり問題はないのだろうが、問題なのはファイルサーバなんかにおいてしまった場合。
エクセルなんて簡単にコピーができる。
どこに派生しているかわかったもんじゃない。
そして、同じ名前が付いたツールを使用者全員が最新版かなんて意識しているほうが珍しいだろう。
最新版とそれ以前のツールを混合して使用された場合、そのツールで一定の品質なんて保てると言えるのだろうか。

メンテナンスを行う人間の教育
メンテナンスを行う人は、いつまでも初期開発者とは限らない。
僕の従事するプロジェクトは主にJavaをメインに扱うプロジェクトであったため
エクセルVBAをコーディングできる人間は割と少なかった。(ちょっと書ける程度の人間は省く)
そういったプロジェクトでメンテナンスできる人間を育てるのは面倒である。

上記のような理由で僕は最近VBAでツールを作成することに少し躊躇する。
これからはなるべくJavaを用いて業務ツールを作成しようと思う。
POI、VelocityをはじめJavaでも実現が可能だから。
あとVBAはOSによっていきなり参照が効かなくなったりするしね。

長々と講釈たれたなぁ。
何年後かに自分で見たら違う意見を持ってたりして恥ずかしくなるんだろうな。

2011年11月3日木曜日

MySQL5をMacにアンインストールとMacPortsで再インストール

MySqlはMacに前に入れたが、なんか入れ直したくなったので入れ直した。

まずアンインストール。
# rm -rf /usr/local/mysql
# rm -rf /usr/local/mysql-5.X.XXXXXXX
# rm -rf /Library/StartupItems/MYSQLCOM
# rm -rf /Library/PreferencePanes/MySQL.prefPane
# rm -rf /Library/Receipts/mysql-XXXXXXXXXXXXXX.pkg

次に、MacPortsの更新確認とか行う。
とりあえずこれは馬鹿長い。
sudo port selfupdate
sudo port upgrade outdated

MacPortsで再インストールする。
 
>sudo port install mysql5-server
 
…省略…
 
###########################################################
# A startup item has been generated that will aid in
# starting mysql5-server with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo port load mysql5-server
###########################################################
--->  Installing mysql5-server @5.1.59_0
******************************************************
* In order to setup the database, you might want to run
* sudo -u _mysql mysql_install_db5
* if this is a new install
******************************************************
--->  Activating mysql5-server @5.1.59_0
--->  Cleaning mysql5-server
 

以下のコマンドを実行しないと、MySqlが動かない。
 
>sudo -u _mysql mysql_install_db5
 
…省略…

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql5/bin/mysqladmin -u root -h PC名.local password 'new-password'

Alternatively you can run:
/opt/local/lib/mysql5/bin/mysql_secure_installation
 
…省略…
  

rootのパスワードを上記メッセージないように従って、設定する。
 
>/opt/local/lib/mysql5/bin/mysqladmin -u root password '設定するパスワード'
 

これで再インストールは終わり。
続いて設定を行う。

MySQLの設定ファイルをテンプレートからコピーする。
 
>sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /opt/local/etc/mysql5/my.cnf
 

編集する。
 
>sudo vim /opt/local/etc/mysql5/my.cnf
 
 …省略…
 
# The MySQL server
[mysqld]
port            = 3306
socket          = /opt/local/var/run/mysql5/mysqld.sock
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
 
## OWNSETTINGS …書き加えたところ
default-character-set = utf8
default-storage-engine=innodb
skip-character-set-client-handshake
 

ここまでで再インストール作業は全て完了
すでにMySQLが立ち上がっているなら停止/起動を行う。

 
>sudo /opt/local/share/mysql5/mysql/mysql.server stop
 
Shutting down MySQL
... SUCCESS! 
 
>sudo /opt/local/share/mysql5/mysql/mysql.server start
 
Starting MySQL
. SUCCESS! 
 

ちなみに、MySQLの文字コードが以下のようになっていることを接続した後確認すると良いです。
 
mysql> show variables like 'char%';
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | utf8                                    |
| character_set_connection | utf8                                    |
| character_set_database   | utf8                                    |
| character_set_filesystem | binary                                  |
| character_set_results    | utf8                                    |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| character_sets_dir       | /opt/local/share/mysql5/mysql/charsets/ |
+--------------------------+-----------------------------------------+
8 rows in set (0.00 sec)

 

2011年10月15日土曜日

CassandraのCQLはスーパーカラム(SuperColumn)の存在無視なのか?

ご存知、Apache Cassandraは0.8からCQLなるものをリリースしました。
こりゃ便利だと、使ってるメモです。

CQLはSQLととても似てて(つか狙って似せてるんだろう)親しみやすいです。
SELECTなんかも以下のような構文でSQL知ってりゃすぐわかる感じです。

SELECT * FROM カラムファミリ WHERE KEY = キー
なので、こんな事もできます。
SELECT * FROM カラムファミリ WHERE COL1 = 条件1 AND COL2 = 条件2
ただし、スーパーカラム(SuperColumn)をいっぱい使用している0.7時代のユーザは
このCQLのちょっと意味不明な仕様にがっかりしたんじゃないのかと思う。

SELECT文にてWHERE句に指定できるカラムは
セカンダリインデックスが付いてないとダメ!!!

ええええ?だってさ、SuperColumnってセカンダリインデックス貼れないじゃん!
これは困りますよね。。。

SuperColumnってCassandraの強みと1つに数えられるくらい大切なものじゃないの?
新しくCQLなるものを出したんならそこに対応していないってのもどうかと思う。

ここで書いてるのはあくまで自分で調べた結果であって、
もし、、いやいやこーやればできんじゃん!ってのがあれば是非ご教授下さい。

@PostConstructと@PreDestroyの悩み

アノテーションの使い方を前回で書いたのはいいんだけども。

ちょっと気になったので試したら悩みができた。。。
@Autowiredとか@Resourceとかで設定した場合でprototype指定されていたら、
ApplicationContextを直接持ってないとこでdestroyって呼べなくね?みたいな。
ApplicationContext持ち回せばいいのかな。。。。

試しに以下のようなコードを書いたが確かにdestroyは呼ばれない。(前回試してるから当たり前なんだが)
クラスを2重にするのがめんどくさかったのでJUnitで。。。。

対象Bean
package com.zomu.t.example;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component("testComponent")
@Scope("prototype")
public class TestComponent {

 @PostConstruct
 public void init() {
  System.out.println("init.");
 }

 public void outputMsg() {
  System.out.println("msg....");
 }

 @PreDestroy
 public void destroy() {
  System.out.println("destroy.");
 }

}


実行クラス
package com.zomu.t.example;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:ApplicationContext.xml" })
public class TestInitDestroy2 {

 @Resource(name = "testComponent")
 TestComponent tc = null;

 @Test
 public void main() {
  tc.outputMsg();
 }
}


んーどうすりゃいいんだ。
思いつくのはこれしかない。

実行クラス
package com.zomu.t.example;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:StoreManager-Common-ApplicationContext.xml" })
public class TestInitDestroy2 {

 @Resource(name = "testComponent")
 TestComponent tc = null;

 @Autowired
 ConfigurableApplicationContext appContext = null;

 @Test
 public void main() {
  tc.outputMsg();

  appContext.getBeanFactory().destroyBean("testComponent", tc);
 }
}
やってることは、前回と変わりはない。ApplicationContextと手を握り合って「バルス」って唱えただけ。

これだと当たり前にdestroyも呼ばれるんだが。
他にいい方法ってないの?

@PostConstructと@PreDestroy

Springの@PreDestroyと@PostConstructについて。
これはBean定義時代の「init-method」と「destroy-method」のアノテーション。

Scopeをprototypeで作成したBeanについて@PreDestroyはいつ呼ばれんだ?
って気になったので、サンプルを作成して確かめたんでメモる。

まずは、prototypeで作成しない場合の例

対象のComponent
package com.zomu.t.example;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Component;

@Component("testComponent")
public class TestComponent {

 @PostConstruct
 public void init() {
  System.out.println("init.");
 }

 public void outputMsg() {
  System.out.println("msg....");
 }

 @PreDestroy
 public void destroy() {
  System.out.println("destroy.");
 }

}


実行クラス
package com.zomu.t.example;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestInitDestroy {

 public static void main(String[] args) {

  ConfigurableApplicationContext appContext = new ClassPathXmlApplicationContext(
    new String[] { "ApplicationContext.xml" });

  TestComponent tc = (TestComponent) appContext.getBean("testComponent");

  tc.outputMsg();

  appContext.close();

 }
}


結果
init.
msg....
destroy.

おお。ちゃんと呼ばれてますね。
では、prototypeで作成した場合。

対象のComponent
package com.zomu.t.example;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component("testComponent")
@Scope("prototype")
public class TestComponent {

 @PostConstruct
 public void init() {
  System.out.println("init.");
 }

 public void outputMsg() {
  System.out.println("msg....");
 }

 @PreDestroy
 public void destroy() {
  System.out.println("destroy.");
 }

}

さっきと違うのは、@Scopeでprototype指定しているだけ。
実行すると、、、

結果
init.
msg....

あれ、destroyが呼ばれない。
なんじゃこりゃ。
プロトタイプだから、もうBeanFactoryの知ったこっちゃねぇって事?
じゃー実行クラスで実験してみる。

package com.zomu.t.example;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestInitDestroy {

 public static void main(String[] args) {

  ConfigurableApplicationContext appContext = new ClassPathXmlApplicationContext(
    new String[] { "ApplicationContext.xml" });

  TestComponent tc = (TestComponent) appContext.getBean("testComponent");

  tc.outputMsg();

  appContext.getBeanFactory().destroyBean("testComponent", tc);

  appContext.close();

 }
}


結果
init.
msg....
destroy.

なるほど。
ちゃんとインスタンスと登録名さえ渡してくれりゃケツ拭きまっせ。ってことっぽい。
めんどいから拭いてくれよー。って思いました。

2011年10月5日水曜日

Castorの使い方「Unmarshal」

Castorを使い始めて間もないが、基本的にネット上に転がっている情報ではUnmarshalについて詳しく載っていなくて
英語もあまり得意でない僕にとっては、苦戦を強いられた。。。

まずUnmarshalは、XML→Objectのこと。
おいおいそこからかよ。。。っていう気持ちを抑えて無駄にメモることにする。

使い道はいろいろあるだろうけど、
自分の場合はWebAPIの返却をオブジェクトとして扱いたかったから。
(XSDとか提供されていない場合に)

Unmarshalを行うコードは以下のようになる。
public class CastorTest {

 private static Mapping mapping;
 private static Unmarshaller unmar;
 private static CategoryList categoryList;

 public CastorTest() {

 }

 private void initialize() {
  mapping = new Mapping();
  try {
   mapping.loadMapping("xml/categoryList_mapping.xml");
   System.out.println("categoryList_mapping succeeded.");
  } catch (Exception e) {

  }
 }

 private void HandleCategoryList() {
  try {
   unmar = new Unmarshaller(mapping);
   categoryList = (CategoryList) unmar.unmarshal(new InputSource(
     new FileReader("xml/categoryList.xml")));
   Category[] categories = new Category[categoryList.getCategories().getCategories().size()];
   categories = (Category[]) categoryList.getCategories().getCategories().toArray();

   for (int i = 0; i < categories.length; i++) {
    Category category = categories[i];
    System.out.print(category.getName());
   }

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public static void main(String[] args) {
  CastorTest test = new CastorTest();
  test.initialize();
  try {
   test.HandleCategoryList();
  } catch (Exception e) {
   System.out.println(e);
  }

 }
}
僕がつまづいたのは、Mapping定義を示すXMLファイルの書き方。。。 Unmarchalを行うXMLとそのMapping定義のXMLを続けて以下に示す。 ▼変換したいXML


 
  
   002
   名前1
   キー1
   親1
  
  
   001
   名前2
   キー2
   親2
  
 

▼Mapping定義


 
  
  
   
  
 
 
  
   
  
 
 
  
   
  
  
   
  
  
   
  
  
   
  
 


はまったところだけを書いておくと、、、、

->変換するXMLはエンコーディング指定をSJISにしないとだめ!
->ArrayListへ詰めるには上記のようにしなきゃだめ!
->基本的にclassタグにはtypeを書いておけ!
->たぶんclassは入れ子になっちゃダメ?

こんくらいかな。
誰かが救われれば本望です。