Pistolfly のすべての投稿

Software Engineer in Tokyo, Japan

電子署名でダウンロードファイルを検証

gnupgがインストールされているか確認。

$ yum list installed gnupg
Loaded plugins: fastestmirror
Installed Packages
gnupg.x86_64                     1.4.5-14.el5_5.1                      installed

インストールされていなければインストール

$ sudo yum install gnupg

※Mac OS X の場合は、MacPortsでgnupgをインストールできる。
設定ファイルを初期化する。
--list-keysはgpgに登録されている公開鍵を表示するコマンド。
初回実行時に設定ファイルが自動的に作成される。

$ gpg --list-key
gpg: ディレクトリー「/home/pistolfly/.gnupg」ができました
gpg: 新しい構成ファイル「/home/pistolfly/.gnupg/gpg.conf」ができました
gpg: 警告: 「/home/pistolfly/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/home/pistolfly/.gnupg/pubring.gpg」ができました
gpg: /home/pistolfly/.gnupg/trustdb.gpg: 信用データベースができました

~/.gnupg/gpg.conf を編集。

$ vi ~/.gnupg/gpg.conf 

以下の部分のコメントを外して、公開鍵を鍵サーバから自動的に取得できるようにする。

#keyserver-options auto-key-retrieve

 ↓

keyserver-options auto-key-retrieve

ダウンロードファイルの真正性を確認する

gpg --verify <電子署名ファイル>

例:

$ ls emacs*
emacs-23.3a.tar.gz emacs-23.3a.tar.gz.sig
$ gpg --verify emacs-23.3a.tar.gz.sig 
gpg: 2011年08月03日 00時39分07秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: 鍵BC40251Cをhkpからサーバーsubkeys.pgp.netに要求
gpg: 鍵BC40251C: 公開鍵"Chong Yidong <cyd@stupidchicken.com>"を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg:     処理数の合計: 1
gpg:           読込み: 1
gpg: "Chong Yidong <cyd@stupidchicken.com>"からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: AF1A 0574 841E 0F2D EDE2  829A 764D A716 BC40 251C

gpg: "Chong Yidong <cyd@stupidchicken.com>"からの正しい署名
とあるので、OK。
gpg: 警告: この鍵は信用できる署名で証明されていません!
は、公開鍵を信頼していない状態なので表示されている。

制御文字の入力方法

Emacs

C-q 制御文字

例: エスケープ文字を入力

C-q C-[

シェル、vim

Ctrl+V 制御文字

例: エスケープ文字を入力

Ctrl+V Ctrl+[

コントロールキーと同時に押す文字は?

上記で「制御文字」と記載しているところは、Ctrl+(コントロールキーと同時に押す)で送出するが、この時のコントロールキーと同時に押す文字は、入力したい制御文字の7ビット目に1をセット、つまり0x40(64)を足した文字である。
man ascii 等でASCII文字の一覧を表示して探す。

例:
エスケープ文字は0x1B(27)
7ビット目に1をセットする=0x40(64)を足すと0x5B(91)
0x5B(91)は[
よってエスケープ文字を送出するにはCtrl+[

改行は0x0A(10)
7ビット目に1をセットする=0x40(64)を足すと0x4A(74)
0x4A(74)はJ
よって改行を送出するにはCtrl+J

https://ja.wikipedia.org/wiki/ASCII#ASCII.E5.8D.B0.E5.AD.97.E5.8F.AF.E8.83.BD.E6.96.87.E5.AD.97

なお、印字可能文字のうち「@」から始まる32文字については、ASCII値を64減じて対応する制御文字を求め、この制御文字を「コントロール+」(英: control+)という前置表現を付けた印字可能文字で表記する慣習がある。

例:BELコード(07) →「コントロール+G」(受信した側の機器で注意喚起音が鳴る)

この制御文字の表記方法は、キーボード上の印字可能文字キーを制御文字の送出に用いていた機器の名残りであると考えられる(7ビット目を0にセットする専用キー(Ctrlキー)を、印字可能文字キーと同時に押して制御文字を送出)。

エスケープ文字の入力方法 - nelnalog.note

tune2fsでfsckのタイミングを設定する

久しぶりに再起動しようとしたら、強制的にfsckが始まってしまい、なかなか起動しない。
ext2/ext3/ext4ファイルシステムでfsck(実際にはe2fsck)のタイミングを設定、表示するには、tune2fsを使う。

表示

# tune2fs -l /dev/sda1
・・・(略)
Mount count:              7
Maximum mount count:      27
Last checked:             Fri Oct 21 03:41:32 2011
Check interval:           15552000 (6 months)
Next check after:         Wed Apr 18 03:41:32 2012
・・・(略)

自動チェックを停止する

# tune2fs -c 0 -i 0 /dev/sda1 
tune2fs 1.39 (29-May-2006)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds

確認

# tune2fs -l /dev/sda1
・・・(略)
Mount count:              7
Maximum mount count:      -1
Last checked:             Fri Oct 21 03:41:32 2011
Check interval:           0 (<none>)
・・・(略)

Source: tune2fs でfsckを制御 - ike-daiの日記

MacPorts で特定のパッケージのみ除外する

$ sudo port upgrade outdated

とやると、アップデートのあるportsをすべてまとめてアップグレードできるが、特定のportsはアップグレードしたくない場合は、以下のように演算子を使って指定できる。
例: PHP関連はアップグレードしたくない場合

$ sudo port upgrade outdated and not php*

Excluding packages from MacPorts operations | The Gippy Pages

.NETのHttpWebRequest.GetResponseでステータスコードが4xxの場合にエンティティボディを取得する

最初できないかと思ったけど、WebExceptionのResponseプロパティで取得できた。
HttpWebRequest.GetResponse()は、ステータスコードが2xx以外の場合は例外WebExceptionをスローするようである。例外をcatchしてResponseを見ればよい。

try
{
    using (HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse()) {
        // ...
    }
}
catch (WebException e)
{
    using (HttpWebResponse response = (HttpWebResponse)e.Response) {
        // ...
    }
}

.Net HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned - Stack Overflow

Postfixで転送失敗時にエラーメールが送信者に送信されないようにする

Postfixで、aliasesや.forwardで転送設定した場合に、転送がエラーになると、元の送信者にエラーメールがいってしまう。
これを防ぐ一番簡単な方法は、転送先をsendmailコマンドへのリダイレクトにして、-fオプションでエンベロープ送信者を変更すること。

| /usr/sbin/sendmail -f <エンベーロープ送信者> <転送先アドレス>

のように設定する。

例:

/etc/aliases

foo: foo, "| /usr/sbin/sendmail -f bar xxx@example.com"

sendmailコマンドの-fオプションは、エンベロープ送信者の指定。
エラーメールはエンベロープ送信者(上記の例ではbar)に送信されるので、これで元の送信者にエラーメールはいかなくなる。

エラーメールの送信がループしないよう注意は必要。
上記の例ではbarの転送先が最終的にfooにならないようにする。

[postfix-jp:01469] Re: [Q] .forward で転送失敗のメールを送信者に知らせたくない

システムデータ型などtypedefされた型の実際の型を調べる

gdbのptypeを使うのが簡単。
例えば、以下のfoo.c。

#include <sys/types.h>
struct st { int i; char c; };
typedef int Array[10];
typedef struct st St;
int main(void)
{ 
  size_t s1;
  ssize_t s2;
  pid_t pid;
  Array arr;
  St st1;
  return 0;
}
$ gcc -Wall -g -o foo foo.c
$ gdb foo
(gdb) b main
(gdb) run
(gdb) ptype s1
type = long unsigned int
(gdb) ptype size_t
type = long unsigned int
(gdb) ptype s2
type = long int
(gdb) ptype ssize_t 
type = long int
(gdb) ptype pid
type = int
(gdb) ptype pid_t
type = int
(gdb) ptype arr
type = int [10]
(gdb) ptype Array 
type = int [10]
(gdb) ptype st1
type = struct st {
    int i;
    char c;
}
(gdb) ptype St
type = struct st {
    int i;
    char c;
}

のように、
ptype 式や型名
で実際の型が表示される。
配列の場合はサイズが表示されるし、構造体の場合はメンバの型が表示されるので便利。
以下のように、gccの-Eオプションでプリプロセッサの出力調べても分かりそうだが、面倒くさいし、追い切れないかもしれない。

$ gcc -E foo.c | grep ssize_t
typedef long int __ssize_t;
typedef __ssize_t ssize_t;
(以下略)

このシステム(x86_64 GNU/Linux)では、ssize_tは
__ssize_t => long int

$ gcc -E foo.c | grep ssize_t
typedef long __darwin_ssize_t;
(中略)
typedef __darwin_ssize_t ssize_t;
(以下略)

このシステム(Mac OS X)では、ssize_tは
ssize_t => __darwin_ssize_t => long
であることが分かる。