2009年12月28日月曜日

CakePHPで知っとくと良いBasics

basicsを読むべし

CakePHPのcake/basics.phpは一度目を通しておいた方がいい。というのも知ってればよく使うから。

関数一覧

そのうち網羅したいね。そのうちね。

関数名 説明
関数名 説明
a($mixed[,$mixed...]) (可変長引数)渡された引数を1つの配列に入れて返す。例: a('a', 'b', 'c') => ['a','b', 'c']
aa($mixed[,$mixed...]) (可変長引数)で渡した引数をキーと値に変換。例: a('a', 'b', 'c', 'd') => ['a' => 'b', 'c' => 'd']
h($string[, $charset]) htmlspecialchars($string,ENT_QUOTES, $charset)のエイリアス。$charsetを指定しないとUTF-8がセットされる。これはビューでも多用するけど、CakePHPコアでも使われいる。ヘルパーとか見てみると、こんなところでhしてる!!と言いたくなる場所がある。2回もやってるところがあるのはおそらく仕様で(&が&になったり)、そういう場合はヘルパのオプションの引数のところでescape => falseをすると意図した通りに動くと思う。

aとaaを使った例

んー、aがarray関数のエイリアスだと思って、お!便利かも!と思ってまとめようと思ったら違ったので、やる気なくなりました。どうですか? aをarray関数にしちゃった方が分かりやすいと思います。

// 普通の書き方
$r = $this->User->find('first', array('conditions' => array('User.name' => 'hoge'));
//basics.phpのを使う場合
$r = $this->User->find('first', aa('conditions', aa('User.name', 'hoge'));

// もしもaがarray関数だったら
$r = $this->User->find('first', a('conditions' => a('User.name' => 'hoge'));
// もしもPHPがJSON記法?をサポートしていたら(個人的趣味)
$r = $this->User->find('first', {'conditions': {'User.name': 'hoge'}});

aaは=>(ダブルアロー演算子?)を打つのがめんどいなーと思ってる人には朗報かもしれないけど、引数が多くなれば読みにくくなるし、直感的に連想配列とは分かりづらい。=>の入力が面倒ならスニペットとかキーバインドで代替してしまえば簡単に克服できる。aとかaaとかせずに、aをarrayのエイリアスにした方がいいと思うんだけどなぁ。

2009年12月21日月曜日

Warning: Module 'xdebug' already loaded in Unknown on line 0

On Leopard(Mac OS X)

Macに最初っから入ってるPHPは微妙ということでportでPHPを入れ直したんですが、その際に+xdebugもしたんだけど、古かったので新しいのを入れ直したら、Warning: Module 'xdebug' already loaded in Unknown on line 0という警告が出るようになった。

最初は無視してたけど、だんだん目障りになってきたので、どうもphp.iniがあやしいと思って調べてみたら、php.iniがたくさんあったw

php --ini

xdebug.iniというファイルが前のxdebug.soを読み込んでいたのでこいつをセミコロンでコメントアウトしたら出なくなりました。

2009年9月14日月曜日

SinatraのRailsテンプレート!?

easy-peasy is cheesy!?

Sinatraはちょっとしたアプリならラクチン。でもファイル構造とかを考えるとめんどさくなる。とりあえずMVCでRailsっぽい感じにしたいならmonkがいいみたいよ!

monk

monkはSinatraでRailsのようなディレクトリ構成とライブラリの依存関係、テスト&ストーリー駆動開発をサポートしてくれるSinatraユーザの強い味方!(Sinatraだけじゃないかも?) glue framework(glue=のり)っていう位置づけらしい。フレームワークにまでグルーなものがでてきたんですね。でも面白いし、欲しい!って思ってたのでこれはビンゴかもしれない。今夜早速使ってみよう。

2009年9月6日日曜日

Ruby1.9 make parse.cで止まる

宵待草

ってぐらい、parse.cのコンパイルがうんともすんとも言わなくなります。待てど暮らせど来ぬ人を 宵待草のやるせなさ 今宵は月も出ぬさうな曲の方もメロディが美しい。

./configure optflags="-O3 -pipe"

でいけました。ちなみに環境はDebian5 lenny

2009年8月12日水曜日

この夏おすすめのRedmineテーマ: watersky

watersky

青ベースでグラデも綺麗で落ち着いたデザイン。清涼感もあって夏におすすめです。

サンプル

ダウンロードと設置方法

public/theme/以下にフォルダごとアップして、Redmine設定のテーマからアップしたフォルダ名を選べばok! ダウンロードはkosz-redmine-tools Downloadsからダウンロードして、解凍して下さい。

2009年8月5日水曜日

SSLだとRedmineが遅い件

これはRedmineとかRailsとかの話じゃなく、ブラウザのキャッシュの話になるのかな。HTTPでどうファイルを扱うかまでは決めてないよね?有効期限とかはあるけど。SSLで取得したものは、漏洩させないためにうんぬんってのは...知らないだけかなw

静的ファイルがキャッシュされないらしい

特にFirefoxとSafariはSSLでアクセスするとキャッシュしないらしい。キャッシュしない=毎回ダウンロードするので遅くなる。そんなわけで、コピペしてみました。httpd.confのRedmineを設定してるVirtualHost内にぺたっと。

Header onsuccess append Cache-Control public  

ExpiresActive On 
ExpiresByType text/css "access plus 3 days" 
ExpiresByType application/x-javascript "access plus 3 days" 
ExpiresByType image/jpeg "access plus 3 days" 
ExpiresByType image/png "access plus 3 days" 
ExpiresByType image/gif "access plus 3 days"

表示は確かに前より早くなりました。

参考資料

イントラネットとかVPNならまだhttpでいいけど

グローバルに置く場合はやっぱり暗号化しとかないと不安ですよね。だってリポジトリでコードも見れるし。でもFTPでも同じじゃんって話だけど... 僕はもうFTPは使ってないので。会社では使ってるけど。今はscpかssh経由のgit pushでほとんどやるし。セキュアにいきます。きっと誰も見ないけどねw

2009年8月4日火曜日

iPhoneでQRコード読み取り

barcode

業務上、QRコードの読み取りの確認依頼とかされたり、日常生活でもQRコードは便利だったりします。iPhoneにはQRコードを読み取る機能がないためデフォルトでは使えませんが、barcodeという無料アプリで、カメラで撮影し、それを解析することでQRコードを読み取ることができます。解析しやすいようにQRコードを綺麗に撮って、その後画面にタッチして移動や拡大縮小をして画面内に表示されている四角の位置に合わせてdecodeボタンを押せばすぐに読み込んでくれます。便利便利♪

2009年7月7日火曜日

PHPとJavaScriptでひらがなカナタカチェック!

まずは下ごしらえから

今回はUTF-8とUTF-16でのチェックです。ちなみにJavaScriptはUCSモデルで内部的に文字コードをUTF-16で扱います。PHP5はCSIモデル?なので、文字コードが混在しますので、各文字コード用には下記リンクを参照に作ってみて下さい。 PHP6からはUCSになります(UTF-16)。

今回は伸ばし棒(「ー」U+30FC)も入れます。この文字はKatakana Hiragana prolonged sound markという名でUnicodeに登録されてます。

PHP

クラス実装版。PHP5用でUTF-8の場合です。

class Valio{
 /**
  * UTF-8で全角カタカナと「ー」だけか調べます
  *
  * @param string $string
  * @return bool
  * @static
  * @access public
  */
 public static function isKatakanaOnly($string)
 {
  return preg_match('/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6]|\x83\xbc))+$/', $string) > 0 ? true : false;
 }
 
 /**
  * UTF-8で全角ひらがなと「ー」だけか調べます
  *
  * @param string $string
  * @return bool
  * @static
  * @access public
  */
 static public function isHiraganaOnly($string)
 {
  return preg_match('/^(\xe3(\x81[\x81-\xBF]|\x82[\x80-\x93]|\x83\xbc))+$/', $string) > 0 ? true : false; 
 }
}
Valio::isHiraganaOnly('どーぴん'); # => true

JavaScript

今回はカタカナは実装しなかったのでひらがなだけ。カタカナも同じように作れます。

/^([\u3040-\u309Fー]+)$/.test('チェックしたい文字列')

僕の場合、よくフォームはtable要素と組んで、jQuery UIを使って制御するので、こんな感じのチェック用関数を用意して、keyupにバインドさせてます。

function hiraganaOnly()
{
 var ele = $(this);
 var pEle = $('th,td',ele.parent().parent())
 if(/^([\u3040-\u309Fー]+)$/.test(ele.val())){
  clearUserErrorMessage(ele.attr('id'))
  pEle.removeClass('ui-state-error ui-corner-all');
 }else {
  addUserErrorMessage(ele.attr('id'),$('label[for="'+ ele.attr('id') +'"]').html().replace(/^\*/,'') + 'はひらがなと「ー」で入力して下さい');
  pEle.addClass('ui-state-error ui-corner-all');
 }
}

PHPでサムネイル

ネイリストDopinがおすすめするライブラリ

PHP THUMBがcool!

MITライセンスなので商用も可。I ♥ MIT lisence!!

ちなみにこれを独自のSmartyプラグインと融合させて使っているので、もう自分で言うのもなんだけど、うまくMVCを分けることができて、あぁ素敵!このライブラリを使えばたった数行でそれが実装できます。ありがとうオープンソース!Thank you Ian!

2009年7月6日月曜日

Redmineのおすすめプラグイン

意外と知らないRedmineのプラグイン

Redmineの印象というと、Tracの後発で、Tracより(デフォルトが)高機能で最初からマルチプロジェクト対応しているということ。逆にTracはプラグインによる対応が可能という印象。でもRedmineにもプラグインはあるんです!Redmineのデフォルトの機能で満足しているようではダメよっ!求めよ、さらば与えられん。Redmineをもっともっと使いやすいものにしましょう!

まずどれだけプラグインがあるか

Redmine Pluginsにまとめられていますが、GitHubにもあります。Redmineで検索してみてください。Redmine ForumのPluginにも情報があります。

チケットの増加と終了状況が確認できるGraphs

Graphsは文字通りグラフ系。何のグラフかというと、プロジェクトの新規チケットと終了チケットのグラフを見れたり、全てのプロジェクトが今どれだけチケットが発生してるかを見れます。

このプラグインの便利なところは、バージョン(ロードマップ)毎にグラフが見れ、今どれくらいチケットが終わっていて、このペースで間に合うのかが感覚的に分かります。

面白かったのは、会議後にチケットが発生するということがグラフであからさまに出たのを見た時でした。分かってはいることですが、グラフで見ると面白いものですw 締め切りまでの緩やかな上り坂が、会議を増す毎に急斜面になっていく、まぁなんと会議の恐ろしいことw 話が逸れましたが、坂マニアでなくても、このグラフは見ていて面白いかもしれません。メンテナンス(保守)系プロジェクトには向きませんが。

そのコードの書き方ちょっとまずいんじゃ...

そんなこと思ったこと、思われたこと、あるんじゃないでしょうかw 実は僕はまだ使ってませんが(チーム開発らしいチーム開発をしていないので)、Code Reviewはリポジトリのコードに対してコメントを付けられるプラグインです。リンク先のサンプルの通り、指摘してみたり、賞賛してみるのもいいんじゃないでしょうか。プログラミングの場合、書く時間より読む時間の方が圧倒的に長いですし、何かあったらすぐメモったりしておきたい。その書き方だとIE6でメモリリークになるリスクないですか?とか、ifの条件のところがちょっと甘かったりとか、HTMLとCSSもそれリストでできるじゃんとか。あまり指摘し合っても雰囲気が悪くなりそうですが、みんなでレビューして、お互いに切磋琢磨する方がいい製品がより早く作れる環境になれそうです。このプラグインはお互い同じ場所で仕事をしない、SOHOやオープンソース開発なんかで役立ちそうですね。

まだまだ全然あるけど

次にやるべきチケットを自動的に割り出してくれたりするプラグインや、FLASHを使ったグラフ系の面白いプラグインやら結構あります。中にはバグがあったり、バージョンの互換性の問題で動かなかったりもしますが、気になったプラグインは片っ端から入れて、このブログで取り上げて行こうと思います。

Redmineの語源はRed Lineじゃないのか

レッドラインとは

それは越えてはならない一線。締め切りという意味じゃないけど、ある意味チケット終了予定日は絶対かもしれない。0か1ですから!

なぜ思いついたのか

Redmineのガントチャートの色で、まだ終わっていないもので、開始日より後のものでまだ終了していないものが赤いから。実際どうなんでしょう。Langさんに直接聞きたいけど、忙しいだろうし、前田剛さんが知ってるかな?? 気になるよねー。実はフランス語だったりして

Red + mine = 赤色の宝庫説

Rubyで作られているから赤というのは連想できますね。Wikiやリポジトリやチケット駆動開発でいろいろと貯め込むから宝庫という表現もできなくはないし。鉱山を掘ってRubyのような宝石を取るって意味かなー。間違って地雷を踏む可能性もあるから? でもリポジトリがあるからやっぱり宝庫説が有力か...

2009年7月1日水曜日

WEBの高速化に本気だぜモード

Googleが本気らしい

Google Code Let's make the web fasterのArticlesがいい!読まなきゃね。

JavaScriptの部分に関しては、それ図解で。・・・tohokuaikiのチラシの裏さんとこの、JavaScriptの最適化について、code.google.comの記事の適当訳、で読めます。参考になります。ありがとー!

ブラウザも高速化している世の中ですもの

YahooのWeb高速化のための14プラクティスみたいなのがありましたが、その頃からブラウザも高速化の競争が激しくなっています。IEはおいといて。Chrome2は速い。狐が遅く感じる。Safari4ですらちょっと遅く感じる気もするってくらいChrome2速い。環境によるのかもしれないけど。でも、表示もとのサーバ側の処理やHTMLに問題があって、その速さを殺すこともできるので、なるべく殺さないように頑張ろうと思う今日この頃。しかし、覚えることが多いねー... サーバの設定、HTTPのやりとり、プログラムの書き方。

プログラムの高速化は結構充実感のある仕事ですが、実際高速化したことによるメリットがあるのかをちゃんと計った方がいいってのもありますね。人件費の1秒の単位と、高速化によって何秒減るかを計算して、そのプログラムを何回実行して初めて元が取れるのかってのも大事です。でも、遅すぎて誰も使わないってのは問題外なので対処しないといかんです。昔書いた某地図系ライブラリ、Adobe Spryの書き方を真似しててよかったw this.prototype.fooとかでも良さそうな気がするんだけど、だめなのかなぁ。あの書き方は実行が速いとしても、書き方がちょっと面倒で好きじゃない... 高速化はトレードオフですね。

2009年6月30日火曜日

IE 操作を中断しました

VISTA IE7

bodyタグ内のscript内にJavaScriptを書いていてもだめらしく、関数に閉じ込めてonload時に実行するように書かないとだめみたい... しんどいわーIE

2009年6月25日木曜日

TextMate 2.0は開発中!!

He's Still Working On It

アランが久しぶりにブログを書いたようです。Working On It

大多数に向けて書くのは苦手だから、ブログを代わりに書いてくれる人を募集中だとか、なんとも弱気な気がするけど、2が出るんなら待ちますよ。きっと待つだけの価値が充分にあるエディタだと信じてますし、日本語に対応すればきっと日本のMacユーザのほとんどがTextMateを使うようになるかもしれない。オープンソースにしたら?とかいろいろコメント(現時点で205件もコメントがある、しかも日本語もある!)が寄せられているようですが、大半が2を待ちわびてるよ!頑張って!的な内容ですね。年内に出てくれたらいいなー

2009年6月24日水曜日

IE6 JavaScriptでURL最後がスラッシュだとスラッシュが消える

ぽんこつめ!

window.location.hrefに文字列を代入してページ遷移をさせることができますが、IE6ではこの時URL最後がスラッシュだとスラッシュを勝手に消すようです。IE7は未確認、IE8は消えません。早く絶滅危惧種から絶滅してほしいIE6なのでした。(今日のわんこ風)

RewriteRuleの正規表現の書き方に注意!

2009年6月23日火曜日

XHTMLではdocument.writeが使えない

厳密にはapplication/xhtml+xmlの時

こちらをご覧あれ。HTML and XHTML Frequently Answered Questions 14. Does document.write work in XHTML?

パーズ中はだめなんだそうです。でもパーズ後でもだめだったと思います。結局はDOM経由で操作してたんですが、Google Analyticsのコードや、document.writeを使う他のサービスを利用することができなかったし。document.writeとDOM経由のappendChildとでは挙動も違うみたいなので。不便だー!

2009年6月11日木曜日

Singletonパターン de PHP

Singletonパターンは一人っ子パターン

一人っ子ってわがままだから嫌い。という人もいるかもしれないけど、Singletonパターンは知っていた方がいい。23パターンあるうちの1つ。そのオブジェクトのインスタンスが1つか生成されないことを約束するものです。PHPの場合DBとかセッションとかで使えるかも?。常時動いてるわけじゃないから、あまり意識しなくてもいいかもしれないけど。

書き方 (PHP5)

class Foo
{
    private static $_instance = null;
    //あえてsingletonというメソッドを用意した場合
    public static function singleton()
    {
        if(self::$_instance == null) self::$_instance = new Foo();
        return self::$_instance;
    }
}

最近あまりブログを更新できてないのでポチッ!

オブジェクト指向をPHPでやると、外部イテレータの方が使うかな。Factoryも使うなー。まぁ、そのうち。まとめれたらいいな。

2009年5月19日火曜日

JavaScript 文字列の途中改行

バックスラッシュか配列にしてjoinしちゃう

PHPSPOT これは必見!JavaScriptの文字列を複数行で定義する方法

var string = 'a \
b \
c'
//または
var string = [
 'a',
 'b',
 'c'].join('')

逆に文字列を一文字毎配列にする

404 Blog Not Found javascript - 基数変換

var string = 'abcedefghijklmnopqrstuvwxyz'.split('')

これはパスワードをランダムで作成する時とかにも使えます。string[0] = 'a'なんてやるのは大変乙な話です。

2009年5月7日木曜日

JavaScriptで文字列のバイト数を求める

Stringを拡張してみた

これがGoodパーツなのかBadパーツなのかは用途次第ということにさせて下さいw

(function(){
if(String.prototype.utf8byte) return;

String.prototype.utf8byte = function(){
 return(encodeURIComponent(this).match(/(\w|%[0-9A-F][0-9A-F])/ig).length)
}
})()

//使い方
alert('aiu'.utf8byte()) //3
alert('あいう'.utf8byte()) //9
alert('草𦿶'.utf8byte()) // 7

バグはあると思われ

適当な正規表現でやってるので(正規表現書くなとか言われそう...)ちゃんとテストコード書いてテストしないといけないですね。JSUnitだっけ...

JavaScriptのencodeURIComponentがUTF-8でやるのかはちゃんと調べてませんが、UTF-8の場合日本語は3〜4バイトになるので、最近追加された漢字で偶然あの人の名前から拝借したところ4バイトのがありましたので、たぶんUTF-8なんだと思います。

用途

例えばデータベースのvarcharなど、バイト数が制限されるところで使えると思います。

独り言

会社で他のプロジェクトでも使えるようなJavaScriptライブラリを作ろうと計画しているのですが(個人的に)、会社で書かずに家で書いてgithubとかに上げて、他の人にも使ってもらえるようにした方がいいかなぁと思ってます。バグ報告とかw 人柱とかw 確かに本尾企業でもすごく優秀な軽量ライブラリを公開してるところがあったなぁ。JavaScriptって結局はソースを公開しちゃうんでライブラリの管理を一元化しちゃった方がいいのかもしれないですね。jQueryプラグインはそこそこ管理されてていいですね。Google Code、 Github、Code::Reposといろいろ選択肢があるのは嬉しいけど、そういったのを統括して検索したりできるサイトがあると便利かな。

2009年4月8日水曜日

Redmine on Debian 5

2日かけて完成

というか、サーバ移管なのでした。CentOS5.2でDBがsqlite3からDebian 5 + MySQL5という。自分で選んだ道です(笑 でも得る物も多かったです。用意していただいたマシンがメモリ1GBあったので、今はさくさくっと動いてくれます。構築手順を編集して載せても良さそうだったら後日載せます。

Redmineを使う理由

未来、現在、過去にアクセスするためです。過去の曖昧な記憶を補完してくれたり、これから何をするかを書いておいたり、現在どういう状況なのかを確認したり。でも、がっちがちにルール化したくないのが本音です。CoCのような、ある程度規約があって、その上で自由に作業できるのが理想です。今回はこう、この会社の場合はこう、とか設定重視なのは混乱を招きやすいので避けたい。まだ導入したばかりなので模索してる部分が多いけど、過去の事例から学ぶということで、どんどん実績を重ねて、近い未来では形にしたいです。そして何よりも、チケット(issue)を終了させる達成感と喜びを味わえる環境にすることが目標です。確実に目標に近づいている、いい製品、いいサイトを作ってると、良い未来に進んでいるんだという実感が持てれば最高ですね。

Subversion

バージョン管理は、サイトを作成して終わる案件では別にあまり効力を発揮しないけど、システム(PHPのプログラムとか)が絡むとなると、導入しておいた方がいい。これはJavaScriptも同じ。一人でやるなら、記憶力のいい人はバージョン管理はいらないかな。一人でやる時はMercurialがいいかも。bazaarは他OSのことも考えればbazaarがいいけど(ファイル名に日本語を使う場合など)。Mercurialはとりあえず簡単にhttpサーバ上でリポジトリの確認ができるのが個人的な好みですw ほかのSCMもそういう機能があるかもしれないけど、プラグイン対応だったかな。Eclipseのローカルヒストリー機能は素晴らしい。Eclipseを使わない場合は、分散型のバージョン管理を入れといた方がいいと個人的に思う。あとプログラマはgitとsvnは使えた方が絶対いい。オープンソースはこの2つのどちらかで公開管理されてることもあるので、使い方を知らないで諦めるのはもったいなさすぎます。

余談

Redmineのあるプラグインを入れてみたんだけど、使ってみて良さげだったら、日本語訳用ファイルを追加してpull requestをやってみようと思ってます(github)。あと、テーマを黒ベースのにしてみたら、チケットが見やすくなったとか、別に悪くないみたいだったので、いずれ自分でもテーマを作っていいのができたらRedmine本家にリンクしてもらおうと思います。ただ、個人的に普段使うものに黒というのは好きではないので、もっとしっかりしてい楽しいというイメージのものにしたいです。黒は悪くないんですが、やっぱり色は視覚に影響して、知らず知らずのうちに心にも作用しますし。テーマを個人別に設定できるプラグインを作ればいいんでしょうが、日本人ってそういうのはあまり利用しないし、チケットの優先度の色がまちまちというのも変だしな...

ところで今日は久しぶりに駄菓子を食べました。おいしかったです。ありがとうございましたm(_ _)m

お菓子と飲み物に不足しない良い会社です(笑)。これからも貢献できるよう頑張ります!

ちなみにチョコレートを食べると、恋愛をしてる時のような幸せな脳波が出るらしいです。個人差はあると思うのですが。あとポリフェノールも含まれていて集中力にもいいですし、お菓子は侮れませんね。ということで、お菓子は大事だというのをアピールしておきます(笑)。気分転換にもなるので、ほんといいと思います。タバコを吸わない人が、ちょっと休憩するのに、お茶を入れるとか、他の作業をする時間を作るというのも結構大事なんですよね。席をたつだけで、浮かばなかったアイデアが生まれたりするし、体を動かしてる時にいいアイデアが浮くのも多いそうです。

2009年4月6日月曜日

Debian5をインストール

個人的メモ

ゴール

  • SCM:git bzr svn なるべく最新のもの
  • Apache2.2 Ruby1.9 Merb1.11
  • MySQL5
  • Python 2.5 or later
  • Samba (Macから直接コードを編集する)
  • ntpによる時刻同期
こんなとこかな

用意するもの(マリンバのあの曲スタート:3分クッキング)

  1. Debian 5 ダウンロードページからi386(ネットワークインストール版)を落として焼いたCD(150MBほど)
  2. ネットに繋がるマシン

適当にインストール

日本語にしたり、デスクトップ環境をインストールしなかったり、全部チェックを外してインストールしました。

サーバ立ち上がったら

# apt-get install ssh

まずはsshをインストールして、外部から操作できるようにする。これができるようになれば、モニタとキーボードは不要

ここから先はMacのターミナルでsshで操作

apt-get install mlocate

ファイル検索でいつもlocateを使うので入れときました

 cd /
mkdir downloads
いつもインストールする時にダウンロードしたファイルは/downloadsに保存してます。余裕があればinstall.shなんかも書いてみたり
apt-get install gcc
apt-get install g++
apt-get install make

卵が先か鶏が先か、gccのインストールは必須

Ruby1.9 インストール

俺ん中で熱いRuby1.9.1(安定板)をインストールする。むしろこのサーバはRuby1.9を勉強するためのもの!あと会社でRedmineサーバを再構築しなおすためにDebian5になれとくためのもの。ちなみにRedmineは現在Rails2.2でつまりRuby1.8.7の環境なのでRedmineサーバを構築する時はRuby1.8.7をおすすめする。というか、動かないところが出るはず。

ruby1.9.1をインストールする前に、rubyが入っていないとどうもインストールできないっぽい。ブートストラッピングですね。

cd /downloads
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
tar zxf ruby-1.8.7-p72.tar.gz
cd ruby-1.8.7-p72
./configure
make
make install
cd ..
ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz
tar zxf ruby-1.9.1-p0.tar.gz 
cd ruby-1.9.1-p0
./configure
make optflags=-O3
make install
cd ext/
cd zlib
apt-get install zlib1g-dev
ruby extconf.rb
make
make install
apt-get install libsqlite3-dev
gem install merb --no-ri --no-rdoc

ちょっと脱線してaptの高速化?

apt-get install netselect netselect-apt

本当に速くなるかは不明

ntpインストール

apt-get install ntpdate
/etc/default/ntpdateが設定ファイル
vi /etc/ntp.conf
プロバイダが提供してるntpサーバか
ntp1.jst.mfeed.ad.jp
ntp2.jst.mfeed.ad.jp
ntp3.jst.mfeed.ad.jp
を追加
ntpdate ntp1.jst.mfeed.ad.jp

各SCMをインストル

apt-get install subversion
apt-get install git-core
apt-get install python
apt-get install python-dev
apt-get install python-crypto
apt-get install python-paramiko
cd /downloads
wget https://launchpad.net/bzr/1.13/1.13.1/+download/bzr-1.13.1.tar.gz
tar zxf bzr-1.13.1.tar.gz 
cd bzr-1.13.1
python setup.py install

gitは1.6を後で入れ直そうかな...

MySQL5インストール

apt-get install mysql-server mysql-client
vim /etc/mysql/my.cnf
bindaddressをコメントアウトするかリモートからも接続できるようにする
grantする時に@localhost以外のアカウントも必要?
MacからはSequel Proで接続する

SQLite3も便利なので入れよう

apt-get install sqlite3

Sambaインストール

Samba でファイルサーバー構築を参考に構築しました

Passengerでmerbとapacheを連携

PassengerがRuby1.9に対応してるかは知りませんw だめな時は諦めて他の方法をいずれ探します

apt-get install -y apache2-mpm-prefork apache2-prefork-dev libapr1-dev
cd /downloads/ruby-1.9.1-p0/ext/openssl
ruby extconf.rb
make
make install
gem install passenger --no-ri --no-rdoc
passenger-install-apache2-module
コンパイルが終わるとPlease edit your Apache configuration file, and add these lines:
が表示されるので、その下の3行をapache2.confに書き込む

merbアプリを作って動くか後日試します

2009年4月1日水曜日

Passengerのタイムアウトの時間を延ばす

デフォルトが2分らしい

RailsアプリをPassengerで動かすのはいいんですが、メモリ節約のため、2分間アイドル状態が続くとそのアプリを終了させてしまいます。んで、RedmineはRailsアプリでは結構重い方なんじゃないかと思いますので、アクセスする度に数秒間待たされるのは嫌なので、一時間くらいに設定しちゃおうということで設定しました。

RailsPoolIdleTime 3600

これでOKです。merbも軽量を謳ってますが、やっぱり最初の起動のもっさり間は否めないので、アクセスが少ないうちは設定しといた方がいいと思います。

その他のPassengerの設定項目

http://www.vividfire.net/knowledges/ruby-on-rails/phusion-passenger-config/がとても参考になります。こういうサイトがあるとほんと助かりますね。

2009年3月30日月曜日

Debian メール 設定

Exim4

外部にメールを送れるようにする―Exim4の設定

VM上のローカルなサーバなので適当に設定しました。本環境ではちゃんと調べて設定しないと...。

PHPでもSendメールでもEximでも外部にメールを送れないなーと思ってたら、設定してないだけだったw デビちゃんってツンデレね。

2009年3月29日日曜日

ApacheでMerbを動かす

Phusion Passengerが素晴らしい

Passengerといえば、RailsをApacheで動かせる元々mod_railsという名前のものです。Passenger2からはmerbも動くらしい!というわけで実験。この直前の記事は気まぐれでPassengerのアップデート(2.0.2から2.1.2へ)に失敗した時の解決方法です(笑

config.ruをmerbアプリのルートに置く

Deploying with Passengerに書いてある通りにすればいいだけですw Passenger2をインストールして、config.ruを用意すれば動きました。logディレクトリがないというエラーが出たけど、mkdirしただけですんなりOK!

Passenger2.1.2 CentOS5 インストール エラー

Error log(エラーログ):

### In ext/apache2:
g++ -shared SystemTime.o Utils.o Bucket.o Logging.o Configuration.o CachedFileStat.o Hooks.o mod_passenger.o -fPIC -o mod_passenger.so ../libboost_oxt.a -fPIC -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -I/usr/include/apr-1 -I/usr/include/apr-1 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I/usr/include/httpd -D_REENTRANT -D_GLIBCPP__PTHREADS -I/usr/local/include -fPIC -lapr-1 -laprutil-1 -lpthread  -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/libaprutil-1.so when searching for -laprutil-1
/usr/bin/ld: cannot find -laprutil-1
collect2: ld returned 1 exit status
rake aborted!
Command failed with status (1): [g++ -shared SystemTime.o Utils.o Bucket.o ...]
/usr/local/lib/ruby/gems/1.8/gems/passenger-2.1.2/Rakefile:157
(See full trace by running task with --trace)

--------------------------------------------
It looks like something went wrong

Please read our Users guide for troubleshooting tips:

   /usr/local/lib/ruby/gems/1.8/gems/passenger-2.1.2/doc/Users guide.html

If that doesn't help, please use our support facilities at:

   http://www.modrails.com/

We'll do our best to help you.

The solution is(解決方法は):

yum install e2fsprogs-devel apr-devel apr-util-devel expat-devel

なんとかインストールできました。冷や冷やしたよ(>_<)

2009年3月23日月曜日

超Ruby入門

読む価値がないほどのサンプル

郵便番号検証。オレオレ検証クラス

PHP5の例

class OreValid
{
  static public function isZip($zip)
  {
    return preg_match('/^\d{3}-\d{4}$/', $zip) > 0 ? true : false;
  }
}

Rubyの例

class OreValid
  def self.zip?(zip)
    (zip =~ /^\d{3}-\d{4}$/) != nil ? true : false
  end
end

2009年3月20日金曜日

Ruby1.9.1p0のインストール

1.8と同居のために--prefixを使用

#Mac OS Xにはwgetがないので
curl -o ruby-1.9.1-p0.tar.gz -L ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz
tar zxf ruby-1.9.1-p0.tar.gz
cd ruby-1.9.1-p0
./configure --prefix=/usr/local/ruby1.9.1
make -j3
sudo make install
毎回フルパス指定はめんどいので...
vim ~/.bash_profile
alias ruby191="/usr/local/ruby1.9.1/bin/ruby"
alias gem191="/usr/local/ruby1.9.1/bin/gem"
alias irb191="/usr/local/ruby1.9.1/bin/irb"
:wq
source ~/.bash_profile

ruby191 -v # ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-darwin9.6.0]

makeの時に-jN(Nは数字)のオプションを入れると並列処理でコンパイルが速くなります

make testでfailedが1つありました。エラーも1つありました(><)

※責任は負いかねます。自己責任でどうぞ

やりたかったRuby1.9がこれでMacBookでも遊べるようになる!Merbいれてみよ〜 DataMapperも1.9compatibleだっけ?

merbインストール失敗

Dopin:ruby-1.9.1-p0 Dopin$ sudo /usr/local/ruby1.9.1/bin/gem install merb --no-ri --no-rdoc
Building native extensions.  This could take a while...
Building native extensions.  This could take a while...
Building native extensions.  This could take a while...
ERROR:  Error installing merb:
 ERROR: Failed to build gem native extension.

/usr/local/ruby1.9.1/bin/ruby extconf.rb install merb --no-ri --no-rdoc
creating Makefile

make
gcc -I. -I/usr/local/ruby1.9.1/include/ruby-1.9.1/i386-darwin9.6.0 -I/usr/local/ruby1.9.1/include/ruby-1.9.1/ruby/backward -I/usr/local/ruby1.9.1/include/ruby-1.9.1 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -fno-common  -O2 -g -Wall -Wno-parentheses -pipe -fno-common -Wall  -o parser.o -c parser.c
parser.rl:2:16: error: re.h: No such file or directory
In file included from parser.rl:3:
/usr/local/ruby1.9.1/include/ruby-1.9.1/ruby/backward/st.h:2:2: warning: #warning use "ruby/st.h" instead of bare "st.h"
parser.rl: In function ‘cParser_initialize’:
parser.rl:499: error: ‘struct RHash’ has no member named ‘tbl’
parser.rl:511: error: ‘struct RHash’ has no member named ‘tbl’
parser.rl:518: error: ‘struct RHash’ has no member named ‘tbl’
make: *** [parser.o] Error 1


Gem files will remain installed in /usr/local/ruby1.9.1/lib/ruby/gems/1.9.1/gems/json-1.1.3 for inspection.
Results logged to /usr/local/ruby1.9.1/lib/ruby/gems/1.9.1/gems/json-1.1.3/ext/json/ext/parser/gem_make.out

Help me!(T_T)

2009年3月2日月曜日

SSL比較

大手6社(1年間)

上記のは携帯対応のSSL証明書です。携帯対応非対応で個人向けだと思うのは、年間3200円からのRapidSSL。まずはこれで走らせて、うまく軌道に乗ればいっそのことEVSSL証明書を取っちゃうのが夢ですね。アドレスバーが緑色。逆に毒っぽいような気がしなくもない。

他にSSLの大手ってありましたっけ??

VeriSignのグローバルサーバIDとセキュアサーバIDの違い

  • グローバルサーバIDは128ビット以下の暗号化通信を128ビットに自動的に引き上げるSGC機能がある
  • セキュアサーバIDにはSGCがない

2009年2月17日火曜日

RedmineのWikiの記法

Textileのサイトに載ってます

Textile Reference

テーブルのthを使いたいときとか、Redmineのヘルプには書いてないけど、Textileにはその機能はあるので使えます。Redmineヘルプからリンクされてるけどね!さぁリズムに乗って開発です!(最近この言葉聞かないけど)

2009年2月16日月曜日

PHPのユニットテスト DocTest

PHP 5.1.4以降なら使えます

PHP3やPHP4じゃ使えないのが、だんだん当たり前になってきてますね。

コメントにテストを書き込むのがDocTest

#true(#f(000-0000-0000))みたいな感じのをテストしたいクラスのメソッドの上に書くだけというシンプルなもの。メリットは手軽だしコメントの部分でどんなテストをしているかがわかる。デメリットはコメント部分が長くなり可読性が下がる。簡単なテストはDocTestで、あとは他のと併用して使えばいいと思います。

おすすめサイト

やっぱりPHPProが分かりやすいです。第7回 DocTestを使ってUnitTestをやってみよう (その1)

2009年2月12日木曜日

PHP 機種依存文字 EUC-JP UTF-8 変換 文字化け

eucJP-winにしてみな

ローマ数字とかが文字化けするからeucJP-winで変換をかけてみて

$_GETや$_POSTの場合

$_POSTの中身を何もせずに吐き出した状態ですでに文字コードの変換処理がされている場合(文字化けする)、PHPの設定でmbstring.internal_encodingがEUC-JPで設定されてないか、mbstring.encoding_translationがONになっていないかを確認。これらの設定はini_set関数で設定しても反映されないので、.htaccessで

php_value mbstring.encoding_translation "off"
のように書く必要があります。

UTF-8 → EUC-JP?

JavaScriptでURLエンコードするとUnicodeとしてエンコードされるので、少し古い環境でPHPを実行している場合、内部エンコードがEUC-JPを使っているのはよくあるケースなので、これは知っておいたほうがいいですよ!

2009年1月28日水曜日

PHP mb_convert_encodingを再帰的にしてみた僕は素敵的みたいな!

こんな感じ

/**
 * 文字コード変換を再帰的に行う関数 mb_convert_encodingの拡張
 * @param mixed $array 変換する配列または文字列
 * @param $to_encoding 変換後の文字エンコーディング
 * @param $from_encoding  変換前の文字エンコーディング名を指定します。 これは、配列またはカンマ区切りの文字列とすることが可能です。 from_encoding  を指定しなかった場合は、内部文字エンコーディングを使用します。"auto" を指定すると、 "ASCII,JIS,UTF-8,EUC-JP,SJIS" に展開されます
 * @return mixed 文字コード変換した後の配列または文字列を返します
 */
function mb_convert_encoding_recursive( $array, $to_encoding, $from_encoding ){
 if (!is_array($array) ) return mb_convert_encoding($array, $to_encoding, $from_encoding);
 $result = array();
 foreach($array as $k => $v){
  if( is_array($v) ) $result[$k] = mb_convert_encoding_recursive($v, $to_encoding, $from_encoding);
  else $result[$k] = mb_convert_encoding($v, $to_encoding, $from_encoding);
 }
 return $result;
}

ちゃんとテストしてません。ツッコミ歓迎です。

mb_convert_variablesがあったやないか!

ま、再帰処理を書いてみたかっただけだし〜!(笑)mb_convert_variables

2009年1月23日金曜日

No such file or directory - /nonexistent

Passengerでそんなエラーが出た

原因は実行してるRailsのソースのオーナーがrootだったからみたい。rootとnobodyはだめなんだって!だからchownで全部apacheを所有者にしたらできました