点字翻訳アプリのサンプルを作ってみました

岩手県立大学とか、岩手の人たち Advent Calendar 2021 3日目の記事です。 今日はシニアプログラミングもくもく会JavaScriptを使った簡単なアプリ作成を行った話をしようと思います。

シニアプログラミングもくもく会

シニアプログラミングもくもく会は、シニア(高齢者)の方のプログラミング学習を支援するコミュニティーで月イチの頻度でもくもく会が開催されています。もくもく会では、プログラミング言語に応じて複数の部屋(現在はZoomを使っており、ブレイクアウトルームに分かれてもくもく会する感じになっています)が用意されています。

シニアの方だけでなく、一般の方も参加可能であるため、私も少し前から参加させてもらっていて、Glideというノンプログラミングツールのもくもく部屋を開催していました。

ただ、参加者の方が作ってみたいアプリをヒアリングしてみると、Glideのユースケースにマッチするものとそうでないものがあり、まずはいくつかの小さなアプリを題材としたプログラミングが良いのではないかと思うようになってきました。 (個人的にはちょっとした面倒ごとを解消するようなアプリだとプログラミング学習のモチベーションが上がるような気がしています)

というワケで、前々回くらいからJavaScript部屋を開催させてもらっており、今回はそこで作成した簡単なアプリの紹介をしてみます。

点字翻訳アプリ

少し前の話ですが、日本盲導犬協会の方が以下のようなツイートをしていました。どうやら11月1日は日本点字制定記念日のようです。

このツイートに点字の一覧表が添付されており、「これを使用すれば点字を読み解けるのでは…!」と閃いたワケです。機能的にも比較的小さなプログラムで実現できそうであり、さっそくJavaScript部屋でのアプリの題材にしてみました。

アプリの構成

JavaScript自体はWebブラウザさえあれば試すことができますが、実際に作成したプログラムの共有はもう一工夫必要です。JavaScript部屋ではcodepen.ioでプログラムを共有することにしました。

今回作成した点字翻訳アプリは以下のURLで試すことができます。

See the Pen 点字翻訳アプリ by furandon_pig (@furandon_pig) on CodePen.

サンプルということもあり、ア~オまでの点字のみの翻訳となっていますが、基本的な機能は実装済みです。 点字の入力をどうするか、という点がネックでしたが、点字の入力欄に見立てた2列3行の入力欄をクリックすることで点字の凹凸(「‐」と「●」)がトグルするようなユーザインタフェースにしてみました。

点字が入力される度にデータとして持っている点字リストと比較し、一致する文字があればそれを表示する、という動作にしてみました。

HTMLとJavaScriptを合わせても60行ちょっとなので、だいぶコンパクトなプログラムになっています。 (あとは点字のデータを一通りそろえれば十分に実用的なアプリになります)

できるだけシンプルな構成にする

この点字翻訳アプリですが、 document.getElementById() によるDOM操作等、あえて古めかしい書き方をしている部分もあります。最新のJavaScriptの機能やフレームワークも良いのですが、プログラミンを学び始める際には逆に憶えることが増えてしまう場合もあります。

そのため、「こうすればこのような動作になる」という具体的な動作イメージを掴んでもらいやすくするため、ちょっと古めかしい書き方であってもアプリの振る舞いについて流れが追いやすいようなサンプルにしています。

まとめ

簡単ではありますが、シニアプログラミングもくもく会で作成した点字翻訳アプリとJavaScript部屋の紹介をしてみました。

codepen.ioは初めて使ってみたのですがなかなか便利です。特に小さなアプリの作成とプログラムの共有がJavaScript部屋でのユースケースにうまくマッチしています。 他にも小さなアプリの題材を見つけてプログラムのサンプルを増やして行きたいところです。

クマ研講演会~みんなの知らない野生動物の世界~(2019)に参加してきました

岩手大学 Advent Calendar 2021 2日目の記事です。今日は以前に岩手大学で開催された「クマ研講演会~みんなの知らない野生動物の世界~」という公開講座に参加した時の話をしようと思います。

クマ研講演会

少し前の2019年11月の話になりますが、岩手大学で「クマ研講演会~みんなの知らない野生動物の世界~」という公開講座が開催されました。面白そうな講演会であったため、ふらりと参加してみました。

クマ研講演会に向かう

クマ研講演会は2019年11月16日(土)の13:00開始であったため、まずはお昼ご飯をすませてから会場に向かうことにしました。 お昼は中津川の近くにある中河(なかがわ)に立ち寄ってみました。メニューはラーメンだけという昔ながらの硬派(?)なお店でです。 (残念ながら、当時の段階で店内での撮影はNGになっていました…)

f:id:furandon_pig:20211202234059j:plain f:id:furandon_pig:20211202234104j:plain

あとはそこから会場の岩手大学まで散歩を兼ねて歩きます。運の良いことに中河から通りに出た道を道なりに歩いてゆくと岩手大学に辿り着けるようです。

f:id:furandon_pig:20211202234053j:plain

岩手大学に着いた後は講演会の案内ポスターを頼りに会場に向かいます。

f:id:furandon_pig:20211202234045j:plain f:id:furandon_pig:20211202234028j:plain

岩手の森のけもの達~その生息の実態は今~

公開講座の内容はいくつかあったのですが、今回のその中の「岩手の森のけもの達~その生息の実態は今~」の紹介をしようと思います。

岩手県に生息する野生動物(哺乳類)は45種類あり、以外(?)なことに一番多い種類はコウモリ目とのこと。 (てっきりクマかシカ類が多いのかなと思っていました…) そして参考までに、鹿児島県の場合は39種類とのこと。

野生動物 種類 備考
モグラ・トガリネズミ目 7種
ウサギ目 1種
ネズミ目 8種
コウモリ目 17種 13種がレッドデータ種になっている
サル目 1種
食肉目 8種
ウシ目 3種

また、市街地でよく見かけるのは「アブラコウモリ」という話でした。

コウモリの話

コウモリは大食漢?

コウモリ目が一番多いという点から、コウモリの習性について解説されていました。

コウモリは大食漢であるらしく、例えばユビナガコウモリが住処の洞窟からエサを採りに出かける前(出洞前)の体重は13gほどでありながら、帰って来た時(帰洞後)は16gになっていたり、ドーベンコウモリの例では7g~12gの変動幅で、最大8gのユスリカ捕食例もあるのだとか。この大食漢っぷりは、計算上だと体重45gのヤマコウモリが400匹分のタマバエ(20g)を捕食できることになり、ヤマコウモリが50匹いたら、一晩に20,000匹のタマバエを捕食できるという計算になります。

これはコウモリ目が昆虫類の大量発生抑制に多大な貢献を果たしているという話でもあり、健全な農林業への大きな役割を果たしているとも言えます。 日本では試算されていないとのことですが、アメリカの試算では農業被害軽減効果は最低でも年37億ドル(4000億円)にもなるとのこと。

コウモリの保全に関する課題

ところが、日本においてはコウモリの保全に関する課題は山積みとのことで、森林性コウモリの場合は繁殖・休息場所の減少が挙げられます。これについては、例えば乗鞍高原にバットハウスがあったりします。 また、トンネルの改修等で天井をツルツルにしてしまうとコウモリがつかまれなくなってしまうため、「コウモリピット」を設置して止まりやすいようにしたりしたり、メッシュタイプのコウモリピットを用意したりするとのこと。 そして、欧米はコウモリ保全の先進国とのことで、イギリスではコウモリが屋根裏に入りやすいように出入り可能な瓦が販売されているのだとか。

加えて、クリーンな発電方法として風力発電が挙げられますが、バードストライクと同じく、バットストライクも風力発電の進展と共にコウモリの保全に対して深刻な影響を与える可能性が考えられるというお話でした。 (全てにおいてベストな解決策というものは存在しないという話ですね…)

岩手県で近年問題になっている動物たち

ハクビシンの話

コウモリの話の次は、岩手県で近年問題になっている動物たちの解説が行われました。 ツキノワグマによる被害はニュースでも耳にするのですが、それ以外の動物による被害はあまりニュースにはなりませんね…。

まずはハクビシンの話がありました。どうやらハクビシンは甘いものが大好きで何でも食べ、しかも昆虫、ニワトリ、カエルなど何でも食べる悪食(?)とのこと。はては里芋の芋がらまで食べるらしく、食べ物の半分は人間由来のエサになっているとのこと。 さらに、人間由来の資材、廃屋などがハクビシンの格好のねぐらになっており、例えば古い神社のお社などがねぐらになっているというお話でした。

ツキノワグマの話

ツキノワグマの話もあり、今年(当時は2019年)も出没・駆除が頻発しているという話でした。 岩手県は広いというか、東西に大きな山脈が分かれており、同じ岩手県でも、北上高地と奥羽山地でツキノワグマに遺伝的な差があり、北上高知(北上山地)ではアルビノのクマの発見率が多いとのこと。 また、クマは蛇が嫌いらしく、どうやらこれは本能的な習性ではないかとの解説がなされていました。 ニュースを見ていると、頻度の差はあれ定期的にクマのニュースが出ているという印象はあり、特にブナが不作の時にはクマが多く出てくる気がしますが、実際のところ、東北でクマの駆除が多いのは夏(7~10月)であり、この季節はブナの実はなっていないため、別の要因ではないかとの話でした。 (講演者の方が「これは別の機会に…」と話されていたので、次回のクマ講演会が待たれるところです) そして、クマに縄張りはあるか?という話があり、クマの行動圏は重複しているため、一頭駆除しても代わりがたくさんいる、なので駆除したから即安心、という話でもないとのことでした。

昨今の農業就業者数の減少により、畑が廃棄されるケースが増えており、廃棄された畑はすぐ荒れてしまいバッファゾーン(※)ではなくなってしまうので、クマが通れるようになってしまう。 ※:農道等で道ができていると、クマは緑が無いところを警戒して道を横切って超えてこない、という話でした。

結局のところ、クマの駆除だけでは被害はなくすことはできず、森の整備、そしてクマを里に誘因する原因の除去など「総合的な施策」が欠かせないという話で解説が締めくくられていました。

まとめ

「クマ研講演会~みんなの知らない野生動物の世界~」の公開講座メモをまとめてみました。2019年に開催された際にメモを取っていたのですが、だいぶ長らく手元にしまい込んでいたため、今回改めてメモを整理して公開してみました。 他にも面白い話がいろいろとありましたので、またメモが発掘されたら公開するとともに、次回のクマ研講演会の開催を心待ちにしたいと思います。

Solaris10ではCPUアーキテクチャ名がコマンドになっている?

岩手県立大学とか、岩手の人たち Advent Calendar 1日目の記事です。 今日はSolaris10環境で提供されている(されていた?)謎のコマンドを紹介しようと思います。 (ただし我々の世界とは時間軸が完全に一致していない可能性があります...)

昨年の岩手県立大学 Advent Calendar 2020の記事でも話題に出しているように、学内のソフトウェア演習ではSolaris10が使用されています(繰り返しますが時間軸が異なっている可能性があります…)。

そんなSolaris10環境をあれこれいじっていると、シェル上で謎のコマンド名が補完されました。

$ mc
mc68000   mc68010   mc68020   mc68030   mc68040   mconnect  mcs

CPUアーキテクチャ名がコマンドになっている?

mc68000といえば、モトローラが開発したCPU(モトローラ的には「MPU(マイクロプロセッシングユニット)」と呼ぶようですね)です。このコマンドは何をするものなのでしょうか?

他にもCPUアーキテクチャ名がコマンドになっているものがいくつかあります。しかも他のCPUアーキテクチャに関しても同様にコマンドが提供されています。

$ file `which mc68000` `which sparc` `which pdp11` `which vax` `which i386`
/bin/mc68000:   ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped
/bin/sparc:     ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped
/bin/pdp11:     ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped
/bin/vax:       ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped
/bin/i386:      ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped

加えて、iノード番号が同じであり、ファイル的には全て同じものとなっています。

$ ls -li `which mc68000` `which sparc` `which pdp11` `which vax` `which i386`
       339 -r-xr-xr-x  29 root     bin         5708 Jan 23  2005 /bin/i386*
       339 -r-xr-xr-x  29 root     bin         5708 Jan 23  2005 /bin/mc68000*
       339 -r-xr-xr-x  29 root     bin         5708 Jan 23  2005 /bin/pdp11*
       339 -r-xr-xr-x  29 root     bin         5708 Jan 23  2005 /bin/sparc*
       339 -r-xr-xr-x  29 root     bin         5708 Jan 23  2005 /bin/vax*

実行しても何かが起こるわけでもなく、単に終了コード 255 を返すだけです。 てっきり特定のCPUアーキテクチャのエミュレーション実行ツールか、あるいはバイナリ変換ツールかなと思っていたのですが、そうではなさそうです。

$ mc68000 ; echo $?
255

machid(1)コマンド

これら一連のコマンドが何であるかは、(当たり前ですが)ずばりmanページに記載されていました。 Solaris10が稼働しているマシンの命令セットと(コマンド名が)一致する場合に真(終了コード 0 )を返すコマンドとなっています。

$ man sparc
User Commands                                           machid(1)
...
NAME
     machid, sun, iAPX286, i286, i386, i486, i860, pdp11,  sparc,
     u3b, u3b2, u3b5, u3b15, vax, u370 - get processor type truth
     value
...
DESCRIPTION
     The following commands will return a true value  (exit  code
     of  0)  if you are using an instruction set that the command
     name indicates.

たしかに、マシンの命令セットと同じコマンドが真を返しています。

$ uname -a
SunOS unknown 5.10 Generic_120012-14 i86pc i386 i86pc
$
$ for cmd in i386 mc68000 pdp11 sparc vax ; do echo $cmd ; $cmd ; echo $? ; done | paste - -
i386    0
mc68000 255
pdp11   255
sparc   255
vax     255

なるほど、これで疑問が解けてスッキリしました。Sun Microsystemsなのに何故か(?)Oracleのホームページでmachid(1)のマニュアルが参照できます。 が、マニュアルには以下の注意書きがあり、どうやら今回紹介した一連のコマンドはすでに非推奨のようです…。

machid コマンドファミリは廃止されており、Oracle Solaris の将来のリリースで削除される可能性があります。 代わりに uname -p を指定してください。

個人的には uname -p としても、 if [uname -p= 'i386' ]; then ... のような少し冗長な感じになりそうなので、単に i386 コマンド等の方がシンプルにも思えるのではありますが…。

まとめ

Solaris10で提供されていた、CPUアーキテクチャ名と同じという謎のコマンド群を紹介しました。BSD系やLinuxでは uname -p でマシン種別を判定したりしますが、歴史のあるUNIXではまたちょっと違った方法で判定するというトリビアを得られました。

SolarisのCDE環境に付属する謎(?)のツール、アプリケーションビルダ

遅ればせながら岩手県立大学 Advent Calendar 2020 第9日目の記事です。
今日はデスクトップ環境CDEに含まれている謎(?)のツール、「アプリケーションビルダ」の話をしようと思います。
(例によって我々の世界とは時間軸が完全に一致していない可能性があります...)

f:id:furandon_pig:20201216072956p:plain

GUIアプリケーションビルダ?

ソフトウェア演習で利用しているSolarisには、「アプリケーションビルダ」という謎のツールが付属しています。謎、というのは、このツールの使い方がイマイチ良く分からないのに加え、マニュアルを見てもどうGUIを構築するのかがやはり見えてこない点にあります。

man dtbuilder によると、どうやらCDE向けのGUI管理機能を備えたアプリケーション構築ツールのようです。

$ man dtbuilder
User Commands                                        dtbuilder(1)

Name
     dtbuilder - the CDE Application Builder

SYNOPSIS
     dtbuilder [projectfile]

DESCRIPTION
     The dtbuilder utility is an interactive application develop-
     ment tool and user interface management system for CDE.
     Known more fully as the CDE Application Builder, dtbuilder
     is designed to make it easier for developers to construct
     applications that integrate well into the CDE.  It provides
     two basic services - aid in assembling Motif objects into
     the desired application user interface and generation of
     appropriate calls to the routines that support CDE desktop
     services (e.g. ToolTalk, sessioning, Help).

debuilder コマンドでアプリケーションビルダを起動できます。

$ which dtbuilder
/usr/dt/bin/dtbuilder
$ dtbuilder &

なにやらそっけない感じのウインドウが表示されます。

f:id:furandon_pig:20201216072952p:plain

アプリケーションビルダでGUIを構築してみる

試しに簡単なGUIを作ってみます。左側の「ウインドウ」のアイコンをドラッグすると、「モジュール名」というダイアログが表示されます。どうやらこのようにしてアプリケーションウインドウを作ってゆくようです。

さらに「コントロール」ペインからボタンやラベルといったよく見かけるGUI部品をウインドウに配置してみます。

f:id:furandon_pig:20201216073031p:plainf:id:furandon_pig:20201216073027p:plain

とりあえずビルドしてみる

ビルドはどうすれば良いのだろうと思っていたのですが、どうやらアプリケーションビルダのメニューから「ファイル(F)」-「コードジェネレータ(G)...」で表示されるダイアログでコードの生成とmakeの実行まで行えることが分かりました。

f:id:furandon_pig:20201216073020p:plainf:id:furandon_pig:20201216073016p:plain

が、何やら make の実行でビルドエラーが出ます...。

f:id:furandon_pig:20201216073013p:plain

落ち着いてエラーメッセージを読むと、 DTHELP_WARNING_DISABLED マクロを定義してビルドすると良いよ!的なことが書いてあります。 #define で指定する方法とCFLAGSに -DDTHELP_WARNING_DISABLED を追加するいずれかの方法で対応できそうだったので、今回はCFLAGSでマクロを定義する方法にしました。

$ diff -u Makefile.ORIG Makefile
--- Makefile.ORIG       Mon Dec 14 07:41:50 2020
+++ Makefile    Mon Dec 14 07:42:30 2020
@@ -30,7 +30,7 @@
         ALLX_LDFLAGS = -L$(ALLX_LIBPATH) -R$(ALLX_LIBPATH)
         LOCAL_LIBRARIES = -lDtWidget -lDtHelp -lDtSvc -lXm -lXt -lXext -lX11

-        CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(ANSI_DEFINES)
+        CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(ANSI_DEFINES) -DDTHELP_WARNING_DISABLED
         CCFLAGS = $(CFLAGS)
         LDLIBS = $(SYS_LIBRARIES)
         LDOPTIONS = $(CDE_LDFLAGS) $(ALLX_LDFLAGS)

無事にビルドが通りました!

f:id:furandon_pig:20201216073011p:plain

文字化けとの闘い

ビルドが通ったのは良いのですが、アプリケーションを実行してみるとボタンやラベルが文字化けしています...。

f:id:furandon_pig:20201216073008p:plain

おそらくどこかに多言語向けのコード生成を行わせるようにする設定があるのでしょう。アプリケーションビルダのメニューを見ると、「エディタ(d)」-「アプリケーション・フレームワーク(A)」というメニューがあります。

f:id:furandon_pig:20201216073005p:plain

そこには「国際化」という項目があり、デフォルト設定では「使用する:」のチェックが外れていました。このチェックを入れて再ビルドしてみます。

f:id:furandon_pig:20201216073002p:plain

今度は無事に文字化けせずに表示できました!

f:id:furandon_pig:20201216072959p:plain

まとめ

デスクトップ環境CDEに含まれているツール、アプリケーションビルダを簡単に触ってみました。実はこのツールはMotif)というGUIライブラリを利用してアプリケーションを構築するためのもので、どうやら9日目の記事で紹介したJava Swingよりもちょっと古いお作法でのGUIアプリケーション開発になるようなイメージです。

機会があれば、このアプリケーションビルダを利用してちょっとしたサンプルを作ってみたいと思います。

Java SwingでGUIを手書きする話

岩手県立大学 Advent Calendar 2020 第9日目の記事です。
今日はソフトウェア演習ではJavaGUIを手書きするという話をしようと思います。
(ただし我々の世界とは時間軸が完全に一致していない可能性があります...)

Java SwingでGUIを手書きする

ソフトウェア演習ではJavaを用いたプログラミングの授業が行われます。
CLIで動作するアプリだけでなく、SwingというJavaGUI用クラスライブラリを用いたアプリケーション作成の課題が出されたりします。

Hello,World的なGUIアプリケーション

GUIアプリは以下のような感じで手書きします。JBuilderのお試し版をインストールして動かしている人もいますが、メモリが128MBの環境ではJBuilderのようなIDEはだいぶ重たい動作になってしまいます...。

import javax.swing.JFrame;
import javax.swing.JButton;

public class Hello extends JFrame {
    Hello() {
        super("hello");
        getContentPane().add(new JButton("Hello,World."));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    public static void main(String... args) {
        new Hello();
    }
}

そのためソフトウェア演習ではMuleというemacsへの多言語対応版エディタを使ってソースコードを書いています。人によってはよりコンパクトなエディタであるviを使ったりもするようです。
デスクトップ環境のCDEに付属しているdtpadというメモ帳風のエディタも試してみたのですが、さすがにこれでソースコードを書くのは少々骨が折れます...。

エディタの話を始めると大論争がおこるという都市伝説がありますが、個人的にはviの基本的な使い方を抑えておくと後々つぶしが効く(?)感じです。

Swing GUIを手書きする場合のコツ

そしてSwing GUIを手書きするという点についても、それほど難しい感じではありません、以下のような感じでBorderLayoutにボタンやラベル、テキストエリアを追加してゆくことでUI部品の配置やウインドウリサイズ時の再配置が動的に行われるようになります。

f:id:furandon_pig:20201210213640p:plain

私もSwingを使いこなせているワケではありませんが、ちょっとしたGUIアプリケーションを作成するだけであれば、以下のクラスの使い方を把握しているだけで充分対応できるという印象です。

GUI部品はどのアプリケーションでも似たような使い方になるので、イディオム的な使い方のサンプルを用意しておくと、テンプレート的な感じでソースコードを利用できるのでおススメです。

ソフトウェア情報学部の計算機環境

遅くなってしまいましたが岩手県立大学 Advent Calendar 2020 第4日目の記事です。
今日は学内でのソフトウェア演習で用いられている環境の紹介をしようと思います。
(ただし我々の世界とは時間軸が完全に一致していない可能性があります...)

学内の計算機環境

ソフトウェア情報学部では、Sun MicrosystemsSolarisというOSが利用できるようになっています。このSolaris環境でC言語シェルスクリプトPerlJavaを用いたプログラミングの授業が行われています。また、LaTeXという組版システムもインストールされており、これを用いてレポートを作成したりします。

f:id:furandon_pig:20201209025004p:plain

ちなみに、UNIXの系譜で見るとSolarisは当初BSDをベースにしており、のちにSystemVベースになったという経緯があります。BSD系のOSでは、デフォルトシェルがtcsh(Cシェルの機能拡張版)なのですが、学内のSolaris環境ではbash(Bourne Shellの機能拡張版)がデフォルトシェルに設定されています。Linux等でもbashがデフォルトシェルになっていたりするので、それぞれの環境を行き来する場合でも挙動の差異にあまり悩まされなくて済みそうです。

学生一人に1台のSolarisマシンが割り当てられるようになっており、各マシンの /usr/local 以下にソースコードからビルドしたアプリケーションをインストールして利用することも可能です。とはいえ、ソースコードからビルドしようとすると、まず最初に関連ライブラリをインストールするところから始める必要もあったりするのでちょっと大変です...(逆に考えると、ビルド力の向上に役立つと言えるかもしれません)。 学内のSolaris環境を利用してどんなことができるかは、以降のアドベントカレンダーで紹介させてもらえればと思います。

JustTechTalk#06 参加メモ(1/3)「スマイルゼミの裏側:データベース編」

JustTechTalk#06 スマイルゼミの裏側(DB編)とRDBMS最新動向に参加してきました。 タイトルにもある通り、今回はDB関連の話がメインで以下の3つの発表がありました。

  • スマイルゼミの裏側:データベース編
  • OSS DBの最新情報
  • Amazon独自のDBマネージメントシステム

全部まとめると長々とした内容になってしまうので、今回は発表内容ごとにブログの記事を分けてみます。 (一つにまとめると後から自分で見返す時も大変ということに今更ながら気がついたのです...)

スマイルゼミの裏側:データベース編

ジャストシステムが運営する「スマイルゼミ」のサービスの裏側に関する内容でした。 スマイルゼミのサービスはTomcat+PostgreSQL 9.3で構築されており、今回はDB的な意味でやらかしてしまった話を聞くことができました。

スマイルゼミについて

  • スマイルゼミは小学生と中学生でニーズが異なる
    • サーバとクライアントの構成も小、中学生向けで別物というくらい異なっている
  • アクセスのピーク時間にも違いがあり、基本的に朝と夜にピークの山がある
  • 小学生向けのサーバでは朝の6:00〜8:00前くらい、中学生だと夜にピークがある

DBでやらかしてしまった話

DBでやらかしてしまった話として、unionにまつわる2つのケースが解説されていました。

viewの中のunionが悪さをしていた話

  • ある日のこと、平日のピークではない時間帯に負荷が急上昇した
  • 前日にhotfixを当てており、これが問題の引き金になった模様
  • 内部のバッチ処理で1300万行のシーケンシャルスキャンが発生していた
  • 調べてみると怪しいviewがあった。
    • (4000行のviewとのことで、業務だとそれくらい大きなviewを使うものなのですね...)
    • viewを使うようにプログラムを変更しており、viewを使うとオプティマイザが絞り込みをしなくなってしまう
    • さらに、viewの中でunionを使っており、これが性能劣化の原因であった
      • (ちょっと記憶と手元のメモが曖昧。viewの中でunionしたことで、オプティマイザが働かなくなった、という話かも)
  • 対策として、前日の学習結果の集計をview定義の段階で学習日で絞った

(今度は逆に)unionで問題解消できた話

  • スマイルゼミのサービスとして、「みまもるトーク」というLINE的(?)なサービスがあるとのこと
  • これを中学生向けにも展開するため、ユーザ認証関連のSQLを修正した
    • WHERE句に小学生、中学生、親の条件を追加する形での修正
  • すると実行計画が狂ってしまい、インデックスが使用されなくなりシーケンシャルスキャンが発生
  • 対策として、小学生、中学生、親のそれぞれで行を絞り込んでからunionする方法で問題解消

得られた教訓

  • unionしている箇所の変更は慎重に行う必要がある
    • また、unionしてもよいのは中間結果が小さい場合のみ
  • viewの中でのunionは危険

まとめ

JustTechTalk#06 参加メモを書いてみました。他の2つの発表についても順次メモをまとめてみます。 DB関連のやらかしはケーススタディとして聞いた瞬間は「なるほど、自分も気をつけよう」と思うのですが、やはり実際にハマってみないと身につかないため、view+unionで実際に性能劣化が発生する様を手元の環境で試してみようと思います。