【CakePHP】1人前のケーキ職人になるまで

パティシエじゃないよエンジニアだよ

ローカル開発環境構築 後編

こんにちは、前回yum updateの時点でエラーが起こりずっと戦っていたのですが、学校ではなく家の回線にしたら難なく通りました伊藤です。

結局、何がダメだったのかわかりませんが調べた対策法でやってみても治らない時は回線を変えるというのもアリかもしれませんね...

インストールしておくもの

Cyberduck

 仮想マシン上のファイルを簡単に扱えるようにするファイル転送ツールです。こちらも、公式サイトから Mac用のインストーラをダウンロードして展開しましょう。
公式サイト Cyberduck | Libre FTP, SFTP, WebDAV, S3, Backblaze B2 & OpenStack Swift browser for Mac and Windows

また、インストールした後はアプリケーションフォルダに移動してあげてください。
環境設定で「'.'で始まるファイルを表示」「ダブルクリックしたファイルを外部エディタで開く」にチェックをしておくと便利です。
エディタはAtomなりSublimeなりよく自分の使うものを指定しておけばいいでしょう。

サーバーに接続してみる

さて、Cyberduckの設定が終わったら、設定を反映させるために再起動してください。 サーバーに接続してみましょう。
左上にある「新規接続」をクリックすると、下のような画面が出てきます。

f:id:nagisa-ito:20171105135130p:plain

上から、
①SFTP(SSHによる暗号化FTP)
②前回、サーバーを立ち上げた時に設定したIPアドレス(前回設定したものは、192.168.33.10)
③ユーザー: vagrant
④パス: vagrant
で、オッケーです。 また、このリンクをブックマークしておくと便利でしょう。

試しに動かしてみる

Cyberduckから、 vagrantフォルダの直下にフォルダを作ってあげます。ここでは、「php」という名前にしました。
f:id:nagisa-ito:20171105140537p:plain

そのフォルダの中に、"index.php"というファイルを作ってあげて、ダブルクリックするとエディタが立ち上がるので
f:id:nagisa-ito:20171105140533p:plain
としてあげましょう。

★ターミナルに移動して、phpフォルダの中で

php -S 192.168.33.10:8000

としてあげれば、サーバーがたち上がります。

すると
f:id:nagisa-ito:20171105141041p:plain
とターミナルに表示されるので、ターミナルから指定されたリンクにアクセスしてみましょう。ここでは http://192.168.33.10:8000 です。

phpのファイルが表示されていればオッケーです。終了する時はターミナルで Ctrl-C で終了します。
再開する時は、また★の部分のコマンドを打ってあげれば再開できます。


<参考にしたサイト>

https://dotinstall.com/

ローカル開発環境構築 前編

今回は、自分のMacに構築したはずの環境がうまく動かなかったので、やり直しもかねて自分用にメモしたいと思います。
新しく何かを始める時に、環境構築が個人的に一番しんどいです。なぜかエラーはいたりされて、沼にズブズブと...

はじめにインストールしておくもの

Virtual Box

VirtualBoxとは、オープンソースの仮想化ソフトウェアの一つです。コンピュータ上に仮想的なコンピュータ(仮想マシンVM:Virtual Machine)を構築し、その中でOSを起動して操作することができます。

公式サイトから、MacOS用のパッケージを選択し、インストールしておきましょう。以前のバージョンがすでにインストールされている場合は最新のものに上書きされます。インストーラの手順にしたがって操作し、設定はデフォルトのままで大丈夫です。

※注意※
以下で示すVagrantは最新のVirtual Boxに対応していないので以前のバージョン(5.1.30)をインストールしましょう。(2017/10/30時点)
最新版をインストールすると、後でVagrantを立ち上げる時にエラーがでます。

公式サイト
Oracle VM VirtualBox

Vagrant

VagrantVirtualBoxを簡単に扱うためのツールです。こちらも、先ほどのようにインストールしていきましょう。こちらは最新版で問題ないと思います。

公式サイト
Vagrant by HashiCorp

サーバーを立ち上げてみる

ターミナルを起動して、以下のコマンドを実行します。

mkdir フォルダ名
// ホームディレクトリ直下に仮想マシンをまとめるためのディレクトリを作成します。

cd  フォルダ名

mkdir 仮想マシン名
// 先ほどのディレクトリの直下に仮想マシンを作るディレクトリを作成します。

cd 仮想マシン名

vagrant init bento/centos-6.8
// 仮想マシン設定用のVagrantfileを作成します。

sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile
// Vagrantfileを編集します。エディタを起動してもいいのですが、このコマンドをそのまま実行すれば大丈夫です。IPアドレスを設定しました。

vagrant up 
// 仮想マシンを起動します(すごく時間がかかります。)

vagrant status
// 仮想マシンの状態を確認します。

↓この時点で、ターミナルに"running"という表示があればOKです。
f:id:nagisa-ito:20171030153539p:plain

仮想マシンにアプリケーションをインストールする

さて、続いてPHPrubyをインストールしていくのですが、コマンドで一気にインストールしていきます。

vagrant ssh
// サーバーに接続

sudo yum -y update
// OSを最新状態にアップデート(時間かかります)

sudo yum -y install git
// スクリプトを入手するためのgitをインストール

git clone https://github.com/dotinstallres/centos6.git
// gitを使ってアプリケーション設定用のスクリプトをダウンロード

cd centos6
// centos6フォルダができるのでそちらに移動

./run.sh
// スクリプトを実行(時間かかります)

exec $SHELL -l
// もろもろの設定を反映

ここまで書いたのはいいのですが、なぜかエラーを吐いたので続きは次回に...

➡︎ラボの回線でずっといじってたんですが、諦めて家に帰って家の回線でyum updateしたら難なく通りました。時間カエシテ...

<参考にしたサイト>

https://dotinstall.com/
qiita.com

【CakePHP】MVCアーキテクチャとは?

さてさて、今回は前回の続きでMVCアーキテクチャについて勉強していきます。

MVCの概念

MVCとはModel・View・Controllerの略で、処理を3つの役割に分割して実装する手法です。

Model

アプリケーションデータ、ビジネスルール、ロジック、関数など。ここでは、処理のメインロジックやデータアクセスを担当します。

View

グラフや図などの任意の情報表現、処理結果として画面表示(HTML出力)を担当します。

Controller

入力を受け取りmodelとviewへの命令に変換する。クライアントよりのリクエストを直接受け取って処理を行う、一番前面となる部分で、文字通りModelやViewを「制御」します。

*イメージ
f:id:nagisa-ito:20171023151506p:plain

Controllerは入力された情報を基にModelに命令し、Modelはデータと連携して処理を行い、処理結果をControllerに返します。
Controllerはその返ってきた処理結果データをViewに渡し、Viewはデータを基にHTML出力処理を行います。
ControllerはModelとViewの仲介役を果たします。

メリット

具体的にどうすればいいの、ということになりますが例えばPHPでは
PHP部分 : Model, Controller
HTML部分 : View

をむやみに埋め込みをせず、分けて書くことにあります。 短いコードだとあまり実感できませんが、大規模なものになってくると
– ビューとコントローラを分けることでデザイナとプログラマの作業分担をしやすくなる。
– コントローラとモデルを分けることで同じ処理を行う時にコピーペーストを行う必要がなくなる。
– さらにモデルをドメイン固有モデルと共通モデルとに分ける事で、他のシステムで使い回しても影響がない部品(=共通モデル)が明確になり、再利用性が高まる。

などのメリットがあります。


<参考にしたサイト>

www.objective-php.net

www.ecoop.net

CakePHPとは何なのか

お久しぶりです。卒論の中間発表が無事終わりウキウキの筆者です。
ウキウキ過ぎて中間発表を終えた帰りにFF12 TZAを買ってきました。小学生ぶりに絶賛プレイ中でございます。

さて、今回はCakePHPとは何かをさらっと紹介しておきます。

CakePHPとは?

CakePHPとは、PHPフレームワークです。 Ruby on Railsの影響を強く受けており、Railsの高速開発とPHPの機動性を兼ね備えたフレームワークとなっています。

この「CakePHP」によりウェブ開発を単純に簡単にできるようになりました。

特徴

統合された柔軟なO/Rマッピング

MySQLPostgreSQLSQLiteMicrosoft SQL Serverを標準サポート。
SQL文を簡単に簡単に書けます。

フォームバリデーション機能

数値チェックやパスワードの長さが8文字以上あることなどバリデーションルールを定義することができます。

scaffolding機能

簡単なコントローラをひとつ用意するだけで、テーブルの一覧・追加・削除・編集(Create,Read,Update,Delete)の画面などを簡単に実装することができるといった機能を提供されております。

MVCアーキテクチャ

MVCモデルとは、プログラムをモデル(Model)、ビュー(View)、コントローラー(Controller)という3つに分けて設計する手法のことをいいます。
詳しくに関しては次回説明します。

高い後方互換性。

下位バージョンからのアップグレードをサポートする公式移行ガイド及びUpgrade shell。

まとめ

PHPでアプリ作ってるって話を友人にしたところ、じゃあ素のSQL文書いてるのか~すごいね...って言われたのはこういうことだったんですね...!
しかし便利だからと行っていきなりCake使うのも中身がわからないままだ思うので、PHPから勉強するべきだとは思います。
また見知らぬ単語が出てきたので、要勉強です。CakePHPの公式サイトかわいい。

<参考にしたサイト>
cakephp.org
www.sejuku.net

オブジェクト指向とは何か

さて、今回はオブジェクト指向について勉強します。

プログラミングをしていると、必ず聞く用語、オブジェクト指向
オブジェクト指向という単語を聞くだけで正直うわっとなってしまいますが、そうなってしまうのはオブジェクト指向の定義が曖昧で、明確な答えが無いかららしいです。

確かに、Google等で調べてみてもいろんなサイトが様々な解説をしているのでわかりづらくなることも有ると思います。

ここでは、ざっくりとオブジェクト指向について話せるようになるくらいのレベルまで理解できたらなと思います。

オブジェクト指向とは?

オブジェクト指向とは、システムをオブジェクト同士の相互作用とみなす考え方のことです。
そもそもオブジェクトって何だよ、っていう話ですが、オブジェクトは内部構造を持つデータです。

例えば、ここに1匹の猫がいるとします。猫は、4本の足があり、目があり、耳があり、鼻がありますね。そういうあらゆるものがオブジェクトになります。

「猫」のオブジェクト
内部構造:
     ー耳
     ー目
     ー鼻
     ー口
     ー尻尾
     ー足

なんのために有るのか?

オブジェクト指向で書く理由、それは変更に対して柔軟に対応するためです。

オブジェクト指向によるアプリケーション開発は、変更されない箇所を軸に、頻繁に変更される箇所をクラスに抽出するプログラミングスタイルです。

例えば、格闘ゲームのシステムを作るとします。
そのゲームは50人のキャラクターが操作できて、それぞれアクションや繰り出す技が違います。そのキャラクターを一人ずつ設定していくのもいいですが、基本的な「走る」「ジャンプする」「ガードする」「攻撃する」のコマンドは誰でも持っているので、これをいちいち設定するのは面倒ですよね。ですが、必殺技や特殊コマンドはそれぞれのキャラクターで全然違ってきます。その場合は、基本コマンドを軸に、特殊コマンドをクラスに抽出します。そうすることで作業がとても楽になってきます。

オブジェクト指向三原則

カプセル化

カプセル化とは、オブジェクト指向プログラミングの特徴のひとつであり、
「他のクラスに見せたくない」もしくは「他のクラスから見えなくても良い」フィールドやメソッドを、private に設定すると見えなくできるということです。

例えば、あるエレベーターがあるとします。私たち乗る側から見たエレベーターの機能は、「開閉ボタン」と「階層ボタン」のみです。しかし、裏側のシステムでは管理のための非常に細やかなプログラムが動いています。

ここで、エレベーターのボタン以外に、裏側で動作するはずの機能ボタンがあるとしたらどうなってしまうでしょうか?もし、そのボタンを押してしまえば、予想しない動作が怒り、エレベーターがギロチンカッターになってしまう可能性もあるのです。

そのため、他のクラスに見せない、使用できないようにするためにカプセル化は非常に大切な原則になります。

継承

継承は親クラスの機能を受け継ぐ機能です。

例えば「猫」と「犬」というオブジェクトを作りたい時、「動物」というクラスをあらかじめ作っておけば、猫も犬も動物なので「動物」クラスを継承することができます。動物クラスにパラメータやメソッドが定義されているので、犬や猫オブジェクトでいちいち定義する必要性がなくなりますね。

また、「動物」クラスに変更を加えても、その変更が犬や猫にも反映されるので管理が楽になります。

ポリモーフィズム

クラスによって同一のメソッドで異なる処理が行えるという性質をポリモーフィズムといいます。

例えば、「人間」という抽象クラスに「挨拶」というメソッドがあるとします。
人間クラスを実装した「日本人」の挨拶メソッドは「こんにちは」ですし、「アメリカ人」の挨拶メソッドは「Hello」ということです。


メリットは、「人間」を使う側は「人間」というクラスにどの国籍の人が入ってるのかをしらなくても、「挨拶」をさせれば何かしらの挨拶をできることが確認できるので、実際の中身を気にしなくてもいいらしいです。

まとめ

オブジェクト指向について勉強してみましたが、簡単に説明できるくらいにはなったかなーと思います。ただ、実際に使ってみないと理解できない部分もあるのでそのあたりはまた追々していきたいですね。横文字覚えるの苦手なので頑張ります。。。

<参考にしたサイト>
eng-entrance.com

qiita.com

javalove.hatenablog.com

【PHP】覚えておきたい関数

前回、PHPを始める前に関数は把握しておきましょうと言いましたが、実際どのような関数があるか紹介します。

簡単なアプリを作成した時に、これはよく使ったし便利だなーと思った関数一覧になります。
 

関数を利用する時の注意点

関数を使う前に、PHPのバージョンを確認しましょう。

開発環境では使えても、実際にサーバーにアップロードするとバージョンが違って使えない場合があります。

 

覚えておきたい10の関数

指定した変数に関する情報を解りやすく出力する関数。その他にvar_dump()などがありますが個人的にprint_r()の方が見やすいです。

fgets

ファイルポインタから 1 行取得します。引数がSTDINで標準入力です。

trim

文字列の先頭および末尾にあるホワイトスペースを取り除く。上記のfgetsで入力した後、文字列の最後の改行を取り除く場合によく使います。fgetsからのtrimは呪文だと思うのがいいかもしれないです。

explode

文字列を文字列により分割する

array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )

$delimiterで文字列を区切ってくれます。返り値は配列になり、その要素は$delimiterで区切られた文字列になります。

implode

配列要素を文字列により連結する

string implode ( string $glue , array $pieces )
string implode ( array $pieces )

以外とexplodeより使う機会がなかった関数です。そのままなんですけどexplode()の逆の動きをしてくれます。

number_format

数字を千位毎にグループ化してフォーマットする

string number_format ( float $number [, int $decimals = 0 ] )
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )

10000➡︎10,000のように変換してくれます。地味に便利。
引数の数で細かい設定を指定できます。

この関数は 1 つか 2 つもしくは 4 つのパラメータを受け取ります (3 つはありません) :

パラメータが 1 つだけ渡された場合、 number は千位毎にカンマ (",") が追加され、 小数なしでフォーマットされます。

パラメータが 2 つ渡された場合、number は decimals 桁の小数の前にドット (".") 、 千位毎にカンマ (",") が追加されてフォーマットされます。

パラメータが 4 つ全て渡された場合、number はドット (".") の代わりに dec_point が decimals 桁の小数の前に、千位毎にカンマ (",") の代わりに thousands_sep が追加されてフォーマットされます。

指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す

mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
array_sum

配列の中の値の合計を計算する

number array_sum ( array $array )

返り値は整数かfloatになります。

array_key_exists

指定したキーまたは添字が配列にあるかどうかを調べる

bool array_key_exists ( mixed $key , array $array )

array_searchと違ってこちらは有るか無いかのbool型で返ってくるので、ただキーの有無を知りたい場合はこちらの方が良いでしょう。

array_column (ver.5.5 以降)

入力配列から単一のカラムの値を返す

array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

配列 input の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。

※ただし、この関数は古いバージョンには対応していないので注意しましょう。その場合は

/**
 * 指定したキーの値を取得する。2次元配列のみ対応
 * @param target_data 値を取り出したい多次元配列
 * @param column_key  値を返したいカラム
 * @param index_key   返す配列のインデックスとして使うカラム
 * return array       入力配列の単一のカラムを表す値の配列を返し
 */
function array_column ($target_data, $column_key, $index_key = null) {

    if (is_array($target_data) === FALSE || count($target_data) === 0) return FALSE;

    $result = array();
    foreach ($target_data as $array) {
        if (array_key_exists($column_key, $array) === FALSE) continue;
        if (is_null($index_key) === FALSE && array_key_exists($index_key, $array) === TRUE) {
            $result[$array[$index_key]] = $array[$column_key];
            continue;
        }
        $result[] = $array[$column_key];
    }

    if (count($result) === 0) return FALSE;
    return $result;

}

のように、関数を作ってしまいましょう。

まとめ

ざっと関数をまとめて見ました。まとめていくうちに、そういえば、メソッドと関数の違いってなんだろう?って思いました。
次回はそのあたりとオブジェクト指向について書いていきます。

コードを載せる時に、phpと指定してもうまく色がつかないんですけど、なんなんですかね...

<参考にしたサイト>
PHP: Hypertext Preprocessor


qiita.com

PHPを始めるにあたって

筆者、なんの予備知識も無しにPHPでアプリを作成したのですが、これがすごい苦労したので初めての言語に触れる前に準備しておくべきことを書いておきます。

PHPだけでなく他の言語を初めて使うときも当てはまることだと思うので何卒。

 

  

この3つは事前に頭にいれておきましょう。

 

PHPとは何か

PHP(ピー・エイチ・ピー)は "The PHP Development Team" によってコミュニティベースで開発されているオープンソースの汎用プログラミング言語であり、特にサーバーサイドで動的なウェブページを作成するための機能を多く備える。 (wikipedia調べ)

なるほど、しかし動的なウェブページを作成と言えばjavascriptが思い浮かびますね。

じゃあ実際にjavascriptPHPはどう違うの、といいますと

 

javascript  ...webブラウザが命令を受け取り、実行

PHP ...サーバーが命令を受け取り、実行

 

という違いがあります。javascriptはwebページ遷移無しで動作しますが、PHPは基本的にページ遷移をすることで情報を受け渡し、動作します。

そのためPHPを実行するには、webサーバーが必要になってきます。

 

PHPでできること

  • HTMLへの埋め込み
  • クライアントからの情報の受け取り
  • データベースとの連携

この3つがPHPでよく使用されます。予習時点ではこんなことが出来るんだ、くらい覚えていればいいでしょう。

 

便利な関数

私はそれぞれのプログラミング言語の色が出やすいのは関数だと思っていて、(あくまで個人の意見ですが)やはり便利な関数を知っているだけでもプログラムの進捗具合が全然違ってきます。

 

以前使っていた言語でもそんな関数は無かったし、自分で作ろう→調べたら標準装備されてますな

という場面が、開発していく中で結構ありました。その事実に気付くまでの時間は非常にもったいないですよね。その時間を無くすためにも必ず関数の確認はしておきましょう。

 

次回以降はより技術的なことを記事にしたいと思います。

<参考にしたサイト>

techacademy.jp