Share
Embed
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
PHPカンファレンス小田原 2024 のLTで話したトークのスライドです
https://fortee.jp/phpconodawara-2024/speaker/proposal/view/c1a2fdaf-352f-458a-b206-fc35ff94127d
https://youtu.be/akI4KQVjIac?t=5004
02
April 12, 2024
Transcript
36 slides
-
© 2012-2024 BASE, Inc. #phpcon_odawara BASE, Inc. BASE BANK 振込申請チーム
Engineering Program Manager / フルサイクルエンジニア PHPカンファレンス2024 実行委員長 地元が湘南で、遠足で小田原城行った 小学生時代を送っていました 02 大津 和槻(おおつ かずき) :@cocoeyes02 自己紹介 -
© 2012-2024 BASE, Inc. #phpcon_odawara 時間切れが怖いので募集なう! バックエンド エンジニア SRE フロントエンド
エンジニア セキュリティ エンジニア QA エンジニア データ エンジニア etc… We are hiring! https://binc.jp/jobs -
© 2012-2024 BASE, Inc. #phpcon_odawara 今回話すこと 4 • Random\Randomizer クラスについて軽く解説
• 日常のあれこれをRandom\Randomizer クラスを使って解決 -
© 2012-2024 BASE, Inc. #phpcon_odawara 今回話さないこと 6 • Random\Randomizer クラスが誕生した経緯や歴史
PHPマニュアルやRFCを読もう!(雑でごめんね!LTだから時間ががが) • https://www.php.net/manual/ja/class.random-randomizer.php • https://wiki.php.net/rfc/rng_extension • https://wiki.php.net/rfc/random_extension_improvement • https://wiki.php.net/rfc/randomizer_additions Zeriyoshiさんの発表や記事がとてもわかりやすいよ! • いちユーザーがPHPに新機能を追加するまで / PHPConference 2022 • PHP の乱数実装がグダグダな話 -
© 2012-2024 BASE, Inc. #phpcon_odawara 今回出てくるコード 12 • 好きな規則のパスワードを作成したい •
ランダムに何かを選びたい(くじびき) • ランダムに何かを選びたい(順番決め) • 適当なテストデータを用意したい(メールアドレス) • 適当なテストデータを用意したい(フルネーム) • おまけ:適当なUUIDを作成したい • おまけ:PHP(CUI)でビンゴマシンを回したい https://github.com/cocoeyes02/php-randomizer-sample -
© 2012-2024 BASE, Inc. #phpcon_odawara 好きな規則のパスワードを作成したい 14 パスワードに使う 適当な文字列がほしい パスワード生成サイトで
生成されるパスワードに 使いたくない記号 が含まれている -
© 2012-2024 BASE, Inc. #phpcon_odawara 好きな規則のパスワードを作成したい 15 <?php // 英数字記号を対象に12文字のパスワードを15個作成する
$randomizer = new \Random\Randomizer(); $canUseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/*-+., !#$%&()~|_'; for ($i = 0; $i < 15; $i++) { echo $i + 1 . '個目のパスワード: ' . $randomizer->getBytesFromString($canUseChars, 12) . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara 好きな規則のパスワードを作成したい 16 <?php // 英数字記号を対象に12文字のパスワードを15個作成する
$randomizer = new \Random\Randomizer(); $canUseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/*-+., !#$%&()~|_'; for ($i = 0; $i < 15; $i++) { echo $i + 1 . '個目のパスワード: ' . $randomizer->getBytesFromString($canUseChars, 12) . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) 使用できる英数字記号一覧から ランダムで12文字選ぶ -
© 2012-2024 BASE, Inc. #phpcon_odawara ランダムに何かを選びたい 19 <?php // くじびき
$randomizer = new \Random\Randomizer(); $name = match ($randomizer->getInt(1, 4)) { 1 => '名前1', 2 => '名前2', 3 => '名前3', 4 => '名前4', }; echo '本日ファシリをする方はこの方!!:' . $name . PHP_EOL; いますぐ試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara ランダムに何かを選びたい 20 <?php // くじびき
$randomizer = new \Random\Randomizer(); $name = match ($randomizer->getInt(1, 4)) { 1 => '名前1', 2 => '名前2', 3 => '名前3', 4 => '名前4', }; echo '本日ファシリをする方はこの方!!:' . $name . PHP_EOL; いますぐ試してみたい方はこちら!(PHP Playground) 1~4の整数からランダムで出力 -
© 2012-2024 BASE, Inc. #phpcon_odawara ランダムに何かを選びたい 21 <?php // くじびき
$randomizer = new \Random\Randomizer(); $name = match ($randomizer->getInt(1, 4)) { 1 => '名前1', 2 => '名前2', 3 => '名前3', 4 => '名前4', }; echo '本日ファシリをする方はこの方!!:' . $name . PHP_EOL; いますぐ試してみたい方はこちら!(PHP Playground) 番号と名前の対応表から ファシリをする人の名前を出力 -
© 2012-2024 BASE, Inc. #phpcon_odawara ランダムに何かを選びたい 22 <?php // 順番ぎめ
$randomizer = new \Random\Randomizer(); $persons = ['名前1', '名前2', '名前3', '名前4', ]; echo 'LTの発表順はこちら!:' . implode(', ', $randomizer->shuffleArray($persons)) . PHP_EOL; いますぐ試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara ランダムに何かを選びたい 23 <?php // 順番ぎめ
$randomizer = new \Random\Randomizer(); $persons = ['名前1', '名前2', '名前3', '名前4', ]; echo 'LTの発表順はこちら!:' . implode(', ', $randomizer->shuffleArray($persons)) . PHP_EOL; いますぐ試してみたい方はこちら!(PHP Playground) 名前リストをシャッフルしてから順番を表示 -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 25 テストに使う 架空のメールアドレス や名前がほしい
適当に色んなパターンの テストデータを いっぱい用意したい -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 26 <?php // 適当な10文字のexample.comメールアドレスを作成する
$randomizer = new \Random\Randomizer(); $canUseChars = 'abcdefghijklmnopqrstuvwxyz0123456789'; for ($i = 0; $i < 15; $i++) { echo $i + 1 . '個目のメールアドレス: ' . $randomizer->getBytesFromString($canUseChars, 10) . '@example.com' . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 27 <?php // 適当な10文字のexample.comメールアドレスを作成する
$randomizer = new \Random\Randomizer(); $canUseChars = 'abcdefghijklmnopqrstuvwxyz0123456789'; for ($i = 0; $i < 15; $i++) { echo $i + 1 . '個目のメールアドレス: ' . $randomizer->getBytesFromString($canUseChars, 10) . '@example.com' . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) 英数字からランダムで10文字選ぶ (そのあと@example.comと結合) -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 28 <?php // 10パターンのテスト用名前を作成する
$randomizer = new \Random\Randomizer(); $testLastNames = $randomizer->shuffleArray(['佐藤', '鈴木', '高橋', '田中', '渡辺', '伊藤', '山本', '中村', '小林', '斎藤']); $testFirstNames = $randomizer->shuffleArray(['太郎', '花子', '次郎', '三郎', '美和', '健太', '恵子', '雅彦', '裕子', '和美']); for ($i = 0; $i < 10; $i++) { echo $i + 1 . '個目の名前: ' . 'テスト' . $testLastNames[$i] . ' ' . $testFirstNames[$i] . 'テスト' . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 29 <?php // 10パターンのテスト用名前を作成する
$randomizer = new \Random\Randomizer(); $testLastNames = $randomizer->shuffleArray(['佐藤', '鈴木', '高橋', '田中', '渡辺', '伊藤', '山本', '中村', '小林', '斎藤']); $testFirstNames = $randomizer->shuffleArray(['太郎', '花子', '次郎', '三郎', '美和', '健太', '恵子', '雅彦', '裕子', '和美']); for ($i = 0; $i < 10; $i++) { echo $i + 1 . '個目の名前: ' . 'テスト' . $testLastNames[$i] . ' ' . $testFirstNames[$i] . 'テスト' . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) 名字リストや名前リストの順番を シャッフルする -
© 2012-2024 BASE, Inc. #phpcon_odawara 適当なテストデータを作成したい 30 <?php // 10パターンのテスト用名前を作成する
$randomizer = new \Random\Randomizer(); $testLastNames = $randomizer->shuffleArray(['佐藤', '鈴木', '高橋', '田中', '渡辺', '伊藤', '山本', '中村', '小林', '斎藤']); $testFirstNames = $randomizer->shuffleArray(['太郎', '花子', '次郎', '三郎', '美和', '健太', '恵子', '雅彦', '裕子', '和美']); for ($i = 0; $i < 10; $i++) { echo $i + 1 . '個目の名前: ' . 'テスト' . $testLastNames[$i] . ' ' . $testFirstNames[$i] . 'テスト' . PHP_EOL; } いますぐ試してみたい方はこちら!(PHP Playground) シャッフルした名字リストや名前リストから テスト用のフルネームを生成する 例:テスト佐藤 花子テスト -
© 2012-2024 BASE, Inc. #phpcon_odawara おまけ:適当なUUIDを作成したい 32 RFC 4122 に基づく
UUIDを作りたい! ramsay/uuidでええやろ 自作しなくても・・・ (それはそう) -
© 2012-2024 BASE, Inc. #phpcon_odawara おまけ:適当なUUIDを作成したい 33 <?php // RFC
4122に基づくUUIDv4の作成 function createUUIDv4Variant1() { $randomizer = new \Random\Randomizer(); $randomHex = $randomizer->getBytesFromString('0123456789abcdef', 32); // UUID v4 であることを示す $randomHex[12] = 4; // RFC 4122 に基づくUUIDであると示すバリアントを設定 $randomHex[16] = $randomizer->getBytesFromString('89ab', 1); return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split($randomHex, 4)); } -
© 2012-2024 BASE, Inc. #phpcon_odawara おまけ:適当なUUIDを作成したい 34 <?php // 5000万個のUUIDを生成して衝突が起きないか確認
$uuids = []; $createdUuidCountIfNoConflict = 50000000; for ($i = 0; $i < $createdUuidCountIfNoConflict; $i++) { $uuid = createUUIDv4Variant1(); $uuids[$uuid] = $uuid; } echo 'Conflict Count: ' . ($createdUuidCountIfNoConflict - count($uuids)) . PHP_EOL; echo 'Random UUIDs: ' . PHP_EOL . implode(', ' . PHP_EOL, (new \Random\Randomizer())->pickArrayKeys($uuids, 3)); いますぐ10万個試してみたい方はこちら!(PHP Playground) -
© 2012-2024 BASE, Inc. #phpcon_odawara おまけ:PHP(CUI)でビンゴマシン 35 ビンゴをしたいのに ビンゴマシンが無い! ビンゴカードだけで
ビンゴしたい! いや別にCUI上で やらなくても・・・ -
© 2012-2024 BASE, Inc. #phpcon_odawara おまけ:PHP(CUI)でビンゴマシン 36 <?php // ビンゴマシン代わり
$randomizer = new \Random\Randomizer(); $numbers = range(1, 75); $numbers = $randomizer->shuffleArray($numbers); function pickNumber(array &$numbers): void { echo 'ビンゴを回します。ガラガラ...' . PHP_EOL; sleep(3); echo 'ただいま出てきた番号は: ' . array_shift($numbers) . PHP_EOL; } pickNumber($numbers); // お好きなタイミングで ターミナルかコマンドプロンプトなどでお試しください!