Posts tagged HTML
イケア BRÄDA ラップトップサポート(膝上 PC ボード)購入
1IKEA | テーブル&デスク | コンピューター ワークステーション | BRÄDA | ラップトップサポート
[を] IKEA の膝上 PC ボードは良い! で紹介されていたイケアの PC ボードがすごく気になっていた。これは下の部分がビーズクッションになっていて、上の部分が PC を置きやすいように天板がついているクッションです。
昨日イケア港北にクリスマスツリーを返しに行ったので、そのツリー代の返金のギフトカードで PC ボードを買いました。昨年購入したもみの木のツリーをイケアに持っていくと代金1990円をギフトカードで返金してくれるというものです。ギフトカードの額とPC ボードの額が同じなのでちょうどよかった!
クッション系ものもなので1階のマーケットプレイスにおいてあるのだろうと思い、マーケットプレイスのクッションのところや事務系のものがあるところを探したのですが見つからない。イケアスタッフに聞いてみると2階のオフィス家具のところにおいてあるとのこと。ショートカットしつつ2階のオフィス家具のところに行き探すと、赤タグ(っていうのかな、セルフサービスで1階の倉庫みたなところから自分で商品を出すやつ)がついている。それほど大きなものでもないけど、そういう商品なんですね。。。ショートカットしつつもイケアを2周もしてしまいました。
購入を考えている方は注意してくださいね!
使い心地はいいですねー!いままでソファーで作業しているときは薄いクッションを足と PC の間に入れていたのですが、やはりフラットになると作業しやすいです。
左サイドに携帯電話を入れられるポケットもついています。私は携帯よりもペンやマウスなど入れようと思います。
iTunes ちょっと便利なショートカット
1iTunes を使用していて検索にカーソルを移動させるのにマウスを使用するのが面倒だったので Ctrl+F とかしてみたけどダメだったので、改めて調べてみたところ Ctrl+Alt+F で OK でした。
そこで iTunes のショートカットで便利そうなものをメモ代わりにリストアップしてみました。
- 選択した曲を再生
- Enter
- 選択した曲を再生/停止
- Space
- 早戻し・早送り
- Ctrl+Alt+← or Ctrl+Alt+→
- 前の曲へ・次の曲へ移動する
- ← or →
- ミニプレイヤに切り替え
- Ctrl+M
- 検索フィールドを選択
- Ctrl+Alt+F
- 音量を上げる・下げる
- ↑ or ↓
- ミュートする
- Ctrl+Alt+↓
- ブラウザの表示・非表示
- Ctrl+B
- iTunes ヘルプを開く
- Ctrl+?
- iTunes を終了する
- Ctrl+W
なにげにスペースで再生・停止が切り替えられるのが便利でした。
その他のショートカットは Ctrl+? でヘルプを開きショートカットのページを見ると詳しく載っています。
または、アップル – iTunes – Hot Tips – iTunesキーボードショートカット でも詳しく載っています。
12月に読んだ本
0先月、宣言(11月に読んだ本 )したように少し小説を読みました。
2冊のみですが、どちらも文庫本で700ページ前後なので読み応えはありました。「幻夜」は「白夜行 」の続編のようで白夜行に迫る面白さで読むのが止まりませんでした。
「最悪」は奥田英郎の最初の頃の作品なので、イラブ先生シリーズやサウスバウンドなどにはかないませんが、引き込まれる作品でした。
幻夜
最悪 (講談社文庫)
あなたが年収1000万円稼げない理由。―給料氷河期を勝ち残るキャリア・デザイン (幻冬舎新書 た 3-1)
【超】WORK HACKS!
起業家2.0―次世代ベンチャー9組の物語
効率が10倍アップする新・知的生産術―自分をグーグル化する方法
勝間さんの本はどれもはずれがなくていいですね。読んでいるだけでやる気が出てきます。(それだけで実践しないと意味ないですが)巻末のお勧め本がかなりいいです。これからの読書の参考にしていきます。早速、今月は「非常識な成功法則―お金と自由をもたらす8つの習慣」をリストを参考に読んでみました。
読みならがメモしたことをいくつかリストアップしておきます。
- 情報こそが現代の通貨である
- 資本主義の本質は賢くない人から賢い人へお金が移動する仕組み
- 情報の発信者になれば情報がラクに収集できるようになる
- 自分が得意なことに集中する
- Not To Do List を作成する
- まずは見返りを求めずに情報を発信し続ける
金融商品にだまされるな!
金持ちの床屋さん
非常識な成功法則―お金と自由をもたらす8つの習慣
レバレッジ人脈術
チーズはどこへ消えた?
ザ・マインドマップ
WEB+DB PRESS Vol.42
人を出し抜く速読術―要領よく生きてるヤツは知っている (凄ビジ・シリーズ 3)
キラー・リーディング 「仕事脳」が劇的に回り出す最強の読書法 (JBシリーズ)
CakePHP JQuery ヘルパー
3JQuery helper for CakePHP ( PQuery port ) at NGCoders
CakePHP から JQuery を簡単に使うことができます。
正確には PQuery ヘルパーかもしれません。PQuery は JQuery を PHP から簡単に使用するライブラリで PQuery ヘルパーと同じ開発者が開発しています。
参考:PQuery – PHP and JQuery at NGCoders
インストール
JQuery helper for CakePHP ( PQuery port ) at NGCoders から JQuery ヘルパーをダウンロードし、解凍した pquery.php を /app/views/helpers にコピーします。
そのほかに jquery.js ファイルも必要になります。こちらもダウンロードして /app/webroot/js にコピーします。
コントローラ
Pquery ヘルパーと Javascritp ヘルパーを使用します
var $helpers = array('Pquery', 'Javascript');
ビュー
jquery.js の読み込み
<?php echo $javascript->link('jquery.js'); ?>
使用例
トグルボタン
<div id='msg'>Message...</div> <?php echo $pquery->link_to_function('toggle', $pquery->toggle('#msg'));?>
フォームで送信された内容により HTML を更新
入力したテキストを /controller/action/ に GET で送信し、id=idtoupdate に受け取った HTML を表示する
<?php echo $pquery->form_remote_tag(array('url'=>'/controller/action/','update'=>'#idtoupdate'));?> <input type='text' name='field' /> <input type='submit' /> <div id='idtoupdate'></div>
pquery.php を見ると色々なメソッドがあります。使い方はソースを見ればすぐに分かると思います。
HTTP_Request を使用してファイルをアップロードする方法
1PEAR の HTTP_Request を使用してファイルをアップロードする方法です。
<form action='POST_URL' method='post' enctype='multipart/form-data'> <input type='text' name='title'> <textarea name='body'></textarea> <input type='file' name='upload_file'> <input type='submit'> </form>
上記のような HTML でファイルをアップロードする場合と同じような処理をするには、下記のように HTTP_Request を使用します。
// POST パラメータ $post_data = array( 'title' => $title, 'body' => $body, ); // アップロードパラメータ $upload_file = array( 'name' => 'file', 'path' => '/path/to/file', ); // アップロード $rs = http_send(POST_URL, $post_data, $upload_file); function http_send($url, $params, $upload_file=null) { $req = new HTTP_Request(); $req->setMethod(HTTP_REQUEST_METHOD_POST); foreach ($params as $key => $val) { $req->addPostData($key, $val); } $req->setURL($url); if ($upload_file) { $res = $req->addFile($upload_file["name"], $upload_file["path"]); if (PEAR::isError($res)) { echo $res->getMessage(); exit; } } if (!PEAR::isError($req->sendRequest())) { return $req->getResponseBody(); } else { return false; } }
phpPgAdmin でログインできない
0普段は MySQL ばかり使用しているのですが、PostgreSQL を使用する必要があり、phpPgAdmin を使うことにした。
開発用のサーバには phpPgAdmin がインストールされているが、ブラウザで閲覧できるようにはまだしていなかった。
Open Tech Press | phpPgAdmin:Web開発者向けのPostgresクライアントツール を参考に /usr/share/phpPgAdmin にインストールされている phpPgAdmin をブラウザでアクセス可能にした。
/etc/http/conf/httpd.conf に下記を追加
Alias /phppgadmin /usr/share/phppgadmin/ <DirectoryMatch /usr/share/phppgadmin/> Options +FollowSymLinks AllowOverride None order deny,allow deny from all allow from localhost </DirectoryMatch>
これでブラウザから http://example.com/phpPgAdmin/ でアクセスできるようになった。
しかし、PostgreSQL のユーザでログインしようとするとエラーになる。
これは シン石丸の電脳芸事ニッキ: debian 3.1へのphppgadminのインストール後の設定 を参考にして解決。
/etc/postgresql/pg_hba.conf に下記を追加
host all all 127.0.0.1 255.255.255.255 trust
これで無事 phpPgAdmin にログインできました。
CakePHP Security コンポーネントのまとめ
1CakePHP の Security コンポーネント の動作を調べたのでまとめておきます。
この Security コンポーネントをうまく使用すればクロスサイトリクエストフォージェリ(CSRF) を防ぐことができるでしょう。
トークンの使用
フォームにワンタイムトークンを実装する方法です。
コントローラの beforeFilter メソッドでトークンをチェックするアクションを指定
function beforeFilter() { $this->Security->requireAuth('login'); }
ビューのフォーム内にトークンを設定
<?php echo $html->formTag(); ?>
トークンが hidden 属性で生成される
トークンが一致しない場合
requireAuth で指定したアクションに POST でアクセスがあるとセションに保存したトークンとフォームから送られてきたトークンが一致するかチェックします。またそのほかにトークンの有効期間もチェックします。有効期間は CAKE_SECURITY の設定により違います。
CAKE_SECURITY | 有効期間 |
---|---|
high | 10分 |
medium | 100分 |
low | 300分 |
トークンが一致しないと SecurityComponent の blackHole メソッドが実行されます。このメソッドでは
header('HTTP/1.0 404 Not Found');
を出力して exit します。(画面は空白)
任意の処理を実行したい場合は blackHoleCallback でコールバック関数を指定します。
設定できるのは同じコントローラ内のアクションのみになります。
function beforeFilter() { $this->Security->blackHoleCallback = "securityError"; $this->Security->requireAuth('login'); } function securityError() { die("security error!"); }
トークンチェックをするアクションを複数指定するときはカンマでつなげる
$this->requireAuth('login', 'delete');
特定のコントローラからのポストのみ許可する
$this->Security->allowedControllers = array("users");
これを指定するとたとえトークンが一致しても許可のないコントローラからのポストの場合は blackHole メソッドを実行します。
特定のアクションからのポストのみ許可する
$this->Security->allowedActions = array("action");
これを指定するとトークンが一致しても許可のないアクションからのポストの場合は blackHole メソッドを実行します。
ポストのみ受け付けるようにする
$this->requirePost('login');
これはトークンとは違い、POST のみ許可して GET でのアクセスを不可にします。
/users/login/ のような URL でのアクセスも GET なので不可になります。
POST の処理だけを実行したいようなアクションに使用します。
CakePHP find や findAll の条件指定にちょっとだけ便利な postConditions
1CakePHP の コントローラに postConditions というちょっとだけ便利なメソッドがありました。
cake/libs/controllers.php
function postConditions($data) { if (!is_array($data) || empty($data)) { return null; } $conditions = array(); foreach($data as $model => $fields) { foreach($fields as $field => $value) { $conditions[$model . '.' . $field] = $value; } } return $conditions; }
例えば検索をするフォームなどで User.name で検索するような場合
view で
input('User/name');
と指定すると$this->data は
Array ( [User] => Array ( [name] => 山田 ) )
この $this->data を postConditions に渡すと
$data = $this->postConditions($this->data);
$data は
Array ( [User.name] => 山田 )
となり、このまま find や findAll に渡すことができます。
$this->User->find($data);
参考:CakePHP マニュアル
7.2. コントローラの関数
11月に読んだ本
2最近は仕事関係の本や自己啓発関係の本が多い。特に今年は小説を読んでないので、今月は少し小説を読もうと思っています。
決算書がスラスラわかる 財務3表一体理解法 (朝日新書 44) (朝日新書 44)
あたりまえだけどなかなかできない仕事のルール (アスカビジネス)
ウェブ時代をゆく ─いかに働き、いかに学ぶか (ちくま新書 687)
なぜ、エグゼクティブはゴルフをするのか?
ちょいデキ! (文春新書 591)
すごい「実行力」
なぜ、エグゼクティブはゴルフをするのか?
仕事に活かす!本200%活用ブック
WEB+DB PRESS Vol.41
お金は銀行に預けるな 金融リテラシーの基本と実践 (光文社新書)
プログラミングPHP 第2版
CakePHPガイドブック
忙しいパパのための子育てハッピーアドバイス
ケータイ業界52人が語る「戦略」の裏側
カリスマ・コンサルタントの稼ぐ超思考法 ~仕事と人生に効く「問題解決力」が身につく20の方法~
自転車生活の愉しみ
GoogleMap 特定のキーワードで表示させる
4Google AJAX Search API を使用してキーワードや住所から自分のサイトに Google Map を表示させるメモ
Google AJAX Search API KEY と Google Map API KEY を指定して JavaScript を読み込む
<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&key=Google AJAX Search API KEY" type="text/javascript"></script> <script src="http://maps.google.com/maps?file=api&v=2.x&key=Google Map API KEY" type="text/javascript"></script>
実際の表示部分。 q=キーワードで表示させる地図のキーワード(または住所)を指定する。
<script type="text/javascript"> <!-- var gls; var gMap; function OnLocalSearch() { if (!gls.results) return; var first = gls.results[0]; var point = new GLatLng(parseFloat(first.lat), parseFloat(first.lng)); var zoom = 15; gMap.addControl(new GSmallMapControl()); gMap.addControl(new GMapTypeControl()); gMap.setMapType(G_MAP_TYPE); gMap.setCenter(point, zoom); var marker = new GMarker(point); gMap.addOverlay(marker); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); }); } function load() { gMap = new GMap2(document.getElementById("map")); gMap.addControl(new GSmallMapControl()); gMap.addControl(new GMapTypeControl()); gMap.setCenter(new GLatLng(0, 0)); gls = new GlocalSearch(); gls.setCenterPoint(gMap); gls.setSearchCompleteCallback(null, OnLocalSearch); var q = "横浜ランドマークタワー"; gls.execute(q); } //--> </script> <body onLoad="load()"> <div id="map" style="width: 410px; height: 320px"></div> </body>
各 API KEY の取得は下記ページから
Sign-up for an AJAX Search API Key – Google AJAX Search API – Google Code
Sign Up for the Google Maps API – Google Maps API – Google Code