The Hit Listの使い方を日本語訳してみる
ショートカットとか書いてあるけど、英語だと分かりづらいので
忘れないように翻訳します。
和訳
- - 基本的な使い方
- ・Returnキーを押して、タスクを追加します
- ・'@'キーを押して、コンテキストを設定します
- ・'/'キーを押して、タグを追加します
- ・サブタスクの追加するには、Returnキーを押してタスクを追加し、タブキーを押します
- ・'T'キーを押して開始日を'本日'に設定します。タスクは'Today list'に表示されます
- ・1〜9のキーを押して優先順位を設定します。0キーは解除
- ・スペースキーを押すと、タスクが完了になります
- ・'X'キーを押すとタスクをキャンセルし、Deleteキーで削除します
- ・w,a,s,dキーでタスクが移動します。w(上) a(左) s(下) d(右)
- ・カード表示では、1つのタスクに集中することができます。⌘-2でカードビューに切り替え、⌘-1でアウトラインビューに戻ります
- ・一度完了したタスクは'Archive'ボタンを押してタスクを非表示にすることができます
- - 高度な使い方
- ・コンテキストは'@'文字で始まるタグです
- ・スペースの後に'/'で文字列を囲むと、タグになります
- ・テキストをTheHitList(THL)に貼付けると、各行がタスクになります
- ・他のリストや他のタブにタスクをドラッグ&ドロップすることができます
- ・URLやファイルをTheHitListのドックアイコンにドラッグ&ドロップして素早くタスクを作る事ができます
- ・'B'キーを押すとタスクタイムを計測します
- ・アウトラインビューでは、viのカーソル移動でタスクが選択できます(j,k,h.l)またはEmacsスタイル(control-n,p,f,b)
- ・キーを離すことなく、他のリストやフォルダから選択する場合は'G'を押して'移動パネル'を使います。これはQuickSilverと同じように動作します。名前の一部だけを入力することもできますし、矢印キーを使って候補を選択することもできます。タグの入力には'/'の後にタグ名を入力します
- ・すぐにタスクを他のリストに移動するには'F'キーを押します。この機能は'移動パネル'と同じ使い方です
- ・タスクの開始日と終了日を素早く変更できるショートカットは、-,=, [, and].
- ・タブバーの空白エリアでダブルクリックして、新しいタブを作成することができます 参考になれば良いです。 間違ってたらごめんなさい。
ビューをXmlで出力したい場合の注意
$Model->findの結果をxml形式で出力したい場合
セットアップ
// routes.php Router::parseExtensions('xml');
~/:controller/:action.xmlにアクセスすると
/views/コントローラ名/xml/アクション名.ctpのviewが使われる。
コントローラ
// これがないとViewが見つからないエラーになる。 var $components = array('RequestHandler'); // アクション public function xmlTest() { // 通常通りにビューに渡したいデータをセットする $this->set('data', $this->TestModel->find('all')); }
ビューテンプレート
/views/layouts/xml/default.ctp
<?php header("content-type: text/xml"); ?> <?php echo $xml->header(); ?> <?php echo $content_for_layout; ?>
ビュー実装
<hoges> <?php echo $xml->serialize($data);?> </hoges>
var $components = array('RequestHandler');を忘れずに。
CakePHPにてGoogleMapにリアルタイムプロット!!! その3
pointsコントローラのセットアップ
コンソールにてbake
cake bake controller points
しまった、最初にbake allしておくべきだった。
コントローラ単体をbakeすると、scaffoldのみの実装になるので
まずは、GoogleMapを表示してユーザーの位置を確認する為にindexメソッドを実装。
// points_controller.php function index($lat=130.709744, $lng=32.803303, $meters=5000) { $activeUsers = $this->Point->activeUsers($lat, $lng, $meters); $this->set('activeUsers', $activeUsers); }
pointsビューのセットアップ
ビューもbake
cake bake view points
index.ctpの実装
<?php echo $html->script('http://maps.google.co.jp/maps/api/js?sensor=false', false)?> <div id="mapArea"> <div id="mapcanvas" style="width:100%;height:600px;"></div> </div>
ここからjavascriptでindexに位置情報をプロットしていく
クライアントからの位置情報の通知があった場合はcakeで処理。
mapcanvasの動的書き換えはAjaxで。
詳細は次回で
CakePHPにてGoogleMapにリアルタイムプロット!!! その2
前回に引き続き、まずは一時DBの構造から
DBスキーマ
コマンドラインからDDLで生成
スキーマは以下のような感じに。
CREATE TABLE `points` (
`id` int(11) NOT NULL,
`uid` varchar(32) NOT NULL,
`latlng` geometry NOT NULL,
`created` datetime,
`modified` datetime,
PRIMARY KEY (`id`),
SPATIAL KEY `latlng`
) ENGINE=MyISAM
データベースエンジンはMyISAMでないと、SPATIAL INDEXが使えないので注意!
bakeコマンドでPointモデルを焼く。
モデルのvirtualFieldsを設定
var $virtualFields = array(
'longitude' => 'X(latlng)',
'latitude' => 'Y(latlng)'
);
これで、普通にCakeで$model->findした時にlongitude, latitudeが取得できる。
詳しくは、http://book.cakephp.org/ja/view/1608/Virtual-fieldsを参照。
Modelにメソッドを定義
ちなみに、今回は指定した範囲の検索を行いたいので、Pointモデルにメソッドを定義した。
const METER = 0.000009; // クラス内定数として定義するfunction activeUsers($lat, $lng, $meters = 10000) {
$r = $meters * self::METER;
$limit = 50; //とりあえず。$queryRet = $this->query("SELECT SQL_NO_CACHE uid, (Y(latlng)) AS Point__latitude ,(X(latlng)) AS Point__longitude
FROM points AS Point
WHERE MBRContains(
GeomFromText(
Concat('LineString(',
".$lng." + ".$r." , ' ',
".$lat." + ".$r." , ',',
".$lng." - ".$r." , ' ',
".$lat." - ".$r." , ')'
)
),
latlng
)
ORDER BY GLength(
GeomFromText(
CONCAT(
'LineString(".$lng." ".$lat.",',
X( `latlng` ) , ' ',
Y( `latlng` ) , ')'
)
)
) LIMIT ".$limit);return $queryRet;
}
Cake_logのSQLを見ると、virtualFieldsはModel__fieldでクエリを投げているようで、
この書式だと結果セットがきちんと、配列で取得できるみたい。
今回はとりあえずこの辺で。