覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

PostgreSQLでSQLの実行時間を計測する

psqlで以下コマンドを実行することで各SQLの実行時間を計測できます

\timing

実行すると Timing is on. と出力されます

SAMPLEDB=> \timing
Timing is on.


コマンドを実行した後、SQLを発行すると以下のように実行時間が出力されます

SAMPLEDB=> select count(*) from samletbl1;
 count 
-------
  3210
(1 row)

Time: 0.548 ms

「<インターネット>の次に来るもの 未来を決める12の法則」

「<インターネット>の次に来るもの 未来を決める12の法則」の気になった部分の抜粋です。
すごく面白い本です。正直言ってこのブログエントリ見ても何のこっちゃでしかないので、実際に書籍を読まれることをお勧めします。


私の抜粋には全章は登場しませんが、実際にはこの本は以下の12章から成り立っています。

  1. BECOMING — ビカミング
  2. COGNIFYING — コグニファイング
  3. FLOWING — フローイング
  4. SCREENING — スクリーニング
  5. ACCESSING — アクセシング
  6. SHARING — シェアリング
  7. FILTERING — フィルタリング
  8. REMIXING — リミクシング
  9. INTERACTING — インタラクティング
  10. TRACKING — トラッキング
  11. QUESTIONING — クエスチョニング
  12. BEGINNING — ビギニング


1. BECOMING - ビカミング

  • 存在するということとは、主にメンテナンスするということなのだ。
  • 個人が使うテクノロジーがどんどん複雑になってくると、周辺機器ともお互い共存するようになり、それは生きた生態系(エコシステム)のようになっていくので、アップグレードを遅らせることにより破壊的な結果をもたらすことになる。
  • 未来のテクノロジー生活は、終わることのないアップグレードの連続となる。
  • 居心地が悪くない世界はユートピアだ。しかしその世界は停滞している。ある観点から完全に正当に思える世界は、他の観点からは恐ろしく不公平だ。
    ユートピアに解決すべき問題はないが、チャンスもない。
  • われわれが新しいものを古いものの枠組みで捉えようとしがちだということだ。現在の見方を将来にそのまま当てはめることで、実際には新しいことをすでに知っているものに当てはめようとして歪めることになる。
  • われわれは、いまここで起きている変化を知覚することがとても苦手だ。
    その先が明らかに不可能なものに見えたり、あり得ない、あるいはあまりにもばからしいと思えたりすると、それを無視してしまう。


2. COGNIFYING - コグニファイング

  • われわれは人間の知性を、他の種類の知性と比べてより多くの問題に対処できるからと「汎用」と呼びたがるが、より多くの人工的な知能を生みだせば生み出すほど、人間の思考には汎用性がまるでないことに気づくことになる。それは思考の一つの種に過ぎないのだ。


4. SCREENING - スクリーニング

  • ウィキペディアはもちろん百科事典だが、それを仮に一冊の巨大な本であると考えてみよう。
    その3400万ページで、リンクが張られ青い下線の付された文字は、この百科事典の他の概念とハイパーリンクで結ばれている。こうした絡まり合った関係性こそが、ウィキペディアにそしてウェブそのものにとてつもない力を与えているのだ。
  • 一冊の本のどのページからも、他のページや他の本へと飛べるようになる。そうなれば本はもはや一冊ごとに綴じられたものでなく、全ての本が織り込まれた巨大なメタレベルの本になり、ユニバーサルな図書館となるだろう。シナプスのように相互につながった図書館が集合知を生み出し、個体の本からは見えない世界を見せてくれるだろう。
  • リンクとタグは過去50年で最も重要な発明かもしれない。あながたリンクを張ったりタグ付けしたりするたびに、あなたは人知れずそのウェブの評価を上げ、よりスマートにしている。
  • 科学とは世界中の知識を一つのウェブにするための運動であり、そこでは広大な事実関係が互いに結ばれ、脚注を付けられ、互いに査読される。独立した事実は、その世界で意味があったとしても、科学的にほとんど意味がない。だから科学のウェブにもたらされるどんな新しい観測結果やデータも、その他のすべてのデータの価値を高めることになる。
  • 新しく創られたものの評価は、かつてのように評論家が決めるのではなく、それが世の中の他のものとどれだけリンクしているかで決まる。人も創作物も事実も、リンクされるまで存在していない


5. ACCESSING - アクセシング

  • 「所有権の購入」から「アクセス権の定額利用(サブスクリプション)」への転換は、これまでのやり方をひっくり返す。
    所有することは手軽で気紛れだ。もしも何かもっと良いものが出てきたら買い換えればいい。一方でサブスクリプションではアップデートや問題解決やバージョン管理といった終わりのない流れに沿って、作り手と消費者の間で常にインタラクションし続けなければならなくなる。
  • スタートアップ企業は、非効率なものをいままでにないやり方で利用しようとする。彼らはある時間に空いている資源(空き部屋、駐車したままの車、使われていないオフィスなど)を集めて、いますぐに使いたいと待ちわびている人々と組み合わせる。
  • ウェブはハイパーリンクの張られた文書だが、クラウドはハイパーリンクのされたデータだ。
    究極的には、クラウド上にはいろいろなものを置くことは、データを深いレベルで共有することになる。


6. SHARING - シェアリング

  • すべてのプロセスを晒してしまえば、自分が間違うことが少なくなるし、実際にう上手くいけば正しいやり方が分かりやすくなる。
    科学の分野でも、こうした方式を取り入れている。ある実験が上手くいかなかったら、科学者はその結果をシェアするよう求められる。
  • コラボレーションにおいて早いうちからシェアしていれば、それだけ学習も成果も速くなる


8. REMIXING - リミクシング

  • 文章のリテラシーとはつまり文章を構文解析して操作するものだとすると、新しいメディアリテラシーとは、動画を同じように簡単に構文解析して操作できることを意味する。
  • 最高のアプリとはやり直し回数に制限がなく、好きなだけ元に戻れるものだ。
    フォトショップやイラストレーターといった、一般消費者向けソフトの中でも最も複雑な部類のものは、「非破壊編集」を採用している。これは、どれだけ変更を重ねても、作業のどの時点にもいつでも遡ってそこから再開できる機能だ。ウィキペディアが優れているのもやはり非破壊編集を採用しているところで、以前のすべての版がのそのままずっと残っており、どの読者も過去のどの地点へも遡れる。このやり直し機能が創造性を刺激しているのだ
  • われわれの法体系のほとんどはまだ農耕時代の原理原則で動いており、所有物には実体があることが前提となっている。
    つまりデジタル時代に追いついていないのだ。それは努力が足りないのではなく、所有することが以前ほど重要でなくなった時代に、所有がどう機能するかを明確にできていないせいだ。


9. INTERACTING - インタラクティング

  • 父親が高解像度の画像を写真用の紙に印刷して、コーヒーテーブルの上に置いた。するとよちよち歩きの娘がそれに近付いて、指を置くと拡げてその写真を大きくしようとしているのに彼は気づいた。彼女はその動作を何回か繰り返して上手くいかないと、困ったような顔をして、「パパ、こわれてるよ」といった。
    そう、インタラクティブでないものは故障しているのだ


10. TRACKING - トラッキング

  • メタ情報は他のビット情報とリンクされることでその価値を増し、新しい富の源泉となる。ビットにとって最も非生産的なことは、そのまま何もされず放っておかれることだ。コピーもされず、シェアされず、他のビットとリンクもされないビットは短命に終わる。ビットにとって最悪の未来とは、ある暗い隔離されたデータ保管庫に入れられたままになることだ。ビットが本当に望んでいるのは、他の関連するビットと一緒になって、広く複製され、永続的なプログラムの一部としてメタビットあるいは実行ビットとなることだ。
  • ビットを人に喩えるならこうなるだろう。
    • ビットは動きたがる
    • ビットは他のビットとリンクされたい
    • ビットはリアルタイムで気づかれたい
    • ビットは複製され、模倣され、コピーされたい
    • ビットはメタ情報になりたがる


11. QUESTIONING - クエスチョニング

  • 皮肉なことに、最良の質問とは答えに行き着くものではない。というのも答えはどんどん安く豊富になっていくからだ。
    良い質問とは、それ一つで100万個の良い答えに匹敵するものだ。
    それは例えばアルバート・アインシュタインが少年のように自分に尋ねた質問だ。「もし光線の上に乗って飛んだら何が見えるだろう?」この質問が相対性理論や原子力時代を導き出した。
    • 良い質問とは、正しい答えを求めるものではない。
    • 良い質問とは、すぐに答えが見つからない。
    • 良い質問とは、現在の答えに挑むものだ。
    • 良い質問とは、ひとたび聞くとすぐに答えが知りたくなるが、その質問を聞くまではそれについて考えてもみなかったようなものだ。
    • 良い質問とは、思考の新しい領域を創り出すものだ。
    • 良い質問とは、その答えの枠組み自体を変えてしまうものだ。
    • 良い質問とは、科学やテクノロジーや政治やビジネスにおけるイノベーションの種になるものだ。
    • 良い質問とは、探針であり、「もし~だったら」というシナリオを調べるものだ。
    • 良い質問とは、ばかげたものでも答えが明白なものでもなく、知られていることと知られていないことの狭間にあるものだ。
    • 良い質問とは、予想もしない質問だ。
    • 良い質問とは、教養のある人の証だ。
    • 良い質問とは、さらに他の良い質問をたくさん生み出すものだ。
    • 良い質問とは、マシンが最後までできないかもしれないものだ。
    • 良い質問とは、人間だからこそできるものだ。



関連エントリ

PostgreSQLでindex作ったり削除したり

PostgreSQLでのindexの作成方法や削除方法など


indexの作成

以下の構文でできます

CREATE INDEX {index名} ON {Table名} ({Column名});

これにより作成されるindexの種類はbtreeになります。


■実行例

SAMPLEDB=> CREATE INDEX sampletbl1_column1_idx ON sampletbl1 (column1);
CREATE INDEX


ユニークindexにする場合

CREATE UNIQUE INDEX {index名} ON {Table名} ({Column名});


indexの種類を指定する場合

indexの種類をbtree以外にしたい場合はUSINGで指定します。
例えばGiSTのindexを使用する場合は以下のようになります

CREATE INDEX {index名} ON {Table名} USING GIST ({Column名});


indexの作成(対象indexが存在しない場合だけ作成を行う)

対象のindexが存在しない場合だけ作成する(存在する場合でもエラーにならないようにする)には以下の構文

CREATE INDEX IF NOT EXISTS {index名} ON {Table名} ({Column名});


indexの削除

以下の構文でできます。CREATE INDEXで指定したindex名を指定して

DROP INDEX {index名};


■実行例

SAMPLEDB=> DROP INDEX sampletbl1_column1_idx;
DROP INDEX


indexの削除(対象indexが存在する場合だけ削除を行う)

対象のindexが存在する場合だけ削除する(存在しない場合でもエラーにならないようにする)には以下の構文

DROP INDEX IF EXISTS {index名};


indexの状況確認

psqlで以下操作をすることでindexの状況を各印できます


indexの一覧

以下でindexの一覧を確認できます

\di

■実行例

SAMPLEDB=> \di
                                 List of relations
 Schema |                 Name               | Type  | Owner  |     Table                
--------+------------------------------------+-------+--------+------------------
 public | sampletbl1_column1_idx             | index | user   | sampletbl1
 public | sampletbl1_column2_idx             | index | user   | sampletbl1
 public | sampletbl2_columnA_idx             | index | user   | sampletbl2
 public | sampletbl2_columnB_idx             | index | user   | sampletbl2


indexの詳細確認

以下でindexの詳細を確認できます

\d {index名}

■実行例

SAMPLEDB=> \d sampletbl1_column2_idx 
         Index "public.sampletbl1_column2_idx"
       Column       |  Type   |     Definition     
--------------------+---------+--------------------
 id                 | bigint  | id
 column2            | integer | column2
primary key, btree, for table "public.sampletbl1"



関連エントリ

Linux - bashワンライナーループ

bashのワンライナーループは何だかんだでよく使うので、ここからコピペする目的のためメモです。


基本的に以下で実行できる

for i in {1..<end>} ; do <something command> ; done

10回コマンドを実行するなら以下

for i in {1..10} ; do <something command> ; done


例えば10個のディレクトリ(dir1~dir10)を作成するなら以下のような感じ

for i in {1..10} ; do mkdir dir${i} ; done


例えば100個のファイル(file1.txt~file100.txt)を作成するなら以下のような感じ

for i in {1..100} ; do echo ${i} > file${i}.txt ; done

ND4J - 行列の演算

前回のエントリでND4Jを利用して、ベクトルの演算を試しました

今回は行列の演算を試してみます。


各種演算

行列の和

行列と行列の足し算です。

\begin
{bmatrix}
1.0 \ 2.0 \\
3.0 \ 4.0
\end
{bmatrix}
+
\begin
{bmatrix}
11.0 \ 12.0 \\
13.0 \ 14.0
\end
{bmatrix}=\begin{bmatrix}
12.0 \ 14.0 \\
16.0 \ 18.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});
INDArray matrixB = Nd4j.create(new double[]{11.0, 12.0, 13.0, 14.0}, new int[]{2, 2});

INDArray matrixRet1 = matrixA.add(matrixB);
System.out.println("Ret1: \n" + matrixRet1);

■実行結果

Ret1: 
[[12.00, 14.00],
 [16.00, 18.00]]


行列の差

行列と行列の引き算です。

\begin
{bmatrix}
1.0\ 2.0 \\
3.0\ 4.0
\end
{bmatrix}
-
\begin
{bmatrix}
11.0\ 12.0 \\
13.0\ 14.0
\end
{bmatrix}=\begin{bmatrix}
-10.0\ -10.0 \\
-10.0\ -10.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});
INDArray matrixB = Nd4j.create(new double[]{11.0, 12.0, 13.0, 14.0}, new int[]{2, 2});

INDArray matrixRet2 = matrixA.sub(matrixB);
System.out.println("Ret2: \n" + matrixRet2);

■実行結果

Ret2: 
[[-10.00, -10.00],
 [-10.00, -10.00]]


行列×スカラー

行列をスカラー倍します。

\begin
{bmatrix}
1.0\ 2.0\\
3.0\ 4.0
\end
{bmatrix}
\cdot3=\begin{bmatrix}
3.0\ 6.0 \\
9.0\ 12.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});

INDArray matrixRet3 = matrixA.mul(3);
System.out.println("Ret3: \n" + matrixRet3);

■実行結果

Ret3: 
[[3.00, 6.00],
 [9.00, 12.00]]


行列と行列の積

行列と行列のかけ算です

\begin
{bmatrix}
1.0\ 2.0\\
3.0\ 4.0
\end
{bmatrix}
\begin
{bmatrix}
11.0\ 12.0\\
13.0\ 14.0
\end
{bmatrix}=\begin{bmatrix}
37.0\ 40.0 \\
85.0\ 92.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});
INDArray matrixB = Nd4j.create(new double[]{11.0, 12.0, 13.0, 14.0}, new int[]{2, 2});

INDArray matrixRet4 = matrixA.mmul(matrixB);
System.out.println("Ret4: \n" + matrixRet4);

■実行結果

Ret4: 
[[37.00, 40.00],
 [85.00, 92.00]]


零行列との積

行列と零行列のかけ算です

\begin
{bmatrix}
1.0\ 2.0\\
3.0\ 4.0
\end
{bmatrix}
\begin
{bmatrix}
0.0\ 0.0\\
0.0\ 0.0
\end
{bmatrix}=\begin{bmatrix}
0.0\ 0.0 \\
0.0\ 0.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});
INDArray zeroMatrix = Nd4j.zeros(2, 2);

INDArray matrixRet5 = matrixA.mmul(zeroMatrix);
System.out.println("Ret5: \n" + matrixRet5);

■実行結果

[[0.00, 0.00],
 [0.00, 0.00]]


単位行列との積

行列と単位行列のかけ算です

\begin
{bmatrix}
1.0\ 2.0\\
3.0\ 4.0
\end
{bmatrix}
\begin
{bmatrix}
1.0\ 0.0\\
0.0\ 1.0
\end
{bmatrix}=\begin{bmatrix}
1.0\ 2.0 \\
3.0\ 4.0
\end{bmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0}, new int[]{2, 2});
INDArray identityMatrix = Nd4j.eye(2);

INDArray matrixRet6 = matrixA.mmul(identityMatrix);
System.out.println("Ret6: \n" + matrixRet6);

■実行結果

Ret6: 
[[1.00, 2.00],
 [3.00, 4.00]]


転置行列

対象行列Cの転置行列を求めます

\begin
{equation}
C=
\begin
{bmatrix}
1.0\ 2.0\ 3.0\\
4.0\ 5.0\ 6.0\\
7.0\ 8.0\ 9.0
\end{bmatrix}
\end{equation}

\begin
{equation}
C^{T}=
\begin
{bmatrix}
1.0\ 4.0\ 7.0\\
2.0\ 5.0\ 8.0\\
3.0\ 6.0\ 9.0
\end{bmatrix}
\end{equation}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixC = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}, new int[]{3, 3});

INDArray matrixRet7 = matrixC.transpose();

System.out.println("Raw Matrix: \n" + matrixC);
System.out.println("Transposed Matrix: \n" + matrixRet7);

■実行結果

Raw Matrix: 
[[1.00, 2.00, 3.00],
 [4.00, 5.00, 6.00],
 [7.00, 8.00, 9.00]]
Transposed Matrix: 
[[1.00, 4.00, 7.00],
 [2.00, 5.00, 8.00],
 [3.00, 6.00, 9.00]]


逆行列

対象行列Aの逆行列を求めます

\begin
{equation}
A=
\begin
{bmatrix}
1.0\ 2.0 \\
3.0\ 4.0
\end
{bmatrix}
\end
{equation}

\begin
{equation}
A^{-1}=
\begin
{bmatrix}
-2.0\ 1.0 \\
1.5\ -0.5
\end{bmatrix}
\end{equation}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.inverse.InvertMatrix;

INDArray matrixC = Nd4j.create(new double[]{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}, new int[]{3, 3});

INDArray matrixRet8 = InvertMatrix.invert(matrixA, false);

System.out.println("Raw Matrix: \n" + matrixA);
System.out.println("Invert Matrix: \n" + matrixRet8);

// 元の行列×逆行列=単位行列
System.out.println("identity Matrix: \n" + matrixA.mmul(matrixRet8));

■実行結果

Raw Matrix: 
[[1.00, 2.00],
 [3.00, 4.00]]
Invert Matrix: 
[[-2.00, 1.00],
 [1.50, -0.50]]
identity Matrix: 
[[1.00, 0.00],
 [0.00, 1.00]]



関連エントリ