投稿

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

[Go言語] 豆知識、小ネタ

まだまだよくわかっていないGo言語。 何をするにもどん詰まる。とにかく小ネタを記録する。 byte配列を文字列(string)に変換する var s = make([]byte,10) s[0] = 'a' fmt.Printf("result=%s",string(s) ) stringをbyte配列に変換する s := "test" b := []byte(s) 何でも入るmapを作る(keyは文字列) m := make(map[string]interface{}) m["first"] = "test" fmt.Printf("result=%s",m ) mapをJSON化する "encoding/json"のimportが必要 m := make(map[string]interface{}) m["f"] = "test" r,_ := json.Marshal(m); fmt.Printf("result=%s",string(r) ) JSON文字列をmap化する "encoding/json"と"strings"のimportが必要 s := strings.NewReader(`{"f":"test"}`) d := json.NewDecoder( s ) m2 := make(map[string]interface{}) d.Decode(&m2) fmt.Printf("result=%s",m2 ) TimeをJSON化する time.Timeはjson.MarshalでJSON化してくれないようだ。 というわけで、マニュアルでJSON化。 t := time.Now() s,_ := t.MarshalJSON() fmt.Printf( "%s", s ) string

[Dart] PolymerでObservableにsetterを使う

observableのプロパティに、setterを使いたいときってあるよね。 こんな感じ。 String _title = ""; @observable String get title => _title; set title( String t ) => _title = "hoge $t"; で、html側で{{title}}ってやるわけですが。 でも、これ動きません! titleの実体がfunctionだからだと思いますが、変更イベントが飛ばないのです。 というわけで、自分で変更イベントを飛ばせばOKとのこと。 具体的には、setterを下記のように変更します。 set title( String t ) {   _title = notifyPropertyChange( #title, _title, t ); } notifyPropertyChangeの仕様は下記の通り。 dynamic notifyPropertyChange(Symbol field, Object oldValue, Object newValue) 戻り値はnewValueとなっています。 そして、これをするとgetterの@observableが不要になります。つまり、observableに頼らず、自前で変更イベントを出せるってことですね。 …っていうか、#titleって何ヨ? 本来、const Symbol("title")としなければいけないっぽいが、表記を省略できるってことかね? 参考資料: 同様の質問 https://groups.google.com/a/dartlang.org/forum/#!topic/web-ui/hxCqmwjnLIA まさにこれのサンプル https://github.com/sethladd/dart-polymer-dart-examples/tree/master/web/setter_with_observable_property_change

[Dart] PolymerElementを動的に作成

PolymerElementを状況に応じて動的に作成すること、したいよね〜。 Seth Laddのサンプルによると、ore-tagというカスタムタグがあるとして、 querySelector("#place").childlen.add( new Element.tag("ore-tag") ); とすればいけるとのこと。 確かにこれで問題なく動くのだが、ワナがひとつ。 Pub Buildすると正しく動かんのだ、これが。 具体的には、enteredViewが呼ばれない。グハッ! バグじゃね?

[Dart] ゲーム作ってみた

Dartでゲーム作ってみたよ。 http://www.niku-mansei.com/contents/05club/club04game00.html Canvasバリバリ系。 フレームはいわゆるsetTimerで取っている。 スマホでも動作するけど古い端末だとちょっと重いかも。 描画をキレイにするために、実は倍の解像度で描画してるんだが(いわゆるRetina対応)それが原因っぽい。 しかし、Dartは楽ちんですな〜。 もう、JavaとかObjective-Cとかやる気しないな〜。

[Dart] Polymer 資料&豆知識

DartでWebアプリを作るならPolymerってヤツを使わずにはいれないよね。 ということで、下記、勉強のための資料。 Seth Laddによるサンプル https://github.com/sethladd/dart-polymer-dart-examples/tree/master/web Polymerのサイト http://www.polymer-project.org/ templateのリファレンス http://www.polymer-project.org/platform/template.html 豆知識 on-clickのコールバックメソッドの引数は決まっている。 void handle(Event e, var detail, Element target ) on-clickのコールバックに独自の引数を渡したい時は独自attributeを使う。 HTML <td on-click="{{handle}}" data-key="{{data.key}}"> Dart void handle(Event e, var detail, Element target ) { var hoge = target.attributes['data-key']; ... } PolymerElementにて表示開始を取る時は、enteredView()をオーバーライドする。 void enteredView() {   print("表示されたなう"); } PolymerElement内でquerySelectorするときはshadowRootを使う。 void enteredView() {   var e = this.shadowRoot.querySelector("#mes");   e.text = "表示されたなう"; } PolymerプロジェクトをJavaScriptアプリとしてエクスポート 通常のDartプロジェクトはdart2jsを使うんだが、Polymerプロジェクトの場合は、「Pub Build」

[iOS]ステータスバーを明るくしてみる

iOS7でステータスバーの文字を明るい色に設定する方法について。 いろいろな情報に惑わされたが、結局、下記メソッドを各ViewControllerに追加するだけで効いた。 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } ちなみにこれは、ナビゲーションバーが出ていると効かない(呼ばれない)。doesn't workってやつだ。 試しにやってた画面がたまたまナビゲーションバー付きで、やってもやっても効かず半泣きになってしまったぞ。 …と思ったけど、もうひとつ条件があるようだ。 どうやら、TabViewController内に入っている各Viewで上記を設定しても効かないっぽい。 手元のプロジェクトで、各Viewで設定しても効かなかったのだが、TabViewControllerで設定したら効いた。 (ただ、そのプロジェクトはTabViewControllerをかなりカスタマイズしているので、そのせいの可能性もある)

[JavaFX] WebView関連のTIPS

JavaFXのWebView、こいつは使えるかもしれないぜ。。 右クリックのメニュー(Context Menu)を出なくする webView.contextMenuEnabledProperty().setValue(false); Javaから好きなスクリプトを実行する(またはwindowオブジェクトを取得) JSObject obj = (JSObject)webView.getEngine().executeScript("window"); window.openでポップアップを出なくする webView.getEngine().setCreatePopupHandler( new Callback<PopupFeatures,WebEngine>() { @Override public WebEngine call(PopupFeatures arg0) { return null; } }); 全てのAタグを取得する Document doc = webView.getEngine().getDocument(); NodeList nodeList = doc.getElementsByTagName("a"); 上で取得したElementにclickリスナーを貼る for (int i = 0; i < nodeList.getLength(); i++) { EventTarget t = (EventTarget) nodeList.item(i); t.addEventListener("click", listener, false); } 上で貼るリスナーの実装 EventListener listener = new EventListener() { @Override public void handleEvent(Event evt) { String domEventType = evt.getType(); if (domEventType.equals("click")) { Element el = (Element)evt.getCurrent

[Dart] web_ui : bind色々

下記の変数を設定した時のサンプル @observable String  data テキスト入力・・・type="text" <input type="text" bind-value="data"> チェックボックス・・・type="checkbox" <input type="checkbox" bind-checked="isChecked"> ※isCheckedはboolの変数。もちろん@observableが必要。 select <select bind-value="data">   <option value="one" selected="{{ data=='one' }}">その1</option>   <option value="two" selected="{{ data=='two' }}">その2</option> </select> なにかと面倒なselect。bind-valueでOKだが、各選択肢のselectedを工夫する必要あり。ちなみにこれは同時にひとつしか選択できない場合のみ有効。

[Dart] web_ui : observableとかbindとか

Dartのweb_ui、まさに最新のwebアプリの作り方という感じだ。 bindやobservableで、なんだか知らないけど変数を変更しただけで 表示が更新されてくれて、超便利! だが、実際ちょっとやってみると、「なんだか知らないけど」レベルではマズイ。 というわけでTopicをまとめてみた。 {{ }}とは html側に埋め込む。{{ }}で囲まれている式の返り値のtoString()が、そこに表示される文字列となる。 但し、ここで使われている変数に「@observable」を付けないと、変数を変更しても即座に反映されない。 @observableとは dart側に使う。変数に対して付ける。 これを付けられた変数は、以降、「変更」されると再描画が走るようになる。 変数を「変更」するとは 「変更」とはインスタンスの変更である。同じインスタンスでは、その中身をいくら変更しても変更とはならない。 @observable List  a = []; とした時、 a = ["hoge"]; とすれば再描画される。 が、 a.add("hoge"); とやっても再描画されない。(実はこの時に再描画を行う方法がある) ところで、ここで言っている「再描画」とは、htmlに埋め込まれたinstantiateや{{ }}が再評価され、最新の状態が画面に反映されることである。 toObservable()とは 上記で、a.add("hoge")では再描画されないとしたが、往々にして、こういう時再描画してほしい。 でも、再描画させたいからといってListを作りなおすのはバカらしい。 ということで用意されたのがtoObservable()。 下記のように、toObservableでインスタンスをラップする事で、強制的に再描画を起こさせる。 a.add("hoge");  // ここでは再描画しない a = toObservable(a);  // ここで再描画する ちなみに、toObservableはMap,Set,Iterable専用らしい。 instantiateとは html側に使用する。templateタ

ShiftJIS

■ShiftJISについて 2バイト文字の第1バイト 0x81~0x9Fの30個 (2進数では1000_0001~1001_1111) 0xE0~0xFCの29個 (1110_0000~1111_1100) 2バイト文字の第2バイト 0x40~0x7E (0100_0000~0111_1110) 0x80~0xFC (1000_0000~1111_1100) 半角カナ 0xA1~0xDF (1010_0001~1101_1111) ■文字コード表 Shift-JIS http://www.seiai.ed.jp/sys/text/java/shiftjis_table.html ユニコード http://www.tamasoft.co.jp/ja/general-info/unicode.html

[Dart]Stream.listenに2重のリスナ

DartのStreamのリスナ管理の話 Stream.listenを使ってリスナを貼るのだが、やればやるほどリスナが貼られていくよね。 new ButtonElement() ..onClick.listen( ()=> print("hoge") ) ..onClick.listen( ()=> print("hoge") ); 結果 >hoge >hoge これは、onClick呼び出し内でStream<T>がnewされるためだ。(EventStreamProvider.forTargetを内部で呼んでいる) そして、listen()でさらにStreamSubscription<T>がnewされている。 実際にリスナを持つのは、このStreamSubscriptionで、こいつはリスナを一つしか持てない。 ということは、リスナは追加ではなく差し替えにしたい場合、こいつのonDataを書き換えてやれば良いわけだ。 ちなみに、StreamSubscription.cancel()を呼び出すことで、それ以降のイベントの配信を停止できる。 下のソースは、クリックされるたびにTextを変更し、2回目のクリックでそれ以降のイベントの受信を停止するサンプルだ。 ButtonElement btn = new ButtonElement(); StreamSubscription<Event>  s = btn. onClick .listen( null ); s.onData( ( e ) {   btn. text = "first click" ;   s.onData( ( e ) { btn. text = "second click" ;s.cancel(); } ); } ); 参考: Getting Your Feet Wet with Streams

[Dart]Streamを返す関数

例えばElementのonClickなど、Streamを返す関数はDartの標準ライブラリに多数存在する。 というわけで、自分もStreamを返す関数を作りたい。 以下、サンプル。 StreamController<String> cont = new StreamController(); Stream<String> get onReceive => cont.stream; void update() { HttpRequest.request("http://...../data") .then( (HttpRequest req) { cont.add(req.responseText); if( isFinish ) // 終了フラグ cont.close(); }) .catchError( (e) { cont.addError(e); }); } キモはStreamControllerだ。 addメソッドでデータを送り、終了したらcloseメソッドでストリームを閉じる。 エラーはaddErrorメソッドで通知。 ちなみに、このサンプルでデータ取得ハンドラを貼るには下記のようにする。 a.onReceive.listen( (String data) => print(data) ); ※上記サンプルがクラスとして定義されて変数aになっているとする。

[Dart]Futureを返す関数

Dartで標準で用意されているメソッドはFutureを返すものがある。 これは遅延を伴う処理を、無駄なく行うための重要な機構だ。 というわけで自分のメソッドもFutureを返すようにしたいのだが、 そのやり方は下記の通り。 Future<chartdata> httpAccessTest() { Completer comp = new Completer(); HttpRequest.request("http://..../xxx") .then( (HttpRequest req) { // 成功した時 comp.complete(req.responseText); }) .catchError( (e) => comp.completeError(e) ); // 失敗した時 return comp.future; } これはhttpでデータを取得するサンプルだ。 Completerオブジェクトを使用するのがミソ。 っていうか、それしかないが。 正常終了の結果はcompleteメソッドで通知。 エラーは、completeErrorメソッドを使用して通知。サンプルでは元の処理でThrowされているものをそのまま転送している。 ちなみに、Completerが使えるのは一回こっきりだ。使い回しはできない。 Futureの使い方 http://www.dartlang.org/articles/using-future-based-apis/ Futureのエラーハンドリング方法 http://www.dartlang.org/articles/futures-and-error-handling/

HTML5 Canvas

直線がぼやける件 HTML5のCanvasでlineWidth=1の直線を描画した時、 ぼやけるのが嫌だったのだが、 座標に0.5を足すことでパキっとした線になることを知った。 ブラウザ上でコードをEditして動作テストする http://www.html5canvastutorials.com/tutorials/html5-canvas-line-width/ HTML5 Canvasのパフォーマンスの改善 http://www.html5rocks.com/ja/tutorials/canvas/performance/ canvasをdivにぶら下げると下側に謎のスキマが空く件 これは、canvasの下端がテキストのベースラインと揃えられているからです。 というわけで、canvas側にvertical-alignを設定しましょう。 vertical-align : bottom; ratina対応の件 Dartでの例。 つまり、canvasの属性のwidthとheightは2倍に指定し、styleのwidthとheightは普通に設定した上で、座標変換に2倍を設定しておけば、何も考えずにOK。     canvas = new CanvasElement( width:w* 2 , height:h* 2 );     canvas . style.. width = " ${w} px" .. height = " ${h} px" ;      canvas . context2D .scale( 2 , 2 ); drawImageで画像を描画するとぼやける件 非ratinaでもratina対応をすると案外キレイになるぞ。 でもまあ重いんだが。 多段階のαチャネル(半透明)の画像の描画が重い件 どのブラウザでも重いが、とくにFirefoxで重いらしい。諦めた方がよさそうだ。

nginxでlocalhostとしてアクセスをサーバーに転送する方法

Windowsにnginxをインストール 下記のDLページのstable版(Windows-1.2.7)をダウンロード http://nginx.org/en/download.html zipを展開し、適当なフォルダに置く nginxの設定ファイルの書き換え nginxの中の、nginx.confをエディタで開き、下記の記述を探す。 server {     listen       80;     server_name  localhost;     ... その最後に以下の記述を追加。これは、本物のサーバーに転送するための設定。 location /aaa {     proxy_pass http://www.xxxx.com/aaa; } ※"/aaa"は、転送したいパス名。 ※proxy_passは、転送先のURL ※上記2つのどちらも最後に"/"が無いのがミソ。 ちなみに、以下の記述で、ローカルPC内のd:\xxxxディレクトリに直結できる。 location /test {     alias d://xxxx; } nginxの開始 cmd.exeで、nginxがあるディレクトリまで行き、次のコマンドを実行 start nginx ブラウザでアクセスしてみる ブラウザを開く "http://localhost/aaa/..."というURLでアクセスし、本物のサーバーと同じレスポンスが返ってくることを確認してみよう。 nginxの終了 開始と同様にcmd.exeで、次のコマンドを実行 nginx -s stop