北海道のとある企業で働くエンジニアのブログ

北海道でエンジニアとして働いています。技術的なことや感じたことを書きます。最近はブロックチェーンにハマってます。

FuelPHP + MySQL で PHP Webアプリケーションを作ってみる ― データベース構築

ここでは、こんな感じのエンティティ構成でデータベースを構築してみます。
f:id:nw_ocean:20140401001751p:plain

ちなみに「A5:SQL Mk-2」というツールを使っています。
A5:SQL Mk-2 - フリーの汎用SQL開発ツール/ER図ツール

データベース作成

文字コードUTF-8」を指定して「USER_MANAGEMENT」というデータベースを作成します。

$ mysql -u root
mysql> CREATE DATABASE `USER_MANAGEMENT` DEFAULT CHARACTER SET UTF8;
Query OK, 1 row affected (0.02 sec)

無事作成されたか確認。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cdcol              |
| mysql              |
| performance_schema |
| phpmyadmin         |
| test               |
| user_management    |
| webauth            |
+--------------------+
8 rows in set (0.03 sec)

mysql> SHOW CREATE DATABASE USER_MANAGEMENT;
+-----------------+-------------------------------------------------------------
-------------+
| Database        | Create Database
             |
+-----------------+-------------------------------------------------------------
-------------+
| USER_MANAGEMENT | CREATE DATABASE `USER_MANAGEMENT` /*!40100 DEFAULT CHARACTER
 SET utf8 */ |
+-----------------+-------------------------------------------------------------
-------------+
1 row in set (0.00 sec)

テーブル作成

先ほどのER図からDDLを作成し、テーブルを作ってみます。

mysql> USE USER_MANAGEMENT;
Database changed
mysql> create table DEPT_MST (
    ->   DEPT_CD INT not null auto_increment comment '所属CD'
    ->   , DEPT_NAME VARCHAR(50) not null comment '所属名'
    ->   , constraint DEPT_MST_PKC primary key (DEPT_CD)
    -> ) comment '所属マスタ' ;
Query OK, 0 rows affected (0.06 sec)

mysql> create table USER_MST (
    ->   USER_CD CHAR(5) not null comment '社員CD'
    ->   , DEPT_CD INT not null comment '所属CD'
    ->   , USER_NAME VARCHAR(50) not null comment '社員名'
    ->   , ENTER_DATE DATE not null comment '入社年月日'
    ->   , constraint USER_MST_PKC primary key (USER_CD)
    -> ) comment '社員マスタ' ;
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW TABLES;
+---------------------------+
| Tables_in_user_management |
+---------------------------+
| dept_mst                  |
| user_mst                  |
+---------------------------+
2 rows in set (0.00 sec)

テストデータ投入

せっかくテーブルを作ったので、作成した社員マスタ、所属マスタにデータを入れてみます。

mysql> INSERT INTO DEPT_MST(DEPT_NAME) VALUES('総務部');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO DEPT_MST(DEPT_NAME) VALUES('経理部');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT INTO USER_MST(USER_CD, DEPT_CD, USER_NAME, ENTER_DATE)
    -> VALUES('00001', 1, '総務 太郎', '2005-04-01');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO USER_MST(USER_CD, DEPT_CD, USER_NAME, ENTER_DATE)
    -> VALUES('00002', 1, '総務 次郎', '2010-10-01');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO USER_MST(USER_CD, DEPT_CD, USER_NAME, ENTER_DATE)
    -> VALUES('00003', 2, '経理 雄太', '2008-04-01');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT USER_CD, DEPT_NAME, USER_NAME, ENTER_DATE FROM USER_MST
    -> INNER JOIN DEPT_MST ON USER_MST.DEPT_CD = DEPT_MST.DEPT_CD;
+---------+-----------+------------+------------+
| USER_CD | DEPT_NAME | USER_NAME  | ENTER_DATE |
+---------+-----------+------------+------------+
| 00001   | 総務部    | 総務 太郎 | 2005-04-01 |
| 00002   | 総務部    | 総務 次郎 | 2010-10-01 |
| 00003   | 経理部    | 経理 雄太 | 2008-04-01 |
+---------+-----------+------------+------------+
3 rows in set (0.00 sec)


これでデータベースの構築とテーブル作成が完了です。

FuelPHP + MySQL で PHP Webアプリケーションを作ってみる ― ローカル環境構築編

PHPの勉強も兼ねて、PHP開発環境を構築してFuelPHPでデータベースを使った簡単なWebアプリケーションを作ってみます。

環境

今回構築しようとしている環境はこんな感じ↓

PHP環境の構築

XAMPPのインストール

ここでは、XAMPPを使って簡単にPHP開発環境を整えます。

XAMPP プロジェクト日本語トップページ - SourceForge.JP

ページ内にある[ダウンロード]から、Windowsインストーラーをダウンロードします。

f:id:nw_ocean:20140329121217p:plain

ダウンロードできたらインストーラーを実行。使わなそうなコンポーネントは除外。

f:id:nw_ocean:20140329121613p:plain

適当なフォルダを指定してをインストール開始。ここでは「C:\xampp」にインストールしました。

XAMPPの起動

XAMPPのインストールが終わったら、さっそく起動してみます。
[XAMPP Control Panel]がインストールされているので、それを起動します。
f:id:nw_ocean:20140329123037p:plain

[Apache]の[Start]ボタンを押してみます。
無事に起動できたら、ブラウザで「http://localhost/xampp/」にアクセスしてみます。

「XAMPP Windows版へようこそ!」みたいな画面が表示されればOK。

環境変数の設定

念のためWindows環境変数PHPへのパスを追加。
[コントロール パネル > システムとセキュリティ > システム > システムの詳細設定 > 詳細設定 > 環境変数 > システム環境変数]の[PATH]に「;C:\xampp\php」を追加しています。
f:id:nw_ocean:20140329122052p:plain

確認

コマンドプロンプトPHPのバージョンを確認してみます。

$ php -v
PHP 5.5.9 (cli) (built: Feb  5 2014 13:02:39)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

こんな感じでバージョンが表示されればOK。

MySQL

MySQLの起動

MySQLはXAMPPに含まれているので、XAMPP Control PanelからMySQLを起動します。

環境変数の設定

PHPと同様に、Windows環境変数PATHにMySQLへのパスを追加します。
ここでは「;C:\xampp\mysql\bin」を追加しました。

確認

コマンドプロンプトMySQLに接続できればOK。

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.16 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ちなみにmysqlコマンドから抜けるには「\q」をタイプします。

mysql> \q
Bye

NetBeans

NetBeansのインストール

下記サイトからNetBeansインストーラーをダウンロードします。今回開発するのはPHPなので、PHPのものを選択するか、全部入りのものを選択してください。
https://netbeans.org/downloads/?pagelang=ja

f:id:nw_ocean:20140329134348p:plain

ダウンロードが完了したらインストーラーを実行します。インストーラー実行時にJava環境がなくて継続できない場合は、ここからJava実行環境をインストールします。
http://java.com/ja/download/

NetBeansの起動確認

インストールが終わったら、NetBeansを起動してみます。
[ツール > オプション > PHP]でPHPへのパスが未設定の場合は、先ほど環境変数に設定したPHPへのパスを設定してください。

f:id:nw_ocean:20140329125625p:plain

FuelPHPプラグインをインストール

[ツール > プラグイン > 使用可能なプラグイン]から[PHP FuelPHP Framework]をインストールします。(右上にある[検索]に「FuelPHP」を入れるとすぐ見つかります)

f:id:nw_ocean:20140329130008p:plain

[ツール > オプション > PHP > フレームワークおよびツール]に[FuelPHP]があることを確認します。

f:id:nw_ocean:20140329130637p:plain

Composerのインストール、設定

FuelPHPではComposerが必須らしいので、ここからWindowsインストーラー(Composer-Setup.exe)をダウンロードします。
https://getcomposer.org/download/

ダウンロードしたら、インストーラーを実行してComposerをインストールします。

インストールが完了したら、NetBeansの[ツール > オプション > PHP > コンポーザー]でパスを設定します。
ここでは、「C:\ProgramData\ComposerSetup\bin\composer.phar」にインストールされていました。

f:id:nw_ocean:20140329132234p:plain

Git for Windows

Composerではgitを使うので、Git for Windows(msysgit)をインストールします。
ここでは「Git-1.9.0-preview20140217.exe」をダウンロードしました。
http://msysgit.github.io/

環境変数にgitへのパスを追加します。
ここでは「C:\Program Files (x86)\Git\bin」を追加しました。

$ git --version
git version 1.9.0.msysgit.0

サンプルプロジェクトの作成

環境変数などを変えているため、NetBeansを再起動します。

[新規プロジェクト]からFuelPHPフレームワークとして指定して新しいプロジェクトを作成してみます。
(作成するパスはXAMPPをインストールしたフォルダのhtdocs配下にします)

f:id:nw_ocean:20140329134055p:plain

NetBeansの右下にあるコンポーザーからの出力にエラーが表示されていないことを確認します。
f:id:nw_ocean:20140329142101p:plain

確認

ブラウザから「http://localhost/作成したプロジェクト名/public/」にアクセスして、「Welcome!」が表示されれば、ひとまず環境構築は完了です。
f:id:nw_ocean:20140329141955p:plain


おつかれさまでした!

PHP文字列の基本

PHPの文字列について、基本的なことを記載。
PHP: 文字列 - Manual

引用符による違い

引用符

シングルクォーテーションによる文字列定義では、エスケープや変数展開がされない。
バックスラッシュ、シングルクォーテーション自体のエスケープ程度。

$myName = 'Taro';
echo 'My name is $myName.'; // 出力:My name is $myName.

二重引用符

ダブルクォーテーションによる文字列定義では、エスケープや変数展開が行われる。

$myName = 'Taro';
echo "My name is $myName."; // 出力:My name is Taro.

Nowdocとヒアドキュメント

引用符で囲まずに文字列を定義する方法。

Nowdoc

シングルクォーテーションと同様に、エスケープや変数展開がされない。

$nowDoc = <<<'EOD'
Hi! I am $myName!!
Nice to meet you!!!
EOD;

echo $nowDoc;
// Hi! I am $myName!!
// Nice to meet you!!!

ヒアドキュメント

ダブルクォーテーションと同様に、エスケープや変数展開が行われる。

$hearDoc = <<<EOH
Hi! I am $myName!!
Nice to meet you!!!
EOH;

echo $hearDoc;
// Hi! I am Taro!!
// Nice to meet you!!!

複雑な (波括弧) 構文

「{~}」を使って複雑な式を文字列定義の中に含めることができる。

$ary = array('key1'=>'val1', 'key2'=>'val2');
echo "value of key1 is {$ary['key1']}."; // value of key1 is val1.

三菱東京UFJ銀行のフィッシング詐欺メールが来た

三菱東京UFJ銀行を語る怪しげなフィッシング詐欺と思われるメールが届いたので晒してみます。

f:id:nw_ocean:20140323113134p:plain

以下、突っ込みどころ。

  • 「こんにちは!」とか金融機関のセキュリティ確認メールにしては口調が軽すぎない?
  • 「あなたの~」が3回続くなど、日本語の文章としては不自然。
  • HTMLメールだったのでリンク先URLは一見それっぽく見えるが、実際には全然違うURLに飛ばそうとしている。
  • 「貴様」ってお前は何様のつもりかとw

ちなみに、リンク先のURLにはパラメータとして受信したメールアドレスが付与されていたので、どのメールアドレスから来たのかが分かるような仕組みになっている。

念のため「フィッシング対策協議会」というところに通報しておきました。
フィッシング対策協議会 Council of Anti-Phishing Japan

間違ってリンク先をクリックして、インターネットバンキングの情報を入れてしまう人もいるんだろうな…
被害にあう方が一人でも少なくなることを祈ります。

PHPで文字列比較

PHPで文字列比較を行う際、注意しないとハマることになりそうな点のメモ。

結論から

文字列比較を厳密に行いたい場合は、何はともあれ「===」を使用すること!
(もしくはstrcmp())

検証

検証環境

PHP 5.5.9 (cli) (built: Feb 5 2014 13:02:39)

大文字と小文字の区別

これはイメージ通り。== も === も変わらず、きちんと区別してくれる。
逆に、区別したくない場合は大文字/小文字のどちらかに変換してから比較するか、 strcasecmp() を使う。

結果
"aaa" == "aaa" true
"aaa" === "aaa" true
strcmp("aaa", "aaa") 0
"aaa" == "AAA" false
"aaa" === "AAA" false
strcmp("aaa", "AAA") 1
strcasecmp("aaa", "AAA") 0

数値と文字列の確認

これは注意が必要。== だと数値と文字列の比較で「うまいこと」解釈してくれるおかげで、「"1.0"と1が等しい」と判定される。

結果
"1" == 1 true
"1" === 1 false
strcmp("1", 1) 0
"1.0" == 1 true
"1.0" === 1 false
strcmp("1.0", 1) 2

数字文字列と数字文字列の確認

これにも注意が必要。== は柔軟なのでなんと「"1"と"1.0"が等しい」と判定される。

結果
"1" == "1" true
"1" === "1" true
strcmp("1", "1") 0
"1.0" == "1" true
"1.0" === "1" false
strcmp("1.0", "1") 2

検証したソースコード

今回検証したソースコードはこんな感じ↓

echo '■大文字/小文字区別の確認 ―――――';
echo '"aaa" == "aaa": '.(("aaa" == "aaa") ? 'true' : 'false');
echo '"aaa" === "aaa": '.(("aaa" == "aaa") ? 'true' : 'false');
echo 'strcmp("aaa", "aaa"): '.strcmp("aaa", "aaa");
echo '"aaa" == "AAA": '.(("aaa" == "AAA") ? 'true' : 'false');
echo '"aaa" === "AAA": '.(("aaa" === "AAA") ? 'true' : 'false');
echo 'strcmp("aaa", "AAA"): '.strcmp("aaa", "AAA");
echo 'strcasecmp("aaa", "AAA"): '.strcasecmp("aaa", "AAA");

echo '■数値と文字列の確認 ―――――';
echo '"1" == 1: '.(("1" == 1) ? 'true' : 'false');
echo '"1" === 1: '.(("1" === 1) ? 'true' : 'false');
echo 'strcmp("1", 1): '.strcmp("1", 1);
echo '"1.0" == 1: '.(("1.0" == 1) ? 'true' : 'false');
echo '"1.0" === 1: '.(("1.0" === 1) ? 'true' : 'false');
echo 'strcmp("1.0", 1): '.strcmp("1.0", 1);

echo '■数字文字列と数字文字列の確認 ―――――';
echo '"1" == "1": '.(("1" == "1") ? 'true' : 'false');
echo '"1" === "1": '.(("1" === "1") ? 'true' : 'false');
echo 'strcmp("1", "1"): '.strcmp("1", "1");
echo '"1.0" == "1": '.(("1.0" == "1") ? 'true' : 'false');
echo '"1.0" === "1": '.(("1.0" === "1") ? 'true' : 'false');
echo 'strcmp("1.0", "1"): '.strcmp("1.0", "1");

PHP技術者への転身

転職しました

2014年3月にSI企業からWeb系サービスを展開している企業に転職しました。

転職の理由はプライベートな理由なので、巷で見かける「SI業界が嫌になって…」といったことではありません。

SI企業には10年程在籍していたので、SI業界の将来には色々と思うこともありますが、それはまた後日。

PHP技術者へ

これまではJavaや.NETで、自社以外の企業のためにシステムを開発することがほとんど。

自社サービスを展開するWeb業界への転身ということで、求められる資質も技術も異なってきます。

今月から本格的に新天地で働いていますが、そこら辺の違いを感じることもしばしばです。

 

新天地で使う主なプログラミング言語PHP

全然経験ないですが、ソースコードを追ってある程度理解することはできるので何とかなっているという状況です。

今はまだ設計フェーズなのでプログラミングを行うことはないのですが、実装フェーズに入った時にどこまでやれるのか…

PHP技術者認定試験

せっかく知らない言語を習得しようとしているので、体系的に技術を身につけたいと思っています。

そこで目を付けたのがPHP技術者認定認定機構が実施している認定試験。

 

今後、普段の業務で必要に迫られるので実装スキルはある程度身に付くとは思うので、より体系的にスキルアップするためにPHP技術者認定試験を活用しようと考えています。

 

そこで、

2014年12月末までにPHP技術者認定初級試験を受験します!(できれば上級試験も)

 

なぜこんな宣言をしたかというと、PHP技術者認定機構がこんなキャンペーンをやってるから、というのもあります(笑)

http://www.phpexam.jp/summary/excamp/?_layoutmode=on

 

PHP技術者としてスキルアップするために得た知識などはこのブログでも随時アップしていこうと思います。

 

北海道のSI企業が関東の仕事をする際のモデル

お客様は東京、1次請けのSI企業も東京、設計から開発は北海道の企業が担当する。
北海道ではそういう仕事が多いのではないでしょうか。

作業場所と担当分け

私の所属する会社では、以下のような担当分けが一般的になっています。

・要件定義(場所:東京)
    東京の1次請け
・基本設計(場所:東京)
    東京の1次請け、北海道のSI企業から数名
・詳細設計(場所:北海道)
    北海道のSI企業
・実装・単体テスト(場所:北海道)
    北海道のSI企業
結合テスト(場所:東京)
    東京の1次請け、北海道のSI企業から数名
・システムテスト(場所:東京)
    東京の1次請け、北海道のSI企業から数名

いわゆるニアショアを活用した一般的なウォーターフォール開発では、上記のようなフェーズ分けで担当作業や作業場所が決定されることがよくあります。

これがベストか

果たして、基本設計、実装・単体テスト以降のフェーズを東京で行うことは、お客様、開発側のメンバーにとってベストな選択なのでしょうか。

長期出張を伴う仕事はメンバーに負担をかけますが、お客様の近くにいることで得られる目に見えないことはたくさんあり、遠隔地にいることのデメリットもあります。

テレビ会議を積極的に活用する、東京採用メンバーをブリッジ役にするなど、それぞれの状況に応じた工夫というのも必要となってきます。

もし貴方の会社でもこのような担当分けでプロジェクトを進めようとご検討でしたら、お客様、オンサイトメンバー、オフサイトメンバーのそれぞれにとってより良い仕事の進め方を模索してみてはいかがでしょうか。