Windows用のPostgreSQL 9.3でUUIDを使えるようにする

シーケンスの代わりにuuidをIDとして使う | Siguniang's Blogを見ながら必要なことだけをメモ。

uuid-osspを有効にする

Windows用のPostgreSQLには最初からライブラリが同梱されているので、有効化する。

CREATE EXTENSION "uuid-ossp";

UUIDを生成する

v1, v3, v4, v5が使えるらしいけど、実質v1とv4ぐらいしか使わないよね。

select uuid_generate_v1();
select uuid_generate_v4();

UUIDをプライマリキーにしたテーブルを作る

CREATE TABLE sample (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    value text
)

Windows 8.1上にScalatra開発環境を作る

基本手順は公式ページに書いてある通りだが、Windowsだと多少面倒が発生する。

JDKのインストール

OracleのページからJDK 7u51をダウンロードしてインストール。

Conscriptのインストール

Conscriptとは、GitHubでホストされているScalaプログラムの管理(インストール/アップデート)を行うためのツールのようだ。GitHubにアクセスする関係上、Gitコマンドに依存しているらしい(未確認)ので、予めGit for Windows等をインストールしないとダメかもしれない。

Windowsでインストールする場合は、ConscriptのGitHubページからダウンロードできるJava製のインストーラを利用する。おそらくjarをダブルクリックでインストーラが起動できるはずだが、インストーラが起動しない場合は、次のようなコマンドを実行する。

$ java -jar conscript-0.4.4.jar

インストール処理が完了しても、渋いインストーラ画面は表示されっぱなしなので注意が必要である。なお、%USERPROFILE%\bin に対してPATHが通ってない場合、インストール完了時に次のような画面が表示される。

f:id:terurou:20140221184751p:plain

このような画面が出た場合は、PATHに %USERPROFILE%\bin を通しておく。

giter8のインストール

giter8はテンプレートからScalaプロジェクトのスケルトンを作成するツールのようだ。

インストールは次のコマンドを実行するだけで良い。

$ cs n8han/giter8

sbtのインストール

次のsbtのダウンロードページから、MSIをダウンロードしてきてインストール。

Setup — sbt Documentation

scalatraプロジェクトの作成

適当なディレクトリに移動して、次のコマンドを実行する。

$ g8 scalatra/scalatra-sbt

プロジェクトのひな形を作るための設定の入力を求められるので、適当に入力するとプロジェクトが作成される。設定内容についてはFirst steps | Scalatraを参照。

プロジェクトが作成されたら、ルートディレクトリ内に、次の内容で sbt.bat ファイルを作成する。

@echo off
java -Dinput.encoding=Cp1252 -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M -jar "%SBT_HOME%bin\sbt-launch.jar" %*

scalatraプロジェクトの起動

次のコマンドを実行すると、 http://localhost:8080/ で作成したscalatraアプリにアクセスできる。sbt初回起動時は依存ライブラリのダウンロードで非常に長い時間待たされるので注意…。

$ sbt
> container:start

また、container:start した後で、sbt上で次のコマンドを実行すると、ファイルを編集した際に自動コンパイルしてくれるようになる。

> ~ ;copy-resources;aux-compile

IDE用の設定

EclipseIntelliJEmacs用のプロジェクトファイルを出力することができる。また、EclipseIntelliJではデバッグも可能になる。詳細は次のページを参照。

IDE Support | Scalatra

Scalatra + ScalaTestでunit test

公式ドキュメントの記載通りに設定すれば動く。

ScalaTest | Testing | Scalatra guides

設定

project/build.scalaのlibraryDependenciesに、次を追加。

"org.scalatra" %% "scalatra-scalatest" % "2.2.2" % "test"

テストコード

package test.app

import org.scalatra.test.scalatest._
import org.scalatest.FunSuite

class TestServletTests extends ScalatraSuite with FunSuite {
  addServlet(classOf[TestServlet], "/*")

  test("simple get") {
    get("/") {
      status should equal (200)
      body should include ("Hello")
    }
  }
}

テスト実行

$ sbt
> test

特定のテストだけ動かしたい時は、次のようにする。

$ sbt
> test-only org.acme.RedSuite org.acme.BlueSuite
> test-only *RedSuite

細かい点については、ScalaTestのページを参照。

ScalaTest

Debian wheezy(Debian 7.4)にPostgreSQL 9.3(最新版)をインストール

公式ページの手順通り。

PostgreSQL: Linux downloads (Debian)

PostgreSQLのaptリポジトリを追加

/etc/apt/sources.list.d/pgdg.list を作成して、次の通り記述する。

deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main

リポジトリのキーを追加して、パッケージリストを更新。

$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update 

PostgreSQL 9.3をインストール

$ sudo apt-get install postgresql-9.3

Debian wheezy(Debian 7.4)にOracle JDKをインストール

基本的には次の手順の通りとなる。

JavaPackage - Debian Wiki

java-packageのインストール

JDKをインストールするために必要らしい。

$ sudo apt-get -y install java-package

JDKのダウンロード

GUIをインストールしてない環境でもいけるように、wgetで無理やりダウンロードしてくる。JDK 7u51 x64のtar.gz版をダウンロードする場合は次の通りとなる。

$ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com" "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-x64.tar.gz"

JDKをwgetで直接ダウンロードしたいとき

JDKのインストール

$ make-jpkg jdk-7u51-linux-x64.tar.gz
$ sudo dpkg -i oracle-j2sdk1.7_1.7.0+update51_amd64.deb
$ sudo update-alternatives --config java 

Debian wheezy(Debian 7.4)のVagrant Boxを作成する

基本的な手順はCreating a Base Box - Vagrant Documentationを参照。

Debuan wheezyのインストールイメージを取得

VirtualBoxVMを作成(Debianのインストール)

仮想マシン作成時のポイントとしては、

  • VM作成時の名前はなんでもOK。最終的なBox名とは関係がない(ここではdebian_wheezy_x64とした)
  • オーディオとUSBコントローラを無効化(Vagrant推奨)
  • メモリは512MBにする(Vagrant推奨)
  • 仮想ディスクはvmdkにする(これがVagrant界隈では普通っぽい)

となる。ただ、自分の好みの問題(どうせ後から増やすので)、メモリは1024MBとした。あと、仮想ディスクは、とりあえず可変32GBにしておいた。その他のVirtualBox上の設定は初期設定のまま。

次に、Debianインストール時の設定だが、

  • 日本語環境向けに色々選択
  • rootパスワードは vagrant にする
  • ログインアカウントに vagrant(パスワードは vagrant)を作成
  • 初期インストールパッケージは「標準システムユーティリティ」と「SSHサーバ」のみを選択

ぐらいしか気にするところはなかった。

VirtualBox NATを仮設定

Debianをインストールが完了した時点でSSH接続できる。初期セットアップ時の作業が楽になるので、暫定的にSSH接続できるようにVirtualBoxのNATを変更する。とりあえず、次のように設定した。

f:id:terurou:20140220151534p:plain

これで、localhost:10022にssh接続すると、VMの方に繋がるようになる。

GRUBの設定

VMを起動するたびにブートローダが表示されても邪魔くさいので、表示しないようにする。

/etc/default/grub を次のように設定する。

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

設定ができたら、

$ update-grub

grub2 - How do I hide the GRUB menu showing up in the beginning of boot? - Ask Ubuntu

パッケージのアップデート

念のためアップデートする。netinst CDを利用しているので、たぶん更新はないはず。

$ apt-get update
$ apt-get upgrade

VirtualBox Guest Additionsのインストール

まずはVirtualBox側でGuest Additonsのインストールメディアをマウントする。

f:id:terurou:20140220163701p:plain

操作ができたら、次のコマンドを実行してインストール。

$ mount /media/cdrom
$ sh /media/cdrom/VBoxLinuxAdditions.run

IPv6無効化

Vagrant環境では使うことはないのでOFFにする。

/etc/sysctl.conf の末尾に次を追加。

net.ipv6.conf.all.disable_ipv6 = 1

設定を反映する。

$ sysctl -p

sudoの設定

Vagrantの設定要件として、パスワード無しのsudoを設定する必要がある。

まずはsudoのインストール。

$ apt-get install sudo

sudoをインストールしたら、vagrantユーザ用に設定を追加する。

$ visudo

で、エディタが開くので、末尾に以下を追加。

vagrant ALL=(ALL) NOPASSWD: ALL

SSHの設定

とりあえず、Vagrantのマニュアルでは、sshdの設定で「UseDNS no」にしておくべし(どうせローカルからしか繋がないので)と書いてあるので、それに従う。

/etc/ssh/sshd_configを開いて、次を末尾に追加する。

UseDNS no

普通にsshdを設定すると、ここで「PermitRootLogin no」を書きたくなるけど、他のイメージを確認したら、yesのままにしてあった。

続いてvagrantユーザ用にSSH公開鍵を設定する。

手順を簡略化するために、vagrantユーザで次のコマンドを実行する。

$ cd ~
$ mkdir .ssh
$ cd .ssh
$ wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
$ mv vagrant.pub authorized_keys
$ chmod 600 authorized_keys
$ chmod 700 .

あとはVagrant用の秘密鍵を使って接続できるか確認する。

MTAの停止(任意)

デフォルトでMTA(exim4)がインストールされて、自動でサービスが起動するようになってるっぽいので、気になる場合は止める。

$ update-rc.d -f exim4 remove

Puppet/Chefのインストール(任意)

必須ではないが、入れておいて損はない。

Puputをインストール。

$ apt-get -y install puppet puppetmaster

Chefをインストール。

$ apt-get -y install chef

インストール時にChef Clientの接続先の設定を聞かれるので、空欄のまま無視で良い。Chefのインストールが終わったら、Chef Clientのサービスを停止しておく。

$ /etc/init.d/chef-client stop
$ update-rc.d -f chef-client remove

追加で色々インストール(任意)

お好きな物入れてください。とりあえずVimとGitあたりは入れといた方が無難っぽいので入れた。あと、curlもよく使うので入れる。

$ apt-get -y install vim git curl

あと、私はWindowsで使う前提で、SharedFolderを使う時に問題がある(VirtualBoxのShared Folderが遅すぎるのでどうにかする(Windows向け) - terurouメモ)ので、sambaもインストールした。

コマンド履歴の削除(任意)

なんとなくコマンド履歴が残っているのが嫌なのでクリアする。

$ export HISTSIZE=0
$ rm .bash_history

Vagrant用のBoxを作成

ホスト側で次のコマンドを実行する。前述の手順で一時的に設定NATテーブルは、vagrantが自動的に消してくれるので、気にしなくてもよい。

まずはパッケージを作成する。vagrant packageコマンドのVM名は ~/VirtualBox VMs に存在するディレクトリ名を指す。

$ vagrant package --base debian_wheezy_x64

これでカレントディレクトリに package.box が作成される。ここから先は普通にVagrantを操作するのと変わらない。

$ vagrant box add my-box package.box
$ vagrant init my-box
$ vagrant up

プログラマ35歳定年説に対する私の理解

SI業界の一般レベルの人間を想定。

  • 23歳 新卒入社
    • とりあえず現場に配属されるが、戦力外として扱われる
    • Excel方眼紙のメンテを筆頭とした刺身タンポポ的な仕事が多く回される
    • 上司から勉強しろ的なことを言われ続ける
    • 仕方ないので、Java入門的な本でプログラミングの勉強をする
  • 26歳 入社4年目
    • なんとなく仕事を覚えて、そこそこ仕事が任されるようになってきた
    • 新卒の子を見て、仕事できねーなという感じを持つようになる
    • 上司からは「そろそろ上流工程(設計)ができるように」みたいなことを言われ始める
    • 仕方ないので、会計入門のような本で勉強する
  • 30歳 入社8年目
    • 名実ともに中堅社員
    • 技術面では特に勉強しなくてもググる等の方法で回せるようになった
    • 上流工程もそこそこできるようになってきた
    • 上司からは「そろそろ下の子の面倒をみろ」みたいな事を言われ始める
    • 仕方ないので、コーチング的な本で勉強する
  • 35歳 プログラマ定年
    • 技術面の勉強をさぼってきたツケが出始め、プログラムを書くことに支障が出始める
    • 自分は上流工程ができるし、下流工程は部下にやらせよう
    • 上司は敵対部署(もしくは顧客)と戦っている

決して勉強してないわけじゃないんだけど、外部環境(組織として最適化された結果)かなぁと。

追記

過去の事はよくわからんけど、少なくとも今は、

  1. 慢性的にプログラマは不足している。
  2. 設計ができる人間がもっと不足している。
  3. でも、目の前に仕事はある。
  4. 設計は相応の経験・スキルが無いと担当することは無理だが、「大枠の設計があり、それに細かなパラメータチェックを追加して、実装して、動作確認(疎通確認)する」程度なら、多少スキルが低くてもできなくはない。
    • むしろ最初はここから入って、経験を積む。
  5. 高スキルな人間を集めるのは非常に難しいが、若手・低スキルの人間を集めるのは比較的容易。
  6. 高スキルな人間は設計が主体となり、若手・低スキルの人間は実装やExcel方眼紙の清書が主体となる。
  7. 当然、スキルに応じて単価に差が出る。
  8. 会社としては単価を高くしてもらいたいし、高スキルな人間には低スキルな人間を付けられるので、売り上げが立てやすい。

というように、人手が足りない中でどうやって売り上げを上げるか、という仕組みになっている。で、特に情熱もない大多数の人間を誘導して、売り上げを上げるための分かりやすい方便が「上流工程」であって、「35歳定年説」ではないかと。

結論としては、35歳定年説とは、単に用兵の話であって、よく言われる体力ガーとか技術ガーとかは、使われる側が自分の立場を正当化していたのが定着してしまったのではないか、という理解です。