02:41フォローするはじめにこんにちは。アプレッソ開発部の土岐と申します。さまざまな要件にDataSpiderで答えていくことをチャレンジしています。今回は「DKS」です!DKS、その起源についてDKSとは?DKSについて説明するには、その起源から話す必要があります。弊社内のパーティで、景品の抽選会を行う機会がありました。「果たして技術者としてそれでいいのか?」という葛藤を抱えたわけであります。技術者は、技術でもって人にサプライズを与えるのが使命なはず・・・。それを出来合いの技術を使って楽をして良いのであろうか・・・。そのとき、気付いたのが「我々にはDataSpiderがある!」ということです。Solution(DKS)」であります!・・・と大袈裟に書いてしまいましたが、まあ要するに「DataSpiderのスクリプトでくじびき処理を作ってみました」ってだけです。これは同時に「DataSpider、そして自分に対する挑戦状」でもあります。「くじ引きがしたい」という無茶な要件にどこまでDataSpiderが応えられるか、そしてDataSpider技術者として、私がその要件に応えるスクリプトを作ることができるか。そのような使命感を持って、DKSの開発に取り組みました。いうことで、そのスクリプトを作るにあたって悩んだところや工夫したところ等を紹介していこうと思います。DataSpiderでスクリプトを作成したことのある方は、「自分だったらどう作るか?」ということをご想像いただきながらお読みください。DKS仕様概要というわけでいきなり結論に行ってしまいますが、出来上がったのがこちら。デザイナ画面ドン」!かなり複雑になってしまいました・・・。すべてを説明すると長大になってしまうので、コンパクトに何をやっているかを説明します。今回行いたいくじ引きの要件としては以下となります。景品は20個程度この要件に応えるために、考えた仕様は以下です。→該当したらそのインデックスが当選者のインデックスという処理になります。苦悩のランダムとここまでは順調にできたのですが、「どうやってランダムな2桁の数値を作るか」ということで悩みます。残念なことに、DataSpiderではランダムな数値を作成するMapperロジックやアダプタがありません。皆さんお気づきとは思いますが、アダプタSDKを使ってそのようなアダプタを作れば、このような要件には簡単に応えることができます。ここはDataSpiderへの挑戦。標準機能を使って、ランダムな数値を作ることにチャレンジしてみました。いうことでそのMapperでの処理がこちら。数学的に厳密なランダムまでは必要ないのであくまでも擬似的なものです。「現在日時」の「分」と「秒」を基に、乗算・加算を重ねて数値を作成し、その結果を使用しています。作りはテキトーではあるんですが、まあ「そこそこランダム」くらいの値になるように、定数などを調節しながらなんとか作ってみました。何とか出来上がったのが稼動前日の夜。テストデータで何度か確認し、いざ、と社内パーティの日を迎えたのであります。してスタートしたくじ引き。DKSの存在は極秘プロジェクトとして行われていたので、なかなかのサプライズとなっていたようです。軽めの景品から当選者を決定していき、なかなかの盛り上がり!いける!しかし・・・3度目くらいのくじ引きで、ある疑惑が発生します。そもそも前提として、今回は弊社社員のご家族も参加のパーティだったので、以下のような名簿から、ランダムで数名ずつを当選者とすることになったんですね。(ご家族)・・・こんな感じで、家族が並んでいます。(ご家族)が同時に同じ景品に当選。(ご家族)が同時に同じ景品に当選。いうように、連番の人が同じ景品にあたってしまうという状態に。4度目のくじ引きで、その疑惑は決定的になりました・・・。やばい!一度中断し、緊急にサポートチーム・QAチームが集まり(本当に)、緊急MTGが始まります。「一人だけの当選者なら、ランダム性は確保されている模様」ということで結論。「一度の抽選での当選者を一人にするという運用で対応しよう!」というスピーディな対応により(って自分が招いたんですが・・・)なんとか全部の景品の抽選を終え、本番を乗り切りました。この不具合対応も含めて、ドキュメンタリーっぽくて良かっ・・・・良くない!そして反省へ・・・あとで調査してみて、原因はわかりました。先ほどのMapperでのランダム値の取り方に問題がありました。「1秒以内」にループが回ってしまうと、同じインデックスが当選者となってしまうのです・・・・。なんてこった!しかし、プログラムに不具合は発生しうるもの。こんなイージーな不具合に気付かなかったか?それを分析すると、以下のようになります。テストデータが不適当ある人名リストをテストデータとして使用していました。それが、なんとなくネットでみつけた某球団の選手一覧だったのが原因の1つです。テスト中に、この選手一覧でも連番であたっていたのですが、特に馴染みのないリストだったため、まったくそのことに自分が気づいていませんでした。本番稼働前日に完成したスクリプト。テストをしたのが開発者本人。必要以上に複雑なスクリプト妙な気負いをもってスクリプトを複雑に作りこみ過ぎたのも原因でした。そのため、不具合発生時の切り分けに時間がかかってしまいました。「求められている要件」と「実装する機能」のバランスについて、設計時にもっと検討するべきでした。未来へ・・・というわけで、失敗しながらもなんとか役割は完遂することはできました。2.0」へ向けてのロードマップを組み立てている昨今です。それと同時に、「こんなことDataSpiderでできる?」という無茶な要件をなんとかやってみる、ということの面白さにも目覚めました。その中で見えてくる、DataSpiderのポテンシャルや弱点、またDataSpiderを使った開発の工夫すべきところや、失敗しがちなところ、そういうものをDataSpider自体の開発にも活かしていければ、と考えています。コミュニティを開くコメントログインしてコメントを残してください。このセクションの記事DataSpiderと接続実績のある製品のご紹介オンプレミス型AI-OCR「AIRead」と連携してみた。