62
Rubyで快適に連投する 11の方法 Agile Web Posting with Ruby 2008 UJIHISA, Tatsuhiro

Agile Web Posting With Ruby / Ruby Kaigi2008

  • Upload
    ujihisa

  • View
    2.173

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Agile Web Posting With Ruby / Ruby Kaigi2008

Rubyで快適に連投する11の方法

Agile Web Posting with Ruby 2008 UJIHISA, Tatsuhiro

Page 2: Agile Web Posting With Ruby / Ruby Kaigi2008

2008 UJIHISA, Tatsuhiro

Page 3: Agile Web Posting With Ruby / Ruby Kaigi2008

今日のお題Today’s topic

Page 4: Agile Web Posting With Ruby / Ruby Kaigi2008

すごく、ふつうですIt’s very abnormal

Page 5: Agile Web Posting With Ruby / Ruby Kaigi2008

移動タイム

• 今回の話のターゲットはプログラミング初級者This talk focuses newbie programmers

• デキる人にはyuguiさんの方がいいよ!

Real hackers should move to yugui

Page 6: Agile Web Posting With Ruby / Ruby Kaigi2008
Page 7: Agile Web Posting With Ruby / Ruby Kaigi2008

UJIHISA, Tatsuhiro• Ruby, Haskell, Vim, JavaScript

• Osaka University

• Fuzzy-rough sets theory, Data mining

• Stanford University!

• rubynekohttp://ujihisa.nowa.jp

Page 8: Agile Web Posting With Ruby / Ruby Kaigi2008
Page 9: Agile Web Posting With Ruby / Ruby Kaigi2008

Rubyで快適に連投する話とか11個くらい余談

Agile Web Posting with Ruby and something 11 topics 2008 UJIHISA, Tatsuhiro

Page 10: Agile Web Posting With Ruby / Ruby Kaigi2008

あなたが普段使っているWebサービスは?

Page 11: Agile Web Posting With Ruby / Ruby Kaigi2008

あなたが普段使っているWebサービスは?

Page 12: Agile Web Posting With Ruby / Ruby Kaigi2008

あなたが普段使っているWebサービスは?

Page 13: Agile Web Posting With Ruby / Ruby Kaigi2008

あなたが普段使っているWebサービスは?

Page 14: Agile Web Posting With Ruby / Ruby Kaigi2008

連投spam

Page 15: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 16: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 17: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 18: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 19: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 20: Agile Web Posting With Ruby / Ruby Kaigi2008

連投

Page 21: Agile Web Posting With Ruby / Ruby Kaigi2008

Agile Web Posting

• 書いたばかりの文書をなんらかのWebサービスにPostする行為を最適化する。outputの最適化

• Optimize posting to some web services what do you think and what are you doing.Output Optimization

Page 22: Agile Web Posting With Ruby / Ruby Kaigi2008

前提 (prelimitary)• Rubyはそれなりに使えるけど、他はあまり… というふつうの人が今回の話の対象This talk focuses on ordinal people who can ruby but cannot other languages.

• まじめに対応するより、とにかく当面の問題が解決されればそれでよいdirty hack OK.

Page 23: Agile Web Posting With Ruby / Ruby Kaigi2008

どのように楽をしている?• ログインはブラウザがAutofill

• bookmarkletで

• greasemonkeyで

• add-onで

• 専用クライアントで

Page 24: Agile Web Posting With Ruby / Ruby Kaigi2008

Webサービスを考える• 入力、加工、出力• (入力, 出力): インタフェース

• 汎用的で便利な出力: RSS

• 無理矢理RSSに:

• Yahoo! Pipes, p[lr]agger,PatchService

Page 25: Agile Web Posting With Ruby / Ruby Kaigi2008

数秒の手間を惜しむ• ...ブラウザのタブを開いて、ブックマークからサイトを開いて、ログインして、投稿ページに行って、本文を書いて、確認画面を経由して、投稿する。投稿後、URIをコピーする

• “本文を書いて投稿する。” でOK

• 開発時間と使用時間の和を最小化

Page 26: Agile Web Posting With Ruby / Ruby Kaigi2008

Web

Rubyでラクをする

ユーザ入力

ユーザ出力Ruby script

Page 27: Agile Web Posting With Ruby / Ruby Kaigi2008

RubyのWeb関係ライブラリ• net/http

• open-uri

• Hpricot (HTML操作)

• WWW::Mechanize

Page 28: Agile Web Posting With Ruby / Ruby Kaigi2008

WWW::Mechanize

RubyでWebに対して入出力

Page 29: Agile Web Posting With Ruby / Ruby Kaigi2008

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

Page 30: Agile Web Posting With Ruby / Ruby Kaigi2008

Webユーザ入力

ユーザ出力Ruby script

インタフェースは?

Page 31: Agile Web Posting With Ruby / Ruby Kaigi2008

$ 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=*******

インタフェースは?

Page 32: Agile Web Posting With Ruby / Ruby Kaigi2008

考えられる方法• スクリプトに引数で渡した文字列で

POST

• スクリプトに標準入力で渡した文字列でPOST

• スクリプト起動するとEDITORが立ち上がって、保存して終了するとPOST

(svn ci方式)

Page 33: Agile Web Posting With Ruby / Ruby Kaigi2008

それVimで

• メモ、コード、etc

• その画面からそのままPOSTしたい

• →vimのコマンドを追加する

「普段の作業のほとんどはvimの中」(vimユーザ)

Page 34: Agile Web Posting With Ruby / Ruby Kaigi2008

vimscript

Page 35: Agile Web Posting With Ruby / Ruby Kaigi2008

..." 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

Page 36: Agile Web Posting With Ruby / Ruby Kaigi2008

..." 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...?

Page 37: Agile Web Posting With Ruby / Ruby Kaigi2008

vimのruby拡張• vimscriptの中に文字列でrubyのコードを書く

• vimscript側でvimのコマンドとruby

のメソッドを対応づける

• ruby側でvimscriptをevalする

Page 38: Agile Web Posting With Ruby / Ruby Kaigi2008

$ 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 ...

Page 39: Agile Web Posting With Ruby / Ruby Kaigi2008

command Mixi :call <SID>MixiStart()

function! s:MixiStart() ruby mixi_runendfunction

ruby << EOFdef mixi_run 処理endEOF

Page 40: Agile Web Posting With Ruby / Ruby Kaigi2008

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

Page 41: Agile Web Posting With Ruby / Ruby Kaigi2008

使い方• ~/.vim/plugin/以下に配置

• あとはvimを起動して:Mixiなど

• コマンド実行されるまで処理させないことが大事require ‘mechanize’などは重い

Page 42: Agile Web Posting With Ruby / Ruby Kaigi2008

これだけ覚える• おまじない (コピペでOK)

• VIM.evaluate

• CodeReposのlang/vim以下を見ればたくさんのサンプルが。http://coderepos.org/share/browser/lang/vim/

Page 43: Agile Web Posting With Ruby / Ruby Kaigi2008

公開しているvimscript例

Page 44: Agile Web Posting With Ruby / Ruby Kaigi2008

mixi.vim/nowa.vim

• ファイルに保存する気分でエントリをPOSTしてしまう

• :Mixi, :Nowa一行目がsubject, 二行目以降が本文

• http://coderepos.org/share/browser/lang/vim/misc/{mixi|nowa}.vim

• 要認証用パスワード

Page 45: Agile Web Posting With Ruby / Ruby Kaigi2008

絶賛の声

Page 46: Agile Web Posting With Ruby / Ruby Kaigi2008

絶賛の声

Page 47: Agile Web Posting With Ruby / Ruby Kaigi2008

絶賛の声

Page 48: Agile Web Posting With Ruby / Ruby Kaigi2008

絶賛の声

Page 49: Agile Web Posting With Ruby / Ruby Kaigi2008
Page 50: Agile Web Posting With Ruby / Ruby Kaigi2008

cotocoto.vim

• 勉強会開催を連投できる• :Cotocotoでbufferにテンプレ

:CotocotoPostで投稿

• 構文解析はyamlに丸投げ

• 設定不要

Page 51: Agile Web Posting With Ruby / Ruby Kaigi2008

実演

Page 52: Agile Web Posting With Ruby / Ruby Kaigi2008

インタフェース再考• vim/emacsにこだわる必要はない

• 最適な入力環境(編集, 入力支援, 参照)

という意味ではvim/emacsは良い

• “既に起動しているもの”

Page 53: Agile Web Posting With Ruby / Ruby Kaigi2008

• rubyで書いて外部コマンド化することで汎用性を高める

• vimscriptとelispそれぞれで書くよりvimscriptとelispがそれぞれrubyを呼べばよい

• mechanize強力

Page 54: Agile Web Posting With Ruby / Ruby Kaigi2008

エディタの拡張• 大抵のエディタはなんらかの拡張が可能なはず

• 外部コマンドを実行できるならもはやなんでもあり

• vimのためにrubyで書いたものが再利用できる!

Page 55: Agile Web Posting With Ruby / Ruby Kaigi2008

適材適所• twitterもvimで閲覧&投稿!

• timelineを取得→アイコンが見れない

• 使い物にならない

Page 56: Agile Web Posting With Ruby / Ruby Kaigi2008

閑話休題

Page 57: Agile Web Posting With Ruby / Ruby Kaigi2008

Haskell

• Rubyistの4割はHaskellを日常的に使っている40% of rubyists use Haskell every day

• HaskellであんなことやこんなことしたいHaskell OK

Page 58: Agile Web Posting With Ruby / Ruby Kaigi2008

VimからHaskell

haskell <<ENDfib :: Int -> Intfib = let fibs = (0:1:zipWith(+)fibs(tail fibs)) in (fibs !!)END

は、出来ない

Page 59: Agile Web Posting With Ruby / Ruby Kaigi2008

RubyからHaskell• Rubiskell (by yhara)

• http://mono.kmc.gr.jp/~yhara/d/?date=20071202#p04

• Rubyスクリプト中にHaskellのコードを埋め込むembedding Haskell in Ruby

Page 60: Agile Web Posting With Ruby / Ruby Kaigi2008

require 'rubiskell'

p Haskell.new(<<EOF).run(8)fib :: Int -> Intfib = let fibs = (0:1:zipWith(+)fibs(tail fibs)) in (fibs !!)EOF

#=> 21

Page 61: Agile Web Posting With Ruby / Ruby Kaigi2008

デモ• vimでmixiにフィボナッチ数列を含む日記を投稿する

Page 62: Agile Web Posting With Ruby / Ruby Kaigi2008

おわり