めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

導関数が自分自身と一致する指数関数が存在することの説明

何の話かというと

qiita.com

の3日目の記事

qiita.com

で、指数関数 f(x) = a^x において、

  f(1)=x=1のときの接線の傾きの値」

となる a をさがすと、それが a = e = 2.71828\cdots(ふなひとはちにわ)になるんだよ!

という解説があって、ほほぉー、と思いつつも・・・

「この関係は x=1 のときだけに成り立つものではありません。f(x)=e^x では、x がどんな値の時にでもこの関係式は成り立ちます。」

という部分の(なぜそうなるのかという)説明がなかったので、なぜ、すべての x で成り立つのかという説明を補足してみます。

微分の定義

先の記事では、数値微分の例で説明されていますが、一般に、点 x からちょことだけ離れた点 x+hh は0.000001ぐらいの小さい数だとしてください)を考えて、グラフ上の2点 (x,\, f(x))(x+h,\, f(x+h)) を結ぶ直線の傾きを考えてみます。

 傾き =\frac{f(x+h)-f(x)}{h}

これは、点 x における関数 f(x) の傾きの近似計算になるわけですが、ここで、h をどんどん 0 に近づけていくと、その極限として、厳密な傾きの値、つまり、微分係数が計算されます。

 f'(x) = \lim_{h\to 0}\frac{f(x+h)-f(x)}{h} ―― (1)

ちなみに、いま、「微分係数」といいましたが、(1) では、x をいろいろな値に変化させて、f'(x)x の関数とみなしています。このように、x における微分係数を表わす関数 f'(x) を「関数 f(x) の導関数」と言います。特定の定数 x における傾きが「微分係数」で、x を変数とみなしたものが「導関数」ということになります。

指数関数の微分

それでは、指数関数 f(x)=a^x の微分(導関数)を先の定義にしたがって計算するとどうなるでしょうか。

まず、傾きを表わす式の分子を計算すると、次のようになります。

 f(x+h) - f(x) = a^{x+h} - a^x = a^x(a^h - 1)

面白いことに、全体が a^x でくくれてしまいます。

したがって、これを (1) に代入すると、次のようになります。

 f'(x) = \lim_{h \to 0} \frac{a^x(a^h-1)}{h} = a^x \times \lim_{h\to 0}\frac{a^h-1}{h} ―― (2)

極限操作 h \to 0 では、h の値をだんだん小さくするという操作を考えているわけですが、a^xh に依存しない値なので、極限操作の外に取り出せてしまう所がポイントです。

そして! (2) に残った極限値  \lim_{h\to 0}\frac{a^h-1}{h} の中身をよーく見ると、どこにも変数 x が入っていません。もともと、点 x をいろいろ変化させた時に、微分係数がどのようにかわるか、という視点があったのですが、この部分は、微分(傾き)を計算する点 x に関係なく、いつも同じ値になります。

ただし、これが具体的にいくらになるのかを一般の a に対して計算するのは簡単ではありません。(分子も分母もどっちも0に近づいていく「不定形」というやつですね。)

とは言え、a の値を具体的に一つ決めてしまえば、数値計算で求めることは可能です。ちょっと、Pythonで試してみましょう。

$ python
>>> h = 0.00000000001
>>> a = 2
>>> (a ** h - 1 ) / h
0.6931566431944702

本当は、h をどんどん0に近づけるのですが、ここでは、h=0.00000000001 という極端に小さい値を用いて近似計算を行いました。

つまり、a=2 の時、f(x)=a^x の導関数は、(近似計算で)次になることがわかりました。

 f'(x) = a^x \times 0.693\cdots= f(x) \times 0.693\cdots

これは面白い事実を表しています。一般に、「指数関数 f(x) = a^x の導関数は、自分自身を定数倍したものになる」ということですね。指数関数は値が「指数的に」増えていくと同時に、傾きも「指数的に」増えていくというわけです。



・・・ここで問題です!

それでは、この定数  \lim_{h\to 0}\frac{a^h-1}{h} がぴったり 1 になる a を見つけることはできるでしょうか。

・・・がんばりました。

$ python
>>> h = 0.00000000001
>>> a = 2.71828
>>> (a ** h - 1 ) / h
1.000000082740371

・・・いえ嘘です。

答えを知っているので、それを使いました。実は、a = e = 2.71828\cdots となります。これで、

  f(x) = e^x とする時、すべての x について、f'(x) = e^x となる

ということがわかりました。

やったー。

補足説明

ちなみに、定数  \lim_{h\to 0}\frac{a^h-1}{h} がぴったり 1 になる a を見つけるということをやりましたが、よーーーーーく考えると、 \lim_{h\to 0}\frac{a^h-1}{h} は、指数関数 a^xx=0 における傾きそのものですね。非常におもしろいことに冒頭のエントリーで紹介した、「指数関数 a^xx=1 における傾きが f(1) になる a を見つける」という作業によく似ています。特定の点での傾きを決定することが、「すべての x について、f'(x) = a^x となる a」を探すという作業につながっているわけです。なかなか奥深いですねー。

Jupyter演習環境の準備手順

この手順では、メモリが4GB以上、CPUが4コア以上の環境を前提としています。

macOSを使用する場合

  • macOS用のDockerが対応しているのは、Yosemite以降のバージョンです。ここで紹介する手順は、El Captitanで動作確認をしています。

はじめに、Dockerの公式Webサイトから、macOS用のDockerをダウンロードします。「Getting Started with Docker」のリンクからダウンロードページを開いて、「Download Docker for Mac」をクリックすると、インストーラーファイル Docker.dmgがダウンロードできます。インストーラーを開いて、DockerアイコンをApplicationsフォルダーにコピーした後、ApplicationsフォルダーからDockerを起動します。初回の起動時は、インストール処理のポップアップが表示されますので、指示にしたがって、インストールを完了させてください。

インストールが完了してDockerが起動すると、上部のメニューバーにクジラのアイコンが表示されます。ここからDockerの管理メニューを表示して、「Preferences」を選択した後、「Advanced」のタブから「Memory」を4GB以上に設定します。「CPUs」の指定は任意ですが、サンプルコードの実行時間が極端に長くならないよう、4以上に設定することをおすすめします。最後に「Apply advanced settings」を押して、設定変更を反映します。

macOSに付属のターミナルを開いて、下記のコマンドを実行すると、Docker Hubからイメージをダウンロードして、コンテナ上でJupyterが起動します。「\」はコマンドの途中で改行する際に、入力する記号です。

$ mkdir $HOME/data
$ docker run -itd --name jupyter -p 8888:8888 -p 6006:6006 \
    -v $HOME/data:/root/notebook -e PASSWORD=passw0rd \
    enakai00/jupyter_tensorflow:latest

「-e PASSWORD」オプションには、WebブラウザーからJupyterに接続する際の認証パスワードを指定します。この例では、「passw0rd」を指定しています。この手順でコンテナを起動した場合、Jupyterで作成したノートブックのファイルは、ユーザーのホームディレクトリー(/User/<ユーザー名>)の下にある「data」ディレクトリーに保存されます。

macOSでブラウザーを起動して、URL「http://localhost:8888」にアクセスすると、ログイン画面が表示されるので前述のパスワードを入力してログインします。この後は、最後のセクションにある、動作確認に進んでください。

※ macOSを再起動した場合は、ターミナルから下記のコマンドを実行して、コンテナを再度、起動してください。

$ docker start jupyter

パブリッククラウドの仮想マシンを使用する場合

パブリッククラウドの仮想マシン上でDockerを起動して、環境を用意することも可能です。CentOS7のVMインスタンスを起動してログインした後、rootユーザーから、次の手順でコンテナを起動します。

# yum -y install docker
# systemctl enable docker.service
# systemctl start docker.service
# mkdir $HOME/data
# chcon -Rt svirt_sandbox_file_t $HOME/data
# docker run -itd --name jupyter -p 8888:8888 -p 6006:6006 \
    -v $HOME/data:/root/notebook -e PASSWORD=hogehoge \
    enakai00/jupyter_tensorflow:latest

「-e PASSWORD=」には、Jupyterにアクセスする際のパスワードを任意に指定します。ただし、通信経路の暗号化は行われないため、インターネット経由で直接にアクセスするのは危険です。SSHのトンネル機能を用いて、通信経路の暗号化を行ってください。たとえば、Windowsクライアントの環境であれば、Tera TermなどのSSH端末から、次のように8888番ポートと6006番ポートの転送を指定して、SSH接続します。

macOS、もしくは、Linuxクライアントであれば、次のように、-Lオプションでポート転送を指定してSSH接続します。

$ ssh -L 6006:localhost:6006 -L 8888:localhost:8888 -i .ssh/gcp_enakai enakai@xxx.xxx.xxx.xxx

この後、ローカルのブラウザーから、「http://localhost:8888」にアクセスするとSSHトンネルを経由して、Jupyterに接続することができます。ログイン画面が表示されるので前述のパスワードを入力してログインします。この後は、次のセクションにある、動作確認に進んでください。

※ 仮想マシンを再起動した場合は、SSH接続した後に、rootユーザーで下記のコマンドを実行して、コンテナを再度、起動してください。

$ docker start jupyter

動作確認

Jupyterにログインすると「ノートブックファイル」の一覧画面が表示されますが、今はまだノートブックファイルはありません。

右上のプルダウンメニューから「New」→「Python 2」を選択すると新しいノートブックが開きます。

ノートブック上では、セルにプログラムコードを入力して、「▶」ボタン、もしくは [Ctrl] + [Enter] で実行すると結果が表示されます。マークダウン形式のセルには説明文を記載することができます。

ノートブック全体を最初から実行し直す場合は、メニューから「Kernel」→「Restart & Clear Output」を選択して、これまでの実行内容をクリアします。

空のセルで次のコマンドを実行すると、演習用のノートブックがダウンロードできます。

!git clone https://github.com/enakai00/jupyter_ml4se

ノートブックファイル一覧画面でフォルダー「jupyter_ml4se」を開くと、ノートブックファイルが入っています。

「02-square_error.ipynb」のチェックボックスにチェック入れて、画面上部の「Duplicate」を押すと、ノートブックファイルのコピー「02-square_error-Copy1.ipynb」ができます。これをクリックして、ノートブックを開きます。

メニューから「Kernel」→「Restart & Clear Output」を選択して、これまでの実行内容をクリアした後に、メニューから「Cell」→「Run All」を選択すると、すべてのセルが上から順に自動実行されます。すべてのセルが正しく実行されることを確認しておいてください。たとえば、最後の2つのセルでは、次のようなグラフが表示されます。

Implementing a counter service with Bigtable

Cloud Datastore is the best friend for App Engine developers, yeay!

However, it may be awkward to implement an incremental counter (like AUTO_INCREMENT in MySQL) over Datastore. The good alternative is to use Bigtable to implement a counter service.

Here is a prototype of such a counter service. getCount() returns an auto increment integer number starting from 1 with strong consistency. In this sample, five of go-routines keep getting counts until they receive 100 counts per routine which results in 500 counts in total.

Before running this on Cloud Shell, you need to create a Bigtable cluster and install golang client SDK with the following command.

$ go get -u all

main.go

package main
import (
        "flag"
        "encoding/binary"
        "log"
        "sync"
        "cloud.google.com/go/bigtable"
        "golang.org/x/net/context"
)
// User-provided constants.
const (
        tableName        = "CounterTable"
        columnFamilyName = "count"
        columnName       = ""
        rowName          = "mycounter"
)

// sliceContains reports whether the provided string is present in the given slice of strings.
func sliceContains(list []string, target string) bool {
        for _, s := range list {
                if s == target {
                        return true
                }
        }
        return false
}

func main() {
        project := flag.String("project", "", "The Google Cloud Platform project ID. Required.")
        instance := flag.String("instance", "", "The Google Cloud Bigtable instance ID. Required.")
        flag.Parse()

        for _, f := range []string{"project", "instance"} {
                if flag.Lookup(f).Value.String() == "" {
                        log.Fatalf("The %s flag is required.", f)
                }
        }

        ctx := context.Background()
        adminClient, err := bigtable.NewAdminClient(ctx, *project, *instance)
        if err != nil {
                log.Fatalf("Could not create admin client: %v", err)
        }

        tables, err := adminClient.Tables(ctx)
        if err != nil {
                log.Fatalf("Could not fetch table list: %v", err)
        }

        if !sliceContains(tables, tableName) {
                log.Printf("Creating table %s", tableName)
                if err := adminClient.CreateTable(ctx, tableName); err != nil {
                        log.Fatalf("Could not create table %s: %v", tableName, err)
                }
        }

        tblInfo, err := adminClient.TableInfo(ctx, tableName)
        if err != nil {
                log.Fatalf("Could not read info for table %s: %v", tableName, err)
        }

        if !sliceContains(tblInfo.Families, columnFamilyName) {
                if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
                        log.Fatalf("Could not create column family %s: %v", columnFamilyName, err)
                }
        }

        client, err := bigtable.NewClient(ctx, *project, *instance)
        if err != nil {
                log.Fatalf("Could not create data operations client: %v", err)
        }

        tbl := client.Open(tableName)
        mut := bigtable.NewMutation()
        mut.Set(columnFamilyName, columnName, bigtable.Now(),[]byte{0, 0, 0, 0, 0, 0, 0, 0}) 

        if err := tbl.Apply(ctx, rowName, mut); err != nil {
                log.Fatalf("Could not create row: %v", err)
        }

        // counter service function
        getCount := func() uint64 {
                rmw := bigtable.NewReadModifyWrite()
                rmw.Increment(columnFamilyName, columnName, 1)
                row, err := tbl.ApplyReadModifyWrite(ctx, rowName, rmw)
                if err != nil {
                         log.Fatalf("Could not update row: %s %v", row, err)
                }
                data := binary.BigEndian.Uint64(row[columnFamilyName][0].Value)
                return data
        }

        var wg sync.WaitGroup
        for i := 0; i < 5; i++ {
                wg.Add(1)
                go func(id int) {
                        log.Printf("Start client:%d", id)
                        for j := 1; j < 101; j++ {
                                data := getCount()
                                log.Printf("\tclient:%d\t%s = %d\n", id, rowName, data)
                        }
                        log.Printf("Finished client:%d", id)
                        wg.Done()
                }(i)
        }
        wg.Wait()
        log.Printf("Finished.")
}
$ go run main.go -project bt-counter -instance mycounter
2016/11/11 10:55:54 Start client:4
2016/11/11 10:55:54 Start client:0
2016/11/11 10:55:54 Start client:1
2016/11/11 10:55:54 Start client:2
2016/11/11 10:55:54 Start client:3
2016/11/11 10:55:54     client:2        mycounter = 1
2016/11/11 10:55:54     client:1        mycounter = 2
2016/11/11 10:55:54     client:2        mycounter = 3
2016/11/11 10:55:54     client:0        mycounter = 4
2016/11/11 10:55:54     client:1        mycounter = 5
2016/11/11 10:55:54     client:2        mycounter = 6
2016/11/11 10:55:54     client:3        mycounter = 7
2016/11/11 10:55:54     client:0        mycounter = 8
2016/11/11 10:55:54     client:4        mycounter = 9
2016/11/11 10:55:54     client:2        mycounter = 10
2016/11/11 10:55:54     client:1        mycounter = 11
2016/11/11 10:55:54     client:3        mycounter = 12
2016/11/11 10:55:54     client:4        mycounter = 14
2016/11/11 10:55:54     client:2        mycounter = 15
2016/11/11 10:55:54     client:1        mycounter = 16
2016/11/11 10:55:54     client:4        mycounter = 17
2016/11/11 10:55:54     client:2        mycounter = 18
2016/11/11 10:55:54     client:1        mycounter = 19
2016/11/11 10:55:54     client:2        mycounter = 20
2016/11/11 10:55:54     client:1        mycounter = 21
2016/11/11 10:55:54     client:2        mycounter = 22
2016/11/11 10:55:54     client:0        mycounter = 13
2016/11/11 10:55:54     client:2        mycounter = 23
2016/11/11 10:55:54     client:1        mycounter = 24
2016/11/11 10:55:54     client:4        mycounter = 25
2016/11/11 10:55:54     client:3        mycounter = 26
2016/11/11 10:55:54     client:0        mycounter = 27
2016/11/11 10:55:54     client:2        mycounter = 28
2016/11/11 10:55:54     client:1        mycounter = 29
2016/11/11 10:55:54     client:4        mycounter = 30
2016/11/11 10:55:54     client:3        mycounter = 31
2016/11/11 10:55:54     client:0        mycounter = 32
2016/11/11 10:55:54     client:2        mycounter = 33
2016/11/11 10:55:54     client:1        mycounter = 34
2016/11/11 10:55:54     client:4        mycounter = 35
2016/11/11 10:55:54     client:3        mycounter = 36
2016/11/11 10:55:54     client:2        mycounter = 38
2016/11/11 10:55:54     client:0        mycounter = 37
2016/11/11 10:55:54     client:1        mycounter = 39
2016/11/11 10:55:54     client:4        mycounter = 40
2016/11/11 10:55:54     client:3        mycounter = 41
2016/11/11 10:55:54     client:2        mycounter = 42
2016/11/11 10:55:54     client:0        mycounter = 43
2016/11/11 10:55:54     client:1        mycounter = 44
2016/11/11 10:55:54     client:4        mycounter = 45
2016/11/11 10:55:54     client:3        mycounter = 46
2016/11/11 10:55:54     client:2        mycounter = 47
2016/11/11 10:55:54     client:1        mycounter = 49
2016/11/11 10:55:54     client:4        mycounter = 50
2016/11/11 10:55:54     client:0        mycounter = 48
2016/11/11 10:55:54     client:2        mycounter = 52
2016/11/11 10:55:54     client:1        mycounter = 53
2016/11/11 10:55:54     client:4        mycounter = 54
2016/11/11 10:55:54     client:0        mycounter = 55
2016/11/11 10:55:54     client:3        mycounter = 51
2016/11/11 10:55:54     client:2        mycounter = 56
2016/11/11 10:55:54     client:1        mycounter = 57
2016/11/11 10:55:54     client:4        mycounter = 58
2016/11/11 10:55:54     client:0        mycounter = 59
2016/11/11 10:55:54     client:3        mycounter = 60
2016/11/11 10:55:54     client:2        mycounter = 61
2016/11/11 10:55:54     client:1        mycounter = 62
2016/11/11 10:55:54     client:4        mycounter = 63
2016/11/11 10:55:54     client:0        mycounter = 64
2016/11/11 10:55:54     client:3        mycounter = 65
2016/11/11 10:55:54     client:2        mycounter = 66
2016/11/11 10:55:54     client:1        mycounter = 67
2016/11/11 10:55:54     client:4        mycounter = 68
2016/11/11 10:55:54     client:3        mycounter = 70
2016/11/11 10:55:55     client:4        mycounter = 73
2016/11/11 10:55:55     client:1        mycounter = 72
2016/11/11 10:55:55     client:2        mycounter = 71
2016/11/11 10:55:55     client:0        mycounter = 69
2016/11/11 10:55:55     client:3        mycounter = 74
2016/11/11 10:55:55     client:4        mycounter = 75
2016/11/11 10:55:55     client:1        mycounter = 76
2016/11/11 10:55:55     client:2        mycounter = 77
2016/11/11 10:55:55     client:0        mycounter = 78
2016/11/11 10:55:55     client:3        mycounter = 79
2016/11/11 10:55:55     client:4        mycounter = 80
2016/11/11 10:55:55     client:2        mycounter = 82
2016/11/11 10:55:55     client:1        mycounter = 81
2016/11/11 10:55:55     client:0        mycounter = 83
2016/11/11 10:55:55     client:3        mycounter = 84
2016/11/11 10:55:55     client:4        mycounter = 85
2016/11/11 10:55:55     client:2        mycounter = 86
2016/11/11 10:55:55     client:1        mycounter = 87
2016/11/11 10:55:55     client:0        mycounter = 88
2016/11/11 10:55:55     client:3        mycounter = 89
2016/11/11 10:55:55     client:4        mycounter = 90
2016/11/11 10:55:55     client:2        mycounter = 91
2016/11/11 10:55:55     client:1        mycounter = 92
2016/11/11 10:55:55     client:4        mycounter = 94
2016/11/11 10:55:55     client:0        mycounter = 93
2016/11/11 10:55:55     client:3        mycounter = 95
2016/11/11 10:55:55     client:2        mycounter = 96
2016/11/11 10:55:55     client:1        mycounter = 97
2016/11/11 10:55:55     client:0        mycounter = 98
2016/11/11 10:55:55     client:4        mycounter = 99
2016/11/11 10:55:55     client:3        mycounter = 100
2016/11/11 10:55:55     client:2        mycounter = 101
2016/11/11 10:55:55     client:1        mycounter = 102
2016/11/11 10:55:55     client:0        mycounter = 103
2016/11/11 10:55:55     client:4        mycounter = 104
2016/11/11 10:55:55     client:3        mycounter = 105
2016/11/11 10:55:55     client:2        mycounter = 106
2016/11/11 10:55:55     client:1        mycounter = 107
2016/11/11 10:55:55     client:0        mycounter = 108
2016/11/11 10:55:55     client:4        mycounter = 109
2016/11/11 10:55:55     client:3        mycounter = 110
2016/11/11 10:55:55     client:2        mycounter = 111
2016/11/11 10:55:55     client:1        mycounter = 112
2016/11/11 10:55:55     client:0        mycounter = 113
2016/11/11 10:55:55     client:4        mycounter = 114
2016/11/11 10:55:55     client:3        mycounter = 115
2016/11/11 10:55:55     client:2        mycounter = 116
2016/11/11 10:55:55     client:0        mycounter = 118
2016/11/11 10:55:55     client:4        mycounter = 119
2016/11/11 10:55:55     client:3        mycounter = 120
2016/11/11 10:55:55     client:2        mycounter = 121
2016/11/11 10:55:55     client:1        mycounter = 117
2016/11/11 10:55:55     client:0        mycounter = 122
2016/11/11 10:55:55     client:4        mycounter = 123
2016/11/11 10:55:55     client:3        mycounter = 124
2016/11/11 10:55:55     client:2        mycounter = 125
2016/11/11 10:55:55     client:1        mycounter = 126
2016/11/11 10:55:55     client:0        mycounter = 127
2016/11/11 10:55:55     client:4        mycounter = 128
2016/11/11 10:55:55     client:3        mycounter = 129
2016/11/11 10:55:55     client:2        mycounter = 130
2016/11/11 10:55:55     client:1        mycounter = 131
2016/11/11 10:55:55     client:0        mycounter = 132
2016/11/11 10:55:55     client:4        mycounter = 133
2016/11/11 10:55:55     client:3        mycounter = 134
2016/11/11 10:55:55     client:2        mycounter = 135
2016/11/11 10:55:55     client:1        mycounter = 136
2016/11/11 10:55:55     client:0        mycounter = 137
2016/11/11 10:55:55     client:4        mycounter = 138
2016/11/11 10:55:55     client:3        mycounter = 139
2016/11/11 10:55:55     client:1        mycounter = 140
2016/11/11 10:55:55     client:2        mycounter = 141
2016/11/11 10:55:55     client:0        mycounter = 142
2016/11/11 10:55:55     client:4        mycounter = 143
2016/11/11 10:55:55     client:3        mycounter = 144
2016/11/11 10:55:55     client:1        mycounter = 145
2016/11/11 10:55:55     client:2        mycounter = 146
2016/11/11 10:55:55     client:0        mycounter = 147
2016/11/11 10:55:55     client:4        mycounter = 148
2016/11/11 10:55:55     client:3        mycounter = 149
2016/11/11 10:55:55     client:1        mycounter = 150
2016/11/11 10:55:55     client:2        mycounter = 151
2016/11/11 10:55:55     client:4        mycounter = 152
2016/11/11 10:55:55     client:0        mycounter = 153
2016/11/11 10:55:55     client:3        mycounter = 154
2016/11/11 10:55:55     client:1        mycounter = 155
2016/11/11 10:55:55     client:2        mycounter = 156
2016/11/11 10:55:55     client:4        mycounter = 157
2016/11/11 10:55:55     client:0        mycounter = 158
2016/11/11 10:55:55     client:3        mycounter = 159
2016/11/11 10:55:55     client:1        mycounter = 160
2016/11/11 10:55:55     client:2        mycounter = 161
2016/11/11 10:55:55     client:4        mycounter = 162
2016/11/11 10:55:55     client:0        mycounter = 163
2016/11/11 10:55:55     client:3        mycounter = 164
2016/11/11 10:55:55     client:1        mycounter = 165
2016/11/11 10:55:55     client:2        mycounter = 166
2016/11/11 10:55:55     client:4        mycounter = 167
2016/11/11 10:55:55     client:0        mycounter = 168
2016/11/11 10:55:55     client:3        mycounter = 169
2016/11/11 10:55:55     client:2        mycounter = 171
2016/11/11 10:55:55     client:4        mycounter = 172
2016/11/11 10:55:55     client:0        mycounter = 173
2016/11/11 10:55:55     client:1        mycounter = 170
2016/11/11 10:55:55     client:3        mycounter = 174
2016/11/11 10:55:55     client:2        mycounter = 175
2016/11/11 10:55:55     client:4        mycounter = 176
2016/11/11 10:55:55     client:0        mycounter = 177
2016/11/11 10:55:55     client:1        mycounter = 178
2016/11/11 10:55:55     client:3        mycounter = 179
2016/11/11 10:55:55     client:2        mycounter = 180
2016/11/11 10:55:55     client:4        mycounter = 181
2016/11/11 10:55:55     client:0        mycounter = 182
2016/11/11 10:55:55     client:1        mycounter = 183
2016/11/11 10:55:55     client:3        mycounter = 184
2016/11/11 10:55:55     client:2        mycounter = 185
2016/11/11 10:55:55     client:4        mycounter = 186
2016/11/11 10:55:55     client:0        mycounter = 187
2016/11/11 10:55:55     client:1        mycounter = 188
2016/11/11 10:55:55     client:3        mycounter = 189
2016/11/11 10:55:55     client:2        mycounter = 190
2016/11/11 10:55:55     client:4        mycounter = 191
2016/11/11 10:55:55     client:0        mycounter = 192
2016/11/11 10:55:55     client:1        mycounter = 193
2016/11/11 10:55:55     client:3        mycounter = 194
2016/11/11 10:55:55     client:2        mycounter = 195
2016/11/11 10:55:55     client:4        mycounter = 196
2016/11/11 10:55:55     client:0        mycounter = 197
2016/11/11 10:55:55     client:1        mycounter = 198
2016/11/11 10:55:55     client:3        mycounter = 199
2016/11/11 10:55:55     client:2        mycounter = 200
2016/11/11 10:55:55     client:4        mycounter = 201
2016/11/11 10:55:55     client:0        mycounter = 202
2016/11/11 10:55:55     client:1        mycounter = 203
2016/11/11 10:55:55     client:3        mycounter = 204
2016/11/11 10:55:55     client:2        mycounter = 205
2016/11/11 10:55:55     client:4        mycounter = 206
2016/11/11 10:55:55     client:0        mycounter = 207
2016/11/11 10:55:55     client:1        mycounter = 208
2016/11/11 10:55:55     client:3        mycounter = 209
2016/11/11 10:55:55     client:2        mycounter = 210
2016/11/11 10:55:55     client:4        mycounter = 211
2016/11/11 10:55:55     client:0        mycounter = 212
2016/11/11 10:55:55     client:1        mycounter = 213
2016/11/11 10:55:55     client:3        mycounter = 214
2016/11/11 10:55:55     client:2        mycounter = 215
2016/11/11 10:55:55     client:4        mycounter = 216
2016/11/11 10:55:55     client:0        mycounter = 217
2016/11/11 10:55:55     client:1        mycounter = 218
2016/11/11 10:55:55     client:3        mycounter = 219
2016/11/11 10:55:55     client:2        mycounter = 220
2016/11/11 10:55:55     client:4        mycounter = 221
2016/11/11 10:55:55     client:0        mycounter = 222
2016/11/11 10:55:55     client:1        mycounter = 223
2016/11/11 10:55:55     client:3        mycounter = 224
2016/11/11 10:55:55     client:2        mycounter = 225
2016/11/11 10:55:55     client:0        mycounter = 227
2016/11/11 10:55:55     client:1        mycounter = 228
2016/11/11 10:55:55     client:4        mycounter = 226
2016/11/11 10:55:55     client:2        mycounter = 230
2016/11/11 10:55:55     client:3        mycounter = 229
2016/11/11 10:55:55     client:0        mycounter = 231
2016/11/11 10:55:55     client:1        mycounter = 232
2016/11/11 10:55:55     client:4        mycounter = 233
2016/11/11 10:55:55     client:2        mycounter = 234
2016/11/11 10:55:55     client:3        mycounter = 235
2016/11/11 10:55:55     client:0        mycounter = 236
2016/11/11 10:55:55     client:1        mycounter = 237
2016/11/11 10:55:55     client:4        mycounter = 238
2016/11/11 10:55:55     client:2        mycounter = 239
2016/11/11 10:55:55     client:3        mycounter = 240
2016/11/11 10:55:55     client:0        mycounter = 241
2016/11/11 10:55:55     client:1        mycounter = 242
2016/11/11 10:55:55     client:4        mycounter = 243
2016/11/11 10:55:55     client:2        mycounter = 244
2016/11/11 10:55:55     client:3        mycounter = 245
2016/11/11 10:55:55     client:0        mycounter = 246
2016/11/11 10:55:55     client:1        mycounter = 247
2016/11/11 10:55:55     client:4        mycounter = 248
2016/11/11 10:55:55     client:3        mycounter = 250
2016/11/11 10:55:55     client:2        mycounter = 249
2016/11/11 10:55:55     client:0        mycounter = 251
2016/11/11 10:55:55     client:1        mycounter = 252
2016/11/11 10:55:55     client:4        mycounter = 253
2016/11/11 10:55:55     client:3        mycounter = 254
2016/11/11 10:55:55     client:2        mycounter = 255
2016/11/11 10:55:55     client:0        mycounter = 256
2016/11/11 10:55:55     client:1        mycounter = 257
2016/11/11 10:55:55     client:4        mycounter = 258
2016/11/11 10:55:55     client:3        mycounter = 259
2016/11/11 10:55:55     client:2        mycounter = 260
2016/11/11 10:55:55     client:0        mycounter = 261
2016/11/11 10:55:55     client:1        mycounter = 262
2016/11/11 10:55:55     client:4        mycounter = 263
2016/11/11 10:55:55     client:3        mycounter = 264
2016/11/11 10:55:55     client:2        mycounter = 265
2016/11/11 10:55:55     client:0        mycounter = 266
2016/11/11 10:55:55     client:1        mycounter = 267
2016/11/11 10:55:55     client:4        mycounter = 268
2016/11/11 10:55:55     client:3        mycounter = 269
2016/11/11 10:55:55     client:2        mycounter = 270
2016/11/11 10:55:55     client:0        mycounter = 271
2016/11/11 10:55:55     client:1        mycounter = 272
2016/11/11 10:55:55     client:4        mycounter = 273
2016/11/11 10:55:55     client:3        mycounter = 274
2016/11/11 10:55:55     client:2        mycounter = 275
2016/11/11 10:55:55     client:0        mycounter = 276
2016/11/11 10:55:55     client:1        mycounter = 277
2016/11/11 10:55:55     client:4        mycounter = 278
2016/11/11 10:55:55     client:3        mycounter = 279
2016/11/11 10:55:55     client:2        mycounter = 280
2016/11/11 10:55:55     client:0        mycounter = 281
2016/11/11 10:55:55     client:1        mycounter = 282
2016/11/11 10:55:55     client:4        mycounter = 283
2016/11/11 10:55:55     client:3        mycounter = 284
2016/11/11 10:55:55     client:2        mycounter = 285
2016/11/11 10:55:55     client:0        mycounter = 286
2016/11/11 10:55:55     client:1        mycounter = 287
2016/11/11 10:55:55     client:4        mycounter = 288
2016/11/11 10:55:55     client:0        mycounter = 290
2016/11/11 10:55:55     client:3        mycounter = 289
2016/11/11 10:55:55     client:2        mycounter = 291
2016/11/11 10:55:55     client:1        mycounter = 292
2016/11/11 10:55:55     client:4        mycounter = 293
2016/11/11 10:55:55     client:0        mycounter = 294
2016/11/11 10:55:55     client:3        mycounter = 295
2016/11/11 10:55:55     client:2        mycounter = 296
2016/11/11 10:55:55     client:1        mycounter = 297
2016/11/11 10:55:55     client:4        mycounter = 298
2016/11/11 10:55:55     client:0        mycounter = 299
2016/11/11 10:55:55     client:3        mycounter = 300
2016/11/11 10:55:55     client:2        mycounter = 301
2016/11/11 10:55:55     client:1        mycounter = 302
2016/11/11 10:55:55     client:4        mycounter = 303
2016/11/11 10:55:55     client:0        mycounter = 304
2016/11/11 10:55:55     client:3        mycounter = 305
2016/11/11 10:55:55     client:2        mycounter = 306
2016/11/11 10:55:55     client:1        mycounter = 307
2016/11/11 10:55:55     client:4        mycounter = 308
2016/11/11 10:55:55     client:0        mycounter = 309
2016/11/11 10:55:55     client:3        mycounter = 310
2016/11/11 10:55:55     client:2        mycounter = 311
2016/11/11 10:55:55     client:1        mycounter = 312
2016/11/11 10:55:55     client:4        mycounter = 313
2016/11/11 10:55:55     client:3        mycounter = 315
2016/11/11 10:55:55     client:0        mycounter = 314
2016/11/11 10:55:55     client:2        mycounter = 316
2016/11/11 10:55:55     client:1        mycounter = 317
2016/11/11 10:55:55     client:3        mycounter = 318
2016/11/11 10:55:55     client:4        mycounter = 319
2016/11/11 10:55:55     client:0        mycounter = 320
2016/11/11 10:55:55     client:1        mycounter = 322
2016/11/11 10:55:55     client:2        mycounter = 321
2016/11/11 10:55:55     client:3        mycounter = 323
2016/11/11 10:55:55     client:4        mycounter = 324
2016/11/11 10:55:55     client:0        mycounter = 325
2016/11/11 10:55:55     client:1        mycounter = 326
2016/11/11 10:55:55     client:2        mycounter = 327
2016/11/11 10:55:55     client:3        mycounter = 328
2016/11/11 10:55:55     client:1        mycounter = 330
2016/11/11 10:55:55     client:4        mycounter = 329
2016/11/11 10:55:55     client:0        mycounter = 331
2016/11/11 10:55:55     client:2        mycounter = 332
2016/11/11 10:55:55     client:3        mycounter = 333
2016/11/11 10:55:55     client:1        mycounter = 334
2016/11/11 10:55:55     client:4        mycounter = 335
2016/11/11 10:55:55     client:0        mycounter = 336
2016/11/11 10:55:55     client:2        mycounter = 337
2016/11/11 10:55:55     client:3        mycounter = 338
2016/11/11 10:55:55     client:1        mycounter = 339
2016/11/11 10:55:55     client:4        mycounter = 340
2016/11/11 10:55:55     client:0        mycounter = 341
2016/11/11 10:55:55     client:2        mycounter = 342
2016/11/11 10:55:55     client:3        mycounter = 343
2016/11/11 10:55:55     client:4        mycounter = 345
2016/11/11 10:55:55     client:0        mycounter = 346
2016/11/11 10:55:55     client:2        mycounter = 347
2016/11/11 10:55:55     client:1        mycounter = 344
2016/11/11 10:55:55     client:3        mycounter = 348
2016/11/11 10:55:55     client:4        mycounter = 349
2016/11/11 10:55:55     client:0        mycounter = 350
2016/11/11 10:55:55     client:2        mycounter = 351
2016/11/11 10:55:55     client:1        mycounter = 352
2016/11/11 10:55:55     client:4        mycounter = 354
2016/11/11 10:55:55     client:3        mycounter = 353
2016/11/11 10:55:55     client:0        mycounter = 355
2016/11/11 10:55:55     client:2        mycounter = 356
2016/11/11 10:55:55     client:1        mycounter = 357
2016/11/11 10:55:55     client:4        mycounter = 358
2016/11/11 10:55:55     client:3        mycounter = 359
2016/11/11 10:55:55     client:0        mycounter = 360
2016/11/11 10:55:55     client:2        mycounter = 361
2016/11/11 10:55:55     client:1        mycounter = 362
2016/11/11 10:55:55     client:4        mycounter = 363
2016/11/11 10:55:55     client:3        mycounter = 364
2016/11/11 10:55:55     client:2        mycounter = 366
2016/11/11 10:55:55     client:1        mycounter = 367
2016/11/11 10:55:55     client:0        mycounter = 365
2016/11/11 10:55:55     client:4        mycounter = 368
2016/11/11 10:55:55     client:3        mycounter = 369
2016/11/11 10:55:55     client:1        mycounter = 371
2016/11/11 10:55:55     client:2        mycounter = 370
2016/11/11 10:55:55     client:0        mycounter = 372
2016/11/11 10:55:55     client:4        mycounter = 373
2016/11/11 10:55:55     client:3        mycounter = 374
2016/11/11 10:55:55     client:1        mycounter = 375
2016/11/11 10:55:55     client:2        mycounter = 376
2016/11/11 10:55:55     client:0        mycounter = 377
2016/11/11 10:55:55     client:4        mycounter = 378
2016/11/11 10:55:55     client:3        mycounter = 379
2016/11/11 10:55:55     client:1        mycounter = 380
2016/11/11 10:55:55     client:2        mycounter = 381
2016/11/11 10:55:55     client:0        mycounter = 382
2016/11/11 10:55:55     client:4        mycounter = 383
2016/11/11 10:55:55     client:3        mycounter = 384
2016/11/11 10:55:55     client:2        mycounter = 386
2016/11/11 10:55:55     client:1        mycounter = 385
2016/11/11 10:55:55     client:0        mycounter = 387
2016/11/11 10:55:55     client:4        mycounter = 388
2016/11/11 10:55:55     client:3        mycounter = 389
2016/11/11 10:55:55     client:2        mycounter = 390
2016/11/11 10:55:55     client:1        mycounter = 391
2016/11/11 10:55:55     client:0        mycounter = 392
2016/11/11 10:55:55     client:4        mycounter = 393
2016/11/11 10:55:55     client:3        mycounter = 394
2016/11/11 10:55:55     client:2        mycounter = 395
2016/11/11 10:55:55     client:1        mycounter = 396
2016/11/11 10:55:55     client:4        mycounter = 398
2016/11/11 10:55:55     client:0        mycounter = 397
2016/11/11 10:55:55     client:3        mycounter = 399
2016/11/11 10:55:55     client:2        mycounter = 400
2016/11/11 10:55:55     client:4        mycounter = 402
2016/11/11 10:55:55     client:1        mycounter = 401
2016/11/11 10:55:55     client:0        mycounter = 403
2016/11/11 10:55:55     client:3        mycounter = 404
2016/11/11 10:55:55     client:4        mycounter = 405
2016/11/11 10:55:55     client:2        mycounter = 406
2016/11/11 10:55:55     client:1        mycounter = 407
2016/11/11 10:55:55     client:0        mycounter = 408
2016/11/11 10:55:55     client:3        mycounter = 409
2016/11/11 10:55:55     client:4        mycounter = 410
2016/11/11 10:55:55     client:2        mycounter = 411
2016/11/11 10:55:55     client:1        mycounter = 412
2016/11/11 10:55:55     client:3        mycounter = 414
2016/11/11 10:55:55     client:0        mycounter = 413
2016/11/11 10:55:55     client:4        mycounter = 415
2016/11/11 10:55:55     client:2        mycounter = 416
2016/11/11 10:55:55     client:3        mycounter = 418
2016/11/11 10:55:55     client:1        mycounter = 417
2016/11/11 10:55:55     client:0        mycounter = 419
2016/11/11 10:55:55     client:4        mycounter = 420
2016/11/11 10:55:55     client:2        mycounter = 421
2016/11/11 10:55:55     client:3        mycounter = 422
2016/11/11 10:55:55     client:1        mycounter = 423
2016/11/11 10:55:55     client:0        mycounter = 424
2016/11/11 10:55:55     client:2        mycounter = 426
2016/11/11 10:55:55     client:4        mycounter = 425
2016/11/11 10:55:55     client:3        mycounter = 427
2016/11/11 10:55:55     client:1        mycounter = 428
2016/11/11 10:55:55     client:0        mycounter = 429
2016/11/11 10:55:55     client:2        mycounter = 430
2016/11/11 10:55:55     client:4        mycounter = 431
2016/11/11 10:55:55     client:3        mycounter = 432
2016/11/11 10:55:55     client:0        mycounter = 433
2016/11/11 10:55:55     client:2        mycounter = 435
2016/11/11 10:55:55     client:1        mycounter = 434
2016/11/11 10:55:55     client:4        mycounter = 436
2016/11/11 10:55:55     client:3        mycounter = 437
2016/11/11 10:55:55     client:0        mycounter = 438
2016/11/11 10:55:55     client:2        mycounter = 439
2016/11/11 10:55:55     client:1        mycounter = 440
2016/11/11 10:55:55     client:3        mycounter = 442
2016/11/11 10:55:55     client:0        mycounter = 443
2016/11/11 10:55:55     client:4        mycounter = 441
2016/11/11 10:55:55     client:2        mycounter = 444
2016/11/11 10:55:55     client:0        mycounter = 446
2016/11/11 10:55:55     client:1        mycounter = 445
2016/11/11 10:55:55     client:3        mycounter = 447
2016/11/11 10:55:55     client:4        mycounter = 448
2016/11/11 10:55:55     client:2        mycounter = 449
2016/11/11 10:55:55     client:1        mycounter = 450
2016/11/11 10:55:55     client:0        mycounter = 451
2016/11/11 10:55:55     client:3        mycounter = 452
2016/11/11 10:55:55     client:1        mycounter = 454
2016/11/11 10:55:55     client:4        mycounter = 453
2016/11/11 10:55:55     client:2        mycounter = 455
2016/11/11 10:55:55     client:0        mycounter = 456
2016/11/11 10:55:55     client:1        mycounter = 458
2016/11/11 10:55:55     client:3        mycounter = 457
2016/11/11 10:55:55     client:4        mycounter = 459
2016/11/11 10:55:55     client:2        mycounter = 460
2016/11/11 10:55:55     client:0        mycounter = 461
2016/11/11 10:55:55     client:3        mycounter = 463
2016/11/11 10:55:55     client:1        mycounter = 462
2016/11/11 10:55:55     client:4        mycounter = 464
2016/11/11 10:55:55     client:2        mycounter = 465
2016/11/11 10:55:55     client:0        mycounter = 466
2016/11/11 10:55:55     client:3        mycounter = 467
2016/11/11 10:55:55     client:1        mycounter = 468
2016/11/11 10:55:55     client:2        mycounter = 469
2016/11/11 10:55:55     client:4        mycounter = 470
2016/11/11 10:55:55     client:0        mycounter = 471
2016/11/11 10:55:55     client:3        mycounter = 472
2016/11/11 10:55:55     client:2        mycounter = 473
2016/11/11 10:55:55 Finished client:2
2016/11/11 10:55:55     client:1        mycounter = 474
2016/11/11 10:55:55     client:4        mycounter = 475
2016/11/11 10:55:55     client:0        mycounter = 476
2016/11/11 10:55:55     client:3        mycounter = 477
2016/11/11 10:55:55     client:4        mycounter = 478
2016/11/11 10:55:55     client:1        mycounter = 479
2016/11/11 10:55:55     client:0        mycounter = 480
2016/11/11 10:55:55     client:4        mycounter = 481
2016/11/11 10:55:55     client:3        mycounter = 482
2016/11/11 10:55:55     client:1        mycounter = 483
2016/11/11 10:55:55     client:0        mycounter = 484
2016/11/11 10:55:55     client:4        mycounter = 485
2016/11/11 10:55:55     client:3        mycounter = 486
2016/11/11 10:55:55     client:1        mycounter = 487
2016/11/11 10:55:55     client:0        mycounter = 488
2016/11/11 10:55:55     client:1        mycounter = 491
2016/11/11 10:55:55 Finished client:1
2016/11/11 10:55:55     client:3        mycounter = 490
2016/11/11 10:55:55     client:4        mycounter = 489
2016/11/11 10:55:55     client:0        mycounter = 492
2016/11/11 10:55:55     client:3        mycounter = 493
2016/11/11 10:55:55     client:4        mycounter = 494
2016/11/11 10:55:55 Finished client:4
2016/11/11 10:55:55     client:0        mycounter = 495
2016/11/11 10:55:55     client:3        mycounter = 496
2016/11/11 10:55:55     client:0        mycounter = 497
2016/11/11 10:55:55     client:3        mycounter = 498
2016/11/11 10:55:55     client:0        mycounter = 499
2016/11/11 10:55:55 Finished client:0
2016/11/11 10:55:55     client:3        mycounter = 500
2016/11/11 10:55:55 Finished client:3
2016/11/11 10:55:55 Finished.

It works! Now you can create an API service for providing counters running on App Engine. You may need to use a flexible environment since go client library is not supported on the standard environment at the time of writing.

Disclaimer: All code snippets are released under Apache 2.0 License. This is not an official Google product.