DevDevデブ!!

プログラミングのこととか書きます。多分。。。

初PRをキメた話

標準出力、標準エラー出力をキャプチャするgem、arieteにpull requestを出してマージされました

github.com

ariete.rb内にrspecの独自Matcherを定義しているため、arieteはrspec依存しているのだけど、gemspecにはrspecがdevelopment_dependencyで指定されており、かつariete.rb内でrspecがrequireされていなかったために、test-unitで使おうとした際に、require "ariete"するとNameErrorが発生するというもの。

(その前にrequire "rspec"しとくと回避できるけど)

修正箇所は2行。うん。プルリクのコメント書くほうが時間かかったよね。

oracleXEの文字コードをJA16SJISTILDEに変更したDockerfileを作った

github.com

何故作ったのか?

ユニットテストとか実行するときに、Dockerで使い捨てDB建てられないかなーと思ってて、通常のoracleXEのDockerイメージはDockerhubにあるんだけど、今の現場は文字コードがJA16SJISTILDEなのでそのまま使えず、しかたないので自作しましたというお話。

ちなみにまだDockerhubには上げてないよ。 (oracleXEってDockerImageで再配布するのって問題ないんすかね?)

ベースイメージは以下

github.com

ハマったところ

qiita.com

文字コードの変更自体は上記のページの内容をシェルスクリプト化してDockerfile内でRUNするだけなんだけど、それを実行するためには、ビルド時に一度OracleXEを起動する必要がある。

その際の起動にはベースイメージで使ってるシェルスクリプト*1をそのまま使ってるんだけど、その中で、listener.oraのHOSTの部分にコンテナIDをsedで書き込むようになっている。($HOSTNAMEでコンテナIDを参照できる)

#!/bin/bash
LISTENERS_ORA=/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora

cp "${LISTENERS_ORA}.tmpl" "$LISTENERS_ORA" && 
sed -i "s/%hostname%/$HOSTNAME/g" "${LISTENERS_ORA}" && 
sed -i "s/%port%/1521/g" "${LISTENERS_ORA}" && 

service oracle-xe start

ほんじゃあDockerfileのCMDでservice oracle-xe restartするだけじゃん?って思うんだけど、上記で書き込まれるコンテナIDというのが実はワナでして、

このときに書き込まれるコンテナIDは、イメージビルド時のコンテナID なんですね。 (ベースイメージでは上記スクリプトがDocker runしたときに走るので、問題無い)

つまり、そのままCMDでservice oracle-xe restartすると、listener.oraに記載されるコンテナIDと、実際にDocker runでコンテナを起動する際のコンテナIDが齟齬ってしまう。 それで何が発生するかというと、listener.oraで指定している1521ポートについて、ホストとコンテナ間のポートマッピングが正常に動作しなくなってしまう。(ここらへんあんまり仕組み理解してない)

よって、コンテナ外からoracleXEに接続することができず、使い物にならなくなる。

解決方法

解決方法は単純明快で、以下のようにCMD行で再びlistener.oraをsedで書き換えて上げればよい

(sshdについてはベースイメージのやつをそのままパクってる)

CMD sed -i "s/HOST = .*)(/HOST = $HOSTNAME)(/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora  && service oracle-xe restart && /usr/sbin/sshd -D

単純明快っつったけど、原因に気づくの時間かかりましたね(´・ω・`)

その他注意点

Docker関係ないんだけど、oracleXE文字コードを変更すると、DBインスタンスの再作成になります。 その際以下のような問題があります。

k-muratadevdesign.hatenablog.com

はい。DBMS_METADATA.GET_DDLが使えなくなります。

私の場合は上記の影響でDBFluteのreplaceschemaを叩いた際のデータロードがこけるようになりました。(ロードデータリバースは動くみたい)

感想

はー、つらい。

文字コードUTF-8に統一されたやさしい世界に住みたいなあ

JavaのCalendarクラスのプロパティ areFieldsSetについての疑問

表題の件について、Javaで以下のようなコードを書いていたときのこと、

private Calendar getStartOfTheDay(Date date) {
    Calendar cal = Calendar.getInstance();  // (1)
    cal.setTime(date);  // (2)
    return DateUtils.truncate(cal, Calendar.DATE);
}

(1)の時点では、calは現在時刻を指しており、(2)が実行された時点でメソッド引数に渡したdateと同一時刻を指すようになるはずなのだけど、現在時刻を指したままという事象が発生した。

デバッガで確認してみると、calのプロパティareFieldSetがfalseになっていた。
areFieldSetはJDK6のCalendarクラスのapidocでは以下のように説明されていた。

fields[] が現在設定されている時刻と同期をとっている場合は true です。false の場合は、次にフィールドの値を取得しようとしたときに、time の現在値からのすべてのフィールドが再計算されます。

timeはCalendarクラスのインスタンスが保持しているUnixタイムで、DAYとかMONTHとかのfieldとの同期がとれていないというのは分かった。
で、その事象はどういう条件下で発生するの??
上記のコードの場合、デバッガで何回か確認しているうちに、いつの間にか発生しなくなってしまった。

また、areFieldSetがfalseの場合に同期をとるにはどうしたらいいのか?

false の場合は、次にフィールドの値を取得しようとしたときに、time の現在値からのすべてのフィールドが再計算されます。

Calendar.get(Calendar.DATE)とか適当に実行してやればいいってことなの?
そもそもareFieldSetはprotectedなので、プログラム中で参照できないんですけど。
どうしたらいいんだこれ?

勉強会資料作成童貞を捨てることにします

またまた一年越しの更新です。物事が長続きしないことに定評があります。
この一年でプライベートで何か最後までやったのってメタルマックス4だけじゃないかな?
娯楽でもこの体たらくなので、ブログなんてとてもとてもw

表題の件について

社内勉強会の当番が周ってきたので、渋々資料を作成しているというだけの話です。勉強会の資料作るのって初めてなので、どんな感じの粒度で作ったらいいのか分かりかねてるんですよね。
パイセンからは社内勉強会なのでカジュアルな感じで全然良いって言われてるんだけど、しょっぱい資料作って社内のコアな連中からdisられたら嫌じゃないですか、ねえ?

テーマは何よ?

Ansibleでございます。このエントリ内にはAnsibleについての情報は一切ないので期待している方は回れ右でお願いします。
テーマ自体は各自自由選択で、なぜAnsibleを選択したのかというと、前職でやったサーバ構築手順書の作成作業がつまらなすぎて死ぬかと思ったという過去がありまして、プロビジョニングツールに興味を持っていたためでございます。

なんでchefじゃなく、Ansibleを選択したのかというと、chef難しそうだな−と二の足を踏んでいたところにシンプルさを謳ったAnsibleが登場したため。俺っちchefノータッチw
だからchefとの比較とかが書けないんだよなー。今からchefかじって比較とかする気ないし。

そもそも今の現場、インフラ専任部隊がいるので自分でサーバ構築とかする必要がなく、Ansibleもさわりのほうしかやってないので、あんま大したことが書けないんですよねー。
聞き手側もこれからAnsibleバリバリ使おうってわけじゃないんだから、そんなコアな資料書く必要も無いんですけど。

そもそも俺が資料作成する必要あるかというお話

Ansibleも結構メジャーなツールだから、ググったら普通にslideshareとかに良い紹介資料見つかるわけですよ。そんな中たいして分かってない俺が資料作る意味ってあるんだろうか?それって車輪の再発明(劣化)にあたるんじゃなだろうか?とか思うんですよねー。

良さ気なスライド出して、「これ読んでねー」でよくね?とか思っちゃう。実務でバリバリ使ってるんならこんな使い方すると捗りますよ−みたいな事例紹介ができるんだけどな。
まあ実務でバリバリ使ってるんなら社内勉強会のテーマにする必要自体が無くなってしまうわけですがw

markdown記法はじめ〼

1. なぜmarkdown記法なのか

流行ってるらしいからDeath!!

というのもあるけど、以下のような理由

1. githubのReadmeはmarkdownで書ける

2. Qiitaの記事もmarkdownで書ける

3. 会社のコードのReadmeで使えるかも?

4. はてなブログもmarkdown対応している

1,2はアカウント作っただけでろくに使ってないんですけどね。。。 あ、Qiitaのほうはjavaの記事に編集リクエスト送ったことあるわ。誤字の指摘だけどw

3番はmarkdownのビューアがあれば使えるね。windows対応のやつ。でもリアルタイムプレビューがないと難しいか。

2. つーかmarkdown記法って何よ?

Let's google!!

ええ、markdownの紹介記事とかいっぱいあるんだから、俺がいまさら駄文書くことも無いでしょうと。 ちなみにホッテントリ入りしてたこのエントリを参考にしました。 エディタはQiitaの運営会社が提供しているMacアプリのkobitoを使った。 以下のように、リアルタイムプレビューできるよ。

kobitoの画面

見ればわかるとおり、左側にmarkdown記法で書いた内容の出力結果が右側でリアルタイムにプレビューできる。

3. 何がうれしいんどす?

プレーンテキストでちゃかちゃか書いていって、整形(というのはおかしいか?)された文章が出力されるからかな? texとかと同じかな。texって何って?ググ(ry

本当のプレーンテキストそのまんまだと、斜体書いたり、リスト書いたりめんどくさいけど、かといってWord使っちゃうと可搬性が損なわれるし、scmで差分管理できないし、というかWord使いたくないし。 HTML直接書くのはたるいよねって感じか

4. 最後に

使ってみて確かに便利だと思った。 はてなブログ書くくらいなら別に見たまま編集のやつでいいかと思うんだけど、適度に装飾されたReadmeとかが簡単に作成できるっていうのは良い。 リアルタイムプレビューできるエディタと、チートシートがあれば基本的な部分は覚えるのも簡単だしね。

code schoolやってます

最近codeschoolをやってます。

 

rubyのコンテンツが充実してて良い感じですね。

基本文法以外にも、Procとかlambda、method_missinngとかの説明もあるんだけど、これらの使いどころも一緒に紹介してほしいな。

railsのここで使われてるとか、あのライブラリでこういうパターンが使われているとかね。

 

ruby以外だとJQueryHTML5css、sass、CoffeeScriptなんかのフロントエンド系のコンテンツが結構そろっている。

願わくばPythonJavaもやって欲しい

 

それとアレ、codeschoolは月額25ドルの有料コンテンツなわけだけど(無料のもいくつかある)、当初円高でウマウマしてたんですけど、最近円安傾向で実にアレ

xboxのゴールドメンバーシップの自動更新の解除

私、知らなかったんです。。。

 

ゴールドメンバーシップの自動更新の解除がハード本体からできなかったなんて!!

 

だってねー、普通本体からできると思うじゃんねー

システム管理のアカウント設定のところで15分くらい悩みましたよ。

そもそも自動更新オフをデフォルトにして欲しいんですけどね

 

じゃあどこからやるかっつーと、xbox.comでサインインして、アカウント情報から変更するみたい

めがっさめんどくさす