AWS DynmoDB FilterExpressionの落とし穴

ちょっとマニアックで癖のあるAWS DynmoDB。

FilterExpressionで絞り込み検索することは、多々あるかと思います。

データ一覧を、1ページ内に固定件数で表示する場合は、注意が必要です。

例えば、1ページ=50件とすると、pythonでは以下のようなコードになるかと思います。

tbl1 = dynamodb.Table("テーブル名")
   :
   :
resp = tbl1.query(
          KeyConditionExpression=Key('キー名').eq('キー値'),
          FilterExpression=Attr('フィルタ項目名').eq('フィルタ値'), 
          Limit=50 )

しかしこのままですと、対象データが存在していても、目標の50件が取り出せません。最悪0件という場合もあります。

dynamodbでは、Limitの件数を取り出した後に、FilterExpressionがかかります。

通常のRDBをご存じの方は、そんなバカな! という感じられるかと思います。ちょっとひどいですね。

Fillterして規定件数を、読み出したい場合は、以下のようにqueryをloopさせるしかありません。

reccnt=0

while( reccnt < 50 ):
   resp = tbl1.query(
          KeyConditionExpression=Key('キー名').eq('キー値'),
          FilterExpression=Attr('フィルタ項目名').eq('フィルタ値'), 
          Limit=( 50 - reccnt ) 
   )
   if reccnt == 0 :
       items = resp['Items']
   else:
       items.extend(resp['Items']) #検索集合を結合

   reccnt = len(items)

それならこれでいいと思われるかもしれませんが、queryのcall回数のオーバヘッドが生じます。特に、残り1件で、フィルタ後の件数が0が続くと、何回もループしてしまい、応答遅れが顕著に現れます。

本対策としては、FilterExpressionは使わず、予めキーとしてテーブル設計を行う必要があるようです。

しかし既にデータが蓄積された状態では、途中からキー追加は避けたいところです。

AWS DynmoDBでProvisionedThroughputExceededExceptionをpythonで検出するには?

ちょっとマニアックで癖のあるAWS DynmoDB。

ちょっとアクセス負荷をかけると以下のエラーがでてしまいます。少し間をおいて再操作で解消します。

上記はトラブルシューティング用に、pythonでexcept句で検出した内容を、ブラウザにまんま返してるんですが、これはエンドユーザさんが見てしまうと、ビックリして苦情になってしまいます。

なんとかProvisionedThroughputExceededExceptionを検出したいのですが、except句で、まんまProvisionedThroughputExceededExceptionを書いてみると、実行時エラーになってしまいます。

以下URLをみると、

https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/exceptions/ProvisionedThroughputExceededException.html

「boto3.dynamodb.Clients.exceptions.ProvisionedThroughputExceededException」かな?と試してみるとダメです。他WEBのHowTo記事にも情報がない。色々試すと以下の方法でできました。

 client = boto3.client('dynamodb') 
   :
   :
try:
  中略
except client.exceptions.ProvisionedThroughputExceededException as e:
    return {
        'statusCode': 503,
        "headers": {"Content-Type": "text/html"},
        'body':'Server busy'
    }    

これで、WEBページ側で、HTTPステータス:503を判定して、やんわりしたメッセージをだせば、ユーザを驚かすことなく、再操作を促せます。

SH2でPCシュミレータを使ってみる

SH2でもPCシュミレーターを試してみます。IDEは、HEWです。

伝統のSHもものは洗練されているかと思いましたが、マイコン機能のすべてがシュミレートされないようです。

タイマCMT0 の割り込みはシュミレートされました。

AD変換完了割り込みは、シュミレートされないようです。Brekeも効かず、カウンタもUPしません。

画面上のボタンを押して、割込みを呼出す機能を使ってもダメ。

変数と関数の呼出し回数を表示しても、AD変換割込みは発生してないです。

RL78のようになマイコン全体のシュミレーション機能ではないようです。関数の単体テスト用でしょうか? もしくはもっと深い使い方があるのでしょうか?

RL78のPCシミュレータを使ってみる

メーカ在籍時は、テスト基板に困ることはありませんでしたが、ベンダーの立場になるとテスト基板が無い状況も多々です。RL78のPCシミュレータを試してみます。IDEは、e2Studioの方です。

詳細な操作方法は、ルネサスのマニュアルをみていただくとし、概要は以下のようにります。

まずデバックの設定で、「RL78 Simulator」を選択します。

シミュレータGUIより、動作条件を設定していきます。

GUIパネルを作って、パネルエディタからドラックで各GUIを配置。.

信号入力にはボタンを割り当て。

AD入力にはダイヤル割り当て。

信号出力はLEDを割り当て。

これでポート入出力、割込み、デバックができます。

タイマーもシミュレートされます。

UARTは、シリアルウインドウを表示して、送信値は手打ちします。簡単な繰返し送信モードがあります。

しかしシミュレーションの実行時間は、現実の4倍くらいありました。

タイミングチャートもあるので、それで実時間との差を確認する必要があります。

Visual Studioのクラス図はどんな感じ

市販のUMLツールでは、クラス図がコードから生成できるもの、できないもの様々なようです。Javaでないとダメなものもあります。Visual Studioでもクラス図が生成できるようです。利用方法は他WEBページでも多数紹介されています。

生成したい状況は、以下の2とおりでしょう。

  • 自分が作ったものを他者に説明したいとき
  • 他人が作ったものを解析したいとき

具体的に使い物になるのか、開発中のコードをあてがって見てみました。

  1. クラスの継承

白い線が継承です。MFCの階層含めて追えていますね。構造体やenumも出してくれます。

2. クラスの関連

クラス間の呼出しや参照、関連は黒い線です。これも追えてはいますね。

3. クラスの関連

メンバリストを必要に応じて閉じることができ、全体の見渡しもしやすいようです。

なるほど。ままず使えそうですね。