タイトルのまんまですが、ブログを移行しました!
移行先はこちらになります!
http://blog.t-zomu.com/
GitHub Pages を仕事で少し使ったら便利でたまらなくなってきたので、
こちらに移行する所存であります。
2017年10月1日日曜日
2016年11月26日土曜日
SpringBootに慣れなければ、困り果てる未来が見える
僕は、普段業務アプリケーションを作るエンジニア(プログラマー寄り)であり、
メインの言語としてJavaを使っている。
そしてフレームワークはここ最近ずっとSpringだ。
やっとJava8にも慣れ始めて、いい感じのコードの3歩手前くらいは書けているような気がしている。
フレームワークはSpringを利用していると書いたが、
実はまだSpringBootに手を出していない・・・(趣味程度で触ってはいるが、がっつり書いてない)
もう1年以上前から、技術調査をするとBoot系のサンプルコードばっかり見るようになっているのに、いかんせんあの省略だらけのアプリが気に入らず、、、本腰入れて移行できていない。
プラスの理由としては、、仕事でもBootをあまり利用しないからでもあるのだが。。。
でも、今後確実にBootが使えないと生き残れないような気がしている。
Mavenのアーキタイプを利用すれば、割と前準備的なものは省略できており、
今でもスタートアップの速さは割といい感じだが、技術情報を集める際にサンプルコードがマッチしないのでは割と面倒だ。
まぁまぁそんな理由で将来的に困るのではなかろうか?と思っている。
メインの言語として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を見せることにした。
すごく適当なメモだが、以下のような感じ
「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殿。
ProJPが2台(白/墨)
Pro2が1台(墨)
全部ヤフオクで買った中古状態いいやつだけどね…。
申し訳ない無駄に入札争ってしまった方々。。。。
結局会社でProJPの墨を使い、家ではPro2墨を使っている。
家のPCがMacであるためカーソルキーがないのを差し引いてもPro2の方が使いやすい事が分かった。
理由は、コマンドキーがおっきいから。
あと使わないキーがごちゃごちゃしてなくていい。
まぁそれだけです。
だけども、会社と家でキーレイアウトが変わるのもつらいので、、、
Pro2を買い足したい…
早く、Type-Sの墨を出すのだPFU殿。
ラベル:
HappyHackingKeyboard
2013年6月9日日曜日
Ubuntu 12.04LTS ~リモートアクセスのrootを有効にする~
まずは、以下でsshをインストール
デフォルト状態では、rootでのログインが可能となっているらしい。
だが、Ubuntu自体にrootを利用する設定を行っていなかったのでログインできなかった。
なので、以下でrootのパスワードを設定してやる必要があった。
ここまでくれば、UbuntuへMacからSSHで接続可能だ。
【参考】
http://www.server-world.info/query?os=Ubuntu_12.04&p=initial_conf&f=2
http://d.hatena.ne.jp/Fiore/20080228/1204174833
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大処理方式となる。
その他に、書き込み限定で利用できるストリーミングユーザモデルというものもある。
これについては、また別の機会に書く事にする。
ラベル:
Apache POI
2012年11月4日日曜日
Ubuntu 12.04LTS Eclipseのインストール
自宅のUbuntuにEclipseをインストールする。
ここで開発をすることは特にないが、とりあえずUbuntu上でデバッグ環境を整えて置きたかった。
Eclipseのインストールは、ソフトウェアセンターで「Eclipse」をインストールするだけでOK。
以降は、その他もろもろ自分がインストールしたかったものについてのメモとなる。
「Japanese Language package for Eclipse using Dynamic AOP, Pleiades」
こいつをインストール。
インストール先は、以下みたい。
/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades
適応するところまで、自動でやってくれんのかと期待したがそれは無理みたいだ。
・日本語化を適応する方法
Eclipseのiniファイルに一行足すだけでよかった。
なので、「Subversive」をインストールした。
これは、Eclipseからインストールを行った。
ヘルプ→新規ソフトウェアのインストールからまぁいろいろやって入れた。
ここは面倒なので割愛する。
ちょこっとだけハマったところは、SVNコネクターの指定をしていなかったのか、
最初に選ぶのをミスったのか知らないが、設定されていなくてリポジトリを見ることができなかった。
結局、もう一度新規ソフトウェアのインストールからSVNコネクターを
「SVNKit 1.5.3」とかでインストールして設定したらうまくいった。
ここで開発をすることは特にないが、とりあえず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の実行ファイルのパスを設定しなければならなかったりする。
Chrome、IEでは同様にドライバのパスをシステムプロパティに設定してから
WebDriverを生成しなきゃならない。(他の方法もあるのだが似たようなもんだ)
これでは、システマティックにみんなが利用しやすくするには
独自カスタマイズをしなきゃ無理だ。
おそらく、カスタマイズして使ってくれっていうスタンスなんだろうが。
そして、それをロードしたものをシステムプロパティに入れてしまえば良い。 とりあえず、僕はそうしている。
小ネタだがChromeドライバは、簡単に取得できるが最新版を取り続けていないといきなり動かなくなったりする。 特にChromeの自動更新をONにしてる人とか。
なぜなら、単純に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とか埋め込むのも&&とかを&にしたりとだるいしね。。。
XSLTもVelocityも割と使われてる技術だろうし、資料もいっぱいあるし良いのだが、
まずプロト的なHTMLを作成して、それに合わせてXSLなりVMを組まなきゃダメ。
しかも修正するとなると、割と面倒だ。
そんな悩みを解消してくれそうなものがあった。
「Thymeleaf 」
プロトHTMLをそのままテンプレートとしても使えるらしい。
狙いは当然ながらデザイン会社にWEBデザインを委託するような開発だろう。
デザイン会社さんが作ったプロトHTMLをそのまま使っちゃえということ。
これは試してみないとなぁ。。。早めに試したいところです。
ツールの結果としてHTML出力って方法を僕は取りがち。(どーでもいい)
僕が取る手段は、いつも以下の2つのどちらかにしてしまう。
•XSLT
•Velocity
XSLTは、割と最後まで組むのが面倒だから本気モード以外ではあんまり利用しないかも。
JavaScriptとか埋め込むのも&&とかを&にしたりとだるいしね。。。
XSLTもVelocityも割と使われてる技術だろうし、資料もいっぱいあるし良いのだが、
まずプロト的なHTMLを作成して、それに合わせてXSLなりVMを組まなきゃダメ。
しかも修正するとなると、割と面倒だ。
そんな悩みを解消してくれそうなものがあった。
「Thymeleaf 」
プロトHTMLをそのままテンプレートとしても使えるらしい。
狙いは当然ながらデザイン会社にWEBデザインを委託するような開発だろう。
デザイン会社さんが作ったプロトHTMLをそのまま使っちゃえということ。
これは試してみないとなぁ。。。早めに試したいところです。
ラベル:
Thymeleaf
Selenium2-WebDriver
2010年8月、なんか業務が暇だったのかよく覚えてないが
WebブラウザをJavaで操作したいと思ってた。(スクレイピングネタとかだっけな…)
そのときに、ググった結果以下の2つがヒットした。
•Selenium
•WebDriver
そのときは、ちょこっとWebDriverを触って終わった。
そんで僕が、SpringやらJSFやらCassandraに打ち込んでいる1年間に、
SeleniumがWebDriverを統合しちゃってて、それを半年後に知った僕は今更打ち込み始めている。
現在のSelenium2には、大きく分けて以下があるようだ。
•SeleniumIDE
•SeleniumRC(RemoteControl)
•SeleniumGrid
•SeleniumWebDriver
僕が興味があるのは、WebDriver。
そして目下勉強中。。。。
困った事とか、ちょこちょこ書いていきます。
Seleniumは、業界の敵なのかもしれないが、、、
無駄なコストとも思える回帰テストを嫌がる雇い主や作業者は山ほどいるはずだ。
ただ、サクッと使いこなせるのであればもうちょっと広まってていいはず。
早めに使いこなせるようになって生き残らねば…
WebブラウザをJavaで操作したいと思ってた。(スクレイピングネタとかだっけな…)
そのときに、ググった結果以下の2つがヒットした。
•Selenium
•WebDriver
そのときは、ちょこっとWebDriverを触って終わった。
そんで僕が、SpringやらJSFやらCassandraに打ち込んでいる1年間に、
SeleniumがWebDriverを統合しちゃってて、それを半年後に知った僕は今更打ち込み始めている。
現在のSelenium2には、大きく分けて以下があるようだ。
•SeleniumIDE
•SeleniumRC(RemoteControl)
•SeleniumGrid
•SeleniumWebDriver
僕が興味があるのは、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くらい増設してもいいなぁ。と思った。
増設することにしたときのメモ。
モデル名は「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でツールを作成することに少し躊躇する。
これからはなるべくJavaを用いて業務ツールを作成しようと思う。
POI、VelocityをはじめJavaでも実現が可能だから。
あとVBAはOSによっていきなり参照が効かなくなったりするしね。
長々と講釈たれたなぁ。
何年後かに自分で見たら違う意見を持ってたりして恥ずかしくなるんだろうな。
簡易ツールもあるが、かなり業務を遂行する上で必須となるようなツールも作ってきた。
はじめて触れたのは新人のころで実行環境と開発環境がエクセル1個で済み、
マクロの保存なんかですぐにコードが保存できる点なども勉強しやすくこれはいいと思って
食い入るように勉強したのを覚えている。
ただ、最近はVBAでツールを作成することに少し疑問を抱いてきた。(重要度が高いツールに限る)
業務上必須となるようなツール。
例えば開発ルーチンに組み込まれるようなツール。
ソースの自動生成とか。試験ツールとか。
こういったツールは、開発の状況次第でメンテナンスが頻繁に発生したりする物だと思う。
エクセルVBAをわざわざ使うということは、そのツールの扱うデータはエクセルである場合がほとんどである。
エクセルVBAはエクセルのデータを参照する場合にはとても楽で悪いところが見当たらないように思える。
だが、メンテナンスが頻繁に発生する場合に以下の観点でエクセルVBAはとても扱いづらい。
・バージョンの管理
・使用者へのアップデート通知とその徹底
・メンテナンスを行う人間の教育
上記のような理由で僕は最近VBAでツールを作成することに少し躊躇する。
これからはなるべくJavaを用いて業務ツールを作成しようと思う。
POI、VelocityをはじめJavaでも実現が可能だから。
あとVBAはOSによっていきなり参照が効かなくなったりするしね。
長々と講釈たれたなぁ。
何年後かに自分で見たら違う意見を持ってたりして恥ずかしくなるんだろうな。
2011年11月3日木曜日
MySQL5をMacにアンインストールとMacPortsで再インストール
MySqlはMacに前に入れたが、なんか入れ直したくなったので入れ直した。
まずアンインストール。
次に、MacPortsの更新確認とか行う。
とりあえずこれは馬鹿長い。
MacPortsで再インストールする。
以下のコマンドを実行しないと、MySqlが動かない。
rootのパスワードを上記メッセージないように従って、設定する。
これで再インストールは終わり。
続いて設定を行う。
MySQLの設定ファイルをテンプレートからコピーする。
編集する。
ここまでで再インストール作業は全て完了
すでにMySQLが立ち上がっているなら停止/起動を行う。
ちなみに、MySQLの文字コードが以下のようになっていることを接続した後確認すると良いです。
まずアンインストール。
# 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知ってりゃすぐわかる感じです。
このCQLのちょっと意味不明な仕様にがっかりしたんじゃないのかと思う。
SELECT文にてWHERE句に指定できるカラムは
セカンダリインデックスが付いてないとダメ!!!
ええええ?だってさ、SuperColumnってセカンダリインデックス貼れないじゃん!
これは困りますよね。。。
SuperColumnってCassandraの強みと1つに数えられるくらい大切なものじゃないの?
新しく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
実行クラス
んーどうすりゃいいんだ。
思いつくのはこれしかない。
実行クラス
これだと当たり前にdestroyも呼ばれるんだが。
他にいい方法ってないの?
ちょっと気になったので試したら悩みができた。。。
@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
実行クラス
結果
おお。ちゃんと呼ばれてますね。
では、prototypeで作成した場合。
対象のComponent
実行すると、、、
結果
あれ、destroyが呼ばれない。
なんじゃこりゃ。
プロトタイプだから、もうBeanFactoryの知ったこっちゃねぇって事?
じゃー実行クラスで実験してみる。
結果
なるほど。
ちゃんとインスタンスと登録名さえ渡してくれりゃケツ拭きまっせ。ってことっぽい。
めんどいから拭いてくれよー。って思いました。
これは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を行うコードは以下のようになる。
はまったところだけを書いておくと、、、、
->変換するXMLはエンコーディング指定をSJISにしないとだめ!
->ArrayListへ詰めるには上記のようにしなきゃだめ!
->基本的にclassタグにはtypeを書いておけ!
->たぶんclassは入れ子になっちゃダメ?
こんくらいかな。
誰かが救われれば本望です。
英語もあまり得意でない僕にとっては、苦戦を強いられた。。。
まず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
▼Mapping定義002名前1 キー1 親1 001名前2 キー2 親2
はまったところだけを書いておくと、、、、
->変換するXMLはエンコーディング指定をSJISにしないとだめ!
->ArrayListへ詰めるには上記のようにしなきゃだめ!
->基本的にclassタグにはtypeを書いておけ!
->たぶんclassは入れ子になっちゃダメ?
こんくらいかな。
誰かが救われれば本望です。
登録:
投稿 (Atom)