A Day In The Boy's Life -50ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

原則、禁止です @ 情報システム部門のリアル


読んでてどこも似たような悩みやジレンマを抱えているんだなぁとか思いましたが、こういった社内ルールを整備していて自分として陥るのが代替案を示せないもどかしさというものが出てきたりもします。

要はルールであれも禁止、これも禁止と謳っていても、社員さんは目の前の課題を抱えているわけで、「禁止はわかったんだけど、じゃあどうすればいいんだよ!」って言い分はあるにもかかわらず、それをどうすることもできずにただ、「ルールで決まっていることなんですいません・・・」というしかない状況になってしまっていることです。



社内ルールの目をかいくぐるんだ!


そもそも社内ルールなんてものができるのは、だいたい社内で問題が発生してからです。

こういったことが問題になりそうだからルールを整備しようというのは、業界や社会の流行から推測したり大きなニュースとして取り上げられることで、社内の危機管理があがってきてルールを整備しようなんて動きはまれです。

大抵は、「酔っ払ってPCなくしちゃいました・・・」とか「メール誤送信しちゃいました・・・」とか「家で仕事しようとデータ持ち帰ったらウィルスに感染してまして・・・」とか、まぁなんか色々ひどい事件が起きてから怒り狂ったトップダウンの指示が飛び込んできたりするわけです。


なので、当の本人とかには厳しく「次は事件を起すんじゃねぇぞ!」って気分で厳しいルールの中で運用をすることに躊躇はありませんが、真面目に仕事をしている人にとってはとばっちりを喰らっているわけで、「ルールでPCの持ち出しを禁止されても、クライアントとの交渉にPCって必要ですよね?」なんて言われたら、心の中で「そりゃそうでしょう」と思いつつも、「社内ルールの中で決まっていることなんで原則禁止になっています」と言うしかない状況となります。


ただ、そうは言っても社員の人たちも如何にルールに背かずに自分の仕事を効率的に進めるかってことで、(意図的であれ、無意識であれ)あれやこれや手段を講じてくるわけで、ルールを管理する情報システム部門とのせめぎ合いの日々となるわけです。

まぁ、こんなことをやっていると、世の中の法律って欠点だらけで如何にそれに抵触せずに悪いことをやるかって人たちと、それを解釈によって摘発したり埋めていく人たちとの戦いに想いをはせたりもするわけですが、法律に穴があるように社内ルールにも穴が出てきます

大体、IT業界を取り巻く動向って進歩が早すぎますから、それに追いつくようにルールを順応させていくのは無理があります。

結局は、その穴を突いて起こる事件と、その度に穴を埋めるために検討・対策の打ち合わせが開かれ、それを防ぐルールを整備していくという繰り返しになっているのが現状ではないでしょうか。



困ってるのにじゃあどうすればいいんだよ!


って、気持ちはよくわかるもののルールを管理・統率立場の中にいる人から見れば「ばれない様に使ってくださいね」とか「これはまだルールに当てはまらないので使えますよ」何てことは下手に言えないわけで、ルールの解釈も含めて社員の一存に任せてたりする部分もあります


統括する立場の情報システム部門が下手なことを言ったら、次から「これは情報システム部門がOKだしたので問題ないはずです」とか言われるわけなんで。

まぁ、そういう事を言われないようにどうしても使わざるを得ないという状況になれば、「基本的にこれはルールで禁止されているんですが、今回はイレギュラーケースとして許してることなんで次は無いですよ」なんて念には念を入れた取り交わしをしたりもしますけど。


「大容量のファイルをクライアントに送らなければならない」って課題を社員が言ってきたとして、「USBやDVDでの持ち出しは禁止です」とか「外部ストレージサービスへデータを転送してはいけません」とか言ったところで、その代替案を指し示すこともできない状況があります。

安全にデータを転送するための自社システムを用意しろとか思っているのかもしれませんが、こういった課題があるにもかかわらず、社内のIT投資ではコストの問題から導入が先送りされたりします。

なので、示せる代替案はせいぜい「なるべくファイルのデータを圧縮してください」とか「ファイルを分割することでメールにて送ってください」とか、ITって業務効率を上げるものなのになぁと思いつつも、かなり非効率な作業を社員に押し付けてたりもするわけです


あと、こういったルールを破るような人たちは結構ITリテラシが高かったりして、普段から自宅でも様々なサービスを利用してその利便性をよく理解していたりします。

なので、「これが社内でも使えるようにならないの?」って提案もしてきたりと、当然自宅の自由な環境に比べて社内の環境というのはひどく窮屈に感じていたりします。


社員が利用するソフトウェアは統一すべきか 」の中でも書きましたが、サポートする立場から見れば対象のソフトウェアや機器は限られていた方が当然楽になるんですが、普段色々なサービスや機器を使いこなす人から見れば、「何で俺の好みのものが入ってないんだよ」という不満が出てくるのは当然だと思います。



まとめ


まぁ、世の中ルールではなくツールや機能で制限をかけることができるものは多々あるので、実際はここまで煩くルールを誇示しなくても実際いいのだと思います。

ただ、そういったものを導入するのも結構コストがかかってくるので、運用ルールを整備して浸透させることで牽制させようという動きの方がはるかに安上がりで動きやすいのが現状です。

メールの誤送信を止めるため、それを防止するツールを導入するのに云百万とか見積もり見たら、「ルールで統制すればいいじゃん」ってお上の判断にもなるわけで。


煩いルールであれもこれも禁止される中で働くのは、先にも書いたようにITの利便性を損なってひどく非効率な職場が出来上がるわけですが、情報システム部門としては最低限の要望をかなえるための対策というものをきちんと整備した上で、どこまでやっていいのか・悪いのかを指し示すルールを作っていくのが必要なんだなと思うわけです。




前回、CakePHPをインストール したので早速アプリケーション開発に取り掛かっていきます。

フレームワークを使った開発といってもそれほど難しいものではありません。

構造と作り方のルールを最初に覚えてしまえば、開発は効率的に行えると思います。



CakePHPのディレクトリ構造


CakePHPはMVCモデルを採用しており、その構造もそれぞれのディレクトリに分かれています。

確認するディレクトリは主に、CakePHPのソースファイル内にあるappディレクトリです。


$ ls app/
Config   Controller  Locale  Plugin  Vendor  index.php  webroot
Console  Lib         Model   Test    View    tmp


見ればわかるのですが、Model、View、Controllerというディレクトリがあり、それぞれ対応するファイルを配置していきます

ModelはDB関連の設定ファイルを、ViewはHTML用のテンプレートを、Controllerはビジネスロジックを組み立てていきます。

もちろん、共通で使うようなライブラリを配置するディレクトリなどもありますが、最低限アプリケーションを作るうえでは必須ではないので、今回の解説からは一旦除きます。


今回の説明の中でもう1つ重要なディレクトリがConfigディレクトリです。

こちらは、CakePHPの設定ファイルが一式入っていますので、設定ファイルの編集といえばこの中にあるファイルを変更していきます。



CakePHPのControllerを作る


まずは、Controllerディレクトリの中身を見て行きます。

CakePHPをインストールした直後の初期状態では、AppController.phpとPagesController.phpという2つのファイルがあるかと思います。

このうち、AppController.phpはCakePHPの基本ファイルになるので何も触らずにそのままにしておきます。

PagesController.phpは、CakePHPの初期ファイルを制御しているプログラムですので、まずはこの中身を見て行きましょう。


<?

class PagesController extends AppController {

/**
 * Controller name
 *
 * @var string
 */
    public $name = 'Pages';

/**
 * This controller does not use a model
 *
 * @var array
 */
    public $uses = array();

/**
 * Displays a view
 *
 * @param mixed What page to display
 * @return void
 */
    public function display() {
    }
}

まず、クラスファイル名は好きに命名できますがCakePHPのルールでは複数形を採用することになっています。(複数形にしなくても動くのですが、そういうルールになっているので基本従いましょう)

単語を複数形(今回の場合はPages)にして、それにController.phpを付けます。

クラスファイル自体も同様です。


最初にメンバ変数$nameを定義していますが、これはコントローラーの名前でクラス名に採用した単語と同様のものをセットします。

次にメンバ変数$usesを定義しますが、これはモデルを利用する際にそのモデル名を配列でセットしていきます。

このクラスの中ではモデルは利用しない(そして、解説は次回のエントリに持ち越します)ので空の配列を指定しています。


最後のdisplayメソッド(アクション)ですが、これは自由に定義できます。

最初になにやら処理が埋め込まれていますが、displayメソッドの中身を一旦クリアして、下記のように書いて見ます。


public function display() {
    $this->set('string', 'Hello World');
    $this->render('display');
}


何をやっているかというと、AppControllerで定義されているsetメソッドを使い、View側にstringという名前の変数を渡せるように定義し、その中身に「Hello World」をセットしています。

次に、同じくrenderメソッドでView側のdisplayという名前のテンプレートファイルを呼び出すように定義しています。

これがdisplayアクションとして定義され、好きな処理の数だけアクションをメソッドとしてコントローラーに定義していきます。



CakePHPのViewを作る


一旦、Controllerから離れてView側のファイルを作ります。


$ ls
Elements  Emails  Errors  Helper  Layouts  Pages  Scaffolds

Viewディレクトリの中には、さらに多くのディレクトリがありますが、この中でまず確認するのは先ほど編集したPagesコントローラと同じディレクトリ名であるPagesディレクトリです。

ControllerとViewの関係はこのように同一の名前で紐付けられています


Pagesディレクトリの中身を見てみると、home.ctpという名前のテンプレートファイルがありますが、これはCakePHPの初期画面を表示するためのテンプレートファイルなので一旦無視します(削除してもかまいません)。

Pagesディレクトリに、先ほどControllerで呼び出すことにしている、display.ctpというファイルを作ります。

拡張子は、ctpとなるのでそのルールに沿ってファイル名を定義します。


<?php echo $string; ?>


Viewファイルの中身は、基本的にHTMLとして書けますが、処理を加えたい場合は上記のようにPHPのタグを書くことでその中身はPHPと同様にロジックが記述できます。

そして、echo処理している$stringは、先ほどControllerでセットしたstring変数の中身が入ってきます。

これで、ブラウザからアクセスしてみると


A Day In The Boy&#39;s Life-CakePHPでアプリケーション開発-1


というように、画面に「Hello World」の文字列が表示されているかと思います。
ちなみに、Controller側で定義するrenderメソッドを使ったテンプレートファイルの指定は、基本的に必要ありません。

デフォルトでアクション名と同じテンプレートファイルが呼び込まれます

ですので、アクション名と異なるテンプレートファイルを呼び出したい(例えば、複数の処理で共通で呼び出すテンプレートファイルがあるとか)場合は、


$this->render('hoge');

のように、異なるテンプレートファイルを呼び出す(上記の場合はhoge.ctp)ことを明示しますが、それ以外の場合はわざわざ定義する必要はありません。



CakePHPのURL構造


ここまでが、ごくごく基本的なCakePHPを使ったアプリケーション開発のフローです。

最後に疑問になってくるのが、何でブラウザからアクセスするだけで、Pagesコントローラーとdisplayアクションが呼び出されるかという部分です。


CakePHPのURL構造は、基本的(というのはURL構造は変更できるため初期の状態としては)に下記のようになってきます。


http(s)://ドメイン名/コントローラー名/メソッド名/パラメータ1/パラメータ2/・・・


ということなので、先ほど作ったHello Worldの画面を出すためには


http://www.example.com/pages/display/


というURLからでもアクセスが可能です。

なぜ、コントローラ名とアクション名をURLに付けなくてもPagesコントローラーとdisplayアクションが呼び出されるのかというと、CakePHPの設定ファイルであるroutes.phpにてその定義がされているからです。


/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/View/Pages/home.ctp)...
 */
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
    Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

最初の、Router::connectで/でアクセス(ドメイン名やIPアドレスだけ)した場合に呼び出すコントローラーとアクション名を定義しています。
第3引数のhomeはパラメータ名です。


次の、Router::connectは/pages/にアクセスした場合の挙動を定義しています。

実際この定義があるためにアクション名を省いた、http://www.example.com/pages/ というURLにアクセスしてみてもdisplayアクションが呼び出されます。

CakePHPのルーティングの設定は掘り下げていくとかなり深くなるので、別の機会にまとめたいと思います。


ここまでが、CakePHPを使った基本的なアプリケーション開発の流れです。

今後、違うエントリでもう少し掘り下げていきたいと思います。





最近、PHPで人気のフレームワークの1つであるCakePHP に触れる機会があったので、その情報をまとめていきたいと思います。

まずは、インストール編ということですが、環境としてはCentOS5.8(さくらVPS)上に2012年8月時点で最新のCakePHP2.2.1を使っています。

PHP自体のバージョンは5.3.3です。



CakePHPのインストール


フレームワークのインストールということですが、CakePHPの場合はそれほど難しいものではありません。

本家からソースファイルをダウンロードし、インストールするサーバー上に転送しておきます。

解凍したソースファイルを適当なディレクトリ(今回の場合は、/var/www/cakephp)に展開したら、Apacheの設定ファイルを変更します。


<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/cakephp/app/webroot/
    ServerName localhost.localdomain
    ErrorLog logs/error_log
    CustomLog logs/access_log common
</VirtualHost>


上記のように、展開したCakePHPのソースファイル内にある「app/webroot」をDocumentRootに設定します。

もし、どうしてもDocumentRootを動かせないという場合は、Aliasをきって逃げるということもできます。


Alias /cake/ "/var/www/cakephp/app/webroot/"


まぁ、上記のような回避策をとるよりはフレームワーク使うなら、全てサーバーの設定ははフレームワークに預けてしまった方が幸せだとは思いますが。


もう1つ設定するのが、CakePHPはmod_rewriteを使うのですが、その設定が.htaccessファイルに定義されているため、ファイルの設定内容が上書きできるように変更(AllowOverrideをAllにする)しておきます。


<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

インストールとしては、以上です。

これで、ブラウザからサーバーにアクセスしてみたら、CakePHPの画面が見えると思います。



CakePHPの設定


これで、インストールはできてはいるわけですが、ブラウザにアクセスしてみたらまず見る画面は大量のエラーメッセージではないでしょうか。


A Day In The Boy&#39;s Life-CakePHP初期エラー画面


これを1つ1つ解決していきましょう。

なお、サーバー環境によっては出るエラーの数やメッセージが異なってくるので、全てを網羅しているわけではありません。


- PHPのタイムゾーンの変更


Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in 


これは、CakePHPのエラーではなくPHPの設定ではありますが、PHPの設定ファイルにてタイムゾーンの設定がされていないから出るエラーです。


date.timezone = Asia/Tokyo


のように、タイムゾーンを設定してApacheを再起動します。


- キャッシュディレクトリ(tmp)の権限変更


Warning (512): /var/www/cakephp/app/tmp/cache/ is not writable [CORE/Cake/Cache/Engine/FileEngine.php, line 336]


このエラーはメッセージの通りで、CakePHPのディレクトリにあるキャッシュディレクトリへの書き込み権限がないことによるエラーです。


$ chown -R apache:apache cache/


として、Apacheユーザー/グループへの書き込み権限を付与します。

似た、エラーメッセージとして


Your tmp directory is NOT writable.


というものもあるので、cacheディレクトリだけでなく、その1つ上のtmpディレクトリへの書き込み権限を合わせて変更しておいた方がよいでしょう。


- Security.saltとSecurity.cipherSeedの変更


Notice (1024): Please change the value of 'Security.salt' in app/Config/core.php to a salt value specific to your application [CORE/Cake/Utility/Debugger.php, line 809]

Notice (1024): Please change the value of 'Security.cipherSeed' in app/Config/core.php to a numeric (digits only) seed value specific to your application [CORE/Cake/Utility/Debugger.php, line 813]


上記2つのエラーは、CakePHPをインストールすると初期画面では必ず表示されるメッセージでしょう。

何れもCakePHPがセキュリティを上げるためにランダムな入力データが必要になるためで、ユーザー自身に設定して欲しくて出ているエラーです。


設定箇所は、CakePHPのcore.phpを変更します。


/**
 * A random string used in security hashing methods.
 */
    Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
    Configure::write('Security.cipherSeed', '76859309657453542496749683645');


デフォルト値のままでは使うことができないので、適当な文字列に変更します。

一応、デフォルト値に対して1文字でも付け加えてあげたらこのエラーは消えるのですが、セキュリティに関連する部分なのできちんと設定しておきましょう。


真面目にランダムな文字列を生成しだすと少し手の込んだスクリプトが必要ですが、簡易的なものであれば下記のようなもので任意の文字列や数値を出すことはできます。


<?php

// Security.salt用
echo sha1(uniqid(rand(), TRUE)) . PHP_EOL;
// Security.cipherSeed用
echo gmp_strval(gmp_random(2)) . PHP_EOL;

とはいっても、ランダムな文字列なので適当にキーボードをガチャガチャ叩いて設定してしまってもよいのですが。


- データベース接続の設定変更


Your database configuration file is NOT present.
Rename APP/Config/database.php.default to APP/Config/database.php


このエラーもCakePHPの初期画面で必ず表示されるメッセージです。

データベース接続用の設定ファイルが無いよってエラーで、ページの最後の方に出る


Warning (2): include_once(/var/www/cakephp/app/Config/database.php): failed to open stream: No such file or directory [CORE/Cake/Model/ConnectionManager.php, line 68]

Warning (2): include_once() [http://php.net/function.include]: Failed opening '/var/www/cakephp/app/Config/database.php' for inclusion (include_path='/var/www/cakephp/lib:.:/var/www/lib:/usr/local/lib/php') [CORE/Cake/Model/ConnectionManager.php, line 68]

この辺のエラーメッセージとセットで出てきます。

対処としては、最初の警告メッセージに書かれているようにdatabase.phpという設定ファイルを作れば解決します。

サンプルの設定ファイルとして、database.php.defaultというファイルがあるのでまずはこれをリネームします。


$ mv database.php.default database.php


ただ、これだけでは設定ファイルの中身が正しくないですし、データベースも作成されていないですから当然うまくいきません。

設定ファイルの中身はデフォルトはMySQLを利用する場合となっていますので、これを環境に応じて変更します。


ここでは、PostgreSQLを使った場合の例を書いていきます。

まずは、データベースとユーザーの作成です。


$ createdb cakephp
CREATE DATABASE

$ createuser -P cake
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE


これで、データベース側の準備ができたので、database.phpを設定変更します。


class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Postgres',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'cake',
        'password' => 'CakePHP',
        'database' => 'cakephp',
        'prefix' => '',
        //'encoding' => 'utf8',
    );
}

デフォルトの設定ファイルには、$testの記述もありますが、こちらはテスト用など複数のDBを使い分けたい場合に使いますので、無くても動作します。

これで、一通りのエラーも無くなり、CakePHPでアプリ開発をする準備が整いました。


A Day In The Boy&#39;s Life-CakePHP初期画面


CakePHPを使ったアプリケーション開発編へ続きます。