Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\R...

02
April 12, 2024

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
Tweet

More Decks by 02

Other Decks in Programming

Transcript

  1. © 2012-2024 BASE, Inc. #phpcon_odawara BASE, Inc. BASE BANK 振込申請チーム

    Engineering Program Manager / フルサイクルエンジニア PHPカンファレンス2024 実行委員長 地元が湘南で、遠足で小田原城行った 小学生時代を送っていました 02 大津 和槻(おおつ かずき) :@cocoeyes02 自己紹介
  2. © 2012-2024 BASE, Inc. #phpcon_odawara 時間切れが怖いので募集なう! バックエンド エンジニア SRE フロントエンド

    エンジニア セキュリティ エンジニア QA エンジニア データ エンジニア etc… We are hiring! https://binc.jp/jobs
  3. © 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 の乱数実装がグダグダな話
  4. © 2012-2024 BASE, Inc. #phpcon_odawara 今回出てくるコード 12 • 好きな規則のパスワードを作成したい •

    ランダムに何かを選びたい(くじびき) • ランダムに何かを選びたい(順番決め) • 適当なテストデータを用意したい(メールアドレス) • 適当なテストデータを用意したい(フルネーム) • おまけ:適当なUUIDを作成したい • おまけ:PHP(CUI)でビンゴマシンを回したい https://github.com/cocoeyes02/php-randomizer-sample
  5. © 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)
  6. © 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文字選ぶ
  7. © 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)
  8. © 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の整数からランダムで出力
  9. © 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) 番号と名前の対応表から ファシリをする人の名前を出力
  10. © 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)
  11. © 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) 名前リストをシャッフルしてから順番を表示
  12. © 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)
  13. © 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と結合)
  14. © 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)
  15. © 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) 名字リストや名前リストの順番を シャッフルする
  16. © 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) シャッフルした名字リストや名前リストから テスト用のフルネームを生成する 例:テスト佐藤 花子テスト
  17. © 2012-2024 BASE, Inc. #phpcon_odawara おまけ:適当なUUIDを作成したい 32 RFC 4122 に基づく

    UUIDを作りたい! ramsay/uuidでええやろ 自作しなくても・・・ (それはそう)
  18. © 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)); }
  19. © 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)
  20. © 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); // お好きなタイミングで ターミナルかコマンドプロンプトなどでお試しください!