Postgresqlで16進数のシリアル番号を10進数に相互変換するファンクションを書いた

X.509証明書のシリアル番号を10進数でDBに保存しようかと思ってたけど、bigintの範囲も超えちゃうのでけっきょく16進数の文字列のまま保存することにした。
いちおう、相互変換できるファンクションは書いたので、もったいないので残しておく。
PL/pgSQLは初めて書いたけど、マニュアルみながらでもけっこう書けるもんなんだね。わりといろいろできて面白い。

PL/pgSQL書いてるときにフムフムと思ったこと

http://www.postgresql.jp/document/9.3/html/plpgsql.html

制御構文はひと通り用意されてる。

SQLの実行結果を変数に入れる場合はEXECUTE sql INTO varが使える。

他には実行結果をRECORD型で受けるLOOPを回してるのもあったけど、1件取るだけなら、EXCUTE使うほうがいいと思った。

CREATE FUNCTION from_hex(t text) RETURNS integer AS $$
  DECLARE
    r RECORD;
  BEGIN
    FOR r IN EXECUTE 'SELECT x'''||t||'''::integer AS hex' LOOP
      RETURN r.hex;
    END LOOP;
  END
$$ LANGUAGE plpgsql;

serialnumber_hexのほうはもともとsepの型をcharでやってたんだけど、これだと空白渡すと自動でトリムされて困った。varcharならトリムとかされない。

あと、substrは1オリジンだった。このへんて言語によっていろいろな気がしたりするけど思い込みかも。

sbtでtestを実行したらjava.net.UnknownHostExceptionのエラー吐いた

http://biomedicalontologies.com/2012/11/14/fixing-java-net-local-host-name-unknown-error-on-mac-os-x/

をみるに、hostnameの設定が/etc/hostsに書いてないものになっているとjava.net.UnknownHostExceptionになるみたい。

> test
[info] Generating PROJECT_HOME/target/scala-2.10/resource_managed/main/rebel.xml.
<snip>
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[trace] Stack trace suppressed: run last cert_safe/*:testListeners for the full output.
[error] (PROJECT/*:testListeners) java.net.UnknownHostException: foo01: foo01: nodename nor servname provided, or not known
[error] Total time: 1 s, completed 2014/07/30 16:03:41
> 

hostnameの出力のサーバー名を/etc/hostsに書いて解決。

Time Machineバックアップの信頼性向上云々がでても諦めるな

2015-09-17追記

以下の対処でも全然直らないケースが増えてきたので、諦めてAirMac Extreme買ってそこに付けたUSB HDDでTimeMachineを使うようにしました。白旗。

事象

Macのバックアップが始まったと思ったら、こんなメッセージが。

「Time Machine でのバックアップの検証が完了しました。信頼性を向上させるには、Time Machineによって新しいバックアップが作成される必要があります。」

新規でバックアップsparsebundleを作る以外の選択肢が出てこない。

環境

UbuntuNetatalkを動かして、TimeMachineのバックアップ先にしている。

原因

Opensslのアップデートも兼ねてapt-get updateしたときのサービス再起動中に、Mac側のバックアップが始まったらしく、sparsebundleの不整合が発生したようだ。

2015-09-17追記

サービス再起動とか関係なくバンバン発生する。ツライ

調査

less /var/log/fsck_hfs.log

/dev/rdisk3s2: fsck_hfs started at Fri Apr 11 00:31:00 2014
/dev/rdisk3s2: /dev/rdisk3s2: ** /dev/rdisk3s2 (NO WRITE)
/dev/rdisk3s2:    Executing fsck_hfs (version hfs-226.1.1).
QUICKCHECK ONLY; FILESYSTEM DIRTY
/dev/rdisk3s2: fsck_hfs completed at Fri Apr 11 00:31:04 2014

FILESYSTEM DIRTYやと。

手動でfsck_hfsしてみる

fsck_hfs -drfy /dev/disk3s2

こんな感じのログを残して止まる。

/dev/rdisk3s2: fsck_hfs started at Fri Apr 11 09:00:36 2014
/dev/rdisk3s2: /dev/rdisk3s2: Unable to open block device /dev/disk3s2: Permission denied/dev/rdisk3s2: journal_replay(/dev/disk3s2) returned 13
/dev/rdisk3s2: ** /dev/rdisk3s2 (NO WRITE)
/dev/rdisk3s2:  Using cacheBlockSize=32K cacheTotalBlock=32768 cacheSize=1048576K.
/dev/rdisk3s2:    Executing fsck_hfs (version hfs-226.1.1).
/dev/rdisk3s2: Journal is empty
/dev/rdisk3s2: ** Checking Journaled HFS Plus volume.
/dev/rdisk3s2: ** Detected a case-sensitive volume.
/dev/rdisk3s2:    The volume name is Time Machine バックアップ
/dev/rdisk3s2: ** Checking extents overflow file.
/dev/rdisk3s2: ** Checking catalog file.
/dev/rdisk3s2: ** The volume Time Machine バックアップ was found corrupt and needs to be repaired.
/dev/rdisk3s2:  volume type is pure HFS+ 
/dev/rdisk3s2:  primary MDB is at block 0 0x00 
/dev/rdisk3s2:  alternate MDB is at block 0 0x00 
/dev/rdisk3s2:  primary VHB is at block 2 0x02 
/dev/rdisk3s2:  alternate VHB is at block 2737107966 0xa324f3fe 
/dev/rdisk3s2:  sector size = 512 0x200 
/dev/rdisk3s2:  VolumeObject flags = 0x07 
/dev/rdisk3s2:  total sectors for volume = 2737107968 0xa324f400 
/dev/rdisk3s2:  total sectors for embedded volume = 0 0x00 
/dev/rdisk3s2:  CheckHFS returned 7, fsmodified = 0
/dev/rdisk3s2: fsck_hfs completed at Fri Apr 11 09:00:42 2014

corruptやと。

対策

Time Machineのディスクをマウント

Finderから。

ロックフラグを外す

chflags -R nouchg /Volumes/{name of your network share}/{name of}.sparsebundle

sparsebundleをマウント

hdiutil attach -nomount -readwrite /Volumes/{name of your network share}/{name of}.sparsebundle

fsckでリペア

対象ボリュームはApple_HFSのやつ。

fsck_hfs -rf /dev/disk3s2

実行後のログは以下。 終わるまで3時間くらいか。

** /dev/rdisk3s2
   Executing fsck_hfs (version hfs-226.1.1).
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Time Machine バックアップ
** Checking extents overflow file.
** Checking catalog file.
** Rebuilding catalog B-tree.
** Rechecking volume.
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Time Machine バックアップ
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
   Invalid volume file count
   (It should be 2314545 instead of 2108959)
   Invalid volume directory count
   (It should be 328860 instead of 308933)
   Invalid volume free block count
   (It should be 250732702 instead of 282939599)
   Volume header needs minor repair
(2, 0)
** Repairing volume.
** Rechecking volume.
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Time Machine バックアップ
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
** The volume Time Machine バックアップ was repaired successfully.

あとからログをみたい場合は以下を参照

less /var/log/fsck_hfs.log

フラグを編集

vim /Volumes/{name of your network share}/{name of}.sparsebundle/com.apple.TimeMachine.MachineID.plist

RecoveryBackupDeclinedDateのエントリ自体を削除と、VerificationStateを0に戻す。

デタッチ

hdiutil detach /dev/disk3s2

以上の対応で、正常に差分バックアップを続けることができるようになった。

参考

H2O Wirelessの月額プランから従量プランへはチャットで変更可能

H2O Wirelessの月額プラン(monthly plan)から従量プラン(minute plan)へ変更したいと思ったけど、webのインタフェースは当然そんな口はない。 なので、とりあえずチャットで訊いてみたら、その場で変更できた。 即時の変更になるので、契約期間が残ってたらもったいないので、なるべく月額契約が切れてからのほうが損がない。

H2O Wirelessの月額プランは自動応答の電話で変更可能

H2O Wirelessの月額プランを契約しているとRechargeには今の月額プランのしか選択肢に出てこない。なので、増減させたいときに困る。実際困った。
なので、とりあえずチャットで訊いてみたら、800.643.4926に電話しろとのこと。
ドキドキしながら電話したら、すべて自動応答で済んでとても助かった。
電話で月額プランを変更したら、ウェブページのRechargeのとこ行くと、変更後の金額が選択肢に出てきてる。
それでRechargeすればOK.

アメリカ入国から運転免許取得までの時系列

2014年1月現在はこんな流れで進みますよ、というのを記録しておきます。わりと滞りなく進んで2週間半という感じ。

時系列

前提としては、Union bankで銀行口座は作成済。アパートは決めてあったので到着した日からアパートへ。

  • 1/3 シアトル到着
  • 1/6 Social Security Administrationへ行って、ソーシャルセキュリティーナンバーを申請
    • 窓口のイタリア系のおっちゃんがスムースに手続きしてくれて、なぜか日本語で少し雑談
  • 1/10 L-2の奥さんのSSNが先に届いた
  • 1/13 L-1の自分のSSNが届いた
  • 1/16 運転免許のためのKnowledge testをパス
  • 1/17 運転免許のためのDriving skill testをパス
    • バックマニューバーと縦列駐車がよくなかったけど、パスできてよかった
  • 1/17 Comcastにインターネットとケーブルテレビの申し込み
  • 1/21 Driver Licensing Officeで免許の申請と紙の免許証を受理

ソーシャルセキュリティーナンバーの申請について

アメリカ内での情報共有に時間がかかるので、SSNの申請まで2週間くらい待ったほうがいいという情報をよく見たけど、I-94が電子化されたのでもっと早く申請してよかろうと考えて、入国から2営業日目で申請に行った。結果としてこれは正解。

行った場所はベルビュー。

持っていったのは

  • 日本のパスポート
  • ビザ
  • I-94を印刷したもの
    • けっきょく見せなくてよかった
  • 婚姻証明

婚姻証明を持っていけば、L-2の奥さんのSSNもスムースに発行してくれる。もちろん、労働許可取得可能なものが。

僕らのケースでは、日本の戸籍謄本を自分で翻訳して公証役場で公証してもらったものを持参。
翻訳書類のフォーマットはアメリカ大使館のサイトで公開している以下のものを使用。

翻訳後に公証役場で公証をしてもらったけど、費用は13000円くらいでけっこう高い。有効な戸籍謄本を持っていけば、シアトル総領事館で15ドルで婚姻証明の英訳を郵送してくれる http://www.seattle.us.emb-japan.go.jp/japanese/info/shoumei_04.htm ので、そちらのほうが良さそうだ。

ちなみに、日本の公証がアメリカで有効なのは、日米ともにハーグ条約に加盟しており、アポスティーユという付箋による証明で、駐日領事の認証があるものと同等のものとみなしてくれるかららしい。

運転免許について

ライセンシングオフィスで試験を受けられることに気づかずに、ドライビングスクールのほうで試験を受けた。なので、余計にナレッジテストで20ドル、スキルテストで40ドルかかってしまった。けど、ライセンシングオフィスだと怖いインストラクターが多いというのをみてたけど、スクールだとすごく和やかにやってくれて助かった。 オフィスで試験をするだけなら、申請費用35ドルと発行費用45ドルの合わせて80ドルだけで済むようだ。

ライセンシングオフィスで日本のパスポートと運転免許証の提示を求められたので、ホントはSSNカードとか持っていったほうがいいのかもしれない。

運転免許の試験について

ワシントン州では外国の免許を持ってるひとも知識テスト、実技テストが必要。 ドライビングガイドは日本語がある http://www.dol.wa.gov/driverslicense/guide.html のでそれを読んで理解して、知識テストはオンラインの模試を7〜8回やったら問題の傾向と答えがつかめるはず。

試験の際は、Pre-applyしてそのときの番号を持ってくのと、パスポートと運転免許証でOK。

スキルテストは普通の街なかの運転と、バックマニューバーと縦列駐車をやるだけ。和やかなおっちゃんで助かった。

インターネット、ケーブルテレビ

Comcastで12ヶ月は月50ドルのプランがあったのでそれで。Verizonはサービス対象外地域だった。 申請時にSSNを訊かれて、クレジットヒストリーが確認されるけど、ヒストリーがないのでリファンダフルデポジットで100ドルとられた。

mdadm RAID1復旧の試験

下準備

ディスクは3本ある状態。状況確認

fdisk -l

フォーマット

sdb,sdcでraid1作成。sddはスペアディスク。それぞれ10MB。

fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd

fdiskのコマンドはこんな。

n, p, 1, 1
t, fd

raid0作成

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[bc]1
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/

確認

mdadm --misc --detail /dev/md0
mdadm --misc --examine /dev/sdb1
mdadm --misc --examine /dev/sdc1

停止と再開のテスト

umount /mnt
mdadm --misc --stop /dev/md0
mdadm --misc --detail /dev/md0
mdadm --assemble /dev/md0 /dev/sd[bc]1

[root@localhost ~]# mdadm --assemble /dev/md0 /dev/sd[bc]1
mdadm: /dev/md0 has been started with 2 drives.

ケース: sdbのディスクが壊れた

sdbに失敗マークつける

mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --misc --detail /dev/md0

[root@localhost ~]# mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Dec 16 11:37:59 2013
Raid Level : raid1
Array Size : 7936 (7.75 MiB 8.13 MB)
Used Dev Size : 7936 (7.75 MiB 8.13 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
_
Update Time : Mon Dec 16 11:42:49 2013
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 1
Spare Devices : 0
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 8de6a2e9:620c76ea:cc0bb7fd:5b0c30af
Events : 18
_
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 33 1 active sync /dev/sdc1
_
0 8 17 - faulty spare /dev/sdb1

sdbを取り除く

mdadm /dev/md0 --remove /dev/sdb1
mdadm --misc --detail /dev/md0

[root@localhost ~]# mdadm /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0
[root@localhost ~]# mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Dec 16 11:37:59 2013
Raid Level : raid1
Array Size : 7936 (7.75 MiB 8.13 MB)
Used Dev Size : 7936 (7.75 MiB 8.13 MB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
_
Update Time : Mon Dec 16 11:50:11 2013
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
_
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 8de6a2e9:620c76ea:cc0bb7fd:5b0c30af
Events : 21
_
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 33 1 active sync /dev/sdc1

この状態でも使えることは使える

再起動してみるとどうなる?

/dev/md127で認識されてる。
これはinitramfsで自動assembleされるため。
dracutとかで作り直せばよさそうだけど、パラメータわからん。

sudo fdisk -l

ディスク /dev/md127: 8 MB, 8126464 バイト
ヘッド 2, セクタ 4, シリンダ 1984
Units = シリンダ数 of 8 * 512 = 4096 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

デグレーデッドな状態

mdadm --misc --detail /dev/md127

[root@localhost ~]# mdadm --misc --detail /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Mon Dec 16 11:37:59 2013
Raid Level : raid1
Array Size : 7936 (7.75 MiB 8.13 MB)
Used Dev Size : 7936 (7.75 MiB 8.13 MB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
_
Update Time : Mon Dec 16 11:53:23 2013
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
_
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 8de6a2e9:620c76ea:cc0bb7fd:5b0c30af
Events : 31
_
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 33 1 active sync /dev/sdc1

mount /dev/md127 /mnt/

マウントすればもちろん使える

新規ディスク追加

mdadm /dev/md127 --add /dev/sdd1
mdadm --misc --detail /dev/md127

addするとrebuildが走る。けど、この場合は10MBのディスクなので一瞬で終わってる。

[root@localhost ~]# mdadm /dev/md127 --add /dev/sdd1
mdadm: added /dev/sdd1
[root@localhost ~]# mdadm --misc --detail /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Mon Dec 16 11:37:59 2013
Raid Level : raid1
Array Size : 7936 (7.75 MiB 8.13 MB)
Used Dev Size : 7936 (7.75 MiB 8.13 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
_
Update Time : Mon Dec 16 15:55:14 2013
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
_
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 8de6a2e9:620c76ea:cc0bb7fd:5b0c30af
Events : 56
_
Number Major Minor RaidDevice State
2 8 49 0 active sync /dev/sdd1
1 8 33 1 active sync /dev/sdc1

md127からmd0に戻す

mdadm --misc --stop /dev/md127
mdadm --assemble /dev/md0 /dev/sd[cd]1

[root@localhost ~]# mdadm --misc --stop /dev/md127
mdadm: stopped /dev/md127
[root@localhost ~]# mdadm --assemble /dev/md0 /dev/sd[cd]1
mdadm: /dev/md0 has been started with 2 drives.

ケース:追加したsddのディスクも壊れた

mdadm /dev/md0 --fail /dev/sdd1
mdadm /dev/md0 --remove /dev/sdd1

sdbに新しいディスクを入れて追加する

mdadm /dev/md0 --add /dev/sdb1

おっけー

ケース:片肺で動かす

追加ディスクないけどとりあえず動かしたい、もしくは、片方のディスクだけでデータみたい、というケース。

1ディスクだけでアセンブル

runをつけないとinactiveでの起動になる。

mdadm --assemble /dev/md0 /dev/sdc1 --run

[root@localhost ~]# mdadm --assemble /dev/md0 /dev/sdc1 --run
mdadm: /dev/md0 has been started with 1 drive (out of 2).
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc1[1]
7936 blocks super 1.2 [2/1] [_U]
_
unused devices:
[root@localhost ~]# mdadm --detail /dev/md127
mdadm: cannot open /dev/md127: No such file or directory
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Dec 16 11:37:59 2013
Raid Level : raid1
Array Size : 7936 (7.75 MiB 8.13 MB)
Used Dev Size : 7936 (7.75 MiB 8.13 MB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
_
Update Time : Mon Dec 16 16:01:55 2013
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
_
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 8de6a2e9:620c76ea:cc0bb7fd:5b0c30af
Events : 81
_
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 33 1 active sync /dev/sdc1

いちおう使えるので、mount -o ro /dev/md0 /mntとかで読み取り専用でマウントするのがよいと思う。