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

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

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

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

卒研メモ:Tensorflowの話題

 DeepLearning界隈の進化のスピードはとても速く,悠長に査読の結果を待つ余裕はないので,arXiv等のプレプリント投稿サイトにガンガン新しい成果が放り込まれていきます。これもその一つですね。

 この論文はちゃんと読む必要がありますが,単純に複素数化するのではなくて,計算量が節約できるユニタリ行列(実行列だと直交行列)を使うあたりが工夫なのかなと。いずれ遠からず実装されて公開されるんでしょうね。

 もう一つ,GoogleがTensorflow用のツールTensor2Tensorを公開しました(Blog記事)。機械翻訳で利用されているSequence2sequenceの改良がやりやすくなるようです。

 この界隈の進化は本当に速いですが,成果をすぐにプログラムで確認できるのはありがたいですね。

卒研メモ:XamarinとC#

クロスプラットフォームでネイティブアプリが開発できるApache Cordovaについての記事を以前書きましたが,オープンソース・マルチプラットフォーム戦略を展開するようになったMicrosoftもXamarinという.NET環境下における開発が可能なツールを出してきました。日本語の翻訳本も出版されているようです。

 .NETでの開発にはC#, C++/CLI, VBScript等が使われますが,現在ではどうやらC#が多いように見受けられます。LAMPスタック的には,PHP + JavaScriptに相当する機能を持つ広範な開発環境です。個人的な研究ではC, C++でガシガシ機械語コードを直接吐き出すプログラミングをやることが多いので,.NETだと遅くなりそうでなるべく避けていたのですが,node.jsの利用が盛んになった昨今ではもう毛嫌いする理由はなくなったように感じます。たまに古手のオープンソース主義者にはM$の利己主義的クローズド戦略姿勢を毛嫌いする向きもいますが,CEOが代替わりした今のMicrosoftは過去とは決別した別会社のようです。

 ということで,Cordovaの勉強が終わってから,.NETとC#,そしてXamarinも触ってみたいところですが,ロートルゆえに着手は早くても次年度以降ですね。急ぎ取り掛かりたい人はWebの情報を入手して,さっさと取り組んでみて下さい。

卒研メモ:WebサーバスタックとRDBMS

 Webアプリケーション開発も年数を経るにつれ,環境が固定化しつつあります。サーバ側では,WebサーバソフトとしてApacheの代わりにnginxが台頭してくるといった動きはありますが,RDBMSは定番の御三家(Oracle, MySQL, SQLServer)のシェアがほぼ不動状態になっています。(参考サイト: DB-Engines Ranking)

 時系列的に眺めても,Oracleに買収されたMySQLの代わりに完全互換のMariaDBのシェアが上がっているという動きはありますが,やはり定番の御三家の変化は殆どありません。

 この調査はWeb経由で行われているものなので,現在のWebサーバスタック,即ち,Webサーバ,RDBMS等のソフトウェア構成を反映しているものと言ってよいでしょう。本研究室では,開発環境としてはXAMPP for Windows(Apache, MariaDB, PHP)を使用しており,このサーバでもOSがLinuxであることを除けば同一の環境で稼働していますが,世界的にはOracleやSQLServerを利用しているWebアプリケーション動作環境の方が約2/3近く占めていることになる訳ですね。OracleはJava(JavaScriptに非ず)との組み合わせが多いように思えます。
 これらをまとめたWebサーバ側のソフトウェアスタックを図にしたものが下記になります。

 昨年にはMicrosoftがLinux環境向けのSQLServerのプレビューバージョンを公開し,C#を動かすための.NET core環境もLinux上に構築できるようになりました(こちらの記事が詳しいです)。こうなると,Linux上でもWindowsと同じ.NET環境で稼働するWebアプリケーションが実用になるかもしれません。

 近い将来は既存の教材をASP.NET MVCを使ったバージョンに展開していく必要が出てくるかもしれません。とはいえ,PHPとMySQLの牙城もWordPressやXoops等の有力CMSが存在するおかげで結構堅牢なので,そう簡単に乗り換える必要はないでしょうが,同じWebアプリの機能を違う環境で動作させるテクニックを知っておくのは悪いことではないでしょう。当方も一応心に留め置いております。

卒研メモ:加速度センサーとスマホ調査

 本日(2017-06-07)の情報学概論で,情報学部1年生に手伝ってもらい,JavaScriptによる加速度センサー(歩数計として使用予定)の動作確認をスマートフォンで行ってもらいました。ほぼ全員参加(140名)の同時アクセスでも問題ないことが確認でき,加速度センサーの動きも問題ないことが分かりました。

 ついでに,スマホのキャリアと機種を質問してみたところ,NTT DocomoとiPhoneのシェアが飛びぬけて高いことが分かりました。

 iPhoneは分かるとして,シェアを落とし続けていると思っていたDocomoが若者に強いのは意外でした。年と共にだんだん離れていくのかしら?

 今後も,この手の「スマホで調査」を継続していきたいところです。

卒研メモ:日本語形態素解析ツール

 日本語は英語とは異なり,単語の分かち書き(単語間にスペースを入れる書き方)をしないため,文章を解析して単語を分割する必要があります。分解する際には単語の品詞を区別するため,形態素解析(Morphological Analysis)と呼ばれるツールが,日本語のテキスト解析には不可欠のものになります。

 フリーで使える形態素解析ツールとして有名なのはMeCabです。このサーバにも入っていますので,試してみて下さい。但し,辞書の更新を行っていないため,最近の固有名詞には対応していません。適宜アップデートしてくれる機構もあるのですが,辞書が一方的に馬鹿でかくなるので,そろそろストレージに余裕のなくなってきた本サーバには組み込んでいません(多分,本学クラウドに用意することになる筈)。

 インストールしなくても使えるものとしては,Yahoo! Japanが用意しているWeb APIがあります。ここにサンプルプログラムを突っ込んでみましたので,試してみて下さい。辞書のメンテナンスがどの程度行われているのかは良く分かりませんので,調べてみる価値はあるかと思います。

 適宜,良さげなものを使ってみて下さい。

卒研メモ: UTF-8Nで保存!

 古いエディタ(TeraPadなど)を使っていると,文字コードをUTF-8にして保存したPHPスクリプトやHTML, CSS, JavaScriptでトラブルが起きるケースに頻繁に出会います。つい先日アップしたFullCalendarのPHPスクリプトでもこの現象に出会いました。

 こちらのblog記事「文字コードはUTF-8? UTF-8N?」に,トラブルの原因となるBOMについての詳細が解説されていますので参照して下さい。

 ということで,TeraPadを使ってWeb開発を行う際には必ず「UTF-8N」で保存して下さい。

 ・・・つーか,開発したいならTeraPadではなく,「UTF-8N」などというセーブ方法のない秀丸AtomVisual Studio Code, Sublime Text, Eclipse等のプログラム開発に向いたエディタの最新版を使って下さい。これらのエディタには元々「UTF-8N」などという選択肢もないので,安心して「UTF-8」で保存できます。

卒研メモ: FullCalendar利用方法

 卒研でjQueryファミリーのJavaScriptライブラリであるFullCalendarを利用するテーマがありましたので,勉強がてら触ってみました。かなり粗削りですし,一応動いてスケジュールの追加・削除・保存もできるという最小限の機能しかありませんが,日本語のまとまった情報が見つかりませんでしたので,ここでまとめて公開しておきます。例によって無保証ですので,以下の記述は自己責任でお使い下さい。

 準備として,FullCalendar ver. 3.4.0をダウンロードして解凍し,カレントディレクトリ(./)を起点として,必要なJavaScriptファイル(moment.min.js, jquery.min.js, fullcalendar.js, locale-all.js)を./jsディレクトリに,CSSファイル(fullcalendar.css)を./cssディレクトリに,PHPスクリプト(utils.php)を./phpディレクトリにコピーしておいて下さい。

 次に,データベース”schedule”にテーブル”contents”を作り,5つのフィールド”id”, “start”, “end”, “title”, “memo”を保存できるようにします。

 カレントディレクトリに”index.php”を作り(まだPHPスクリプトは組み込まれていませんが,今後これにログイン機能などを作り込んでいきます),ここにFullCalendarを表示して操作できるようにします。完成版のindex.phpは下記の通りです。デフォルトは月表示(‘month’)です。

 完成版の画面(Chrome使用時)は下記のようになります。デバッグ用に右側にConsoleが開いてあります。JavaScriptの変数の中身を見たい時には重宝します。

 画面上部右の「月」「週」「日」ボタンで表示(view)が切り替わります。例として週間表示と一日表示の例を挙げておきます。

  • 週間表示
  • 一日表示

 基本的な使用方法は下記のようになります。

  • 新規イベントの追加(日付をクリック)・既存イベントの更新(イベントをクリック)時には,下記のように画面下部に編集ウィンドウが開きますので,ここで追加・編集を行って下さい。
  • イベントの消去は画面下部左の「ゴミ箱」までイベントをドラッグし,ドロップして下さい。確認画面が出て,「OK」ボタンを押すと即座に消去されます(ホントに消しちゃう不親切仕様)。
  • イベントを全て保存したい時には画面下部の「データ登録!」ボタンをクリックして下さい。これで編集後のイベントが保存されます。但し,保存されるのは画面に表示されている範囲のイベントのみです。未保存かどうかのチェックはまだ行っていません(これも不親切仕様)。

 MySQLデータベースとのやり取りはPHPスクリプトを介して行います。直接呼び出して使用しているのは下記の3つです。

  • read.php ・・・データベースから保存されているイベントを読み込む。
  • update.php・・・編集・新規追加したイベントを全部データベースに保存。
  • delete.php・・・ゴミ箱に捨てられたイベントをデータベースから消去。

 この3つのPHPスクリプトは,FullCalendarが用意しているutils.php(Eventクラス,isWithinDayRange関数等)を読み込み,データベース接続を行うため,下記に示すdatabase.phpを必ず冒頭で呼び出しています。

 これら4つのPHPスクリプトも,./phpディレクトリに格納しておいて下さい。

 以上,FullCalendarが用意している機能に加えて,新規に作成したdatabase.php, read.php, update.php, delete.php, index.phpを組み合わせて使いやすい(かな?)スケジュール帳機能が実現できました。

 今後は,これを順次作っていく教育用コンテンツに仕上げていく予定です。