フローに仕掛けられたバグをみつけよう!AUG U35 勉強会「デバッグ実践ワークショップ!」

製品技術部の大木です。7/19に東京で3回目となるAUG U35勉強会を開催しました! 前回までは「若手会」という名前で運営していましたが、今回から「U35」にあらため、 年齢の目安も30歳から35歳に拡張しました。

AUG U35イベントレポート2019.7.19

デバッグ実践!

今回は、以前からやってみたいという声が大きかった「デバッグ実践」をワークショップ形式で行いました。

出題した問題は3問!すぐに分かりそうなものからなかなか見つからない難しいものまで用意しました。 皆さん「難しい・・・!」「あともう少しでわかりそう」と悩みながら積極的に問題を説いたり質問したりしてくださり、出題者冥利につきました!

では、実際の問題をこれから簡単に解説します。正解は一つではありませんので、参考程度に確認してみてください。

問題1

AUG U35 問題1 プロジェクト

大量データを読み込み、Mapperで加工してからファイルに出力を行うフローです。 一見シンプルなフローに見えますが、このフローには次のようなバグが仕込まれていました。

  1. フローを実行するとOutOfMemoryが発生する
  2. 連番がおかしくなる
  3. FilePutでデータが上書きされてしまう
  4. 出力した日付が不正

これを解決するためには次の方法があります。

1の解答

FileGetで20万行ほどの大量データをFileGetで一括で取得しているため、メモリを大きく消費し、エラーが発生してしまいます。

そこで、メモリの消費を抑えるためにFileGetの代わりにRecordGetを使用します。

また、最後のコンポーネントをEndResponseコンポーネントにすると大量データをレスポンスとして返すため結局OutOfMemoryが発生します。

このため、Endコンポーネントに変更する必要があります。

2の解答

変更前のフローでは連番付与を「レコード番号」をマッピングすることで行っていました。

1.を解決するためにFileGetコンポーネントをRecordGetコンポーネントに変更すると、ループ処理になります。

ループ処理において「レコード番号」は繰り返し処理されるごとに1から振られてしまい、CSVファイル全体を通して連番を振ることはできません。それで連番を振るために、以下のような処理が必要です。

  • RecordGetコンポーネントで取得行数を1にしてループ回数を指定
  • 取得行数*(実行回数-1)+レコード番号」などの計算

その他にもマッパー変数とフロー変数、Mapperをうまく組わせてつくることもできます。ぜひ、考えてみてください。

3の解答

FilePutの書き込み処理を「新規」に設定すると、ループで書き込みを行うたびに最新のデータでそれまでのデータを上書きしてしまいます。

このため、書き込み処理を「追加」と設定する必要があります。

4の解答

これはおまけ的なバグです。実際にといたみなさんも、気づかない方が多かったのではないでしょうか。

Mapperのなかで文字列から日付の変換処理を行っているのですが、その日付フォーマットが「yyyy/mm/dd」となっていました。

ASTERIA Warpの日付フォーマットにおいてmmは「分」を表すので、このままだと「年/分/日」という値が取得されてしまいます。

「年/月/日」を取得したいので、正しくは「yyyy/MM/dd」でした。

問題2

AUG U35 問題2 プロジェクト

HTMLからCSVファイルを登録し、フロー側で受けとってデータをDBに保存、保存したデータをブラウザに表示をするフローです。このフローには次のようなバグが仕込まれていました。

  1. RecordGetでレコードが取得できない
  2. RecordGetで取得したレコードが文字化けする
  3. SQLCallでレコードが取得できない

これを解決するためには次の方法があります。

1の解答

RecordGetの設定を見ると、インスペクタの読み込み開始行が2、プロパティの読み込み開始行も2となっています。

実は、インスペクタとプロパティの読み込み開始行は別の意味を持っています。インスペクタの読み込み開始行は取得したファイルの何行目からデータを扱うかの設定、プロパティの読み込み開始行は現在読み込んでいるレコードのうち何行目からのデータを扱うかという設定になっています。つまり、インスペクタの設定ではファイルの2行目から1行分読み込み(取得行数が1のため)ますが、プロパティの設定で2行目から読み込むことになっているため、1行しかないレコードの2行目を読み込む動作となり、値が取得できませんでした。

これを解決するには、プロパティの読み込み開始行を「1」に変更する必要があります。

2の解答

ファイルからデータを取得する際には、エンコーディングに気をつけましょう。

デフォルトでは「自動判別」になっていますが、BOMなしのutf-8は自動判別できずに文字化けしてしまいます。通常、utf-8のファイルではBOMがついていることは少ないです。取得するファイルのエンコーディングがutf-8の場合は、プロパティで「utf-8」を選択することで文字化けをなくすことができます。

3の解答

SQLCallでSELECTを行うときには手動でストリームの定義を行う必要があります。定義がないと何も出力されませんので、きちんと定義しましょう。

問題3

AUG U35 問題3 プロジェクト

ファイルを取得してそのデータをサブフローでRDBにINSERTし、INSERTした全行をRDBから取得するフローです。

このフローを実行すると、レコードを取得できない、あるいは中途半端な行数が取得される動作となります。なぜこのような動作になるかと言うと、Timerコンポーネントで実行されたフローは別スレッドとして実行されるため、メインフローはTimerで実行するのを待つことなく、続きの処理を行います。

このため、すべてのレコードがRDBに登録される前にRDBGetを行うのでこのような実行結果となります。

これを解決するためにはいくつかの方法があります。

方法1

Timerをサブフローに置き換える

方法2

LoopEndの後ろにSleepを設置する (設定する時間によってはうまく行かないのでベストな方法ではありません。)

方法3

全レコードがRDBに登録できたかを確認する仕組みを作り、確認できたらRDBGetを実行する。

今回はどの方法を用いても正解です。ご参加いただいた方の中には、短い時間にも関わらず方法3で解いた方もいらっしゃいました!すごいですね!

実装方法はたくさんありますので、実際に皆さんで作成してみてください。

デバッグの助けになるASTERIA Warpの機能

問題の解説をしてきましたが、まずどのようなバグが潜んでいるのかをデバッグするのが難しかったと思います。そこで、デバッグの助けになるようなASTERIA Warpの機能を少しご紹介します。

デバッグ実行

「デバッグを行う」となれば一番初めに思いつく方法だと思いますが、ステップイン、ステップオーバー等を使いこなすことによりデータの流れを細かく確認できるので非常に有用な方法です。また、問題の中にHTMLからフローを実行するような物がありましたが、そのような場合も「外部から実行」にチェックを入れることでデバッグを行うことができます。
support.asteria.com/hc/ja/articles/115001323847

実行モード:デバッグ

問題が生じたときは、まずログファイルを確認することも大切です。デフォルトではログの出力レベルは「情報」となっていますが、これを「デバッグ」にすることでより詳細なログを出力することができます。しかし、ログの出力レベルをFSMCから変更すると、大量のログが常に出力されることになります。「今だけこのフローの実行ログだけ確認したい!」というときには、デザイナーの実行画面右上の「実行モード」を「デバッグ」に設定して実行します。これで、そのとき、そのフローだけ詳細なログ出力を確認することができます。

マッパーシミュレーター

マッパー内は処理が複雑になりがちです。正しく動作するかを手軽に確認する方法に、マッパーシミュレーターがあります。 マッパー内の右下にある虫マークを押し、値を入力して実行することで、マッパー単位でデバックを行うことができます。
help.asteria.com/documentation/warp/ja/1906/flow/designer/guide/mapper_simulate.html

モニター(デザイナー)

接続したサーバー上のフローの実行状態を確認できます。問題1のようにフローの実行に時間がかかる場合には、このモニターから実行状況を確認すると便利です。またこのモニターから実行中のフローを強制終了させることもできます。
help.asteria.com/documentation/warp/ja/1906/flow/designer/guide/trigger_monitor.html

■fsmon

フローサービス内のスレッド実行状況やメモリなどをリアルタイムに監視する事ができます。処理が重い場合などは、このツールでメモリの使用量やスレッド数などを確認することで、原因が分かる可能性があります。また、チューニングを行う際にも有用です。
help.asteria.com/documentation/warp/ja/1906/flow/designer/flowadmin/monitoring_fsmon.html

■ログビューア―

フローサービスで出力されるログを確認できます。ログ内容の検索や、フィルター機能によって条件に一致した行だけを取り出すことが可能です。また、ログの解析機能を使って、フローの実行状況も確認できます。Warpがインストールされているサーバーに直接アクセスできない場合もこのツールから確認することができるので便利です。 勉強会当日はうまく説明できませんでしたが、下記にわかりやすいドキュメントがありましたので確認してみてくださいm(_ _)m
support.asteria.com/hc/ja/articles/115001371828

ワークショップのあとは皆さんでこれまでのデバッグ経験についてディスカッションを行い、技術者同士で情報を共有しました。今回の勉強会は2時間という短い時間ではありましたが、ご参加いただいた皆様のおかげで有意義な会になりました!次回のU35はどのような活動になるでしょうか。若手の皆様のご参加、お待ちしています。

また、AUGSlackのU35チャンネル「#u35勉強会」への参加もお待ちしています!
ADN Slackに参加する



クラウド版

使い方いろいろ!
手ぶら de ASTERIA Warp
体験 5日間

サーバー準備の手間なくデータ連携ツール「ASTERIA Warp」の
全ての機能を5日間お試しいただけます。

今すぐ体験してみる 書籍の詳細についてはこちらをご覧ください。
基礎と実践 使い方マニュアル
著者:大木 菜生

著者:
大木 菜生

ASTERIA Warpの製品サポートやFAQの管理などを行っています。

ASTERIA Warp 関連サイトのご紹介

X ASTERIA Warp Developer Network(ADN)サイト

技術情報をお探しの方

ASTERIA Warp Developer Network
(ADN)サイト

ASTERIA Warp製品の技術情報やTips、また情報交換の場として「ADNフォーラム」をご用意しています。

X ASTERIA Warpユーザーグループ(AUG)

ASTERIA Warpデベロッパーの方

ASTERIA Warp オンラインコミュニティ
ADN slack

ASTERIA Warpデベロッパー同士をつなげ、技術情報の共有やちょっとしたASTERIA Warpの疑問解決の場とすることを目的としたコミュニティです。

X ASTERIA Warpユーザーサイト

ASTERIA Warpユーザーの方

ASTERIA Warpユーザーサイト
Login

製品更新版や評価版のダウンロード、各種ドキュメントのご提供、また 技術的なお問合せもこちらで受付ています。

X ASTERIA Warpパートナーサイト

ASTERIA Warpパートナーの方

ASTERIA Warpパートナーサイト
Login

パートナーライセンスの発行や各種ドキュメントのご提供をしています。

ページ先頭へ