node-http-proxyでPOSTするとError: socket hang upが起きてた問題

実をいうと、これまで、このブログはPOSTを送るだけで落ちてたようです。えっ

まあブログ見る分ならPOSTすることはないだろうしー・・・ということで今まで放置してました。おい
Error: socket hang up
at createHangUpError (http.js:1476:15)
at Socket.socketCloseListener (http.js:1526:23)
at Socket.emit (events.js:95:17)
at TCP.close (net.js:465:12)

このまま毎回POSTするたびに落ちるのはちょっとまずいので、やっと修正しました。

元のコード:

var http = require('http');
var httpProxy = require('http-proxy');

var apacheProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 8080
}});

var nodeProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 8081
}});

var server = http.createServer(function ( req, res ) {
    if (req.headers.host == 'potproject.net') {
        nodeProxy.web( req, res );
    } else if (req.headers.host == 'blog.potproject.net') {
        apacheProxy.web( req, res );
    } else {
        res.writeHead(404);
        res.end();
    }

});

server.listen(80);

これに追加したコード。

apacheProxy.on('error', function(err, req, res) {
    res.end();
});
nodeProxy.on('error', function(err, req, res) {
    res.end();
});

ただerrorをキャッチするだけで修正なのか?と思いますが、これで正常に動きます。

元々、bodyParser middlewareを使用してPOSTをオブジェクト化し、req.bodyを受け取らないといけないようなのですが、
bodyParserなんて使っていないためreq.bodyがうまく受け取れずにerrorとして処理される・・・って感じらしいです。

参考:Connect ソースコードリーディング(4) – bodyParser
でも、proxyはPOSTを受け取って処理する必要はないし、問題はないのでこのままです。

一応ちゃんとした解決策として。これを解決したいなら、

  • body-parserモジュールを使用する。
  • Expressなどのbody-parserを行ってくれるフレームワークを使用する。
  • といった方法があるようです。

    参考(というかほぼ同じ問題のstackoverflow):socket hang up error with nodejs

    node.jsなんかでオンラインなゲームを作る(2) enchant.jsでまず画面作成

    まずはクライアント側のゲーム画面から製作していきます。

    今回作るゲームと言うのは、fabfibというカードゲームのオンライン版クローン。
    【ゲーム紹介】FABFIB – 東大ボードゲームカフェブログ

    元々、よくオンライン上でボードゲームをする友達とプレイするためというのが目的で作ってます。
    画像なんかもちゃんと自作で用意。

    カード画像を作成。このゲームは50枚も必要。
    sample

    そして、enchant.jsで殺風景なUIを作成。
    enchant.jsをとui.enchant.jsを使用して表示しています。

    enc
    このような形になりました。

    使ってる主要なコード説明。
    enchant();
    おまじない。初期化するために最初に書きます。

    var game = new Game(900, 400);
    ゲーム画面本体を作成。

    game.preload('./image/0d1.png');
    画像のプリロード(ゲームを始める前にあらかじめ読み込む)

    var cardA = new Sprite(100, 160);
    cardA.image = game.assets['./image/header.png'];
    cardA.x = 60;
    cardA.y = 120;
    game.rootScene.addChild(cardA);
    位置を指定して、Sprite オブジェクト(図や画像を表示するオブジェクト)として画像を表示。

    var buttonp = new Button("参加");
    buttonp.moveTo(210,350);
    game.rootScene.addChild(buttonp);
    ui.enchant.jsで定義されている、buttonオブジェクトを使ってボタンを表示。

    var inputname = new Entity();
    inputname.width = 100;
    inputname.height = 20;
    inputname.x=100;
    inputname.y=350;
    inputname._element = document.createElement('input');
    inputname._element.setAttribute("name","name");
    inputname._element.setAttribute("type","text");
    inputname._element.setAttribute("maxlength","12");
    game.rootScene.addChild(inputname);
    入力のためのtextboxを表示

    今回はアクションゲームでもないし、動いたりする必要もないため、ほぼこの繰り返しで画面は作ってます。
    クリックしたなんかの判定は、addEventListener(Event.TOUCH_START, [callback])で取得します。
    ゲーム部分は処理は殆どサーバ側で行うようにするため、クライアントは表示やサーバにデータを送るくらいの機能。
    画面だけのハリボテなんでまあこのままじゃゲームとはいえないですね。処理側も作っていきましょう・・・

    前:node.jsなんかでオンラインなゲームを作る(1)
    次:node.jsなんかでオンラインなゲームを作る(3)

    Windows8/8.1でエクスプローラーやタスクバーが固まるバグ(Windows Updateのせい)

    3月のWindows Updata後、この不具合が自分のPCでも頻繁に起こるようになりました。

    なんでかなーと探ったところ、Windows Updateのバグなのはほぼ確実のようです。これだからUpdateは・・・

    Windows8ではシャットダウンで勝手にアップデートしてくれますし、Update切りたいと思えるレベルですよ。
    修正パッチが出たのでいいのですが。

    どういう不具合かについて、いろいろあるようですが自分のマシンでの現象
    かなりの確率でこれがよく起こってました。

    • 1.長時間使用する
    • 2.同じアプリケーションを2つ以上開く
    • 3.タスクバーのタブをクリックしアプリケーションを選択しようとする
    • 4.クリックした後に5,6秒間くらいExplorer.exeフリーズ!
    • 5.そのままフリーズ後、運が悪いとExplorer.exeの再起動が起こる、その後はちょっとだけ正常に戻る
    • 6.1に戻る
    • wu このようなパターン。エディタを2つ以上起動してたりするとすぐ止まるのでうっとうしくてかなわない。 大体IMEとの相性で起こるらしいです。Google日本語入力だと起こらないのかな? 修正プログラムは、今のところは対象者のみに配っているため、手動で入れないと治らない模様←ここ重要。 ついでに、このプログラムはテスト版のようです。めんどくさいならKB3033889を無理やり削除したほうが早いかもしれません。
      オンラインより入手可能な修正プログラムは、マイクロソフトによる完全なテストが行なわれていないため、一般的には公開されておりません。そのため、以下の点にご留意ください。 修正プログラムを適用しても問題が解決しなかったり、より深刻な問題が発生したりすることがあります。 お客様の環境によっては、より適切な修正プログラムが存在する可能性があります。そのためサービスパックのリリースをお待ちになるか弊社エンジニアのサポートをお受けになることをお勧めしています。 一部の修正プログラムには、適用後アンインストールができない場合があります。
      この修正パッチを導入することで、とりあえずこの現象は出なくなりました。 このUpdateは、Explorer.exeが動作停止することで、Explororに依存するゲームなんかもフリーズしたりしてたので、とても悪質なマルウェア修正プログラムでした。 早めの対処をしたほうがいいですね。 3033889 の更新プログラムと Windows のエクスプ ローラー、日本語 IME を使用するシステムで応答を停止するには参考: エクスプローラーやタスクバーが固まる・異常に重くなる問題2015年3月 【Win8、8.1】Windows Update後、タスクバーが固まる現象が発生

    node.jsなんかでオンラインなゲームを作る(1) 準備編

    現在作っているものの記録、その一。タイトルの通りです。
    node.jsをいじるのが最近楽しいので、習得のためにも何か一つアプリでも作ります。
    この記事は基本的に自分の単なる忘れないためのメモなので、あんまり参考にはならないかもしれないです。ふいんき程度です。

    node.js使用モジュール

    • サーバーサイドJavaScript環境node.js
    • node.jsのフレームワークであるExpress
    • Websocketを簡単に使用できるnode.jsモジュールsocket.io
    • MongoDBのラッパーであるnode.jsモジュールMongoose
    • テンプレートエンジンとして使用するejs

     

    クライアント側で使用するjavascriptライブラリ

    • javascriptで動作するゲームフレームワークであるenchant.js
    • あと楽なのでjquery

    これらを駆使することで全てjavascriptだけでサーバー-クライアントで動作するjavascriptゲームを作ることが出来ます。
    使うのは全てjavascriptという点がすごいですね。新しい言語を習得する必要が無いよ!という形で。

    どれもまだ新しいので日本語のドキュメントが無く、いろいろと苦労しつつやっていきます。
    外部のアプリケーションとしてMongoDBを使用しています。
    MongoDBのインストールについてはこの記事に書いてます。

    導入編

    ちなみに自分はWindows環境なので、使うのは大体Windowsです。
    Linuxサーバーでテストするときはあるかもしれないですが、基本的にマルチプラットフォーム環境なので、同じモジュールを入れるだけで動きます。
    node.jsはインストール&Pathを通さないといけませんが、Windows公式パッケージは自動的にPathを通してくれると思います。・・・たぶん。

    node.jsを公式サイトからインストールします。
    Windows版の場合、npm(node.jsパッケージ管理ソフト)も付属してくるようです。
    インストール後は、Pathが通ってればコマンドプロンプトで動作するようになります。
    node -v
    v0.10.33
    ・・・なんか最新版は最近v0.12になったらしいですね。v0.12はECMAScript6の機能が入っていろいろ変わってるようなので、まだ使用してません。
    なのでバージョンは主にv0.10を使用します。
    バージョン上がるの早すぎでついていけない。

    そのあとは、npmでモジュールをインストール。
    個別にインストールしてもいいのですが、あらかじめpackage.jsonを作ってインストールするのもいいです。
    pqckage.jsonパッケージ管理設定ファイルのような、ここにあらかじめ使用する物を書いておくと、
    ファイル内でnpm installとコマンドを打つだけで必要なものを全部取得してきます。
    RubyのBundler(Gemfile)とだいたい同じ役割。

    {
      "name": "test",
      "version": "0.0.0",
      "private": true,
      "dependencies": {
        "express": "3.5.2",
        "ejs": "*",
        "socket.io": "*",
        "mongoose":"*"
      }
    }
    

    こんな感じで・・・
    見てわかるようにモジュールのバージョン管理、あとlicenseやURLなんかも記載できるらしいです。
    なんで大体Githubで公開されているnode.js製のアプリケーションなんかはここ見ると大体どういうの使えばいいか、どういうライセンスなのかわかります。

    モジュールは全部そのまま直下のnode_modulesディレクトリに入ります。
    node.jsのモジュールはローカルにインストールできるのがいい点だと思います。どうにもうまくいかなくなったらファイルごと消せばいいですし。

    書いている時点で、socket.ioの正常動作・MongoDBに登録するところまで出来ているのですが、とりあえずここまで。
    気が向いたら書きます。

    次:node.jsなんかでオンラインなゲームを作る(2) enchant.jsでまず画面作成

    redditの簡単なbotを作ってみる

    海外最大手のフォーラムサイトredditにも、最近大量に日本人の人口が増えました。

    redditは最大手のフォーラムサイトのくせにオープンソースであり、スパム以外のソースを全部公開しているという大盤振る舞い。

    APIも公開しているので、そのAPIに対するラッパー、ソフトウェア、OAuthアプリが大量にあるのです。
    なので、botを作るくらいなら簡単に出来るようです。
    ここを見ても、かなりの数の言語に対応したラッパーが作られていたりします。
    なんというかすごくオープンな感じです。もっと日本で流行ってほしいですな。

    その中でも今回は代表的なReddit APIラッパーであるPRAWを使用して作っていきます。
    PRAWはpythonで動作するreddit APIラッパーです。かなり簡単にAPIを操作してコメント・submit・subredditの取得・subredditの立ち上げ・UPVOTE/DOWNVOTEなど大体のことができます。

    pythonパッケージ管理ソフトpipが導入されていればコンソールから"pip install praw"でモジュールインストール完了。簡単です。

    1.subreddit注目の上位5つのタイトルとスコアを取得
    japanのsubredditを取得してみる。
    [python]

    – coding: utf-8 –

    import praw

    user agentを設定します。多分何にしても問題ないです

    user_agent = ("Python bots")
    r = praw.Reddit(user_agent=user_agent)
    subreddit = r.get_subreddit("japan")
    for submission in subreddit.get_hot(limit = 5):
    print "Title: ", submission.title
    print "Score: ", submission.score

    [/python]

    結果:

    C:\>python C:\Python27\test.py
    Title:  European products not available in Japan (for a present)?
    Score:  13
    Title:  For non-language teachers, how did you end up in Japan, and what do you
    do for a living?
    Score:  8
    Title:  Prime Minister Shinzo Abe says Japan will provide 4 billion dollars in a
    id for global efforts to promote disaster management over the next 4 years.
    Score:  6
    Title:  Japan budgets over $15 million for overseas universities in soft power p
    ush
    Score:  44
    Title:  Extended Hokuriku shinkansen line goes into service
    Score:  7
    

    これだけで取得できます。非常に簡単です。

    2.submit(テキストポストの投稿)を行う
    実際に投稿も簡単にできます。投稿にはアカウント必須です。
    しかし、redditは投稿数やカルマで監視してbotかどうかを判断されるため、作り立てで投稿もしていないアカウントだとほぼcapture認証を食らいます。
    [python]

    – coding: utf-8 –

    import praw
    user_agent = ("Python bots")
    r = praw.Reddit(user_agent=user_agent)
    r.login(‘username’, ‘password’) #ユーザー名とパスワードを入力
    r.submit(‘投稿したいsubreddit’, ‘タイトル’, text="本文")
    [/python]
    こんな感じです。こちらも簡単。
    ユーザー名パスワードをそのまま書くのはどうよって場合は、OAuth認証も可能なようです。
    cronなんかを使えば定期的な自動投稿なんかが可能となると思います。・・・が、監視しておかないとcapture認証に引っかかる気もします・・・。

    MongoDBをWindowsにインストールする

    BSONを使ってデータベース管理を行いたいためNoSQLであるMongoDBをWindowsにインストールする。

    普段使いはWindows使いなため。
    http://www.mongodb.org/downloads
    ここからダウンロード。今のOSならWindows 64bit 2008 R2+でいいのではないだろうか。

    インストール方法にCompleteとCustomがありますが、CompleteではC:\Program Files\の下にインストールします。お好きな方を。
    mongo1

    pathを通す必要はないのですが、通してもいいかも。
    C:\<インストールしたディレクトリ>\bin
    (windowsのpathの通し方は、コントロール パネル\システムとセキュリティ\システム→システムの詳細設定→環境変数→システム環境変数のPathに追加

    これで起動できるようになります。
    デフォルトではdata\dbにデータベースファイルが作られますので、フォルダを作成しておきます。
    md c:\data\db
    (–dbpathオプションで場所を変更することが出来ます)

    そして、MongoDBを起動。mongodがデータベースサーバー、mongoがCUIクライアントとなります。
    自分の場合、mongodが起動できなくてちょっと詰まりました。理由はディスク空き容量が少なすぎたためという・・・(–smailfilesオプションを付けることで回避できました)

    Windowsの場合、起動するためのbatファイルなんかを作って置いておいた方がいいですね。
    サービス化(Linuxで言うところのデーモン化)をする方法もありますが、そうすると起動しっぱなしになってしまうため、今回はやっておりません。

    CUIでそのまま操作するのもいいのですが、MongoDBをGUIで動かすためのアプリケーションMongoVUEなんかも存在します。
    Free版では接続数の制限とかありますが、個人でちょっと試す分には問題ないです。やはりGUIの方がさまざまなデータを見れて楽ですからね。
    mongo2
    このような形で表示されます。

    ちなみに、Windows8.1 Pro 64bitで動かしましたけど、特に問題はありませんでした。このまま自由に使えそうですね。

    エターナル青春系ブラウザ「Kinza」を使う

    kin

    最近、常用のWebブラウザをCoolnovo(ChromePlus)からKinzaに乗り換えました。

    どちらも、Chromium(オープンソース版Chrome)の改造版ブラウザなのですが、

    乗り換える理由として、Coolnovoは2013年からアップデート放置状態という点が挙げられます。

    アップデート継続するならまだCoolnovoでよかったのですが、

    Chromiumのバージョンが低いため、Chromeウェブストアの拡張機能が入れられず。

    これはかなり痛いので、こちらに移ってきたわけですが・・・

     

    Kinzaは、利点として

    • Chromiumベース国産ブラウザ
    • ユーザ提案で機能が増える
    • Coolnovoと機能が似てる
    • アドウェア/スパムウェア無しの完全無料
    • RSSリーダー機能に特化
    • 更新はほぼ毎月

    このあたりの利点があります。

    個人的には、Coolnovoにも同等の機能がありましたが、「タブ復元ボタン」は外せないです。

    タブの復元

    このために使っていると言っても過言ではなし。

    Chrome公式でやってくれればいいのにと思うレベル。

    完全無料なので何か裏があるかもと思うレベルですが

    このアプリは多分デフォルトの検索エンジン「Fooooo」の宣伝目的として作られてると思います。GoogleをデフォルトにしてるfirefoxやIEでBingをデフォルトにしてるWindows8.1 with Bingと同じです。

    嫌だという人は、アドレスバーの検索エンジンは変更できるため、変更すれば問題ないです。

    (新しいタブの検索バーは変更できないようですが。まあそれくらいは良しとしましょう

    結局、どの辺がエターナル青春系ブラウザなのかは不明です。