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

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

2022/03

JavaScript で乱数を扱う際の話です。

「乱数」はその名前の通り「事前に予測できないランダムな値」のことや、その生成の仕組みのことを呼びます。JavaScript にも乱数を生成する機能は標準で用意されており、Math.random() という関数を実行することで 0 から 1 の間のランダムな小数を取得することができます。

もし0から1の間の小数の乱数ではなく、「10以上20未満のランダムな整数の乱数」が必要な場合は以下のように Math.floor() (小数部分を切り捨てて整数化する関数)と組み合わせることで目的の乱数を得ることができます:
Math.floor( Math.random() * 10 ) + 10

この JavaScript の乱数は標準機能として備わっていて、すぐに使えるという点では便利です。しかしシード(seed)に対応していない、という、場合によっては困る点があります。

シードは乱数を初期化する時に指定する値です。同じシードで初期化した乱数システムは同じ乱数を返すようになります。例えば1という値をシードに指定して乱数を初期化して3回乱数を発生させたとします(発生した値を a1, a2, a3 とします)。別の機会に同じ1をシードに指定して乱数を初期化してから3回乱数を発生させて、それらの値をそれぞれ b1, b2, b3 とします。この時、同じシードを指定してから実行しているので、a1 = b1, a2 = b2, a3 = b3 が成立します。a1 も a2 も a3 も乱数なので事前に予測することはできませんが、同じシードを指定して実行したのであれば b1, b2, b3 がそれぞれ a1, a2, a3 と同じ値が取得できることが事前に保障されます。このように再現性のある乱数を発生させる仕組みが必要になることがある※のですが、JavaScript の Math.random() はこのシードには対応していない、という問題があります。

※例えば「ウェブページ内に1日ごとにランダムな画像を表示する(同じ日にアクセスした場合は同じ画像が表示される)」という仕組みを作ろうとした場合、本当にランダムな関数を使って表示画像を選ぼうとすると、アクセスするたびに異なる画像が選ばれてしまうことになります。 一方、シードに対応した乱数であれば、例えば日付からタイムスタンプ値を取るなどして数値化し、その数値をシードに指定して乱数を1個取得すれば、その値は事前に予測はできませんが(同じシードで初期化しているので)同じ日に実行していれば同じ値になります。ということは同じ画像を選んで表示することができるようになる、というものです。

で、このような再現性のある乱数を JavaScript で実現するにはどうすればよいか? という問題です。答としては「自分で用意する」ことになります。例えば以下のような感じ(こちらの記事を参考にしています):

class Random {
  constructor(seed = 19681106) {
    this.x = 31415926535;
    this.y = 8979323846;
    this.z = 2643383279;
    this.w = seed;
  }
  
  // XorShift
  next() {
    let t;
 
    t = this.x ^ (this.x << 11);
    this.x = this.y; this.y = this.z; this.z = this.w;
    return this.w = (this.w ^ (this.w >>> 19)) ^ (t ^ (t >>> 8)); 
  }
  
  // min以上max以下の乱数を生成する
  nextInt(min, max) {
    const r = Math.abs(this.next());
    return min + (r % (max + 1 - min));
  }
}

上述のようなクラスを事前に定義しておきます(x, y, z の値は自由に変更してかまいません。ちなみに↑の例は円周率の最初の31桁を使っています)。その上で以下のように使います:
  //. 今日の日付
  var dt = new Date();
  var y = dt.getFullYear();
  var m = dt.getMonth() + 1;
  m = ( ( m < 10 ) ? '0' : '' ) + m;
  var d = dt.getDate();
  d = ( ( d < 10 ) ? '0' : '' ) + d;

  //. 今日の午前零時のタイムスタンプをシードとして取得
  dt = new Date( y + '-' + m + '-' + d + ' 00:00:00' );
  var seed = dt.getTime();

  //. 今日の午前零時のタイムスタンプをシードに関数を初期化
  var random = new Random( seed );

  //. 0以上100未満の乱数を発生させる
  var value = random.nextInt( 0, 100 );

(かなり無理やり感ありますが・・)このように JavaScript を記述すると日が変わるまでの間は同じシード値を使って初期化することになります。したがって最後の行で乱数を発生させていますが、ここで取得する乱数値は同じ日に実行する間は同じ結果になる、というものです。

Google Apps(無料版)を使って所有するドメインのメール環境を続けてきましたが、無料期間が終了することになり、メールアカウントを残すにはメールサーバー環境を引っ越す必要が生じました。

先日、このブログで Zoho メールで独自ドメインメールを無料運用するための手順を紹介しました。これは1つの解決策ではありますが、5ユーザーまでとか、添付ファイルは最大25MBとか、これまでの環境からの移行としては少し制約の大きなものでもありました(無料、という非常に大きな魅力はありますけど)。
http://dotnsf.blog.jp/archives/1080247716.html

2022030501



ただこの Zoho メールを使う方法には隠れた制約がありました。手順内でも紹介しているのですが、独自ドメインメール環境を申請するためには、その独自ドメインではないメールアドレスを使ってアカウントを作成する必要があり、そのメールアドレスは他のドメインのメール環境には使えないのでした。つまりドメインを複数所有していて、その複数のドメインを全て Zoho メール(無料版)に移行するには同じ数のメールアドレスが必要でした。これは無料メールアカウントを複数発行すればできなくはないのですが、管理対象のメールアドレスが増えるだけでなく、どのメールアドレスをどのドメインの申請に使ったかを把握しておく必要も生じてしまい、色々面倒な運用になってしまいそうでした。


この状況を避けるべく、(無料ではないが)格安で独自ドメインのメール環境を用意してくれる環境を用意することにしました。その例として今回申し込んだのはさくらインターネット様の「さくらのメールボックス」サービスです:
https://rs.sakura.ad.jp/mail/

2022032500



サービス内容はこんな感じです:
・独自ドメインを20個まで利用可※
・メールアドレス数は無制限※
・容量は(全ユーザーの合計で)20GB
・1年間で 1048 円(2週間の無料お試し可)


※異なるドメインの同じ名前のユーザー(例えば admin@domain1.com と admin@domain2.net)のメールアドレスを別々に作ることはできず、いずれのアドレス宛のメールも同じメールボックスに届きます。


データ容量自体は全ユーザーの合計で 20GB と、Zoho メール(1ユーザーあたり 5GB で、5ユーザーまで)と比べても小さいのですが、独自ドメインを 20 個まで登録できることに加え、メールアドレスを無制限に持てるというアドバンテージがあります(ユーザーあたりのメール容量があまり大きくないケースであればこちらのほうが向いている可能性があります)。また価格も個人利用と考えても決して高くはなく、このくらいならお小遣いでなんとか・・・ というレベルだと思っています。

今回、これまで Google Apps でメール運用してきた所有ドメインの1つ(welove.bz)をさくらのメールボックス環境に移行してみたので、その手順を記録として残しました。他のドメイン※も同様に移行するつもりですが、その内容を以下に公開します。なお以下の作業は「 Google Apps からの移行」に特化した内容はほぼなくて(現在どこで運用してるとかしてないとかに関係なくて)、単に「さくらのメールボックスで独自ドメインのメールを運用するための設定」の紹介となります。


※ドメイン管理を移管する場合、「さくらのインターネット」へのドメイン移管ができるのは .com, .net, .org, .info, .biz, .tokyo, .mobi のみのようです。今回はドメインの移管をせずに DNS の設定だけで実施する方法を紹介します:
https://help.sakura.ad.jp/206205811/#trouble01



【「さくらのメールボックス」と契約】
契約手続きそのものを詳しく紹介するつもりはありませんが、何はともあれ「さくらのメールボックス」と契約する必要があります。上述のページから「2週間無料ではじめる」と書かれたリンクをクリックして契約内容を入力していきます。クレジットカードが必要ですが、特に難しいことはないと思います:
2022032501


契約が完了すると、さくらインターネットの会員メニューにログインできるようになり、「契約中のサービス一覧」に「さくらのメールボックス」が表示されるようになります。この時点ではまだ独自ドメインの設定はできていませんが、初期ドメインと呼ばれる *****.sakura.ne.jp という値が付与されます。この値は後で DNS 設定時に使うので覚えておきましょう。

この「コントロールパネルを開く」と書かれたボタンをクリックして独自ドメインを含むメールボックスの設定画面に移動します:
2022032502


サーバコントロールパネルというサーバーの設定変更画面にログインします。契約時に送付されたドメイン名とパスワードを入力して「ログイン」ボタンをクリックします:
2022032503


ログインに成功すると以下のような「サーバコントロールパネル ホーム」画面が表示されます。ここから独自ドメインを利用するための設定を行っていきます:
2022032504


以下では自分が所有していて、Google Apps で運用していた "welove.bz" というドメインのメール環境を移行する様子を紹介します。なお、このドメイン自体は GoDaddy.com で取得したものです。他のドメインプロバイダーを使っている場合は一部異なる設定内容が含まれると思いますのでご了承ください。


【「さくらのメールボックス」で独自ドメイン利用の設定】
改めて「さくらのメールボックス」のコントロールパネルを使って独自ドメインのメール環境を構築します。今回は自分が取得している独自ドメイン(welove.bz)のメールサーバー環境を構築する様子を紹介します。

画面左のメニューから「ドメイン/SSL」 - 「ドメイン/SSL」 を選択します:
2022032501


ドメイン/SSL の設定画面になり、現在までに登録されているメールのドメイン(デフォルトの1つ)が表示されています。ここで「ドメイン新規追加」をクリックします:
2022032502


「ドメインの新規追加」画面に切り替わります。追加するドメインの指定方法によっていくつかの選択肢が用意されていますが、(これから取得して追加するのではなく)すでに取得済みのドメインを追加する場合は画面下にスクロールします:
2022032503


ドメインの管理そのものを移管する場合は「他社で取得したドメインを移管して使う」から先に進むことになりますが、今回はドメイン管理をそのままにして、メールサーバーの設定のみを行います※。というわけで一番下までスクロールして「他社で取得したドメインを移管せずに使う」の「追加」をクリックします:
2022032901


※上の画面にも書かれていますが、このオプションはさくらのブログでの動作を保証していないようです。


次の画面ではメールサーバーで移管するドメイン(下図では "welove.bz")を指定して「追加」します。ネームサーバーについて云々・・・と書かれていますが、今回ネームサーバーを現行のものから変更するつもりはないので、ここは無視します:
2022032902


するとドメイン/SSL の画面に戻り、指定したドメインが追加されていることを確認します:
2022032903


さくらのメールボックス側で必要な作業は以上です。続けてドメインを管理しているプロバイダー側での DNS 設定画面で変更作業を行います。



【「さくらのメールボックス」向けの DNS 設定変更】
対象ドメインの DNS 変更を行います。自分の場合、対象ドメイン(welove.bz)を GoDaddy.com で取得&管理しているので、以下は GoDaddy.com での作業イメージとなります。が、他のプロバイダーでも同様の作業を行えばよいだけなので、以下のスクリーンショットを参考に同様の作業を行ってください。

具体的には対象ドメインの MX レコードを編集します。またメールサーバーを mail.welove.bz のような名称にしたい場合は合わせて CNAME レコードも編集します。 というわけで、対象ドメインの DNS 管理画面に移動します:
2022032901


まずは MX レコードを以下のように変更(または追加)します。これ以外の MX レコードが存在していたら併せて削除します:
ホスト名: (対象ドメイン名)
TYPE: MX
VALUE: xxxxx.sakura.ne.jp(初期ドメイン名)
状態: 有効
優先度: 10 (など、適当な値)
2022032901


また単にさくらのメールボックス機能を使うだけでなく、メールサーバーに mail.welove.bz という名前をつけて管理したい場合は以下の CNAME レコードも追加します。なお、これをやっておくとウェブメール以外の(POP3/IMAP/SMTP などの)メーラーを使う際のメールサーバーを "mail.welove.bz" などと指定できるようになります:
ホスト名: mail  (メールサーバーを mail.対象ドメイン名 にしたい場合)
TYPE: CNAME
VALUE: xxxxx.sakura.ne.jp(初期ドメイン名)
状態: 有効
2022032902


これで DNS の設定も終わりです。スクリーンショットは GoDaddy.com のものでしたが、他のプロバイダーを使っている場合も同様の作業をすればいいはず。

あとはしばらく(TTL次第ですが、おそらく数分)待てば指定したドメインのメール環境が整います。すでにさくらのメールボックスにユーザーの登録が済んでいればすぐに使えるようになりますが、まだの場合はユーザーを登録します。


【「さくらのメールボックス」へのユーザー追加】
さくらインターネットのサーバーコントロールパネルに戻ります。今回はメールのユーザーを指定するので「メール」メニューを選択してメールアドレスの一覧を表示し、「新規追加」ボタンをクリックします:
2022032901


新規に登録するユーザーの情報を入力します「ユーザ名」と書かれた部分がメールアドレスの @ の左にくる部分となります。また「パスワード」も必須情報です:
2022032902


全ての情報が入力できたら画面下の「作成する」ボタンをクリックします:
2022032903


メールアドレス一覧画面に戻ります。作成したユーザーが追加されていることを確認します:
2022032904


【「さくらのメールボックス」のウェブメールを使う】
ドメイン側の設定変更が済んでいればウェブメールを使うことができるようになります。ウェブメールを使うには以下の URL にアクセスします:
https://secure.sakura.ad.jp/rscontrol/?webmail=1


認証を聞かれるのでメールアドレスと(作成時に指定した)パスワードを入力してログインします:
2022032901


ウェブのメール画面が開きます。この画面を使って受信メールを確認したり、送信・返信が可能です:
2022032902


なお、さくらのメールボックスでウェブメールを使う場合はこちらのドキュメントも参照ください:
https://rs.sakura.ad.jp/function/webmail/

またウェブメール以外の各種メーラーやその設定についてはこちらを参照ください:
https://help.sakura.ad.jp/mail/



同様にして(プラン容量内であれば)更にドメインを追加したり、ユーザーを追加して使うこともできます。ドメインの移管をしない場合は、現行のドメインプロバイダーによって DNS の設定方法が異なるため、画面とかは用意できないのですが、ちょっとした手間をかけるだけで実現できるはずです。また Cloudflare などのドメインレベルでのファイアウォールを使っている場合だとメールのためにドメインの移管をするわけにもいかない(この影響がデカい)ので、この方法のほうがより柔軟性高く実現できると思っています。



Google Apps の無料運用が終わることになり、これまで運用してきた独自ドメインのメールアカウントをどこかへ移行する必要が生じました。

いくつかの移行先候補の中で、「無料で」続けることができる数少ない選択肢が Zoho メール だと思っています。というわけで、Google Apps からの移行を視野に入れて、Zoho メールで独自ドメインのメールアカウントを運用する方法を調べました(ちなみに以下のスクリーンショットを撮った時には FireFox を使っています):
2022030500


【Zoho メールとは】
個人や小規模組織を対象に無料のメール環境を提供しています。GMail 同様、個人でも @zohomail.jp ドメインのメールアカウントを取得することもできますが、今回は独自ドメインでメールを運用できる点に絞って紹介します。なお無料で Zoho の独自ドメインメールを運用する場合の条件は以下のようになります:
・最大5ユーザー
・1ユーザーあたり 5GB のメール容量
・添付ファイルは最大 25MB まで
・Webメールとモバイルアプリのみ(POP3/IMAPなし)



【Zoho メールを独自ドメインで利用するまでの手順】
以下に実際に自分が所有しているドメイン(yellowmix.net)で利用できるようにするまでの手続きの様子を紹介します。Zoho は Zoho Japan が日本人向けのサービスも提供していますが、この Zoho メールの手続きは途中から英語のみになるので、その点にご注意ください。

まずは Zoho メールのトップページへ行き、「広告表示なしメールの使用を開始する」と書かれた箇所で「メールアドレス」を選んで「無料プランに登録する」ボタンを選択します:
2022030501


※ちなみにここで「個人向け」を選ぶと、@zohomail.jp ドメインの無料メールアカウントを取得できます。

このような画面が表示されます。この辺りは有料サービスなので下にスクロールします:
2022030502


「永久に無料のプラン」と書かれたサービスの「無料お試し登録」をクリックします:
2022030503


次の画面では新たに申し込むアカウントの設定に利用する氏名とメールアドレス(今回申し込むメールアドレスのドメインとは別のもの)、そしてパスワードを入力します(既にそのメールアドレスで Zoho のアカウントを取得している場合はログインします)。最後に「登録する」ボタンをクリックします:
2022030501


Zoho メールの設定ウィザードがスタートします。まずはドメインを追加します。今回は既に所有済みのドメインを利用するため「既存のドメインを追加する」「今すぐ追加する」ボタンをクリックします:
2022030502


以下のようなダイアログが表示されるので、登録するドメイン名(www. が表示されているので、そこに続けてドメイン名を入力)、組織名、そして組織の分類(自分は IT を選びました)を指定して「追加する」を選択します:
2022030503


すると次のような画面になり、ドメインの追加ができました。ただ本当にこのドメインを所有しているかどうかを確認する必要があります。続けて「ドメイン認証に進む」をクリックします:
2022030501


ドメインの所有権を認証する画面が表示されます。ここから先はドメインを取得したプロバイダーによって作業内容が変わると思いますが、自分の場合は GoDaddy.com でこのドメインを取得しており、GoDaddy.com の場合は左の「自分の DNS にログインする」を選ぶことで先にすすめることができました。以下、この方法を選んだ場合として説明を続けます:
2022030501


「自分の DNS にログインする」を選択すると DNS プロバイダー(自分の場合は GoDaddy.com)へのログイン認証が行われるので、該当プロバイダーへログインする ID とパスワードを入力してサインインします:
2022030502


正しくサインインできると、Zoho Mail Hosting を有効にする許可を与えるかどうかの確認画面になります。内容を確認して「接続」をクリックします:
2022030503


すると元の画面に戻り、「ドメインの所有者が確認されました」のメッセージが表示されます。これで指定したドメインを本当に自分が取得していることを証明できました。

続けてこのドメインでのユーザーを作成します。

"Your login mail address" と書かれたテキストフィールドに作成するメールアドレスを入力(@yellowmix.net は入力済みなので、その前の部分を入力)して、「作成する」をクリックします:
2022030501


すると以下のような画面が表示され、ユーザーが追加されたことが確認できます。必要に応じてここで「追加する」を選択して、このドメインのメールユーザーを(無料プランであれば最大5ユーザーまで)追加できます。ユーザーの追加が完了したら「グループの設定に進む」をクリックします:
2022030501


グループはユーザーが共有して利用することができるメールアドレスです。必要に応じて「作成する」からグループを作成してください(不要であれば作る必要はありません)。次に進む場合は「DNSの関連付けに進む」をクリックします:
2022030502


次に MX レコードなどのメール用 DNS 設定を行います。が、この前の手続きでドメイン認証が済んでいれば「MX、SPF、DKIM を自動で設定できます」ボタンをクリックするだけです:
2022030503


続いてデータ移行の画面になります。既存メール環境からのデータ移行ができるようですが、今回の自分の場合は新規のメール環境登録なので既存メール環境がありません。ここは何もせずに次の「モバイル設定に進む」を選択しました。ここは実際に試した人からの情報があればいただきたいです:
2022030501


スマホからこのメールを使うための設定画面です。といっても実際にはモバイルアプリへのリンクがあるだけのページでした。必要であればこのページのリンクから Zoho メールのモバイルアプリをダウンロード&インストールしてください。最後に「設定の完了に進む」をクリックします:
2022030502


※上のリンクをクリックするとこのような画面になって、モバイルアプリのダウンロードができるようです:
2022030503


これで全ての設定が完了しました。「受信トレイを確認してください」をクリックします:
2022030501


新しいメール環境が確認できるようになりました。が、改めて最初からのアクセス方法を確認するため、一旦ログアウトしましょう。右上のアイコンをクリックします:
2022030502


そして「サインアウトする」を選択して、サインアウトします:
2022030503



では改めて Zoho メールに作成した独自ドメインのユーザーでログインしてメールを使ってみます。まずは Zoho メールのトップページにアクセスします:
https://www.zoho.com/jp/mail/


そして右上の「サインイン」をクリックします:
2022030501


先程登録した独自ドメインのユーザー名とパスワードでサインインします:
2022030502


初回ログイン時には2段階認証を有効にするよう注意画面が表示されます。必要に応じてここで2段階認証を有効にしてください(後から設定することも可能です)。ここでは一旦「後で確認する」をクリックして先に進みます:
2022030501


これで Zoho メールを送受信できる画面に移動できました!安全のため2段階認証も有効にしておきましょう:
2022030501



以上、独自ドメインを Zoho メールで運用する場合の設定手順を紹介しました。1ドメインあたり5ユーザーまで、というのが個人的にはちと厳しい気もするのですが、Google Apps 亡き今となっては無料で独自ドメインメール運用ができる環境の選択肢そのものが少なく、無料となると(格安のはいくつかありますが)個人的にはここしか知りません。この5ユーザーの範囲内でうまく使っていけると、Google Apps 難民にとっても有用な移行先であるように思えました。


このページのトップヘ