| メイン | 次のページ

IT アーカイブ

2008年09月21日

VistaでFax送信

実家にうちまでの地図を送ろうとグーグルマップを検索して、それをPCでFAX送信しようと思ったら、なんとVistaにはFax機能が付いてなかった!

知らなかった・・・

http://www.microsoft.com/japan/windows/products/windowsvista/features/details/faxscan.mspx

http://windowshelp.microsoft.com/Windows/ja-JP/Help/3085a2d0-8f36-4993-bc5e-4336402536761041.mspx

XP以前には標準機能として搭載されていたのに。
PCに内蔵されているモデムはFAX対応なんだけれど、OSのVistaのHomeエディションにはFAX送信ソフトウェアがインストールされていない。
Vistaからは(わざわざ)つけないようにしたみたい。。。
businessやultimateエディションには付いているみたい。。。

なんとケチくさい。いじわるな。

しょーがないので、まいと~く FAX 8体験版をダウンロードしてインストールした。
30日は無料で使えるらしい。
これで無事FAX送信できました。
まいと~くは昔からあるFAX送受信ソフトウェアで使いやすく良くできています。
そんなに高くないし、買っても良いかもなー

2008年09月09日

ubiquity + perl + php

ubiquity で CPAN や perldoc を検索して表示したいなぁ~と思いました。
で、ググってみたらあった。

・Perl Ubiquity Commands
http://www.grok.in/ubiquity/perl.html

コマンドラインで cpan HTML::Template を実行すると、別タブに CPAN 検索結果が表示されます。
perldoc HTML::Template::Compiled を実行すると、別タブに perldoc を表示します。

これは便利だわ~


と思ったので、上記のコードを参考に PHP の pear 検索コマンドとマニュアル検索コマンドを作ってみました。
上記の perl コマンドをインストールした上で、command-editor へ下記のコマンドを入力します。
perl コマンドの makeSearchCommand() を使っているので必ずセットでコマンドを登録してください。


makeSearchCommand({
  name: "pear",
  url: "http://pear.php.net/search.php?q={QUERY}&in=packages",
  description: "Searchers http://pear.php.net/ for the specified pear packages.",
})

makeSearchCommand({
  name: "php",
  url: "http://jp.php.net/manual-lookup.php?pattern={QUERY}",
  description: "Searchers http://jp.php.net/manual/ja/funcref.php for the specified php functions.",
})


コマンドラインで pear Net_IMAP を入力すると、別タブで pear 検索結果を表示します。
php preg_replace を入力すると、別タブで PHP 日本語マニュアルの関数リファレンスを表示します。
結構使えます。

2008年09月03日

ubiquity + wassr

ubiquity のコマンドを自分で作ってみたいな~と思い、自分で作ってみました。
Wassr へヒトコト投稿するコマンド。
既に誰か作っていそうだったけれど、自分でも作ってみたかったので、探さずに自分で書きました。

Twitter の Status Update コマンド(ヒトコト投稿みたいなもの)が公開されていたので、 それを参考に。
といっても殆どコピペだけれどw

下記を ubiquity の command-editor で入力。


// max of 140 chars is recommended, but it really allows 255
const WASSR_STATUS_MAXLEN = 255;

CmdUtils.CreateCommand({
  name: "wassr-say",
  homepage: "http://wassr.jp/",
  icon: "http://api.wassr.jp/favicon.ico",
  author: { name: "hagy", homepage: "http://www.hagyroom.com/" },
  license: "Public Domain",
  description: "Wassr/ubiquity ヒトコト/ステータス更新",
  takes: { parameter: noun_arb_text },

  preview: function(previewBlock, statusText) {
    var previewTemplate = "Updates your Wassr status to: <br/>" +      
                          "<b>${status}</b><br /><br />" +
                          "Characters remaining: <b>${chars}</b>";
    var truncateTemplate = "<br />The last <b>${truncate}</b> " +
                           "characters will be truncated!";
    var previewData = {
      status: statusText.text,
      chars: WASSR_STATUS_MAXLEN - statusText.text.length
    };
     
    var previewHTML = CmdUtils.renderTemplate(previewTemplate,
                                                    previewData);
   
    if(previewData.chars < 0) {
      var truncateData = {
        truncate: 0 - previewData.chars
      };
     
      previewHTML += CmdUtils.renderTemplate(truncateTemplate,
                                                   truncateData);
    }
   
    previewBlock.innerHTML = previewHTML;
  },

  execute: function(statusText) {
    if(statusText.text.length < 1) {
      displayMessage("Wassr requires a status to be entered");
      return;
    }
   
    var updateUrl = "http://api.wassr.jp/statuses/update.json";
    var updateParams = {
      source: "ubiquity",
      status: statusText.text
    };
   
    jQuery.ajax({
      type: "POST",
      url: updateUrl,
      data: updateParams,
      dataType: "json",
      error: function() {
        displayMessage("Wassr error - status not updated");
      },
      success: function() {
        displayMessage("Wassr status updated");
      }
    });
  }
});


jQuery で Ajax を使って Wassr API を JSON で呼び出してヒトコト更新をしています。

[Ctrl + Space] コマンドラインで、wassr-say Hello! で wassr へ「Hello!」というヒトコトが投稿されます。
初回投稿時に Basic 認証を要求されます。自分のログインIDとパスワードでログインすると以降はブラウザを閉じるまでヒトコトを投稿できるようになります。
Wassr の認証API を使えば、Basic 認証なしで投稿できるようになりますが、上記コードは認証API は使っていません。使うには個々でシグネチャを取得して設定しないといけません。


これ投稿するだけで見ることはできないので、見るためには結局 Wassr のページを開かないといけないので、実用性はあんまりありませんw

続きを読む "ubiquity + wassr" »

2008年09月02日

ubiquity

噂のubiquityを入れてみました。
ubiquity の動画見ると、すげ~~と思う。
google map を gmail へ貼り付けるところとか、かっこいい~。

・ブラウザの新境地? Ubiquityが変える衝撃のブラウザ体験

http://www.itmedia.co.jp/enterprise/articles/0808/31/news003.html

これ、ボクは最初、mozilla のエンジンを積んだ単体の ubiquity というブラウザだと思っていましたf(--;
そしたら firefox の拡張機能でした。プラグインみたいなもん。
https://people.mozilla.com/~avarma/ubiquity-0.1.1.xpi から ubiquity-0.1.1.xpi をダウンロードしたけれど、その後どうしたらいいか分からなかった。
そう、firefox をインストールしてないと動くわけも無い・・・拡張子も firefox のプラグイン用の拡張子(中身は zip でアーカイブされているだけ)なのでダブルクリックしても firefox がないとしょうがない。。。

ubiquity の紹介ページには当たり前すぎてあまり書いてないけれど、上記の通り firefox が必要です。
なので、最初に firefox のインストールが必要。バージョン3以上が必要。
普通に firefox の日本語最新版(3.01)をダウンロードしてインストールします。

それから ubiquity をインストール。
ちなみに「ubiquity」を ALC で翻訳すると「至る所[広くあちこち]に存在すること、どこにでもある[いる]こと、遍在」という意味らしいです。

Mozilla Labs の Ubiquity プロジェクトのページから ubiquity-0.1.1.xpi ファイルをダウンロードした場合は、このファイルを firefox へドラッグ&ドロップすれば、ubiquity をインストールできます。
たぶん、firefox からダウンロードリンクをクリックすれば自動的にインストールが開始されるのではないかと思います。


使ってみた感想は、カッこイイ!
そして慣れると、便利!

[Ctrl + Space] でコマンドラインを開いて g キーワード で自動的にググれます。google 検索結果がリスト表示されるので、リストから一つを選択すると、新しいタブに開きます。
コマンドラインで map 東京ミッドタウン を入力すると、グーグルマップが表示される。
この時、漢字変換で [Enter] を押してしまうとそこで検索が始まってしまい別のタブに結果が表示されてしまいます。
地図の住所を漢字で入力するときは、[Space] か [変換] で漢字変換して文字を決定する時に [Enter] の代わりに [Ctrrl + m] で文字を確定させます。これで最後まで住所キーワードを入力できる。
住所キーワードを入力すると自動的に検索されていくつかの地図が表示されます。
ひとつの地図を選んでマーカーをクリックすると地図の操作(拡大縮小とか移動とか)ができます。
そして地図の右下に表示される「Insert map in page」をクリックすると、タブで開いているページにその地図を貼り付けられます。(できるページとできないページがある)
Gmail へログインしてメール作成画面で上記操作をすると、メールの本文に地図画像が挿入されます。
これは実際にやってみると、おぉ~と思う。
まぁ、普段使う機会はなかなかないと思うけれどw
でも他にもいろいろカッこイイ。

続きを読む "ubiquity" »

2008年07月23日

cygwinでdigコマンド

cygwinを使っていてdigコマンドを実行したいな~と思うことが多々あるのですが、setupを実行してもbind系のパッケージはない。
ググると『Cygwinでdigを使う』というサイトがあるので、その通りにやってみた(つもり)だけれど、動かない・・・orz

で、別件でbindのキャッシュ汚染のセキュリティホールについてを調べていたら、ISCのサイトでbindのWINDOWSバイナリーを配布していることを知った。
今まで知りませんでした・・・Windows版を正式配布していたとは。
だからcygwinにも取り入れてないのかな?mysqlも同様にないし。

まずは、下記のISCのBINDのページからWindowsのBinary Kitをダウンロード。

http://www.isc.org/sw/bind/view?release=9.5.0-P1

最新版バージョン9.5.0-P1のアーカイブファイルをダウンロード。
ZIPを解凍。
解凍したフォルダの中にはインストーラー(BINDInstall.exe)があるのですが、僕はWindowsでbind(named)を動かしたいわけではないし、サービスに登録されるのも嫌なので、インストーラは実行しない。
解凍したフォルダをCドライブの下記にコピー。

 C:\cygwin\usr\local\BIND-9.5.0-P1

cygwinを起動してシンボリックリンクを作成

 cd /usr/local
 ln -s BIND-9.5.0-P1 bind

不要なファイルは削除。特にインストーラを間違って実行しないように削除。

 cd /usr/local/bind
 rm BINDInstall.exe
 rm *.html
 rm *.pdf
 rm *.txt

あとはここにPATHを通すだけ。.bashrc に環境変数PATHを設定。

cd
vi .bashrc

PATH="/usr/local/bind:${PATH}"

これでcygwin上でdigコマンドが実行可能になります。
便利!(^^)

続きを読む "cygwinでdigコマンド" »

2008年07月08日

Excel画像縮小マクロ

Webシステムのテスト中。
画面をキャプチャしてエクセルのテスト仕様書にペタペタと張っていく単調で退屈な作業・・・
エクセルにペーストした画像を選択して右クリック、メニューから[図の書式設定]を選択して、[サイズ]タブを指定して、倍率を入力する。
これの繰り返し。

一発でやりたいなぁ~と思ってマクロを作成。
テストしているよりマクロを作っている方が楽しいという罠w

エクセルで[ALT]+[F11]を押してマクロVBAエディターを起動。
以下のコードを作成。

■画像縮小マクロ


Option Explicit

'画像の縮小率を設定
Private Const cMagnification As Double = 0.5

Sub 画像縮小()

'エラー対応(画像を選択しないで実行した場合)
On Error GoTo ErrorHandler

Dim Pic As Picture

With Selection.ShapeRange
.LockAspectRatio = msoTrue '縦横費を固定
.Height = .Height * cMagnification
End With

Exit Sub

'エラー処理ルーチン(画像を選択していない!)
ErrorHandler:
Err.Clear
MsgBox "縮小する画像を選択してください。"
On Error GoTo 0
End Sub

VBAエディターを終了して、エクセルのメニューバーから[ツール]->[マクロ]->[マクロ]で画像縮小を実行できます。
でもこれだといちいちメニューを辿るのが面倒なので、ショートカットキーを設定する。
[ツール]->[マクロ]->[マクロ]で画像縮小の[オプション]設定でショートカットキーを設定。
これで[CTRL]+[設定したキー]で画像縮小マクロを一発実行できるようになります。
実行すると選択した画像を50%に縮小します。
画像を選択していないとエラーダイアログが表示されます。

2008年04月20日

clamav

レンタルサーバなので自分でOSのバージョンを上げることができず、未だにFC4を使っている。そんな人も多いのではないでしょうか。
昨年まではclash-hatさんが古いディストリビューション用のパッケージ、FC4用のパッケージも配布してくれていたのですが、今年からCentOS5用しか配布してくれなくなった。
FC4にclash-hatさんのリポジトリを追加してyumでインストール&バージョンアップできていたのですが、
残念。
でもclamavに脆弱性が見つかったのでバージョンアップしなくては。
しかたがないので自分でリビルドすることにしました。

FC8用だとファイルやパッケージの構成が変わってしまうので、clash-hatさんのリポジトリからCentOS5用のSRPMを取得。

wget http://crash.fce.vutbr.cz/crash-hat/centos/5/clamav/clamav-0.93-2.src.rpm

そのままリビルドするとconfigureの途中でエラーになる。

rpmbuild --rebuild clamav-0.93-2.src.rpm
(省略)
checking for a supported version of gcc... ok (4.0.2)
checking for gcc bug PR27603... ok, bug not present
checking for gcc bug PR26763-2... ok, bug not present
checking for valid code generation of CLI_ISCONTAINED... ok, bug not present
checking for gcc bug PR28045... configure: error: your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045

FC4にバンドルされているgccにPR28045のバグがあるためコンパイルさせてくれない。
gccを4.3にバージョンアップするか、3.2~3.4にダウングレードするか、オプティマイズオプション(-O2)をやめてデバッグ(-g)でコンパイルすれば、コンパイルできる。
FC4にはgcc 4.0.2と3.2.3が入っている。
gccのバージョンアップはめんどいし、他への影響も大きいのでパス。
オプションの調整もSPECファイルの修正がめんどい。
手軽なところでgcc 3.2.3でビルドすることにしました。
SRPMをインストールしてSPECファイルを修正します。

rpm -i clamav-0.93-2.src.rpm
cd /usr/src/redhat/SPECS/
vi clamav.spec

viで編集。

%configure \
    --program-prefix=%{?_program_prefix} \

上記の部分を下記のように書き換えます。

%build
CC=gcc32 ./configure \
--build=i686-redhat-linux-gnu \
--host=i686-redhat-linux-gnu \
--target=i386-redhat-linux-gnu \
--program-prefix= \
--prefix=/usr \
--exec-prefix=/usr \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--sysconfdir=/etc \
--datadir=/usr/share \
--includedir=/usr/include \
--libdir=/usr/lib \
--libexecdir=/usr/libexec \
--localstatedir=/var \
--sharedstatedir=/usr/com \
--mandir=/usr/share/man \
--infodir=/usr/share/info \

このSPECファイルでビルド。

rpmbuild --ba clamav.spec

今度はエラーも出ずにビルドが完了。
インストール(アップグレード)します。

cd ../RPMS/i386/
rpm -Fvh clamav-0.93-2.i386.rpm \
     clamav-db-0.93-2.i386.rpm \
     clamav-milter-0.93-2.i386.rpm \
     clamav-server-0.93-2.i386.rpm

手動でウイルス定義ファイルを更新。

freshclam

もろもろのデーモンを再起動。

/etc/init.d/clamd restart
/etc/init.d/clamav-milter restart
/etc/init.d/freshclam restart

スキャンのテストを実施。

clamscan --infected --recursive /usr/share/doc/clamav-0.93/test/

/usr/share/doc/clamav-0.93/test/clam.cab: ClamAV-Test-File FOUND
/usr/share/doc/clamav-0.93/test/clam.exe.bz2: ClamAV-Test-File FOUND
LibClamAV Warning: RAR code not compiled-in
/usr/share/doc/clamav-0.93/test/clam.zip: ClamAV-Test-File FOUND
/usr/share/doc/clamav-0.93/test/clam.exe: ClamAV-Test-File FOUND
LibClamAV Warning: RAR code not compiled-in
LibClamAV Warning: RAR code not compiled-in
LibClamAV Warning: RAR code not compiled-in
LibClamAV Warning: RAR code not compiled-in
LibClamAV Warning: RAR code not compiled-in

----------- SCAN SUMMARY -----------
Known viruses: 266450
Engine version: 0.93
Scanned directories: 10
Scanned files: 48
Infected files: 4
Data scanned: 0.02 MB
Time: 3.864 sec (0 m 3 s)

RARがスキャンできてないけれど、これはビルド時にRARのライブラリが入ってないのでしょうがない。
FC4にはライブラリ入ってないし。まぁいいや。
とりあえず他は無事検出できたのでよしとしました。

続きを読む "clamav" »

2008年04月18日

省庁のWebサーバ

ちょっとした興味本位で調べてみました。
おもろ。

首相官邸
Server: Apache
Server: Zeus/4.2
トップページはApacheだけれど、ページによってはZeusを使っている。
10年前はZeusすげ~と思っていたけれど、存在をすっかり忘れていたw
まだ現役なんですね。最近はどうなんだろ?
http://www.scs.co.jp/zeus/zws.html

内閣府/総務省/法務省/環境省/農林水産省/文部科学省/財務省/金融庁
Server: Apache

宮内庁
Server: Apache/Latest (Unix)

国土交通省
Server: Secret
をを、秘密なんだ!w

経済産業省
Server: Netscape-Enterprise/6.0
かなり古くね?まだ現役の製品なの?6.1もリリースされているはずだけれど・・・
http://en.wikipedia.org/wiki/Netscape_Enterprise_Server

厚生労働省
Server: IBM_HTTP_SERVER
IBMの製品(Apacheベース)
http://www-306.ibm.com/software/webservers/httpservers/library/

外務省
Server: Microsoft-IIS/6.0
外交に配慮してMS製品なのでしょうかw

防衛省
Server: FJapache
富士通の製品(Apache 1.3.22ベース?) 古くね?!防衛省がこれでいいの?危なくね?
http://interstage.fujitsu.com/jp/technical/faq/apserver/v5/www_ihs/faq191009.html
後継の新製品が出ているようですが・・・

警察庁
Server: Hitachi Web Server 02-04 (Unix) mod_jk
日立の製品(Apache 1.3.31ベース)古くね?警察庁がこれでいいの?
新バージョン 03-10(Apache 2.0.59ベース)が出ているようですが・・・バージョンアップしないのかね?
http://www.hitachi.co.jp/Prod/comp/soft1/webserver/info/function/index.html

警視庁
Server: Apache/2.0.46 (Red Hat)
Apache 2.0.46をバンドルしているRed Hat製品というとRed Hat AS/ES/WS 3ですかね?
バージョン表示しないほうが良いと思うけれど・・・
https://rhn.redhat.com/errata/RHSA-2008-0005.html

続きを読む "省庁のWebサーバ" »

2008年03月28日

DIONのSPFが・・・

最近SPFについていろいろ調べているのですが、各ISPのSPFレコードをいろいろ調べてみると面白い。
それぞれ特徴、ポリシーみたいなものが見えるし、扱っているIPレンジの広さが垣間見える。

その中で au one net に統合された DION のSPFレコードを見ていたら、あらら~な状態になっていました。

# dig dion.ne.jp txt

dion.ne.jp.  3600  IN  TXT  "v=spf1 ip4:61.200.164.32/28 ip4:61.117.3.48/28 ip4:203.181.105.160/27 ip4:203.181.105.64/27 ip4:210.174.120.144/28 ip4:210.155.124.128/26 ip4:61.200.160.128/26 ip4:211.5.2.64/26 ip4:61.117.3.64/26 ip4:210.196.14.64/26 ip4:219.125.112.0/26 ip4:219.125.112." "128/25 ip4:210.251.0.0/25 ip4:61.117.18.96/27 ip4:61.117.18.192/26 ip4:211.5.1.64/26 ip4:210.196.2.160/27 ip4:219.125.149.119/32 ~all"

なんか変だぞと思ったら途中で途切れちゃってる。
ちょうど ip4:219.125.112." "128/25 のところ。
空白" "が入ってる。
でも入力ミスには見えないので文字数を数えてみると、TXTレコードの中身の256文字目に空白が入っている感じ。
これはクライアント側の処理の問題かな?
nslookupで見ても同じように表示されるなぁ。

RFCを見ると RFC-4408 の「3.1.3. 単一のDNSレコード中の複数行」「3.1.4. レコードのサイズ」にサイズついて書かれている。
http://www.iajapan.org/anti_spam/portal/Tech/RFC/RFC4408_11.html
またau自身のページにも「■SPF公開の注意事項」としてSPFレコードが255文字に収めるようにと書いてあるw
http://www.au.kddi.com/notice/manner/jyushin_policy/spf_record.html

DIONのネームサーバで、1レコードに255文字以上で登録してしまっているのかな?
450文字には収まっていますが、400文字近くありますね。
分割して include すればいいのに。その方が見易いし。とにかくDNS参照回数を減らしたかったのかな?

ちなみに、auone-net.jpのサブドメインも同じようなことになってしまっている:-(


# dig ab.auone-net.jp txt

ab.auone-net.jp.  3600  IN  TXT  "v=spf1 ip4:61.117.3.48/28 ip4:210.155.124.128/26 ip4:61.200.160.128/26 ip4:211.5.2.64/26 ip4:61.117.3.64/26 ip4:210.196.14.64/26 ip4:219.125.112.0/26 ip4:210.251.0.0/25 ip4:61.117.18.96/27 ip4:61.117.18.128/25 ip4:211.5.1.64/26 ip4:222.3.140.128/26 ip4:21" "0.141.108.0/24 ~all"


これってau one net のユーザのメールアドレスに使われているサブドメインでは?

ついでにこれも。レンジはみんなちょっとずつ違うみたいだね。


# dig ma.neweb.ne.jp txt

ma.neweb.ne.jp.  86400  IN  TXT  "v=spf1 ip4:61.117.3.48/28 ip4:210.155.124.128/26 ip4:61.200.160.128/26 ip4:211.5.2.64/26 ip4:61.117.3.64/26 ip4:210.196.14.64/26 ip4:219.125.112.0/26 ip4:210.251.0.0/25 ip4:61.117.18.96/27 ip4:61.117.18.128/25 ip4:211.5.1.64/26 ip4:203.140.129.5 ip4:222.3" ".140.128/26 ip4:210.141.108.176/27 ~all"

bind9なら起動時にエラー出るんじゃないかな?
http://bonz.squares.net/~dais/misc/migration.html#txt
試して無いけれど;-P
これって、メールを受信した側でSPFを実装していた場合、下手すると認証できないのじゃないかな?
大丈夫なのかな?

libspf2 にバンドルされている spfquery を使ってテストしてみると認証は上手く行くようです。
ちょうど空白が挟まって表示されたIPでクエリしてみると、


# spfquery -ip=219.125.112.129 -sender=user@dion.ne.jp -helo=dion.ne.jp
pass

spfquery: domain of dion.ne.jp designates 219.125.112.129 as permitted sender
Received-SPF: pass (spfquery: domain of dion.ne.jp designates 219.125.112.129 as permitted sender) client-ip=219.125.112.129; envelope-from=user@dion.ne.jp; helo=dion.ne.jp;


pass する。
空白のあとのレンジ、一番最後に記載されているIPでクエリしてみると、

# spfquery -ip=219.125.149.119 -sender=user@dion.ne.jp -helo=dion.ne.jp
pass

spfquery: domain of dion.ne.jp designates 219.125.149.119 as permitted sender
Received-SPF: pass (spfquery: domain of dion.ne.jp designates 219.125.149.119 as permitted sender) client-ip=219.125.149.119; envelope-from=user@dion.ne.jp; helo=dion.ne.jp;


やっぱり pass になる(送信ドメイン認証成功)。
動くみたいですね。
少なくとも libspf2 を使っている sendmail の spfmilterexim の spf は動きそうかな。

続きを読む "DIONのSPFが・・・" »

2008年03月16日

SPF

うちのドメインもSPFレコードを公開してみました。


dig hagyroom.com txt

とか

nslookup -query=txt hagyroom.com


とかするとうちのSPFレコードが見られます。

ちなみに、各社の取り組みはこんな感じ。
■携帯キャリア系
NTT DoCoMo
KDDI au
SoftBank
WILLCOM

■大手検索&ポータル系
Yahoo!メール
gooメール
hotmail
google gmail

■国内ISP系
@nifty
OCN
WAKWAK
BIGLOBE
hi-ho
plala
DTI
eo(K-Opticom)
IIJ4U
CDS-Net

■業界団体
JEAG
財団法人インターネット協会(IA japan)

■国
総務省

総務省の『ISPによる受信側における送信ドメイン認証導入に関する法的な留意点』は興味深い。
法の観点から見ている。
端的に言うと、ラベリング(認証と認証結果のヘッダー付与)はOKだけれど、フィルタリング(ヘッダー等を見て受信拒否や破棄)はNGだと言う。
むぅ・・・
フィルタリングはユーザの同意が必要らしい。理由は総務省の上記資料がわかりやすいので読むべし。

続きを読む "SPF" »

2008年03月11日

HTML::Template::Compiled::Plugin::LineBreak

HTML::Template::Compiled のプラグイン、HTML::Template::Compiled::Plugin::LineBreakバグ・レポートがあったので修正して version.0.0.2 をアップしました。

Thanks STEFFENW.

2007年11月09日

Norton Internet Security 2008

Vistaのアンチ・ウイルス・ソフト『Norton Internet Security 2008』を買いました。

この前買ったVAIOにプリインストールしてあった『Norton Internet Security 2007』のライセンスが切れたので、更新しようと思ったら新しいバージョンが出ていた。
せっかくなのでアップグレード更新した。
2年分の更新すると1年分ずつ買うより少しだけ安いし、あんまり乗り換えることもないだろうと思って2年分買いました。
ネットでシマンテックのサイトから買ったんだけれど、巧妙にオプション製品を薦めてくる。。。
保険とか超いらないし。

でもノートン2008は悪くないです。
割と軽い気がする。まぁ、PCがCore Duoで早いしな。
「Norton IDセーフ」はちょっとうざいな。OFFにしたい。

2007年08月08日

VAIO VGN-FZ90S

今まで使っていたLet's noteがもう古くて遅くてたまらんので、新しいPCを買うことにしました。
これでも半年ほど我慢したかな。
T2もよくがんばってくれた。もう6年も使っているのかな?まだ現役。ちょっと遅いだけ。バッテリーもすぐ切れちゃうけれど、基本的に電源挿して使うので問題ない。でもバイトは捗らないので:-(
で、購入したのがSonyのVAIOノート。Vistaも使ってみたかったし。

ソニーオーナーメードで注文しました。
スペックはパーツごとに選べます。
CPU2GHz、メモリ2GBにしてVista Home Premiumにしました。あとグラフィックボードはGeForce 8400M GTにしました。液晶は17インチでフルハイビジョン対応。
NICは802.11n対応のやつにしてみました。今度無線LANルーターも買い換えよう。楽しみ(^^)
注文してから3週間弱で届きました。グラフィックボードの入荷に時間かかったみたい。
オーナーメードは意外と高くない。値引きキャンペーンもやっているし。3年保障もつくし。
何より好きな色や好きなスペックを選べるのがよいです。
CPUはもっと速いのも選べたのだけれど、あんまり速いの選んだところでディスクが遅いのであんまり意味ないかと思って。結局5,400回転のディスクアクセスがボトルネックになる。それに速いと熱量も上がってファンがうるさそうだし。


セットアップに半日ほどかかったかな。
WindowsUpdateやVAIO update、NortonのUpdateも。長い・・・。やっぱりディスクアクセスがボトルネックだ。CPUリソースやメモリーは余ってる。。。けれど、ディスクアクセスで忙しくて反応鈍い。。。
MS Office 2007は買いませんでした。代わりにOpenOfficeを入れた。これで十分。互換も良いし。
これで快適にお仕事できそうだ。
液晶がかなり明るいけどさすがにきれいです。

続きを読む "VAIO VGN-FZ90S" »

2007年07月30日

EmEditor Professional

今まで『EmEditor Standard』を使っていたけれど、アウトライン機能を使いたくて『EmEditor Professional』を購入しました。

2001年から使っているからもう6年もこのエディター使っています。
とても使いやすい。見た目も秀○とかより全然イイと思うけれど:-P
特にコードを書く人向け。マクロとかプラグインとかテンプレートが豊富だし。コード変換できるし。
eclipseに比べて全然軽いので、ちょっとファイルを開くのに適しています。
今までStandardを使っていたけれどProfessionalの方が全然いいな。
1,000円くらいしか違いないし。アウトライン使えるのはやっぱりいいね。

続きを読む "EmEditor Professional" »

2007年07月20日

メモリースティックマイクロ

W52S用のメモリー『SONY メモリースティックマイクロ (M2) 1GB 』を購入しました。

地方の携帯ショップや電気屋さんではなかなか売ってなくて、新宿のビックカメラでようやく見つかりました。
今のところ1GBが最大らしい。2GBが欲しかったけれど、まだ発売されてないらしい。
W52SはメモリースティックマイクロとmicroSDの両方が使えるのですが、著作権保護付きの楽曲をメモリーに移すならメモリースティックマイクロの方がよさげ。
携帯ショップの人にもメモリースティックマイクロを薦められました。
microSDには著作権保護付きの曲は移せないのかも。

amazonだと1GBでも僅か2,980円で買えます!
ビックカメラでは3千円代だったと思う。。。

2007年07月12日

HTML::Template::Compiled::Plugin::LineBreak

HTML::Template::Compiled で、MySQL の Text フィールドに入っているデータを表示する際に、改行(\n)入りのテキストデータを HTML 上でも改行(<BR>) 入りで表示させたくて、プラグインを作成しました。
今までは、DB から取得したデータを一度加工して、”\n”を”<BR>”へ変換してから HTC のテンプレートにセットして表示させていました。
でもめんどい。
このプラグインを使うと、DB から取得したデータをそのままセットするだけで、改行を変換してくれます。
簡単なものだけれどあれば便利だと思います。
CPAN に登録して公開しました。よかったらご利用くださいませ。
perl CGI で HTC 使ってない人には無用の長物ですが。。。
Catalyst でも View に HTC を使えばこのプラグインも使えます。

 ・ HTML::Template::Compiled::Plugin::LineBreak

一応、Windows、Mac、UNIX の改行に対応したつもりです。

ESCAPE 属性より、filter として実装したいのだけれど、HTC は filter をプラグインとして実装できないので、ESCAPE で実装しました。
やっぱり TT でも同じようなことができまして、TT では filter として実装されています。

続きを読む "HTML::Template::Compiled::Plugin::LineBreak" »

2007年07月10日

HTML::Template::Compiled::Plugin::Comma

Catalyst で View に HTML::Template::Compiled を使っていて、DB に入っている INT 型の数字データをカンマ入りの数字(金額とか)として表示したかったので、Comma プラグインを作りました。
今までは、テンプレートに値をセットする前に一度処理を入れて、DB から取ってきた値にカンマを入れてからセットしていました。
でもせっかく Catalyst でやるなら、DB からとってきた値をそのままテンプレートに流し込みたい。
Model の DB Schema の中で値にカンマを入れる処理を作っても良かったのだけれど、せっかくなので HTML::Template::Compiled のプラグインとして作って公開しました。
だって、TT にはそういうプラグインあるからね。 HTC にもあってもいいんじゃないかと思って。
CPAN で公開しておいたので、良かったら使ってください。簡単なものだけれどあれば便利です。

 ・ HTML::Template::Compiled::Plugin::Comma (pod)

でも、HTC 使っている人は少ないんだろうな。

続きを読む "HTML::Template::Compiled::Plugin::Comma" »

2007年06月27日

swatchとログローテート

swatchといっても時計ではありません。UNIXのログ監視プログラムのことです。
syslog-ngがあればswatchは要らないかともおもったのですが、最近のswatchは便利な機能がついています。
プログラムでログ監視をしていて任意のメッセージにマッチしたらメールを送る、とか何かのプログラムを実行するようにしていて困るのが、同じメッセージが秒間何十と連続して出てしまった時。
1秒間に何十もメールが送信されてしまいます。。。それが数十秒~数分続くとものすごい数のメールが送られてしまいます。
メールサーバにも負担になりますし、何よりログ監視をしていてメール送信負荷でサーバが過負荷になってしまいます(T_T)
それはsyslog-ngを使った場合でも同じ。
メッセージをfilter()でフィルタしてmatch()でマッチさせるのだけれど、マッチしたときにprogram()へメッセージを渡します。

 filter alert_mail {
    facility(local3) and
    level(notice) and
    match("hoge") and
    program("/usr/local/bin/alert_mail.pl");
 };

program()はsyslog-gn起動時に1回だけ起動されます。
メッセージはプログラムの標準入力<STDIN>へ送られます。
従って、プログラムは標準入力からメッセージを読み込んでぐるぐる回るようなループプログラムにする必要があります。
syslog-ngを終了するとプログラムも終了します。
で、これだとメッセージにマッチするたびにプログラムへメッセージが送られて処理されます。
(syslog-ng 1.6の話です。2.0は違うかもしれません。わかりません。誰か教えて。)

さて、前置きが長くなりましたが、swatchの場合も前は似たようなもんでした。今でもルールの書き方次第では同じになってしまいますが。
pipe("プログラム")を使うとswatch起動時に1回だけ起動され、マッチしたログはプログラムの標準入力へ送られます。
exec("プログラム")を使うとログがマッチするたびにプログラムが実行されます。ケースによってこれが良い場合も悪い場合もありますが、ログがマッチしまくるような状況だとものすごい勢いでプログラムが実行されて過負荷になりかねません。

で、最近のswatchには、thresholdやthrottleというルールがあって、ログがマッチしても15秒間に1回だけプログラムを実行する、みたいなことが出来ます。

 waitfor /hoge/
     threshold track_by="/hoge/",type=limit,count=1,seconds=15
     pipe "/usr/local/bin/alert_mail.pl"

15秒の間に何度ログがマッチしてもプログラムが実行されるのは最初の1回だけ。
上記のcountとsecondsは任意の値を設定できます。
throttleも同じことができますが、tresholdの方が推奨されている?みたいです。

さて、こっからが本題で最近のswatchはログの追跡にtailコマンドを使えます。
昔は使っていませんでした。
tailを使いたくない場合は、swatchのオプションに--use-cpan-file-tailをつけて起動します。
でもこれだと監視対象のログをローテートすると監視されなくなります(追跡できない)。
これを解消するにはやっぱりtailコマンドを使います。
んで、tailのオプションに以下のオプションを付けると、ログがローテートされた後もログの追跡を続けてくれます。

 swatch -f /usr/local/etc/swatchrc -t /var/log/hoge --tail-args='--follow=name --retry -n 0'

tailコマンドのオプションをつけないとtailコマンドを使わない場合と同様に、監視対象のログがローテートされると追跡されなくなります。
理由は追跡にファイル・ディスクリプターを使っているからです(--follow=descriptorがデフォルト)。
--follow=nameオプションは追跡をファイル名で行って、--retryオプションで監視対象のファイルがなくなってもオープンできるようになるまでリトライして、オープンできたら再び追跡を始めます。
こうしておけば、ログローテートしてもswatchを再起動する必要がありませんv(^-^)v

サイトを見てると、結構再起動せよ、みたいなことを書いている人がいるけどf(^^;
再起動したい人はこんな感じ。

 /var/log/hoge {
     postrotate
         /etc/rc.d/init.d/swatch restart
     endscript


postrotateとendscriptの間には複数のコマンドを書けるので、syslogdをkill -HUPしてからswatch restartすることも可能です。
尚、init.d/swatchは自分で作ってくださいw
ググればいっぱい出てきます。

尚、CentOS4にswatchを入れたい場合は、FC6のswatchのSRPMをリビルドすればインストールできます。
できたRPMをインストールしてもinitスクリプトはありませんので、やっぱり自分で作ってくださいw

続きを読む "swatchとログローテート" »

2007年06月17日

CatalystでHTML::Template

CatalystのViewでHTML::Templateを使ってみました。
ググってみると、みんなTTを使ったやりかたばかり紹介されていて、ボクはHTML::Templateの方が好きなので、敢えてHTML::Templateを使ってみました。
でも、使ってみて分かったけれど、CatalystではTTを使った方が便利かも。
でもTTだと、使い方しだいなところはあるけれどTTの便利さを活かすとMVCの分離がグレーになる気がする。HTML::Templateは制限がある分(不便な分?)MVCのVの分離が(自然と)きちんとできる気がする。
んでも、HTML::TemplateだとやっぱりCatalystを使うメリットが薄くなってしまうかなぁ。
Catalystで使うならHTML::TemplateよりHTML::template::Compiledがいいかな。こっちだと大分便利だし、煩雑なコードを大分減らせる。TTほど多機能ではないけれど、オブジェクトをセットできる分、HTよりはCatalystとの相性が良い。まぁCatalystに限らず、DBIx::Classとの相性もいい。

さて、前置きが長くなりましたが、今回はCatalystのViewでHTML::templateを使った場合の簡単な実装例についてです。


まずは、下準備として以下のテスト・モジュールをインストール。
これらはインストールしなくてもCatalystのインストールは可能です。


cpan Test::Pod
cpan Test::Pod::Coverage

さて、それでは普通にCatalystをインストール。
下記サイトからインストール・スクリプトをダウンロード。
http://www.shadowcatsystems.co.uk/static/cat-install
ダウンロードしたら実行。


perl cat-install
perl -MCPAN -e 'install Catalyst::Devel'

(現在は cpan コマンドで Task::Catalyst をインストールすることで全部インストールできるらしい)
表示を自動化する為に下記プラグインをインストール。

cpan Catalyst::Plugin::DefaultEnd

このプラグインが無かったころは、コントローラの中でいちいちどのビューで表示するかforward指定しないといけませんでした。
(現在は DefaultEndプラグインの代わりにActionClass('RenderView')を使うので、インストールする必要はありません。)

ViewにHTML::Templateを使用するので下記モジュールをインストール。


cpan HTML::Template
cpan Catalyst::Helper::View::HTML::Template

これでとりあえずインストールは完了。

次にCatalystでサンプル用のHelloプロジェクトを作成。


cd /var/www/
catalyst.pl Hello


DefaultEndを使うためにプラグインを設定。

cd /var/www/Hello
vi lib/Hello.pm

use Catalyst qw/
  -Debug ConfigLoader Static::Simple DefaultEnd
/;



ビューを自動的に表示させる為に下記記述を行う

vi lib/Hello/Controller/Root.pm

sub end : ActionClass('RenderView') {}

HTML::Templateを使用したビュー、HTを作成。


script/hello_create.pl view HT HTML::Template

作成したビューを修正。下記修正をしないと表示時にエラーになります。

vi lib/Hello/View/HT.pm

__PACKAGE__->config(
        die_on_bad_params => 0,
);


何故エラーになるかと言うと、テンプレートに対してCatalystが持っているもろもろのオブジェクト(stash)をセットしようとしてしまう為。

次にサンプル用のテンプレートを作成。
デフォルトのテンプレートrootはroot/baseになります。
そこに文字列を表示するだけの簡単なtestテンプレートを作成。


mkdir root/base/sample
vi root/base/sample/test.tmpl

messages: <TMPL_VAR NAME="messages"><br />

次にサンプル用のコントローラを作成。
testテンプレートに文字列'テスト'を設定。


script/hello_create.pl controller Sample
vi lib/Hello/Controller/Sample.pm

sub test : Local {
    my ( $self, $c ) = @_;
    $c->stash->{messages} = 'Hello World!';
}

これで一応準備は完了。
実行してみる。ポート8080で公開。


script/hello_server.pl -p 8080 -r

下記URLにアクセス。
http://localhost:8080/Sample/test
'Hello World!'と表示されればOK。

次にデータベースからデータを取得して、表示してみる。
まずは、モデルを作成するためにDBIC関連のモジュールをインストール。


cpan Catalyst::Helper::Model::DBIC::Schema
cpan DBIx::Class::Schema::Loader

そしてデモル DBICを作成。DBはMySQLを使用しています。

script/hello_create.pl model DBIC DBIC::Schema Hello::Schema create=static DBI:mysql:DB名 接続ユーザ名 接続パスワード

(1行で入力)
静的にスキーマを作成する方法をとっています。動的に生成する方法もありますが、ここでは静的で。

HelloプロジェクトにDBへの接続情報を設定します。
YAMLで書かれた設定ファイルに設定します。


vi hello.yml

name: Hello

Model::DBIC:
  schema_class: Hello::Schema
  connect_info:
    - DBI:mysql:DB名
    - DB接続ユーザ名
    - DB接続パスワード


DBとテーブルは既にできているものとします。
'User'テーブルがあって、名前とかメールアドレスが保存されているものとします。

次にテーブルの情報を表示できるHTMLテンプレートを作ります。
'User'テーブルの情報を表示するテンプレートにします。
<TMPL_VAR>のNAMEは'User'テーブルのカラム名と同じにします。


vi root/base/Samle/list.tmpl

<TMPL_LOOP NAME=users>
  <TMPL_VAR NAME=userid> :
  <TMPL_VAR NAME=username> :
  <TMPL_VAR NAME=email><br>
</TMPL_LOOP>

次にコントローラを修正。
モデルの検索結果(DBの検索結果)をテンプレートにセットします。
下記例では、単純に'User'テーブルから検索キーの指定なしで全部のレコードを取得しています。
HTML::TemplateはDBIx:Classの検索結果のオブジェクト(DBIx:Class::ResulSet)をそのままセットすることはできないので、配列、ハッシュのリファレンスにします。


vi lib/Hello/Controller/Sample.pm

sub list : Local {
    my ( $self, $c ) = @_;
    my @users = ();
    for my $user ($c->model('DBIC::User')->all) {
        push @users, {
            userid => $user->userid,
            username => $user->username,
            email  => $user->email,
        };
    }
    $c->stash->{users}=\@users;
}

ちなみにHTML::Templae::Comipledなら同じテンプレートでも下記のような感じでOK。
<TMPL_LOOP>の為にオブジェクトを無名配列に入れてセットしています。


vi lib/Hello/Controller/Sample.pm

sub list : Local {
    my ( $self, $c ) = @_;
    $c->stash->{users}=\@{[ $c->model('DBIC::User')->all ]};
}

さて、これでもう一回実行し直して、URLにアクセス。


script/hello_server.pl -p 8080 -r

http://localhost:8080/Sample/list
'User'テーブルに入っているレコードの情報が全て表示されればOK。
上記コントローラの例を見ると、HTML::Templateだとテンプレートにオブジェクトを直接セットできないので面倒だなぁと思ってします。
よくウェブで公開されているビューがTTの例だと、オブジェクトをそのままセットできるので、テンプレートの為にハッシュや配列を作る必要がない。
それで、HTML::Templateの代わりにHTML::Template::Compiledを使用する場合は、テンプレートを下記のように記述すれば、TTの様にオブジェクトを直接セットできます。


HTML::template::Compiled専用のテンプレートを作成。HTML::templateでは使えません。


vi root/base/Samle/list.tmpl

<TMPL_WHILE users.next>
  <TMPL_VAR _.userid> :
  <TMPL_VAR _.username> :
  <TMPL_VAR _.email><br>
</TMPL_WHILE>

上記テンプレートの場合、コントローラはこんな感じ。
検索キーは何も指定していません。


vi lib/Hello/Controller/Sample.pm

sub list : Local {
    my ( $self, $c ) = @_;
    $c->stash->{users} = $c->model('DBIC::User')->search({}, {});
}


これだけ。
DBの検索結果のオブジェクトがO-Rマッパーになっていて、テンプレートにそのオブジェクトをセットしている。
オブジェクトのアクセサ・メソッドがカラム名になっていて、それをテンプレートから直接呼び出している感じ。
楽チンで、しかも直感的で分かりやすい。
TTでも似たような感じになります。

念のために補足しておくと、HMTL::Template::Compiledを使用する場合は、そのビューを作成する必要があります。手順的にはHTML::Templateと同様です。


cpan HTML::Template::Compiled
cpan Catalyst::Helper::View::HTML::Template::Compiled
script/hello_create.pl view HTC HTML::Template::Compiled

ビューを指定して表示させたい場合は、コントローラで以下の様にforward指定します。

vi lib/Hello/Controller/Root.pm

#sub end : ActionClass('RenderView') {}
sub end : Private {
    my ( $self, $c ) = @_;
    $c->forward( $c->view('HTC') );
}


とりあえず、こんな感じ。

続きを読む "CatalystでHTML::Template" »

2007年05月17日

syslog-ngとminilogd

CentOS4.4でsyslog-ngを使った時に、minilogdとの連携ではまりました orz

まず、minilogd は、syslogd や syslog-ng を止めたときや、ブート時でまだ syslogd や syslog-ng が立ち上がっていない時に、代わりに自動的に立ち上がるデーモンです。
メッセージを受信して仮想メモリーにログを保存しておいてくれます。
syslogd や syslog-ng が起動すると、syslogd や syslog-ng は /dev/log を経由して minilogd が仮想メモリーに保存したログメッセージを読み取って HDD 上のログファイルに保存します。
/dev/log は UNIXソケットドメインです。
minilogd は重要なデーモンです。
syslogd は特に気にすることなく minilogd と連携してくれます。

さて、大抵のウェブページを見ていると、syslog-ng の設定に関して、

  source s_sys { 
     pipe ("/proc/kmsg" log_prefix("kernel: "));
     unix-stream ("/dev/log");
     internal();
  };

この様に書かれています。
FC6のsyslo-ngのRPMをインストールした場合も同様です。

で、大抵、Linuxの場合は /dev/log はストリームソケットだから、unix-stream()を使いなさいと書かれています。で、上記はその様に設定されています。
そして、*BSDの場合はデータグラムソケットだから、unix-dgram()を使いなさいと書いてあります。

ところが、ボクのCentOS4.4の環境だと、syslog-ngを止めている間にminilogdが受信したログを、syslog-ngを起動してもsyslog-ngが読み取ってくれません orz
ブート時のブートログはちゃんと出力されているのでそこは /dev/log が読み取って書いているようなのですが、一旦起動したとはなぜか読んでくれません。なぜ~~(?_?)

結果、syslog-ngの設定を以下のように変更したら、syslog-ng 停止中に受信したログもsyslog-ng起動後に出力するようになりました。

  source s_sys { 
     pipe ("/proc/kmsg" log_prefix("kernel: "));
     unix-stream ("/dev/log");
     unix-dgram ("/dev/log");
     internal();
  };

データグラムソケットを使っているということでしょうか。
これが正しい解決策なのかどうか分かりませんが、とりあえず、これで期待した動きになりました。
ブート時のログもきちんと記録されるし、minilogdとの連携も問題ないようです。

netstat -an コマンドで確認したら、/dev/log は確かに DGRAM ってなってますねf(^^;)

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  12