2013/01/25


どこでもスターグリースモンキーを公開しました
はてなスターをさまざまなサイトに付けられる「どこでもスター」グリースモンキーを公開しました。
http://s.hatena.ne.jp/js/HatenaStarEverywhere.user.js
また、同時にさまざまなサイトの設定情報を共有できるSiteConfigWikiもオープンしました。
http://s.hatena.ne.jp/siteconfig
どうぞご利用ください。
よく出来てる。AutoPagerizeのSITEINFOのように、サイト管理もはてなpre記法で書け、色んなサイトに対応出来るように見える。

でもこれって、「○○○のサイトに、はてなスターが付けられるグリモン書きました!」って事が出来なくなるんですよね。
ハッカー殺しとは言いませんが、以前「[再考]twitterが何故ウケるのか?」という記事で書いたように、良いサービスというのは

少しでも開発者が介入できるスキがあるか

が決め手だと私は信じている。

あと細かい話だが、上記引用部にあるリンクのsiteconfigで記述出来るセレクタは、Ten.jsというライブラリを使ったCSSセレクタを採用しており、XPathの様に柔軟ではない。
例えば、IDもCLASSも振られていないノードの、2個次のノードにスターを付けたいとか、そのノードの親ノードを辿りたい場合には、向かない。

現に、このsiteconfig自身にはてなスターを付けられるように考えて見たが、ノード階層が <h2><a href="hosturl">hostname</a><h2>
<div class="section-menu">
    ...
</div>
<div class="section">
    <pre>
    ...
    </pre>
</div>
となっており、IDもCLASSも付けられていないh2要素をエントリ郡として扱う為には、h2と書くしかない。これによってスターを付けるcontainerにはa要素を指定するしか無くなり、結果スターをクリックした瞬間にa要素が反応してしまう事になる。
まぁ、これはsiteconfig自身の問題で、h2要素からdiv要素までを纏めるdiv要素を作って貰えれば対応出来る話だが、XPathなら既存のHTMLでもまったく問題ない。

出来る事ならば、Web::Scraperの様にXPathもCSSセレクタも両方使える様にするのがいいんじゃないかなと思った。

Posted at by



2013/01/21


vim 使ってると良く CD-ROM を取り出したくなりますよね。
ならないとしたら、今すぐこの記事を読むのをやめて病院に行って下さい。
mattn/eject-vim - GitHub
https://github.com/mattn/eject-vim
インストールすると
:Eject というコマンドが追加されるので、実行するだけで CD-ROM トレイがゲロっと排出されます。
便利ですね!
皆さんもぜひ、使ってみて下さい。

(今日の参考文献: http://d.hatena.ne.jp/hasegawayosuke/20130112/p1)

なお、Windowsでしか動作しません。動作には libcallex-vim が必要です。
Posted at by



2013/01/20


以前、mruby-sqlite3 は作ったのでぜひ MySQL もやりたいなーと思いながら手を付けてなかったけどようやく重い腰をあげて書いた。
mattn/mruby-mysql - GitHub
https://github.com/mattn/mruby-mysql
動作は SQLite3 のと同じにしてあるつもりです。
MySQL の拡張は何度か書いた事あったけど、レコードを弄る様な物は随分昔に触ったきりで思い出せないし、API がいろいろ新しくなっててハマった。
最初、MYSQL_ROW を使って全部文字列でやれば良くね?と思ってたけど、結局ちゃんと MYSQL_BIND 使って書いた。

これで残すは PostgreSQL だけですが、実は PostgreSQL 使った拡張は今まで書いた事が無い。
誰か作って下さい。
こういうコードが動きます。
#!mruby

db = MySQL::Database.new('localhost''root''''foo')
begin
  db.execute_batch 'drop table foo'
  db.execute_batch 'drop table bar'
rescue RuntimeError
ensure
  db.execute_batch 'create table foo(id int primary key, text text, f float)'
  db.execute_batch 'create table bar(id int primary key, text text, f float)'
end

db.execute_batch('delete from foo')
db.execute_batch('insert into foo(id, text) values(?, ?)'1'foo')
db.execute_batch('insert into foo(id, text) values(?, ?)'2'bar')
db.transaction
db.execute_batch('insert into foo(text) values(?)''baz')
db.rollback
db.transaction
db.execute_batch('insert into foo(text) values(?)''bazoooo!')
db.commit

db.transaction
(1..100).each_with_index {|x,i|
  db.execute_batch('insert into bar(id, text) values(?,?)', i, x)
}
db.commit

db.execute('select * from bar'do |rowfields|
  puts row
end

#puts db.execute('select id from foo where text = ?', 'foo').next

db.execute_batch('delete from bar')
db.execute_batch('insert into bar(id, text, f) values(1,\'bababa\', NULL)')
db.execute_batch('insert into bar(id, text, f) values(2,\'bababa\', 3.14)')
db.execute('select * from bar'do |rowfields|
  puts row
end
row = db.execute('select * from bar')
puts row.fields
while cols = row.next
  puts cols
end
row.close

db.close
Posted at by