Hatena::ブログ(Diary)

ネリモノ

2013-03-06 このエントリーを含むブックマーク

はてなブログで書いてみることにしました。

http://mshibata.hatenablog.com/

2012-10-07 gunicorn + flask + gevent + websocket このエントリーを含むブックマーク

エコーバックするだけのアプリです。

websocket といえば node.js みたいな空気が嫌だったので python でもやれるよってことを書きたかっただけっていう。

apache で公開しようとするとなんか普通にやっても無理っぽいし、じゃあ gunicorn 使えばいいじゃんってことでやってみたんだけど意外とこういう情報がまとまっていなかったので折角だし。

gunicorn, libevent は既に入っているものとして書きます。

python 側は、flask, gevent, gevent-websocket が必要になるので pip とかで install してください。


ファイル構成

├── gunicorn.py
├── index.py
├── runserver.sh
└── templates
    └── index.html

index.py

#!/bin/env python
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from flask import Flask, request, render_template


app = Flask(__name__)
app.config.from_object(__name__)

ctx = {}
ctx['port'] = 8080

@app.route('/')
def index():
  return render_template('index.html', ctx=ctx)

@app.route('/api')
def api():
  if request.environ.get('wsgi.websocket'):
    ws = request.environ['wsgi.websocket']
    while True:
      message = ws.receive()
      if message is None:
        break
      ws.send(message)
  return

if __name__ == '__main__':
  http_server = WSGIServer(('',ctx['port']), app, handler_class=WebSocketHandler)
  http_server.serve_forever()

templates/index.html

<!DOCTYPE HTML>
<html>
<head>
  <title>Flask/Gevent WebSocket Test</title>
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
  <script type="text/javascript" charset="utf-8">
      $(document).ready(function(){
          $('form').submit(function(event){
              ws.send($('#data').val())
              return false;
          });
          if ("WebSocket" in window) {
              ws = new WebSocket("ws://" + document.domain + ":" + {{ ctx.port }} + "/api");
              console.log("WebSocket is supported by your Browser!");

              // Let us open a web socket
              ws.onopen = function() {
                // Web Socket is connected.
                console.log("Message is sent...");
              };
              ws.onmessage = function(msg) {
                  $("#log").append("<p>"+msg.data+"</p>")
              };
              ws.onerror = function() {
                // websocket is closed.
                console.log("Error ...");
              };
              ws.onclose = function() {
                // websocket is closed.
                console.log("Connection is closed...");
              };
          } else {
              alert("WebSocket not supported");
          }
      });
  </script>
</head>
<body>
  <p>gunicorn + flask + gevent + websocket</p>
  <h1>Send:</h1>
  <form method='POST' action='#'>
    <textarea name='data' id="data"></textarea>
    <div><input type='submit'></div>
  </form>
  <h1>Receive:</h1>
  <div id="log"></div>
</body>
</html>

gunicorn.py

bind = '127.0.0.1:8080'
workers = 5
backlog = 2048
worker_class = 'gevent'
debug = True
daemon = True
pidfile = 'gunicorn.pid'
logfile = 'gunicorn.log'

runserver.sh

pkill -f 'gunicorn'
gunicorn -c gunicorn.py -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" index:app

動かし方

chmod +x runserver.sh
./runserver.sh

とかして、 http://127.0.0.1:8080/ にアクセスすれば動きます。


参考

flask + gevent + websocket - http://blog.liris.org/2010/11/flask-gevent-websocket.html

gevent-websocket - http://www.gelens.org/code/gevent-websocket/

2011-05-08 dotcloudに招待されてから実際に動かすまで このエントリーを含むブックマーク

dotcloud流行ってますね。

僕もinviteきてからしばらく放置していたのでこれを機にflaskアプリでdeployしてみようと思いました。


$ pip install dotcloud

dotcloudをshellから操作するコマンドをインストールします。

$ dotcloud

APIキー https://www.dotcloud.com/account/settings

を入力します。

$ dotcloud create testapp

$ dotcloud deploy -t python testapp.www

"testapp"というアプリを作成して"www.testapp"にデプロイします。


実際にローカルでアプリを作成します。

$ mkdir testapp

$ cd testapp

(ここで下記のようなアプリを作成する)

$ tree

.

├── __init__.py

├── testapp

│   ├── admin

│   │   ├── __init__.py

│   │   ├── static

│   │   │   ├── css

│   │   │   ├── images

│   │   │   └── js

│   │   ├── templates

│   │   └── views.py

│   └── frontend

│   ├── __init__.py

│   ├── static

│   │   ├── css

│   │   ├── images

│   │   └── js

│   ├── templates

│   └── views.py

└── wsgi.py


nginxで動くようなのでwsgi.pyの中身を書いておきましょう。

pathなどは適時変更してください。

import sys
sys.path.append('testapp')
from frontend.views import app

def application(environ, start_response):
  return app(environ, start_response)

あとはこのディレクトリの中身をdotcloudにpushすれば動きます。

$ cd testapp

$ dotcloud push testapp.www .


http://www.testapp.dotcloud.com にアクセスして、先ほど作成したアプリの画面がでれば成功です。

誰かdotcloudのチュートリアル日本語訳してくれないかなー(チラッチラッ


参考URL

2010-11-06

node.js + express + mongodb + mongoose を試してみた

そんな組み合わせを使う機会に恵まれたのでせっかくだからメモ。

websocketとかやりたい人はそれようのサンプルがいっぱいあると思うのでそっちを見たほうがいいです。

mongodb は既にインストールされていることを前提として書きます。

# node.js のインストール
$ git clone git://github.com/ry/node.git
$ cd node
$ ./configure
$ make 
$ sudo make install

node.js がインストールできたら、ruby でいうところの gem のような npm をインストールして便利なものを追加していきます。

# npm のインストール
$ curl http://npmjs.org/install.sh | sudo sh
# node.js 用フレームワーク express のインストール
$ sudo npm install express
# node.js 用 ORM/ODM mongoose のインストール
$ sudo npm install mongoose

node.js で使える mongodb driver は、 mongoose の他にもいくつかあるようです。

http://www.mongodb.org/display/DOCS/node.JS


モデル定義。

// user.js
require.paths.unshift('vendor/mongoose');
var mongoose = require('mongoose').Mongoose;
var db = mongoose.connect('mongodb://localhost:27017/test');
mongoose.model('user', {
  properties: [
    'name', 'age', 'created_at',
  ],
  methods: {
    save: function (fn) {
      this.created_at = new Date();
      this.__super__(fn);
    }
  }
});
module.exports = db.model('user');


アプリを書きましょう。

※ /templates とか /static とかはそのうち使うと思うので書いておく。

// app.js
var express = require('express');
var app = express.createServer();
var User = require('./user');

app.configure(function(){
    app.set('views', __dirname + '/templates');
    app.use(express.methodOverride());
    app.use(express.bodyDecoder());
    app.use(app.router);
    app.use(express.staticProvider(__dirname + '/static'));
});

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
    app.use(express.errorHandler());
});

app.get('/', function(req, res){
    // インスタンス作成
    var u = new User();
    // データセット
    u.name = 'otsune-tan';
    u.age = '12';
    // 保存 
    u.save();

    // 読み出し & ブラウザへデータ送信
    User.find({'age':'12'}).all(function(docs){
      console.log(docs);
      res.send(JSON.stringify(docs)); // find().all() の結果を string にして出力してるだけ
    });
});

console.log('run server. port 8080.');
app.listen(8080);

ブラウザで http://localhost:8080/ にアクセスして、mongodb の中身がずらずらーっと出てきたら成功です。

2010-10-12 Facebookでテキストをシェアする方法 このエントリーを含むブックマーク

Facebookが日本でも波に乗り始めた昨今、皆様いかがお過ごしでしょうか。

コメントをつけたり、写真やリンクをシェアとかできて楽しいですよね!


でも、テキストのみの発言を「シェアしたい!」と思ったことはないですか?

通常は写真やリンクまたはノートなど、ファイルまたはファイルを参照するものだけに「シェア」ボタンが表示されます。

友達もっと欲しいお!><

みたいな発言がTLに流れてくると、Twitterをやっている感覚でついついRTしたくなりますよね。

Facebookならシェアしたくなりますよね。

でも普通にボタンが表示されないので、方法を探してみました。


1.シェアしたい発言のURLをコピーする

f:id:Malan:20101012020436p:image



2.自分のTLの発言窓にフォーカスを合わせるとリンクボタンがでてくるのでクリック!

f:id:Malan:20101012020604p:image



3.1でコピーしたURLを貼り付けて、「添付」をクリック!

f:id:Malan:20101012020605p:image



4.シェアするときにコメントを添えることができるので、あれば入力して「シェア」!

f:id:Malan:20101012020606p:image



※ちなみにこれは複数人によってシェアされているのでわかりづらいかも知れませんが、

「自分の名前」さんが「対象の名前」さんの近況をシェアしました。

と表示されていれば成功です!


僕のIDは http://www.facebook.com/mshibata です。

よかったら友達になってください!!!><

Facebook楽しいお!!!

2010-07-27 macports 1.9.1 on SnowLeopard で tk の build に失敗する件 このエントリーを含むブックマーク

ticket探したらこんなのがあった。

https://trac.macports.org/ticket/23481


しょうがないから

$ sudo port install tk -quartz

することで無事解決。



あと移動先のBlogは秋田ので終了しました。

2009-09-16 ニコ生アラートAPI for pythonの公開とBlog移動 このエントリーを含むブックマーク

しばらく自宅サーバにおいてるwordpressで書く。

http://blog.mshibata.net/


あとニコ生アラートAPIpython library作りました。

ニコ生に対するクエリの結果は基本的にbeautifulsoupで変換してから返します。

githubで後悔公開してます。

nicoliveapi-py – http://github.com/mshibata/nicoliveapi-py