今年度を振り返って… 紙屋06

お疲れ様です!
’23年度入社の紙屋です!

まだ寒い日も続きますね。
私は2月の一時期暖かくなった時から花粉症が出てきました…
今年の花粉症は目がとても痒いです……(泣)
薬の眠たさと闘いつつ、目の痒みとも闘いつつ、日々仕事に取り組んでいます!
早く気候も落ち着いてほしいです!

気づけばもう3月になりましたね。
先日の社内技術者定例会では新年度に向け、新入社員への対応の話も出ていました。
まだまだ新入社員でいたい気持ちもありますが、今年度を振り返って来年度に備えようと思います。


2023年4月は全くこの業界を知らないで入社しました。
入社当初は外部研修に参加させていただき、MySQL、PHP、Laravelを中心に学びました。プログラミングをやってみたい気持ちはありましたが、知れば知るほど難しく、私の固い頭では理解が追い付きませんでした。研修中は「なんで?」が多く、講師の先生へ質問を多く投げていました。今思えば、自分でも調べて質問すればよかったのですが、自分の癖もありよく調べもせずにすぐに人に聞いてしまっていました。嫌な顔をせずなんでも答えてくださった講師の先生にはとても感謝しています。

外部研修を終えて会社に戻ってからは、参考書で勉強し、課題に取り組みました。参考書はSQLドリル、PHP独習、LinuCを一通り勉強しました。研修でも触れたSQLやPHPは前向きに取り組めましたが、案件の前準備として勉強したLinuCはとても苦手意識が強かったです。ですが、案件に入った今ではよく見直してコマンドにはお世話になっています!

10月あたりからOJTでご指導いただきながら実際の案件に入りました。最初は資料の確認からでしたが、少しずつ実際のシステムの保守にも携わらさせていただきました。外部研修から社内での課題は会員登録システムを難易度をあげて取り組むものでしたが、実際の案件は扱うテーブル数もコードもとても多く、フレームワークも違って難易度がぐーんと上がりました。そこで一度「自分には無理かも…」と思ってしまい、苦手意識が生まれてしまいました。分からない点は質問すると答えてくださいますが、自分の聞きたいことがまとまらず、うまくニュアンスも伝えられず、モヤモヤすることも多かったです。

このままではいけないと、取り組む姿勢を見直しました。
それは、
① 質問する前には必ず調べ、自分の考えをしっかりと整理すること
② 活用できるメモをとること
③ アウトプットすること

です。

まずは質問する前には必ず調べ、自分の考えをしっかりと整理することですが、調べないと方向性の違う質問をしてしまったり、返答いただいてもその内容を理解できないことが多かったりしたからです。よくネット検索を活用しますが、調べたいことにたどり着けなかったり、とても時間がかかったりしてしまい、自分の考えを整理するまでに時間を要すので、これはまだまだ取り組みが必要です。

次に、しっかりとメモをすることです。教えていただく中で「前にも伝えたと思いますが」という言葉を耳にします。メモを取ることは新人にとっては当たり前ですが、メモしてもそれを活かせないのであればメモの意味がありません。私はメモを取るときは、必ず日付を書くこと、チケット番号など見出しや題名をつけること、メモの書く場所を注意する、内容によって社内業務なのか、案件のものか、期限付きのものなのかを意識して場所も分けるように書いています。todoリストのように□の枠を書いて目立つようにしたり、レビュー中(画面共有中)はコードの中にコメントとして入力し、指導者へもメモ内容が見えるように意識しています。電子媒体でメモを取りたいなとは思っていますが、まだまだアナログな私は紙媒体でのメモが主流です。技術面で新しいことを教えていただいた時には紙媒体でのメモは後で見返してもよく整理ができないので、教えていただいた後すぐに自分なりの手順書を作っていつでも見返すことができるようにしています。

あとは、アウトプットをすることです。このブログもそのひとつですが、小さな取り組みとしては、なるべく声に出すようにしています。1対1のLINE上のやりとりももちろんあるのですが、文章ではニュアンスも伝えにくく、文章ではうまく伝えられなかったが、通話でやり取りするとそこまで考えが乖離していなかったということが時々ありました。これはこれで文章力を鍛える必要がありますが…(汗)。また朝礼や終礼での報告時も集団の中であえて質問など声にだすことで、自分の考えを知ってもらえれば、その考えがどうなのかを確かめられたり、それを繰り返すことによって自信につながったりすると思っているからです。今はレビューいただいたときは必ず結果の要約や次回までにすべきことを自分の言葉で繰り返して指導者へ伝えるように努力しています。

他にも意識して取り組むべきことはあると思いますが、とりあえずはこれらを意識しています。まだまだ学習やプログラミングに触れる機会を増やす必要があると思っています。
来年度は実際にコードをかくことはもちろんですが、
① 基本情報技術者試験に挑戦!(ITパスポートは無事合格しました!)
② PHPカンファレンスなどの勉強会にも参加する!(2023年度のPHPカンファレンスは近所で開催されていたのに情報収集が足りずに開催直後に気づきました…)
③ 通勤中の時間を使って、ポットキャストで初心者向けのプログラミング番組を聞く!(現在継続チャレンジ中で習慣化へ!)
と思っています!

このブログも使ってこれからの成長した姿もお伝えできればと思います!
今年度の残りも、来年度からもまだ頑張りますので、応援、ご指導よろしくお願いいたします!
では!!

SQLの不思議… 紙屋05

’23年度入社の紙屋です!
2024年もよろしくお願いいたします。

新年一発目の投稿です。
無事に新年を迎えることができました!
昨年は少し実際の案件にも携わらせていただきました。少しずつできることも増えてきたことはうれしいです!
2024年もできることを着実に増やしながら成長したいと思います!

今回はその案件の中であるデータの差分の調査を行っているときに不思議に思ったことを検証してみようと思います。
それはSQLである一定の期間のデータを抽出しようとしたときに、何気なく使っていたある演算子で躓きました。最初は気づかなかったのですが、調査結果のデータ数がおかしいことの指摘もあり気づきました。
それは『BETWEEN』の使い方です!

—————————————-
式 BETWEEN 値1 AND 値2
—————————————-
BETWEEN演算子では、値が「値1以上かつ値2以下」の場合に真になる

と参考書ではあります。
私は1か月分のデータを抽出したかったので、

というSQL文を作成し抽出しました。
特に疑問に思うこともなく作業を続け、他で分からないところがあったので、質問したときに、指導者とのSQL文の違いに気づきました。

「ん?演算子ちがうけど、まぁいっか、同じことだし…」
「でも、結果も違うんだよなぁ…、どうしてだろう?」
と思ったことで調べるとどうやらデータ型がdatetime型であることも関係しているらしいということが分かりました。
そこでダミーデータを作って検証してみることにしました。

今回、ダミーデータはLaravelのマイグレーションとシーダーを利用して’2023/11/01 00:00:00’から’2023/12/31 23:59:59’までのデータを100件作成しました。
そして、同じ条件式で行数をカウントしました。

この条件式の結果は、条件式1は50件、条件式2は56件と件数の差が出ました。
ちなみに、抽出条件の範囲を変えると、条件式3は53件、条件式4は3件でした。
抽出する条件のデータ型がdatetime型だったので、範囲指定には注意が必要そうです。

ちなみにdate型でもデータ数のカウントを行いましたが、時間が無い分、選ぶ演算子での差はみられませんでした。
今回の始まりは演算子の疑問で始まりました。
BETWEENを使う際は抽出される範囲とデータ型を十分に理解したうえで使う必要があります。
私みたいな初学者や不慣れな方は、データの範囲を指定して抽出する場合はまず比較演算子を利用する方が良いということを覚えておきましょう!

今回は文献を調べるだけでなく、自分でも実際のデータを使って結果の違いを理解できたので、引き続き今回のように検証しながら自分の理解を深めたいと思います。

では、また次回!!

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していきたいと思います!
今までも転職して新しい業種にチャレンジして何とか失敗せずやれてきたので、今回もコツコツ地道に経験を積んでまいりたいと思います!
それでは次回のアップまで!!