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