中学生頃

プログラミングとの出会い
プログラミングに初めて出会ったのは中学生の頃です。
数学の教科書の巻末付録にプログラミングが紹介されており、そこで興味を持ちました。
特に授業で触れられることは無かったので、家のパソコンを使って教科書に載っているプログラムを打ち込み、実行して勝手に遊んでいました。簡単な四則演算を行う程度のプログラムだった気がします。
言語はBASIC言語というかなり古いもので書かれていました。廃れて久しい言語だそうですが、かつて初心者用に開発されたということもあり、条件分岐や繰り返しといったプログラミングの基礎をここで学べた気がします。

高校入学

Javaの学習
高校に入学して、何か新しいことを始めたかったので、プログラミングを本格的に学ぶことにしました。
言語はJavaを選びました。Minecraftなどのゲームでロゴを見かけたから、という単純な理由だった気がします。
学習には図書館で借りてきた入門書を利用していました。
初心者の段階でJavaを選んでしまったばかりに、オブジェクト指向の概念の理解にかなり苦しむことになりました。例の呪文(public static void main(String[] args))を理解できるようになったのもずっと後のことです。(最近は書かなくても動くそうですが...。)


ゲーム作りに挑戦
一通り学習を終えた後、実践のために何かゲームを作ろうと思い立ちました。
作ったのは、昔のRPGのマップ画面のようなものです。二次元配列のマップをもとに草や壁のドット絵を画面に表示し、その上でキャラクターをキー入力で動かすという単純なものでした。
ウィンドウやパネルといったGUIの実装には、Java Swing(Javaで提供されているGUIコンポーネント)を使用していました。
試しに作ってみただけということもあり、マップ画面を作ったところでゲーム作りは早々にやめてしまいました。


Androidアプリの制作
ゲーム作りに労力がかかることがわかり、もう少し簡単に作れるものを探していたところ、ちょうどAndroidアプリがJavaで書けると知ったので作ってみることにしました。(当時はJavaでしたが、その後、Kotlinが開発言語として正式に採用されたそうです。)
実用性も考えて、自分の英語学習用のクイズアプリを作りました。メイン画面にリストを配置し、そのうちの1つをクリックすると、出題画面に遷移するという構成です。動的リストのため、問題データのテキストファイルを追加するとリストの項目も増えるようになっています。
(残っていたプロジェクトファイルを、最新版のAndroid Studioで何とかビルドしたものです。Githubにも上げています。↓)
複数のアクティビティを利用した画面遷移や、インテントを利用した値の受け渡しなどを実装していました。動作が思った通りにならず、アクティビティのライフサイクル(onCreate()等)についてかなり調べた覚えがあります。
開発環境にはAndroid Studioを使用していました。


Deep Learningの学習
AlphaGoが現役棋士に勝つなど、ちょうどAIが話題になっている時期だったので、流れに乗って技術書を買って学習しました。
Deep Learningの基礎であるニューラルネットワークとその学習手法をPythonを使ってゼロから実装していき、最終的に画像認識のための畳み込みニューラルネットワーク(CNN)を実装するという内容です。
ニューラルネットワークを学ぶには行列演算や偏微分の知識が必要になるはずなのですが、著者の方がかなり噛み砕いて説明してくれているため、高校数学の知識でも十分読み進めることができました。また、フレームワークを使わずに一から自分で実装するという構成なので、ニューラルネットワークの原理や学習を行う過程がより根本的に理解できたと感じます。
Pythonを使うのは初めてだったのですが、本書の冒頭で簡単な説明(numpyライブラリも含め)があったことや、Python自体が簡潔に書ける言語のため、比較的楽に習得できました。
ただ、GPUを持っておらず、ノートPCのCPUを使ってCNNに学習させていたため、学習が完了するまで半日以上かかっていました。


機械学習関連の学習
ニューラルネットワーク以外の機械学習にも興味が出たので、別の技術書を図書館で借りてきて、サンプルコードを実行しながら遊んでいました。
蟻のフェロモンの揮発を模した蟻コロニー最適化法や、生物の遺伝子を模した遺伝的アルゴリズムなど、実際の生物からヒントを得た機械学習アルゴリズムが特に興味深かったです。
ソースコードがC言語で書かれていたため、初めてCを学びました。ネット上の入門者向けサイトで基礎を一通りやったのですが、基本的な書き方を学んだのみで、ポインタや動的メモリ確保といった高度な内容についてはかなり曖昧なままでした。その後の大学での授業でようやく正確に理解できました。


Unityでゲーム作り
簡単にゲームを作れるということで、ゲームエンジンのUnityを使ってゲームを作って遊んだりもしていました。
と言っても、公式チュートリアルに載っていた3Dの玉転がしゲームや2Dシューティングゲームをチュートリアル通りに作っていた程度です。
Unityではスクリプトを書く際の言語としてC#が採用されているのですが、構文などがJavaと似ていたので何とか使うことができました。


3Dモデル試作
プログラミングとは直接関係ないですが、大学受験から解放された後、Blenderで初めて3Dモデルを作りました。

大学入学

Deep Learningの学習②
高校の頃に読んだDeep Learningの本の第2弾が出ていたので、早速購入しました。
第1弾が画像認識だったのに対し、第2弾では自然言語処理がテーマになっていました。時系列データを扱うリカレントニューラルネットワーク(RNN)を第1弾同様、Pythonを使ってゼロから実装していくという内容です。単語をベクトルで表現する分散表現やWord2vec、それらを使ったRNNによる文章生成を学ぶことができました。
ただ、近年話題になっているGPTなどの大規模言語モデルはRNNの弱点を克服したTransformer(本書でも少し触れられています)という技術を使用しているそうなので、RNNは少し時代遅れになっているのかもしれません。



電子図書でWebサイトの基礎を学習
大学が契約している電子書籍サイトで本が無料で読めることを知ったので、興味のある技術書をかじり読みしていました。
Webサイトに関する技術を知りたいとぼんやりと思っていたので、HTML・CSSの入門書やWebスクレイピングに関する本に触れました。専門的な部分を最後まで読み込むということはなかったですが、HTMLタグやCSSセレクタの書き方などの基本的な部分は知ることができました。
Webスクレイピングは、PythonのrequestsやBeautifulSoupといったライブラリを使って行えることを学びました。当初はサイトから画像を一括ダウンロードするような趣味での用途で使ってみた程度でしたが、後に文章生成モデルの開発をする際にコーパスの収集にも応用できました。


個人ブログ制作
HTMLやCSSの知識を得たので、ずっと作ってみたかった個人ブログを制作しました。

Webサイトを作る場合、WordPressやWixといったローコード・ノーコードツールを使った方が簡単に作れると思うのですが、HTMLやCSSの学習を実践したいという目的もあったため自分で一から作ることに決めました。(結果的にですが、レンタルサーバーを借りる際にWordPress使用不可の最安値プランを使うことができました。)
当初はHTMLとCSSだけを使って作ろうと考えていたのですが、ヘッダーやサイドバーといった共通部分をPHPでインクルード化できるということを知ったので、PHPも使用することにしました。その流れで、データベースからの記事データの取得と表示もPHPによって実装しました。これにより、最新記事の表示やタグ分類などブログらしい動的な機能を付けることができました。(PHPに関しては、ネット上で必要な機能だけを調べて実装するという付け焼き刃的な知識です。)
データベースはレンタルサーバーの制約もあり、SQLiteを使用しました。
専らプログラミングに関する記事を上げており、現在は技術ブログのような感じになっています。アウトプット先があることで自分の学習のモチベーションになるというのももちろんですが、これまでプログラミングの学習やバグの解決の際にネット上の記事にかなりお世話になってきているので、自分でも何か発信しなければという勝手な義務感も動機の一つです。とは言え趣味でやっているので、更新は滞りがちです。
たまに機能を追加したりしていますが、画像の最適化や記事一覧のページネーションなどアップデートしたい要素がまだまだ存在している状況です。


太宰治風文章生成モデルの開発
RNN(リカレントニューラルネットワーク)を使って、太宰治風の文章を生成する言語モデルの開発に挑戦しました。

これまでのDeep Learningの学習でニューラルネットワークによる自然言語処理の知識を得たので、せっかくなので自分でも何かを作ってみようと思ったのがきっかけです。自動翻訳や文章変換なども考えましたが、学習データの集めやすさや結果の面白さを考えて文章生成モデルを作ることにしました。(生成結果も含む開発過程はブログで紹介しています。ソースコードもGithubに上げています。)
訓練データには青空文庫にある太宰治の小説を使用しました。Webスクレイピングで取得できる上、著作権がなく、全ての小説を使えばある程度の量になるので訓練データとして理想的でした。("太宰治風"と銘打ったのもそのためです。)
また、学習に使用した本ではゼロからRNNを実装していましたが、自分でモデルを実装するにあたり、著名な機械学習ライブラリであるPyTorchを使用することにしました。ライブラリを使った方が実装を効率化できることや、有名なライブラリの使い方についても学びたかったというのが理由です。
モデルの設計は書籍で学んだRNNの設計を参考にしたのですが、そのまま実装してもつまらないため、本の中で紹介されていた学習テクニック(中間層の多層化、Dropoutの導入)を使って少し改良したりしました。その他、形態素解析にSudachiを使ったり単語ベクトルとしてchiVeを使ったりと、色々自分なりに工夫してみました。
結果、完成はしましたが文章生成の精度としては微妙な結果でした。太宰らしさはかろうじてあるといった感じです。

CPUでの学習には膨大な時間がかかることがわかっていたため、学習の実行環境にはGPUを無料で利用できるGoogle Colaboratoryを使いました。


人工生命の学習
人工知能の他に、コンピュータ上で生命のふるまいを再現する人工生命という分野にも興味があったので、人工生命についての本も読んでみました。
反応拡散系やライフゲーム、ボイドモデルといったこれまでの人工生命研究のトピックについて広く浅く学べました。
「作って動かす」とタイトルについているのですが、実際に手を動かして実装する部分は結構少なかった印象です。

人工生命については昔、このサイトで知りました。

Gray-Scottモデルの可視化
人工生命の本で紹介されていた、反応拡散系の一種であるGray-Scottモデルというものが面白かったので、モデルのシミュレーションの様子を可視化できるプログラムを作りました。↓
反応拡散系は、複数の物質が相互に反応しながら空間を拡散していく過程を表した数理モデルです。物質の濃度が変化していく中で、動物の模様のような特徴的なパターンが形成されることが知られています。

本ではPythonで実装されていたのですが、サイト上で公開したかったため、JavaScriptとHTMLのCanvas要素を使って作ることにしました。
最初は標準のCanvas2Dを使って実装していたのですが(Gray-Scottモデル v1)、CPUで描画処理を行っているため描画がかなり重くなってしまいました。そのため、WebGLを使ってGPUによる描画処理を試みました。この辺りの経緯はブログに詳しく書いています。
WebGLを使うにあたって、入門サイトなどで浅く勉強しました。また、ピクセル単位での描画を行うためにフラグメントシェーダを使う必要もあったため、シェーダ言語(GLSL)の書き方についても少し学びました。シェーダ言語にはもともと興味があったので、これを機会に手を出してみました。(とは言え、使ったのはこの時だけなので、いまだ十分な理解にはほど遠い状態です。)
ソースコードはGithubに上げています。


ノベルゲーム制作に挑戦
ストーリー重視のノベルゲームが好きだったので、自分でも制作に挑戦してみました。

ノベルゲームに特化した制作ツールは数多くあるのですが、自分で様々な機能を実装してみたかったこともあり、Unityで一から作ることにしました。
Unityでは、UIの作成やテキストボックスの機能(オート、スキップなど)の実装を行いました。また、シナリオテキスト内で背景のフェードインや効果音の再生を指定できるように、スクリプト付きのテキストを読み込んで実行する処理も独自に実装してみました。
着物の懐から、拾った貝を入れるための麻の袋を取り出し、再び岩場の下に戻っていく。太陽はまだ東の海上に照っており、綿のような雲が空を流れていた。##bgmFadeout##fadeout//##bgmFadein wave##fadein bg2期待していたような珍種の貝が見つかることはなく、見つかるのはいつもと同じような貝ばかりだった。プログラミングに加え、シナリオの執筆、イラストの制作、フリー音源集めなども一人で行っていました。実装が思ったより大変だったことや、やることが多かったこともあり、途中で制作が止まってしまいました。


疑似レンタルビデオシステム
Javaの授業の最終課題で、疑似的なレンタルビデオシステムを制作しました。
好きにチームを作って良いとのことだったので、同じ学部の方と3人で制作しました。チームで制作物を作ったのはこの時が初めてだと思います。
Java SwingによるGUIの実装だったので、高校の頃の経験が活用できました。具体的には、会員やビデオをクラスにしたり、操作画面をJPanelを継承したパネルクラスに分割したりといった、オブジェクト指向によるクラス設計を行いました。

複数人での開発だったので、それぞれの画面をメンバーで分担して実装するという方法を取りました。


コンピュータの基礎を学習
大学の授業で論理回路やアセンブリ言語について学び、コンピュータの仕組みそのものについて知りたくなったので、それらを通して学べる教本を買ってみました。
NAND回路から始まり、論理回路、加算器、CPU、機械語、コンパイラ、高水準言語という風に、下層から上層までを順に自分で組み上げていく構成になっています。これにより、プログラムが動くまでの流れを全体的に把握できるようになっています。
CPUやコンパイラ、高水準言語は独自に簡略化されたものであるため実用性は低いですが、一連の仕組みを大まかに学べたのは良かったです。


ARを利用したシューティングゲーム
実習として、与えられたテーマをもとに3~5人のチームでプログラミングをする授業がありました。
その内のテーマの1つが、UnityとVuforia(AR開発用ツール)を使ったARアプリケーションを作る課題です。企画について話し合った結果、ARシューティングゲームを作ることになりました。

Unityの使用経験があったため、シーン遷移やタッチによるボムの発射処理、アセットを利用した爆発エフェクトなど多くの部分を担当できました。他のメンバーは3Dモデルの作成や画面全体のエフェクトなどを担当してくれました。


AWSを利用した着席検知システム
クラウドコンピューティングというテーマで、AWSとセンサーを利用してサーバーレスのサービスを開発する課題もありました。
コロナの時期だったので、温度センサを利用した着席検知システムをチームで企画しました。座席に取り付けられた温度センサにより着席状況を把握し、その情報をサイト上の座席表にリアルタイムで反映するというシステムです。

特にこだわったのが、着席情報をサイト画面に反映する方法です。通常の方法だとユーザーがリロードするまで画面が更新されないため、WebSocketを使った双方向通信でリアルタイムに情報を反映することを提案しました。
AWSのWebSocket APIのチュートリアルを参考にしながら双方向通信の簡単なプロトタイプを作り、それを使ってメンバーに提案手法を説明しました。結果、採用されたので、WebSocket周辺の処理(データベースを利用した接続情報の管理など)を担当してチームに貢献することができました。



卒業研究
卒業研究のテーマには、強化学習を利用したAndroidアプリケーションのGUIテストの自動化を選びました。
機械学習やAndroidアプリといったこれまでの知識を応用できそうなテーマだったことが、選択の理由です。
先輩の研究を引き継いでいる部分もあったので、すでに出来上がっているAndroidエミュレータのコードに追加の機能を実装していくやり方で進めました。他の人が書いた完成済みのコードを読んで動作を理解し、変更していくという経験はこの時が初めてでした。
元のコードがPythonで書かれていたため、強化学習のための追加部分の実装はPythonで行いました。

卒業後

ブログに新要素追加
久々に趣味のプログラミングを再開し、ブログに新要素を追加しました。
一つは、「今月の名盤」というお気に入りの音楽アルバムを飾るスペースです。と言っても、CSSを使って鏡面反射を付けただけのシンプルな要素です。スタイルの付け方はブログで紹介しています。

もう一つは、「スケッチブック」という画像のギャラリー表示ができるページです。

画面の一部だけを非同期で更新するために、fetch関数によるJSONデータの取得とDOM要素の更新をJavaScriptで実装してみました。また、サーバーサイドでは、データベースの情報をJSONデータにして返す処理をPHPを利用して実装しました。こちらも詳細はブログにつづっています。


基本情報技術者試験対策
卒業から時間が空いて情報系の知識が曖昧になっていると感じたため、復習のために基本情報技術者試験を受けることにしました。特に、データ構造とアルゴリズムの復習のために、教本を買って、それを参考にしながら自分でアルゴリズムのコードを書いて学習しました。
競プロをはじめとしてアルゴリズムには苦手意識があるので、学習には割と時間がかかりましたが、ひとまず基礎の部分(ソート、二分木、重み付きグラフ等)は終わらせることができました。
また、コードがC++で書かれていたため、C++とその標準ライブラリ(STL)の勉強にもなりました。


React & Next.jsを学習
昨今のフロントエンド開発ではフレームワークを使った実装が主流だと聞いたので、モダンなフレームワークについて学んでみることにしました。
ReactやVue.js、Angularなどの選択肢がありましたが、特に人気が高いと言われているReactの学習を選択しました。
全くの初心者なので、入門書を買って一から学びました。Reactの基本的な使い方だけでなく、JavaScriptの便利な構文や、TypeScript、Next.jsといった関連技術にも触れられている良書でした。
書籍での学習に加えて、公式のチュートリアルもそれぞれ一通りやってみて感覚をつかみました。


ReactによるWebアプリ開発
せっかく学習したので、Reactを使ったWebアプリを作ってみることにしました。
Web APIを使ったデータ取得を試してみたかったことや、自分の趣味と絡めたかったこともあり、Spotify Web APIを使った音楽情報サイトを作ることにしました。
特に、APIを通じて提供されているSpotifyが分析した楽曲の特徴量(激しさ、アコースティックさなど)が面白いと思ったので、それらを表示したり、そこから自分の作ったマイリストの音楽傾向を分析出来たりするような機能を付けることを考えました。
現時点では、トラックやアルバムを検索して、それらの情報を表示する検索ページまでを作り終えています。(まだレスポンシブ対応していないのでPCでのアクセス推奨です。 )

基礎となる部分はできたので、ここから特徴量に基づいたおすすめの表示やマイリストの作成・公開機能などを追加していきたいです。また、サイトのデザインももう少し小綺麗にしたいと考えています。
