DISTRICT 37

なにか

20161228アンテナ

自身のアンテナを書くのをマネしてみた。気が付いたらまた見直そう

アンテナ

今回はPython関係多めかな。

Jupyter Notebookの設定をする

JupyterNotebookの設定をする。導入はこちら

dragstar.hatenablog.com

Jupyter notebookをホストのブラウザで使用する

Ubuntu on Virtualboxで運用しているので、Jupyterとか使用する際にはゲスト側ではなく、ホスト側のブラウザで実行すると捗る。ということでJupyterを起動する際には以下のようにしていた。

  • ポートフォワードの設定

VMの設定→ネットワーク→NATアダプタ→ポートフォワーディング f:id:dragstarclassic:20161219102224j:plain

f:id:dragstarclassic:20161219102234j:plain

ポートフォワードの設定をしておく。これをしておくとホスト側のブラウザなどでポートを指定すると、ゲスト側のポートにフォワードしてくれる。下段がJupyter用で、上段がDjango用に設定している。Djangoについては今回関係ないので割愛。

  • jupyter notebook実行時のコマンド
cd my/favorite/notebook/directory
jupyter notebook --ip=0.0.0.0

ipのオプションを付けることでアクセス制限をかけることが出来る。「0.0.0.0」はアクセス制限なし。これを利用してホスト側のブラウザでJupyterを使う。以上でホスト側のブラウザでhttp://localhost:8888を打つとゲストで起動しているJupyterを使うことが出来る。

jupyter_notebook_config

ということで、jupyter notebookを使うときはいつも同じディレクトリで動かしているし、ipの指定もしている。ついでに件のコマンドを打つとゲスト側でブラウザが立ち上がってくる。使わないのに。ということでこれを制御する方法。

まずはコンフィグファイルの生成

jupyter notebook --generate-config

~/.jupyter/jupyter_notebook_config.pyが生成される。このファイルを編集して設定する。

  • ip指定

コンフィグファイルから「c.NotebookApp.ip」という文字列を探す。jupyterに設定できる項目はコメントアウトされているので、これを有効にするだけでいいようになっている。それでip指定は以下のように変更

c.NotebookApp.ip = '*'


同様に「c.NotebookApp.notebook_dir」という文字列を探す。これを指定することでいつも同じディレクトリで動かせる。

c.NotebookApp.notebook_dir = 'your/favorite/notebook/directory'


「c.NotebookApp.open_browser」という文字列を探して設定。jupyter起動後にブラウザは自動起動しなくなる。

c.NotebookApp.open_browser = False


他のコメントアウトされている項目を見るとそれなりに想像がつきそうだが、自分の場合はこんな感じで十分かと。他の設定項目に関して知りたいのであれば公式ドキュメントを見てもらうといい。

Configuration Overview — Jupyter Notebook 5.0.0.dev documentation

これで以下のようにシンプルにコマンドを打てば設定どおりにjupyterが使える。

jupyter notebook

実はこの設定ファイル云々は本来ならばサーバ用の設定となる。運用しているサーバでjupyterを起動し、その際の挙動を設定ファイルで制御するという形だ。なので設定次第で、スマホでjupyterなんてこともできるようになる。

Powershellでzipファイルを作る

WindowsエクスプローラとではファイルをZIPするには任意のファイル(またはフォルダ)をクリックして選択して、右クリののちにZIPしていると思われる。でもそういったGUIでの操作よりもCUIでできないものかと思った。

ZIPをCUIで作る

Windowsではcmd.exeではなく、powershellでできる。

  • 構文
Compress-Archive -Path <target file> -Destination <file name>
  • 基本形
Compress-Archive -Path a.txt -Destination archive.zip
  • フォルダを指定する
Compress-Archive -Path my_folder -Destination archive.zip
  • 拡張子を指定する場合
Compress-Archive -Path *.log -Destination archive.zip
  • 複数指定する場合
Compress-Archive -Path a.txt, my_folder, *.log -Destination archive.zip
  • cmd.exeから実行する場合
powershell Compress-Archive -Path *.txt -Destination archive.zip

この通りcmd.exeからもコマンドの前にpowershellをつけるだけで実行できるのでファイルをアーカイブするバッチが作れる。そもそもpowershellスクリプトを作ればいいのだが、それはそれ。あとは「zip」とかでエイリアスを作っておくのもいい。

Set-Alias zip Compress-Archive

このCompress-ArchiveコマンドレットはPowerShellV5からの導入なので、バージョンが低い場合は新しいのを入れる必要がある。

Powershellでリモート接続

WindowsでもCUIでリモート接続をしたいと思った。Powershellならできると聞いて早速試してみた。リモートデスクトップ接続しちゃえばいいじゃんなんてことは言わない!!

事前準備

まずは接続される側で設定が必要。PowerShellを起動してリモート接続をEnableにする。

Enable-PSRemoting

接続

接続する側でコマンドを打てば接続ができる。これは接続先としてcomputernameを指定するやり方。

Enter-PSSession -ComputerName <computername>

ファイルの編集

SSHならvimとかviとかエディタのコマンドを打ってファイルの編集が開始できるのだが、先方にvimが入っていたとしてもPowerShell内では動かなかった。ではどうすればいいのかということでそれ専用のコマンドを見つけた。

PSEdit <file-name>

ただし、「Windows PowerShell ISE」のv5以上でしかPSEditは動かなかったので注意。ということで、これでファイルの編集ができるようになった。接続後はPATHとかも先方の環境で通っているので、何かしらのEXEとか、設定済のタスクとかを先方の環境で実行ができる。

あとは

PowerShellをマスターしたいなぁ。でもほとんどはCMD.exeで事足りるんだよなぁ。

Rでクラスタ分析

前回記事と同じ内容をRで行う

dragstar.hatenablog.com

Rで実装

こちらもkmeansが外部ライブラリなしに利用できる。データとクラスタ数を渡すだけで結果が出る。

しかしggplot2は使わないでいると忘れる。適度にpythonとRを行ったり来たりしないとだめだなぁ。

Pythonでクラスタ分析

俺たちのirisでクラスタ分析を行う。

クラスタ分析とは

機械学習の一つで教師なし学習に分類される。データの特徴をプログラムが判定して、それぞれのクラスタに分けることが出来る。

クラスタリング分析は一般的にK-means法が使われる。データに対してまずは適当なクラスタに振り分けてその中心を計算する。その中心に対してそれぞれのデータがもっとも近い中心にクラスタを振り分けなおす。再振り分け後にその中心を計算し、、、と続けていき、中心があまり動かなくなってきたところで終了とする。つまりどういうことだってばよ?っていうのはこのサイトで視覚的に理解ができる。

tech.nitoyon.com

クラスタリングを行うことで、そのクラスタに属するデータがどのような傾向にあるかを調べることが出来る。 結果を受けてレコメンドやマーケティングなどにも適用することが可能だ。

Pythonで実装

scikit-learnにKMeansが用意されているのでそれを使う。基本的にデータとクラスタリング数をKMeansに渡すだけで結果が得られる。

最後の図にはクラスタリング後のデータに対してその中心地もプロットした。

どれくらいのクラスタ数にするか

これは完全に作業を行う人の主観がはいる。どれくらいのクラスタ数が適当なのか正しい答えはない。反対に言えば恣意的に分析結果を操作することが可能ともいえるので注意が必要だ。

とはいえ、これくらいでいいのではないかなという手法はある。「シルエット分析」と呼ばれている方法だ。そのシルエット分析に関してはscikit-learnの公式に説明があるので、参照するといい。

Selecting the number of clusters with silhouette analysis on KMeans clustering — scikit-learn 0.18 documentation

要は分類数に対してそれっぽく(できれば均等に)データが集まっていればそれがクラスター数の最適な値だということになるのだ。

DB2のautocommit設定

DB2は自動コミットがデフォルトでONになっているので、うっかり更新してしまって泣くこともしばしば。ということで自動コミット(auto-commit)の設定方法。

auto-commitのデフォルト設定

DDLでもDMLでもCLI実行時にauto-commmit関連の設定を変えることで対応ができる。 IBM Knowledge CenterによるとCLI実行時に、下記の通りにオプションを読み込んで設定するとの事。

  1. デフォルト・オプションを設定します。
  2. DB2OPTIONS を読み取って、デフォルトを一時変更します。
  3. コマンド行を読み取って、DB2OPTIONS を一時変更します。
  4. UPDATE COMMAND OPTIONS からの入力を、最終的な対話式一時変更として受け入れます。

デフォルト設定は以下のコマンドで確認できる

db2 ? options

確認するのにヘルプコマンドを使うのが気持ち悪いが、これで出てくる値がデフォルト。自動コミットはONとなっている。

オプション  説明                                       現在の設定
------  ----------------------------------------  ---------------
(略)
  -c    自動コミット                              ON
(略)

このデフォルト設定は頑張ったけどどうも変えられないので、2か3で対応したらいい。4はよくわからんので割愛。

DB2OPTIONSの設定

DB2環境変数としてDB2OPTIONSを設定することでデフォルトを上書きできる。なので、この対応でとりあえずは完了かと。

まずはDB2OPTIONSの確認。

db2 list command options

DB2OPTIONSの確認とか言いながらcommand optionsと打つのがまた気持ち悪い。

オプション  説明                                       現在の設定
------  ----------------------------------------  ---------------
(略)
  -c    自動コミット                              ON
(略)

変更前ならデフォルト設定と同じ値が設定されているはず。次のコマンドでこの値を更新する。

db2set DB2OPTIONS=+c

これで自動コミットをOFFに設定できる。DB2OPTIONS=に続いた「-c」でONにして「+c」でOFFにするというまたまた直観的ではない気持ち悪い設定。これでDB2OPTOINSを確認すると確かに自動コミットがOFFになっているのがわかる。

オプション  説明                                       現在の設定
------  ----------------------------------------  ---------------
(略)
  -c    自動コミット                              OFF
(略)

コマンド発行時に設定

例えばUPDATEのSQLとかを書く時に設定ができる。ここでDB2OPTIONで設定した値をさらに上書きできる。

db2 +c update your_table set cl1 = 'foo'

updateの前に「+c」を付けることで自動コミットをOFFにできる。DB2OPTIONSと同様に「-c」で自動コミットをONにすることも可能。実質ここの設定が王様になるので本来はSQLを打つ時にこれを設定すクセをつけるべきなんだろうと思う。まぁこれはSQLにおけるDB2の方言なので、他のRDBMSに応用できないから別にいいですね。

auto-commitに限らず他のオプションも同様の対応でいいかと。