島田商業高等学校講演レジメ

  1. 静岡理工科大学情報学部の紹介
  2. 本日のプレゼン資料(PDFファイル)
  3. HTML5の機能
  4. フォームとPHPの連携
  5. Webデザイン特別プログラム製作物
  6. Webアプリケーションの例
    1. シューティングゲーム(リンク無)
    2. 名刺発行システム(リンク無)
    3. 関数グラフ&数表出力
    4. 電気料金節約シミュレーター

卒研メモ: Apache Cordova参考文献

 来年度の3年生向け実験講座のテーマを決めなきゃいかん時期になりました。久しぶりなのでOS環境から作る必要があり,3月下旬~4月上旬はこれにかかりきりになりそうな感じです。

 ということで,色々調べた結果,枯れた技術を使うのが安全なので,テーマとしては「Apache Cordovaを用いたハイブリッドアプリ開発」になりそうです。まだ作ったことないけど。他の先生方とテーマが被ることもなさそうです。

 参考文献は色々探すと,これなんか良さげなので,一冊入手しました。Webに転載されている分だけでも参考になります。とはいえ,何を作るかまでは本には書いてありませんので,いろいろ考えなきゃいかん訳です。2~3回の実習でできる範囲に留めておかなきゃいけません。この辺の塩梅が難しいところ。

 まぁ,チマチマ触りながらテーマを考えていきます。

卒研メモ:openBD全件サーチ高速化

 MySQL化に引き続き,検索の高速化を行ってみました。手っ取り早く,著者フィールドをindex化した結果,かなりの高速化ができることを確認しました。

 検索ワードを「高橋留美子」でやってみた結果です。index化前は

でしたが,index化後は

となり,1.69秒→0.00257秒で爆速となりました。このぐらいだとほぼWeb通信の遅延しか感じません。

 とはいえ,index化できるフィールドには限りがあり,出版社名,タイトル名まで一篇にはindex化できません。ということで,メインの書籍テーブルではタイトル名でindex化しておき,著者名,出版社名はそれぞれ個別にテーブルを作っておくことにしてはどうかと思案中です。これができると,ようやく最終目的である「openBD APIに著者名,タイトル名,出版社名の検索機能を追加する」ことができるようになります。予定では

  • 著者名検索 -> http://root-url/tklab_openbd/version/search?author=著者名
  • 出版社名検索 -> http://root-url/tklab_openbd/version/search?publisher=出版社
  • タイトル名検索 -> http://root-url/tklab_openbd/version/search?title=タイトル

となればいいかなぁ。マシンリソースが決定的に不足してますんで,API keyはPOSTで渡すようにして制限掛ける予定です。今月中にできればまぁ情報処理学会で話すぐらいは出来るでしょう。

 ちなみに,メイン書籍テーブルまるごとのMEMORYエンジン化は無理でした。メインメモリを山ほど積んだ,openDBの本家が展開しているような贅沢クラウド環境でないと厳しいですねぇ。
 フィールドを制限してテーブルサイズを小さくすると入ることは入りますが,1/4ぐらいの検索速度に留まりましたんで,index化の方が桁違いに速いことが分かります。

卒研メモ: openDB全件サーチMySQL化

 以前作ったOpenBD全件サーチ試作版ですが,卒研が佳境になってきたので,高速化の試みを行いました。A君の頑張りのおかげで,Memcachedをかませてコンマ000秒程度の時間で検索が可能であることが確認できました。とはいえ,一度検索を行った結果がCacheされて再利用できる場合にのみ,です。

 SQLiteからMySQLへの移行も行い(未公開),ついでにデータダウンロード用のPythonスクリプトをVersion 3対応しました。結果として,安定的に1秒台後半の検索が実現できています。

 ただやっぱり普段からGoogleの爆速サーチに慣れ切った身としては,1秒以上待たされるというのは「もったりすったり」感が拭えません。

 現状では検索対象データは100万件程度,1GBぐらいで収まってますので,このぐらいならどうにか全部On memoryで可能と考えています。とりあえずMySQLのMemory storage機能を使ってみたいところです。

 これで初手から検索が高速になるようなら,Memcachedも不要となるはずですが,データの肥大化にどこまで対応できますやら。

卒研メモ: Wordcloudを描いてみる

 Word Cloudとは,テキストマイニング結果を可視化する技法の一つで,重要度の高い順に単語のサイズを大きくすると共に,中心から周辺へと配置するというものです。WebサービスとしてWord cloudを作る機能を提供しているところもあり,例えば,こちらのサイトを使って情報学部のトップページをWord cloudにすると次のようになります。

 同様に,MATLABでもWord cloudを描く機能が最新版の2017bから追加されたようです。wordcloud関数一発で描けるということなので,早速やってみました。次の1行で十分です。

これで生成した図が下記のものになります。

 形態素解析を使っておらず,助詞が混じってしまっていますが,そこそこまともなものができています。きちんとやりたい人は,MeCabYahoo!のサービスを使ったりして助詞を省く必要があります。

大学祭2017:研究室公開

 情報学部コンピュータシステム学科所属の高性能計算研究室(幸谷研究室)では,毎年「名刺作成Webアプリ」でQRコード入り名刺を作成して頂いています。

 昨年度までのものと基本機能は変わりませんが,Bootstrapを導入して入力画面をResponsiveデザインに変更しました。大分華やかになったと思うのですが如何でしょうか?

 ご来場された皆様には,お一人様A4用紙1枚(名刺三枚分)を印刷してプレゼント致します。10:00~15;00まで,526実験室にて本学3年生がお待ちしております。

卒研メモ:.NET Coreファミリの分類

 どうもMicrosoftが主導する.NET Frameworkから.NET Core,そしてXamarin買収という流れが理解できずにいたのですが,このASCII.jpの記事を読んで疑問が氷解しました。

 現状,Windows OSの上で動作することが前提の.NET Frameworkから,Linuxを含めた.NET Coreへの注力がなされており,Xamarinはその一翼としてiOSやAndroid上でモバイルアプリ開発用として活用される見込みということだそうです。この記事にもある図を,自分なりの解釈も入れて書き直してみました。

 .NET Coreも良さげですが,Linux環境下での実績がイマイチ良く分からんので,当面はXamarinを中心にWebとのハイブリッドサンプルアプリを作ってみるぐらいでお付き合いしていこうと思っています。

情報セミナー2開始

 本年度も新規に本研究室に配属された3年生7名と共に,情報セミナー2を毎週2コマずつ実施します。本日はその2回目,前回は私(幸谷)が前説を行いましたが,今回からはあらかじめ割り当てられた受講生の中から二人ずつ,先生役を務めて頂きます。

 テキストは前年度から使っている「Webアプリケーション開発入門」,これを9月下旬~11月末までの2か月ちょっとで第5章まで解説し,実際にプログラムを打ち込んで実行しながらHTML, JavaScript, CSS, PHP, SQLを学んでいきます。

 今年の3月には全面的に書き換えてだいぶ改良しましたが,セミナーの解説を聞きながら見てみると色々直すべき箇所が見つかるもんです。といっても,解説直前に書き換えられては先生役の受講生に気の毒ですので,終わったところからチマチマ修正をかけることにしました。本日は第1章の「JavaScriptの基礎」まで終わりましたので,ここまで訂正をしてあります。

 5章まで終わる11月末までには修正も終わるという寸法ですが,直しても直してもまだ物足りないところが出てくるのが,自作テキストの困った所です。Web文書ですからナンボでも修正は効きますしね。無理しない範囲であれこれ直していく予定です。

卒研メモ:W3C Payment Request API

 通販サイトや金融分野でのWebの利用が活発な昨今,金銭のやり取りのための標準APIであるW3C Payment Request APIが,主要ブラウザで実装されているようです

 仕様をざっと見たところ,JavaScriptで支払情報,支払い完了情報等のオブジェクトが定義されており,オブジェクトに情報を突っ込んでJavaScript関数を呼び出すだけで支払いが可能になるという便利なAPIになっています。勿論,現在でもクレジット情報のやり取りは普通にWeb上で行われていますが,全く標準化されておらず,旅行業者や通販業者ごとにバラバラの取引ツールを使わざるを得ない状況になっていました。

 今後はAmazon BusinessのようにB2Bでも標準的なAPIで金銭のやり取りが行われるようになっていくでしょう。巨大なプラットフォームに依存しないW3CでのWeb APIの標準化と実装の勧めは自由競争社会を維持する上で重要な活動です。

[模擬講義] コンピュータの計算は正しくない!

オープンキャンパス模擬講義

「コンピュータの計算は正しくない!」

静岡理工科大学 情報学部
コンピュータシステム学科
幸谷 智紀(こうや とものり)


1.「数」とは?

 現在のICT社会で使用される「データ(data)」は例外なく全て「数」を表現したものです。小学校では自然数,分数(有理数),小数を,中学校では負の数と整数を,高校では無理数を習いますが,それらの数を総称して「実数(real number)」と呼びます。実数を幾何学的に表現する時には直線=数直線を使用します。全ての数は,この数直線上のどこかに「点(point)」として存在しています。

 自然数,整数,有理数は全て分数として表現できる数です。下記の図に示す通り,分数は無数に存在します。

 ちょっと脱線しますが,下記のような問題はご存知でしょうか?

 解答については検索して調べて頂ければ何らかの手かがりが得られるでしょうが,実際の分数の計算はこのようにしてはいけませんね。どのように計算できるのか,ちょっと試してみましょう。

分数の計算フォーム

 実数にはもう一つ,分数としては表現できない「無理数(irrational number)」があります。有名なものとしては円周率\pi = 3.1415...や平方根\sqrt{2} = 1.4142...があります。これも実数の一種なので,数直線上の点として実在しています。

 有理数(分数)を小数で表現すると,次のように必ず同じ数のパターンが繰り返し出てきます。

\[\begin{split}
\frac{1}{2} &= 0.50000\cdots = 0.5\dot{0} \\
\frac{1}{3} &= 0.33333\cdots = 0.\dot{3}
\end{split}\]

 無理数では同じパターンの数の羅列が永久に続くことはありません。ちょっと計算してみましょう。

Try! MPFR

 従って,実数を一言で表現すると「循環したりしなかったりする)無限桁の小数として表わすことのできる数」ということになります。何故無限桁が必要になるのかは,微分積分(数学II, III)に登場する「極限」というものと深い関係がありますが,それは大学に入ってからじっくり考えてみて下さい。

 現在の科学技術では実数を土台とする計算が不可欠です。そしてほとんどの計算はコンピューターの中で行います。では,次にコンピューターの中身について見ていくことにしましょう。

2.コンピュータの仕組みと「データ」

 今のコンピューターの筐体とぱかっと開けると,マザーボードと呼ばれるデジタル回路基板の上に様々な集積回路が載っていることが分かります。下記は本研究室で故障したマシンのマザーボードの写真です。

 マザーボードの上に乗っている集積回路のうち,重要なものがCPU(Central Processing Unit)とメモリ(RAM)です。コンピューターで行われる処理は,全てのデータが「数」として表現されてメモリに格納され,処理内容に応じてメモリ内のデータが読み出されて処理され,またメモリに書き戻されます。

 このCPUとメモリとのやり取りに要する時間,CPU内の処理(計算)に要する時間が短ければ短いほど,コンピューターの性能が高いと言えます。とても高速な処理が可能になっていますが,困ったことに,メモリの大きさは有限で,処理時間も短いとはいえゼロにはなりません。「無限の長さを持つ実数」をそのままコンピューターのメモリに格納することは不可能ですし,仮にできたとしても,無限の長さの処理時間を要することになります。「無限大(∞)」とは果てのないことを意味し,それ故に完ぺきな数学,特に微分積分のような解析学という体系が成り立つわけですが,これではコンピューターには実数の計算が出来ないことになってしまいます。

3.「誤差」を含まざるを得ない科学技術計算

 仕方がないので,コンピューターの中では無限桁の小数を適当な長さに切って,有限桁の小数(=有理数の一種)として扱うことにします。この適当長さに切る操作のことを「丸め(Round-off)」と呼び,丸めに伴って起きる元の正しい値(真値)とのズレを「誤差(error)」と呼びます。

 この丸めに伴う誤差を,関数グラフアプリを使ってみていくことにしましょう。

MPFRgraph

コンピューターは計算が高速なので,いくらでも長い桁の計算ができそうですが,長くなればなるほど計算時間はかかるようになりますし,科学技術開発競争を世界中で行っている昨今,あまり誤差ばかり気にして長い桁の計算ばかりすることは難しいのが現状です。従って,最近のAIの中核技術であるDeep Learningではなるべく短い桁の小数で計算しようとしています。

 しかし,いくら計算が速くても,途中で誤差が拡大されて,不正確な値しか出てこないようでは困ります。一般には,丸める桁数を長くすれば誤差も小さくできるわけですが,とてもたちの悪い問題があることは良く知られていて,いくら桁を長く取っても足りなくなるということもあります。

5.誤差評価付き計算の例

 性質の良くない問題の例として,「複雑系(Chaos system)」というものがあります。一番シンプルなものとして,ロジスティック写像で定義される次のような数列x_0, x_1, ..., x_i, x_{i+1}, ...の生成問題を取り上げましょう。

 出発値x_0 = 0.7501として,次の式の右辺を計算して次のx_1を導出します。

\[ x_{i+1} := 4x_i (1 – x_i) \]

これで実数列\{x_i\}^{100}_{i=1}を,下記のCプログラム

を用いてIEEE754単精度(約7桁)及び倍精度(約15桁)で計算した結果は次のようになります。

同じ値になる名図ですが,x_{20}あたりでもう単精度の値は最初の一桁目しか合っていません。x_{30}以降はもう全く違う数です。

 このような場合はもっと桁数を増やして計算する必要があります。50桁計算すると下記のようになります。

100桁計算すると,

となり,大分同じ数に近づいてきたことが分かります。

 このように,丸めによる誤差の影響が大きく出る「悪条件問題」というものが,科学技術計算にはたまに出てきます。計算途中で誤差がどの程度は行っているのかを自動的に調べる「区間演算(interval arithmetic)」という技術もありますが,このような悪条件問題の場合は大した役には立たず,結局桁数を多くしないとまともな値を得ることはできません。下記の例は,MPFIと呼ばれる多倍長計算を区間演算に利用できるソフトウェアを使ったロジスティック写像の掲載例です。一応,プログラムもつけておきましょう。

6.まとめ

 以上,まとめますと

  1. 実数は無限桁の小数として表現される数である。
  2. コンピューターのメモリは有限なので,無限桁の実数を格納することはできず,丸めて短い有限桁に収めなければならない。
  3. 丸めに伴う誤差が甚大な影響を及ぼす「悪条件問題」というものが存在する。
  4. 悪条件問題を解決するには桁を増やして対処するしかない。しかしこれは計算時間を要する解決策である。

となります。「高性能計算研究室」ではこのように長い桁の計算,多倍長計算を用いて様々な悪条件問題の解決に取り組んでいます。