Guild icon
swift-developers-japan
開発環境, ライブラリ / server-side
Avatar
norio_nomura 4/25/2017 1:51 AM
ここならLinux版Swiftの話をしても良いのかな? (edited)
Avatar
omochimetaru 4/25/2017 1:51 AM
良いと思います
1:52 AM
linux-swift チャンネルがあったほうがいい?
Avatar
アプリに対してのサーバーサイドかと思ってた
1:52 AM
linuxチャンネルあってもいいんでない
Avatar
omochimetaru 4/25/2017 1:52 AM
紛らわしいからつくっとこ
1:52 AM
つくったよ #linux-swift
👍 1
Avatar
norio_nomura 4/25/2017 1:52 AM
ありがとうございます。
Avatar
おもちのadminみが増してる
🤗 1
Avatar
omochimetaru 4/25/2017 1:53 AM
Slackと違ってチャンネルが基本全部見えてるの便利
Avatar
wakaru
Avatar
このmeetupは、Server Side Swiftに関することを発表、ディスカッションする場となります。 Vapor, Zewoなどのフレームワークを使 ってみた、Swiftサーバーを自分のサービスに導入してみたなどの経験談や、自作しているOSSの紹介など話したいネタがある方は是非、スピーカーとしてご参加くだ さい! # 発表 発表者 発表タイトル 発表詳細 Yuki Takei (noppoMan) Server Less Server Side Swift with Hexaville Hexavilleを使い、serverlessなSwift製Serverを構築します...
👍 1
3:03 PM
ヘキサビル良さげだった いわゆるwebappの枠組みで実装すると、 ルーター定義をAWSLambdaにマップして ドッカーでELFバイナリ作って全部デプロイしてくれて サーバーレスでAppServerが動く ローカルのデバッガサーバもあってxcodeでブレーク可能
Avatar
おおー
Avatar
omochimetaru 5/26/2017 3:04 PM
ステートレスになるのでLambdaの枠組みで自動スケール
Avatar
xcodeデバッガ使えるの凄い
Avatar
え、すごい
Avatar
omochimetaru 5/26/2017 3:05 PM
作者さんは自分の業務二件に今後適用する予定で
3:05 PM
どんどん改良していくそうです
3:06 PM
永続化についてはRDBに対するコネクションプーリングができないのが弱みで、 今後の知見を出して行くとのこと
Avatar
前にもlibuvベースのframework書いてた方ですよね...本当すごい
Avatar
omochimetaru 5/26/2017 3:07 PM
あ、そうですね、懇親会で話したらそんなこともいってた
Avatar
コネクションプーリングできない、解決する見込みあるのかしら
Avatar
omochimetaru 5/26/2017 3:09 PM
ディスコード誘っといたからきたら聞いて
Avatar
わいわいしてきた
Avatar
お邪魔しま〜す
😀 2
Avatar
omochimetaru 5/27/2017 8:57 AM
@noppoman 発表の時に言っていた、「RDBに対するコネクションプーリングができない」件に対して検討してるアイデアってなんでしたっけ
Avatar
lambdaからRDBや他のミドルウェアに対するコネクションプーリングをどう持つかという点ですが、 lambda <-> TCP proxy server <-> RDB, Redis みたいな感じでミドルウェアとの間にコネクションプールを持つTCPプロキシサーバーを立ててやり過ごすのが妥協案として検討しているものになります。 TCPプロキシサーバーを構築する上でミソになるのが、 ・SPOFにならないよう複数台立ててLBにぶら下げる ・非同期IO+イベントループモデルなサーバーを採用する(microなどの低スペックインスタンスでも十分動作するように) になるのでしょうか。 一番簡単なのは、node.jsのTCPサーバー+mysqlクライアントで構築してしまうのが良さそうです。 ただ、このアイデアはもはやサーバーレスではなくなりすまし、運用が発生するので、最終兵器感はあります、、 lambdaを使ったアプリケーションのデータストア先として相性が良いものは、コネクションの本数を気にしなくていいdynamodbやkinesis、sqs、s3なので、これらを選択するのが一番最良です。
4:57 PM
ちなみに、SwiftのMysqlクライアントには、 https://github.com/noppoMan/SwiftKnex を利用するつもりです。
SwiftKnex - A Mysql Native Client and Query Builder written in Pure Swift
Avatar
omochimetaru 5/29/2017 2:40 AM
なるほど。RDBプロキシの単機能インスタンスなら、それでもAPサーバを保守するよりはマシそうです。
Avatar
ですね。 ecsのオーケストレーションとオートスケールを組み合わせる事で、プロキシサーバーレベルであればほぼ運用なしで行けるとは思っています。
Avatar
この辺も運用し出したら、Dockerfileとcloudformationに切り出してHexavilleのプラグイン的な感じで出そうかなと思います
Avatar
Swaggerを元にVaporのコントローラとモデルのコードを自動生成するような仕組みをこの休みで作ってたんですが最高ですね
Avatar
Swaggerを元にVaporのコントローラとモデルのコードを自動生成
気になる 👀
Avatar
おっ
9:54 AM
具体的にはswaggerのymlを読んで構造化してgybから呼び出せるようなpythonのスクリプトを書きました
9:54 AM
でXcodeのbuild phaseにそのジェネレータを突っ込んでおいてcmd+bのたびに生成されるようにした
Avatar
あ、ということはSwagger自体が持ってる自動生成の仕組みと別でってことなんですね :tsuyoi: (edited)
Avatar
swagger-codegenは使ったことないですけど、自由にやりたいという気持ちから自作しました
👍 1
9:56 AM
確かswagger-codegenはjava製だった?ような
9:56 AM
それも使いたくないの理由です
Avatar
#java
9:57 AM
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.
Avatar
ですです
Avatar
swagger、普通にenumとかも表現できそうなので自動生成である程度型化できると嬉しい感あるけど、そこまでやるとやりすぎなのか悩みどころです
Avatar
どうでしょう
9:59 AM
やり過ぎということは無い気がしていて、むしろSwaggerいじれば全てがそれに合わせて生成される方がハッピーそう
Avatar
ドキュメント=実装なの最高すなー
Avatar
自作コードジェネレータはまだSwaggerのenumに対応してないですが、やりたいと思っています
Avatar
期待 🙌
Avatar
ていうか、gybの導入についてはmoaibleさんのブログにだいぶ助けていただきましたよ
10:00 AM
ありがとうございます
10:01 AM
Swift gybの環境構築 ふとSwiftのgybが気になったので環境構築を試して見ました gybとは Swift言語開発の副産物のメタプログラミングツールgybがとても良い— おもちメタル (@omochimetaru) 2017年6月30日 gybは「Generate Your Boilerplate」の略称みたいです(gyb --helpより) 具体的に何かと言うと、Swiftの公式リポジトリの中でSwiftコードの自動生成に使われているPython製のテンプレートエンジンになります gybを導入する qiita.com というわけで、こちらを参考に環境構築して見ました まずgyb自体…
10:01 AM
これ
Avatar
おおお、良かったです! 少しでもお役に立てればッ
Avatar
コードジェネレータの部分は単独でリポジトリに切り出してGitHubに置くつもりがあるので
10:02 AM
もうすこしこなれたら是非触ってみて貰いたいです
Avatar
ぜひぜひ!使わせてください
Avatar
Swaggerからのコード生成、Swaggerの仕様を全部カバーしないといけないの結構大変でバージョン1のリリースかなり遠い感じある
10:16 AM
適当にバージョン0で出しちゃうか
Avatar
@hiragram >@lovee: そういえばSSSやってる人はみんなVaporとかKituraとかPerfectとかどれでやってますか?
Avatar
はい
9:05 AM
Vapor
9:05 AM
Vaporマンいたらちょっと聴きたいことあるんで助けてほしいです
Avatar
やっぱVapor人気っぽいですね
9:55 AM
冬コミ終わったらやってみたい感 is ある(その前に本を…本を……
Avatar
Vapor Cloudで実際にサービス動かしてる話とかコードジェネレータの話とかするので良かったらきてください https://connpass.com/event/77789/
## イベント概要 Swiftはバージョン3以降OSSとなり、LinuxやAndroidなどのAppleプラットフォーム以外での利用シーンも広がってきています。 サーバサイドでSwiftを使うことも選択肢の一つになってきています。 日本ではまだあまり有名になっていないサーバサイドSwiftの代表的なフルスタックMVCフレームワークであるVaporを取り上げ、サーバサイドSwiftの使い 所やメリットやデメリットなど知見を共有し、プロダクションでの実例が増えること目指します。 初回はVaporのコアコミッタである Tanner を始め豪華ゲストに参加してもらい、Vaporについて語...
Avatar
↓すごい。 Vaporの生みの親である Tanner が来日し参加してくれます。Vaporの紹介や他のプログラミング言語に比べる優位性、Vaporの未来や、USやヨーロッパでの浸透状況について話していただきます。
3:50 AM
聞いてみたいけど東京じゃ無理だー。
Avatar
omochimetaru 1/25/2018 4:15 AM
参加!
Avatar
昨日ポチったけど、完全にそこ見落としていたw
Avatar
omochimetaru 1/25/2018 4:17 AM
結局全然触らないまま「vaperが良さそうらしい」という雰囲気だけ受信してる・・・w
👆 2
Avatar
同じく Kitura だけ触ったけどどうやら Vapor が良さそうらしいという(略 (edited)
Avatar
昨日
4:00 AM
https://vapormeetuptokyo.connpass.com/event/77789/ で話した資料をupしました! https://speakerdeck.com/noppoman/server-side-swift-falsege-ren-de-nali-yong-sin 興味ある人は御覧ください (edited)
🙌 6
Avatar
vapor/mysqlにpublic varで宣言されてる定数っぽいのがたくさんあって困惑している https://github.com/vapor/mysql/blob/master/Sources/MySQL/Protocol/MySQLStatusFlags.swift 雑なだけなのか変更される可能性があるのか……
mysql - 🐬 Pure Swift MySQL client built on non-blocking, event-driven sockets.
Avatar
omochimetaru 4/27/2018 9:45 AM
雑なだけじゃないか・・・?
Avatar
letになおすだけでもいいけどこのへんもOptionSetにしたくなってくる
Avatar
omochimetaru 4/27/2018 9:47 AM
個別にPR出してみたら。
Avatar
こんなプロトコルがあるのに適合してるのが一種だけだったりする https://github.com/vapor/mysql/blob/master/Sources/MySQL/Protocol/MySQLFlags.swift
mysql - 🐬 Pure Swift MySQL client built on non-blocking, event-driven sockets.
9:47 AM
そうですね。そうしようかと思います
Avatar
omochimetaru 4/27/2018 9:48 AM
結局このパッケージってローレイヤでしかなくて
9:48 AM
Fluent / FluentMySQL を介してしか触らないから
9:49 AM
ユーザのコードにはあんまり影響無いしそんなに来にしてないんじゃないだろうか
Avatar
Kishikawa Katsumi 4/27/2018 9:49 AM
自動生成なんじゃないかとみた
Avatar
いやそれはおかしいです Configなんかはユーザーからも触るので
Avatar
omochimetaru 4/27/2018 9:49 AM
自動生成
あ〜ありえますね
Avatar
>自動生成 だとすると勝手に変更してもまずいですかね・・・?
Avatar
Kishikawa Katsumi 4/27/2018 9:49 AM
/// public var SERVER_MORE_RESULTS_EXISTS: MySQLStatusFlag = 0x0008 ^ この辺の空のドキュメンテーションコメントが自動生成っぽい。
Avatar
mysqlはおそらくfluentMySQLから@_exported importされてる 調べてないですが
Avatar
Kishikawa Katsumi 4/27/2018 9:50 AM
たぶん書き捨てのスクリプトとかで一発目を作ったとかじゃないかと思うんですよね。自動生成でメンテすることはおそらく考えてないとかじゃないかな。
9:50 AM
だからPRはむしろ歓迎じゃないかと。
Avatar
その可能性はありそうですね。まぁ投げて反応見てみます。
Avatar
norio_nomura 5/8/2018 3:16 AM
これNOW()を使うのが間違ってる様に思える。 https://github.com/vapor/fluent/issues/464
I want vapor to support time zone. Details are in below. Problem Database level debuggability Currently vapor supports to reading and writing Date value for database. But it is always encoded as GM...
Avatar
omochimetaru 5/8/2018 3:17 AM
MySQLでレコードの更新時刻とかをNOW()で埋めるのとかわりと普通じゃないですか?
3:18 AM
それが間違ってるとすると、MySQL自体のtimezone機能の存在自体がおかしいってことに。
Avatar
norio_nomura 5/8/2018 3:18 AM
UTC_TIMESTAMP()を使うべきでは。
Avatar
omochimetaru 5/8/2018 3:32 AM
それはtimezoneに関わらずUTCの時刻を返す関数ですね。 Vaporの現状によせつつクエリを書くならそうですね。
3:32 AM
やりたいことの前提が逆で、timezoneを使ってJSTの値でDBを使いたいのです。
3:33 AM
理由はDBを直接みたりするときにその方がわかりやすいから。
Avatar
norio_nomura 5/8/2018 3:46 AM
TIMESTAMPカラムではなくDATETIMEカラムなのか。
Avatar
omochimetaru 5/8/2018 3:53 AM
そうです。でも、その二つの違いを気にしてなかったです。
MySQL は、TIMESTAMP 値を、ストレージでは現在のタイムゾーンを UTC に変換し、取得では UTC から現在のタイムゾーンに戻します。(DATETIME などのほかの型ではこれは行われません。)
https://dev.mysql.com/doc/refman/5.6/ja/datetime.html
3:54 AM
TIMESTAMPだったら表示はオフセットされるのか。
3:55 AM
もしかしてTIMESTAMP型を使えばなにもかも解決する・・・?
Avatar
サーバーのタイムゾーンをJSTにしたところでvaporがUTCのDateしか扱えないので問題はのこるのでは? コネクション毎にタイムゾーンを切り替えるとかならできるのかもしれないですが
Avatar
norio_nomura 5/8/2018 3:59 AM
そもそもSwift.DateはUTCですよね。
Avatar
ですね
4:03 AM
SQLサーバーにはJSTのタイムスタンプが格納されていて、それをvaporの方法に則って取得すると9時間ずれた時刻になるのが現在の問題(の一つ)で、カラムをTImestampにしたところで結局swift側ではUTCで受け取りたいのでサーバー設定を上書きしてタイムゾーンをUTCにしてやらないとじゃないかと思います。 サーバーのタイムゾーンをJSTにしておけばPHPMyAdmin等で見るTimeStampカラムは補正されてくれそうですが
Avatar
omochimetaru 5/8/2018 4:05 AM
@t.ae Swift.DateとMySQL.TIMESTAMPの間の変換(Vaporの実装における)はコネクションのtime zoneの影響を受けないんじゃない? (edited)
Avatar
そこはどうなってるか見てみないとわからないですね。 サーバーのタイムゾーンをJSTに設定している場合、コネクションの最初にUTCに変更しないとJSTに補正された値が返ってくるんじゃないかと思ってるんですが
4:07 AM
>コネクションの最初にUTCに変更 ここをvaporがやってくれてるかどうか (edited)
Avatar
omochimetaru 5/8/2018 4:08 AM
TIMESTAMP型の振る舞いについては、SQLをコンソールからIOしたときのテキストベースの振る舞いの話と、Vaporが叩いてるMySQLのバイナリAPIの方で、同じ事がおきるのかどうかよくわかんなくって (edited)
4:09 AM
バイナリAPIでは内部のデータ表現がTIMESTAMP型の値としてそのままやってくるんだとしたら
4:10 AM
表現型での時差変換の話は関係なさそうだなと
Avatar
omochimetaru 5/8/2018 4:38 AM
mysql - 🐬 Pure Swift MySQL client built on non-blocking, event-driven sockets.
mysql - 🐬 Pure Swift MySQL client built on non-blocking, event-driven sockets.
4:39 AM
バイナリでもYMDHMSが分割されたフィールドセットとしてエンコードされるみたいだね
4:40 AM
TIMESTAMP型の時差変換が発生するなら、SQLサーバのtime zoneはUTCにしておいて、デバッグ用途で直接見るときにJSTでつなぐのが良さそう
4:41 AM
たしかにサーバー time zoneがJSTだった場合に、 MySQL.TIMESTAMPとSwift.Dateの間の変換は狂いそう。やってみないとわからんけど
Avatar
norio_nomura 5/19/2018 6:39 AM
サンプルコードを最小限にしたvapor3のテンプレートvapor-cleanに、docker-compseとHerokuの設定を追加したテンプレートを作った。 https://github.com/norio-nomura/vapor-clean
vapor-clean - A Vapor 3 template with no additional cruft.
Avatar
KitsuraもSwift-NIO利用するように以降し始めている? https://github.com/IBM-Swift/Kitura-NIO
Kitura-NIO - A networking library for Kitura, based on SwiftNIO
Avatar
おー、KituraはVaporと違ってFutureを表に出さない実装になってますね。
10:16 AM
互換性維持したままみたいだから当然か。 https://github.com/IBM-Swift/Kitura/compare/kitura-nio
Kitura - A Swift web framework and HTTP server.
Avatar
## イベント概要 # VaporMeetupTokyo Swiftはバージョン3以降OSSとなり、LinuxやAndroidなどのAppleプラットフォーム以外での利用シーンも広がってきています。 サーバサイドでSwiftを使うことも選択肢の一つになって...
6:54 AM
本日開催だけど、まだ20人くらい枠空いてます
Avatar
omochimetaru 6/7/2018 6:54 AM
発表します😀
🎉 4
Avatar
tl;dr swift package update Slightly longer version After an initial report from @Pushkar_N_Kulkarni (thank you!) we recently identified a severe security vulnerability in SwiftNIO's ByteBuffer code which was fixed in the following releases: 1.0.1, 1.1.1, 1.2.2, 1.3.2, 1.4.3,...
swift 1
Avatar
swift-corelibs-foundation - The Foundation Project, providing core utilities, internationalization, and OS independence
Avatar
ちょっとずれるけど、Carthageで rename システムコールをまず試してダメだったら FileManager.moveItem を試すというのをやったけど、corelibs-Foundationではそのケースが未実装なのかー。 https://github.com/Carthage/Carthage/pull/713 (edited)
Should fix #706 and #711. The manpage of rename() says: Both old and new must be of the same type (that is, both must be either directories or non-directories) and must reside on the same file sys...
6:59 AM
corelibs-Foundationの実装がまさに rename 使ってるのか(これはcontributionチャンス)
Avatar
copyItemとremoveItem組み合わせるだけじゃ足りないんですかね? そのくらいならPR出せそうですけどいろんなケースを知らなすぎて適当なことできない感じが
Avatar
Kishikawa Katsumi 8/7/2018 7:20 AM
SwiftPMでもこの辺は再実装されてるから参考になるかも?
Avatar
私もあまり詳しくないですが、真っ先に思いつくのは copyItem と removeItem の間はちゃんと lock とらないと、copyItem と removeItem の間で古い item に書き込みが生じてしかも見かけ上成功してしまい、呼び出しがわで recovery できない的な問題が発生しそうですね
Avatar
omochimetaru 8/16/2018 7:01 AM
root@7214eacbf30e:/var/vapor# swift a.swift Fatal error: enumerateSubstrings(in:options:using:) is not yet implemented: file Foundation/NSString.swift, line 791 /usr/bin/swift[0x3f24d54] /usr/bin/swift[0x3f25096] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f5a99805390] /usr/lib/swift/linux/libswiftCore.so(+0x2baf79)[0x7f5a94a43f79] /usr/lib/swift/linux/libswiftCore.so(_T0s17_assertionFailures5NeverOs12StaticStringV_SSAE4fileSu4lines6UInt32V5flagstF+0x2c)[0x7f5a948d646c] /usr/lib/swift/linux/libFoundation.so(+0x501c3f)[0x7f5a8dac7c3f] /usr/lib/swift/linux/libFoundation.so(+0x501b0a)[0x7f5a8dac7b0a] /usr/lib/swift/linux/libFoundation.so(_T010Foundation8NSStringC14enumerateLinesyySS_SpyAA8ObjCBoolVGtcF+0x77)[0x7f5a8db559c7] /usr/lib/swift/linux/libFoundation.so(_T0s14StringProtocolP10FoundationSS5IndexVADRtzrlE14enumerateLinesyySS_Sbztc8invoking_tF+0xa0)[0x7f5a8db6bed0] [0x7f5a99c350c3] /usr/bin/swift[0xfed1ce] /usr/bin/swift[0xff1692] /usr/bin/swift[0x4d9076] /usr/bin/swift[0x4c35d3] /usr/bin/swift[0x4beecc] /usr/bin/swift[0x4778c4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f5a97f2f830] /usr/bin/swift[0x475179] Stack dump: 0. Program arguments: /usr/bin/swift -frontend -interpret a.swift -disable-objc-interop -color-diagnostics -module-name a Illegal instruction (edited)
7:01 AM
root@7214eacbf30e:/var/vapor# swiftc a.swift root@7214eacbf30e:/var/vapor# ./a Fatal error: enumerateSubstrings(in:options:using:) is not yet implemented: file Foundation/NSString.swift, line 791 Illegal instruction
7:01 AM
NSUnimplemented を呼び出すコードを一度バイナリにコンパイルしてから実行するとスタックトレースが出ない
7:02 AM
Vapor Frameworkでこれに直面していて、ユーザコードで fatalError した場合はスタックトレースが出るが
7:02 AM
Foundationの NSUnimplemented でクラッシュするとスタックトレースが出ないのだけど
7:02 AM
理由や、どうすれば出るようになるか、わかる方いますか?
Avatar
Linuxだとスタックトレースを出す仕組みが成果物に組み込まれていない。
11:18 AM
スタックトレースを出力するシグナルハンドラを自分で設定する必要がある。
11:19 AM
僕はその目的で https://github.com/norio-nomura/SwiftBacktrace を作りました。
SwiftBacktrace - Stack traces for Swift on Mac and Linux using libunwind.
Avatar
上の例で、swiftコマンドで直接実行した場合は出てくるのと、 swiftcでコンパイルしても、fatalError直接呼び出しなら出るのが、謎で。
11:20 AM
あ、シンボル名が出なくてアドレスしか出ない件については
11:20 AM
のむらさんのそれはチェックしました!
11:20 AM
謎なのは、アドレスだけのスタックトレースさえ、条件によって出ないことです
Avatar
swiftコマンドだとswiftコマンドが設定したシグナルハンドラが受け取ってくれます。
11:21 AM
Linux版のswiftcで作成された成果物には、スタックトレースを出力するシグナルハンドラは設定されません。
Avatar
ふむふむ。
Avatar
macOSの場合、システムが用意したスタックトレースを出力するシグナルハンドラが使われているのだと思います。
Avatar
Linuxでも、vapor buildしたバイナリで(内部的にはswiftPM) 自分で書いたfatalErrorなら出るんです
11:24 AM
Foundationの中で落ちた時だけでない。
Avatar
自分で書いたfatalErrorなら出るんです
これ本当ですか?
Avatar
ふむ。あとで確認できるものを用意してみます
11:27 AM
ありがとうございます
Avatar
ああ、fatalError()はシグナル経由ではなくて、fatalError() > _assertionFailure() > _swift_stdlib_reportFatalError*() > swift_reportError() > reportNow() > printCurrentBacktrace() なのかな。
Avatar
再現環境がもうちょっとでできそうです。
Avatar
omochimetaru 8/16/2018 1:11 PM
(docker周りのミスでimage構築をやりなおしが複数回発生していて時間がかかってます
Avatar
norio_nomura 8/16/2018 1:12 PM
再現環境は明日見ますね。
Avatar
omochimetaru 8/16/2018 1:14 PM
あい。
Avatar
norio_nomura 8/16/2018 1:18 PM
とりあえず今確認した範囲では、fatalError()をユーザーコードで呼び出した場合は https://github.com/apple/swift/blob/master/stdlib/public/runtime/Errors.cpp#L275printCurrentBacktrace()が呼ばれ、NSUnimplemented()経由だとprintCurrentBacktrace()は呼ばれずシグナルハンドラの挙動に依存する、という違いがあると知りました。
swift - The Swift Programming Language
Avatar
omochimetaru 8/16/2018 1:31 PM
Contribute to linux-swift-stacktrace development by creating an account on Github.
1:32 PM
なるほど、fatalErrorのコール内部でシグナル飛ばす前に直接スタックトレースを出す処理があって、それがコンパイル条件で異なるんですね。
1:32 PM
うーんまさにそれっぽい。
1:34 PM
ということは、シグナルハンドラ + norioさんの libunwindラッパーを導入するのが安牌っぽいですが、 逆に二回出ちゃう事になるんだろうか
Avatar
-assert-configでコントロールできそうにも見える。 -assert-config <value> Specify the assert_configuration replacement. Possible values are Debug, Release, Unchecked, DisableReplacement. (edited)
Avatar
@swift-4.1.3 -assert-config Release fatalError()
Avatar
exit status: 4 with stderr:Fatal error: file <stdin>, line 1 #0 0x0000000003f25074 PrintStackTraceSignalHandler(void*) (/usr/bin/swift+0x3f25074) #1 0x0000000003f253b6 SignalHandler(int) (/usr/bin/swift+0x3f253b6) #2 0x00007f662e570390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #3 0x00007f6629e5a0b9 _T0s17_assertionFailures5NeverOs12StaticStringV_SSAE4fileSu4lines6UInt32V5flagstFTf4nxnnn_n (/usr/lib/swift/linux/libswiftCore.so+0x2bb0b9) #4 0x00007f6629cec41c _T0s17_assertionFailures5NeverOs12StaticStringV_SSAE4fileSu4lines6UInt32V5flagstF (/usr/lib/swift/linux/libswiftCore.so+0x14d41c) #5 0x00007f662e9a006e #6 0x0000000000fed3be llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) (/usr/bin/swift+0xfed3be) #7 0x0000000000ff1882 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const* const*) (/usr/bin/swift+0xff1882) #8 0x00000000004d9076 swift::RunImmediately(swift::CompilerInstance&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) (/usr/bin/swift+0x4d9076) #9 0x00000000004c35d3 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) (/usr/bin/swift+0x4c35d3) #10 0x00000000004beecc swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) (/usr/bin/swift+0x4beecc) #11 0x00000000004778c4 main (/usr/bin/swift+0x4778c4) #12 0x00007f662cc9a830 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20830) #13 0x0000000000475179 _start (/usr/bin/swift+0x475179) Stack dump: 0. P
Avatar
@swift-4.1.3 -assert-config Debug fatalError()
Avatar
exit status: 4 with stderr:Fatal error: file <stdin>, line 1 Current stack trace: 0 libswiftCore.so 0x00007f18b22e0680 _swift_stdlib_reportFatalErrorInFile + 221 1 libswiftCore.so 0x00007f18b204f38c <unavailable> + 1368972 2 libswiftCore.so 0x00007f18b22892f2 <unavailable> + 3703538 3 libswiftCore.so 0x00007f18b228a759 <unavailable> + 3708761 4 libswiftCore.so 0x00007f18b204ea86 <unavailable> + 1366662 5 libswiftCore.so 0x00007f18b22890bb <unavailable> + 3702971 6 libswiftCore.so 0x00007f18b204ea86 <unavailable> + 1366662 7 libswiftCore.so 0x00007f18b21bc0b9 <unavailable> + 2863289 8 libswiftCore.so 0x00007f18b204e3f0 _assertionFailure(_:_:file:line:flags:) + 44 10 swift 0x0000000000fed3be <unavailable> + 12506046 11 swift 0x0000000000ff1882 <unavailable> + 12523650 12 swift 0x00000000004d9076 <unavailable> + 888950 13 swift 0x00000000004c35d3 <unavailable> + 800211 14 swift 0x00000000004beecc <unavailable> + 782028 15 swift 0x00000000004778c4 <unavailable> + 489668 16 libc.so.6 0x00007f18b4ffc740 __libc_start_main + 240 17 swift 0x0000000000475179 <unavailable> + 479609 #0 0x0000000003f25074 PrintStackTraceSignalHandler(void*) (/usr/bin/swift+0x3f25074) #1 0x0000000003f253b6 SignalHandler(int) (/usr/bin/swift+0x3f253b6) #2 0x00007f18b68d2390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #3 0x00007f18b21bc0b9 _T0s17_assertionFailures5NeverOs12StaticStringV_SSAE4fileSu4lines6UInt32V5flagstFTf4nxnnn_n (/usr/lib/swift/linux/libswiftCore.so+0x2bb0b9) #4 0x00007f18b204e41c _T0s17_assertionFailures5NeverOs12StaticStr
Avatar
-assert-config ReleaseprintCurrentBacktrace()は呼ばれなくなる。
Avatar
omochimetaru 8/17/2018 1:22 AM
ほほーそんなものが
Avatar
omochimetaru 8/17/2018 3:07 AM
@usableFromInline @_transparent internal func _fatalErrorFlags() -> UInt32 { // The current flags are: // (1 << 0): Report backtrace on fatal error #if os(iOS) || os(tvOS) || os(watchOS) return 0 #else return _isDebugAssertConfiguration() ? 1 : 0 #endif } (edited)
3:07 AM
なるほどなるほど
3:09 AM
assert-config Releaseだと他のassertion関係も変化が生じてしまいそうなので採用は見送ろうと思いますがいろいろなことがわかりました
Avatar
omochimetaru 8/17/2018 3:29 AM
lldbのリモートデバッグ機能を使って、LinuxのプロセスをMacからデバッグしようとしているのですがうまくいきません・・・
3:29 AM
Linuxのホスト内で、 lldb-server と lldb を使って、自分で自分にリモートデバッグ接続をして、 attach することはできました
3:30 AM
Linux上のlldb-server に Mac のlldbから接続して、 platform connect には成功しているのですが
3:30 AM
(lldb) attach 572 error: attach failed: Failed to connect port
3:30 AM
アタッチするところで失敗していまいます
3:31 AM
バージョンはどちらも4.1.0 releaseを使っていて
3:31 AM
// Linux root@031ab2443e1a:/var/vapor# lldb-server v lldb version 5.0.0 (git@github.com:apple/swift-lldb.git revision 76dfa56ed35eaa392f7e51088c08f08f1150d142) Swift-4.1 (revision f01501c324876fc07820dc28923d7088fb7af847) clang revision cd84be6c4294f9ec302c20c63a601cbaeaa6a017 llvm revision cf364153438b3ac07a4a7d721159936e439ba2e7 (edited)
3:31 AM
[omochi@omochi-iMac-PC43 ~]$ lldb --version lldb-360.0.0 (buildbot 2018-03-29) Swift-4.1 (revision f01501c324876fc07820dc28923d7088fb7af847) clang revision cd84be6c4294f9ec302c20c63a601cbaeaa6a017 llvm revision cf364153438b3ac07a4a7d721159936e439ba2e7
3:32 AM
このlldb自体のバージョン表記が異なっているのがちょっと気になっていますが依存パッケージ3つはリビジョンも一致しているしあってそう
3:36 AM
それともattachするときにlldb sv/cl通信とは別のポートを使うのでしょうか?
Avatar
omochimetaru 8/17/2018 3:58 AM
Ubuntu16.04の4.1 releaseをDLしてみたけどやはり 上記の表示でした
Avatar
omochimetaru 8/17/2018 4:48 AM
I am trying to remote debug server side swift from macOS. lldb-server run on Ubuntu 16.04 on Docker on macOS. I am using swift-4.1-RELEASE binaries. root@031ab2443e1a:/var/vapor# lldb-server vers...
4:48 AM
スタックオーバーフロー書き込んだ・・・
Avatar
@omochimetaru なんかコードブロックがおかしくなってる。 (edited)
Avatar
omochimetaru 8/17/2018 4:56 AM
これマークダウンじゃないのかな
4:57 AM
あ、わかった、なんかちがうっぽい
4:58 AM
できた。 @koher どうもです。
🙂 1
Avatar
lldb-server試した。
11:06 AM
docker-compose.ymlprivileged: trueを追加。
11:06 AM
lldb-server起動オプションに--min-gdbserver-port 31167 --max-gdbserver-port 31266を追加。
11:07 AM
docker-compose.ymlports- "31166-31266:31166-31266"を追加。
11:07 AM
それでいけた。
Avatar
マジですか!
Avatar
linux-swift-stacktraceに https://github.com/omochi/linux-swift-stacktrace/compare/master...norio-nomura:use-lldb-server の変更を加え、 docker exec -it vapor lldb-server platform --listen "*:31166" --server --min-gdbserver-port 31167 --max-gdbserver-port 31266lldb-serverを起動。
Contribute to linux-swift-stacktrace development by creating an account on Github.
Avatar
gdbプロコトルのほうで使うポートがあったんですね
11:30 AM
ありがとうございます、あとでよく見てみます
Avatar
$ xcrun lldb (lldb) platform select remote-linux Platform: remote-linux Connected: no (lldb) platform connect connect://172.16.241.138:31166 Platform: remote-linux Triple: x86_64-*-linux-gnu OS Version: 4.9.93 (4.9.93-boot2docker) Kernel: #1 SMP Thu Jul 19 18:29:50 UTC 2018 Hostname: 88958a83a317 Connected: yes WorkingDir: /var/vapor (lldb) platform process list 4 matching processes were found on "remote-linux" PID PARENT USER TRIPLE NAME ====== ====== ========== ======================== ============================ 1 0 (null) x86_64-*-linux dash 338 1 x86_64-*-linux vapor 563 338 x86_64-*-linux Run 568 0 x86_64-*-linux lldb-server (lldb) platform process attach --pid 563 Process 563 stopped * thread #1, name = 'Run', stop reason = signal SIGSTOP frame #0: 0x00007f8f41cfe360 libpthread.so.0`__pthread_cond_wait + 192 libpthread.so.0`__pthread_cond_wait: -> 0x7f8f41cfe360 <+192>: movl (%rsp), %edi 0x7f8f41cfe363 <+195>: callq 0x7f8f41d011c0 ; __pthread_disable_asynccancel 0x7f8f41cfe368 <+200>: movq 0x8(%rsp), %rdi 0x7f8f41cfe36d <+205>: movl $0x1, %esi thread #2, name = 'Run', stop reason = signal SIGSTOP frame #0: 0x00007f8f41d00827 libpthread.so.0`do_futex_wait.constprop.3 + 55 … (edited)
11:35 AM
僕はdocker-machineを使ってるので、macOSのlldbからの接続先が127.0.0.1ではないのが違うくらいかな。
Avatar
omochimetaru 8/20/2018 7:18 AM
@norio_nomura ありがとうございます、いけました。ドキュメントは見つけられなかったですが、与えたリストから一つ使うみたいでした。 https://github.com/apple/swift-lldb/blob/a5cac96cb2861b5b818cc280911180a0329f1205/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp#L482 本番構成のほうでは、Dockerホストマシンがクラウドにあるのですが、sshポートフォワードを介して、Dockerコンテナ内のlldb-serverと手元のMacのlldbを接続できました。
swift-lldb - This is the version of LLDB that supports the Swift programming language & REPL.
❤ 1
7:23 AM
エラーメッセージでググってたとき、 --min-gdbserver-port を指定してるコマンドラインは見かけていたのですが、それについて調べても情報が出てこなかったのでスルーしていました。gdbの互換モードみたいな特殊な使い方があるのかな?みたいな。
Avatar
omochimetaru 6/10/2019 2:52 AM
vaporのwebsocket-clientがプロトコルアップグレードの処理でバグってる件、パッチを提出しておいたんだけど、 タナーさんから返事がついてて別のアプローチ検討してるとのこと アップグレードするときに、「普段はバッファリングするだけ、外すときに中身を吐き出す」ハンドラをくっつける方式らしい。 https://github.com/vapor/nio-websocket-client/pull/4
I retry #3 This PR resolves #1. Original implementation have this steps. add out WebSocketFrameEncoder add in WebSocketFrameDecoder remove inout WebSocketClientUpgradeHandler upgradePipelineHandler...
👀 2
Avatar
IBMがSwiftへのcontributionを止めるらしい。 https://forums.swift.org/t/december-12th-2019/31735 (edited)
IBM update @IanPartridge and @Chris_Bailey let the group know that following a review by IBM of its open source priorities, it has been decided that they will not be continuing to work on Swift in 2020. As a result, they are both standing down from the workgroup. @IanPartrid...
😿 8
Avatar
あら・・・
Avatar
Kishikawa Katsumi 12/17/2019 1:15 AM
残念だ
Avatar
omochimetaru 5/29/2020 7:14 PM
Lambda!
7:14 PM
サーバーレスSwiftだ
Avatar
サーバーレス...
Avatar
omochimetaru 5/29/2020 7:19 PM
Lambda使うところだけPythonになっちゃうの嫌だったから助かる
Avatar
AWSにロックイン
Avatar
AWSキター
Avatar
う、最近 GCP に寄せてたのに・・・
Avatar
Kishikawa Katsumi 10/5/2020 7:34 PM
Vaporは非力なマシンでdocker buildするとコンパイルが終わんないっすね。ビルド済みのイメージを転送するかPullするようにしたらいいけど、絶賛開発中みたいなときは面倒だな。
Avatar
なにがそんなに遅いんですかね
Avatar
Kishikawa Katsumi 10/5/2020 7:40 PM
全体的にビルドが数倍遅くなるんですけど、だいたいCファイルをコンパイルしようとするところですごく遅くなって、進まなくなることもありますね。
7:40 PM
メモリをすごい使ってて、スワップがすごく多くなるのかな。
Avatar
norio_nomura 10/5/2020 9:01 PM
Swift 5.3はビルドがめちゃめちゃ遅いです。5.2でビルドできるコードなら、そっちを使った方が良い。 (edited)
Avatar
Kishikawa Katsumi 10/5/2020 9:21 PM
なんと。5.3が理由だったのか。ローカルだと速いのであとでGCE+Dockerの環境で試してみます。
Avatar
へえ、なんでだろ。
Avatar
norio_nomura 10/5/2020 9:54 PM
過去にビルド時のメモリ消費が増えたときには、アロケーションエラーで止まるようになったのですが、今回はswift-atomicsとかでタイムアウトになる。
Avatar
Kishikawa Katsumi 10/5/2020 9:54 PM
そっすねえ。swift-atomicsのCファイルをビルドするのめっちゃ遅いです。非力なマシンだと。
Avatar
norio_nomura 10/5/2020 9:55 PM
5.2だと普通にビルドできます。
9:57 PM
あ、コンパイルエラーが出て早く終わってただけかも?ちゃんと確認してないや。
Avatar
5.2で使えないエクステンションの書き方とかを修正したけど、clangの機能が足りなくてビルドを諦めたんだったかな?
Avatar
「Swift 5.3はビルドが遅い」というのは撤回します。
Avatar
5.3が遅いのではなくOSS Toolchainが遅いのかも。macOSでも、Xcode添付版に比べてOSS Toolchainはビルドが遅い。
Avatar
Kishikawa Katsumi 10/6/2020 12:15 AM
メモリとマシンパワーがあればDockerビルドでも十分な速さっぽいですけどね。
Avatar
swift-atomicsをswift build --build-testsすると、Xcode 12.01.1版は2分14秒、swift-5.3 OSS ToolchainのmacOS版は8分43秒かかった。 (edited)
Avatar
Kishikawa Katsumi 10/6/2020 12:18 AM
4倍遅いんすね。
Avatar
Xcode 11.7版は2分6秒、swift-5.2.5 OSS ToolchainのmacOS版は6分51秒だった。 (edited)
Avatar
OSS版はアサーション付いてたりするんですかね
Avatar
実行ファイルサイズはOSS版がかなり大きい。 $ du -m $(DEVELOPER_DIR=/Applications/Xcode_11.7.app xcrun --find swift) $(xcrun --toolchain org.swift.525202008051a --find swift) $(xcrun --find swift) $(xcrun --toolchain org.swift.530202009161a --find swift) 39 /Applications/Xcode_11.7.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 162 /Library/Developer/Toolchains/swift-5.2.5-RELEASE.xctoolchain/usr/bin/swift 97 /Applications/Xcode_12.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 179 /Library/Developer/Toolchains/swift-5.3-RELEASE.xctoolchain/usr/bin/swift (edited)
Avatar
--preset="buildbot_osx_package"だからアサーションついてるぽい。 https://ci.swift.org/view/Swift%205.3/job/oss-swift-5.3-package-osx/ [preset: buildbot_osx_package] mixin-preset= mixin_osx_package_base mixin_osx_package_test mixin_lightweight_assertions,no-stdlib-asserts … # A mixin that enables 'lightweight' assertions that don't slow down the # compiler significantly. [preset: mixin_lightweight_assertions] assertions https://github.com/apple/swift/blob/main/utils/build-presets.ini#L1306-L1310
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
12:50 AM
ubuntu版も同様にmixin_lightweight_assertionsが使われてる。 (edited)
12:55 AM
mixin_lightweight_assertionsのコメント、4倍遅いのはsignificantlyではないということなのか…
# A mixin that enables 'lightweight' assertions that don't slow down the # compiler significantly.
Avatar
SwiftWasmのツールチェーンもこの間アサーション切ったら2倍くらいstdlibが速くなったのでもしやと思ったらビンゴだった 😯 https://github.com/swiftwasm/JavaScriptKit/pull/91#issuecomment-703029881
Need toolchain including swiftwasm/llvm-project@20c933e Resolve #6
Avatar
norio_nomura 10/6/2020 1:59 AM
OSS版でswift-atomicsのビルドが4倍遅いのはエッジケースですね。SwiftLintとかはXcode版のビルド時間がswift-atomicsとそれほど変わらないけど、OSS版は1.5倍未満のビルド時間に収まってる。
Avatar
Kishikawa Katsumi 10/6/2020 2:41 AM
VaporのLeafというテンプレートエンジンはJSが壊れるような気がするけど気のせいかな。 ドキュメントが古いものしかなくてよくわからない。
Avatar
omochimetaru 10/6/2020 2:42 AM
テキスト処理なんで特にJSが壊れるとかはない気がする
Avatar
テンプレート内にJS書いてますけど特に壊れるとかはないですね。 id指定のところの#がエスケープ要るくらい
Avatar
Kishikawa Katsumi 10/6/2020 2:43 AM
index.htmlをindex.leafにしただけで動かなくなったんですよね。
Avatar
3のころはブレースで色々埋め込んでたんでJSと相性悪かった記憶ありますが4ではブレース不要になったので特に問題を感じていません。
2:44 AM
動かなくなったってエラーですか?
Avatar
Kishikawa Katsumi 10/6/2020 2:44 AM
もうちょっとちゃんと調べてみます。
2:47 AM
Leafにしただけで Uncaught TypeError: Cannot read property 'getChildren' of undefined JSがTypeErrorになったのでLeafがなんかおかしいのかな、、と思ったのですが、、、
2:49 AM
ちょっとデバッグしてみたのですが、よくわからないですね。ソースを壊しているということはなさそう。
2:49 AM
JSもある程度までは動いている。
Avatar
4で自分が問題あったこととしては、ID指定する#がleafでも使われるのでエスケープが必要なことくらいですかね。 (edited)
Avatar
Kishikawa Katsumi 10/6/2020 2:53 AM
どっちにエスケープが必要なんですか?テンプレート(index.leaf)の方ですか?
Avatar
どっちにというと?jsのソースは別れてるんでしょうか。
Avatar
Kishikawa Katsumi 10/6/2020 2:54 AM
Index.leafに書かれています。 <script></script>タグで。
Avatar
index.leafの中にdocument.querySelector("#some-id") とかがあるなら、この#に\を付ける必要があります。
Avatar
Kishikawa Katsumi 10/6/2020 2:55 AM
えー、、、
Avatar
omochimetaru 10/6/2020 2:55 AM
Avatar
Kishikawa Katsumi 10/6/2020 2:55 AM
$('#loading') のがいっぱいあるんですけど、それにエスケープをしていく必要があるんですね。。。
Avatar
そうですね。残念ながら。
Avatar
Kishikawa Katsumi 10/6/2020 2:55 AM
えー、それはテンプレート文字列を#(title)にした設計の問題じゃないの。。。
Avatar
omochimetaru 10/6/2020 2:56 AM
ファイルを分離して <script src> にするのが楽そう。
Avatar
Kishikawa Katsumi 10/6/2020 2:56 AM
それで解決するかなあ。#idっていうのは普通にいくらでも出てくるし。。。
2:56 AM
とりあえずやってみます。
2:58 AM
#idじゃないですけどカラーコード #FAFAFA はそのままでOKですか?
Avatar
カラーコード埋めたことはないですが#始まりのは全部エスケープ要ると思います……カスタムタグとかあるので
Avatar
omochimetaru 10/6/2020 2:59 AM
CSSファイルを分離して class="..." にしてカラーコードはHTMLに埋め込まないのが楽そう・・・w
Avatar
もしくはrgb(r, g, b)
Avatar
Kishikawa Katsumi 10/6/2020 3:00 AM
<li class="nav-item" style="width: 140px;"> <a href="#tab1" class="nav-link py-1 active" data-toggle="tab"> <h6 style="font-size: large;"><i class="far fa-folder-tree"></i> Structure</h6> </a> </li> <li class="nav-item" style="width: 140px;"> <a href="#tab2" class="nav-link py-1" data-toggle="tab"> <h6 style="font-size: large;"><i class="fal fa-file-code"></i> Syntax</h6> </a> </li> ^ Bootstrapでこういうタブを作る指定があるんですけどこれもダメでしたね。
Avatar
omochimetaru 10/6/2020 3:00 AM
URL fragmentか。
3:00 AM
それはファイル分離できないな。
Avatar
Kishikawa Katsumi 10/6/2020 3:00 AM
#tab1 のところ。leaf作った人なんで#(title)を選んじゃったの。
😢 1
Avatar
こうなるとSSRするよりもクライアントサイドでバインドしたほうが楽そう…
Avatar
omochimetaru 10/6/2020 3:01 AM
Leaf3のときにテンプレート変数と別テンプレートのincludeに関してスコープが無いのがヤバいと思ったけど
3:02 AM
Leaf4も同じ?
Avatar
今は埋め込みの際にexport/importで指定できますけど、スコープはどうだろう。調べてないです。
Avatar
omochimetaru 10/6/2020 3:03 AM
ふむ
3:04 AM
サーバーサイドで適当に Swift の """ 文字列で書いたほうが楽そう。
Avatar
たしかに
Avatar
omochimetaru 10/6/2020 3:04 AM
\( ) で変数埋め込みすればほぼ衝突しないだろうし、
Avatar
Kishikawa Katsumi 10/6/2020 3:04 AM
動いたと思う。とにかく全部の#\#に変える必要がある。 (edited)
Avatar
omochimetaru 10/6/2020 3:05 AM
関数定義したら部品化もできる。
3:05 AM
あ、分岐とか繰り返しができないから FunctionBuilder 書いたほうが良いかもな。
3:05 AM
とにかく全部の#を#に変える必要がある。
その工程に取り漏らしのミスが無いことを機械的に保証できないんでかなりきつそうです。
Avatar
Kishikawa Katsumi 10/6/2020 3:06 AM
漏れたら中途半端に動くからねえ。
Avatar
JSなら動かなくてわかりますけど色とかは気付きにくいかもですね。
Avatar
Kishikawa Katsumi 10/6/2020 3:07 AM
まあJSだけ、じゃなくて全部の#\#だからまだマシ (edited)
3:07 AM
ちなみにHTMLやCSSをSwift側で書くのはしんどいと思う。ホットリロードとかあったらいいけど。
Avatar
omochimetaru 10/6/2020 3:08 AM
ああ、たしかに。そこは面倒かも。
Avatar
Kishikawa Katsumi 10/6/2020 3:19 AM
VaporはRoutingをRegexで書くのは無理ですか? app.get(/^\/([a-f0-9]{32})$/i, async (req, res) => { ^ Node.jsでいうこういうのを書きたいのですが、ちょっと調べた限り無理そう。
Avatar
omochimetaru 10/6/2020 3:20 AM
Vapor 4's documentation (web framework for Swift).
3:20 AM
パラメータがただのプレースホルダしかないからできなそう。
🥲 1
Avatar
Kishikawa Katsumi 10/6/2020 3:35 AM
Vaporはまだまだパッチを送る余地がありそうだ。 (edited)
Avatar
Kishikawa Katsumi 10/6/2020 5:13 AM
Swiftでテンプレートが書けるとパフォーマンスも良さそうというのはある。 軽量なプレビューがあったらいけるかも。
5:13 AM
別プロセスかなんかで動いてホットリロード的なことができたり。
Avatar
omochimetaru 10/6/2020 6:11 AM
ビルドしたバイナリから型情報を洗い出して
6:11 AM
テンプレート型を抽出して、依存してる値をなんとか埋めて・・・
6:11 AM
SwiftUI Preview みたいに Preview用の型とか関数を書くぐらいはやってもいいか。
Avatar
期待
Avatar
omochimetaru 10/6/2020 6:26 AM
いや、僕はやらないですよ、Leaf見捨ててるんで
Avatar
www
Avatar
omochimetaru 10/6/2020 6:26 AM
Vaporは支持してるけどLeafだけは要らない
Avatar
Kishikawa Katsumi 10/6/2020 6:27 AM
いやSwiftでテンプレートを書くってことはLeafは当然使わないでしょ。
Avatar
omochimetaru 10/6/2020 6:27 AM
あ、そっちの話か
Avatar
Kishikawa Katsumi 10/6/2020 6:28 AM
テキストで取り込んで置換して、ってパフォーマンスも上がらないと思うんですよね。
Avatar
omochimetaru 10/6/2020 6:28 AM
ごっちゃになってた。
Avatar
Kishikawa Katsumi 10/6/2020 6:28 AM
Leafってさらにループとか書けるんでしょ。最初からSwiftになってるならそれがベスト。 (edited)
Avatar
omochimetaru 10/6/2020 6:28 AM
ですね。>ループとか
Avatar
erbとrubyみたいにホスト言語とテンプレート内で使える言語が一致していると嬉しい
Avatar
Kishikawa Katsumi 10/6/2020 6:34 AM
そんな感じ。
Avatar
ただResult BuilderみたいなDSLで書くとHTMLとしての可搬性が無くなる。。。
Avatar
omochimetaru 10/6/2020 6:36 AM
レンダリングすればHTMLになるよ
6:37 AM
どうせ制御部分には可搬性がないのだから。
Avatar
HTMLスニペットを適当なところからコピペするときコンバータが必要じゃないですか
Avatar
omochimetaru 10/6/2020 6:37 AM
HTML→テンプレートのところは機械変換できる
6:37 AM
コンバータあれば良い
6:38 AM
admin-lteってやつ使ったんだけど
6:38 AM
JSXでほんのちょっと違ってコピペするとぶっ壊れて
Avatar
コンバータがあれば良い理論だとJSX必要なくないですか?
Avatar
omochimetaru 10/6/2020 6:38 AM
はい
6:38 AM
JSX意味ないと思います
6:38 AM
どうせコピペできないんだもん
Avatar
あれ、そうなんだ
6:38 AM
classNameとかか
Avatar
omochimetaru 10/6/2020 6:38 AM
classclassName とか
6:38 AM
forがhtmlForとか
6:39 AM
HTMLでは通った <input> が <input /> じゃないとだめとか
6:39 AM
styleも文字列じゃなくてオブジェクトだし・・・
6:39 AM
ちまちまいろいろとあるんすよ。結局全行に手入れした。
6:39 AM
だから HTML → JSX も機械処理すべきだなという考えになり
6:39 AM
それならJSXじゃなくていいやと今思ってる
Avatar
ふむーなるほど
Avatar
Kishikawa Katsumi 10/6/2020 6:40 AM
JSXは開発環境も込みで用意されてるんじゃないんですか?
Avatar
omochimetaru 10/6/2020 6:40 AM
あるのかな?僕が見落とした可能性はありますね。
Avatar
Kishikawa Katsumi 10/6/2020 6:41 AM
私もよく知らない。。。
Avatar
omochimetaru 10/6/2020 6:41 AM
vscodeがtsxを認識してくれる以上のツーリングはやってないです。
Avatar
Kishikawa Katsumi 10/6/2020 6:41 AM
JSX作るくらいならそこまでやりそう、、、みたいな。
6:41 AM
あった
Avatar
omochimetaru 10/6/2020 6:41 AM
お、続きはこれ使お。 (edited)
6:42 AM
ああ、そうそう、コメント文もだめなんよな
Avatar
これならHTML to ReactElementにしてくれても。。。
Avatar
omochimetaru 10/6/2020 6:43 AM
JSXは、見た目がHTMLっぽいからとっつきやすいとかはありそう。
6:43 AM
でも僕はHTMLの方に軸足無いから
6:43 AM
別にいいんだよね。
6:44 AM
閉じタグとかいらんと思うし・・・
Avatar
見た目を優先した結果TypeScriptで使うためにJSXとはまた別のTSXが必要になっている
Avatar
Kishikawa Katsumi 10/6/2020 6:46 AM
app.get("*") { req -> EventLoopFuture<EventLoopFuture<View>> in let pattern = try! NSRegularExpression(pattern: #"^\/([a-f0-9]{32})$"#, options: [.caseInsensitive]) let matches = pattern.matches(in: req.url.path, options: [], range: NSRange(location: 0, length: NSString(string: req.url.path).length)) guard matches.count == 1 && matches[0].numberOfRanges == 2 else { throw Abort(.notFound) } let gistId = NSString(string: req.url.path).substring(with: matches[0].range(at: 1)) let promise = req.eventLoop.makePromise(of: EventLoopFuture<View>.self) let session = URLSession(configuration: .default) let request = URLRequest(url: URL(string: "https://api.github.com/gists/\(gistId)")!) session.dataTask(with: request) { (data, response, error) in if let error = error { promise.fail(error) return } guard let data = data else { promise.fail(Abort(.notFound)) return } guard let contents = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], let files = contents["files"] as? [String: Any], let filename = files.keys.first, let file = files[filename] as? [String: Any], let content = file["content"] as? String else { promise.fail(Abort(.notFound)) return } promise.succeed( req.view.render( "index", [ "title": "Swift AST Explorer", "defaultSampleCode": content, "swiftVersion": swiftVersion, ] ) ) } .resume() return promise.futureResult } VaporでAsyncでビューを返すのってこれであってます?動いてるんですけど EventLoopFuture<EventLoopFuture<View>> となってるところがホントに合ってるのかな?と。
Avatar
omochimetaru 10/6/2020 6:46 AM
EventLoopFuture<View> じゃないですかね?コンパイル通りますか?
6:48 AM
// ここをこうして let promise = req.eventLoop.makePromise(of: View.self) // ここをこう req.view.render( "index", [ "title": "Swift AST Explorer", "defaultSampleCode": content, "swiftVersion": swiftVersion, ] ).cascase(to: promise) (edited)
Avatar
Kishikawa Katsumi 10/6/2020 6:49 AM
promise.succeed() <= ここにViewを渡せないなと思ってたんですけど、 .cascase(to: promise) っていうのがあるんですね!
Avatar
omochimetaru 10/6/2020 6:50 AM
はい、なんかそういう風に困ってるのかなとコードから推測しました。
Avatar
Kishikawa Katsumi 10/6/2020 6:51 AM
バッチリでした。ありがとうございます😄
👍 1
6:51 AM
Promise.completeWith(Future) ともかけるし
6:51 AM
Future.always { result in Promise.completeWith(result) }
6:51 AM
ともかけますが、ここはcascadeが一番オシャレかな。
Avatar
Kishikawa Katsumi 10/6/2020 6:55 AM
なるほど。Promiseをちゃんと勉強しないとわからんな。
Avatar
omochimetaru 10/6/2020 6:56 AM
PromiseはMutableFuture的なものですね
6:56 AM
readonly Promise が Future とも言える。
Avatar
Kishikawa Katsumi 10/6/2020 7:11 AM
Vaporに関してはEventLoopFutureのAPIを一通り眺めたらいけそう。 VaprotはちょっとGetting Started以降のドキュメントが少ないよね。
Avatar
Leafなんか4のドキュメント無いですからね。 やりたいことあったらテストコード読んでできないか確認したりしてます。
Avatar
Kishikawa Katsumi 10/6/2020 7:18 AM
Leafないよね。READMEにも何も書いてないし。
7:18 AM
Vapor勉強会必要だわ
Avatar
昔一回行きましたけど結局その後無いのかな?
Avatar
Kishikawa Katsumi 10/6/2020 7:20 AM
Vapor Meetupってのがあったのかな
7:20 AM
URLSessionってLinuxにはないんでしたっけ?
7:21 AM
そういえばなかった気がする。
7:21 AM
Curlとか呼ばないとあかんのか。
Avatar
import FoundationNetworkingすると使えませんでしたっけ? (edited)
Avatar
Kishikawa Katsumi 10/6/2020 7:21 AM
あ、FoundationNetworkingってそれが入ってるのか。
Avatar
vaporからHTTP叩くだけなら request.client がありますよ。
Avatar
Kishikawa Katsumi 10/6/2020 7:22 AM
おお、ありがとうございます。
7:24 AM
/build/Sources/App/routes.swift:31:23: error: 'URLSession' is unavailable: This type has moved to the FoundationNetworking module. Import that module to use it. let session = URLSession(configuration: .default) ^~~~~~~~~~ Foundation.URLSession:2:18: note: 'URLSession' has been explicitly marked unavailable here public typealias URLSession = AnyObject 確かにFoundationNetworkingに移ったって書いてありましたわ。
Avatar
Kishikawa Katsumi 10/6/2020 7:37 AM
Vaporでカスタムの404ページを返したい、場合はミドルウェアを使うのでしょうか?
7:37 AM
標準でサポートされてない?
Avatar
omochimetaru 10/6/2020 7:39 AM
たぶん。
7:39 AM
Avatar
Kishikawa Katsumi 10/6/2020 7:40 AM
うーむ。Statusコードをセットしつつ、view.renderできたらいいのに。。。
Avatar
omochimetaru 10/6/2020 7:41 AM
return Response( status: .ok, headers: ["Content-Type": "text/html; charset=UTF-8"], body: Response.Body(string: html) )
7:41 AM
View 型だとどうなってるんだろうな。
7:42 AM
public struct View: ResponseEncodable { public var data: ByteBuffer public init(data: ByteBuffer) { self.data = data } public func encodeResponse(for request: Request) -> EventLoopFuture<Response> { let response = Response() response.headers.contentType = .html response.body = .init(buffer: self.data) return request.eventLoop.makeSucceededFuture(response) } }
7:43 AM
うーむ。できなさそう。
7:43 AM
一度 view.encodeResponseしてから、 Response型の statusプロパティだけ書き換えるとかになりますね。
7:44 AM
return view.encodeResponse(for: request).map { (response) in var response = response response.status = .notFound return response }
Avatar
Kishikawa Katsumi 10/6/2020 7:45 AM
なるほど。そういうことができるんですね。viewをレスポンスオブジェクトにして、ステータスコードを書き換える。
Avatar
omochimetaru 10/6/2020 7:46 AM
@discardableResult public func get<Response>( _ path: PathComponent..., use closure: @escaping (Request) throws -> Response ) -> Route where Response: ResponseEncodable { return self.on(.GET, path, use: closure) }
7:47 AM
routesの登録はジェネリックになってて、 ResponseEncodable な値を返す関数ならなんでもいいんですよね。
7:47 AM
String とかView が ResponseEncodable ですけど、 Response型に erase してしまうと一番自由度が高い。
7:48 AM
(このコードの Response は型パラメータ名だけど、 同じ名前の Response 型 もある )
Avatar
Kishikawa Katsumi 10/6/2020 7:49 AM
今の問題を解決したらやってみます。(まだちゃんと動いてないけどエラーが生のJSONで返ってくるのがめっちゃ気になっていた)
Avatar
omochimetaru 10/6/2020 7:50 AM
ああ。なりますね。さっきのところに書いてある、デフォルトで仕込まれてるErrorMiddlewareさんがその変換をしている。
7:50 AM
ErrorMiddleware is the only middleware added to your application by default. This middleware converts Swift errors that have been thrown or returned by your route handlers into HTTP responses. Without this middleware, errors thrown will result in the connection being closed without a response.
Avatar
Kishikawa Katsumi 10/6/2020 7:51 AM
他のエラーのことも考えるとミドルウェアを挟んだ方がいいのかな?
7:52 AM
といっても404と500だけ、になると思うけど。
Avatar
omochimetaru 10/6/2020 7:52 AM
他のエラーってどういうのですか?
7:53 AM
カスタムしたいなら自前のミドルウェアに置き換えるのが良いとは思います。
7:54 AM
ただ、ページの中で生じるエラー、例えば、「メールアドレスが入力されていません」とかは
7:54 AM
そのページ内のロジックとして扱う必要があるので
7:54 AM
この手の例外で吹っ飛んで落ちるレベルのエラーとは別ですよね。
7:55 AM
個人的にはこのレベルのエラーは既に正常系じゃないのでなんでもいいんじゃないかと思いますけど、
7:55 AM
なんかウェブサービスって洒落た404ページ出すとかよくありますね。
Avatar
Kishikawa Katsumi 10/6/2020 7:56 AM
404と500っす。
Avatar
omochimetaru 10/6/2020 7:56 AM
URL間違えてて404はよく出るか。
Avatar
Kishikawa Katsumi 10/6/2020 7:56 AM
とりあえずこの2つについてちゃんとした見た目のViewを出したい。
Avatar
omochimetaru 10/6/2020 7:56 AM
それならmiddleware作るですね
Avatar
Kishikawa Katsumi 10/6/2020 7:57 AM
で、404返しつつ、静的なHTMLを返すっていうのが簡単なんですけど、
7:57 AM
やっぱりミドルウェアですかね。
Avatar
omochimetaru 10/6/2020 7:57 AM
struct CSRFProtection { struct Key: StorageKey { typealias Value = CSRFProtection } struct Post: Decodable { var csrfToken: UUID? } let sessionKey = "csrfToken" struct Middleware: Vapor.Middleware { func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture<Response> { let eventLoop = request.eventLoop guard request.method == .POST else { return next.respond(to: request) } let verify = eventLoop.future { try request.verifyCSRFToken() } return verify.flatMap { () in next.respond(to: request) } } } var middleware: Middleware { Middleware() } }
7:58 AM
結構簡単ですよ。 respond (to:, chainingTo) メソッドを実装するだけなので。
7:58 AM
↑は自作のCSRF脆弱性対策くん
Avatar
Kishikawa Katsumi 10/6/2020 7:58 AM
なるほど。Expressと同じ感じだ。
7:58 AM
助かります。
Avatar
omochimetaru 10/6/2020 7:59 AM
あ、このコードの場合は、事前検査してエラー投げてるだけだから前処理ですけど
7:59 AM
今の話の場合はエラーを変換するから後続処理になるので
8:00 AM
next.respond(to: request).flatMapError{ (error) in ... switch error { // errorの型をがんばって404と500を振り分ける case ... } (edited)
8:00 AM
って感じのコードになりますね。
Avatar
Kishikawa Katsumi 10/6/2020 8:02 AM
うーむ、そこで振り分けるのできるかな。
8:03 AM
そもそも http://localhost:8080/b4f866efb1c1dc63b0a9cce000cf5688 こういうPathを受けるために /* で受けてると難しい気がするな。
Avatar
omochimetaru 10/6/2020 8:03 AM
マッチしなかった時に特定のエラーを投げておけば、ミドルウェアでそれを捕まえられる。
Avatar
Kishikawa Katsumi 10/6/2020 8:05 AM
App側はAbort(.notFound)かAbort(.internalServerError)しておけばいい?
Avatar
omochimetaru 10/6/2020 8:06 AM
notFoundは404にして
8:06 AM
ほかの例外は全部500でも良さそう。
8:06 AM
デフォルトだとroutesが無かったら↓が飛んでるらしい struct RouteNotFound: Error { } extension RouteNotFound: AbortError { static var typeIdentifier: String { "Abort" } var status: HTTPResponseStatus { .notFound } }
8:08 AM
AbortErrorはprotocolになっててstatusをもってるから
8:09 AM
例外をAbortErrorにキャストしてstatusを調べて404かその他か決められそう。
Avatar
Kishikawa Katsumi 10/6/2020 8:09 AM
どうもどうも。 とりあえず正常系は動きました。 https://swift-ast-explorer.com/ ミドルウェアやってみます。
Swift AST Explorer - AST visualizer for Swift source code
8:10 AM
^ ピュアSwiftのWebサービスになりました。
Avatar
omochimetaru 10/6/2020 8:10 AM
おおw
Avatar
Kishikawa Katsumi 10/6/2020 8:11 AM
macOSとLinuxの微妙な違い、は開発が進んでくるとつまずかなくなるのかな? ずっとDockerで開発すれば起こらないけどそれは結構しんどいしな。
Avatar
omochimetaru 10/6/2020 8:13 AM
僕はまだmacでずっとやっててなんとも。(まだ開発初期なのでLinuxに展開してない) @t.ae どうすかね (edited)
Avatar
困ったことはあんまりないですね。
8:16 AM
Vaporじゃないですけど、macとlinuxでdependencyが違うパッケージがあったりして、毎回dirtyになるのがちょっと気になるくらい?
Avatar
omochimetaru 10/6/2020 8:16 AM
毎回dirtyになる
これはbuild directoryをmountしてるからだよね
Avatar
そうですね。純粋にdocker内でやる場合は外からは見えないので問題ない?
Avatar
Kishikawa Katsumi 10/6/2020 7:31 PM
final class ErrorMiddleware: Middleware { func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture<Response> { return next.respond(to: request).flatMapError { (error) in let headers: HTTPHeaders let status: HTTPResponseStatus let reason: String let title: String switch error { case let abort as AbortError: headers = abort.headers status = abort.status title = "Not Found" reason = status == .notFound ? "Sorry, an error has occured, Requested page not found!" : abort.reason default: headers = [:] status = .internalServerError title = "Internal Server Error" reason = "Something went wrong." } return request.view.render("error", [ "title": title, "status": "\(status.code)", "reason": reason, ]) .encodeResponse(status: status, headers: headers, for: request) } } } ミドルウェアはとりあえずこんな感じにしました。
7:32 PM
error.leaf っていうテンプレートがあって、タイトルとかが変わります。
7:33 PM
だんだんわかってきた。Vaporと結構格闘したからある程度スイスイかけるようになった、、、かもしれない。 (edited)
Avatar
omochimetaru 10/6/2020 7:36 PM
よさそう
Avatar
Kishikawa Katsumi 10/6/2020 7:37 PM
もうちょっとシンプルになりそうだけど
Avatar
omochimetaru 10/6/2020 7:37 PM
AbortErrorならステータスコードはそのまま通してそれ以外の例外は500ってことですね
Avatar
Kishikawa Katsumi 10/6/2020 7:38 PM
今のところ404以外出してないんですけど、なんとなくその方がいいかなって
7:38 PM
401とか増えるかも、、、しれない
Avatar
omochimetaru 10/6/2020 7:38 PM
encodeResponseメソッドに直接status渡せるのか。
Avatar
Kishikawa Katsumi 10/6/2020 7:39 PM
これはなんかencodeResponseの戻り値が合わない〜って悩んでたときに発見しました。
Avatar
omochimetaru 10/6/2020 7:39 PM
なるほど。
Avatar
Kishikawa Katsumi 10/6/2020 7:39 PM
Server Side Swift楽しいっすね。
Avatar
omochimetaru 10/6/2020 7:39 PM
7:40 PM
良いですよね どのへんが楽しいですか
Avatar
Kishikawa Katsumi 10/6/2020 7:40 PM
Swiftで書けるところだなあ。
Avatar
omochimetaru 10/6/2020 7:40 PM
それはそう
Avatar
Kishikawa Katsumi 10/6/2020 7:41 PM
Node.jsとTypeScriptでいいやん、と言ってたけど、あれは嘘だ
Avatar
omochimetaru 10/6/2020 7:41 PM
言語のせいで引っかかるところが少ない
7:41 PM
嘘wだいぶ来ましたね
Avatar
Kishikawa Katsumi 10/6/2020 7:42 PM
Node.jsとかライブラリの先を見に行く気にあんまならないし、
Avatar
omochimetaru 10/6/2020 7:42 PM
それはありますね、xcodeでポンポン潜ってコード読んでわかれる
Avatar
Kishikawa Katsumi 10/6/2020 7:42 PM
まあなんか組み合わせで書けるんだけど、ものができた以上の楽しさは少ないかな。
Avatar
omochimetaru 10/6/2020 7:43 PM
型かなぁ
7:44 PM
型がないと読んでても不安になる 逆にTypeScriptは型が複雑なことしすぎて厳しい
7:44 PM
Swiftの型はちょうどいい。めっちゃ主観的な意見だけど、、
Avatar
Kishikawa Katsumi 10/6/2020 7:45 PM
ちょうどいいってのはありますね。
7:47 PM
あとはHTMLの部分がもうちょっといい感じになれば。
7:48 PM
最終的にはSwiftで書けるのはいいと思うけど、 過渡期の間はJSXとかEJBとか既存のものが扱えるといいじゃないかな。
7:49 PM
普通のHTMLで扱える、でもいいけど。
Avatar
omochimetaru 10/6/2020 7:49 PM
ふむ
Avatar
Kishikawa Katsumi 10/6/2020 7:50 PM
Leafは#の問題を除いても、独自の拡張子で既存のフォーマッタとかハイライトとかそのままだと動かないし。
Avatar
omochimetaru 10/6/2020 7:50 PM
たしかに、既存のものに寄せるとツールとかが使えたりしますね
Avatar
Kishikawa Katsumi 10/6/2020 7:51 PM
HTMLとかJSはVS Codeみたいなのがないと書けない。
Avatar
<html><body>hello world</body></html>
8:04 PM
かけた!
8:05 PM
Scalaでサーバーサイド書いてる身としては
8:06 PM
相当分厚いjvmの資産とかを考えると
8:06 PM
なかなか新しいものを実用するは怖い気持ちがある
Avatar
Kishikawa Katsumi 10/6/2020 8:20 PM
実用できるのはいつになりますかねえ。もっと使う人が増えてパッと検索すると情報が出てくるようにならないと。。。
Avatar
時間かかるんだろうなという印象。あとはメジャーでトラフィックの多いサービスが使ってコントリビュートするとかがないと。
8:23 PM
こういうのって運用が関わってくるから、知見の蓄積がないとダメで
8:23 PM
jvmの世界はもうそれは枯れまくってるのでなかなか容易い
Avatar
omochimetaru 10/8/2020 6:36 AM
static var updateDatePropertyKeyPath: KeyPath<PasswordResetModel, TimestampProperty<PasswordResetModel, DefaultTimestampFormat>> { \.$updateDate }
6:36 AM
Modelを抽象化したら派手なのが出てきた
Avatar
型がゴツい (edited)
Avatar
Kishikawa Katsumi 10/8/2020 5:33 PM
大きめのデータを受け取りたい、場合は app.post("update") { req -> EventLoopFuture<SyntaxResponse> inapp.on(.POST, "update", body: .collect(maxSize: "10mb")) { req -> EventLoopFuture<SyntaxResponse> in でいいのかな。 そうするとルーティングは全部 app.on(.POST 形式に合わせた方が見やすいかな。
5:34 PM
そうでもないな。
Avatar
omochimetaru 10/8/2020 5:35 PM
ちょうどその辺今日見てた
5:36 PM
容量をでかくするならそれでもいいし
5:36 PM
public final class Routes: RoutesBuilder, CustomStringConvertible { public var all: [Route] /// Default value used by `HTTPBodyStreamStrategy.collect` when `maxSize` is `nil`. public var defaultMaxBodySize: ByteCount /// Default routing behavior of `DefaultResponder` is case-sensitive; configure to `true` prior to /// Application start handle `Constant` `PathComponents` in a case-insensitive manner. public var caseInsensitive: Bool public var description: String { return self.all.description } public init() { self.all = [] self.defaultMaxBodySize = "16kb" self.caseInsensitive = false } public func add(_ route: Route) { self.all.append(route) } } extension Application: RoutesBuilder { public func add(_ route: Route) { self.routes.add(route) } }
5:36 PM
この defaultMaxBodySize が普段は入ってるんで
5:37 PM
あーでも微妙だな。
5:37 PM
一つのところだけでかくしたいならここは変えないほうがいいですね。
5:38 PM
ほうがいいというか都度評価だから駄目だ
5:38 PM
on(.POST, "update", body: .collect(maxSize: "10mb")) の一択っぽい
5:38 PM
メモリに載せたくないなら .stream にして、リクエストハンドラでチマチマ読み出すことはできます
5:39 PM
ただ制限突破したいだけなら collect(maxSize) ですね
Avatar
Kishikawa Katsumi 10/8/2020 5:40 PM
そっすね。だいたいエンドポイントで変わると思います。(今回は一個しかないけど) でまあだいたい多くても数十MBくらい一度に受けれたらいいことがほとんどだろうから、20〜30MBとかにしとけばだいたいいい感じなのかな。 (edited)
5:41 PM
デフォルトは16kbなのか。すぐオーバーするな。
Avatar
Kishikawa Katsumi 10/9/2020 7:02 AM
Leafの# にエスケープがいる仕様はリファクタリングの過程で別のファイル(〜.cssや〜.js)に分けると今度は戻さないといけないんだけど、忘れると静かに表示が壊れる。
7:03 AM
いちおうエスケープしなくても済むように検討しているみたいなIssueはどこかで読んだ。置き換え文字列を無難なものに変えた方がいいと思うけど。。。
Avatar
omochimetaru 10/9/2020 7:27 AM
つらそう
Avatar
Kishikawa Katsumi 10/9/2020 7:52 AM
普通にHTML・CSS・JSを使うぶんには起こらないことだからその可能性を忘れがち、なのがツラいところですねえ。
Avatar
Kishikawa Katsumi 10/9/2020 2:14 PM
絶賛開発中のインラインでJSやStyleをちょこちょこ書いて試す、みたいな間は普通にHTMLを書くほうがいいけど、コードベースが整然としてくるとHTML全部Swiftから生成したいな。 手でHTMLを書いてると静かに壊したりちょっとした書き方のブレが気になってくる。
2:15 PM
最初からSwiftで書いていくのはまあまあハードだと思うけど、だんだんHTMLを書くほうがしんどくなってくる。。と思う。
Avatar
サーバーサイドと wasm である程度共通の API を持つ @resultBuilder を使った HTML のテンプレートエンジン的なものがあれば使いやすかったりするでしょうか?目的が違うから微妙?でも API が似てたら両方を触りやすい気も。 (edited)
12:29 AM
div(id: "foos") { for foo in foos { img(src: "img/\(foo.id).png", alt: "foo") } }
12:30 AM
みたいな感じで。用意されてないものは最悪↓ tag("img", ["src": "img/foo.png", "alt": "foo"]) みたいに逃げられる。 (edited)
Avatar
ちょうどそれ作ろうと思ってます
Avatar
デファクト的なものが盛り上がって、 SSS も wasm も似た API で触れるといいよね。
Avatar
そうですね nextjsとかは
6:25 AM
reactをサーバーサイドで描画するし
6:25 AM
どちらも需要がある
Avatar
Kishikawa Katsumi 10/10/2020 6:54 AM
私も同様のものを作りたい気持ちが出てきてるんですけどまだデザインがピンときてないんですよね。 上記のようなHTMLに似たものをSwiftで書くっていうのは、ある種の問題を解決するとは思いますが、常用するのはハードルが高いかなと漠然と思っています。
6:55 AM
Swiftで書きたい、と言いましたがこれだったら直接HTMLを書いたほうが、っていうのを超えるのは難しそうなんですよね。
6:55 AM
UIKitやSwftUIみたいにかけるのがいいんじゃないかとこれも漠然と思っています
Avatar
iOSDC のときに少し @Yuta Saito にも話したんだけど、 Tokamak も需要はあると思うけど、 wasm では純粋に HTML に振ったライブラリも需要があるんじゃないかなと思うんよね。それが単純に DOM を作るだけなのか、 React / SwiftUI 的な仮想 DOM なのかは検討の余地があるとして(というか両方ほしい?)。
6:56 AM
@Kishikawa Katsumi HTML は型付けされてないから、静的型のサポートを受けながら HTML を @resultBuilder で書けたらうれしいこともありそうな?
Avatar
Kishikawa Katsumi 10/10/2020 6:57 AM
それはあると思います。が、全体をこれで書いていくのは常にHTMLが見えててツラそうな印象があります。
Avatar
一応既存のテンプレートエンジンをresultBuilderでやりたいというのであればVapor が HTMLKit というのを作ってはいますね (Vapor4で使うドキュメントがなかった気がするけど…) https://github.com/vapor-community/HTMLKit
A type-safe DSL that renders dynamic HTML templates in Swift - vapor-community/HTMLKit
👀 1
6:58 AM
って思ったけど普通にreadmeに書いてあった
Avatar
Kishikawa Katsumi 10/10/2020 6:58 AM
この辺に関しては私の主張はあまり一貫していないです。
Avatar
それに、結局 Swift のコードの中に書きたいという需要なので、そうすると HTML を書こうとするとエスケープとか色んな問題が生まれるから、 Swift の構文に則って書けたらうれしいように思います。
Avatar
Kishikawa Katsumi 10/10/2020 7:00 AM
HTML、CSSをどれくらい書けるか、にもよるのかも。私はあまり自由に書けないので、HTMLをカッチリ書けるというのはHTMLを直接書いたほうが、と思うことが多いです。
Avatar
使い方にもよりそうですね。 HTML 全体を書く場合わざわざ Swift で書かなくてもってのはありそうで、一方で React みたいにコンポーネントを組み上げていく形なら断片的だし @resultBuilder でいい気もします。
Avatar
Kishikawa Katsumi 10/10/2020 7:02 AM
JSXはめっちゃ良いと思っています。
7:03 AM
あそこまでHTMLにするか、UIViewを重ねる感じで書けるか、がいいのかなあ。
Avatar
Swift で HTML 全体を書くのは、ツール周りも整わないと辛そう。簡単にレンダリング結果を確認できるかとか考えただけでも。ポータビリティも、 Swift -> HTML はレンダリングしてしまえばできるけど、 HTML -> Swift が辛そう。
7:04 AM
JSX の代わりに @resultBuilder だと思うんですけどねぇ・・・。
Avatar
Kishikawa Katsumi 10/10/2020 7:06 AM
@resultBuilder でHTML書くのはけっこうツラそうな気がするんですよねえ。
Avatar
JSX も純粋な HTML じゃないし、パーツを書くだけだったら変わらなくないですか?
Avatar
Kishikawa Katsumi 10/10/2020 7:13 AM
はい、やってみたら案外いけるかも、となる可能性もけっこうあります😅
Avatar
Kishikawa Katsumi 10/11/2020 6:57 PM
今のLeafは文法がちょっと変わってループは #for(version in versions): <option value="#(version)">#(version)</option> #endfor こう書くみたいだな。 ドキュメント(1つ前のバージョンしかない)に載ってるのは <ul> #for(planet in planets) { <li>#(planet)</li> } </ul>
Avatar
Kishikawa Katsumi 10/11/2020 7:14 PM
いや、書き方が増えただけで前のも使えるのかな?どうもForとIfを組み合わせるときはネストした中カッコをエスケープする必要があるらしく前のが動かなかったのはそのせいかも。
Avatar
Kishikawa Katsumi 10/11/2020 7:27 PM
#if(version == stableVersion): <option value="#(version)" selected>#(version)</option> #else: <option value="#(version)">#(version)</option> #endif Ifもこんな感じっぽい。 https://forums.swift.org/t/pitch-new-leaf-body-syntax/18188
Pitch: New Leaf Body Syntax Leaf is a templating language built for Swift. This pitch proposes introducing a new syntax for declaring tag bodies that would simplify the parser and make using Leaf easier. Current Syntax Leaf has supported the following syntax for declaring tag...
Avatar
Kishikawa Katsumi 10/12/2020 4:02 AM
私はとにかく # を使うのをやめてほしいと思っているが。。。
Avatar
[]にしましょう
4:03 AM
ObjCを思い出せる
Avatar
ブレースによるやつはVapor3の文法で、今は使えないはずですね。
4:04 AM
[] もJSで使うから厳しそう…
Avatar
よさそうなのはぜんぶ使われてる...
Avatar
Kishikawa Katsumi 10/12/2020 4:26 AM
他のテンプレートエンジンはなんとかなってるから%とか$でいいと思うんですけどね。
Avatar
バックスラッシュはだめなんですっけ? jsの正規表現で使うバックスラッシュと組み合わさるとものすごいエスケープになりそうですが……
Avatar
2文字つかっていいなら幅が広がる
Avatar
$はjQueryで多用されるから拒否感ありそうな気が
Avatar
Kishikawa Katsumi 10/12/2020 4:27 AM
正規表現で使うのは普通のスラッシュだから行けるかな?
4:28 AM
あ、ドルはダメなんでしたか。
Avatar
バックスラッシュにマッチするのを書きたい場合 "\\\\\\\\" になりそう
Avatar
$はjsでidになれるから。
Avatar
%も演算子なのでそれエスケープはしたくないですねぇ・・・
Avatar
Kishikawa Katsumi 10/12/2020 4:28 AM
そもそもLeafはそんな凝ったコードは中にかけないっぽいんですよね。
Avatar
{{}} とか
Avatar
Kishikawa Katsumi 10/12/2020 4:29 AM
いや、書けるのか?
Avatar
中身は大したこと書けないですね。
Avatar
2文字系はわりといける感じ
Avatar
Kishikawa Katsumi 10/12/2020 4:29 AM
{{ なんか変数 }} はありですよね。
Avatar
上のPitchの話では{}の対応が壊れてても大丈夫なようにしたいとか書いてあったので {{}} もだめかも。
Avatar
Kishikawa Katsumi 10/12/2020 4:30 AM
書けないっすよね。私はちょっと書式の問題かコードの問題か切り分けられてないけど、どうも条件分岐も決まった感じにしか書けないっぽい。
Avatar
うーん
Avatar
一部の比較演算子とか ! が使えるくらいですね。 あとはカスタムタグで頑張るしかない。カスタムタグ使ったことないですが
Avatar
Kishikawa Katsumi 10/12/2020 4:31 AM
カスタムタグ!懐かしい感じになってきたぞ。
Avatar
https://docs.vapor.codes/3.0/leaf/custom-tags/ 4のドキュメント無いのが辛い
Avatar
Kishikawa Katsumi 10/12/2020 4:38 AM
"Hello #custom(name)" うーむ。思ってたのと違うなあ。
Avatar
Kishikawa Katsumi 10/12/2020 6:31 AM
カスタムルーター、みたいなのありますかねえ。 app.get("*") { req -> EventLoopFuture<View> in guard let pattern = try? NSRegularExpression(pattern: #"^\/([a-f0-9]{32})$"#, options: [.caseInsensitive]) else { throw Abort(.internalServerError) } ^ みたいな正規表現を使ったルーティング、増えてくると大変だから1つ1つ書きたい。
6:32 AM
app.get(#"^/([a-f0-9]{32})$"#) app.get(#"^/([A-Z2-7]{26})$"#) みたいに書きたいが。。。
Avatar
Kishikawa Katsumi 10/12/2020 9:20 AM
SwiftNIOはとても良いんじゃないか
Avatar
わかる
Avatar
Kishikawa Katsumi 10/12/2020 9:21 AM
Future Promiseが便利
Avatar
でもネットワークプログラミングのインターフェースとしてはなんかちょっと独特で難しいです
Avatar
Kishikawa Katsumi 10/12/2020 9:21 AM
そうなんすか
Avatar
swiftnioはnettyやってたひとたちが作ってるからnetty的な風合いがある気がする
6:34 AM
nettyはfinagleの足回りなので割と戦った記憶がある
Avatar
そうですね。 > It's like Netty, but written for Swift.
Avatar
Kishikawa Katsumi 10/13/2020 8:12 AM
Server Side SwiftでFirebaseを使うにはREST API経由になるのはちょっと面倒だな。
8:13 AM
gRPCでもいいかもしれないけど。とにかく標準のSDKはiOS/macOS用だから使えない。 (edited)
Avatar
あー、 Swift のサーバーサイド用 API がないんですね。 (edited)
Avatar
Kishikawa Katsumi 10/13/2020 8:20 AM
そうなんです。FirestoreはスキーマレスだからCodebleに対応させるのもちょっと面倒だったり
Avatar
iOS 用のを fork してサーバーサイドでも使えるようにするとかも、規模がでかすぎて大変そうですしね💦
8:22 AM
https://github.com/firebase/firebase-ios-sdk/blob/master/Package.swift ↑に Linux を加えて swift build したらどの辺りにエラーが出てくるでしょうね。
Firebase iOS SDK. Contribute to firebase/firebase-ios-sdk development by creating an account on GitHub.
Avatar
firebase-ios-sdkはObjective-Cで書かれてるんですよね。。。
8:24 AM
必要に応じて部分的にSwiftに移植する、が現実的ですかねぇ (edited)
Avatar
あ、これはガワを被せただけなのか・・・。
Avatar
Kishikawa Katsumi 10/13/2020 8:25 AM
Pythonの
Avatar
たしかに、そういえば FIR プレフィックス付きのが見え隠れしてました。
Avatar
Kishikawa Katsumi 10/13/2020 8:26 AM
SDKをブリッジするはどうだろう
Avatar
なるほど、それはありかもしれませんね。 Python 連携は比較的やりやすそうだし。
Avatar
全部同期的にやるならアリかも知れないですね
Avatar
Swift framework to interact with Python. Contribute to pvieito/PythonKit development by creating an account on GitHub.
8:28 AM
↑これ使う想定ですか?
Avatar
Kishikawa Katsumi 10/13/2020 8:28 AM
選択肢として、 REST API(gRPC?)を使う(リクエストとレスポンスのモデル定義が面倒だけど確実、簡単)、 iOS SDKを部分的に移植して使う 他言語のSDKをなんとかして使う
8:28 AM
か。 PythonKitは未知ですけど、そういうので意外と簡単にできないかな、、、みたいな。 (edited)
Avatar
PythonKit は Swift for TensorFlow 互換で Swift for TensorFlow チームと連携して作業してたはずなので、それなりに信頼できるかと思います。ちゃんと使ったことはないですが。
Avatar
PythonKitはクロージャの受け渡しみたいなことが単体だとできなかった気がするんですよね
Avatar
なるほど。それで「全部同期的にやるなら」なんですね。
Avatar
ですです
Avatar
Swift に async/await が来て、 Python の async/await と連携して、さらに Firebase SDK for Python が async/await に対応してて、違いがうまく吸収されるようになるという夢のような状況なら連携しやすそうですが、なかなか難しそうですね・・・。
8:33 AM
Firebase は基本非同期だからクロージャの受け渡しに難があると大変そうですね。
Avatar
async/awaitのFFIはアツいですね
Avatar
めっちゃ大変そうですが💧
8:34 AM
JavaScriptKit も直面するテーマですね😅
Avatar
そうなんですよね〜、、
8:35 AM
JavaScriptKitがNode.jsと連携して動くようになればNode.js向けのSDKと連携してうまいこといくようになるかな? (edited)
Avatar
意外と Promise に包むのと剥がすのだけでうまくいく?
8:37 AM
JS の async は JS の世界に閉じてるから、単に Promise を返す関数というだけだから、 JS で Promise を返す関数を await したときに、うまく剥がしてやれば良い?
8:38 AM
Swift から見たら JS の関数全部 async になっちゃうのか。
Avatar
JSPromiseにawaitメソッドを生やして、それがasyncになっていれば良いのかな https://github.com/swiftwasm/JavaScriptKit/blob/main/Sources/JavaScriptKit/BasicObjects/JSPromise.swift (edited)
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
Avatar
あー、そうやってマニュアルで解決する方法はありますね。
8:40 AM
throws はどうなってるんですっけ?
8:40 AM
let divElement = document.createElement!("div").object! この createElement とか try なしで呼べているのはなぜ??
Avatar
例外は今の所キャッチしてないですね
8:41 AM
全部throwsになっちゃうので…
8:41 AM
ユーザーが明示的にthrowableな関数であることをアノテートする、がいい感じですかね。 (edited)
Avatar
なるほど。
8:42 AM
同じ方針でいくとユーザーが明示的に async であることをアノテートする、になりますね。
Avatar
let divElement = document.createElement!.throwing("div").object!
8:42 AM
こんな感じですかね
8:43 AM
同じ要領でいくとasyncはこう? let result = fetch!.async("...")
Avatar
そんな感じになりそうですね。そうすると throwingthrows の方が対応がわかりやすそうだけど(英語としてどうかは別として)。
Avatar
ただ、JSは関数もオブジェクトで throwing フィールドがあるかも知れないんですよね
Avatar
throwingJSValue のメソッドではなく、 JS 側で持ってるってことですか?
8:46 AM
あ、シャドーしちゃうかもしれないってこと?
Avatar
シャドー
それです
Avatar
さっきからリポジトリを検索しても throwing が出てこないですが、どこに実装あるんでしょうか?
Avatar
throwingはさっき頭の中で考えた機能です 🤣
Avatar
なるほどw
8:51 AM
JSValue を受ける関数にするのはどうでしょうか? let foo = try jsTry(jsFoo)
8:51 AM
JSValue の中に throw されたエラーの情報を閉じ込めておいて。 (edited)
8:52 AM
やばい、ここ #server-side だった・・・。
Avatar
(firebaseから随分話が飛んでしまったw)
8:52 AM
続きは #wasm
Avatar
亀ですが、FirestoreにはCodableに対応したSwift Extensionがいます https://github.com/firebase/firebase-ios-sdk/tree/master/Firestore/Swift (edited)
Firebase iOS SDK. Contribute to firebase/firebase-ios-sdk development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 10/13/2020 7:47 PM
おお。なるほど https://github.com/firebase/firebase-ios-sdk/blob/master/Firestore/Swift/Source/Codable/DocumentSnapshot%2BReadDecodable.swift#L30 ^ このメソッドがうまいことシンプルなモデルにしてくれるやつかな? fields.キー.stringValue みたいな複雑なモデルいらなくなるんや。
Firebase iOS SDK. Contribute to firebase/firebase-ios-sdk development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 10/17/2020 4:49 PM
func suspendAsync<T>( ^ こういう文字列をLeafで置換すると func suspendAsync( みたいに <T> が消えるんだけどどういうことなの😡
Avatar
タグになってる・・・?
Avatar
Kishikawa Katsumi 10/17/2020 4:50 PM
そういう解釈でなんか消してると思うんですけど <T> こういう形になってない <> はOKだし何のためにやってるのかわからない。
4:51 PM
Vapor 2の頃は #raw() ってのが使えたらしいけどすでになく、カスタムタグを作るという方法があるらしいけど、よくわからなかった。カスタムタグを通しても消える。
4:51 PM
そのまま消さずに出す、みたいなデータ型がなかった。
4:52 PM
しょうがないからBase 64で渡したけどどうするのがいいんだろう。
4:55 PM
Base 64もJSのビルトインのBase 64はマルチバイト文字をマトモに扱えないから苦しい。
Avatar
プロジェクトをビルドするときにメモリ使用量が1Gを超える瞬間があるらしく、 AWS EC2 の t2.micro インスタンスではメモリ不足でクラッシュしてしまった
7:04 AM
t2.small にしたらビルドできた。
Avatar
swapおいてますか?デフォルトだと無いのでめちゃくちゃ重いですよ
Avatar
$ top で見てたら swiftプロセスが 900M ぐらいもっていく瞬間があるのは見えた
Avatar
t2.microのメモリ量も相まって
Avatar
そのまま使ってるからswap無いっぽい
7:06 AM
ただ t2 micro でもそもそもめっちゃ遅いから、スワップで生き延びても更に待ち時間伸びそうでヤバそう
Avatar
コードによりますけどクラッシュまでしたことはないですね。 応答しなくなってインスタンス再起動したことは何度かありますが……
Avatar
LLVM ERROR: out of memory って表示されてコンパイラのスタックトレースが出たよ
7:08 AM
この行のtypecheckがトドメを刺したらしい
7:09 AM
ただ中間データ構造もメモリに乗ってるだろうからこの行が重い影響がどの程度致命的だったのかはよくわからんが
Avatar
ところで @Kishikawa Katsumi func suspendAsync<T>( の埋め込み こちらではソースには<T> 出てました。
Avatar
ブラウザがタグとして隠しただけでLeafの出力には乗ってる?
Avatar
はい。
Avatar
Kishikawa Katsumi 10/19/2020 9:53 AM
む、Leafのせいではない?
9:55 AM
私はデプロイ先のインスタンスはだいたい非力なのでビルドは諦めてイメージをPullするだけにしました。 ビルドはGitHub ActionsとかCIでやります。
Avatar
なるほど。
Avatar
Kishikawa Katsumi 10/19/2020 9:57 AM
Nodeはそのままで全然OK、Rubyはswap追加でOK、Swiftは(Vapor)はどうやっても無理、でした。多少スペックを上げて見ましたが変わらなかった。ビルドするのはだいぶスペックが入りそうなのでどっちにしろ別に分けるしかなさそう。
9:58 AM
GCEの一番下のスペックで確認。たぶんAWSのmicroと似たようなもんだと思う。
9:59 AM
Vaporは月5000円くらいのプランでもダメだったから諦めました。
Avatar
t3.microで月1000円くらいでしたっけ 5000円で無理は何か別の問題がありそう……
Avatar
Kishikawa Katsumi 10/19/2020 10:07 AM
なるほど、もっかい調べてみるかな。あまり期待せずに試したから雑だったかも。
Avatar
Kishikawa Katsumi 10/21/2020 10:15 AM
Vaporは月5000円くらいのプランでもダメだったから諦めました。
これはウソでした。 月5000円だとvCPU x 2、メモリ 8 GBあるんでビルドは終わりました。
10:18 AM
ビルド時間はやはりかなりかかるけど。。。
10:19 AM
まあでもSwiftはメモリを積めば積むほどビルドが速いな。
Avatar
Kishikawa Katsumi 10/21/2020 2:28 PM
めちゃめちゃ時間かかるけど4GBメモリのマシン(=月3000円くらい)でもビルドは終わった。前は裏で別のイメージをビルドしてたりして止まったか、単に時間がかかってるだけのを止まったと勘違いしたっぽい。
Avatar
VaporのFluentの @Parent リレーションは、 self.$parent.id が non optional で self.parent.id が optional なのはうまいことできてて良いな。
9:44 AM
本当は型で頑張って self.parent.id も non optional になっててほしいけど
9:45 AM
ParentModel.id そのものが optional なのは レコードの新規作成を考えると正しい。
Avatar
Kishikawa Katsumi 10/22/2020 2:35 PM
@t.ae @omochimetaru 今度Server Side Swift
2:36 PM
@t.ae @omochimetaru にテーマを絞ってPodcastで話をしようと考えてるんですけど識者としてゲスト参加してくれませんか?
2:36 PM
予定は都合に合わせるので。
Avatar
良いですよ〜 podcast聞いたこともやったこともないけど・・・
Avatar
Kishikawa Katsumi 10/22/2020 2:37 PM
sonsonさんは素人、私はちょっと齧ってなかなか使えると思ってるけどツラいところも結構ある、みたいな立場で、いやそれは実際にはこう、みたいな感じで正してほしい。
Avatar
とりあえず10月いっぱいは忙しいので11月以降に相談したいです。
2:38 PM
なるほど
Avatar
Kishikawa Katsumi 10/22/2020 2:39 PM
了解です。じゃあまた11月に声をかけます。一番詳しいのは @t.aeさんだと思うのでぜひお願いしたいっす。
Avatar
そうですね > 一番詳しい
Avatar
Kishikawa Katsumi 10/22/2020 2:59 PM
Docker in Docker (Docker out of Docker)  でRootユーザじゃなくて実行するようにできた。 実行ユーザーをdockerグループに入れる、というのはそうなんだけどそれだけだとダメでホストと同じGIDを持つdockerグループ、に入れてやることでできた。 RUN groupadd docker -g ${HOST_DOCKER_GROUP_ID} && \ usermod -a -G docker vapor
3:00 PM
HOST_DOCKER_GROUP_ID はビルドするマシンは別だから一回SSHにログインして取る。
3:01 PM
TERM=xterm ssh -t -t -o 'StrictHostKeyChecking no' "${{ secrets.SSH_LOGIN_USER }}@${{ secrets.SSH_HOST }}" "grep "^docker:" /etc/group | sed -e 's/^[^:]\+:[^:]\+:\([^:]\+\):[^:]\+$/\1/g'" > gid REMOTE_DOCKER_GID=$(echo $(tail -n 1 gid) | sed -e 's/\r//g') CIの最初の方でこんな感じでとってる。 デプロイ先は getent も入ってないOSだからグループIDを取るだけなのに結構ややこしいことをしている。
Avatar
ほお〜
3:02 PM
なんかコンテナならではの仕組みですね
3:03 PM
Dockerの中のプロセスもホストマシンのプロセスだからGroupによる権限があればホストのDockerエンジンに触れるのか。
Avatar
Kishikawa Katsumi 10/22/2020 3:07 PM
DooD (Docker out of Docker)方式はホストのDocker Daemonと通信するソケットをコンテナに共有するんですよ volumes: - /var/run/docker.sock:/var/run/docker.sock:ro で、それ以外のDockerのCLIとかはコンテナに別途インストールするんですけど、docker.sockがrootかdockerグループにいないと読めないんですけど、rootかホストと同じGIDのdockerグループ、でしたね。私の環境では。
3:07 PM
具体的な方法はそういうことであとは
Dockerの中のプロセスもホストマシンのプロセスだからGroupによる権限があればホストのDockerエンジンに触れるのか。
ということだと思います。
Avatar
なるほど、unixsocketを挿し込んでやるのか。
3:11 PM
そのソケットがパーミッションモデルでマシン内において保護されてるからグループを使うのかあ。
Avatar
Kishikawa Katsumi 10/22/2020 3:12 PM
実行するだけなら細かいことはいいんですけど、ボリュームをマウントするとその構造が難しくて、 コンテナ(子)の中から作ったコンテナ(孫)も結局子のコンテナと同じなので(ホストが作ったコンテナと同じ)子のコンテナのボリュームを孫にマウントするとそれは何もないものをマウントするので親から見たパスを孫にマウントする、みたいなところがややこしいです。
Avatar
ww
Avatar
Kishikawa Katsumi 10/22/2020 3:14 PM
services: app: image: kishikawakatsumi/swift-playground:latest container_name: swift-playground depends_on: - letsencrypt env_file: - .env environment: HOST_PWD: $PWD/ このボリュームを孫にマウントできるようにするのをポータブルにするためにdocker-compose.ymlでホストのカレントディレクトリ を渡しています。こういう書き方ができるのがよかった。
5:17 PM
let tanner = User(name: "Tanner", age: 23, pets: ["Zizek", "Foo"], dict: ["a": 1, "b": 2], foos: [.baz], nums: [3.14], isCool: true) let ravneet = User(name: "Ravneet", age: 33, pets: ["Piku"], dict: ["a": -3, "b": 99], foos: [.baz, .bar], nums: [3.14, 144], isCool: true) let usersToEncode = Users(users: [tanner, ravneet]) let result = try URLEncodedFormEncoder().encode(usersToEncode) XCTAssert(result.contains("users[0][pets][]=Zizek")) XCTAssert(result.contains("users[0][pets][]=Foo")) XCTAssert(result.contains("users[0][age]=23")) XCTAssert(result.contains("users[0][name]=Tanner")) XCTAssert(result.contains("users[0][dict][a]=1")) XCTAssert(result.contains("users[0][dict][b]=2")) XCTAssert(result.contains("users[0][foos][]=baz")) XCTAssert(result.contains("users[0][nums][]=3.14")) XCTAssert(result.contains("users[0][isCool]=true"))
5:17 PM
VaporはQueryStringに構造化データのエンコード/デコードできるらしい
5:18 PM
できないと思い込んで無駄に頑張ってしまった・・・
Avatar
Kishikawa Katsumi 10/22/2020 5:19 PM
なるほどねえ。
Avatar
まあこのキーに [ ] を使ってパスを表すスタイル自体はPHPからあるんですが・・・
Avatar
Kishikawa Katsumi 10/22/2020 5:19 PM
ただこれはクエリで与えるのも受け取るのもしんどいからJSONでBODYにした方がいいんじゃない
Avatar
Vaporは無理だろうな〜っと下から入ったのが良くなかった。。
Avatar
Kishikawa Katsumi 10/22/2020 5:20 PM
ああいうのって規格化されてるんですかね?それとも慣習?
Avatar
これは規格ではないと思います・・・
5:20 PM
&で区切った K=V 形式自体は、 x-www-form-urlencoded で規格になってるけど。
5:22 PM
JSONでBODYにした方がいいんじゃない
ブラウザのFORMから自然にPOSTさせようとするとこっちが楽なんです
Avatar
Kishikawa Katsumi 10/22/2020 5:23 PM
ああ、確かにブラウザからはそうかな。ブラウザからJSでPOSTがいいと思うけどそれよりもFORMの方が良い?
Avatar
リロードボタンを押したときの振る舞いとか
5:24 PM
普通のPOSTと違ったりしそう。調べてないけど。
5:24 PM
Fetch API ってことですよね?
Avatar
Kishikawa Katsumi 10/22/2020 5:26 PM
それかXMLHTTPRequest。まあ一緒っすね。 FormのSubmitで動くJSでパラメータを集めて改めてFetch APIかXMLHTTPRequestでPOST。
Avatar
やっぱり、ブラウザとしての遷移を挟まないのが気になりますね。
5:29 PM
それを完全に捨てるとか、逆にHistoryAPI使っていい感じにするとか、道はあるけど。
5:29 PM
認証系ヘッダーとかクッキーの振る舞いとかも。まあ制御する方法はあるんでしょうけど
5:33 PM
Parse and stringify URL query strings
5:34 PM
jsのquery-stringライブラリは、構造データは扱えないらしい。 JSONにして文字列にすればとか書いてある。 1次元の配列だけは扱えるらしい。
Avatar
Kishikawa Katsumi 10/22/2020 5:38 PM
https://github.com/ljharb/qs はめっちゃ深いネストじゃなかったらいけるみたい
A querystring parser with nesting support. Contribute to ljharb/qs development by creating an account on GitHub.
Avatar
By default, when nesting objects qs will only parse up to 5 children deep.
この制限いるのか?w
5:39 PM
でもこれはいいですね
5:40 PM
こいつを使えばJS側でも取り回せるな。
Avatar
Kishikawa Katsumi 10/22/2020 5:40 PM
Express.jsが使ってるのはこれらしいです。
Avatar
なるほど。
5:42 PM
デフォルトでは [ をパーセントエスケープするところがちょっと違うな。
5:49 PM
パーセントデコードしてない状態を型で区別していて良い。
.urlEncoded(value)
Avatar
Kishikawa Katsumi 10/22/2020 6:11 PM
なるほど。どっちでもStringはStringだけど型でラップすると混同を防げるんだな
Avatar
パーセントエンコードとかは 前後が両方文字列だから、2回やっちゃったり、0回になっちゃったり(これは危険!)するバグがまれにあるんですよね。
Avatar
Kishikawa Katsumi 10/24/2020 9:20 AM
https://discord.com/channels/291054398077927425/291397416043675649/767646667356373002 <xmp>...</xmp> で囲うことで<T>みたいなタグっぽい部分の出るようになりました。 ということでLeafは濡れ衣でした🙏🏻
Avatar
■HTML5情報 HTML5では、<XMP>は廃止される予定です。 <pre>や<code> に置き換えることが推奨されています。
Avatar
Kishikawa Katsumi 10/24/2020 9:28 AM
と言ってもPreとCodeだと挙動が違うんですよね。
9:29 AM
XMLのCDATAセクションを使う、、というのもいけそうだけど。少なくともタグっぽいものをそのままだす、というのはPreとCodeだとやってくれないです。
Avatar
なるほど。
Avatar
Kishikawa Katsumi 10/24/2020 9:45 AM
本当はちゃんとエスケープしろ、ということだと思うけど。。。
Avatar
うーん、POSTサイズの仕様が悩ましい
6:40 AM
投稿内容を検証するmiddlewareはコントローラーより先に処理したいけど
6:40 AM
検証のためにPOST body stream を collect する必要があって
6:40 AM
そのサイズの設定は本当は コントローラーの route登録のところに書きたいのに
6:41 AM
前段にあるmiddleware全部に設定しないといけなくなる
6:41 AM
サイズの制約を外すのはファイルアップロードする特定のrouteだけにしたいし・・・
Avatar
特定のエンドポイントにだけミドルウェア注入できなかったでしたっけ?
Avatar
このミドルウェアがCSRF対策フィルターで
6:43 AM
全部にまとめてかけてるんだよね
6:43 AM
一箇所だけ外す/設定を変えようとすると
6:43 AM
他も全部一個ずつ設定する書き方になっちゃう
Avatar
なるほど。
Avatar
セキュリティ関係だしまとめて設定する書き方にしたい
6:44 AM
Middlewareがその先のresponder chainを盗み見できたらいいんだけど・・・
6:44 AM
public protocol Middleware { func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture<Response> } public protocol Responder { func respond(to request: Request) -> EventLoopFuture<Response> } (edited)
6:45 AM
あまりに何もみえねえ
Avatar
発想の転換で、GETに変えるとか
🙁 1
Avatar
そもそもMiddlewareでcollectする必要があるのってどうなんですかね? 遅らせるのが良いのは分かるけどMiddlewareでリクエスト内容ほしいことはよくありそうだし・・・ (edited)
Avatar
collectしないとparseできないのは本質的に回避できない
6:47 AM
認証ヘッダーを使うとかやればいけるけど
6:47 AM
そうするとHTML側が凝った作りになってしまう
6:48 AM
どうなってればいいかでいうと
6:49 AM
controllerの直前でBasicResponderがcollectした直後の、ハンドラ突入の前
6:49 AM
このタイミングに挿し込める規格があったら嬉しい
Avatar
固定のパスだからどうにかなるけど
7:27 AM
これプレースホルダもつかってたらどうすりゃいいんだ
7:29 AM
やっぱ1ルートずつミドルウエアを全構成するしか無い気が
7:30 AM
まあヘルパー関数書けばそんなに大変でもないか・・・?
7:32 AM
func add(_ collection: RouteCollection, csrf: Bool = true, login: Bool = true) throws { var middlewares: [Middleware] = [] if csrf { middlewares.append(csrfProtection.middleware) } if login { middlewares += userLoginGuard(doesRedirect: true) } try routes.group(middlewares) { (routes) in try routes.register(collection: collection) } }
7:32 AM
こんなかんじか。。
7:35 AM
あ、ちがう、CSRF外したいわけじゃなかった。
Avatar
Kishikawa Katsumi 10/29/2020 8:51 AM
エンドポイントで決まってる(ことの方が多いと思う)ならAppじゃなくてリバースプロキシで制限してもいいんじゃない。
Avatar
あ〜なるほど・・・
8:53 AM
リバースプロキシさんは既に自分でPOSTをデコードしてるから良いのか。
Avatar
やっぱ1ルートずつミドルウエアを全構成するしか無い気が
大きいサイズを許容したいルートとそれ以外のルートで分けたら良いんじゃないですか? ルートの階層構造によってはやっぱり面倒ですが
Avatar
認証の階層とか
9:00 AM
ブラウザ向け / API向け の階層とか
9:00 AM
それらがマトリックスになってるから
9:00 AM
どれかが犠牲になるんだよね。
Avatar
そのへんすでに分かれてると更に倍に分かれるので微妙ですね……
Avatar
An interesting (early-stage!) thread outlining how the new swift concurrency features might be adopted by #SwiftNIO. https://t.co/h5obfu5nsn #ServerSideSwift #SwiftLang @codevapor
Avatar
Kishikawa Katsumi 11/5/2020 5:02 AM
@t.ae 前に書いたPodcastでServer Side Swiftの話をする会、「来週の13日以外」のどこか、21~23時くらいを予定しているのですが、ご都合いかがですか?一番詳しい人にぜひ加わっていただきたいと、思ってます 🙏🏼
Avatar
13日以外ですね。今の所何日でも大丈夫です。 正直言ってあまり話せること無いと思いますが、それでよろしければ。
Avatar
Kishikawa Katsumi 11/5/2020 5:10 AM
ありがとうございます。日にちを決めてお知らせします。気楽に参加してください 😃
Avatar
Kishikawa Katsumi 11/6/2020 10:58 AM
@t.ae 12日の21時から、使用するツールはZoomでお願いします。ZoomのURLは当日までにお知らせします。
👌 1
Avatar
Kishikawa Katsumi 11/15/2020 11:31 PM
CodableだけどVaporのContentにConformsできないっていうの https://github.com/kishikawakatsumi/CodableConformsToContent/blob/master/Sources/App/routes.swift#L15 これです。 DocumentSymbolRequest.ResponseCodable なんですけど Conditional conformance of type 'Optional<Wrapped>' to protocol 'Content' does not imply conformance to inherited protocol 'RequestDecodable' というエラーで、 定義は public struct DocumentSymbolRequest: TextDocumentRequest, Hashable { public static let method: String = "textDocument/documentSymbol" public typealias Response = DocumentSymbolResponse? /// The document in which to lookup the symbol location. public var textDocument: TextDocumentIdentifier public init(textDocument: TextDocumentIdentifier) { self.textDocument = textDocument } } なので typealias Response = DocumentSymbolResponse? のところが問題なのかな? ちなみに、 DocumentSymbolResponse の方は extension DocumentSymbolResponse: Content {} でOK。 (edited)
Contribute to kishikawakatsumi/CodableConformsToContent development by creating an account on GitHub.
Avatar
往年の芸能人のブログ並みの改行具合
Avatar
Kishikawa Katsumi 11/16/2020 4:01 AM
ホントだ。。。自分でもなんでこうしてしまったのか。。。
Avatar
改行がx3に?
Avatar
Kishikawa Katsumi 11/16/2020 4:02 AM
なんかコードブロックの後は自動的に空行が入るのかな。それで自分の入れたのと合わせてダブル改行みたいになってる、というのはわかりました。
Avatar
Discordが悪いのか...
Avatar
Kishikawa Katsumi 11/16/2020 4:03 AM
ちょっと編集しました。コードブロックの後の改行はどうにもならないっぽいですね。
Avatar
🐱 let a = 1 🐱 (edited)
4:05 AM
なるほどー
4:05 AM
`x3 の直後の改行はx2になる
Avatar
もとの話題に戻ると、 extension DocumentSymbolRequest.Response: ResponseEncodable {} extension DocumentSymbolRequest.Response: RequestDecodable {} extension DocumentSymbolRequest.Response: Content {} 上の二行を追加するとコンパイルできます。コンパイラのバグっぽい? (edited)
Avatar
Kishikawa Katsumi 11/16/2020 4:08 AM
おおー。protocol Content: Codable, RequestDecodable, ResponseEncodable ContentっていうのはそもそもCodable + RequestDecodable + ResponseEncodable なんですね。
4:10 AM
なかなか謎な挙動ですね。 extension DocumentSymbolRequest.Response: Content, RequestDecodable, ResponseEncodable {} はコンパイルできるけど、 extension DocumentSymbolRequest.Response: RequestDecodable, ResponseEncodable {} は同じエラーでダメ。
Avatar
Codable? Content?
Avatar
Contentがデフォルト実装を与えてるみたいなので下のケースはそれのエラーじゃないですか?
Avatar
Kishikawa Katsumi 11/16/2020 4:17 AM
VaporにContentっていうプロトコルがあってVaporのリクエストやレスポンスとしてオブジェクトを渡す場合にはそのプロトコルに準拠しないといけない、というものです。 で、CodableならContentにできる、、、という想定のはずなんですが、CodableだけどシンプルにエクステンションだけでContentにできなかった、ということがあった、という相談なんです。 (edited)
Avatar
Kishikawa Katsumi 11/16/2020 4:25 AM
ホントだ。ちゃんと見れてなかった。RequestDecodable, ResponseEncodableだけ書いたときはContentが提供しているデフォルト実装がないからResponseEncodableに準拠するには実装が必要、というエラーですね。そうするとそれは合ってるからContentだけだとダメっていうケースだけおかしいんですね。
Avatar
エラーメッセージ的にはdoes not imply conformance to inherited protocol 'RequestDecodable'なのでRequestDecodableを書く必要があるって言ってる気がするんですが、一般には Content だけで済むはずですよね。
4:31 AM
@swift-5.3.3 public protocol ResponseEncodable { func encodeResponse() } public protocol Content: Codable, ResponseEncodable { } extension Content { func encodeResponse() {} } struct MyType: Codable {} extension Optional: Content where Wrapped == MyType {}
Avatar
exit status: 1 with stderr:<stdin>:13:1: error: conditional conformance of type 'Optional<Wrapped>' to protocol 'Content' does not imply conformance to inherited protocol 'ResponseEncodable' extension Optional: Content where Wrapped == MyType {} ^ <stdin>:13:1: note: did you mean to explicitly state the conformance like 'extension Optional: ResponseEncodable where ...'? extension Optional: Content where Wrapped == MyType {} ^ <stdin>:13:1: error: method 'encodeResponse()' must be declared public because it matches a requirement in public protocol 'ResponseEncodable' extension Optional: Content where Wrapped == MyType {} ^ <stdin>:9:10: note: mark the instance method as 'public' to satisfy the requirement func encodeResponse() {} ^ public
Avatar
これで再現できたかな
Avatar
Kishikawa Katsumi 11/16/2020 4:33 AM
おおー、同じこと試してたんですけど再現しなくて、Contentのデフォルト実装がキモなんですね。
Avatar
もうちょっと進めたらデフォルト実装関係ないみたいでした。 @swift-5.3.3 protocol ResponseEncodable {} protocol Content: ResponseEncodable {} //extension Optional: Content {} // OK extension Optional: Content where Wrapped == String {} // NG (edited)
Avatar
exit status: 1 with stderr:<stdin>:4:1: error: conditional conformance of type 'Optional<Wrapped>' to protocol 'Content' does not imply conformance to inherited protocol 'ResponseEncodable' extension Optional: Content where Wrapped == String {} // NG ^ <stdin>:4:1: note: did you mean to explicitly state the conformance like 'extension Optional: ResponseEncodable where ...'? extension Optional: Content where Wrapped == String {} // NG ^ (edited)
Avatar
Codable も関係無さそうです。 protocolの親子関係とextensionのwhere句が条件と思われます。
Avatar
Kishikawa Katsumi 11/16/2020 4:40 AM
Yes, so for completeness, here’s how to conditionally conform MyArrayOfOne to Foobarable (leaving Array and Optional there to demonstrate – what turned out to probably be – the actual bug): protocol Fooable { func foo() } protocol Barable { func bar() } protocol Fooba...
4:40 AM
Yeah, I agree that that example is a bit subtle and a bit of an edge case. I actually realised a slightly more convincing one: SomeConditionalSequence.Iterator will infer the appropriate bounds to make SomeConditionalSequence a Sequence, to get access to Iterator. I think it...
Avatar
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution
4:45 AM
例に出てるコードはちょっと違うかな……
Avatar
へー、親プロトコルつきのプロトコルは1発でcond confできないんだ。
Avatar
conditional conformanceは、そう
Avatar
気づいてたのか
Avatar
たしかこの話題は #math 辺りでやった記憶がある
Avatar
VaporアプリをビルドするとBoringSSLを2回ビルドすることになって辛い。。
4:51 AM
さらにNIOSSL側はパッチを当ててるみたい 😢 https://github.com/apple/swift-nio-ssl/blob/main/scripts/patch-2-arm-arch.patch (edited)
4:53 AM
JWTを検証しようとするともう一つ追加される。。。https://github.com/vapor/jwt-kit/blob/b9c8950be2530c5f55407fca723c960eae88a95f/Package.swift#L20 (edited)
🔑 JSON Web Token signing and verification (HMAC, RSA, ECDSA) using BoringSSL. - vapor/jwt-kit
Avatar
気づかなかった パッチがあるから共有されないんか
Avatar
そうなんですよ
5:41 AM
BoringSSLはちゃんとプレフィックスが付けられるような仕組みになってて、シンボル衝突しないようになってるのでこういう重複が許されるんですよね。 https://github.com/apple/swift-nio-ssl/blob/cc0e80dbccf8c89c1f49c3a11c5929575035076c/Sources/CNIOBoringSSL/crypto/fipsmodule/digest/digests.c#L90
TLS Support for SwiftNIO, based on BoringSSL. Contribute to apple/swift-nio-ssl development by creating an account on GitHub.
Avatar
おー
Avatar
omochimetaru 12/1/2020 4:49 AM
Throughout the course of my career I have done my best to stay on top of new hardware and software. As a teenager I owned an Altair 8800 and an Apple II. In my first year of college someone gave me a phone number and said “call this with modem.” I did, it answered “PENTAGON […]
4:49 AM
EC2にmacが出たそうな
Avatar
x86_64?
Avatar
omochimetaru 12/1/2020 4:50 AM
The instances feature an 8th generation, 6-core Intel Core i7 (Coffee Lake) processor running at 3.2 GHz, with Turbo Boost up to 4.6 GHz
Avatar
Apple M1 Chip – EC2 Mac instances with the Apple M1 chip are already in the works, and planned for 2021.
4:51 AM
Vapor使うならめちゃくちゃ良さそうですね。 linux環境であれがないこれがないが解決する。
Avatar
MacServer
Avatar
MacStadiumの話を聞いてると滅茶苦茶大変そうだなという印象だったんですけど、こんなにシュッと用意できるものなんですね
Avatar
omochimetaru 12/1/2020 5:11 AM
(動画のとおりなら)10ヶ月ぐらいかかってるからシュッではないのでは (edited)
Avatar
10ヶ月なんてこの規模の会社ならシュッレベルの速さ
Avatar
omochimetaru 12/1/2020 5:12 AM
大きい会社が効率的に仕事をしたらこのくらい感
Avatar
そうなのかなぁ
Avatar
M1マックでお祭りなところにタイムリーに出てきたからタイミングは良かったと思う
Avatar
小さい会社のときから大きくなったときまで経験してきたけどプロダクトの変更とかにかかる時間はうなぎのぼりなので
6:03 AM
10ヶ月って0からならヤバイ速いと思う。 (edited)
Avatar
Kishikawa Katsumi 12/1/2020 6:17 AM
MacStadiumとかMacのホスティングサービスの会社は大騒ぎになってそう。
6:18 AM
MacStadiumくらいデファクトスタンダードなところは大丈夫なんだと思うけど。
Avatar
Kishikawa Katsumi 12/1/2020 8:55 AM
Xcodeとかあらかじめ入ってるといいなあ。それかイメージのテンプレートから構築できるとか。空っぽの環境に入れていくとなると結構面倒。
Avatar
omochimetaru 12/1/2020 9:10 AM
Xcode入れていくのめんどくさいですねw
9:10 AM
ダウンロードしてxip解凍しないといけない。。
Avatar
カスタムイメージ作れるからそこにxcode入れれそう
9:23 AM
※amiつくれるなら
Avatar
料金どこに載ってるか見つけてないんですがVaporDiscordによると$1.207/ hour
Avatar
Kishikawa Katsumi 12/2/2020 2:12 AM
まあまあ手軽に使える値段っすね。月800$程度なのかな。
Avatar
Kishikawa Katsumi 12/2/2020 2:46 AM
そういえばMac StadiumのMacはVNCがよく使えなくなる。SSHは生きてるけどVNCつながらないということが起こりがち。 よくサポートに再起動してもらってる。
Avatar
yutailang0119 12/2/2020 2:52 AM
EC2 mac mini、$1/hourは高いなーと思ったけど、12コア32GBということでc5.4xlargeと比べるとまあスペック相当のお値段で高すぎるということはないんだな…3ヶ月動かすと1台買えると思うと安くは感じないのがあれ
Avatar
Kishikawa Katsumi 12/2/2020 2:53 AM
勘違いしてた。まあまあ手軽に使える値段じゃないわ。800$まで計算して800円くらいか、と思ってしまった。8万円や。
Avatar
$800は岸川さんの「まあまあ手軽」な範囲なのかと思って見てました😅
Avatar
Kishikawa Katsumi 12/2/2020 3:08 AM
ハハッ。 500円〜1000円くらいなら別にいいかなあって感じですねえ。
💸 1
Avatar
M1Macの小売価格が安すぎて頭がおかしくなってる説はある
Avatar
1ヶ月$800でMac mini買える😂
Avatar
800円やすい
Avatar
Kishikawa Katsumi 12/11/2020 1:51 PM
https://soundcloud.com/nextstepfm/025-grpc Server Side Swift、VaporとかWebフレームワークも不要でSwift gRPCでAPIだけあってフロントReactでいいんちゃうの、というのは私はとても良さそうに思いました。
👍 1
Avatar
Kishikawa Katsumi 1/29/2021 5:24 PM
久しぶりに、というかずっと気づかなかった問題で app.on(.POST, "shared_link", body: .collect(maxSize: "10mb")) { (req) -> EventLoopFuture<[String: String]> in VaporはPOSTボディのデフォルトのサイズ制限が意外と小さいっていうのに当たった。
Avatar
omochimetaru 1/29/2021 5:25 PM
あれ?それ一度会話してますよ
5:25 PM
デフォルト小さいねって
Avatar
Kishikawa Katsumi 1/29/2021 5:25 PM
そうそう。そうなんだけど、このエンドポイントは忘れてて簡単な書き方を使ってて、デフォルトになってた。
5:26 PM
なんかアプリケーショングローバルに設定できたりしないかなあ。
5:26 PM
で、さらに増やしたいとか小さくしたい場合はエンドポイントごとにオーバーライドしたい。
5:26 PM
たぶんあるんじゃないかと思うんだけど。app.config...みたいな。
Avatar
omochimetaru 1/29/2021 5:26 PM
そのへんの設定はあんまりうまいことできる感じではなかった
5:27 PM
多分開発リソースが足りてない部分だから、いい感じの実装を提案できるといいのかも?
Avatar
Kishikawa Katsumi 1/29/2021 5:27 PM
そうすると、まあ定数化とか書き方を工夫することはできるけど、 エンドポイントごとに app.on(.POST, "shared_link", body: .collect(maxSize: "10mb")) を現在はすべて指定していくのが正しい、であってます?
Avatar
omochimetaru 1/29/2021 5:30 PM
application.routes.defaultMaxBodySize
Avatar
Kishikawa Katsumi 1/29/2021 5:30 PM
ちょっと前に別の問題でリバースプロキシとVapor側の設定があってなくて、リバースプロキシでタイムアウトになってて手元では再現しなくて困ったことがあって、今回も先にNginx側の方を調べてたからちょっと時間かかった。
Avatar
omochimetaru 1/29/2021 5:30 PM
これを設定すれば、全体のデフォルトは設定できる
Avatar
Kishikawa Katsumi 1/29/2021 5:30 PM
お、それで良さそうだな。
Avatar
omochimetaru 1/29/2021 5:30 PM
個別についてはそう。 routes.on(.POST, body: .collect(maxSize: setting.largePostSize), use: submit)
5:31 PM
僕が見つけた方法はこの2つだけ、見落としがなければ多分それ以外のおしゃれな方法はいまのところない
Avatar
Kishikawa Katsumi 1/29/2021 5:31 PM
たいていはフロントにリバースプロキシがいるからアプリの方は正直チェックいらないんじゃないのという気もしている。
Avatar
omochimetaru 1/29/2021 5:31 PM
たしかに。 アプリ側でできるメリットはエンドポイントごとに設定できることですね。
Avatar
Kishikawa Katsumi 1/29/2021 5:32 PM
なので、application.routes.defaultMaxBodySizeにそんなに小さくない値を入れておけばいいかな。 知りたかったのはこれです。どうもありがとう。
👍 1
5:34 PM
細かく制御する必要が出てきたらどっちがいいのかな。 Routerは最初に見るところだからそこにまとまっててもいいけど、Vaporのルーティングは現状はそこまで強力じゃないから結構すぐに複雑になったりするからNginxのConfの方がいいかなあ、って気もする。
Avatar
omochimetaru 1/29/2021 5:35 PM
僕はnginxおいてなくてAWS ELBから直結させてるからなんとも
5:35 PM
いろいろグループ単位で制御したくなったら現状なら、
5:36 PM
middlewareで自前でできるかな、ストリーム処理が絡んでるから無理かもな
5:36 PM
nginxの設定ファイルの文法とか個別のものを覚えるより
5:36 PM
コンパイルできるSwiftコードに寄せられるものは寄せちゃったほうが
😯 1
5:36 PM
個人的には楽
5:36 PM
まあ結構やったんでnginxも覚えてますけど・・・ (edited)
Avatar
ELB便利だよね
Avatar
Kishikawa Katsumi 5/29/2021 1:17 PM
Vaporってルーティングの矛盾を見つけてくれるんですね。エンドポイントが重複してたりすると起動するときにAssertionに引っかかる。
Avatar
omochimetaru 6/15/2021 2:38 PM
vapor/queues は Redisが必要でめんどくさいので、ジョブ実行機を自作した。スケジュール実行も対応。 https://github.com/omochi/VaporJobRunner
Contribute to omochi/VaporJobRunner development by creating an account on GitHub.
Avatar
ジョブが揮発しないためにRedisは必要じゃないですか?
Avatar
queue使いたい用途考えるとredis挟むのが無難だね
Avatar
omochimetaru 6/15/2021 3:31 PM
考えてる用途だと揮発しても特に困らないんだけど、どういうシナリオ?
Avatar
「メールを送ってください」ジョブの例だと、投げてから実行までの間にインスタンスが消えたらメール届かなくなりません?
Avatar
omochimetaru 6/15/2021 3:44 PM
うーん、実行中にサーバー落ちるのは稀なので消えてもいい気が。メールの送信とジョブの完了がそもそもアトミックにできないから、redisがあったとしても二重実行の恐れがあるし。
3:46 PM
それと、二重実行側に倒すなら、ジョブの実装としてDBにレコード持ってもいいし。
Avatar
omochimetaru 6/15/2021 3:54 PM
逆に、複雑なジョブになってくると、途中状態とかもいろいろ管理する必要があって、どうせDB側にレコード置くし。
Avatar
そもそもqueueの先に積むjobをapiサーバーと同じところに置きたくないんじゃないかと思う (edited)
Avatar
omochimetaru 6/15/2021 3:59 PM
ビデオ処理みたいな高負荷なジョブはそうだね
4:00 PM
でもそっちはクラウドの仕組みでコンテナ立ち上げとかしたほうがいい感じがするんだよな
4:02 PM
↑の気持ちとしては、アプリで言うところの DispatchQueue.global().async がほしいという感じ
Avatar
その結果って別にクライアントに帰るわけじゃないんだよね
4:04 PM
無難に別インスタンスに分離したいなぁ
Avatar
omochimetaru 6/15/2021 4:05 PM
うん。レスポンス処理からはdetachして長時間実行する仕組みが必要ってこと
4:05 PM
EventLoopとかLoggerとかのお作法があるから、DispatchQueueそのままじゃだめなので、その辺だけ面倒みてる感じ
Avatar
Loggerならまあ良いのかな
Avatar
Redisを用意するのがめんどくさい程度の理由だとリスクがペイしない気がするなぁ
Avatar
やる内容によるのかな
Avatar
In process queue?
Avatar
Kishikawa Katsumi 8/1/2021 11:58 AM
SwiftでVapor使うとVapor使うだけでDerived Dataが1GB消費するのでマイクロサービス構成で複数のプロジェクト使っていくとディスクの減りが激しい。
11:59 AM
Vaporはそこまで重厚なフレームワークという印象は使っててもしないんだけど容量でかいんだなあ。
Avatar
omochimetaru 8/1/2021 12:22 PM
1GBも食うのか 嫌だなあ
Avatar
Kishikawa Katsumi 8/1/2021 12:25 PM
XcodeからPackage.swiftを開いてビルドするときと swift build または swift run で実行するときとで違う気がするから(後者は.buildを使う)実は普通に使ってると2GB使うはず。。。
12:26 PM
コードはXcodeで書くけど実行はswift runで、っていうの多いはず。
Avatar
omochimetaru 8/1/2021 12:26 PM
2倍ですね
Avatar
Kishikawa Katsumi 8/11/2021 8:19 AM
Vapor Leafが依存しているLeaf Kitが1.2.0から1.3.1に更新されて、そうするとテンプレートで置換する文字列がエスケープ(<&lt; など)されるようになった。 (edited)
8:21 AM
普通はあまり困らないんだろうけどエスケープされると困るところ( <pre> の中)があって困った。 で、これはPackage.resolvedにしか出てこない変更だから見逃した。
8:22 AM
表に出てくるLeafのバージョンは1.3.0 => 1.3.1の変更だから単なるパッチアップデートにしか見えない。
Avatar
omochimetaru 8/11/2021 8:36 AM
その挙動をリビジョンアップデートで変えるのはヤバいと思うなー
8:38 AM
エスケープ挙動はプログラマが変換を把握できてないとバグるものなので
8:38 AM
すればいいってものでもないし。2回やるとおかしくなるので、1回をどこでやってるのかは把握できないといけない。
Avatar
Kishikawa Katsumi 8/11/2021 8:55 AM
これに関してはパッケージマネージャの仕組みの問題が大きいんじゃないかと思うんだけど、
8:56 AM
いや、そうでもないか。
8:58 AM
難しいんだけど問題の変更があったLeaf-Kitの変更は1.2.0 => 1.3.0だからそれなりに既存機能に変更がありそうなことはわかる。
9:00 AM
ただLeaf-Kitのリリースに気づくことができなくて(Package.resolvedにしか出てこないから)この変更がLeafの1.3.0 => 1.3.1の更新時に適用されたというのが不幸だった。
9:02 AM
ライブラリのバージョンアップはRenovateが自動的にPRを出すようになっていて、そのPRにはPackage.swiftの変更点しかないので、単なるパッチバージョンの違いだと「私が」思い込んだという。
Avatar
omochimetaru 8/11/2021 4:42 PM
なるほど
Avatar
やっぱ悪いのはLeafなんじゃないでしょうか。たとえ依存しているライブラリのアップデートであったとしても、それはカプセル化された中の話で、Leafとして挙動が変わってしまっているなら1.3.0→1.3.1にすべきではなかったのでは。
Avatar
Kishikawa Katsumi 8/12/2021 3:01 AM
確かに。提供者側としてはそう考える方が親切ですね。
3:03 AM
気づいてない可能性もありますね。余裕があったら報告しようかな。 Leafの1.3.0 => 1.3.1のリリースは本当に@_exportを追加しただけのものだから。
3:03 AM
コンパイルが通ればOKの変更。
👍 1
Avatar
Kishikawa Katsumi 8/14/2021 4:44 PM
いつの間にかVapor Leafのテンプレートで # で置き換える部分、HTMLのIDを参照やColor Hexと衝突して500エラーになってしまうから \# ってしないといけなかったの、しなくてよくなってる。
😮 1
Avatar
swift-format 意外とできることが少ない...
Avatar
Kishikawa Katsumi 8/18/2021 6:04 AM
意外と標準添付でもないしあまりがんばって入れたい感じがないですよね。。。簡単に入るとはいえ。
Avatar
formatter としては { の位置とか細かく指定できるようにならないと厳しいなあという印象でした。
Avatar
サーバサイドSwift採用事例です https://kateinoigakukun.hatenablog.com/entry/2021/08/24/095012
TR;DR ISUCON11予選にSwiftで参加した SwiftのConcurrency機能(async/await等 )の体験最高 素振りが足りず地区予選敗退 チーム情報 メンバー @freddi @giginet @kateinoigakukun 全員iOSアプリ開発人材 共通してそれなりに書ける言語がSwift 移植の覚悟 ISUCONでは例年、いくつかの言語で対象Webアプリケーションの参考実装が提供されます。しかし、それを使わないといけない、というわけではなくレギュレーション上は他言語の使用が許可されています。 許可される事項には、例として以下のような作業が含まれる。 ・ ... …
👏 5
Avatar
omochimetaru 8/24/2021 1:17 AM
async/awaitいいなー
Avatar
EventLoopFutureチェインを体験してると感動しますよ
Avatar
omochimetaru 8/24/2021 1:20 AM
ELF書きまくっとるよ
1:20 AM
あれ、でも今Custom Executor無いよね?
Avatar
難しいオペレータの選択が必要なくてとても楽
Avatar
omochimetaru 8/24/2021 1:20 AM
既存のEventLoopセマンティクスはvaporのasync/awaitスタイルの時どうなっているの (edited)
Avatar
SwiftのExecutorがselectする訳ではなくて、従来通りNIO側のイベントループで走ってます
Avatar
omochimetaru 8/24/2021 1:24 AM
あーじゃあ EventLoopFuture<T>async T になっているだけで
1:24 AM
その EventLoop 上での実行になっている+コールバックが戻ってくる点は特に変わらないか
Avatar
そうそう。そこにエクステンション生えてるだけなんですよ
1:24 AM
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - swift-nio/AsyncAwaitSupport.swift at 2.32.1 · apple/swift-nio
1:24 AM
ここ
Avatar
omochimetaru 8/24/2021 1:25 AM
なるほど
Avatar
ELF、Type of expression is ambiguous without more context 出まくって大変なので期待
Avatar
Kishikawa Katsumi 9/16/2021 9:42 PM
今さらだけどVaporをXcodeから起動する場合、コンパイルされるファイル以外のリソースファイルは実行ディレクトリにコピーされないから https://docs.vapor.codes/4.0/xcode/#custom-working-directory みたいにスキーマでカレントディレクトリを設定しないとダメなのか。これもっとスマートな方法ないのかしら?
Vapor 4's documentation (web framework for Swift).
9:42 PM
ないんだろうね。こう書いてある以上は。
Avatar
Kishikawa Katsumi 11/4/2021 2:29 AM
https://github.com/vapor/vapor/releases/tag/4.52.0
Adds a async alternative for sending a ClientRequest with Client
send(_ request: ClientRequest) async throws 私の書いてるコードだとこれが入ったのめっちゃ助かる。これでかなりの部分をFutureからAsyncに書き換えられそう。
This patch was authored and released by @madsodgaard. Adds a async alternative for sending a ClientRequest with Client send(_ request: ClientRequest) async throws
👍 2
Avatar
Kishikawa Katsumi 11/4/2021 4:49 AM
書き換えて動作確認した。 https://github.com/SwiftFiddle/swiftfiddle-web/pull/259 コンパイラのチェックがなかったらこれをスッとデプロイするのは無理かな。
Avatar
Kishikawa Katsumi 11/4/2021 5:09 AM
app.get("runner", ":version", "health") { (req) -> EventLoopFuture<Response> in let promise = req.eventLoop.makePromise(of: Response.self) let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/env") process.terminationHandler = { (process) in let status: HTTPResponseStatus = process.terminationStatus == 0 ? .ok : .internalServerError HealthCheckResponse(status: status) .encodeResponse( status: status, headers: HTTPHeaders([("Cache-Control", "no-store")]), for: req ) .cascade(to: promise) } process.launch() return promise.futureResult } 非同期に呼ばれるCallbackクロージャが普通のクロージャで、その中でさらに非同期処理を呼んでいるというコードがあって、コールバックの中でawaitできない、と思ったけど非同期処理の前でいったん値を返して再度awaitする、っていうのでいけた。 合ってるかな?
5:11 AM
app.get("runner", ":version", "health") { (req) -> Response in guard let version = req.parameters.get("version") else { throw Abort(.badRequest) } let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/env") let status: HTTPResponseStatus = await withCheckedContinuation { (continuation) in process.terminationHandler = { (process) in let status: HTTPResponseStatus = process.terminationStatus == 0 ? .ok : .internalServerError continuation.resume(returning: status) } process.launch() } return try await HealthCheckResponse(status: status) .encodeResponse( status: status, headers: HTTPHeaders([("Cache-Control", "no-store")]), for: req ) } こうなった。 encodeResponse がさらに呼んでいる非同期関数で、それは最初のawaitを抜けた後に呼ぶ、というふうに分解してうまくいった、ということ。
Avatar
Processにasync/await用のAPIが生えてないんですね
Avatar
Kishikawa Katsumi 11/4/2021 5:35 AM
探したけどなかったですね。TSCの方にはある気がする。
Avatar
この間かていくんが紹介していた distributed actorの出番だったりしそう
5:35 AM
We’re thrilled to announce a new open-source package for the Swift on Server ecosystem, Swift Distributed Actors, a complete server-oriented cluster library for the upcoming distributed actor language feature!
Avatar
Avatar
Kishikawa Katsumi
app.get("runner", ":version", "health") { (req) -> Response in guard let version = req.parameters.get("version") else { throw Abort(.badRequest) } let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/env") let status: HTTPResponseStatus = await withCheckedContinuation { (continuation) in process.terminationHandler = { (process) in let status: HTTPResponseStatus = process.terminationStatus == 0 ? .ok : .internalServerError continuation.resume(returning: status) } process.launch() } return try await HealthCheckResponse(status: status) .encodeResponse( status: status, headers: HTTPHeaders([("Cache-Control", "no-store")]), for: req ) } こうなった。 encodeResponse がさらに呼んでいる非同期関数で、それは最初のawaitを抜けた後に呼ぶ、というふうに分解してうまくいった、ということ。
omochimetaru 11/4/2021 5:37 AM
あってると思いますよ。 launch() の呼び出しと terminationHandler からの処理の継続を、Continuation APIで async/await にしている。
5:38 AM
コールバックスタイルからawaitスタイルへの変換は、最小の根っこのところでやっておいて、
5:39 AM
あとはawaitの世界で処理を組み合わせていくというのが良いと思います 2つのスタイルを混ぜて考える必要がなくなるので
5:39 AM
ちょうどそうなっている。
Avatar
extensionに書いておきたいですよね
Avatar
Avatar
tarunon
extensionに書いておきたいですよね
omochimetaru 11/4/2021 5:40 AM
terminationHandler を上書きするという副作用を extension func asyncLaunch() async に持たせてしまっていいかはちょっと気になるけど、まあしょうがないかな (edited)
Avatar
むしろ、Processの起動から受け取りまでを一貫した操作で提供して (edited)
Avatar
Kishikawa Katsumi 11/4/2021 5:40 AM
ProcessをラップしたExecみたいなのにするといいかな。
Avatar
Processの構造が出現しないようにすればいい (edited)
Avatar
Kishikawa Katsumi 11/4/2021 5:41 AM
ExecはTerminationHandlerとかそもそも持ってなくて、stdoutとstderrプロパティがある、みたいな。
Avatar
omochimetaru 11/4/2021 5:41 AM
Promiseの構造が出現しないようにすればいい
それは良いですね。僕もよくやってる。
Avatar
async関数が使えるようになると、途中のクラスが必要なくなるのはしばしばパターンとしてあります (edited)
Avatar
omochimetaru 11/4/2021 5:42 AM
そもそも Process 型が、 launch のオプション設定を instance property で代替してるビルダーパターン的なAPIなので
5:42 AM
こういうのは一個の関数にできる事がよくある
wakaru 1
Avatar
Kishikawa Katsumi 11/4/2021 5:42 AM
ああ、なるほど。一個の関数になるか。
Avatar
extension Process { static func run(...[Process args]) async -> TerminationResult } こういうのがあればオッケーな世界観
Avatar
Kishikawa Katsumi 11/4/2021 5:43 AM
そんな感じですねえ。
5:46 AM
探したらそんなAPIありそうだなあ。もうちょっと探してみよう。
Avatar
https://developer.apple.com/documentation/foundation/process/2890108-run これのasync/await版がほしいって感じになりそう
Avatar
Kishikawa Katsumi 11/4/2021 5:51 AM
単純なケースではそうですね。 これに環境変数を渡せるオーバーロードと、戻り値にstdout/stderrが返ってくるのがあればいいかな。
Avatar
Processはstdout/errを扱う場合は、シンプルなasync/awaitでどう、という感じに落とし込むのはちょっと難しいですね
5:53 AM
1行ごとにasync sequenceにするのが良いパターンもあったりしそう
Avatar
Kishikawa Katsumi 11/4/2021 5:55 AM
LSPのレスポンスなんかは継続的にコールバックが呼ばれるやつですね。1行ごと、かというと難しいけど区切りの単位はある。
5:56 AM
Async Sequenceにしたとして、いろんなレスポンスの型を受け取ることになるけどそれはどうなるのかな?
5:56 AM
いったんStringで受けてデコード、型によって (edited)
5:56 AM
さらにコールバックを呼ぶ、とかかな。
Avatar
状態によって振る舞いが遷移するとかだと、そもそも全体をActorに詰め込んで整えたほうが取り回しが良いとかありそう
5:57 AM
そういうのがDistributedActorに入ってそうな予感(ちゃんと見てない) (edited)
Avatar
Kishikawa Katsumi 11/4/2021 5:59 AM
なるほどActor。 actor LanguageServer {} としてコールバックを登録するみたいな。
Avatar
actor自体は自身の更新を何らかに通知する機能はないので難しくないですか?
5:59 AM
AsyncSequenceで更新が起こるたびにそのactorを流すということでしょうか
Avatar
状態を流すasync sequenceと、その状態如何によって使えるasync funcがあったりasync sequenceを新たにsubscribeしたり…をイメージしてましたが
6:04 AM
Actorそのものを流すのもアリなのか、そうか。
Avatar
@Yuta Saito の多大な協力のもと、server side swiftをとうとうasync/awaitに書き直し始めたんですけど(https://zenn.dev/masatsch/articles/9cbdf31864c9d9 )、何か知見などあれば知りたいです
7:02 AM
そもそもserver side swift運用してる会社どれだけいるんでしょう?
Avatar
弊社でServerSideSwift案件複数やってます〜
9:14 AM
でも僕の案件は、async/await化はギリギリもうちょっと見送ってます。 Vapor使ってるんですけど、nioのEventLoopFutureのスレッドモデルと、async/awaitのスレッドモデルが多少違っていて、
9:14 AM
async/await化しちゃうと、理論上動作性能が多少落ちてオーバーヘッドが増える説があるからです。
9:15 AM
それはVapor公式からもコメントが出てて、パフォーマンス重要なところでは気をつけてみたいな話がある。
9:17 AM
Swift Concurrencyの Custom Executor 仕様が入ると、EventLoopの挙動をasync/awaitで再現できるらしいので、
9:18 AM
それを待ってます。 テストコードの方はasync/await化したいなと思っているところです。
Avatar
For applications that need explicit control over event loops, or very high performance applications, you should continue to use EventLoopFutures until custom executors are implemented. For everyone else, you should use async/await as the benefits or readability and maintainability far outweigh any small performance penalty.
9:31 AM
Vapor 4's documentation (web framework for Swift).
Avatar
とりあえず記事読んできました。
9:39 AM
もともとの return live.and(isLiked).and(participants).and(likeCount)... ↑このコードを
9:40 AM
+ let likeCount = try await LiveLike.query(on: db) .filter(\.$live.$id == id.rawValue) .count() ↑こんな感じに書き換えている部分がありますけど、
9:41 AM
もともとのコードだと、複数のFutureを作ってから .and で待ち合わせをしているので、
9:41 AM
実行フローとしては複数の並列実行処理を開始してから、合流点で全部の完了を待つ制御になっていますが、
9:41 AM
書き換えた後のコードだと、一つ一つの値の取得に対して await しているので、
9:42 AM
実行フローとしては、一つずつ完了を待機しながら順番に処理していく制御になっているので、 (edited)
9:42 AM
実行フローが変わっちゃってるのはOKなのか?というのが気になりました。 同じようなフローを維持するなら、 async let の使い所かと思います。
9:43 AM
全体としては、コードが書きやすく綺麗になっていて、間違いなく良いですね。
Avatar
追加で、AsyncKitの flatMapEach 使ってるところもTaskGroup使ってやらないとフローが変わりそう
Avatar
AsyncKitのflatMapEachって、最終的にflatMapのチェーンに展開するせいで、
9:47 AM
要素数Nに対してO(N)なスタックチェーンが発生して、
9:47 AM
10000件とかで処理するとスタックオーバーフローしない?
Avatar
え、そんなことになってるんですか
Avatar
Event-driven network application framework for high performance protocol servers & clients, non-blocking. - swift-nio/EventLoopFuture.swift at main · apple/swift-nio
Avatar
同じところ見てた
Avatar
このreduceSuccessがFutureとしてのモナディックなreduceで for (index, future) in futures.enumerated() { if future.eventLoop.inEventLoop, let result = future._value { // Fast-track already-fulfilled results without the overhead of calling `whenComplete`. This can yield a // ~20% performance improvement in the case of large arrays where all elements are already fulfilled. processResult(index, result) if case .failure = result { return // Once the promise is failed, future results do not need to be processed. } } else { future.hop(to: eventLoop) .whenComplete { result in processResult(index, result) } } }
9:52 AM
flatMapEachがreduceの呼び出しなので、やはりそう
9:52 AM
これで普通に困って、てか、 スタックオーバーフローしないとしても、Xcodeでデバッガで止めた時に
9:52 AM
このループの中だったときにスタックが50000段とかになってデバッガビリティが終わるんよな (edited)
Avatar
w
Avatar
なのでDispatchQueue.asyncに周を逃す自作の実装でやってる
9:54 AM
ところで
追加で、AsyncKitの flatMapEach 使ってるところもTaskGroup使ってやらないとフローが変わりそう
このフローの違い?はよくわかってないけど、どういう話だろう
9:54 AM
flatMapEachは、順番に処理するやつじゃなくて、同時に発火するやつなのか?
Avatar
クロージャでfutureだけ先に複数作って、全部一気に待ち受けるんじゃないでしたっけ
9:57 AM
書き換え例だと逐次になってて変わりそうだなと
Avatar
self.flatMap { .reduce(into: [], $0.map(transform), on: eventLoop) { $0.append($1) } }
9:58 AM
public static func reduce<InputValue>(_ initialResult: Value, _ futures: [EventLoopFuture<InputValue>], on eventLoop: EventLoop, _ nextPartialResult: @escaping (Value, InputValue) -> Value) -> EventLoopFuture<Value> {
9:58 AM
ほんとだ。
Avatar
これ全部一気に作るのはmapで普通にできるんだから逐次実行のほうが入ってないとおかしいのではと思った
Avatar
Avatar
t.ae
これ全部一気に作るのはmapで普通にできるんだから逐次実行のほうが入ってないとおかしいのではと思った
mapしてflattenでいいよね。
Avatar
ここ@escaping なクロージャで受け取るのズコー感ありますよね
Avatar
たしかに。nioのAPIの方で見るとそこが非同期取れないんだ。
Avatar
Avatar
omochimetaru
async/await化しちゃうと、理論上動作性能が多少落ちてオーバーヘッドが増える説があるからです。
へーーーーあんまそんな感じしなかったから意外
Avatar
Avatar
masatojames
へーーーーあんまそんな感じしなかったから意外
async awaitの方が汎用的に設計されてる分、最初からパフォーマンス重視で設計されたEventLoopの方が優れている部分があるようです。勉強不足で正確に説明できないですが・・・
Avatar
僕の理解ではSwiftNIOと言語側で二重にジョブを管理する影響で不要なスレッドホップが発生するのが主なポイントだと思ってます
2:20 PM
グローバルなジョブをCustom Executorに投入する機構のAPIが正式にできれば、言語側のExecutorにスケジュールする必要がなくなって解決するはず
Avatar
Avatar
Yuta Saito
僕の理解ではSwiftNIOと言語側で二重にジョブを管理する影響で不要なスレッドホップが発生するのが主なポイントだと思ってます
実装レベルでいうと、ソケットからコールバックが返ってくる時に、Continuationのresumeを呼び出すスレッドと、その結果awaitから再開してるスレッドが異なってしまう、ってこと?
Avatar
ですね
naruhodo 2
2:29 PM
現状、こういう流れになってるはず NIOのEventLoopにFutureを投入する→ソケットが何かを受信する→EventLoopがfullfilledなFutureを見つける→ Cont.resume → 言語側のExecutorにスケジュール→DispatchQueueが暇な時に実行
Avatar
EventLoopとFutureも待ち行列的な関係になっているし、ローレベルのDispatchQueueもそうなわけか モヤモヤするなー
Avatar
カスタムエグゼキュータがあればCont.resume以降全部消える
2:42 PM
めっちゃモヤモヤするしオーバーヘッドの気持ちもわかる
Avatar
そうなって全面的に書き直されたnioが楽しみだ
t_sorena 1
Avatar
omochimetaru 1/5/2022 5:01 PM
…#1998) Motivation: For NIO&#39;s &#39;promise leak detector&#39; we added file:line: labels to makePromise and there it makes sense. A user might create a promise and then never ...
5:01 PM
nioのflatMapとかのオペレータからfile:line: 引数が消えてた
5:02 PM
これがあるのはFutureのリークを検出して良いメッセージを出すためだったらしいが
5:03 PM
flatMapオペレータが生成するFutureそれ自体はユーザから触れないからバグがないはずだから、 リークするとしたらflatMap元の方の問題であって、こっちはメッセージを出すのは不適切
5:03 PM
と書いてあると思う
Avatar
yutailang0119 7/7/2022 1:03 PM
Smoke使ってみたけど、ISUCON11予選クリアできなかった https://developer.hatenastaff.com/entry/2022/07/07/090000
有志によって開催された株式会社はてな 社内ISUCONで、ISUCON11予選問題にスマートフォンアプリケーションエンジニアの3人がSwiftで取り組んだレポートです。 amzn/smoke-frameworkを使ってチャレンジしました。
Avatar
Kishikawa Katsumi 7/7/2022 5:38 PM
SwiftでISUCONちょっとやってみたくなった
Avatar
yutailang0119 7/8/2022 2:44 AM
これ読んで、そう思ってもらえる一助になったならうれしい!
Avatar
Kishikawa Katsumi 7/8/2022 6:37 AM
まず移植を成功させないとSwiftの参照実装は一生入らへんやろうしな。
6:12 AM
また、ホップによるオーバーヘッドが気になっていたのでEventLoopで全て実装を書き換えもしました。この書き換えによってスコアに差が出ませんでした。これは個人的に驚きで、リクエスト単位では確実に微小なオーバーヘッドがあるはずですが、サーバ全体で見れば完全に無視できるという結果になりました。
6:12 AM
NIO-EventLoop環境でasync/await使っても、オーバーヘッド問題ないらしい
Avatar
async/awaitでSwiftサーバ書いても大丈夫なのでSwift on Serverよろしくお願いします
6:16 AM
for文の中でawaitする処理をNIOだとsequencedFlatMapEachで書いたりして、それのへんでNIO不利な面もあったりしそう
Avatar
同時にどのくらいリクエストくるんでしたっけ
6:19 AM
数によっては各スレッドのGlobal Executorがヒマしてて2重スケジューリングのオーバーヘッドが安く済んでるのかもなと
Avatar
ulimit -n 1024 だとだめで ulimit -n 2048 した記憶があるので、その間かと
6:21 AM
さすがにでかすぎるな。いくつなんだろう。
6:22 AM
200rps以上はいってると思う
Avatar
ふむふむ
6:24 AM
System.coreCount は10くらいですか
Avatar
CPU2個しかあげてない仮想マシンなんで多分2です (edited)
🧐 1
Avatar
omochimetaru 9/16/2022 6:26 AM
そういえばこのロックを取るところの話、
6:26 AM
本来的にこの手のアーキテクチャで正しいのは、
6:27 AM
ロック解放を非同期に通知する、非同期IOなローレベルAPIの上で実装する形だと思った (edited)
6:27 AM
使ってるライブラリとかがそうなってないから、どうしようもなさそうだけど
6:28 AM
(競技的にもそのうち剥がすやつなので消える存在だったのもある)
Avatar
omochimetaru 9/16/2022 6:29 AM
内部はflockかー
6:31 AM
NIOのNonBlockingFileIOでもロックは提供が無いな (edited)
6:31 AM
DispatchIOにも見当たらなかった
6:34 AM
NIOのNonBlockingFileIO、スレッドプール使ってるだけで非同期IOになってなくね・・・?
Avatar
そうなんですよ
Avatar
omochimetaru 9/16/2022 6:34 AM
うそやんけ
Avatar
ノンブロッキング。。
Avatar
omochimetaru 9/16/2022 6:35 AM
これじゃあスレッド爆発か先行処理待ちが起きてしまう
6:36 AM
/// `NonBlockingFileIO` is a helper that allows you to read files without blocking the calling thread. /// /// It is worth noting that `kqueue`, `epoll` or `poll` returning claiming a file is readable does not mean that the /// data is already available in the kernel's memory. In other words, a `read` from a file can still block even if /// reported as readable. This behaviour is also documented behaviour: /// /// - [`poll`](http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html): "Regular files shall always poll TRUE for reading and writing." /// - [`epoll`](http://man7.org/linux/man-pages/man7/epoll.7.html): "epoll is simply a faster poll(2), and can be used wherever the latter is used since it shares the same semantics." /// - [`kqueue`](https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2): "Returns when the file pointer is not at the end of file." /// /// `NonBlockingFileIO` helps to work around this issue by maintaining its own thread pool that is used to read the data /// from the files into memory. It will then hand the (in-memory) data back which makes it available without the possibility /// of blocking.
6:37 AM
It is worth noting that kqueue, epoll or poll returning claiming a file is readable does not mean that the data is already available in the kernel's memory. In other words, a read from a file can still block even if reported as readable. This behaviour is also documented behaviour
6:37 AM
pollがreadableを返したとしても、その直後にreadをするとブロッキングされる事がある!?
Avatar
ノンノンブロッキングだ
Avatar
omochimetaru 9/16/2022 6:41 AM
Regular files shall always poll TRUE for reading and writing.
え〜じゃあpollってソケットとかには意味があるけどローカルファイルには意味が無いのか・・・?
6:41 AM
非同期IOって存在しなかったの?
6:41 AM
信じてきたものが存在していなかった・・・?
Avatar
Avatar
Yuta Saito
同時にどのくらいリクエストくるんでしたっけ
いまベンチ動かしたら1500くらいでしたベンチ内の仮想ユーザ数
Avatar
omochimetaru 9/16/2022 6:44 AM
Linuxではnon-blocking IOとasynchronous IOは別概念として存在していて
6:44 AM
Linux5.1で入ったio_uringはasynchronous IOらしい
6:49 AM
https://qiita.com/tmsn/items/0b9e5f84f9fbc56c1c82 わかりやすかった。io_uringベースの非同期IOが入るべき。 (edited)
はじめに Linux 5.1に新しい非同期IOの仕組みとしてio_uringがマージされてから既に1年以上経ってしまいましたが、これまでのLinuxにおける非同期IOの使い方や実装を見ていきながら、io_uringが登場した背景...
Avatar
Motivation: As outlined in #1761, io_uring is a new async I/O facility on Linux that should have less overhead than epoll. This commit includes a second stab at adding this to SwiftNIO with a much ...
11:22 AM
io_uringもう使ってた
11:22 AM
ファイルIOがこれになってないだけかも
Avatar
Avatar
Iceman
いまベンチ動かしたら1500くらいでしたベンチ内の仮想ユーザ数
ということはそのくらいなら全然詰まらないんですねぇ。DispatchQueueすごい
👀 1
Avatar
すごいですね〜
Avatar
A new hot take on the Foundation library has been announced by Tony Parker at the @SwiftServerConf conference! Open source, and 100% Swift~! It also means full 1:1 parity between platforms, there is no more "the other foundation impl" (corelibs) 🎉 #swift pic by @slashmodev :)
Avatar
Super excited to see where this new open-source Foundation will take us in 2023! #ServerSideSwift
10:34 AM
Apple Foundationがオープンソース+クロスプラットフォームになるの?
10:34 AM
100% Swiftだから、Apple Foundationとは別で新しく作った?
Avatar
ぽいですねぇ
10:35 AM
CoreFoundationを捨てられるわーい
Avatar
「i18n」ってなんのことだろう。
Avatar
CalendarとかUnicodeまわりみたいなやつもSwift実装になった?
Avatar
Internationalization
Avatar
あ、それはしってて
10:36 AM
具体的にFoundationのどのあたりの部分をさすのかな
Avatar
Calendarとかエンコーディングとか現状libicui18nに依存してる部分じゃないですかねぇ (edited)
Avatar
だとするとだいたいいつも必要そうか。
Avatar
でも分割されていることには大変意味があって
👀 1
Avatar
XMLぐらいしか分割の恩恵が無さそう
Avatar
彼らはたぶんかなり低レイヤーでSwiftを使おうとしていて、できるだけ大きな依存を作りたくないんじゃないかと
Avatar
Avatar
Yuta Saito
彼らはたぶんかなり低レイヤーでSwiftを使おうとしていて、できるだけ大きな依存を作りたくないんじゃないかと
ああー。freestanding対応みたいなやつね。
Avatar
そうそう
Avatar
Networkingもな〜 URLSession と async-http-client / nio の2つあるの嫌なんだよな〜
10:41 AM
うまいことなってほしい
Avatar
CFTimeZoneとかがローカルファイルシステムの /usr/share/zoneinfo/ とか読もうとするし、フリースタンディングで完全なFoundation使うのはすごい難しい
10:42 AM
Networkingはうまいことなってほしい
10:42 AM
そして #if canImport(FoundationNetworking) が良い感じになってほしい
👈 1
Avatar
Avatar
Yuta Saito
CFTimeZoneとかがローカルファイルシステムの /usr/share/zoneinfo/ とか読もうとするし、フリースタンディングで完全なFoundation使うのはすごい難しい
ああ、ね。ロケール関係の定義データみたいなやつ、しんどそう。
Avatar
Avatar
Yuta Saito
そして #if canImport(FoundationNetworking) が良い感じになってほしい
それw 分割されて今の所、「Linuxでビルドしてみたら失敗したからそれを書く」という儀式が増えた
10:44 AM
新foundationならmacでも分割されてるから、普通に import FoundationNetworking 書けばよくなるのかな。
Avatar
まずOSに同梱されるのか、SwiftPM パッケージとして配布されるのか
Avatar
iOS SDKとしての従来のApple Foundationとのソース互換性の辻褄はどうなるんだ?そもそもどうやって選択ビルドするのか
Avatar
import SwiftFoundationでなんとか
Avatar
うーむ。それが真っ当な手筋ではあるな・・・
10:47 AM
うまくいってほしい。下手に裏目ってしまうと、「SwiftFoundationではうごくけどOSS Foundationではうごかない」みたいな、環境の分裂増殖で余計つらみが出そう
t_yami 1
Avatar
Server-Side Swift conference、ロンドン開催だったので雑に行ってみようかなという気持ちがあったけど家庭の都合で断念した。詳細が気になる。
Avatar
omochimetaru 12/9/2022 2:19 PM
ついてて草 ロンドン開催だったのか、行けたら良かったですね
Avatar
OrganiserのTimがイギリス在住だからかな多分 https://www.brokenhands.io/about/ > ロンドン開催
t_naruhodo 1
Avatar
Swift on the edge with SwiftWasm and Fastly 🤯 #serversideswift
Avatar
The Foundation framework is used in nearly all Swift projects. It provides both a base layer of functionality for fundamentals like strings, collections, and dates, as well as setting conventions for writing great Swift code.
Avatar
全プラットフォームで共通の実装になると書いてあるけど、Foundation packageというからにはSPMでインストールする形になるのかな。
Avatar
Kishikawa Katsumi 12/9/2022 7:09 PM
めっちゃいいやん。これはアップル提供だったFoundationも置き換わるってことですよね?
7:09 PM
コードが見えないから挙動がわからんかった問題とかが自力で解決できるようになるわけね。
Avatar
Unify Foundation implementations. Multiple implementations of any API risks divergent behavior and ultimately bugs when moving code across platforms. This new Foundation package will serve as the core of a single, canonical implementation of Foundation, regardless of platform. Open contribution process. Open source projects are at their best when the community of users can participate and become a community of developers. A new, open contribution process will be available to enable all developers to contribute new API to Foundation.
これですね。正直リリースされるまでどうなるかは分からないけど。来年のWWDCとかでbeta版が公開みたいなスケジュールなのかな。
(edited)
Avatar
SPM からなら古い OS でも最新の API を使えるのかな
2:41 AM
ただそうなると全てのアプリサイズが肥大化するから、それはそれで厳しそう
Avatar
backDeployの仕様が入りそうだしいけそうですね
Avatar
たしかに、 backDeploy もあるから気にしなくても良さそうですね
Avatar
We have some exiting news to share about the future of Foundation. As announced at ServerSide.swift and on the Swift blog we are embarking on a project to create a unified implementation of Foundation, written in Swift, for all platforms. An important part of our vision is to provide the option of smaller, more granular modules for server side ...
Avatar
Date はessentialで Calendar は i18n だと、
9:25 AM
日付文字列の生成は Essentialだけではできないけど
9:26 AM
Date だけで何の役に立つんだろ? 経過秒数の計測とか?
Avatar
timeIntervalSinceReferenceDate でunixtime取れそうですし、何かしら時刻の記録だけするような処理はできそうですね。 (資源の限られた環境でログ取りたいときとか?)
Avatar
経過秒数にはClock APIが標準ライブラリにあるしなぁ
Avatar
API作るにしてもunixtimeで値を返せるわけだしずっとDoubleで持ち回すよりかは直感的にコード書けると思うけど、Calendar依存だから仕方がないとはいえDateComponentsがi18nになってしまうのは不便...
2:20 AM
日付の計算とかSwiftでどうしたら良いのか
Avatar
絶対時刻を扱うデータ型として Date を使いたい場面は多いから、Entityはessentialsだけをimportして Date を使い、Presenterがi18nをimportするというのは理に適った分割な気がします。
Avatar
Avatar
koher
絶対時刻を扱うデータ型として Date を使いたい場面は多いから、Entityはessentialsだけをimportして Date を使い、Presenterがi18nをimportするというのは理に適った分割な気がします。
パッケージを分割する利点は不要なパッケージをバンドルしない事による容量削減にあると思うので、Presenterの方で使うならあまり意味を感じなくて。
Avatar
Avatar
omochimetaru
パッケージを分割する利点は不要なパッケージをバンドルしない事による容量削減にあると思うので、Presenterの方で使うならあまり意味を感じなくて。
EntityとPresenterでは前者の方が再利用性が高いので、たとえばiOSアプリには両方入っているけど、サーバーサイドでは前者しか利用されないなどあると思います。
Avatar
何らかの用途でサーバーサイドでDateの値を見たい時に直観的なJSTで表示したいと思うんですよね サービスロジックが必要としなくても、少なくともデバッグしたい状況が起きそう Dateもi18nに入れて良いのではないか・・・?
4:30 AM
Tons of great responses here, thank you everyone! I'll try to consolidate some replies here. First, some high level clarifications on the API surface. Darwin Foundation (what we will call 'Foundation framework' to distinguish it) will be a superset of the package, because it will include all of the implementations we cannot remove or refactor ...
4:30 AM
意見を書き込んでおいたんだけど
4:30 AM
公式の返信が来てた
4:30 AM
Date We litigated this one extensively in the previous discussions about Duration and the conclusion there was to keep it in Foundation. We'll honor that decision by keeping it in Essentials. Date itself is just a Double, really, so it can be used independently of any dependency on ICU. Formatting it, or using it with Calendar or TimeZone does currently require ICU support and therefore those APIs will be in the Internationalization module.
(edited)
Avatar
とりあえず型で意味づけさけされた存在ということ・・・?
Avatar
どうせ必要になる、みたいなユースケースを考えた観点じゃなくて純粋に実装として依存してないよな、みたいな説明だなあ Duration の時に同じ話が出たんか? (edited)
4:35 AM
A reimplementation of Calendar in Swift is 1.5x to 18x as fast as the C one
Calendar早くなるらしい、これは困ってたから助かる
Avatar
Avatar
Iceman
とりあえず型で意味づけさけされた存在ということ・・・?
そうですね、データとして取り回す事だけはとりあえずできる、みたいな感じ
4:37 AM
てか本質的にDoubleのファントムタイプみたいな状態なのか
Avatar
型で意味づけされていることの意味は大きいと思うんですよね。もし、 var lastModification: Double だと、どういう単位でいつを原点にしているのかわからない。 Date ならそれが明確。 一方で、その絶対時刻をどう表現するか(年月日や文字列表記)はそれとは独立しているので、それらがi18nに分離されてるのはクリーンだと思います。
Avatar
ふーむ。 たしかにEntity moduleではi18nをリンクしていないから表示系のロジックを誤って含めていない、みたいな構造化の役に立ったりはしますね。
Avatar
omochimetaru 1/25/2023 1:31 PM
As part of my work on adding backtraces to Swift, I'd like to propose the addition of an API surface so that Swift programs are able to programmatically capture backtraces. This is often helpful when debugging a non-fatal problem that rarely occurs (since you can add code to detect the problem and emit a backtrace), and should be useful for test...
1:31 PM
公式のBacktraceの概要が出てる
1:32 PM
キャプチャーとシンボリケートが分かれてるのは良いね エラー型ではキャプチャーだけしておいてダンプする時にシンボれば良さそう
Avatar
サーバアプリケーション用途の薄いコンテキストコンテナ実装出てた https://github.com/apple/swift-service-context/
Minimal context propagation container with Logging - GitHub - apple/swift-service-context: Minimal context propagation container with Logging
3:58 PM
本命の用途としてはdistributedなアプリで中身を伝播させることっぽいけどdistributedでないアプリでも使えそう
Avatar
本当に薄いですね TaskLocalを直接使うのと大差ない気もしてくる
11:25 PM
本当だ分散トレーシング用のツールとセットで出てきてる
11:30 PM
TaskLocalだとNIOのEventLoopをうまくまたげないからコンテナとして一度取り出せるとまたげるようになって便利なのと、型を共有できない兄弟モジュール間でもそれぞれがコンテナに情報を詰め込める形式になってる(今回はメトリクス情報)ところがポイントなのかな?
Avatar
Kishikawa Katsumi 6/9/2023 4:07 PM
https://developer.apple.com/wwdc23/10171 AppleのOpenAPI (Swagger) generator出てた。
Discover how Swift OpenAPI Generator can help you work with HTTP server APIs whether you're extending an iOS app or writing a server in...
👀 2
Avatar
Kishikawa Katsumi 8/16/2023 8:05 AM
HummingbirdはVaporに比べてビルドにかかる時間がだいぶ速いな。1.7倍くらい。 https://github.com/hummingbird-project/hummingbird
Lightweight, flexible HTTP server framework written in Swift - GitHub - hummingbird-project/hummingbird: Lightweight, flexible HTTP server framework written in Swift
Avatar
SSLやHTTP2といった機能をビルドから外せるようになってるのが大きそうですね
Avatar
Kishikawa Katsumi 8/16/2023 8:15 AM
Vaporはその辺の依存でC++のコンパイルがあってそこがだいぶ時間かかるよね。
👉 1
Avatar
omochimetaru 9/5/2023 1:47 PM
The review of SSWG-0024: Service Context begins now and runs through until September 19, 2023. The package is being proposed under the Incubating maturity level. Reviews are an important part of the Swift Server Work Group incubation process. All review feedback should be either on this forum thread or, if you would like to keep your feedback...
1:48 PM
The review of SSWG-0025: Swift Distributed Tracing begins now and runs through until September 19, 2023. The package is being proposed under the Incubating maturity level. Reviews are an important part of the Swift Server Work Group incubation process. All review feedback should be either on this forum thread or, if you would like to keep you...
1:48 PM
service contextとdistributed tracingのレビュー始まってた
1:48 PM
というかレビューとかあるんやな
1:49 PM
リポジトリとか見るとsotoとかnio-postgresとかもあるな
1:49 PM
これを通すとSSWG公式のライブラリ?になるのか?
Avatar
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
11:56 PM
サーバサイドWGがアンケートやってました。 OS、インフラ、エディタ、ライブラリとか幅広いテーマで質問があって、 今後何を進めていくべきかしっかり検討してると感じられたので、 回答すると良いと思います。
👀 1
Avatar
Kishikawa Katsumi 9/28/2023 11:57 PM
回答した。ほとんど選択式で答えやすかった。ツールチェーンの更新を自動化してる?っていうの急に具体的でおもしろかった。
👍 2
Avatar
回答しました、割と何がわからないかがわかってない問題もありましたが 😇
👍 1
Avatar
Kishikawa Katsumi 9/30/2023 8:38 AM
https://flak.tedunangst.com/post/an-aborted-experiment-with-server-swift サーバーサイドSwiftをやってみたけど挫折した話。 Swiftだけのせいじゃないけど個々のつまずくポイントはよくわかる。この人はだいぶがんばって乗り越えてる。おしい。
Avatar
Appleプラットフォーム開発者なら問題に思わなんじゃないかという項目が多くて、我々は鍛えられている…
Avatar
Kishikawa Katsumi 9/30/2023 10:21 AM
error: PCH was compiled with module cache path '/home/tedu/proj/swello/.build/x86_64-unknown-linux-gnu/debug/ModuleCache/2U5BFZYJRSGKH', but the path is currently '/home/tedu/proj/swift/swello/.build/x86_64-unknown-linux-gnu/debug/ModuleCache/2U5BFZYJRSGKH'
これとか信じられないほど不便だけど何年もそのままやしな。
Avatar
"language"のコールバックとそれ以外のクロージャの区別が付きづらいという話はSwift Concurrencyで解決しそう。
Avatar
Kishikawa Katsumi 11/22/2023 7:49 AM
https://github.com/swhitty/FlyingFox このHTTP Server実装も小さくて良さそうだな。TLSとかが入ってないのがいい。
Lightweight, HTTP server written in Swift using async/await. - GitHub - swhitty/FlyingFox: Lightweight, HTTP server written in Swift using async/await.
7:49 AM
今どきTLSを自分で終端することはほとんどないし。
Avatar
お、観たこと無いやつかも
Avatar
Kishikawa Katsumi 11/22/2023 8:04 AM
一人で作ってはる。
Avatar
epoll使ってイチから作ってる、強気ですね
Avatar
え nioなし?
Avatar
Kishikawa Katsumi 11/22/2023 8:04 AM
NIO使ってない。依存が全然なくて本当にこのリポジトリだけ。
Avatar
それはすごいな
Avatar
Kishikawa Katsumi 11/22/2023 8:05 AM
HTTPとルーターとWebSocketがあるから一通りのものは作れそうに見える。
Avatar
すごいけどさすがに使う気にはなれないな
Avatar
epollないとだめなのか
8:06 AM
XNUという某kernelにはepollがなくてですね...
😯 1
8:07 AM
某実装でselect(2)を使っていてですね...
Avatar
Note: FlyingFox requires Swift 5.7 on Xcode 14+. It runs on iOS 13+, tvOS 13+, macOS 10.15+ and Linux. Windows 10 support is experimental.
8:07 AM
よさそう
Avatar
kqueueとかepollじゃない実装あるのか
8:07 AM
見ればいいか
Avatar
macはkQueueでLinuxはepollの実装が
8:08 AM
それぞれ #if で入ってくるっぽい
8:09 AM
8:09 AM
Socket+WinSock2.swift あるのウケる (edited)
8:09 AM
何需要なんだ
Avatar
swift-logすら使ってない
Avatar
dependencies空ですねw
Avatar
みてきた
8:10 AM
kqueue/epoll/ループですね
Avatar
逆にこれだけ小ぶりならiOSアプリの中にぶっ込んでデバッグ画面作ったりするのに使ったりできそうだ (edited)
t_tashikani 2
Avatar
Kishikawa Katsumi 11/22/2023 8:11 AM
https://github.com/EmergeTools/SnapshotPreviews-iOS/ これにそんな感じで組み込まれてた。
Automatic snapshots from Xcode previews. Contribute to EmergeTools/SnapshotPreviews-iOS development by creating an account on GitHub.
Avatar
Linux向けにSHA1が書き下されててウケる
8:12 AM
macでCryptoKit使うなら諦めてswift-cryptoは使ってもええやん
Avatar
Avatar
Kishikawa Katsumi
https://github.com/EmergeTools/SnapshotPreviews-iOS/ これにそんな感じで組み込まれてた。
ほんとだ!
Avatar
なるほどなぁ。Swift on Server用途じゃなくて、そういうツーリングのためには便利そう。
Avatar
スナップショットテストのツール?のなかでサーバー立てて、なんの機能を足してるんですか? (edited)
Avatar
たしかに、他人の書いたコードは信用ならんしな...
Avatar
Kishikawa Katsumi 11/22/2023 8:13 AM
いや、なんかサーバーが稼働してるなっていうだけでそれが何に使われるのかはわかってない。
Avatar
Avatar
Kishikawa Katsumi 11/22/2023 8:14 AM
このSnapshotPreviews-iOSもさっき読み始めたからよくわかってない。
Avatar
GCDWebServerがdeprecatedになってどうすっかな〜と悩んでるのでHTTPServer実装気になります (アプリに組み込んで使っていた) (edited)
Avatar
cartonにも使えそう
Avatar
GCDWebServer is a modern and lightweight GCD based HTTP 1.1 server designed to be embedded in iOS, macOS & tvOS apps. It was written from scratch with the following goals in mind:
8:17 AM
色々とそういうのがあるんですね。
Avatar
なるほどなあ
Avatar
Kishikawa Katsumi 11/22/2023 8:18 AM
そういう組み込みのHTTP ServerだとEmbassy https://github.com/envoy/Embassy もあるけどこれは確か同期的にしかレスポンスを返せなかったからちょっと使いづらかった気がする。
Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux - GitHub - envoy/Embassy: Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux
👀 1
Avatar
読めば読む程もっと小さい実装を作りたくなるな
Avatar
「ルーティング実装なんていらんのや!」
Avatar
Kishikawa Katsumi 11/22/2023 8:21 AM
まあ確かにこういう小さいサーバーの用途だとルーティングは単にSwitch文でよかったりしますね。
8:22 AM
GETとPOSTひとつずつ、とか。
Avatar
自分で書いてもいいし、ルーティングはルーティングでライブラリがあるのでそういうの使うパターンも… https://github.com/joeldev/JLRoutes (というか使っている)
URL routing library for iOS with a simple block-based API - GitHub - joeldev/JLRoutes: URL routing library for iOS with a simple block-based API
Avatar
「実装なんていらんのや!」
8:25 AM
生きるのに必要なことは少ない
Avatar
パッケージの依存を頑張って削ってHTTP2のビルドを無くそうとしても、AsyncHTTPClientがNIOHTTP2に依存してるから意味なかった・・・
Avatar
omochimetaru 3/26/2024 2:24 PM
The review of SSWG-0032: Hummingbird begins now and runs for two weeks, until April 6th, 2024. Reviews are an important part of the Swift Server Work Group incubation process. All review feedback should be either on this forum thread or, if you would like to keep your feedback private, directly to the review manager (via email) or direct messa...
2:24 PM
hummingbird(0032)とvapor(0031)がレビューに入った
2:25 PM
Vaporは Maturity Level: Graduatedで、 HBは Sandboxらしい
Avatar
今のVaporはとても成熟してると思うけど、v5で大幅にアップデートするときにどう捉えられるんだろうなぁ
Avatar
omochimetaru 3/26/2024 4:04 PM
Vapor5に切り替えるぐらいならHBに乗り換えたい
Avatar
HB prefix無くなるっぽいのめでたい
Avatar
omochimetaru 3/27/2024 2:18 AM
これtimとadamが相手のプロダクトのレビューマネージャをやってるんやな
Avatar
HBのもうひとりのメンテナーの人がIkigaJSONの人なの最近知りました
Avatar
omochimetaru 3/27/2024 2:54 AM
それは期待できるな
Avatar
雑質問ですが、NIOThreadPoolはshutdownされたときって積んであるタスクはキャンセルが発火しますが、EventLoopGroupはどうなるんでしたっけ?
Avatar
omochimetaru 4/4/2024 7:11 AM
graceful shutdownなら全部消化するのを待つんだと思ってた
Avatar
キャンセル通知とかないからそんな気がしますよね。
7:15 AM
protocolで実態がないから実装次第ともいえる
Avatar
Hey Swift Server Community! It's time for our first online meetup! We're keeping things simple and informal, so here are the details: The meetup will happen on April 24th, 2024, at the following times: 7 pm CET 6 pm UK 10 am PT It'll be streamed live on YouTube, and the video will be available on-demand afterwards. Here's the link: ...
Avatar
Kishikawa Katsumi 4/5/2024 2:11 AM
これは見よう。Appleのイベントと同じ時間でわかりやすい。
Avatar
Meetup始まってた。アーカイブ残ると良いな。https://www.youtube.com/live/FULMRV3wIKg?si=QivQLmegPwn6Wk3F
Calling all Swift developers who are eager to harness the power of Swift on the server-side! Join the Swift Server Working Group for their online meetup, whe...
5:33 PM
3ヶ月ごととか4半期ごとに今後も開催したいとのこと
8:44 AM
2回目が今日だった
8:45 AM
Hummingbird 2の話よさそう
Avatar
JSTだと深夜2時だ🤣
8:50 AM
Hummingbird 2はベータが長いですがいつ出るんだろう
8:52 AM
2でいろんなところがprotocolになって差し替えられるようになりましたが、必要以上の抽象化に感じる部分もあります
8:53 AM
Vaporと比べると実装が圧倒的にモダンでスリム
Avatar
作者が話すらしいのでMeetupで直接聞こう
10:29 AM
HummingbirdもVaporみたいにDiscordサーバーあるのかと思って参加したけど流石にアクティブ度合いが違いすぎる
Avatar
Kishikawa Katsumi 6/26/2024 11:06 AM
ハミングバードは気になってる
11:07 AM
アプリからライブラリとして使っても割とよさそうなところがよい。
Avatar
Breaking changes HummingbirdJobs has been moved into its own repository https://github.com/hummingbird-project/swift-jobs. Add FileIdentifier associated type to FileProvider. PR #487 Use RouterPat...
1:40 PM
HB2のRC出た
1:40 PM
WebSocketのサーバーとしていじってみたい
Exported 1,270 message(s)
Timezone: UTC+0