ysakumaのアメブロ -3ページ目

[svn]リポジトリURLの変更

リポジトリの場所を変更したり、公開方法をsvnからhttpにした等でチェックアウトするのはコスト高と感じた場合。
$ svn switch --relocate svn://hoge.com/repos http://hoge.com/repos
とすればURLだけ書き換わるので幸せ。

[Mac]rubygemsでuninstallできない

cleanupやuninstallが失敗に終わった時の備忘録。
activeになって無いもんの掃除が前提です。別にそれ以外の意味は無いです。

【前置き】
$ sudo gem cleanupってしたら
Attempting to uninstall xxxx-z.z.z
Unable to uninstall xxxx-z.z.z:
Gem::InstallError: cannot uninstall, check `gem list -d xxxx`
みたいなのがたくさん出てきてがびーん。んじゃ細々やりますよ。
$ sudo gem uninstall xxxx -v z.z.z
Successfully uninstalled xxxx-z.z.z
おし。うまく行った。と思いきや
$ sudo gem list actionpack

*** LOCAL GEMS ***

xxxx (x.x.x, y.y.y, z.z.z)
あるやーん。消せてないやーん。
ってなったときの話です。

【本題】

cleanupの時に言われた指示通り見てみます。
$ sudo gem list -d xxxx

*** LOCAL GEMS ***

xxxx (x.x.x, y.y.y, z.z.z)
Author: hoge
Rubyforge: http://rubyforge.org/projects/xxxx
Homepage: http://www.rubyonrails.org
Installed at (x.x.x): /Library/Ruby/Gems/1.8
(y.y.y): /Library/Ruby/Gems/1.8
(z.z.z): /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Web-flow and rendering framework putting the VC in MVC.
もうモジュールあっちゃこっちゃになってるとします。
消したいバージョンz.z.zが入ってる場所はいつものgemにとっちゃ管理外で他のgemが入れたんだろ?消したいならちゃんと支持してくれよ。って事と解釈。
探したらそういうオプションがあった。
$ sudo gem uninstall -i /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8 xxxx -v z.z.z

[ruby]HTMLのパースでの正規表現で気を付ける事

正規表現の備忘録。


AtomとかRSSサービスの付いてないサイトに、同サービス(っぽい)利用をしたい。


httpアクセスして、requestデータのHTMLをパースしてみる。


Hpricotみたいなの使えばいいんですが。。。


とりあえず下記みたいなHTMLリクエストの場合で。


?> html = <<EOS

<html>

<head>

<title>hoge</title>

</head>

<body>

<h1>hoge</h1>

<hr size=1>

#[huga]

hugahuga

<hr size="1">

#[hoga]

hogahoga

</body>

</html>

EOS

=> "<html>\n<head>\n<title>hoge</title>\n</head>\n<body>\n<h1>hoge</h1>\n<hr>\none\n<hr>\ntwo\n</body>\n</html>\n"


■改行を無視

「*」は改行を考えないってこと。例えば<body>~</body>抜きで。


?> /<body>(.*)<\/body>/ =~ html

=> nil

?> puts $1

nil


なんも返ってきません。つまり<body>と改行の間には何もない。ってことです。

だから改行を無視するオプションmをつける。と


?> /<body>(.*)<\/body>/m =~ html

?> puts $1<h1>hoge</h1>

<hr size=1>

#[huga]

hugahuga

<hr size="1">

#[hoga]

hogahoga


あとで改行考えながらだけど、目的は達成。





■「.*」「.+」などで「目的の文字まで」を考慮


これは、Perlの拡張正規表現。Java の Pattern クラス、Python、Rubyとかである程度使える。(※全部じゃない)


今回<hr>で区切られて繰り返してるのですが、例えば[]の中身を抜きたいなんて時。?> html.scan(/<hr.*?\[(.*?)\]/m)

=> [["huga"], ["hoga"]]


.*の後ろの?がポイント。


これはできるけ短い文字列にマッチさせようとしてくれるおまじないで、これが無いと、.*が[と]を食っちゃう。


つまり

?> html.scan(/<hr.*\[(.*)\]/m)

=> [["hoga"]]


こんな結果になっちゃう。


最初の.*が[を探して探して、基本一番長く文字列抜こうとするから、途中の[を自分の取り分にしちゃう。[huga]の[も食っちゃう。


結果、一番後ろの[]の中身しか取得できない。








うーん。。。いつもながらわかりにくい。