たぷつきません

おなかがでてきた。もうたぷついてるやん。

靖国参拝に思う

賛否あるけど、靖国参拝の反感の本質は、『国に命を捧げた』とか『英霊を讃える』とか侵略戦争を賛美しているかのような言い方する精神にあるからなんじゃ。

英霊ではなく、戦争に駆り出された被害者の霊でしょう。国を守った英霊…と聞こえのいいことを言わず、侵略のために戦わされた人と侵略を指揮した人の霊…って言わなきゃ。
なのにひっくるめて神とか言っちゃうからな~。一神教神道では神の概念が違って「目に見えない精神や霊」が神であり本質は畏怖と鎮魂からなりたっているという独特のとらえかたは、なかなか他国の人には伝わらない。
全ての戦死者の御霊をという神道の教えだとか言うなら、なぜ殺害したアジアの人たちも弔わないのさ。しないよね。日本国家のための戦死者が対象だからね。おおらかなように見せかけて小さいからな日本人は。米兵殺して人肉で酒盛りするようなどっちが鬼畜なんだかわからん異常な日本兵らまで祀っておきながらさ。まぁこれこそ畏怖と鎮魂なんだけど。
それと、靖国という名前が平和で安らかな国をと願う意味から名づけられたっていっても、それから幾つ戦争してきたよ。「戦争して死んでも靖国で祀ってやるから、どんどん死んでこい」と真逆に利用されてんじゃん。だから戦前は国家神道の中心として軍の管轄だったわけだし。戦後は変わった言うけど歴史は上書きできません。

話し戻すけど『戦争被害者を哀悼する』、『二度と戦争を起こさないと亡くなった方たちに誓いをたてて弔う』、という性質じゃないからだよ参拝の反発は。
アジアを軍事支配しようとしたこと、そして実際いくつもの国を支配したことを誤りと認めず、むしろ肯定してる、当時の権力者と同じ考えが今の権力者の根底にもあるようにしか見えないことに、アジアの人たちが危機感と怖れをもって反発しているんじゃん。脅してるのと一緒だよ。
もしそれが誤解だとしても、ちゃんと公言しないから反感をかうんだよ。喋んないで腹ん中なに考えてんのか分からない日本人て思われてるんだからさー。

そもそも戦争してきた理由が
「おれんち何も出ないのに、あっちのあいつんちも、こっちのあいつんちもいろいろ出るんだよな~。よーし、放火して火事場どろぼうしちゃえ!そんで建て直し手伝っておれんちに従わせちゃえ」
て感じじゃん。盗っ人根性たけだけしすぎるわ。そんな理由で自国と他国の人々の命や生活も奪っておいて何が正義なんだよ。
当時、大東亜戦争になる前、経済制裁アメリカにもされてましたしね。今の北朝鮮の感じと当時の日本は大差ないよ。

自分も靖国にいって参拝したことあるけど、どの国も平和であることを願って戦争をせざるを得ない状況なんてものが世の中からなくなることを祈ります。ほんとどの国も危うい時代だから。冷戦時代のほうが平和だったくらい。
「戦争を起こそうとするやつらが出てきたら、そいつらがコトを起こす前に神の鉄槌をくだしてやってください」…と強く願うことにします。

Gmail API イイッ!!

gmail atom feed apiが2LOでもOAuth2でも繋がらなくなってなんだよなんだよ~思ってたら、どうやらGmail APIがリリースされた影響かもって昨日エイヤ!って置き換え。

ってゆーか公式ドキュメントに2LOとかOAuth2で使えるって書かれてないんだよね。偶然使えてただけなのか塞がれちゃったみたい。

Google I/Oに合わせて出た新しいこのGmail APIで昨日リプレースしたんだけど、これが超強力!今までIMAP API使うしかなかったのが全部 Google APIでカバーできちゃう。gmailの検索バーでできる検索もできちゃう!いいよいいよー。

唯一辛かったのはatom feed apiだと1リクエストで返ってきたものがlistと個々のIDをget呼び出しって構成になっちゃって死ぬほどリクエスト増えちゃってドエライ重くなった。ちゃんと同じAuthTokenも使ってるのにこの有り様。

最初は10件単位でリストアップして10秒以上かかっていたのを、非同期getしても5秒前後かかっていて、やだな~思ってたら、うちの織田信成似の同僚が「Batchリクエストで良くなりません?」って!

さっそくBatch使ったら11リクエストが2リクエストに減るから、速い時は2秒かからないで終わった。Google APIはBatch利用必須だわ〜。使ってるとこ全部置き換えたい!

appcfg.sh叩くシェルでパスワード自動入力

mvnでビルドして成功したらGAEにデプロイってシェルを作って使ってるんだけど、appcfg.shに渡すパスワードが $GAE_PASSWORDってゆー環境変数なんて定義しちゃってて、丸わかりすぎじゃんって感じだったので変えてみた。

.profileか.bashrcにGAE_USERが定義されていることを前提としている。

appcfgh.shで認証するGAE_USERのパスワードをセットするシェル


ビルドのところは色々ごちゃごちゃやってるのでシンプルにデプロイの部分だけ抜粋したシェルが以下。
実行するディレクトリには warがあること前提。もしくは target/war があればそちらを優先する。

GAE_USERに対応するパスワードを使って自動的に認証してappcfg.shにデプロイするシェル

おわり

MacにJava8入れるよー

まずはJDKdmgのpkgでオッケー
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

入れたらデフォが8になる。GUIから起動されるjavaのバージョンは8になる。eclipseも8で起動される。7に切り替える方法は今のところ知らない。

コンソールから実行するバージョン変えたかったらこちらを参照。自分はGAEデプロイとかあるのでjava7にした。GAEいつjava8サポートするのかなー。
http://qiita.com/mas0061/items/2fe9333f045800d00b5c


忘れてならないのが暗号ビット長制限解除パッチ。
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
ダウンロードしたjce_policy-8.zipを展開してから以下のように上書きしちゃう。
f:id:t-katochin:20140522122029p:plain

eclipseでの対応は、Eclipse Marketplace から java8で検索すれば出てくる。m2eのも入れた。Facetとか使ってないので入れてない。
f:id:t-katochin:20140522122109p:plain

eclipse再起動したらeclipseでjava8をJREにセットできるようになるのでAddして一旦保存
f:id:t-katochin:20140522122224p:plain
もっかい環境設定開いてエイリアスにもセット。
f:id:t-katochin:20140522122319p:plain

おわり

eclipseで一挙にmvn起動

うちは各自の作ったfeature/hotfixをリリースの番人さんが厳しくジャッジしてからdevelop/masterがあがる体制にしてるので、他のメンバーはそこで上がった最新を取り込んでまた継続スタートって感じにしてるんだけど、ライブラリプロジェクトを細かく分離してるから依存階層がやたら深くて末端のバージョンがあがると芋づる式にてっぺんまでpomのバージョンアップの変更が入る。特にGAEのバージョンなんて上がったらゴッソリと。

最初は外部ツールで${project_loc}に当てたmvnコマンドを複数プロジェクトでやれる方法を探してたんだけど無かった。シェルでも良いんだけど、eclipseで真っ赤になってて「あ構成変わったかな?」と思った瞬間すぐ試せるの欲しいなーと思ってて。それになんて名前つけたかすぐ忘れるしw

んで代替作みっけた。
やり方は簡単でCDT入れて「Launch Group」ってやつを使うだけ。
他の実行設定をこいつのリストに入れてあげるだけ。
べつだんC/C++プロジェクトである必要はなく、m2eclipseの複数の実行設定をだろうとJavaの実行設定だろうとなんでもいけるので。
むしろなんでCDTにしか入ってないのよ?ってゆー疑問がw

なんてことない手順だけどいちおう図解しておくと…

  1. CDTはEclipse MarketplaceでCDTって検索するだけで出るのでそれをインストール。
  2. あらかじめmvnをeclipse:eclipseする実行設定を作っておいて、Launch Groupで束ねる実行設定を作成。そこにAddする。f:id:t-katochin:20140519151345p:plain
  3. 実行するとモリモリとコンソールが立ち上がってやってくれます。f:id:t-katochin:20140519155619p:plain


ただ、mvnってdependencyのダウンロードがマルチプロセス前提にできてないから、最初にこれやったら未ダウンロードだった appengine-labs 1.9.4 でファイルぶっ壊れちゃったけど。
順次実行できるオプション欲しいなー。

あと Eclipseのコンソールリフレッシュエラーとか複数でる時がある。他でもたまーに見るけど昔っから治ってないんだよねー。eclipseのコンソールのこの問題。

まちょっと微妙だけどそれなりに使えます。

maven-eclipse-pluginとの組み合わせでDoma Toolsが動かなくなる!

Doma Toolsが _Entityクラスや DaoImplクラスを吐いてくれなくて悩みに悩んでいたんだけど、やっと解決!

まず、EclipseのUIから以下の画面のように設定すると、何が起きるかってことから話さないといけないんだけど…
f:id:t-katochin:20140327150847p:plain

上記の設定で、.settings/ の下に、org.eclipse.jdt.apt.core.prefs が出来て、

org.eclipse.jdt.apt.aptEnabled=true
org.eclipse.jdt.apt.genSrcDir=.apt_generated
org.eclipse.jdt.apt.reconcileEnabled=true

こんなのが書かれる。
…なんだけど、ここにヒトツ罠があって、これだけではなく実は org.eclipse.jdt.core.prefsにも以下のものが追加されてる!

org.eclipse.jdt.core.compiler.processAnnotations=enabled

罠ってゆーかeclipseの仕様だから良いんだけど、この一連の挙動を mvn eclipse:eclipse では解決してくれない。

だからウチラはmaven-eclipse-pluginのadditionalConfigでfile生成にて jdt.apt.core.prefsの方は解決させていたんだけど、jdt.core.prefsはお任せ状態だった。だって slim3-genは問題なく動くんだもん。

同僚の環境でも出来たり出来なかったりするってゆーことで謎だったのはここで、設定画面で一旦チェックを外して保存、また開いてチェックして保存すると、 org.eclipse.jdt.core.compiler.processAnnotations=enabled が復活するので、「おお動く動く。はて?」となっていたってゆーオチだった。
んでまたその後も不意に eclipse:clean eclipse:eclipseすることで再び動かなくなるってゆーことだった。

ハマった。見事にハマった。

仕方ないので、maven-eclipse-pluginが自動生成するorg.eclipse.jdt.core.prefsまで additionalConfigで上書きするってゆー苦渋の選択を余儀なくされるってゆーオチに。

誰か maven-eclipse-pluginのコミッタに annotation processor対応してって伝えて〜。

ちなみに見つけたのはウチの織田信成似の同僚。ちゃんと動くdoma-tutorialプロジェクトと目diffで発見!よく見つけてくれたゎ! \(^o^)/

ActiveObjectsをGAE+Cloud SQLで使えるようにしたった。

ActiveObjectsの拡張性が無いのでクラスの上書きをしないといけないんだけどね。
でも1つだけ。patchは以下。

net.java.ao.builder.SupportedDatabase ってのが enumだからまずい。
このenumメンバーに、Cloud SQL用のものを追加。自分は2番め辺りに入れたけどどこでも良いっす。

    GOOGLE_CLOUD_SQL("jdbc:google:mysql", "com.mysql.jdbc.GoogleDriver")
            {
                @Override
                public DatabaseProvider getDatabaseProvider(DataSourceFactory dataSourceFactory, String uri, String username, String password, String schema)
                {
                    return new MySQLDatabaseProvider(getDataSource(dataSourceFactory, uri, username, password));
                }
            },

結局MySQLなので、同じボキャブラリであるMySQLDatabaseProviderを使ってしまって問題ない感じ。

ローカル環境のGAEからmysql(for Cloud SQL dev) やっとつながった〜

MySQLのドライバのConnectionImpl のコンストラクタが、GAEじゃ動かないTimerThreadを実行しようとしていてアクセスできなくて死ぬ。
なんじゃこりゃーと色々試行錯誤してやっと解決。

問題は、mysql-connector-java 5.1.6を使っていたからー。5.1.25にしたら解決。
なんだよもーーーー。長いこと気付けなかった。。。ものすごい疲労感…(_ _;)

ActiveObjectsでCloudSQL使いたいのですががが

EntityManagerの皆のサンプル、どこ行っても new EntityManager(url, user, pw) の使用例しかないんだけど、ActiveObjects 0.25.1にはそんなコンストラクタ無くなっちゃってて、なんだなんだと command+T 使いまくってようやく分かった。EntityManagerBuilderを使うのね。長かったわー。Web探すよりコードで見つける方が早いわー。

EntityManager em =
        EntityManagerBuilder.url("jdbc:mysql://......")
               .username(user)
               .password(password)
               .none()
               .build();

よし、これでだいたい安心…ってなにが?

window.onerror = function (msg) {
	// IE8 check
	if (navigator.userAgent.indexOf("MSIE 8.0") != -1) {
		showError(prefMsg("IE8IsNotSupported"));
	} else {
		showError(msg);
	}
};

恐怖!ガジェットでUserPrefのEnumが効かない怪奇現象

Google Siteにいくら設定して保存しても何も変わらないもう一度設定を見ると default_value に戻ってるという怪奇現象にハマった。

試行錯誤で何とか解決したので謎のノウハウとしてメモ。

まず、以下のUserPrefのセットだと、enumをいくら変更しても 2にされてしまう。

    <UserPref name="v1" default_value=""/>
    <UserPref name="v2" data_type="hidden" />
    <UserPref name="v3" datatype="enum" default_value="2">
        <EnumValue value="1" display_value="1"/>
        <EnumValue value="2" display_value="2"/>
        <EnumValue value="3" display_value="3"/>
    </UsaerPref>

なんと hiddenより後ろにあると無視されてしまうらしい。
以下にするとちゃんと保存されるようになる。

    <UserPref name="v1" default_value=""/>
    <UserPref name="v3" datatype="enum" default_value="2">
        <EnumValue value="1" display_value="1"/>
        <EnumValue value="2" display_value="2"/>
        <EnumValue value="3" display_value="3"/>
    </UsaerPref>
    <UserPref name="v2" data_type="hidden" />

なんのこっちゃ! hiddenは最後に置きましょう。

もしかすると Google Siteだけの問題かもしれない。なんでかってゆーと、そもそも
setprefsが効かない
という恐るべき仕様っぽいから。なんやそらー。
実際hiddenの項目を用意してsetprefsしても保存されない!保存した風な顔してリロードしてみると保存されてないってゆー状態。サイトは利用者に紐付くのではなくページに紐付くためなのかもね。
でもそんな特殊な仕様、どこにも見当たらないんだけどっ!

だから「hiddenなんてオレしらねー。」って感じでXML内の定義も読むの途中から放棄して、それ以降に存在するhiddenじゃないものまでシカトこいてるんじゃないかしら。

まあ、そんなわけだからSiteに置く専用のガジェットなら、そもそもhiddenなんて定義する意味ないってコトですわね。とほほーい。

自動的にハングアウトを起動する

毎朝遠方メンバーも含めてハングアウトで朝礼してるんだけど、よく起動を忘れてたりする!
…ってなわけで出来るようにしたった。

以下その手順。ちなみにうちは10:00に朝礼が始まるのでその前提で説明してきます。

1. ホストとなるGoogleアカウントのカレンダーの繰り返しイベントを作成

ホストとなるGoogleアカウントを用意。そのカレンダーに新規イベントを作成して、平日の繰り返しイベントを作ります。ゲストにはリモートから接続してくるメンバーをセット。
ビデオ通話の「ビデオハングアウトを追加」を有効にします。
f:id:t-katochin:20140304142556p:plain
作成したイベントをクリックするとポップアップした中に「ビデオハングアウトに参加」というリンクが表示されるので、右クリしてリンク先をコピーしておきます。これは次の手順で使います。

2. ショートカット版Chromeをインストール

特定URLのショートカットアプリを作成できるシェルがあるのでダウンロードします。
https://s3.amazonaws.com/LACRM_blog/makeApp.sh
↑を叩いてダウンロードしたら、実行してショートカットアプリを作ってきます。
f:id:t-katochin:20140304143138p:plain
最初にアプリの名前を入力、次にさっきコピーしていたビデオハングアウトに参加のURLを貼り付け、最後に適当な画像ファイルの場所を入力します。あらかじめハングアウトのアイコンをどこかから拾っておくとアプリアイコンが分かりやすくなってイイかんじ。

これが終わると $HOME/Applications/ の下にアプリができやす。上記の例では Gluegent-Morning-Hangout.app っていうアプリフォルダができやす。
f:id:t-katochin:20140304144506p:plain
ショートカット版Chromeは、普通のChromeとぶつからないサブセットとして独立したアプリになってるのがイイ感じ。ユーザーがぶつからないしね。

こちらスーパーサンクス ⇛ http://blog.livedoor.jp/umtoto/archives/65901754.html

3. アプリの自動起動設定

平日の9:55に接続するようにするなら以下のように crontab -e でアプリを起動するようにセット。

55 9 * * 1-5 /usr/bin/open /Users/xxxxx/Applications/Gluegent-Morning-Hangout.app
4. Mac自動起動

[システム環境設定] - [省エネルギー] で右下の[スケジュール…]ボタンから、「起動またはスリープ解除」にチェックを入れて「平日の9:50」に設定
f:id:t-katochin:20140304141307p:plain

これで平日朝、マシンが9:50に起動して、9:55にハングアウトが自動的に開くはず!!最初はログインが必要だし、数日おきにログインさせられるだろうけど、たいていは参加だけでいけるようになるから超楽じゃないかな。忘れないし。
f:id:t-katochin:20140304144149p:plain

記述間違っとるpomもらってハマったわ。

slim3-genが、どうも定義している .apt_generated 以外に、target/generated-sources/apt という謎のフォルダにもdaoのメタ情報クラス吐き出してて、同じクラスを二重に定義してるよ〜と怒られる。

f:id:t-katochin:20140116143009p:plain

覚えのない謎のソースフォルダ「target/generated-sources/apt」なんやこれー。

eclipse:eclipse で必ず .classpathにこのソースフォルダできるからなんだろーって思って ググったら、apt-maven-plugin が吐き出すらしくて、pomをよくよく見たら、

    <artifactId>apt-maven-plugin</artifactId>
    <configuration>
        <outputDirectory>${generated.src}</outputDirectory>

なんてこった!ちがうぜ!outputDirectoryじゃないぜ!

以下に修正して無事解決。

    <artifactId>apt-maven-plugin</artifactId>
    <configuration>
        <sourceOutputDirectory>${generated.src}</sourceOutputDirectory>