やったこと

webサービスを作るときに考えたことを垂れ流します

【CakePHP3】マイグレーション機能でカラムの定義を変更する!

CakePHP3のMigrations機能でカラムの定義を変更する方法です。

マイグレーションファイルを作る
以下のようにbakeコマンドを打って「ChangeComment」などというマイグレーションファイルを作ります。

./bin/cake bake migration ChangeComment

コマンド打つと「20170320094048_ChangeComment.php」などといったマイグレーションファイルが作成されます(まだ中は空っぽです)

マイグレーションファイルに変更内容を書く
マイグレーションファイルの中にカラムの定義を変更する命令を書きます。

以下の例では、「comments」というテーブルの「twitter_id」というカラムの定義を変更しています。

「biginteger」というデータ型に変更して、デフォルト値をnullに変更して、null値の入力を「有り」に変更しています。

    public function change()
    {
      $table = $this->table('comments');
      $table->changeColumn('twitter_id', 'biginteger', [
          'default' => null,
          'null' => true,
      ]);
      $table->update();
    }


マイグレーション実行
上記のマイグレーションを、普通にコマンドを叩いて実行します。

./bin/cake migrations migrate

これで変更が反映されます。はい以上!

【git】既存のプロジェクトからコードをそのままに新プロジェクトに移行!

gitの話なんですけも、「今進行中のプロジェクト」から、コードはそのままで「新プロジェクト」を開始する方法です。

■サーバ側作業
まずはサーバー側で「新プロジェクト」のファイルを作ります。

プロジェクトファイルが格納されているディレクトリで、新プロジェクトのディレクトリ「hoge.git」を作成します。

#ls
test.git  fuga.git

#mkdir hoge.git (ディレクトリ作成)

#ls
test.git  fuga.git  hoge.git


そして、「hoge.git」に移動して「git init」コマンドを叩きます。

#cd hoge.git

#git init (新プロジェクトファイル作成)

#ls
branches  config  description  HEAD  hooks  info  objects  refs

これでサーバー側に、新プロフェクトのファイルが作られました。


■クライアント側作業
クライアント側には既存プロジェクトのコードがあると思います。なかったら「git clone」で既存のコードを用意してください。

このコード中の「.git」ディレクトリ以下を全部きれいに削除します。そして「git init」コマンドによって設定を新規作成します。

#rm -rf ./.git (.gitディレクトリ全削除)

#git init (git情報を新規作成)

#ls -a
.git


そして、全コードを新プロジェクトに向けてコミットします。リモートの設定を新しいプロジェクトにセットしてコミットです。

#git remote add <name> <url> (新プロジェクトにリモートを設定)

#git add . (全ファイルadd)

#git commit  (全ファイルコミット)

#git push (全ファイルプッシュ)

これで新しいプロジェクトにコードがコミットされました。新しい開発の始まりです。

おしまい。

ツイッターでフォローが全部外れてしまったとき!

先日、私のツイッターアカウントのフォローが全部外れてしまう現象に出くわしました・・。

私のアカウントは宣伝用に使っているもので、誰かれ構わずやたらとフォロー爆撃をしまくっているなんともはた迷惑なものなんですけども、ちょっとやりすぎてしまったためか、一旦ツイッター側からアカウントがロックされてしまいました・・。

ツイッター側に申請をしてすぐにロックを解除してもらったのですが、しばらくして「300人」ほどいたはずのフォロー数が、全部外れてしまって「0」になっていることに気付いたのです・・。

「やんちゃな行為をした罰ゲームでフォローが全部外されてしまったのかな・・?」と思ってしばらく放置しておいたのですが、半日くらい経った頃でしょうか、いつの間にかフォロー数は元通りの数に復元されていました・・。

よって結論です。

結論:
「フォローが全部外れてしまったときは、半日くらい経過すると元通りになることがある、なのでしばらく様子を見ること!」

以上です。

【CakePHP3】Paginator機能で総ページ数を取得する!

CakePHP3の「ページネーション機能」を使うと、簡単にページ遷移のためのボタンを実装することができます。

ページネーション機能の公式ヘルプ:
https://book.cakephp.org/3.0/ja/controllers/components/pagination.html


ビュー・テンプレート内で「ページの総数」を取得したい場合は「$this->Paginator->params()['pageCount']」を参照します。

例えばテンプレート内に以下のように書くと「ページ総数」が2ページ以上のとき、画面に横棒を表示させることができます。

<?php if($this->Paginator->params()['pageCount'] > 1): ?>
  <Hr>
<?php endif;?>

※ちなみにページ総数が1ページだけのときは、ページネーションボタンは表示されないのでご注意ください。複数のページが存在するきだけ、ページネーションボタンは表示されるのです。当たり前ですよね・・。

以上!

ロードバランサー(ELB)の設定が悪くてツイッターログインが失敗!

先日私のサイトでwebサーバーを二台に冗長する作業を実施したところ、ユーザーの「ツイッターログイン」が失敗する不具合が起きるようになってしまいました・・。


私のサイトはアマゾンのAWSサーバーを使っているんですけども、どうもAWSの「ロードバランサー(ELB)」の設定が悪いせいで、ログインが失敗してしまうようです。

ロードバランサーには「スティッキーセッション」という機能があるのですが、おそらくこの設定がオフになっているのがいけないんだと思われます。

(※スティッキーセッションとは、ユーザーのセッション情報をクッキーに記憶させておき、ロードバランサーがそのクッキー情報を見ることで、アクセスを前回と同じサーバーに振り分けてくれるという、お利口な機能です)


ツイッターをはじめとした、ソーシャルログイン機能を使いたいんだったら、スティッキーセッションは有効にしないといけません。

スティッキーセッションを有効にするには、AWSのEC2設定画面の以下の赤丸の箇所を入力するとできます(ちなみにロードバランサーの種類は「Application Load Balancer」というやつを使っています)

f:id:absg:20170218192941j:plain


この設定をしたところ、ちゃんとツイッターログインが成功するようになりました。ロードバランサーがセッションを判別して、認証のためのアクセスを振り分けてくれるようになったのです。

めでたしめでたし・・

【cakePHP3】paginaterの「limit」値を後から変更する!

cakePHP3のページネーション処理は「pagenater」を使うと簡単に実装できます。

https://book.cakephp.org/3.0/ja/controllers/components/pagination.html

公式ページを見ると、ページに表示するコンテンツの行数(litmi)は、以下のように初期設定することができます。

class ArticlesController extends AppController
{
    public $paginate = [
        'limit' => 25,
    ];
}

limit値は、以下のように途中から変更することもできます。

class ArticlesController extends AppController
{
    public function initialize()
        $this->paginate['limit'] = 10;
    }
}

以上です。

アマゾンAWSで「php-devel」をインストールする!

アマゾンのEC2サーバーで「phpize」のコマンドを使おうとしたら、以下のようなエラーが出て怒られてしまいました。

#phpize

Can't find PHP headers in /usr/include/php/5.6/php
The php-devel package is required for use of this command.


どうも「php-devel」というパッケージがないとだめだと怒っているようです。
なので「php-devel」をインストールすることに。

#yum -y install php-devel

--> Finished Dependency Resolution
Error: httpd24-tools conflicts with httpd-tools-2.2.31-1.8.amzn1.x86_64
Error: php56-cli conflicts with php-cli-5.3.29-1.8.amzn1.x86_64
Error: httpd24 conflicts with httpd-2.2.31-1.8.amzn1.x86_64
Error: php56-common conflicts with php-common-5.3.29-1.8.amzn1.x86_64
Error: php56 conflicts with php-5.3.29-1.8.amzn1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest


しかしyumでインストールしようとしても上記のようにエラーが出てどうしてもできません。これは大変なことです。

いろいろググって調べてみたら「yum install php56-devel」を使いなさいという外人のお言葉が。
amazon web services - not able to install php-devel in aws centos ec2 instance for php version 5.6.22 - Stack Overflow

言うとおりに「php56-devel」を入れてみたら、ちゃんと入りました。

#yum install php56-devel

Installed:
  php56-devel.x86_64 0:5.6.28-1.130.amzn1

Dependency Installed:
  autoconf.noarch 0:2.69-11.9.amzn1                          automake.noarch 0:1.13.4-3.15.amzn1
  m4.x86_64 0:1.4.16-9.10.amzn1                              pcre-devel.x86_64 0:8.21-7.7.amzn1
  perl-Test-Harness.noarch 0:3.28-3.6.amzn1                  perl-Thread-Queue.noarch 0:3.02-2.5.amzn1
  php56-jsonc-devel.x86_64 0:1.3.6-1.19.amzn1

Dependency Updated:
  php56.x86_64 0:5.6.28-1.130.amzn1                         php56-cli.x86_64 0:5.6.28-1.130.amzn1
  php56-common.x86_64 0:5.6.28-1.130.amzn1                  php56-intl.x86_64 0:5.6.28-1.130.amzn1
  php56-mbstring.x86_64 0:5.6.28-1.130.amzn1                php56-mysqlnd.x86_64 0:5.6.28-1.130.amzn1
  php56-pdo.x86_64 0:5.6.28-1.130.amzn1                     php56-process.x86_64 0:5.6.28-1.130.amzn1
  php56-xml.x86_64 0:5.6.28-1.130.amzn1

Complete!


親切な人のおかげでちゃんと「phpize」コマンドが使えるようになりました、よかったよかった。