LIFF×Vue×Flask×Cloud Runアプリ実装(LINEアプリ)②

こちらの続き 前回までで基本的な環境構築はできているので、この記事はVueの内容がメインになるかと思います。 「Options API」と「Composition API」 ちょっと本筋からズレちゃいますが、実装を試していく上でハマったので、Options APIとCompositon APIの書き方の違いについて触れたいと思います。 前の記事でLIFFの開発環境を構築した際は以下のように、Options APIでソースが生成されていました。(sendMessagesの部分だけ前回の記事で追加しています) src/App.vue これは古い書き方っぽくて現在のトレンドはCompositon APIだそうなので、以下のように修正します。 コードの量が減り見やすくなりました。 この状態で後続に進みます。 子コンポーネントを使用 Vueではパーツごとにコンポーネントという単位でファイルを分けて、必要に応じて取り込めるということなので、一旦子コンポーネントを作成して表示します。 src配下にcomponentsというフォルダを作成して、components配下に、CustomTextArea.vueというファイルを以下のように作成します。 次にApp.vueを以下のように変更します。 import文の追加と「<CustomTextArea 〜/>」というタグの追加です。 画面遷移 Vueの機能を使用して、ルーティング機能を追加しようと思います。URLごとに表示するコンポーネントを出し分けることで画面遷移を実装していきます。 vue-routerをインストールします。(公式サイトはこちら) インストールできたら、main.jsと同じ階層にrouter.jsを作成します。 そして、同じ階層にviewsというフォルダを作成して、その中にTest1.vue、Test2.vueを作成します。 中身は前回使用したvueファイルをコピーしただけで「test1です」「test2です」という文言だけ追加してます。 続いてmain.jsを修正 router.jsを使用できるようにします。 App.vueも修正 修正箇所としてはRouterView, RouterLinkのimport追加 「<RouterLink to=></RouterLink>」でリンク追加 「<RouterView />」でリンクをタップした場合の表示領域の作成です。 画面表示します。まずは「<liff url>/」 「リンクテスト」「リンクテスト2」というリンクが追加されています。 続いて、リンクテストをタップ test1ですという文言などが表示されます。 続いてリンクテスト2をタップ test2ですの表示に切り替わりました。

PythonのログをGoogle Cloud(GCP)のログエクスプローラーに出力する

Google Cloud(GCP)のサービス(Cloud Run、Cloud Functionsなど)をPythonで実装した場合に、ログをGoogle Cloud(GCP)の標準のログエクスプローラーに出力する方法を記述します。 公式ドキュメントはこちら Google Cloud(GCP)のログエクスプローラーにPythonの標準ログを接続する設定 以下をプログラム内に記述 これで、Pythonの標準ログを出力するとGoogle Cloud(GCP)ログエクスプローラーに出力されるようになります。 Pythonのログ出力は以下の通り(公式ドキュメントはこちら) ログレベルは以下の通りです。 公式ドキュメントには、いろいろ説明がありますがレベルはプロジェクトごと、開発チームで決めちゃえばいいと思います。 Google Cloud(GCP)の出力は次の通り このままだと、debugレベルが出力されてない様です。 Pythonのログレベルの設定をします。 logging.getLogger()でログ出力するオブジェクトを取得して、setLevelでログレベルをセットしています。 出力結果は以下の通り 設定ファイルを使用してログを制御する方法 logging.configというファイルを使用したログ設定です。 こちらの方が環境ごとの分岐など、実用的かなと思ったのですが、ハンドラにうまくgoogle.cloud.loggingのクラスが渡す方法がわからずエラーとなるため、一旦、この方法は断念します。 試してみたファイルとエラーメッセージだけ記載しておきます。 公式ドキュメントはこちら ※getLoggerで名称を指定しなければrootが取得される想定 以下、config/logging.confファイルです。 この状態で実行すると 確かにgoogle.cloud.logging.handlers.CloudLoggingHandlerはインスタンス時に「google.cloud.logging.Client()」を引数として渡す必要があるのですが、やり方がわかりません… 設定ファイルを使用しないやり方の方が無難なのかもしれません。

モダンJavaScript?の変数宣言

ここではモダンJavaScriptの変数宣言について書きます。JavaScriptでは従来(2015年以前?)は、「var <変数名>」という形で変数宣言を行っていましたが、最近のJavaScriptでは、「const <変数名>」「let <変数名>」で変数宣言することがより良いみたいです。違いを見てみましょう。 ※こちらはUdemyでの学習メモです。 varによる変数宣言 まずはvarによる変数宣言を見てみましょう。 上記の様に、varを使用すると自由に変数の値を変更や再宣言ができてしまいます。コードが大規模になったり複雑になると、どこで値が変わってるか解読するのに時間がかかるため、可読性が悪くなります。 letによる変数宣言 次にletによる変数宣言です。 letは、varと同様に変数の宣言、変数の値の変更が可能です。ただし、③の再宣言ができません。③の再宣言をしてしまうと↓の様にJavaScriptのエラーになります。(下はブラウザ上に表示されます) letは、値が変更される変数に使用します。再宣言はできないため、意図せずに変数が違う使い方がされるなどを防ぐことができます。 constによる変数宣言 つづいて、constによる変数宣言です。お察しのとおり変更も再宣言も不可の変数宣言です。まずは宣言して、値を変更してみます。 ↑の様に②で値を変更すると、↓の様なエラーになります。 続いて再宣言も試してみます。 ↑のようなエラーとなります。 値の変更が必要ない変数の場合はconstを用いた方がソースコードの可読性が上がります。チームで開発してたりすると、かなり助かります。 【例外①】constによるオブジェクトの宣言 constによる変数宣言の例外として、オブジェクトの定義があります。以下の例を見てください。 ↑の様にconstで宣言してもプロパティの値は変更できてしまうので注意が必要です。同様にプロパティを追加することも可能です。 val3を追加しても特にエラーにもならず追加されます。 【例外②】constによる配列宣言 オブジェクトと同様に配列も値の変更が可能です。 上記のように、配列の中身の変更、要素の追加も実行できます。 ※他の記事へのリンクはこちらからどうぞ 以下の記事もよかったらどうぞ!

React state

Stateとは ReactにおけるStateとは、Component內部で使用される変数のことです。 ※React入門はこちらからどうぞ ※こちらはUdemyでの学習メモです。 setState()を使用して値をセットする 変数なので、直接変数に代入する処理を入れても良いのでは?と思われると思いますが、setState()メソッドを使用しないとワーニングが出ます。 setStateを使用したプログラムの記載例 「testState」というstate(変数)に、”test”という文字列を代入しています。setState()メソッドには画面の再描画処理が含まれているため、実行すると画面表示が変わります。

React PropTypesの設定

PropTypesとは props(プロパティ)のチェックを行うものです。 ※React入門はこちらからどうぞ ※こちらはUdemyでの学習メモです。 サンプルプログラム(型チェック) ↑では、2番目の引数props2が数値型であることをチェックしています。 以下のコマンドを実行して画面表示確認 3行目の引数が設定されていない配列がデフォルト値:”default”という文字列になっているため、コンソールに以下の様なワーニングメッセージが表示されています。 サンプルプログラム(必須チェック) ↑のチェックに「isRequired」を追記し、一時的にデフォルト値の記述をコメントアウト(無効化)します。 3行目にprops2の値が設定されていないため、コンソールに以下の様なワーニングメッセージが出力されています。

React map()を使用してみる

Reactのmap()とは 配列データに対して繰り返し処理を実装するための関数です。以下の様な形式で使用します。※React入門はこちらからどうぞ ※こちらはUdemyでの学習メモです。 サンプル(配列の中身を画面に表示) propsの使い方はこちらを参照ください。 以下のコマンドでサーバを起動して表示確認 正しく画面に表示されることを確認しました。

React入門(Hello World表示してみよう)

React入門のページです。ReactとはJSXと呼ばれる「js + XML」で感覚的にWebサイトが構築できるものになります。ここでは「Hello World」の表示などの簡単なサンプルプログラム、「トランスパイル」などの用語や便利サイトであるBABELの紹介もしてい ます。 ※Udemyでの学習メモです。 JSX JavaScript構文の拡張。JSX は React “要素” を生成します。HTMLをJavaScriptの中に表現できるイメージです。 ※注意:JSXでreturnするタグは1つのHTMLタグである必要がある。(長いタグの場合は<React.Fragment>や<div>などで囲むなどの工夫が必要です。 JSXを使用する際の宣言 JSXを使用する場合は、必ずReactをimportする。 簡単な画面表示の例 試しに「Hello World」を画面に表示 ブラウザを起動します。以下のコマンドをターミナルで実行します。 定数 domに代入した「<h1>Hello World</h1>」が画面に反映されてます。 定数をHTML内に埋め込む HTMLの中に別の変数を含めて表示する場合の例 定数changeを「Hello Japan」と定義して、次の定数domの中で定数をchangeを{}で囲んで呼び出しています。 HTMLのClass属性の指定 JSXでは「className」という属性を指定して、HTMLのclass属性を指定する。 ブラウザを起動して、HTMLを確認すると「class=”test”」となっていることがわかります。 入力欄をクリックしたらコンソールにメッセージ出力 ブラウザを実行 ブラウザに入力欄が表示されて、クリックした場合はコンソールに「text click」という文言が出力されています。 トランスパイル HTMLとJSXのコードを変換することです。 BABELの使用 こちらのサイトを使用して、JSX⇔HTMLの変換を確認することができます。 左のペインに表示したいHTMLを入力すると、右側にJSXコードが出力されます。開発するときには、こちらを参考にされると良いかと思います。 ※他の記事へのリンクはこちらからどうぞ