モトローラ moto g52j 5G購入

前回の記事で、スマホの機種変更について触れたのですが、 XiaomiからMotorolaのmoto g52j 5Gに変えました。

Xiaomiは性能は全く問題を感じなかったのですが、購入当初から、とにかく電池の減りが早いのが気になっていました。 全く使用していなくても最低2日に一回は満充電にしないと心許ない感じでした。結局1年も使用せずにMotorolaに変えてしまいました。

2週間程度使用しましたが、電池の減りが気になることは特に無く、安心して使えています。nano SIMとしてIIJ mioの4Gタイプを、 eSIMとしてpovo 2.0を使っています。povoは電話番号維持用なので、まだ課金して使っていないのですが、 SIMを切り替えると、初めて見る5Gのマークが出てきました(いずれ課金して速度を見てみたいと思います)。 もちろんおサイフケータイも問題なく使えています。

素のAndroidだと、設定で現在の通信速度を表示することができない(違っていたら教えてください)ようで、それがちょっとした不満です。

全体としては、とても満足しています。

AWSのMFAキーを紛失して17,000円払った話

先日スマホの機種変更をした際に、AWSで使用しているMFA(Multi-Factor Authentication)キーの移行に失敗して、 解除してもらうのに(2022/9/9解除完了)17,000円の費用がかかった話です。

これまで、AWSへのルートユーザのログインには、Microsoft Authenticatorを使用して、コードを入力していました。

先日スマートフォンを買い替えた際に、当然新しい機種にもこのアプリをインストールして、 まずoutlook.comのアカウントを移行しました。 AWSのアカウントも古いスマホには表示されているのですが、「バックアップ」機能なるものがあるそうなので、新しいアプリでもAWSアカウントを後から追加できるだろう、 と思い、(どこで読んだか失念)勧めに従って古いスマホからはアプリを削除しました。

….この時点で実はかなり詰んでます。

このアプリでは、どうやら(成功しなかったので実際に確認したわけではない)古いスマホでまずバックアップを作成し、 新しいスマホにアプリをインストールして起動した直後に「回復」をしないといけないようです。 一旦「回復」せずにMicrosoftのアカウントだけ移行してしまい、新しいスマホ側でバックアップがONになっていると、 おそらく古いスマホで設定した、それ以外のアカウント情報は無くなってしまうと思われます(このあたりは若干不確か。古いスマホでAWSのアカウントが正しくバックアップされていなかった可能性もある)。

いずれにせよ、Microsoft AuthenticatorではAWSのアカウントは復活できなさそうということに気づいたので、 何らかの回避策を利用してAWSにログインできるか試してみました。 AWSのコンソールからルートユーザを選択し、メールアドレス、パスワードを入力しました。次いで、本来であればMFAのコードでログインできるのですが、 もう情報がなくなっているので、それっぽい"Sign In Using Alternative Factors of Authentication"を選択します。 すると、登録されたメールアドレスにリンクが送られてくるので、そちらをクリックします。 次いで、登録された電話番号で電話を受けて、コードを入力してログインできます。

…というのが普通なのですが、表示された電話番号下4桁を見て気づきました… もうこの電話番号解約済みだし… MFAデバイスの紛失および故障時の対応 に記載されていますが、ルートユーザのMFAデバイスの回復には、 アカウントに登録されているEメールと主要連絡先の電話番号が使えることが必須です。 これが満たされない場合、サポート依頼をせず回復することは不可能です。

というわけで、“Contact Customer Service"からヘルプ依頼を出しました。

すると、平日にAWSから電話がかかってきました。最初は上記MFAデバイス紛失時の対応方法のように、電話をかけるので、コードを入力してと言われるのですが、 そもそもそれができなくなっているので、ヘルプをお願いした旨伝えました。

すると、回復方法をメールで案内する旨伝えられます。しばらくするとメールが送られてきました。MFAを解除するには、必要書類に記入して提出せよ、との内容です。

実は、この必要書類が本題です(前書きが長かった)。

日本の企業であれば、免許証のコピー提出程度で許してくれそうですが、さすがは訴訟大国アメリカ、そうは問屋がおろしません。

主な書類は、”MFA Identity Verification Form and Affidavit“という英文フォームです。これを印刷して、公証人(Notary Public)による認証を受けてサインしてもらったものを提出しないといけません。 これは宣誓認証にあたるようです。大雑把にいうと、自分が当該アカウントを所有しており、虚偽があって第三者がAWSを訴えるような場合、自分が全責任を負う、といった内容について宣誓を求められます。

自分で記入するだけでは飽き足らず、公証人による認証まで要求するところがアメリカンです。

本場アメリカでは、州によって費用は違うようですが、(Notary Public Fees, Notary Fees: What the Notary May Charge to Perform Services in California) 最近のドル円レートで計算しても、2,000円程度で済みそうです。

2,000円程度なら、まぁ仕方ないね、で済むと思いますが…

日本だと17,000円かかります

えっ… 私のAWSのMFAロック解除にかかる費用高すぎ!?

日本公証人連合会のホームページで案内されていますが、手数料は"宣誓認証” (11,000円)に該当し、かつ"外国文の認証" (6,000円)が適用され、合計17,000円となります。 予約は必要でしたが、手続自体は30分程度もあれば完了します。

ORMについて変節した

ORM (Object-relational mapping)については賛否両論あると思います。 私もこの件について思うところが最近あったので、ポエムを投下します。

「ORM SQL」といった感じで検索してみると

のような記事が見つかりました。不要とほぼ断言しているものから、積極的にORMを使う派の方まで。

私もこれまではどちらかといえば、「別にSQLで書けるのに、敢えてORMを使う必要性は無いのでは」と思っていました。 ただ、最近開発をしている際に、初めてORMを使いたくなる場面に遭遇しました。

これは、端的に言えば、上の3番目の回答に挙げられているORMの機能

  • 対応するオブジェクトを通じたレコードの更新、トランザクションの一定の隠蔽

に大きな有用性を感じたためです。

これまでの開発では、コードの開発前にRDBのスキーマがほとんど決まっていたので、 レコードの更新や取得を行うSQLは(手間でも)一回だけ書けば良い場面ばかりでした。

でも、今回経験した開発では、要件が完全に決まっていない段階で開発をスタートしたのもあり、 開発がある程度進んだ段階で要件が精緻化されたところ、(ER図でいうところの)エンティティのテーブルとの対応が大幅に変わる可能性が生じました。 具体的には、現実との整合性を保つために

  • あるエンティティは、これまでの単一のテーブルから、複数のテーブルの結合とした方が良い
  • これまで2つのテーブルにマップされていたエンティティは3つのテーブルの結合とした方が良い

といった状況です。

さて、これまで真心込めたSQLで結合してマッピングしていたエンティティですが、 いざRDBスキーマが変更になると、これらも書き直さなければいけません。当然、検索(SELECT)だけでなく、 更新(UPDATE)もです。多:多でエンティティの属性を取得するためにforループを回している記述も修正する必要があります。

困った… というわけでORMの出番です。実現方法は静的コード生成だったり、実行時のリフレクションだったりしますが、 基本的にORMではエンティティ間の1:多などの関係をメタデータとして記述することで、 関数一撃で関連するエンティティを取得できるようになるわけです。

もちろん、ORMでも、RDBスキーマが変わって際の変更がゼロとはいきませんが、複数のSQLやfor文を正しく書き直す労力を考えれば、 メタデータの更新と関数呼び出しの変更程度で対応できるのであれば、相当有用であると思いました。

まとめると、スキーマが完全に決まっており、将来的にも変更されることは(ほぼ)無い、というのであれば、 SQLのみで記述してもそれほど問題にはならないかも知れません。 一方で、要件に伴ってRDBスキーマが開発中にも変更される可能性があるなら、 ORMを使用するのは保険として大変役立つのではないか、と思いました。

ThinkCentre M75q Tiny Gen2 購入

昨年末(2021/12)になりますが、LenovoのM75q Tiny Gen2を購入しました。スペックはRyzen 5650GE, Windows 10 Home, 8GB DDR4, 256GB SSDといったところです。 税込みで59,950円。楽天Rebates経由で購入したので10% 5995のポイント還元があり、到着直後にメモリとSSDはそれぞれ32GB, 1TBに交換し、8GBのDDR4は約3,000円で売却したので、実質5万円くらいになりました。増設したDDR4 (CT2K16G4SFD832A)が14,560円、SSD (WD Black SN750 SE)が12,799円かかっているので、総額では8万円弱になっていますが。

サイズ感はほとんどMac mini (M1)のような感じです。Mac miniはUSB Type-Aが2個、Thunderboltが2個とHDMI, Ethernetしかありませんが、 M75Q-q TinyはUSB Type-Aが5個、Type-Cが1個、HDMI, DisplayPort, Ethernetがあるので、拡張性は高いです。メモリやSSDの増設が自分でできるのもポイント高いですね。

Mac miniは負荷をかけても全く音が気になりませんでしたが、こちらは多少音が気になりました。CPUの消費電力の差もあるのでしょうが、 定常状態でもファンの音が聞こえることからして、構造的な違いが大きそうです。ファンの排気口を自分の方に向けて配置しているのも気になる原因かもしれませんが。

リカバリのためのUSBメモリでブートしない問題と対処

SSDを交換してから、Lenovo純正のツールでUSBメモリを使用してリカバリを実施したのですが、これでちょっとハマりました。 最初はバッファロー K32GA-BK/Nにリカバリデータを書き込んだのですが、どうやってもこのメモリだと電源起動時に認識されず、 リカバリができませんでした。

設定の問題かと思っていろいろ試しましたが、全く動作しない。検索してみたら、同じような問題にぶつかった人がいたので、 結局KIOXIA 32GB USB3.2 Gen1を購入して、こちらで試したらあっさり成功しました。

まとめ

その後、昨年内にWindows 11のアップグレードもできました。安定して動作しています。 Mac miniはメモリを16GBにCTOしていますが、それでも色々な開発ツールを動作させるとメモリ圧縮が効き出して、 動作が若干緩慢に感じることがあります。M75q Tinyは32GBにしたので、私の使用する範囲内では全くメモリには不足なく、快適そのものです。

SQLの条件部でif-then-elseを行う

SQLでwhere検索を行うときに、条件によって、さらに検索条件を切り替えたいということが生じることがあります。

例えば、テーブルにカラムC1, C2, C3が存在するとして、気持ちとして以下のように書きたくなる場合です。

select something from tbl where if p(C1) then q(C2) else r(C3)

カラムC1に依存する述語p(C1)がTRUEの時はq(C2)で検索し、FALSEの場合はr(C3)で検索する、というものです。

SQL: If clause within WHERE clause に答えがでていますが、この場合は、

select something from tbl where (p(C1) and q(C2)) or (not p(C1) and r(C3))

が答えになります。if p(C1) then q(C2) else r(C3)がTRUEになる場合を考えると、p(C1)がTRUEであれば、q(C2)がTRUEである必要があり、 p(C1)がFALSEであればr(C3)がTRUEでないといけません。これを論理式で書いたのが上になります。

あるいは、if p(C1) then q(C2) else r(C3)はp(C1)→q(C2)かつ¬p(C1)→r(C3)と書き直すこともできるので、 A→B = ¬A ⋁ Bを使って、

(not p(C1) or q(C2)) and (p(C1) or r(C3))

と書いても同じ結果になります。

今回の例では説明を具体的するためにカラムC1, C2, C3と書きましたが、大切なのは述語p, q, rですので、 カラムとは無関係に条件を書くことができます。

2023/1/6追記: SQLのwhere句でifで条件文を複数切り替えは不可 case式で代替可能に説明されていますが、whereの中でcaseを使うこともできるので、

select something from tbl where case when p(C1) then q(C2) else r(C3) end

と書くこともできますね。

24インチWQHDモニタ購入

コロナ禍で在宅勤務の時間が長くなっています。以前から27インチ4Kモニタで作業していましたが、 もう少し画面の広さが欲しくなりました。

それで、24QP500-Bを購入しました(2560x1440 23.8インチ)。 27インチを、座った正面に配置しており、その横に、まずは垂直の向きで(90度回転)置いてみましたが、 どうにも垂直方向が思ったより大きすぎて常用には耐えないように感じたので、普通に横置きで使うことにしました。

モニタを置いた状態を上から見たイメージはこんな感じです。縮尺は厳密ではありません。 右のモニタは机の端からはみ出ています(両方ともモニタアーム使用。こういうの)。 こういう自由度の高い配置をするためにも、モニタアームは強く推奨したいですね。 下手にピボットとか高さ調整機能のある台座がついた、数千円高いモニタを買うよりも、 最初から差額でモニタアームを買った方が幸せになれます。 モニタの高さを狙い通りにできるのと、モニタ下の空間が使えるようになるのは大きいです。

モニタ配置

これでも右側のモニタの右端は若干使いにくいです。普段ほとんど参照しないウィンドウを置いてます。 27インチ2枚だったら、この置き方だとさらに右側が使いにくくなってしまったと思います。 この配置であれば、これくらいの画面サイズの組み合わせがベストかもしれません。

これまで4Kに慣れていたので(Windowsでは125%で使用していますが)、 23.8インチWQHDでも画素の粗さが気になってしまう(100%で使用しても)のが予想外でした。 解像度が高いのは正義だと感じます。

愚直なRTLでソートを記述する

FPGAの部屋の記事、 RGB 24ビット・データ入出力対応のメディアン・フィルタをVitis HLS 2021.1で作成する1RGB 24ビット・データ入出力対応のメディアン・フィルタをVitis HLS 2021.1で作成する2にて、HLS記述にてバブルソートを記述し、Interval=1を得ている(1クロック毎にデータを入力できるパイプラインで動作)のを見て、 実はHLSではなく、愚直にRTLで書いてもInterval=1は達成できるのではないかと思い、実験してみました。

ソートをハードウェアで実装するための手法はよく研究されており、ソーティングネットワークと呼ばれているようです。

Wikipediaによれば、3x3(=9)画素のソートを行うためには、7段のソーティングネットワークが最小の段数であるそうです。

“sorting network generator"などと検索すると、ソーティングネットワークの自動生成ツールなどもあり、興味がある方には面白いかもしれません。

書いてみたRTL記述はこちら:

module sort (
    input            CLK,
    input [15:0]     in[0:8],
    output reg[15:0] out
);

    logic[15:0] tmp;
    logic[15:0] in_val[0:8];
    logic[15:0] result;

    int i,j;

    always @(*) begin
        in_val = in;
        for (i = 1; i < 9; i = i + 1) begin
            for (j = 0; j < 9 - i; j = j + 1) begin
                if (in_val[j] < in_val[j+1]) begin
                    tmp         = in_val[j];
                    in_val[j]   = in_val[j+1];
                    in_val[j+1] = tmp;
                end
            end
        end
        result = in_val[4];
    end

    always_ff @(posedge CLK) begin
        out <= result;
    end

endmodule

9個の数値(各16bit)からなる配列inを、上記記事ではC言語で書かれているのと同じ方法でソートしています。 このようなコードは、ある程度RTL記述に慣れた人の方が違和感を感じるかと思います。 ノンブロッキング代入(<=)ではなくブロッキング代入(=)を使っています。

Logicool K835 OWR購入

最近技術的記事がほとんど無くて商品レビューばかりになっていますが、 Logicool K835 OWRを購入しました。 赤軸リニアというものです。

以前職場で1万円位のサンワサプライの赤軸キーボードを使用していて、これがなかなか良かったので、 今回も赤軸を購入しました。

以前Realforceを購入しましたが、最近のRealforceは安いものでも2万円くらいになってしまいました。PFU Limited Editionに至っては3万円を超えてしまいます。毎日仕事でキーボード入力を行うとはいえ、さすがにこのレベルになると躊躇してしまいます。 一方で、今回のK835は7000円以下で購入できます。

感想としては、思ったより打鍵音が大きいです。前述のサンワサプライ赤軸より大きいと思われます (会社で使用していたため、正確なところは不明)。 もっとも、家で一人作業する分には全く問題はありません。

加えて、キーストロークが結構深いです。これは実際に使用してみて、かなり使いやすいと感じます。 ミスタッチが気持ち減ったかも知れません。キーの重さも比較的軽くて高速に入力できます。

全般的には満足できる買い物でした。

Excite MEC光 開通

先日申し込んでいた エキサイトMEC光 が本日開通しました。

早速、これまで使用していた回線との速度比較をしてみます。2/17(木) 19時台にfastで計測しました。

  • Excite MEC光 (VDSL):
  • iPadで計測:ダウンロード25Mbps, アップロード6.7Mbps, レイテンシ(アンロード済み)16ms, レイテンシ(ロード済み)17ms.
  • デスクトップパソコンのTP-Link AC600 Archer T2Uで計測:ダウンロード24Mbps, アップロード6.6Mbps, レイテンシ(アンロード済み)15ms, レイテンシ(ロード済み)41ms
  • ギガトラWiFi (Softbank回線): ダウンロード16Mbps, アップロード8.3Mbps. レイテンシ(アンロード済み)43ms, レイテンシ(ロード済み)908ms.

現在ルータはパソコンとは別の部屋に置いてあります。USB WiFiが小型であるせいか、間をふすまで仕切るだけで感度と速度が低下してしまいました。上記速度は、ルータとパソコンをほぼ見通せる状態にして計測したものです。iPadはふすまがあっても速度低下は無さそうでした。

LTE回線に対して、ダウンロードは改善し、アップロードは少し改悪。レイテンシは大幅改善でした。LTEだとページ読み込み時にちょっとひっかかる感じがありました。光でレイテンシが改善したせいか、スループットはそれほど向上していなくても、多少サクサク読み込まれている気がします。

また、日中回線が開通した12時頃には、上りは20Mbps程度出ていました。その際は、VDSL終端装置に付属していた1.5m程度の電話コードを使用していました。でも、これだと設置場所が限られたので、10mの電話コードでモジュラージャックに接続しました。上り速度が低下した原因はそのせいなのか、あるいは時間帯のせいなのかは、現在のところ分かっていません(また短いコードに戻すのが面倒なので)。

正直なところ、もう少し速いことを期待していましたが(できれば50Mbps位欲しかった)、気持ちとしてはLTEに対してちょっとの改善といったところです。 もっとも、レイテンシの改善と、通信量制限が無いというメリットはあるので、しばらく様子を見て、これくらいの速度で安定しているなら、ギガトラWiFiは解約しようかと思います。

Ubuntu 18.04でTP-Link AC600 Archer T2U Nanoを使う

光回線を導入するに当たって、折角なのでUbuntuがインストールされているデスクトップパソコン用のUSB WiFiアダプタを購入しました。5GHz(802.11ac/802.11a)にも対応したTP-Link AC600 Archer T2Uです。Ubuntu 18.04では、USBに刺しただけでは認識しれくれません。

WiFiアダプタ - TP-Link AC600 Archer T2U Nano をUbuntuで使用するための設定 にインストール方法が出ていましたが、リンク先のソースは更新がしばらく止まっていたので、そのオリジナルらしい、aircrack-ng/rtl8812auを導入しました。リンク先のページの手順でドライバのコンパイルとインストールが行えて、その後USBドングルを挿抜することで認識されました。

2021/3/5 追記: ノートパソコン(Intel Wi-Fi 6 AX200搭載)と、本機を刺したデスクトップパソコンをWSR-1166DHPL2/Nで接続し、SCPでファイル転送してみたところ、最大で130Mbps程度の速度が出ていました。 ノートパソコンは5GHz, デスクトップは2.4GHzでルータに接続しました。