blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

CakePHP2のFormHelperで作成したinput要素をjQueryで指定する方法

CakePHP2のFormHelperでフォームを作成すると、例えば

<?php
echo $this->Form->create('Model');
echo $this->Form->text('text');
echo $this->Form->end();

から

<form action="/" id="ModelIndexForm" method="post" accept-charset="utf-8">
  <div style="display:none;"><input type="hidden" name="_method" value="POST"/></div>
  <input name="data[Model][text]" type="text" id="ModelText"/>
</form>

というHTMLが出力されます。

と、書いていて気づいたのですが、ヘルパーがidを勝手につけてくれるんですね・・・
name属性で指定する方法を書こうと思ったのですが・・・

id属性が付いているので、jQueryでは$('#ModelText')といった感じで、このinput要素を指定できます、はい。

もし、宗教上の理由などでidを指定できない場合は

$("[name=data\\[Model\\]\\[text\\]]")

で、指定できます。
[]をバックスラッシュ二つでエスケイプするのがミソです。

Amazon RDSのMySQLインスタンスでJSTの時刻を使う方法

RDSのMySQLインスタンスタイムゾーンの設定をすることができず、UTC固定です。 AWSの管理上の都合らしいです。

UPDATE `table_name` SET `dt_column`=NOW() WHERE `id`=1;

といったようなクエリを実行すれば、dt_columnフィールドにはUTCの時刻が入ります。

日本時間を登録するにはどうすれば良いか

ADDDATE(), ADDTIME()等の関数を使う

例えば

UPDATE `table_name` SET `dt_column`=ADDTIME(NOW(), '09:00:00') WHERE `id`=1;
UPDATE `table_name` SET `dt_column`=ADDDATE(NOW(), INTERVAL 9 HOUR) WHERE `id`=1;
UPDATE `table_name` SET `dt_column`=NOW() + INTERVAL 9 HOUR WHERE `id`=1;

アプリサーバの時刻を使用する(アプリサーバのタイムゾーンが正しく設定されている前提で)

例えばPHPなら

<?php
$datetime = date('Y-m-d H:i:s');
$sql = "UPDATE `table_name` SET `dt_column`='{$datetime}' WHERE `id`=1 ";

セッションのtime_zone変数の値を変える

MySQLのtime_zone変数はGLOBALスコープのものとSESSIONスコープのものがあり、SESSIONスコープのものであればユーザ側で変更することができます。

MySQL [(none)]> SELECT @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| UTC                 |
+---------------------+
1 row in set (0.00 sec)

MySQL [(none)]> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2013-09-25 02:59:44 |
+---------------------+
1 row in set (0.04 sec)

MySQL [(none)]> SET SESSION time_zone = 'Asia/Tokyo';
Query OK, 0 rows affected (0.10 sec)

MySQL [(none)]> SELECT @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| Asia/Tokyo          |
+---------------------+
1 row in set (0.00 sec)

MySQL [(none)]> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2013-09-25 12:00:42 |
+---------------------+
1 row in set (0.00 sec)

アプリ側でサーバ接続直後に SET SESSION time_zone = 'Asia/Tokyo'; を実行するか、サーバ側でストアドプロシージャを作成し、クライアントからの接続があった時に自動で実行するようにセットしておけば、DMLを書き換えること無く対応ができる。

ストアドプロシージャを使う方法はこちらが参考になります。 http://techfun.cc/aws/aws-rds-timezone.html

<th>や<td>にpositionの指定はできません

htmlの仕様上、<th>や<td>にpositionの指定はできません。

例えば、

<td style="position: relative;>
    <span style="top: 10px; right: 10px; position: absolute;">あ</span>
</td>

と書いた場合、「あ」は<td&td;の右上から10pxのところに表示されません、htmlの仕様では。

ところが多くのWebkitなブラウザやTridentなブラウザではtdの右上から10pxのところに表示されます。それは独自実装によるものであり、Web標準ではありません。

実際、Firefoxでは<td>にpositionを付けても効きません。

ではどうすれば良いのか

<td>
    <div style="position: relative;">
        <span style="top: 10px; right: 10px; position: absolute;">あ</span>
    </div>
</td>

と、いうように、<td>に<div>を内包して、その<div>にpositionを付ければ良いです。

Restricted Words (出題者 @cielavenir 氏) 反省会 #codeiq #q431

CodeIQにて出題されていた「普通じゃないHello World」の期限が過ぎ、
問題及び解答の公開が解禁されましたので、私の解答を公開します。

課題(一部抜粋)

標準出力に
Hello World
と出力するプログラムを作成して下さい。
ただし、数値・文字・文字列リテラルを解答に含めることはできません。

CodeIQ 問題ページ
出題者 @cielavenir 氏の解答

私の回答(PHP 5.3)

<?php
class Hello {
    public function world() {
        return __CLASS__ . $this->space() . ucwords(__FUNCTION__);
    }
    private function space() {
        return chr(PHP_MINOR_VERSION . PHP_MAJOR_VERSION - PHP_MINOR_VERSION);
    }
}
$hello = new Hello;
echo $hello->world();

私の回答の解説

クラス名の入る定数__CLASS__と関数名の入る__FUNCTION__を使用して"Hello"と"World"という文字列を作成しました。
(ちなみに__METHOD__という定数も存在しますが、この定数には"ClassName::methodName()"というような値が入ります)

残す半角スペースのASCIIコードは0x20、つまり32という数値を得られれば私の勝ち・・・
運の良いことに出題者の採点環境はPHP5.3で、PHP_MINOR_VERSION(この環境では3)及びPHP_MAJOR_VERSION(この環境では5)を使用して簡単に32を作ることができました。

この解答で「評価5」をいただきました。(5点満点?)

反省点

リテラル禁止」という条件だったので定数を使用しました。
が、定数使用可だと$one = (int)TRUE;で数値が得られてしまうわけで、
それでは全く面白みがないなと今にして思ます。
定数を使用したことについて反省

こういう問題は面白くてよいですね。
また、出題者の方からフィードバックをいただけたのが嬉しかったです。

スマートフォン向けダム検索サイト ダムNavi(仮) 公開

本日、ダムNavi(仮)を公開しました。
http://damnavi.oh-sky.net/

ダムNavi(仮)とは

今、自分の居る場所から近いダムを検索できる、スマートフォン向けWebアプリです。
Androidネイティブアプリとして作るつもりでしたが、諸事情により妥協してWebアプリとして公開しました。

データの増強やネイティブアプリ化は、追って進めていく予定です。

動作確認環境

  • P-07D(android4.0.3)
  • P-01D(android2.3.4)

todo

  • データの登録
    • 登録件数増加
    • 登録項目の増加(型式・目的等)
  • 検索指標の追加
    • 名前
    • 水系・河川
    • 型式・目的
  • スマホネイティブアプリ化

社内勉強会 Gitで後戻りする方法

Sep/11/2013の社内勉強会で使用した、git checkout -- や git reset についての説明資料。

これらのコマンドは何となく使ってはいたけど、資料を作成するにあたって改めてちゃんと調べることで、HEAD/インデックス/ワーキングツリー等について頭の中を整理できてよかった。

JavaScriptのDateオブジェクト ブラウザによる動作の違い

GoogleChrome 28

 hoge = new Date('2013-9-4');
 Wed Sep 04 2013 00:00:00 GMT+0900 (JST)

 hoge = new Date(2013,8,4);
 Wed Sep 04 2013 00:00:00 GMT+0900 (JST)

Firefox 23

 hoge = new Date('2013-9-4');
 Invalid Date

 hoge = new Date(2013,8,4);
 Wed Sep 04 2013 00:00:00 GMT+0900