Chocolateyでpostgresql

Chocolateyでpostgresqlをインストールしたときにちょっとつまづいたのでメモ。

> cinst postgresql
postgresqlをインストール。
2014/01現在の"cinst postgresql"パッケージでは、postgresqlがWindowsサービスとして設定される。
(と同時にWindows起動時に毎回サービスが立ち上がるようになるのでその辺は適宜設定しなおしたほうがいいかもしれない)

インストール完了後、psqlで接続しようと思うがユーザーIDとパスワードがわからない。
よく見ると、
Windowsのユーザーとして

postgres

が登録されていて、、パスワードは

Postgres1234

となっている。
Chocolatey postgresql パッチを使ってるなら必ずこのuser,passになるんじゃないかな、と思います。

> psql -h localhost -U postgres 
> password Postgres1234

で接続完了。
ユーザーpostgres を削除するとpostgresqlのサービスも起動しなくなっちゃうようなので注意。削除したいんだけど。

Herokuにcandycaneをインストールする2 candycaneを魔改造する

もうPHPのpaasならAppFogでも良かったんじゃないかと思い始めるも、railsも勉強したいので引き続きHerokuやります。

Herokuにしろ、AppFogにしろ、Webサーバー上にファイルの保存ができない。
デプロイにgitを使ってるから今のところしょうがないのかもしれないけど。
参考情報:知っておきたい!Herokuを使う上では当たり前?の16の常識 常識2. Dynoにファイルアップロードしても再起動時に消える

candycaneでは、チケットに添付したファイルがこれに相当するので、
Herokuの再起動もしくはソースコードをpushすると、添付ファイルが消えてしまう。
チケットを活用するにあたってこれはちと辛い。

そこで、「チケットの添付ファイルそのものをSQLの中にデータとしてブッコんじゃうんでヨロシク!」魔改造
あくまでも魔改造なので自己責任でお使いください。



attachmentsというテーブルがチケット内容(2014.02.03修正)添付ファイルのレコードとなっているようなので、
attachmentsテーブルにcontentというカラム名(TEXT)を追加してそこにデータを入れてしまうのだ。

candycaneの初期設定が終わってる場合(既にテーブルが作られている場合)はSQLのカラム追加は自力で行う。
(このためにphpPgAdminをインストールしたかったw)

candycaneの初期設定が終わっていない場合(テーブルが作られていない場合)なら、テーブルの雛形ファイル
mysql.sql
pgsql.sql
postgres.sql
に事前にカラム追加しておけばテーブル作成時に自動的に作られると思う(未実践)。


ソースコードの改造箇所はたった3箇所。

app/Config/Schema/schema.php

public $attachments = array(
...中略
	'description' => array('type' => 'string', 'null' => true, 'default' => NULL, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8'),
>>>追加
	'content' => array('type' => 'text', 'null' => true, 'default' => NULL, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8'),
>>>追加終わり
	'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
	'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_unicode_ci', 'engine' => 'InnoDB')
);

app/Model/Attachment.php

public function beforeSave($options = array()) {
	parent::beforeSave($options);
	if (!empty($this->data[$this->alias]['temp_file']) && !empty($this->data[$this->alias]['filesize'])) {
		$this->data[$this->alias]['disk_filename'] = $this->create_disk_filename($this->data[$this->alias]['temp_file'], $this->data[$this->alias]['filename']);
>>>追加
		$this->data[$this->alias]['content'] = base64_encode( @file_get_contents($this->data[$this->alias]['temp_file']) );
>>>追加終わり
		$this->log("saving '{$this->diskfile()}'", LOG_DEBUG);
		@copy($this->data[$this->alias]['temp_file'], $this->diskfile());
...中略
	return true;
}

public function diskfile() {
>>>置き換え
	$filepath = $this->storage_path . $this->data[$this->alias]['disk_filename'];
	if(file_exists($filepath)==false)
	{
		@file_put_contents( $filepath, @base64_decode($this->data[$this->alias]['content']) );
	}
>>>置き換え終わり
	return $filepath;
}

そんでもってHerokuにpushしてデプロイして終わり。
これで、Herokuが再起動してファイルが消されたとしても、データベースから復元できるようになる。
が、魔改造たる所以、でかい画像を添付したりするとデータベースのディスク使用量が暴力的に増える。
2013年12月現在、HerokuのpostgresSQL(無料プラン)では、使用制限がディスク容量ではなくレコード数(Enforced row limits of 10,000 rows for hobby-dev)のようなので、なんとか逃げきれる、かも。

Herokuにphppgadminをインストールする

すごく簡単だった。

http://アプリ名.herokuapp.com/

というPostgreSQLをaddonしてあるアプリがあるとする。
このアプリのソースに追加してもいいんだけど、アプリとphppgadminのソースが混ざるのも嫌なので、
新たに別のアプリを追加したほうが便利だと思う。以下手順。

1.iphotingさんのbuildpackを使ってPHP環境を構築する。
 まずはcandycaneをインストールした時と同じように以下のコマンドで別アプリとしてアプリ環境用意。 
 heroku create -s cedar -b git://github.com/iphoting/heroku-buildpack-php-tyler.git --app [アプリ名phppgadmin]
 アプリ名はなんでもご自由でOK。
2.のHerokuのDashboardでDatabaseのページをみると、[アプリ名]で使ってるDBの詳細が書いてある。

Host 	ec2-XXXXXXXX.amazonaws.com
Database 	データベース名
User 	ユーザー
Port 	5432
Password 	パスワード

これをメモる。

3.phppgadminダウンロードページ http://phppgadmin.sourceforge.net/doku.php?id=download から
 ソースをダウンロードして、解凍。
 conf/config.inc.phpの以下の箇所を書き換える

$conf['servers'][0]['host'] = 'ec2-XXXXXXXX.amazonaws.com';
$conf['servers'][0]['port'] = 5432;
$conf['servers'][0]['defaultdb'] = 'データベース名';

4.phppgadminのソース一式を[アプリ名phppgadmin]のリポジトリにpushしてデプロイ。

5.http://アプリ名phppgadmin.herokuapp.com/ にブラウザでアクセスし、
 ユーザーIDとパスワードを入力したら使えます。
 同じec2に乗っかってるほかのDBの存在も確認できちゃう。まあDBの中身にはアクセスはできないので大丈夫でしょう。

こんなかんじね。
f:id:BobZombie:20131228232949p:plain

データベース、もしくは所有者のところ、自分のを選んでクリックしたら
テーブル一覧やらレコードやらが見れるし、ブラウザから修正もできる。

Heroku用に魔改造 http://blog.candycane.jp/archives/1489 しなくても特に問題なかったです。

Herokuにcandycaneをインストールする

HerokuにRedmineをインストールしたかったのだが、
RailesどころかGemやらRubyやらに不慣れというかNO知識なため、なんだかうまくいかず。
宗旨替えしてcandycaneというCakePHPで作られたRedmineクローン的なものをインストールしてみた。

基本的にはTakayuki Miwaさんのブログ
http://tkyk.name/blog/2012/12/06/candycane-on-heroku/
で、書いてある通りそのまま。

1.https://github.com/tkyk/candycane/tree/release-heroku をcloneしてrelease-herokuブランチに変更
2.PHP環境構築のためにiphotingさんのbuildpack
 heroku create -s cedar -b git://github.com/iphoting/heroku-buildpack-php-tyler.git --app [アプリ名]
 実行してアプリ環境作成
3.HerokuのサイトにてaddonでpostgresSQLを追加
4.release-herokuブランチをHerokuにpush
5.環境変数にinstall_candycaneを追加
 heroku config:add install_candycane=1
6.ブラウザで開いて初期設定

ここで、初期設定が終わったと思ったらブラウザが真っ白になってうんともすんともな雰囲気になって焦る。
が、おちついて・・・

環境変数install_candycaneの削除
 heroku config:remove install_candycane

もう一度ブラウザでアクセスしてみると、キター!

これでおわり。


なのだが、Takayuki Miwaさんがforkしたバージョンが古い(今から1年前)だからだと思うんだけど
candycane側のバグがあるようです。

candycaneの環境設定で「認証が必要」の状態
(認証されてないユーザー、非ログインユーザーは中身を見ることができない)
にすると、そもそもcandycaneにうまくログインできなくなります。
これを修正するために、

app/Controller/AppController.php

public function require_login() {
	if (!$this->current_user || !$this->current_user['logged']) {
		$this->redirect(
			'/account/login?back_url=' . 
			urlencode(
				'http://' . 
				env('HTTP_HOST') . 
				env('REQUEST_URI')
			)
		);
...後略

を以下のように修正してpushする

public function require_login() {
	if (!$this->current_user || !$this->current_user['logged']) {
		$this->redirect(
			'/account/login?back_url=' .
			urlencode(Router::url($this->request->here(false), true))
		);
...後略

おそらくこれ以外にも本家のcandycane https://github.com/yandod/candycane でfixされたbugが存在すると思うので、本来であればTakayuki Miwaさんがforkしたバージョンを使い続けるのではなく

・本家の修正をマージしたものをTakayuki Miwaさんのリポジトリにプルリクエスト投げる。
or
・本家にHerokuバージョンをプルリクエストしてマージしてもらう
いずれかが良いと思うのですが・・ごめんなさいやってません。

iphotingさんのbuildpack実行後に本家のcandycaneをインストもためしてみようと思いつつやってませんごめんなさい。

UnityにAndroid SDKパスを設定できないとき

UnityとAndroidSDKのインストール順序が原因なのか、version 3.x と version 4.x を同居させているのが原因なのか・・・

このページにあるように
http://docs-jp.unity3d.com/Documentation/Manual/android-sdksetup.html
UnityにAndroid SDKパスを追加 しようとすると
Securityがどうのこうの、と言って怒られる。設定できない事態が発生。
ダイアログの所定の箇所をクリックしてもエラーが出て無視される。

フォーラムを探すと、
http://answers.unity3d.com/questions/169360/preferences-android-sdk-location-error.html?sort=oldest
こんなのが見つかるので、しょうがなくレジストリをいじる。

HKEY_CURRENT_USER/Sofware/Unity Technologies/Unity Editor 4.x
に、
キー:AndroidSdkRoot_h2651068356
値:C:/sdk ←AndroidSDKの場所、適宜変更
として追加。キーの部分の「h2651068356」の数字の意味はわからん。とりあえず動いているPCからコピーしてきた。

これをすると、「UnityにAndroid SDKパスを設定」は可能になるのだけど、
Unityでプロジェクトを開き、Android用バイナリとしてビルドすると、
consoleに
「Error building Player: SecurityException: A security error has been detected.」
と表示され、ビルドが途中でしくじる。

しょうがないのでUnityを常に管理者権限で実行
http://www.adminweb.jp/windows7/uac/index3.html ←この辺参照
するようにするとビルドできるようになった。うーむ。

AudioSource.PlayDelayed の注意点

Unity4.3で確認

PlayDelayed 関数を使うと、
「あと何秒後から音再生して」
という機能が使えるのだが、この関数を呼んだ途端、AudioSource.isPlaying は true になる。

ちょっとなんだかなー、という感じ。。。仕様があんまよろしくないような。。。

unityでスタックトレース表示

日本語の参考記事が意外と見つからなかった。

とりあえずこちらでスタックトレースの文字列が取得できる。

string temp = UnityEngine.StackTraceUtility.ExtractStackTrace();

Debug.Log(""); と書いても出力されるのでおおむねこれで用は足りるけど
ファイルに書き出したい時とかあるじゃない。