日記を書くということについて

自分への戒めとして記します.

あれこれと考え過ぎて,日記を書かないのは良くない.
次のことを思い出して,アウトプットへとつなげてほしい.

  • 試行錯誤していてなかなか進まないなら,その試行錯誤の過程を書けばよい,
  • 「まちがっているかもしれない」と思っても,公開して,訂正の指摘を受けた方がよい.
  • 同じテーマについて書いてあるものが既にあるなら,それをブラッシュアップして,あるいは噛み砕いてまとめればよい.
  • アウトプットがあれば,少しずつでも,チャレンジして進んでいく様子が見える.
  • 一番の目的としては,将来の自分のためにやっているのだと考えると良い.

こういうことをちゃんと意識しないといけないなと.

とはいえ,あまり追いつめるとまた書かなくなるので,
「ゆるく書け.所詮は備忘録だ.まあ積み重ねていけばなんとかなるだろう.」
という気持ちでやっていけばいいと思います.

brew updateとupgradeの違い

manに書いてあることではありますが,忘れてしまうので記しておきます.

  • updateは,Homebrew自体を最新版にして,内部で管理しているformula(パッケージ)も最新版にする.
  • upgradeは,Homebrew内部で管理しているformulaのみを最新版にする.
  • upgradeは,特定のformula名を指定して,それだけ更新することもできる

このような形です.

brew upgrade opencv
  • updateは,Homebrewの管理フォルダ内に登録されていないファイルがあると,エラーになる.(具体的には,gitで管理されていないファイルがあるとダメ)

たとえば以下のようなもののことです.

# error: The following untracked working tree files would be overwritten by merge:
# 	Library/Formula/lbdb.rb
# Please move or remove them before you can merge.
# Aborting
# Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

これはHomebrewの管理フォルダに,gitでいうところの"Untracked files"があることを示しています.
(私の場合は /use/local)

cd /usr/local
git status .
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	Library/Formula/git-diffall.rb
#	Library/Formula/git-subtree.rb
#	Library/Formula/lbdb.rb
#	Library/Formula/libdrizzle.rb
#	Library/Formula/metapixel.rb
#	Library/Formula/readpst.rb
#	Library/Formula/rogue.rb
#	Library/Formula/scummvm.rb

少々乱暴ですが,以下のようにUntracked filesを消せば,Homebrewを正常にupdateできます.

git clean -f
# Removing Library/Formula/git-diffall.rb
# Removing Library/Formula/git-subtree.rb
# Removing Library/Formula/lbdb.rb
# Removing Library/Formula/libdrizzle.rb
# Removing Library/Formula/metapixel.rb
# Removing Library/Formula/readpst.rb
# Removing Library/Formula/rogue.rb
# Removing Library/Formula/scummvm.rb
brew update
# Updated Homebrew from 11963f03 to 1693f875.
# (上記の文字列はgitのハッシュ値で,そのときの最新バージョンによって値は異なる.)
# (さらにこの下に,新しく登録されたformulaと,サポート外で削除されたformulaのリストが出るが,長いので割愛.)

まだMacには慣れませんが,ぼちぼちやっていきましょう.

Herokuでjavascript+データベースを使ったアプリを動かす

前回のメモに書いたデータベースの使い方,せっかくなのでWeb上で動くアプリにしてみましたので,その過程をまとめます.
作ったものは,Heroku上に公開しています(音量注意)
この手の話は先人が多くいらっしゃるので,"参考にした"的な内容が多めです.

アプリを公開するまで

ざっくりと,このような形でやりました.

  1. アプリを考える (実現したい機能をリスト化しておくなど)
  2. Webサーバをどうやって実現するかを決める(フレームワークの利用)
  3. サーバ側,クライアント側の処理を実装する
  4. 機能をたしかめる (リスト通り作れたかどうか.デバッグなど)
  5. 開発中に使っていたデータベースをサーバに移行する
  6. アプリ(コードなど)をサーバに移行する
  7. サーバ上でアプリが正しく動くことを確認する (ここは真面目にやっていませんが)
  8. アプリを公開する

アプリを考える

今回は,YouTubeのお気に入りプレイリストをWeb上で管理するサンプルアプリを作ることにしました.
必要な機能は,以下のようにしました.

  • 曲の追加,削除
  • プレイリストの新規作成,削除
  • 曲の検索
  • 検索履歴の保持
  • アカウント認証 (今回は実装していません)

Webサーバをどうやって実現するか

私は実のところWeb系はからっきしで,リクエストも認証もなんだかよくわかっていませんが,ここのところ"Node.jsが注目されている"ということなので使ってみました.
Node.js 日本ユーザグループ
Node.js は,javascript を使ってサーバ側の処理を記述するためのライブラリです.クライアント側もブラウザを使うことになるはずなので,javascriptで両方かけるのは良いです.
クライアントからリクエスト受け取り,レスポンスを返す等の処理は,Express.js を使いました.Node.js とjavascriptの基本機能だけでも書けるが面倒が多い,とのこと.
Express - node Webフレームワーク | 日本語ドキュメンテーション
基礎から学ぶNode.js:連載|gihyo.jp … 技術評論社
さらに,公開先としてHerokuを使うことにしました.ここはNode.jsを使ったアプリが無料で公開できて,なおかつデータベースも(PostgreSQLやRedisなど一部は)無料で使うことができます.
Heroku.com

必要なモジュールを準備する

Node.jsでは,必要なモジュールを "npm" というパッケージマネージャでそろえて使います.
npmの利用のためにはまずNode.js自体をインストールする必要がありますが,Linuxのyumやapt-get,あるいはMacのhomebrewのようなパッケージマネージャがあれば簡単にインストールすることができます.
Node.jsとnpmのインストールは下記コマンドで可能です(Macでやりました).

# Node.jsのインストール
brew install node
# うまくいったら,次はnpmのインストール
curl http://npmjs.org/install.sh | sh

そして,npmを使って必要なモジュールを手に入れていくという算段です.
今回使ったのは以下です.あまり詳しくないので間違っていたらごめんなさい.

  • Express
  • ejs (MVCテンプレートエンジン)
  • pg (Node.jsでPostgreSQLを使うためのモジュール)
  • (herokuモジュールもインストールしましたが,どう使われているのかよくわかりません..)

なお,npmでインストールしたモジュールは,コマンドを実行したディレクトリの"node_modules"にインストールされます(グローバルオプション "-g" をつければ,その限りではないようですが).そのため,下記のコマンドは"今からここにアプリを作ります"と決めたディレクトリで行ってください.

実装

サーバ側はNode.jsとExpressを使って,データベースとのやりとりを実装しました.
データベース部分のやりとりは,こんな形で行っています.

//  テーブル作成リクエストがきたときの処理  //
app.get('/createTable', function(req, res){
  //  リクエストから必要なデータを抜き出す  //
  //  (req.queryまでは決まり文句,keyはクライアント側で自分で定義したもの)  //
  var queryTableName = req.query.key;
  //  データベースに接続する  //
  pg.connect(connectionString, function(err, client) {
    if(err) { console.log(err); }
    //  SQL文  //
    client.query("create table ytp_" + queryTableName + "(yt_key char(11) PRIMARY KEY, title text)", function(err, result) {
      if(err) { console.log(err); }
      //  テーブルの作成が終わったら,レスポンスを返す  //
      //  こうしないと,テーブル作成が終わる前にres.send()することがある  //
      done();
    });
  });
  var done = function() {
    res.send();
  }
});

クライアント側はajaxを使って非同期にサーバ側と通信して,曲やプレイリストの追加を行えるように実装しました.
HTMLの動的な書き換えにはjQueryを使っています.
ajaxjQueryや検索機能はここを参考に(というかry)しました.
jQueryではじめるAjax:特集|gihyo.jp … 技術評論社
コード全体をGithubにアップロードしています.
https://github.com/glass5er/ytjuke

ソースコードとデータベースをHerokuに送る

Herokuへソースコードを送る際は,gitを使ってリモートリポジトリに登録してコミット,という流れで行います.その際,npmでインストールしたモジュールはコミットする必要はなく,かわりにpackage.jsonにバージョンを書いておけば良いようです.
このあたりの操作は下記が詳しいです.
データベースの送り方も書かれており,参考になります.
Node.js+pgモジュールでPostgreSQLを使う(2)〜Herokuへのデプロイまで - ksk_kbysの日記

無事に動くことを確認

というわけで,Herokuにてアプリケーションを公開することができました.
YTJuke (音量注意)
実際のところ,出来はまだまだなので近いうちにアップデートしていきたいですね.

データベース初心者がデータを読み書きできるようになるまで(PostgreSQL編)

最近,ちょっとした気まぐれでデータベースを使ったソフトを作ってみようと思ったのですが,「データベース...?」な状態だったのでそもそも何をすればいいかもよくわかっていなかったのでドはまりしました.
今後このようなことが無いように(!),まとめておきます.

そもそも何をすればよいか

私のデータベースに関する認識は,「データを大量高速にやりとりするために先人が考えたうまい方法」くらいの感じなので,実際のところどうなのかはよくわかっていません.
とりあえず,クライアントがサーバに命令を出してデータを入れたりだしたりする,というところが実現できれば良しということにしました.
今回はPostgreSQLというデータベースを使いましたので,その流れで書いています.
以下,手順を簡単にまとめます.

  1. データベースソフトをダウンロード,インストールする
  2. データベースの置き場所を決める
  3. データベースサーバのソフトを起動する
  4. データベースにアクセスするソフト(クライアント)のためのアカウントを作る
  5. データベースを作る
  6. クライアントから,サーバのデータベースにアクセスする
  7. データベースの中に,テーブルを作る
  8. テーブルに値を入れてみる
  9. テーブル内のデータを読んでみる

環境準備

今回はMac(OS X lion)なPCを使ってデータベースをいじりました.
homebrewというパッケージマネージャを使っていて,yumやapt-getのような感覚でパッケージをインストールできるようになっています.
設定は以下を参考にしました.
404 Error - FC2ブログ

ソフトのダウンロード,インストール

PostgreSQLのインストールです.
前置きのとおり,homebrewを使ってインストールしましたので,とても簡単でした.

brew install postgresql

データベースの置き場所を決める

PostgreSQLでは,initdbというコマンドを使って,データベースを作るための環境準備をします.
以下の資料によると,通例ではデータベースを/usr/local/pgsql/dataに作るのだそうです.

以下,コマンド.

initdb -D /usr/local/pgsql/data

データベースソフトの起動

pg_ctl というコマンドを使って,データベースを起動します.ここで,先ほどの置き場所を指定します.
-l オプションで,ログファイルの出力先を指定しています.
最後の start を stop に変えてコマンドを実行すると,ソフトを終了できます.

pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/logfile.log start

アクセス用のアカウントを作る

createuser コマンドを使って,PostgreSQL用のユーザ名,パスワードなどを設定します.
対話式に入力していきます.

createuser -P
$  ユーザ名は? : testuser
$  パスワードは? : testpasswd
$  もう一度入力 : 
$  スーパーユーザの権限を与える? (Yes/No) : No
$  データベース作成の権限を与える? (Yes/No) : Yes
$  ほかのユーザ作成の権限を与える? (Yes/No) : No

データベースを作る

createdb コマンドで,データベースを作ります.
ここでは,testdb という名前のデータベースを作ることにします.
すでにデータベースソフト起動の際に置き場所を指定しているので,ここでは指定する必要はありません.

createdb testdb

ログインする

クライアントソフトを起動して,ユーザと,アクセスするデータベースを指定します.
psql というコマンドです.

// psql -U <ユーザ名> <データベース名> -W(パスワード用のオプション)
psql -U testuser testdb -W
$  パスワードは? : testpasswd

データベースの中に,テーブルを作る

ここから先は,すべてpsqlでログインしたままでの操作です.
シェルが "(データベース名)=>" のような表示にかわっているはずです.
私はSQL文の書き方がよくわかっていませんので,以下のようなサイトで調べるのがよいと思います.
PostgreSQLで作るLinuxデータベース(2):PostgreSQLをコマンドラインで操作する - @IT
ここでは,testtable という名前のテーブルを作成します.
テーブルの作成の際,どのようなデータ構造にするかを決定します.
これは頻繁に変えられるようなものではなさそうなので,実際になにか作ろうとするときには,事前によく考えて設計しないとまずいようです.
今回は,id (整数),test_key (7文字の文字列),test_text(可変長の文字列)の構造をもつテーブルを作成してみます.
もしここで,テーブルが作成できない等のエラーが出る場合,指定したデータ名が PostgreSQL予約語とバッティングしている可能性がありますので,名前を変えて再度トライしてみるとよいと思います.
あと,最後のセミコロンを忘れずに.

create table testtable (id int, test_key char(7), test_text text);

テーブルに値を入れてみる

さきほど定義したテーブルにデータを入れていきます.
定義したデータのうち,一部だけにデータを入れることもできるようです.
(指定しなかったところは NULL になる)

insert into testtable (id, test_key, test_text) values (10, 'AABBCCD', 'length-free-string');
insert into testtable (id) values (500);

テーブル内のデータを読んでみる

これでデータが2つ登録されているはずですので,まとめて読み出してみます.

select * from testable;
//  こんなのが出てきます.
//  testdb=> select * from testtable;
//   id  | test_key |     test_text      
//  -----+----------+--------------------
//    10 | AABBCCD  | length-free-string
//   500 |          | 
//  (2 rows)

おわりに

とりあえずここまでで,データベースを全く触ったことがない状態から,簡単な読み書きができるようになりました.
実際に効率化などを考えると,コマンドの使い方やテーブルの設計(データの持ち方,分け方)などかなり奥深いように感じます.
ただ,試しに使ってみるぶんにはあまり悩まずドンドン作ってみたらいいんじゃないでしょうか.
私はこの手順をまとめる前にMySQLにも手を出して途中で投げたり,迷走していますし...

C++ソートめぐり

たまにTwitterで「クイックソートも書いたことないのか?」といった類のつぶやきを見かけることがあります.そういえば,メジャーどころなのに書いたことないソーティングアルゴリズムって結構あったりして,一回やっておかないとまずい気がしたので書いてみました.言語はC++です.

ソートアルゴリズム

このページを参考にしました.とてもわかりやすくまとまっていて,サンプルコードもあったので,写経のように進めながら考えることができました.ありがとうございます.
いろいろなソートアルゴリズム
実装したのは,6つのアルゴリズムです.

プログラム

今回書いたコードをGithubにアップしました.
https://github.com/glass5er/Sort-Practices
内容は教科書にあるとおりのアルゴリズムだと思うので,特に目新しいことはしていませんが,バグがあるかもしれません.(テストは少ししかしていないので)

最後に

テストスクリプトで実行時間を計ってみたのですが,バブルソートが遅いのはいいとして,基数ソート,クイックソートがあまり早くなりませんでした.たぶんコレクションあたりの実装がまずい気がするので,追い追いなおしていきます.
実用上は,普通にstd::sort()を使うってことでいいんですけどね.

OpenCVで回帰分析プログラムを作る

仕事でデータ解析をしていた折、ああこんなときに統計解析がもっと理解できていたらなと思ったので、勉強がてら回帰分析のプログラムを作りました。
さっそく今週から活躍してくれそうで満足です。

回帰分析 (重回帰分析)

ある従属変数yの挙動について、独立変数x(と定数項)を使ってモデル化しようというやつです。というより、仮定したモデルが現象をどれだけ説明できているかを定量化するための方法というほうが個人的にはしっくりきます。
今回は変数が複数ある重回帰分析をするためのプログラムにしました。
重回帰分析 - Wikipedia

最小二乗法で解く

変数yに対してxモデル化した式が以下のような形で表せるとします。
y=a_1x_1+a_2x_2+a_0
yのサンプルぶんだけ式が作れるので、それらをまとめて行列形式で表します。
Y=XA
未知なのは行列Aの中身、という形で解き進めます。
最小二乗法で解く場合には、Xが正則でない場合を考慮して、
A=(X^TX)^{-1}X^TY
という形で解を得られます(もちろん、最小二乗解なので誤差はありますが)。
これをOpenCV2の標準Mat形式で実装するとなかなか楽です。

実装

C++で実装しました。
CSVデータを読み込んで、回帰係数aのそれぞれと決定係数r2を求めるプログラムです。
githubにもソースコードをアップロードしてあります。
https://github.com/glass5er/OpenCV-Regression-Analysis

続きを読む

PSS SDKで画像処理サンプルを作成(魚眼カメラ風ひずみ)

PSS SDK

先日,ソニーからPlayStaion Vitaなどでソフト開発を行えるツールキット "PlayStation Suite SDK" が公開されました.
PlayStation®Suite
今回はそれを使ってサンプルソフトを作ってみたので,それについて記していきます.

C#でコーディング

C#はまったく書いたことが無かったのですが,この機にと思って書き始めてみたところ,Javaとあまり変わらず(むしろこっちのほうが楽かも)書くことができました.
配列の書き方など,C#ならではの作法はありますので,以下で調べながら書きました.
C# プログラミング ガイド

魚眼カメラ風のレンズひずみソフト

今回は,画像処理のソフトを作りました.
画像を読み込んで(ここはまだGUI実装しておらず,ベタ書きですが),魚眼カメラ風にひずませて表示するものです.
たとえばこんな画像を入力すると,

こんなふうに描画してくれます.

レンズひずみのモデルは以下を参考にしました.
レンズ歪み

ちなみに,いじった方はわかると思いますが,上記はチュートリアルのsample02-01を改変して作りました.
そのなかで,

  • テクスチャ座標系と頂点座標系が線形変換でないときは,行ごとにわけて描画しないと正しくかかれない
  • シェーダの呼び出しは1フレームに複数回できる(当たり前っぽいですが)

など,いろいろ腹落ちしたのでだいぶ勉強になりました.
次はGUIやHTTP通信部分など,実用の際に避けては通れない部分を見ていきたいと思います.

ソースコード

最後に,以下にcsファイルを記載します.
githubでも公開しています.
glass5er/PSS_fisheye · GitHub

続きを読む