鶏頭のプログラム

Ruby, Javascript, C言語, SQLなどのプログラミング

RubyとPostgreSQL

なんだかんだと、私はPostgreSQLが一番好きです。
別に一番使いやすいから好きだというわけでもないのですが
最近いくつかのデータベース(NetezzaやVerticaなど)が
PostgreSQLをベースに作られていますし、なによりオープンソースなので気に入っています。
(MySQLOracleの傘下になっているのであまり使いたくない)

というわけで今回はRubyからPostgreSQLを叩いてみます。

RubyからPostgreSQLに接続するには 'pg' というgemを使うのが一般的です。
ですのでまずは

 $ gem install pg

上記のコマンドでエラーになる場合は

 $ gem install pg --with-pg-config=pg_configファイルのパス

コマンドで pg をインストールします。
PostgreSQLのライブラリが入っていない(pg_configのファイルがない)とここでエラーになります。
その場合はPostgreSQLのライブラリをインストールしてください。

ではRubyのほうを書いていきます。

require 'pg'

connect = PG::connect(host: "localhost", user: "user", password: "secret", dbname: "database_name", port: "5432") 
results = connect.exec("SELECT current_date hoge")

results.each{|result|
  p result["hoge"]
}

connect.finish

実行出力は

$ "2014-07-12"

このように接続し取得することができます。
ちなみにportはデフォルトで5432となっていますので
5432のままなのであればconnectの引数でなくても問題ありません。

設定ファイルを外出しにしたい場合は下記のような感じにするのがよいかと思います。

database.yml

db:
  development:
    host: localhost
    user: user
    password: password
    dbname: testdb
    port: 5432
    
  product:
    host: localhost
    user: user
    password: password
    dbname: realdb
    port: 5432

database.rb

require 'pg'
require 'yaml'

dbconf = YAML.load_file("./database.yml")["db"]["development"]
connect = = PG::connect(dbconf)
results = connect.exec("SELECT current_date hoge")

results.each{|result|
  p result["hoge"]
}

connect.finish

これで実行するとdeveopをproductに変更すれば接続するデータベースをへんこうできます。

もっと便利なActiveRecordもありますが、それはまたの機会に。

SphinxのMakefileをいじる

前回の記事 gritを使ってgitを自動で操作してみる。 - 鶏頭のプログラム でも書きましたが。
今回はgitでsphinxで書かれたドキュメントを管理しています。

そして今回の記事ではsphinxディレクトリ以下のファイルにどのような内容の手を加えたのかを説明します。

ディレクトリ構成

├── Gemfile
├── compile.rb
├── config.ru
├── route.rb
├── log
│   ├── access.log
│   └── error.log
├── public
│   └── sphinxでmakeしたhtmlファイルを配置
└── sphinx
       └──  documents
           ├── .git
           └── server
               ├── Makefile
               ├── copy.py
               ├── index.rst
               └── その他ファイル

この中で今回私が手を加えたのは copy.py と Makefile です。
copy.py では

language = 'ja' 

を記入しただけですが
Makefileにおいては

$ make server

を通るように修正しました。たいそうなことをした訳ではなく、publicディレクトリにコンパイルされたファイルが
できるようにしただけです。

SPHINXBUILD   = sphinx-build
BUILDDIR_FOR_SERV      = ../../../public/documents
ALLSPHINXOPTS_SRV = -d $(BUILDDIR_FOR_SERV)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

server:
        $(SPHINXBUILD) -b html $(ALLSPHINXOPTS_SRV) $(BUILDDIR_FOR_SERV)/html

を追加しただけです。
これで

$ make server

すれば自動的に public/documents 以下にコンパイルされたhtmlファイルが配置されるようになります。

あとは index.rst ファイルなどに

`コンパイル </compile>`_

を記載しておけば、クリックするだけで自動的にgitからpullされ
make serverが実行されてファイルが置き換わるようになります。

gritを使ってgitを自動で操作してみる。

gitサーバーをCentOS上に構築 - 鶏頭のプログラムで書きましたように
gitのサーバーを構築しました。

さらに今回は sphinx でドキュメント管理をして
それを即時反映Webで公開可能な状態にするということに取り組みます。

というわけで今回はWebサーバーとしては

RubySinatraを使用
httpのサービスはapache

を使用して環境構築を行います。

まずはSinatraの準備から(今回はとても簡単に)。
ディレクトリ構成は下記のようになります。

├── Gemfile
├── compile.rb
├── config.ru
├── route.rb
├── log
│   ├── access.log
│   └── error.log
├── public
│   └── sphinxでmakeしたhtmlファイルを配置
└── sphinx
       └──  documents
           ├── .git
           └── server
               └── sphinxのファイル一覧

とくに特筆すべき点はないのですが一応ファイルの中身は

Gemfile

source 'https://rubygems.org'
gem 'sinatra', '1.4.5'
gem 'grit', '2.5.0'

config.ru

require File.expand_path(File.dirname(__FILE__)) + '/route'
set :public, File.dirname(__FILE__) + '/static'
run Sinatra::Application

route.rb

require 'sinatra'
require './compile'
get '/' do
  redirect '/documents/html/index.html'
end

get '/compile' do
  documents_coompile
  redirect '/'
end

compile.rb

require 'grit'

def documents_coompile 
# カレントディレクトリを
  dir = Dir.pwd
# .gitのあるディレクトリまで移動
  Dir.chdir("./sphinx/documents/")
  repo = Grit::Repo.new(".")
  repo.git.pull
# sphinxで make html が可能なディレクトリに移動
  Dir.chdir("./server")
  system("make server")
# もとにディレクトリに戻す
  Dir.chdir(dir)
end

gitを使用し、sphinxで書かれたドキュメントを管理しているので
リクエストで /compile が来たときにgit pullを行い、ソースを最新の状態にしてから
sphinxのmake serverを実行するように compile.rb を書きました。
make serverはmake htmlをちょっとだけいじったものです。
詳しくは SphinxのMakefileをいじる - 鶏頭のプログラム


今回はサーバー側でソースがいじられることはないので変更の取り消しを行うための
コマンド等は入れていません。



ちなみに余談ですが、gritで git pull を行う場合は、ちゃんとカレントディレクトリを
移動しておかないと変更があったファイル等が今のカレントディレクトリを基準として
出力されるので注意が必要です。

それでは次回はsphinxのほうの修正を書いていきます。
SphinxのMakefileをいじる - 鶏頭のプログラム

gitサーバーをCentOS上に構築

今回はgitのサーバーが必要になったので構築してみます。

必要なものは
git
gitを使用するためのもの
git-daemon
gitサーバーをたてるためのデーモン
Git - git-daemon Documentation
git-all
スケーラブルな分散型リビジョン管理システム (全サブパッケージ)
Debian -- squeeze の git-all パッケージに関する詳細

$ yum -y install git git-all git-daemon


xinetd
initdの上位互換。
xinetd - Wikipedia

$ yum -y install xinetd


/etc/xinetd.d/gitファイルを下記の様に編集

# default: off
# description: The git dæmon allows git repositories to be exported using \
#       the git:// protocol.

service git
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = git
        server          = /usr/libexec/git-core/git-daemon
        server_args     = --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose
        log_on_failure  += USERID
}


私の場合は git 専用のユーザー git を作成。

$ useradd -m -d /home/git -s /usr/bin/git-shell git


ここでgit-shellを指定するとgitユーザーで通常のログインはできなくなります。
こうするとログインしようとするとこんなエラーが発生します。

fatal: What do you think I am? A shell?


それで xinetd を起動します。

$ service xinitd start 


git-daemonに接続できるようにhosts関連のファイルや
iptablesの設定も正しく行う必要があります。
gitデーモンが使用するport番号は

$ cat /etc/services | grep git


で調べられます。(デフォルトは 9418)

とりあえずサーバーに

$ cd /var/lib/git
$ mkdir repo
$ cd repo
$ sudo -u git git init --bare ./test.git


そしてクライアントから取得。

$ git clone git//:server/var/lib/git/test.git


これで取得が可能にりました。

とりあえず、Xcode 6を動かしてみる。

Apple Developerのところから
新しいXcode 6を落としてきて入れてみました。

いれて早速起動したら

f:id:iteba:20140605001715p:plain

動かない!!

なので
【File】→【New】→【Project】 を選択
f:id:iteba:20140605001804p:plain

とりあえず、【Empty Application】を選んで
f:id:iteba:20140605001949p:plain

適当な名前をつけて【Language】を【Swift】に変更
f:id:iteba:20140605002204p:plain

とりあえず、【Development Target】を【8.0】に設定
f:id:iteba:20140605003038p:plain

テスト対象もとりあえず【iPhone5s
f:id:iteba:20140605003154p:plain

いざ、エミュレーターを動かしてみると真っ白。
f:id:iteba:20140605003536p:plain

とりあえず、動いたのでよしとしましょう。

まだまだ、動かない部分が多いけどbeta版だしね。

次はいよいよ【Swift】を書いていきます。

まさかの新言語!

まさかここに来て新しいプログラミング言語が来るとは…
Swift…
ガイドはこちらに
iTunes - Books - The Swift Programming Language by Apple Inc.

Obj-Cに比べてはるかに書きやすくなりましたね。

とりあえず、ガイドを訳しながら
徐々に公開していきます。

KVList関数でC言語にKey Value型を作ってみた。

前回
PList関数でC言語のポインター操作を少しでも楽に - 鶏頭のプログラム
でPList型を作ったという紹介をさせていただきましたが
今回はそのPList型を使用してKey Value型を作ってみました。

Key Value型はC言語には存在しない型ですが
他の言語使っているとどうしても欲しくなる型なんですよね。

というわけで前回同様GitHubの方に載っけてみました。
tebakane/PointerList · GitHub

こちらも使い方はかなりシンプルで
InitKVList()で初期化して
AddKVListでkeyにvalueをセットしていくような形です。

sampleソース

void KeyValueTest(){
	void *val;
	KVList *list = InitKVList();
	SetKVList(list, "KEY1", "VALUE1");
	SetKVList(list, "KEY2", "VALUE2");
	val = GetKVList(list, "KEY1");
	printf("[%s]\n", val);
	val = GetKVList(list, "KEY2");
	printf("[%s]\n", val);
	SetKVList(list, "KEY1", "VALUE1_1");
	val = GetKVList(list, "KEY1");
	printf("[%s]\n", val);
	FinalKVList(list);
}

ただ、二分木探索とかつかってないのでその辺がいまいちイケてないですが
ちょっとしたKEY VLAUEが欲しいときとかには便利かと思います。

そのうちいい感じの二分木探索のライブラリも作れればと思います。

では、また。