tanikoのぶろぐ

PHPの面白いところ

注意 - 皮肉的な記事です. いくつか使っていて, 辛いところを記述するので, ネタみたいな記事です.

配列周り

PHPには, 配列がありまして, $foo = [1, 2, 3]とかです. 前までは$foo = array(1, 2, 3)でした.
そんな配列なのですが, JavaScriptとかRubyとかと違って, arrayであって, array objectではないわけです. そんなわけで, 配列の操作がしたければ, array_*()を使うわけです. array_push()に関しては, $array[] = $valでできます.
そんなPHPの配列で面白いところは, array_map()です. array_push($array, $val_1), array_filter($array, $callback), array_reduce($array, $callback)など, 第1引数に配列を持ちます. しかし, array_map()array_map($callback, $array)と順番が逆なのです. これが辛い. 統一していて欲しい.
PHPの配列が辛い人は, Illuminate\Support\Collectionを使ってオブジェクトにすればいいと思うので, composer install illuminate/supportしましょう.

オブジェクトのコピー

PHPのオブジェクトを別の変数に渡す時, cloneを利用します.

<?php
class Sample {
    public $count = 0;
}

$foo = new Sample();
$bar = clone $foo;

$bar->count++;

var_dump($foo->count); // int(0)
var_dump($bar->count); // int(1)

もしもcloneを使用しないと, 思わぬ副作用を生み出します.

<?php
class Sample {
    public $count = 0;
}

$foo = new Sample();
$bar = $foo;

$bar->count++;

var_dump($foo->count); // int(1)
var_dump($bar->count); // int(1)

$foo->countも書き換わってしまうんですね. そんなcloneですが, クローンが作成される際に呼ばれるマジックメソッド__clone()というものがあります. これは作成された新たなオブジェクトで呼ばれます.

<?php
class Sample {
    public $count = 0;

    public function __clone() {
        $this->count++;
    }
}

$foo = new Sample();
$bar = clone $foo;

var_dump($foo->count); // int(0)
var_dump($bar->count); // int(1)

これにより, 遺伝子操作されたクローンを作ることができます. 使う機会があるかはわかりませんが.

ついでに

homebrewでのPHPのインストール方法が変わりました. いままではbrew install php72だったのですが, これからは, brew install php@7.2という形になります. あと, xdebugがインストールされていないようなので, 調べたらpeclを使ってとあったので, pecl install xdebugをしましょう. 詳しくは GitHubのIssueで https://github.com/Homebrew/homebrew-php/issues/4721

マルチバイト周りに対応したローマ数字のパーサを作った

日本語とは厄介なのでしょうか? とても扱いやすい言語だとは思います. 特に数字周りに関しては素晴らしい思っています. 英語の数え方とか加減乗除とかは厄介だと思います.
では, 日本の厄介な部分はどこかというと, マルチバイト文字だということ. 文字数が多すぎる.
ということで, 今回はローマ数字周りのライブラリです.

まずは, マルチバイト周りのローマ数字について. 10を例に話します.

xX
説明半角小文字半角大文字全角小文字全角大文字ローマ数字(小文字)ローマ数字(大文字)
Unicode12088653686533685698553

11を表すには? xi? XI? xi? XI? ? ?

辛い.

そんなわけでtaniko/romansを作りました. インストールはcomposer require taniko/romansでできます.

<?php
require 'vendor/autoload.php';

// 全角大文字
var_dump(Taniko\Romans\Parser::toInt('MMXVII'));
// int(2017)

// ローマ数字(大文字)
var_dump(Taniko\Romans\Parser::toInt('MMⅩVII'));
// int(2017)

ちなみに, PHP 7.2からはmb_ord(), mb_chr()が使えるようになりました. symfony/polyfill-mbstringを使わなくてもいいようになりました.

最後に, PHPは最高ですね.

既存のライブラリにマルチバイト周りをASCIIに変換する部分だけのPRでも作る?

Saori v3のリリース

Saoriのバージョン3をリリースしました. 実際にリリースしたのは5月とかなり前です.
v3での主な変更点は以下のとおりです.

  • github.io以外で使用可能
  • 設定ファイルをJSONからYAMLに変更
  • テーマを外部から追加可能

まず, github.io以外で使用可能になったので, 自分のVPSなどでブログを公開できるようになりました. config/env.ymlpublicにURLを記述します.

設定ファイルをYAMLに変えたのは, JSONの記述が辛かったからです. 括弧とかめんどくさかったのです.

テーマを外部から追加可能というのは, テーマを追加できるようにしたということ(?). コードを見たほうが早い.

<?php
require __DIR__.'/vendor/autoload.php';
$app = new Taniko\Saori\Application(__DIR__);
$app->addTheme('theme-name', __DIR__ . '/theme/append-theme');
$app->run();

今までだとtaniko/saoriに存在するテーマしか使用できなかったのですが, このような感じでテーマを追加して, それを使用できるようにしました.

やっぱり, PHPは最高ですね!

Slackのフレームワーク(?)を作った

RiccaというSlackのフレームワークのようなものをPHPで作りました. できることは少ないですが, なにかメッセージを投げるとそれに一致したコマンドが動いて, Twitterにつぶやかれたり, Slackに文字を返したりするという単純なものです.
例としては「tw こんにちは」とメッセージを送るとTwitterに「こんにちは」とつぶやかれるとか「pid」でBotの動いているプロセスIDがslackに返ってくとかです.

コマンドについて

コマンドの作り方

実際にコードをみてもらうとわかりやすいと思うのでtwコマンドのコードを載せます. configure()で設定をしてexecute()に実際の処理を書くといったものです.

<?php
namespace Hrgruri\Ricca\Command;
class Tweet extends \Hrgruri\Ricca\Command
{
    public function configure()
    {
        $this->setName('tw')
            ->setChannel('general');
    }
    public function execute(\Hrgruri\Ricca\Request $req, \Hrgruri\Ricca\Response $res)
    {
        return $res->withTweet($req->getText())->withText('tweeted');
    }
}

botにコマンドを追加する方法

上記のようなコードを書くだけで簡単にコマンドを作成することができます. 自分で新たにコマンドを作成したら使用できるようにコマンドを追加します. 下のコードはbotを動かすためのコードです. add()で作ったコマンドを登録していけばいいだけです.

<?php
require 'vendor/autoload.php';
$app = new Hrgruri\Ricca\Application(__DIR__.'/data', 'general');
$app->add(new Hrgruri\Ricca\Command\Tweet);
$app->run();

私のbotのリポジトリ hrgruri/slack_bot

PHPカンファレンス 関西2016でLT

PHPカンファレンス関西 2016に参加をして, ブログを書くまでがカンファレンスだと言われたので書きたいと思います. 初めてのIT系イベント, 初めてのLT, 初めての懇親会でした. 先に断っておきますがカンファレンスでの基調講演やセッションの感想ではなく個人的な話が主です.

当日まで

カンファレンスに参加

そもそもPHPカンファレンス関西というのを知ったのが, 2015年のカンファレンスの動画をYouTubeで見つけた時です. なので知ってから1年も経っていません.
東京は行くのが厳しいですが, 大阪なら行けるということで2016年のPHPカンファレンス関西には参加したいと思いました.

その時点ではまだ何月何日に開催されるのかわかりませんでした. 月日は流れ, 開催日が発表されてそれを確かめると7月16日. 予定も空いているので参加を決意しました. この時点ではただ単にカンファレンスを聞きに行くだけの予定でした.
一応,少しずつですがhrgruri/saoriの開発をしていました.

LT参加を決意

6月になってもまだLTの応募がありました. セッション枠は募集終了していたと思います.

カンファレンスに参加をするんだったら話したいなと思い, 思い切ってLTの応募をしました. 落選するだろうなと思っていたのですが, 6月16日に当選メールが来て喜ぶと同時に(まだまだ先ですが)緊張しました.

前日

当日

午前の部

開場が10時からで,大阪駅には9時30分ごろに着いていました. のんびり会場まで歩いて行きながら大阪の車と人の多さに怯えていました.

会場(7階)で受付を済ませました. スピーカーは専用の場所があり, 名前を言うだけで受付が済むのは良かったです. 午前の部が終わった時にメインホールでWi-Fiが使ええますよというアナウンスが有りました. LTのデモでは, デモ用のブログを生成して終わりにしようと考えていたのですが, 実際にgit pushしてLTの最中にブログをアップロードできる可能性が出てきました.

午後の部

お昼ごはんを食べに行き, 会場の戻ってくると休憩場所がある8階に行きました. カンファレンスに来たのだからセッションを聞きに行くべきだですが, LTのデモの内容とスライドを変えたかったので, その作業を行いました. 当初,スライドは2分話して, 2分デモをして, 1分話すという考えのもと作っていました.

しかし実際にブログを更新できそうだったのと, デモの内容を変えることでデモにかける時間が変わると思ったので, デモを最後にすることにしました. そんなわけで,スライドを少し変えてデモ用に簡単な記事を予め作っておき, シェルスクリプトでコピーできるようにしていました. そのあと簡単にですがLTの練習をしていました. LTの練習がある程度済んだらセッションを見に行きました.

LT(ライトニングトーク)

セッションがすべて終了すると,少しの休憩を挟み, いよいよメインホールでLTです. プロジェクターのチェックを済まし,上手側でLTのスピーカーの人たちは待機していました. 例年だとLTの順番はくじなどでランダムに決めていたようですが, 今年はタイムテーブルの順で行うことになりました. 私の順番は5番目でした.

他の方のLTを見ながら, 待機場所でスライドに不備がないことを確認していました. 前の方が終わり, いよいよ私の番になったのでステージにあがり,パソコンを設定していると空席があるということで席の誘導が行われ, その後, 始まりました.
自己紹介で大学生だということとIT系のイベント自体初参加でLTも初めてだということを言ったら拍手をいただきました. スライドの説明はスライドをアップロードしているので詳しくは省略します.

内容としては「github.io」と既存の静的サイトジェネレータに少し触れて, 「Saori」の話をしました. 使い方や設定などに関してはあまり話せませんでした. 簡単にですが使い方を書いたのでSaoriを使いたい方はこちらをご覧ください.
時間が十分に余ったので, 最後にデモを行いました. デモの内容は私が実際に使っているブログに記事を投稿するというものです.
少しの内容ですが実際に書くのは(時間的に)怖かったので予め用意していました.

デモの内容

  1. 記事「demo」用のベースファイルを生成
    「blog post demo」と入力してベースとなるディレクトリとファイルを作成しました. 「blog」はaliasで「blog='php ~/Desktop/blog/main.php'」です.

  2. ファイルをコピー
    用意していた記事をコピーする際に「cp from to」とする時間がもったいなかったので予め作っていたシェルスクリプトでコピーしました.

  3. ブログを生成
    「blog make」と入力してブログを生成します. これによりlocalhostで動かすためのものとusername.github.ioで公開するものとが生成されます.

  4. localhostで確認
    GitHubに上げる前のlocalhostで確認をします. PHPのビルトイン サーバを利用してWebブラウザで確認をしました.

  5. 実際に公開
    公開するためにadd, commit , pushをしました. 「g add」とかしていましたがgはgitのaliasです.

  6. hrgruri.github.ioを確認
    実際に公開されたページをWebブラウザで見に行きました.

Saoriについて話をしてデモもでき,最低限の言いたいことが言えたあたりで銅鑼が鳴り,初のLTが終了しました. 実は手元のiPhoneで時間を図っていたのですが, LT中に1度も見ていなかったです.

そんなわけで今回のLTで

  • github.ioは無料
  • GitHubが緑になる
  • PHP最高
  • Saoriはいいよ

ということが伝わっていれば幸いです. ちなみにデモの際に投稿したのはこれです.

LTの感想+α

デモではタグ, リンク, 最近の記事の掲載などに触れることができて良かったです. しかし,プッシュをした時にすぐに終わらないのは本当に焦りました. 微妙なところで終わるのかもしれなかったですが, LTならではのアクシデントでいい経験だったと思います.
始まるまでは拍手や笑いが無いものになってしまうのではないかと不安でしたが, LT冒頭の自己紹介で拍手をいただき不安と緊張がとても和らぎました. LT中も笑いがあり, やっていて楽しかったです.

私のLTを聞いてくださった皆さんとLTをさせてくださった実行委員の方々に感謝したいと思います. ありがとうございました.

こちらが私のLT資料です.

懇親会

LTと写真撮影が終わったら, 懇親会の準備のため18時まで時間があったので8階で待機となりました. Twitterを見ているとスライドのアップロードがいくつもあったので, 私もすることにしました.Speaker Deckでアカウントを作成し, アップロードをしている最中に「LTしていた人ですよね」と声をかけてくださった方々がいました. その人達と懇親会が始まるまでいろいろと話しをさせていただき, 懇親会でも引き続き話をさせていただきました.

懇親会では飲んだり食べながらしながらいろいろな人と話をさせていただきとても楽しかったです. 知らなかったWAFのことを教えていただいたり, WordPressの話をしたりと私が知らなかったことを聞くことができました.

懇親会のLTは話をしながら後ろのほうで聞いていました. 懇親会LTは3分というとても短い時間でしたが面白いものばかりで会場も大盛り上がりでした.
LTのあとはじゃんけん大会が行われました. 11名が景品をもらえるとのことでした. 結果は11名の中に残り,カンファレンスのTシャツを頂きました.

懇親会の終わりごろに基調講演をされたhirakuさんと少し話をさせていただきました. メルカリ様のステッカーをいただきました. ありがとうございます. パソコンにでも貼りたいと思います.

最後に

こうして初めてのカンファレンス, 初めてのLT, 初めての懇親会が終わりました. 懇親会での話やTwitterを見てみると「LT,良かったよ」というのがあったので嬉しいです. デモも好評で良かったです. リポジトリを見てみるとStarがありました. ありがとうございます. hrgruri/saori

Twitterで#phpkansaiを見ているとLTで話した内容(Saori)以外のことが少し話題になっていました. それは私がデモの時に使った「g (git)」です. Twitterを見ている限り「git」はエイリアスで「g」としている人は多い気がしますが少し会場がざわついていました. 少しでもストレスを無くすために「g」にするはおすすめです.

カンファレンスが始まる前から気になっていたのですが,私以外にも大学生は参加していたのでしょうか. 私だけということはないとは思いますが,見かけませんでした. LTの冒頭で大学生がいるか聞いておけば良かったかなと今思う.

カンファレンスに参加したい学生へ

PHP初心者の学生でも参加する価値はあると思います. そもそも私自身もPHPを使い始めてそれほど経っていませんし, 今回LTで話したことも静的サイトジェネレータの話であって, PHPの主な使い方であるWebアプリケーション関係の話ではないです.
スライドでもPHPのコードはたったの4行しかありませんでした. PHPを触ったことがない人でもPHP(Saori)を使ってブログを公開することで, PHPに興味を持って使い始める学生が出てきてくれたら良いなと思います.
また,今回のカンファレンスでは初心者向けのセッションやDBに関するセッションなど, PHPを知らなくても楽しめるものがいくつもあったと思います.
LTをしたことで思ったのが, みんな優しかったです. LT後にも話しかけてくださる方々がいてとても良いカンファレンスでした.
カンファレンスの参加料は1000円ですが, 学割(先着)があり今回のカンファレンスは無料でした. ちなみにLTスピーカーは招待されるので本編チケットを買う必要なし.

最後になりましたが, カンファレンスに出席した皆様, LTを聞いてくださった皆様, 懇親会で話をしてくださった皆様, 主催してくださった実行委員の皆様, そしてスポンサーの皆様のおかげで楽しいカンファレンスとなりました. ありがとうございました.


その他

カンファレンスのスライドは,まとめてくださった方がおられるのでそちらを御覧ください.
PHPカンファレンス関西2016 スライドリンク集 #phpkansai - お?意外といけるやん!

TogetterにPHPカンファレンス関西2016まとめがあります.
PHPカンファレンス関西2016まとめ

PHPカンファレンス関西に参加しようと考えた時に読んだ記事
ブラよろで学ぶPHPカンファレンス関西2014