10.27.2013

Emacs: How to Insert Same String at the Beginning of Each Line

Emacs: 複数の行頭に文字を挿入する方法

  • まずリージョンを選択

    C-SPACE -> カーソル移動
    (文書全体を選択する場合は C-x h)
     
  • 各行の先頭にスペースを挿入する場合は

    C-x C-i
     
  • 各行の先頭に特定の文字列を挿入する場合は

    C-x r t

How to Install GNU Octave

GNU Octave のインストール方法

 

Machine Learning | Coursera の Week 2 の課題のため、Octave をインストールする。

Octave とは、フリーの数値解析ソフトウェア(プログラミング言語)。
行列の計算やグラフ描画(gnuplotと連携して可視化)が簡単にできることが特徴。

 

Windows

こちらからインストーラをダウンロードして実行。
Octave Forge - Browse /Octave Windows binaries at SourceForge.net 

Coursera の手順に書かれていたのは Octave-3.2.4_i686-pc-mingw32_gcc-4.4.0_setup.exe だった。

インストーラの Choose Components の画面で、"image" パッケージを追加するとよい。

 

Mac

こちらから Mac 用のディスクイメージをダウンロードしてマウント。
Octave Forge - Browse /Octave MacOSX Binary at SourceForge.net

最初、最新版(3.7.7)を入れたらグラフ表示でプログラムが落ちてしまう状態になったので
古いバージョン(3.4.0)をインストール。 

  • 事前に X.11 (XQuartz) をインストール
  • 例によって Octave.app を Applications フォルダにコピー。
  • 次に Gnuplot をインストールするのだが、ここに書いてあるとおり、MacOS Lion 以降だと実行時にエラーとなってしまう。
    Octave Forge - Browse /Octave MacOSX Binary/2011-04-21 binary of Octave 3.4.0 at SourceForge.net
  • Extras 配下の Gnuplot のディスクイメージもマウントし、Gnuplot.app を Applications フォルダにコピー。
  • シェルスクリプト /Applications/Gnuplot.app/Contents/Resources/bin/gnuplot をエディタで開き、
    「DYLD_LIBRARY_PATH」を「DYLD_FALLBACK_LIBRARY_PATH」に全て置換。
    (全部で4ヶ所。「=」の前後双方を置換する必要があるので注意。) 
  • .zshrc (.bashrc) にエイリアスを設定すると便利。
    alias octave="/Applications/Octave.app/Contents/Resources/bin/octave --persist --eval \"PS1('>> ')\""

 

実行例
octave-3.4.0:1> x=-5:5
x =

  -5  -4  -3  -2  -1   0   1   2   3   4   5

octave-3.4.0:2> y=2*x
y =

  -10   -8   -6   -4   -2    0    2    4    6    8   10

octave-3.4.0:3> plot(x,y)

Figure 1 

とりあえずグラフが描画できた。

10.15.2013

Algorithm: Bipartite Graph Matching

二部グラフの最大マッチング

 

output
[(0, 1), (1, 0)]
[(0, 1), (1, 0), (2, 2)]
[(1, 0)]
[(0, 1), (1, 0), (2, 2), (3, 4), (4, 3)]

10.14.2013

FizzBuzz Short Coding in Scala

Scala で FizzBuzz ショートコーディング

 

@lyrical_logical さんの素晴らしい資料からほぼ丸パクリ。

FizzBuzz golf in Scala - Google ドライブ

 

max を使う事で 1文字短縮でき、66 Bytes で書けた。

10.05.2013

Getting Started with Elixir - New Functional Programming Language

関数型言語 Elixir (エリクサー) を触ってみた

Erlang VM 上で動作する新しい関数型言語 Elixir (エリクサー) 。

FFファンならずともテンションの上がるネーミングだが
Ruby ライクなシンタックスで、動的型付けのカジュアルFPを目指しているようだ。

とりあえず環境を整えて、Hello world するまでの記録。

インストール

1 Introduction - Elixir に従って作業すればOK。

  • Erlang (R16B 以上) のインストール

    パッケージをここからダウンロードして実行
    Download Erlang OTP | Erlang Solutions

  • Elixir のインストール

    とりあえず、Mac にインストール。
    手っ取り早くインストールするなら HomeBrew で。

    $ brew install elixir

    最新版を入れるなら、以下の手順。

    $ cd <インストール先>
    $ git clone https://github.com/elixir-lang/elixir.git
    $ cd elixir
    $ make test
    $ bin/elixir -v    # Elixir のバージョンが表示されればOK
    $ sudo make install
    

    /usr/local/bin 配下にコマンドへのリンクが作成された。

iex - インタラクティブ シェル

モダンな言語なので当然(?)、REPL が標準で付いている。

  • 起動
    $ iex
    Erlang R16B02 (erts-5.10.3) [source-b44b726] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
    
    Interactive Elixir (0.10.4-dev) - press Ctrl+C to exit (type h() ENTER for help)
    iex(1)>
  • Hello world
    iex(1)> "Hello Elixir!"
    "Hello Elixir!"
    iex(2)> "こんにちは エリクサー"
    "こんにちは エリクサー"
    iex(3)> 'こんにちは エリクサー'
    [12371, 12435, 12395, 12385, 12399, 12288, 12456, 12522, 12463, 12469, 12540]
    

    ダブルクオートで囲むと UTF-8 でエンコードされたバイナリとして、
    シングルクオートだと 1文字ずつの数値のリストとして認識される。

  • FizzBuzz

    手探り状態で書いてみた。もっと改善できるはず。

    f = fn
      x when rem(x, 15) == 0 -> "FizzBuzz"
      x when rem(x, 3) == 0 -> "Fizz"
      x when rem(x, 5) == 0 -> "Buzz"
      x -> to_string(x)
    end
    
    1..20 |> Enum.map(f) |> Enum.map(&1 <> "\n") |> IO.write
    

    文字列の連結(<>)が分からずに小一時間悩んだ。

    output
    iex:58: partial application without capture is deprecated
    1
    2
    Fizz
    4
    Buzz
    Fizz
    7
    8
    Fizz
    Buzz
    11
    Fizz
    13
    14
    FizzBuzz
    16
    17
    Fizz
    19
    Buzz

    警告が出たけど、解決策がすぐには分からない。

 

まとめ

Erlang も Ruby も慣れていない私にはかなり異次元の文法に見える。
とはいえ、Erlang の強力な機能を利用したプログラムを手軽に実装できるなら魅力的だ。

日本人は最後までエリクサーを使わないという定説もあるけど、やっぱりそれはもったいない。

 

References

Combinatorial Optimization: Merge-Sort Algorithm

組合せ最適化: アルゴリズム 1.2 マージソートアルゴリズム

B.コルテ/J.フィーゲン 著「組合せ最適化 理論とアルゴリズム 第2版」の例を Python で実装してみる。

 

output
[-2, -1, 0, 1, 2, 3, 4, 5, 90]
[-2, -1, 0, 1, 2, 3, 4, 5, 90]
[-2, -1, 0, 1, 2, 3, 4, 5, 90]
['ac', 'b', 'bb', 'bc', 'c', 'ca']
['ac', 'b', 'bb', 'bc', 'c', 'ca']
['ac', 'b', 'bb', 'bc', 'c', 'ca']
[0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]
[0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]
[0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]
identity が出てくるのが面白い。

10.04.2013

Combinatorial Optimization: Path Enumeration Algorithm

組合せ最適化: アルゴリズム 1.1 パス列挙アルゴリズム

B.コルテ/J.フィーゲン 著「組合せ最適化 理論とアルゴリズム 第2版」の例を Python で実装してみる。

 

output
[0, 1, 2, 3]
[0, 1, 3, 2]
[0, 2, 1, 3]
[0, 2, 3, 1]
[0, 3, 1, 2]
[0, 3, 2, 1]
[1, 0, 2, 3]
[1, 0, 3, 2]
[1, 2, 0, 3]
[1, 2, 3, 0]
[1, 3, 0, 2]
[1, 3, 2, 0]
[2, 0, 1, 3]
[2, 0, 3, 1]
[2, 1, 0, 3]
[2, 1, 3, 0]
[2, 3, 0, 1]
[2, 3, 1, 0]
[3, 0, 1, 2]
[3, 0, 2, 1]
[3, 1, 0, 2]
[3, 1, 2, 0]
[3, 2, 0, 1]
[3, 2, 1, 0]
120
(0, 1, 2, 3)
(0, 1, 3, 2)
(0, 2, 1, 3)
(0, 2, 3, 1)
(0, 3, 1, 2)
(0, 3, 2, 1)
(1, 0, 2, 3)
(1, 0, 3, 2)
(1, 2, 0, 3)
(1, 2, 3, 0)
(1, 3, 0, 2)
(1, 3, 2, 0)
(2, 0, 1, 3)
(2, 0, 3, 1)
(2, 1, 0, 3)
(2, 1, 3, 0)
(2, 3, 0, 1)
(2, 3, 1, 0)
(3, 0, 1, 2)
(3, 0, 2, 1)
(3, 1, 0, 2)
(3, 1, 2, 0)
(3, 2, 0, 1)
(3, 2, 1, 0)
(13, [(5, 2), (3, 3), (1, 1), (1, 4), (4, 8), (2, 10)])