.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
であることが分かる。

Mac OS Xでobjdump、ldd

objdumpは、MacPortsでbinutilsをインストールすると、gobjdumpという名前で同等のものが使用できる。(頭にgが付く。)

$ sudo port install binutils

インストールされたコマンドを確認。

$ port contents binutils
Port binutils contains:
  /opt/local/bin/gaddr2line
  /opt/local/bin/gar
  /opt/local/bin/gc++filt
  /opt/local/bin/gelfedit
  /opt/local/bin/gnm
  /opt/local/bin/gobjcopy
  /opt/local/bin/gobjdump
  /opt/local/bin/granlib
  /opt/local/bin/greadelf
  /opt/local/bin/gsize
  /opt/local/bin/gstrings
  /opt/local/bin/gstrip
(以下略)

lddの代わりは、otool -L

$ otool -L /bin/ls
/bin/ls:
	/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
	/usr/lib/libutil.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

screenコマンド

エスケープキャラクタ(コマンド文字)を変更するには

デフォルトだとC-aだが、これだと行頭への移動にC-aが使えなくなってしまう。
変更するには、~/.screenrcに

escape ^Zz

と指定する。(上記では、エスケープキャラクタをC-z、C-zを入力するためのキーシーケンスをC-z zに設定している。)

スクロールする

<コマンド文字> esc または <コマンド文字> [ でコピーモードにすると、viと同じキーシーケンス(C-b、C-f)でスクロールできる。
コピーモードから抜けるには、escキーを押す。

スクロールバック行数を増やす

コピーモードではviと同じキーシーケンスでスクロールできるが、デフォルトではバックスクロールできる行数は100行。これを増やすには、~/.screenrcに

defscrollback 10000

などと設定する。

文字化け対策

UTF-8モードでscreenを動作させるため、~/.bashrcなどに以下のaliasを設定しておくとよい。

alias screen='screen -U'

screenのmanページより

       -U   UTF-8 モードで screen を動作させる。このオプションは、ユーザの端末が UTF-8 エンコードされた文字を理解し、また送信してくることをscreen に伝える。また新規ウィンドウのデフォルトエンコーディングが 'utf8' になる。

現在のエンコーディングは、<コマンド文字> i で分かる。
例: C-z i (コマンド文字がC-zの場合)

       C-a i
       C-a C-i     (info)        現在のウィンドウに関する情報を表示する。

RVMが動作するようにするためには

screen上でRVMが切り替えられない。
RVMが動作するようにするには、~/.screenrc に

shell -${SHELL}

RVM: Ruby Version Manager - RVM inside Screen
USING SCREEN EXAMPLE part1

'xterm-256color': unknown terminal type.

Mac OS X Lion のターミナルで、Ubuntu(8.04 LTS)を操作していたら、
'xterm-256color': unknown terminal type.
というエラーが発生。

# top
'xterm-256color': unknown terminal type.

■解決方法
Ubuntuに、ncurses-term パッケージをインストールする。

# aptitude search ncurses-term
p   ncurses-term                    - Additional terminal type definitions
# aptitude install ncurses-term

'xterm-256color': unknown terminal type. | Erik Osterman