かつ丼はおやつに入りますか?

コンピュータの話とか食べ物の話とか旅行とかいろいろ

2023年振り返り

はじめに

年の瀬ですので2023年を振り返ります。

買ってよかったもの

FlashForge Adventurer 4

flashforge.jp

3Dプリンタを買い換えました。今まで2万円程度の入門機を使っていたのですがうまく底面が定着しなかったり反りがひどく出力途中で割れたりしていました。
うまくものが作れず3Dプリンタってこんなもんかとがっかりしていたのですが、ダメ元でまともな機種を購入してみることに。結果今まで失敗していたのがウソのように素晴らしいクオリティで出力できるようになりました。(フィラメントを反りの少ない口コミのものに変えたのも効果がありました。)
やはりフィラメント代と電気代を考えると既製品があるなら買ったほうがコスパはいいのですが、自分で設計した通りのジャストサイズで作れるので活用の仕方を考えるのが楽しくなりました。買ってよかった。

Fujifilm ズームレンズ XF16-55mmF2.8 R LM WR

fujifilm-x.com

マジ良いです。でかいけど。
16-55mmの焦点距離全域でF2.8をキープするレンズ。レンズ交換の頻度が激減しました。っていうかこれ以外のレンズは基本持ち歩かないようになりました。 山に持っていって風景やら植物やら山小屋飯やら撮ってます。星空もフルサイズには負けるけどそこそこ撮れます。

Peacock LIBING POT

www.the-peacock.co.jp

ピーコックの魔法瓶。 今まで他社の魔法瓶を使ってましたが洗えない部分があったりそもそも手を突っ込んで洗えなかったりですぐ汚くなってしまっていました。 こちらはすべての部位に手とスポンジを突っ込んでごしごし洗えます。注ぎ口もシンプルで洗えない穴などは開いてません。最高。 注ぎの流れも滑らかで飛び散ったりしませんし注ぎ終わりの切れもとても良いです。注ぎ終わったとに垂れるようなこともありません。 欠点といえば1Lなのでそこそこ大きくて存在感があること。800mlサイズとか一回り小さいともっと良かった。 でもほんとに便利で買って良かった。

GMKtec NucBox 3

www.gmktec.com

ミニPC。ラズパイとかJetson Nanoとかが軒並み値上がりしてるのでGPIOで直接センサー取り付けるとかでなければこういうミニPCのほうが今はコスパ良い気がする。BLEでswitchbotの電力データとかを吸い上げるエッジデバイスとして常駐させてます。こいつ本体の消費電力6Wとか書いてあったと思うけどそれはほんまかいなって思ってる。熱くならないし静かだし、電源ケーブルだけつないでWifiで運用中。ちなみにwindows11がプリインストールされてますがUbuntuに入れ替えて問題なく使えてます。(GUIは未確認)

やったこと

Kotlin Spring Bootの勉強

サーバサイドのモダンな言語環境を学びたくてはじめました。 業務で使ってるわけではないし他のことにもいろいろ手を出して寄り道してるのであまり進んでません。 結構良い感じはしてます。 来年もやっていきたい。

C# .NETの勉強

こっちが業務で使うほう。あんまり好きではない。 メリデメ比較して会社に提言できるレベルになったら(ry

Svelte, Svelte Kitの勉強

良いです。ある程度知識がついたら業務利用していきたい。

まとめ

何も成長してない気がしたけどこうやって振り返るといろいろやってた。来年もよろしくお願いします。

.NET6のASP.NET MVCでシークレットマネージャーを使う[memo]

前置き

パスワードやDB接続情報は安全に扱いたい。 本番環境は環境変数またはAzure Key Vaultなどのデプロイ環境に応じた方法で管理するが、開発環境ではシークレットマネージャーツールというものが用意されている。

環境

登録方法

Visual Studioでソリューションを開いて、ソリューションエクスプローラーからプロジェクトを右クリック。
ユーザーシークレットの管理 をクリックすると secrets.json が開く。

ここにjson形式でkey valueを登録する。
階層構造の場合はkeyの値を : で区切ってもよい。以下は同じ扱いになる。

{
    "db" : {
        "oracle": "oracle connection string"
    }
}
{
    "db:oracle": "oracle connection string"
}

secrets.jsonの保存場所は以下になる。完全にリポジトリ管理から外れる形なのが良い。

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

使用方法

public class TestController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public TestController(IConfiguration configuration) {
        _configuration = configuration;
    }

    public IActionResult ReadConfiguration(){
        string connectString = _configuration["db:oracle"];
        ...
    }
}

ControllerのコンストラクタでIConfigurationを受け取って読み込める。

このIConfigurationというインターフェースによって環境に応じて適切なところから設定情報を読み込んでくれるんじゃなかろうかと思ってる。

SvelteKitのgotoでbaseに戻れなかった話

route/test/+page.svelte

<script lang="ts">
    import { goto } from '$app/navigation';
    import { base } from '$app/paths';

    function gotoBase(){
        goto(base);    // 通常は '/' がbase
    }
</script>

<button on:click={gotoBase}>button1</button>
<form>
    <button on:click={gotoBase}>button2</button>
</form>

button1は画面遷移する。button2は画面遷移しない。
formタグの中の要素からgotoを発火させるとトップページ / に戻るgotoで画面遷移しなくなる。 /testpage とかトップページ以外なら動作する。

手癖でformタグを使わないようにする。

ColdFusionで依存性逆転の原則

概要

ColdFusionで依存性逆転の原則を書いてみる。

ファイル構造

main.cfm
SampleLogic.cfc
SampleModel.cfc
ISampleModel.cfc

依存関係は具象から抽象へ。SampleLogic(具象)はインターフェース(抽象)に依存していてSampleModel.cfc(具象)へは直接依存していない。 SampleLogicへコンストラクタインジェクションでSampleModelオブジェクトを注入。
これならSampleModelをモックに差し替えることでSampleLogic単体でテストできる。

main.cfm

<cfscript>
    function main(){
        var model = new SampleModel();
        var logic = new SampleLogic(model);
        var result = logic.test_logic();
        writeDump(result);    // hoge
    }

    main();
</cfscript>

ISampleModel.cfc

interface{
    string function test_func();
}

SampleModel.cfc

component implements="ISampleModel"{
    public string function test_func(){
        return "hoge";
    }
}

SampleLogic.cfc

component{
    property ISampleModel model;

    /**
     * constructor
     */
    public function init(model_instance){
        this.model = model_instance;
    }

    public function test_logic(){
        return this.model.test_func();
    }
}

TestBoxでColdFusionのユニットテスト

概要

Coldfusionでユニットテストを実行する環境を準備する。

TestBoxとは

TestBox - Ortus Solutions

TestBoxは、BDD(Behavior Driven Development)に基づくColdFusion(CFML)の次世代テストフレームワークであり、テストを作成するための明確でわかりやすい構文を提供します。 テストフレームワーク、ランナー、アサーション、期待値ライブラリだけでなく、MockBox、A Mocking&StubbingFrameworkも付属しています。 また、xUnitスタイルのテストとMXUnitの互換性もサポートしています。

いろいろ書いてあるが要はColdFusionでユニットテストを実現するためのフレームワーク

環境セットアップ

TestBoxをインストールするためにまずはCommandboxでColdFusionサーバを立ち上げる。 Commandboxのセットアップについては以前の記事を参照。

CommandBox> server start cfengine=adobe@v2021.0.04+330004

続いてTestBoxをインストール

CommandBox> box install testbox

runnerを生成

CommandBox> testbox generate harness

ユニットテストファイルを作成

CommandBox> testbox create unit name=tests/MyTest.cfc

tests/runner.cfm のcoverageEnabledをfalseに変更。 カバレッジを取得するにはFusionReactorという有償オプションが必要なため無効化する。(デフォルト有効でそのままテストを実行しようとするとエラーになる。)

<cfparam name="url.coverageEnabled"                    default="false">

テスト実行

CommandBox> testbox run
...
╔═════════════════════════════════════════════════════════════════════╗
║ Passed  ║ Failed  ║ Errored ║ Skipped ║ Bundles ║ Suites  ║ Specs   ║
╠═════════════════════════════════════════════════════════════════════╣
║ 4       ║ 0       ║ 0       ║ 3       ║ 1       ║ 1       ║ 7       ║
╚═════════════════════════════════════════════════════════════════════╝

TestBox         v4.5.0
CFML Engine     ColdFusion Server v2021,0,04,330004
Duration        1,758ms
Labels          ---

√ Passed  - Skipped  !! Exception/Error  X Failure

まとめ

  • 実行環境にCommandboxが必要。 server startlocalhostの開発サーバを起動しておく必要がある。
  • テストを実行するにはrunner.cfmが必要。
  • カバレッジを無効化しないと実行時にエラーとなる。

セットアップは以上。テストコードの書き方とモックの使い方については次回。

マツダNDロードスター購入後の追加出費を整理する

どうもNDロードスターを購入した者です。

買ったはいいものの、いざ乗り始めてからいろいろ欲しいものや必要なものが出てきてしまい、なかなか痛い追加出費が発生したため整理して記録に残すことにする。

購入したもの、する予定のもの

ウィンドブロッカー

言わずもがな。無料でついてくるわけではないため購入必須。
社外品のアクリル製ウィンドブロッカーを購入した。
約2万円。

スタッドレスタイヤ

雪が降る地方のためスタッドレスタイヤは必須。
ロードスターはFR車のため雪道対策を妥協することはできずブリジストンのVRX3を購入することに。
昨今のアルミ不足からくるアルミホイール高騰もあり、なんやかんやで20万近い出費になった。

ドライブレコーダー兼デジタルインナーミラー

ドライブレコーダーは必須。
運転席に座ってみればわかるが、ロードスターは幌を閉めた状態だと純正ルームミラーで視認できる範囲が恐ろしく狭い。
ドライブレコーダーを兼ねてデジタルインナーミラーを購入して取り付けた。
ミラーの視野角が圧倒的に広がるためおすすめ。
約2万円。

Apple Carplay / Android Auto レトロフィットキット

私が購入した中古のロードスターApple Carplay / Android Auto非対応モデルで、しかも車載のUSBポートによるスマホ充電が非力で0.5Aしか出力できないらしい。
USB接続していてもスマホのバッテリー残量が減っていってしまい非常に使い勝手が悪い。
そこで見つけた解決法が Apple Carplay / Android Autoに対応させること。
対応させるにはマツダコネクトのアップデート以外にハードウェアの交換が必要で、取り付けるとUSBポートの充電出力が2.0Aまで上がる。
ディーラーに取り付けまでお願いして約3万円の出費。

カーコーティング

マツダ車の塗装は本当に美しい。
美しいが故に洗車キズがどうしても気になってしまうためガラスコーティングを実施。
約1.5万円。

タイヤチェーン

ロードスター乗りのyoutuberが動画を上げていただいているが、スタッドレスタイヤ最高レベルの質と価格であるVRX2で雪道の坂道発進に手こずる様子をみて恐怖を感じたため購入することにした。
約2.5万円。

エアコンフィルター

どうやらNDロードスターには純正でエアコンフィルターが存在しないらしい。
異物が入ってこないようにするための網がついているだけで、花粉やPM2.5はエアコン送風口から入ってきてしまう。 クローズで乗ってるときくらいクリーンな空気を取り込みたいため、社外品のエアコンフィルターを購入。
約3000円。

まとめ

車購入後すぐになんやかんやで約30万円の出費が発生してしまった。
お財布のひもがガバガバでござる...

commandboxことはじめ

はじめに

ひょんなことからAdobe Coldfusionを使っている。 commandboxの開発元であるOrtus Solutionsは「Modernize or Die」と謳っており、私は死にたくないのでおとなしく使ってみることにする。

とりあえず組み込みサーバまでの覚書き。

環境

windows 10

commandboxとは

coldfusion用のnpmみたいなイメージ。
ColdFusion SummitのゴールドスポンサーになっているOrtus Solutionsが開発しているツール。
forgeboxからパッケージをインストールしたり、コマンドでテストを実行したり、同社製フレームワークであるcoldboxをインストールしたりするのに使用する。

組み込みサーバを使用することができ、Adobe Coldfusionの任意のバージョンを指定してローカルで起動することができる。

CIを回すためのCLI実行モードなども設定できる模様。

単なる開発環境ではなく、本番環境での運用もDockerでの運用もTravis CI等でのCIもできるとのこと。

commandboxインストール

インストールというほどの作業はない。
ダウンロードしてpathを通すだけ。

  1. CommandBoxにアクセスしてJRE Includedのzipをダウンロードする。
  2. 任意のフォルダにzipを展開する。
  3. pathを通す。
  4. terminalで「box」を実行する。

組み込みサーバ起動

任意のバージョンの組み込みサーバを起動する。

box> cd [アプリケーションルート]
box > server start cfengine=adobe[@coldfusionの任意のバージョン]

バージョンの細かい指定方法については公式ドキュメントを参照。
FORGEBOX: Adobe ColdFusionにあるバージョンを指定すればよさそう。

box > server start cfengine=adobe@2018.0.12+328566

Adobe Coldfusionのダウンロードが始まり、数分でサーバが起動する。

確認コマンド

boxでダウンロードしたものを確認する。

box> artifacts list

起動しているサーバを確認する。(boxは複数サーバを複数ポートで起動する。JVMのプロセスがそれぞれ起動するためメモリの使い過ぎに注意。)

box> server list

サーバのwebrootをブラウザで開く。

box> cd [serverのwebroot]
box> server open

boxコマンドのヘルプ

box> [コマンド] help

所感

unittestやbdd testのテンプレート生成機能だったりパフォーマンス管理のfusionreactorの利用を推奨していたり、新しいっぽい機能が色々ありそう。

さて、CFAdminはあるんだろか...DB接続情報はどこに?