tag:crieit.net,2005:https://crieit.net/users/dala00/feed だら@Crieit開発者の投稿 - Crieit Crieitでユーザーだら@Crieit開発者による最近の投稿 2023-10-04T09:54:41+09:00 https://crieit.net/users/dala00/feed tag:crieit.net,2005:PublicArticle/18592 2023-10-04T09:54:41+09:00 2023-10-04T09:54:41+09:00 https://crieit.net/posts/iOS-Requested-but-did-not-find-extension-point-with-identifier-Xcode-IDEFoundation-IDEResultKitSerializationConverter iOSアプリのビルドでRequested but did not find extension point with identifier Xcode.IDEFoundation.IDEResultKitSerializationConverterエラー <p>iOSのFlutterアプリをビルドしていると突然 <code>Requested but did not find extension point with identifier Xcode.IDEFoundation.IDEResultKitSerializationConverter</code> というエラーがではじめた。</p> <p>調べてみてもなんか対症療法的な感じで人ぞれぞれの解決方法で明確な手順ぽいものがなさそう。困った…。</p> <p>そういえば最初に実行しようとしたときに長過ぎて止まっているような気がしたので中断したりしており、それからで始めたのでもしかしたらそれが悪いのでは…と思い腰を据えて実行後待ってみると普通に実行できた。自分のせいだった。</p> <p>一度それをやるとその後全部エラーになるので、何か途中で止めることでビルド環境がおかしくなってしまうっぽい。そうなったら一度cleanしたりして再度ビルドする必要がある。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18557 2023-08-24T22:27:40+09:00 2023-08-24T22:27:40+09:00 https://crieit.net/posts/Next-js-Cloud-Run-The-request-failed-because-either-the-HTTP-response-was-malformed-or-connection-to-the-instance-had-an-error Next.js+Cloud RunでThe request failed because either the HTTP response was malformed or connection to the instance had an errorがでる <p>Next.jsを使って構築したサービスをCloud Runで動かしていると、ある時から503エラーが出るようになった。エラーメッセージは <code>The request failed because either the HTTP response was malformed or connection to the instance had an error</code></p> <p>利用者さんによるととにかくエラーが頻発するらしい。</p> <p>OpenAIのAPIを使っていたのでもしかしたらそれかも…と思ったが、どうもそうでない場合もエラーが出たり、色んなところが重くなったりと、変な感じだった。</p> <p>一応Cloud Runのエラーログにドキュメントへの誘導があるので見てみたが分からなかった。</p> <p>どうしてもわからないのでとにかく解決したい一心でひたすらログを追ってみることにした。するとなんとなく原因がわかってきた。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18442 2023-06-01T15:35:19+09:00 2023-06-01T15:35:19+09:00 https://crieit.net/posts/Twitter-64783c27d7c13 個人開発でTwitter広告を使っていい感じになった例 <p>時々Twitter広告を使ってみたけど全然だった、という話をよく見ますが、最近僕も使っていてなんとなくいい感じに運用できている気がするので紹介します。とにかく、Twitter広告は超おすすめなサービスだと思っています。</p> <h2 id="Twitter広告を使ってるサービス"><a href="#Twitter%E5%BA%83%E5%91%8A%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">Twitter広告を使ってるサービス</a></h2> <p>AIバトラーというChatGPTのAI審判がバトルを判定してくれる異能力バトルゲームを運営しているのですが、そちらの集客のため利用しています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ai-battle.alphabrend.com/">AIバトラー</a></p> <h2 id="何がそんなにおすすめなのか"><a href="#%E4%BD%95%E3%81%8C%E3%81%9D%E3%82%93%E3%81%AA%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AA%E3%81%AE%E3%81%8B">何がそんなにおすすめなのか</a></h2> <p>Twitter広告は他の広告サービスと異なるところがあります。それは…、そう、広告がツイートなのです!</p> <p>つまり、広告が表示され、それをユーザーがクリックして流入を得ることができるだけでなく、いいねやRTによってさらに集客力が加速するのです。しかもその場合、どうもクリック単価が安くなるっぽいのです。実際どうなのかはわかりませんが、もしかしたら広告として表示した場合以外のクリックには料金がかからないのかもしれません。</p> <p>実際どうなのかぼくもあまり良く仕組みはわかっていません。ただ、広告を始めたばかりの頃はクリック単価100円とか200円とかかかっていました。1日1000円の予算でやっているので、4,5回クリックされたらもうそれで終わりです。一瞬で1000円が溶けます。月あたり3万円です。</p> <p>ところが今はクリック単価数円です。1000円で流入が当時の100倍くらいになっています。</p> <p>どの広告サービスも予算内でなるべく多くの流入になるよう徐々に調整してくれます。Twitter広告はその効果が半端ないのです。続ければ続けるほど効率がと効果が上がっていきます。</p> <p>とにかく、自分で育てていく広告サービス、とでもいうのでしょうか。僕もみんなの体験談や、時々5000円くらい使って試した経験からTwitter広告はむちゃくちゃ高い、という印象しかなかったのですが、今回じっくり使ってみて完全にその印象はくつがえりました。やばいサービスです。</p> <h2 id="コツ"><a href="#%E3%82%B3%E3%83%84">コツ</a></h2> <p>だからこそ色々とコツはある気がします。適当な広告を出していても多分うまく行かないパターンはあると思います。</p> <h3 id="興味を引きやすい広告にする"><a href="#%E8%88%88%E5%91%B3%E3%82%92%E5%BC%95%E3%81%8D%E3%82%84%E3%81%99%E3%81%84%E5%BA%83%E5%91%8A%E3%81%AB%E3%81%99%E3%82%8B">興味を引きやすい広告にする</a></h3> <p>これはどの広告サービスを使う場合も同じだと思いますが、特にTwitter広告の場合はいいねやRTしてもらいやすそうな、Twitterで過ごしているユーザーの興味を引くようなツイートを作りましょう。</p> <p>例えばすごい! と思うような動画や画像をつけることも良いですし、面白いツイートの内容でも良いと思います。僕の場合は完全にChatGPTの流行りに乗った感じです。</p> <h3 id="ターゲッティングを調整する"><a href="#%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B">ターゲッティングを調整する</a></h3> <p>Twitter広告を始めてみるとわかりますが、かなりターゲッティング方法がバラエティに富んでいます。例えば下記のような基本的な項目。</p> <ul> <li>性別</li> <li>年齢</li> <li>居住地</li> <li>Android、iOS</li> <li>ユーザーの興味関心</li> </ul> <p>その他にも特定の機種、キーワード、面白いのがフォロワーが似ているアカウント、というもので、あるTwitterアカウントを指定するとそのユーザーのフォロワーに似ている人がターゲッティングされます。僕もAIやChatGPTについてよく発信している人をターゲッティングしています。(あわよくばそのインフルエンサーに届いて利用してもらえたらいいなとかも思いました)</p> <p>とにかく一度この辺は試してみると面白いです。</p> <p>その他、場所としても検索結果に表示するなどの設定もあったりします。なのでこのターゲッティング方法を逆に利用して宣伝しやすいサービスを作ってみる、というのも面白いかもしれません。逆に言うと、サービスを作る上でどうやって集客を行うか? このあたりの知識を深めるためにも一度やってみるのがおすすめです。集客方法を知らないのにむやみにサービスを作っても利用してもらえなければ悲しいです。</p> <h2 id="そもそも個人開発サービスで広告使うのってどうなの?"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E5%BA%83%E5%91%8A%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F">そもそも個人開発サービスで広告使うのってどうなの?</a></h2> <p>どう思われますか? 僕は以前は微妙だな…と思っていました。やはりお金がかかって大変だし、可能であればうまいことやってバズらせて無料でガンガン集客できる方法を編み出して集客したい、と思っていました。売れてるサービス開発者のようにかっこよくサービスを流行らせたいです。</p> <p>でも実際やってみて、それはほとんど絵空事であると思っています。もちろんそのやり方でうまくいく場合もあると思いますが、稀です。たとえたまたまTwitterでバズってむちゃくちゃいいね&RTされたとしても、その後うまく運用できなければ一瞬輝いたようにみえるだけど終わってしまうサービスもいくつもあったと思います。うまくいった人はうまくいったとそれを正解のように言いますが、じゃあ全部うまくいくかというとそうではありません。その人達も色々やって、うまくいくものもいかないものもあるのです。(もちろんうまくいくものをそうやって作れる人はそれなりに確率をあげる方法を知っているので間違いということもありません)</p> <p>まず自分はちっぽけな存在であることを認識する必要があります。自分はそんな世の中に影響力を持った人間ではありません。何もせずにガンガンサービスを使ってもらうことなんてできません。</p> <p>じゃあどうやってサービスを使ってもらうのか? やはり行き着くところは広告です。</p> <p>そもそも個人開発サービスでうまく行かない理由の一つに、自分のサービスを使いたいと思うであろうユーザーに届かないということなのです。サービス集客のためにTwitterのフォロワーを増やすとかみんなやると思いますが、それではユーザーには届きません。自分をフォローしてくれている人にしか届かないのです。Twitterのつながりは、サービス開発者とユーザーとの関係では無いのです。ぶっちゃけ意味がありません。</p> <p>広告はその問題を解決してくれます。設定により、ダイレクトに自分のサービスをユーザーに届けることができます。しかも流行り廃り関係なく、利用していればいつでも届けてくれます。この効果はとても大きく重要なものです。</p> <h2 id="利用するときのコツ"><a href="#%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E3%82%B3%E3%83%84">利用するときのコツ</a></h2> <p>とはいえ広告です。お金がかかります。大事なことは <code>広告利用料金 < 収益</code> を目指すことです。これができなければひたすら赤字のため意味がありません。つまり、収益化する方法がある、というのは大前提になります。収益化する方法が無いのに広告で集客してもひたすらお金を捨てるだけです。</p> <p>ちなみにこれはすぐに達成できなくても構いません。例えばですが、リリース当初 <code>広告利用料金 > サブスクリプション収益</code> となってしまっていても、毎月の解約率が100%でないかぎり、いつか逆転する可能性があります。そこまで含めて計算しましょう。とはいえ、情勢や見込みユーザーの現象により必ずしもサブスクリプション契約数が毎月同じだけ増えるとは限りません。最近これくらいのスピードで成長してるからだいたいこれくらいには達成できるだろう…という計算はよく裏切られます。その場合は達成できなくなる可能性があります。広告を使う以上、続けるか、終わるか、判断を迫られる時もいつかは来ます。</p> <p>僕のサービスもOpenAIのAPIをつかっているので突然諸々の収益方法が停止されられたりしたらひたすら広告費も含めた経費だけが膨れていくため、すぐに停止しないと大変なことになります。そういったことも想像しておくことが必要です。</p> <p>お金を使って貰う場合は買い切りとサブスクリプションがありますが、これはどちらでも良いと思います。ただ、買い切りの場合はサブスクリプションと違って自動的に継続はされないので、何度も購入してもらえる魅力的な商品を売ってファンになってもらう必要はあると思います。リピーターになってくれる人がほとんどいない買い切りサービスなどは運営は厳しいのではないかと思います(もちろんそれでも収益のほうが高い状態を維持できるのであれば問題ないかもしれませんが)</p> <p>とにかく、毎月しっかり計算をしましょう。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Twitter広告ほんと最高でおすすめです。おじいちゃんになっても使い続けたいサービスです。</p> <p>…とはいえやっぱ最初は高いし実際どうなるかやってみるまでわからないので新しい広告を作る時は怖いと思います。</p> <p>また、途中も色々書きましたがうまく行かないパターンも多いと思います。その場合は最悪の場合サービスを止めたり終了する勇気も必要です。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18419 2023-03-30T08:43:21+09:00 2023-05-04T10:59:17+09:00 https://crieit.net/posts/ChatGPT-API ChatGPTのAPIを使ってサービスを作る時に気をつけること <p>先日ChatGPTのAPIを使って作ったサービス <a target="_blank" rel="nofollow noopener" href="https://ai-battle.alphabrend.com">AIバトラー</a> をリリースしましたが、その時に色々問題があってサービスを一時停止したりなどしていますのでサービスを作る時に注意する点をまとめておきます。</p> <h2 id="上限解放申請をしておく"><a href="#%E4%B8%8A%E9%99%90%E8%A7%A3%E6%94%BE%E7%94%B3%E8%AB%8B%E3%82%92%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F">上限解放申請をしておく</a></h2> <p>ChatGPTにはデフォルトで月120ドルまでの利用上限がついています。予想以上のアクセスがあった場合にはこれによってサービスが止まってしまい、どうしようも手の打ちようがなくなってしまいます。</p> <p>申請することで上限解放することができます。使う使わないにしろ事前にやっておきましょう。下記画面のRequest increaseでできます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6424c9b951e9a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6424c9b951e9a.png?mw=700" alt="image.png" /></a></p> <p>費用の上限を決めたい時は別途それの設定もありますので問題はありません。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6424c9d330977.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6424c9d330977.png?mw=700" alt="image.png" /></a></p> <h2 id="節約する"><a href="#%E7%AF%80%E7%B4%84%E3%81%99%E3%82%8B">節約する</a></h2> <p>最初は適当に作ってしまいがちですが、トークンを節約する方法も最初から意識しておきましょう。英語で指示を出すとか、無駄な文言をなるべく省くなどで節約できます。</p> <p>ただ僕の場合は英語で指示を出すと英語で返答が返って来てしまうため英語は断念しました。英語で返答を求めても時々だめでした。</p> <h2 id="お金がかかりすぎた時のことも考えておく"><a href="#%E3%81%8A%E9%87%91%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8A%E3%81%99%E3%81%8E%E3%81%9F%E6%99%82%E3%81%AE%E3%81%93%E3%81%A8%E3%82%82%E8%80%83%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F">お金がかかりすぎた時のことも考えておく</a></h2> <p>APIを使いすぎると当然お金がかかります。月に何十万はらうしかなくなる可能性もあります。実際に120ドルの制限にひっかかってしまいましたし他の方も同様のことになっている例をいくつか見かけたためわりと現実的に起こりえます。このあたりは実際にそうなったときのことを一応考えておきましょう。</p> <p>僕もそうでしたが普通は簡単に払えないと思いますのでサービスを停止することになるかと思います。悲しいですがどうしようもありません。</p> <p>僕の場合は有料機能として復旧させようと思っていますが、決済周りの準備も必要ですのですぐ始動できるよう何かしら事前に準備をしておいたほうが良かったと思います。</p> <p>人気が出たら売却、という方法もあるかもしれませんが、売却する側としてもそこまでお金がかかるサービスは買いにくいと思います。他人になんとかしてもらうのではなくなにかあったら全部自分でどうにかするという気持ちが必要です。</p> <p>事業としてやるのであれば予めマネタイズを考えておいたほうが良いでしょう。</p> <p>ユーザーにAPIキーを発行してもらってそれを登録させて使わせる、という案もあるようですが、セキュリティ的にはやめた方が良いと思います。ユーザーが勝手に別で漏洩して利用料が増えたときも自分のせいにされる可能性もあります。</p> <h2 id="次のサービスも作れない"><a href="#%E6%AC%A1%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%82%E4%BD%9C%E3%82%8C%E3%81%AA%E3%81%84">次のサービスも作れない</a></h2> <p>無料枠を使い切ってしまっているため、同様にChatGPTのAPIを使ったサービスを作ろうと思うと最初からお金がかかってしまうため気軽に作ることができなくなります。僕も簡単なサービスを2個順次リリースする予定だったのでお蔵入りになってしまいました。食材を入力するとレシピを考えてくれるサービスです。</p> <p>とにかくマネタイズをしっかり意識しないとリリースすらできなくなるので気をつけましょう。APIの利用は簡単なのですが敷居が低いのか高いのか…。</p> <h2 id="アプリ化を検討する"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E5%8C%96%E3%82%92%E6%A4%9C%E8%A8%8E%E3%81%99%E3%82%8B">アプリ化を検討する</a></h2> <p>スマホアプリだと手軽にリワード広告が使えます。1回の処理がをリワード広告の平均報酬を超えていれば問題ありませんので、気にせずサービスを展開することができます。もちろん広告がうっとおしいというユーザーのためにサブスクリプションも用意しておくと良いでしょう。<br /> Webよりもアプリの方が手軽にものづくりしていけそうな気がします。ただし最初に使ってもらう手軽さとしてはインストールがない分Webの方が有利かもしれませんので、最初はWebでテストして、その後アプリに移行していくというのもよいかもしれません。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ChatGPTだけでなくお金がかかるAPI全般に言えることではあると思いますが、とにかく思った以上にお金がかかるようなので注意です。</p> <p>面白いものが簡単に作りやすいからこそ、廃止なのか、有料にするのか、を後で考えるのはなかなかつらいです。</p> <p>該当のゲームはこちらです。 <a target="_blank" rel="nofollow noopener" href="https://ai-battle.alphabrend.com">AIバトラー</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18414 2023-03-24T21:07:32+09:00 2023-04-17T08:28:48+09:00 https://crieit.net/posts/Expression-produces-a-union-type-that-is-too-complex-to-represent Expression produces a union type that is too complex to represent エラーが出た時 <p>Next.jsでChakra UIを使っている時に <code>Expression produces a union type that is too complex to represent.</code> というエラーが出た。調べてもよくわからなかったが、TypeScriptをバージョン5からバージョン4.9.5にダウングレードしたら発生しなくなった。</p> <p>参考)<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/chakra-ui/chakra-ui/issues/3714">https://github.com/chakra-ui/chakra-ui/issues/3714</a></p> <p>追記)<br /> 改善されたアプデがされてるっぽいのでTypeScriptもChakra UIも最新にしとけばいけるのかも</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18384 2023-02-07T08:35:30+09:00 2023-02-07T08:35:30+09:00 https://crieit.net/posts/DALL-E DALL-Eでイラスト生成してみた <p>OpenAIの画像ジェネレータであるDALL-Eを使ってみた。こんな感じで画像が生成される。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18d92d7dbc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18d92d7dbc.png?mw=700" alt="image.png" /></a></p> <p>ちょっと前は順番待ちだったらしいがいまはすぐに使えた。</p> <p>こんな感じでテキストを入力する。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18dc928441.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18dc928441.png?mw=700" alt="image.png" /></a></p> <p>ちなみに生成した画像は剣を持って背景が白で猫が3匹いるMagic the Gathering風の画像、というのを英語で書いたもの。</p> <p>無料枠として初回50、次月以降は15クレジットが付与されるらしい。1回生成すると1クレジット減り、4枚生成される。</p> <p>減っていく悲しきクレジット</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18eb22007e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a63e18eb22007e.png?mw=700" alt="image.png" /></a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18363 2023-01-12T08:33:16+09:00 2023-01-12T11:28:28+09:00 https://crieit.net/posts/ChatGPT ChatGPTはインターネットを壊すかもしれない <p>ChatGPTを使うと文章で質問してプログラムコードを教えてもらうことができるというツイートを見た。</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">もはやChatGPTでプログラミング学習が出来るのではないかというレベル。検索エンジンよりも的確で早いので、あれなんだっけ?はこれでかなり解決しそう。 <a target="_blank" rel="nofollow noopener" href="https://t.co/va3QocSoKO">pic.twitter.com/va3QocSoKO</a></p>— Ryuichi Hayashi (@drapon) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/drapon/status/1613087668166098948?ref_src=twsrc%5Etfw">January 11, 2023</a></blockquote> <p>見た感じわかりやすいし「あれ、何だっけ?」というど忘れを調べるのにはこれで十分な気もする。検索エンジンで調べる必要も無さそう。</p> <p>こうなってくるとTwitterのTLでも将来的にこういったAIが検索エンジンと置き換わっていくのではといったつぶやきも見かけるが実際のところどうなんだろう。</p> <p>もし置き換わったと仮定して、みんなが調べ物はChatGPTで行うようになると、それはそれで問題な気がしてくる。というのもChatGPTは多分インターネットの膨大な情報から情報を取得して学習させていると思うのだが、本来その情報の価値を生み出したのはChatGPTではなく、元の情報をアウトプットした人たちだ。</p> <p>知識の薄いアフィリエイターたちが適当に書いた情報はゴミにしかならないが、元々自分のブランディングのためか、趣味か、記事から収入を得ようとした人たちがしっかり書いた有益な記事がソースとなっているのだろう。それをChatGPTがわかりやすくまとめてくれている。</p> <p>しかしもし人々が検索するメインの方法がChatOGPに置き換わったとしたら、そういう人たちは元々得ようとしていたメリットを失ってしまうことになる。誰もサイトにアクセスしてくれなければブランディングもできず、収入も得ることができない。そうなると書くこと自体をやめてしまうことになる。</p> <p>インターネット上で情報をアウトプットしてくれる人たちがそうやって減っていってしまった場合、未来のChatGPTは情報源に困ることになる。新しい有益な情報が見つけにくくなり、プログラムの話に限れば有益な情報が公式ドキュメントにしか無い、なんてこともでてくる可能性がある。インターネットが衰退してしまう要因となりえる。</p> <p>絵を書いてくれるNovelAIに関しても同じようなことが言えるかもしれない。</p> <p>多くの偉大な絵師が描いた絵を元に学習していると思うので、どれだけAIによる絵が進化したとしてもその土台をないがしろにすることはできない。しかし実際問題、絵師すらもAIにより絵を描く効率化の必要性を説いている人もいる。</p> <p>そうなるとどうなるかというと、元々世界には100%人によって書かれていた絵があったが、その割合が現在もどんどん減っている状況だろう。今度は将来的にAIはその自分の描いた絵からも絵の書き方を学習してしまうことになる。だんだんと違いのよくわからない、よくあるような感動の少ないいつもの感じの絵ばかりが生成されるようになっていく可能性もある。もちろんそれは役に立ち人々を感動させるのかもしれないが、確実にオリジナリティが薄れていくだろう。</p> <p>生物に例えるとそうやって多様性が失われる場合、何かしらの災害や病気に耐えきれず絶滅する可能性だってある。</p> <p>ChatGPTやNovelAIはとんでもなく素晴らしい技術を使っているが、それの普及は終わりの始まりにも見える。</p> <p>ではどうしたら良いのだろう?</p> <p>ChatGPTとしては情報源が貴重な財産。それは壊すことは望ましくない。そうなるとなんとしても今まで通り多くの人に情報をアウトプットしてもらう必要がある。</p> <p>そうなると、アウトプットする人たちにインセンティブを与えてでも情報の増加を推進していく必要があるかもしれない。例えばだが多くの分野でアウトプットのコンテストなどが行われる可能性はあるかもしれない。プログラミング周辺の話でいうと、いつもQiitaがやっているアドベントカレンダーをChatGPTの運営元も実施することになり、Qiitaよりも良い報酬が与えられるようになるかもしれない。もしくは自分のサイトをChatGPTに登録して提携するだけで、広告などサイトに設置しなくてもアウトプットをすればするほど勝手に報酬が振り込まれるようになるかもしれない。それはちょっと面白そう。</p> <p>また、AIによる情報の生成もあえて異質なものを加えて突然変異を生み出すような仕組みを導入するのかもしれない。文章は正確さが必要だろうと思われるためそういったものは邪魔にしかならないが、絵などは特に。(まあもうそういうのは考慮されてるかもしれないので無知な人の戯れ言ではあるが)</p> <p>この先どうなっていくのだろう? よくあるSFのストーリーだと人間は違いがあるから多くの悲しみがあるのであって、みんな感情をなくして、みんな同じような能力に変えることで差別や苦しみをなくす、といった話もある。もちろんそれは極端だし生物をそんなうまいこと変えるのは大変だと思うのであくまでもSF的な話だが、情報については全然ありえる話だなと思う。</p> <p>ということでただの独り言です。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18324 2022-11-30T08:26:08+09:00 2022-11-30T08:26:08+09:00 https://crieit.net/posts/Google-Play-REQUEST-INSTALL-PACKAGE Google PlayからREQUEST_INSTALL_PACKAGEの許可を外せと言われてアプリを却下された時 <p>Google Playでいつも通りアプリのアップデートを申請していたらリジェクトされました。その内容が、REQUEST_INSTALL_PACKAGEは使って無さそうだからpermissionを外せ、とのことでした。</p> <p>調べてみましたが特に使っているところはなく。恐らく使用しているパッケージの中に使っているものがあるのだろうと思って調査。</p> <p><a href="https://crieit.now.sh/upload_images/b8a4463b900416895a215b155a56d9bc6386940e8c7b8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b8a4463b900416895a215b155a56d9bc6386940e8c7b8.png?mw=700" alt="persmission_before.png" /></a></p> <p>あー…、ありました。Flutterのbuildフォルダ内を検索してみると見つかりました。調べてみるとどうも open_file というパッケージデ使われているようでした。</p> <p>外部パッケージなので対処しようがないのかな…と更に調べてみると、REQUEST_INSTALL_PACKAGEを外しただけの open_file_safe というパッケージがあるらしく、そちらに置き換えることで対処できました。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a638694e1cea87.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a638694e1cea87.png?mw=700" alt="image.png" /></a></p> <p>このように問題なくなりました。(ビルドのゴミがあるのでこれは手動で削除してよさそうです)</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18309 2022-10-28T11:44:15+09:00 2022-10-28T11:44:15+09:00 https://crieit.net/posts/Flutter-card-swiper Flutterのcard_swiperで独自のアイコンを使うにはどうしたらいいか <p>ページ移動のボタンアイコンはSwiperControlというものをSwiperに指定している。これにはIconDataしか設定できない。</p> <p>ただこのSwiperControlは勝手に作れるので元のソースをコピーして自分で作って単なる画像を表示できるようにすればいいだけ。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/TheAnkurPanchani/card_swiper/blob/master/lib/src/swiper_control.dart">https://github.com/TheAnkurPanchani/card_swiper/blob/master/lib/src/swiper_control.dart</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18302 2022-10-03T20:23:11+09:00 2022-10-03T20:23:11+09:00 https://crieit.net/posts/mac-downshift macでdownshiftを使うと変換時の確定がおかしい <p>macでdownshiftを使うと、変換中にEnterキーで入力を確定するとその時点でdownshiftに確定が伝播されてしまい、タグの入力が確定してしまう。</p> <p>原因としてはcompositionendイベントがうまく発火していない、もしくは内部で正しく処理できていないため。</p> <p>そのためdownshiftのonKeyDownイベントにて、isComposingをチェックして変換中かどうかをチェックして処理を行う必要がある。</p> <pre><code class="typescript"> onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => { if (e.key === 'Enter' && !e.nativeEvent.isComposing) { e.preventDefault() setText({ name: inputText }) } }, </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18293 2022-09-08T11:45:14+09:00 2022-09-08T11:45:14+09:00 https://crieit.net/posts/unzip さくらの共用レンタルサーバーでunzip <p>さくらのレンタルサーバー内でunzipしたところ、どうも元々のファイルに日本語のフォルダが含まれていたようで、文字化けしてしまいうまくいかなかった(ちなみに圧縮元はLinux)。</p> <p>調べてみると <code>unzip -O CP932</code> みたいな感じでSJIS指定で解凍すればOKとのことだが、どうもさくらのサーバーはFreeBSDということが関係してか、<code>-O</code> オプションがない。</p> <p>ということで調べてみると下記のiconvを内蔵したunzipを作ってくれている人がいたのでこれを使ってみた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/m13253/unzip-iconv">https://github.com/m13253/unzip-iconv</a></p> <p>詳しい使い方はunzip60というフォルダの中のINSTALLというファイルに書かれている。</p> <p>まずgit clone で取得したあと、中にunzip60というフォルダがあるのでそこに入る。その中にunixというフォルダがあるのでその中のものをunzip60直下にコピーする。そして <code>make</code> 。</p> <p>しかし何か色々とメッセージが出るのでよくわからないがそれに従い <code>make generic</code> と実行するとビルドされた。<code>unzip</code> というファイルが生成されているのでそれをパス指定で実行すれば良い。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18263 2022-07-27T20:14:00+09:00 2022-07-27T20:14:00+09:00 https://crieit.net/posts/Next-js-Google Next.jsでGoogle広告のコンバージョンが測定できないとき <p>Next.jsで作ったサービスでなぜか全然コンバージョンが測定できなかった。トリガーはURL。</p> <p>やり方としてはタグマネージャを使って測定を行っている。タグマネージャのプレビューでは正常にトリガーが働いている。しかしGoogle広告側のコンバージョンテストを行ってみると正常に反映されない。</p> <p>結局、router.pushでページ遷移するのをやめ、location.hrefに変更するとうまく取れた。よくわからないがタグマネージャのプレビューでも全部のタイミングで発火しているわけではなかったのでこんな感じにしないと発火するタイミングにならないのかもしれない。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18244 2022-07-17T11:29:34+09:00 2022-07-17T11:29:34+09:00 https://crieit.net/posts/Windows-nvm-node-firebase-tools-Unexpected-token Windowsのnvmのnodeでfirebase-toolsを入れようとしたらUnexpected token '.' エラー <p><code>npm install -g firebase-tools</code> を実行してインストールしようとしたら下記のようなエラーが出た。</p> <pre><code class="plain">npm ERR! Unexpected token '.' </code></pre> <p>調べてみたらどうもWindowsのnvmのバージョン1.1.7以下を使っている場合に発生してしまうらしい。</p> <p>ということで</p> <ol> <li>nvm最新をインストール</li> <li>Nodeの該当バージョンをアンインストール</li> <li>Nodeの該当バージョンを再度インストール</li> </ol> <p>で解決するとのこと。nvmだけでなくNodeも入れ直さないといけないっぽい。</p> <p>参考)<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/firebase/firebase-tools/issues/4134">https://github.com/firebase/firebase-tools/issues/4134</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18236 2022-07-13T09:22:27+09:00 2022-07-13T09:22:27+09:00 https://crieit.net/posts/flutter-launcher-icons-minSdk flutter_launcher_iconsでminSdkが見つからないエラーが出る <p>Flutterでflutter_launcher_iconsを使ってアイコンを生成しようとすると、下記のようなエラーが出た。</p> <pre><code class="plain">Cannot not find minSdk from android/app/build.gradle or android/local.propertiesSpecify minSdk in either android/app/build.gradle or android/local.properties </code></pre> <p>最近のFlutterプロジェクトはbuild.gradleに変数で値が仕込まれているためだと思われる。</p> <pre><code class="plain"> minSdkVersion flutter.minSdkVersion </code></pre> <p>なのでメッセージも書かれている通り android/local.properties に値を書き込んでおく。</p> <pre><code class="plain">flutter.minSdkVersion=21 </code></pre> <p>参考<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/fluttercommunity/flutter_launcher_icons/issues/371">https://github.com/fluttercommunity/flutter_launcher_icons/issues/371</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18229 2022-06-20T00:07:10+09:00 2022-06-22T13:24:17+09:00 https://crieit.net/posts/7c045f1367597bbed93ffcea6d3a40e2 一つのサービスかたくさんのサービスか <p>個人でサービス(アプリ含む)を作る時には2通りのやり方がある。それは一つのサービスに集中して開発するか、たくさんのサービスを作っていくか。どちらのパターンにどういうメリットとデメリットがあるかつらつらと書いてみる。ちなみに僕はとにかくたくさん作って特に何も成功していないという事例。</p> <h2 id="体験できることのバリエーション"><a href="#%E4%BD%93%E9%A8%93%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E3%83%90%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">体験できることのバリエーション</a></h2> <p>サービスを作ると色々なことを体験できる。その体験できることのバリエーションは、当然サービスをたくさん作る時のほうが多い。サービスによって必要な集客方法が違ったり、Webサービスやスマホアプリを作ってみたり、開発時に試行錯誤しないといけない箇所が違ったり。</p> <p>また、集客をした時の効果や反応も異なる。特にスマホアプリの場合は同じように作って同じように集客したりしているだけなのに全く利用者数が異なってきたりする。こういった内部の実情は実際に色々と作って試してみないと体験できないことでためになる。</p> <p>一つのサービスしか作っていない場合はこういった部分での体験できるバリエーションは少なくなる。</p> <h2 id="集中度"><a href="#%E9%9B%86%E4%B8%AD%E5%BA%A6">集中度</a></h2> <p>ただし一つのサービスだからこそ得られることもある。うまくいかない時に思考錯誤することに集中してあれこれやってみることは一つのサービスのほうがやりやすい。</p> <p>たくさんのサービスを作ってしまうと、全てに対応しきれなくなってしまう。僕もスマホアプリをいくつか運用している中でいくつかのアプリで問い合わせが来るのだが、全然対応しきれていない。やらないといけないことが多すぎるので、どうしても優先順位を定めて行う必要が出てくる。そのためアクセスの少ないアプリなどはほとんどなにもできず放置じょうたいとなってしまう。使ってくれるユーザーの声は届くのに何も貢献できない状態が続き、心が痛む。こういう時に一つのサービスにじっくり集中できたらな…と感じる。</p> <h2 id="成功する確率"><a href="#%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E7%A2%BA%E7%8E%87">成功する確率</a></h2> <p>サービスに人が集まって十分な収益化もできて成功する確率はどちらが高いのか。これは成功してないのでよく知らないがどちらとも言えないと思う。</p> <p>色々な開発者を見ていると、一つに集中してうまく収益化できている人もいるし、たくさん作ってようやくガッツリ成功している人もいる。また、成功してもたくさん作っている人もいる。</p> <p>そもそも成功すること自体が難しいのだから、どちらのパターンで作ればOKという答え自体この世には存在しない。どうやって成功するのか、それは自分で考えて、やってみて実際に到達してみるしかない。誰かが成功したパターンが自分に当てはまるということもない。全く同じものを作って同じように運用してみても同じ様になるとは限らない。とにかくやってみるしかない。</p> <p>もちろん、そのサービスを誰が利用したいのかまわりからみて明らかに全然わからない、という場合も存在するかもしれない。それに盲信的に開発し続けるのは危険な可能性はある。ひたすら無駄に時間を失ってしまう。しかし意外とそれが成功してしまうパターンもあるかもしれない。客観的な目でしっかり色々な点を見つめ、自分で考えるしかない。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>何もわからん</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18200 2022-05-29T10:37:53+09:00 2022-05-29T10:37:53+09:00 https://crieit.net/posts/Targeting-S-version-31-and-above-requires-that-one-of-FLAG-IMMUTABLE-or-FLAG-MUTABLE-be-specified-when-creating-a-PendingIntent Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntentエラー <p>FlutterでtargetSdkVersionを31にしたアプリを実機で試してみたらいきなり落ちてしまった。ログを見てみると下記のようなエラー。</p> <pre><code class="plain">Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent </code></pre> <p>調べてみると色々記事が見つかり、どうもFirebaseやAdMobのライブラリが関係していてみんな困っていた。とはいえそれらの情報は2021年の情報だったので、2022/5現在はさすがに改善しているのではないかと思いそのあたりのライブラリを最新にしてみたら起動するようになった。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18197 2022-05-24T09:09:10+09:00 2022-05-24T09:12:51+09:00 https://crieit.net/posts/Flutter-Hive-type-UnspecifiedInvalidResult-is-not-a-subtype-of-type-LibraryElementResult-in-type-cast FlutterのHiveで type 'UnspecifiedInvalidResult' is not a subtype of type 'LibraryElementResult' in type cast エラー <p>FlutterのHiveでbuild_runnerしたところ下記のようなエラーが出た。</p> <pre><code class="plain">type 'UnspecifiedInvalidResult' is not a subtype of type 'LibraryElementResult' in type cast [SEVERE] hive_generator:hive_generator on lib/models/message.dart: </code></pre> <p>調べてみたところいくつかの箇所で一旦pubspec.lockを削除したらいける、とのことで試してみたらなおった。依存関係が更新されてしまうのでちょっと怖いが。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/google/json_serializable.dart/issues/924">https://github.com/google/json_serializable.dart/issues/924</a></p> <p>追記)やっぱ仕様変更したライブラリがあって困ったがそれはまた別の話…</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18166 2022-04-11T23:43:19+09:00 2022-04-15T16:49:25+09:00 https://crieit.net/posts/Flutter-62543e877f391 Flutter用問い合わせフォームウィジェット&サービスを作った <p>Flutter用の問い合わせフォームのウィジェットを簡単に設置できるパッケージ及び連携サービス Contact Nite を作りました。</p> <p><a href="https://crieit.now.sh/upload_images/8c23e18a7a344fca6bd592674e642b446252e63476ec0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8c23e18a7a344fca6bd592674e642b446252e63476ec0.png?mw=700" alt="card.png" /></a></p> <p>上記画像のように簡単なコードを設置するだけで、サービス上で設定した項目通りの問い合わせフォームウィジェットを表示することができます。また、<br /> 送信された問い合わせはサービス上で確認することができるようになっています。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6252ee397f453.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a6252ee397f453.png?mw=700" alt="image.png" /></a></p> <p>サービス<br /> <a target="_blank" rel="nofollow noopener" href="https://contact-nite.com/ja">https://contact-nite.com/ja</a><br /> パッケージ<br /> <a target="_blank" rel="nofollow noopener" href="https://pub.dev/packages/contact_form">https://pub.dev/packages/contact_form</a></p> <p>無料プランもありますので気になる方は是非試してみてください。僕も自分のアプリに入れて試してみています。</p> <p>問い合わせが来るとメール及びSlack通知を行うことができます。そのうちサービス内で直接問い合わせ下ユーザーとやり取りができるようにしてみようと思っています。</p> <h2 id="技術的な話"><a href="#%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AA%E8%A9%B1">技術的な話</a></h2> <p>パッケージ自体は純粋なFlutterパッケージです。サービス側は今回 Next.js, PlanetScale, Cloud Run を利用しました。</p> <h3 id="PlanetScale"><a href="#PlanetScale">PlanetScale</a></h3> <p>丁度開発している途中で知った、MySQLサービスです。最近記事も書いたので良ければ見てみてください。</p> <p><a href="https://crieit.net/posts/MySQL-PlanetScale-Next-js-Prisma">サーバーレスMySQLのPlanetScaleをNext.js+Prismaで使ってみた</a><br /> <a href="https://crieit.net/posts/Prisma-PlanetScale">PrismaでPlanetScaleを使う時のエラーあれこれ</a></p> <p>ここ最近はずっとFirestoreを使ってサービスを作っていました。安くて容量が大きいとなるとこれくらいしかなかったためです。ところがPlanetScaleを知りそちらに乗り換えてみることにしました。とにかく容量が大きいというのが決め手です。本当はMySQLの方が好きなので僕にとっては嬉しいサービスです。</p> <p>まだリリースしたサービスで利用した経験が無いのでどうなるかわかりませんが、これから見ていこうと思っています。問題なければこれからの僕の定番になりそうです。</p> <h3 id="Next.js"><a href="#Next.js">Next.js</a></h3> <p>Next.jsで作っています。サーバー側もNext.jsのAPI Routesです。もうとにかく楽ちんですね、サーバーサイドとフロント側の連携とか、何も考えなくて良いというのは。仕事だと色々問題が出てくるのかもしれませんがとにかく個人で開発するものだと今はこれが楽すぎて他を考えられません。</p> <p>特に日本専用サービスとする必要もないためInternationalized Routingを使って日本語と英語の対応を行っています。</p> <h3 id="デプロイ"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">デプロイ</a></h3> <p>Cloud Runを利用しています。最近こればかり使っているので元々持っている資産的に楽になってきたため他を考えられません。といいつつPlanetScaleを使っているのでDBまわりで悩まなくてもいいしHerokuとかで良かったかもしれません。</p> <p>push時に連動もできるのですが、自動テストはGitHub Actionsでやったほうが超簡単なため、push→GitHub Actionsでテスト→Cloud Buildでビルド&Runにデプロイという流れをとっています。DBのマイグレーションもCloud Buildでビルドしたイメージを利用して自動化しています。</p> <p>テストはJestによるシンプルなAPIのテストと、Cypressを使ったE2Eテストを行っています。Cypressはあまり使ってないですがCypress Dashboardと連携して動画も見れたりするの面白いですね。</p> <h3 id="メール"><a href="#%E3%83%A1%E3%83%BC%E3%83%AB">メール</a></h3> <p>SendGridです。Dynamic Templatesむっちゃ楽ちんですね。SendGrid上でメールの本文を調整して簡単に送信できます。ごちゃごちゃプログラムやDB上にテンプレートを定義しなくていいので良いです。</p> <p>あとはメール受信のhookを利用して、メールも見ずにサービス上だけでやり取りできるようにもしたいなと思っています。なんかできるっぽいので。</p> <h2 id="Flutter側"><a href="#Flutter%E5%81%B4">Flutter側</a></h2> <h3 id="多言語化"><a href="#%E5%A4%9A%E8%A8%80%E8%AA%9E%E5%8C%96">多言語化</a></h3> <p>ハマりどころとして、多言語化が結構複雑でした。パッケージを作成する場合一緒に作成されたサンプルプロジェクトと連携して動作させるのですが、そのプロジェクト内だとうまくいくのに、別途他のアプリに組み込んでみたらちゃんと言語が反映されないという問題が発生したりして手こずりました。</p> <p>ちなみにFlutterはVS Code拡張Flutter Intlを使うことで簡単にローカライズできるのですが、それも使えたようです。</p> <h3 id="Freezed"><a href="#Freezed">Freezed</a></h3> <p>Freezed普通に使えたので使っています。</p> <h3 id="テスト"><a href="#%E3%83%86%E3%82%B9%E3%83%88">テスト</a></h3> <p>パッケージは公開ということもありGitHub Actionsでのテストが無料で放題なので、せっかくなので自動テストをいれてあります。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>小ネタですがサービスサイトの問い合わせフォームもWebではありますがContact Niteに送信して実現しています。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/18120 2022-02-21T21:08:44+09:00 2022-02-21T21:08:44+09:00 https://crieit.net/posts/GitHub-Actions-EACCES-permission-denied GitHub ActionsでEACCES: permission deniedが出るとき <p>GitHub Actionsでnpx prisma generateを実行するとEACCES: permission deniedというエラーが出て全然うまくいかない。</p> <p>ためしに yarn prisma generate とすると動いた。npxだとユーザーかなにかが違う…?</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/17980 2022-02-06T21:55:53+09:00 2023-01-18T10:03:42+09:00 https://crieit.net/posts/Prisma-PlanetScale PrismaでPlanetScaleを使う時のエラーあれこれ <p>PrismaをPlanetScaleで実際に利用している時にいくつかエラーが発生したのでその対処など。</p> <h2 id="routines:tls_process_server_certificate:certificate verify failed"><a href="#routines%3Atls_process_server_certificate%3Acertificate+verify+failed">routines:tls_process_server_certificate:certificate verify failed</a></h2> <p>こんなエラーがでて接続できない時。</p> <p>そもそもPlanetScaleにかかれている接続方法のDATABASE_URLの末尾にはSSL接続のために <code>?sslaccept=strict</code> というものがついている。コンテナ稼働でデプロイされていると証明書周りの問題でこのあたりがだめっぽいとのこと。</p> <p>なので解決方法としては <code>sslaccept=accept_invalid_certs</code> にすれば良いとのこと。(本当にそれでいいかは不明)</p> <p>参考)<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/prisma/prisma/issues/884">https://github.com/prisma/prisma/issues/884</a></p> <h2>Invalid <code>prisma.modelname.update()</code> invocation</h2> <p><code>modelname</code> というところには自分で作ったモデル名が入る。正確には下記のようなメッセージ。</p> <pre><code>Invalid `prisma.user.update()` invocation: The column `app.User.id` does not exist in the current database. </code></pre> <p>参考となるのはこちらのissue。なんか色々詳しく書かれているのでざっと全体的に一読しておいた方が良さそう。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/prisma/prisma/issues/7292">https://github.com/prisma/prisma/issues/7292</a></p> <p>これは何かというと、そもそも <code>foreign key constraints are not allowed</code> というエラーが出ていた。なんとPlanetScaleでは外部キーを使えないらしい。そのため下記のような設定にする必要がある。</p> <p>Prismaの方から情報を頂いたので下記が新しい情報。Prisma4.5以降、もしくは4.7以降。試してはない。</p> <pre><code class="text">datasource db { provider = "mysql" url = env("DATABASE_URL") relationMode = "prisma" } </code></pre> <p>これは古いバージョン(恐らくPrisma4.5より前)のもの。referentialIntegrityはrelationModeに代わったらしい。また、relationModeはpreviewFeaturesに関係なく使えるとのこと。</p> <pre><code class="text">generator client { provider = "prisma-client-js" previewFeatures = ["referentialIntegrity"] } datasource db { provider = "mysql" url = env("DATABASE_URL") referentialIntegrity = "prisma" } </code></pre> <p>この2行追加している <code>referentialIntegrity</code> というのは何かというと、Prisma側が外部キーの動きと同じようなことをやってくれるような設定っぽい(多分)。これでリレーションなども問題なくデプロイできるのだが、その代償としてこのupdate時のエラーが出てしまうっぽい。不具合なのか仕様なのかは謎。</p> <p>ということでこれの対処として、onUpdateにNoActionを設定する必要があるらしい。</p> <p><code>user User @relation(fields: [userId], references: [id], onUpdate: NoAction)</code></p> <p>とりあえずこれで動きはした。(外部キー的にどうなのかは未検証。あとDeleteの場合も未検証)</p> だら@Crieit開発者