読者です 読者をやめる 読者になる 読者になる

蟻地獄

Twitterに書ききれない長めの文とか書くよ

socket.io とは何だったのか

「Socket.IO は必要か?」または「WebSocket は通るのか?」問題について 2016 年版
socket.io が提供してくれているものは何か - from scratch

実はこの辺りの話って、公式サイトのFAQに書いてあるんですよね。・・・と思って久しぶりに公式サイト見てみたら、おっしゃれーにリニューアルされてて以前のFAQが無くなっていました。

というわけでv0.9の頃のサイトをInternet Archiveから引っ張り出してきました。
Socket.IO: the cross-browser WebSocket for realtime apps.

Why not just call it `WebSocket` if the actual WebSocket is not present and mimick its API?

抄訳: ヘイボブ!これってただのWebSocketの代わりじゃないの?

Socket.IO does more than WebSocket, even if WebSocket is selected as the transport and the user is browsing your website with an ultra modern browser. Certain features like heartbeats, timeouts and disconnection support are vital to realtime applications but are not provided by the WebSocket API out of the box.

This is akin to jQuery's decision of creating a feature-rich and simple $.ajax API as opposed to normalizing XMLHttpRequest.

抄訳: 何を言ってるんだいアリス!たとえWebSocketで通信できる環境でも、Socket.IOはWebSocketよりすごいんだ!ハートビートやタイムアウトや再接続なんかはリアルタイムアプリケーションには必須だけど、WebSocketは提供していないだろう?jQueryがただのXMLHttpRequestの代わりじゃないのと同じさ!

ビットコイン中級者向けの3つのクイズ

こんばんは!ビットコイナーめめるです!

ビットコインは仕組みが難しいので色々な勘違いがありますよね。今日は、「ビットコインは円天とは違う」とか「ビットコインの社長は逮捕されてない」といったことが分かってきた中級者向けのクイズを考えてみました。何問答えられるかな?

第一問

ビットコインプロトコルではマイナーへの報酬として新たなビットコインが発行されるため、ビットコインの全体量は日々増え続けています。しかし、ビットコインは一般的に「デフレモデルであり将来的に価格が上昇する」と言われています。それはなぜでしょうか?

第二問

現状のビットコインはスケーラビリティに問題があるため、プロトコルのアップデートが計画されています。では、仮にプロトコルがアップデートされないままユーザーが増え続けた場合、具体的にどのようなことが起こるでしょうか?

第三問

2014年にマウントゴックスが破綻しましたが、この事件はビットコインの仕組みが原因ではなく、マウントゴックスの不正が原因だとされています。では、マウントゴックスは具体的にどのような不正を行ったのでしょうか?また、マウントゴックスのような不正な取引所から身を守るためにはどうすれば良いでしょうか?


分かったかな?答えは私も分からないよ!

ビットコイン界隈の派閥樹形図を作ってみた

デリばんは!

先週末にビットコインの仕組みを調べていたんですが、ブロックチェーンとProof of Workだけかと思ったらなんか他にもいろいろ話が出てきて思ったより闇が深かったので、ビットコイン界隈の派閥樹形図を作ってみました!
https://gist.github.com/mitomemel/1dd6e78116ef66fe19e3

ここ間違ってるよとかあったらコメントお願いします!

Unlimited Server Works

体はvimで出来ている
「――――I am the bone of my vim.」

血潮はsedで心はawk
「――――Sed is my body, and awk is my blood」

幾たびのリリースを越えて不敗
「――――I have created over a thousand services.

ただ一度の障害もなく、
Unaware of loss.

ただ一度の睡眠もなし
Nor aware of gain」

担い手はここに独り
「――――Withstood pain to create config files,

sshsedを打つ
waiting for one's arrival」

ならば我が生涯に意味は不要ず
「――――I have no regrets. This is the only path」


このサーバは、無限のシェルスクリプトで出来ていた
「――――My whole server was "unlimited shell script works"」

MikuMikuDanceのファイルを表示するブログパーツを作ってみた

mmd.gl.enchant.jsとか使ってMMDのファイルを表示するGoogleガジェットを作ったよ!

(ブラウザがWebGLに対応している必要があります)

自分のブログへの貼り付け方

ここでコードを取得できます。
PMDファイル・VMDファイルのURLを設定するだけ。テクスチャとかtoon*.bmpはPMDファイルと同じディレクトリに置いて下さい。ファイルが足りないとミクさんが真っ黒になったりするので、そういうときはJavaScriptコンソールで取得に失敗しているファイルがないか見てみてね。

WebGLすごい!

2014/11/28 追記

Googleガジェットがサービス終了したっぽいよ。

Node.jsでAmazon Product Advertising APIを叩く話

前回の続き。

5000円占いAmazon商品情報のクローラはnode.jsで書きました。なぜnode.jsを選択したのかというと、JavaScriptが好きだからです。

AmazonProduct Advertising APIを叩くのには、node-apacというモジュールを使用しました。

使い方は簡単。まずはnpmでインストール。まだstable versionが無いので、@latestを付ける必要があります。

npm install apac@latest

require('apac')でインポートして、OperationHelperのインスタンスを生成。

var OperationHelper = require('apac').OperationHelper;

var opHelper = new OperationHelper({
	endPoint:	'ecs.amazonaws.jp', // APIのエンドポイント。日本の場合はecs.amazonaws.jp
	awsId:		'XXXXXXXXXXXXXXXXXXXX', // 自分のAccess Key ID
	awsSecret:	'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 自分のSecret Access Key
	assocId:	'xxxxxx-22' // 自分のアソシエイトID
});

例として、100円〜5000円の和書を売り上げ順に表示するのはこんな感じ。

opHelper.execute('ItemSearch'/* オペレーション名 */, {
	// リクエストパラメータ。Product Advertising APIのパラメータ名をそのまま書けばOK
	'SearchIndex': 'Books',
	'BrowseNode': 465610,
	'MinimumPrice': 100,
	'MaximumPrice': 5000,
	'ResponseGroup': 'Small,OfferSummary',
	'Sort': 'salesrank'
}, function(error, results){
	if(error){
		console.error(error);
	}else{
		// resultsはProduct Advertising APIのレスポンスボディをxml2jsしただけのもの
		var items = results.Items.Item;
		for(var i = 0; i < items.length; ++i){
			console.log(
				'ASIN:' + items[i].ASIN
				+ '\tTitle:' + items[i].ItemAttributes.Title
			);
		}
	}
});

前回も書きましたが、Product Advertising APIには1時間2000リクエストまでというかなり厳しい回数制限があります。また、リクエスト同士の間隔が短すぎても503が返されるようなので、あまり激しく叩いてはいけません。愛をもって優しく叩きましょう。

そんなわけで、Product Advertising APIはわりと簡単に使えて楽しいので、みんなもやってみると良いよ!

Amazonガチャシミュレータの作り方

Amazonガチャシミュレータできたよ!
5000円占い

作り方

Amazonガチャの説明によると、アルゴリズムは以下のようになっています。

a)現代用語を含む約85万語の辞書から任意に1用語を抽出
b)その用語をキーワードとしてAmazonで全カテゴリを対象に検索をかける
c)最もキーワードにマッチしている商品を抽出する
d)購入予定額(4600円)と比較し、商品価格が予定額に収まっている場合は注文実行、超えている場合はa)へ戻り再度実行
※購入予定額ははd)が終わり次第計算しなおし、4500円以上の買い物をするまで繰り返す

しかし、この方法はリアルタイムで検索を行うのには向いていません。なぜかというと、Product Advertising APIには1時間2000リクエストまでという制限があるからです。

上記のアルゴリズムの場合、1回ガチャるのにa)〜d)を平均5回繰り返すとして、1時間400ガチャ程度しか捌けません。また、こちらの方が試しているように、最後の1個がなかなか決まらずかなりの回数a)〜d)を繰り返してしまう可能性があります。

では、5000円占いではどうやっているかというと、事前にクローリングして商品データをDBにキャッシュしておき、占うボタンを押したときにはそのキャッシュの中から価格の上限/下限を指定してランダムで選んでいます。

ただし、事前にクローリングするにしても1時間2000回の制限があるので、Amazonの全商品をキャッシュすることはできません。なので、各カテゴリごとに人気順で商品を取ってくるとか、価格帯がいい感じにバラけるようにするなど、ある程度優先順位をつける必要があります。

ちなみに、Product Advertising APIの規約では、

  • 商品データを24時間以上キャッシュしてはいけない
  • キャッシュ更新頻度が1時間に1回以下の場合は価格情報の近くにキャッシュ日時を表示しなければならない
  • 価格情報が変更される可能性がある旨を明記しなければならない

など細かい決まりがあります。ちゃんと守らないとサイト審査で落とされるよ!

クローリングはnode.jsでやってるんだけど、そのあたりは需要があればまた書くかも。Amazon商品のランダム選択の実装はなにげに奥が深くて楽しいので、みんなもやってみるといいよ!