金曜日, 9月 04, 2009

PHPでMIMEタイプを取得する方法(画像限定)

mime_content_type関数が使えない環境で別の関数がなんだったか思い出せなくなるのでメモ。 ただしMIMEタイプを取得できるのは画像限定。

<?php
$array = getimagesize("Winter.jpg");
var_export($array);
$ php get_mime_type.php
Content-type: text/html
X-Powered-By: PHP/4.3.9

array (
  0 => 800,
  1 => 600,
  2 => 2,
  3 => 'width="800" height="600"',
  'bits' => 8,
  'channels' => 3,
  'mime' => 'image/jpeg',
)

木曜日, 9月 03, 2009

bashのプロンプトにIPアドレスを表示

sshでマシンを行ったり来たりしていると自分がどのマシンを操作しているのか分からなくなるので、 bashのプロンプトにIPアドレスを設定することにした。 IPアドレスはifconfigで取得し、環境変数に設定してからPS1に設定。

export IPADDR=`/sbin/ifconfig | /bin/grep 172.16 | /usr/bin/perl -nle '/172\.16\.\d+.\d+/ && print $&;'`
export PS1='[\u@$IPADDR \W]\$ '

NICが2つある場合は考慮していない。 IPアドレスは172.16.x.xに固定。

水曜日, 9月 02, 2009

odの使い方とUnocodeコードポイント・UTF-8バイト列の簡単な変換方法

odの基本的な使い方

以下のようなテキストをUTF-8で保存したと仮定。

abcdefghijklmn
あいうえおかきくけこ
㈱のような機種依存文字。

odコマンドで中身を見るとこうなる。

$ od -tx1 -w16 od.txt 
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 0a e3
0000020 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a e3 81
0000040 8b e3 81 8d e3 81 8f e3 81 91 e3 81 93 0a e3 88
0000060 b1 e3 81 ae e3 82 88 e3 81 86 e3 81 aa e6 a9 9f
0000100 e7 a8 ae e4 be 9d e5 ad 98 e6 96 87 e5 ad 97 e3
0000120 80 82 0a
0000123

「a」は61、「LF」は0a、「あ」はe3 81 82、「㈱」はe3 88 b1であることが分かる。

-tx1ではなく-xを指定して実行すると、以下のようにエンディアンの関係で表示が異なるので注意。

$ od -x -w16 od.txt 
0000000 6261 6463 6665 6867 6a69 6c6b 6e6d e30a
0000020 8281 81e3 e384 8681 81e3 e388 8a81 81e3
0000040 e38b 8d81 81e3 e38f 9181 81e3 0a93 88e3
0000060 e3b1 ae81 82e3 e388 8681 81e3 e6aa 9fa9
0000100 a8e7 e4ae 9dbe ade5 e698 8796 ade5 e397
0000120 8280 000a
0000123

パイプを使ってodに文字列を流し込むこともできる。

$ echo "あいうえお" | od -tx1 -w16
0000000 e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a 0a
0000020

Unocodeコードポイント・UTF-8バイト列の簡単な変換方法

perl使います。 まずはUTF-8のバイト列からUnicodeコードポイントへの変換。

$ echo -n "e3 81 82" | perl -nle 'use Encode;s/ //g;$_=pack("H*",$_);Encode::from_to($_,"utf8","utf16");print unpack("H*",$_);'
feff3042

e3 81 82は「あ」のUTF-8バイト列。 feffはBOMなので、「あ」のコードポイントは3042であることが分かる。

次にUnicodeコードポイントからUTF-8のバイト列への変換。

$ echo -n "3042" | perl -nle 'use Encode;s/ //g;$_=pack("H*","feff".$_);Encode::from_to($_,"utf16","utf8");print unpack("H*",$_);'
e38182

「あ」のUnicodeコードポイントである3042を指定し、BOMのfeffをつけて変換してe38182が得られた。

木曜日, 8月 27, 2009

VMware上のLinux(CentOS)にLVMでHDD追加

CentOS5.3のHDD容量がまた足りないケースが出てきたので、 今度はLVMを使ってディスク容量を増やしてみる。 CentOS5では最初からLVMが使用されているので、 いちいちマウントする場所を気にしたりせずにディスク容量が増やせて非常に楽。 CentOS5のインストール時には「高度なストレージ設定」をしなかったと仮定。 今回のVMwareはServerではなくVMware Workstation 5.5。

VMwareにHDDを追加

まずゲストOSをシャットダウン。 CentOSなのでshutdown -h nowを実行した。 終了後以下の手順でHDDを追加。

  1. お気に入りからHDDを追加したい仮想マシンを右クリックして設定を選択
  2. ハードウェアタブの追加ボタンをクリック
  3. ハードウェア追加ウィザードへようこそ: 「次へ」ボタンをクリック
  4. ハードウェアの種類: 「ハードディスク」を選択して「次へ」ボタンをクリック
  5. ディスクの選択: 「仮想ディスクの新規作成」を選択して「次へ」ボタンをクリック
  6. ディスクタイプの選択: この仮想マシンで使用しているHDDと同じタイプを選択して「次へ」ボタンをクリック。SCSI (推奨)
  7. ディスク容量の指定: ディスクサイズ(GB)を好きなサイズに設定する。 今回は「ディスクを2GBに分割」を選択するがどちらでもOK。「次へ」ボタンをクリック
  8. ディスクファイルの指定: 好きなファイル名を指定。「完了」ボタンをクリックしてウィザードが終了し、HDDが追加される
  9. Virtual Machine Settings画面のHardwareタブにHard Disk 2 (SCSI 0:1)が追加されているはず

Linuxのパーティション設定

仮想マシンを起動すると、以下のようにデバイスファイルsdbが増えていることが分かる。

# cd /dev
# ls -l sd*
brw-r----- 1 root disk 8,  0  8月 27 18:39 sda
brw-r----- 1 root disk 8,  1  8月 27 18:40 sda1
brw-r----- 1 root disk 8,  2  8月 27 18:39 sda2
brw-r----- 1 root disk 8, 16  8月 27 18:39 sdb

SCSI 0:0はsdaに、SCSI 0:1はsdbになっている。 fdisk -lの実行結果は以下の通り。

# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        2610    20860402+  8e  Linux LVM

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

ディスク /dev/sdb は正常な領域テーブルを含んでいません

/dev/sda2がId:8eでLinux LVMになっていることが分かる。 sdbはまだ初期化されていないのでなにも表示されない。

ちなみに現在のディスク容量は以下の通り。 インストール時に「高度なストレージ設定」を行っていないが、 ファイルシステムがVolGroup00-LogVol00になっている。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       19G  2.9G   15G  17% /
/dev/sda1              99M   18M   76M  19% /boot
tmpfs                 125M     0  125M   0% /dev/shm

以下のようにしてパーティション設定を行う。

  1. fdisk /dev/sdbを実行
  2. nコマンドで新たに領域を作成
  3. 拡張または基本領域を聞かれるのでpをタイプ
  4. 領域番号を聞かれるので1をタイプ
  5. 最初シリンダ(First cylinder)を聞かれるのでそのままEnter
  6. 終点シリンダまたは+サイズ...を聞かれるのでそのままEnter
  7. tコマンドで領域のシステムIDを変更(ここ前回と違うので注意!)
  8. 16進数でLinux LVMのシステムID「8e」をタイプ(ここ前回と違うので注意!)
  9. wコマンドで書き込み、fdiskを終了
  10. (fdisk /dev/sdbを実行してpコマンドで領域を確認)
# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 1044 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1044, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1044, default 1044): 
Using default value 1044

コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): L

 0  空             1e  Hidden W95 FAT1 80  古い Minix    bf  Solaris        
 1  FAT12           24  NEC DOS         81  Minix / 古い  c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          82  Linux swap / So c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  83  Linux           c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     84  OS/2 隠し C:  c7  Syrinx         
 5  拡張領域    41  PPC PReP Boot   85  Linux 拡張領 da  非 FS デー  
 6  FAT16           42  SFS             86  NTFS ボリュ  db  CP/M / CTOS / .
 7  HPFS/NTFS       4d  QNX4.x          87  NTFS ボリュ  de  Dell ユーテ 
 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext df  BootIt         
 9  AIX ブート   4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access     
 a  OS/2 ブート  50  OnTrack DM      93  Amoeba          e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad    ee  EFI GPT        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC  
11  隠し FAT12    56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor      
12  Compaq 診断   5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor      
14  隠し FAT16 <3 61  SpeedStor       a9  NetBSD          f2  DOS セカン  
16  隠し FAT16    63  GNU HURD また ab  Darwin boot     fb  VMware VMFS    
17  隠し HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI スワッ  fd  Linux raid 自 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  隠し Boot Wiz fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
# fdisk /dev/sdb

このディスクのシリンダ数は 1044 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1044     8385898+  8e  Linux LVM

コマンド (m でヘルプ): q

PVの作成

fdiskでパーティションを設定したら通常はext3でフォーマットするところだが、 LVMの場合はPV(Physical Volume、物理ボリューム)を作成するためpvcreateコマンドを実行する。

# pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created

あっけなく終了。 pvdisplayで確認してみる。

# pvdisplay 
  /dev/hdc: open failed: メディアが見つかりません
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup00
  PV Size               19.89 GB / not usable 19.49 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              636
  Free PE               0
  Allocated PE          636
  PV UUID               WtrOWh-XLaf-IPdj-cBPh-Tytj-IWJW-pPaJGP
   
  "/dev/sdb1" is a new physical volume of "8.00 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               8.00 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               MJOW2Y-dMXr-SvOy-zUT3-w53h-OWgh-eUZf8U

/dev/sdb1の記述が追加されていることが確認できる。

PVをVGに登録

PVが作成できたらVG(Volume Group、ボリュームグループ)にPVを登録する。 VG自体はすでに作成されているのでvgcreateの必要はない。 現在の状況をvgdisplayで確認してみる。

# vgdisplay 
  --- Volume group ---
  VG Name               VolGroup00
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.88 GB
  PE Size               32.00 MB
  Total PE              636
  Alloc PE / Size       636 / 19.88 GB
  Free  PE / Size       0 / 0   
  VG UUID               3VAI4V-VILP-LfJF-YL3l-qEde-Dwyd-XlFFPV

VolGroup00が約20GBであることが分かる。Free PE / Sizeは0。 これにvgextendコマンドでsdb1を追加する。

# vgextend VolGroup00 /dev/sdb1
  Volume group "VolGroup00" successfully extended

もう一度vgdisplayしてみるとこう変わっている。

# vgdisplay 
  --- Volume group ---
  VG Name               VolGroup00
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               27.84 GB
  PE Size               32.00 MB
  Total PE              891
  Alloc PE / Size       636 / 19.88 GB
  Free  PE / Size       255 / 7.97 GB
  VG UUID               3VAI4V-VILP-LfJF-YL3l-qEde-Dwyd-XlFFPV

VG SizeとFree PE / Sizeがともに約8GB増えていることが確認できる。 が、この状態でdf -hを実行するとまだ使える領域は増えていない。 LVの拡張とファイルシステムの拡張が必要。 道のりは長い...

LVの拡張

LV(Logical Volume、論理ボリューム)の拡張を行う。 lvextendコマンドを使用するが、指定可能な最大サイズがいくつか分からないので以下のように100%FREEを指定する。

# lvextend -l +100%FREE /dev/VolGroup00/LogVol00 
  Extending logical volume LogVol00 to 26.84 GB
  Logical volume LogVol00 successfully resized

lvdisplayで確認するとLV Sizeが26.84 GBまで増えていることがわかる。

# lvdisplay 
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
  VG Name                VolGroup00
  LV UUID                lfmle5-GyOh-aYPD-IrFo-FL27-ogtz-Iw4xWk
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                26.84 GB
  Current LE             859
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

ファイルシステムの拡張

やっとラスト。resize2fsコマンドでext3を拡張する。 オンラインリサイズが可能なのでOSを止める必要がない。

# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 7036928 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 7036928 blocks long.

1分程度で終了。df -hを実行すると、残り15GBだった/が22GBまで増えたことが確認できる。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       27G  2.9G   22G  12% /
/dev/sda1              99M   18M   76M  19% /boot
tmpfs                 125M     0  125M   0% /dev/shm

以前のHDDの追加方法だとマウントする場所を決める必要があったが、 このやり方なら特定のディレクトリ以下だけ増やすわけではないのでより使いやすい。

木曜日, 5月 14, 2009

やっちまったなー

iPod shuffleシャツのポケットに入れたまんま洗濯してしまった... 怖くて電源入れられません。

木曜日, 5月 07, 2009

開発者別Adobe AIRの始め方

いざAdobe AIRを始めようと思ったらいろんなやり方があって迷ってしまったので、 開発者別のAdobe AIRの始め方をえらそうにメモってみる。

開発パターン3つ

大きく分けると以下の3通りの方法がある。 それぞれ使うソフトも必要な費用も違う。

  • Flashベースの開発
  • Flexベースの開発
  • HTML/JavaScriptベースの開発

以下詳細。

Flashベースの開発

まずはAdobe Flash CS4 Professionalを使用する方法。 単品で購入すると88,200円。 ウェブで調べてもなかなかFlash Professionalで開発している例を見つけることができないが、 Flashユーザ向けAdobe AIRチュートリアルがわかりやすい。 本ではFlashで作る AIRアプリケーション レシピブックがあったが、入門にはならないのでチュートリアルを読んでからのほうがよい。

使用する言語はMXMLとActionScript(ざっくり言うとHTMLとJavaScriptみたいな感じ)、 加えてFlashのリッチな表現が可能。 あまりプログラム的な要素がないFlashアプリをAIR化するようなケースではFlashベースの開発がよさそう。

Flexベースの開発

Flexはプログラマ向けFlashみたいな認識しかないけどもうバージョン3。 遅ればせながら勉強します。 Flashベースの開発とわざわざ分けてFlexベースの開発を書いたけど、Flashベースと言ってもいいかもしれない。 Flexは製品版のFlex Builderを購入する(31,500円なのでFlash Professionalよりはお手軽)か、 フリーのFlex SDKをダウンロードしてコマンド+テキストエディタで開発することができる。 ウェブでAIRの例を検索すれば一番ヒットするのはFlexベースの開発だと思う。 (ただしAIRがまだApolloのころのソースもよくヒットしてしまって、 そのままコピって実行しようとしてもAPIが違って実行できないことがあるので注意)

使用する言語はFlash同様、MXMLとActionScript。 Flexのコンポーネントのスタイル設定にはCSSが使える。

お金がないからと言ってFlex SDK+コマンド+エディタで開発しようとすると、仕組みを覚えるにはいいけど結構面倒。 GUIがないからコンポーネントの配置なんかやってられない。 Flex Builderがあるとよいが、いまならEclipseにAIR GEARというプラグインをインストールすることでFlex Builderに近い環境が準備できる。(このプラグインの名前、マンガのタイトルぱくったんじゃあるまいか...) GUIでコンポーネントの配置ができるし、内部的にfcshコマンドを使ったりしてコンパイルもそこそこ高速。ありがたし。 Flex関連の書籍も多いので、新しく始めるのには情報量が多くてよい。 (WEB+DB PRESS Vol.46がわかりやすかった)

HTML/JavaScriptベースの開発

HTML/JavaScriptベースの開発にはAdobe Dreamweaver CS4を使用する。 価格は49,875円。 Dreamweaver以外にもIDEの選択肢は多く、Eclipse+AIR GEARでもAptanaでも開発ができる。 その代わりウェブ上には情報があまり多くない。 前述のFlashユーザ向けAdobe AIRチュートリアルにはDreamweaverで開発する例が載っていてわかりやすい。

使用する言語は名前の通りHTML, JavaScriptを使用することになる。 ウェブアプリ開発者には新しく言語を覚える必要がなくコストが下がる。 さらにjQueryやYahoo! UI Libraryといった通常のウェブアプリで使用されているJavaScriptライブラリまで使用できるので、 慣れている人にはさらにうれしい。 (といいつつも、いつもYUIを使ってウェブアプリ開発してるのにHTML/JavaScriptベースのAIRアプリ開発は考えてないオレ)

まとめ

どれを使っても最終的にできあがるパッケージは同じように実行できる。 (もちろん見た目やできることには差が出る。HTML/JavaScriptベースの開発ではFlashのようなアニメーションを作ることはできない(はず))

プログラム的な要素が多いか少ないか、 IDEにお金をかけられるかかけられないか、 既存のスキルはなにかで上記の3パターンからどれを選ぶか決まってくると思う。 個人的にはEclipse+AIR GEARでの開発がコストもかからず勉強には一番よいと感じているが、 ちゃんとしたアプリケーションを作るとなったらFlex BuilderかFlash Professionalを購入した方がいいだろう。

木曜日, 4月 09, 2009

Oracleセミナーで覚えたこと(その3)

もう4日目か。結構あっという間。 言うまでもないけど寝てる受講生なんていませんな。

  • フラッシュバック関連続き
    • フラッシュバック・データベース:データベースに対するすべての変更をある時点まで迅速に戻せる(戻す時間が短いなら不完全リカバリするよりこっちのほうが速い)
    • フラッシュバック・データ・アーカイブ:長期間フラッシュバック・問い合わせができる。1年前の状態のテーブルからSELECTできたりするのでコンプライアンス等に便利。いちいち履歴テーブルとか用意しなくても済むのがすばらしい(アプリケーション側に修正が必要ない)
  • 自動診断リポジトリ関連。ほとんどOEMでグラフィカルに確認できる
  • データ・リカバリ・アドバイザを使うと障害の検出・分析・修復が驚くほど速い。データファイルのブロックにddコマンドで適当なデータ書き込んでブロック破損させたのに、コマンド何個か打てば短時間で復旧できる。滅多に起こらないことだろうけど、普段からやり慣れた作業じゃないこんなケースこそ簡単なのが嬉しい
  • メモリ管理。SGAまわりでまだちゃんと理解してなかったところがボロボロと出てくる。Oracleをちゃんと理解するにはちゃんとハードウェアからマシンを理解しないとダメだなーと痛感。普段ウェブアプリばっかり作ってると共有メモリとかまず出てこないわけで...
  • SQLチューニング・アドバイザ:あるSQLに対して「統計が古くないか」「インデックスの追加で速くならないか」「不適切な計画を使用していないか」などチェックしてくれる
  • SQLアクセス・アドバイザ:インデックス、マテリアライズド・ビュー、パーティショニングなどをすることで大幅にパフォーマンスが向上するかチェックしてくれる
  • 受講中はテキストだけでなく、自分で持ち込んだ本やMacBookにダウンロードしたオンラインマニュアルなんかも(勝手に)読んでる。「Oracle Database 2日でデータベース管理者11g リリース1(11.1)」をダウンロードするのはこんな感じ。
    1. MacPortsでwgetをインストール
    2. cd Sites
    3. wget -r -L http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05759-03/toc.htm
    -rで再帰、-Lで相対リンクのみ。たまにCSS内で参照している画像とかがうまくリンク辿られずに取得できないので、そういう場合はFirebugでURLを調べて-xオプションをつけてwget。
  • いまさらだけどSpotlightに辞書も入っててうれしかった

東京はもう桜が散り始め。仙台はいまちょうど見頃かなぁ...

Oracleセミナーで覚えたこと(その2)

Recovery Managerに慣れてきたー。
RMAN> backup 脳みそ;

  • SCN:System Change(またはCommit) Numberの略。コミットごとにインクリメントされる番号。PostgreSQLのXIDみたいなもの?(と思ったら違った。トランザクションIDというのが別に存在する。ただしOracleのトランザクションIDは文字列みたいな識別子。SCNは数値)
  • インカネーション:データベースのバージョンを識別するための番号。リカバリ・カタログを使用した管理の場合のみ発生する。
  • ステージング領域:$ORACLE_HOME/dbsのこと。このディレクトリを指す
  • Oracleホーム:環境変数ORACLE_HOMEと同義だと思われる
  • RAWデバイス:ファイルシステムを作っていないパーティションのこと。通常REDOログの書き込みが最大パフォーマンスになるが、これにRAWデバイスを使うといいらしい。生デバイスってなにかと思った
  • DBID:データベース識別子。SELECT DBID FROM v$database;で取得。DB複製のときとか意識する
  • 用語どころか英語もわからん...(retentionとかpurgeとかauxiliaryとか普段使わない)
  • ストリーミングって動画のことかと思ったらストリーミング・テープ装置っていうのがあるらしい
  • PCTFREEってなんだっけ(最後にこの単語を見たのは4年ぐらい前かと...)
  • 表領域Point-in-Timeリカバリすばらしい
  • フラッシュバック・テクノロジもすばらしい(用語が多くて混乱。以下かなり大雑把&嘘あり御免)
    • フラッシュバック・ドロップ:DROP TABLEしてしまった表を元に戻せる
    • フラッシュバック・問い合わせ:DML実行前のある時点のデータをSELECTできる
    • フラッシュバック・バージョン問い合わせ:ある範囲の時間にあったトランザクションの履歴を問い合わせることができる。変更の履歴が見れるという理解であってるのか?これで取得した情報をもとに次のフラッシュバック・トランザクション問い合わせを実行したりする
    • フラッシュバック・トランザクション問い合わせ:フラッシュバック・バージョン問い合わせで取得したトランザクションIDを使って、データベースに対して行われた変更をトランザクションレベルで追える。トランザクション1とトランザクション2で同じレコードを更新しているから二つのトランザクションには依存性がある、とかもわかる。これすごいなぁ
    • フラッシュバック・データベース:明日やる予定
    • フラッシュバック・データ・アーカイブ:明日やる予定
    • 全然関係ないけどFLASH BACKといえばcapsule(プレイバックは山口百恵)

「Oracleだったら○○があるからすぐデータ戻せるのになぁ」とかいうケースが研修終わった後にありそう...でも好きですポスグレ