Hatena::ブログ(Diary)

わさっき RSSフィード

2018年07月18日

[] BYODでC

BYOD (Bring Your Own Device)のPCで,授業や自習でCプログラミングをする場合,ソースファイルの編集やコンパイル実行に関して,何を使用するのがよいか,現在,思案中です.担当授業の昨年度の状況と,BYODでCプログラミングの候補となるいくつかの手段,そしてそれぞれのメリット・デメリットについて,メモしておきます.

昨年度の授業

学部内で情報処理教育の担当をしておりまして,前期に2コマ(週1コマで2クラス),後期にも同様に2コマの授業を受け持つほか,もう1人の情報処理教育担当の先生と半々の割合で,各授業の教材作成をしています.

昨年度より入学者はBYODのPCを使用することとなり*1,前期の情報処理科目も,「自分のPCを適切に管理して活用する」という趣旨のもと,講義室で実施し,ノートPCを持参させました.

後期はこれまでどおり,演習室(いわゆる計算機室です)のデスクトップPCを使用しました.このPCは,Windows/Linuxのマルチブートができます.第1回の授業では,Windowsを起動して大学のアカウントでログオンし,前期に実施したタイピング練習を使ってもらい,その後は参考書*2に載っている経路問題を解きながら,アルゴリズムの概念について学んでもらいました.

第2回はLinuxを起動し,ls,cd,cat,cpといったファイルやディレクトリに関するコマンドを実行してもらいました.ファイル作成にはgeditを使用し,日本語入力もWindowsと同じキーで行えることを確認しました.このLinux使用は,以前は前期に1回分をとって実施していましたが,BYODLinuxを使うというのは容易ではなく,昨年度より後期授業に組み入れられました.

第3回から第7回まではCの学習となります.いずれの回もLinux使用です.第3回はプログラミングの必要性とC言語の特徴を簡単に説明してから,指示を与えて,プログラムの打ち込みと,コンパイルと実行をしてもらいました.

第4回は変数・データ型・演算子,第5回は制御文(if〜else,for),第6回は配列,第7回は関数を取り上げ,各回,複数個のプログラムを打ち込み,動作確認をしてもらいました*3.十分に知識のある学生向けに,任意提出の発展課題として高難度のもの(コーディング量が多いというよりは,ちょっとした知識やアイデアがあれば解ける問題)を提示しました.

ということで全15回の授業のうち,第2回から第7回までの6回分で,Linuxを使用しました.単にCでプログラムを作成するだけでなく,コマンドの実行(Command Line Interface (CLI)の活用)にも時間をとりました.例えば上矢印を押すと,直前に実行したコマンドが出せることは,机間巡視しながら,また全体に向けても,アドバイスしました.

第8回以降はWindows起動となります.第8回はExcelの復習で,第9回から第11回までは,VBAです.Visual Basic Editorというウィンドウの上で,プログラムを書いたり,ユーザーフォームのオブジェクトを配置したりして,Excelのワークシート上で動かしました.

年明けの第12回から第14回までは,「GUIプログラミング」です.具体的には,HTMLJavaScriptを組み込んだ形のファイル編集を行ってもらいました.実行はブラウザ上となります*4.開発ツール(F12キー)を使ったデバッグなどを指導することもあります.

第15回はまとめで,Windowsを用いた振り返りとなります.

「さまざまなやり方でプログラミングを経験させる」ことを,この科目の「ねらい」に据えるのであれば,上記の授業内容は,一つの解になっていると思っています.Cの授業では,単にプログラムを書くだけでなく,CLIによりコマンドを実行し,ときにはエラーメッセージを読んで,バグがどこにあるかを見つける活動を行います.VBAについて,Visual Basic Editorの使用は,統合開発環境の素地となります.実行は,メニューバーのあるアイコンを押すだけでして,エラーとなれば,編集中の該当箇所にマークがつきます.プロジェクト管理でないことや,編集中(実行前)の支援機能が乏しい点は,Visual StudioEclipseなど,有名な統合開発環境との違いと言えるかもしれません.HTMLJavaScriptによるコーディングそして実行は,CともVBAとも異なるプログラミング学習スタイルとなっています.

BYODでCの授業を行うとしたら

将来的に演習室のLinux環境が使えなくなり,BYODで授業を行うとなったとき,上記のうちLinuxおよびCの授業については,実施方法の見直し余儀なくされます.

現時点での候補として,「Windows上でLinux」「統合開発環境」「USBインストール」「Webサービス」が考えられます.順に,概要とソフトウェア例,そしてメリット・デメリットを簡単に書きます.

Windows上でLinux」について,Windows Subsystem for Linux (WSL)が候補となります.WSLはWindows 10でしか使用できませんが,大学が公開している要件としては特に問題となりません.他のソフトウェアにはVirtualBoxもあります.自分のPC上で,WindowsLinuxも動作しますし,2つのOS間でファイル共有の仕組みも備わっています*5.その一方で,1台のPCに入っている,2つのOSを管理(ソフトウェアアップデートなど)することが手間となります.LinuxインストールしただけではCのコンパイルができず,内部で別にソフトウェアパッケージを入れる*6必要もあります.

統合開発環境」はIDE (Integrated Development Environment)とも書かれます.ソースファイルの編集,コンパイルデバッガの利用など,従来だとばらばらだったものを,GUIによる一つの操作環境から使用できるようにしたものです.Windows環境では,Visual StudioEclipseにそれぞれ根強い人気があります.なおEclipseは基本的にはJavaプログラミングに用いられてきましたが,プラグイン導入によりCも可能です.効率よくプログラムを書いて実行するための機能が多数,提供されています.単一のプログラムであっても「プロジェクト」として管理する必要があること(それに伴う初期学習コストの高さ),および統合開発環境を採用する場合にはコマンドライン利用を学習できなくなることには,注意が必要です.

USBインストール」では,USBメモリにファイルを入れておいて,それをPCに差し込み使用します.具体的に何を入れるかですが,LinuxなどOS全体を格納し,起動時にPC内蔵のWindowsではなく,外付けUSBメモリ選択して使うというのは,Live USBと呼ばれます(格納するためのソフトウェアにはRufus,Universal USB Installer,UNetbootinなどがあります).全く別の方式として,USBメモリに,Windows上で実行できる,コマンドラインソフトウェアを格納するというのもあり,gnupackがよく整備されています.複製が容易なのに加えて,ホスト環境(ノートPC上のOS)を「汚さない」というメリットがあります.ただし,USBメモリを購入し保持するというコストを要請するほか,稼働中は本体から抜いてはいけません.Live USBを使う場合にはPCにより起動の方法が異なる*7こと,gnupackは「Linuxもどき」であることは,教育的観点でマイナス要素となります.

最後に「Webサービス」です.これはブラウザ上でプログラムを書きます.ボタンを押せばコンパイル・実行をしてくれます.統合開発環境と同じように,エラー箇所を教えてくれるものもあります.国内外でさまざまなサービス(Webサイト)が公開されていますが,個人的にはpaiza.IOがベストと思っていまして,昨年度にも,授業時間外に,自分のPCでCのプログラムを書いて実行したい場合には,paiza.IOを推奨していました.インストール不要で,URLだけ知っていれば使えます.統合開発環境と同じように,コマンドライン利用の学習ができません.また一斉授業で学外アクセスが保証されているかについては要検討です.paiza.IOでは1回の実行が2秒以内という制約もあります*8

ここまで挙げたデメリットのいくつかは,おそらく運用によって解消が可能と思われます.また「Webサービス」を除く各手法では,インストールに時間と,ネットワークアクセスを必要とします.

メリットとデメリットをはかりにかけるとともに,複数の利用方法を採用するのはどうか,そもそも1年後期にC言語の指導をするのがよくないのではないかなども視野に入れ,動作検証や,他の教員と意見交換を通じて,今後の学習形態を考えていくことにします.

上記で名称を挙げたソフトウェアなどについて,公式サイトや利用方法解説ページなどを,以下に整理しておきます.

Windows上でLinuxWindows Subsystem for Linux

Windows上でLinuxVirtualBox

統合開発環境Visual Studio

統合開発環境Eclipse

USBインストール〕Live USB

USBインストール〕gnupack

Webサービス〕paiza.IO

*1https://www.wakayama-u.ac.jp/admission/faculty/essential_pc.html

*2isbn:9784774153940.なのですが改訂新版isbn:9784774191423が出ています.

*3:「写経型学習」というやつです.

*4:ファイル編集に使うソフトウェアには,Tera Termを推奨していました.

*5Windowsテキストエディタでソースファイルを編集し,そのディレクトリにWSLのシェルを移動させて,コンパイル・実行ができます.

*6Ubuntuでは「sudo apt update」「sudo apt install build-essential」を実行します.

*7:例えばマウスコンピュータのあるノートPCでは,Windowsを起動した状態から,Shiftキーを押しながらシャットダウンの操作をします.

*8無限ループでなくても,単純な再帰によりフィボナッチ数を求めるプログラムについて,他のプログラミング環境では,正しい解を出力していたけれど,paiza.IOでは2秒を超えたので何も出なかった,というのを確認しています.

2018年07月14日

[][] 足してから適用した結果が,それぞれに適用してから掛けた結果と等しくなる関数は?

いきなりですが問題です.

1変数の実数値関数で,実数a, bに対して以下を満たす関数の例をそれぞれ日本語で答えなさい.ただし「恒等関数」「定数関数」を答えにしてはいけません.

  • f_1(a+b)=f_1(a)f_1(b)
  • f_2(a+b)=f_2(a)+f_2(b)
  • f_3(ab)=f_3(a)f_3(b)
  • f_4(ab)=f_4(a)+f_4(b)

以下はTeX記法ではなくプレーンテキストで書いているところがあります(f_1f1となります).恒等関数f(x)=x,定数関数f(x)=cと表すことができます.

4つのうち,もっとも簡単なのはf2です.これは線型写像における加法性を表した式です.そこでf2に当てはまるものとして「比例関数」が考えられます.f2(x)=x,だとこれは恒等関数になるので,f2(x)=2xとしてみます.すると,f2(a+b)=2(a+b)=2a+2b=f2(a)+f2(b)であり,上に書いたf2の関係式を満たします.次に移る前に,このf2の関係式は,「足し算してから関数適用した結果は,それぞれに関数適用してから足し算した結果と等しい」と読むことができるのに注意しましょう.

次にf3を考えることにします.「掛け算してから関数適用した結果は,それぞれに関数適用してから掛け算した結果と等しい」となります.f2は比例でしたが,f3はその反対ということで,「反比例関数」を割り当ててみます.具体的にはf3(x)=¥frac{1}{x}です.このとき,f3(ab)=¥frac{1}{ab}¥frac{1}{a}¥cdot¥frac{1}{b}=f3(a)f3(b)です.うまくいきました.

さかのぼってf1を見ます.「足し算してから関数適用した結果は,それぞれに関数適用してから掛け算した結果と等しい」です.これまでの授業でときどき使用してきた,2のx乗を,使用してみましょう.「指数関数」です.f1(x)=2^xとすると,f1(a+b)=2^{a+b}2^a¥cdot2^bf1(a)f1(b)です.途中で指数法則を使用しました.問題に書いた関係式が,成り立っています.

最後にf4です.「掛け算してから関数適用した結果は,それぞれに関数適用してから足し算した結果と等しい」ですので,足し算と掛け算が,f1の関係式と反対になっています.それでは,指数関数の反対で「対数関数」にしてみましょう.f4(x)=¥log_{2}xとします.これで,f4(ab)=¥log_{2}ab¥log_{2}a+¥log_{2}bf4(a)+f4(b)です.よかったですね.

関数の例をそれぞれ日本語で答えなさい」という出題でしたので,f1からf4まで順に「指数」「比例」「反比例」「対数」が,もっとも簡潔な答えとなります.ただしこれらは,それぞれの式を満たす関数の「例」です.少し検討すると,次のように表すことができます.

  • f_1(x)=c^xf_1(a+b)=f_1(a)f_1(b)
  • f_2(x)=cxf_2(a+b)=f_2(a)+f_2(b)
  • f_3(x)=x^cf_3(ab)=f_3(a)f_3(b)
  • f_4(x)=¥log_{c}xf_4(ab)=f_4(a)+f_4(b)

いずれもcは定数です.またcは0でも1でもないとします*1.f3の式が大きく変わりましたが,c=-1とすると,f3(x)はx分の1ですので,x^cは反比例を含んでいます.先ほど「反比例」を答えにしましたが,「べき乗」も答えになるのでした.


セキュリティの授業の最初に考えてもらい,多項式時間や指数時間,そして「P≠NP予想」へとつなげていきました.

ところで,今回対象としたf1からf4までは,いずれも準同型写像です.これらを一つの式で表すにあたり,スライドには「E(m1)●E(m2)=E(m1m2)」と書き*2,「●と○は(同じまたは異なる)演算子」という注意書きを添えましたが,なんとも不格好です.

*1:cが1のとき,f1(x)=1となって定数関数です.f2(x)=xは恒等関数です.f3(x)=xも恒等関数です.ではf4が恒等関数または定数関数になるのかというと,¥log_{1}xは定義されません.https://www.quora.com/What-is-log_1-1の回答にある¥log_{1}1¥frac{¥log_{10}1}{¥log_{10}1}¥frac00が興味深いです.

*2:Eは暗号化関数です.今年度,新たにスライドを作るにあたり参考にした書籍には,「E(m1)・E(m2)=E(m1m2)」と書いてあったのでした.

2018年07月13日

[][] Wordで,キーボードのみで数式編集

Wordで,(e^x)’=e^xを入力する一つの方法について,手順を書いておきます.以下では,英字キーを打ち込む指示には大文字で表記していますが,Shiftキーなしで,キートップに書かれた英字をそのまま打ち込みます.また数字キーについてはテンキーでないほうのキーを使用します.OSWindowsキーボード日本語配列仮定しています.

  • Word文書上で数式を挿入したい箇所にカーソルを置きます.
  • 編集していく前に,日本語入力がオフになっていることを確認します.Aのキーを押してみます.ここで「あ」と表示されたら,オンになっていますので,まずBackSpaceキーを押して「あ」を消してから,「半角/全角 漢字」のキーを押して日本語入力をオフにします(Aのキーを押して「a」と表示されたら,日本語入力がオフになっていますので,BackSpaceキーを押して「a」を消すだけでかまいません).
  • ShiftとAltを押しながら,「0」の右隣の「-」のキーを押します(この操作は「Alt+=」と書かれることがあります).「ここに数式を入力します。」が表示されます.
  • その状態でAltを1回押し(すぐに離します),矢印の↓を1回,そして→を何回か押して,メニューの「上付き/下付き文字」が選択されている状態にしたら,Enterを2回押します.「ここに数式を入力します。」の表示が,底と指数を入力するための2つの箱に変わります.
  • ←を2回押してから,Eのキーを押すと,底は「e」になります.そして→を1回押してから,Xのキーを押すと,指数は「x」になります.
  • ←を4回押してから,「(」を入力します(Shiftを押しながら,8のキーです).
  • Shiftを押しながら→を1回で,eのx乗のところが網掛けになります.ここでCtrlを押しながらCを押します.表示は変化しませんが,eのx乗をコピーしたことになります.
  • →を1回押してから,「)」「'」「=」の順に入力します(Shiftを押しながら,9,7,「-」の順にキーを押します).
  • Ctrlを押しながらVを押します.先ほどコピーした,eのx乗を貼り付けまして,これで,「(e^x)’=e^x」の出来上がりとなります.

授業でこんなのやってるの?

いえ,基本的にはマウスキーボードのコンビネーションを指示しています.

Wordの授業回で,なぜか数式編集ができなくなったという問い合わせがありました.そこで,授業後に手順を書いてMoodleで読めるようにしたのでした.ちなみに「うまく入力できた」「それでも数式編集ができない」といったレスポンスはもらっていません.

2018年07月12日

[][] Excelで,離れた2つの列を選択するには

Excelのワークシートに記載された値をもとに,散布図を作るにあたり,2つの列が隣り合っていないとき(例えばF列とH列),どのようにして選択すればよいのか,学生から質問がありました.

答えはというと,1つめの列は通常通りのドラッグ操作で選択します.そして2つめの列は,Ctrlキーを押しながら,ドラッグ操作で選択します.

ちなみにExcelを教えることになった初年度は,2つの列をそれぞれコピーして,空いている列に,隣り合うよう貼り付けておき,それを選択するよう,指導していました.

帰宅して,キーボード操作のみで,離れた2つの列を選択することができないか,試行錯誤していると,やり方が分かりました.1つめの列は,上下端のどちらかまで移動してから,Shift(状況によってはCtrlも)を押しながら上下のキーで,選択します.次に,Shiftを押しながらF8キーを押します.Fと8,ではなく,キーボードの奥の方,ファンクションキーのF8です.そうすると矢印のキーを押しても,1つめの列は選択された状態になります.そして2つめの列の上下端のどちらかまで移動してから,Shift(状況によってはCtrlも)を押しながら上下のキーで,選択します.

☆☆エクセルで離れた場所を選択するとき、マウスを使わずにできますか... - Yahoo!知恵袋のベストアンサー以外の回答にある,Ctrl+Gというのも,試してうまくいきました.ただしこれは,どこからどこまで(何行目から何行目まで)を選択したいかが,分かっている場合に限られます.

2018年07月09日

[] グループワークで学生どうしのやりとりが充実

プログラミング演習科目は全15回のうち第13回,グループワークに限ると全5回のうち第3回の授業でした.はじめに,先週の面談で再面談しますと予告したグループのところへ行き,修正した企画案を見せてもらいOKを出し,教卓に戻って,マイクを持ち中間報告の要領についてアナウンスしました.

その後は巡回するのと,全員の活動が見える場所に座って眺めるのを,交互に行いました.そうすると,部屋のあちこちで,学生どうしのやりとりの姿が見られます.

昨年度に引き続き今年度も,全15回のうち前半は,ペアワークによる答案のレビューを取り入れつつ,基本的にはこちらで用意した共通の課題にそれぞれの学生が取り組み,答案を提出してもらっていました.第9回・第10回はペアワークで1つのWebアプリケーションを開発し,終わり5回は4人組によるグループワークです.

とはいえ,先にグループワークをさせるだとか,演習課題をすべてグループワークにするといったわけにはいきません.課題を通じて体験し,身につけてほしいことはいくつもあります.

「共通でない」ことへの対応にも,追われました.

あるグループでは,バックエンドで1分ごとの処理が必要となり,cronを活用することになりました.crontabの書き方は,少し調べれば見つかりますが,実行結果が画面に表示されないことに,ある学生がストレスを持っているように見えました.リダイレクションなどによりファイルに書き出す必要があることを,dateコマンドを使って確認してもらいました.

他のグループの1人の学生の悩みは,フォームとJavaScriptとの連携でした.ボタンを押したらドロップダウンリストをはじめフォームの内容と,JavaScriptのいくつかの変数の値を合わせて,次のページに送りたいけれどうまくいかないとのことです.ボタンにonclick属性をつけ自作関数を呼び出していたので,その関数内で,次のページのURLを生成し,なになにどっとhref*1に代入させれば飛んでくれるんじゃないかなと,アドバイスしました.