interprism's blog

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

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

研修の一環として行ったプログラミングコンテストだったが、その内容は普段の研修と大きく異なるものだった。
普段はプログラミングに関する新しい知識を学び、そのサンプルとなるプログラムを作成するものだが、今回の課題では学んだことを活かして処理の早いプログラムを作成するものであった。
自分は最低限の処理を行うプログラムすら満足に書けず、実行したい処理をするためのコードを同期の方に教えていただきながら課題を解決した。
今回の課題で特に苦労した所は、型の変換を行うことだった。
ファイルを読み取る時にファイルに書かれた数字だけを読み取る必要があり、初めは文字列として読み取ったが、その後に数字の大小を比較するために文字列を数値にしなくてはならず、型の変換に苦労した。
また、条件のあるプログラム作成の練習になったことはとても良かった。
ヒープメモリーのサイズが100MBという制約の中でどのように処理を行えば良いかを考えることで、より実践的なスキルが身についたと感じる。

プログラミングコンテストの感想【2023年入社】M.A

五日間の期限でプログラミングコンテストに挑戦しました。
問題は行列計算をいかに速く実行するかというものでした。
社内ランキングがあったのでそれをモチベーションに実施していました。
初めはとりあえず問題を解けるようなコードを用意しようと思い、素直に考えついたコードを実装してみました。
結果としては、実行に数時間かかるコードになり1日目はそれで終了しました。

2日目からは、初めに書いたコードを改善していく方法で実装していきました。
1日目に実装した方法では、同じ部分を何回も読み込んでいたり、実行に時間のかかる命令を繰り返していたのでそのような部分を少しずつ無くしていきました。
2日目の終了時点で実行速度は1分半ほどになっていました。
初日に比べると実行時間はかなり短縮できましたが、他の方の実行速度と比較するとまだまだ遅かったので3日目以降のモチベーションになりました。

3日目以降も、引き続き時間のかかる処理を一つずつ無くす作業を行なっていました。
コンテストでしたが、同期の間で情報共有も行なっていました。

4日目になると実行速度はそこそこ速くなってきて2秒ほどで問題を解けるようになっていました。
残り1日だったので最終的な目標は1秒を切ることにしました。
最終日は、いくつか改善案を試してみましたがなかなか実行時間を短くすることはできず、1秒を切ることはできませんでした。

プログラミングコンテスト全体を通じて問題を発見することとそれを改善する方法を考えることの良い練習になったと思いました。

1年間、勉強会を開催してみました

こんにちは、2年目のsayamaです。(※ 勉強会をやりきり、この記事を書いているときは2年目でしたが、記事が公開されるときは3年目になっています。ややこしいので、この記事は2023,3月に書かれたと思って下さい)

この1年間、毎週木曜に勉強会を開催してきました。知識やスキルを高めることを目的として、幅広い分野にわたる技術やツールについて学び、成長することができればと思い、発足しました。

この記事では、この勉強会で取り上げた内容や、感想を紹介したいと思います。ぜひ、お付き合いください。

 

どんな勉強会だったか?

  • 毎週木曜 業務後の15分
    時間は絶対にオーバーしたくありませんでした。業務後のプライベートな時間は大切なので。
  • 気が向けばいつでも/誰でも参加可能です
    様々な方が聴きに来てくれました。本当にありがとうございました!
  • 話す内容ななんでも良いです
    フランクに、緩く。

 

勉強会で扱った内容

1年間を通して、約50回くらいの開催でした。全部の内容は正確に思い出せないので、覚えている範囲で列挙してみます。

  • パッケージの依存関係の解決について
    確か、第一回は npm による依存関係のアルゴリズムや挙動の紹介だったような気がします。
    その後、別の回では pip による依存関係解決能力が非常に乏ことや、代替ツールとして poetry や pipenv などがお勧めであることの紹介をしました。また cargo などが採用している依存関係解決アルゴリズムを解説している記事の紹介なども行いました。

  • Git の内部の挙動の紹介
    Git の内部では Git オブジェクトというものが中心的な役割をもちます。非常にスマートなアイデアでバージョン管理機能を提供している、Git の内部挙動の紹介をしました。
    blob オブジェクト、tree オブジェクト、commit オブジェクトなどの説明だけではなく、Python を使って0からこれらオブジェクトを作成するレシピの紹介まで行いました。他にも index ファイルの中身を解析してみたり、git stash でどんな Git オブジェクトが作成されるのかの観察も行いました。

  • less コマンドを使いこなしたい
    less コマンドでは、検索や移動、タグをつけたり、シンタックスハイライトを付けたりと結構いろんなことができます。
    当時、かなりサイズの大きいログファイルを解析したい場面があり、それまで使いこなせていなかった less コマンドが便利だということに気づいて共有したく取り上げました。
    基本的にはこのような感じに、緩〜く、開催していました。

  • Web アプリを作ったよ
    この勉強会の過去の内容を、ドキュメントとしてどこかに保存しておこうと思い、Next.js と firebase を使用して記事を投稿できる Web アプリを作成しました。
    しかし、これは発表内容をいちいち文章化するのが面倒になり、結局使うことは無くなりました。。。😢

  • MySQL の面白い連載記事の紹介
    MySQL の記事を漁っていたところ、「MySQL 道普請便り」というとても面白い連載記事を見つけました。
    自分のお気に入りの回などを一緒に見ながら、あなたも是非、この連載を追ってみてくださいという、オススメするだけの回でした。
    技術評論社のこのサイトは、面白い記事が多くて、とても好きです。

  • Google Colaboratory を使ってみる
    同期のK.Kさんが発表してくれました!🎉
    Google Colaboratory は、Google が提供する Jupyter Notebook ベースのオンライン環境で、ブラウザ上で動作するため、専用のPython 環境を用意する必要がなく、誰でも簡単にアクセスできます。また、Google アカウントがあれば誰でも利用可能で、基本的に無料で利用できます。
    他にも、作成したスクリプトを簡単に共有できたり、ランタイムとして GPU と TPU を選択できたり、クラウド上の仮想マシンで実行されるため、自身の PC への負荷が小さいことなど、様々なメリットがあります。
    機械学習やデータサイエンスの分野などでも広く活用されているツールです。
    この回では、この Google Colaboratory をどのように使うのか、実際の操作とともに1から教えてくれました。

  • Portainer を簡単に紹介
    Portainer は Docker のリソースを GUI ベースで簡単に管理することができるオープンソースのツールです。
    Portainer 自体も Docker のコンテナとして稼働していて、かなり簡単に始めることができるため、非常に便利だなと思い、共有したく取り上げました。

  • Python の便利なパッケージを紹介
    Python には便利なパッケージが多く存在しますが、中でもコードを書く上で便利なサポートツールをいくつか紹介しました。
    PyLint : Python におけるコーディング規約 PEP8 をベースに、リントをかけてくれるツールです。最低限守っておきたいコーディング規約が満たされているか簡単にチェックできます。
    yapf : Python のフォーマッターです。使い方や設定もシンプルで VScode などでは自動でフォーマット整形の設定を入れることも可能です。
    mypy : Python における型ヒントをもとに静的解析をしてくれます。Python の型ヒントについてはもっと話したいことがあったのですが、時間がなくさらっと流してしまいました。。。時間は絶対守る!

  • 時系列データを扱うのにおすすめ!influxDB の紹介
    MySQLPostgreSQL のようなリレーショナルデータベース(RDB) ではなく、時系列データの扱いに特化した influxDB という TSBD(Time Series Database) というものを使用する機会があったので、RDB との違いに焦点を当てながら、簡単に解説しました。
    また、この回では influxDB を Docker コンテナとして立ち上げ、以前紹介した Portainer を使いながら操作するという方法を取りました。

  • Blender を使用して3Dモデリングをしてみた
    Blender で作成した3Dモデルの作品をみて、すごいなと思い、早速僕もやってみたいと挑戦してみた結果を報告しました。
    昔、飼っていたワンちゃんの3Dモデルを作ろうと思ってトライしましたが、全く無理でした!難しい。

  • Flask で手軽にメモアプリを作成してみた
    同期のK.Kさんが発表してくれました!🥳
    Flask は Python の Web アプリケーションの軽量フレームワークで、学習コストが低く、迅速かつ簡単に開発できます。また、拡張機能も豊富なフレームワークで、必要な時に必要な機能を組み込むことができます。
    他にも Jinja2 などのテンプレートエンジンをサポートしていて、この発表では Flask+Jinja2 で簡単なメモアプリ作成のデモを行ってくれました。

  • 行動経済学から考える良いプロダクトとは
    この回では、雑談多めで、行動経済学の本によく現れる「ピア効果」「ゲーミフィケーション」「社会的選好」「返報性の原理」などの側面から、良いUIや好かれるプロダクトとして、どんなものが考えれるか皆んなで話し合いました。
    この回は、毎週、発表内容を準備するのが大変すぎて、参加型の発表にして、台本を短くしようとした記憶が。。。😏

  • SNS/SQS による非同期処理
    3年目のM.Aさんが発表してくれました!🎊
    この回では、同期処理/非同期処理の違いを紹介して、AWS における SNS (Simple Notification Service) と SQS (Simple Queue Service) を使用した、実際の実現方法を紹介してくれました!
    SNSは、メール、SMS、モバイルプッシュ通知など、複数の方法でメッセージを配信するサービスです。一方、SQSは異なるソフトウェア間でデータを送受信するキューイングサービスで、メッセージを溜め込んで必要な時に受信できます。これらSNSとSQSを連携することで、SNSからSQSにメッセージを送信し、情報を貯めておいて最適なタイミングで受信するという非同期処理ができます。また、複数のSQSに送信して並列処理するなど拡張性も高まるかと思います!

  • 丸サ進行の曲ってどのくらいあるのか?
    椎名林檎の『丸の内サディスティック』という曲があります。この曲で使用されている、夢見心地でロマンチックなコード進行が有名で、「丸サ進行」と呼ばれています*1
    J-POP には丸サ進行の曲がめちゃくちゃあります。実際に、どのくらいの割合で存在しているのか気になったので、コード進行が載っているサイトをスクレイピングして、調査してみました!
    PythonSelenium を使ったスクレイピングです。またコード作成のサポートとして ChatGPT に手伝ってもらいました。

  • RDB の数学的な側面
    リレーショナルデータベースは数学の集合論と非常に密接に関わりを持ちます。リレーションや関数従属性の定義をして、正規化というものを数学的に捉え直してみました。
    おそらく、第1正規化 ~ 第5正規化の定義を確認しようと検索してみて、簡単にアクセスできる位置にある情報は、かなり曖昧で意味が不定なものか、間違ったものだと思います。一度は数学的に定められた厳密な正規性を勉強してみてもいいかなと思い、取り上げてみました。
    参考:増永良文『リレーショナルデータベース入門』
       RDB の数学的な扱いが書かれていて、非常に分かり易く面白いです。

  • React によるコンポーネントの考え方
    UI コンポーネントのアイデアは多くの場面で出会います。Flutter や Vue.js など。
    この回では、React を使用して、UIコンポーネントの考え方や、状態管理の仕方や、ライフサイクルや、React における関数フックについて勉強しました。
    再利用可能なシンプルな部品を作り、それを組み合わせて新たな部品を作り、できた部品を使ってまた新たな部品を作り、といったモジュール性は、技術の勉強をしていると、至ることろで重要になる考え方です。

  • GLSL の紹介
    普段生活をしていると、多くのグラデーションを目にします。朝焼けの空、紅葉していく木々、湖の深度による濃淡、蝋燭の火。
    このようなグラデーションは、僕の感覚ですが、適当に生成したグラデーションと比べて遥かに美しいなと感じます。
    そもそも美しい色の遷移とは、どの色からどの色への移動で、それはどの程度の速さなんでしょう?まずは様々なグラデーションを作成して実験だ!ということで、GLSL を勉強してシェーダーコーディングにより、様々なグラデーションを生成してみました。
    この回では GLSL の解説と、GPU による処理を想定したコーディングはなかなか慣れなくて難しいという話をしました。他にも、世の中にある、美しい形をできるだけ低コストで再現することにも興味があり、フロント側のデザインを考える時に役に立たないかなあと思っていました!
    参考:巴山竜来『リアルタイムグラフィックスの数学』
       大学の頃に、いつ使うんだよ、と思いながら習ったエルミート補完などの話ができて嬉しかったです。

  • CI/CD の紹介
    3年目のM.Aさんが発表してくれました!🪅
    CI/CDとは、開発においてテスト、ビルド、リリースなどを自動化する手法で、システム統合を迅速に行い不具合を早期に発見するために用いられます。現在では多くのシステムでCI/CDが導入されていますが、その中でもCI/CDツールの一つとしてAWSのCode4兄弟を構成例を含めて紹介してくれました!
    Code4兄弟には、バージョン管理のCodeCommit、テストやビルドなどのコマンドを実行するCodeBuild、複数のデプロイ先を指定できるCodeDeploy、それらを組み合わせて自動化するCodePipelineがあります。サーバーを自分で用意する必要がなく、ミドルウェアの管理なども不要です。また、ビルド処理は並列処理されるため、大規模開発でも迅速に開発を進めることができるかと思いました。AWSの他のサービスとも簡単に統合できるため、AWSを利用しているシステムではCode4兄弟を活用することを特におすすめします。

  • MIPS の命令セットアーキテクチャの紹介
    MIPS の命令セットアーキテクチャRISC アーキテクチャとして代表的なものの1つであり、勉強するには最適だなと思い、MIPS の命令のいくつかを扱いました。
    この回で、簡単な MIPS機械語アセンブリが読めるようになりました。嬉しい!🤖
    参考:所真理雄『岩波講座 ソフトウェア科学 1 計算システム入門』
       CPU アーキテクチャの基礎的な部分の勉強で参考にしました。
    参考:David Patterson, John Hennessy, 成田 光彰 (翻訳)『コンピュータの構成と設計 MIPS Edition 第6版 上』
       MIPS の命令セットの勉強で参考にしました。

  • ChatGPT, Github Copilot X, Mozilla:ai などの紹介
    最近、人工知能関連の話題がつきません。
    この回の先々週から当日にかけて、GPT-4 や Github Copilot X や Mozilla:ai などのアナウンスがありました。このあたりの情報はなるべく追っていった方が良いなと考えたので、この日は実際に ChatGPT を使用してみて、デモをしました。その方が一番とっつき易いので。

以上のような内容を勉強会で扱ってきました!もっと色々な話題があったような気がしますが、パッと思いつくのはこの辺りです。

他にもコンパイラの仕組み、Rust による WebAssembly の生成、多様体学習入門、色彩学とカラーデザイン、ChatGPT を使った語学学習、パケット解析、CMOS の動作原理から始める CPU の内部、ガベージコレクションアルゴリズムPNG の仕様、MD5 の仕様と衝突の生成、などなど話したいことはたくさんあったのですが、1年間のリミットが来てしまったことと、15分で扱うにはしんどいという理由で話すことはできませんでした。残念。。。

多くのものに触れる機会を作ることができたので、とても良い経験でした!

 

最後に

1年目は、研修や実務などで、初めて触れる技術がたくさんあり、そしてそれらを勉強していくことはとても楽しかったです。

2年目は、世の中にどんな技術やツールが溢れているのか、浅くで良いので、できるだけ広く知りたいと考えていました。
この勉強会を通して、僕は知らないことだらけだということが強く実感できました。とても良かったです!
また、様々な方が参加してたことには、本当に感謝しかありません!自分一人では絶対にできないことでした。皆さんの協力のおかげで、1年間続けることができました!🙏

3年目は、自分が本当に好きと思えた分野を、深めて勉強できていけたら嬉しいなと思っています。今は、RDB の数学的理論やコンパイラの仕組み、多様体学習などのあたりに興味関心があります。数学に近い話題はやっぱり面白いですね。。。

 

というわけで、こんな感じのゆる〜い勉強会は一年間の活動を終えることができました!重ね重ねになりますが、協力してくれた方々、本当にありがとうございました。
さあ終わりです!御拝読ありがとうございました。😊

*1:Just the two of us 進行とも呼ばれています。検索してみると知っている曲が必ず見つかると思います。

Laravel9で環境構築4(コードを共有)

コードを共有

どーも、だーさんです。
前回からずいぶん時間が空いてしまいました。><
仕事やプライベートで忙しくなかなか時間とやる気がつくれず。。。 やっと次に進めたので記事を書かせてもらいます。環境構築最終章は作成した環境を人とシェアする方法です。

作成した環境をシェアしましょう。

まずは.envファイルを準備しましょう。環境構築1~3の過程で自動で.envが作成されています。人にシェアする場合にこの.envは各個人の環境で準備する必要があります。従って簡単に準備できるように自分の環境で自動で生成された.envファイルを.env.exampleとしてコピーしておきましょう。

cp ./.env ./.env.example

次に作成したディレクトリでGIT環境を構築しましょう。そして何かしらのコンテンツを利用して共有できるリポジトリを作成しましょう。(有名どころではGitHub等があります。)GIT環境の構築に関してはここでは省略させていただきます。

シェアしてもらったコードを受け取り新規に環境構築を行いましょう。

まずは必要な環境を用意しましょう。

前回までの環境を用意するのに必要なものは以下2点になります。各PC環境に合わせて準備をお願いします。

  • dockerをインストールしてください。
  • composerをインストールしてください。

次に、GITを使用してコードをcloneしてください。取得したdirectoryに移動しましょう。必要な手順は残り2つです。

.envファイルを作成しましょう。

cp ./.env.example ./.env

② 以下のコマンドをコピペで実行してください。

docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v $(pwd):/var/www/html \
    -w /var/www/html \
    laravelsail/php81-composer:latest \
    composer install --ignore-platform-reqs

さあ、環境は整いました。サーバーを立ち上げましょう。(sailコマンドについては環境構築1の記事より「sailコマンドの省略化」で省略できます。)

./vendor/bin/sail up -d

ブラウザからlocalhostでアクセスできたら大成功ですっ!!

まとめ

Laravel9を用いて簡単に環境構築できる手順をご紹介しました。いかがだったでしょうか? 私個人としては環境構築がこんなに簡単にできたことに驚きました。 自分で色々カスタマイズを行いたい人もいると思いますが、私のように作成したいものがあるのに自分では環境が作れない、と言うタイプのエンジニアにとってはとってもありがたい機能だと思います。また、経験の浅さからとっかかりがない、と言うタイプの人にもはじめの一歩としておすすめなのかなと思っています。まだまだ勉強不足が否めませんが、会社の方達の援助もあり少しずつですが自分の成長を実感する日々です。また、こうしてブログを書くことでやりっぱなしにならずに頑張れています。 私と同じく足踏みしている方々がいたら一緒に成長して行けたら嬉しいです。

最後までお付き合いいただきありがとうございました。 また、どこかで会えますように。

バックナンバーはこちら

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

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

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

参考文献

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

PAGE TOP