FireGestures でジェスチャーをキャンセルする

2008/05/06 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

設定画面に項目がなく、デフォルトで無効になっているのでメモ。

about:config を開き、

extensions.firegestures.gesture_timeout

を 3000 とかに設定する。単位はミリ秒。

Firefox3でGmailのフィルタ設定のキーワード欄を複数行にする

2008/04/30 | ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Firefox 3 にしたら、Gmail のフィルタ設定のキーワード欄を複数行にする Stylish のスタイル定義が効かなくなっていた。

このスタイル定義は

-moz-binding: url(http://persistent.info/files/gmail-filter.xml#filter);

のように外部サイトを参照するようになっており、Firefox 3 のセキュリティ強化によりエラーとなってしまう。考えてみれば、外部サイトに置かれたファイルに定義された書き換えルールを使っているっていうのはかなり危険である。ファイルを置き換えられても気付かないだろうし。。。

自分は新バージョンの Gmail に対応するため、XBL ファイルをローカルに置き、

-moz-binding: url(resource:///chrome/gmail-expand-filter.xml#filter);

としているが、これもエラーとなった。
新バージョンの Gmail でこのフィルタを使うにはこちらを参照。
続・Gmail のフィルタ設定のキーワード欄を複数行にする

解決方法は、XBL ファイルを Stylish のクロムフォルダに置くこと。
パスは <Firefoxプロファイルフォルダ>\extensions\{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}\chrome\content

せっかくなので、手順をまとめておく。目的は Firefox 3 & 新バージョンの Gmail で使えることだけど、たぶん Firefox 2 以前、旧バージョンの Gmail でも動くと思う。

1. XBL ファイルを Stylish のクロムフォルダに置く

<Firefoxプロファイルフォルダ>\extensions\{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}\chrome\content を開き、次の内容を gmail-expand-filter.xml として保存。

<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl">
  <binding id="filter" styleexplicitcontent="true">
    <implementation>
      <constructor>
        var textarea = document.createElement("textarea");
        textarea.name = this.name;
        textarea.id = this.id;
        textarea.value = this.value;
        textarea.style.width = "100%";
        textarea.style.fontFamily = "monospace";
        textarea.style.fontSize = "14px";
        textarea.rows = 15;
        this.parentNode.replaceChild(textarea, this);
      </constructor>
    </implementation>
  </binding>
</bindings>

2. スタイルを定義する

Stylish に新しいスタイルを作成し、次のコードを入力する。

@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain("mail.google.com") {
input[name="cf1_has"],
input.MtafId[tabindex="54"],
input.MtafId[tabindex="5"] {
  display: none;
  -moz-binding: url(chrome://stylish/content/gmail-expand-filter.xml#filter);
}
}

PAM を使って Active Directory で認証する方法

2008/03/09 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

PAM を使った自作アプリ(C/C++)で、ユーザの認証を Active Directory で行う方法を紹介。

C/C++アプリのコーディングでは、Active Directory を意識する必要はなく、単に PAM に問い合わせるだけ。認証方法に依存しちゃったら PAM を使う意味ないしね。ここでは PAM ライブラリを用いたコーディングについては触れません。

アプリのプラットフォームは Linux 。今回は、ユーザの認証だけができればよく、Linuxシステム上にアカウントは存在しなくてよい。というより作りたくない。

手順はたかはしもとのぶ氏の Linux の認証を Active Directory で行なう方法 の通りでOK。

また、Windows ActiveDirectory を利用した Linux ログイン認証環境構築時のメモ は Windows と Linux の認証の統合の方法についてよくまとまっている。

手順

  1. PAM、Kerberos といった必要なライブラリをインストールする。RHEL4 ではデフォルトで入るかな?
  2. /etc/krb5.conf を設定する。
  3. /etc/pam.d/hoge を作成する。"hoge" はC/C++アプリ側で指定する PAM の認証サービス名。

これだけ。

/etc/krb5.conf の設定

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = TEST.LOCAL
 default_tkt_enctypes = des-cbc-md5
 default_tgs_enctypes = des-cbc-md5
 dns_lookup_realm = false
 dns_lookup_kdc = false

[realms]
 TEST.LOCAL = {
  kdc = dc1.test.local:88
  admin_server = kerberos.example.com:749
  default_domain = test.local
 }

[domain_realm]
 .test.local = TEST.LOCAL
 test.local = TEST.LOCAL

[kdc]
 profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

Active Directory 側で、Administrator のパスワードを一度も変更していない場合、kinit に失敗するので注意。

簡易テスト

ここで Active Directory で認証できるか簡易なテストをする。Active Directory 上に存在するユーザと同名のユーザを Linux 上にも作る。パスワードは未設定でよい。/etc/pam.d/system-auth の先頭エントリに次の1行を加える。

auth        sufficient    /lib/security/$ISA/pam_krb5.so

そのユーザで Linux にログインしてみる。成功すると、/var/log/messages に次のようなログが記録される。

Mar  5 16:39:02 localhost sshd: pam_krb5[22867]: authentication succeeds for 'test01' (test01@TEST.LOCAL)

テストが成功したら、/etc/pam.d/system-auth を元に戻し、Linux 上のユーザは削除しておく。

PAMサービスのコンフィグを書く

#%PAM-1.0
auth       required     /lib/security/pam_krb5.so no_user_check

認証のみでユーザが(ローカル)システムに存在するかチェックしなくてよいので、no_user_check オプションをつけること。

あとは C/C++ アプリで認証ができるか確認する。

ふと気になったこと

  1. Active Directory 側のユーザアカウントが無効、パスワード切れ、パスワード切れ間近、ログイン不可時間帯とかの場合は認証はどうなるんだろう?PAM の設定で auth だけでなく account も必要かも。要確認。
    (2008.4.30追記)
    1. account はなくても OK。
    2. アカウントが無効、ログオン可能時間帯以外(ログオン拒否時間帯)の場合は認証エラーとなる。Clients credentials have been revoked.
    3. パスワード有効期限切れの場合は、エラーにはならず認証が通る。
    4. 次回ログオン時にパスワード変更が必要である状態の場合は認証エラー。KDC has no support for encryption type.
    5. 対話型ログオンにスマートカードが必要とされている場合は認証エラー。KDC policy rejects request.
  2. kdc(=Active Directory)の冗長化はどう図ればよいのか。kdc は複数指定可能?
    ググってみたら kdc は複数指定可能みたい。

krb5.conf から引用。HP-UXのだけど、Linuxでも多分同じ。

[realms]
ATHENA.MIT.EDU = {
        kdc = KERBEROS.MIT.EDU
        kdc = KERBEROS-1.MIT.EDU:750
        kdc = KERBEROS-2.MIT.EDU:88
        admin_server = KERBEROS.MIT.EDU
        default_domain = MIT.EDU
        v4_instance_convert = {
                mit = mit.edu
                lithium = lithium.lcs.mit.edu
        }
}

ドライブレターのないボリュームの容量を取得する

| ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

WMIを使ってディスク容量を取得するサンプルはたくさんあるけど、ドライブレターのない論理ボリュームの容量を取得するものがない。また、Win32_LogicalDisk クラスでも取得できない。

いろいろ調べて試した結果、Win32_Volume クラスで取得できることが分かった。以下は「C:\Users\xxx」にマウントしたボリュームの総容量と空き容量を取得する例。

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Volume Where Caption = 'C:\\Users\\xxx'")
For Each objItem In colItems
    WScript.Echo "Name: " & objItem.Name
    WScript.Echo "Capacity: " & objItem.Capacity
    WScript.Echo "Free Space: " & objItem.FreeSpace
    WScript.Echo
Next

ExecQuery メソッドでは LIKE も使えるので、

Select * from Win32_Volume Where Caption LIKE 'C:\\%'

という書き方もできる。

参考リンク

Vistaでドライブレターがないボリューム上のファイルがインデックスに登録されない

| ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Windows Vista には Windows デスクトップ サーチ の機能が統合されていて、様々なファイルの検索が可能になっている。デフォルトでは Users フォルダとオフラインフォルダがインデックス登録され、検索可能になっている。

だけど、なぜか自分のドキュメントフォルダに保存したPDFファイルがインデックスに登録されない。Administratorのドキュメントはちゃんと登録されている。インデックス対象の選択画面を開くと、なぜか自分のデータフォルダだけ表示されないではないか。。。どうやら、ジャンクションフォルダはインデックスの対象外っぽい。そういう仕様なんだろう。

なぜジャンクションになってるか

自分はデータ領域をシステムドライブと分けたいという性分なので、Documents and Settings フォルダを移動せずに別のドライブにマウントする方法 の手順で自分のデータ領域(C:\Users\xxx)を別ボリュームに分けた。dirコマンドで見てみると、C:\Users\xxx はジャンクションになっている。

ドライブレターをつけてみた

試しにデータ領域にしているボリュームにドライブレターを付けると(Uドライブとした)、インデックス対象の選択画面にはそのボリュームが見えるようになる。マウントポイントである C:\Users\xxxはやっぱり見えない。インデックス対象としてUドライブを選択してインデックスを再構築すると、ファイルがインデックス登録されるようになった。しかーし、UドライブとC:\Users\xxxと、2重で登録されてしまう。ださい。。。Uドライブをインデックス対象から外したり、Uドライブのドライブレターを外すと、やっぱりインデックス登録されない。

シンボリックリンクにしてみた

Vista では正式にシンボリックリンクに対応したということなので、ボリュームのマウントをやめて、C:\Users\xxx を Uドライブへのシンボリックリンクにしてみた。すると、Uドライブをインデックスの対象から外した状態でも、C:\Users\xxx以下のファイルがインデックスに登録されるようになった。でも、今度はインデックス対象を選択する画面で自分のデータフォルダだけでなくUsersフォルダ全部が見えなくなってしまった。。。orz

一応インデックス登録されるようになったし、ファイルの読み書きやアプリの利用など通常利用に問題はなさそうなので、しばらくこれで使ってみるか。。。

ちなみに、Vista でシンボリックリンクを作成するには mklink コマンドを使う。

Documents and Settings フォルダを移動せずに別のドライブにマウントする方法

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

データ領域をシステムドライブと別にしたいという人は結構いるんじゃないかと思う。自分もDocuments and Settingsフォルダの場所を変更する を参考にしてDドライブに移している。Documents and Settings フォルダ(名前長いよ。。。)は Vista では Users フォルダに名前が変更されている。うん、短くていいね:-)

しかし上記の手順で Documents and Settings フォルダを別ドライブにすると、不具合が出るアプリもある。自分は Windows Media Player がエラーで使えなくなった。DRM関連の設定がレジストリにバイナリ値として「C:\Documents and Settings\...」と設定されていたためだ。念のためレジストリはチェックしていたのだけど、バイナリ値は検索に引っかからなかった。

他にも、Google Earth は Documents and Settings が Cドライブにあるものとして作られているのか、使うたびに Cドライブに Documents and Settings フォルダが作成されてしまっていた。
※今では解消している模様。

さて、これらの問題も変更前のパス( C:\Documents and Settings )でもアクセスできれば解消できると思われる。パスは変更せず、実際のデータは別のドライブに保存される。

方法

  1. ディスクを追加するなどして、Cドライブ以外のボリュームを用意する。NTFSでフォーマットする。
  2. Documents and Settingsフォルダの場所を変更する を参考にして、「C:\aaa」など適当な場所に一時的に移動する。データ領域として使いたいボリュームはまだここで使わないように。
  3. 「C:\aaa」にちゃんと移動できたことを確認したら、Documents and Settings フォルダを空にする。
  4. コントロールパネル -> コンピュータの管理 -> ディスクの管理 を開く。
  5. データ領域として使いたいボリュームを右クリックして「ドライブ文字とパスの変更」を選び、空にした「C:\Documents and Settings」フォルダにマウントする。
  6. 「C:\Documents and Settings」フォルダに書き込みができることを確認したら、「C:\aaa」に変更した Documents and Settings を再度「C:\Documents and Settings」に戻す。

これで OK、なはず。自分は試してないので、誰かやってみてください。(ぉぃ...)

一応、Vista で似た手順を踏んで C:\Users\test を別ボリュームにすることはできた。C:\Users フォルダ全体じゃないっす。ただちょっと弊害が残った。詳細別エントリで。。。↓

関連エントリ

body onload は使ってはいけない?

2008/03/08 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

独自の Windows Vista サイドバー ガジェットを作成する より引用。

JavaScript をかじったことがある方なら、"eval is evil" という言葉を耳にしたことがあるでしょう。ご存じない方は、まず Web で調べてから続きをお読みください。 eval を使用すべきでない理由をおわかりいただけたところで、ここではこの規則に修正を加えて、JavaScript のテキストを HTML 内の属性に配置すべきではないという規則と、setInterval や setTimeout に文字列を渡すべきではないという規則を付け加えたいと思います。JavaScript のテキストを配置してはいけない属性には、body onload 属性も含まれます。この属性は eval ステートメントと同じように内部で解釈されるからです。 "body onload がだめならどうやってコードを実行するんだ" とおっしゃる方もいるでしょう。そのような方には、window オブジェクトの onload イベントに関数をアタッチする習慣を付けることをお勧めします。次のコードは、onload イベントと onunload イベントへのアタッチの方法を示しています。

function pageLoad() {
    window.detachEvent(“onload”, pageLoad);
    window.attachEvent(“onunload”, pageUnload);
    //page initalization here
}

function pageUnload() {
    window.detachEvent(“onload”, pageUnload);
    //gadget is closing, clean up
}

window.attachEvent(“onload”, pageLoad);

正直「evalステートメントと同じように内部で解釈されるからです」というのもよく分からなかったけど、上記のように書くほうが良いお作法ってことですかね。アタッチする方法だと複数の関数をつけることもできる。上記コードはちゃんと後片付けもしている。なるほど。

Firefox や Opera では addEventListener、removeEventListener を使う。

if (window.addEventListener)
  window.addEventListener("load", pageLoad, false);
else if (window.attachEvent)
  window.attachEvent("onload", pageLoad);
else
  window.onload = pageLoad;

メール送信時にアドレスから表示名を取り除く拡張 Auto Address Cleaner

2008/02/18 | ラベル: | 31 コメント | このエントリーを含むはてなブックマークを表示
宛先メールアドレスから次の例のように表示名を取り除く Thunderbird 拡張 Auto Address Cleaner を作ってみた。
"雷鳥 太郎" <taro@example.com>

  ↓
taro@example.com
同様の拡張で AddressCleaner という拡張があるが、Auto Address Cleaner はメール作成中は表示名は消さず、送信時に表示名を取り除くようになっている。

AddressCleaner Auto Address Cleaner
  • アドレス入力時に自動で取り除く(auto_cleanを有効にした場合)
  • コンテキストメニューから手動で取り除く
  • メール送信時に自動で取り除く

Auto Address Cleaner は、表示名は自動で取り除きたいけど、メール作成中は宛先を間違えてないか確認しやすいように表示させておきたいというケースに向いている。
ダウンロードはこちらからどうぞ。: Auto Address Cleaner

なお、本家の AddressCleaner と同じ機能は実装してないので、必要なら併用してください。

お願い: 以下のリンクから Dropbox のアカウントを作ってくれると作者が喜びます。
https://db.tt/EBiogbwn

(補足)このエントリについて

以前このエントリーでは、「Plain Address」として公開していました。同名の拡張が既にあったこと、それなりに需要がありそうなことから名称を変更しました。(2008.5.1)

JSPのプリコンパイル

2008/02/11 | ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

JSPをWebサーバに配置後、プリコンパイルする方法のメモ。

  • JSPファイルそれぞれに以下の形式でHTTPアクセスする
    • http://path/to/file.jsp?jsp_precompile
    • http://path/to/file.jsp?jsp_precompile=true
    • http://path/to/file.jsp?foo=bar&jsp_precompile=true
  • Ant の jspc タスク を使う
  • Lambda Probe を使う

Ant のことはよく分からないし、そのまま使えるサンプルが見つからなかった。Lambda Probe は Tomcat の管理/管理ツールとのことで良さげ。Tomcat 4.x には未対応。

ローテクながら、1つめの方法をとることに。

JSPファイルを find で列挙して sed で URL 加工、wget でアクセス。

続・Google Analytics のレポートから内部トラフィックを除外する方法

2008/02/10 | ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Blogger にログインした状態でアクセスしたときだけ処理を実行する方法を、Google Analytics の自己アクセス除外設定に応用する。

Google Analytics で自己アクセスを除外する設定は Google Analytics のレポートから内部トラフィックを除外する方法 でできたのだが、ひとつ困ったことがある。

このサイトは Blogger を利用しているのだが、自分だけがアクセスできるページを作成できない。Google Analytics で自己アクセスを除外する設定をかいつまむと、こうだ。

  1. サイトに(自分だけがアクセスする/できる)新しいページを作成
  2. 作成したページに自分のアクセスだと識別する Cookie (便宜上、除外用 Cookieと呼ぶことにする)を設定するコードを埋め込む
  3. 自分が使うパソコン、ブラウザから作成したページにアクセスして、除外用 Cookie を受け取る
  4. 除外用 Cookie を持ったトラフィックを除外するフィルタを作成する

除外用 Cookie を他人が受け取っては意味がないので、自分だけがアクセスできるページが必要ということなのだが、Blogger では公開か下書きかの2通りしかなく、隠しページのようなものを作成することはできない。
ダミーの記事やウィジェットを作成し、公開→アクセス→すぐに削除とすれば Cookie を設定できるが、手順が面倒だし Webアプリ作ったりしてると Cookie を削除することも結構あるのでますます面倒である。

そこで、Blogger にログインした状態でアクセスしたときだけ処理を実行する方法を応用する。これを使えば、Cookie を削除したり別の PC を使った場合でも、Blogger にログインしてアクセスしさえすれば、除外用 Cooke を設定することができる。

ダミーの span 要素とその display 属性をチェックするコードを前の記事のように埋め込む。処理の部分に、除外用 Cookie を発行するコードを書くだけだ。

<script type='text/javascript'>
function hoge() {
var element = document.getElementById('hoge'), value;
if ( window.getComputedStyle ) // Firefox, Opera
value = window.getComputedStyle(element, null).display;
if ( element.currentStyle ) // IE
value = element.currentStyle.display;
if ( value != 'none' )
pageTracker._setVar('test_value'); // 除外用 Cookie の設定
}
</script>

最後に、ページが表示されたら上記のコードを実行するよう、body要素を変更する。

<body onload='javascript:hoge();'>

これで、logger にログインしているときにアクセスすると除外用 Cookie が設定されるようになる。まー正直、ここまでやんなくてもと自分でも思うが。

ただ Blogger にログインしているかどうかで処理を変えたいというのは需要がありそうな気もする。Blogger Developers Network を探したが、ログイン中だけコードを出力するようなタグや機能はなさそうだった。

Blogger にログインした状態でアクセスしたときだけ処理を実行する方法

2008/02/09 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Blogger にログインした状態でアクセスしたときだけ表示する方法の応用。

クイックエディットアイコンは以下の span 要素の内側にある。

<span class='widget-item-control'>
  <span class='item-control blog-admin'></span>
</span>

ログイン中だと内側の span 要素の display 属性が inline になり、ログインしていないときは none になっている。この状態をチェックすることで、ログインした状態でアクセスしたときだけ処理を実行することができる。

上記の要素には ID がないので、固有の ID をつけたものをテンプレートに直接埋め込んでおく。

<span class='widget-item-control'>
<span class='item-control blog-admin' id='hoge'></span>
</span>

次に、id='hoge' な要素の display 属性をチェックして、属性が none でないときに処理を実行するような JavaScript を書く。

<script type='text/javascript'>
function hoge() {
var element = document.getElementById('hoge'), value;
if ( window.getComputedStyle ) // Firefox, Opera
value = window.getComputedStyle(element, null).display;
if ( element.currentStyle ) // IE
value = element.currentStyle.display;
if ( value != 'none' ) {
// ここに実行したいコードを書く
}
}
</script>

getComputedStyle, currentStyle は、現在その要素に設定されているスタイルを取得するもの。

これで、ログイン中のときのみ、何らかの処理を実行させることができる。これを使って、Google Analytics で自己アクセスを除外するための Cookie を設定する方法を改良する。

詳細は次回

Blogger にログインした状態でアクセスしたときだけ表示する方法

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Blogger にログインした状態で自分のブログを見ると、各ウィジェットの右下にクイックエディットのアイコンが表示される。(テンプレートによっては表示されない場合もある)

ログインしていない状態ではクイックエディットのアイコンは表示されないが、HTML コード自体は出力されていて、display: none で見えなくなっているだけである。

クイックエディットアイコンは、次のような span 要素の内側にある。

<span class='widget-item-control'>
  <span class='item-control blog-admin'>
今 Blogger にログイン中です。
</span>
</span>

上記のようなコードを記述すれば、ログインした状態のときのみメッセージ等を表示させることができる。

Google Analytics のレポートから内部トラフィックを除外する方法

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Google Analytics ではフィルタ機能を使うことで内部アクセスを除外することができる。アクセス元を特定する方法としては3つの手段を提供している。

  1. ドメインからのトラフィックをすべて除外
  2. IP アドレスからのトラフィックをすべて除外
  3. カスタムフィルタ

企業や固定IP、ドメインを持つ場合は1または2で簡単に設定できる。そうではない場合は、ちょっと工夫がいる。

ネット環境が DSL だったり、FTTH 接続でも固定 IP じゃない場合は、自分の IP アドレスが変化するので IP 指定で除外しにくい。プロバイダによっては変化する IP アドレス範囲の特定が難しい場合もある。ドメイン名もしかり。
変化する IP アドレスの範囲が分かっていて、ご近所さん(そのIPアドレス範囲のユーザ)からのトラフィックも除外してしまって OK ならば、2の方法を使うことができる。

きっちり自分のトラフィックのみ除外したい!という人は、3のカスタムフィルタを選び、Cookie を設定することになる。ヘルプセンターに FAQ として設定方法が載っているが、フィルタパターンに何を入力すれば良いか説明がない。

Google ヘルプセンター: レポートから内部トラフィックを除外するにはどうすればよいですか。

結論は、test_value と入力すれば良い。
ヘルプでは以下のコードを埋め込むよう説明されているが、赤字の部分と同じ文字列を入力すればオッケー。

<body onLoad="javascript pageTracker._setVar('test_value');">

RHELでシングルユーザモードのログインにパスワードを要求する

2008/02/04 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

シングルユーザモードのときは、パスワードを求められないものと思っていたが、debianを使ってみてそうではないことを知った。sulogin と init (, inittab) がキーワード。

RHEL の sulogin の ManPage の説明。

sulogin は、シングルユーザモードの時、ユーザがシステムにアクセス可能となる前に、 /etc/init によって起動される。この機能は、init が適切に変更されているシステムか、あるいは /etc/inittab にシングルユーザ login のエントリがあるシステムでのみ利用できる。

... snip ...

このコマンドが利用できるようにするには、init が /bin/sh ではなく sulogin を呼ぶようになっているか、または inittab 中にシングルユーザ ログインに対する設定がされている必要がある。例えば、

co:s:respawn:/etc/sulogin /dev/console

という行を書いておけば、シングルユーザモードでは sulogin コマンドが実行される。

/etc/inittab の書式は id:runlevels:action:process なので、上記によれば /etc/sulogin が起動するプロセスになる。RHEL では /etc/sulogin はなく、/sbin/sulogin なので、正しくは以下。

co:s:respawn:/sbin/sulogin /dev/console   ・・・・・(1)

しかーし。上記ではうまく動かず。今度は init の ManPage を見てみる。ブートの項ではこう書かれている。

ランレベルを S または s にすると、システムはシングルユーザモードに入る。この場合は /etc/inittab ファイルを必要としない。シングルユーザモードでは、/dev/console で /sbin/sulogin が起動される。

さらに、ブートフラグの項ではこう書かれている。

ブートモニタ (例えば LILO) から init に様々なフラグを渡すことが可能である。 init は以下のようなフラグを受け付ける:

-s, S, single

シングルユーザモードでブートする。このモードでは /etc/inittab を
参照する。またシングルユーザモードのシェルが起動される前に
ブートアップ rc スクリプトが実行される。

まとめると、

  • ブートローダにオプションを渡してシングルユーザモードになるときは /etc/inittab が参照される
  • それ以外の場合は /etc/inittab は参照されない

となりそうだが、実際は常に /etc/inittab が参照されてるっぽい。本題の、「RHELでシングルユーザモードのログインにパスワードを求める」には、/etc/inittab にこう記述する。

~:S:wait:/sbin/sulogin   ・・・・・(2)

(1) ではだめで、(2) とすると期待した動きになる。

debian の場合、/etc/inittab に以下を記述するらしい(未確認)。

~~:S:wait:/sbin/sulogin

被はてなブックマーク数を表示する

2008/02/03 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

はてなの方に Blogger の場合のサンプルが載っているけど、情報が古いようで現在の Blogger では使えない。以下のようにするとおっけー。

<a expr:href='"http://b.hatena.ne.jp/entry/" + data:post.url'> <img alt='このエントリーを含むはてなブックマークを表示' expr:src='"http://b.hatena.ne.jp/entry/image/" + data:post.url' title='このエントリーを含むはてなブックマークを表示'/> </a>

ソーシャルブックマークへの追加ボタンをつける

| ラベル: , | 2 コメント | このエントリーを含むはてなブックマークを表示

各エントリにソーシャルブックマークへの追加ボタンをつける方法。

ソーシャルブックマークへの追加ボタンは AddClips で簡単に作成できる。Bloggerなら作成したコードを貼り付けるだけでOKらしいけど、そのまま貼り付けてもうまくいかなかったのでメモ。

AddClipsUrl    = &#39;<data:post.url/>&#39;;
AddClipsTitle  = &#39;<data:post.title/>&#39;;

URLとタイトルのところは上記のようにしたらうまくいった。他の部分も、シングルクォートは &#39; と文字実体参照で記述する。(コピペして保存すれば勝手に変換されたと思う)

あとはボタンの表示位置が微妙に上にずれていて見た目が良くないので、span要素でくくって位置調整。

.post-bookmark a img {
  vertical-align: bottom;
}

MS OfficeそっくりのオンラインOfficeアプリ

| ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Microsoft OfficeそっくりのオンラインOfficeアプリ。
Think Free Office

これもDeki wikiが利用している。 Think Freeをホストしているサーバにキャッシュとかで中身保存されていないのかちょっと心配。

全文検索エンジンApache Lucene

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Lucene(ルシーン)は Javaで書かれた全文検索のライブラリ。DekiWiki が利用している。
DekiWiki、もうちょっと軽快ならいいんだけどなー。

Lucene のサンプルコードなどは 関口宏司のLuceneブログ が充実している。Lucene本の著者さんですね。

リンク

fmlで受信メールサイズの制限をする

| ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

fml 3.0 (かなり古いが。。。)だと 7. SECURITY & FILTERING にてメール受信の最大サイズを設定できる。任意の値ではなく、あらかじめ決められた値の中から選択する形。

サーバ証明書のシリアル重複

| ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

IEでは無視されるが、NetscapeやFirefoxでは同一の証明機関から発行された証明書で同一のシリアル番号があった場合、無効になるらしい。ちゃんとした認証機関から発行してもらっている分には問題ないが、自己認証局でオレオレ証明書を作ってる場合はミスする可能性もあるかも。

Postfixで拡張アドレスを使う

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Gmail では

  • '.' (ドット)は無視される
  • '+' (プラス)以降は無視される

という規則があって、たとえば以下のメールアドレスは同じと解釈される。

  • foo.bar@gmail.com
  • foobar@gmail.com
  • foob.ar@gmail.com
  • foo.bar+abcdefg@gmail.com

Gmailユーザでは + を使ってアドレスを(擬似的に)複数使い分けている人も多いと思う。これと同じようなことを Postfix でも簡単に実現できる。

main.cf に以下を追加するだけで、上記の例のように + 以降を無視することができる。

recipient_delimiter = +

qmail でも同様の設定が可能とのこと。

不機嫌なエクスプローラ

| ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

ノートPCのエクスプローラがたまに(しょっちゅう)おかしくなる。壊れっぷりの一部を紹介。


メニューがなくなり、Windowsの旗マークがびよーんと。


メニューがツールとヘルプだけに。


もう、どうしろっての。。。

再起動すると直るので、システムリソース不足っぽい。

ログインプロンプトの表示を変更する

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

ログインプロンプトが表示されるとき、RHELでは画面がいったんクリアされるが、Debianではクリアされず以前の画面表示内容が残ったままになる。RHELで/etc/rc.localでメッセージを表示したい場合、画面がクリアされないようにログインプロンプトのオプションを変更する必要がある。

RHELのリファレンスマニュアルのブートプロセスの詳細を参照すると、

initコマンドがそのランレベルに適切なrcディレクトリを通過すると、/etc/inittabスクリプトは、ランレベルに割り当てられた各仮想コンソール(ログインプロンプト)用に /sbin/mingettyプロセスをフォーク(分岐)します。ランレベル2から 5は 6つの仮想コンソールをすべて持ちますが、ランレベル1(シングルユーザーモード)は1つしか持たず、ランレベル 0 とランレベル 6は仮想コンソールがありません。/sbin/mingettyプロセスは通信経路をttyデバイス[2]に対して開き、そのモードを設定、ログインプロンプトを表示、ユーザーのユーザー名とパスワードを受け取ってからログインプロセスを開始します。

とある。/etc/inittabに、ログインプロンプトを仮想コンソールに表示する/sbin/mingettyの記述があるということだ。

man mingetty でmingettyのマニュアルを見てみると、--noclear とか --noissue というオプションがあるのがわかる。おそらく Debian では --noclear オプションが指定されているのだろう。(未確認)

/etc/inittab を開き、tty1 の mingetty に --noclear オプションをつけて保存(必要に応じて他のttyも変更)。

表示させたいメッセージは /etc/rc.local に書くと良い。ログインプロンプトが表示される毎にメッセージを表示したいなら、/etc/issue に書く。

echo  
echo -e "\033[1mThis is sample message."
echo
echo "  sample sample sample"
echo -e "\033[0m"

\033[1m から \033[0m までの文字は強調表示される。

続・Gmail のフィルタ設定のキーワード欄を複数行にする

2008/01/29 | ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Gmail のフィルタ設定のキーワード欄を複数行にする では、新しいバージョンの Gmail で動かない。新しいバージョンでも動くようにしたときのメモ。

Firebug で見てみると、新しいバージョンの Gmail では、キーワードの入力欄の name 属性値が設定されていないことがわかる。
id は設定されているのだが、これが可変のようでうまくいかない。
かわりに tabindex 属性が使えそうだなと思ったら、既に投稿されていた。

新バージョンになっていない日本語表示でも使う場面がまだあるので、上記サイトの情報と以前の input[name="cf1_has"] を組み合わせて以下のようにしてみた。

@-moz-document domain(mail.google.com) {
input[name="cf1_has"],
input.MtafId[tabindex="54"],
input.MtafId[tabindex="5"] {
display: none;
-moz-binding: url(http://persistent.info/files/gmail-filter.xml#filter);
}
}

これで OK、と思ったら、表示は拡張されてもボタンが効かなくなった。。。
入力欄の id が書き換えによってなくなってしまうからだ。

-moz-binding のところで指定されているファイル(XBL ファイルというものらしい)を修正する必要がある。XBL ファイルに以下のように赤字部分を追加。

<?xml version="1.0"?>  
<bindings xmlns="http://www.mozilla.org/xbl">  
  <binding id="filter" styleexplicitcontent="true">
    <implementation>
      <constructor>
        var textarea = document.createElement("textarea");
        
        textarea.name = this.name;
        textarea.id = this.id;
        textarea.value = this.value;
        textarea.style.width = "100%";
        textarea.style.fontFamily = "monospace";
        textarea.style.fontSize = "14px";
        textarea.rows = 15;
        this.parentNode.replaceChild(textarea, this);
      </constructor>
    </implementation>
  </binding> 
</bindings>

XBLファイルをローカルで動かしている Apache から参照できるように配置、-moz-binding の URL を変更。新旧両方のバージョンで動くことを確認した。

XBLファイルの置き場所はローカルでもWebサーバ上でも良いみたいだが、ローカルに置いてみたところ、セキュリティエラーが発生して動作しなかった。プロファイルフォルダとかクロムフォルダの下に突っ込めばいいのかな。誰か教えてください。

本家が XBLファイルを更新してくれれば一番なんだけど。

(2008年2月3日追記)

C:\Program Files\Mozilla Firefox\chrome に XBL ファイルを置いて

-moz-binding: url(resource:///chrome/gmail-expand-filter.xml#filter);

とすると Webサーバも不要でいい感じ。

フライアウェイ

2008/01/21 | ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

少年マガジンで「ベイビーステップ」というテニス漫画が連載されているが、 tennis365 というテニス専門サイトでベイビーステップのひとコマを使った 吹き出しコンテスト なるものが行われている。

パッと思いついたネタがこれ。

元ネタはゴッドタンです。

debian で時間が 9時間ずれる

2008/01/16 | ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

ちょうど 9時間進んだ状態になっている。BIOS 画面で JST の時刻に合わされているのを確認しているので、UTC を使用するようになっている模様。RHEL でいうところの「システムクロックで UTC を使用」を選んだのと同じかな。タイムゾーンは「Asia/Tokyo」になっているので、UTC を使うようになっているのだろう。debian では /etc/default/rcS にその設定があるということなので、変更。

UTC=no

OS をリブートしたが、変わらず。。。ハードウェアクロック(BIOSの時刻)にシステムクロックが反映されてしまったようだ。BIOS で時刻を正しく設定し直して、解決。

ちなみに、タイムゾーンは tzconfig コマンドで確認、変更できる。

Linux で暗号化ファイルシステムを使う

| ラベル: , | 0 コメント | このエントリーを含むはてなブックマークを表示

Linux でファイルシステムを暗号化する必要があったので試してみたメモ。

Linux, 暗号化, ファイルシステムでググると debian の情報が多くヒットした。debian はインストール時に暗号化ファイルシステムを選べるようだ。ということで初めて debian を使ってみた。

debian のパーティション設定ツールが使いづらい

RHEL などの DiskDruid と比べて非常に使いづらく感じた。LVMとか暗号化ボリュームとか、内部に論理パーティションを作ると削除できないし。仕方なしに別のターミナルからコマンドで削除するはめに。。暗号化ボリュームのキーとして「乱数値」が選べるが、パッケージ不足とやらで作成できず。ネットワークインストールだったからかも。とりあえずキーはパスフレーズにしてなんとかインストール完了。

暗号化ボリュームのマウント

パーティションはこんな感じ。

- /boot (ext3)
- 暗号化ボリューム
  - LVM
    - swap
    - /home (ext3)
- LVM
  - / (ext3)

暗号化ボリューム内に LVM で swap と /home を作成した。ブート時(というか暗号化ボリュームのマウント時)にパスフレーズの入力を求められる。正しいパスフレーズを入力するとマウントされる。

パスフレーズの入力なしに暗号化ボリュームをマウントする

パスフレーズ以外に、キーファイルを読み込ませて認証(ん?認証という言い方でよいのか?)することもできる。

キーファイルの生成
# dd if=/dev/urandom of=/boot/keyfile bs=1 count=1024

乱数を使って 1024バイトのファイルを生成。これをキーファイルとして使う。 キーファイルは暗号化ボリュームでないところに置く。今回は /boot に置いた。

キーファイルの登録

作成したキーファイルをキーとして登録する。

# cryptsetup luksAddKey /dev/sda5 /boot/keyfile
Enter any LUKS passphrase:   ←最初のパスフレーズを入力
key slot 0 unlocked.   ←「slot 0」のパスフレーズで解除した
Command successful.

キーファイルが登録されたか確認。

# cryptsetup luksDump /dev/sda5
LUKS header information for /dev/sda5

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 2056
MK bits:        256
MK digest:      de e1 10 fe 4b d9 a0 b7 20 ff 7e cb aa 4d 36 a1 bf 85 92 8a
MK salt:        ee 56 07 6a 24 ca 83 f2 57 97 83 1d 74 c2 ce f6
         5c 35 ee 07 e8 02 05 7e 84 f0 ec 00 77 21 39 5d
MK iterations:  10
UUID:           62c33609-06cd-48d8-a5d7-214df4fa9057

Key Slot 0: ENABLED
 Iterations:             115017
 Salt:                   3f dc 4b cc 61 81 64 89 17 02 b5 bc c6 ae c8 93
                         e0 e9 f2 be 9a f9 74 24 3e 7f 1b be 6e 53 b1 6a
 Key material offset:    8
 AF stripes:             4000
Key Slot 1: ENABLED
 Iterations:             65900
 Salt:                   06 20 15 74 24 36 bd 71 8c a7 e2 66 9b e5 2a 8b
                         21 53 4a 89 36 e9 5d a2 c6 63 4c 1b 5d d1 9d c4
 Key material offset:    264
 AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

slot 1 にキーファイルが登録された。

登録したキーファイルでマウントできることを確認する

今はマウントしている状態なので、アンマウントする。 今回の構成では、 暗号化ボリューム → LVM → ファイルシステム という階層で構成されているので、逆順でアンマウントしていく。

# umount /home
# swapoff -a
# lvchange -a n /dev/VolGroup00/home
# lvchange -a n /dev/VolGroup00/swap
# cryptsetup luksClose /dev/mapper/sda5_crypt

登録したキーファイルで sda5_crypt をマウントする。

# cryptsetup luksOpen /dev/sda5 sda5_crypt --key-file /boot/keyfile
key slot 1 unlocked.
Command successful.

キーファイルでマウントできることが確認できた。swap と /home をマウントしておく。

# lvchange -a y /dev/VolGroup00/home
# lvchange -a y /dev/VolGroup00/swap
# mount /home
# swapon -a

暗号化ボリュームを自動でマウントする

OS起動時に自動でマウントできるように設定する。

/etc/default/cryptdisks を編集。

# Mountpoints to mount, before starting cryptsetup. This is useful for
# keyfiles on removable media. Seperate mountpoints by space.
CRYPTDISKS_MOUNT="/boot"

/etc/crypttab を編集。

sda5_crypt /dev/sda5 /boot/keyfile luks

自動マウントできるかテストする。まず暗号化ボリュームを再度アンマウントする。 次に、/etc/init.d/cryptdisks を実行する。

# /etc/init.d/cryptdisks start
Starting remaining crypto disks... sda5_crypt(starting)INSECURE MODE FOR /boot/keyfile, see /usr/share/doc/cryptsetup/README.Debian.
key slot 1 unlocked.
Command successful.
done.

INSECURE だ、と警告が出たが、マウントは問題なし。README.Debian に書いてあるようにキーファイルのパーミッションを 400 にすると、警告は出なくなった。

# chmod 0400 /boot/keyfile
# /etc/init.d/cryptdisks start
Starting remaining crypto disks... sda5_crypt(starting)key slot 1 unlocked.
Command successful.
done.

あとは OS 再起動で自動マウントされることを確認して終わり。

参考

じゃがポックル入手

| ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

会社の上司からじゃがポックルをもらいました。地元北海道でもなかなかお目にかかれないとか。
なかなか美味でした。

じゃがポックル

Windows Live Writer がサポートするブログプロバイダ

2008/01/13 | ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

バージョン 2008 (Build 12.0.1367.1128) ja のもの。

Gmail のフィルタ設定のキーワード欄を複数行にする

| ラベル: , , | 0 コメント | このエントリーを含むはてなブックマークを表示

Stylish を使って Gmail のフィルタ設定のキーワード欄を複数行にする。

@-moz-document domain("mail.google.com") {  
input[name="cf1_has"] {   
  display: none;   
  -moz-binding: url(http://persistent.info/files/gmail-filter.xml#filter);   
}   
}

改行も保存されるので編集しやすい。

(追記)
新しいバージョンの Gmail に対応したものはこちら。
続・Gmail のフィルタ設定のキーワード欄を複数行にする

参考

日本語版 Gmail が IMAP に対応

| ラベル: | 0 コメント | このエントリーを含むはてなブックマークを表示

いつの間にか、言語を日本語にしていても設定画面に IMAP 機能が表示されるようになった。