interprism's blog

インタープリズム株式会社の開発者ブログです。

プログラミングコンテストの感想【2022年入社 Y.K】

プログラムが正しく動くならどのようなコードを書いてもいい、ということはない。
普段の研修課題では自分が書いたコードを先輩社員にレビューしてもらうため、可読性を意識してコードを書くようにしている。
そのため、「わかりにくいが少し速いコード」と「わかりやすいが少し遅いコード」であれば後者が望ましい。
プログラミングコンテストは普段の研修とは趣旨が違い、至高のコードは「実行時間が短いコード」である。
至高のコードを求め、3日間のプログラミングコンテストで自分が特に意識したことは「アルゴリズムを工夫して計算量を抑える」、「速くするための小技をたくさん使う」、「ファイル入出力の処理を工夫する」である。

1日目。
問題が渡され、まずは実行時間を気にせず正解となるコードを書くことを目標にしたが、これがなかなか難しい。
誰もが最初に思いつくであろう、ファイルの内容を最初に全て読み込んで計算させるコードを書いてみたが、メモリーの使い過ぎでルール違反になってしまう。
ファイルを少しずつ読み込んで必要なデータを保管して不要なデータを破棄する等、なんらかの工夫が必要である。
ファイル入出力のより良い方法を調査をしたり、アルゴリズムを考えたりしているうちに1日目が終わった。

2日目。
正解となるコードが書けた。
プログラムの実行時間は10秒くらいで、すごく遅い。
コードを整理して2日目の記録は最終的に8秒くらいになった。
帰りの電車の中で、ある処理の計算量を大幅に抑えられるアルゴリズムを思いついた。

3日目。
早速、計算量の少ないコードに書き換え、「速くするための小技」をふんだんに盛り込んだ。
プログラムを実行してみたが、期待していたほどタイムは縮まらなかった。
実行時間の計測区間を細かく分けて計測してみると、全体の実行時間のほとんどがファイルを読み込む処理にかかっていることがわかった。
ファイル読み込み以外の処理が一瞬で終わるようになったとしても、全体のタイムにほとんど影響しないのである。
ファイル読み込み関連の処理をいじって最終的なタイムは3秒くらいになった。

実行時間を短くするためにアルゴリズムを考え、試行錯誤しながらコードを書き換える作業はとても楽しかった。
出来上がったコードを改めて眺めてみると、何をしているのか自分でもよくわからないコードができていた。
少しでも実行時間短くしようと思って「速くするための小技」を盛り込んだのが原因である。
プログラミングコンテストを通じて、「実行時間を遅くしている主要な要因を探し出し、その部分を改善することが大事」ということを学んだ。

プログラミングコンテストの感想【2022年入社 T.S】

CSVファイルから行と列を指定して成分を取り出すという単純な動作が、実装によって処理時間が大きく変化することに面白さを感じた。
日本全国の郵便番号が書かれたCSVファイルを見ても、約12万行,12MBなのでファイルI/Oの高速化が重要な要素になるのだと実感しました。
今回は外部のライブラリやデータベースを使わなかったですが、apacheのCommons CSVライブラリや、SQLのLOAD DATA INFILE文などCSVを処理できる手段はいろいろあるのでいろいろ勉強していきたいと思いました。
コンテストが終わった後、同期で感想戦を行いました。
いろいろなロジックを見て、よくこんな実装思いつくなぁと感心しました。
ファイルI/Oだけでなく、正規表現コンパイルなどの処理の勉強にもなり、刺激的な3日間でした。

2022年度新人合宿☆

イントロ

どーも、だーさんです。

[2022/06/01 ~ 2022/06/03]で恒例の新人合宿に行ってきました。 初めて講師側で合宿に参戦してきたのでその内容やら感想やら(ちょっと偏見もあるかもしれません)を書いていこうと思います。

初めにまとめを書いておくととっても楽しかったです^v^

社会人4年目で新入社員と話し合いをするのは懐しい様であり、新鮮な様であり自分にとってもいい経験になりました。自分の時と比べると全体的にみんな大人で頭も下がります^_^;

ではでは始めます。

合宿1日目!

みんなが集まったよ!

全員集合時間前には会場に着いて、一旦落ち着いてから始めることができました。初めはちょっと緊張しつつも和やかな雰囲気で合宿がスタートしました。

IceBreak

まずはIceBreak「たくさん書くゲーム」です。6月ということで入社して2ヶ月が経ちますがまだまだお互いのことを知らないもの同士ゲームで緊張感を和らげるための企画です。お題は3種類。意外と「たくさん書いてください」と言われても浮かんでこないものですね。今年は5人なので2人と3人に分かれての対決だったのでちょっと不平等でしたが接戦でそこそこの盛り上がりを見せました笑

7つの習慣

さあ、IceもBreakしたところで本題です。1日目は7つの習慣の輪読会です。例年だと講義形式でしたが、今年は漫画でわかる7つの習慣を使用してみなさんに読んでいただきました。イントロ+7つの習慣(7章)で8フェーズに分けて読んでもらいました。1フェーズごとに内容の確認と各自の感想・意見交換をしてもらうという進め方です。

各々思うところがあったようで自分の今までの生き方に照らし合わせて、そして、これからの自分を思い描きながら読み込めていそうという印象を受けました。本の内容でうまく理解ができていない部分について言及する場面もあり、みんなで意見を出し合い話し合うことで理解を少しずつ深められたのではないかなと思います。もちろん一朝一夕でできる内容ではないですし、その時々の置かれた立場や状況によって感じ方や考え方は違いますが、現時点での自分なりの納得の仕方をしてくれていた様に見受けられます。

正直こんなに活発に意見交換すると思っていなかったので話し合いの時間を少し少なめにしていたのですが、終わってみると全然足りなかったです。もっとゆっくり一人一人の意見を聞きながらできたらよかったなと反省しています。。読んでいる時もネットを見ながらより理解を深めたり、読んだ内容をメモがてらまとめたりしている姿も見受けられ前向きな姿が心に響きました。素敵な新人たちです。こういった概念と言いますか人生と言いますか込み入った話を真面目にする機会は少ないので来年はもう少し丁寧にできたらいいなと思います。

余談

昼休憩中にテーブルを繋げて持参したラケットで卓球をしていました。初めてのメンバーもいたようでぎこちない戦いでしたが見ていて微笑ましい光景でした。同時刻に本社の方でも前社長が卓球セットを持参していたらしく、ランチスペースのテーブルで卓球が行われていたようです。以心伝心、IPらしい社員が入ったんだなーなどとほわッとした気持ちになりました(*^ω^*)

食事

美味しかったです。

合宿2日目!

朝を迎えたよ!

朝ご飯でゆっくりスタート。みんな朝は早めでした。朝食は7~9時でしたが全員7時台にはお食事どころにきていましたね。昨日の夜はトランプで盛り上がったようです。

工数見積演習

仕事で出会う99%出会うアレ。。。

3段階の課題があったのでそれぞれでの様子・感想を記載していきます。

見知った内容の見積もり

初めてということもあり、各々の考え方の違いで結構バラけました。1日という人もいれば1時間にも満たない人もいました。内容を聞いてみると実装自体はみんな同じくらいでしたが前提条件(言語、環境構築、提出方法等)の確認やテスト、もしもの時の対応の有無によって差が出たようです。研修の中でレビューがなかなか返ってこないという経験則からその分の時間を多めに取っている人もいました。ごめんね。。笑
とはいえ、お互いの時間の差が大きいことに衝撃があったんじゃないかなと思います。

見知った内容ではあるが内容が不明瞭な見積もり

対応表が必要なタスクの内容なのに、その対応表を探すところから始めなければならない。そうなったときにどんな見積もりを出したらいいのか悩みどころですね。以下の内容でできそうだという意見が出ていました。

  • ネットで対応表を見つけてそれをそのまま使う。
  • ネットで対応表を見つけて使いやすい形に加工する
    • プログラム的に操作する
    • 手動で対応する

対応表をそのまま使う場合、その形式とjavaでどのように連携を組むのかを考える必要がありますね。プログラムを駆使してjavaに定数ファイルを落とし込むのもいい手です。手動でjavaに落としこむ案も出ましたが、それは避けたいところですね。。単純作業のタスクを何日もやらないといけないのかと思うと気が重いですし、何よりも我々はエンジニアなのでエンジニアリングでなんとかしたいですね笑

やったことのないタスクの見積もり

「Webシステム」を題材としており、今までの研修ではまだ触ったことのない人の方が多い内容でした。既にある程度存在しているシステムに機能を追加するというものです。
既に存在しているシステムを利用すればそこまで難しくないかもしれないという見方で少なめに見積もる人と、既に存在しているシステムにバグを生まないように慎重に取り組んだ方がいいという見方で多めに見積もる人に分かれていました。

見積もりの全体を通して

性格的に慎重派か楽観的かで大きく時間が分かれるようでした。私は楽観的な方なので、慎重派の意見には耳が痛い思いでしたね。未知のものに対して見積もる日はまだ先かもしれませんが、いい経験になったのではないかなと思います。勘でもいいという条件でしたが各々しっかり意見を明確にして見積もりを算出できていました。

限定コミュニケーション

「口頭のみで伝達する場合」「資料のみの伝達する場合」「口頭と資料で伝達」する場合の3段階で体験してもらいました。お客さんとのやりとりもそうですが、世の中的にリモートが増えており限定コミュニケーションをせざるを得ない場面は多いです。

やってみるとやはり口頭のみで伝えることに苦戦していました。何度伝えても伝わらずお互い煩わしい気持ちにやきもきしちゃいますね。質疑応答をする中でなんとか伝えることができましたが、その中で誤って伝えてしまっていたり伝え忘れがあることに気付いたりたくさんの気づきがありました。結論としては、時間はかかったものの意思疎通が図れたことに本人は満足そうでした笑
伝えることの難しさを実感できたと思います。

資料を作成する方では、できるだけみてわかる資料を作りたいですね。後に見返すことも考慮して情報漏れもないようにしたいところです。実際にやってもらうと、文字や図を用いて作成している班も文字だけで作成している班もありました。内容を項目分けしてページを分けて作成するなど読み手がわかりやすいような工夫も見受けられました。 結果はこちらが考えている以上の情報量があり、優秀さを感じましたね。素敵でした。(^^

伝えるって大事なことですね。その手段として何を使えばいいのか。言葉だけで説明できることもありますが、視覚や聴覚いろんな要素を用いて確認し合いながら伝えられるとお互いに幸せですね。仕事ではお客さんからもらう資料が多いですが、こちらから提案する際にはこの経験が活かせるといいですね。また、内部でのやり取りもチャットですることが多いですが、もし「なんか伝わっていないかも?自分の理解が伝えてくれた人の気持ちに添えているのかな?」と思う時には画像や図を積極的に用いるのも日常的なプチストレスが緩和できて個人的にはおすすめです。

恋人たちも気持ちを伝え合えたらすれ違いが減るのかもしれませんね。←余談です。

レビュー練習

チームで開発する上で欠かせない相互レビュー。案件配属の前に体験してもらいました。レビューの観点ややり方のレクチャーを受け実際に1時間かけてレビューしてもらいました。

初めてのレビューでコードをどこから見始めたらいいのか戸惑っていたようです。戸惑いながらも1行1行丁寧に読んでくれて、みて欲しかったポイントを各々押さえられていました。全体の構成やバグがないかなどの指摘に加え、より良くするための提案やうまく書けている部分への賛辞など最初にレクチャーされた内容も考慮されており脱帽でした。

合宿3日目!

朝を迎えたよ!

合宿最終日。チェックアウトが10時なので朝のうちに荷物もまとめて集合しました。いつもとは違う日常で、疲れが溜まっているところですが、時間に遅れることなく最終日がスタートしました。

課題解決

ある問題について解決策がないか考え、一定の基準により優先順位を決めるというものです。どこから手をつけていいかわからなかったり、思ったより考える視点が多くて時間が足りなくなったり苦戦することもしばしばでした。前提条件や目的を明確にしたり、時間を区切ることでより効率的に話し合えることが実感できたのではないでしょうか。

また時には意見が合わないこともあり、ある見方をするとメリットでもあるし、別の見方をするとデメリットになるといった場合もありました。それに対して、しっかり意見交換がされていたようなので充実した話し合いだったのではないかと思います。相手の意見を尊重することも自分の意見を大事にすることも同じだけ大事なことだと思います。また、当たり前ですが、意見は言わないと伝わりません。受け身になることなく、全員が自分の意見をしっかり示せていたことも素晴らしかったと思いました。

レビュー練習2

昨日に引き続きレビュー練習です!同じく1時間でレビューしてもらいました。ここにさらに書く内容は全くありません。なぜって?非の打ちどころがなかったからです笑
今の気持ちを忘れずに案件についてからも素敵なレビューをお願いします。m(_ _)m

最終フェーズ

時間が余ったので講師からこれから役に立つであろう講義をいくつか。

  • 案件配属の心構え
  • 派遣、出向のお話
  • 情報セキュリティ

真剣な眼差し。。
みんなはどんな働き方をするんでしょうか。IPの仲間としてお互いをリスペクトできる未来を待っています。(もちろん今もリスペクトしていますよ!)

まとめ

皆さんお疲れ様でした。2泊3日の旅はどうだったでしょうか。会社で業務に没頭していると忘れがちな大事にしたい考え方や身の振り方を学べたでしょうか。元々素敵な自分をさらに磨けるようにこれからも張り切ってお仕事しましょう!新しい仲間と出会えたことに拍手を送りたいと思います。これからもよろしくね。

Laravel9で環境構築3(DockerFileでカスタマイズ)

DockerFileでカスタマイズ

こんにちは、だーさんです。
Laravel(5.6)とMySQLを使用してWebサイトを作成する仕事をしています。
今回はDockerfileを作成する手順とMySQLの設定ファイルを作成する手順(文字コードの設定)を紹介していきます。

Dockerfileの作成

sail artisan sail:publish

上記コマンドでアプリケーションルートにdockerというディレクトリが作成されます。
また、docker-compose.ymlの記述も一部変更されます。

docker/7.4/Dockerfild
docker/7.4/php.ini
docker/7.4/start-container
docker/7.4/supervisord.conf

docker/8.0/Dockerfild
docker/8.0/php.ini
docker/8.0/start-container
docker/8.0/supervisord.conf

docker/8.1/Dockerfild
docker/8.1/php.ini
docker/8.1/start-container
docker/8.1/supervisord.conf

docker-compose.ymlservice.laravel.test.build.contextを見ると./docker/8.1となっているので7.4や8.0のディレクトリは使われていないことがわかります。 例えばPHP8.0の環境で起動させたい場合はここを./docker/8.0とすることで切り替えが可能です。

残念なからM1macではPHP8.0以下にするとbuildエラーが起こります。一部のパッケージがインストールできないようです。service.laravel.testservice.mailhogservice.seleniumに以下を追加してあげると対応可能になるようです。

platform: linux/amd64

さて、Dockerfileで環境設定をいじれるようになりました。
最低限の設定として標準時刻を日本に切り替えておきましょう。Dockerfile内のTZを以下に書き換えます。

ENV TZ='Asia/Tokyo'

書き換えたら再ビルドして確認しましょう。

sail build --no-cache(再ビルド)
...
(build中)
...

sail up -d(起動)
sail shell(アプリケーションコンテナにログイン)

date(日付を確認)
Sat May 28 14:14:39 JST 2022

MySQL文字コードを設定

日本語で適切に表現するために文字コードを変更します。 docker/8.1ディレクトリにmy.cnfファイルを作成します。
以下はmy.cnfファイルの中身です。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4

これをMySQlの設定ファイルとしてMySQlコンテナの/etc/に配置するようにdocker-compose.ymlに追記します。
service.mysql.volumes'./docker/8.1/my.cnf:/etc/my.cnf'を以下のように追記します。

mysql:
    image: 'mysql/mysql-server:8.0'
    ports:
        - '${FORWARD_DB_PORT:-3306}:3306'
    environment:
        MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        MYSQL_ROOT_HOST: "%"
        MYSQL_DATABASE: '${DB_DATABASE}'
        MYSQL_USER: '${DB_USERNAME}'
        MYSQL_PASSWORD: '${DB_PASSWORD}'
        MYSQL_ALLOW_EMPTY_PASSWORD: 1
    volumes:
        - 'sail-mysql:/var/lib/mysql'
        - './docker/8.1/my.cnf:/etc/my.cnf'

一旦sail dwonしてコンテナを停止させ、再度sail up -dで起動してみましょう。 文字コードを確認すると変更されているはずです。

変更前

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.02 sec)

変更後

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

続きはこちら

設定ファイルを定義できましたので、あとはDockerやMySQLの設定方法などを調べつつ必要に応じてカスタマイズしていきましょう(>v<)!

Laravel9で環境構築1(環境構築) - interprism's blog

Laravel9で環境構築2(sailコマンド) - interprism's blog

Laravel9で環境構築4(複数人で開発する): 作成予定です。

参考文献

  • プロフェッショナルWebプログラミング Laravel〈最新Laravel 9対応〉

Laravel9で環境構築2(sailコマンド)

sailコマンドについて

こんにちは、だーさんです。
Laravel(5.6)とMySQLを使用してWebサイトを作成する仕事をしています。
今回はsailコマンドについて紹介していきます。

sailコマンドはDockerやPHPのさまざまなコマンドを実行することができます。 Dockerコンテナ内で操作していたコマンドも一部sailコマンドを使うとコンテナに入らなくても実行することができます。

コマンド集

Dockerコンテナに関するコマンド

起動する
sail up

デーモンで起動する
sail up -d

コンテナ停止
sail dawn

アプリケーションのコンテナににログイン
sail shell

MySQLにログインする(MySQLコンテナに入りmysqlコマンドで起動するのと同じです。)
sail mysql

Laravel.artisanコマンド

コンテナににログインして実行

アプリケーションのコンテナににログイン
sail shell

artisanコマンド実行
php artisan {command}

コンテナにログインせずに実行

artisanコマンド実行
sail artisan {command}

Laravelのテスト用のコマンド

コンテナににログインして実行

アプリケーションのコンテナににログイン
sail shell

artisanコマンド実行
./vendor/bin/phpunit

コンテナにログインせずに実行

artisanコマンド実行
sail test

その他のコマンド

PHPコマンド
sail php -v

Composerコマンド
sail composer -V

Node.jsの実行
sail node -v

npmの利用
sail npm -v

続きはこちら

コンテナへの出入りのコストが削減され、サクッと開発ができるようになっていますね!(>v<)

Laravel9で環境構築1(環境構築) - interprism's blog

Laravel9で環境構築3(DockerFileでカスタマイズ) - interprism's blog

Laravel9で環境構築4(複数人で開発する): 作成予定です。

参考文献

  • プロフェッショナルWebプログラミング Laravel〈最新Laravel 9対応〉

PAGE TOP