投稿

2014の投稿を表示しています

[Go] mapのソート

配列のソートは強力だけど、 mapのソートは、JavaのTreeSetみたいには行かないようだね。

[Go] Push配信サーバーを作ってみた

GoでPush配信サーバーを作ってみた。 go run gopush.go で実行すると8085ポートで待ち受け開始。 別のターミナルとかで、 curl -v http://localhost:8085/con?key=hoge ってやると配信を受けられる。 ブラウザとかで、 http://localhost:8085/api/push?key=hoge&mes=hello にアクセスすると、ターミナルにhelloが通知されるよ! このkeyで通知先を変更するのだ。 こんなの簡単に作れちゃうGo言語、すごいね! goroutine(go/channel/select)が強力すぎて、Javaのwait/notifyとか戻れないよ!

[Go] http、chunked、切断検知、TimeOut、channelのclose

Push配信するhttpサーバーを目指すサンプル。 盛り込んだ要素は下記の通り。 httpサーバー →普通です。すみません。 Transfer-Encoding: chunked →しょっぱなにw.WriteHeader(http.StatusOK)、  そして、w.(http.Flusher).Flush() goroutine&channel time.Sleep →渡す値は、単位を掛ける。 channelのcloseとその検知方法 →close()は組み込み関数。  そしてchannel受信には2番目の戻り値があることを知れ timeoutを仕掛ける方法 time.Afterでchannelゲットだぜ 通信切断の検知方法 →w.(http.CloseNotifier).CloseNotify()でchannelゲットだぜ 複数channelの同時受信 →selectをforで無限ループだぜ。あとラベル付きbreak。 ロギング →log.Println()だぜ。 盛りだくさんだぜ~

[Go] Chunked Transferで返すHTTPサーバー

HTTPのストリーミングサーバーのいわゆるLong Pollingってヤツ。 net/httpを使う普通のやり方に加えて、 ポイントは WriteHeaderを先に呼ぶ http.ResponseWriterをFlushする ってこと。 Transfer-Encodingヘッダをchunkedにするとか、 Content-Lengthヘッダをセットしてはいけないとか、 は、勝手にやってくれる。 これを起動したならば、curlコマンドで試してみませう。 curl -v http://localhost:8085/ ヘッダが表示され、 < HTTP/1.1 200 OK < Date: Fri, 24 Oct 2014 05:14:14 GMT < Content-Type: text/plain; charset=utf-8 < Transfer-Encoding: chunked その5秒後に one その5秒後に two が表示される!

[Angular.dart] 試してみた

バージョンが1.0.0になったし、 Angular.Dartを試してみた。 まずは、 Angular.Dartサイトのチュートリアル からサンプルをダウンロード。 なるほどなるほど。 っていうか、{{name}}って見えてますけど。 ng-cloakを設定しなければイカン? してもダメですけど。 Dart版では、自力でdisplay:noneを設定しなければいけないとのこと。 <style>     [ng-cloak] {       display: none !important;     } </style> ・ ・ <body ng-cloak> ・・・まあいいや。 次、Chapter_02。 Controllerねぇ~。 へぇ~。 って、ビルドエラー出ましたけど。 どういうこと?? おっと、Dart版ではControllerがボツってることが判明。 なぬ~?? よく考えてみたら、普通にDartのクラスで良いので確かに不要だわな。 っていうか、チュートリアル更新してよ。 急にこのサイト信用できなくなったよ、もう。 JS版とDart版の違いをまとめたサイトがこちら。 http://victorsavkin.com/post/86909839576/angulardart-1-0-for-angularjs-developers-introduction 上記サイトにリンク貼ってあるサンプルはこちら。 https://github.com/vsavkin/angulardart-sample-app 公式から飛べるけど、やりたい事別サンプルはこちら。 https://github.com/shailen/angulardart-samples/tree/master/mini_samples#angulardart-mini-samples

[Dart] Polymer : 独自selectを作ってみた

HTMLのselectって基本的にワナが多いよね。 Polymerでのselectも正直言って不便。 valueでは初期値が渡せないのでselectedIndexでやるしかないのだが、indexって扱いづらい。 <select value="{{src}}"> というわけで、いい加減イヤになって、独自のカスタムselectを作ってみた。 (Paper Elementsを使うとちゃんとしているのかなー?) こんな感じ。 でも、IEとFirefoxでは動かないんだよね! $['select']が正しく効かないのよ。 Polymerって一体いつ使い物になるのか?って感じだよね…。 Angularにするかな…。

[Dart] Polymer : カスタムフィルタを作成する

PolymerでWebアプリを作っている時、 値段を表示したい時とかあるじゃないですか。 <div>スマイル{{ price }}円</div> ってやるじゃないですか。 でも、値段って大抵3桁毎にカンマ付けないと怒られるじゃないですか。 というわけで、Dart側で、 var nf = new NumberFormat("#,##0","ja_JP"); price = nf.format(rowPrice); とかやるのちょっとバカバカしいじゃないですか。 っていうか、こういうのって表示の問題だと思うんですよね! であれば、MDVでいうとViewであるHTML側でなんとかならんのかと。 って思ってたのですが、 そういうとき、Polymerのカスタムフィルタ機能でなんとかなりそう。 [HTML側] <div>スマイル{{ price | priceformat }}円</div> [Dart側] NumberFormat nf = new NumberFormat("#,##0","ja_JP"); String priceformat( String str ) => nf.format(str); 以上。 本家のPolymerでは、 HTML側でfilterに引数を設定することも可能 なのだが、内部のソース(polymer_expressions/eval.dart)を見た感じ、無理じゃね?という感じ。

[Dart] Futureサンプル 連鎖編

Futureがまだ直感的に使えない。 パッと出てこない。 下記は、Futureを連鎖させるサンプル。 FutureAの次にFutureBをやりたい時に使う。 HttpRequest.getString("http://hoge.com/") .then( (str) {   var  result = str+"hoge";   return new Future.value(result); }) .then( (r) {   print(r);  // http://hoge.com/から取得した文字列にhogeを追加したもの })

[Dart] Polymer : Shadow Elementの取得

Shadow Element(ほんまもんのHtmlElement)を取得するには、 PolymerElementの$を使う。 jQueryっぽいが、ここにはidしか指定できない。 (だって、Map<String,Element>だ) しかも、制限があって、template if等で消される可能性のあるものは検索できないようだ。 (polymer[0.12.2+1]で確認) <polymer-element> <template>   <div id="hoge">  // ←これは取得可能    <template if="{{ visible }}">      <div id="fuga">   // ←これは取得できない      </div>    </template>   </div> <template> </polymer-element> polymerの各種ケースのサンプル https://github.com/dart-lang/polymer-dart-patterns

[Dart] Polymer : inputのchangeイベント

inputでのon-changeイベントは、focusをlostした時の意味。 編集内容の変更をリアルタイムでウォッチするイベントはon-inputだ。 ただそれだけ。

Dart : packagesが空になってPub Getでエラーが出るようになった件

ある日、Dart Editorで謎の赤バッテンがでるようになった。 packageのimportで「そんなpackageねぇ!」みたなエラーが出ていた。 そんなはずない、と思いつつpackageのツリーを見てみると、確かに一部のpackageが空になっている。 その時は、gitでbranchの切り替えを頻繁にやっていた。そのせいかもしれないなぁ、と思いつつ、Pub Getをやってみるも、 Unhandled exception: Uncaught Error: FileSystemException: Cannot open file, path =... とエラーが出て進まず。 万事休す…と思って、ネットの情報を漁っていたら…ありました。 https://groups.google.com/a/dartlang.org/forum/m/#!msg/editor/Sel-OJd-vfw/1Z2z0wYvY08J PubのCacheを削除するといいよ!ということらしいです。 というわけでこの情報通り、 AppData/Roaming/Pub/Cache/hosted の pub.dartlang.org を削除したらPub Getが通るようになって無事解決です! このネットの情報では、「Windowsのsymlinkはhellだよ!」みたいなセリフがありました。 いつもはMacでやっているのですが、たまたまWindowsでやらざるを得なくて、いざやったらコレだよ。 Windowsなんとかしてください。 っていうか、Dart Editorのバージョン上げて今までのソースが動かなくなるのが怖くて、サブ機のWindowsで試したんだよね。Dartもそろそろ落ち着いて頂きたい!

[Dart] Dartでパースしてくれない日付について

DartのDateTime.parseでは、 "2014-04-01T01:02:03+09:00" の文字列をなぜか解析してくれない。 これってRFC3339でもISO8601でも定義されていると思うんだがー。 ホントにトホホだよ! というわけでDateFormatを使用した回避方法。 まず、intlパッケージをインストール pubspec.yamlのdependenciesに「intl:any」を追記する。 dependencies :     intl : any 続いてソース。 import 'package:intl/intl.dart' ; … var df = new DateFormat("y-M-dTH:m:sZ"); var t = df.parse("2010-10-12T13:20:30+09:00"); print(t) print(t.toUtc()) これで出力内容は、 2010-10-12 13:20:30.000 2010-10-12 04:20:30.000Z となる。 面倒すなぁ。

[Dart] コマンドラインアプリのためのDart資料

サーバーサイドもしくはコマンドラインアプリのためのDartのサンプルが用意された。 Dartはブラウザアプリだけではないよ、ってことを本気で言いに来たようだ。 Dart By Example https://www.dartlang.org/dart-by-example/#dart-io-and-command-line-apps 載っている情報は下記の通り。 ファイル関連 ファイル操作、ディレクトリ操作、シンボリックリンクの作成 文字列の読み込み、書き込み バイト配列の読み込み、書き込み テンポラリファイル、ディレクトリの作成 'package:http/http.dart'を使ったHTTPリクエスト GET&POST ※同じサーバーに連続してリクエストするときClientを再利用する技が目からウロコ レスポンスの読み込み。文字列もしくはバイナリで。 'package:http_server/http_server.dart'を使ったWebサーバー バインド…HttpServer(これはdart:io) ファイルを返すだけのディレクトリ専用クラス…VirtualDirectory 特定のURLパターンで処理を振り分ける…Router, UrlPattern その他 Socket通信…ServerSocket, Socket WebSocket…WebSocketTransformer, WebSocket OS情報取得…Platform.environment, Platform.operationgSystem スクリプト自身のパスを取得…Platform.script 外部コマンドの実行…Process URLやファイルパスの連結、分解、相対パス化、解析…'package:path/path.dart'