LS(リーディング・サービス)部の山野です。
ブログ投稿は初めてです。以後、お見知りおきを。

今回は要するに、

我々のようなIT技術者が「副業的に個人で一発当てる」なら
GAEで無料のミニ・サービス公開から始めるのがお勧めですよ~

という話です。

IT技術者であれば、一度くらいは
自前のアプリやサービスを作って一発当ててやろう!
とか考えましたよね?

今の世の中には、安価に利用できるAIやクラウドサービス、
高性能なモバイル端末、便利な開発ツール、十分な技術情報・・と、個人でも利用できるモノが溢れており
「個人で何かを始める」ことが過去に比べ敷居が低い状況です。

やらなきゃ損です。

いつやるの?

東京オリパラ前の今でしょ!

興味はあるけど・・実際に始めるには本業も忙しいし、
勉強も必要だし、お金もそんなに掛けられなし、どこから手を付ければ良くわからないし・・
という方に、今回は私の方法論をお教えします。

ずばりGAE(Google App Engine)です。

クラウド開発といえば、Amazon EC2などの仮想マシンをレンタルするIaaSの印象が強いですが、

「副業的に個人で一発当てる」場合には時間(手間)や費用を抑えられるPaaSの方が有利です。
今回は技術面の話よりは、そのあたりの戦略に重点を置いてお伝えします。

本稿をきっかけに「GAE悪くないな。1回使ってみようかな・・」という同志が
少しでも増えれば幸いです。

ではスタートです。

なぜ無料提供?

それは利用者が集まりやすく、場合によっては爆発的に増える可能性があるからです。
ビジネスとして「一発当てる」を考えた場合、これはまず第一に重要なことです。

フリー ―<無料>からお金を生みだす新戦略
「フリー ―<無料>からお金を生みだす新戦略」
https://www.amazon.co.jp/dp/B009UVJQMS

この本は、本当にお勧めです。
スタートアップを志す方は、一読されるとよいでしょう。

無料ビジネスの神髄はその集客力にあります。
価値あるものが無料提供されると注目が集まり、自然と利用者が集まります。

また、無料提供は利用者に好意的に受入れられることが多く、
クチコミやSNS等で好意的に紹介してもらえたり
「育てる」の意識で協力を得やすかったり、多少の至らぬ点があっても許容されやすい
という効果もあります。

100円でもお金を取ってしまうと、利用者はたちまち厳しいお客様の目で見るようになります。

利用者が増えても、無料では収益は得られないのでは?
と疑問に思われるかもしれませんが、ある程度の利用者が集まった後であれば、
広告・有料オプション・関連商品販売など、収益化の方法はいくらでも考えられます。

世界のトップ企業においては「何かを無料で提供する」ことをきっかけに、
結果として大きな収益を上げている例が多くみられます。
Googleやマイクロソフトなどがまさにその例です。

無料のパワーは決して大企業だけのものでなく、
やり方によっては個人でも十分に恩恵を受けられるものです。

必要条件は、利用者1人当たりのコストをゼロと見なせるレベルまで抑えることです。
そのためには、そもそもコストを掛けないことと、できるだけ多くの利用者を集めることが必要です。
無料ビジネスでは、収益化の方法は後から考えれば良いということは重要なポイントです。

まずはアイディアをカタチにして利用者を集めることに注力します。
避けるべきは、収益化の仕組みやアプリ・サービスの細部に悩むあまり、
せっかくのアイディアを埋もれさせてしまうことです。

なぜミニサービス?

それはアイディアを早く世に出して、実践から活きた「学び」を得るためです。
どんなに素晴らしいアイディアであっても、世に出さずに温めているうちは単なる妄想でしかありません。

リーン・スタートアップ ムダのない起業プロセスでイノベーションを生みだす
「リーン・スタートアップ ムダのない起業プロセスでイノベーションを生みだす」
https://www.amazon.co.jp/dp/B00F3UTIQY

企業が多大な資金を投じて開発したサービスでも、見向きもされずに終わる例は珍しくなくなっています。
便利なモノで溢れ、不確実性に支配される現代では、
事前調査と計画を十分に行う企業ビジネスのかつての成功パターンは既に王道から外れつつあります。

リーン・スタートアップとは、一発勝負で大失敗という最悪のケースを避けるために、
できるだけ早く小さく始め、実践から得た「学び」から細かく軌道修正しながら育てていく手法です。

ビジネスにおけるアジャイル的手法と言えるかもしれません。
「早く小さく始める」というところがポイントで、
時間やお金を掛けられない個人では、特に押さえておきたいビジネス手法です。

なぜGAE?

さて、ここからは本稿の主題であるGAE(Google App Engine)の話です。

GAEの概要としては、
インフラを意識せずにアプリ実行基盤を利用できるPaaS(Platform as a Service)の環境で、
現在ではGCP(Google Cloud Platform)の一部として提供されています。

Gmail、GoogleDrive、YouTubeなどを支えるGoogle大先生のインフラと同じものが利用でき、
自動スケールアウトで数百万ヒットまで、余裕でさばくという化け物のようなアプリ基盤です。

ポテンシャルには文句のつけようがありません。
※最近ではHerokuやAzure App ServiceなどのPaaSも出ておりますが、
 私は長年GAEを利用していて他をあまり語れませんので、ここではGAEに限った話をします。

無料枠が最強!

クラウドサービスには試用の為の無料枠が設定されていることが多く、
開発段階の費用削減に活用できます。

これは費用を掛けられない個人では嬉しい、というより必須のものです。
無いとやっていけません。

クラウド開発で利用頻度の高い仮想マシンのレンタルを想定した場合、
ざっと以下のような無料枠が利用できます。

クラウドサービス 無料枠
AWS 仮想マシン1台を1年間 https://aws.amazon.com/jp/free/
Azure 仮想マシン1台を1年間 +¥22,500円分のクレジット(1年間有効) https://azure.microsoft.com/ja-jp/free/
GCP 仮想マシン1台を無期限(性能は低め) +$300分のクレジット(1年間有効) https://cloud.google.com/free/?hl=ja

ひと昔前は、せいぜい3ヵ月くらいだったと記憶していますが、
競争もあって、各社とも1年間と充実したものになっていますね!
これならサービスの1つ、2つぐらいは開発できることでしょう。

でも1年経ってしまったら・・?
更に別のサービスを開発するときには・・?

一方、GAEの無料枠は無期限です。
正確には毎日無料枠がリセットされるので、
無料枠をオーバーしてサービスが停止してしまっても、翌日にはまた利用できるようになるのです。

課金を有効にしない限り、1円も請求されることはありません。
無料枠はプロジェクト単位に設定されるため、別のサービスを開発するときにも安心です。

では、その1日分の無料枠ではどれだけ利用できるものなのでしょうか?

詳細は、上に挙げたGCP無料枠のページで確認いただけますが、
ざっくり、アプリのインスタンスを28時間分稼働できます。
つまり、アプリを24時間365日無期限に稼働させ続けることも可能なのです。

実際には、課金要素はインスタンス時間だけではないので、
大量データを扱ったり大量アクセスをさばいたりすれば、
無料枠を使い切って停止してしまうこともあります。

しかし、利用者が少なく細々と改良を続けているような段階では 無料枠だけで無期限に維持可能なのです。

これが、個人のIT技術者にとってGAEが最強である理由です。
お金を掛けず、期限も気にせず、アイディアを実現することに注力することができます。

ラッキーヒットが出たら・・

無料枠で改良を繰り返して利用者が順調に増えていった結果、
あるとき急に注目が集まり利用者が急増する事態となりました。

嬉しい限りですが、アクセス集中によりレスポンス速度が低下したり
サービス停止してしまうかもしれません。
急いで対処しないと利用者に逃げられてしまうでしょう。

さて、どうすれば良いでしょうか?

結論から言うと、GAEの場合には基本的には課金を有効にして制限を解除するだけでOKです。

後は、必要に応じて自動的にスケールアウトするので、
何万でも何十万アクセスでも勝手にさばいてくれることでしょう。

大丈夫、課金額の上限は自由に設定できますし、
何よりGAEの利用料金は仮想マシンを利用するよりはるかに安いです。
何も慌てることはありません。
これがインフラを気にする必要のないPaaSのメリットです。

これがもし仮想マシンをレンタルして、アプリ基盤を自前で構築するIaaSであれば、
スケールアウトのために仮想マシンを増設したり、ロードバランサを設定したり、
分散したサーバ間でのデータを同期を考えたり、
アプリの設計・実装を変更をしたりと大慌てです。

コストも時間もかかりますし、
必死になって対応した頃には、利用者は残っていないかもしれません。

GAE/Goのススメ

GAEでは長らくPython、Java、PHP、Goでの利用が可能でしたが、
最近では.NET、Ruby、Node.jsなども利用できるようになりました。

原則は使い慣れたもの、好きなものを選んでもらうでよいのですが、
一応私のおススメはGo言語になります。

Go言語の解説までは長くなるので割愛しますが、
GAEでGo言語を選択するメリットは第一にスピンアップ速度です。

すなわち、インスタンスが立ち上がっていない状態からリクエストを受けて
アプリが起動し応答するまでの速度です。

私自身では検証しておらず、ネットの情報からですが、
GAE/Goでは概ね0.2~0.5ミリ秒となっており、最速です。

GAE/J(Java)では特に遅く、どうしても4~5秒以上はかかってしまうようです。
(「GAE」「スピンアップ」などのキーワードで検索してみてください)

GAEでは暫くアクセスがないと自動的にインスタンスが終了するため、
利用者が少ないサービスでは頻繁にスピンアップが発生します。

また、アクセスが殺到してスケールアウトするときにも、スピンアップ速度は重要になります。
「一発当てる」を目指す以上、スピンアップは速いにこしたことはありません。

また、Go言語自体がGAE以外でもクロスプラットフォームで利用できる強力なものです。
これを機会に、ぜひ触って頂きたいものです。

プログラミング言語Goの情報サイト:
http://golang.jp/

実際にミニサービスを公開してみよう!

前置きが長くなってしまいましたので、
そろそろ実際にGAEでミニサービスを公開するところを紹介したいと思います。

できるだけシンプルでコード量が少なく、
それでいてGAEのポテンシャルが垣間見れるサンプルを考えてみました。

今回は開発環境の構築すらせず、Webブラウザだけでアプリを構築します。

サンプルサービス:会員向け点数告知

とある事業者の会員向けに、
インターネットから自身の点数を確認させることを想定したWebサービスを構築します。

  • 会員向けページ: IDとパスワードでユーザ認証を行い会員本人だけに点数を告知します。 サンプルでは簡単に利用できるGoogleアカウント/G Suiteアカウントによるユーザ認証を使用します。
  • 管理者向けページ: 管理者が会員の点数を1件ずつ手動で設定する想定です。本来はアクセス制限が必須ですが、サンプルでは誰でもアクセス可能です。

それでは実際にやってみましょう。

①GCPプロジェクトの作成

Googleアカウントが無ければ、まず作成してください。
手順は割愛します。

まず、GCPのコンソールにログインします。
http://console.cloud.google.com

初めての利用の場合、繰り返し「無料トライアル」をおススメされますが、すべて断ります。
今回は使いませんので、特典は温存しておきましょう。

新しいGCPプロジェクトを作成します。

アプリを識別するための「プロジェクト名」を入力します。
その下の「プロジェクトID」は、連動して自動設定されます。

この「プロジェクトID」が実際のアプリの識別子となっており、
Webサービスを公開する際のURLにも使用されます。
重複は許されないので、早い者勝ちとなっています。

「プロジェクトID」は、この後のステップで設定ファイルに埋め込みますのでメモしておきます。

指定したプロジェクト名で、新しいGCPプロジェクトが作成されました。

②App Engineアプリケーションの作成

先ほど作成したGCPプロジェクトに、App Engineのアプリケーションを作成します。

メニューからApp Engineを選択します。

「アプリケーションを作成」を実行します。

アプリケーションをホストする地域(リージョン)を選択します。
ここでは、あまり悩まずデフォルト(us-central)を利用することにします。

現在では、日本(asia-northeast1)を選択することもできるのですが、
課金時の料金は少しだけ高めに設定されています。

将来的に、レイテンシが気になった場合に改めて検討すれば良いでしょう。

右上の通知アイコンがクルクルして処理中となるので、そのまま十数秒待ちます。
※このページの設定はオプションですので、特に何もしなくて構いません。

「次へ」をクリックしてしまうと課金の設定に飛ばされてしまいます。

暫くすると通知アイコンで処理の終了が通知されます。

これでApp Engineアプリケーションが作成され、コードをデプロイする準備ができました。

③アプリケーションのデプロイ

Cloud Shellというブラウザから利用できるGCPのシェル機能を利用し、
アプリのプログラムを編集し、デプロイまで行います。

右上のアイコンから、Cloud Shellを開始します。

Cloud Shellが起動しました。

ブラウザから利用できるという点を除けば、Linuxの一般的なシェルと変わりません。
アプリのプログラム用に作業ディレクトリを1つ作成します。
(必須ではありませんが、普通作成しますよね?)

サンプルでは、「point-viewer-2」というディレクトリを作成しています。
以下のコマンドを順に実行し、ディレクトリを作成してカレントを移動します。

mkdir point-viewer-2 cd point-viewer-2

プログラムを編集するために、Cloud Shellのコードエディタのアイコンをクリックします。
※Linuxに慣れた方であれば、nano等の使い慣れたエディタを使用しても構いません。


コードエディタが起動したらメニューから「New File」を選択し、
先ほど作成した作業ディレクトリに、以下の2つのファイルを作成します。

  • app.yaml
  • main.go

2つのファイルの内容を以下のように編集します。
ここでは細かい説明は割愛します。
あまり悩まずコピペしてください。

app.yamlの1行目には、
「①GCPプロジェクトの作成」の手順で払い出された「プロジェクトID」を設定します。
各自の環境に合わせて埋め込むようにしてください。

app.yaml ※GAEの設定ファイル

application: point-viewer-2
version: 1
runtime: go
api_version: go1

# ルートのみ認証不要
handlers:
- url: /
 script: _go_app
- url: /.*
 script: _go_app
 login: required
 auth_fail_action: redirect

main.go ※Goのコードファイル

//
// 会員向け点数告知(サンプル版)
//
package main

import (
    "fmt"
    "net/http"
    "strconv"

    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"
    "google.golang.org/appengine/user"
)

// 会員情報
type UserInfo struct {
    UserId string // 会員ID
    Point  int    // 点数
}

// 初期化
func init() {
    http.HandleFunc("/", rootPage)
    http.HandleFunc("/admin", adminPage)
    http.HandleFunc("/entry", entryAction)
    http.HandleFunc("/viewer", viewerPage)
}

// ルートページ(/)
func rootPage(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-type", "text/html; charset=utf-8")
    ctx := appengine.NewContext(r)

    u := user.Current(ctx) // ログイン情報
    var userView string
    if u == nil {
        url, _ := user.LoginURL(ctx, "/") // ログインURL
        userView = fmt.Sprintf("あなたは、ログインしていません。<a href='%s'>ログイン</a>", url)
    } else {
        url, _ := user.LogoutURL(ctx, "/") // ログアウトURL
        userView = fmt.Sprintf("あなたは、%sさんです。<a href='%s'>ログアウト</a>", u.Email, url)
    }
    fmt.Fprintf(w, `
       <h1>会員向け点数告知(サンプル版)</h1>
       
会員向けにインターネットから自身の点数を確認させるWebサービスです。
       
Google(又はG Suite)ユーザ認証機能を利用しています。
       %s
       <hr />
       
以下のページはログインが必要です。
       
<a href="/admin">管理者ページ(会員と点数の登録)</a>
       
<a href="/viewer">会員ページ(点数の照会)</a>
   `, userView)
}

// 管理者ページ(/admin)
func adminPage(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-type", "text/html; charset=utf-8")
    //ctx := appengine.NewContext(r)

    fmt.Fprintf(w, `
       <h1>管理者ページ</h1>
       
ここでは管理者が会員と点数の登録を行います。
       
サンプル版では単純な上書き登録又は削除のみ可能です。
       本来は管理者以外のアクセスを制限しますが、サンプル版では制限していません。
       <hr />
       <form action="/entry" method="post">
           
■会員ID:<input type="input" name="user-id" />
           Googleアカウント(又はG Suite)のメールアドレスを入力します。
           
■点数:<input type="input" name="point" />
           点数を数字で入力します。(空欄:会員IDの削除)
           <button type="submit">登録</button
       </form>
       <hr />
       
<a href="/">戻る</a>
   `)
}

// 登録アクション(/entry)
func entryAction(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-type", "text/html; charset=utf-8")
    ctx := appengine.NewContext(r)

    id := r.FormValue("user-id") // 会員ID
    if id == "" {
        http.Error(w, "会員IDが指定されていません。", http.StatusBadRequest)
        return
    }
    key := datastore.NewKey(ctx, "UserInfo", id, 0, nil) // KEY生成
    pointStr := r.FormValue("point")                     // 点数
    // 点数が未設定なら削除する
    if pointStr == "" {
        err := datastore.Delete(ctx, key) // 削除
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        fmt.Fprintf(w, `
           
%s を削除しました。
           
<a href="/admin">戻る</a>
       `, id)
        return
    }
    // 点数が設定されていれば上書登録する
    point, err := strconv.Atoi(pointStr) //数値変換
    if err != nil {
        http.Error(w, "数値変換エラー", http.StatusBadRequest)
        return
    }
    info := UserInfo{UserId: id, Point: point}
    _, err = datastore.Put(ctx, key, &info) // 上書き登録
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Fprintf(w, `
       
登録しました。
       
会員ID: %s 
       点数: %d点 
       
<a href="/admin">戻る</a>
   `, info.UserId, info.Point)
}

// 会員ページ(/viewer)
func viewerPage(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-type", "text/html; charset=utf-8")
    ctx := appengine.NewContext(r)

    u := user.Current(ctx)
    key := datastore.NewKey(ctx, "UserInfo", u.Email, 0, nil) // KEY生成
    // 点数の参照
    var info UserInfo
    err := datastore.Get(ctx, key, &info) // 参照
    if err != nil {
        http.Error(w, "あなたは会員登録されていません。", http.StatusNotFound)
        return
    }
    fmt.Fprintf(w, `
       <h1>点数の照会</h1>
       
こんにちは、%sさん
       
あなたの点数は %d 点です。
       
<a href="/">戻る</a>
   `, info.UserId, info.Point)
}

Cloud Shellで以下のコマンドを実行し、デプロイします。

goapp deploy

十数秒待ち、「Deployment successful.」と表示されればデプロイ成功です。
早速、アクセスして確認してみましょう。

GAEでデプロイしたアプリのURLは、

https://(プロジェクトID).appspot.com/

となります。

(プロジェクトID)の部分は、
「①GCPプロジェクトの作成」の手順で払い出された「プロジェクトID」を設定します。

私のサンプルでは、以下のURLになります。
https://point-viewer-2.appspot.com/

ブラウザでアクセスして、以下のページが表示されれば成功です。
ユーザ認証と点数の閲覧、点数の登録ができることを確認してください。

ユーザ認証を伴うサービスを、お金をかけず、時間も手間も最小限で
一般向けに公開することができました。

以上、駆け足でしたが、いかがだったでしょうか?

GAE・GCPについて、もっと・・

今回紹介した以外にも、GAE・GCPで利用すべきものは沢山あります。
ざっと紹介します。

ローカル開発環境

今回紹介した手順では、ブラウザだけでプログラム作成からデプロイまで全てを済ませましたが
もちろんローカルでの開発環境の構築も可能です。
(SDKが頻繁に更新されるので、開発環境も頻繁にアップデートを求められて
 結構面倒だったりします・・。
 また、Windowsではインストールしただけでは上手く動かないことがあり、
 Path等の設定の調整が必要になるなど苦労することが多いです・・。)

基本的には、各言語の公式サイト等で提供されるコンパイラ等を用意したうえで、
GCPのSDKをダウンロードしてインストールすればOKです。

GCPのSDKはGUIではなくCUIのツールとなっており、gcloud や goapp といったコマンドで、
テスト用にアプリをホストしたり、デプロイするなどのクラウド操作が行えます。

エディタや統合開発環境のようなものはありませんので、VS-CodeやEclipse等を自分で用意します。
私が実際に使用したのはPythonとGoくらいですが、各言語用の環境構築方法は
GAEの各言語向け公式ドキュメントの中の「クイックスタート」で解説されています。

(公式)Google App Engine のドキュメント:
https://cloud.google.com/appengine/docs/

(公式)Go App Engine スタンダード環境のクイックスタート:
https://cloud.google.com/appengine/docs/standard/go/quickstart?hl=ja

静的ファイルのホスト

app.yamlの設定をしてあげれば、
プログラムを使用せずにHTMLやJSONなどの静的ファイルをそのまま公開することもできます。

これは意外に重宝します。
無料ホームページサービスでありがちな、勝手に広告等が埋込まれるなどもありません。

(公式)app.yaml リファレンス:
https://cloud.google.com/appengine/docs/standard/go/config/appref?hl=ja

Google Cloud Source Repositories

非公開利用が可能なgitリポジトリです。

無料枠で利用できるのは、GCPプロジェクト毎に、メンバー5人、容量50GBまでです。 その枠内であれば、複数リポジトリの作成も可能です。

gitクライアントは任意のものが利用できますし、GCPと関係ないソースの格納にも利用できます。 容量も十分です。

私の場合、個人で作成したソースコードは全てここに集約し、
スマートフォンにもgitクライアントアプリを入れて、どこからでもアクセスできるようにしています。

(公式)Google Cloud Source Repositories のドキュメント:
https://cloud.google.com/source-repositories/docs/?hl=ja

Google Cloud Shell

今回紹介した手順でも利用したブラウザから直接利用可能なシェルです。

仕組みとしては、ブラウザからのアクセス時にGCPでLinuxの仮想マシンが自動起動するというもので、
GCP以外の目的でも使うこともできます。

ただし一定時間使用していないとシャットダウンされてしまいます。
5GBまでの永続ストレージが利用でき、GCPのSDKも最新のものがセットアップされているので、
テスト用にアプリをホストしたり、デプロイするなどのGAE操作がすぐ行えます。

私の場合、最近ではローカルの開発環境よりもこちらを使うことが多いです。
gitも利用できるので、PCやスマートフォンで編集したコードを
gitリポジトリ(Google Cloud Source Repositories)にPUSH、Cloud ShellでPULLして、
そのままGAEへデプロイという使い方がとても便利です。

(公式)CLOUD SHELL:
https://cloud.google.com/shell/?hl=ja

独自ドメインの利用

GAEで公開したアプリは、
https://(プロジェクトID).appspot.com/ というURLでアクセス可能ですが、
もちろん自身が所有している独自ドメインで公開することも可能です。

「一発当てる」を目指す以上、
いつかは利用者に覚えてもらいやすい独自ドメインで公開したいですよね。

私の場合は お名前.com で取得したドメインを運用しています。

(公式)カスタム ドメインのマッピング:
https://cloud.google.com/appengine/docs/standard/go/mapping-custom-domains?hl=ja

私のミニサービスの紹介

(私が過去に公開したミニサービスを2つ紹介します。
※どちらも試作品として非課金に留めているため、
 アクセスが集まり過ぎると無料枠を使い切って停止している可能性があります。
 毎日、日本時間17時頃にリセットされますので、その頃にアクセスしてみてください。

「スマートファイル交換」

http://smartfileex.daijobu.tokyo/

スマートフォンで撮影した写真を、その場にいる相手に連絡先交換不要で受け渡せるサービスです。

私は海外旅行が趣味で、旅先で出会った現地の人々と一緒にスマートフォンで写真を撮ったりします。
撮ったその場で相手に写真データを渡してあげたい、でも連絡先交換までするのはちょっと・・
ということで、このサービスを開発しました。

2013年にPythonバージョンを開発し、2016年にGoに移行しました。
今では類似の商用サービスがあるので開発は止めており、個人的にたまに利用している程度です。

「今から!ダイニング ~飲食店空席情報~」

https://rightnow-net.appspot.com/

「今すぐ入れる店」を探せる飲食店の空席情報提供サービスの試作版です。
ぜひ、飲食店のオーナーになったつもりで空席情報を公開してプロモーションしてみてください。
試作段階で実運用はしておりませんので、自由に店舗を作成して頂いて結構です。

大手の飲食店情報サイトだと事前に調べて予約するには重宝しますが、
「今すぐ入れる店」には対応できていないなぁと考えて開発しました。

サービスとしては、多くの飲食店から空席情報を集めないと成り立たない訳ですが、
飲食店側では大手飲食店情報サイトの高い利用料金に苦しんでいるという話もあったので、
飲食店向けに無料公開すれば「今すぐ入れる店」を探している優良見込み客に
無料でプロモーションできることになり、メリットが大きいと考えました。

試作版とは言え、最低限の機能は備えていますので、
情報提供者と利用者さえ集めれば即運用できる状態です。
今後はロケーションで絞り込む機能を追加したいところです。

最初に開発したのは飲食店向けですが、
将来的にマッサージ店や駐車場などの他の業種にも広げられることを見込んで、
「今から!ねっと」というブランド化を狙っていたります。
2013年にPythonバージョンを公開しています。

私のこだわり

コンセプト・ファースト

私の場合、何かを始めるときにはまずコンセプトを意識するようにしています。

これは言葉として美しいキャッチフレーズ的なものを生み出すという話ではなく、
「これについて何ができれば周囲に驚かせることができるか、インパクトを与えることができるか」
ということを、コンセプトとしてまず考えるようにしているのです。

新規企画の時だけでなく、普段の仕事のちょっとしたアウトプットでも実に役に立ちます。
コンセプト・ファーストを実践するようになってから、
いろいろなことが不思議と上手くいくようになりました。

独自サービスで「一発当てたい」のであれば利用者の心を揺さぶるコンセプトこそが重要です。
成功はすべてコンセプトから始まる
「成功はすべてコンセプトから始まる」
https://www.amazon.co.jp/dp/B00B42SX9S/

名は体を表す、名前にこそ こだわれ

IT技術者ですので人に何かを説明する機会は多いのですが、
何か新しいコトやモノを人に伝えるときには、
分かりやすい名前を付けてあげるのが最も効果的と感じています。

分かりにくい名前を付けてしまうと、
その後で丁寧な説明を何度も繰り返したとしても、結局上手く伝わりません。
名前は記憶に残りますが、説明は忘れさられてしまうのです。

コーディングするなら変数名、関数名にこだわりましょう。
資料を作るなら資料名にこだわりましょう。
独自サービスで「一発当てたい」のであればサービス名にはこだわりましょう。

名前は単なる識別子ではなく魂が宿るものです。
そこにこそ十分に時間と労力を掛けるべきです。

私の手抜き

ユーザ認証にはGoogleアカウントを使用する

今回紹介したサンプルでも利用していますが、
サービスの試作段階では、ユーザ認証はGoogleアカウントを利用するようにしましょう。

ほぼ実装不要で、二段階認証やパスワード忘れ対応機能までを含むGoogleのサービス群と
同等のユーザ認証を利用できるのですから、こんなに都合の良い話はありません。

また、世のユーザは新しいサービスを利用するたびにユーザ登録を求められており、
ストレスに感じています。

手持ちのGoogleアカウントで新しいサービスの利用を始められることは、
好意的に受けとられると考えています。

もちろん時間と手間をかければ自前のユーザ認証を実装することも可能なのですが、
今のところ私にはそれだけの時間と手間をかけるだけのメリットが見出せません。

「無料」へのマナーとリスペクト

無料提供されているモノを利用するにあたってのマナーの話です。

今回、無料で利用可能な環境としてGAEをご紹介しましたが、
いつまでも無料で使い続けるという意識ではなく、ぜひ、うまくいって収益が得られるようになった暁には
適切な対価を支払うという意識で利用して欲しいと考えています。

無料だからといって好き勝手に浪費したり、一方的に搾取するのはマナー違反です。

これはGAEに限った話ではなく世の無料提供されるモノの全てに言えることです。
提供者へのリスペクトを忘れず節度を持って利用し、
収益が得られれば還元するという意識で利用されることを切に願います。

ミニサービスを100個集めれば・・・

IT技術者が副業的に「個人で一発当てる」をテーマに 私の方法論をご紹介してきましたが、いかがだったでしょうか?

何となく面白そうだな、簡単なミニサービスなら作れそうだな・・
と思って頂けたのであれば幸いです。
ぜひチャレンジしてみてください。

もちろん「作れば当たる」という簡単な話ではありえないのですが
始めなければ何も変わりません。

その先の話としては、何となくミニサービスを100個も集めれば、
そのうち4~5くらいは、収益を得られるものが生まれるかも生まれるかなぁと漠然と考えています。
根拠はありません。感覚です。

もちろん、1人では大変ですが
何人かで集まって各人が5~10くらいを生み出せれば、それなりの数が集まります。

きっとバラエティに富んだアイディアが集まることでしょう。
ここからは「個人で」ではなく「チームで」の話になりますが、
チーム内で相互に意見を出し合いつつ、見込みがあるものを取捨選択し育てていけば
必ず誰もが知る偉大なサービスが実現できると信じています。

私もやりますが、同志として皆さんも一緒にやりましょう。
現代の魔術師たる我々IT技術者が動けば、世の中は・・
“Increasing the Possibles” 「もっと、よくできる」

最後まで読んで頂き、ありがとうございました!

山野
CSVIT事業部 LS(リーディングサービス)部 山野
1円で笑える人は100円で100倍笑えます。1円からしっかり笑っていきましょう。