Archive for the ‘プログラミング’ Category

ループ処理を如何に省くか

月曜日, 2月 4th, 2019

小規模データセットで動作確認しながらコーディングしたり、最終的にもプラスアルファ程度の規模で動作させるぐらいなら「想定通りに動くコード」に辿り着くことが第一優先。テスト駆動と言い換えても良いです。

一方で、処理件数が桁違いに増えてくると「待ってられない=結果的に動かない」コードになってることもあって。例えば「でかいファイルを纏めてメモリ展開して処理する」みたいなのも、小さいファイルなら動作するけど、大きいファイルになると死んだり。極端に長い1行があるとそこで死んだり(流石に死ぬは言いすぎかもだが)。こういうのを避けるためには、レビューを受けてリファクタリングすると。自分で想像付く範囲でテストするのも大事ですが、何かしらこういうのは「え、そういう死に方するの!?」という場に直面しないとそもそも気づけないことも多いでしょう。

今日はゼミ後に「ある大きなリストとある大きなリストの一致率を計算するのに時間がかかりすぎてて」という話で、コードを見るとPythonな4重ループ?ぐらいの処理。単なるマッチングではないので「ぱっと思いつくままの手順」で書くならそのぐらいになるだろうなと。これを

np.array == 0

みたいに書くと指定した値と合致したか否かのTrue/Falseな配列が得られるので、その配列同士を

np.logical_and

するとかでループなしに判定できるなとか。あれこれお茶会しながらやるのもいとをかし。

TDD + モブプロワイワイ会

水曜日, 12月 26th, 2018

プログラミング周りの実践演習向けに勉強しようということで、TDD+モブプログラミングでワイワイする会 その20に少しだけ覗いてきました。実際に見てきたのは冒頭1時間と後半20分ぐらい。

モブプログラミングそのものについてはMob Programming Startup Manualか、TDDワイワイ会inXP祭り2018あたりを眺めると、全体像が掴みやすいです。

ざっくりと手順をまとめると、こんな流れ。

・モブプロの時間(開始〜終了時間)を決める。
cyber-dojoなり、実行環境を用意する。
 *cyber-dojoは言語&問題別にコード&テスト例も用意されてて便利。
・モブ(グループ)を決める。
・開発言語と仕事(開発対象)を決める。
・ドライバー1人とそれ以外のナビゲーター、交代タイミングを決める。
・ToDoリストで「開発し終えるための全タスク」を管理しつつ、テスト駆動開発で「今やること」に集中する。
・まずテストを書き(red)、それを通すコードを目指し(green)、その後でリファクタリング(green)を目指すのが理想。ただし理想であって、TPO考慮。
・考えてることは一通り言葉にする努力を。「わからない」と表明するのも貢献の一つ。
・何か達成したら喜ぶ。
・モブプロ時間を終えたら感想等を通した振り返り。できればここで十分に時間取って形式知化できると良さそう。

覗いてみて気づいた&感じた点は、、

  • TDD x ToDoリスト x ペアプロみたいに、TDD x ToDoリストを組み合わせることで、単に「複数人でやれ」よりも、過程を可視化しやすそう=体験や学びを促進しやすそう。
  • テスト駆動を教える場合、最初から「とりあえず動くコード&テスト」を用意してやるととっつきやすそう。
  • テスト駆動だからこそ「どういう風に作り込もうとするか(≒設計過程)」を見せやすいかも。設計と実装を明示的に区別できるのが良い? 一方で、本当のプログラミング初学者からすると、「テスト」や「関数」とかの概念自体がわからないので、対象言語について1〜数時間のチュートリアルしてから、TDDxモブプロし始めるぐらいが良い?
  • 1仕事終えるまで1モブで固定した方が良さそう。途中でモブ間のメンバ入れ替え発生すると、そこに辿り着くまでの流れを把握していないメンバが発生し、それを解消する情報共有コストが大きすぎるという意味で。
  • 研究室でやるのも良さそうなんだけど、その場合は「今回はAさんのタスク」とか、タスク単位でモブるのが良いのかな。似たような取り組みを試験的に導入したことはあるけど、ゼミ外でやったからか定着しなかなかったので、ゼミ時間なりある程度強制的に集合する時間でやった方が良さそう。論文書けとかでも一緒で、初めてのタスクを一度皆でやるというのをやってみるかなぁ。

TA指導含めて、授業にも取り入れられると面白そうです。TA人数やスペース、環境とか工夫しないと現実的じゃないのが辛いところですが。

colaboratory/jupyterで課題出させる際のデメリット

金曜日, 4月 13th, 2018

colaboratoryでペアプロすることもできそう(問題はあるにせよ)ということとは別に、レポート課題として提出させる際の問題点はあるかなという点で考えてみると、、、

[ 現時点ではGoogleドキュメントでレポート作成&Googleドライブ提出させている ]

このメリットは思ってた以上に大きくて、
(1)赤ペン先生しやすいし、コメントでメール自動送付してくれるのは楽。
(2)学生側もどこに対するコメントなのか把握しやすい。

この2つの合わせ技で、学生側はそのメール内のリンクをクリックするだけで(2)の状態になり、チャットやり取りのようにみえるからか敷居を感じない学生が少なくないようで、指摘したコメントに対する改善をしてくるケースが増えています。具体的なリンクなしのメールコメントは昔からやってるんですが、具体的にそこまでやってくるのは少なかった。その意味では、GoogleドキュメントのコメントUIを含めた形が指導に向いてるように感じます。

これを「colaboratory/jupyterでipynb形式でレポート代わりに作成&提出」という形にしたらどうなるか。

現時点ではGoogleドキュメント並みのコメントUIがないので、コメントしづらいし、学生側も改善にまで動こうとするかは怪しいかなという気がします。妄想なんですが。目的が違うよねということは理解できるんですが、JupyterLabでもその辺りの機能は無さげな気がする(多分)。

GitHub x Issue あたりで似たようなことできなくも無さそうですが、うーん。

Google Colaboratory x ペアプログラミング?

水曜日, 4月 11th, 2018

Jupyter Notebook環境を仮想マシン上で実行してくれるColaboratoryを今更ながら試してみました。環境構築せずにすぐにお試しできるというのは初学者には嬉しいでしょう。それとは別に、授業でペアプロすることがあるのでそこで使えないかなという確認を兼ねてお試し。


[ 1. 教員側でノートを用意する ]

  • ColaboratoryなりJupyterなりでipynb形式で作成。
  • googleドライブで共有する場合、これまでのファイル共有とやり方は一緒。(プログラミング1の場合、共有用ディレクトリを用意してあるのでそこにファイルを置けば良い)

この時点で、Colaboratoryからipynbファイルを指定して開くことは可能。しかし、共有先のGoogleドライブからは「開けないのでダウンロードする?」という状態に。同時に「アプリで開く(Open with)」でもColaboratoryを選択できず、直接編集できる状態では開けず。勿論、一度ダウンロードした上で自分のColaboratoryで参照できるスペースにアップロードしたら開けますが、これだと独立したファイルなので「同時同じファイルを編集する」みたいな使い方はできません。

[ 2. 必要かもしれない手順 ]

  • 一度Colaboratoryにアクセス。それだけで閉じる。(ひょっとすると一度コード実行する必要あるかも)
  • 改めて共有ドライブにアクセス。
  • ipynbファイルを右クリック(Ctrl+クリック)し、「アプリで開く(Open with)」からColaboratoryを選択。

これでも直接開けない(アプリが選択できない)場合、暫く放置しておくと良いのかも。単に設定の問題ではなくて、各自のGoogleドライブ側からColaboratoryとの連携に多少の時間が必要なだけかもしれない。(放置してたら開けるようになってた)

[ 気になる点というか特徴 ]

  • 一つのモニタを使う一般的なペアプロだと、遅延は発生しない。これに対してColaboratory共有だと、Googleドライブ共有分の遅延は発生する。「そこインデントおかしい」みたいなナビゲート側のアクションに遅延が発生することに。
  • 以下は問題にならなそうな特徴。
  • Colaboratory側で用意される仮想マシンは、一番最初の起動時には少し(数秒程度)時間がかかる。
  • FAQによると仮想マシンはあるタイミング(最大存続期間 or 一定のアイドル状態)で殺されるっぽい。実際暫く放置しておくと「接続が切れて、再接続を促される」状態になりますが、ワンクリックで繋げ直せます。

前述のように Colaboratory でペアプロできるのだとすると、、

  • 去年までのペアプロ: 問題を問題ページに用意して、ローカル上でコード書いて実行し、うまくいったらそのコードと結果をドキュメントに貼り付ける。個々人でノートPC持ってるため、ドライバが入れ替わるとそれまでの履歴をナビゲータが引き継ぐ際の手間がかかる。
  • Colaboratory上でのペアプロ: コードや実行結果を貼り付ける必要は無い(これはJupyterの利点)。ファイル共有された中で実行できる(Colaboratoryの利点)ので、スムーズに引き継ぎできる。

みたいになるのかな。

ただ、「一つのモニタで作業をやる」ことにも意義があると感じている人なので、少しその点が気がかりではあります。ノートPCだと見づらいんですけどね。


[4/11, 15:45追記]

手順2の「必要かもしれない手順」は、以下のようにするのが本筋っぽい。

[ 2. 本手順(Colaboratoryとの連携設定) ]

  • 共有ドライブをブラウザで開く。
  • ipynbファイルを置いてるフォルダを開く。(既に開いてるなら次へ)
  • フォルダメニューをクリックし、「アプリで開く(Open with)」から「アプリを追加(connect more apps)」を選択。
  • 検索窓に「Colaboratory」と入力して検索。Colaboratoryをクリックして追加。(「connected」になればOK。)
  • ☓ボタンをクリックして設定終了。
  • ipynbファイルをダブルクリック。開く際に「ダウンロードするか、Colaboratoryで開くか」を選べるので、Colaboratoryを選択。

大学の存在意義?

水曜日, 6月 28th, 2017

大学なんていらない、大学を(オンラインサロンに)置き換える』って宣言してるから」というのは今の時代わりとありな選択肢だと思うけれども、一方で未だに大学を選択する人が多いし、オンライン講義のMOOCが大学に取って代わることができない理由なんて記事も昔から書かれてるぐらい、まだまだ問題があるのも事実。いい面悪い面いろいろあるので、どちらか片方だけというよりもミックスする方が良いのでしょう。

「先生の話を聞く」だけなら動画でいいだろう。何かしらインタラクション入るなら授業として皆がいる場でやる意義がありそうですが、それもやりようによってはニコニコ動画やそれに近い方法でやれる側面もあるでしょう。掲示板でもいいし。

グループワークの類は「皆が集まる場」を活用する一つの方法だと思うけれども、うまいこと仕込まないと達成目標とはズレすぎるとか、別の問題がでてくる可能性が少なくない。達成度合いの評価が難しいという話もあるか。

プログラミング1,2に関しては(同学年同士での)ペアプロを導入してるけれども、2年目にしてようやく少し熟れてきた感があるかな。まだまだ思い込みかもしれないけど、「二人で分業して効率良く進めることが目的じゃない」、「二人が独立して作業してるのはおかしい」、「ドライバーとオブザーバーを決め、二人で一つのタスクに取り組もう」、「相手が何やってるか、何考えてるか分からなくなったら尋ねよう。授業中は互いに質問しまくる権利がある」といったことが少しずつ伝わってるように思います。授業中の質問や、レポート・メールを通した質問も増えてるしな。良いことだ。

社会人AI人材育成に向けた底上げ?

木曜日, 5月 25th, 2017

沖縄型産業中核人材育成事業の一環として、多企業・他業種混成でAI・IoTを活用した企業連携を目指す人材育成が始まるらしい。現時点でググってもあまり具体的な情報が見つからないのだけど、プログラミング・数学・機械学習あたりで教材提供できないかという話が届きました。もうちょっと早い段階で目標から一緒に相談できればよかったんだけど、今回は「やれる範囲でやる」ぐらいのことしかできそうになくて、一先ずの目標が「底上げ」になりそうです。

教育自体はうまいこと在学生含めて大学として協力できる部分は協力したいですが、既にPyData.Okinawaとかかなり近いコミュニティがあったり、とても広い意味での底上げなら書籍なりweb公開されてる既存コンテンツが大量にあるので、それ利用した方が良いんじゃないかという気持ちが強くて。具体的な目標があるとか、それに向けたカスタマイズされた教材作るなら新規作成も分かるけど。

一先ず大学1年次向けに実施してる授業コンテンツは提供できますよということで、そっちを覗いてみてもらうことに。授業録画した動画もあったりするし。動画はアクセス認証ついてるのでそのままだと見れないのだけど。

とかいろいろありますが、やれる範囲でやってみます。

Pythonのアプリケーション化 (Pyinstaller)

水曜日, 6月 22nd, 2016

PyInstaller is a program that freezes (packages) Python programs into stand-alone executables, under Windows, Linux, Mac OS X, FreeBSD, Solaris and AIX.

ということで、Pyinstallerなるものがあるらしい。学科内ではあまり用途が思いつかないけど、個別に環境構築やらするぐらいなら、アプリ配布の方が都合が良いというケースでは便利そうか。

試しに使って見た限りでは、

  • インストール: pip3 install pyinstaller
  • 適当なサンプルスクリプト用意。
  • アプリケーション化: pyinstaller –onefile script.py

するだけで scirt という名前のアプリケーションが作れるという。ターミナルに標準出力するスクリプトから作成したアプリだと、アプリ起動するとターミナルが起動して実行されます。出力終わったら瞬時に終了するのでtime.sleep()とか入れないと見れないけど(ぉ)。ターミナル側の設定で「シェルが終了したら自動でウィンドウを閉じる」の設定が影響してるらしい。これをOFFにしとくと自動で終了はしなくなるけど、不便だな。自動でアプリを終了しないようにするオプションがありそうなんだけど、軽く調べる限りでは見当たらない模様。無いのかなー。

P.S.
今回、理学部修士の学生から「Pythonのexe化」について相談したいという連絡が届いて、初めてPyinstallerなるものの存在を知りました。私の環境だとOS違うしPyinstaller使ったこと無いという状況でしたが、先方はプログラミング初心者ということもあってそれでも話を聞いて欲しいということで相談にのることに。結果としてはその場での解決はできなかった(ごめんなさい)けど、怪しいポイントとしてはAnacondaかなぁと。そう考えた理由は、Python標準ライブラリで済む範疇のプログラムならexe化できるところは確認できたけど、numpy使ってると失敗するという状況だったので。アプリケーションは作れるけど、途中でTypeError等エラー出まくりになアプリになるという。Anaconda環境下にpipでpyinstallerをインストールしたようですが、conda使うのが良いのかもしれない。いずれにしても、可能ならアプリ化じゃなくてスクリプト自体の配布を選択するが面倒事少なそうな気がします。

先日の質問話したからという訳ではないですが、プログラミングの授業を持つようになって、シラバス・ブログでそのことを書く頻度が増えてからメールなりでの「学科外からの相談」が増えてます。こういうのも「動機があって行動する人はする」という一例ですね。授業にかぎらず論文読んでて分からないところがあったら著者に連絡取るとか、ダメ元で行動するというのはやるに越したことはない。

(プログラミング1) 2週目も思った以上に演習の時間がとれず

木曜日, 4月 21st, 2016

資料自体はそれほど多くない気がしますが、あれこれ説明してるうちに「こんなケースもあってね」と脱線することが多く。いや、資料自体も多かったか。「教科書補足説明+教科書にない説明+演習説明+ペアプロ説明」と説明だらけだったし。ということでそもそも詰め込み過ぎでした。

結果的にメインのつもりだった演習は20分ぐらいしかやれず。内容的には「エディタ・ターミナル・インタプリタをあれこれ行き来しながらレポート作成してね」というもの。レポートはGoogleドキュメントでテンプレートを用意して、基本的には実行の様子が分かるようにコピペで済ませるようにして、なるべく全体の流れを意識しやすくしてみたつもりです。案の定「Pythonインタプリタ上でemacs入力してエディタが起動しないと悩んでる学生」とか出まくりで楽しいです。

十分な時間がとれなかった点は反省して次回は演習メインにします。(復習+新しいことの説明でmax30分、演習1時間は取ろう)

ペア・プログラミングは厳密なやり方はさておき、「なるべく一人で考えこむのを避けろ(max数十秒)」、「悩むぐらいなら喋って相談しながらやろう」、「考えてることを言葉で説明する練習」、「何をやってるのか目的共有できてないのはまずい」、「driverがやってる操作が分からなかったら聞こう」、みたいな話で進めてみることに。感触としては「周りが賑やかだからか自分たちもやろう」という雰囲気作りにもなってることと、ペア間だけでなくTA・教員へ質問しやすい雰囲気にもなりそうな感触を受けています。(質問する学生わりといる)

「66名=33ペア」で同時にペアプログラミングするというのは無謀かとも悩んでましたが、一応、なんとかなるかも。多分。少なくとも問題を一人で抱え込むことを避けやすい、というのは大きなメリットだなと。

無料でプログラミング独習できるサイト(主にPython)

火曜日, 3月 8th, 2016

新入生に紹介するのに良さそうなサイトが有れば教えて下さい! という記事です。


2次元美少女がPythonを無料レッスンしてくれる動画が公開~cvに上間江望さん起用」ということで久しぶりにpaizaを覗いてみたんですが、いつの間にかPython 3.4にも対応してたんですね。紹介されてたpaiza learning(動画学習)「1テーマあたり数分程度の動画説明->ブラウザ内で演習」という流れで進むので、割りと良さ気です。ただし欠点もあって、課題が正しく動いてるかどうかを自動でテストしてくれるのですが、そのテスト内容が全くわからず、「テストに失敗した」ぐらいの情報しかもらえないので、どこをどう改善したら良いのかについての検討材料が無いところは独習に向いてません。(たまにどう考えてもテストの方がおかしいんじゃないかという事例もあったり。私の理解不足という可能性も十分ありますが。)
ちなみに開発途上だからだと想像しますが、動画学習の1章を終えると「paiza Code Gym(1分間タイムアタック)」へのリンクが出てくるんですが、これがPHP版しか用意されてません。Python勉強してPHPで戦えってどういうことよ〜。

似たようなものにドットインストールがありますが、こちらはまだPython 2.xのみっぽいのと、演習課題はなかった気がする(今もそうなのかは知らない)という点でやや物足りない感がありそう。ただし他言語含めて幅広くあれこれ扱ってるという点ではこちらが上ですね。

同じく独習向きサイトとしてはプログラミングコンテスト関連がありますね。slideshareの方が見やすいという人はこっちを見よう。中身はどっちも一緒。この記事ではあれこれ整理して紹介してくれててどこから入ろうかの目安が分かりやすいです。コンテスト系の難点は、こちらのやりたいタイミングでやるというのが難しいことが多いことか。比較的長い期間開催しっぱなしのもあるけど、決められた特定の時間帯にしかやれないのも少なくない。公開されてる過去問で良いなら時間制約もなく、お手頃だと思います。

コンテストではないけれども共有&競争しやすい場を提供してる例としてはCheckiOみたいなタイプがあります。ただ難易度設定が怪しい気もする。例えば一番最初の課題(一番上に表示されたものを選択してみた)が「リストに含まれる数値から非ユニークなものだけを残せ(1度しか出現しないものは削除しろ)」というような課題で、リストもカウントもif文もfor文も知らないとできない課題になってたりします。一度基礎をどこかで学んだ上で「課題ベースで学び直したい。他の人のコード例も読んでみたい」という人向けのサイトかな。

これまでとちょっと違う例としては「プログラミングの勉強」に特化したソースコード検索エンジン「Runnable」が便利過ぎ!なるものが。ただ、ちょっと触ってみた感じでは使い勝手悪い気がするな。探し方が悪いのかもしれないが。

取り敢えず課題がほしいという人向けには、こんなものも。

先に出したものもまとめておこう。

こんなところかな?

課題の工夫しどころ?

土曜日, 4月 18th, 2015

またまた木曜日のお話。

プログラミング1の聴講(&サポート)しようと参加してたのですが、1週目は無しでした。あれ、そうなの。学科カリキュラム的にはプログラム1とソフトウェア演習1で1セットな授業という認識だったんですが、いつからか割と独立した講義になってるらしい。1週目はプリンタの使い方とか含めてソフトウェア演習だけを2コマ連続でやるというのがここ最近(?)の通例らしいです。

それはそれで良いと思うんですが、ブラウザの使い方からあれこれやるってのも「?」な気が。と思ったら、「あれこれwebページ検索したり閲覧してる人?」と聞いても殆ど手を上げず。(質問の仕方が抽象的すぎる気もするけど)え、そうなの?? そうだとしてもスマートフォンなり何かで検索したことはあるだろうから、「演習としてあーしてこーして」ということをするよりは(達成させたい目標に沿った)課題を与えた方が良さそうな気はするな。ま、ブラウザの使い方とかはその日で終わって、2週目からはUnix演習に入るっぽいですが。その割に2年次になってもUnix環境/操作に慣れてない学生多いんだよな。あれは何故なんだろう。演習内容の問題?課題の問題?それ以外?


高校にも情報」導入されて、高校教諭だけじゃなく周りの環境含めて熟れてきてるんじゃないのと思ってたのだけど、ざっくり指導要領解説を眺めると「薄く広く」あれこれ取り上げる形になってるのね。「高校生」に教えるなら検索エンジンとかwebサービス/アプリをツールとして使う技術(プログラミング的思考を含む)を教えるだけでも良さそうなんだけど。一応 p.5 には

(1) 情報活用の実践力について
課題や目的に応じて情報手段を適切に活用することを含めて、必要な情報を主体的に収集・判断・表現・処理・想像し、受け手の状況などを踏まえて発信・伝達できる能力

と書かれてて「そうだよな」と思うのだけど、それ以外にもあれこれ掲げ過ぎてるという印象。バス型とかそんな話必要なんだろうか。