▼ [Windows] Meadow + PuTTY でSubversionを使用する方法
Meadow + PuTTY でSubversionを使用する方法メモ
方針
- リポジトリはリモートのUnixサーバに置く。
- アクセスはSSH (PuTTY) 経由
- PuTTYは C:\Program Files\PuTTY にインストールしてあると仮定。
- Pagent を利用。
- UTF-8マンセー
- MeadowのSVNインターフェイスはpsvnを使用
Subversionのインストール
- Win32 packages built against Apache 2.0 または Win32 packages built against Apache 2.2 から svn-win32-x.x.x.zip をダウンロード。
- svn-win32-x.x.x.zip を展開し、C:\Program Files\svn へコピーする。
- スタート → 設定 → コントロールパネル → システム → システムの詳細設定 → "詳細設定" タブ → 環境変数(N)... から以下の環境変数を設定する。
- ユーザ環境変数
- APR_ICONV_PATH=C:\Program Files\svn\iconv
- SVN_SSH=C:/Program Files/PuTTY/plink.exe
- システム環境変数
- PATH=(すでに設定されていた内容);C:\Program Files\svn\bin
- ユーザ環境変数
- スタート → ファイル名を指定して実行(R)... から "regedit" を起動。
- レジストリエディタの HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany キー内に 名前: "log-encoding", 種類: "REG_SZ", データ: "utf-8" を設定する。
- スタート → ファイル名を指定して実行(R)... から "cmd" を起動。
- コマンドプロンプトに "svn" と入力して、正常に実行されることを確認する。
C:\Users\yasu>svn Type 'svn help' for usage.
レポジトリの作成とテスト
- リモートのUnixホストでレポジトリを作成
pluto% svnadmin create /home/yasu/testrepos
- アクセスできることを確認。
C:\Users\yasu\work>mkdir test C:\Users\yasu\work>echo moemoe > test\test.txt C:\Users\yasu\work>svn import test svn+ssh://pluto/home/yasu/testrepos/test/ -m "initial import" Adding test\test.txt Committed revision 1. C:\Users\yasu\work>svn list svn+ssh://pluto/home/yasu/testrepos/test/ test.txt C:\Users\yasu\work>svn co svn+ssh://pluto/home/yasu/testrepos/test/ localcopy A localcopy\test.txt Checked out revision 1. C:\Users\yasu\work>cd localcopy C:\Users\yasu\work\localcopy>svn status M test.txt C:\Users\yasu\work\localcopy>svn commit -m "sakura tan haahaa" Sending test.txt Transmitting file data . Committed revision 2.
Meadowの設定
- ~/.emacs へ以下の設定を行い、C-x e で評価するか Meadow を再起動する。
(set-default-coding-systems 'utf-8-unix) (require 'psvn) (global-set-key "\C-c\C-s" 'svn-status) (setq svn-status-svn-executable "C:/Program Files/svn/bin/svn")
- C:\Users\yasu\work\localcopy\test.txt を開く。
- 適当に編集し、C-x C-s で保存。
- C-c C-s でステータスを表示。(変更しているため、"M" (modified) が付いている)
- "test.txt" にカーソルを合わせて "=" を押すことで差分を表示することが出来る。
- c を押すとログ入力画面が表示されるので、ログを入力後 C-c C-c でコミットする。

▼ [Perl] ニコニコ動画をWeb::Scraperでスクレイプ
ニコニコ動画のタグごとにRSSを作るため、最初は以下のように正規表現でゴリゴリと処理していたが、イマイチ綺麗じゃない。
while($html =~ m{<p><a\s+href="watch/(\w+)">\s*
<img\s+.*?src="(.*?)".*?>.*?
<strong>((?:\d+分)?\s*\d+秒)</strong>.*?
再生:<strong>([\d,]+)</strong>.*?
コメント:<strong>([\d,]+)</strong>.*?
<a\s+class="video".*?>([^<>]*)</a></p>.*?
<p.*?>([^<>]*?)</p>.*?
<p.*?><strong>([^<>]*?)</strong></p>
}gsx) {
...
}
今回は Web::Scraper というモジュールを使ってみた。これは、CSSセレクタやXpathで対象を指定すると、解析した結果を返してくれる。HTMLをパースして情報を取得するときに便利だ。
どのブロックからデータを取得するのかを大まかに指定してしまって、その中で細かい情報を取得するという段階を踏むと、スクレーピングしやすい
とあったので、
- "thumb_frm" を class 属性として持つ div 一式を取得
- これらの div について、細かく Xpath 指定で要素を抽出
という手順で処理することにした:
my $scraper = scraper {
process('//div[@class="thumb_frm"]',
'videos[]' => scraper {
process('/div/div/div/p/a/img',
img_url => '@src',
img_width => '@width',
img_height => '@height');
process('/div/div/p[2]/strong',
length_str => 'TEXT');
process('/div/div/p[2]/strong[2]',
num_played_str => 'TEXT');
process('/div/div/p[2]/strong[3]',
num_comments_str => 'TEXT');
process('/div/div[2]/p/a[@class="video"]',
title => 'TEXT',
url => '@href');
process('/div/div[2]/p[2]',
desc => 'TEXT');
process('/div/div[2]/div/p/strong',
comment => 'TEXT');
});
};
作った結果: ニコニコ動画 俺様用RSS
ニコニコ動画アクセス関係は WWW::NicoVideo として分離させているけど、需要あるかな?
▼ [Firefox] Firefoxのアドオン
Firefoxのアドオンによって様々な機能を追加することができる。最近まであまり活用していなかったがが、いろいろと調べて最終的に使うことになったのは以下の通り。再インストール時のときのため、自分用にメモ。
- Add N Edit Cookies
- クッキー編集機能
- Allow Right-Click
- 右クリックを禁止するアホなサイト対策
- Context Search
- 選択した文字列をサーチエンジンで検索
- dragdropupload
- ファイルアップロード領域にドラッグ・ドロップで入力する
- Firebug
- デバッグ用
- Greasemonkey
- サイトごとにユーザスクリプトを適用する
- IE Tab
- IEのレンダリングエンジンをFirefoxに組み込む
- PDF Download
- PDFをインラインで表示せず、ダウンロードして表示
- Popup ALT Attribute
- Alt属性に指定された文字列をポップアップさせる (本当はtitle属性を使うのが正しいのだが)
- Sage++
- フィードリーダ
- Stylish
- サイトごとにユーザCSSを適用する
▼ [Firefox] Firefoxで使えるフィードリーダ
私がフィードリーダに求める機能は以下の4点。
- サイト一覧、サイトの記事タイトル一覧、内容表示の3ペイン方式であること。
- フィード情報を1ページにまとめて表示 (フィードに含まれる記事一覧を内容も含めて表示) してほしい。(サイトによってはdescriptionなどに内容がすべて入っているため。)
- 内容表示はウェブサイトを表示可能であること。(フィードに完全なdescriptionが含まれない場合はウェブサイトを表示する必要があるため。別ウインドウ・タブで表示するのは面倒。)
- できれば favicon に対応してほしい。
上記の観点を踏まえて、Firefoxで利用可能なフィード (RSS/ATOM) リーダを複数試してみた。
- Sage
- タイプ: 3ペイン (サイドバー2ペイン)
フィードをまとめて表示: Yes
内容としてサイトを表示: Yes
Favicon対応: No
データ: ブックマーク
Faviconに対応していないという欠点はあるが、それ以外の機能はすべて実現可能。URL欄にランダム文字列のディレクトリ名を含んだフルパス名が出るのがイマイチ。(セキュリティ的な意味で) - Sage++
- タイプ: 3ペイン (サイドバー2ペイン)
フィードをまとめて表示: Yes
内容としてサイトを表示: Yes
Favicon対応: No
データ: ブックマーク
Sageの改造版。広告ブロック機能があるので最終的にこれを利用することにした。 - Brief
- タイプ: 2ペイン (ペイン分割)
フィードをまとめて表示: Yes
内容としてサイトを表示: Yes
Favicon対応: Yes
データ: ブックマーク (ライブブックマーク)
タイトル (とdescription) 一覧とウェブサイトを同一ペイン内で切り替えるため、私にとっては使いづらい。フィードに含まれる内容だけを読むのであれば良いと思う。 - Wizz RSS News Reader
- タイプ: 3/4ペイン (サイドバー 2/3ペイン)
フィードをまとめて表示: Yes
内容としてサイトを表示: Yes
Favicon対応: (Yes)
データ: ブックマーク
Sageと似ているが、機能がかなり多い。必要な機能は網羅しているが、デザインがあまり好きになれない。Faviconはフィードを提供するサイトのものが使われるのが残念。 - NewsFox
- タイプ: 3ペイン (ペイン分割)
フィードをまとめて表示: Yes
内容としてサイトを表示: Yes
Favicon対応: Yes
データ: 独自?
3ペイン分割タイプで、OutlookやThunderbirdと似た画面で利用することができる。フィードすべてを再読み込みさせるとFirefoxが応答なしになる、フィードの登録インターフェイスが使いづらいという欠点はあるが、購読するフィードが少ないなら良いと思う。
Sage++とWizz RSSのどちらにするか迷ったが、広告ブロック機能がある点と、デザインが好みである点からSage++を利用することとした。(広告自体は嫌いではなくKasperskyの広告ブロック機能も無効にしてあるが、記事一覧に広告があるのは好きではないため。) 上記の欠点が修正されれば Brief や NewsFox に乗り換えるかもしれない。
Sage++ではキーバインドが変更されているため、about:config で下記内容に変更。
sage.key.focusSidebar = X sage.key.focusSidebar.modifiers = alt sage.key.openSidebar = Z sage.key.openSidebar.modifiers = alt
▼ [Perl] メールアドレスのチェック・解析
メールアドレスが正しい形式であるか確認する
入力されたメールアドレスの形式を確認するため、
if(not $mail =~ /^[a-z0-9]+@[a-z0-9-]+(?:\.[a-z0-9-]+)+$/) {
die "invalid address";
}
のようなコードを書くべきではない。メールアドレスというものはあなたが考えている以上に複雑で、このような単純なコードでチェックし切ることはできない。車輪の再発明をせず、次のように Email::Valid を利用しよう。これはDNSのMXレコードのチェックなども可能である。
use Email::Valid;
if(not Email::Valid->address(-address => $mail,
-mxcheck => 1,
-fqdn => 1) {
die "invalid address";
}
RFC 822 (2822) 形式のアドレスをパースする
メールのヘッダ中に含まれるアドレスはさまざまな形式を取るため、これを自力で解析するのは骨が折れる。これもモジュールを利用することで車輪の再発明を避けることができる。以下は Email::Address を利用した例である。(同様のモジュールとしては Mail::Address があり、若干インターフェイスが異なる。)
use Email::Address;
my @addrs = Email::Address->parse(
'HIRATA Yasuyuki <yasu@example.com>, ' .
'yasu@example.net (HIRATA Yasuyuki), ' .
'"sakura tan haahaa"@example.org' # *VALID* RFC 2822 address
);
foreach (@addrs) {
print $_->address, "\n";
}
