VSCode+Python+Jupyter Notebookでの開発環境を整える
機械学習(データ分析)をちょっと触りだけやってみようと思い、最近使い始めたVSCodeで環境構築をしてみました Jupyterを使ったことがなかったのでちょっと苦戦しましたが一応動いたので手順を書き記しておきます。 ついでにAnacondaについてくるJupyterを使う場合の手順も記述しておきます。
はじめに
Jupyter(Project Jupyter | Home)はWeb上で様々な言語を実行することのできるツールです。実行するとWebサーバーのようなものが立ち上がり、ブラウザでコードを書いてポチポチして実行できます。データ分析の世界ではメジャーなツールらしいです。
とはいえブラウザ上でコード書くのも微妙だし、毎回ブラウザに移動するのも面倒なのでエディタ上で完結できないか調べたところ、 拡張機能を使ってVSCode上でも実行結果を表示することができるようなので、今回はその環境を構築しました。
こんな感じ
今回はWindowsでやってみましたがたぶんMacとかLinuxでも同じかなと思います。
前提
上記の環境はすでに整っているものとします。入ってない場合はググって適当にインストールしてください
環境構築
Jupyterのインストール
anacondaの仮想環境(Anacondaのcondaコマンドによる仮想環境の使い方のまとめ - minus9d's diary)を入れている場合は不要です。
VSCode上でTerminalを開きます。標準の場合Ctrl+Shift+Pを押し、「python create terminal」でPythonのターミナルパネルを出します。使用するPythonを選択して以下のコマンドを実行します。
# pipでインストール(anacondaを入れている場合は不要) python -m pip install jupyter or pip install jupyter # テスト > jupyter notebook [I 03:22:50.412 NotebookApp] Serving notebooks from local directory: C:\Users\@@@@ [I 03:22:50.413 NotebookApp] 0 active kernels [I 03:22:50.413 NotebookApp] The Jupyter Notebook is running at: (略)
ワークスペースディレクトリの作成
どこかよしななところに開発用のディレクトリを作成します。今後の設定はこのディレクトリのみ有効になるので、環境が違っても安心です
Jupyterのタスク(バックグラウンド実行環境)の設定
タスク>タスクの構成
テンプレートからtasks.jsonを生成
Others 任意の外部コマンドを実行する例
と進めます。
以下の内容をtasks.jsonに記述します。
"cwd": "R:\\test"
の部分は先程作った開発ディレクトリのパスを指定してください。
{ "version": "2.0.0", "tasks": [ { "label": "Run Jupyter Notebook", "type": "shell", "command": "cmd.exe", "args": [ "/C", "'jupyter notebook'" ], "group": "none", "options": { "cwd": "R:\\test" }, "problemMatcher": [] } ] }
Mac/Linuxの場合は、commandの部分をbash
、argsの部分を
"args": [ "-c", "'jupyter notebook'" ],
になるのかなあと思いますが未検証です(検証後追記します)
参考:VSCodeのタスクでjupyter notebookを起動する - Qiita
また、anacondaの仮想環境で実行したい場合はargsの部分を以下のように記述すればOKです。
"args": [ "/C", "'C:\\Users\\[ユーザー名]\\Anaconda3\\Scripts\\activate [仮想環境名] & jupyter notebook'" ],
Jupyterの実行
記述が終わったらタスクの実行をします。
Ctrl+Shift+Pで「task run」と検索して「タスク:タスクの実行」を選ぶ
「Run Jupyter Notebook」を選ぶ
するとJupyterが起動します。選択部分のURLが必要になるのでコピーします。
Ctrl+Shift+Pで「jupyter enter」と検索し、「Jupyter: Enter the url~」を選ぶ
先ほどコピーしたURLを貼り付けてEnter
これで環境は整いました。
(Option)キーバインドの設定
実行を楽にしたい場合はキーバインドの設定をします。
Ctrl+Shift+Pで「shortcuts」と検索し「基本設定:キーボードショートカットを開く」を選ぶ
高度なカスタマイズを行うには~の keybindings.json を押す
次のように入力し、保存
[ { "key": "ctrl+e ctrl+j", "command": "jupyter.execCurrentCell", "when": "editorTextFocus" } ]
keyのところはご自由にどうぞ
実行してみる
ディレクトリの中に pythonファイルをつくって、以下を記述。 matplotlibやnumpyがない場合はエラーになります
#%% import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np x = np.linspace(0, 20, 100) plt.plot(x, np.sin(x)) plt.show() #%% print("Hello")
うまく言っている場合は #%%
の直前に Run cell
とでていると思います。
#%%
で区切られた部分が1つのセクションとなるので、その中のどこでも良いのでカーソルを移動し、
Ctrl+Shift+Pから「Jupyter run cell」を実行します。(キーバインドの設定をした場合はそれを押せばOK)
カーソルが上のセクションを指定している場合はグラフが表示され
下を指定している場合はHelloが出力されます。
matploitlibなどがない場合はModuleNotFoundErrorとなりますが、ひとまずこれで実行できるようになりました。
SyslinuxでUSBメモリからWindowsインストールメディアを起動する
大学のメディアを使うときにちょっと詰まったのでメモ
コピペでできるように書いておきます
USBメモリ/インストールメディアに限定した話ではないけど、よく使うのがUSBメモリなのでとりあえずタイトルはこれで。
Arch Linuxで作ります。Ubuntuとか他のLinuxでも同じ感じでできるはず
必要なもの:
環境設定(Arch)
$ sudo pacman -S syslinux $ sudo pacman -S dosfstools # mkfs.vfat用 $ sudo pacman -S parted # fdiskでもOK
USBのフォーマットとパーティショニング
まずUSBメモリを特定する。適当に以下のコマンドを駆使して目星をつける。
$ sudo fdisk -l $ lsblk $ dmesg # USBを挿してすぐに見てみる
今回は/dev/sdkがUSBでした。
次にフォーマットとパーティショニング。partedを使う。
USBの中身は完全に消去されるので注意
$ sudo parted /dev/sdk (parted) p (parted) mklabel msdos (parted) mkpart primary fat32 0% 100% (parted) set 1 boot on (parted) p (parted) quit
ブートフラグを立てておく。
作成した/dev/sdk1をfat32でフォーマット
$ sudo mkfs.vfat /dev/sdk1
インストールメディアの書き込み
USBメディアとisoメディアをマウントしてisoのファイルをUSBにコピー。
$ sudo mkdir /mnt/{iso,usb} $ sudo mount -o loop ~/path_to_iso/Win_Installer.iso /mnt/iso $ sudo mount -o rw /dev/sdk1 /mnt/usb $ sudo cp -r /mnt/iso/* /mnt/usb/
おそらく/mnt/usb/boot/ができているはず...
Syslinuxをいれる
Syslinuxの本体のコピーとインストール
$ sudo mkdir /mnt/usb/boot/syslinux $ sudo cp -r /usr/lib/syslinux/bios/*.c32 /mnt/usb/boot/syslinux/ $ sudo extlinux --install /mnt/usb/boot/syslinux
これだけでは起動できないのでmbrを書き込む
$ sudo dd if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sdk bs=440 count=1 conv=notrunc
設定ファイル(syslinux.cfg)がないので作成する
$ cd /mnt/usb/boot/syslinux/ $ sudo vim syslinux.cfg --------- vim --------- PROMPT 1 TIMEOUT 30 DEFAULT menu.c32 LABEL BOOTMGR MENU LABEL ^Windows-installer COM32 /boot/syslinux/chain.c32 APPEND fs ntldr=/bootmgr -----------------------
Windowsは/bootmgrを呼び出す必要があるみたいなので、chain.c32のオプションのntdlrで指定する。
bootmgrはWindows Vista以降で使われるブートローダー。
chain.c32はチェインロードを可能にするモジュール。syslinuxからbootmgrへとチェインロードする。
fsはパーティションを検出してくれる(らしい。よくわからないけど、消すとbootmgrを読み込んだあとエラーで落ちた)
ntldrはWindowsのブートローダーをロードするchain.c32のオプション。
Comboot/chain.c32 - Syslinux Wiki
あとかたづけ
$ cd $ sudo umount /mnt/usb $ sudo umount /mnt/iso
これで終了 qemu-KVMでは無事インストーラーが起動しました。 boot:が表示されて3秒後に起動するけど、起動しない場合はmenuと打ってみるといいかも?
MDwikiをOwncloudと連携させてWebで編集できるようにした
MDwikiというMarkdownで書けるwikiをOwncloudと連携させて、ファイルをWeb上で編集できるようにした。ついでに認証もつけた。
MarkDownで書けてWebで参照できる自分(+少人数グループ)用のメモシステムが欲しいということで、今まではDokuwikiを使用していたのですが、Dokuwikiだと少し不便なところが多く、管理も面倒な感じでした。
そこで、Markdownで書けてデザインも綺麗なMDwikiを使ってみようかなと思ったのですが、MDwikiはファイルベースのwikiで手軽に編集できないと言う欠点がありました(毎回アップロードが必要なのが面倒...)。
DropboxやGoogleDrive上において使用するという方法もありましたが自分のドメインを使いたいので、今回はOwncloud上にMDwikiを置いて、Owncloudのファイル編集機能を使用して編集できるようにしました。
ついでにnginxを使用して簡単な認証(basic)をつけました。
とくに特別な設定はしていないので簡潔に。
概要
今回はMDwiki+Owncloud+Nginx(SSL)を使用しました。Nginxを使用しましたがApacheでも大丈夫と思います。
流れとしては、Nginxの導入→Owncloudの構築→MDwikiの設置と言った感じ。
長くなるので細かなインストールは省きます。
Nginxの導入 & Owncloudの導入
インストールは各OSによって異なるので省略。 普通にインストールすればOK。
Owncloudで認証が必要なので、SSLが必須。オレオレでもいいのでつけておく。
ここで、Owncloudのデータ保存ディレクトリを覚えておく。ここでは/home/owncloud/data/
にします。
MDwikiの導入
構築が終わったら、Owncloud上にMDwiki用のディレクトリを作成。 その中にOwncloud上からMDwikiを突っ込む。
Releases · Dynalon/mdwiki · GitHub
mdwiki.html以外を削除して、mdwiki.htmlをindex.htmlにリネーム。
確認用にindex.mdを作成。
Test page ======== hello ------
ディレクトリにシンボリックリンクを張る
ここで、Owncloud上のMDwikiディレクトリのパスを探す。
おそらくは[Owncloudデータディレクトリ]/[Username]/files/MDwiki
あたりにあるかな?
$ cd /home/owncloud/data/ # Owncloudのドキュメントルート $ cd owncloud_user # Owncloudで作成したユーザー $ cd files/mdwiki $ pwd /home/owncloud/data/owncloud_user/files/mdwiki
webのドキュメントルートでシンボリックリンクの作成。
owncloud上のデータディレクトリをnginxのドキュメントルートから読み出せるようにする。
cd </path/to/DocumentRoot> ln -s /home/owncloud/data/owncloud_user/files/mdwiki mdwiki
これでOK
認証
htpasswdを作成
$ htpasswd -b -c .htpasswd user passwd
nginxの設定をいじる。
location ~ /mdwiki/ { auth_basic "wiki"; auth_basic_user_file /etc/nginx/.htpasswd; root /var/www/; index index.html index.htm index.php; }
これでhttp://example.jp/mdwiki/に接続すればbasic認証を求められるようになる。
ファイルの編集
owncloud上でファイル名をクリックする。
現在の最新版8.1.3だと標準で編集機能が付いているのでラク。ついてなければプラグインを入れましょう
とりあえずだけどコレでWebから編集できるようになった。
大事な文書書く場合はセキュリティも意識しないとだめかも。
TrendMicro CTF(TMCTF) 2015 Online Qualifier 解けた問題などWriteup
Trendmicro CTF 2015のOnline Qualifier(TMCTF)をやってみました。
大学の友人がCTFにやる気を出していたので、今回はいつものチームではなく大学の友人3人でチーム"sagume"として出ました。
結果としては700点ほどしかとれませんでしたが、大学の友人に教えたり教えられたりとワイワイやりながらやるCTFは楽しかったです。
以下Writeup
続きを読む1時間以内に解けなければプログラマ失格となってしまう5つの問題とやらをPythonで書いてみた
調べ物してたら見つけたので書いてみた。
1-3問までは簡単だけど4問から難易度が跳ね上がるという評価だったけど、itertoolsが強すぎて割とすぐ解けた。
モジュール使わず書こうとしたけど、時間内に書けなそうだったのでitertools使った。致命的に頭が悪い。
多分あっていると思うけど、テストケースが1つなのでなんとも言えない感。
プログラミング力つけなければいけないなと思いました。
1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に
コードはPython3です。
問題1
def m1_for(lst): s = 0 for l in lst: s += l return s def m1_while(lst): i, s = 0, 0 while i < len(lst): s += lst[i] i += 1 return s def m1_rec(lst): if len(lst) == 0: return 0 else: return lst[0] + m1_rec(lst[1:])
再帰とか久しぶりに書いた気がする
[1, 2, 3, 4, 5, 6, 7, 8, 9]
が45
になればOK
問題2
def m2(lst1, lst2): res = [] for l1, l2 in zip(lst1, lst2): res.extend([l1, l2]) return res
zip関数有能
['a', 'b', 'c'], [1, 2, 3]
が['a', 1, 'b', 2, 'c', 3]
になればOK
問題3
def m3(): res = [0, 1] for i in range(99): res.append(res[-2] + res[-1]) return res
再帰で書く方法がポピュラーなのかな?
[0, 1, 1, 2, 3, 5, 8, 13, 21, ... , 354224848179261915075]
であればOK
問題4
def m4(lst): import itertools combs = itertools.permutations(lst) results = [] for c in combs: value = int("".join([str(n) for n in c])) results.append(value) return max(results)
ここからちょっとだけ考える必要がある
はじめは先頭の数字でsortすればOKかなと思ってたけど、よく考えたら11, 12, 111, 112
みたいな2桁以上が複数入ってきた場合ダメだった。やるなら先頭だけでソートするんじゃなく、2桁目, 3桁目...も見てソートする必要がありそう。
今回はitertools.permiutations
でlistの順列を全て取り出して、その中で最大のものを出した。
[50, 2, 12, 9, 11, 111, 121, 0]
が950212121111110
になればOK(?)
- 追記:2015/09/24 18:51
早速赤い人から高速な解法があるよと教えていただいたので追記。
@dskzip 4問目、実は、入力される数字の個数が100個とかでもすぐ解9がでる方法があります(もちろん10^6桁の数字がいっぱいとかだときびしいですが
— まーす (@__math) 2015, 9月 23
l + r < r + lとなる部分を順番にswapしてソーティングするみたいです。
教えて頂いたまーすさんに圧倒的感謝
問題5
def m5(): import itertools operators = itertools.product(("+", "-", ""), repeat=8) for op in operators: exp = "" for i in range(1, 10): exp += str(i) if i != 9: exp += op[i - 1] if eval(exp) == 100: print(exp)
itertoolsサイコー
productで直積集合出して、文字列にしてevalしました。
答えは11通りらしい。
1+2+3-4+5+6+78+9 1+2+34-5+67-8+9 1+23-4+5+6+78-9 1+23-4+56+7+8+9 12+3+4+5-6-7+89 12+3-4+5+67+8+9 12-3-4+5-6+7+89 123+4-5+67-89 123+45-67+8-9 123-4-5-6-7+8-9 123-45-67+89
が出ればOK