2022年10月27日木曜日

ColabでPG教育を行う際のちょっとしたポイント

Google Colaboratory(以下,Colab)はBYOD環境でプログラミング教育を行うのに最適で,環境設定をする必要がないのでありがたい.とくに本学iTLはマジのBOYD(MacでもWindowsでもLinuxでもなんでもいい……そこそこの性能を持つものであれば)と言っているので,どんな環境でも同一のプログラミング教育環境を提供できる点でとても助かっている.

ところが,Colabを使ったプログラミング教育でしばしば問題になるのが,データファイルへのアクセスである.Colabではバックエンドに当てがわれるランタイムが毎回異なるものであるので,ランタイム側に永続的なデータを保存する術がない.そこで,Google Driveをいちいちマウントしなければならないのだが,それがいつもトラブルの種になっている.

データファイルへのアクセスは,1. Google Drive をマウントする,2. Drive 上のファイルへのパスを調べ,そこにアクセスする(ファイル右のケバブメニューで「パスをコピー」して貼り付ける)ようなプログラムを書く必要があるが,これが学生ごとに違うので,いつもエラーの原因になる.学生の環境設定によるのか,Google Driveのマウントの時点で「マウントできませーん」というエラーが報告されることもしばしば.

そこでJupyter Notebookをサーバに仕込めば問題解決?(次図)と思いきや,こちらは学生ごとにポートを開けなければならないという,また違った問題が発生した.

ところが,今回,PyTorch 使ったAIのサンプルプログラム見てたら,目から鱗の解があって「ユーレカ!なるほどその手があったか」とたいへん参考になったので,備忘録としてまとめておきたい.

その手順とは次のようなものである(次のコードは,サンプルプログラムのノートに,飯尾が手を加えたものである).

なるほど必要なファイルは毎回ダウンロードして,特定の箇所に決め打ちで置いてやればいいのか.ダウンロードするコード部分まで含めてプログラムを配布すれば,データファイルのパスも固定されるし,プログラム全体も同一化できる.なるほどなあ.賢い人は,きちんと考えるものだと感心した.

共有フォルダをマウントさせるという手もありそうだけれど,共有フォルダの設定が,またややこしいんだよなぁ……

2022年10月22日土曜日

PNG画像の透明部分を白にして変換する方法

透明部分があるPNG画像をJPG等にconvertで変換する際に,いつも,透明部分が黒に変換されてしまい,どうしたものかと悩んでいた.ウィンドウのスクショをとるとシャドウ付きのイメージが得られ,それはそれでよいのだけれど,そのPNG画像をJPG画像にconvertしようとすると,どうしても次の図の上のようになってしまうのだ.図の下みたいに,画像は変えずにたんにフォーマットを変えたいだけなのに.

ところが,ググったら簡単な解決策を発見した.備忘録としてここにメモしておく.

convert X.png -background white -flatten X.jpg

などとすればよいようだ.なーんだ,という感じで拍子抜けである.

2022年10月21日金曜日

Jupyter Notebookをリモートから使う方法(2022年改訂版)

 Jupyter Notebook(以下,Jupyter NB)は,本体がバックエンドで動いており,Webブラウザからアクセスして使う.ならばその本体に他のコンピュータからアクセスして使えるはずだ.とはいえ基本的にはローカル内で完結して利用することが前提となっているので,設定をいじる必要がある……ということで,そのやり方のメモ

サーバ側の設定(事前準備:anyenvのインストール)

対象とするサーバは,さくらインターネットでお借りしたVPSのUbuntuサーバである.ポートは9999番を使うので,ダッシュボードの「パケットフィルタ設定」で9999番は開けておくこと.

リモートログインした端末で,次の手順を行う(「$」の部分はプロンプトなので入力しない).

uname -a

Linux ids 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

まず,anyenvの設定をする.

git clone https://github.com/anyenv/anyenv ~/.anyenv

(略)
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(anyenv init -)"' >> ~/.bashrc

exec $SHELL -l

(略)

anyenv install --init

これで,anyenvがインストールされる.次の手順で,anyenvのバージョンを確認しておこう.

anyenv --version

anyenv 1.1.5-1-g5c58783


サーバ側の設定(事前準備:pyenvとpythonのインストール)

次に,pyenvをインストールして,最新版のpythonをインストールしよう.まずは,pyenvをインストールする.以下では,コマンドの出力は必要がある場合以外は省略する.さらに,[y/n]などでyes or noを尋ねられたときは,基本的にyを入力すればよい.

$ anyenv install pyenv

$ exec $SHELL -l

これで,pyenvがインストールされる.同様に,動作確認を兼ねてバージョンを確認しておこう.

pyenv --version

pyenv 2.3.5-2-g03a5d653

さて,次はpythonのインストールである.2022年10月20日の時点で安定版の最新版は3.10.8なので,それをインストールする.が,いろいろとライブラリなどを事前にインストールしておかないとpythonのインストールがうまくいかないので,以下のとおり,必要なライブラリをインストールしておこう.

$ sudo apt install build-essential

$ sudo apt install libbz2-dev libncurses-dev libffi-dev \

                   libssl-dev sqlite3 libsqlite3-dev liblzma-dev

これだけインストールしておけばOKのはず.そのうえで,pythonをインストールする.

$ pyenv install 3.10.8

pyenv local 3.10.8

とりあえずこの作業ディレクトリ以下(ローカル)で使えるようにしておこう.

サーバ側の設定(jupyterの設定と起動)

さて,ここまでお膳立てが整ったら,あとはjupyterの設定をするだけである.まず,インストールから行う.

$ pip install jupyter

簡単にインストールできるだろう.

$ jupyter-notebook --generate-config

これで,設定ファイルが作成される.

ホームディレクトリに.jupyter/jupyter_notebook_config.pyが作成されるはず.

続いて,ipythonを立ち上げる.次の手順でパスワードを設定する(In [*]: はipythonのプロンプトなのでコピペしないこと).Enter password: と Verify password: では好きなパスワードを入力する.エコーバックされないのでパスワードを間違えないように入力すること.また,ここで表示される'sha1:……'は,入力したパスワードに対するハッシュ値なのでこの値を正確にどこかにコピーしておく(あるいは,この端末を開きっぱなしにしておくこと).ここで入力するパスワードは,リモートから接続する際に利用するので忘れないこと.

$ ipython

Python 3.10.8 (main, Oct 19 2022, 17:28:48) [GCC 11.2.0]

Type 'copyright', 'credits' or 'license' for more information

IPython 8.5.0 -- An enhanced Interactive Python. Type '?' for help.


In [1]: from notebook.auth import passwd


In [2]: passwd()

Enter password: 

Verify password: 

Out[2]: 'sha1:******************** ... ***'


In [3]: exit

.jupyter/jupyter_notebook_config.pyファイルの末尾に以下を追記する.

c.IPKernelApp.pylab = 'inline'

c.NotebookApp.ip = '0.0.0.0'

c.NotebookApp.open_browser = False

c.NotebookApp.port = 9999

c.NotebookApp.password = u'sha1:******************** ... ***'

ここで,最後の行は先ほどのハッシュ値をコピペする.以上で準備は終わり.

リモートからの接続

サーバの端末に戻り,Jupyter NBを起動する.

$ jupyter-notebook

手元のマシンからWebブラウザで接続する.ポート番号を9999に変更したので,http://サーバ名:9999/としてアクセスすること.

パスワード画面が現れるので,先ほど設定したパスワードを入れてログインする.

フォルダを辿っていくと,作業用ディレクトリにアクセスできる

2022年10月19日水曜日

インタフェース論基礎

皆さん,情報システムというと,何を想像するだろうか.

銀行のATM?Googleの検索エンジン?チケット予約サイト?いずれも情報システムである.システム(system)とは,日本語で「系」のこと.ひらたくいうと「しくみ」のことだ.なかでも,情報を扱うシステムのことを,ここでは「情報システム」と呼ぼう.

まず,皆さん,身近にある情報システムには何があるか,思い浮かべてほしい.なんでもよいので情報を処理する仕組みを考えてみよう.何か思いついただろうか.

情報システムのモデル

さて,次の図は,情報システムのモデルである.

情報システムに何かを「入力」すると,何らかの「処理」がなされ,何かが「出力」される,という流れを簡潔に示している.下にある「フィードバック」ってなんだ?それはおいおい,説明する.

それでは,先ほど皆さんが考えた情報システムについて,入力と出力を考えてみよう.何を入力して,何が出力されるか,である.処理については考える必要はない.とりあえずここでは,情報システムをブラックボックスとして取り扱うことにする.

GoogleやYahoo!といったインターネット検索の例を考えよう.まず,入力するものはなにか,検索キーワードをテキストフィールドに入れ「検索」ボタンを押す,これらが入力されると考えてよかろう.検索エンジンが何がしかの仕事をした結果,検索結果が出力される.出力は,検索結果(の一部を表示した)ページである.

さてここで,出てきた検索結果は皆さん満足できるものだろうか?検索結果が多すぎたり,予想したものとは異なるような検索結果だったりしたら,皆さんどうするだろうか?

キーワードを追加して絞り込んだり,キーワードを変えて別の検索を試みたりしないだろうか?これが,フィードバックである.出力をみて,人間が考え,別の情報をまた入力する.このサイクルを繰り返して,目的の達成(Goal)に近づけるような工夫をするだろう.情報システムの利用は,入力→処理→出力→フィードバック→(入力→処理→出力→フィードバック→……)といった手順を繰り返して行われる.

機械系と人間系

ところで,情報システム学会の説明によれば,情報システムは機械的機構と人的機構から構成されるという.端的にいうと,機械的機構とはコンピュータなどメカのこと(ソフトウェアも含む),人的機構とは,システムを取り巻く人間や社会のことである.

先に示した図をもう一度みていただきたい.入力するのは誰がするか,出力をみて,フィードバックを考えるのは誰なのか,考えてほしい.

その答えは,人間である.すなわち,かの図において,機械的機構が担う部分は「処理」を取り囲む色付きの部分だけなのだ.機械的機構を人的機構が取り囲むという構図になっている点に留意されたい.

プログラミングを習っても……

「プログラミングを習っても,すぐにシステムやアプリを作れるようならない」という声を学生からよく聞く.そりゃそうだろう.システムやアプリを作れるようになるためには,以下のように,プログラミング以外の様々なことを学ばなければならないからである.

  • 適切かつ効率的なロジックの構築
  • 計算精度や誤差,コード体系の選択など
  • データの入出力(インタフェース)
  • データの永続化(データベースの利用)
  • エラー処理,例外処理,セキュリティ対応
  • テストや開発手法の共有(ソフトウェア工学)
  • プロジェクトのマネジメント,etc……

このなかで,ここでは「データの入出力」に注目したい.プログラミングの基礎科目では,せいぜい,printf() や scanf()(もしくは puts() や gets())あるいは,ファイルディスクリプタを介したファイルの読み書きを習う程度ではなかろうか.

しかし,先に示した人的機構と機械的機構の関連を考えていただきたい.機械的機構と,それを取り囲む人的機構の間で,入力・出力という情報のやりとりが生じる.そこで考えなければならないことは,いかにして効果的に情報のやりとりを行うか,その最適解は何か,ということである.

人と機械が接するところ,それはすなわち,界面であり,インタフェースである.インタフェースの検討,研究がいかに重要であるか,ということがこのロジックから分かろうというものである(その延長線上には,UXデザインなどの概念が横たわっている).というわけで,インタフェースをどうするかという観点から,システム構築のイロハを語っていこう.

システム定義,基礎のキ

まず,最も単純なパターンを考える.とりあえずフィードバックは置いておくとして,何かを入力したら何かが出力されるものを考えてみよう.

y = f(x),これは,中学校数学で学習するはずの「関数」である.独立変数xと従属変数yが,fという関係で結ばれているというやつ.xに何らかの値を入れると,それに従ってyの値が定まる.すなわち,xを入力するとfの処理が行われ,yが出力される,というものである(次図).

y = f(x)ではピンとこない人も多いだろう.fとして具体的な処理を考える.xの2乗を計算する関数を考えてみよう.y = x*x である.

pythonの関数として,square(x) というものを定義してみよう.パラメータxに値を入れてsquare() を呼び出すと,2乗の値が返される,というものだ.

def square(x):
y = x * x
return y

図で示すと,次のようになる.

次の図は,Google Colaboratoryを使って動作検証してみた結果である.まず,関数を定義して,その関数を実行している.

square() に6を入力し,処理結果の36が出力されている様子を確認してほしい.

プログラムは固定?

ところで,ここで問題となるのは,square(x) の呼び出しそれ自体がプログラムに含まれているということである.どういうことか.

先の例で,square() の実行は,square(6) というプログラムとして表現されたものを実行する,という手順になっている.すなわち,xの入力までがプログラムに埋め込まれているということであり,それは次の図の淡い青で示した部分全体がプログラムとして固定化されていることに他ならない.

したがって,入力を変更するには,プログラムを書き換える必要が生じる.しかし,一般的な情報システムにおいては,利用者がプログラムを自在に書き換えるということは,通常,あり得ない.どうしたものか?

インタフェースを定義する

そこで,プログラムでインタフェースを定義する必要が生じるのである.Cでいうならば printf() や scanf() などで実現していたものだ.

上記の関数では,入力はプログラムに埋め込まれており,出力は Colaboratory の機能を知らずうちに利用していた.次は,この入出力を明示し,プログラムに組み込むことを考える.

関数 cli() は,入出力のインタフェースを明示的に記述し,外部から入力された値を用いてsquare() を呼び出すものである.その結果は print() でフォーマットされて出力される.なお,この関数はもともと端末エミュレータ上で実施することを想定していたため,コマンドラインインタフェースとしているが,Colaboratoryで実行すると,図のように入力用のテキストフィールドが現れる.

関数 cli() には,入力,処理,出力の工程が,各行で綺麗に分離して記述されていることが分かるだろう.これがインタフェースを定義する考え方の最も基礎となる部分である.

今後は,この簡素なインタフェースを,どれだけリッチにできるかを考えていけばよい.ただし,インタフェースの道は一日にしてならず.奥が深いものである.じっくりと探究していこう.

2022年10月16日日曜日

「個人情報の定義」とは

とある先生が,面白い情報を教えてくださった.次の図を見ていただきたい.この図は,「個人情報の定義 そのころわたくしは,モリーオ市の博物局に勤めて居りました」というキーワードでググった結果である.

なんでしょうこの奇妙なプライバシーポリシーの数々は?皆さんもぜひ試してみてください(上記文中のリンクをクリックすればOK).いったいこの国はどこへ行こうとしているのだろうか.

二つめに出てきている青空文庫が元ネタである.元ネタをおさえて一番に登場する鎌倉のお蕎麦屋さん,おめでとう!いやはや,いったいどうしたものか.

なんでこうなった?

なんでこんな妙ちきりんなプライバシーポリシーが山のように出てくるのだろうか.その背景には何があるのか,興味は尽きない.

この件で思い出すのは,「困った利用規約」の話である.こちらの件は笑い話どころではなくて少々困ったモノではあったが,考えの浅い担当者が「コピペでよかろう」と困った利用規約をコピーして拡げてしまっていたという点が問題であった.本件も同様の理由なのだろうか.

2022年10月2日日曜日

にこPへの誘い

2020年から「日(に)本語を話さない人たちとのコ(こ)ミュニケーション&コラボレーション・プ(P)ロジェクト」,通称「にこP」(英語ではSMILE project ※)という活動を行なっている.日本と海外の生徒・学生をテレビ会議システムで結び,国際交流させようというプログラムである.

初年度は日本と台湾の高校それぞれ2校でペアを組み実施した.その後,順調に参加校が増え,今年度,2022年度は大学6校,高校15校,小学校2校,ペアの数としては14組まで拡大した(14組2校ペアとすると28校の参加という計算になるが,1校が他の2校とペアを組んでいるようなケースもあるため,参加校の数は28より少なくなっている).参加する児童・生徒・学生の数は数百名に上る.参加校を地図上にプロットしたものが,次の地図である.


にこPの特徴

にこPの特徴は,以下のようなものである.

  • 英語を母語としない国を対象とし,お互いが第二言語(あるいはリンガ・フランカ)としての英語により意思疎通を行うこと
  • 時差の影響を極力排除するために,日本の交流相手として東アジア〜東南アジア諸国を基本としていること
  • 英会話そのものを目的とせず,あくまで異文化間交流を目的としていること.そのため,最低3回は交流の機会を用意していること
  • 2対2あるいは2対3程度の,グループによる交流であること,さらには,あらゆる手段を用いての意思疎通を許していること

前者の2つは,日本発のプロジェクトとして重要なポイントである.日本語をはじめとして東アジア〜東南アジア各国の言語は英語とは程遠い言語である.その点で,欧州各国で英語を用いたコミュニケーションを行おうというケースとは大きく異なる.しかし,現在はグローバル言語として英語でのコミュニケーションが求められる状況は多く,国際交流のためのツールとして英語を使用するためのトレーニングが求められる.

また,リアルタイムでの交流を主眼においているため,時間調整のやり易さを考えると,時差は少ないに越したことはない.それぞれの学校におけるスケジュールは年初に決められていることが多く,その合間を縫って交流の時間を設けようとするのは思うほど簡単ではない.そのため,時差のない近隣諸国であることが望ましい.

真の目的は異文化間交流

本活動は,英会話の能力を向上させようというものでは決してない.もっとも,英語で会話する以上は英会話能力の活用は求められるが.しかし,英語だけ上手に話せればよいというものでもない.

異文化間交流を行い,文化的にも社会的にも背景を異にする人々と,円滑なコミュニケーションを行うためには,言葉で表現する以上に相手へのリスペクトが必要である.すなわち,事前にある程度は相手国や相手の文化に対する学習を行う必要があるし,また,自分達の文化や自国についても向き合っておく必要があるだろう.

日本の学生・生徒たちにとっても,異文化圏に属する同世代の人間と接する機会はさほど多くないのではないか.そのような機会を提供し,これまで話したことのない人々と交流する体験は,貴重なものとなろう.その後,さらに交流を深めるような発展をするもよし,さらに見聞を拡めるべく学習意欲を高めるもよし.あるいは,インバウンドで日本にやってくる外国人に対する理解の一助にもなるかもしれない.

さらには,指導する教員の力もグンと伸びるであろうことが期待されている.なにしろ相手校と事前の準備をし,活動のまとめをし,生徒,学生たちを指導していかねばならないのである.このような異文化間交流教育を指導したことのある先生方は,まだそれほど多くないのではないだろうか.

本プログラムへの参加を希望する先生方がいらっしゃったら,ぜひ,私たちにご連絡ください.

連絡先:一般社団法人ことばのまなび工房,お問合せ窓口( https://kotoba-kobo.jp/info

※ SMILE stands for Students Meets Internationally through Language Education