UNION が含まれるビューとインデックス

会社で聞かれた 「UNION が含まれるビューがあるんだけど、インデックス使ってくれる?」という 質問に対して 「データベースがそっちの方が効率が良いと判断したら使ってくれるし、実行計画を取ってみれば?」という 回答をしたんですが、念のため試してみます。

まず、テスト用のテーブルにデータを登録します。

INSERT INTO table1 (f1)
  SELECT generate_series FROM generate_series(1, 10000);
INSERT INTO table2 (f1)
  SELECT generate_series FROM generate_series(1, 10000);

generate_series 関数は、便利ですね。

まずお試しに単純な SQL で実行計画を取得。 もちろん事前にテーブルを Analyze しておきます。

EXPLAIN
  SELECT * FROM table1
  WHERE f1 = 1

↓結果

Index Scan using table1_pkey on table1  (cost=0.00..8.27 rows=1 width=8)
  Index Cond: (f1 = 1)

インデックス table1_pkey が使用されています。

次に副問い合わせで UNION ALL して実行計画を取得。

EXPLAIN
  SELECT *
  FROM (SELECT * FROM table1
        UNION ALL
        SELECT * FROM table2) AS t1
  WHERE f1 = 1

↓結果

Result  (cost=0.00..16.54 rows=2 width=8)
  ->  Append  (cost=0.00..16.54 rows=2 width=8)
        ->  Index Scan using table1_pkey on table1  (cost=0.00..8.27 rows=1 width=8)
              Index Cond: (f1 = 1)
        ->  Index Scan using table2_pkey on table2  (cost=0.00..8.27 rows=1 width=8)
              Index Cond: (f1 = 1)

これもちゃんと、インデックス table1_pkey と table2_pkey が使用されています。

ちなみに UNION ALL じゃなくて UNION の場合。

EXPLAIN
  SELECT *
  FROM (SELECT * FROM table1
        UNION
        SELECT * FROM table2) AS t1
  WHERE f1 = 1

↓結果

Unique  (cost=16.57..16.58 rows=2 width=8)
  ->  Sort  (cost=16.57..16.57 rows=2 width=8)
        Sort Key: table1.f1, table1.f2
        ->  Append  (cost=0.00..16.56 rows=2 width=8)
              ->  Index Scan using table1_pkey on table1  (cost=0.00..8.27 rows=1 width=8)
                    Index Cond: (f1 = 1)
              ->  Index Scan using table2_pkey on table2  (cost=0.00..8.27 rows=1 width=8)
                    Index Cond: (f1 = 1)

こちらもインデックスは使ってくれます。

念のため、ビューを作成して試してみます。

CREATE VIEW view1 AS
  SELECT *
  FROM (SELECT * FROM table1
        UNION ALL
        SELECT * FROM table2) AS t1

ビューに対して実行計画を取得。

EXPLAIN
  SELECT * FROM view1
  WHERE f1 = 1

↓結果

Result  (cost=0.00..16.54 rows=2 width=8)
  ->  Append  (cost=0.00..16.54 rows=2 width=8)
        ->  Index Scan using table1_pkey on table1  (cost=0.00..8.27 rows=1 width=8)
              Index Cond: (f1 = 1)
        ->  Index Scan using table2_pkey on table2  (cost=0.00..8.27 rows=1 width=8)
              Index Cond: (f1 = 1)

結果は副問い合わせと同じでした。

こういうのは、自分の手で試しておくと安心ですね。

祝 Raspberry Pi 2台目 到着(入手)

不在票がようやく本体になりました。

今回はケースも買いました。

WRITE_0656_01

白い箱がケースの箱です。

ケースは透明です。

WRITE_0656_02

メカメカした中身が見える方が楽しいですよね。

Raspberry Pi を入れるとこんな感じです。
(中に入っているのは Rev.1 の方)

WRITE_0656_03

とりあえず今日はここまで。

情報処理試験 セキュリティスペシャリスト 受験記

今日は 平成 24年度秋期情報処理試験(応用情報技術者・高度試験)の合格発表日でした。 セキュリティスペシャリストに合格していたので、受験記を作成しました。

オンラインツールに「IPアドレス表示」追加

オンラインツールに「IPアドレス表示」を追加しました。

名前の通りの、ただそれだけの機能なんですが 結構使う時があるので自分でも置いてみました。

PostgreSQL の generate_series 関数

PostgreSQL には generate_series という集合を返すことができる すごい便利な関数があります。

[参考サイト]
集合を返す関数 - PostgreSQL 8.4.4文書

次のように使うことができます。

db=# SELECT * FROM generate_series(1, 5);

 generate_series
-----------------
               1
               2
               3
               4
               5

ステップも入れられます。

db=# SELECT * FROM generate_series(1, 5, 2);

 generate_series
-----------------
               1
               3
               5

TIMESTAMP 型もいけます。

db=# SELECT * FROM generate_series(
db-#     '2013/01/01'::TIMESTAMP, '2013/01/03', '1 day');

 generate_series
---------------------
 2013-01-01 00:00:00
 2013-01-02 00:00:00
 2013-01-03 00:00:00

FROM 句に書かない使い方もできます。

db=# SELECT generate_series(1, 3);

 generate_series
-----------------
               1
               2
               3

集合を返す、というところがすごいところで 次のように別の集合と一緒に使えば 直積などの集合の演算結果を簡単に取得することができます。

db=# SELECT f1 FROM tab1;

 f1
----
  1
  2
  3


db=# SELECT f1, generate_series(1, 3) FROM tab1;


 f1 | generate_series
----+-----------------
  1 |               1 
  1 |               2 
  1 |               3 
  2 |               1 
  2 |               2 
  2 |               3 
  3 |               1 
  3 |               2 
  3 |               3  

テストデータを作るときなどかなり役に立ちます。

祝 Raspberry Pi 2台目 到着(不在票)

12/19 に郵便局の不在票が入っていました。

WRITE_0652_01

前回同様、発送のメールから 7 日でした。

前回は、郵便受けに入れておいてくれたんですが 今回はケースも購入したためか 郵便局だからなのか 不在票でした。

受け取りは週末になりそうです。

Raspberry Pi で無線 LAN 接続 (2)

前回の (1) から少し間が開きましたが、無線 LAN の続きです。

WRITE_0650_01

せっかく Raspberry Pi に VNC 接続できるようにしたので GUI で設定していきたいと思います。

Raspbian の デスクトップには 「WiFi Config」というアイコンがあります。 このアイコンから 無線 LAN を設定することができます。

WRITE_0650_02

起動すると、次のような画面が出てきます。

WRITE_0650_03

「Manage Network」の「Scan」ボタンをクリックします。

検出された SSID が表示されます。

WRITE_0650_04

自分が接続する SSID をダブルクリックします。

設定内容の入力画面が出るので入力します。

WRITE_0650_05

DHCP サーバがあれば、これで設定は終了です。

接続されてました。

WRITE_0650_06

設定は保存されるので 次は GUI を起動しなくても Raspberry Pi を起動すれば 自動的に 無線 LAN に接続されます。

iPhone4 のキーボードから VNC 経由で Raspberry Pi を操作

前回は、 引退した iPhone4 にキーボードを装備して iPhone4 から Raspberry Pi に SSH 接続しました。 今回は、このキーボードを使って NVC 経由で Raspberry Pi を操作したいと思います。

といっても iPhone4 から 直接 VNC 接続するわけではありません。 iPhone4 にも VNC app は入れられるのですが iPhone4 の画面は小さいので iPad をモニタとして代わりに使います。

こんなイメージです。

WRITE_0648_01

キーボードは、iPhone4 に装備していますが、Bluetooth なので そのまま iPad のキーボードとしても使うことができます。
(当然ながら iPhone4 は居るだけで何もしていません・・・)

このようになりました。

WRITE_0648_02
(iPhone4=カメラが使用中のためガラケーで撮影)

キーボードからだと タブやハイフンの入力と カーソルによる移動やコマンド履歴ができるので かなり打ちやすくなりました。

和平フレイズ ほんわかふぇ 炊飯土鍋

Amazon に紹介されて、『和平フレイズ ほんわかふぇ 炊飯土鍋 (二重蓋) 3合炊 HR-8382』 を購入しました。

WRITE_0646_01

買ったときの値段は 1995円で これで 2000円切るのは良い買い物をしたな、と思います。

炊飯器と違って、自分で火加減を調整するので、 調節が難しそうと思う人もいるかもしれませんが とりあえず説明書に書いてある通りにするだけで 美味しく炊けます。

子供の頃は文化鍋で炊いていたのですが 炊飯器を使い出してから忘れていた 米を炊くことの楽しさ、 “作業”になっていた 米を炊くことが “料理”に戻った感じがします。
あと、炊飯器のありがたみも思い出せました。

急ぎのときや、予約したいときは炊飯器、 料理したいときは土鍋と、使い分けるのが良さそうです。

炊飯器しか使ってない人にちょっと注意かなと思うのは 蓋の裏についた水滴が土鍋の中に入ってきます。 炊飯器だと、この辺りは別のところに逃げるようになっていますが この土鍋にはそんな仕組みはないので 炊けた米を土鍋の中に入れっぱなしで蓋をしておくと、 底の方の米が水っぽくなってしまいます。

あと、昔からのオマジナイ?ですが、 火を消す前に 10〜20 秒程度強火にしてから消します。 こうするとしっかり炊き上がります。

WRITE_0646_02

今日も美味しく炊けました。

iPhone から Raspberry Pi に SSH 接続

引退した iPhone4 にキーボードを装備したので このキーボードを使って Raspberry Pi を操作したいと思います。

Raspberry Pi には SSH 接続します。

というのも、Raspberry Pi の VNC Server を止めてしまうと Raspberry Pi を操作する手段が 無くなってしまうためです。

SSH 接続は、無料の『SolarWinds Mobile Admin Client』を使います。 快適にサクサク、というわけにはいきませんが、 VNC Server の起動や シャットダウンくらいなら問題ありません。

[参考サイト]
iPad/iPhoneからフリーでSSHを使う | TECHoh!

さっそく接続してみます。

WRITE_0644_02

コマンドを実行。

WRITE_0644_02

ちゃんと色もついて表示されます。

ただ、キーボードのタブ、コントロール、カーソルキーは 反応しませんでした。 ちょっと残念ですが タブやコントロールキーが必要なときは 画面上部の [tab],[ctrl] などの操作アイコンを使います。

ちなみに、外付けキーボードが無く 横長モードで、キーボードを表示すると かなり画面が狭くなります。

WRITE_0644_03

この辺りは、キーボードが別にあることのメリットですね。

画面上部 [ctrl] などの操作アイコンは 表示・非表示を切り替えできるので 更に広く使うこともできます。

WRITE_0644_04

無料でここまでできるのはありがたいですね。

iPhone4 Bluetooth コンパクトキーボード ケース

引退した iPhone4 を何か便利に使いたいと思って 『iBUFFALO iPhone 4S/iPhone 4両対応 Bluetooth2.0対応 コンパクトキーボード ケース一体型 バックライト搭載 BSKBB12BK』 を購入しました。

WRITE_0643_03

iPhone5 が出たためか iPhone4/4S 用のこのキーボードは かなり値下げされて 約 2000 円で買うことができました。

まず、重いです。コンパクトな分、重量感はかなりあります。

WRITE_0643_02

ただ、この重量感がたまらない「ずっしりとした重さ」なのです。 キーボードをスライドさせるときの動きも、「カシャーン」という感じで これまたよくツボを押さえているな、と思います。

バックライトが付くので、暗いところでもキーボードが見えます。 キーで音楽や動画の再生などの操作ができるのも便利です。

WRITE_0643_01

なにより、カーソルキーが付いているので 細かい文字間の移動も簡単で、 このての作業(「」だけ打って、間に文字を入れるとか)は iPhone4 の小さな画面では大変なので すごくありがたいです。

WRITE_0643_04

まだもう少し iPhone4 に頑張ってもらうことになりそうです。

Raspberry Pi で iPad と VNC 接続

せっかく Raspberry Pi が NVC 接続できるようになったので iPad とつなげてみます。

iPad 側の VNC app は、『Mocha VNC Lite』(無料) を使います。 Mocha VNC Lite には、制限事項もありますが、無料なのでお試しするには丁度良い app です。

[参考サイト]
iPhoneとiPad用VNCアプリ17種類まとめ :: 実践CMS*IA

まず設定画面で SVN Server の IPアドレス、ポート、パスワードを指定します。

WRITE_0641_02

接続。

WRITE_0641_01

接続できました。

コンソールでコマンドを入力してみます。

WRITE_0641_03

良い感じです。

これで Raspberry Pi と iPad だけで作業できるようになりました。

Raspberry Pi で VNC 接続

無線 LAN の設定の途中なんですが Raspberry Pi に VNC Server を入れて PC から Raspberry Pi の X の画面の キャプチャーを取れるようにしたいと思います。

以下のサイトを参考に作業開始。

[参考サイト]
工作と小物のがらくた部屋: Raspberry Pi に VNC Server をインストール

インストール。

$ sudo apt-get install tightvncserver

インストールしたパッケージを起動。 パスワードを設定します。

$ tightvncserver

もうこれで VNC Server が使用できます。
ポートが LISTEN されています。

$ netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address  State
tcp        0      0 0.0.0.0:22      0.0.0.0:*        LISTEN
tcp        0      0 0.0.0.0:5901    0.0.0.0:*        LISTEN
tcp        0      0 0.0.0.0:6001    0.0.0.0:*        LISTEN

1 つ目は 5901 です。

VNC Server を止めてみます。

$ vncserver -kill :1

ポートの LISTEN (5901, 6001) が無くなりました。

$ netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address  State
tcp        0      0 0.0.0.0:22      0.0.0.0:*        LISTEN

もう 1度 VNC Server を起動します。

$ vncserver :1 -geometry 1024x768 -depth 24

次は PC 側です。

PC 側は、Windows で UltraVNC を使います。

[参考サイト]
窓の杜 - 【REVIEW】Windows向けに最適化された「VNC」互換のPCリモート操作ソフト「UltraVNC」

WRITE_0639_01

バッチリ接続できました。

Softbank の iPhone4 をガラケーに戻した話

2 年ほど Softbank の iPhone4を使っていたんですが 先日、前に使っていたガラケーに戻しました。 その時の話です。 もしかすると参考になる人がいるかもしれないので 書いておきます。

ガラケーに戻した理由は「通話がしにくい」というのもありますが 一番の理由は「パケット放題が必要なほどデータ通信をしない」ためです。

Softbank の iPhone4 の料金プランは、パケット放題が必須です。 パケット放題は、料金固定の「パケット放題フラット」と 下限のある「パケット放題 for スマートフォン」がありました。 2 年縛りの契約にすると、「パケット放題 for スマートフォン」の上限金額が 「パケット放題フラット」と同じになるため、 あまり使わない身としては、当然「パケット放題 for スマートフォン」に 入っていました。

購入当時は、データ通信を使っていた月もあったのですが 基本生活圏に Wi-Fi があり 家でも会社でも目の前に PC があるため、 通信料もパケット放題の下限に収まっていました。

さらに本体を買う時に、本体の金額を全額払ったため 2 年間、本体分の割引が適用されていました。 そのため、パケット放題が相殺されて、 毎月 基本料(934円)+ユニバーサルサービス料(3円)くらいを支払っていました。 (基本料等は、割引されません)

2 年経って 本体分の割引がなくなると パケット放題の料金も乗ってくるため、 そろそろ潮時と考えてガラケーに戻すことにしました。

ガラケー(Softbank ショップの人もそう呼んでいた)は iPhone4 に使っていたものです。 そのまま残してあったので、充電して Softbank ショップに持って行きました。

Softbank ショップで聞いたところ、これは「持ち込みによる機種変」になるそうです。 残念ながら、最初に行った Softbank ショップには、前のガラケーに使える SIM カードの 在庫がなく(新品用のものしかないとのこと)、変更することができませんでした。

事前に「持ち込みによる機種変をしたいけど、(機種名)の SIM カードの在庫はありますか?」と 電話で聞いておくのが良いそうです。

2 件目の店(電話で確認済み)では、あっさりと変更することができました。 SIM カードの再発行手数料 1900 円が、次の電話料金の支払いに加算されます。

2 年縛りの契約の場合、更新月の 1ヶ月以外は違約金(9,975円)が発生します。 2 年と 2 ヶ月経っていたため、違約金が発生するかな?と思っていたのですが、 ホワイトプランにも「ホワイトプラン R」という 2年縛りのプランがあり そちらに移行することで違約金は不要、ということになりました。 (これが公式ルールなのかはわかりません)

それと iPhone4 に挿してあった SIM カードの返却は求められませんでした。 iOS のバージョンアップ等で必要になるそうなので ちょっと心配していたのですが良かったです。

今は GPS 付きの iPod Touch として新しい人生を歩んでいます。

祝 Raspberry Pi 2台目 発送

今日、RS Online に注文していた 2台目の Raspberry Pi の発送メールが 来ました。

メモリ 512M で Revision2 です。

ちなみに今回は、次のような流れでした。

  • 2012/10/16 RS Online に登録
  • 2012/12/12 発送連絡メールを受信

ネットワークインターフェース名の固定化

最近の CentOS や Fedora を入れると ネットワークのインターフェース名が eth0 とかではなく em1 みたいな名前になってしまうことがあるそうです。

em というのは ethernet-on-motherboard の略のようです。

これは biosdevname という NIC と インターフェースの対応を固定化するための 仕組みだそうで、 CentOS では、NIC(の MAC アドレス)が変わると ethX の X が変わってしまうため それを固定化するために 1段階抽象化しているようです。

[参考サイト]
ALL about Linux: CentOS 6.0 で NIC と ethX の対応を固定化する

上記サイトによると DELL のマシンは biosdevname が ON になっているため ethX ではなく emX となったようです。

RHEL も同様で、機能の有効・無効化について書いてありました。

[参考サイト]
A.3. この機能の有効化と無効化 - Red Hat Customer Portal

Raspberry Pi で無線 LAN 接続 (1)

Raspberry Pi に USB の無線 LAN アダプタを接続します。

昔、3 つくらいまとめて買った PLANEX の GW-USValue-EZ が 余っていたので それを使います。

WRITE_0633_01

2012-09-18-wheezy-raspbian のイメージは 何もしなくても GW-USValue-EZ を認識できるようです。

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 2019:ed17 PLANEX GW-USValue-EZ 802.11n ...

USB ポートに挿すだけで GW-USValue-EZ を認識しました。

ifconfig を見ると、新しいインターフェースが追加されています。

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:22:cf:44:XX:XX
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

インターフェースは wlan0 という名前になります。

追加されたインターフェース(GW-USValue-EZ)から見える アクセスポイントを確認してみます。

$ iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 10:6F:3F:XX:XX:XX
                    ESSID:"45365416543FJELGG"
             (省略)
          Cell 02 - Address: 00:18:84:XX:XX:XX
                    ESSID:"FON_FREE_INTERNET"
             (省略)

アクセスポイントが周囲にあれば、ずらっと表示されます。

今回はここまで。

Google サイト内検索

Amazonアソシエイト