Home / Diary / タグ: ruby

123

目次

  1. 様々な形式にエンコードするATOKダイレクトAPIプラグイン
  2. ATOKダイレクトAPIを試す
  3. del.icio.usがアップグレード
  4. Operaのスキン調整を簡略化する試み
  5. JavaScriptを使わずにブックマークコメントを表示
  6. スクリプト色々更新
  7. base64をもっと手軽にエンコード/デコードしたい
  8. Pragger用プラグインを追加・更新
  9. Pragger用プラグインを追加した
  10. OperaUserJavascriptManager v0.31

様々な形式にエンコードするATOKダイレクトAPIプラグイン

「JavaScript文字参照(UTF-8)」「URLエンコード(UTF-8)」「Base64」「MD5」のそれぞれでエンコードしたものを変換候補として表示するプラグイン。超小規模なエンコードマニアックスと思いねぇ。

エンコードマニアックスだとCRC32やらMIMEとかいろいろあるけど今のところ多用するのはこの4つだろうなー、と思って。これ以上を望むならエンコードマニアックスで。

Ctrl+Shift+Insertで「マルチエンコード」を選択した場合のみ動作するようにしている。変換候補はこんな感じ。

変換候補画面

multiencode.zip

Info

2008
1124

Tagsruby

ATOKダイレクトAPIを試す

とりあえず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
1123

Tagsruby

del.icio.usがアップグレード

URLもhttp://del.icio.us/からhttp://delicious.com/に。URLは前のほうが好きだったんだがなぁ。それと、一部機能がJavaScriptが有効じゃないと使えないのはダメだろ。

んで、APIも微妙に変わってるようなので、手元のスクリプトを一部修正した。

SBMCommentsViewer

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(/&lt;p class="description">([^<]+)&lt;\/p>/)){
                      comment = comment.replace(/^\s+|\s+$/g, "");
                  }

ついでにlivedoorClipのユーザー名の位置が微妙に変わったので修正。

1028行目(上の修正を当てた後は1047行目)を以下のように修正。

var userName = userA.href.replace( /^.*\//, "" );

sbmcomments.rb

このサイトのエントリについたコメントを取得するやつ。元のソースで使っていた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

SBM Comments

asiamoth
お、del.icio.usってURLが変わっていたのか! 必須グリモンのSBMCommentsViewerが動かなくて困っていたので、さっそく修正した。

2008
0803

Tagsfirefoxjavascriptrubyuserjs

Operaのスキン調整を簡略化する試み

Operaのアキレス腱の一つ、スキンの調整。スキンを導入すること自体は簡単だが、幅や高さを修正しようとしたり、ツールバー用にアイコンを追加しようとなると非常に手間がかかる。

  1. Operaを終了する
  2. スキンを解凍する
  3. skin.iniを修正する
  4. スキン内部全てのファイルをzipで圧縮する
  5. Operaを起動する
  6. 修正した箇所を確認する(まだ修正するなら1に戻る)

Operaをいちいち再起動までしなければならないのはめどい。加えてzipの圧縮/解凍も。これをなんとかできないかと考えたのだが、Operaのスキン配布形式に解決のヒントがあった。

例えば、Opera Skinsのページから気に入ったものを選んでDOWNLOADボタンを押す。ダウンロードが完了するとOperaは一時的にスキンを適用し、これでいいかどうかを聞いてくる。

この時点でOperaは再起動することなく新しいスキンを適用してくれている。これだ! この操作をローカルのサーバー上で行えないだろうか。

ローカルならばテキストエディタでskin.iniを弄りつつ、プレビューしたくなったらスクリプト側でスキンファイル郡を圧縮し、適切なヘッダを付加してブラウザで出力。そうすれば再起動することなくスキンを弄れるのでは無いか?

んで、実際に作成してみたのが以下のスクリプト。

opskintester.zip

予想通り、修正即適用が可能になった。

  1. スクリプトを実行
  2. スキンのzipをskinフォルダに置く
  3. ブラウザでhttp://localhost:10080/にアクセス(この時点でzipを解凍してくれる)
  4. テキストエディタでskin/[スキン名]/skin.iniを弄る
  5. リンクをクリックしてスキンをプレビュー(まだ修正するなら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

見た目はこなかじ。

Operaのスキンを調整した比較画像

Info

SBM Comments

u1_113
Wiki とかでは良くある感じの目次を生成するプラグイン。サイトによっては使いどころはありそう。

2008
0619

Tagsoperaruby

JavaScriptを使わずにブックマークコメントを表示

ブックマークコメントを各エントリに表示したかったが、世に出回っているもののほとんどが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

このサイト用に特化しているので、取得する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
0603

Tagsrubysite

スクリプト色々更新

No More Scripts

大幅に修正。セカンドレベルドメインにも対応したので、ブロック指定が楽になった。

基本的に外部参照ファイルをブロックしているわけだが、NoScript同様、メニューを開くだけでそのサイトがどれだけ外部参照コンテンツ、というか広告の類を貼りまくっているかが一目瞭然なので・・・

おびただしい がいぶドメインのかずかず

こーいったサイトが多いからこそ、このようなスクリプトが必要になる。

Pragger

自作したPragger用プラグイン

elem_cacheは無かったことに。ラジオ新着関係を全部修正。ニコニコ動画検索も修正。クラブニンテンドーの未回答アンケートもファミコン探偵倶楽部を遊んだのでようやく対応。

そういや、Praggerをレンタルサーバー上で動かしているんだが、一部のプラグインの動作が、ssh上で実行した時とcron経由で実行した時とローカルで実行した時の動作が違ってしまって非常に困る。というかcron。明らかに入っているはずのプラグインがnot foundだったりわけわからん。

そもそも、ローカルのコマンドライン上で実行しているのがイレギュラーだから、サーバー上で動かしてみるべきなのか?

js-markdown-extra

リンクの参照スタイル使用時にtitleを省略か空白にしていると正しく変換されなかったのを指摘して頂いたので修正。ありがとうございます。

Info

2008
0531

Tagsjavascriptoperarubyuserjs

base64をもっと手軽にエンコード/デコードしたい

以前AutoHotKeyで作ったのはバイナリファイルをbase64エンコードするだけでデコードはブラウザにまかせていたが、CSSの背景画像等に積極的にbase64を利用するようになってきたので、エンコードだけじゃ不便になった。

そこで、エンコードとデコードを手軽に行えるものをRubyで作ってみようじゃあないか、と思ってできたのがこれ。

標準のpackメソッド一発で変換できるので、あっという間に完成した。

実行ファイルに適当なファイルをD&Dするとbase64でエンコードしたテキストをクリップボードに格納する。

実行ファイルに何も渡さずに実行すると、クリップボードの中身をbase64テキストだと判断してデコード。バイナリファイルとして保存する。ファイル名はMD5ハッシュで決定。

Info

2008
0514

Tagsruby

Pragger用プラグインを追加・更新

自作した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

SBM Comments

kashmir108
面白かった。

2008
0505

Tagsruby

Pragger用プラグインを追加した

Praggerのおかげで少しずつだが貴重な時間を得られるようになったきた。

ってなわけでプラグイン追加。基本的に自作した野良プラグインと組み合わせて使う。

自作したPragger用プラグイン

今回追加したのは以下の3本。

クラブニンテンドーの未回答のアンケートを取得

購入したソフトのコードを登録しただけで満足したり、任天堂製VCソフトをダウンロードしたりしても、後日現れるアンケートに答えるのをすっかり忘れてしまうことがあるので、回答していないアンケートを取得。

クラブニンテンドーの予約ボーナス対象タイトルを取得

買おうと思ってはいたが予約開始がまだだった⇒発売日前日に思い出すが予約締め切ってて絶望。なんてことが無いように、予約可能なタイトルを取得。

FTPアップロード

Web上のリーダーで読みたい時に。

Info

2008
0305

Tagsruby

OperaUserJavascriptManager v0.31

バグフィックス

ページ作ったので、ダウンロードはそっちから。

OperaUserJavascriptManager

Info

2008
0129

Tagsoperarubyuserjs

暴満館

最新のエントリ
注目のエントリ(はてな)
ゲーム攻略

暴満館 ~The House of Full Violence~
Powered by WordPress.
About | Contact | 新着のエントリ情報 RSS

ページ内の見出し一覧
様々な形式にエンコードするATOKダイレクトAPIプラグイン
ATOKダイレクトAPIを試す
del.icio.usがアップグレード
Operaのスキン調整を簡略化する試み
JavaScriptを使わずにブックマークコメントを表示
スクリプト色々更新
base64をもっと手軽にエンコード/デコードしたい
Pragger用プラグインを追加・更新
Pragger用プラグインを追加した
OperaUserJavascriptManager v0.31