Chrome拡張 "REMP it"

REMP用Chrome拡張 “REMP it” をリリースしました!Chromeで表示中のWebページ内にある複数のYouTube動画をプレイリストとして一度に取り込むことができます。インストールは URL から!2013-10-16 09:35:37 via YoruFukurou YouTube動画を連続再生できるWebアプリREMP用Chrome拡張 “REMP it” をリリースしました。 これを利用すると、Chrome拡張のアイコンをクリックするだけで、閲覧中のページ中に埋め込まれているYouTubeのリンクからREMPのプレイリストとして取り込むことができます。 インストールはC…

YouTube動画を連続再生できるWebアプリREMPChrome拡張 "REMP it" をリリースしました。
これを利用すると、Chrome拡張のアイコンをクリックするだけで、閲覧中のページ中に埋め込まれているYouTubeのリンクからREMPのプレイリストとして取り込むことができます。

インストールはChromeウェブストアから簡単にできますので是非お試しください。

初めてChrome拡張書いてみて

今回初めてChrome拡張を作ってみたのですが、最初とっきつきにくいところもあったのですが、一度概要を飲み込めれば比較的作りやすく、また情報もWeb上に大量に公開されているので参考になります。

注意点としては、Chrome拡張で定義するmanifestのバージョンが現在は2ですが、リリース当初の情報も数多く公開されているままの状態なので、その辺りを気をつけて参照する必要はあります。

Chromeで実際に配布したり、利用できる様にパッケージ化するのにはcrxmakeというGemを使うとrakeタスクですぐにパッケージを生成することが出来て便利でした。

具体的な実装の箇所で試行錯誤したのは、Webページ中のYouTubeリンクを列挙する処理で、このあたりは素直に以下の様な形で走査してます。

var parser = function(target, property) {
var $frames = $(target);
var ids = [], url, match, i;
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
for (i = 0; i < $frames.length; i++) {
url = $frames[i][property];
match = url.match(regExp);
if (match && match[7].length == 11) {
ids.push(match[7]);
}
}
return ids;
}
linkVideos = parser('a', 'href');
iframeVideos = parser('iframe', 'src');
paramVideos = parser('param', 'value');

また、同一ページ中に複数の同じYouTube動画のURLが含まれることもあり得るので、このあたりは上記の複数の走査結果をunionさせるのにunderscore.jsarray function使って

videos = _.union(linkVideos, iframeVideos, paramVideos);

としています。またChrome拡張で表示されるポップアップのHTMLを生成する際のtemplateも利用しています。underscore.js 便利。

もろもろ実装した内容は、Githubのhideack / remp-chrome-extensionに公開しています。

何かリクエスト等あれば、上のgithub issueやコメント等で頂ければ幸いです。

Google Search Volume

Googleの検索ワードのタイプ状況を可視化したもの。WebGL対応のブラウザ…Chromeであれば再生することができる。
下の図は日本の周りを表示させた物。うっすらと日本列島が浮かび上がるのが見える。

http://data-arts.appspot.com/globe-search
f:id:hideack:20110506215836p:image

詳しくはGoogleの公式blog参照。

A world of curiosity: a peek at searches around the globe
Today we’re sharing the Search Globe, a new visual display representing one day of Google searches around the world―visualizing the curiosity of people around the globe.

zshでscpするときにno matches found

MacOSzshをシェルにしているのだけど、scpを実行しようとすると、

% scp foo@bar.com:~/my*.zip .
zsh: no matches found: foo@bar.com:~/my*.zip

と表示されてしまって実行できない。
これは、ワイルドカード(*)で補完がかかってしまうため。
これを防ぐためには、

% setopt nonomatch

あるいは、.zshrcに一行たしておけばOK。
前も調べた気がするが、すぐ忘れる…。

RESTfulなKVS Terrastoreを使ってみる(2) – PHPからデータストア

前回インストールを行うところまで行ったので、今回は実際にデータをストアしてみる。
Terrastoreはすべてデータの格納・取得はRESTfulに行うことができるので、まずは手軽(?)にPHPからデータをストアしてみることにする。
HTTPのPUT命令でデータをTerrastoreに置くことができるので、データをストアするには以下の様な形で実現できる。

<?php
require_once 'HTTP/Request2.php';
$req = new HTTP_Request2("http://localhost:8080/foo/bar2");
$req->setMethod("PUT");
$req->setHeader(array("Content-Type" => "application/json"));
$req->setBody('{"test": "test2"}');
$response = $req->send();
print $response->getStatus();
?>

これで、ローカルホストに立てられているTerrastoreサーバへ、JSON表現で与えられる {"test":"test2"} という連想配列を格納する。
HTTPのレスポンスコード204が返却されれば、データの格納成功である。
実際にTerrastoreに格納したデータを取得するには、HTTPのGET命令で良いのでwget*1でも結果を取得できる。

% wget -q http://localhost:8080/foo/bar2 -O -
{"test": "test2"}

よさそうである。実際はプログラム側から呼び出さないといけないが、簡単な確認はこれでできた。

*1:wgetで取得内容を標準出力に出す方法を度忘れして調べたのは内緒だ

レインボー

なんか、Rainbow twitterでTLが大変なことになってますな...。
Googleのリアルタイム検索で見ても18時前から検索キーワード急増。
f:id:hideack:20100921222019p:image
とりあえず、Web経由ではTwitterを開かない様にしたいと思います。
真似して変なことした人がいたときにナニですので…。
あとは、案外こういうときこそガラケーモバツイ経由とかで開いているのが一番よいのではないかと思ってみたりします。いや、そこまでしてtwitterしなければいいじゃないといえばそれまでですが。。。

関係ありませんが、レインボーというキーワードを聞くとこのアルバムを思い出します。

RAINBOW RAINBOW

RAINBOW RAINBOW

MFCのCString::Formatで"Bufer to small"エラー

以下の様なVC++MFC依存*1なコードがあったとき...

strFile =_T("c:\\data\\hoge\\test.dat");
CString strtmp = strFile.Mid(strFile.ReverseFind('\\') + 1);
strtmp.Format(_T("%s (%f)"), strtmp, foo);

で実行すると, デバッグ用の 〜\vsprintf.c で、

Microsoft Visual C++ Debug Library
"Debug Assertion Failed!
Expression: ("Buffer to small", 0)

というエラーが表示されてしまう。スタックを見ると.Formatを呼び出しているところでAssertが起きている。
エラー内容について検索をかけると結構引っかかるのだが、解決策が特に見当たらない。
Microsoft Connectにも登録はされているが、再現不可能として却下されている。…数年前だが。
CString.Format is occassionally giving a debug assert failure

恐らくこういうときは、95%以上の確率で自分が変なことをしているというのが、ささやかな自分の経験則なので見直す。
で、ふと気づくと非常に気持ち悪いことをしていたので、以下の様に修正する

CString strtmp, strfilename;
strfilename = strFile.Mid(strFile.ReverseFind('\\') + 1);
strtmp.Format(_T("%s (%f)"), strfilename, foo);

assertは表示されなくなった。ひとまず問題解決。
.Formatで文字列を作ろうとしているものと、そこに流し込もうとしているものが同じインスタンスを指すというのは良く考えると気持ち悪い。
直感的に気持ち悪いこと*2はあまりしないほうが良いことが多い。

*1:全くC++を書いているという気がしない

*2:どこかに書いた様なコードをほぼコピペの様な形で別の箇所で書くとか...

RESTfulなKVS Terrastoreを使ってみる(1) – インストール

以前、ここで紹介されていたKVSのTerrastoreが気になっていたので試しに使ってみた。

"Terrastore"
Terrastore is a modern document store which provides advanced scalability and elasticity features without sacrificing consistency.
http://code.google.com/p/terrastore/

Terrastoreの特徴は以下の様なところ。

  • プログラムはJava上で動く(インストール時にはantが必要)
  • 不揮発性(オンメモリなKVSではなくて、ファイルシステムにストアされる)
  • プロトコルにはHTTPを利用, RESTful
  • サーバはクラスタ化可能
  • クラスタ化したときの各ノードへのコピーやバランシングは自動的に行うことができる
  • ストアする際のデータ形式はJSON
  • Java向けのクライアントライブラリが用意してある

といったところか。
で、実際に簡単に動かしてみた際のメモ。ほとんど、プロジェクトのホームページのドキュメントと同じですが、自分のメモとして使うために残しておく。

先程のTerrastoreプロジェクトのダウンロードページにある terrastore-0.6.0-dist.zip (本日現在) をダウンロード。
zipファイルを展開して、antを使ってインストールする。
今回はマスターサーバが単独の方法でインストール。
ここでは、マスターサーバを/Users/hideack/terrastore/masterに、サーバ(slave)を/Users/hideack/terrastore/serverにインストールする。

% cd cd terrastore-0.6.0-dist/
% ant -f terrastore-install.xml single-master -Dinstall.dir=/Users/hideack/terrastore/master
Buildfile: terrastore-install.xml
single-master:
version:
[echo] Terrastore Install Tool - Version 0.6.0
common-master:
[delete] Deleting directory /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install
[unzip] Expanding: /Users/hideack/pj/terrastore/terrastore-0.6.0-dist/terrastore-master/terrastore-master.zip into /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install
[copy] Copying 1 file to /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install/terrastore-master
[copy] Copying 1 file to /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install/terrastore-master
[copy] Copying 148 files to /Users/hideack/terrastore/master
[copy] Copied 44 empty directories to 3 empty directories under /Users/hideack/terrastore/master
BUILD SUCCESSFUL
Total time: 6 seconds

つづけて、サーバ(slave)をインストールする。

% ant -f terrastore-install.xml server -Dinstall.dir=/Users/hideack/terrastore/server
install.dir=/Users/hideack/terrastore/server
Buildfile: terrastore-install.xml
server:
version:
[echo] Terrastore Install Tool - Version 0.6.0
common-server:
[delete] Deleting directory /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install
[unzip] Expanding: /Users/hideack/pj/terrastore/terrastore-0.6.0-dist/terrastore-master/terrastore-master.zip into /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install
[copy] Copying 71 files to /Users/hideack/terrastore/server
[copy] Copying 77 files to /Users/hideack/terrastore/server/terrastore-master-libs
[copy] Copying 1 file to /Users/hideack/terrastore/server/terrastore-master-libs
BUILD SUCCESSFUL
Total time: 6 seconds

これでインストールされたので、早速起動してみる。
まず、マスターサーバを立ち上げる。

% cd /Users/hideack/terrastore/master
% ./start.sh
./start.sh: the JAVA_HOME environment variable is not defined correctly

むぅ、環境変数JAVA_HOMEを設定していなかったので怒られた。
MacOSでJavaを使っていてそこで動かそうとしているので、

% export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home

と書いて設定する。
改めて起動させてみる。

% cd /Users/hideack/terrastore/master
% ./start.sh
Terrastore Master 0.6.0 - 16:13:17.931 - Terracotta 3.3.0, as of 20100716-150712 (Revision 15922 by cruise@su10mo5 from 3.3)
Terrastore Master 0.6.0 - 16:13:18.627 - Successfully loaded base configuration from file at '/Users/hideack/terrastore/master/bin/./../terracotta-config.xml'.
Terrastore Master 0.6.0 - 16:13:19.026 - Log file: '/Users/hideack/terrastore/master/bin/./../tc-data/server-logs/terracotta-server.log'.
Terrastore Master 0.6.0 - 16:13:19.533 - Available Max Runtime Memory: 469MB
Terrastore Master 0.6.0 - 16:13:20.124 - JMX Server started. Available at URL[service:jmx:jmxmp://0.0.0.0:9520]
Terrastore Master 0.6.0 - 16:13:26.373 - Becoming State[ ACTIVE-COORDINATOR ]
Terrastore Master 0.6.0 - 16:13:26.410 - Terracotta Server instance has started up as ACTIVE node on 0.0.0.0:9510 successfully, and is now ready for work.

無事、起動。
続けてサーバ(Slave)を立ち上げる。

% ./start.sh --httpPort 8080 --nodePort 6000 --master localhost:9510
Starting Terrastore Server ...
Terrastore Server 0.6.0 - 16:26:28.997 - Welcome to Terrastore.
Terrastore Server 0.6.0 - 16:26:29.012 - Powered by Terracotta (http://www.terracotta.org).
Terrastore Server 0.6.0 - 16:26:29.012 - Listening for HTTP requests on 127.0.0.1:8080
Terrastore Server 0.6.0 - 16:26:29.038 - Listening for node requests on 127.0.0.1:6000
Terrastore Server 0.6.0 - 16:26:29.038 - Reconnection timeout (in milliseconds) set to 10000
Terrastore Server 0.6.0 - 16:26:29.039 - Node communication timeout (in milliseconds) set to 10000
Terrastore Server 0.6.0 - 16:26:29.039 - Number of http threads: 100
Terrastore Server 0.6.0 - 16:26:29.039 - Number of worker threads: 20
Terrastore Server 0.6.0 - 16:26:53.015 - Configuring event bus: class terrastore.event.impl.MemoryEventBus
Terrastore Server 0.6.0 - 16:26:53.578 - Set up this cluster terrastore-cluster
Terrastore Server 0.6.0 - 16:26:53.626 - Joining this node terrastore-cluster:ServerID[0]
Terrastore Server 0.6.0 - 16:26:53.638 - Set up this node terrastore-cluster:ServerID[0]

これも立ち上がった。
KVSから値を取得したり、値を格納する際のREST APIで与えられる命令はこのサーバ(Slave)側のHTTPポートへ投げればよいことになる。
(ここでは、8080番ポートをHTTPの口として設定している。)

では、実際に簡単にKey/ValueをStoreしようと思ったところで電池切れ。明日以降へ続く。
ところで、このKVSってあまり日本語の情報が無い様なのだけど、あえてこれを使う必要がないということなのだろうか??
他にも確かにいろいろ種類があるからなぁ。

さくらインターネットのKVSアルファテストサービス

昨日、はてぶ経由でさくらインターネットのKVSアルファテストサービスを使ってみたいとつぶやいたところ...
f:id:hideack:20100706235905p:image
と、恐れ多くもツイート頂いたので、申し込んでみようかな。とさくらインターネットのホームページを覗いてみた。
(紹介記事を先に読んでいたので...)

「KVSアルファテストサービス」は、さくらインターネット研究所が試験提供する、KVSを用いたデータベースサービスです。memcachedプロトコルにてインターネット経由でどなたでも簡単に利用することができます。....
KVSアルファテストサービス « さくらインターネット研究所

で、よくよく読んでみると認証がソースIPアドレス認証なんで、残念ながら私個人の環境*1では利用できず...。残念。
もっとも、具体的に何か利用したいと思っていたというよりは、気楽に触ってみたかっただけではあるのだが(汗)。

ともあれ、意外とKVSで用事が済む様なデータベース*2って世の中にたくさんある気が個人的にはしていて、さくらインターネットの様なレンタルサーバやデータセンターを提供する企業がKVSベースのプールを作っていてくれれば、いろいろなアプリケーションで活用できる気がしていているのでアルファテスト以降に期待。

*1:さくらインターネットレンタルサーバは共有で利用中なのだ

*2:IDをキーにしてSELECTで引くだけとか...

メールサーバのキューに溜まったメールの再送(基本)

何度やっても覚えない。
キューに溜まったメールを任意のタイミングで実行させるためには、

$ mailq -q -v

でOK。と。
毎回google先生に尋ねている気がする。情けない。
あと、こういうのはtwitterにつぶやいても流れてしまって検索できないので使い分けないとやっぱり駄目だな。

ホームページ

ホームページ。なんか久しぶりにタイプしたら懐かしい感もあったりするのですが、ここでいうホームページはブラウザで開く際、自動的に開かれるページのこと。
いままで、Yahoo!にしたり、googleにしたりといろいろ遍歴があったのですが、ここ半年ぐらい落ち着いている設定があって、そのページは "Sleipnir Start"だったりします。
f:id:hideack:20100324235250p:image
Sleipnirは、言わずと知れたWindows用のタブブラウザなのでありますが、そのSleipnir用のスタートページとして作られたwebページ。
自宅では当方Mac使いとなっていて使うことはできない*1のだけれど、このページだけを使わせてもらっているということでして...。
便利なのは、キーワードを入れて画面の下に並んでいるボタンを押すと入力したキーワードで検索をしてくれたり、検索キーワードを入れるフィールドの上に天気予報が表示されたりと結構便利なのです。
あと、デザインがシンプルで好きだな。と。
自分のMacで使っているChromeブラウザのホームページになっていますが非常に気に入っています。Mac使いの方もぜひ。

こういうシンプルで使い勝手がよいものを作りたいものですねぇ...。

*1:会社はWindowsなのでSleipnir使ってます