iwate

A software developper in Japan github: https://github.com/iwate

Razorをコンパイルしたときの中間ファイルを出力する

Razorは、C#のソースコードに展開されて、そのC#がコンパイルされる。 そのため、Razorのコンパイルエラーは、Razorのパースエラーと、C#のエラーの両方があり得る。 たまに、Razorの気持ちが分からなくて、どういうC#のコードに展開されているのか確認したいときがあるが、ASP.NET Coreではオンメモリで処理されるので、そういうときは ファイルに書き出すオプションを有効化する必要がある。 <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> </PropertyGroup> すると、ビルドしたときに obj/Debug/<sdk-version>/generated/Microsoft.NET.Sdk.Razor.SourceGenerators\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/ に保存される。 ...
Read post

ODataHttpClient

ODataHttpClientというライブラリを作って公開しています。First Commitから随分立つので、ここらへんで一旦どうしてこれを作ろうと思い立ったか、どう使いたくて、どう使ってもらいたくて、実際作って使ってみてどうだったかをまとめておこうかと思います。 ホントはリポジトリに英語で書いたほうがいいんですが、とりあえず下書きでここに母語で書きます。 OData ODataHttpClientはその名の通りODataのクライアントなのですが、ODataとは何でしょうか。そこから整理をはじめてみます。 ODataはOASISで標準仕様が策定されているプロトコルです。OASISでは他にAMQPなどが策定されています。 https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata ODataの策定員会ではMicrosoftやSAP、IBMの方々が中心となって進めています。またこれらの企業がスポンサードしています。 私がODataの存在を知って触りだしたのは、所属する会社に入社してからで、時代的にはXML...
Read post

耐震シミュレーション

先日、太陽光パネル載せませんかという営業がきた。 災害時や停電時の非常電源として、ずっと気になってはいたので、太陽光パネル載せようかなと思ったが、載せたときの地震に耐えられるのか気になった。 何とか自分で計算できないものかと思って調べたら、京都大学の生存圏研究所で開発してる Wallstat というものを見つけた。 使いやすそうだったので、これを使用してシミュレーションしてみた。 図面とにらめっこしながらポチポチすれば素人でもシミュレーションできて良かった。使い方もYouTubeに動画があるので迷うことも少なかったが、 柱や接合部の材料は、コミュニティからダウンロードできるデータが使えるとはいえ、全ては揃わなかった。 これらの代替として、リストにあるものを割り当てていくのが素人には難しかった。 名前的に近そうとか、形状を調べて用途と形、強度値が近しいかどうかなど当てはめていくのが一番時間がかかった。 素人の適当入力なので正確なシミュレーションにはなってないと思うが知りたかったのは、太陽光パネルを載せたときどうなるかなので差が分かれば良いとする。 太陽光パネルは15k...
Read post

Learning WASM #13

WASM側でTaskを使ったらどうなるんだろう。 準備のためにホスト側に関数を生やしてそれをWASM側から実行できるようにしてみる。 ゲスト側ではホストの関数を参照するのに[DllImport]をつかう using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; using System.Text; namespace classlib; public static class Class1 { [DllImport("*")] static extern void return_string(IntPtr ptr, int len); [UnmanagedCallersOnly(EntryPoint = "ReadAsync")] public static void ReadAsync() { var str = ManagedString(); var bytes = Encoding...
Read post

Learning WASM #12

分かってはいたけど、WASMの関数をホスト側からパラレルに実行したら死んだ。 毎回初期化するのは時間かかるから、プールを作って同時実行しないように制御しないとだな thread 'thread 'thread 'thread 'thread 'thread '<unnamed><unnamed><unnamed>thread '<unnamed><unnamed><unnamed>' panicked at '' panicked at '' panicked at '' panicked at '0xabeedadce0 >= 0xabf167e7a0<unnamed>' panicked at '0xabeedadce0 >= 0xabf107eb900xabeedadce0 >= 0xabf14fe690', ', crates\runtime\src\traphandlers\backtrace.rs0x0 > 0xabf0d7ea60' panicked at '0xa...
Read post

Learning WASM #11

unsafe使って書いてみた。無駄なコピーはなくなった。 けどどうだろう。fixedしたことによってGCが回収できなくなっちゃった。ホストが読んだらもういらないんだけど。 でも、そもそもWASMだとまだGC動かなかった気もする。プロポーザルは出てる。 Blazorはそこらへんどうなってるんだろう。 WASM側 using System.Runtime.InteropServices; using System.Text; namespace classlib; public static class Class1 { [UnmanagedCallersOnly(EntryPoint = "Read")] public static IntPtr Read() { var str = ManagedString(); return WriteToMemory(str); } private static IntPtr WriteToMemory(string str) { var by...
Read post

Learning WASM #10

Managedな値をホストとの共有メモリに書き出してみる。 とは言っても、バイト列に変換して、共有メモリにコピーするだけ。 WASM側 using System.Runtime.InteropServices; using System.Text; namespace classlib; public static class Class1 { [UnmanagedCallersOnly(EntryPoint = "Read")] public static IntPtr Read() { var str = ManagedString(); return WriteToMemory(str); } private static IntPtr WriteToMemory(string str) { var prefix = sizeof(int); var bytes = Encoding.ASCII.GetBytes(str); var ptr = Mars...
Read post

Learning WASM #9

.NET 8.0のリリースも間近に迫りました。 LTSの更新であれやこれやを更新して周らないといけないかと思うと憂鬱です。新しいバージョンのリリースが素直に喜べないないんて歳を重ねたってことなのかな、なんて思う今日この頃。 でも、8が全く楽しみでないかというとそうでもありません。AOTが対応になってWASIバイナリへのコンパイルも簡単にできるようになります。 ということでやってみました。 コンパイルするにはwasi-experimental workloadとWASI-SDKが必要です。 まとめてDockerfileにしておきました。 ここまでは、前にもやったことがあるし、実はそこまで興味ない。 興味があるのはエントリーポイントのあるWASIバイナリではなく、関数がexportされているライブラリとしてのWASIバイナリです。 これができると、WASMを使ったプラグインを.NETで書くことができます。 今まは、wasmtimeを使ってホストしかかけてなかったけどゲスト側もC#で書きたい。.NET7のころからできてたみたいですが手を出してなかったのでこの機会にやって...
Read post

続⁴ Azure Functions IsolatedでSingleton

前回 もはや、Singletonの話じゃなくて、CQRSライブラリの話に代わってしまっているが、前回BlobTriggerに変えたことで、せっかく作ったSingletonが使えなくなったので、 Commander用のミドルウェアを作った。 使用例 ...
Read post

How to delete config cache of IIS Express with VS2022

I got a error using IIS Express. It seems like config error because the log tells me old application path. I moved solution dir before happened this error. However IIS Express seems to handle old path. I checked Task Manager and get starting parameter of IIS Express, $(SolutionDir).vs/$(ProjectName)/config/applicationhost.config was passed. After deleting it, The app has run without error. ...
Read post

続々々Azure Functions IsolatedでSingleton

これが、 こうなり、 こうなった。 最終的に、CQRS用のライブラリを作りに至ったわけだけど、 課題としては、トリガー用のStorage QueueとBlobの中に作ったコマンドキューとの間でキューの長さがずれてしまった場合、トリガーが全部終わってもコマンドキューの中に処理されないコマンドが残ってしまう可能性がある。 という課題が残っていた。 これをどうしようかなあと思っていて、ずっと放置していたのでこの週末実装した。 アイディアとしては、キューが同一トランザクションで書き込みできないStorageBlobとStorageQueueに分離してしまうからズレる可能性が生まれるわけで、Blobに書いたものを拾って次につなげればいいはず※1。 こういうの何っていうんだっけ?分散トランザクションじゃなくて違う言い方があったと思うんだけどなあ。思い出せない。 基本的な使い方は変わっていないが、StorageQueueを繋ぎに使わないとこだけ違う。 public class InvokeCommand { private readonly Comma...
Read post

ブラウザ上でJavaScriptの単体テストをしたい

単体テストはjest、E2Eテストならplaywright。 これが最近の流行なんじゃなかろうか。類に漏れず、私もその2つを使ってる。 ただこの前困ったことがあった。ブラウザでしか動かないコードをテストしたくなったのだ。 jestはnodeで実行されるから、nodeでもブラウザでも動くコードなら問題なくテストできるのだけれども、このAPIは実装されていないのでダメだし、ブラウザごとにアルゴリズムの実装状況が違うかもしれないから、それをブラウザごとにテストしたい。つまり、やりたいこととしては、単体テストなんだけど、実現方法としてはブラウザを起動して行うためe2eに近い。 jest前は、jasmin、karmaなどで、ブラウザ上でテストするのは一般的だったから、そのころと同じような構成とるかと思ったけれども、e2eようにplaywrightは入れてるわけで、そこに新たにpupetter入れてとかするのも、ことが大きすぎるなと感じる 結果的に考えたのは以下のような構成。 # dir tree ├ src │ ├ client │ │ └ test_target.ts │ └ ser...
Read post

Config dotnet output language settings

Set DOTNET_CLI_UI_LANGUAGE environment variable. $env:DOTNET_CLI_UI_LANGUAGE="en" ...
Read post

Ubuntu 20.04 (Zorin OS Lite 16)でmouse fp01を使う

去年買ったmicro pcはとてもコンパクトで、Linuxを入れて楽しく使ってる。 モバイル機として使うため、電池持ちが良くなるようCPUのクロック調整など色々設定している。スクリーンロック摩での時間を1分程度にしてるのもその1つ。 ただ、毎回スクリーンロックを解除するためにパスワードをその都度入力するのはスマホに浸った現代人には結構面倒だと思う。 かと言ってパスワード入力なしにするのは、電車に置き忘れたりしたら怖い(前科あり) だから、スマホみたいに指紋認証で開けられないかなあと思ってた。 調べてたら、mouseのusb指紋リーダーfp01が使えるかもという情報を見つけた。 mouseのfp01は昔買ってあったので引っ張り出してきて指してみた。 aptでfprintdを入れてみるが、fprintd-enrollコマンドがエラーになる。どうやら認識してないようだった。 fp01のなかのモジュールは、LighTuning TechnologyのEGISというものらしく、調べると、libfprint v1.92.1でドライバが追加されているようだった。 が、使...
Read post

Pronoun always confuse me

Lisa love a time she spends with her friends. Today, She go out with Karen because *she is hungry. I'm often lost the mean of the pronoun. Which is *she, Lisa or Karen? I guess it's Lisa in the case. If it correct, how do I write down for Karen? ...
Read post

Today's English words #5

できるようになる become able to Babys suprise me everyday because they become able to what they weren't able to yesterday. ハイハイ crawl My daughter seems like that she wants to crawl but she can't yet because she can't up her upper body. So, she is crying as she can't that she want to do. ...
Read post

ECG

PixelWatchを触ってたら、最初からECGアプリが入ってることに気づいた。 Versa2を使ってたときは日本では測定アプリが時計に入れられなかったけど、最初から入ってるなら使えるのではとおもって開始ボタンを押した。 すると、Fitbitのアプリが起動してお使いの地域では使用できませんと言われるが、NordVPNで米国にVPN張って再度試してみたところ、見事突破。 念願のECGが使えた!やったー! ...
Read post

Today's English words #4

爪 nail 爪が伸びる nails grow 爪が伸びるのが早い nails grow fast Baby's nails grow up fast. 爪をきる cut one's nails trim one's nails 爪で引っ掻く scratch with nails 引っ掻き傷 scratch scratch mark 握る grasp 爪が食い込む、爪をたてる dig one's nails into something It hurts that she grasps my arm. cuz her nails grow fast and she digs her nails into my arm. So, I should trim her nails everyday. 蒸れる be stuffy get stuffy feel stuffy 汗疹 heat rash かぶれる get a rash よだれ drool よだれを垂らす drool よだれがついた drooly 寝返り roll-over 寝返りを打つ ...
Read post

Today's English words #3

母乳 breast milk 乳児用粉ミルク formula milk baby formula 仰向け facing upward 仰向けに寝る lie on one's back 仰向けになる turn on one's back 仰向けにする turn something face up うつ伏せ lying on one's face うつ伏せになる lie on one's face うつ伏せタイム tummy time tummy ... おなか、ポンポン ポンポンペイン tummy bug 首が座る holding up one's head lifting up one's head stable She can holding up her head Her neck is becoming stable. ...
Read post

Today's English words #2

抱っこする carry in one's arm I carry her in my arm. おんぶする carry piggyback I carry her piggyback. 哺乳瓶 baby's bottle おしゃぶり pacifier teeth ring (人が物理的に)反り返る arch one's back She arches her back. She doesn't asleep and all she arches her back. ...
Read post

Today's English words #1

しゃぶる suck She's sucking her fingers. オムツ diaper オムツを変える change the baby's diaper オムツをする put a diaper on (a baby) オシッコする pee do a wee do wee-wee go wee-wee She take a pee. She does a wee. She does wee-wee. She goes wee-wee. ウンチする do poopoo go poopy She does poopoo. ウンチしたオムツ poopy diaper ニヤつく grin She grins. She always does poopoo and grins while sucking her fingers soon after that I've changed her diaper. ...
Read post

大掃除(twitter)

大掃除シーズンですね。家の大掃除はもちろんですが、今年はネットの大掃除もしてみようかと思い、過去のtweetを削除した。 これがtwitterの制約で結構難しい。難しいはちょっと違うか。やることはAPIたたくだけなんだけどそこにたどり着くまでが長い。だから面倒ってのが妥当かもしれない。 twitterの仕様 Webやアプリからtweetの削除はできる。が、1個ずつしかできない。2009年から使っているのでそれなりの量なのでそれをポチポチしたくない。 そして、自分のプロフィールからたどれるtweetは、2014? 2015?以降の直近3200tweetに限られているらしく、Webやアプリから消すためにたどり着くのは非常に困難。 さらに、APIでユーザIDをキーにして取得できるtweetもプロフィールと同様の3200件に限られる。 アーカイブを申請する EUでGDPRが施工されてから、自身のアーカイブデータをダウンロードできるようになっている。 自身の設定からアーカイブを申請すると2日後ぐらいにはダウンロードできるようになった。 アーカイブはzipでまとまっててダウンロード...
Read post

続々Azure Functions IsolatedでSingleton

dotnet isolatedなAzure FunctionsでどうしてもSingletonしたいシリーズ。 前回こうやればよさそうってとこまでは考えた。 今回は、これを実行するためのライブラリを書いた。 1つは、Azure Functionの実行をシングルトンになるようにせき止めるためのミドルウェア。 使い方は、起動時にミドルウェアを差し込んで、 var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(app => { app.UseMiddleware<Iwate.AzureFunctions.Middlewares.Singleton.SingletonMiddleware>(); }) .Build(); host.Run(); シングルトンにしたい関数に属性をつける。 public class SingletonFunction { [Function("SingletonFunction")] [Singlet...
Read post

続Azure Functions Isolated でのシングルトン

以前dotnet-isolatedなFunctionでSingletonがどうしても使いたくて、自前ロックを作った。 ただ、これでも完ぺきではなく課題が残ってる。それは実行順序。 前にも書いたが、a)のように並行して動いてしまう関数を、b)OrderIDごとに直列にしたい。 a) +-----------------+ +-----------------+ +-----------------+ |ORDER ID: 100 | |ORDER ID: 100 | |ORDER ID: 101 | |TIMESTAMP: 3s ago| |TIMESTAMP: 2s ago| |TIMESTAMP: 1s ago| +-------+---------+ +-------+---------+ +--------+--------+ | | | +-------v--------------------v----------------...
Read post

The cheap way to make multi tenant SaaS on Azure #1 | Poor man's Azure

Many people say Azure is expensive. But I think Azure isn't so expensive compared AWS or GCP on full workload. However it's true that minimum cost is expensive on Azure. Therefore I've decided to find to make multi tenancy application on Azure as cheap as possible and I'm going to try to write a series of them. In this commemorable first article, I consider front-end and authentication. Azure has many scenarios to host web application, such as WebApps, VM, Container Apps, aks, aci, Static Web...
Read post

Pixel Watch買った

4年前ぐらいに買った初代Fitbit Versaからついに乗り換えた。 Smart watchでスイカ使えるようになった。 スマホ用のPixel WatchアプリをPixel 6 Proにインストールしてポチポチしてセットアップしたんだけど、スイカは新しく発行された。 移管されると思ってたんだけど、そうはならなかった。モバイルスイカのIDをgmailにしてないからかもしらん。 今のチャージ分を使い切ったら試してみる。 充電スタンドほしいんだけどまだなさそう。apple watchの充電スタンドでいけるかなと思って試したら、充電自体はできそうだけど、磁石の極性が違って反発しちゃう。形態のUSB-C統一もそうだけど時計のほうも統一してほしい。 バッテリーライフは今のとこだめそう。Fitbitに比べたらね。 ECGとか、apple watchに負けてる部分が今後埋まったらいいなあ。 ...
Read post

型パズル難しい

あるテーブルへの操作について考える。 1操作をOp型で表す type Op<T> = { table: string pk: (keyof T)[] cols: Partial<T> } keyof Tは型Tが持つプロパティ名のみの型になる。 type MyObj = { prop1: number prop2: string } type MyObjKeys = keyof MyObj // == 'prop1' | 'prop2' Partial<T>は型Tのすべてプロパティをundefined可能にする const obj1: MyObj = {prop1:0} // error porp2は必須 type MyObjPartial = Partial<MyObj> // == { prop1?:number, prop2?:string } const obj2: MyObjPartial = {prop1:0} // OK これらの組み合わせで型Op<T>は、pkには...
Read post

Content Security Policyの困りごと

CSP入れたほうがいいかなあと思って、いくつかのサイトにCSP Reportを仕込んでる。 Report OnlyはCSPに違反するリクエストがあったときに、ブロックはせずに通知だけしてくれるブラウザの機能で、モダンブラウザは大抵対応している。 ブロック入れる前にこれで様子見をしてるが、結構通知がくる。 引っ掛かっているのは次のようなリクエスト。 https://www.google.at/ads/ga-audiences?... https://www.google.cn/ads/ga-audiences?... ... Google Adさんのトップレベルドメインが国別なせいでCSPに登録してない国のGoogleドメインの通知が飛んでくる。 CSPのドメイン指定は、 www.google.* みたいなことはできない。 www.google.evil.xyz とかがすり抜けちゃうから。 えー。つまり、これ全部 CSPに入れる?そんなばかな。 .google.com .google.ad .google.ae .google.com.af .google.com.a...
Read post

WSLからホストを介して外部通信する

WindowsでVPNを使用しているとき、WSLのリクエストはVPNを経由できないらしい。 ので、プロキシなりなんなりでWSLのリクエストをホストに渡して、ホスト側からリクエストを投げないといけない。 Windows 11では設定>アプリ>オプション機能から、Open SSH Server(sshd)をインストールできるので、これでポートフォワードしてみる。 インストールしたら、firewall設定が自動的に設定される。初期値はAllだから適宜見直す。 sshdの起動は管理者権限のPowerShellで PS> Start-Service sshd あとは、WSL側から接続。 # ポートフォワーディングってこれでいいのかな $ ssh -L <target host>:443:<target host>:443 <username>@<host ip> 実は、VPN持ってないから試せてない。 ...
Read post

TypeScriptで型からプロパティ名をとりたいけど...

C#ではリフレクションで簡単に取れる。 IEnumerable<string> propNames = typeof(T).GetProperties().Select(p => p.Name); 同じようなことをしたい。TypeScriptはJavaScriptにトランスパイルされる。つまり、型があるのはコンパイル時点までだから、リフレクションみたいな実行時の解決はできないはず。だから、あるとしたら言語サポートの特殊キーワードだと思うんだけど見つからない。 typeof も keyof も nameof もちゃうんよ。 できないのかなあ。 ほしい用途としてはAPI周り。 async function apiPost<T>(body: T) { const res = await fetch(url, { method: 'post', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) }...
Read post