0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人開発】インストール不要で使える「マルチカウンター」を作った

0
Posted at

複数の項目を同時にカウントできるWebアプリ「マルチカウンター」を作りました。

単純なカウンターですが、

  • 複数カウンターの管理
  • 最大50個まで追加
  • PC・スマートフォン対応
  • LocalStorageへの保存
  • URLによる複数端末での共有
  • 閲覧専用URL
  • 変更履歴
  • CSVエクスポート
  • 直近7日間のグラフ
  • タイマー連動

など、実際に使うことを考えて機能を追加しています。

この記事ではアプリの紹介だけでなく、Webアプリとしてどのような考え方で作ったのかも簡単に紹介します。


作ったもの

今回作ったのは、ブラウザだけで使えるシンプルなマルチカウンターです。

例えば、

商品A    12
商品B     8
商品C    25

のように複数の項目を1画面で管理できます。

それぞれの項目には「+」「−」ボタンがあり、クリック・タップするだけで数値を変更できます。

スマートフォンでも利用できるため、PCの前で使うだけでなく、現場で数をカウントするといった用途も想定しています。


なぜ作ったのか

カウンター自体は非常に単純なアプリです。

JavaScriptなら、

let count = 0;

function increment() {
    count++;
}

function decrement() {
    count--;
}

だけでも基本的なものは作れます。

ただ、実際に使おうとすると、

複数の項目を管理したい

ブラウザを閉じても値を残したい

スマートフォンからも使いたい

他の人と同じカウンターを共有したい

後から履歴を確認したい

といった要求が出てきます。

そこで「単純なカウンターを、実際に使えるツールにする」という方向で機能を追加していきました。


通常モードはLocalStorageに保存

設計上ひとつ意識したのが、

共有する必要がないデータまでサーバーに保存しない

ということです。

通常利用ではブラウザのLocalStorageを利用します。

イメージとしては、

const counters = [
    {
        id: 1,
        name: "商品A",
        count: 12
    },
    {
        id: 2,
        name: "商品B",
        count: 8
    }
];

localStorage.setItem(
    "multiCounters",
    JSON.stringify(counters)
);

読み込むときは、

const data = localStorage.getItem("multiCounters");

const counters = data
    ? JSON.parse(data)
    : [];

というシンプルな構成です。

これによって通常モードでは、

ブラウザ
   ↓
LocalStorage

だけで完結します。

サーバーとの通信が必要ないため、ちょっとしたカウンターとしてすぐに利用できます。


LocalStorageだけでは共有できない

一方でLocalStorageには当然ながら、

別のPCやスマートフォンから同じデータを見ることができない

という問題があります。

例えば、

PC
 └─ LocalStorage A

スマートフォン
 └─ LocalStorage B

は完全に別のデータです。

そこでマルチカウンターでは、

通常モード
    ↓
LocalStorage

共有モード
    ↓
Server

と保存先を分けています。


URLを使った共有モード

共有機能を有効にすると、共有用のURLを発行します。

イメージとしては、

PC
 │
 │ HTTPS
 ▼
Server
 ▲
 │ HTTPS
 │
Smartphone

という構成です。

これによって、PCで変更したカウントをスマートフォン側から確認するといった使い方ができます。

イベントなどで複数人が同じ数字を確認・更新したいケースを想定しています。


編集URLと閲覧専用URLを分ける

共有機能ではもうひとつ、

編集できる人と見るだけの人を分けたい

という問題があります。

そこで、

編集用URL
    ↓
カウント変更可能

閲覧専用URL
    ↓
表示のみ

という形でURLを分けています。

例えばイベントであれば、

スタッフ
   ↓
編集URL

管理者・確認担当
   ↓
閲覧専用URL

といった運用ができます。

単純な機能ですが、共有ツールとして使う場合には意外と重要な部分です。


カウンターは最大50個

カウンターは最大50個まで追加できるようにしています。

無制限でも実装できますが、ブラウザ上で扱うツールなので、現実的な利用範囲を考えて上限を設定しました。

例えば、

商品A
商品B
商品C
商品D
...

のような在庫チェックにも使えます。

カウンターごとにタイトルを変更できるので、用途自体は限定していません。


CSVエクスポート

ブラウザ上だけで完結すると便利ですが、

「最終的にはExcelなどで使いたい」

というケースもあります。

そのためCSVエクスポートにも対応しました。

Webアプリの場合、CSVデータをBlobとして生成すればブラウザからダウンロードできます。

例えば、

const csv = [
    ["name", "count"],
    ["商品A", 12],
    ["商品B", 8]
]
.map(row => row.join(","))
.join("\n");

const blob = new Blob(
    [csv],
    { type: "text/csv;charset=utf-8;" }
);

const url = URL.createObjectURL(blob);

といった方法です。

小さな機能ですが、

Webアプリで記録
       ↓
CSV
       ↓
Excel等で集計

という流れを作れます。


変更履歴も保存

カウンターは現在値だけを見ると、

商品A:25

しか分かりません。

しかし実際には、

10 → 11
11 → 12
12 → 11
...
25

という操作があります。

そこで変更履歴を確認できるようにしました。

「現在いくつなのか」だけでなく、

いつ、どのように数字が変化したのか

を後から確認できます。


直近7日間をグラフ表示

履歴データを利用して、直近7日間の合計もグラフで確認できるようにしました。

例えば、

月  █████       5
火  ████████    8
水  ███         3
木  █████████  10

のように、単純な現在値だけでは分からない変化を見ることができます。

カウンターと履歴を組み合わせると、

「ただ数字を増減するツール」

から、

「簡単な記録ツール」

としても利用できるようになります。


タイマーとカウンターを連動

個人的に少し面白いと思っているのがタイマー機能です。

タイマー終了時に指定したカウンターへ自動的に加算できます。

例えば、

30分タイマー開始
      ↓
30分経過
      ↓
勉強回数 +1

という使い方ができます。

単純なカウンターとタイマーを組み合わせることで、Pomodoro的な使い方にも応用できます。


レスポンシブ対応

Webアプリとして作った理由のひとつが、端末を限定したくなかったことです。

Windows PC
Mac
iPhone
Android
Tablet

など、ブラウザがあれば基本的に利用できます。

特にカウンターは現場でスマートフォンから使うケースも考えられるので、PCだけではなくスマートフォンでの操作性も意識しています。


Webアプリにしたメリット

この程度のツールであれば、ネイティブアプリとして作る方法もあります。

ただ今回はWebアプリにしたことで、

インストール不要
会員登録不要
OSへの依存が少ない
URLを送るだけで使える
アップデート配布が不要

というメリットがありました。

特に小さなツールの場合、

「インストールしてもらう」という行為自体が利用開始のハードルになる

と感じています。

URLを開けばすぐ使えるというのは、Webアプリの大きなメリットです。


シンプルなツールでも作ってみると意外と考えることが多い

最初は単純なカウンターでしたが、実際に使えるようにしていくと、

データをどこに保存するか
      ↓
別端末とどう共有するか
      ↓
編集権限をどうするか
      ↓
履歴をどう扱うか
      ↓
データをどう外部に出すか
      ↓
スマートフォンでどう操作するか

など、いろいろな設計が必要になりました。

特に今回面白かったのは、

LocalStorageで完結するモードと、サーバーを利用する共有モードを分けたこと

です。

すべてをサーバー保存にするのではなく、必要な場合だけサーバーを使う構成にしています。

小さなWebアプリですが、LocalStorage、データ共有、権限、履歴、CSV、レスポンシブUIなど、Web開発のいろいろな要素を試すことができました。


実際に公開しています

マルチカウンターは無料で公開しています。

アカウント登録やインストールは必要ありません。

ブラウザからそのまま利用できます。

在庫管理、イベント人数、作業件数、勉強、筋トレなど、何かを数える場面があれば試してみてください。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?