Guild icon
swift-developers-japan
main / wasm
Avatar
@hiragram
2:25 AM
@omochimetaru -emit-irで吐いた.llをemに食わせると Appending variables with different alignment need to be linked! って言われてコンパイル通らないんだけどなんだかわかりますか・・・
Avatar
はい
2:25 AM
$ ./emsdk-portable/emscripten/incoming/emcc swift/hello.ll -o swift/hello.html warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' error: Appending variables with different alignment need to be linked! ERROR:root:Failed to run llvm optimizations:
Avatar
全体としてはわからんけど何かの型についての情報が足りないって感じがする different alignment は アライメントが違うってことだから
Avatar
全文
Avatar
例えば Int は 8 ?(4?) で、 UInt8 は 1 で、みたいな。
2:26 AM
Appending variables ってのがよくわからんね
2:26 AM
どの次元の何のAppendの話なんだろう
Avatar
元のSwiftは print("Hello, Swift!") これだけ
2:27 AM
1行
Avatar
ll を生成した行は?
Avatar
$ swiftc swift/hello.swift -emit-ir -o swift/hello.ll
Avatar
swiftc swift/hello.swift -emit-ir -static-stdlib -o swift/hello.ll だとどう?
Avatar
変わらんすねえ
Avatar
llのサイズ変わった?
2:31 AM
元のやつだと、 print と String についての情報が生成されてないから
Avatar
かわんない
Avatar
あと @convention(c) func a(x: Int) -> Int { return x * 2 }
2:32 AM
とかから試したほうが良いと思う
2:32 AM
print とか String の定義とか
2:32 AM
いろいろあるから
Avatar
ok
Avatar
あれ~サイズ変わらないのか
2:33 AM
あれか、static-stdlib は リンクステージの話だから、
2:33 AM
ll を吐くステージで止めてるから意味ないのか。
Avatar
@convention って初めて使った。
Avatar
(c) つけとくとC言語から呼び出せる関数になる
Avatar
@omochimetaru swift/hello.swift:1:2: error: attribute can only be applied to types, not declarations @convention(c) ^
Avatar
付ける場所が違うかもw
Avatar
コンパイル通んなかったw
Avatar
調べて
Avatar
ok
Avatar
@_cdecl じゃないかな?
Avatar
emscripten側は内部に持ってるclangを使っててターゲットが asmjs-unknown-emscripten で、swiftcはターゲットが x86_64-apple-macosx10.9 になってるっぽい
2:50 AM
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9'
2:51 AM
swiftc側のコンパイルをasmjs-unknown-emscriptenをターゲットにできればいいのかな
2:52 AM
微妙に書いてないな・・・
2:54 AM
あーどうなんだろう、同じになったほうがいいけど、しなくても大丈夫な気もしつつ。
2:54 AM
LLVMIR の時点で LLRMIR 側の i32 みたいな型で記述されているから
Avatar
alignmentが合わないのはそこの差異が原因ってことはないもの?
Avatar
ターゲットの違いがあまり問題にならない気もする
Avatar
ふむ
Avatar
いや、ありえる
Avatar
なんか調べた感じemは自分でclangのコンパイラ持ってて、swiftcで使ってるやつと別のやつが動いてる気がする
Avatar
うん、それはそう
2:55 AM
emはIRからその先の変換処理をもつために独自改造したclangを使うんだと思う
Avatar
emのSwiftに関するなっげえissue今読んでる
Avatar
序盤はdylib周りよ
2:56 AM
とりあえず @convention(c) はおいといて普通にfuncつくろう
2:56 AM
普通の(トップレベルでキャプチャがない) funcはC互換な気がしてきた
2:57 AM
ObjCから呼べるし。(thunkが作られている可能性はあるが
Avatar
hello.swift空っぽにしても同じエラーなんだけどそういうもん?
Avatar
マジか
Avatar
なんかfuncとかのステージにすら立ててない感ある
Avatar
逆にコンパイル後ってそれ何が入ってる?
Avatar
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" @__swift_reflection_version = linkonce_odr hidden constant i16 3 @llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 } attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" } !llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !9, !10} !0 = !{i32 1, !"Objective-C Version", i32 2} !1 = !{i32 1, !"Objective-C Image Info Version", i32 0} !2 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"} !3 = !{i32 4, !"Objective-C Garbage Collection", i32 1280} !4 = !{i32 1, !"Objective-C Class Properties", i32 64} !5 = !{i32 6, !"Linker Options", !6} !6 = !{!7, !8} !7 = !{!"-lswiftCore"} !8 = !{!"-lobjc"} !9 = !{i32 1, !"PIC Level", i32 2} !10 = !{i32 1, !"Swift Version", i32 5}
2:58 AM
空のhello.swiftのemit-irしたものね
Avatar
@llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8
2:59 AM
これあやしそうだね
Avatar
その怪しみ分からない…
Avatar
appending
Avatar
おー
Avatar
あと、外部関数 __swift_reflection_version
2:59 AM
が絡んでる。
2:59 AM
原理的にいまうまくいかない理由になる。
3:00 AM
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 }
3:00 AM
↑これだけにしたらいけないかな、あと、 main があるのおかしい気がしてきました。
3:00 AM
static library としてビルドしよう
3:00 AM
まあ、 main って名前の関数になってくれるかもしれんけど。
Avatar
Hello All, I tried using clang 3.9.0 to emit the llvm ir with -target wasm32-wasm32-wasm32, but end up getting warning for different data layout and target triple. The question is if llvm WebAssembly target is usable as is to generate llvm ir to be fed to emscripten ? The warning is expected, but should not cause problems in practice. The important things are the same in those two triples. (Except perhaps for the size of long doubles, is that important in Swift?)
3:02 AM
target違いのwarning問題なしみたいなこと言ってる
3:02 AM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
Avatar
↑はどう? シンプルにするのと、 static libary にするの。
Avatar
llをこれに置き換えればよし?
Avatar
うん。
Avatar
やってみます
Avatar
余計そうなのを消してみた。
Avatar
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: incorrect target triple 'x86_64-apple-macosx10.9' (did you use emcc/em++ on all source files and not clang directly?)
3:05 AM
warningはなんか出たが一応エラーなく終了した。
Avatar
いけたw
Avatar
wasmファイルも書き出された。
3:05 AM
電車降りちゃうからまたあとで
3:22 PM
これ、今のSwiftじゃWebAssemblyできませんよでFAなのかな
3:22 PM
かなしい
Avatar
swiftc本体からのwasmターゲットが駄目なだけじゃないか
Avatar
Avatar
これはwasmバイナリの生成パスでしょう
Avatar
clang -emit-llvmとかそういう感じ?
Avatar
LLVMIRを生成して、そこから先はemやclangの機能でもっていきたい
Avatar
IRGen.cppでwasmサポート無いって言われてるから無いのかなーと判断したけど
3:25 PM
要はswiftcが-emit-irで asmjs-unknown-emscripten というターゲットでIRを吐く必要があるんじゃねという理解なんだけど
Avatar
本来的に
3:27 PM
LLVMって 言語→CPU中立なIR のフロントエンド と、 IR -> アセンブリ のバックエンドに
Avatar
うん
Avatar
分けたのが価値だったはずで
3:27 PM
でもなんでLLVMIRの生成にターゲットトリプルが絡んでくるのか
3:28 PM
そこがよくわかってない
Avatar
CPU中立なIRっていうのはCPUに依存せず同じIRっていう意味であってる?
Avatar
CPUの差と、実行ファイル形式の差(ELFとか)はまた別で、後者まではIR生成時に決まってしまうのかなあ
3:29 PM
そう
3:29 PM
同じIRからarmv7とかx86向けのアセンブリを作るのがバックエンド
Avatar
つまりosxターゲットのIRとwasm用のIRが違うのがおやおやという感じなのよね
3:29 PM
そこはなんとなくわかる
Avatar
osxターゲットというのはちょっと違う osxは armでもintelでも動くから
Avatar
おう
Avatar
で、osxの実行ファイルやstaticライブラリは Mach-O 形式
3:31 PM
あとemscriptenはもともと LLVM to JS なやつで
3:31 PM
wasmがないころからあったプロジェクトだから
3:31 PM
wasm object formatではない ELF や Mach から JSに持っていく機能があると思うんだけどなあ
3:33 PM
こまったなあ
Avatar
僕もいろいろやってみる
Avatar
@omochimetaru なんかググりのキーワードありませんか
3:36 PM
学びたい
Avatar
キーワードはもう出てる限りだと思う
Avatar
ヒィン
Avatar
バイナリと実行ファイルのしくみについての知識が不足してそう
Avatar
してる
Avatar
急がば回れ感
Avatar
そうね
Avatar
少なくとも現時点で「こうやるとできる」ってテキストは見当たらないから
3:46 PM
なんとも
Avatar
$ swiftc -emit-ir -Xcc --target=wasm32 first.swift -o first.ll
Avatar
↑それだと昨日のfatalErrorのとこに行きそう
4:34 AM
多分clangがSIGABRTで死んだ
4:34 AM
darwinが云々いわれているの、これLinuxで同じコマンド叩いたらしれっと通ったりしないかしら、というのを考えている
Avatar
<unknown>:0: note: No available targets are compatible with this triple.
4:35 AM
死亡メッセージこれだね
Avatar
でも、本当に存在しないやつとはエラーが違うのでなにかありそう $ swiftc -emit-ir -Xcc --target=wasm32aaa first.swift -o first.ll <unknown>:0: warning: argument unused during compilation: '-mmacosx-version-min=10.9.0' <unknown>:0: error: -fobjc-arc is not supported on platforms using the legacy runtime <unknown>:0: error: unknown target triple 'wasm32aaa', please use -triple or -arch <unknown>:0: error: clang importer creation failed
Avatar
5 swift 0x000000010f02cfe7 swift::performFrontend(llvm::ArrayRef<char const>, char const, void, swift::FrontendObserver)::$_0::invoke(void*, std::1::basic_string<char, std::1::char_traits<char>, std::1::allocator<char> > const&, bool) + 551
4:36 AM
clangじゃなくてswiftcだと思うよ
Avatar
swiftcか
Avatar
clangの関数とかも使って作ってるから
4:37 AM
clangっぽい関数も出てくる。
4:37 AM
エラーメッセージでswiftのソース検索すれば多分デル
4:37 AM
ていうか普通に swift::performFrontend じゃないかな
4:39 AM
さっきのメッセージはここからllvm内部から戻ってきてそう
Avatar
DockerでUbuntuたててその中でやってみたけどやっぱSIGABRT
4:58 AM
Darwinとか言われなくなったけど多分Macでやったのと同じ話だとおもう
4:59 AM
お仕事もどります 🙃
Avatar
error: <unknown>:0:0: in function _T01b3addS2i_SitF i64 (i64, i64): WebAssembly doesn't support non-C calling conventions
7:30 AM
define hidden swiftcc i64 @_T01b3addS2i_SitF(i64, i64) #0 { entry: %2 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %0, i64 %1) %3 = extractvalue { i64, i1 } %2, 0 %4 = extractvalue { i64, i1 } %2, 1 br i1 %4, label %6, label %5 ; <label>:5: ; preds = %entry ret i64 %3 ; <label>:6: ; preds = %entry call void @llvm.trap() unreachable }
7:31 AM
Swiftのトップレベル関数は swiftcc ってコンベンションになってて、 llc の wasm モードがそれをサポートしてないからダメっぽい
7:36 AM
LLVM自体は swiftcc のサポートがバックポートされてるっぽくて
Avatar
おー
Avatar
CallingConv::Swift で調べると lib/Target/X86とか lib/Target/ARMに
7:37 AM
CallingConv::Swift の分岐がある
7:37 AM
でも lib/Target/WebAssembly には無い
7:37 AM
これが一つの壁っぽい
Avatar
これ誰の進化が必要なんだ
Avatar
LLVMのwasmターゲットがswiftccをサポートする必要がある
7:39 AM
LLVMのIRまではswiftccがサポートされてるけどwasm仮想CPU向けが無いってこと
Avatar
LLVM側かあ
Avatar
wasmの関数呼び出しについて調べて、swiftcc周りのx86とarm周りの勉強をすれば
7:40 AM
ちょっと進むね。
Avatar
けわしー❗
7:40 AM
けど興味あり
Avatar
険しいけどちょっとおもしろそうだからいろいろ調べてみようかな
Avatar
本家LLVMとSwiftのLLVMがどのくらい乖離してるのか見てるんだけど
10:17 AM
git show-branch llvm/master origin/swift-4.1-branch .... + [origin/swift-4.1-branch~577] Canonicalize the spelling of RefDie (NFC) + [origin/swift-4.1-branch~578] dsymutil: strip unused types from imported DW_TAG_modules + [origin/swift-4.1-branch~579] Debug Info: Don't strip clang module skeleton CUs. ++ [llvm/master~5237] Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first.
10:18 AM
本家のmasterの5200コミット前と swift-4.1-branchの580コミット前に共通のコミットがあってそこからわかれてる、つまり5700コミットぐらい乖離している・・・?
Avatar
おもしろ
Avatar
commit 18e8f9ef0645b15c777547d8655a17a315b0815d Author: NAKAMURA Takumi <geek4civic@gmail.com> Date: Wed Jul 19 11:27:31 2017 +0000 Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first. The builder clang-x86_64-linux-selfhost-modules-2 complains. Investigating. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308439 91177308-0d34-0410-b5e6-96231b3b80d8
10:21 AM
その共通のコミットが2017年6月なんだけど
10:21 AM
半年間ぐらいSwift側の成果が本家に戻ってないってこと・・・?見方があってるのかよくわからない
10:26 AM
あ〜〜〜〜
10:26 AM
Swiftの方のLLVMだと、最近のWASM対応が入って無くて、 llc b.ll -march=wasm32 -filetype=asm -o b.s llc: error: invalid target 'wasm32'.
Avatar
xcrun clang で動くclangは-target=wasm32使えたけどそういうもん?
Avatar
llcはllvmのツールで
10:29 AM
clangはまた別管理だから
Avatar
ふむ
Avatar
それはあれだよね、C言語を .ll にするときに、ターゲットをwasm32にできるってことよね
Avatar
そそ
10:30 AM
Cはできた。
Avatar
その続きっていける?
Avatar
emscripten?
Avatar
clang: a.c => a.ll ( この続きは何を使う? ) (edited)
Avatar
10:31 AM
できたって言ったのは .llじゃなくて .bc 吐くのだった
10:31 AM
xcrun clang -emit-llvm hoge.c -o hoge.bc
10:32 AM
.ll 吐いてその先は試してない
Avatar
bcとllは同じもののバイナリとアスキー版じゃないんかな
Avatar
そうなん?
Avatar
bitcodeファイルはllvm-disコマンドでテキストのLLVM IRとして出力することができます。
Avatar
へー
Avatar
disってことは逆かな アスキーのIRが バイナリのbcになるんかな
Avatar
なんとなく中間表現→ビットコードのイメージだった
10:34 AM
llvm-as is the LLVM assembler. It reads a file containing human-readable LLVM assembly language, translates it to LLVM bitcode, and writes the result into a file or to standard output.
10:34 AM
If the input is a file that ends with .ll, then the output file is of the same name, except that the suffix is changed to .bc.
10:34 AM
llvm-as で .ll が .bc になると
10:35 AM
で、llcで .ll または .bc がネイティブアセンブリ (.s) になりますよと
10:37 AM
で、wasm32な .s を吐ければ、あとは Wasmのツールの管轄
10:38 AM
Cから生成された .ll であれば llc で .s にできるけど、 swiftから生成された .ll は、 .ll の中で swiftcc などのSwift仕様が含まれていて、 llc が通らない。
10:38 AM
ってのがここまでの流れ。
Avatar
llcをどうにかする方法を模索する流れ?
Avatar
実装するしかないんじゃあないかなあ
Avatar
おおごとになってきた
Avatar
swiftc -emit-ir b.swift -o b.ll llc b.ll -o b.s libs=/Users/omochi/work/swift-source/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx gcc -L$libs b.s -o b.out LD_LIBRARY_PATH=$libs ./b.out
2:09 PM
↑そもそも通常のswiftの場合で実行までの手順を調べた
2:11 PM
$ cat b.swift print("hello swift")
2:12 PM
printだけじゃなくて、 _swift_retain とかも外部リンクされているので
2:14 PM
wasmに乗っける時に持ってこないといけないんだけどそこらへんもやり方が謎
Avatar
-static-stdlib の挙動について調べたけど、 /usr/bin/ld に -force_load_swift_libs を渡すようになっているだけで、
2:52 PM
/usr/bin/ld についてはオープンソースになってないから、何もわからんという結論になった
3:50 PM
llvmの引数属性として Swiftの self 用とか Swift の error 用とか足してある
Avatar
upstream-with-swiftっていうブランチがあるけど、CIは通ってないぽい。 https://ci.swift.org/view/swift-master-next/
Avatar
Kotlin/Nativeはwasmを正式にサポートしているのね
Avatar
昨日 LLVMの lib/Target をリーディングしてみたけど
1:49 AM
CPUに関する広くて深い知識が無いと何がなんだかわからん、ってなった
Avatar
KotlinNativeがwasmサポートしたのごくごく最近だった。
7:03 AM
We’re happy to announce the release of Kotlin/Native v0.4, KotlinConf 2017 edition! This release adds support for accessing Objective-C APIs on iOS and macOS, WebAssembly target platform, as well as introduces major changes making app development in Kotlin/Native way easier. Platform … Continue reading →
7:04 AM
SwiftがどうにもならないとしたらKotlinでWebフロント開発のほうで遊んでようかな
Avatar
KotlinNativeでwasm、 $ kotlinc -target wasm32 hello.kthello.wasm が直接吐かれて超楽っぽい。
6:22 AM
emscriptenいらずかも
Avatar
omochimetaru 12/4/2017 6:32 AM
よいね
6:33 AM
メモリ管理ってどうなってる?
Avatar
どうなってるとは
Avatar
omochimetaru 12/4/2017 6:33 AM
Kotlin/Nativeってことだから、参照カウント方式だったと思うんだけど
6:33 AM
弱参照作れるの?
Avatar
まだKotlinハローワールドしかしてないので答えを持っていない
6:33 AM
やっていく
Avatar
omochimetaru 12/4/2017 6:36 AM
想像なんだけど今は弱参照作れなくて循環参照で無限メモリリークだったりしない?
Avatar
うーん
Avatar
omochimetaru 12/4/2017 6:40 AM
Kotlin/Native uses automated memory management, currntly based on automated reference counting with cycle collector. See here for details: https://github.com/JetBrains/kotlin-native/blob/master/runtime/src/main/cpp/Memory.cpp
kotlin-native - Kotlin/Native infrastructure
6:40 AM
Will Kotlin native be garbage collected or managed manually like C, Rust, etc?
6:40 AM
まじかよサイクルコレクター入ってた
Avatar
サイクルコレクターって何ですか
Avatar
omochimetaru 12/4/2017 6:41 AM
循環参照があってもメモリ解放してくれる機構のことです。
6:41 AM
pythonとphpに入ってるよ。
Avatar
へえ
Avatar
omochimetaru 12/4/2017 6:41 AM
あ、それの、参照カウンタ方式のときに使うアルゴリズムのことね。
6:41 AM
普通のmark-sweep等のTrace GCなら循環の解放は当たり前なので。
6:43 AM
循環参照の問題が無いから特に何も書かれてないのか かっこいい
Avatar
omochimetaru 3/10/2018 2:45 PM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
2:45 PM
swift-wasmに進捗があったみたい
2:46 PM
The calling conventions are mostly for the backends, so it should be possible to just ignore it. That is, if swift didn't emit it, it should be ok, and for now you can strip it from the IR manually for testing. (There are exceptions like tail call optimizations that are done on IR and depend on the convention, but I don't think that would be an issue here.)
2:47 PM
swiftccコーリングコンベンションは普通に無視すればいいよってkripkenさんが言っていて、そのあと他の人が進捗してる
Avatar
そのスレの最後にもあるし、さっきTwitterにも書いたけど
Avatar
omochimetaru 3/10/2018 2:49 PM
お?
Avatar
swift-llvmがLLVM 6.0に追従したようなのでちょっと楽になるのかな https://github.com/apple/swift-llvm/pull/80 (edited)
2:50 PM
WebAssembly backendがSwift付属のLLVMに含まれることになりそうということで。
Avatar
omochimetaru 3/10/2018 2:50 PM
あ、なるほど
Avatar
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swi...
3:02 AM
Swift for WASM スレで、定期的に誰かしら「なんか進捗あった?」って書き込まれるんだけど
3:03 AM
今回はなんかでかめの進捗が報告されてる
3:04 AM
stdlibのビルドはほぼできたらしくて
3:04 AM
バイナリのリンクとかdylibの取り回しの方をWASM環境に適用するのに手こずってるらしい
3:04 AM
めっちゃ大変そう > Unfortunately, a build system used within Swift compiler infrastructure is not very modular, it uses a mix of shell scripts, Python scripts and CMake.
Avatar
This adds an extension point so the ABI can declare whether or not it supports the swift calling convention. Open to suggestions if you think this doesn't belong here (or is flat out the wrong ...
2:25 AM
いつぞやのwasm対応でswiftcc切るやつ、ジョンマッコールに、「ちゃんとやりなさい」ってリジェクトされてて笑った
Avatar
omochimetaru 4/10/2019 1:25 AM
@daniel_dunbar Are you still working on Swift WebAssembly exploration? (SR-9307, https://t.co/u88AVpVn2M hasn't seen activity since January) I'm also trying to get Wasm working (trying to integrate either Emscripten or WASI as the runtime) and would like to know how I can ...
1:26 AM
新たなWASM進めるマンが来た!(ダニエルさんは作業止まってたらしい)
Avatar
omochimetaru 5/10/2019 7:56 PM
おお!?
7:57 PM
Website for the SwiftWasm project. Contribute to swiftwasm/swiftwasm.org development by creating an account on GitHub.
7:57 PM
zhuoweiさんが主にやってるっぽいな
7:58 PM
What&#39;s in this pull request? This pull request adds initial support for compiling Swift code to WebAssembly. &quot;Hello world&quot; works, and a large subset of the stdlib already ...
Avatar
https://forums.swift.org/t/wasm-support/16087/17 正しく意図が読み取れてるか自信がないので相談させてください。
If there's the equivalent of an import table or GOT, it might still be interesting to have something like RelativeIndirectablePointer, but with an absolute address, to still be able to avoid up-front load time costs for cold metadata structures.
これってGOTがあるなら絶対アドレスにしなくてもロード時間は減らせるよね?っていうことですかね。
Avatar
omochimetaru 2/20/2020 7:41 AM
もしインポートテーブル(Windowsのやつ?)かGOT(Linuxのやつ)と同じものがWASMにもあるなら、 RelativeIndirectablePointerを採用することは意味があるだろう(be iteresting) もし(それがあるのに(but))絶対アドレスを使うのであれば、 コールドメタデータの起動時のロード時間を減らす事がそれについても(still be able)できる
7:41 AM
と読んだ。
7:42 AM
起動時じゃないかもな、(up-front)
Avatar
なるほど
Avatar
omochimetaru 2/20/2020 7:43 AM
RelativePointerを使ってれば、内部のRelative差分についてはGOTのエントリが減るわけだから、GOTの書き換えコストがカットできるって話かと思った。
7:43 AM
RelativeIndirectablePointerは、基準となるシンボル(GOTエントリ)からの相対オフセットでアドレスを表すから、リンクするのは基準シンボルだけだけど、 絶対ポインタを使ったらそういう隠蔽が効かなくなって何もかもGOTエントリに載ってくる (edited)
Avatar
RelativePointerを使わない場合でもwasm上では内部のシンボル参照にGOTは必要なくて、静的にリンクするときに全部解決されるはず。
7:48 AM
あと、GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
omochimetaru 2/20/2020 7:48 AM
うん、俺もそう思ってて、WASM実行プロセスにGOT自体存在していないのでは?
7:49 AM
WASMファイルを動的に追加で読み込んだ場合って、JavaScript経由で関数取り出してガチャガチャとバインディングするしかないよね?
7:50 AM
RelativeIndirectablePointerで指し示す対象はシンボルの公開をしないでおけて載らないんじゃないかしら? > GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
GOTはLLVMがそれっぽく見せかけるために静的なテーブルを用意してくれますが、動的にリンクしたりするのは出来ないです。
Avatar
omochimetaru 2/20/2020 8:01 AM
通常の関数呼び出しはそれ経由になってるの?
Avatar
1つのオブジェクトファイルにまとまってないやつはそうなるはずです
8:04 AM
リンカが関数テーブルを作ってくれて再配置可能wasmモジュール間の関数参照を解決してくれます
Avatar
omochimetaru 2/20/2020 8:05 AM
あ〜オブジェクトファイル境界がそう効いてくるのか。
Avatar
なので、返信としては相対絶対に関わらずGOTを経由するケースはあるのでIndirectPointerを使う必要はある、ですかね。
Avatar
omochimetaru 2/20/2020 8:10 AM
オブジェクトファイルって .o 単位の事?
Avatar
そうです
Avatar
omochimetaru 2/20/2020 8:11 AM
.o ごとにGOTがあるの? .dylibごとかと思ってた
Avatar
うーん、あれれ。たしかにリンク時にテキストセクションを参照先のアドレスに書き換えれば良いからGOT経由しない気がしてきた
Avatar
omochimetaru 2/20/2020 8:15 AM
そうそう。
8:15 AM
でdylibごとだとするとwasmの場合全部静的リンクされてるから
8:15 AM
たとえGOTがあったとしても誰も使わないのではと思って。
Avatar
そうそう、それ朝思ったんだ。朝の時点では「本来GOTを経由する必要は無いので、RelIndirectPterって本当に必要が考える必要あるよね(interesting) 」だと思ってたんだ (edited)
Avatar
omochimetaru 2/20/2020 8:18 AM
あ、but以下読み違えてたかも
8:20 AM
絶対アドレスを使えば静的メタデータの読み込み時間は回避できるよね(関節化が無くて速いから) か?
8:21 AM
avoid up-front load time costs がよくわからないな〜
Avatar
butの前後関係がイマイチわからんなー
Avatar
どうして静的にnon-PICなwasmファイルを構成する個別のオブジェクトファイルにGOTがあるのかわかった。コンパイラ自体はPICなコードを吐くから個別のオブジェクトファイルにGOTエントリが生成されるけど、リンカはnon-PICなコードを吐きたいのでそれを静的なGOTとしてwasmに埋め込むんだ。
Avatar
リンカはnon-PICなコードを吐きたいので
ここの「ので」がわからなかったので、詳しく知りたい
11:02 AM
位置独立コードからデータを参照する場合はさらに間接的な方式となり、そのコードがアクセスする全グローバル変数のアドレスを格納したGOT (Global Offset Table) を使用する。コンパイル単位またはオブジェクトモジュールごとにGOTがあり、コードから見て固定の相対位置に置かれる(ただし、ライブラリをリンクするまで実際のオフセットは不明である)。リンカがモジュール群をリンクして共有ライブラリを作る場合、各モジュールのGOTをマージし、最終的なコードとのオフセット値を設定する。
https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89
11:03 AM
↑とりあえず、オブジェクトファイルごとにGOTはあって、静的リンクするときにマージされていくものらしい (edited)
Avatar
のでの意味
これは単にwasm-ldのデフォルトの挙動としてnon-PICなコードを吐く、という意味でした。一応PICとして吐くこともできるんですけど、その場合はEmscriptenのABI unstableなdynamic loaderの仕様に載っかることになるので一般的ではないです。
Avatar
単にコンパイラがオブジェクトファイルを生成する時にはPIE対応してGOTを含めているのがリンク後も残っているという話?
Avatar
そんな感じです。
11:32 AM
リンカの中で分岐があって、静的にGOTを作る場合とdynamic loaderであとからリンクする場合があります。 https://github.com/llvm/llvm-project/blob/c8f9e526bc5319f2d0beed4012fbf17b11e15161/lld/wasm/Relocations.cpp#L47-L59
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
ふむふむ
Avatar
技術的内容は理解していないのですが、英語としてはこの"but"は「ではなく」くらいの意味じゃないかな。「GOT的なものがあるので有れば、絶対アドレスではなく、Relative..Pointer的なもの持つことをを検討する価値があるかも知れない」。
Avatar
おお、そうすると頓珍漢な回答をしてしまったかもしれない…
12:28 PM
ありがとうございます
Avatar
んーわからん。英語わからないのでリフレーズしてください、が確実か?
Avatar
そうですねー、適当なこと書くよりそれが確実ですね
Avatar
https://forums.swift.org/t/wasm-support/16087/19 だいぶ前提が共有されたみたいで話が前進しました
Well, if all wasm code is eventually linked into one object file for deployment, then there shouldn't ever strictly be a need for a GOT (though Swift or LLVM may end up incidentally generating entries because it assumes a symbol might come from a dynamic library in many cases)...
😊 1
Avatar
omochimetaru 2/20/2020 4:53 PM
結局IRGen飛び越えてLLVM内部の方に行くのね
Avatar
このスレッドの文脈でKeyPathの呼び出し規約が通常のswiftccから逸脱しているのでは?ということを質問してみました。 https://twitter.com/omochimetaru/status/1232538643731927041?s=20 (edited)
@kateinoigakukun あ〜そっか、サンクの仕様までを固定しておけば、本当のプロパティのgetter自体のABI仕様は露出しないのか。それはありそう。
11:34 PM
@Joe_Groff Hi! While I was fixing the rest of failing test suites, I found that another issue for ABI. As described here, Swift ABI allows using non-generic function as generic function directly. On WebAssembly runtime, this ABI causes signature mismatch between callee and...
11:37 PM
具体的にはindicesの有無とジェネリックコンテキストの有無がオプショナルになっている部分です。
11:39 PM
さっき回答が来て、それを見るにこの呼び出し規約は多分KeyPath特有で、これのせいでKeyPathのインライン化も面倒なことになっているらしい https://forums.swift.org/t/wasm-support/16087/23
Regarding key paths, their weird calling convention is also an issue for optimization, so we may introduce a SIL convention for key path accessors, which would be another marker you could use to lower them to a consistent LLVM function type for wasm:
Avatar
omochimetaru 2/27/2020 2:07 AM
so we may introduce a SIL convention for key path accessors, which would be another marker
2:07 AM
これって、新しいSIL conventionを新たに追加して、KeyPathアクセサにそれを設定するようにしようと思っていて、
2:07 AM
そうすれば、KeyPathアクセサのところにWASM対応を仕込まなくても、
2:08 AM
このSIL convensionがついてる関数の呼び出しのところにWASM対応を入れるようにすることで
2:08 AM
今後同種の呼び出しが追加されたときもうまく動くようにできるって意味かと思った。
2:08 AM
conventionってcalling conventionの事なのかなと。
Avatar
同じように解釈しました
Avatar
omochimetaru 2/27/2020 2:23 AM
あい。このマーカーが付くまでのことに関しては、KeyPathアクセサしか存在しないと。
2:23 AM
Swift ABIの文書でのくだりだと、細かい調整以外は原則Cコンベンションと同じだって気当てあって
2:23 AM
Cコンベンション自体が原則、末尾引数の無視が可能だから
2:24 AM
なんか厳密なロジックだとあらゆる場面で無視されうる気はする。
Avatar
あー、たしかにそんなこと書かれてた気がするなぁ
Avatar
omochimetaru 2/27/2020 2:24 AM
swiftselfとかswifterrorに関しても
2:24 AM
専用のレジスタを割り当ててオプショナルにすれば性能が出せるけど
2:25 AM
最悪それがなくても、ベースのコンベンションがCで可変だから、そこの仕組みで無視したら良いしね、みたいな
2:25 AM
触れられ方をしている。
2:25 AM
まあ、どうせ無理だしスルーが良いと思うけど
2:25 AM
規格としてもう禁止してほしいよな。
Avatar
ですねー
2:26 AM
逆にclangとかのCのwasmローワリングはどうなってるんだろう
Avatar
omochimetaru 2/27/2020 2:27 AM
たしか〜に
2:27 AM
Cでコレがダイレクトに効いてくるのが確か
2:27 AM
Cの可変長引数として実装した関数を
2:27 AM
固定引数の関数として呼び出しても動くっていうのじゃなかったっけ
2:28 AM
あれ、逆かな?
Avatar
そのへんちゃんと調べたこと無いなぁ
Avatar
omochimetaru 2/27/2020 2:28 AM
てか、printfとかどうなってんだろうね。
Avatar
ちょうどva_listのテストケース壊れてるんで調べてみます
Avatar
omochimetaru 2/27/2020 2:29 AM
format文字列とパラメータ数が不一致の場合、引数のclaimができないはず
Avatar
↑のClangのWebAssemblyローアリングパス調べてみたんですけど、シグネチャが一致してない関数呼び出しに対して、新しくその呼び出し専用の関数を作って置換してました。
4:16 AM
ただこれができるのはcalleeが特定できるダイレクトな関数呼び出しでないといけないのでSwiftの場合は同じ要領ではできなかったです。
Avatar
omochimetaru 3/12/2020 4:16 AM
じゃあ動的な関数ポインタ経由だったらダメなのか。
Avatar
です
Avatar
omochimetaru 3/12/2020 4:17 AM
壊れてるやん。
Avatar
変換用のPassがあって、それ読む限り関数ポインタまで追っかけてないように見えるんですよね https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:18 AM
まあ動的にやってたらわからんしね。
4:19 AM
そうかあ。そういうこともあるんだなあ。
Avatar
こっちのPassで関数同士のbitcastに対してサンクを挟んでるのでそれで実は動くのかもしれない https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:20 AM
いずれにしても uintptr_t とかタグポインタとか挟んで取り回してたら検出できないっしょ。
Avatar
そうですねー。
Avatar
omochimetaru 3/12/2020 4:22 AM
まあやっぱ本質的には互換を取る方法は無いってことなんだな。
4:22 AM
いろいろな前提条件の範囲でごまかすしかない
Avatar
そうなんですよ。高級ゆえの制限が既存アーキテクチャよりめちゃくちゃ多い
Avatar
wasm向けツールチェーンの配布をはじめました。swiftenvで入れられるので良かったら試してみてください。 https://twitter.com/kateinoigakukun/status/1240070796321492992?s=20
自動で毎日UTC 00:00に最新のSwift for WASMツールチェーンを配布するようにしました https://t.co/ZAi1ggJfDe
👏 1
Avatar
omochimetaru 3/18/2020 9:09 AM
swiftenvを使わずにxcodeのツールチェーン切り替えではできないの?
Avatar
~/Library/Developer/Toolchains に手でインストールすればXcodeからも切り替えられます
9:12 AM
インストーラは署名しないといけなかったり面倒だったのでまだ作ってないです。
Avatar
omochimetaru 3/18/2020 9:13 AM
あー、インストーラってそうなのか。 でもswiftenv入れるよりはハードル低いと思った
Avatar
なるほど
9:13 AM
時間あるときに用意してみます
🙂 1
Avatar
SwiftでWebアプリ開発のPoCを作ってみました https://twitter.com/swiftwasm/status/1247797285016055809?s=20
Things are progressing really well here at SwiftWasm! With JavaScript/DOM bindings and SwiftPM more or less working, @kateinoigakukun created a simple Conway’s Game of Life demo here: (wait for it to load, binary size is still something we’re working on) https://t.co/mIDYmV...
🤩 1
8:21 AM
ローカルで動かす分には全く気にならなかったんですが、インターネットを介すと無視できないダウンロード時間がかかります
Avatar
Kishikawa Katsumi 4/8/2020 8:24 AM
おお、すごい。 めっちゃすぐ動いたよ
Avatar
omochimetaru 4/8/2020 8:26 AM
いま買い物に出てるけど4G回線で一瞬だった
Avatar
うち今WFH勢で回線逼迫していて20秒くらいかかった
Avatar
omochimetaru 4/8/2020 8:27 AM
ww
Avatar
うちもキャッシュないと20秒くらいかかるんですよねー
8:28 AM
ちなみに一瞬だった勢は下りどのくらい出てますか?
Avatar
omochimetaru 4/8/2020 8:29 AM
Avatar
Kishikawa Katsumi 4/8/2020 8:30 AM
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
8:30 AM
そんな速くないよ。
Avatar
うーん何でそんなに差が出るんだろう… https://fast.com/ja/share/90Mbps.html
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
Avatar
Kishikawa Katsumi 4/8/2020 8:33 AM
ほとんど一緒や
8:34 AM
ChromeとSafariのプライベートセッションで試してみたけどやっぱりすぐだったよ。計測したわけじゃないけど2、3秒もかかってないと思う。20秒は絶対かかってない。
8:36 AM
WebAssenblyは演算した結果を見せようと思ったらJSのブリッジが必要になってCanvasとかDOMを使って表示する、ということですか?
Avatar
そうですー
Avatar
Kishikawa Katsumi 4/8/2020 8:40 AM
なるほど。じゃあ描画がボトルネックのものをなんとかするものじゃないんですね。 SwiftとWebでいわゆるビジネスロジックが共通化できる、というのは明確な利点か。
Avatar
omochimetaru 4/8/2020 8:42 AM
高速化にも期待したいですね 書きやすいRustのポジション
Avatar
Kishikawa Katsumi 4/8/2020 8:44 AM
実際、今のJSとRust、Swiftで速度差ってかなり違うんですか?
8:45 AM
今のJSは普通に速い印象。
Avatar
ちゃんと計測したことないですね、
Avatar
omochimetaru 4/8/2020 8:45 AM
JSとRust比べるとちょっと早いみたいな事をgfxさんが以前言っていたような
Avatar
ほー
Avatar
omochimetaru 4/8/2020 8:46 AM
RustとSwiftはいい感じの比較をそもそも見たことがない
8:46 AM
使う領域が重なってないから実験する人が居ない・・・
8:47 AM
ただJSのJITとWASMランタイムに歴史の差があるからJSが結構速いって感じらしい
Avatar
Kishikawa Katsumi 4/8/2020 8:48 AM
まあRust、Swiftの比較は重要じゃないと思います。JSと「Rust、Swift」でそこまで違いがあるかどうか、ですね。
Avatar
前にChromiumのWASMランタイムちょっと読んだときは未だあんまり積極的なJIT最適化は無かったですね
8:52 AM
ネイティブバイナリに近いパフォーマンスを実現するっていうのがwasmのウリなので気合い入れてるとは思うんですけどね
Avatar
omochimetaru 4/8/2020 8:55 AM
スマホでは5秒ぐらいだった 多分初見の時にボタンの意味とか考えてた
8:55 AM
これ緑の初期状態が出るまでがロード時間か。
8:56 AM
8:56 AM
macだと1秒ぐらい。
Avatar
Kishikawa Katsumi 4/8/2020 8:56 AM
インターネットの速度がめっちゃ速い
Avatar
めっちゃ速い
Avatar
omochimetaru 4/8/2020 8:58 AM
有線のゲーミングマシンならもっと速いで😏
Avatar
バイナリサイズはRustとかGoでも問題になってるんですけど、標準のモジュールの粒度が非常に小さいので一応どうにかなってるんですよねー
Avatar
omochimetaru 4/8/2020 9:01 AM
家庭くんが留学して解決してくれるんでしょ。
Avatar
GSoC採択されなかったとしても個人でやると思いますけどねw
Avatar
omochimetaru 4/8/2020 9:03 AM
留学のほうがオマケだった
9:06 AM
GSocのテーマそのままクラウドファンディングにしてiMacPro調達しようぜ
😎 1
Avatar
4秒ぐらいで見れますね (ただ netlify はCDNに乗ってないとでかいファイルが極端に遅くなるので、あんまり見られてない地域からとかだと遅くなるかも?)
🧐 1
Avatar
iWork for iCloud 10.0では、C++/ObjCで書かれWebAssemblyとして取り出された機能を含む様になったらしい。 https://twitter.com/lrz/status/1250453967957561344 (edited)
What have I been working on lately? Just a few days ago, iWork 10.0 shipped with iCloud apps that now include features extracted from the native codebase (C++/ObjC), using WebAssembly!
Likes
293
Avatar
omochimetaru 4/16/2020 1:49 AM
アップル自身が既存コードのWASMポートを運用してるのか〜
Avatar
やっとwasm向けFoundationのビルドが通るようになりました https://github.com/swiftwasm/swift/pull/1000
Bits of the dependency installation scripts were refactored to make the local development a bit easier. Overall, Foundation is not fully working yet due to the OOB bug, and to link with it you need...
🎉 10
3:49 AM
まだほとんど動かないですが…w
3:50 AM
リンクするとバイナリサイズは11MBから26MBにガッツリ太りました。 (edited)
Avatar
誰かがやるだろう思っていた SwiftWebUIのwasm移植を@CarsonKatriさんが始めたみたいです。 @State周りもちゃんと動いていて凄い https://twitter.com/kateinoigakukun/status/1268065986294378502?s=20
PoC of SwiftWebUI using SwiftWasm was published! https://t.co/SjWSQdi7w8
👀 1
6:31 AM
6:32 AM
SwiftUI with support for WebAssembly. Contribute to carson-katri/SwiftWebUI development by creating an account on GitHub.
6:32 AM
シュッと試すためのスクリプトもREADMEに用意されていたので手元で動かしてみると楽しいと思います。 (edited)
Avatar
omochimetaru 6/3/2020 6:33 AM
おお・・・
Avatar
omochimetaru 10/6/2020 1:20 PM
The SwiftWasm book to get you started. Contribute to swiftwasm/swiftwasm-book development by creating an account on GitHub.
1:20 PM
読んでる
Avatar
1:20 PM
昨日ちょっと書き足した
Avatar
omochimetaru 10/6/2020 1:21 PM
配布してるツールチェインはxctoolchainではないんだね
Avatar
あー、とりあえずtarballで配布してます
1:22 PM
xctoolchainだとなんか違うのかな
Avatar
omochimetaru 10/6/2020 1:22 PM
Xcodeから切り替えられるから安心感があった
1:22 PM
swiftenvを入れたくないので。
Avatar
あー、なるほど
Avatar
omochimetaru 10/6/2020 1:22 PM
自分で入れるとするとどこに置こうかなと迷う 迷うだけだけど
Avatar
swiftenv最近僕も微妙だと思い始めてきたのでちゃんとやろうかな
Avatar
omochimetaru 10/6/2020 1:23 PM
とりあえず $HOME/swift でも作ろっと
Avatar
ツールチェーンによってあったりなかったりするコマンドがあって、shimsが頻繁に壊れて事故る
Avatar
omochimetaru 10/6/2020 1:24 PM
1:25 PM
xctoolchainだと
1:25 PM
export TOOLCHAINS="org.swift.51220191107a" で
1:26 PM
swift自体が自力で切り替わってくれるようになるけど
1:26 PM
この形態の場合はこういう切り替える方法はあるんだろうか
1:26 PM
それともPATHで直接参照させるだけ?
Avatar
PATHの優先度変えるだけで良いと思います
1:27 PM
付随してるライブラリとかはswiftcからの相対パスで決まるので
Avatar
omochimetaru 10/6/2020 1:27 PM
PATHだけいじって $ swift が切り替わってれば他はいろいろと連動するはずってことね、OK
1:30 PM
げ!
1:30 PM
1:30 PM
全部のコマンドに対してこれが出るぞ!
Avatar
うそーん
Avatar
omochimetaru 10/6/2020 1:30 PM
一度右クリックから実行すれば許可リスト入りするけど
1:30 PM
bin/の中の全部にやるのは大変w
Avatar
なんかそれ手元では出ないんですよね
Avatar
omochimetaru 10/6/2020 1:32 PM
誰がビルドしたか的な情報が入ってんのかな。
1:33 PM
コマンドラインで一気に浄化する方法探してる
1:34 PM
EXAMPLES To check whether Mail.app is allowed to run on the local system: spctl -a /Applications/Mail.app To allow Frobozz.app to run on the local system: spctl --add --label "My Stuff" /Applications/Frobozz.app To forbid all code obtained from the Mac App Store from running: spctl --disable --label "Mac App Store"
Avatar
じゃあ僕はちゃんと署名する方法探します
Avatar
omochimetaru 10/6/2020 1:34 PM
助かるw
Avatar
omochimetaru 10/6/2020 1:43 PM
[omochi@omochi-iMacPro bin]$ sudo spctl --add --label swiftwasm $(pwd)/swift-demangle Password: [omochi@omochi-iMacPro bin]$ ./swift-demangle Killed: 9 [omochi@omochi-iMacPro bin]$ sudo spctl -a swift-demangle swift-demangle: rejected (the code is valid but does not seem to be an app)
1:43 PM
できそうでできないなあ
1:43 PM
--master-disable でセキュリティ全解除する情報ばっかり出てくる
Avatar
それは嫌だなぁ
Avatar
omochimetaru 10/6/2020 1:45 PM
I have a "command line tool" target (not an App bundle) in Xcode that is being blocked by Gatekeeper. I've used this tool for years as a simple installer for my PostCheck Address Book plugin. In 2...
1:45 PM
The solution is to distribute the command line tool on a signed disk image rather than in a zip file.
Avatar
100正しい
Avatar
omochimetaru 10/6/2020 1:46 PM
なんかspctlでコントロールできるのは .app だけな雰囲気がある
1:46 PM
the code is valid but does not seem to be an app
Avatar
うーんこれは誰の証明書でサインしたら良いんだ
1:50 PM
Apple Developer AccountはOSS Organizationみたいな括りは無いんだよな
Avatar
omochimetaru 10/6/2020 1:52 PM
CIで作ってるなら、誰かの秘密鍵をCIに設置しないといけないね・・・
1:55 PM
うおーだめだわからん、Finderで右クリックした時相当のspctlの叩き方が不明。
Avatar
それこそ手元で署名したら良いんじゃないですか?
Avatar
omochimetaru 10/6/2020 1:57 PM
再署名ってできるんかな
Avatar
再署名できるはず。XVimとか入れるのにXcode再署名したことがあるきがする
Avatar
omochimetaru 10/6/2020 1:58 PM
なるほど
Avatar
というか今回はもともと署名されてないから。。。 (edited)
Avatar
omochimetaru 10/6/2020 1:58 PM
実行ファイル単体って
1:58 PM
どこに署名がうまるんだ?
Avatar
objdumpするとinfo_plistなるセクションが出てくるからMachOバイナリとして埋まってるんじゃないですかね (edited)
Avatar
omochimetaru 10/6/2020 2:00 PM
なるほど。
Avatar
いや、よくわからんな… これ
Avatar
omochimetaru 10/6/2020 2:04 PM
iPhoneだけで、Mac developerのidentifier入ってなかった。また明日・・・
Avatar
なるほど
Avatar
omochimetaru 10/6/2020 2:06 PM
swift-demangleが通らなくてもswift demangleは通ったから(swift-frontend)は右クリック済み (edited)
2:06 PM
もしかしたら困ったら手動で右クリックしてればそんなに困らないかも
Avatar
なるほど?直接発火するバイナリさえ浄化されていればOK?
Avatar
omochimetaru 10/6/2020 2:07 PM
そうっぽい
Avatar
でも普通にbrewとかで入れたバイナリって署名されてないけどワーニングでないですよね。
2:09 PM
何が違うんだろう
Avatar
omochimetaru 10/6/2020 2:14 PM
たしかに・・・
2:15 PM
Safariでダウンロードすると
2:15 PM
危険マークが付く?
Avatar
そうかなと思ってさっき試してみたんですけど出ないんですよね
Avatar
omochimetaru 10/6/2020 2:19 PM
/usr/local は聖域?
2:21 PM
chromeで落としたけど駄目だった
2:22 PM
safariで落とした時に許可したやつはいけた。
2:22 PM
バイナリのハッシュ?に対して許可登録してるっぽいな。
Avatar
TN2206: Intermediate to expert level overview of macOS code signing that details specific options and gotchas
2:22 PM
読み始めた
Avatar
omochimetaru 10/6/2020 2:23 PM
思ったけど、もしかしてhomebrewは
2:23 PM
homebrew側でなんかやってんのかもね最後に。
Avatar
いや、やってないです
Avatar
omochimetaru 10/6/2020 2:23 PM
そうなのか
Avatar
brewで入れたgdbは自前で署名しないとプロセスアタッチの権限が無くて使えなかった記憶がある
Avatar
omochimetaru 10/6/2020 2:24 PM
ふむ
Avatar
$ codesign -dvvv /usr/local/bin/swiftlint /usr/local/bin/swiftlint: code object is not signed at all
Avatar
omochimetaru 10/6/2020 2:24 PM
Avatar
どうして俺たちのツールチェーンだけ…
Avatar
Kishikawa Katsumi 10/6/2020 2:25 PM
Notarizationは?
Avatar
omochimetaru 10/6/2020 2:27 PM
/usr/local/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin に動かしたけど駄目だなあ。 フォルダコピーするときにFinderが謎のダイアログを出して確認してきたからなんかいけそうな気がしたけど。
Avatar
Notarizationとcodesignは関連するんでしたっけ
2:29 PM
Apple's notary service requires you to adopt the following protections: Enable code-signing for all of the executables you distribute, and ensure that executables have valid code signatures, as described in Ensure a Valid Code Signature.
軽く調べただけなんですけど、Notarizationはcodesignを前提にしている? https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution
Avatar
Kishikawa Katsumi 10/6/2020 2:29 PM
それはちょっとわからないけど「開発元を〜」っていうアラートは公証があれば消えると思う。
2:30 PM
コードサインはなんでもいいんじゃないかな。
Avatar
なるほど
Avatar
Kishikawa Katsumi 10/6/2020 2:32 PM
Command Line ToolのApple公証を行う XcodeでCommand line toolを作っている場合、.appと同じ用にOrganizerから公証を行うことができません。 Terminalからコマンドを叩...
Avatar
ありがとうございます 🙏
Avatar
omochimetaru 10/6/2020 4:11 PM
右クリックで許可されたファイルであっても
4:11 PM
[omochi@omochi-iMacPro wasm]$ spctl -a /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend: rejected (the code is valid but does not seem to be an app)
4:11 PM
spctlから見るとrejectedって出てる
4:11 PM
spctlを超える何かで許可されてる・・・
4:11 PM
昨日調べたやつだ
4:12 PM
com.apple.quarantine ついてるかどうかで
4:12 PM
変わる
4:12 PM
どこにも書いてないけど
Avatar
omochimetaru 10/6/2020 4:12 PM
なんじゃそりゃ・・・
Avatar
それだけ
Avatar
なんだそれ。。
Avatar
サイニングいらない
Avatar
When I’m packaging an application for deployment, I normally download the latest version from the vendor. If it’s a drag-and-drop install, where the application is a self-contained bund…
Avatar
homebrew は自分でダウンロードしてファイル作ってるから、そのフラグがつかないから
4:13 PM
サインしてないけど、そのバイナリでも実行できる (edited)
4:13 PM
普通にブラウザやcurlでダウンロードしたりzipで解答するとそのフラグがつくから、gatekeeperが、お?なにそれちょっとまって (edited)
4:14 PM
って言ってくる
Avatar
omochimetaru 10/6/2020 4:14 PM
[omochi@omochi-iMacPro wasm]$ sil-opt Killed: 9 [omochi@omochi-iMacPro wasm]$ xattr sil-opt xattr: No such file: sil-opt [omochi@omochi-iMacPro wasm]$ which sil-opt /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/sil-opt [omochi@omochi-iMacPro wasm]$ xattr $(which sil-opt) com.apple.quarantine [omochi@omochi-iMacPro wasm]$ sudo xattr -r -d com.apple.quarantine $(which sil-opt) Password: [omochi@omochi-iMacPro wasm]$ sil-opt --version LLVM (http://llvm.org/): LLVM version 10.0.0 Optimized build. Default target: x86_64-apple-darwin19.6.0 Host CPU: skylake-avx512
4:14 PM
ほんとだ できた・・・・
Avatar
notarization はサインしたあとのはなしだから (edited)
Avatar
omochimetaru 10/6/2020 4:14 PM
spctlじゃなかったのか。。。
Avatar
サインしなきゃそもそも要求されない
4:14 PM
ちがいますね
4:14 PM
どこにも書いてないし
Avatar
omochimetaru 10/6/2020 4:14 PM
アイヤー
Avatar
Appleのドキュメントも明言してないけど
Avatar
omochimetaru 10/6/2020 4:15 PM
ありがとうございます!
Avatar
First of all: I’m one of the developers of Little Snitch, a user-friendly firewall for macOS that allows creating rules on a per-application (or per-executable) basis. We occasionally have users who run into issues because executables installed via Homebrew do not have a code...
4:15 PM
長いけどこのスレ全部読むとなんとなくわかる
4:16 PM
I think you’re mixing up a few things here. Developer ID is a program by apple that provides code signing certificates, among other things. Developer ID has nothing to do with any review process whatsoever. Notarized apps are an extension of the Developer ID program. Notariz...
4:16 PM
このへんがポイント
Avatar
omochimetaru 10/6/2020 4:16 PM
find . -perm +111 -type fxattr を組み合わせたらガッと浄化できそう。
Avatar
そんな感じ
4:17 PM
昨日めっちゃ調べた
Avatar
omochimetaru 10/6/2020 4:17 PM
奇遇ですね。
Avatar
ちょっとバイナリ配布のアレがあって
Avatar
omochimetaru 10/6/2020 4:17 PM
ww
Avatar
いまいち理解してなくて
4:17 PM
人としてまずいと思ったので。。
Avatar
omochimetaru 10/6/2020 4:18 PM
おかげで人に成れた
Avatar
xattr -r -d com.apple.quarantine ディレクトリパス でディレクトリ内一気に消せますよ
Avatar
omochimetaru 10/6/2020 4:18 PM
マジか
4:18 PM
findもいらんかった
Avatar
-r は recursive
Avatar
omochimetaru 10/6/2020 4:19 PM
removeかなと思ってスルーしてしまった なるほど。
4:19 PM
recursive deleteか
Avatar
なんでかわかんないけど、まあ何と無くわかるんだけど
4:19 PM
このquatrain フラグをつけるのは、open(2)するプロセスの責任で (edited)
4:20 PM
べつにカーネルが面倒見てくれてるわけじゃないっぽいんだよねー。
Avatar
omochimetaru 10/6/2020 4:20 PM
え。
4:20 PM
じゃあシェルが勝手にやってるんですか
Avatar
だから、RubyとかでHTTP GETしてFile.write()したバイナリはそのまま実行できる
4:21 PM
サインされてなくても。
Avatar
omochimetaru 10/6/2020 4:21 PM
あ、フラグを付ける時の話ですか?
4:21 PM
実行時にフラグを見る話ではなく。
Avatar
そう。フラグつけるのは任意。
Avatar
omochimetaru 10/6/2020 4:22 PM
そうすると、safariがDLした時にフラグをつけて、それをmacOS標準のアーカイバが展開する時に、中身にフラグを付け直してるんかな。
Avatar
フラグ見るのは execve(2) でやられてる
4:22 PM
それっぽい
Avatar
omochimetaru 10/6/2020 4:22 PM
なるほど >execve
4:22 PM
ははあ・・・
Avatar
appleのツールは守ってる
4:23 PM
homebrewはRubyで書いてあるし、多分意図的に守ってない
4:23 PM
そもそもhomebrewを最初に入れるときに許可がいるっていう
4:23 PM
そう言う話だと思う
4:23 PM
あのインストーラースクリプトはcurlとかで取ってくる必要があるから。
4:24 PM
chain of trustかなあ
Avatar
omochimetaru 10/6/2020 4:24 PM
なるほどなあ
Avatar
かたや、notarizationはdeveloper idでサインしたら最近は必須だから、 (edited)
4:25 PM
サインすると面倒という見方も...
4:25 PM
どのみち、エンドユーザーにでるダイアログに大差ないからね
Avatar
なるほどなぁ
Avatar
iOSのようなサンドボックスじゃないシステムの妥協としてはまあ良い方なのでは。
4:27 PM
ということをAppleはどこかに書いたらいいとおもいます。 (edited)
4:28 PM
ブログ書いたらいいのかな。。
4:28 PM
辛いのは誤った情報が溢れてることなんだよね (edited)
4:28 PM
ITのひとの寝言みたいなやつとか
Avatar
omochimetaru 10/6/2020 4:30 PM
ITの人の寝言とは・・・w
Avatar
ITのひとがなんかこうしたら俺んとこでは解決したよみたいなまったく理論的でない個人のポエムみたいな情報かなあ
Avatar
omochimetaru 10/6/2020 4:31 PM
ww
4:35 PM
[omochi@omochi-iMacPro wasm]$ ls -alh total 20432 drwxr-xr-x 4 omochi staff 128B 10 7 01:32 . drwxr-xr-x 14 omochi staff 448B 10 7 01:07 .. -rw-r--r--@ 1 omochi staff 21B 10 7 01:08 a.swift -rwxr-xr-x 1 omochi staff 10M 10 7 01:32 a.wasm [omochi@omochi-iMacPro wasm]$ wasmer a.wasm hello world
4:35 PM
ハロワできた
💯 1
Avatar
codesignコマンドの--deepオプションが全然再帰的に効かなくて困った。。。
4:41 PM
$ sudo codesign --force --deep --sign "Developer ID Application: Neko Chan (XXXXXXXXX)" --options runtime --deep-verify swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/ $ codesign -display swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package: code object is not signed at all (edited)
Avatar
omochimetaru 10/6/2020 4:41 PM
/Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi';
4:42 PM
XCTestはないから swift test はできない?
Avatar
いや、あるんですよ
Avatar
omochimetaru 10/6/2020 4:43 PM
なんか俺が間違えてるんかな
Avatar
うーんなんかツールチェーンが腐っている気がする。。。
Avatar
ねこちゃん
Avatar
🐱
Avatar
omochimetaru 10/6/2020 4:45 PM
[omochi@omochi-iMacPro usr]$ tree | grep -i xctest │   │   │   ├── XCTest.swiftmodule │   │   │   │   ├── XCTest.opt.bitstream │   │   │   ├── libswiftXCTest.dylib │   │   │   ├── XCTestOverlayShims.h │   │   ├── XCTest.swiftdoc │   │   ├── XCTest.swiftmodule │   │   ├── XCTestOverlayShims.h │   ├── libXCTest.a │   └── swiftpm-xctest-helper
4:45 PM
たしかになんかは入ってるな
Avatar
オフィシャルのツールチェーンと比較しようと思ったのにswift.orgが落ちててスナップショット落とせない。。。
Avatar
omochimetaru 10/6/2020 4:48 PM
うーん、 --sdk を指定してないのがいかんのかと思ったが
4:48 PM
swift build と swift test は指定すると逆に通らないな
4:48 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^ /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift/shims/LibcOverlayShims.h:31:10: error: 'semaphore.h' file not found #include <semaphore.h> ^ <unknown>:0: error: could not build C module 'SwiftOverlayShims' <module-includes>:1:10: note: in file included from <module-includes>:1: #include "../../../../share/wasi-sysroot/include/ctype.h" ^ <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^
4:49 PM
a
4:49 PM
ミスってた
4:50 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift test --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ error: fatalError
4:51 PM
ビルドは通った (TOOLCHAIN_PATHがシェルから消えてた) けど、could not findだ
Avatar
あ、corelibsのswiftmoduleの配置がマズそう (edited)
4:55 PM
とりあえずIssue立てておきます
Avatar
omochimetaru 10/6/2020 4:56 PM
古いのダウンロードしたらいけたりするやつ?
4:56 PM
いまやってるの swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a なんだけど。
Avatar
動くスナップショットはあるはず
Avatar
omochimetaru 10/6/2020 4:57 PM
なるほどね
4:57 PM
bookに出てくるやつにするわ
Avatar
10/2はもう腐ってます
🧟‍♀️ 1
Avatar
omochimetaru 10/6/2020 4:58 PM
笑う (edited)
4:58 PM
イントロで紹介してるの10/2やで
Avatar
それは凄く良くない
4:59 PM
e2eテストが足りてないですね。
Avatar
omochimetaru 10/6/2020 4:59 PM
しょうがないよやること無限にある
Avatar
たぶん1ヶ月前くらいのスナップショットなら動くと思うんですけど、古いのもはオプティマイザが壊れてたり別の問題があるのでとりあえずXCTestは待っててください
Avatar
omochimetaru 10/6/2020 5:00 PM
了解!
Avatar
同様にFoundationもimportできないと思います 😢
5:00 PM
あれ、できた
Avatar
omochimetaru 10/6/2020 5:02 PM
executable作ってFoundation走るかみてみる。
5:06 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSTimeZone.swift.obj): undefined symbol: CFHash wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: _CFDeinit wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSRegularExpression.swift.obj): undefined symbol: kCFAllocatorSystemDefault
5:06 PM
エラーが1000行出てきた
5:07 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ tree -L 2 -d $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/../share/wasi-sysroot ├── include │   ├── arpa │   ├── bits │   ├── c++ │   ├── net │   ├── netinet │   ├── netpacket │   ├── scsi │   ├── sys │   └── wasi ├── lib │   ├── wasm32-wasi │   └── wasm32-wasi-unknown ├── share │   └── wasm32-wasi └── usr └── include 17 directories
5:07 PM
sysrootはあってると思う・・・
Avatar
あ、
5:08 PM
思い出した
👀 1
5:09 PM
{ "extra-cc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32" ], "extra-cpp-flags" : [ ], "target" : "wasm32-unknown-wasi", "version" : 1, "extra-swiftc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32", "-Xlinker", "-lFoundation", "-Xlinker", "-lCoreFoundation", "-Xlinker", "-lBlocksRuntime", "-Xlinker", "-licui18n", "-Xlinker", "-luuid" ], "sdk" : "TOOLCHAIN_DIR/usr/share/wasi-syroot", "toolchain-bin-dir" : "TOOLCHAIN_DIR/usr/bin" }
5:10 PM
こういうdestinationファイルを作って、TOOLCHAIN_DIRを置換して、
5:10 PM
swift build -c debug --build-tests --destination wasm32-unknown-wasi.json
5:11 PM
--destination オプションに渡す
Avatar
omochimetaru 10/6/2020 5:11 PM
やってみます。
Avatar
cartonでビルドするとこれ隠蔽されるんですけど、たぶんおもちさんの好みじゃ無さそう
Avatar
omochimetaru 10/6/2020 5:14 PM
carton使う気は無いですね
5:14 PM
好みじゃなくて・・・
5:14 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) error: link command failed with exit code 1 (use -v to see invocation) [16/18] Linking SwiftDeclWebPackageTests.xctest
5:14 PM
なんかもうちょっとぽい感じになった。
5:14 PM
エラー一件
Avatar
なんだこれ
5:17 PM
package initで作ったパッケージでは通る
5:19 PM
The error is raised by wasm-ld: wasm-ld: error: /Users/maxd/.carton/sdk/wasm-5.3-SNAPSHOT-2020-09-23-a/usr/share/wasi-sysroot/lib/wasm32-wasi/ libc.a(__original_main.o): undefined symbol: main The ...
5:20 PM
直したやつっぽい
Avatar
omochimetaru 10/6/2020 5:20 PM
[omochi@omochi-iMacPro wpkg]$ swift package init --type executable Creating executable package: wpkg Creating Package.swift Creating README.md Creating .gitignore Creating Sources/ Creating Sources/wpkg/main.swift Creating Tests/ Creating Tests/LinuxMain.swift Creating Tests/wpkgTests/ Creating Tests/wpkgTests/wpkgTests.swift Creating Tests/wpkgTests/XCTestManifests.swift [omochi@omochi-iMacPro wpkg]$ open . [omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:20:23: error: cannot find 'Process' in scope let process = Process() ^~~~~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:23:20: error: cannot find 'Pipe' in scope let pipe = Pipe() ^~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:44:28: error: value of type 'Bundle' has no member 'bundleURL' return Bundle.main.bundleURL ~~~~~~~~~~~ ^~~~~~~~~ [6/9] Compiling wpkgTests XCTestManifests.swift
5:20 PM
完全に空のディレクトリからやりなおしてみたらこうなった (edited)
Avatar
Processは使えない気がする (edited)
Avatar
omochimetaru 10/6/2020 5:21 PM
ああ、たしかに。
5:21 PM
これをちょっと書き換えてみるか
5:22 PM
import XCTest final class wpkgTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] }
5:22 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [7/8] Linking wpkgPackageTests.xctest
5:22 PM
同じシンボルでコケた
5:23 PM
ほんとだ。リグレッションだ > issue 1824
5:23 PM
10/05が駄目なんだな
5:24 PM
10/02にしてみるか。
Avatar
$ cat Tests/helloTests/helloTests.swift import XCTest final class helloTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] } $ ~/Downloads/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift build -c debug --build-tests --destination wasm-5.3-SNAPSHOT-2020-09-08-a.json [12/12] Linking helloPackageTests.xctest /var/folders/br/7sr_p7cj7v549x_gtkb33df00000gp/T/tmp.BSZU6PLa $ wasmer ./.build/debug/helloPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 17:24:16.346 Test Suite 'testBundle.xctest' started at 2020-10-06 17:24:16.346 Test Suite 'helloTests' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' passed (0.0 seconds) Test Suite 'helloTests' passed at 2020-10-06 17:24:16.346 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
5:25 PM
うーーん??
Avatar
omochimetaru 10/6/2020 5:25 PM
そっちも1005なのか。
5:25 PM
あれ、.xctoolchain ?
Avatar
ああ、これは作業中のツールチェーンです
5:26 PM
バイナリ自体には影響ない
Avatar
omochimetaru 10/6/2020 5:26 PM
あとdestinationファイルは09-08?
5:26 PM
jsonの中身は1005なの?
Avatar
お、合わせたら再現した
5:28 PM
じゃあ09-08は動く
Avatar
omochimetaru 10/6/2020 5:29 PM
なるほど。
5:35 PM
10-02で同じエラーでた
5:35 PM
09-08落とす
Avatar
5.3-SNAPSHOT-2020-10-02-a はOK
Avatar
omochimetaru 10/6/2020 5:41 PM
あー、DEVELOPMENTなしのほうか (edited)
Avatar
そっちはもうちょっと安定してる
Avatar
omochimetaru 10/6/2020 5:41 PM
なるほど
5:48 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/share/wasi-sysroot/lib/wasm32-wasi/libc.a(__original_main.o): undefined symbol: main clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [8/9] Linking wpkgPackageTests.xctest
5:48 PM
グアア
5:49 PM
10-02 無印 ダウンロードする
Avatar
ウオー見つけた
Avatar
omochimetaru 10/6/2020 6:01 PM
ウオオオw
6:02 PM
__withStackOrHeapBuffer のテストケースがあれば・・・
6:02 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-10-02-a/usr/wasm32-unknown-wasi.json [12/12] Linking wpkgPackageTests.xctest (edited)
6:03 PM
10-02無印でビルドできました!!
6:03 PM
[omochi@omochi-iMacPro wpkg]$ wasmer .build/debug/wpkgPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 18:03:44.789 Test Suite 'testBundle.xctest' started at 2020-10-06 18:03:44.790 Test Suite 'wpkgTests' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' passed (0.0 seconds) Test Suite 'wpkgTests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
6:03 PM
XCTest走った〜〜
6:05 PM
お、手元のプロジェクトの方もビルド実行できた
6:06 PM
bookのやつは無印の10-02だから結局オッケーだったのか。
Avatar
わーい 🙌
Avatar
omochimetaru 10/6/2020 6:08 PM
今日は終わっときます〜 どうもありがとう〜
Avatar
おやすみなさい〜
Avatar
知見のおおいthreadだった
Avatar
destination.jsonの書き方はこれか。 https://github.com/apple/swift-package-manager/pull/1098
General This adds experimental support for cross compilation or more precisely configurable destinations for binaries to SwiftPM. The basic idea is that you hand a JSON file in the format described...
Avatar
とりあえずFoundationリンクできないやつは治った https://github.com/swiftwasm/swift-corelibs-foundation/pull/143
Resolve swiftwasm/swift#1824 (comment) $ swift build -c debug --build-tests --destination wasm32-unknown-wasi.json wasm-ld: error: /path/to/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swi...
Avatar
norio_nomura 10/7/2020 5:06 AM
.xctoolchainにしてexport TOOLCHAINS="org.swift.…"でツールチェインを切り替える仕組みは、SwiftPMがツールチェイン添付のXCTest.swiftmoduleを使ってくれないから、SwiftWasmには使えないんじゃないかな。 (edited)
Avatar
そうなんですよね。今はとりあえずdestinationファイルで-I付けてツールチェーンのXCTest.swiftmoduleを優先するようにしてるんですけど微妙。。。 (edited)
Avatar
omochimetaru 10/7/2020 1:22 PM
C側ではattribute付きのextern宣言をしておいて、 WebAssembly.instantiate でJS側の関数をWASM環境にいれるやつ
1:22 PM
これ引数と返り値の型はどうやって合わされてるの?
Avatar
実行時検査ですね
Avatar
omochimetaru 10/7/2020 1:24 PM
あー、C側の呼び出しが
1:24 PM
WASM環境だから
1:24 PM
ランタイムが引数の型を知っている?
1:25 PM
普通のC環境だったらcallerが信じてるcalleeの呼び出し規約と引数に応じてレジスタ/スタックを構成してからジャンプするけど
1:26 PM
WASMだと 関数と引数を指定してコールする抽象度だから、
1:26 PM
WASMランタイムがその情報に基づいて引数の値をWASMの型からJSの型に変換してからJSの関数を呼ぶ?
Avatar
多分そういう実装になっているはず
Avatar
omochimetaru 10/7/2020 1:28 PM
なるほど・・・
Avatar
calleeが引数をどう使おうと要求している引数の数が提供される数を超えない限りは問題ない
Avatar
omochimetaru 10/7/2020 1:29 PM
仮引数に対して実引数の数が足りてなくても
1:29 PM
JSだったらundefinedになって呼び出されそう
1:29 PM
例外飛ぶんだっけ
Avatar
どうだろう。。
Avatar
omochimetaru 10/7/2020 1:29 PM
あと
1:29 PM
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
1:30 PM
// Output stdout and stderr to console const originalWriteSync = wasmFs.fs.writeSync; wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { const text = new TextDecoder("utf-8").decode(buffer); // Filter out standalone "\n" added by every `print`, `console.log` // always adds its own "\n" on top. if (text !== "\n") { switch (fd) { case 1: console.log(text); break; case 2: console.error(text); break; } } return originalWriteSync(fd, buffer, offset, length, position); };
1:30 PM
これがいまいち理解できないんだけど
1:30 PM
ここにかいてある print って Swift.print のこと?
Avatar
これ書いた覚えがないな…
1:30 PM
多分そうだと思うます
1:31 PM
↑bookにもこの書き換えが出てくる
1:31 PM
Swift.print の末尾の改行が不要なのであれば、 print(str, terminator: "") って呼び出せばよくない?
Avatar
たぶんconsole.logの改行とSwift.print側の改行で2つ改行されるのが嫌なんじゃないですかね
Avatar
omochimetaru 10/7/2020 1:32 PM
この wasmFS.fs.writeSync の先に繋がってる console.log で勝手に改行されて改行が2つになることを気にしてそうな
Avatar
そうそう
Avatar
omochimetaru 10/7/2020 1:33 PM
でも、それおかしいことになるよね
1:33 PM
console.logはどうやったって改行をつけちゃうというか
Avatar
途中に改行入ってたりすると壊れる
Avatar
omochimetaru 10/7/2020 1:33 PM
与えられた文字列の単位で行をわけて表示する仕組みだから
1:33 PM
逆にそもそも Swift.print("str", terminator: "") ってやっていたとしても
1:33 PM
console.logによる改行?というか表示上の区切りは生じる
1:34 PM
blameみるとたしかにこれかいたのはJedFoxさんだな
1:35 PM
いや、ちがうな、
1:35 PM
更にずっと前に Max も同じことやってる
1:36 PM
ア…
1:36 PM
まあ見た目をキレイにしたい気持ちはわかる
Avatar
omochimetaru 10/7/2020 1:36 PM
やるなら改行が来るまでバッファリングして
1:37 PM
改行のところで分割してconsole.logだったら
1:37 PM
結果が同じになるから正しいと思う・・・
1:37 PM
でも fflush() が呼ばれたら詰む。 (edited)
Avatar
どうしようもない
Avatar
omochimetaru 10/7/2020 1:40 PM
console.logにマッピングしてるのがまあ無理だよね
Avatar
Node.jsだったらprocess.stdout.writeにマップして幸せになれる
1:42 PM
ブラウザでのSwift.printはどうせ開発者しか見ないし。。。
Avatar
omochimetaru 10/7/2020 1:42 PM
Monorepo for Javascript WebAssembly packages by Wasmer - wasmerio/wasmer-js
1:43 PM
デフォルトのconsole.logにつなげてる場所どこだろ
Avatar
wasmer-jsのリポジトリではそういうユースケースないです
Avatar
omochimetaru 10/7/2020 1:44 PM
const originalWriteSync = wasmFs.fs.writeSync;
Avatar
wasiアプリケーションのstart関数が終わった後にまとめてstdoutをprintしてる
Avatar
omochimetaru 10/7/2020 1:44 PM
このoriginalWriteSyncの実装はどこに?
1:44 PM
1:44 PM
あ〜
Avatar
じっそう?
Avatar
omochimetaru 10/7/2020 1:45 PM
これフックしてconsole.logに横流ししてるだけか
Avatar
そうそう。フックしてconsole.logに流した後、元のwriteSync呼ばないとバッファリング壊れるんで。 (edited)
Avatar
omochimetaru 10/7/2020 1:45 PM
読み間違えてた。なるほど。
1:46 PM
これがないと wasmfs的には /dev/stdout にファイルとして書き溜めてるだけなのね
Avatar
そうなんです。
Avatar
omochimetaru 10/7/2020 1:48 PM
うーん。Swift側にconsole.logを意味的にもインポートしてくるのが良さそうだなあ。
1:48 PM
でもXCTestの出力は多分勝手にstdoutに出されてるよね・・・
Avatar
Rustはwasm-bindgenでconsole.logをRust側に引っ張ってきてますね。
1:48 PM
そうなんですよ
Avatar
omochimetaru 10/7/2020 1:49 PM
XCTestの出力は逐次で見たいなあ。
Avatar
XCTestは大体wasmerとかwasmtimeとかコマンドラインでやるからconsole.log必要なくないですか? (edited)
Avatar
omochimetaru 10/7/2020 1:51 PM
DOMがちゃんと操作されるかテストしたい。
Avatar
ああそうか〜
Avatar
omochimetaru 10/7/2020 1:51 PM
だからブラウザ上でしかテストできない。
1:51 PM
This seems like a bit of a computing systems 101 question, but I'm stumped. I am integrating existing code from C/C++ project A into my own project B. Both A and B will be linked into a single
1:51 PM
C環境で、freopenとかdupとかで
1:52 PM
stdoutの向き先を自前で用意したpipeにすることができるんだけど
1:52 PM
WASI上でそういうのできんのかな。
Avatar
wasi-libc側でできそう
Avatar
omochimetaru 10/7/2020 1:55 PM
どういうスタックになってるんだ?
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 1:55 PM
wasi-libc が wasi APIの上で実装されたlibc ?
1:56 PM
こう
Avatar
omochimetaru 10/7/2020 1:56 PM
Swiftはlibcを使ってるつもりになっているのか
1:56 PM
普通のプラットフォームがこれ
Avatar
omochimetaru 10/7/2020 1:56 PM
freopenだとファイルパスだからちょっと微妙だよね、dup2が良さそうだ
1:57 PM
なるほど
1:57 PM
freopenの中がdup3だ
Avatar
リダイレクトしてどうするんですか?
Avatar
omochimetaru 10/7/2020 1:58 PM
自作のpipeオブジェクトに対して
1:58 PM
別スレッドからselect pollingすればリアルタイムに吸い出せる
1:58 PM
いやスレッドないな・・・
1:59 PM
stdoutに来てるストリームを受け取れればあとはどうにでもなるので。consoleには出せないけど。
1:59 PM
<pre> タグの中に流し込んでいくとかのほうがマシな挙動だと思う。
2:00 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:00 PM
WebAssembly System Interface. Contribute to WebAssembly/WASI development by creating an account on GitHub.
2:01 PM
WASIになんかリッチな名前のdupがあった
Avatar
ちゃんと名前がついていてわかりやすい
2:02 PM
writeFileSyncで引っ掛けてpreタグに流し込むだとまずいんでしたっけ
Avatar
omochimetaru 10/7/2020 2:02 PM
制御がSwift側にない。
2:02 PM
JS側でできるだけ何もしたくない・・・
Avatar
なるほど
Avatar
omochimetaru 10/7/2020 2:03 PM
でもなんかコスパに見合ってる感じがしないねえ。
2:04 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:04 PM
freopenがrenumberでかいてあるんだな
2:04 PM
これsyscallはどこに行くんだろ
2:04 PM
f2 = fopen(filename, mode); if (!f2) goto fail; if (f2->fd == f->fd) f2->fd = -1; /* avoid closing in fclose */ #ifdef __wasilibc_unmodified_upstream // WASI has no dup else if (__dup3(f2->fd, f->fd, fl&O_CLOEXEC)<0) goto fail2; #else // WASI doesn't have dup3, but does have a way to renumber // an existing file descriptor. else { if (__wasilibc_fd_renumber(f2->fd, f->fd)<0) goto fail2; f2->fd = -1; /* avoid closing in fclose */ } #endif
Avatar
syscallはよばれないっすよ
Avatar
omochimetaru 10/7/2020 2:04 PM
いやなんか不穏だな
2:05 PM
なるほど・・・
Avatar
改造前のコードが残ってるだけですね
Avatar
omochimetaru 10/7/2020 2:05 PM
そういうことか〜
2:05 PM
じゃあこのwasi-libcにはdup2はなくって
2:05 PM
freopenはあって普通にC関数としてwasiのrenumberを呼ぶのか。
Avatar
ですね
Avatar
omochimetaru 10/7/2020 2:06 PM
逆にWASMSwift環境からは
2:06 PM
普通にWASI APIは直接触れる?
Avatar
ヘッダインクルードすれば
2:07 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:08 PM
wasi APIって言っても、ただモジュール名と関数名とシグネチャが指定されてるextern関数なので
Avatar
omochimetaru 10/7/2020 2:09 PM
なるほど
Avatar
特に特別扱いされてないですね
Avatar
omochimetaru 10/7/2020 2:10 PM
wasi側のAPIでなんとかfdを作ってrenumberでstdoutをくっつけてから非同期に読み出せれば
2:10 PM
やりたいことはできそうだな。
Avatar
非同期に読み出せるか…?
Avatar
omochimetaru 10/7/2020 2:12 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size)
2:13 PM
うーんちがうのかな。
2:13 PM
読めるように成ったら関数読んでくれるコールバック登録的な仕組みがあればできそうだけど
2:15 PM
そもそもファイルに紐付かないfdが欲しいけど・・・
Avatar
libcのレイヤーでそういうのあるのかな
Avatar
omochimetaru 10/7/2020 2:17 PM
open の世界だったら pipe がそう
2:18 PM
fopen が返す FILE* は 生fd のラッパー
2:20 PM
mkfifoでパス付きのpipeを作ってfopenするとFILE*に見えるけどpipeらしい。でもlibcじゃなさそう。
2:22 PM
うーんなんかなさそうな気がするな〜
Avatar
コールバックはなさそう
Avatar
omochimetaru 10/7/2020 2:23 PM
unixのファイルディスプリプタは
2:23 PM
ファイルといっても実際には抽象的なストリームで
2:23 PM
pipeもsocketも抽象化されてるんだけど
2:23 PM
wasiのファイルディスクリプタは本当にファイルシステムの方のやつしかなさそう?
2:24 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size) Concurrently poll for the occurrence of a set of events.
2:24 PM
poll_oneoffがconcurrencyって書いてあるんだけど
2:24 PM
subscriptionの構築方法がさっぱりわかrなn
2:26 PM
subscription { subscription_u { subscription_fd_readwrite { file_descriptor } } }
2:26 PM
なんかこんなのを作れば fd が監視できる気がする?
2:26 PM
でもコールバック関数を渡せそうな場所がない。
Avatar
これシグネチャ的に関数ポインタ渡せなくないですか
2:27 PM
ですね
2:28 PM
pollの実装に使われてるからこれは待つ感じかな
Avatar
omochimetaru 10/7/2020 2:29 PM
あー
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 2:30 PM
メインループの中で使うやつか。
2:31 PM
イベントが無かったらすぐ抜ける方なのかなあ。
2:33 PM
なんか、自分で、毎フレーム呼びまくってポーリングするためのものにも見える
Avatar
ぽい
2:34 PM
libcのapiってそういうの多いですよね
2:35 PM
あ、
2:35 PM
fd_writeって関数をSwift側に作ってリンク時に静的にそっちに実装が紐づくようにすれば良いんですよ
Avatar
omochimetaru 10/7/2020 2:36 PM
あー
2:37 PM
それstdout以外はどうしよう
2:38 PM
libc上でやるんじゃなくてlibc実装をフックするのは確かに・・・
2:39 PM
でもそれだったらあれだね、最初のJSの方式で
Avatar
void __wasi_fd_write(...) { // do redirect return original_fd_write(...); } void original_fd_write(...) __attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) (edited)
2:39 PM
こんな感じになるかな
Avatar
omochimetaru 10/7/2020 2:40 PM
あー
2:40 PM
そこは名前指定がもう一手かかってるのかややこしいな
Avatar
ややこしい
2:42 PM
Safariがi64をJS境界でサポートしていないことのpolyfillでも似たようなことした https://github.com/kateinoigakukun/swiftwasm-pad/blob/master/Frontend/Sources/i64_polyfill/i64_polyfill.c
swiftwasm-pad is a online playground to help developers learn about Swift on Web. - kateinoigakukun/swiftwasm-pad
Avatar
omochimetaru 10/7/2020 2:44 PM
今のビルドだと
2:45 PM
sysrootの中にある何かが既にそれをやってるんだよね?
2:45 PM
なんていえばいいんだ、wasiのfd_writeの実態に紐付けられようとしてるexternは既に書かれてる (edited)
2:47 PM
Swiftstdlibとかももうlibcとリンクされてるわけで
2:47 PM
そこをつなぎ替える?
Avatar
いや、Swiftサイドはwasiのインターフェースをフックするみたいなことはしてないです
Avatar
omochimetaru 10/7/2020 2:48 PM
wasi-libcをビルドしてできたlibcがツールチェインに既に入っているんじゃ?
Avatar
Swift stdlibはlibcとリンクされているけど、__wasiプレフィックスの付いてるexternなやつたちはundefinedのままです
Avatar
omochimetaru 10/7/2020 2:49 PM
なるほど。
Avatar
リンクされている、は嘘だ。
2:50 PM
実行可能ファイルに最終的にリンクするときに全部一気にリンクする
Avatar
omochimetaru 10/7/2020 2:50 PM
バラバラにstatic libで配布されててswiftpmがリンクしてるけど
2:50 PM
wasiシンボルはそれでもまだつなげていなくて
2:50 PM
それはwasm上でロードするときにwasmerのjs実装が流し込まれてるのか。
Avatar
で、その結果、最後までundefinedだったシンボルについて、ランタイムサイドからインポートするようなImportセクションを書き出すのがリンカの仕事です
Avatar
omochimetaru 10/7/2020 2:51 PM
そうするとやっぱJSで流し込む直前につなぎ替えることになりそう
Avatar
つなぎかえ?
Avatar
omochimetaru 10/7/2020 2:52 PM
> void __wasi_fd_write(...) { > // do redirect > return original_fd_write(...); > } > void original_fd_write(...) __attribute__(( > __import_module__("wasi_snapshot_preview1"), > __import_name__("fd_write") > )) (edited)
2:53 PM
↑この方法が機能しない気がしてる
2:54 PM
__attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) __wasi_fd_write(...) ↑すでにこう書かれたヘッダーがビルドに含まれてるわけでしょ?
Avatar
はい
Avatar
omochimetaru 10/7/2020 2:54 PM
original_fd_write と、 wasi関数を受け取ろうとしてるやつが2つできちゃうし
2:54 PM
どっちが本物になるのか曖昧にならん?
Avatar
あー、
2:55 PM
たぶんおもちさんの誤解ポイントが分かった
Avatar
omochimetaru 10/7/2020 2:55 PM
もともとある wasiのfd_writeをつなぎこもうとしてる __wasi_fd_write と 新たに作ろうとしてる、 もうひとつの fd_writeを本当につなぎたい original_fd_write と、
2:55 PM
2つある状態になる。
Avatar
リンカがシンボルを解決するタイミングでは __import_name__ は見ていなくて、C的なシンボルでルックアップしています
Avatar
omochimetaru 10/7/2020 2:57 PM
あ、じゃあ、実装付きの __wasi_fd_write が別途存在すればそれはそこにつながるのか。
Avatar
で、wasi-libc側のヘッダに書かれた __wasi_fd_write は実装が無いがユーザーが定義した __wasi_fd_write には実装があるので、この時点で __wasi_fd_write はundefinedなシンボルではなくなります
Avatar
omochimetaru 10/7/2020 2:57 PM
ふむふむ
Avatar
definedなシンボルに対してはリンカはimportエントリを発行しないのでwasi-libc側のヘッダの __import_name__ は無視されます
Avatar
omochimetaru 10/7/2020 2:59 PM
はいはい。
Avatar
original_fd_write は実装が無いのでundefinedなので、__import_name__ に基づいてimportエントリを発行します
2:59 PM
なのでリンカ的には曖昧さは無いんですよ
Avatar
omochimetaru 10/7/2020 3:00 PM
なるほどー そこの処理手順がわかってなかった
3:01 PM
たしかにそれなら安定した挙動でさしこめるな。
Avatar
リンカを書くとリンカの気持ちがわかるようになる
Avatar
omochimetaru 10/7/2020 3:03 PM
シンボル解決できたらimport attributeを無視するの気持わかるのだいぶ深い
3:06 PM
あ、もう一個シンプルな方法あるな
3:06 PM
/dev/stdout を wasi で fopen して poll_oneoff 回せば良いんだ。
3:07 PM
スレッドは立てられないから、requestRenderで毎回見るとかtimerとかぶん回す必要があるけど
Avatar
あー、別のwasmインスタンスを作ってその中で回す?
Avatar
omochimetaru 10/7/2020 3:07 PM
別のインスタンス!?
3:07 PM
そんな裏技があるの
Avatar
え、WebAssembly.instantiateをJSから作るだけ。。。
Avatar
omochimetaru 10/7/2020 3:08 PM
回すとは?
3:08 PM
this.view.setUint32(nevents, eventc, true); while (bindings.hrtime() < waitEnd) { // nothing } return WASI_ESUCCESS;
3:09 PM
タイムアウト無限だとビジーループしてそうなんだよね実装が
Avatar
wasmerのwasiインスタンスをもう一つのwasmインスタンスと共有してpollを回す
Avatar
omochimetaru 10/7/2020 3:09 PM
The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.
3:10 PM
ブラウザだと多分これが良いんだと思う
3:10 PM
ああ、「回す」の
3:11 PM
ループを作る方法が問題ってこと。
Avatar
あーそうか
3:12 PM
難しいな
Avatar
omochimetaru 10/7/2020 3:12 PM
今年も vimconf にスタッフ兼発表者として参加してきました.名札の名前が「ドッグ」でじわじわきました… 開場 当日は準備スタッフの作業のために 8:30 に会場へ.山手線の遅延に巻き込まれて 8:45 ぐらいに到着. 電源ケーブルの配線などをやりました. Vim on Browser vimconf での発表は今年で3回目です.最近趣味ではウェブのフロントエンド周りや Electron を触っているので,今回は便利プラグインとかの実用的な話からそれて "Vim on Browser" というタイトルで発表してきました. ブラウザ上で「本物の」...
Avatar
requestAnimationFrameがマシなのか
Avatar
omochimetaru 10/7/2020 3:12 PM
りんださんがvimをブラウザで動かした時に同じような問題があってそうやってたって言ってたようなないような (edited)
Avatar
見たことがある気がする
3:15 PM
こっちのスライドだ
Avatar
omochimetaru 10/7/2020 3:16 PM
WebWorkerで並行実行させて
Avatar
atomicで止める
Avatar
omochimetaru 10/7/2020 3:17 PM
AtomicsAPIとやらでタイミングを制御とな
3:18 PM
うーむ。
8:54 AM
関数にしておけば名前が被ってしまう問題も回避できそうに思います。
Avatar
シャドーイングを回避するとそうなりますよねー
Avatar
メソッドチェーンで書けないのも、どうせ try とか await は前に書くし、前に書いちゃえば良さそう。 let x = try await jsTry(jsAwait(foo.bar.baz))
8:55 AM
jsTryAwait があってもいいか。
Avatar
どうせ try とか await は前に書くし
たしかに
8:57 AM
let result = await jsAsync(fetch)("...")
Avatar
そっちは大変じゃないですか?どうせ fetchPromise 返すんだから、 await jsAsync(fetch("...")) でも良さそうな気も?
9:00 AM
エラーについては JSValuecase error(JSValue) を追加すれば良い?
9:00 AM
あ、循環しちゃうから indirect
9:01 AM
(でも .error がネストしてほしくないから微妙だな・・・。)
Avatar
JSError が既にあるので case error(JSError) にできそう
Avatar
なるほど。
Avatar
JSのエラーはオブジェクトのはずなのでJSValueである必要は無いかな (edited)
Avatar
stringthrow したときは String になってるんですっけ?
Avatar
特定の型の式だけではなく、あらゆる式をスローすることができます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling
9:04 AM
オブジェクトだけじゃないのか!
Avatar
あらゆる式を throw できるけど、オブジェクト化されてる可能性もあるのかなと。
Avatar
try { throw 1 } catch(e) { console.log(e) } // 1 (edited)
9:06 AM
普通に値のままですねー
Avatar
typeof も試してみましたが、オブジェクトになってませんでした。
9:07 AM
いちおうブラウザで試してみましたが、↓で string と出てきました。 <script> try { throw 'error'; } catch(e) { alert(typeof e); } </script>
9:09 AM
あー、 JSError っていうのは throw された値を格納するためのものじゃなくて、 JavaScript の Error に対応してるんですね。
Avatar
ああ、そうですそうです
Avatar
うーん、論理的には↓みたいな構造にしないとネストを防げなさそうだけど、この変更はちょっと・・・。 enum JSValue { case success(_JSValue) case failure(_JSValue) enum _JSValue { case boolean(Bool) case string(JSString) ... } }
9:15 AM
enum JSValue { case boolean(Bool) case string(JSString) ... case error(JSErroValue) } enum JSErrorValue { case boolean(Bool) case string(JSString) ... }
9:15 AM
↑の方が現実的かな。
Avatar
JSValueのerror caseをユーザーがハンドリングすることは滅多に無い気がするので、できれば追加したくないなぁ
9:21 AM
jsTry がJS関数を受け取るようにすれば内部に隠蔽できるかもしれない
Avatar
DOM はわかりませんが、 JS のライブラリを使うときに JS 側でエラーが throw されることは普通にありそうな気がします。
9:22 AM
func jsTry(_ f: JSFunction) -> JSThrowingFunction みたいな?
Avatar
JSValueのerror caseをユーザーがハンドリング
これは例えばこういうコードはユーザーは滅多に書かないのでJSValueのケースを増やしても使われないんじゃないかなと let result: JSValue = ... if case .error(let error) = result { // ... } // or if let error = result.error { // ... }
9:24 AM
throwされることは普通にあると思います。
Avatar
僕のイメージしてたのは JSValue にエラー情報を埋め込んじゃって jsTry されたときにエラーを throw するというものだったので JSValue に埋め込まざるを得ませんでしたが、 JSThrowingFunction みたいなものに変換する方式なら JSValue はいじらずに済みそうですね。
9:26 AM
ただ、それだと関数よりやっぱりメソッド/プロパティであってほしいかなぁ。当初の .throwing みたいに。
Avatar
func jsTry(_ f: JSFunction) -> JSThrowingFunction
こんなイメージでした
9:26 AM
ですよねぇ
9:26 AM
これはもう一つ問題があって、
Avatar
JSValue に埋め込むなら jsTrytry が必ずセットになるから先頭に戻ってもいいけど、 JSThrowingFunction 方式だとそうは限らないですもんねー。
9:28 AM
ただ、 JSThrowingFunction 化してから Swift で取り回すことを考えると、こっちの方がいい気もしますね。毎回 jsTry 噛まさなくてもいいし。
Avatar
取り回しが難しいんですよね。
9:30 AM
例えばこれと let div = document.createElement!("div") これは let createElement = document.createElement.function! createElement("div") thisの扱いが違うんですよね。 (edited)
Avatar
関数になっちゃうのは諦める場合、変換方式なら関数名は jsTry / jsAwait よりも jsThrows / jsAsync が良さそうですね。
9:31 AM
出た、 JS の this 問題。
Avatar
上の場合、JSObjectに生えてるsubscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue)? が呼ばれて、thisがレシーバでバインドされるんですが https://github.com/swiftwasm/JavaScriptKit/blob/4b7981bc1b81a1f25e7aca851866d55913657d61/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift#L34-L40 (edited)
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
9:32 AM
下の場合一度 JSFunction になってしまって、JSFunctionのcallAsFunctionで実行されるのでthisがバインドされないんですよね https://github.com/swiftwasm/JavaScriptKit/blob/4b7981bc1b81a1f25e7aca851866d55913657d61/Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift#L21 (edited)
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
9:33 AM
で、 jsThrows 方式で行くと、レシーバのバインディングができないなと。
Avatar
これは解決が難しそう・・・
Avatar
あー、 (ConvertibleToJSValue...) -> JSValue) をjsThrowsの引数に取れば良いのか? (edited)
Avatar
なるほど。
Avatar
func jsThrows(_: (ConvertibleToJSValue...) -> JSValue)) -> (ConvertibleToJSValue...) throws -> JSValue) func jsThrows(_: JSFunction) -> (ConvertibleToJSValue...) throws -> JSValue)
Avatar
オーバーロードして用意しておけばいけそうな気がしますね。
Avatar
この2つのオーバーロードがあれば良さそう
9:36 AM
これはなんだか実装できそうな気がしてきました
Avatar
これができるとこれに合わせて jsAsync も実装できそうでいいですね。
9:38 AM
PythonKit は throws/try はどうしてるんでしょうね?
9:39 AM
Swift framework to interact with Python. Contribute to pvieito/PythonKit development by creating an account on GitHub.
9:39 AM
これ?
Avatar
お、考えることは同じだなぁ
Avatar
Python でもシャドー問題はありますよね。
9:42 AM
Swift で throws は現状で identifier として使えないですけど、 async は使えてすでに使われてて、そう考えると throws も identifier として使えるようにするという変更があり得て、その上で throwsasync を使うことで名前被りを避けることはできない?
9:43 AM
throws は JS で予約語だから、 throws さえ使えれば foo.throw がいけそう?
9:46 AM
@swift-main -Xfrontend -enable-experimental-concurrency struct Foo { func foo() async {} func async() {} } (edited)
Avatar
@swift-main struct A { var `throws`: Int { 1 } } _ = A().throws (edited)
Avatar
swiftNightly BOT 10/13/2020 9:46 AM
no output (edited)
9:46 AM
no output
Avatar
throws使えるっぽい?
Avatar
おおお
Avatar
これは良い
Avatar
そうすれば throws にしちゃえば解決じゃないですか?
Avatar
ですね
9:47 AM
おー、これはキレイにまとまりましたね
Avatar
This page describes JavaScript's lexical grammar. The source text of ECMAScript scripts gets scanned from left to right and is converted into a sequence of input elements which are tokens, control characters, line terminators, comments or white space. ECMAScript also defines c...
9:48 AM
さっき貼ったページがあやしかったので
9:48 AM
調べ直したら
9:48 AM
Future reserved keywords in older standards The following are reserved as future keywords by older ECMAScript specifications (ECMAScript 1 till 3).
9:48 AM
なのでダメ?
Avatar
a.import a['import'] a = { import: 'test' }.
9:50 AM
これは合法っぽいですね
Avatar
<script> const a = { throws: 'foo', }; console.log(a.throws); </script>
Avatar
var obj = { throws: 1 } これも書けるっぽい。。。 (edited)
Avatar
これで foo と表示されちゃいました😢
9:50 AM
あー、せっかくいい案だと思ったのに・・・。
Avatar
ソースコード上の識別子の制約と実行時のフィールド名の制約は別物なんですね (edited)
Avatar
あ、その import のコードは上記ページのものだったんですね。
Avatar
そうですそうです
Avatar
生きてる予約語でダメなら "in older standards" 関係なくダメだ・・・。 (edited)
Avatar
そうするとやっぱり jsThrows で外から被せる方式ですかね
Avatar
そうですねぇ・・・。
9:55 AM
演算子とかは避けたいですもんねw
Avatar
グローバルに関数を生やすと補完に出ないのがなぁ。。
Avatar
throws はダメだったけど、 JS で使えない identifier にするって方法はないでしょうか?
9:59 AM
Swift でしか使えない文字とかがあれば。
Avatar
JavaScript オブジェクトはキーと値を所持しています。キーは文字列 (または Symbol) ですが、値はなんでもかまいません。これにより、オブジェクトはハッシュマップの様相を呈します。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures 特にキーに制約なさそうなんですよね
(edited)
あらゆるプログラミング言語は、それぞれ異なったデータ構造を持っています。この記事では、JavaScript で使用可能な組み込みデータ構造の一覧と、他のデータ構造の構築にも使えるように、それらがどのような性質を持ち合わせているかについて述べることにします。また可能である場合は、他のプログラミング言語におけるデータ構造との対比も行います。
😢 1
Avatar
まったく関係ないんですけど、前から気になってたんですが、 JSObject@dynamicMemberLookup にするより、直接 JSValue@dynamicMemberLoopup にして callAsFunction も持たせちゃった方が便利だったりしないでしょうか?どのみち JS 使ってる時点で安全じゃないですし。 (edited)
10:06 AM
!.object, .function などを挟まないといけないのが気になってます。
Avatar
過去に話に出たんですが、それもシャドーイングの問題で辞めておこうって話になったんですよね
10:07 AM
でも改めて考えると名前が被ったときだけ明示的に.object経由でアクセスすれば良いような気もします
Avatar
お、過去にも出てたんですね。どの issue か教えてもらってもいいですか?
Avatar
どこだったかな
Avatar
JSValue にメンバを生やさないで済むのならシャドーイングは問題にならないですか?
Avatar
見つからなかったので夢かDMで話したんだと思います 😢
Avatar
夢w
10:12 AM
jsTry とかと合わせるなら関数か static メソッド/プロパティにしちゃって、インスタンスメソッド/プロパティは @dynamicMemberLookupcallAsFunction のものという切り分けにできるなら、シャドーイングも避けられて切り分けも明快かなと。 (edited)
Avatar
ふむふむなるほど
Avatar
グローバル関数あまり追加したくないから、 JS. とかがあってもいいかもですね。
10:14 AM
JS.throws, JS.async
Avatar
I got feedback that the current API to access JavaScript objects is redundant. As he says, I agree that method!(...) and .object! for every object access is very redundant. I think we can provide u...
Avatar
おお、早速。いいですね!
Avatar
沢山シェルスクリプトを書いてようやくmacOS向けのInstaller配布ができるようになりました https://github.com/swiftwasm/swift/releases/tag/swift-wasm-5.3-SNAPSHOT-2020-10-20-a
swift 2
11:50 AM
swiftenvなしで入れられます
Avatar
おー
Avatar
CI上でプロンプト出さずにコードサインするのが鬼門でした
Avatar
仕事が落ち着いたら触りたい
💪 1
Avatar
macOS向けInstaller、インストール後に作成するシンボリックリンクがswift-latest.xctoolchainではなくswift-latestになってる。
Avatar
ホントですね、ありがとうございます 🙏
10:40 AM
アップストリームのスクリプトがそもそもswift-latestになってました… https://github.com/apple/swift/blob/main/utils/darwin-installer-scripts/postinstall
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
実際の配布パッケージswift-DEVELOPMENT-SNAPSHOT-2020-10-24-a-osx.pkgに入ってるpostinstallはこんな感じ。 #!/bin/bash INSTALLED_TOOLCHAIN=$2 rm -f "${INSTALLED_TOOLCHAIN%/*}/swift-latest.xctoolchain" ln -fs "${INSTALLED_TOOLCHAIN}" "${INSTALLED_TOOLCHAIN%/*}/swift-latest.xctoolchain" (edited)
12:44 PM
CIでの.pkg作成を確認しようとしたら https://ci.swift.org 落ちてるぽい。 (edited)
Avatar
そうか、たしかにCIでもインストーラつくってますね。
12:46 PM
メンテでは無さそうだなぁ
Avatar
上記パッケージのビルドログを見る限りswift/utils/toolchain-installerは使ってないと思われる。 https://ci.swift.org/view/Packages/job/oss-swift-package-osx/5218/
Avatar
秘密のシェルスクリプトがあるのか…
Avatar
現在のtoolchainがWasmをサポートしてるかどうか、ってどうやって判定するの?
Avatar
-targetにwasm32-unknown-wasiを渡してみるか、--versionでベンダー名を見るかですかね
Avatar
ふむ。 $ echo 'print("hello")'|swiftc -target wasm32-unknown-wasi - <unknown>:0: error: unable to load standard library for target 'wasm32-unknown-wasi'
5:19 AM
arm64がサポートされてるかどうかビルドしてみないと判らないみたいで、Wasmがどうしてるのか気になったのでした。
5:23 AM
ghcr.io/swiftwasm/swift:latestのダウンロードが遅い…
Avatar
--print-available-targetsみたいなオプションがあると良いんですけどねー
Avatar
clang11でそんな感じのオプションが追加されるかも?ってのを見かけました。
5:28 AM
実際には追加されてないね…
Avatar
一緒にビルドされたllcがあれば--versionで見れるっぽいですね
5:29 AM
$ llc --version LLVM (http://llvm.org/): LLVM version 11.0.0 Optimized build. Default target: x86_64-apple-darwin19.6.0 Host CPU: skylake-avx512 Registered Targets: aarch64 - AArch64 (little endian) aarch64_32 - AArch64 (little endian ILP32) aarch64_be - AArch64 (big endian) ...
Avatar
arm64サポート有無のチェックはこんな感じとすることに。 $ echo 'print("hello")'|xcrun --toolchain org.swift.50320190830a swiftc -target arm64-apple-macos10.9 - -o /dev/null <unknown>:0: error: unable to load standard library for target 'arm64-apple-macos10.9' $ echo 'print("hello")'|xcrun --toolchain org.swift.531202011121a swiftc -target arm64-apple-macos10.9 - -o /dev/null で、同様にWasmをチェックしてみるとエラーになった。 $ echo 'print("hello")'|xcrun --toolchain org.swiftwasm.20201102 swiftc -target wasm32-unknown-wasi - -o /dev/null wasm-ld: error: cannot open crt1.o: No such file or directory wasm-ld: error: unable to find library -ldl wasm-ld: error: unable to find library -lc++ wasm-ld: error: unable to find library -lc++abi wasm-ld: error: unable to find library -lm wasm-ld: error: unable to find library -lwasi-emulated-mman wasm-ld: error: unable to find library -lc clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) docker版はエラーにならない。 $ echo 'print("hello")'|docker run ghcr.io/swiftwasm/swift swiftc -target wasm32-unknown-wasi - -o /dev/null (edited)
Avatar
あー、おー
7:05 AM
xcrunか〜
7:06 AM
xcrunセットするSDKROOTを優先して見ちゃってますね
Avatar
あ、SDKROOKか。
7:11 AM
https://book.swiftwasm.org/getting-started/setup.html に書かれたxcrunを使う方法は使えないということ?
Avatar
SwiftPMはSDKROOTに左右されずに-sdkをコンパイラに渡すのでxcrunでも動くんですよね。
7:13 AM
コンパイラ単体だとxcrunだと駄目ですね。直しておきます 🙏
Avatar
なるほど。
7:16 AM
とりあえず、上記Wasmサポートの検出手順は、手順の汎用性を確認するために試してみただけで、SwiftWasmに対して実用する予定は今のところ無いです。 (edited)
🙏 1
Avatar
上記手順でswiftcを使ったのは、swiftだとビルドに成功しても実行に失敗するから。
Avatar
macOS版.pkgによるswift-latest.xctoolchainシンボリックリンクの作成、既にシンボリックリンクが存在するとシンボリックリンクが指す先に新しいシンボリックリンクを作ってしまう。 https://github.com/swiftwasm/swift/blob/swiftwasm/utils/darwin-installer-scripts/postinstall#L16 これを避けるためにln -fhs …とかに変えるべき。
LN(1) BSD General Commands Manual LN(1) … -h If the link_name or link_dirname is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory.
(edited)
WebAssembly support for the Swift Programming Language - swiftwasm/swift
Avatar
なるほど、デフォルトはリンクを追っかけるんですね
4:04 AM
ありがとうございます 🙏
Avatar
katei氏と呼ばれててそこで切れるんだって思った https://www.publickey1.jp/blog/22/rubywebassemblywasiwebassemblyruby.html
Ruby言語のリファレンス実装、すなわち事実上の標準となっているRubyインタプリタはC言語で実装されています。そのため、このRubyインタプリタもしくはそのソースコードは一般に「CRuby」(もしくは、まつもとゆきひろ氏による実装という意...
Avatar
身のある情報を提供できた 😽
Avatar
https://book.swiftwasm.org の流れでwasmをビルドすると wasi_snapshot_preview1 モジュールの関数一式をimportしたがるwasmファイルが生成されるのですが、これって外せないのでしょうかね?
Avatar
色々とわかってきた。これはwasm-bindgenがすごすぎるんだなぁ
Avatar
WASI-lessバイナリはなかなか面倒なんですよねー。一応TODOとしては挙がっていますが
5:34 AM
WASI無しで表現できるlibcとlibcxxを作るか、Swiftのランタイムから完全にそれらの依存を取り除くかしか無くて。(バイナリいじってゴニョゴニョする手もあるがメンテ大変なのでできればやりたくない) (edited)
5:36 AM
wasm-bindgenはかなり色々やっててすごい
Avatar
WASIの扱いが面倒で、WASI使ってなければ消したいと思って調べてたらwasm-bindgenはWASI無くても動いててどういうことかと思ったら出力先ごとにWASI相当のランタイム実装埋め込んでてすごすぎ〜となった
Avatar
ブラウザでなんかしようと思うとWASI邪魔なんですよね。wasmerの提供するWASIブラウザpolyfillは微妙だし。
5:42 AM
しかしWASIが無いと満足にprintすらできないのは厳しい
Avatar
このツイートを見かけたんですが、標準ライブラリはともかく、言語仕様が軽量化の阻害要因になっている点があるんですっけ?LLVMに落ちてしまえば関係なさそうな?前のわいわいの話みたいに、LTOしやすい/しにくいとかはあるかもですが。 https://twitter.com/mizchi/status/1532215162576379904
本当に書ければ選択肢にはなるんだろうけど、あの言語仕様をAOTとはいえ軽量なランタイムに落とすのかなり無理筋では
6:54 AM
SwiftでWASMアプリケーションを書きたいかはmizchiさんがコメントしてくれます
Avatar
omochimetaru 6/2/2022 6:55 AM
みずちさんが「あの言語仕様」として言及したいのがどういう部分なのかわかんないですけど
6:55 AM
SwiftはRustと比べると
Avatar
軽量というのがサイズ面なのか実行速度面なのか難しい
Avatar
Kishikawa Katsumi 6/2/2022 6:56 AM
ここで言ってるのはサイズですね。
Avatar
omochimetaru 6/2/2022 6:56 AM
Resilencyのためにランタイムで持ってるリフレクションっぽい機能とか
Avatar
Avatar
Yuta Saito
軽量というのがサイズ面なのか実行速度面なのか難しい
このスレッドで↓のように続いているのでサイズかなと。 https://twitter.com/mizchi/status/1532216813932584960
ちなみに、自分が他の言語からの Wasm コンパイルで実用可能/エコシステム構築可能と思ってる現実的なラインは、ランタイムのオーバーヘッドが50kb以内です。これを満たしてるのは no_std な rust だけです。
Avatar
Kishikawa Katsumi 6/2/2022 6:56 AM
50kb
Avatar
omochimetaru 6/2/2022 6:56 AM
Unicodeのための定義情報とか
6:56 AM
KeyPathのためのランタイムとか
6:56 AM
そういうランタイム関数がたくさんあるので、
6:56 AM
ランタイムのバイナリサイズが大きいというのはあるんじゃないかなと思ってます
Avatar
ランタイムキャストやデマングラーのコードが割と重いです
Avatar
omochimetaru 6/2/2022 6:57 AM
あとはこれはLTOでカットできる話とかもあるけどメタタイプとかが埋め込まれてデカいとか
Avatar
Avatar
Yuta Saito
ランタイムキャストやデマングラーのコードが割と重いです
omochimetaru 6/2/2022 6:57 AM
ほ〜
6:58 AM
あとstdlibも普通にデカい気が。AnyHashableとか、純粋に振る舞いのロジックが複雑なためにコード量でかそうなやついろいろあるし。 (edited)
Avatar
Unicode周りはRustは落とした状態でだからフェアな比較じゃないと思っていて、あとはLTOで頑張ればかなり落とせる可能性あるのかなぁと思ってました。
Avatar
その辺はライブラリの作り方が微妙なだけなんですよ。言語仕様はあんまり関係ない。
Avatar
omochimetaru 6/2/2022 6:59 AM
いやでも、規格としてmini Swiftみたいな方言が無いので
6:59 AM
結局フルスペックなstdlibが必要でしょう
Avatar
いや、使わないやつはリンクしなければ良いんですよ
Avatar
omochimetaru 6/2/2022 6:59 AM
あーstdlibの個別のコンポーネント自体はそっか。リンク時にカットできるか。 (edited)
6:59 AM
じゃあランタイム関数だな、どうしようもなさそうなのは
Avatar
今はlibswiftCore.aにSwift.oとしてstdlibのSwiftパートがドーンとあるから、一個でもstdlib関数をリンクすると全部ついてきちゃう
7:00 AM
そすね
Avatar
Kishikawa Katsumi 6/2/2022 7:01 AM
まあサイズはある程度大きくても許容できるように環境がなっていくというのもありますよ。
Avatar
Avatar
Kishikawa Katsumi
まあサイズはある程度大きくても許容できるように環境がなっていくというのもありますよ。
omochimetaru 6/2/2022 7:01 AM
実は僕はそっちのほうにウェブが進むほうが筋が良いと思っています
Avatar
Avatar
omochimetaru
いやでも、規格としてmini Swiftみたいな方言が無いので
これについては、一つの可能性として、SwiftWasmがSwiftのサブセットを仕様策定すれば、それが準公式になりそう。
Avatar
wasmが実用的になる前に回線速度が向上する可能性は全然ありますよね
Avatar
Avatar
koher
これについては、一つの可能性として、SwiftWasmがSwiftのサブセットを仕様策定すれば、それが準公式になりそう。
omochimetaru 6/2/2022 7:02 AM
それはそうですね。ポータブルなSwiftっていう概念が合っても良いと思います。今の所コアチームは方言的な発想にはいつも否定的ですけど
Avatar
Avatar
omochimetaru
実は僕はそっちのほうにウェブが進むほうが筋が良いと思っています
omochimetaru 6/2/2022 7:02 AM
全てのサイトで横断的に、「Swiftランタイム」が使えれば、そもそも合理的だと思うんですよね。
7:02 AM
macOSが出荷してるものを事前にブラウザに入れておくって感じです
7:02 AM
昔のFlash playerと同じ。 (edited)
7:03 AM
幸いSwiftのランタイムは、macOSとのからみで、ランタイムの前方互換性が意識されてるし。
7:03 AM
(という趣旨の意見を以前みずちさんに投げてみたんだけど、実際のところはクロスオリジンセキュリティの観点でそういうモチベーションは低そうらしい・・・
Avatar
Wasmがもっと一般的になってきたら、主要言語のランタイムはブラウザに埋め込む時代が来たりしないのかな?
Avatar
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
Repository for design and specification of the Component Model - GitHub - WebAssembly/component-model: Repository for design and specification of the Component Model
Avatar
Avatar
Yuta Saito
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
omochimetaru 6/2/2022 7:05 AM
いいね。
Avatar
それはよさそう。
Avatar
Avatar
koher
Wasmがもっと一般的になってきたら、主要言語のランタイムはブラウザに埋め込む時代が来たりしないのかな?
omochimetaru 6/2/2022 7:05 AM
現状のブラウザプラグインみたいな感じでユーザーが管理できると良いと思うんですよね
7:06 AM
初回表示の時にいい感じのUXにできるかは気になるけど・・・
Avatar
Avatar
omochimetaru
現状のブラウザプラグインみたいな感じでユーザーが管理できると良いと思うんですよね
そこの一歩が結構厳しい気が。
Avatar
その辺はもうちょっとやりようがありそう
7:07 AM
まあ現状SwiftでWasmの用途としては、既存コードのWebへの移植がメインですね。 (edited)
Avatar
wasmもだけど、フロントエンドで推論回したいとかもあったりするので
7:09 AM
ドデカバイナリをなんとかしてブラウザで扱いたいなというのは今後叶っていって欲しいところ
Avatar
インターネットがはやくなってほしい
Avatar
Avatar
Yuta Saito
まあ現状SwiftでWasmの用途としては、既存コードのWebへの移植がメインですね。 (edited)
omochimetaru 6/2/2022 7:12 AM
移植用途だと方言は厳しいよな〜
Avatar
そもそも、方言はメンテ出来るパワフルな人が居ればやるかもしれないけど、現状きびしいですねぇ
Avatar
人的リソースが厳しいのか・・・。逆方向はあり得るのかなと思ってたけど。Wasmに最適化されたSwiftのサブセットで、サブセット用に書かれたコードは本家でも実行できる、みたいな。
7:15 AM
第三者がやっても広く利用されるのは厳しいと思うけど、SwiftWasmのプロジェクトとしてなら受け入れられそう。
Avatar
omochimetaru 6/2/2022 7:17 AM
どの機能を取り除くとどのくらいバイナリサイズがカットできて、一方でどういう問題が起きるか、を整理するだけでもかなり大変そう。
Avatar
そうなんですよ、まず分析が必要。
7:19 AM
分析するにはコンパイラを触れる人が必要で、一方でそういう人はUpstreamingで手が一杯
Avatar
omochimetaru 6/2/2022 7:19 AM
今回のRegex関係とかもそうだけど
7:20 AM
未だに結構バンバンビルドとかリンク構成とかが更新されるしね。
7:20 AM
この前のConcurrency runtimeとかもそうだな。
7:21 AM
コンパイラのローレベルな生成部分だけ対応しておけば後は自動的に・・・って行ってないのが大変そう。 (edited)
Avatar
人員絶賛募集中
Avatar
omochimetaru 6/2/2022 7:21 AM
7:23 AM
7:23 AM
@Yuta Saito WASM Swiftコントリビュータを増やすようなトークをすると良いのでは!
Avatar
Avatar
omochimetaru
@Yuta Saito WASM Swiftコントリビュータを増やすようなトークをすると良いのでは!
iOSエンジニアが将来SwiftでWebフロントエンド開発できる理想の(しかし夢物語ではないくらいの)未来を語って、現実とのギャップの大きさと目下の課題を示して人材をリクルートとか?w
Avatar
ww プロポーザルのプロポーザルが出てきた
😅 1
Avatar
Avatar
Yuta Saito
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
これどうなんでしょうね。トラッキング対策で HTTP キャッシュが origin (もしくは per-site?) ごとに分割されて、JSのライブラリをキャッシュ目的で Public CDN から引いてくる意味が薄くなった…という話と同じ末路になりそうな気もしますが…
Avatar
omochimetaru 6/2/2022 8:07 AM
ああーそうか、トラッキングに使えてしまうのか
Avatar
そこはそうなんですよねぇ
Avatar
omochimetaru 6/2/2022 8:13 AM
ライブラリ自体は各サイトがホストしつつ、ダウンロードするときに別サイトでダウンロードした同一ファイルのハッシュ値でキャッシュ問い合わせするのだとどうかなあ
Avatar
サイドチャネル的にダウンロード時間を計測するんですよ
Avatar
フィンガープリンティングに利用されるんですよね…
Avatar
omochimetaru 6/2/2022 8:14 AM
キャッシュが効いて早かった事がもうダメなのか
Avatar
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
μSwift[Core]. Contribute to compnerd/uswift development by creating an account on GitHub.
👀 1
9:42 AM
これをガリガリ育ててSwiftWasmのランタイムとして採用しようという話もあった
Avatar
Avatar
Yuta Saito
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
omochimetaru 6/2/2022 9:49 AM
おーArrayもStringもない
9:52 AM
Runtimeのswift_getGenericMetadataとか中身空っぽだけど
9:52 AM
どこまで何を実装するんだろう
Avatar
わかんないですねぇ
Avatar
omochimetaru 6/2/2022 9:55 AM
計画書があれば読んでみたいなあ
Avatar
compnerdに凸
Avatar
omochimetaru 6/2/2022 9:55 AM
ジェネリクス回りとか
9:56 AM
全てスペシャライズする方針って可能なんだろうか?
9:56 AM
C++みたいに。
9:56 AM
そうすると外せるものが結構増えそうに思うけど
Avatar
最終的なビルド時にソースが全部見えてれば理論的には出来るんじゃないですか?
Avatar
omochimetaru 6/2/2022 9:57 AM
メタタイプをexistencialから渡して型を構成したりしたら無理か?
9:57 AM
一度eraseされちゃうから
Avatar
むりかなぁ
Avatar
omochimetaru 6/2/2022 10:00 AM
無理な気がするね
10:00 AM
rustって言語が提供するerasureどうなってるんだっけ
Avatar
This module implements the Any trait, which enables dynamic typing of any 'static type through runtime reflection.
10:02 AM
Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.
Avatar
omochimetaru 6/2/2022 10:03 AM
そうだ、dynだった
10:03 AM
普通にメソッド呼び出しでopenできとるな
Avatar
でも全部スペシャライズするのってサイズ的に嬉しくないんですよ
Avatar
omochimetaru 6/2/2022 10:09 AM
たしかに・・・
10:09 AM
結局アプリケーションのコードサイズが増えてしまうか。
Avatar
omochimetaru 6/5/2022 7:38 AM
iOSDC Japan 2022 にプロポーザルが投稿されました! 「The state of Swift for WebAssembly in 2022」 / kateinoigakukunさん (@kateinoigakukun) https://t.co/VIjC9TqxrT
Avatar
(このサーバにいる人にはリクルートも兼ねていることがバレてる…)
😉 4
👍 2
Avatar
Kishikawa Katsumi 7/5/2022 8:32 AM
SwiftのWasmのデバッグってどうやるのがいいのかな。Browserで動かす以外に簡単な方法はないんでしたっけ?
Avatar
高度なテクニック知らなくて毎回printfデバッグしてます・・
Avatar
Kishikawa Katsumi 7/5/2022 8:53 AM
そうなんですね。じゃあある程度動くまでは手元で普通のSwiftとして動かしていけそうになったらBrowserに載せて、って感じがいいかな。
Avatar
基本はそうですね。乗っけないとわからない部分でprintfしてます
Avatar
今回のやつだとJS使ってないので、WASI互換のランタイム、wasmtimeとかならそのまま実行できます
👍 1
9:05 AM
まあ、普通にネイティブでデバッグするのがおすすめです
Avatar
Kishikawa Katsumi 7/5/2022 9:06 AM
wasmtime hello.wasm っていう形で動かせるんですね。
9:07 AM
ブラウザで動かすのはそこそこセットアップが必要だからwasmtimeで動かせるのは結構いいかも。
Avatar
@Iceman そういえばこれどうやって見つけたんですか?JSClosureのuse-after-freeがどっかにあるな〜とは思っていたけど再現できてなかったので名探偵とてもありがたかったです。 https://github.com/swiftwasm/JavaScriptKit/issues/218
JSClosure stores its identifier and tell it to JS for bridging, but the identifiers has a trouble. hashValue is used for the identifier, but hashValue is not guaranteed to be unique. JavaScriptKit/...
Avatar
Avatar
Yuta Saito
@Iceman そういえばこれどうやって見つけたんですか?JSClosureのuse-after-freeがどっかにあるな〜とは思っていたけど再現できてなかったので名探偵とてもありがたかったです。 https://github.com/swiftwasm/JavaScriptKit/issues/218
グッとコードを見つめました
t_sasuga 1
Avatar
www
Avatar
すごい
Avatar
経緯としてはreference typesについて調べてて、そういえばJavaScriptKitはJSClosureをいい感じにJSに渡しつつメモリ管理してたような?と思ってコード読んでたらrelease() は手動か〜となって、周辺コードみてたら発見しました
Avatar
なるほど〜
6:07 AM
reference typesはLLVM側のサポートがまだ手薄なんですよねぇ
Avatar
VaporでもこういうhashValueを使った間違いあったりして敏感になってました
Avatar
hashValue警察たすかる
Avatar
reference typesはホストのオブジェクトをwasm内部に持ち込むのはできそうだけど、逆はできるんかなみたいなことを調べてました
6:08 AM
swiftクラスへの参照をホスト側に持たせたい的な
Avatar
そこはgcプロポーザルの範囲ですね
6:09 AM
で、LLVMファミリーでgcオブジェクトを素直に使うのはなかなか難しいんじゃないかなぁという見解です
Avatar
ffiの永遠の課題ですね
Avatar
ffiむずかしい
Avatar
@Yuta Saito https://github.com/swiftwasm/swiftwasm-docker/commit/03216bba5d4c879d9c9aad690e8197f8268e468d これjammyのイメージ消えたのって何でですか?
Avatar
5.7.1ではjammy向けのツールチェインをビルドしてなかったので。。
👀 1
2:07 PM
ダウンロードに失敗してビルドコケてる様子 https://github.com/swiftwasm/swiftwasm-docker/actions/runs/3133069282/jobs/5086054881
Avatar
あ、なるほど。言語側がそもそもjammyに対応できていないということですか?
Avatar
5.7ブランチのnightlyではjammyビルドあるんで、新しくタグ打てば良いんですが。
2:09 PM
そこまで困ることないだろうし5.8からでいいかなと思って今の所やってないですー
2:09 PM
言語側はjammy対応されてます
Avatar
ほんとだ。確かに結構最近のやつからjammyに対応してる
2:11 PM
5.7.1まだなかったんですね (edited)
2:11 PM
理解しました。ありがとうございます
2:12 PM
とくに困ってはないです
Avatar
どもども。困って無くてよかった
Avatar
@Yuta Saito var dic: [Int: CInt] = [0: 42] func getValue() -> CInt { dic[0] ?? -1 } この関数の返り値が-142 のランダムになるっていう不思議現象に遭遇したのですが、何か原因に心当たりありますか? 簡単な再現手順も用意しました https://github.com/sidepelican/SwiftWasmDicIssue
Avatar
おおー、色々要因がありそうでむずかしいですねぇ
2:53 AM
とりあえず環境変数SWIFT_DETERMINISTIC_HASHING=1でハッシュのシード固定して再現するか見てもらえますか?
2:53 AM
あ、でもサンプルでWASI ABIの違反があるな
Avatar
おおーSWIFT_DETERMINISTIC_HASHING=1つけたらうまく動くようになりました
Avatar
exportを複数回外から呼ぶ場合はreactorモードというやつでビルドしないといけないんですよね
Avatar
初耳だ
2:54 AM
最近書き足したのでこちらを
👀 1
Avatar
❯ swiftc -target wasm32-unknown-wasi Lib.swift -o Lib.wasm -Xlinker --export=get_value -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor <unknown>:0: error: unknown argument: '-Xswiftc' <unknown>:0: error: unknown argument: '-mexec-model=reactor'
2:57 AM
これ順番大事なんでしたっけ?
Avatar
えーと、swiftc直接叩く場合は -Xswiftc を削って大丈夫ですー (edited)
2:58 AM
あ、ドキュメントがまちがっておるな
Avatar
あ、なるほど?例のほうも間違ってそうですね
Avatar
直しておきます〜 🙏
Avatar
-Xclang-linker -mexec-model=reactor 足したら _start がいなくなってしまった
Avatar
ですねー、なので _initialize を代わりに。
Avatar
wasmer/wasiはそれで許されてる?
3:03 AM
nodeのwasiは_startじゃないと許してくれないっぽいですね
Avatar
Node.jsのwasi実装では専用のメソッドが生えてるんですよ https://nodejs.org/api/wasi.html#wasiinitializeinstance
Avatar
そっちから呼んでも _startくれって怒られちゃうんですよね
Avatar
えぇ〜
Avatar
うわ、嘘でしたすみません
3:05 AM
手ミスでした
Avatar
なるほどw
Avatar
そして、reactor指定したら毎回必ず -1 が返りますねw
Avatar
main呼んでますか?
3:06 AM
トップレベルにコードある場合それ呼ばないとだめですね
Avatar
なるほど・・。呼んでませんでした。呼んだら 42 になりました
Avatar
おおー
Avatar
つまりreactorモードにうまくできていれば問題は解決しそうです
3:08 AM
ちなみにこのreactorモードって、exportしてる関数全体にかかるものですか?(.c経由して -Xlinker オプション使わずにexportしてても大丈夫?)
Avatar
でもこれは所見じゃ気づけ無いよなぁ。良い感じの診断を出せると良いんですが
3:09 AM
大丈夫です
3:09 AM
wasm-ldでリンクするときにexportエントリにラッパが挟まるか否かが変わるだけなので (edited)
Avatar
なるほど。全然わかんなかったのにすぐ解決して助かりました。ありがとうございます!
🙏 1
Avatar
omochimetaru 1/5/2023 5:59 AM
このスレむずいな
Avatar
commandモードとreactorモードのwat見比べてみると、commandモードの方がexportされた関数それぞれの先頭で何か関数を実行してるんですね
1:57 PM
reactorモードは特に何もしないっぽい
1:58 PM
この毎回先頭で呼んでるのがmain相当の処理なのかな
Avatar
それでctor/dtorを実行するタイミングが変わるんですよね
Avatar
いやmain相当の処理は_startのはずか
2:00 PM
ん?_initializeにはmain入ってないからそうではないか
Avatar
_startはcommandモードではctor,main,dtorの順で呼んで、
2:01 PM
reactorモードの_initializeはctorだけ呼んで、main関数を呼ぶかどうかはユーザ次第になってます
Avatar
dtorってmain関数内で生成された各種インスタンスを破棄する関数のことですか?
Avatar
commandモードでexportされた関数は_startと同様にctor,関数本体,dtorの呼び出しシーケンスになるようにリンカが調整してます
Avatar
ああ、つまりstartでもctor,main,dtorするし、各種export関数でもctor, func, dtorと呼び出されるのか
Avatar
ctor/dtorはグローバル変数のコンストラクタデストラクタのために使われたりします
Avatar
ていうかwasmって高階関数持てるんですね
Avatar
でもctorはもっぱらmain関数より前に実行する目的で使われることが多くて、Swiftの場合だとメタデータリストの構築だったり、ハッシュシードの取得だったりで使われてます
Avatar
Avatar
Iceman
ていうかwasmって高階関数持てるんですね
お、どのレイヤの話でしょう
Avatar
call 27 block (result i32) ;; label = @1 global.get 0 ... こういう呼び出しがあって (edited)
2:09 PM
27は (func (;27;) (type 20) (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 f64) こう定義されてて、 type 20(type (;20;) (func)) だったのでこれ関数型なのかな?と
2:10 PM
exportされた関数全てが初手でcall 27をしてて、ctor/dtorでラップする動作とあってるなぁと
Avatar
関数型はあるけど、関数のパラメータ部分には拡張仕様がないと取れないやつです
2:12 PM
そこの型は単純に27番目の関数が0引数0返り値の関数であることを示してるやつですね (edited)
Avatar
雰囲気で早とちりしてしまった
2:14 PM
よくみたらおしりでdtor呼んでる様子があった
2:16 PM
しかしcommandモードかreactorモードかって結構動作に重要な影響がある上にWASIのセットアップ方法も変化するのに、概念として難しいしビルド設定もunsafeな記述が必要で厄介ですね
2:21 PM
僕が以前JSからSwift関数を高速で呼び出したらめちゃくちゃ重いと発言したけど、実は1呼び出しごとにSwift全体の初期化をしててそれが重かった説はありそうだなぁ (edited)
Avatar
Avatar
Yuta Saito
_startはcommandモードではctor,main,dtorの順で呼んで、
omochimetaru 1/6/2023 1:38 AM
デストラクタも呼ばれるのってなんで?
1:39 AM
いや、mainが呼ばれてるからそうなのか? プロセスが終わってるみたいで変な感じ
1:40 AM
実際プログラムが終わった状態を期待してそうです
Avatar
omochimetaru 1/6/2023 1:47 AM
ほおー、、、 reactor modeの方がいいなと思ったけどwasm runtimeの中にイベントループあるのか うーん
Avatar
JSの中で使うなら基本的にreactor一択です
Avatar
omochimetaru 1/6/2023 1:50 AM
そうよね
Avatar
omochimetaru 1/6/2023 2:05 AM
イベントループ(の切れ端?)をゲスト言語の実装で提供しないと大変そうな気がするけど、結局根元で呼ぶところに共通の仕組みが必要だからランタイム側にあるのでよいのかな (edited)
Avatar
Venturaにあげたせいかわからないけど、いつも通りのビルドコマンドでTSCUtility/Triple.swift:252: Fatal error: WebAssembly/WASI doesn't support dynamic library yetいわれるようになった・・・
2:43 PM
もう消えてるエラーメッセージっぽいけど、どっからこれ出てくるんだ
2:45 PM
うわーこれPackagePlugin起因だ
2:46 PM
やっぱPackagePluginをアプリと同じPackage.swiftにいれちゃだめだな
Avatar
Swift 5.7 の SwiftWasm のツールチェーンだとまだ入っていなかった記憶がありますが,それ以降のツールチェーンだとその PR の変更が入っていて無事だった気がします (少なくとも 10 月の DEVELOPMENT-SNAPSHOT だと含まれていました) (edited)
Avatar
(無事だったというのは,実際には使っていないターゲットが .dynamic なときも巻き込まれクラッシュするのが防げるという意味でした)
Avatar
なるほど、まだ入ってないならこうなりそうですね。 ツールチェーン同じなのに挙動が変わってびっくりしてましたがうっかりdylib依存のあるdependencyを追加したせいだったので、まさしくその通りことが起きてそうです
Avatar
wasm側で5.7.1リリースした後にそれ直すパッチをSwiftPMの5.7ブランチに入れてもらったので、スナップショットにしかその修正入ってないんですよねー
Avatar
GitHub Actionsでswiftwasmを使ってビルドをしようしたら、stdio.h が見つからないという不可解なエラーが出ました。 [0/3] Compiling CWasmCallableKit XcodeSupport.c 836 In file included from /home/runner/work/CodableToTypeScript/CodableToTypeScript/demo/.build/checkouts/WasmCallableKit/Sources/CWasmCallableKit/CWasmCallableKit.c:1: 837 /home/runner/work/CodableToTypeScript/CodableToTypeScript/demo/.build/checkouts/WasmCallableKit/Sources/CWasmCallableKit/include/CWasmCallableKit.h:4:10: fatal error: 'stdio.h' file not found 838 #include <stdio.h> 839 ^~~~~~~~~
12:44 AM
マシン環境は ubuntu 20.04 で、このスクリプトを使って構成しています https://github.com/omochi/CodableToTypeScript/pull/80/files#diff-9a140f01463ab576fb80ab1ff7ae2fdffd63bf4a3067157756b7659399f620f8
12:45 AM
ローカルのDocker環境だとうまく行ったのですが、GitHub Action上だとこの問題が発生するので、解決しようにもイテレーションが回せなくて困ってます 助けてください (edited)
12:45 AM
/usr/includestdio.h があることは確認できているので、
12:46 AM
更に調べるために、swiftがビルド時に見に行っているinclude dirsを調べる方法を知りたいです
12:46 AM
また、swiftwasmツールチェーンのインストール方法に問題がないか知りたいです
Avatar
GitHub ActionsのUbuntu20.04ってデフォでswift入ってませんでしたっけ? swift —versionした結果が気になります
Avatar
調べてみます
12:56 AM
+ which -a swift 98 /usr/local/bin/swift 99 + swift --version 100 Swift version 5.7.2 (swift-5.7.2-RELEASE) 101 Target: x86_64-unknown-linux-gnu
12:56 AM
うわ〜なるほど
12:56 AM
+ which -a swift 392 /usr/local/bin/swift 393 /usr/bin/swift 394 + swift --version 395 /bin/swift 396 Swift version 5.7.2 (swift-5.7.2-RELEASE) 397 Target: x86_64-unknown-linux-gnu
12:56 AM
元から入っているSwiftのほうが /usr/local/bin にあるのでそっちが使われてしまっていました・・・ 最初から入っていたのか〜
12:58 AM
これは、どうするのがいいんだ・・・?
Avatar
macOSでは https://swiftenv.fuller.li/en/latest/installation.html を便利に使ってますが、これLinuxでも動くのかな?
1:00 AM
あとswiftwasmをセットアップしてくれるGitHub Actionsがあったような気もするんですよね
1:01 AM
GitHub Action with SwiftWasm toolchain and SDK preinstalled - GitHub - swiftwasm/swiftwasm-action: GitHub Action with SwiftWasm toolchain and SDK preinstalled
1:02 AM
カスタムなツールチェーンには対応してないかもしれない
1:03 AM
あとは単純に https://book.swiftwasm.org/getting-started/setup.html に従って、PATHを通すだけでもいけそうに思います
Avatar
omochimetaru 1/14/2023 1:06 AM
まあそうか /usr/bin に入れないで、別のところに置いてPATH通せばいいだけか
Avatar
あとGitHubActionsのUbuntu22.04はデフォでSwift入ってないのでそちらを使う手も。
Avatar
omochimetaru 1/14/2023 1:07 AM
それは将来swiftが入って壊れそうw
Avatar
確かにその可能性はありますね。イメージサイズ削減のために消された形なのであまりないとは思いますが。
Avatar
omochimetaru 1/14/2023 1:08 AM
そうなんですか。わざわざ消したなら20と22でズレてるの気持ち悪いですね
Avatar
22は色んなものが消えましたね
Avatar
omochimetaru 1/14/2023 1:10 AM
やばw ubuntu-latest 罠やん
Avatar
norio_nomura 1/14/2023 1:15 AM
GitHub Actions runner images. Contribute to actions/runner-images development by creating an account on GitHub.
😲 1
Avatar
本当だ!公式の最新情報を見るのが大事…
Avatar
norio_nomura 1/14/2023 1:19 AM
あと、手元のDockerで動いてるならciもubuntu-latestでDocker使うとか。
Avatar
omochimetaru 1/14/2023 1:20 AM
あ〜なるほど・・・
Avatar
norio_nomura 1/14/2023 1:22 AM
ビルドキャッシュを効かせれば、ci内に環境構築するより速くなりそうな気もする。
Avatar
omochimetaru 1/14/2023 1:34 AM
swiftwasmのswiftが通るようにしたらうまく行って先に進みました。
Avatar
Avatar
Iceman
あとswiftwasmをセットアップしてくれるGitHub Actionsがあったような気もするんですよね
ツールチェイン入れるだけのアクションもありますー https://github.com/swiftwasm/setup-swiftwasm
An action to download a prebuilt SwiftWasm toolchain and add it to the PATH - GitHub - swiftwasm/setup-swiftwasm: An action to download a prebuilt SwiftWasm toolchain and add it to the PATH
Avatar
omochimetaru 1/14/2023 4:46 AM
あったか
Avatar
omochimetaru 1/14/2023 4:59 AM
toolchainPath/usr/bin にインストールして addPath してるから自作したやつと原理は同じっぽいな
Avatar
うおー気づかんかった 便利
5:44 AM
.swift-version読んでくれるのか
Avatar
omochimetaru 1/14/2023 5:44 AM
あれ,マジ?アクションymlで指定する必要なかったか (edited)
Avatar
リポジトリルートの .swift-versionじゃないからだめかも
1:00 AM
usesとworking-directoryは一緒に使えなかった
Avatar
@Yuta Saito https://github.com/swiftwasm/swift-corelibs-foundation にIssuesがないのって意図的でしょうか?WasmのFoundationに関するIssueはswiftwasm/swiftに投げれば良いですか?
Avatar
おー、意図的ではなかったです。多分フォークした時の設定が引き継がれてるっぽい
t_naruhodo 1
1:37 PM
Issues有効にしときました
Avatar
ありがとうございます
Avatar
ここの挙動の違いでつまづいたときに iceman さんと同じことを思ってましたが意図していなかったのですね (issues が無効なことを) https://github.com/swiftwasm/swift-corelibs-foundation/blob/6c0904ed27fe693f2a50520ae526c86d15afe1ef/Sources/Foundation/NSURL.swift#L214 (edited)
The Foundation Project, providing core utilities, internationalization, and OS independence - swift-corelibs-foundation/NSURL.swift at 6c0904ed27fe693f2a50520ae526c86d15afe1ef · swiftwasm/swift-cor...
Avatar
Avatar
Yuta Saito
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
↓がマージされたおかげで公式のコンパイラでもビルドできるようになってそうですね. https://github.com/apple/swift/pull/35970
This allows building the Swift standard library for targets which may not have an actual OS running. This is identified by the OS field in the target triple being set to none. Replace this paragr...
Avatar
単に自分の環境に問題がある可能性もありますが,今日のツールチェーンから macOS で実行できなくなってしまいました.CI の macOS と Xcode バージョンが最近上がったっぽいのでもしかしたら影響してそうな気もしますが. https://github.com/swiftwasm/swift/issues/5387 (edited)
Description The DEVELOPMENT-SNAPSHOT-2023-04-25-a toolchain doesn't seem to be run on macOS because /Users/gha-runner/homebrew/opt/zstd/lib/libzstd.1.dylib is dynamically linked into some execu...
Avatar
お、把握してなかったのでありがたいです
3:08 PM
zstdか… LLVMが依存してたようなしてなかったような
3:13 PM
これかー。とりあえずmacos-arm64のビルドマシンからzstd消せば良さそうな雰囲気 https://reviews.llvm.org/D128465
Avatar
おお,なるほど.llvm-project の upstream の変更は結構遅れて入ってくるんですね.
3:38 PM
と思ったらこっち自体には upstream 側が変更されたらすぐに入っているんですね. https://github.com/apple/llvm-project/commit/e939bf67e34037970192fa90ad22ab7628f5de33
  • add zstd to llvm::compression namespace
  • add a CMake option LLVM_ENABLE_ZSTD with behavior mirroring that of LLVM_ENABLE_ZLIB
  • add tests for zstd to `llvm/unittests/Support/CompressionTes...
Avatar
あー,swift-DEVELOPMENT-SNAPSHOT-2023-02-28-a の時は stable/20220421 branch だったのが,swift-DEVELOPMENT-SNAPSHOT-2023-04-25-a では stable/20221013 branch に切り替わって,zstd の変更がちょうどその間の期間の変更だったから入ってきた感じみたいですね.
👍 1
Avatar
omochimetaru 9/19/2023 9:02 AM
Today, there is no way to create an "export" from Swift. (The current workaround is using @_cdecl and linker option, or linking C source1). This PR adds a new variant of @_expose attribut...
🎉 10
t_kami 4
9:02 AM
Appleでインターンしてるkatei先生がwasm関連パッチをSwiftリポジトリに投げているが
9:02 AM
rdar番号が付いてるってことは・・・?
9:04 AM
隙間でやってるOSS業ではなくインターン業なのではなかろうか
t_tsuyoi 3
Avatar
家庭さんがApple公式CIにWASMを追加しようとしている。その他いろいろ。
1:01 AM
いや、それはもとからあったのかな?
Avatar
わいわい
Avatar
https://zenn.dev/chikoski/articles/webassembly-interface-type-101 WebAssembly Interface Typeっての初めて知りました。 いままでJSから利用する際は言語ごとに専用のランタイムと各種グルーコードをコード生成していたように思いますが、標準仕様があると利用側のランタイムやコード生成を任せられて便利そうですね (edited)
Avatar
WebAssembly Runtime written in Swift. Contribute to swiftwasm/WasmKit development by creating an account on GitHub.
Avatar
おお、もうあるのか
1:52 AM
これはSwiftコード上でWasmを動かすためのラインタイムか (edited)
Avatar
Swiftライブラリをwitと合わせて吐き出す(あるいはwitからSwiftコードを生成して、それに合わせたライブラリを作ればいい感じに配布できる)みたいなやつはありますか?
Avatar
そこに入ってるWITToolコマンドのgenerate-overlayとというのがそれにあたりそうです
Avatar
おお
Avatar
いままで preset=buildbot_linux_crosscompile_wasm @swift-ci Please test with preset Linux Platform と詠唱しないといけなかったのが楽になった
t_naruhodo 1
Avatar
なるほど.utils/build-presets.ini には入っていたからそんなに大きな変化ってわけじゃないんですね.
Avatar
ci.swift.orgでメインブランチのテストもしてもらえるようになったので、僕らがメンテしてるci-external.swift.orgのノードを消せるのは個人的には大きいですが笑 (edited)
t_naruhodo 1
Avatar
Package.swift 内で wasm32-unknown-wasi 向けのビルド時だけ分岐させる方法をご存知の方がいればお聞きしたいです.(beginner-help でやるべき話かもしれないですが) 単純に #if os(WASI) だとうまくいかないですし,やりたいのが cSettings.define を wasm32-unknown-wasi 以外の時だけ指定させたいので .define("HOGE", .when(platforms: [.wasi 以外を全部列挙])) みたいなのも試したんですが,.wasi 以外を全部列挙しないといけないのが微妙で...
Avatar
現状のSwiftPMのAPIでは表現できなさそうですねぇ。
7:09 PM
ちなみに具体的にはどういうケースですか?
Avatar
swift-markdown が依存している swift-cmark をこの define なしでビルドしたいんですよね.まだ thread サポートが入っていなくて適切な分岐に入らないので. https://github.com/apple/swift-cmark/blob/2c47322cb32cbed555f13bf5cbfaa488cc30a785/Package.swift#L18
CommonMark parsing and rendering library and program in C - apple/swift-cmark
Avatar
なるほどーソースを編集したくないケース
Avatar
これがあることによってここでスレッドサポート前提の分岐に入っちゃうので,_POSIX_THREADS も見つからなくて Windows でもないので,必要なマクロが定義されないので,スレッドサポートしていない方の分岐に入って欲しい感じです. https://github.com/apple/swift-cmark/blob/2c47322cb32cbed555f13bf5cbfaa488cc30a785/src/include/mutex.h#L6
CommonMark parsing and rendering library and program in C - apple/swift-cmark
Avatar
SwiftPMに新しいAPIを生やす以外に綺麗な方法は無さそうです…
Avatar
うーむ,やはりそうですよね... not みたいなのが議論されてないか Forums 漁ってみます.
🙏 1
Avatar
SE-0238 関連はあんまり議論がなさげですね... 同様の仕組みを使っている SE-0273 とかまで含めて探せばまだあるかもしれませんが. https://forums.swift.org/t/se-0238-package-manager-target-specific-build-settings/18341 ただ,今回の例に限っては .define("CMARK_THREADING", to: "0", .when(platforms: [.wasi])) で上書きすればいけるような気もしてきました. (ダメでした) (edited)
Hello Swift community, The review of SE-0238 “Package Manager Target Specific Build Settings" begins now and runs through December 4, 2018. Reviews are an important part of the Swift evolution process. All reviews should be made in this thread on the Swift forums or, if you would like to keep your feedback private, directly in email to me as t...
Avatar
omochimetaru 3/3/2024 10:13 PM
全部列挙で良いんじゃないかしら?
10:14 PM
下限OSバージョンとかも、そもそもPackageのplatformsに書いてないものは、非対応って扱いですし
10:16 PM
毎回列挙するとメンテしにくいので、そこはlet notWasi =とか一度変数にいれとく
Avatar
新しく例えば .visionOS (これはもうある) とか .freeBSD とかが指定できるようになった場合に追加し忘れで意図せず制限をかけちゃうのが良くないと思うんですよね. (edited)
Avatar
他にも .openbsd みたいに SwiftPM のバージョンが新しくないと指定できないやつとかに対応させようと思うと Package.swift をバージョンごとに増やす必要が出てきたり,.custom の扱いがよくわからなかったり,全部列挙は問題点が多くメンテナンスコストも高いように思います. https://developer.apple.com/documentation/packagedescription/platform/openbsd
Avatar
omochimetaru 3/4/2024 12:29 AM
まさにそのような観点での考え方の違いなのかと思っています。 visionOS や freeBSDが追加されたタイミングで、 その定義が追記されていないということは、 ライブラリの著者が実際にそのターゲットでビルドした事も無いはずです。 そして、その未知のターゲットについてはビルドも動作も見ていないのだから、 ライブラリの宣言としては非対応と考えるのが正しいのではないかと。 例えば、Foundation.URL.init(filePath:) のような新しいAPIは、 macOS 13以上、iOS16以上で提供されるわけですが、 こういった呼び出しが含まれるライブラリを持っていたとして、 SwiftPMにvisionOSが追加されたタイミングで、 「このAPIがvisionOSではいつから利用できるのか?」を調べて下限バージョンとして宣言するまでは、 このライブラリはvisionOSでは使えない、というのがデフォルト状態で正しいと思います。 (edited)
Avatar
そういう考えがあっても良いとは思いますが SwiftPM のデフォルト挙動はそうじゃなくて「書いてなかったら使える」となっているので,target specific build settings で not を表現しようとしたら急に考え方が変わるというのが気持ち悪さを感じる点です.
Avatar
omochimetaru 3/4/2024 12:45 AM
SwiftPM のデフォルト挙動はそうじゃなくて「書いてなかったら使える」となっている
platformsが空の時は急に全部使えることになってるのはおかしいと思ってます。確かにポリシーが矛盾してますね。
12:47 AM
「デフォルト」には、将来追加されうる未知のプラットフォームで、Unixライクではない全然違うもの(組み込みマイコンとか)も含まれうるので、デフォルトOKは厳しいと思うんですよね
Avatar
condition: .when(platforms: [...]) とかの platforms のことじゃなくてもしかして .package の platforms の話をされてますか?そっちは .linux とかその辺がそもそも指定できないのでまた話が変わってくると思います.
Avatar
omochimetaru 3/4/2024 12:50 AM
あ、はい、そうです。↓で書いたつもり。
下限OSバージョンとかも、そもそもPackageのplatformsに書いてないものは
Avatar
あれって noppe さんの Playdate SDK とかでは .custom でうまいこと使われてましたが,基本的に Apple Platform のためだけにあるという認識でした.
Avatar
omochimetaru 3/4/2024 12:52 AM
うーん確かに、conditionには.linux が書けるのに、 Package.platforms は宣言なしでlinuxが使えることになってますね。
12:53 AM
Packageに関しては Apple以外はデフォルト状態でサポートしてしまう、というか非サポートを書くこともできないのか。 (edited)
Avatar
宣言なしで使えるというかそもそも宣言したくてもできないです.conditional な依存関係やビルド設定のためにある Platform と,SupportedPlatform は別で,omochimetaru さんがおっしゃってる箇所は SupportedPlatform を記述するところなんですがそっちは linux が存在しないんですよね. https://developer.apple.com/documentation/packagedescription/platform https://developer.apple.com/documentation/packagedescription/supportedplatform
A platform supported by Swift Package Manager.
A platform that the Swift package supports.
12:55 AM
error: 'hoge': Invalid manifest (compiled with: ["/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/bin/swiftc", "-vfsoverlay", "/tmp/TemporaryDirectory.NMzSPB/vfs.yaml", "-L", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-lPackageDescription", "-Xlinker", "-rpath", "-Xlinker", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-swift-version", "5", "-I", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-package-description-version", "6.0.0", "/home/kebo/hoge/Package.swift", "-Xfrontend", "-disable-implicit-concurrency-module-import", "-Xfrontend", "-disable-implicit-string-processing-module-import", "-o", "/tmp/TemporaryDirectory.OgHbDE/hoge-manifest"]) /home/kebo/hoge/Package.swift:8:18: error: type 'SupportedPlatform' has no member 'linux' 6 │ let package = Package( 7 │ name: "hoge", 8 │ platforms: [.linux], │ ╰─ error: type 'SupportedPlatform' has no member 'linux' 9 │ targets: [ 10 │ // Targets are the basic building blocks of a package, defining a module or a test suite.
12:57 AM
SupportedPlatform はドキュメント見るとわかるとおり Apple プラットフォームしか存在してないです.
Avatar
omochimetaru 3/4/2024 1:00 AM
なるほど。そうすると確かに非Apple環境はどれもデフォルトで許されている状態で、conditionのところで絞り込む考え方になっているから、 将来追加される全く新しい未知の対象についても、とりあえずビルドできるとする方に倒れているので、not operatorがあった方がいい気がしてきました。 (edited)
t_desudesu 1
Avatar
これは1つの解決になりそう https://github.com/apple/swift-package-manager/pull/7084
Add CaseIterable conformance to Platform Motivation: Close #4478 Sometimes downstream package only cares about excluding a given platform (eg. wasi). And each package need to maintain a supportedPl...
👏 1
Avatar
Motivation がまさに!って感じですね.
Avatar
omochimetaru 3/4/2024 8:29 AM
structでもCaseIterableにできるんだ 自動実装がされないだけか
Avatar
これみたいに macro で自動生成できないんだろうか https://forums.swift.org/t/introducing-staticmemberiterable-swift-macro/65454
StaticMemberIterable Confidently cover all static members. Like CaseIterable, this macro creates an array of all the static members of a type. This is useful when a type has a few examples as static members. Here, we have a Chili type so that we can discuss the heat level and names of various chilis. So far, we have two: jalapeño and habenero. ...
Avatar
omochimetaru 3/4/2024 8:36 AM
case相当とは関係のないメンバを巻き込んでしまいそう (edited)
Avatar
SwiftPMのビルドにマクロ入れたくない…
👀 1
t_naruhodo 1
Avatar
Avatar
Yuta Saito
SwiftPMのビルドにマクロ入れたくない…
omochimetaru 3/4/2024 8:36 AM
でもEquatableとかマクロになることを目指してるからいずれそうなりそう
Avatar
いやぁプロジェクト固有のマクロを入れるのとstdlibのマクロをプロジェクトから使うのは大分ビルドの面倒くささの開きがあり
8:40 AM
StaticMemberIterable がstdlibに入るのであれば一番楽だけどなかなか長そう
Avatar
omochimetaru 3/4/2024 8:40 AM
それはそうですね。
Avatar
Avatar
Yuta Saito
これは1つの解決になりそう https://github.com/apple/swift-package-manager/pull/7084
それが実現するまでは自分で Array を作ってこうするのが一番丸そうですね. https://github.com/apple/swift-package-manager/pull/3018
As reported by @broadwaylamb in SR-13813: In my project, I want to only build a SwiftPM target when the platform I'm building for is not .wasi. For that, I wrote the following code in my Packa...
Avatar
まーそうですねぇ。
Avatar
改めて Vision 出るんですね. https://github.com/apple/swift-evolution/pull/2358
For now this contains an introduction section which doesn't assume any prior knowledge of the Wasm ecosystem. It provides overview of properties of Wasm useful when applied to Swift developer t...
Avatar
omochimetaru 3/14/2024 1:40 PM
おお!公式サポートが本気になってきた
Avatar
がんばります
t_kansha 5
🎉 1
👏 1
Avatar
omochimetaru 3/15/2024 3:55 AM
読んだ
3:55 AM
wasmについての解説が基本から書いてあった
3:56 AM
ブラウザというよりプラットフォームとして使い所がいろいろあって、マクロとかでも使えそうで良いんだよ、という話になってた
3:59 AM
プロセス隔離しなくてもセキュアだからIPC要らない、と言われると確かに良さそうだ
Avatar
swift-foundationをSwift SDKのwasiでビルドしようとするとSwiftSyntaxのコンパイラプラグインをビルドしようとしてエラーになっちゃうんですが、これって何か回避策ありますか? ❯ swift build --target FoundationEssentials --experimental-swift-sdk 5.9.2-RELEASE-wasm Building for debugging... /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:103:19: error: cannot find 'dup' in scope let inputFD = dup(fileno(stdin)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:117:20: error: cannot find 'dup' in scope let outputFD = dup(fileno(stdout)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:124:11: error: cannot find 'dup2' in scope guard dup2(fileno(stderr), fileno(stdout)) >= 0 else { ^~~~
Avatar
omochimetaru 3/26/2024 8:54 AM
いろいろカオスだなそれ
8:55 AM
foundationをwasmで動かすのにsyntaxいらなそうだしコンパイラプラグイン関連のものはさらにいらなそうw
Avatar
まずSwiftPMのビルドシステムがクロスコンパイル+マクロに対応しきれてないのでそれを直す必要があって、、 (edited)
Avatar
やっぱりそんな感じですよね。ありがとうございます
8:58 AM
マクロは複雑だ
Avatar
❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.9 /bin/bash root@5aaf21fbf0d1:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Swift SDK bundle successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip is assumed to be an archive, unpacking... Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` successfully installed. root@5aaf21fbf0d1:/# swift experimental-sdk list 5.9.2-RELEASE-wasm ❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.10 /bin/bash root@59c43fdac52e:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Downloading a Swift SDK bundle archive from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`... Swift SDK bundle archive successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` is assumed to be an archive, unpacking... Error: gzip: stdin has more than one entry--rest ignored tar: Child returned status 2 tar: Error is not recoverable: exiting now
12:56 PM
5.10でartifactbundleの展開が何故かコケるようになってしまった
Avatar
5.10.0のSwiftPMは壊れてるんでhttps://github.com/apple/swift-package-manager/pull/7321 をバックポートしないとダメなんですよねぇ
😇 2
Avatar
そんなw
Avatar
5.10.1をお待ち下さい
Avatar
おとなしく5.9を使います・・・
🙏 1
Avatar
omochimetaru 3/26/2024 1:03 PM
www
Avatar
Avatar
Iceman
❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.9 /bin/bash root@5aaf21fbf0d1:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Swift SDK bundle successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip is assumed to be an archive, unpacking... Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` successfully installed. root@5aaf21fbf0d1:/# swift experimental-sdk list 5.9.2-RELEASE-wasm ❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.10 /bin/bash root@59c43fdac52e:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Downloading a Swift SDK bundle archive from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`... Swift SDK bundle archive successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` is assumed to be an archive, unpacking... Error: gzip: stdin has more than one entry--rest ignored tar: Child returned status 2 tar: Error is not recoverable: exiting now
私は一度ダウンロードしてからインストールすることで回避してますよ. https://github.com/kkk669/swift-format/blob/d336d0ba4d49aa6a5fd7ce775a32ecf5fa1e8b73/.github/workflows/build.yml#L19
The WebAssembly (WASI) version of swift-format. Contribute to kkk669/swift-format development by creating an account on GitHub.
Avatar
あーなるほど、zipの展開が問題なだけだから自前で展開してパス指定すればいいんですね
2:52 PM
とりあえず今回は5.9でも問題ないので5.9にして過ごしました
Avatar
いや,展開だけだと何故か成功するんですよ.自前で展開はしてないです.
Avatar
ほんまや、スクリプト見たら自前でやってるのダウンロードだけですね
Avatar
エラーメッセージは展開で失敗してるっぽかったので不思議なんですけどね.(6.0 では問題なくなってるので深追いはしていない) (edited)
Avatar
Avatar
Iceman
swift-foundationをSwift SDKのwasiでビルドしようとするとSwiftSyntaxのコンパイラプラグインをビルドしようとしてエラーになっちゃうんですが、これって何か回避策ありますか? ❯ swift build --target FoundationEssentials --experimental-swift-sdk 5.9.2-RELEASE-wasm Building for debugging... /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:103:19: error: cannot find 'dup' in scope let inputFD = dup(fileno(stdin)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:117:20: error: cannot find 'dup' in scope let outputFD = dup(fileno(stdout)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:124:11: error: cannot find 'dup2' in scope guard dup2(fileno(stderr), fileno(stdout)) >= 0 else { ^~~~
期待しすぎるのもあれですけど,今年の GSoC のテーマにあった "Building Swift Macros with WebAssembly" は多分その辺を避けては通れないですよね. https://www.swift.org/gsoc2024/
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
macOS OSSツールチェインにlldが入った 🎉 https://github.com/apple/swift/pull/70715 (edited)
We already include lld in the Linux and Windows toolchains. For embedded Swift development, it's common to (need to) use ELF even on a macOS host, but the Xcode-provided linker is Mach-O only. ...
🎉 3
🙌 1
Avatar
omochimetaru 3/28/2024 8:14 AM
embeddedで必要にせよ、それはswift sdkが必要だから、そこで持ってくれば良さそうだけど
8:14 AM
ld64やめていく流れがあるんかな
Avatar
ホスト上で動かすツールを一個入るだけでSwift SDK自体がホスト依存になるんで各ホストごとにビルドしないといけなくて面倒くさいんですよね
Avatar
omochimetaru 3/28/2024 8:16 AM
お、なるほど。SDKパッケージのバリアントが増えてしまうのか。
8:16 AM
SDKパッケージはターゲットだけのバリアントにとどめたいのか。
Avatar
lldを入れるのはあくまでクロスコンパイル用で、Appleプラットフォームではld64を引き続き使い続けるはず
8:17 AM
という気持ちの現われがこちらに https://github.com/apple/llvm-project/pull/8119
For Embedded Swift, we want to start including lld even in Darwin toolchains to be able to link ELF files even on Darwin, see apple/swift#70715. To avoid accidentally using lld to link Mach-O files...
👀 1
Avatar
Avatar
omochimetaru
SDKパッケージはターゲットだけのバリアントにとどめたいのか。
そうそう。今全部のホストごとにツールチェインとSwift SDKを配布してて。。。 https://github.com/swiftwasm/swift/releases/tag/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-03-27-a (edited)
Avatar
omochimetaru 3/28/2024 8:21 AM
まあこれは大変か〜・・・
Avatar
あーたしかにSwiftSDKいれるときホストの情報必要になって一瞬戸惑いがありました
8:38 AM
そういうツールだったけっていう
Avatar
Xcode 15 以降のリンカ (ld-prime) って mold 並に速いので,普通に使うなら lld よりもそっちを使ったほうが速度的なメリットは大きいので ld64 使い続けるのは正しい方向性だと思います. 一方でこの辺の macOS 向けの環境構築手順と Linux 向けの環境構築を見比べると一目瞭然なんですが,lld が同梱されると組み込み開発が Swift ツールチェーンを入れるだけで基本は全て完結して楽になるのが嬉しいですね. https://github.com/ole/swift-rp-pico-bare?tab=readme-ov-file#on-macos (edited)
Avatar
The Lede I decided to take a crack at the whole "Building Macros with WebAssembly" idea and managed to put together something that improves build times by up to 10x even without any compiler integration! There's currently some caveats on the usability front since this is a standalone package instead of integrating into swiftc/SwiftPM, but I thi...
👀 1
2:44 AM
それなりにインタプリタ最適化して書いたおかげで、マクロくらいの短命なプログラムならWasmKitのほうがWebKitより速くなるケースがあるらしい。やったぜ
Avatar
omochimetaru 3/29/2024 8:53 AM
図が欲しいな・・・
8:53 AM
この表はそれぞれ何の時間?
8:54 AM
ビルド時間っぽいけど、WasmKitやWebKitはランタイムだよね?
8:55 AM
あとこれにSwiftSyntaxが横に並ぶ意味がわからない・・・
8:55 AM
(kabiroberai/WacroのREADME.mdは読んだけどわからんかった) (edited)
Avatar
「SwiftSyntax」って書かれてるのは従来のネイティブにコンパイルして評価するパターンですね
Avatar
omochimetaru 3/29/2024 9:19 AM
wasmの場合はSwiftSyntaxはプレビルドで、マクロ部分のビルドと実行?の時間で
9:19 AM
3列目はSwiftSyntaxとマクロをコンパイルしてから実行する時間か?
9:20 AM
そうだったとして、マクロ部分のコードサイズと、マクロ適応対象のソースコードによっても変動するから解釈が難しいな
Avatar
インクリメンタルの行はマクロの実行速度をだいたい示してて、
9:26 AM
  • Clean + WasmKitはWasmKit自体のビルド時間 + コンパイラプラグインのビルド時間 + マクロ実行時間
  • Clean + WebKitは コンパイラプラグインのビルド時間 + マクロ実行時間
になってて
Avatar
omochimetaru 3/29/2024 9:27 AM
WebKitはランタイムがプレビルドなのか!w
Avatar
Clean (debug) + WasmKit > Clean (debug) + SwiftSyntax になってるのはWasmKit自体のデバッグビルドがSwiftSyntaxのビルドより時間かかってるということ何だと思います (edited)
9:29 AM
9:30 AM
Compiler Pluginの部分はツールチェインに同梱できるはずなので、WasmKitのビルド時間は気にする必要がなくなるはず
Avatar
なるほど!
Avatar
omochimetaru 3/29/2024 1:48 PM
struct MyApp: ReactComponent { func render() -> ReactNode { h.div { h.h1 { "Hello My App" } h.p { "hello" } } } } SwiftにReactを提供するとしたらどんなAPIがいいんだろう HTML部分は Result Builder が便利だとは思うが、 div みたいな小文字キーワードを大量にネームスペースにばら撒くのは良くないと思ってて、 グローバルな h. にぶら下げたらマシかなあ (HTMLのh)
Avatar
久しぶりにWebなWasmの話だ
1:51 PM
グローバルに置いても良いんじゃないですか?
1:52 PM
困るかな
Avatar
omochimetaru 3/29/2024 1:55 PM
直感的にはめっちゃ違和感あるけど いいのかな
1:56 PM
TypeScript書いてて意図しないshadowingで困った事無いといえば無いか
Avatar
omochimetaru 3/29/2024 4:57 PM
@Yuta Saito JavaScriptKitって、macでもLinuxでもビルドできるけど、ターゲットがwasmじゃなかったらコンパイルも実行もできない?
Avatar
Avatar
omochimetaru
@Yuta Saito JavaScriptKitって、macでもLinuxでもビルドできるけど、ターゲットがwasmじゃなかったらコンパイルも実行もできない?
ターゲットがwasm以外でも一応ビルドはできるけど実行はできないですね
Avatar
omochimetaru 3/29/2024 5:02 PM
一応ビルドはできるんか
Avatar
外側のJSと喋ろうとするタイミングでfatalError
Avatar
omochimetaru 3/29/2024 5:03 PM
なるほど
5:03 PM
JSKとしては、JavaScript側から一番最初にJS側へのインターフェースを登録することを期待していて (edited)
5:04 PM
それがないので止まるって感じ?
5:05 PM
JS側からは、JSKをビルドしたwasmから関数を引っ張り出すようになってて、Cターゲットでその辺をやっている (edited)
Avatar
そうですねーWasmレベルのimport functionが注入されないのでそれを使おうとしたタイミングでクラッシュ https://github.com/swiftwasm/JavaScriptKit/blob/main/Sources/JavaScriptKit/XcodeSupport.swift
Avatar
omochimetaru 3/29/2024 5:10 PM
これはwasm targetでは無い場合にJS側から入れてもらうはずの関数を手前で定義しているのか。
5:10 PM
Swift側ではif archを使って状況を判定できるんすね (edited)
5:12 PM
Package.swiftのレベルで今wasmターゲットでビルドしてるかどうか状況判定する方法はあるんだっけ (edited)
Avatar
condition: .when(platforms: [...])が使えます
Avatar
omochimetaru 3/29/2024 5:14 PM
wasiがあるのかそうか
Avatar
ここで絞れるのplatformだけでarchは無いんですよねぇ
Avatar
omochimetaru 3/29/2024 5:15 PM
微妙に対応がズレてるね
Avatar
提案すれば通ると思うけどまあ大体現状で何とかなってしまう
Avatar
omochimetaru 3/29/2024 5:16 PM
package側でdefine使ったり、Swift側ではcanImportで2次的に判定したりはできるか?
Avatar
ターゲットにコンパイルされるSwiftソース上ではいくらでもやりようはありますねー
Avatar
omochimetaru 3/29/2024 5:18 PM
なるほど
5:20 PM
ウーンどうしよっかなあ
Avatar
どこで何を分岐したいんだろう
Avatar
omochimetaru 3/29/2024 5:22 PM
Reactを作ろうとしてて
5:23 PM
ブラウザのwasmで動かすのが本命だけど、いろいろ開発が難しそうだから
5:24 PM
macでJSやDOMのない環境でも動くようにしたい
5:25 PM
macで動くってのはダイナミックにGUIとしては動かないけど論理的には動く状態
Avatar
TokamakはGTKにも対応していて同じようなことをしているはず https://github.com/TokamakUI/Tokamak
Avatar
omochimetaru 3/29/2024 5:29 PM
GTK (以前は GTK+, The GIMP Toolkit) は、クロスプラットフォームのウィジェット・ツールキット(GUIツールキット)である。当初は、GIMPの実装のために開発され、現在は、GNOMEデスクトップ環境のツールキット等として広く利用されている。 GTKはGNUプロジェクトの一部であり、GNU LGPLの元で開発されているオープンソースなフリーソフトウェアである。 GTKアプリケーションは、GNOMEに限らずKDEなどのGTKベースでないデスクトップ環境でも動作する。GNOMEライブラリを使用することにより、GNOMEデスクトップ環境のさまざまな機能を使用したアプリケーションを開発することができるが、GTKだけでアプリケーションを構成することも可能。 GTKは、主に...
5:29 PM
このGTK?
Avatar
そのGTK
Avatar
omochimetaru 3/29/2024 5:29 PM
めちゃくちゃ久しぶりに見た
5:31 PM
なるほど
Avatar
omochimetaru 3/29/2024 5:40 PM
Tokamak見てきたけどクソデカいなこれw
Avatar
omochimetaru 3/29/2024 5:48 PM
SwiftUI-compatible framework for building browser apps with WebAssembly and native apps for other platforms - TokamakUI/Tokamak
5:50 PM
SwiftUI-compatible framework for building browser apps with WebAssembly and native apps for other platforms - TokamakUI/Tokamak
5:51 PM
Appのstatic func _launchの実装が、どれをimportするかで変わって
5:51 PM
Viewシステム側が共通でDOMRendererやGTKRemdererなどが切り替わるようだ
5:53 PM
canImportでSwiftUIが通る時は
5:53 PM
TokamakCoreを読み込まないでSwiftUIの型名をそのまま出すのか
5:54 PM
野望がデカすぎるやろ・・・
Avatar
夢は大きく!
Avatar
omochimetaru 3/29/2024 5:55 PM
核融合プロジェクトを思わせる名前なのには納得できてきた
5:55 PM
Swift側ではif os(WASI)も書けるんだね
5:56 PM
Maxのコミットが2年前ぐらいで止まってるのApple行ったタイミングか・・・?
5:59 PM
必要な知識はある程度集まったな、考えてみよう どうもありがとう〜
Avatar
期待してます!!
Avatar
omochimetaru 3/31/2024 8:28 AM
@Yuta Saito https://github.com/swiftwasm/JavaScriptKit/blob/0a4cb162e4561c63195d5f9db08b3efba424bed4/Sources/JavaScriptKit/JSValue.swift#L197 この6つのグローバル関数ってどういう意図でグローバル関数なの? メソッドの方が自然なAPIだと思った
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
Avatar
ドキュメントも書いてないしpublicにするつもりじゃなかったのかな?
8:32 AM
publicなAPIとしてJSObjectのメソッドがあって、それが中でこれを使ってるはず
Avatar
omochimetaru 3/31/2024 8:36 AM
C実装の_get_propsとかをSwiftインターフェースにするローレベルなやつって感じでエンドユーザーは気にしなくてよさそうなやつか
Avatar
だったはず。なので隠しても問題なさそう
Avatar
omochimetaru 3/31/2024 8:37 AM
破壊的変更になってしまう
Avatar
壊してまで隠す必要はない
Avatar
omochimetaru 3/31/2024 4:10 PM
JavaScriptKitのふりするコード動いたw
Avatar
よさそう
Avatar
omochimetaru 3/31/2024 4:14 PM
なんかミスってた場合、ブラウザで動かしたら全然動かないって事になるけど
4:15 PM
そういう時って ・JSKのC関数の中で死んだらconsole.log出る? ・Swift側の .object! とかで死んだら、どこかに何か出る?
Avatar
クラッシュした場合実行エンジン側がバックトレースを出してくれますね。
4:16 PM
ブラウザの場合デバックコンソールに出る
Avatar
omochimetaru 3/31/2024 4:17 PM
おお、えらい それはだいぶいいな
Avatar
バックトレースと言うかJS環境だと例外が飛ぶ
4:18 PM
例外キャッチしていなければよしなに例外のバックトレースが表示される
Avatar
omochimetaru 3/31/2024 4:18 PM
ブラウザのデバッガはwasm領域ってどうなってるん?
Avatar
デバッグサポートは雑に言うと2段階あって
4:20 PM
一番簡素なのがnameセクションという関数と名前のマップを含んだカスタムセクションが.wasmバイナリにある場合、バックトレースを表示するときにその名前を使ってくれる、というやつ。 https://webassembly.github.io/spec/core/appendix/custom.html#name-section
4:20 PM
これはほぼ全ての実行環境がサポートしてる
Avatar
omochimetaru 3/31/2024 4:21 PM
ん、じゃあWASMのコールスタックもJS側と繋がって出てくるのか
Avatar
Chromeやwasmtimeだともう1段リッチなDWARFサポートがあって、
  • 関数名だけでなくソースコード上のファイル+行番号へのマップ
  • ローカル変数のダンプ
などなど、ができる
Avatar
omochimetaru 3/31/2024 4:23 PM
思ったよりすごい
4:23 PM
文明進んでた
Avatar
ChromeでDWARFサポートを有効にするためには拡張を入れる必要があるんですが、入れるだけでだいぶ文明が進む https://book.swiftwasm.org/getting-started/debugging.html
Avatar
omochimetaru 3/31/2024 4:24 PM
.wasm ファイルの中にsourcemapが埋め込まれてるの?
4:25 PM
既存のswift compilerだとそういうの無さそうだけど
Avatar
DWARF情報がいわゆるsourcemapに対応しますね
4:26 PM
普通のターゲットでも同じくDWARFで行番号マップしてますよ
Avatar
omochimetaru 3/31/2024 4:26 PM
DWARFとかってファイルパスを埋め込んでるだけだと思ってた
Avatar
超リッチ
Avatar
omochimetaru 3/31/2024 4:26 PM
だからビルドした人のマシンじゃないとソースは見えないのかと。
4:26 PM
そうだったのかー
Avatar
ああ、ソースコンテンツ自体は含んでないんでデバッグする人の手元にはソース必要です
Avatar
omochimetaru 3/31/2024 4:27 PM
ああなるほど
4:27 PM
chromeがファイルシステムを見に行ってるのね
Avatar
そうそう
Avatar
omochimetaru 3/31/2024 4:27 PM
理解
Avatar
例の拡張機能がパスの置換もできるんでビルドマシンと手元のソースファイルの位置が違っても大丈夫 (edited)
Avatar
omochimetaru 3/31/2024 4:28 PM
いわゆるsourcemapは、完全にソースコードそのものだから、他の人も読める。(だから、本番にdevelop buildでデプロイしてはいけない)
4:29 PM
もしかしてSafariは文明が遅れている・・・?
Avatar
sourcemapの方をわかってあげられてなかった 😂
4:29 PM
Safariは残念ながら
Avatar
omochimetaru 3/31/2024 4:30 PM
ぐぬぬ swift-wasmのためにapple頑張らないと
4:31 PM
でも思ってたよりwasm on web実用性ありそうやなあ (edited)
4:31 PM
もっとエクストリームかと思ってた
Avatar
プロダクションで使われ始めてだんだん育ってきた 🌱 (edited)
Avatar
omochimetaru 3/31/2024 4:35 PM
ありがたいなあ swift-wasmも統合されて公式サポート間近(?)だし、機が熟してきた (edited)
Avatar
はやくWasm元年を到来させたい
Avatar
omochimetaru 3/31/2024 4:38 PM
VR元年は毎年来てるけどWASM元年は言われてもないな
🙃 2
Avatar
ポテンシャルだけで注目されてきたんでそろそろ実用性を…
Avatar
SIMD が欲しい系 (3D ビューアや機械学習の推論等) では使うのが当たり前になっている印象ですが,そういう用途だと GPU の方が速いので WebGPU があれば WebAssembly そんなに要らないなとなりがち...
Avatar
omochimetaru 3/31/2024 4:57 PM
vscodeが使う正規表現エンジンのonigurumaがwasm実装になってて、これはCPUタスクだから良さそう
Avatar
omochimetaru 4/1/2024 12:57 PM
@Yuta Saito public extension JSValue { /// An unsafe convenience method of `JSObject.subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)?` /// - Precondition: `self` must be a JavaScript Object and specified member should be a callable object. subscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue) { object![dynamicMember: name]! } これなんだけど、このsubscriptから返ってくる関数に @discardableResult 付ける方法ないよねえ?
Avatar
なさそうなんすよねぇ
Avatar
omochimetaru 4/1/2024 12:59 PM
そうだよねえ
12:59 PM
12:59 PM
voidの関数でも _ = が必要になっちゃって不満
Avatar
クロージャじゃなくてcallAsFunction持つ型を返すようにするとどうだろうか
Avatar
omochimetaru 4/1/2024 1:00 PM
!!!!
Avatar
Avatar
Yuta Saito
クロージャじゃなくてcallAsFunction持つ型を返すようにするとどうだろうか
omochimetaru 4/1/2024 1:18 PM
ありがとう、できたわ しかも、そのような型としてすでに JSFunction が存在していたので、 クロージャからそれに置き換えるだけでよかった
Avatar
なるほどー
Avatar
omochimetaru 4/1/2024 1:20 PM
JavaScriptKitにバックポートしないと意味がないから宿題が増えた
1:20 PM
Mockだけ改善されても意味ねえ
1:24 PM
しかし、後ろに () が付いてることを起点に、dynamicMember subscriptをオーバーロードするの、テクいなあ
1:24 PM
動くのは理解できるけどちょっとこづいたら壊れそうで不安になる実装だ
Avatar
思ったようにオーバーロード選択されるようになるまでにチョッと大変だった
Avatar
omochimetaru 4/1/2024 1:26 PM
そうなんだ @_disfavoredOverload ついてるからこれでクリアしたのかと思った
Avatar
ズルしてクリアした
Avatar
omochimetaru 4/1/2024 1:28 PM
無しでやろうとして苦戦したということね
Avatar
そうそう。
Avatar
omochimetaru 4/1/2024 1:28 PM
家庭君は _disfavoredOverload に慎重な傾向を感じる
Avatar
軽率に_disfavoredOverloadつけている
2:12 PM
正式な機能としてほしい
2:12 PM
ついでに_disfavoredOverloadにもランク付けをしたい
Avatar
人間にオーバーロード管理させようとすると乱用するから…
Avatar
omochimetaru 4/1/2024 2:16 PM
SwiftUIがそれに依存してるから大丈夫だろの気持ちはあるけど、 2段階目がつけられないから、それで困ることはありそうですね
Avatar
  • 汎用的なプロトコル
  • 専用プロトコル
それぞれ用のオーバーロードがあるときに、専用プロトコル側に寄せるための方法がなくてこれに頼る必要が生まれてる
2:20 PM
Codableを受け付けるけど、専用のファストパスがあるならそっち、みたいな。
2:21 PM
内部で分岐すれば1個でもいけるか?
Avatar
omochimetaru 4/1/2024 2:26 PM
それは対応方法があって、 <T: P1> と、 <T: P2> の2つのオーバーロードとは別に <T: P1 & P2> のオーバーロードを用意して、その中の実装で <T: P2> 版に転送すればいいですよ
2:26 PM
P1 & P2 は P1 よりも強いし P2 よりも強いので、どっちにもいけるやつを吸い込んでくれる
2:27 PM
でも、 P3, P4と増えると組合せ爆発するのでスケールはしない方法。
Avatar
omochimetaru 4/2/2024 1:41 PM
うわあー
1:41 PM
型推論のえぐいの引いた
1:42 PM
public final class JSFunction { public convenience init< S: JSNativeObject, A0: ConstructibleFromJSValue, A1: ConstructibleFromJSValue >( _ selector: @escaping (S) -> (A0, A1) -> Void ) where A0.Constructed == A0, A1.Constructed == A1 { let impl = { (this: JSObject?, arguments: [JSValue]) -> JSValue in selector(this!.native as! S)( A0.construct(from: arguments[0])!, A1.construct(from: arguments[1])! ) return .undefined } print(S.self, A0.self, A1.self) self.init(impl: impl) } }
1:42 PM
これに対して
1:43 PM
public class WebNode { public func insertBefore(_ node: WebNode, _ ref: WebNode?) public func _get_property(_ name: String) -> JSValue { switch name { case "childNodes": childNodes.jsValue case "firstChild": firstChild.jsValue case "nextSibling": nextSibling.jsValue case "parentNode": parentNode.jsValue case "description": description.jsValue case "appendChild": JSFunction(Self.appendChild).jsValue case "insertBefore": JSFunction(Self.insertBefore).jsValue case "remove": JSFunction(Self.remove).jsValue case "removeChild": JSFunction(Self.removeChild).jsValue default: .undefined } } }
1:43 PM
これを呼び出したら
1:45 PM
(WebNode) -> (WebNode, WebNode?) -> Void がマッチして
1:45 PM
S == WebNode, A0 == WebNode, A1 == WebNode? と解決されると思ったが
1:46 PM
S == WebNode, A0 == WebNode, A1 == WebNode と解決されてしまった
Avatar
どうなるの
Avatar
omochimetaru 4/2/2024 1:46 PM
確かに contravariance だから、 A1 == WebNode として解決していても、 実際に渡すクロージャは (WebNode, WebNode?) -> Void で広く受けてるから問題ない、理論的には間違ってない
1:47 PM
ただこっちが期待してるのは A1 == WebNode? になってることだから
1:47 PM
呼び出そうとして nil がくると実行時クラッシュする
Avatar
ConstructibleFromJSValueは、Optionalもconformしてるの?
Avatar
omochimetaru 4/2/2024 1:49 PM
してる。conditional conformしてる。 extension Optional: ConvertibleToJSValue where Wrapped: ConvertibleToJSValue { public var jsValue: JSValue { self.map { $0.jsValue } ?? .null } }
1:55 PM
func foo<S, A0>(_ fn: (S) -> (A0) -> Void) { print(type(of: fn)) } struct Z { func method(_ arg: Int?) {} } foo(Z.method) // (Z) -> (Optional<Int>) -> () シンプルなコードだと望ましい挙動になるな。深いぞこれ・・・
Avatar
やってるのは JSFunction(WebNode.insertBefore) であってますかね
Avatar
omochimetaru 4/2/2024 1:55 PM
あってる
1:56 PM
あー正確には実行時には selfWebHTMLElement になっているから、 動的に確認すると (WebHTMLElement) -> (WebNode, WebNode?) -> Void を渡してる 静的にはコンパイル時に S = WebNode, A0 = WebNode, A1 = WebNode になっとる
Avatar
func foo<S, A0: CustomStringConvertible, B0: CustomStringConvertible>(_ fn: (S) -> (A0, B0) -> Void) { print(type(of: fn)) } struct Z { func method(_ arg1: Int, _ arg2: Int?) {} } foo(Z.method) 再現したよ
1:57 PM
あいや、Int?がCustomStringConvertibleじゃないか
Avatar
omochimetaru 4/2/2024 1:58 PM
おお
1:58 PM
再現できてる
1:58 PM
arg2 が Int? なのに、 B0 が Int になってる。
Avatar
Avatar
tarunon
あいや、Int?がCustomStringConvertibleじゃないか
omochimetaru 4/2/2024 1:58 PM
あ、そうね
Avatar
Int?をCustomStringConvertibleにしたら回避できた
1:59 PM
難しいね
1:59 PM
経験則だが、condconfの宣言が、同ライブラリにあるか、別ライブラリにあるかで振る舞いが変わる気がする
Avatar
omochimetaru 4/2/2024 1:59 PM
public protocol ConstructibleFromJSValue { associatedtype Constructed = Self static func construct(from value: JSValue) -> Constructed? } このassociatedtypeも関係あるかなあ
Avatar
その型assoctypeありましたっけ
2:00 PM
あ、これはモックの方か
Avatar
omochimetaru 4/2/2024 2:00 PM
あ〜〜〜 別の間違いがあるかもしれん。
Avatar
Avatar
Yuta Saito
その型assoctypeありましたっけ
omochimetaru 4/2/2024 2:01 PM
そうそう。本家の実装だと問題があるんだよね。
2:01 PM
public protocol ConstructibleFromJSValue { associatedtype Constructed = Self static func construct(from value: JSValue) -> Constructed? } extension Optional: ConstructibleFromJSValue where Wrapped: ConstructibleFromJSValue { public static func construct(from value: JSValue) -> Wrapped.Constructed? { switch value { case .null, .undefined: return nil default: return Wrapped.construct(from: value) } } }
2:01 PM
これ間違ってるな?
Avatar
case .null, .undefined:.some(nil) を返したい?
Avatar
omochimetaru 4/2/2024 2:03 PM
double optionalになるはずやね
Avatar
Avatar
Yuta Saito
case .null, .undefined:.some(nil) を返したい?
omochimetaru 4/2/2024 2:03 PM
え〜っと、そうだと思う。
2:04 PM
外側がデコードの成否だから正しくnilなのでそう
2:06 PM
直った!
2:06 PM
違うところのミスだった、お騒がせしました。
Avatar
めでたし
Avatar
Avatar
Yuta Saito
めでたし
omochimetaru 4/2/2024 2:08 PM
JavaScriptKit本家の定義だと、 JSObjectConstructibleFromJSValue に準拠できないんだよね
2:09 PM
covariance Self の問題が起きる (edited)
Avatar
covariance Self の問題
これどういう問題でしたっけ?
Avatar
omochimetaru 4/2/2024 2:11 PM
Functional JSON parsing library for Swift. Contribute to thoughtbot/Argo development by creating an account on GitHub.
2:11 PM
ちょっと待ってね
2:13 PM
違うな、準拠自体はできるんだわ
Avatar
ふむふむ
Avatar
omochimetaru 4/2/2024 2:19 PM
ハマりを再現しようとしてるけど再現しなくて今困ってるところw
Avatar
w
Avatar
omochimetaru 4/2/2024 2:24 PM
あ〜 わかった 問題なかったわ
2:24 PM
ここで勘違いしたけど、
2:24 PM
public static func construct(from value: JSValue) -> Self? { value.object as? Self } これでいいんだね
2:25 PM
本家の定義で大丈夫だった。
2:26 PM
これもお騒がせだった。
Avatar
いや、 JSFunction のケースがあるんで case .object:case .function:の両方のケースをここでチェックする必要があるんではないかな
Avatar
omochimetaru 4/2/2024 2:27 PM
それはまた別の問題としてあると思う。
2:27 PM
.object のなかの JSObject が 実際には JSFunction の可能性があるけど (edited)
2:27 PM
全体的にその考慮がおかしい気がしてた
Avatar
JSFunctionJSObject のサブクラスにしたのは相当後悔してる
Avatar
omochimetaru 4/2/2024 2:28 PM
というかそもそもJSのランタイムにはそれが区別できないから
2:28 PM
正しい形がわからん
Avatar
.object の中身が 実際にはJSFunctionの可能性はないですね
Avatar
Avatar
Yuta Saito
.object の中身が 実際にはJSFunctionの可能性はないですね
omochimetaru 4/2/2024 2:28 PM
でも JSFunction is JSObjectだよ
Avatar
そこはtypeof objfunction を返してくれるんで
2:28 PM
ああ、ユーザが勝手にJSValueを作る場合か
Avatar
omochimetaru 4/2/2024 2:28 PM
あーtypeofは区別するんだ。知らんかった。
2:29 PM
んーじゃあ case function が存在するのは問題ないのか
Avatar
Avatar
Yuta Saito
ああ、ユーザが勝手にJSValueを作る場合か
omochimetaru 4/2/2024 2:30 PM
えーとそう。 class MyFunc: JSFunction とやってから .object(MyFunc()) が通っちゃう。
Avatar
JSValueenum にしたのがなぁ
2:31 PM
Rubyの方ではまた違うアプローチにしててそれなりに上手く行った
Avatar
omochimetaru 4/2/2024 2:31 PM
あとは JSObject(id: JavaScriptObjectRef) これに実際には function の値を渡す可能性はあるのか?
Avatar
Avatar
omochimetaru
あとは JSObject(id: JavaScriptObjectRef) これに実際には function の値を渡す可能性はあるのか?
それってSPIで隠れてるインターフェースじゃなかったでしたっけ
2:32 PM
ライブラリ内では気をつけてそういう違反がないようにしてたはず
Avatar
Avatar
Yuta Saito
それってSPIで隠れてるインターフェースじゃなかったでしたっけ
omochimetaru 4/2/2024 2:33 PM
隠れてる。
2:34 PM
うーん大丈夫なのか。Cと受け渡すところで、typeof のfunctionに基づいてcaseを決めるから。
2:35 PM
.object(MyFunc()) これをやっても、 MyFunc.jsValueJSFunction のところでoverride されてるから、 .jsValue を使えば大丈夫か。 (edited)
Avatar
そうそう。なのでおそらく問題の穴は JSValue.object(function) が作れてしまうところだけではないかな。
2:36 PM
JSFunction から JSValue を作る場合普通の人は .jsValue を使うので問題が顕在化しない
Avatar
omochimetaru 4/2/2024 2:36 PM
なるほど。
2:37 PM
本当は case JSValue.object を呼び出した時に、内部でJS側の実体を調べて、 functionだったら case function になれば穴はなさそうだけど enum case constructor だからそういうフックが書けないのがダメなのか?
2:38 PM
case _object とかにして static func object() にしたら避けられるけど、switch-caseしたときにダサい名前が出てくるし・・・
Avatar
そう… public enum にしたの本当にまずかった
Avatar
omochimetaru 4/2/2024 2:38 PM
でもcase constructできないけどswitchできるenumって定義できないよね? (edited)
Avatar
static funcで同名のオーバーロードを生やしつつそれをunavailableにマークすると一応できるんだけど、厳しすぎる…
Avatar
omochimetaru 4/2/2024 2:40 PM
そのunavailableってswitch-caseで使うときは許されるのかw
2:41 PM
https://github.com/apple/swift-package-manager/blob/26b4ed010e7ec211f0aad7527961f83508ea4771/Sources/PackageDescription/Target.swift#L51 SwiftPMが、APIをstatic funcにして、実際のcaseはダサい名前にしてるけど
2:41 PM
実際のcaseを勝手に作ることはできちゃうな
Avatar
@swift-main enum E { case c(Int) @available(*, unavailable) static func c(_: Int) -> E { fatalError() } } func check(e: E) { switch e { case .c(_): break } }
Avatar
Avatar
Yuta Saito
@swift-main enum E { case c(Int) @available(*, unavailable) static func c(_: Int) -> E { fatalError() } } func check(e: E) { switch e { case .c(_): break } }
swiftNightly BOT 4/2/2024 2:41 PM
exit status: 1 with <stdin>:3:42: error: invalid redeclaration of 'c' 1 │ enum E { 2 │ case c(Int) 3 │ @available(*, unavailable) static func c(_: Int) -> E { fatalError() } │ ╰─ error: invalid redeclaration of 'c' 4 │ } 5 │
Avatar
あれ、出来なくなってた。 enum case as witness methodが入ったあたりかな
Avatar
omochimetaru 4/2/2024 2:42 PM
あったな〜
Avatar
case constructorのvisibilityを制御したい〜〜
Avatar
omochimetaru 4/2/2024 2:44 PM
今できる安全なAPI設計は、 switch-caseする時用のenum型を専用に用意して enum JSValue.Switcher とかにしておいて、 APIは struct JSValue で全部通す、とかかな。 var JSValue.switcher: JSValue.Switcher { get } (edited)
2:44 PM
不正なSwitcherは作れるけどそれ以上伝搬しないので意味ない
Avatar
それしかないかなぁ。ダサすぎるけど90%のユーザはJSValueに対してswitchしないからギリ許容できるかもしれない
Avatar
omochimetaru 4/2/2024 2:46 PM
まあswitchするときに switch foo.jsValue.switcher って書かないといけないのはダサいねw。
Avatar
Avatar
Yuta Saito
いや、 JSFunction のケースがあるんで case .object:case .function:の両方のケースをここでチェックする必要があるんではないかな
omochimetaru 4/2/2024 2:46 PM
巻き戻って、これは、合ってるのか・・・?
Avatar
まだ穴あるかな
Avatar
omochimetaru 4/2/2024 2:47 PM
public static func construct(from value: JSValue) -> Self? { switch value { case .object(let x): return x as? Self case .function(let x): return x as? Self default: return nil } }
2:48 PM
この as? が不安になるんだけど考え中
Avatar
ついでに case .bigInt も必要だ
Avatar
omochimetaru 4/2/2024 2:48 PM
モックには出てこないのですてました
2:51 PM
1. JSObject.construct.object が渡る → as? JSObject でok 2. JSObject.construct.function が渡る → x: JSFunction で取り出して as? JSObject は成功するから、動的にJSFunctionな静的なJSObjectが返る 3. JSFunction.construct.object が渡る → x: JSObject で取り出して as? JSFunction に失敗して nil 4. JSFunction.construct.function が渡る→ x: JSFunction で取り出して as? JSFunction で OK
2:52 PM
1と4は自明にOKで、 2は、さっきから話してる不正case constructができてしまうだけで、その先で .jsValue を使う限り問題なし 3はダウンキャストの失敗だから失敗でok (edited)
2:53 PM
うーん良さそうか
Avatar
Avatar
Yuta Saito
ついでに case .bigInt も必要だ
omochimetaru 4/2/2024 2:53 PM
てかbigintってなんでランタイムレベルで区別されてるん?
2:53 PM
objectではない?
2:55 PM
typeof の BigInt 値 (bigint プリミティブ) に対する評価値は、"bigint" となります。
2:55 PM
任意長の値型プリミティブだから string の親戚みたいなもんなのか・・・ (edited)
2:57 PM
public final class JSBigInt: JSObject {
2:57 PM
むむ?
Avatar
caseで区別すべきだったかは今考えるとびみょうな所ですねぇ。
Avatar
omochimetaru 4/2/2024 2:58 PM
ようわからなくなってきた。
2:58 PM
JavaScript において、関数は第一級オブジェクトです。すなわち、関数はオブジェクトであり、他のあらゆるオブジェクトと同じように操作したり渡したりすることができます。具体的には、関数は Function オブジェクトです。
3:00 PM
const i = 1; i.__proto__; // Number
3:00 PM
コピーした時のセマンティクスの違いがあるだけで、全部オブジェクト?
3:03 PM
それもよくわかんないな、常にリファレンスコピーにも見える、stringがimmutableだからわからない
3:05 PM
Avatar
なんでだったかな
Avatar
omochimetaru 4/2/2024 3:05 PM
Functionは、プロパティを書き込めるから、参照共有してることが露出する
3:06 PM
stringとbigintは、プロパティが書き込めない(読み取ったら消えてた)し、mutable methodを持たないから、immutable objectになってて、値型っぽく見える
Avatar
一番最初のデザインとしては、Swift側にとって自然な表現に出来てかつJS側に戻すときに情報が失われないのであれば値としてコピーする、という意図だった
Avatar
omochimetaru 4/2/2024 3:06 PM
振る舞いからすると、Functionは確かにObjectっぽいけど、bigintはFunctionよりstringに似てるように見えて、Objectっぽくない
Avatar
で、その意図に沿うとBigIntは値としてコピーするべきなんだけどそういう話は全然出てないな https://github.com/swiftwasm/JavaScriptKit/pull/184
Avatar
omochimetaru 4/2/2024 3:08 PM
検討漏れかしら
Avatar
ついでに case number(Double) になってると書き戻すときにNaNビットが変わる可能性があるのでUInt64のビットパターンで保持すべきだ
Avatar
Avatar
omochimetaru
検討漏れかしら
おそらく
Avatar
omochimetaru 4/2/2024 3:10 PM
symbolも値っぽい?
JavaScript では、シンボルはプリミティブ値です。 Symbol データ型を持つ値は「シンボル値」として見ることができます。 JavaScript の実行時環境では、シンボル値は Symbol 関数を呼び出すことで生成され、動的に無名の一意の値を生み出します。シンボルはオブジェクトプロパティとして使用されることがあります。
Avatar
うむ
Avatar
omochimetaru 4/2/2024 3:11 PM
Avatar
いや、Symbolはダメだ (edited)
Avatar
omochimetaru 4/2/2024 3:11 PM
ここみたらよかった
3:11 PM
プリミティブって分類されるものが、イミュータブルで値コピー風に振る舞うんでは?
Avatar
Swift側で表現する方法がない
Avatar
javascriptは、boxingが入ってるから
3:12 PM
primitiveもオブジェクトに暗黙的に変換できるだったと思う
Avatar
Avatar
Yuta Saito
Swift側で表現する方法がない
omochimetaru 4/2/2024 3:14 PM
Swift側では struct JSString と同じように struct JSSymbol にしたら問題ある?
3:14 PM
内部表現としては JavaScriptObjectRef になってればSwift側でみた同値性をJS側でみた同一性で実装できる (edited)
Avatar
あれ、それでいいのか?
Avatar
Avatar
tarunon
primitiveもオブジェクトに暗黙的に変換できるだったと思う
omochimetaru 4/2/2024 3:15 PM
というか、JSコード側から、これがオブジェクトかどうか、を判定する方法がないように感じた (edited)
3:16 PM
プリミティブも、オブジェクトと振る舞いに違いがない 単にイミュータブルなだけ
Avatar
Avatar
Yuta Saito
あれ、それでいいのか?
omochimetaru 4/2/2024 3:16 PM
文字列からコンストラクトする時に、一旦JS側のAPIでシンボルインスタンスを作らないといけないけど、それで同一性も維持できると思う
Avatar
良いような気がしてきた
3:21 PM
RawJSValue の時点では既にそういう表現になっているので問題はSwift API上での継承関係だな
Avatar
omochimetaru 4/2/2024 3:21 PM
そうね
3:22 PM
Swiftネイティブな暗黙のアップキャストやasを使わせたい場合にclassが必要という事だと思う
3:23 PM
public struct JSHTMLElement: CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asNode() -> JSNode { JSNode(jsObject: jsObject) } } public struct JSNode: Equatable & Hashable & CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asHTMLElement() -> JSHTMLElement? { if jsObject.isInstanceOf(JSWindow.global.HTMLElement) { return JSHTMLElement(jsObject: jsObject) } else { return nil } } public func asText() -> JSText? { if jsObject.isInstanceOf(JSWindow.global.Text) { return JSText(jsObject: jsObject) } else { return nil } } }
3:24 PM
今JavaScriptKitの上で構築してる型付きインターフェースでは、継承関係があっても値型にして、 アップキャストとダウンキャストは明示的なメソッドにしている (edited)
3:25 PM
こうしないと、JSNode をコンストラクトするときに、値の真の型に応じたサブクラスで包むのが難しい(厳密にやろうとするとサブクラスが200種類とかある) (edited)
Avatar
まーそうですよねぇ。言語間の継承関係をネイティブに対応関係取ろうとするなんて無理だ
Avatar
omochimetaru 4/2/2024 3:26 PM
ラッパーレイヤーでダウンキャストする時に実際にJS側でinstanceofするとそのような無駄な計算がない (edited)
Avatar
Avatar
Yuta Saito
まーそうですよねぇ。言語間の継承関係をネイティブに対応関係取ろうとするなんて無理だ
omochimetaru 4/2/2024 3:26 PM
JSインスタンスにくっついてるプロトタイプ関数が取ってこれれば辞書引いて O(1) にはできるんだけどね。 (edited)
3:27 PM
とりあえず今の所 instanceof しかAPIが開いてなさそうだったから無理そうだった (edited)
Avatar
もしメジャーアップデートするならRuby側でやった「全てがJSObject作戦」を輸入したい
Avatar
omochimetaru 4/2/2024 3:32 PM
ほお
3:32 PM
それって現時点の 「全てが JSValue」とどう違うの?
Avatar
コアのAPIとしてはリファレンスを保持する JSObjectだけがあって
3:33 PM
他のJSなんちゃらクラスは存在しない
Avatar
omochimetaru 4/2/2024 3:33 PM
ふむふむ
Avatar
値としてRuby側にコピーしたい場合は JSObject に生えてるto_i, to_sとかを使う。
Avatar
omochimetaru 4/2/2024 3:37 PM
赤ちゃん起きた
👶 1
Avatar
つまり値としてJS世界のものを取り回そうとするからAPIが複雑になるのであって、コアライブラリの中では全て不透明な型で表現して、特定の型のインターフェースがほしいときはそれを使う側でラップしてくれ、でだいたい上手くいくことがわかった。 (edited)
Avatar
omochimetaru 4/2/2024 3:42 PM
良さそうに見える
Avatar
唯一懸念点があるとすればNumberをやりとりするだけの場合にオブジェクトとしてトラッキングしないといけなくなるので速さとメモリ性能が若干落ちる気がする
Avatar
omochimetaru 4/2/2024 3:47 PM
Numberは実際には JavaScriptObjectRef に埋め込まれた値なんじゃなかったっけ?
3:47 PM
タグポインタ値型
Avatar
そういう実装もできるのでやりようはありますね
Avatar
omochimetaru 4/2/2024 4:43 PM
4:44 PM
Swiftで書かれたDOM上で動いてたテストが、 JSのつもりで書かれたSwiftのDOM をJavaScriptKitMockを通して ラップしたSwiftのDOMの上で動くようになった! (edited)
Avatar
動いてきたな
Avatar
omochimetaru 4/2/2024 4:45 PM
理論上 root.render は ブラウザでも動くはずw
Avatar
(文脈変わりますが) WASI 向けにビルドする場合って executableTarget を import できないみたいな特有の制約があったりしますか?
5:34 AM
executableTarget を import してテストするテストターゲットがホスト環境にはビルドできて WASI 向にはビルドできなかったので気になりました.
Avatar
Description Tests on a default Hello World carton project fails during compilation. Here is the result of carton test: error: no such module 'carton_demo' @testable import carton_demo ^ not...
5:34 AM
むしろできる環境が特殊というか
5:35 AM
リンカの方に機能たさないと出来なくてまだ手つけられてないんですよね〜
Avatar
なるほど,やっぱりそうなんですね.できる環境が特殊というのはわかります.swift-format がそれをしていてうまくテストコードを流用できないなと思ってたところでした.
Avatar
omochimetaru 4/3/2024 5:36 AM
swift-formatそんなことしとんのかw
Avatar
Note that hidden files will always be honored if they are specified explicitly among the paths on the command line. Symlinks encountered during recursive traversal or passed on the command line wil...
5:37 AM
この辺で入ってきましたね.
Avatar
omochimetaru 4/3/2024 5:39 AM
executableの実装全部いれたtargetと、main付けるだけのexecutableTargetに分けた方がいいよお
Avatar
私も自分で書くときは大体そうしますw
Avatar
omochimetaru 4/3/2024 5:40 AM
The reason why the linking is not supported on Wasm is we cannot rename entrypoint symbol by linker (wasm-ld): Stop renaming main symbol for WASI apple/swift-package-manager#3804 On other platforms, SwiftPM build .executableTarget targets with renaming main to {moduleName}_main to avoid conflicting with .testTarget's entrypoint at link-time. For non-testing build, SwiftPM renames the entrypoint back to main by linker option. However, wasm-ld doesn't have the option for now, so we disable the feature now.
(edited)
5:41 AM
う〜ん大変そう
5:43 AM
リンクはできても他にも暗黙の仮定が壊れたりしてマイナーな問題がありそう
Avatar
リンカが複雑になるからこういうの本当に辞めたほうが良いと思う
5:47 AM
こういうのとか。。 https://github.com/apple/swift/pull/69113
Avatar
omochimetaru 4/3/2024 5:49 AM
なるほど async main
5:49 AM
でもこの変更はスマートだね
5:49 AM
リンケージ可視性もなんか色々システムがあるんやな
Avatar
omochimetaru 4/3/2024 12:01 PM
swift-for-wasm-examplesをやってみているが
12:01 PM
$ swift build --triple wasm32-unknown-none-wasm -c release --product swift-audio-c release があるとビルドできる ないとできない
12:02 PM
12:02 PM
error: compile command failed due to signal 6 (use -v to see invocation) Assertion failed: (!f->isGeneric()), function addLazyFunction, file GenDecl.cpp, line 1589. Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
12:08 PM
むずいなこれ
12:08 PM
dlmalloc が入ってるけどどこにも #include <malloc.h> がない
Avatar
クラッシュするのは良くないけどEmbeddedモードなんでまあそんなもんかなぁ
Avatar
Avatar
Yuta Saito
クラッシュするのは良くないけどEmbeddedモードなんでまあそんなもんかなぁ
omochimetaru 4/3/2024 12:09 PM
ランタイムジェネリクスがないはずで、それが最適化パスで全部特殊化されるんだけど、デバッグモードだとそのパスがないからジェネリックなコードが残っちゃって、どっかで怒られる、みたいな雰囲気かな?
Avatar
そうそう。
Avatar
omochimetaru 4/3/2024 12:09 PM
なるほど。気持ちはわかる。
Avatar
ランタイムライブラリが posix_memalignシンボルを参照してるだけなんでユーザコードはdlmalloc直接使わないですね
Avatar
omochimetaru 4/3/2024 12:10 PM
おー じゃあリンクするときまではソースの干渉はないのか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 12:11 PM
// dlmalloc.c int posix_memalign(void **memptr, size_t alignment, size_t size) { return dlposix_memalign(memptr, alignment, size); } これか
12:11 PM
memalignって何だっけ。mallocの方は使ってないの?
12:12 PM
名前 posix_memalign, memalign, valloc - アラインメントされたメモリの割り当てを行う
12:12 PM
ああ
12:12 PM
アライメント付きmallocがmemalignなのか
12:13 PM
Vult is a transcompiler well suited to write high-performance DSP code - vult-dsp/vult
12:13 PM
なんかこれも謎言語だし・・・
12:14 PM
The Vult compiler is a transcompiler, which takes Vult code and produces plain C/C++ code that can be compiled in any platform with a C/C++ compiler, for example: Arduino or Teensy boards (using fixed-point arithmetics).
12:16 PM
.vult ファイルはビルドと関係なくて、生成された C++ ソースと一緒にコミットされてるだけかな
Avatar
ぽい。そっちは全然知らない
Avatar
omochimetaru 4/3/2024 12:17 PM
すごいな
12:17 PM
ブラウザ上でJS実装のコンパイラを使ってコンパイルすることもできるらしい
Avatar
すごいな
12:18 PM
↑そのデモがあった。やばい音なる。爆音注意
Avatar
しかも微妙に怖い音だw
Avatar
omochimetaru 4/3/2024 12:20 PM
イケイケなEDMが流れるのかと思ったらめっちゃ技術デモっぽい音だった。
Avatar
われわれが何の話をしているかと言うと、最近apple GitHub org傘下にSwift for WebAssemblyのデモリポジトリが出来ました: https://github.com/apple/swift-for-wasm-examples/ (ここでリンク貼ったことない気がするので。) (edited)
Contribute to apple/swift-for-wasm-examples development by creating an account on GitHub.
12:31 PM
↑三角波をライブコーディングしてる 何となくわかる
12:32 PM
なんかシェーダーみたいな感じだな
12:33 PM
あ、最後はちょっと演奏っぽくなった
Avatar
Luaにもコンパイルできるの面白いな
Avatar
omochimetaru 4/3/2024 12:47 PM
exampleの方に戻ってきたけど
12:47 PM
Vultで音を作るんじゃなくて、これは部品として使っていて
12:48 PM
C++化したVultコードをSwiftで合成しているな
12:50 PM
SwiftとWebの境界は、家庭くんが作ってた @_extern(wasm) を使うアプローチなんだな
12:52 PM
Vultでの音楽プログラミングのイメージがわかないからこれをSwiftでラップしてどのくらい嬉しくなってるのかがピンとこねえ
12:53 PM
12:53 PM
これがJS側からWASMに関数を渡している部分で
12:54 PM
Swift側からそれをこうやって宣言することで叩くと
12:55 PM
const { instance } = await WebAssembly.instantiateStreaming( fetch('.build/wasm32-unknown-none-wasm/release/swift-audio.wasm'), { ...importsObject, } ); instance.exports.main();
12:56 PM
JS側から明示的にエントリーしてる
12:56 PM
@Yuta Saito 以前も聞いた気がするけど、WASMオブジェクト側のメモリとかの実行状態は、この instance のなかで継続してるのかな?
Avatar
うむ
Avatar
omochimetaru 4/3/2024 12:57 PM
JS側から呼べるのはSwift側でexposeしているからだな
Avatar
Avatar
Yuta Saito
うむ
omochimetaru 4/3/2024 12:57 PM
じゃあ例えば単純には、Swift側で @_expose(wasm, "onClick") func onClick { ... } みたいなことをやって
12:57 PM
HTML側のonClickからJSで instance.onClick() とやれば
12:58 PM
UIとインタラクトして動作するわけね
Avatar
そうそうそんな感じですね
Avatar
omochimetaru 4/3/2024 1:01 PM
なるほど だいたいわかったぞ
1:03 PM
dimalloc/include/wasi_api.h はどこからきたんだ・・・
1:03 PM
Code in Sources/dlmalloc directory is derived from wasi-libc: https://github.com/WebAssembly/wasi-libc
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
1:03 PM
書いてあった
Avatar
errno定数だけwasiのやつを使ってるのか
Avatar
omochimetaru 4/3/2024 1:05 PM
ややこしいな wasi-libcからdlmallocだけパクってきてるから
1:05 PM
いろんなものの関心の境界がわからんw
Avatar
  • WASIのシステムインターフェース自体は使ってない
  • アロケータはWasm自体のspecの範囲で書ける
Avatar
omochimetaru 4/3/2024 1:07 PM
wasi_api.h でめっちゃ色々書いてるけど、ほとんど使ってなさそうな
Avatar
Avatar
Yuta Saito
  • WASIのシステムインターフェース自体は使ってない
  • アロケータはWasm自体のspecの範囲で書ける
omochimetaru 4/3/2024 1:07 PM
WASI使ってないってこと?
Avatar
そうそう。だからJS側のエントリポイントでWASI実装差し込んでないんですよ
Avatar
omochimetaru 4/3/2024 1:07 PM
ややこしい〜!w
1:08 PM
ただwasi-libcのdlmallocがwasmサポートに改造されてるからパクっただけで
1:08 PM
wasiを使って動いているわけではないんだ
Avatar
そうそう。
1:08 PM
なのでこれは完全にwasi-lessなバイナリなんだけど一部wasi-libcの実装が入ってるw
Avatar
Avatar
omochimetaru
swift-for-wasm-examplesをやってみているが
だからターゲットトリプル(4つフィールドあるけど)にwasi入ってないんですよ
Avatar
omochimetaru 4/3/2024 1:09 PM
swift build --triple wasm32-unknown-none-wasm -c release --product swift-audio
1:09 PM
確かに!
Avatar
none OS
Avatar
omochimetaru 4/3/2024 1:10 PM
4つ目の -wasm なくても伝わりそう
1:10 PM
wasm32 って最初に言ってるし
Avatar
このケースの4つ目のObject Formatフィールドは無くても動くはず
Avatar
omochimetaru 4/3/2024 1:12 PM
[omochi@omochi-mbp swift-for-wasm-examples (main =)]$ swift build --triple wasm32-unknown-none -c release --product swift-audio Building for production... error: emit-module command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: could not find module 'Swift' for target 'wasm32-unknown-none'; found: riscv32-none-none-eabi, riscv64-none-none-eabi, i686-unknown-none-elf, armv7-apple-none-macho, armv6m-none-none-eabi, aarch64-none-none-elf, wasm64-unknown-none-wasm, arm64-apple-macos, i686-unknown-windows-msvc, x86_64-unknown-none-elf, x86_64-unknown-windows-msvc, arm64-apple-none-macho, armv7-none-none-eabi, armv7em-none-none-eabi, arm64e-apple-macos, x86_64-apple-macos, armv6-apple-none-macho, armv6m-apple-none-macho, wasm32-unknown-none-wasm, armv7em-apple-none-macho, armv6-none-none-eabi, at: /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain/usr/lib/swift/embedded/Swift.swiftmodule <unknown>:0: error: could not find module 'Swift' for target 'wasm32-unknown-none'; found: riscv32-none-none-eabi, riscv64-none-none-eabi, i686-unknown-none-elf, armv7-apple-none-macho, armv6m-none-none-eabi, aarch64-none-none-elf, wasm64-unknown-none-wasm, arm64-apple-macos, i686-unknown-windows-msvc, x86_64-unknown-none-elf, x86_64-unknown-windows-msvc, arm64-apple-none-macho, armv7-none-none-eabi, armv7em-none-none-eabi, arm64e-apple-macos, x86_64-apple-macos, armv6-apple-none-macho, armv6m-apple-none-macho, wasm32-unknown-none-wasm, armv7em-apple-none-macho, armv6-none-none-eabi, at: /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain/usr/lib/swift/embedded/Swift.swiftmodule
Avatar
ハハだめじゃんw
Avatar
omochimetaru 4/3/2024 1:12 PM
ツールチェーンにstdlibが無い、みたいなやつか?
1:13 PM
wasm64-unknown-none-wasm wasm32-unknown-none-wasm ↑foundの中にはこの2つがあるな (edited)
Avatar
3つ版にマッチするpre-builtされたswiftmoduleが無いってことですね
Avatar
omochimetaru 4/3/2024 1:13 PM
なるほどなるほど。
1:14 PM
4つ目はオブジェクトフォーマットなんですね
Avatar
オブジェクトフォーマットもしくはエンバイロメントです
Avatar
omochimetaru 4/3/2024 1:14 PM
確かに多くの場合はCPU, Vendor, OSが決まったら定まってそう (edited)
1:15 PM
いや、
1:15 PM
4つ組だらけだな?上のログ
Avatar
embedded向けには4つ版使ってるっぽい
Avatar
omochimetaru 4/3/2024 1:15 PM
riscv32-none-none-eabi riscv64-none-none-eabi i686-unknown-none-elf armv7-apple-none-macho armv6m-none-none-eabi aarch64-none-none-elf wasm64-unknown-none-wasm arm64-apple-macos i686-unknown-windows-msvc x86_64-unknown-none-elf x86_64-unknown-windows-msvc arm64-apple-none-macho armv7-none-none-eabi armv7em-none-none-eabi arm64e-apple-macos x86_64-apple-macos armv6-apple-none-macho armv6m-apple-none-macho wasm32-unknown-none-wasm armv7em-apple-none-macho armv6-none-none-eabi
Avatar
まあnone OSだと自明じゃないケースもあるんで
Avatar
Avatar
Yuta Saito
embedded向けには4つ版使ってるっぽい
omochimetaru 4/3/2024 1:16 PM
あーこれembedded modeの影響も受けているのか?
Avatar
none OSはEmbeddedモード強制ですね今のところ
Avatar
omochimetaru 4/3/2024 1:16 PM
ほんとだ、よくみたら emit-module が落ちている
Avatar
omochimetaru 4/3/2024 1:20 PM
Environmentとして読んでみて、だめならFormatとして読んでみる、なるほど
1:22 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
1:22 PM
dlmalloc/src の中身全然違って笑ってる
1:24 PM
/* Symbol marking the end of data, bss and explicit stack, provided by wasm-ld. */ extern char __heap_base; extern char __heap_end;
1:24 PM
wasmのリンカーが __heap_base__heap_end をリンクしてくれる、というのが、
1:25 PM
wasmのレベルのメモリAPIってこと?
Avatar
omochimetaru 4/3/2024 1:25 PM
dlmallocはその中を管理してチャンクを提供したりする
1:26 PM
ファイルリストが違いすぎるのが気になってる
1:26 PM
なんならmallocはCソースじゃなくてヘッダーだし・・・
Avatar
そうすね。リンカが静的な領域(スタック、rodata、data)をレイアウトしてその後ろはプログラム側が伸ばせる。リンカはその境界をシンボル注入して教えてくれる
1:27 PM
ディレクトリ構造が違うのはそうすね。でもパット見全部wasi-libcにあるソースだな。
Avatar
omochimetaru 4/3/2024 1:28 PM
あーそういうことか
1:28 PM
errno.c とかは別のディレクトリにおいてあるやつをかき集めてきたのか (edited)
1:31 PM
heap_end で全部あるわけじゃなくて、 /* Get memory from system using MORECORE or MMAP */ static void* sys_alloc(mstate m, size_t nb) {
1:31 PM
この中でMORECORE?やMMAPを呼んでセグメントをもらって、
1:31 PM
dlmallocの管理プールに足す感じだ
Avatar
memory.growという命令があるんでそれを使います
Avatar
omochimetaru 4/3/2024 1:33 PM
むむ!まだ潜れるのか
1:33 PM
uintptr_t old = __builtin_wasm_memory_grow(0, (uintptr_t)increment / PAGESIZE);
1:33 PM
これか
Avatar
それ
Avatar
omochimetaru 4/3/2024 1:34 PM
wasm_memory_growsbrk の実装になってて
1:35 PM
sbrkMORECORE の実装になってるっぽいな #define MORECORE_DEFAULT sbrk
Avatar
うむ
Avatar
omochimetaru 4/3/2024 1:35 PM
で、sys_allocmalloc って感じで libc らしくなるのか
Avatar
wasi-libcの歩き方完全理解
Avatar
omochimetaru 4/3/2024 1:39 PM
Linuxを見てきた sbrk のなかで sys_brk を呼んでいて、 それが return (void *)my_syscall1(__NR_brk, addr); している https://github.com/torvalds/linux/blob/3e92c1e6cd876754b64d1998ec0a01800ed954a6/tools/include/nolibc/sys.h#L87
1:40 PM
my_syscall はアセンブリを出すマクロになってる、これがシステムコールABIなのか
Avatar
そう、そこがシステムコールになってるか組み込みの命令になってるかが普通と違うんですよね (edited)
Avatar
omochimetaru 4/3/2024 1:41 PM
なるほどなるほど
1:41 PM
wasi-libc は(LinuxのようなOSと比べると)小さいからこういうのがわかっていいな (edited)
Avatar
Wasmはシステムプログラミングの勉強にも良い
Avatar
omochimetaru 4/3/2024 1:42 PM
ああそうか、 __builtin_wasm_memory_grow は関数としてリンクするんじゃなくて
1:42 PM
コンパイラがそういうWASM命令に変換するだけか
1:43 PM
そこでWASMバイナリとしてのボトム表現になるんだ
1:43 PM
あ〜そうかだから
1:43 PM
CPU命令とシステムコールの区別がないのか
1:43 PM
両方WASM命令として同じレイヤーにある
Avatar
ほとんどのシステムコールに対応するものはWASIの関数として提供されてます
Avatar
omochimetaru 4/3/2024 1:44 PM
面白いなあ
1:45 PM
JVMと比べると、あれはオブジェクトの生成とかが命令のレベルだけど、 確かにここまで命令のレベルを下げないと、いろんな言語のバイナリが乗らないんだ
1:45 PM
だいたい何でもlibc使ってるから、libcより下のところでインターフェースを切る必要がある
1:45 PM
libcじゃないGoバイナリとかもこれなら同じように実装できるし。
Avatar
memory.growを命令セットに含めたデザインはかなり好き
Avatar
omochimetaru 4/3/2024 1:47 PM
不思議な感じだ
1:47 PM
これまでの常識と結構違うのにうまくハマってるようにも見える
Avatar
これをWASIの一部にしなかったことでホストの提供する機能に依存せずにどこでも大体のバイナリが動く
Avatar
omochimetaru 4/3/2024 1:49 PM
あれ、そうだ、そうするとWASIって何だったっけ
Avatar
ファイルシステム、時計、乱数、コマンドライン引数、環境変数
Avatar
omochimetaru 4/3/2024 1:50 PM
あ〜〜
Avatar
これは組み込みにするとデカすぎるのであくまでユーザ側で制御するオプショナルな機能群。Webでどう表現するか議論の余地もあるし。 (edited)
Avatar
omochimetaru 4/3/2024 1:51 PM
そうかそうか、WASIはそのインターフェース規格で、実装は自由で、 実際には JS側からさっきのアレで注入したりとか色々あるのか
1:51 PM
でもメモリ確保はWASIじゃなくてWASMコア仕様の方に入れたわけか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 1:51 PM
何も考えなければfopenとかmallocと同じノリで
1:51 PM
WASIの方にメモリ領域確保を置く設計もあり得るわけだけど
1:52 PM
そうしてないところにセンスがあるな
Avatar
共感が得られた!
Avatar
omochimetaru 4/3/2024 1:53 PM
WASMがVMや実行環境の文脈で語られる気持ちがわかってきた
1:53 PM
これは深いな
1:53 PM
すごいねえ
Avatar
Avatar
Yuta Saito
共感が得られた!
omochimetaru 4/3/2024 1:54 PM
漠然としたイメージで認識は合ってたけど、ディテールを知ると味があるね。
1:56 PM
下側はだいたいわかったので次はcartonを見ておこうかな・・・ https://github.com/swiftwasm/carton
📦 Watcher, bundler, and test runner for your SwiftWasm apps - swiftwasm/carton
Avatar
cartonは最近超薄くなりました
Avatar
omochimetaru 4/3/2024 1:57 PM
1:58 PM
気になる(まだ、理解できる前提知識が足りるかわからんが
Avatar
SwiftPM Pluginになった
Avatar
omochimetaru 4/3/2024 1:58 PM
え!それはえらい
1:58 PM
謎の自前コマンド体系じゃないんですね
1:58 PM
swiftpmの枠の中に収まった
Avatar
コンパチのために若干枠をはみ出してるけど、SwiftPMの方をなおして枠に収める予定
Avatar
omochimetaru 4/3/2024 1:59 PM
なるほどw
2:00 PM
plugin commandってrunからキックできたんだっけ
2:00 PM
swift package cmd じゃなかったっけ?
Avatar
そこがはみ出てるポイントですな
Avatar
omochimetaru 4/3/2024 2:00 PM
README1段落目で草 (edited)
2:00 PM
ん?今はどうなってんだこれ
2:01 PM
.executableTarget( name: "carton", dependencies: [ "SwiftToolchain", "CartonHelpers", ] ),
2:01 PM
普通にこうなってるのか。
Avatar
ツールチェイン自体の自動インストールはSwiftPMのプラグインじゃ表現できないんすよ
Avatar
omochimetaru 4/3/2024 2:02 PM
swift compiler toolchainの管理もするの? (edited)
Avatar
うむ。自前で入れてたらピュアなSwiftPM Pluginとして使える
Avatar
omochimetaru 4/3/2024 2:03 PM
なるほどなるほど
2:04 PM
carton って命名の由来ってどっかに説明ある?
Avatar
わかんない…Maxにきいてみよ
Avatar
omochimetaru 4/3/2024 2:04 PM
単にwebpackとかbundlerとかcrateみたいな感じで箱って言ってるだけなんかな
2:04 PM
web assemblyにシャレが効いてたらよかったなって・・・思いました
Avatar
プラグインになったことでSwift SDKとの連携もシンプルにできるようになった https://github.com/swiftwasm/carton/pull/420
Breaking changes: carton CLI is now slimmed down to be a SwiftPM Plugin. This means that you can now use carton by just declaring it as a dependency in your Package.swift file. dependencies: [ ...
2:05 PM
たしかに
Avatar
omochimetaru 4/3/2024 2:06 PM
これが今の話か。図だ。
2:07 PM
If you already use carton before 0.x.x versions via Homebrew, you can remove it with brew uninstall carton and install the new version as a SwiftPM dependency.
昔はbrew installだったのがpackage pluginでよくなったのか いいねえ
2:08 PM
こういうブートストラップが一段標準化するだけでかなり違うんだよな こういう謎環境は
Avatar
brewメンテするの本当にダルくてリリースの腰が重かったんだけど、だいぶ気軽にできるようになったし、なんならリリースしなくてもコミット指定できるから超便利になった
Avatar
omochimetaru 4/3/2024 2:10 PM
あー提供側も楽になるんだね そっちの目線は全くなかったw
Avatar
win-win ✌️✌️
2:12 PM
ただプレビルドを提供しなくなったのでユーザ側でビルドしてもらう必要があるんですよね。プラグイン化にあたってかなり依存減らしてビルド時間に気をつけてるんですけど、それでも気になるかもしれない。 (edited)
Avatar
omochimetaru 4/3/2024 2:14 PM
マクロと同じでpluginもwasm runtime上で動くようにしてプレビルドを・・・
Avatar
道のり長いなw
2:15 PM
まずウェブサーバをWasm上で動かします
Avatar
omochimetaru 4/3/2024 2:15 PM
dev serverがあるからそうだ・・・
Avatar
でもじつはこれはそれなりに現実的に見えてきたんだよな
Avatar
omochimetaru 4/3/2024 2:16 PM
まじか
Avatar
もうちょっと頑張るといける
Avatar
omochimetaru 4/3/2024 2:17 PM
ちょっとの感覚が全然わからんけどw
Avatar
Dispatch is not supported on WASI, and only Unix domain sockets are supported, which means we have to exclude those APIs on this platform. There's work in progress to enable tests for this on C...
2:17 PM
第一弾
Avatar
omochimetaru 4/3/2024 2:17 PM
あ〜そういうところからか
Avatar
でも真面目な話Wasmで自立httpサーバはいろんな関係者にモチベがあるんで遠くないと思います (edited)
Avatar
omochimetaru 4/3/2024 2:19 PM
swift-nioってこれまではDispatchがいつも合ったのか
Avatar
なのであとちょっと🤏
2:19 PM
Dispatchがいつまでもあると思うなよ😤
Avatar
omochimetaru 4/3/2024 2:20 PM
Dispatchはなんかif canimportで潰してるだけであんまり大変なことにはなってなさそうだ
2:25 PM
2:25 PM
なんかXcode15.3が、ちゃんと6.0.0-devになってるsnapshotツールチェーンを設定していても、
2:25 PM
Package.swiftのswift-tools-version バージョンチェックで死ぬのが直らない? (edited)
2:26 PM
まあ5.9って書いておくか・・・
Avatar
そこの二つは別のSwiftPMなんで…
Avatar
omochimetaru 4/3/2024 2:27 PM
やっぱここ切り替わってない?w
2:28 PM
ほんとだ、なんか落ちてきた
Avatar
ざんねんながら
Avatar
omochimetaru 4/3/2024 2:28 PM
Xcodeならまあそうだろうなという感じのバグだ
2:32 PM
hot reloadが動いた
2:35 PM
そうなるのか!
Avatar
ヘッドレスブラウザモードもある
Avatar
omochimetaru 4/3/2024 2:36 PM
これはどうなってんだ、ブラウザ上でwebsocketをcarton cliに繋いで、xctestの出力を飛ばしてるのか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 2:37 PM
--headless When running browser tests, run the browser in headless mode おー
2:37 PM
Launch WebDriver executable: /System/Cryptexes/App/usr/bin/safaridriver Error: httpError("{\"value\":{\"error\":\"session not created\",\"message\":\"Could not create a session: You must enable the \'Allow Remote Automation\' option in Safari\'s Develop menu to control Safari via WebDriver.\",\"stacktrace\":\"\"}}") error: Plugin ended with exit code 1
2:38 PM
なんか惜しいな JSONの中に指示が書いてあるぞ
2:39 PM
これかな
Avatar
ですねSafariだとそれ必要
Avatar
omochimetaru 4/3/2024 2:40 PM
Error: bind(descriptor:ptr:bytes:): Address already in use (errno: 48) error: Plugin ended with exit code 1
2:40 PM
惜しい
Avatar
へーswift-nioのwasi対応進んでるんですね
2:41 PM
いつかのissueで出来たら嬉しいけど現状とても困難みたいなこと言われてた気がするけど、だいぶ進んだな
Avatar
Avatar
omochimetaru
Error: bind(descriptor:ptr:bytes:): Address already in use (errno: 48) error: Plugin ended with exit code 1
最近直したけどまだリリースしてなかったかも
Avatar
Avatar
Yuta Saito
最近直したけどまだリリースしてなかったかも
omochimetaru 4/3/2024 2:41 PM
他にサーバ立ってないか探してるけど、バグなの
Avatar
いったんkillall safaridriverで
Avatar
omochimetaru 4/3/2024 2:42 PM
ほうほう (edited)
2:42 PM
おお!できた!
2:43 PM
あれ、また壊れた - checking WebDriver endpoint: WEBDRIVER_REMOTE_URL - checking WebDriver executable: WEBDRIVER_PATH - checking WebDriver executable in PATH: chromedriver, geckodriver, safaridriver, msedgedriver Launch WebDriver executable: /System/Cryptexes/App/usr/bin/safaridriver Error: httpError("") error: Plugin ended with exit code 1
Avatar
できたー
2:44 PM
だめじゃん
Avatar
omochimetaru 4/3/2024 2:44 PM
3回ぐらいできたんだけど
2:44 PM
これになった
2:45 PM
むむ 色々殺したけど直らん
Avatar
なんかsafaridriver死にきらないことあるんですよね
Avatar
omochimetaru 4/3/2024 2:45 PM
- checking WebDriver executable in PATH: chromedriver, geckodriver, safaridriver, msedgedriver
2:45 PM
chromeとか書いてあるけどsafari以外もできるの? (edited)
Avatar
いろいろできる
Avatar
omochimetaru 4/3/2024 2:46 PM
へー これ標準化?されてるのか
Avatar
WebDriverってやつに準拠してるやつならドライバ指定したらいい感じに動くはず
Avatar
omochimetaru 4/3/2024 2:46 PM
知らなかった
2:47 PM
そして全然直らないw
2:47 PM
safariってついてるプロセス全部殺した
2:47 PM
mac再起動してみるか
Avatar
cartonってついてるプロセスも
Avatar
omochimetaru 4/3/2024 2:47 PM
2:47 PM
なるほど
2:47 PM
いないわ
Avatar
あらー
Avatar
omochimetaru 4/3/2024 2:51 PM
2:51 PM
macOS再起動したらまた動いた
Avatar
じゃあやっぱりなにかプロセス残ってるんだろうなぁ
Avatar
omochimetaru 4/3/2024 2:54 PM
2:55 PM
撮影してみた
Avatar
うーん手元で沢山走らせてみてるけど再現しないなぁ
Avatar
omochimetaru 4/3/2024 2:55 PM
ヘッドレスモードって書いてるけど普通に立ち上がって、 ただアドレスバーがオレンジ色になっていて、 そして閉じてるな
2:55 PM
これはそういうもん?
Avatar
WebDriverはそういうもんですね
naruhodo 1
Avatar
Avatar
Yuta Saito
うーん手元で沢山走らせてみてるけど再現しないなぁ
omochimetaru 4/3/2024 2:55 PM
QTで録画しようとしたことで何かが壊れたのかと思ったけどそうでもなかった
Avatar
あ、再現した
Avatar
omochimetaru 4/3/2024 2:56 PM
おお
Avatar
40回目でついに
Avatar
omochimetaru 4/3/2024 2:56 PM
よく数覚えてたね
Avatar
for i in $(seq 1 100); do echo "$i'th try...."; swift run carton test --environment browser --headless; done
Avatar
omochimetaru 4/3/2024 2:57 PM
賢かった
2:57 PM
じゃあ負荷とか運とかなのかこれ
2:57 PM
そこからの復活方法がわかると助かるが・・・ (edited)
Avatar
killall safaridriverとSafari.appのquiteで復活した
Avatar
omochimetaru 4/3/2024 2:59 PM
carton dev とか carton test が、 ツールチェインの選択とか、ビルドするときに走らせてるswiftのビルドコマンドがどうなってるかって、 どこでわかったり、コントロールできる?
Avatar
Avatar
Yuta Saito
killall safaridriverとSafari.appのquiteで復活した
omochimetaru 4/3/2024 2:59 PM
えーマジか 同じことやったつもりだった
Avatar
Running "..."で大まかなコマンドは表示されてて、
tashikani 1
Avatar
omochimetaru 4/3/2024 3:00 PM
何がコントロール可能で何がcarton managedなのかがまだよくわからない
Avatar
SwiftPM Plugin配下で実行されてる細かいやつはそこに出てるswift package コマンドを swift package --verboseに変えて実行すると詳細なログ出てきます
Avatar
omochimetaru 4/3/2024 3:02 PM
なるほど
3:02 PM
webpack.config.js とか vite.config.js tsconfig.json みたいなものはないの?
3:02 PM
a smooth zero-config experience
って書いてあるけど・・・
Avatar
ユーザに自由度をもたせると大変なのでcartonのレイヤでは提供してません
Avatar
omochimetaru 4/3/2024 3:03 PM
ワオー
Avatar
もっとコントロールが欲しいパワーユーザはSwiftPMを直接使いましょうという割り切り
3:04 PM
でもテストランナーとかは便利なんでビルドと切り離してスタンドアロンで使うオプションがある
3:04 PM
結局大して設定したいこと無いんで
Avatar
omochimetaru 4/3/2024 3:04 PM
$ swift run carton bundle After stripping debug info the main binary size is 20.80 MB Running... wasm-opt -Os --enable-bulk-memory /Users/omochi/work/swiftwasm/MyApp/Bundle/main.wasm -o /Users/omochi/work/swiftwasm/MyApp/Bundle/main.wasm Process failed and produced following output: Warning: wasm-opt failed to optimize the binary, falling back to the original binary. If you don't have wasm-opt installed, you can install wasm-opt by running `brew install binaryen`, `apt-get install binaryen` or `npm install -g binaryen` Copying resources to /Users/omochi/work/swiftwasm/MyApp/Bundle/JavaScriptKit_JavaScriptKit.resources Bundle generation finished successfully could not find executable for 'wasm-opt'
3:05 PM
あ、wasm-optがないだけか
Avatar
Avatar
Yuta Saito
結局大して設定したいこと無いんで
omochimetaru 4/3/2024 3:05 PM
とりあえずswift-5.9.2が勝手に選択されたところが一番気になった (edited)
3:05 PM
例えばsnapshotのswiftを使いたいなどがありそう
Avatar
そこは.swift-versionファイルで申し訳程度の制御はできる。
Avatar
omochimetaru 4/3/2024 3:06 PM
確かに、コンパイルオプションはPackage.swiftの方で書けるな
Avatar
だがそもそもツールチェインインストール部分を使わずにSwiftPMプラグインを直接叩く場合ツールチェインの選択二関しては完全なコントロールが手に入る
Avatar
omochimetaru 4/3/2024 3:07 PM
/** Infer `swift` binary path matching a given version if any is present, or infer the version from the `.swift-version` file. If neither version is installed, download it. */ public func inferSwiftPath( from versionSpec: String? = nil, _ terminal: InteractiveWriter ) async throws -> (AbsolutePath, String) { この辺だな
Avatar
Avatar
Yuta Saito
だがそもそもツールチェインインストール部分を使わずにSwiftPMプラグインを直接叩く場合ツールチェインの選択二関しては完全なコントロールが手に入る
omochimetaru 4/3/2024 3:07 PM
なるほどなるほど
3:07 PM
そのあたりのコマンドやプラグインの全容はどこ読めばわかるん
3:08 PM
今の所READMEの次に読むべきやつがわからないw (edited)
Avatar
さっきのプルリクが一番詳しいかもしれない
Avatar
omochimetaru 4/3/2024 3:08 PM
なるほどw
3:09 PM
じゃああとはcartonのソース読んだ方が早そうだな
Avatar
この辺はもうだいぶ分かってる人しか気にならないポイントなんで、そういう人は自分で調べられる
Avatar
omochimetaru 4/3/2024 3:10 PM
調べる前に「ドキュメントがない」ことが悪魔の証明なのがちょっとつまづいたかも
Avatar
なるほど、どこかにちゃんとしたドキュメントが存在するかもしれない可能性が捨てきれないのかw
Avatar
omochimetaru 4/3/2024 3:11 PM
そうそう。
3:12 PM
swiftwasm bookの方もあるから余計にね
3:14 PM
No longer directly depend on SwiftPM as a library. This means that carton no longer has to be updated when SwiftPM is updated (hopefully).
でけえw
3:14 PM
3:15 PM
swiftpmとvaporに依存してたのすごいなww
Avatar
Avatar
Yuta Saito
cartonは最近超薄くなりました
omochimetaru 4/3/2024 3:15 PM
cartonは最近超薄くなりました
思ったよりダイエットしてた
Avatar
Avatar
omochimetaru
そうそう。
足してみた
Avatar
omochimetaru 4/3/2024 3:16 PM
いいね!!
Avatar
tools-support-coreの依存を外すのが超大変だった
Avatar
omochimetaru 4/3/2024 3:17 PM
このへんか
Avatar
Vapor外すのはNIOちょろっと使えばいいだけだからそこまで難しくない
Avatar
omochimetaru 4/3/2024 3:18 PM
おーー
3:18 PM
Vapor.Application が消えて、生の channel が生えてる。 (edited)
3:19 PM
はいはいはい
3:20 PM
直nioいいね
3:22 PM
channelReadでHTTPRequest受け取るのこんな感じになるのかー
3:22 PM
NIOHTTP1モジュールでほんとに最低限はいけるんだね
3:23 PM
let response: StaticResponse do { switch head.uri { case "/": response = try respondIndexPage(context: context) case "/main.wasm": response = StaticResponse( contentType: "application/wasm", body: try context.channel.allocator.buffer( bytes: localFileSystem.readFileContents(configuration.mainWasmPath).contents ) ) default: guard let staticResponse = try self.respond(context: context, head: head) else { self.respond404(context: context) return } response = staticResponse } } catch { configuration.logger.error("Failed to respond to \(head.uri): \(error)") response = StaticResponse( contentType: "text/plain", body: context.channel.allocator.buffer(string: "Internal server error") ) } self.responseBody = response.body ルーティングw
Avatar
SSL不要にできるだけでもだいぶビルド時間減るんですよね
3:23 PM
魂の手書きルーティング
Avatar
omochimetaru 4/3/2024 3:23 PM
わかる! >SSL
3:23 PM
あれがだるいんよ
3:24 PM
HTTPSはELBで終端してるからそもそも要らないし・・・ 外向きには必要だけど
3:25 PM
Xcode15.3になる前は Internal Inconsistency 何たらが出るたびにCNIOBoringSSLをフルビルドしてて終わってた
Avatar
BoringSSL何回もビルドしないといけない問題とビルド信頼性の無さで爆発 🤯
Avatar
omochimetaru 4/3/2024 3:27 PM
うむ
3:27 PM
あ、carton bundleいけた
3:27 PM
binaryan入れるだけでした
Avatar
brew配布の1個良かった点はそういう外部依存を記述できたところですね
3:29 PM
まあ逆に必要になったときに入れてもらうというモデルが出来なかったので一長一短ではあるが
Avatar
omochimetaru 4/3/2024 3:31 PM
いやーホスト環境の大きめの2次依存物が管理しづらいんだよね
3:31 PM
俺はこの方が全然いい
3:31 PM
忘れた頃にこのbinaryanを入れたのは誰じゃってなる
Avatar
まーbrewはそこ弱いですよね〜
Avatar
omochimetaru 4/3/2024 3:32 PM
なんかその辺調べる機能もしょぼい気がしてる 知らんだけかもしれないけど
3:32 PM
バンドルされたJS見てるんだけど最低限のコメント除去とか結合とか
3:32 PM
これはWasmTransformerがやってる?
Avatar
esbuildで処理したやつをリポジトリに埋めちゃってます
3:34 PM
WasmTransformerはJSは処理しない
Avatar
omochimetaru 4/3/2024 3:34 PM
entrypoint/bundle.js を加工して埋めてるわけじゃない?
Avatar
bundle.jsをesbuildでバンドルして埋めてる
Avatar
omochimetaru 4/3/2024 3:36 PM
あー理解しました
3:36 PM
そもそも carton/package.json が居るのか
Avatar
そうそう。
Avatar
omochimetaru 4/3/2024 3:37 PM
npmは使ってないような気がしていたわ
3:37 PM
dev server自分で立てるぐらいだから。
3:38 PM
import ReconnectingWebSocket from "reconnecting-websocket";
3:38 PM
そうかーこういう js側のcarton runtime libの実装のために使うのか (edited)
Avatar
ユーザの環境では必要ないしnpmパッケージとして配布してるわけでもないけど、開発者はちょっと使う
Avatar
omochimetaru 4/3/2024 3:40 PM
3:40 PM
最後の行だけガビガビなのなんだ
Avatar
コンテンツ本体はバイトリテラルにするとビルド時間が洒落にならないんでbase64 (edited)
Avatar
omochimetaru 4/3/2024 3:42 PM
むむっ
3:42 PM
// Base64 is not an efficient way, but too long byte array literal breaks type-checker let hashesFileContent = """ import CartonHelpers \(hashes.map { """ public let \($0)EntrypointSHA256 = ByteString([ \(arrayString(from: $1)) ]) """ }.joined(separator: "\n\n")) public let staticArchiveContents = "\(staticArchiveContents.withData { $0.base64EncodedString() })" """
3:43 PM
これは・・・?WASMになるSwiftに埋め込まれてる?
Avatar
cartonに埋め込まれてる
3:44 PM
carton bundleするときにファイルに書き出してるだけ (edited)
3:45 PM
entrypoint/*.js に更新があったら開発者がコード生成してそのファイル更新するというとんでもない運用
Avatar
omochimetaru 4/3/2024 3:46 PM
誰をなんの変更から守ってるんだ?
3:46 PM
まだわかってない
Avatar
いやあこれ分かりにくいよなぁ
Avatar
omochimetaru 4/3/2024 3:48 PM
3:48 PM
わかったかも
3:48 PM
いやわからん
Avatar
エントリポイントの.jsファイルはいくつか依存パッケージがあるんで1枚のJSファイルにバンドルしておきたい。
🆗 1
3:49 PM
バンドルされたJSファイルはcartonといっしょに配布したい
🆗 1
3:51 PM
cartonコマンドのStaticArchive.swiftにはバンドルされたJSファイルを埋め込んでる
3:52 PM
carton bundleコマンドは埋め込まれたJSファイルを ./Bundle に書き出す
Avatar
omochimetaru 4/3/2024 3:53 PM
あーー
3:53 PM
あーごちゃごちゃになってた場所がわかった
3:54 PM
npm経由でesbuildを叩くのは
3:54 PM
carton自体の開発環境で
3:54 PM
cartonを使うwasm appユーザの環境じゃないのか
Avatar
そのとおり
Avatar
omochimetaru 4/3/2024 3:55 PM
cartonを使う時は、carton bundleコマンドが、このbase64になってるWASIとかがくっついたbundle.jsを吐き出してるだけなのかw
3:56 PM
それって普通にcartonのswiftpm packageのresourceとして置いといてファイルとしてとって来れないんか? (edited)
Avatar
バイナリ配布時代の名残ですね
Avatar
omochimetaru 4/3/2024 3:56 PM
brewとかで配布するやつを、ディレクトリパッケージじゃなくて、ワンバイナリにしたかった?
Avatar
シングルバイナリで配ってたんでresourceはおけなかった
Avatar
omochimetaru 4/3/2024 3:56 PM
理解〜〜〜
Avatar
いまならembedなんちゃらが使えるかもしれないけどあんまりあれの品質を信頼できてない
Avatar
omochimetaru 4/3/2024 3:57 PM
githubからダウンロードとかでもよかったような気がする
3:58 PM
コミットハッシュ指定+パス指定で落とす
Avatar
昔それやってたんですけどリリースフローがクソめんどくさくなるんですよ
Avatar
omochimetaru 4/3/2024 3:58 PM
なるほど。
3:58 PM
確かに順序の問題が出ちゃうな
Avatar
まあ今ならもう少しシンプルな方法があるはず
Avatar
omochimetaru 4/3/2024 3:59 PM
GitHub Actionで生成してGitHub の release Artifactとして配布する?
Avatar
Avatar
omochimetaru
GitHub Actionで生成してGitHub の release Artifactとして配布する?
ああ、実際にやってたのはこれだな
Avatar
omochimetaru 4/3/2024 3:59 PM
それでも大変なもんか なるほど
3:59 PM
とりあえず staticArchiveContents はわかったぞ (edited)
3:59 PM
devEntrypointSHA256 は・・・?
4:00 PM
let staticArchiveContents = try localFileSystem.readFileContents( AbsolutePath( validating: "static.zip", relativeTo: localFileSystem.currentWorkingDirectory! ))
4:00 PM
これzipなのか
Avatar
それもうzipである必要ないんだよなー
Avatar
omochimetaru 4/3/2024 4:01 PM
zipが丸ごとbase64で staticArchiveContents に入ってて解凍して出てくる dev.js のハッシュをチェックする? (edited)
Avatar
あとそれを ~/.carton/staticに展開するんだけど今となってはそれも必要ない気がする
Avatar
omochimetaru 4/3/2024 4:01 PM
あ、これは解凍すればわかるじゃん
Avatar
shaはインターネット経由でダウンロードしてた時代にマックスが一応チェックしとくかと入れたやつ
4:03 PM
それもいらないと思う
Avatar
omochimetaru 4/3/2024 4:03 PM
でけた
Avatar
Avatar
Yuta Saito
それもいらないと思う
omochimetaru 4/3/2024 4:03 PM
zip解凍時にダイナミックに壊れる可能性はなかなか無いよね
4:03 PM
ダウンロード時代の名残な訳か (edited)
Avatar
so (stack overflow) sanitizer.wasmももうwasi-libcにちゃんとしたサポート入れたからいらないな
4:04 PM
まだまだいらないものが沢山あるなーw
Avatar
omochimetaru 4/3/2024 4:05 PM
$ shasum -a 256 dev.js a8967c30e28b7a862c3548beedd9c62ee742a564bc373893154c45d98bafe4c9 dev.js public let devEntrypointSHA256 = ByteString([ 0xA8, 0x96, 0x7C, 0x30, 0xE2, 0x8B, 0x7A, 0x86, 0x2C, 0x35, 0x48, 0xBE, 0xED, 0xD9, 0xC6, 0x2E, 0xE7, 0x42, 0xA5, 0x64, 0xBC, 0x37, 0x38, 0x93, 0x15, 0x4C, 0x45, 0xD9, 0x8B, 0xAF, 0xE4, 0xC9 ])
4:05 PM
一致してた 理解したぞ
4:05 PM
ああそういうことか
4:06 PM
HashArchiveのロジックは、で、これを用意するためのユーティリティで、cartonの開発者が叩いてからコミットすると。
4:06 PM
これが carton-release パッケージに入ってることに気付くのが遅かった。。
Avatar
なるほどー
Avatar
omochimetaru 4/3/2024 4:09 PM
名前的に carton bundle の実行中に起きる何かかと思って見てた
Avatar
名前重要
Avatar
omochimetaru 4/3/2024 4:10 PM
いや〜だいたい色々わかったぞ ありがとうございます
4:10 PM
速習コースだった
4:11 PM
これを踏まえてライブラリの開発をどうやったらいいか考えるけど考えることがめちゃくちゃ多そう (edited)
4:11 PM
諸々のツールチェーンとかコマンドはあんまりつまづかなくて安定してると感じたし、swiftwasm布教ハンズオンとかがやれそうだと思った
Avatar
おー、よかったよかった
Avatar
Avatar
omochimetaru
これを踏まえてライブラリの開発をどうやったらいいか考えるけど考えることがめちゃくちゃ多そう (edited)
どのへんが難しそうすか?JS側から機能を注入する部分?
Avatar
Avatar
Yuta Saito
どのへんが難しそうすか?JS側から機能を注入する部分?
omochimetaru 4/3/2024 4:16 PM
まず考えてるのは、エンドユーザーがcarton以外の構成を選択する場合とかの考慮っすね
4:16 PM
carton提供の index.html を置き換える、ぐらいしか多分カスタムがないから (edited)
4:16 PM
例えばうちの業務でフロントをswiftwasmで書くとしたら色々ハマらなくて
4:17 PM
で、そういう様々なアプリケーションからswift-reactを依存して使うときに何がユーザ側の責任になるかなあとか
Avatar
難しいな、どこまでをcartonに任せるかだなぁ
Avatar
omochimetaru 4/3/2024 4:18 PM
cartonやらないってなった瞬間に自分でやることが結構多いから (edited)
4:19 PM
あとaudio-exampleのexpose/externの方式とかもあるし・・・ (edited)
4:19 PM
あとは単純に、swift-reactの自動テストとかサンプルデモ実装とかは
4:19 PM
index.html自体がたくさん欲しいよね
4:19 PM
これもcartonにはまらなそうだけどcarton testは使いたい
4:20 PM
一個のindex.html+一個のbundle.wasmだと、ビルドとしては1つしかないけど、 ライブラリとしてはいろんなビルドをたくさんexampleとして用意したい
Avatar
真面目なアプリケーションを書こうと思うと大抵既存のJSエコシステムの上でSwiftの.wasmバイナリを消費する形になるんだけど、現状のcartonだと消費する方法が固定なのでフィットしない。
Avatar
omochimetaru 4/3/2024 4:21 PM
そうそう。Tokamakみたいなアプローチだったらシンプルなんだけど
4:21 PM
俺がやりたいのは逆で
4:21 PM
JS/HTMLの基盤の上で追加的にswiftwasmを入れていくような状況を考えたい
Avatar
Rustのwasm-packみたいに./Bundleをnpm packageとして出力してJS側からimportできるようになると良いのでは
4:22 PM
あれはそれなりに上手く行ってるモデルなので真似するのは悪くないと思う
Avatar
omochimetaru 4/3/2024 4:23 PM
なるほど そういうのがあるのか
4:23 PM
Avatar
前者はだいたいTokamakとcartonで達成できてる
4:24 PM
後者は可能だけどとたんに難易度が上がる
4:24 PM
このギャップを埋めたい
Avatar
omochimetaru 4/3/2024 4:25 PM
あと、JavaScriptKitを組み込むところも考え中
Avatar
うちは僕が居るから後者が可能だけど、スケールしないからやはり後者の難易度を下げるのは普及にあたって必須だな
Avatar
omochimetaru 4/3/2024 4:26 PM
cartonベースのプロジェクトで使うライブラリだったらJSKがもう使える状態が前提になってシンプルそうだ
Avatar
Avatar
Yuta Saito
うちは僕が居るから後者が可能だけど、スケールしないからやはり後者の難易度を下げるのは普及にあたって必須だな
omochimetaru 4/3/2024 4:27 PM
この辺りの標準化難しそうだ
4:28 PM
なまじ初期状態が何もない自由な世界だから
4:28 PM
便利なツールが出てくると、今度は逆にみんながそれに乗ってないと困るみたいなロックインが起きそう (edited)
4:29 PM
Rust のコードがあれば、それを WebAssembly (Wasm) にコンパイルすることができます。このチュートリアルでは、Rust プロジェクトを WebAssembly にコンパイルし、既存のウェブアプリケーションで使用する方法を示します。
Avatar
./Bundle/index.mjsがこんな感じになってると良いのかな import { SwiftRuntime } from "./JavaScriptKit_resource/index.mjs" export function init() { const importObject = { javascriptkit: SwiftRuntime.importObjects } const { instance } = await WebAssembly.instantiate(..., importObject) return instance.exports }
Avatar
omochimetaru 4/3/2024 4:30 PM
wasm-packでRustパッケージがnpmパッケージになる方向はわかりやすいけど
4:30 PM
ここはどうなってるんだ?
4:30 PM
Rustコードがexternでリンクを要求しているシンボルを
4:30 PM
wasm instanceをロードするときに渡してあげる人が必要だよね
Avatar
#[wasm-bindgen]はマクロになっていて
4:31 PM
展開すると @_extern(wasm) てきなものになる
4:32 PM
ついでにマクロ展開中に特別なメタデータをオブジェクトファイルに含めるようにしてて
Avatar
omochimetaru 4/3/2024 4:32 PM
このパッケージされた init() が、jsのネームスペースからシンボルを集める?
Avatar
Avatar
Yuta Saito
ついでにマクロ展開中に特別なメタデータをオブジェクトファイルに含めるようにしてて
omochimetaru 4/3/2024 4:32 PM
ほうほう
Avatar
cargoがビルドプロセスを終えたあとに成果物の.wasmからメタデータを取り出してそれを元に JS側から WebAssembly.instantiatealert を渡すJSグルーコードを生成する (edited)
Avatar
omochimetaru 4/3/2024 4:33 PM
alert とかは JSのグローバルネームスペースが前提になってる?
Avatar
そのはずですね
4:34 PM
なのでグローバルから辿れるものしか直接 extern 宣言できない
4:34 PM
のではないかな?
Avatar
omochimetaru 4/3/2024 4:34 PM
なるほどなあ
Avatar
そのinit関数の引数として取ってユーザに注入させるというのもできると思う
Avatar
Avatar
Yuta Saito
cargoがビルドプロセスを終えたあとに成果物の.wasmからメタデータを取り出してそれを元に JS側から WebAssembly.instantiatealert を渡すJSグルーコードを生成する (edited)
omochimetaru 4/3/2024 4:35 PM
.wasm からメタデータを取り出すのちょっと面白いな
4:35 PM
あ、でもそうしておくとDCEとかと連動するのか
Avatar
そうそう。既存のビルドパイプラインに乗ってて賢いなと思った
Avatar
omochimetaru 4/3/2024 4:36 PM
そうかも・・・
Avatar
まだまだ改善スペースはたくさん!
Avatar
Avatar
Yuta Saito
./Bundle/index.mjsがこんな感じになってると良いのかな import { SwiftRuntime } from "./JavaScriptKit_resource/index.mjs" export function init() { const importObject = { javascriptkit: SwiftRuntime.importObjects } const { instance } = await WebAssembly.instantiate(..., importObject) return instance.exports }
omochimetaru 4/3/2024 4:39 PM
これは良さそうね。 今はJSKitとWASIの注入と実行が一塊に実装されてるから、ユーザがカスタム介入する余地がない まあcartonがそうだからそうだけど
4:40 PM
あ、あとまだよくわかってないところで
4:40 PM
4:40 PM
これが
4:40 PM
やったらできるよみたいな追加的な話?なのが気になっていて
4:41 PM
このセットアップも誰がどう責任を持つ体系になるんだろう
Avatar
デフォルトではSwiftのプロセスで完結したイベントループになってるんだけど、それやるとJavaScriptのイベントループと協調するようになる
Avatar
omochimetaru 4/3/2024 4:42 PM
デフォルトではSwiftのプロセスで完結したイベントループ
それって誰が回すんだ?
Avatar
JavaScriptの環境で動かすことを前提にするのであればオンにして不利益はあんまりないと思う
4:42 PM
main()関数が全てのjobを処理し終わるまで返ってこない
Avatar
omochimetaru 4/3/2024 4:42 PM
main で dispatchMain に自分で突入する?
Avatar
そんなかんじです
Avatar
omochimetaru 4/3/2024 4:48 PM
cartonのentrypointのjsを細切れに再利用できると便利そうだなあ と思って見てた 一応 common.js がライブラリっぽくなっているね
4:51 PM
よし寝ます、どうもありがとう
Avatar
cartonなくてもビルドはそんなに難しくないけど、謎のおまじない的なオプションをちょっと追加するのがネックだし、js側のブートストラップをしてくれるのが便利で、しかしこれだと
JS/HTMLの基盤の上で追加的にswiftwasmを入れていくような状況を考えたい
という場面で使いづらいので、やっぱりライブラリモードは欲しいですね
Avatar
omochimetaru 4/4/2024 12:27 AM
絶妙なそんなに難しくないけどちょっとめんどくさい感
Avatar
wasm-optとwasm-stripはSwiftPMで出荷されてる版のパッケージがあってもいいかもしれない?
Avatar
omochimetaru 4/4/2024 12:33 AM
確かに
12:34 AM
swift tool -p wasm-opt // パスが出る swift tool wasm-opt wasm-opt コマンドの代わり
12:34 AM
こういう感じで、システムインストールと共存してほしい
12:34 AM
xcrun とかでもうそういう仕組みがあるか
Avatar
あーそこまでは考えてなくて、単にartifactbundleでexecutable落としてくるパッケージ作るくらいで考えてました
Avatar
omochimetaru 4/4/2024 12:40 AM
そういうのやると $ swift package wasm-opt で使えるんだっけか
Avatar
そうですね。あるいは、既存プラグインの中からwasm-optを呼び出せる
Avatar
omochimetaru 4/4/2024 12:42 AM
それでよさそうだ
Avatar
Avatar
Iceman
wasm-optとwasm-stripはSwiftPMで出荷されてる版のパッケージがあってもいいかもしれない?
wasm-stripはWasmTransformerが同じことできるので置き換えられるかも。wasm-opt、というかbinaryenはそれなりに大きいんだよなぁ
Avatar
omochimetaru 4/4/2024 5:05 AM
どのくらい大きいの?
5:05 AM
現代ではプロジェクトごとにtypescript compilerをインストールしたりするし、割と許されそうなイメージだ
Avatar
artifactbundleのビルドをメンテするのが大変そうだなと思うレベルのおおきさ (edited)
Avatar
binaryenの中でwasm-optのbinだけを取り出して再パッケージのイメージでいました
5:07 AM
成果物は配布されてるので、binをartifactbundleの形式にディレクトリ構造を入れ替えるだけのイメージ
5:08 AM
1つ1MBくらいなので、全環境分でも4MBくらい?
Avatar
そもそもartifactbundleはホストプラットフォームサポートが限定されちゃうんであんまりやりたくないんですよねぇ
5:08 AM
あれはサポートされてるプラットフォームだけプレビルドみたいなことできるんだっけ
Avatar
限定されちゃうのはそうですね。されてないやつは別途ソースからビルドする方法を提供するとかは(凝ったPackage.swiftを書くとかでない限り)ないです
5:09 AM
binaryenをソースからビルドする方法を提供するのは厳しそうですね
Avatar
omochimetaru 4/4/2024 5:10 AM
ふーむ
Avatar
https://github.com/WebAssembly/binaryen/releases ここに書いてあるプラットフォームしかサポートされない
Avatar
そこのバイナリはあんまり使いたくないなぁ
Avatar
omochimetaru 4/4/2024 5:11 AM
binaryenをswiftpmでコンパイルできないか?
Avatar
頑張るとできるとおもう
Avatar
omochimetaru 4/4/2024 5:12 AM
wasmバイナリ用のツールだからそんなにホストOSに依存した機能無さそう
Avatar
毎回ビルドするのはちょっと躊躇われるくらいのビルド時間ですね
Avatar
omochimetaru 4/4/2024 5:12 AM
ウーム
Avatar
そうですね。ユーザが毎回ビルドするのはつらいし、SwiftPMのビルド構成をメンテナンスするのも大変そうです (edited)
Avatar
Emscripten経由のnpmパッケージが配布されてて、今のところそれが一番ポータブル
Avatar
Toolchains using Binaryen as a component (typically running wasm-opt) include: Emscripten (C/C++) wasm-pack (Rust) J2CL (Java; J2Wasm) Kotlin (Kotlin/Wasm) Dart (Flutter)
Avatar
omochimetaru 4/4/2024 5:14 AM
ややこしw
Avatar
って書かれてるけど、これらはどうやってwasm-optをひっぱってきてるんでしょうね
Avatar
Emscriptenは自分でビルド、wasm-packはGitHub Releasesからダウンロード、ほかはわからない
5:18 AM
うーんサポートされてるプラットフォームならcartonが外からダウンロードしてくるのが良いのかなぁ
5:20 AM
でもそもそもwasm-optは必ず適用しないといけないわけじゃないので、cartonがwasm-opt見つからないときに失敗するのがよくないな。
Avatar
まあ確かに、サポートされないプラットフォームならスキップでもいいですね
5:21 AM
結構サイズ変わるので目立たせてはあげたいので、warning出すくらいで良さそう
Avatar
サイズなぁ
5:23 AM
SwiftPMのオブジェクトリンクを辞めさせてアーカイブリンクにすればwasm-optが削ってる大半の部分はリンク時に削れるはずなんだけど、手が足りない
5:24 AM
ワーニング出してあげるのは現状だと正しいと思います
Avatar
Avatar
Yuta Saito
SwiftPMのオブジェクトリンクを辞めさせてアーカイブリンクにすればwasm-optが削ってる大半の部分はリンク時に削れるはずなんだけど、手が足りない
omochimetaru 4/4/2024 5:25 AM
それはめっちゃシンプルでいいね
5:26 AM
逆にbinaryenにはないリンク事最適化があったりしうる?
Avatar
いっぱいある
Avatar
omochimetaru 4/4/2024 5:28 AM
LLVMベースだからそうだよね
Avatar
omochimetaru 4/4/2024 12:44 PM
[omochi@omochi-mbp Toolchains]$ ls -al total 0 drwxr-xr-x 5 omochi staff 160 4 3 23:28 . drwxr-xr-x 8 omochi staff 256 4 3 20:52 .. drwxr-xr-x 7 omochi staff 224 4 3 20:52 swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain lrwxr-xr-x 1 omochi staff 79 4 3 23:28 swift-latest.xctoolchain -> /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain drwxr-xr-x 7 omochi staff 224 4 3 23:28 swift-wasm-5.9.2-RELEASE.xctoolchain
12:45 PM
cartonがtoolchainをインストールしたときに
12:45 PM
マシンの swift-latest の向き先を変更された気がする
Avatar
そうそう、それあんまり望んだ動きじゃない気がするんだけど、swift.org/download のツールチェインがやってるんでそのままにしてる
Avatar
omochimetaru 4/4/2024 12:48 PM
ああ、あのインストーラみたいなやつか
Avatar
cartonが、というより.pkg インストーラがやるんですよね
Avatar
omochimetaru 4/4/2024 12:48 PM
そうそう、それ。よくわかってない
12:48 PM
確かに・・・cartonは余計なことを、むしろしていないだけか
Avatar
素朴にインストーラを実行してるだけである
Avatar
Avatar
Yuta Saito
でもそもそもwasm-optは必ず適用しないといけないわけじゃないので、cartonがwasm-opt見つからないときに失敗するのがよくないな。
(ひょっとしたらツールチェーンとコードと Wasm ランタイムの組み合わせ次第のバグだったかもしれなくてちゃんと検証していないんですが) 以前は swift-format.wasm をビルドして実行していた時に wasm-opt を適用しておかないと実行できないこととかがありました. (edited)
Avatar
omochimetaru 4/4/2024 1:51 PM
動的なPackage.swiftでめっちゃハマってた
1:51 PM
condition: .when(platforms: []) は、SwiftPMレベルでは、 条件なし と 空の条件が区別されるようになっているので、 空の条件 => いかなるOSでも false と設定できるような雰囲気があるが (edited)
Avatar
Avatar
kebo
(ひょっとしたらツールチェーンとコードと Wasm ランタイムの組み合わせ次第のバグだったかもしれなくてちゃんと検証していないんですが) 以前は swift-format.wasm をビルドして実行していた時に wasm-opt を適用しておかないと実行できないこととかがありました. (edited)
localsの数の制限とかですかねー?
Avatar
Avatar
Yuta Saito
localsの数の制限とかですかねー?
確かにその辺のエラーだった記憶があります (曖昧)
Avatar
Avatar
omochimetaru
condition: .when(platforms: []) は、SwiftPMレベルでは、 条件なし と 空の条件が区別されるようになっているので、 空の条件 => いかなるOSでも false と設定できるような雰囲気があるが (edited)
nilと[]が区別されます (edited)
Avatar
Avatar
Yuta Saito
nilと[]が区別されます (edited)
omochimetaru 4/4/2024 1:53 PM
されてなくない?
1:53 PM
assignment.conditions = self.buildConditions(from: setting.condition) この左辺の型は non optional で区別できてなさそうなんだよね
1:54 PM
なので 「いかなるOSでもfalse」のつもりが、「無条件つまりどんなOSでもtrue」に反転する (edited)
Avatar
あれ、そっちに倒れるのか
Avatar
omochimetaru 4/4/2024 1:55 PM
そうとしか思えない現象が起きてるけど
1:55 PM
xcodeくんがリフレッシュしてない可能性と戦いながらだからちょっと不安
Avatar
omochimetaru 4/4/2024 2:03 PM
あれ、このレベルでもう潰れてたのか
2:04 PM
その先のシリアライズで空のplatformsとnilのplatformsを区別してそうだったけど名残で
2:04 PM
whenの呼び出し時点でcondition自体が消えるのか
Avatar
現状「いかなる OS でも false」をしたい時は custom で絶対に来ないであろう String を指定するなど...? .when(platforms: [.custom("")])
Avatar
omochimetaru 4/4/2024 2:15 PM
conditionを設定しようとしてる .target ごと消すのが良いと思います
2:15 PM
でも .custom("xxx") もいけそうですね
Avatar
condition自体にnilを渡すことが出来ます
2:17 PM
.define("FOO", nil)
Avatar
omochimetaru 4/4/2024 2:17 PM
それは常に FOO が定義されるんじゃ?
Avatar
Avatar
Yuta Saito
condition自体にnilを渡すことが出来ます
ん?それってデフォルト値が nil なんで指定してないのと同じになりますよ
Avatar
ああ、逆をやりたいのか
Avatar
omochimetaru 4/4/2024 2:18 PM
そう。動的に「有効になるOS」の配列を構築しようとすると、空の時壊れる (edited)
Avatar
その場合そのアイテムを消すべきなのでは
2:19 PM
動的にやるべきではない
Avatar
omochimetaru 4/4/2024 2:19 PM
動的といっても let を読んでるだけなんだけどね
2:20 PM
Package.swiftソースとしては静的
2:20 PM
2:20 PM
この6行目をtrueにしたりfalseにしてリビルドしたい
Avatar
それって Package.swift では real target に [.wasi] と mock target に allPlatforms.except([.wasi]) を指定しておけば Bool のフラグなしで解決する話だったりはしないですか?(ビルド時のターゲット triple で切り替わる感じで) https://github.com/apple/swift-package-manager/issues/4479
Previous ID SR-13813 Radar rdar://problem/70999132 Original Reporter broadway_lamb (JIRA User) Type Improvement Status Resolved Resolution Done Additional Detail from JIRA Votes 1 Component/s Packa...
Avatar
Avatar
kebo
それって Package.swift では real target に [.wasi] と mock target に allPlatforms.except([.wasi]) を指定しておけば Bool のフラグなしで解決する話だったりはしないですか?(ビルド時のターゲット triple で切り替わる感じで) https://github.com/apple/swift-package-manager/issues/4479
omochimetaru 4/4/2024 2:28 PM
基本はそうなんですが、開発中において「あえて」macでも JavaScriptKit(real) を繋げたい時があります。
Avatar
あ,なるほど
Avatar
omochimetaru 4/4/2024 2:28 PM
理由は Xcode上で JavaScriptKitMock が real とAPI互換性があるかなどをチェックしたいから
Avatar
うむープラットフォーム条件だけでグラフが決まらないパターンかー
Avatar
omochimetaru 4/4/2024 2:33 PM
あと関係ないけどXcodeのcanImportは全然動かないことがわかった
2:33 PM
グラフとしてdependency (target.dependencies)を入れてなくても (edited)
2:34 PM
ターゲット (Package.targets)が定義されている からなのか、他の経路でビルドしたバイナリが中間場所に転がっているからなのか (edited)
2:34 PM
canImportがtrueになってしまってダメだった (edited)
2:34 PM
でもdependencyが入ってないからリンクエラー
2:34 PM
という状態になったりした
Avatar
canImportをそういう用途で使うためにはグラフをずっと固定しておく必要がある
Avatar
omochimetaru 4/4/2024 2:35 PM
そのようだね
2:35 PM
.define でフラグ定義して #if FLAG で制御するようにしたらうまくいった。
Avatar
omochimetaru 4/4/2024 2:57 PM
むむむ・・・
2:57 PM
cartonをプラグインとしては依存定義せずに
2:57 PM
別のところでチェックアウトしてbuildして、 .build/release にパスを通して 手元の場所で $ carton test してみたら
2:58 PM
[omochi@omochi-mbp swift-react (main *=)]$ carton test - checking Swift compiler path: /Users/omochi/.carton/sdk/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/omochi/.swiftenv/versions/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift Inferring basic settings... - swift executable: /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift SwiftWasm Swift version 5.9.2 (swift-5.9.2-RELEASE) Target: arm64-apple-darwin23.1.0 Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "plugin" "carton-test" "internal-get-build-command" "--output" "/var/folders/qw/myjd_8ld5lg9qg057bhm467c0000gn/T/carton-DfdnYH" error: Unknown subcommand or plugin name ‘carton-test’ Usage: swift package <options> <subcommand> See 'package -help' for more information.
2:58 PM
手元の場所で package carton-test を叩こうとして見つからないよとなってしまった
Avatar
CartonFrontendコマンド
Avatar
omochimetaru 4/4/2024 3:01 PM
3:04 PM
$ CartonFrontend test Error: Missing expected argument '--prebuilt-test-bundle-path <prebuilt-test-bundle-path>' Help: --prebuilt-test-bundle-path <prebuilt-test-bundle-path> Use the given bundle instead of building the test target Usage: carton test [--release] [--list] [<test-cases> ...] [--environment <environment>] [--headless] [--sanitize <sanitize>] [--port <port>] [--host <host>] --prebuilt-test-bundle-path <prebuilt-test-bundle-path> See 'carton test --help' for more information. このエラーは、わかるぞ
Avatar
cartonコマンドがツールチェインをインストールするところまでやって、CartonTestプラグインがビルドのトリガーとかビルド情報をかき集めてCartonFrontendを起動すると言う流れ
3:05 PM
なので、自分でビルドして必要な情報をCartonFrontendに渡せばスタンドアロンに一応動く
3:05 PM
devサーバだけはIPCしてるからスタンドアロンに動かすのはちょっと大変
Avatar
omochimetaru 4/4/2024 3:06 PM
ビルド方法がわかんなかったのでMyAppくんのログを見て盗む
Avatar
swift buildに対応するビルドコマンドはSwiftPMが出力しないからむずかしいな
Avatar
omochimetaru 4/4/2024 3:07 PM
Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "build" "--product" "MyAppPackageTests" "-Xswiftc" "-static-stdlib" "-Xswiftc" "-Xclang-linker" "-Xswiftc" "-mexec-model=reactor" "-Xlinker" "--export-if-defined=main" "--disable-build-manifest-caching" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/work/swiftwasm/MyApp/.build/carton"
3:07 PM
これじゃない?
Avatar
あれ出てるんだ
Avatar
omochimetaru 4/4/2024 3:08 PM
出てた
3:08 PM
"--scratch-path" "/Users/omochi/work/swiftwasm/MyApp/.build/carton" これは何?要る?
Avatar
ツールチェインのインストーラを動かさないならいらない
Avatar
omochimetaru 4/4/2024 3:09 PM
ほい
3:10 PM
-Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor
3:10 PM
これXフラグが2段奥に行くやつか?
Avatar
うむ
Avatar
omochimetaru 4/4/2024 3:13 PM
[omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
3:13 PM
いけそうでいけないな --build-tests はダメかな
Avatar
which swift
Avatar
omochimetaru 4/4/2024 3:14 PM
[omochi@omochi-mbp swift-react (main *=)]$ which swift /usr/bin/swift [omochi@omochi-mbp swift-react (main *=)]$ swift --version Apple Swift version 6.0-dev (LLVM 3dd3bce1adb5b65, Swift 1f09be97a890c3e) Target: arm64-apple-macosx14.0 [omochi@omochi-mbp swift-react (main *=)]$ env | grep TOOLCHAINS TOOLCHAINS=org.swift.59202404021a
3:14 PM
4/2 snapshotでやろうとしてる
Avatar
それだとWASI向けstdlibが入ってないんで
Avatar
omochimetaru 4/4/2024 3:15 PM
なるほど・・・
Avatar
omochimetaru 4/4/2024 3:15 PM
cartonが用意した592wasmを使うべきか
Avatar
swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle.zip
Avatar
omochimetaru 4/4/2024 3:15 PM
おお
Avatar
か、cartonが入れた5.9.2を使うか
Avatar
omochimetaru 4/4/2024 3:16 PM
swift sdkだけ入れるのオシャレでいいな
3:16 PM
それをやってみよう
Avatar
最近配布し始めたやつだからまだ世界で数人しか使ってないとおもうw
Avatar
omochimetaru 4/4/2024 3:20 PM
これ(貼ってくれたGitHub URL)って一見swift(compiler)を配布してそうだけど (edited)
3:20 PM
swiftsdkを配布しているの?
Avatar
最新のartifactbundleにはコンパイラ入ってないです
Avatar
omochimetaru 4/4/2024 3:21 PM
あ 容量が全然違う
Avatar
stdlibだけ
Avatar
omochimetaru 4/4/2024 3:21 PM
artifactbundleがsdkで、pkgがtoolchain?
Avatar
超コンパクト
3:21 PM
そんなかんじです
Avatar
omochimetaru 4/4/2024 3:22 PM
[omochi@omochi-mbp swift-react (main *=)]$ swift experimental-sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
3:22 PM
sdkは入ったっぽいけどダメだな 何か操作が足りないか (edited)
Avatar
--triple の代わりに --experimental-swift-sdk wasm32-unknown-wasi
Avatar
omochimetaru 4/4/2024 3:23 PM
なるほど。
3:24 PM
そのコマンド、swift build --help に出てこないな 裏技だ
Avatar
エクスペリメンタルなんで 😏
Avatar
omochimetaru 4/4/2024 3:25 PM
うおー いったー
3:25 PM
10.47 KB
Avatar
Avatar
omochimetaru
[omochi@omochi-mbp swift-react (main *=)]$ swift experimental-sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
このエラーは色んな人に聞かれた覚えがあるからFAQに載せておこう
Avatar
omochimetaru 4/4/2024 3:30 PM
あれえ
3:30 PM
[omochi@omochi-mbp debug (main *=)]$ CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser No prebuilt binary found at /Users/omochi/github/omochi/swift-react/.build/wasm32-unknown-wasi/debug/.build/debug/swift-reactPackageTests.wasm
3:31 PM
a
3:31 PM
いや、ミスった
3:31 PM
ブラウザ開いた
3:32 PM
何も起きない
3:33 PM
[omochi@omochi-mbp swift-react (main *=)]$ CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /apple-touch-icon.png 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /favicon.ico 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /apple-touch-icon-precomposed.png
3:33 PM
リソースは取りに行ったっぽい・・・
Avatar
あるぇー
3:34 PM
コマンドはあってそうなんだけど
Avatar
omochimetaru 4/4/2024 3:34 PM
ブラウザにもjsとかwasmとかロードされてるけど何も起きない感じだ
3:34 PM
ブレークしてみるか
3:36 PM
ここまでいってる
3:37 PM
MyAppと同じで --product を指定してやり直してみる
3:40 PM
MyAppPackageTests ってなんだ?そんなproductないのに通るな <name>PackageTests なのかな
Avatar
SwiftPMが勝手に定義するやつ
Avatar
omochimetaru 4/4/2024 3:40 PM
ああ、さっき俺が指定したのも swift-reactPackageTests.wasm だ。
3:41 PM
--build-tests の代わりに --product swift-reactPackageTests にしてみよう
Avatar
Avatar
Yuta Saito
SwiftPMが勝手に定義するやつ
omochimetaru 4/4/2024 3:41 PM
そういう仕組みなんすねえ
3:43 PM
同じ結果だ
3:43 PM
ブラウザは開いたし、wasmRunner.runまでは行くけど反応がない
Avatar
うーん、これ以上は多分それなりにデバッグが必要かなぁ
Avatar
omochimetaru 4/4/2024 3:46 PM
3:46 PM
wasi.startまで行ってた
3:46 PM
いったんcartonをプラグインで入れる方法でうまく行くか確認するか
3:46 PM
うまく行った回と差分がちょいちょいあるからな (edited)
Avatar
.wasmバイナリここに貼れます?
3:48 PM
貼れるけど、流石にこれだけで何かわかるもんですか
Avatar
どもども
3:49 PM
ああ、JavaScriptKitのjs側ランタイムが無いんだ
3:49 PM
えーと、
Avatar
omochimetaru 4/4/2024 3:49 PM
[CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs
落とせてそうだったけど
Avatar
それ落とせてますか?
3:50 PM
ブラウザ側のネットワークタブの方だとどうですか
3:50 PM
content-lengthあるし中身もあるよ
3:50 PM
これか!?
Avatar
うむー、.wasmの相対でみつけるようにしたんだったか
Avatar
omochimetaru 4/4/2024 3:50 PM
あ、違うか、これはCLI止めたからか
3:52 PM
$ swift run carton test --environment browser だといけた
3:52 PM
Build complete! (1.38s) 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm An error occurred: NotFoundError: The object can not be found here. error: Plugin ended with exit code 1
3:52 PM
テストはなんか落ちたけど
3:53 PM
NotFoundErrorってなんだ
Avatar
おー、じゃあCartonFrontendコマンドの差分を診てもらうのがいいかな
3:53 PM
JS側のエラーじゃないですか?
Avatar
omochimetaru 4/4/2024 3:53 PM
お、ほんとだ
3:54 PM
おーなんかDOMレンダリング成功してそう
3:54 PM
大文字小文字でエラーになってるけど
Avatar
Avatar
Yuta Saito
おー、じゃあCartonFrontendコマンドの差分を診てもらうのがいいかな
omochimetaru 4/4/2024 3:55 PM
OK
3:56 PM
スタックトレースのwasm-function、普通にシンボル読めていいな (edited)
3:56 PM
目demangleできてよかった
Avatar
Running "/Users/katei/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/katei/ghq/github.com/swiftwasm/carton/Tests/Fixtures/TestApp/.build/carton" "--disable-sandbox" "plugin" "carton-test" こういう出力があると思うんで
3:57 PM
このコマンドの swift package の直後に --verbose つけると最後の方に CartonFrontend のコマンドが出てきます
Avatar
omochimetaru 4/4/2024 3:57 PM
Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "plugin" "carton-test" "internal-get-build-command" "--environment" "browser" "--output" "/var/folders/qw/myjd_8ld5lg9qg057bhm467c0000gn/T/carton-F2kqX9" Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "build" "--product" "swift-reactPackageTests" "-Xswiftc" "-static-stdlib" "-Xswiftc" "-Xclang-linker" "-Xswiftc" "-mexec-model=reactor" "-Xlinker" "--export-if-defined=main" "--disable-build-manifest-caching" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "--disable-sandbox" "plugin" "carton-test" "--environment" "browser"
3:57 PM
Runningは3つあった
3:58 PM
最後のやつか
Avatar
最後のやつ
Avatar
omochimetaru 4/4/2024 4:00 PM
info: Running "/Users/omochi/github/omochi/swift-react/.build/carton/arm64-apple-macosx/debug/CartonFrontend" "test" "--prebuilt-test-bundle-path" "/Users/omochi/github/omochi/swift-react/.build/carton/wasm32-unknown-wasi/debug/swift-reactPackageTests.wasm" "--environment" "browser"
4:00 PM
同じだけどwasmのおいてある場所が違うな
4:01 PM
これはbuildディレクトリが根元で区切ってあるだけか
Avatar
なにか変な状態になってたのかな
Avatar
omochimetaru 4/4/2024 4:04 PM
コンパイラとstdlibのバージョンが違うせいかなあ
4:04 PM
cartonがとってきた5.9.2でやってみよう
Avatar
コンパイラとstdlibのバージョンが違ったらそもそも全然ビルドとおらないですねw
Avatar
omochimetaru 4/4/2024 4:05 PM
コンパイラは4/2 snapshotで
4:05 PM
swift sdk (stdlibじゃなかった)はswiftwasm配布の4/3 snapshot
Avatar
そこはじつは一致してるのだ
4:06 PM
全部アップストリームしたから名前も揃えられるんだけどまだやってなかったな (edited)
Avatar
omochimetaru 4/4/2024 4:06 PM
ふむふむ
Avatar
なのでとりあえずビルドの環境は正しそう。
4:08 PM
.buildを消して、一度も swift run cartonを実行しない状態でもう一回CartonFrontend直でやってみるとどうでしょう
Avatar
omochimetaru 4/4/2024 4:08 PM
export TOOLCHAINS=org.swiftwasm.202439 swift build --triple wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser これでテスト実行された
4:09 PM
これで、 CartonFrontend がバージョン違う可能性があったけどそれは無くなった
4:09 PM
もっかい消して、4/2版でやってみる
4:11 PM
動かない!!
4:11 PM
export TOOLCHAINS=org.swift.59202404021a swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser
4:11 PM
違いは、TOOLCHAINSと、 --triple を使うか --experimental-swift-sdk を使うか、だけ。
Avatar
お、じゃあmainブランチでなんか壊れてるんだな
4:12 PM
あ、わかったぞ
Avatar
omochimetaru 4/4/2024 4:13 PM
まじ
Avatar
4/2のほうで --export-if-defined=__main_argc_argv にしてみて
Avatar
omochimetaru 4/4/2024 4:13 PM
ok
4:14 PM
動いた〜〜
4:15 PM
いや
4:15 PM
An error occurred: RuntimeError: Unreachable code should not be executed (evaluating 'instance.exports.__main_argc_argv(0, 0)')
4:15 PM
Avatar
テストに失敗してるから?
Avatar
omochimetaru 4/4/2024 4:15 PM
ブラウザは真っ白ではないという意味では動いたけど
4:15 PM
テストケースが開始してない
Avatar
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
4:16 PM
えーとこれはどうしたものかな
4:16 PM
cartonのテストハーネスを直さないといけないな
Avatar
omochimetaru 4/4/2024 4:16 PM
cartonも壊れてるってこと?
Avatar
cartonが最新のmainのツールチェインに追いついてなかった
Avatar
omochimetaru 4/4/2024 4:16 PM
リンカオプションの変更はcarton内には実装されてたね
4:17 PM
(これって #if compiler だと cartonのbuild time分岐だけどいいのか?選択してるツールチェインのバージョンではないのか (edited)
Avatar
2,3週間前に変わった
Avatar
Avatar
Yuta Saito
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
Avatar
cartonをビルドするコンパイラとwasmをビルドするコンパイラバージョンが一致してるという前提
Avatar
omochimetaru 4/4/2024 4:18 PM
今俺一致してないな
4:18 PM
cartonを外に置いてるから
Avatar
わはは
Avatar
omochimetaru 4/4/2024 4:18 PM
あ、でも、あーいやどうだったっけ?
Avatar
Avatar
kebo
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
ですねー、コンパイラの方も戻さないといけないけど
Avatar
omochimetaru 4/4/2024 4:19 PM
まあここの分岐は今carton使わないで手で書いてるんだからとりあえずいいか
Avatar
手元で再現環境作るのめんどうなのでよかったらリポジトリアクセスください
Avatar
Avatar
Yuta Saito
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
omochimetaru 4/4/2024 4:19 PM
これがさっぱりわからんけどなんか方式が変わったんすね
Avatar
Avatar
Yuta Saito
手元で再現環境作るのめんどうなのでよかったらリポジトリアクセスください
omochimetaru 4/4/2024 4:20 PM
招待したよ
4:21 PM
mainと手元の違いは今は diff --git a/Package.swift b/Package.swift index a57f2f3..5557ef3 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.10 +// swift-tools-version: 5.9 import PackageDescription @@ -41,6 +41,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-algorithms", from: "1.2.0"), .package(url: "https://github.com/swiftwasm/JavaScriptKit", from: "0.19.1"), + .package(url: "https://github.com/swiftwasm/carton", from: "1.0.0"), ], targets: [ .target( これだけ
Avatar
どもども
Avatar
Avatar
kebo
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
omochimetaru 4/4/2024 4:23 PM
keboさんはなぜその3/20というタイミングを知ってるんですか?
Avatar
wasm 向けのテストを走らせてるリポジトリで挙動の変化があったからですね. https://github.com/swiftwasm/swift/issues/5574
Avatar
めちゃくちゃこまめに更新していただいてる 🙏
Avatar
Avatar
kebo
wasm 向けのテストを走らせてるリポジトリで挙動の変化があったからですね. https://github.com/swiftwasm/swift/issues/5574
omochimetaru 4/4/2024 4:27 PM
おお〜なるほど wasmtimeでBundle関連だから同じ話っぽいのか
Avatar
よし再現できた
Avatar
omochimetaru 4/4/2024 4:29 PM
4:30 PM
keboさんのアカウント swift_os が流れてきてみたことあったな
4:30 PM
Discordとアイコンと名前が違くて全く気づかなかった
Avatar
Avatar
omochimetaru
Discordとアイコンと名前が違くて全く気づかなかった
私の GitHub username は Apple Developer Forums で伏字にされてしまうというのもあってこっちに合わせて変えようかなと思ったりしつつ URL が変わっちゃうので腰が重く...
Avatar
kkkなるほど!
Avatar
omochimetaru 4/4/2024 4:33 PM
kkkw
Avatar
Apple にバグレポ送ったら GitHub URL がぶっ壊されてアクセスできないって言われて困ったことがありますw
Avatar
omochimetaru 4/4/2024 4:33 PM
氏名からつけただけなのに・・・
t_desudesu 1
4:43 PM
ここで落ちるって話なのかな
4:43 PM
2: wasm trap: wasm `unreachable` instruction executed これがwasmtimeで、ブラウザのやつも同じことか
Avatar
あっれーなおらんなー
👀 1
Avatar
わかったー
👀 1
Avatar
omochimetaru 4/4/2024 5:18 PM
直った〜
5:20 PM
insertBefore がコケるのとかも5.9.2wasmの時と同じ
Avatar
omochimetaru 4/4/2024 5:22 PM
爆速
5:22 PM
読んで学ぼう
Avatar
omochimetaru 4/4/2024 5:33 PM
argv配列を渡すようにしたことと、 path モジュールをバインドしたことと、 /sandbox を作ってpreopenしたことはなんとなくわかる
5:33 PM
@wasmer/wasi のAPIを調べようとして迷った
Avatar
@wasmer/wasiは本当に今すぐにでも辞めたい依存物で次のリリースで消すつもりなので調べなくてもよい
Avatar
omochimetaru 4/4/2024 5:34 PM
Isomorphic Javascript library for interacting with WASI Modules in Node.js and the Browser.. Latest version: 1.2.2, last published: a year ago. Start using @wasmer/wasi in your project by running npm i @wasmer/wasi. There are 47 other projects in the npm registry using @wasmer/wasi.
5:34 PM
5:34 PM
ほとんどRustで、意味がわからない・・・
5:34 PM
JavaScriptのライブラリじゃないのか
Avatar
いちおう。。今使ってるやつからは完全に書き換わってしまったけど
Avatar
omochimetaru 4/4/2024 5:35 PM
"@wasmer/wasi": "^0.12.0", バージョン?
Avatar
https://github.com/bjorn3/browser_wasi_shim/ に置き換える予定です
👀 1
5:36 PM
1.x系で全てが変わってしまった
Avatar
omochimetaru 4/4/2024 5:36 PM
なるほど
5:36 PM
ほんとだ タグ変えたら普通にTypeScriptになった
5:36 PM
なんなんだ???
5:38 PM
あった
5:39 PM
path: any だけど Path モジュールを要求してるんやな
5:39 PM
疑問が一手先送りにされただけだった まあとにかくwasm binary側から見てファイルシステムのWASI機能を使うために必要なことをしたという感じかな
Avatar
そんなかんじ
Avatar
omochimetaru 4/4/2024 5:41 PM
Rustになって何が起こってるのかがめっちゃ気になってきた
5:44 PM
今日はもう寝ます、パッチで直るかは後日やってみます ありがとうございました
Avatar
はーい。連日どうも
Avatar
Wasmer.js が 1.0 で急に変わって 0.x にあったバグが修正されてるけれども 1.0 はそっちはそっちで雲行きが怪しいみたいな話,前も kateinoigakukun さんに聞いたことがあるなと思ったらこれでした. https://x.com/kateinoigakukun/status/1591026496277458945?s=20
Avatar
wasmer/wasi捨てれそうなのめでたい
Avatar
omochimetaru 4/5/2024 1:15 AM
wasmerちょっと調べた 0系→nodeとブラウザにwasiインターフェースを提供する そのためにwasm側のwasi関数からjs側を呼び出して機能を提供する 1系→rust実装されたwasi付きのwasm処理系があり、それをwasmにコンパイルして、ブラウザのwasmランタイム上で動かす??
Avatar
omochimetaru 4/5/2024 1:40 PM
パッチされたcarton(現main)でテスト動いた (edited)
Avatar
おーよかった
Avatar
omochimetaru 4/5/2024 1:43 PM
ありがとう これでsnapshotでやれる
Avatar
omochimetaru 4/5/2024 1:51 PM
なるほど JS側で例外が発生すると、WASM側を抜けて?迂回して? wasmRunner.runから例外が飛んでしまうから
1:51 PM
wasmとしてのxctestの実行がぶったぎられて止まってしまうのか
1:56 PM
JavaScriptKitのJSFunctionは使わない方が良い・・・? JSThrowingFunctionならwasmにエラーが入ってきそうだ
Avatar
omochimetaru 4/5/2024 1:56 PM
あちこちで .throws で変換するのめんどくさいなと思って無視したけど (edited)
1:57 PM
基本こっちのほうが良いか・・・?
Avatar
意図的にちゃんと例外をケアしたいところだけで使えば良いんじゃないですかね
Avatar
omochimetaru 4/5/2024 2:00 PM
JSだから意図せず飛んでくる場面がありそうな気もした
Avatar
そういうのは心配しても結局できることは無いかなぁと思ってました。
Avatar
omochimetaru 4/5/2024 2:02 PM
それも一理ある
Avatar
Wasmを呼び出す側が最終的に例外キャッチできるから
2:02 PM
それで良い気がする
Avatar
逆にして、常にthrowsにしておいて.nothrowにするのは?
Avatar
omochimetaru 4/5/2024 2:02 PM
全部WASM内のReactで動かせるから、Reactの層で常に全部捕まえれば、
Avatar
えー、面倒くさくなるだけじゃないかなぁ
Avatar
omochimetaru 4/5/2024 2:03 PM
破滅は避けられるけど、まあ復旧しない場合が多そうではある
2:03 PM
本物のReactもそういう感じの動作はする。
2:03 PM
effectの中で例外が飛んでもメインの更新系は生きてる アプリケーションの状態は破綻するけど
Avatar
そういう感じなんだ
Avatar
Avatar
Iceman
逆にして、常にthrowsにしておいて.nothrowにするのは?
omochimetaru 4/5/2024 2:04 PM
俺もベースがthrowsで、高速化したいプロが .unsafeUncatching みたいなやつを特別な場所で使う、みたいなほうが自然な気もした
Avatar
Avatar
Yuta Saito
そういう感じなんだ
omochimetaru 4/5/2024 2:05 PM
UIButtonのonTapで例外とんでも今出てるViewControllerまで吹き飛んでアプリ全てが真っ白になったりはしない、みたいな。 (edited)
2:06 PM
あちこち throws な事自体はあまり違和感はないかな サーバサイドで普段から大量の async throws にまみれているから・・・ (edited)
t_wakaru 1
Avatar
なるほど、Wasm内のフレームワークがユーザコードを呼んでユーザコードがJS例外をキャッチせずにフレームワークのフレームを飛び越えてフレームワークの状態が壊れる
Avatar
omochimetaru 4/5/2024 2:07 PM
そう!w
Avatar
これは一理あるな
Avatar
Avatar
Yuta Saito
Wasmを呼び出す側が最終的に例外キャッチできるから
omochimetaru 4/5/2024 2:08 PM
これはわかるけど俺がやろうとしてるアーキテクチャだとそこまで飛んだら外側すぎるって話だね (edited)
2:08 PM
JSで全体的に組んで、局所的な高速関数をWASM実装にする、みたいなパターンだと、それで良いよね。
Avatar
なるほどなー新たな視点だ
Avatar
omochimetaru 4/5/2024 2:09 PM
まあJSKの設計は置いといて、話しててやっぱり全部catchしたくなってきたので
2:09 PM
JSKMockにJSThrowingFunctionを作ってこよう。
2:10 PM
ユーザーコードがJSをnoncatchで呼ぶケースはswift-reactからはどうしようもないね。
Avatar
一応1枚JSのフレームを挟むという手があるんだけど
2:11 PM
とてもハッキー
2:12 PM
たしかEmscriptenがやってる手法
Avatar
omochimetaru 4/5/2024 2:12 PM
あー、JSで1フレーム後で、トップレベルでcatchして、その中でもっかいwasm instanceに投入すれば
2:12 PM
トップレベルのjsで掴めるのか。
2:13 PM
あ、描画フレームを遅らせる必要はないのか
2:13 PM
WASMからJSに出てそこでWASMに入るだけか
Avatar
ここでのフレームはコールフレームのつもりだったw
Avatar
omochimetaru 4/5/2024 2:13 PM
そっちのフレームか
2:14 PM
アイデアとしては覚えておこう・・・
Avatar
なんか前教えてもらったProxy使うやつかな
Avatar
Proxyってなんだったかな
2:17 PM
こんなイメージ function catchCall(body) { try { return { type: "success", value: body() } } catch(error) { return { type: "failure", value: error } } } let result = JSObject.global.catchCall(JSOneshotClosure { // do something })
Avatar
JSKが触るオブジェクトに全部Proxyを噛ませて、そのcatchCallを被せて呼び出すみたいなのをイメージしてました
Avatar
よさそう
Avatar
omochimetaru 4/5/2024 2:39 PM
あ〜
2:39 PM
jsValue.createElement(tagName) これトリッキーに動いてるから
2:39 PM
jsValue.createElement.throws(tagName) こうするとうまくいかないんだ・・・
2:40 PM
DMLの .createElement() が直結してないと callable type に返り値の推論がされない
Avatar
普通のプロパティになっちゃってJSValue扱いされる?
Avatar
omochimetaru 4/5/2024 2:43 PM
それがややこしくて
2:43 PM
jsValue.createElement.aaaa(tagName) これなら、createElementは普通のオブジェクトアクセス扱いなんだけど
2:43 PM
2:43 PM
続いてるのが throws だと Ambiguous になる
2:44 PM
JSFunctionだったらthrowsプロパティを持っているって話と絡んでややこしい
Avatar
あーなるほど。そもそもJSFunctionが持ってるプロパティ全部と曖昧になっちゃうんですね
Avatar
jsValue.object!.throwing.createElementが書ける
Avatar
callable typeならthrowsのオーバーロードつければtryつけたら勝手にそっちになりませんかね?
Avatar
Avatar
Yuta Saito
jsValue.object!.throwing.createElementが書ける
omochimetaru 4/5/2024 2:48 PM
あ〜先に変換するのか
Avatar
Avatar
omochimetaru
jsValue.createElement.aaaa(tagName) これなら、createElementは普通のオブジェクトアクセス扱いなんだけど
これだとレシーバがthisとして伝播されないので
Avatar
Avatar
Iceman
callable typeならthrowsのオーバーロードつければtryつけたら勝手にそっちになりませんかね?
omochimetaru 4/5/2024 2:48 PM
それはできるかもしれないけど、うっかりtryつけ忘れるバグが出そうだ
Avatar
Avatar
Yuta Saito
これだとレシーバがthisとして伝播されないので
omochimetaru 4/5/2024 2:48 PM
あ〜そうだ、それもあった
2:49 PM
呼び出し予定で引っ張り出す時にthis bindしてたんだった
Avatar
Avatar
Yuta Saito
jsValue.object!.throwing.createElementが書ける
omochimetaru 4/5/2024 2:49 PM
ちなみにここってなんで throwingthrows で API揃ってないん
Avatar
分かれてたほうが違うものに対する変換であることがわかりやすいかなと
Avatar
omochimetaru 4/5/2024 2:55 PM
なるほど 見分けるためか
Avatar
omochimetaru 4/5/2024 4:57 PM
@Yuta Saito https://github.com/swiftwasm/JavaScriptKit/pull/238 これみてもらえますか
Avatar
なんかNode.jsがセグフォしてCIコケてる…
Avatar
記念すべき初日本語プルリク
Avatar
omochimetaru 4/5/2024 5:11 PM
マージありがとう
5:11 PM
JS例外全部catchに加えてこの修正によってテストケースがクラッシュせずに完走できるようになった
Avatar
yay 🎊
Avatar
omochimetaru 4/5/2024 5:13 PM
まだ通らないテストケースがあって、その直前に NotFoundError が出ているから
5:13 PM
何が起きてるか調べようとしてるけど調べ方から考えているところw
5:13 PM
今日は終わり
Avatar
例外発生したタイミングでブレークするデバッガの機能でなんとか
Avatar
omochimetaru 4/5/2024 5:16 PM
おーそれ正解だ
5:17 PM
最初に関係ない?無害な例外が6個ぐらい出るけど
5:17 PM
その後こいつが捕まった
Avatar
犯人確保
Avatar
omochimetaru 4/5/2024 5:26 PM
その状況をフックするコードを書いてXcode側で実行して状況が捕捉できた
5:27 PM
自作のとブラウザのinsertBeforeの微妙な動作の違いを踏んでいるっぽい
5:27 PM
JavaScriptKitMock作る作戦正解だ
Avatar
omochimetaru 4/6/2024 4:01 AM
モック環境でJS環境と同じように壊れるようにできた。
Avatar
omochimetaru 4/6/2024 11:01 PM
@Yuta Saito JavaScriptKitのJSClosure型なんですけど、 is JSObjectだけど、is JSFunctionではないのが変な感じがします 1. 「呼び出せる型で共通化して受け取って呼び出す」コードが書けない 2. JSClosure.jsValueをJSObject.constructに渡すとJSObject型になり、JSFunction.constructに渡すと失敗する 3. JSClosureを一度JSに渡してから取り出して作ったJSValueではJSFunctionになっている。これは2と矛盾する。 まだ実行してないけどこうなってるようにみえる (edited)
Avatar
Avatar
Yuta Saito
分かれてたほうが違うものに対する変換であることがわかりやすいかなと
omochimetaru 4/7/2024 1:42 AM
そういえばこれだけど、もし同じにすると、 JSFunction.throws と JSObject.throws が衝突するからoverrideになって、そうすると返り値の型が分けられないね
Avatar
Avatar
omochimetaru
@Yuta Saito JavaScriptKitのJSClosure型なんですけど、 is JSObjectだけど、is JSFunctionではないのが変な感じがします 1. 「呼び出せる型で共通化して受け取って呼び出す」コードが書けない 2. JSClosure.jsValueをJSObject.constructに渡すとJSObject型になり、JSFunction.constructに渡すと失敗する 3. JSClosureを一度JSに渡してから取り出して作ったJSValueではJSFunctionになっている。これは2と矛盾する。 まだ実行してないけどこうなってるようにみえる (edited)
omochimetaru 4/7/2024 1:58 AM
自動テストで確認した。 final class JavaScriptKitTests: XCTestCase { func testClosureAsFunction() throws { let clo = JSClosure { (_) in return 7.jsValue } let obj = try JSObject.mustConstruct(from: clo.jsValue) XCTAssertFalse(obj is JSFunction) let fn = clo.asFunction() let ret = try Int.mustConstruct(from: try fn()) XCTAssertEqual(ret, 7) } } extension JSClosure { #if USES_JAVASCRIPT_KIT_MOCK public func asFunction() -> JSThrowingFunction { let fn = native as! JSNativeFunction return JSFunction(native: fn).throws } #else public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws } #endif }
Avatar
そう、やっぱり継承関係がおかしい
2:08 AM
Motivation While integrating async/await feature, I found JSPromise has too complex API. (e.g. too many overloads, unsafe generic parameters, and lifetime management) So I want to refine the API be...
2:08 AM
で変えてるんだけど、レビューで突っ込まれてない上にこの人全然説明してない
2:09 AM
Now that JSClosure and JSOneshotClosure are no longer subclasses of JSFunction, how are they supposed to be converted to JSValue? Should the object case be used?
Avatar
Avatar
Yuta Saito
そう、やっぱり継承関係がおかしい
omochimetaru 4/7/2024 2:11 AM
ほんとだ。元々は is JSFunction だったのか。
Avatar
Avatar
Yuta Saito
omochimetaru 4/7/2024 2:12 AM
これは無理でしょう、JSValue(RawJSValue) から復元できないから
Avatar
やはりJSValueで値を区別するのをやめたい
Avatar
omochimetaru 4/7/2024 2:17 AM
JSClosureは deinit で release したいなどのニーズがあったからややこしくなってそう
Avatar
そうなんですよ、ライフタイムが他とは違う
2:18 AM
NonCopyableにできるとシンプルになるかな
2:19 AM
今となってはFinalizationRegistry前提にしても良い気がする
Avatar
omochimetaru 4/7/2024 2:20 AM
これ前提で話がシンプルになる気がするけど
2:20 AM
ちょっと現在の実装もまだバグってる気がするな
2:21 AM
JSClosureをSwift側で作ってから、 JS側に渡さないまま保持してGCが発動するとsharedClosuresから消えて、 その後でJS側に渡すと壊れそう
2:23 AM
あーでもこれSwift側が生きてる間はJS側をretainするようにすると、 今度はJS側で不死になるからfinalizationが動かないな クロスバウンダリーサイクルだ
Avatar
作ったクロージャはretainしてるから死なない
Avatar
omochimetaru 4/7/2024 2:24 AM
あれ、してるのか
2:25 AM
JS側関数から JSClosureへのretainがないのか。
2:25 AM
hostFuncRef = JavaScriptHostFuncRef(bitPattern: ObjectIdentifier(self)) これがただのIDだから。
Avatar
うむ
2:26 AM
なのでFR無しだとSwift側のJSClosureが先にデアロケートされるとダメ
Avatar
omochimetaru 4/7/2024 2:27 AM
なるほど。3段階なのか。SwiftのJSClosure →JSのオブジェクト → Swiftの関数の実装 (edited)
2:27 AM
えーってことは、ダメなパターンは
2:27 AM
SwiftでJSClosureを作ってから、JSのオブジェクトに代入した後、
2:27 AM
それを取り出してJSFunctionとして復元して、JS側の参照を消して、 (edited)
2:27 AM
それをSwiftで持ち続けても
2:28 AM
関数の実装が消える場合があるかな。
Avatar
JSClosure自体も持ち続けてないとダメっすね
Avatar
omochimetaru 4/7/2024 2:28 AM
button.onclick を書いたり読んだりすると起きえそうだ
2:29 AM
JavaScriptHostFuncRef(bitPattern: ObjectIdentifier(self)) あとこれだけど、
2:29 AM
JSClosureが消えて、新しいJSClosureを作って
2:29 AM
同じアドレスにアロケートされると
2:29 AM
関数実装が上書きされそう (edited)
Avatar
JSClosureが消えたらそのエントリがdeinitで消えるので
Avatar
omochimetaru 4/7/2024 2:30 AM
#if JAVASCRIPTKIT_WITHOUT_WEAKREFS deinit { guard isReleased else { fatalError("release() must be called on JSClosure objects manually before they are deallocated") } } #endif } deinitは何もしてないから消えないんじゃ?
Avatar
releaseか
2:32 AM
これFRモードだとまずい気がするなぁ
Avatar
omochimetaru 4/7/2024 2:32 AM
#if JAVASCRIPTKIT_WITHOUT_WEAKREFS // MARK: - Legacy Closure Types extension JSClosure { public func release() { isReleased = true Self.sharedClosures[hostFuncRef] = nil } } @_cdecl("_free_host_function_impl") func _free_host_function_impl(_ hostFuncRef: JavaScriptHostFuncRef) {} #else extension JSClosure { @available(*, deprecated, message: "JSClosure.release() is no longer necessary") public func release() {} } @_cdecl("_free_host_function_impl") func _free_host_function_impl(_ hostFuncRef: JavaScriptHostFuncRef) { JSClosure.sharedClosures[hostFuncRef] = nil } #endif
Avatar
上書きが起こる気がする
Avatar
omochimetaru 4/7/2024 2:32 AM
FRモードだとreleaseは何もしないから
2:33 AM
swjs_create_function: (host_func_id, line, file) => { var _a; const fileString = this.memory.getObject(file); const func = (...args) => this.callHostFunction(host_func_id, line, fileString, args); const func_ref = this.memory.retain(func); (_a = this.closureDeallocator) === null || _a === void 0 ? void 0 : _a.track(func, func_ref); return func_ref; },
2:33 AM
この memory.retain を消せない気がしてきた
Avatar
FR無しだとSwift側のオブジェクトが消える時にエントリがreleaseで消えてないと明示的にクラッシュするようになってるけど
2:34 AM
FR有りだとJS側のクロージャオブジェクトが死ぬまでエントリが保持されるから上書きが起きるな
Avatar
Avatar
Yuta Saito
FR有りだとJS側のクロージャオブジェクトが死ぬまでエントリが保持されるから上書きが起きるな
omochimetaru 4/7/2024 2:35 AM
JS側のクロージャオブジェクトが死ぬまで
ここなんですけど
Avatar
Avatar
omochimetaru
この memory.retain を消せない気がしてきた
それはJSObjectのdeinitで消えそう
Avatar
omochimetaru 4/7/2024 2:36 AM
おお、ここにもあったのか
2:36 AM
これはどうなっているんだ・・・
Avatar
むずかしい
Avatar
omochimetaru 4/7/2024 2:36 AM
JS側の任意の値を取り出しながらJSObjectに包んだときは
2:37 AM
retainしないと数が合わなくなる
2:38 AM
swjs_call_newswjs_create_function では retain してるけど
2:39 AM
// swiftで func inSwift() { // no retain let body = JSObject.construct(from: JSObject.global.document.body)! consume body // swjs_release } (edited)
2:39 AM
↑これでover releaseしない?
Avatar
それだとretainは一個なんじゃないか?
Avatar
omochimetaru 4/7/2024 2:41 AM
どこでretainされてる?
Avatar
bodyをとってくる時に
2:42 AM
writeAndReturnKindBitsがretainしてるはず
Avatar
omochimetaru 4/7/2024 2:42 AM
const writeRef = (kind) => { memory.writeUint32(payload1_ptr, memory.retain(value)); return exceptionBit | kind; }; あ、ほんとだ
2:43 AM
JS側からSwift側に戻すときにretainする規約なのか
Avatar
JSK Calling Convention
Avatar
omochimetaru 4/7/2024 2:44 AM
で、RawJSValueがJSValueに戻す時にJSObjectに包むからこれでreleaseが予約されてバランスするのね
Avatar
そうそう
Avatar
omochimetaru 4/7/2024 2:45 AM
理解した、じゃあJSClosureが死ぬ時にJSObjectが死んでreleaseするね
2:45 AM
それでJSClosureが死んでるが、JS関数が生きてる、という状態に遷移し得て
2:46 AM
そのままJS側も参照が消えればFRが起動して、最後にSwift側の実装が消えるが
2:46 AM
そこでJS側が生き続けて、新しいJSClosureができた時に
2:46 AM
同じアドレスになってしまって実装の上書きが生じうるのが
2:46 AM
唯一のバグかな
Avatar
そうですねぇこれはどうしたもんかなー
Avatar
omochimetaru 4/7/2024 2:48 AM
そっちは根が深そうだから一旦おいておいて、 僕が早急に欲しいのは
2:48 AM
JSClosureをJSFunctionとして扱うインターフェースなんだけど
2:48 AM
Swift側で is じゃなくても、明示的な変換でもいいし
Avatar
どこで欲しくなるんだろう
Avatar
omochimetaru 4/7/2024 2:49 AM
さっき書いたように実装は可能なんだけど公式にあった方がいいなと思う public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws }
Avatar
Avatar
Yuta Saito
どこで欲しくなるんだろう
omochimetaru 4/7/2024 2:50 AM
WebMock を実装してて困った。 public class WebEventTarget: JSNativeObject { public init() { } private var listeners: [String: [JSFunction]] = [:] public func addEventListener(_ type: String, _ listener: JSFunction) { var lns = self.listeners[type] ?? [] if lns.contains(listener) { return } lns.append(listener) self.listeners[type] = lns } public func removeEventListener(_ type: String, _ listener: JSFunction) { guard var lns = self.listeners[type] else { return } lns.removeAll { $0 == listener } self.listeners[type] = lns } public func dispatchEvent(_ event: WebEvent) -> Bool { guard let lns = self.listeners[event.type] else { return true } for ln in lns { ln(event) } return true }
2:50 AM
Web側のモックだから本物のJavaScriptKitと連動することはないのでそういう意味では実際には不要ですけど・・・
2:51 AM
一般的にいうと、Swift上で、Rxみたいな関数を登録しておいて後で使う仕組みを JSFunction に対して作ろうとすると困ると思う
2:52 AM
JSClosureも渡せるようにしたいだろうから。
Avatar
JSClosureじゃなくてJSFunctionで受けたいのは本物のJS関数も渡したいから?
Avatar
omochimetaru 4/7/2024 2:52 AM
そうですね。それをJSのオブジェクトから取り出すかもしれないし。
2:53 AM
stream.subscribe(on: button.onclick) とか。
Avatar
そろそろ起きてパソコンでちゃんと見るか…
Avatar
omochimetaru 4/7/2024 2:55 AM
子供がお昼寝から起きたからしばらく落ちますw
Avatar
入れ替わった🫥
Avatar
omochimetaru 4/7/2024 4:00 AM
アドレス再利用問題については 関数の実装と一緒にselfへの弱参照を貼っておけば解決しないかな 弱retainがあるとdeinitされてもdeallocはされないので
Avatar
あー、そうか
4:02 AM
しかもコメント付き。やるな // Note: Retain the closure object itself also to avoid funcRef conflicts fileprivate static var sharedClosures: [JavaScriptHostFuncRef: (object: JSObject, body: ([JSValue]) -> JSValue)] = [:]
4:04 AM
普通のretainだけどJS側のクロージャからはこのオブジェクト自体は直接参照されず JavaScriptHostFuncRef を持ってるだけだから問題ないはず
Avatar
omochimetaru 4/7/2024 4:06 AM
普通のretainだとサイクルしてリークしないの?
4:07 AM
JSObject→jsの関数→ID→実装テーブル→JSObject (edited)
4:08 AM
(このテーブルの型のObject、thisだと思い込んでて見逃してたわ
Avatar
JSObject→jsの関数があったか
Avatar
omochimetaru 4/7/2024 4:11 AM
そう、create_functionでretainしてdeinitでreleaseする強参照があることをさっき教わった (edited)
Avatar
Avatar
omochimetaru
さっき書いたように実装は可能なんだけど公式にあった方がいいなと思う public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws }
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
Avatar
Avatar
Yuta Saito
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
omochimetaru 4/7/2024 4:28 AM
これでもいい気がする JSClosureはJSFunctionに静的な色を付けてるだけ、という位置付けで 動的には消えるけど問題ないし
Avatar
Avatar
Yuta Saito
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
omochimetaru 4/7/2024 4:54 AM
No FRモードの場合に大丈夫か気になったけど問題ないな JSFunctionは何もしてないし (edited)
Avatar
問題ないかな…?この辺変更するの怖いんだよなぁ
4:59 AM
まあ入れてみよう
Avatar
omochimetaru 4/7/2024 5:00 AM
こわいねえ
Avatar
リークも直してみたけど自信ないなー https://github.com/swiftwasm/JavaScriptKit/pull/240
let c1 = JSClosure { _ in .undefined } consume c1 did not release the JSClosure itself and it leaked the underlying JavaScript closure too because JSClosure -> JS closure thunk -> Closure reg...
Avatar
omochimetaru 4/7/2024 6:20 AM
スマホでよくわからんけど意図した感じにはなっとる
6:21 AM
WeakBoxつかわんでもClosureEntryにweak varもたせたら?
Avatar
JSOneshotClosureの方はユーザが保持しておく約束ではない+一回呼ばれたタイミングで自分でサイクルを切るので強参照にしたいので
6:37 AM
見直すとヒープオブジェクトが二段になるのは微妙だな
Avatar
omochimetaru 4/7/2024 6:37 AM
なるほど。Oneshotの方では強参照で使い回してるのか。
6:38 AM
あともう一点 ClosureEntryをstructにする選択肢があるけど、コレクションの操作のオーバーヘッドが増えるからどっちが得かわからん
6:40 AM
WeakBoxをstructにする選択肢もあるな・・・
Avatar
ClosureEntryをstructにするのが良さそう。ポインタ3つくらいなら。
6:41 AM
WeakBoxはweak varを持つためにstructにはできない
Avatar
omochimetaru 4/7/2024 6:41 AM
structのメンバーもweak varにできるでしょ?
Avatar
あれ、そうか。勘違いしてた
Avatar
omochimetaru 4/7/2024 6:43 AM
弱参照ポインタは弱retain countを操作するだけで強参照ポインタと表現は同じ
Avatar
ClosureEntry.object: AnyObject だからどちらにしても WeakBoxはclassにできないけど
Avatar
omochimetaru 4/7/2024 6:44 AM
そこの持ち方はそうですね enumにしたら強弱の両方いける
Avatar
それが最適な持ち方かな
Avatar
omochimetaru 4/7/2024 6:45 AM
enum Obj{case strong(AnyObj); case weak(WeakBox)
6:45 AM
これでも値的で8バイトのはず
Avatar
omochimetaru 4/7/2024 6:54 AM
妻帰ったからパソコンちょっとできる
6:56 AM
いいねこれ
Avatar
月曜にこのブランチで大きなテストを走らせてみて問題なければマージします
7:00 AM
テストコードもリークに依存しててマズかった
7:01 AM
しかし数年越しのバグをバンバン見つけるの本当にすごい
Avatar
omochimetaru 4/7/2024 7:02 AM
このへんは家庭君がJavaScriptKit作り始めた頃から話題としては振ってたわけでトピックとしては似たようなことをやったり考えたことがずっと前にあるんだよね
7:03 AM
自分が使うんだったら中身知っとかないとバグりそうだから見たら気になっただけ
Avatar
Avatar
Yuta Saito
テストコードもリークに依存しててマズかった
omochimetaru 4/7/2024 7:03 AM
リークしたおかげで逆に通ってたテストがあるってこと?
7:05 AM
一番のハードユーザーであろうトカマクはこの上に乗ってて壊れてなかったのが気になるわ・・・ (edited)
Avatar
そうそう。リークしてる分には壊れることは無いから通ってた
naruhodo 1
7:07 AM
どうせJSオブジェクトが回収されるタイミングはコントロールできないから、回収されることに依存したコードがなかったと言うか
Avatar
omochimetaru 4/7/2024 7:08 AM
あ〜まあそうか。具体的な問題が起きるのは限界までリークが溜まった場合だけか。 (edited)
7:08 AM
Tokamakみたいなアーキテクチャの場合、renderのたびにちょっとずつリークしていく、みたいな状態になると怖いけどまあ2GBは遠いか
Avatar
テストが落ちるようになったように、リークが治るとTokamakが壊れる可能性がありそうですね…
Avatar
ありそうですねぇ。
Avatar
omochimetaru 4/7/2024 7:09 AM
あっ、そうか。
Avatar
なのでこれマージするの怖い
Avatar
omochimetaru 4/7/2024 7:10 AM
😗
7:10 AM
strong を使う互換モードが要る?
Avatar
FRナシモードを使ってなければ壊れることは無いんだけど
7:11 AM
FRナシモードでは保守的(?)にリークさせる?
Avatar
omochimetaru 4/7/2024 7:12 AM
そういえばFRのモードはどこで決まるんでしたっけ
Avatar
ビルド中に -DJAVASCRIPTKIT_WITHOUT_WEAKREFS を渡すかどうかで決まります
Avatar
omochimetaru 4/7/2024 7:14 AM
アプリケーションをビルドするときに $ swift build -swiftc -DJAVASC...
Avatar
そうそう
Avatar
omochimetaru 4/7/2024 7:15 AM
なるほど。じゃあビルドツリーにおいて複数のライブラリがそれぞれJSKに依存していても、一斉に同じモードになるので、分断してリンクできなくなる心配はしなくて良いのか。 (edited)
7:20 AM
@Yuta Saito 一昨日?話した、この修正も今投げました https://github.com/swiftwasm/JavaScriptKit/pull/241
7:20 AM
これでいったん既知のバグはなくなると思う
Avatar
Optional.construct の変更がもう一回入ってそう?
Avatar
omochimetaru 4/7/2024 7:24 AM
あら
7:25 AM
ほんとだ 直します
7:27 AM
直しました
Avatar
どもども
Avatar
omochimetaru 4/7/2024 7:27 AM
ああ、テストがないと思ったら Tests じゃなくて
7:28 AM
IntegrationTests とかなのか
Avatar
そうそう。XCTestが移植される前からあったので
Avatar
omochimetaru 4/7/2024 7:29 AM
XCTestが移植される前
なるほど、そういう理由
Avatar
テスト足していただけるとありがたし 🙏
Avatar
omochimetaru 4/7/2024 7:29 AM
うおおお
7:30 AM
Xcodeからは見えない!w
Avatar
w
Avatar
TestSuitesパッケージを開くとJSKもテストパッケージも見えます
Avatar
omochimetaru 4/7/2024 7:33 AM
[omochi@omochi-mbp IntegrationTests (fix-object-decode *=)]$ make test npm ci added 27 packages, and audited 31 packages in 313ms 1 package is looking for funding run `npm fund` for details found 0 vulnerabilities cd .. && npm run build > javascript-kit-swift@0.19.1 build > npm run build:clean && npm run build:ts > javascript-kit-swift@0.19.1 build:clean > rm -rf Runtime/lib > javascript-kit-swift@0.19.1 build:ts > cd Runtime; rollup -c sh: rollup: command not found make: *** [build_rt] Error 127
Avatar
npm install?
Avatar
omochimetaru 4/7/2024 7:33 AM
rollup ってなんだっけ npm install はしたけど
7:33 AM
Avatar
プロジェクトトップでやらないとダメかも?
Avatar
omochimetaru 4/7/2024 7:34 AM
ああ〜
Avatar
rollupはバンドラー
Avatar
omochimetaru 4/7/2024 7:34 AM
ほんとだ。ここにもMakeあった
7:35 AM
created lib/index.mjs, lib in 345ms swift build --package-path TestSuites \ --product ConcurrencyTests \ --triple wasm32-unknown-wasi \ --configuration debug \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export=main \ warning: 'testsuites': 'PrimaryTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' warning: 'testsuites': 'ConcurrencyTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' warning: 'testsuites': 'BenchmarkTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' Building for debugging... In file included from /Users/omochi/github/swiftwasm/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/swiftwasm/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [4/12] Write swift-version-37CF2ABA3CB73B3C.txt make[1]: *** [TestSuites/.build/debug/ConcurrencyTests.wasm] Error 1 make: *** [test] Error 2
7:35 AM
triple指定だからか
7:35 AM
swift-sdk指定じゃないから・・・あっちを使うしかないな
Avatar
PATHにswiftwasmツールチェインをいれるかTOOLCHAINS指定すると
Avatar
omochimetaru 4/7/2024 7:39 AM
テスト完走できた テスト追加します
👍 1
Avatar
omochimetaru 4/7/2024 8:04 AM
テスト足しました
8:05 AM
CIめちゃくちゃバリエーションあってウケる
8:06 AM
8:06 AM
macとubuntuとswiftとxcodeとWASI実装のバリエーションがあるのww
Avatar
超手厚いCI
Avatar
omochimetaru 4/7/2024 8:10 AM
swift 6 からは swift-sdk を使ったビルドもテストしなければならんな・・・ (edited)
Avatar
大変だ
Avatar
omochimetaru 4/7/2024 8:11 AM
Makefileの調整がめんどくさそうだ
Avatar
omochimetaru 4/9/2024 12:55 AM
wasmで動くSwiftライブラリは、せっかくユーザーのブラウザで動くのだから、デモサイトでplayground的に使えるようにしたいけど
12:55 AM
Swiftのソースをwasm binaryにコンパイルするところは
12:55 AM
サーバー側でコンテナ建ててコンパイルさせないといけないよねえ
Avatar
omochimetaru 4/9/2024 12:56 AM
そうするとGitHub Pagesだけじゃできないし、お金がかかりそう
12:56 AM
おお
12:56 AM
もうブラウザで全部動いていたのか
12:56 AM
Run押してから表示するまでめっちゃおせえw
Avatar
CloudRunが裏にいる
Avatar
omochimetaru 4/9/2024 12:57 AM
あ、コンパイラはブラウザじゃないのね (edited)
Avatar
https://syzf23805k.execute-api.ap-northeast-1.amazonaws.com/prod/CompileSwiftWasm
12:57 AM
コンパイルはサーバがやってそうですね
Avatar
omochimetaru 4/9/2024 12:58 AM
2回目の方が早いな、でも遅いな
Avatar
AWSだからApp Runner?
12:58 AM
App Runnerのデフォルトドメインではなさそうだ
Avatar
omochimetaru 4/9/2024 12:59 AM
share buttonにソース全部入ってるな (edited)
12:59 AM
ここにライブラリを入れてもらう作戦は、ありえるな。
Avatar
これってリンカーはブラウザで動かしてるんですよね?
Avatar
あれ、LambdaだとなんかコンテナがクラッシュしたからGCPに移したはずなんだけどデプロイしてなかったっけ
Avatar
Avatar
Iceman
これってリンカーはブラウザで動かしてるんですよね?
そうっすね、サーバはオブジェクトファイル返すだけ
1:01 AM
これがブラウザで動いてる https://github.com/kateinoigakukun/chibi-link
A toy linker for WebAssembly object files. Contribute to kateinoigakukun/chibi-link development by creating an account on GitHub.
Avatar
omochimetaru 4/9/2024 1:02 AM
リンカー自作しとる
Avatar
omochimetaru 4/9/2024 3:15 AM
おお!stdlibを使い回していたのか おもしれー
3:15 AM
ブラウザがiPhoneでサーバーがappstoreみたいな感じだ
Avatar
pad.swiftwasm.orgまだSwift 5.6のツールチェインつかってる笑
3:27 AM
古代で止まってる…
Avatar
omochimetaru 4/9/2024 3:37 AM
ビルドするときはTokamakなどのライブラリを含めたフルビルドになっていて、インクリメンタルではないのかな?
3:37 AM
stdlibだけがプレビルド?
Avatar
昔過ぎてあんまり覚えてないんですけど、依存ライブラリ全てのswiftmoduleをデプロイ前にビルドしておいて、Lambdaのコンテナに全部突っ込んでた気がする (edited)
Avatar
omochimetaru 4/9/2024 3:38 AM
なるほど。じゃあコンパイルしてるのはエディタ部分だけか。アーキテクチャは全体的にかなり速そうだ
3:40 AM
体感が遅かった理由が気になるな〜、全て終わったころに調べてみたい
Avatar
うむー、体感昔より遅いんですよね。
3:43 AM
Lambdaの実行時間が7秒とかかかってるんでボトルネックがここなのは明らかなんですけど
3:43 AM
これ1年以上前のメトリクス見れないんだな
Avatar
omochimetaru 4/9/2024 3:44 AM
ふむふむ
Avatar
ぼくのAWS力ではこの辺が限界
3:46 AM
Lambdaの下請けマシンスペックが下がったのかな
Avatar
omochimetaru 4/9/2024 3:47 AM
自分のAWSにデプロイしていろいろやってみます、あとあとで
Avatar
デモの準備が整ったあたりで追々
👉 1
Avatar
omochimetaru 4/9/2024 4:34 PM
func testState() throws { struct Content: Component { @State var count = 0 func render() -> Node { return div { "\(count)" button( listeners: [ "click": Function { (ev) in count += 1 } ] ) } } } let body = try document.createElement("body") let root = ReactRoot(element: body) root.render( node: Content() ) XCTAssertPrint(body, """ <body> <div> 0 <button /> </div> </body> """) let btn: JSHTMLElement = try XCTUnwrap( root.root? .find { $0.tagElement?.tagName == "button" }? .dom?.asHTMLElement() ) try btn.click() XCTAssertPrint(body, """ <body> <div> 1 <button /> </div> </body> """) } ちょっとそれっぽくなってきた(↑このテストが通った) (edited)
🎉 3
Avatar
omochimetaru 4/13/2024 1:19 PM
うーん?
1:20 PM
[omochi@omochi-mbp ReactTests (main =)]$ ls -1 CallbackHookTests.swift ContextHookTests.swift RefHookTests.swift RenderPlanTests.swift RenderTests.swift StateHookTests.swift VNodeTests.swift
1:20 PM
ブラウザでテストする時、このディレクトリには本来7つのXCTestCaseがあるんだけど
1:20 PM
VNodeTests RenderTests RenderPlanTests が含まれる時
1:20 PM
ブラウザがフリーズしてCPU100%になってハングする
1:21 PM
だけど、このディレクトリの中身を、 この3つのテストのうちの2つだけにしたら、ハングしない
1:21 PM
例えば、 VNodeTestsRenderTests だけとか RenderTestsRenderPlanTests だけ、みたいな時は大丈夫なのに (edited)
1:21 PM
VNodeTests RenderTests RenderPlanTests の3つがあるとフリーズする (edited)
1:22 PM
全部JavaScript側にアクセスするから、状態空間は共有してるけど、なんでそんなことが起きるのか想像がつかない
1:22 PM
@Yuta Saito という感じなんですが、何かわかりますか? どうアプローチしたらいいか思いつかなくて困り中
1:24 PM
WASM実行レイヤ(ブラウザ)、WASMコード(コンパイラ)、XCTestの実装、Carton、俺の書いたコード が容疑者なんだけど絞り込みが難しい
1:27 PM
「3つ含めるとフリーズする」こと自体の再現性は100%だな
1:28 PM
いや、それも嘘だ・・・今回は通った
Avatar
なんだろう。asyncなテストはありますか?
Avatar
omochimetaru 4/13/2024 1:29 PM
今の所async awaitはいっさい使ってない
Avatar
であれば本当にブラウザがハングしてるだろうからハングしてるところを捕まえてもらうのが良いかな
1:29 PM
デバッガ繋がります?
Avatar
omochimetaru 4/13/2024 1:30 PM
ブラウザが死ぬから右クリックが効かなくてデバッガタブが出せない
1:30 PM
SafariでもChromeでも同じ
Avatar
なるほど厳しい
Avatar
omochimetaru 4/13/2024 1:30 PM
Avatar
ブランチプッシュしてもらえれば見れますー
Avatar
omochimetaru 4/13/2024 1:31 PM
今mainブランチでその状態です
1:31 PM
7個フルで入ってる状態だとほぼ100%死ぬ
1:31 PM
4個でも100%
1:31 PM
3個だと90%ぐらい?でも一度安定すると安定する
Avatar
謎だなー。コールスタックが深かったりしますか?
Avatar
omochimetaru 4/13/2024 1:32 PM
Safariでも同じ感じ 100%
Avatar
Avatar
Yuta Saito
謎だなー。コールスタックが深かったりしますか?
omochimetaru 4/13/2024 1:32 PM
ツリー構造に対して再帰的な処理は色々あるから深い可能性はある Xcodeの方で見てみる
1:33 PM
-Xlinker -z -Xlinker stack-size=131072
Avatar
omochimetaru 4/13/2024 1:34 PM
1:34 PM
一番深いところを見つけるのが難しいね?とりあえず適当に狙ったら108
Avatar
Avatar
Yuta Saito
-Xlinker -z -Xlinker stack-size=131072
omochimetaru 4/13/2024 1:36 PM
お。通った。
1:36 PM
スタックオーバーフローなの・・・?(こういう症状に、なるか・・・? (edited)
Avatar
ですね
Avatar
omochimetaru 4/13/2024 1:37 PM
The default stack size is 64KB: 65536
1:37 PM
試しに stack-size=65536 にしてみるね
Avatar
Wasmのスタック領域、デフォルトだとめっちゃ小さくてしかもガードページの概念が無いので超えちゃっても書き込めちゃうんですよね
Avatar
omochimetaru 4/13/2024 1:38 PM
おー死んだ > 65536
1:38 PM
超えるんだ・・・
1:38 PM
じゃあメチャクチャにメモリ破壊されてるのか
Avatar
で、さらに都合の悪いことにwasm-ldのデフォルトのメモリレイアウトがスタック領域をデータ領域の直後に置くんで、超えたときにデータを破壊し続けるんですよ
Avatar
omochimetaru 4/13/2024 1:39 PM
その結果ツリー構造とかがイカれてたまたまロジックが無限ループになったりしてる可能性があるか
1:39 PM
じゃあこれはブラウザでなくても同じか
1:39 PM
carton testerのenvironmentを変えたら詳しく調べられるのかな (edited)
Avatar
なのでcartonはデフォルトで -Xlinker --stack-first を付けて、スタック領域をメモリ空間の最初に置いて、超えたときに負のアドレスをデリファレンスさせるようにして暗黙の破壊を防いでるんですけど
Avatar
omochimetaru 4/13/2024 1:40 PM
なるほど。
Avatar
今回はcartonなしでビルドしたのでその保護機構が動いてなかった
Avatar
omochimetaru 4/13/2024 1:40 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker -z -Xlinker stack-size=65536 CartonFrontend test \ --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm \ --environment browser
1:40 PM
stack-firstの指定はないンゴね
Avatar
stack-first付けといたほうが安全
1:41 PM
ちょっとサイズ増えるけど
Avatar
omochimetaru 4/13/2024 1:41 PM
このコマンドってでもcartonからパクって作ったはずだけどな
Avatar
あれ、じゃあデフォルトで付けてるのが嘘かも
Avatar
omochimetaru 4/13/2024 1:42 PM
error: link command failed with exit code 1 (use -v to see invocation) wasm-ld: error: --global-base cannot be less than stack size when --stack-first is used clang: error: linker command failed with exit code 1 (use -v to see invocation) [230/231] Linking swift-reactPackageTests.wasm ビルドできなくなった
1:43 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker --stack-first \ -Xlinker -z -Xlinker stack-size=65536
Avatar
-Xlinker --global-base=65536 も一緒に付けると
Avatar
omochimetaru 4/13/2024 1:43 PM
hmhm
Avatar
最近変わったんだった
Avatar
omochimetaru 4/13/2024 1:44 PM
1:44 PM
フリーズする代わりにこの画面が出るようになった。
Avatar
Chromeだとどうです?
Avatar
omochimetaru 4/13/2024 1:45 PM
2024-04-13T22:44:40+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs An error occurred: RuntimeError: memory access out of bounds お、なんか出た
Avatar
お、出てる
Avatar
omochimetaru 4/13/2024 1:45 PM
最初からchromeを立ち上げるにはどうするんだっけ
1:45 PM
今はsafariが自動起動して、↑の表示になった後、手でchromeを繋げた
Avatar
WEBDRIVER_PATHにchromedriverコマンドを指定すると
1:46 PM
chromedriverはここから持ってくる https://chromedriver.chromium.org/downloads
Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading. For older versions of Chrome, please see below for the version of ChromeDriver
Avatar
omochimetaru 4/13/2024 1:47 PM
If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading.
1:47 PM
123だからこの注意書きが該当しそうだ
Avatar
omochimetaru 4/13/2024 1:51 PM
Safariが起動しちゃった コマンド直うちでもOSにブロックされる
Avatar
xattr -d com.apple.quarantine path/to/chromedriver
👀 1
Avatar
omochimetaru 4/13/2024 1:54 PM
chromedriverは起動できるようになったけどまだSafariが開くな
Avatar
webdriver使うのは--headlessのときだけだ
Avatar
omochimetaru 4/13/2024 1:55 PM
なるほど
1:55 PM
そういえば話に出てきた時はヘッドレスだった (edited)
1:55 PM
OSの標準ブラウザを切り替えればいいのかな
1:55 PM
どこだ・・・?
Avatar
普通に開かれるのはOS標準ブラウザ
Avatar
omochimetaru 4/13/2024 1:55 PM
画面の左上にある Apple メニュー  から「システム設定」を選択します。 サイドバーで「デスクトップと Dock」をクリックします。 右側で下にスクロールして、「デフォルトの Web ブラウザ」メニューから、使いたい Web ブラウザを選択します。
1:56 PM
「デスクトップとDock」←わかるわけないわ
Avatar
w
Avatar
omochimetaru 4/13/2024 1:56 PM
きた
1:56 PM
chromeだと、ブラウザは
Test run finished. Check the output of carton test for details.
1:56 PM
ターミナルは + swift build --experimental-swift-sdk wasm32-unknown-wasi --build-tests -Xswiftc -static-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv --disable-build-manifest-caching -Xlinker --stack-first -Xlinker --global-base=65536 -Xlinker -z -Xlinker stack-size=65536 warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... warning: Could not read SDKSettings.json for SDK at: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable warning: Could not read SDKSettings.json for SDK at: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable [5/5] Emitting module swift_reactPackageTests Build complete! (0.64s) + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /favicon.ico 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs An error occurred: RuntimeError: memory access out of bounds
1:57 PM
若干、意味不明だな。
Avatar
どちらにせよOOBで死んでるからスタック足りてない
Avatar
omochimetaru 4/13/2024 1:58 PM
Safariだと「問題が起きました」で、コンソールは 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs これでサーバー継続してる
1:58 PM
不思議だ・・・
Avatar
ページから結果送る前にページが死んじゃってるんだろうな
Avatar
omochimetaru 4/13/2024 1:59 PM
あー、ブラウザのエンジンとGUIの噛み合わせみたいなところで実装の違いが出ているのか
Avatar
Avatar
Yuta Saito
どちらにせよOOBで死んでるからスタック足りてない
omochimetaru 4/13/2024 2:00 PM
これは、スタック領域を超えた結果、負のアドレスにアクセスしようとしたってこと?
Avatar
ですね。
Avatar
omochimetaru 4/13/2024 2:00 PM
負のアドレスだからout of bounds
2:00 PM
その時どうなるかは、SafariやChromeの実装次第、ということね。
Avatar
いやぁ流石にページクラッシュは何かがおかしなことになってると思うけど…
2:01 PM
普通は例外が投げられます
Avatar
omochimetaru 4/13/2024 2:01 PM
外形的な情報しかないからモヤっとするけどスタックオーバーフローが起きてるのは確定診断でいいのかな (edited)
Avatar
そうですね
Avatar
omochimetaru 4/13/2024 2:01 PM
わかった。ありがとう
Avatar
むかーしTokamakでも同じ問題にあたった事がある https://github.com/TokamakUI/Tokamak/issues/367
Describe the bug There's a certain snippet of code, which when rendererd in the browser triggers an infinite loop after clicking on a NavigationLink. To Reproduce Build and run this snippet wit...
Avatar
omochimetaru 4/13/2024 2:03 PM
テストケースを3つ入れた時に問題が起きるのはなんでだ?
2:03 PM
そうなってくると決定論的な症状に思えるが
2:04 PM
どれもテストケース(XCTestCase)1個だけならオーバーフローしないし
Avatar
コメントアウトしてフィルタしてました?
Avatar
omochimetaru 4/13/2024 2:04 PM
いや、ディレクトリから RenderTests.swift ファイルを取り除いてリビルドしてた
2:04 PM
Finderを2つ開いて、マウスで行ったり来たりさせて
2:04 PM
追加したり減らしたりしてた
Avatar
ソースが変わってるならバイナリ上のメモリレイアウトが変わるんで
Avatar
omochimetaru 4/13/2024 2:05 PM
あ〜!
2:05 PM
はみ出た場所に何があるかが違うのか・・・
Avatar
そうそう。なので再現むずい
Avatar
omochimetaru 4/13/2024 2:06 PM
初代ポケモンのバグみたいだ、しんどすぎるw
2:06 PM
macOSとかではスタックオーバーフローでちゃんと止まるのはどうなってるの?
Avatar
ガードページがあるんじゃないかな
Avatar
omochimetaru 4/13/2024 2:07 PM
なるほど
2:07 PM
うーんそうするとstack-firstで0番地を使うのは良い考えに思えるな
2:08 PM
というかそれしかないやん
2:08 PM
処理系に不正メモリアクセスとして気づいてもらう必要があるわけよね
Avatar
現状そうですね。
2:09 PM
昔.wasmに対してバイナリ変換をして関数のプロローグでスタックポインタの値をチェックするようなコードを挿入したり試してたんですけど
Avatar
omochimetaru 4/13/2024 2:10 PM
なるほど。オーバーヘッド凄そう。
2:10 PM
最適化阻害も起きるか・・・?
Avatar
そう。オーバーヘッドすごいしDWARFのオフセットも合わせて変えないといけないから超大変。
Avatar
Avatar
Yuta Saito
むかーしTokamakでも同じ問題にあたった事がある https://github.com/TokamakUI/Tokamak/issues/367
omochimetaru 4/13/2024 2:11 PM
@Yuta Saito please help, my debugging skills are not good enough for this. My only hypothesis is that something's weird with the metadata (maybe the Runtime library misreads some fields?) and this somehow messes everything up.
maxに共感しかないな
2:11 PM
そうすると第一安全弁はstack-firstを原則として
2:11 PM
第二は、スタックのサイズ幾つにすればいいんだ?
2:12 PM
全然考え方がわからない。
Avatar
たくさん
Avatar
omochimetaru 4/13/2024 2:12 PM
あれ?最初の状態だと
2:12 PM
ヒープの後ろ(大きい番地)にスタックがあるんですよね
2:12 PM
memory.growした時は
Avatar
逆ですね
2:13 PM
0, data, stack, heap (edited)
2:13 PM
--stack-firstだと 0, stack, data, heap
Avatar
omochimetaru 4/13/2024 2:13 PM
ああーなるほど スタックが小さいアドレスから大きいアドレスに育っていくのか
2:13 PM
stack-firstの時は伸びる方向が逆になる・・・?
2:14 PM
ああ、違うか、data領域に向かって伸びていく?
Avatar
いや、どちらも大きいアドレスから小さいアドレスに伸びてく
Avatar
omochimetaru 4/13/2024 2:14 PM
破壊されてるのはdataだったのか
Avatar
そうそう。ヒープは破壊されない
Avatar
omochimetaru 4/13/2024 2:14 PM
じゃあメタデータや実行命令が壊れんの?
Avatar
とか文字列リテラルとかグローバル変数とか
Avatar
omochimetaru 4/13/2024 2:14 PM
すごいな・・・
2:15 PM
それって安全なのか・・・?
2:15 PM
それを利用して攻撃できたりしないか?
Avatar
良いポイントですね。
Avatar
omochimetaru 4/13/2024 2:15 PM
狙って何かするのありえん難しそうだが
2:15 PM
でもwasmって逆に状態の再現性が高いからありえそう
Avatar
omochimetaru 4/13/2024 2:16 PM
Moreover, WebAssembly enables unique attacks, such as overwriting supposedly constant data or manipulating the heap using a stack overflow.
2:16 PM
わあw
2:17 PM
Everything Old is New Again: Binary Security of WebAssembly
2:17 PM
タイトルがいいね。
2:18 PM
default: 0, data, stack, heap --stack-first: 0, stack, data, heap レイアウトによらず、スタックサイズの決め方は同じだね
2:19 PM
でかいと溢れにくくなるけど、その代わり .wasm をロードした時に消費する初期メモリサイズがデカくなる、であってる? (edited)
Avatar
初期メモリサイズがデカくなったとしても汚れてないページなので大したペナルティにはならないはずで
Avatar
omochimetaru 4/13/2024 2:21 PM
なるほどなるほど
2:21 PM
macOSは8MBあるらしい。デフォルトの64KBの128倍か
Avatar
むしろdata領域へのアドレスが大きな値になるので、LEB128にエンコードされたアドレスを即値にもつ命令サイズが大きくなっちゃって
Avatar
omochimetaru 4/13/2024 2:21 PM
Avatar
バイナリサイズ自体が増えるのが痛いですね
Avatar
omochimetaru 4/13/2024 2:22 PM
むず!
2:22 PM
WASMの命令はそういうコーデックなのか
Avatar
LEB128はdwarfでも使われてる可変長フォーマットで
2:23 PM
値自体が大きくなればなるほどサイズが伸びてく
Avatar
omochimetaru 4/13/2024 2:23 PM
あれ、命令セットじゃなくてオブジェクトフォーマットの話?
Avatar
命令セット中の数値エンコーディング
🆗 1
Avatar
omochimetaru 4/13/2024 2:24 PM
data領域後ろに置きたくないンゴね・・・
2:25 PM
気持ちが生まれてしまった
Avatar
まああとは実測してバランス取るしか無いですねぇ
Avatar
omochimetaru 4/13/2024 2:25 PM
まあそうか
2:25 PM
その初期全体メモリサイズはどうしたらわかるん (edited)
Avatar
むずいな
2:28 PM
簡単な方法は思いつかなかった。。 wasm-objdumpでDataセグメントをダンプして、セグメントが要求するページサイズを64kbで掛けて、指定されてるベースアドレスと足し合わせるとわかる (edited)
Avatar
omochimetaru 4/13/2024 2:29 PM
結構難しかった
2:29 PM
当然処理系はfoo.wasm をロードした時点で数字がわかってるんだよね?
Avatar
もしくはブラウザ上でinstantiateしたinstanceからinstance.exports.memoryでメモリインスタンスをインスペクトすれば
👀 1
2:30 PM
処理系は知ってるけどそれを教えてくれる口が無い
Avatar
omochimetaru 4/13/2024 2:30 PM
家庭くんの作ったwasminspectではわからん?
Avatar
そういう機能を作れば分かるけど、それ作るならwasm-objdumpの出力を勉強するほうが早そう
Avatar
omochimetaru 4/13/2024 2:33 PM
なるほど
2:35 PM
2:35 PM
こういうことか
Avatar
それそれ
Avatar
omochimetaru 4/13/2024 2:37 PM
stack-firstを外しても全く変わらなかった 何かミスってるかな
Avatar
おー?じゃあサイズのペナルティ分がページサイズのアライメントで足されるパディング分で収まってるってことかな
Avatar
omochimetaru 4/13/2024 2:38 PM
stack-sizeを128KBから8MBにしてみた
2:38 PM
これはちゃんと増えたな
Avatar
じゃあその規模だとstack-firstのサイズオーバーヘッドは大した事ないということで
Avatar
omochimetaru 4/13/2024 2:39 PM
5,111,808 13,369,344 ちゃんと8MBぐらい増えている
Avatar
Avatar
Yuta Saito
おー?じゃあサイズのペナルティ分がページサイズのアライメントで足されるパディング分で収まってるってことかな
omochimetaru 4/13/2024 2:39 PM
なるほど・・・そういうこともあるのか
2:40 PM
そもそも初期状態で5MB使ってるならスタック1MBぐらいにしとこ
2:40 PM
exportsからArrayBufferとしてメモリ見えてるの面白いですね
Avatar
よさそう
2:40 PM
JavaScriptからいじり放題
Avatar
omochimetaru 4/13/2024 2:41 PM
今めちゃくちゃローレベルな気持ちになってたのに
2:41 PM
急にハイレベルになって脳がバグった
Avatar
たしかにw
2:44 PM
Tokamakで初めてスタックオーバーフローの問題をデバッグしたときにデバッガ拡張したの思い出した https://twitter.com/kateinoigakukun/status/1378858885801340929?s=20 (edited)
My WebAssembly debugger started interacting with JavaScript host-environment!
Avatar
omochimetaru 4/13/2024 2:45 PM
あ、wasminspectって実行環境は持ってなくて、ブラウザのそれと通信してデバッグするツールなのか
Avatar
いや、これはJavaScript上のWebAssemblyクラスとメソッドを全てフックして、ブラウザからホストのwasminspectとRPCして、wasminspect上で実行してる
Avatar
omochimetaru 4/13/2024 2:46 PM
えぐ
Avatar
エクストリームデバッグ環境
Avatar
omochimetaru 4/13/2024 2:46 PM
なるほど JavaScriptっぽい世界
Avatar
でもこれっきり使う機会は無かったな…
2:47 PM
A debugger agent of wasminspect for JavaScript host environment. - kateinoigakukun/wasminspect-agent.js
Avatar
omochimetaru 4/13/2024 2:47 PM
WASMがJS側をみるところも抑えられるから
2:47 PM
ブラウザからWASMの箱だけ抜き出したような状態なのか
Avatar
そうそう。リポジトリに絵がある
Avatar
omochimetaru 4/13/2024 2:48 PM
えぐいなこれw
2:48 PM
心臓手術で使う人工心肺みたいだ
Avatar
人工心肺w 完全にそれだ
Avatar
omochimetaru 4/13/2024 2:48 PM
血は回ってるので体は手術されてることに気づかない・・・ (edited)
2:49 PM
いやーありがとう テストも通ってたし、設定変えたからしばらく心配なさそうだ 家庭くん居なかったらマジでこれ無理すぎた
2:50 PM
swift-wasmが思ったよりエクストリームだ
Avatar
もうちょっと「普通」の環境にしたい
Avatar
omochimetaru 4/13/2024 2:51 PM
てかブラウザってJSが無限ループしてもフリーズしないよね
2:51 PM
WASMが暴走しててもGUIは生きててほしいね
Avatar
フリーズするんじゃないですか?
Avatar
omochimetaru 4/13/2024 2:51 PM
そうだっけ・・・?
Avatar
そのはず。メインスレッドをフリーズさせない一番確実な方法はWorkerで走らせることですね (edited)
naruhodo 1
Avatar
omochimetaru 4/13/2024 2:53 PM
あーほんとだ
2:53 PM
同じ状態になった
Avatar
そうなんすよ
Avatar
omochimetaru 4/13/2024 2:55 PM
Safariだと右クリックできないけどSafari全体は生きてて、タブを閉じるバツボタンは生きてて
2:55 PM
そこでタブを閉じて脱出する感じだわ
2:56 PM
なるほどなー
Avatar
スタック使いすぎて破壊しちゃうの、https://github.com/WebAssembly/multi-memory 使えると嬉しいのかな (実装大変そうだけど…
Multiple per-module memories for Wasm. Contribute to WebAssembly/multi-memory development by creating an account on GitHub.
Avatar
嬉しいのかな?そこが絡んでくるのは知らなかった
Avatar
omochimetaru 4/15/2024 5:09 PM
CIでheadless chromeでWASM + JSの実行がテストできた。
5:11 PM
Cartonをビルドするところが一番重たい
Avatar
まだそんなにかかるかー
5:16 PM
NIOすらやめる?
5:17 PM
別にノンブロッキングである必要は全く無いんだよな
Avatar
omochimetaru 4/15/2024 5:19 PM
勝手にprebuildしようかなと考えてた
Avatar
みんな困るならcarton側でartifactbundle用意するか依存減らすかしたいなぁ
Avatar
omochimetaru 4/16/2024 2:10 PM
prebuild早くて最高や
Avatar
omochimetaru 4/16/2024 2:34 PM
GitHubのこれって時刻順じゃなくて名前順なの・・・?
Avatar
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
Avatar
gitのコミットってどうやって順序付けるんだろう
Avatar
Avatar
kebo
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
omochimetaru 4/16/2024 2:59 PM
いや〜そう思って試したんですが、04-17は1.0.2から1コミット伸びてるんですよ
2:59 PM
また、04-16と1.0.2は同じコミットです。(↑のSSでも写り込んでます)
Avatar
Avatar
Yuta Saito
gitのコミットってどうやって順序付けるんだろう
omochimetaru 4/16/2024 3:02 PM
有向グラフは半順序で順序付けできるので順序付けできない組があるね
Avatar
Avatar
kebo
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
omochimetaru 4/16/2024 3:03 PM
swift-formatは望ましい状態ですね、どうやってるか見てみます
3:07 PM
リリースプロセスが不明だ・・・
Avatar
Avatar
omochimetaru
swift-formatは望ましい状態ですね、どうやってるか見てみます
望ましい状況ではないですよ. swift-syntax が Swift 実装になって以降は,509.0.0 までは swift-syntax のバージョンに合わせたバージョン番号になっていたんですが,Swift 6.0 からツールチェーンに同梱されるようになったので,5.10 向けのバージョンではツールチェーンのリリースタイミングで release/5.10 branch から swift-5.10-RELEASE のタグが打たれたんですが,それが初めてなので release/5.10 branch の準備ができていなくて 509.0.0 では含まれていたいろんな変更を cherry-pick し忘れられていて,それを解決するためにそのあと打たれた 510.0.0 でも関係者間の連携が取れていなくてまだ cherry-pick し忘れられていて,ようやく方針が定まって打たれたのが 510.1.0 という感じです.なので main から cherry-pick されている分コミットが進んでいる 509.0.0 の方が 510.0.0 より前に作られたのに上にあるという面白い状況になってます. (edited)
3:15 PM
(そしてよく見たらタグを打ったコミットの日時で並んでいました)
Avatar
omochimetaru 4/16/2024 3:18 PM
本当だ。バージョンとRELEASEが混ざって並んでいるので、名前順を避けられていると思ったけど、その中の順番は変ですね。
Avatar
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker --stack-first \ -Xlinker --global-base=1048576 \ -Xlinker -z -Xlinker stack-size=1048576 この辺のパラメータ、 -Xswiftc とか -XlinkerPackage.swift に書くことができるけど、 --experimental-swift-sdk wasm32-unknown-wasi は書けないですよね?
12:55 AM
適切なsdkを選ぶのは $ swift build を使う人の責任、という設計は正しいんだろうか? これwasmというよりswiftpm cliの設計の話かな
12:57 AM
例えばSwiftPM Packageとして iOSアプリを作るとして(できないけど)
12:57 AM
パッケージが対象とするプラットフォームはもう決まってるから、 Package.swift で宣言できるのが正しい気がする
Avatar
iOSでもsimulator向けかどうか、armかx86かみたいな択がありませんか?
1:21 AM
いまってその指定はPackage.swiftにはなくてビルド時にフラグ渡してるので、それと同じ指定に感じてました
Avatar
omochimetaru 4/17/2024 1:38 AM
たしかにXcodeだとdestinationを選ぶUIになってますね その部分と似てますね
1:40 AM
Xcodeならguiから選択肢を選ぶから簡単だし、前回の値が残ってるから作業も再開しやすいが、
1:40 AM
cuiでこのwasmのやつを選ぶ(というか覚えてないといけない)のが難しいのが嫌だな (edited)
Avatar
ラップしたスクリプトに埋め込んでるなぁ
Avatar
Avatar
omochimetaru
cuiでこのwasmのやつを選ぶ(というか覚えてないといけない)のが難しいのが嫌だな (edited)
stabilize されれば -swift-sdk で短くなりますがそれでもだめですかね?
2:59 AM
CLI ツールを作ってるとホスト環境向けにも Wasm 向けにもビルドするのでむしろ固定しないほうが便利だったりします
👀 1
Avatar
Avatar
kebo
stabilize されれば -swift-sdk で短くなりますがそれでもだめですかね?
omochimetaru 4/17/2024 2:59 AM
そこは嬉しいけどどっちかというとその後ろに書くトリプルがつらいですね、覚えられません
3:00 AM
たしかにそもそもクロスプラットフォームなプロジェクトの場合は自然か
Avatar
クロスプラットフォームに対応しないプロジェクトが大半なのは分かる。分かるが、、
Avatar
omochimetaru 4/17/2024 3:02 AM
PackageにdefaultSDK: “wasm32-unknown-wasi”が書ける、ぐらいだとどうかなー (edited)
Avatar
んー、パッケージの設定では無いと思うんだよなぁ。依存パッケージにそれが書かれてても無視されて欲しいのとかを考えると。 (edited)
Avatar
omochimetaru 4/17/2024 3:04 AM
ターゲットの設定?
Avatar
いや、プロジェクトの設定かな
3:05 AM
ユーザがswiftpmコマンドを叩く単位
Avatar
omochimetaru 4/17/2024 3:06 AM
.swift-versionみたいな?
Avatar
みたいな
Avatar
omochimetaru 4/17/2024 3:06 AM
.swift-sdk
3:06 AM
なんかもっと色々書きたいよな。
Avatar
例えばEmbeddedターゲットビルドで成果物のダイナミックライブラリの拡張子をコントロールをしたい、とか細々した話もあって
3:08 AM
そういうプロジェクト固有の設定を記述できる機能があってもいいなと思ってます
Avatar
omochimetaru 4/17/2024 3:08 AM
なるほど。 でもそれはsdkを選んだら決まるとちょうど良さそう?
Avatar
Swift SDKじゃなくてターゲットトリプルなんですよね
3:10 AM
で、ターゲットトリプルだけでも正確には足りなくて
Avatar
omochimetaru 4/17/2024 3:10 AM
ふむふむ
Avatar
none OSに対してどの拡張子を使うべきかって一意に決まらないんですよ
Avatar
omochimetaru 4/17/2024 3:10 AM
sdkを選ぶときにトリプルを指定してるけど違う概念なのか
3:11 AM
noneOSなるほど
Avatar
ああそこは正確には違う概念ですね
Avatar
omochimetaru 4/17/2024 3:11 AM
マジで難しい
Avatar
--experimental-swift-sdkにはArtifact IDが指定できて
Avatar
omochimetaru 4/17/2024 3:11 AM
object formatはしらんけど標準ライブラリは提供できる、という状態があるのか。。
Avatar
ターゲットトリプルを指定できるのはあくまでショートハンド
naruhodo 1
Avatar
omochimetaru 4/17/2024 3:13 AM
(長いショートハンドだなあ…
Avatar
複数のSwift SDKがそのトリプルをサポートしてる場合曖昧になって警告出る
Avatar
omochimetaru 4/17/2024 3:13 AM
なるほど、それはよく出来てるな
3:13 AM
そうするとインストール環境によってはトリプルでは不適切だったりするわけか
3:14 AM
この設定はマシン依存なのか・・・
Avatar
しかも一つのSwift SDK自体は複数のトリプルをサポートできるので、本当に一意に決めるにはトリプルとArtifact IDが指定できるべきなんだけど実装が追いついてない
Avatar
omochimetaru 4/17/2024 3:15 AM
いや難しいな 曖昧な場合にデフォルトではこっち、みたいな概念があった方が良さそうな気もする そうするとプロジェクト設定として共有してうまくいきそう
Avatar
Avatar
Yuta Saito
しかも一つのSwift SDK自体は複数のトリプルをサポートできるので、本当に一意に決めるにはトリプルとArtifact IDが指定できるべきなんだけど実装が追いついてない
omochimetaru 4/17/2024 3:15 AM
www
3:16 AM
トリプルかぶりのsdkを2つ入れたら詰むのか?指定できない
3:17 AM
トリプル複数持ってて被ってるSDKが複数あると詰む
👀 1
3:18 AM
なのでwasm32-known-wasiとwasm32-unknown-wasip1-threadsのSDKは分けて配布することにした
naruhodo 1
3:19 AM
しかしこの設定ファイル、targetとtarget-dirでtargetの意味が変わるの難しいな。
Avatar
omochimetaru 4/17/2024 3:19 AM
(歯医者にきた
🦷 1
Avatar
SwiftPMもモジュール単位にtargetを使っちゃったからややこしいことになってるけど。
Avatar
Avatar
omochimetaru
トリプルかぶりのsdkを2つ入れたら詰むのか?指定できない
swift experimental-sdk list で出てくる文字列をコピペすれば衝突しないですよ.私は大体複数入れてるのでいつもそれで回避してます.そう言う意味では実は出てきたものをそのまま入力すればよくてトリプルを覚える必要は必ずしもないですね.
naruhodo 1
4:28 AM
ショートハンドとして指定できるトリプルも実は —triple と微妙に仕様が違うのが厄介で例えば wasm32-wasi とかの省略した指定が —experimental-swift-sdk の方だとできないみたいな違いがあったような記憶があります
Avatar
(上の例は省略できるのが none と unknown を勘違いして書いてたかもしれないですが,wasm32-unknown-wasip1-threads が使える使えないとか他のところでも違いがあった記憶が)
Avatar
omochimetaru 4/17/2024 4:23 PM
https://github.com/swiftwasm/carton/pull/428 cartonのJSをTSにするパッチを投げた 根回し全くしてないけど 手元で勝手にTS化したのでそのついで
entrypointのスクリプトはcartonのために作られていますが、 cartonを使わない構成においても再利用しやすいと便利です。 例えば、僕が作っているライブラリの開発においては、 cartonを使わないユーザと使うユーザの両方に対応するために、 それぞれの構成をテストしています。 前者において、cartonのentrypointと重複した作業が生じるので、 スクリプトを再利用したく...
4:24 PM
ここ1年ぐらい家庭くんしかメジャーなコミットしてなさそうだったから日本語
Avatar
マージしました
Avatar
omochimetaru 4/17/2024 4:37 PM
はや
4:38 PM
取り回しやすいからJSにしておきたいとかもあんのかなと思った
Avatar
すでにバンドラーでバンドルしないといけないんでまあ取りまわしやすさは変わらないかなと
4:42 PM
他で使うのであればパッケージとして切り出した方が良いのだろうか
Avatar
omochimetaru 4/17/2024 4:42 PM
// @ts-ignore 外したいんだけどしばらく色々やったけどダメだったんだよなあ .mjs 周りとかはめんどくさい事になっとるなと思った (edited)
Avatar
結局ダイナミックにロードしてる時点でその辺は気持ち程度の安全性しか無いんでw
Avatar
Avatar
Yuta Saito
他で使うのであればパッケージとして切り出した方が良いのだろうか
omochimetaru 4/17/2024 4:43 PM
パッケージになってたら嬉しいけどJavaScriptKitもパッケージになってて欲しいんだよね
4:44 PM
でもそうするとSwift側のJavaScriptKitと、JS側のJavaScriptKitのバージョンを同期させる機構がないのが微妙だなと思っている (edited)
4:44 PM
JavaScriptKitのSwiftPMのリソースバンドルを配布させる現状のアプローチだとそこが同期取れるメリットがあるよね (edited)
Avatar
うむ。昔はnpmにもpublishしてたけどリソース含められるようになってからやめた。
Avatar
omochimetaru 4/17/2024 4:45 PM
Avatar
やはりcartonにSwiftPM packageからnpmパッケージを作る機能があると良いのではないか
Avatar
omochimetaru 4/17/2024 4:45 PM
今手元のcarton無し構成だとこうなってて
4:46 PM
JavaScriptKitとcartonのWasmRunnerを全部いっぺんに型チェック&バンドルしてる
4:46 PM
load.tsentrypoint/bundle.js だったもので
4:47 PM
WasmRunner.tsentrypoint/common.js だったものね
4:47 PM
エントリポイントのHTMLが load.ts 経由で .wasm を渡して起動する
4:47 PM
(元のbundle.js とかは .wasm の名前がコードに焼かれてるけど、そこをパラメータ化している) (edited)
4:51 PM
JavaScriptKitのバージョンがズレうる問題はあるけど、JavaScript側のスタックとしてはこれが綺麗だと思う
4:52 PM
4:53 PM
こうするとvitejsが HTMLの script タグでインラインに書いてあったスクリプトをもう一回巻き上げてくれる。(src参照にすり替わってる) (edited)
Avatar
これはJavaScriptKitのRuntimeはTypeScriptでないとだめ?
4:57 PM
ESM + .d.tsでもいい?
Avatar
omochimetaru 4/17/2024 4:59 PM
編集しないから .js (sourcemap付き) と .d.ts だったら本質的に同じはず (edited)
5:00 PM
C言語で言うと foo.tsfoo.c + foo.h で、 foo.jslibfoo.a で、 foo.d.tsfoo.h という認識 (edited)
5:03 PM
Swiftでいうと libfoo.dyliblibfoo.swiftinterface もあった
Avatar
omochimetaru 4/17/2024 5:29 PM
お。よかった
Avatar
Avatar
Yuta Saito
まずSwiftPMのビルドシステムがクロスコンパイル+マクロに対応しきれてないのでそれを直す必要があって、、 (edited)
これは直せたという理解で合ってますかね…? https://github.com/apple/swift-package-manager/pull/7353 (edited)
Reverts #7352. Modified to build tests for the host triple when any macros are added to test modules directly as dependencies.
Avatar
なおってるはず…!
t_yatta 1
Avatar
vitejsが賢くてなんかwasmをリビルドしたらホットリロードできてウケる
Avatar
omochimetaru 4/18/2024 1:01 PM
うーん謎だ
1:01 PM
wasmでビルドした後に、同じ場所でmacでビルドすると
1:01 PM
このようになって壊れるが
1:01 PM
必ず壊れるわけでもない
Avatar
何日のSwiftPMですか?
Avatar
omochimetaru 4/18/2024 1:13 PM
[omochi@omochi-mbp BrowserTests (add-brtest =)]$ echo $TOOLCHAINS org.swift.59202404021a 4/2
1:15 PM
てか、かなりおかしくて、
1:15 PM
sleepの後の swift build は、mac対象のはずなのに、 .build/wasm32-unknown-wasi がどうのこうのと出る (edited)
Avatar
2番目のswift buildに --disable-build-manifest-caching つけるとどうですか
1:18 PM
disableしないといけない状況は明らかにおかしいんだけど。
1:18 PM
ターゲットトリプルが変わってるのにビルドプランが組み直されてないんですよね。
Avatar
omochimetaru 4/18/2024 1:19 PM
お、今、 WASM build 成功 mac build 成功 WASM build 成功 mac build このエラーで死亡 となった
Avatar
必ず壊れるわけでないのが意味わからないんだよな
Avatar
Avatar
Yuta Saito
2番目のswift buildに --disable-build-manifest-caching つけるとどうですか
omochimetaru 4/18/2024 1:19 PM
ちょい待ってね 壊れ方を確定させないと、効果が測定できない
1:19 PM
rm .build から
1:20 PM
wasm ok, mac ok, wasm ok, mac ok, wasm ok, mac -> ERROR
1:20 PM
今回は3週目で壊れたな
1:21 PM
もう一回やってみよう
1:21 PM
あ、同じだ
1:21 PM
rm -rf, wasm, mac, wasm, mac, wasm, mac -> ERROR
1:22 PM
一度壊れたらもうmacは毎回死ぬから
1:22 PM
ここでオプションをつけてみる
1:22 PM
お〜直った!!
1:23 PM
あ、よく見たら、wasm側のコマンドには最初から --disable-build-manifest-caching \ がついていた
1:23 PM
家庭くんが教えてくれたやつ
1:23 PM
だから必ずmacの方だけ壊れるのか
Avatar
おそらくそれが無いと2回目のwasmで死ぬのでは
Avatar
omochimetaru 4/18/2024 1:23 PM
両方から外して最初からやってみるか
1:24 PM
rm -rf, wasm ok, mac ok, wasm ok, mac ok, wasm ERROR!
1:25 PM
3回目のwasmで死ぬ、wasmもmacも2回は通る
1:25 PM
これ、1回目はコンパイルが発生していて
1:25 PM
2回目は変更チェックが効いてすぐ終わるから
1:25 PM
変更チェックが効いた時の挙動で壊れた状態になって
1:25 PM
3回目で発症してる気がする
Avatar
2回目と3回目の差がわからないなぁ
Avatar
omochimetaru 4/18/2024 1:26 PM
[omochi@omochi-mbp BrowserTests (add-brtest *=)]$ bin/build + swift build --experimental-swift-sdk wasm32-unknown-wasi -Xswiftc -static-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv -Xlinker --stack-first -Xlinker --global-base=1048576 -Xlinker -z -Xlinker stack-size=1048576 warning: 'browsertests': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/Sources/QSDisplayingData/styles.css warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... [1/1] Write swift-version-37CF2ABA3CB73B3C.txt Build complete! (0.18s) + swift build warning: 'browsertests': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/Sources/QSDisplayingData/styles.css warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... [1/1] Write swift-version-37CF2ABA3CB73B3C.txt Build complete! (0.19s)
1:26 PM
2回目で出てくるこの Write swift-version-37CF2ABA3CB73B3C.txt
1:26 PM
wasmとmacで同じ番号なのが怪しい
1:27 PM
1回目は Write swift-version-37CF2ABA3CB73B3C.txt ってメッセージがない
Avatar
--jobs 1 --verbose でログ取って比較してみてください
Avatar
omochimetaru 4/18/2024 1:27 PM
なるほど
Avatar
swift-version-XXXXはコンパイラ実行ファイルパスのハッシュ値なので同じで大丈夫
😀 1
Avatar
omochimetaru 4/18/2024 1:34 PM
??
Avatar
Avatar
Yuta Saito
--jobs 1 --verbose でログ取って比較してみてください
omochimetaru 4/18/2024 1:35 PM
これつけると一発目のwasmが通らなくなる
Avatar
???????
Avatar
omochimetaru 4/18/2024 1:35 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --jobs 1 --verbose \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ -Xlinker --stack-first \ -Xlinker --global-base=1048576 \ -Xlinker -z -Xlinker stack-size=1048576
1:35 PM
jobs と verboseってこの場所でもいい?
Avatar
いいはず
Avatar
omochimetaru 4/18/2024 1:36 PM
1.44 MB
1:37 PM
このように、wasm-ldが大量のundefined symbolを吐いて死ぬ
1:38 PM
1:38 PM
jobs 2 にしたら通った
Avatar
それも発症情報もらってるんだけどよく分かってない https://github.com/swiftwasm/swift/issues/5580
Steps to reproduce: Create a new package with swift package init --type executable Add JavaScriptKit as a dependency. My Package.swift file is as follows: // swift-tools-version: 5.9 // The swift-t...
Avatar
omochimetaru 4/18/2024 1:38 PM
並列だと壊れるならわかるんだけど
1:38 PM
1列にすると壊れるってなんだw
Avatar
autolink情報がなぜか足りてない
1:39 PM
多分依存エッジが足りてないんだろう (edited)
Avatar
omochimetaru 4/18/2024 1:39 PM
並列の時とそうでない時でちょっと動作が違うんかな?
1:40 PM
並列でも動くように何かが緩いロジックに変わるみたいな
1:40 PM
それで本来不適切な構成になってるんだけど許されてしまう
Avatar
とりあえずワークアラウンド Workaround: Add import _RegexParser in a Swift file.
Avatar
omochimetaru 4/18/2024 1:40 PM
1:40 PM
やってみる
1:41 PM
import文からmoduleのautolink情報が焼かれるのか
1:42 PM
1:42 PM
なんかやる必要あるんだっけ?
1:42 PM
お、CLI (wasm) は通った (edited)
Avatar
Xcodeはしらない
Avatar
omochimetaru 4/18/2024 1:43 PM
Xcodeは謎の状態だ
1:44 PM
まずjobs1の状態で
1:44 PM
問題の再現を確認します
Avatar
omochimetaru 4/18/2024 1:45 PM
あ〜なんか、同じになっちゃいそうだね
Avatar
ターゲットトリプルを変えたとき、llbuild上のコマンドのシグネチャをチェックするんですがおそらく最初の1/3くらいのバイト列だけが変わってて、後半完全に同じになりそうで
Avatar
omochimetaru 4/18/2024 1:47 PM
(エラー出力がリダイレクト取れてねえ・・・やり直す)
Avatar
llbuildの実装によっては衝突しかねないなと (edited)
Avatar
omochimetaru 4/18/2024 1:51 PM
取れたぞ
1:51 PM
ビルドコマンド
417 bytes
1:51 PM
rm -rf .build した後の1週目
2.08 MB
1:51 PM
2週目 (キャッシュが効いてすぐ終わる)
1.66 KB
1:52 PM
3週目 (エラーでてすぐ止まる)
3.88 KB
1:53 PM
2週目が --verbose なのにほぼ何も出ないんだよな でも3週目で必ず死ぬから2週目で起きた副作用が問題っぽいけど
1:54 PM
あー1週目にも Write auxiliary file /Users/omochi/github/omochi/swift-react/BrowserTests/.build/arm64-apple-macosx/debug/swift-version-37CF2ABA3CB73B3C.txt こいつはいた
1:54 PM
[omochi@omochi-mbp BrowserTests (add-brtest *%=)]$ cat .build/debug/swift-version-37CF2ABA3CB73B3C.txt Apple Swift version 6.0-dev (LLVM 3dd3bce1adb5b65, Swift 1f09be97a890c3e) Target: arm64-apple-macosx14.0 中身ただのバージョンだった
1:56 PM
Xcodeはtoolchainを切り替えて4/2版にすれば import _RegexBuilder が書いてあっても大丈夫になった
Avatar
ああXcodeのツールチェイン選んでたのか
Avatar
omochimetaru 4/18/2024 1:57 PM
はい Xcodeのツールチェイン切り替えモードはなんか不安定だからギリギリまで避けてた
1:57 PM
どうせXcodeからWASM向けビルドはしないからそれでよかった。 (edited)
Avatar
正しい判断だ
Avatar
omochimetaru 4/18/2024 1:57 PM
あと import _RegexBuilder って普通にできてたと思う・・・
Avatar
Avatar
Yuta Saito
--jobs 1 --verbose でログ取って比較してみてください
omochimetaru 4/18/2024 1:59 PM
結局2週目と1週目の差分で怪しい部分は見つけられなかった。
1:59 PM
というか2週目の内容が少なすぎて探すまでもない。
Avatar
ビルドディレクトリ以下を全部アーカイブしておくと色んな情報が残ってるはず (edited)
Avatar
omochimetaru 4/18/2024 2:00 PM
確かに
2:00 PM
全部複製してdiffしたらいいのか
2:00 PM
2回目の犯罪行為がわかる
Avatar
とくに .build/debug.ymlの差分が気になる
Avatar
omochimetaru 4/18/2024 2:01 PM
やってみる
2:04 PM
[omochi@omochi-mbp BrowserTests (add-brtest *%=)]$ diff -r .build .build1 Binary files .build/arm64-apple-macosx/build.db and .build1/arm64-apple-macosx/build.db differ Binary files .build/wasm32-unknown-wasi/build.db and .build1/wasm32-unknown-wasi/build.db differ
2:05 PM
@Yuta Saito 謎のバイナリだけ違うって
Avatar
sqliteっすね
Avatar
omochimetaru 4/18/2024 2:05 PM
・・・
2:05 PM
見に行くか・・・
Avatar
お、Linuxでも再現した
Avatar
omochimetaru 4/18/2024 2:06 PM
Avatar
手元のSonomaだと最新のスナップショット壊れてて再現難しかった
2:08 PM
ここまで再現できればプリントデバッグできるな
Avatar
omochimetaru 4/18/2024 2:10 PM
5.48 KB
2:10 PM
WASMの方の1週目と2週目のSQLiteの中身をCSVでダンプしたもののdiffを撮った
2:11 PM
なんもわからんな あーこれカラムがbinaryあるのか
2:11 PM
CSVにしたら壊れちゃった
Avatar
おそらくそれがシグネチャかな
Avatar
omochimetaru 4/18/2024 2:12 PM
2:12 PM
valueとdependenciesがBLOB
Avatar
あれsignatureってintegerなんだ
Avatar
omochimetaru 4/18/2024 2:13 PM
2:13 PM
同じ値が多い
2:13 PM
全部同じってわけではない
Avatar
1回目のビルドで PackageStructureCommand.getSignatureが呼ばれてない
Avatar
omochimetaru 4/18/2024 2:24 PM
2:24 PM
signature = 0 のこと?
Avatar
おそらく呼ばれない場合0にすらならず PackageStructureターゲットのレコードが残らないはず
Avatar
omochimetaru 4/18/2024 2:28 PM
なるほど
2:29 PM
それだいぶやばそう
Avatar
一回目のビルドログ
678.69 KB
809.09 KB
2:29 PM
PackageStructureCommand signature: XXX bytes という行があればシグネチャが計算されてる
2:29 PM
2回目のビルド
502 bytes
497 bytes
2:30 PM
3回目
Avatar
omochimetaru 4/18/2024 2:31 PM
僕のログそれ出たことないな
Avatar
3回目でgetSignatureが返すシグネチャは変わってるけど "Planning build"が出ないのがおかしいな
Avatar
omochimetaru 4/18/2024 2:32 PM
あ、違う、これprintdebugかw
Avatar
プリント仕込み始めたw
Avatar
omochimetaru 4/18/2024 2:33 PM
2回目のwasmのシグネチャと、3回目のlinuxのシグネチャが同じ9237 bytesなのが気になるね
Avatar
3回目はwasmなので同じでOK
Avatar
omochimetaru 4/18/2024 2:34 PM
ああ、エラーログが何故かlinuxのパスなだけか
Avatar
シグネチャをbase64でエンコードした (edited)
Avatar
Avatar
Yuta Saito
シグネチャをbase64でエンコードした (edited)
omochimetaru 4/18/2024 2:36 PM
これ普通にデコードしたら結構テキスト出てくるね
2:37 PM
Avatar
BuildParameterをJSONにしただけかな
Avatar
omochimetaru 4/18/2024 2:37 PM
final class PackageStructureCommand: CustomLLBuildCommand { override func getSignature(_: SPMLLBuild.Command) -> [UInt8] { let encoder = JSONEncoder.makeWithDefaults() // Include build parameters and process env in the signature. var hash = Data() hash += try! encoder.encode(self.context.productsBuildParameters) hash += try! encoder.encode(self.context.toolsBuildParameters) hash += try! encoder.encode(ProcessEnv.vars) return [UInt8](hash) }
2:37 PM
これみる限りJSONが3個入ってるだけやな
2:38 PM
キーの順番もソートされてるっぽいから、diff取れそうだ
Avatar
llbuildレベルでもシグネチャは変わってることが確認できた
Avatar
omochimetaru 4/18/2024 2:55 PM
あれ
2:55 PM
じゃあ違うはずのシグネチャが同じになって混ざる説はハズレ?
Avatar
ハズレっぽい
2:58 PM
あー分かった気がする
Avatar
omochimetaru 4/18/2024 2:59 PM
Avatar
1回目のビルドではhost/wasm共に PackageStructure ターゲットのビルドがトリガーされないのでシグネチャがbuild.dbに記録されない。 (edited)
3:00 PM
2回目のビルドでは .build/debug.yml ファイルが存在するので PackageStructure ターゲットのビルドをトリガーしてビルドパラメータに更新があるかチェックする。ただし1回目でこのターゲットをビルドしてないので常に更新がある判定になるので .build/debug.ymlを作り直す。 (edited)
3:02 PM
ここでhost/wasm共に build.db にシグネチャが記録される。
3:05 PM
3回目のwasmビルドでも .build/debug.yml ファイルが存在するのでPackageStructure ターゲットのビルドをトリガーして更新チェックする。 直前にhostビルドをしているので debug.ymlはhostの状態。ただしbuild.dbにはシグネチャが記録されておりビルド済み判定になり、debug.ymlを作り直さずにビルドを開始する。(本来は2回目のwasmビルドの時点のdebug.ymlに書き戻すべき。)
3:06 PM
これなら3回目で失敗する説明が付く (edited)
3:08 PM
書き戻すと言うか2回目のwasm, hostのhostの時点でwasmのシグネチャをinvalidateするべきでは
Avatar
omochimetaru 4/18/2024 3:08 PM
シグネチャの一致はターゲットごとのDBの中身と比べてるけど
3:08 PM
シグネチャが一致した時に再利用するパラメータは、ターゲット関係ないところに置いてある .build/debug.yml を参照するってこと?? (edited)
Avatar
はい
Avatar
omochimetaru 4/18/2024 3:08 PM
設計
3:09 PM
破綻しとる
3:09 PM
1回目云々の話は別のバグで
3:09 PM
仮にそれがなおっても単に問題が3回目じゃなくて2回目に起きるようになるだけってことかな (edited)
Avatar
そうですね
3:10 PM
はあ
Avatar
omochimetaru 4/18/2024 3:10 PM
2つの壊れがあったのか
3:11 PM
.build/debug.yml なんてものが存在しているのがおかしくて
3:11 PM
.build/arm64-apple-macosx/debug.yml.build/wasm32-unknown-wasi/debug.yml
3:11 PM
別々に管理するべきってことか?
Avatar
いや、.build/debug.ymlがあるのは良い
3:12 PM
ターゲットトリプルでディレクトリ切ったところで同じトリプルの中でのバリエーションがあるので意味ない
naruhodo 1
3:13 PM
間違ってるのは1度でもシグネチャAでビルドが成功しており前回のシグネチャがBだった場合に、コマンドシグネチャAが来てもリビルドしないことか (edited)
3:17 PM
えー、本当にそんな事あるか?
Avatar
omochimetaru 4/18/2024 3:17 PM
設計がおかしすぎるようにしか見えん・・・ (edited)
Avatar
このターゲットは若干特殊で
3:18 PM
普通のファイルタイムスタンプベースなら単調に値が増えていくので、2つ以上前の状態に戻ることはないんだけど
3:19 PM
この ExternalCommand というやつは自分でシグネチャを決めるのでそういうことが起きる
Avatar
omochimetaru 4/18/2024 3:21 PM
.build/debug.yml を再利用していいかどうかの問合せロジックにおいて、 問い合わせる先のデータベースがパラメータによって変わって、 データベースは自分が使われた時の知識しか持ってないから、 再利用できるっていう結果を返すけど、 実際には別の構成のために書き換わった状態になってるので壊れる・・・?
3:21 PM
.build/debug.yml が書き換わるタイミングのシグネチャを常に記録してるシングルトンなデータベースがいないとやりたいことがやれないように思う
3:22 PM
llbuildのtaskとして色々組み立てたらいつの間にかそういうロジック構造になってしまっていたみたいな感じで
3:22 PM
局所的な実装してる時にはおかしな全体像が見えにくい話なのかな (edited)
Avatar
あ、そうかデータベースが分かれてるのか
3:23 PM
だめじゃん -rw-r--r-- 1 katei katei 204800 Apr 18 14:53 .build/wasm32-unknown-wasi/build.db -rw-r--r-- 1 katei katei 172032 Apr 18 14:54 .build/x86_64-unknown-linux-gnu/build.db (edited)
Avatar
omochimetaru 4/18/2024 3:24 PM
そうそう。
3:24 PM
そういう話だよね?w
3:24 PM
ここだけ切り取るとおかしすぎて何がどうミスったのかよくわかんないな・・・
3:25 PM
このDBが別れてることにはきっと本来的な設計意図が別にあるんだろうな
Avatar
データベースはシングルトンだけどなぜか前回の状態を無視してキャッシュヒットしてるんだと思ってた
3:25 PM
データベースが分かれてるなら"なぜか"の部分が解消されるな
Avatar
omochimetaru 4/18/2024 3:26 PM
このデータベースがさ、別れてるのが仮に正しいとしても、 分け方がトリプルごとなのはいいのかね?
ターゲットトリプルでディレクトリ切ったところで同じトリプルの中でのバリエーションがあるので意味ない
↑これになりそう
Avatar
分けるべきではない
Avatar
omochimetaru 4/18/2024 3:27 PM
シングルトンなデータベースにして、トリプルやバリエーション違いの情報もちゃんとDBの中で混ざらないようにテーブル設計して全部集約するのが
3:27 PM
自然な設計の話に見えますね
Avatar
昔からデータベース分かれてましたっけ
Avatar
omochimetaru 4/18/2024 3:29 PM
僕はこのsqliteの存在をさっき知ったので何もわからん
Avatar
5.8見てみよう
Avatar
omochimetaru 4/18/2024 3:30 PM
ツールチェーン切り替えて試せばいいだけか。
Avatar
あー、昔からっぽいなー
3:32 PM
最近のMaxのtool/destinationのBuildParameters分離リファクタで壊れたわけでは無さそう
Avatar
Avatar
Yuta Saito
最近のMaxのtool/destinationのBuildParameters分離リファクタで壊れたわけでは無さそう
omochimetaru 4/18/2024 3:33 PM
俺もそれで筋間違えた説疑ってたw
Avatar
疑ってスマンな
🙇‍♂️ 1
Avatar
omochimetaru 4/18/2024 3:38 PM
1回目に PackageStructure が起動しない問題、DBが別れててシグネチャ判定が役に立たない問題、並列数が1だと _RegexBuilder が見つからない問題
3:38 PM
3つ踏んだ
Avatar
たくさん直す機会が得られてよかった
Avatar
omochimetaru 4/18/2024 3:39 PM
なんか確かにこれまでも
3:39 PM
mac と linuxで重ねるといろいろ壊れてはいた
3:40 PM
が、まあそんなもんかな、だったのでスルーしてたけど、wasmとmacは重ねて使いたいね
Avatar
直せた
Avatar
omochimetaru 4/18/2024 3:46 PM
えっはや
Avatar
若干切替時のキャッシュヒットが劣化してしまったけど
Avatar
omochimetaru 4/18/2024 3:49 PM
マジで共通にしただけだ
3:49 PM
元々別れていたものを雑にくっつけたら他の問題が起きないんか? (edited)
Avatar
とりあえずビルドは通ってるけど流石にもう少し真面目にテストしないといけないですねぇ
Avatar
omochimetaru 4/18/2024 3:50 PM
dbの中身がよくわかってないけど仕組み的には大丈夫そうなん?
Avatar
マージしてクリティカルに困るのって切り替え前のキャッシュを使ってしまうことだと思うんですけど
3:53 PM
マニフェストさえ正しく再生成されていればコマンドのシグネチャが切り変わるので、データベース上の切り替え前の記録にヒットすることはないはず
Avatar
omochimetaru 4/18/2024 3:53 PM
なるほど
Avatar
ただシグネチャが切り替わっていてもターゲットキーが重なってるので切り替えてビルドしたときに切り替え前のキャッシュが漏れなくinvalidateされてしまうので
3:54 PM
ターゲットキーのサフィックスにターゲットトリプル追加するのが良いかな
3:55 PM
もしくはマニフェストグローバルなキーが設定できると良いんだけど
Avatar
omochimetaru 4/18/2024 3:56 PM
あーこれそういう感じか
3:58 PM
key_id から key_name 引いたやつがNC みたいなコマンド種別+ファイルパスとかで、そういうKVSになっていて、これがmakefileのターゲットみたいなもんで ただエントリの有効性を signature で保護している (edited)
Avatar
そうそうMakefileとちがってコマンドの変化にセンシティブ
Avatar
omochimetaru 4/18/2024 3:59 PM
シグネチャはさっきの8000バイトぐらいのJSON3つ繋げた文字列から作ったハッシュってことかな (edited)
Avatar
さっきのやつはインプロセスで計算するルールだったのでそういう自分で作るハッシュなんですけど
4:00 PM
普通は実行するコマンドライン引数がハッシュになる
Avatar
omochimetaru 4/18/2024 4:00 PM
なるほど
4:01 PM
この ExternalCommand というやつは自分でシグネチャを決めるのでそういうことが起きる
自分で決めるというのはそういう意味か
Avatar
いやぁちょうど仕事でこの辺困ってたので原因判明してよかった
Avatar
omochimetaru 4/18/2024 4:05 PM
お〜そうか、Swift WASM最前線だとそうなるのか
Avatar
12:59 PM
ボタンクリックしたらイベントハンドラが消えてた
1:00 PM
1:00 PM
この前のfuncのブリッジを変えたやつがダメだった件を踏んでいるかな
1:01 PM
いや、違うな、チェックアウトしてるのはrevert済みの版だ
1:02 PM
あ〜
1:02 PM
mainを抜けたらローカル変数が消えただけかなこれ
1:05 PM
あー動いた動いた 何でもない
1:05 PM
グローバル変数にrootオブジェクトを入れたら大丈夫になった
Avatar
Thanks for the help! After resolving a few other issues that I ran into with JavaScriptKit and stuff, I finally managed to get an online playground working 🎉 I faced a few different issues while trying to get this working, if any of these aren't already known I'd be happy to split them out into separate topics or GitHub issues. Hiccups My fir...
👍 1
Avatar
omochimetaru 4/22/2024 1:02 AM
StackOttersさんがGalahという言語をSwiftで作ってそのプレイグラウンドをwasmで動かしたのか。いいね。
Avatar
あ〜〜〜〜
12:45 PM
cartonおまかせでビルドの構成だとSwift 5.9.2 だから variadic generics が使えな〜い
12:48 PM
WebAssembly support for the Swift programming language - swiftwasm/swift
12:48 PM
swiftwasm/swift には 5.10 の development snapshot は供給されているけど 5.10-RELEASE は無い?ここは手動なのかな
12:49 PM
ここにあればcarton側のアップデートは簡単そうだと思ったが
12:49 PM
こっちは難しそうだ
12:51 PM
なんか設定は入ってそうだ
12:58 PM
WebAssembly support for the Swift programming language - Manual distribution · swiftwasm/swift@691cfdf
1:01 PM
これはやってもらうしかなさそうだなあ
1:02 PM
ん?
1:02 PM
parameter packは5.9からじゃん
Avatar
関数のpackが5.9で、10から型へのpackですね
1:08 PM
だから5.9はcallAsFunctionのシグネチャーにはエラーでてない
Avatar
Avatar
Iceman
関数のpackが5.9で、10から型へのpackですね
omochimetaru 4/22/2024 1:08 PM
Avatar
あーたぶんこれですね
Avatar
omochimetaru 4/22/2024 1:09 PM
Status: Implemented (Swift 5.9)
うそか?
Avatar
5.9implementって書いてあるけど嘘じゃないかなぁ
Avatar
omochimetaru 4/22/2024 1:09 PM
え〜〜
Avatar
5.10はアップストリームから5.10.1のビルドが提供されるまでリリース待とうと思ってます。どうしてもリリースされなければこっちでSwiftPMのパッチ入りビルド提供します (edited)
Avatar
omochimetaru 4/22/2024 3:41 PM
ほうほう。 それはこの修正を入れたいから? https://github.com/apple/swift-package-manager/pull/7471 (edited)
Motivation: The build database should be shared between different triple builds to re-generate the build manifest correctly. With the current implementation, the following build command sequence fa...
Avatar
そっちは全然いいんですけどテストランナーのクリティカルなバグがあって
Avatar
omochimetaru 4/22/2024 3:43 PM
マジかw
Avatar
チェリーピックしてリリースブランチには入ってるんですけど、5.10のスナップショットがアップストリームの方でずっと止まってるんですよね
3:45 PM
🍒 #7341 Explanation: swift build --build-tests fails on WASI after the experimental summary output, which is introduced in 5.10. This affects not only experimental-summary mode but also the defau...
Avatar
omochimetaru 4/22/2024 3:46 PM
なるほど
3:47 PM
flockなくてビルドできなくて・・・?ん?
3:47 PM
これはswiftpmコマンドそのもののソースコードだけど
3:47 PM
困ることあるの?
Avatar
SwiftPMが生成するテストランナーコードがビルドできない
3:48 PM
これはコマンドそのもののソースじゃないんすよ
Avatar
omochimetaru 4/22/2024 3:48 PM
ほんとだ!w
3:49 PM
クソでかい トリプルクォートだw
3:49 PM
コードジェネレータに埋め込まれたテンプレート部分なのか。これはおしまいだ。
Avatar
オワタ
3:52 PM
6.0が出るまでに5.9.1が出なくて強い要望がなければ欠番でもいいかな
Avatar
omochimetaru 4/22/2024 3:53 PM
5.10.1 だよね? 5.9 は もう 5.9.2 まで出ている
Avatar
ああ5.10.1だ
🆗 1
Avatar
omochimetaru 4/22/2024 3:54 PM
とりあえずこうしといた
Avatar
omochimetaru 4/22/2024 3:56 PM
Wasmを使っている人を見ると、おっ分かってる人だなと思うので、「分かってる人」として見られたいときにオススメです。
マジ?見た事なかった
3:56 PM
A contraction of “WebAssembly”, not an acronym, hence not using all-caps.
3:57 PM
ほんとだ
3:57 PM
not using all-caps ってはっきり書かれてるw
3:58 PM
全部直しとこ
Avatar
まあ通じればなんでもいいんですけどね笑
Avatar
XCodeではなくXcode的な
👉 2
Avatar
omochimetaru 4/23/2024 3:03 AM
一昨日みずちさんと通話してて、かていくんと話した事とか話してたんだけど、記事が出た https://x.com/mizchi/status/1782602996108685486?s=46&t=x82HmLxu4d0JVtr__-b65Q
書いた。moonbit へのcomponent-model 対応のプロポーサルのために色々調べる過程でスタンドアロン wasm エコシステムの夢を見た https://t.co/UYp9znonza
Avatar
実現していくぞ
Avatar
この辺の詳細が気になってたりします.
悪い発想だと、メモリ境界チェックをサボる WebAssembly Runtime で高速化の余地が残されている?
Avatar
omochimetaru 4/23/2024 1:53 PM
1プロセス1Wasmじゃダメなんですかね?
Avatar
1 プロセス 1 Wasm が何のことをおっしゃっているのかはちょっと読み取れなかったですが,runtime を ring 0 のカーネル空間に実装してメモリ管理も Wasm に特化させれば限りなくネイティブに近い速度になったりするのかな?という意味で気になってました.(調べたら前例はあるっぽいので既にやり尽くされてる話かもしれないですが)
Avatar
一般的なOSを考えて、1つのプロセスの中に2つのwasm runtimeがあると、メモリアクセスでチェックをしないと隣のruntimeを読み書きできてしまうと思ったんですよね OSのメモリ保護で読み書きを設定する主体がプロセスなので。 であれば、1プロセスに1つのwasm runtimeしかなければ、OSのメモリ保護を自然とマッピングして再利用できるのかなと。 OSのメモリ保護が高速なのは、よく知らないですが、メモリコントローラに対して設定を行なって、違反時にハードウェア割り込みとかでOSに戻ってくるから?だと想像していて、範囲チェックのために汎用CPUのクロックを消費しなそう。 keboさんの書いてるのはプロセスとかOSの層も潰して無くしてしまう話ですよね、その方が良さそう。
Avatar
ああ,境界チェックってそういう意味で書いてあったんですね
Avatar
omochimetaru 4/24/2024 8:14 AM
mizchiさんとの会話はいろいろ発散していた(し、他の人もいた)ので、その文の正確なところは、わからないですが、おそらく。 (edited)
Avatar
@Yuta Saito wasmのswift sdkってコンパイラのスナップショットと同じ日付を使うべきですか?それとも一日後?
Avatar
基本的に1日後
11:22 AM
どのタグをベースにSDKが作られてるかはGitHubリリースのページに書いてあるんでそれと一致するバージョンを使ってもらえると
Avatar
なるほど。気が付いてなかった、確認します
Avatar
ああ〜ほんとだ。 apple/swift
Avatar
リポジトリを公開した https://github.com/omochi/swift-react
Contribute to omochi/swift-react development by creating an account on GitHub.
🎉 8
Avatar
try! Swiftで半分冗談で作ってくれないかなぁとお願いしたら本当に出来てしまった🥳
Avatar
omochimetaru 4/25/2024 1:25 PM
3年前ぐらいから誰か作ってくれと思ってたけど、自分で作るしかなかった
Avatar
うごいたうごいた
Avatar
omochimetaru 4/25/2024 3:15 PM
おお。いいね
3:15 PM
家庭くんが動かせなかったら誰も動かせないからまずは安心
Avatar
cssのパスがcarton devの期待するやつと違ってたけどそれ以外はスムーズに動きました https://github.com/omochi/swift-react/pull/88 (edited)
Avatar
omochimetaru 4/25/2024 3:20 PM
あ、CartonExampleの方やってくれたのか
3:22 PM
5.10使えるようになった?
Avatar
手元にあった DEVELOPMENT-SNAPSHOT-2024-04-12-aでやってました
3:24 PM
swift package --experimental-swift-sdk DEVELOPMENT-SNAPSHOT-2024-04-15-b-wasm32-unknown-wasi carton-dev これで
Avatar
omochimetaru 4/25/2024 3:25 PM
手元のツールチェーン + cartonの択もあるのか
3:26 PM
carton-dev ←ハイフンだっけ?
Avatar
SwiftPMプラグインは各サブコマンドで分かれてるのでハイフンが付く
Avatar
omochimetaru 4/25/2024 3:27 PM
あーrunの方じゃなくてpackageの方か
Avatar
runの方はそのうち消したいんですよねぇツールチェインインストーラは別のツールにやってほしい
Avatar
omochimetaru 4/25/2024 3:29 PM
3:29 PM
この辺に書いてあった
Avatar
Avatar
Yuta Saito
runの方はそのうち消したいんですよねぇツールチェインインストーラは別のツールにやってほしい
omochimetaru 4/25/2024 3:32 PM
その方が良さそう プラグインひとつにして内部でサブコマンドにすることもできるんだっけ?スペース区切りの方がオシャレで好み
Avatar
おしゃれなんだけど一つのプラグインにしてしまうと不必要な依存のビルドが発生するんですよねぇ。例えばbundleコマンドではHTTPサーバ使わないのにNIOをビルドすることになったり。
3:36 PM
現状全てのプラグインはCartonFrontendを叩くだけだから常に全部ビルドするんですけど、そのうちそれを細かく分けてビルドを最小限にしたいなと
Avatar
omochimetaru 4/25/2024 3:37 PM
むむむ、なるほど
Avatar
Avatar
Yuta Saito
swift package --experimental-swift-sdk DEVELOPMENT-SNAPSHOT-2024-04-15-b-wasm32-unknown-wasi carton-dev これで
真似してやってみたけど変なエラーが出てダメだった
18.77 KB
12:57 PM
なぜホームディレクトリに干渉してくる?(そしてパーミッションでブロックして助かった?
Avatar
お、macか
Avatar
そりゃあmacですわよ
Avatar
いい加減 ~/.carton/static作るの辞めさせよう
Avatar
omochimetaru 4/26/2024 1:00 PM
Linuxだとどうなるの?
Avatar
サンドボックス保護がないので書き込み成功!
Avatar
omochimetaru 4/26/2024 1:00 PM
www
1:01 PM
元々コマンドラインツールだったから、さもありなんだけど、swift package plugin として動かすなら、これはアカンね。
1:02 PM
CLIツールならよくある挙動だけど、複数のバージョンのcartonを使い分けようとしたりするときに不安だし、ユーザがcartonに対してマシンレベルで何かを設定したいニーズとかもなさそうだから、キャッシュとかの用途ならインストールローカルな場所でやってほしいわね (edited)
Avatar
そうなんですよねぇ
Avatar
swift package plugin として動かすから問題なのであれば,carton から swift sdk install を呼び出すのをやめて swift sdk install は requirement にして carton は SDK が存在するかチェックしてなければエラーを吐くくらいにとどめれば自然なんですかね?
Avatar
そんな感じですかねー
Avatar
Avatar
omochimetaru
そこは嬉しいけどどっちかというとその後ろに書くトリプルがつらいですね、覚えられません
そういえばサブコマンドやオプションから experimental を外して短くするのが merge されてました. https://github.com/apple/swift-package-manager/pull/7507
Since SE-0387 was accepted and available in Swift 5.9 and Swift 5.10, it's time to remove experimental prefix.
Avatar
お。いいですね これが乗ったスナップショットに乗り換えよう。
Avatar
まだ 04-26-a では乗ってなさそうです (edited)
Avatar
0427に期待
Avatar
0427 に来てますね
Avatar
omochimetaru 4/28/2024 2:26 PM
おっ
12:23 PM
swift 0427 と対応する swift-wasm 0428 のリリースに artifact bundle が無い
Avatar
ありますよ.host independent になってます.
Avatar
ほんとだ!
12:24 PM
パラダイムシフトしてた
12:26 PM
[omochi@omochi-mbp ~]$ swift sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp ~]$ swift sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi
12:26 PM
それと、そもそも最初から 0403a が入ってた。
Avatar
私の環境 (swiftly でインストール) だとそれはなかったので,単に ~/.swiftpm/swift-sdks/ にファイルが残っていただけなんじゃないかという気がします.
Avatar
あ、なるほど。ここはコンパイラによらず共通に管理されているんですね。
Avatar
ですね
Avatar
0427の $ swift sdk が手元でもCIでも動いた。ドキュメントも更新した。 https://github.com/omochi/swift-react/pull/94 artifact bundle の選び方の説明文が変わった。
snapshot 0427 から swift experimental-sdk が swift sdk に変わった
Avatar
omochimetaru 4/30/2024 1:27 PM
npm install foo, npm install @types/foo ってやってると、なんだこの環境はってなるわね
Avatar
<unknown>:0: error: The --global-base argument is not supported when targeting WebAssembly
この --global-baseってオプションは新しいんでしょうかね?
Avatar
omochimetaru 5/1/2024 12:08 PM
linker optionだけどどうだろう 僕は0402以降でしか試してない
Avatar
とりあえず無しでも動いた。
😲 1
Avatar
omochimetaru 5/1/2024 12:10 PM
--stack-first と組み合わさって何か意味があるんだと思ってた
Avatar
それが無いと最悪enumが壊れるので付けないとまずい
Avatar
omochimetaru 5/1/2024 12:13 PM
ワオ
Avatar
Avatar
Iceman
<unknown>:0: error: The --global-base argument is not supported when targeting WebAssembly
この --global-baseってオプションは新しいんでしょうかね?
これ出すのlegacy driverだけだったはずなんですけどlegacy driver使ってます? (edited)
Avatar
Xcode15.3についてるSwift使ってますね
Avatar
それは何がどうやって動いてるんだ…?
Avatar
Xcode15.3にswift experimental-sdk installしてますね・・・
Avatar
とりあえず --stack-firstを有効にしたとき明示的な--global-base が必要なのは6.0以降で、それ以前では必要ないのでおそらく大丈夫そう。
Avatar
そうなんですね。とりあえず見た感じは動いてそう。
Avatar
ヨシ yoshi
Avatar
どうせおもちゃとしての利用だからヨシ!
Avatar
omochimetaru 5/1/2024 12:18 PM
swift-reactをやってるわけではない?
Avatar
swift-reactをやっています
Avatar
omochimetaru 5/1/2024 12:18 PM
あれ、Xcode15.3のSwiftで行けたっけ
12:19 PM
なんか雰囲気動いてはいます
Avatar
omochimetaru 5/1/2024 12:19 PM
ビルドできてるしいけてるな
12:20 PM
ああXcode15.3 は Swift5.10か ok ok
12:36 PM
雑だけど動いた
Avatar
すごーい。リアクティブだ
Avatar
結構重いですね
Avatar
omochimetaru 5/1/2024 12:39 PM
keyとdepsつけてる?
Avatar
つけてないです
Avatar
omochimetaru 5/1/2024 12:40 PM
あーそれでもupdateにはなるはずだな
Avatar
つけたらさらに重くなりました
Avatar
omochimetaru 5/1/2024 12:40 PM
ww
12:40 PM
プロファイリングどうすればいいんだろう
Avatar
DOMの個数が多いと重い
Avatar
Chrome DevTools
Avatar
omochimetaru 5/1/2024 12:41 PM
できるのか
12:45 PM
12:45 PM
これいいな
12:46 PM
const wrapWASI = (wasiObject: WASI, wasmModule: WebAssembly.Module): WebAssembly.ModuleImports => { あーこれが噛み合わない
12:47 PM
import wasmUrl from 'foo.wasm?url' こっちの方式なら噛み合いそうだ
Avatar
omochimetaru 5/1/2024 12:55 PM
Carton無しで、ViteJSに乗っかってHMRできた
Avatar
どのくらい設定必要ですか?
12:57 PM
むかしwebpack用のプラグインをメンテしてたんですけど割と面倒くさくて辞めてしまった
12:59 PM
1. viteの設定はほぼそのまま 2. カスタムプラグインを書いて、変更検知してビルド君を叩いてる 3. ビルド君
12:59 PM
あとはターミナルで export TOOLCHAINS=... してから $ npm run dev でdev serverが動く (edited)
1:01 PM
4. エントリポイントはこう。 (edited)
1:02 PM
vitejsは index.html の script タグに書いてあるインラインスクリプトを理解するから、これでうまいこと依存先の更新検知してくれる
Avatar
なるほど
Avatar
omochimetaru 5/1/2024 1:06 PM
プラグインの中で自分でwatchしてるのはダサくて、 本当はvitejsに対して、このwasmファイルはこの辺のswiftソースからこのコマンドで生成されているよ、という宣言を与えてあとはうまくやって欲しかったが、やり方がわからなかった。できるのかどうかもわからない。
1:06 PM
ちなみにこのプラグインの実装はChatGPTに教えてもらってコピペで動いた。
Avatar
SwiftPMプラグインはパッケージのソース一覧を知ることができてCartonはそれを使ってる
Avatar
omochimetaru 5/1/2024 1:08 PM
それはえらいね。
1:09 PM
今の構成だとpackage updateした時とか、local packageが外においてある時に、反応しない問題がある。
Avatar
Avatar
Iceman
そうなんですね。とりあえず見た感じは動いてそう。
やっぱり謎のデリファレンスが起きてて壊れてそうな気がする
Avatar
omochimetaru 5/1/2024 2:23 PM
マジか
Avatar
omochimetaru 5/1/2024 3:49 PM
https://omochi.github.io/swift-string-counter-web/ とりあえず実験1号を公開した
3:49 PM
🎉 5
Avatar
omochimetaru 5/1/2024 3:58 PM
あ、説明文のフォントがデカい
Avatar
omochimetaru 5/2/2024 12:28 PM
スマホで見るとフォントサイズが変わるな・・・
12:32 PM
ところで、 / に全部置いてある想定で作ったんだけど、github pagesによって ディレクトリ名が付いたパスになってしまったが
12:32 PM
vitejsのbaseurl機能使ったら全部一括でオフセットできてうまく動いたのですごい npm run build -- --base=/swift-string-counter-web/
12:46 PM
div( attributes: [ "style": """ display: flex; flex-direction: column; align-items: center; gap: 4px; """ ] ) {
12:47 PM
実際に簡単なウェブページを作ってみた感想としては
12:47 PM
とりあえず最低限動いてそうなのは良いとして
12:47 PM
↑のように、HTMLのアトリビュートを書いて、さらにその中の style アトリビュートに インラインスタイルを書こうとすると
12:48 PM
まあSwiftのトリプルクォート文字列の恩恵はデカくて、書けるは書けるんだけど、これでもまだやっぱり TypeScript で JSX を書くのと比べると、インデントや余計な記号が多くて煩わしい
12:49 PM
例えば一つの理想としては div(display: "flex", flex-direction: "column", align-items: "center", gap: "4px") って書ける事だけど
12:50 PM
  • ハイフンを含むラベルは作れない
  • アトリビュートやスタイルプロパティは多すぎて、多引数の関数として実装すると明らかにまともに動かない
12:50 PM
のでそのまんまこれはできない、絶対に1度は辞書的な動的なオブジェクトにラップする必要がある
12:51 PM
実際のところ JSX も、あれはJSに対するDSLのようなもので、コンポーネント式は関数呼び出しにトランスパイルされて、アトリビュートは辞書になるんで
12:51 PM
これは直接そのトランスパイル先を書いてるような状態に似ているんだけども。 逆にJSXの必要性がよくわかった。
12:52 PM
ハイフンを含むラベルについては、Reactに関しては、このようなkebab-caseからcamelCaseに全部置き換えたAPIを提供しており
12:54 PM
一つの正解なんだけど、他にもちょっと名前が変わってたりして、裏のHTML/CSSとはまたちょっと違う体系の学習が強いられるのが好きではない・・・
12:54 PM
classclassName, forhtmlFor などがある。(どちらもJSのキーワードと衝突している)
12:55 PM
Result Builder とか型付きの辞書とかでなんかいい感じにできんかなあ〜
Avatar
一つの解決策はSwiftUIみたいにsome Elementのextensionとして各種属性設定を生やすことでしょうね
1:05 PM
SwiftUIと違ってHTMLはどのElementにもあらゆる属性を付与できるので構造としては崩れてない
Avatar
omochimetaru 5/2/2024 1:05 PM
そうですね。でもextensionだと後ろに付くから嫌なんですよね。 子供ノードをクロージャで包んでる時に、親ノードの設定が子供の定義の後に来るのは可読性が低いと思ってます。
1:06 PM
実際SwiftUIでも、Buttonのラベルとか、重要な設定は init で与えるようになっているのは、前に書きたいからだと思う。
1:06 PM
メンタルモデルがHTMLだから、アトリビュートは開きタグの方に書きたいというのもありますね。メソッドチェーンで後ろに書くのは閉じタグ側に感じる。 (edited)
Avatar
JetpackComposeは引数に与えるStylesプロパティ的なものをメソッドチェーンによるビルダー式で組み立てれるようになってますね (edited)
Avatar
omochimetaru 5/2/2024 1:08 PM
お、それは知らない、カンニングしてこよう
Avatar
some Elementに生やさなくても、頭に与える引数側のオブジェクトをチェーンで組み立てれるようにする方式
Avatar
omochimetaru 5/2/2024 1:10 PM
1:10 PM
この Image に対する modifier = の Modifier.size(...).clip(...) の部分ですかね
Avatar
そうですね
Avatar
omochimetaru 5/2/2024 1:11 PM
なるほど〜 これは良さそうだぞ
1:12 PM
メソッドチェーンが最適かは別として、attributesやstyleを構築する機能を別途設計して、a とか div にそれを渡す形だ。
1:13 PM
attributes { class = "..." src = "..." href = "..." } 本当はこんな感じに書きたいけど Result Builder はグローバルな名前しか使えないからできないんだよな
1:15 PM
Attributes .class(...) .src(...) .href(...) メソッドチェーンならKotlinと同じようにSwiftでもできる。 SwiftUIも、まあそうか。
1:16 PM
Style .display("flex") .flexDirection("column") .alignItems("center")
1:16 PM
flex-directionalignItems にできないのはしょうがないよなあ。 これはSwifty API なんだよという事かなあ。
1:17 PM
このアプローチだと適宜 enum とかも使えるのがいいですね。 .display(.flex).flexDirection(.column)...
Avatar
属性とその値の組み合わせに型が使えたほうが嬉しいですね
Avatar
omochimetaru 5/2/2024 1:18 PM
↑だと属性はメソッド名にすぎなくて型ではないですね。
1:19 PM
ただHTMLのattributeとかCSSのstyleにひとつずつ型を付けると
1:19 PM
型の数が多くなりすぎてランタイムのメタ情報がデカすぎそう (edited)
1:19 PM
コンパイラもヨボヨボになりそう。
Avatar
ランタイムのメタデータサイズ考える必要あるのかw
Avatar
omochimetaru 5/2/2024 1:21 PM
まあ、リンカ最適化でeliminateしてくれるかも、しれないけど・・・ (edited)
1:22 PM
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
kebo started a thread. 5/2/2024 1:23 PM
Avatar
omochimetaru 5/2/2024 1:24 PM
CSSプロパティは370個ぐらいありそう。思ったより少ないな。いけるか? (edited)
1:30 PM
自分で数えたけど、GPTにも丸ごとコピペしたら大体同じ数答えてきた
1:30 PM
レイアウトぶっ壊れてるのにすごいなこの子
1:36 PM
HTML attributeも170個ぐらいか
1:37 PM
想像していたほどではないな
Avatar
Sotoのシンボルのほうが断然多そう
Avatar
omochimetaru 5/2/2024 1:39 PM
Sotoのおかげでコンパイラの馬力がどのくらい出るかなんとなくイメージできるのおもろい。
Avatar
omochimetaru 5/2/2024 2:02 PM
手前味噌だけど(まあ流石に仕方ない)、事例紹介リンク集を作った 何か作ったら載せるから教えてください
2:06 PM
そういえば現時点のバイナリサイズも見ておくか default (debug): 25.5MB -c release: 24.3MB -c release, -Osize: 13.4MB -c release, -Osize, -wmo: 13.4MB (変化なし?) (edited)
Avatar
omochimetaru 5/2/2024 2:14 PM
-lto=llvm-full -experimental-hermetic-seal-at-link つけたらビルドできなかった・・・ wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/React.build/ChildrenBuilder.swift.o: undefined symbol: $sytWV clang: error: linker command failed with exit code 1 (use -v to see invocation) [10/11] Linking StringCounter.wasm
Avatar
Avatar
omochimetaru
そういえば現時点のバイナリサイズも見ておくか default (debug): 25.5MB -c release: 24.3MB -c release, -Osize: 13.4MB -c release, -Osize, -wmo: 13.4MB (変化なし?) (edited)
-c release-wmo が有効になるので比較は実質上 2 つだけで十分ですよ.
naruhodo 1
Avatar
Osizeの存在わすれてたので手元のプロジェクトにかけてみたけど、0.1MBしか変わらなかった
2:52 PM
wasm-optが結構効いてそう
Avatar
wasm-opt は -Os の上の -Oz もありますしね.wasm-strip をかけてから wasm-opt をかけるとさらに小さくなった記憶があります.
Avatar
wasm-stripもかけてます。結構効きますよね
2:57 PM
手元のプロジェクトだとswift(10.1MB)→wasm-opt(5.6MB)→wasm-strip(4.2MB)と変化してる
2:58 PM
お、stripを先にやったら最終結果が4.1MBになった
👀 1
Avatar
omochimetaru 5/3/2024 6:59 AM
↑のhermetic sealの問題を直すのも取り組みたいな。これが本命だろうし。
Avatar
omochimetaru 5/3/2024 2:00 PM
xcodeが意味のわからん壊れ方した
2:00 PM
*.bc と言うファイルが大量に生成される。
3:15 PM
メソッドチェーンで attributes, style, listenersを書く方式、快適だ
3:16 PM
補完が効くのが良いっぽい
Avatar
Avatar
omochimetaru
*.bc と言うファイルが大量に生成される。
LTO 向けのフラグをつけると生成されるファイルじゃないでしたっけ? (edited)
Avatar
Avatar
kebo
LTO 向けのフラグをつけると生成されるファイルじゃないでしたっけ? (edited)
omochimetaru 5/3/2024 3:17 PM
なるほど。Xcodeじゃなくて起動してた更新監視スクリプトが出してたっぽいです。 (edited)
Avatar
Avatar
omochimetaru
-lto=llvm-full -experimental-hermetic-seal-at-link つけたらビルドできなかった・・・ wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/React.build/ChildrenBuilder.swift.o: undefined symbol: $sytWV clang: error: linker command failed with exit code 1 (use -v to see invocation) [10/11] Linking StringCounter.wasm
そのエラー,.build ディレクトリを一旦消したら別のエラーになりませんか?ビルドディレクトリに *.swift.o ファイルが見つからないというようなエラーに. そして SwiftPM だと最近 LTO を有効にするための --experimental-lto-mode=full みたいなのが追加されたみたいなので,-Xswiftc -lto=llvm-full じゃなくてこっちのフラグで指定したらどうなりますか? https://github.com/apple/swift-package-manager/pull/6891/files
Avatar
omochimetaru 5/3/2024 4:54 PM
あ、たしかに、連続でやったせいでおかしかったのか 後日ためしてみます
Avatar
ちなみに Wasm とはまた状況が違うかもしれないですが,Embedded Swift を使っている swift_os だと swiftc に -experimental-hermetic-seal-at-link-lto=llvm-full を渡す方式じゃ同じエラー (*.swift.o が生成されない) が起こって,swiftc に -experimental-hermetic-seal-at-link で swift-build に --experimental-lto-mode=full を渡す方式だとちゃんとビルドが通ってバイナリサイズも小さくなりました.
Avatar
swift-string-counter-web でやると別のエラーが出ますね.(Linux aarch64 環境なので,macOS だと結果は異なるかもしれませんが) wasm-ld: error: /home/kebo/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/swift.xctoolchain/usr/lib/swift_static/wasi/wasm32/swiftrt.o: undefined symbol: swift_addNewDSOImage wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _call_host_function_impl wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _free_host_function_impl wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _library_features clang: error: linker command failed with exit code 1 (use -v to see invocation) (edited)
👀 1
Avatar
ちなみに diff はこんな感じです. diff --git a/bin/build b/bin/build index ae8a56c..d0ba369 100755 --- a/bin/build +++ b/bin/build @@ -6,7 +6,9 @@ set -x swift build --swift-sdk wasm32-unknown-wasi \ --disable-build-manifest-caching \ - -Xswiftc -static-stdlib \ + --static-swift-stdlib \ + --experimental-lto-mode=full \ + -Xswiftc -experimental-hermetic-seal-at-link \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ -Xlinker --stack-first \
Avatar
めっちゃ ugly な解決策ですが,ここにあるみたいに undefined symbol: swift_addNewDSOImage-Xlinker $HOME/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/swift.xctoolchain/usr/lib/swift_static/wasi/libswiftCore.a を追加すればとりあえず出なくなりました.残り 3 つは全部 _CJavaScriptKit module なのが気になりますね. https://github.com/apple/swift-package-manager/issues/4415#issuecomment-1116961059
Avatar
omochimetaru 5/5/2024 2:06 PM
本当だ、同じ状態になりました warning: Could not read SDKSettings.json for SDK at: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi/wasm32-unknown-wasi/WASI.sdk wasm-ld: error: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi/wasm32-unknown-wasi/swift.xctoolchain/usr/lib/swift_static/wasi/wasm32/swiftrt.o: undefined symbol: swift_addNewDSOImage wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _call_host_function_impl wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _free_host_function_impl wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _library_features clang: error: linker command failed with exit code 1 (use -v to see invocation) [166/167] Linking StringCounter.wasm
Avatar
omochimetaru 5/6/2024 5:56 PM
Frontend Swift web framework. Contribute to SailorWebFramework/Sailor development by creating an account on GitHub.
5:57 PM
めっちゃ同じタイミングで同じような事してる人出てきたな
Avatar
本当だ。こっちはかなりSwiftUIに寄せてますね。
11:21 PM
イベントリスナーをチェーンでかけるのは便利そう
Avatar
omochimetaru 5/7/2024 2:21 PM
https://github.com/omochi/swift-react-omochi-template 始めやすいようにテンプレートを用意してみた 別のデモを1から書き始めたけど、 メソッドチェーンのスタイル記法は結構快適だ
❤️ 2
2:27 PM
メソッド1200個ぐらいだとxcodeは平気らしい
Avatar
ちょうど昨日夕方に環境構築を読んだところだったからめちゃくちゃ嬉しいテンプレートだ (edited)
Avatar
omochimetaru 5/8/2024 8:21 AM
おっ、やってよかった うまくいくかなー
Avatar
omochimetaru 5/8/2024 1:44 PM
パフォーマンス評価の実験環境を準備中 (edited)
Avatar
omochimetaru 5/8/2024 4:58 PM
処理落ちが起きた
5:03 PM
Avatar
僕が触ったときは長いリストの先頭へ挿入・削除が重い感じしましたね。前の文字コードのやつでも処理落ち再現します
Avatar
omochimetaru 5/8/2024 11:31 PM
挿入が重いのか、単に要素が多い時の再描画が重いのか、や 内部実装のどのロジックに時間がかかっているのか、などを調べたい
Avatar
omochimetaru 5/9/2024 12:15 PM
12:15 PM
Swiftソースコードでブレークはできたけど、デバッグ情報がありませんって出てしまう
Avatar
まったくないことは無いはずなんだけどなぁ
Avatar
omochimetaru 5/9/2024 12:20 PM
ソースコードが表示されている時点で、DWARF ? 情報は、取得できているはずだよね
12:22 PM
よくわからないけど 時間の14%は JavaScriptKitのretainらしい
12:26 PM
スタックが深すぎてプロファイラの画面外に関数名がはみ出してしまう
12:28 PM
なんか出てるのはすごいけど捉えどころがないな 難しいぞこれ
12:32 PM
Instrumentsなら この関数を100%として潜る操作があるけどこれは無いのかな
Avatar
omochimetaru 5/9/2024 12:57 PM
chrome://tracing は横スクロールできたけどUIが使いにくいな いずれにしてもようわからん
12:57 PM
この手のコールツリー統計出すやつってそもそも再帰的関数と相性悪いよな〜
12:58 PM
まずは再帰呼び出しをなくすべきか・・・? (edited)
Avatar
renderChildren とかを見ていると大体最後で呼び出しているのでこれが実現すれば最適化後のコールスタックは浅くなりそうにも見えますけど,トレーシング結果だとどういう見え方になるんですかね? https://github.com/swiftwasm/swift/issues/5568
Currently, we are using simple recursive call for coroutine lowering in CoroSplit LLVM pass. However, it limits number of suspension chains due to the limitation of number of call frames. In theory...
Avatar
omochimetaru 5/9/2024 1:20 PM
これはasync呼び出しの時のコルーチンのコード生成に関する話かな? 末尾再帰の最適化された時にトレーシングとかがどうなるかは知らないです そこの意味論は変えないように見かけ上は同じように再帰呼び出ししてるようになるのかな?
Avatar
あ,確かに async の話でした.
Avatar
omochimetaru 5/9/2024 2:52 PM
めちゃめちゃステートフルかつ再帰なのでループ化するのややこしい
Avatar
omochimetaru 5/9/2024 3:04 PM
ぶっ壊れた(クラッシュ)
Avatar
omochimetaru 5/9/2024 4:42 PM
ループになったけど、まるでVM作ってるみたいな気持ちになった ヤバかった
4:47 PM
スタック浅くなって見やすくはなった
Avatar
omochimetaru 5/9/2024 5:06 PM
全体的にわかってきたぞ
5:10 PM
目立つボトルネックがあるわけじゃなくて、順当に重そうな処理がまあ重いという感じで、そういうものが複数あるので足し合わさってまあまあ重い、という感じだ・・・
Avatar
[omochi@omochi-iMacPro temp]$ swift sdk install swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle.zip Swift SDK bundle at `swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle.zip` is assumed to be an archive, unpacking... zsh: segmentation fault swift sdk install
12:19 PM
swift 0501 の sdk コマンド ぶっ壊れてる?
12:23 PM
前に成功した0427でも失敗した 俺が何か間違えているのか
Avatar
macOS 14?
Avatar
macOS 14.4.1 だけど Intel Mac なのが特殊かも
Avatar
むむ・・・ メインマシンではmacOS14.1 とかで0427でうまくいったんだよな
12:27 PM
Sonomaのマイナーバージョン違いで踏んだり踏まなかったりする?
Avatar
OS同梱のlibswiftCoreのバージョンに依存する問題なのであるかもしれない
12:27 PM
僕のは14.4.1
Avatar
なるほど・・・ じゃあ今人々が踏みやすいのか
12:28 PM
僕の書いた手順書に従うと14.4だと詰みかな (edited)
Avatar
でもRauhulは14.0で再現するって言ってるからよくわからないんですよねぇ
Avatar
ふむ。とりあえずメインマシンが修理から戻ってきたらまた試してみる。とりあえずは5.10系のsnapshotつかえばいいのかな
Avatar
5.10はswift testが壊れてる。。
Avatar
ええ〜
12:30 PM
あ〜 言ってたな
12:37 PM
WebAssembly support for the Swift programming language - Tags · swiftwasm/swift
12:37 PM
Xcode15.3に同梱されてる Swift 5.10 RELEASE 版に対応する wasm sdk ってどうやって選ぶの?
12:37 PM
5.10-snapshot-日付 なやつしかない
Avatar
壊れてるのでリリースしてない
Avatar
なるほどw
12:38 PM
じゃあ wasm sdk が存在する 5.10 から逆算した swift 5.10 を入れるか・・・
Avatar
でも5.10のSwift SDKはコンパイラ入ってるのでだいたいどのバージョンでも大丈夫
Avatar
なるほど
12:40 PM
とりあえず入れて叩いてみるか
12:40 PM
ほんとだ 400MB もある
12:43 PM
swift test動かないってこれのことだっけ /Users/omochi/github/omochi/swift-react/.build/wasm32-unknown-wasi/debug/swift-reactPackageTests.derived/runner.swift:113:19: error: no such module 'Darwin.C' @_exported import Darwin.C ^ (edited)
Avatar
それそれ
Avatar
思い出してきた runner.swift は生成されるんだ
Avatar
最新のsegvの問題は今週直そうと思ったけど時間取れなかった 😢
Avatar
これはいずれにせよ macOS 14.5 が来るまでユーザーは助からないというものではないの?
Avatar
いくつか直す方法はあるとおもってます
Avatar
なるほど
12:47 PM
そしてハイパーやらかした
12:47 PM
弾幕アプリまだgithubにアップしてなかった・・・
Avatar
結局修理から返ってくるまで。。。
Avatar
しまったなあ
Avatar
Avatar
omochimetaru
これはいずれにせよ macOS 14.5 が来るまでユーザーは助からないというものではないの?
ちなみに今手元の macOS 14.5 RC だと segfault 起こりました.
Avatar
Avatar
kebo
ちなみに今手元の macOS 14.5 RC だと segfault 起こりました.
もうRCがあるんですね そしてダメなのか・・・w
12:50 PM
この土日は忙しいからちょうどいいけども
12:51 PM
なんか別系統の事を進めるか
12:53 PM
We should be using the #isolation macro in all APIs where _unsafeInheritExecutor was used before; This handles it just for the continuation APIs, more to follow soon. resolves rdar://125307764 reso...
12:54 PM
原因になってるの kntk と konrad のやつじゃんwww
😿 1
12:57 PM
stdlibに関数を増やしたけど実行時にはOSの古いstdlibを使うから関数がないよというシンプルな話なのね
Avatar
まあ原因というかトリガーというか
Avatar
なんでこれ今まで大丈夫だったんだ?
12:58 PM
容易に類似の問題が起きそう
Avatar
issueにも書いたんですがos availability checkの変更が/usr/lib/libswiftCore.dylibに入ってなければ発病しない
Avatar
omochimetaru 5/10/2024 1:00 PM
今ちょっとずつ読んでるけど味が濃くて理解が難航している (edited)
1:01 PM
9999ってクソデカ番号じゃなくてマジックナンバーだったんかい
Avatar
そうなんすよ。最近のlibswiftCoreは9999を常にavailableとみなす
Avatar
omochimetaru 5/10/2024 1:02 PM
読んでるけど頭おかしくなりそう
1:03 PM
available 9999 は古典的には 超未来のバージョンから使えるようになる、という意味で、つまり実行時の分岐で使うことはなくて・・・
1:04 PM
しかし 22658 からは、逆?で、常に小さいバージョンとみなされる
1:04 PM
??
Avatar
わはは
1:04 PM
そこがメインのおかしいポイントですね
Avatar
omochimetaru 5/10/2024 1:05 PM
これをやりたい気持ちも気になるけどいったん置いとこう
1:06 PM
All new stdlib APIs introduced in the next release are marked with @available(macOS 9999, ...) until the version is fixed to be a concrete OS version.
これはめっちゃ当たり前の主張
Avatar
snapshot触ってる人たちは絶対みんな困るだろうし詳細なレポート書いておけばだれか直してくれるだろうと思ってたけどこの数週間誰も触れなかった。。
Avatar
omochimetaru 5/10/2024 1:07 PM
とりあえず9999ということにしておけば出荷先で使えない判定になってバックデプロイになったりビルド時に避けたりする
1:07 PM
配布するmacOSのバージョンが決まったらそれを書く
Avatar
Avatar
Yuta Saito
snapshot触ってる人たちは絶対みんな困るだろうし詳細なレポート書いておけばだれか直してくれるだろうと思ってたけどこの数週間誰も触れなかった。。
omochimetaru 5/10/2024 1:08 PM
embed and wasm 元年が来るからみんなめちゃくちゃ困るはず
Avatar
ルビーカイギが終わるまでに治ってなかったら本気出す
Avatar
omochimetaru 5/10/2024 1:09 PM
if #available and @backDeploy check the running OS version by using _stdlib_isOSVersionAtLeast, and it leads to referencing symbols with @available(macOS 999) at runtime.
1:09 PM
あ、ここ 9 が足りない。
Avatar
hontoda
Avatar
omochimetaru 5/10/2024 1:10 PM
これは実際の動作を言ってて、ランタイムにランタイム関数で判定してその結果によって 9999 版を使う
1:12 PM
1,2,3は実装と運用の事実の話で、1がイカれた判定するから、snapshotでビルドしたバイナリとos の sdk を組み合わせると死ぬので
1:13 PM
snapshot の sdk を見るようにするべきというのが解決方法
1:13 PM
まだややこしいぞ
1:13 PM
そもそも $ swift sdk コマンドはなんなんだ
1:14 PM
Swiftで実装されていて、ツールチェーンにビルド済みで同梱されてる?
1:14 PM
swift 0501 をインストールしたときにはそのswift 0501 自身で事前にビルドされた swift sdk コマンドを起動してるのか
1:15 PM
Why it doesn't happen on macOS 13 or earlier? It looks like the /usr/lib/swift/libswiftCore.dylib in the version did not include #22658, so _stdlib_isOSVersionAtLeast(9999._builtinWordValue, 0._builtinWordValue, 0._builtinWordValue) returns false.
これも謎が深い
1:15 PM
macOS Sonoma ってかなり最近じゃなかったっけ
1:15 PM
22658 がマージされたのは2019年2月らしいので
1:16 PM
macOS 13 でもとっくに乗ってるんじゃ?
Avatar
Avatar
omochimetaru
Swiftで実装されていて、ツールチェーンにビルド済みで同梱されてる?
じつはSwiftPMの一部
Avatar
omochimetaru 5/10/2024 1:17 PM
なるほど じゃあ swift build とか swift package と同じようにやってくるのか
Avatar
マージされた時期とリリース時期は離れてるのだ
Avatar
omochimetaru 5/10/2024 1:17 PM
ズレるのはわかるけどそんなに・・・?
1:17 PM
macOS 13 Ventura は 2022年10月24日 に出たらしい
Avatar
OS同梱ランタイムのリリースサイクルはわからない 🤷‍♂️
Avatar
omochimetaru 5/10/2024 1:19 PM
Swiftのバージョンとか考えるとおかしなことにならないのか・・・?
1:21 PM
仮にぎりぎりで2019年1月のswiftのlibSwiftCoreがVenturaに乗っていたとすると
1:22 PM
はじめにSwiftはXcodeの一部として提供されています。そのため、どちらか片方のみをバージョンアップすることは(私の知る限り)できません。どのXcodeのバージョンがどのSwiftのバージ…
1:22 PM
うほーいさんによれば
1:22 PM
Xcode10.2 が 2019年3月に配布されたときのSwiftが5.0らしい
1:23 PM
あーここっぽいな
1:23 PM
メジャーバージョンで足並みそろえてる?
Avatar
うーんでもよく見るとmacOS 13には5.7のランタイムがあることになってるなぁ https://github.com/apple/swift/blob/796ae1d5f4b8b6994985737a9dc7036ad4e11cef/utils/availability-macros.def#L34
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
omochimetaru 5/10/2024 1:25 PM
あれ〜?
1:29 PM
Hmm, due to the absolute install_name specified by LC_ID_DYLIB in libswiftCore.dylib in toolchains, Swift executables always load libswiftCore.dylib from absolute /usr/lib/swift/libswiftCore.dylib without checking @rpath. So just adding -rpath linker option did not work unfortunately.
1:29 PM
ここも味がある
Avatar
ここもこわれてる
Avatar
omochimetaru 5/10/2024 1:30 PM
これはどこのなんだ?
1:30 PM
大筋言ってることわかるけどディテール難しい
1:31 PM
ツールチェーンに含まれてるビルド済みの swift-package executable のリンカースクリプトに libswiftCoreのパスがベタ書きされている
1:32 PM
これはそのツールチェーンのswiftコンパイラで自分でexecutableをビルドしたときも、そのようなバイナリが生成される?
Avatar
へい
1:33 PM
dylibにそのような絶対パスが埋め込まれていて
1:33 PM
ld64 リンカがそれを読んでリンク成果物executableに書き込む
Avatar
omochimetaru 5/10/2024 1:33 PM
ん?
1:34 PM
あ〜
1:34 PM
ややこしいな
1:34 PM
コンパイラがビルドするときにリンクしようとした libSwiftCore.dylib の
Avatar
なので今Darwinプラットフォームでtoolchain stdlibをリンクする方法がない
Avatar
omochimetaru 5/10/2024 1:34 PM
dylib自身に書かれた「俺をロードする方法」として、「絶対パスにしろ」となっていて
1:34 PM
その結果、リンカーが作ったexecutableは、絶対パスでlibSwiftCoreを探す君になる
1:35 PM
Avatar
Y
Avatar
omochimetaru 5/10/2024 1:35 PM
むずいな dylibはライブラリでもあるのか
1:35 PM
えーっとw
1:36 PM
dylibは自身を組み込みたい人に対するヘッダー定義みたいなものでもある (edited)
Avatar
トートロジカルだw
Avatar
omochimetaru 5/10/2024 1:36 PM
ということは
1:37 PM
今OSに入ってるlibSwiftCore.dylibのその指令部分を書き換えてしまえば
1:37 PM
コンパイラが吐くexecutableはrpathを見る柔軟な人になるし
1:37 PM
それによってswift-packageをリビルドしなおして置き換えれば
1:38 PM
swift sdkコマンドを手元で動かせる?
Avatar
よっしゃバイナリパッチだ!
Avatar
omochimetaru 5/10/2024 1:38 PM
なんかotoolコマンドとかでホイホイとやれないんすか
Avatar
えー書き換えられるんだっけな流石にreadonlyな気もする
Avatar
omochimetaru 5/10/2024 1:38 PM
install_nameとかは変えられるじゃん?
Avatar
それもファイルコンテンツの一部ですよ
Avatar
omochimetaru 5/10/2024 1:39 PM
ビルド済みのexecutableの otool -L かなんかで
1:39 PM
出てくるフルパス参照をrpath参照に置き換えたことがある
1:39 PM
一般に動的ライブラリを扱う場合には2つの方針があると思います。ライブラリはシステムにインストールして、アプリはそれを使うライブラリをアプリ用に用意してまとめて配布する後者の場合のよろしいやり方…
1:40 PM
こういう感じでいけないのかなって
Avatar
えーと libswiftCore.dylibはshared cacheというやつで固められた特殊な配布のされ方をしていて
1:40 PM
単純にファイルシステムにぽんと置かれてるわけじゃないですよね
Avatar
omochimetaru 5/10/2024 1:40 PM
ほお
1:41 PM
[omochi@omochi-iMacPro swift]$ pwd /usr/lib/swift [omochi@omochi-iMacPro swift]$ ls -al total 1488 drwxr-xr-x 8 root wheel 256 3 21 15:13 . drwxr-xr-x 32 root wheel 1024 3 21 15:13 .. lrwxr-xr-x 1 root wheel 71 3 21 15:13 libswiftCreateML.dylib -> /System/Library/Frameworks/CreateML.framework/Versions/Current/CreateML -rwxr-xr-x 1 root wheel 2021840 3 21 15:13 libswiftRemoteMirror.dylib lrwxr-xr-x 1 root wheel 84 3 21 15:13 libswiftSoundAnalysis.dylib -> ../../..//System/Library/Frameworks/SoundAnalysis.framework/Versions/A/SoundAnalysis lrwxr-xr-x 1 root wheel 84 3 21 15:13 libswiftSoundAnalysis_Private.dylib -> ../../..//System/Library/Frameworks/SoundAnalysis.framework/Versions/A/SoundAnalysis lrwxr-xr-x 1 root wheel 91 3 21 15:13 libswiftVirtualization.dylib -> ../../../System/Library/Frameworks/Virtualization.framework/Versions/Current/Virtualization drwxr-xr-x 3 root wheel 96 3 21 15:13 playgrounds
Avatar
で、shared cacheはおそらくwritableではないと思う
Avatar
omochimetaru 5/10/2024 1:42 PM
たしかにここに libswiftCore.dylib 無いね
1:42 PM
macOSの特別な仕組みでdylibのロードするときにはこのファイルパスで読み込めるけどファイルシステム上は存在しないというのが
1:42 PM
そのshared cache?
Avatar
そうそう
1:43 PM
/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e にいる
Avatar
omochimetaru 5/10/2024 1:43 PM
なるほど・・・・意味わからん・・・
1:43 PM
セキュリティ的な目的なのかしら
Avatar
色々オトクなんですよね。メモリフットプリント的にもパフォーマンス的にも
Avatar
omochimetaru 5/10/2024 1:44 PM
名前はそんな雰囲気があるね。
1:44 PM
libswiftCoreならいろんなプロセスが同じdylib使いそうだし。
Avatar
固められたdylib間のrebase/fixupを事前にできたり
1:45 PM
実行時にやることが少なくなるし
1:45 PM
そういうrelocationの必要がなくなるとdirtyページが減るのでプロセス間で同じ物理メモリを共有できる
Avatar
omochimetaru 5/10/2024 1:45 PM
なるほどー 複数のdylibで固めるところもポイントになってるのか
1:46 PM
JavaScriptのbundle化みたいなことをやってるわけね
1:46 PM
[omochi@omochi-iMacPro swift]$ cd /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/ [omochi@omochi-iMacPro dyld]$ ls -al total 3264760 drwxr-xr-x 9 root wheel 288 3 21 15:13 . drwxr-xr-x 9 root wheel 288 3 21 15:13 .. -rwxr-xr-x 1 root admin 868433920 3 21 15:13 dyld_shared_cache_x86_64h -rwxr-xr-x 1 root admin 820183040 3 21 15:13 dyld_shared_cache_x86_64h.01 -rwxr-xr-x 1 root admin 748994560 3 21 15:13 dyld_shared_cache_x86_64h.02 -rwxr-xr-x 1 root admin 721551360 3 21 15:13 dyld_shared_cache_x86_64h.03 -rwxr-xr-x 1 root admin 766492672 3 21 15:13 dyld_shared_cache_x86_64h.04 -rwxr-xr-x 1 root admin 287457280 3 21 15:13 dyld_shared_cache_x86_64h.05 -rwxr-xr-x 1 root admin 823374 3 21 15:13 dyld_shared_cache_x86_64h.map ファイル名見るだけでもうだるいじゃん
1:46 PM
これは触らないほうが良さそうだ・・・
Avatar
懸命な判断
Avatar
omochimetaru 5/10/2024 1:48 PM
[omochi@omochi-iMacPro bin]$ pwd /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-01-a.xctoolchain/usr/bin [omochi@omochi-iMacPro bin]$ ls -al total 4110776 drwxr-xr-x 51 omochi staff 1632 5 10 21:13 . drwxr-xr-x 8 omochi staff 256 5 2 04:27 .. lrwxr-xr-x 1 omochi staff 8 5 10 21:13 clang -> clang-17 lrwxr-xr-x 1 omochi staff 5 5 10 21:13 clang++ -> clang -rwxr-xr-x 1 omochi staff 485170160 5 2 18:05 clang-17 lrwxr-xr-x 1 omochi staff 5 5 10 21:13 clang-cache -> clang lrwxr-xr-x 1 omochi staff 5 5 10 21:13 clang-cl -> clang lrwxr-xr-x 1 omochi staff 5 5 10 21:13 clang-cpp -> clang -rwxr-xr-x 1 omochi staff 201968272 5 2 18:05 clangd -rwxr-xr-x 1 omochi staff 19181952 5 2 18:05 docc -rwxr-xr-x 1 omochi staff 179340336 5 2 18:05 dsymutil lrwxr-xr-x 1 omochi staff 3 5 10 21:13 ld.lld -> lld lrwxr-xr-x 1 omochi staff 3 5 10 21:13 ld64.lld -> lld -rwxr-xr-x 1 omochi staff 277899776 5 2 18:05 lld lrwxr-xr-x 1 omochi staff 3 5 10 21:13 lld-link -> lld -rwxr-xr-x 1 omochi staff 1231712 5 2 18:05 lldb -rwxr-xr-x 1 omochi staff 1929040 5 2 18:05 lldb-dap -rwxr-xr-x 1 omochi staff 48793296 5 2 18:05 llvm-ar -rwxr-xr-x 1 omochi staff 16037728 5 2 18:05 llvm-cov -rwxr-xr-x 1 omochi staff 17407808 5 2 18:05 llvm-profdata lrwxr-xr-x 1 omochi staff 7 5 10 21:13 llvm-ranlib -> llvm-ar drwxr-xr-x 16 omochi staff 512 5 2 04:27 sdk-module-lists -rwxr-xr-x 1 omochi staff 127166928 5 2 18:05 sourcekit-lsp lrwxr-xr-x 1 omochi staff 12 5 10 21:13 swift -> swift-driver -rwxr-xr-x@ 1 omochi staff 11865 5 2 06:58 swift-api-checker.py lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-api-digester -> swift-frontend lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-api-extract -> swift-frontend lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-autolink-extract -> swift-frontend lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-build -> swift-package -rwxr-xr-x 1 omochi staff 280080 5 2 18:05 swift-build-sdk-interfaces -rwxr-xr-x 1 omochi staff 3266944 5 2 18:05 swift-build-tool lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-cache-tool -> swift-frontend -rwxr-xr-x 1 omochi staff 2236016 5 2 18:05 swift-demangle -rwxr-xr-x 1 omochi staff 259712 5 2 18:05 swift-driver lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-experimental-sdk -> swift-package -rwxr-xr-x 1 omochi staff 43092736 5 2 18:05 swift-format -rwxr-xr-x 1 omochi staff 547557520 5 2 18:05 swift-frontend -rwxr-xr-x 1 omochi staff 307392 5 2 18:05 swift-help lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-legacy-driver -> swift-frontend -rwxr-xr-x 1 omochi staff 108970480 5 2 18:05 swift-package lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-package-collection -> swift-package lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-package-registry -> swift-package -rwxr-xr-x 1 omochi staff 3966192 5 2 18:05 swift-plugin-server lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-run -> swift-package lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-sdk -> swift-package -rwxr-xr-x 1 omochi staff 263616 5 2 18:05 swift-stdlib-tool lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swift-symbolgraph-extract -> swift-frontend lrwxr-xr-x 1 omochi staff 13 5 10 21:13 swift-test -> swift-package lrwxr-xr-x 1 omochi staff 12 5 10 21:13 swiftc -> swift-driver lrwxr-xr-x 1 omochi staff 14 5 10 21:13 swiftc-legacy-driver -> swift-frontend lrwxr-xr-x 1 omochi staff 3 5 10 21:13 wasm-ld -> lld
1:48 PM
これだな > swift-sdk -> swift-package (edited)
Avatar
仮に shared cache に含まれるのが Swift 5.0 だとしたら,CommandLineTools と揃えているんですかね?だとしたらこのパスでバージョンがわかりそう. /Library/Developer/CommandLineTools/usr/lib/swift-5.0/macosx/libswiftCore.dylib
Avatar
あーCLTには2バージョン入ってるのかー
Avatar
5.5 は Concurrency だけっぽいですが あ,suffix なしの swift dir もあるのを見落としてました. (edited)
Avatar
いや、でもCLTは普通のエンドユーザの環境には入ってないはずだから関係ない気もしてきた
Avatar
omochimetaru 5/10/2024 1:52 PM
[omochi@omochi-iMacPro macosx]$ pwd /Library/Developer/CommandLineTools/usr/lib/swift/macosx [omochi@omochi-iMacPro macosx]$ ls layouts-x86_64.yaml libcxxshim.h libswiftCompatibility50.a libswiftCompatibilityConcurrency.a libswiftCxx.a lib_InternalSwiftScan.dylib libcxxshim.modulemap libswiftCompatibility51.a libswiftCompatibilityDynamicReplacements.a libswiftCxxStdlib.a lib_InternalSwiftSyntaxParser.dylib libcxxstdlibshim.h libswiftCompatibility56.a libswiftCompatibilityPacks.a
1:52 PM
[omochi@omochi-iMacPro macosx]$ pwd /Library/Developer/CommandLineTools/usr/lib/swift-5.0/macosx [omochi@omochi-iMacPro macosx]$ ls libswiftAVFoundation.dylib libswiftCoreAudio.dylib libswiftCoreMedia.dylib libswiftGLKit.dylib libswiftMetalKit.dylib libswiftPhotos.dylib libswiftVision.dylib libswiftAccelerate.dylib libswiftCoreData.dylib libswiftCreateML.dylib libswiftGameplayKit.dylib libswiftModelIO.dylib libswiftQuartzCore.dylib libswiftXCTest.dylib libswiftAppKit.dylib libswiftCoreFoundation.dylib libswiftCryptoTokenKit.dylib libswiftIOKit.dylib libswiftNaturalLanguage.dylib libswiftSafariServices.dylib libswiftXPC.dylib libswiftCloudKit.dylib libswiftCoreGraphics.dylib libswiftDarwin.dylib libswiftIntents.dylib libswiftNetwork.dylib libswiftSceneKit.dylib libswiftos.dylib libswiftContacts.dylib libswiftCoreImage.dylib libswiftDispatch.dylib libswiftMapKit.dylib libswiftObjectiveC.dylib libswiftSpriteKit.dylib libswiftsimd.dylib libswiftCore.dylib libswiftCoreLocation.dylib libswiftFoundation.dylib libswiftMetal.dylib libswiftOpenCL.dylib libswiftSwiftOnoneSupport.dylib
1:52 PM
[omochi@omochi-iMacPro macosx]$ pwd /Library/Developer/CommandLineTools/usr/lib/swift-5.5/macosx [omochi@omochi-iMacPro macosx]$ ls libswift_Concurrency.dylib
1:53 PM
swift無印,swift-5.0, swift-5.5 の3つのフォルダに分かれてるけどlibswiftCoreがあるのは5.0だけ (edited)
1:54 PM
ところで
1:54 PM
[omochi@omochi-iMacPro bin]$ pwd /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-01-a.xctoolchain/usr/bin [omochi@omochi-iMacPro bin]$ otool -L swift-package swift-package: /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.157.0) /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 349.3.0) /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 2201.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0) /System/Library/Frameworks/Combine.framework/Versions/A/Combine (compatibility version 1.0.0, current version 311.0.0, weak) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 2201.0.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 1226.0.0) /System/Library/Frameworks/CryptoKit.framework/Versions/A/CryptoKit (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 61040.60.20) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 1296.60.2) /usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 120.100.0) /usr/lib/swift/libswiftDarwin.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftDispatch.dylib (compatibility version 1.0.0, current version 34.0.2) /usr/lib/swift/libswiftIOKit.dylib (compatibility version 1.0.0, current version 1.0.0, weak) /usr/lib/swift/libswiftOSLog.dylib (compatibility version 1.0.0, current version 4.0.0, weak) /usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 8.0.0) /usr/lib/swift/libswiftXPC.dylib (compatibility version 1.0.0, current version 29.0.2, weak) /usr/lib/swift/libswift_Concurrency.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftos.dylib (compatibility version 1.0.0, current version 1040.0.0)
1:54 PM
これを書き換えたら $ swift sdk コマンドは動くようになるかな?
Avatar
その手もある
1:55 PM
たしかに本当に困ったらそれでも良いのか
Avatar
omochimetaru 5/10/2024 1:56 PM
[omochi@omochi-iMacPro swift-DEVELOPMENT-SNAPSHOT-2024-05-01-a.xctoolchain]$ find usr -name "libswiftCore.dylib" usr/lib/swift/xros/libswiftCore.dylib usr/lib/swift/appletvsimulator/libswiftCore.dylib usr/lib/swift/watchos/libswiftCore.dylib usr/lib/swift/iphoneos/libswiftCore.dylib usr/lib/swift/appletvos/libswiftCore.dylib usr/lib/swift/watchsimulator/libswiftCore.dylib usr/lib/swift/macosx/libswiftCore.dylib usr/lib/swift/iphonesimulator/libswiftCore.dylib usr/lib/swift/xrsimulator/libswiftCore.dylib
1:57 PM
こっちに向けるってことだよね
Avatar
問題は全ての依存ライブラリがツールチェインのlibswiftCoreを向かないといけないことかな
Avatar
omochimetaru 5/10/2024 1:58 PM
@executable_path/../lib/swift/libSwiftCore.dylib とかにしていけばいいな
Avatar
Avatar
Yuta Saito
問題は全ての依存ライブラリがツールチェインのlibswiftCoreを向かないといけないことかな
omochimetaru 5/10/2024 1:58 PM
あ、そういうこと・・・
Avatar
うーんそうするとissueに書いたツールチェインstdlibを使わせるの無理かもなぁ
Avatar
omochimetaru 5/10/2024 1:59 PM
[omochi@omochi-iMacPro macosx]$ pwd /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-01-a.xctoolchain/usr/lib/swift/macosx [omochi@omochi-iMacPro macosx]$ otool -L libswiftDarwin.dylib libswiftDarwin.dylib: /usr/lib/swift/libswiftDarwin.dylib (compatibility version 1.0.0, current version 0.0.0) @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.157.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
1:59 PM
rpathだ
2:00 PM
[omochi@omochi-iMacPro macosx]$ otool -L libswiftDistributed.dylib libswiftDistributed.dylib: /usr/lib/swift/libswiftDistributed.dylib (compatibility version 1.0.0, current version 0.0.0) @rpath/libswift_Concurrency.dylib (compatibility version 1.0.0, current version 0.0.0) @rpath/libswiftDarwin.dylib (compatibility version 1.0.0, current version 0.0.0, weak) @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.157.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
Avatar
そのへんの同梱されてるやつはok
Avatar
omochimetaru 5/10/2024 2:00 PM
あとはどこ?
Avatar
Foundationとか
Avatar
omochimetaru 5/10/2024 2:00 PM
あー
2:01 PM
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 2201.0.0)
2:01 PM
これの先ね
Avatar
dyld-shared-cache-extractor で shared cache から libswiftCore.dylib を取り出してバイナリエディタで眺めてたんですが,Info.plist みたいなものが埋め込まれていてそこの CFBundleShortVersionString が 5.10 になっていたのが今気になっています.(実はバージョンは新しいんじゃないかという意味で)
Avatar
これでshared cache分解できる https://github.com/keith/dyld-shared-cache-extractor
Avatar
ちょうど
Avatar
なるほど
Avatar
omochimetaru 5/10/2024 2:02 PM
そうやればとりあえずOSに入ってるものは確定できるんですね
2:03 PM
Venturaの人〜
Avatar
ちなみにこれが 14.5 RC で shared cache 内の libswiftCore.dylib に埋め込まれていた文字列 <?xml version="1.0" encoding="UTF-8"?>.<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">.<plist version="1.0">.<dict>. <key>CFBundleIdentifier</key>. <string>com.apple.dt.runtime.swiftCore</string>. <key>CFBundleInfoDictionaryVersion</key>. <string>6.0</string>. <key>CFBundleName</key>. <string>swiftCore</string>. <key>CFBundleShortVersionString</key>. <string>5.10</string>. <key>CFBundleVersion</key>. <string></string>.</dict>.</plist>
Avatar
omochimetaru 5/10/2024 2:04 PM
[omochi@omochi-iMacPro Foundation.framework]$ ls -al total 0 drwxr-xr-x 6 root wheel 192 3 21 15:13 . drwxr-xr-x 262 root wheel 8384 3 21 15:13 .. lrwxr-xr-x 1 root wheel 27 3 21 15:13 Foundation -> Versions/Current/Foundation lrwxr-xr-x 1 root wheel 26 3 21 15:13 Resources -> Versions/Current/Resources drwxr-xr-x 4 root wheel 128 3 21 15:13 Versions lrwxr-xr-x 1 root wheel 28 3 21 15:13 XPCServices -> Versions/Current/XPCServices [omochi@omochi-iMacPro Foundation.framework]$ pwd /System/Library/Frameworks/Foundation.framework [omochi@omochi-iMacPro Foundation.framework]$ ls -al total 0 drwxr-xr-x 6 root wheel 192 3 21 15:13 . drwxr-xr-x 262 root wheel 8384 3 21 15:13 .. lrwxr-xr-x 1 root wheel 27 3 21 15:13 Foundation -> Versions/Current/Foundation lrwxr-xr-x 1 root wheel 26 3 21 15:13 Resources -> Versions/Current/Resources drwxr-xr-x 4 root wheel 128 3 21 15:13 Versions lrwxr-xr-x 1 root wheel 28 3 21 15:13 XPCServices -> Versions/Current/XPCServices [omochi@omochi-iMacPro Foundation.framework]$ ls -al Versions/Current lrwxr-xr-x 1 root wheel 1 3 21 15:13 Versions/Current -> C [omochi@omochi-iMacPro Foundation.framework]$ ls -al Versions/C total 0 drwxr-xr-x 5 root wheel 160 3 21 15:13 . drwxr-xr-x 4 root wheel 128 3 21 15:13 .. drwxr-xr-x 60 root wheel 1920 3 21 15:13 Resources drwxr-xr-x 3 root wheel 96 3 21 15:13 XPCServices drwxr-xr-x 3 root wheel 96 3 21 15:13 _CodeSignature こいつも中身無い
2:04 PM
shared cacheかも
Avatar
13.6.4 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleIdentifier</key> <string>com.apple.dt.runtime.swiftCore</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>swiftCore</string> <key>CFBundleShortVersionString</key> <string>5.8.2</string> <key>CFBundleVersion</key> <string>5.8.2.0.1</string> </dict> </plist>
2:07 PM
実装的は9999の分岐は無かった (edited)
Avatar
omochimetaru 5/10/2024 2:07 PM
5.8.2だととっくに入ってるはずなのに。 macOS 同梱用のビルドは別にあってチェリーピックしてるのか?
2:08 PM
#22658 が入ってないブランチでビルドした?
Avatar
omochimetaru 5/10/2024 2:09 PM
Catalina が 2019年6月3日 だから
Avatar
謎は深まるばかりであるが外部からこれ以上探るのは面倒なのであとは関係者に伝えるのが良いかな
t_nazo 1
Avatar
omochimetaru 5/10/2024 2:09 PM
実はずーっと別系列で、Sonomaでアップストリームしたのかな
2:10 PM
Big Sur で arm mac が始まるから
2:10 PM
秘密のビルドが実はあった気がするなあ
Avatar
Avatar
Yuta Saito
Foundationとか
omochimetaru 5/10/2024 2:12 PM
これFoundationは /System/Library/Frameworks を見てるけど、見えないし、toolchainにはFoundationないから
Avatar
Avatar
Yuta Saito
うーんそうするとissueに書いたツールチェインstdlibを使わせるの無理かもなぁ
omochimetaru 5/10/2024 2:12 PM
だから無理かもなあなのか
Avatar
うむ
Avatar
omochimetaru 5/10/2024 2:12 PM
さっきのextractorでFoundationひっぱりだして @rpath になってたらワンチャンあるな (edited)
Avatar
実行時にライブラリ探索してたら固める意味ないんで流石になってない気がする
t_tashikani 1
Avatar
omochimetaru 5/10/2024 2:15 PM
え〜こまったな stdlibだったらstatic linkする作戦もあるけど
2:16 PM
FoundationはAppleが配った現物しか存在しない
Avatar
ちゃんと治すのが一番早そう
2:16 PM
考えていた方針としては
Avatar
omochimetaru 5/10/2024 2:16 PM
ライブラリ差し替えをパッチするの思ったより難しかった、というか、しっかり守られてるというか。
Avatar
OS同梱の _stdlib_isOSVersionAtLeast の実装を変えるのは厳しいので
Avatar
(手元だけで) なんとかして動かしたいなら swift-package-manager のコードを Swift 5.10 でビルドして DEVELOPMENT のツールチェーンの swift-package をそれで置き換えちゃうっていう手はないんでしたっけ? (edited)
Avatar
_stdlib_isOSVersionAtLeast の実装をalwaysEmitIntoClientにして
2:17 PM
クライアントコードにロジックを持ってきて、その上で9999の特別扱いをやめる
Avatar
Avatar
kebo
(手元だけで) なんとかして動かしたいなら swift-package-manager のコードを Swift 5.10 でビルドして DEVELOPMENT のツールチェーンの swift-package をそれで置き換えちゃうっていう手はないんでしたっけ? (edited)
omochimetaru 5/10/2024 2:17 PM
自分でビルドしても /usr/lib/ を読むものが生成されちゃうだけという理解
Avatar
そうするとOSのリリースを待たずに直せるはず
2:18 PM
5.10でコンパイルした成果物は _stdlib_isOSVersionAtLeast に対して9999をチェックするようなコードを持たないので動く
2:18 PM
動くけど。。
Avatar
Avatar
Yuta Saito
5.10でコンパイルした成果物は _stdlib_isOSVersionAtLeast に対して9999をチェックするようなコードを持たないので動く
omochimetaru 5/10/2024 2:19 PM
その方針の場合の最大の疑問は
2:19 PM
そもそも何か必要があって9999ロジックが入ったはずだから
2:20 PM
そのチェックを外したらその別の問題が復活してしまうのでは?
t_naruhodo 1
2:20 PM
22658 には rdar 番号も参照してるし・・・
Avatar
基本的に困るのはテストだけだと思う。
2:21 PM
なのでテストはなんとかして調整する必要がある
Avatar
omochimetaru 5/10/2024 2:22 PM
9999がついてる実装を(OSが9999になったつもりで)実行したいってこと?
Avatar
そうそう
Avatar
omochimetaru 5/10/2024 2:23 PM
それはなんか環境変数とかコンパイルオプションで _stdlib_isOSVersionAtLeast のふるまいが変わるのが良さそう?
2:23 PM
-override-runtime-os-version 9999 みたいな・・・
2:24 PM
9999だと思い込むモード。
Avatar
そうそう。少なくとも@available(9999)が含まれる状態ではそういうオプションがないと困る
Avatar
omochimetaru 5/10/2024 2:31 PM
手元でごまかす方法なんだけど、 _stdlib_isOSVersionAtLeast がリンクされるのってどのタイミングなんだっけ (edited)
2:31 PM
libswiftCore.dylib じゃなくて executable 自身に同じシンボルを置いといたらそっちが優先でリンクとか
2:31 PM
そういうトリックはないんだっけ
Avatar
libswiftCore.dylib自体に_stdlib_isOSVersionAtLeastがnon-weak symbolとして定義されてるから
2:33 PM
他に定義があるとまずconflictする
Avatar
omochimetaru 5/10/2024 2:33 PM
そもそもコンパイル時のリンクフェーズで怒られちゃうパターンか
2:35 PM
ん?
2:35 PM
じゃあ ss23withCheckedContinuation9isolation8function_xScA_pSgYi_SSyScCyxs5NeverOGXEtYalFTu こっちを用意しちゃう手はあるか?
2:40 PM
普通にやると 9999付きの Conrrency に入ってる本物とconflictでソースレベルでダメか・・・
2:46 PM
[omochi@omochi-iMacPro C]$ pwd /Users/omochi/temp/libs/System/Library/Frameworks/Foundation.framework/Versions/C [omochi@omochi-iMacPro C]$ ls -al total 43608 drwxr-xr-x 3 omochi staff 96 5 10 23:15 . drwxr-xr-x 3 omochi staff 96 5 10 23:15 .. -rw-r--r-- 1 omochi staff 22327296 5 10 23:15 Foundation extract したやつちゃんと見えなかった部分だけ中身入ってるなあ
2:47 PM
[omochi@omochi-iMacPro C]$ otool -L Foundation Foundation: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 2420.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0, reexport) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 2420.0.0, reexport) /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout (compatibility version 1.0.0, current version 32.0.0, weak) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 1300.100.9) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.12) /usr/lib/libfakelink.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libcompression.dylib (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork (compatibility version 1.0.0, current version 1494.0.7) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libarchive.2.dylib (compatibility version 9.0.0, current version 9.2.0) /usr/lib/libDiagnosticMessagesClient.dylib (compatibility version 1.0.0, current version 113.0.0) /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 74.1.0) /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 1226.0.0) /usr/lib/liblangid.dylib (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1345.100.2) /System/Library/Frameworks/Combine.framework/Versions/A/Combine (compatibility version 1.0.0, current version 311.0.0) /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal (compatibility version 22.0.0, current version 22.0.0) /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal (compatibility version 22.0.0, current version 22.0.0) /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal (compatibility version 22.0.0, current version 22.0.0) /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking (compatibility version 1.0.0, current version 47.0.0) /usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 120.100.0) /usr/lib/swift/libswiftDarwin.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftDispatch.dylib (compatibility version 1.0.0, current version 41.0.0) /usr/lib/swift/libswiftIOKit.dylib (compatibility version 1.0.0, current version 1.0.0, weak) /usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 8.0.0) /usr/lib/swift/libswiftXPC.dylib (compatibility version 1.0.0, current version 36.100.7, weak) /usr/lib/swift/libswift_Concurrency.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswift_StringProcessing.dylib (compatibility version 1.0.0, current version 0.0.0) /usr/lib/swift/libswiftos.dylib (compatibility version 1.0.0, current version 1049.100.4)
2:47 PM
やっぱりガチガチにフルパスだった
2:52 PM
元スレ読み終わってないんだった
2:52 PM
#72801 seems trying to solve the same issue for typed throws
https://github.com/apple/swift/pull/72801
Inlined code using the special 9999 availability is always getting executed, even on older standard library implementations, causing a runtime failure due to a missing symbol. Avoid this problem by...
2:59 PM
alwaysEmitIntoClient の willThrowTyped と、willThrowTypedImpl に分けておいて
2:59 PM
avaiableチェック+dlsymチェック
3:01 PM
これはwillThrowならまあ許されなくもないけど withCheckedContinuation はこうはいかなそうだ
Avatar
omochimetaru 5/10/2024 3:16 PM
https://github.com/apple/swift-package-manager/pull/7400 これはマージされたから5.10のswift testは直りそうだけど、もう5.10はリリースされなそうか
This change makes the XCTest entrypoint async on WASI, as it is required to not block the main thread. The entrypoint has been changed during the upstreaming work for WebAssembly support in XCTest....
3:17 PM
6.0 はさっきの問題があって・・・
3:18 PM
うーん。どうするのがいいんだ。
3:20 PM
rauhulさんが14.0で踏んだって言ってるから俺のメインマシンではこれまで大丈夫だったのも謎だし
3:24 PM
Member Author finestructure commented 2 weeks ago Good news! We've got a new Orka base image with Sonoma 14.3.1 which doesn't crash. (The underlying issue is one in SwiftPM with newer macOS versions: apple/swift#73327)
3:24 PM
Sonoma 14.3.1 大丈夫説 あるな
Avatar
@Iceman この前wasm試してたけど、OSってSonomaいくつですか?
Avatar
えー覚えてないですね 家帰ったら確認します
Avatar
ありがとうございます
11:31 PM
@el_metal エルさんはwasm sdkのインストールまではいけたんでしたっけ。macOSのバージョンが知りたいです。
Avatar
@omochimetaru まだドキュメント読んだだけで今日進めるつもりだから何かの検証はできそう
Avatar
なるほど Sonoma14.4だとだめかもなあ
12:19 AM
main or 6.0の場合:4/2版ぐらいから壊れてるらしいので3/28ぐらいの版を使う 5.10の場合: Xcode同梱+wasm sdkを使う、ただしswift testはできない いずれの場合もswift sdkコマンドが使えなくてexperimental-sdkを使うのでスクリプトの類を修正必要
12:21 AM
5.10のswift testについてはswift-packageを新しいソースからビルドして置き換えたら動くかも まあしばらくテストはできなくても良いかも
12:21 AM
新しいmainならマニュアル通りで良いけどSonoma14.4では無理かも
12:22 AM
外出するので最低限書いといた
❤️ 1
Avatar
Avatar
omochimetaru
@Iceman この前wasm試してたけど、OSってSonomaいくつですか?
14.4.1でした
8:21 AM
テストは動かしてないですね
Avatar
omochimetaru 5/11/2024 8:53 AM
あ、あれ?14.4でも大丈夫な場合もあるのか
Avatar
ツールチェインが古いんじゃないですか?
Avatar
omochimetaru 5/11/2024 9:02 AM
やってたの4月下旬だったけど、どうかな
Avatar
あれ,kateinoigakukun さんの説明だと 4/5 にマージされた PR がトリガーじゃないかって書かれてましたが,DEVELOPMENT-SNAPSHOT-2024-04-04-a とか 04-02-a でも macOS 14.5 RC だとセグメンテーションフォルトが起こりますね (edited)
Avatar
macOS 14.4.1 でも DEVELOPMENT-SNAPSHOT-2024-04-02-a で swift package --versionswift experimental-sdk install でセグメンテーションフォルト起きました.
Avatar
Avatar
Iceman
テストは動かしてないですね
omochimetaru 5/12/2024 2:36 PM
使った Swift ツールチェーンのバージョンと、インストールした Swift Wasm SDK のバージョンも知りたいです
Avatar
Avatar
omochimetaru
https://github.com/apple/swift-package-manager/pull/7400 これはマージされたから5.10のswift testは直りそうだけど、もう5.10はリリースされなそうか
omochimetaru 5/12/2024 5:09 PM
そっちじゃなくてこっちだった https://github.com/apple/swift-package-manager/pull/7351/files
🍒 #7341 Explanation: swift build --build-tests fails on WASI after the experimental summary output, which is introduced in 5.10. This affects not only experimental-summary mode but also the defau...
Avatar
omochimetaru 5/12/2024 5:23 PM
7341 が main での修正で、 5.10 系向けに cherry pick したのが 7351 だが
5:25 PM
5.10 snapshot が 3/2 が最後で、5.10 release が 3/5 が最後で打ち止めになっている
5:25 PM
7351 がマージされたのが 4/3 だから、せっかく cherry pick したのに意味無し
Avatar
Avatar
kebo
macOS 14.4.1 でも DEVELOPMENT-SNAPSHOT-2024-04-02-a で swift package --versionswift experimental-sdk install でセグメンテーションフォルト起きました.
omochimetaru 5/12/2024 5:43 PM
72587の withUnsafeContinuation(isolation:) 以外に、それ以前に導入された backDeploy 付きの6.0 API を探してみました
5:44 PM
↑このパッチで 5.11 から 6.0 の書き換えが網羅されているのでわかりやすくて
5:46 PM
_willThrowTyped はこの時点で if #available だったので、
5:46 PM
typed throw による例外送出が起きたらクラッシュしそうに思います。 (edited)
5:46 PM
でも swift package --version ですら落ちるのは、該当しないから、謎ですね。
5:52 PM
6.0 snapshot は 3/21 からで、7341 がマージされたのが 4/3 で、 72578 がマージされたのが 4/5 だから
5:53 PM
4/3, 4/4 の2日間だけ、 swift test が WASI で実行可能 かつ、 6.0 API の 9999 バグを踏まない、最高の 6.0 ロットになってる (edited)
5:54 PM
しかし kebo さんによると 04-02-a で クラッシュが起きてしまうので、 やっぱりダメかもしれない。
Avatar
Avatar
omochimetaru
使った Swift ツールチェーンのバージョンと、インストールした Swift Wasm SDK のバージョンも知りたいです
SwiftはXcode15.3に付属のやつで、SDKは5.10-SNAPSHOT-2024-04-26-a-wasmでした
Avatar
ありがとうございます
Avatar
[omochi@omochi-iMacPro ~]$ swift --version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) [omochi@omochi-iMacPro ~]$ swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.10-SNAPSHOT-2024-04-26-a/swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle.zip Downloading a Swift SDK bundle archive from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.10-SNAPSHOT-2024-04-26-a/swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle.zip`... Swift SDK bundle archive successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.10-SNAPSHOT-2024-04-26-a/swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle.zip`. Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.10-SNAPSHOT-2024-04-26-a/swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle.zip` is assumed to be an archive, unpacking... Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.10-SNAPSHOT-2024-04-26-a/swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle.zip` successfully installed as swift-wasm-5.10-SNAPSHOT-2024-04-26-a-macos_x86_64.artifactbundle. [omochi@omochi-iMacPro ~]$ swift experimental-sdk list 5.10-SNAPSHOT-2024-04-26-a-wasm Icemanの構成は多分こうだな 5.10系ベースの作業だから問題が起きるのは $ swift test だけで、 それはやってないという事だから、大丈夫だったんだ
12:03 AM
Icemanは僕のマニュアルに完全に従ったわけじゃなくて、 ツールチェーンをdev snapshotにする手順はスキップしてXcode版を使った この場合は僕のスクリプトは experimental-sdk じゃなくて sdk で書かれてるから互換性の問題があるけど、 Icemanは自作のアプリケーションを組んでみただけだから特にそのへんも使ってなくて踏んでないという事かな (edited)
Avatar
そうですね。色々サボった上で手でビルドコマンドうってました
Avatar
謎が一つ解消しました。
Avatar
macが修理から帰ってきた 気になるバージョンは Sonoma 14.1 だった
Avatar
#include <stdio.h> #include <stdint.h> extern int8_t $ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF(int64_t major, int64_t minor, int64_t patch); int main() { int8_t y = $ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF(9999, 0, 0); printf("%d\n", y); return 0; }
12:00 PM
$ clang -L $(xcrun --show-sdk-path)/usr/lib/swift -lswiftcore v.c && ./a.out 0
12:01 PM
ちゃんと14,0,0 や 14,1,0 で呼び出したら1 になったからリンクできてるっぽい
12:01 PM
なので macOS 14.1 に同梱の libswiftCore には 9999 magic は入ってない
Avatar
14.4.1 にアップデートしたら 9999 magic 入った!!
12:35 PM
いくつで 9999 magic が入ったのか気になるな。問題解決には役に立たないけど、Swift for Wasm 開発における初心者のハマりをサポートしやすくなる。 14.2 や 14.3 の人がいたら、試してもらえると嬉しい。
12:37 PM
ワンチャン思うんだけど、9999 magicって出荷用macOSではそもそも含めない運用だったけど、14.4.1 で事故って入っちゃったんじゃないか・・・? (edited)
12:37 PM
それなら14.4.2 で除去してくれたら解決して楽
Avatar
14.5 RC でセグメンテーションフォルトが起こっているのがそれが原因なら,早くても 14.5.1 or 14.6 ですかね...?
Avatar
あ、そうですね。
12:49 PM
[omochi@omochi-mbp ~]$ xcode-select -p /Applications/Xcode15.3.app/Contents/Developer [omochi@omochi-mbp ~]$ swift --version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) Target: arm64-apple-macosx14.0 [omochi@omochi-mbp ~]$ xcode-select -p /Applications/Xcode15.4-beta.app/Contents/Developer [omochi@omochi-mbp ~]$ swift --version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) Target: arm64-apple-macosx14.0 [omochi@omochi-mbp ~]$ xcode-select -p /Applications/Xcode15.4-rc.app/Contents/Developer [omochi@omochi-mbp ~]$ swift --version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) Target: arm64-apple-macosx14.0 ついでに確認。XcodeのSwiftは15.3から15.4 RC にかけて全く変化していないらしい。
12:50 PM
Swift 5.10 が打ち止めしてて Xcode 15.4 は Swift 5.10 という方針ぽいね。
12:50 PM
これが Swift 6.0 だったらめちゃくちゃめんどいけど、しばらくは 5.10 をメインサポートにするのが良さそう
Avatar
omochimetaru 5/13/2024 1:19 PM
runner.swift をなんとかパッチして無理やり5.10で運用できないか試してるけど例のパッチを真似してもなんかダメだな /Users/omochi/github/omochi/swift-react/.build/wasm32-unknown-wasi/debug/swift-reactPackageTests.derived/runner.swift:31:31: error: value of type 'Data' has no member 'write' _ = try? data.write(to: URL(fileURLWithPath: self.testOutputPath)) ~~~~ ^~~~~ /Users/omochi/github/omochi/swift-react/.build/wasm32-unknown-wasi/debug/swift-reactPackageTests.derived/runner.swift:396:42: error: value of type 'Bundle' has no member 'bundleIdentifier' bundleIdentifier: testBundle.bundleIdentifier, ~~~~~~~~~~ ^~~~~~~~~~~~~~~~
1:25 PM
ツールチェーンをWasm SDK と対応する 5.10-0302に変えても同じだ なんだろこれ
Avatar
swiftwasm-build 側の PR 相当の変更が入っていないところですね. https://github.com/swiftwasm/swift/issues/5551#issuecomment-1789821715
Avatar
omochimetaru 5/13/2024 1:32 PM
あ、これは見落としてました ありがとうございます
1:35 PM
え〜 Foundation をビルドするところの改造なのか https://github.com/swiftwasm/swiftwasm-build/pull/226
Unlocked all Bundle APIs Reduce diffs Add validation tests
1:35 PM
これはちょっと・・・無理だ
1:40 PM
そうすると 5.10 は swift test 無理だなあ
Avatar
Avatar
kebo
あれ,kateinoigakukun さんの説明だと 4/5 にマージされた PR がトリガーじゃないかって書かれてましたが,DEVELOPMENT-SNAPSHOT-2024-04-04-a とか 04-02-a でも macOS 14.5 RC だとセグメンテーションフォルトが起こりますね (edited)
omochimetaru 5/13/2024 1:53 PM
これ、追従して確認できてしまった・・・ 6.0 snapshot 04-04 で $ swift package --version zsh: segmentation fault swift package --version (edited)
1:58 PM
Thread 1 Crashed: 0 ??? 0x0 ??? 1 swift-package 0x1044756a0 static AsyncParsableCommand.main() + 72 2 swift-package 0x10445a331 specialized static SwiftPM.main(execName:) + 1 3 swift-package 0x10445a779 specialized static SwiftPM.main() + 1 4 swift-package 0x104459bc5 specialized thunk for @escaping @convention(thin) @async () -> () + 1 5 libswift_Concurrency.dylib 0x25125b149 completeTaskAndRelease(swift::AsyncContext*, swift::SwiftError*) + 1
1:58 PM
なんだこれ。
2:02 PM
これに飛び込んだ瞬間に死んでいる
2:02 PM
@available(macOS 10.15, macCatalyst 13, iOS 13, tvOS 13, watchOS 6, *) extension AsyncParsableCommand { /// Executes this command, or one of its subcommands, with the program's /// command-line arguments. /// /// Instead of calling this method directly, you can add `@main` to the root /// command for your command-line tool. public static func main() async { do { var command = try parseAsRoot() if var asyncCommand = command as? AsyncParsableCommand { try await asyncCommand.run() } else { try command.run() } } catch { exit(withError: error) } } }
2:04 PM
いや、ここには入ってて、その先で飛ぼうとした関数ポインタがリンクできてないのか?
Avatar
omochimetaru 5/13/2024 2:13 PM
lldb力が足りないなー
2:15 PM
swift-6.0 snapshot 03-26 でも $ swift package --version でクラッシュするな
2:16 PM
isOSVersionAtLeast とは関係ない別の問題もあんのかな (edited)
2:19 PM
当然?最新の trunk snapshot 05-01 でも同じだ
2:20 PM
これはこれで報告するか
Avatar
omochimetaru 5/13/2024 2:33 PM
いや、73327の報告時点から、package --version なのか。 (edited)
Avatar
omochimetaru 5/13/2024 2:41 PM
--version オプションがくると、 swift-argument-parser は ParserError.versionRequested を throw するらしい
2:46 PM
swift_willThrow is called with an error right before it is thrown. This existing entrypoint requires an already-boxed error existential; with typed errors, we don&#39;t have the error existen...
2:47 PM
もしかして、コードが typed throws じゃなくても、とりあえず throw の起点で willThrowTyped が呼ばれる?
2:51 PM
そんなことはなさそうだ
2:58 PM
謎だなあ 0326版でも落ちたってことはそもそもwithCheckedContinuationのバージョンアップは関係なさそうだし
Avatar
macOS 14.5 RC だと以下のような感じで,全部が同じってわけじゃないので,実はセグメンテーションフォルトの原因は複数ある可能性もありそうです.
  • swift package --version: 04-02-a も 05-01-a もセグフォ
  • swift experimental-sdk list: 04-02-a も 05-01-a もセグフォなし
  • swift experimental-sdk install: 04-02-a も 05-01-a もセグフォ
  • swift experimental-sdk install a: 04-02-a はセグフォなしで 05-01-a はセグフォ (ここだけ違う)
Avatar
omochimetaru 5/13/2024 3:01 PM
なるほど
Avatar
omochimetaru 5/13/2024 3:08 PM
うーん 6.0も手元でなんとかするのは無理そうだなあ
3:09 PM
6.0が本流で直るまで、5.10をメインサポートにして mac での wasm での swift test を諦める か (edited)
3:09 PM
Swift 5.9 をメインサポートにすることにするか ただしその場合は Function 型 の variadic generics を諦めないといけない (edited)
Avatar
Xcode を諦めるなら Docker でとか VS Code なら Dev Container でとかありますけどね...
Avatar
Avatar
kebo
Xcode を諦めるなら Docker でとか VS Code なら Dev Container でとかありますけどね...
omochimetaru 5/13/2024 3:11 PM
swift test (WASI) だけ Docker はありかもしれませんね
t_naruhodo 1
3:12 PM
Docker の中から WEBDRIVER って使えるんだろうか
3:14 PM
あ、5.10ではどちらにせよtestができないから、 開発: mac + 5.10 swift test: Docker + 6.0 か
3:17 PM
まあDockerの中で完結していてもいいか
3:24 PM
そうするとプロジェクトが5.10と6.0のクロスになって、 experimental-sdk と sdk を切り替えるのか・・・
Avatar
一応 experimental-sdk は deprecated ですが残されるみたいですよ (どうせなら新しい方を使いたいですが)
Avatar
omochimetaru 5/13/2024 3:25 PM
あ、そうなんですね。じゃあしばらくそれで粘ろう。
Avatar
土日は結局子供に割り込まれてwasm32-unknown-wasiの置き場所が見つけられなくて終わってしまった
Avatar
omochimetaru 5/14/2024 1:54 AM
育児お疲れ様ですw
1:54 AM
置き場所ってどういう意味ですか?
Avatar
swift experimental-sdk listNo Swift SDKs are currently installed.だったのでどこかから取ってこないととなり探している間に終わりました
Avatar
https://github.com/swiftwasm/swift/releases ここらへんにあるartifactbundleなんですよね
Avatar
omochimetaru 5/14/2024 2:04 AM
その手順はこの辺りで説明しています。 https://github.com/omochi/swift-react/blob/main/docs/configure.ja.md (edited)
Avatar
Avatar
Iceman
https://github.com/swiftwasm/swift/releases ここらへんにあるartifactbundleなんですよね
swiftwasmのreleasesまでは辿り着いてどのバージョンかわからず探し回ってました
Avatar
Avatar
omochimetaru
その手順はこの辺りで説明しています。 https://github.com/omochi/swift-react/blob/main/docs/configure.ja.md (edited)
完全な説明があった、再開時に読みます
Avatar
Avatar
el_metal
完全な説明があった、再開時に読みます
omochimetaru 5/14/2024 2:14 AM
まあ、読まなくてもいいですよ。 ところで、Sonomaのバージョン幾つですか? 14.4.1 だと面倒なことになることがここ数日ではっきりとわかりました。
Avatar
バージョン14.5(23F79)
Avatar
omochimetaru 5/14/2024 2:14 AM
あれ、beta?
Avatar
これはbetaですね 特に理由はないから問題発生したら戻しても良いやつです
Avatar
omochimetaru 5/14/2024 2:15 AM
なるほど。なおkeboさんによれば14.5RCでもダメ・・・
😇 1
2:15 AM
$ swift package --version ですら死ぬんですよね
2:16 AM
あーいや
2:16 AM
えっと、mac 14.5 と Swift 6.0 の組み合わせがダメなだけで
2:16 AM
Swift 5.10 系 (Xcode15.3 or 15.4 ) なら大丈夫。
2:16 AM
ただし $ swift test だけはできない。
Avatar
たまたま5.10系で進めようとしてたから踏んでないですね
🆗 1
Avatar
omochimetaru 5/14/2024 2:16 AM
Swift React を動かしたりする分には $ swift build なので (testじゃないから) 大丈夫。
🙆‍♂️ 1
Avatar
Avatar
omochimetaru
あれ、beta?
23F79 は RC でしたが昨晩正式版に格上げされましたよ.正式版です. (edited)
Avatar
omochimetaru 5/14/2024 5:06 AM
出たんですね,僕もいれよう
5:07 AM
昨日14.4.1いれたのにw
Avatar
昨日正式版になったんですね タイミングがややこしいことになってしまったw
Avatar
omochimetaru 5/14/2024 5:28 AM
ほんとだ、降ってきた
Avatar
omochimetaru 5/14/2024 1:16 PM
[omochi@omochi-mbp swift-react (swift510 *%)]$ docker/run srt bash + docker run -it -v/Users/omochi/github/omochi/swift-react:/work -w /work srt bash root@a6b7229d9153:/work# ls BrowserTests CartonExample Codegen LICENSE Package.resolved Package.swift README.ja.md README.md Sources Tests bin docker docs temp root@a6b7229d9153:/work# bin/test + swift build --experimental-swift-sdk wasm32-unknown-wasi --build-tests --disable-build-manifest-caching --static-swift-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv -Xlinker --stack-first -Xlinker --global-base=1048576 -Xlinker -z -Xlinker stack-size=1048576 warning: `--experimental-swift-sdk` is deprecated and will be removed in a future version of SwiftPM. Use `--swift-sdk` instead. warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /work/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... warning: Could not read SDKSettings.json for SDK at: /root/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable warning: Could not read SDKSettings.json for SDK at: /root/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable [5/5] Emitting module swift_reactPackageTests Build complete! (1.11s) + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser
1:16 PM
dockerの中から CartonFrontend test してみたけど固まったのはブラウザが入ってないからだろうか
1:18 PM
--environment browser なしだと + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm Error: No WASI runtime found. Please install one of the following: wasmtime, wasmer ちゃんと入ってないっていうけど (edited)
Avatar
omochimetaru 5/14/2024 1:28 PM
root@a6b7229d9153:/work# which chromedriver /usr/bin/chromedriver root@a6b7229d9153:/work# ls BrowserTests CartonExample Codegen LICENSE Package.resolved Package.swift README.ja.md README.md Sources Tests bin docker docs temp root@a6b7229d9153:/work# export WEBDRIVER_PATH=/usr/bin/chromedriver root@a6b7229d9153:/work# bin/test + swift build --experimental-swift-sdk wasm32-unknown-wasi --build-tests --disable-build-manifest-caching --static-swift-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv -Xlinker --stack-first -Xlinker --global-base=1048576 -Xlinker -z -Xlinker stack-size=1048576 warning: `--experimental-swift-sdk` is deprecated and will be removed in a future version of SwiftPM. Use `--swift-sdk` instead. warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /work/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... warning: Could not read SDKSettings.json for SDK at: /root/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable warning: Could not read SDKSettings.json for SDK at: /root/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable [5/5] Emitting module swift_reactPackageTests Build complete! (1.16s) + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser
1:29 PM
apt-getで chromium-browser と chromium-chromedriver を入れて WEBDRIVER_PATH を指定してみたけど同じような感じで沈黙している
Avatar
きっとchromedriverがエラーを出してくれてるんだろうけどcartonが報告できてないんだとおもう
Avatar
omochimetaru 5/14/2024 1:30 PM
なるほど
Avatar
WebDriverClientまわりがよろしくない
Avatar
omochimetaru 5/14/2024 1:32 PM
ちょっとみてみる
Avatar
ありがたし
Avatar
omochimetaru 5/14/2024 1:42 PM
Xcodeのこんなとこにプラグインのボタンあった
1:44 PM
Xcodeのプロジェクト単位のインデント設定ってPackage.swift の場合使えないよなあ
1:50 PM
あ、しまった、 --headless を指定してなかった
1:51 PM
けど、ダメだな、別の問題は起きた
1:51 PM
[5/5] Emitting module swift_reactPackageTests Build complete! (0.74s) + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser --headless run() 155 enter run() 169 server.start run() 174 if headless - checking WebDriver endpoint: WEBDRIVER_REMOTE_URL - checking WebDriver executable: WEBDRIVER_PATH - checking WebDriver executable in PATH: chromedriver, geckodriver, safaridriver, msedgedriver Launch WebDriver executable: /usr/bin/chromedriver newSession enter newSession enter newSession enter newSession enter run() 193 catch Error: httpError("")
1:51 PM
なんかこの空のhttpError前見たな まあ追ってみよう
Avatar
omochimetaru 5/14/2024 2:23 PM
ホストのsafariのwebdriverに繋げたいがsafariが待ち受けてるポート番号がわからない・・・
Avatar
safaridriver -p ポート番号 で指定できませんかね?
Avatar
omochimetaru 5/14/2024 2:31 PM
それはやってみたんだけど、lsof見ても何も起きてない感じがするんですよね
Avatar
私は lsof に出てきましたよ
Avatar
omochimetaru 5/14/2024 2:31 PM
むむ
Avatar
sudo lsof -i -P | grep LISTEN とかで確認しました
Avatar
omochimetaru 5/14/2024 2:33 PM
[omochi@omochi-mbp ~]$ sudo safaridriver --enable --port 17050 Password: [omochi@omochi-mbp ~]$ sudo lsof -i -P | grep LISTEN remoted 1119 root 5u IPv6 0xd0de49af35499627 0t0 TCP [fdc8:fba4:126c::2]:53195 (LISTEN) remoted 1119 root 7u IPv6 0x52292580606b05e6 0t0 TCP omochi-mbp.local:53191 (LISTEN) rapportd 1596 omochi 8u IPv4 0xe8d6be9266e195d6 0t0 TCP *:51137 (LISTEN) rapportd 1596 omochi 9u IPv6 0x15d7a11c09620632 0t0 TCP *:51137 (LISTEN) ControlCe 1674 omochi 8u IPv4 0x88e981bae7ea5bbb 0t0 TCP *:7000 (LISTEN) ControlCe 1674 omochi 9u IPv6 0xfc82083d7a198a98 0t0 TCP *:7000 (LISTEN) ControlCe 1674 omochi 10u IPv4 0xee38eb95712c7518 0t0 TCP *:5000 (LISTEN) ControlCe 1674 omochi 11u IPv6 0xb5908ffeaaf9caaf 0t0 TCP *:5000 (LISTEN) Spotify 1833 omochi 79u IPv4 0x86ee11d1436b4266 0t0 TCP *:57621 (LISTEN) Spotify 1833 omochi 167u IPv4 0x39ffee1aad0ac3fd 0t0 TCP *:50640 (LISTEN) Discord 2291 omochi 55u IPv4 0x2801755917c85bfb 0t0 TCP localhost:6463 (LISTEN) postgres 2620 omochi 6u IPv6 0xf5f90438e844e502 0t0 TCP *:5432 (LISTEN) postgres 2620 omochi 7u IPv4 0x2a937b5b848bb485 0t0 TCP *:5432 (LISTEN) minio 2621 omochi 13u IPv4 0x72943b925f8e67bb 0t0 TCP localhost:9000 (LISTEN) minio 2621 omochi 14u IPv6 0x4a5863c55dd6b38b 0t0 TCP *:9000 (LISTEN) minio 2621 omochi 15u IPv6 0x14a12d1a8a02ab08 0t0 TCP localhost:9000 (LISTEN) minio 2621 omochi 17u IPv6 0x2e68ab3e07de3095 0t0 TCP *:49482 (LISTEN) Dropbox 2627 omochi 96u IPv4 0x7f66e570c96ba2ff 0t0 TCP localhost:17600 (LISTEN) Dropbox 2627 omochi 100u IPv4 0x464c961894095d2a 0t0 TCP localhost:17603 (LISTEN) 手順はあってますかね?
2:34 PM
これはあれかな、safari自動くんが壊れがち問題かな
2:34 PM
再起動してみよう
Avatar
safaridriver -p ポート番号 ですね.--enable が余計なんだと思います.
Avatar
omochimetaru 5/14/2024 2:38 PM
あ〜ほんとだ そういうことか
2:38 PM
成功するとコマンドがブロックするんですね
Avatar
ですね.フォアグラウンドジョブのままになりますね.
Avatar
omochimetaru 5/14/2024 2:38 PM
その間使えるよって仕組みなのか。
Avatar
omochimetaru 5/14/2024 2:47 PM
ありがとうございます、繋がったっぽい、ダメだったけど Error: httpError("{\"value\":{\"error\":\"invalid argument\",\"message\":\"\'Host\' header or \'Origin\' header is specified and is not localhost.\",\"stacktrace\":\"\"}}")
2:47 PM
safaridriverはlocalhostアクセスじゃないと気に食わないみたいだ
2:48 PM
今これ WEBDRIVER_REMOTE_URL=http://host.docker.internal:7055
2:51 PM
エラーメッセージで調べたらchromedriverの場合はオプションを足すと穴が開くらしい
2:52 PM
中でheadlessで完結させる方が楽そうだな
Avatar
こういうところでは Host ヘッダを localhost にすることで対応してたりするみたいですね. https://github.com/aerokube/selenoid/pull/1106/files#diff-d35ea78528174635da15762a20dcb5043d652bbf66b5c87b975f700701882400R509
Avatar
omochimetaru 5/14/2024 2:56 PM
それいいんだ・・・
3:02 PM
Command '/usr/bin/chromedriver' requires the chromium snap to be installed. Please install it with: snap install chromium chromeはapt-getのやつはもうダメらしい
3:02 PM
macのsafari叩いてみよう (edited)
3:07 PM
あ〜
3:07 PM
黄色いSafari開いたぞ
Avatar
omochimetaru 5/14/2024 3:19 PM
うーむ? macからdockerへの接続が通らない
3:20 PM
8080空いてないのかな
3:22 PM
中から通るな
3:22 PM
dev serverは居る (edited)
3:22 PM
あ、もしかして
Avatar
omochimetaru 5/14/2024 3:30 PM
うーん。dev serverが127.0.0.1 で立つせいだと思って 0.0.0.0 にしてみたけど変わらんな
3:33 PM
あ〜
3:37 PM
あーできた test.js が通った
3:37 PM
次はwebsocket
3:41 PM
test.js が返ってこないのなんだ
Avatar
omochimetaru 5/14/2024 3:53 PM
@Yuta Saito https://github.com/swiftwasm/carton/blob/e0dbe6a2fe470a626faa981843c7c9323adc8925/Sources/CartonKit/Server/Application.swift#L67 Cartonのdev serverが、 test コマンドの場合に test.js を返す制御ってどこですか? configuration.entrypointtest.js って書いてあるんだけど、 routerの実装で configuration.entrypoint を読んでる部分がないので、 配送できないように見える 実際 index.html は取れるけど test.js は取れない [omochi@omochi-mbp swift-react (swift510 *%)]$ curl -v http://127.0.0.1:8080/ * Trying 127.0.0.1:8080... * Connected to 127.0.0.1 (127.0.0.1) port 8080 > GET / HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/8.6.0 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: text/html < Content-Length: 228 < Connection: close < <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script type="module" src="test.js"></script> </head> <body> </body> * Closing connection </html>% [omochi@omochi-mbp swift-react (swift510 *%)]$ curl -v http://127.0.0.1:8080/test.js * Trying 127.0.0.1:8080... * Connected to 127.0.0.1 (127.0.0.1) port 8080 > GET /test.js HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/8.6.0 > Accept: */* > < HTTP/1.1 404 Not Found < Connection: close < Content-Length: 0 < * Closing connection
📦 Watcher, bundler, and test runner for your SwiftWasm apps - swiftwasm/carton
3:57 PM
あ〜もしかして .carton/static
Avatar
うげ、ここ~/.carton/ベタ書きしてる
4:01 PM
テストカバレッジ足りてないなぁ
Avatar
omochimetaru 5/14/2024 4:01 PM
どこお
4:01 PM
print("\(#function) \(#line) \(FileManager.default.homeDirectoryForCurrentUser)") var responders = [ self.makeStaticResourcesResponder( baseDirectory: FileManager.default.homeDirectoryForCurrentUser .appendingPathComponent(".carton") .appendingPathComponent("static") ) ] ↑これが /root になってることは確認できた (edited)
Avatar
omochimetaru 5/14/2024 4:02 PM
あれ、ここか
4:02 PM
respond(context:head:) 116 file:///root/ ちゃんと /root だったよ
4:02 PM
root@df5f8f3e3a18:/work/carton# ls -al /root total 40 drwx------ 1 root root 4096 May 14 12:40 . drwxr-xr-x 1 root root 4096 May 14 15:33 .. -rw-r--r-- 1 root root 3106 Oct 15 2021 .bashrc drwx------ 1 root root 4096 May 14 15:34 .cache drwxr-xr-x 1 root root 4096 May 14 12:40 .local -rw-r--r-- 1 root root 161 Jul 9 2019 .profile drwxr-xr-x 1 root root 4096 May 14 15:34 .swiftpm
4:02 PM
ただ、ないんだよな
4:02 PM
いつできるんだろ?
Avatar
さいきん.buildに移動したんすよ
Avatar
omochimetaru 5/14/2024 4:03 PM
ん、つまり普通にバグってる?
Avatar
その時に漏れた
4:03 PM
バグってる
Avatar
omochimetaru 5/14/2024 4:03 PM
ww
4:03 PM
俺も踏まなかったのは
4:03 PM
古いバージョンの時にhomeにできたやつが残ってたからかw
Avatar
クリーンな環境じゃないと踏まないやつw
Avatar
omochimetaru 5/14/2024 4:03 PM
Dockerできれいな環境にして踏んじゃったのか
4:04 PM
なるほど。今日は寝ます。
Avatar
💤
Avatar
ちょいちょいで直るかと思ってスマホから読んでたけど、想定解が微妙にわからんかったし他にも気になる部分が出てきた
Avatar
omochimetaru 5/15/2024 1:10 AM
まあ一旦古いの使うか
Avatar
とりあえず回避してreact進めるか carton を改善するか 迷う
11:40 AM
Cartonやっとくか
Avatar
頭から追ってるけどマジで曲芸だらけで笑う
Avatar
omochimetaru 5/15/2024 1:29 PM
色々面白いところあるけどdev pluginがmkfifoしてからfrontend叩いて、 frontendのFS watchをそれに転送して、 ずっとブロックされてるプラグインプロセスが SwiftPM Plugin API 経由で都度ビルドするところが一番やばい (edited)
1:31 PM
一見SwiftPMに想定された使い方じゃなさそうだけどよく考えると想定にうまくハマってるような気もする。 (edited)
Avatar
IPCだらけ😱
Avatar
omochimetaru 5/15/2024 1:45 PM
現時点で直したい箇所が15個あった
Avatar
めちゃある
Avatar
omochimetaru 5/16/2024 4:30 PM
https://github.com/swiftwasm/carton/pull/434 dev server が dev.js を配送できない問題の再現テストができた 大変だった
後で書く #433 の続きです 現在バグがあって dev.js が配送できていません。
Avatar
Linuxってexpect failure書けないんだ
Avatar
Swift/ErrorType.swift:200: Fatal error: Error raised at top level: Response from https://api.github.com/repos/swiftwasm/swift/releases/tags/swift-wasm-5.9.2-RELEASE had invalid status 403 or didn't contain body
12:43 AM
CIから叩きすぎてGitHub APIがrate limitかけた奴かなこれ
Avatar
@omochimetaru どの順でマージしたらよいですか?
Avatar
omochimetaru 5/17/2024 1:03 AM
@Yuta Saito 今作った #435 は単発でマージできる。 #433 は単発で、これだけマージできる。 #434 は #433 を含んでてそれの続きになってる。
1:04 AM
main <- 435 main <- 433 <- 434
1:05 AM
433も434もGitHub APIでCIがエラーになってるから、それを直すための準備で 435 を立てたところ。
Avatar
どもども
Avatar
omochimetaru 5/17/2024 1:06 AM
434 はまだ CI で何か問題が起きてそうだから調査してて、GitHub上では DNMの気持ちでDraft PR にしてある。 (edited)
Avatar
omochimetaru 5/17/2024 1:34 AM
単発でマージできる #436 を追加したよ、本業に戻ります
Avatar
omochimetaru 5/17/2024 2:10 PM
Swift/ErrorType.swift:200: Fatal error: Error raised at top level: Response from https://api.github.com/repos/swiftwasm/swift/releases/tags/swift-wasm-5.9.2-RELEASE had invalid status 403 with a body of 279 bytes: {"message":"API rate limit exceeded for 13.105.117.68. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)","documentation_url":"https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"}
2:13 PM
やっぱりそうだった
Avatar
omochimetaru 5/17/2024 2:47 PM
TRACE fs home=/Users/runner [".net", ".config", ".yarn", "bootstrap", ".CFUserTextEncoding", ".bashrc", ".carton", "image-generation", ".vcpkg", ".local", "imagedata.json", "Desktop", "Library", "downloader", ".azcopy", "actionarchivecache", ".azure-devops", ".cargo", ".android", ".bash_sessions", "hostedtoolcache", "work", ".rustup", ".ssh", "Movies", ".dotnet", ".gradle", ".Trash", "systeminfo.md", "runners", ".npm", "systeminfo.json", "Documents", ".bash_profile", ".swiftpm", "Downloads", ".cache", ".gitconfig", ".Azure"] TRACE dot carton ["static"]
2:47 PM
ふ〜む? .carton/static が、居るぞ
2:48 PM
- name: Build and install JavaScript and sanitizer resources run: | set -ex npm install swift run carton-release hash-archive mkdir -p $HOME/.carton cp -r static $HOME/.carton これかっ
Avatar
omochimetaru 5/17/2024 2:58 PM
@Yuta Saito Stack Overflow Sanitizer って何ですか?追加されてった痕跡は見つかるけど、その後消えていった流れが調べても出てこなくて経緯が追えない
Avatar
omochimetaru 5/17/2024 3:11 PM
Breaking changes: carton CLI is now slimmed down to be a SwiftPM Plugin. This means that you can now use carton by just declaring it as a dependency in your Package.swift file. dependencies: [ ...
3:11 PM
これか・・・?
3:16 PM
https://github.com/swiftwasm/carton/commit/2e62088305496e615cc6281961614b1f1324a0b5 こっちが実際のコミット?だ Builder.swift がなくなって、それによってStackSanitizerを埋め込む動作がなくなっている?
Avatar
リンク後プログラム変換でサニタイザーを独自で実装してたけど真面目にclangの-fstack-sanitizerが動くようにwasi-libcを直したので必要なくなった
Avatar
omochimetaru 5/17/2024 3:20 PM
なるほど
3:22 PM
WasmTransformer パッケージも不要になったのかと思ったが、 stripCustomSections って関数だけ使われているらしい
Avatar
omochimetaru 5/18/2024 1:20 AM
あ〜
1:20 AM
swift-test-linux: name: Build and test on Linux with Swift ${{ matrix.swift_version }} timeout-minutes: 40 runs-on: ubuntu-22.04 container: swift:${{ matrix.swift_version }} この container: を見落としていたというか意味が分かってなかった
1:20 AM
てっきりubuntu-22.04で動いているのかと思った
Avatar
omochimetaru 5/18/2024 2:25 AM
提案 現在 Linux の CI では Swift 公式コンテナイメージを利用しています。 これをやめて、ランナー環境に直接 Swift をインストールするようにしたいです。 インストール方法は Swift 公式サイトから tarball をダウンロードするのが良いと思います。 理由を以下に挙げます。 OS環境の構成がわかりづらい コンテナイメージは Swift だけでなく固有の OS環境を...
Avatar
setup-swiftの品質が微妙でやめちゃったんすよね
3:51 AM
自分でターボール展開するなら良さそう
👍 1
Avatar
omochimetaru 5/18/2024 3:51 AM
setup-swiftじゃなくて、tarballがいいと思ってます
3:52 AM
setup-swiftは色々微妙だったんでやめた
3:52 AM
swiftlyもこの前の件でもう嫌だ
3:52 AM
tarball最高
Avatar
シンプル!最高!
Avatar
omochimetaru 5/18/2024 3:52 AM
いや実際そうで
3:53 AM
CIでワンショットな環境に入れるだけなら
3:53 AM
それで良かったことに気づいた
Avatar
omochimetaru 5/18/2024 5:46 AM
やっぱりCIの変更は無限にハマるな
Avatar
omochimetaru 5/18/2024 7:00 AM
📦 Watcher, bundler, and test runner for your SwiftWasm apps - CI で Swift のインストールにコンテナイメージを使うのをやめて、 tarball からランナーに直接インストールする · swiftwasm/carton@cfc0997
7:00 AM
2回連続でここで止まってる なんだろう
7:01 AM
-v つけてみるか
Avatar
omochimetaru 5/18/2024 7:13 AM
他のmac止まってる 単に重いのかな
Avatar
論理バグかもしれんな 成功したところからやり直してみよう
Avatar
今のマージ早
Avatar
あのチェックはうざいなと思ってたので
Avatar
提出して、改めて読み返して、読み終わったらマージされてて笑った
12:13 PM
ありがとうございます
12:17 PM
うーん、 $ swift test がビルド終わった後着火しない
12:18 PM
848ae5a fix process env は完走できてて、同じ内容の 83755ca (HEAD -> look-ci, omochi/look-ci) investigate ci failures が止まってるから
12:18 PM
やっぱりGitHub側の問題なんだろうか
Avatar
なんだろうsshしてデバッグしてみるしかなさそう
Avatar
ステップがこれ以上刻めないと思ったけど、まあ手で $ swift test して見たら良いのか
12:24 PM
tmate、Linuxにしか入れないと思い込んでいた macも入れて便利
12:29 PM
めっちゃ重いけど動くな 出力が出ないぐらい重くなってそのままどこかで固まってるのかな
Avatar
May 18 12:44:00 installer[20690] <Info>: Set authorization level to none for session May 18 12:44:00 installer[20690] <Info>: Authorization is being checked, waiting until authorization arrives. May 18 12:44:00 installer[20690] <Info>: Packages have been authorized for installation. May 18 12:44:00 installer[20690] <Debug>: Will use PK session May 18 12:44:00 installer[20690] <Debug>: Using authorization level of none for IFPKInstallElement May 18 12:44:00 installer[20690] <Info>: PackageKit: Bypassing the enforcement checker since the destination is read/write May 18 12:44:00 installer[20690] <Info>: Starting installation: May 18 12:44:00 installer[20690] <Notice>: Configuring volume "Macintosh HD" May 18 12:44:00 installer[20690] <Info>: Preparing disk for local booted install. May 18 12:44:00 installer[20690] <Notice>: Free space on "Macintosh HD": 162.34 GB (162337476608 bytes). May 18 12:44:00 installer[20690] <Notice>: Create temporary directory "/var/folders/yv/tw23g49x7kb1jh_s6mf3zvyh0000gn/T//Install.20690Q5seDJ" May 18 12:44:00 installer[20690] <Notice>: IFPKInstallElement (1 packages) May 18 12:44:00 installer[20690] <Info>: Current Path: /usr/sbin/installer May 18 12:44:00 installer[20690] <Info>: Current Path: /bin/bash May 18 12:44:00 installer[20690] <Info>: Current Path: /usr/local/Cellar/tmate/2.4.0/bin/tmate May 18 12:44:00 installer[20690] <Error>: PackageKit: Service connection invalidated! May 18 12:44:00 installer[20690] <Error>: PackageKit: XPC error in -[_PKInstallClientConnection blockingProxy]_block_invoke_2 (Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.installd.user was invalidated: failed at lookup with error 3 - No such process." UserInfo={NSDebugDescription=The connection to service named com.apple.installd.user was invalidated: failed at lookup with error 3 - No such process.}) May 18 12:44:00 installer[20690] <Debug>: PackageKit: Received request to finish installation before PKInstallClient initialization was complete. Ignoring. May 18 12:44:00 installer[20690] <Error>: Couldn't instantiate install client: Error Domain=PKInstallErrorDomain Code=201 "An error occurred establishing a connection to the installation service." UserInfo={NSLocalizedDescription=An error occurred establishing a connection to the installation service.} May 18 12:44:00 installer[20690] <Info>: PackageKit: Bypassing the enforcement checker since the destination is read/write May 18 12:44:00 installer[20690] <Error>: Install failed.
Avatar
omochimetaru 5/18/2024 1:05 PM
bash-3.2$ swift run carton bundle warning: 'carton': /Users/runner/work/carton/carton/Package.swift:7:10: warning: Swift 5.9.1 or earlier is not supported by carton #warning("Swift 5.9.1 or earlier is not supported by carton") ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Building for debugging... Build complete! (1.09s) - checking Swift compiler path: /Users/runner/.carton/sdk/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/runner/.swiftenv/versions/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/runner/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift - checking Swift compiler path: /Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift Fetching release assets from https://api.github.com/repos/swiftwasm/swift/releases/tags/swift-wasm-5.9.2-RELEASE Response contained body, parsing it now... Response succesfully parsed, choosing from this number of assets: 14 Local installation of Swift version wasm-5.9.2-RELEASE not found Swift toolchain/SDK download URL: https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-macos_x86_64.pkg Archive size is 944 MB Downloading the archive 99% [=======================================================================================================================================================================--] saving to /Users/runner/.carton/sdk/wasm-5.9.2-RELEASE.pkgDownload completed successfully Unpacking the archive: installer -target CurrentUserHomeDirectory -pkg /Users/runner/.carton/sdk/wasm-5.9.2-RELEASE.pkg Running... installer -target CurrentUserHomeDirectory -pkg /Users/runner/.carton/sdk/wasm-5.9.2-RELEASE.pkginstaller: Package name is wasm-5.9.2-RELEASE installer: Installing at base path /Users/runner installer: The install failed.. Process failed and produced following output: Process failed with non-zero exit status and following output: and following error output: Swift/ErrorType.swift:200: Fatal error: Error raised at top level: Process failed with non-zero exit status and following output: and following error output: Illegal instruction: 4
1:05 PM
テストが起動する→その中で carton bundle する → SDK install しようとする → installer が fail する
1:05 PM
という流れでテストも通らなくなってることはわかった
Avatar
やば
Avatar
omochimetaru 5/18/2024 1:07 PM
インストーラ単体で試してるけど確かに失敗するが意味不明だ
1:08 PM
CIが止まってるのがこれのせいかはわからないけど、ただ、テストがプロセス叩く swiftRun がストリームできてないから、パイプが詰まって止まってる気はする
1:14 PM
$ sudo installer -target / -pkg swift-wasm-5.9.2-RELEASE-macos_x86_64.pkg -dumplog これは通る
1:14 PM
$ sudo installer -target CurrentUserHomeDirectory -pkg swift-wasm-5.9.2-RELEASE-macos_x86_64.pkg -dumplog これは通らない
1:17 PM
stepsの初手tmateでもダメだぞ
1:18 PM
actions/checkout@v4 より前だから、リポジトリは関係なくインストールができなくなった
Avatar
omochimetaru 5/18/2024 1:26 PM
この辺りの情報は変わってないな
1:26 PM
差異がわからない・・・
1:27 PM
swift-wasm pkgも手元でダウンロードしたらインストールできたから変わってない
Avatar
omochimetaru 5/18/2024 1:38 PM
ふむ。インストールはactionsに手書きしたらいけた。
1:38 PM
tmate / tmux からのアクセスだと installer がブロックするっぽい?どういう仕組みか全くわからんが
Avatar
omochimetaru 5/18/2024 1:50 PM
テストを空っぽにして1件だけ実行したら完走したしログもでた
1:50 PM
重すぎて終わらないだけかもしれないな 何が変わったのかわからないけど
1:56 PM
XCTestが出力をバッファするっぽいなあ すぐに出てこない
Avatar
omochimetaru 5/18/2024 2:11 PM
Test Case '-[CartonCommandTests.BundleCommandTests testWithDebugInfo]' passed (187.200 seconds).
2:12 PM
全部終わってから一気にログが出て、1件だけでこれだから、普通に40分かかってるだけなのかもしれん
2:17 PM
.carton ディレクトリ消したの関係あるかもな
Avatar
omochimetaru 5/18/2024 2:42 PM
メモ .cartonあり Test Case '-[CartonCommandTests.BundleCommandTests testWasmOptimizationOptions]' passed (219.886 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithDebugInfo]' passed (13.733 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithNoArguments]' passed (23.640 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithoutContentHash]' passed (7.714 seconds). .cartonなし Test Case '-[CartonCommandTests.BundleCommandTests testWasmOptimizationOptions]' passed (231.116 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithDebugInfo]' passed (14.156 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithNoArguments]' passed (23.088 seconds). Test Case '-[CartonCommandTests.BundleCommandTests testWithoutContentHash]' passed (7.911 seconds). (edited)
Avatar
omochimetaru 5/18/2024 2:51 PM
変わらんな!
2:52 PM
てかこのテンポなら走行しきれそうだし・・・
Avatar
M1ランナーならどうですか?
2:55 PM
GAのmacOSランナーめちゃくちゃ遅い印象ありますけどM1ランナーなら速いかも?
Avatar
Avatar
Iceman
GAのmacOSランナーめちゃくちゃ遅い印象ありますけどM1ランナーなら速いかも?
omochimetaru 5/18/2024 2:56 PM
今調べてるのは、元々15分で終わってたCIが、何も変わってないのに40分かかってタイムアウトするように悪化した理由なんですよね
2:56 PM
📦 Watcher, bundler, and test runner for your SwiftWasm apps - fix process env · swiftwasm/carton@848ae5a
Avatar
おおーなるほど。それは不思議‥というかかなり闇が深そうだ
Avatar
omochimetaru 5/18/2024 2:57 PM
それ以降はこれが15分だったのが、40分以上出力が出ないようになってしまった。 (edited)
2:57 PM
40分で死ぬのは、jobの設定でこっちで40分にしてるから。
2:58 PM
ずっとフリーズしてると思ってたんだけど、XCTestが出力を溜め込んでるだけで、実際に40分かかってるっぽい?とわかってきたのが今。でもまだ未確定。
Avatar
omochimetaru 5/18/2024 3:44 PM
あ〜〜〜わかったかもしれねえ〜〜〜
3:45 PM
.carton がないから、test.js が落ちてこなくて、ブラウザテストが永久に停止しないのか!
3:46 PM
たくさんあるテストのうちの TestCommand の ブラウザを開いて待つやつが腐っていたのか
3:47 PM
全部終わるまでXCTestからログが転送されてこないから、犯人を特定するのが困難すぎた
Avatar
omochimetaru 5/19/2024 6:36 AM
手元のmacだとXCTestからRunした時は PATH に homebrew のパスが入らないけど
6:36 AM
CIのmacさんは動いてそうだな
6:41 AM
世の中の人ってどうしてるんだろ
Avatar
XCTestからRunってXcodeからってことですか?
Avatar
omochimetaru 5/19/2024 6:42 AM
はい
6:43 AM
あ、そうか、 $ swift test だとまた違うのかな
Avatar
ぼくはビルドスキームでPATHを足す
Avatar
omochimetaru 5/19/2024 6:43 AM
やっぱそれか (edited)
6:43 AM
homebrew的には、 zshrcで eval "$(/opt/homebrew/bin/brew shellenv)" しろってなってて
6:44 AM
この手順は xcodebuild だと踏めないんだよね
6:44 AM
パッケージマネージャにhomebrewを使うとは限らないし、マシン環境でパスを通すなら自分でxcodeに設定しろ(テストとしてはパスが通ってる前提で実装する)って切り分けになるか (edited)
Avatar
うむ。それが行儀が良い方法だと思います
Avatar
omochimetaru 5/19/2024 6:45 AM
macOSで標準の、パッケージの追加方法がないのが気持ち悪いな
Avatar
世の中には勝手にシェルを起動してユーザのなんちゃらrcを読んでパスを通すぜ!ってやつもある
Avatar
omochimetaru 5/19/2024 6:46 AM
Linuxならaptとかyumとか、OS標準のCLI追加方法があるのに。 (edited)
Avatar
Avatar
Yuta Saito
世の中には勝手にシェルを起動してユーザのなんちゃらrcを読んでパスを通すぜ!ってやつもある
omochimetaru 5/19/2024 6:46 AM
テストケースで?w
Avatar
テストに限らず
Avatar
omochimetaru 5/19/2024 6:47 AM
いやー便利だけどそれのせいでハマった時キレそう (edited)
Avatar
全てのユーザがzsh使ってると思うなよ!
Avatar
omochimetaru 5/19/2024 6:48 AM
あ〜
6:48 AM
6:48 AM
ワイ最近やっと頑張って慣れ親しんだbashを捨ててzshに乗り換えた (edited)
6:51 AM
確認のお願いを書き終わったと思ったらすでにマージされていた
Avatar
gogo
Avatar
omochimetaru 5/19/2024 6:53 AM
タイトルの英訳させててすいません
6:54 AM
他のレビュワーでアクティブな人がいないので、 現状は 僕 → 家庭くん の間の意図の伝わりやすさが最優先だと考えています 僕が英語頑張ってもニュアンスが乗せ切れないため。
Avatar
はい。コントリビューションのハードルを上げる必要は全くないので基本的にやりやすい方法で大丈夫です。タイトルちまちま英訳してるのは僕がリリースノートを書くときに最終的に英語で要約するのにやりやすいから、というだけなので気にせず 👌 (edited)
Avatar
omochimetaru 5/19/2024 6:59 AM
なるほど。ありがとうございます。
Avatar
omochimetaru 5/20/2024 8:52 AM
このPRのステータス #457 に依存しているので、それがマージされるまでは Draft にしておきます。 レビューの用意ができました。CIを確認中です。 実装を修正中です 課題 テストの swiftRun は、プロセスの終了を待ってから、 パイプの中身を取り出しています。 これには課題があります。 パイプが詰まるかもしれない テストでは swift run carton dev などのコマ...
Avatar
ベストな選択肢がないんすよねぇ
Avatar
omochimetaru 5/20/2024 9:26 AM
Foundation版もキモイしオワコン予定というのは考えてなかった
9:26 AM
Subprocessくるのはそういえばそうだった (edited)
Avatar
omochimetaru 5/20/2024 9:42 AM
FilePathってなんだっけ
Avatar
swift-systemのやつ
Avatar
omochimetaru 5/20/2024 9:43 AM
そこ依存関係ありなの?
9:44 AM
AbsolutePathとURLの混用も気になってるんだけどここも次世代の選択肢あるんか
Avatar
なんかの間接依存で入ってるんじゃなかったっけ
9:44 AM
AbsolutePath, URL, FilePath
Avatar
omochimetaru 5/20/2024 9:45 AM
The Foundation project. Contribute to apple/swift-foundation development by creating an account on GitHub.
9:45 AM
1段目にはなさそう
Avatar
あれ、swift-foundationにはいってるんでしたっけ
Avatar
omochimetaru 5/20/2024 9:48 AM
Subprocess の提案の中でしれっとでてきた
9:48 AM
SF0007
Avatar
そこ依存いいのか?
Avatar
omochimetaru 5/20/2024 9:48 AM
Considerations Between URL and FilePath: While Process historically used URL to represent both the executable path and the working directory, Subprocess has opted for FilePath. This choice is made because, in the context of Subprocess, the executable is on disk, and FilePath aligns more closely reflects this concept.
(edited)
9:49 AM
唐突すぎてネームスペースもはっきりせん
Avatar
妥当っぽい。URLはFilePathより表現できるものが多いのにSubprocessが受け入れるのはFilePathの範囲だけなので
Avatar
omochimetaru 5/20/2024 9:50 AM
その理念はいいとおもうんよね
Avatar
swift-foundationのAPIとして提供するのかな
Avatar
omochimetaru 5/20/2024 9:51 AM
レビュースレッド後で見てみよう
9:51 AM
誰か突っ込んでるやろ
9:55 AM
posix spawn的にお行儀が良い挙動にはなるんだろうか?
Avatar
なるなる
Avatar
omochimetaru 5/20/2024 9:55 AM
proposalに明言されてる?
Avatar
そこの明言はされてなかった気はするけど、アトリビュートを設定する口は用意するからそこで自動クローズしたかったらやってね、みたいなことは書かれてたはず
Avatar
omochimetaru 5/20/2024 9:58 AM
そうね、エスケープハッチの設計は入ってた
9:58 AM
v4: Minor updates (mostly name changes): Dropped the executing label from .run(). Removed the references to Subprocess.AsyncBytes: Instead, we use opaque type: some AsyncSequence<UInt8, Error&...
9:58 AM
今見えるのはこれだけで実装は見えないのかな。はよはよ
Avatar
別リポジトリでありますよ
Avatar
omochimetaru 5/20/2024 9:59 AM
あ、そうなのか
Avatar
A prototype to the new Swift Subprocess. Contribute to iCharlesHu/swift-experimental-subprocess development by creating an account on GitHub.
Avatar
そこは見つからんわw
10:00 AM
apple/で探してた。。
10:01 AM
swift-systemに依存してるな、なるほど
10:06 AM
A prototype to the new Swift Subprocess. Contribute to iCharlesHu/swift-experimental-subprocess development by creating an account on GitHub.
10:06 AM
きれいそう
10:07 AM
根っこでC実装に潜っててそこも色々書いてあった
Avatar
Foundation.URLは最近はめっきり見ないですね (edited)
Avatar
なんだかんだポータブルだから俺はメインで使っとる
Avatar
依存要らずなのが魅力
Avatar
FileManagerが受け付けるし(揃ってないけど・・・)
Avatar
暗黙な依存は引きつれるんだけど
Avatar
やっぱりFoundation依存なのが気になってしまう
Avatar
Foundation全部外すのはむずくね?
10:10 AM
String(data:encoding:)とかもそうでしょ
Avatar
言うてJSONエンコーディング周り以外はもう代替ありませんか?
Avatar
String.addpercentEscapeなんたらかんたらとか
Avatar
そんな難しいことはしない
Avatar
Avatar
Iceman
言うてJSONエンコーディング周り以外はもう代替ありませんか?
NIOがiOSとクロスにならなかったりするからなあ、ロックするだけでもまだ大変 (edited)
Avatar
基本的に使わないから必要なときにたす感じかなぁ (edited)
Avatar
Mutexはよリリースせい
Avatar
はよ
Avatar
ロックはそうでした
10:13 AM
NIOLockをコピペ
👀 1
Avatar
もうno-op mutexをWASIのために書きまわるのはいやじゃ
Avatar
Avatar
Iceman
基本的に使わないから必要なときにたす感じかなぁ (edited)
まあAPIが古臭いから嫌ではある 泥を触ってる
10:13 AM
ネチョネチョ
Avatar
Avatar
Yuta Saito
もうno-op mutexをWASIのために書きまわるのはいやじゃ
シングルスレッドモデル分岐太郎だ (edited)
Avatar
APIが古臭いのとconcurrency警告出まくるのとWasmだとバイナリサイズが気になるのがネックで、それが改善すれば便利だから使っていきたい (edited)
Avatar
SwiftPMパッケージとしてビルドされるようになればLTOもやりやすくなるはず
Avatar
URL.append()はいつから使えるのかよくわからん
10:15 AM
corelibsに来ない
Avatar
corelibs-foundationになさそう
Avatar
やる気なさそうだから一生使えないつもりでいる‥
Avatar
一生MacビルドでappendPathComponentが黄色くなってる (edited)
Avatar
だれもAppleプラットフォーム以外で使ってないのである
Avatar
使ってるんだよお
10:16 AM
仕事で〜
Avatar
じゃあ足しといてください!!
Avatar
投げたら生えるんか?
Avatar
互換APIなら生えるのでは
Avatar
ちょっと見てたけど結構大変そうですぐ諦めた
Avatar
ふむ
Avatar
大変なのか
Avatar
ゴリゴリにnsurl経由でcore foundationのapi使っててめんどくさそうでした
😮 1
Avatar
ああ…
Avatar
ちゃんと読み解けば単純かもしれない
Avatar
まずCFURLに対応するAPIがあるのか次第だな
Avatar
nsurlにコンパチしないといけないのが面倒だなぁと
Avatar
たいへん
Avatar
ファイルパスとかは変なコーナーケースの入力がいろいろありえて
10:20 AM
そこの挙動が暗黙なのがつらいよね
Avatar
Avatar
Iceman
やる気なさそうだから一生使えないつもりでいる‥
corelibs-foundation 捨てて swift-foundation に移行するのかと思ってました.こっちには生えてき始めたので. https://github.com/apple/swift-foundation/blob/387f000273af5fb9859676b421e3cbc270c566e1/Sources/FoundationEssentials/URL/URL.swift#L2286
Avatar
ほんとだ!!
12:00 PM
この前マイグレーションプランが公布されていましたね corelibsの中にswift-foundationを含めるようにして、ちょっとずつ置き換えていくんだとか
t_naruhodo 2
Avatar
いいですね
Avatar
こっちは NSURL とか CFURL のこと考えなくていいからやりやすそうだ
Avatar
swift-foundation 移行のための作業中の corelibs-foundation 側のブランチを見ると,URL とかがごっそり削除されて swift-foundation の実装を使うようになってますね. https://github.com/apple/swift-corelibs-foundation/commit/cc5704df4a3dbcee529f4f305264d247eed0f879
Avatar
omochimetaru 5/20/2024 1:10 PM
オオ 使えるようになりそう・・・!
1:11 PM
NSURL とかは温存されてて、ブリッジプロトコルで対応させるんですね
Avatar
Avatar
omochimetaru
NSURL とかは温存されてて、ブリッジプロトコルで対応させるんですね
その辺はあくまで non-Darwin (Foundation.framework が無い環境) 限定の互換レイヤーみたいですけどね
Avatar
omochimetaru 5/20/2024 1:17 PM
そうですね。まあそもそも corelibs は darwin はサポートしない感じですよね。
Avatar
さっきの 2 つ目のリンク (7 日前のマイグレーションプランの若干の方針転換の告知) に non-Darwin only って書いてありましたね.
naruhodo 1
Avatar
omochimetaru 5/20/2024 1:18 PM
一応 NSURL には、値型の URL とかを、 参照型として共有するために boxingした型としての用途があるんで使ってる人がいるかもしれない。 Box<T> 作った方がいいけど・・・ (edited)
Avatar
最新macOS + 開発版ツールチェインセグフォ問題のワークアラウンド書いておきました https://github.com/apple/swift/issues/73327#issuecomment-2120481479 (edited)
Avatar
omochimetaru 5/20/2024 1:42 PM
おおお
1:43 PM
どうなってんだこれ? DYLD_LIBRARY_PATH って絶対パス指定よりも強いの?
1:43 PM
1 は codesign 付け直してセキュリティを殺してるだけ?
Avatar
Avatar
omochimetaru
どうなってんだこれ? DYLD_LIBRARY_PATH って絶対パス指定よりも強いの?
dyldちゃんと読まないとわからないけど、動きだけ見るとそうみたいです。
Avatar
Avatar
omochimetaru
1 は codesign 付け直してセキュリティを殺してるだけ?
そうそう。
1:44 PM
adhocでサインしなおす
Avatar
あれ,この前 2 は試してみてダメだったんですが,何か間違っていたんだろうか... 再度試してみます.
Avatar
Avatar
Yuta Saito
dyldちゃんと読まないとわからないけど、動きだけ見るとそうみたいです。
omochimetaru 5/20/2024 1:44 PM
まさかの展開だ。絶対パスじゃ何やってもダメだろと思い込んでけど、なんか割とよく見る方法でいけるんだ。
Avatar
Avatar
kebo
あれ,この前 2 は試してみてダメだったんですが,何か間違っていたんだろうか... 再度試してみます.
ああ、これは1, 2の順でやるステップですね。オプションじゃない
t_naruhodo 1
Avatar
omochimetaru 5/20/2024 1:45 PM
逆にいうとこの DYLD_LIBRARY_PATH パラメータめっちゃ強くて怖いな (edited)
Avatar
普通のプログラムはhardened runtime有効じゃないんでまあ
t_naruhodo 1
Avatar
omochimetaru 5/20/2024 1:46 PM
この署名書き換えは
1:46 PM
原理的には自分でやったから自分の環境なら起動できるのはOK、ってこと・・・?
1:46 PM
例えば俺が書き換えたやつを家庭くんに渡した時はどうなるの(何か応用したいわけじゃなくてただの興味) (edited)
Avatar
com.apple.quarantine xattrアトリビュートがファイルについてるとadhocでサインされたバイナリはGatekeeperが止めるはず
Avatar
omochimetaru 5/20/2024 1:48 PM
なるほど
Avatar
com.apple.quarantine xattrアトリビュートは普通ダウンロードしてきたファイルに付いてくるやつ
Avatar
omochimetaru 5/20/2024 1:48 PM
ああ、右クリックして頭下げないと動かないやつか。
1:48 PM
あのモードになるわけか
Avatar
たぶん
Avatar
omochimetaru 5/20/2024 1:49 PM
ありがとうございます これで開発が再開できる
1:50 PM
スレッドでもはしゃいでおこう
1:51 PM
Introduce a (temporary) dlsym check for swift_willThrowTypedImpl. #72801 もずっと止まってるし、個別に迂回するんじゃなくてバージョンチェック直す方向で見直してるのかな〜そうだといいな
Avatar
ワークアラウンドを教えてしまったために9999が外れるまで誰も根本原因を直さないかもしれない
Avatar
omochimetaru 5/20/2024 1:52 PM
俺はもうそれでもいいかもどうせスナップショットだし・・・
1:52 PM
インストールの手数が増えただけや
Avatar
まあ来月にはOSバージョンが固定されると信じよう
Avatar
omochimetaru 5/20/2024 1:57 PM
あwwdcか
1:58 PM
Swift関連なんかブチ上げてほしいな
1:58 PM
元年を
Avatar
🎍
Avatar
そういえばそろそろか
Avatar
omochimetaru 5/20/2024 3:07 PM
cartonの中で #if compiler でバージョン判定してるやつ、コンパイルタイムとランタイムで違うツールチェーンだったらダメな気がしたけど
3:07 PM
この分岐が書いてあるのがプラグインの中だけで (edited)
3:08 PM
プラグインは必ずそれを使うプロジェクトでプラグインを使うタイミングでビルドされるから
3:08 PM
プラグイン自体をコンパイルする環境と、コンパイルされたプラグインがユーザコードのコンパイルをキックする環境は同じで、大丈夫そう (edited)
3:12 PM
仮にcartonを外でビルドしてパスを通して使おうとした場合、 driverは起動できても、ターゲットプロジェクトにプラグインがないのでそこで止まる frontendは起動して最後までいけるけど、 この場合はfrontendにはビルド機能がないので、特に問題は起きない
Avatar
@omochimetaru あれ、結局エントリポイントがServerから配信されてない問題はパッチ入れたんでしたっけ
Avatar
Avatar
Yuta Saito
@omochimetaru あれ、結局エントリポイントがServerから配信されてない問題はパッチ入れたんでしたっけ
omochimetaru 5/20/2024 3:27 PM
まだです。全部、それの前振りで整理してる
3:27 PM
今出したやつで最後で、やっとその対応を考え始めたところ。
Avatar
ちょうどパッチを書いちゃった
3:28 PM
diff --git a/Sources/CartonKit/Server/ServerHTTPHandler.swift b/Sources/CartonKit/Server/ServerHTTPHandler.swift index 87c72de..0f7c494 100644 --- a/Sources/CartonKit/Server/ServerHTTPHandler.swift +++ b/Sources/CartonKit/Server/ServerHTTPHandler.swift @@ -71,6 +71,11 @@ final class ServerHTTPHandler: ChannelInboundHandler, RemovableChannelHandler { bytes: localFileSystem.readFileContents(configuration.mainWasmPath).contents ) ) + case "/" + configuration.entrypoint.fileName: + response = StaticResponse( + contentType: "application/javascript", + body: ByteBuffer(bytes: configuration.entrypoint.content.contents) + ) default: guard let staticResponse = try self.respond(context: context, head: head) else { self.respond404(context: context) @@ -111,13 +116,7 @@ final class ServerHTTPHandler: ChannelInboundHandler, RemovableChannelHandler { private func respond(context: ChannelHandlerContext, head: HTTPRequestHead) throws -> StaticResponse? { - var responders = [ - self.makeStaticResourcesResponder( - baseDirectory: FileManager.default.homeDirectoryForCurrentUser - .appendingPathComponent(".carton") - .appendingPathComponent("static") - ) - ] + var responders: [(_ context: ChannelHandlerContext, _ uri: String) throws -> StaticResponse?] = [] let buildDirectory = configuration.mainWasmPath.parentDirectory for directoryName in try localFileSystem.resourcesDirectoryNames(relativeTo: buildDirectory) {
3:28 PM
テストケースと一緒にコミットしてもらうのが良いかも
Avatar
omochimetaru 5/20/2024 3:28 PM
テストだけ後から足せばいいのでは
3:28 PM
難しいことが一個あって
3:29 PM
$ carton-frontend dev を単体で動かしてレスポンスを見るテストを書こうとしてるんだけど
3:29 PM
そのためには事前にwasmをビルドする必要があって
3:29 PM
その時のツールチェーンをどうするか問題がある
3:29 PM
一度書いた実装では、 $ carton dev がやるのと同じように、ToolchainSystem を直接叩いて 5.9.2 をインストールさせる作戦だったんだけど
3:30 PM
それだと 5.9.2-wasmでビルドされたcarton-frontendが実行されることになる
3:31 PM
だけど、俺が欲しいのは、 ビルドでwasmは自分で用意して、 carton-frontendのtest driverだけ使うユースケースだから
3:31 PM
carton-frontendは 根本の $ swift test を起動してるツールチェーンで素直にビルドしたものを起動したいんだよね。
3:32 PM
ただそうすると wasm binary を生成させるためのビルドをする方法に問題があって
3:32 PM
ツールチェーンが 5.10 か 6.0 の場合で正しいビルドオプションが変わってしまう
3:34 PM
wasm binaryの用意はfrontendの動作テストと本質的に関係ないから、そっちはcarton ToolchainSystem でやって、 frontendを起動するときはテスト走らせてるswiftを使えばいい気がしてきた
3:36 PM
確か最初はそう書いて、何か気がついて同じじゃなきゃダメだと思って直したけど何を気にしてたんだっけな
Avatar
ToolchainSystemをつかったとてwasmファイルをビルドするには現状Package Pluginを経由しないといけなくて
Avatar
omochimetaru 5/20/2024 3:38 PM
いや、経由しない
3:39 PM
このテストケースは、cartonの3レイヤーのうち、上と中には依存しないようにしたいと考えてる
3:39 PM
(上から全部通すテストはすでに DevCommandTests がある)
Avatar
ん、そうすると swift buildに渡すオプションはここで管理する?
Avatar
omochimetaru 5/20/2024 3:39 PM
これはそうなる
3:40 PM
あ、貼ってるやつここじゃないや
3:40 PM
3:40 PM
↑これ
Avatar
Plugins/CartonPluginShared/Environment.swift をテストと共有したい
Avatar
omochimetaru 5/20/2024 3:41 PM
ああ。
3:41 PM
Environment 今2カ所にいるよね。
3:42 PM
CartonFrontendCommand.EnvironmentPluginShared.Environment
3:42 PM
それについては、なんかターゲット作って、plugin達からはslink貼ってけばいいから
3:42 PM
別件でやりかけたけど出番がなかった
3:43 PM
CartonHelpers渡すのはプラグインにはデカすぎるから
3:43 PM
もう一個別のターゲットが要るよね
3:44 PM
やりかけたやつは CartonCore だったんだけど。
3:45 PM
func applyBuildParameters(_ parameters: inout Parameters) { // NOTE: We only support static linking for now, and the new SwiftDriver // does not infer `-static-stdlib` for WebAssembly targets intentionally // for future dynamic linking support. parameters.otherSwiftcFlags += ["-static-stdlib"] switch self { case .command: break case .node, .browser: parameters.otherSwiftcFlags += ["-Xclang-linker", "-mexec-model=reactor"] #if compiler(>=6.0) || compiler(>=5.11) parameters.otherLinkerFlags += ["--export-if-defined=__main_argc_argv"] #else // Before Swift 6.0, the main function is defined as "main" instead of mangled "__main_argc_argv" parameters.otherLinkerFlags += ["--export-if-defined=main"] #endif } } テストから叩くならこのcompiler directiveが問題になるなw
Avatar
うげーたしかに
Avatar
omochimetaru 5/20/2024 3:45 PM
まあでもこれは、パラメータでコンパイラバージョンを受け取れるようにして
3:46 PM
プラグインは静的にバージョン定数を埋めて自覚させればいいだけなので
Avatar
はい
Avatar
omochimetaru 5/20/2024 3:46 PM
そんなに大変じゃなさそうね
3:47 PM
えーとただ、テストランナーをビルドしたコンパイラのバージョンじゃなくて
3:47 PM
テストランナーが実行時に起動したcarton driverがインストールするツールチェーンのバージョンが必要になるから
3:48 PM
public let defaultToolchainVersion = "wasm-5.9.2-RELEASE"
3:48 PM
どうせこれになる読みで5.9.2仕様決め打ちでも良さそうではあるが
3:49 PM
本当はcarton driverが育ってここが変動したときに追従するロジックにすべきよな
Avatar
ToolchainSystemが知ってるんじゃないですか
Avatar
omochimetaru 5/20/2024 3:49 PM
3:49 PM
バージョンは まさに wasm-5.9.2-RELEASE なんだけど
3:49 PM
ここから 5.9.2 をどうやって取り出すか?
3:50 PM
まあ文字列マッチでもいいけど・・・ development snapshotの時うまくいかなったりしそうなので $ swift --version を叩きたいなあとも思っている (edited)
3:51 PM
3:51 PM
コンパイルさせればいいのか
Avatar
あー、むずい。
3:51 PM
まあそうすね
Avatar
omochimetaru 5/20/2024 3:51 PM
それ楽しいな
Avatar
実際にコンパイルして機能推定するのautoconfっぽい
Avatar
omochimetaru 5/20/2024 3:52 PM
#if compiler(>=6.0) print("6.0") #elseif ...
3:52 PM
こういうのを流し込む
Avatar
成果物実行しなくても
3:53 PM
#if compiler(>=6.0) #error("I am 6.0") #elseif
Avatar
omochimetaru 5/20/2024 3:53 PM
うわあw
Avatar
parsable outputでいいかんじに。 (edited)
3:53 PM
autoconfでは常套手段
Avatar
omochimetaru 5/20/2024 3:54 PM
そのほうがコンパイルフェーズで完結するから侵襲性が低いか〜
3:55 PM
色々見てて思ったんですけど
3:55 PM
carton build コマンドを提供しないのはなぜ? (edited)
3:56 PM
最初は、wasmビルドの面倒は見ないというスタンスなのかと思っていたけど
Avatar
本当は素直にswift buildを実行するだけで済んでほしいから。
naruhodo 1
Avatar
omochimetaru 5/20/2024 3:56 PM
devやtestの実装を見てると、ビルドの面倒も完全に見ているから・・・
Avatar
Avatar
Yuta Saito
本当は素直にswift buildを実行するだけで済んでほしいから。
omochimetaru 5/20/2024 3:56 PM
その場合さ
3:56 PM
今ポリシーが変な感じがしてて
3:56 PM
--target とか --sdk は一番手前の $ swift build を叩かないと指定できないけど
3:57 PM
static-stdlibとか linker option は、現時点でもユーザが Package.swift に書くこともできるよね
Avatar
うむ
3:58 PM
static-stdlibはSwiftPM自体に渡さないといけないからPackage.swiftには書けないけど
Avatar
omochimetaru 5/20/2024 3:58 PM
でも今は、シンプルに書いたPackage.swiftを、cartonが色々wasmのために付け足したコマンドを作る、みたいな感じだ
3:59 PM
本当は素直にswift buildを実行するだけで済んでほしい
ここに至るまでのマイグレーション過程がどういう作戦なのかが気になる
Avatar
Avatar
Yuta Saito
static-stdlibはSwiftPM自体に渡さないといけないからPackage.swiftには書けないけど
omochimetaru 5/20/2024 3:59 PM
ああ、これもダメか
Avatar
理想を追い求めすぎて優しいマイグレーションプランがないのが現状🥲
Avatar
omochimetaru 5/20/2024 4:00 PM
ww
4:00 PM
一旦リセットして考えると
4:00 PM
一番の理想は、特に何も wasm専用の設定(.whenとかcondition:とか)は書かないpackage.swiftがあって (edited)
4:01 PM
$ swift build --sdk wasm32... だけでうまくいくことよね
Avatar
そうそう。それがゴール
Avatar
omochimetaru 5/20/2024 4:01 PM
なるほど。仮にそれが実現されるとしたら
4:02 PM
swift-sdk側の方で、executableには --export-if-defined=main をつけるとかを知って、注入してくれないといけない? (edited)
Avatar
そこはいくつかオプションがあって
Avatar
omochimetaru 5/20/2024 4:03 PM
いや、こっちについてはコンパイラでいけるか wasmターゲットのコード生成でmainにアトリビュートついてればリンカが面倒を見れる
Avatar
そもそもWASIにおけるreactorがtop-levelコードを持てるのがおかしいのではという。
Avatar
omochimetaru 5/20/2024 4:04 PM
WASIにおけるreactorとはなんでしょうか
Avatar
つまりexecutable productであれば必ずcommandモードで、library productであればreactorモード、という風に整理できる
4:04 PM
えーと
Avatar
omochimetaru 5/20/2024 4:04 PM
あ〜 なんか今のそれでイメージついた
4:05 PM
そうするとmain関数をエクスポートするどころか呼び出す必要もなくなるはず
Avatar
omochimetaru 5/20/2024 4:07 PM
なるほど WASI ABIはシンプルに2種類あってわかりやすいな
Avatar
でもcommand / reactorの概念があるWASI Preview1は将来Preview 2に置き換えられる予定なので今すぐにPreview 1向けに直すよりはPreview 2対応のときに直したいな
Avatar
omochimetaru 5/20/2024 4:08 PM
今はリンカーオプションでreactorにしつつmainも引っ張り出してきて叩いてるのか
4:09 PM
executableにするんじゃなくてlibraryにしておいて、 Swift側で自由に @expose(wasm) func して (edited)
4:09 PM
エントリポイントのJSからWASMモジュールのそれを呼べば起動する
4:09 PM
みたいな構成ならリンカーオプションいらないな
Avatar
そう。そうなんだけどlibrary productをどうwasmとして表現するかには議論の余地があって
4:12 PM
_startエントリポイントを持たないnon-PICな.wasm、もしくはdynamic libraryとしてのPICな.wasmどちらもありえて
Avatar
omochimetaru 5/20/2024 4:13 PM
あ〜 そういうSwiftのコンセプトからはみ出す選択肢が出てくると変なコンパイラオプションを渡したくなってくるわね (edited)
Avatar
Rustは crate-type = cdylib ってCargo.tomlに書いとくとエントリポイント無しnon-PIC .wasmで決め打ちで作っちゃうんだけど
4:14 PM
最近Wasm上のDynamic Libraryが面白くなってきてて
4:14 PM
そういう決め打ちをしちゃうと将来の可能性を潰してしまうなと
Avatar
omochimetaru 5/20/2024 4:14 PM
なるほど。
4:14 PM
ターゲットアーキテクチャ側がガンガン成長してるのがややこしいな
4:15 PM
この前 moonbit の話を見聞きしたけど
4:15 PM
最初から wasm ターゲットを念頭に言語仕様が設計されていて
4:15 PM
で、そのwasmもGCとかmulti-memoryとか、最新提案系全部入りみたいな方針を目指してて
4:15 PM
同じwasmの話してるとは思えない世界が違う感じだったw
Avatar
しらないやつだ
Avatar
omochimetaru 5/20/2024 4:19 PM
とりあえずわかってきた cartonだけで考えようがなくて
4:19 PM
swift toolchain とか swiftpm の仕様も巻き込むし
4:19 PM
WASI ABIも関係するしそれが変化してる最中だから
4:19 PM
難しいっすね
Avatar
そう。むずかしい
Avatar
omochimetaru 5/20/2024 4:20 PM
原則的には @expose みたいなのと同じで
4:20 PM
ターゲット環境に固有のバリアントみたいなものは、 Swiftエコシステムの既存のモデルにハマらないようなものは
4:21 PM
短期的には謎のオプションを注入させるハッチで誤魔化して
4:21 PM
長期的にはSwift側にパラメータ指定をちゃんとできるように拡張していく、ということになりそうだ
4:21 PM
さっきの話だったらSwiftPMのlibrary product (target?)に対して pic: true みたいな、 設定が生えてきて欲しい (edited)
Avatar
で、謎のオプション君たちの制御の面倒はcartonでみる (edited)
Avatar
omochimetaru 5/20/2024 4:23 PM
ビルドオプションはunsafeFlagsでいけるけど、ルートで叩くやつができないのがな〜
4:23 PM
ひとつ思ったのは
Avatar
.library(type: .dynamic, pic: false)
👉 1
Avatar
omochimetaru 5/20/2024 4:23 PM
Package.swiftになんとか書けるオプションについては
Avatar
non-PICならdynamicじゃない気がする😂
Avatar
omochimetaru 5/20/2024 4:24 PM
$ carton configure とかやったら、Package.swiftを勝手に書き換えて埋め込んでくれたら良いのでは
Avatar
いいのかな
Avatar
omochimetaru 5/20/2024 4:25 PM
ユーザに見えるのが嬉しいよね
4:25 PM
git差分としてもコミットできるし
4:25 PM
platform: .wasi ついてれば害もないし
Avatar
ツールチェインのメジャーバージョン切り替えられない?
Avatar
omochimetaru 5/20/2024 4:26 PM
ツールチェーンの管理はユーザがやるべきじゃないかなあ
4:26 PM
xcode-selectとswift-sdkがあるんだし
Avatar
いや、バージョン変わると必要なフラグが変わるから
4:27 PM
切り替えごとにconfigureしないといけない
Avatar
omochimetaru 5/20/2024 4:27 PM
あ〜なるほど
4:27 PM
Package.swiftの中に #if compiler 書いたり Package@5.9.swift があったり
Avatar
まあ滅多に発生しないシナリオな気はする
4:28 PM
そうか一応ワークアラウンドはあるか
Avatar
omochimetaru 5/20/2024 4:28 PM
なんか俺のイメージだと、その、cartonが助けてくれないことはあるんだとしても
4:28 PM
carton CLIを使い続けて開発するんじゃなくて
4:29 PM
package.swiftの編集とか、一番根本のコマンドを叩くシェルスクリプトを作ってくれるとか
4:29 PM
一回だけcartonによって環境を構築したら
4:29 PM
そっからは標準的なツールだけを叩く
4:29 PM
みたいなスタイルだといいなと思っている
4:29 PM
そうじゃないと普段何が起こってるのか掌握できないので。
Avatar
create-react-appみたいな世界観?
Avatar
omochimetaru 5/20/2024 4:29 PM
似てると思う。
4:30 PM
ejectしたい。
Avatar
ejectすると全てのコントロールが手に入る
Avatar
omochimetaru 5/20/2024 4:30 PM
そうそう。ただあれは確か一回ejectしたらもう終わりだった気がする
4:30 PM
まあむずいな〜 今のアプローチが現実的に保守しやすいのはあるなあ
4:31 PM
ユーザーにはフラットな環境が作れるけど、逆にcarton側から見ると外部の状態が増えちゃうな
Avatar
ejectしたら後戻りできない、はそれなりに合理的な気がするなぁ
Avatar
omochimetaru 5/20/2024 4:36 PM
たしかに。
4:36 PM
まあ新しいものに乗りたければ新規で作ってejectしてから
4:37 PM
手で取り込めばいいか
Avatar
自動でejectする術を提供するかは置いておいて、carton内のコンポーネントを外から個別に使いやすくするのは正しい方向な気がする
Avatar
omochimetaru 5/20/2024 4:47 PM
そうね frontendだけ使えるは便利だし、それは素のswift buildと併用できるということだし。
4:48 PM
testはいい感じで、devもそうなってほしいが、dev pluginのリビルドがswiftpmのplugin api経由なのはうまいこといってる印象があり
4:49 PM
pluginは外せないのか・・・?も考え中
4:50 PM
plugin入れたくないの、swiftsyntaxみたいにバージョンが衝突するからというのが大きいんだけど
4:51 PM
swiftpmにdev dependencyがないのが悪いだけな気もしてきたな (edited)
Avatar
そうなんだよなー、ライブラリ開発中にも使いたいのに
Avatar
omochimetaru 5/20/2024 4:53 PM
マクロ導入でそのへん崩壊して話進む期待あったが、swiftsyntaxがツールチェーンに乗っかる方でなんか丸まってしまったな (edited)
Avatar
長期的にはdev depかけるようになって欲しい (edited)
Avatar
omochimetaru 5/20/2024 4:56 PM
plugin経由のビルドって
4:57 PM
swift build —target foo を叩くのと何が違うんだろう?
4:58 PM
plugin commandの良さというか必要性がわかるようでわかりきらず、最近考えている (edited)
4:59 PM
evolution読み直すべきか
Avatar
ビルドについてプラグイン実装が口を用意しなくてもswift packageコマンドレベルのオプションが透過的につかえるんですよ
5:01 PM
swift package [ここにいろいろ渡せる] plugin carton-dev
Avatar
omochimetaru 5/20/2024 5:02 PM
あーそうか プラグインなしでやろうとすると、そこを再実装するのが大変すぎるのか
5:02 PM
そこを固定してるというかdriverがやっちゃうから手触りを感じられてなかったんだ
Avatar
driver卒業するとありがたみが感じられる
Avatar
omochimetaru 5/20/2024 5:04 PM
そうするとたしかにswift buildを自分で叩くより、swift package fooを経由してビルドを叩くのが綺麗な感じがしてきたな
Avatar
Avatar
Yuta Saito
driver卒業するとありがたみが感じられる
omochimetaru 5/20/2024 5:04 PM
なるほどなるほど・・・
Avatar
あとプラグイン実行中にネストしてswift buildを実行するとビルドデータベースが破損する
Avatar
omochimetaru 5/20/2024 5:05 PM
w
Avatar
swift runはcloseしてからexecするのでギリok (edited)
Avatar
omochimetaru 5/20/2024 5:06 PM
test pluginがやってるやつか
5:07 PM
ギリギリだった
Avatar
omochimetaru 5/21/2024 1:10 AM
1:11 AM
swiftwasm公式サイトにplaygroundついてて
1:11 AM
一瞬でコンパイル終わるからどうやってるのかと思ったら
1:12 AM
そのまま Run ボタン押した時の結果だけ事前に用意されてた
1:12 AM
コード書き換えた後は10秒かかった
1:12 AM
多分そこでクラウド側が温まって
1:13 AM
その後の3回は2.3, 1.3, 2.4秒
1:14 AM
3秒以下ならいったん良さそう
1:15 AM
Web service for compling Swift to Wasm, used by Try It Now on https://swiftwasm.org - swiftwasm/swiftwasm-compile-service
Avatar
それもう使ってないはず
Avatar
omochimetaru 5/21/2024 1:16 AM
なんと
Avatar
swiftwasm-padの方のやつを再利用してる
Avatar
omochimetaru 5/21/2024 1:16 AM
swiftwasm-pad is a online playground to help developers learn about Swift on Web. - swiftwasm/swiftwasm-pad
1:18 AM
1:18 AM
11秒、7秒、7秒、7秒
1:18 AM
Tokamakがついてる分とかサーバ側のスペックの差なのかなー
Avatar
そっちはAWS Lambdaなのかも
1:19 AM
swiftwasm.orgのほうはCloud Runに移行したけどpadのほうはしてないかも
Avatar
omochimetaru 5/21/2024 1:19 AM
padは AWS っぽいURLしとる URL: https://syzf23805k.execute-api.ap-northeast-1.amazonaws.com/prod/CompileSwiftWasm (edited)
1:21 AM
wasmorg URL: https://swiftwasm-compiler-api-mgv5x4syda-uc.a.run.app/
1:21 AM
run.app は cloudrun らしいね
1:23 AM
違いが多くてなんともだ。 (edited)
Avatar
どっちもクラウドランにしたいんだけど時間取れてない
Avatar
omochimetaru 5/21/2024 1:24 AM
なるほど
1:27 AM
これ系って攻撃耐性どうしてるの?
1:27 AM
自分で設置するなら、わざとぶん回されて利用料金が爆発するのが一番怖い (edited)
1:30 AM
そもそも誰の財布に繋がってるのかも気になるけど
1:31 AM
なんか書いてあった
1:32 AM
供給はこれっぽそう
Avatar
スパイクがあった時に考える
😲 1
Avatar
omochimetaru 5/21/2024 1:32 AM
ひえっ
Avatar
今のところ(掛かるかわからない)お金より人間の時間のほうが貴重なのだ…
Avatar
omochimetaru 5/21/2024 1:34 AM
確かに仕組みを組んでも徒労になるかも
Avatar
真面目にやるにはどうするのが良いんですかね。前段に何かをおく?
Avatar
omochimetaru 5/21/2024 1:35 AM
全然知らない
1:35 AM
GCPは課金上限設定して突破したら死ぬみたいにできるんじゃなかったっけ
1:35 AM
そういうのがあるなら最終安全装置はそれで良さそう
Avatar
じゃあそれでいいや
Avatar
omochimetaru 5/21/2024 1:35 AM
サービスは落ちるけど財布は死なない
Avatar
それで上限到達した時に考えよう
Avatar
omochimetaru 5/21/2024 1:36 AM
サービス落とさないためには cloudflare で全部蓋するのよく見る
1:37 AM
AWSのT系のインスタンスはバーストクレジットが切れたら亀になるから
1:37 AM
なんかそういうのでも安全弁にはなるのかも
Avatar
領収書集めて回るの面倒だから使うサービス増やしたくない
Avatar
omochimetaru 5/21/2024 1:37 AM
GCP純正の壁もなんかあるのかな 知らんだけでありそう
Avatar
Cloud Armorってやつがあるらしい
naruhodo 1
Avatar
omochimetaru 5/22/2024 2:45 AM
@Yuta Saito cartonのdev.jsってwasmからstderrに出力があるとその場所のスタックトレースを収集してdev serverに送るけど、これってどういう意図の設計ですか? 特に疑問点: ・stderrが出る事とクラッシュは違うから、普通にstderrに出力するアプリだと騒がしくなりそう ・stdout, stderr共に window.console に転送されているだけなのに、スタックトレースだけはdev serverにも送る理由?出すとしてもこれもwindow.consoleで良いのでは (edited)
Avatar
fatalErrorしたときに対応するスタックトレースが欲しかったんじゃないかな?
Avatar
omochimetaru 5/22/2024 2:48 AM
「fatalErrorしたこと」の特定がめっちゃ甘いってことか
2:49 AM
dev server側にWSで送信するのはなんでだろ
Avatar
これなにかに使ってるのか?
Avatar
omochimetaru 5/22/2024 2:50 AM
switch event { case let .stackTrace(rawStackTrace): if let stackTrace = rawStackTrace.parsedStackTrace(in: environment) { terminal.write("\nAn error occurred, here's a stack trace for it:\n", inColor: .red) stackTrace.forEach { item in terminal.write(" \(item.symbol)", inColor: .cyan) terminal.write(" at \(item.location ?? "<unknown>")\n", inColor: .gray) } } else { terminal.write("\nAn error occurred, here's the raw stack trace for it:\n", inColor: .red) terminal.write( " Please create an issue or PR to the Carton repository\n" + " with your browser name and this raw stack trace so\n" + " we can add support for it: https://github.com/swiftwasm/carton\n", inColor: .gray ) terminal.write(rawStackTrace + "\n") }
2:50 AM
ここだから、mac側のターミナルに出して終わりな気がするよ (edited)
Avatar
stderrの出力自体は送っても良い気がする。スタックトレースはunhandled exceptionだけ送れば良い気がする
2:52 AM
fatalErrorが発生すると同時にunreachable exceptionが飛んでくるのでそこにスタックトレースが乗ってる。なのでonStderrで二重に送る必要はないはず
2:54 AM
testの方もonStderrで送ってるな
Avatar
omochimetaru 5/22/2024 2:54 AM
const wasmRunner = WasmRunner( { onStderr() { const prevLimit = Error.stackTraceLimit; Error.stackTraceLimit = 1000; socket.send( JSON.stringify({ kind: "stackTrace", stackTrace: new Error().stack, }) ); Error.stackTraceLimit = prevLimit; }, },
2:54 AM
今はスタックトレースを集めて送るだけなんだよな
2:55 AM
「常にstdout と stderr を devserverに送る」だったらそれは筋が通ってると思うし機能として便利そう
Avatar
送るべきは出力内容
Avatar
omochimetaru 5/22/2024 2:55 AM
ブラウザで動くコードをブラウザを見ないでターミナルで完結して作業できる
Avatar
正しそう
Avatar
omochimetaru 5/22/2024 2:56 AM
そうそう。wasmのoutとerrを手元のマシンまでリダイレクトする感じ。
2:56 AM
そうすると自動テストも色々書けていいなと思っている
2:56 AM
CI上でdevserver立ててwasm走らせて結果をstdoutから受けるところまでブラウザ側を触らずに完結する
Avatar
Avatar
Yuta Saito
fatalErrorが発生すると同時にunreachable exceptionが飛んでくるのでそこにスタックトレースが乗ってる。なのでonStderrで二重に送る必要はないはず
omochimetaru 5/22/2024 2:57 AM
同時にunreachable exceptionが飛んでくる
これはWASM命令によってブラウザ側のJS(WASM) VMが詰んでクラッシュするやつだよね
2:57 AM
多分開発してた時それを実際に見た
Avatar
例外とクラッシュはかなり違うけど多分そう
Avatar
omochimetaru 5/22/2024 2:58 AM
スタックトレースはunhandled exceptionだけ送れば良い気がする
これはあれかな、wasmのstderrからフックするんじゃなくて、JSのトップレベル?で捕まえるってこと?
(edited)
Avatar
多分似たようなことをtest.tsではそれなりに真面目にやってる気がする
Avatar
omochimetaru 5/22/2024 3:00 AM
あーこれか
Avatar
devのシナリオだと、unhandledrejectionをlistenしておくのと最初の main関数の呼び出しで捕まえておくので十分そう
Avatar
omochimetaru 5/22/2024 3:01 AM
try await catch の形だからそもそもcatchだけで拾えそうだけども
3:01 AM
unhandledrejection イベントは、 JavaScript の拒否ハンドラーを持たない Promise が拒否されたときにスクリプトのグローバルスコープに送られます。 通常、これは window ですが、 Worker であることもあります。 これはデバッグや、予期しない場面でのエラーハンドリングのエラーの代替手段を提供するために利用することができます。
3:02 AM
そんなPromiseを作るのが悪いのでは・・・
Avatar
あとはイベントハンドラの中で起こった例外をどうキャッチするかですね
Avatar
omochimetaru 5/22/2024 3:06 AM
とりあえず現状に対する見解はわかりました、妙な感じの状態だなと思った認識はずれてなさそう
Avatar
現状の形になってるのは余分なものを出力しないように細かくキャッチしようとすると漏れが発生する可能性があって大変なので保守的に何でも出力してるんだと思います。
naruhodo 1
3:08 AM
頑張って綺麗にできるならそれに越したことはないので応援します (edited)
🙂 1
Avatar
omochimetaru 5/22/2024 1:21 PM
コメントしづらいコメントが返ってきた
Avatar
いいぞもっとやれ
Avatar
omochimetaru 5/22/2024 1:24 PM
消した方が理由をちゃんとあげるなら、テスト用に別のやり方を導入して表記ブレするコストと、 そもそもPathをレシーバにしたメソッドの形式でFileIOを書くスタイルの是非かな
1:24 PM
自分の中の基準では弱い反対で、良さもわかるので好きでやってる人がいるなら反対するほどではない、が、 書いた人が今いない時はそういうの踏んづけても別にいいのかな (edited)
1:25 PM
ん!?
1:25 PM
extension AbsolutePath { func ls() -> [String] { guard let paths = try? FileManager.default.subpathsOfDirectory(atPath: pathString) else { return [] } return paths } }
1:26 PM
subpathsは孫も取ってくるやつだ!
1:26 PM
lsじゃないじゃん!w
Avatar
そうなんですよ。
Avatar
omochimetaru 5/22/2024 1:26 PM
lsR() だな
1:27 PM
XCTAssertFalse( (bundleDirectory.ls().filter { $0.contains("wasm") }).isEmpty, ".wasm file does not exist" ) XCTAssertFalse( (bundleDirectory.ls().filter { $0.contains("js") }).isEmpty, ".js does not exist" )
1:27 PM
そうするとこれはリカーシブ意識して書いてあるな
Avatar
Avatar
omochimetaru
自分の中の基準では弱い反対で、良さもわかるので好きでやってる人がいるなら反対するほどではない、が、 書いた人が今いない時はそういうの踏んづけても別にいいのかな (edited)
まあアクティブにやってる人の好みでやって良いのではないでしょうか
Avatar
omochimetaru 5/22/2024 1:29 PM
まあじゃあやっちまうか。一応手続き上は別PRにしますね
1:29 PM
性質が違う話だと思うので
Avatar
どもども
1:42 PM
wasmerサヨナラしてたの今気づいた
Avatar
さよならバイバイ
Avatar
omochimetaru 5/22/2024 1:43 PM
辛そうなワークアラウンドも無くなってるしスッキリした
Avatar
wasmfs(というかmemfs)にも依存しなくなってサイズ的にもスッキリしたはず
1:45 PM
bjorn3/browser_wasi_shimは壊れててもすぐ直せる程度の規模でよい
Avatar
omochimetaru 5/22/2024 1:47 PM
ほほーん
Avatar
むむ
11:54 AM
いや、これはいいのか
11:55 AM
対象アプリケーションが JavaScriptKit に依存してる場合は ビルドディレクトリにこれがあって取れるようになるのかな
11:55 AM
let runtimeConstructor: SwiftRuntimeConstructor | undefined = undefined; try { const { SwiftRuntime } = await import( // @ts-ignore "./JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs" ); runtimeConstructor = SwiftRuntime; } catch { console.log( "JavaScriptKit module not available, running without JavaScriptKit runtime." ); } 意図的な制御があるし、そうっぽいな
Avatar
そうそう。ブラウザがESM直接読める時代になってよかった
Avatar
確かにasync importを活用してるな
Avatar
#if os(WASI) import WASILibc #else import Darwin #endif func fputs(_ string: String, file: UnsafeMutablePointer<FILE>) { _ = string.withCString { (cstr) in fputs(cstr, file) } } fputs("hello stdout", file: stdout) fputs("hello stderr", file: stderr)
12:08 PM
[1/3] Compiling app main.swift /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/DevServerTestApp/Sources/app/main.swift:7:57: error: cannot find type 'FILE' in scope func fputs(_ string: String, file: UnsafeMutablePointer<FILE>) { ^~~~ /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/DevServerTestApp/Sources/app/main.swift:13:6: error: extraneous argument label 'file:' in call fputs("hello stdout", file: stdout) ^ ~~~~~~ /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/DevServerTestApp/Sources/app/main.swift:14:6: error: extraneous argument label 'file:' in call fputs("hello stderr", file: stderr) ^ ~~~~~~ Build completed successfully
12:08 PM
WASILibcFILE が無いみたい?どこ見ればいいんでしょう
Avatar
export PATH=/Library/Developer/Toolchains/swift-wasm-5.3.1-RELEASE.xctoolchain/usr/bin:$PATH echo 'import struct WASILibc.FILE; print("Hello, world!")' > hello.swift swiftc -ta...
Avatar
あと、ビルド失敗してそうなのに成功した気になってる 俺の変更で壊れたかな
Avatar
ClangImporterを直さないといけないんだけどこの辺どのくらい非互換が入るかわかんないなぁと思いつつ止まってる (edited)
12:10 PM
えっと、ファイル的にはどこにあるんだろう
Avatar
ClangImporterのですか?
Avatar
いや stdio.h
12:11 PM
[omochi@omochi-mbp swift-wasm-5.9.2-RELEASE.xctoolchain]$ find . | grep stdio.h ./usr/share/wasi-sysroot/include/c++/v1/stdio.h ./usr/share/wasi-sysroot/include/stdio.h
12:11 PM
これか?
12:11 PM
なんでshare..
Avatar
wasi-libcにある
12:12 PM
そこはwasi-sdkのレイアウトと合わせてます。クロスコンパイル用のsysrootなのでそこまでおかしくないと思う。
Avatar
あーそうか
12:15 PM
構造体でもOpaque pointerでもなくincomplete typeなんですよねぇ
Avatar
それを探してた stdio.h から先がわからなくて難しいな
12:16 PM
なるほど
12:16 PM
前方宣言だけしたstructのtypedefか
12:17 PM
そうすると、WASI向けのSwift stdlibが WASILibc に繋ぐところはどうなってるんだ?
12:17 PM
FileHandleとかみてくればいいか
Avatar
ふつうのプラットフォームの UnsafePointer<FILE>OpaquePointerに置き換えるだけ
12:18 PM
incomplete type自体はClangImporterで持ってこれないけど、incomplete typeへのポインタはOpaquePointerに翻訳できる
Avatar
なるほど。
12:18 PM
型チェックが弱くなっちゃうだけでコード生成は問題ないか
Avatar
うむ
Avatar
それで最初のissueの通りの解法になるのね、理解 #if os(WASI) import WASILibc typealias FILEPointer = OpaquePointer #else import Darwin typealias FILEPointer = UnsafeMutablePointer<FILE> #endif func fputs(_ string: String, file: FILEPointer) { _ = string.withCString { (cstr) in fputs(cstr, file) } } fputs("hello stdout", file: stdout) fputs("hello stderr", file: stderr)
Avatar
FatalError出すと騒がしい事になるなw
12:34 PM
1. common.ts/WasmRunnerconsole.error これもその場でスタックトレースを収集する 2. dev.ts/handleErrorconsole.error キャッチしたエラーオブジェクトをダンプしてる これもそこのトレースを出すからややこしい(パスが違うから出るものは違う) 3 dev.tsWebAssembly.RuntimeErrorstack を出してる
Avatar
omochimetaru 5/23/2024 1:54 PM
うーむ bundle コマンドも壊れちゃった
1:54 PM
JSソースが入ってるべきところに 謎の文字列が入っとる
Avatar
ありゃー
Avatar
Swift.Data の description っぽさがある文字列
Avatar
omochimetaru 5/24/2024 1:12 PM
Aをやるための前にBが必要でそのためにCが必要、という感じで大変
Avatar
ブラウザテストはplaywrightとか外部に任せられると楽なのかなぁ
Avatar
omochimetaru 5/24/2024 1:58 PM
Selenium はよく聞きます。playwrightは初めて聞いた。
Avatar
playwright使ってる 結構良いです
😮 1
Avatar
Kishikawa Katsumi 5/24/2024 2:05 PM
Playwrightはスクレイピングでよく使ってる。Puppeteer互換の改良版って感じでよくできてる。
👀 1
Avatar
Rubyでちょっと使った限りでも便利だったしそのへんのエコシステムと仲良くしたいなぁ
2:15 PM
大した人的リソースがあるわけでも無いので、やはりcarton自体の機能を拡充するよりJavaScriptのエコシステムに上手く埋め込めるようにしたい(願望)
Avatar
omochimetaru 5/24/2024 2:36 PM
carton-devがstdoutをisattyをfalseと返す
Avatar
そう、それも調査したいと思ってた
2:41 PM
SwiftPMプラグインプロセスが立ち上がるときにIPCのためにstdoutをstderrにリダイレクトしたりしてるのでそのへんが怪しいかなと思ってました。https://github.com/apple/swift-package-manager/blob/ad7b5ced3cf3af194c10faf4492a9b927f6222d9/Sources/PackagePlugin/Plugin.swift#L81-L107 (edited)
Avatar
omochimetaru 5/24/2024 2:41 PM
driver, plugin, frontend、全ての段階で isatty = falseだ
2:41 PM
driverを直接起動したらtrueになった
Avatar
driverを直接起動しないケースとは?
Avatar
omochimetaru 5/24/2024 2:42 PM
$ swift run carton dev : stdout is not TTY (edited)
2:42 PM
$ .build/arm.../debug/carton dev : stdout is TTY (edited)
2:43 PM
いや、まった、 (edited)
Avatar
frontendの段階のTTY性?
Avatar
omochimetaru 5/24/2024 2:43 PM
ログメッセージを間違えてて自爆した
2:44 PM
driver はどっちで起動してもTTYだ
2:44 PM
pluginに入った時点でTTYじゃなくなる
Avatar
Avatar
Yuta Saito
SwiftPMプラグインプロセスが立ち上がるときにIPCのためにstdoutをstderrにリダイレクトしたりしてるのでそのへんが怪しいかなと思ってました。https://github.com/apple/swift-package-manager/blob/ad7b5ced3cf3af194c10faf4492a9b927f6222d9/Sources/PackagePlugin/Plugin.swift#L81-L107 (edited)
omochimetaru 5/24/2024 2:44 PM
これがあってる予感がする
2:45 PM
TTYって何なのか一生わかってない
Avatar
ぼくもわからない
Avatar
omochimetaru 5/24/2024 2:45 PM
ターミナルかどうか、色つくかどうか ということは知ってるが
2:45 PM
この概念パイプのインターフェースの外側にないか?w (edited)
2:46 PM
// Open a message channel for communicating with the plugin host. pluginHostConnection = PluginHostConnection( inputStream: FileHandle(fileDescriptor: inputFD), outputStream: FileHandle(fileDescriptor: outputFD))
2:46 PM
貼ってくれたハイライト範囲の下にあるこっちが悪いんじゃない?
2:47 PM
いや、わからん なんだこれ?
2:47 PM
なんでinputとinputが繋がるんだ
2:47 PM
難しそうだから置いとこう
2:52 PM
開幕にWasmのstdoutとstderrから0バイトのチャンクを受信する・・・
2:54 PM
browser_wasi_shimは悪くないのかなー
Avatar
WASIシステムコールが呼び出された結果として送信されてますか? (edited)
Avatar
omochimetaru 5/24/2024 2:55 PM
0はストリームエンドじゃないんかな
2:55 PM
わからん。ブレークしてみたらわかるかな。ちょい待って
Avatar
よさそう
Avatar
omochimetaru 5/24/2024 2:57 PM
Avatar
コールスタックもう少し下が見たい
2:58 PM
enqueueJobって多分JSKitのJavaScriptEventLoopなきがする
2:59 PM
1枚目が exports.main だからエントリポイントで、 次がなんか iovecs のループだな
Avatar
ああ、Safariのデバッガは使えないのでChromeで止めてみてください
Avatar
omochimetaru 5/24/2024 3:00 PM
ww
Avatar
間のWebAssemblyコールフレームが見えるようになります。
Avatar
omochimetaru 5/24/2024 3:00 PM
そうだよね、これ間にWASMがあるはずw
3:01 PM
Avatar
あー、プラグインexecutableを叩くやつがstderrもPipeで繋いでるな。ここでtty性が失われてる。 https://github.com/apple/swift-package-manager/blob/ad7b5ced3cf3af194c10faf4492a9b927f6222d9/Sources/Workspace/DefaultPluginScriptRunner.swift#L524-L532 (edited)
Avatar
omochimetaru 5/24/2024 3:02 PM
3:02 PM
ペイン伸ばした
3:03 PM
これ自分で呼んでる fputsから普通に来てるな (edited)
3:03 PM
fputs 1回が単にそのように分割されることがあるのかな?
Avatar
それはそれでおかしい気もする
Avatar
omochimetaru 5/24/2024 3:05 PM
アセンブリだあ
3:07 PM
3:08 PM
fd_write の時点で、iovecs が2つきてて、これの0番が長さ0だからのようだ
Avatar
fd_writeの引数として空のiovecが来てるのか
Avatar
omochimetaru 5/24/2024 3:09 PM
すげーたどり着いた
Avatar
前回書ききれなかったバッファ分かなー
Avatar
omochimetaru 5/24/2024 3:10 PM
そんな雰囲気があるね
3:10 PM
baseこれから送る分でwbaseが書き終わった部分
3:10 PM
iovec[1] は新たに引数で受けたやつ
Avatar
だから初回は空を送ることになってちょっと無駄だけどまあ初回だけだからいいか、という割り切り
3:11 PM
muslらしい
Avatar
omochimetaru 5/24/2024 3:12 PM
なるほどなあ
Avatar
プラグインの中でisatty判定は無理かなという結論になりました。
3:16 PM
SwiftPMが端末からブチッと切り離してプラグインプロセスを立ち上げるので無理
Avatar
omochimetaru 5/24/2024 3:17 PM
SwiftPM直した方がいいんじゃないかしら
3:17 PM
プラグインコマンドなんだから
3:17 PM
コマンドっぽく動くべき
3:17 PM
cartonに限らず色付けサポートはswift pluginのユースケースで絶対みんな欲しい機能なはずだし (edited)
3:19 PM
しかしこれシンプルな再現取ってお話し投稿するのも結構めんどいなw
Avatar
多分buildToolプラグインと共通になってるんだろうなー
3:20 PM
commandプラグインならSwiftPMが端末切り離すべきではない
👆 1
3:20 PM
たかが色付けのために面倒くさい。。
Avatar
omochimetaru 5/24/2024 3:21 PM
我らJSON色付け業としてもな
Avatar
それは「たかが」ではないw
Avatar
omochimetaru 5/24/2024 3:44 PM
Chromeの出すスタックトレースをパースできなくてコンソールに出ない・・・
3:45 PM
3:46 PM
wasmRegexが期待と違ってそうだ。
Avatar
Jedがやってたやつかー
3:49 PM
テストはあったはずだけどブラウザ側の出力が変わったのかな? (edited)
Avatar
omochimetaru 5/24/2024 3:50 PM
テストは入力が焼かれてるからパーサーのテストであって連携のテストではなさそうだった
Avatar
全部パースするの無理なんで行ごとにデマングルできる部分をデマングルするだけで良いと思う
Avatar
omochimetaru 5/24/2024 3:51 PM
あーなるほど
Avatar
swift-demangleとかcxxfiltとかそういう思想
Avatar
omochimetaru 5/24/2024 3:52 PM
どうせ目で読むだけだから書式構造までパースする必要なくて、ブラウザが作る書式を目で読めたらいいってことね
3:53 PM
(文終わった
Avatar
そうそう
3:54 PM
Avatar
omochimetaru 5/24/2024 3:55 PM
repro付きだ はやい
Avatar
暇なときに直そう
Avatar
omochimetaru 5/24/2024 4:32 PM
再現これだけか なるほど
4:32 PM
プラグインだからめんどくさい気がしてたけど、別にパッケージ作ってプラグイン置くだけなんすな
4:32 PM
自身のプロジェクトの場合と依存されてる場合で同じなのはいいね
Avatar
Squashマージしたらおもちブランチがめっちゃコンフリクトしちゃった…
Avatar
omochimetaru 5/24/2024 4:35 PM
あれ?
4:36 PM
ああ、[2/2]の方か
4:36 PM
いや、これはそもそも分岐した後で1を直したから
4:37 PM
どうせぶっ壊れる想定だった
Avatar
なるほど (edited)
Avatar
omochimetaru 5/24/2024 4:48 PM
squash mergeの影響あるな・・・ rebaseが壊れまくるw
4:49 PM
2/2はmergeしてからsquashしたらダメだな 一旦squashしてからrebaseするべきだこれ (edited)
Avatar
rebase ontoで上手くいくような気もする
Avatar
omochimetaru 5/25/2024 3:31 AM
swiftwasmorgのplaygroundは2.7秒だったけど
3:31 AM
@Kishikawa Katsumi の Swift Fiddle は 0.3秒だ
3:32 AM
URL: https://swiftfiddle-runner.onrender.com/runner/5.10.0/run
3:32 AM
Renderってサーバを使ってるんですかね? のりおさんのbotと同じかな
3:33 AM
まあWasmバイナリを落としてるか実行結果だけ貰ってるかとか比較条件が色々違うけども
Avatar
Kishikawa Katsumi 5/25/2024 3:33 AM
SwiftFiddleはSwift 5.10はRender.comのホスト上で直接実行しててそれ以外のバージョンはAzureのContainer apps(Cloud Runみたいなやつ)で動いてます。
Avatar
omochimetaru 5/25/2024 3:34 AM
なるほど。5.9に切り替えたら38秒かかったw
3:35 AM
再実行で1.7秒
3:35 AM
2回目以降は2秒弱で安定した
Avatar
Kishikawa Katsumi 5/25/2024 3:36 AM
観測上最新バージョン以外のリクエストはほとんどないんですよね。思想として過去のバージョンで実行できるようにはしておきたいけど同じホストに全部抱えられないし実行もほとんどされないので、って感じ。
Avatar
omochimetaru 5/25/2024 3:37 AM
5.8に切り替えたら38秒かかった。バージョンごとに別になるんですね。
Avatar
Avatar
Kishikawa Katsumi
観測上最新バージョン以外のリクエストはほとんどないんですよね。思想として過去のバージョンで実行できるようにはしておきたいけど同じホストに全部抱えられないし実行もほとんどされないので、って感じ。
omochimetaru 5/25/2024 3:37 AM
なるほど。うまい設計だと思います。
3:38 AM
オートスケール的なやつじゃない生ホストは速いですね。
Avatar
AzureのContainer appsって立ち上がり遅いんですよね
Avatar
omochimetaru 5/25/2024 3:39 AM
確かに、たまたまswiftorgがGCPでwasm padがAWSでfiddleがAzureだから、それぞれの時間差が観測できた。 (edited)
3:40 AM
初回が遅いのは別にいいと思うから、2回目以降はその仕組みのマシンの強さ次第だろうな、コンパイラだと
3:41 AM
ところで、僕がfiddle使うのはむしろ最新以外を検証したいときだからマイナーなユースケースだな
Avatar
omochimetaru 5/26/2024 1:42 PM
おお
Avatar
とりあえずpthread_createが動くだけ
Avatar
omochimetaru 5/26/2024 1:43 PM
Render Time が変わらないけど wasmvm 上でスレッド風に動いてるだけ?
1:43 PM
いや、少し早くなってるか?
Avatar
Concurrency Executorとの連携もやらないとちゃんと使えないけどとりあえず本物のスレッドが手に入った
1:43 PM
モバイルだとあんまりスレッド数で性能伸びないですね
Avatar
omochimetaru 5/26/2024 1:43 PM
macだよ
Avatar
Safari?
Avatar
omochimetaru 5/26/2024 1:44 PM
うん safari
Avatar
ほんとだ
1:44 PM
Chromeだと結構変わる
Avatar
omochimetaru 5/26/2024 1:45 PM
chromeで1,2,4はわかりやすいな 8は遅くなった
Avatar
遅くなるのはだいたいメモリアロケータのロック取り合ってる部分ですね
Avatar
omochimetaru 5/26/2024 1:45 PM
safariも1,2,4で改善で8で悪化なのは一緒か 値の変化が小さくて見逃してた
1:46 PM
これって本当に並列実行されてるの?
1:46 PM
WebWorkerはメモリ共有できないからブラウザでは真の並列化はできないと思ってた
Avatar
Web Workerで動いてるんで本当にされてる
1:46 PM
メモリ共有できますよ
Avatar
omochimetaru 5/26/2024 1:46 PM
できたのか
Avatar
SharedArrayBufferってやつ
Avatar
omochimetaru 5/26/2024 1:46 PM
あ〜明示的にやればできるのか (edited)
Avatar
まあメモリの共有ができなくても並列化はできる (edited)
Avatar
omochimetaru 5/26/2024 1:47 PM
wasmだからそれに丸ごと載せちゃえばいいのね
Avatar
Avatar
Yuta Saito
まあメモリの共有ができなくても並列化はできる (edited)
omochimetaru 5/26/2024 1:47 PM
や、それだとユーザにとってスレッドらしくないので。
Avatar
スレッドらしいインターフェースをやるには必要すね
Avatar
omochimetaru 5/26/2024 1:48 PM
通常のJSオブジェクトをそのまま共有してGCと共存するのはできないけど
1:48 PM
メモリ領域を共有する機構はあるから
1:48 PM
Wasmならそのまま共有できるということかな
Avatar
だいたいそんな感じ
Avatar
omochimetaru 5/26/2024 1:49 PM
今webdriverがなぜかLinuxのURLSessionだとうまくいかないのを調べてて おそらく URLSessionの下請け実装のcurlがエラーを返してることはわかったんだけど、 色々やっても何が悪いのかわからない (edited)
Avatar
これまでもメモリを共有せずにメッセージパッシングでWeb Workerで並列化はできたんだけど、
1:49 PM
大きなメモリ操作を裏でやりたいワークロードがあって必要になった
Avatar
Avatar
omochimetaru
今webdriverがなぜかLinuxのURLSessionだとうまくいかないのを調べてて おそらく URLSessionの下請け実装のcurlがエラーを返してることはわかったんだけど、 色々やっても何が悪いのかわからない (edited)
あー、
1:50 PM
URLSessionおかしいの僕も見ました
Avatar
omochimetaru 5/26/2024 1:50 PM
POSTができないのかと思ったけど、適当なサーバプロセスにPOSTさせたら成功したし
Avatar
なのでcurlコマンドを実行するモードを入れたはず
Avatar
omochimetaru 5/26/2024 1:50 PM
じゃあPOST内容が悪くてchromedriverがブツ切りしてるのかと思って
1:50 PM
送信内容を収集して同じ内容を手でcurlで送ったらちゃんと動くし
Avatar
Avatar
Yuta Saito
なのでcurlコマンドを実行するモードを入れたはず
omochimetaru 5/26/2024 1:51 PM
これが経緯だったのか。そんな気がしてた
Avatar
async-http-client使ってた頃は普通に送れてたんで多分URLSessionがわるい
Avatar
omochimetaru 5/26/2024 1:51 PM
AHCを剥がした時からなのか。
1:52 PM
Failed writing header っていうエラメッセージが内部に出てて
1:52 PM
これは curl が出力する文言だということまでわかったよ
1:52 PM
おそらくここ (edited)
1:52 PM
if(writeheader) { size_t wrote = writeheader(ptr, 1, chunklen, data->set.writeheader); if(CURL_WRITEFUNC_PAUSE == wrote) /* here we pass in the HEADER bit only since if this was body as well then it was passed already and clearly that didn't trigger the pause, so this is saved for later with the HEADER bit only */ return pausewrite(data, CLIENTWRITE_HEADER, ptr, len); if(wrote != chunklen) { failf (data, "Failed writing header"); return CURLE_WRITE_ERROR; } }
1:53 PM
だけどなんでこれになるのかがわからない
1:53 PM
chromedriverをverboseモードで動かしてみると、chromedriver側はresponseのjsonをちゃんと返してるっぽくて、sessionIDが発行されている
Avatar
FoundationNetworkingとlibcurlのつなぎ目のデバッグは大変なんだよなぁ
Avatar
omochimetaru 5/26/2024 1:56 PM
コマンドのcurlを叩いた方が上手くいくなんて許せねえよ・・・
Avatar
あれ、そういえばこれってmacOS上で再現するんでしたっけ
Avatar
omochimetaru 5/26/2024 1:57 PM
いいえ Linuxだけの話
1:57 PM
今mac上のdockerの中で carton の swift test を動かしてる (edited)
Avatar
なるほどそういう状況
Avatar
omochimetaru 5/26/2024 1:57 PM
で、mac側のchromedriverをREMOTE_URLで渡してる
1:58 PM
それでCIで起きてるのと同じエラーが出てる気はする 、-1というエラーコードは一致した
1:58 PM
CIではエラーオブジェクトの中身が見れてないからそこの尻尾は掴めてないけど
1:58 PM
まあ手元でもこれはそもそも壊れてるので調べている
Avatar
Avatar
Yuta Saito
async-http-client使ってた頃は普通に送れてたんで多分URLSessionがわるい
omochimetaru 5/26/2024 1:59 PM
しかし、そういうことなら、最初からずっと壊れてるわけだから、 FoundationNetworkingのlibcurlの扱いにバグがあって、 それを踏む条件が通信相手のサーバの挙動による、 というのが一番ありそうだなあ
Avatar
まず全てをビルドする環境を作らないと
2:02 PM
そうだ、ビルドが面倒だからcorelibs-foundationのpackageブランチがマージされたら調査しようと思ってたんだった。
Avatar
omochimetaru 5/26/2024 2:03 PM
えーとそれは、Foundationとlibcurlの接続部分のロジックをデバッグするなら、って話? (edited)
Avatar
そうそう
Avatar
omochimetaru 5/26/2024 2:04 PM
ああ、その範囲まで疑いは詰めてるのか。
2:04 PM
そうね、ここは大変だ。今は置いとこう・・・
2:04 PM
全部ビルドしなくてもここの関連ソースだけコピペして実験できそうな気はするけど。
Avatar
いま再現環境あればチケット作ってもらえると助かります
Avatar
omochimetaru 5/26/2024 2:05 PM
これはあると言えるのか・・・? エラーを再現するという意味なら $ swift test --filter WebDriverClientTests.testGotoURLSession で踏む状態にはなってる
Avatar
そこそこデカいな
Avatar
omochimetaru 5/26/2024 2:06 PM
でもデバッグ作業するなら色々努力は要る
Avatar
Avatar
Yuta Saito
そこそこデカいな
omochimetaru 5/26/2024 2:07 PM
新規のロジックはほぼなくて構造を組み直してるだけだから Curlを探してくるところだけ消せば今のmainでもおそらくエラーは踏めるよ (edited)
Avatar
なら最小再現だけ作っておくかー
Avatar
クライアント側は相当小さく出来た import Foundation import FoundationNetworking let defaultSessionRequestBody = #""" { "capabilities": { "alwaysMatch": { "goog:chromeOptions": { "w3c": true, "args": ["--headless", "--no-sandbox"] }, "moz:firefoxOptions": { "args": ["-headless"] }, "ms:edgeOptions": { "args": ["--headless", "--no-sandbox"] } } } } """# do { var request = URLRequest(url: URL(string: "http://0.0.0.0:9515/session")!) request.httpMethod = "POST" request.httpBody = defaultSessionRequestBody.data(using: .utf8) let _: (Data, URLResponse) = try await withCheckedThrowingContinuation { continuation in let task = URLSession.shared.dataTask(with: request) { (data, response, error) in guard let data = data, let response = response else { let error = error ?? URLError(.badServerResponse) return continuation.resume(throwing: error) } continuation.resume(returning: (data, response)) } task.resume() } } catch { print("Error: \(error)") exit(1) }
Avatar
これで SwiftWasm も 5.10 リリースができそうな https://github.com/apple/swift/releases/tag/swift-5.10-DEVELOPMENT-SNAPSHOT-2024-05-26-a
Tag build swift-5.10-DEVELOPMENT-SNAPSHOT-2024-05-26-a
Avatar
omochimetaru 5/28/2024 3:35 AM
うお でた
Avatar
おお2ヶ月ぶりのスナップショット
3:36 AM
もう出ないだろうと思って6.0の準備してた 😂
😂 1
Avatar
omochimetaru 5/28/2024 3:36 AM
3:36 AM
3:36 AM
気がついたのか パッチが伸びていたことに
3:36 AM
もしかして、こういうのも言えば出るのか?
3:37 AM
次似たような状況があったらdevelopment forumでお願いしてみようかな。
3:41 AM
マジでめちゃくちゃ重要なパッチだったからな
Avatar
記憶が正しければci.swift.orgのインフラがずっと壊れてたんだよなー
Avatar
修正されたってことですかね
Avatar
一応スナップショットほしいんだよねぇという話はしてたんですけど何もアップデートなかったんで、今回急に治ったのは5.10系のパッチリリースをすることになったのではないかな
Avatar
omochimetaru 5/28/2024 3:43 AM
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
3:43 AM
Adding more exported C++ symbols Replace assertEquals with assertEqual (edited)
3:44 AM
なんかちょこちょこ伸びてたんだね
Avatar
一個目はFedora向けで二個目はテスト
3:45 AM
CI通すためにテスト直すのはわかるけどFedoraってCIあったっけ?
Avatar
omochimetaru 5/28/2024 3:45 AM
The libstdc++ on Fedora 40 has more symbols that get exposed through libstdc++!
Avatar
と思ったら増えてた
Avatar
omochimetaru 5/28/2024 3:45 AM
ほんとだ。むずいな
3:46 AM
つい先週生えたっぽい
👀 1
Avatar
omochimetaru 5/28/2024 3:46 AM
ほお〜 なんでまた急に
3:46 AM
embeddedを使いたいチームの開発環境がそうなんだろうか
Avatar
Meta - OS: macOS * Selenium Version: selenium-webdriver@4.0.0-alpha.1 Browser: Safari Browser Version: * Expected Behavior - Chrome and Firefox allow a .headless() method to indicate the browser sh...
12:27 PM
Safariのwebdriverにはheadlessモードがないらしい
Avatar
ひとまずSwiftPMの修正が入った5.10スナップショットはできた https://github.com/swiftwasm/swift/releases/tag/swift-wasm-5.10-SNAPSHOT-2024-05-28-a
9:53 AM
あとはcorelibs-foundation側にいくつかバックポートすれば --build-testsが治るはず。しかし5.10と6.0の間でパッチ管理の方法を変えたのでバックポートがちょっとムズい
Avatar
omochimetaru 5/29/2024 9:57 AM
おお
Avatar
@Yuta Saito これどうするのがいいんだろ?
12:58 PM
--host 0.0.0.0 だったら接続アドレスとしては 127.0.0.1 に読み替える、というのも思いつくけど。
Avatar
Next generation frontend tooling. It's fast! Contribute to vitejs/vite development by creating an account on GitHub.
Avatar
omochimetaru 5/29/2024 1:01 PM
なるほど。他所のプラクティスを参考にするのはいい考えだな
Avatar
感覚としてbindするhostから接続可能なアドレスのリストが導けると思っていたんですが、
Avatar
omochimetaru 5/29/2024 1:02 PM
リバースプロキシが挟まったりNATがあったりする場合もあるから自身からはわからないというのが原則だと思います
Avatar
そうでも無さそうということがわかってきまきた
1:03 PM
で、この辺りを見てるとワイルドカードとループバックは特別扱いしてたり結構色々してる https://github.com/vitejs/vite/blob/e861168f476b8cb278f599a0341076b0511c5264/packages/vite/src/node/constants.ts#L131
Avatar
omochimetaru 5/29/2024 1:03 PM
Docker環境内部で立ち上げる場合は自身から見ると 172.20... みたいなよくわからんアドレスだけど、Dockerホストがポートフォワードする、みたいなのはよくあるNAT状況
Avatar
その状況はそもそもDockerの中からブラウザを開くことが出来ないのでは (edited)
Avatar
omochimetaru 5/29/2024 1:05 PM
open コマンドはダメだけど、 WEBDRIVER_REMOTE_URL を使えばいけるんだよね
Avatar
あー、そうかー
Avatar
omochimetaru 5/29/2024 1:05 PM
実際、5.10 (test build) と6.0 (OS 9999)の問題が治るのを絶望視してたからそっちの方法で検討してた。 (edited)
Avatar
Avatar
Yuta Saito
で、この辺りを見てるとワイルドカードとループバックは特別扱いしてたり結構色々してる https://github.com/vitejs/vite/blob/e861168f476b8cb278f599a0341076b0511c5264/packages/vite/src/node/constants.ts#L131
omochimetaru 5/29/2024 1:07 PM
これ怪しいなあ。 IPv6のダブルコロンは、この間のパターンもあり得るはず。 ::0000:0000:0000:0000 とか 0000:0000:0000:0000:0000:0000:: も良いはずだ
1:07 PM
展開してからバイナリで判定すべき
1:07 PM
まあでも特別扱いしてるってのがポイントか
1:08 PM
vitejsのこれ出したいな、と思ってる
Avatar
viteはあくまでログ情報として出すだけなので間違ってても最悪ok
naruhodo 1
Avatar
omochimetaru 5/29/2024 1:08 PM
npx serveもこれでる
1:09 PM
これ欲しい理由は実際に起動したポート番号がいくつかわかんないってのが第一 (edited)
1:09 PM
第二はここでmacでコピーしてiPhoneにペーストできたりして便利 (Appleの魔法前提) (edited)
1:10 PM
自分のIPアドレスをすぐ調べられない事もよくある。(俺は流石にテク覚えたけど)
1:11 PM
まあこの話は関係ないかも?もしかしたらあるかなと思って書いた (edited)
Avatar
WEBDRIVER_REMOTE_URL のことを考えるとやっぱりbindするアドレスと接続しに行くアドレスの両方が設定可能でないといけないから --listen しか無いかもしれないですねぇ
👆 1
1:15 PM
サービング情報を出すのは良いと思います
Avatar
omochimetaru 5/29/2024 1:16 PM
どっちかがどっちかのデフォルトを上手く埋めると多少便利かなとは思います
1:17 PM
例えば --listen192.168.1.2 を埋めた場合は、 --host のデフォルトが 127.0.0.1 から 192.168.1.2 に変わる
1:18 PM
少なくとも元の 127.0.0.1 では絶対接続できないので、良い代替なはずだ
1:18 PM
192.168.1.2 では多くの場合で接続できるが、NATを介するなどの都合がある人は正しい指定をさらに上書きする。
Avatar
90%のニーズが満たせるデフォルト値ならよさそう
Avatar
omochimetaru 5/29/2024 1:19 PM
--listen のデフォルトが 0.0.0.0 だとして、 0.0.0.0127.0.0.1 の読み替えを導入して、 --host のデフォルトになればいいかな。
1:19 PM
そうすると --host を省略した場合は --listen に基づいて決まるという一貫性が得られる (edited)
1:20 PM
逆もありえるのかな・・・?
1:20 PM
--host だけ指定してて --listen がない場合。
1:21 PM
その場合は hostの127.0.0.1 に対して、listen 127.0.0.1 が正当な指定だから、 0.0.0.0 は出てこないのが微妙だけど
Avatar
逆はないのでは
Avatar
omochimetaru 5/29/2024 1:22 PM
一般的には --host だけ指定する事が多いのが気になっている (edited)
Avatar
そうなんですか?
Avatar
omochimetaru 5/29/2024 1:22 PM
経験上は。
Avatar
その --host は実は我々の --listen の意味で使われてたり
Avatar
omochimetaru 5/29/2024 1:23 PM
そんな気がする。
1:24 PM
WEBDRIVERでNAT越え考えてるのが特殊だとは思う。 (edited)
Avatar
Avatar
Yuta Saito
逆はないのでは
omochimetaru 5/29/2024 1:25 PM
やっぱり host → listen の導出は入れないことにして、 listenはデフォルトで0.0.0.0、が良い気がしてきた。 そもそも僕がやりたかったのはそれだし。 (edited)
Avatar
それが良さそう。
Avatar
omochimetaru 5/29/2024 1:25 PM
特殊ギミックはlisten → hostの導出だけ
1:27 PM
じゃあその方針で改修します、今夜はやらないけどまた後日
Avatar
どもども
Avatar
今日のスナップショットでテストのビルド直ってます。やったね swift-wasm-5.10-SNAPSHOT-2024-05-29-a
🎉 1
Avatar
omochimetaru 5/30/2024 9:12 AM
やった〜
Avatar
カコイチのペースでコミットが増えてる https://github.com/swiftwasm/carton/graphs/contributors
📦 Watcher, bundler, and test runner for your SwiftWasm apps - Contributors to swiftwasm/carton
Avatar
omochimetaru 6/4/2024 12:46 PM
直したいところが多すぎる
12:47 PM
まだ初日に潜った時のメモが消化しきれてない
Avatar
www
12:47 PM
あと何割残ってるんですか
Avatar
omochimetaru 6/4/2024 12:48 PM
14/34個
Avatar
半分にすら到達してなかった
Avatar
omochimetaru 6/4/2024 12:48 PM
最初20個ぐらいだったけどやりながら増えて34になってる
12:48 PM
大したことは考えてないんだけど、ここいじるならその前にここ整えたいな、みたいな入れ子構造が止まらない
12:50 PM
謎の3層アーキテクチャが面白いからせっかくなら中身も整っていて欲しいという気持ちになってる
12:50 PM
Motivation: The build database should be shared between different triple builds to re-generate the build manifest correctly. With the current implementation, the following build command sequence fa...
12:51 PM
これマージされたね
Avatar
ただのCLIツールだったのに謎プロセスが3層も…
12:53 PM
最近SwiftPMのビルドシステム直しててだんだんとインクリメンタルビルドが全然信用できなくなってきた
Avatar
omochimetaru 6/4/2024 12:54 PM
swiftpmの世界でお行儀よくビルドするためにpluginにする、というのが筋が通ってる気はした (edited)
Avatar
Avatar
Yuta Saito
最近SwiftPMのビルドシステム直しててだんだんとインクリメンタルビルドが全然信用できなくなってきた
omochimetaru 6/4/2024 12:54 PM
バグがある事を知ったから、ってこと?
Avatar
結構バグあるしSwiftPMの方ではインクリメンタルビルドのテストが全然カバーされてないんですよね
Avatar
omochimetaru 6/4/2024 12:55 PM
なるほど
12:55 PM
まあ実際毎日踏んでる
12:56 PM
ローカル参照してる依存パッケージの中の型のinitを変更して引数を増減させた時、リビルドされなくてリンクエラーになる (edited)
12:57 PM
Xcodeのバグだと思ってたけど最近特定のパターンでSwiftPMも100%ダメなことがわかってきた
Avatar
RegexBuilderのリンクエラーのやつも安定して再現できる手順は確立して、どうやらSwiftDriverのインクリメンタルビルド機能がおかしそうなところまで突き止めたんだけど、その先が意味不明すぎて寝かせてる https://github.com/kateinoigakukun/swiftwasm-issue-gh-5580/blob/main/check.sh (edited)
Avatar
Avatar
omochimetaru
ローカル参照してる依存パッケージの中の型のinitを変更して引数を増減させた時、リビルドされなくてリンクエラーになる (edited)
これもSwiftDriver起因っぽいなぁ
Avatar
omochimetaru 6/4/2024 12:59 PM
swift compilerに入ってる依存シンボル洗い出し機能みたいなやつをベースに使ってるはずだから
12:59 PM
そっちのバグで単にinitの変更が実装漏れしてるんじゃないかと想像しているけど(swift driverはその問題に引きづられてるだけで無罪説) (edited)
12:59 PM
まあcleanすればいいかで深追いしてない
Avatar
Avatar
Yuta Saito
RegexBuilderのリンクエラーのやつも安定して再現できる手順は確立して、どうやらSwiftDriverのインクリメンタルビルド機能がおかしそうなところまで突き止めたんだけど、その先が意味不明すぎて寝かせてる https://github.com/kateinoigakukun/swiftwasm-issue-gh-5580/blob/main/check.sh (edited)
omochimetaru 6/4/2024 1:00 PM
なるほど、こういう感じのスクリプトで再現シナリオを組むところを目指せばいいのか。
1:02 PM
[omochi@omochi-mbp carton (org-procs *=)]$ swift test --filter DevCommandTests.testWithNoArguments Building for debugging... [5/5] Write swift-version-3874884F1997D323.txt Build complete! (0.37s) Test Suite 'Selected tests' started at 2024-06-04 22:01:42.891. Test Suite 'cartonPackageTests.xctest' started at 2024-06-04 22:01:42.892. Test Suite 'DevCommandTests' started at 2024-06-04 22:01:42.892. Test Case '-[CartonCommandTests.DevCommandTests testWithNoArguments]' started. warning: 'echoexecutable': 'my-echo' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' [0/1] Planning build Building for debugging... [0/4] Write sources [1/4] Write swift-version-3874884F1997D323.txt [3/6] Emitting module CartonCore [4/6] Compiling CartonCore FoundationProcessEx.swift [4/7] Write Objects.LinkFileList error: link command failed with exit code 1 (use -v to see invocation) Undefined symbols for architecture arm64: "static (extension in CartonCore):__C.NSTask.checkRun(_: Foundation.URL, arguments: [Swift.String], printsLoadingMessage: Swift.Bool, didExit: (() -> ())?, forwardExit: Swift.Bool) throws -> ()", referenced from: CartonDriver.derivePackageCommandArguments(swiftExec: Foundation.URL, subcommand: Swift.String, scratchPath: Swift.String, extraArguments: [Swift.String]) throws -> [Swift.String] in CartonDriverCommand.swift.o CartonDriver.derivePackageCommandArguments(swiftExec: Foundation.URL, subcommand: Swift.String, scratchPath: Swift.String, extraArguments: [Swift.String]) throws -> [Swift.String] in CartonDriverCommand.swift.o (3) suspend resume partial function for CartonDriver.pluginSubcommand(subcommand: Swift.String, argv0: Swift.String, arguments: [Swift.String]) async throws -> () in CartonDriverCommand.swift.o (5) suspend resume partial function for CartonDriver.main(arguments: [Swift.String]) asy
1:02 PM
今まさに踏んでて草
1:02 PM
didExitを消した変更が見逃されている
Avatar
厳しい
1:03 PM
libSwiftScanってやつを追えば良いのかなぁ
Avatar
omochimetaru 6/4/2024 1:03 PM
そんなんだった気がするな。
1:03 PM
あ、でも、それ(依存先列挙機構)のせいかどうかはまだ確定していないよ、当てずっぽう (edited)
Avatar
llbuild、SwiftPM、SwiftDriver、libSwiftScan、容疑者が多すぎる
Avatar
omochimetaru 6/4/2024 1:04 PM
そうねwww
1:05 PM
家庭くんが興味持ってるうちにまずは再現キット作ることを目指すか。今度やってみる。 (edited)
Avatar
セットで直せると良いな
Avatar
omochimetaru 6/4/2024 1:28 PM
うーむ
1:29 PM
swiftpmがpluginを実行するとき
1:29 PM
pluginのstderrを swift-packageのstdoutに付け替えられてる気がする
Avatar
あれそれこの間話さなかったっけ
Avatar
omochimetaru 6/4/2024 1:30 PM
聞いてないと思う 既知だったか
Avatar
omochimetaru 6/4/2024 1:32 PM
なんかコードは見た記憶があるな 別の文脈でその話も含まれていたのかも
Avatar
それだ
Avatar
omochimetaru 6/4/2024 1:33 PM
俺はこの話題については、その時付け替えてる事じゃなくてパイプで吸ってることが問題だと思ったから、付け替えてる事は忘れてた。 (edited)
1:33 PM
うーん、だから、そうか・・・
1:35 PM
てかこの付け替え自体も微妙じゃない?コマンドの振る舞いが消えてしまう
1:35 PM
マネージドな気持ちなのかもしれんが大した意味ないし (edited)
Avatar
お行儀よくするためにはPackage.swiftの評価器と同じようにSwiftPM側でパイプ作ってfdをプラグインに渡すのが良いと思う (edited)
1:36 PM
コマンドの振る舞いって何でしたっけ
1:38 PM
幸いPackagePluginとSwiftPMは同じバージョンからビルドされたものが常にセットで使われるからこの辺のIPCのインターフェースは変え放題
Avatar
Avatar
Yuta Saito
コマンドの振る舞いって何でしたっけ
omochimetaru 6/4/2024 1:39 PM
単にstderrに出力してるのにswift packageを通してみるとstdoutに出力する振る舞いになるという点がcommand pluginがコマンドとして振る舞ってる見え方を変えててよくない
Avatar
ああ、それはそうですね。
Avatar
omochimetaru 6/4/2024 1:39 PM
https://nxmnpg.lemoda.net/ja/3/forkpty ChatGPTに聞いたんだけど forkptyという関数を使って取得するfdを使うと書き込み側から見てttyに見えるらしい (edited)
1:42 PM
一般にサブプロセスに対してout, errの付け替えをしなかった場合は
1:42 PM
親プロセスのout, errをそのまま同じものをもらってくるから
1:43 PM
それで、親プロセスはシェルから起動するときにptyをもらってるので、サブプロセスも出口がttyに見えている、という仕組みじゃなかろうか
Avatar
そんな雰囲気
Avatar
Avatar
Yuta Saito
お行儀よくするためにはPackage.swiftの評価器と同じようにSwiftPM側でパイプ作ってfdをプラグインに渡すのが良いと思う (edited)
omochimetaru 6/4/2024 1:45 PM
コマンドプラグインについてはパイプを作らずにそのまんま動かすのがいちばんよくない?
Avatar
いや、SwiftPM側と通信しないといけないんでパイプは必要ですね
1:46 PM
ビルドのリクエストとか
Avatar
omochimetaru 6/4/2024 1:47 PM
carton plugin が carton frontend を呼び出す部分の話してる? 俺は swift package が carton plugin を呼び出す部分のことを言ってた
Avatar
SwiftPM <-> CartonPluginの間ですね
Avatar
omochimetaru 6/4/2024 1:47 PM
あれ、そこもか
1:47 PM
あ〜
1:47 PM
プラグインのビルド機能を起動したりする方か (edited)
Avatar
SwiftPM Plugin自体はビルドのコントロールを持ってなくて
Avatar
omochimetaru 6/4/2024 1:48 PM
そこもリクエストを送ってるのね
Avatar
そうそう。SwiftPMプロセスにお願いするんで
Avatar
omochimetaru 6/4/2024 1:48 PM
機能が関数としてリンクされてるわけじゃないのか。 (edited)
1:48 PM
ふーむなるほど
Avatar
そんなことしたらサンドボックスに閉じ込められないじゃないですかぁ
Avatar
omochimetaru 6/4/2024 1:49 PM
閉じ込められていたのか・・・
Avatar
omochimetaru 6/4/2024 2:01 PM
ttyに見せかけるのできそうだけどややこしくなるし正しい道なのか疑問になってきた swiftpmをいじるよりcarton-frontendがswiftpm pluginから叩かれてる事を伝えてもらうようにして、 そのときはttyにつながってないように見えようともカラーコードを出すのが仕組みとしてシンプルで良い気がする (edited)
2:02 PM
このへんもう一個わかったことがあって、 xcodeでテスト実行するとcarton-frontendはttyにつながってると思ってカラーコードを出すんだけど、
2:02 PM
xcodeのコンソールがそれに対応してないからカラーコードが文字化けみたいに出てくるので
2:03 PM
TERM=dumb を設定して、ttyであろうが、ttyでないとみなしてカラーコードを出させない
2:03 PM
という制御が現状でも有効だった
Avatar
SwiftPM Pluginが常にttyにつながってるわけじゃないのがなぁ
Avatar
omochimetaru 6/4/2024 2:04 PM
繋がってない事もある??
2:04 PM
$ swift package carton-dev から来てるんじゃないのか
Avatar
普通にttyに繋げずにSwiftPMを起動したら
Avatar
omochimetaru 6/4/2024 2:05 PM
$ swift package 自体を空中で起動した場合か。
2:05 PM
Xcodeとかそういうことしてるのかな
Avatar
SwiftPM PluginプロセスのstderrをSwiftPMからPipeで吸い出すのをCommand Pluginのときに辞めるだけでは解決しないですか? (edited)
Avatar
omochimetaru 6/4/2024 2:07 PM
pipeを作らずに、そのままoutとerrを継承させるパターンにするってこと?
Avatar
outはIPCにつかうんでstderrだけ
Avatar
omochimetaru 6/4/2024 2:08 PM
それだとoutのメッセージが色つかない
Avatar
プラグインプロセスから見たfd 0はstderrにリダイレクトされてるんで
Avatar
omochimetaru 6/4/2024 2:08 PM
あ~
Avatar
どっちも親プロセスから見るとstderrに出る
Avatar
omochimetaru 6/4/2024 2:09 PM
それでいいのかな。
2:09 PM
IPC用にパイプを別に作る道はないのかしら
2:09 PM
3番とか
Avatar
それをやってるのがPackage.swiftの評価器ですね
Avatar
omochimetaru 6/4/2024 2:09 PM
なるほど
Avatar
それがお行儀がいいと思うけど若干テストがしにくくなる
Avatar
omochimetaru 6/4/2024 2:10 PM
梅と竹か
Avatar
よりどりみどり
Avatar
omochimetaru 6/5/2024 12:55 PM
ん〜なんか変だ
12:55 PM
let process = try swiftRunProcess( ["carton", "dev", "--verbose", "--port", "8080", "--skip-auto-open"], packageDirectory: packageDirectory.asURL ) ↑このxctestの中で立ち上げた swift run プロセスの出力が xctest の出力に出てこない
12:56 PM
func swiftRunProcess( _ arguments: [String], packageDirectory: URL ) throws -> SwiftRunProcess { let swiftBin = try findSwiftExecutable().pathString var outputBuffer = Array<UInt8>() let process = CartonHelpers.Process( arguments: [swiftBin, "run"] + arguments, workingDirectory: try AbsolutePath(validating: packageDirectory.path), outputRedirection: .stream( stdout: { (chunk) in outputBuffer += chunk stdoutStream.write(sequence: chunk) }, stderr: { (chunk) in stderrStream.write(sequence: chunk) }, redirectStderr: false ) )
12:56 PM
これで書き込めてるはずなのに・・・
12:58 PM
flushしたら出てきた
Avatar
5.10.0のリリースに合わせてcartonリリースしたいんですが入れないといけない変更残ってますか?
10:03 AM
@omochimetaru
Avatar
omochimetaru 6/6/2024 10:19 AM
特に入れないといけないやつとかはないですね
Avatar
👌
Avatar
omochimetaru 6/7/2024 11:43 AM
Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc? Confirmed reproduction steps with SwiftPM CLI. Description You can reproduce the crash by running the...
11:44 AM
例の9999がrdar付いた
Avatar
omochimetaru 6/7/2024 12:38 PM
@Yuta Saito devコマンドのここの Diagnostics.remark って、ターミナルに文字列が表示される想定なんでしょうか?実際には何も出ないんだけど、どこの何の問題なんだろう? let buildRequestFileHandle = FileHandle(forReadingAtPath: buildRequestPipe)! let buildResponseFileHandle = FileHandle(forWritingAtPath: buildResponsePipe)! while let _ = try buildRequestFileHandle.read(upToCount: 1) { Diagnostics.remark("[Plugin] Received build request") let buildResult = try self.packageManager.build(buildSubset, parameters: parameters) if !buildResult.succeeded { Diagnostics.remark("[Plugin] **Build Failed**") print(buildResult.logText) } else { Diagnostics.remark("[Plugin] **Build Succeeded**") } try buildResponseFileHandle.write(contentsOf: Data([1])) }
Avatar
Avatar
omochimetaru
@Yuta Saito devコマンドのここの Diagnostics.remark って、ターミナルに文字列が表示される想定なんでしょうか?実際には何も出ないんだけど、どこの何の問題なんだろう? let buildRequestFileHandle = FileHandle(forReadingAtPath: buildRequestPipe)! let buildResponseFileHandle = FileHandle(forWritingAtPath: buildResponsePipe)! while let _ = try buildRequestFileHandle.read(upToCount: 1) { Diagnostics.remark("[Plugin] Received build request") let buildResult = try self.packageManager.build(buildSubset, parameters: parameters) if !buildResult.succeeded { Diagnostics.remark("[Plugin] **Build Failed**") print(buildResult.logText) } else { Diagnostics.remark("[Plugin] **Build Succeeded**") } try buildResponseFileHandle.write(contentsOf: Data([1])) }
swift package -v とかswift package -vv でコントロールできるログレベルがあって
12:42 PM
remarkは -vで出るようになる
Avatar
omochimetaru 6/7/2024 12:42 PM
なるほど。試してみます。
12:43 PM
swift package carton-dev を使うのは難しい・・・ Building "app" Building for debugging... [0/5] Write sources [1/5] Write swift-version-3874884F1997D323.txt error: -static-stdlib is no longer supported for Apple platforms error: Plugin ended with exit code 1
Avatar
なんでそこに -static-stdlib付くんだろう
Avatar
omochimetaru 6/7/2024 12:44 PM
これはついてるのはよくて
Avatar
いや、これはついてていいのか
Avatar
omochimetaru 6/7/2024 12:44 PM
問題はwasmモードになってないこと (edited)
12:46 PM
手元のXcode用5.10に対応したsdkをまだ入れてない
12:46 PM
[omochi@omochi-mbp SandboxApp (main *=)]$ swift run carton dev Building for debugging... error: -static-stdlib is no longer supported for Apple platforms error: -static-stdlib is no longer supported for Apple platforms あれ、driver経由も壊れた
12:46 PM
なんか状態が感染した。
12:47 PM
swift package cleanで直った
Avatar
動かしてるSwiftPMは5.10系ですか?
Avatar
omochimetaru 6/7/2024 12:48 PM
Xcode15.4同梱だけどcartonはmainブランチだから最近のアプデによってcartonが5.10.1を使う挙動だね
12:48 PM
なのでdriver経由なら5.10.1
12:48 PM
直接pluginを叩こうとしたら5.10 (wasm sdk 無しで失敗)
12:49 PM
These paths have changed, rebuilding... - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app info: [Plugin] Received build request info: [Plugin] **Build Succeeded** Build completed successfully The app is currently hosted at http://127.0.0.1:8080/ 2024-06-07T21:49:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-06-07T21:49:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /dev.js 2024-06-07T21:49:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-06-07T21:49:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs stdout: hello stdout stdout: stderr: hello stderr stderr:
12:49 PM
-v で確かに出るようになりました
12:50 PM
(driverのソースコードを書き換えて -v をpluginに渡すようにした
Avatar
たまにDriverが実行してるswift packageコマンドがログに出てほしくなる
Avatar
omochimetaru 6/7/2024 12:51 PM
These paths have changed, rebuilding... - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app info: [Plugin] Received build request info: [Plugin] **Build Succeeded** Build completed successfully The app is currently hosted at http://127.0.0.1:8080/ 2024-06-07T21:50:53+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-06-07T21:50:53+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /dev.js 2024-06-07T21:50:53+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-06-07T21:50:53+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs stdout: hello stdout stdout: stderr: hello stderr stderr:
12:51 PM
-vv にしたけど変わらない気がするね
Avatar
Avatar
Yuta Saito
たまにDriverが実行してるswift packageコマンドがログに出てほしくなる
omochimetaru 6/7/2024 12:51 PM
Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.10.0-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/.build/carton" "--disable-sandbox" "-vv" "plugin" "carton-dev" "--pid" "22729" それは出てるよ
12:52 PM
let buildResult = try self.packageManager.build(buildSubset, parameters: parameters) こっちはそもそもコマンドじゃないから出せなさそう
12:52 PM
info: Running command plugin <PluginTarget: CartonDevPlugin> on package <ResolvedPackage: sandboxapp> with options PluginOptions(_allowWritingToPackageDirectory: false, _additionalAllowedWritableDirectories: [], _allowNetworkConnections: none, _packageIdentity: nil) and arguments ["--pid", "22729"] これは -vv によって出たものかな? (edited)
Avatar
そうか出してたか。えらい
Avatar
Avatar
omochimetaru
info: Running command plugin <PluginTarget: CartonDevPlugin> on package <ResolvedPackage: sandboxapp> with options PluginOptions(_allowWritingToPackageDirectory: false, _additionalAllowedWritableDirectories: [], _allowNetworkConnections: none, _packageIdentity: nil) and arguments ["--pid", "22729"] これは -vv によって出たものかな? (edited)
これはSwiftPM側が-vvによって出すようになったログっぽい
Avatar
Avatar
Yuta Saito
そうか出してたか。えらい
omochimetaru 6/7/2024 12:54 PM
pluginが叩くfrontendのコマンドラインが出てないんだよね、現状
12:54 PM
この前作業してて気づいたissueの一つ
12:54 PM
internal func makeCartonFrontendProcess(context: PluginContext, arguments: [String]) throws -> Process { let frontend = try context.tool(named: "carton-frontend") Diagnostics.remark( "Running " + ([frontend.path.string] + arguments).map { "\"\($0)\"" }.joined(separator: " ")) let process = Process() process.executableURL = URL(fileURLWithPath: frontend.path.string) process.arguments = arguments return process }
12:54 PM
Diagnostics.remark で出してるようだから、driverが-v をつけないから出てこない (edited)
Avatar
ああ、それは-vで制御してたんだ
Avatar
omochimetaru 6/7/2024 12:55 PM
この辺りのインターフェースや考え方も整理したほうが良さそう
12:55 PM
carton driverも独自に --verbose フラグを持ってるし。
Avatar
できるだけdriverでオプションを解釈したくないんですよねぇ
Avatar
omochimetaru 6/7/2024 12:56 PM
@Flag(name: .shortAndLong, help: "Don't clear terminal window after files change.") var verbose = false なんだこのhelpは・・・
12:57 PM
func run() async throws { let terminal = InteractiveWriter.stdout if !verbose { terminal.revertCursorAndClear() } 確かにそうなってるけどw (edited)
Avatar
ログレベルを制御するverboseではない
Avatar
omochimetaru 6/7/2024 12:58 PM
このロジックは前見たんだよな、「verboseでないときはclearする」の気持ちが全然わからなかったのでスルーしているところ
12:59 PM
その先では Server に渡してるけどおよそ何も影響ないな・・・(変数消したけどコンパイルできた (edited)
Avatar
Avatar
Yuta Saito
できるだけdriverでオプションを解釈したくないんですよねぇ
omochimetaru 6/7/2024 1:00 PM
これはどういう意味?
1:02 PM
もし、packageコマンドオプションを制御するdriverの機構を設けたくないという意味なら、素通しする必要があるから、↓こんな感じがいいのか? $ swift run carton dev -Xpackage -v
1:03 PM
個人的には現時点だと Diagnostics.remark を使うメリットを全く感じてなくて、 driver, plugin, frontendそれぞれに普通にstdout使ってログ出してるから、 pluginだけこれ使う意味ないしやめていいと思った
1:04 PM
ただ今後の改修でdriverが不要になってplugin直接叩くようになると、そうでもないのか?でも90%の仕事はfrontendで発生するんだよな
Avatar
Avatar
omochimetaru
これはどういう意味?
swift run carton dev -v で起動されたCartonDriverがswift package <ここ>carton-dev <remaining arguments> ここに-vを配置するために-vを解釈しないといけないのがなぁと。
Avatar
omochimetaru 6/7/2024 1:07 PM
ああ、そういうふうに -v の振る舞いを融合する仕様にする場合を想定したコメントか。 (edited)
1:08 PM
CartonDriverswift-arugment-parser に依存しないで実装してあるんすね。
Avatar
現状 Diagnostics.remark を使うメリットがないのはそうなんだよなー
Avatar
omochimetaru 6/7/2024 1:09 PM
あと今試したけど package -v を使うと起動時にプラグイン自体をビルドする時の詳細なコマンドが出て邪魔くさいですね これはcarton plugin開発者にはデバッグ上便利かもしれないけどユーザーにはいらない (edited)
Avatar
将来的なIDEとの連携とかを考えるとできるだけSwiftPMネイティブなほうほうに寄せたいんだけど
1:10 PM
そもそもSwiftPMのプラグイン機構自体がまだ成長中だから。。
Avatar
omochimetaru 6/7/2024 1:10 PM
Avatar
そもそも-vはユーザにはいらないのでは
Avatar
Avatar
Yuta Saito
そもそも-vはユーザにはいらないのでは
omochimetaru 6/7/2024 1:11 PM
今-vで出てるremaks系の出力はユーザにとって要ると思ってる
1:11 PM
frontendのコマンドについてはfrontendを直接使う状態に移行しやすくなるし、
1:11 PM
fswatch起点のビルド開始・成功/失敗はdev server使ってて普通は出て欲しい (edited)
Avatar
そうなのかー
Avatar
omochimetaru 6/7/2024 1:14 PM
ちなみに今の挙動は・・・
1:14 PM
2024-06-07T22:13:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-06-07T22:13:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /dev.js 2024-06-07T22:13:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-06-07T22:13:06+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs stdout: hello stdout stdout: stderr: hello stderr stderr: These paths have changed, rebuilding... - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app - /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app Building for debugging... [0/2] Write swift-version--1B43874C0F24DF5E.txt [1/4] Write sources [3/5] Compiling app main.swift /Users/omochi/github/swiftwasm/carton/Tests/Fixtures/SandboxApp/Sources/app/main.swift:17:1: error: cannot find 'aafputs' in scope aafputs("hello stdout\n", file: stdout) ^~~~~~~ Build completed successfully The app is currently hosted at http://127.0.0.1:8080/
1:14 PM
↑こんな感じで、直したい問題がここに3つある
1:15 PM
1. frontend側で build完了メッセージが出てる, pluginでremarksにすることで非表示にしてるのにfrontendで固定で出るのでそもそもポリシーがブレてて変
1:15 PM
2. ビルド失敗してるのに成功メッセージが出てブラウザがリロードされる。 (edited)
1:16 PM
3. 中間リビルドの後だけアクセスURLが出る。これはむしろ最初のdevコマンド起動時に出て欲しい。fswatchリビルド後には出る必要ない。
1:16 PM
で、だけどremarksの設計とか意図が謎だったので、ここはそれと馴染ませて考える必要ありそうだから先に質問してたところ。 (edited)
1:17 PM
4. リビルドのパスがなんか2回出てるな
Avatar
Avatar
Yuta Saito
将来的なIDEとの連携とかを考えるとできるだけSwiftPMネイティブなほうほうに寄せたいんだけど
omochimetaru 6/7/2024 1:21 PM
その目指す形は理解するけど、 このDiagnostics APIがfrontendから(簡単には)使えないという問題が大きいね。 あと、 public enum Severity : String, Encodable { case error case warning case remark この3段階しかないのは普通に実用性がなくない? 「通常メッセージと、詳細メッセージ」を制御できない。 通常メッセージをwarningに格上げするわけにもいかないだろうし
1:22 PM
cartonみたいなツールの場合、大まかな挙動だけを出すモードと、詳細なビルドコマンドをダンプするモードの2つは必要だと思う まさに --verbose で制御するようなものが
1:24 PM
あーでもビルドは let buildResult = try self.packageManager.build(buildSubset, parameters: parameters) これで起動されてて、ここのダンプは package -v してもされない・・・
1:24 PM
// Build products var parameters = PackageManager.BuildParameters( configuration: options.release ? .release : .debug, logging: options.verbose ? .verbose : .concise ) いや、あれ?されそうだな?
1:27 PM
あーわかった ビルド成功: どっちも静か ビルド失敗: BuildLogVerbosity.concice : エラーメッセージだけでる, BuildLogVerbosity.verbose : swift-frontend コマンドもダンプされる (edited)
1:29 PM
試しに BuildLogVerbosity.debug にしても同じだった (edited)
1:30 PM
結果を待たずに先にコマンドを出す挙動はないっぽいのかなあ
Avatar
6.0でそのへん改善されてなかったかな
Avatar
omochimetaru 6/7/2024 1:31 PM
ビルドの進捗を追いたいから、エラーになってから出すんじゃなくて、叩くときに出て欲しいけどなあ
Avatar
Avatar
Yuta Saito
6.0でそのへん改善されてなかったかな
omochimetaru 6/7/2024 1:31 PM
お〜マジか
1:31 PM
そこの変化もあるのか難しいな
Avatar
-vで出てくるビルドログをリアルタイムに出してくれるかは覚えてないけど、何も付けなくても出てくる進捗をだすやつは6.0に入ってたはず
1:32 PM
parameters.echoLogs これだな
Avatar
omochimetaru 6/7/2024 1:33 PM
そういえばこの BuildLogVerbosityDiagnostics.Severity の関係はどうなってんだろうね。レベルのワードも違うし、今やった感じ関係なさそうだけど。
Avatar
omochimetaru 6/7/2024 1:36 PM
うおw
1:37 PM
そもそも error, warn, remarkじゃなくなったのか?infoってここに書いてあるね
1:39 PM
.verbose で出るログは -v なしでも出た気がするけど
1:39 PM
.debug-vv を一緒に設定してみるか
1:40 PM
変わってないような気がするなあ でもswiftpm6でまた話が違う部分もあるかもなあ
1:44 PM
4月ごろはswift6だけ考えて生きていくつもりだったけど9999問題で5.10の民になったから
1:44 PM
非常にやりづらいな
1:45 PM
ログ挙動周りで現状は細かい不満があって直したいけど、どうなったらいいのかがちょっと浮かばないので考えてみます
Avatar
mainブランチのことだけ考えていきましょう
1:47 PM
dyld_library_pathはちょっとしたラッパーを書いて各所でコピペして解決してる https://github.com/kateinoigakukun/swiftwasm-threading-example/blob/main/Scripts/use-swift.sh (edited)
Avatar
omochimetaru 6/7/2024 1:49 PM
DYLD_LIBRARY_PATH の技で回避する方向で最新版を見ていくか〜
1:50 PM
なんかmacOS側がしれっと直ったりして、その手間が無駄に終わりそうで躊躇しています
1:50 PM
Appleは早くこの問題に対して仕様なのかバグなのかすぐ直すのかやる気ないのか示して欲しい・・・
Avatar
少なくとももう少しで6.0を出荷するOSバージョンが決まるはず?だから9999のプレースホルダが無くなる方が根本原因がなんとかなるより早そう
3:58 PM
まあ古いバージョンに対するワークアラウンドを考え続けるよりはdyldのハックは大した手間じゃないはず… メインブランチなら直したらすぐ使えるようになるし… (edited)
naruhodo 1
Avatar
omochimetaru 6/8/2024 12:02 PM
find ${toolchain}/usr/bin -type f | xargs -n 1 -I {} \ sudo codesign --force --preserve-metadata=identifier,entitlements --sign - {} これやってみた
12:02 PM
[omochi@omochi-mbp bin]$ /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-06-06-a.xctoolchain/usr/bin/swift package --version Swift Package Manager - Swift 6.0.0-dev こっちはうまくいったけど
12:02 PM
[omochi@omochi-mbp bin]$ swift package --version zsh: segmentation fault swift package --version
12:02 PM
これはダメなんですね
12:04 PM
[omochi@omochi-mbp bin]$ which -a swift /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-06-06-a.xctoolchain/usr/bin/swift /usr/bin/swift [omochi@omochi-mbp bin]$ swift package --version Swift Package Manager - Swift 6.0.0-dev パス通していけた
Avatar
omochimetaru 6/8/2024 12:16 PM
あれ?
12:16 PM
/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.10.0-RELEASE.xctoolchain/usr/bin/swift
12:17 PM
5.10.1じゃなくて5.10.0なんですね
Avatar
swift-wasm-5.10.0-RELEASE の後に Swift 5.10.1 がリリースされたのでまだ swift-wasm-5.10.1-RELEASE はなかったはずです
Avatar
omochimetaru 6/8/2024 12:20 PM
5.10.0は swift test の問題は直ってないやつですよね
12:20 PM
それはそれとして5.10.0に進んだというだけだったのかな
Avatar
swift-wasm-5.10.0-RELEASE は Swift 5.10.0 より新しい snapshot のツールチェーンと対応付いているので Swift SDK の install の問題やテストの問題は修正済みです (edited)
12:21 PM
(バージョン番号が公式 Swift ツールチェーンのリリース版と対応づいていない) (edited)
Avatar
omochimetaru 6/8/2024 12:22 PM
あ〜なるほど
Avatar
omochimetaru 6/8/2024 12:48 PM
うーん難しい
12:51 PM
swift5.10のexperimental-sdkとswift6のsdkを一緒に使うのもまずいっぽいな
12:51 PM
6が作ったメタデータのjsonが5.10で読めないっぽくて、マシンの同じ場所を使うので壊れる (edited)
12:54 PM
一応dyldの技は使えたし6で生きていくべきか
12:54 PM
でもやっぱ人々に布教するには色々難しすぎるから5.10でしばらくやるか
Avatar
6は大丈夫なはず。mainはホスト非依存にしたので古いSwiftPMからは使えない
Avatar
omochimetaru 6/8/2024 12:55 PM
ホスト非依存はなんのことですか?
12:55 PM
[omochi@omochi-mbp swift-react (swift510 =)]$ swift experimental-sdk list No Swift SDKs are currently installed. warning: Couldn't parse `info.json` manifest of a Swift SDK bundle at /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-06-07-a-wasm32-unknown-wasi.artifactbundle: failed parsing ArtifactsArchive info.json at '/Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-06-07-a-wasm32-unknown-wasi.artifactbundle/info.json': keyNotFound(CodingKeys(stringValue: "supportedTriples", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "artifacts", intValue: nil), _JSONKey(stringValue: "DEVELOPMENT-SNAPSHOT-2024-06-07-a-wasm32-unknown-wasi", intValue: nil), CodingKeys(stringValue: "variants", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"supportedTriples\", intValue: nil) (\"supportedTriples\").", underlyingError: nil))
12:56 PM
今こうなった。 main 0606 で swift sdk install した後に、 5.10 releaseでswift experimental-sdk listした結果。
12:56 PM
あ、mainブランチ版のsnapshotじゃなくて、6.0ブランチ版なら、5.10と共存できるよということ? (edited)
Avatar
6.0ブランチはホストのプラットフォームごとにartifactbundleを作ってたけど、mainでは一つにまとめるために新しいメタデータフォーマットを使ってるのでmainのSwiftPM以外からは読み込めないんです
Avatar
omochimetaru 6/8/2024 1:01 PM
あ〜〜〜
1:01 PM
swiftwasmのサイトの方で選ぶやつが一つになってるのはそれの恩恵?
Avatar
そうそう
Avatar
omochimetaru 6/8/2024 1:01 PM
あーほんとだ、5.10だけじゃなくて6.0系はバラバラだ
1:02 PM
これは、mainでっていうか、つまり6.1からはそうなりそうってこと?
Avatar
このままいけばそうすね
Avatar
omochimetaru 6/8/2024 1:02 PM
今はmainを避けたら5と6を切り替えて作業したりできるけど
1:02 PM
将来的に6.0と6.1のところで同じトラブルになるのかな
Avatar
5.9, 5.10: ホストごとにコンパイラ同梱のartifactbundle 6.0: ホストごとのartifactbundle(ただしコンパイラは入ってない) main: ひとつのartifactbundle(コンパイラなし) (edited)
Avatar
omochimetaru 6/8/2024 1:03 PM
6.0でコンパイラが入らなくなったのは何かwasm対応上の不都合がそれまではあったんですか (edited)
1:04 PM
それともwasmは関係なくてswift sdk側の仕様とかの影響なのかしら (edited)
Avatar
独自にコンパイラ配るの大変なので。。
Avatar
omochimetaru 6/8/2024 1:05 PM
6.0ぐらいでwasm対応が本家に完全に入ったからそれで良くなった、ということか
Avatar
ああそうですね。そうswift.orgのコンパイラが完全にwasmターゲットに対応したのでパッチ当てたコンパイラを配らなくてよくなったのが6.0
Avatar
omochimetaru 6/8/2024 1:06 PM
う〜んどうしようかな・・・ じゃあとりあえず5.10に居を構えて、先に備えて6.0を触ることにして、mainはちょっと距離置こうかな・・・
Avatar
6.0も9999プレースホルダの問題があるのでは
Avatar
omochimetaru 6/8/2024 1:07 PM
なので5.10を拠点とする
Avatar
えーそっちに行ってしまうかー
Avatar
omochimetaru 6/8/2024 1:07 PM
僕としては、wasm開発簡単に始められますよ、って主張したくて
1:08 PM
自分だけやるならmainに突っ込めばいいんだけど
1:08 PM
環境構築の説明とかちゃんと用意してあげようとすること考えると
1:08 PM
Xcode15.4で入れる5.10をベースにして、swiftwasmからsdkだけ入れようね(実際はコンパイラもインストールするわけだが) (edited)
1:08 PM
が一番わかりやすくて簡単だなあと
Avatar
簡単に始めるためにはまあそうかー
Avatar
omochimetaru 6/8/2024 1:10 PM
まあ優先度の問題ではあって、先にそれで全てを整えて誰でも触りやすくしておいた上で
1:10 PM
次のステップとして6.0でも開発できるように整えるということだねえ
1:10 PM
5.10と6.0だとライブラリのコードもクロスビルドを考えないといけないし
1:11 PM
Xcodeでコード編集する時も6でやるならツールチェーン切り替えが必要で、それやると(GUI的にはできそうな感じだけど)経験的にトラブル起きがち (edited)
1:12 PM
それはそれとして・・・
1:12 PM
cartonで、cartonがデフォルトで5.10を入れて動かそうとするけど
1:12 PM
これを6.0に切り替えさせる場合は、ユーザの手順はどうなるの?
1:13 PM
実装上はcarton側にまだ課題があって動かなそうに見えたけど (--sdk じゃなくて --triple 吐くし)
1:13 PM
.swift-version を置くのかしら?
Avatar
.swift-version をおけばOK
1:14 PM
cartonはSwift SDKとしてインストールせずにツールチェインをインストールするので --tripleでOK
Avatar
omochimetaru 6/8/2024 1:14 PM
なるほど
1:15 PM
cartonの自動テストに6.0を足すというのをやりたいんだけど
1:15 PM
carton自体を6.0でビルドすることは簡単で
1:16 PM
cartonが動作するコンパイラを6.0にするには
1:16 PM
ホストじゃなくてcartonの挙動の制御が必要だから swift-version の制御になると思うんだけど
1:16 PM
これテストマトリックスとしては何を用意するのがいいと思う?
1:17 PM
今は (ホスト5.9 + 実行5.9, ホスト5.10 + 実行5.9) の2つだったのが
1:17 PM
この前のアップデートによって
1:17 PM
(ホスト5.9 + 実行5.10, ホスト5.10 + 実行5.10) に変わった状態なんだけど
1:17 PM
(ホスト5.9 + 実行5.9, ホスト5.10 + 実行5.10, ホスト6.0 + 実行6.0)
1:17 PM
の3パターンかつホストと実行を揃える (edited)
1:18 PM
状態になった方がいい?
1:18 PM
それとも、cartonがSwiftツールチェーンを管理してる機能自体を外したいと考えているのであれば (edited)
1:18 PM
ここの挙動をテストすること自体あんまり意味ないよね長期的には
Avatar
(ホスト5.9 + 実行5.9, ホスト5.10 + 実行5.10, ホスト6.0 + 実行6.0)
人に推奨環境として伝えるときホストと実行を揃えてね、と言うのがわかりやすいだろうから揃えた組み合わせをテストするのがよさそう
Avatar
omochimetaru 6/8/2024 1:20 PM
ふむふむ。今新たに思ったんだけど、もしそうだとしたらさ、 .swift-version がない時は (edited)
1:21 PM
cartonで一つdefault toolchainを持つんじゃなくて
1:21 PM
cartonをビルドしたコンパイラに揃ったやつを自動で選ぶ方が良くない?
Avatar
あー、そうかユーザの方でビルドするようになったからそれが簡単にできるのか
Avatar
omochimetaru 6/8/2024 1:21 PM
そうすれば .swift-version を作らなくても 「ホストと実行が揃う」のがcartonのデフォルトの振る舞いになる
Avatar
いいですね
Avatar
Avatar
Yuta Saito
あー、そうかユーザの方でビルドするようになったからそれが簡単にできるのか
omochimetaru 6/8/2024 1:22 PM
これはどういう事・・・?
Avatar
これまでビルド済みのバイナリを配布してたので、「ホストのコンパイラ」というのがそもそもcartonから見えてなかった(無いかもしれない。特にLinuxで。)SwiftPMのプラグインにしたことで常に「ホストのコンパイラ」が存在するようになった
Avatar
omochimetaru 6/8/2024 1:24 PM
あ〜 carton自体のインストール方法の変化のことか
1:25 PM
cartonをプラグインで入れるの嫌なんだよな・・・ ライブラリがcartonに依存してしまうとライブラリのユーザプロジェクトでcartonに依存するときにバージョン解決に失敗するシナリオが出てくるから・・・
1:26 PM
いや、ライブラリでは入れなければいいだけか・・・?
Avatar
Avatar
Yuta Saito
これまでビルド済みのバイナリを配布してたので、「ホストのコンパイラ」というのがそもそもcartonから見えてなかった(無いかもしれない。特にLinuxで。)SwiftPMのプラグインにしたことで常に「ホストのコンパイラ」が存在するようになった
omochimetaru 6/8/2024 1:26 PM
確かにややこしい。cartonがSwiftを用意しようとしてるのに、そのSwiftのバージョンを判定しようとしてる。
1:27 PM
でもシンプルに carton-driver が実行された時に、 PATH から見える swift を基準にしてもいい気がするけど
1:27 PM
ちょうどさっき手元で試したんだけど、 #if compiler(>=6.0) #error("6.0") #elseif compiler(>=5.10) #error("5.10") #elseif compiler(>=5.9) #error("5.9") #endif これで、目の前の $ swift のバージョンを判定するのはうまくいきそうだった ( $ swift --version をパースするのはちょっと怪しさがある気がしている ) (edited)
1:29 PM
「1. cartonコンパイル時のswift」だと、パッケージで入れた時はうまくいくけど、 「2. carton-driver実行にみつけたswift」にすれば、パッケージの場合もうまく行くし、carton driverをマシンレベルでインストールしてる環境でもうまく動く (edited)
1:29 PM
ので、後者の方が良さそうな気がするけど、どうでしょうか
1:32 PM
いや、 1. でも別にそう困ることは無い気はするな・・・ 結局マシン環境で見つかる $ swift は原則一つなので
1:33 PM
export TOOLCHAINS で切り替えた時に carton-driver はそのまんま同じマシンインストール版を使っていてもうまく切り替わるみたいな事か
1:33 PM
俺が色々開発上で生じるややこしい状況を考えてるだけで一般ユーザには不要な混乱をもたらすだけか? (edited)
Avatar
僕が自分の開発環境でswiftをPATH通してないんで1がいいな。。
Avatar
omochimetaru 6/8/2024 1:34 PM
swiftをPATH通してない
レベル高いな・・・
Avatar
あと--versionのパースは結構ムズいんですよね
Avatar
omochimetaru 6/8/2024 1:35 PM
逆にコンパイラ開発に積極的に参加してるとそうなのか
Avatar
Avatar
Yuta Saito
あと--versionのパースは結構ムズいんですよね
omochimetaru 6/8/2024 1:35 PM
だよね、変なパターンが結構あるし 判定するなら #error を食わせる方がいいよね
Avatar
#error でなくてもこれで良かったりする? #if compiler(>=6.0) let defaultToolchainVersion = "wasm-6.0.0-XXXX" #elseif compiler(>=5.10) let defaultToolchainVersion = "wasm-5.10.0-RELEASE" #elseif compiler(>=5.9) let defaultToolchainVersion = "wasm-5.9.2-RELEASE" #endif
Avatar
omochimetaru 6/8/2024 1:37 PM
(1)ならそれだけでいいと思う
1:37 PM
(2)だと動的な判定をするために #error$ swift に食わせて出力を読む必要がある
Avatar
あーそうですね。2なら#errorがマシ
Avatar
Avatar
Yuta Saito
僕が自分の開発環境でswiftをPATH通してないんで1がいいな。。
omochimetaru 6/8/2024 1:39 PM
じゃあこれも参考にして 1 でやろうかな
Avatar
すくなくとも2でないと動かないシナリオは現状推奨の使い方ではないのであんまり頑張る必要はなさそう
Avatar
omochimetaru 6/8/2024 1:39 PM
それでとりあえず 5.9と5.10の今のマトリックスで実行側を揃えよう
Avatar
Avatar
Yuta Saito
すくなくとも2でないと動かないシナリオは現状推奨の使い方ではないのであんまり頑張る必要はなさそう
omochimetaru 6/8/2024 1:39 PM
そうね。どうしてもならprebuilt cartonをいっぱい用意して切り替えたらいいしね。でもそこまでやるなら .swift-verison でいいな (edited)
Avatar
SwiftPM側にdevDependencies的な機能を入れればライブラリでも気兼ねなくSwiftPMプラグインで入れられるし
Avatar
Avatar
omochimetaru
それでとりあえず 5.9と5.10の今のマトリックスで実行側を揃えよう
omochimetaru 6/8/2024 1:40 PM
これができた後だと6.0の導入テストがやりやすくなる
Avatar
ありがてえ
👌 1
Avatar
omochimetaru 6/9/2024 12:27 PM
早い早い
Avatar
ボタンポチポチするだけなので!
Avatar
omochimetaru 6/9/2024 12:31 PM
通知どうやって気がついてるの?GitHubのiOSアプリとか?
Avatar
github.com/swiftwasm orgのwebhook設定してDiscordに通知してます
Avatar
omochimetaru 6/9/2024 12:32 PM
swiftwasm discord?
Avatar
プライベートdiscord
Avatar
omochimetaru 6/9/2024 12:33 PM
なるほど。
12:33 PM
確かにDiscordって通知気づきやすい
Avatar
org単位のwebhookだとリポジトリごとに設定しなくても全体の通知が届いて便利
Avatar
omochimetaru 6/9/2024 12:34 PM
あ〜これ全部監視してるのか!
12:34 PM
大変だあ
12:35 PM
orgで設定できるの知らなかった 会社だと関係ないやつも多いけど、こういうのだとちょうどいいのか
Avatar
なので逆に個人リポジトリに紐づいた通知は見逃しがちw
Avatar
omochimetaru 6/9/2024 12:35 PM
同じように個人の全部を通知するhookはないの? (edited)
Avatar
個人のじゃないや、見逃すのは自分がwebhook設定する権限持ってないリポジトリ達だ
Avatar
omochimetaru 6/9/2024 12:36 PM
ああ、なるほど。
Avatar
norio_nomura 6/9/2024 1:48 PM
僕もwebhook設定してプライベートDiscord経由で通知してる。Discordのwebhook urlはSlack互換に出来るから、Slackのwebhook urlを直接登録できるサービスでは全部使える。
Avatar
omochimetaru 6/9/2024 2:13 PM
@Yuta Saito Cartonで (.swift-version などで ) Swift6.0を指定した場合の挙動って、 ツールチェーンを codesign --force --preserve-metadata=identifier,entitlements --sign - するやつと、 起動時に DYLD_LIBRARY_PATH を指定するやつを、Cartonが面倒見るのがいい? (edited)
Avatar
ひとまずテストのためにCartonDriverにそのワークアラウンドを任せるのはありだとおもいます。6.0のリリース前には治ってるはずなので近い将来消せると良いな、というくらい。
Avatar
omochimetaru 6/9/2024 2:17 PM
なるほど。
2:17 PM
6.0リリース前で治ると期待されてるのは9999指定が実際のOSバージョンになるからですよね? (edited)
Avatar
ですね
Avatar
omochimetaru 6/9/2024 2:18 PM
その理屈だと、将来そのように6.0の問題が直った以降では、今度は6.1で stdlib に追加APIがあった場合は、そこでもまた9999が指定されるので、問題は再発しますよね。 (edited)
2:18 PM
9999の大小比較を逆にする仕様がある限り、最新版のSwiftを使うためにはこの作業が必要であり続ける。
Avatar
うむー
Avatar
omochimetaru 6/9/2024 2:19 PM
なので取り除けないと思う
Avatar
スナップショットに対してはずっと適用し続けないといけない?
Avatar
omochimetaru 6/9/2024 2:20 PM
ってことじゃない?
Avatar
リリース版では確実にプレースホルダは消えてるだろうけど
2:22 PM
まあそうですねぇ。消せるのは根本原因がなんとか直ったときかな
🆗 1
2:22 PM
古いバージョンのスナップショットは考えない
Avatar
omochimetaru 6/10/2024 6:18 AM
@Yuta Saito Regexのリンクエラー出た!! これはどうすればいいんだっけ。 https://github.com/swiftwasm/carton/actions/runs/9443201666/job/26006537967#step:8:1
📦 Watcher, bundler, and test runner for your SwiftWasm apps - macにsnapshot版のツールチェーンを入れるときは9999問題を回避する作業をする · swiftwasm/carton@b5d38d0
Avatar
なーん
6:18 AM
Steps to reproduce: Create a new package with swift package init --type executable Add JavaScriptKit as a dependency. My Package.swift file is as follows: // swift-tools-version: 5.9 // The swift-t...
👀 1
6:21 AM
cartonの場合だとユーザコードにimportしてもらうか、もしくはcartonの方で6.0の場合には -lswift_RegexParserをリンクオプションとしてつけるのがいいかな
Avatar
Avatar
Yuta Saito
cartonの場合だとユーザコードにimportしてもらうか、もしくはcartonの方で6.0の場合には -lswift_RegexParserをリンクオプションとしてつけるのがいいかな
omochimetaru 6/10/2024 6:27 AM
cartonが付けるのが良いと思う ツールチェーンの再署名とかもユーザーが6のためにワークアラウンドしない方に寄せてるし
6:28 AM
仕組みとしても5と6で異なるXlinker付け足す挙動がすでにあるからそこにうまくハマりそう (edited)
Avatar
19.37 KB
12:23 PM
最悪だ〜 手元ではリンカエラーが出ないけど別の問題が発生した
Avatar
ディレクトリがpreopenされてないことによるエラー
12:24 PM
ですね。
Avatar
Caused by: 0: failed to invoke command default 1: error while executing at wasm backtrace: 0: 0x670e08 - <unknown>!$s10Foundation6BundleC05_mainB033_6273FB07A96EB35BCC520B3A80F5C3CDLL_WZ 1: 0x4504d5 - <unknown>!swift_once 2: 0x670e31 - <unknown>!$s10Foundation6BundleC4mainACvgZ Bundle.mainだ
Avatar
cartonには対応を入れた気がしたけどCommandTestRunnerの方には入れてなかった!
Avatar
なるほど?じゃあリンクを超えて次の壁にぶつかっただけか
Avatar
wasmtime run のオプションとして--dir . を渡せばOK
Avatar
ふむふむ。いったんCIのリンクの問題に取り組んで、それは後でやってみます
🙏 1
12:32 PM
wasm-ld: error: /Users/runner/Library/Developer/Toolchains/swift-wasm-6.0-SNAPSHOT-2024-06-08-a.xctoolchain/usr/lib/swift_static/wasi/libswift_StringProcessing.a(_StringProcessing.o): undefined symbol: $s12_RegexParser13PrettyPrinterVMn [omochi@omochi-mbp wasi]$ nm -a libswift_RegexParser.a | grep RegexParser13PrettyPrinterVMn 00006cdc D $s12_RegexParser13PrettyPrinterVMn (edited)
12:32 PM
無いと言われてるシンボルは確かに libswift_RegexParser.a に入ってんな
12:33 PM
-l が渡ってないか、 -L が無いか だろうか (edited)
Avatar
実際に実行されてるリンカコマンドを出力できれば確認できそうですね
👍 1
Avatar
あれ、エラーが変わったな、さっきの↑と同じやつが出た
12:42 PM
AbsolutePathRelativePath って、どっちかわからない時はどうすればいいんだ?
Avatar
Avatar
Yuta Saito
wasmtime run のオプションとして--dir . を渡せばOK
これはうまくいきました、ありがとう
Avatar
Avatar
omochimetaru
AbsolutePathRelativePath って、どっちかわからない時はどうすればいいんだ?
The Package Manager for the Swift Programming Language - apple/swift-package-manager
12:49 PM
14.42 KB
12:49 PM
また別のエラーだ
12:49 PM
別だけど同じだな これもBundle.mainだ
Avatar
多分本質的に同じエラーな気がする
12:51 PM
いやでもcommon.tsでPreopenDirectory与えてるんだよな。options.argsが空なのかな
Avatar
const fds = [ new OpenFile(new File([])), // stdin stdout, stderr, new PreopenDirectory("/", new Map()), ]; const wasi = new WASI(args, [], fds, { debug: false });
Avatar
entrypoint/test.ts の方でargs与えてないんだな
Avatar
ほう
Avatar
argv0をFoundation.Bundle.mainが見るので["main.wasm"]を与えてもらえると
Avatar
const defaultRunnerOptions = (options: Options): Options => { if (options.args != null) { options.args = ["main.wasm"]; } return options; };
12:54 PM
これでやろうとしてることか
Avatar
["/main.wasm"] の方がいいかな。wasi-libcのcurrent working directoryエミュレーションに依存しなくなる
12:54 PM
あれ、もうあった?
Avatar
デバッガで追ってみる
Avatar
nullだからそこのthenに突入しないのか?!
Avatar
これ分岐逆だなあ
Avatar
わはは
Avatar
sorry my bad
Avatar
np
Avatar
omochimetaru 6/10/2024 1:06 PM
お、リンクのエラーが手元で再現した
1:06 PM
うおお謎だ・・・
1:07 PM
さっき単品で通ったテストだ
Avatar
例のリンクエラーはインクリメンタルビルドに関連していることが判明しているので
1:07 PM
Fixtureの.buildの状態によって再現したりしなかったりするかもしれない
Avatar
omochimetaru 6/10/2024 1:08 PM
ありそう〜 そういう系の状態依存を感じる
Avatar
6.0リリースまでにちゃんとした修正をするのが正しい方向かも
1:09 PM
mainでは--gc-sectionsを入れられたおかげ(?)で再現しないんだけど
Avatar
Avatar
Yuta Saito
6.0リリースまでにちゃんとした修正をするのが正しい方向かも
omochimetaru 6/10/2024 1:09 PM
Swift compiler ? PM ? 側でってこと?
Avatar
そうそう
Avatar
omochimetaru 6/10/2024 1:10 PM
大変だ
Avatar
ツールチェインを正しくしていくのだ
Avatar
omochimetaru 6/10/2024 1:45 PM
どこで落ちてるのかやっとわかったw
1:45 PM
xctestと即死が絡むとprintが出遅れるから騙されまくった
1:47 PM
30.45 KB
Avatar
-l 渡ってないですね
Avatar
omochimetaru 6/10/2024 1:48 PM
carton-driverがtest pluginに尋ねたオプションを使ってtest productをビルドするところでした (edited)
Avatar
あーなるほど。
1:49 PM
あれ、それって6.0でも必要なんだっけな
Avatar
omochimetaru 6/10/2024 1:49 PM
うーん仕組み的には書き足した -l オプションが渡ってきそうだな・・・ (edited)
Avatar
6.0ではPluginからSwiftDriverへ制御を一旦もどすことをせずにSwiftPM Pluginから直接SwiftPMにビルドを依頼するはずなんだけど
1:50 PM
あー、CartonDriver側がそれを知らないのか!
Avatar
omochimetaru 6/10/2024 1:50 PM
そんな制御フローは見当たらないけど
Avatar
6.0以降なら internal-get-build-command でビルドコマンド取ってくるのをやめて
1:51 PM
普通にcarton-testプラグインを実行するだけでよいです
Avatar
omochimetaru 6/10/2024 1:51 PM
やめてる分岐どこにありますか?今まで読み解けて無いなそれ
1:52 PM
ああ、ユーザが最初に swift package carton-test するって意味?
Avatar
自分でdriver使ってなかったから辞めるの忘れてた。
Avatar
omochimetaru 6/10/2024 1:52 PM
まだない動きか
1:52 PM
とりあえず現状に沿って直すよ
1:53 PM
あ!!!
1:54 PM
いや・・・
1:58 PM
あ〜?
1:58 PM
俺が追記した -lcommand モードの時の分岐には適応されてないだけかも (edited)
2:00 PM
直せた・・・
🎉 1
2:10 PM
これ6.0だけなんで6.1以降ならつけるの辞められますか?
2:11 PM
いや、linker gcで消えるからいいか
Avatar
omochimetaru 6/10/2024 2:11 PM
そう・・・ なんかややこしい部分だから気持ちが入ってなかった
Avatar
大丈夫です
Avatar
omochimetaru 6/10/2024 2:12 PM
解決することがわかってるなら6.1で消えるようにしておきたいな (edited)
2:12 PM
6.1の時代が来たときにこれがおまじないとしてcartonの外で継承されるとよくない
Avatar
それはそうだ
2:12 PM
おまじないを継承しない
Avatar
omochimetaru 6/10/2024 2:13 PM
基本的にcartonはcartonを使わない人にとってのwasmリファレンス実装でもある
2:13 PM
試合マッチングしたからちょっと後で続きします
👋 1
Avatar
RegexParserのリンク問題直せたきがする https://github.com/apple/swift/pull/74277
Serialize the -public-autolink-library <name> option to the moduleinterface file because it can affect the LINK_LIBRARY entries in a swiftmodule file. Without saving the option being saved, s...
Avatar
omochimetaru 6/11/2024 2:31 AM
すごい
2:33 AM
インクリメンタルビルドのときにModuleInterfaceの再利用が生じてそこで情報が落ちてるから不具合が起きる説?
Avatar
そうそう。最初のビルドはツールチェインにプレビルドされてるswiftmoduleを使うんですけど
2:35 AM
オブジェクトファイルを作った後に実行する -emit-module-index-system-modules を指定するのでツールチェインの_StringProcessing.swiftinterfaceからswiftmoduleを作って .build/debug/ModuleCache に新しく配置する。
2:36 AM
ここで新しく作られたswiftmoduleはautolink情報が欠けてて
2:37 AM
一回目ではツールチェインのswiftmoduleを見ていたが、二回目のビルドでオブジェクトファイルを作るときは -module-cache-pathで明示的に指定された .build/debug/ModuleCache が優先されるので、壊れたswiftmoduleを参照してしまい問題が発現する (edited)
Avatar
omochimetaru 6/11/2024 2:46 AM
思ったより2段階ぐらいさらにややこしいなw
2:47 AM
ツールチェーンがswiftmoduleとswiftinterfaceを配布していて、 ビルド時にそのswiftinterfaceから改めてローカルにswiftmoduleを作るが、 元々のswiftinterfaceを作ってる時点で情報が落ちてるので、 その欠落がローカルのswiftmoduleにも伝搬して問題が起きる。
Avatar
並列ビルドで再現したりしなかったりしたのは、emit-moduleがemit-objectより先に終わると一回目でもemit-objectがModuleCacheを参照するようになるからだった。
Avatar
omochimetaru 6/11/2024 2:48 AM
感想 1. swiftinterfaceとswiftmoduleを同時配布してるがその時点で同期ズレしてるのがダメでは 2. ローカルでswiftmodule作り直す必要ある? (edited)
Avatar
1. swiftinterfaceとswiftmoduleを同時配布してるがその時点で同期ズレしてるのがダメでは
ツールチェインで配布されてるやつは同期ズレしてないんですよね。それぞれ.swiftから生成されてるので。
Avatar
omochimetaru 6/11/2024 2:49 AM
ああ、読み違えてた。ローカル用に作るときに壊れるのか。
2:50 AM
でもパッチを見るとinterfaceを作るところの修正っぽい?
Avatar
Avatar
Yuta Saito
並列ビルドで再現したりしなかったりしたのは、emit-moduleがemit-objectより先に終わると一回目でもemit-objectがModuleCacheを参照するようになるからだった。
omochimetaru 6/11/2024 2:51 AM
そのレースやばいね・・・
Avatar
2. ローカルでswiftmodule作り直す必要ある?
これは詳細追ってないんですけどIDEのためにシステムモジュールをindexingする目的で必要らしいです
naruhodo 1
Avatar
Avatar
omochimetaru
でもパッチを見るとinterfaceを作るところの修正っぽい?
どっちもすね。swiftinterfaceを作るときにpublic-autolink-libraryを記録して、swiftinterfaceからswiftmoduleを作るときに正しくpublic-autolink-libraryを尊重するようにする
Avatar
omochimetaru 6/11/2024 2:55 AM
ふむふむ
Avatar
Avatar
Yuta Saito
これ6.0だけなんで6.1以降ならつけるの辞められますか?
omochimetaru 6/11/2024 2:55 AM
昨日6.0まで、って言ってたのは6.1ではこの修正がなくても問題は起きないの?
Avatar
そこもややこしくて
😋 1
2:58 AM
本質的なこのswiftinterfaceの問題は治ってないんですけど、 6.1ではリンカの --gc-sections をWasm向けに有効にしたので、実際に_RegexParser の実装を全く使わない場合、そもそも _RegexParser のシンボルをリンカが必要としなくなったので、StringProcsssingモジュールに関しては問題なくなってしまった (edited)
2:59 AM
ただ本当に _RegexParser のシンボルに依存する場合は同じ問題が発生するはず
Avatar
omochimetaru 6/11/2024 3:11 AM
あーなるほど。 そうすると3つの場合があって: 1. ユーザ側でimportを書いてAPIも使ってる→リンクできる 2. ユーザ側で使ってない→リンクの必要がなくなって大丈夫 3. ユーザ側で使ってないけどリンクの必要がある→これはダメなままだった
Avatar
ということが明らかになった
Avatar
omochimetaru 6/11/2024 3:13 AM
これって StringProcesingRegexParser の依存関係がswiftinterfaceを通じて途切れていたって事だから
3:14 AM
依存関係があるSwift製のシステムモジュール2つの組があれば他にも問題が起きえたのかな?
3:15 AM
パッと思い浮かばないけど。 ConcurrencyとSynchronizationとか?
Avatar
StringProcesing → RegexParserの依存関係は特殊で
3:15 AM
RegexParserStringProcesing のprivate dependencyなんですよね
Avatar
omochimetaru 6/11/2024 3:17 AM
へえ〜〜 なるほどここ特有の関係なのか (edited)
3:18 AM
private dependencyってなんですか?リンカレベルの仕様の話?
Avatar
Swiftレベルの @_implementationOnly import ですね
Avatar
omochimetaru 6/11/2024 3:20 AM
ああ、なるほど
3:21 AM
大元の問題についてなんだけど
3:22 AM
swiftmodule → swiftinterface → swiftmodule とラウンドトリップさせることで、 「autolink情報が欠ける」ような類似の問題を事前に検出できないんかな
Avatar
できる気がする。テストの時間がそれなりに伸びるが。
Avatar
omochimetaru 6/11/2024 3:24 AM
仕組み的にはできるはできそうか
3:24 AM
Running... wasm-opt -Os --enable-bulk-memory /home/runner/work/carton/carton/Tests/Fixtures/EchoExecutable/Bundle/main.wasm -o /home/runner/work/carton/carton/Tests/Fixtures/EchoExecutable/Bundle/main.wasm Process failed and produced following output: Process failed with non-zero exit status and following output: and following error output: [wasm-validator error in function 120] unexpected false: all used features should be allowed, on (i32.extend8_s (local.get $20) ) [wasm-validator error in function 125] unexpected false: all used features should be allowed, on (i32.extend8_s (local.get $19) ) [wasm-validator error in function 178] unexpected false: all used features should be allowed, on (i32.extend8_s (local.get $8) ) [wasm-validator error in function 450] unexpected false: all used features should be allowed, on (i32.extend16_s (local.get $0) )
3:24 AM
Linux + Swift 6.0 で wasm-opt がエラーを出してCIが失敗してる・・・
Avatar
wasm-optがふるい
Avatar
omochimetaru 6/11/2024 3:25 AM
- name: Install dependent packages for WebAssembly run: > sudo apt-get update && sudo apt-get install -y wabt binaryen ↑ここで入ってんのかな
Avatar
もしくは --enable-sign-ext も付けとくか
Avatar
omochimetaru 6/11/2024 3:28 AM
Swift5.10は大丈夫なのは、6.0でSwift Compilerが持ってるLLVMのWasmコード生成部分が新しくなって、生成される命令が変わったから? (edited)
Avatar
おそらくそうですねー
Avatar
omochimetaru 6/11/2024 3:30 AM
なるほど・・・ wasm-optが新しいとこの命令をデフォルトで有効になっていて大丈夫で、 macの方が平気だったのはhomebrewの方がapt-getより新しいものが入ってるからかな・・・
Avatar
Avatar
Yuta Saito
もしくは --enable-sign-ext も付けとくか
omochimetaru 6/11/2024 4:04 AM
これうまくいきました
Avatar
omochimetaru 6/11/2024 7:15 AM
これでcartonの開発環境がSwift 6.0に対応だ
Avatar
9999 問題と似たような issue が立ってますね. https://github.com/apple/swift-package-manager/issues/7648
Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc? Confirmed reproduction steps with SwiftPM CLI. Description Hello, I'm following steps on https://...
Avatar
This PR updates the Standard Library to resolve SwiftStdlib 6.0 to the new OS releases that were announced this week: SwiftStdlib 6.0:macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0 It...
Avatar
omochimetaru 6/13/2024 1:58 AM
Additionally, this PR defines stdlib/runtime version 6.1 with placeholder availability, and updates _SwiftStdlibVersion.current to report itself as that.
1:59 AM
SwiftStdlib 6.0:macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0 SwiftStdlib 6.1:macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999
1:59 AM
ん、どうなった?
2:00 AM
6.0と6.1が書けるようになったから、これを踏まえて9999って書いてる場所を6.0って書き直せるので問題が治る・・・
2:00 AM
が・・・? 6.1の意味は9999のままだから、今後snapshotで配布される6.1で追加されるstdlib APIに関しては判定が壊れたままで同じ問題が続く?
Avatar
新しく6.1のAPIが増えるまでのつかの間の命
Avatar
omochimetaru 6/13/2024 2:01 AM
根本的な問題が伝わってないのか・・・
Avatar
いや、伝わってはいますよ。
2:03 AM
どう直すのかが自明じゃないのと優先度が低いだけ
Avatar
omochimetaru 6/13/2024 2:04 AM
ふむ
2:08 AM
Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc? Confirmed reproduction steps with SwiftPM CLI. Description The following package definition causes a ...
2:09 AM
mikeash commented last week I think this is the thing where some older runtimes consider OS version 9999 to be available. Doug has a hack to address it, not sure what the plan is with it: #72801
ほんとだ
Avatar
To elaborate on the segfault problem, this isn't actually a problem with the Static SDK for Linux — it's an issue with the toolchain where it's trying to use libraries from the OS, but because of a problem with the OS hosted libraries we end up thinking that things are marked with the in-development availability (9999) are available when in fact...
9:40 AM
This should be fixed already in the Sequoia (macOS 15) developer seed.
Alastairが言うにはSequoiaのdeveloper seedで治ってるって
Avatar
おお!!
11:55 AM
macOS 14.4で急に9999特殊処理が適用されたのが間違いだっただけってことか 14.5で治らなかったのはタイミングとかかな
Avatar
ぽい
Avatar
じゃあやっぱmacOS出荷用の秘密のフォークがありそうだなあ そもそも9999特殊処理が実装されたタイミングはもっと前だったし 難しいな
11:58 AM
15.1とか2とかでまたうっかりそうなってしまったりしませんようにだなあ
Avatar
omochimetaru 6/13/2024 4:32 PM
わかりやすい
🙌 1
Avatar
もし迷うとしたら,前提知識がない人だと wasm32-unknown-wasi と wasm32-unknown-wasip1-threads のどっちが良いんだろうは迷う人がいるかもしれないですね.(私は両方とも使ってます)
Avatar
たしかにその違いはむずかしいですね
Avatar
omochimetaru 6/14/2024 1:35 AM
-wasi: スレッド命令(?) を使わない、 stdlib の関連APIは削除されている -wasip1-threads: スレッド命令を発行する、stdlibの関連APIが使える 使い分け: ビルドしたwasmバイナリを実行する処理型が p1thread をサポートしている → 後者で良い サポートしていない → 前者にせよ
Avatar
よし5.10のリリース作業終わったぞ https://blog.swiftwasm.org/posts/5-10-released
2:30 AM
5.10のリリース作業が終わると6.0のリリース作業が始まる
Avatar
Avatar
omochimetaru
例えば一つの理想としては div(display: "flex", flex-direction: "column", align-items: "center", gap: "4px") って書ける事だけど
今更ですが,function body macros を使うアイデアがちょっと気になりました. https://forums.swift.org/t/elementary-a-modern-and-efficient-html-rendering-library-inspired-by-swiftui-built-for-the-web/72647/4
I'm glad to see packages such as this appearing, but I'm also curious to see if anyone considered a much more efficient HTML renderer that relies on macros instead of result builders. I'll post a few ideas here that I had on my wishlist for a long time for a macro-based HTML rendering library. With function body macros there's no need to pollut...
Avatar
omochimetaru 7/3/2024 11:41 AM
ふむふむ
Avatar
ついに swift-corelibs-foundation が swift-foundation ベースになる MR がマージされたので,SwiftWasm の追従大変そうですね... (前向きには捉えてます) https://github.com/apple/swift-corelibs-foundation/pull/5008
This change merges the package branch (tracking all of our work to re-core Foundation on top of swift-foundation that many folks have been working on) into the main branch. At this point, all tests...
Avatar
おお。Linuxで使える日が近そう
Avatar
omochimetaru 7/17/2024 2:27 AM
swift-foundation最近調べてたんですが
2:27 AM
グレゴリオ歴を使う限りは ICU を使わないで済むように自前の実装になったようでした
👀 1
2:27 AM
Part 1: dateComponents(from date:) Implement dateComponents(from date:). The implementation largely follows that of ICU in calendar.cpp and gregocal.cpp. Julian day calculation algorithm is referen...
2:28 AM
corelibs実装ではICUのカレンダーオブジェクトを扱う関係でタイムゾーンが変化するとオブジェクトキャッシュが飛んで再生成になるせいで流し込むデータによってはすごく遅くなるのと、そこにバグがあってスレッドセーフティが壊れていてクラッシュする問題もあったんですが、これで丸ごと解決した
2:30 AM
プルリク見ると絶対時刻から歴を計算するロジックを実装していて難しそう 途中でユリウス暦というのが出てくる(よく知らない (edited)
Avatar
Avatar
omochimetaru
プルリク見ると絶対時刻から歴を計算するロジックを実装していて難しそう 途中でユリウス暦というのが出てくる(よく知らない (edited)
PR の内容はちゃんと読んでないですが,ユリウス暦が旧暦でグレゴリオ暦が新暦で,グレゴリオ暦開始以前の古い日時はグレゴリオ暦では表現できないからユリウス暦で表すためにユリウス暦を使っているんじゃないですかね? (edited)
Avatar
swift-testingにWasmサポート追加しておきました。 https://github.com/apple/swift-testing/pull/584
Motivation: Trying to support WebAssembly/WASI before shipping swift-testing as a part of toolchain Modifications: Thanks to prior WASI compatibility efforts by @grynspan, most of the parts work as...
t_kansha 3
👏 10
Avatar
特に問題があるわけではないのですが,swift-testing だけを使ったテストターゲットを書いて,swift build --build-tests して swift test --skip-build した場合は XCTest の実行結果と swift-testing の実行結果の両方が出てくるのに,swift build --build-tests --swift-sdk wasm32-unknown-wasi して wasmtime で実行した場合は swift-testing の実行結果しか出てこなくて,なぜなんだろうなと気になりました.(Linux) (edited)
4:42 PM
↑は↓を読んでて --testing-library swift-testing ありの挙動となしの挙動を比べてたら気付きました. https://github.com/apple/swift-testing/pull/587/files
Avatar
まだ見てないんですがSwiftPM側でswift testするときにその辺をやってるんじゃないかと推測してます (edited)
t_naruhodo 1
Avatar
あれ,なんか rm Package.resolved して swift build --build-tests --swift-sdk wasm32-unknown-wasi するたびに swift-testing only のがビルドされたり XCTest only のがビルドされたりランダムに変わりますね...
Avatar
なんかその変怪しいですよねぇ
Avatar
あ,通常だと .build 以下に *PackageTests.swift-testing と *PackageTests.xctest という二つのバイナリができるので,ひょっとしたら Wasm だとどっちの名前も *PackageTests.wasm になってあとのやつが先のやつを上書きしているかもしれない.
🦀 1
5:06 PM
5:07 PM
それはこれでもう解決しているから,次の Wasm Swift SDK がリリースされれば解決しそうですね.(6.0 にも cherry-pick 済み) https://github.com/swiftlang/swift-package-manager/pull/7789 (edited)
Avatar
次にWasm SDKをリリースするにはswift-foundationの作業を終わらせる必要がが。。 (edited)
Avatar
ですよね...
5:10 PM
とりあえず現状のワークアラウンドとしては多分 swift build --build-tests 時に --disable-xctest とかみたいに片方を無効化するフラグをつけてビルドしてもらえれば確実に防げそうではあります.
Avatar
両方混合して使っている人は避けようがなさそうですが
Avatar
この辺を見ていっている過程で XCTestMain のヘルプドキュメントが間違っていることに気づいたんですが,swift-corelibs-foundation と swift-corelibs-xctest に同じファイルがあって微妙に中身が違うのは何か使い分けがあるんですかね?(チャネル違いかもしれないですが) https://github.com/apple/swift-corelibs-foundation/pull/5044
🤷 1
Avatar
We are excited to announce a brand new open-source library from Point-Free: Swift Navigation. It contains a suite of tools that form the foundation for building powerful state management and navigation APIs for Apple platforms, such as SwiftUI, UIKit, and AppKit, as well as for non-Apple platforms, such as Windows, Linux, Wasm, and more.
👍 2
Exported 5,655 message(s)
Timezone: UTC+0