ブログ停滞した。軽く書く。
大変失礼なこと書きますが、あか抜けない印象の ITPro のページ。「今日の腕試し!」
なぜこのページにたどり着いたのかよく覚えてないけど、とにかくプラットフォーム、レイヤーを問わず雑多な問題が提供されていて面白かった。なぜか微笑がこぼれた。週に一回くらい見てもよいんじゃなかろうか。
ブログ停滞した。軽く書く。
大変失礼なこと書きますが、あか抜けない印象の ITPro のページ。「今日の腕試し!」
なぜこのページにたどり着いたのかよく覚えてないけど、とにかくプラットフォーム、レイヤーを問わず雑多な問題が提供されていて面白かった。なぜか微笑がこぼれた。週に一回くらい見てもよいんじゃなかろうか。
拾い読みしてまとめた。
/procを使って読み書きができた。CentOS-6(kernel 2.6.32-279)では"CUBIC"がデフォルトになっている模様。
# cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
選択肢としては、"reno"もある。
# cat /proc/sys/net/ipv4/tcp_available_congestion_control
cubic reno
'/etc/init.d/' に入れるスクリプトを書こうと思ったとき、そのひな形(スケルトン、テンプレート、等々)を求めてついインターネットを検索してしまう。しかし、無駄にエネルギーを消費する必要はない。システムにあらかじめインストールされているのだった。
そのパスは、'/usr/share/doc/initfiles-x.y.z/sysvinitfiles' のあたり(CentOS の場合)。
すごく簡単なことだけどなかなか覚えられないのでメモっておく。
例)cat /etc/redhat-release Red Hat Enterprise Linux Client release 5.2 (Tikanga)
yumdownloader
というコマンドがあるんですね(特に'--resolve'オプションが便利)。
LinuxをインストールしたけどNICのドライバがあたらない。yum も使えない、といった状況で役に立つかな? つまり、ドライバのビルドに必要なパッケージを別の計算機でダウンロードして、USBメモリで移す、とか。。。
CentOS-6.3 で LDAPサーバーを作ろうとしたところ、次のようなエラーが出てどうもうまくいかなかった:
ldap_bind invalid credentials (49) ldapsearch
bdb_db_open no such file or directory
ネットを探してみると、CentOS-6 での OpenLDAP について書いているブログが多数あった。つまりつまずくポイントが色々あるということか:
だが、これらの内容を俯瞰してみるとけっこうバラツキがあって、腑に落ちない感じがした。さらにしつこく探してみると、よく整理された英語のページがみつかった:
"Minimal"とうたっているだけあって必要十分な手順が書いてあり、要所でのテスト(設定途中での動作確認)も理解を助けてくれる。うちの CentOS-6.3 でもうまくいった。
Small で light weight な Linuxディストリビューション。
Webアプリとかそういうレベルではなくて、OS込みのプロダクトを、要するにハードウェアに直接インストールする形態の製品を提供したいときに使えるんじゃないかと思う。
よく使う Firefox add-on のひとつが、 iMacros なるもの(厳密には名前の右肩にTMが付く)。browser-based macro recorder
であり、Webブラウザを使った操作を記録&再生することができる。
で、今日メモっておきたいのは、iMacros と JavaScript を組み合わせる方法について。iMacros のマクロはいくつかのコマンドからなっているが(Command Reference - iMacros に掲載されている)、一般的なプログラミング言語が提供するような関数や制御構造、データ構造をもたない。そこを JavaScrpt で補完しよう、という話。
環境は Firefox 14.0.1, iMacros for Firefox 7.5.0.4.
VERSION BUILD=7500718 RECORDER=FX TAB T=1 URL GOTO=https://www.google.co.jp/ TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:f ATTR=ID:lst-ib CONTENT=foo
fooの部分が検索した文字列に相当する。
TAB OPEN
と TAB T={{!VAR1}}
を追加する。{{!VAR1}}
はタブの番号を指定するために導入した変数。fooを
{{!VAR2}}
と置換。VERSION BUILD=7500718 RECORDER=FX TAB OPEN TAB T={{!VAR1}} URL GOTO=https://www.google.co.jp/ TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:f ATTR=ID:lst-ib CONTENT={{!VAR2}} TAG POS=1 TYPE=INPUT:BUTTON ATTR=VALUE:Google<sp>検索
iimSet, iimPlay
という2つのインターフェースを利用してJavaScriptを書く。具体的には、マクロに導入した変数 {{!VAR1}}
に、タブ番号を iimSet()
という関数でセット。それから配列にはいっている文字列 foo, bar, baz を {{!VAR2}}
にセット。最後に、iimPlay()
で my.lim を実行する。var a = ['foo', 'bar', 'baz']; for(var i=0, n=a.length; i<n; i++){ iimSet("VAR1", i + 1); iimSet("VAR2", a[i]); iimPlay("my"); }
読み込みは 'iflag=direct'オプション、書き込みは 'oflag=direct'オプション を指定する。
性能テスト等のときに使えるかも。
今日、Fedora-17 をうちのPCにインストールした。CD-RW, DVD-RWメディアが手元になかったのでUSBメモリを使った。USBメモリへの書き込みには、MacBook(Mac OS X)を使った。ただそれだけの話。しかしながら、いくつかの情報を必要としたのでメモしておく。
まずはハードウェア、なかでもCPUやマザーボードの仕様が分からないといけない。
CPUはAMD Phenom II 64bit で、マザーボードは ASRock の 880GM-LE。このマザーボードは BIOS を使っているモデル(UEFIではない、という点が重要)。
※ASRockのマザーボードAMD8シリーズのリストはこれ:ASRock AMD8
Fedora の場合、「Full Distribution」, 「Live Image」,「Minimal Boot Media」の3つの選択肢がある。今回は、必要なパッケージをあとから追加するスタイルでゆくから Minimal Boot Media がいい。
Minimal Boot Media のISOファイルは「boot.iso」という名前で配布されており、今回はこれで十分。一方、対象のマザーボードがUEFIを使用している場合は注意が必要で、「efiboot.img」を Full Distribution の中から抽出しなければならないらしい。
boot.iso は配布用サーバーの「fedora/linux/releases/17/Fedora/arch/os/images/boot.iso」といったパスに配置されている。
MacにUSBメモリを挿して、ISOイメージを書き込む。Fedoraのドキュンメントにddコマンドを使った方法が掲載されているので、これに基づいてやればよい。Linuxを前提として書かれているが、Macにもddコマンドがあるのでそれほど大きな差はない(Mac OS X のコマンドである diskutil を使う点が異なる)。
整数を2進数や16進数で表す方法は?
リファレンスマニュアルをひいたらちゃんと書いてありました。
The syntax for integers in bases other than 10 uses ‘#’ followed by a letter that specifies the radix: ‘b’ for binary, ‘o’ for octal, ‘x’ for hex, or ‘radixr’ to specify radix radix. Case is not significant for the letter that specifies the radix. Thus, ‘#binteger’ reads integer in binary, and ‘#radixrinteger’ reads integer in radix radix. Allowed values of radix run from 2 to 36. For example:
#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44
#{radix}r
という表現で2から36までの任意の基数を指定できる、という機能は初めて知った。面白い。
ちなみに上の例は Emacs Lisp だけでなくて Common Lisp でも機能した(SBCL-1.0.55 だけど)。しかし、リファレンスからその説明をみつけだすことができなかった。
ある数の累乗根を知りたいとき、Googleでなんて検索すればよいんだろう?
Common Lisp で array を list に変換したいなー、と思って調べたら coerce という関数がみつかった。
CL-USER> (mapcar #'(lambda (x) (1+ x)) (make-array 4)) ; Evaluation aborted on #<TYPE-ERROR expected-type: LIST datum: #<(SIMPLE-VECTOR 4) {1271CFBF}>>. CL-USER> (mapcar #'(lambda (x) (1+ x)) (coerce (make-array 4) 'list)) (1 1 1 1)
Emacs Lisp にもありました。
(car [1 2 3]) Debugger entered--Lisp error: (wrong-type-argument listp [1 2 3]) car([1 2 3]) (car (coerce [1 2 3] 'list)) 1
"coerce"というのは他動詞で「〈人を〉強制[強要]して〔…〕させる 〔into〕」という意味が一番目。辞書を引くとけっこうseriousな例文が出てくる。"They coerced her into signing the contract." 「彼らは無理に彼女にその契約書に署名させた.」
Perlでファイルの内容を読み込む場合、普通は1行ずつ処理する。
もし1行ずつ処理する方法が適当でない思ったら、undef $/
することによってファイルの内容をスカラ変数に一気に代入することができる。tこれを"slurping"と呼ぶ。
undef $/; $whole_file =; # 'slurp' mode
Slurping は Perlコマンド実行時のオプション '-0777' でも有効にできる。今日まで知らなかったけど、ワンライナーの場合にすごく便利。
$ cat foo.txt foo foo foo $ perl -0777 -pe 's/o\nf//g' foo.txt foooo
'-0'に続く数値は400以上であれば何でもよいのだが、777と書くのが慣例になっているらしい。詳しいことは参考ページに書いてある。
人生で初めて Windows server 2003(x64)を直接触る仕事を経験。Unix系じゃないサーバー機。ぼくも人生の荒波に揉まれてずいぶん大人になりました。
パーティションを切る必要があったけど、インストールやらネットワーク設定やらWindowsアップデートやらを一通りやった後でいいや、と思っていざやろうとするとできなくて焦った。というのは'diskpart'コマンド自体は入っているんだけど、Win server 2008 と違ってなんだかオプションが少ない。'shrink'も無い。
最初からやり直すのはしんどいのでいろいろと道具を探した結果、'GParted'というソフトがみつかった。ダウンロードしたISOをCDに焼いてブートして、GUIで自由に(たぶん、自由に)パーティションを設定できるというもの。
最初からやり直しになってもまあいいか、と期待せず使ってみるとこれがとても使いやすかった。そしてパーティション変更後も Windows server 2003 が正常にブートした。感謝。
こちら wget –spider = Head Request : alexking.org の記事について。
自分の場合、ブックマーク(リンク集)のリンク切れをまとめてチェックしたいときにwget の '--spider'オプションを使う。このような利用方法のときは特に気にすることはないのだが、何らかのWebアプリケーションを実行したい場合には注意が必要とのこと。
というのは 'wget --spider' がHEADメソッドを実行するよう実装されているので、Webアプリのコードが実行されないことがあるらしい(サーバーの環境や設定に依存するみたいだが)。
GETでアクセスしつつ、ダウンロードされたファイルを自動的に削除したい場合には、'--delete-after'オプションを使うのがよい。
既存のネットワークアプリの転送量を調べるときに使ったソフト。サーバーでこの NetHogs を起動しておいて、クライアント側でアプリのシナリオとかユースケースを1つ実行。サーバーのほうの画面で何バイト送受信したかを見て記録しておく。「なるほどこのシナリオの場合はx[KB]くらい通信するのか」と、だいたいの数字が分かる。
特徴は、転送速度(KB/sec)だけでなく、転送量の累積値が表示されるところ。たぶん初期状態では KB/sec の表示になっているが、実行中に m キーを押せば表示モードが KB/sec, KB, MB, B とサイクリックに切り替わる。
インストールに関しては、libpcap と ncurses に依存している。今回の環境(CentOS-6.0)では、epelリポジトリから yum でインストールできたので特に問題無し。
テキトーに sshd と apache にアクセスした場合のキャプチャを貼り付けておく。
まずは Byte単位の表示。
プロセスのIDごとに、USER, PROGRAM, DEV, SENT, RECEIVED が表示される。シンプル。
それから KB/sec 単位の表示。
Windowsの .bat ファイルを書いた。そして、dir
等のコマンドの出力を、FOR文のパラメータとして指定する方法を知った。
@echo off for /F "usebackq" %%file IN (`DIR /B /-N *.xml`) DO @echo %%file
Unix系のシェルで言うところのコマンド置換(command substitution)。バッククォート(`)を使う点は共通だ。
LinuxではルーティングテーブルのことをFIB(Forwarding Information Base)と呼ぶ。一度参照されたら routing cache にキャッシュされる。
これらを表示するコマンドは何通りかある。
# route -F Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.78.0 * 255.255.255.0 U 0 0 0 eth0 (略) # route -C Kernel IP routing cache Source Destination Gateway Flags Metric Ref Use Iface 192.168.105.1 192.168.105.130 192.168.105.130 il 0 0 29 lo (略)
# netstat -r Kernel IP routing table (略) # netstat -rC Kernel IP routing cache (略)
# ip route show 172.168.78.0/24 dev eth0 proto kernel scope link src 172.16.78.130 (略) # ip route show cached 192.168.105.128 from 192.168.105.130 dev eth2 cache mtu 1500 advmss 1460 hoplimit 64 (略)
古いけどわかりやすいドキュメントが netfilter.org の HOWTO の中にあった。
NICとプロセス、ルーティングコードのあいだにフックが5個仕掛けてあって、通過するパケットに関数が作用する。Linux netfilter Hacking HOWTO: Netfilter Architecture
次のドキュメントも参考になる。
GnuPGで '--edit-key
' オプションを使うと鍵の管理作業のためのメニューが出てくる。
$ gpg --edit-key 549B5813 gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There in NO WARRANTY, to the extent permitted by law. Secret key is available. pub 2048R/549B5813 created: 2012-01-22 expires: never usage: SC trust: ultimate validity: ultimate sub 2048R/6878DE41 created: 2012-01-22 expires: never usage: E sub 2048g/60ACA1A9 created: 2012-01-22 expires: never usage: E sub 2048D/29641C08 created: 2012-01-22 expires: never usage: S (略)
ここで表示される "2048R" とか "usage: SC" の意味を理解しないでいるとまずそうだから調べてみた、という話。
これは "The GNU Privacy Handbook" に書いてあった。
The public key is displayed along with an indication of whether or not the private key is available. Information about each component of the public key is then listed. The first column indicates the type of the key. The keyword pub identifies the public master signing key, and the keyword sub identifies a public subordinate key. The second column indicates the key's bit length, type, and ID. The type is D for a DSA key, g for an encryption-only ElGamal key, and G for an ElGamal key that may be used for both encryption and signing. The creation date and expiration date are given in columns three and four. The user IDs are listed following the keys.
要するに数字の部分が鍵のビット長、残りのアルファベット1文字が鍵の種類を表す。R なら RSA、D なら DSA、g なら 暗号化専用の ElGamal、G なら 暗号化と署名両方に使える ElGamal(このハンドブックは1999年の古いものなのでRSAについて言及していないが)。
"2048g"
なんとなく "S" は Sign で "E" は Encrypt だろうと予想が付いているものの、調べてみると同じ疑問をもった人がいた。
How are the GPG usage flags defined in the key details listing? - Unix and Linux - Stack Exchange
回答によれば "S" が "for signing", "E" が "for encrypting", "C" が "Creating a certificate"(たとえば Revocation certificate: 失効証明書とか?), "A" が "authentication"とのこと(SSHやTLSにおける認証で使えるらしい)。
ddコマンドはディスクのバックアップやダンプに使われることが多いので、コピー専用のコマンドだと思っていたことがある。
実際はそうではなくて、もっと軽い用途、たとえば標準入力から読み込んだ内容をファイルに書き込んだり、ファイルを読み込んで標準出力に出力したりすることもできる。
$ dd of=hello.txt hello, world 0+1 records in 0+1 records out 13 bytes transferred in 2.835518 secs (5 bytes/sec) $ cat hello.txt hello, world $
$ dd if=hello.txt hello, world 0+1 records in 0+1 records out 13 bytes transferred in 0.000138 secs (94173 bytes/sec) $
$ sudo dd if=/dev/disk0 bs=5 count=1 # MacOS requires root privilege to read /dev/disk0 ?1???1+0 records in 1+0 records out 5 bytes transferred in 0.000334 secs (14969 bytes/sec) $
findコマンドには、inode 番号を指定するオプション '-inum' がある。
find /root/ -inum 261232 /root/.bash_history
このオプションは、今日「SELINUXシステム管理」という本を読んで知った(アクセス拒否の際 audit.log に対象のファイルのinode番号が出力されるので、inode番号からファイルを検索できると便利だよ、との文脈で)。
先月(2012年1月)、"SEAndroid"というのがリリースされたらしい。SELinuxの機能をAndroidでも使えるようにしようという話なので、開発はNSA関係の人が中心に行っている模様。WikiサイトからダウンロードできるPDFに、いろいろと例が載っていた。
このニュースで初めて知ったけれど、Kernel の LSM(Linux Security Module)でAndroidをセキュアOS化する試みはすでにスマートフォンメーカーによって行われているらしい。たとえばSHAPR製のIS01に導入された "Deckard LSM" が一つの例(IS01は、root化に対して確かにセキュアだけど、LSM自体を無効にする方法が発見されてしまったらしい。。。)
今後SEAndroidが普及したら、SELinuxとおなじ効果が享受できるだろうか。ポリシーがきちんと書けていれば侵入攻撃を防御できるので、IDS的な機能を入れなくて済む、セキュリティホールにパッチやアップデートを急いで適用しなくて済む、など(ただしLSM無効化は無しの前提で)。
システムの性能が思ったより出ないときなどに、原因の切り分けに使えるツール。
# ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s (略)
# ethtool -s eth1 speed 100 duplex full autoneg off
ethtoolで調べてみると、LinuxホストのNICが 1Gbps まで対応しているのに、古いスイッチングハプを使っているせいで Speed: 100Mbps で通信している、なんてことがごくまれだけどある。
ちなみにWindowsの場合はコマンドプロンプト(cmd)で調べたり設定したりするのはかえって手間がかかるみたい。素直にNICを右クリックしてプロパティを開いてください、と。
たとえば Ruby や Python で "4444" という文字列を出力したいときは、'*'演算子を使って次のように書く。
$ ruby -e 'p "4" * 4' "4444"
$ python -c 'print "4" * 4' 4444
一方、Perlの場合は'x'演算子(アルファベットのx)を使う。
$ perl -e 'print "4" x 4, "\n"' 4444
さらに、リストコンテキストで使った場合はリスト内の要素を複製できる。
perl -e '@a = (1, 2) x 4; print join (":", @a), "\n"' 1:2:1:2:1:2:1:2
ちなみに、この演算子は"perldoc perlop"によると"repetition operator"と呼ばれている。
"sesearch" は、SELinuxが動いている環境でポリシー設定を調査するときに使うコマンド。CentOS-6.0の場合は "setools-console" というパッケージに入っている。
コマンドの使用例が "man sesearch" しても出てこないので、ちょっと探してみた。
# sesearch --role_allow -t httpd_sys_content_t /etc/selinux/targeted/policy/policy.24
# sesearch --role_allow --role_source unconfined_r Found 1 role allow rules: allow unconfined_r system_r; # sesearch --role_allow --role_target sysadm_r Found 2 role allow rules: allow system_r sysadm_r; allow staff_r sysadm_r;
# sesearch --allow | wc -l
# sesearch --dontaudit | wc -l
# sesearch -t shadow_t -c file -p write -A
# sesearch -t file_type -c file -p write -A -d
# sesearch -b global_ssp -A -C -d
# sesearch -A -C -s httpd_t -t httpd_sys_content_t
SMARTで"Current Pending Sector Count"が検出されたときに、どう対応すればよいかという話。
"Pending Sector"は、一言で言うと「不安定なセクタ」。次にアクセスしたときに正常に読み込める可能性もあるので"Remap"は行われないが、Remapされずにずっと不安定なままOSから参照されると dmesg等のログに "1 Currently unreadable (pending) sectors" といったエラーが出力され続けることがある。
エラーを解消するには、セクタをPending状態からremapされた状態、つまり"Reallocated sector"に変化させる必要がある。そのためには、セクタに対して一度書き込みを行えばよい。書き込みを行うことにより"Pending"の状態から"Reallocated"の状態に変化し、remapが行われるようになってエラーが解消する。同時に、SMARTの"Current Pending Sectors Count" が減り、"Reallocated Sectors Count"が増える。
ただし、エラーが解消する代わりにRemap処理はディスクアクセスの性能を落とす可能性がある(論理的に連続している情報が物理的には離れたトラックに配置され、磁気ヘッドのシーク時間が増えるため)。
参考ページに書いてある。"hdparm --write-sector
support.apple.com に、MacOS X で fsck のエラーが出ても気にしなくてよいよ、と書いてあった(JHFS+などのジャーナリングファイルシステムを使っている場合の話)。
Mac OS にインストールされている、ディスクユーティリティコマンド。ディスク状態の確認、パーティションの作成、マージなどに使える。
diskutil によると、このコマンドはAppleが用意したもので、普通のBSDには入っていないらしい。
自分が使ったものだけメモしておく。
$ diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *250.1 GB disk0 1: EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 249.7 GB disk0s2 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: CD_partition_scheme Gateway *442.3 MB disk1 1: CD_DA 75.3 KB disk1s0 2: CD_DA 83.6 MB disk1s1 3: CD_DA 23.5 MB disk1s2 4: CD_DA 117.1 MB disk1s3 5: CD_DA 51.5 MB disk1s4 6: CD_DA 50.7 MB disk1s5 7: CD_DA 115.8 MB disk1s6
$ diskutil info disk0|grep SMART SMART Status: Verified
# diskutil mergePartitions JHFS+ new disk0s2 disk0s3