大学祭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. 悪条件問題を解決するには桁を増やして対処するしかない。しかしこれは計算時間を要する解決策である。

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

新研究室サーバ稼働開始

 本年度から本学独自のVPSの運用が本格的に始まり,物理サーバ(PC本体を自分で設置して運営するタイプのサーバ)として運用していたサービスをVPSへ移行するよう,情報センター長(私です)からお触れが出ました。ということで,水野先生にVPSのインスタンス(仮想サーバマシン)を設置して頂き,

の二つのサービスをVPSへ移行しました。見かけはほとんど変わってませんが,PHP 7で運用し,Perl CGIを廃止した都合上,チマチマと必要最低限のアップデートはかけてあります。これで物理サーバのハードウェア故障に悩まされることがなくなるかと思うと,大変気が楽になります。停止後の物理サーバ,何に使いましょうかね?

 ちなみに,URLは後ほど公開しますが,このインスタンスは本研究室のサーバーとしても利用できるようにもう一つ別のFQDNを持っています。ということで3つのFQDNを持つインスタンスということになります。
 本年度の卒研で利用する必要のあるメンバーには,アカウント情報を既に送付してあります(のでちゃんと稼働報告して下さいな>該当者の方々)。

 トラブルがあり,EVの取得がまだできていませんが,本研究室サーバとしての本格運用はEVを使ったHTTPS通信ができるようになってから,卒研用として広く外部公開していきたいと考えております。

前期単位取得者予定者一覧

数値解析1
最終試験平均点:;67.6点

1518005
1518023
1518033
1518040
1518042
1518053
1518067
1518083
1518095
1518096
1518108

以上

線形代数/演習(幸谷クラス)
最終試験平均点:50.3点

1718015
1718019
1718026
1718027
1718032
1718034
1718043
1718050
1718054
1718055
1718063
1718065
1718071
1718078
1718081
1718101
1718104
1718105
1718110
1718111
1718113
1718119
1718131
1718143

以上

応用線形代数
最終試験平均点:68.5点

1618013
1618014
1618019
1618037
1618038
1618039
1618062
1618065
1618079
1618101
1618112
1618114
1518096

以上

オープンキャンパス:高性能計算研究室

 2017年度,静岡理工科大学のオープンキャンパスは下記の日程で開催されます。

  1. 7月30日(日) 10時~16時(終了しました)
  2. 8月20日(日) 10時~16時(終了しました)
  3. 9月10日(日) 10時~16時(終了しました)

 本年度も,高性能計算研究室(幸谷研究室)では,独自に開発したWebアプリ等,卒業研究の中間報告を行います。まだギコチナイところはありますが,前期(4~7月)の成果をご覧頂き,ご来場の上,出来上がり具合を実際にご確認下さい。研究実験棟5階,526実験室右奥にてお待ちしております。

1.「JavaScriptとCanvasを用いたシューティングゲームの作成」

2.「OpenBDを利用した書籍管理サイト」

3.「電力とコストの自動計算を行うPCパーツ選択アプリケーションの製作」

4.「Twitterユーザーのポジティブ/ネガティブ診断」

5.「アルバイトのスケジュール管理アプリケーションの作成」

6.「楽天APIを利用した書籍の登録管理ページの制作」

7.「TensorFlowを用いた日本語から英語への機械翻訳」

8.「運動管理アプリケーションの製作」

卒研メモ:MATLABによるランダムシミュレーション

 「Rで楽しむ統計」著者の奥村先生が次のようなTweetをRTされてました。

 なるほど,確かにP.53~55に,ランダムなやり取りによって,かえって平等性が失われ,極端な貧富の格差が出るという数学的な説明がありました。元の論文ではRスクリプトの例がありましたが,MATLABの練習問題にはちょうどいいので早速作ってみました。

 粗削りですが,上記の例を実行するためのMATLABスクリプトを下記に張りつけておきます。

perms関数を使っているので,動作的にはずいぶん遅くなってしまっていますが,大体の雰囲気はつかめるでしょう。平等に出会ってその都度支払い&受け取りが発生したとしても,貧富の格差は大きくなるばかり,という現象が視覚的に理解できます。

 高機能計算ツールMATLABが入手できた暁には実行してみて下さい。

卒研メモ:GNU MPで素数日を調べる

 GMP(GNU MP)の機能として,整数が素数であるかどうかを確認する機能があります(数論関数のmpz_probab_prime_p関数)。詳細はマニュアルかソースプログラムを読んでいただくとして,本日(20170627)も素数日でした。

 ということで,本日が素数日かどうか,次の素数日(mpz_nextprime関数)がいつになるのかを教えてくれる機能をGMPサンプルプログラムに追加しました。

 ということで,この応用問題として「素数日でない時にはその数を素因数分解せよ」を出題しておきます。結構面倒なので,効率的な素因数分解方法を探求して下さい。