開発に集中するためのChrome拡張を作りました！

個人開発をしていて、全く開発せずに1日中Twitterをしている日がありました。
もしこれが受託開発だったらヤバいですよね...。

このSNS問題については僕だけではなく、色々な人から話を聞くことがあり、なんとか解決したいなーとずっと思っていました。

開発や仕事に支障が出ないように、Twitterときちんと付き合うためのサービスを色々と探していたのですが、自分が求めているサービスが見つからなかったので[Chrome ExtensionのAPI](https://developer.chrome.com/extensions/api_index)を使ってクローム拡張アプリ**「BLOCK CLOCK」**というサービスを自作しました。

今更感はありますが、Chrome Extensionの情報などを共有したいと思います。

以下のリンクからインストールのできます↓↓（Chromeのみになります...:bow:）
[BLOCK CLOCK - ChromeWebStoreサイト](https://chrome.google.com/webstore/detail/block-clock/dpaphncmnicljlnlohmebcedbfiodhck)

## **作ったもの**

[BLOCK CLOCK - 仕事の時間をSNSから守るクローム拡張](https://tech-portfolio.org/block_clock/
)

【LP】
<img width="1278" alt="スクリーンショット 2018-04-25 13.24.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/253921/72483e6d-4353-ba5e-5462-047bb17a3978.png">



【拡張アプリのイメージ】
<img width="1280" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/d5c666f8-15bc-0f14-fe7a-046573262068.png">

【仕事中にSNSを開いてしまった時のページ】
![1280-800_3.png](https://qiita-image-store.s3.amazonaws.com/0/147291/e981a736-20fd-a325-35de-b0b523137fc3.png)

【動作イメージ】
![ezgif-3-d6a1c8ee62.gif](https://qiita-image-store.s3.amazonaws.com/0/147291/8c83e3eb-d666-5fee-476b-eec69aeefaa3.gif)

## **「BLOCK CLOCK」の機能**

### **ざっくり説明**

* 「START」のボタンを押すと25分間SNSが見れなくなります。
* 25分経過すると5分間の休憩になりにSNSが見れるようになります。
* 途中であっても「THE END」を押せば強制的に終了することができます。
* 経過時間と共にアイコンが残り時間を表示してくれます。
* 「仕事」と「休憩」と「終了」の通知をしてくれます。
* 通知はpush機能を実装しているので他のアプリで作業していても通知されます。
* 見れなくなるSNSは以下になります。
    * Twitter
    * Facebook
    * Instagram
    * Youtube
    * amazon

【状態の遷移】
![1280-800_2.png](https://qiita-image-store.s3.amazonaws.com/0/147291/8d84b897-7adf-b594-7912-bd2c1a0ab82a.png)

### **なぜ25分なのか？**

>「ポモドーロ・テクニック」という時間管理術があり、短時間の作業と休憩を繰り返すというシンプルな方法ながら、きちんと実行すれば驚くほど生産性を上げることが可能です。
ポモドーロ・テクニックの方法とは、短めの作業と短い休憩を繰り返すことです。具体的には「25分の作業＋5分の休憩」を1ポモドーロとし、これを繰り返します。

ポモドーロに合わせてタスクも細かく区切ると、作業時間を見積もりやすくなり、タスクの優先順位や目標を正確に設定できるそうです。エンジニアやデザイナーなどクリエイティブで高い集中力が必要な人を中心に取り入れられているそうなので、25分という時間を採用しました。

### **こだわり**
今回のサービスは英語圏内の人たちに向けてリリースしたいという思いがあり、言語は英語を使用しています。そしてこのサービスは説明を見なくても、使い方がわかるようなUIを心がけてデザイン・設計をしています。

## **使っている技術**
* **JavaScript**
    * [JavaScript APIs](https://developer.chrome.com/apps/api_index) → chromeを操作するAPIが多数呼び出せる。
    * [JQuery](https://jquery.com/) → これなしではやっていけない...。
    * [Push.js](https://pushjs.org/) → ブラウザのプッシュ機能を超簡単に実装できるプラグイン


* **CSSフレームワーク**
    * [SemanticUI](https://semantic-ui.com/) → Bootstrapよりも種類が豊富です！好みにもよりますが、BootstrapよりもSemanticUIのフレームワークが好きになりました。

このアプリについてはサーバとの通信していない（CDNも含め）ローカルアプリになっています。

## **仕組み**

最初開発するときに、Chrome Extensionがどのような仕組みになっているのかがわからなかったので、わかりやすいように図化しました。

![仕組み.jpg](https://qiita-image-store.s3.amazonaws.com/0/147291/bbd7cf48-9260-df29-cfc4-f151a6b3171d.jpeg)

ブラウザの裏で処理をしているbackground.jsと、ポップアップの裏で処理をしているmain.jsが異なりそれぞれに呼び出せるAPI、できる処理に制約があります。

その辺りのことを @k7aさんがとても丁寧にまとめてくれているので、今回は割愛します。以下の記事を読めば簡単な拡張アプリは作れると思います。僕も参考にさせていただきました。ありがとうございました。:bow:
[Chrome拡張の開発方法まとめ　その1：概念編](https://qiita.com/k7a/items/26d7a22233ecdf48fed8)

## **サンプル**
「自分でChrome拡張を開発したい！」という人向けにサンプルを公開しました。実際に動かしてみるほうが理解できると思うので、インストールして動かしてみてください。手順は以下にまとめました。

[Github - サンプルソース](https://github.com/FujiyamaYuta/chrome_extensions_SemanticSample)

### サンプルを動かす手順

①[Github](https://github.com/FujiyamaYuta/chrome_extensions_SemanticSample)から適当なディレクトリにクローンする。

②Chromeを立ち上げ右のボタンを押した後、「その他のツール」→「拡張機能」を開く
<img width="517" alt="スクリーンショット 2018-04-25 17.09.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/a370644a-7436-a814-c307-b92b3b44f9c7.png">

③拡張機能のページが開くので「デベロッパーモード」をONにして「パッケージ化されていない...」を選択
<img width="1279" alt="スクリーンショット 2018-04-25 17.10.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/295cdfc5-05c5-35a6-cbe9-7aa199aaa0d9.png">

④Githubからクローンしたソースをそのままを読み込む
<img width="577" alt="スクリーンショット 2018-04-25 17.11.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/5c3b25d1-26f1-0772-4cad-e9a2661dc0ba.png">

⑤QiitaのアイコンがChromeに表示されるため、押すとpopup.htmlが表示される。
![ezgif-3-9ab60113cc.gif](https://qiita-image-store.s3.amazonaws.com/0/147291/7e27dfa8-aefc-8629-97a8-98bc015a8223.gif)

「START」が押されたときのイベントで状態(status)を保持します。「THE END」が押された時のイベントでストレージを解放して状態を戻します。簡単な拡張アプリですが、これを応用すれば、アプリとしての幅が広がるため色々できると思います。

## **何のために作ったのか？**
「BLOCK CLOCK」は個人開発をしている人、受託で一人で作業をしている人の**大切な時間**をSNSから守るために作りました。SNSをしている時間が「悪」だとは思っていませんが、集中したいときなどにSNSはそれを阻害する大きな要因になっています。

一人で開発をしている人のライフハックがもっと豊かに、充実させるために、ぜひ一度「BLOCK CLOCK」を使ってみてください！そしてTwitterと、いい距離感で付き合っていきましょう！

[BLOCK CLOCK - ChromeWebStoreサイト](https://chrome.google.com/webstore/detail/block-clock/dpaphncmnicljlnlohmebcedbfiodhck)

## **参考**
以下の記事を参考にさせていただきました:bow:ありがとうございます。

[生産性がグングン上がる！「ポモドーロ・テクニック」って知ってる？](https://next.rikunabi.com/journal/20161026_m1/)

[世界一簡単にブラウザのプッシュ通知を実装できる「Push.js」の使い方を徹底解説]
(https://ferret-plus.com/6035)