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
Learning Zig #1
ZigがはやってるらしいのでHelloWorldぐらいやっておこうと思った。 Getting Startedに沿って環境を準備。 といっても、zipをダウンロードして展開後そこにPATHを通すだけ。 ついでに、makeも用意した。windows環境なのでGnu for Windowsのバイナリ。 wingetでインストールできるので楽ちん。 PATHは別途通さないとだめ。 > winget install GnuWin32.Make zigの面白いなと思ったところが、c(c++)言語が、そのまま、コンパイルできるらしいということ。 TypeScriptみたいだな。 Goがでたころ、Better Cっていう表現されてたけど、そのままコンパイルできるzigがでてきたのでBetter Cのポジションはzigが奪っていくのかなあ。Goと違ってGCなしなのもいいなと思った。 同じGCなしだと、Rustがあるけど、Rustに比べてZigのメモリ管理はプログラマ任せ。Cみたいにメモリリーク発生してしまうけど、Go同様defer構文があるので、Cよりもプログラマに優しい。 z...
Read post
GPD Micro PC 買っちゃった
最近気になってたGPD Micro PC買っちゃった。 メルカリ中古で38,000円 土曜の朝届いて、土日はこいつをセットアップして遊んだ。 CPUはCelron N4100で、RAMは8G。 Windows 10が入ってたけど、最近Linuxで遊びたかったので、はやりのZorinOS Liteを入れてみた。 でもやっぱり、Linux + Laptopは難しいね。Hibernateやら、CPUの周波数制限でバッテリーライフの向上とかやってたら土日が解けました。 最近英語勉強してるけど、そのおともに使おうと思います。 weblio調べたり、YouGlish見たり、SKELLで用例探して、それらをメモする感じに使おうと思ってます。 今までスマホでやってたけど、スマホのキーボードって結構画面を占有するから、メモするとなるとクラムシェルがいいなあと思ってたんですよね。 しばらく試してみます。 ...
Read post
An error occurred (MalformedCertificate) when calling the UploadServerCertificate operation: Unknown
AWSに証明書をアップロードするときに、エラーが出た。 aws iam upload-server-certificate --server-certificate-name mycert --certificate-body file://cert.pem --private-key file://private.key --certificate-chain file://chain.pem --path /mycert/ An error occurred (MalformedCertificate) when calling the UploadServerCertificate operation: Unknown ググると公式ドキュメントが出てくる https://aws.amazon.com/jp/premiumsupport/knowledge-center/import-ssl-certificate-to-iam/ 曰く API リクエストのパラメータ certificate-body、certificate-chain、private-key に「fil...
Read post
Azure Functions Isolated でのシングルトン
.NET用のAzure Functionsは元々ホストが実行されるプロセスで関数を実行していたが、ホストとワーカーが別プロセスで動作するIsolatedタイプが今後主流になるということで、仕事で新しく作るFunctionsはIsolatedでやっている。 ただまだまだIsolatedが発展途上なのか困りごとにもしばしば直面する。 よく書く処理で一番こたえがたいのがSingletonがサポートされていないことだ。 Singletonは便利なやつで、どんなにスケールアウトされていても、並列実行数を限定することができるし、同一IDは直列に処理したい時に便利だ。 a) +-----------------+ +-----------------+ +-----------------+ |ORDER ID: 100 | |ORDER ID: 100 | |ORDER ID: 101 | |TIMESTAMP: 3s ago| |TIMESTAMP: 2s ago| |TIMESTAMP: 1s ago| +-------+---------+ ...
Read post
I released QjsIpc 🎉
Learning WASM 4 ~ 8 の成果をライブラリ化して公開した。 JS側では今回作成したQuickJSの拡張モジュールでるipcモジュールを使用し、プロシージャを登録して、最終的にlistenメソッドを実行する import * as ipc from 'ipc'; ipc.register('echo', function (payload) { return payload; }); ipc.listen(); .NET側では、QjsIpcEngineのインスタンスを作成し、JSファイルと実行フォルダを指定してQuickJSを実行する。 実行した後は、InvokeAsyncメソッドでJS側に登録したプロシージャを実行できる。 using QjsIpc; await using var engine = new QjsIpcEngine(); engine.Start(new QjsIpcOptions { ScriptFileName = "main.js", AllowedDirectoryPath = Environment.C...
Read post
Learning WASM #8
前回作ったqjs.wasmとJSON-RPCするプログラムを改良して、dotnetからjsへrpcコール中に、jsからdotnetにrpcコールできるようにした。 これでホスト側に生やしたヘルパー関数をゲスト関数が使える。 もう書いたコードが長くなってきたので全部貼ることはしないけど、いつも通りリポジトリにあげてある。 こんなホスト関数を生やしたクラスを用意して、 public class Host { public async Task<int> HostMethod1(int intParam, float floatParam, string stringParam, ObjParam objParam) { await Task.Delay(1); Console.WriteLine("Invoke HostMethod1"); Console.WriteLine($"intParam = {intParam}"); Console.WriteLine($"floatParam...
Read post
Learning WASM #7
前回はqjsのカスタモジュールにreadメソッドとwriteメソッドを生やして、hostのdotnetランタイムと文字列のやり取りをできるようにした。 今回は、文字列がやり取りできるようになったのでJSON-RPCを流して、dotnetからjsの関数をコールしてその結果を得たい。 RPC処理ロジックをカスタムモジュールにするには、Cで書く必要がありちょっと大変なので、いったんmain.jsの中にJavaScriptで書いた import * as host from 'host'; import * as std from 'std'; import ejs from './ejs.mjs'; ejs.fileLoader = function(filename) { const file = std.open(filename,'r'); return file.readAsString(); }; const handlers = {}; function register(methodName, handler) { handlers[metho...
Read post
Learning WASM #6
前回はqjsからhostの関数を呼び出した。 今回は、実際に通信できるように read と write を生やしてみる。 C側は puts や getLine を参考にこんな風に実装。dotnet側には1byteずつread writeする関数を生やして、jsモジュールとしては改行コードもしくはEOFまで書き込み読み込みし続けるreadLine、writeLineとして実装する。 __attribute__((import_name("read")))extern int host_read(); __attribute__((import_name("write")))extern void host_write(int c); static JSValue js_host_read_line(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { int c; DynBuf dbuf; JSValu...
Read post
Learning WASM #5
前回、dotnet上で動かしたwasmtimeの上でJS(QuickJS)を動かした。(ややこしいな QuickJSの性質上、QuickJSで動いているJSとホストであるdotnetで通信させる方法が、ファイルを返した通信に限られる。 標準入出力でも行けないかと思ったけど、process分離して動いてるわけじゃないから標準入出力を共有してるためフックできなかった。 Cのfopenが実装されているので、ファイルだけでなくUNIXソケットファイルとかでも通信可能そうだったけどそうなるとホストがUNIXやLinuxじゃないとだめなので、開発しにくそうでやめた。おんなじ理由でtmpfsを使ったRAM上の通信もやめた。 せっかく、WASMを使ってるんだから、QucikJSに手を入れてホストと通信する関数をはやしてしまえばいいだろうということで書いてみた。 https://github.com/iwate/learn-wasm-with-dotnet/tree/main/challenge05 今回は簡単にwasmtimeのサンプルも記載されている引数なしのhello関数をホストに生や...
Read post
Learning WASM #4
wapmでqjsっていうパッケージを見つけた。 知らなかったのだけど、QuickJSっていう軽量なJSランタイムがあってそれをwasm化したものだった。 https://bellard.org/quickjs/ wapmに上がってるのは公式じゃなくて、サードパーティー。しかもバージョンが2年くらい古い せっかくだから、最新ものにコンパイルしようと試みたけれど、ソース改変なしにはうまくいきそうになかったのでいったんwapmにあるもので遊んでみた。 WithArgs に渡す値ではまったけど動いた。 using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Text; using Wasmtime; namespace Iwate.Challenge04 { class Program { static void Main(string[] args) { var dir = AppDomain.Cur...
Read post
Compile dotnet to wasm
.NETをwasmにAOTしてみる。おそらくランタイムごとwasmになるんかな ひとまずこの人の説明通りやってみる。 https://stackoverflow.com/questions/70474778/compiling-c-sharp-project-to-webassembly まず、emscriptenをいれる。Python3.6が必要ぽいけど入っていたのでそこはスキップ git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest ./emsdk activate latest 環境変数がセットされたので一応サインアウトからのサインイン。 適当なフォルダでdotnet projectをつくって、nugetconfigでnugetリポジトリを追加する。3rdPartyせいなのね。blazorのとかこれじゃなかったのか。 mkdir sample cd sample dotnet new classlib dotnet new nugetconfig <...
Read post
Redash on Azure WebApps for Container
How to Provisioning 1. Create Azure Database for PostgreSQL server 2. Create Azure WebApps for Container 3. Allow WebApps outbound IPs in PostgreSQL's Connection security firewall 4. Configure compose settings for table provisioning in WebApps's DeployCenter Configure following and execute create_db command. version: '3.3' services: redash: image: redash/redash:10.1.0.b50633 environment: PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: INFO REDASH_COOKIE_SECRET: {self gene...
Read post
MAUI
MAUIはじめて見ようと思った。 とりあえず、環境構築から。 https://docs.microsoft.com/ja-jp/dotnet/maui/get-started/installation VS2022が必要らしいので、そこからかー。 RCをインストール中 追記: これ、RCでも本リリースでもだめでPreviewじゃないと今のところできない。 ...
Read post
SaburaIIS
夏休みの自由研究(2か月もたっちゃったけど)として、こんなのを作った。 https://github.com/iwate/saburaiis Azure VMSSのIISにContinuous Deliveryするためのシステムなんだけど、割と良くできていると思う。 挑戦的には、長いこと書いてなかったReactの今はどうなってるのか書いてみるってのが1つ、CosmosDBあんまり使ったことないから使ってみるてのが1つ、bicepも書いたことないから覚えて置こうってことで結構勉強になった。 作った理由はVMSS便利そうなんだけど、アプリケーションの配置がコレジャナイ感あったから。 VMSSへのアプリケーションのデプロイは以下の4つがメジャーっていう認識なんだけど、 カスタムプロビジョニングスクリプト カスタムVHDイメージ Service Fabric Kubernets カスタムプロビジョニングスクリプトやカスタムVHDイメージって新しいバージョンのアプリケーションをデプロイしたいとして、再起動なりVMの入れ替えなり(ローリングアップデート)が必要だから、1日に100...
Read post
Learning WASM #3
Rustでライブラリを作成して、dotnetからそれを呼び出すのを試した。 https://github.com/iwate/learn-wasm-with-dotnet/tree/main/challenge02 まずは、簡単なとこから、ただの2値の足し算をするadd関数をrust -> wasm -> dotnetで実行する rust + wasm で検索したら、wasm-packばっかりで、なかなかただのwasmの生成方法がわからなかったけど、wasiとかwasmtimeでググったら何とか知見が得られた。 まずは、rustでwasmをターゲットにしてコンパイルできるように、ターゲットを足す。 rustup target add wasm32-unknown-unknown 次に、普通にrustのプロジェクトを作る。add関数を外から使いたいからプロジェクトタイプはlibで。 Cargo.tomlはこんな感じでまっさらでいい。 [package] name = "challenge02" version = "0.1.0" authors = ["iwate ...
Read post
Learning WASM #2
Protocol Bufferフォーマットを使用して、dotnetとwasmの間でオブジェクトをやり取りするコードを書いてみた。 https://github.com/iwate/learn-wasm-with-dotnet/tree/main/challenge01 こんな感じのプロトファイルを用意して、 syntax = "proto3"; option csharp_namespace = "Iwate.WasmtimeChallenge"; package greet; message Hello { string message = 1; } dotent側で生成した Hello をバイナリに書き出して、wasmのshared memoryに書き込んでから wasmモジュールのrun を実行する。 shared memoryから Helloをパースするとwasmで加工された情報が受け取れる。 using System; using System.IO; using Google.Protobuf; using Iwate.WasmtimeChallenge; ...
Read post
WebApps as ARR
Last year, I describe WebApps with File Share for hosting static website. I find another way. WebApps can ARR if you transform applicationHost. <!-- D:\home\site\applicationHost.xdt --> <?xml version="1.0"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <system.webServer> <proxy xdt:Transform="InsertIfMissing" enabled="true" preserveHostHeader="false" reverseRewriteHostInResponseHeaders="false" /> </s...
Read post
Learning WASM #1
dotnetからwasmを実行するのが面白そう。これがモノになったら多言語間をまたいだプラグインシステムが作るんじゃないかな。 まだ、File IOとかNetwork Stackとかは使えないらしいけど、専用関数用意すればよさそう。FastlyとかCloudflareとかはエッジ用のエンジンでwasm実行できるようにしてるしね。 まずは、wasmになれたい。 https://github.com/bytecodealliance/wasmtime-dotnet/blob/main/examples/memory/memory.wat (module (type $t0 (func (param i32 i32))) (import "" "log" (func $.log (type $t0))) (memory (export "mem") 1 2) (data (i32.const 0) "Hello World") (func $run i32.const 0 i32.const 11 call $.log ) (expor...
Read post
Forward Emailを使ってみる
https://forwardemail.net/ というナイスなサービスがある。 メール転送サービスで、SMTPにも対応しているので送信にもカスタムドメインが使える。しかも無料。 課金すると、どこに転送しているのかっていう情報を隠せる。例えばバックエンドをgmailで使用していたら、FREEでは、TXTレコードでフォワーディング先のgmailアカウントを設定する必要があるのでdigればわかってしまうのが、課金すればforwardemailのデータサーバに設定できるようになるので公開しなくて済む。 まあ、2段階認証してるし公開してもいいでしょう。ということで無料プランで利用することにした。 メインで使っているメールボックスはoutlook(今時少ないlive.jp)なので、最初はoutlookに転送していたけど、送信でつまずく。うまいこと、設定できずに、送信者がoutlookのメアドになってしまう。 カスタムDKIM設定できないし迷惑メール行きになるもんで困った。 https://forwardemail.net/faq?domain=iwate.me#lazyframe-M...
Read post
クライアント証明書はIP制限の代替足りえるのか
Covid19でWFHが広く行われるようになって、1年たとうとしてしているがWFHでWeb上の管理画面を使用する機会を得た人も多かったことでしょう。 ただし、いままではWeb上の管理画面にはIP制限がかかっていることが多かったはずです。(何か資料で示せればいいのですが。) WFHがはじまって、VPN終端に負荷がかかり、従来のプライベートネットワークによりセキュリティポリシーを見直し、ゼロトラストセキュリティという言葉も一般に広がりはじめました。 日本では、平井卓也デジタル改革担当大臣が行政の目指すセキュリティポリシーの指針として発言したことも広がるきっかけになりました。 さて、WFHで様々なIPから管理画面にアクセスしたいとした時に、今までのIP制限では都合が悪いのでクライアント証明書制限を検討しています。 しかし、私はクライアント証明書制限が本当にIP制限の代替なのか疑問に思っています。前提として、ID/パスワードでの認証がある管理画面にさらにIP制限をかけているケースで話しています。 IP制限≒地理制限 IPは動的にしろ静的にしろISPによって決まります。さらにISPは...
Read post
母国語で書くことにする - I have decided to write posts in my native language
今まで頑張って英語で書いてきたけど、英語で書くのが億劫になって、全然ブログがかけてなかった。 I have tryed to write posts in English but I cannot write it at all recently because writing in English become a pain. 英語学習もかねて、英語で書きたい気持ちもまだあるんだけど、ここブログとしての体裁を優先して母国語(日本語)で書くことにする。 I still have want to writing in English for learning English. However I am going write it in native language(Jpanese) to update blog high freq. 書き終わった後に、英語訳を加筆するというスタイルを目指す。 I aim a style that add transaltions after write in native language. つまり、今までは英語でブログを書くという1つの...
Read post
listed.to can draw iframe
iframe google drive <iframe src="https://lh3.googleusercontent.com/1ELwTX3NxXUWuLUnTZSvvRuiNC63IAIrdSnfX0zwV5QBhTYABWfGfh4_uiD29AHLMJMaJDkt3lhqnN3HTIYYGN91iuF4UMjE=w640" width="640" height="480"></iframe> iframe ogp link <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.iwate.me%2F21828%2Flisted-can-draw-iframe"></iframe> iframe google drive iframe ogp link ab Head Head A B ...
Read post
How to settings GA4 ecommerce by GTM
GTM Variables Ecommerce Items = ecommerce.items Ecommerce Purchase TransactionId = ecommerce.purchase.transaction_id Ecommerce Purchase Affiliation = ecommerce.purchase.affiliation Ecommerce Purchase Value = ecommerce.purchase.value Ecommerce Purchase Tax = ecommerce.purchase.tax Ecommerce Purchase Shipping = ecommerce.purchase.shipping Ecommerce Purchase Currency = ecommerce.purchase.currency Ecommerce Purchase Coupon= ecommerce.purchase.coupon GTM Triggers CustomEvent viewitemlist C...
Read post
Remote desktop does not work
I always use remote desktop to shutdown main pc in bed. A few days ago, I update windows patch. After the patch, I cannot connect main pc via remote desktop. I check event viewer and find the error log. The device Microsoft Remote Display Adapter (location (unknown)) is offline due to a user-mode driver crash. Apparently there is an error around the display. In my case, it is the cause that radeon driver is old. I updated the graphic driver and I regained remote desktop. ...
Read post
StreamWriter.WriteLine write LF line break code on Linux
I face to misterius issue. OData batch response of multipart/mixed can not be parsed on Linux. It's good on Windows. https://github.com/iwate/ODataBatchResponseSample/actions/runs/171318359 I check OData source code. And I've found what I think is the cause. OData batch response write the content using by RawValueWriter. And RawValueWriter use StreamWriter. https://github.com/OData/odata.net/blob/182964dd4de0d9271d7e749ff3afde898430326c/src/Microsoft.OData.Core/RawValueWriter.cs#L177 Strea...
Read post
Ascertia's code sign certificate is cheep but...
Ascertia (https://account.ascertia.com/OnlineCA/default) sell certificate and user can test free certificate(30days). It seems Messiah for me. but I realized import notes. Note Ascertia Root Certificate Authority is not embedded within Windows or the common browsers but can be downloaded from here and easily added. Ascertia Root Certificate Authority is not embedded within Windows! Ascertia Root Certificate Authority is not embedded within Windows! Ascertia Root Certificate Authority is not...
Read post
Microsoft Authenticode
I realized something shocking today. I thought I'd turn off the WindowsInstaller warning for the Electron App I'm working on, but it looks like I need a Code Sign certificate for Microsoft Authenticode. I tried to prepare it somehow, but there are few places that will sell it to individuals first. And so expensive 😭 ...
Read post
I Contract PO Box
I've contracted post office box https://epost-tokyo.com/ today. I am preparing my side business recently and I need new address for Notation based on the Specified Commercial Transaction Act.(in Japanese 特定商取引法に基づく表記) The cost is 19,000 JPY within tax. It is 1,600 JPY / mo. Ummmm, That's nothing to sneeze at for me. And, I've got new phone number of VoIP because same reason as address. The cost is 330 JPY per month. Totally, new cost for my side business is 1,900 JPY per month. The unit pr...
Read post
Fetch And Store Public Certificate
I needed to check my signature in the app I was creating, but was wondering where to store the public key. One of the ideas was to embed it in the binary, but I would like to be able to get the latest one because the update becomes difficult. So I came up with a way to store it in the X509Store. The implementation is as follows. using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; namespace ConsoleApp3 { clas...
Read post
Azure WebApps with File Shares
I need static web site hositng. But Azure storage static website hositng feaure is not appropriate. Because it cannot use any autentication. Therefore, I use WebApps. However, I do not want to use SFTP. or git deploy. I remembered Azure function use storage file shares. It is enabled by webapps config. I add following two configs and restart webapp and it is so good. WEBSITECONTENTAZUREFILECONNECTIONSTRING <connection string> WEBSITECONTENTSHARE <file share name> ...
Read post
Azure Pricing
I'm making hoby services and considering Azure for hostring service. However I don’t have much money. I want to manage as cheap as possible. Therefore, I research pricings and consider most cheap arcitecure. WebApps(Windows) Shared: ¥1,250.928/month (limit 240 CPU min / day) 😢 Basic1: ¥7,235.760/month 🤑 WebApps(Linux) Basic1: ¥1,553.44/month 😗 StorageWebHostWithFunction Storage: ~¥100/month 😊 CDN : ~¥1,200/month 🙄 Function: ~¥0/month (within free plan) 😊 Container Instance ...
Read post
Hello, World!
This is my first blog. ...
Read post