2013-06 << 2013-07 >> 2013-08

2013-07-29 (月)

scalaのClassFileAnnotationはやく使えるようになって欲しいなあ.

http://d.hatena.ne.jp/Kazuhira/20110828/1314524208

scalaのAnnotationにRetentionPolicy.RUNTIME付けたり,どうにかクラスファイルに情報残せないかと試行錯誤したけど,コンパイラレベルでサポートされてないので,無理っぽい.アノテーションはJavaで実装するべきっぽいなあ.

2013-07-28 (日)

自炊本リーダ(仮)がAndroid4.3だとPDF内の画像のデコードに失敗することがあるので修正.ついでに,いくつかレビューのコメントで目についた問題を直す.

*数値の混ざったファイル名のソート

よくある処理なのだけどファイル名中の数字は数値として評価してソートしたい.

例えば,10.jpg は 9.jpgより後に来るべきだし,hoge_2012.3.1-012 は hoge_2012.12.4-123 より前になるはず.

なんか書いたことがある気はするけど,Javaで改めて書いてみる.もちろんJavaのComparatorの実装がどこかにあるのだろうけど,これだけのために依存ライブラリ増やしたくないし,コピペできそうなコードは残念な感じなのが多い.

最初手を抜いて,

Pattern numPtn = Pattern.compile("((?<=\\d)(?=[^\\d]))|((?<=[^\\d])(?=\\d))");
private int compare(final String s1, final String s2) {
    String ss1[] = numPtn.split(s1);
    String ss2[] = numPtn.split(s2);
    int n = ss1.length < ss2.length ? ss1.length : ss2.length;
    for (int i = 0; i < n; i++) {
        char c1 = ss1[i].charAt(0), c2 = ss2[i].charAt(0);
        if ((c1 >= '0' && c1 <= '9') && (c2 >= '0' && c2 <= '9')) {
            long d = Long.parseLong(ss1[i]) - Long.parseLong(ss2[i]);
            if (d != 0) return d > 0 ? 1 : -1;
        } else {
            int d = ss1[i].compareTo(ss2[i]);
            if (d != 0) return d;
        }
    }
    return ss1.length - ss2.length;
}

こう書いてたのだけど,遅くて使い物にならなかった.仕方ないので,

private int compare(final String s1, final String s2) {
    int l1 = s1.length(), l2 = s2.length();
    int p1 = 0, p2 = 0;
    while (p1 < l1 && p2 < l2) {
        char c1 = s1.charAt(p1++), c2 = s2.charAt(p2++);
        if ((c1 >= '0' && c1 <= '9') && (c2 >= '0' && c2 <= '9')) {
            long n1 = c1, n2 = c2;
            while (p1 < l1) {
                char c = s1.charAt(p1);
                if (c < '0' || c > '9') break;
                n1 = n1 *10 + c - '0';
                p1++;
            }
            while (p2 < l2) {
                char c = s2.charAt(p2);
                if (c < '0' || c > '9') break;
                n2 = n2 *10 + c - '0';
                p2++;
            }
            if (n1 != n2) return n1 > n2 ? 1 : -1;
        } else {
            if (c1 != c2) return c1 - c2;
        }
    }
    return (l1-p1) - (l2-p2);
}

とりあえずこれで.

*config_voice_capable

Nexus7だと,IIJとかのMVNOなsimでもアンテナ表示されるのなんでだろうと思ったのだけど,config_voice_capableがfalseだと音声通話できなくても無視されるのか.

http://bl.oov.ch/2012/12/android-421-mvno-sim.html

電話アプリが使えるかどうかも,同じ設定を見てるらしい.試しにGalaxy Nexusでfalseにしてみたら,電話できなくなった.アプリを無理やり起動しても,電話できないし,SIPの設定もなぜか消えてる.

2013-07-27 (土)

3G版のNexus7もAndroid4.3になった.

まだちゃんと調べてないのだけど,Android 4.3のRenderScriptで,Allocationに変なpaddingが入ってる気がするな.rsForEachとかrsGetElementAtでアクセスするときは大丈夫だけど,連続したバッファとして扱ってる場合に問題があるかも.パディングを含む1行あたりのバイト数を取得する方法あるんだろうか.

アプリを暗号化されたPDFに対応しようと思ってPDFの仕様書読んでたのだけど,見たことのない処理がされている.これ,ちゃんと設計された暗号なのかなぁ.怪しい.

Amazonアプリストア インストール方法がひどい.

https://www.amazon.co.jp/gp/feature.html?docId=3077680306一昔前のIEのセキュリティをユーザに変更させるサイトと同じことだけど,過去の反省が生かされてないという点でさらにひどいと思う.

2013-07-26 (金)

魚,ラーメン.

2013-07-25 (木)

Android 4.3が来ていた.

https://developers.google.com/android/nexus/images

仕事のあとご飯食べたりしてたけど,終電の存在を考えてなくて気づいたら電車なくなってた.少し歩いて銀座線に乗るという手もまだあったのだけど,東銀座から森下まで試しに歩いてみた.思ったより遠くて45分くらいかかった.

2013-07-24 (水)

蕎麦食べた.

2013-07-23 (火)

寿司食べた.銀座はエンゲル係数高くなる...

2013-07-22 (月)

少し早めに起きて,LTの発表資料作って会社へ.

うなぎ食べた.

2013-07-21 (日)

昨日から体の調子悪い.夕方まで寝ていた.

選挙行くついでに買い物行くかと思って,家を出たのだけど,整理券持ってなかった.まぁとりあえず買い物だけ済まそうと思ってそのまま秋葉原まで行ったけど,財布も持ってなかった...今朝カバンの中身を全部出したのを忘れていた...レジで気づいたので急いで家に戻ったりしてとても疲れた.結局投票には行けず.

明日の会社でのLTのネタを決めないと....

2013-07-20 (土)

眠い.

2013-07-19 (金)

\0がヌル文字に見える病気.

2013-07-18 (木)

銀座3日目.ラーメン食べました.

会社が家から遠くなると,出社するときは,予定が入ってたりしてわりと時間通りに会社に行くけど,帰るのが面倒で良くないです.

今週はまじめに仕事しないといけない感じなので,いろいろ忙しい.

今日も気づいたら明治座の前にいたのは秘密です...会社に行こうと思ってから,仕事を始めるまでの行動がほぼ無意識で,その間は別のこと考えてるので,新しいオフィスに行くのは難易度が高い.

*[C84] 同人誌情報

ななかInside PRESS vol.3」の文章かかせてもらいました.

8/12 月曜日(3日目) 東ぺ-15a「第7開発セクション」

dev7c84.jpg

表紙もボリュームも内容も,なんかすごいです.

1年前は星一開発セクションだったけど今回は第7開発セクションで書かせてもらいました.

2013-07-17 (水)

銀座2日目.魚食べました.

家を出て,うっかり前のオフィスに向かっていた.そのまま人形町まで歩いて,日比谷線で会社へ.

2013-07-16 (火)

今日から新しいオフィス.銀座怖い.

IMG_20130716_120828.jpg

歌舞伎座の上にそびえ立つ歌舞伎座タワー.

今までの明治座の倍くらいの高さ.

Sinatraで簡単なWebアプリ作ってたのだけど,send_fileしたとき,thinを使ってるときだけ Transfer-Encoding: chunked になってしまう.でかいファイルなのでRangeリクエストしたいのだけど,これだと困る.sinatraとthinのコード少し見たけど,EventMachineのsend_file_data()とかは使ってないのか.このあたりが怪しい.

メモ:

hoge.erb

    /* *<%= %>/
    setData( <%= jsondata %> );
    /*/
    setData( {dummy data ... } );
    // */

erb中のjsにこういうのが増えてきて困るのだけど,どうするのが良いんだろう.

テンプレートファイルをそのままhtmlとして開いてもjsが正しく実行されて欲しくて,かつサーバサイドでデータを置き換えたい場合って結構あると思うのだけど,みんなどうしてるんだろう.

2013-07-15 (月)

眠い...時間と気力が足りてない.

VPSの環境がそれぞれ違いすぎて不便なので,セットアップしつつ環境を見直す.OSもFreeBSDからCentOSにした.webサーバ以外はFreeBSDのつもりだったけど,最近はLinuxに甘やかされてFreeBSDの管理は億劫になっていたので.他人がビルドしたカーネル使うのありえないとか思わなくなってきたのもある.

いろいろメモ.

自炊したPDFのリネーム.

https://github.com/trapezoid/bookinspect

yum -y install libjpeg-devel libpng-devel
yum -y install ImageMagick ImageMagick-devel
yum -y install zbar-devel poppler-utils
gem install ffi
bundle install

あとは,amazon ecsの設定して,

bookinspect/bookinspect.rb rename 2013-07/*.pdf

本たくさんあると処理時間やばそうなので,少しいじって高速化しつつ.

明日から歌舞伎座か.どうやって会社に行こう...電車かなあ

2013-07-14 (日)

ScanSnapの日.15冊くらいスキャンしてみたけど,かなりつらい.

VPSのうち1台の環境を作りなおそうと思ったのだけど,面倒になって,うっかりもう1つ契約してしまう.大阪か石狩を選べるようになってたので,試しに石狩にしてみたけど,やっぱり少し遅いですね.家からpingが20msくらい.東京だと4msで,大阪でも12msなので,比較するとかなり反応悪い.

とはいっても,東京から石狩までの経路が1000kmあって,光ファイバーの屈折率が1.5くらいだとすると,理論上でも往復10msかかってしまうので,良い方なのかも.

東京が一番近くで良いのだけど,新たに契約するときに選択できないんだよなあ.

2013-07-13 (土)

暑い...

なんだか疲れてるので寝る.

2013-07-12 (金)

引越し.会社移転するのでいろいろ.明治座のオフィス,4年間仕事してきたけどこれで最後か.

新しいオフィス楽しみだけど,家から遠くなるのがなぁ.家の引越しもそのうち考えないと.銀座の徒歩圏内で住めるところあるといいけど.

あとは机が狭くなるっぽいのが心配...

飲み会.

2013-07-09 (火)

とても暑い...秋葉原までラーメン食べに行ったり,新卒の子達と寿司食べたり.

2013-07-08 (月)

暑い.休み中にやるはずだったことをどうにかしないと.

2013-07-07 (日)

*[kstm.org] 木崎湖2日目

木崎湖→松本→東京

朝から木崎湖に飛び込んでしまった.服とか靴とかびしょ濡れになったけど,どうせ温泉入るので気にしない.

城山公園の展望台.

IMG_20130707_131015.jpg

県の森.旧制松本高校.

IMG_20130707_135039.jpg

メーヤウのグリーンカレー食べた.

IMG_20130707_143525.jpg

メーヤウは松本にいたころしか行ってなかったので,ほぼ10年ぶり.松本キャンパスも久しぶりに見た.

10年前はここに住んでたんだなあと,懐かしい話を色々した.

急に思い立って授業中にペットボトルロケット作りはじめるは,ラップトップ使わないから閉じろと言われたら,ノートPC閉じていっせいに席を立ち教室を出て行くは,大学内で水鉄砲に希釈したバニラエッセンスを詰めて撃ちあったりするは,ちょっとひどい学生だと思われても仕方ないエピソードも思い出した.

東京着いて,ご飯食べて解散.

2013-07-06 (土)

*[kstm.org] 木崎湖1日目

ysaotome,niwasaki,kmuroi,gazyuと長野へ.

東京→松代→長野→木崎湖

昨日,目覚ましもセットせずに寝てしまったので,3時間くらい寝坊した.起きたら集合時間を45分ほど過ぎていて,電話の着信履歴たくさん...危なかった.携帯電話はバイブレーションすらしないマナーモードになってたりするので,全く気づかないことが多い.

家まで車で迎えに来てもらって,長野へ.

途中で,いつも行っていた松代の酒屋さんに寄る.学生時代と何も変わってないと言われて,実際そうなのだけど,僕は太ったと言われた.確かにそうか.

工学部.在学中に植えておいたとか葡萄とかとかリンゴの実がついていた.イチゴも植えたけど,ほぼ野生化していた.

IMG_20130706_143824.jpg

木崎湖キャンプ場へ.

IMG_20130706_162843.jpg

雨の中バーベキュー.

IMG_20130706_172353.jpg

木崎湖一周.少し雨降っていたけど,今回もホタルがけっこういた.

暑い.

2013-07-05 (金)

眠い.明日は朝から出かけるので準備する.

2013-07-04 (木)

いつのまにか,Google Play booksで,PDFをアップロードして読めるようになっていた.PDFの管理をどうしようかと思ってたところだったので使ってみることに.

アップロードできないPDFが結構あると思ったら1ファイル50MBまでみたいですね.もともとがPDFな電子書籍と,薄いライトノベルをスキャンしたPDFくらいなら50MBに収まるので,そのあたりの本を放り込む.Googleドライブ上のPDFと同期してくれる機能が欲しい…….

AndroidのPlayブックスアプリは,AmazonのKindleアプリにも言えることだけどページめくり方向は設定できない……ちょっともったいない.色々見てると,どんどんストレージを圧迫していくのも困りもの.

*自炊本リーダー(仮) V0.1.2

先日のバージョンで色々バグを仕込んでしまってたので色々直しました.あと,zipファイル周りの非同期処理がずっとバグってて,高確率で開きなおしたときにページが復元されなかったり,最初のページが表示されなかったり色々良くわからない動作をしてたのも直した.

2013-07-03 (水)

色々時間が足りない.

健康診断というか人間ドックというかあれ.7時に起きた.眠い.朝だというのに電車に人がたくさん乗っていた….

2013-07-01 (月)

自炊本リーダー(仮)をアップデートしました.

画像読み込みのキューイング処理を変えてみたり.アップデート後にシークバーでページめくるときに,違うページが表示されるバグに気づいたので近いうちにもう一度アップデートしよう….

*ハッカソン的なやつ

この時期になると,新卒の新入社員も含めてエンジニア全員でご飯食べる日があるのですが,今年はエンジニア決起集会という名のハッカソンらしいです.

何かネタ考えようと思ったけど,半日でできそうなネタってけっこう難しいです.加えて,仕事で使ってない言語とフレームワークなのも悩む.Java,Scala,Ruby,AS3,Objctive-Cあたりはここ1年で仕事の開発で使った言語なので,HaskellかGoあたりが良さそう.

会場に行くまで何やるか決めてなかったのだけど,前に話してたネタがあったので,3人チームでやる.Androidアプリ作りたい気もしたけど,せっかくGoやる気になってたのでサーバサイドを書く.

Go + Revelで写真投稿サイトのようなものを作っていました.

Go

2年ぶりに触る.ちょっと触ったことはあるけど,意味のあるプログラム書くのは今日が初めてです.

Goは1.1になってるのか.ずっと前に入れたやつを消して入れなおす.GOPATHとかの環境変数が必要になったっぽいので設定.

Revel

Revelはわりと素直なMVCなWebフレームワークで,Playとかを使ったことあるなら簡単に使えます.というかPlay Frameworkによく似ています.

インストールにhgとかいるのか.

revel runコマンドで起動すると,ファイルを弄るたびに自動的にコンパイルされる上に,Goのコンパイルは早いので,スクリプト言語感覚で実装できて良いですね.かつ,型があるので安心して書ける.

自動再読み込みしてコンパイルエラーになるときは,前の状態で動いていてほしい時がほとんどなので,どうにかならないかな.ブラウザ上でエラーとか見れなくても良いので.

マルチパートのPOSTとかもよしなにやってくれる.routesのmethodを「*」にしておくとダメっぽいので,ちゃんと書いとく必要あるようです.

GoでRedis

GoからRedis使ってみたけど,redisクライアントをどれ使うかで結構悩んだ.

http://redis.io/clients を見るとGoの実装も並んでるのでこの中から選ぶ.あまり考えずに,上から見ていって簡単に使えそうなのを探す.

  • Go-Redisはbyteにするのだるい.放置されてそう.
  • redigoはお勧めされてるけど,普通のコマンド使いたいだけなのにSend/Receiveするのは煩雑な気がしたので,見送る.
  • radixもお勧めされてて,とてもシンプル.コマンドは文字列を直に書かないといけないのと,Cmdのエラー時にどう動くのか分からなかったので避ける(後で見なおして,Replyから値をとるときにエラーが取れるのに気づいた.でもいろいろ足りない気がする.float返す命令はstringで受けるの?とか,PubSub無さそうとか)
  • Tideland CGL Redisは他と設計方針違う感じがしたので念のためスキップ.
  • godisはベースはradixに似ている.基本的なコマンドはメソッド用意されてるし,Reply周りもパッと見では困ること無さそう.あと名前がそれっぽい.ただ,放置されてそう.

というわけで,今回はgodisを使ってみた.実際どれが良かったのかわからない.

Goのtemplate

Goのtemplateも使ってみたけど,ぐぐって出てくる情報は古いのが混ざってて,探しにくい.リストはrangeで処理すれば良いことは分かった.

ただ,Revelで使うときviewsの下に壊れたhtmlテンプレートが一つでもあると,全部止まってしまうのは試行錯誤してるときに,ちょっと不便だった.

使い慣れない言語とフレームワークで5時間でどうにかするのはギリギリだなと思ったけど,やっぱりギリギリでした.RevelもGoも素直だったおかげでなんとかなりました.

ピザたくさん食べました.余ったピザを貰ってきたので,帰って冷凍庫に詰め込むのに一苦労...

新卒の新入社員と話をしたり.