Ubuntu 9.04 Server に Redmine をいれたメモ

Ubuntu サーバに Redmine を入れて sqlite で何とか動いています
(getaddrinfo: Name or service not known でメール通知ができてない)


途中で何回か怒られましたがエラーをメモってなかったので完全にインストールメモです

  • libsqlite まわり
  • Rails のバージョン
  • Rails のセッションかなにか

は確実に怒られました

sudo apt-get install rails
sudo apt-get install sqlite3
sudo apt-get install ruby1.8-dev
sudo apt-get install libsqlite3-dev
sudo gem install sqlite3-ruby

sudo apt-get install subversion

cd /usr/local/src
sudo svn checkout http://redmine.rubyforge.org/svn/trunk/ redmine
sudo gem install -v=2.2.2 rails

redmaine/config/database.yml

production:
  adapter: sqlite3
  dbfile: db/redmine.db
  timeout: 5000

redmaine/config/email.yml

production:
  delivery_method: :smtp
  smtp_settings:
    # address: smtp.example.net
    address: 127.0.0.1
    port: 25
    # domain: example.net
    domain: localhost
    # authentication: :login
    # user_name: "redmine@example.net"
    # password: "redmine"
  
development:
  delivery_method: :smtp
  smtp_settings:
    address: 127.0.0.1
    port: 25
    # domain: example.net
    domain: localhost
    # authentication: :login
    # user_name: "redmine@example.net"
    # password: "redmine"

localhost が名前解決できんのか?

cd /usr/local/src/redmine
sudo rake db:migrate RAILS_ENV=production
sudo rake load_default_data RAILS_ENV=production

sudo rake config/initializers/session_store.rb
sudo nohup script/server -e production &

3000ポートでアクセスしたらいけました
メールが遅れなくて認証できないので admin でログインして手動認証しています

0.11にカレンダーとガントチャート

rytich2009-05-20


(半年間ほぼひとりで使い続けた) Trac + SVN を開発者以外の方にも進捗状況などをわかりやすく見てもらいたい!プロジェクト管理!


というわけで
plugins/GanttCalendarPlugin - Shibuya.trac Wiki - Shibuya.trac - OSDN
を挿れようとしたらエラーがでました
(global name ’log’ is not defined)

global name 'log' is not defined: 気の向くままに・・・
を参考にさせていただき

svn export http://svn.python.org/projects/sandbox/branches/setuptools-0.6/
cd setuptools-0.6
python setup.py install


svn checkout http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/ganttcalendarplugin/trunk ganttcalendarplugin
cd ganttcalendarplugin
python setup.py install

でさくっといけましたがチケットに開始日と終了日をちゃんといれてないのでお気の毒な感じです

accept したときに開始日、close で終了日が入ってくれればいいのに

ついでにバーンダウンチャート

http://stuq.nl/software/trac/ScrumBurndownPlugin
(こちらは.eggを配布してくれているので TracWebAdmin > Plugin から楽)

自分の発行したチケットの細分化がされてなさ過ぎ

DBレプリケーションで負荷分散

MySQLレプリケーションでmaster/slaveサーバをたててCakePHP1.2で振分をしてみます

参考URL: http://bakery.cakephp.org/articles/view/master-slave-support-also-with-multiple-slave-support

db設定

まず database.php を編集します
SELECT系はslaveサーバに接続するので $default で。レコード更新用に masterサーバを $master として追加設定しました

app/config/database.php

class DATABASE_CONFIG {
	var $default = array( // as MySQL slave server
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'slave.host',
		'port' => '',
		'login' => 'username',
		'password' => 'password',
		'database' => 'database',
		'schema' => '',
		'prefix' => '',
		'encoding' => 'utf8'
	);
	var $master = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'master.host',
		'port' => '',
		'login' => 'username',
		'password' => 'password',
		'database' => 'database',
		'schema' => '',
		'prefix' => '',
		'encoding' => 'utf8'
	);
}

更新系のメソッドをmasterサーバに向ける

app_model.php でマスターに接続するようオーバーライドします
参考にした記事では save, updataAll だけでしたが delete, deleteAll も追加しました

  • delete, remove は del のエイリアスなので他のを使うなら注意
  • 使うなら saveAll, saveField も
  • 関係ないけど delete系 に cascade あるのはじめて知った

app/app_model.php

class AppModel extends Model {

	function save($data = null, $validate = true, $fieldList = array()) {
		// Remember the old config (default)
		$oldDb = $this->useDbConfig;
		// Set the new config
		$this->setDataSource('master');
		// Call the original Model::save() method
		$return = parent::save($data, $validate, $fieldList);
		// Reset the config/datasource (default)
		$this->setDataSource($oldDb);

		return $return;
	}

	function updateAll($fields, $conditions = true) {
		$oldDb = $this->useDbConfig;
		$this->setDataSource('master');
		$return = parent::updateAll($fields, $conditions);
		$this->setDataSource($oldDb);
		return $return;
	} 

	function delete($id = null, $cascade = true) {
		$oldDb = $this->useDbConfig;
		$this->setDataSource('master');
		$return = parent::delete($id, $cascade);
		$this->setDataSource($oldDb);
		return $return;
	} 

	function deleteAll($conditions, $cascade = true, $callbacks = false) {
		$oldDb = $this->useDbConfig;
		$this->setDataSource('master');
		$return = parent::deleteAll($conditions, $cascade, $callbacks);
		$this->setDataSource($oldDb);
		return $return;
	} 

}


これだけっぽい

注意点

更新かけてすぐに SELECT するときは レプリケーションのタイムラグがあるのでマスターサーバにつないどかないとダメでした><

分散なんとか勉強会 で

2009/05/30 に福岡である 分散なんとか勉強会 でこういう感じの話をしたりしますのでよかったら参加したらいい

分散なんとか勉強会

rytich2009-05-12


福岡とかの専門家クラブ codecheck.in でいろいろな分散を行うための勉強会があります

codecheck.in

Date: 2009/5/30
Time: 13:00~
Place: 株式会社Fusic (福岡県福岡市中央区赤坂)

主な内容はみんなで The world’s leading software development platform · GitHub のアカウント作って 分散レポジトリ の Git を試してみることです(たぶん)

あとはWEBサービスの負荷分散や人生のリスク分散などの話が聞けるかも知れませんし、分散以外のことでも誰か人前でポエムを読んだりとかしたい人はぜひスピーカーをしてください。
(一番分散してるのは運営者コスト)


途中参加/退出 可能です
懇親会もあるかも

参加申込

Googleグループに参加しないといけないので面倒ですが、一度見たことのあるお笑い芸人のネタを見ている間に登録できますので、心の強い方は参加してみてください
Google グループ

Cache::write でなんでもキャッシュする

rytich2009-04-23

CakePHP1.2 で WEB API の情報なんかをキャッシュしたい時に Cache::write を使うと楽チンでした

http://book.cakephp.org/ja/view/764/Cache

if(($content = Cache::read('content')) === false) { //有効なキャッシュがあるか
    $content = file_get_contents($url); //キャッシュがないのでとってくる
    Cache::write('content', $content, array('duration' => '+5 minutes')); //5分間キャッシュ
}

追記: Cache::write の duration は Cache::set を使ったほうがいいみたいでした

    Cache::set(array('duration' => '+5 minutes')); 
    Cache::write('content', $content);

これで 5分以内であればキャッシュを使用して、それ以上だと$urlに内容を取りに行きます
キャッシュの保存先は Cache::config で設定したとこっぽい

最初オブジェクトをキャッシュしようとしたら Cache::read の時に 「unserialize できない!」となったので連想配列にしてからキャッシュしたら大丈夫でした!

追記: くわしくはこちら CakePHP cache()はCache::write()に - Shin x blog

iPhone と WEBサービス を使ってストレスフリーにライフストリーミング

rytich2009-04-17

ライフログをかき集めてデータマイニングしていろいろやればGoogleに勝てる。

と、いうわけでまずはライフストリーミングをやってみようと思いました
(今回は自分のログを集めていますが他の人のストーキングもできます)

http://unw.nu/


できるだけ楽に素材を集める

わざわざ投稿フォームをブラウザで開いたり,メールで送ったりやっても続くわけがないので iPhone + WEBサービス を駆使してどんなときにでもいかにストレスなくライフロギングするかをがんばってみます

めざせ0クリック!

以下のそれぞれのサービスを利用してログをためていきます。
WEBサービスの後に載っているのは投稿用のクライアントソフトなどです。


ひとりごと
自分の写真
動画

それ以外にもこんなライフログがありますがこちらは公開していません


音声
    1. iPhone
決済/家計簿
コーディング/WEB投稿
スケジュール
ToDoリスト
位置情報 (GPS系いろいろ)
映画
ゲーム
メール
電話

集計したログを束ねる

ほとんどのサービスがRSSを出力しているのでその情報を束ねます イエス、セマンティック!
plaggerYahoo! pipes, dapper などを駆使してRSSがなくてもなんとかします。

自分の場合は 細かい対応をしたいことと、先々データベースを直接いじったりしたくなるかもなので PHPでできたオープンソースのフィードアグリゲートシステム http://www.sweetcron.com/ で束ねて墓標をたてました
(via: http://linyo.ws/about)

http://unw.nu/


いろいろ大変だったとこ

Amazonほしい物リストのfeedがない

「Amazon ほしい物リスト」のフィードを吐きます - [foool]丘の上

Sweetcron は同じ時間かどうかで fetch するか判断してる
Sweetcron model item add_item

//we assume that if an item has the exact same timestamp and origin as one in the db, it's a dupe
//if (!$this->db->join('feeds', 'feeds.feed_id = items.item_feed_id')->get_where('items', array('item_feed_id' => $item->item_feed_id, 'item_date' => $item->item_date))->row()) {
//same permalink by rytich
if (!$this->db->join('feeds', 'feeds.feed_id = items.item_feed_id')->get_where('items', array('item_feed_id' => $item->item_feed_id, 'item_date' => $item->item_date, 'item_permalink' => $item->item_permalink))->row()) {

同じパーマリンクかどうかも追加

http://teiten.org
  1. feed の pubDate がパースできん!
  2. twitter で報告してみるか!
  3. 修正してくれた!
  4. ありがとうございます!

思ったこと

画像がアーカイブされない
  • ローカルに落とす?
統計情報
  • グラフ化したら結構おもしろそう
  • カテゴリをまたがった属性情報がとれる?


ログがたまったらなんかやってみます

iPhone でとった 写真, 音声, 動画 を直接WEBサービスにアップロードする

rytich2009-04-15



写真 → flickr

iTunes で同期したいので標準のカメラで撮影した写真をflickrにアップロード

http://click.linksynergy.com/fs-bin/click?id=oDgT5TLZn4c&offerid=94348.672441056&type=10&subid=
を使ってアップする
http://www.shozu.com/portal/index.do
flickr のアカウントを追加 して選択、 Pick from photo gallery から 標準カメラで撮影した写真を選べる
他にも いろんなWEBサービスに対応

音声 → Evernote

Best Note Taking App | Organize Your Notes with Evernote
の公式アプリだけで録音→アップロードできる

ただ会議とか時間が長めだと厳しいのでそのときは VoiceNotes で録音して SCP で保存

動画 → YouTube

iPhone用の動画撮影アプリ Cycorder (要JailBreak) を使って撮影した動画を YouTube にアップロード

ファイルアップロードサービス PixelPipe - の公式アプリを
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290648828&mt=8 からインストール
pixelpipe の設定画面で YouTube のアカウントを設定、enable default にします

このままだと画像ファイルしか扱えないので
PPVideoEnabler (要JailBreak) を Cydia からインストール、
Enable video uploads from Cycorder via Pixelpipe を オン

これで Cycorder で録画した動画を pixelpipeアプリ から YouTube に直接アップロード

via: とよしんのブログ 「PPVideoEnabler」Cycorderで撮影した動画をiPhoneから直接YouTubeにアップロード

ついでに よく使う iPhone アプリ

1Password
LDR touch
VoiceNotes
fring
Twitterrific
midomi


[JailBreak]
Dock
BossPrefs
MobileTerminal
AptBackup
hClipboard
scrobble


[US iTMS]
Last.fm


JailBreakしたときのパスワード変更とか忘れないようにしないと