ボットが無人対応するものはどんな仕組みになっているのか?どのボットも質問をすると何か返してくれるという動きは同じですが中の仕組みは色々とあるようです。そのような参考記事はこちら。
仕事などでチャットボット製品の調査をするときに、このような仕組みからベンダに質問できると、より自分たちに合ったものを選べそうですね。
種別ごとの詳細もありますので、参考にしてみてください。
以上
ボットが無人対応するものはどんな仕組みになっているのか?どのボットも質問をすると何か返してくれるという動きは同じですが中の仕組みは色々とあるようです。そのような参考記事はこちら。
仕事などでチャットボット製品の調査をするときに、このような仕組みからベンダに質問できると、より自分たちに合ったものを選べそうですね。
種別ごとの詳細もありますので、参考にしてみてください。
以上
リモートワークといえばワードやパワーポイントのなどファイルサーバーにあるものを「あれどこにあるっけ?」と場所を教えてもらっていたものが、それがやりにくくなったのがちょっと困ったことです。チャットで聞いたりしていますが、全体のグループで聞くのも気が引けるしなど、誰にどう聞こうか一瞬迷ってしまいます。
こんな場合に役に立ちそうなツールのβ版がリリースされたとのことなので紹介します。 チャット経由で「○○のファイル」という感じで質問するとSharePointの中に格納されているファイルを探してくれるそうです。 SharePointの通常の検索だとファイル名やキーワードが正確にわからずに探すのにはいつも苦労するのですが、このツールはファイル名が曖昧であっても近しいものを抽出して候補を表示することで、目的のファイルをチャットボットが探してくれるようです。
【「ENOKI5.0 SharePoint連携オプション」のβ版】
今ならβ版ということでトライアルができるようなので、Microsoft365やSharePointでファイル管理されている方は試してみてはいかがでしょうか?
トライアルをする場合の注意点がこちらの記事にありますので、ぜひ参考にして下さい。こういうのは実際やってみないと、なかなか気がつかないことかと思いますが、知っているかどうかでも評価にだいぶ差が出てきますね!
トライアルを考えている方の参考になれば幸いです!
【お客様にマッチしたチャットボットを選ぶには?~チャットボットマッチングチャート~】
上記のチャートでは以下のような区分けで、有人対応/無人対応どちらにするか、無人対応するならどの方式がいいか説明していますので参考にしてもらえればと思います。
以上、チャットボットの選び方についてのご紹介でした。
MyBatisでヘッダ明細型のデータを扱うシリーズの3回目。今回はネストしたJavaオブジェクトをデータベースに新規作成する方法について書いてみたいと思う。またIDもデータベースで自動採番させようとちょっと欲張ったものにしている。 今回はSQLの都合上MySQLに特化した内容となっている。
今回のサンプルもいつもと同じ以下のクラスとテーブルを使用する。
public class Student {
int id;
String name;
Result[] result;
}
public class Result {
String course;
int score;
}
studentテーブル(ヘッダ)
| id | name |
|---|---|
| 100 | やまだ |
resultテーブル(明細)
| refid | course | score |
|---|---|---|
| 100 | 英語 | 80 |
| 100 | 数学 | 90 |
データベースはMySQLを使用する。 idは連番を振りたいのでデータベースで自動採番させてしまおう、ということで以下のようにテーブル定義をした。
CREATE TABLE student ( id INTEGER NOT NULL AUTO_INCREMENT UNIQUE, name VARCHAR(100) ); CREATE TABLE result ( refid INTEGER NOT NULL, course VARCHAR(100), score INTEGER );
さて、ヘッダ明細型のテーブルに対してJavaオブジェクトをINSERTするMyBatisのmapperの定義をする。 INSERTの処理としてまず思いつくのは、MyBatisの設定でstudentテーブルとresultテーブルにINSERTするmapperをそれぞれ作成してJavaコードから順に呼び出す方法だろう。この場合はStudentクラスのオブジェクトをMyBatis経由で書き込んだ後、resultの配列ごとにループを回してResultクラスのオブジェクトをMyBatis経由で書き込む処理となる。
しかし、ネストしたStudentクラスのオブジェクトをMyBatisに渡して、その中でネストした部分も書き込んでもらうことはできないだろうかということで、以下のようなmapperを作成した。
<mapper namespace="mapper.student">
<resultmap id="student" type="student">
<id column="id" property="id" />
<result column="name" property="name" />
<collection property="result" oftype="Result">
<result column="course" property="course" />
<result column="score" property="score" />
</collection>
</resultmap>
<insert id="create" parameterType="student" useGeneratedKeys="true" keyProperty="id">
INSERT INTO student (name) VALUES (#{name});
SET @uid = LAST_INSERT_ID();
<if test="result != null">
<foreach item="i" collection="result">
INSERT INTO result (refid, course, source)
VALUES (@uid, #{i.course}, #{i.source});
</foreach>
</if>
SELECT @uid FROM dual;
</insert>
</mapper>
まずは最初の "INSERT INTO student ~" でStudentクラスのオブジェクトをstudentテーブルに書き込む。
次の行で "SET @uid = LAST_INSERT_ID()" を行っているが、ここでstudentテーブルに書き込んで自動採番されたIDを取得している。 これはMySQL専用の構文となる。
次にMyBatisの動的SQLを使ってネストしたオブジェクトを1つづつINSERTする。
まず、<if test="result != null"> でStudentクラスのオブジェクトがネストしたResultオブジェクトを持っているか(nullでないか)を調べ、持っているなら <foreach item="i" collection="result"> でひとつづつ順にINSERT処理をしている。
resultテーブルではrefid列に紐づくstudentテーブルのidを保持するが、先にMySQLの変数 "@uid" に自動採番された値を保存しているので、その値を書き込んでいる。
自動採番された値はJavaのStudentクラスのオブジェクトにも反映したい。MyBatisの処理結果として返した値が反映されるので、最後に "SELECT @uid FROM dual" を実行して、自動採番された値を返している。
以下のようなJavaコードでネストされたオブジェクトを1回のMyBatis呼び出しでヘッダ明細型のテーブルにINSERTできる。
// 英語の結果
Result result_english = new Result();
result_english.course = "英語";
result_english.score = 50;
// 英語の結果
Result result_math = new Result();
result_math.course = "数学";
result_math.score = 68;
// 生徒の情報
// IDは自動採番されるため
Student student = new Student();
student.name = "たなか";
student.result = new Result[] { result_english, result_math };
// オブジェクトをデータベースに書き込む
sqlSession.insert("mapper.student.create", student);
// 自動採番された生徒のIDを表示
System.out.println("ID=" + student.id);
Springから使っていたらこんな例外が出てしまいました。
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @uid = LAST_INSERT_ID();
SELECT @uid FROM dual' at line 3
今回はMyBatisのmapperで複数のステートメントを一度に実行していますが、MySQLのJDBCドライバの仕様で複数ステートメントを実行するときは "allowMultiQueries=true" オプションを指定する必要があるようです。JDBC接続のURLに以下のようにオプションを追加したらうまく動くようになりました。
jdbc.url=jdbc:mysql://localhost/student?allowMultiQueries=true
java.text.SimpleDateFormatを使って日付文字列をチェックしようとしてはまったときのメモ。 parseメソッドに文字列を与えてParseExceptionが出るか出ないかでチェックしようとした。
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
// 不正な日付
Date d = fmt.parse("197405112"); // ParseExceptionが発生しない!!
しかし、エラーとはならず、yyyy=1970、MM=05、dd=112と解釈され、5月112日→8月20日として、d=1974/8/20として通ってしまい予想外の動きになってしまった。 SimpleDateFormatはデフォルトだとできるだけ日付として解釈するように動作をするらしい。 日付を3桁で拾ってしまうのは予想外だったが・・・
存在しない日付を厳密にチェックするときはsetLenientをfalseに設定する必要があるようだ。 以下にすることでチェックをすることができた。
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
// 厳密な日付チェックを行う設定
fmt.setLenient(false);
// 不正な日付
Date d = fmt.parse("197405112"); // ParseException発生!!
SimpleDateFormatはスレッドセーフではなく使いまわしが難しいので、そろそろ新しいスレッドセーフなDateTimeFormatterに移行するべきとは思うが、Dateを使っている手持ちライブラリも多く使い勝手の悪さからなかなか移行できていない・・・
MySQL5.7でSQLを流した時にUnknown command '\''.がでる時の対処法。
どういう状況で出るのかはいまいちはっきりしていないが、UTF-8のファイルを流した時に出る? 5.6などでは同じSQLでも出ていなかったように思われる。 このようなときは--default-character-set=utf8オプションを指定してやると成功するようだ。
mysql -umydb -pmypass -Dmydb --default-character-set=utf8 < data.sql