@m_seki の

I like ruby tooから引っ越し

lambdaのノート、Ruby編

AWSのlambdaのこと

AWS lambdaでRubyが使えるようになったそうなので、いつまでもlambdaを避けて通れなくなってきました。(自分に言い訳しづらくなてきた) 仕事でもそれ以外でも使ってないし、AWSしぐさが全然わからんのです。ぐぬぬ

最終的にやりたいこと

CGIで済むようなものを作れるようになっておきたい。(池澤さんのための素振り)

準備

はじめてのAlexaスキル開発 [音声認識アプリ開発の基礎知識を身に付ける! ]

はじめてのAlexaスキル開発 [音声認識アプリ開発の基礎知識を身に付ける! ]

アレクサの本を読んでAWSアカウントの作成やら、lambdaの簡単なサンプルは実験してありました。 この本、サンプルアプリは少ないんだけど、アカウントの作成が詳しくて重宝しましたよ!

今日やったこと

gemとかアーカイブしてアップロードして...みたいな記事を見てやってたけどうまくいかなくて(今は原因わかったけど)、基本に戻ろうと思って次の関数書きました。 ハンドラに渡される引数をppして確認するだけのlambdaです。

lambdaの設定画面から新規の関数を作って埋めただけ。

require 'pp'

def lambda_handler(event:, context:)
    body = { 'event' => event, 'context' => context }.pretty_inspect
    
    {
        'statusCode' => 200, 
        'headers' => { 'Content-Type' => 'text/plain'},
        'body' => body
    }
end

トリガーの左のペインからAPI Getewayっていうのを選んでいろいろ適当にやった結果動くようになりました。

https://8zmwlgdxf9.execute-api.ap-northeast-1.amazonaws.com/default/pp_inspect

実行すると引数のオブジェクトを観察できます。URLの末尾にパスを連結したり、クエリを追加したりしてHashがどう変わるか調べることができました。 WEBrick::CGIやTofuにこのインターフェイスを吸収するレイヤーを用意するのがかっこいいんだろうけど、どうせ誰かやるだろうから待ってよう。

ところで、URLから「default/」(ステージ?)っていうのを消したいんだけど...(よくわからないのでそのまま...)。

最後にリクエストの表現がわかってきたので、EAN(JAN)コードを与えると、その商品のamazonのページに飛ぶ関数を書いてみました。 クエリに「ean=値」をつけると該当商品のページが表示されます。(追記: 移動先のURLを以前は自分で組み立てていましたが、リクエストの結果から転記するようにしました。 2018-12-23)

https://qtmf64s8p8.execute-api.ap-northeast-1.amazonaws.com/default/myFirstRuby?ean=9784756142818

合わせて読みたい

ラムダノートのラインナップより。

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

通販でスタッドレスを買ったよ!

去年のネタの続き。

druby.hatenablog.com

 

このときは結局買わなかったんだけど、今年はついに通販でスタッドレス買ったよ!ホイールなし、タイヤのみです。佐々木くんがWINTER MAXX02を使っているそうなので、参考にお安いWINTER MAXX01にしました。私のゴルフ7トレンドラインのサイズは195/65R15。たぶんプリウスとかも同じようなサイズじゃないかな。4本で36000円でした。

 

 

いつものVWのディーラーにお願いして組み替えしてもらいます。作業の費用は廃棄費用等含めて一本2500円前後になると思う。(前回はそうだった。)

 

今回は今までのホイールがあったからそれを使うのけど、クルマを買ったばかりで新たに買うなら、ホイール付きのタイヤの方がお買い得だと思う。バランス取りした状態で送られてくるから取り付けるだけ。

 

HKQueryAnchorの永続化についてのメモ

HKQueryAnchorの永続化のメモだよ

先日のHealthKitの練習のときのメモ。HealthKitのデータには登録順にアンカーと呼ばれる整数のようなものがつけられています。これを使うと前回読んだ事実(データ)よりもあとに増えた事実を集める処理が書きやすいです。Dripのキーに近い。

つまづき

アンカーはHKQueryAnchorのインスタンスです。作るときはこんな風にしました。

myAnchor = HKQueryAnchor.init(fromValue: 0)

整数から作れるのね。よしよし。整数にして保存しようっと...と思って困ったのは整数化するインターフェイスがないところ。
NSLogとかでデバッグプリントするときは内部の整数風の値を見ることができるけど、整数を取ることはできないみたい。

これはめんどくさい予感。

永続化

HKQueryAnchorから整数を取り出すのではなく、NSKeyedArchiver.archivedDataを使うのが正解みたい。UserDefaultsに保存するときはこうか?

    func saveAnchor() {
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: self.myAnchor, requiringSecureCoding: true)
            let defaults = UserDefaults.standard
            defaults.set(data, forKey: "anchor")
        } catch {
            NSLog("encode failed")
        }
    }

失敗してもできることがないから、catchしなくてもいいくらいなんだけどどうするのが良いんだろ。

読み出しも同じようにした。

    func initHK() {
        // ...
        myAnchor = HKQueryAnchor.init(fromValue: 0)
        let defaults = UserDefaults.standard
        guard let it = defaults.data(forKey: "anchor") else { return }
        do {
            myAnchor = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(it) as? HKQueryAnchor
        } catch {
            // nop
        }
    }

まだSwiftの?や!やtryの気持ちがわかってない。コード片も自信がない。

まとめ

自分なら整数か文字列にすると思う。けち。