<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/ME2.2.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Astrodeo</title>
	<link>http://astrodeo.com/blog</link>
	<description>WordPress ME 2.2 - Capriccioso</description>
	<pubDate>Thu, 02 Jul 2009 11:09:27 +0900</pubDate>
	<generator>http://wordpress.org/?v=ME2.2.3</generator>
	<language>ja</language>
			<item>
		<title>/の意味</title>
		<link>http://astrodeo.com/blog/archives/213</link>
		<comments>http://astrodeo.com/blog/archives/213#comments</comments>
		<pubDate>Thu, 02 Jul 2009 20:08:25 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/213</guid>
		<description><![CDATA[今まであまり意識したことなかったんですけど、ホームページのアドレスって一番最後にスラッシュ『/』がついている場合とついていない場合があるじゃないですか。


http://astrodeo.com/blog

http://astrodeo.com/blog/


両者に違いなんてない、ていうか別に一番最後にスラッシュをつける意味なんてないんじゃないのとか思ってたんですけど、そんなことはなかったんですね。
末尾にスラッシュをつけるのは、それがディレクトリであるという認識になるみたいですね。だから例えばblogというディレクトリの下にindex.htmlというファイルがある場合、上記のように・・・blog/と書くことで、サーバ側も「ああ、このblogはディレクトリだな。じゃあその下にあるindex.htmlでも読み込みに行ってやるか、しゃあねえ」みたいなことになるわけですね。
いやはや、自分でプログラムを作って動かす側に回ると、いろんなことに気づかされますね。ただ適当にネットサーフィンしてニコニコ動画を見ていれば良かった頃なんて、スラッシュに何の注意も払わなかったのに。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/213/feed</wfw:commentRss>
		</item>
		<item>
		<title>Security.Saltの設定</title>
		<link>http://astrodeo.com/blog/archives/212</link>
		<comments>http://astrodeo.com/blog/archives/212#comments</comments>
		<pubDate>Wed, 01 Jul 2009 13:38:44 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/212</guid>
		<description><![CDATA[新しいプロジェクトをやるたびについつい忘れちゃうので、次こそは忘れないぞという思いを込めてメモ。
プログラムができた～と思ってサーバー上でテストなどをしてみると、僕の場合、必ず最初にSecurity.Saltがどうたらこうたらというエラーが出てしまう。これはapp/config/の中にあるcore.phpというファイルを見ると分かるのですが、150行目くらいにこんなことが書いてある。


Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');


まあ、実をいうとこれが何のことだかあまりよく理解はしていないのだけど、要はこの値をユニークなものに変えやがれよこのやろうってなことをエラーは言っているわけですね。
というわけで、このDYなんちゃらかんちゃらってやつを適当なものに変えればOKと。
このSecurity.Saltというやつですが、サーバで運用とかしているものにまた別の値に変えちゃったりすると何やらとんでもないことになるらしいので、注意が必要だそうです。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/212/feed</wfw:commentRss>
		</item>
		<item>
		<title>controllerでelementsの中にあるファイルを呼ぶ</title>
		<link>http://astrodeo.com/blog/archives/211</link>
		<comments>http://astrodeo.com/blog/archives/211#comments</comments>
		<pubDate>Thu, 25 Jun 2009 12:06:44 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/211</guid>
		<description><![CDATA[

$this-&#62;render('/elements/calender');


こういう書き方をすると、elementsの中にあるテンプレートをレンダリングしてくれる。
今日、ポップアップウインドウでカレンダーを表示させる機能を作っていたんですけど、カレンダーのテンプレートはどのページから呼んでも同じだから、こんなようなことができないかなと思って調べてみたら、やっぱりありました。そりゃあるよね。これくらいの機能なら。
別に分かりにくい機能とかではないけれど、これから先もきっとこいつの出番は来るし、最近老化が著しい我が頭脳だとそのときにうっかり忘れている可能性もあるので、メモ。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/211/feed</wfw:commentRss>
		</item>
		<item>
		<title>utf-8とutf8</title>
		<link>http://astrodeo.com/blog/archives/210</link>
		<comments>http://astrodeo.com/blog/archives/210#comments</comments>
		<pubDate>Wed, 24 Jun 2009 15:04:30 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/210</guid>
		<description><![CDATA[通常、DBの設計の際には、照合順序をUTF-8にしておけば何の問題もないと思っていたのだが、CPIというレンタルサーバのDBを扱う際、照合順序も全部ちゃんとUTF-8にしているのに、文字化けが直らないという問題が発生した。原因が全く分からずに、かなりの時間、悪戦苦闘した。正確にいうと、悪戦苦闘していたのは僕じゃなくて先輩プログラマーのヅヤさんがですけど。
で、原因を調べているうちに我流天性さんというサイトに行き当たり、その解決法も書いてあったので参考にさせてもらった。
どうやらあそこは、文字コードのデフォルトの設定がEUC-JPになっているようなので、これをUTF-8に直す必要があるらしい。
それにはまず、CPIのコントロールパネルにあるお客様情報のPHP iniの設定情報の中から、自分の使っているPHPのバージョンと同じphp.iniの情報を表示させ、それをまるごとテキストエディタにコピーする。コピーしたテキストを追っていくとのず～っと下の方に（1170行目あたりかな）こんなようなことが書いてある部分がある。


mbstring.internal_encoding = EUC-JP

mbstring.http_input = auto

mbstring.http_output = pass
 
 mbstring.encoding_translation = On
 
 mbstring.detect_order = auto


これを以下のように書き換える。


mbstring.internal_encoding = UTF-8

mbstring.http_input = auto

mbstring.encoding_translation = Off

mbstring.http_output = pass

mbstring.detect_order = auto


これをphp.iniという名前で保存して、FTPでアップロードする。場所は我流天性さんに倣って、secureというディレクトリの中に一つ適当なディレクトリを作成して、そこにアップ。
アップできたら、今度は.htaccessというファイルを作成して、以下の文を書く。
[source]
suPHP_ConfigPath /usr/home/ユーザーID/secure/作成したディレクトリ/
[/source]
CakePHPを使っている場合は、webrootディレクトリの中にすでに.htaccessがあるので、そこにでも書き加えてやればいい。
・・・と、こんな感じで文字化け解消の手続きをしたわけなんですが、しかし僕の場合は一向に文字化けが解決しなかった。もともとCPIとかいうレンタルサーバのことはよく分からない上、これ以上の解決策も全く知らなかったので、悪戦苦闘する以外にはどうにもならなかった。
そして最終的に出た結論。
CakePHPではデータベースへの接続を行う際、database.phpにいろいろと書くわけですが


class DATABASE_DONFIG {

      var $default = array(

          'driver' =&#62; 'mysql';

          ・・・中略・・・

          'encoding' =&#62; 'utf-8'　←ここ

}


このencodingの部分。一見何の問題もないように見えるけど、実はハイフンを入れて書くのはNGらしい。正しくはutf8と表記しなければならない。初めて知ったよ、そんなこと。
ここを直したら、文字化けも無事に解消しました。でもそのかわりにヅヤ先輩の仕事時間を大幅に奪ってしまいました。さーせん。
しかし、今まではutf-8と書いても文字化けせずに普通に動作していたのだけど、それはどうしてなんだろう。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/210/feed</wfw:commentRss>
		</item>
		<item>
		<title>フォームヘルパーのラジオボタンについて</title>
		<link>http://astrodeo.com/blog/archives/209</link>
		<comments>http://astrodeo.com/blog/archives/209#comments</comments>
		<pubDate>Tue, 23 Jun 2009 12:46:38 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/209</guid>
		<description><![CDATA[つい先日、フォームヘルパーを使ってチェックボックスを作ったのだけど、どうやらlabelの指定ができないっぽく、書き方としてはこんな感じになってしまった。


 &#60;?php echo $form-&#62;checkbox('check') ?&#62;&#60;label for="Check"&#62;チェックボックス&#60;/label&#62;


なので、ラジオボタンも同じ感じなのかなぁと思っていたら、実はそんなことなかったんですね。


&#60;?php echo $form-&#62;radio('radio', array('1' =&#62; 'option1', '2' =&#62; 'option2'), array('label' =&#62; true, 'value' =&#62; '1')) ?&#62;


みたいに書けば、勝手にlabelを吐き出してくれるようだ。&#8217;value&#8217; =&#62; &#8216;1&#8242;ってのは、初期状態ではvalueが1のボタン（上記の例でいうとoption1）にチェックをつけるようにしている。
自分の中ではチェックボックスとラジオボタンは選択できる数が一つか複数かくらいの違いしかなく、あとの書き方は全て同じようにできているとばかり思っていたから、これはちょい盲点だった。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/209/feed</wfw:commentRss>
		</item>
		<item>
		<title>今日は何者かの手によって情報が改ざんされてしまったから特に役に立つ記事ではない</title>
		<link>http://astrodeo.com/blog/archives/207</link>
		<comments>http://astrodeo.com/blog/archives/207#comments</comments>
		<pubDate>Fri, 19 Jun 2009 20:10:24 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/207</guid>
		<description><![CDATA[僕はポケットリファレンスシリーズが使い勝手がいいと思っているので、仕事中にもPHPやらCakePHPやらjavascriptやらのポケットリファレンスを何かと開いているのだけど、javascriptのポケットリファレンスを読んでいたら、486ページにこんなことが書いてあった。


sosObj.setAttributeNS("suzumiya", "haruhi",17)

sosObjのsuzumiya:haruhi属性の値を17にする。


ちなみに486ページは属性の作成や追加についての説明のページなのだけど……suzumiya haruhiって……しかもsosObjとまできたもんだ。
この手の本はその手の遊びとか入れるようなことはしないって勝手に思っていたのですが、たまには著者も遊んでみたくなるのかな。それとも周囲の環境情報を都合のいいように改ざんされてしまったのかな。彼女の力によって。
気になる方はこちらからどぞ。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/207/feed</wfw:commentRss>
		</item>
		<item>
		<title>昨日の続き＋背景の透明化</title>
		<link>http://astrodeo.com/blog/archives/205</link>
		<comments>http://astrodeo.com/blog/archives/205#comments</comments>
		<pubDate>Thu, 18 Jun 2009 10:20:21 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/205</guid>
		<description><![CDATA[embed要素のwidthとかheightがjavascriptでうまく書き換えられないとか言ってたけど、そんなことなかった。
 setAttributeってやつを使って属性を変更してやれば、ちゃんとできる。


var tags = document.getElementsByTagName('embed');

for(var i = 0; i &#60; tags.length; i++) {

     var tag = tags[i];

     tag.setAttribute('width' , 335);

     tag.setAttribute('height', 275);

}


document.getElementsByTagName(&#8217;tag&#8217;)はタグ情報を配列で返してくるから、変数tagsは配列になっている。tags.lengthで配列の数を取得できる。ページ内に仮にembedタグが4つあればtags.lengthは当然4になる。
たぶん、自分はここが分かっていなかったから


var tag = document.getElementsByTagName('embed');

tag.width = 335;


みたいなことをやろうとして失敗していたのだと思う。
追記
Flashムービーの背景を透明化するにはembed要素にwmode=&#8221;transparent&#8221;という属性を付加してやればよい。あとobject要素内にparam要素も追加する必要がある。後者については今回は省略させてもらうとして、前者のembed要素にwmode属性を追加するときの個人的な注意点。


※上記のfor文の中に↓この1行が追加されたと思ってください。

tag.setAttribute('wmode', 'transparent');


属性を付加するだけならこれでOKなのだけど、xhtmlにおいて、閉じタグがないような場合、半角スペースとスラッシュをタグの中に書くというルールがある。
たとえば上のようなやり方でwmode属性を追加した場合、Firebugとかでソースを確認すると、こんな感じになる。


&#60;embed src= ・・・中略・・・ wmode="transparent"/&#62;


スラッシュの前に半角スペースが入っていない。これだと残念ながら背景は透明化されない。正規表現を使った置換でも何でもいいけど、とりあえずこの部分に半角スペースを入れないといけないようだ。ちなみに僕はPHPのereg_replace関数を使った。
正直、この半角スペースは入れなきゃいけないものだなんてこと知らなくて、どうして背景が透明化されないのか、昨日2時間くらい悩んだ。でも無事に解決して良かったっす。
問題の解決にあたり、こちらのサイトを参考にさせていただきました。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/205/feed</wfw:commentRss>
		</item>
		<item>
		<title>動画のリサイズ</title>
		<link>http://astrodeo.com/blog/archives/204</link>
		<comments>http://astrodeo.com/blog/archives/204#comments</comments>
		<pubDate>Wed, 17 Jun 2009 10:16:34 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/204</guid>
		<description><![CDATA[自分のサイトに動画を埋め込みたいって思ったときに、例えばyoutubeの動画を埋め込む場合、動画の右側にある埋め込み用のタグをそのままコピペすれば埋め込める。
このとき、youtubeだったら動画のサイズはwidthが425でheightが344になっている。これをもう少し小さいサイズで自分のサイトに埋め込みたいとなったら、てっとり早いのは自分でこのサイズを書き換えてDBに保存するなりなんなりすればいいのだろうけど、ユーザビリティを考えると、いつでもそうするってわけにもいかない。
javascriptで、ページを読み込んだ瞬間にタグの情報を持ってきてサイズを書き換えちゃえばいいじゃんって思ったのだけど、これがどうもうまくいかず、僕がやった限りではembedタグの中身を書き換えることができなかった。
なので、とりあえずはPHPの正規表現を使って、425と344があったらそれぞれリサイズしたい数値に書き換えるってな感じで今は対応しているのだけど、でもこれ、このサイズじゃないとリサイズできない。youtubeはこのサイズで統一されている（たぶん）から、youtubeの動画しか埋め込まないって制限をかけておくのであれば何とかなるけども、しかしそれじゃあね……。
javascriptでできるけど単純に僕の書いたコードが間違っていただけなのか、何か別の方法を使わないとリサイズできないのか……現在絶賛謎追究中です。
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/204/feed</wfw:commentRss>
		</item>
		<item>
		<title>チェックボックスの値をUPDATEしたい</title>
		<link>http://astrodeo.com/blog/archives/203</link>
		<comments>http://astrodeo.com/blog/archives/203#comments</comments>
		<pubDate>Tue, 16 Jun 2009 09:49:04 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/203</guid>
		<description><![CDATA[フォームヘルパーのチェックボックスメソッドを使うと、言うまでもなくチェックボックスをページ内に設置することができる。
cakeのヘルパーは何かと便利で、余計なことをしなければ勝手に値を保持してくれたり自動的にhidden要素を作ってくれたりするのだけど、この自動的にhidden要素を作ってくれるおかげで、新規登録のときは問題なくても、編集のときにうまいことアップデートが行われなくてちょっと困った。
SQL文を見ても、編集画面でチェックボックスの欄に何の手も加えないでアップデートを行った場合、一度DELETEを実行して、全く同じ値をINSERTしているような結果になっていた。一意な値であるidだけが編集のたびにインクリメントされていく感じ。
例えばHABTMでProgramとCategoryというテーブルが結びついていたとして、一つのプログラムに対しいくつかのカテゴリをチェックボックスにチェックを入れて登録するようなサイトがあったとする。
HABTM用のテーブル（CategoriesProgram）に、idの他にprogram_idとcategory_idの二つしかない場合なら、正直DELETEとINSERTを繰り返すのでもたいして問題はない。ただ、もしもそれ以外のカラムがあった場合、そしてそれは登録画面や編集画面から入力する要素ではなかった場合、UPDATEじゃないと値がクリアされてしまう。
具体的なことを言うと、今回の僕はカテゴリごとにプログラムの並び順を指定するsortっていうカラムをCategoriesProgramテーブルに足しておいたのだけど、編集を行うと常にこのsortがデフォルト値である０になってしまうから、都合が悪いなぁというお話。livedoorブログなんかでもサイドバーに表示する項目の並び順を自分で指定したりすることができるのだけど、イメージとしてはあんな感じ。
通常は、編集画面などではhidden要素でidの値を渡してやったりすればUPDATEが行われるのだけど、チェックボックスに関してはなぜかこれがうまくいかなくて、まあ僕の書き方が間違っていただけかもしれないけど、とりあえず僕の中ではUPDATEはできねえっていう結論に達したので、少々回りくどい方法を取った。


// CategoriesProgramテーブルからprogram_idが$idの値であるものを全部取ってくる。

$param = array('conditions' =&#62; array('program_id' =&#62; $id));

$categories = $this-&#62;CategoriesProgram-&#62;find('all', $param);

// データをいったんunsetする。

（$this-&#62;data['Category']['Category']には全チェックボックスの値が配列で入っている）

$data = $this-&#62;data['Category']['Category'];

unset($this-&#62;data['Category']['Category']);

// すでにデータがあるものは入力しない

foreach($data as $val) {

     $flg = '';

     if($val != 0) {

          foreach($categories as $category) {

               if($category['CategoriesProgram']['category_id'] == $val) {

                    $flg = true;

               }

          }

          if(!flg) {

               $this-&#62;data['Category']['Category'][] = $val;

          }

     }

}


いきなりここだけ書いても分かりづらいかもしれないけど、要はデータを登録する前に送られてきたデータを一度unsetして、入力したいデータだけを再度$this-&#62;data[&#8217;Category&#8217;][&#8217;Category&#8217;]に入れ直しているわけです。foreach文の中でやっているのは、DBの中にあるデータと入力フォームから送られてきたデータを比較して、同じだったら$this-&#62;dataには値を入れないようにしているということ。UPDATEがうまくできないのなら、いっそのこと何もするなよ的なことです。新しいデータに関してだけINSERTを行っておくれよってことですね。
これの他に、チェックのついていたものが外された場合に、DBからその値をDELETEするプログラムも書いておく必要があるけど、それはここでは省略。
しかし、他のフォームは普通にUPDATEができるのにチェックボックスだけできないってこともないと思うので、実際はこんなことをやらなくてもいいような気はするんですが……何がいけなかったのかな？
]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/203/feed</wfw:commentRss>
		</item>
		<item>
		<title>renderElementで使いたい変数があったら</title>
		<link>http://astrodeo.com/blog/archives/202</link>
		<comments>http://astrodeo.com/blog/archives/202#comments</comments>
		<pubDate>Fri, 12 Jun 2009 11:05:21 +0900</pubDate>
		<dc:creator>macchi</dc:creator>
		
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://astrodeo.com/blog/archives/202</guid>
		<description><![CDATA[ちょっと前に、renderElementを使うとelementsフォルダに入っているファイルをview内で読み込めるようなことを書いた。それについて一つ知ったことがあったので、メモ。


// index.ctp

&#60;?php foreach($data as $val) : ?&#62;

     &#60;?php echo $this-&#62;renderElement('program') ?&#62;

&#60;?php endforeach ?&#62;

// program.ctp

&#60;?php echo $val ?&#62;


例えばこんな感じでindex.ctpというファイルと、elementsフォルダの中にprogram.ctpというファイルがあったとする。
僕はこう書けばforeachの$valがprogram.ctp内でもそのまま使えるのかと思っていたのだけど、どうやらそれはダメらしい。controllerでsetした変数ならそのまま使えるけれど、上のような場合は、renderElementの第２引数にエレメントで使う変数を定義しておく必要がある。


// index.ctp

&#60;?php foreach($data as $val) : ?&#62;

     &#60;?php echo $this-&#62;renderElement('program', array('val' =&#62; $val) ?&#62;

&#60;?php endforeach ?&#62;

// program.ctp

&#60;?php echo $val ?&#62;


これでOK。今はarrayの中身が両方ともvalになっているけど、別にこれはいつでも同じになるわけじゃない。要は↓こういうこと。


// index.ctp

&#60;?php foreach($data as $val1) : ?&#62;

     &#60;?php echo $this-&#62;renderElement('program', array('val2' =&#62; $val1) ?&#62;

&#60;?php endforeach ?&#62;

// program.ctp

&#60;?php echo $val2 ?&#62;


]]></description>
		<wfw:commentRss>http://astrodeo.com/blog/archives/202/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
