続きます。Docker イメージを Google Container Registry に登録 kubectl で設定を行うためのyamlファイル作成 上記でGoogle Container Registryに登録したDockerイメージをGKE(GCP の Kubernetes Engine)で公開します。
今回は、APIだけを公開するということで、API用のファイルだけ作成します。
内容は、基本的には、githubの方を参照しています。
https://github.com/pco2699/NullSuck-AI/tree/master/k8s
また、イングレス用ファイルは下記のような感じで作りました。
k8s/api/api-ingress.yml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: api-ingress spec: rules: - http: paths: - path: /* backend: serviceName: api-svc servicePort: 5432 GKE周りの設定 これを適用するにあたり、まずは準備ということで、
gcloud container clusters create nullsuck --num-nodes 2 --zone asia-northeast1-a を実行するとなっていますが、エラー。
ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=Kubernetes Engine API is not enabled for this project. Please ensure it is enabled in Google Cloud Console and try again: visit https://console.
Kubernetes・GKEでの公開
Docker イメージを Google Container Registry に登録
時は遡り、画面が何とか動くようになったので、API連携しようとしたものの、失敗して終了していたこちら。ぬるさくapi連携(失敗) 画面も、色々試せそうになってきたので、とりあえず、APIを公開しようということで、ぬるさく本の「6.3 Docker イメージを Google Container Registry に登録してみよう 」を試すことにします。
GCPプロジェクトの作成 既存のアカウントにプロジェクトを追加します。
プロジェクト名は真似して「nullsuck」、プロジェクトID「nullsuck-xxxxxx」は自動で振られます。
Docker イメージを push ここで数日を要した・・・
まず、今回はAPI側を公開することにするので、appとなっている部分は全てapiと読み替えて作業します。
そこを間違えなければ(一旦間違えましたが・・・)、docker build はおそらく問題なし。docker tag は、結論としてはそこの問題ではなかったのですが、本でも、GCPドキュメントでも、プロジェクトIDを含めるように書かれているのですが、本の記述が「nullsuck」と書かれていて、若干混乱。「nullsuck-xxxxxx」の方を記述するようにしました。
そして、gcloud docker — push をするのですが、まず、この記述は古いようで、現状では、docker pushでやる形になっています。
が、やってみると、
denied: Token exchange failed for project 'nullsuck-247713'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control で、権限の問題か、ということで、記載されているドキュメントを見て、バケットを作ってみたりとか、色々試してみていたのですが、最終的な問題点は、現在接続しているプロジェクトが、既存のプロジェクトであり、今回作成したnullsuckプロジェクトではない、ということでした。
gcloud config list でプロジェクトが確認できます。これはdefault構成だったので、新しい構成を作成。
gcloud config configurations create nullsuck そして、gcloud initは、対話式で聞いてくれるので、nullsuckプロジェクトを指定することにより、環境が切り替わります。
そこで改めて、docker pushをすると、今度は成功しました。
公開設定が「非公開」になっているのが、本とは異なるので、若干気になる・・・
OutSystems でのアプリ自動生成
一連の投稿の続きになります。
OutSystemsはローコード開発か。ノーコーディングにはならないのか、ということで、OutSystems とGlide App(glideapps)の比較用に、Glide で使用したものと同じデータを使用して、OutSystems でアプリ自動生成を行ってみます。
使用するデータは、下記で調整を行なった、港区観光施設データです。Glideの味わい方〜オープンデータを活用しよう OutSystems 環境整備 OutSystems セルフトレーニングで、最後に肝心のデザイン変更のところを飛ばしてしまいましたが、そこでは、SILK UI フレームワークのDublin テンプレートを使用することになっていたので、まずは、そちらをインストールします。
Forge page で「Dublin Template」を検索して、インストールします。
そして、アプリケーションの作成。
Dublinテンプレートによるアプリ作成(失敗) 順に進めていくと、初期画面が出来上がります。
一度ここで起動してみるとこんな感じ。
この辺が、どうも何をしているのか、何をすべきなのかよくわからない。
そして、結局起動できず。
もしかして、Mac版はダメだけど、Windows版なら、と思ったのですが、ダメでした。一応、画面生成まではできましたが、起動しません。一応、こんな画面ができるという感じです。
Dublinの場合は、左上に、デバイス切り替え機能がつきます。
基本テンプレによる画面作成 では基本テンプレートならどうかということ、こちらはできました。
テンプレートとしてTop Menu を選択する以外は、上記Dublinの場合と同じです。
デザイン画面を開いて、おもむろにExcelをインポートしますが、Google スプレッドシートからダウンロードしたものはExcelファイルではないと言われて、失敗しました。一度Office 365 で開いて保存し直したら大丈夫でした。
ただ、シート名、1行目の名称でテーブルを作ってくれると思ったら、それは失敗しました。
まずWindows版だと、ちゃんとシート名を認識はしてくれています。
これが、Mac版だとこの時点でダメ。
で、Windows版でも、Mac版でも、インポート結果はこの通り。
単なる連番になってしまいました。これは、シート名、項目名が日本語のためかと思われます。
それでも進めることはできます。
基本テンプレの場合は、初期状態でMainFlowには何もありません。
ここにEntity1 を2回ドロップすることで、リスト画面と詳細画面が生成されます。勝手に結合されている状態です。
実行する前には、各画面のAnonymous プロパティをチェックOnにします(ログイン画面を表示させないため)。
そして起動するとこのような画面が生成されます。明細部分のページングもされていますし、これをスタートとするのは大いにアリでしょう。
Glide と違って、参照画面だけでなく、更新画面も生成されます。これは割と大きな違いかもしれません。
ただ、これを完成品としては公開できないかなという感じがあり、その辺が繰り返しになりますが、Glide App と、OutSystems の違いになるような気がします。
Glide とOutSystems
Qiita に初投稿してみました。
Glide App(glideapps) のMap List 機能
https://qiita.com/JQinglong/items/8c8cd2e2d5c29225972a
ノーコーディングツールとしてのGlide App(glideapps)(検索で引っかかりにくいので、こういう書き方をしてみてます)のパワーは凄まじい。
今回取り上げたMap List 機能で、地図上に複数展表示ができる。そして、これは単にスプレッドシートの場所情報を表示しているだけであり、スプレッドシートの更新は自由にできる。
そして、ちょっと前に、Per-user data 機能も追加されており、ログインユーザごとのデータのフィルタリングができるようになっている。
これらを組み合わせると、あんなことやこんなことや・・・
そして、Glideの中では、一切コーディングさせない。コーディング的なこともさせない。
一方、OutSystems。
これもアプリの色々な要素の自動生成機能は凄まじい。ある意味、Glideと同じことは、ほぼ同様にできる(あとでやってみる)。
そしてそこにとどまらない。基本的に、どんどん自動生成されたものに対してさらにカスタマイズできる。自動制裁されたアプリを見て、オブジェクト、変数、RDB構造のようなものを想定できるならば、どんどん「式」を書ける。
これは考え方の違いでしょう。
OutSystems は、ノーコーディングというよりはローコーディングであり、結局は従来と違う方法でコーディングしている。そして、たまにコーディングの影が見える。この影が見えると、拒絶反応を起こす人はそれなりにいて、それは自分の仕事ではないと感じるのだと思われる。
OutSystems を見て、Accessだなと感じたのは、基本的には自動生成してくれるのだけれども、それで完了でもなくて、そこから手を入れるんだなというところ。だから利用者もエンドユーザではなく、開発者。
Glide は徹底的にノーコーディングで完成品まで持っていくことに徹している。
これにより利用者としてエンドユーザも入ってくると思われる。そのためには、痒いところに手が届かないのも、今はやむを得ないという考え方。イノベーションのジレンマが発生している状態ではあるが、一気にこの20数年の開発スタイルをひっくり返しかねないやり方だ、というのは言い過ぎ??
9.4 スキャフォールディングとRichWidgetを使ってみよう(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。8.2 ウェブサービスのエクササイズ(OutSystems セルフトレーニング) Part 1: Add Cinemas at Warp Speed 前に画面を誰かが勝手に作ってくれたと思ったのは、スキャフォールドだったんですね。
勝手に作るんじゃなくて、ドラッグ&ドロップで作ってくれるというのも良いなと思います。
さらに画面へのドラッグ&ドロップで明細画面を追加してくれて、ポップアップエディタまで作ってくれるのはすごい。
で、ポップアップエディタは作ってくれましたが、Popup_InfoBalloonはダメでした。今度は検索したら選択肢には出てきますが、ドロップするとエラー。
もしかしてlondonじゃないから?
変えるのも大変そうだけど・・・
https://www.outsystems.com/forums/discussion/15489/changing-the-theme-of-my-application/#Post84632
Part 2: RichWidgets とりあえず進めてみる。
LayoutsOther¥Layout_Popup を選択するところは、LayoutOther が存在しないため、Layouts¥LayoutPopup を選択してみたが、削除することになっているHader もFooter もないので、やはり違うみたい。
MovieTable のStart Index プロパティに、List_Navigation_GetStartIndex(MovieTable.Id) を指定するとのことだが、エラーになってしまう。
それは諦めて、Dynamic Sortingの追加をしたら、またエラー。
一旦追加したList_SortColumn を削除したのですが、復活せず。
最後に破壊してしまいました。
とりあえず、この先は別のアプリを作ってみるエクササイズなので、OutSystems セルフトレーニングシリーズは、ここで一旦終了とします。
8.2 ウェブサービスのエクササイズ(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。7.4 セッションハンドリングのエクササイズ(OutSystems セルフトレーニング) Part 1: Add a Reference to a REST endpoint こんなサイトがあり、APIを提供している。
https://www.themoviedb.org/
Part 2: Define Site Properties for the API サイトプロパティの追加のみ
Part 3: Call a Web Reference method 画像を選択するところで、RichWidgetsが表示されないので、Header_Logoというものが選択できない。
まあ、普通のLogoでもよいか。
そして、ここではStyle Editorが登場する。
ServiceCenterでログも見られます、は良いが、詳細のリクエスト内容までは見えないですね。
Part 4: Implement a Web Service Callback OnAfterResponse というコールバックイベントが用意されています
7.4 セッションハンドリングのエクササイズ(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。6.4 ウェブブロックとUIを再利用してみよう(OutSystems セルフトレーニング) Part 1: Create and use Session Variables Find Usages みたいな技を教えてくれるのは良いですね
Part 2: Create and use Site Properties サイトプロパティを変えてもブラウザ再表示でMovie詳細画面のまま反映された。
6.4 ウェブブロックとUIを再利用してみよう(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。6.2 画面のライフサイクル: Ajaxのエクササイズ(OutSystems セルフトレーニング) Part 1: Create a Web Block for star ratings Placeholder のwidth はempty にはできず、Fullにしておく
Part 2: Make the stars in the Block clickable Search Box で「Notify」を検索することとなっているが、検索されない。
https://www.outsystems.com/forums/discussion/41219/notify-deprecated-in-service-studio-11-what-can-i-use-to-replace-it/
Manage Dependencies (ctrl + q) で探してくれは良いけど、Deprecated(廃止予定)ってどういうこと?そちらを教えて欲しい・・・
・・・一応その回答はこちら。
https://success.outsystems.com/Documentation/11/Developing_an_Application/Design_UI/Reuse_UI/Use_Events_to_Propagate_Changes_From_a_Block_to_the_Parent
これまでは、ウェブブロックの中でScreenAction(テキストではStarClicked)を定義して、それをNotifyするという仕組みだったのが、11では、ScreenActionとは別のEventというものが定義できるようになった。
Notifyのメッセージとして、値等(StarIterator.List.CurrentRowNumber + 1)を定義し、さらに親画面におけるウェブブロックインスタンスのDestinationとしてアクション(OnRatingNotify)を作成して指定する、と言う流れだったのが、バージョン11では、親画面でイベントに対応するハンドラを書く、と言う感じ?
そして、Destinationのアクション(OnRatingNotify)の記述として、Figure 26のような割と複雑なロジックを作っていくわけですが、これはどう書くのだろう・・・
ちょっとテキストがバージョン11に追いついていないので、ここは飛ばしていきます。
Eventsという形にしたのは悪くないと思うのですが。
6.2 画面のライフサイクル: Ajaxのエクササイズ(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。5.7 Input Validationのエクササイズ(OutSystems セルフトレーニング) Part 1: Add a comments sidebar to movie Container の幅指定の方法は変わっている。
Styles Editor を指定。
bold 、italic 設定もStyles Editor で。
CreateUserMovieComment はCoreUserMovieComment の中
Assign してReflesh すると言う流れを理解する
5.7 Input Validationのエクササイズ(OutSystems セルフトレーニング)
テキストによるエクササイズの続きです。5.5 Actionとコードを再利用してみよう(OutSystems セルフトレーニング) Part 1: Test the built-in validations Validation設定のServer とServer & Client を試す
Part 2: Add validations to editing a movie Feedbackメッセージを日本語で入力しようとしたら文字化けした!
ここまで長くなってくると全体が見通せなくなる。
一つ一つのプロパティを見ないと何をやっているのか分からない。
また、この辺でソース管理についての説明があると良いのでは
Part 3: Test the validations for editing a movie 動作確認
Part 4: Add validations for editing a person 自分でやってみよう、ということなので、一つだけやって、取り急ぎ進めます。
Part 5: Test the validations for editing people 動作確認