誰でもQiita投稿のtypoをチェックできるようにNowでlint機能を公開しました

予定通りならば、[先週にtypoチェック機能へtextlintを追加した話を投稿したはずです。]

最近の投稿はそれを使って私が個人的趣味で編集リクエストを出しているのですが、
やっぱり古い記事のtypoも気になるわけで。
でも古い記事の保守判断って外部からは難しいので…

いっそ自主的にできる環境があればいいのかなあと思いました。[^1]

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/a9775a7f-6321-6df4-1818-0e1a2cbf6fa5.png)

[Qiita Typo Checker](https://qiita-typo-checker.now.sh/)
(無料どころの例に漏れずスリープするのでアクセスは遅いです:confounded:)

[khsk/Qiita-typo-checker-zeit: Qiita-typo-checkerをユーザー指定と任意テキストに限定したWebアプリとしてzeitにデプロイします](https://github.com/khsk/Qiita-typo-checker-zeit)

ということでコードをいじって、Webアプリケーションフレームワークを導入してブラウザから使えるようにしてみました。

機能はSlackに投げていたもの以上のものではないので、アプリやZEIT周りのお話をば。

[^1]: 嘘ですZEIT使ってみたかっただけです。

# スクリーンショット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/8d9494f6-e560-5190-a43b-7792f2ceb92a.png)

デザインは投げ捨てるもの。

(@khskの投稿は諸事情で除外しており、@Qiitaにもヒットがなかったので、スケベなら心が広いだろうと人柱に使わせてもらいました)

# 使ったもの

* [Now](https://zeit.co/now)(ZEIT)
* [Micro](https://github.com/zeit/micro)
* [pug](https://pugjs.org/api/getting-started.html)(jade)
* [Materialize](https://materializecss.com/)


# [Now](https://zeit.co/now)

デプロイ先を何にするかはいつも迷います。
Herokuはbotで使っていますし、
何よりクレカ登録無しの完全無料枠という制限がいつも厳しい。
今回はNode.jsなので
[Glitch - The Friendly, Creative Community](https://glitch.com/)
も考えていましたが、

* [Now でクラウドの複雑さから解放されよう、今すぐに - Qiita](https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50)
* [now: リアルタイム・グルーバル・デプロイメント - Qiita](https://qiita.com/nkzawa/items/8bf62549f79ebbcaafd8)

が気になっていたのと、
**固定URLが簡単に作れる**ことが決め手となりNowにしました。

[Now – Realtime Global Deployments](https://zeit.co/now)

(余談ですが、ここを書くまでZEITがサービスでnowがデプロイ用のCLIツールの名前だと思っていました(だからRepository名もzeit))

[後者の記事のOSSプランの解説はおそらく古くて](https://qiita.com/nkzawa/items/8bf62549f79ebbcaafd8#%E3%83%97%E3%83%A9%E3%82%A4%E3%82%B9)、

>|OSSプラン|PREMIUMプラン|
|:-------:|:---------:|
|20 フリーデプロイ / 月|1000 デプロイ / 月|
|1GB フリー回線容量 / 月|50GB 回線容量 / 月|
|1GB フリーストレージ|100GB ストレージ|
|フリーバックアップ|フリーバックアップ|
|ファイル毎に1MBサイズ制限|ファイルサイズ制限なし|
|ダイナミック・リアルタイム・スケーリング™|ダイナミック・リアルタイム・スケーリング™|
|カスタムドメインなし|カスタムドメイン対応|
|オープンソースのデモや授業、チュートリアル、テストに最適|商業アプリやAPIを作る開発者に最適|
|/_src ページは常に公開|プロジェクトはデフォルトで**非公開**|
|**永久にフリー！**|**$14.99 / 月**|

[ZEIT – Your Plan](https://zeit.co/account/plan)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/cb33b224-9e15-2bc1-e324-14df5055525a.png)

特に今はデプロイが無限回のようです:tada:

ソースコードは公開されるのですが、隠したい情報は環境変数やSecretに入れられるので、.envファイルで管理していたようなトークン類はこちらで代用できました。

[ZEIT – Environment Variables and Secrets](https://zeit.co/blog/environment-variables-secrets)

URLのaliasもJSONで簡単に設定できます。

```now.json
{
    "name":  "qiita-typo-checker",
    "alias": "qiita-typo-checker.now.sh",
    "env": {}
}
```

[Frequently Asked Questions - ZEIT Documentation](https://zeit.co/docs/other/faq)

`now alias ～`コマンドでも手動で設定できるのですが、ですが？
`now.json`で記述しても手動で`now alias`を打たなければ反映されないようです。
そしてすでに同じaliasでインスタンスが立っていた場合は自動的に新しいインスタンスに置き換わり、古いのはスリープするようです。

なので、参考資料のように
`now && now alias && now rm my-app --safe --yes`
とすると古いインスタンスを消しながら、すぐに最新の状態を一つのURLでチェックできます。

Glitchとの違いとして、メールアドレスでアカウントを作れることと、Gitが必須ではないところが大きいです！

**自分のようなズボラでも本当に複雑さなしにデプロイできるので、非常にありがたい。**
複雑さって機能自体じゃなくて、アカウント作成やremoteにpushする。みたいな(普通のITエンジニアなら)常識的な部分でも挫折・躓くことがあるので…

>now doesn't require you to install certain applications in order to get started.
>
>    No need to install git or source control
    No need to setup keys/tokens
    No complicated cloud provider setup or registration

:+1:


# [Micro](https://github.com/zeit/micro)

Webアプリケーションなので、サーバーサイドを考えなければ…
昔Hapiを使ったりしましたが、なんだかんだ言ってもExpress
[Express - Node.js Web アプリケーション・フレームワーク](http://expressjs.com/ja/)
に落ち着くような感じがしてました。
しかし、

* [Node.js でちょっとしたサーバーサイドやるなら、 Micro が良いかも - Qiita](https://qiita.com/acro5piano/items/d421e2d41ee15e20e1de)

を思い出し。
同じZEIT製なので相性は良いだろうと採用です。
記事にもありますが、ログ表示がイケてます。

採用といっても
[pedronauck/micro-router: A tiny and functional router for Zeit's Micro](https://github.com/pedronauck/micro-router)
を追加してルートにgetとpostするだけなので、なんでもいいレベルなんですけどね。

```index.js
const { get, post, router } = require('microrouter')
const checker = require('./checker')
const pug = require('pug')
const compiledFunction = pug.compileFile('template.pug')

module.exports = router(
  get('/', () => compiledFunction()),
  post('/', checker.main),
  () => 'not found',
)
```

言及できるほど使っていないことが一目瞭然なので、ログがイケてたよとだけ。

# [pug](https://pugjs.org/api/getting-started.html)

HTMLを表示する必要があったので、テンプレートエンジンを探しました。
ここは予想外に、これといった決定版はないようで、
「よく使われている」「優れている」という観点ではなく、
「覚えれば他の言語でも流用できる」という点から

pug(旧Jade)にしました。
[Getting Started – Pug](https://pugjs.org/api/getting-started.html)
記法をJadeで探したりと少し手間取ったりはしましたが、変数の初期化

```
- items = items || []
- userId = userId || ''
- itemId = itemId || ''
```
さえ覚えておけばあとはすらすら書けたと思います。

* [jadeがpugになって変わった所のメモ - かもメモ](https://chaika.hatenablog.com/entry/2016/12/20/172550)

# [Materialize](https://materializecss.com/)

デザインは投げ捨てると言いましたが、それとなく、クラス指定程度の装飾はお茶濁しのために施しておきたい。

というので、なにか使ったことがないものから適当に。
[Documentation - Materialize](https://materializecss.com/)

[Material Design Lite](https://getmdl.io/index.html)
と名前がややこしい…

特筆することはないかな？
Materialize固有ではないですが`.col.s6.m6`でカードが2段組に出来たのは嬉しかったです。

***

ただ、テンプレートエンジン考えてCSSフレームワーク考えて～
となると、Vue.js入れてVue.jsのライブラリ、
[Element - A Desktop UI Toolkit for Web](http://element.eleme.io/#/en-US)
などに乗っかるほうが結果的に簡単でよかったのかな？と思いました。

# [Coolors](https://coolors.co/)

CSSフレームワークを使って、使わない場合より見辛くなることはそうそうないとは思うのですが、
既定色のカード背景に合う文字の色を何にすればいいのかわからなくて、これを使いました。

[簡単便利な配色ツール「Coolors」色選びに重宝します | 創kenブログ](https://souken-blog.com/2017/12/19/coolors/)

一色固定すれば残りが相性の良い色になるらしく…
濃い緑に対してテキストをオレンジ、赤、ベージュっぽい色にしてみましたが、大丈夫でしょうか？

色彩もなかなか奥深いので、こういうツールは助かります。


# [いいねボタン ツイートボタン ソーシャルボタン まとめて設置](http://comtopia.jp/sns_btn/)

ブログやwebサービスでよく見かけるソーシャルボタンってどうやって設置するのかな？
と気になったので探してみたら、一括で作れるものがありました。
なるほど、便利。
pugはエスケープ`|`すればそのままのHTMLが書けるので、これをぺろっと貼り付け。

ただ、`now`は`https`で提供されているのですが、ソーシャルのアイコンなどが`http`なので、完全な`https`にならずブラウザで警告が出ていました。
しかし、今どきのソーシャルは`https`に対応しているだろう。
と、このサイトで作られるコードの`http:`を`https:`に置換してやると、画像が表示されたまま、ブラウザの警告も消えました。
覚えておきたいです。

# Qiitaアクセストークン

QiitaAPIは未認証では1時間で60回。
一回で100件取得するので、大雑把に6000件しか見れません。…しか？
複数人が使うとオーバーすることが見込まれたので、開発にも便利ですしAPIトークンを使うことにしました。
最初は
[QiitaのユーザーフィードをRSS化するサービスを公開しました。 - Qiita](https://qiita.com/potato4d/items/bbfcfdc1d80f7efa5538)
のようにユーザーに自分のトークンを入れてもらおうと考えていました。
でも、まあ、こんなサービスに自分ならわざわざトークン取得してまで使うか？と考えると、面倒でバイバイしそうだったので、自分のトークンを使うことにしました。

弊害として

[QiitaのAPIをアクセストークン付きで使用すると、通常のitem検索でも限定共有記事が検出される - Qiita](https://qiita.com/khsk/items/bc9640b0e04bffd6a978)

という問題も出ましたが、私が気をつければ…
(多分居ないと思いますが、ユーザーIDに`khsk`文字列が入っている方は弾かれると思います)

# 制限事項

複数人での同時検索をテストしていません。nowがどの程度の性能なのかは未知数です。

また、

[Qiitaのあれこれをひたすら分析してランキング#ユーザ別記事数ランキング - Qiita](https://qiita.com/t_nakayama0714/items/07ce8bf3501268f96fe3#%E3%83%A6%E3%83%BC%E3%82%B6%E5%88%A5%E8%A8%98%E4%BA%8B%E6%95%B0%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0)

のトップ3

|ランク|ユーザ名|記事数|Contribution数|Top記事|
|:---:|:---:|:---:|:---:|:---:|:---:|
|1|@7of9|5035|3906|[Qiita &gt; 「いいね」機能についての要望](https://qiita.com/7of9/items/33dad67c522ebf1ff0a5)|
|2|@tukiyo3|1555|9301|[たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ](https://qiita.com/tukiyo3/items/58b8b3f51e9dc8e96886)|
|3|@tbpgr|728|7240|[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)|

のうち、1位と2位の方は検索すると502が返ってきました。
nowのログにも何も書かれておらず、タイムアウトなのかなんなのか、原因は不明です…
3位の方の728件はチェックできたので、投稿内容にも依るんでしょうが、700件ぐらいの投稿数はチェックできる。
また、ユーザーの99%はそのままチェックできると言えそうです。

数が多すぎる方もcreatedクエリーなどで投稿数を絞れば出来そうですけどね。

***

ということで、[Free online spelling and grammar check](https://www.online-spellcheck.com/)かのようなものを公開したお話でした。
typo修正ってプリミティブな楽しさがあるので、年に一回の大掃除的に思い出して使ってもらえると、こんな物でも誰かの役に立てるとしたらそれはとっても嬉しいなって思ってしまうのでした。


[先週にtypoチェック機能へtextlintを追加した話を投稿したはずです。]:https://qiita.com/khsk/items/8aae69170296495db4f2