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 Fiddle

初めにデータ定義も行わないといけないので,適当なテンプレ載せときます。(自分用)

 

CREATE TABLE 発注
     (`発注番号` int NOT NULL PRIMARY KEY, `発注者` varchar(7))
 ;
     
 INSERT INTO 発注
     (`発注番号`, `発注者`)
 VALUES
     (1, 'tanaka'),
     (2, 'sato'),
     (3, 'okamura')
 ;

 

これらの説明は以下のサイトを参考にさせていただきました。すごくわかりやすかったので,上記でわかりずらかった方はこちら見ていただきたいです。

SQL素人でも分かるテーブル結合(inner joinとouter join) - Qiita

 

組み込みシステム

文章問題って感じで,特に書くことない(点数はボロボロでした)😇

 

Dashボタンで勤怠管理システム開発

はい。やっとタイトルに書いてあることに触れるためにのスタートラインに立ちました。笑

ここからは,前回記事の続きです!

ダッシュボタンで出退勤管理 - k12si’s diary

 

やったことは以下です。

厳密にはLambda上で動かすを行っている段階で,rubyで利用するGoogleAPIのファイルをLambda場にアップロードしようとしました。

 

すると,10MByte以上は上げれないと・・・。

 

しかしS3に一旦zipを保存したらあげることができました!

 

コード編集できないけど,関数の実行はできるみたいです!!ってことにこのブログを書いてて気づきました笑

 

f:id:k12si:20190402024701p:plain

ジャパニーズでめっちゃわかりやすく書いてくれてた。笑

 

エラー出ているので,またLambda上で動かせたら報告します。

(アクセストークンの認証とかであんまり上手く行く気がしない😰)

 

最後にスプレットシート出力のスクリプトを書いていて詰まったことを書きます。

スプレットシートに日時を出力

GoogleAPIを利用するときに,いつも詰まるのがアクセストークンの取得です。

 

正直何をしているのかさっぱりです。

 

OAuthやらサービスアカウントやらIAMやらcredentials.jsonやら環境変数やら。。

「何してんの!?(^ω^)」って感じです。

 

しかし,クイックスタートで上記のような認証を何も考えず,すぐにAPI使えちゃいました。

 

そして,早速スプレッドシートに書き込むAPIを調べました。

以下のメソッドでレコードに追加できました!

Method: spreadsheets.values.append  |  Sheets API  |  Google Developers

 

Rubyコードでパラメータの渡し方が載っていなかったので,載せておきます。

# 出勤時間データ
  going_work_time= {
      values: [[
        Date.today.strftime('%Y/%m/%d'),
        Time.now.strftime('%H:%M:%S')
    ]]
  }

  # スプレッドシート出力
  response = service.append_spreadsheet_value(spreadsheet_id, range, going_work_time, value_input_option: 'USER_ENTERED')

 

さて,これでシートに追加されると思ったのですが,以下のエラーが出ました。

 

forbidden: Request had insufficient authentication scopes. (Google::Apis::ClientError)

 

はい、出た。

権限エラーだ。🤯🤯

 

結論から言いますと,自分のコードのAPIでのスコープがリードオンリーになってたことが原因でした。

 

そうとは思わず,上記で書いたような用語を調べていて,ざっくりですが理解できたのでメモとして最後に残しておきます。

 

まず,OAuthとは認可サーバです。

 

アプリケーションなどのクライアントがAPIをリクエストするためのアクセストークンを発行しています。

 

以下にGoogleAPIを利用するまでの流れを図で示す。(実際に行ったわけではないので誤りがあるかもです🙇‍♂️)

 

f:id:k12si:20190402041547p:plain

サービスアカウントとはアプリケーションなどのクライアント用に,アクセストークンを発行するためのアカウントである。

 

IAMとはアカウントに付与する権限のこと。

 

また,サービスアカウントでアクセストークンを発行するために必要となってくるのが,credentials.jsonなどのファイルである。(などと付けたのはJSONファイル以外の形式で,サービスアカウントキーを取得する方法があるため)

 

このファイルを持って,OAuth認証を行う事で,アクセストークンが記述されているYAMLファイルが取得できる。

 

以上です。

 

なお,OAuthに関して以下のサイトがとてもわかりやすかったです。

一番分かりやすい OAuth の説明 - Qiita

 

書いていてもまだまだ腑に落ちない部分が多く,完全に理解して書いているわけではないです。🙇‍♂️😂

 

また調べてわかり次第,編集したいと思います。

 

しかし、エラーの原因がこういった事では全くないということに2時間調べてわかりました。

 

最後にスコープ範囲をリードオンリーから編集許可に変更し,実際にスプレットシートに出力した結果を貼っておきます。

 

f:id:k12si:20190402042722p:plain

 

ソースコードも貼っておきます。

まだ作成段階なので,途中でリンク切れするかもです。

TIL/going_work_time.rb at master · k12si/TIL · GitHub

 

それでは,今日はこの辺で👋