[svn]リポジトリURLの変更
$ svn switch --relocate svn://hoge.com/repos http://hoge.com/repos
とすればURLだけ書き換わるので幸せ。[Mac]rubygemsで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]の[も食っちゃう。
結果、一番後ろの[]の中身しか取得できない。
うーん。。。いつもながらわかりにくい。