Angular.jsの社内勉強会やった

ここしばらくAngular.jsを使っていたので、そのフィードバックを社内勉強会でやってみました。

こんな感じで使ってみたという内容になっていて、Angular.jsの日本語の情報はまだまだ少ないと思うので少しでも役に立てれば幸いです。
と同時におかしなところがあったら教えてもらえると嬉しいです。


http://koba04.com/slide/get-started-angularjs/

JavaScriptで文字列を数値にするときは+valでやりたい

http://nmi.jp/archives/488

を見ていて、
「+val」で数値として評価するコードはライブラリの中でも時々見るので、自分でコード書くときも+valでやりたいなと思い、parseInt(Float)やNumerとの挙動の違いを少し調べてみたのでメモ。

環境はChromeのDeveloper Consoleでやっています。

+val ParseInt(val, 10) ParseFloat(val, 10) Number(val)
10 10 10 10 10
"10" 10 10 10 10
-10 -10 -10 -10 -10
"-10" -10 -10 -10 -10
0 0 0 0 0
"0" 0 0 0 0
"" 0 NaN NaN 0
"hoge" NaN NaN NaN NaN
"10a" NaN 10 10 NaN
"10.0" 10 10 10 10
"10.5" 10.5 10 10.5 10.5
"10e2 1000 10 1000 1000
null 0 NaN NaN 0
undefined NaN NaN NaN NaN


この挙動を見る限り+valで問題ないので、+valを使っていこうかと思います

Galaxy S4のWebviewで、非同期処理の中でのCanvasの描画がバグってる

追記(2014-01-10): 解決方法書きました!http://d.hatena.ne.jp/koba04/20140110/1389344763


ネイティブの中で使うWebViewの話で、標準ブラウザとChromeでは発生しない現象です


Android 4.2なGalaxy S4のWebViewの中でCanvasの表示が豪快に壊れている現象に遭遇したのでメモ。
アップデートしたGalaxyNexusでは発生しなくて、他に4.2が最初からインストールされた端末がなかったので、4.2の問題なのかGalaxy S4固有の問題なのかは不明です。

状態

  • fillRectやdrawImageをした時に、0,0の位置にある1ピクセルCanvas全体が描画されるような状態になる。

発生する条件

非同期処理のコールバックの中
  • img.onloadの中
    • 画像がキャッシュされていたりして即実行されるときは発生しないことがありました。
img.onload = function() {
  ctx.drawImage(img, 0, 0, 100, 100);
};
  • setTimeout, setInterval
    • 30ms以下を指定すると非同期に処理されない?のか発生しないこともあります。10msくらいにすると確実に発生しなくて、50msくらいにすると絶対発生する
setTimeout(function() {
  ctx.drawImage(img, 0, 0, 100, 100);
}, 20)
// 実際はライブラリ使ってるのでこの書き方では試していませんが..
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    if (xhr.status == 200) {
      ctx.drawImage(img, 0, 0, 100, 100);
    }
  }
}

試したこと

対策

  • 見つかりませんでした。。というわけでcanvasを諦め、DOMで書くことに...
    • Java側でWebView作る時の設定などで解決出来るかと思ったりもしたけど、それもよくわからず...。

同じ現象に遭遇した人のためにわかってることをまとめてみました

grunt watchをIRCから操作する

何?

IRCでgrunt watchのログが見れたり、watchの開始、再起動、終了が出来るものをさくっと作ってみました。

使い方

  • node grunt-watch-irc.jsを実行すると指定したチャンネル(default: #grunt)にbot(default: hostname-grunt)がjoinします
  • joinしたbotにprivate messageで !run と発言するとgrunt watchが起動します
  • うまく動いてなくて再起動したい時は、 !restart と発言します
  • 終了する時は !exit と発言します

いつ使うのか

普通はターミナルでgrunt watchしてそのまま標準出力を見ることが多いと思うので使わないと思います。
ですが、サーバー上でgruntが動いている環境があって黒い画面苦手な人がFTPでファイルアップして使うような場合に、IRCでログが見れてうまく動いていないときにIRC経由で再起動出来たりすればいいかなと思いさくっと書いてみました。

grunt自身のプロセスを制御するのでgrunt pluginじゃなくて単純なscriptになっています。
あるといいなという場面があったのでさくっと書いただけなので、必要な人がいそうならもうちょっとちゃんと書いてみます。

Perl5.14でeval内の$@の挙動が変わっていた

Try::LiteとException::Tinyで例外処理をやろうと導入していたのですが、どうやらネストさせてTry::Liteを使った場合に外側でうまく例外をキャッチ出来ないという現象が発生して悩んでました。

Try::Liteで外側で例外を取得出来なかった例

こんなコードです。

自分が使っているPerlのバージョンは5.14より古いものでしたので、ここにある通り外側で例外がキャッチできない状態でした。
die $@でも、$@->rethrowでもException::Tiny->throwでもダメでした。

Twitterで解決

その時には5.14以上で動くことは知らなくて悩んでいたところ、@hide_o_55さんが

と教えてくださり、試したところ確かにgistにある通り意図した通りに動きました。。

5.14からeval内の$@の挙動が変わった!?

というわけで5.14のどの変更が影響しているのかなぁと思ったところ、ここに書かれているのが影響してそうだなということがわかりました。

同様に eval の中の local $@ はスコープ内の例外を上書きすることは なくなりました。 以前は、巻き戻しによる $@ の復元によって、投げられた例外が 上書きされることがありました。 今では例外はとにかく eval に渡されます。 そのため、die の前の local $@ は安全です。

http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod#Exception32Handling


というわけでevalにして検証コードを書いてみました。evalの中でlocal $@ で値を入れてその後にdieしてみた動作です。

#!perl
use 5.010;

eval {
    local $@ = "foo";
    die "hoge";
};
say "throw Exception [$@]" if $@;

# perl 5.12 (何も出力されない)

# perl 5.14
throw Exception [hoge at try.pl line 14.
]

5.12ではevalを抜けた時に$@が巻き戻されて(?)、undefになってるんですかね...。ちなみにevalの前にlocal $@ = "init";などとしても結果は同じでした。

というわけで

5.14より前の環境でevalの中でlocal $@とやったり、Try::Liteをネストさせて使いたい場合は注意が必要かなと思いました。
Try::Liteが5.14より古い環境でもネストさせても動くようになると嬉しいので、pull req出来たらしたいなと思ったりしています。

Amon2::Plugin::Web::Rawというのを書いてみた

Amon2::Plugin::Web::Rawというのを書いてみました。


追記ModuleをWeb::ImageからWeb::Rawに変更


https://github.com/koba04/Amon2-Plugin-Web-Raw

まぁ見ての通り、Pluginを読み込むとrender_rawっていうメソッドが生えてデータのtype(gif, png, jpeg, swf, zip)とバイナリデータを渡すとPlack::Responseにして返してくれるだけのものです。
Pluginにするほどではないのですが毎回書くのは面倒なのでPluginにしてみました。

用途

画像は通常は静的サーバーで配信すると思うのですが、アプリで合成して画像を出力したり、画像にもアプリと同様の認証をしたいという時に使えるかなと思っています。

Dist::Milla便利

今回はモジュール作るのにDist::Milla使ったのですが、Dist::Milla自体のインストールには時間かかりましたが本当に簡単にモジュールを作れたのでとても便利で良かったです。モジュール作るのどうすればいいのか悩まずにアプリのコード書くこと集中できました。



こういうのってCPANにあげたりしていいのかな。。PrePANとかにまずあげればいいのかな。

「OAuth 2.0をはじめよう」を読んだ

http://www.oreilly.co.jp/books/9784873115580/

OAuth?

OAuthといえば、twitterとかfacebookとかgithubとかと連携したサービスを作るときによく使うと思うのですが、その仕組みって理解できていますか?自分は結構曖昧です。

知識を整理

この本ではOAuth2はどういった仕組みで認可しているということが簡単に書かれていて、わかっている人にとっては当たり前のことしか書いてないと思いますが、自分はイマイチ理解出来ていない部分もあったので知識を整理するという意味で読んでよかったです。

  • ベアラートーク
  • リフレッシュトーク
  • 認可コード
  • インプリシットグラント
  • リソース所有者クレデンシャル
  • クライアントクレデンシャル
  • OpenID Connect

などなど...

実際に使うときに

OAuth2.0のAPIを使いたいときに、WebアプリやJavaScriptなどのクライアントアプリ、ネイティブアプリから使う場合など、それぞれの場合でaccess_tokenなどをどう扱えばいいのかいったことが書いてあってとても勉強になりました。


また現在だと古い部分もあるのかもですが、GoogleFacebookAPIを例にして、実際にどう使えばいいのかがコードを使って説明してあってわかりやすかったです。
あと、OpenID Connectについても少し書いてあるのもよかったです。

というわけで

今だとtwitterとかfacebookとかと連携したアプリを作る場合は、大抵この辺りはライブラリが用意されていてそれを使うと思うのですが、ライブラリではどういったことが行われているのか、そのようなライブラリを作る場合はどう実装すればいいのかを考える上で、知識を整理出来る薄くてすぐ読めるいい本だと思いました。
Webでの情報を集めたり、APIドキュメント読めばわかることなのですが、わかりやすくまとまっていますしAPIドキュメントを読む前に読んでおくと理解しやすいのではないかと思いました。


EBook(ePub、mobi)のみでiPadで111ページ程で1,365円とお求めやすくなっております。


http://www.oreilly.co.jp/books/9784873115580/