7月のまとめ

40歳になりました

f:id:nekoruri:20200718000002j:plain f:id:nekoruri:20200722233215j:plain

Amazon欲しいものリストからもたくさんプレゼントをいただいてしまいました。個人的な方針で個別のお名前を出す事は割愛させていただいているのですが、みなさまありがとうございます、とても嬉しかったです。

このお礼は世界への貢献をもって返していきます。

バケツはスタッフがいただきました。

f:id:nekoruri:20200728143714j:plain

例年通りいきなり!ステーキのタダ肉300gも食べました。

f:id:nekoruri:20200728161306j:plain

30代の10年間は、エクストーンへの転職に始まり、サイバーエージェント、WHEREと3社(正確にはパシャオクを入れて4社)を渡り歩きつつ、たくさんの方々のおかげで色々貴重な経験をさせていただいています。

次の10年は若者の手を引きながら世界に恩を返していけるよう健康にがんばります。

SecHack365 2020年度

sechack365.nict.go.jp

6月末に選考結果の発表があり、7月からいよいよ2020年度のSecHack365が本格始動しました。今年度も開発駆動コースの仲山ゼミ担当として、世界を変える若者の手助けをしていきます。

今年度は全国行脚ができない中ではありますが、SecHack365オンラインの初年度ぐらいの感じでがんばっていきたい感じです。

Microsoft MVPアワード (Azure)

f:id:nekoruri:20200803230145j:plain

自分としては正直アウトプット便秘ではあるのですが、4期目受賞することができました。

カンファレンスや同人誌即売会がオンライン化したりする中ではありますが、自分らしいアウトプットの形を模索しつつ、あらためて再始動フルスロットルで頑張っていきます。

動画配信

なんか色々機材が整ってしまったこともあり、迷走しつつ色々楽しんで手札を増やしていこうと思っています。

www.youtube.com

www.youtube.com

艦これ

E1甲、E2乙、E3甲、E4乙までやったところでボーキが尽きました。

f:id:nekoruri:20200803233447p:plain

米帝になりたいです。

ニューノーマルWFH

現在社内ニートのくせに、ストレス発散で色々揃えてしまったので、反省のために自慢していきます。

インスパイア元はこちらです。

note.com

現状

f:id:nekoruri:20200619002259j:plain

ちなみにここは元々押し入れでした。

椅子

某勉強会(もはや互助会かもしれない)Slackにてたまたまスケベ椅子の話題が出たのですが、そこから色々話題が盛り上がって10万円前後と言われる人権椅子がオフィスバスターズ等で中古を狙うと3-5万円ぐらいで買えることがわかりました。

で、見つけたのが、アーロンチェアで有名なハーマンミラー社のセラチェアが約3万円という案件です。というわけで、朝一に車で駆けつけてささっと買ってきました。

www.officebusters.com

このセラチェアは、ウレタンでもメッシュでもなく、セルラーサスペンションというプラスチックの小さな丸型パッドがハニカム上になっているもので、座面が堅くちょっと人を選ぶところはありますが、ハーマンミラー製お得意の様々な調整機構はたくさん付いていますし、少なくとも私にはちょうど良かったです。

www.ofnt.co.jp

買ってきたら、その日のうちに近くに居る奴がわらわらとうちまで座りに来て、結局某勉強会Slackメンバーだけであと数台売れて速攻で売り切れていました。

デスクトップ(物理)

もともと、サンワダイレクトの半額セールで2つの机をL字に置いていました。

direct.sanwa.co.jp

direct.sanwa.co.jp

ただこれ奥行き55cmというのがかなりネックで、ディスプレイとキーボードを置くと前後にまったく余裕が無い状態で、ノートPCを使うときはキーボードを片付ける必要がありました。

というわけで、IKEAで天板だけ買ってきて上に載せちゃいました。

www.ikea.com

奥行き55cmから75cmになっただけですが、体感は3倍ぐらいになって別次元になりました。5000円でこの満足度が得られるならもっと早くやれば良かった。

フットレスト

写真には写っていませんが、足下にフットレスト(足置き)があります。

これがあると椅子をちょっと高めにしてディスプレイの高さと目線があうので、かなり快適になりました。

マイク

コロナ禍が始まった早々にとりあえず必要そうだということでピンマイクを買いました。これはServerless Communityのメンバーから紹介してもらったやつです。

ただ、元々自宅にはアームスタンド付きコンデンサーマイクのPod Pack 1を買っていたので、結局Serverless Meetup収録の1回だけで、カバンに入れっぱなしです。

ちなみにPod Pack 1はこれはこれでおすすめです。

オーディオインターフェース

マイクだけならPod Pack 1でまったく不満がなかったのですが、自宅に居るとなんとなく色々やりたくなってきた結果、某勉強会Slackで聞き回ったりして、これを買いました。 

Steinberg 6 x 4 USB 2.0 オーディオインターフェース UR44

Steinberg 6 x 4 USB 2.0 オーディオインターフェース UR44

  • 発売日: 2014/01/27
  • メディア: エレクトロニクス
 

家に電子ピアノとかもあるので、そのあたりでMIDIとかでも色々やりたいなあとか色々夢を詰め込んだら少し上の機種を買ってしまいました。物欲やばいですね。

マイクはPod Pack 1がUSB直出しでXLRが食えず接続できていないので、今のところただ遅延の少ないヘッドホンアンプになっています。

カメラ

ウェブカメラが大昔の画質低いものしか持っていなかったので、ちょうど余っていたRakuten miniにiVCamを食わせてカメラとして固定運用しています。UN-LIMIT?なにそれ。常時Wi-Fi接続ですが何か?

小さすぎて斜めにマウントしているのがチャームポイントです。

ライト

何が良いか判らなかったので安いのを適当に買いました。特に不満は無いです。

ディスプレイ

1台もらってきて3台になりました。ありがとうございます。

まとめ

環境構築で満足してしまうのはエンジニアの性ですよね!

懐かしのCGI掲示板スクリプトをAWS Lambda+EFSで動かしてみた

AWSにはフルマネージドなNFSファイルシステムを提供するEFSがありますが、AWS Lambdaからマウントできるようになりました。

aws.amazon.com

これをうまく使うと、ファイルシステムへの保存を前提とした古いアプリケーションを楽にクラウドにリフト(移行)することができます。

というわけで、さっそく、前世紀からインターネットで遊んでいた人でお世話にならなかった人は居ないであろうCGI RESCUE様のminibbs.cgiこと簡易BBSをサーバーレスに動かしてみました。みんなminibbs.cgiの書き換えでPerl覚えましたよね?

動いているもの

f:id:nekoruri:20200618020439j:plain

df6mbqlkt7.execute-api.ap-northeast-1.amazonaws.com

※インターネット老人会の治安が悪いので注意
※ここはそのうち忘れないうちに落とします。

レポジトリ

github.com

しくみ

まず、今回の新機能を使うためにEFSのボリュームを作ります。この手順は上のページに書いてあるそのままで大丈夫です。完全に同じ手順でやると /mnt/msg にマウントされるので、その下にデータファイルが置かれるように設定します。この当時のCGIスクリプトなので、minibbs.cgiを直接編集して上の方で変数に設定します。

$tmp_dir = '/mnt/msg';

これで、あとはこのminibbs.cgiをAWS Lambdaで動くようにすれば良いわけです。

そしてこのPerlのCGIスクリプトを動かすにはいくつかの道具を組み合わせていきます。

  1. カスタムランタイムでPerlを動かす AWS::Lambda
  2. AWS LambdaのインターフェースをPerl標準のPSGIに変換する AWS::Lambda::PSGI
  3. PSGIをCGIインターフェースに変換する Plack::App::WrapCGI

この3段階をハンドラ関数としてまとめたものが、上のレポジトリにあるhandler.plです。

use utf8;
use warnings;
use strict;
use AWS::Lambda::PSGI;
use Plack::App::WrapCGI;

my $app = Plack::App::WrapCGI->new(script => "$ENV{'LAMBDA_TASK_ROOT'}/minibbs.cgi", execute => 1)->to_app;
my $func = AWS::Lambda::PSGI->wrap($app);

sub handle {
    $ENV{'TZ'} = "JST-9";
    return $func->(@_);
}

注意事項として、正しく動かすためには以下の設定も必要です。

  • minibbs.cgiに実行権限が必要なので、chmod +x minibbs.cgi してからZIPファイルでデプロイが必要(コンソールからの編集不可)
  • 1行目のshebangが配布状態だと/usr/local/bin/perlになっているので、/usr/bin/perlに変更する
  • URLをminibbs.cgi内に設定する必要があるので、先にAPI Gatewayを設定する(運用でカバー)
  • あらかじめ空のデータファイルが必要なので、初回だけhandler.plでtouch /mnt/msg/data.cgiとかやっておく(運用でカバー その2)

このあたりをクリアすると、前世紀に普通に使っていたminibbs.cgiを、ほぼそのまま一般的な設定項目以外いじることなく、令和時代のサーバーレス環境AWS Lambda上で実行することができました。

運用でカバーした2点も、minibbs.cgi自体を少し直せばもちろん対応できるわけですが、今回はそういったプログラム本体の修正を一切せずに、そのままAWS Lambda上で動かす事ができるというデモンストレーションなので、上で紹介したperlのパスと変数以外は一切変更していません。

おそらく性能もさほどでないと思われますし、古いアプリケーションをそのまま動かしているので脆弱性対応は依然として必要ですが、まずは手軽に今動いているサーバ環境の運用コストを下げるために、このようなサーバーレス+共有ディスクの構成は極めて有用です。あくまで「リフト&シフト」のリフト策として、クラウドシフトのためのリソースをひねり出すために使うのが望ましいですが、カードの一つとしてこういったことがすぐに実現できるんだ!という紹介でした。

宣伝

nekoruri.booth.pm

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

  • 作者:Peter Sbarski
  • 発売日: 2018/03/14
  • メディア: 単行本(ソフトカバー)
 
CGI & Perl ポケットリファレンス (Pocket reference)

CGI & Perl ポケットリファレンス (Pocket reference)

 

 

AWS LambdaとDynamoDBがこんなにツライ時代ではない

ありがたいことに、3年前に#ssmjp 2017/06で話したスライド

をTwitterで紹介して頂いた*1 ようで、当時から大幅に改善しているところを振り返りたいと思います。あと、ついでに最近やっているAzureに関しても少し触れていきます。

サーバーレスアーキテクチャ #とは

f:id:nekoruri:20200607114509p:plain

当時はこう説明したのですが、今でもそんなに悪くない表現かなと思います。

f:id:nekoruri:20200607114853p:plain

書籍は現在「Serverlessを支える技術 第3版」まで出ていますので、BOOTHからどうぞ(隙あらばダイマしていく方針)。

サーバーレス三種の神器

f:id:nekoruri:20200607115055p:plain

今このスライドを作るなら、認証認可の話を入れるかなと思います。システム内のAWS IAMとクライアント側のCognitoどちらも重要です。

ちなみにAzureを含めておさらいすると、こんな感じの対応になります。

勝手にスケールするデータストア

  • Amazon DynamoDB、Amazon DocumentDB ↔ Cosmos DB
  • Amazon S3 ↔ Blob Storage、Data Lake Storage Gen2
  • Amazon Aurora Serverless ↔ SQL Database serverless

勝手にスケールするソフトウェア実行環境

  • AWS Lambda ↔ Azure Functions
  • (AWS Fargate ↔ Azure Container Instances)

それらをつなげる枠組み

  • Amazon Kinesis Streams ↔ EventHubs
  • Amazon Simple Queue Service (SQS) ↔ Queue Storage、Service Bus
  • Amazon Simple Notification Service (SNS) ↔ EventGrid
  • AWS Step Functions ↔ Logic Apps、Durable Functions
  • Amazon API Gateway ↔ (Functions組み込み機能)、API Management

f:id:nekoruri:20200607121752p:plain

この辺は今もあまり変わらずです。

この構成の肝は、クラウドサービスの構成と、関数のデプロイを完全に分けていることです。AWS SAMやServerless Frameworkで普通にやると、関数本体がCloudFormationスタックに入ってしまい、リアルからデータが上がってくる「本番環境」で高速に試行錯誤を繰り返すIoTビジネスの特性とちょっと合わないと感じたので、ここを切り離しました。ただApexがメンテされなくなってしまったので、今ならlambrollですね。

Azureでも同じように、全体の構成をTerraformで行い、関数は別レポジトリからデプロイしています。

サーバーレスあるある選手権 Lambda編

f:id:nekoruri:20200607125048p:plain

f:id:nekoruri:20200607125146p:plain

ログそのものは現状でも余り変わっていないのですが、追いかける部分に関してはAWS X-Rayの登場でだいぶ改善されました。AWSサービスへの外部リクエストは何もしなくても記録されますし、外部サービスや重い内部処理をプロファイリングしたければサブセグメントを生成してあげればX-Rayの時系列トレースグラフに表示できます。

Azureの場合はVSCode拡張からリアルタイムでログを見ることができます。Application InsightsからX-Rayと同じようにサービス間のコールグラフやサブセグメントごとのトレースグラフが見られるのも同じです。

f:id:nekoruri:20200607130253p:plain

ここは今でも変わっていませんが、その後運用して判った部分としてはmemory_sizeの調整になった時点で消費メモリ量が問題になることはあまりない(ざっと見て最大消費量より多ければ良い)ので、余程メモリ変動の大きい処理をしていないのであれば、カスタムメトリクスだして追いかけるほどではないです。逆に言えば、メモリ変動が大きい処理があるのであれば、どこかで仕組みを変えて処理量のほうを平準化できないか考えた方が良いです。

f:id:nekoruri:20200607130738p:plain

f:id:nekoruri:20200607131145p:plain

このスライドの中で状況がもっとも変わった部分です。なんとかしてくれました。

そもそもVPC環境でのLambda起動の仕組みが大幅に改善されました。

ENIを生やしたインスタンスを個別に作成していたものが、基盤側で用意した共有ENIにNATされるようになったので、15秒ほどかかっていたのが1秒前後になりコールドスタートが実用的な範囲になりました。

また、RDSへの同時接続数も、Lambda側で同時実行数が設定できるようになり、RDS側にもフルマネージドのコネクションプーリングRDS Proxyが提供されたので、問題にならなくなりました。

そもそもVPCを使わずAurora ServerlessのData APIを使うという選択肢もできました。

とはいえ、依然としてRedisなどはVPCの中にしか作成できないので、VPCを廃絶できないのがおしいところではあります。

サーバーレスあるある選手権 Kinesis編

f:id:nekoruri:20200607132542p:plain

f:id:nekoruri:20200607133153p:plain

f:id:nekoruri:20200607133208p:plain

ここも大幅に改善されたポイントです。

待ち時間を指定できるようになったので、データが少ない場合の処理効率が良くなりました。

またKinesis Data Streams側のシャード数と掛け算でLambda側の「Parallelization Factor」で並列実行できるようになったため、時間が掛かる処理をぶら下げたときにシャード数まで引き上げずに済むようになったのも地味に大きなポイントです。これまではKinesis側のリミット(1MB/sまたは1,000レコード/秒)より大幅に少ないデータしかないにもかかわらず、シャード一本月1500円(14.04USD)が掛かっていました。

f:id:nekoruri:20200607140510p:plain

きました。使っています。

f:id:nekoruri:20200607140619p:plain

東京には来てくれたのですが、結局うまく処理にはまらずに現状使っていません。

どちらかというと、Apache Flinkで分析処理を実装できるようになった方が個人的にインパクトが大きいです。

イベントソーシングパターンなど、ストリーミングデータに対してステートを持った継続処理を実装するユースケースがふえているのでもっと活用事例が増えて欲しいところです。

サーバーレスあるある選手権 DynamoDB編

f:id:nekoruri:20200607133813p:plain

f:id:nekoruri:20200607140330p:plain

KVSベースでの設計がRDBに比べて違うノウハウが必要となるのは以前通りです。これはもうキーベースで分散するデータストアである以上は逃げられません。とはいえ、サーバーレス開発の普及によって世の中の情報もだいぶ増えてきたので、3年前よりは実感的にはだいぶ始めやすくなったのではないでしょうか。

f:id:nekoruri:20200607133959p:plain

f:id:nekoruri:20200607134017p:plain

f:id:nekoruri:20200607134031p:plain

DynamoDBのコスト問題はまだまだ苦労する部分ですが、オンデマンドキャパシティーモードが用意されたので、リクエスト数が急激にスパイクするようなケースでも安心して使えるようになったのは大きいです。

ただ、オンデマンドキャパシティーモードの方が「単価」が大幅に高いため、常時リクエストがあるようなケースではかえって高くなってしまうこともあり、そこはユースケースと運用コストや障害リスクに見合った選択が必要です。

f:id:nekoruri:20200607135148p:plain

バックアップは完璧に用意されました。オンデマンドもPITRもあります。

注意としては、あくまでバックアップはDynamoDBサービス内にリストア可能な形で保存されるだけです。データ自体をCSVやJSONなどでエクスポートしたい場合は、これまで通りDataPipelineをつかったり、ひたすらスキャンでページを手繰る必要があります。

まだまだ道半ば

f:id:nekoruri:20200607142046p:plain

結局DynamoDBだけでは厳しくなったので、現在ではRedisも併用しています。

このあたりは、先日のServerless Meetup Tokyo #16でも話しました。

f:id:nekoruri:20200607142209p:plain

現在は、お客様や大人の事情に合わせて、上でも書いたとおりAzureとAWSで両刀でやっています。GCPでもだいたいできそうな感触はありますが、案件ください

f:id:nekoruri:20200607142221p:plain

3年前と比べると、大きな障壁はかなり取り除かれ、頑張ればだいたい問題ない、とはっきり言えるところまで来ました。

昨今、ソフトウェア開発の手法で社会や組織を変革し続けるデジタルトランスフォーメーションの波が来ていますが、特にIoTではとにかくサービスデリバリの高速化が重要です。サーバーレスアーキテクチャという選択肢で正解だったというのがこの3年間の最終的な評価です。

宣伝

 

 

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

  • 作者:Peter Sbarski
  • 発売日: 2018/03/14
  • メディア: 単行本(ソフトカバー)
 

SPS認定済ソリューションパートナーになりました

私の所属先WHEREが、今更ではあるのですが!ソラコムさんの「SPS 認定済ソリューションパートナー」に認定されました。

where123.jp

soracom.jp

SORACOM-UGServerlessConfなどの技術セッションでも表に出していたのでご存知の方も多い通り、2016年にEXBeaconプラットフォームの実証実験を始めて以来ずっとSORACOMを利用しつづけているのですが、色々と会社としても個人としても良くして頂いていたのでパートナーになるのをすっかり忘れていた、というのが正直なところです😀

SORACOM Beam/FunnelやSORACOM Gate/Napterを中心に、様々なプラットフォームサービスとしても弊社はごりごりと活用している側だと自認していますが、連携強化によってさらに楽しい社会を作っていければなと思います。

世界中のヒトとモノをつなげ共鳴する社会で、
IoTがもたらす真の豊かさを追求していきます!
よろしくお願いします!

soracom.jp

where123.jp

Coinhive事件とその先についての個人的見解

経緯については、Wikipedia見てください。

ja.wikipedia.org

また、裁判の争点に関してはこちらが詳しいです。

www.bengo4.com

 

本件に対して個人的な立場としては、地裁判決を支持しています。

その上で、Twitter上などで自分の感覚と異なる意見もあるため、そのあたりで自分の立場を整理してみます。

まだこまかい論点については自分の中でももやもやしていますし、そもそも宗教上の理由等で違う意見を持つ方も多いとは思いますが、そこは個人の意見としてご理解を。

広告との違い

動作が重く不自由なUIを持つ広告とどこが違うのか、という意見がありました。

Coinhive等に関する問題には、まず「サイレントにやるな」というのと、「消費リソース量が金銭的インセンティブに”比例”する」という二つの問題ががあり、これらの点において広告と同一視して議論するのは違うように思います。

黙ってオプトアウトもできないような状態で勝手にやるな、というのは地裁も高裁も認めているとおりです。

その上で、そもそも広告は画像等を表示してリンク先に遷移させることが目的です。ふざけた広告システムも多いので混乱しがちですが、広告はリンク先に正しく遷移させることが主目的であり、クライアント側もサーバー側も処理は軽ければ軽いほど良いわけです。

例えばそれが「重い」動画再生という形態であっても、少しでも多くの人をリンク先に誘導するために、ブラウザの処理を軽くしたいというインセンティブが(本来は)生じます。その一方でCoinhive等は「より重くすること」そのものに直接価値が生じてしまうのが異なります。

被害の有無

ただの計算であり悪い動作は無い、という意見がありました。

これに関しては、無罪判決と無った地裁においても、反意図──つまり閲覧者の意図に沿わない動作であることはみとめ「ユーザーに利益をもたらさないものである上、ユーザーに無断でCPUを提供させて利益を得ようとするもの」とばっさりしています。

実際に、本来動かなくて良かったCPUやGPU(CoinhiveはCPUのみですが)等の消費電力増加による電気代金、ファン等の経年劣化加速など積み重なると無視できないと思われる不利益は生じています。決してゼロでは無く、社会通念上許される範囲であるかです(ここは広告等と同じ)。

他にもありますがそれは次に書きます。

カジュアルにCoinhive等が普及した場合

本件は無罪であるべきだ、という主張の上で、ただそれを受けてCoinhiveのようなクライアントリソースを消費するソフトウェアが普及した場合を考えます。

その場合、先ほども書いた通り「消費リソース量が金銭的インセンティブに”比例”する」という点が大きな問題となります。現状では(逮捕者が出たこともあり))数限られたウェブサイトでしか利用されていません。しかしこれが様々なウェブサイトで普通に使われるようになると、自明ですがブラウザの動作が重くなります(小並感)。

それが加速すると、クライアントリソースの取り合いとなり、CPUは常時100%に張り付き、本来CPUを消費するべき重要なアプリケーションの動作が重くなるなど、具体的なユーザの不利益に繋がります。

さらにそれが進んだ結果、ブラウザにクライアントリソースに対する使用量制限(quota)のような仕組みを取り入れることが予想され、煩雑な仕組みといたちごっこにつながります。そしてその結果不利益を受けるのは、普通のウェブアプリケーションです。

法規制とアーキテクチャによる規制

この手の話をする上で重要な視点として、できる限りこういったものは各国の法では無く、アーキテクチャとして解決すべきという意見があります。私も極めて同意します。

ですが本件に関しては、マルウェアと極めて近い領域のユースケースであることが多く、アーキテクチャとして何らかの規制(上記のquotaなど)を設計したとしても、それを回避するような「いたちごっこ」となることが予想できます。

その一方でユーザの意図に沿ったリソースを多く消費したいウェブアプリケーションも存在します。少なくともそれらの間に画期的かつ現実的な解決策が提案されるまで、この問題が野放図になることも、現行の不正指令電磁的記録(コンピュータウイルス)を対象とした法律の拡大解釈で運用されることも望みません。

その落とし所として、リソースの消費にインセンティブがあるようなソフトウェアへの法規制は一定の現実解では無いかと考えています。

まとめ

Coinhiveのようなクライアントリソースの消費量がそのまま金銭的インセンティブに比例するソフトウェアを黙って仕込むことは極めてクソであり、ユーザへの告知無しでは規制されるべき、オプトインが義務付けられるべきものと感じます。

その一方で、それは上記のような性質に対して規制されるべきものであって、現行の不正指令電磁的記録の枠組みでは不十分であり、あらためて法整備すべきです。そして法律の不遡及原則から、本件は無罪となるべきです。

既に逮捕してしまったから、今から法改正を進めると現行法での無罪が確定してしまうので強硬になっているのでは、というコメントすら見かける始末です。法のアップデートが遅いうえに、古い法に基づいて「非倫理的」だと判断された行為を逮捕するために既存法の拡大解釈が行われることは極めて遺憾です。

 

以上、個人の感想でした。

 

新刊:TechReport 2019.12 「2019年振り返りと2020年予想」

あけましておめでとうございます!

昨年末に行われた技術書同人誌博覧会2とコミックマーケット97に、個人サークル「めもおきば」として参加してきました。

gishohaku.dev

www.comiket.co.jp

今回は間隔が2週間ということで、あわせて1冊だけ新刊を出しました。

年末恒例の技術トレンド予想本です。

nekoruri.booth.pm

今回紹介したキーワードです。

  • 「2019年予想」の振り返り
  • デジタルツイン
  • IoTシステムのデザインパターン
  • エッジコンピューティング
  • Stateful FaaS
  • CNCF CloudEventsとEventBridge
  • 認証基盤のクラウドサービス化
  • パスワードの終焉、MFA 2.0
  • 情報システムとゼロトラスト
  • レガシーシステムと2025年の崖
  • ARMとRISC-V

コピー本と言うことで200円とお手軽価格なので、このあたりのキーワードが気になった方はぜひBOOTHからどうぞ。

 

次回のサークル参加は、2/29、3/1の技術書典8です。二日間ともいます!

techbookfest.org