かおるノート

cordx56のブログです

2020年買ったものとその評価

こんにちは。 年末ですね。 皆様よいお年をお過ごしでしょうか。

今回の記事は、私が2020年に買ったものを振り返って買ってよかった度を付けていくものです。 皆様の来年のお買い物の参考になれば幸いです。

  • Corne cherry

買ってよかった度: ★★★★☆

自作キーボードです。 この自作キーボードはキー数が少ないのが特徴で、指の動きが少なくて済みます。 とてもいいキーボードで気に入っているのですが、独特すぎるキー配列の影響でいまだにミスタイプが減りません……

買ってよかった度: ★★☆☆☆

まだNintendo Switchがなかなか手に入りづらかった頃、適当にヨドバシの抽選に申し込んだら当たってしまい、購入したものです。 どうぶつの森は楽しかったですが、最近は飽きがきてあまりやっていません。

買ってよかった度: ★★★★☆

言わずと知れた高級モニターです。 特別定額給付金を利用して買いました。 作業環境がこれまでWQHD1枚とFullHD1枚の2枚だったのが、WQHD2枚とFullHD1枚の計3枚になりました。 やはりWQHDが2枚あると作業環境が快適ですね。

買ってよかった度: ★★☆☆☆

Arm64WindowsタブレットSurface Pro Xです。 20万出してこのスペックかぁというのは正直あって、買ってよかったかと言われるとびみょいというのが正直な感想です。

  • Ergohuman Fit Ottoman

買ってよかった度: ★★★★☆

高機能チェアです。 まだ買ったばかりなので何とも言えませんが、多少作業が楽になった気がします。

  • Oculus Quest 2

買ってよかった度: ★★★★☆

今流行りのVR機器です。 VRChatくらいしかやっていませんが、それでも買った価値があったなぁというくらいVRChatが楽しいです。 これからVRコンテンツを漁っていきたいとも思っています。 おすすめがあったら何か教えてください。

以上が2020年の大きな買い物でした。 こうしてみるとそんなにたくさんは大きな買い物をしてないですね…… もうちょっとあるかなと思ったのですが。

2020年も残りわずか1時間半となりました。 私は今年中に終わらせたかった研究の実装が終わっていなくてやばいです。 大丈夫かなぁ…… それでは皆様よいお年を。

Tweet generatorのバージョン0.2.0を公開しました。

実際のサービスはこちら

Tweet generatorの新バージョン公開と共に、ドメイン名も刷新して新たにサービスを公開し直しました。

github.com

本エントリーはリリースノート代わりに、今回刷新された点について書いていきたいと思います。

新機能

鍵アカウント保護機能

これまでは鍵アカウントで生成された学習済みモデルを鍵アカウントを知らない第三者が利用してテキストを生成することで鍵アカウントのツイート内容が推測されてしまうという問題がありました。

今回のアップデートで新機能として鍵アカウント保護機能が追加されました。

鍵アカウントでモデルを学習した場合に、データベースに鍵アカウントであることが記録され、当該アカウントのテキスト生成時にはTwitterアカウントでログインしているかをチェックします。 鍵アカウントのテキスト生成時に、鍵アカウントでログインしていない場合には上記画像のエラーメッセージが表示されます。 内部的には、ログイン機能が実装されたことになります。 モデル生成時に自動でログインをする仕組みになっています。

動的サムネイル画像生成

Twitter cardなどで利用されるサムネイル画像の動的生成に対応しました。

画像にあるように、リンクからアカウント名を抽出し、アカウント名を含む画像を生成しています。 これにより、どのアカウントの自動生成結果なのかがツイートからわかりにくい問題が解消されました。 内部的には、metaタグをNuxt.jsでSSRし、画像はDjango側でPillowを使って生成しています。

その他の改善点

細かい改善点です。

フロントエンドのデザインを微調整

フロントエンドのデザインを少し変えました。 例えば、従来オプションがオプションとわかりにくく、入力必須であるかのように見えていた問題を解消するため、オプションであることを明記しました。

データベース内部で保持するアカウント名が大文字小文字を維持して保存するようになった

これまではファイルベースで生成済みモデルを保持していたため、大文字小文字の区別を無くすために、内部的に全て小文字で管理していました。 今回データベースに移行するにあたり、内部的に大文字小文字を維持して保存しても、大文字小文字を区別せず検索できるようになりました。 以前はモデル生成時にリダイレクトされるリンク先はアカウント名が全て小文字になったものでしたが、この変更により大文字小文字を区別した状態でリダイレクトされるようになりました。

プログラムの話

今回のバージョンアップ計画では、これまで使っていたフレームワークを変える決断をしました。

まず、PythonバックエンドのフレームワークをFlaskからDjangoに変更した点です。 これは鍵アカウント保護機能において必要だったため変更しました。 勿論、Flaskでログインシステムを一から構築することも考えましたが、データベースの扱いやすさなども考慮した際に、Djangoを利用したほうが開発コストが低いという判断になりました。 自分がインターン先やサークルでDjangoを利用する機会が多く、Djangoの知見がたまっていたという背景もあります。

次に、これまでVue.jsを使っていたのをNuxt.jsに変更した点です。 インターン先の関係でReactとNext.jsの知見がたまっていたためそちらへの移行を最初に考えたのですが1、Vue.jsのソースコードが再利用できるNuxt.jsを利用する方向で落ち着きました。 フロントエンドでは、動的サムネイル画像生成のために、metaタグをクライアントサイドで変更せず、サーバサイドで生成する必要がありました。 そのため、Nuxt.jsでSSRをするという決断に至りました。

おわり

以上が今回のアップデートの概要になります。 これからも多くの方に愛されるサービスであるよう、改良を続けていきたいと考えています。 今後ともTweet generatorをどうぞよろしくおねがいします。

Tweet generatorについてはこちらの記事もご参照ください。

cordx56.hatenablog.com


  1. コミットログにNext.jsを使おうとして途中で諦めたログが残っています

Windows on Arm上のWSL2でArch Linux ARMを利用する

Windows on Armを搭載したSurface Pro XのWSL2でArch Linuxを利用することができました。

本記事はWSL にインストール - ArchWikiの手法を参考に書いています。

また、本記事はWindows Insider ProgramのDevチャネルを導入したSurface Pro Xをベースに書いています。 下の記事で書いている通り、現状WSL2はWindows Insider ProgramのDevチャネルを導入しないと使えないようなので、ご確認ください。

cordx56.hatenablog.com

手順

まずWSL2のUbuntuをインストールします。

次にwslコマンドのエクスポート機能を用いてUbuntuのtarファイルを取得します。

> wsl --export Ubuntu-20.04 ubuntu.tar

以下のサイトからArchLinuxARM-aarch64-latest.tar.gzをダウンロードしてきます。

archlinuxarm.org

私の環境ではWindows上ではうまく行かなかったので、ここから先はLinux上で処理をします。

まずダウンロードしたArchLinuxARM-aarch64-latest.tar.gzとエクスポートしたubuntu.tarを同一ディレクトリ下に配置して、以下のようにしてファイル操作をします。

# mkdir arch
# mkdir ubuntu
# bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C arch
# tar -xf ubuntu.tar -C ubuntu
# cd ubuntu
# rm -rf bin etc lib sbin usr var
# cp -a ../arch/etc ./
# cp -a ../arch/usr ./
# cp -a ../arch/var ./
# cp -a ../arch/bin ./
# cp -a ../arch/lib ./
# cp -a ../arch/sbin ./
# tar -cf Arch.tar *

最後に、完成したArch.tarをwslコマンドでインポートします。

> wsl --import Arch .\ Arch.tar

インストール場所(引数の.\)はいい感じに指定してください。

以下のコマンドでインストール完了です。

> wsl -d Arch
# pacman-key --init
# pacman-key --populate archlinuxarm
# pacman -Syyu base base-devel

まとめ

今回はArch LinuxWindows on Armの動作するSurface Pro XのWSL2上に構築しました。 現状、快適に利用することができています。

Windows on Armはまだ未知数なところが多いですが、これからもWindows on Armについて追っていきたいと思います。

Surface Pro Xを買いました。

こんにちは。

Windows on Armの機運が高まったのでSurface Pro Xを買ってしまいました。 機運が高まったってなんだ?

使えるアプリケーション

このページを読んでいる方には釈迦に説法かもしれませんが、今のところArm版Windowsではx64アプリケーションは動作しません。 将来的にはx64アプリケーションもエミュレーションで動作するようになる予定です。

blogs.windows.com

上のブログによると11月にロールアウトされるWindows Insider Programでx64エミュレーションが利用可能になるとのことです。

では現状では一体どういったアプリケーションであれば動作するのでしょうか。

Arm64ビルドされたアプリケーションは当たり前ですが動作します。 ただ、これはかなり少ないため、現実的ではありません。 サードパーティーでArm64ビルドが提供されているのは、私の知る限りではFirefoxのみです。

では全然既存のソフトウェア資源が利用不可能かというとそんなことはなく、x86アプリケーションであればエミュレーションで動作します。 エミュレーションなのでパフォーマンスはよくありません。 そのため、Arm64ビルドがあればそれを利用し、なければx86ビルドを利用する、というのが基本的なやり方になります。

とはいえ具体的にどういったアプリケーションが利用できるのかが気になるところかと思います。

参考までに、私が日常的に利用している以下のアプリケーションについては動作を確認しました1

Firefox: Arm64ビルドあり
Slack(32bit版): x86エミュレーションで動作
Discord: x86エミュレーションで動作
OBS(32bit版): x86エミュレーションで動作
GIMP(32bit版): x86エミュレーションで動作
CLIP STUDIO PAINT(旧バージョン32bit版): x86エミュレーションで動作
7zip(32bit版): x86エミュレーションで動作
Windows Terminal: Arm64ビルドあり
VScode: Arm64ビルドあり

x86エミュレーションでも使い勝手はそんなに気にならないと思います。 クリスタはちょっともさっとしている印象を受けましたが、まぁそれくらいですね。

開発環境

WSL2

WSL2についてですが、結論から言うとそのままではエラーが出て利用できませんでした。

手元の環境では、Windows Insider ProgramのDevチャネルを導入して初めて正常に動作しました。 バージョン2004、ビルド20241.1000で正常にWSL2が利用できています。

ただ、やはり通常のWindowsに比べて諸々の挙動が怪しいです。 例えば、codeコマンドなどが正常に動作しなかったりします。

Docker

WSL2上でDockerを動かすことができました。

docs.docker.com

上のリンクのインストールガイドのarm64に従いDockerをインストールして、下記コマンドを実行します。

$ sudo service docker start
$ docker run -it --rm -p 80:80 nginx:1.18

nginxサーバがDocker上で立ち上がります。

開発に使うアプリケーション

VScodeWindows Terminalは先述の通りArm64ビルドが存在しています。

総評

普通のパソコンとして使うにはちょっと難点が多いかなという気がします。 そりゃそうか。

ただ、電池持ちがよくLTE接続ができるWindowsとなると現状Surface Pro X一択だと思うので、興味のある人は買ってみるとよいのではないでしょうか。

同じArmプロセッサだとM1のMacBook Airは気になりますね……


  1. これらのアプリケーションの動作を保証するものではありません。参考程度にしてください。

Tweet generatorについて

こんにちは。

Tweet generetorというサービスを運用して1年とちょっとが経ちました。

2020/12/09更新

上のリンクは旧バージョンへのリンクです。是非新バージョンのTweet generatorをご利用ください。 新バージョンについて詳しくはこちらの記事で紹介しています。 cordx56.hatenablog.com

これまでに少なくとも36万アカウントに利用していただき1、自分が作ったWebサービスとしては一番アクセス数が多いものになりました。

簡単にサービスについて紹介させていただくと、Twitter認証をすることで直近のツイートからマルコフ連鎖モデルを学習し、学習済みモデルを利用してテキスト生成を自由に行うことができる、というサービスです。

今回の記事では、Tweet generatorについて少しまとめてみようかと思います。

リクエストの急増

このTweet generatorがいわゆる「バズった」状態になったのは2020年2月頭のことでした。 この頃のテキスト生成数を横軸を日にち、縦軸を生成数としてグラフにしました。

f:id:cordx56:20201015014254p:plain
2月中のテキスト生成数グラフ(日別)

2月中のテキスト総生成数は16,475,342件でした。だいぶ大きな数ですね。

グラフから、1日2日の生成数が少ないのに対し、3日から急にテキスト生成数が増加している様子がわかります。 これが2月頭にバズったという状況です。

この時期に何故急にリクエストが増えたのか、その理由に心当たりがあります。

github.com

このコミットを見ていただければわかる通り、リクエストが急増する直前の1月30日にTwitter cardの設定をしています。 Twitter cardの設定が本当にリクエストの急増と関係しているのかはわかりませんが、まぁ設定しておくに越したことはないでしょう。

利用時間帯

2020年9月中のテキスト生成数を横軸を時間、縦軸を生成数としてグラフにしました。

f:id:cordx56:20201015012720p:plain
9月中のテキスト生成数グラフ(時間別)

グラフから、Tweet generatorがよく利用されている時間帯が23時から0時の深夜帯であることがわかります。 Tweet generatorのユーザーは夜ふかしさんが多いのでしょうか?

モデル生成1回あたりのテキスト生成数

2020年9月の統計では、1回のモデル生成に対してテキスト生成は平均117.82回行われていました。 1回モデルを生成したら、100回以上テキスト生成をする方が多かったということでしょうか。

最後に

趣味で運用していたシステムをこんなに多くの方に使っていただけるとは思ってもいなかったので、正直なところ驚いています。

ご利用いただいた皆様、ありがとうございます。 今後ともTweet generatorをよろしくお願いします。


  1. ログがうまく取れてなくてちゃんとした統計が取れませんでした。サービス開始からのログをみる限り約37万アカウントが利用していました。2020年4月以降から2020年11月25日現在までの総計では21万アカウントがこのサービスを利用していたことになります。この間に生成されたテキストの数は38,326,571件になります。

LUKSで暗号化されたボリュームを起動時に自動でマウントする

こんにちは。

今回は外付けHDDを暗号化して、起動時に自動でマウントする設定を行ったので、そのことについて書いていきたいと思います。

暗号化されたボリュームを用意する

まずは暗号化ボリュームの準備です。

$ sudo cryptsetup -y -v luksFormat /dev/sda1
$ sudo cryptsetup open /dev/sda1 localhdd

/dev/sda1localhddは必要に応じて書き換えてください。

これで/dev/mapper以下にlocalhddが現れます。

$ sudo mkfs.ext4 /dev/mapper/localhdd
$ sudo mount /dev/mapper/localhdd /mnt

これで暗号化ボリュームのフォーマット及びマウントができます。

/etc/crypttabを書く

暗号化ボリュームを自動でopenするために、/etc/crypttabを書いていきます。

まずは暗号化ボリュームのUUIDを調べます。

$ sudo cryptsetup luksDump /dev/sda1 | grep "UUID"

でてきたUUIDを拾って、次のような行を/etc/crypttabに記述します。

localhdd UUID=[上で調べたUUID] /etc/luks-keys/password luks

/etc/luks-keys/passwordのパスは任意です。パスワードを記述したファイルを置く場所に応じて変更してください。

次にパスワードを/etc/luks-keys/passwordに書き込みます。

$ echo -n "password" > /etc/luks-keys/password

改行文字が入らないようにecho -nにしています。

/etc/fstabを書く

最後に、/etc/fstabを書いていきます。

次のような行を記述します。

/dev/mapper/localhdd /mnt ext4 defaults 0 2

/dev/mapper/localhdd/mntは環境に応じて書き換えてください。

以上で設定は終わりです。 ほとんど次の記事の和訳みたいな感じになってしまいました。 必要に応じて次の記事も参考にしてください。

blog.tinned-software.net

はてなサマーインターン2020に参加してきました

こんにちは。今回ははてなサマーインターンに参加したので、そのことについて書いていきたいと思います。

はてなサマーインターンについて

はてなサマーインターンは今年の夏に開催された株式会社はてなさんのインターンになります。

今年は全日リモート開催ということで、一週間おうちからはてなさんのインターンに参加させていただきました。 京都行きたかった……

はてなサマーインターン2020の詳細については下記をご参照ください。 hatenacorp.jp

応募

私は学部4年でほぼ院進が決まっている状態だったのでインターンの募集要項から微妙に除外されているケースが多く、まず募集要項に適合してるインターン先を探すところからでした。 はてなさんはその辺の制約が緩く、申し込みしやすかったです。

事前課題は指定されたイメージをdocker runして軽く情報を打ち込むというものでした。 いいのかこんな簡単で……とか思いましたが良かったみたいです。

正直はてなさんは「通らないだろ〜」とか思いながら申し込んだので、面接の話がきたときはびっくりしました。

面接も、提出したESをじっくりみて丁寧に評価してくださって、ありがたかったです。

講義

講義は体系的でわかりやすく説明されていて非常に質の高いものでした。

内容はHTTPの基本から始まりgRPCについて、Dockerについて基本的なこと、Kubernetesについて基本的なこと、という感じでした。 実践問題なども用意されていて、楽しく受講することができました。 実践問題で突如発生したCTF、解けなかった……*1

講義動画は後日配信される*2とのことなので、楽しみに待ちましょう。

2020/10/04更新

配信されました。 hatenacorp.jp

課題

課題としては、Kubernetes上のブログサービスの拡張をすると行った感じです。

ブログ記事のレンダラーサービスの改良と、リンクのタイトル自動取得を行うマイクロサービスの開発が基本課題、大量のリンクがあったときへの対処とrobots.txtの考慮などが発展課題という感じでした。

課題説明ではコミットの粒度に注意する、テストを書く、などの基本的な部分も丁寧に説明していただきました。

実際の課題に使われたソースコードGitHubで公開されているので、気になる方は見てみると良いのではないでしょうか。 github.com

実装

実装したこととしては、次の通りです。

  • レンダラーサービスにMarkdownライブラリgoldmarkを導入する
  • Markdownライブラリの拡張をして独自記法を導入
    • MarkdownライブラリのASTと向き合う、という感じでした
  • リンク記法のタイトルが空欄のときに、リンク先からタイトルを自動で取得する
    • これもMarkdownライブラリに手を突っ込んで、ASTを走査してタイトルを自動補完すると言った感じでした
    • これについてはレンダラーサービスとタイトル取得間でgRPCで通信して……という感じで実装しました
  • タイトル自動取得の際にrobots.txtを参照してクロールして良いページかどうか判定する
    • 簡単にrobots.txtの仕様を調べて、簡易的なrobots.txtパーサを手書きするという感じでした

メンターさんとのやり取り

メンターの id:yigarashi さんには3日間DiscordとScrapbox上でお世話になりました。 基本的に自分のコードを誰かにレビューしてもらう・レビューをもとに今後の実装について相談する機会というのはなかなかなかったので、メンターさんの優しいレビューやプチ講座には感動しました。

特にテストをきれいに書くためにどういう設計をしたらいいかの講座はありがたかったです。

自分は実装速度はとても遅いほうだと思っていたのですが、メンターさんにはとても手が速くて丁寧と褒めていただけたのでめちゃくちゃ嬉しかったです。

発表

インターン最終日は成果発表会がありました。

皆さんの発表がどれも特徴的で、同じ課題でも様々な取り組み方があって面白かったです。 まず言語もバラバラだったり、自分が難しくて手を付けられなかった課題に全く思いつかなかった方法で解決策が提示されたりと、非常に興味深かったです。

発表中はみんなでScrapboxに感想コメントを書き込みながら発表を聞いていたのですが、自分の発表に「実装も発表も丁寧」と書いていただけてこれもまためちゃくちゃ嬉しかったです。

面談

発表が終わったあとに面談をしていただきました。 ここでも丁寧にインターン中のことや今後のことについてお話させていただけてありがたかったです。

最後に

インターンではめちゃくちゃ褒められが発生したので、嬉しいことの連続でした。

はてなの皆さん、メンターの id:yigarashi さん、同じ部屋*3で作業していた id:CNaan さん、その他のインターン生の皆さん、本当にありがとうございました。 この経験を活かして今後とも頑張ってまいります!

今後ともよろしくお願いします。

*1:初めてCTFっぽいことをしたのですが、楽しかったです

*2:https://developer.hatenastaff.com/entry/2020/07/01/185834

*3:Discordのボイスチャットです