node.jsで簡単にircへメッセージ送信
https://github.com/you21979/bot-irc-notifier
サーバーからircにサーバー落ちたよとエラーメッセージを通知をするシステムが欲しかったので作ってみた。
ただ作るだけじゃおもしろくないのでtypescriptで作ってみたけど単純な仕組みなので
あまり型の恩恵ない。
さて、実装方法だがredisを使っている
なんで使っているかというと
・redisはコマンドラインから簡単にメッセージを流せる
・redisとircはどちらもチャンネルと言う概念がある
・npmにライブラリがある
チャンネルという共通点を生かしてredisのチャンネルにポストすればirc上の同じチャンネルにポストするようにすればチャンネルも送信時に選べるしお手軽。
(irc側は事前にチャンネルに入っておく必要があるけども)
こういうシステムとシステムを繋げるのにnodeはお手軽にできるからいいね
↓みたいなシェルでircにポストできる
#!/bin/bash CHANNEL="#hogehoge" MESSAGE="テストです" redis-cli publish $CHANNEL $MESSAGE
スキルシート
プログラマの求人みていて思うのだがなぜ言語を最重要視するのだろうといつも思ってた。
言語はたしかに大事だがそれは道具の使い方の話だろうし武器にたとえるならいろいろな流派もあるはずだ。
武人にもしスキルシートがあればこんな感じだろうし
・流派
柳生新陰流(日本刀)
宝蔵院流槍術(十文字槍)
・奥義
無刀取り
活人剣
居合
・型(稽古、基本戦術)
燕飛
三学圓之太刀
奧之太刀
槍しごき
プログラマもこんな感じでいいんじゃね?と思ってしまう。
・流派
・奥義
メタプログラミング
・型(稽古、基本戦術)
オブジェクト指向プログラミング
求人募集をみても流派の募集しかしてないところが多い。
みんな流派(環境)を重視してるのだろうか
システム開発とは流派ありきなんだろうか
戦で兵を募るときは流派で募集かけたりするものだろうか
#厨二病っぽい
re:Ryan Dahl の面接試験:csv データのオブジェクト配列への変換
中島聡さんのブログにある頭の体操をやってみた
所要時間15分くらい
http://satoshi.blogs.com/life/2012/12/ryan-dahl.html
>JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)。
とあるがもっと簡単にできるのかな?とりあえず何も考えずに書いてみた。
var http = require('http'); function get(callback){ var opt = { host: 'ichart.finance.yahoo.com', port: 80, path: '/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv', method: 'GET', agent: new http.Agent({maxSockets: 1}) }; var req = http.request(opt, function(res) { var data = ''; res.on('data', function(chunk) { data += chunk; }); res.on('end', function() { callback(parsecsv(data)); }); }); req.end(); } function parsecsv(data){ var begin = 1; var count = 0; var header = [ ]; var table = [ ]; data.toString().split('\n').forEach(function(line){ if(line !== ''){ var n = 0; var obj = {}; line.split(',').forEach(function(col){ if(count >= begin){ if(n === 0){ obj[header[n]] = col; }else{ obj[header[n]] = parseFloat(col); } table.push(obj); }else{ header.push(col); } ++n; }); } ++count; }); return table; } get(function(table){ // 最終結果表示 console.log(table); });
ストリーム型通信でプログラマが知らなければいけないこと
基本は3つしかない。
これはバイナリだろうがテキストだろうが同じ。
・バッファリング
一回の受信ではデータが揃わないのでデータが解読できるまで貯めておくこと。
・ディスパッチ
データを解読してイベント処理を発行すること。
・イベント
イベント処理を受け取って必要な処理を行うこと。
■バッファリング
ストリーム型のデータには切れ目がない
だから送信時に切れ目を認識できるようにする
送信時には先頭にパケットデータサイズを入れておく
データが到着したらパケットデータサイズをまず確認して
自身が管理している受信可能最大値と比較して超えていたらドロップする
問題がなければパケットデータサイズ分データが貯まるまでバッファリングする
■ディスパッチ
3つの工程がある
・解析
パケットデータサイズ分のデータがたまったら解析処理を行う。
大抵がパケットサイズのあとに何を処理するかの種別データを埋め込んでおき
種別データを元にイベントを発行する。
・データ組立
なんのイベントかわかったらデータの組立処理を行う。
足りないデータなどがあればそれはおかしなパケット。
・イベント発行
イベント処理用の関数に組み立てたデータを入れて呼び出す。
■イベント
ここまで来たらなんの目的の処理かわかるので処理するだけ。
例:
パケットサイズ;イベント1;データ1;パケットサイズ;イベント2;データ2;パケットサイズ;イベント3;データ3;
nodejsで実行時にスクリプトファイルを読み込んで実行する
C++などでluaを使ってよくやるスクリプトシステムと同等の仕組みを意味があるか別としてやってみた。
new Functionを使うと簡単かつJITが効く速いコードができる。
逆にこういう用途に使うであろうvmモジュールはくっそ遅い上にunstableなので使いにくい
var fs = require('fs'); var txt = fs.readFileSync('./filevm.jss'); var MAX = 1000000; [function(){ var TID = 'newFunction'; var ctx = { hoge : 0, fuga : 0, }; var f = new Function('"use strict";'+txt); var x = f(); console.time(TID); try{ x.init(ctx); for(var i=0;i<MAX;++i){ x.update(ctx); } }catch(e){ console.log(e.stack); } console.timeEnd(TID); console.log(ctx.hoge); console.log(ctx.fuga); }].forEach(function(f){ f(); });
スクリプト側
function init(ctx){ ctx.hoge = 0; ctx.fuga = 0; } function update(ctx){ ctx.hoge+=1; if(ctx.hoge%2===0){ ctx.fuga+=1; } } return { init : init, update : update, };
100万回実行して13ms
newFunction: 13ms
js側で関数やオブジェクト作ってctxに突っ込んでスクリプト側で実行もできる。
この実装方法であればnode.jsを再起動(接続中のユーザーが切断されずに)しなくてもスクリプト部分だけ再読込して実行できる
東京node学園祭2012参加してきました
東京node学園祭2012参加してきました
イントロダクション
基調講演
New Readable Stream in Node 0.10
Nodeコアの歩き方
~Nodeの開発に参加しよう~
Running Node.js in Production
layering distributed systems
ECMAScript tools - composable modules and transpiler infrastructure
全体として自分は英語のリスニングができないので通訳が大変よかったと感じました。
ECMAScriptがWEBのアセンブラのような位置づけになりそうです。
LLVM、CLR、JVM、ECMAScriptサーバー/クライアント/OS問わず激しいシェア闘いがありそうな予感
あとで見てないセッションのUSTREAMの録画をみてみようとおもいます
Mikeal Rogersさんのやつがtweetみるとおもしろそうでした
http://www.ustream.tv/channel/nodefest2012a
node.jsのベンチマークいろいろ
githubにリポジトリ作った
https://github.com/you21979/nodejsbenchmark
・new Function
new Functionで動的にコード作るのたしかに早い。
evalはJIT効かないけどnew Functionは効いてる
requireが使えないけど。
・mysql + ayncblock
mysqlでasyncblock使った場合の速度低下を調べた
使った場合と使わない場合の比較
・redis + asyncblock
redisでasyncblock使った場合の速度低下を調べた
使った場合と使わない場合の比較