Lambdaの容量制限
こんばんは。1日サボったら、更新がめちゃくちゃ久しぶりな感じがします。
これだけの頻度で更新していると、1日サボっただけで罪悪感がすごいんですよね。・・・いい傾向だ🤪笑
さて、今日は以下2つのことを行いました。
- 応用情報 H30春午後(DB,組み込みシステム)
- Dashボタンで勤怠管理システム開発
それぞれ学んだことを書いていきます。
応用情報
DB
今回のデータベースも難しかったです。特にSQLクエリを書かせる問題が鬼畜すぎました。
その中で、参考書などに乗っていなかったデータ操作言語が2つ出てきたので載せておきたいと思います。
どちらも表を結合する役割があります。
❶SELECT <列1> FROM <表1> INNER JOIN <表2> ON <結合条件>
これは「表1中の列1を取得した上で,結合条件に従って表2からも値を取得し1つの表にする」です。
例えば,以下ような2つの表があったとします。
社員テーブル
ID | 社員名 | 部署ID |
---|---|---|
1 | Aさん | 1 |
2 | Bさん | 2 |
3 | Cさん | 1 |
4 | Dさん | 4 |
部署テーブル
ID | 部署名 |
---|---|
1 | 営業部 |
2 | 経理部 |
3 | 開発部 |
このとき
SELECT * FROM <社員> INNER JOIN <部署> ON <社員.部署ID = 部署.ID>
を実行すると、結果は以下のようになります。
ID | 社員名 | 部署ID | ID | 部署名 |
---|---|---|---|---|
1 | Aさん | 1 | 1 | 営業部 |
3 | Cさん | 1 | 1 | 営業部 |
2 | Bさん | 2 | 2 | 経理部 |
重要なポイントは以下です。
- ベースとなる表は<表1>(FROMで指定されている表が出力)
- 結合の対象がいないベース表中のレコードは削除
❷SELECT <列1> FROM <表1> LEFT(RIGHT) OUTER JOIN <表2> ON <結合条件>
こちらも基本動作は上記と同じです。
ただし,
- LEFTを指定した場合,ベース表は<表1>
- RIGHTを指定した場合,ベース表は<表2>
- 結合の対象がいないベース表中のレコードも残す
例えば,前述と同じように以下を実行すると図のようになります。
SELECT * FROM <社員> LEFT OUTER JOIN <部署> ON <社員.部署ID = 部署.ID>
ID | 社員名 | 部署ID | ID | 部署名 |
---|---|---|---|---|
1 | Aさん | 1 | 1 | 営業部 |
2 | Bさん | 2 | 2 | 経理部 |
3 | Cさん | 1 | 1 | 営業部 |
4 | Dさん | 4 | null | null |
以下のブラウザ環境でSQLを実行できるサイトがよかったです。
初めにデータ定義も行わないといけないので,適当なテンプレ載せときます。(自分用)
これらの説明は以下のサイトを参考にさせていただきました。すごくわかりやすかったので,上記でわかりずらかった方はこちら見ていただきたいです。
SQL素人でも分かるテーブル結合(inner joinとouter join) - Qiita
組み込みシステム
文章問題って感じで,特に書くことない(点数はボロボロでした)😇
Dashボタンで勤怠管理システム開発
はい。やっとタイトルに書いてあることに触れるためにのスタートラインに立ちました。笑
ここからは,前回記事の続きです!
やったことは以下です。
厳密にはLambda上で動かすを行っている段階で,rubyで利用するGoogleAPIのファイルをLambda場にアップロードしようとしました。
すると,10MByte以上は上げれないと・・・。
しかしS3に一旦zipを保存したらあげることができました!
コード編集できないけど,関数の実行はできるみたいです!!ってことにこのブログを書いてて気づきました笑
ジャパニーズでめっちゃわかりやすく書いてくれてた。笑
エラー出ているので,またLambda上で動かせたら報告します。
(アクセストークンの認証とかであんまり上手く行く気がしない😰)
最後にスプレットシート出力のスクリプトを書いていて詰まったことを書きます。
スプレットシートに日時を出力
GoogleのAPIを利用するときに,いつも詰まるのがアクセストークンの取得です。
正直何をしているのかさっぱりです。
OAuthやらサービスアカウントやらIAMやらcredentials.jsonやら環境変数やら。。
「何してんの!?(^ω^)」って感じです。
しかし,クイックスタートで上記のような認証を何も考えず,すぐにAPI使えちゃいました。
以下のメソッドでレコードに追加できました!
Method: spreadsheets.values.append | Sheets API | Google Developers
Rubyコードでパラメータの渡し方が載っていなかったので,載せておきます。
さて,これでシートに追加されると思ったのですが,以下のエラーが出ました。
forbidden: Request had insufficient authentication scopes. (Google::Apis::ClientError)
はい、出た。
権限エラーだ。🤯🤯
結論から言いますと,自分のコードのAPIでのスコープがリードオンリーになってたことが原因でした。
そうとは思わず,上記で書いたような用語を調べていて,ざっくりですが理解できたのでメモとして最後に残しておきます。
まず,OAuthとは認可サーバです。
アプリケーションなどのクライアントがAPIをリクエストするためのアクセストークンを発行しています。
以下にGoogleAPIを利用するまでの流れを図で示す。(実際に行ったわけではないので誤りがあるかもです🙇♂️)
サービスアカウントとはアプリケーションなどのクライアント用に,アクセストークンを発行するためのアカウントである。
IAMとはアカウントに付与する権限のこと。
また,サービスアカウントでアクセストークンを発行するために必要となってくるのが,credentials.jsonなどのファイルである。(などと付けたのはJSONファイル以外の形式で,サービスアカウントキーを取得する方法があるため)
このファイルを持って,OAuth認証を行う事で,アクセストークンが記述されているYAMLファイルが取得できる。
以上です。
なお,OAuthに関して以下のサイトがとてもわかりやすかったです。
書いていてもまだまだ腑に落ちない部分が多く,完全に理解して書いているわけではないです。🙇♂️😂
また調べてわかり次第,編集したいと思います。
しかし、エラーの原因がこういった事では全くないということに2時間調べてわかりました。
最後にスコープ範囲をリードオンリーから編集許可に変更し,実際にスプレットシートに出力した結果を貼っておきます。
ソースコードも貼っておきます。
まだ作成段階なので,途中でリンク切れするかもです。
TIL/going_work_time.rb at master · k12si/TIL · GitHub
それでは,今日はこの辺で👋