RubyとPostgreSQL
なんだかんだと、私はPostgreSQLが一番好きです。
別に一番使いやすいから好きだというわけでもないのですが
最近いくつかのデータベース(NetezzaやVerticaなど)が
PostgreSQLをベースに作られていますし、なによりオープンソースなので気に入っています。
(MySQLはOracleの傘下になっているのであまり使いたくない)
というわけで今回は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サーバーとしては
RubyのSinatraを使用
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を落としてきて入れてみました。
いれて早速起動したら
動かない!!
なので
【File】→【New】→【Project】 を選択
とりあえず、【Empty Application】を選んで
適当な名前をつけて【Language】を【Swift】に変更
とりあえず、【Development Target】を【8.0】に設定
テスト対象もとりあえず【iPhone5s】
いざ、エミュレーターを動かしてみると真っ白。
とりあえず、動いたのでよしとしましょう。
まだまだ、動かない部分が多いけど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が欲しいときとかには便利かと思います。
そのうちいい感じの二分木探索のライブラリも作れればと思います。
では、また。