アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


serverless.ymlでDynamoDBテーブル定義エラー

以下みたいなDynamoDBテーブルをserverless.ymlで定義し、deployしようとするとエラーが。

resources:
  Resources:
    HogeUsers:
      Type: "AWS::DynamoDB::Table"
      Properties:
        TableName: Users
        AttributeDefinitions:
          - AttributeName: Id
            AttributeType: S
          - AttributeName: UserName
            AttributeType: S
        KeySchema:
          - AttributeName: Id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
エラー内容

Property AttributeDefinitions is inconsistent with the KeySchema of the table and the secondary indexes

そうでした。
DynamoDBはスキーマレスなので、キースキーマとなる属性以外最初に定義する必要はありません。

なので、キースキーマ(プライマリキー、レンジキー) やセカンダリインデックスで使用する以外の属性を記載していると、
キースキーマとセカンダリインデックスと一致しないよ、と怒られてしまいます。
RDBばかり使っていたので、たまに混乱することがあります。

特定のDockerイメージに属するコンテナを一括削除してスッキリする

気づいたらあるDocker imageのコンテナが200個ほどできておりました。

docker rm コンテナ名 コンテナ名 コンテナ名

と複数指定して削除もできますが、200個は無理ということで、特定のdocker imageに属するdocker containerを一括削除するコマンドが以下です。

特定のDockerイメージに属するコンテナを一括削除するコマンド

docker rm $(docker ps -a | grep "Dockerイメージ名" | awk '{print $1}')

docker ps -a で起動していないものも含め全てのcontainer を列挙します。
これをgrepで絞込み、1つめに出力されるdocker container のIDを、docker rm に渡しています。

これでスッキリ!!

スッキリしました。

追記: もっとスッキリ書ける方法

ブコメにてもっといい方法を皆様に教えていただけました。ありがとうございます!!

bottomzlife さんおすすめの方法

$ docker rm $( docker ps -qa --filter name=image名 )

mapk0y さんおすすめの方法

$ docker rm $(docker ps -a -q -f ancestor=image名)

Twitter Kit for iOSを使う

Twitter 関連のモバイルアプリを作るなら非常に便利なのが Twitter Kit。
Twitter公式のライブラリです。
導入がすごい簡単。
Twitter Installation — Fabric for Apple documentation

わかりにくいんだけどこちらにライブラリ公式ドキュメントがあります。

TwitterKit Reference

TwitterKit Reference

Xcode Embedded framework で no such module

iOSプロジェクトでDDDやってみたいと思い、名前空間切れたり、副次的なメリットも多くて色々嬉しいということで embedded frameworkに挑戦してみた。

  • ui
  • domain
  • data
    というembedded framework を作って作業をすすめた。問題もなくいい感じ。
    が、最初は順調に行ってたのだけど、途中からなぜか domain層から import data 記述が no such module エラーをはくようになる。
    また、初めて見るこんなファイルからもエラーが。

module.modulemap

module data.Swift {
    header "data-Swift.h"
}

なぜ突然‥?!と思ってたんだけど、 framework同士の依存関係も明示的に設定してあげないといけない模様。

TARGETS の domainから Build Phases -> Target Dependency でdataフレームワークを追加してあげるとエラーが出なくなった。

それにしても、むしろなぜ今まではこの依存関係を明示していなくても動いていたのかが謎。うーむ。
まぁ問題は解決したのでよしとしよう!

参考リンク

stackoverflow.com

【新しいAppleの push通知】http/2を使ったAPNs Provider API

http/2を使ったPUSH通知について (APNs Provider API) が出てたんですね。
以下にまとめたとおりいいことづくめですが、各種PaaSは未対応のところが多い模様。
しかし、自前実装でも十分その恩恵を受けられます。
以前のめんどくささに比べるとcurlでコマンド叩いてPUSH通知送れるのは正直感動すらあります。

APNs Provider API のいいところ

  • APIにPOSTするだけで通知送信できる
  • 通知の成功/失敗がすぐ確認できる。失敗した場合はその理由も。   => なぜか届かない!みたいな事象に苦しめられることがなくなる
  • 本番/開発で証明書を分けなくて良い

懸念

  • 各種PaaSが未対応のところが多そう

各言語でもラッパーライブラリデているのではないかと思います。(未確認)
Rubyはありました。

通知発行用Rubyライブラリ

github.com

github.com

サーバーサイドを自前で実装している方は、Paasを待たずに自前でやってしまったほうがよいのでは。

公式ドキュメント

developer.apple.com

developer.apple.com

cURLで通知を送る

qiita.com


おまけ

http://qiita.com/itosho/items/2402df4de85b360d5bd9

https://mike-neko.github.io/blog/http2apns-ios/

AWS lambda で "Cannot find module 'index'" エラー

AWS lambda を触っていて、

“Cannot find module 'index'”

というエラーが消えなくてにっちもサッチモいかなくなる事があります。

zipアップロードを利用している際は、ディレクトリごとzipにしてしまっていないかチェックしてみてください。
ディレクトリごとを選択して圧縮するのではなく、圧縮したい全てのファイルを選択し、圧縮して下さい。

コマンドラインなら、作業ディレクトリ内で以下を叩けばOKです。

$ zip -r ../archive.zip ./*