SyntaxHighlighter

2014年2月22日土曜日

CakePHP2のSecurityコンポーネントつかいこなせず



http://www.akiyan.com/blog/archives/2010/12/security-component-cakephp-advent-calendar-2010.html こちらのページを参考にさせていただき、CakePHPのSecurityコンポーネントをCSRF対策に使おうと、ここ1,2日トライしましたが使いこなせませんでした。

textareaを使うとなぜかblackhole。

elementを使うとなぜかblackhole。

しまいにゃ input type='text'をformに追加したらblackhole。

(´ー`)


gitで4つ前のコミットに戻して、下記の記事を参考に実装することにしました。

http://d.hatena.ne.jp/alexam/20120429/1335682689

(´ー`)

2014年2月15日土曜日

MySQLのeventで定期的なSQL実行をするよ

定期的にDBのデータを削除したい、なんて要求は結構あるんじゃないかと思います。

crondとかでやっても良いのでしょうが、SQL仕事はMySQLに任せるほうが役割分担としてスッキリすると思います。

まずは、イベントスケジューラの機能をONにします。

# mysql -u root -pyourpassword
mysql> SET GLOBAL event_scheduler=ON;

で、イベントを追加。10分ごとにBEGIN 以下のSQL文を実行するようになります。ちなみに、このSQL文は現在時間よりmodifiedの時間が20分より過去である場合、そのレコードをdeleteします。

mysql> DELIMITER $$
mysql>CREATE EVENT IF NOT EXISTS `sweeper_event` ON SCHEDULE EVERY 10 MINUTE STARTS '2012-02-15 15:31:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN DELETE FROM target_tbl WHERE modified < (now() - INTERVAL 20 MINUTE); END$$
mysql>DELIMITER ;


START '時間' の部分をとっぱらうと、作成時間がSTART時間になるようです。


MySQLのtime_zoneを設定するよ

MySQLで select * now(); したら、見事にUTCの時刻になってるわー。

MySQLのデフォルトでのタイムゾーンはシステムと合わせる設定になってるから確認してみます。

# date
Sat Feb 15 03:00:34 UTC 2014

あ、UTCだ。OSのlocaltime変えられる状況なら、次のようにします。
# mv /etc/localtime /etc/localtime.org
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Sat Feb 15 12:01:04 JST 2014
よし。

しかし、OSの設定が変えられない場合はMySQLの設定をいじります。
my.cnfを開き、[mysqld]内に次の1行を追加。





# service mysqld restart

これでOKです。


2014年2月14日金曜日

東北ずん子のインストールで失敗!?

気の迷いで、東北ずん子買いました。Voiceroid+です。佐藤聡美です、はい。

で、インストールしたわけです。マイPCはCドライブがちょっと残り少ないので、Dライブにインストールしたのです。インストーラでインストール場所選べるんですよ。

インストーラはあっさり終了します。

デスクトップに出てきた実行ショートカットを叩くと、、、「zunko\voiceフォルダがありません」的なエラーダイアログが出ます。ダイアログを閉じるとアプリは起動するんですが、再生ボタンがdisableで実質使えません。

で、

もしや、と思ってCドライブの方見たらありました。voiceフォルダが。

Dドライブの適切な位置にコピーして、事なきを得ました。

(ヽ´ω`)

CakePHP2のh()の第2引数doubleって何だ?

セキュアなWebアプリを作るべくまい進する昨今。こんにちは。

ってことで、徳丸先生の


を激読みしてます。

htmlspecialcharsの話ももちろんでてきます。

CakePHPはh()っていう便利なメソッドがあって、こいつにはお世話になるでしょう。

でこのh()ですが、ソース見ますと定義は次のようになってるわけです。


1番目は処理対象の文字列と。2番目$double。なんだこれ??3番めは"UTF-8"とか指定するわけですね。徳丸先生も著書の中でcharsetを指定することの重要さを書かれておりました。(私は知らずに第1引数しか使ってませんでしたが、結果的にはCakePHPのcoreの指定でUTF-8になってたので良かった!)

さて、第2引数の$double。これなんだ?ってことでグーグル先生に聞くもなかなかヒットせず…

ソースのコメントやら仕様のページやら見てはたと気づいた!


要するに、&gt;とかを更にエスケープするか、そのままにしとくかってことなのね。
試してないけど間違いない。


ところで、htmlspecialcharsよりhtmlentities のほうがセキュアかしら?よくわからんが後で考えよう。

CakePHPでログインしようとしているユーザー名をとるよ

ログイン画面の総当たり攻撃対策で、ログイン失敗時に遅延処理を入れる、と。

なんかPHP 5.5からはpassword_hash()という関数が用意されて、ソルトやらストレッチやらでより強固な運用ができるみたいだけど、今回オレが相手にしているのはPHP5.3.3だ。だからだめっぽい。

ログイン失敗したらサーバ側で3秒スリープでもいいかなーって気もするんだが、ログイン試行回数でだんだん遅くしてよ!みたいなことを言ってくるめんどくさい意識の高い人の要求を満たさなきゃならん場合もあるわけで。

仕方がないんで、DBに試行されたログイン名とそれに対応する試行回数を記憶させるっつーやり方を。

で、

ここまでCakePHPのテンプレート任せなログインをしてきたのだが、ちょっと手をいれる必要があるわけだ。

とりあえずUserControllerのloginメソッドに処理書くかーと思って改めて見直すとログイン使用としてるユーザー名をどうやってとったらいいのかわからん。

結論としては、




で取れる、と。ググってもパッとは出てこなかった。きっと超基本的なことなんだろうな。

お陰で$this->Auth->login()を少し追ってみるという経験ができたわけだ。


しかし、総当たり攻撃対策なんてフレームワークとかプラグインでもっと簡単にできるのかと思ってたけど、まだ発展の余地ありなんですかね。こんなのでDBテーブル増やしたり50行ぐらい増やすのやだなあなんて思ったり。

bashのlocal 気をつけること

bashで関数書くとき、変数スコープを小さくしたいから local って書きますよね。書きますよね?

この local ですが、、、 ビルトインコマンドだったとは…(´д`) これを知らずに6時間ぐらい無駄にしたよー(´д`)

こんな感じ。ファイル名は適当にaa.sh。
 
#!/bin/sh

function hoge() {
  rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end
で、実行
  
$ ./aa.sh
start
mkdir: cannot create directory `/dev/null': File exists
[1]
end
$
これは想定どおり。$?に1が入りますね。

ここで、変数 rt を local 宣言(実はコマンド)します。

#!/bin/sh

function hoge() {
  local rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

で、実行。

0]
end
$
えええええー。 $? が 0、つまり正常終了じゃないですかああああ┐(´д`)┌

無知とは怖いものです。localコマンドの実行で$?が0になってるんですなあ・・・たぶん。


この混乱で、∀ガンダム10話観れるぶんの時間無駄にしたわ。死ぬわー

次のようにすれば目的は達せる、と。
 
local rt
 rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

その他、bashのlocalは、「localを実行した変数は、その関数内だけでなく、その関数が呼び出す関数でも有効」という妙なスコープになっているとのこと。

気をつけましょう(´ー`)

CakePHPのpaginateするときデータのオーダーを変更するよ


  コントローラークラスのデフォルトとして設定するときは下記。
class PostsController extends AppController {
        var $name = 'Posts';
        var $paginate = array('order' => 'Post.created DESC');

        function index() {
                $this->Post->recursive = 0;
                $this->set('posts', $this->paginate());
        }
}
でもメソッドの中で臨機応変指定したくなるでしょう・・・
class PostsController extends AppController {
        var $name = 'Posts';

        function index() {
          $this->pagenate=array('order'=>'Post.created DESC');
                $this->Post->recursive = 0;
                $this->set('posts', $this->paginate());
        }
}

vimでLANGがeucの時にutf8のテキストを読めるようにするよ


こちら のサイト様を参考にしました…

utf8環境のターミナル(minttyとか)で、eucのテキストを開いて、文字がばけばけだよーっていうとき。
:set fencs=euc-jp
:e! 
とすると、読めるように表示してくれるとのこと。

じゃ、euc環境のターミナルで、utf8のテキスト開いちゃったら?
:set fencs=utf-8
:e! 
でいけましたよ、と。

あと、Cygwin mintty からutf8とeucの混在環境にアクセスしなきゃならんときの方策として、こちらのサイトがとっても参考になりました!!

感謝感激!!




 

vagrantはコマンドプロンプトからの起動時とcygwinからの起動時でなんかちがう

普段はWindows7のPCを使ってます。

でもCUIではUnixっぽく使いたいのでCygwinを入れてます。terminalはmintty。minttyは現在のCygwinの標準端末のようですね。

フォントいじったりカラー変えたり.bashrcにalias書いたりしてコンピュータとの対話を少しでも楽しくしたりしてます。


本題。

開発環境はこのWindows7をホストとしてVirtualBoxのVMをvagrantで管理しているわけです。

で、最初はコマンドプロンプトでvagrant upとかしてたわけです。

でも、最近minttyの環境が美しく使いやすくなってきたので、terminalといえばminttyを起動するように癖がついてきたわけです。

以前コマンドプロンプト上で vagrant up してたのと同じものをこのminttyからvagrant upしてみたわけですが、どういうわけか初期状態のboxをロードし始めるのです。つまり、いままで加えてきた変更があたかも消えたようになってしまう。冷や汗たらたらです。

.vagrant/machines/default/virtualbox/id

このファイルの中にid文字列らしきものが書いてあるのですが、それがコマンドプロンプトとcygwin環境上で変わっちゃうみたいなんですよねー。

ちょっと厄介です。 



 

vagrantのVMを強制終了しちゃって肝を冷やしたよ

vagrantでVMを立てて、そのうえでredmineを動かしております。

で、ホストPCのOSパッチを当てたんで再起動したわけですが、vagrant haltするのを忘れてたのです。

さらに、ホストOSの終了時に強制的にプロセス殺しちゃったので、VMが変な状態になってしまった、と。

ホストPCはWin7 Proでした。

vagrant upしてもダメ。Virtual BoxのGUIで、原因をみると・・・

今回は 「C:\Users\<user-name>\VirtualBox VMs\mycent6432_default_1385967619\mycent6432_default_1385967619.vbox ファイルがないよ!!」というエラーでした。

C:\Users\<user-name>\VirtualBox VMs\mycent6432_default_1385967619 ディレクトリの中を除くと、mycent6432_default_1385967619.vbox-tempというファイル、それから同じ名前で.vbos-prevという
拡張子のファイルがありました。

日付時刻をみると、mycent6432_default_1385967619.vbox-tempがホストをたたき落とした時刻らへんだったので、名前から「-temp」を削除しました。

vagrant up


起動したよー(T_T) 良かったー。 中のredmineのチケットなど確認したらどうやら結構直前まで記録されている見たい。助かったあああ。



シャットダウン時は気をつけましょう。
 

BoostCake(bootstrap3)にしたら上手く動かないぞ

(※一番アクセスされてるページなのに画像が死んでた。画像削除しました。)

bootstrap3のデザインでCakePHP使うってことで、BoostCake環境を作りました。

Webアプリを作り始めたんだけど… 静的なHTMLとbootstrap3とjqueryではできていた次の2点が動かないよー。困った。


1) responsibleデザインのcollapseが効かない


静的に作ってた時はぺろっとメニューがドロップダウンしたんだけど、うんともすんとも言わなくなった。


2) モーダルダイアログが表示されない



静的な環境では出るんだが・・・


さて、原因追求して直すか別の画面仕様にするか。うーん続報をお待ちください。


結局 BoostCakeやらbootstrap.js と jquery.js のバージョンの相性のようでした。


bootstrap.min.300.js
jquery.js
bootstrap.min.css

これらのファイルをjsはapp/webroot/jsディレクトリに、cssはapp/webroot/cssディレクトリに配置し、下記のような順番で読み込んだらOKでした。
   
 <head>  
  <meta charset="utf-8">  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  <!-- jequery の次に bootstrap.min.300 をロード。順番まもること -->
  <?php echo $this->Html->css('bootstrap.min'); ?>
  <?php echo $this->Html->script('jquery'); ?>
  <?php echo $this->Html->script('bootstrap.min.300'); ?>

  <title>Proto01</title>
 </head>





<head>内に書くとうまくいくのですが、<body>の最後の方に書くとうまく動きませんでした。


Raspberry Pi のeditorをvimにするよ

crontab -e したらなんか見慣れないエディタ起動してややこしい。vi (vim)にしたい。

root@raspberrypi [~] # update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 4 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /bin/nano            40        自動モード
  1            /bin/ed             -100       手動モード
  2            /bin/nano            40        手動モード
  3            /usr/bin/vim.basic   30        手動モード
  4            /usr/bin/vim.tiny    10        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 3
update-alternatives: /usr/bin/editor (editor) を提供するために 手動モード で /usr/bin/vim.basic を使います


これでOK 

Raspberry Piにpv(pipe viewer)をインストールするよ


 これだけでOKだったよー。
pi@raspberrypi ~ $ sudo apt-get install pv

 で、cifsマウントは/etc/fstabに次の行を書き足しまして、

//192.168.11.4/aaa /mnt/family       cifs    username=my-user,password=my-pass,ro        0       0

で、

pi@raspberrypi ~ $ sudo mount /mnt/aaa

これでOK。

さて、どうやってコピーするかな… え? rsync !?

Raspberry Piにboxをマウントするよ

うちはnasでご家庭のデジタルデータを保管しています。

一応なくすと損失になるデータもありますんで、バックアップを取りたいわけです。以前はそのnasの機能で別途USB-HDDをつければバックアップしてくれてたのですが、過日お亡くなりになりまして。

新しくUSB-HDDをつければ良いわけですが、安上がりでちょっと面白い方法を思いついたと。

Raspberry Piを中継してnasからboxにバックアップを取ろうというわけです。差分コピーの方法はよくわかってませんが、きっとLinuxならなんかあるでしょう。

ということでまずはboxをマウントしたいのですが、こちらの記事 を参考にやってみたいと思います。

pi@raspberrypi ~ $ sudo apt-get install davfs2
うまくいった。

 
pi@raspberrypi ~ $ sudo mkdir /mnt/boxnet
うまくいった。

下記実施。

$ sudo mkdir /mnt/boxnet
 
/etc/fstab に https://www.box.com/dav /mnt/boxnet davfs  rw,user,noauto 0 0 を書く
 
/etc/davfs2/secrets ファイルに https://www.box.com/dav  user@email.com  password を書く
 
/etc/davfs2/davfs2.conf の # use_locks 1 のコメントアウトをはずし use_locks 0 に書き換える
 
$ sudo mount /mnt/boxnet 
 

/sbin/mount.davfsMounting failed302 Found

んんんー??? で、できねっす(´ー`)

で、英語圏のページなども漁ってたら、どうも接続先のURLが変わったみたいですね。www.box.net→www.box.com→dav.box.comと変遷してきてるみたい。

https://dav.box.com/dav
でいけましたよ!! ちょくちょく変わられると厄介w


 

Raspberry Pi を日本語化するよ

 Raspberry Pi ですが、OSをSDに入れ、電源入れたらあっさり起動しました。簡単ね!
(先人の方のブログ記事に感謝です)

ブラウザでFireFoxでもいれるかー、と思ってググったら、どうやらFireFoxじゃなくてIceweaselという代替手段をとるらしく?

ところで、Ice = 氷 ですが weaselは何かしらと。これもググったら「いたち」なんですね。火狐に氷いたちだと。

でインストールは 

sudo apt-get install iceweasel

でチョチョイのチョイです。 でも英語だ・・・。いや、アプリのメニューとかは英語でも構わないんですが、Google先生が教えてくれる検索結果が英語圏なのは困るぞ、と。

で、日本語化というかロケールをJPにしたい。こちらにわかりやすい記事があります。 

デフォルトのロケールはJa_JP.UTF-8を選択。

うちはapt-getもsudoじゃないとダメだ… まぁいいか( ´_ゝ`)





 

自宅PCを外出先から起動するよ

世知辛いご時世ですので、会社のPCよりうちのPCのほうが高スペックなんてことありますよね?

だからうちのパソコンを外から使いたい時があります。でもずーっとつけっぱなしは電気代もかかるし嫌だなぁと。

そんな時はWak-On-Lanってものがあるらしいことを知って試しました。設定は概ね次の通り。当然のことながらハードやらBIOSやらOSやらが対応してないとダメです。。

  1. 起動させられるPCのOSの設定(うちはWin7 Pro)
  2. BIOSの設定
  3. インターネット接続のルーター設定
  4. 起動する側の準備(アプリ導入とか)
で、ここの記事  に詳しく載っています。ありがたや。

だいたいはリンクした記事の通りなんだけど、2つほどちょっとつまづいた。

ひとつめは、「ルーターのNAT設定でうちのLANのブロードキャストアドレスを指定できなかった」問題。これは、起動したいパソコンのIPアドレスをそのまま書けばOKでしたよ、と。まぁそんなもんか。

ふたつめ。「電源OFFからは起動するけど、スリープからは起動しない」問題。これは、ハイブリッドスリープってのをオフにしないといけない、とのことです。

[コントロールパネル]-[電源オプション]を開き、現在のプランについて「プラン設定の変更」を開きます。

a

[詳細な電源設定の変更]をクリック。
b

電源オプションで、[スリープ]ノードの[ハイブリッドスリープを許可する]から、設定オフ!
c

 これでいけました。


起動はiPhoneアプリの「RemoteBoot WOL」で確認。Portは9番にしてみました。

Linuxから起動する場合は、こちらの記事が参考になりました。

MACアドレスはコロン区切りで入力するのがセオリーなんですなー。

Raspberry Pi と ARDUINO UNO がやってきた

写真

なんか、センサーみたいなものを使って遊んでみたいなあと、ふと思い立ってAmazonでポチってしまった。

Raspberry Piが4500円くらいで、ARDUINO UNO が3000円くらい。 ARDUINO UNOは Rev3かな?

届いて実物をみたら思ったより二回り小さかった。そしてパッケージが可愛らしかった。

とりあえずRaspberry PiにOS入れるところから始めるわけだ。モニターつなぎ変えるのが面倒だなー。早くsshできるようにしたい。