あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

LAMP環境構築、Composer&CakePHP導入まで

今週は仕事から帰ったらPHPフレームワークを使うために四苦八苦しておりました。

Laravelを入れたくてLaravel Homesteadについて調べていましたが、どこをどう触ればいいのかがなかなかわからず…。並行して調べていたCakePHP導入の方がうまくいったので、今回はその方法についてまとめていきます。

 

LAMP環境構築(CentOS)

基礎となるLAMP環境構築のうちCentOSについて、コマンドプロンプトを管理者として実行し、下記のコマンドを実行していく。この手順ではCentOS7.2を導入する。

  1. cdで仮想マシンのVagrantFileを置くフォルダまで移動
  2. vagrant init "bento/centos-7.2"を実行し、VagrantFileを作成
  3. VagrantFileを開き(自分の場合はAtomで開いている)、IPのコメントアウトを外して任意のIPに書き換える。初期値は192.168.33.10になっているので、自分は他の仮想マシンと被らないよう192.168.33.30に書き換えている。
  4. VagrantFileについて、config.ssh.insert_key=falseを加筆する。デフォルトだと仮想マシンごとにsshの鍵が作られるので、同じ鍵を使うようにしたいため。鍵そのものは~\.vagrant.d\insecure_private_key(Windowsのユーザーフォルダ)に作成される。
  5. ここでコマンドプロンプトに戻り、vagrant upを実行する。おそらく共有フォルダのマウントに関するエラーを出すが、起動そのものはできるはず。
  6. vagrantの起動を行った状態でvagrant sshを実行。仮想マシンにログインする。仮想マシンに対してコマンドプロンプト越しにいろいろなコマンドを打っていくが、これから実行するのはほとんどが管理者権限が必要になるコマンドとなる。なのでsuと入力し、root権限を取得しておく(パスワードを求められるが、この手順通り作業しているならパスワードはvagrantなはず)。rootになるとコマンドプロンプトの頭に付く$が#に変わる。

LAMP環境構築(Apache)

Apacheをインストールして起動するため、以下のコマンドを実行。

  1. yum -y install httpdと入力し、Apacheをインストール。インストールが終わったらhttpd -vでバージョン確認、その後systemctl start httpdと入力してApacheを起動させる。

LAMP環境構築(MySQL)

MySQLをインストールするため、以下のコマンドを実行

  1. CentOSにはMariadbが最初から入っているため、yum -y remove mariadb-libs.x86_64を実行してこれのアンインストールを行う。
  2. yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpmを実行、リポジトリを追加。
  3. yum -y install mysql-community-serverを実行し、MySQLをインストール。終わったらmysqld --versionでバージョンの確認を行い、systemctl start mysqldで起動。

LAMP環境構築(PHP)

以下のコマンドでPHPをインストールする。下記の手順ではPHP7がインストールされる。

  1. yum -y install epel-releaseとrpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmを実行し、リポジトリを追加。
  2. yum -y install --enablerepo=remi,epel,remi-php70 php php-devel php-intl php-mbstring php-pdo php-gd php-mysqlndを実行し、PHPをインストール。その後php -vでバージョンの確認。

LAMP環境構築(その他)

他にも必要なものがあるので、下記のコマンドをそれぞれ実行。

  1. yum -y install gitを実行し、Gitをインストール。
  2. CakePHPをインストールする際にzipファイルの解凍が必要となるが、今回の手順ではzip解凍に必要な機能がCentOSにインストールされていない。yum insatall -y zip unzipを実行し、その機能をインストールしておく。

composerインストール

ライブラリの依存管理ツールであるcomposerをインストールする。これによりCakePHPのインストールがコマンド一発で行える。Laravelなどでも使われる。

  1. php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"を実行し、セットアップスクリプトとなるPHPファイルをダウンロードする。これはhome\vagrantの直下に置かれる。ls -lを実行すれば現在のフォルダにどんなファイルがあるのかをコマンドプロンプト上で確認できる。
  2. ダウンロードしたPHPファイルをphp composer-setup.phpで実行し、composerの本体であるcomposer.pharを入手。php -r "unlink('composer-setup.php');"を実行し、セットアップスクリプトは削除しておく。
  3. これまではvagrantにroot権限でログインしているが、composerを使うときはroot権限を持っていると逆にエラーの原因となってしまう場合がある。exitと入力し、通常のユーザーとしてログインしている状態(コマンドプロンプトの先頭が$)の状態に戻しておく。
  4. ./composer.phar -vを実行し、派手なアスキーアートが出ればセットアップが完了している。
  5. CentOSのどこからでもcomposerコマンドが実行できるよう、本体を別のフォルダへ移しておく。再び管理者権限でログインし、mv composer.phar /usr/local/bin/composerを実行すればよい。その後は一度通常ユーザーに戻り、composerと入力するだけであの派手なアスキーアートが表示される。

CakePHPインストール

いよいよCakePHPの導入を行う。以下のコマンドを実行。

  1. composer self-update && composer create-project --prefer-dist cakephp/app 〇〇を実行。〇〇には任意のフォルダ名を入れる(cakephpなど)。指定したフォルダの下にCakePHPに関するファイルがダウンロードされる。

 

手順は以上となる。

インストールできたはいいが、CakePHPどころかApacheの使い方や設定がわからないので随時勉強していこう。

 

…やっぱりエラーが出た。たぶんPHPのインストールで何か問題がありそう

LAMP環境構築

今回の仮想環境はドットインストールのスクリプト頼みではなく、自分で調べてLAMP環境を作成。これが割と完全版な気がしている。

今までの学習でVirtualBoxVagrantはインストール済みなので割愛。今回行った構築の順序は下記の通り。

  1. 仮想マシンとなるフォルダを作成
  2. vagrant init "bento/centos-7.2" をPowershellで作ったフォルダまで移動した上で実行
  3. 作成されたVagrantFileでIPを設定し、「config.ssh.insert_key = false」を付け加える
  4. Vagrant upするとマウントエラーを吐く
  5. vagrant plugin install vagrant-vbguestを実行してプラグインを入手
  6. vagrant reloadしても同じようなエラーを吐く
  7. vagrant ssh仮想マシンにログイン、sudo -iでroot(管理者権限ユーザー)になる
  8. yum updateを実行し、kernelの更新を行う
  9. そのあとvagrant reloadをするとエラーが全く出ない。
  10. 下記サイトに沿ってApacheMySQLPHPを入手。

qiita.com

とりあえず今日はここまで。次回はPHPフレームワークであるLaravelをこの環境で使えるようにしていきたい。composerが必要なんだっけ。

 

仕事がエグい。とにかく楽しくない…。

開発日記:PHPでTwitterのAPIを使うには…?

PHPを使って作りたいものとして、TwitterAPIを使ってなんやかんや…というものがあります。自分がいいねをつけた呟きを画像付き/動画付き/テキストのみに分けて一覧で出したり、ハッシュタグのついた動画だけを検索したり。

 

で、そんな機能に欠かせないのがTwitterAPI。先ほど勉強用に1つ取得しました。まだまだ使わないけど…。どのサイトで何をすればAPIが取得できるのかについてはいろいろなブログなどで載せられていますが、APIを実際に使う前に自分でもまとめてみようと思っています。

 

で、そのTwitterAPIを使うにはどうしたらいいのか…と検索してみたところ、いろいろなサイトで紹介されているのが「TwitterOAuth」というオープンソースのライブラリ。Twitterで行う一通りの操作ができるみたいです。

 

で、それを使うにはどうしたらいいのかを調べていたのですが、やはりPHPフレームワークの勉強は必要っぽいです。どちらにせよいずれやるだろうなとは思っていましたが、フレームワークはどんなもので、どんな種類があって、どういう使い方をすればいいのかというところがいまだによくわかっていません。

 

で、とりあえずは前まで取り組んでいた「PHPしっかり入門教室」で紹介されている「Laravel(ララベル)」というフレームワークを勉強してみようと思います。「最近勢いがある~」とか紹介されているので興味もあったし。

 

今後の学習の課題は以下の通り。

  • 仮想環境構築。PHP7、MySQLなどをドットインストールのパッケージに頼らず導入できるようにする。
  • Laravelの学習。どこかのサイトの連載記事やレッスンとしてまとめられたパッケージを見つけて、とりあえずブログにまとめながら1周する。
  • 上記2点が済んだらTwitterAPIを使った勉強・開発を行う。

住所録まで作ってひと段落し、ちょっと気が抜けていた部分があったのでまたガンガン勉強していこうと思います。

このところちょっと仕事が質量共に膨れ上がっていて、家で休んだり気晴らしにゲームしてたりしたらあっという間に日付が変わっていた…ということも多くなってきています。仕事の方をなんとかしないとこちらまで手が回らないという感じも否めないですが、仕事は仕事で手際よく、勉強は勉強でじっくり腰を据えて取り組んでいきたいです。

 

ちょっと調べてみたら「PHP初心者にLaravelはきついかも」という記事も発見し、じゃあ何ならええんや…?という気持ちです。

開発日記:GithubとSourcetreeでソースを公開

スプラトゥーン2ガチホコでついにSに昇格できたので気持ちよく勉強していきます。

 

いろいろいじった住所録ソフトをいよいよGithub上に公開していく。

今回は以下の記事を参考に、SourcetreeというソフトとGithubを組み合わせる。

qiita.com

Githubでアカウントを取得し、Sourcetreeのインストールが終わった段階から話を進める。SourcetreeとGithubを連携させる手順は以下の通り。

  1. Sourcetreeのツールバー、「ツール」>「オプション」を選択
  2. 「認証」タブでGithubのアカウントのIDやパスワードを入力
  3. Github側でSourcetreeと連携させたいリポジトリを作成、そのURLを取得
  4. Sourcetreeの新しいタブで「Clone」を選択し、必要事項を入力。なお、ローカル側に連携するフォルダを作成する必要がある。
  5. フォルダを作成後、そこにGit管理するソースやフォルダを放り込めばOK。なお、また新しいリポジトリを作成した場合は3~5を繰り返す。

ざっくりとこんな感じ。メモ用なので…。

自分の場合は開発をVagrant仮想マシンで行い、ファイル転送ソフトCyberduckでそのマシンと自分のPCの間でファイルのやりとりをしていた。

Cyberduckから直接アップできるのが一番手っ取り早いが、今回はCyberduckからローカルへソースコードをダウンロード、そこからGithubへアップする流れとする。

連携するフォルダへソースを放り込めば、Sourcetreeの方でもそれを感知する。それをコミットやプルという形でGithubへアップ。以上が一連の流れである。

用語などについてはまだまだ不完全、Readme.mdについても独自の書き方があるようなので、折を見て勉強していこう。

開発日記:Githubで公開?

一昨日まで作っていた住所録について、Githubに公開してみました。

URLはまだ貼りませんが、

  1. Githubでアカウント作成&リポジトリ作成
  2. Sourcetreeをパソコンにインストール
  3. Cyberduckから開発したPHPファイル群をローカル環境に入れて、ローカル環境からSourcetreeへ反映、そのあとGithubにコミット

というややこしい流れを組んでおります。というかこのやり方だとMySQLのテーブルがGithubに行かないけどいいんだろうか…。

とりあえずはReadme.mdの書き方、MySQLのテーブルの扱いなどもまとめて後日改めて紹介します。

2日続けてブログ書かないとモチベーションが一気に下がるかもしれないという危機感があったので、とりあえず今日はこれだけ。

PHP開発日記:GETで検索(1ページにつきn件表示)

昨日からの課題だった、「1ページにつきn件の検索結果を表示、画面下部のリンクで切り替え」という機能について研究。

今日変更したphpファイルの変更箇所は以下の通り。

 

config.php

//検索設定
define('SEARCH_DISP_LIMIT',100); 

1ページあたりの表示件数を定数として設定。上記の設定では1ページあたり100件の検索結果が表示される。

 

db_helper.php

function search_address($dbh,$addno,$add1,$add2,$add3,$pagecount){
 $result=;
 $sql="select addno,add1,add2,add3 from address where 1=1";
 if ($addno!=='') {
  $sql=$sql." and addno like :addno";
 }
 if ($add1!=='指定しない') {
  $sql=$sql." and add1 like :add1";
 }
 if ($add2!=='') {
  $sql=$sql." and add2 like :add2";
 }
 if ($add3!=='') {
  $sql=$sql.=" and add3 like :add3";
 }
 $sql=$sql." order by addno limit :pagecount , :pagelimit";
 $stmt=$dbh->prepare($sql);
 if ($addno!=='') {
  $stmt->bindvalue(':addno','%'.$addno.'%',PDO::PARAM_STR);
 }
 if ($add1!=='指定しない') {
  $stmt->bindvalue(':add1','%'.$add1.'%',PDO::PARAM_STR);
 }
 if ($add2!=='') {
  $stmt->bindvalue(':add2','%'.$add2.'%',PDO::PARAM_STR);
 }
 if ($add3!=='') {
  $stmt->bindvalue(':add3','%'.$add3.'%',PDO::PARAM_STR);
 }
 $stmt->bindvalue(':pagecount',$pagecount,PDO::PARAM_INT);
 $stmt->bindvalue(':pagelimit',SEARCH_DISP_LIMIT,PDO::PARAM_INT);
 $stmt->execute();
 while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {
  $result
=$row;
 }
 return $result;
}

function count_address($dbh,$addno,$add1,$add2,$add3,$pagecount){
 $count=0;
 $sql="select count(addno) as count from address where 1=1";
 if ($addno!=='') {
  $sql=$sql." and addno like :addno";
 }
 if ($add1!=='指定しない') {
  $sql=$sql." and add1 like :add1";
 }
 if ($add2!=='') {
  $sql=$sql." and add2 like :add2";
 }
 if ($add3!=='') {
  $sql=$sql.=" and add3 like :add3";
 }
 $stmt=$dbh->prepare($sql);
 if ($addno!=='') {
  $stmt->bindvalue(':addno','%'.$addno.'%',PDO::PARAM_STR);
 }
 if ($add1!=='指定しない') {
  $stmt->bindvalue(':add1','%'.$add1.'%',PDO::PARAM_STR);
 }
 if ($add2!=='') {
  $stmt->bindvalue(':add2','%'.$add2.'%',PDO::PARAM_STR);
 }
 if ($add3!=='') {
  $stmt->bindvalue(':add3','%'.$add3.'%',PDO::PARAM_STR);
 }
 $stmt->execute();
 while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {
  $count=$row;
 }
 return $count;
}

search_address関数で検索結果を、count_address関数で全体の件数を取得。search_addressについて、SQLの最後にlimit x , yを使っているのがポイント(検索結果のx件目からy件表示する)。count_addressでは全体のレコード数をcountを使って取得している。

 

search.php

if (isset($_GET['addno']) or isset($_GET['add1']) or isset($_GET['add2']) or isset($_GET['add3'])) {
 $addno=$_GET['addno'];
 $addno=html_escape($addno);
 $add1=$_GET['add1'];
 $add1=html_escape($add1);
 $add2=$_GET['add2'];
 $add2=html_escape($add2);
 $add3=$_GET['add3'];
 $add3=html_escape($add3);
 $page=$_GET['page'];
 $page=(int)html_escape($page);
 $result=[];
 $tmpcount=0;
 $count=0;
 $dbh=get_db_connect();
 // 検索、レコード取得
 $result=search_address($dbh,$addno,$add1,$add2,$add3,$page);
 $tmpcount=count_address($dbh,$addno,$add1,$add2,$add3);
 $count=intval($tmpcount['count']);

 $_GET['page']を新しく設定。これで何ページ目にあたるデータを表示するのかを指定する。数値型に変換して$pageに格納する。

 

serach_view.php

<!-- 表示 -->
<?php if(isset($addno) or isset($add1) or isset($add2) or isset($add3)): ?>
 <?php if ($count>0): ?>
  <?php if($count>$page+SEARCH_DISP_LIMIT): ?>
   <p><?php echo $count; ?>件ヒット!(<?php echo $page+1;?>~<?php echo $page+SEARCH_DISP_LIMIT;?>件目)</p>
  <?php else: ?>
   <p><?php echo $count; ?>件ヒット!(<?php echo $page+1;?>~<?php echo $count;?>件目)</p>
  <?php endif; ?>
  <table border="1">
   <tr>
    <th>郵便番号</th>
    <th>都道府県</th>
    <th>市区町村</th>
    <th>町域</th>
   </tr>
   <?php foreach ($result as $row): ?>
    <tr>
     <td><?php echo $row['addno']; ?></td>
     <td><?php echo $row['add1']; ?></td>
     <td><?php echo $row['add2']; ?></td>
     <td><?php echo $row['add3']; ?></td>
    </tr>
   <?php endforeach; ?>
  </table>
<!-- n件ごとに1ページ表示 -->
  <?php for($i=0;$i<=$count;$i+=SEARCH_DISP_LIMIT) {?>
   <?php $pagecount+=1 ?>
    <a href="search.php?addno=<?php echo $addno; ?>&add1=<?php echo $add1; ?>&add2=<?php echo $add2; ?>&add3=<?php echo $add3; ?>&page=<?php echo $i;?>"><?php echo $pagecount; ?></a>
   <?php } ?>
  <?php else: ?>
   <p>該当するデータはありません。</p>
 <?php endif; ?>
<?php endif; ?> 

検索結果を表示する表を作った後、forループでaタグを量産していく。aタグのリンク先として現在のsearch.phpを指定するが、このときにGETで渡す値もタグにべた書きする。こうすることでリンクが改行されることなく並ぶ。

 

これらの変更を行い、検索画面は以下のようになった。

f:id:R_de_aru:20180713235106p:plain

検索条件を指定せずに検索。本来ならば12万件以上のデータを表示しようとするが、今回の変更によって「12万行のうちの1~100件目」のみを表示するようになったのでとても処理が軽い。

ページ下部は以下のようになっている。

f:id:R_de_aru:20180713235231p:plain

検索結果が多すぎるのでリンクが無数に並んでいるが、やりたかったことは達成した。このうち「2」のリンクをクリックする。

f:id:R_de_aru:20180713235315p:plain

「2」のリンクをクリックすると画面が切り替わり、101件目~200件目を表示するようになった。

 

今回の住所録機能についてはこれで完成とする。

意外とサクサク進んでいる。明日からはTwitterのAPIを使うための勉強を行う予定。というかJSON?が必要らしいんだけど何それレベルなのでまずはそこから。Javascriptがこの環境で使えるのかどうか…。