2013年 05月 28日

校正ツール

Yahoo の校正APIを使って文章校正を一度かけるようにしたいというのはずっと考えていたが、いい感じのUIを実装するのが大変に面倒で、ずっと放置していた。

このたびなんとなく ACE 上でなら簡単に実装できそうな気がしたので、実装してみた。こんな感じでいいように思うが、いくつか問題点がある

  • ACE は等幅 (monospace) フォントにしか対応していない
    • 文字の幅が必ず一定になるように1文字ごとにコンテナが作られている
  • IM によっては挙動がおかしい。
    • AquaSKK + Chrome だとそんなにおかしくはないけど、やはり変換中の文字列がちょっとずれて表示されたりはする

とはいえ、だいぶ前に ACE を試していたときは、日本語まわりがもっと挙動がおかしかった記憶があるけれど、ブラウザーが改善されたのか ACE が改善されたのか、普通に使えるぐらいにはなっていそう。

校正をかけて直したところで、筋が通って読みやすい文章がかけるかどうかは分からず、また全然別なのがつらい。

Scala をはじめるには

sbt を入れるのが一番の近道のようだ。

brew install sbt

で入れるのが最も簡単そう。

あるいは、Setup の Unix の欄のように、sbt-launder.jar を ~/bin に置き、~/bin/sbt コマンドを以下のように作って chmod +x しとくのが簡単のようだ。

#!/bin/sh
java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar "$@"

sbt さえ入れれば、必要なものは sbt が全てダウンロードしてくれる。初回起動時に必要なパッケージを落としてくるし、run コマンドを実行すれば (Scala ファイルがあるなら) Scala のライブラリも必要に応じて落としてくれる。全く頭を使わない。

例によって Hello, World! なら

object Hello {
    def main(args: Array[String])  {
		println("Hello!!!")
	}
}

を ~/tmp/hello/hello.scala として置き以下のように sbt を起動して run を実行するだけで実行できる。

$ cd ~/tmp/hello
$ sbt
> run
[info] Running Hello 
Hello!!!

複数ファイルがあったらどうなるか? と疑問になるがやってみるとわかる。

同じようにして ballow.scala を以下のように作る。

object Ballow {
	def main(args: Array[String])  {
		println("Hello!!!")
	}
}

sbt run を実行すると以下のようになる。

Multiple main classes detected, select one to run:

 [1] Ballow
 [2] Hello

Enter number:

かしこい。

チュートリアルがよく書かれていて、「勝手に scala をダウンロードするけど、バージョンの指定はどうするんだよ?」と疑問に思っても、すぐバージョン指定ができることは書いてある

2013年 05月 27日

Mac に RMagick がインストールできない。

$ sudo /usr/bin/xcode-select  -switch /Applications/Xcode.app/Contents/Developer
$ sudo PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.8.0-10/lib/pkgconfig gem install rmagick

で入った。

経緯

imagemagick 自体は sudo brew install imagemagick で入れてある。

Building native extensions.  This could take a while...
ERROR:  Error installing rmagick:
        ERROR: Failed to build gem native extension.

        /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for xcrun... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... no
checking for sys/types.h... no
checking for wand/MagickWand.h... no

Can't install RMagick 2.13.2. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby


Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/rmagick-2.13.2 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/rmagick-2.13.2/ext/RMagick/gem_make.out

Can't find MagickWand.h. でググると「PKG_CONFIG_PATH さえ設定したら入るよwwww」的なエントリが散見されるが、ちゃんと mkmf.log を見るべきである。しかし我々は mkmf.log の居場所をエラーログから知ることはできない。

mdfind mkmf.log すると /Library/Ruby/Gems/1.8/gems/rmagick-2.13.2/ext/RMagick/mkmf.log が出てきたので、システム ruby の場合このへんにあるようだ。エラーメッセージにフルパスを出さない理由は何かあるのか。

mkmf.log を見てみると

Error: No developer directory found at /Developer. Run /usr/bin/xcode-select to update the developer directory path.

とかでている。最近の Xcode は /Developer を使うのをやめたらしい。アップデートのタイミングに自分で xcode-select しろよ。

2013年 04月 30日

au テザリングでの透過プロキシを無効にする


なんか某ネトゲの公式サイトにどうしてもログインできなくて、変だなあと思っていた。よくよく考えてみると WiMAX でテザリングしていたときにも同じことがおきていたような気がするので、たぶん透過プロキシが悪さをしているのかな、と考えた。

WiMAX テザリングだったときは SSH でトンネル掘ってダイナミックポートフォワードしつつ IE に SOCKS を設定してなんとかしていたけど、滅多に問題になることはないのでそれで十分だった。

今回もその手でいくかなあと思っていたけど、透過プロキシを無効にできるというリプライをもらった。全く知らなかったというか、個別に無効にできるとは思ってもいなかったけど、確認したら確かにそんなことが書いてあった。

LTE NETのパケット通信において、以下のファイルを対象に、画面の表示速度や動画の再生開始時間を早くするための通信の最適化を行う場合があります。

※HTTPS通信、Eメール添付ファイルの最適化は行ないません。
※通信の最適化を必要とされないお客さまは、お客さまセンター (157) にて非適用のお手続きをさせていただきます。

http://www.au.kddi.com/mobile/charge/list/lte-flat/

本当にこれで解決するのか興味が沸いたので、157 に電話(!)をして無効にしてもらった。暗証番号を口頭で言わされる (頭おかしい) ので注意が必要そう……

最適化は無効になっても透過プロキシ自体はそのままかもしれないし、他の原因があるかもしれないのでなんともいえない。そもそもログインフォームは HTTPS のはずで、透過プロキシの影響はうけないはずなんだけど、回線を変えたら大丈夫だし、原理がよくわからない。そのうちどうなったか書く。

結論を書くと、透過プロキシは無効化されない。最適化がオフになっているかどうかはよくわからないので検証できなかった。

2013年 04月 12日

CSRF 防止用トークンの自動チェックの問題と解決

自分が作るウェブアプリケーションでは基本的に以下のような規則を守るようにしている

  • GET だけで副作用 (DB書きこみなど) を伴う処理をしないこと
  • POST 時には自動的に CSRF 防止用トークンをチェックすること

これだけで単純な CSRF はまず防げくことができるからだ (実際は CSRF 防止用トークンの生成方法が多少問題になるが、作るウェブアプリケーションによって、どれほど厳密にすべきかが違うため、そのたび考えてやりかたを変えてる)

このような設計をした場合、全ての POST するフォームに input type="hidden" とかで CSRF 防止用トークンを埋めこむ必要がある。ウェブアプリケーションフレームワークによっては、防止用トークンを埋めこむところも自動的にやってしまうものもあるが、外部サーバへ POST するフォームなんかを作ったとき (ASP型の外部サービスとか)、意図せずトークンが漏れるのがちょっと不安なので自分は手動で全部入れることにしている。たとえ入れ忘れても、普通にチェックしていれば必ず気付くし、一行コピペするだけなのでこれで問題はまず起きない。

しかし一方、外部のアプリケーションから直接 POST されるような場合 (なんらかのコールバックとか)、当然ながら CSRF 防止用トークンは送られてこないため、自動チェックにはねられてしまう。なので、こういう場合は明示的に自動チェックをオフにする必要がでてくる。これが地味にややこしい。

Perl で Router::Simple などを使って適当に本体をディスパッチし、その前 (before_dispatch 的なもの) で自動チェックをかけるアプリケーションがあったとする (シンプルに作るとそうなるだろうというもの)。そんなときなんとなく以下のように書ければいいなと一瞬思ってしまうが、これはうまく行かない。

sub dispatch_foo {
    my ($class, $c) = @_;
    $c->check_csrf(0);
    # do something...
}

自動チェックはこのメソッドの前に実行されており、この段階、すなわち呼ばれたあとに「チェックしない」ことを宣言しても遅い。自動チェックをやめて、CSRF チェックするところにだけ $c->check_csrf(1) とか書いてチェックを明示的にするようにする、という解決方法もあるだろうけど、危ういので避けたい。

とにかく、自動的にチェックを行っている以上、そのチェックが行われる前に「この URI (やサブルーチン) に対しては CSRF チェックをしない」宣言をしておいて、自動チェック時にそのフラグを見る必要がある。理想としてはコードのコンパイル時に行われるのが望ましい。例えば以下のように

sub dispatch_foo {
    my ($class, $c) = @_;
    # do something...
}
__PACKAGE__->check_csrf(dispatch_foo => 0);

この場合、サブルーチンに対して CSRF チェックを自動チェックするかどうかを check_csrf() クラスメソッドで宣言しておくイメージになる。

これでとりあえずいいとは思うけれど __PACKAGE__ とか書きにくいし、dispatch_foo は2度出てくるしで、なんとかしくなる。

結論を言うと、この場合、以下のように CODE Attribute を使うのが一番スッキリいくように思った。

sub dispatch_foo : check_csrf(0) {
    my ($class, $c) = @_;
    # do something...
}

Catalyst 以来、最近は CODE Attribute を使っているものを殆ど見ておらず忘れていたのだけれど、こういうときはやはり便利だな、と思った。

これに従って、自分でウェブアプリケーションを作るときのスケルトンにも同じような仕組みを入れた。

Chrome for Android での HTML5 アプリケーションキャッシュ

全部のファイルをキャッシュさせても、一瞬で表示される感じではなく、ローディングバーが表示され、あくまでロードが走っているようにみえる。この時点でネイティブアプリを超えられない。

殆どペライチなページであっても 0.5 秒ぐらいはローディングバーが出る。ウェブフォントやら外部CSSやらを多く使うと、やはり、それなりに遅くなる (Boostrap を特に気にせず使ってアプリケーションキャッシュに入れると 1 秒ぐらい)。低スペックマシンだと不安がある。


ウェブフォントは、そもそもアプリケーションキャッシュさせるにしても、ブラウザごとに読んでいるファイルが違うので悩ましい。全部書くがいいのかなあ。

2013年 03月 03日

洗濯機上の収納を簡単に安く

洗濯機上に収納をつけたいと思っていたけど、スペース的に厳しく、普通に床で支えるタイプのものは置けない感じだった。

なので最初、2本だけで突っ張るタイプで、以下のようなのを最有力候補にしていたのだけれど、よくよく調べてみるとこれは幅が微妙に大きすぎて無理ということがわかった…

アイリスオーヤマ ランドリーラック 突っ張り ステンレス 幅67~97cm×奥行31×高さ200~270㎝ STL-270 - アイリスオーヤマ(IRIS OHYAMA)

アイリスオーヤマ(IRIS OHYAMA)

3.0 / 5.0

仕方ないので、突っ張り棒を3本ほど買って、その上に衣装ケースを置くというのを考えてやってみたけど、あまりに天井スレスレのため (あんまり下に突っ張り棒を張ると、洗面台が使えないような構造なのだ) 引き出すことはできても、中身をとりだすことができなかった。

最終的に、突っ張り棒1本と、クローゼット用の吊り下げ収納を使うことにした。上に置くのではなく、吊り下げるのならば突っ張り棒は天井付近のギリギリに設置することができるので邪魔にならない。

吊り下げ収納はニトリで買った。引き出しは別売りで、全部あわせて 2300円 + 突っ張り棒代ぐらい。

つけてから気付いたけど、引き出しを出すと、手前に傾いてくれるため、意外と使い勝手がいい。位置が高いので嬉しい。


2013年 03月 02日

100均グッズを使ってデスクの天板裏でケーブルの整理

両面テープ式のフック(100均)でワイヤーラティス(100均)を固定して、それにいろいろくくりつけるようにした。

最初、突っ張り棒でワイヤーラティスを固定しようと考えていたけど、フックでも十分な耐荷重を得られそうなのでこっちにした。ただ、経年劣化が心配。

天板裏に貼り付けると殆ど視界に入ることがなくなるので良い。

買ったワイヤーラティスでは案外狭くてごちゃごちゃしてるけど、とりあえず見えない部分については考えないことにした。

固定にマジックテープのやつを使ってみたけど、結構便利。ただ、値段の割にあんまり長くないので、ケーブルタイと併用せざるを得ない…

TRUSCO(トラスコ) マジックバンド結束テープ 両面 黒 10mm×1.5m MKT1015BK - トラスコ中山(TRUSCO)

トラスコ中山(TRUSCO)

3.0 / 5.0

2013年 03月 01日

DELL U2713H 使用感とディスプレイアーム



届いてから、一通り使いはじめることができたので、感想を記録しておく。やはりケーブルの処理が難しい。ケーブル自体になにか工夫がいりそう。

DELL U2713H は SD カードリーダーがついているのが地味に便利で、既に結構使っている。USB 3.0 のハブがついている点も嬉しいと思う。

ColorMunki Photo と付属のソフトウェアでキャリブレーションしたら以下のようになった。(ディスプレイ側の設定は Preset Color Space -> AdobeRGB) 灰色は AdobeRGB の色域。

ディスプレイアームはエルゴトロンのやつで、買う前は本当に必要だろうか?と思ったけど、結果的に買って良かった。というのも、普通にデスクに座ってディスプレイを見る、という用途と、完全に反転させて位置を下げて、床 (ホットカーペットをしいてる) に横になったままディスプレイをダラ見する、というのが両立できて捗るのです。

最初ディスプレイの重さでアームが下がってくる現象があったけど、説明書に従って調整したらいい感じになった。スムーズに動くし、よくできてるなあと思った。

エルゴトロン LX デスク モニターアーム アルミニウム 34インチ(3.2~11.3kg)まで VESA規格対応 45-241-026 - エルゴトロン

エルゴトロン

5.0 / 5.0

ディスプレイフードもだいたいできたけど、内側のフェルト貼る作業が微妙に残ってる。

前書いた通りだけど、コストパフォーマンスは十分に良いと思う。

急速充電用の USB ACアダプタでいいのがない。

手元にあったACアダプタが突然死したため、代わりのを探しているけど、いいのが本当にない。不思議

  • アダプタ内で D+ D- ショート(急速充電)
  • 1ポートで2A出せること

という条件だけなのだけれど、びっくりするほど存在しない。

 -

3.0 / 5.0

これは Android ポートとやらが 2A 出せて D+ D- ショートっぽいけど、無駄に高いし、iPhone も iPad も持っていないので、Apple 側のポートは使いようがない。

 -

3.0 / 5.0

これは一個既に持っている。充電用ケーブルを介して使っているけど、そもそも充電用ケーブルというのを持ちたくないので、できれば買いたくない。充電用ケーブルって短いのしかないので、とにかく不便。それに買うとしても1ポートしか使わないし、以下のやつでいい……

 -

3.0 / 5.0

ほかに

 -

3.0 / 5.0

というのもあるけど、D+ D- の処理がわからない。

これらには当て嵌まらけど、そもそも 2A 対応とか表示してあっても実際は2ポートそれぞれで1Aずつ (合計2A) という意味の場合が多くて、商品を探すこと自体困難。

あるいは最悪、充電ケーブルで 2m 程度のやつがあればいいんだけど、無駄に巻取式だったりして、普通のがない。

結局、au 共通 AC アダプター 04 (1.8A 1.5m ケーブル) というのを買った。最初から一個買っておけばよかった。急速充電にも対応している。