Mac OS High Sierra で Homebrew を使い、バージョンを指定して PostgreSQL をインストールする

Mac OS High Sierra で Homebrew を使い、バージョンを指定して PostgreSQL をインストールする

Homebrew を使えば MacPostgreSQL を簡単にインストールできるが、うっかりバージョンを指定せずに実行したのでやり直しにハマった話。

実行環境

Mac OS High Sierra (10.13.2)
MacBook Air Mid 2013
Homebrew 1.4.2

インストールの記録

Homebrew を使用してインストール

$ brew install postgresql

バージョンの確認

$ psql --version
psql (PostgreSQL) 10.1

2018年1月現在の最新版は version 10.1 の様だが、9.xをインストールしたかったのでやり直す事にする。
インストールできるバージョンの確認

$ brew search postgresql
==> Searching local taps...
postgresql ✔                  postgresql@9.4                postgresql@9.5                postgresql@9.6

チェックの入っているのが現在インストールされている version 10.1

version 10.1 をアンインストール

$ brew uninstall --force postgresql
Uninstalling postgresql... (3,372 files, 38.8MB)

設定ファイル等を削除

$ rm -rf /usr/local/var/postgres

version 9.6 を再インストール

バージョンを指定する為に homebrew versions を使用。

$ brew search brew tap homebrew/versions

インストール可能なバージョンを確認

$ brew search postgresql
==> Searching local taps...
postgresql                    postgresql@9.4                postgresql@9.5                postgresql@9.6

バージョンを指定してインストール

$ brew install postgresql@9.6
==> Downloading https://homebrew.bintray.com/bottles/postgresql@9.6-9.6.6.high_sierra.bottle.tar.gz  

(中略)  

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/postgresql@9.6/lib
    CPPFLAGS: -I/usr/local/opt/postgresql@9.6/include


To have launchd start postgresql@9.6 now and restart at login:
  brew services start postgresql@9.6
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgresql@9.6 start
==> Summary
🍺  /usr/local/Cellar/postgresql@9.6/9.6.6: 3,273 files, 36.8MB

パスを通す

echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile

.bash_profile の読み込み

$ source .bash_profile

バージョンの確認

$ psql --version
psql (PostgreSQL) 9.6.6

データベースを初期化

$ initdb /usr/local/var/postgresql@9.6 -E utf8
The files belonging to this database system will be owned by user "ibeckuu".
This user must also own the server process.

The database cluster will be initialized with locale "ja_JP.UTF-8".
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

initdb: directory "/usr/local/var/postgresql@9.6" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgresql@9.6" or run initdb
with an argument other than "/usr/local/var/postgresql@9.6".

結果的にはこの状態でインストールが出来ていたのだが、下記コマンドで起動しなかった為ディレクトリ名を変更したりシンボリックリンクを貼ってみたりして無茶苦茶になってしまった。

起動コマンド(最新版では問題なく使えるが、ディレクトリ名に'@~'が付加されているバージョンでは使える様にできなかった)

$ brew services start postgresql
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
Tapped 0 formulae (43 files, 55.4KB)
Error: Formula `postgresql` is not installed.
# 最後でコケる

この後、何度もアンインストール、再インストールを繰り返したが、結局は上記の状態で良く、起動は下記コマンドを使用する。

$ postgres -D /usr/local/var/postgresql@9.6
LOG:  database system was shut down at 2018-01-08 21:25:55 JST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

データベース一覧を取得

$ psql -l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 postgres  | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/ibeckuu         +
           |         |          |             |             | ibeckuu=CTc/ibeckuu
 template1 | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/ibeckuu         +
           |         |          |             |             | ibeckuu=CTc/ibeckuu
(3 rows)

データベースの置き場所の設定

.bash_profile に追加

$ echo 'export PGDATA=/usr/local/var/postgresql@9.6' >> ~/.bash_profile

ロールの追加

Homebrew でインストールするとインストールした$USERがスーパーユーザーになっており、あまり良くないので ロール(ユーザーとグループが一緒になった様なもの)を追加する。 スーパーユーザーとしてログインし、SQL CREATE ROLE を発行しても作成できるが今回はシェルから行う。

<参考>
PostgreSQL 9.6.5文書

# ユーザーを追加、 Pオプションでログイン時にパスワードを必要にする
$ createuser -P user1
Enter password for new role: 
Enter it again: 

作成されたユーザーを所有者とするデータベースを作成

# -O オプションで所有者を指定
$ createdb sample_list -O user1

データベース一覧を取得

$ psql -l
                                 List of databases
    Name     |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-------------+---------+----------+-------------+-------------+---------------------
 postgres    | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 sample_list | user1   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0   | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/ibeckuu         +
             |         |          |             |             | ibeckuu=CTc/ibeckuu
 template1   | ibeckuu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/ibeckuu         +
             |         |          |             |             | ibeckuu=CTc/ibeckuu
(4 rows)

<参考サイト>
Macで複数のバージョンのPostgresqlを共存させる
[MacOS] Homebrew で PostgreSQL をインストールする手順
[MacOS] PostgreSQL の全バージョンをアンインストールする方法 ~ Homebrew 編

では、

Mac OS High Sierra に Apache をインストールする

Mac OS High SierraApache をインストールする

Mac OS にはデフォルトで Apache がインストールされているが、所有者が root になっているので何かと使いにくい。
なので任意のユーザーで Apache をインストールする事にする。
この記事はインストールの備忘録。

High Sierra 初期状態での Apache

Air:~ ibeckuu$ httpd -v
Server version: Apache/2.4.28 (Unix)
Server built:   Oct  9 2017 19:54:20

インストール記録

実行環境

Mac OS High Sierra (10.13.2)
MacBook Air Mid 2013
Homebrew 1.4.2
Java JDK 1.8.0_152

Apacheのインストール

リポジトリを追加

    brew tap homebrew/dupes
    brew tap homebrew/apache

外部formulaがインストール可になっているか確認

    brew search httpd24

Apacheのインストール

    brew install httpd24

http.conf の設定

場所 /usr/local/etc/httpd/

# DocumentRoot の変更 (自分の環境ではDropboxを使用している)
DocumentRoot "/Users/ibeckuu/Dropbox/htdocs"

# .htaccessでURLのoverrideを許可
<Directory "Users/ibeckuu/Dropbox/htdocs">
    Options Indexes FollowSymLinks

     # none をAll に書き換え
    AllowOverride All

    Require all granted
</Directory>

# Virtual hosts のコメントアウトを解除
Include /usr/local/etc/httpd/extra/httpd-vhosts.conf

# ServerNameディレクティブのコメントアウトを解除  
# (自分自身のホスト名があれば設定する)  
ServerName www.example.com:8080


httpd-vhosts.confの設定(dummy の削除)

場所 /usr/local/etc/httpd/extra/

# httpd-vhosts.confの設定中の <VirtualHost 以下の dummy の記述はバッサリ削除し、書き換え
VirtualHost *:8080>
    serverName local
    DocumentRoot /Users/ibeckuu/Dropbox/htdocs/
    <Directory "/Users/ibeckuu/Dropbox/htdocs">
        AllowOverride ALL
        Order allow,deny
        Allow from all
    </Directoty>
</VirtualHost>

Apache インストールしたパスとバージョンの確認

Air:~ ibeckuu$ which apachectl
/usr/local/bin/apachectl
Air:~ ibeckuu$ apachectl -v
Server version: Apache/2.4.29 (Unix)
Server built:   Dec 28 2017 00:52:51

Apache を起動

Air:~ ibeckuu$ apachectl start

localhost:8080 にアクセスし DocumentRoot に置いた index.html が表示されれば OK
もし 403エラー Forbidden がでる様ならば下記を試してみる。

# 'MultiViews'オプションを追記する
irtualHost *:8080>
    serverName local
    DocumentRoot /Users/ibeckuu/Dropbox/htdocs/
    <Directory "/Users/ibeckuu/Dropbox/htdocs">
        AllowOverride ALL
        Order allow,deny
        Allow from all
        # 追記
        Options Indexes MultiViews FollowSymLinks
        Require all granted
    </Directoty>
</VirtualHost>

<参考サイト>

HomebrewでApache,PHP,MySQL,ComposerをインストールしてYii Frameworkを動かすところまで
Mac Yosemite Apache2.4 でローカルホストが403になるとき

では、

CodeIQ 挑戦の記録 : 今週のアルゴリズム : 第104回「整数倍の得票数」

CodeIQというサイトで問題に挑戦した記録です。

f:id:ibeckuu:20160523223811j:plain

問題文を要約すると下記の通り

  • 選挙での候補者数と得票数について、最下位の候補者の得票数を1としたときに、ほかの候補者の得票数が整数倍になるようなパターンについて考える。
  • 例:3人の候補者に対して7人が投票するとき、その得票数のパターンは以下の4通り。
    5-1-1
    4-2-1
    3-3-1
    3-2-2
    (候補者は区別せず、得票数のみに着目する)
    この場合で、3-2-2は最下位の候補者を1とすると他の候補者の得票数が整数倍にならない為対象外。
    よって3パターンとなる。
  • 標準入力から{m,n}が与えられ、{m}人の候補者に対して{n}人が投票するときこの様なパターンは何通りあるかを解答する。
    {(0 \lt m \lt n \lt 80)}

方針

メモ化再帰により探索する。
{m}人の候補者に対して{n}人が投票する場合で、最下位の候補者の得票数を{b}とおくと、その他全ての候補者の得票数が最下位の候補者の得票数の整数倍になるならば、以下が成り立つ。

  • {n}{b}の倍数である。
  • 最下位の候補者を除く{m-1}人の得票数の合計は{n-b}票である。

これより、{b}{1}から{\lfloor {n/m} \rfloor}まで、{n}を割り切る時のみ、題意のパターンをメモ化再帰で探索し、そのパターン数の合計を解答とする。
なお、探索では、全て{b}の整数倍のものを探すので、初めから{n}{b}で割ったものを調べる事で探索数を減らす事とする。
また、例えば7票を3人で分ける場合で、1-1-5パターンとこれを並び替えた1-5-1、5-1-1は同じパターンとみなすので、重複カウントを防ぐ為に、再帰関数の中で得票数のパターンを昇順のみ探索する様にしている。

実装(Ruby)

では、


Sponsored Link

CodeIQ 挑戦の記録 : 【100名限定】変進小数の足し算【手動採点】

CodeIQというサイトで問題に挑戦した記録です。

codeiq.jp

問題文を要約すると下記の通り

  • <小数第n位が11-n進数> というルールの計算を「変進小数」と呼ぶ事にする。
    (例えば、小数第1位は10進数、小数第9位は2進数)
  • 変進小数での足し算を考える。
    入力の例 8.622+3.177
    出力の例 11.811
  • テキストファイルが与えられ、以下の数値がTAB区切りで複数行含まれている。
    {データID, 変進小数の足し算, 変進小数で表された足し算の結果}
    ほとんどのデータは正しい結果になっているが、正しくないデータが幾つか含まれている。
    正しくないデータのデータIDをコンマ区切りで解答する。

方針

題意の通り変進小数の和の演算を実装し、与えられたデータと比較する。
計算方法は以下の通り。
整数部と小数部を分けて計算する。
小数部は再帰にて実装する。
小数点以下1桁めから、再帰関数で1桁ずつ降りていき、2数の内短い方に達したら長い方の数値のそれ以下は計算する必要がないのでそのまま外部変数(配列)に代入する。
短い方の最下位桁から順に11-n進数として計算、繰り上がりを返り値で返し、加算する。
加算した数値は順に配列に代入する。
整数部まで繰り上がりを計算し、整数部と合わせて足し算の答えとする。
この答えと与えられたデータとの比較をする。
小数点以下で最終桁が0とか、小数点の表示されていない答えとの照合の為、 正誤の判定は2つを浮動小数点に変換して比較する。

注意点

下記の様なコーナーケース(注意しないと間違い易いデータ)を想定した。

  • 浮動小数点数計算を行うと誤差を生じ、計算結果が異なる可能性がある。
  • 文字列として比較すると小数点以下で最終桁が0で終わると表示が同じにならない。
  • 同様に結果が整数になった場合、小数点、小数点以下が表示されず同じ表示にならない。

この対策の為、変進小数の計算は配列に代入した各桁ごとに計算し、比較については一旦文字列にしたものを浮動小数点数に変換して比較した。
この点につき、解答にコメントとして記入して提出すると、下記の様なフィードバックを頂いたので一部要旨を紹介する。
(フィードバックありがとうございました。)

  • 浮動小数点数での計算に誤差の恐れがあるのであれば、Rubyで書いているのだから有理数を用いてはどうか?
    特に、最後で浮動小数点数として2数を比較している部分について。

RubyにはRationalクラスという分数をそのまま扱えるクラスがあるので、誤差を生む心配なく計算ができる。
しかしながら、Rationalクラスの存在は知っているが、使った事がなかったので、その発想もなかった。

実装(Ruby)

では、


Sponsored Link

CodeIQ 挑戦の記録 : 「プライム・ホッパー」問題

CodeIQというサイトで問題に挑戦した記録です。

f:id:ibeckuu:20160707020612p:plain

問題文を要約すると下記の通り

  • ある素数に対し、変換1と2を次の通り定義する。
    変換1:元の数の右または左に1~9のいずれかの数字一つをつなげる。
    変換2:元の数の右端または左端の数字一つを取り除く。
    (ただし、最上位桁が0で始まる数値への変換は不可)
  • 標準入力から素数{p}{q}が与えられる。({{p} \lt {q}})
    素数{p}から始めて、変換1または2を繰り返して{q}を作る最小の交換回数を解答する。
    (途中の数は全て{q}以下の素数)
  • {{p} \lt {q} \leq {10}^{5}}

方針

幅優先探索を用いる。
qまでの配列を用意し、初期値として素数の項を0、合成数の項を-1とする。
題意の通り変換できる限り素数を変換していき、使用していない素数であればキューに追加し、幅優先探索で探索する。
同時に何回めの変換かを配列に記録する。
変換した数がqと一致すると配列に記入した回数を解答する。

実装(Ruby)

では、


Sponsored Link

CodeIQ 挑戦の記録 : 今週のアルゴリズム : 第103回「まわり将棋に挑戦!」

CodeIQというサイトで問題に挑戦した記録です。

問題文を要約すると下記の通り

  • まわり将棋を考える
    (まわり将棋とは金将4つをサイコロの代わりに使い、9x9マスの将棋盤の周囲を双六の様にコマを進めるゲームである)
  • 振った金将の状態により金将1つあたり下記の得点が得られる。4つの合計が進むマスの数となる。
    ・裏向き:0
    ・表向き:1
    ・横向き:5
    ・上向き:10
    ・下向き:20
  • あるコマが角の位置からスタートした時、n回振って4つの角の内どこかの角にいるパターンが何通りかを解答する。
  • コマの動きは動くマスの数のみに着目する。並び順は区別する。
    例えば n=2 のとき、「1回目に3マス、2回目に5マス」動いたときと、「1回目に5マス、2回目に3マス」動いた場合は別々とカウントする。
  • nの最大は7

方針

メモ化再帰により探索する。
金将4つの得点の合計が1回に進むマスの数になり、これのn回の和が進んだマスの数。
9x9マスの周囲を回るので、角からスタートすれば、進んだ数が8の倍数であればどこかの角にいる事になる。

実装としては、あらかじめ金将4つの得点の合計の組み合わせ
{0,1,5,10,20}の中から4つを選んだ組み合わせの和を計算し、配列に記録しておく。
n回コマを振った場合に進む、全てのコマ数の組み合わせをメモ化再帰で試し、合計が8の倍数になるものを数え解答とする。

実装(Ruby)

では、


Sponsored Link

CodeIQ 挑戦の記録 : 今週のアルゴリズム : 第102回「長男はいつも弟のことを考える?」

CodeIQというサイトで問題に挑戦した記録です。

f:id:ibeckuu:20160523223811j:plain

問題文を要約すると下記の通り

  • マス目状のチョコレートを縦か横に一直線に分割する事を考える。
    (マスの途中では割れない)
  • 標準入力から縦・横・人数が与えられ、全員が食べられる様に分割するパターンが何通りかを解答する。
    分割の方法・・・縦か横に一直線に切り取り、左か上のものを取り除き、残ったものを同じ方法でカットを繰り返す。
  • 縦・横の最大はそれぞれ20、人数の最大は10

方針

3通りのアルゴリズムで解答する。

  1. メモ化再帰
  2. 動的計画法
  3. 組み合わせ論で計算

アルゴリズム

1. メモ化再帰

縦h、横wのマスをn人で分ける場合の数を考える。

f:id:ibeckuu:20160727223647j:plain

n人で分けるためにはn-1回分割する事になる。

1回目からn-1回目までのカットにおいて、前回のカット位置の縦・横それぞれの次の位置からh-1、w-1の位置まで全てのカット位置を試し、n-1回カットしたパターンを再帰関数で数える。
高速化の為、メモ化を用いる。

実装(Ruby)


2. 動的計画法

縦h、横wのマスを縦i、横jのカット位置でk回目に切り取る場合の数は下記の漸化式で表す事ができる。

{f(1,i,j)=1} ({1 \leq i \leq h-1} , {j=0}) または ({i=0} , {1 \leq j \leq w-1})
{f(k,i,j)= } {\sum _{p=0}^{i-1} f(k-1,p,j)  +  } {\sum_{q=0}^{j-1} f(k-1,i,q)}

  • 漸化式の説明

k回目に(i,j)の位置をカットする場合の数は、

f:id:ibeckuu:20160727224653j:plain

  • k-1回目に(0,j)の位置でカットされたものから(i-1,j)の位置でカットされたものの全ての場合の数を加算したものと

f:id:ibeckuu:20160727224604j:plain

f:id:ibeckuu:20160727224629j:plain

  • k-1回目に(i,0)の位置でカットされたものから(i,j-1)の位置でカットされたものの全ての場合の数を加算したものである。

f:id:ibeckuu:20160727224723j:plain

f:id:ibeckuu:20160727224741j:plain

実装(JavaScript / SpiderMonkey)


3. 組み合わせ論による

縦h、横wのマスを縦か横かにn-1回カットする場合の数は、
h-1個の区切り位置からi個を選び、

f:id:ibeckuu:20160727224845j:plain

w-1個の区切り位置からn-1-i個を選ぶ組み合わせ

f:id:ibeckuu:20160727224907j:plain

縦・横の同じものを含む順列を掛けたもの。
これをiについて0からh-1かw-1の小さい方までの総和で計算できる。

式は下記の通り。

{s=min(h,w),b=max(h,w),r=min(s,n)}とする
{f(n)=} {\sum_{i=0}^{r-1}} {\verb#{#} {  _{s-1}C_{i} } { \times _{b-1}C_{n-1-i} \times \frac{ (n-1)!} { {i!} \times {(n-1-i)!} }} { \verb#}# }

実装(JavaScript / SpiderMonkey)

では、


Sponsored Link