Agile Web Posting With Ruby / Ruby Kaigi2008

Preview:

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 ujihisa@momen.lanHuge 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にフィボナッチ数列を含む日記を投稿する

おわり

Recommended