PyCon JP 2022 に行ってきた話

 オフラインで開催された PyCon JP 2022 に行ってきました。
2022.pycon.jp

久々のオフライン大規模イベント

 数百人規模で2日間に亘って開催される規模のイベントに参加するのは、本当に久しぶりです。行く前から、そして参加中も、終わった後も、大変興奮しておりました。
 いくつかの些細なトラブルはあったけど、この規模のイベントを、オフラインで、新型コロナ対策に留意しながら開催してくださった運営スタッフの皆さんに大きな大きな感謝を申し上げます。

 久々のオフラインイベントは、私がCOVID騒ぎ以来まさに渇望していた「情報量の嵐」に満ちたものでした。

人に会えるオフライン

 Python界隈にはそれほど知り合いもいないため、完全アウェイなつもりで参加申込みをしたのですが、行ってみるとたくさんの人に会うことができて、オフラインイベントってやっぱり良いなぁと再確認をしました。この2年間、様々なオンラインイベントを開催したり参加したりしてきましたが、今ひとつとの感覚を持っていました。それは私がイベントに対して「セミナーを聞く」ことよりも「交流する」ことを重要視しているためでもあります。
 旧知の方々に再会し、オンラインでしかお話したことがなかった人とリアル初対面し、ブースでは新たな知り合いが増えるなど、オンラインでは得られない出会いがありました。オフラインイベント最高!

セミナーの感想など

 もう書きたいことは、ここまでで全部書いてしまったのですが(笑)、特に印象に残ったものをメモとして記録しておきたいと思います。

日経新聞社さんの2つの枠

https://2022.pycon.jp/timetable?id=NPMTSH
https://2022.pycon.jp/timetable?id=EEA8FG
 日本経済新聞社さんから2人が登壇されました。セミナーの構成力から、プレゼンのわかりやすさ、聞き取りやすさ、そして質疑での的確な回答などに感銘を受けました。
 新聞社社内のIT化状況を全然知らなかったので、情報に責任を持つ人と見せ方や運用に責任を持つ人(システム側)でタッグを組んで、内部で取り組んでいるという話が新鮮でした。オンライン記事のタイトルを自動生成する仕組みも、内製でここまでやっていることに驚きました。
https://vdata.nikkei.com/newsgraphics/party-poll-votes-map/

2日目基調講演

 統計家西内啓氏による Python(も)活用しているお話でした。サイトに掲載されているお写真とプロフィールしか事前情報がなく、「オカタイ感じの人が、お役所的なお話をするのかなぁ」と思っていたら(たぶんスーツにネクタイからの印象)、ツカミから最後まで、話に引き込まれてしまいました。統計については「なんか知らんが、ごく一部を調査するだけで全体が分かったように言うアレでしょ」くらいの認識でしたが、お話が面白すぎて、その場でご著書を購入してしまいました(Kindle版)。

GIS系いろいろ

 個人的な関心から、GIS系のお話をいくつか聞かせてもらいました。まだ入門者以前のレベルなので、雰囲気を楽しんできたという感じではありますが、その中で、GeoDjangoの話やデータソースの紹介を含むお話、GeoPandasの紹介などが印象に残りました。 今年のFOSS4GJ (オンライン)は他のイベントと重なってリアルタイム参加ができないので、ここで色々なお話を聞けて良かったです。

ブースもいろいろ

 スポンサーをしてくださった企業のみなさん、ありがとうございます。各ブースでお話を聞かせていただきました。 
 いま私は はてなブログでこれを書いているわけですが、移行または並行先として気になっていた note さんにも話を聞けたのが良かったです。「クリエイティヒティのための」というキーワードを伺い、私べつにそんなにクリエイティビティとかじゃないしなーと腰が引けた部分もあったのですが(笑)、いまイケてるサービスとして注目しているので、いつかお世話になるかもしれません。



勝手に反省会

 この素敵なイベントを運営してくださった皆様には、最大の尊敬と感謝をお届けしたいです。その上で、(他の)運営側のはしくれとして気になった点もあり、勝手に「反省会」をしたいと思います。

  • すべてのセッションを会場でも動通レシーバを通して聞くという「サイレントセミナー」の意図が最初よくわかりませんでした。会場にもよく伝わっていなかったみたい。
  • そのせいもあって、セミナー中にブースのほううるさいとか色々不満を持った人もいたみたい(私も少しは気になりましたが、そういうものなのかなと理解しています)
  • 特に全体で進行する時間帯で、段取りがよくわからない事が何度か。待っていたら良いのか、次はなにが始まるのか、席で待たされているけど今なにをしているのかなど、伝えて欲しい
  • セパレーターなしの多トラック。結構となりのスピーカーさん(人)の地声が大きい場合や微妙にスピーカー(機械)のボリウムが大きめに設定されていることがあって、目の前のセミナーに集中しにくい(聞きにくい)ことが多少気になった
  • 初日の朝、会場の階がわからなくて迷っている人をよく見かけました。後で見たら一部の案内には「4階」と明記されていましたが、書いていない箇所が多かった気がするので、会場案内が掲載されているすべての箇所に明記しておくと親切かなと
  • 「サイレント」のセミナーであっても、休憩時間はレシーバをはずしている人も多いので、各枠「これからはじめますよー」の案内は、同通レシーバを通してではなく、スピーカーで会場に案内したほうが分かりやすかったと感じました
  • ネットワーク、トラブルはありましたが全体的にとても快適でした。準備、トラブル対応、何からなにまでありがとうございました。

最後に

 もう何度でも感謝しちゃうのですが、とにかく刺激がたくさん、新たに得られた情報がたくさん、出会いがたくさんの素晴らしい時間でした。勝手が分からずに躊躇しているうちに、懇親会が定員になって参加できなかったのが、痛恨のミスでした。(「興味があるなら行け!」という私の行動様式とちょっと違うぞ、と自分でも感じたのですが、オフラインイベントの行動パターンがすっかりカラダから抜けてしまったようです。リハビリせねば)

 どうもありがとうございました。

An image by Dall-E

MySQL 8.0.31で追加されたINTERSECTとEXCEPTの動作例

MySQL 8.0.31 がリリースされました。「リリースノートでわいわい言う勉強会」は1か月後くらいにやりたいと考えているので、それまでツイッターやブログでぜひ MySQL 8.0.31 を試して、ブログやツイートなどで気になる変更点を教えてください。


さて、さっそくですが私が気になったのは「新構文」。
"INTERSECT" と "EXCEPT" に対応したということで、軽く試してみました。

テーブルとデータの準備

 flg1とflg2の2つのカラムを含むテーブルを作成し、データを投入します。

mysql> SELECT @@VERSION;
+-----------+
| @@VERSION |
+-----------+
| 8.0.31    |
+-----------+
1 row in set (0.00 sec)
mysql> CREATE TABLE t26  (
    -> id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name varchar(10), 
    -> flg1 char(1), 
    -> flg2 char(1));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO t26 (name, flg1, flg2) VALUES 
    -> ('name01', 1, null),
    -> ('name02', 1, 0),
    -> ('name03', 1, 1),
    -> ('name04', 1, 1),
    -> ('name05', 0, 1),
    -> ('name06', 0, 1),
    -> ('name07', null, 0),
    -> ('name08', null, 1);
Query OK, 8 rows affected (0.01 sec)
Records: 8  Duplicates: 0  Warnings: 0

データが以下のように登録されました。ここから、flg1 が立っているものだけを抽出するSQL (SQL1) と flg2 が立っているものを抽出するSQL(SQL2)に対して、 INTERSECT, EXCEPT そして比較用に UNION類を試してみます。

mysql> SELECT * FROM t26;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  1 | name01 | 1    | NULL |
|  2 | name02 | 1    | 0    |
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
|  5 | name05 | 0    | 1    |
|  6 | name06 | 0    | 1    |
|  7 | name07 | NULL | 0    |
|  8 | name08 | NULL | 1    |
+----+--------+------+------+
8 rows in set (0.00 sec)

INTERSECT

 SQL1 と SQL2 の INTERSECT すなわち共通部分を得る文です。

mysql> SELECT * FROM t26 WHERE flg1=1
    -> INTERSECT
    -> SELECT * FROM t26 WHERE flg2=1;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
+----+--------+------+------+
2 rows in set (0.00 sec)

図にすると、こんな感じ。

EXCEPT

 除外を指定する EXCEPT です。 SQL1 の結果から、SQL2の結果にも含まれるものを除外します。

mysql> SELECT * FROM t26 WHERE flg1=1
    -> EXCEPT
    -> SELECT * FROM t26 WHERE flg2=1;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  1 | name01 | 1    | NULL |
|  2 | name02 | 1    | 0    |
+----+--------+------+------+
2 rows in set (0.00 sec)

UNION

 2つのSQL文を「くっつける」指示としては UNION があります。昔からある命令ですが、参考までに実行結果を示しておきます。SQL1 にも SQL2 にも含まれない id=7 が存在していないことがわかりますね。

mysql> SELECT * FROM t26 WHERE flg1=1
    -> UNION 
    -> SELECT * FROM t26 WHERE flg2=1;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  1 | name01 | 1    | NULL |
|  2 | name02 | 1    | 0    |
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
|  5 | name05 | 0    | 1    |
|  6 | name06 | 0    | 1    |
|  8 | name08 | NULL | 1    |
+----+--------+------+------+
7 rows in set (0.00 sec)

UNION ALL

 こちらもおまけで「UNION ALL」を。昔からある構文です。

mysql> SELECT * FROM t26 WHERE flg1=1
    -> UNION ALL
    -> SELECT * FROM t26 WHERE flg2=1;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  1 | name01 | 1    | NULL |
|  2 | name02 | 1    | 0    |
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
|  5 | name05 | 0    | 1    |
|  6 | name06 | 0    | 1    |
|  8 | name08 | NULL | 1    |
+----+--------+------+------+
9 rows in set (0.00 sec)

旧バージョンのMySQLでは?

 手元のものをみんな MySQL 8.0.31 に上げてしまい、今手元にある「少し古いバージョン」が MySQL 8.0.22 しかなかったので、こちらで念のため試してみました。

mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 8.0.22    |
+-----------+

「そんな構文は知らんぞ」というエラーになります。

mysql> SELECT * FROM t26 WHERE flg1=1
    -> INTERSECT
    -> SELECT * FROM t26 WHERE flg2=1;
ERROR 1064 (42000): 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 'INTERSECT
SELECT * FROM t26 WHERE flg2=1' at line 2
mysql> SELECT * FROM t26 WHERE flg1=1
    -> EXCEPT
    -> SELECT * FROM t26 WHERE flg2=1;
ERROR 1064 (42000): 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 'EXCEPT
SELECT * FROM t26 WHERE flg2=1' at line 2

おわりに

 新しいバージョンによって、速度が改善したり、安定性が増したり、色々進化するものですが、やっぱり一番ワクワクするのは新しい文が使えるようになった時ですよね(とウワモノ屋を自認する私は思うのです)。マイナーバージョンアップなのに新構文が増えるってどうなのよ、という向きもありますが、そういった所も含めてエキサイティングな MySQL 8.0 であると言えるかと思います(笑)。


追記1(2022/10/12):

 「flg1 と flg2 を見るだけなら、INTERSECTとかを使わずに普通にWHERE条件で絞ればいいじゃん」と言っている人がいましたが、そういう話じゃない(笑)。2つのクエリ結果に対する演算という部分がポイントです。
 そんな人は、とりあえず以下のようにVIEWをつくって、2つのテーブルがあるように見れば理解しやすいでしょうか。

mysql> CREATE VIEW v26a AS SELECT * FROM t26 WHERE flg1=1;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE VIEW v26b AS SELECT * FROM t26 WHERE flg2=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM v26a;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  1 | name01 | 1    | NULL |
|  2 | name02 | 1    | 0    |
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
+----+--------+------+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM v26b;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
|  5 | name05 | 0    | 1    |
|  6 | name06 | 0    | 1    |
|  8 | name08 | NULL | 1    |
+----+--------+------+------+
5 rows in set (0.00 sec)

追記2(2022/10/12)

 テーブル内容まるごとなら、TABLE句を使うこともできる。

mysql> TABLE v26a INTERSECT TABLE v26b;
+----+--------+------+------+
| id | name   | flg1 | flg2 |
+----+--------+------+------+
|  3 | name03 | 1    | 1    |
|  4 | name04 | 1    | 1    |
+----+--------+------+------+
2 rows in set (0.00 sec)

追記3(2022/10/12)

 気になるひとのために、EXPLAINの結果も載せておきます。SELECT で書いてみましたが、TABLE句を使っても同じ結果になります。ワーニング(note)が出ます。カラム展開した状態をおしえてくれる、ってことなのかな・・・

mysql> EXPLAIN SELECT * FROM v26a INTERSECT ALL SELECT * FROM v26b;
+----+------------------+----------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| id | select_type      | table          | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra           |
+----+------------------+----------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
|  1 | PRIMARY          | t26            | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    8 |    12.50 | Using where     |
|  2 | INTERSECT        | t26            | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    8 |    12.50 | Using where     |
|  3 | INTERSECT RESULT | <intersect1,2> | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | Using temporary |
+----+------------------+----------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                                                               |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg1` = 1) intersect all /* select#2 */ select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg2` = 1) |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


VIEWだからEXPLAINでワーニングが出る、というわけではなく、元のテーブルに対する連結でも同様のワーニングが出ます。(以下はUNIONでの例)

mysql> EXPLAIN SELECT * FROM t26 WHERE flg1=1 UNION  SELECT * FROM t26 WHERE flg2=1;
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| id | select_type  | table      | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra           |
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
|  1 | PRIMARY      | t26        | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    8 |    12.50 | Using where     |
|  2 | UNION        | t26        | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    8 |    12.50 | Using where     |
|  3 | UNION RESULT | <union1,2> | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | Using temporary |
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                                                       |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg1` = 1) union /* select#2 */ select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg2` = 1) |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Dolphins image by DALL-E

ストップウォッチが快適になった話

 最近、諸々の作業をする際に時間を計測したいことがあって、ストップウォッチを買いました。スマホやPCでも計測できるけど、専用機の強さは「それしかできない」ことにあります。一定時間で勝手に画面が消える事もないし(スマホとの対比)、計時の窓が何処に行ったか探す必要もない(PCとの対比)。 顔を上げればそこに経過時間があるのは快適です。


 買ったのはこれ。CASIOの、1,300円ほどの商品です。


実際に買って、使って見てから分かったのですが、これ、結構不便に感じるところがあって、

  • ボタンが辺に設置されているので、他の物に触れたりして押されやすい。
  • ボタン操作音が大きい。消すことができない。小さくすることもできない。
  • 上記2つの合わせ技で、鞄に入れておくとボタンがよく押されてその都度ピッピと音がなってうるさい。

ということで、音を切っちゃいましたw
その記録

こんな機種です。

 4つのトラックで同時に計時ができます。ラップタイムはありません。時計機能(私は使わないけど)もあります。

裏側はこんな感じ。

 ボタン電池をセットする蓋はネジ止め。その他2カ所のネジ止めがあります。唯一見えるスイッチは、12時間24時間表示切り替えスイッチ。これが音を止めるスイッチだったら良かったんですけどね。

 磁石で止められるほか、クリップでの挟み込み、机上置き用にクリップを固定できる仕組みなど、様々な利用シーンを考慮した優しい設計です。地味ですが、細かいところに気配りが行き届いています。

いざオープン。

 3つのネジを外して蓋を開けました。

 右側の裏蓋に張り付いているのがスピーカーです。ウデのある人なら

  • この線を外に引き出してスイッチをつけて、音ありなしを切り替えれるようにしたり
  • 抵抗を噛ませて音を小さくしたり(できるのかな)

などの工夫をするのかもしれませんが、私はもう不可逆でいい(鳴らなくていい)という割り切りで、線を一本切っちゃいました。

結果

 かなり快適になりました。鞄の中に入れて持ち歩けるようになったし、ボタンを押すたびに電子音を聞かされずに済むようになりました。
 一方で、切ってみて分かった不便さがあって

  • 音が鳴らない。

何を言っているんだ、それが目的だったろうと言われそうですが、ボタンのクリック感がかなり乏しいため、ちゃんとボタン押下が認識されたか目視確認しないと、「押したつもりだったのにスタートしていなかった」みたいなことが起こりえそうなのです。
 まぁこれは、この状態で使っているうちに慣れてきたので、良しとしましょう。

結論

 音を切って、快適になりました。
使い勝手も良いので、

  • ボタンのクリック感
  • 音のオンオフあるいは音量設定

に対応して、これくらいの値段であれば、行く先々に置いておく用にあと2,3台欲しいなと思うくらいです。(でも色々試してみたい思いもあるので、他にも安価で便利な機種があれば手を出しそうな気がしますw)

『Club MySQL #6 MySQL Shell for VS Codeで遊んじゃおう』を開催しました

 Club MySQL というオンラインイベントを開催しました。

mysql.connpass.com


 日本MySQLユーザ会ではこの一年ほど、セミナー系よりは交流系のオンラインイベントに力を入れていたので、こういったセミナー形式のイベントは久々になります*1

 今回は「Club MySQL」という、ひとりのお話をじっくりと聞かせていただこうという趣旨の開催として、梶山さんに「MySQL Shell」と「MySQL Shell を VSC Codeから使える MySQL Shell for VS Code」のお話をたっぷり聞かせてもらいました。時々思惑と異なる動作をしたり、接続先を勘違いして欲しい結果が得られなかったなどの「リアル」を見せてもらい、利用方法のイメージがわいた人も多かったのではないでしょうか。

 私自身も、今ひとつ使いどころが分かっていなかった MySQL Shell について、
mysqlコマンドラインクライアントの機能 + こまごまとしたツール集
という認識で一旦、納得して理解することができました。普通に使えばいいんだ。普通に。
 そんなわけで、みなさんがおそらく「すごく色々できて便利な MySQL Shell」を推していく中で、私はこれからしばらく「mysqlコマンドラインクライアントの代わりとして普通に使う MySQL Shell」として推していく発信をしていこうかなと思います。普通に使っていたら、実は他にも便利な機能がいろいろあるんじゃん、と少しづつ気づいて行けば良いのではないかと思います。
 MyShell for VS Code については、まだ開発初期の段階のため、不足している部分もある(機能のボタンはあるのに押せないとかw)けど、ゆくゆくは「MySQL Workbench の置き換え」を目指す方向性ということで、今から触り始めておくと、ひとつひとつの発展を一緒に楽しめそうですね。



 LTでは石本さんに、VS Code のきほんについて紹介していただきました。VS Code そのもののお話から、MySQLを使う際のプラグインのお話まで、5分という短い時間でコンパクトに伝えていただきました。

 今回、connpassで参加申込いただく際に、アンケートをお願いしました。今回のテーマである MySQL Shell そして VS Code をどれくらい知っているかという質問でした。

MySQL Shell を使っていますか?
  25 今回初めて知った
  13 聞いたことあるけど使ったことはない
  12 触ったことはあるけど常用に至らず
  3 常用している(常用しはじめも含む)

VS Code を使っていますか?
  3 今回初めて知った
  5 聞いたことあるけど使ったことはない
  15 触ったことはあるけど常用に至らず
  30 常用している(常用しはじめも含む 

 VS Codeはほとんどの方が何らかの形で触れたことがあったのに対して、MySQL Shell は半数近くの人が「今回初めて知った」ということで、これから認知度を上げていくフェーズであることが分かりますね。私自身も「常用に至らず」だったので、しばらく「普通に使う」をキーワードとして常用を目指してみようかと思います。



 イベントの模様は YouTube の 日本MySQL ユーザ会チャンネルにて公開しています。MySQL Shell と for VS Code に興味を持った方はぜひご覧ください。セミナー本編も然る事ながら、sli.do を使った質疑にも、MySQL Shell と for VS Code の「リアル」がたくさん含まれていて勉強になりますよ。


www.youtube.com


 登壇いただいた 梶山さん、石本さん、ありがとうございました!
オンラインのイベントって聞いてくれた人の反応が見えにくいので、参加してくださった皆さんも何らかの反応(ブログを書くとか)してくれると、話す人にも企画する人にも継続のモチベーションにつながるので、嬉しいです!

An image by Dall-E

*1:開催自体の手間というよりも、登壇者の調整が大変で開催が止まっている面が大きいので、しゃべってもいいな、しゃべりたいな、とう方は積極的に声を挙げていただけると、開催につながるかもしれません

AtCoderはじめました

 以前より気になっていた AtCoder に、最近ようやく実際に参加しています。
今ひとつルールや世界観が分かっていなかったところ、こんな本が!


 なにげに 1章2章に書かれているような基本的なことがありがたかったです。わかりやすかったし、始めてみようという気になれました。ありがとうございます。

 きっかけを後押ししてくれたものがもうひとつあって、それが環境。最近ちょうど、Windows上に VirtualBoxUbuntu Desktop 環境を作って触ってみていました。(ホストマシンを新調して、以前より速くなったため、VM上のUbuntuも快適に動作しています)
 この Ubuntu上の開発環境(VSCodeを使っています)がとても自然に動作してくれていて、 AtCoderを試そうというときにそのままスムーズに使えたのが良かったです。


 8月にアカウント登録してはじめての ABC は、申し込んだことを忘れていて不参加に。
翌週のABCは申し込みを忘れていて、時間内なのだけどレーティングなしでの参加
3回目のABCでようやく事実上の初参加に。ただしまだルールがよく分かっていなかったので、開始後15分くらいしてからゆるゆると参加。これ、開始時刻からの経過時間がスコアに影響するんですね。 開始時刻を待ち伏せして速攻開始したほうがいいのだ、とここで学びました。
その後 ABC, ARC に可能な限り参加していますが、解けないものですね。100点200点問題は軽くこなせるのですが、未だに300点問題を突破できたことがありません。毎度 TLE (実行時間かかりすぎ)で。。 今や実用上は問題のないスペックのマシン上で、多少無駄があっても速度的には影響がないという環境で甘やかされてすぎたせいか、速くするための工夫(課題を再構成する)というのを長らくやっていませんでした。

 正直なところ、もっとサクサクと解けるだろうと高をくくっていたので、やや鼻っぷしをおられた気分がないと言えば嘘になります。でも少しずつやり口が分かってきた面もあり、これからに期待です(期待しているのは自分だけ)。
 まだ2桁レーティングですが、こういったシンプルな課題に対してコードを書くのは楽しいです。また、書いたコードに対して成否を返してくれるなんて経験は初めてなのでこれも楽しいですね。低い目標ですがまずは 300点問題をコンスタントに解けるようになる、が当面の目標かな。

 すてきなご本と、素敵なサービスに感謝です!

第51回ニフクラエンジニアミートアップで「これから始める人のための」SQL入門のお話をしました

ニフクラエンジニアミートアップ様にお声がけをいただいて、このたび「第51回」のイベントにて登壇させていただきました。
fujitsufjct.connpass.com


 この4日前にも似たようなレイヤである「入門」のお話をする場があり、期間が近いこともあって「同じ内容でいいよ」としてお誘いいただいていたのですが、当日が近づくにつれて気合いが入ってきて、まったく新たに今回用の構成を組み立て直しました(一部ページの再利用はあります)。

 時間に限りがあることもあり「何を伝えないか」に頭を悩ませましたが、まったくデータベース管理システム(DBMS)を触ったことがない人にイメージをつかんでもらうところを最重点として、通常ならじっくりと構文をお伝えするSQLについては雰囲気を見ていただくに留めるという割り切り方をしました。 その辺りを期待していた方には些か拍子抜けの向きもあろうかと思いますが、ご了承ください。


 発表資料は speakerdeck で公開しています。

speakerdeck.com


 質疑の時間にも、たくさんの質問があり(sli.doを使いました)、進行役の宮原さんとともに楽しく「一緒に考え」させていただきました。
 テーブル設計(今回の講演の範囲外ではありますが興味を持ってもらったのは嬉しかったです)についてのご質問で、宮原さんも私もそろって紹介した本は、こちら、ミックさんの「達人に学ぶDB設計徹底指南書」です。私は書籍の実物を、宮原さんは書籍のPDFファイルを、それぞれすぐに取り出して見せたのは面白かったですね。

 別の質問では、私が「実際にぜひMySQL(でも他のRDBMSでもいいから)インストールして、データ登録したりして試してみてね!」と話したのを受けて「どんなデータで遊んだらいいか」という質問をいただきました。回答としては「(1)自分が持っているデータ(書籍とかブックマークとか住所録とか)でテーブル作ってデータ入れてみたりする (2)公開データを探してきて入れて遊ぶ」を挙げましたが、その場で具体的な公開データを提示できませんでした。以下のツイートが、そのとき紹介したかった、都道府県別の人口や面積のデータです。


 具体的な入れ方や遊び方の例など、別途記事を書きますかね。あるいはさくっと動画撮って公開しちゃったほうがラクかな。(お仕事場の隣の席の人に教えてあげるような頑張らない動画をいっぱい撮って公開したいという思いは以前よりあります。結構こういう説明にマッチしているかもしれませんね。作った暁にはチャンネル登録お願いします!(YouTuberみたいw))


 終了後もはZoomで参加してくれた方たちとの会話が止まらず(進行の宮原さんもDBMSに造詣深いので)23時過ぎにZoomもようやく閉会となりました。本編もアフターも合わせて、とても充実かつ有意義な経験をさせていただきました。お誘いくださったニフクラ エンジニアミートアップのみなさま、そして会に参加してくださったみなさま、どうもありがとうございました。






An image by Dall-E

LLイベント(ODC2022)でデータベース超入門のお話をしました

 お誘いいただいて、LLイベントでSQLの超入門のお話をさせていただきました。
LLイベントは、当初(20年近く前)から「Lightweight Language」のイベントとして長らく開催されてきましたが、Lightweight に限らずもっと幅広い言語を学ぼうということで、2017年に Learn Languages の略ということに変わったそうです。
https://ll.jus.or.jp/2022/

 今回のLLイベントは、Open Developers Conference (ODC)併催ということで、ODCの1トラックをもらう形で開催されました。
https://event.ospn.jp/odc2022-online/


 テーマは「第2プログラミング言語への招待」ということで、SQLのほかは、Elm、Object Pascal、Processing、Scratch について、それぞれ語られていました。個人的には、Processsingが非常に印象に残りました。非常に短いコードでとても不思議な、あるいは幻想的な、あるいは美しい絵や動画が作れてしまう。どれくらい短いかというと、Twitterに書き込めるくらいのコード量。かなりの衝撃を受けました。短くて良いなら自分にもできそうという幻想を持ってしまいます(たぶん法則とか数学的センスとか、いま自分が持っていない能力を要求される気はする)。



 私の発表は、
『プログラミングを書けるようになったら次はSQLを覚えよう!
 いまさら聞けない人のためのSQL超入門』
と題して、SQLRDBMSにまだ触れたことがない人を対象にお話をしました。データを操作する楽しさ(改竄って意味じゃないですよ!)が少しでも伝わったらいいなぁ。
 当日の発表資料を speakerdeck に公開してあります。また、SQLを含め他のすべての動画は ODCのサイトからたどれるので、興味がある方はご覧ください。

speakerdeck.com


 

An image by Dall-E