技術系

ボブおじさんが推しているクリーンテスト

この記事は Calendar for 東京電機大学 | Advent Calendar 2022 - Qiita の2日目です。 昨日は、 OSSにコントリビュートしたのとzodのすゝめ - blog.cateiru.com でした。ぜひ観てください。 この記事はClean Codeのメモです。詳しくは読んで下さい。 Clean …

OSSにコントリビュートしたのとzodのすゝめ

この記事は、 Calendar for 東京電機大学 | Advent Calendar 2022 - Qiita の1日目です。 皆さん、OSS活動していますか?私は、最近、ealush/emoji-picker-react: React Emoji Picker に対してバグ修正のPRを投げました。 github.com この記事では、このバグ…

ポートフォリオサイトを更新しました

私のポートフォリオ(?)サイトである cateiru.com をアップデートしました。 アップデート内容箇条書き 管理者ページからすべての情報を変更できるように変更 お問い合わせを送信すると、Discrod、Slack、メールに通知できるように 制作物の詳細を別ページ…

【Go】mysql.Configを使用してソケット接続のDSNを書く

目的 GCPのCloud RunからCloud SQLに接続するためにはソケット接続する必要がある。 SQLのDSNは直書きではなくmysql.Configで定義したい。 TL;DR config := mysql.Config{ DBName: "[database name]", User: "[user]", Passwd: "[password]", Addr: "[unix s…

【Go】GoでClient Hintsを扱う

GoのClient Hintsパーサを書いたので使い方メモ github.com インストール 使い方 例 技術的な話 バグ報告など リンク GitHub ドキュメント インストール go get github.com/cateiru/go-client-hints/v2 使い方 goclienthints.Parse(&r.Header)のようにして引…

【Go】entでスキーマファイルを出力する

TL;DR entには全体のスキーマを出力する機能はない 空のデータベースに対してマイグレーションDiffを作成して.sqlファイルに出力する ctx := context.Background() db, err := ent.Open("mysql", "docker:docker@tcp(localhost:3306)/em?parseTime=True") if…

はてなブログで見出しをクリックするとリンクをコピーできるスクリプトを作った

2022年の7月に、はてなブログのアップデートで全ての見出しにid属性が付与されるようになりました。 staff.hatenablog.com もともとは、見出しのid属性は目次をつけたときしか付与されていませんでしたが今回全てに付与されるようになったことでどの記事でも…

ufwでアクセスをtailscaleのinterfaceのみに変更する

自宅でNAS兼、検証機としてUbuntuを運用しているが、公開LANなどを使用していて接続はtalscale経由でVPN貼っているものしかつなげたくないという場合の備忘録です。 TL;DR ufwのallowでfromを100.64.0.0/10にする。 動機 賃貸物件で「インターネット無料」と…

OpenEEWの仕組みを理解する

OpenEEWというものを知っていますか? OpenEEWはオープンソースで開発されているEEW(緊急地震速報)システムです。 これを使用することで、日本のように地震警報システムを持たない国でもユーザが地震感知デバイスを自宅に設置することEEWを出せるようにな…

ORMライブラリを使うときの特殊なマイグレーション施策

皆さん、ORMライブラリは使っていますか?私は、最近Goでentを使ったアプリケーションを開発しています。 そこで、SQLのマイグレーション方法についてSQLサーバーが特殊であるため簡単にできなかったため備忘録として残そうかと思います。 環境 プログラミン…

【懺悔】ミスってPi OSのリポジトリにPRを作成してしまった

TL;DR 研究で、Raspberry Pi OSのカーネルに別の変更*1をマージした 脳死でPRを作成したらフォーク元のraspberrypi/linuxのブランチにPRを作成してしまった github.com 謝罪 ほんとうに申し訳ないと思っている。すまん どうすれば良かったのか PRを作成しな…

タイムライン実装するのって意外と難しいよねって話

最近、大学のプロジェクト個人的な趣味でWebアプリを作っています。どういうものかというと、「行ってみたいのに一人で行く勇気が持てない」お店に一緒に行ってくれる人を探せるサービスです。 そのなかで、ホームのページを作成する際Twitterのようなタイム…

GitHubのメールは開封チェックを行っていて、開封すると通知が既読になる

GitHubヘビーユーザーなら気づいたことはあると思うが、通知メールを開くをGitHub側の通知が既読になる。 これ、疑問に思ったことは無いだろうか。この記事ではどういう方法で開封チェックを行っているのかを見ようと思います。 TL; DR imgタグで1x1 pixelの…

nodeのargon2パッケージはAlpineで実行するとSIGSEGVエラーになる問題

7/20 追記 原因は、ビルド時と実行時のnodeのバージョンが違うことで発生する問題のようでした。 ビルド済みバイナリでは、node14でビルドしており実行は16の場合に問題を再現することができました。 解決策は、ビルド済みバイナリは使用せずにソースから直…

Cloud StorageのFake Serverをdocker-composeで実行する

Cloud Storage*1使っていますか? 私は最近、画像の保存場所によく使っています。 最近使ったものだと、大学のプロジェクトで作っているWebアプリのユーザアバターを保存する場所として使っています。 github.com さて、このCloud Storageですがテストを書い…

MySQLのテーブルをGitHubリポジトリで操作する

最近、趣味アプリ用にCloudSQLでSQLのサーバを作成しました。 そこで、SQLのマイグレーションを自動化するべくGitHubのリポジトリで操作しようと思います。 以下の記事を参考にしました。 blog.fukkatsuso.com 作成したリポジトリは以下です。 github.com Cl…

ぼくがかんがえたさいきょうのプログラミング言語べんきょーほうほう

エンジニアは新しいものが好きである*1。そのため、新しいものを使うために新しい言語を習得するということは日常茶飯事である。 このブログでは私が新しくプログラミング言語を勉強する際に実施している勉強法を書く。 TL;DR 公式のドキュメントを眺める 他…

備忘録: TypescriptでのRecoilとLocalStorage接続

recoiljs.org const localStorageEffect = <T>(key: string): AtomEffect<T> => ({setSelf, onSet}) => { if (process.browser) { const savedValue = localStorage.getItem(key); if (savedValue !== null) { setSelf(JSON.parse(savedValue)); } onSet((newValue</t></t>…

待ち合わせがスムーズになるWebアプリを作った

find.cateiru.com どういうもの? 相手の位置が矢印と距離で表示します。 Waaaaay!のWebアプリ版と思ってもらえればイメージしやすいと思います。 Androidは動作未確認です。多分うまく動かなさそうです。 使い方 待ち合わせを作成を押して新しく待ち合わせ…

寝る前の30分でSambaで管理しているNASをVPNから接続できるようにする

TL;DR Tailscaleを使用すると数分でVPNを構築可能 前提条件 Sambaがインストールされており、ローカル上でNASとしてすでに機能しているPC やり方 1. Tailscaleを使用してVPNを構築する これは、簡単です。Tailscaleにアクセスしてアカウントを作成します。そ…

Goのテストカバレッジ上げるのって難しくね?

Goのアプリケーションで、CodeCov使ってテストカバレッジとっているのだがカバレッジ上げるのにすごく大変なのでメモと言うか愚痴というか。 Goではエラーはタプルの返り値で帰ってきてnil判定で判別します。 このように: hoge, err := sameHandle() if err …

GoでFormFileがあるHandlerのテストを書く

はじめに Goで、FormFileがあり画像ファイルを読み込むHandlerを書いたがテストでハマってしまったので備忘録として書く。 TL;DR writer.Close()にdeferはつけない 本文 func HogeHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseMulti…

Webアプリのログイン情報保存について

Webアプリケーションでログイン処理を作る際、ログイン情報の保存は必要となる。しかし、どのようにして保存するのか方法が沢山あるため個人的な備忘録としてまとめたい。 この記事はid:cateiruの薄い知識の上に成り立っているため間違えている箇所があれば…