銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

Octave-Forge for Windows をインストールしてMinGW / MSYSから利用する

MinGW用(?)Octave-Forge for Windows を、Windows 10 にインストールして、MSYS(GitHub for WindowsについてるGitBash)で利用できるようにセットアップしたので、その手順を書いておきます。

f:id:takamints:20160626213022p:plain
photo credit: I23 - SPANning an octave via photopin (license)

しかし、ほとんど Windowsで利用するための手順であって、MinGW / MSYSに関連するのは、PATHとエイリアスの設定だけです。どこがどうMinGW向けなのか、いまだによくわかりませんが、まあいいです。

関係ないけど、いまだにMinGWとMSYSの関係がイメージとして把握できていないので、こういう記事でトンチンカンなことを書いていないか心配です。毎日使っているのにね。

ITエンジニアのための機械学習理論入門
技術評論社 (2015-10-17)
売り上げランキング: 2,235

ところで、Octaveってナンデスカ?

OctaveGNUフリーソフトウェアで、MATLAB互換の数値演算向け高水準プログラミング言語です。 MATLABは結構お高いのですが、Octaveは無料で利用可能です。

強力な行列演算の機能を備えていて、対話的にも利用できますから、とっても便利。

昨今世間を席巻している画像処理や機械学習人工知能など、行列演算に依存するアルゴリズム開発のプロトタイピングに利用しやすいというわけです。

OpenCVやNumpy等、行列を扱う各種ライブラリでも、似たような関数名が使えます(zerosやeye等)、使い方を覚えておいて損はないと思います。 理系の学生さんとかは私なんかが言うまでもなく使えるのだとは思いますが。

スタンフォード大学機械学習の講義でも使います

昨年(2015年)一部界隈で話題になったCourseraMOOCスタンフォード大学のMachine Learningの講義でも、MATLABOctaveを使用するのが前提です。MATLAB/Octaveで課題に取り組んで、コマンド打ってオンラインで提出するシステムになっていました。

※ しかし、Windows版のOctaveではオンラインでの課題提出機能にバグがあるらしく、Windowsユーザーが受講するには講義中だけ特別に無料利用できるMATLABを使っていました。 てことで今回、講義履修後一年近く経過して、テキスト使って復習したいと思いまして、やっぱりOctave入れなきゃね、となったわけです。

第一人者もお薦めです

CourseraのCEOであり、Machine Learningの第一人者でもある同講義の講師、Andrew NG 先生によれば、「まずはアルゴリズム(演算内容)をMATLAB/Octaveで確認すべし」とのことですよ。

他の開発言語でも行列演算は行えますが、アルゴリズムの開発に集中するために、MATLAB/Octaveを使いなさいと。格段に効率が上がるからと。

じゃあ、Octave-Forgeってなに?

実はよく知りませんでした(笑)

ダウンロードページには、「A collection of packages providing extra functionality for GNU Octave」と書いてあるので、GNU Octaveのための追加機能を提供しているパッケージを集めたものということでしょう。

ということで、インストール手順はこちらです

取り立てて難しいことはなく、敢えて言うなら英語でズラズラ書いてあるのと、ファイルの説明が長い点。 それからWindows 10についての言及が無かったところ。

作業は、圧縮ファイルをダウンロードして、フォルダに展開、実行モジュールへのショートカットを作れば、Windowsから利用するだけなら、ほぼ完了。 Windows 8 以降なら、コマンドラインスイッチの追加設定が必要ですね。

そして、繰り返しになりますが、MinGW / MSYS向けには、PATHの設定とエイリアス

ということで、詳細手順は以下のメニューでレッツゴー

  1. 事前準備:7-Zipのインストー
  2. 圧縮ファイルのダウンロード
  3. セットアップフォルダの作成
  4. 圧縮ファイルの展開
  5. Octave本体のファイルをコピー(もしくは移動)
  6. ショートカットの作成
  7. Windows 8 / 10でのコマンドラインスイッチの追加
  8. ショートカットのアイコン指定
  9. Octave-forge パッケージのコピー
  10. Octave-forge パッケージのビルド
  11. 起動時ワーニングの抑制
  12. オプショナルだが推奨される(?) エディタの設定

1.事前準備:7-Zipのインストー

ダウンロードする圧縮ファイルが、拡張子が7z7-Zipですので、必要な人は、7-Zipのダウンロードページから、お使いのシステムに応じたものをインストールしておきましょう。

2.圧縮ファイルのダウンロード

Octave 3.6.4 のダウンロードページから、 以下の2つをダウンロードします。

3.セットアップフォルダの作成

C:\Octaveというフォルダを作ります。実際にはどのような名前でも良いと説明書に書いてありますが、圧縮ファイルに入っているショートカットなどが、このフォルダを参照してるっぽいので、なるべくならこれに従ったほうが良いと思います。

4.圧縮ファイルの展開

ダウンロードした2つの7zC:\Octave以下にディレクトリごと展開します。以下のようになってるはず。

C:\Octave\
  +-- Octave3.6.4_gcc4.6.2_20130408\
  |    +-- Octave3.6.4_gcc4.6.2\
  |    +-- Octave3.6.4_gcc4.6.2(ショートカット)
  |    +-- octave3.6.4_gcc4.6.2_docs(ショートカット)
  |    +-- Octave3.6.4_gcc4.6.2_libblas_readme.txt
  |    +-- Octave3.6.4_gcc4.6.2_readme.txt
  +-- Octave3.6.4_gcc4.6.2_pkgs_20130402\
       +-- Octave3.6.4_gcc4.6.2\
       +-- Octave3.6.4_gcc4.6.2_pkgs_list.txt
       +-- Octave3.6.4_gcc4.6.2_pkgs_readme.txt

5.Octave本体のファイルをコピー(もしくは移動)

この時点でC:\Octave\以下に2つのフォルダがあって、そのどちらにも、Octave3.6.4_gcc4.6.2というサブフォルダがありますね。

このうち、Octave3.6.4_gcc4.6.2_20130408\Octave3.6.4_gcc4.6.2C:\Octave\の直下へフォルダごとコピー(または移動)します。

ここでインストールフォルダは以下のようになっているはず。

C:\Octave\
  +-- Octave3.6.4_gcc4.6.2\
  |    +-- bin\
  |    +-- doc\
  |    +-- etc\
  |          .
  |          .
  |          .
  |
  +-- Octave3.6.4_gcc4.6.2_20130408\
  |    +-- Octave3.6.4_gcc4.6.2\(移動したならこれはない)
  |    +-- Octave3.6.4_gcc4.6.2(ショートカット)
  |    +-- octave3.6.4_gcc4.6.2_docs(ショートカット)
  |    +-- Octave3.6.4_gcc4.6.2_libblas_readme.txt
  |    +-- Octave3.6.4_gcc4.6.2_readme.txt
  +-- Octave3.6.4_gcc4.6.2_pkgs_20130402\
       +-- Octave3.6.4_gcc4.6.2\
       +-- Octave3.6.4_gcc4.6.2_pkgs_list.txt
       +-- Octave3.6.4_gcc4.6.2_pkgs_readme.txt

Windows 7 で単に使うだけなら、この時点で、C:\Octave\Octave3.6.4_gcc4.6.2\bin\octave.exeを実行すれば使えます。残りの手順は、ショートカットを作ったり、ショートカットのアイコンを設定したりという手順です。

※ ちなみに、セットアップが完了したら、Octave3.6.4_gcc4.6.2_20130408Octave3.6.4_gcc4.6.2_pkgs_20130402の2つのフォルダは丸ごと消してかまいません。

6.ショートカットの作成

ということで、任意の場所に Octave の実行ファイルへのショートカットを作成します。

Octave の実行ファイル C:\Octave\Octave3.6.4_gcc4.6.2\bin\octave.exeを右クリックして、コンテキストメニューから「ショートカットの作成」を選択して、あとは任意の場所へ移動します。 とりあえずデスクトップでいいと思います。

f:id:takamints:20160626173232p:plain

7.Windows 8 / 10でのコマンドラインスイッチの追加

Windows 8では、対話式のコマンドラインの入力機能がうまく動かないそうで、ショートカットにコマンドラインスイッチ(オプション)の設定が必要です。 Windows 10でも同様です。

上で作ったショートカットを右クリックして、[プロパティ]を選択して、リンク先の最後にスペースを空けて、-i --line-editing と追加します。

f:id:takamints:20160626173304p:plain

これで対話式のコマンドラインの編集機能が正しく動作するらしいです。

8.ショートカットのアイコン指定

動作にはまったく関係ありませんが、ショートカットのアイコンをOctaveのものに変更します。

「アイコンの変更」をクリックして、
f:id:takamints:20160626222228p:plain

C:\Octave\Octave3.6.4_gcc4.6.2\doc\octave\iconsのアイコンファイルを指定します。
f:id:takamints:20160626222311p:plain

アイコン選んで「OK」「OK」でOKです。
f:id:takamints:20160626222434p:plain

9.Octave-forge パッケージのコピー

次に、Octave3.6.4_gcc4.6.2_pkgs_20130402\Octave3.6.4_gcc4.6.2C:\Octave\の直下へフォルダごとコピー(または移動)します。

フォルダの見た目は特に変わりませんね。

C:\Octave\
  +-- Octave3.6.4_gcc4.6.2\
  |    +-- bin\
  |    +-- doc\
  |    +-- etc\
  |          .
  |          .
  |          .
  |
  +-- Octave3.6.4_gcc4.6.2_20130408\
  |    +-- Octave3.6.4_gcc4.6.2\
  |    +-- Octave3.6.4_gcc4.6.2(ショートカット)
  |    +-- octave3.6.4_gcc4.6.2_docs(ショートカット)
  |    +-- Octave3.6.4_gcc4.6.2_libblas_readme.txt
  |    +-- Octave3.6.4_gcc4.6.2_readme.txt
  +-- Octave3.6.4_gcc4.6.2_pkgs_20130402\
       +-- Octave3.6.4_gcc4.6.2\(移動したならこれはない)
       +-- Octave3.6.4_gcc4.6.2_pkgs_list.txt
       +-- Octave3.6.4_gcc4.6.2_pkgs_readme.txt

10.Octave-forge パッケージのビルド

実はこの部分について、ちゃんと理解していないのですが、「Octaveを使ってMinGW用パッケージをビルドして、Octave起動時に自動的に読み込むように設定するそうです(棒読み)」

上で作ったショートカットをダブルクリックして、Octaveを起動して、以下の5つのコマンドを実行します。 不要なものもあるようですが、とりあえず全部実行して問題は発生しませんでした。

pkg rebuild -auto
pkg rebuild -noauto ad
pkg rebuild -noauto nan
pkg rebuild -noauto gsl
pkg rebuild -auto java

11.起動時ワーニングの抑制

これまでの手順で、ほとんどの設定が完了していますが、この時点で実行すると、大量のワーニングが出ます。

このワーニングは、統計パッケージのfstat関数に関するものらしく、古くて使用されないfstatも多重定義されているというもので、無視してよいと説明されています。

抑制するには、octave起動時に実行されるスタートアップファイルC:\Octave\Octave3.6.4_gcc4.6.2\share\octave\site\m\startup\octavercに、以下の一行を付け加えます。場所はとりあえずプロンプト設定の直後としました。

## System-wide startup file for Octave.
##
## This file should contain any commands that should be executed each
## time Octave starts for every user at this site.

more off
PS1('octave:\#> ')
## ワーニング抑制
warning('off', 'Octave:shadowed-function')

これで大量のワーニングは抑制されましたが、まだ2つほどワーニングが出ています。 この2つは、ワーニングの情報が表示されないので、どうやって抑制してよいかわかりませんでした。ま、2つなので我慢してます。

12.オプショナルだが推奨される(?) エディタの設定

オプショナルですが推奨されるエディタの設定です。 こちらもスタートアップファイルC:\Octave\Octave3.6.4_gcc4.6.2\share\octave\site\m\startup\octavercに設定します。 エディタとしてはNOTEPAD++が推奨されているみたいで、コメントを外せばいいよとされていますが、私はKaoriyaさんのGvimを使っているので以下のように設定しました。

## Uncomment and change any of the following lines for your preferred editor
## EDITOR('C:\\Program Files (x86)\\Notepad++\\notepad++.exe');
## EDITOR('C:\\Program Files\\Notepad++\\notepad++.exe');
EDITOR('C:\\Program Files\\vim74-kaoriya-win32\\gvim.exe');

ただ、実際この設定が、どこに効いてくるのか知りません。


お疲れ様です。以上で設定完了です。

あとは、MSYSでC:\Octave\Octave3.6.4_gcc4.6.2\binにPATHを通して、Windows 8 / 10のユーザーならば ~/.bash_profile.bashrcで、alias octave=octave -i --line-editingと、エイリアスを設定しておけば便利に使えます。

以下、5x5の魔法陣を表示してみました。やあ、数学は美しいですね。

$ octave
GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "i686-pc-mingw32".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

warning: gmsh does not seem to be present some functionalities will be disabled
warning: dx does not seem to be present some functionalities will be disabled
octave:1> magic(5)
magic(5)
ans =

   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9

octave:2>

リンク

ダウンロードサイト

WPFのDataGrid:カラムの表示・非表示をバインディングで切り替える

WPFのDataGridで、特定の列の表示・非表示をバインディングで切り替える方法を書いておきます。

f:id:takamints:20160614163925p:plain
photo credit: National Building Museum via photopin (license)

当初、「Visibilityをバインドするんでしょ?」と、簡単にやってみたけど無理でした。 調査の結果「プロキシー(代替)オブジェクトで中継する」と。 「なんのこっちゃ」と思いながらも試行錯誤。どうにか機構を把握して、自力で書けるようになりました。

ここでは、DataGridTextColumnVisibilityCheckBoxIsCheckedへプロキシを介してバインドしていますが、 他のバインディングターゲットにも適用できると思います。

作って覚えるVisual C# 2015 デスクトップアプリ入門
荻原 裕之 宮崎 昭世
秀和システム
売り上げランキング: 24,773
.NET開発テクノロジ入門2016年版Visual Studio 2015対応版
五十嵐 祐貴 生形 可奈子 大田 一希 古賀 慎一 酒井 達明 芝村 達郎 田淵 義人
日経BP
売り上げランキング: 11,454

以下、チェックボックスによって切り替えるコードです。XAMLだけで出来るのですね。

MainWindow.xaml

gist.github.com

XAMLの基礎については、こちら(↓)もご参考に。

takamints.hatenablog.jp

コードの説明

  • 12~13行目: BooleanからVisibilityの値へ変換するコンバーターを宣言しています。チェックボックスのIsCheckedをVisibilityへ変換するためのものです。

  • 15~16行目<FrameworkElement x:Key="ProxyColumnVisibility" DataContext="{Binding Path=IsChecked, ElementName=checkBoxShowColumn}"/>
    GridのResource内に、DataContextをCheckBoxのIsCheckedへバインドしたFrameworkElementを宣言。

  • 20~21行目<ContentControl Visibility="Collapsed" Content="{StaticResource ProxyColumnVisibility}"/>
    非表示にしたContentControlのContentに上で定義しているProxyColumnVisibilityを入れています。

  • 22~24行目<CheckBox x:Name="checkBoxShowColumn"
    FrameworkElementからバインドされるチェックボックスです。

  • 32行目Visibility="{Binding DataContext, Source={StaticResource ProxyColumnVisibility},Converter={StaticResource BooleanToVisibilityConverter}}"
    Visibilityを、ProxyColumnVisibilityのDataContextへバインド。

参考にさせていただいたURL

以下のサイトにお世話になりました。ありがたい。

いくつになってもお勉強

WPFXAMLも年に一度、数か月程しか使わないので、毎年「ややこしいわーわけわからんわー」から始まって、同じところでつまづいて、調べなおして「へぇー」とか言って、そのうち「うわ、これ便利やん」にたどり着く感じ。

系統立てた知識がないのが問題かなと。これを機会に明快な理解を試みようと思っています。

いくつになってもお勉強です。

関連情報(MSDNへのリンク)

「FrameworkElementって何者なの?」「てかResourceってなに?」「ContentControlは必要?」とか、フツフツと沸いてくる疑問に、うまく答えられないワタシがいる。なので、以下にMSDNWPF関連のリンクを並べておきます。そのうち自分で調べる用です。

WPF・MVVM関連記事はこちら:

takamints.hatenablog.jp

takamints.hatenablog.jp

takamints.hatenablog.jp

ShellでZIPの特定ディレクトリ以下全ファイルをUnzip

CLIのunzipで、ZIPファイルから特定ディレクトリ以下の全ファイルを取り出す方法の覚書き。

f:id:takamints:20160612171903p:plain
photo credit: A Bag of Colors via photopin (license)

GUIのツールだと何も問題ありませんが、シェルから使うunzip(Info-Zipのunzip?)では、取り出すファイルを全て指定する必要があるようです。数によっては現実的にちょっと無理。ひとつふたつならOKですけどね。

「なんでオプション無いのかねえ・・・」と、しばらく途方に暮れていたのですが、以下のようにして解決しました。

$ unzip -d Foo Foo.zip `zipinfo -1 Foo.zip | grep '^Path\\/To\\/Target'` 
  1. バッククォート内で、zipinfoコマンドを使って、全ファイル名を標準出力へ出力。-1オプションでファイル名(だけ)の出力。
  2. 同じバッククォート内で、パイプで標準出力をgrepへ渡して、正規表現で特定のパス以下のファイル名だけに絞り込み。
  3. その出力を、コマンド置換で、unzipのコマンドラインに展開して抽出。ここでは-dオプションは出力先ディレクトリを指定しています。無くてもいいけど念のため。

何が有り難いってバッククォートでのコマンド置換(標準出力をコマンドラインへ展開)。 さらに今回初めて知ったのですが、$(command) でも同じことらしいですね。

知ってるつもりでも、調べてみると、さらに深い発見があったりして、いくつになってもお勉強ですな。


エクストラクター ポイズンリムーバー AP011
エクストラクター
売り上げランキング: 230
bashクックブック
bashクックブック
posted with amazlet at 16.06.12
Carl Albing JP Vossen Cameron Newham
オライリージャパン
売り上げランキング: 574,097

参考

unzipとzipinfoのヘルプ出力。

$ unzip -h
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment only
  -v  list verbosely/show version info       -T  timestamp archive to latest
  -x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
  -n  never overwrite existing files         -q  quiet mode (-qq => quieter)
  -o  overwrite files WITHOUT prompting      -a  auto-convert any text files
  -j  junk paths (do not make directories)   -aa treat ALL files as text
  -U  use escapes for all non-ASCII Unicode  -UU ignore any Unicode fields
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
See "unzip -hh" or unzip.txt for more help.  Examples:
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
  unzip -p foo | more  => send contents of foo.zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
$ zipinfo -h
ZipInfo 3.00 of 20 April 2009, by Greg Roelofs and the Info-ZIP group.

List name, date/time, attribute, size, compression method, etc., about files
in list (excluding those in xlist) contained in the specified .zip archive(s).
"file[.zip]" may be a wildcard name containing *, ?, [] (e.g., "[a-j]*.zip").

   usage:  zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]
      or:  unzip -Z [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]

main listing-format options:             -s  short Unix "ls -l" format (def.)
  -1  filenames ONLY, one per line       -m  medium Unix "ls -l" format
  -2  just filenames but allow -h/-t/-z  -l  long Unix "ls -l" format
                                         -v  verbose, multi-page format
miscellaneous options:
  -h  print header line       -t  print totals for listed files or for all
  -z  print zipfile comment   -T  print file times in sortable decimal format
  -C  be case-insensitive     -M  page output through built-in "more"
  -x  exclude filenames that follow from listing