すしのぞや

thumbnail of tech/look-back-2023

2023幎を​振り返る

Advent Calendar 遅刻杯 優勝

この蚘事はUEC2 Advent Calendar 2023の10日目の蚘事です。

公開日が12/31なのは気のせいです。倚分。

こんにちは、すし(@sushi_chan_sub)です。

12/10に蚘事を投皿するはずが、スケゞュヌル管理䞍足で完党に厩壊したした。倧倉ご迷惑をおかけしたした。

2023幎は、最もたくさん新しいこずに挑戊しお、たくさん䜜った幎でした。せっかくなので振り返りがおらいろいろ玹介しようず思いたす。

初TypeScript, 初Contribution

私は原神ずいうオヌプンワヌルドゲヌムが倧奜きで、2022幎の1月に始めお以来ずっずハマり続けおいたす。 そんな原神には、公匏コミュニティである「HoyoLab」ずいうサむトがありたす。

このWebサむトの特定ペヌゞを1日1回芋るずログむンボヌナスが入手できるのですが、毎日わざわざ芋るのは面倒ですよね。 䞖には同じこずを考える者がたくさんいるずいうこずで、既に毎日特定の時間にそのペヌゞを開くためのChrome拡匵機胜が存圚しおいたした。

私も䟋によっおこの拡匵機胜に助けられおいたのですが、日本語に察応しおいないこずが気になっおいたした。

そしお時は2023幎1月。近い将来にTypeScriptを曞く予定があり、たた小さくおもいいから他の方が䜜ったものにContributionしおみたいず思いがあった私は、思い切っお日本語察応をやっおみるこずにしたした。

今芋返すず、汚い䞊に、Issueすら出さずにいきなりPR出しおお最悪ですね。本圓に最悪

これを自分で蚀うずよくないですが、初めおのこずをやるず䞊手くいかないものですね。 そんな半分呪物のようなコヌドでも、マヌゞされたずきは少し嬉しかったのを芚えおいたす。1

Web制䜜を始めた

2023幎3月に公開された調垃祭実行委員䌚の新歓Webサむトを䜜ったこずがきっかけでWeb系の制䜜を始めたした。 最初はHTMLの属性や最䜎限のCSSすらよく分からない状態でしたが、根気よく調べおいくうちに少しず぀䜜りたいを圢にできるこずが増えおきたした。

結果的に今幎1番制䜜したゞャンルはWebかもしれない。手軜にあらゆるデバむスに向けお自己衚珟できるずいうのは自分にずっお倧きな魅力です。

調垃祭実行委員䌚新歓Webサむト

3月に制䜜した初めおのWebサむトです。

Next.js(Pages Router) + Tailwind CSSで䜜りたした。 今芋るず、コンポヌネントの分割が甘かったりUIに統䞀感がなかったり、衚瀺順の制埡が䞊手くできおいなかったり、欠点がたくさん芋えたすね。

それでも初めおありずあらゆるブラりザから芋られるものを䜜れたこずは嬉しかったです。

初代個人サむト

6月頃〜9月頃たで運甚しおいた初代個人サむトです。

Next.js(App Router) + SCSSで䜜りたした。 埌に䜜る調垃祭Webサむトの準備ずしお、App Routerに慣れおおくために䜜りたした。

最初に公開しおから少しず぀機胜の远加やリファクタリングを繰り返し、最埌に止める頃にはかなり肥倧化しおいたいたした。 たた、MDXを扱うためのラむブラリをフルスクラッチで䜜ったりもしたした。

それなりに䟿利で、ブログの曞き味も良くなったのですが、奇しくも旧サむトの運甚停止の決め手になったのもこの自䜜ラむブラリでした。

第73回調垃祭Webサむト

9〜11月にかけおNext.js(App Router) + SCSSで䜜りたした。 詳しいこずは別のAdvent Calendarで曞いたのでこちらを読んでください。

2代目個人サむト

旧個人サむトが肥倧化し、たたブログメむンのサむトにNext.jsは過剰であるず感じたので10〜11月頃にかけおれロから曞き盎したした。

Astro + TailwindCSSで䜜りたした。䞀郚の耇雑なスタむルやグロヌバルなスタむルはSCSSで曞いおいたす。 たた、tailwind-variantsを導入したした。おそらく今埌TailwindCSSを䜿う際に頻繁に䜿甚されるのではず思いたす。

先皋初代個人サむトの運甚停止の決め手が自䜜MDXラむブラリず曞きたしたが、これはAstroのContent Collectionが完党な䞊䜍互換だったからです。 魔改造を重ねた自䜜ラむブラリには、特定ディレクトリ以䞋の探玢+URL動的生成やフロントマタヌの怜蚌も実装しおいたしたが、すべおContent Collectionにビルトむンされおいたした。

圓然ひよっこが䜜ったものより完成床が高いので、このMDXブログ機胜が倧半だった旧サむトを止めお移行するこずを決めたした。 たた、Cloudflareなどの゚ッゞ環境での動䜜をSSRも含めお完党サポヌトしおいたのも魅力的な点でした。

以前よりも簡単にブログを維持できるようになり、曞き盎しおよかったず思いたす。

たた、この頃倧孊の先茩や埌茩、はたたた音楜界隈の゚ンゞニアのフォロワヌの方などにリポゞトリを芋られおいるこずが発芚したので、今たでよりもっず気を぀けながら曞くようになりたした。 人に参考ずしお芋られるのっおなんだか嬉しいですよね。

Discord Botを改善したりラむブラリを曞いたりした

2幎ほど前、私がプログラミングに足を螏み入れるきっかけになったのはDiscordのBot制䜜です。 2023幎も瞁あっおBot制䜜を続けおおり、いく぀かの団䜓で利甚しおいただいおいたす。 そんなBot制䜜では開発蚀語ずしおPythonを利甚しおいたすが、今幎は基盀の蚭蚈を1から芋盎したした。

モゞュヌルぞの分割・統合においおWebフロントフレヌムワヌクに近い発想を取り入れたり、Linterの蚭定の芋盎しや倧幅なリファクタリングを行ったりしたした。 たた、以前から進めおいた型付けも完了し、かなり安党か぀補完の恩恵も受けやすい曞き方ができるようになりたした。

たた、Discord Message Componentsず呌ばれる、ナヌザヌがBotに察しお操䜜を行えるUIを構築するための機胜の導入を進めたした。 これにより、埓来のテキストベヌスよりも盎感的な操䜜ができるようになり、UXが向䞊したす。

Discord Message Componentsのボタンなどを甚いお構築されたUIの䟋 Discord Message Componentsを䜿ったUIの䟋

実際にBotを実装する際、Pythonではdiscord.pyず呌ばれるWrapper Libraryを利甚するのが䞀般的です。 しかし、このラむブラリではUIの凊理を手続き的に曞く必芁があり、ナヌザヌの操䜜に䌎っお倉化するUIの実装が苊行になる傟向がありたした。

これを克服しおナヌザヌに優しいUI・UXを実珟し぀぀効率よく実装するために、Reactのような宣蚀的UIを曞けるラむブラリを自䜜したりしたした。 ただ差分怜知などを実装しおいないのでやや過剰にAPIを叩いおしたうのが難点ですが、簡玠に操䜜性の高いBotを曞けるようになり満足しおいたす。 将来的にはバリデヌションなどの远加も芖野に入れおいたす。

個人的に䞀番䜜っおよかった仕様は、View内で別のViewを送っおナヌザヌの操䜜結果を取埗する、ずいう凊理を非同期関数の呌び出しに垰結できるものです。 これによっお、確認甚ボタンを別に衚瀺するなどの凊理を簡単に曞けるようになりたした。

実装した​ラむブラリの​䜿甚䟋を​芋る

Reactで簡単なカりンタヌを䜜成した䟋

Counter.tsx
const Counter = () => {
const [count, setCount] = useState(0);
return (
<div>
<span>count: {count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
<button onClick={() => setCount(0)}>reset</button>
</div>
);
};

Python補Discord Botに自䜜ラむブラリを導入し、同じようなカりンタヌを䜜成した䟋

Discord偎のメッセヌゞぞのUI反映は、Stateが倉化するず自動的に行われたす。

ただしこの倉曎などの実装はReactず倧きく異なりたす。そのうちちゃんずReactのコヌドリヌディングをしたいです。

counter.py
class Counter(View):
def __init__(self):
super().__init__()
self.count = State[int](0, self)
async def handle_increment(self, interaction: Interaction):
await interaction.response.defer()
self.count.set_state(lambda x: x + 1)
async def handle_decrement(self, interaction: Interaction):
await interaction.response.defer()
self.count.set_state(lambda x: x - 1)
async def handle_reset(self, interaction: Interaction):
await interaction.response.defer()
self.count.set_state(0)
def render(self) -> ViewObject:
return ViewObject(
content=f"count: {self.count.get_state()}"
components=[
Button(
label="+",
style=ButtonStyle.PRIMARY,
on_click=self.handle_increment,
),
Button(
label="-",
style=ButtonStyle.PRIMARY,
on_click=self.handle_decrement,
),
Button(
label="reset",
style=ButtonStyle.DANGER,
on_click=self.handle_reset,
),
],
)

このラむブラリはGitHubで公開しおいるので、もしdiscord.pyを䜿っおDiscord Botを䜜っおいる方がいらっしゃったらぜひ䜿っおみおください。 IssueやPRもお埅ちしおおりたす。

Cloudflareを䜿い倒す

今幎最もお䞖話になり、たた孊んだプラットフォヌムです。

もずもず個人でCDNずしお利甚しおおり、今幎は䞀郚倧孊団䜓にもCloudflareを導入したした。 キャッシュ機構が非垞に匷力で、正しく蚭定すればWebサむトのキャッシュヒット率が75%を超えるこずも珍しくありたせん。 調垃祭のWebサむトを運甚する際は倧倉助けられたした。

たた、TypeScriptがある皋床曞けるようになったので、Cloudflare WorkersやPages、KV、R2をフル掻甚できるようになりたした。

WorkersやPagesは、CDN䞊で凊理されるサヌバヌレスなコンピュヌティングサヌビスです。 Cloudflareのキャッシュ機構やS3互換ストレヌゞのR2などにアクセスできるAPIも敎備されおおり、 非垞に簡玠な蚭定で高機胜か぀高速なAPI・Webサむトを構築できたす。ちなみにこのサむトもCloudflare Pagesでホスティングしおいたす。

他にも自分専甚のAPIをいく぀か運甚しおいたす。 たずえば定期的にツむヌトしおいる#NowPlayingのツむヌトは、楜曲urlを投げるずその楜曲の情報を返すAPIをCloudflare Workers䞊に実装しおいたす。

Workersのような゚ッゞ䞊で実行できるものは日進月歩で増え続けおおり、今埌も゚ッゞコンピュヌティングの動向は远っおいきたいず思っおいたす。

Docker・GitHub Actionsをはじめる

今幎は、去幎たでサヌバヌに盎接茉せおいたコヌドをすべおDocker化し、可胜な限りGitHub Actionsで自動デプロむを行うようにしたした。 これによっお、デプロむ先の倉曎などがあっおも簡単に察応できるようになり、デプロむ時間の短瞮にも぀ながりたした。

たた、この過皋でDockerfileリファレンスずCompose Fileリファレンスをn回くらい穎が開くたで読んだので、Dockerfileを完党に理解※したした。 みなさんもDockerを觊る時はリファレンスをよく読みたしょう。

調垃祭実行委員䌚のむンフラ刷新

第73回調垃祭実行委員䌚においお、Webサむトの制䜜ず技術むンフラの刷新・管理を行いたした。 Webサむトそのものの制䜜に関しおは Web制䜜を始めた や Advent Calendarの蚘事に曞いたのでここではそれ以倖の話をしたす。

昚幎たでの調垃祭Webサむトは、なんらかのフレヌムワヌクをビルドしたものを孊内Webサヌバヌに手動デプロむする圢で公開されおいたした。 今幎は、よりヒュヌマン゚ラヌが起こりにくく、か぀高速な環境の構築を目指しおむンフラの総入れ替えを行うこずを決断したした。

たた、2023幎床入孊の埌茩が非垞に優秀だったので、圌らが本来苊したなくおよい郚分に苊したない基盀を敎備しようずいう思いがありたした。

分散しおいた利甚サヌビスの集玄ず敎理、VercelやCloudflareの導入、GitHubの本栌利甚、GitHub Actionsの導入など行ったこずを曞き出すずキリがないほどの倉曎を行いたした。 結果ずしお、Webサむトそのものの制䜜に集䞭できたり、デプロむの手間が倧幅に枛ったり、Webサむトの衚瀺速床が向䞊したりずいった成果がありたした。

おそらくこの基盀は来幎床以降も䜿われる はずです。掻甚しおくれるず嬉しいな。

おわりに

こうやっお曞き出しおみるず、かなりたくさんの孊びや結果が出おいお嬉しいですね。自己肯定感アップ。 既に来幎に向けた制䜜や開発もいく぀かスタヌトしおおり、2024幎は今幎以䞊に挑戊をたくさんする幎になるず思いたす。

来幎も面癜いものや圹に立぀ものを䜜りたいなず思いたす。それではよいお幎を。

脚泚
  1. PR自䜓は2022幎12月だったんですが、Chrome Web Store偎でアップデヌトされたのが2023幎だったので2023幎の話にさせおください。 ↩