Angular.jsの社内勉強会やった
ここしばらくAngular.jsを使っていたので、そのフィードバックを社内勉強会でやってみました。
こんな感じで使ってみたという内容になっていて、Angular.jsの日本語の情報はまだまだ少ないと思うので少しでも役に立てれば幸いです。
と同時におかしなところがあったら教えてもらえると嬉しいです。
JavaScriptで文字列を数値にするときは+valでやりたい
を見ていて、
「+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固有の問題なのかは不明です。
発生する条件
非同期処理のコールバックの中
- 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); } } }
試したこと
- 非同期処理の前で、ctx.save()して、使う前でctx.restore()したけどダメ
- ctx.scale()で縮小を試してみてもダメ
- ↓を参考に試してみたけどダメ...
Perl5.14でeval内の$@の挙動が変わっていた
Try::LiteとException::Tinyで例外処理をやろうと導入していたのですが、どうやらネストさせてTry::Liteを使った場合に外側でうまく例外をキャッチ出来ないという現象が発生して悩んでました。
Try::Liteで外側で例外を取得出来なかった例
こんなコードです。
自分が使っているPerlのバージョンは5.14より古いものでしたので、ここにある通り外側で例外がキャッチできない状態でした。
die $@でも、$@->rethrowでもException::Tiny->throwでもダメでした。
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便利
- http://weblog.bulknews.net/post/46471116934/introducing-milla
- http://shoheik.hatenablog.com/entry/2013/04/13/132010
今回はモジュール作るのにDist::Milla使ったのですが、Dist::Milla自体のインストールには時間かかりましたが本当に簡単にモジュールを作れたのでとても便利で良かったです。モジュール作るのどうすればいいのか悩まずにアプリのコード書くこと集中できました。
こういうのってCPANにあげたりしていいのかな。。PrePANとかにまずあげればいいのかな。
「OAuth 2.0をはじめよう」を読んだ
http://www.oreilly.co.jp/books/9784873115580/
知識を整理
この本ではOAuth2はどういった仕組みで認可しているということが簡単に書かれていて、わかっている人にとっては当たり前のことしか書いてないと思いますが、自分はイマイチ理解出来ていない部分もあったので知識を整理するという意味で読んでよかったです。
などなど...
実際に使うときに
OAuth2.0のAPIを使いたいときに、WebアプリやJavaScriptなどのクライアントアプリ、ネイティブアプリから使う場合など、それぞれの場合でaccess_tokenなどをどう扱えばいいのかいったことが書いてあってとても勉強になりました。
また現在だと古い部分もあるのかもですが、GoogleとFacebookのAPIを例にして、実際にどう使えばいいのかがコードを使って説明してあってわかりやすかったです。
あと、OpenID Connectについても少し書いてあるのもよかったです。
というわけで
今だとtwitterとかfacebookとかと連携したアプリを作る場合は、大抵この辺りはライブラリが用意されていてそれを使うと思うのですが、ライブラリではどういったことが行われているのか、そのようなライブラリを作る場合はどう実装すればいいのかを考える上で、知識を整理出来る薄くてすぐ読めるいい本だと思いました。
Webでの情報を集めたり、APIドキュメント読めばわかることなのですが、わかりやすくまとまっていますしAPIドキュメントを読む前に読んでおくと理解しやすいのではないかと思いました。
EBook(ePub、mobi)のみでiPadで111ページ程で1,365円とお求めやすくなっております。