紅蓮のネタ帳

技術系の話を中心とした雑多なブログ

SIMフリー機でのauのAPN設定時の注意点

緊急事態宣言は解除されませんでしたが、とりあえずジム各社が営業再開したので安堵している紅蓮です。
皆様いかがお過ごしでしょうか。

さて、今回はauのAPNの設定の話です。
手持ちのAndroid端末(SIMフリー機)にauのSIMを挿してAPNを手動設定した際、色々ハマったので注意点をまとめました。

auのSIMは挿すだけで使えるわけではない

元々国内の三大キャリアは自社販売端末にSIMを挿して使うことを想定しており、auのAPNも2019年6月頃まで非公開だった。
端末の発売時期やメーカーにもよると思われるが、SIMフリー端末や他社端末(SIMロック解除済)にはauのAPN情報はプリセットされていない場合があり、その場合はAPN情報を手動設定しないと通信はできない。

Xperiaの「インターネット設定」の機能で対応できないパターンあり

f:id:glenxar:20210605213012p:plain

Xperiaのネットワーク設定画面

SIMフリーXperiaの独自機能として、ネットワーク設定の画面に「インターネット設定」のボタンがある。
Wi-Fiに接続した状態でこのボタンを押すとAPN情報をどこかから(恐らくソニーのサーバーから)読み込んで、プリセットのAPNの設定を最新の状態に更新してくれる便利な機能だ。

ドコモと楽天モバイルのSIMはこの方法で半自動的にAPN設定をすることができたが、auのSIMではこの方法は通用しなかった。
自動設定では「LTE NET」ではなく、新プラン向けの「5G NET」および「5G NET for DATA」のAPN情報を拾ってきてしまうためだ。
5Gプラン契約者であれば恐らくこの方法で解決する可能性が高いので、その場合は自動設定に任せてしまうと良いだろう。

また、この独自機能は「手動設定したAPN情報をすべて消去して、サーバーから取得したAPN情報で置き換える」といったありがた迷惑な挙動をするため、手動設定しているAPN情報がある場合に使用すると惨事になりかねないので注意。

APN設定は「公式サイトにある項目だけ」を入れ、残りはデフォルトにする

Google検索すると二次ソースの記事(ブログやITMediaのニュース記事等)がヒットすると思うが、結論から言うと二次ソースに載っている情報が正確とは限らないので、au公式サイトのAPN情報をもとに設定するのが正しい手順となる。

www.au.com

 

APN情報の部分にあるAPN・ユーザ名・パスワード・認証タイプのみを設定し、残りの項目はデフォルト値のまま設定を保存するのが正解となる。
例外として、名前(APNの表示名)は任意の文字列を設定しても通信に一切影響しないので、ここは「au LTE NET(手動設定)」のような分かりやすい名前をつけておくと良い。

二次ソースのサイトによっては上記以外にAPNタイプやAPNプロトコル等を設定している場合があるが、この設定を弄ってしまうと正常に通信できない場合があるので弄らないほうが良い。

余計な設定をするとテザリングが機能しなくなる場合がある

 ここからは失敗談となるが、二次ソースの記事を見ながら設定を行ったところ、とりあえずは4G通信できるようになった。
端末単体で使うなら特段の問題は出ないので、恐らく二次ソースの記事を書いた人はそれ以上の検証をしなかったのだろう。

問題はテザリング使用時で、テザリングで他の端末を接続して使おうとすると、DNSとの通信に失敗してインターネットに接続できない症状が出るのだ。

原因の切り分けとして下記を行った。

  • 複数のWindows機からの接続
    →同様の症状が出たので、恐らくAndroid端末がおかしい
  • auのSIMをiPhoneに挿してみる
    →正常にテザリングできるので、SIMや契約内容は正常
    Android端末がおかしい
  • AndroidのSIMをドコモのSIMに切り替える
    →正常にテザリングできるので、auのAPN設定がおかしい

APN設定がおかしいところまで突き詰めたものの、その先はネットを調べても解決しなかったので途方に暮れていた。
そして、手あたり次第に設定画面を弄っていたら、前述のありがた迷惑機能「インターネット設定」を押してしまい、APNの設定が消去されてしまった。
/(^o^)\ナンテコッタイ

APNを正しく設定すればテザリングもできる

不本意のAPN設定消去が発生したが、不幸中の幸いか、これが意図せず突破口となった。
強制的にAPNを再設定することになり、この際に「もしかしたら二次ソースが間違ってるんじゃないか」と思ったため、au公式サイトのAPN設定を探し、その情報を参考にAPNの設定を行うことにした。

とりあえず公式サイトに書かれている設定内容だけを設定し、残りはデフォルトで設定を保存したところ、Android端末単体の通信とテザリングの両方が問題なくできるようになった。
後から当初参考にした二次ソースと公式サイトの内容を見比べてみると、二次ソースの設定項目が公式サイトより多く、余計な設定をしていたのが分かった。

公式サイトや公式リファレンスが役に立たない場合も多く、二次ソースの情報を見たほうが早いのは「IT業界あるある」ではあるが、今回のように二次ソースの情報が不正確な場合もあるので、公式情報も確認する習慣は身に着けていかなければならないとは感じた。

Windows Update適用後にMicrosoftアカウントのパスワードを聞かれて困った話

メインのデスクトップPCが不調のため、サブ機のノートPCからブログを投稿する紅蓮です。
皆様いかがお過ごしでしょうか。

さて、今回は例のサブ機(Windows10)を起動した際に、Microsoftアカウントのログイン画面が出た話です。

20H2の5月更新では起動時にMicrosoftアカウントを確認される場合がある

f:id:glenxar:20210530174128j:plain

Windows Update適用後の起動画面

Windows Update適用後に時たまWindowsセットアップの青画面が出ることがある。
大体はMicrosoft Edgeや変な機能の押し売りなので通常はスキップできるが、5月の更新ではプライバシー関連の変更が入っているらしく、Microsoftアカウントでのログインを求められた。

正攻法でパスワードを入力しようと思ったが、入力欄にカーソルを合わせても何も出てこない。
そう、何も出てこない。
Windows Update後に出てくるMicrosoftアカウントの認証ではパスワードマネージャー等は一切使えないのだ。

この画面は非常にタチが悪く、Microsoftアカウントの認証が済まない限り通常のWindowsの画面に進ませてくれないので、ブラウザ等に保存しているパスワードを確認することはできない。
Microsoftアカウントとして使っているメールアドレスにPINコードを送信し、画面からPINコードを打つことでパスワードをリセットできるが、スマートフォンや他のPC等で受信したメールを見られない場合詰むので色々と優しくない。

一定以上の知識を持ったユーザーであれば冷静に対処はできるとは思うが、あまり慣れていないユーザーだと「なんか普段出ないログイン画面が出て先に進めない!」といった感じで「パソコンが何もしてないのに壊れた!」と同じようなパニックに陥りかねない気はする。
本当にこの画面設計は良くない。というか最悪に近い。

パスワードマネージャーを「microsoft」で検索しても出てこない

とはいえ、パスワードマネージャーの確認すらできない状態で、Microsoftに誘導されるままパスワードのリセットをするのは非常に納得いかないので、メインのデスクトップPC(不調だが起動はする)を起動してChromeのパスワードマネージャから探すことにした。

まずは単純に「microsoft」と入れて検索してみる。

f:id:glenxar:20210530183858p:plain

Chromeのパスワードマネージャーを「microsoft」で検索した結果

結果は2件で、ユーザー名を見ると「.co.jp」の仕事用メールアドレスしか出てこない。
個人アカウントのログイン情報もパスワードマネージャーに入れてあるはずだが、出てこないのは何かがおかしい。

数分悩んでみたところ、そもそも検索条件が合っていない可能性が浮かんできた。
それならブラウザからMicrosoftの公式サイトにログインして、ログイン画面のドメインを確認すればいいといった結論に至った。

Microsoftアカウントのログイン画面のドメインはlogin.live.com

f:id:glenxar:20210530185311p:plain

Microsoftアカウントのログイン画面

実際にログイン画面を開いて確認してみたところ、ログイン画面のドメインは「microsoft.com」ではなく「login.live.com」だった。
案の定、パスワードマネージャーでの検索条件が間違っていたことになる。

ちなみに、なぜ「live.com」なんてドメインを経由しているかというと、Microsoftが元々やっていたWebサービスに「Widows Live」というものがあり、Microsoftアカウントの前身となったのがWindows Liveにログインするための「Windows Live ID」であるため。
そのころから運用されているドメインに今もログイン画面がある、といった形になる。

なお、Windows LiveについてはMicrosoftが2012年に段階的な廃止を発表し、現在は多くのサービスが終息している。
恐らくイマドキのスマホネイティブ世代はWindows Liveなんて絶対に知らないだろうし、インターネット老人会にネタとして持ち込んでも怒られない気はする。

f:id:glenxar:20210530191528p:plain

Chromeのパスワードマネージャーを「live.com」で検索した結果

検索条件が分かったので、さっそく「live.com」でChromeのパスワードマネージャーを検索してみた。
下から2番目にGmailのアドレスで登録したアカウント情報が出てきたので、ビンゴである。

パスワードを確認する際には、該当のアカウントの右側にある目のマークをクリックすれば良い。
この時にローカルアカウントだとWindowsログイン時のPINを聞かれるので、適宜入力してやるとパスワードが画面に表示される。

Microsoftアカウントの認証はできたが…

Microsoftアカウントのパスワードを覚えていないほうが悪いと言われればそれまでだが、サブ機のパソコンが使えるようになるまでここまで苦労するとは思っていなかった。

OSのアップグレード時の初期ログイン、Windows10のメジャーアップデート後ならともかくとして、通常のWindows Update適用時にWindowsへのログインを邪魔されるのはかなりストレスなので、この辺は改善を願いたいものだ。

緊急事態宣言下で営業しているジムと休館しているジムがある経緯をまとめてみた

今日は天気の良い休日ということで、買い出しと洗濯大会に勤しむ紅蓮です。
皆様いかがお過ごしでしょうか。

今回は筋トレというかスポーツジムの話です。
やたらとタイトルが長くなってしまいましたが、略しようがなかったのでこうなりました。

足並みの揃わないフィットネス業界

紅蓮の通っているジム(都内店舗)は、4月末からの緊急宣言で1ヶ月以上休業が続いており、物理的にジムに行けない状態が続いている。

しかし、すべてのスポーツジム・スポーツクラブが休業しているわけではないようで、Twitterを見ていると、普通にジム通いしている人も散見される。
単純に居住地が都内以外(マンボウが出ているだけの地域は時短はあるものの原則として営業している)なのかと思いきや、都内住みでもジムに行っている人がいるのだ。

休業しているか否かはジムの系列や店舗規模によって異なる

記事執筆時点の都内における状況をまとめてみた。
思い込みによる間違いや例外等がある可能性もあるので、最新の状況は各社の公式サイトを必ず確認してほしい。

全館休業している系列

業態により営業・休業が異なる系列

原則として営業している系列

  • ゴールドジム
    5/11(火)まで一部大型店のみ休業、大多数の店舗は通常営業
    休業店舗所属会員は定期休館日と同様に他店利用を許可する措置
    5/12(水)から全店営業再開(一部大型店の施設利用制限あり)
  • エニタイムフィットネス
    通常営業

上記説明に出てきた「セルフジム」は、ジムにトレーナーが常時駐在しないタイプの業態のことを指す。
エニタイムフィットネスと同じ業態と思ってもらえれば良い。

サブタイトルにも書いているが、こう並べてみるとフィットネス業界の休業要請に対する足並みは揃っていないことが分かるだろう。

休業要請を無視している系列の主張

大人しく休業要請に従っている系列については後回しにして、まずは休業要請に反発、というか無視している系列の主張について見てみよう。

エニタイムフィットネスは休業要請を何故無視するのか

今回の4月下旬~5月末の緊急事態宣言と、それに伴う休業要請は「ゴールデンウィーク中の大型商業施設の休業」を趣旨としている。 www.anytimefitness.co.jp

エニタイム公式サイトに掲出されている案内文には、次のような文言がある。

今回の内容についても、エニタイムフィットネスの各店は特措法に基づく休業要請対象には該当しないため、これまでと変わらず、対象都道府県を含め通常通り営業いたします。

要するに、エニタイムの店舗は小型店のため「大型商業施設」にはあたらないということ。
人数が集まったとしてもそこまでの大人数にならないので、営業を制限されるいわれはないわけだ。

ゴールドジムはなぜ休業要請を無視するのか

続いて、ゴールドジムが休業要請を無視する理由を見ていこう。

前述しているが、ゴールドジムはGW期間前後に大型店のみ休館し、その間は休館日の他店利用の制度に従って休館店舗所属の他店利用を認める措置を取った。
そして、緊急事態宣言の延長に入ったタイミングで大型店含め全店の営業を再開した。

トレーニーからしてみれば至れり尽くせりで、大型店休館の形で休業要請の趣旨は尊重しつつも、最大限休業要請には反抗(無視)する形で会員の便宜を図っているように見える。 www.goldsgym.jp

上記ページ掲載のPDFから内容を引用するが、ゴールドジムの主張は下記のようになっている。

 弊社といたしましては、政府と各自治体からの緊急事態宣言延長の発表を受け、フィットネスによるお客様の健康維持、免疫力向上を促進させていただきたいという社会的意義を考慮した結果、5 月12 日(水)7:00 より、臨時休館中の店舗におきまして、営業面積を制限したうえで営業再開をさせていただくことになりました。これは臨時休館による近隣店舗の密を防ぐという意味もございます。愛知県、福岡県の店舗につきましても営業継続させていただきます。
 1 年以上続いているコロナ禍において、運動による筋力低下の防止、脂肪燃焼によるメタボ対策、 心肺機能の向上、骨粗鬆症の防止、メンタル面の安定など「フィットネス」は性別を問わずあらゆる世代にとって必要不可欠なものといえます。
 弊社は「フィットネス」=自分にとってちょうどいい健康的な生活習慣と定義しています。子供から高齢者の方まで無理をせず、自分にあった健康的な習慣を身につけていただき、元気・健康という、本当に大切なものを手に入れていただきたいと強く願っております。

紅蓮としては、ゴールドジムの主張には全面的に賛同したい。
要するに、休業要請に従って休業するよりも大事なものがあるということである。

この辺はゴールドジムらしいというか、健康とカラダ作りに真摯に向き合う社風が強く出ている部分と言えるだろう。

現実に起こっている問題として、紅蓮の周囲でも、コロナ太りの話はそこそこ耳にするようになった。
ゴールドジムの主張でも「メタボ対策」が明言されているが、スポーツ施設が開いていることの社会的な意義というのはやはり大きい。

業界ガイドラインには強制力がない

そもそも論の部分になるが、ここまで各社の営業状況に違いが出るのは、フィットネスの業界団体が出しているガイドラインに強制力がなく、従うかどうかは任意となっているためだ。

www.fia.or.jp

上記は今年1月の緊急事態宣言の際に出たガイドラインである。
ジムの営業に関しては、PDF一覧の一番上にある「令和3年1月緊急事態宣言等に伴うクラブの運営について」のPDFを確認してほしい。

そして、4月の緊急事態宣言に関してはガイドライン改定等は一切されていないので、フィットネス各社ともに1月の緊急事態宣言の際のガイドラインを準用する形をとっている。
緊急事態宣言が再び発出されているのにも関わらず、公式サイトにはそれに対応する声明やガイドライン改定の話も出てないないあたり、業界団体としてはあまり真面目にかじ取りをする気はないように感じる。
政府や自治体に振り回されるのはもう疲れた、って感じもしなくはないが。

 緊急事態宣言が発出され各自治体の取り組みが発表されました。
 昨年のような営業休止要請はなかったものの、自治体により首長による営業時間
短縮要請の対象になっています。この要請は今回、協力の呼びかけ・働きかけ、という表現になっています。

(中略)

 一都三県の全生活者に対して20時以降の外出自粛が呼びかけられている点、フィットネスのみならず、人が集まるとされる広範囲な施設・店舗・催事に対する依頼である点、などを考慮し、会員や広く世論の理解を得られるよう、以下をご参考に各社にてご判断頂けますようお願い申し上げます。


①営業時間短縮
 強制力を伴わない「事業者への働きかけ」であることに鑑み、20時までを基本としつつ地元自治体の方針に基づいた各社ご判断による時間設定も検討可能であると考えます。

PDFから要点を引用すると上記のようになる。
行政側からの休業要請はあくまで「呼びかけ・働きかけ」であり、強制力が伴わないことは協会側も正しく認識している。

そして、それを踏まえて時短要請(今回の場合は休業要請)に従うかは各社判断とする旨を繰り返し明言しており、協会側が実質的に各社の逃げ道を作った形になる。
悪く言えば協会の責任逃れではあるものの、これによりフィットネス各社が営業継続・休館の判断を柔軟に行うことにお墨付きを与えた形になる。

休業するのも正しい判断

紅蓮のスタンスとしては、休業要請に強制力はないため、ゴールドジムのようにきちんとコロナ対策したうえで通常営業するのがあるべき形とは考えている。

しかし、ティップネスコナミスポーツセントラルスポーツのように、休業・休館するのもまた正しい判断であり、その裏付けとして業界団体の「休業要請に従うかは各社判断とする」といったガイドラインが存在する。
ジムの会員がどう思うかは別として、間違ったことは一切していないのだ。

「会員」と「世論」のどちらを取るか

協会のガイドラインを再度引用するが、注目すべきはこの文である。

会員や広く世論の理解を得られるよう、以下をご参考に各社にてご判断頂けますようお願い申し上げます。

「会員や広く世論の理解を得られるよう」とあるが、これを「会員」と「世論」に分解すると話が理解しやすくなるだろう。

 休業・休館した系列は、「世論」を優先した結果、休館・休業を決めた。
そのため、「会員」に関しては完全に置き去りになっている。

営業を継続した系列は、「会員」を優先した結果、営業継続を決めた。
あくまで会員の便益が第一で、「世論」に関しては二の次。

繰り返しになるが、どちらも間違っておらず、どちらも正解である。

通っているジムが休館している場合はどうするか

蛇足とはなるが、やはり「ジムが休館していて筋トレができない」という問題が目の前に存在するので、今年1月の緊急事態宣言のころから対策に関しては色々思い悩んできた。

  1. ホームトレーニングの環境を構築する
  2. 都外に引っ越す
  3. ゴールドジムに移籍する
  4. エニタイムに移籍する
  5. 我慢する

案として出たのはこのくらい。

1は都内の単身者向け物件だとスペースの都合上かなり厳しいので、より現実な選択肢は2と3になる。
4はエニタイムがシャワーしかない(お風呂がない)ので、好みの問題となるが優先順位はかなり低め。
5は言わずもがな。

紅蓮の行動圏内(定期券範囲内)にゴールドジムは存在しないので、3を選んだ場合も恐らく引越が伴うと思う。

ジムのために引越するのもどうかと思わなくはないし、実際に不動産屋の営業からは引越の理由がそれだけならやめとけと言われることも割とよくある。
ただ、前回も今回も緊急事態宣言をズルズルと延長されて不便な状況を強いられているので、解消を目指したアクションは適宜とっていきたい。

C#の.ToString()でハマった話

最近はお仕事でSQL Serverを弄りつつDelphiやったりC#やったりキーエンス独自言語やったりと色んな案件の仕事を振られている紅蓮です。
皆様いかがお過ごしでしょうか。

今回はC#のお話です。
C#初心者なので、.ToString()の説明もふわっと書いています。

C#の.ToString()は便利なメソッド

C#のだいたいの型には.ToString()メソッドが組み込まれており、これを呼んでしまえばオブジェクト型だろうがstring型に変換できるという優れもの。*1
型にもよるが、.ToString()が事実上の値取り出しのメソッドになっている場合もあり、stringに変換したあとの処理は実装次第で何とでもできるので何かと便利である。

引数指定でフォーマットを指定して変換できる

この.ToString()には引数を指定でき、引数でフォーマットの文字列を指定すれば変換の際に指定フォーマットで整形してくれる。
わざわざString.Format()を呼ばなくて済むので、ホントに至れり尽くせりのメソッドである。

書式を指定して数値を文字列に変換する - .NET Tips (VB.NET,C#...)

フォーマット指定に関してはVBC#開発者にはおなじみのdobon.netさんが参考になる
基本的に書式指定の方法はString.Format()と同じと考えて大丈夫だろう。

C#の.ToString()には、引数を受け付けてくれない型も存在する

今回の本題はここから。

プロジェクトで使用している.Net Frameworkのバージョンにもよると思われるが、.ToString()メソッドを使用する際に引数でフォーマットを指定するとコンパイルエラーが出る型が存在する。
このような型では、引数なしで呼び出す分には問題はないものの、フォーマットの文字列を指定して呼び出すと下記のようなエラーが出る。

引数を 1 個指定できる、メソッド 'ToString' のオーバーロードはありません

紅蓮はここでハマって2時間費やした。

問題が起きたのはDataTable型

お仕事の話に戻るが、先週C#の改修案件で回ってきたのがこんなものだった。

  • SQL Serverのストアドで取得したデータを帳票に出力するプログラムの改修(というかバグフィックス
  • ストアド側の設計がよろしくなく、小数点以下の数値が出る項目の小数点以下の桁数が統一されていない
  • ストアド側のSQLが複雑なので、ストアド側のアレな設計はとりあえず放置し、C#のクライアント側で表示桁数を調整する(先輩社員からそうするよう指示あり)

ストアド設計が悪いのが諸悪の根源であるのは言うまでもないが、C#のクライアント側もテストをちゃんとせずにリリースしちゃった感はある。
当時の担当者(退職済)はホントに何をしていたのやら。

実処理としてはDBから取得したデータをDataTable型に格納し、帳票出力用のフレームワークに文字列でセットする方式になっている。

DataTable型(正確に言うと、子オブジェクトのRows)には.ToString()が組み込まれており、元々の設計でも文字列への変換はこのメソッドでやっていた。
なぜか元々の処理は引数なしで.ToString()を呼び出していたので、前述のdobon.netさんなどの記事を参考に引数なしを入れてみることにしたが、入れたところコンパイルエラーが発生するようになった。

NGなコードサンプル

実コードをコピーしてここに貼るとコンプライアンス的によろしくないので、コンソールに出力するサンプルの処理を書いてみた。
DataTable.Rowsで引数を指定して.ToString()しようとすると、コンパイラに怒られる。

private void decimalFormatSample(DataTable sampleData) {

    for (int i = 0; i < sampleData.Rows.Count; i++) {
        
        //dataTableの.ToString()メソッドに引数を指定するとコンパイルエラー
        //引数を1個指定できる、メソッド'ToString'のオーバーロードはありません。
        Console.WriteLine(sampleData.Rows[i]["データ1"].ToString("0.00"));
        
    }
    
}

ちなみに、現環境の.Net Frameworkのバージョンは2.0。
互換性云々や大人の事情でこうなっているらしいが、化石のようなバージョンで動かしてるからこの手のエラーが出るのかもしれない。

.Net 4.x系じゃないと引数つきの.ToString()が動かない型もあるらしい

以下の記事はDataTable型ではないが、上記と同様のコンパイルエラー発生時の質問投稿に「.ToString()の引数指定に対応したのは.Net Framework 4.0から」といった回答がついている。

TimeSpanでのフォーマット指定方法: DOBON.NETプログラミング掲示板過去ログ

要するに、.ToString()の引数指定は昔からすべての型が対応していたわけではなく、.Net Frameworkのバージョンが新しくなるごとに拡張されていったということになるようだ。

.Netのバージョンを弄らずに対処する方法を考えてみた

どのみち、コンパイラのバージョンを勝手に弄るのは色々と問題があるので、それ以外の対処法を考えることになった。

冒頭でも言ったが、引数なしの.ToString()で文字列に変換してしまえば、あとは文字列をいじくり回すだけでなんとかなる。
その発想で処理を考えたところ、こうなった。

  • 一旦DataTableの中身を引数なしの.ToString()でstringに変換する(ここは改修前の処理と同じで、後続処理をしないと桁数が合わない状態)
  • stringからdecimalに変換して数値化する
  • decimalに対して.ToString()を引数付きで呼び出し、目的の桁数にフォーマットする

無駄が多いというか、エレガントさの欠片もない処理になってしまった。
decimal型は.Net 2.0でも引数ありの.ToString()を受け付けてくれるので、想定通りに変換が可能。

private void decimalFormatSample(DataTable sampleData) {

    for (int i = 0; i < sampleData.Rows.Count; i++) {
        
        //dataTableの.ToString()メソッドに引数を指定するとコンパイルエラー
        //引数を1個指定できる、メソッド'ToString'のオーバーロードはありません。
        //Console.WriteLine(sampleData.Rows[i]["データ1"].ToString("0.00"));
        
        //一旦decimal型に変換する
        decimal buf;
        buf = decimal.Parse(sampleData.Rows[i]["データ1"].ToString()); //引数指定なしの.ToString()はOK
        
        //decimal型から.ToString()する
        Console.WriteLine(buf.ToString("0.00"));
        
    }
    
}

今回のサンプルではFor文の中に変換処理を直接書いているが、実際に仕事で改修したプログラムでは、

  • For文の中で複数カラムの値を一気に取得する
  • ストアドを3つ回し、それぞれFor文でループ処理してデータを取り出す(取り出したデータはフレームワーク側で統合)

…といった元々の設計があったため、追加した変換処理の部分はフォーマット用の汎用関数として外部関数化する形をとった。

今回分かったこと・今後検証したいこと

分かったこと

  • .ToString()メソッドの引数指定ができない型がある
  • .Net Frameworkのバージョンが新しくなると、引数指定NGの型でも引数が指定できるようになる場合がある

検証したい事

  • .Net 4.xでDataTable型の.ToSring()の引数指定はできるのか
  • もうちょっとエレガントなフォーマット調整の方法はないか(C#の知識不足はあると思うので勉強したい)

今回色々調べてみて、C#もバージョンアップで機能追加されてるんだな、となんとなく分かったものの、お仕事の現場では常に最新バージョンを触れるとは限らないので、そのギャップとどう向き合っていくかは考えないとならない気はしている。

*1:中身がnullだと変換できないので、nullが想定される箇所ではきちんとnullのチェックをするお約束はある。

Azure SQL Database 月額料金表を実際に作ってみた

前回、Azure SQL Databaseの料金表の出し方と、それをもとに月額料金を計算した話を書いた。

glen.hatenablog.jp

記事の結びに「Excelとかで月額料金の表を作っとけば客先でも困らないね」と書いたが、善は急げで早速Excelにまとめてみた。
こういうの、忘れないうちにやっておかないと二度と着手しないヤツだと思うし。

 Azure SQL Database DTUモデル月額料金表

記事執筆時点のMicrosoft公式サイトの情報をもとに作成。
計算方法は前回記事を参照。

価格 - Azure SQL Database Single Database | Microsoft Azure

プラン DTU ストレージ DTU料金
カテゴリ 名称 付属容量 最大容量 毎時 月額平均
Basic B 5 2GB 2GB ¥0.7514 ¥549
Standard S0 10 250GB 250GB ¥2.2582 ¥1,648
Standard S1 20 250GB 250GB ¥4.5160 ¥3,297
Standard S2 50 250GB 250GB ¥11.2934 ¥8,244
Standard S3 100 250GB 1TB ¥22.5806 ¥16,484
Standard S4 200 250GB 1TB ¥45.1640 ¥32,970
Standard S6 400 250GB 1TB ¥90.3281 ¥65,940
Standard S7 800 250GB 1TB ¥180.6560 ¥131,879
Standard S9 1,600 250GB 1TB ¥361.3120 ¥263,758
Standard S12 3,000 250GB 1TB ¥677.4600 ¥494,546
Premium P1 125 500GB 1TB ¥70.0001 ¥51,100
Premium P2 250 500GB 1TB ¥140.0000 ¥102,200
Premium P4 500 500GB 1TB ¥280.0000 ¥204,400
Premium P6 1,000 500GB 1TB ¥560.0000 ¥408,800
Premium P11 1,750 4TB 4TB ¥1,053.7800 ¥769,259
Premium P15 4,000 4TB 4TB ¥2,408.5974 ¥1,758,276

※月額平均はうるう年を考慮せずに365日/年で計算し、小数点以下を四捨五入

上記表はいったんExcelにまとめた内容の転記となる。
お客様に見せることも考えて、Basic・Standard・Premiumのプランを1つの表にまとめてみるとこのようになった。

DTUの単価を見てもピンとこない人も多いだろうが、月額料金を並べるとAzureの料金はスペック次第でピンキリなのが分かるだろう。

なお、前回記事同様の注意点となるが、あくまでこの料金表は記事執筆時点の内容となる。
最新の料金はMicrosoft公式サイトで必ず確認してほしい。

 ベテランは月額料金も把握してたりする

この月額料金であるが、今いる会社ではベテラン社員中心に料金体系を暗記していて、客先や運用現場で何も見ずに、概算金額をパッと言える人もいたりする。
やはり、料金について何度も質問されたり、自分から話したりしたからだろうか。

実際に客先でPMが費用感を聞かれて即答したり、社内でも先輩社員から「テストDB(Standard S0プラン)は削除せずに放置してもだいたい月1,600円だからテストのたびにデプロイしなおすのは時間がもったいない」といった話が飛んで来たりと、すでに知識として定着している感はある。

ちなみに、今いる会社の費用感ではS0プランのテストDBは前述のように放置しても問題ないらしいが、S3プラン(S0プランの約10倍の価格)のテストDBを消さずに1週間近く放置したら別部署のPMから大目玉を食らったので、月額料金の目安はあったとしてもAzureは原則として時間課金と意識する必要はありそうだ。

Azure SQL Databaseの料金表の出し方と、月額いくらになるか計算した話

服薬でマシになってきたものの、相変わらず親知らずが痛い紅蓮です。
皆様いかがお過ごしでしょうか。

さて、今日はお仕事の話。
Azureの料金に関する話でございます。

Azureの料金、もしかして分かりにくい?

今いる会社でお客様に卸しているシステムの大半はMicrosoft Azure上にDBを構築しており、毎月のランニングコストとして、Azure利用料金はお客様に実費をご負担いただく形をとっている。

一応、事前に営業担当が費用に関してお客様に説明はするものの、後になって先方のシステム担当者から「月額いくらだっけ?」の話が出ることは割とあったりする。
そのやり取りの中で「MS公式サイトの料金表のページにたどり着けない」「結局、料金はいくらになるのか」といった質問も時々出てくるが、今回客先打ち合わせの際に、その場で料金表を開いて自力で試算を出すことになったので、やり方に関して備忘録を残しておきたい。

Microsoft公式の料金表の出し方

メール等での文字ベースのやり取りであれば、URLを載せる形で「ここを見てください」と言うこともできるし、それがベストプラクティスかもしれない。

しかし、お客様との打ち合わせの際に、プロジェクター投影をしているタイミングで「今、料金表を画面に出せませんか」と突然言われる可能性もゼロではないし、ブックマーク等がない環境でもMicrosoftの公式料金表の掲載ページへ行けるように手順を覚えておきたい。

Google検索結果からの料金表ページへの行き方

f:id:glenxar:20210516211601p:plain

Googleで「Azure 料金」と検索した結果

Google検索で「Azure 料金」と検索すると、検索結果上位にMicrosoftの公式ページが複数出てくると思う。
ここから料金表への動線がハッキリしていないのはMicrosoftのWebサイトの作り方がイマイチと言わざるを得ないが、文句を言っても仕方ないので、自力で料金表のページに進むことだけを考えたい。

  • 料金計算ツール
    Azureの各機能の料金を試算できる画面になっているが、デフォルトの設定から変更する必要があるパラメータが多く、まともに使える画面ではない。
    少なくともお客様にここを見るよう説明したら、確実に顰蹙を買うだろう。
  • 価格の概要
    Azureの各機能の価格表のページ(ここが正解)
  • 料金 - Windows Virtual Machine
    Azure VM(Virtual Machine)の料金ページ。Azure SQL DBの料金ではない。

今回は2番目の「価格の概要」を選ぶのが正解となる。
Googleの検索順序のロジックやMicrosoftSEO対策で順序は変わる可能性があるので、ページタイトルで覚えておいたほうが良いかもしれない。

Azureの価格一覧→Azure SQL Databaseの価格の行き方

f:id:glenxar:20210516213418p:plain

MSのAzure料金表ページ

Google検索から適切なリンクをたどると、Microsoft公式サイトのAzure料金のページに行くことができる。

この料金のページはあくまで各機能の料金のインデックスページといった位置付けで、目的のAzure機能の料金ページをこのページの中から探す必要がある。
そして、各機能のページへのリンクがある位置は、ページをスクロールした下部。フルFDの解像度でもリンクは隠れてしまっているので、必ずスクロールして探す必要がある。

f:id:glenxar:20210516214325p:plain

Azureの機能カテゴリ

ページ下部にスクロールすると、製品別の価格、要するにAzure各機能の価格のリンクが一覧になっている。
一覧画面は機能別にカテゴライズされているので、まずは画面左側のカテゴリから「データベース」を選択する。

なお、今回はたまたま「おすすめ」にAzure SQL Databaseが表示されているが、使用状況によってはAzure SQL Databaseが「おすすめ」の一覧に出ない場合があるため、カテゴリから表示する方法を覚えておくと吉。

f:id:glenxar:20210516215337p:plain

データベース系機能の一覧

データベースのカテゴリの一覧では、Azure SQL Databaseを選択する。
「DB」や「SQL」等の似通った名前の項目があるが、これらはすべて別物。

Azure SQL Database料金のページの操作方法

f:id:glenxar:20210516223900p:plain

Azure SQL Databaseの料金のページ

 上記のようにリンクをたどっていくと、Azure SQL Databaseの料金が掲載されたページにたどり着ける。
このページが今回の目的地となるが、価格一覧のページと同様にスクロールしないと料金表が出てこないうえに、パラメータを弄らないと適切な料金表が出てこないので、やはり一筋縄ではいかない。

f:id:glenxar:20210516225022p:plain

価格オプションの設定

最初の表示画面から少し下にスクロールすると、「価格オプションの詳細」でパラメータを変更する欄が出てくる。
設定は下記の通り。

  • 「Single Database」と「エラスティックプール」のタブがあるが、デフォルトのSingle Databaseを選択したままにする。
  • パラメータの一番左上にある「購入モデル」のパラメータを「vCore」→「DTU」に変更する。
  • それ以外のパラメータは変更せず、初期値のままにする。

パラメータを弄るのは購入モデルの1ヶ所で、それ以外はデフォルト値でOK。

ちなみに、購入モデルに関してざっくり解説すると、vCoreはサーバーのCPUコア数・メモリ容量などを手動で設定する方式で、DTUはMicrosoft側が準備したCPUコア数・メモリ容量などの組み合わせのプリセットを選択する方式となっている。

性能面は設定次第となるが、価格面ではDTUモデルが総じてvCoreモデルよりもコストパフォーマンスが上回るようになっている。
要するに、vCoreモデルは高価ということ。

例外的に一部条件下ではvCoreモデルのほうが安価で運用できることもあるが、通常用途ではDTUモデルでの料金設定としたほうが有利な場合が多い。

f:id:glenxar:20210516230056p:plain

DTUモデルの料金表

ここまでの操作をすると、DTUモデルの公式な価格表を見ることができる。
スクリーンショットの画像は記事執筆時点での内容なので、必ず最新の内容は確認してほしい。

この表に載っているDTUの料金はDB稼働1時間ごとの基本料金で、DTUに付属しているストレージ容量を超えて使用する場合、ストレージを増やした分の料金が課金される。

月額料金の出し方

Microsoft公式の料金表は、DTUの1時間あたりの料金しか書かれてない。
この表を見て、お客様から「結局毎月いくらになるの?」といった質問が出てくるパターンもあるだろう。

月額料金の計算式

表に載っているのは1時間あたりの料金なので、それに24をかけて1日あたりの料金を出し、その月の日数をかければ月額料金を算出できる。
月額の平均を出したい場合は、年額を出してから12で割ればよい。

  • 月額料金(単月)
    DTU料金×24時間×該当月の日数
  • 月額料金(平均)
    DTU料金×24時間×該当年の日数÷12ヶ月

例えば、Standard S3プランでDBを稼働させた場合、記事執筆時点でDTU料金は22.5806円となっている。

上記計算式で計算すると、月額料金は以下のようになる。

  • 2021年5月料金
    22.5806×24×31=16,799.9664円
  • 2021年月額平均
    22.5806×24×365÷12=16,483.838円

手間にはなると思うが、事前にExcel等でDTUの料金をまとめておき、上記計算を済ませた料金表を作っておけば、お客様との打ち合わせがスムーズになるかもしれない。

液晶ディスプレイ買いました

f:id:glenxar:20210513222335j:plain

おニューの液晶ディスプレイ

智歯周囲炎(親知らず周辺の歯茎の腫れ)の影響で寝不足気味の紅蓮です。
皆様いかがお過ごしでしょうか。

今回は題目の通り、液晶ディスプレイを買った話でございます。

楽天で特価品を見つけました

今回買ったのは、I-O DATAのKH240V。

同じようなサムネでDIOS-LDH241DB、EX-LDH241DBといった別品番もあるが、これは販路によって型番が違うというもの。
ラインナップとしては下記のようになるらしい。

  • KH240V:特定販路専用品(恐らくビックカメラグループ専売)
  • EX-LDH241DB:Amazon専売モデル
  • DIOS-LDH241DB:EC専用モデル(上記以外の販路)

販路によって値段にだいぶバラツキがあり、市価はおおよそ16,000~18,000円台となっている。

f:id:glenxar:20210513223708j:plain

コジマで特価になっていた

探してみると15,000円を切っている店があった。なんと、コジマである。
親会社のビックカメラ本体(楽天市場店)が16,200円の市価通りの販売なので、価格面はかなり頑張っていると思う。

ちなみに、今月末が期限の楽天の期間限定ポイントが1,500円前後あったので、ポイント消化でキリの良い13,000円ポッキリで購入することにした。
期間限定ポイントの分もあるとはいえ、13,000円だと海外メーカーの機種しか買えないので、良い買い物をしたとは思う。

早速入れ替えてみた

f:id:glenxar:20210513224527j:plain

旧ディスプレイ(LG 21.5インチIPSパネル

元々、自宅PCでは21.5インチの液晶を使っていた。
このサイズでも家でやるレベルの作業の作業に支障は出ないが、会社のPCの24インチの液晶に慣れてしまい、21.5インチでは満足できないカラダになってしまったのです。

f:id:glenxar:20210513225005j:plain

新ディスプレイ(I-O DATA 23.8インチADSパネル)

楽天で特価になっていたのも購入理由の一つだが、商品写真を見て「台座が低そう」なのが一番の購入の決め手となった。

ディスプレイ上端部の位置も21.5インチのときとそこまで変わらないので、画面が大きくなってもそこまで違和感は出ていない。

付属品は充実

取説と付属品

f:id:glenxar:20210513225614j:plain

取扱説明書

海外メーカーの機種だと付属はVGAケーブルのみの場合もけっこうあるが、I-O DATAのディスプレイはHDMIケーブル・VGAケーブル・オーディオケーブル(3.5mmジャック用)と至れり尽くせりである。
基本的にHDMIVGAのどちらもついていないPCはほとんどないと思うので、わざわざケーブルを買わなくてもいいのはありがたいところ。

HDMIの音声出力を試してみたが…

ディスプレイにはスピーカーがついているものの、音質はお察しください。
この手の内蔵スピーカーで音が良かった試しがないので最初から期待はしてなかったけど、こだわるならちゃんとしたスピーカーは準備したほうがよさそう。

設定関連は若干ポンコツ

メニュー階層は以下のようになっている。

  • 入力切替
  • 音量
  • 輝度
  • メニュー

入力切替/音量/輝度設定は説明するまでもないので割愛する。

f:id:glenxar:20210513230647j:plain

メニュー

メニューの中には、予めショートカットとしてコントラスト・色温度の設定が入っている。
基本的にこの2つの設定をすればいい感じに使えるようになるが、コントラストはデフォルトのままが一番見やすい。この辺の調整は流石といったところ。

色温度のプリセットが残念

f:id:glenxar:20210513231554j:plain

色温度の設定画面

 色温度は6500K/7200K/9300Kがプリセットされているが、プリセットの設定はどれもしっくりこない。

デフォルトの6500Kが「自然な白色が表現できます」となっているが、個人的に6500Kの設定は黄色っぽさが強くてダメだった。
9300Kは論外。

真ん中の7200Kがプリセットの中では一番マシだが、なんかコレジャナイ感じ。
結局ユーザー設定でRGBを調整することになったが、キャリブレーションに関してはプリセットが有効に使えないと思った方が良い。ちょっと上級者向け。

便利機能はメインメニューの中に

f:id:glenxar:20210513232857j:plain

メインメニュー

商品説明でウリになっているような機能は基本的にメインメニューの中に入っている。
画面の反応速度を上げる等、弄ると便利な項目が多いが、如何せんメニュー階層が深いのでたどり着くまでが結構めんどくさい。

初心者向けの設定機能としては画面モードのプリセット設定(色温度コントラスト等をまとめて行える)があるが、この設定項目はショートカットに入っておらず、メニューの奥の方まで行かないと弄れない。
ショートカットの3番が空いてるので、デフォルトでこの項目に飛べるようにしといたほうが良いんじゃないのかな~とは思った。

総評

設定がちょっとめんどくさい部分はあるが、一度設定してしてしまえばかなり快適に使える製品であるとは思う。
標準の反応速度でも、会社のAcer製ディスプレイにあるような残像感はほとんどないし、ディスプレイとしての基礎的な部分は良くできていると思う。

以前、BENQのディスプレイを使ってた時にパソコンから設定を弄れるソフトが付属していたが、他社でもそういう機能がついたりしないだろうか。