万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    2012 Pythonアドベントカレンダー(Webフレームワーク)「Tornado&Titanium連携」

    URL: http://connpass.com/event/1439/


    shinriyoです。万年素人のエンジニアです。(自称クラフトマン)


    普段はUnityというゲームエンジンでゲーム開発してます。
    しかも、UnityScriptというクソ言語(C#で実装されたBooというPythonモドキの言語で実装されたJSモドキの言語)で書いてます。


    Pythonは趣味とたまにちょっとしたツール書くくらいですね。そのBooというPythonモドキの言語もたまに嗜みますよ。


    土日も一日中仕事で、UnityBooアドベントカレンダーを立てたけど
    あまり参加してくれなくてほぼ一人で書いてて時間がとれません。
    ※朝は寒くて早起きできません・・・


    オライリーの洋書もまだ翻訳されてない(途中まで個人で訳したけどw)Tornadoを使いたいと思います。

    このTornadoと、Titaniumとの連携を行なっていきます。
    レベルは初心者向けの内容です。(virtualenv入ってる前提で話し進めますよ)

    ・まずTornadoインストール

    workon pyfes2012 
    pip install tornado

    ※今回はpyfes2012とは関係ないですが、沢山インストールされるのが嫌なので、私は「pyfes2012」をなんでも屋vertual環境にしていますので気にしないでください。



    Titaniumは調子が悪くてTitanium Mobileで何故か新規プロジェクトを作成できなくなってるので、
    Titaniumのプロジェクトをコピーします。(僕の環境がおかしいだけなので真似しなくていいです普通にTitaniumで新規プロジェクト作ってね)

    cp -rf omikuji tornado_test
    

    私の環境はなぜかコンパイルもできなくなってしまってるので、MakeTiというのを使ってます。
    ※詳しくは過去の私の記事見てね。
     → Titnaium Mobileがおかしい時にも使用出来るツール



    Tornadoに話を戻します。

    mkdir tornado
    cd tornado


    ・hello.py
    ※某動物外資系技術書のコードのパクリだろ?ってツッコミはなしで。

    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    
    from tornado.options import define, options
    define("port", default=8000, help="run on the given port", type=int)
    
    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            greeting = self.get_argument('argument', 'Hello')
            self.write(greeting + ', Titanium!')
    
    if __name__ == "__main__":
        tornado.options.parse_command_line()
        app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()
    

    ・実行します

    python hello.py --port=8000

    ブラウザではこうアクセスして見えます。
    GETパラメータなし

    GETパラメータあり



    ◯Titaniumのコードです
    ・Resources/app.js

    var tabGroup = Ti.UI.createTabGroup();
    
    var win1 = Ti.UI.createWindow({
        title: 'win 1',
        backgroundColor: 'blue'
    });
    
    var data = [
        {title:'Tornado Test', hasChild:true, dest:'album.js'},
    ];
    var table = Ti.UI.createTableView({
        data: data
    });
    
    table.addEventListener('click', function(e){
        if (e.rowData.hasChild) {
            var w = Ti.UI.createWindow({
                url: e.rowData.dest,
                title: e.rowData.title,
                backgroundColor: 'white'
            });
            tab.open(w); // call back
        }
    });
    var view = Ti.UI.createView();
    view.add(table);
    win1.add(view);
    
    var tab = Ti.UI.createTab({
        icon: 'KS_nav_views.png',
        title: 'Tab 1',
        window: win1
    });
    tabGroup.addTab(tab);
    tabGroup.open();
    
    Ti.API.info(tabGroup.tabs[0].title);
    

    ・Resources/album.js

    var view = Ti.UI.createView();
    var label = Ti.UI.createLabel({
        color: '#F00',
        text: 'album',
        height: 32,
        width: 150,
        top: 120
    });
    
    // from server
    var xhr = Titanium.Network.createHTTPClient();
    var myURL = 'http://localhost:8000/?argument=';
    var param = 'ひきすう';
    
    // 第1引数はHTTP Method
    // 第2引数はURIです。
    xhr.open('GET', myURL +param);
    
    xhr.onload = function() {
        label.text = xhr.responseText;
    }
    
    // リクエスト送信します。(引数としてJSON値を入れるとパラメータ化される)
    xhr.send(); // 必須
    
    view.add(label);
    Ti.UI.currentWindow.add(label);
    


    ・結果↓

    このように値がとれます。赤い文字で出ますね。


    今後これを応用すれば、いろいろ作れると思います。今回はあくまで基本です

    TitaniumのAdvent CalenderではないのにPythonのコードより長いのは気のせいです、すみません。

    それでは次回15日は@jbkingさんお願いします。