Upload
ujihisa
View
2.182
Download
4
Tags:
Embed Size (px)
Citation preview
Rubyで快適に連投する11の方法
Agile Web Posting with Ruby 2008 UJIHISA, Tatsuhiro
2008 UJIHISA, Tatsuhiro
今日のお題Today’s topic
すごく、ふつうですIt’s very abnormal
移動タイム
• 今回の話のターゲットはプログラミング初級者This talk focuses newbie programmers
• デキる人にはyuguiさんの方がいいよ!
Real hackers should move to yugui
UJIHISA, Tatsuhiro• Ruby, Haskell, Vim, JavaScript
• Osaka University
• Fuzzy-rough sets theory, Data mining
• Stanford University!
• rubynekohttp://ujihisa.nowa.jp
Rubyで快適に連投する話とか11個くらい余談
Agile Web Posting with Ruby and something 11 topics 2008 UJIHISA, Tatsuhiro
あなたが普段使っているWebサービスは?
あなたが普段使っているWebサービスは?
あなたが普段使っているWebサービスは?
あなたが普段使っているWebサービスは?
連投spam
連投
連投
連投
連投
連投
連投
Agile Web Posting
• 書いたばかりの文書をなんらかのWebサービスにPostする行為を最適化する。outputの最適化
• Optimize posting to some web services what do you think and what are you doing.Output Optimization
前提 (prelimitary)• Rubyはそれなりに使えるけど、他はあまり… というふつうの人が今回の話の対象This talk focuses on ordinal people who can ruby but cannot other languages.
• まじめに対応するより、とにかく当面の問題が解決されればそれでよいdirty hack OK.
どのように楽をしている?• ログインはブラウザがAutofill
• bookmarkletで
• greasemonkeyで
• add-onで
• 専用クライアントで
Webサービスを考える• 入力、加工、出力• (入力, 出力): インタフェース
• 汎用的で便利な出力: RSS
• 無理矢理RSSに:
• Yahoo! Pipes, p[lr]agger,PatchService
数秒の手間を惜しむ• ...ブラウザのタブを開いて、ブックマークからサイトを開いて、ログインして、投稿ページに行って、本文を書いて、確認画面を経由して、投稿する。投稿後、URIをコピーする
• “本文を書いて投稿する。” でOK
• 開発時間と使用時間の和を最小化
Web
Rubyでラクをする
ユーザ入力
ユーザ出力Ruby script
RubyのWeb関係ライブラリ• net/http
• open-uri
• Hpricot (HTML操作)
• WWW::Mechanize
WWW::Mechanize
RubyでWebに対して入出力
agent = WWW::Mechanize.newpage = agent.get 'http://mixi.jp/'form = page.forms[0]form.email = 'YOUR_EMAIL'form.password = 'YOUR_PASSWORD'agent.submit formpage = agent.get "http://mixi.jp/home.pl"p page.links.map {¦i¦ i.uri }
$ sudo gem install mechanize
Webユーザ入力
ユーザ出力Ruby script
インタフェースは?
$ cat my_diary.txt ¦ ruby mixi.rb[mixi] 投稿テストhttp://mixi.jp/view_diary.pl?id=*********&owner_id=*******$ echo "投稿テスト2\nこれでいけるかな" ¦ ruby mixi.rb[mixi] 投稿テスト2http://mixi.jp/view_diary.pl?id=*********&owner_id=*******
インタフェースは?
考えられる方法• スクリプトに引数で渡した文字列で
POST
• スクリプトに標準入力で渡した文字列でPOST
• スクリプト起動するとEDITORが立ち上がって、保存して終了するとPOST
(svn ci方式)
それVimで
• メモ、コード、etc
• その画面からそのままPOSTしたい
• →vimのコマンドを追加する
「普段の作業のほとんどはvimの中」(vimユーザ)
vimscript
..." Setup the autocommands that handle buffer MRU ordering.augroup LustyExplorer autocmd! autocmd BufEnter * ruby Window.buffer_stack.push autocmd BufDelete * ruby Window.buffer_stack.pop autocmd BufWipeout * ruby Window.buffer_stack.popaugroup End
ruby << EOFrequire 'pathname'
class String def ends_with?(s) tail = self[-s.length, s.length] tail == s end
def starts_with?(s) head = self[0, s.length] head == s endend...
lusty-explorer.vim
..." Setup the autocommands that handle buffer MRU ordering.augroup LustyExplorer autocmd! autocmd BufEnter * ruby Window.buffer_stack.push autocmd BufDelete * ruby Window.buffer_stack.pop autocmd BufWipeout * ruby Window.buffer_stack.popaugroup End
ruby << EOFrequire 'pathname'
class String def ends_with?(s) tail = self[-s.length, s.length] tail == s end
def starts_with?(s) head = self[0, s.length] head == s endend...
lusty-explorer.vim
ruby...?
vimのruby拡張• vimscriptの中に文字列でrubyのコードを書く
• vimscript側でvimのコマンドとruby
のメソッドを対応づける
• ruby側でvimscriptをevalする
$ vim --versionVIM - Vi IMproved 7.1 (2007 May 12, compiled May 8 2008 10:49:50)MacOS X (unix) versionIncluded patches: 1-293Compiled by [email protected] version without GUI. Features included (+) or not (-):+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent -clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +folding -footer +fork() -gettext -hangul_input +iconv +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu +mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm -mouse_jsbterm +mouse_netterm +mouse_xterm +multi_byte +multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra -perl +postscript +printer +profile +python +quickfix +reltime +rightleft +ruby +scrollbind +signs +smartindent ...
command Mixi :call <SID>MixiStart()
function! s:MixiStart() ruby mixi_runendfunction
ruby << EOFdef mixi_run 処理endEOF
def mixi_run return if VIM.evaluate('confirm("really?")') == 0
endline = VIM.evaluate %[line("$")] title = VIM.evaluate %[getline(1)] body = VIM.evaluate %[join(getline(2, #{endline}), "\n")]
m = Mixi.new 'YOUR_EMAIL', 'YOUR_PASSWORD' # if you are mixi premium member: # m = Mixi.new 'YOUR_EMAIL', 'YOUR_PASSWORD', true m.post title.toeuc, body.toeuc m.get_latest.each do ¦line¦ VIM.evaluate %[append(#{endline}, \"#{line.chomp}\")] endend
使い方• ~/.vim/plugin/以下に配置
• あとはvimを起動して:Mixiなど
• コマンド実行されるまで処理させないことが大事require ‘mechanize’などは重い
これだけ覚える• おまじない (コピペでOK)
• VIM.evaluate
• CodeReposのlang/vim以下を見ればたくさんのサンプルが。http://coderepos.org/share/browser/lang/vim/
公開しているvimscript例
mixi.vim/nowa.vim
• ファイルに保存する気分でエントリをPOSTしてしまう
• :Mixi, :Nowa一行目がsubject, 二行目以降が本文
• http://coderepos.org/share/browser/lang/vim/misc/{mixi|nowa}.vim
• 要認証用パスワード
絶賛の声
絶賛の声
絶賛の声
絶賛の声
cotocoto.vim
• 勉強会開催を連投できる• :Cotocotoでbufferにテンプレ
:CotocotoPostで投稿
• 構文解析はyamlに丸投げ
• 設定不要
実演
インタフェース再考• vim/emacsにこだわる必要はない
• 最適な入力環境(編集, 入力支援, 参照)
という意味ではvim/emacsは良い
• “既に起動しているもの”
• rubyで書いて外部コマンド化することで汎用性を高める
• vimscriptとelispそれぞれで書くよりvimscriptとelispがそれぞれrubyを呼べばよい
• mechanize強力
エディタの拡張• 大抵のエディタはなんらかの拡張が可能なはず
• 外部コマンドを実行できるならもはやなんでもあり
• vimのためにrubyで書いたものが再利用できる!
適材適所• twitterもvimで閲覧&投稿!
• timelineを取得→アイコンが見れない
• 使い物にならない
閑話休題
Haskell
• Rubyistの4割はHaskellを日常的に使っている40% of rubyists use Haskell every day
• HaskellであんなことやこんなことしたいHaskell OK
VimからHaskell
haskell <<ENDfib :: Int -> Intfib = let fibs = (0:1:zipWith(+)fibs(tail fibs)) in (fibs !!)END
は、出来ない
RubyからHaskell• Rubiskell (by yhara)
• http://mono.kmc.gr.jp/~yhara/d/?date=20071202#p04
• Rubyスクリプト中にHaskellのコードを埋め込むembedding Haskell in Ruby
require 'rubiskell'
p Haskell.new(<<EOF).run(8)fib :: Int -> Intfib = let fibs = (0:1:zipWith(+)fibs(tail fibs)) in (fibs !!)EOF
#=> 21
デモ• vimでmixiにフィボナッチ数列を含む日記を投稿する
おわり