Ubuntu 9.04 Server に Redmine をいれたメモ
Ubuntu サーバに Redmine を入れて sqlite で何とか動いています
(getaddrinfo: Name or service not known でメール通知ができてない)
途中で何回か怒られましたがエラーをメモってなかったので完全にインストールメモです
は確実に怒られました
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-rubysudo 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=productionsudo rake config/initializers/session_store.rb
sudo nohup script/server -e production &
3000ポートでアクセスしたらいけました
メールが遅れなくて認証できないので admin でログインして手動認証しています
0.11にカレンダーとガントチャート
(半年間ほぼひとりで使い続けた) 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; } }
これだけっぽい
分散なんとか勉強会
福岡とかの専門家クラブ 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 でなんでもキャッシュする
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サービス を使ってストレスフリーにライフストリーミング
ライフログをかき集めてデータマイニングしていろいろやればGoogleに勝てる。
と、いうわけでまずはライフストリーミングをやってみようと思いました
(今回は自分のログを集めていますが他の人のストーキングもできます)
できるだけ楽に素材を集める
わざわざ投稿フォームをブラウザで開いたり,メールで送ったりやっても続くわけがないので iPhone + WEBサービス を駆使してどんなときにでもいかにストレスなくライフロギングするかをがんばってみます
めざせ0クリック!
以下のそれぞれのサービスを利用してログをためていきます。
各WEBサービスの後に載っているのは投稿用のクライアントソフトなどです。
ひとりごと
- twitter
- twit (Win)
- twitterrific (Mac, iPhone)
- twitter.vim
WEBからの引用
音楽
写真
自分の写真
音声
決済/家計簿
- Google SpredSheet
コーディング/WEB投稿
スケジュール
位置情報 (GPS系いろいろ)
映画
ゲーム
メール
電話
集計したログを束ねる
ほとんどのサービスがRSSを出力しているのでその情報を束ねます イエス、セマンティック!
plagger や Yahoo! pipes, dapper などを駆使してRSSがなくてもなんとかします。
自分の場合は 細かい対応をしたいことと、先々データベースを直接いじったりしたくなるかもなので PHPでできたオープンソースのフィードアグリゲートシステム http://www.sweetcron.com/ で束ねて墓標をたてました
(via: http://linyo.ws/about)
いろいろ大変だったとこ
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
- feed の pubDate がパースできん!
- twitter で報告してみるか!
- 修正してくれた!
- ありがとうございます!
iPhone でとった 写真, 音声, 動画 を直接WEBサービスにアップロードする
写真 → 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にアップロード