まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2021/07

IBM Cloud から提供されている 30 日間無料 Kubernetes サービスIBM Kubernetes Service 、以下 "IKS")環境を使って利用することのできるコンテナイメージを1日に1個ずつ 30 日間連続で紹介していこうと思います。

初日は "Day 0" という特別な扱いとして、Day 1 以降でサービスを利用できる状態にするための準備作業や、この企画の背景・制約などを紹介していきます。ここでまずサービスを有効にして必要なツール等も導入し、Day 1 からは実際にコンテナを使っていく、という流れの最初の部分です。


【IKS について】
ウェブページやウェブサービスが運用される中で、単に「サービスとして公開できればいい」という時代から、「いかに安定して運用するか」という視点も求められるようになり、クラウドやコンテナといった環境が活用されることが少しずつ普通になってきました。

このコンテナ運用環境としての代表といえるのが Kubernetes(以下、"k8s") であると思っています。IBM 以外も含めたクラウドベンダー各社からもマネージド k8s 環境が提供されていて、各社の特徴を活かしながらの競争状態にあります。

そんな中、IBM Cloud から提供されているマネージド k8s である IKS の最大の特徴の1つが 30 日間無料で使える、という点です(30 日間でいったん k8s クラスタは消えてしまいますが、新しく環境を作り直せば 30 日単位で何回も利用できます。太っ腹!)。

この 30 日間無料で使える IKS は、有料版の IKS と比べていくつかの制約事項(後述)がありますが、ワーカーノード1つを自由に使うことができます。またサービスの外部公開も NodePort と呼ばれる「ワーカーノードのパブリック IP アドレスとポート番号を使った公開方法」に限られてしまいますが可能です。ワーカーノードのスペック範囲内であれば同時に複数のコンテナを起動して利用することもできるので開発段階や勉強目的などでは充分すぎる環境が用意されていると言えます。

この IKS 環境を使って 30 日間で 30 通りの使い方を紹介していく、というのが本ブログエントリの(明日からの30日間の)最大の目的です。


【無料版 IKS の制約事項】
有償製品版と比較しての、30日間無料版 IKS の制約事項は大きく以下の2点です:
・k8s クラスタのワーカーノードは1つ
・Ingress は利用不可。サービスの外部公開方法は NodePort のみ


まず実際のポッドやコンテナがデプロイされる先であるワーカーノードは1つ(vCPU x 2、メモリ 4GB)だけ割り振られます。 いくつかのアドオンが導入可能ですが、この制約により Istio アドオンの導入は(vCPU x 4、メモリ 16GB のワーカーノード3台が必要なので)できません。

また無料版では Ingress を使用することができません。Ingress を使うことで IBM Cloud ドメインによる HTTPS 接続可能なホスト名の割当も可能になるのですが、この環境では使えません。サービスを外部公開するには1つだけ利用可能なワーカーノードの IP アドレスをポート番号指定で公開する、いわゆる NodePort 接続だけが可能です。

この2点の制約はありますが、IP アドレスとポート番号を指定する形でのサービスの公開は可能です。一般的なウェブアプリケーション・サーバー複数台とデータベース・サーバー程度であれば(ワーカーノードのスペック範囲内で)普通に動かすことができると思っています。


【目的】
本ブログでは以下の目的を前提とした環境構築および操作手順を紹介します(ここに書かれていない部分については、できないという意味ではないのですが、無料ではなくなってしまったり、別の面倒な準備作業が必要になってしまったりするため、紹介範囲としての優先度を落とす、という意味だとご理解ください):

・無料の IKS 環境で実際に動かすことができるコンテナイメージを、実際のデプロイ手順とともに紹介する
・ボリュームマウントは(サービスによっては使うと便利な機能であることは理解しているが、無料の範囲外となってしまうことが多そうなので)今回使わない(なので、ここで紹介する内容では再起動時にデータは消えます)
・NodePort を使って(HTTPS ではなく)HTTP でポート番号を指定してサービスを公開する
・デプロイ可能な公開コンテナイメージとサンプル YAML ファイルを用意し、実際にデプロイして、利用するまでの手順を紹介する
・公式イメージが存在して、かつこの IKS 環境で簡単に動かすことができるものであればそちらを優先して紹介しますが、必ずしも公式イメージにこだわるつもりはありません。「簡単に動かす環境が揃っているもの」を優先して調査し、紹介していきます。


【準備】
では実際に IKS を利用するための準備作業を紹介します。作業は大きく(1)サーバー側(IBM Cloud 側) と、(2)クライアント側(利用する人の PC 環境側)、そして(3)CLI でログイン とに別れますが、順に説明します。

(1)サーバー側準備

サーバー側の準備では IKS の 30 日間無料プランを用意するまでの手順を紹介します。まず何はともあれ IBM Cloud のアカウントが必要となるので、お持ちでない場合は IBM Cloud アカウント作成ページからメールアドレスを指定してまずは無料アカウントを作成してください(指定したメールアドレスがログイン ID となります。パスワードはアカウント作成時に指定します)。

次にこの IBM Cloud アカウントを「ベーシックアカウント」に切り替えます。ここが少しややこしいので、説明を加えておきます。 IBM Cloud のアカウントは上記手順でオンラインで作成すると最初は「ライトアカウント」として作成されます。ライトアカウントはメールアドレスだけで作成することができる無料アカウントです。ライトアカウントでログインすると IBM Cloud のサービスの中で無料で提供されているサービスを無料の範囲内で利用することができるようになります。 で、ここが少しややこしいのですが、今回紹介する IKS は 30 日間無料ですがライトアカウントでは利用できないものです。IKS を利用する場合は(有料無料に関係なく)ライトアカウントからベーシックアカウントと呼ばれる有料プランに切り替える必要があります。具体的にはクレジットカードを登録して支払いに関する契約を(オンライン上で)行っていただきます。なお注意点として、この作業を行うことで、これまで無料のライトアカウントで(無料の範囲内だけで)使えていたサービスが、無料の枠を超えて使えるようになってしまい、場合によっては利用料金が発生するようになる可能性があることです。既存のライトアカウントをプラン変更して以下の手順を実行する場合はご注意ください(どうしても不安な場合は別のメールアドレスを使って、あらたにアカウントを作成した上でベーシックアカウントに変更し、こちらのアカウントについては IKS 以外の他のサービスを使わないようにしてください)。

IBM Cloud のベーシックアカウントが使えるようになれば 30 日間無料の IKS が申し込めるようになります。その手順はこちらを参照してください(画面が少し古くて、一部現在の画面内容と異なっている部分もありますが、手順そのものはまだ使えるはずです)。作成時のプランとして、必ず無料の "Free" を選択する点に注意してください(それ以外のは有料の k8s クラスタ環境です):
http://dotnsf.blog.jp/archives/1074305610.html

これで 30 日間無料で利用できる k8s クラスタ環境を IBM Cloud 内に用意することができました:
2021072600


この画面内に(下の赤枠で)表示されているクラスター ID はこの後に何度か使うことになります。そのたびにこのページを開くのは面倒だと思うので、コピペしてどこかに保存しておくことをおすすめします。



(2)クライアント側準備

続いて実際のデプロイ指示を出したり、稼働状況を確認できたりするよう、クライアント PC 側も準備作業を済ませておきます。

まず今回の企画では k8s の CLI である kubectl コマンドと、IBM Cloud CLI である ibmcloud コマンドなど、CLI 環境を使ってデプロイ等を行うことになります。そのためこれらの(自分の PC 環境にあった) CLI アプリケーションを自分の PC にインストールしておく必要があります。

こちらのページを参考に、自分の PC にあった ibmcloud CLI と kubectl CLI を自分の PC にインストールしてください:
https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install


(3)CLI でログイン

最後に(2)で用意した CLI ツールを使って(1)で用意した IKS 環境を使えるよう、CLI ツールでログインする方法を紹介しておきます。この手順は Day 1 以降で実際にデプロイするコマンドを実行する際には事前に済ませておく必要のある手続きとなります。Day 1 以降で何度か実行することになると思うので、まずは練習のつもりで一度実行しておきましょう。

ターミナル(Windows の場合はコマンドプロンプト)を起動します。まずは ibmcloud コマンドを使って IBM Cloud に CLI でログインします。以下のコマンドを実行してください:
$ ibmcloud login -u (メールアドレス) -g (リソースグループ名 通常は default)

-u オプションに続いて IBM Cloud アカウント名(メールアドレス)、-r オプションにはリソースグループと呼ばれるグループ名を指定するのですが、特に指定したり変更していない場合は default を指定して実行してください。パスワードを聞かれるので IBM Cloud にログインする際のパスワードを指定します。またターゲットリージョンを聞かれたら IKS サービスを作成するときに指定したリージョンを指定します。


続けて自分の IKS 環境に接続するためのコマンドを実行します。上述で確認したクラスター ID を指定して以下のコマンドを実行します:
$ ibmcloud ks cluster config -c (クラスターID)

-c オプションに続いてクラスター ID を指定して実行します。


ここまでの作業が成功していると ibmcloud コマンドや kubectl コマンドを使って IKS 内の k8s クラスタの状態を確認できるようになります。例えば以下のコマンドを実行して、IKS のワーカーノードの(今回の無料版は単一ワーカーノードなので、その1つのワーカーノードの)パブリック IP アドレス(以下の例では 169.51.204.190)を確認できます:
$ ibmcloud ks worker ls --cluster (作成したクラスター名 通常は mycluster-free)

2021071102


また、ここまでの手順が成功していると kubectl コマンドも同環境に対して実行できるようになっています。以下のコマンドで IKS 内で動いているすべてのデプロイメントやサービス等を出力してみましょう(IKS 作成直後の場合は以下のような kubernetes サービスのみが表示されます):
$ kubectl get all

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   172.21.0.1      <none>        443/TCP          14d

とりあえずここまでの手順で30日間無料の k8s クラスタ環境を作成し、このクラスタを操作するためのツールの準備もできた、ということになります。


以上、Day 0 で紹介する準備手順の内容でした。Day 1 からは実際に以下のような内容で1日に1つずつコンテナをデプロイして動作確認する様子を紹介していく予定です。

※この表は Day 30 まで紹介した後に全リンクを更新予定です。

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバー?
2?
3?
4?
5?
6データベース?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
17?
18?
19プログラミング?
20?
21?
22?
23?
24?
25アプリケーション?
26?
27?
28?
29?
30?






先日、IBM から無料で商用利用可能な和文フォント IBM Plex Sans JP が公開されました:
無料で商用利用可能な和文フォント「IBM Plex Sans JP」をIBMがリリース

00_m

上記ページで紹介されているようにまとめてダウンロードしてインストールすれば、自分の PC 内のワードやパワーポイント作成時に使えるようになります。 が、自分はプログラマーなのでプログラマーらしくというか、このフォントを使ってウェブページを作り、同フォントをインストールしていないユーザーにもこのフォントで文字が表示されるようなウェブページを作る場合の CSS 指定方法を紹介します。

まず、ページを作る立場の人はフォントをダウンロードする必要があります。上述の Gigazine 様のページではフォントをまとめてダウンロードする方法が紹介されていますが、ここでは特定の1つのフォントだけをダウンロードする方法を紹介します(どちらでもいいです)。

実際の和文フォントが格納されているフォルダを指定してウェブページを開きます:
https://github.com/IBM/plex/tree/master/IBM-Plex-Sans-JP/fonts/complete/otf/hinted

2021072601


ここから目的のフォントを1つ(2つ以上でもいいですけど・・)選んでダウンロードします。とりあえず普通そうな(最後に Regular とある)フォント IBMPlexSansJP-Regular.otf を選んでダウンロードします:
2021072601


そして HTML(CSS) を編集します。先程ダウンロードしたフォントファイル: IBMPlexSansJP-Regular.otf を同じフォルダに入れた状態で、HTML 内または CSS で以下のようなスタイルシートを記述します:
@font-face{
  font-family: IBMPlexSansJP;
  src: url("./IBMPlexSansJP-Regular.otf");
}

.ibmplex{
  font-family: IBMPlexSansJP;
}

これが有効になった(読み込まれた)状態の HTML 内で <p class="ibmplex" style="font-size: 1em;">あいうえお</p> のように記述すると、クラスを指定した要素は IBMPlexSansJP-Regular.otf フォントで表示されるようになります:


あとはこの HTML, CSS とフォントファイルをまとめてサーバーにアップロードすれば、フォントが埋め込んだページが公開されます。サンプルとしてはこんな感じ:
https://dotnsf.github.io/plex-jp/
<style>
@font-face{
  font-family: IBMPlexSansJP;
  src: url("./IBMPlexSansJP-Regular.otf");
}

.ibmplex{
  font-family: IBMPlexSansJP;
}
</style>

  :
  :

<body>

<h1 class="ibmplex" style="font-size: 2em;">新フォントの紹介</h1>

<div class="container">
  <p class="ibmplex" style="font-size: 1em;">IBM Plex Sans 日本語フォントが公開されました。</p>
  <p style="font-size: 1em;">ここはシステムフォントです。</p>
</div>

</body>

2021072602


ここで紹介した CSS 自体は IBM Plex Sans JP フォント以外でも使える方法ですが、商用利用可能な無料の日本語フォントが貴重なのと、ネットでの評判もまあまあいい感じなので、ぜひ多くの人に IBM Plex Sans JP を使ってみていただきたいです。


 

数学界における未解決問題の1つ「コラッツ予想」に1億2000万円の懸賞金が提供された、というニュースがありました:
数学の未解決問題「コラッツ予想」に1億2000万円の懸賞金

このコラッツ予想とは、このような内容です:
正の整数:nに対して、以下(1)、(2)のルールで計算を繰り返していくと、どんな整数も最終的には必ず1になる
(1)
 ・[A] nが偶数の場合 → nを2で割る
 ・[B] nが奇数の場合 → nに3を掛けて、1を足す
(2)
 ・(1)の結果をnとして、(1)を繰り返す

偶数だと2で割る(値は小さくなる)、奇数だと3を掛けて1を足す(値は大きくなる)という演算を繰り返す中で、大きくなり続けることはなく、必ず1に収束する、とも言いかえることができる予想です。試しに1から10までを計算するとこんな感じになります:
1 : 1
2 : 2 -[A]-> 1
3 : 3 -[B]-> 10 -[A]-> 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
4 : 4 -[A]-> 2 -[A]-> 1
5 : 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
6 : 6 -[A]-> 3 -[B]-> 10 -[A]-> 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
7 : 7 -[B]-> 22 -[A]-> 11 -[B]-> 34 -[A]-> 17 -[B]-> 52 -[A]-> 26 -[A]-> 13 -[B]-> 40 -[A]-> 20 -[A]-> 10 -[A]-> 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
8 : 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
9 : 9 -[B]-> 28 -[A]-> 14 -[A]-> 7 -[B]-> 22 -[A]-> 11 -[B]-> 34 -[A]-> 17 -[B]-> 52 -[A]-> 26 -[A]-> 13 -[B]-> 40 -[A]-> 20 -[A]-> 10 -[A]-> 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1
10 : 10 -[A]-> 5 -[B]-> 16 -[A]-> 8 -[A]-> 4 -[A]-> 2 -[A]-> 1

とりあえず1から10までの整数に関して予想は正しそうです。ただこの予想は「どんな整数であってもこれが成立する」ことを証明するか、「この予想が間違っていることを証明できる(予想に該当しない)整数の例を提示する」ことができれば1億2000万円、という賞金が用意されたことになります。


この予想が最終的に正しかったとしても、予想が間違っていたとしても(少なくとも現在までどちらも証明できた人は存在していないという事実からも)証明するのはかなり難しいことは間違い有りません。それでも興味ある方はぜひ1億2000万目指して頑張ってみてくださいw


で、今回のブログエントリで紹介するのは、このコラッツ予想をコンピュータで解くための準備段階のようなものです。 この予想が正しいかどうかをコンピュータを使ってできるところまで計算する(もし途中で1になることがない例外の数が見つかったら、それはそれで解けたことになっちゃいますけど・・・)ことに挑戦してみます。

で、この「コンピュータを使って計算」ですが、例えばこのようなコードを用意して実行してみると、10000 以下の整数については全て成立することがわかります:
function colaz( n ){
  if( n % 2 == 0 ){
    return ( n / 2 );
  }else{
    return ( n * 3 + 1 );
  }
}

for( var i = 1; i <= 10000; i ++ ){
  var x = i;
  while( x != 1 ){
    if( x == 1 ){
      console.log( i + ' :  OK' );
      break;
    }else{
      x = colaz( x );
    }
  }
}

じゃあ、後はこの 10000 と書かれた部分を 10000000000000000000000000000000000000000000000000 とかにして実行すると、もしも予想が正しくなければこのくらいの計算中に1つくらいは例外が見つかるんじゃなかろうか・・・ と考えたのですが、このロジックには2点無理がありました。

1点目は単純に時間が足りない可能性です。仮にこの中で例外となる数が存在していたとしても、それが判明するのがいつになるかはわからない(自分やその子、孫が生きているうちに終わる保証もない)、という実行時間の問題です。まあこちらは最悪並列化で高速化できないこともないですけど、、、 

ただ問題はもう1点あります。それはコンピュータプログラムが整数として計算できる最大の数は決まっていて(例えば JavaScript の場合は 9007199254740991 で)、その数値を超えての演算は正しい結果が保証されないことです。つまり JavaScript で普通に計算した場合、計算途中経過も含めて 9007199254740991 以下の値まではこの予想が成立するかどうかを調べることはできるが、それ以上については言語仕様的に調べられない(途中計算に誤差が生じている可能性がある)、ということになるのでした。まあ一般的には 9000 兆強まで計算できれば充分なんでしょうけど。。

このプログラミング言語の仕様における最大整数値を超えて計算するのが「多倍長整数演算」と呼ばれているものです。処理速度が犠牲になることを理解した上で使う必要がありますが、言語仕様における最大整数値を超えてもあふれないように工夫しながら内部的に計算する、というもので、ライブラリ化されて公開されているものもあります(その代わり、計算方法なども通常の JavaScript のものとは別の方法になります)。今回はこの多倍長整数演算ライブラリを使って、任意の整数範囲でコラッツ予想が成立するかどうかを調べることができるようなアプリケーションを作って公開してみました。

※ちなみに今回の問題に関しては整数の範囲内だけで考えればいいのですが、小数を伴う場合はまた別の考え方をする必要があります。

なお、今回のアプリケーションを開発するにあたり、こちらで公開されている多倍長整数演算ライブラリを利用させていただきました:
http://mmua.html.xdomain.jp/bak/


作成したプログラムはこちらで公開していますが・・・
https://github.com/dotnsf/colaz

2021071700


Github Pages を使って、アプリケーションも公開しています。ソースコードに興味はないけど、単にアプリを使ってみたい、という場合はこちらからどうぞ:
https://dotnsf.github.io/colaz/


ウェブブラウザでアプリケーションにアクセスすると以下のような画面になります:
2021071701


ここで Start 欄(初期値は 1)と End 欄(初期値は 10000)に数値を入力して、Colaz ボタンをクリックすると、Start から End までの間でコラッツ予想が成立しているかどうかを多倍長整数演算で調べてくれます。ちなみに初期値のまま Colaz ボタンを押すとこんな感じになりました:
2021071702

※[ ] に括られた数値が元の数値、その右が1になるまでのコラッツ演算の回数です。一番右の ( ) 内の数値はデバッグ用ということで。。


処理時間はパソコンの性能にもよりますが、私の PC で5秒もかからない程度でした。1 から 10000 までの整数でコラッツ予想は成立しているようでした:
2021071703


ただ1~10000では多倍長整数演算でなくてもできる計算なので、あまり面白味はありません。では改めて Start 欄に JavaScript の演算上限値を超える1京(10000000000000000)を入力し、End 欄は1京1万(10000000000010000)を入力してみました。この状態で Colaz ボタンを押してみます:
2021071704


クリック直後から CPU フル稼働で計算がはじまり、途中ほぼフリーズ状態になってこのようなダイアログが表示されますが、そのまま待機します:
2021071705


およそ1分くらいで 10000 個ぶんの計算が完了し、結果が表示されました。値1つに対する計算回数はほぼ 450 を超え、 500 回を超えることもあり、かなり大変な演算になりましたが、この1万個の数値範囲でもコラッツ予想は正しかったことがわかります(例えば1京の場合は 255 回の演算で1になったことがわかります):
2021071706

2021071707


後はこれをうまく分散処理させて、大きな数字については分散環境で計算して・・・なんてことが実現できれば有志参加型の演算が行えていいなあ、と考えて構想しています(希望的観測)。


ちなみに、このライブラリを使った場合の演算方法の一部を紹介します。まず多倍長整数を扱うには普通の数値変数は使えないので、「整数は文字列で表記」して、「演算が必要になったら多倍長整数に変換」して演算することになります。四則演算や比較記号もそのままでは使えません。例えばコラッツ予想の変換ルール([A], [B] 部分)を関数化するとこのようになります:
function colaz_function( str ){
  var x = Big( str );                 // 多倍長整数変換
  if( x.mod( 2 ).eq( 0 ) ){           // 偶数(2で割った余りが0)か?
    x = x.div( 2 );                   // 偶数の場合は2で割る
  }else{
    x = x.mul( 3 ).add( 1 );          // 奇数の場合は3をかけて1を足す
  }

  return x.toString();                // 多倍長整数を文字列に変換した結果を返す
}

数値として扱いきれない数値を文字列数値として扱い、演算時のみ多倍長整数変換して扱う、という処理が必要になります。なお、このコードでは計算途中の数値だけでなく、計算回数も(9000兆を超える可能性がゼロとは言い切れないので)多倍長整数で扱うようにしています。


これをずーーっと解いていってもコラッツ予想が正しいことの証明にはなりませんが、もし途中で例外(何回計算しても1にならない整数)が存在していたことが分かれば、予想が間違っていたことの証明にはなるので、いっそこちらにかけて計算してみる、というのはアリ、、かな?

 

今日、7月13日は「日本標準時制定記念日」です。


というわけで、この日にちなんだネタを1つ紹介します。

ウェブアプリケーションやウェブサービスを作っていると「数値のカンマ表示」を求められることがあります。数値が4桁以上の場合に "1234" を "1,234" と表示する、というやつです。"1234567890" だと "1,234,567,890" になります。画面上で数値を表示する場合はこのようなカンマを必要に応じて加えた上で表示してほしいという面倒なもの。

静的な HTML でページを作る場合は当然ハードコーディングする形で "1234" を "1,234" に書き換える必要がありますが、アプリケーションとしてページを作っていて、その中でアプリケーション的には変数となるような情報をカンマ表示する、という場合はプログラミングコードの中で自動処理をすることもできるので、それほど神経質にならなくても実現できたりします。

特に Node.js を使っている "大抵の" 場合であれば、JavaScript の標準機能を使って実現することができます。それが Number.toLocaleString() です。この関数、正確には「数値をカンマ表示にする関数」ではなく「数値をロケールに合わせた表示に変換する関数」という名前の通りの機能を持っているのですが、日本であれ欧米であれ、ほとんどのロケールにおいて「数値をロケールに合わせて表示」すると3桁ずつのカンマ表示になります。つまり事実上、この関数を通すことで数値をカンマ表記に切り替えることができるようになります。めでたし、めでたし・・・:
var num = 12345;
var str = num.toLocaleString();   // "12,345"


・・・が、今回のブログエントリはこれが上手くいかない例外ケースに関する情報です。それも何故かここで一見すると無関係なはずの docker や k8s といったコンテナ環境が関わってくる話だったりします。

コンテナ環境においては、コンテナイメージを小さくすることが求められているように感じています。その背景には「小さい方が速い」ことや「無料で利用できるコンテナサイズ枠」の問題などが関わっているように感じています。コンテナイメージのサイズを小さくする上で Alpine 製の Linux イメージが多く使われているようです。例えば Node.js アプリケーションのコンテナイメージを作ろうとすると、以下のような Dockerfile ファイルを用意してビルドします(1行目で alpine 製の Node.js v14 イメージを使うよう指定しています):
FROM node:14-alpine
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package*.json ./
COPY . .
EXPOSE 8080
CMD ["node", "app.js"]

この alpine イメージはたしかに標準イメージと比較して(余計なものが含まれていないため)軽量で、イメージサイズを小さくすることができます。コンテナイメージでディスク容量を圧迫するような使い方をしている人(自分)にとっては少しでも小さいイメージで使えるだけでも嬉しいし、無料の非公開レジストリを使おうとすると容量制限が厳しいので、こちらも少しでもイメージを小さくしたいという要望が多くあると思いますが、そういった需要を解決する便利なベースイメージだと認識しています。

ところが、この「余計なものが含まれていない」ことが問題になるケースもあります。その1つが「ロケール情報」です。alpine イメージにはロケールに関する情報が含まれていません。それもあっての軽量化なのですが、ロケールが含まれていないということは上述の Number.toLocaleString() 関数も使えないことを意味しています。ローカルの PC で動作確認している時は(ロケールが有効になって)問題と認識できない部分が、コンテナ化されて動かすと動かないということが起こり得るわけです。かなり気をつけていないと気付けない点であることも含めて厄介な制約だと感じます。

ちなみに、ロケールが使えない環境下で数値をカンマ表記するにはどうすればよいか・・・ ここは「困った時の正規表現」をおすすめします。例えばこんな感じで関数化して使う、とか:
function myLocaleString( num ){
  return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
}

var num = 12345;
var str = myLocaleString( num );  // "12,345"

この部分だけではないのですが、コンテナ環境だけでロケール依存の実装がうまく動かない場合は各種 alpine イメージを使っているかどうかの確認にお気をつけください。そしてこの情報が参考になれば幸いです。


IBM Cloud から提供されているユーザーディレクトリ(ログイン機能用サービス)である App ID で、デモ用途などでまとめて一括でユーザーを作成したいことはないでしょうか? 1件や2件程度であればサービスダッシュボードから直接作成してもいいのですが、10件とか100件とかになると面倒ですよね。

というわけで「指定した CSV ファイルに記載された情報を使って App ID のユーザーを API 経由で作成するツール」を作って公開してみました。Node.js 環境があれば実行可能です:
https://github.com/dotnsf/appid_users


上記リポジトリを git clone するかダウンロード&展開すると test.csv という CSV ファイルが見つかります。このフォーマットに従う形で、
 表示名,メールアドレス,パスワード
という順に値が1行ずつ記録された CSV ファイルを用意します(メールアドレス=ログインIDになります)。

次に settings.js ファイルを編集して、利用する App ID のサービス接続情報に書き換えます。

準備の最後に依存ライブラリをインストールします:
$ npm install


そして create_user.js を Node.js で実行すると、この CSV ファイルに記述されたユーザーをまとめて作成します(最後に対象 CSV ファイルを指定します):
$ node create_user test.csv

この作業後に App ID のコンソールからクラウド・ディレクトリーのユーザー一覧を確認すると、CSV ファイルで指定したユーザーが作成されていることを確認できます:
2021071001


作成後にログイン確認用のウェブアプリケーションを実行して、ユーザーが正しく作成されているかどうかを確認することができます。その場合はリダイレクト URL に http://localhost:8080/appid/callback を追加しておいてください:
2021071003


改めてアプリケーション起動後($ node app)に http://localhost:8080/ にアクセスし、CSV ファイルに含まれていた ID とパスワードを指定して、正しくログインできるかどうかを確認してください。ログインできるようになっていれば無事に CSV ファイルからユーザーをインポートすることができた、ことになります:
$ node app


2021071002



このページのトップヘ