<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Code for Japan on Data Visualization Japan</title>
        <link>https://data-visualization.jp/tags/code-for-japan/</link>
        <description>Recent content in Code for Japan on Data Visualization Japan</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-jp</language>
        <lastBuildDate>Mon, 28 Dec 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://data-visualization.jp/tags/code-for-japan/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>小副川 健／東京都新型コロナウイルス感染症対策サイトの開発に携わった話</title>
        <link>https://data-visualization.jp/tokyo-covid-site/</link>
        <pubDate>Mon, 28 Dec 2020 00:00:00 +0000</pubDate>
        
        <guid>https://data-visualization.jp/tokyo-covid-site/</guid>
        <description>&lt;p&gt;Data Visualization Japan Meetup 2020（2020年12月28・29日開催）における、小副川 健さん（株式会社ユーザベース／Code for Japan）の講演です。「東京都新型コロナウイルス感染症対策サイト」の初期開発に携わった立場から、技術選定と開発コミュニティの運営を振り返ります。&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/TSkP6qF_l0Q&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;株式会社ユーザベース、および Code for Japan の小副川が発表させていただきます。よろしくお願いいたします。&lt;/p&gt;
&lt;p&gt;タイトルは「東京都新型コロナウイルス感染症対策サイトの開発に携わった話」です。今回のミートアップのテーマでもある「話題になった可視化コンテンツ」ということでキャスティングいただいたのかなと思いますが、私は&lt;strong&gt;特に初期にかなり深く携わっていた&lt;/strong&gt;ので、その頃に何を考えながらサイトを作っていたか、というお話ができるといいなと思っております。&lt;/p&gt;
&lt;p&gt;**先にネタバラシしてしまうと、可視化のコンテンツとしては全然特別なものではありません。**可視化の研究レベルの話や技術的に高度な話を期待されると「すみません」という感じになってしまうのですが、&lt;strong&gt;可視化をして人に情報を伝えるという、可視化のベーシックな機能の部分&lt;/strong&gt;については果たせていた面もあるのかなと思い、その軸でまとめてみました。&lt;/p&gt;
&lt;p&gt;ただ、組み立ててみるとあまり可視化だけの話にはならず、どちらかというと&lt;strong&gt;シビックテック&lt;/strong&gt;——データや ICT を使って地域課題を解決していく活動——の色が強い話になります。&lt;/p&gt;
&lt;h2 id=&#34;自己紹介&#34;&gt;自己紹介
&lt;/h2&gt;&lt;p&gt;普段は&lt;strong&gt;ユーザベース&lt;/strong&gt;という、「経済情報で、世界を変える」というミッションを持った会社にいます。BtoB SaaS の事業で、企業の公開情報を分かりやすく整理してお客様にお届けする——そういうサービスの仕事で、&lt;strong&gt;データサイエンティスト&lt;/strong&gt;をしております。普段は自然言語処理で機械学習を使ったようなことをやっています。&lt;/p&gt;
&lt;p&gt;それとは全く別に、&lt;strong&gt;Code for Japan のエンジニア&lt;/strong&gt;として、本業が終わった後や土日に&lt;strong&gt;シビックテック&lt;/strong&gt;と呼ばれる活動をしています。&lt;/p&gt;
&lt;p&gt;ユーザベースでは&lt;strong&gt;フェローエンジニア&lt;/strong&gt;という立場でもあります。CTO のように経営面へのコミットを強く求められる立場以外で、エンジニアとしてキャリアパスを作るためのものです。&lt;strong&gt;日々ひたすらコードを書いていますし、Code for Japan でもひたすらコードを書いています。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;シビックテックとは&#34;&gt;シビックテックとは
&lt;/h2&gt;&lt;p&gt;ざっくり言うと、&lt;strong&gt;ICT を使って地域の課題を解決する、世界的なムーブメント&lt;/strong&gt;のことです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code for America&lt;/strong&gt; が一番の本場のようなところですが、最近は台湾でオードリー・タン デジタル担当大臣が大活躍されていて、&lt;strong&gt;g0v（ガブゼロ）&lt;/strong&gt; という台湾のシビックテックコミュニティもかなり有名になってきました。&lt;/p&gt;
&lt;p&gt;台湾の g0v の例のように、&lt;strong&gt;マスクの在庫を可視化してオープンデータとして提供することで、在庫量をチェックできるアプリケーションが市民の手によって生まれる&lt;/strong&gt;——そういった活動がシビックテックなのかなと思っています。&lt;/p&gt;
&lt;p&gt;日本でも &lt;strong&gt;Code for Japan&lt;/strong&gt; という団体があり、&lt;strong&gt;Code for All&lt;/strong&gt; という世界的なシビックテックのネットワークに加盟して、他国の団体と交流したり、国内の&lt;strong&gt;ブリゲード&lt;/strong&gt;と呼ばれる特定地域に根ざした団体を支援したりしています。&lt;/p&gt;
&lt;p&gt;ビジョンとして「&lt;strong&gt;共に考え、共につくる&lt;/strong&gt;」を掲げ、日本の地域課題を解決することを目指すコミュニティです。&lt;/p&gt;
&lt;p&gt;なお私自身は一般社団法人の構成員というわけではなく、たまにプロジェクトに業務委託のエンジニアとして入る、といった関係です。ちゃんとした所属として名乗ると誤解を招くかもしれないのですが、&lt;strong&gt;事務局長の了解はもらっていて&lt;/strong&gt;、Code for Japan でエンジニアをやっているということで。&lt;/p&gt;
&lt;p&gt;中の人はエンジニアが多いとはいえ&lt;strong&gt;それでも20%くらい&lt;/strong&gt;で、それ以外は公務員や普通の会社員でエンジニアリングではない仕事をされている方、学生の方も参加されています。&lt;/p&gt;
&lt;p&gt;Slack でコミュニケーションを取っているのですが、**このコロナサイトの影響で、それまで500人くらいだったコミュニティが一気に4500人くらいまで成長しました。**ただ、一気に増えた後もずっと継続的に活動している人はそんなに多くはないので、&lt;strong&gt;実質の活動人数が増えた感じはあまりしていない&lt;/strong&gt;のですが。&lt;/p&gt;
&lt;h2 id=&#34;私とシビックテック--7年&#34;&gt;私とシビックテック ― 7年
&lt;/h2&gt;&lt;p&gt;シビックテックに参加して7年くらいになります。&lt;/p&gt;
&lt;p&gt;**一番最初にシビックテックを知ったのは、2011年の sinsai.info でした。**当時、私は都内の某大学で博士研究員をしていて、データとはあまり関係ない研究をしていました。東日本大震災も大学の研究室にいるときに被災したのですが、私自身も困った経験をする中で、「&lt;strong&gt;IT を使ってボランタリーな活動で世に貢献していく、そういう道があるんだ&lt;/strong&gt;」とすごく感動したのを覚えています。&lt;/p&gt;
&lt;p&gt;そこからすぐ参加したわけではなく、少し時間を置いて、2012年ごろに富士通に就職してデータサイエンティストとして駆け出しました。そして2013年末、「&lt;strong&gt;Where Does My Money Go?&lt;/strong&gt;」——&lt;strong&gt;私の税金は何に使われているのか&lt;/strong&gt;を可視化するサービス——のイベントに参加したのが最初でした。&lt;/p&gt;
&lt;p&gt;これもオープンソースで、&lt;strong&gt;データを自治体ごとに差し替えるとその自治体版ができる&lt;/strong&gt;という仕組みになっていて、その対応自治体を増やすイベントでした。&lt;/p&gt;
&lt;p&gt;当時の私は思いっきり駆け出しで、&lt;strong&gt;データの加工もろくにできない&lt;/strong&gt;ような状態でした。自治体ごとに費目が表記揺れしていて、そのままソフトウェアにかけられない——&lt;strong&gt;そういう体験を通じて、データの標準化や、正しくデータを出すことの重要さを実感できた&lt;/strong&gt;かなと思っています。&lt;/p&gt;
&lt;p&gt;そういう体験もあって「シビックテックは重要だし面白いな」と参加し続けているうちに、&lt;strong&gt;本業では得られないフロントエンド系の技術や、政府系のオープンデータ・データ標準化に詳しくなり、それがまた本業にも生きてくる&lt;/strong&gt;——そういうサイクルを体験できた7年でした。&lt;/p&gt;
&lt;h2 id=&#34;東京都のコロナ対策サイト&#34;&gt;東京都のコロナ対策サイト
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一番最初のリリースは3月3日の深夜&lt;/strong&gt;——正確には日をまたぐくらいでした。その段階では&lt;strong&gt;4枚くらいのパネルしかなかった&lt;/strong&gt;と思います。本当に基本的な数字だけを表示している、そんなサイトでした。&lt;/p&gt;
&lt;p&gt;やっていることは、&lt;strong&gt;東京都が公式で発表したデータを可視化した&lt;/strong&gt;ものです。可視化として凝ったものではなく、ただの棒グラフだったり、移動平均線が付いていたり、テーブルの形で検査陽性者の状況が出ていたり——&lt;strong&gt;本当にシンプルなものが並んでいるだけ&lt;/strong&gt;です。&lt;/p&gt;
&lt;h3 id=&#34;特徴-ソースコードが-oss-として公開されていた&#34;&gt;特徴① ソースコードが OSS として公開されていた
&lt;/h3&gt;&lt;p&gt;この活動が面白いと言っていただけた背景の一つに、&lt;strong&gt;サイトのソースコード自体が MIT ライセンスの OSS として公開されていた&lt;/strong&gt;ことがあるかなと思います。&lt;/p&gt;
&lt;p&gt;裏側は JavaScript でできているのですが、そのソースコードが全部 &lt;strong&gt;GitHub&lt;/strong&gt; で公開されている。誰でもアクセスでき、&lt;strong&gt;コピーして自分のパソコンで立ち上げることも、別のところにホスティングすることもできる&lt;/strong&gt;——そういう配布の仕方をしています。&lt;/p&gt;
&lt;p&gt;技術としては &lt;strong&gt;Vue.js&lt;/strong&gt; と、それを助けるフレームワークである &lt;strong&gt;Nuxt.js&lt;/strong&gt; を使っています。このあたりの選定も、&lt;strong&gt;自治体のサイトとしてはだいぶ尖っている&lt;/strong&gt;と言っていただいたところです。&lt;/p&gt;
&lt;h3 id=&#34;特徴-データもオープンデータで公開していた&#34;&gt;特徴② データもオープンデータで公開していた
&lt;/h3&gt;&lt;p&gt;棒グラフの下あたりに「&lt;strong&gt;オープンデータで入手&lt;/strong&gt;」というリンクがあり、クリックすると &lt;strong&gt;JSON の形でデータがダウンロードできる&lt;/strong&gt;ようになっています。&lt;/p&gt;
&lt;h3 id=&#34;受賞&#34;&gt;受賞
&lt;/h3&gt;&lt;p&gt;いろいろと賞もいただきました。もちろん受賞している主体は東京都です。&lt;strong&gt;グッドデザイン賞では大賞の候補まで残り、惜しくも大賞は逃した&lt;/strong&gt;のですが、金賞をいただいております。&lt;/p&gt;
&lt;p&gt;その&lt;strong&gt;受賞理由のコメントが非常に象徴的&lt;/strong&gt;だったのでご紹介すると——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;正確な情報を迅速に届けるため、様々な指標の情報やデータをグラフや表で分かりやすく掲載し更新していること。グラフや表などに活用しているデータをオープンデータとして公開していること。ソースコードも公開して、他自治体においても活用が可能な形にしていること。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;今まで前例はなかったけれど、やってみると非常に合理的だと思えること&lt;/strong&gt;を達成できたかなと。そこをグッドデザイン賞でも認めていただいたのは、それなりに良いことが達成できたのかなと思っています。&lt;/p&gt;
&lt;p&gt;あと個人的な話ですが、開発者として嬉しかったのが &lt;strong&gt;GitHub Trending&lt;/strong&gt; です。&lt;strong&gt;世界で総合1位&lt;/strong&gt;——1日だけだったと思いますが——を取れたのは、個人的にも嬉しかったです。&lt;/p&gt;
&lt;h2 id=&#34;62サイトへの横展開&#34;&gt;62サイトへの横展開
&lt;/h2&gt;&lt;p&gt;受賞理由にもあった「&lt;strong&gt;他自治体への展開&lt;/strong&gt;」ですが、実績としては &lt;strong&gt;62サイト&lt;/strong&gt;に展開されました。&lt;strong&gt;47都道府県すべてで一度は作られた状態&lt;/strong&gt;になりましたし、サンフランシスコや台湾など&lt;strong&gt;海外でも使われています。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そのうちいくつかは実際に&lt;strong&gt;自治体の公式サイトとして採用&lt;/strong&gt;していただき、運用が続いていると聞いています。&lt;/p&gt;
&lt;p&gt;それ以外は個人ベースやボランティア団体がやっているところもあって、&lt;strong&gt;データの更新に課題があって廃止されてしまったサイトもある&lt;/strong&gt;と聞いています。&lt;strong&gt;今までのシビックテックではそこまで到達できなかったので、あまり気にならなかった課題&lt;/strong&gt;なのですが、今回そういう課題も顕在化してきたので、次はそういうことがないように頑張りたいね、という反省が生まれたりしました。&lt;/p&gt;
&lt;p&gt;左が神奈川県版、右が北海道版です。&lt;strong&gt;ほぼそのまま採用いただいている&lt;/strong&gt;のですが、自治体ごとに工夫も入っていて、たとえば北海道版には&lt;strong&gt;日付のレンジを変えるつまみ&lt;/strong&gt;が入っています。全部オープンソースなので、&lt;strong&gt;自治体の都合や表示したいデータに合わせて改造が入る&lt;/strong&gt;わけです。&lt;/p&gt;
&lt;h3 id=&#34;なぜ横展開に意味があるのか&#34;&gt;なぜ横展開に意味があるのか
&lt;/h3&gt;&lt;p&gt;このコロナサイトが達成したことは「&lt;strong&gt;情報の伝達&lt;/strong&gt;」です。そして&lt;strong&gt;情報の伝達という課題は全国共通&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;それ以外の地域課題も、だいたい全国共通のものが多い。今までのシビックテックでも、「保育園がどこ空いているか分からない」とか、「&lt;strong&gt;ゴミナシ&lt;/strong&gt;」というアプリのように「ゴミはいつ出せるのか」「このゴミは何ゴミなのか」といった課題を、その地域用のアプリを作って解決する、というものがありました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;全国共通の課題が多いので、アプリの横展開は開発するときにだいたい考えることになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一番の理想&lt;/strong&gt;は——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;オープンデータが全国の自治体で完全に標準化されてどこにでもある&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ある地域課題を解くオープンソースのソフトウェアを&lt;strong&gt;一つ作る&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;あとは&lt;strong&gt;オープンデータを自治体ごとに入れ替えるだけで、その自治体用のアプリが完成する&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これがシビックテックの一つの理想かなと思っています。&lt;/p&gt;
&lt;p&gt;**ただ、実際にやろうとするとデータ側に課題が多い。**今回のコロナサイトでも、県が出しているデータが PDF だったという話も聞きました。データを出してはくれているけれど——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;フィールド名が違う&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集計しているものが違う&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形式が JSON だったり CSV だったり&lt;/strong&gt;バラバラ&lt;/li&gt;
&lt;li&gt;そもそも&lt;strong&gt;データとして公開していない&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;電子的に保存しておらず紙でしかない&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そういうデータも結構たくさんあるわけです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自治体側もそういうオペレーションを組むメリットが今まで取れなかったので、されてこなかった&lt;/strong&gt;ことかなと思います。しかし今回、**東京都は全面的にバックアップして、「サイトを表示するためにどういうデータが必要か」というところから都内でオペレーションを組んでくださった。**そこまでできるという実例ができたので、こういう活動もしやすくなっているかなと思います。&lt;/p&gt;
&lt;h2 id=&#34;技術選定の話&#34;&gt;技術選定の話
&lt;/h2&gt;&lt;p&gt;ここから開発の話に入ります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非常にざっくりした仕様からのスタート&lt;/strong&gt;でした。最初は本当に何もなく、どんなサイトになるかも分かりませんでした。決まっていたのは——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静的なサイト&lt;/strong&gt;である&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データごとに拡張する&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1日1回データが更新される&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表示したいデータは後で増える&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;いくつかページがある&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この断片的な情報から逆に設定していきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静的サイト → &lt;strong&gt;スタティックサイトジェネレーターでいいよね&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;1日1回更新 → &lt;strong&gt;GitHub Actions を組むか&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;データが増える → レイアウトは後でコンポーネントを追加しやすいよう&lt;strong&gt;細かいコンポーネントで作る&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ページが複数 → &lt;strong&gt;ルーティングができるフレームワークがいい&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;……ということで、&lt;strong&gt;Nuxt.js でいきましょう&lt;/strong&gt;と決まりました。&lt;/p&gt;
&lt;h3 id=&#34;nuxtjs-とは&#34;&gt;Nuxt.js とは
&lt;/h3&gt;&lt;p&gt;そもそもは &lt;strong&gt;Vue.js&lt;/strong&gt; というフレームワークがあって、&lt;strong&gt;Vue 製のアプリケーションをサーバーサイドレンダリングするフレームワーク&lt;/strong&gt;、というのが定義です。&lt;/p&gt;
&lt;p&gt;Vue.js は JavaScript で Web UI を開発するフレームワークの一種で、先ほど大野さんの話に出てきた React とちょうど同じ立ち位置です。React で開発するか、Vue で開発するか、Angular か、と。&lt;/p&gt;
&lt;p&gt;Vue も React と同様に&lt;strong&gt;コンポーネントごとに作って組み合わせていく&lt;/strong&gt;。コンポーネントは小さい単位で自己完結的に作られ、&lt;strong&gt;再利用可能&lt;/strong&gt;な形にします。今回で言うと、&lt;strong&gt;グラフを表示しているカード1枚1枚&lt;/strong&gt;、そしてその中の細かい部品も全部 Vue のコンポーネントで作りました。&lt;/p&gt;
&lt;p&gt;サーバーサイドレンダリングとは、多くのアプリケーションのように JavaScript を配信してブラウザでレンダリングするのではなく、&lt;strong&gt;あらかじめサーバーでレンダリングした HTML だけを配信する&lt;/strong&gt;ものです。&lt;strong&gt;ただ今回その機能は使っておらず、スタティックサイトジェネレーターの部分だけを使っています。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;nuxt-を選んだ本当の理由&#34;&gt;Nuxt を選んだ本当の理由
&lt;/h3&gt;&lt;p&gt;もう一つの大きな特徴として、&lt;strong&gt;Vue アプリケーション開発のベストプラクティスを「制限」としてフレームワークに組み込んでいる&lt;/strong&gt;ことがあります。&lt;/p&gt;
&lt;p&gt;Vue 自体は非常に薄く、規定の少ないフレームワークです。&lt;strong&gt;ファイルをどこに置くか、どういう名前にするか、どういう役割を持たせるか&lt;/strong&gt;は開発チームが決めることになる。ノウハウが共有されることもあまりないので、&lt;strong&gt;バラバラのまま作ってしまったり、開発チームが変わるとどこに何があるか分からなくなったり&lt;/strong&gt;する。&lt;/p&gt;
&lt;p&gt;Nuxt.js の場合は、**開発ニーズの8割以上を満たす設計ができるベストプラクティスを、あらかじめルールとして設けてしまっている。**それ以外をやろうとすると大変なのですが、&lt;strong&gt;そこを守ってさえいれば簡単に開発ができる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;たとえば HTML のページを1つ作りたければ、&lt;strong&gt;&lt;code&gt;pages&lt;/code&gt; ディレクトリの下に Vue ファイルを1つ置く。そのファイル名が URL のパスになる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;制限が強いのでできないこともあるのですが、&lt;strong&gt;今回はデータを表示するだけのサイトなので、Nuxt.js を使っても後で詰まることはないだろう&lt;/strong&gt;と考えて選定しました。&lt;/p&gt;
&lt;p&gt;さらに、&lt;strong&gt;ビルド関係の設定も内包している&lt;/strong&gt;という特徴があります。サーバーサイドレンダリング、スタティックサイトジェネレーター、SPA——**人力でやると非常に大変な切り替えが、1つの設定値やコマンドだけでできる。**ディレクトリ構造もはっきりしているので、**新しく来たコントリビューターが迷うことなく開発を始められる。**本質的な開発に集中するためにメリットのあるフレームワークです。&lt;/p&gt;
&lt;p&gt;……と、こう話すと合理的な選択に見えると思うのですが、もちろん「&lt;strong&gt;React でもいいじゃないか&lt;/strong&gt;」という話も当然出てきます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;なぜ Nuxt だったのか。実は文脈がありました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Code for Japan の活動で、&lt;strong&gt;避難所などの情報を地図にプロットして、それを紙に印刷して被災地に配る&lt;/strong&gt;——そういうことを支援するアプリを作っていた時期がありました。Web マップはネット回線や電源がないと使えないので、&lt;strong&gt;本当の被災地では役に立たない&lt;/strong&gt;んですよね。&lt;/p&gt;
&lt;p&gt;作ったのは&lt;strong&gt;2018年7月、西日本豪雨の水害&lt;/strong&gt;のときで、そのときは &lt;strong&gt;jQuery と Leaflet.js&lt;/strong&gt; で開発していました。「2018年にそのチョイスはなかなかない」と言われるかもしれません。ただ&lt;strong&gt;シビックテックのコミュニティは年齢層の高いエンジニアが多く&lt;/strong&gt;、集まった人たちも「&lt;strong&gt;jQuery だったら書ける&lt;/strong&gt;」という方が多かった。若い方ももちろんいましたが。それで機能したので「jQuery で良かったね」と言いながら作っていました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ただ、jQuery で作ると一つのファイルに巨大なコンポーネントを書かなければならなくなる。&lt;strong&gt;4〜5名で開発していても&lt;/strong&gt;コンフリクトが多発&lt;/strong&gt;したので、「もっと汎用的な作りにするときに何か導入しよう」ということで &lt;strong&gt;Nuxt.js&lt;/strong&gt; をそのときに選びました。&lt;strong&gt;そのときになぜ Nuxt だったのかの経緯は、私が選んだわけではないので分からない&lt;/strong&gt;のですが、&lt;strong&gt;そのチョイスがあったのでコミュニティの知識として Nuxt を使える人が結構多く、いけるんじゃないか&lt;/strong&gt;ということで選定した、という背景があります。&lt;/p&gt;
&lt;h3 id=&#34;ホスティング--netlify&#34;&gt;ホスティング ― Netlify
&lt;/h3&gt;&lt;p&gt;サイトは &lt;strong&gt;Netlify&lt;/strong&gt; でホストしています。&lt;/p&gt;
&lt;p&gt;一番最初は &lt;strong&gt;GitHub Pages&lt;/strong&gt; を検討していて、GitHub Actions で CI を組んでデプロイしようとしていました。&lt;strong&gt;ただ東京都の公式サイトということで証明書に制限があり、「この証明書でないといけない」という指定のものを GitHub Pages では使えなかった&lt;/strong&gt;——そういう理由で、&lt;strong&gt;Netlify ならできるのでやってみようか&lt;/strong&gt;となりました。当時から普通にホスト先として有名だったので、チョイス自体は普通だったと思います。&lt;/p&gt;
&lt;p&gt;リリースして数週間した&lt;strong&gt;3月22日、Netlify がコロナウイルス関係のサイトへのサポートを発表&lt;/strong&gt;して、&lt;strong&gt;有料プランを無償で提供する&lt;/strong&gt;ことになりました。今でも東京都のサイトの派生サイトはそちらでホストされているものが多いんじゃないかと思います。&lt;/p&gt;
&lt;h3 id=&#34;ui-コンポーネント--vuetify&#34;&gt;UI コンポーネント ― Vuetify
&lt;/h3&gt;&lt;p&gt;もう一つ、&lt;strong&gt;Vuetify&lt;/strong&gt; を使っています。Vue で使う、&lt;strong&gt;マテリアルデザインのスタイルをあらかじめ適用したコンポーネント群&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;対策サイトの部品は今でも結構これで作られていて、サイト全体は &lt;code&gt;v-app&lt;/code&gt;、メインコンテンツは &lt;code&gt;v-container&lt;/code&gt;、タブも &lt;code&gt;v-tabs&lt;/code&gt;、カード1枚1枚も &lt;code&gt;v-card&lt;/code&gt; でできています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;これは後で話しますが、Vuetify は当時アクセシビリティ的にあまり良くなかったらしく&lt;/strong&gt;、「Vuetify を使いましょう」と言ったのが私だったので、&lt;strong&gt;「Vuetify をなんで選んじゃったんですか」と後で怒られた&lt;/strong&gt;というのが発生して、ちょっと思い出深かったりします。今 Vuetify のサイトを見るとアクセシビリティ対応のチュートリアルがあったりするので、その辺は改善されているのかなと思います。&lt;/p&gt;
&lt;h2 id=&#34;ようやく可視化の話&#34;&gt;ようやく可視化の話
&lt;/h2&gt;&lt;p&gt;**一瞬で終わってしまうのですが、可視化はほとんど棒グラフです。**データの粒度は1日1本。&lt;/p&gt;
&lt;p&gt;その1日1本のデータを&lt;strong&gt;都庁内で取りまとめるオペレーション&lt;/strong&gt;が組まれていて、SharePoint に入力されているものを &lt;strong&gt;GitHub Actions などの CI で API 経由で取ってきて、&lt;code&gt;data.json&lt;/code&gt; に整形して、サイト側で読み込む&lt;/strong&gt;——そういう構造になっていました。&lt;/p&gt;
&lt;p&gt;取りまとめる際に&lt;strong&gt;複数部局に分かれているのでデータの反映タイミングがバラバラ&lt;/strong&gt;だったりして、初期はゴタゴタしたのですが、だんだんスムーズになっていった印象があります。&lt;/p&gt;
&lt;h3 id=&#34;なぜ-chartjs-を選んだか&#34;&gt;なぜ Chart.js を選んだか
&lt;/h3&gt;&lt;p&gt;チャートの部分は &lt;strong&gt;Chart.js&lt;/strong&gt; を使いました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;私自身は D3.js が好きなので、一瞬 D3.js でいこうかと思った&lt;/strong&gt;のですが——&lt;strong&gt;D3.js はご存知の通り学習コストが非常に高い。「生身のチェーンソーをそのまま振り回すようなものだ」と言われるくらい扱いが難しく、間違ったグラフを作ってしまいやすい面もある。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どれくらいのスキルの人たちが今後開発に参加してくれるか分からない状況では、間違ったグラフが作られにくい Chart.js を使いましょう&lt;/strong&gt;と、そこで理性を取り戻しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ただ、データの事情に合わせて特殊な対応が必要になったこともありました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;途中で算出基準が変わった&lt;/strong&gt;データがあったんですね。たとえば入院患者数は5月11日から基準が変わったのですが、そのとき「こういうふうに改変してくれ」という依頼が来る。&lt;strong&gt;Chart.js だと、この境界を示す枠線を出すだけで大変&lt;/strong&gt;だったりします。&lt;strong&gt;D3.js なら1〜2行でできるような処理&lt;/strong&gt;なのに。&lt;/p&gt;
&lt;p&gt;これは、今は学生インターンとして Code for Japan で大活躍している開発者が「&lt;strong&gt;線グラフとしてここに書けばいいんじゃないか&lt;/strong&gt;」と発想して、実際に&lt;strong&gt;線グラフとして矩形を表現&lt;/strong&gt;して回避しているらしいです。&lt;/p&gt;
&lt;h3 id=&#34;コンポーネント設計--スロット&#34;&gt;コンポーネント設計 ― スロット
&lt;/h3&gt;&lt;p&gt;カード1枚1枚を &lt;strong&gt;DataView&lt;/strong&gt; というコンポーネント（名前は適当だったのですが）にして、&lt;strong&gt;中身を後で入れ替えられるように&lt;/strong&gt;し、それを並べる、という基本構造を最初に作りました。&lt;/p&gt;
&lt;p&gt;Vue には &lt;strong&gt;slot&lt;/strong&gt; というものがあります。HTML は入れ子にできますが、&lt;strong&gt;その入れ子の中身を slot の場所にレンダリングする&lt;/strong&gt;という対応関係になる。それを利用して、&lt;strong&gt;中身だけ差し替えて、外側は同じ&lt;/strong&gt;という状況を作りたかったわけです。&lt;/p&gt;
&lt;p&gt;**実際に作ってみると、最初に想定していなかった場所に、想定していなかった注意書きなどを出したい、ということが結構ありました。**今だと6か所くらいに slot が刺さっている状態になっているのですが、&lt;strong&gt;あらかじめそういう構造にしておいて良かった&lt;/strong&gt;なと思っています。&lt;/p&gt;
&lt;p&gt;slot は1個だけだと困るので複数作ることができて、たとえば &lt;code&gt;description&lt;/code&gt; という名前で差し込むとそこに入る。&lt;strong&gt;拡張性と、見た目の統一の両方ができるように工夫して実装していました。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;実装中の祈りのような心の動き&#34;&gt;実装中の「祈りのような心の動き」
&lt;/h2&gt;&lt;p&gt;実装している間に&lt;strong&gt;祈りのような心の動き&lt;/strong&gt;が発生したのが印象的だったので、共有させていただきます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;今から考えると呑気すぎる話&lt;/strong&gt;なのですが、当時はどれくらい続くか、どれくらいの規模になるか全く分かりませんでした。&lt;strong&gt;リリースした日も感染者4人&lt;/strong&gt;だったんですよ。&lt;strong&gt;「長期化しないといいな、願わくば数ヶ月で収束してくれるといいな」&lt;/strong&gt;——それくらいの感覚でいました。&lt;/p&gt;
&lt;p&gt;ただ、エンジニアリング的にものを作るときは「大量のデータに対応できるように」と当然考えるので、そういう実装をしなければならない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;感染者数の表示に3桁区切りのカンマを入れる&lt;/strong&gt;という対応をしてくれた方がいて、それをマージするときに「&lt;strong&gt;でも、これ要らないといいですよね&lt;/strong&gt;」と言いながらマージした&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;棒グラフの横幅も、最初は固定幅でリリース&lt;/strong&gt;しました。今はスクロールバーで3月まで遡れますが、当時は&lt;strong&gt;どれくらい続くか分からないし、実装が必要なだけ長くなりそうだ&lt;/strong&gt;ということでスクロールなしでリリースした&lt;/li&gt;
&lt;li&gt;そして&lt;strong&gt;最近まで残っていたのですが、データの部分に「2020年」という年号が入っていなかったので、サイトが実は年を越せない&lt;/strong&gt;仕様になっていました。&lt;strong&gt;もうあと数日で1月1日を迎えますが、プログラムは「2020年1月1日のデータ」と誤読する&lt;/strong&gt;状態のまま、しばらく放置されていたという話があったりします&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;リリース直後--リポジトリが特定される&#34;&gt;リリース直後 ― リポジトリが特定される
&lt;/h2&gt;&lt;p&gt;3月3日の深夜にリリースされたのですが、&lt;strong&gt;その日のうちに Twitter で GitHub のリポジトリが特定されて拡散されました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;未だになぜ拡散したのか謎&lt;/strong&gt;なのですが、サイトのソースの変数名あたりからかな、と憶測を立てています。とにかく「東京都のサイトのソースコードがこんなところにある」と拡散された。リポジトリの中で立てていた issue に &lt;strong&gt;Figma の URL&lt;/strong&gt; もあったので、&lt;strong&gt;デザインも公開している&lt;/strong&gt;ということで、それも結構拡散されました。&lt;/p&gt;
&lt;p&gt;それ自体は喜ばしいのですが、&lt;strong&gt;Figma にアクセスが集中しすぎると人数制限で入れなくなってしまう&lt;/strong&gt;ので、&lt;strong&gt;当時コアで開発していたメンバーも入れなくなってしまった&lt;/strong&gt;ということがありました。&lt;/p&gt;
&lt;p&gt;そして「こういうことがあるなら自分の技術を活かしたい」と思っていただいて、既に立っていた issue にコミットしてくださる方も大勢いらっしゃいました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ただ当時は受け入れ体制が全くできておらず&lt;/strong&gt;、レビューの手順も決まっていない、誰がやるのかも決まっていない。&lt;strong&gt;取り込みが全然できず、皆さんの貢献したい気持ちにブレーキをかけてしまった&lt;/strong&gt;——これが当時、結構ストレスになっていたかなと思います。&lt;/p&gt;
&lt;p&gt;さらに、&lt;strong&gt;取り込むのに東京都の OK が必要なケースもある&lt;/strong&gt;ので、&lt;strong&gt;善意で立てられた issue でも取り込めるかどうか分からない&lt;/strong&gt;ケースがある。&lt;strong&gt;きわどいものに対して、そういう事情を分かっていない方がコミットするような動きも見えた&lt;/strong&gt;ので、結構ヒヤヒヤしていました。&lt;/p&gt;
&lt;h2 id=&#34;コミュニティの受け入れ体制を作る&#34;&gt;コミュニティの受け入れ体制を作る
&lt;/h2&gt;&lt;p&gt;そういうときに、&lt;strong&gt;開発コミュニティとして今まで蓄積してきた知見&lt;/strong&gt;も含めていろいろ対策を打ち、&lt;strong&gt;1週間後くらいにはレビューして取り込んでいける体制ができました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;具体的には大きく3つです。&lt;/p&gt;
&lt;h3 id=&#34;-行動規範とコントリビューションガイドの整備&#34;&gt;① 行動規範とコントリビューションガイドの整備
&lt;/h3&gt;&lt;p&gt;**これは実はリリースの瞬間には既にやっていました。**こういう行動規範は Code for Japan のイベントで普段から設けているもので、&lt;strong&gt;元々あったものを適用&lt;/strong&gt;した形です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;issue のテンプレート&lt;/strong&gt;も置きました。&lt;code&gt;.github&lt;/code&gt; の下にテンプレートの Markdown を置いておくと、誰かが issue を投稿しようとしたときに「&lt;strong&gt;こういう項目を書いてください&lt;/strong&gt;」という雛形が表示される。箇条書きの部分を埋めるだけで issue が投稿できるし、&lt;strong&gt;読む側もフォーマットが統一されているので何をやりたいのかが分かりやすい。&lt;strong&gt;こういうもので&lt;/strong&gt;コミュニケーションコストを下げていました。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;-lint-を-ci-にかける&#34;&gt;② Lint を CI にかける
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;開発環境を特に指定していなかった&lt;/strong&gt;ので、皆さんいろいろな環境で開発されていました。そうすると、&lt;strong&gt;行頭のスペースをいくつにするかといったコード規約を自動で整える処理がかからない&lt;/strong&gt;開発環境もある。&lt;/p&gt;
&lt;p&gt;そこは非常にしつこく、&lt;strong&gt;何回も CI にかけて&lt;/strong&gt;、そういう差分のせいで&lt;strong&gt;本来コミットしたかった開発が漏れてしまわないように&lt;/strong&gt;注意していました。&lt;/p&gt;
&lt;h3 id=&#34;-netlify-のデプロイプレビュー&#34;&gt;③ Netlify のデプロイプレビュー
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Netlify を使ってデプロイしていると、プルリクエストが来たときに「取り込んだ後のプレビュー環境」を自動で生成してくれる機能&lt;/strong&gt;があります。独自の URL が発行されて、そこで**取り込んだ後の挙動をチェックできる。**これは生産性を大きく向上させました。&lt;/p&gt;
&lt;h2 id=&#34;その道のプロが集まってきた&#34;&gt;その道のプロが集まってきた
&lt;/h2&gt;&lt;p&gt;参加者が増えていくと、&lt;strong&gt;その道のプロ&lt;/strong&gt;が集まってきてくださいました。2つだけ紹介します。&lt;/p&gt;
&lt;h3 id=&#34;アクセシビリティ&#34;&gt;アクセシビリティ
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;アクセシビリティのプロの方々が来て、このサイトのアクセシビリティを向上させてくれる&lt;/strong&gt;ということがありました。&lt;/p&gt;
&lt;p&gt;3月3日のリリース後、&lt;strong&gt;3月6日にオンラインでアクセシビリティのもくもく会&lt;/strong&gt;が開催され、&lt;strong&gt;このサイトのアクセシビリティの問題点を探し出そう&lt;/strong&gt;という催しが行われました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「公開処刑されるんじゃないか」と戦々恐々としていた&lt;/strong&gt;のですが、実際はすごくポジティブなマインドの方々が集まっていて、&lt;strong&gt;その後も継続的に改善に取り組んでいただきました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;……ただ「なんで Vuetify を採用したんだ」という怒られはこのときに発生した&lt;/strong&gt;ので、私にとってはちょっとトラウマ、というほどではないですが。&lt;/p&gt;
&lt;p&gt;このあたりの話は Code for Japan Summit で詳しくしていただいているので、ご興味ある方はそちらの講演を見ていただくと面白いと思います。&lt;/p&gt;
&lt;h3 id=&#34;多言語対応&#34;&gt;多言語対応
&lt;/h3&gt;&lt;p&gt;これもその道のプロが集まってくださって、&lt;strong&gt;最終的には5か国語に対応&lt;/strong&gt;することができました。&lt;/p&gt;
&lt;p&gt;Nuxt の中で &lt;code&gt;t&lt;/code&gt; で始まる文字列を書いておくと、対応を書いた JSON ファイルで自動的に置き換えられ、&lt;strong&gt;言語設定を変えるだけで、ソースコードに触れずに多言語化できる&lt;/strong&gt;——そういう状況を&lt;strong&gt;初期の段階で整えることができました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;あとは翻訳の文言を、いろいろな方がやってくださいました。&lt;strong&gt;これはオードリー・タンさんにも手を入れていただいたことがあって、結構話題になりました。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;これを普通にしていきたい&#34;&gt;これを「普通」にしていきたい
&lt;/h2&gt;&lt;p&gt;こんな感じで開発が進んでいきました。特に&lt;strong&gt;最初の1ヶ月&lt;/strong&gt;は私もかなりコミットしていたのですが、その時点で既に**各分野の詳しい方が入ってきてくださっていて、「私なんかが出る幕じゃないな」**と。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学生の活躍もかなり素晴らしく&lt;/strong&gt;、先ほどの国際化（i18n）も&lt;strong&gt;音頭を取ってくれたのは学生&lt;/strong&gt;だったりしました。&lt;/p&gt;
&lt;p&gt;私が思ったのは、&lt;strong&gt;今回の活動を、今後は「普通」にしていきたい&lt;/strong&gt;ということです。&lt;/p&gt;
&lt;p&gt;今回の東京都の対応は結構素晴らしかったと思いますが、&lt;strong&gt;実際にやってみると、オープンソースでオープンデータでこういうことをやるのは、すごく合理的&lt;/strong&gt;なんですよね。&lt;strong&gt;こういう合理的な事例があったということ自体をベースにして、次の活動ではそれをどんどん超えていくようなことをやっていきたい&lt;/strong&gt;と思います。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;エンジニア視点であのサイトの開発をまとめると、&lt;strong&gt;シビックテックのベストプラクティスと呼べるものが浮かび上がってきた&lt;/strong&gt;かなと思いました。&lt;/p&gt;
&lt;p&gt;個人としては、&lt;strong&gt;今後の事例の足掛かりとして、次のプロジェクトではもっとより良いものを目指していきたい&lt;/strong&gt;と思っています。&lt;/p&gt;
&lt;p&gt;長くなりましたが、以上で終わります。ありがとうございました。&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
