Firebase

Written by じび on 6月 7th, 2019

中島聡さんのメルマガを購読していますが、Google I/O に参加した成果として、Firebase の良さを知ったとのこと。
今までは、サーバー側のシステムを作るのに、別の人に頼まないといけなかったのが、自分でサクサクと作れてしまうらしい。

早速、以下のようなゲームのサービスを作って見たとのこと。
https://tourneygames.com/play/be7eMqKVNtydv0mJrUah

  • React.js + Firebase で開発
  • NoSQL Database(firestore) + サーバーレス(firebase + Cloud Functions)上に作られている。
  • ユーザー数が100万人に増えても勝手にスケールしてくれる。そんなスケーラブルなサービスが、Firebase だとあっさりと作れてしまう。

今まで、自分で作るアプリはサーバーが不要なものだけだったけど、これでサーバー側もいけるかも。

ちょっと調べてみよう。

 

現場で役立つシステム設計の原則

Written by じび on 5月 29th, 2019

【未完成】
借りて読んだので内容を簡単にまとめました。
基本的に Web アプリケーション向けの内容なのですが、随所に他のシステムでも役に立ちそうな Tips が入ってます。

第1章 小さくまとめて分かりやすくする

ValueObject

  • 業務専用の型
  • 電話番号なら String ではなく TelephoneNumber 型を作って、長さなどの制限する。
  • 完全コンストラクタ(初期化時に値が決まり、以降変更できない。Immutable みたいなもの)にすると、コードを読む時に値の変化を気にする必要がなくなる。
  • 金額と数量はどちらも Int で表せるが、それぞれ独自の型を作っておくと誤った代入をコンパイル時に検出できる。
  • typedef のような型を別名で定義するのと比べて、コンパイル時に上記のような型誤りの検出が可能。
  • int はプログラミング言語の関心ごとで、金額や数量の型は業務の関心ごと。

コレクションオブジェクト

  • List や Array のプロパティを1つだけ持ち、それの操作メソッドを持つ。
  • immutable にする
  • 操作の結果は、同じ型のコレクションオブジェクトとして返す。

第2章

  • 早期リターンを使って if 文の else 節を排除すると、コードの見通しが良くなる。
  • インターフェイス宣言(Swift なら protocol)と区分ごとの専用クラスを組み合わせて、多態(Polymorphism)を実現する。
  • 区分オブジェクト:列挙型を使って業務で扱う区分の一覧を宣言する。

第3章

  • 共通関数は汎用的にするために、引数が増えたり似たメソッドが増える。そのため、使う方は、自分に関係ない引数を意識したり、似たようなメソッドの中から自分のニーズにピッタリ合った物を探す手間がかかる。
 

アルゴリズムは使用するプログラミング言語に引きづられる

Written by じび on 10月 9th, 2018

某所で5分以内にプログラムを考えるという課題がありました。

最初にプログラミング言語を選択するのですが、最近は swift ばかりなので swift を選択しました。

その後に出たお題は「文字列を逆順にする。ただし、プログラミング言語にある逆順にする命令などは使わないこと」というものです。

そこで私の思考は、以下のようになりました。

  1. 文字列は文字の配列
  2. 配列を処理するならイテレータ
  3. 先頭から文字をとっていき、新しい配列の先頭にインサートしていけばいける

IDEなしだったので、仮想コードですが、以下のような感じに書きました。

let src = "hogemoge"
var dest = ""

for char in src {
    dest.insert(0, char)
}

しかし、帰りの電車で、C言語ならもっと効率良くできることに気づきました。

  1. 最初と最後の文字をスワップ
  2. 最初+1と最後-1の文字をスワップ
  3. 上記の処理を「文字数 / 2」回繰り返す
unsinged char *src = "hogemoge";
unsigned char swap;

for (int i = 0, int last = strlen(src) - 1; i < strlen(src) / 2; i++, last--, ) {
    swap = src[i]
    src[i] = src[last]
    src[last] = swap
}

なぜ、思いつかなかったのだろうと考えたのですが、最初に言語を選択していたため、そこでよく使う手法に囚われていたのです。swift だと文字列を文字単位で扱うことはあまりないため、配列として処理しようと考えてしまったのです。それに対してC言語はビット単位やバイト単位で扱うことが多いので、すんなりと効率が良いアルゴリズムに導かれたのでした。

「オブジェクト指向プログラミング入門 第二版 (ティモシイ・A. バッド)」の「1.2 言語と思考」にも、APLのプログラマが行列のソートで解決した話が載っていましたが、まさにその通りのことを身を以て体験したのでした。

 

[shell][iOS] クローンからシミュレーターでの実行までやってくれるスクリプト

Written by じび on 10月 5th, 2018

大きめの iOS アプリの開発をやっていると、クローンもライブラリのダウンロードもビルドも全てにおいて時間がかかるようになります。
それぞれを個別に人間が実行すると面倒なので、Git のクローンからシミュレーターでの実行まで、連続してやってくれるシェルスクリプトを作りました。

#!/bin/sh -e

if [ $# -ne 1 ]; then
    echo "Usage:runMyProject branch" 1>&2
    exit 1
fi

Repository="https://github.com/UserName/MyProject"
ProjectFile="MyProject.xcodeproj"

echo "===== git clone ====="
git clone -b $1 ${Repository} .

echo "===== carthage bootstrap ====="
carthage bootstrap --platform ios --no-use-binaries --cache-builds

echo "===== open Xcode ====="
open ${ProjectFile}
sleep 20

echo "===== Xcode run ====="
osascript -e 'tell application "Xcode"
    activate
    run active workspace document
end tell'
  • ファイル名やシェル変数の Repository および ProjectFile は、各自の環境に合わせて変えてください。
  • 最後に iOS Simulator での実行までやってますが、ビルドで止めたいときは、run の部分を build に変えてください。

実行時は、まずディレクトリを作って、その中に入り、第一パラメーターにクローンしたいブランチ名を指定して起動します。
$ mkdir hoge
$ cd hoge
$ runMyProject develop

改良したい点としては、

  • Xcode を起動後、20秒待つのではなく、立ち上がり完了を検知するようにしたい。
  • iOS シミュレーターの種類を指定できるようにしたい。
 

日和号弐号機の設計

Written by じび on 10月 4th, 2018

我が家にはソーラーパネルで発電し、バッテリーに電気を貯める、ポータブル太陽光蓄電システム「日和号改」があります。

今年もキャンプに持って行ったのですが、バッテリーがへたってしまい、あまり電気を貯められなくなりました。
バッテリーだけ買い換えても良いのですが、設計から4年も経ち、電力の使用事情も変わって来ました。
そこで増えた電力量を計算の上、弐号機を設計することにしました。

1日に使用する電力量

iPhone のバッテリー 約3,000mAh * 3.7V -> 11.1Wh -> 12Wh
変換時のロスを20%として 12 * 1.2 -> 14.4Wh -> 15Wh
一日に5台充電するとして、15 * 5 -> 75Wh

必要なソーラーパネル

1日の発電量は、ソーラーバルのW数 * 3h
必要なソーラーパネルの発電能力は、75 / 3 -> 25wh

必要なバッテリー

1日で消費される電力量が、バッテリーの25%までになるように設計する。
75Wh * 4 -> 300Wh
12Vバッテリーの場合、300Wh / 12V -> 25Ah

初号機は不要になるので、使える部品は再利用します。
コントローラー、シガーソケット、スイッチなと。

ソーラーパネルは30wのものがあるので、それを使います。
バッテリーは、これくらいの容量になると車用のが安いのですが、屋内に設置するので、ガスが出ない通信機器用の密閉型にします。
バッテリーは25Ahのだと割高なので、思い切って50Ahのにしましょう。