- 投稿日:2021-02-26T21:35:10+09:00
PHPでチェックサム(XOR)を取得する実装方法
前書き
あまり具体的なPHPでのチェックサム(XOR)の実装方法の記事がなかったので記録も兼ねて作成してみました。
実行速度がより速い方法は色々あると思いますので、あくまで参考程度にしてください。実装
$data = "対象文字列"; $binary_data = bin2hex($data); //文字列をバイナリデータ(16進数)に変換 $binary_array = str_split($binary_data, 2); //バイナリデータを2bit毎に分ける foreach($binary_array as $key => $binary) { if($key === 0) { $check_sum_first = sprintf('%08d', decbin(hexdec($binary))); //16進数⇒10進数⇒2進数(0左詰めの8bit) continue; } $check_sum_second = sprintf('%08d', decbin(hexdec($binary))); // 1bitずつ排他的論理和(xor)を求める for($i = 0, $i < strlen($check_sum_first), $i++) { $check_sum_first[$i] = intval($check_sum_first[$i]) ^ intval($check_sum_second[$i]); } } //2進数⇒10進数⇒16進数⇒デコード処理 $check_sum = hex2bin(dechex(bindec($check_sum_first)));後書き
実装見てわかる通り、泥臭いやり方をしています。
文字列を16進数に変換後、2bit毎に配列に分けて2進数(8bit)に変換してから1bit毎に排他的論理和を求めています。
実際に正しくチェックサムの結果が出てるかどうかはツール等を使わないとわからないので
バイナリエディターやXOR算出ツールなどを利用して確認してみてください。
- 投稿日:2021-02-26T18:54:19+09:00
Composerを1系から2系にアップデートする
はじめに
作業PCにインストールしているComposerを1系から2系にアップデートしたので、その備忘録です
現在のバージョン
$ composer -V Composer version 1.10.10 2020-08-03 11:35:19アップデートする
composer self-update
だと、1系の最新バージョンになるので、後述するコマンドでアップデートする$ composer self-update A new stable major version of Composer is available (2.0.11), run "composer self-update --2" to update to it. See also https://github.com/composer/composer/releases for changelogs. Updating to version 1.10.20 (1 channel). Downloading (100%) Use composer self-update --rollback to return to version 1.10.10$ composer -V Composer version 1.10.20 2021-01-27 15:41:06
composer self-update --2
で2系にアップデートする$ composer self-update --2 Updating to version 2.0.11 (2.x channel). Downloading (100%) Use composer self-update --rollback to return to version 1.10.20$ composer -V Composer version 2.0.11 2021-02-24 14:57:232系から1系に戻す
$ composer self-update --rollback Rolling back to version 2021-01-27_15-41-06-1.10.20.$ composer -V Composer version 1.10.20 2021-01-27 15:41:06まとめ
Composer2系になったことで変わったことはこちらでまとまっているので参考にしてみてください
- 投稿日:2021-02-26T18:47:28+09:00
PHP URLパラメータ,GET,PSOTについてまとめてみた。
はじめに
・前提知識として、httpプロトコルがわかる方。
・URLパラメータ,GET,POSTについて、よくわからない方。
・Web系に関する知識に興味がある方。URLパラメータ
・サーバーに情報をおくるために用意する、
URLの文末に渡す値(変数)などのこと。
(クエリ文字列ともよ呼ぶ)
※URLの末尾に『?』を追加しその後に、『パラメータ(値)』
『URL』+『?』+『パラメータ』サンプルコード (aタグを利用して表現)
query.php<?php // 『?』 以降がURLパラメータ echo '<a href="queryGet.php?valueGet=これはパラメータです">リンク</a>'; ?>GET
・httpプロトコルのメソッドの1つ。
リクエストする情報をURLパラメータで付与する通信方式。※GETで送信した値を取得するには$_GETを使用。
$_GETは連想配列として値が格納される。サンプルコード
query.php<?php // 『?』 以降がURLパラメータ (URLパラメータを付与したので、GETされる) echo '<a href="queryGet.php?valueGet=これはパラメータです">リンク</a>'; ?>queryGet.php<?php // // GETで送信された値を取得し、配列として格納される echo $_GET['valueGet']; echo '<br>'; // $_GETが連想配列であるかの確認 echo gettype($_GET); ?>実行結果
=== === === === ==== === 続き⇩ === === === === ==== ===
=== === === === ==== === 終わり === === === === ==== ===
POST
・GET同様、httpプロトコルのメソッドの1つ。
メッセージボディに入力した値を付与する通信方式。※フォームから入力された値などが該当する。
POSTで送信した値を取得するには$_POSTを使用。
$_POSTは$_GETと同様、
連想配列として値が格納される。サンプルコード
formPost.php<form action = "formPost.php" method = "post"> <br> <input type="text" name="valuePost"> <input type="submit" value="送信"> </form>formPost.php<?php // POSTで送信された値を取得し、連想配列として格納される echo $_POST['valuePost']; echo '<br>'; // $_POSTが配列であるかの確認 echo gettype($_POST); ?>実行結果
=== === === === ==== === 続き⇩ === === === === ==== ===
=== === === === ==== === 終わり === === === === ==== ===
まとめ
・GET,POST↓
httpプロトコルのメソッド。・GET↓
URLパラメータを付与して通信。・POST↓
フォームなどを利用してデータを付与して通信。・$_GET↓
GETで送信したデータを取得するために使用。・$_POST↓
POSTで送信したデータを取得するために使用。余談
・GETはURLに直接付与するので目で見えてしまう。
以下のように↓
このような理由から、
機密性の高い情報はGETを使用することは推奨されていません。・POSTはメッセージボディに値を付与するため、
上記の画像のように確認はできない※しかし、通信を盗聴されたら見れるため
セキュリティには注意が必要。
- 投稿日:2021-02-26T18:47:28+09:00
PHP URLパラメータ,GET,POSTについてまとめてみた。
はじめに
・前提知識として、httpプロトコルがわかる方。
・URLパラメータ,GET,POSTについて、よくわからない方。
・Web系に関する知識に興味がある方。URLパラメータ
・サーバーに情報をおくるために用意する、
URLの文末に渡す値(変数)などのこと。
(クエリ文字列ともよ呼ぶ)
※URLの末尾に『?』を追加しその後に、『パラメータ(値)』
『URL』+『?』+『パラメータ』サンプルコード (aタグを利用して表現)
query.php<?php // 『?』 以降がURLパラメータ echo '<a href="queryGet.php?valueGet=これはパラメータです">GET</a>'; ?>GET
・httpプロトコルのメソッドの1つ。
リクエストする情報をURLパラメータで付与する通信方式。※GETで送信した値を取得するには$_GETを使用。
$_GETは連想配列として値が格納される。サンプルコード
query.php<?php // 『?』 以降がURLパラメータ (URLパラメータを付与したので、GETされる) echo '<a href="queryGet.php?valueGet=これはパラメータです">リンク</a>'; ?>queryGet.php<?php // // GETで送信された値を取得し、配列として格納される echo $_GET['valueGet']; echo '<br>'; // $_GETが連想配列であるかの確認 echo gettype($_GET); ?>実行結果
=== === === === ==== === 続き⇩ === === === === ==== ===
=== === === === ==== === 終わり === === === === ==== ===
POST
・GET同様、httpプロトコルのメソッドの1つ。
メッセージボディに入力した値を付与する通信方式。※フォームから入力された値などが該当する。
POSTで送信した値を取得するには$_POSTを使用。
$_POSTは$_GETと同様、
連想配列として値が格納される。サンプルコード
formPost.php<form action = "formPost.php" method = "post"> <br> <input type="text" name="valuePost"> <input type="submit" value="送信"> </form>formPost.php<?php // POSTで送信された値を取得し、連想配列として格納される echo $_POST['valuePost']; echo '<br>'; // $_POSTが配列であるかの確認 echo gettype($_POST); ?>実行結果
=== === === === ==== === 続き⇩ === === === === ==== ===
=== === === === ==== === 終わり === === === === ==== ===
まとめ
・GET,POST↓
httpプロトコルのメソッド。・GET↓
URLパラメータを付与して通信。・POST↓
フォームなどを利用してデータを付与して通信。・$_GET↓
GETで送信したデータを取得するために使用。・$_POST↓
POSTで送信したデータを取得するために使用。※余談
・GETはURLに直接付与するので目で見えてしまう。
以下のように↓
このような理由から、
機密性の高い情報はGETを使用することは推奨されていません。・POSTはメッセージボディに値を付与するため、
上記の画像のように確認はできない※しかし、通信を盗聴されたら見れるため
セキュリティには注意が必要。
- 投稿日:2021-02-26T18:14:37+09:00
コマンドラインでネットから ino ファイルをダウンロードして置換して Arduino ボードに書き込みをする
コマンドラインでネットから ino ファイルをダウンロードして置換して Arduino ボードに書き込みをします。
まずは前提条件として、arduino-cli のインストールが必要になります。
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh ; sudo cp ~/bin/arduino-cli /usr/local/bin/arduino-cli ;次に php などからも arduino の USB シリアルポートにアクセスができるように権限を変更します。
sudo chmod 777 /dev/ttyUSB0 ;アップロード用の置換前の arduino のスケッチファイル。LED が 0.1秒ごとにチカチカします。
led_100.inovoid setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(100); digitalWrite(LED_BUILTIN, LOW); delay(100); }これを 3秒ごとにチカチカするようにPHPで変更してコマンドラインでアップロードをします。
index.php<?php $url_ino = "led_100.ino"; // or http://hogehoge.github/hoge.ino $replace_from = array("100"); $replace_to = array("3000"); //system( "ls /dev/ttyUSB*"); $project_name = basename($url_ino, ".ino"); $project_name_ino = "{$project_name}/{$project_name}.ino"; // @chmod( $project_name , 0777 ); @mkdir( $project_name ); @chmod( $project_name , 0777 ); $page_ino = file_get_contents( $url_ino ); $page_ino_replaced = str_replace( $replace_from , $replace_to , $page_ino ); // @chmod( $project_name_ino , 0777 ); file_put_contents( $project_name_ino , $page_ino_replaced ); @chmod( $project_name_ino , 0777 ); // sudo cp ~/bin/arduino-cli /usr/local/bin/arduino-cli // sudo chmod 777 /dev/ttyUSB0 # compile and update $cmd_compile = "arduino-cli compile --fqbn arduino:avr:nano {$project_name_ino}"; system( $cmd_compile ); $cmd_upload = "arduino-cli upload -p /dev/ttyUSB0 -b arduino:avr:nano:cpu=atmega328old {$project_name}"; system( $cmd_upload );実行
php index.phpこれで、本来は 0.1秒ごとのチカチカが 3秒ごとのチカチカになっているかと思います。
応用例としては、複数のボードのIPアドレスやMacアドレスの管理、UUIDの指定ができます。
どうしても静的なプロジェクトファイルになりがちなinoファイルを動的に書き換えられるようになるかと思います。Arduino ってどういうのを書き込んだか忘れるので githubでソースコード、PHP とデータベースで固有番号を付与して管理してもよいでしょう。
- 投稿日:2021-02-26T16:13:52+09:00
PHP5上級試験/準上級試験の上級合格に挑戦(9) 5章配列後編
5章配列後編
各要素に対する関数(1)
コールバック関数登場。
他の関数に引数として渡される関数で、外側の関数で何らかの処理やアクションを実行するというもの。
上記をもとに(1)と(2)が指し示す関数とはなにか?(1)配列の各要素に対して、指定した関数(=これがコールバック関数)を実行できる。
また、(2)と違って、各要素に対して上書きでき、添字/キーをcallbackの引数に取れる。
(2)同様。ただし、(1)と違って、上書きや添字・キーを引数にすることができない。ただし、複数の配列を引数にすることができる。
(3) 下記の配列を使い、引数は (値名)、(キー名)、(第3の引数))です。とコールバック関数の引数を出力させるコードを書け。なお、第3の引数は 引数第3C (つまり文字列)とする。
(4) 1~5までの数が入っている配列\$numbersを作り、第1引数\$key・第2引数は\$valとし、「キーは、\$valです」と出力させ、さらに配列に対して20をかけ、次にその$numbersを出力せよ。
これを2つの方法で出力せよ。(ただし、一方はキー出力ができないのでそれはスキップしてOK)$array = [
"a" => 1,
"b" => 2,
"c" => 3,
] ;解答
(1) array_walk()
(2) array_map()index.php//(3) $array = [ "a" => 1, "b" => 2, "c" => 3, ] ; function callback ( $a, $b, $c ) { echo "引数は、" . $a . "、" . $b . "、" . $c . "です。<br>" ; } $response = array_walk( $array, "callback", "引数第3C" ) ; var_dump( $response ) ; //(4) $numbers = range(1,5); array_walk($numbers, function(&$val, $index) { echo '添字/キーは '.$index; print"<br>"; $val = $val * 20; }); print_r($numbers); print"<br>"; // 配列の中身をリセットする $numbers = [1,2,3,4,5]; array_map(function(&$val) { $val = $val * 20; }, $numbers); print_r($numbers);出力結果
引数は、1、a、引数第3Cです。
引数は、2、b、引数第3Cです。
引数は、3、c、引数第3Cです。
bool(true)添字/キーは 0
添字/キーは 1
添字/キーは 2
添字/キーは 3
添字/キーは 4
Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 )
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )(3)はコールバック関数の中身を出力することでarray_walkの仕組みを知ることが目的。
ちなみに最後のところで、array_walkがうまくいったらTrueが返るということもわかる。もちろんarray_mapもTrue/Falseが返る。
(4)array_walkとarray_mapの違いを知るところ。
array_walkはインデックス配列でもちゃんとキーが返る。
ちなみにarray_walkでも、引数を参照渡しにしていないと上書きにならないことに注意。
array_mapでは参照渡しにしても無駄。array_walkとarray_mapの違い
- array_walk ( array &\$array , callable \$callback [, mixed \$userdata = NULL ] ):boolという形式
- &$arrayは対象の配列
- $callbackは各要素を引数にして実行されるコールバック関数「名」。コールバックの第1引数に要素の値、第2引数に要素のキー、第3引数にarray_walk()の第3引数、が渡される。 (第1引数がキーではなく、逆になるので要注意)
- $userdataは指定した場合のみ、上記の第3引数として渡される。つまり必ず指定する必要はない。
- array_mapの場合、array_walkでは使える引数のキーがないため、値のみしか使えず、添字/キーを扱う処理ができない
- ただし、array_mapは、array_walkでは単独の配列を引数にしか取得できないところ、複数の配列を引数に取得することができる
- array_map( callable \$callback,array \$arr1[, array \$arr2...]) で、arrで複数の配列を引数に取れるところ
- array_walkとarray_mapの引数の順番を比べても、array_walkだと、最初に配列、次にコールバック関数というところ、mapだと逆になるのでここも注意するべきところ
- array_mapの複数の配列は指定できるが、コールバック関数を等しく作用させるため、要素数は同じでないといけない(参考|PHPマニュアル)
各要素に対する関数(2)
(1)配列の各要素の和・積を出力する関数は?
(2)ユーザー定義関数を用いて配列内の要素を1つに集約する関数は?
(3) $a = range(1,5); を使って、(1)を実現せよ。
(4) (3)の配列\$aを使い、array_sum()と同じことをせよ。
(5) 第3の引数を使い、(4)+2になるようにせよ
解答
(1) array_sum()、array_product()
(2) array_reduce() ※ちなみに「減らす」という意味。要素を減らすってことだろう。index.php//(3) $a = range(1,4); echo array_sum($a); print '<br>'; echo array_product($a); print '<br>'; //(4) $a = range(1,4); function My_func($x,$y){ return $x + $y; } echo array_reduce($a,'My_func'); print '<br>'; //(5) echo array_reduce($a,'My_func',2);出力結果
10
24
10
12(4)array_reduceでも同じことができる。
ただ、これをやるぐらいならもちろんarray_sumを使ったほうが簡単。
積や和を求めない場合に有効。
書式はこれ
array_reduce(array \$array, callable \$function_name[, mixed $initial = NULL]);
最初が配列で、2番めが配列の各要素に対して行うコールバック関数。
3番めは、1番目に計算するときにあらかじめ入っている数値。普段はなくてOK
((5)のように、結果に+1したいとか、そういう微調整に使う)ソート
(1)値を基準とした昇順ソートで、配列のキーも変更する関数は?
(2)値を基準とした降順でソートで、配列のキーも変更する関数は?
(3)値を基準とした昇順ソートで、配列のキーは変更しない関数は?
(4)値を基準とした降順でソートで、配列のキーも変更しない関数は?
(5)キーを基準とした昇順ソートをする関数は?
(6)キーを基準とした降順でソートをする関数は?
(7)値を基準とした昇順ソートだが、任意の基準も含み、配列のキー・値を変化させる関数は?
(8)値を基準とした昇順ソートで、任意の基準も含むが、配列のキー・値は変化しない関数は?
(9)キーを基準とした昇順ソートで、任意の基準も含むが、配列のキー・値は変化しない関数は?
(10)配列の要素を自然順で大文字小文字を区別する関数は?
(11)配列の要素を自然順で大文字小文字を区別しない関数は?
(12)(1)〜(6)の第2引数であるソート型のオプションにはどんなものがあるか?
(13) \$money = [100, 50, 20, 4000]; この配列を昇順・降順に並べ替えて出力せよ
(14) 下記を、キーが壊れないように、値を昇順・降順に並べ替えて出力せよ
$programs = array(
'PHP' => 60,
'CSS' => 80,
'HTML' => 100,
'Javascript' => 30
);
(15)(14)の配列を、今度はキーを昇順・降順に並べ替えて出力せよ。値はそのままとする。
(16)下記の配列の値を辞書順に昇順、そして自然順の昇順に並べ替えて出力せよ。
なお、下記は配列名が違うだけで中身は同じである。\$array1 = array("img22.png", "img11.png", "img12.png", "img100.png");
$array2 = array("img22.png", "img11.png", "img12.png", "img100.png");
解答(1)sort() /そーと
(2)rsort()/ りそーと
(3)asort() /あそーと
(4)arsort() /ありそーと
(5)ksort()/きそーと
(6)krsort()/きりそーと
(7)usort()/ゆそーと
(8)uasort()/ゆあそーと
(9)uksort()/ゆきそーと
(10)natsort()/なちゅそーと
(11)natcasesort()/なちゅけーすそーと
(12)SORT_REGULAR/数値形式の文字列同士は数値として比較
SORT_NUMERIC/値を数値として比較
SORT_STRING/値を文字列として比較index.php//(13) $money = [100, 50, 20, 4000]; sort($money); var_dump($money); print '<br>'; rsort($money); var_dump($money); print '<br>'; //(14) $programs = array( 'PHP' => 60, 'CSS' => 80, 'HTML' => 100, 'Javascript' => 30 ); asort($programs); var_dump($programs); print '<br>'; arsort($programs); var_dump($programs); print '<br>'; //(15) ksort($programs); var_dump($programs); print '<br>'; krsort($programs); var_dump($programs); print '<br>'; //(16) $array1 = $array2 = array("img22.png", "img11.png", "img12.png", "img100.png"); asort($array1); var_dump($array1); print '<br>'; natsort($array2); var_dump($array2);出力結果
array(4) { [0]=> int(20) [1]=> int(50) [2]=> int(100) [3]=> int(4000) }
array(4) { [0]=> int(4000) [1]=> int(100) [2]=> int(50) [3]=> int(20) }
array(4) { ["Javascript"]=> int(30) ["PHP"]=> int(60) ["CSS"]=> int(80) ["HTML"]=> int(100) }
array(4) { ["HTML"]=> int(100) ["CSS"]=> int(80) ["PHP"]=> int(60) ["Javascript"]=> int(30) }
array(4) { ["CSS"]=> int(80) ["HTML"]=> int(100) ["Javascript"]=> int(30) ["PHP"]=> int(60) }
array(4) { ["PHP"]=> int(60) ["Javascript"]=> int(30) ["HTML"]=> int(100) ["CSS"]=> int(80) }
array(4) { [3]=> string(10) "img100.png" [1]=> string(9) "img11.png" [2]=> string(9) "img12.png" [0]=> string(9) "img22.png" }
array(4) { [1]=> string(9) "img11.png" [2]=> string(9) "img12.png" [0]=> string(9) "img22.png" [3]=> string(10) "img100.png" }(14)のようにしないで、同じように値をソートするsort()でもできるが、
この場合、キーが壊れて、番号が振られてしまうため、この場合はasort()になった。
sortはキーを振り直すが、asort,ksortはキーを振り直さない。この違いは注意したい。(16)は自然順と辞書順の違いを理解するための問題。
自然順は、数値に見えるものはすべて数値と考え、数値の大小で順番を決めるもの(一番最後の解答)
辞書順の場合、数値に見えるものでも、辞書順になる。(一番最後から2番めの解答)。
自然順と辞書順の並べ方について理解しておく
なお、natsortとnatcasesortはキーが振り直されるので注意。(7)〜(9)のユーザー定義型ソート
- usortはキーが振り直されるが、uasort,uksortはキーはそのままになる。
- ロジックを理解できないと、かなりハード。
次の配列を、上記のsort関数を使わず、ユーザー定義型ソートで昇降順機能を実現し、コールバック関数で並べ替えて出力せよ。
$a = array(4, 10, 8, 26, 11);(1) 小さい順(昇順)に並べ替える
(2) 大きい順(降順)に並べ替える
(3) 10を一番左に固定してあとは昇順で並べ替え
(4) 10を一番左に固定してあとは降順で並べ替え
(5) 10を一番右に固定してあとは昇順で並べ替え
(6) 10を一番右に固定してあとは降順で並べ替えindex.php$a = array(4, 10, 8, 26, 11); //各コールバック関数 //(1) function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } //(2) function cmp2($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } //(3) function cmp3($a, $b) { if ($a == 10 ) { return -1; } if ($b == 10 ){ return 1; } if ($a <> 10 || $b <> 10){ if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } } //(4) function cmp4($a, $b) { if ($a == 10 ) { return 1; } if ($b == 10 ){ return -1; } if ($a <> 10 || $b <> 10){ if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } } //(5) function cmp5($a, $b) { if ($a == 10 ) { return 1; } if ($b == 10 ){ return -1; } if ($a <> 10 || $b <> 10){ if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } } //(6) function cmp6($a, $b) { if ($a == 10 ) { return -1; } if ($b == 10 ){ return 1; } if ($a <> 10 || $b <> 10){ if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } } // ここからメイン usort($a, "cmp"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; } print "<br>"; usort($a, "cmp2"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; } print "<br>"; usort($a, "cmp3"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; } print "<br>"; usort($a, "cmp4"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; } print "<br>"; usort($a, "cmp5"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; } print "<br>"; usort($a, "cmp6"); foreach ($a as $key => $value) { echo "$key: $value"; print "<br>"; }出力結果
0: 26
1: 11
2: 10
3: 8
4: 40: 10
1: 4
2: 8
3: 11
4: 260: 4
1: 8
2: 11
3: 26
4: 100: 26
1: 11
2: 8
3: 4
4: 100: 10
1: 26
2: 11
3: 8
4: 4解説
- 最初この関数を見た時よくわからず面食らった
- とりあえず、各要素を比較して数値を与えてソートしているということはわかった
- コールバック関数の不等式の部分で、
<
だったら、昇順になり、>
だったら降順になる- ある数を固定して一番左にしたい時は、$aがその数の時、「1」を与え、$bの場合は「ー1」を与える。右の場合は逆 それ以外は既存のになるようにif文をつくればよい
- ルールは分かった、だけど、なぜ正の数なら左に、負の数なら右に移動していくのか調べてもさっぱりわからず
- クイックソートというのが関係しているらしいけど・・・ひとまず宿題
- ひとまず上の問題(実験)はあれこれ不等号とか逆にしてみたりしてルールがわかったのでメモ
簡単な配列で解説してみる
$a = array(8, 3, 5)
で、これを比べるとする
場合分けすると、
8,3
8,5
3,8
3,5
5,8
5,3
の6通りある。昇順に並べ替えるとして
まずは 8と3をくらべる
昇順に並べ替える時、下記のルールになるので、index.phpfunction cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; }もしクイックソートという形になるとすると
[参考クイックソートのアルゴリズムをわかりやすく解説します|じゃぱざむ](https://jpazamu.com/quick_sort/)8をピボットにすると 3と5は「1」になるので、8の左に置く
5,3,8
次に3をピボットにすると 3は5より小さいので−1,つまり右におくことになる
3,5,8
ソートの数は1つだけになったので、これにて終了って感じかな
では、逆に固定する場合を考える
$a = array(8, 3, 5)
で、これを比べるとするとして、3を一番左に置きたいとする
場合分けすると、
8,3
8,5
3,8
3,5
5,8
5,3では、8と3を比べた時 左へ移動するのは−1、右へ移動するのは1を示してくれればOKなわけなので、
3を固定する場合は、a=3のときはa<b の結果を-1or1にしたり、 b<aの結果を-1or1にしたりすればよい。
簡単な配列でやってみたら意外と理解できたかな。他ソート関数
(1) 複数のインデックス配列を一度にソートするのは?
(2) 配列の逆に並べ替えるのは?
(3) 配列のキーや値を入れかえるのは?
(4) 配列をシャッフルするのは?
(5) $a = array('c','b','a','b');で、$aをシャッフルし出力せよ(6) $b = array(1,2,2,3);で、$bを逆順番にして出力せよ
(7) \$a,$bを昇順で同時に並べ替えよ
解答
(1) array_multisort(array \$array [, $arg = SORT_ASC [, mixed \$arg = SORT_REGULAR [,mixed...]]]);
(2) array_reverse(array);
(3) array_flip(array);
(4) shuffle(array);index.php$a = array('c','b','a','b'); var_dump($a); print '<br>'; shuffle($a); var_dump($a); print '<br>'; $b = array(1,2,2,3); var_dump($b); print '<br>'; array_reverse($b); var_dump($b); print '<br>'; array_multisort($a,$b); var_dump($a); print '<br>'; var_dump($b);配列集合演算
(1) 複数の配列をマージするのは?
(2) 配列の差、つまり、ある配列にはあり、他の配列にはない値を集めた配列を返すのは?
(3) ある特定の条件を満たす値だけを集めた配列を返すのは?
(4) 配列から重複する値を取り除くのは?
(5) 複数の配列に共通して含まれる値を集めるのは?
(6) \$a = \$b= array('php');という配列がありこれらをマージした$cを出力せよ
(7) \$c = array('php' => 5.3); \$d = array('php' => 5.4); これらをマージした\$eを出力せよ
(8) \$x = array('a','b','c','d'); \$y= array('a','b'); \$z= array('b','c'); ある配列には含まれていて、他の配列には含まれている要素を配列にして出力せよ ただし、xとy,xとyとzの2つを出力する。
(9) \$f = array(78,79,80,81,102); で、80以上の数値を抽出するコールバック関数\$my_funcをつくって抽出して出力せよ。引数は$sourceとする(10) \$h = array(1,2,3,1,2,4,3,4,5)で重複する値を取り除いた配列$iを出力せよ
(11) \$j = array (2,4,6,8); (10)の$iと$jで、共通して含まれる値を集めた配列$kを出力せよ
解答
(1) array_merge(array1,array2...)
(2) array_diff(array1,array2...)
(3) array_fliter(array \$array, callable $callback = "")
(4) array_unique(array)
(5) array_intersect(array1,array2...)index.php//(6) $a = $b = array('php'); $c =array_merge($a,$b); var_dump($c); print '<br>'; //(7) $c = array('php' => 5.3); $d = array('php' => 5.4 ); $e = array_merge($c,$d); var_dump($e); print '<br>'; //(8) $x = array('a','b','c','d'); $y= array('a','b'); $z= array('b','c'); print_r(array_diff($x,$y)); print '<br>'; print_r(array_diff($x,$y,$z)); print '<br>'; //(9) $f = array(78,79,80,81,102); function my_func($source){ return $source >= 80; } $g = array_filter($f,'my_func'); var_dump($g); //(10) print '<br>'; $h = array(1,2,3,1,2,4,3,4,5); $i = array_unique($h); var_dump($i); //(11) print '<br>'; $j = array (2,4,6,8); $k = array_intersect($i,$j); var_dump($k);配列への値の追加と削除
JSをかじってたら難しくない
(1) 配列の先頭へ追加または削除する関数は?
(2) 配列の末尾に追加または削除する関数は?
(3) array(1,2,3);で 先頭の1を削除し、4を追加して出力せよ
(4) (3)からさらに末尾の3を削除し、5を追加して出力せよ
解答
(1) array_unshift(),array_shift()
(2) array_push(),array_pop()index.php//(3) $a = array(1,2,3); array_shift($a); array_unshift($a,4); var_dump($a); print '<br>'; //(4) array_pop($a); array_push($a,5); var_dump($a);出力結果
array(3) { [0]=> int(4) [1]=> int(2) [2]=> int(3) }
array(3) { [0]=> int(4) [1]=> int(2) [2]=> int(5) }イメージは頭から移動させるのがshiftなのでその反対はもとに戻すってことでunshift
pushするってのはお尻に押し込むイメージでpopはお尻から飛び出るイメージ。まとめ
配列は非常に沢山の関数があり、そして複雑な関数もある、難しいところだった
とくにユーザー定義型のソート関数や、array_walk系の関数は理解しておかないと永遠に覚えられないので、きっちり理解してから覚えるようにしたい前編では配列の基本、とくに通常でしなさそうな指定方法での出力がどうなるかということ、
中編から後編まで各テーマごとにいろいろな関数が出てくるので中編〜後編はドリルもあるのでしっかりスマホで復習しておきたい。
ソラでコードがかけるようにしたいところ。
後編は上記の関数ドリルに加え、さっきも書いたとおり、ユーザ定義型のソート関数の仕組みと、array_walk系の関数を理解しておきたい。これらを理解すればおそらく配列は解答率が上がるはずだ。
- 投稿日:2021-02-26T13:06:43+09:00
【PHP】文字列の入った変数をあたかも関数みたいに使ってる記法をたまに見かけるけどあれって何?
初めに
タイトルの通りのことをソースコードを眺めているときに思ったのでそれについて調べたことをまとめた備忘録です。
Laravel
により提供されているIlluminate
配下のソースコードを眺めているときになんだこれ?って思ったのがきっかけです。以下、なんだこれ?って思った処理のあるソースコード。
Illuminate/Auth/AuthManager.phpprotected function resolve($name) { $config = $this->getConfig($name); // ~~中略~~ $driverMethod = 'create'.ucfirst($config['driver']).'Driver'; if (method_exists($this, $driverMethod)) { return $this->{$driverMethod}($name, $config); // ★ } // ~~後略~~ }★のところに注目してください。この部分の
$this->{$driverMethod}($name, $config)
がなにをしているのかが疑問だったのでその疑問を解決すべく調べてみました。この表記はどうやら可変関数というらしい
PHP は可変関数(variable functions)の概念をサポートします。 これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。 この機能は、コールバック、関数テーブル等を実装するために使用可能です。
引用:PHP: 可変関数 - Manual例えば、
function foo() { echo "Foooooo in foo()"; } $method = "foo";のように
foo()
と、関数名と同じ名前の文字列を持つ$method
変数があったとします。このとき
$method()
のように、$method
の後ろに丸括弧を付けてみましょう。するとPHPが自動で
$method
の文字列と同名の関数を探し出して実行してくれます。これが可変関数という概念らしいです。$method(); // "Foooooo in foo()"が出力されるそれを踏まえてさっきのやつを見直してみる
以上で記事の主題は解決しました。ですが、せっかくなので先ほどの
Illuminate/Auth/AuthManager.php
がなにをやっているのかを追えるとこまで追っていきましょう。以下、再掲です。
Illuminate/Auth/AuthManager.phpprotected function resolve($name) { $config = $this->getConfig($name); // ~~中略~~ $driverMethod = 'create'.ucfirst($config['driver']).'Driver'; // 1. if (method_exists($this, $driverMethod)) { // 2. return $this->{$driverMethod}($name, $config); // 3. } // ~~後略~~ }このメソッドが呼び出される状況を、
$name
には"web"という文字列$config
にはgetConfig($name)
メソッドによって['driver' => 'session', 'provider' =>'users']
という連想配列がそれぞれ代入される、というように仮定します。
それを踏まえて番号のついた行を詳しく見てみましょう。
1. の処理
$driverMethod = 'create'.ucfirst($config['driver']).'Driver'; // 1.
ucfirst()
という関数はPHP組み込みの関数で、引数がアルファベットの文字列なら頭文字を大文字に変換して返すという処理をしてくれます。なので、
$config['driver']
が"session"
であることを踏まえると、$driverMethod
には'createSessionDriver'
という文字列が代入されます。2.の処理
if (method_exists($this, $driverMethod)) { // 2.こちらも1. と同様に
method_exists()
というPHP組み込みの関数が使われています。これは第1引数に指定したクラスオブジェクトに、第2引数で指定した名前のメソッドが定義されているかを真偽値で返してくれる関数になります。
それを踏まえると2. の処理は
AuthManager
クラスにcreateSessionDriver
という名前のメソッドが存在するか、という条件分岐を行っている処理だということが分かりました。3.の処理
return $this->{$driverMethod}($name, $config); // 3.3.の処理において先ほど説明した可変関数の概念が使われています。
いままで説明してきたことを踏まえると、この処理は
$this->createSessionDriver($name, $config);
であるということが明らかとなりました。以下、本題からそれるので簡単な説明になりますが、この
createSessionDriver()
によってLaravelではセッションによる認証機能の提供が行われることになります。よく見かける、
Auth::user();といった
Auth
ファサードによるユーザー情報の取得処理にも、このcreateSessionDriver()
から提供されている認証機能が使われています。終わりに
Laravelのファサードの実体を追っている中で疑問に思ったことをまとめてみました。
次回はファサードの実体がどこにあるかを追ってみて、その調査結果をまとめてみたいと思います。
- 投稿日:2021-02-26T12:46:51+09:00
匿名掲示板 6chan.jp を作成した話 - pull戦略について
オタクのための掲示板 6chan.jp を作成しました。その作成の経緯について書こうと思います。
http://6chan.jppull戦略
Joi Itoさんによると、Pullとは、情報や資材を備蓄するのではなく、必要に応じてネットワークから引っ張り出す方法です。
https://www.techrepublic.com/article/9-tools-to-navigate-an-uncertain-future-from-new-book-whiplash/例えば、我々の掲示板 6chan.jp では phpBB というオープンソースのフォーラムをそのまま利用しています。これは、githubというネットワークから必要なソースコードをpullした状態と言えます。
同じように、マーケティング、マネタイズ、運用マニュアル作成なども、pullによって行うことができます。つまり、必要に応じてネットワークから必要なだけリソースを引っ張り出すのです。
マネジメントの面では、支出を削減し、柔軟性を高めることができます。
例えば、Safecastは、Kickstarterでの資金提供、寄付者の強力なネットワーク、市民科学者の協力によって生まれたオープンな環境データプラットフォームであり、福島の住民が放射線がどのように拡散しているかを知る上で重要な公共プロジェクトで、プル戦略によって成功しています。
プル戦略は、コミュニケーション、プロトタイピング、資金調達、学習などの新しい方法がもたらしたイノベーションのコスト削減を利用しています。
pull戦略で気を付けたい点
pull戦略は万能ではありません。気を付けたい点がいくつかあります。
修正可能性
pullによって行われた物事を、管理者がいつでも修正でき、しかもその修正を理解している必要があります。
管理可能性
ウェブサイトは、長期的に管理する必要があるため、管理者を設置する必要があります。しかし、プルによって管理を担うことができないため、プルによって行われた機能追加・修正を含めて、管理マニュアルの作成自体をプルする必要があります。
セキュリティ
ウェブサイトに対する機能追加・修正を行うために管理パスワードを教える必要があるのであれば、セキュリティの心配が出てきます。少なくとも、担当者に実際に会い、日本にいることを確認したほうが安全です。
多重請負の防止
プルした人材が別の業者へ委託する可能性があります。これにより、コスト増えてしまいがちです。プルした相手がプロであることを確認するために、ちょっとした尋問をする必要があります。例えば、当該のソースコードの管理に必要な知識についていくつか質問しておくとよいと思います。
コンタクトの維持
プルによって機能追加・修正された事柄について質問できるように、相手とのコンタクトを維持できているのがベターです。その相手が信頼するに値する人物なら、何度でもプルすることを検討することができます。
6chan.jpの具体的な管理方法
phpBBを使っているので、基本的にはextディレクトリにエクステンションを追加する形で機能追加をします。デザインはstyleディレクトリにテーマを設置します。
いくつかの継続的管理が要求されます。
- 通報の監視
- スパムの監視
- トラフィックの監視
- 書き込みの監視
- 等
利用者が少ないうちは監視作業は楽ですが、スケールするためにはマネタイズをし、運用要員を雇う必要があります。
マネタイズの具体的な方法については現時点では未定です。利用者が実際に増えてきた段階で考えます。
6chan.jpとは
最後に、6chan.jp を宣伝させていただきます。
6chan.jp はオタク向けの匿名掲示板です。4chanが発端となっています。
5ch (旧2ch) の「いやな雰囲気」「サイコパスやトロールがいる」ということをできるだけ避けるために、知的でオタクな議論をするよう推奨しております。
我々は、匿名性を「サイレントマジョリティーからクリエイティビティを引き起こす切符」だと考えております。
- いいねやフォロワーの数で他者と競う必要がない。
- プライバシーが守られる。
- 自分のアイデンティティを傷つけることがない。
利用者が増えるほど楽しくなるので、どんどんトピックと返信を書き込んでください!
- 投稿日:2021-02-26T11:21:26+09:00
SymfonyのEncoreでVuetifyのSassを調整するための設定をする
TL;DR
symfony
のencore
が提供するwebpack.config.js
で、VuetifyのSASSを変更したい場合に、以下の設定をしました。// enables Sass/SCSS support .enableSassLoader((options) => { options.implementation = require('sass') options.sassOptions = { // fiber: require('fibers'), indentedSyntax: true, } options.additionalData = "@import 'assets/styles/variables.scss'" })以下、詳細。
個人的なメモです。
SymfonyもLaravelのLaravel Mixのような、Javascriptの開発環境をかんたんに構築するためのEncoreという仕組みが用意されています。
そのため
encore
をインストールすると、webpack.config.js
もデフォルトのものが提供されます。composer require symfony/webpack-encore-bundle yarn install
その
webpack.config.js
をカスタマイズしていくのですが、Webpackに詳しくないと、カスタマイズもままならないです。さすがに、ドキュメントが丁寧に整備されているSymfonyも、変化の流れが早いJSのWebpackの説明はシンプルになっている気がして、深く何かをしようとすると戸惑うことが多いです。
EncoreでSASSを使えるようにする。
Symfonyの公式ドキュメントのCSS Preprocessors: Sass, LESS, Stylus, etc.では、Sassが使えるようにするためのローダーの設定だけがシンプルに書かれています。
// webpack.config.js // ... Encore // ... // enable just the one you want // processes files ending in .scss or .sass .enableSassLoader() // processes files ending in .less .enableLessLoader() // processes files ending in .styl .enableStylusLoader() ;各ローダーにオプションが渡せるわけですが、それはEncoreのindex.jsを読み解いてくださいとあります。
index.jsを開いてみると、まぁ、汎用的な感じにならんでます。
ほんと、シンプルなドキュメントです。質実剛健ですね。
Vuetifyを導入する
Vuetifyもそれなりにドキュメントが充実しています。
ただ、要点だけが記載れていて断片的で、知識不足だと読み解けないんですよね。。。
今回、SASSの設定方法を書いて終わりにしようかと思いましたが、後で見返して自分で混乱する可能性もあるので、もう少し詳しく書いていきます。
混乱のもととなっているのは、VuetifyのWebpack.config.jsの設定方法は、一般的なWebpackでの設定がか書かれていますが、Encoreで導入したwebpack.config.jsとは、Encoreでラップされているので、見た目が違うからです。
そうは言っても乗り越えていきましょう。
Webpackでのインストールを参考にインストールしていきます。
ちなみに、Vuetifyはサイトの更新も頻繁で、パーマネントリンクがあるようでないような感じなので、もしリンク切れをしていたら、公式サイトの検索ボックスで「install」と入れて探してみてください。
インストールした時に入ってきた
sass-loader
が10系でした。はじめは8系だった気がしますが、いろいろとモジュールを追加していたら10になっていました。package.json・・・ "sass": "^1.26.10", "sass-loader": "10.1.0", ・・・この時のwebpack.config.jsは、Vuetifyのドキュメントの
Requires sass-loader@^8.0.0
を参考にして、以下のように設定しました。
※半年前ぐらいに設定した時は、fiberのオプションも必要だったのですが、今回、確認したら不要になっていましたので、コメントアウトしました。webpack.config.js・・・ // enables Sass/SCSS support .enableSassLoader((options) => { options.implementation = require('sass') options.sassOptions = { // fiber: require('fibers'), indentedSyntax: true, } })VuetifyのドキュメントでSASSの設定を確認する
左側のサイドメニューの「機能 > SASS variable」に 「Webpack で(Vuetifyを)インストール(した場合のSASSの設定)」方法の説明があります。
こちらもリンク切れしていたら、公式サイトで「SASS」で検索をしてください。
このドキュメントを見ていくと、
sass-loader
が9系の設定は以下を書くようにと書かれています。webpack.config.js// Requires sass-loader@^9.0.0 options: { // This is the path to your variables additionalData: "@import '@/styles/variables.scss'" },私は、10系を使っているので、9系の設定を採用して、以下のように記述しました。
// enables Sass/SCSS support .enableSassLoader((options) => { options.implementation = require('sass') options.sassOptions = { // fiber: require('fibers'), indentedSyntax: true, } options.additionalData = "@import 'assets/styles/variables.scss'" })
assets/styles/variables.scss
は、ご自分で作成したファイルのパスに合わせてください。
additionalData
の記述をsassOptions
に書いていて、2~3時間、ハマっていたのは内緒です(汗)パスの話で、一応、Symfonyの4系の標準的なフォルダ構成で設定しています。
これでSASSが設定できるようになりましたので、以下のようにブレイクポイントやコンテナサイズを修正できるようになりました。
assets/styles/variables.scss$grid-breakpoints: ( 'xs': 0, 'sm': 576px, 'md': 768px, 'lg': 992px - 24px, 'xl': 1200px - 24px ); $container-max-widths: ( 'md': map-get($grid-breakpoints, 'md') * 0.9375, 'lg': map-get($grid-breakpoints, 'lg') * 0.9677, 'xl': map-get($grid-breakpoints, 'xl') * 0.95 )まとめ
VuetifyをBootstrap4系の中で混ぜて使うことになったのですが、BootstrapのブレイクポイントとVuetifyのブレイクポイントが違うので、Vuetifyを合わせるためにSASSでの調整が必要となりました。
フルSPAでVuetifyのみで作れればいですが、既存のサービスと組み合わせたりする場合は、細かな調整が必要となります。SASSが使えるようになると、Vuetifyのカスタマイズの幅も広がります。
https://getbootstrap.jp/docs/4.5/layout/overview/
https://vuetifyjs.com/ja/components/grids/#section-4f7f304465b9
- 投稿日:2021-02-26T10:40:25+09:00
Raspberry PiでApache2(2.4) + php(8.0)を構築
Raspberry PiにApache2とphpをインストールしてwebサーバー化します。
Apache2のインストール
パッケージマネージャーのアップデート
sudo apt-get update
Apache2のインストール
sudo apt-get apache2
一応、apache2.serviceの再起動
sudo systemctl restart apache2
ラズパイでは/var/www/html/index.htmlにデフォルトのページが保存されています。
apache2のデフォルトページとしてこれが表示されるはずなので確認します。ここで、ラズパイのローカルipを調べます。ifconfig有線ならeth0、無線ならwlan0のところにそれぞれinetとあるはずです。その横に割り当てられたipアドレスがあります。
192.168.0.70と確認したのでこれでラズパイにアクセスします。(ipアドレスは適宜読み変えてください)
同一ネットワーク内の別のマシン(スマホでもOK)のブラウザからアクセスしてみます。
httpプロトコルで192.168.0.70の80番ポートにアクセスという意味です。これは省略して192.168.0.70だけでも繋がります。
デフォルトページが出たら成功です。phpのインストール
php8.0がリリースされたのこれをインストールします。といっても単純にaptで取ってこれます。
sudo apt install phpさらに、CLIとcURLのモジュールも追加します。
sudo apt install php-cli php-curlphpのバージョン確認
php -v
/var/www/htmlにphpのテストファイルを作ります。cd /var/www/html
sudo nano test.php
CUIのエディタが開いたら
<?php phpinfo ();?>
と入力してCtr+Sで書き込み、Ctr+Xで閉じます。sudo cat test.php
test.phpの中身が書き込んだものだったらOKです。
ここでapache2の再起動します。sudo systemctl restart apache2
- 投稿日:2021-02-26T10:38:52+09:00
Laravelの学習を始めるにあたって
お疲れ様です。TaYです
PHPでのポートフォリオ制作・外部公開が終わり、これからの課題が見えてきました。
現時点での課題
- オブジェクト指向に基づいたコーディングができていない
- MVCモデルについての理解・経験がない
- フレームワークを触った経験がない
これらを解決するべくLaravelの学習を始ました。
使用する書籍はこちら
評価が高かったため、こちらを選びました。
すこし読んでみて、自分なりにLaravelについて分かったことを備忘録として残しておきます。
フレームワークとは
・機能提供だけでなく『仕組み』も提供する
(ライブラリは、あくまでも「機能提供」→どう使うかはプログラマ次第)
・プログラマは仕組みに従って、「呼び出されて動くプログラム」の部分を作成すれば良い
・セキュリティ、メンテナンス性、拡張性を兼ね備えてるLaravelの特徴
・MVCに準拠している
・堅牢なシステムであるSymfonyが土台
・Composerにより、プログラム管理が容易
・ORM(Object-Relational Mapping)によりデータベースをオブジェクトのように扱える
・Bladeテンプレートエンジンで複雑なデザインも簡潔に記述できる
・コードがわかりやすく、学習コストが低い
今回はここら辺で