03
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
calendar_bottom
RSS | ATOM | ADMIN

badulog

日々の覚書と雑記
ENTRY TOP
スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | - | - | - |
ENTRY BOTTOM ENTRY TOP
VRRP Virtual Router Redundancy Protoc
ルータ冗長化でVRRPを使っているらしい。

http://itpro.nikkeibp.co.jp/article/COLUMN/20061006/250115/?P=1&ST=techskill
http://www.alaxala.com/jp/support/manual/AX2000R/HTML/KAISETS2/0093.HTM

下の方を見ると
仮想ルータのMACアドレスは,00-00-5E-00-01-{仮想ルータのID}に決められており,仮想ルータのIDから自動的に生成されます。

と書いてあったので覗いてみた。

[root@xxxx ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
・・・・・
default 111.11.11.94 0.0.0.0 UG 0 0 0 bond0



[root@xxxx ~]# arp
Address HWtype HWaddress Flags Mask Iface
・・・
111.11.11.94 ether 00:00:5E:00:01:02 C bond0
・・・


ほんまや。※IPアドレスはウソ

baduizm | 用語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C]SIGPIPE抑止のflag
sendとrecvのflag引数にMSG_NOSIGNALを指定すれば
相手不在の時もSIGPIPE出さないらしい。ただしEPIPEを返すのは返すと。
■ man send
MSG_NOSIGNAL
Requests not to send SIGPIPE on errors on stream oriented sockets when the other end breaks the connection. The EPIPE error is still returned.

■ man recv (こっちは載ってない場合もあり)
MSG_NOSIGNAL
This flag turns off raising of SIGPIPE on stream sockets when the other end disappears.


使いかたはこんな感じ
size = recvfrom (fd,msg,len,MSG_NOSIGNAL,from_p,fromlen_p);
baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C] 型定義でヘッダをたどるより良い方法
例えば
#include

int main {
size_t sizet;
ssize_t ssizet;
}

size_tとかssize_tが何者か?と調べるときに/usr/include配下をgrepしまくるよりも
簡単な方法
gcc -E aaa.c > bbb.c

ってやると必要なヘッダを展開するようだ。
ちなみにbbb.cは473行。

bbb.cの中だけを探すと
typedef __ssize_t ssize_t;
__extension__ typedef int __ssize_t;

とか
typedef unsigned int size_t;

なことが分かる。

man gcc
-E プリプロセス処理が終了したところで停止します。コンパイルはしま
ん。出力はプリプロセス済みのソースコードであり、標準出力へと送ら
れます。
baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[bash] ヒアドキュメントで変数展開したくない
bashでヒアドキュメントを使う場合
$ cat <<_EOT_
> $PATH
> $PWD
> _EOT_
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sunone/bin
/home/sunone

普通にやると変数展開されてしまう。というかする。
変数展開したくない場合は、
終了文字を「'終了文字'」といったようにシングルクオートで囲むか、「¥終了文字」といったようにバックスラッシュでエスケープする。


こんな感じで
[baduizm@host ~]$ cat << '_EOT'
> $PATH
> _EOT
$PATH


と、ちゃんと$PATHなどとそのまま出力してくれるのだ。
baduizm | linux | - | - | - |
ENTRY BOTTOM ENTRY TOP
[C] sem_nsemsフィールドを%dでprintfしたら警告
semid_ds構造体のsem_nsemsフィールドを%dでprintfしようとして
make LOMCHK=ON で警告をくらった。

JMみると
struct semid_ds {
struct ipc_perm sem_perm; /* 所有権と許可 */
time_t sem_otime; /* 最後の semop の時刻 */
time_t sem_ctime; /* 最後に変更が行われた時刻 */
unsigned short sem_nsems; /* 集合内のセマフォの数 */
};

らしい。
ためしに/usr/includeでgrepしてみると2つかかった。
(1) bits/sem.h
/* Data structure describing a set of semaphores. */
struct semid_ds
{
struct ipc_perm sem_perm; /* operation permission struct */
__time_t sem_otime; /* last semop() time */
unsigned long int __unused1;
__time_t sem_ctime; /* last time changed by semctl() */
unsigned long int __unused2;
unsigned long int sem_nsems; /* number of semaphores in set */
unsigned long int __unused3;
unsigned long int __unused4;
};

(2) linux/sem.h
/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct semid_ds {
struct ipc_perm sem_perm; /* permissions .. see ipc.h */
__kernel_time_t sem_otime; /* last semop time */
__kernel_time_t sem_ctime; /* last change time */
struct sem *sem_base; /* ptr to first semaphore in array */
struct sem_queue *sem_pending; /* pending operations to be processed */
struct sem_queue **sem_pending_last; /* last pending operation */
struct sem_undo *undo; /* undo requests on this array */
unsigned short sem_nsems; /* no. of semaphores in array */
};

どうやらunsigned shortの方は古いglibcとのコンパチのためらしい。
ムムムと思って良くJM見ると
構造体 semid_ds 内の多くのフィールドは、 Linux 2.2 では short 型だったが、Linux 2.4 では long 型になった。この利点を生かすには、glibc-2.1.91 以降の環境下で再コンパイルすれば十分である。カーネルは新しい形式の呼び出しと古い形式の呼び出しを cmd 内の IPC_64 フラグで区別する。


と書いてあった。。
しかしprintfのlong long intとかのprintfフォーマットが良く分からない。


baduizm | C言語 | - | - | - |
ENTRY BOTTOM ENTRY TOP
[linux] qmailログの時刻表示 - TAI64N形式 -
/var/qmail/log/qmail/current
を普通にless -r するとこんな感じ。
@40000000482ba75612995c34 status: local 1/10 remote 0/20
@40000000482ba756129967ec delivery 89051: success: did_1+0+0/
@40000000482ba756129967ec status: local 0/10 remote 0/20


@で始まるのはTAI64N 形式で表したタイムスタンプとのこと。
いつもの感じで見るには、tai64nlocal コマンドで
# tai64nlocal < /var/qmail/log/qmail/current | less -r
2008-05-15 12:00:28.312040500 status: local 1/10 remote 0/20
2008-05-15 12:00:28.312043500 delivery 89051: success: did_1+0+0/
2008-05-15 12:00:28.312043500 status: local 0/10 remote 0/20

こんな感じで。

baduizm | linux | - | - | - |
ENTRY BOTTOM ENTRY TOP
[linux] ipv6のNDキャッシュ(v4のarpテーブル)をみる方法

ipコマンドでできる
[root@xxx ~]# ip -6 nei
fe80::1 dev bond0 lladdr 00:0b:5f:10:d8:20 router nud stale


ちなみに
"ip [-6] route" ≒ "route [-f inet6]"
であったりipコマンドは実はすごい。

ちなみにのちなみに
≒は「きんじ」で変換できる

baduizm | linux | - | - | - |
ENTRY BOTTOM ENTRY TOP
[linux] manが文字化け
LANGを指定しても、LESSCHARSETを指定しても、manが文字化けしてしまう。

■ 案1 : 環境変数で対処
export PAGER="less -r"

を各自の.bash_profileとかに書いてもらう

■ 案2 : /etc/man.config
[zzzzz@xxx yyy]$ diff /etc/man.config /etc/man.config.org
108,109c108
< PAGER /usr/bin/less -irs
---
> PAGER /usr/bin/less -iRs

大文字R -> 小文字r へオプション変更


今回は案2を採用。

baduizm | linux | - | - | - |
ENTRY BOTTOM ENTRY TOP
[perl] 特殊変数
baduizm | perl | - | - | - |
ENTRY BOTTOM ENTRY TOP
[perl] perlワンライナーその2
単純だけど便利だ

ここから

[数値変換]
入力された10進数を16進数に変換して表示します。CTRL-Cで終了
perl -ne 'printf "%x¥n",$_'

入力された10進数を8進数に変換して表示します。CTRL-Cで終了
perl -ne 'printf "%o¥n",$_'

入力された16進数を10進数に変換して表示します。CTRL-Cで終了
perl -ne 'print hex($_)."¥n"'

入力された8進数を10進数に変換して表示します。CTRL-Cで終了
perl -ne 'print oct($_)."¥n"'

簡易電卓として計算できます。CTRL-Cで終了
perl -ne 'print eval($_)."¥n"'
baduizm | perl | - | - | - |
ENTRY BOTTOM