.envから変数を取得するには、phpdotenvが必要である。

 

.envファイルの内容ってgetenv()で取得すると思うんですが、

それって、環境変数を取得するように、

何もライブラリとか入れずに取得できると思ってました。

 

答え

デフォルト状態で、getenv()より取得できる環境変数は

phpinfo()ででる $_ENV['XXX'] だけみたい。

.envファイルで設定した変数を取得するには、

phpdotenvを使う必要がある。

 

 

■デフォルト状態

$ cat .env
TOKEN=token_123
$ vi get_env.php 
<?php

var_dump('PATH: ' . getenv('PATH'));  
//"PATH: /Users/XXXXXX/.pyenv/shims:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

var_dump('TOKEN: ' .getenv('TOKEN'));  
//"TOKEN: " 取得できない(X_X)

 

 

■ phpdotenv導入後

$ composer require vlucas/phpdotenv
$ vi get_env.php
<?php
var_dump('PATH: ' . getenv('PATH'));  
//"PATH: /Users/XXXXXX/.pyenv/shims:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" 

var_dump('TOKEN: ' .getenv('TOKEN'));  
//"TOKEN: token_123"  取得できた\(^^)/

JP_Stripes (Stripe ユーザーグループ)in 宮崎 Vol.2〜初登壇の反省付き〜

どうも!
先日、JP_Stripes (Stripe ユーザーグループ)in 宮崎 Vol.2
に行ってきました!
そこで、今回、初社外LTしてきました!\(^^)/
宮崎での開催は2回目ということでした。(1回目も参加してます)

 

黒レアらしいです!やったー

 

まずはじめに、
Stripe Japanの小島さんより、Stripeの概要説明がありました。

前回も概要説明はありましたが、内容が新しくなっていて聞き応えがありました。
わたしが気になったトピックは以下2点です。

<Stripe導入事例>
Cansell
行けなくなったホテル予約を売ったり、買ったりできるサービスらしく、
個人的にぜひ使ってみたいサービスだと思いました!
このサービスにもStripeが使われているとのことです。

SaaSを海外展開するために準備した3つのこと
Stripeを使った海外販売を通しての海外展開の大変さだったりを
詳細にまとめてくださってました。

<新機能!>
Isuuing  …APIでカードを作成
Terminal  …プラグラミング可能POS
Stripe + Twillio<pay> …シニアには良さそう

 

 

 

次に、quote 黒葛原 道さんより
「WordPress+WooCommerce+Stripeで作ってみてわかった、
簡単にECサイトを作る方法」

と題して、実際のオンラインショップquoteでStripeを導入したお話でした。
黒葛原さんは、デザイナーさんです。
購入フローふくめサイトの世界観も大事にしており、
Stripeだとそれを実現することができたようです。

\ 簡単に購入できる仕組みが欲しい /
運営側の、現場の、生の、お話が聞けて刺激になりました。

また、WPの開発ツールで、getflywheelというサービスがあるらしく、
わたしは知らなかったので、勉強になりました!

さらに、Stripeはクレカだけでなく、
ApplePayの決済対応も可能です。
そこで、ApplePayの

日本では、VISA カードは App 内や Web での支払いには使えません。

というこの仕様には初耳で、いい情報知れたなと思いましたー!
※店頭での支払いには対応してるらしいです。
参考: https://support.apple.com/ja-jp/HT201239

 

 

2番手で、私のLTでした。
「簡単決済「stripe」を導入してみる。」
という題名で、stripeのクイックスタートよりテストしてみた
の手順をまとめて、最後にデモしました^^
社外LTが初めてだったので、緊張しました。。。
詳しくは、Stripe決済をフレームワーク使わずに組み込んでみる!(PHP)
にまとめています。

<反省点>
– 自己紹介にインパクトが足らなかった。
– 声出し練習不足。
– 伝えたいことが、明確に出てなかった・まとめきれてなかった。
– 緊張で楽しめてなかった。次はもっと楽しみたい。

初LTということで、場数不足は当たり前に痛感しました。
これから、さらに経験値積んでいきたいと思います。
貴重な機会を提供してくださってありがとうございました!

 

 

最後に、イラスティックコンサルタンツ株式会社
緒方 宣行さん、野島 隆さんより
「もっと自由で柔軟に構築しよう!
Stripre決済にも対応した新しいカートシステム」
と題して、 Stripeを使ったAPIサービスのお話でした。

PHPとVue.jsを使ったサービスでした。
技術者の方が、
PHPerでPhpStorm使いというだけで共感わいちゃいました。

Stripeを使っての、
フロント側のデザイン自由度の高いサービスを作ることができる事例でした。
いろんなビジネスの可能性を感じました。

 

 

Stripeはじめキャッシュレスは安倍さんが擁護してるだけあって、
今後さらに注目していきたいなと思います!

JP_Stripesに参加すると毎回思うのですが、
ビジネスアイデアが沸けば、Stripeを使うことで一攫千金も夢じゃないなあ
っとしみじみ感じます。#JP_Stripes

 

stripe決済をフレームワーク使わずに組み込んでみる!(PHP)

こんにちは!
過去に簡単決済「stripe」を導入してみる。を紹介しました。
今更気づいたんですが、べつにLaravel使う必要なかったなって(笑)
ただ、使いたかったんだと思います!ww

そこで!
PHPのフレームワークを使わないパターンで
もっとシンプルに組み込みたいと思います。

完成は、こちらです。
[ kin29/stripe_practice_php ]
↑だと、.envの設定だけで
ビルドインサーバ立てたら、もうできちゃいます。

 

さあ、つくろう。

リファレンス

stripe API
Card Payments Quickstart
ほぼ、↑のクイックスタートをやってます。

環境

– Mac
– PHP7.2.7

準備

stripeアカウント発行、テスト環境申請(申請後すぐできました)
↑これだけ!

手順

1.プロジェクト(作業ディレクトリ)の作成

~$ mkdir stripe_practice_php/

 

2.stripe/stripe-phpの導入 ←composer経由

$ cd stripe_practice_php/
$ composer require stripe/stripe-php
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Using version ^6.20 for stripe/stripe-php
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing stripe/stripe-php (v6.20.0)
    Downloading: 100%
Writing lock file
Generating autoload files

$ ls
composer.json composer.lock vendor

 

3.カード情報入力フォームをつくる。

$ cd stripe_practice_php/
$ vi index.php
...
<div class="content">  
  <div class="title">stripe DE おかいもの</div>
  <div>¥100</div>
    <form action="./payment.php" method="POST">
    <script
       src="https://checkout.stripe.com/checkout.js"
       class="stripe-button"
       data-key="{pk_test_XXXXXXXXXXXXXXXXXXX}"
       data-amount="{商品の値段}"
       data-name="{カード入力モーダルのタイトル}"
       data-description="{カード入力モーダルのタイトル下の説明文}"
       data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
       data-locale="auto"
       data-currency="jpy">
    </script>
  </form>
</div>
...

 

 

4.バックエンドをつくる。

$ cd stripe_practice_php/
$ vi payment.php
<?php
require __DIR__.'/vendor/autoload.php';

\Stripe\Stripe::setApiKey("{sk_test_XXXXXX}"); 

$token = $_POST['stripeToken']; //ここでAPIにリクエストしてる
   
$charge = \Stripe\Charge::create([
    'amount' => 100,
    'currency' => 'jpy',  //usd(ドル)→jpy(円)に変更しました。
    'description' => 'Example charge',
    'source' => $token,
]);
    
//thanks.phpにリダイレクトさせる。
header("Location: ./thanks.php");

 

5.サンクスページをつくる。

$ cd stripe_practice_php/
$ vi thanks.php
...

<div class="content">
   <div class="title">「stripe DE おかいもの」<br>ご利用TEGEありがとうございました。</div>
   <div>利用金額:¥100</div>
  </form>
</div>

...

 

6.完成! →実際に動かしてみる「http://localhost:8080/index.php

$ cd stripe_practice_php/
$ php -S localhost:8080   //ビルドインサーバを立てる

※テスト用のカード番号の参考はこちら
https://stripe.com/docs/testing#cards

 

7.管理画面をみてみる。 →実際にみせちゃう
https://dashboard.stripe.com/test/dashboard

 

‘currency’ => jpy

に変更することにより、
円請求ができますが、管理画面ではドルに換算されていました。

 

まとめ

・簡単!早い!わかりやすい!

・ドキュメントは英語ですが、読みやすく充実してます。

・リンク型なので、面倒なトークン化(カード情報非保持)対応の必要なし!

・次は、PHP以外の言語でもしてみたいです!

Laravel環境構築してみる!

話題のこの本、
「PHPフレームワーク Laravel Webアプリケーション開発」読んでます!
まだ読み途中ですが・・・。
今回は最初の「環境構築」部分を自分なりにまとめたこと描きます。

Github

環境構築のパターン

  1. VagrantでLaravel環境構築
  2. DockerでLaravel環境構築

二つとも、Macでやります!

1. VagrantでLaravel環境構築

■事前準備
・VirtualBoxのインスートル
・Vagrantのインスートル

■構築する環境
・ドキュメントルート … /home/vagrant/code/testapp/public
・laravelプロジェクトdir … /home/vagrant/code/testapp
・共有dir … /home/vagrant/code = /home/(ユーザdir)/code

■手順

$ cd  /*(user_dir)に移動する*/

$ vagrant box add laravel/homestead

$ git clone git@github.com:laravel/homestead.git Homestead

$ cd Homestead/

# 初期化
$ sh ./init.sh

# ゲストOSの設定ファイル調整
$ vi Homestead.yaml  /* ip、sites、authorize、keyの設定 */

# hosts設定 「192.168.10.10 homestead.test」
$ vi /etc/host  /* Homestead.yamlに合わせてip設定する */

$ cd /*(user_dir)に移動する*/

# ゲストOSとホストOSの共有dir先を作成 
# /home/vagrant/code = /home/(ユーザdir)/code
$ mkdir code/

$ cd Homestead/

# 調整し直したHomestead.yamlの設定でvagrantで環境を立てる 
$ vagrant up

# sshでゲストOSに入る
$ vagrant ssh

# ここからゲストOSにいる
$ cd code/

$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*"

http://homestead.test/
にアクセスするとlaravelのページにアクセスできることを確認!完成\(^^)/

■つまったところ
・何回も作りなお直してたら、もうあるってめちゃ言われました。(以下参照)

The box you're attempting to add already exists. Remove it before
adding it again or add it with the `--force` flag.

Name: laravel/homestead
Provider: virtualbox
Version: 6.3.0

そんなときの対処方法
・その壱

$ vagrant global-status /* 動いてるやつの確認 */
$ vagrant global-status --prune /* 何も出てこない時はこっち */
$ vagrant destroy homestead-7 /* 「homestead-7」を指定してdestroy */

・その弐

$ cd ~/.vagrant.d/boxes/
$ ll
$ rm -rf {target}

2. DockerでLaravel環境構築

■事前準備
・Dockerのインスートール

■構築する環境
・ドキュメントルート … /var/www/public
・laravelプロジェクトdir … /var/www/
・共有dir … /var/www = /home/(ユーザdir)/laravel_docker/testapp

■手順

$ cd

$ mkdir laravel_docker

$ cd laravel_docker

$ git clone https://github.com/laradock/laradock.git

$ cd laradock

$ cp env-example .env

# コンテナ起動(初期化)
$ docker-compose up -d nginx mysql workspace phpmyadmin

# 起動中のコンテナ一覧の確認。各コンテナが起動(up)していることを確認
$ docker-compose ps

# ゲストOSに入る
$ docker-compose exec --user=laradock workspace bash

# testappという名前でlaravelをいれる。
$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*" 

# ゲストOSからでる。
$ exit

# laradock/.envの調整。「APP_CODE_PATH_HOST=../testapp」に書き換える
# /var/www = (user_dir)/laravel_docker/testapp にさせるために!
$ vi .env

# コンテナ一旦シャットダウン
$ docker-compose stop
 
# コンテナ起動。再起動により.envが反映されます。
$ docker-compose up -d nginx mysql

http://localhostでアクセスすると、
laravelのデフォ画面がでるはずです!完成^^

この本ですが
内容はとても親切丁寧なので読みやすいです!
ADRの話なども書いてあって、私には難しいですが頑張れそうです!
もっと読んだらまた記事書きまうす。

簡単決済「stripe」を導入してみる。

 

どうも、
先週、#JP_Stripes in 宮崎 キックオフに行ってきました!

Stripe自体は聞いたことはありましたが、
使い方やできることは全く知らなかったので、
事例など交え、とてもいい話を聞くことができました。

もくじ

stirpeのいいところ

– 初期費用不要
– 申請は契約書いらず、ペーパレス。申請〜導入までが速い!
– Apple Pay / Google Pay / 他通貨決済も導入可
– cloud (AWS) →Saasだから保守が楽
APIリファレンスがある!PHP,Ruby,Node,Go,Python対応
– クレジットカード情報「非保持化」及び「PCI DSS(準拠)」してる
↑リンク型みたいな感じの認識です。

申請は、ほぼどんなものでも通るものの、
途中で止められることもあるとのこと。
物として実在するか形に残るもののほうがいいらしいです。

stripeのいろんな機能

– sigma …sqlでデータの検索ができる
– rader …機械学習を使って怪しい人を見つけてくれる。自分でカスタムパターンもいれることができる。
– billing…定期購入に対応。

stripeの導入をやってみる!

参考:
Stripe API Reference

<導入環境>
– PHP 5.6.30
– Laravel 5.2

PHP5.6.4以上だったら、Laravel5.4いけたんですが、、、
ローカルを更新するの諦めました^^;

localは非sslでもおkです!
テスト環境のアカウントは申請直後にできました。

Githubにソース置いてます。
[ kin29/stripe_practice_laravel ]
↑ここには、ほぼcomposer installだけでできるもの置いてます。

以下では、
どうやって最初作ったか、忘れないように、
Laravel/stripeの構築の仕方memoっときます。

 

1.プロジェクト作成

$ composer create-project laravel/laravel stripe_practice_laravel --prefer-dist "5.2.*"

–prefer-distなので、指定なしのデフォルトのgit clone でなく
zipで取ってくる(git clone より高速です)

 

2.stripe/stripe-phpの導入

// $composer require [package name]:[version]
$ composer require stripe/stripe-php:^6.17

 

3.フロント系いらんので消しました。

(package.json/gulpfile.jsとか)

 

4.envの調整
DBとか使わないので、stripeのAPIキーを環境変数として追記のみ

.env

STRIPE_PUBLIC_KEY=test
STRIPE_SECRET_KEY=test

 

5.カード情報入力フォームをつくる。
resources/views/welcome.blade.phpにthanksへのformを追記
参考:Card Payments Quickstart

 

6.バックエンドをつくる
app/Http/route.phpに以下を追記

Route::post('/thanks', function () {

    \Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));

    try {
        $charge = \Stripe\Charge::create(array(
            "amount" => 100,
            "currency" => "jpy",
            "source" => $_POST['stripeToken'],
            "description" => "100yen pay"
        ));
    } catch(\Stripe\Error\Card $e) {

    }

    return view('thanks');
});

 

7.動かしてみる。→エラー調整

この時点でだいたい動きましたが、POSTすると以下のエラーが出てきました。

 

TokenMismatchException in VerifyCsrfToken.php line 67:

app/Http/Middleware/VerifyCsrfToken.php

に以下を追記することで、
CSRF保護の対象外にすることができます。
ただし、クロス・サイト・リクエスト・フォージェリ(CSRF)保護の対象外となりますので、吟味することも大事だと思います!

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'thanks' //追記
    ];

 

クロス・サイト・リクエスト・フォージェリ(CSRF)
… 脆弱性を利用して、悪意のある攻撃をすることだそうで、
信頼できるユーザーになり代わり、認められていないコマンドを実行するとのこと。

Laravelでは、セッションごとにCSRF「トークン」を自動的に生成していて、
リクエスト時に、このトークンを送信して、認証済みのユーザーかを確認するために利用しているとのこと。

なので、HTMLフォームを定義する場合はいつでも、隠しCSRFトークンフィールドをフォームに埋め込んで、
CSRF保護でのチェックできるようにしなければならないとのこと。

 

 

8.動かしてみる。(完成)
カード決済できたー!

Stripeの管理画面にも、疎通確認できました!

 

stripeとっても簡単!

ログもあるし、デバックしやすかったです!

composer の–prefer-distってよく使うけど何してる?

composer コマンドって実際何してるのかわからずやっちゃってます。
そろそろ向き合おうと思ってます。

参考:
http://blog.tojiru.net/article/440339824.html

 

例えば、これ!

$ composer create-project laravel/laravel app_dir

このコマンドなんしてるんだっけ?

git clone git@github.com:laravel/laravel.git
mv laravel app_dir//多分。
cd app_dir
composer install

 

 

では、–prefer-dist がつくとどうでしょうか
例えば、これ!

$ composer create-project laravel/laravel app_dir --prefer-dist

調べてみると、
–prefer-dist の他に –prefer-source というオプションもあります。

–prefer-source
… git cloneでソースを落としてくる。
デフォルト(指定なしではこっちしてる)
つまり、最初のコマンドはこっちなんです!

–prefer-dist
.. zipでダウンロードする。こっちのほうが高速!

 

なので、

$ composer create-project laravel/laravel app_dir --prefer-dist

上記コマンドは、以下をしているご様子。

wget https://github.com/laravel/laravel/archive/master.zip
unzip laravel
mv laravel app_dir //多分。
cd app_dir
composer install

composerのコマンドってもっとオプションがあるので、
随時ちゃんと解明しようと思います。

Travis CIで自動テスト(PHPUnit)をしてもらう。〜 入門編〜

やっと、テストコード…PHPUnitの使い方をわかってきた今日この頃です。
さらに、テストは自分でもやりますが、コミットしたら勝手にテストしてくれるCIがいると、頼れるうって思います。


↑これを(「passing」になってるのを)README.mdに貼りたかっただけなんですけどね!!

ということで
PHPUnit と Travis CI
の使い方を書きたいと思います。(自己流)

https://github.com/kin29/ci-test ←ここにソース置いています。

PHPUnit

テストコードにそって、テストしてくれるツール。

Travis CI

テスト/ビルド環境を作ってくれるツール。
ただし、環境を用意してくれるだけなのでビルド/テスト内容は「.travis.yml」に記述しなければならない。
CIツールの代表的なものである、Jenkinsさんはテストのための環境構築が必要となるが、その手間が省ける。(=>SaaS)

実践!GithubでコミットしたらTravisCIに自動でテスト(PHPUnit)をしてもらう。

PHPUnitの準備

$ mkdir ci-test 
$ cd ci-test/

composer.json をつくる。composer initだと対話式でできます。
依存関係も適切に設定してくれるので、自分で生にcomposer.json書くより安全な気がします。
今回でいうとPHPとPHPunitのバージョン関係もここでいい感じにしてくれました。

$ composer init
                                            
  Welcome to the Composer config generator  
                                          

This command will guide you through creating your composer.json config.

Package name (/) [kin29/ci-test]:
Description []: it is ci-test.
Author [kin29 <kin29.com@gmail.com>, n to skip]: 
Minimum Stability []: 
Package Type []: 
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: php
Enter the version constraint to require (or leave blank to use the latest version): >=7.0.0
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: phpunit/phpunit
Enter the version constraint to require (or leave blank to use the latest version): 
Using version ^7.3 for phpunit/phpunit
Search for a package: 

{
    "name": "kin29/ci-test",
    "description": "it is ci-test.",
    "require": {
        "php": ">=7.0.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^7.3"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "kin29",
            "email": "kin29.com@gmail.com"
        }
    ]
}

Do you confirm generation [yes]? 
Would you like the vendor directory added to your .gitignore [yes]? 

$ ls
composer.json   //できた!!autoloadとかはあとで追加する。
$ composer install
$ ls
composer.json   composer.lock   vendor
$ vi composer.json  //autoload追加
//以下を追記
  "autoload": {
      "psr-4": {
            "App\\": "src/"
        }
  },
  "autoload-dev": {
      "psr-4": {
            "Test\\": "tests/"
      }
  }
$ composer update   //autoloadを適用させる
//実装とテストを書く。構成こんな感じ
$ tree src/ tests/ bootstrap.php
src/
└── Kin29.php
tests/
└── Kin29Test.php
bootstrap.php 

0 directories, 2 files
//phpunit.xmlを作る。
$ vi phpunit.xml

<phpunit bootstrap="./bootstrap.php">
    <testsuites>
        <testsuite name="Ci Test">
            <file>tests/Kin29Test.php</file>
        </testsuite>
    </testsuites>
</phpunit>
//テスト実行→成功!
//これを、コミットした時、自動でテスト実行してもらうようにする(→CIの役目)
$ phpunit tests/
PHPUnit 7.2.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 296 ms, Memory: 10.00MB

OK (1 test, 1 assertion)

Travis CIの準備

$ vi .travis.yml //ビルド・テストの設定ファイルを作成
language: php
php:
 - 7.1
 - 7.2

before_script:
 - composer install

script:
 - phpunit tests/
$ git add .
$ git commit -m 'travis-ci,phpunit追加'
$ git push origin master

ビルド・テスト開始!!!

Githubのリポジトリにコミットすると、ビルド・テストが始まります。
↑trigger word設定で変更可能です。

「passing」になれば、テスト合格です!
「failed」になってもコンソールのログが見れるので、原因を突き止めやすいです!
PHPとPHPUnitのバージョンがあってないって、何回も言われました。
CIが自分では知らないことも気づいてくれて教えてくれて助かります。

InterfaceとAbstractを使ってみる

「インターフェース」ってよく聞きますが、あんまりわかってないです。
というか全くわかりません、「インターフェース」って言いたいだけです。

PHP conference Kansai2018で
インターフェース再入門」というセッションがあり、
そこから気になりだしたので探ってみます。
会社で、PHP conference Kansai2018共有LTしたので、
もうちょい深いところつつけたらなと思います。

ちなみに過去に私が書いたPHP conference Kansai2018の記事はこちら

PHPカンファレンス関西へ初参戦!

インターフェースとは…

何か目的を果たすための手段となるもの。
中身を知らなくても使う側は使うことができる。

例えば…

ECサイト(「ブーメラン」を売っているお店とする)で考えると

  • 使い手 = 買い手
  • 目的 = 「ブーメラン」をクレジットカードで購入したい
  • 手段 = 決済モジュールのクレジットカード決済

→ この時のインターフェースは「決済モジュール」になります!

例えば…(パート2)

  • 使い手 = わたし
  • 目的 = 青い空の下で音楽を聞きながら、お酒飲みたい!
  • 手段 = フェスに行く

→ この時のインターフェースは「フェス」になります!

↑をPHPで書いてみます!
〜InterfaceとAbstract使って〜

実際に書いてたらabstractとの違いがわかんなくなってきたので、両方使ってみます。

参考:
https://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html

\  Github – kin29/fes  /

  • GoodFesInterface.php             ←Interface。
  • AbstractFes.php                        ←Abstract。(WildBunchFesの継承クラス)
  • WildBunchFes.php                  ← AbstractFesを継承し、GoodFesInterfaceを使用
  • Watashi.php                              ←わたし(使い手)

◎ 前提

「青い空の下で音楽を聞きながら、お酒飲みたい!」という、
わたしの願いを叶えるための良いフェスの必須条件を
GoodFesInterface.php」  にこめています。

さらに、わたしが今年の夏に楽しんだフェス
「WildBunchFes(通称WBF)」 「CircleFukuoka」 「まつり宮崎」 「AoshimaBeachParkFes」。
これら4つに共通するもの、
「音楽」 「酒」 「晴れ」 「野外」 「フェスの名前」 「思い出」を
AbstractFesクラス」 に詰め込んで各Fesで継承しています。

 

GoodFesInterface.php [Interface]

<?php

namespace Fes;

interface GoodFesInterface
{
    public function isMusic();

    public function isDrink();

    public function isSunny();

    public function isOutdoor();
}

 

AbstractFes.php [Abstract class]

<?php

namespace Fes;

abstract class AbstractFes
{
    public $fes_name;
    public $music;
    public $drink;
    public $place;
    public $weather;
    public $memory;

    public function __construct()
    {
        $this->place = '野外';
        $this->weather = '快晴';
        $this->memory = 'フェス最高 ^ω^';
    }

    /**
     * @return string
     */
    public function getFesName()
    {
        return $this->fes_name;
    }

    /**
     * @return bool
     */
    public function isMusic()
    {
        return isset($this->music);
    }

    /**
     * @return bool
     */
    public function isDrink()
    {
        return isset($this->drink);
    }

    /**
     * @return bool
     */
    public function isOutdoor()
    {
        return ($this->place === '野外');
    }

    /**
     * @return bool
     */
    public function isSunny()
    {
        return ($this->weather === '快晴');
    }

    /**
     * @return string
     */
    public function getMemory()
    {
        return $this->memory;
    }
}

 

WildBunchFes.php

<?php

namespace Fes;

class WildBunchFes extends AbstractFes implements GoodFesInterface
{
    public $fes_name;
    public $music;
    public $drink;
    public $memory;

    public function __construct()
    {
        parent::__construct();
        $this->fes_name = '「ワイルドバンチ」';
        $this->music = 'ヤバT/サカナクション/スカパラ/10-FEET/フォーリミ/teto/ハルカミライ...etc';
        $this->drink = 'ビール、ビール';
        $this->memory = 'しかし、2日目は台風直撃で中止になりました。';
    }
}

 

Watashi.php

<?php

namespace Bootstrap;
require dirname(__DIR__) . '/vendor/autoload.php';

use Fes\WildBunchFes;
...


class Wahatashi
{
    public $wbf;
    ...

    public function __construct()
    {
        $this->wbf = new WildBunchFes();
        ...
    }

    public function done()
    {
        $arrRet = array();
        $arrRet[get_class($this->wbf)] = $this->doneList($this->wbf);
        ...

        var_dump($arrRet);
    }

    public function doneList($class)
    {
        $arrRet = array();
        foreach ($this->arrDoList as $item){
            $arrRet[$item] = $class->{$item}();
        }
        return $arrRet;
    }
}

$i_am = new Wahatashi();
$i_am->done();

Watashi.phpは、
WildBunchFesクラスを通して、GoodFesInterfaceを使って(手段)として、
目的を果たしています。ですよね?w

 

まだまだ私の理解が乏しく、間違っている部分もあるかと思います。
そして、「こんなソースいつ使うんだ?」って感じですが、
自分の好きなものでソースを書くってなかなか面白かったです。

みなさんもぜひしてみてください! \(^^)/

正規表現を覚えよう。

 

SublimeTextでよく使う正規表現。とっても便利。
「 SublimeText 」と「 正規表現 」でどんだけ早くデータ整形できることか!

だけど、正規表現まだ検索しちゃってる。。。
「あ、そうだ覚えよう。」

というか、その前に全然まだ正規表現わかってなかったので、
ドットインストール受講しました^^

とりあげること

・「+」 VS 「*」
・「\d」 VS 「[0-9]」
・「\b」
・いろんな「?」
・文字クラスと「|」(選択子)
・いろんな「改行」
・キャプチャをつかっての置換

 

「+」 VS 「*」

どっちっけ?ってなるので^^;
・「+」 …1回以上の繰り返し。 ={1,}
・「*」 …0回以上の繰り返し。 ={0,}

以下のようなデータがあって、「a0001」「bcdef」「00002」の両方を検索にヒットさせたい時。

a0001
bcdef
00002

「+」のみを使った以下のパターンだと「a0001」しかヒットしません。

[a-z]+[0-9]+

 

しかし、

 

「*」のみを使った以下のパターンだと
「a0001」「bcdef」「00002」の全てがヒットします。

[a-z]*[0-9]*

 

さらに

「a0001」「bcdef」だけヒットさせたいとき

[a-z]+[0-9]*

「a0001」「00002」だけヒットさせたいとき

([a-z]|[0-9])*[0-9]$

「bcdef」「00002」だけヒットさせたいとき

^([a-z]*|[0-9]*)$

 

「\d」 VS 「[0-9]」

ドットインストールを見るまでしらなかったんですが、「\d」っていうのがあるんでうすね。「[0-9]」派でした。

さらに否定形の書き方がそれぞれ違ったので発見でした。

「\d」の否定形→「\D」

「[0-9]」の否定形→「[^0-9]」
※ 「^」は「 [」の直後のみ否定を表す。「^[0-9]」だと行の先頭が数字のものが該当する。

 

「\b」

単語の境界…単語のみをマッチさせたい時つかう

例えば、「curry」のみをヒットさせたい時、
「curry」だと全ての単語のcurryにヒットしてしまうので、
「\bcurry\b」とすると一番上の「curry」のみにヒットさせることができます。

curry
curryrice
currypan

 

いろんな「?」

「?」って2つの役割があります。
・「?」 → 1回の繰り返し。 ={0,1}
・最も短い文字でマッチさせる

「”.+”」 → 最も長い文字にマッチしてしまう(通常)のため、「”apple”, “apples”, “pineapple”」の全てがヒットする。
「”.+?”」 → 最も短い文字でマッチする。「”apple”」「 “apples”」「”pineapple”」のそれぞれがヒットする。

"apple", "apples", "pineapple"

 

いろんな「改行」

「\r\n」→ 改行(Windows)
「\r」→ 改行(v9までのmacOS)
「\n」→ 改行(v10からのmacOS)
「\r\n|\r|\n」→ 改行(すべて)

キャプチャをつかっての置換

「()」で囲った部分「$n」に格納し、それを使って、置換ができる。

phpのpreg_matchでも使えた!
以下のようなデータがあって、「id={id},name={name}」みたいな形式に変換したいときとかに使えます。
sublimeでは shift + command + F で検索&置換の機能を使います。
Find: (.+),\s?(.+)
Replace: id=$1,name=$2

置換前

1, taro
2, jiro
3, saburo

置換後

id=1,name=taro
id=2,name=jiro
id=3,name=saburo

 

phpのpreg_replaceだと、こんな感じ。

preg_replace("/(.+),\s?(.+)/", 'id=$1,name=$2', "1, taro")

 

いろんな正規表現がありますね。

組み合わせ次第だでやり方無限大ですね。おもしろーい。

 

PHPカンファレンス関西へ初参戦!

どうも!PHPカンファレンス関西に行ってきました!

関西のPHPカンファレンスは初めて参加しました。福岡しかいったことのない身です。
しかし、3連休のOsaka暑すぎでした。
3日目の泊まった友達の家はクーラー無いし、
たまたま行った焼肉屋は屋内なのにサウナ状態、
宮崎に帰って行ったcoldrainのライブも冷房壊れてる熱いライブで、
大阪のPHPer熱を感じました。

#前夜祭

前日入りしたので、前夜祭【非公式】も行ってきました。
PHPカンファレンス関西の前夜祭の会場
飛行機の都合で、LTしか見れてないんですがw
入口が8時に閉まるということで、わざわざロックオンのおえらい方に開けてもらいました、ありがとうございました。
ロックオンさんのオフィスが少し見れて光栄でした!!!
DB周りのお話が多かった気がします。
オニオンアーキテクチャは初耳でした。
非同期PHPやったことない。。。curl_multi?コルーチン?って感じだったので自分なりに調べて見ました。

非同期PHP

jsでしかやったことない。。。
ReactPHP、流行りのswooleできるそうです!今度触ろう。(多分

こんな方法でも非同期実行できまうす!

    • curl_multi
    • コルーチン ←swooleはこれおしだそうで。

↑一旦処理を中断した後、続きから処理を再開できる。スケジューリングできる!

 

 

#本編

まず、まとめ\(^^)/

  • グランフロント大阪でっかい、参加者いっぱい!
  • 人気のセッションは立ち見もできなかったりしてた
  • ガラポン楽しかった!ホワイトボードノート欲しかった。。。
  • インターフェイス使ってみよう
  • SOLIDの原則、条件分岐禁止ギブスの想像
  • PhpStorm使いこなし隊。ハンズオンぽちりました。
  • HerokuのロンTいただいたー

AWSを背景に記念ん撮影 いただきもの いただきもの2

インターフェイス入門

インターフェイス使って実装してみよう。んでブログ書こう。
とりあえず下書き登録しました\(^^)/
インターフェイス入門のメモ1 インターフェイス入門のメモ2

SOLIDの原則、条件分岐禁止ギブスの想像

後藤さんのSOLIDの原則シリーズのトークは3シリーズすべてを生で
聞くことができました!
\条件分岐ギブスがグッズ化されることを待ち望んでいます!/
せっかくメルカリさんにノートをもらったので、使わせていただきました。
solidの原則メモ1 solidの原則メモ2

PhpStorm使いこなし隊。ハンズオンぽちりました。

OsakaからMiyazakiに帰ってきたら届いてましたー!日本語化にたよらずとも英語読めるように頑張ります・・・。
intelijハンズオン

HerokuのロンTいただいたー

Herokuは個人的なやつで使ってます。これとか
https://today-saying.herokuapp.com/
herokuも英語ばっかで探り探りですが、便利なのでどんどん使います〜