2013-07-29 (月)
scalaのClassFileAnnotationはやく使えるようになって欲しいなあ.
http://d.hatena.ne.jp/Kazuhira/20110828/1314524208
scalaのAnnotationにRetentionPolicy.RUNTIME付けたり,どうにかクラスファイルに情報残せないかと試行錯誤したけど,コンパイラレベルでサポートされてないので,無理っぽい.アノテーションはJavaで実装するべきっぽいなあ.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
scalaのClassFileAnnotationはやく使えるようになって欲しいなあ.
http://d.hatena.ne.jp/Kazuhira/20110828/1314524208
scalaのAnnotationにRetentionPolicy.RUNTIME付けたり,どうにかクラスファイルに情報残せないかと試行錯誤したけど,コンパイラレベルでサポートされてないので,無理っぽい.アノテーションはJavaで実装するべきっぽいなあ.
自炊本リーダ(仮)が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); }
とりあえずこれで.
Nexus7だと,IIJとかのMVNOなsimでもアンテナ表示されるのなんでだろうと思ったのだけど,config_voice_capableがfalseだと音声通話できなくても無視されるのか.
http://bl.oov.ch/2012/12/android-421-mvno-sim.html
電話アプリが使えるかどうかも,同じ設定を見てるらしい.試しにGalaxy Nexusでfalseにしてみたら,電話できなくなった.アプリを無理やり起動しても,電話できないし,SIPの設定もなぜか消えてる.
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のセキュリティをユーザに変更させるサイトと同じことだけど,過去の反省が生かされてないという点でさらにひどいと思う.
魚,ラーメン.
Android 4.3が来ていた.
https://developers.google.com/android/nexus/images
仕事のあとご飯食べたりしてたけど,終電の存在を考えてなくて気づいたら電車なくなってた.少し歩いて銀座線に乗るという手もまだあったのだけど,東銀座から森下まで試しに歩いてみた.思ったより遠くて45分くらいかかった.
蕎麦食べた.
寿司食べた.銀座はエンゲル係数高くなる...
昨日から体の調子悪い.夕方まで寝ていた.
選挙行くついでに買い物行くかと思って,家を出たのだけど,整理券持ってなかった.まぁとりあえず買い物だけ済まそうと思ってそのまま秋葉原まで行ったけど,財布も持ってなかった...今朝カバンの中身を全部出したのを忘れていた...レジで気づいたので急いで家に戻ったりしてとても疲れた.結局投票には行けず.
明日の会社でのLTのネタを決めないと....
眠い.
\0がヌル文字に見える病気.
銀座3日目.ラーメン食べました.
会社が家から遠くなると,出社するときは,予定が入ってたりしてわりと時間通りに会社に行くけど,帰るのが面倒で良くないです.
今週はまじめに仕事しないといけない感じなので,いろいろ忙しい.
今日も気づいたら明治座の前にいたのは秘密です...会社に行こうと思ってから,仕事を始めるまでの行動がほぼ無意識で,その間は別のこと考えてるので,新しいオフィスに行くのは難易度が高い.
「ななかInside PRESS vol.3」の文章かかせてもらいました.
8/12 月曜日(3日目) 東ぺ-15a「第7開発セクション」
表紙もボリュームも内容も,なんかすごいです.
今日から新しいオフィス.銀座怖い.
歌舞伎座の上にそびえ立つ歌舞伎座タワー.
今までの明治座の倍くらいの高さ.
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が正しく実行されて欲しくて,かつサーバサイドでデータを置き換えたい場合って結構あると思うのだけど,みんなどうしてるんだろう.
眠い...時間と気力が足りてない.
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
本たくさんあると処理時間やばそうなので,少しいじって高速化しつつ.
明日から歌舞伎座か.どうやって会社に行こう...電車かなあ
ScanSnapの日.15冊くらいスキャンしてみたけど,かなりつらい.
VPSのうち1台の環境を作りなおそうと思ったのだけど,面倒になって,うっかりもう1つ契約してしまう.大阪か石狩を選べるようになってたので,試しに石狩にしてみたけど,やっぱり少し遅いですね.家からpingが20msくらい.東京だと4msで,大阪でも12msなので,比較するとかなり反応悪い.
とはいっても,東京から石狩までの経路が1000kmあって,光ファイバーの屈折率が1.5くらいだとすると,理論上でも往復10msかかってしまうので,良い方なのかも.
東京が一番近くで良いのだけど,新たに契約するときに選択できないんだよなあ.
引越し.会社移転するのでいろいろ.明治座のオフィス,4年間仕事してきたけどこれで最後か.
新しいオフィス楽しみだけど,家から遠くなるのがなぁ.家の引越しもそのうち考えないと.銀座の徒歩圏内で住めるところあるといいけど.
あとは机が狭くなるっぽいのが心配...
飲み会.
とても暑い...秋葉原までラーメン食べに行ったり,新卒の子達と寿司食べたり.
暑い.休み中にやるはずだったことをどうにかしないと.
木崎湖→松本→東京
朝から木崎湖に飛び込んでしまった.服とか靴とかびしょ濡れになったけど,どうせ温泉入るので気にしない.
城山公園の展望台.
県の森.旧制松本高校.
メーヤウのグリーンカレー食べた.
メーヤウは松本にいたころしか行ってなかったので,ほぼ10年ぶり.松本キャンパスも久しぶりに見た.
10年前はここに住んでたんだなあと,懐かしい話を色々した.
急に思い立って授業中にペットボトルロケット作りはじめるは,ラップトップ使わないから閉じろと言われたら,ノートPC閉じていっせいに席を立ち教室を出て行くは,大学内で水鉄砲に希釈したバニラエッセンスを詰めて撃ちあったりするは,ちょっとひどい学生だと思われても仕方ないエピソードも思い出した.
東京着いて,ご飯食べて解散.
ysaotome,niwasaki,kmuroi,gazyuと長野へ.
東京→松代→長野→木崎湖
昨日,目覚ましもセットせずに寝てしまったので,3時間くらい寝坊した.起きたら集合時間を45分ほど過ぎていて,電話の着信履歴たくさん...危なかった.携帯電話はバイブレーションすらしないマナーモードになってたりするので,全く気づかないことが多い.
家まで車で迎えに来てもらって,長野へ.
途中で,いつも行っていた松代の酒屋さんに寄る.学生時代と何も変わってないと言われて,実際そうなのだけど,僕は太ったと言われた.確かにそうか.
工学部.在学中に植えておいた梨とか葡萄とか桃とかリンゴの実がついていた.イチゴも植えたけど,ほぼ野生化していた.
木崎湖キャンプ場へ.
雨の中バーベキュー.
木崎湖一周.少し雨降っていたけど,今回もホタルがけっこういた.
暑い.
眠い.明日は朝から出かけるので準備する.
いつのまにか,Google Play booksで,PDFをアップロードして読めるようになっていた.PDFの管理をどうしようかと思ってたところだったので使ってみることに.
アップロードできないPDFが結構あると思ったら1ファイル50MBまでみたいですね.もともとがPDFな電子書籍と,薄いライトノベルをスキャンしたPDFくらいなら50MBに収まるので,そのあたりの本を放り込む.Googleドライブ上のPDFと同期してくれる機能が欲しい…….
AndroidのPlayブックスアプリは,AmazonのKindleアプリにも言えることだけどページめくり方向は設定できない……ちょっともったいない.色々見てると,どんどんストレージを圧迫していくのも困りもの.
先日のバージョンで色々バグを仕込んでしまってたので色々直しました.あと,zipファイル周りの非同期処理がずっとバグってて,高確率で開きなおしたときにページが復元されなかったり,最初のページが表示されなかったり色々良くわからない動作をしてたのも直した.
自炊本リーダー(仮)をアップデートしました.
画像読み込みのキューイング処理を変えてみたり.アップデート後にシークバーでページめくるときに,違うページが表示されるバグに気づいたので近いうちにもう一度アップデートしよう….
この時期になると,新卒の新入社員も含めてエンジニア全員でご飯食べる日があるのですが,今年はエンジニア決起集会という名のハッカソンらしいです.
何かネタ考えようと思ったけど,半日でできそうなネタってけっこう難しいです.加えて,仕事で使ってない言語とフレームワークなのも悩む.Java,Scala,Ruby,AS3,Objctive-Cあたりはここ1年で仕事の開発で使った言語なので,HaskellかGoあたりが良さそう.
会場に行くまで何やるか決めてなかったのだけど,前に話してたネタがあったので,3人チームでやる.Androidアプリ作りたい気もしたけど,せっかくGoやる気になってたのでサーバサイドを書く.
Go + Revelで写真投稿サイトのようなものを作っていました.
2年ぶりに触る.ちょっと触ったことはあるけど,意味のあるプログラム書くのは今日が初めてです.
Goは1.1になってるのか.ずっと前に入れたやつを消して入れなおす.GOPATHとかの環境変数が必要になったっぽいので設定.
Revelはわりと素直なMVCなWebフレームワークで,Playとかを使ったことあるなら簡単に使えます.というかPlay Frameworkによく似ています.
インストールにhgとかいるのか.
revel runコマンドで起動すると,ファイルを弄るたびに自動的にコンパイルされる上に,Goのコンパイルは早いので,スクリプト言語感覚で実装できて良いですね.かつ,型があるので安心して書ける.
自動再読み込みしてコンパイルエラーになるときは,前の状態で動いていてほしい時がほとんどなので,どうにかならないかな.ブラウザ上でエラーとか見れなくても良いので.
マルチパートのPOSTとかもよしなにやってくれる.routesのmethodを「*」にしておくとダメっぽいので,ちゃんと書いとく必要あるようです.
GoからRedis使ってみたけど,redisクライアントをどれ使うかで結構悩んだ.
http://redis.io/clients を見るとGoの実装も並んでるのでこの中から選ぶ.あまり考えずに,上から見ていって簡単に使えそうなのを探す.
というわけで,今回はgodisを使ってみた.実際どれが良かったのかわからない.
Goのtemplateも使ってみたけど,ぐぐって出てくる情報は古いのが混ざってて,探しにくい.リストはrangeで処理すれば良いことは分かった.
ただ,Revelで使うときviewsの下に壊れたhtmlテンプレートが一つでもあると,全部止まってしまうのは試行錯誤してるときに,ちょっと不便だった.
使い慣れない言語とフレームワークで5時間でどうにかするのはギリギリだなと思ったけど,やっぱりギリギリでした.RevelもGoも素直だったおかげでなんとかなりました.
ピザたくさん食べました.余ったピザを貰ってきたので,帰って冷凍庫に詰め込むのに一苦労...
新卒の新入社員と話をしたり.