2011年12月28日水曜日

MySQL5.5からの変更点

MySQLは、バージョン5.5から設定内容がいろいろ変更になっているので、気づいた(ググって各サイトから教えて頂いた)点をメモしていく。

文字コード設定
# MySQL-5.5 default-character-set --> character-set-server
character-set-server=utf8

2011年12月27日火曜日

CakePHPテーブル定義

$fields に定義するテーブルのフィールドとして使用可能な項目と意味 type CakePHP 内部の型。現在は、string (VARCHAR にマップ)、text (TEXT にマップ)、integer (INT にマップ)、float (FLOAT にマップ)、datetime (DATETIME にマップ)、timestamp (TIMESTAMP にマップ)、time (TIME にマップ)、date (DATE にマップ)、そして binary (BLOB にマップ) という型がサポートされています。 key 値を「primary」にセットすると、そのフィールドは AUTO_INCREMENT 属性になり、テーブルの主キーになります。 length フィールドの長さを設定します。 null true をセットすると NULL を許可、false だと NULL を許可しません。 default フィールドの初期値を定義します。

2011年12月25日日曜日

SSHによるリモート接続設定

いつも使っているのだが、ついつい忘れがちな設定方法をメモする。

sshdによるファイル転送を行うため、Linux(SVR)側で設定内容を確認する。

アクセスの制限
/etc/hosts.allow にアクセスを許可先を設定。
sshd: 127.0.0.1 192.168.0. 192.168.1.
/etc/hosts.deny にアクセスを拒否先を設定。
sshd: ALL
/etc/ssh/sshd_configの編集
#Port 22
#■ポート番号を変更しても良い 例) 2222等

#Protocol 2,1
#↓■SSH 2 のみ接続を許可
Protocol 2

#PermitRootLogin yes
#↓■rootでのログインを禁止
PermitRootLogin no

#↓■パスワード方式ログインで設定する場合、パスワードでのログインを許可
PasswordAuthentication yes
#↓■鍵方式ログインで設定する場合、パスワードでのログインを拒否 PasswordAuthentication no #↓■ 空パスワードの禁止 PermitEmptyPasswords no

【ログイン方式で鍵方式を設定した場合】 手順は下記の2通り考えられます。サーバーとクライアントが身近な(同一建物)場合は【手順1】で行い、ネットワークでの転送が必要な場合には、【手順2】が良いかも...
【手順1】でネットワークを経由で転送も方法を考慮すれば問題ないかもね。(キーをパスワード付きで圧縮して送り、パスワードは別手段で伝える)
ここでは、公開鍵・秘密鍵ともにデフォルトの値(名前)を使用して説明します。(鍵の生成時の名前(鍵名)は好きな名称をつけることが可能)
デフォルトでは、公開鍵(id_rsa.pub)・秘密鍵(id_rsa)になります。

【手順1】

  1. サーバーでログイン方法(sshd_confing)の設定を行う。
  2. サーバーでクライアントの秘密鍵と公開鍵のペアを作成する。
    ※作成された公開鍵は、~/.ssh/authorized_keys に追加する。
    ■authorized_keysがない場合
    $ cat ~/.ssh/id_rsa.pub > authorized_keys
    ■authorized_keysがある場合
    $ cat ~/.ssh/id_rsa.pub >> authorized_keys
    
    ※登録したら、作成した id_rsa.pub(公開鍵)は削除します。
    
  3. 作成された秘密鍵(id_rsa)をクライアント(PC)へコピーする。
  4. クライアント(PC)がSSHクライアントで公開鍵による認証を行うように設定する。
【手順2】
  1. クライアントで秘密鍵と公開鍵のペアを作成する。
  2. 作成した公開鍵をサーバーに登録する。
    登録先は、ユーザーディレクトリのauthorized_keysに鍵を追加。
    ※この時は、パスワード認証で鍵を送る。(または、別方法)
  3. SSHサーバーのログイン方法を公開鍵暗号でのログインに変更する。
  4. クライアント(PC)がSSHクライアントで公開鍵による認証を行うように設定する。

■鍵の作成方法
Linuxでの鍵の作成(Mac OS X Lion もほぼ同様です。)
$ ssh-keygen -t rsa
[hoge@hoge01 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): ←そのまま[Enter]を押す。(鍵名と鍵の格納先フォルダ)
Created directory '/home/hoge/.ssh'.
Enter passphrase (empty for no passphrase): ←パスワードを入力
Enter same passphrase again: ←パスワードを再入力
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
b7:7b:f2:83:0b:da:6c:57:9a:51:93:4e:04:9a:b2:5f hoge@hoge01
[hoge@hoge01 ~]$

Windowsでの鍵の作成(WindowsXp TeraTerm Pro)
  1. TeraTermProを起動して、Cancelを選択して接続画面を閉じる。
  2. メニューの「設定」を選択して「SSH鍵の生成」を選択(クリック)します。
  3. 鍵の生成画面が開いたら(鍵:RSA、ビット数:2048)、そのまま「生成」ボタンを押します。
  4. 鍵の生成が完了すると「鍵を生成しました」と表示され、パスワードが入力可能の状態になります。
  5. パスワードを入力して「公開鍵の保存」を押す。
  6. パスワードを入力して「秘密鍵の保存」を押す。
上記で鍵を作成したら、秘密鍵はクライアントに保存し、公開鍵はサーバーのユーザー所定のディレクトリの authorized_keys に登録する。(なければ作成、あれば追記する。)

実際に確認してみると大した事ないのだが... (^_^)

2011年12月22日木曜日

テーブル定義情報をSQL文で出力したい。

 phpMyAdminで見れば良いだろうと言えばそうのだが、やはりSQL文で定義情報を確認および保存しておく事が必要(DBやテーブルの一括作成)な時も多々ある。

 CakePHPでschema.php に定義を追加する時なども必要になる。関連など後から作成した表が schema.php にない場合もあるので、定義情報を簡単に出力できるように確認しておくべきだ。

■MySQL では、下記の通りで対応できる。

■コマンド
[hogehoge@hoge]$ mysqldump -h[ホスト] -u[ユーザ名] -p[パスワード] -d [データベース名] [テーブル名]

■出力結果
CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) CHARACTER SET utf8 NOT NULL,
  `password` varchar(50) CHARACTER SET utf8 NOT NULL,
  `fullname` varchar(50) CHARACTER SET utf8 NOT NULL,
  `email` varchar(256) CHARACTER SET utf8 NOT NULL,
  `tel` varchar(20) CHARACTER SET utf8 NOT NULL,
  `memo` text CHARACTER SET utf8 NOT NULL,
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;

■オラクル(Oracle10g)では下記のコマンドになります。
■コマンド
set long 10000 (出力する文字数を指定…10000文字まで)
select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual;

■出力結果(テーブル:users)
DBMS_METADATA.GET_DDL('TABLE','users')
--------------------------------------------------------------------------------

  CREATE TABLE "HOGE"."USERS"
   ( "ID" NUMBER(6,0),
 "USERNAME" VARCHAR2(50),
 "PASSWORD" VARCHAR2(50),
 "FULLNAME" VARCHAR2(50),
 "EMAIL" VARCHAR2(256),
 "TEL" VARCHAR2(20),
 "MEMO" VARCHAR2(512),
 "CREATED" DATE,
 "UPDATED" DATE,
  CONSTRAINT "USERS_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 20 PCTUSED 70 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 983040 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

※上記は別ファイルの出力結果をMySQLのテーブルと項目名を揃えた編集版です。
 よって、領域の情報は元々のテーブルの値をそのまま表示しています。

2011年12月20日火曜日

SQLPLUS 備忘録

正しいSQL文なのに、SP2-0734 のエラーが発生する

分析関数やらを駆使してSQL文を作ると100行以上の長文になり、長い行は300文字以上になってしまう事もよくある。
その際には、行単位でインデントして少しでも見やすくしておくのだが、そのインデントの空白が徒になりエラーが発生するのがこの「SP2-0734」である。

■原因
一行が長い文に行頭インデントを行うための空白が実行時に空白行を生み出しているようである。

■解決策として下記のコマンドを使う
SET SQLBLANKLINES ON
このコマンドで空白行が除去されるため無事にSQL文が実行される。

エラー発生時のSQLPLUS画面

2011年12月17日土曜日

CakePHPによる実践Webアプリケーション開発

ログアウトがうまくいかない

 毎度の事ながら、書籍の通りにコーディングしてもうまくいかない機能が発生する。

 CakePHP初心者の私には、解決するのに時間がかかって困る。 (>_<)
 しかし、結果的には「CakePHPの辞典」やら別の実習書籍やらネットでググったりして少しづつ理解を深めていっているようだが... (・ ・?)

今回のお題はこちら...

action == 'add' || $this->action == 'edit') {
            $this->AppAuth->authenticate = $this->User;
        }
        if($this->User->findCount() == 0) {
            $this->AppAuth->allow('add');
            if($this->action != 'add') {
                $this->redirect('add');
                exit;
            }
        }
        return parent::beforeFilter();
    }
    function login() {
    }
    function logout() {
        clearCache('element_'.$this->AppAuth->user('id').'_action_menu', 'views', '');
        $this->redirect($this->AppAuth->logout());
    }
}
?>
 上記だけの抜粋での説明には無理があるかと思いますが、default.ctp にてログアウトを行うリンクを貼り、上記のlogoutが実施されるという手はずになていますが、ログアウトが行われない。
 ここで言う「ログアウトの成功」は、現在表示されている画面から「ログイン画面」に切り替わることを言います。もちろんセッション情報が解除(削除されていることは言うまでもなく前提条件になります。

 なかなか解決できずに困りググっていたところ「CakePHPによる実践Webアプリケーション開発」のサポート」サイトでログイン関連のスレッドがあったのでその内容を参考にさせてもらったところログアウトが実現できるようになりました。その方法は、下記のように beforeFilter() の先頭に $this->AppAuth->logout(); を追記するという内容です。

変更後の内容は下記のとおりです。
AppAuth->logout();
        if($this->action == 'add' || $this->action == 'edit') {
            $this->AppAuth->authenticate = $this->User;
        }
        if($this->User->findCount() == 0) {
            $this->AppAuth->allow('add');
            if($this->action != 'add') {
                $this->redirect('add');
                exit;
            }
        }
        return parent::beforeFilter();
    }

  ‥‥‥ 省略 ‥‥‥

}
?>

 上記の設定でログアウトはできるようになったが、ログアウト以外を選択してもログアウトされてしまう... 解決になってない。orz

ネットワークスペシャリスト試験 結果

 昨日、2011年10月16日に受験したネットワークスペシャリストの結果が発表された。試験勉強は試験直前に10日程度勉強したが、勉強不足と思いながら受験したが、試験内容は思っていたよりも簡単に感じ特に午後Ⅱについてはかなり上出来でした。これば結果が楽しみと考えていたら...

 なんと、結果は「不合格」という内容でした。

 試験ではOSPFやBGP-4の知識に不安があったのですが、実際の試験ではこの部分の割合が少なかったので「ヤッター」なんと心の中で喜んでいた次第でしたが、実際には午後Ⅱでなく、午後Ⅰで得点が 2点 足りずに不合格になっていました。

 まさかの午後Ⅰの得点不足で、午後Ⅱの出来を確認することも出来ず不戦敗のような感じです。
 結果は下記の通りで...

 この内容を戒めにして、今後は計画的に知識の吸収と確認を実施して合格を勝ち取ることにするぞ! (>_<)

2011年12月14日水曜日

ランニング不調だなぁ~

10月以降になってから、ランニングを中止(雨天等を含めて)する日が増加傾向にある。
 ここ数ヶ月は、「腰痛」やら「こむら返り」やらでどこかが痛んでいることが多いので少し天気が悪いとすぐ弱気になり危険(転ぶと)を意識してか、それとも深層心理でランニングを拒絶しているのか...orz

ここ数ヶ月では、下記のようにランニングを中止する日が増加している。
※気を引き締めねば...
・7月→1日
・8月→4日
・9月→1日
・10月→6日
・11月→10日
・12月→3日(12月14日までで)

この5年間では、多くても月に5日以内で推移していたのだが、先月と先々月はちょっと休み過ぎだったな...

ちなみに、10月10日から距離を延ばして6キロ強にした。
ランニング前には、腕立て伏せを30回、ランニング後には腿上げを250回と...鍛えているつもりなのだが...
最高タイム:29分01秒
目標タイムを28分台にしてみたが、未だ達成できず...orz
なんか、寒くなるにつれてタイムが出なくなってきている。
9月までは、5キロ強であったが、現在の5キロ強時点でのタイムと比較しても今よりも1分以上早く走れていた。9月までの調子なら6キロ強でも28分は楽勝と考えていたのだが...

とりあえず、28分を目標に頑張ろう!εε=ε=εε=┏( >_<)┛

2011年12月10日土曜日

Linux ファイルシステムの検査と修復について

 このLinuxマシンのディスクを交換してから初めておかしくなった。(このマシンでは初めてかも)  前回は、ディスク交換前のディスクでフリーズして再起動した際にディスクが修復できなくなった。
 現象としては、画面がブラックアウトしてキーボードやマウスを操作しても変化なし。しかし、ディスクランプや点灯しており、キーボードを打つと反応している風にも見えるが、画面は回復せず。
  ↓↓↓
仕方なくリセットボタンを押して再起動を実施する。
各種サーバー(DB・samba・httpd...)などが起動していので、案の定ジャーナルファイルの異常が表示され...

リセットボタンで強制終了させたので、再起動時にファイルシステムの検査と修復が行われているが、ふとファイルシステムのチェックについて確認をすることにした。

ファイルシステムのチェック

 ファイルシステムをチェックするには、対象のファイルシステムをアンマウントするか読み込み専用でマウントしておく必要がある。

fsck [-ANRTV] [-s] [-t fstype] device
オプション 内容
-s 複数のファイルシステムに対し、順を追って順々に処理する
-t tstype ファイルシステムを指定する
-A /etc/fstabに記述されているすべてのファイルシステムの検査と修復を行う
-N 実際には実行せず、実行内容だけを表示する
-R ルート・ファイルシステム以外の全てのファイルシステムの検査と修復を行う
-T 起動時にタイトルを表示しない
-V fsckから起動されるコマンドなどの詳細な情報を表示する
※ファイルシステムごと詳細に指定したい時には、下記のようなコマンドが用意されている。
 fsckは、実際にはファイルシステムごとに用意された下記コマンドのフロントエンドになっている。
 e2fsck(ext2/ext3)
 reiserfsck(reiserFS)
 xfs_check(XFS)

起動時に fsck が実行されるタイミングについて

【/etc/fstab】

LABEL=/                 /                       ext3    defaults        1 1
LABEL=/tmp              /tmp                    ext3    defaults        1 2
LABEL=/var              /var                    ext3    defaults        1 2
LABEL=/var/log          /var/log                ext3    defaults        1 2
LABEL=/usr              /usr                    ext3    defaults        1 2
LABEL=/usr/local        /usr/local              ext3    defaults        1 2
LABEL=/home             /home                   ext3    defaults        1 2
LABEL=/opt              /opt                    ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-hda12        swap                    swap    defaults        0 0
  • [フィールド1]
    マウントするブロックデバイスを記述します。 (/dev/sda1など)
  • [フィールド2]
    マウントポイント (/bootなど)
  • [フィールド 3]
    ファイルシステムのタイプ (ext3, nfs など)
  • [フィールド 4]
    マウントオプション (defaultsなど nfsの場合はnfs(5)を参照)
  • [フィールド 5]
    dumpコマンドの実行対象とするかどうか。不要の場合には0を指定。
  • [フィールド 6]
    システム起動時にfsckチェックする順番。ルートファイルシステムは必ず1にしてください。fsckチェックをしない場合は0を設定します。通常はルートファイルシステムに1、それ以外を2にします。

2011年12月6日火曜日

肩こり

先週から左肩の肩こりがする。先週は、ランニング中にも左肩から左腕が重痛いような感じでとても走りづらかった。
まくらの高さのせいかと思い、高さをを変えてところ先週末からかなり治まってきたが、また一昨日から発症してきた。
まくらのせいではなく、寝相が悪いのかも...
寝ている間に変な体勢になっているのかもしれない...
しかし、これだと対応のしようがないなぁ〜(ーー;)

2011年12月5日月曜日

CakePHPによる実践Webアプリケーション開発

何度も記載しているが、書籍の通りに記述しても実行できない箇所が多数あり、なかなか最後までたどり着けない。
 サポートのサイトを閲覧しても、こちらの疑問箇所はひとつだけ掲載されていたが、その内容はあくまでもcakephp1.2のみに通用する内容のようで、cakephp1.3以降で試す場合は、多数の箇所で問題にブチあたります。
 私と同じような内容で悩む方の助けになれば幸いですが...

関連(HABTM)を検索(find)する部分が動かない件について

書籍(CakePHPによる実践Webアプリケーション開発)では、下記のようにHABTMを検索するように記載されていましたが、エラーになってしまいます。

$user_ids = $this->Group->Belong->find('list', array(
        'conditions'=>array('Belong.group_id'=>$group_id), 
        'fields'=>array('Belong.user_id','Belong.user_id'), 
        'group'=>'Belong.user_id'));
エラー内容(habtmを検索できない)
Notice (8): Undefined property: Group::$Belong [APP/controllers/schedules_controller.php, line xx]

Fatal error: Call to a member function find() on a non-object in /var/www/cakephp/calendarnote/controllers/schedules_controller.php on line xx 
上記のようにエラーになるなので、habtmの関連モデル(Belog)を検索するように変更した。
$this->Group->Belong->find
$this->Belong->find
$user_ids = $this->Belong->find('list', array(
        'conditions'=>array('Belong.group_id'=>$group_id), 
        'fields'=>array('Belong.user_id','Belong.user_id'), 
        'group'=>'Belong.user_id'));
上記の変更で、無事に検索したいデータが検索されるようになった。
めでたし、めでたし...ヘ(ё_ё)ノ\ ワーイ