write ahead log

ロールフォワード用

WSLのUbuntuにsqlplus(Oracle client)を入れる

何でも動いてビビっちゃうWSLですが, sqlplusを入れてみました.

ますますWSL環境に引きこもりそうです.

ダウンロード

この辺からどうぞ.

Oracle Database 12c Release 1 (12.1.0.2.0)

ユーザ登録が要るの, 面倒ですけど.

libaio1とalienをインストール

oracleからはrpm形式で配布されているのでdeb形式に変換します.

変換に必要なalienをとりあえずインストール.

$ sudo apt-get install libaio1
$ sudo apt-get install alien

deb形式に変換する

$ sudo alien oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm
$ sudo alien oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64.rpm
$ sudo alien oracle-instantclient12.1-sqlplus-12.1.0.1.0-1.x86_64.rpm

インストール

sudo dpkg -i oracle-instantclient12.1-basic_12.1.0.1.0-2_amd64.deb
sudo dpkg -i oracle-instantclient12.1-devel_12.1.0.1.0-2_amd64.deb
sudo dpkg -i oracle-instantclient12.1-sqlplus_12.1.0.1.0-2_amd64.deb

環境設定

.profileとか.bashrcとかどこかに.

# oracle client
export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
export NLS_LANG=Japanese_Japan.UTF8
export PATH=$PATH:/usr/lib/oracle/12.1/client64/bin

この時点でbash再起動か

$ source .profile

で再読み込みしておきます.

prelinkしておく

この時点で動くかなと思ったのですが, 下記のエラーが出て動作しませんでした.

sqlplus: error while loading shared libraries: libclntsh.so.12.1: cannot enable executable stack as shared object requires: Invalid argument

ここは無能らしくstack overflowの意見を鵜呑みにします

sudo apt-get install prelink
sudo execstack -s /usr/lib/oracle/12.1/client64/bin/sqlplus

これで動作しました.

余談:prelinkって何や

こちらを参考にすると, shared objectをあらかじめ組み込んでしまうソフトだそうです.

へー.知らなかった.

ところで上記で実行したのは

execstack

ですが, こちらはセキュリティ機構の回避のためのコマンドらしいです.

Exec Sheildって初めて聞きました.

さらに余談

HOMEにoradiagディレクトリが出来て邪魔だったのですが消す方法があると知ってとてもうれしかったです.

WSL上のUbuntuのターミナル色テーマを変更する

色テーマを、変えたい

Ubuntu on WSL(bash on windows)は非常に使い勝手が良くて, すっかりこれ無しでは仕事ができなくなってしまった.

しかし色テーマ, これだけが不満だった. (赤が見づらい)

まぁ, プロパティからポチポチ変えりゃいいんですが, あまりにも面倒くさい.

うーむ, と色々Webを徘徊していると下記のページを見つけた.

Introducing the Windows Console Colortool

おぉ, そうなんすよ.

色テーマを簡単に変える方法が無いかをずっと探していたんだけど, どうも「colortool」というものをMicrosoftが出してくれているらしい.

Githubにリポジトリされている.

これは便利すぎる.

使ってみる

  1. Githubからまずはzipをダウンロードします
  2. 解凍して, cmd.exeを開き, 解凍したフォルダへ移動します
  3. コマンドを入れます
> colortool -d [色テーマ]

サンプルではsolarized_darkが紹介されていますね.

> colortool -d solarized_dark

私はOneHalfDarkにしてみました.

とても美しいです.

psqlコマンド自分用チートシート

PostgreSQLのコマンド, psql.

バージョンは9.6

個人的にはMySQLより分かりやすい気がする.

インストール

$ sudo apt install postgresql-client

9.6限定にするには以下.

$ sudo apt install postgresql-client-9.6

WSL上だとUbuntu Xenialだった.

9.5までしかなかったので先にリポジトリを追加した,下記手順を先に実行すればよい.

$ sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main"
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update

接続

$ psql -h [ホスト名] -U [ユーザ名] -d [データベース名]

クエリ

\xで拡張表示(縦表示)できる.

\eで直前に編集したSQLを編集できる.

終了

\q

コマンドの実行履歴

~/.psql_historyに残る

バックアップ

$ pg_dump -h [ホスト名] [データベース名] > [バックアップファイル名]

リストア

$ psql [データベース名] < [バックアップファイル名]

MySQLコマンド自分用チートシート

インストール

ubuntuの場合(WSL可)

$ sudo apt install mysql-client

接続

WSLのUbuntu上からローカルへ接続する場合は[127.0.0.1]と指定が必要だった.
(localhostではダメだった)

長いので開発時はalias組んだ方がいい.

普通につなぐ
$ mysql -h [ホスト名] -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] [スキーマ名]
縦表示でつなぐ

縦表示(psqlでの拡張表示)で常に表示したい場合は-Eを付ける.

$ mysql -h [ホスト名] -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] [スキーマ名] -E
ページャ指定でつなぐ

とりあえずless指定してみる.

$ mysql -h [ホスト名] -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] [スキーマ名] -E --pager="less" 
エンコーディング指定でつなぐ

utf8にすると

$ mysql -h [ホスト名] -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] [スキーマ名] -E --pager="less"  --default-character-set=utf8

クエリ

縦表示(拡張表示)

クエリの末尾に\Gを付けると縦表示になる.
(コマンド起動時に-Eを付けている場合はデフォルトで縦表示になる)

> SELECT * FROM users\G
編集

エディタでクエリを編集できる.

> edit

エディタ終了後に;でクエリ実行.

データベースの一覧
> show databases;
テーブルの一覧
> show tables;

終了

> quit

コマンドの実行履歴

デフォルトでは以下にある.

~/.mysql_history

バックアップ

mysqldumpコマンドを使う.

$ mysqldump -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] -h [ホスト名] -t [スキーマ名] > [出力ファイル名]

リストア

mysqlコマンド経由で標準入力からSQLを投入するだけ.

必要であれば事前にCREATE DATABASEを実行.

接続方法は前掲通り.

$ mysql -h [ホスト名] -u [ユーザ名] -p[パスワード(pとの間にスペース入れない)] [スキーマ名] < [リストアファイル名]

lsの色付けを変更する

Ubuntu(on WSL)で試した.

lsで色付けされるのは便利だが, 色によってはかえって見にくい.

色を変えたいのだが, どうも.bashrc.dircolorsというファイルを読み込もうとしている.

知らなかったのだが, dircolorsコマンドというのがあって設定できるらしい.

手順は以下の通り.

# .dircolorsを作成
$ dircolors -p > ~/.dircolors
# 編集(カラーコードが書いてあるので開けばすぐわかる)
$ vi ~/.dircolors
# bashを再起動するか設定を再読み込み

Ubuntuのデフォルトの.bashrcではホームディレクトリの.dircolorsを先に読み込む設定になっていたのでこれだけで済んだ.

いやぁ, もっと前にやっとけばよかった.

Test::Unitでテストを定義順に実行する

Test::Unitはデフォルトではテストを名前順に実行する.

require 'test/unit'

class TestSample < Test::Unit::TestCase
  def test_B
    puts "B"
  end

  def test_A
    puts "A"
  end
end
$ ruby sample.rb
Loaded suite sample
Started
A
.B
.

Finished in 0.0011721 seconds.
-------------------------------------------------------------------------------------
2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------
1706.34 tests/s, 0.00 assertions/s

これを定義順にしてやりたいときにはtest_order = :definedという指定が出来るらしい.

require 'test/unit'

class TestSample < Test::Unit::TestCase

  self.test_order = :defined

  def test_B
    puts "B"
  end

  def test_A
    puts "A"
  end
end
$ ruby sample.rb
Loaded suite sample
Started
B
.A
.

Finished in 0.000768 seconds.
--------------------------------------------------------------------------------------
2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
--------------------------------------------------------------------------------------
2604.17 tests/s, 0.00 assertions/s

うーん, 設計がダサい証拠な気もするけど, 便利だ.

Test::Unitでテスト群の最初と最後にだけメソッドを呼びたい

あんまりよろしくないやり方な気がするけど, 便利な時には便利なので.

標準で用意されているsetupteardownは各テストケースの呼び出し前後に呼び出される.

require 'test/unit'

class TestSample < Test::Unit::TestCase
  def setup
    puts "setup"
  end

  def teardown
    puts "teardown"
  end

  def test_foo
    puts "foo"
  end

  def test_bar
    puts "bar"
  end
end
$ ruby sample.rb
Loaded suite sample
Started
setup    [準備して]
bar
teardown [片付ける]
.setup   [準備して]
foo
teardown [片付ける]
.

Finished in 0.0010129 seconds.
----------------------------------------------------------------------------------------------------
2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------
1974.53 tests/s, 0.00 assertions/s

普通はこれで何の問題もない.

なんだけど, たまーにテストケース全体の最初と最後だけに呼び出したい事がある.

$ ruby sample.rb
Loaded suite sample
Started
setup     [最初に準備して]
bar
.foo
.teardown [最後に片付ける]


Finished in 0.0009669 seconds.
----------------------------------------------------------------------------------------------------
2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------
2068.47 tests/s, 0.00 assertions/s

強引だなぁとは思うけど, TestUnitが最初と最後に呼ぶstartupshutdownを特異クラスでオーバーライドしてやればできるらしい.

require 'test/unit'

class TestSample < Test::Unit::TestCase
  class << self
    def startup
      puts "setup"
    end

    def shutdown
      puts "teardown"
    end
  end

  def test_foo
    puts "foo"
  end

  def test_bar
    puts "bar"
  end
end

まぁ, 原則やるなってことだよね, これ.

便利な時は便利なんだけどなぁ.