無料でWebアプリを作ろう_003.py

  • 11◆jG/Re6aTC.23/05/01(月) 22:45:33

    ## 概要

    タイトルの通りWebアプリを作ろうと四苦八苦するスレ主の様子を観察し意見やアドバイスまたは茶々をいれてくれると嬉しいスレです

    一人でやってるとサボったりエタったりしそうなのでスレ立ててみました

    3スレ目

  • 2二次元好きの匿名さん23/05/01(月) 22:46:14

    このレスは削除されています

  • 31◆jG/Re6aTC.23/05/01(月) 22:47:03
  • 41◆jG/Re6aTC.23/05/01(月) 22:51:28

    あらすじ

    仮Web画面を作った

    ローカルデモデータで表示できることを確認した

    デモデータを返すWebAPIを作った

    デモデータをWebAPIから受け取って画面に表示できることを確認した

    OracleCloud上に用意したデモデータをWebAPI内で取得してデータとして整形して返すようにしよう←今ココ

  • 51◆jG/Re6aTC.23/05/01(月) 22:58:31

    うん?
    そういえばjsonで用意する必要ないな

    dict(辞書)形式で定義しておけば後はfastapiが勝手にjsonに変換してくれるはず(うろ覚え)
    という訳でto_jsonではなくto_dictを使う

    to_dictの場合は文字化け(アスキーコード変換)は起きなかったのでforce_asciiはオミット

    ついでに {"data": df_dict} の形式にしてよりwebapiチックにapiの返り値を定義
    よしよし、問題なさそう

  • 61◆jG/Re6aTC.23/05/01(月) 23:04:17

    ここで一度アプリ側の挙動をチェック

    問題なさそうですね

  • 71◆jG/Re6aTC.23/05/01(月) 23:23:59

    さてでは最大値最小値...の前に今アイテムに「にんじん」しかないので別データを追加します

    でないと各アイテムの最大値最小値のテストがしにくいですからね

  • 81◆jG/Re6aTC.23/05/01(月) 23:28:14

    そしてちゃんと1個ずつの値段を算出できないと最大最小の比較ができないことに気づきました

    valueを文字列にしてintにして1個ごとの単価を計算できるようにしないとだな

    ...とりあえず暫定的に全てのデモデータの個数を「1個」に固定することで対応しよう
    DBの再設計は次のトライアルに回します

    こういう時Webツールなどを使っているとちょっとした値の修正が楽にできますね

  • 91◆jG/Re6aTC.23/05/01(月) 23:41:05

    改めて最高値/最安値(最大・最小値)を出します
    df内の最大値/最小値を出すだけなら

    df["指定列"].max()

    などで出せますが、今のdfにはアイテム名問わずデータが入っているためこのまま最大値を出そうとすると全てのデータにおける最大値が出てきます

    ここで出したいのはにんじんならにんじんの中での最大値ですよね
    なのでdfをグループ分けします

    groups = df.groupby("グループ分けしたい列名")

    でグループ情報を作成することができます
    そのあと

    groups.get_group("にんじん")

    のように抽出したいグループ名(アイテム名)を指定するとこのようにそのアイテム名だけのdfができます

  • 101◆jG/Re6aTC.23/05/01(月) 23:42:36

    このようにきゅうりならきゅうりだけのdfになっていますね

  • 111◆jG/Re6aTC.23/05/01(月) 23:55:33

    あとはこれとforループを組み合わせます

    for name, group_df in df.groupby("name"):

    と書くとnameにグループ名(アイテム名)、group_dfにグループのdfが与えられた状態でループします
    その中で

    group_df['price'].max()

    のようにそのdfのprice列の最大値、最小値を指定して取得します
    上手くいったようです

  • 121◆jG/Re6aTC.23/05/02(火) 00:24:51

    あとはこれを結果dfにどう反映するかだけど...

    とりあえずこう書いてみた

    きっともっと良い実装方法がある

  • 131◆jG/Re6aTC.23/05/02(火) 00:26:06

    アプリ側で確認してみる

    ちゃんと値が反映されてました

    やりました

  • 141◆jG/Re6aTC.23/05/02(火) 00:29:27

    ついでに賞味期限が近いものから順に表示するようにしました
    これは賞味期限順にソートするだけですね

    ソートには

    df.sort_values('ソート基準にしたい列名')

    を使います

    (ついでにdatetime文字列変換処理を移動)

  • 151◆jG/Re6aTC.23/05/02(火) 00:30:26

    アプリ側で確認

    ちゃんと近いものから順に表示されてますね

  • 161◆jG/Re6aTC.23/05/02(火) 00:31:42

    キリがいいので今日はここまで

    明日はいよいよ今までローカルで動かしていたアプリをインターネットの海に浮かべてみるところまで行...けたらいいなぁ

    引き続きご感想ご意見ご質問アドバイスお待ちしております

  • 17二次元好きの匿名さん23/05/02(火) 00:45:41

    Webしらんけどクラウドで日付扱うのロケール周り面倒そう
    内部UTCで持ってクライアントで戻して表示する感じなんすかね?どこかでお漏らしそう

  • 181◆jG/Re6aTC.23/05/02(火) 01:44:32

    >>17

    コンテナで動かすつもりなんで大抵は環境変数に設定してれば大丈夫なはず


    DB - webapi(ここでtz設定) - webui(表示だけ)


    という感じですね


    クライアント(web ui)側では基本的にデータ処理はしたくないですね

  • 191◆jG/Re6aTC.23/05/02(火) 11:11:08

    今日は昼に少し時間ができたのでこの時間も少し進めます

    ある意味私が一番興味があったOkutetoの検証をしたいと思います

  • 201◆jG/Re6aTC.23/05/02(火) 11:14:02

    前提として

    Webアプリをインターネットに公開するのにはいくつか手段があります

    1. ローカルサーバでアプリを構築しインターネットに公開する
    2. インターネット上のサーバにアプリを構築し公開する
    3. 既にインターネット上で公開されているサーバにアプリを構築する

    大まかに分けてこの3つかと

  • 211◆jG/Re6aTC.23/05/02(火) 11:17:22

    1. ローカルサーバでアプリを構築しインターネットに公開する

    これは今の私の環境に一番近いです

    ローカルでのアプリ構築は終わっているのでこれを何かしらの手段でインターネット上に公開すればこれになりますね

    無料の公開手段となると「ngrok(エングロック)」が有名でしょうか

    結構簡単にできるようなのですがセキュリティ的にやや不安なところがあるので現状は「最終的に候補がなければ採用」くらいに考えています

  • 221◆jG/Re6aTC.23/05/02(火) 11:24:18

    2. インターネット上のサーバにアプリを構築し公開する

    これはいわゆるIaaS(インフラストラクチャ-アズ-ア-サービス)ですね
    インターネット上に仮想のサーバを作ってもらってそれを使わせてもらう感じです

    いわゆるサーバのまま渡されるので必要なサービスを動かすための各種セットアップをユーザー側で実施する必要があります
    メリットとしてほとんど自由にアプリなどをインストールできるため使いたいモジュールなどに合わせて細やかな設定が可能です

    反面これの無視できないデメリットとして、スペックを要求すると無料では難しくなることが挙げられますね

    無料だとメモリやストレージが低スペックだったり連続稼働時間が限られていたり...

    (ほぼ)恒久無料となると現状OracleCloud一択になりそうです
    そこでさえメモリ1G ストレージ50GB(+50GB)なのでWebサービスだけならまだしも複数サービスを動かそうとするとかなりやりくりしないと厳しそうですね

    私は個人のファイル共有サービスとして使ってたりします

  • 231◆jG/Re6aTC.23/05/02(火) 11:31:59

    3. 既にインターネット上で公開されているサーバにアプリを構築する

    これはいわゆるSaaS(ソフトウェア-アズ-ア-サービス)やPaaS(プラットフォーム-アズ-ア-サービス)ですね
    特定のソフトウェア(+α)がすぐ使える環境を提供しますよ、という感じ
    例えばPyton+Web環境のSaaSだと必要ファイルをアップロードしてボタンを押したら即デプロイして公開できますよーという流れ

    メリットとしては前提となるモジュールなどが既にインストール済みなためユーザー側が細かく設定せずに目的のサービスを公開できることですね
    反面、細かい調整はできないので「このモジュールを使うにはサーバ側にに追加でインストールが必要」みたいな物は使いづらくなります

    また、こちらもスペックを要求すると無料枠だと厳しいものがありますね
    一昔前はHerokuが無料のPaaSとして有名だったのですが今は有料のみになっていますね
    代替サービスも出てはいるのですがやはり少しでも大がかりなものを使おうとするとスペックが足りなかったり連続稼働時間に制限があったりと痒いところに手が届かない印象

  • 241◆jG/Re6aTC.23/05/02(火) 11:43:04

    では本題のOkutetoは何かというとこれはコンテナを動かすソフトウェア「Kubernetes(クバネティス 以下k8s)」が動いている環境を提供するサービスです


    多分PaaSに分類される


    k8sが使えればコンテナがインターネット上で動かせるのでアプリを公開できそうですね


    Automating the modern developer experience on KubernetesEmpower developers to innovate and deliver cloud-native applications faster than ever.www.okteto.com
  • 251◆jG/Re6aTC.23/05/02(火) 11:44:25

    そしてなにより素晴らしいのは無料枠で使えるスペック!

    主な注目スペックとして

    - NS(名前空間 k8sにおけるフォルダみたいたもの)が5つまで持てる!
    - Pod(コンテナの台数のようなもの)が10個まで動かせる!
    - CPUを1Podにつき1つ(1ユーザーmax4まで)!
    - メモリを1Podにつき3Gi(1ユーザーmax8Giまで)!

    オイオイまじかよ 

    ホントにこれ無料でいけるのか(懐疑的)

  • 261◆jG/Re6aTC.23/05/02(火) 11:48:57

    ただ無料サービスの宿命としてやはり時間的制約があり24時間以内に必要な操作をしないと非アクティブとみなされ停止されてしまうようです

    消されるのではなくサイズが0にスケールイン(台数の縮小)されてしまう扱いっぽい

    でそれが15日以上続くとデータも削除されると

    活動とみなされる特定の操作とは単にアクセスするだけではなくてデプロイや再構築をしないと行けない模様

  • 271◆jG/Re6aTC.23/05/02(火) 11:49:56

    ではこれからこの激安(無料)サービスの実態を暴いていきますわよ(めたん)

  • 281◆jG/Re6aTC.23/05/02(火) 11:51:59
  • 291◆jG/Re6aTC.23/05/02(火) 11:52:39

    あ、ちなみにスレ主もOkutetoに関してはマジで初見です

  • 301◆jG/Re6aTC.23/05/02(火) 11:56:15

    SasSかSelf-Hosted(自サーバにインストール)かを選べる
    Self-Hostedだと30日間の制限があるようだ

    Sassを選択

    ...というかPaaSじゃなくてSaaSやん
    上でPaaSと行ったのはワスレテクレ(殿下)

  • 311◆jG/Re6aTC.23/05/02(火) 11:57:33

    GitHubアカウントでログインするらしい

    利用規約をよく読んでからログインしよう

    利用規約をよく読んでからログインしよう

  • 321◆jG/Re6aTC.23/05/02(火) 12:00:08

    特に禁止事項には注意しよう

    面白いとこで言うと「マイクラサーバー立てんな」って書いてあったりする

  • 331◆jG/Re6aTC.23/05/02(火) 12:08:40

    飯食ってきます

  • 341◆jG/Re6aTC.23/05/02(火) 13:07:44

    再開

  • 351◆jG/Re6aTC.23/05/02(火) 13:13:37

    んー何かログインに失敗しているな

    メールアドレスが登録されてないと言われている気がするがそんなことはないはず
    ...

  • 361◆jG/Re6aTC.23/05/02(火) 13:55:04

    あれか...

    一般的なメールドメインだと駄目なやつかこれ...

  • 371◆jG/Re6aTC.23/05/02(火) 14:16:16

    やむを得ん...カスタムドメインのメールアドレスを何とかして調達してみるか...

  • 38二次元好きの匿名さん23/05/02(火) 15:23:52

    このレスは削除されています

  • 391◆jG/Re6aTC.23/05/02(火) 15:29:29

    原因

    Githubにメールアドレスの登録が必要なのだが、Oktetoはその中でもgmail.comのような有名どころのメールアドレスでは認められないようだ(おそらく乱用悪用の対策)

    対応

    詳細な流れはややこしいので割愛するけど

    no-ipでドメイン取得

    zohoメールでドメインと連携したメールアカウント作成

    作成したメールアドレスをGithubに登録

    という流れ(詳しく知りたい場合はリクエストあれば補足します)

    no-ipもzohoももちろん無料サービス

    労力はかかったが無料で突破できたぞ!

    PoC目的で会社の許可が下りるなら会社メールアドレスとか使った方がよっぽど楽だと思う

  • 401◆jG/Re6aTC.23/05/02(火) 15:30:15

    外出するのでいったんココでストップ

    一応夜には再開予定

  • 411◆jG/Re6aTC.23/05/02(火) 22:53:28

    FGOやってたらこんな時間に...

    再開しまーす

    さあ見せてもらおうか

    Okutetoの力を!

  • 421◆jG/Re6aTC.23/05/02(火) 22:55:45

    とりあえずGet Startedに従ってみましょう

  • 431◆jG/Re6aTC.23/05/02(火) 22:57:26

    まずはOktetoのCLIを入れればいいのかな?

  • 441◆jG/Re6aTC.23/05/02(火) 22:59:58

    CLIのインストールコマンドを実行します...

    が、ホストのWindowsにはとりあえず入れません

    最終的にOkutetoのCLIはコンテナで動かさないといけない気がしているので適当にコンテナ立ててそこにインストールしてみます

  • 451◆jG/Re6aTC.23/05/02(火) 23:04:36

    こんな感じで適当にコンテナ作成

  • 461◆jG/Re6aTC.23/05/02(火) 23:09:34

    docker-compose exec -it okteto-cli bash


    でコンテナの中に入りインストールコマンド


    curl
    get.okteto.com
    -sSfL | sh

    を実行...する前にcurlのインストールが必要だったのでインストール


    apt-get update && apt-get install -y curl


    その後改めてoktetoインストールコマンドを実行

    ちゃんとインストールされたっぽい

  • 471◆jG/Re6aTC.23/05/02(火) 23:10:40

    ヘルプも表示できてるので大丈夫ですね

  • 481◆jG/Re6aTC.23/05/02(火) 23:11:45

    では改めてGetStartedに戻り context を設定してみましょう

  • 491◆jG/Re6aTC.23/05/02(火) 23:16:13

    実行してみると...エラーですね

    どうやら認証のためにブラウザを使おうとして、コンテナなのでブラウザが使えなくてエラーになっている模様

    その場合tokenを使えばいいと書いてありますね

  • 501◆jG/Re6aTC.23/05/02(火) 23:16:51

    WebUIのSettingsを見るとトークンを作成できそうなボタンが

    これを押してみます

  • 511◆jG/Re6aTC.23/05/02(火) 23:18:11

    トークン名の入力を求められるので適当に作りたいアプリ名を入力してGenerate

  • 521◆jG/Re6aTC.23/05/02(火) 23:19:48

    生成されたトークンが表示された

    恐らく表示されるのは一回きりなのでしっかり控えておくこと

  • 531◆jG/Re6aTC.23/05/02(火) 23:22:22

    生成されたトークン名が一覧に表示されたが...半年?の期限があるのか

    うーんコンテナで動かし続けるのは難しいかもなあ

  • 54二次元好きの匿名さん23/05/02(火) 23:25:43

    このレスは削除されています

  • 551◆jG/Re6aTC.23/05/02(火) 23:27:37

    まあそれはおいておいて

    okteto context use 叡智ttps://cloud.okteto.com --token $YOUR_TOKEN

    でtokenを指定して実行してみます

    上手くいったようですね!

  • 561◆jG/Re6aTC.23/05/02(火) 23:30:29

    さて、これでコンテナが操作できるようになっているハズですが肝心のkubectlコマンドを入れ忘れていたのでインストール


    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"


    chmod +x ./kubectl


    mv ./kubectl /usr/local/bin/kubectl

  • 571◆jG/Re6aTC.23/05/02(火) 23:33:09

    これもいるのかな?

    okteto context update-kubeconfig

  • 581◆jG/Re6aTC.23/05/02(火) 23:34:10

    kubectl get po

    でPodの一覧を取得し「何もない」という正常な結果が返ってきたのでk8sクラスタに接続出来てそうですね

  • 591◆jG/Re6aTC.23/05/02(火) 23:37:05

    ただSettingsからk8sのconfig落とせたっぽいからこれを使えばoktetoCLIのインストールは要らなかったかも?

    まあイメージを作るときになったらまた検証しよう

  • 601◆jG/Re6aTC.23/05/02(火) 23:51:11

    試しにopenrestyのPodが作成できるかを試してみましょう

    こんな感じでデプロイするPodのyamlを書きます

    「kind: Deployment」以下に書いてあるだいたいの意味合いはdocker-compose.yamlと同じですが「kind: Service」以下がk8s独自の要素ですね

  • 611◆jG/Re6aTC.23/05/03(水) 00:08:42

    少し説明がややこしくなるのですが、k8sというのは複数のサーバをまとめてコンテナ稼働環境を作ることができます。

    しかし作成したPodというのは再作成されるとどこのサーバに作成されるかわかりません
    つまり再作成されるとアクセスするためのIDやアドレスが変わってしまいます

    それではアクセスするときに困るので常に起動しっぱなしの案内人的な役割のサ「Serviceリソース」を作ってそいつにPodへのアクセスを仲介させます
    Serviceリソースは自分が担当するPodがどこに起動しても追いかけて場所を把握しているのでアクセスが来た時にPodにリクエストを渡すことができます

    リバースプロキシと似ているかもしれませんね

    Serviceには3つのタイプ「ClusterIP」「NodePort」「LoadBalancer」があります

    それぞれ違いはありますが、ここで使っている「ClusterIP」はインターネット上からアクセスすることができない内々のサーバ間通信のみを仲介するServiceだと認識しておけば良いと思います

  • 621◆jG/Re6aTC.23/05/03(水) 00:10:43

    物は試し デプロイしてみます

    kubectl apply -f deployment.yaml

    でyamlの内容でデプロイです

    成功するとこのように

    ... created

    と表示されます

  • 631◆jG/Re6aTC.23/05/03(水) 00:13:46

    現在動いているpodやserviceを確認するには

    kubectl get (カンマ区切りで対象)

    です

    例えば

    kubectl get pod,service

    ですね

    kubectl get po,svc

    のように省略形も使えます

    ちゃんと作成できていますね スゲー

  • 64二次元好きの匿名さん23/05/03(水) 00:19:57

    このレスは削除されています

  • 651◆jG/Re6aTC.23/05/03(水) 00:20:13

    さてOpenrestyのPodが作成できたのでそれに対してインターネットからアクセスしたい

    でもClusterIPはインターネットからは接続できません

    これを解決する方法は幾つかありますがここでは「Ingress」を使います

    Ingress はL7ロードバランサーとも呼ばれインターネットからのアクセスを中継しさらにURLのパスごとに中継先のPodを振り分けることができます(今回のテストでは使いませんが)

  • 661◆jG/Re6aTC.23/05/03(水) 00:34:10

    Ingressリソースを作るためにdeployment.yamlに追記します

    一般的なIngressの書式と大差ないですが「annotations」の

    dev.okteto.com/generate-host: "true"

    はOkteto独自ですね
    これでホスト名(アクセスする際のドメイン名)を生成してくれるようです

    あとはbackend-service-name で中継先のServiceを指定し、port-numberでServiceの使用ポートを指定

    pathでどんなパスでアクセスが来た時にそのserviceに中継するかを指定しています(ここでは / なので全てのアクセスをopenresty-serviceに中継)

  • 671◆jG/Re6aTC.23/05/03(水) 00:38:45

    さあここまできたら

    kubectl apply -f deployment.yaml

    で再デプロイして

    kubectl get ingress

    でIngressが作られているか確認してみましょう
    おお!「HOST」の部分にアドレスっぽい文字列が!

    このホスト名の生成ルールは[ingress名]-[ユーザ名].cloud.okteto.netのようなので同じIngress名を使い続ける限りは変わることはなさそうです

    これをブラウザに入力すればいいようですがただ少しここの設定反映に時間がかかるらしいので2分くらいしてからブラウザに入力!

  • 681◆jG/Re6aTC.23/05/03(水) 00:39:56

    きたー!!!

  • 691◆jG/Re6aTC.23/05/03(水) 00:42:56

    しかも既にHTTPS化されている...!


    さらにアクセスしたときはhttpを入力したのにhttpsになっているので恐らくhttpsリダイレクトが自動で効いていますね


    スバラシィ..!

  • 701◆jG/Re6aTC.23/05/03(水) 00:44:42

    証明書はおなじみLetsEncrypt産ですね

    cloud.okteto.netのアスタリスク証明書を利用しているようです

  • 711◆jG/Re6aTC.23/05/03(水) 00:47:10

    これでコンテナをインターネットに(HTTPSで)公開できることが確認できましたね!

    すごいぞOktetoこれが無料でできていいのかOkteto

    キリがいいので今日はここまで

    次回はいよいよ冷蔵庫アプリをこのOkutetoでインターネットアクセス可能にする...準備かな

    ご意見ご要望ご感想アドバイスお待ちしております

  • 721◆jG/Re6aTC.23/05/03(水) 08:46:06

    ほしゅ

  • 731◆jG/Re6aTC.23/05/03(水) 12:37:52

    Podの現状確認

    まだ停止はしていないようですね

    これから停止の検証を行うためk8s側ではノイズになる行動をあまりしたくありません

    なのでローカルアプリの方をk8sで動かす準備をしようと思います

  • 741◆jG/Re6aTC.23/05/03(水) 12:41:05

    ただ1つだけ検証用のPodを追加しておきます

    これで非アクティブの判定が「Podに対してのアクション」なのか「ネームスペースに対してのアクション」なのかを判別します

  • 751◆jG/Re6aTC.23/05/03(水) 12:43:16

    現状を整理しておきます

    こんな感じのアプリ構成をローカルで作っていました

  • 761◆jG/Re6aTC.23/05/03(水) 13:25:22

    現在の目指す姿はこんな感じ...になるはず?

  • 771◆jG/Re6aTC.23/05/03(水) 13:26:05

    ホントは認証をひとまとめにしないならリバプロは不要になるんだけど...

    何か良い方法ないかな?

  • 781◆jG/Re6aTC.23/05/03(水) 13:31:53

    おや?

    Oktetoのドキュメントを眺めていると「Private Endpoints」という項目が

    どうやらこれをIngressで有効にするとアクセス前に認証をかけてくれるみたいだ

    Oktetoユーザで認証する模様

    これを使えばいけるかも?

  • 791◆jG/Re6aTC.23/05/03(水) 13:32:34

    名前空間内なら認証はかからないようなのでPod間通信も大丈夫そう

  • 801◆jG/Re6aTC.23/05/03(水) 13:34:53

    このようにannotationsに

    dev.okteto.com/private: "true"

    を追記すれば良いらしい

    applyしてみよう

  • 811◆jG/Re6aTC.23/05/03(水) 13:38:55

    ApplyするとOktetoのWebUI上ではEndpointsのところにprivateアイコンが表示されるようになった

    余談だけどOpenresty単体だと5MBも使ってないのか

  • 821◆jG/Re6aTC.23/05/03(水) 13:40:35

    IngressのURLにアクセスしてみると今までとは違いOktetoの認証画面が表示された

  • 831◆jG/Re6aTC.23/05/03(水) 13:42:07

    進めてみるとGithubの認証画面に遷移した

    入力して進めてみる

  • 841◆jG/Re6aTC.23/05/03(水) 13:44:35

    Oktetoとの連携をこのGithubユーザで許可するか聞かれた

    許可して先に進む

    (恐らく一度許可すればこの一回しか聞かれない)

  • 851◆jG/Re6aTC.23/05/03(水) 13:46:56

    すると認証完了となりOpenrestyのTip画面に遷移できました!

    マジか認証の課題も解決じゃん

    ちなみに再度ログインしてみたらやっぱり連携許可は聞かれませんでした

  • 861◆jG/Re6aTC.23/05/03(水) 13:51:19

    ちなみにここでアクセスが許可されるのは「ネームスペースに対してアクセス権のあるOktetoユーザ」らしい

    なのでWebUIから「ShareNamespace」でGithubメールアドレスを追加すれば認可ユーザを増やせる模様

    完全個人だけでなく特定の仲間内にだけ公開...みたいなケースにも対応できそう

    マジかよ無料でここまでできるのかスゲーなOkteto

  • 871◆jG/Re6aTC.23/05/03(水) 14:06:45

    おかげで構成がシンプルになりましたね

    しかしOktetoは現状わかった範囲でも

    - 無料で
    - k8sが使えて
    - そこそこスペックPodをを複数持てて
    - ドメイン名も取得できて
    - HTTPS化ができて
    - 認証認可ができる

    とかなり凄いサービスですね

    ありがたやー

  • 881◆jG/Re6aTC.23/05/03(水) 21:00:48

    さて

    今までローカルで動いていたものをOktetoのk8s上で動かすために考えなきゃいけないこととして

    「マウントしてたファイルどうやって持っていくの?」

    という点が挙げられます

    リバプロは使わなくなったので主な対象は

    1. web-uiのWebページ構成ファイル
    2. web-apiのpythonファイル
    3. web-apiのDB接続証明書ファイル
    4. web-apiのDB接続情報(.envの内容)

    ですかね

  • 891◆jG/Re6aTC.23/05/03(水) 21:02:56

    1と2はオリジナルイメージをビルドしてその中に取り込んでしまえば解決します

    しかし3と4はイメージの中に取り込むとまずいです

  • 901◆jG/Re6aTC.23/05/03(水) 21:07:40

    1と2はオリジナルイメージをビルドしてその中に取り込んでしまえば解決します
    しかし3と4はイメージの中に取り込むとまずいです


    基本的にコンテナイメージはDokcerhubというインターネット上のパブリックリモートレジストリにPush(アップロード)して使うのが一般的です

    しかしそうなると接続用の証明書や接続情報をコンテナの中に埋めてしまった場合不特定多数の人がそのイメージ(および内部の接続情報)を入手できてしまいます

    セキュリティ的にそれはまずい

    上手くいったら構成を公開しようとしているのならなおさらです

    (一応Dockerhubにもプライベートリポジトリ(自分専用のイメージ置き場)を作ることができるのですが無料だとかなり限定されるのでできれば避けたい)

  • 911◆jG/Re6aTC.23/05/03(水) 22:48:39

    なので方針としては

    1. 公開しても良い部分だけコンテナイメージに固める
    2. それ以外の部分は外付けする

    となります

    コンテナイメージを作っていきましょうか

  • 921◆jG/Re6aTC.23/05/03(水) 22:58:18

    Web UIのイメージの方はこんな感じでいいですね

    滅茶苦茶シンプル

    WebUI系のコードには秘匿しておきたい情報はないので何も考えずにそのままコピーすれば動くはずですね

  • 931◆jG/Re6aTC.23/05/03(水) 23:04:01

    dockerhubのアカウントは作ってある前提で


    docker build -t <dockerhubユーザ名>/fridge-app/web-ui:0.0.1 .


    でイメージをビルドします


    認証認可まわりをOktetoに任せられることが分かったので使用するイメージをopenrestyからnginxに変えています


    nginxは言わずと知れたwebサーバ機能を提供するミドルウェアですね


    今だとApacheより利用数が多いのではないでしょうか


    この時点だとまだdockerhubにイメージをPush(アップロード)してはいません

  • 941◆jG/Re6aTC.23/05/03(水) 23:05:47

    Pushする前にローカルの環境で使うイメージを差し替えて動作検証します

  • 951◆jG/Re6aTC.23/05/03(水) 23:10:14

    ちなみにリバプロは要らなくなったと言いましたがそれはIgressがリバプロの機能を持っているからでローカル環境で動かす場合は必要なので注意しましょう(1敗)

    っと おやぁ?

    データが表示されなくなってるゾ

  • 961◆jG/Re6aTC.23/05/03(水) 23:12:58

    検証用にweb-apiを自動起動しないようにしてたのを忘れてました

    馬鹿だとおもうでしょう?私もそう思う

    でもあるんだよなぁこういう馬鹿みたいな間違い

    プログラミング経験者なら共感してもらえると思うが...私だけ?

  • 971◆jG/Re6aTC.23/05/03(水) 23:16:50

    自動起動するようにして再起動...っとまだ表示されないな

    ああー

    途中からpandas使うようにしたからオリジナルイメージの方にはまだpandasが入ってないのか

    ついでなのでこっちもdockerhubにアップロードする準備がてら最新化しておきましょう

  • 981◆jG/Re6aTC.23/05/03(水) 23:24:07

    requirements.txtにpandasを追加しておきます

    またweb-apiの方も今までの処理に加えてappディレクトリをコピーするだけですがここで注意

    walletが入っているディレクトリをappディレクトリから外に移動させます

    walletが秘匿したい情報であるためですね

    appディレクトリに入れたままだとpyファイル等と一緒にコンテナイメージに取り込まれてしまいます

  • 991◆jG/Re6aTC.23/05/03(水) 23:27:58

    あとはweb-uiと同様にビルドですね


    今回だと


    docker build -t <dockerhubユーザ名>/fridge-app/web-api:0.0.1 .


    でしょうか


    今さらですがビルドコマンドは対象のDockerfileがあるカレントディレクトリに移動して実行する必要があります


    あと以前作ったイメージはついでに削除しておきます


    docker rmi fridge-app/web-api:0.0.1


    で削除できますね

  • 1001◆jG/Re6aTC.23/05/03(水) 23:30:51

    実行するイメージの差し替えとwalletのマウント定義をします

    appは既にあるのでwalletだけマウントする感じですね

  • 1011◆jG/Re6aTC.23/05/03(水) 23:33:42

    コンテナを起動すると...

    よしよし、起動しましたね

  • 1021◆jG/Re6aTC.23/05/03(水) 23:38:19

    イメージがOKだとわかったのでこれをDockerhubにPush(アップロード)します

    Pushする前にはdockerhubにログインする必要があるため

    docker login

    コマンドでログインしておきます

    認証情報を求められた場合はdockerhubのアカウント情報を入力しましょう

  • 1031◆jG/Re6aTC.23/05/03(水) 23:45:20

    あーちょっとイメージの命名ミスったかもです


    <dockerhubユーザ名>/fridge-app/web-api:0.0.1


    のように2階層以上のイメージ名はdockerhubは対応してなさそうです


    <dockerhubユーザ名>/fridge-app-web-api:0.0.1


    のようにしなければいけないということですね

  • 1041◆jG/Re6aTC.23/05/03(水) 23:55:27

    うーんこういう時harborならあまり考えなくていいんだけど...

  • 1051◆jG/Re6aTC.23/05/04(木) 00:02:58


    代わりにGitLabのコンテナレジストリを使えば行けそうです

    これにしてみましょう

  • 1061◆jG/Re6aTC.23/05/04(木) 00:04:22

    docker build -t registry.gitlab.com/<GitLabユーザ名>//fridge-app/web-api:0.0.1 .


    のようにイメージの帰属する先をregistry.gitlab.comに変更します


    次にdocker loginもデフォルトのログイン先ではなく


    docker login registry.gitlab.com


    とします

  • 1071◆jG/Re6aTC.23/05/04(木) 00:11:44

    Pushは


    docker push イメージ名:タグ名


    で行えます


    uiとapiどちらもpushします


    こんな感じ


    docker build -t registry.gitlab.com/<Gitlabユーザ名>//fridge-app/web-api:0.0.1 .

  • 1081◆jG/Re6aTC.23/05/04(木) 00:12:49

    (流れるUC)

  • 1091◆jG/Re6aTC.23/05/04(木) 00:15:56

    キリがいいので今日はここまで

    明日こそはOkueto上にアプリコンテナを浮かべてインターネットアクセスできるようにしたいですね

    引き続きご意見ご感想ご質問アドバイスお待ちしております

    ...

    ただもうこのへん興味ある人も少ないのかもなー
    もしリクエストがあるならインフラらへんは裏でちゃちゃっとやってWebコンテンツ系を中心に投稿する方がいいのかな?

  • 1101◆jG/Re6aTC.23/05/04(木) 00:18:32

    ちなみにGitLabはGithubと同じようにプロジェクト(ソースコード)が管理できるサービスです
    もちろん無料

    私はGitLabの方が好きですね

    ソースコードだけでなくDockerhubのようにコンテナレジストリの機能も提供してくれます(今回はじめて使いましたが)

    Dockerhubはプライベートなコンテナリポジトリは1つしか作れないのにGitLabだと無制限に作れるようです

  • 1111◆jG/Re6aTC.23/05/04(木) 02:14:46

    あ、あれ?

    24時間経っても消えてないな...

    タイムラグがあったりするのかな?

  • 1121◆jG/Re6aTC.23/05/04(木) 12:03:51

    あれーまだ消えてない

    ここまでとなると最終アクティビティの判定とやらはPod単位ではなくネームスペース(以下ns)単位なのかな?

    こちらとしてはその方がありがたいが...

  • 1131◆jG/Re6aTC.23/05/04(木) 12:35:51

    ともあれアプリをデプロイするためのnsを作りましょう

    デフォルトではOktetoユーザ名のnsが作られてますがこちらは検証用として使いたい

    OktetoのダッシュボードからNew Namespaceをクリック

  • 1141◆jG/Re6aTC.23/05/04(木) 12:37:51

    fridge-appという名前のnsを...と思ったがどうやら末尾に必ずOktetoユーザ名を付けないといけない模様

    まあしゃーないか

  • 1151◆jG/Re6aTC.23/05/04(木) 12:39:57

    nsができたようです

  • 1161◆jG/Re6aTC.23/05/04(木) 12:41:56

    コマンドでns情報をgetできたのでcliからの接続も問題なさそうです

  • 1171◆jG/Re6aTC.23/05/04(木) 12:53:31

    あとはこのnsにPod(コンテナ)を作っていくわけですが解決しなければならない課題がいくつか

    1. 結局walletどうやってコンテナに持っていくの?
    2. 結局.envの接続情報どうやって持っていくの?
    3. k8sのはdocker loginないけどどうやってイメージをPull(ダウンロード)するの?

  • 1181◆jG/Re6aTC.23/05/04(木) 14:02:13

    あ、ついに消えました!

    このタイミングだとやはり「nsに対してアクティビティ(デプロイなど)が起こらなくなってから24h」でsleepするようですね

  • 1191◆jG/Re6aTC.23/05/04(木) 14:04:57

    Oktetoのダッシュボードで見てもSleepになっているのがわかります

    Wake allボタンを押せば復帰は出来そうですが常駐させるにはやはり一工夫必要そうですね

  • 1201◆jG/Re6aTC.23/05/04(木) 14:09:41

    これは後々の課題としてGitLabにIssue(課題)として登録しておきましょう

  • 1211◆jG/Re6aTC.23/05/04(木) 14:42:37

    さて話は戻ってまずは

    1. 結局walletどうやってコンテナに持っていくの?
    2. 結局.envの接続情報どうやって持っていくの?

    です

    ここに関しては幾つかアプローチがありますが今回は「Secret形式で登録してPodにマウントする」という方式をとります

    「Secret」とはk8sのリソースタイプの1つで変数やファイルを(一応)セキュアに持てるリソースとなっています

    (一応)と書いていますがホントに一応暗号化はされているのですがあまり強いものではないので「暗号化」というよりは「難読化」が近いかもしれません

    Secretはyamlで指定することでファイルや環境変数としてPodに配置することができます

  • 1221◆jG/Re6aTC.23/05/04(木) 21:33:00

    まずはkubectlコマンドを使える環境(今回はローカルコンテナ)からOkutetoのk8sクラスタに接続出来るように設定した後walletと.envファイルを参照できる位置にコピーします

  • 1231◆jG/Re6aTC.23/05/04(木) 21:37:06

    このとき.envファイルの中のイコール前後に半角スペースがある場合は削除しておきます
    (半角スペースが変数名の一部として判定されてエラーになるため)

  • 1241◆jG/Re6aTC.23/05/04(木) 21:42:42

    .envファイルを以下のコマンド書式でSecretとして登録します


    --from-env-fileを使って.envファイルを指定します


    kubectl create secret generic <secret名> --from-env-file=./.env --dry-run=client -o yaml -n <対象ns> | kubectl apply -f -


    今回は「fridge-app-env-secret」というsecret名で登録します

  • 1251◆jG/Re6aTC.23/05/04(木) 21:43:34

    色々めんどくなったのでデフォルトnsをアプリ用nsに変更


    kubectl config set-context $(kubectl config current-context) --namespace=<アプリ用ns>

  • 1261◆jG/Re6aTC.23/05/04(木) 21:46:05

    作成したsecretの詳細をdescribeコマンドで表示してみます

    必要なものがちゃんと登録されているようですね

  • 1271◆jG/Re6aTC.23/05/04(木) 21:49:18

    次はwalletです


    先ほどの.envの時とほぼ同じですが


    「--from-env-file」ではなく「--from-file」

    ファイル単体ではなくディレクトリを指定している


    という点で異なります


    こう書くとディレクトリ内の複数ファイルを1つのsecretとしてまとめることができます


    kubectl create secret generic <secret名> --from-file=./wallet --dry-run=client -o yaml -n <対象ns> | kubectl apply -f -


    ここではは「fridge-app-wallet-secret」というsecret名で登録します

  • 1281◆jG/Re6aTC.23/05/04(木) 21:51:39

    こちらもdescrribeコマンドで確認してみます

    上手くいっているようですね

  • 1291◆jG/Re6aTC.23/05/04(木) 21:56:30

    さて、では次はこのSecretをどのようにPod側に読み込ませるかですね

    まずは.envの方ですが「envFrom」を使います

    これはSecretやConfigmap(暗号化しないSecret的なもの)をPodの環境変数として読み込ませることができるk8sのyaml構文です

    今回はテストとしてOpenrestyのコンテナの中にSecretを適用させてみましょう。

    このようにcontainersの中に記述します

    インデント(段落)が重要です
    たまに「なんでこれで駄目なの?」と思うことでエラーが出ることがありますがyamlの場合大抵はインデントか名称ミスです

  • 1301◆jG/Re6aTC.23/05/04(木) 22:01:58

    次はwalletですがこちらは「volumeMounts」を使います

    Secretの中身をファイルとしてPodにマウントするk8sのyaml構文です

    流れとしては

    1. 「volumes」で対象のsecretを指定したvolumeを定義
    2. 「volumeMounts」で対象のvolumeをPodのどのパスとしてマウントさせるか定義

    となります

    volumesはspecの中、volumeMountsはcontainersの中ですね

  • 1311◆jG/Re6aTC.23/05/04(木) 22:05:14

    後はこいつをapplyしてPodの中のbashに入り環境変数とファイルを確認するだけですね


    Podの中のBashへは


    kubectl exec -it <Pod名> -- bash


    で入れます

  • 1321◆jG/Re6aTC.23/05/04(木) 22:08:58

    Podに設定されている環境変数は「env」コマンドを実行することで確認できます

    ちゃんと設定されていますね!

  • 1331◆jG/Re6aTC.23/05/04(木) 22:10:55

    walletファイルはそのパスのファイルを表示すればいいので

    ls -al /app/wallet

    でいいですね

    こちらもOK!

  • 1341◆jG/Re6aTC.23/05/04(木) 22:11:10

    一応SS

  • 1351◆jG/Re6aTC.23/05/04(木) 22:55:15

    さあいよいよアプリコンテナをインターネットの海に浮かべる時です

  • 1361◆jG/Re6aTC.23/05/04(木) 22:56:24

    いかんまだ課題が残ってた

    「認証が必要なのでどうやってGitlabコンテナレジストリ上にあるイメージをPullするの?」

    をどうにかします

  • 1371◆jG/Re6aTC.23/05/04(木) 22:59:35

    GitLabのプロジェクトページからアクセストークン生成の画面に遷移します

    ここでイメージPull専用のトークンを発行するわけですね

  • 1381◆jG/Re6aTC.23/05/04(木) 23:05:54

    トークンを作成するとこのタイミングでのみ内容が確認できるのでしっかり控えておきましょう

  • 1391◆jG/Re6aTC.23/05/04(木) 23:07:02

    ちなみに今回作ったトークンは

    とりあえずトークン名は「fridge-app-read-repository」

    期限はなし

    スコープは「read_repository」でいいはず...

  • 1401◆jG/Re6aTC.23/05/04(木) 23:13:28

    あー「read_registry」でないと駄目だったみたいです

    作り直します

  • 1411◆jG/Re6aTC.23/05/04(木) 23:15:20

    docker login registry.gitlab.com

    でユーザー名にトークン名、パスワードにトークン内容を入力してログインできるようならOKですね

  • 1421◆jG/Re6aTC.23/05/04(木) 23:21:36

    これを使ったsecretをk8sクラスタに登録します


    実行コマンドはこんな感じです


    kubectl create secret docker-registry fridge-app-image-pull-secret --docker-server=registry.gitlab.com --docker-username=<トークン名> --docker-password=<user_password>

  • 1431◆jG/Re6aTC.23/05/04(木) 23:22:41

    「fridge-app-image-pull-secret」の部分は作成されるsecret名なので自由でいいです

  • 1441◆jG/Re6aTC.23/05/04(木) 23:28:51

    それでもってyamlのこのへんに「imagePullSecrets」として指定します

    volumesとかcontainersとかと同じレベルですね

    これでgitlabコンテナレジストリをPullしてみます

  • 1451◆jG/Re6aTC.23/05/04(木) 23:31:10

    成功です!

  • 1461◆jG/Re6aTC.23/05/04(木) 23:33:59

    あとは同じ要領でweb-uiのdeploymentを定義します

    こちらは.envやwalletは必要ないのでそのあたりは消しています

  • 1471◆jG/Re6aTC.23/05/04(木) 23:36:07

    あとはWebAPIのsvcを定義してー

  • 1481◆jG/Re6aTC.23/05/04(木) 23:39:03

    あとはWebUIのsvcも定義してー

  • 1491◆jG/Re6aTC.23/05/04(木) 23:44:26

    Ingressを定義

    ここで大切なのはパス「/」をWebUIのsvcに、パス「/api」をWebAPIのsvcのバックエンドとして指定すること

    ここでローカルでのリバプロの役割を担う

  • 1501◆jG/Re6aTC.23/05/04(木) 23:45:58

    両方のPodの起動が確認出来たら

  • 1511◆jG/Re6aTC.23/05/04(木) 23:48:14

    WebUIの方のEndPointにアクセス!

    きたー!!!

    ...

    が、データが来てないな!?

  • 1521◆jG/Re6aTC.23/05/04(木) 23:49:07

    エラーを見ると404になっておるな...

  • 1531◆jG/Re6aTC.23/05/04(木) 23:51:36

    notfound?

    だがこれはFastAPI自体は動いていはいるな...

  • 1541◆jG/Re6aTC.23/05/04(木) 23:54:07

    fastapiのルートパスに転送されている可能性がある...のかな?

  • 1551◆jG/Re6aTC.23/05/05(金) 00:01:17

    うーんどうやら
    /api/fridge
    ではなく
    /fridge

    で動いている模様

    なぜだー?

  • 1561◆jG/Re6aTC.23/05/05(金) 00:03:58

    そしてそれを実行してもエラーになるな

    あるはずのwalletファイルがないと申す

    なぜだー!

  • 1571◆jG/Re6aTC.23/05/05(金) 00:08:30

    あれかな...

    walletファイルはリンクじゃなくて実体ファイルの場所を示さないといけないのかな...

    (SecretのVolumeマウントは実体ではなくリンクファイルを中継する)

  • 1581◆jG/Re6aTC.23/05/05(金) 00:21:41

    もしかして...ファイルのパーミッション(権限)が足らんのか?

  • 1591◆jG/Re6aTC.23/05/05(金) 01:06:32

    うーんはじめての見通しが立たん状態かも

    とりあえずやりたくはなかったけどwalletをイメージに含めるか…

  • 1601◆jG/Re6aTC.23/05/05(金) 01:37:06

    walletをイメージに含めてもNotFoundと言われる...いよいよもってお手上げだ

    ローカルでは問題なく動いていたのに...

    こうなるとコンテナで動かしている以上差異の部分は.envしかないのだが...

  • 1611◆jG/Re6aTC.23/05/05(金) 01:42:23

    あ!環境変数yamlにベタ打ちしたら通った!

    問題はenvなのか!

  • 1621◆jG/Re6aTC.23/05/05(金) 01:54:28

    解明しました

    結論として

    k8sのenvFromはenvファイル内の"(ダブルクォーテーション)を値として認識する

    です

    なので.envの値はダブルクォーテーションで囲ってはいけなかったみたいですね

  • 1631◆jG/Re6aTC.23/05/05(金) 02:03:28

    それでもって/apiのパスが上手く動いていなかった理由は

    そもそもmain.pyの
    app = FastAPI(root_path="/api")
    は機能しておらずリバプロがそのあたりの変換処理を行っていたから

    でした

    これに対処するにはFastAPIの起動コマンドを変えるかIngressの方に変換処理をかけるかですね

    なのでとりあえず
    app = FastAPI(root_path="/api")

    app = FastAPI()
    に戻します

  • 1641◆jG/Re6aTC.23/05/05(金) 02:07:55

    そしてIngressをこのように変更します

    nginx.ingress.kubernetes.io/rewrite-target: /$1

    でURLをリライトできるようにして

    - path: /api/(.*)

    と書くことで

    「/api/fridge」を「/fridge」に変換できます

  • 1651◆jG/Re6aTC.23/05/05(金) 02:09:16

    そして再applyすれば...!

    やったー!

    ついに自作Webアプリがインターネット上に公開できました!

    NKT...

  • 1661◆jG/Re6aTC.23/05/05(金) 02:12:54

    キリがいいので今日はここまで

    今回のエラーは中々骨が折れましたね...

    ただ環境ごとの差異が限られるコンテナだからこそenvに問題があると気づけたのはコンテナの良さに触れられて良かったのかなと思いました

    明日は次トライアルでやることの整理ですね

    引き続きご意見ご感想ご質問アドバイスお待ちしております

  • 1671◆jG/Re6aTC.23/05/05(金) 13:02:14

    保守

  • 1681◆jG/Re6aTC.23/05/05(金) 16:59:04

    今日もやっていきます

    昨日は色々あったのですこしおさらいをしておきます

    昨日まででこの構成が動作するところまで確立できました!

    これでインフラ側はほぼ保証されたのであとはWeb側の機能を拡充させていくのがメインとなるでしょう

  • 1691◆jG/Re6aTC.23/05/05(金) 17:05:13

    このトライアル001で定義していた要件である

    - 冷蔵庫の中身を画面から確認する

    は達成できたことになりますね

    このフェーズ最後の作業として今回のフェーズでの気づきや残課題をまとめていきましょう

  • 170二次元好きの匿名さん23/05/05(金) 17:20:59

    見てるよ

  • 1711◆jG/Re6aTC.23/05/05(金) 17:27:34

    >>170

    ありがとう!

  • 1721◆jG/Re6aTC.23/05/05(金) 17:30:37

    っと、その前に昨日上手くいっていたはずの画面が上手く表示されなくなってるな...

    これは多分キャッシュで一時的に上手く表示できていた感じか...

  • 1731◆jG/Re6aTC.23/05/05(金) 17:31:42

    ただhtmlのソースは取得できておる

  • 1741◆jG/Re6aTC.23/05/05(金) 17:32:57

    js系がうまく取得できてないな

    ということはIngressのパス振り分けに原因がありそう

  • 1751◆jG/Re6aTC.23/05/05(金) 17:40:54

    Ingressのパスにこんな感じで追記することで解決しました

    (.*) は正規表現で「0文字以上の文字列」という意味になりますね

    しかし相変わらずjsのキャッシュに残る仕様はデバッグのノイズだな...

    常にシークレットウィンドウを使って検証するのがよさそうですね

  • 1761◆jG/Re6aTC.23/05/05(金) 17:53:20

    気を取り直して今回のフェーズでの気づきや残課題をとりあえず適当に並べて行きます


    - Oktetoは24時間非アクティブだとnsがsleepするのでその対策
    - データの詳細は下に常時じゃなくて選択した時だけ横からニュっと出てきてほしい
    - WebUIにデータの編集・削除インターフェースが必要
    - WebAPIに例外処理(DB接続エラー時などの処理)が定義されてない
    - 賞味期限は近ければ赤文字にしたい
    - 単価計算のため残量のデータ型をint(double?float?)にしたい
    - データに購入日を追加したい

    こんなところかな?

  • 1771◆jG/Re6aTC.23/05/05(金) 17:55:14

    次のトライアルではこれを優先度準に並び変えて取り組むものを決める感じになるでしょうか

    それでは長く続いたこのトライアル001もここで区切りですね

    ひとまずお疲れ様でしたー

  • 1781◆jG/Re6aTC.23/05/05(金) 17:57:02

    次のトライアルに移る前に改めてご意見ご質問などあれば是非

    初歩的な質問でも「ここもう少し詳しく」とかでも全然大丈夫です

    または「俺こんなの使ってるよ」とか「こんなサービスがあるって聞いたことあるよ」とも大変参考になります

  • 179二次元好きの匿名さん23/05/05(金) 19:04:06

    >>176

    よく自分の仕事でやってることは難易度別にまずは分別してから、そこで難易度が低くて優先度の高いものから片付けていくってことをよくやる。

  • 1801◆jG/Re6aTC.23/05/05(金) 19:14:34

    >>179

    実現可能性と実現時効果でマトリクス作るのは私もやりますね


    仕事では大事なことですよね


    (今回はお遊びがメインなので「面白そう」で舵を切ることもありますが…)

  • 1811◆jG/Re6aTC.23/05/05(金) 23:39:24

    色々やろうとしてWindowsでbashが使えないことに憤死しそうだったのでDocker Desktopを使うのをやめてWSL2上のubuntuでDockerを動かすことにしました

    grepくらい使えてほしいよ...

  • 1821◆jG/Re6aTC.23/05/05(金) 23:48:29

    ### 要件定義_002

    ここからトライアル002に入ります

    要件定義ですが、まずトライアル001の最初に出ていたのが以下

    - 冷蔵庫の中身を記録したい
    - 冷蔵庫の中身を画面から確認する
    - 商品を買うときに過去の値段と比較したい
    - データの登録時にバーコードスキャンで入力を簡素化したい
    - データ登録時に写真スキャンで物体検知して入力を簡素化したい(できれば)
    - 冷蔵庫の中身から料理メニューを提案してほしい(出来れば)
    - 外出先からも使いたい
    - 無料で作りたい
    - スマホ/PC問わず使えるようにしたい
    - 賞味期限切れそうなときは通知してほしい

  • 1831◆jG/Re6aTC.23/05/05(金) 23:50:15

    このうちトライアル001で解決したのを除くと以下

    - 冷蔵庫の中身を記録したい
    - データの登録時にバーコードスキャンで入力を簡素化したい
    - データ登録時に写真スキャンで物体検知して入力を簡素化したい
    - 冷蔵庫の中身から料理メニューを提案してほしい
    - 無料で作りたい(継続)
    - スマホ/PC問わず使えるようにしたい
    - 賞味期限切れそうなときは通知してほしい

  • 1841◆jG/Re6aTC.23/05/05(金) 23:51:13

    さらにトライアル001で新たに出た課題・気づきが以下

    - Oktetoは24時間非アクティブだとnsがsleepするのでその対策
    - データの詳細は下に常時じゃなくて選択した時だけ横からニュっと出てきてほしい
    - WebUIにデータの編集・削除インターフェースが必要
    - WebAPIに例外処理(DB接続エラー時などの処理)が定義されてない
    - 賞味期限は近ければ赤文字にしたい
    - 単価計算のため残量のデータ型をint(double?float?)にしたい
    - データに購入日を追加したい

  • 1851◆jG/Re6aTC.23/05/05(金) 23:57:26

    これらを雑に統合すると

    - 無料で作りたい(継続)
    - 冷蔵庫の中身をWeb画面から登録・編集・削除したい
    - バーコードスキャンで入力を簡素化したい
    - 写真スキャンで物体検知して入力を簡素化したい
    - 冷蔵庫の中身から料理メニューを提案したい
    - スマホで見やすくするためにデータの詳細は下に常時じゃなくて選択した時だけ横からニュっと出したい
    - WebAPIに例外処理(DB接続エラー時などの処理)を追加しエラー時にはWeb画面からおおよそのエラー内容がわかるようにしたい
    賞味期限切れそうなときは文字色を変えるなどして知らせたい
    - 単価計算のため残量のデータ型を数値型にしたい
    - データに購入日を追加したい
    - Oktetoは24時間非アクティブだとnsがsleepするので定期的にアクティビティを自動実行したい

  • 186二次元好きの匿名さん23/05/06(土) 00:01:16

    このレスは削除されています

  • 1871◆jG/Re6aTC.23/05/06(土) 00:04:54

    さらに実現可能性と実現時効果を考えて優先度をつけてみます

    私なりに考えてこんな感じかな?

    1. 無料で作りたい(継続かつマスト)
    2. 単価計算のため残量のデータ型を数値型にしたい
    3. データに購入日を追加したい
    4. WebAPIに例外処理(DB接続エラー時などの処理)を追加しエラー時にはWeb画面からおおよそのエラー内容がわかるようにしたい
    5. 冷蔵庫の中身をWeb画面から登録・編集・削除したい
    6. 賞味期限切れそうなときは文字色を変えるなどして知らせたい
    7. バーコードスキャンで入力を簡素化したい
    8. スマホで見やすくするためにデータの詳細は下に常時じゃなくて選択した時だけ横からニュっと出したい
    9. Oktetoは24時間非アクティブだとnsがsleepするので定期的にアクティビティを自動実行したい
    10. 写真スキャンで物体検知して入力を簡素化したい
    11. 冷蔵庫の中身から料理メニューを提案したい


    今回のトライアルの対象は1~5がマスト

    6~7を余裕があればという範囲にしようと思います

    8以降はアプリとしての本質に影響しない(人力で何とかなる)ので優先度低めです

  • 1881◆jG/Re6aTC.23/05/06(土) 00:06:19

    今日はここで終わりにします

    明日は外部設計に移りたいですね

    引き続きご意見ご感想アドバイスお待ちしております

  • 1891◆jG/Re6aTC.23/05/06(土) 00:13:52

    あ、例外として

    - Oktetoは24時間非アクティブだとnsがsleepするので定期的にアクティビティを自動実行したい

    は裏で並行して検証します

    こればかりは上手く作用するか24時間待たなければ結果がわからないので...

    でも一応Sleepしても人力でWakeUpすればいいので優先度は低めというわけですね

  • 1901◆jG/Re6aTC.23/05/06(土) 11:07:10

    保守

  • 1911◆jG/Re6aTC.23/05/06(土) 13:33:32

    ちなみにOktetoのアクティビティとして検証したものとして

    「全く変更がないyamlの再applyはアクティビティにはカウントされない」

    ということが判明しています

    全く変更がないyamlをapplyすると「unchanged」と表示されるのですがこれではアクティビティとしてカウントされず24時間後にnsがsleepしました

  • 1921◆jG/Re6aTC.23/05/06(土) 13:38:10

    では次に「Labels」の追加はどうなるか検証してみます

    labelsはいわゆるメタデータでPodの挙動には影響しないキーバリュー形式のデータですね

    これの追加・変更がアクティビティとしてカウントされるならこれに日付日時か何かを入れて半日に1回再applyすればnsがsleepせずに済むはずです

  • 1931◆jG/Re6aTC.23/05/06(土) 13:40:15

    Labelの追加・変更は「configured」となりました

  • 1941◆jG/Re6aTC.23/05/06(土) 13:43:25

    PodのAGE(作成されてからの時間)は変わってないのでPodが新しく再作成されたわけではなさそうですね

    Pod内のログを見ても再起動しているようなログはなかったのでLabelの適用はPodが起動したままで行えることがわかりました

    これがアクティビティとしてカウントされれば楽でいいですね

    AGEが24時間後になるのを待ちましょう

  • 1951◆jG/Re6aTC.23/05/06(土) 15:18:33

    1スレ目で誰かが言ってた他のアプリ開発しているスレをようやく見つけた


    面白いことやってんねー!タイシタモンジャナイカ


    少なくとも自分のプロジェクトよりここの住民のためになりそう


    皆も応援しよう!


    素人によるWebサイト開発スレ(仮)|あにまん掲示板本職エンジニアでもなんでもないガチの素人がgoogle検索に頼りながら意味もわからず開発してるスレですよくわかんないけどググったらこう書けよって出てきたからその通り書いてみたら動いたわ、レベルの素人が…bbs.animanch.com
  • 1961◆jG/Re6aTC.23/05/06(土) 17:33:38

    そろそろスレ上限間際ですね

    次スレ立ててきます

  • 1971◆jG/Re6aTC.23/05/06(土) 17:38:46
  • 1981◆jG/Re6aTC.23/05/06(土) 17:40:22

    改めてここまでお付き合いいただきありがとうございました

    皆さんの反応がモチベーションの維持に大きくプラスになっています

    この掲示板で同じように頑張っている人もいることですし良い影響を与え合えるようにできればいいですね!

オススメ

このスレッドは過去ログ倉庫に格納されています