ITパスポートの試験を受けました!紙屋04

お疲れ様です!
’23年度入社の紙屋です!
12月に入り本当に寒くなってきました。
こんな季節は温泉にゆっくりつかって、コタツで丸くなりたいですね!

さて、この業種について9か月が経とうとしています。
未経験で入社し、外部研修や日々の学習や課題をこなしてきました。今もOJTとして少しずつ実際の案件に携わらせてもらっています。
分からないことの方が多く、教えていただいてもなかなか理解ができないことの方が多い毎日です。
なので、基礎知識の学習という意味でもITパスポート試験を受けることにしました。

ITパスポート試験とは何か?

ITを利活用するすべての社会人・これから社会人となる学生が備えておくべき、ITに関する基礎的な知識が証明できる国家試験

https://www3.jitec.ipa.go.jp/JitesCbt/html/about/about.html

とのことです。
確かに、前職は全く違う分野でしたが、ITなくして業務は成り立ちませんでした。
基礎的知識を学ぶためにもちょうどよい機会かなと思い、チャレンジしました!

内容は、新しい技術(AI、IoT など)や手法に関する知識、経営全般の知識、IT(セキュリティ、ネットワークなど)の知識、プロジェクトマネジメントの知識など幅広い分野にわたります。

実際の試験は100問(/120分間)あり、ストラテジ系、マネジメント系、テクノロジ系と3分野に分かれ、合格基準点は3分野それぞれ300/1000点以上正答し、合計で600/1000点以上あれば良いとのこと。

勉強期間は約2か月間。
最初はテキストの内容をまとめ、各章末問題を解き、試験前は過去問をひたすら解きました。
広く知識を求められ、テキストを通るだけでもかなりのボリュームがありました。
適宜まとめた内容を上長へレビューいただきましたが、広い分野に対しても必ずコメントをいただき、アドバイスもいただいて、その知識量に逆に怖くなりました(笑)

どれも知らない知識ばかりで、特にストラテジ系とテクノロジ系が難しかったです。
3,4文字のアルファベットの略語は暗号にしか思えず、関数の条件式を問うような問題ではまず問題文の理解に苦しみました…
過去問で類似問題を数回解くことでなんとか少しずつ覚えていきました。

過去問を解き始めたころは5,6割の正答率でした。過去問を数回解くことで正答率は7,8割まで安定してきたので、「よし!いける!」と自信満々で試験を受けに行きました。
今までも国家試験を受けてきたので特に緊張はしませんでした。
受験者の中には管理職ぐらいの年代の方から小学生までいて驚きました!

試験の方は、苦手分野のストラテジ系でさらに新しい単語が出題され、とても焦りました…(汗)
利益やコストの計算や関数の条件式を問う問題など、計算問題が過去問より多く、それでも焦りました…(汗)
残り時間20分ぐらいでやっと一通り解答できましたが、見直ししたい問題が多すぎて「詰んだー」と焦りました…(汗)

試験後はすぐに解答され、ギリギリ基準点は満たすことができて一安心。
覚えも悪くなってきているなと痛感した1日でした。
今回の勉強の熱が冷めないうちに、勉強を続けてさらなる挑戦に挑みたいと思います。
また何か動きがあれば決意表明をしたいと思います!
では、また次回!!

ヘルパー関数のあれこれ!紙屋03

おつかれさまです!
‘23年度入社の紙屋です!
9月に入って朝晩の暑さがすこーーしずつ和らいでいたような気がしますね。早く日中の暑さも和らいでいくといいですね。

8月で課題の会員登録のアプリケーションを作り終えました。
外部研修でもLaravelでwebアプリケーションをつくりましたが、そのときはとりあえずの実装を優先して、「この関数がどんな仕事をしているのか、どんな機能があるのか」ということを考えていませんでした。
そこで、今回はLaravelにおけるヘルパ関数に焦点をあてて振り返ろうと思います!

ヘルパ関数とは?
Laravelに搭載されている独自の関数のことで、いろいろなところで呼び出せる便利な関数です。

Laravelの公式ドキュメントをみえると数えただけで213個ありました(今回Laravel ver9で実装)。
まだまだ分からないことが多いので、今回は使ったものに触れながら振り返ります!
今回の会員登録フォームで使用したヘルパ関数は、
・view ・redirect ・route ・request ・session
・old ・dd ・dump ・config
でした。
Contollerや入力フォーム、処理の確認で使うものが多く、外部研修でも使っていたので、コードレビューいただく前から使っていました。しかし、config関数は教えていただいてからの導入でした。

よくアドバイスいただく内容として、同じコードで内容量が多く、その処理を複数個所で使用する場合は、可読性や再利用性を考えてコーディングした方が良いと教えていただきます。
今回config関数をどこに用いたかというと、formタグで会員情報の登録や編集を行う箇所でバリデーションを実装するときに、バリデーションの中身は同じものなので、バリデーション時にコードが冗長にならないように利用しました。

まずは、config関数の公式ドキュメントを確認します。
config関数は設定変数の値を取得します。設定値はファイル名とアクセスしたいオプションを「ドット」記法で指定します。
とあります。

となっており、「/config/(.phpファイル)」内に記述されている配列を呼び出します。
では、私はどのように実装したかというと、
Controller内には以下のように記述し、

「/config/mySetting.php」ファイル内に

と記述しました(教えてもらいながらですが…)。

これでバリデーションチェック時の項目をController内に何度も記述する必要が無く、バリデーション内容の変更・修正時も配列の中身を記述することでスッキリします。

ちなみに、ヘルパ関数がどんな処理をしているのかは、「/vender/laravel/framwork/src/illuminate/Foudation/helpers.php」ファイル内に記述してありました。

確かに配列があればキーを返してくれているみたいです。

ちなみに、今回使用した「ドット記法」についてちょっと触れると、配列からの値の取得時にキーを「.」でつなげることで、多次元配列の場合、より深い階層へネストし値を取得してくれます。
例えば、Arr:get()関数の公式ドキュメントを参照すると、

となっています。$arrayのような多次元配列から値を取得したい場合は、第2引数のキーの部分をドット記法で、欲しい値までネストしていきます。
ちなみにArr::get()関数に第3引数をセットすると、第2引数に指定したキーが存在しない場合の値を返してくれます。

改めて振り返ってみると、「なるほど!」と思いました!
今後も、いろいろと忘れないようにまとめていきたいと思います。
では、また次回!!


パスワードはハッシュ化する!!紙屋02

こんにちは!
’23年度入社の紙屋です!
日に日に暑さが増すなか、台風もやってきて大変ですね。
私は出身が鹿児島県なので台風には慣れっこです。
学生のうちは台風が来ると「学校が休みになるんじゃないか」とそわそわしていましたが、社会人になると「台風きたら出勤どうしよう…」と不安でそわそわしてしまいます(笑)

現在は、課題として会員登録フォームをPHPでの実装、その後フレームワークを使った実装がひと段落終えたところです。調べながら、分からないところが教えていただきながらの実装だったので、ちょっとずつまとめをしていこうと思います。

まずはとりあえず機能の実装を!と考え、新規登録フォーム、検索機能、編集・削除機能を実装しました。その中でセキュリティ対策への考えはまだまだ足りず、データベースへ登録する際に、エスケープ処理を行わなければならないことは覚えていましたが、パスワードに対しては何も処理をしていませんでした。
レビューいただいた際に、「え・・ハッシュ化って?」「まだ処理がいるの?」と混乱しました…。なので、今回はハッシュ化について調べてみました。

今回、PHPプログラミングで実装した内容は、

です。
最初は直観的に

をそのままDBに登録していました。

レビューいただいた際に、このままでは、DBを攻撃された場合、個人情報が盗まれてしまう危険性があると教えていただきました。

確かに!ログイン情報を盗まれてしまったらなりすましなんて簡単にできますね。

password_hash関数をマニュアルで調べてみると、


◦$passwordには登録するパスワードの値が入って、
◦$algoにはハッシュ化に使用するパスワードアルゴリズム定数が入って、
◦$optionsには各アルゴリズムがサポートするオプションが入る
とのこと!

アルゴリズム定数のPASSWORD_BCRYPTを使うと
◦”$2y$” crypt フォーマットを使ったハッシュになる
◦長さは常に 60 文字
◦オプションのcostは省略時はデフォルトの10が入り、ハードウェアの性能が許容できるなら高くも設定可

とのことでした。
上記のpassword_hash()関数で登録しなおすことで、

ちゃんとハッシュ化されていました。
これで一安心です!

知らないことが多くて調べて、コーディングして、エラーと闘う日々です。
今後も、いろいろと忘れないようにまとめていきたいと思います。
では、また次回!!

新入社員ブログスタート!! 紙屋01

自己紹介とSQLで詰まったこと

はじめまして!
2023年度入社の紙屋です!
これから時々ブログをアップさせていただきますm(_ _)m
よろしくお願いします!

今回は初投稿ということで、まずは自己紹介から!
名前は紙屋朋幸といいます!
以前は他業種で働いており、プログラミングに関しては超初心者です!
PHPの外部研修を経て目下勉強中です!!
趣味はグルメ巡りで、主にハンバーガー、ラーメン、甘いものなどなど…
「おいしそう!」と思ったものにはなんでも食いつくミーハー気質です(笑)
先日も世界最大のフードスポーツイベントのハンバーガー部門の公式日本予選大会である「JAPAN BURGER CHAMPIONSHIP」に行ってきました!!
また7月から六本木でバーガーイベントがあるので行ってきます!!

プログラミングの話に戻ります。
入社してから3か月が経ちました。
現在はSQLドリルを勉強して、PHPプログラミングを勉強しつつ、登録フォーム課題に取り組んでいます。
プログラミング初心者の私にとって日々「なんだこれ?」「ん?」と思う壁にあたります。そういった疑問について振り返りたいと思います。

SQLドリルを取り組むにあたって、まず「NULL」の扱いについて詰まりました。
プログラミングを経験されている方には基本の「キ」レベルだと思います。
SQLの学習をしたときに簡単なSELECT文の話から始まり、次に算術演算子など、演算子の話があり、私はプログラミングって数学的な感じなんだと思い込んでしまいました。
例えば、SELECT文で選択するカラムに『カラム名 * 100』と条件を付けて値を取得しようとしたり、WHERE句で『カラム名 = NULL』で検索をかけようとしたりすると、エラーが返されます。
「あれ、おかしいな?NULLってゼロってことじゃなかったっけ?」…
そんなことをよくことを考えながらとりあえず自分で考えたコードで実行し、トライ&エラーで試しながらSQL文を考えていました。

NULLについて振り返りたいと思います。

NULLとは?
・そのカラムの値に何も格納されていない、未定義であることを示す。
・数字のゼロや空白文字とも異なる。

NULLは=で判定できない!
・NULLは「=」や「<>」で判定ができない。
・必ずIS NULLやIS NOT NULLを使って条件式をつくること。

「NULL ≠0」とここに書いてありました。めちゃめちゃ見逃していました…(笑)
「値が入っていないなら空白のままでいいじゃん」とも考えましたが、ドリルを進めるうちにNULLにあたる部分を対象に指定したい場合もあるから空白のままでは都合が悪いのですね。
また、NULLは値が入っていないことを表すから空白とまた別物なんですね。ややこしいですが、NULLと空白とを検索かけたいときは

と検索をかけなければいけないのですね。やっかいです…笑…

あとはNULLを含むレコードの集計のときにも「あれ?どっちを使うんだっけ?」と毎度見直しました。それはCOUNT関数です。
他の集計関数は集計時のNULLの扱いは結果に影響を与えませんが、COUNTだけ引数にカラム名を指定するとNULLを無視しますが、全レコードを表す「*」を指定するとNULLも含めて集計します。
ドリルの中にはNULLも0とカウントして集計させる問題もありました。この問題も何度も引っ掛かりました。

SELECT AVG( {カラム名} ) FROM tables;

SELECT AVG( COALESCE( {カラム名} , 0 ) ) FROM tables;

最初はこの2つのコードの違いがよくわかりませんでした。「NULLってゼロじゃなかったっけ?」「このCOALESCEって何?」ということが頭をグルグル…、理解が追い付かず類似問題を解いても引っ掛かり…、プログラミングって難しい…と早くもあきらめモードでした(笑)
ですが、ドリルの巻末問題あたりでやっとCOALESCE関数の働きが分かってきて、平均値は数値の合計をその数値の数で割るという簡単なことも忘れていたことに気づき理解ができました。
気づいた時には「めっちゃ便利じゃん」とあきらめモードからも復帰できました!

プログラミングって難しいですね…。
まとめとうよりはプログラミングを体験した感想となりましたが、指導いただける先輩方は丁寧に教えてくださるのでとてもありがたいです。プログラミングを学んでブログも通じて少しずつoutputしていきたいと思います!
今までも転職して新しい業種にチャレンジして何とか失敗せずやれてきたので、今回もコツコツ地道に経験を積んでまいりたいと思います!
それでは次回のアップまで!!