新入社員活動記録Part.4(山本)

こんにちは。21年度入社の山本です。
今回は、前回に続いて「はじめてのWordPressの更新」について書いていきます。

WordPressを更新したい

前回も書いた通りWordPressの更新を担当することになったのですが、立ち上げたわけでもない、使ったこともないものをいきなり触るのはなかなか躊躇してしまいます。そこで今回は、はじめの部分から先輩に見てもらいつつ慎重に作業を進めました。

簡単な作業ではない…はず…?

作業を始める前のイメージでは、「ブログのデータを退避して、コマンドを打ち込んで~…」といった工程を想像していたのですが、やってみると…

ありますね。更新ボタンが。
「なんだ簡単じゃないか」と思いきや、よく見ると上のほうに「PHPの更新が必要です」の文字が。というわけで急遽PHPの更新も行うことに。

PHPも更新する

PHPの更新はボタンを押すだけというわけにはいかないようです。真っ黒な画面でコマンドをポチポチと入れていきます。例えば、

rpm -qa | grep php

見た目では何を意味しているか分かりにくいと思いますが、インストールされているPHPのバージョンを確認する際に使うコマンドです。とりあえずバージョンを確認して、

yum erase php-json-7.・・・(長いので割愛)

古いのを消して、

yum search php74 | grep -E ‘php74-・・・(長いので割愛)

新しいバージョンを検索して、

yum install php74-php・・・(長いので割愛)

新しいバージョンをインストールして、完成です!
ここは失敗すると復旧が大変なのでゆっくりやりました(画像撮り忘れました。スミマセン)。

気を取り直してボタンを

さっきの画面に戻ると、

「PHPの更新が必要です」の表示が消えていますね!
では、今度こそ更新ボタンを…

来ました!WordPressも更新完了です!

作業時間は1時間弱程度でしょうか。何もわからないところから無事更新作業を終えることができました。
弊社での業務もこのようなことをしています(私はまだこういった根幹の作業はやっていませんが)。もちろん先輩方からしっかりサポートしていただけるので、怖がらずにIT業界にチャレンジしていただきたいです!

最後までご覧いただきありがとうございました!

新入社員活動記録Part.3(山本)

こんにちは。21年度入社の山本です。
今回からは、外部研修から戻って社内での業務について書いていきたいと思います。

はじめての業務

2ヶ月の外部研修を終えて久々の出勤です。いなかった間に模様替えが行われて社内は以前とは違った雰囲気に。
この日からOJTの形式で実際の案件に携わりながら業務の勉強をしていきます。
同期はどうやら、引き続きSQLやPHPの基礎的な勉強をする様子。いきなり同期と別のことをやるということに不安になりますが、先輩方が丁寧に教えてくださるので不安はすぐになくなりました。コロナ禍ということもあり、弊社は完全テレワークです。業務に必要な情報やツールの導入を行い、翌日からは自宅で業務を行います。テレワークだとわからないことや困ったことがあったらといったところが不安になりますが、通話や画面共有を駆使して相談し解決します。便利な時代ですね!

いろんな知識を蓄えたい

弊社では週に一度、業務中に起こった問題やITニュース、社内連絡について共有する場が設けられています。ITの業界では日々新しい技術や試みが行われています。そういったことを教えてもらうことで知識が身につき、また自分でも知れるようにアンテナを張るという意識が芽生えてきます。
中には、こういったことも…
「WordPressのバージョンが古いから更新しないといけないです。」
WordPressはサイトやブログの作成ができるコンテンツ管理システムです。このブログを作っているのがまさにWordPress。こちらのバージョンアップをやらないといけないということですね。
これは大チャンス!WordPressは個人で扱うには少々ハードルが高い…。是非やりたい!ということで無事更新担当の座をゲットしました!(といっても今回限りですが…)
更新担当とは言っても自分だけでやるわけではありません。誤って今までのブログデータ削除なんて起こってしまったら目も当てられないです。先輩にみてもらいつつ作業を行います。

というわけで、次回はWordPressの更新について書いていきたいと思います!
最後までご覧いただきありがとうございました!

新入社員活動記録Part.2(山本)

こんにちは。21年度入社の山本です。
前回に引き続き、外部研修での内容をご紹介します。

残る項目はこちら

  • MySQL
  • PHP入門
  • Laravel
  • Git入門

-MySQL-

これまでの研修はあくまでもPCの基礎的なところといった感じでしたが、ここからはいよいよ実務的な研修です!
SQLは、データベース(以下DB)を制御するための言語で、MySQLはDB管理システムです。
リンゴ:100円、ミカン:50円
みたいなことを登録・管理するシステムということですね!

DBで管理するのは商品の情報に限りません。ユーザーのIDやパスワードなどの個人情報も管理します。
データが吹き飛んだら一大事。そんなことが起こらないような操作方法や、万が一が起きた場合の復旧方法など、大切なことを学ばせていただきました!

研修とはいえ、データは自分で入力したもの。吹き飛んだらショックです。慎重に作業します。

-PHP入門-

DBの操作方法がわかったら、今度はDBとwebページの連携です。PHPという言語の勉強をします。
PHPとは端的に言ってしまえばwebページを作るための言語です。「HTMLは?」となるかもしれませんね。webページはHTMLで書かれていますが、1ページ、1ページ書いていては大変ですよね。PHPでは多言語との連携などHTMLでは難しいことを簡単に行うことができ、完成品はHTMLで表示される(これが大事)という特徴があります。

やってみるとHTML記述が使えるので意外と使いやすい印象です。PHP独自の書き方をするところは、記述方法がはっきりと分かれているので調べるのも簡単です。
ただしDBとの連携はとても難しい!これを覚えるのには苦労しそうです。

-Laravel-

PHPのDBとの連携は難しすぎて匙を投げかけたところに、Laravelが登場です。LaravelはPHPでの開発にあたって煩わしいところを事前に用意しておいてくれているとてもやさしいシステムです。Laravelのようなものはいくつかあり、これらをフレームワークと呼ぶそうです。HTMLの汎用性を高くしたPHPを使いやすくしたLaravel。優しい世界です。
実際のお仕事でもフレームワークを利用しています。それくらい助かっているということが伝わるかと思います!

使用感は・・・革命的ですね!煩わしいところがすべてなくなって非常に使いやすい!なくなってしまったら路頭に迷います。
あえて難しいところを挙げるとするなら、「型にはまらないことをしようとすると大変な作業になる」といったところですかね。可能な限りは用意されている範囲で終えたいものです。

-Git入門-

最後に教えていただいたのはGitです。これは作り方や操作方法というよりは、開発の仕方に近いイメージでしょうか。
お仕事では大抵、複数人で開発を行いますが、みんなで1つのPCをというわけにはいきません。そこでデータを共有して作業を分担するわけですが、手違いで「開発データが壊れた!」とか「〇〇さんのやつ消しちゃった!」など事故が起こらないようにするために、「Gitで開発環境を整えましょうね。」といった内容です。

試してみると、とても簡単でとても便利です。ただし、不思議に思えるところがいくつか出てきます。調べると小難しいことがたくさん出てくるので「便利なツールだなぁ」程度にとどめておきました(笑)。

-最終課題-

研修の集大成として、最後の2週間は1からwebサイトの構築を行いました。実際の現場を意識したグループでの活動。これまで学んだ知識を活かし、みんなで完成を目指します。

僕のグループでは、「旅館・ホテルの予約システム」を作ることにしました。
ありがたいことにリーダーに推薦していただいたので、僕が打ち出したグループ目標は「ほかのグループより多めに休憩を取ろう」です(笑)。休みたいというのももちろんですが、グループでの開発にはコミュニケーションが一番大事!作業じゃないところで打ち解ければ作業の相談も気軽にできます(建前じゃないですよ(笑))。
1から作るので、サイトの構造やDBに入力する情報、もちろんサイトのデザインも必要になってきます。プログラミング作業に入る前の構想だけで10時間ほどかかりました。後々手直しする分も含めればもっと時間がかかっています。プログラミングじゃない作業も大変なんですね。
プログラミングが始まるとわからないことだらけ・・・。けれど期間は決まっている・・・。メンバー内で何度も相談会が行われます。どうしてもわからなければ最終手段、講師の先生に頼ります。何をしたいのか伝えるのも難しい状況で、しっかり意図をくみ取って説明していただけました。

苦労に苦労を重ねて2週間、何もないところから「旅館・ホテルの予約システム」完成です!名前も付けました「やどかり」です!4月の自分からは想像ができない完成度です!着実に実力がついていることを実感します!
最終日は発表会。ほかのグループの作品からも学ぶことはたくさんあります。「このデザインいいなぁ」とか「そうすればスムーズに作業できたのか」とかとか・・・。

-外部研修を終えて-

2ヶ月に及ぶ外部研修もあっという間でした。たった2回の記事では書ききれないことばかりで、ほとんどが感想ばかりになってしまいました(汗)。
確かに言えることは、知らないことを学べて楽しい2ヶ月だったこと、お仕事に活かせる情報や技術がしっかり身についたことです!
来年度入社の後輩たちにも行ってもらいたいなと思える研修でした!

さて、外部研修での出来事は今回でおしまいです。次回Part.3からは会社での出来事・学んだことをお伝えしたいと思います!図や画像もふんだんに使った読み応えのある記事を目指します!ご期待ください!

最後までご覧いただきありがとうございました!

鹿倉の新入社員活動記録・第1回

■読者の皆様へ

初めまして!!  システム開発研究室の鹿倉 圭斗と申します。タイトルから、お察しの通りの社会人、ピカピカ1年目の見習いプログラマーです。この活動記録は、ITに興味がある学生に向けに投稿していきます。

さて、皆様はこんな疑問をもっているでしょうか?

  • ITに興味があるけど、実際に入社後、どの様に働いているのか。
  • PG(プログラマー)の研修内容はキツイのか。
  • 研修後、どの様な動きをしているのか。
  • 研修の雰囲気はどのような様子なのか。

疑問に思っている方は多いと考えています。去年、就職活動していた私も、入社後の働くイメージがありませんでした。そこで、活動記録を定期的に更新する事で、入社後のイメージを持つ事が出来ます

今回、記念すべき、第1回目は、4月末までの外部研修の様子をお伝えします。

※研修内容は企業によって異なるので、参考程度でお考えください。

■外部研修に参加しました。

★外部研修の1日のスケジュールと研修の様子

 自宅から1時間掛けて研修会場である、銀座✨に到着しました。(朝6時起きで少し眠くて電車の中で寝てしまいました。・・・)

時間内容
9:00~9:15連絡事項,3分間スピーチ
9:15~9:45前回の座学の復習
9:45~12:00座学
12:00~13:00昼休憩
13:00~17:00座学
17:00~18:00日報の作成
研修の1日のスケジュール

1日のスケジュールは、左側の通りになっています。

研修は2か月間、月曜日から金曜日までの9時から18時の8時間の研修です。

1時間ごとに10分間の休憩があります。(ちなみに皆さん、休憩中は疲労回復のため仮眠を取った人も居れば、会話もしている人もいました。)

研修の雰囲気は和やかな様子で、よく世間で噂をするブラック研修ではありません。

(真剣に研修を受ける研修環境で、本当にホッとしています。😌)

★研修内容

研修の内容は、以下の項目通りです。

  • 4月では、ITの基礎、Linux,プログラミング入門(HTML・CSS、Java Script ,My SQL,PHP)を学習しました。
  • 朝の業務連絡後には、ローテーションでIT業界の最新のニュース、トレンドを3分間スピーチを行いました。
  • 昼休憩後は、毎週、月曜日・水曜日・金曜日は、作業効率を図るため、寿司打を用いてタイピングを練習をしました。<^!^>(寿司打のレベルは、標準の5000円レベルの難易度で打ちました。)
  • 昼休憩後の火曜日と木曜日は、毎回講師から課される、テーマをグループディスカッションして発表する事を行いました。※テーマは様々です。ex(東京のお土産で選ぶなら何か。、幸せとは何か。等)

 研修のスピードは、とても早く、テキスト1冊が1日で終わる内容もありました。研修のスピードの速さがまるで、新幹線の様なスピードの速さで、研修から2週間後には、頭がパンクしている状態でした。(*_*)

 それでも、研修のスピードについていく様に対策を実行しました。

★研修以外での取り組み

  • テキストの内容で疑問や矛盾を持った事は質問しました。
  • 自宅で学習した事を実践してみました。

 以上の2点を取り組みをする事で、徐々にプログラミングを理解することが出来ました。特に、テキストの内容を質問を積極的に行いました。( `ー´)ノ

研修のスピードが早い為、分からない点もありました。しかし、分からないままにすると、後に他の言語の学習でも影響するので質問しました。

★お役立ち情報

 学生の皆様、IT業界問わず、社会人1年目は、積極的に質問した方が良いでしょう。質問する事で、分からない点も分かるようになり、また、指摘されても、自分では気付かなかった間違いや修正する点を発見する事ができます。

大学や専門学校で先生や教授に質問していない方は、今のうちに質問をする習慣を付けていくと良い事がありますよ。

■まとめ

今回、4月の研修をお伝えしました。 研修を振り返って見て、雰囲気は、プログラミングを実行する時に、講師が徘徊して、質問出来る環境だったので有意義な研修を過ごすことが出来ました。また、初学者でも分かりやすい図や説明をしているので、未経験な私でも、付いて行く事が出来ました。(講師の方に、本当に感謝しています。((+_+)))

しかし、一人前のエンジニアになるには、プログラミングを実行して終わりではなく、もっと効率良くできるのではないかという探究する事も必要だと感じました。好奇心旺盛な方は、もしかしたらプログラマーの職に適しているのではないかと考えています。

次回の第2回目は、5月の外部研修の内容をお伝えします。それでは、IT業界に興味がある学生の皆様、またお会いしましょう。

そして、就職活動中の学生の皆様、頑張ってください。 アディオス!!

新入社員活動記録Part.1(山本)

こんにちは。21年度入社の山本です。
入社から約3か月、今日までにいろいろな経験や学びがありました。
そこで今回から数回に分けて、私が行ったこと、その中から得た学びを連載形式でご紹介します。

自己紹介-

改めまして、こんにちは。21年度入社の山本です。
入社後の研修や学びをご紹介する前に簡単に、自己紹介をします。

私は、某工学系大学の情報学部でコンピュータについて勉強していました。
ハードというよりはソフト側です。
大学ではプログラミングはもちろん、ネットワーク関係、スーパーコンピュータを使った計算を勉強しました。
卒業研究では、「日本の官庁で最初に導入されたコンピュータ」について調べていました。
ちょっと歴史系っぽいですよね・・・。研究室でも異端な研究だったかもしれません・・・。

趣味はパソコンでゲーム。特にFPSが好きです。歴は長め。

そんなパソコン大好きな私ですが、Web系は未経験・・・。どんな苦難が待ち受けているのか・・・!?

外部研修へ

今年度からの新しい試みとして、入社から2か月は外部研修へ行きました。
「新入社員PHP研修」と銘打たれた外部研修では、お仕事の基礎となるプログラミングを学びます。
PHPとは書かれていますが、「そもそもPHPとはなんぞや?」となるわけです(プログラミング言語だということは知ってるけれど・・・)。
そんな私も安心。基礎の基礎から丁寧に学んでいきます。
周りの参加者の皆さんも未経験(新入社員研修だから当たり前ですね・・・)。
みんなで一人前のプログラマを目指すと思うと熱が入ります。

-研修の内容-

研修では、基礎の基礎から始まり、最後にはWebページを作れるようになるまで丁寧に教えていただきました。

新入社員PHP研修では、下記の項目を教えていただけます。

  • IT基礎
  • プログラミング入門
  • PHP入門
  • MySQL
  • Laravel
  • Linux入門
  • Git入門

IT基礎-

プログラミングを学ぶ前に、まずはWebの基礎から学びました。
IPアドレス・MACアドレス・TCP/IP・etc・・・。
この辺は大学でやったから簡単・・・かと思いきや意外と覚えていないものですね。
教科書はメモでびっしり。勉強になります!

-プログラミング入門

いよいよ、プログラミング!
手始めにHTMLを勉強します。
「HTMLはプログラミング言語ではない」なんて声もよく聞きますが・・・。細かいことは置いておきましょう。

HTMLはwebページを作るための言語。私たちがよく知るあのサイトやこのサイトもHTMLで書かれているんです!

作業を重ねるとだんだんwebページっぽくなっていきます。ワクワクしますね!

-Linux入門

HTMLの使い方を一通り教わると、Linux入門に入っていきます。
Linuxとは、WindowsやMacOSに数えられるOSのひとつです。ただし、WindowsやMacOSとは違い、様々なカスタマイズがあるので、どのLinuxを経験したかで操作が全然違います。

今回は、黒い画面にコマンドを打ち込んで操作する所謂CUI操作を学びました!
映画とかに出てくる小難しそうなアレですね!気分はスーパープログラマー!
映画での印象の通り、実際小難しいです!でも大丈夫!やり方は教科書に書いてあります!

このあたりのことをイメージだけでもつかめるようになると、お仕事が少し楽になりますね。実際、業務上で非常に助かっています!

外部研修でのことは一旦ここまで。Part.2へ続きます!

最後までご覧いただきありがとうございました!

[bug]マルチプロセスでlog4netのファイルローテーション時に一部ログが欠損して困った

福岡の香月です。

log4netのRollingFileAppenderを使って日付で出力ファイルが切り替わる設定をしていたところ、日付が変わって新しいファイルへの出力が始まると先頭に出力されるであろうログがなぜか出力されない現象に遭遇しました。
設定はこうです。
複数のプロセスで同じ設定を用いて、同じファイルに対してログ出力します。

[/crayon]

AppenderはRollingFileAppenderを指定しています。複数プロセスで使用するため、lockingModelはInterProcessLockを指定します。これによりファイルストリームを開きっぱなしにして、mutexで排他制御しながら末端にシークし書き込みを行うことで、複数プロセスから効率的にログ出力を行ってくれます。
複数プロセスから使う場合はこれ以外にもMinimalLockを指定できますが、書き込むたびにファイルのオープンクローズを実施するため速度が求められる場合は不向きでしょう。さらに複数プロセスからの出力が同時に走った場合、片方はオープンできないためログが出力されません。

この設定でビルドし、業務終わりにアプリを起動して一晩中実行させ、翌朝出社して確認しても日付が変わった後のログの内容が足りませんでした。
最初はlog4netの使い方が悪いのか、自分のプログラムにバグがあるのかさんざん悩んだんですがさっぱりわからない。トレース用に埋め込んだログも当然のように出ていないのでどうしたものかと思いました。

しかし、プロセスが1つの場合はちゃんと期待通りのログが出ていました。問題があるのは複数プロセスの場合だけだったのです。

そこでlog4netのロジックを確認することにしました。 幸いなことにソースはこちらから取得できます。
https://github.com/apache/logging-log4net
すると、ファイルが切り替わったあとは最後に書き込んだプロセスのログが先頭に来て、それ以前のログが破棄される作りになっていたのです。

少しずつソースを見てみましょう。今回使っているのはRollingFileAppenderです。日付が変わるときにファイルを切り替える部分は、RollOverTime()という関数であることがわかりました。こうなっています。
https://github.com/apache/logging-log4net/blob/master/src/Appender/RollingFileAppender.cs

[/crayon]

ふむふむ、SafeOpenFile()で新しいファイルをオープンしに行くわけね。そして第二引数がfalseと。そしてSaveOpenFile()の実態はベースクラスFileAppenderにありました。
https://github.com/apache/logging-log4net/blob/master/src/Appender/FileAppender.cs
ここから次の順番で呼び出されていきます。

  • RollingFileAppender.OpenFile()
  • FileAppender.OpenFile()
  • FileAppender.InterProcessLock.OpenFile()
  • FileAppender.LockingModelBase.CreateStream()
[/crayon]

ここでSafeOpenFile()の第二引数で指定されたfalseは、CreateStreamのappendに代入されていることがわかりました。この場合FileMode.Createが指定され、FileStreamインスタンスが作成されます。
ではこのFileMode.Createはどのような動きをするかというと、

オペレーティング システムが新しいファイルを作成することを指定します。ファイルが既に存在する場合は上書きされます。これには Write 許可が必要です。
FileMode.Create は、ファイルが存在しない場合は CreateNew を使用した要求、ファイルが存在する場合は Truncate を使用した要求と等価です。

https://docs.microsoft.com/ja-jp/dotnet/api/system.io.filemode?view=netcore-3.1

複数のプロセスでログ出力を行う場合、FileStreamを最後に作成するプロセスによりそれまでのプロセスが作成したログファイルの中身がTruncateされて、つまり削除されてしまうわけです。
発生している現象とも合致するのでこれが問題であることを確信しました。

対応するためにはRollingFileAppender.RollOverTime()から呼んでるSafeOpenFile()の第二引数をtrueに知ればよいわけです。実際に修正して確認してみると、見事欠損することなく必要なログが出力されていました。
めでたしめでたし。

なお、SafeOpenFile()はRollingFileAppender.RollOverSize()内からも呼び出しているのでここも忘れずにtrueに変更しましょう。

[Laravel]ビュー

福岡拠点の香月です。

今回はビューです。前回のルートとコントローラで呼び出されたURLに対してPHPでのプログラム処理ができるようになりました。
今回はここで実際にデータを集計して、結果を画面に表示したいと思います。この画面表示部分がMVCモデルのV(View)です。
Laravelの標準テンプレートエンジンはBladeとなっています。

それでは早速コントローラの実装です。
前回の実装ではLaravelのようこそ画面を呼び出していましたが、今回は”top”とう名前のテンプレートを使用して画面を表示するようにします。テンプレートファイルは後で作成します。
app/Http/Controllers/TopController.phpファイルを編集します。

モデルScoreに追加した2つのメソッドを呼び出して得点に関するデータを取得しています(ソースは後ほど)。$daysには試験実施日の一覧が、$scoresには試験の点数データが入ってきます。
$subjectsでは科目一覧を取得しています。
$studentsは配列として定義していて、続くforeachで点数データ列挙しながら二次元配列を作成します。一次元目に生徒名、二次元目に科目ID、その値として点数を設定しています。
最後にreturn view(‘top’)で画面を呼び出すと同時に、topテンプレート内で使用するデータを->with()で指定しています。(->with()の複数回の呼び出しは、一回の->with()の呼び出しに置き換えることができます。その場合、->with()の引数にはキー、バリューの配列を設定します)

実装の先頭で$request->input(‘day’)を使っています。コントローラメソッド(ここでいうindex())ではメソッドインジェクション(依存注入機能)を使ってRequestクラスのインスタンスを取得することができ、ユーザーリクエストの内容を利用できます。

次はScoreにメソッドを追加します。app\Score.phpを編集しましょう。

getDays()では試験日フィールドexam_dayをグルーピングして、日付の昇順に並び替えた結果を取得しています。exam_dayフィールドは時間まで入っているので、日付だけの書式に書き換えて配列に置き換えています。

getList()では引数で指定された試験日だけのデータを取得し、それに対してLEFT OUTER JOINで科目と生徒を連結した結果を返します。

さあ、ここまでくるとあとはビューを作成します。
resource/views/welcome.blade.phpをコピーしてresource/views/top.blade.phpを作成し、中身を編集します。
コントローラの最後で return view(‘top’) を呼び出していましたが、Laravelではこれでresource/viewsフォルダにあるtop.blade.phpの呼び出しと判断してくれます。

画面のタイトル「Score sheet」を表示します。
その下には試験日の一覧$daysを@foreachで列挙して表示します。各試験日はaタグでリンクを作成し、クリックするとその日の表示に切り替わるようにしています。ここでroute(‘top’)を呼び出していますが、前回route/web.phpファイル内でRoute::get(‘/’, ‘TopController@index’)->name(‘top’);と指定した名前ですね。これによりこのリンク先が。/ に設定されます。
最後にtableタグで点数表を表示します。縦に生徒軸、横に科目軸を設定して、各生徒の点数を表示するようにしています。それぞれ@foreachでループしながらテーブルを生成しています。

これで実装が完了しました。実際に画面を表示して見ましょう。
表示するデータはシーダーで用意したデータです。
こんな感じで画面が表示されます。

Bladeテンプレートエンジンでは@foreach以外にも@if, @elseや@switch, @case, @breakなどの制御構文が使えます。

また、テンプレートの継承や@includeなど、他のテンプレートファイルと組み合わせて1つの画面を作成することができます。同じ内容を複数のファイルに書くと、後からの編集が大変ですね。その手間をなくすために積極的に活用しましょう。

[Laravel]ルートとコントローラー

福岡拠点の香月です。

今回はルートとコントローラーを追加します。

ブラウザでURLリンクをクリックしたときにはそれに対応した画面が表示されますが、Webサーバー内ではそのURLに対して表示するデータをモデルから取得し、そのデータをビューで整形してHTMLとして表示します。このモデルとビューの橋渡し役がコントローラーの役目となります。また、要求されたURLをどのコントローラーで処理させるかを指定したのがルート(ルーティング)です。

では早速ルートから指定していきます。laravelプロジェクトのrouteフォルダにweb.phpがあります。これを開いて次のように編集しましょう。

アプリケーションのトップURL(http://server/)が呼び出されたときに、TopControllerクラスのindexメソッドを呼び出すように指定しています。
->name(‘top’)でこのルートに対して名前を付けています。ここでつけた名前は他の場所でURIを指定するときに使うことができます。

次はTopControllerの作成です。シェルで次のコマンドを実行します。

するとapp/Http/Controllers/TopController.phpにファイルが作成されます。
クラスメソッドとしてindex()を追加してあげましょう。

route\web.php内で直接指定していたようこそ画面の表示を、コントローラーを介して表示するように変更しただけのものですが、このようにしておくことでビュー(ここではようこそ画面)で表示したいデータをphpプログラムで集めて、計算して、整形して表示することができるようになります。

上のphp artisan make:controllerコマンドではオプションは指定していませんでしたが、–model=[Model]や–resourceオプションを指定することで、リソースコントローラを作成することができます。
こうすることで作成されるコントローラ用ファイルにindex(), create(), store(), show(), edit(), update(), destroy()の名前が付いた空のメソッドが一緒に作成されます。例えばStudentモデル用のリソースコントローラを作成するにはこう書きます。

また、リソースコントローラを使う場合はroute/web.phpのルート指定を次のようにすることで、URIとアクションが自動的に割り付けられたルーティングが完成します。

Route::resource()の1行で次のルーティングが完成します。

動詞 URI 対応メソッド ルート名
GET /students index students.index
GET /students/create create students.create
POST /students store students.store
GET /students/{student} show students.show
GET /students/{student}/edit edit students.edit
PUT/PATCH /students/{student} update students.update
DELETE /students/{student} destroy students.destory

これはいわゆるRESTful APIとして設定されており、必要なURIが揃っているのでリソース(≒モデル)のCRUD(Create, Read, Update, Delete)管理がはかどるでしょう。

リソースコントローラの考え方は他のWebフレームワークでも同様に使われています。Ruby on Railsでは「rails generate scaffold …」コマンドが使えて同じようなルートを生成してくれますし、CakePHPでもルート指定時にまとめて設定してくれる方法があります。これらからLaravelに来た人にとってはわかりやすいですよね。

[Laravel]シーダー

お久しぶりです。福岡拠点の香月です。

今回はシーダーです。
作成したテーブルに初期データやテストデータをを投入するときに使います。

前回からテーブルを2つ「subjects」「students」を追加しています。

マイグレーションファイルでフィールドを定義して

マイグレーション

これでテーブルが追加されました。
ではここに初期データを投入しましょう。Subjectテーブルは科目、Studentテーブルは生徒、Scoreテーブルは点数です。
まずはシーダーファイルを作成するために、make:seederコマンドを実行します。

すると、Laravelプロジェクトフォルダのdatabase/seedsフォルダにファイルSubjectSeeder.php、StudentSeeder.php、ScoreSeeder.phpが作成されます。

まずはSubjectシーダー。
作成されたシーダークラスファイルには run() メソッドが用意されています。シーダーが呼び出されるとこのメソッドが実行されるようになっているため、ここにデータ投入用プログラムを記述します。
上にuse App\Subject; を追加して、Subject Eloquentモデルを使えるようにするのを忘れずに。

Subjectクラスのインスタンスを作成して、フィールドに値を設定し、save()メソッドを呼ぶことでレコードが追加されます。
このプログラムでは$seeds配列の1つ1つが1レコードとなるようなプログラムになっています。

続いてStudentシーダー。こちらはモデルファクトリを使って、フィールド値をランダム生成します。フィールド値には日本語を使いたいので、config\app.phpを次のように修正。

次にファクトリコード用のファイルを作成します。

作成したファイルdatabase\factories\StudentFactory.phpを次のようにします。

$factory->define()の第二引数のクロージャで、Studentレコード1件分の情報としてフィールド名(キー)と値(バリュー)の配列を返すようになっています。$faker->lastName、$faker->firstName部分がランダム生成の部分。これ以外にもcity、phoneNumber、wordなどいろいろ使えます。便利。誕生日は2011/04/02~2012/04/01までの1年間でランダムに生成されるようにしました。

そしてdatabase\seeds\StudentSeeder.phpです。

モデルファクトリを使って20個のエントリを簡単に作成できます。

database\seeds\ScoreSeeder.phpはこう。

作成したSubject、Studentの全レコードを取得し、ループで回しながら作成していきます。

プログラムができたらシーダーを実行しましょう。実行コマンドはdb:seedです。
実行するクラス名を–class=オプションで指定します。

これは1つずつ実行するコマンドとなりますが、まとめて実行したい場合は最初から用意されているDatabaseSeederクラスを利用するとよいでしょう。
database\seeds\DatabaseSeeder.phpファイル内の run() メソッドからまとめて処理したいクラスを指定して、

db:seedコマンドをオプションなしで実行します。

これでデータ投入が完了しました。

[Laravel]追加のマイグレーション

福岡拠点の香月です。

前回はDBのマイグレーションを行いました。
既にマイグレーション実行済みのテーブルに変更を行いたい場合、アプリケーションが稼働する前であればロールバックしてマイグレーションをやり直せばいいのですが、本稼働後のバージョンアップなどでデータを棄損することなくテーブルにフィールドを追加したいことがあります。この場合、フィールド追加用のマイグレーションを実施することになります。

まずは前回と同じようにマイグレーションファイルを作成しましょう。

これによりdatabase/migrations/(日付)alter_scores_table.phpが作成されますので、ここに追加したいフィールドを記載します。

up()メソッドにマイグレーション実施時のコードとして、scoreフィールドをexam_dayの後ろに追加するようにしています。
もちろんクロージャの中では必要なフィールドを1つだけではなく複数記述できます。文字列フィールド、timestampフィールドなど用途に合わせて追加しましょう。
カラム修飾子には->after()を使用しています。これ以外にもnullを許容する->nullable()、コメント文字列を指定する->comment()などいろいろ使えますよ。

down()メソッドにはロールバック実施時に実行されるコードを記述します。ここ忘れがちなので注意!

マイグレーションファイルを作成したら、マイグレーションを実施します。

マイグレーションが実施されていないファイルを対象に実施されます。同じファイルが2度3度と実施されることはないので安心してください。
実行後に反映されたことを確認しましょう。