2014年12月31日水曜日

「勉強のあかり」のLEDスタンド

8x8 スペクトルアナライザw

節電でシーリングライトを電球形蛍光灯一個に交換して生きてきましたが、どうにも手元が暗いのでパナソニックの「勉強のあかり」仕様LEDスタンドを買ってみました。スタンドの土台がデカいと邪魔なのでクランプ式、発光部分が小さいと影ができやすいので大きいのを選んだのですが…組み立ててみたら想像以上にデカかったw クランプと本体は分離できるので、先にクランプを机に取り付けるだけ。昔使ってたクランプ式は一体型で重心が上にあったので苦労したっけなぁ…。





このところ本が読みにくいし頭に入らなくて、まぁ老眼だし脳ミソもダメだからしょうがないなと思っていたのですが…このLEDスタンドだとやたら読みやすい。今までページ上のコントラストが低くて文字認識で精一杯だったのが、読みやすくなったことで学習とか記憶に脳ミソを回せるようになったのでせうかw

もちろんハンダ付け作業も楽。発光部分が横に長く拡散板を使っているので、いわゆる多重影ができないし、演色性も高いので透明ブレッドボードとスズメッキ線が見分けにくいとか、溶けたハンダがキラっと光る瞬間を見逃すこともない。

と、読書用作業用でも十分満足してたんですが、写真も何だかスッキリ写ります。やっぱ演色性って大事だな…としみじみ思う。

まぁ…Macの汚れもくっきり写っちゃっているんですけどね…。

2014年12月29日月曜日

Play javaでjson-simpleを使う

休み中にずっしり伸し掛かる課題

今お勉強を兼ねて、趣味でHeroku+Play+D3.jsでアプリを書いているのですが、プロジェクトにjson-simpleを組み込めなくてハマりました。

最初にplugins.sbtに
    addSbtPlugin("com.googlecode.json-simple" % "json-simple" % "1.1.1")
を追加して not found。次に同じくplugins.sbtの上記行の前に
    resolvers += "maven repository" at "http://central.maven.org/maven2/"
を追加してもダメ。URLを色々変えてもダメ。

一晩寝て、間違いに気がついた。plugins.sbtじゃなくてbuild.sbtのLibraryDependenciesに追加してみたら、ようやく動きました。

ちゃんと寝ないとダメよねorz

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "com.googlecode.json-simple" % "json-simple" % "1.1.1"
)

さて、あと2日出社して冬休みだ(1月6日まで…ジャンケンで負けて後半組)。

2014年12月5日金曜日

Play! Framework 2.0 -> 2.3

というわけで、担当プロジェクトはPlay! Framework 2.3(Java)を使うことに決まりました。どうせならScalaの方が良かったんですが、「社内リソースがない」ということで。そりゃそうだ。

で、自分の知識をScala->Javaに切り替えなければならないので、適当な記事を参考にひと通り学習しなおして見ることに。いやー…びっくりするほど忘れてた…。

記事はコレ。Play 2.0ベースで書かれています。手元の最新は2.3.4、1.2->2.0ほどではないものの、かなりの変更があって大変でした。連載開始2012年4月か…途中長い中断があって、待ち遠しかったのを覚えてます。


■EBean関連で右往左往■

ま、一言でいえば、コレです。中の人が「EBeanは開発止まってるから、やっぱ2.3からJPAに戻るわw」と言ったとか。

しかし記事はEBean前提だし、とりあえず「EBeanかJPAか」を自分なりに評価しないといかんので、とりあえずPlay 2.3でEBeanを使ってみることにしました。

で、最初から記事にそってサンプルを動かしていくと、まず連載第1回の2/3で止まります。コマンドがplayからactivatorに変わったからです。playとタイプする代わりにactivatorとタイプし、メニューで表示されるテンプレートで「5) play-java」を選びます。


次のハマりポイントは連載第2回の1/3、Parent.java。念のため、ものすごく蛇足ですが、app/modelsというフォルダを自分で作り、その下にParent.javaを作る必要があります。

で、Parent.javaを保存して実行するとcom.avaje.ebean.validationがないというエラーが出ます。で、「com.avaje.ebean.validation not found」なんてキーワードでググると、
ってのがヒットします。でも

  1. project/Build.scalaではなくplugins.sbtに変わっている
  2. plugins.sbtに追加しても変わらない→activator runをやり直さないと反映されない
  3. 「"org.avaje.ebeanorm" % "avaje-ebeanorm-api" % "3.1.1"」を追加してactivator runするとエラー

です。結果からいえば、エラーの出る
    import com.avaje.ebean.validation.NotNull;
をコメントアウトして、替わりに
    import play.data.validation.*;
とします。さらに、@NotNullアノテーションを@Constraints.Requiredにします。これで先に進めます。


そして(2/3)でChild.javaを作りParent.javaを修正しますが、Child.javaでは例によって
    //  import com.avaje.ebean.validation.NotNull;
をコメントアウトして
    import play.data.validation.*;
に変更し、Parent.javaには
    import java.util.List;

    import java.util.ArrayList;
    import javax.persistence.CascadeType;
    import javax.persistence.OneToMany;
を追加する必要があります(上2行はEBeanとは関係ないですが)。これでブラウザをリフレッシュするとコンパイルエラーはなくなるはずですが、実行時エラーが出ます。


これは正常です…まだApplication.javaを書き換えていないので。(3/3)の指示にしたがってapp/controllers/Application.javaを書き換え、ブラウザをリフレッシュすると:


はい、出来上がりです。ここまでをPlay 2.0で試した時は確か小一時間ぐらいだったと思うんですが、今回は試行錯誤の山に阻まれて半日潰れました。いやはや。

この後PostgreSQLへの対応についての記述がありますが、そこだけ飛ばして連載の最後まで試しましたが、特に問題はなかったはずです。

■フレームワークを修得する場合■

なお、頭いいヒトはそんなことしなくても覚えられると思うのですが…私は本気でフレームワークを覚えるときには、記事を見なくてもチュートリアルと同じものが作れるようになるまでを第一段階としています。さすがにサンプルデータまでは再現しないですが、記事を見ないでうろ覚えで試している段階では当然ミスをします。ミスを修正するためには原因を調べなくてはならず、これが基本的な操作を修得する上で大変役に立ちます。

記事にはミスった時の対応まで書いてないことが多い(というよりも一度最後までサンプルプロジェクトを作ってうまくいくことを確認し、記事を書きながら再度新しく作ったりします)のですが、実際に使うようになって一番困るのはソコですし、どうしても分からない場合には記事を辿っていけるので「こういう現象が出た時の原因は、コレ」というのが比較的短期間で身につけられます。実際の開発で使うような大きなプロジェクトで環境設定に起因するエラーが出るとホント突き止めるのが大変ですからねぇ。

で、基本的な操作が身についていると、その後はAPIを虱潰しに調べていく際などにも推測が効くようになります。

これに気づいたのは、WebObjectsのセミナーで何度も「Movies」というサンプルを作った経験からです。自分はさすがにミスをしないのですが、受講生のみなさんのミスを潰しているうちに、自然にトラブルシューティングが身につきます。

当時は「朝のウォームアップ」と称して、さすがに毎日ではないですが、朝一で「Movies」を作っていました。当時は意識していませんでしたが、これが私にとってはGTDでいうところの「朝一に消化できるタスクを用意する」ことだったのかな、と思ったり。

まぁ、それに気づいたので、最近朝一に簡単なタスクを片付けるようにしてウォームアップしてます。

もっとも、それでせっかく上がった調子も、朝礼が長いとしぼみきってしまうんですけどね…ホント、何とかならんかな…。他の部署の連絡事項を聞いている時間があったら、スクラムミーティングの方が良いと思うの。

2014年12月3日水曜日

赤外線LED/受光素子発見@部品沼

他に電解コンデンサ,CDS,タクトスイッチ

Arduinoとセットになったパーツセットに入っていたはずで、部品沼のどこかに沈んでいるのは間違いない。

ちょっと時間ができたので本気で探したら…プリント基板箱の底に沈んでいました。まぁ買っても数百円なんだけど、使ってあげないと可哀相だし(その発想がすでに廃人)。

これで今週末はBBB+Lircで遊べる。

Bitnamiわからん:SVN->GITへの移行


おにぎりケース。コンビニのは塩辛いのでヨメに作ってもらってます

以前、Amazon EC2 Linuxにインストールした環境で試した時には、アトラシアンさんの記事通り特に問題なく終わりました(ありがとうございました)。

で、今回、同僚さんから「どうもうまくいかない」と相談を受けました。聞いてみるとBitnami / GitLabとのこと。上に「問題なく終わった」と書きましたけど、その前には私も簡単さに惹かれてBitnamiを使っていて、その時は結局Migrationがうまく行かなくて諦めたんですよね。

ということで、今回、MacのParalles上でCentOSを走らせて、そこで同僚氏のSVNリポジトリを吸い上げて変換することに。

■うまく行った方法■

例によって先に成功した方法を書きます。

参考になった記事はこれ「git-svnでSVN→Gitへの移行をやってみたログ」。こちらの環境はCentOS、事前にGitは同僚氏と同じ19.0.0に、Svnは同僚氏より新しい17.x.xにしました。yum install gitで入ってた18.x.xがなかなか消えてくれなくて苦労したのはまた別の話。

作業用ディレクトリを作り、その中で記事の通り:

git svn clone -s --prefix=svn/ https://<サーバ>/<リポジトリ>/<プロジェクト>

ここでテストの時間を短縮しようと<プロジェクト>に "trunk"より下の階層を指定してみましたが、ダメでした。かなり時間がかかりましたが、作業用ディレクトリの下にリポジトリの複製が出来上がりました。もしエラーで途中で止まってしまう場合の注意は元記事に書いてあります(ここでは言及しません)。

続いて記事同様:

git branch -r

で、ブランチができていることを確認します。なお、git tagを使ってもタグは一個もできていません。次にブランチを移行します。記事に書いてあるスクリプトをそのままコピペして実行します。

# svn/trunk, svn/tags/*, svn/*@xxx を除いたリモートブランチを checkout
for BRANCH_NAME in $(git branch -r | grep -ve 'svn/tags\|svn/trunk\|.*@\d*' | sed -e 's:svn/::'); do
    git checkout -b "$BRANCH_NAME" "svn/$BRANCH_NAME"
done;

# この時点でループの最後のブランチになっているので一応 master に戻しておく
git checkout master

記事より引用)。

viなどで上記テキストを checkout.sh のような名前のファイルとし、chmod +x checkout.shで実行可能にしてから ./checkout.sh で実行します。

続いて記事と同様

git remote add origin YOUR_GIT_REPOS_URL
git push -u origin --all

なのですが、その前に自分のhomeでリモートリポジトリのための鍵ペアを作り、リモートリポジトリに送ってやらなければなりません。

cd ~/.ssh
ssh-keygen -t rsa -C "mail@address"

ssh-keygenを実行するとパスフレーズを効いてきますが、省略します。また、ここで指定するメールアドレスは、リモートリポジトリのアカウントに使っているものを使います。

そうすると id_rsa と id_rsa.pub という2つのファイルが出来ます。このうち、id_rsaは秘密鍵なのでそのまま大切にしまっておきます。id_rsa.pubは英数字などから構成されるテキストファイルですが、これをコピペして、GitHubやGitLabのアカウント情報のProfile / SSH Keysに登録してやります。

話は戻って、git remoteなんたらを実行してもすぐにプロンプトに戻って来ます。ここで焦ってはいけません(私はいつも「あ、失敗した?」って焦ってしまうorz)。続く git push が本体です。しばらくしたら、例によって記事に書いてある通りに「タグの移行」を実行して作業のために付けた /svn/ プリフィックスを取ります。記事のスクリプト

for TAG_NAME in $(git branch -r | grep -e 'svn/tags' | grep -ve '.*@\d*' | sed -e 's:svn/tags/::'); do
    git tag "$TAG_NAME" "svn/tags/$TAG_NAME"
done
記事より引用)。

を gittag.sh てな名前のテキストファイルにして実行権限を付けて(chmod +x gittag.sh)から実行(./gittag.sh)。最後に記事の通り:

git push origin --tags

これでリモートに終了後にリモートリポジトリを見るとめでたく移行が済んでいました。めでたしめでたし。

■失敗編■

当初、リモートのリソースが逼迫してたこともあって、

  1. ローカルにもSVN / GITを立てる。
  2. リモートのSVNからsvndumpしてローカルにコピーし、svnadmin load
  3. ローカルでSVNからGITに変換
  4. リモートGITにpush

…と思っていたのですが、何せデータが数十GBもあるためにdumpで挫折。

こんな面倒くさい方法を使ったのは、前回Bitnami環境でgit-svnがうまくいかなかったせいなのですが…念のため正攻法の git svn clone を試してみたら、動いてしまいました。

当たり前といえば当たり前なんですが…あつものに懲りてなますを吹くのはいけない、というお話でした。

■余談な失敗■

この記事冒頭のおにぎりケース、どこかに書いたけど「食洗機可」と書いてあることを確認して買ってきたのに、開けてみたらオカズとオニギリを仕切るゴムシートに「食洗機使わないでね♡」と書いてあった。詐欺だよな。でも梱包捨てちゃって返品できないし、ってんで外装だけ使ってます。おかず持っていくのも面倒くさいしね。

生協の味噌汁とご飯120gのヨメ製オニギリが最近の昼食、オヤツはソイ20g+Whey20gのプロテインっす。押忍。