命守 星光版 徒然草

2012-02-22 shutdownユーザー

linuxだと無効になってるみたいですね。

ログインしたらshutdownが走るshutdownユーザーを作ろうというお話。

shutdownシェル

#!/bin/bash
sudo /sbin/shutdown -h now

/root/script/shutdown.sh としておきましょうか。

/etc/passwd

shutdown:x:6:0:shutdown:/sbin:/root/script/shutdown.sh

ユーザーshutdownのログインシェルにshutdownシェルを指定する

/etc/sudoers

shutdown        ALL=(ALL)       NOPASSWD: ALL

shutdownユーザーでshutdownをsudoできるように設定

全コマンドを実行できるようにしている。あんまり良くないかも。

パスワードを削除

passwd -d shutdown

パスワード入力なしでログインできるように

注意 sshログインできる

良し悪しは分かれるところだが、sshdの設定で何とかする

2012-02-20 [cakePHP]リンクを絶対パスで

htmlヘルパーとか、formヘルパーなんかで生成されたURLって基本的に相対パスで書かれる。これを絶対パスで書いてもらおうとするお話。

とりあえず、cake/lib/router.phpを見てみる

 * @param mixed $full If (bool) true, the full base URL will be prepended to the result.
 *   If an array accepts the following keys
 *    - escape - used when making urls embedded in html escapes query string '&'
 *    - full - if true the full base URL will be prepended.
 * @return string Full translated URL with base path.
 * @access public
 * @static
 */
	function url($url = null, $full = false) {
		$self =& Router::getInstance();
		$defaults = $params = array('plugin' => null, 'controller' => null, 'action' => 'index');

おお、router::urlの第二引数をtrueにすればいいらしい。


とりあえず、デフォルト値をtrueにしてみたんだが、相対パスで出力された。

htmlヘルパーを見てみると

	function link($title, $url = null, $options = array(), $confirmMessage = false) {
		$escapeTitle = true;
		if ($url !== null) {
			$url = $this->url($url);
		} else {
			$url = $this->url($title);
			$title = $url;
			$escapeTitle = false;
		}

で、

	function url($url = null, $full = false) {
		return h(Router::url($url, $full));
	}

ってなってた。

urlメソッドで$fullは受け取れるようになってるんだが、linkメソッドで値を渡していないので、相対パスになってしまう。

ヘルパーの各メソッドを直すのは筋悪なので、router.phpに手をつけることにした。

	function url($url = null, $full = false) {
		/* ここで無条件にtrueに変更 */
		$full = true;

		$self =& Router::getInstance();
		$defaults = $params = array('plugin' => null, 'controller' => null, 'action' => 'index');

		if (is_bool($full)) {
			$escape = false;

で、全部のリンクが絶対パスになった。

同一サイト内のリンクは相対パスでもいいのだが、SEO的には絶対パスのほうが価値が高いという説があるのでその対応でした。

2012-01-31 [PG]netBeans+xdebug+samba

快適な開発環境を作るのは重要なこと。

LAMPだとテスト機のDocumentRoot以下を、sambaで公開してそこでコードを書くようにする。

こうやると作業環境と本番との違いが埋まる。

で、開発時にxdebugを使うときに注意、ネットワークドライブの設定をすること

これやんないと、ブレークポイントで停止したときに、停止箇所に行ってくれない。

netbeansのプロジェクトが割り当てたドライブ上にあればOK。sambaで公開した領域をそのまま割り当てるのが手っ取り早い。


それ以外の設定に関しては、他の方に任せるとしましょう・・・。

2012-01-25 [php]php -a

http://www.php.net/manual/ja/features.commandline.interactive.php

phpと対話できるようです。

正規表現のチェックや出力フォーマットのチェックなど、関数の挙動確認とか、環境のチェックとかに使えそうです。

2012-01-24 [PG]webアプリ自動テスト

ちょっと調べてみたので。

テストツールって基本的に、いろんな状態での動作を再現させるツールで、再現結果を評価できるようになっている。

何を再現させるかで、いくつかツールがあったので。

xUnit

名前のとおり単体テスト向け。

テストプログラムに対象をロードさせて、動作の検証を行う。

再現はクラス単位だったり、ソースファイル単位だったり。

seleniumwatir

こっちは統合テスト向け。実装方法が若干違うけど、大体おんなじツール。

画面単位での動作を再現させるツール

fwptt

webアプリらしい構造のテストツール。

リクエストだけを再現させるところが面白い。

まとめ

ソースファイル単位でテストを行うもの、画面上の動作を再現させるもの、リクエストを再現させるものと三種類あげてみました。

それぞれ出番が違うので、うまく使い分けて生きたいですね。

2012-01-17 [PG]論理削除フラグに一言

どういう実装になるのか気になったので書いてみる。

何が気になったかって一意制約。こういうデーターは「PKになるだろう」って説もあるが、昨今のフレームワーク作法で祖も行かないことも多い。さて本題。


物理削除(ログテーブルに移してからの)の場合、再度同じのデータをinsertしてもすでに削除されているので、一意制約に違反することはないけど、論理削除(フラグによる論理削除)の場合、思いっきり違反しますよね。

これをどうやって実装してるのか非常に気になります。


ちょっと考えてみた。

論理削除と合わせて一意制約

でも、再度登録されたデータを削除すると、ここで一意制約違反。

なので、削除フラグが0/1な値にならなくなる。削除時に値を取得して、その値に更新。値はPKのhashとか、削除フラグ用にシーケンスを用意するとかでいいだろう。


・・・筋悪な気がしてならない。

アプリからレコードを削除するのにどれだけコードを書くんだよ。

そもそもどれだけのレコードが削除される? 該当列につけるであろうindexの効果は?



制約は設けずに、アプリでチェック

一度selectしてデータの一意性を確認してからinsertすれば一意になる。

だけど同時更新があると駄目。

二つのトランザクション(A,B)があったとして、同時に同一のデータをinsertしようとする

  1. Aでselect。同一データなし
  2. Bでselect。同一データなし
  3. Aでinsert
  4. Bでinsert

ってなったときに同じ値ができてしまう。

select前にテーブルロックすれば回避できるがそれでいいの?


きっと、こういった問題のないエレガントな方法があるんだろうなー。

2011-12-23 [数学]交換法則のない世界

http://blogs.itmedia.co.jp/magic/2011/12/6886-2d5b.html

より。


6×8 は 8×6 とは違うのか。

よく考えたら、交換法則の存在しない世界での数式なら×だわ。文章と違う計算やってるんだから答えがあっててもそれは偶然の一致でしか無いんだから、理解を評価するテストなんだから×にすべき。*1


この問題は、数と単位の関係を正しく読み取れているかを聞いているんでしょう。

だから、8人に6本と、6人に8本は違うんだから×でしょ。算数のルールとして掛けられる数は左ってなってるんだし、被乗数と乗数を入れ替えても結果が変わらないルール(交換法則)もないんだし。


ところで、ここ来るまでに、演算と単位の関連性について教えてるんですかね?

  • 加減は同じ単位(概念)のものでしかできない。
  • 乗除は異なる単位(概念)のものの間で行う。

簡単な話だけど、重要なこと。


オチとしては、算数の授業も受験数学と同様に、出題者が望む解答+解法を示すテクニックを習うものである。ということでいいんじゃないかな?


追記

問題の本質は、

  1. 問題文から乗数、被乗数にふさわしい数を抜き出し(被乗数)×(乗数)の形で記述せよ。
  2. (1)で立てた式を計算せよ。

なのでしょう。

とは言っても、「以下の問題文から乗数、被乗数にふさわしい数を抜き出し(被乗数)×(乗数)の形で記述せよ。」なんてメタな出題ができないわけで。

*1:この偶然の一致は偶然ではなく、そこを追求することに大きな価値があることは確実