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://drive.google.com/file/d/0B__Gb6a7KXSlSTZZRmhxeXZmdEE/preview" 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 ...
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