Node.jsでtwitterのストリームをだらだらと流してみる。

twitter-nodeを使う。

var TwitterNode = require('twitter-node').TwitterNode
, sys = require('sys');

var twit = new TwitterNode({
  user: '######', 
  password: '#########',
  track: ['perl','python','haskell','javascript']
});

twit.addListener('error', function(error) {
  console.log(error.message);
});

twit
  .addListener('tweet', function(tweet) {
    sys.puts("@" + tweet.user.screen_name + ": " + tweet.text);
  })
  .stream();

実行結果

$ node tw.js 
@halfstepper: @seocosenza Ah, mi spiace, non ne so niente, io mi occupo di php-html-javascript, per il resto mi barcameno, ma non sono ferrato :-(
@rapella: RT @deliprao: Why MIT switch from Scheme to Python? (via @gappy3000) http://ow.ly/5N6hO
@piotrlukanko: RT @6Wunderkinder: We really need talented #JavaScript and #PHP (#CodeIgniter) developers @6Wunderkinder in #Berlin jobs@6wunderkinder.c ...
@js_gallery: Javascript motion gallery Forum | Yo! Venice! Forum. This forum requires Javascript to be enabled for posting ... http://tinyurl.com/4azlt77
@stackfeed: line aligning, HTML, CSS JAVASCRIPT: I am making an application for an android phone using eclipse, I want to be... http://bit.ly/oe79tO
@perlism: RT !natsutan: Pythonの文字列処理苦手。perlの s// が気楽で良い
@perlism: RT !reanisz: 「Perl好き」とは常日頃言っているが「Perlが得意」な訳ではない・・・(´・ω・`)
@glidepro: RT @creativeapps: New #Javascript feature on CAN: DrippingPaint.Js by @twholman | http://ca-n.in/nWFbWr
@_yueyue350179: RT @perlism: RT !natsutan: Pythonの文字列処理苦手。perlの s// が気楽で良い
@Nikole_2: "I know you like with the lights on, even if they off you can still feel the python" #SWAG
@jcvfeed2: Rugby - Top 14 - Manas : "Une ébauche du projet de jeu" (Rugbyrama.fr) javascript:void(0);

なかなか楽しい。

これからはアジアの中の国のひとつとして日本というものを考えるんだろうな

一ヶ月くらい前に業界の集まりがあったので、割と仲良くして頂いている他社のメディシナルケミストの人にこんな論調の話を振ってみた。

帰ってきた答えは「ケミストはまぁ他の業種でもつぶしが利くから製薬業界にこだわらないでも日本に就職先はあると思うよ」ということだった。でも、これがしめしていることは、合成っていう作業は、誰でもやれる系のコモディティ化するタイプの仕事のひとつってことじゃないかなぁと思った。まぁ、実際替えがきくしね。

さらに昨日、外資系のソフトウェアベンダーさんが量子化学計算ソフトウェアの売り込みに来てたんだけど、「海外のメガ・ファーマのニーズを汲みとって製品設計してますけど、日本のユーザーさんはまだあまりいないので、今入れて頂ければ日本でトップのほうになれると思います」っていう営業トークだもんなぁ。多分国内企業の性格を汲んだトークなんだろうけど、、、

流行を追いかける人には流行をつくりだすことはできないって言葉を思い出した。

自分のいる業界の未来を考えるに、メガ・ファーマのアジアの拠点が日本にないってことは、やはりこの国のこの業界はクォリティ/コストに競争力がないってことだと思うんだよなぁ。日本にこだわる必要あんのかなぁ、伸びそうな国に移って頑張るっていう選択肢を取る人はいないのかなぁ。まぁ、10年20年すれば答えが出るので気長にまとう。

日本人は自分は出ていかずに、お金を先に出稼ぎに行かせる人が多いようです。しかし、お金より先に人が働きに出ていく時代が来たのです。

ProductName アジアの時代を予言して20年
邱永漢
グラフ社 / 1365円 ( 2010-11-26 )


本書はそんな日本の状況をわりと外側から客観的に見たコラムですな。英語が出来たらアメリカとかヨーロッパを目指す記事が割と目に付く機会が多い気がするけどアジアのどこかを目指すっていう方向性もあるんだよなぁと思った。

FlaskでDrag and Drop APIとXHR2で画像をポストする

HTMLガイドブックはphpなのでFlaskでやってみた。この本は良書ですね、オススメです(最後のほうにNode.jsのサンプルも載ってるし)。

ProductName 徹底解説 HTML5 APIガイドブック コミュニケーション系API編
小松 健作
秀和システム / 2730円 ( 2010-12 )


青い囲みの中にドラッグドロップするとアップロードされるが、ドラッグドロップAPIのためにスペースを用意するっていうのはなんかいまいちだなぁ。もうちょっと洗練されたドラッグドロップのインターフェースはないものかね。

file_upload

ディレクトリ構成

$ tree
.
├── static
│   └── uploads
├── templates
│   └── index.html
└── uploader.py

サーバー側

from flask import Flask, request, url_for, render_template, make_response
import os

DEBUG = True
SECRET_KEY = 'development key'
UPLOAD_FOLDER = 'static/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

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

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

@app.route('/')
def show_index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def do_upload():
    file = request.files['xhr2upload']
    if file and allowed_file(file.filename):
        filename = file.filename
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    response = make_response(url_for('static', filename='uploads/'+filename, _external=True))
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response

if __name__ == '__main__':
    app.run()

クライアント側(templates/index.html)

<!doctype html>
<html>
  <head>
  <meta charset="utf-8">
  <title>File Uploader</title>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
  <style>
  #dropbox {
    width: 500px;
    height: 200px;
    border: 1px solid blue;
    background: #eee;
  }
  #urllists {
    margin-top: 30px;
    width: 400px;
    height: 300px;
    overflow: auto;
    floar: left;
    boader: 1px solid blue;
  }
  #currentimage {
    margin-left: 420px;
    margin-top: 30px;
  }
  </style>
  </head>
<body>
<h1>File Uploader</h1>
<div id=dropbox></div>
<div id=urllists></div>
<div id=currentimage></div>
<script>
var DnDUploader = function (base_id) {
  if(typeof(base_id) != "string" || base_id.length == 0 || document.getElementById(base_id) == null)
    return false;

  var __body = document.getElementsByTagName('body')[0];
  var parent = document.getElementById(base_id);
  __body.addEventListener("drop", function(e){e.stopPropagation();e.preventDefault();}, false);
  __body.addEventListener("dragenter", function(e){e.stopPropagation();e.preventDefault();}, false);
  __body.addEventListener("dragover", function(e){e.stopPropagation();e.preventDefault();}, false);
  parent.addEventListener("drop", function(e){e.stopPropagation();e.preventDefault();_handleDrop(e);}, false);
  parent.addEventListener("dragenter", function(e){e.stopPropagation();e.preventDefault();}, false);
  parent.addEventListener("dragover", function(e){e.stopPropagation();e.preventDefault();}, false);

  var _handleDrop = function(e) {
    var x = e.layerX, y = e.layerY;
    var dt = e.dataTransfer, files = dt.files, count = files.length;

    var types = [
            'image/png',
            'image/gif',
            'image/jpeg'
    ];

    for (var i=0; i < count; i++) {
    if (files[i].fileSize < 1048576) {
        var file = files[i];
        var type = file.type;
        var filename = file.fileName;

        if($.inArray(file.type, types) == -1) {
        alert(file.type + 'はサポート外です。');
        continue;
        }

        var reader = new FileReader();
        reader.readAsDataURL(file);
        _upload(file);

        reader.onload = function(e) {
        var fileData = e.target.result;
        _drawImage(x, y, fileData);
        }
    } else {
        alert('ファイルが大きすぎます');
    }
    }
  };

    var _drawImage = function(x, y, file) {
    var imgElement = document.createElement('img');
    imgElement.src = file;
    imgElement.style.position = 'absolute';
    imgElement.style.display = 'none';
    parent.appendChild(imgElement);

    setTimeout(function(e) {
        var o_w = imgElement.width;
        var o_h = imgElement.height;
        imgElement.width = o_w > 100 ? 100 : o_w;
        imgElement.height = parseInt( o_h * imgElement.width / o_w);

        var w = imgElement.width;
        var h = imgElement.height;
        imgElement.style.left = (x-w / 2)+'px';
        imgElement.style.top = (y-h / 2)+'px';
        imgElement.style.display = 'block';
    },1);
    };

    var _upload = function(file) {
    var fd = new FormData();
    fd.append("xhr2upload", file);
    var xhr = new XMLHttpRequest()
    xhr.open("POST", "http://www.kzfmix.com:5000/upload");
    xhr.send(fd);

    xhr.onload = function(e) {
        var url = e.target.responseText;
        $('#urllists').prepend('<p><a href="' + url + '">'+url+'</a></p>');
        $('#currentimage').html('<img src="' +url+ '">');
    }
    }
}

DnDUploader('dropbox');
</script>
</body>
</html>

ウッフィーという資本

ツイッターあまり関係ないし原著の題名THE WHUFFIE FACTORだし、日本語タイトルに騙されてた。新しい経済はどう回るか、どう回すかを考えさせられる本ですな。

貨幣資本から知識資本、そしてその先にはウッフィー資本が待っているのかなぁと漠然と感じる。

いま私たちは2つの並行する経済を生きている。そして俗に言う「資本」つまり「マーケットキャピタル」は、ソーシャルキャピタルがたくさんあるところで生まれるようになってきているのだ

わかったブログで見かけて以来、読まなきゃ思って積んでいたのだけどやっと読み終えた。

ProductName ツイッターノミクス TwitterNomics
タラ・ハント 津田 大介(解説)
文藝春秋 / 1650円 ( 2010-03-11 )


  • ウッフィーつまり信頼や評判を勝ちうるには、コミュニティとの関わり方で量より質が大事
  • 金銭的報酬はやり方が難しい

ウッフィー資本自体はそれほど目新しいものではないと思うけど、それが重要視されるファクターになってきたというか、セルフブランディングの重要性が増しているということかなぁと思う。

というわけで、LinkedInの日本語版は結構楽しみだったりする。

参考書籍

ProductName モチベーション3.0 持続する「やる気!」をいかに引き出すか
ダニエル・ピンク
講談社 / 1890円 ( 2010-07-07 )


ProductName ネクスト・ソサエティ ― 歴史が見たことのない未来がはじまる
P・F・ドラッカー
ダイヤモンド社 / 2310円 ( 2002-05-24 )


FlaskでXHR2を試す

XHR2はJSONPと比べてどんなメリットがあるんだろうか?

JSONPで行っている事は、外部のJavascriptを読み込んでいることに他ならず、不用意に利用することは大変危険な行為です。

ProductName 徹底解説 HTML5 APIガイドブック コミュニケーション系API編
小松 健作
秀和システム / 2730円 ( 2010-12 )


まぁ、JSONPはハック色が強いですからね。

というわけで、クロスドメイン間で通信ができるというXHR2を試してみた。

サーバーのコード

ログ見てわかったんだがPOSTメソッドの時はOPTIONSで問い合わせないっぽい。なのでコメントアウトしても動いた。Access-Control-Allow-Originは必須で、コレがないと動かない。

from flask import Flask, make_response, request

app = Flask(__name__)
app.debug = True

#@app.route('/events', methods=['OPTIONS'])
#def view_events():
#   response = make_response()
#   response.headers['Access-Control-Allow-Origin'] = '*'
#   return response

@app.route('/events', methods=['POST'])
def show_events():
   u = request.form['username']
   p = request.form['password']
   response = make_response("user: %s, pass: %s" % (u, p))
   response.headers['Access-Control-Allow-Origin'] = '*'
   return response

if __name__ == '__main__':
   app.run(host='www.kzfmix.com')

クライアントのコード

普通にXMLHttpRequestをnewしてPOSTメソッドでsendする

<!DOCTYPE html>
<html>
<head>
<title>xhr2 test</title>
</head>
<body>
<script>
document.addEventListener("DOMContentLoaded", function(){
 var formData = new FormData();
 formData.append('username', 'myuser');
 formData.append('password', 'mypass');

 var xhr = new XMLHttpRequest();
 xhr.open("POST", "http://www.kzfmix.com:5000/events");
 xhr.send(formData);
 xhr.onerror = function(e) {
   console.log("ERROR");
   console.log(e);
 }

 xhr.onload = function(e) {
   console.log("LOAD");
   console.log(e);
   console.log(xhr.status);
   console.log(xhr.statusText);
   console.log(xhr.responseText);
   alert(xhr.responseText);
 }
}, false);
</script>
</body>
</html>

実行結果

xhr2_test

異なるドメイン(オリジン)間でデータの受け渡しが出来てる

$ python xhr2.py 
 * Running on http://www.kzfmix.com:5000/
 * Restarting with reloader...
124.41.xx.xxx - - [26/Jul/2011 19:23:51] "POST /events HTTP/1.1" 200 -
124.41.xx.xxx - - [26/Jul/2011 19:24:04] "POST /events HTTP/1.1" 200 -

今日の畑(110724)

夏真っ盛りだけど、今年の家庭菜園の調子はいまいち。

テンションが上がらないとか、風邪ひいたとか、出張が入りまくったとかそんな感じで足が遠のいているうちに草ボーボーになってた。

久しぶりに二時間かけて除草を行ったらまぁまぁましになった。ナスは連作障害っぽかったので場所を移したら復活しそうな気配だけど、ピーマンはどうかなぁ。

1311593192 1311593194

ミョウガは梅雨明けから急に立ち枯れしまくって、半分は枯れた。残りのものからミョウガが採れだしたけど妙に苦味が強くて不評。ちょっと処分しようかと思う。一方ミニトマトは順調。そろそろ黒いミニトマトも色づく(黒づく?)頃なのでちょっと楽しみ。

1311593175 1311593177

紫蘇はこぼれ種から雑草のように生えまくって捨てるほどある(というか雑草として抜いてる)

隣のおじさんは紫蘇ジュースにすればいいんだよとか言うんだけど青汁っぽくて嫌だなぁと躊躇している。右側はオクラ、これは順調っぽいが、オクラはすぐに虫が付くから気を使うんだよねー。

1311593180 1311593200

ゴーヤはやっと実がつきだした。来週から収穫できるだろうな。去年はすでに沢山なっていたので、ペースは遅い。植えるのも遅かったからかなぁ。

1311593198 1311593196

久々に畑仕事をやったけど、やっぱ楽しい。今年は作付け計画とかいろいろうまく行ってないけどそれも含めて自分の責任だからなぁ。あまり完璧を目指さずしなやかに土を活用していきたい。

ところで、コンパニオンプランツとして植えようと思っていたマリーゴールドがベランダで枯れかけているのを見て植えようかどうか迷っている。ポット育苗も畑に移すタイミングを逃すとヤル気がなくなることも学んだ。

観賞用マリーゴールドってことでいいかなぁ。

紀土 夏の純米

これで2.1Kとはかなり攻撃的な値段ですな。

キリッピリッとした感じがたまらんです。コストパフォーマンスはかなり良いと思われます。

1311592844

2,3回連続で飲みつづけてもいいかなぁと思える味わい。

オススメ。

Node.jsで作るechoサーバー

Node.jsとは何かの写経

このエントリはわかりやすかった。

var net = require('net');
var sockets = [];

var server = net.Server(function(socket) {
   sockets.push(socket);

   socket.on('data', function(d) {
       for (var i=0;i < sockets.length; i++) {
           sockets[i].write(d);
       }
   });

   socket.on('end', function() {
       var i = sockets.indexOf(socket);
       sockets.splice(i,1);
   });
});

そしてFelix's Node.js Style Guide(和訳)も参考になった。

javasciptの新刊二冊

グラフィックスとNode.js

両方気になるなぁ。

ProductName Supercharged Javascript Graphics
Raffaele Cecco
Oreilly & Associates Inc / 3957円 ( 2011-07-29 )


ProductName Node: Up and Running: Scalable Server-Side Code With Javascript
Tom Hughes-croucher
Oreilly & Associates Inc / 2877円 ( 2011-09-22 )


起業成功マニュアル

ポジショニングの要諦

  • なぜ創業者はその組織を立ち上げたのか
  • なぜ顧客はその組織をひいきにすべきなのか
  • なぜすぐれた人材はそこで働くべきなのか

人材探し

  • その人はあなたが必要とすることをできるか
  • その人はあなたが考える事業の意義に賛同しているか?
  • その人はあなたが必要とする強みがあるか?

ProductName 完全網羅 起業成功マニュアル
ガイ・カワサキ
海と月社 / 1890円 ( 2009-05-29 )


  • 組織が成功するのは事業計画が優れているからではない。実行力にたけているからだ
  • 外部の資金を1ドルでも入れたら、その瞬間にあなたは「支配権」を失う