2018年1月28日日曜日

2018/01/27(土) 雑事

夕方からオフィスに。

●計算機環境の整備
★研究室内仮想サーバの保守
・仮想サーバ aurora, dawn, dusk, lightning, thunderhead で yum update および reboot -n を実行した

★学科の仮想サーバ upblow の保守
・yum update および reboot -n を実行した

●卒業研究の指導
・研究室内Wikiにある卒研用サーバ dawn, dusk の使い方のページに、手っ取り早く読める大まかな使用手順を追記した

●CakePHPの学習
続き。app/View/OrderRecords/add.tcp で flag_finished をチェックボックスにした
//echo $this->Form->input('order_date');
echo $this->Form->input('order_date',
                        array('dateFormat' => 'YMD',
                              'timeFormat' => '24',
                              'monthNames' => FALSE,
                              'label' => '注文日時')); //yfurui
//echo $this->Form->input('flag_finished');
echo $this->Form->input('flag_finished',
                        array('type' => 'checkbox',
                              'label' => '完了フラグ')); //yfurui
・動作を確認した
・edit.tcp でも同じ要領で変更できることを確認した
・ついでに覚えた。知らんかった
  - PHP には compact と extract という関数がある
  - HTML には fieldset と legend という要素がある

2018年1月27日土曜日

2018/01/26(金) 卒研ゼミ(臨時)

●卒研ゼミ
・10:40から臨時に開催した
昨日の卒研発表会の結果をフィードバックした
・卒業研究終了チェックリストを配布し、終了処理について説明した
・卒業生情報の収集について協力を求めた

●企業来訪対応
・A社およびC社から来訪があり対応した

●卒業研究の指導
・仮想サーバ dawn にShくんとSmくんのアカウントを設定した
・Shくんの卒業論文の改訂版を画面上で点検し、再修正を指示した
・Tsさんの卒業論文の添削を行い、本人に返却した

●卒業研究発表会の処理
・修正版のプログラムをOneDrive経由でTa先生に提出した

●卒業生情報の収集
昨日用意した依頼文書にAs先生から修正が入った。反映させた
・卒業見込者データを作成し、As先生にシステムへのインポートを依頼した
・依頼メール文面を修正し、As先生に連絡した

●進路指導Webサイトの再開発
・軽微な修正を加えた。文言の「学部教員」を「学科教員」に変更した

●Javaプログラミング教科書
・出版社から回答があったので確認した
・その中にあった質問項目に回答した

●進路指導Webサイトの更新
・前述のA社からメールで、1 day インターンシップについての資料を受け取ったのでサイトに掲載した

●就職活動の指導
・B3に Slack を通じて上記の1 dayインターンシップについて連絡

2018/01/25(木) 卒業研究発表会

●卒業研究発表会
・朝から16時少しまえくらいまで実施した
・そのあとグループ内会議を行い、あとの会議での報告事項を確認した

●卒業研究合否判定会議
・17:30からの会議に出席した
・グループ幹事として報告した

●卒業研究の指導
・臨時の卒研ゼミを明日実施することについて Slack を通じて連絡した
・卒業研究終了チェックリストのハードコピー3枚を準備した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料1点を掲載した

●ミニオープンキャンパスの準備
1/22(月)に決めた2月のミニオープンキャンパスの日程を広報課にメールで連絡した

●卒業生情報の収集
・依頼文書(Wordファイル)および依頼メール文面を用意した
・確認のためAs先生にメール添付で送付した

2018/01/24(水) 卒業研究発表会リハーサル

午後から。


●卒業研究の指導
・ShくんにER図の書き方について指導した

●JABEE WG 業務
1/22(月)の私からの意見にN先生からコメントが付いた。検討したうえでさらにコメントを付けた

●進路指導Webサイトの更新
・As先生からメールで計3点の資料を受け取った。これらをWebサイトに掲載した

●入試広報委員 業務&学科Webサイトの更新
1/15(月)のPB演習の成果発表会に関する記事案を作った
・K'sLife および ML を通じて関係の学生とスタッフに連絡した
・1/29(月)に掲載する予定

●卒業研究発表会の準備
・Sa先生からメールで、学生1名の発表予定変更について連絡があった。また直接お話しした
・話して決めたことをメールで関係の先生方に流した

●卒業研究発表会リハーサル
・15:00から本番と同じ1Fの教室でリハーサルを行った

●CakePHPの学習
続き。WebブラウザからCustomerのレコードを追加したり編集・削除したりしてみた
・OrderRecordの追加ページの日付・時刻記入欄の形式を変えた
  - 書籍によると CakePHP 1.x ではviewのオプションを書き換えればいいらしい
  - CakePHP 2.10 のViewにはもともとオプションが書かれていなかったので、コードを解読した
  - inputというメソッドの第2引数として array('dateFormat'=>'YMD') を与えれば良かった
・そのあとのtextareaをcheckboxに変えるところをやろうとして時間切れ

●その他
・以前受けた取材の成果をまとめた冊子ができたそうで、その冊子を受け取った。12/04(月)にインタビューを受け、12/05(火)にda2授業風景を撮影された。インタビュー時の写真をあらためて見るとやっぱりひどかった

2018/01/23(火) 卒業研究の指導

●卒業研究の指導
・Tsさんに講義記録システムを閲覧するための設定について指導した
  - Internet Explorer で互換表示設定にドメインを登録する必要がある
・ShくんにWebサーバ側のPHPスクリプトでクライアントPCのIPアドレスを取得する方法を指導した
  - Webプロキシサーバ経由では REMOTE_ADDR はPCのIPアドレスではない
  - HTTP_X_FORWARDED_FOR を使用すること
・Tsさんの卒業論文の添削にようやく着手した
・Shくんの発表練習を聴いて指導した

●定期試験監督
・午後イチに行われた他学部の定期試験に補助の監督として入った
・夕方にda2の定期試験を監督した

●卒業研究発表会の準備
・H27年度版の進行要領を改訂してH29年度版を作り、同グループの先生方にメール添付で送付した

●電子錠登録・登録抹消
・教務課から学生証再発行1件の連絡を受けたので再登録用のデータを作成した

●CakePHPの学習
続き。 View を作り、Webブラウザでアクセスできることを確認した

●その他
・Ist先生からメールで、前回の入学前スクーリングの資料が欲しいという連絡があった
・zipにして渡した

2018/01/22(月) 定期試験監督、雑事

●定期試験監督
・午前中に行われた教職課程の定期試験1件に補助の試験監督として入った
・試験後の教室でSa先生と少し話した。当学科の学生のこともよくご存知であった
・今後ともよろしくお願いしますと挨拶して撤収したが、なんとなく気になって大学Webサイトの文系新学部の教員一覧を検索したらSa先生は載っていなかった。他大学に行かれるのであろうか

●ミニオープンキャンパスの準備
・2月の日程について、Ma先生および学部事務室に連絡して立案した
・なんとなく少し寝かせてから入試部に連絡する

●進路指導Webサイトの更新
・As先生からメールで受け取った資料1点をWebサイトに掲載した

●書籍購入
K先生から提案のあった次年度pk1のJava教科書を、1/09(火)に学内書店に注文しておいた。この書籍が届いた
・この書籍の伝票を学部事務室に提出した

●学科Webサイトの管理
ログイン機能を改修し、複数ユーザIDが使えるようにした

●JABEE WG 業務
・Is先生からMLを通じてJABEE審査資料の表紙案が流れてきたので、検討して返信した

●システム運用室 業務
・S社からMLを通じて貸与ノートPCに関する告知資料を受け取った
・学科Webサイトに掲載する改訂案を作り、これの確認をS社に依頼した

●CakePHP の学習
続き
★DB等の設定 (cake bake)
・cake bake を実行
  - シェルから ./lib/Cake/Console/cake bake を実行
  - DBの設定を入力して app/Config/database.php が上書きされたことを確認した
  - テーブル customers, order_records に対応する Model, Controller を作った

●その他
・ミニオープンキャンパスの記録および基礎演習2(2年次向け)の成績報告書ハードコピーを学部事務室に提出
1/20(土)に撮影した身分証写真が届いたので学部事務室に提出した
・PB演習の写真から記事に使えそうなものを抽出

2018年1月22日月曜日

2018/01/21(日) CakePHPの勉強

午後から。


●CakePHP の学習
★環境準備
たまたま手元にある書籍で扱っているのは CakePHP 1.x だが最新は 3.x である
・研究室内のサーバ dusk (CentOS 7)のPHP 5.4に合わせて Cake 2.x を選択
CakePHP 2.10 をダウンロードして自分のホームディレクトリ下に導入
  - 書籍を参照して .htaccess を記述
  - chmod -R a+w app/tmp

★DB等の設定
・MariaDB にデータベースとテーブルを作成
  - DB名は研究室内の運用ルール(後述)に沿って k99jk987.cake.db にした
  - テーブルは書籍に従い customers と order_records
  - 書籍のCREATE TABLE文を実行。ただし TYPE=MyISAM を Engine=Aria に変更
・CakePHP を調整
  - app/Config/database.php を編集
  - app/Config/core.php の salt と seeds を適当に変更
cake bake を実行
  - シェルから ./lib/Cake/Console/cake bake を実行
  - 文句を言われるので app/webroot/index.php と test.php に define('CAKE_CORE_INCLUDE_PATH', '/なんとかかんとか'); を入れた

★エラーへの対処
・DB名について検討
  - Mysql.php でエラーが出る。DB名にドット(.)が入っているのがまずいらしい
  - 思えば baserCMS のときにもそこで引っかかった
  - クラス DboSource の関数 name を使って k99jk987.cake.db を `k99jk987`.`cake`.`db` にしてからDBにアクセスしようとするのが問題
  - CakePHP を修正するよりDB名を k99jk987_cake_db に変えるほうが楽
・cake bake を再実行
  - Model を作ったりできることを確認した

●計算機環境の整備
★仮想サーバ dusk における MariaDB 運用ルールについて検討
当研究室内の仮想サーバで MariaDB を使うときにはDB名を `ユーザID.キーワード.db` という形式にするよう運用ルールを定めている。サーバにユーザアカウントを作るときには次のようなGRANT文を実行する(ユーザIDがk99jk987のときの例)。途中のパーセント記号(%)は複数文字にマッチするワイルドカードと見なされる。
grant all on `k99jk987.%.db`.* to `k99jk987`@localhost identified by 'パスワード';
しかし、通常このような名前の中では区切り記号としてドットよりもアンダスコア(_)を使うことが多い。当研究室の運用ルールでそうしなかったのは、GRANT文を
grant all on `k99jk987_%_db`.* to `k99jk987`@localhost
のように実行するとDB名の中のアンダスコアが1文字にマッチするワイルドカードとみなされるので、これを避けるためであった。

これはGRANT文を次のように円記号(¥)ないしバックスラッシュ(\)でエスケープするよう変更すると回避することができる。
grant all on `k99jk987\_%\_db`.* to `k99jk987`@localhost
うっかりエスケープするのを忘れそうであるが、それさえ防ぐことができるなら問題無い。(あるいは、そもそもアンダスコアがワイルドカードとみなされても大した問題ではないと割り切ることもできる。)結局、GRANT文を実行するのは当研究室内で自分だけであり、自分以外の誰かがミスすることを心配する必要は無いのでアンダスコアを許容するように運用ルールを変更することにする。

結論として運用ルールを変更する。今後はDB名の中の区切り記号としてドットとアンダスコアの両方を許容し、GRANT文としては次の二つを実行する。
grant all on `ユーザID.%.db`.* to `ユーザID`@localhost identified by 'パスワード';
grant all on `ユーザID\_%\_db`.* to `ユーザID`@localhost;

●基礎演習2(2年次向け) 授業処理
・PDFファイルのハードコピーに押印し、明日提出できるようにした

●その他
・PB演習の写真から記事に使えそうなものを抽出

2018/01/20(土) ミニオープンキャンパス

●ミニオープンキャンパス
・10時から90分間ほど実施した

●基礎演習2(2年次向け) 授業処理
・K'sLife を通じて成績報告を行った
・成績報告書のPDFファイルをダウンロードした

●その他
・身分証のための写真を撮影してもらった
・G先生から卒業時アンケート案がMLを通じて流れてきたので、検討して返信した
1/06(土)の日報として関数qlに関する記述を整理した
  - 検討自体は当日に行ったが、文書としての整理がついていなかった
・PB演習の写真から記事に使えそうなものを抽出した

2018年1月20日土曜日

2018/01/19(金) システム運用室会議、卒業研究の指導

●システム運用室会議
・9時からの会議に出席
・引き続き行われた貸与PC制度に関する会議に途中まで同席

●卒業研究の指導
・TsさんとSmくんの発表練習を聴いてコメントした

●進路指導Webサイトの更新
・As先生からメールで受け取った資料1点をWebサイトに掲載した

●学科Webサイトの更新
・トップページに「告知」を表示する機能を追加開発した
・トップページ上部のアニメーション部分を更新した
・Wiki に追記した

●PB演習 授業処理
・In先生からメールで評価依頼があったので当研究室所属の学生1名の評価を検討した
・In先生に評価案を回答した。変更は一任する旨を書き添えた

●旧備品プリンタの除却
・学部事務室が申請書の不明情報の穴埋めをやってくれた。大変ありがたい
・1か所だけ残ったところはS先生に確認して判明したので事務室に伝えた

●その他
・3月下旬に行われるFISA合同企業説明会の受付を引き受けた


夕方で退勤した。

2018/01/18(木) 卒業研究の指導

●卒業研究発表会の準備
・卒業研究発表会のプログラム案に軽微な修正を加えた
・学科主任のTa先生にメール添付で提出した
・Ta先生からOKが出たのでプログラムのハードコピーを学科の先生方に配布した

●旧備品プリンタの除却
・3Fプロジェクト室に集められた旧プリンタを再確認した
・JABEE審査の際に非常勤講師室に置いたプリンタ1台がそのままあることを確認した
・Excel で書類を書いて学部事務室に提出した

●卒業研究の指導
・Tsさんの卒業研究概要第2稿を受け取り、添削した
・決定稿を受け取った
・全員の卒研概要のコピーを所定の部数だけ作り、学部事務室に提出した
・研究室内Wikiに卒研発表リハーサルの日程と要領を掲載した
・ML および Slack を通じて連絡した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料1点をWebサイトに掲載した

●研究科の修士論文発表会
・全3件の発表を聴いた
・1件目のときにまたもや余計な質問をして発表者を無駄に困らせた。悪いことをした

●Javaプログラミング教科書
・1節だけ書いた

2018/01/17(水) 卒業研究の指導

午後から。


●卒業研究の指導
・昨日の問い合わせに対し教務課から返信があった。教室予約する旨を連絡した
・館内施設等使用連絡書を作り学部事務室経由で連絡した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料2点をWebサイトに掲載した
・CSCからメールで流れてきた資料をWebサイトに掲載した

●Javaプログラミング教科書
・本文を書き始めた
・何年もやってきた授業を文章化するだけなのでもっと簡単に書けるだろうと甘く見ていたが意外に手こずる

●その他
・空調の修理が入った

2018/01/16(火) 卒業研究発表会の準備

午後から。


●Javaプログラミング教科書
・出版社からメールで目次案についての問い合わせが来たので回答を返信した
・さらに問い合わせが来たのでさらに返信した

●電子錠登録・登録抹消
・教務課から学生証再発行1件についての連絡があったので処理した

●卒研ゼミ
・Shくん、Smくんの卒業研究概要の第2稿を受け取った
・点検して改訂を指導し、決定稿を提出させた

●卒業研究の指導
・卒研発表会リハーサルのため教務課にメールで教室の空室状況を問い合わせた

●卒業研究発表会の準備
・同じグループの他の先生方から発表予定のデータが出揃ったのでプログラム案を作った
・プログラム案のExcel版とPDF版をメールで他の先生方に送り確認を依頼した

●演習2 学生対応
・Haくんの開発したシステムの完成を確認し、レポートの執筆と提出を指導した

●計算機環境の整備
★ノートPC hail の保守
・自室の会議机に置いている hail で Windows Update を実行した

★学科の仮想サーバ upblow の保守
・yum update と reboot -n を実行した

●その他
・空調の不調について施設課からメールで連絡が来たので卒研生にも周知した
・S先生からMLを通じて「指定図書」と「参考文献」の違いに関する問い合わせがあった。判ったので回答を送った
・Hi先生からのメール返信に返信した

2018/01/15(月) PB演習 授業実施(成果発表会)

●PB演習 授業準備
・授業と産学懇談会のどちらに私が出席するかについて情報が錯綜していた
・自分では産学懇談会のほうのつもりでいたが、授業のほうに出ることになった

●演習2 授業処理
・受講者からの管制システムおよびレポートの提出状況を点検した
・一部のレポートの不備について Slack で修正を指示した

●PB演習 授業実施
・4限目に成果発表会があったので出席した
・5限目に終了ミーティングがあったので出席して学生の振り返りに立ち会った
・入試広報のために写真を撮りまくった

●PB演習 授業処理
・振り返りのときに撮ったホワイトボードの写真を Google ドライブの所定のフォルダに置いた

●PB演習 懇親会
・夜は懇親会に出席した。アルコールは飲まないが結構喰った

●その他
・ゼミナール室にごみ袋を補充した
・空調システムにエラーが出たので、防災センターや施設課とのやり取りが発生した
・Hi先生からメールでその後の様子について連絡があったので返信した
・To-Do項目を整理した

2018/01/14(日) オフ

オフ。

2018/01/13(土) オフ

オフ。

2018/01/12(金) 卒業研究の指導、授業処理

●入試広報委員 業務&学科Webサイトの更新
・卒業論文提出に関する記事を作り、学科Webサイト、TwitterとFacebookに掲載した
・学科Webサイトのトップページ上部のアニメーションで表示される文言に若干の修正を加えた
・学科Webサイトのトップページ上部から今だに9月のETロボコン受賞の記事にリンクしているので、続報の有無を関係の先生にメールで問い合わせた

●卒業研究の指導
・自研究室の卒研生3名が無事卒業論文を提出したことを確認した
・この3名から卒業研究概要の第1稿を受け取った
・いずれも紙上で添削してどうにかなるレベルではなかったので、もとのWordファイルに添削コメントを書き込んで、そのハードコピーを渡した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料2点をWebサイトに掲載した
・資料番号の調整のため、バッチ処理に若干の修正を要した
・バッチ処理の一部をCで書いていたので、CコンパイラとしてEmbacarderoのWebサイトからBCC32をダウンロードし導入して使用した

●Javaプログラミング教科書
目次案についてK先生からOKとの返信があった
・テキストエディタで企画書を書き、その他の資料を添えて、出版社にメールで送った

●da2 期末テスト処理
答案を学籍番号順に整列した。答案の採点はまだ手つかず
・K'sLife の出席登録データを修正した

●基礎演習2(2年次向け) 授業処理
・Ist先生からメールで救済措置の結果の報告があった
・K'sLife に出席登録データを登録した
・全15回のデータを確認してほしい旨を他の先生方にメールで連絡した

●その他 授業処理
・K'sLife に gw, 演習2, 基礎演習(1年次向け), 卒業研究の出席登録データを入力した

2018/01/11(木) 基礎演習2(2年次向け) 授業実施、卒研ゼミ

●基礎演習2(2年次向け) 授業実施
・2限目に第15回を実施した
・Ya先生の全クラス合同のまとめのあと、各教室に分かれた
・授業アンケートと、担任する学生との懇談を行った

●卒業研究の指導
・Tsさんに卒業論文の執筆について指導した

●シラバスの準備
・教務課に依頼したltのシラバスのコピーがうまく行っていなかったので再度依頼した
・Yo先生から新da1, pe3のシラバスがコピーされたので確認して確定した
・旧da2のシラバスはコピーされていなかったので手作業でコピーして確定した
・基礎演習(1年次向け)のシラバスが元に戻っていたので再入力して確定した

●卒研ゼミ(卒業論文〆切稿の受け取り)
・Shくん、Tsさん、Smくんの原稿を受け取り、それぞれ点検した
・日程および卒業論文提出要領をあらためて説明した
・卒業研究概要執筆要領を簡単に説明した
・Shくん、Tsさんの表紙に押印した
・Smくんに卒業論文の執筆について指導した
・夕方にSmくんの表紙に押印した

●学科の会議、研究科の会議
・14:40からの会議2件に出席した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料2点をWebサイトに掲載した
・学内・学外イベントの日程をWebサイトに追加した
・障がい者向けの就労支援をやっている団体のWebサイトをリンク集に追加した
・企業1社からメールで受け取った資料1点をWebサイトに掲載した

2018/01/10(水) 演習2, 基礎演習(1年次向け) 授業実施

●電子錠登録・登録抹消
・再発行処理3(年末ぶん+昨日ぶん+本日分)

●基礎演習2(2年次向け) 授業準備
・Ya先生からの依頼により、明日の集合場所について学生に K'sLife を通じて連絡した

●演習2 授業実施
・演習およびレポート提出を指導した
・授業アンケートを実施した
・3月の合同説明会について告知した
・授業後に、研究室内サーバの使用方法について研究室内Wikiに少し補足した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料2点をWebサイトに掲載した

●計算機環境の整備
★4F演習室PCの保守
・デスクトップ3台で Windows Update などを実行した
・ノートPC nightfog でも Windows Update などを実行した

●基礎演習(1年次向け) 授業実施
・演習およびレポート提出を指導した
・授業アンケートを実施した
・JABEEプログラム登録の回答用紙を回収し、Ya先生に渡した

●シラバスの準備
・残りのシラバスも確定し、教務課にコピーを依頼した

●演習2 学生対応
・Ku, Eg, Ha, Hi の各学生に指導した

2018/01/09(火) da2 授業実施(期末テスト)

●学生への修学指導
昨日連絡した学生に、Hi先生の授業のレポートについて指導した

●gw 授業実施なし
・2限目は念のため教室を覗いた。誰もいなかった

●入試広報委員 業務&学科Webサイトの更新
・冬季休業明けの授業開始日。いくつか写真を撮って Twitter と Facebook に投稿した
・Webサイトから新着情報として Twitter にリンクした

●新年祝賀式

●卒研ゼミ(卒業論文第3稿の受け取り)
・Shくん、Tsさん、Smくんから原稿を受け取り、それぞれ点検した

●da2 授業実施
・4限目・5限目に第15回を実施した
・4限目にはいつもと異なり小テストや講義を行わず、5限目に行う期末テストおよび2週間後の定期試験について説明して授業アンケートを実施しただけで、そのあとは質問タイムにした
・5限目に期末テストを実施した

●卒業研究の指導
・Shくん、Smくんの質問に対応した

●演習2 学生対応
・4名がゼミナール室に来てプログラミング演習に取り組んだ
・いくつかの質問に対応した

●計算機環境の整備
★ゼミナール室の録画用ノートPC rain (ThinkPad X60) の保守
・卒研ゼミの際に録画に使おうとして電源を入れたまま放置しておいたらハングアップしていた
・これを復旧した。ついでに電源関係の設定を変更した

●シラバスの準備
・pe2, pk2 のシラバス最終案を準備した
・da3 のシラバスを確定した

●基礎演習2(2年次向け) 授業処理
・救済措置の現状を整理し、クラスの他の先生方にメールで連絡した
・Ya先生からの依頼により、前期の基礎演習1の不合格者および後期の基礎演習2の不合格見込者の一覧をメールで送付した

●その他
・学内書店にて書籍を注文した

2018/01/08(月) 計算機環境の整備

●卒業研究の指導
・卒研生3名のそれぞれに卒業論文の執筆について指導した

●計算機環境の整備
★ゼミナール室内の録画用ノートPC rain (ThinkPad X60) の保守
・昨日のアップデートの続きを行った

★研究室内仮想サーバの保守
・aurora, dawn, dusk, lightning, nimbus, thunderhead で yum update と reboot -n を実行した

●学科Webサイトの保守
・もう一度 yum update を試したが実行できない
・CNC にメールで質問を投げた

●学生への修学指導
・非常勤のHi先生からメールで、1年次生のレポート課題実施状況について連絡をうけた
・自分なりに検討したうえで返信した
・学生本人と電話で連絡をとった。明日10:10から面談することになった

●Javaプログラミング教科書
・目次案を更新した

2018/01/07(日) Javaプログラミング教科書

午後から。


●計算機環境の整備
★研究室内のPCの保守
・デスクトップPC crescent, ノートPC hail, 2-in-1 PC tornade で Windows Update を実行した

★ゼミナール室内のPCの保守
・ノートPC mist, rain およびデスクトップPC fullmoon で Windows Update 等を実行した
・rain のアップデートは退勤までに完了しなかった

●Javaプログラミング教科書
・目次案を更新した
・K先生と自室で、この目次案やpk1で新しく採用する教科書などについて話した

2018/01/06(土) LIKE節のなかで使う文字列をエスケープするための関数に関する検討

●基礎演習(1年次向け) 学生対応
・事前に連絡のあった受講者2名が4F演習室に入室するのを許可した
・事前連絡では11時頃という話であったが、実際に来たのは11時半を廻ってから
  - 結構待たされた
  - 遅れる場合は連絡するようにと言っておいたにもかかわらずその連絡なし
・PowerDirector で動画を挿入する手順を質問されたので指導した

●C3PO メール処理
・K先生からメールで事業中間報告と今後の実施計画書の案を受け取った
・目を通し、修正案を作って返送した
・一度書いた案を保存し損ねたらしく消えてしまって、書き直すのが面倒であった

●卒業研究の指導
・研究室内Wikiに記載していた1月の日程に追加・修正を行った
・MLを通じて卒研生に連絡した
・Smくんからの卒業論文執筆に関する質問に回答した

●卒業研究発表会の準備
・今年度のグループ幹事に当たっていた
・少し早いがプログラム作成の準備を始めた。同じグループの他の先生方にメールで連絡した

●PHPの自作関数 ql() の検証
・結局 $mysqli->real_escape_string(addcslashes($str, "%_\\")); にした
・詳細は後述

●シラバス案
・新da1, pe3 についてYo先生からメールで案を受け取ったので確認して返信した
・気付いたことがあり、pk2, pe2 のシラバス案を修正してメールで送付しなおした



◎LIKE節のなかで使う文字列をエスケープするための関数
(概要)
PHP + MySQLプログラミングにおいて、LIKE節を使ってテーブル中の文字列を検索する場合について考える。
SELECT * FROM liketest_t WHERE lttext LIKE '%$str%'
この $str の部分に次のような文字が含まれるとき、これらの文字はエスケープしなくてはならない。
  • 円記号(yen sign, ¥)すなわちASCIIにおけるバックスラッシュ (reverse solidus, \)
  • シングルクォート
  • パーセント記号(%)
  • アンダスコア(_)
下の二つは mysqli::real_escape_string() ではエスケープされない。そこで、このエスケープ処理のためのPHP関数 ql() を作る。
/**
  * SQL用エスケープ。LIKEの後ではこれを使う。
  */
function ql($s) {
  $mysqli = beginMySQLi();
  return $mysqli->real_escape_string(addcslashes($s, '%_\\');
}
この関数は次のようにして使用する。
$sql = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql($str) . "%'";

(動作確認の方法)
まず、エスケープ処理を行う関数 ql() 候補として5種類を作成した。これらを ql_A()~ql_E() とする。これに mysqli::real_escape_string() のみを実行する関数 q() を加え、6種類を使用した。次にLIKE節を用いて検索を実行し、文字列の検索がうまくいくかどうかを調べた。各関数が行うエスケープ処理を次に示す。
関数エスケープ処理
q$mysqli->real_escape_string($s)
ql_Aaddcslashes($mysqli->real_escape_string($s), '%_')
ql_Baddcslashes($mysqli->real_escape_string(addcslashes($s, '\\')), '%_')
ql_Caddcslashes($mysqli->real_escape_string($s), '%_\\')
ql_D$mysqli->real_escape_string(addcslashes($s, '%_'))
ql_E$mysqli->real_escape_string(addcslashes($s, '%_\\'))

(動作確認用の実行環境)
動作確認のために使用したソフトウェアのバージョンは次の通りである。
  • Apache HTTP Server 2.4.6
  • PHP 5.4.16
  • MariaDB 5.5.56

(動作確認用のデータベース)
MariaDB データベース内に次のようなテーブル liketest_t を作成した。
ltid (INT)lttext (TEXT)
1100%
2i'mlucky
3\500
4hoge\\hoge
5%100
6foo\%bar

(動作確認用の検索文字列)
テーブル liketest_t を次の文字列で検索する。検索結果として正解となる行のltidを併せて示す。
検索文字列(空白)%\'\%\\
正解の検索結果1~61, 5, 63, 4, 6264

(動作確認用のコード)
動作確認に使用したPHPのコードを次に示す。
/**
  * MySQLデータベースへの接続を実行する。接続済みならその接続を利用する。
  */
function beginMySQLi() {
  global $mysqli;
  if (!isset($mysqli)) {
    $mysqli = new mysqli(/*** 詳細略 ***/);
  }
  return $mysqli;
}
 
/**
  * SQL用エスケープ。LIKEの後ではql()を使うこと。
  */
function q($s) {
  $mysqli = beginMySQLi();
  return $mysqli->real_escape_string($s);
}
 
/**
  * SQL用エスケープ(ワイルドカードを含めて)。LIKEの後ではこれを使う。
  */
function ql_A($s) {
  $mysqli = beginMySQLi();
  return addcslashes($mysqli->real_escape_string($s), '%_');
}
function ql_B($s) {
  $mysqli = beginMySQLi();
  return addcslashes($mysqli->real_escape_string(addcslashes($s, '\\')), '%_');
}
function ql_C($s) {
  $mysqli = beginMySQLi();
  return addcslashes($mysqli->real_escape_string($s), '%_\\');
}
function ql_D($s) {
  $mysqli = beginMySQLi();
  return $mysqli->real_escape_string(addcslashes($s, '%_'));
}
function ql_E($s) {
  $mysqli = beginMySQLi();
  return $mysqli->real_escape_string(addcslashes($s, '%_\\'));
}

$mysqli = beginMySQLi();

$sql1 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . q($str) . "%'";
$result1 = $mysqli->query($sql1);

$sql2 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql_A($str) . "%'";
$result2 = $mysqli->query($sql2);

$sql3 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql_B($str) . "%'";
$result3 = $mysqli->query($sql3);

$sql4 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql_C($str) . "%'";
$result4 = $mysqli->query($sql4);

$sql5 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql_D($str) . "%'";
$result5 = $mysqli->query($sql5);

$sql6 = "SELECT * FROM liketest_t WHERE lttext LIKE '%" . ql_E($str) . "%'";
$result6 = $mysqli->query($sql6);

//表示処理は割愛
なお、ここに示した関数のうち q() は本来はLIKE節には使用しない。関数 q() の本来の使用例を次に示す。
//検索キー $str と ltid が一致する行を探す
$sqlX = "SELECT * FROM liketest_t WHERE ltid='" . q($str) . "'";
$resultX = $mysqli->query($sqlX);

//lttext が文字列 $str である行を挿入する
$sqlY = "INSERT INTO liketest_t (lttext) VALUES ('" . q($str) . "')";
$resultY = $mysqli->query($sqlY);

(動作確認の結果)
各関数を使用してエスケープした文字列をLIKE節に使用して検索を行った。エスケープした結果の文字列を次に示す。また、検索結果の行のIDを各セルのカッコ内に示し、この検索結果が正解ではない場合にはそのセルの背景色を灰色にして示す。
(空白)%\'\%\\
q(1~6)% (1~6)\\ (1)\' (2)\\% (1,5,6)\\\\ (3,4,6)
ql_A(1~6)\% (1,5,6)\\ (1)\' (2)\\\% (3,4,6)\\\\ (3,4,6)
ql_B(1~6)\% (1,5,6)\\\\ (3,4,6)\' (2)\\\\\% (6)\\\\\\\\ (4)
ql_C(1~6)\% (1,5,6)\\\\ (3,4,6)\\' (エラー)\\\\\% (6)\\\\\\\\ (4)
ql_D(1~6)\\% (1,5,6)\\ (1)\' (2)\\\\% (3,4,6)\\\\ (3,4,6)
ql_E(1~6)\\% (1,5,6)\\\\ (3,4,6)\' (2)\\\\\\% (6)\\\\\\\\ (4)

(検討)
検索対象の文字列が円記号ないしバックスラッシュ(\)のみであるとき、関数 q(), ql_A(), ql_D() の三つが正解にならないのは、これがSELECT文に結合されたときに後ろにくるパーセント記号(%)をエスケープする働きをしてしまい、右端に % がある行に合致するからである。
全ての検索結果が正解となるのは関数 ql_B() および ql_E() の二つである。両者の違いは検索対象の文字列に % が含まれるときの \ の数であり、 ql_E() のほうが \ が多い。この二つの関数を比較すると、関数自体が単純なのは ql_E() のほうである。

(結論)
関数 ql_E() を ql() として採用する。

2018/01/05(金) ほとんどオフ

●da2 試験準備
・Yo先生から受け取った問題案を解いてみた
・メールで回答した

2018年1月5日金曜日

2018/01/04(木) 昨日の続き

夕方からオフィスに。


●Javaプログラミング教科書
・K先生からメールで、2018年度のpk1に新しいJavaの教科書を採用したい旨の連絡あり
・この本の目次のみを Amazon で確認した
・後日検討すること、ついでにJavaプログラミング教科書の執筆について意見が欲しいことを返信した

●PHPの自作関数ql()の検証
昨日は関数 ql を修正して研究室内サーバ dusk, dawn (CentOS 7) で動作を確認した。今日はサーバ midnight (Windows Server) でも確認した。
  • Apache HTTP Server 2.2.14
  • PHP 5.3.1
  • MySQL 5.1.41
 
(参考)
Web検索で次のようなページを見つけた。このページの下のほうに同じ問題への解がある。「LIKE addcslashes」で検索すると上のほうに出てくるので、結構参照されているページなのではないかと思う。私自身では試していない。

・miau: LIKE のエスケープと addcslashes(), miau's blog?, (2009).
 
(追記)
2018/01/06(土)に再検討した。

●その他
・Windowsサーバ midnight およびファイルサーバ moonlight 内に溜まった2017年度分の消費電力データを圧縮するなど整理した
・midnight から2015/10/17(土)時点の MySQL データベースのバックアップを削除した
・midnight のCドライブの空き容量が9 GBから20 GBに増えた

2018年1月3日水曜日

2018/01/03(水) 進路指導Webサイトの再開発

午後からオフィスに。


●卒業研究の指導
・Tsさんの卒業論文の添削結果を本人の机の上に返した
・その旨をSlackで連絡した

●進路指導Webサイトの再開発、PHPサンプルコード集の更新
★PHPの自作関数ql()の修正
先月、進路指導Webサイト再開発版に、円記号(yen sign, ¥)すなわちASCIIにおけるバックスラッシュ (reverse solidus, \)で検索できない不具合があることが判明した。原因が自作の関数 ql にあることも判っていたが、緊急度が低いので放置していた。これを今回解決した。なお、ソフトウェアのバージョンは次の通りである。
  • Apache HTTP Server 2.4.6
  • PHP 5.4.16
  • MariaDB 5.5.56

(前提)
まず、修正前のソースコードを次に示す。肝心なところ以外は適当に省略する。最後の関数 ql は、LIKE節のなかで使う文字列をエスケープするために自作したもので、今回の問題の原因である。
/**
  * MySQLデータベースへの接続を実行する。接続済みならその接続を利用する。
  */
function beginMySQLi() {
  global $mysqli;
  if (!isset($mysqli)) {
    $mysqli = new mysqli(/*** 詳細略 ***/);
  }
  return $mysqli;
}
 
/**
  * SQL用エスケープ。LIKEの後ではql()を使うこと。
  */
function q($s) {
  $db = beginMySQLi();
  return $db->real_escape_string($s);
}
 
/**
  * SQL用エスケープ(ワイルドカードを含めて)。LIKEの後ではこれを使う。
  */
function ql($s) {
  $db = beginMySQLi();
  return addcslashes($db->real_escape_string($s), '%_'); //←これがNG
}

また、ここに示した関数の使用例を次に示す。
$db = beginMySQLi();

//検索キー $str と column が一致する行を探す
$sql1 = "SELECT * FROM table WHERE column='" . q($str) . "'";
$result1 = $db->query($sql1);

//検索キー $str が column に含まれる行を探す
$sql2 = "SELECT * FROM table WHERE column LIKE '%" . ql($str) . "%'";
$result2 = $db->query($sql2);

LIKE節ではアンダスコア(_)とパーセント記号(%)がワイルドカードとして扱われるので、検索キー $str の中にこれらの記号がある場合には円記号(\)でエスケープしなくてはならない。このエスケープ処理のために mysqli::real_escape_string() と addcslash() を組み合わせる関数 ql を宣言して使用する。

例えば、検索キー $str の値が \500なら100% という文字列であるとき、これを引数として関数 ql を呼び出すと、この関数は \\500なら100\% を返す。その結果、変数 $sql2 の値は SELECT * FROM table WHERE column LIKE '%\\500なら100\%%' になる。

このSQL文において、LIKE節の右辺にある文字列 %\\500なら100\%% の最初と最後の%はエスケープされていないからワイルドカードと見なされる。一方、2番目の%は\によってエスケープされているから通常の文字とみなされる(その際に\は外される)。したがって、このSQL文は \500なら100% という文字列が column の途中のどこかに含まれる行を探す。

(問題)
上に示したコードは検索キーの最後に円記号(\)があるときにはうまく動かない。
例えば、検索キー $str の値が \ という1文字のみの文字列であるとき、関数 ql は \\ を返すので、変数 $sql2 の値は SELECT * FROM table WHERE column LIKE '%\\%' になる。

このSQL文において、LIKE節右辺の最初のパーセント記号(%)はエスケープされていないからワイルドカードとして扱われる。一方、最後の%の前には\\があり、これは\という通常の文字とみなされる……のではなくエスケープ記号として解釈され、その後の%はワイルドカードではなく通常の文字とみなされるようである。このSQL文は % という文字列が column の途中ではなく右端に含まれる行を探す。

なぜこうなるのかは解らない。PHP の文字列リテラルには PHP と MariaDB のために二重のエスケープを要するのは解るが、この問題の場合には MariaDB のエスケープのみを考えればよいはずである……のに。

(検討)
関数 ql を次のように変更したが良くなかった。
/**
  * SQL用エスケープ(ワイルドカードを含めて)。LIKEの後ではこれを使う。
  */
function ql($s) {
  $db = beginMySQLi();
  return addcslashes($db->real_escape_string($s), '%_\\'); //←これもNG
}

この変更された関数 ql は円記号(\)を二重にエスケープ対象にする。例えば、検索キー $str の値が \ という1文字のみの文字列のとき、関数 ql は \\\\ を返すので、変数 $sql2 の値は SELECT * FROM table WHERE column LIKE '%\\\\%' になる。四つ続く\は最終的に1文字の\とみなされ、最初と最後のパーセント記号(%)はワイルドカードとして扱われる……ようである。これだけを見れば前述の問題は解決している。

しかし、検索キーにシングルクォート(')が含まれるときには正しくないSQL文が生成されることになる。例えば、検索キー $str の値が i'mlucky という文字列であるとき、関数 ql は \\' を返し、変数 $sql2 の値は SELECT * FROM table WHERE column LIKE '%i\\'mlucky%' になる。このとき2番目のシングルクォート(')の前には\\があり、これはエスケープ記号として解釈されないために、2番目のシングルクォート(')は閉じカッコとして扱われる。そのあとに mlucky%' という意味不明な部分がくっついたこのSQL文は、MariaDB に実行させようとしてもエラーになる。この現象は理解できる。

(解決方法)
関数 ql を次のように修正して解決した。
/**
  * SQL用エスケープ(ワイルドカードを含めて)。LIKEの後ではこれを使う。
  */
function ql($s) {
  $db = beginMySQLi();
  return addcslashes($db->real_escape_string(addcslashes($s, '\\')), '%_'); //←これはOK
}

テスト用PHPスクリプトにいろいろな検索キーを入力して MariaDB の動作を試し、その限りでは正しく検索できることを確認した。

自作の関数 ql はあちこちで使っている。さしあたり、研究室内サーバ dawn に置いているPHPサンプルコード集と進路指導Webサイト再開発版システムのものを更新した。日報ブログ相互点検システムも更新したが、このシステムではそもそも ql の呼び出しがなかった。他にも更新するべきシステムがあるかもしれないが、普段使っているものの中には思い当たらない。

(追記)
2018/01/06(土)に再検討した。

2017/12/29(金)-2018/01/02(火) 帰省

4泊5日で帰省した。


●卒業研究の指導
・Tsさんの卒業論文第1稿を12/29(金)の昼に受け取った
・帰省中に添削した

●基礎演習(1年次向け) 学生対応
・12/31(日)から1/02(火)にかけて、受講生1名からメールで、冬季休業期間中に4F演習室を使用したい旨の連絡があった
・数度のやりとりを経て、1/06(土) 11時頃に彼らの来室し、私が解錠などの対応を行うことになった

2017/12/28(木) シラバス案の作成

●シラバス案の作成
・pk2 ... 案を作って関連の先生方にメールで連絡した
・pe2 ... 案を作って関連の先生方にメールで連絡した

●卒業研究の指導
・Tsさんに卒論第1稿の受け取り期限を明確に申し渡した
・Tsからの卒論執筆に関する相談に回答した
・ゼミナール室のプリンタにプリンタ用紙を補充した

2017/12/27(水) PB演習 授業処理、シラバス案の作成

午後からオフィスに。


●PB演習 授業処理
・講評ネタとして上司からの情報を所定のGoogleスプレッドシートに記入した
・支払額案を見た。特にコメントすることもなさそうなのでそのままにした

●卒業研究の指導
・Tsさんの卒業論文の執筆状況を確認し、進め方について指導した

●シラバス案の作成
・lt … 案を作って関連の先生方にメールで連絡した
・da3 … 昨年と同じでよさそうなのでその旨をYo先生にメールで連絡した
・今後の作業項目を明確にするため、作るべきシラバスの一覧を作った。JABEEやなんかのために1年次・2年次のシラバスには結構手を入れなければならない。今年のシラバス案作成には手こずりそうである

2017/12/27(火) 無為

夕方くらいから大学に来たが、ぶっちゃけろくなことはしなかった。疲れていて、気力も無かった。

2017/12/25(月) PB演習 授業実施

●lt 授業準備(授業計画とシラバスの作成)
・8月の反省会やその後にメールしたコメントを確認
・授業計画のExcelファイルを更新
・Ya先生やIs先生からメールで流れていたシラバスの書き方を検討したところ、結構大変であることが判った

●JABEE WG 業務
・Ya先生からメールで次年度の基礎ゼミと基礎演習(1年次向け)のシラバス案が流れてきた
・これらを確認し、気づいた点について返信した

●進路指導Webサイトの更新
・As先生からメールで流れてきた資料をWebサイトに掲載した

●卒業研究の指導
・Shくん、Smくんの卒業論文執筆を見守った
・Tsさんと面談した

●就職活動の指導
・Tsさんと面談した
・As先生にメールで研究室所属の卒研生の状況を回答した

●PB演習 授業実施
・4限目・5限目に参加した
前回納品物を検収を担当して不合格を出した班を再び顧客役として担当し、今回は合格を出した
・三つの班のプレゼンテーションを聴いて他の先生方と一緒になって若者をいじめたコメントした
・写真を撮りまくった(後述)

●入試広報委員 業務&学科Webサイトの更新
・PB演習の時間に撮った写真をTwitter, Facebookに投稿した
・学科Webサイトにも新着情報を投稿してTwitterへのリンクを張った

2017/12/24(日) 入試広報委員 プレエントランスデーの施設紹介

●入試広報委員 業務(プレエントランスデー当日)
・CAD室で保護者向けの施設紹介を行った。3回。それぞれ10分間以内

●入試広報委員 業務
・入試広報に関するWikiサイトを更新した

2017/12/23(土) 卒業論文第2稿の添削

昼過ぎからオフィスに。


●入試広報委員 業務(プレエントランスデーの準備)
・Ma先生から明日のプレエントランスデーに同席できない旨の連絡あり
・問題ない旨を返信し、Wiki に資料を置いていることを書き添えた

●卒業研究の指導
・Smくんの卒論第2稿の添削を終えて本人の机の上に返した

2017/12/22(金) 雑務


●PB演習 授業準備
・サーバ upblow の管理・運営に関するWikiを少しだけ更新した
・さらにCSSをいじった

●卒業研究の指導
・Tsさんから学部長優秀賞の一部が不明という相談があった。旧学部の会誌を渡した
・Shくんに第2稿の添削結果を返した
・Smくんの第2稿は途中まで。未完了

●学科Webサイトの更新・管理
・学科Webサイトの管理に関するWikiを少しだけ更新した
・さらにCSSをいじった
・学科Webサイトの過去のトピックスに追記した
  - H26 (2014年度)のトピックスのページを追加
  - H26の学部パンフレット
  - H25, H26の学部長優秀賞など
  - H25の貸与ノートPC

●入試広報委員 業務
・入試広報に関するWikiサイトを更新した

●進路指導Webサイトの更新
・As先生からメールで受け取った資料1点をWebサイトに掲載した

●その他
・総合コースWebレポートサイトおよびサンプルコード集の日報ブログ相互点検システムのPHPスクリプトに以下の1行を追加した
<meta name="viewport" content="width=device-width,init-scale=1.0">