<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
	<title>Magical Diary, beta version</title>
	<link>http://diary.asuka.net/</link>
	<language>ja</language>
	<description>技術と萌えについて適当にメモする場所; 特に断りが無い限りFreeBSDを前提にしています。</description>
	<copyright>(c) 2008 HIRATA Yasuyuki</copyright>
	<pubDate>Mon, 04 Feb 2008 16:56:54 GMT</pubDate>
	<lastBuildDate>Mon, 20 Oct 2008 12:47:58 GMT</lastBuildDate>
	<generator>http://adiary.abk.nu/#1.40</generator>
	<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
	<item>
		<title>ニコニコ動画Perlインターフェイス (WWW::NicoVideo) 公開</title>
		<link>http://diary.asuka.net/perl_interface_to_nicovideo</link>
		<guid>http://diary.asuka.net/perl_interface_to_nicovideo</guid>
		<category>Perl</category>
		<pubDate>Tue, 27 Nov 2007 16:04:17 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>ニコニコ動画の情報を取得する <a href="http://search.cpan.org/dist/WWW-NicoVideo/">WWW::NicoVideo</a> を作成した。RSSを作成するために最低限必要な部分しか作っておらず、非公開APIについても未対応。</p>
<dl>
  <dt>CPAN</dt>
  <dd><a href="http://search.cpan.org/dist/WWW-NicoVideo/">http://search.cpan.org/dist/WWW-NicoVideo/</a></dd>
  <dt>いじり中Subversionリポジトリ</dt>
  <dd><a href="http://svn.coderepos.org/share/lang/perl/WWW-NicoVideo/">http://svn.coderepos.org/share/lang/perl/WWW-NicoVideo/</a></dd>
  <dt>いじり中ソースコードブラウザ</dt>
  <dd><a href="http://coderepos.org/share/browser/lang/perl/WWW-NicoVideo/">http://coderepos.org/share/browser/lang/perl/WWW-NicoVideo/</a></dd>
</dl>
<p>使い方は <a href="http://coderepos.org/share/browser/lang/perl/WWW-NicoVideo/trunk/examples/ritsuko.pl">添付のサンプル</a> を参照… では不親切なので、Feed に変換するプログラム:</p>
<pre>
use utf8;
use strict;
use warnings;
 
use Getopt::Std;
use Encode;
use Encode::Guess "euc-jp";
use XML::Feed;
use WWW::NicoVideo;
 
MAIN: &#123;
  my %opts;
  getopts('m:p:t:k:f:o:', \%opts);
  my $mail = $opts&#123;m} || die "mail required";
  my $passwd = $opts&#123;p} || die "passwd required";
  my $outfile = $opts&#123;o};
  my $format = $opts&#123;f} || "Atom";
  my $key = defined $opts&#123;k}? decode("Guess", $opts&#123;k}): "律子ソロ";
  my $type = $opts&#123;t} || "tag";
  my $method = &#123;tag =&gt; "getEntriesByTagNames",
		"search" =&gt; "getEntriesByKeywords"}-&gt;&#123;$type} or
		die "invalid type: $type";
 
  my $outfh;
  if(defined $outfile) &#123;
    open $outfh, "&gt;:utf8", $outfile;
  } else &#123;
    $outfh = \*STDOUT;
    binmode STDOUT, ":utf8";
  }
 
  my $nv = new WWW::NicoVideo();
  $nv-&gt;mail($mail);
  $nv-&gt;passwd($passwd);
  $nv-&gt;login or die "login failed";
 
  my $feed = new XML::Feed($format);
  $feed-&gt;title("@&#123;[ucfirst $type]}: $key - ニコニコ動画");
  $feed-&gt;link("http://www.nicovideo.jp/");
  foreach my $e ($nv-&gt;$method(key =&gt; $key, sort =&gt; "f", order =&gt; "d")) &#123;
    my $ent = new XML::Feed::Entry($format);
    $ent-&gt;title($e-&gt;title);
    $ent-&gt;link($e-&gt;url);
    $ent-&gt;content($e-&gt;desc);
    $feed-&gt;add_entry($ent);
  }
 
  print $outfh $feed-&gt;as_xml;
}
</pre>
<p>使用例: <code>perl ritsuko-feed.pl -m your-mail@example.org -p your-passwd -k "最東みんくP" -o minkhouse.atom</code></p>
<p><a href="http://www.ritsuko.org/">ritsuko.org</a>始めました</p>
</div>
</div>

<hr>
<h4><a href="/perl_interface_to_nicovideo#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/perl_interface_to_nicovideo#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Defined-or演算子とFreeBSD port</title>
		<link>http://diary.asuka.net/defined-or_operator_and_freebsd_port</link>
		<guid>http://diary.asuka.net/defined-or_operator_and_freebsd_port</guid>
		<category>Perl</category>
		<pubDate>Sun, 25 Nov 2007 10:18:42 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>Defined-or 演算子 ("//") は <a href="http://search.cpan.org/~rgarcia/perl-5.10.0-RC1/pod/perl5100delta.pod#Defined-or_operator">perl 5.10 以降で利用可能</a> (とりあえず、開発者向けの5.9は考えない) であるが、FreeBSD port の lang/perl5.8 では利用できる。
これは、FreeBSD portのPerlは <a href="http://www.freebsd.org/cgi/cvsweb.cgi/ports/lang/perl5.8/Makefile?rev=1.94;content-type=text%2Fx-cvsweb-markup;f=h;only_with_tag=MAIN">/usr/ports/lang/perl5.8/Makefile</a> で defined-or-5.8.8.bz2 というパッチが指定されているためだ:</p>
<blockquote>
<pre>
PATCHFILES=	defined-or-5.8.8.bz2
</pre>
</blockquote>
<p><code>perl -V</code> を実行することでもわかる:</p>
<blockquote>
<pre>
Characteristics of this binary (from libperl):
  Compile-time options: MYMALLOC PERL_MALLOC_WRAP USE_64_BIT_INT
                        USE_LARGE_FILES USE_PERLIO
  Locally applied patches:
        <strong>defined-or</strong>
</pre>
</blockquote>
<p>現状で 5.9 / 5.10 が導入されて環境は少ないため、可搬性を考慮する場合は "//" の利用は見合わせたほうがよさそうだ。</p>
</div>
</div>

<hr>
<h4><a href="/defined-or_operator_and_freebsd_port#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/defined-or_operator_and_freebsd_port#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>ニコニコ動画の更新情報をTwitterに流す</title>
		<link>http://diary.asuka.net/feeding_nicovideo_update_to_twitter</link>
		<guid>http://diary.asuka.net/feeding_nicovideo_update_to_twitter</guid>
		<category>WWW</category>
		<pubDate>Thu, 08 Nov 2007 15:49:36 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>ニコニコ動画の更新情報をTwitterに流す実験:</p>
<ul>
  <li><a href="http://twitter.com/vocaloid">Tag: 初音ミク, 鏡音リン</a></li>
  <li><a href="http://twitter.com/idolmaster">Tag: アイドルマスター, アイマス</a></li>
</ul>
<p>updatetwitter.pl:</p>
<pre>
#! /usr/bin/perl
use strict;
use warnings;
use open OUT =&gt; ":encoding(euc-jp)";
use YAML qw[LoadFile];
use Data::Dumper;
use DB_File;
use Fcntl;
use Digest::MD5 qw[md5_hex];
use XML::RSS::Parser;
use Net::Twitter;
MAIN: &#123;
  my $conf = LoadFile("etc/twitter.yml") || die $!;
  tie(my %db, DB_File =&gt; $conf-&gt;&#123;read_db}, O_RDWR|O_CREAT, 0644) or die $!;
  foreach my $e (@&#123;$conf-&gt;&#123;targets}}) &#123;
    my $twit = Net::Twitter-&gt;new(username=&gt; $e-&gt;&#123;username},
				 password=&gt; $e-&gt;&#123;password}) || die $!;
    foreach my $t (@&#123;$e-&gt;&#123;tags}}) &#123;
      my $rssfile = sprintf $conf-&gt;&#123;rss_path}, "tag", md5_hex($t);
      open my $fh, "&lt;", $rssfile or die $!;
      my $feed =  XML::RSS::Parser-&gt;new-&gt;parse_file($fh);
      my $count = 0;
      foreach my $i ($feed-&gt;query("//item")) &#123;
	my $title = $i-&gt;query("title")-&gt;text_content;
	my $link = $i-&gt;query("link")-&gt;text_content;
	utf8::encode($title);
	my $key = "$e-&gt;&#123;username};$link";
	if(not exists $db&#123;$key}) &#123;
	  $twit-&gt;update("$link $title");
	  $db&#123;$key} = time;
	  sleep 3;
          last if(3 &lt;= ++$count);
	}
      }
    }
  }
}
</pre>
<p>etc/config.yml (utf-8):</p>
<pre>
rss_path: rss/%s/%s.rss
read_db: var/rss_read.db
targets:
  - username: vocaloid
    password: ########
    tags:
      - 初音ミク
      - 鏡音リン
  - username: idolmaster
    password: ########
    tags:
      - アイドルマスター
      - アイマス
</pre>
</div>
</div>

<hr>
<h4><a href="/feeding_nicovideo_update_to_twitter#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/feeding_nicovideo_update_to_twitter#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Del.icio.usとHatena Bookmarkを同期</title>
		<link>http://diary.asuka.net/sync_between_delicious_and_hatena</link>
		<guid>http://diary.asuka.net/sync_between_delicious_and_hatena</guid>
		<category>WWW</category>
		<pubDate>Thu, 08 Nov 2007 15:11:32 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p><a href="http://del.icio.us/">Del.icio.us</a>と<a href="http://b.hatena.ne.jp/">Hatena Bookmark</a>の両方を使っていてその内容を同期したい場合、<a href="http://search.cpan.org/dist/WebService-SyncSBS-D2H/">WebService::SyncSBS::D2H</a>を利用することで簡単に同期することができる。使い方は <a href="http://search.cpan.org/src/YAPPO/WebService-SyncSBS-D2H-0.03/examples/sbssync.pl">examples/sbssync.pl</a>を見ればOK。</p>
<p>このモジュールのsyncメソッドは同期 (すなわち相互に不足分を複製) するため、私のように Del.icio.us から Hatena Bookmark 方向へのみコピーしたい場合にはそのまま利用できない。そこで、片方向のみ複製するパッチを作ってみた。このパッチを適用すると以下のメソッドが追加され、片方向の同期が可能となる。</p>
<dl>
  <dt>sync_delicious_to_hatena</dt>
  <dd>Reflects newly arrived sites on Del.icio.us in Hatena Bookmark.</dd>
  <dt>sync_d2h</dt>
  <dd>Alias for sync_delicious_to_hatena.</dd>
  <dt>sync_hatena_to_delicious</dt>
  <dd>Reflects newly arrived sites on Hatena Bookmark in Del.icio.us.</dd>
  <dt>sync_h2d</dt>
  <dd>Alias for sync_hatena_to_delicious.</dd>
</dl>
<p><a href="http://yasu.asuka.net/soft/patch/WebService-SyncSBS-D2H-0.03.patch.gz">WebService-SyncSBS-D2H-0.03.patch.gz</a></p>
<p><a href="http://d.hatena.ne.jp/yappo/">Yapooさん</a>にはパッチを送ったので、次バージョンではもっときれいなコードになって入るかも。</p>
</div>
</div>

<hr>
<h4><a href="/sync_between_delicious_and_hatena#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/sync_between_delicious_and_hatena#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>ソーシャルブックマークサービス Del.icio.us</title>
		<link>http://diary.asuka.net/social_bookmark_service_delicious</link>
		<guid>http://diary.asuka.net/social_bookmark_service_delicious</guid>
		<category>WWW</category>
		<pubDate>Mon, 05 Nov 2007 15:54:40 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>最近、外に出しても差し支えないブックマーク情報ををソーシャルブックマーク (SBM; この表記は外国ではあまり使われていないようだ) サービスの<a href="http://del.icio.us/">del.icio.us</a> へ移行した。通常、ブックマークを利用するためにはdel.icio.usサイトを経由する必要があって使いづらいが、Firefoxに<a href="https://addons.mozilla.org/ja/firefox/addon/3615">Del.icio.us Bookmarks</a>を組み込むことでブラウザ標準のブックマークをそのまま置き換えて利用することができる。当初は<a href="http://b.hatena.ne.jp/">はてなブックマーク</a>を検討していたが、ブックマークを置き換えるようなadd-onが見つからなかったため使わなくなってしまった。</p>
<p>Del.icio.usでは利用者層が日本人以外が数多く占めている一方、はてなは日本人がほとんどを占めている。このため、他の利用者の情報も活用したい場合には、はてなの方がよいかもしれない。Del.icio.us Bookmarks のようなaddonが出れば一番良いのだが。</p>
<p>通常のブックマークは階層構造でデータを管理するが、SBMでは "タグ" という概念で管理することが多く、Del.icio.usやはてなブックマークも例外ではない。こうなると "きちんと" タグ付けしたくなるものだが、<a href="http://www.otsune.com/">大常さん</a> によると "タグ付けは適当" らしいので、とりあえずあまり深く考えずに直感的に付けていこうと思う。</p>
<p>私のブックマークは: <a href="http://del.icio.us/hirata.yasuyuki">http://del.icio.us/hirata.yasuyuki</a></p>
</div>
</div>

<hr>
<h4><a href="/social_bookmark_service_delicious#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/social_bookmark_service_delicious#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Meadow + PuTTY でSubversionを使用する方法</title>
		<link>http://diary.asuka.net/using_subversion_with_meadow_and_putty</link>
		<guid>http://diary.asuka.net/using_subversion_with_meadow_and_putty</guid>
		<category>Windows</category>
		<pubDate>Tue, 23 Oct 2007 16:20:24 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>Meadow + PuTTY でSubversionを使用する方法メモ</p>
<h3>方針</h3>
<ul>
  <li>リポジトリはリモートのUnixサーバに置く。</li>
  <li>アクセスはSSH (PuTTY) 経由</li>
  <li>PuTTYは C:\Program Files\PuTTY にインストールしてあると仮定。</li>
  <li>Pagent を利用。</li>
  <li>UTF-8マンセー</li>
  <li>MeadowのSVNインターフェイスはpsvnを使用</li>
</ul>
<h3>Subversionのインストール</h3>
<ol>
  <li><a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">Win32 packages built against Apache 2.0</a>
    または
    <a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100">Win32 packages built against Apache 2.2</a>
    から svn-win32-x.x.x.zip をダウンロード。</li>
  <li>svn-win32-x.x.x.zip を展開し、C:\Program Files\svn へコピーする。</li>
  <li>スタート → 設定 → コントロールパネル → システム → システムの詳細設定 → "詳細設定" タブ → 環境変数(N)... から以下の環境変数を設定する。
    <ul>
      <li>ユーザ環境変数
        <ul>
          <li>APR_ICONV_PATH=C:\Program Files\svn\iconv</li>
          <li>SVN_SSH=C:/Program Files/PuTTY/plink.exe</li>
        </ul>
      </li>
      <li>システム環境変数
        <ul>
          <li>PATH=(すでに設定されていた内容);C:\Program Files\svn\bin</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>スタート → ファイル名を指定して実行(R)... から "regedit" を起動。</li>
  <li>レジストリエディタの HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany キー内に 名前: "log-encoding", 種類: "REG_SZ", データ: "utf-8" を設定する。</li>
  <li>スタート → ファイル名を指定して実行(R)... から "cmd" を起動。</li>
  <li>コマンドプロンプトに "svn" と入力して、正常に実行されることを確認する。
<pre>
C:\Users\yasu&gt;svn
Type 'svn help' for usage.
</pre>
  </li>
</ol>
<h3>レポジトリの作成とテスト</h3>
<ol>
  <li>リモートのUnixホストでレポジトリを作成
<pre>
pluto% svnadmin create /home/yasu/testrepos
</pre>
  </li>
  <li>アクセスできることを確認。
<pre>
C:\Users\yasu\work&gt;mkdir test
C:\Users\yasu\work&gt;echo moemoe &gt; test\test.txt
C:\Users\yasu\work&gt;svn import test svn+ssh://pluto/home/yasu/testrepos/test/ -m "initial import"
Adding         test\test.txt
Committed revision 1.
C:\Users\yasu\work&gt;svn list svn+ssh://pluto/home/yasu/testrepos/test/
test.txt
C:\Users\yasu\work&gt;svn co svn+ssh://pluto/home/yasu/testrepos/test/ localcopy
A    localcopy\test.txt
Checked out revision 1.
C:\Users\yasu\work&gt;cd localcopy
C:\Users\yasu\work\localcopy&gt;svn status
M      test.txt
C:\Users\yasu\work\localcopy&gt;svn commit -m "sakura tan haahaa"
Sending        test.txt
Transmitting file data .
Committed revision 2.
</pre>
  </li>
</ol>
<h3>Meadowの設定</h3>
<ol>
  <li>~/.emacs へ以下の設定を行い、C-x e で評価するか Meadow を再起動する。
<pre>
(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")
</pre>
  </li>
  <li>C:\Users\yasu\work\localcopy\test.txt を開く。</li>
  <li>適当に編集し、C-x C-s で保存。</li>
  <li>C-c C-s でステータスを表示。(変更しているため、"M" (modified) が付いている)<br />
    <img alt src="http://diary.asuka.net/public/image/yasu/200710/meadow_psvn_status.png" width="347" height="240" />
  </li>
  <li>"test.txt" にカーソルを合わせて "=" を押すことで差分を表示することが出来る。<br />
    <img alt src="http://diary.asuka.net/public/image/yasu/200710/meadow_psvn_diff.png" width="347" height="240" />
  </li>
  <li>c を押すとログ入力画面が表示されるので、ログを入力後 C-c C-c でコミットする。<br />
    <img alt src="http://diary.asuka.net/public/image/yasu/200710/meadow_psvn_input_log.png" width="347" height="240" /><br />
    <img alt src="http://diary.asuka.net/public/image/yasu/200710/meadow_psvn_commited.png" width="347" height="240" />
  </li>
</ol>
</div>
</div>

<hr>
<h4><a href="/using_subversion_with_meadow_and_putty#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/using_subversion_with_meadow_and_putty#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>ニコニコ動画をWeb::Scraperでスクレイプ</title>
		<link>http://diary.asuka.net/scraping_nicovideo_with_web_scraper</link>
		<guid>http://diary.asuka.net/scraping_nicovideo_with_web_scraper</guid>
		<category>Perl</category>
		<pubDate>Sat, 06 Oct 2007 12:41:10 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>ニコニコ動画のタグごとにRSSを作るため、最初は以下のように正規表現でゴリゴリと処理していたが、イマイチ綺麗じゃない。</p>
<pre>
while($html =~ m&#123;&lt;p&gt;&lt;a\s+href="watch/(\w+)"&gt;\s*
                 &lt;img\s+.*?src="(.*?)".*?&gt;.*?
                 &lt;strong&gt;((?:\d+分)?\s*\d+秒)&lt;/strong&gt;.*?
                 再生：&lt;strong&gt;([\d,]+)&lt;/strong&gt;.*?
                 コメント：&lt;strong&gt;([\d,]+)&lt;/strong&gt;.*?
                 &lt;a\s+class="video".*?&gt;([^&lt;&gt;]*)&lt;/a&gt;&lt;/p&gt;.*?
                 &lt;p.*?&gt;([^&lt;&gt;]*?)&lt;/p&gt;.*?
                 &lt;p.*?&gt;&lt;strong&gt;([^&lt;&gt;]*?)&lt;/strong&gt;&lt;/p&gt;
                 }gsx) &#123;
    ...
}
</pre>
<p>今回は <a href="http://search.cpan.org/dist/Web-Scraper/">Web::Scraper</a> というモジュールを使ってみた。これは、CSSセレクタやXpathで対象を指定すると、解析した結果を返してくれる。HTMLをパースして情報を取得するときに便利だ。</p>
<p><a href="http://en.yummy.stripper.jp/?eid=555416">どのブロックからデータを取得するのかを大まかに指定してしまって、その中で細かい情報を取得するという段階を踏むと、スクレーピングしやすい</a>とあったので、</p>
<ol>
  <li>"thumb_frm" を class 属性として持つ div 一式を取得</li>
  <li>これらの div について、細かく Xpath 指定で要素を抽出</li>
</ol>
<p>という手順で処理することにした:</p>
<pre>
my $scraper = scraper &#123;
  process('//div[@class="thumb_frm"]',
          'videos[]' =&gt; scraper &#123;
            process('/div/div/div/p/a/img',
                    img_url =&gt; '@src',
                    img_width =&gt; '@width',
                    img_height =&gt;  '@height');
            process('/div/div/p[2]/strong',
                    length_str =&gt; 'TEXT');
            process('/div/div/p[2]/strong[2]',
                    num_played_str =&gt; 'TEXT');
            process('/div/div/p[2]/strong[3]',
                    num_comments_str =&gt; 'TEXT');
            process('/div/div[2]/p/a[@class="video"]',
                    title =&gt; 'TEXT',
                    url =&gt; '@href');
            process('/div/div[2]/p[2]',
                    desc =&gt; 'TEXT');
            process('/div/div[2]/div/p/strong',
                    comment =&gt; 'TEXT');
          });
};
</pre>
<p>作った結果: <a href="http://yasu.asuka.net/rss/nicovideo/">ニコニコ動画 俺様用RSS</a></p>
<p>ニコニコ動画アクセス関係は WWW::NicoVideo として分離させているけど、需要あるかな?</p>
<ins>
<p><a href="http://diary.asuka.net/perl_interface_to_nicovideo">ニコニコ動画Perlインターフェイス (WWW::NicoVideo) を公開</a>しました。</p>
</ins>
</div>
</div>

<hr>
<h4><a href="/scraping_nicovideo_with_web_scraper#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/scraping_nicovideo_with_web_scraper#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Firefoxのアドオン</title>
		<link>http://diary.asuka.net/firefox_addons</link>
		<guid>http://diary.asuka.net/firefox_addons</guid>
		<category>Firefox</category>
		<pubDate>Thu, 04 Oct 2007 13:51:20 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>Firefoxの<a href="http://www.mozilla-japan.org/addons/firefox/extensions/">アドオン</a>によって様々な機能を追加することができる。最近まであまり活用していなかったがが、いろいろと調べて最終的に使うことになったのは以下の通り。再インストール時のときのため、自分用にメモ。</p>
<dl>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/573">Add N Edit Cookies</a></dt>
  <dd>クッキー編集機能</dd>
  <dt><a href="http://roachfiend.com/archives/2005/03/03/allow-right-click/">Allow Right-Click</a></dt>
  <dd>右クリックを禁止するアホなサイト対策</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/240/">Context Search</a></dt>
  <dd>選択した文字列をサーチエンジンで検索</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/2190">dragdropupload</a></dt>
  <dd>ファイルアップロード領域にドラッグ・ドロップで入力する</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/1843">Firebug</a></dt>
  <dd>デバッグ用</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/748">Greasemonkey</a></dt>
  <dd>サイトごとにユーザスクリプトを適用する</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/1419">IE Tab</a></dt>
  <dd>IEのレンダリングエンジンをFirefoxに組み込む</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/636">PDF Download</a></dt>
  <dd>PDFをインラインで表示せず、ダウンロードして表示</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/1933">Popup ALT Attribute</a></dt>
  <dd>Alt属性に指定された文字列をポップアップさせる (本当はtitle属性を使うのが正しいのだが)</dd>
  <dt><a href="http://himag.blog26.fc2.com/blog-entry-234.html">Sage++</a></dt>
  <dd>フィードリーダ</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/2108">Stylish</a></dt>
  <dd>サイトごとにユーザCSSを適用する</dd>
</dl>
</div>
</div>

<hr>
<h4><a href="/firefox_addons#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/firefox_addons#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Firefoxで使えるフィードリーダ</title>
		<link>http://diary.asuka.net/firefox_feed_readers</link>
		<guid>http://diary.asuka.net/firefox_feed_readers</guid>
		<category>Firefox</category>
		<pubDate>Wed, 03 Oct 2007 13:23:29 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>私がフィードリーダに求める機能は以下の4点。</p>
<ul>
  <li>サイト一覧、サイトの記事タイトル一覧、内容表示の3ペイン方式であること。</li>
  <li>フィード情報を1ページにまとめて表示 (フィードに含まれる記事一覧を内容も含めて表示) してほしい。(サイトによってはdescriptionなどに内容がすべて入っているため。)</li>
  <li>内容表示はウェブサイトを表示可能であること。(フィードに完全なdescriptionが含まれない場合はウェブサイトを表示する必要があるため。別ウインドウ・タブで表示するのは面倒。)</li>
  <li>できれば favicon に対応してほしい。</li>
</ul>
<p>上記の観点を踏まえて、Firefoxで利用可能なフィード (RSS/ATOM) リーダを複数試してみた。</p>
<dl>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/77">Sage</a></dt>
  <dd>タイプ: 3ペイン (サイドバー2ペイン)<br />
      フィードをまとめて表示: Yes<br />
      内容としてサイトを表示: Yes<br />
      Favicon対応: No<br />
      データ: ブックマーク<br />
      Faviconに対応していないという欠点はあるが、それ以外の機能はすべて実現可能。URL欄にランダム文字列のディレクトリ名を含んだフルパス名が出るのがイマイチ。(セキュリティ的な意味で)</dd>
  <dt><a href="http://himag.blog26.fc2.com/blog-entry-234.html">Sage++</a></dt>
  <dd>タイプ: 3ペイン (サイドバー2ペイン)<br />
      フィードをまとめて表示: Yes<br />
      内容としてサイトを表示: Yes<br />
      Favicon対応: No<br />
      データ: ブックマーク<br />
      Sageの改造版。広告ブロック機能があるので最終的にこれを利用することにした。</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/4578">Brief</a></dt>
  <dd>タイプ: 2ペイン (ペイン分割)<br />
      フィードをまとめて表示: Yes<br />
      内容としてサイトを表示: Yes<br />
      Favicon対応: Yes<br />
      データ: ブックマーク (ライブブックマーク)<br />
      タイトル (とdescription) 一覧とウェブサイトを同一ペイン内で切り替えるため、私にとっては使いづらい。フィードに含まれる内容だけを読むのであれば良いと思う。</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/424">Wizz RSS News Reader</a></dt>
  <dd>タイプ: 3/4ペイン (サイドバー 2/3ペイン) <br />
      フィードをまとめて表示: Yes<br />
      内容としてサイトを表示: Yes<br />
      Favicon対応: (Yes)<br />
      データ: ブックマーク<br />
      Sageと似ているが、機能がかなり多い。必要な機能は網羅しているが、デザインがあまり好きになれない。Faviconはフィードを提供するサイトのものが使われるのが残念。</dd>
  <dt><a href="https://addons.mozilla.org/ja/firefox/addon/629">NewsFox</a></dt>
  <dd>タイプ: 3ペイン (ペイン分割)<br />
      フィードをまとめて表示: Yes<br />
      内容としてサイトを表示: Yes<br />
      Favicon対応: Yes<br />
      データ: 独自?<br />
      3ペイン分割タイプで、OutlookやThunderbirdと似た画面で利用することができる。フィードすべてを再読み込みさせるとFirefoxが応答なしになる、フィードの登録インターフェイスが使いづらいという欠点はあるが、購読するフィードが少ないなら良いと思う。</dd>
</dl>
<p>Sage++とWizz RSSのどちらにするか迷ったが、広告ブロック機能がある点と、デザインが好みである点からSage++を利用することとした。(広告自体は嫌いではなくKasperskyの広告ブロック機能も無効にしてあるが、記事一覧に広告があるのは好きではないため。) 上記の欠点が修正されれば Brief や NewsFox に乗り換えるかもしれない。</p>
<p>Sage++ではキーバインドが変更されているため、about:config で下記内容に変更。</p>
<pre>
sage.key.focusSidebar = X
sage.key.focusSidebar.modifiers = alt
sage.key.openSidebar = Z
sage.key.openSidebar.modifiers = alt
</pre>
</div>
</div>

<hr>
<h4><a href="/firefox_feed_readers#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/firefox_feed_readers#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>メールアドレスのチェック・解析</title>
		<link>http://diary.asuka.net/perl_mail_address_parsing_and_validation</link>
		<guid>http://diary.asuka.net/perl_mail_address_parsing_and_validation</guid>
		<category>Perl</category>
		<pubDate>Mon, 13 Aug 2007 14:57:38 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<h3>メールアドレスが正しい形式であるか確認する</h3>
<p>入力されたメールアドレスの形式を確認するため、</p>
<pre>
if(not $mail =~ /^[a-z0-9]+@[a-z0-9-]+(?:\.[a-z0-9-]+)+$/) &#123;
  die "invalid address";
}
</pre>
<p>のようなコードを書くべきではない。メールアドレスというものはあなたが考えている以上に複雑で、このような単純なコードでチェックし切ることはできない。車輪の再発明をせず、次のように <a href="http://search.cpan.org/~rjbs/Email-Valid/lib/Email/Valid.pm">Email::Valid</a> を利用しよう。これはDNSのMXレコードのチェックなども可能である。</p>
<pre>
use Email::Valid;
if(not Email::Valid-&gt;address(-address =&gt; $mail,
                             -mxcheck =&gt; 1,
                             -fqdn =&gt; 1) &#123;
  die "invalid address";
}
</pre>
<h3>RFC 822 (2822) 形式のアドレスをパースする</h3>
<p>メールのヘッダ中に含まれるアドレスはさまざまな形式を取るため、これを自力で解析するのは骨が折れる。これもモジュールを利用することで車輪の再発明を避けることができる。以下は <a href="http://search.cpan.org/~rjbs/Email-Address/lib/Email/Address.pm">Email::Address</a> を利用した例である。(同様のモジュールとしては <a href="http://search.cpan.org/~markov/MailTools/Mail/Address.pm">Mail::Address</a> があり、若干インターフェイスが異なる。)<p>
<pre>
use Email::Address;
my @addrs = Email::Address-&gt;parse(
  'HIRATA Yasuyuki &lt;yasu@example.com&gt;, ' .
  'yasu@example.net (HIRATA Yasuyuki), ' .
  '"sakura tan haahaa"@example.org' # *VALID* RFC 2822 address
);
foreach (@addrs) &#123;
  print $_-&gt;address, "\n";
}
</pre>
</div>
</div>

<hr>
<h4><a href="/perl_mail_address_parsing_and_validation#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/perl_mail_address_parsing_and_validation#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>mod_rewrite の小技</title>
		<link>http://diary.asuka.net/apache_mod_rewrite_tips</link>
		<guid>http://diary.asuka.net/apache_mod_rewrite_tips</guid>
		<category>Apache</category>
		<pubDate>Sun, 12 Aug 2007 15:22:01 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<h3>ループ処理</h3>
<p><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html">mod_rewrite</a> でループ処理を行うには、[N] (<em>n</em>ext) フラグを利用する。たとえば、/hoge/1/bar/2/baz/3/ を /hoge/index.cgi?foo=1&amp;bar=2&amp;baz=3 としたい (その際、パラメータの個数が不定) 場合、下記の通り記述する。"QSA" (<em>q</em>uery <em>s</em>tring <em>a</em>ppend) フラグは、書き換え後の QUERY_STRING 部分のみ "追加" の扱いとする。</p>
<pre>
RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
# Rule 1:
RewriteRule ^(/hoge/.*/)([^/]+)/([^/]+)/$ $1?$2=$3&amp;path=$1 [QSA,N]
# Rule 2:
RewriteRule ^/hoge/([^/]+)/$ /hoge/index.cgi?foo=$1 [QSA]
</pre>
<p>処理の流れは以下の通り。</p>
<ol>
  <li>path = "/hoge/1/bar/2/baz/3/", QUERY_STRING="" → Rule 1</li>
  <li>path = "/hoge/1/bar/2/", QUERY_STRING="baz=3" → Rule 1</li>
  <li>path = "/hoge/1/", QUERY_STRING="bar=2&baz=3" → Rule 2</li>
  <li>path = "/hoge/index.cgi", QUERY_STRING="foo=1&bar=2&baz=3"</li>
</ol>
<h3>日本語のファイル名に見せかけてSEO</h3>
<p>ファイル名はSEOを考慮すると日本語 (UTF-8) で付けた方が良いが、日本語のファイル名はUnix上で扱いづらいという欠点がある。mod_rewrite を利用することで URL path中の日本語文字列を任意のファイル名 (英数字) にマッピングすることができる。</p>
<ol>
  <li>httpd.conf に以下の行を追加
<pre>
RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
RewriteMap foo_kanji_ascii txt:/www/etc/map/naiyo_kanji_ascii.txt
RewriteRule ^/(.*[^!-~]+.*) /www/htdocs/$&#123;naiyo_kanji_ascii:$1}.html
</pre>
  </li>
  <li>/www/etc/map/naiyo_kanji_ascii.txt に UTF-8 で以下の内容を記載。
<pre>
萌え	moe
</pre>
  </li>
  <li>httpd の再起動。</li>
  <li>http://www.example.com/%E8%90%8C%E3%81%88 へアクセスすると /www/htdocs/moe.html の内容が表示される。</li>
</ol>
<p>大規模に書き換えを行う場合には、性能上の観点からテキストファイルではなくDBMファイルで用意することが望ましい。</p>
</div>
</div>

<hr>
<h4><a href="/apache_mod_rewrite_tips#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/apache_mod_rewrite_tips#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>国別DNSBL with rbldnsd</title>
		<link>http://diary.asuka.net/country_rbl_with_rdbdnsd</link>
		<guid>http://diary.asuka.net/country_rbl_with_rdbdnsd</guid>
		<category>spam</category>
		<pubDate>Sat, 28 Jul 2007 23:39:09 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>以前、<a href="http://diary.asuka.net/how_to_reject_mail_from_specific_countries">特定の国からのメールをすべて拒否</a>で、Postfix のみに利用できる方法を解説したが、他のソフト (Apache + mod_access_rbl や CGIプログラムなど) から利用可能にするには、DNSBLとして利用できる形態が望ましい。(DNSBLについては、<a href="http://diary.asuka.net/apache_mod_access_rbl">Apache 1.3 + mod_access_rbl</a> を参照。)</p>
<p>DNSBLの運用にBINDを利用することも可能ではあるが、ある程度規模があるDNSBLを運用する場合には設定ファイルの再読み込みに時間がかかるなどの問題があるため、ここでは rbldnsd を利用する方法を解説する。</p>
<h3>導入するべきソフト</h3>
<ul>
  <li>dns/rbldnsd</li>
</ul>
<h3>方針</h3>
<p>rbldnsdは 127.0.0.1:10053 で待ち受けする。BINDは特定のゾーン (rbldnsd.local) のクエリのみ rbldnsd を参照する。</p>
<pre>
         +------+     +---------+
query --&gt;| *.53 | --&gt; | L:10053 |
         | BIND |     | rbldnsd |
         +------+     +---------+
</pre>
<h3>設定方法</h3>
<ol>
  <li>設定ファイルの作成・修正
<pre>
# <kbd>mkdir /usr/local/etc/rbldnsd</kbd>
# <kbd>cd /usr/local/etc/rbldnsd</kbd>
# <kbd>vi rbldnsd.rbl</kbd>
# <kbd>vi /etc/namedb/named.conf</kbd>
# <kbd>vi /etc/rc.conf</kbd>
# <kbd>/usr/local/etc/rc.d/rbldnsd.sh start</kbd>
</pre>
    rbldnsd.rbl の記載内容は以下の通り (実際のデータの一部):
<pre>
$DATASET ip4set:ad ad
:127.0.0.1:Andorra
194.158.64.0-194.158.95.255
85.94.160.0-85.94.191.255
91.187.64.0-91.187.95.255
$DATASET ip4set:ae ae
:127.0.0.1:United Arab Emirates
194.170.0.0-194.170.255.255
195.229.0.0-195.229.255.255
213.132.32.0-213.132.63.255
</pre>
    named.confの追加内容は以下の通り:
<pre>
zone "rbldnsd.local" &#123;
  type forward;
  forward first;
  forwarders &#123; 127.0.0.1 port 10053; };
};
</pre>
    rc.confの追加内容は以下の通り:
<pre>
rbldnsd_enable="YES"
rbldnsd_flags="-u bind:bind -r /usr/local/etc/rbldnsd -b 127.0.0.1/10053 -c 0 rbldnsd.net:combined:rbldnsd.rbl"
</pre>
  </li>
  <li>194.158.64.0 は Andorra に割り当てられたアドレスなので、"ad.rbldnsd.local" にはレコードが存在し、"jp.rbldnsd.local" には存在しないことを確認する。
<pre>
% <kbd>host 0.64.158.194.ad.rbldnsd.local</kbd>
0.64.158.194.ad.rbldnsd.local has address 127.0.0.1
% <kbd>host -t txt 0.64.158.194.ad.rbldnsd.local</kbd>
0.64.158.194.ad.rbldnsd.local descriptive text "Andorra"
% <kbd>host 0.64.158.194.jp.rbldnsd.local</kbd>
Host 0.64.158.194.jp.rbldnsd.local not found: 3(NXDOMAIN)
</pre>
  </li>
  <li>外部からの利用を許したくない場合、ゾーン設定に <code>allow-query</code> を追加すればよい。(以下の例は127.0.0.1, 192.168.1.0/24 のみを許可する場合。)
<pre>
allow-query &#123; 127.0.0.1; 192.168.1.0/24; };
</pre>
  </li>
  <li>必要に応じて Apache や Postfix などの設定を行う。</li>
</ol>
<p>とりあえず、試験的に <var>countrycode</var>.dnsacl.net を立ち上げてみた。たとえば、kr.dnsacl.net は韓国のアドレスをブロックするDNSBLになっている。("acl" は access control list; ホワイトリストにも利用できるため。)</p>
</div>
</div>

<hr>
<h4><a href="/country_rbl_with_rdbdnsd#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/country_rbl_with_rdbdnsd#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>画像への直接リンクを防ぐ (補足)</title>
		<link>http://diary.asuka.net/apache_prevent_deep_link_to_images_supplement</link>
		<guid>http://diary.asuka.net/apache_prevent_deep_link_to_images_supplement</guid>
		<category>Apache</category>
		<pubDate>Sat, 28 Jul 2007 14:45:01 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p><a href="http://diary.asuka.net/apache_prevent_deep_link_to_images">画像への直接リンクを防ぐ</a> (2007/07/23)
の補足。</p>
<p><a href="http://www.ietf.org/rfc/rfc2616.txt" title="Hypertext Transfer Protocol -- HTTP/1.1">RFC 2616</a>
で Referer: は以下の通り定義されており、絶対URIの他、相対URIを含めることも許されている。</p>
<blockquote>
<pre>
Referer = "Referer" ":" ( absoluteURI | relativeURI )
</pre>
<p><cite><a href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616: Hypertext Transfer Protocol (HTTP/1.1), 14.36 Referer</a></cite></p>
</blockquote>
<p>したがって、
<pre>
RewriteCond %&#123;HTTP_REFERER} !^$
RewriteCond %&#123;HTTP_REFERER} !^http://www\.example\.jp/ [NC]
RewriteCond %&#123;REQUEST_URI} !^/tmp/eroero\.gif$
RewriteRule \.(jpg|png|gif)$ http://www.example.jp/tmp/eroero.gif [R,NC]
</pre>
<p>は、下記の通りとするべきである。</p>
<pre>
<em>RewriteCond %&#123;HTTP_REFERER} ^http://</em>
RewriteCond %&#123;HTTP_REFERER} !^http://www\.example\.jp/ [NC]
RewriteCond %&#123;REQUEST_URI} !^/tmp/eroero\.gif$
RewriteRule \.(jpg|png|gif)$ http://www.example.jp/tmp/eroero.gif [R,NC]
</pre>
<p>なお、(アンチウイルスソフトによっては) Referer: に blocked by XXXX とかいう訳のわからん文字列を突っ込んできます
との指摘があったが、今回の修正で救われる。とはいえ、これはRFCに違反するそのベンダと利用者の責任であるため、積極的に救う必要は無いだろう。</p>
</div>
</div>

<hr>
<h4><a href="/apache_prevent_deep_link_to_images_supplement#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/apache_prevent_deep_link_to_images_supplement#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>外国人参政権</title>
		<link>http://diary.asuka.net/foreigners_suffrage</link>
		<guid>http://diary.asuka.net/foreigners_suffrage</guid>
		<category>未分類</category>
		<pubDate>Sat, 28 Jul 2007 13:59:01 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<blockquote>
<p>でも、在日3世の僕には選挙権が無い。両親も自分も名古屋育ち。日常生活は日本語。日本人とほとんど同じ生活をしている。在日は今では4世までいて、ずっと日本人と一緒に暮らしてきた。戦後の日本復旧を一緒に支えてきたという面もあると思うし、そろそろ信頼して参政権を与えて欲しい。
<cite><a href="http://mytown.asahi.com/aichi/news.php?k_id=24000240707270003">"今でも遠い参政権", 金原 大志, 2007/07/27 朝日新聞朝刊 "私もひとこと 07参院選"</a></cite></p>
</blockquote>
<p>そもそも参政権というものは、<em>国民のみが持つ重要な権利</em>である。参政権を望むのであれば、帰化して日本国籍を取得すれば良いのだ。韓国人として "日本" という運命共同体の外から国政へ関わりたいというのは、<em>我侭</em>でしかない。自国民と外国人は対等ではないのは当然のことで、これは <em>"差別" ではなく "区別"</em> である。</p>
<p>なお、帰化申請全体の数%程度は不許可となるが、帰化の判断は各国がそれぞれ自由に決定するものなのでこれは諦めてもらうしかないだろう。もっとも、今回のようなケースで不許可になることはまず無いと思うが。</p>
</div>
</div>

<hr>
<h4><a href="/foreigners_suffrage#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/foreigners_suffrage#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>システム管理者の日</title>
		<link>http://diary.asuka.net/system_administrator_appreciation_day</link>
		<guid>http://diary.asuka.net/system_administrator_appreciation_day</guid>
		<category>仕事</category>
		<pubDate>Fri, 27 Jul 2007 14:52:47 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>会社に行ったら、システム管理・運用業務に関わる人全員に「今日は<a href="http://www.sysadminday.com/">システム管理者の日</a>。いつもありがとう」的なカードが配られた。</p>
<p>とかくシステム管理・運用業務というものは、具体的な成果というものが出にくく表立って評価されることは多くないもの。そんな中、このように粋な心遣いをしてくれた担当役員に感謝。</p>
<p>この日記でピンと来た人は、同じ現場の人です。:-)</p>
</div>
</div>

<hr>
<h4><a href="/system_administrator_appreciation_day#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/system_administrator_appreciation_day#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>バックトレース付きで死ぬ方法</title>
		<link>http://diary.asuka.net/perl_die_with_backtrace</link>
		<guid>http://diary.asuka.net/perl_die_with_backtrace</guid>
		<category>Perl</category>
		<pubDate>Thu, 26 Jul 2007 11:02:24 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>Javaのようにバックトレース付きで死ぬ方法。</p>
<pre>
# confess.pl
use Carp qw[confess];
require "confess2.pl";
foo();
sub foo &#123; bar() }
</pre>
<pre>
# confess2.pl
sub bar &#123; baz() }
sub baz &#123; zot() }
sub zot &#123; confess "moe" }
1;
</pre>
<p>実行結果:</p>
<pre>
% <kbd>perl confess.pl</kbd>
moe at confess2.pl line 3
        main::zot() called at confess2.pl line 2
        main::baz() called at confess2.pl line 1
        main::bar() called at confess.pl line 4
        main::foo() called at confess.pl line 3
</pre>
</div>
</div>

<hr>
<h4><a href="/perl_die_with_backtrace#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/perl_die_with_backtrace#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Firefox 2.0.0.5のパスワードマネージャにセキュリティ脆弱性</title>
		<link>http://diary.asuka.net/firefox_2.0.0.5_password_manager_security_hole</link>
		<guid>http://diary.asuka.net/firefox_2.0.0.5_password_manager_security_hole</guid>
		<category>セキュリティ</category>
		<pubDate>Wed, 25 Jul 2007 15:41:45 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>元ネタ: <a href="http://www.heise-security.co.uk/news/93018">Holes in Firefox password manager</a>
(via <a href="http://opentechpress.jp/security/article.pl?sid=07/07/25/021252">Open Tech Press: Firefox 2.0.0.5にパスワードが盗まれる脆弱性</a>)
<p>Firefox 2.0.0.5でパスワードマネージャのセキュリティホールが修正されたが、危険性が残ったままであり、パスワードが盗み取られる可能性があるとのこと。</p>
<p>Firefoxには (ユーザが許可すれば) 一度入力されたパスワードは次回訪問時に自動的に入力されるが、これが同一ページ以外でも同一のサーバ上に同様のフォームがあれば機能してしまう。</p>
<p>ある会員制のサイトに利用者がそのサーバ上にウェブページを作成する機能を持つ場合、攻撃者は偽のフォームを設置することができる。この偽フォームの送信先に関わらず、そのページにサイトの会員がアクセスした時点で自動的に (IDと) パスワードが入力された状態になる。あとはJavaScriptでフォームの情報にアクセスすることでパスワード等を得られる。</p>
<p>JavaScriptを利用しない場合でも、<abbr title="cascading style sheet">CSS</abbr> で</p>
<pre>
input &#123;
  display: none;
}
</pre>
<p>とした上で、<code>&lt;input type="submit" value="さくらたんのエロ画像を表示"/&gt;</code> とするだけで引っかかってくれそうな予感。もしくは、画面いっぱいの Submit ボタンを設置するとか。</p>
</div>
</div>

<hr>
<h4><a href="/firefox_2.0.0.5_password_manager_security_hole#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/firefox_2.0.0.5_password_manager_security_hole#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>Perl 5.9.5変更点 (の一部)</title>
		<link>http://diary.asuka.net/what_is_new_for_perl_v5.9.5</link>
		<guid>http://diary.asuka.net/what_is_new_for_perl_v5.9.5</guid>
		<category>Perl</category>
		<pubDate>Wed, 25 Jul 2007 12:32:32 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>Perl v5.9.4 - v5.9.5間の変更点で気になったところをメモ。(元ネタはv5.9.5のperldelta) v5.9.x は開発版のため、安定版で利用できるまではしばらくかかる。(v5.10 で実装?)</p>
<h3>非互換</h3>
<dl>
  <dt>汚染とprintf</dt>
  <dd>Taint mode (汚染チェックモード) で動作する場合、printf/sprintfの書式指定文字列に汚染されたデータはNG。</dd>
  <dt>undefとシグナルハンドラ</dt>
  <dd>"<code>undef $SIG&#123;FOO}</code>", "<code>delete $SIG&#123;FOO}"</code> は "DEFAULT" の代入と等価になった。</dd>
  <dt>仮想ハッシュは取り除かれた</dt>
  <dd>仮想ハッシュ (pseudo hash) って何だ? と思ったら配列をハッシュっぽくアクセスする機構らしい。いらないな。</dd>
  <dt>バイトコードコンパイラと perlcc は削除</dt>
  <dd>信頼性と人的資源の問題らしい。</dd>
</dl>
<h3>正規表現</h3>
<dl>
  <dt>再帰的なパタン</dt>
  <dd>"<code>(??&#123;})</code>" 構文を使用せず、再帰的なパタンを記述可能になる。後方参照して使えるので嬉しい。入れ子になった対応する山括弧にマッチさせるには下記の通り:
<pre>
/
 ^                      # 行の開始
 (                      # 取込領域1の開始
    &lt;                   #   開き山括弧にマッチ
    (?:                 #   以下のいずれかにマッチ:
        (?&gt;             #     このグループ内でバックトラックを発生させない
            [^&lt;&gt;]+      #       山括弧以外の文字が1文字以上
        )               #     無バックトラックグループの終了
    |                   #     ... または ...
        (?1)            #     取込領域1の呼び出して再実行
    )*                  #   0回以上。
    &gt;                   #   閉じ山括弧にマッチ
 )                      # 取込領域1の終了
 $                      # 行の終了
/x
</pre>
        PCREの実装とは少々異なるので注意とのこと。</dd>
      <dt>名前付きの取込領域</dt>
      <dd><var>$1</var> のように数字でアクセスする時代は終わった。<code>(?&lt;<var>name</var>&gt;<var>regex</var>)</code> でマッチさせた部分は <code>\k&lt;<var>name</var>&gt;</code> または <code>$+&#123;<var>name</var>}</code> で参照することは出来る。例:
<pre>
s/(?&lt;letter&gt;.)\k&lt;letter&gt;/$+&#123;letter}/g
</pre>
      同一の取込領域名を複数個所に付けた場合、<var>%+</var> の代わりに <var>%-</var> を利用する。これは値として配列へのリファレンスをもち、その配列にはマッチした文字列がそれぞれ含まれている。</dd>
  </dd>
</dl>
</div>
</div>

<hr>
<h4><a href="/what_is_new_for_perl_v5.9.5#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/what_is_new_for_perl_v5.9.5#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>MSIME補完用辞書</title>
		<link>http://diary.asuka.net/windows_msime_additional_dic</link>
		<guid>http://diary.asuka.net/windows_msime_additional_dic</guid>
		<category>Windows</category>
		<pubDate>Tue, 24 Jul 2007 15:00:12 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>標準のMSIME辞書では "支那" や "日本海" などを変換することが出来ない。(後者は "日本" + "海" で候補が出る。) これらの単語が変換できず、困る場合には<a href="http://kan-chan.stbbs.net/word/pc/ngword.html">自主規制語補完辞書</a>を利用して登録すれば良い。</p>
<ol>
  <li>言語バーから "ツール" → "辞書ツール" を起動。</li>
  <li>"ツール(T)" → "テキストファイルからの登録(T)..." を選択。</li>
  <li>ダウンロードしたファイルを選択。</li>
</ol>
</div>
</div>

<hr>
<h4><a href="/windows_msime_additional_dic#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/windows_msime_additional_dic#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
	<item>
		<title>favicon.icoの作成</title>
		<link>http://diary.asuka.net/www_favicon</link>
		<guid>http://diary.asuka.net/www_favicon</guid>
		<category>WWW</category>
		<pubDate>Tue, 24 Jul 2007 07:22:35 GMT</pubDate>
		<author>HIRATA Yasuyuki</author>
		<description><![CDATA[<div class="section">
<div class="entry_body entry-body">
<p>ウェブサイトにアイコンを関連付ける機能は、元々 Internet Explorer に実装されていたものだが、今では多くのブラウザが対応している。</p>
<h3>アイコンファイルの作成</h3>
<p>Windows Iconファイルを作成するソフトが数多くあるが、ここでは手軽に使える <a href="http://wizard.ae.krakow.pl/~jb/toico/">toico</a> を紹介する。インストールは難しいこと無いので普通に。標準的な make(1) には対応しないため、GNU make を利用する必要がある。</p>
<pre>
% <kbd>wget <a href="http://wizard.ae.krakow.pl/~jb/toico/">http://wizard.ae.krakow.pl/~jb/toico/toico-0.18.tar.gz</a></kbd>
% <kbd>tar xvfz toico-0.18.tar.gz</kbd>
% <kbd>cd toico-0.18</kbd>
% <kbd>gmake</kbd>
# <kbd>gmake install</kbd>
</pre>
<p>アイコンサイズは、ブラウザ用 (16x16)、デスクトップ用 (32x32) などがあるが、環境によっては 48x48, 64x64, 128x128 が利用されることもあるので、余裕があればそれらのサイズでも作成しておくと良いだろう。(ただし、128x128 は滅多に使われず、サイズも大きくなりすぎるため、64x64 までが現実的である。)</p>
<p>icon-16x16.png, icon-32x32.png, icon-48x48.png から favicon.ico を作成するには以下の通り実行すればよい。</p>
<pre>
% <kbd>toico -o favicon.ico icon-16x16.png icon-32x32.png icon-48x48.png</kbd>
</pre>
<ins>
<p>FreeBSDには graphics/png2ico があったようだ。</p>
</ins>
<h3>アイコンファイルの指定</h3>
<p>この機能により、Windows Icon ファイルを /favicon.ico (ウェブサイトの最上位ディレクトリ) でアクセスされる位置に配置するか、HTMLファイル中に以下の指定を行うことでURL欄やブックマークに表示することができる。混乱を避けるため、ファイルは常に /favicon.ico として、link による指定も同時に行うのが良いだろう。</p>
<pre>
&lt;link rel="shortcut icon" href="/favicon.ico"&gt;
</pre>
</div>
</div>

<hr>
<h4><a href="/www_favicon#c">■コメント（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
<h4><a href="/www_favicon#tb">■トラックバック（0件）</a></h4>
<div style="margin-left: 1em;">
</div>
]]></description>
	</item>
</channel>
</rss>
