k01ken’s b10g

He110 W0r1d!

CakePHP3でマイグレーションを行う

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+CakePHP 3.6.4。

マイグレーションとは、コマンド経由で、テーブルを作成、追加、修正、削除などのテーブル操作をしつつ、そのバージョン管理(変更履歴を管理)ができるツールのことです。

Phinxというデータベースマイグレーションライブラリをラッパーすることによって、このコマンドを実現しています。

1.Composerでアプリを作成
2.データベースの作成
3.データベースへの接続設定を行う
4.カレントディレクトリをアプリのある位置にする
5.以下のコマンドを実行し、適当なマイグレーションファイルを作成する。マイグレーションファイル名は判別しやすいように今回やりたいことにふさわしい名前をつける。

bin\cake bake migration CreateProducts name:string description:text created

6.作成したマイグレーションスクリプトを開いて定義する。
7.マイグレーションを実行する。実行するとデータベースにphinxlogテーブル(これはマイグレーションの実行結果について記録しているテーブル)とproductsテーブルが作成されている。

bin\cake migrations migrate

8.テーブルが作成されただけでモデルのテーブルやエンティティは作成、修正されていないので、ここで定義しておくこと。

■テーブルにカラムを追加する

例えば、alertsテーブルに、boolean型のcheckpoint(default値はfalse、statusカラムの後に入れる)というカラムを作成したいならば、

<?php
    public function change()
    {
      $table = $this->table('alerts');
      $table->addColumn('checkpoint', 'boolean',['default' => false, 'after' => 'status'])->update();
    }
?>

という風に書き、マイグレーションを実行する。

bin\cake migrations migrate

checkpointカラムが作成されている。

■テーブルのカラムを変更する
カラム名を変更する
カラム名を変更するための命名規則Rename+頭文字が大文字の変更したいカラム名+To+頭文字が大文字で複数形のテーブル名

bin\cake bake migration RenamePriceToProducts

マイグレーションファイルが作成された後、作成されたマイグレーションファイルのchange()メソッド内に以下のコードを書く。

<?php
    public function change(){
	$table = $this->table("products");
	$table->renameColumn("price","age");
    }

?>
bin\cake migrations migrate

カラム名のpriceがageに変更されている。

カラム名の型を変更する
カラム名の型を変更するための命名規則Change+頭文字が大文字の変更したいカラム名+To+頭文字が大文字で複数形のテーブル名

bin\cake bake migration ChangeAgeToProducts

マイグレーションファイルが作成された後、作成されたマイグレーションファイルのchange()メソッド内に以下のコードを書く。

<?php
    public function change(){
	$table = $this->table("products");
	$table->changeColumn("age","integer");
    }

?>
bin\cake migrations migrate

カラム名の型がdecimalからintに変更されている。


☆あるカラムのNOT NULL制約を解除する
例えば、postsテーブルのtitleカラムについているNOT NULL制約を解除したい場合は、change()関数内に、以下のようなコードを入れます。

<?php

  $table = $this->table('posts');
  $table->changeColumn('title', 'text', ['null' => false])->save();

?>

マイグレーションを実行した後に、カラムの存在するテーブルのModelのTableのファイル(今回の場合は、/src/Model/Table/PostsTable.php)を開いて、validationDefault関数内の、titleカラムのバリデーションの

<?php
->requirePresence('title', 'create')
?>

の部分を削除し、

<?php
->allowEmptyString('title', false);
?>

<?php
->allowEmptyString('title');
?>

にする。


参考リンク
CakePHP3のマイグレーションまとめ - Qiita
https://book.cakephp.org/3.0/ja/migrations.html
CakePHP3のMigration(マイグレーション)でカラム追加・変更・削除を行う
CakePHP3(Phinx)のMigration記述例 - Qiita

Visual StudioにてXamarinを使う

開発環境は、Windows 7 Professional(32bit)。

スマートフォンタブレット端末用のアプリを作ってみたくて、Xamarinを導入してみることにした。

※自分の場合はすでにVisual Studio Community 2017はインストール済みです。
まだの場合は、インストールしてください。

1.サイトへアクセスする
Mobile App Development & App Creation Software - Xamarin
2.Download now for freeボタンをクリックする
3.Windows用ダウンロードボタンにマウスを合わせ、Community 2017をクリックし、インストーラをダウンロード。
4.ダウンロードしたvs_Community.exeを実行する。
5.続行ボタンをクリックする。
6.ダウンロードとインストールが終わったらVisual Studioを起動する。
7.左上のファイル→新規作成→プロジェクトをクリックする
8.Visual Studio インストーラーを開くリンクをクリックする
9..NETによるモバイル開発にチェックを入れて変更ボタンをクリックするとインストールが開始されます。自分の環境の場合、約11GB分を2時間かけてインストールしました。


※テストする場合には、使っているPCのCPUがVT-xに対応していないといけません。

PhantomJSを使いスクリーンショットを行う

PhantomJSを用いてスクリーンショットをしてみる。
※この記事はNode.jsをインストールをしていることが前提です。

1.npmでPhantomJSをインストールする

npm install phantom phantomjs -g

2.インストールが終了したら、以下のファイルを作成して(名前はtest.jsとしておく)、C:\nodeフォルダ(なければ作って)に入れる。

console.log("Hello, PhantomJS");
phantom.exit();

3.カレントディレクトリをC:\nodeへ移動して、以下のコマンドを入力。そうすると、Hello PhantomJSと出力すればインストールは成功している。

phantomjs test.js

4.スクリーンショットをするために、先ほどのtest.jsを以下のコードに書き換える。このサイト自身をスクリーンショットしてみる。成功すれば、かなり時間はかかるが、nodeディレクトリ内に縦長のpng画像が生成されているはず。(サイズは1098kb!)

var page = require('webpage').create();

page.open('http://k01ken.hatenablog.com/', function(s) {
  console.log("Status :" + s);
  if(s === "success"){
  page.render('mysite.png');
  }
  phantom.exit();
});

参考リンク
PhantomJSを使って色々試してみる
PhantomJS と CasperJS で複数ページを一括キャプチャする | Tips Note by TAM

WindowsにAndroid Studioをインストールする

開発環境は、Windows 7 Professional(32bit)+Firefox 58.0.2(32ビット)。

■インストールする
1.サイトへアクセスする。
Download Android Studio and SDK Tools  |  Android Developers
2.DOWNLOAD OPTIONリンクをクリックする
3.Windows(32-bit)の欄のリンク(自分の場合はandroid-studio-ide-173.4720617-windows32.zip)をクリックする
4.規約にチェックを入れて、ボタンをクリックし、ダウンロードする
5.ダウンロードしたandroid-studio-ide-173.4720617-windows32.zipを解凍する
6.bin/studio.exeをクリックして実行する
7.Android Studio Setup Wizardが出現するので、Nextボタンをクリックする。
8.Install Type: Standardにチェックを入れて、Nextボタンをクリックする。
9.Select UI Theme: デザインを好きなほうを選んで、Nextボタンをクリックする。
10.Finishボタンをクリックするとコンポーネントのダウンロードが開始される。

※自分の場合、途中で以下のようなものが出現した。

Android SDK is up to date.
Unable to install Intel HAXM
Your CPU does not support VT-x.
Unfortunately, your computer does not support hardware accelerated virtualization.
Here are some of your options:
1) Use a physical device for testing
2) Develop on a Windows/OSX computer with an Intel processor that supports VT-x and NX
3) Develop on a Linux computer that supports VT-x or SVM
4) Use an Android Virtual Device based on an ARM system image
(This is 10x slower than hardware accelerated virtualization)

これは、作ったアプリをパソコン上の仮想デバイスを使ってテストする際に必要なものなんですが、それに必要な環境が自分のパソコンに備わっていないという意味らしいです。
ない場合は、テストはスマホタブレットなどの実際のアンドロイド端末を使って行うみたいです。
パソコンでAndroid Studioを使って開発したい場合は、そのパソコンのCPUがVT-xをサポートしているのかを事前に調べておく必要があります。


参考リンク
【最速入門】AndroidStudioとは?どこよりもわかりやすく解説 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト
Android Studio超入門――ダウンロード、インストール(Macもあり)、使い方を総まとめ:初心者のためのAndroid&Javaで始めるプログラミング入門(2) - @IT

Windows 7(32bit)のローカル環境にあるソースコードをGithubにプッシュ(アップロード)する

開発環境は、Windows 7 Professional(32bit)+Firefox 58.0.2(32ビット)。

■Gitを導入する
1.サイトへアクセスして、『Windows』と書かれたテキストリンクをクリックして、インストーラをダウンロードする。
Git - Downloads

2.ダウンロードしたGit-2.17.0-32-bit.exeを実行する。

3.『Next』ボタンを9回押した後に、『Install』ボタンをクリックするとインストールが始まる。
完了したら、『Finish』ボタンをクリックする。

4.インストールしたら、左下のWindowsボタンから『Git』フォルダ内の『Git Bash』をクリックする。

5.

git --version

とコマンドを入力するとバージョンが表示されれば、インストール成功です。

6.以下のコマンドを入力してユーザー名とメールアドレスを設定する。ここは適当に入力して構いません。

git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"

7.GitHubにアカウントを作成する

8.右上のメニューから『New repository』をクリックする

9.『Repository name』を入力し、『Create repository』ボタンをクリックする

10.プッシュ(アップロード)するためのディレクトリを作成し、カレントディレクトリに設定する
1行ずつ入力してください。

cd /c/
mkdir mytest
cd mytest
git init
touch index.html
git add index.html
git commit -m "Create index.html"
git remote add origin <URL>
git push origin master

11.『Username for 'https://github.com': 』と表示されるのでGitHubに登録したユーザー名を入力する

12.OpenSSHが起動してパスワードの入力を求められるので、GitHubに登録したパスワードを入力する。

13.1回リポジトリにファイルをプッシュしたら、その後は、Upload filesボタンをクリックして1回100ファイルまでドラッグアンドドロップで一気にアップすることができます。


参考リンク
【Windows】Gitの環境構築 | プログラミングの入門なら基礎から学べるProgate[プロゲート]
WindowsでGitを使ってみた
WindowsにGitをインストールする方法 | サービス | プロエンジニア
Git for Windowsの基本的な使い方 | サービス | プロエンジニア
【Git】基本コマンド
CakePHP3 で開発環境準備、改訂版
[Git]ファイルを移動する(git mv) - とあるエンジニアの闇歴史帳
今さら聞けない!GitHubの使い方【超初心者向け】 | TechAcademyマガジン

PHPのclassについて

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+PHP 7.1.7。

<?php

class A{
	public $value = 3;

	public function t(){
		return $this->value;
	}

	public function m($i){
		return $i * $i;
	}
}

$a = new A();
echo $a->value; // 3
echo $a->t(); // 3
echo A::m(5); // 25

?>

■やってみて分かったこと
・クラス内の変数部分をプロパティと呼び、関数部分をメソッドと呼ぶ。
・メソッドはインスタンスを経由で呼び出す方法と、クラス名::メソッド名で呼び出す方法(静的メソッド)がある。
・静的メソッドではプロパティを呼び出せない。(クラス名::プロパティ名のように)また、プロパティを内部で呼び出すメソッドも静的メソッドのやり方では呼び出せない。
・プロパティ部分のpublic $value = 3のpublicを除くと『Parse error: syntax error, unexpected '$value' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST)』というエラーが発生する。
・メソッド部分のpublic function t()のpublicを除いても動作に問題はない。
・プロパティはメソッド内で、『$this->プロパティ名』で呼び出すことができる。インスタンスメソッドだと呼び出せるが、静的メソッドだと『Fatal error: Uncaught Error: Using $this when not in object context』というエラーが発生する。
・クラスのインスタンスを関数の引数として渡すことができて、かつ、その関数内で、インスタンスを経由して、プロパティやメソッドにアクセスすることもできる。

参考リンク
PHP: クラスの基礎 - Manual

CakePHP3でメールを送信する

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+CakePHP 3.5.8。

ロリポップレンタルサーバーから、Gmailへメールを飛ばしてみる。

1.ユーザー専用ページへアクセスする
2.左サイドバーのメールからメール設定/ロリポップ!webメーラーを選択する
3.新規作成ボタンをクリックする
メールアドレスパスワードを入力し、作成ボタンをクリックする。
もう1回作成ボタンをクリックし、アラートのOKボタンをクリックする。
4.先ほど作ったメールのメール設定の欄の確認・変更をクリックする。

config/app.php内のEmailTransportのdefaultの後に以下のものを追加する。

<?php
        'default' => [
       ],
       'lolipop' => [
		'className' => 'Mail',
		'host' => 'ロリポップで取得したドメイン名',
		'username' => '作ったメールアドレス',
		'password' => '作ったパスワード',
		'port' => 465,
		'transport' => 'Smtp',
		'tls' => true,
		'timeout' => 50
	],

?>

classNameをSmtpに設定すると、タイムアウトして送信できないので、Mailにすると、送信できました。

試しに、UsersController.phpにmailアクションを作成する。

<?php

// ページの先頭のuseがある部分に設置
use Cake\Mailer\Email;

	public function mail(){
		if($this->request->is('post')){
		$emailObj = new Email('default');
		$emailObj->transport('lolipop')
		->setFrom(['自分のメールアドレス' => '太郎'])
		->setTo('送信先のメールアドレス')
		->setSubject('タイトルです')
		->send('こんにちはです。');
		}
	}
?>

Template/Users内にmail.ctpという名前で以下のコードを保存する。

<?php
<form method="post" action="/users/mail">
	<input type="submit" value="メール送信">
</form>
?>

これで、メール送信ボタンをクリックするたびに、自分のGmailへメールが送られます。

参考リンク
【CakePHP入門】メールを送信する方法 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト