Home / Diary / タグ: ruby
「JavaScript文字参照(UTF-8)」「URLエンコード(UTF-8)」「Base64」「MD5」のそれぞれでエンコードしたものを変換候補として表示するプラグイン。超小規模なエンコードマニアックスと思いねぇ。
エンコードマニアックスだとCRC32やらMIMEとかいろいろあるけど今のところ多用するのはこの4つだろうなー、と思って。これ以上を望むならエンコードマニアックスで。
Ctrl+Shift+Insertで「マルチエンコード」を選択した場合のみ動作するようにしている。変換候補はこんな感じ。

multiencode.zip
Info
- 投稿日
- 2008年11月24日
- タグ
- ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1926.html
- ブックマークに追加する
-
- コメント
2008
1124
Tagsruby
とりあえずRubyが入ってりゃいいらしいので早速簡単なものを作成。
#! /usr/bin/ruby -Ku
require "uri"
require "Win32API"
module Atok_plugin
def run_process( req )
gurl = "http://www.google.com/search?rls=ja&q="
query = URI.escape( req["composition_string"] )
shellexecute = Win32API.new( "shell32.dll", "ShellExecuteA", %w(p p p p p i), "i" )
shellexecute.call( 0, "open", gurl + query, 0, 0, 1 )
end
end
入力、というか変換した文字を標準のブラウザでGoogle検索。ブラウザの検索欄でやればいいことを、わざわざATOKを介しているところが非常に無駄。まあ、とりあえず動けばなんでも良かった。
スクリプト作成の際はデバッガでエラーコードを見ることができたので、手間がかかるというわけでもなく、いつも通りに開発できた。
んで、上記スクリプトから分かるようにActiveScriptRubyなら、ここからあらゆるプログラムにアクセスできる。
色々と妄想が広がるわけだが、あくまでも入力変換中の文字しか渡せないところに注意する。文字列選択してATOKに渡すとかは無理。
それに変換が必要ということは全角入力でないといけないわけで、ランチャー的な使い方をしようとすると、その都度全角キーを押すというコストが発生する。
コストで言えばCtrl+(Shift+)Insertもなんだかなー、と。これは仕方無いか。プラグインからプラグインへチェインさせようとするとひたすらCtrl+(Shift+)Insertになっちゃうけど。
やっぱり入力の補助的なものが一番ベストなのか?
実際にATOKダイレクトAPIを試すには
30日限定の体験版があるので、こっちでお試し。
無償試用版ダウンロード|日本語入力システム ATOK 2008 for Windows
プレミアムとか優待とか色々あるが、全くの新規なら通常版を。大体6600円前後。
ATOK 2008 for Windows
自分はパッケージがかさばるのが嫌だったのでダウンロード版を購入した。12/31までの期間限定でヨドバシが5980円+180ポイントで販売しているので、少しでも安い方がいいならこっちで。
ジャストシステム ATOK 2008 for Windows DL版 ヨドバシ限定特価
Info
- 投稿日
- 2008年11月23日
- タグ
- ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1919.html
- ブックマークに追加する
-
- コメント
2008
1123
Tagsruby
URLもhttp://del.icio.us/からhttp://delicious.com/に。URLは前のほうが好きだったんだがなぁ。それと、一部機能がJavaScriptが有効じゃないと使えないのはダメだろ。
んで、APIも微妙に変わってるようなので、手元のスクリプトを一部修正した。
880行目~906行目を以下のように修正。
var delicious_rss = "http://delicious.com/rss/url/";
var delicious_url = "http://delicious.com/";
var delicious_favicon = "http://delicious.com/favicon.ico";
var delicious_page = "http://delicious.com/url/" + MD5_hexhash(uri.replace(/%23/g, '#'));
function dlLoadRSS() {
GM_xmlhttpRequest({
method: "GET",
url: delicious_rss + MD5_hexhash(uri.replace(/%23/g, '#')),
onload: function(response) {
var r;
var comments = [];
//var tags = [];
if (r=response.responseText.match(/<item>[\s\S]*?<\/item>/mg)) {
comment_area.addCount(r.length, delicious_favicon, delicious_page);
var len = (r.length < MAX_GET_COUNT) ? r.length : MAX_GET_COUNT;
for (var i=0; i<len; i++){
r[i].match(/<item>\s*<title>[^<]+<\/title>\s*<pubDate>([^<]*)<\/pubDate>[\s\S]*?<link>[^<]+<\/link>\s*<dc:creator><!\[CDATA\[([^\]]+)\]\]><\/dc:creator>[\s\S]*?(?:<description>([^<]*)<\/description>\s*)?((?:\s*<category[^>]*?>[^<]*?<\/category>)*)\s*<\/item>/ );
var date = RegExp.$1;
var user = RegExp.$2;
var comment = RegExp.$3;
var categories = RegExp.$4;
var tags = [];
date.match( /^[a-z]+, (\d+) ([a-z]+) (\d{4}) (\d\d):(\d\d):(\d\d).*?$/i );
var d = RegExp.$1;
var yyyy = RegExp.$3;
var hh = RegExp.$4;
var mm = RegExp.$5;
var ss = RegExp.$6;
var m = RegExp.$2;
m = m.replace( /Jan/i, "01" )
.replace( /Feb/i, "02" )
.replace( /Mar/i, "03" )
.replace( /Apr/i, "04" )
.replace( /May/i, "05" )
.replace( /Jun/i, "06" )
.replace( /Jul/i, "07" )
.replace( /Aug/i, "08" )
.replace( /Sep/i, "09" )
.replace( /Oct/i, "10" )
.replace( /Nov/i, "11" )
.replace( /Dec/i, "12" )
;
date = new Date(yyyy, m, d, hh, mm, ss );
if(categories){
categories.replace( /<category[^>]*?>([^<]*?)<\/category>/g,
function( $0, tag ) { tags.push( tag ); }
);
}
if(comment.match(/<p class="description">([^<]+)<\/p>/)){
comment = comment.replace(/^\s+|\s+$/g, "");
}
ついでにlivedoorClipのユーザー名の位置が微妙に変わったので修正。
1028行目(上の修正を当てた後は1047行目)を以下のように修正。
var userName = userA.href.replace( /^.*\//, "" );
このサイトのエントリについたコメントを取得するやつ。元のソースで使っていたREXMLが利かなくなったのでsimple-rssで取得するようにした。
def get_delicious_comments( url )
posts = []
host = 'feeds.delicious.com'
path = '/v2/rss/url/' + Digest::MD5.hexdigest( url )
body = Net::HTTP.start( host, 80 ).get( path ).body
rss = SimpleRSS.new( body )
rss.items.each do |item|
if item.description != nil
post = {
:date => "",
:user => item.dc_creator,
:cmnt => item.description,
:site => "del.icio.us"
}
posts.push( post )
end
end
return posts
end
del.icio.usからの取得部分をこんな感じに直したんだが、今度は肝心のGet URLsが500でどうしたもんかと。
追記
SBMCommentsViewerの作者の方にスクリプトをgistに上げていただいたので、修正版をダウンロードできます。
sbmcommentsviewer.user.js(リンク先はgist内)
さらに変更が入ったりしたらgist: 3883の右端にあるrevisionかforkを追えばいいハズ。
Info
- 投稿日
- 2008年8月3日
- タグ
- firefox、javascript、ruby、userjs
- このエントリの固定リンク
- http://bmky.net/diary/log/1788.html
- ブックマークに追加する
-
- コメント
2008
0803
Tagsfirefoxjavascriptrubyuserjs
Operaのアキレス腱の一つ、スキンの調整。スキンを導入すること自体は簡単だが、幅や高さを修正しようとしたり、ツールバー用にアイコンを追加しようとなると非常に手間がかかる。
- Operaを終了する
- スキンを解凍する
- skin.iniを修正する
- スキン内部全てのファイルをzipで圧縮する
- Operaを起動する
- 修正した箇所を確認する(まだ修正するなら1に戻る)
Operaをいちいち再起動までしなければならないのはめどい。加えてzipの圧縮/解凍も。これをなんとかできないかと考えたのだが、Operaのスキン配布形式に解決のヒントがあった。
例えば、Opera Skinsのページから気に入ったものを選んでDOWNLOADボタンを押す。ダウンロードが完了するとOperaは一時的にスキンを適用し、これでいいかどうかを聞いてくる。
この時点でOperaは再起動することなく新しいスキンを適用してくれている。これだ! この操作をローカルのサーバー上で行えないだろうか。
ローカルならばテキストエディタでskin.iniを弄りつつ、プレビューしたくなったらスクリプト側でスキンファイル郡を圧縮し、適切なヘッダを付加してブラウザで出力。そうすれば再起動することなくスキンを弄れるのでは無いか?
んで、実際に作成してみたのが以下のスクリプト。
opskintester.zip
予想通り、修正即適用が可能になった。
- スクリプトを実行
- スキンのzipをskinフォルダに置く
- ブラウザでhttp://localhost:10080/にアクセス(この時点でzipを解凍してくれる)
- テキストエディタでskin/[スキン名]/skin.iniを弄る
- リンクをクリックしてスキンをプレビュー(まだ修正するなら4に戻る)
と、このように再起動することなくスキンの調整が行える。調整後はOpera/profile/skinに溜まったゴミを削除すれば良いだろう。
修正例
先日リリースされたOpera9.50 RC2に付属している新スキン。ちょっとタブが高いし、ツールバーのボタンの間隔が広いなー、と思ったら、Paddingを以下のように修正する。
; セミコロン以降はコメントなので、デフォルト値を残しておくと良い
[Pagebar Button Skin]
...
Padding Top = 3;7
Padding Bottom = 4;8
[Toolbar Button Skin]
...
Padding Left = 3;4
Padding Top = 0;4
Padding Right = 4;5
Padding Bottom = 0;5
[Toolbar Button Skin.pressed]
...
Padding Left = 3;5
Padding Top = 0;5
Padding Bottom = 0;4
見た目はこなかじ。

Info
- 投稿日
- 2008年6月19日
- タグ
- opera、ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1771.html
- ブックマークに追加する
-
- コメント
2008
0619
Tagsoperaruby
ブックマークコメントを各エントリに表示したかったが、世に出回っているもののほとんどがJavaScript製。リニューアル後の方針の一つとして、できるだけJavaScriptは導入しないと決めていたので使いたくない。
だが、ご丁寧に各サービスともAPIを用意しているので、いっちょRubyで取得するか、と思ったら既に作っている人がいた。
SBM - コメントを取得
これを自サイト用に改造しよう。
コメントがついているエントリを探す
今までのエントリを上記スクリプトにかけると途方も無い時間がかかってしまう。「ブックマークされたエントリ」だけを処理にかけるというのが理想的だが、それをどのようにして取得するか。
はてなブックマークの注目・人気・新着を次へ次へと漁るのもめんどいなーと思っていたら、Get URLsという、指定したURL配下のブックマークされたURL一覧を取得できる素晴らしいサービスが存在したので、ありがたく利用させてもらうことにした。
どのようにして表示するか
取得したコメントをただのHTMLで出力し、Wordpressのテンプレート側からincludeする。こうすれば負荷が少ない上にキャッシュされるのでサイトにやさしい。
if( file_exists( $post->ID . ".html" ) ) {
include( $post->ID . ".html" );
}
こんな感じで、出力されたコメントHTMLが存在する時だけ表示するようにした。
完成物
sbmcomments.rb
- なぜかjsonをインストールできなかったのでjson_pureを利用
- クロスポストを考慮して、全く同じコメントは取り除く
- livedoor クリップからは取得しない(メインで使ってる人が少ないと思われるので)
- 1URL毎に1秒待機
このサイト用に特化しているので、取得するURLと出力部分を弄れば他サイトでも使えるはず。
cronで回す
以前praggerもcronで動かそうと思っていたが、なぜか動かなかった。それは今回も同様で、rubygemsが無いというエラーが空しく返ってくる。
どうしたもんかと途方に暮れそうになった時に以下のページを発見。
なお、crontab で実行されるときには、ほとんどの環境変数が設定されていないので注意が必要。~/.cshrc・~/.login で設定している環境変数は設定されていないし、PATH も /bin:/usr/bin くらいにしか通っていない。そのため、command の部分に指定するのはシェルスクリプトにしておいて、シェルスクリプトの先頭で環境変数の設定を行い、その後いろいろなコマンドを実行するようにしておくのがよいだろう。
UNIXの部屋 コマンド検索:crontab (*BSD/Linux)
な、なんだってー!? rubygemsをインストールした時に.bashrcというファイルに環境変数が記述がされていたので、てっきりcron実行時に自動的に読んでいるものだと思ったら、全く読んでいなかったってことか!
というわけで、.bashrcの内容をコピペする。
#!/bin/sh
export PATH=$HOME/packages/bin:$PATH
export RUBYLIB=$HOME/packages/lib/ruby/site_ruby/1.8:$HOME/lib/ruby
export GEM_HOME=$HOME/packages/lib/ruby/gem
/usr/local/bin/ruby sbmcomments/sbmcomments.rb
cd ~/pragger
/usr/local/bin/ruby pragger.rb -c nicovideo.yaml
/usr/local/bin/ruby pragger.rb -c radio.yaml
exit
そして実行を待つこと数十分。エラーを出すこともなく無事にスクリプトが動いた! Praggerのプラグインも動くようになった!
あとは大体1日毎にコメントを取得するように設定して設置完了。頻繁にブックマークされるようなサイトじゃないので、これぐらいの周期で十分だろう。
Info
- 投稿日
- 2008年6月3日
- タグ
- ruby、site
- このエントリの固定リンク
- http://bmky.net/diary/log/1768.html
- ブックマークに追加する
-
- コメント
2008
0603
Tagsrubysite
No More Scripts
大幅に修正。セカンドレベルドメインにも対応したので、ブロック指定が楽になった。
基本的に外部参照ファイルをブロックしているわけだが、NoScript同様、メニューを開くだけでそのサイトがどれだけ外部参照コンテンツ、というか広告の類を貼りまくっているかが一目瞭然なので・・・

こーいったサイトが多いからこそ、このようなスクリプトが必要になる。
Pragger
自作したPragger用プラグイン
elem_cacheは無かったことに。ラジオ新着関係を全部修正。ニコニコ動画検索も修正。クラブニンテンドーの未回答アンケートもファミコン探偵倶楽部を遊んだのでようやく対応。
そういや、Praggerをレンタルサーバー上で動かしているんだが、一部のプラグインの動作が、ssh上で実行した時とcron経由で実行した時とローカルで実行した時の動作が違ってしまって非常に困る。というかcron。明らかに入っているはずのプラグインがnot foundだったりわけわからん。
そもそも、ローカルのコマンドライン上で実行しているのがイレギュラーだから、サーバー上で動かしてみるべきなのか?
リンクの参照スタイル使用時にtitleを省略か空白にしていると正しく変換されなかったのを指摘して頂いたので修正。ありがとうございます。
Info
- 投稿日
- 2008年5月31日
- タグ
- javascript、opera、ruby、userjs
- このエントリの固定リンク
- http://bmky.net/diary/log/1765.html
- ブックマークに追加する
-
- コメント
2008
0531
Tagsjavascriptoperarubyuserjs
以前AutoHotKeyで作ったのはバイナリファイルをbase64エンコードするだけでデコードはブラウザにまかせていたが、CSSの背景画像等に積極的にbase64を利用するようになってきたので、エンコードだけじゃ不便になった。
そこで、エンコードとデコードを手軽に行えるものをRubyで作ってみようじゃあないか、と思ってできたのがこれ。
標準のpackメソッド一発で変換できるので、あっという間に完成した。
実行ファイルに適当なファイルをD&Dするとbase64でエンコードしたテキストをクリップボードに格納する。
実行ファイルに何も渡さずに実行すると、クリップボードの中身をbase64テキストだと判断してデコード。バイナリファイルとして保存する。ファイル名はMD5ハッシュで決定。
Info
- 投稿日
- 2008年5月14日
- タグ
- ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1762.html
- ブックマークに追加する
-
- コメント
2008
0514
Tagsruby
自作したPragger用プラグイン
elem_cache
指定した要素でのみ比較してキャッシュを行う。
日付情報等が存在しない、ただのリスト等を監視したい場合に使う。custom_feedは特に指定しないと最新の日付が入ってしまうので、適当な日付を入れてリーダーに任せるといったことが難しかった。そこでこのプラグインを作成。単純に取得した要素が「ある」か「ない」かだけで判断するシンプルなキャッシュ。
本当は複数の要素で比較してキャッシュさせたかったけど、匿名メソッドを追加したオブジェクトをYAMLに保存してから復元すると匿名メソッドにアクセスできないというバグかどうか分からない仕様があったので、仕方なくこのような形になった。
empty
dataの中身を空の配列にする。一つのyamlにずらずらと大量に色々したい時に欲しかったので。
Webラジオ ダウンロード
わざわざrssにしてリーダーで知らせるよりも新着発見即ダウンロードのほうが効率よくね? とは思っていたものの、実際にRubyでダウンロードしようとすると本体にアクセスした際に500エラー等が発生してダウンロードすることができずに諦めていた。
で、つい最近になって「Plaggerを参考にしてみてはどうだろうか?」という天啓が降りてきたので実際にPlaggerで利用されているプラグイン「Mplayer.pm」のソースを見てみたところ、MPlayerに渡していてズコー。
で、このプラグインを参考にMplayerを使ってみたが、ダウンロードはできるがPCMに変換してしまう。Mplayerのヘルプを見ても、どうもPCMでしか保存できないようにしか見えなかった(ヘルプの見方が悪くて見落としている可能性あり)。
つーわけでこっちではNetTransportに渡すことでダウンロードするようにした。今のところ下記4サイトのみ確認。
NetTransportのコマンドラインオプションが分からんのでファイル名はそのまま。保存する場所もデフォルトとなってしまっている。
さすがに保存名を変えられないのは不便なので、とりあえずリネーム用のバッチファイルも同時に作成。ダウンロード完了後に実行すればリネームしてくれる。なんというアナログ。
もっとスマートな方法は無いものか。Rubyでダウンロードできれば全て解決するんだが、たぶんストリーミングとして受信しつつ、受け取ったデータを積んでいけばいいと思うけど、方法がさっぱりわからん。
Webラジオ 新番組
番組一覧のページから、番組のタイトルを取得し、一度取得したタイトルを次回以降表示させないことで、新番組だけを取得するようにした。
以上5サイトに対応・・・したつもりだが、テスト環境では成功してても、実際に番組が増えた場合を目にしていないので、動作がちょっと怪しいかも。自分で使っててあまりの沈黙っぷりに怖くなる。
音泉から欲しい番組を取得
HTMLの構造が変わったのか、正常に取得できていなかったので対応。
ニコニコ動画 検索
smしか見ていなかったので、nmmとかzhとかに対応。
クラブニンテンドーの予約ボーナス対象タイトルを取得
いつの間にかサイトがリニューアルされていたので。
クラブニンテンドーの未回答のアンケートを取得
同じくリニューアルしたので直そうとしたけど、アンケート回答欄が空なので、何かで埋まるまで更新できず。
date_sort
日付でソートするプラグインだが、アホなミスをしていたので修正。
クラスで比較する場合は、
date.class == "Time"
ではなく、
date.class == Time
とするのが正しい。
Info
- 投稿日
- 2008年5月5日
- タグ
- ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1760.html
- ブックマークに追加する
-
- コメント
2008
0505
Tagsruby
Praggerのおかげで少しずつだが貴重な時間を得られるようになったきた。
ってなわけでプラグイン追加。基本的に自作した野良プラグインと組み合わせて使う。
自作したPragger用プラグイン
今回追加したのは以下の3本。
クラブニンテンドーの未回答のアンケートを取得
購入したソフトのコードを登録しただけで満足したり、任天堂製VCソフトをダウンロードしたりしても、後日現れるアンケートに答えるのをすっかり忘れてしまうことがあるので、回答していないアンケートを取得。
クラブニンテンドーの予約ボーナス対象タイトルを取得
買おうと思ってはいたが予約開始がまだだった⇒発売日前日に思い出すが予約締め切ってて絶望。なんてことが無いように、予約可能なタイトルを取得。
FTPアップロード
Web上のリーダーで読みたい時に。
Info
- 投稿日
- 2008年3月5日
- タグ
- ruby
- このエントリの固定リンク
- http://bmky.net/diary/log/1590.html
- ブックマークに追加する
-
- コメント
2008
0305
Tagsruby
バグフィックス
- コマンドラインオプションが正常に動いていなかったので修正
- 更新確認時に更新ステータスを一つずつ表示するようにした
ページ作ったので、ダウンロードはそっちから。
OperaUserJavascriptManager
Info
- 投稿日
- 2008年1月29日
- タグ
- opera、ruby、userjs
- このエントリの固定リンク
- http://bmky.net/diary/log/1585.html
- ブックマークに追加する
-
- コメント
2008
0129
Tagsoperarubyuserjs