プログラミングは面白い

プログラミングの事を中心に色々書いていきます

MDB2のお勉強

今どきMDB2なんか使われてないと思うのですが、問題として出てくるので覚えなくてはなりません。
PHPの歴史を勉強していると思って頑張ります。

6-3 SQL文の実行に関する問題
INSERT文、UPDATE文、DELETE文を実行した場合は結果セットは生成されない。「作用した行数」は得られる。

6-8 MDB2におけるSELECT文の結果取得方法に関する問題
MDB2クラスのqueryOne()メソッドはSELECT文を実行し、結果の1行目、1列目の値を取り出す。
MDB2クラスのqueryRow()メソッドはSELECT文を実行し、結果の最初の行を取り出し返す。
MDB2クラスのqueryCol()メソッドはSELECT文を実行し、結果の列の値を配列にして返す。
MDB2クラスのqueryAll()メソッドはSELECT文を実行し、結果を2次元配列で返す。

queryRow、queryAllにはフェッチモードを渡せる。
フェッチモードが何のかよくわかっていない。
MDB2_FETCHMODE_ORDERED → 結果セットの列と同じ並び順のインデックス配列
MDB2_FETCHMODE_ACCOC → 結果セットの列名をキーとする連想配列
MDB2_FETCHMODE_OBJECT → 結果セットの列名をフィールドとするstdClassのインスタンス

queryOne、queryRow、queryCol、queryAllの使用例

<?php
require_once('MDB2.php');

$db = MDB2::connect('mysql://localhost/test') //testDBなのでID、PASS省略  
$db->exec('DROP TABLE IF EXISTS t');
$db->exec('CREATE TABLE t (a INT b INT)');
$db->exec('INSERT INTO t VALUE (1, 10), (2, 20)');

echo "queryOne()";
echo $db->queryOne('SELECT b FROM t WHERE a = 1');

echo "\nqueryRow()";
print_r($db->queryRow('SELECT * FROM t WHERE a =1'));

echo "\nqueryCol()";
print_r($db->queryCol('SELECT a FROM t'));

echo "\nqueryAll()";
print_r ($db->queryAll('SELECT * FROM t'));
出力結果

queryOne():
10

queryRow():
Array
(
  [0] => 1
  [1] => 10
)

queryCol():
Array
(
  [0] => 1
  [1] => 2
)

queryAll():
Array
(
  [0] => Array
    (
       [0] => 1
       [1] => 10
    )
  [1] => Array
    (
       [0] => 2
       [1] => 20
    )
)

PHP上級資格を取るべく勉強中

えー、年の瀬ですが私は試験勉強の為に机に向かって唸っています。
PHPの上級資格を取得するために今更ながらPHP5の勉強をしなくてはならないという…
どうせ勉強するならPHP7がいいのですが、まぁPHP7でも使える技術は沢山あるので無駄ではないでしょう。
まずは準上級を狙っています。ちなみに初級試験は2週間くらい勉強したらサクっと取れました。
上級試験はあまりにも難しすぎて合格者が少ないために、いつからか正答率50%以上~70%未満には準上級資格が得られるようになったそうです。
たぶん、今の勉強時間だと上級を受かるのは難しそうです。てか、未経験で上級受かるのはかなりキツイらしいです。
てことで、せっかくブログもやってますし、今後、おもむろにアウトプットをしていこうと思います。
教材は黒本と呼ばれてる問題集を中心に勉強しています。
ちょっと中途半端ですが、5章の問題から気になる部分をアウトプット。

5-2 $_SERVERに関する問題
$_SERVER["REQUEST_METHOD"]にはGET、POST等が設定される。
$_SERVER["PATH_INFO"]にはパス情報が設定される。
$_SERVER["REQUEST_URI"]にはホスト名(ドメイン)以降が設定される。クエリ文字も含まれる。
$_SERVER["SCRIPT_NAME"]にはパス名とファイル名が設定される。
$_SERVER["REMOTE_HOST"]には現在のページにアクセスしているホストIP(IPアドレスを逆引きしたもの)が設定されるが、サーバーの設定や逆引きしていないIPの場合は取得出来ない。
$_SERVER["HTTP_USER_AGENT"]にはブラウザ情報が設定される。User_Agentヘッダがあれば設定される。
例)
http://example.test/php/foo.php/bar?a=b

$_SERVER["PATH_INFO"]/bar
$_SERVER["REQUEST_URI"]/php/foo.php/bar?a=b
$_SERVER["SCRIPT_NAME"]/php/foo.php
$_SERVER["PHP_SELF"]/php/foo.php/bar
$_SERVER["QUERY_STRING"]a=b

5-5 magic_quotes_gcpに関する問題
addslashes()エスケープしたものを元に戻すにはstripslashes()で処理する。

5-6 フォームパラメータに関する問題
GETリクエストの場合、パラメータはクエリ文字で送信され、$_GET配列に設定される。パラメータ名がキーになる。
HTMLのパラメータ名にピリオドやスペースがあるとアンダースコアに変換される。
<input name="a.b" value="1" type="text"> → キーはa_bに変換される

<input name="a_b" value="1" type="text">
<input name="a.b" value="2" type="text">
上記の場合、パラメータの値は2になる。
最初にキーa_bに値1がセットされるが、a.bがa_bに変換されるため、最初の値1のa_bが上書きされて2になる。

5-8 フォームでの複数選択の処理に関する基本的な問題
複数の項目を選択出来るフォームではHTMLフォームのパラメータ名の最後に[]をつける必要がある。

5-11 入力チェックに関する問題
strspn()は第一引数に渡した文字列の中の先頭から何文字目までが第二引数で指定した文字かが分かる。
strspn("38", "1234567890")の場合は2が返ってくる。
ctype_digit関数は与えられた文字列の全てが半角数字か判定する。ただし、""で囲った文字列でないとfalseが返ってくる。

とまぁ、こんな感じでアウトプットしていく。
しかし未経験者には難しい問題ばかり。

タイトル変えました

久しぶりのブログ。
さて、私は転職をし、Javaを頑張るんだーと思っていたのですが、PHPも新たに選択出来るようになったので私はPHPを選びました。
もう全然Pythonやってないけど、プログラミングの入りがPythonだったのでその冠は残しておきます。

いまはPHPの資格取得をするために日々勉強中です。
全然実践的じゃないけど学べる事は多いです。

何事も一歩一歩確実に前に進まなくては。
てことで、ブログ名変わったよってだけの記事ですたー。

最近はJava

内定を頂きまして、10月初旬を目安に就業予定の私ですが、Javaのお勉強をしています。
お世話になる会社では研修でJavaの勉強をするそうなので予習です。

実は私は結構前から喉に違和感があり、何か飲み込むと痛みを感じていました。
食べ物を飲み込むときは多少なのですが、飲み物の時はそこそこ痛いです。

結構前に一度病院で診てもらった時は、鼻からカメラを突っ込まれ喉に腫瘍があるか調べてもらったのですが、特に何も見つかりませんでした。
何もなければないで心配だったのですが、今回転職が決まった事もあり、再度病院に行って検査をしました。
最初は同じように鼻からカメラを突っ込まれて喉を診てもらったのですが、やはり何もなし。
心配だったのでCTもお願いをして撮ったのですが、やはり腫瘍は見つからず。
どうやらこのような症状を咽喉頭異常感症、別名ヒステリー球と言う病状に分類されるようです。
原因は自律神経の乱れだったり、心因的な問題だったり、要するに原因不明らしいです。
ちなみに、私は小学生の頃から自律神経失調症って言われた事ありますので関係あるかもしれないですね。慢性的な不眠症ですし、割と生きづらい性格です。
この不眠をマジでどうにかしたい...

とりあえずは安心したのですが、怖いのでさらに人生初の人間ドッグを受けに行く予定です。
病院大嫌いなので本当に憂鬱ですが、年齢も年齢だし避けて通れない道ですね...
胃カメラと採血まじ怖い。

とまぁ、そんなこんなでJavaをやっていますが、Laravelやりたくて仕方ない。
デプロイも結局やってないし、まだまだカスタマイズして行きたい。
でも複数言語を同時に勉強すると混乱するから勉強は1個に絞ると決めています。
前にswiftとRubyだったかな?PHPだったかな?を同時進行してたら訳分からなくなった記憶があります。

とりあえずJavaの基礎的な部分は終わったのでtodoアプリでも作ってみようかな。

てことで、転職します

えー私、18年ほどやっていた業種ともおさらばし、新たな業界に飛び込む事を決意しました。
正直、給料死ぬほど安くなったけど楽しみで仕方ない。
嫁とも話をして、理解をしてくれた。
今のまま同じ仕事をしていたら多分困ることはないと思うけど、面白くない。
私のわがままを理解してくれた嫁には本当に感謝しかない。
でもしっかりSweet10Diamondはせがまれたので買ってあげられるように精進しないと。

さて、私の飛び込む業界は悪名高きSES業界です。
しかし、社風が面白そうだったし、何よりこんなおっさんを快く受け入れて頂けたのは感謝です。
とにかく私は現場での経験を積みたい。そうすれば今後も何かと楽になっていくはずです。
ここを足掛かりに頑張ります。あ、踏み台にするつもりはないんですけどね。
SESで疲弊して別業界に転職した人のブログとかめっちゃ読み漁ったので、少し怖い部分もあります。
ちゃんとやりたい現場にアサインされなかったら地獄だなと。

どうなるかは分からないけどただ頑張るだけですね。
10月から開始予定で、4ヶ月間は研修だそうです。
Javaを勉強するそうなので、早速Javaの予習をProgateで開始しています。
Laravelも頑張りたいけど、しばらく厳しいかな?
てか、Javaって記述の仕方が若干PHPに似てる気がする。
PHPやっておいて良かったなと。やっぱり無駄なことなんて何一つないんだなと。

でもメソッドの戻り値のデータ型をいちいち指定しないといけないのはダルい。
変数にもデータ型を指定するのもまだ慣れない。
なんでJavaが大規模開発に向いているのか謎だらけどだけど、頑張ろう。

いやほんとブログのタイトル変えようかな...
全くpython要素がない。

着々とデプロイは進んでいるが、やはり地獄

デプロイというより、環境構築でめっちゃ躓いた。
Linuxはコマンドとかそうゆうのは大分理解したんだけど、いまいちリポジトリの概念が理解出来ていない事が判明。
PHPをインストールするのにRemiというリポジトリからインストールを行ったんだけど、php-mbstringというのがインストール出来ていなかったようでこいつのせいで地獄みた。

単純にyum -y install php-mbstringみたいにするとphp-commonと干渉してるエラーを吐く。
でもphp-commonはちゃんとインストール済み。
何でだよ!とイライラすること1時間。
ドンピシャなページを発見。

teratail.com

これ通りやったら無事にphp-mbstringをインストール出来た。
このリポジトリの概念がいまいちよくわからん...
こうゆうのをもっとちゃんと理解出来れば余計な所で躓かないんだけどなー。
やっぱりDockerが良いのかなー。

とりあえず後はrootフォルダに乗っければ公開出来るっぽい。
その前にちょこちょこ設定する必要はありそうだけど。

httpsにもしたいけど、すぐには難しそう。
覚える事が尽きない。

【PHP】array_count_values関数

月別アーカイブを作ってる時にこの関数めっちゃ便利だったのでご紹介。

配列の値をキーとして、値の個数をカウントして連想配列にしてくれる関数です。
PHP: array_count_values - Manual

月別アーカイブを作成時、一度すべての記事作成日時をcreated_atカラムから取り出し配列に入れたのですが、ここから重複を省いてカウントする方法ないかなーと探していたらドンピシャこの関数がありました。

    private function archive() {
        // 月別アーカイブ処理
        $posts = Post::all(); // DBから全ファイル取得

        $monthList = []; // 空リスト作成
        // ループで空リストに追加
        foreach($posts as $post) { 
            $monthList[] = $post->created_at->format("Y-m");
        }
        // array_count_valuesを使って連想配列化
        $countArray = array_count_values($monthList);

        return $countArray;
    }

あとはビュー側で中身を取り出して表示さればOKですね。
てかこれ書いてて思ったのですが、ループさせなくてもモデルの操作で日付のデータを配列で取得出来たような…
ちょっと後でやってみようかな。

array_count_valuesはいろんな場面で使えそうなので覚えておいて損はなさそうです。