19 Nov 2014, 13:53

Java での優先順位付きキューの使い方まとめ (PriorityQueue)

はじめに

優先順位付きキューのを PriorityQueue という. キューの中で最大 (最小) のものを抜き出す場合などに利用する.

1 年前は C++ で書いた

思いかえせば一年前, C++ で PriorityQueue の記事を書いた.

また, 1 年前の coursera の講義で, 自前で PriorityQueue の実装をした.

参考にした java コード:

使い方

Java では, 以下のライブラリを利用する.

宣言

優先順位は,いかの 2 つ指定方法がある.

  • 自然順位づけ
  • 自分で順位をつける

デフォルトでは小さい順で 取り出される.

import java.util.PriorityQueue;

関数

要素を追加する

pq.add (1);

先頭の要素を取り出す

最大 (または最小) の先頭を取り出します.

pq.poll ();

要素を調べる

// キューがからかどうかを調べる
pq.isEmpty ();

// 要素数をしらべる
pq.size ();

Sample

import java.util.PriorityQueue;

public class PriorityQueueSample {
    public static void main (String[] args) {

        // 宣言
        PriorityQueue pq = new PriorityQueue ();

        // 挿入
        pq.add (2);             
        pq.add (3);     
        pq.add (1);

        // 先頭の要素を取り出す
        System.out.println (pq.poll ());

        // キューがからかどうかを調べる
        System.out.println (pq.isEmpty ());     

        // 要素数をしらべる
        System.out.println (pq.size ());                                                     
    }
}

独自定義の順位づけ

Comparator を実装し, PriorityQueue 生成時に引数で渡す.

import java.util.PriorityQueue;
import java.util.Comparator;

public class PriorityQueueSample {
    public static void main (String[] args) {

        // 宣言
        PriorityQueue pq = new PriorityQueue (3, new MyComparator ());

        // 挿入
        pq.add (2);             
        pq.add (3);     
        pq.add (1);

        // 先頭の要素を取り出す
        System.out.println (pq.poll ());
        System.out.println (pq.poll ());
        System.out.println (pq.poll ());        
    }
}

class MyComparator implements Comparator {
    @Override
    public int compare (Object arg0, Object arg1) {
        int x = (int) arg0;
        int y = (int) arg1;

        if (x < y) {
            return 1;
        } else if (x > y) {
            return -1;
        } else{
            return 0;
        }
    }
}

Iterator の注意

これだと, 1, 3, 2 という順番で出力される.

PriorityQueue は, 取り出すときに優先順位ごとにとりだされるので, Iterator でまわしても, 順番どおりにならない.

import java.util.PriorityQueue;

public class PriorityQueueSample {
    public static void main (String[] args) {

        PriorityQueue pq = new PriorityQueue ();

        pq.add (2);             
        pq.add (3);     
        pq.add (1);

        for (Object i: pq) {
            System.out.println (i);
        }
    }
}

Special Thanks

18 Nov 2014, 13:45

Java のリフレクションでインスタンスやメソッドを動的生成する

リフレクションとは

リフレクションとは, プログラム実行中に, クラス名やメソッド名を動的に指定することができる技術.

以下, Wikipedia のソースをそのまま引用します.

// リフレクションなし
Foo foo = new Foo ();
foo.hello ();

// リフレクション
Class cl = Class.forName ("Foo");
Method method = cl.getMethod ("hello");
method.invoke (cl.newInstance ());

リフレクションのデメリット

リフレクションはカプセル化を壊す?

リフレクションを利用すると, クラス内部のメソッドやフィールドをみたり, フィールドを書き換えたりできるという, ハッカー的な機能.

こういうオブジェクト指向に反する機能は, ユーティリティクラスのメソッド呼び出しに効果的である.

リフレクションは遅い??

リフレクションは遅いということがいわれている.以下のサイトが参考になる.

  • リフレクションでのオブジェクトの作成はオーバーヘッドがほとんどない
  • メンバーフィールドにアクセスするのは遅すぎるのでやらないほうがいい.
  • メソッド呼び出しは 5 から 20 倍遅いので, 使う場合は注意する

コンパイル時の型チェックができない

リフレクションはプログラム実行時にメソッド呼び出し方法が決まるので, コンパイル時の事前型チェックができない.

リフレクションよりもインタフェースを選ぶ

Effective Java p233 にのっている助言.

Java でのリフレクション

java.lang.reflect というパッケージがある.

リフレクションでインスタンス生成

  • Class.forName (“クラス名”) で クラス生成
  • newInstance () で インスタンス生成
Class clazz = Class.forName ("Foo");
Foo foo = (Foo) clazz.newInstance ();

リフレクションでメソッド呼び出し

  • getMethod (“メソッド名”) でメソッド定義
  • invoke (object) でメソッド呼び出し
Foo foo2 = new Foo ();
Method method = foo2.getClass ().getMethod ("bar");
method.invoke (foo2);

Code

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class ReflectionSample {  
    public static void main (String []args) {  
        try {  
            Class clazz = Class.forName ("Foo");
            Foo foo = (Foo) clazz.newInstance ();
            foo.bar ();
        } catch (ClassNotFoundException e) {
            // クラスが存在しない
            e.printStackTrace ();  
        } catch (InstantiationException e) {
            // インスタンス作成不可
            e.printStackTrace ();  
        } catch (IllegalAccessException e) {
            // 呼び出し:アクセス違反, 保護されている         
            e.printStackTrace ();  
        }

        Foo foo2 = new Foo ();
        try {
            // 引数なし
            Method method = foo2.getClass ().getMethod ("bar");
            method.invoke (foo2);

            // 引数あり
            Method method2 = foo2.getClass ().getMethod ("pee", int.class);
            method2.invoke (foo2, 1);
        } catch (NoSuchMethodException e) {
            // メソッドが存在しない
            e.printStackTrace ();
        } catch (IllegalArgumentException e) {
            // 呼び出し:引数が異なる
            e.printStackTrace ();
        } catch (IllegalAccessException e) {
            // 呼び出し:アクセス違反, 保護されている
            e.printStackTrace ();
        } catch (InvocationTargetException e) {
            // ターゲットとなるメソッド自身の例外処理
            e.printStackTrace ();
        }
    }
}

class Foo {
    public Foo () {
        System.out.println ("Constructor is called");
    }

    public void bar () {
        System.out.println ("method is called");
    }

    public void pee (int i) {
        System.out.println (i);
    }
}

Special Thanks

17 Nov 2014, 14:46

Java でスレッドプールを実装してみた

はじめに

仕事でスレッドプールを利用する機会があるので, Java でスレッドプールをつかう方法を調べてみた.

Java には, JDK1.5 から ExecutorService という便利なライブラリがあるようだ.

スレッドプールとは

はじめに, スレッドプールについての一般的な説明.

スレッドプールとは, 複数のスレッドをあらかじめ作成して待機させておき, タスクが来たら待っているスレッドにタスクを割り当てて 処理を開始させる仕組み.

スレッドの作成と破棄は, それなりにオーバーヘッドがある. そこで, スレッドは暇な時に作成しておいて, 必要になったときにスレッドに処理を割り当てることで, コンテキストスイッチ程度の軽いオーバヘッドで済ますことができる.

また, システム内のメモリは有限なので, 無限にスレッドを作成することはできない. 一度に利用できるスレッド数を制限することで, システムのリソースを制限することができるようになる.

Java でのスレッドプール実装

Executors

Executors クラスは, ExecutorService 生成のための static ファクトリーメソッドをもつ ユーティリティクラス.

主に, 以下のメソッドを用いる.


newFixedThreadPool 指定数スレッドを確保 newSingleThreadExecutor 単一スレッドを確保 newSingleThreadScheduledExecutor 指定期間おきに実行するスレッド (単一スレッド) newScheduledThreadPool 指定時間おきに実行するスレッド


ExecutorService

ExecutorService キューをもつ,スレッドプール.

主に, 以下のメソッドを用いる.


execute タスクを送信する. submit タスクの計算結果や状態を取得するための, Future オブジェクトを返す. shutdown シャットダウンを実行. 以前に送信したタスクは実行, 新規タスクは拒否


ちなみに, Executor というものもある.

ExecutorService は Executor を継承している. Executor は execute メソッドしかもたない.

Execotor にコマンドパターンを実装したものが ExecutorService.

ちなみに

ちなみに, coursera の POSA でスレッドプールの Assignment がある.

Code

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.lang.Thread;

class SampleThreadPool {

  private static class Action implements Runnable {
    @Override
    public void run () {
      System.out.println ("Hello!!");
            try { Thread.sleep (1000);  } catch (InterruptedException e){}
    }
  }

  public static void main (String[] args) {
        // Create Single Thread Pool
    ExecutorService executor = Executors.newSingleThreadExecutor ();

        // Execute Tasks
    executor.execute (new Action ());
    executor.execute (new Action ());

        // End
    executor.shutdown ();
  }
}   

追記: 割り込み例外をあげる (2015/03/05)

割り込み例外をあげるには, 以下のような手順を踏む.

  1. execute () メソッドの代わりに submit () をコール
  2. future オブジェクトを取得
  3. future.cancel (true)
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.HashMap;
import java.lang.Thread;

class ThreadInteraptSample {

    private static class Action implements Runnable {
        public int id;

        public Action (int id) {
            this.id = id;
        }

        @Override
        public void run () {
            System.out.println ("id=" + id + " start!!");
            try {
                Thread.sleep (2000);
                System.out.println ("Time out!!");
            } catch (InterruptedException e){
                System.out.println ("Interrupted id=" + id);
            }
        }
    }

    // http://java.keicode.com/lang/multithreading-cancel.php
    public static void main (String[] args) {
        Future future1, future2, future3;

        // Create Single Thread Pool
        ExecutorService executor = Executors.newSingleThreadExecutor ();

        // Execute Tasks
        Action act1 = new Action (1);
        Action act2 = new Action (2);
        Action act3 = new Action (3);

        HashMap<Action, Future> map = new HashMap<Action, Future>();
        map.put (act1, future1 = executor.submit (act1));
        map.put (act2, future2 = executor.submit (act2));
        map.put (act3, future3 = executor.submit (act3));

        try {Thread.sleep (3000);} catch (Exception e) {}

        for (Action action: map.keySet ()) {
            if (action.id == 2) {
                map.get (action).cancel (true);
                break;
            }
        }

        executor.shutdown ();
    }
}

Bookmarks

17 Nov 2014, 14:25

Java のユーティリティクラスはシングルトンパターン/ フライウェイトパターンで実装する

はじめに

今日から仕事ではじめて Java の開発をはじめることになったので, とてもうれしい.

Java の常識あるあるのなかに, ユーティリティクラスというものがある. みんな当たり前のように話しているけれども, 自分は知らないので調べた.

ユーティリティクラスとは

以下の特徴をもつ.

  • いろんなところで繰り返し利用される処理をまとめたクラス.
  • インスタンス化されない.
  • すべてのメソッドは static で宣言される.
  • 状態を持たない処理をユーティリティにすることが多い.

C 言語 とかでよくライブラリと呼ばれているのを見かけたことがある. オブジェクト指向っぽくない. そんなことを考えたら, 同じような意見をちらほら発見した.

実現方法

メソッドには static をつける

static をつけることで, クラスをインスタンスすることなく メソッドを利用できる.

class SampleSingleton {
    static class SampleUtil {
        private SampleUtil () {} // インスタンス化を禁止するテクニック
        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }
    public static void main (String[] args) {
        System.out.println (SampleUtil.plus (1,1));
        System.out.println (SampleUtil.minus (2,1));        
    }
}

状態をもつ場合は, シングルトンパターンを適用する

なにかの値を保持する場合は, デザインパターンであるシングルトンパターンを利用する.

一般的なシングルトンパターンの実装方法は以下.

  • private な 定数に オブジェクトを保存
  • オブジェクトは getInstance () メソッドで取得

フライウェイトパターンで改良する

シングルトンパターンは フライウェイトパターンと合わせて利用されることがおおい.

特徴は,

  • private な 変数に オブジェクトを保存.
  • オブジェクトが存在すれば, getInstance で渡す. オブジェクトが存在しなければ, オブジェクトを作成して getInstance で渡す.

実装例

class SampleSingleton {
    static class SingletonUtil {
        private static final SingletonUtil INSTANCE = new SingletonUtil ();

        public static SingletonUtil getInstance (){ return INSTANCE; }
        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }


    public static void main (String[] args) {
        System.out.println (SingletonUtil.getInstance ().plus (1,1));
        System.out.println (SingletonUtil.getInstance ().minus (2,1));      
    }
}

または, Enum を利用するとという手もある. Effective Java の本では, この方法を推奨している.

class SampleSingleton {
    static public enum EnumUtil {
        INSTANCE;

        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }

    public static void main (String[] args) {
        System.out.println (EnumUtil.INSTANCE.plus (1,1));
        System.out.println (EnumUtil.INSTANCE.minus (2,1));     
    }
}

Special Thanks

16 Nov 2014, 14:31

エレガントな Effective Java の Builder Pattern を実装してみた

はじめに

Effective Java を読んでいたら, エレガントなコードを見つけたので思わずメモ.

引数がおおいオブジェクトを生成するとき….

王道は 2 つの方法がある.

テレスコーピング・コンストラクタパターン

  • コンストラクタの引数に情報を追加する方法.
  • 引数が増えるたびに, 異なる型のコンストラクタの作成が必要.
///////////////////////////////////////////
// テレスコーピング・コンストラクタパターン
///////////////////////////////////////////
public Hoge (int a, int b, int c, int d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
}

JavaBeans パターン

  • コンストラクタには, 引数を与えない.
  • 代わりに, setter を用意する.
/////////////////////
// Javabeans パターン
/////////////////////
public Hoge () {
    this.a = 0;
    this.b = 0;
    this.c = 0;
    this.d = 0;
}
public static void setA (int x) { a = x; }
public static void setB (int x) { b = x; }
public static void setC (int x) { c = x; }
public static void setD (int x) { d = x; }

エレガントな Builder パターン

最後に, エレガントな Builder パターン.

  • コンストラクタの引数には, Builder オブジェクトを渡す.
  • Builder オブジェクトの引数には必須の情報を渡す.
  • 任意の引数には, setter を用意する.

    エレガントな行はこれ.

Hoge hoge = new Builder (1,2).c (3).d (4).build ();

完全版のコードは以下.

class BuilderSample {

    public static class Hoge {
        private static int a, b; // should be set
        private static int c, d; // optional

        /////////////////////
        // Builder パターン
        /////////////////////
        private Hoge (Builder builder) {
            a = builder.a;
            b = builder.b;
            c = builder.c;
            d = builder.d;          
        }
    }

    public static class Builder {
        private static int a, b; // should be set
        private static int c, d; // optional

        public Builder (int a, int b) {
            this.a = a;
            this.b = b;
            this.c = 0;
            this.d = 0;
        }

        public Builder c (int x) { c = x; return this; }
        public Builder d (int x) { d = x; return this; }
        public Hoge build () { return new Hoge (this); }
    }

    public static void main (String[] args) {
        Hoge hoge = new Builder (1,2).c (3).d (4).build ();
    }

}

Gof とは違う??

最後に, Gof の Builder パターンとはすこし意味合いがことなるように, Effective Java ではつかわれているようだ.

16 Nov 2014, 06:10

Java で Command Pattern を実装してみた

はじめに

前回の続き.

コマンドパターン (Command Pattern) と Visitor Pattern で なにが違うのかよくわからなかったので, 比較しつつ, Command Pattern を実装してみた.

Command Pattern とは

動作を表現するオブジェクト. 動作とそれに伴うパラメータをカプセル化したもの.

特徴

  • Command オブジェクトは, 手続きに必要なパラメータの一時格納場所として便利. 関数呼び出しのためのパラメータを集めて, 後で使用するためにコマンドを保存しておくことができる.

  • 関数呼び出しのためのパラメータを集めて, 後で使用するためにコマンドを保存しておくことができる. 保存されたデータ構造に対する追加, 削除が可能になる.

  • コマンドの生成と実行のタイミングの分離.

Visitor パターンとの比較

わかりやすいように, Command ということばをここでは Visitor とする.

Visitor Pattern

オブジェクトの関係

  • Receiver は たくさん.
  • Visitor は 単一.

データと操作の関係

  • データは Visitor, 操作は Receiver がもつ.
  • Receiver は Visitor によって異なる操作をする.

Command Pattern

オブジェクトの関係

  • Receiver は 単一.
  • Visitor は たくさん.

データと操作の関係

  • データと操作は Visitor がもつ.
  • Receiver は Visitor によって同じ操作を実施する.

Code

前回の Visitor のコードを少し残しつつ, コードを改良してみた.

Invoker というコマンドを貯めておくデータ構造を追加した.

import java.util.Iterator;
import java.util.Stack;

class CommandSample {

    ////////////////////
    // Data
    ////////////////////
    abstract public static class Command {
    public void setReceiver (Receiver receiver){}
        public abstract void execute ();
        // abstract public void accept (Receiver printer);
    }

    public static class Data1 extends Command {
        protected Receiver receiver;

        private String str1 = "Suzuki";
        private String str2 = "Ichiro";

        // データは隠蔽 getter は提供しない
        // public String getStr1 () {
        //  return "Suzuki";
        // }
        // public String getStr2 () {
        //  return "Ichiro";
        // }

    public void setReceiver (Receiver receiver){
            this.receiver = receiver;
    }

    public void execute (){
            receiver.action (str1 + " " + str2);
    }       

        // public void accept (Receiver printer) {
        //  printer.visit (this);
        // }
    }

    public static class Data2 extends Command {
        protected Receiver receiver;

        private String str = "Jonney";

        // データは隠蔽, getter は提供しない
        // public String getStr () {
        //  return "Jonney";
        // }

    public void setReceiver (Receiver receiver){
            this.receiver = receiver;
    }

        // public void accept (Receiver printer) {
        //  printer.visit (this);
        // }

    public void execute (){
            receiver.action (str);
    }       
    }

    public interface Receiver {
        // public void visit (Data1 data);
        // public void visit (Data2 data);
        public abstract void action (String msg);
    }

    public static class NamePrinter implements Receiver {
        // コマンドに応じて処理を変更しない.
        // public void visit (Data1 data) {
        //  String str1 = data.getStr1 ();
        //  String str2 = data.getStr2 ();
        //  System.out.println (str1 + " " + str2);
        // }

        // public void visit (Data2 data) {
        //  String str = data.getStr ();
        //  System.out.println (str);           
        // }

    public void action (String msg){
            System.out.println (msg);
    }       
    }

    ////////////////////
    // Invoker
    ////////////////////
    public static class Invoker{
    private Stack<Command> commands = new Stack<Command>();

    public void addCommand (Command command){
            commands.push (command);
    }

    public void execute (){
            for ( Command command : commands ) {
                command.execute ();
            }
    }
    }

    public static void main (String[] args) {
        NamePrinter name = new NamePrinter ();      
        Command data1, data2;
        Invoker invoker = new Invoker ();

        data1 = new Data1 ();
        data1.setReceiver (name);
        data2 = new Data2 ();
        data2.setReceiver (name);

        invoker.addCommand (data1);
        invoker.addCommand (data2);

        invoker.execute ();
    }
}

操作のカプセル化

Wikipedia の説明をみると, クロージャー機能に似ている気がした.

というわけで, 内部 (匿名, 無名) クラスを利用してみる.

import java.util.Iterator;
import java.util.Stack;

class CommandSample {

    ////////////////////
    // Command
    ////////////////////
    abstract public static class Command {
    public void setReceiver (Receiver receiver){}
        public abstract void execute ();
    }

    public static interface Executer {
        public void run ();
    }

    public static class Data1 extends Command {
        protected Receiver receiver;

        private String str1 = "Suzuki";
        private String str2 = "Ichiro";

    public void setReceiver (Receiver receiver){
            this.receiver = receiver;
    }

    public void execute () {
            receiver.action (new Executer () {
                    public void run () {
                        System.out.println (str1 + " " + str2);
                    }
                });
    }       

    }

    public static class Data2 extends Command {
        protected Receiver receiver;

        private String str = "Jonney";

    public void setReceiver (Receiver receiver){
            this.receiver = receiver;
    }

    public void execute () {
            receiver.action (new Executer () {
                    public void run () {
                        System.out.println (str);
                    }
                });
    }       
    }       

    ////////////////////
    // Receiver
    ////////////////////
    public interface Receiver {
        public abstract void action (Executer executer);
    }

    public static class NamePrinter implements Receiver {
    public void action (Executer executer){
            executer.run ();
    }       
    }

    ////////////////////
    // Invoker
    ////////////////////
    public static class Invoker{
    private Stack<Command> commands = new Stack<Command>();

    public void addCommand (Command command){
            commands.push (command);
    }

    public void execute (){
            for ( Command command : commands ) {
                command.execute ();
            }
    }
    }

    public static void main (String[] args) {
        NamePrinter name = new NamePrinter ();      
        Command data1, data2;
        Invoker invoker = new Invoker ();

        data1 = new Data1 ();
        data1.setReceiver (name);
        data2 = new Data2 ();
        data2.setReceiver (name);

        invoker.addCommand (data1);
        invoker.addCommand (data2);

        invoker.execute ();
    }
}

こうみると, Visitor Pattern にまた似てきた. 混乱してきたので今日はここまで.

  • Command Pattern: call Command -> call Receiver -> call Executer
  • Visitor Pattern: call Receiver -> call Visitor

16 Nov 2014, 01:17

テクノミュージックの技術を体験! coursera で Survey of Music Technology をうける

はじめに

最近 perfume がすごく好きになった. 中田ヤスタカ氏の CAPSULE も好き.きゃりーぱみゅぱみゅは好きでない.

そんな中, テクノミュージックの講座を coursera で見つけたので, Try してみた.

この講座の内容は大きく分けて 2 つ.

  • 音楽技術の歴史の紹介
  • テクノミュージックの作曲の実践

中田ヤスタカさんのような曲がいつかつくれるようになる?!

  <div id="outline-container-unnumbered-2" class="outline-2">
    <h2 id="unnumbered-2">
      コンピュータと音楽の歴史を学ぶ
    </h2>

    <div class="outline-text-2" id="text-unnumbered-2">
      <p>
        この講座のひとつの特徴は, 音楽の技術の歴史を動画を交えて紹介していくところ.
      </p>

      <p>
        音楽の技術とは, コンピュータと音楽の関わりの歴史. だいたい, 80 年前くらい前から現在までの歴史の紹介.
      </p>

      <p>
        Youtube で紹介された動画は, 再生リストにまとめてみた. ここの技術については, あとで動画を交えながら紹介.
      </p>

      <p>
        <iframe width="560" height="315" src="//www.youtube.com/embed/videoseries?list=PLOEQDyige0NYA_xpI_Cy7oWqbzOciWEGa" frameborder="0" allowfullscreen></iframe> </div> 

        <div id="outline-container-unnumbered-3" class="outline-3">
          <h3 id="unnumbered-3">
            現代音楽の軌跡をたどる旅
          </h3>

          <div class="outline-text-3" id="text-unnumbered-3">
            <p>
              それは, 現代音楽の歴史といってもいいかもしれない.
            </p>

            <p>
              クラシック音楽がずっと好きだった. しかし, そんな自分も, 最近はクラシック音楽に対する興味をほとんど失ってしまった. 10 年以上きいてきたが, 飽きた.
            </p>

            <p>
              なぜなら, それはクラシック (古典) だから.新しさがないのだ.
            </p>

            <p>
              クラシックやオペラの楽しみかたの一つは, 作品に対する指揮者や演出家によって異なる解釈の差異をみつけることだ. 昔は, そういう解釈の違いがおもしろいと思ったが,最近は, 気の毒におもう.
            </p>

            <p>
              作品という絶対的なルールのなかで, なんとか独自性をだそう, 指揮者や演出家が必死でもがいているように見える.
            </p>

            <p>
              そんなことを思っている今日この頃に, この講座を受けた.
            </p>

            <p>
              この講座で紹介される音楽は, 奇妙な音楽なのだが, それらは, 既存の音楽の枠組みから如何にしてはみ出るかという挑戦の記録だ.
            </p>

            <p>
              クラシック音楽が好きだったころは, 現代音楽はまったく好きになれなかっ たが, この講座を通じて, 現代音楽に好感をもち, 興味が沸いた.
            </p>

            <p>
              彼らクリエイターは, 古典に頼ろうとせずに, 未来をつくろうとしている!
            </p>
          </div>
        </div></div> 

        <div id="outline-container-unnumbered-4" class="outline-2">
          <h2 id="unnumbered-4">
            テクノミュージックの作曲に挑戦
          </h2>

          <div class="outline-text-2" id="text-unnumbered-4">
            <p>
              この講座のもう一つの魅力は, テクノミュージックの作曲をするところ. 2 つの課題がだされる.
            </p>
          </div>

          <div id="outline-container-unnumbered-5" class="outline-3">
            <h3 id="unnumbered-5">
              DAW (Reaper) をつかった作曲
            </h3>

            <div class="outline-text-3" id="text-unnumbered-5">
              <p>
                講義では DAW (digital audio workstation) という, テクノミュージックをつくるためのソフトウェアをつかう.
              </p>

              <p>
                具体的には, Reaper を利用する.これは, 60 日間限定の free 版.
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://reaper.fm/">REAPER | Audio Production Without Limits</a>
                </li>
              </ul>

              <p>
                Windows 版と Mac 版しかなくて, Linux では利用できなさそうだったので, Windows 環境で作業することにした.
              </p>

              <p>
                日本語化パッチ
              </p>

              <ul class="org-ul">
                <li>
                  <a href="https://github.com/chiepomme/REAPERJapanesePatcher/wiki">Home · chiepomme/REAPERJapanesePatcher Wiki · GitHub</a>
                </li>
              </ul>

              <p>
                講義の中では 2 週にわたって, Reaper の使い方が紹介される. それをもちいて, 自分で曲をつくる宿題がだされる.
              </p>

              <p>
                Perfume の曲も, こんな機材を使いながらつくるんだろうなとおもうと, なんだかうれしくなる.
              </p>

              <p>
                課題は, じつは提出期限に間に合わなくて, 期限後に 3 時間くらいでやっつけで作成した. 宿題だしわすれて単位を落とすというのは, 非常によくあるパターン&#x2026;
              </p>
            </div>

            <div id="outline-container-unnumbered-6" class="outline-4">
              <h4 id="unnumbered-6">
                作成した曲
              </h4>

              <div class="outline-text-4" id="text-unnumbered-6">
                <iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/174830092&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe>
              </div>
            </div>
          </div>

          <div id="outline-container-unnumbered-7" class="outline-3">
            <h3 id="unnumbered-7">
              アルゴリズム作曲 (Algorithmic Composition)
            </h3>

            <div class="outline-text-3" id="text-unnumbered-7">
              <p>
                2 つめの課題は, アルゴリズム作曲.
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E4%BD%9C%E6%9B%B2%E6%B3%95">アルゴリズム作曲法 &#8211; Wikipedia</a>
                </li>
              </ul>

              <p>
                簡単な歴史
              </p>

              <ul class="org-ul">
                <li>
                  <a href="https://ccrma.stanford.edu/~blackrse/algorithm.html">The History of Algorithmic Composition</a>
                </li>
              </ul>

              <p>
                大きく, 以下の 3 つにわけられる.
              </p>

              <ul class="org-ul">
                <li>
                  Stochastic Process (確率過程)
                </li>
                <li>
                  Rule-Based (ルールベース)
                </li>
                <li>
                  Artificial Intelligence (人口知能)
                </li>
              </ul>

              <p>
                今回は, Python を利用してプログラムをかいて, プログラムから音楽を生成する.
              </p>
            </div>

            <div id="outline-container-unnumbered-8" class="outline-4">
              <h4 id="unnumbered-8">
                EarSketch
              </h4>

              <div class="outline-text-4" id="text-unnumbered-8">
                <p>
                  音楽をつくるための Python API.
                </p>

                <ul class="org-ul">
                  <li>
                    <a href="http://earsketch.gatech.edu/learning/earsketch-sample-library">Reference: EarSketch Sound Library « EarSketch</a>
                  </li>
                  <li>
                    <a href="http://earsketch.gatech.edu/earsketch2/">http://earsketch.gatech.edu/earsketch2/</a>
                  </li>
                </ul>

                <p>
                  Geogia Tech が開発している. OSS でない. 現段階では教育ようなので, メジャーではない. Web 上で実行できたり, Python だったりするので, 使いやすい.
                </p>

                <ul class="org-ul">
                  <li>
                    My Account: <a href="http://earsketch.gatech.edu/media/profiles/view/2626">http://earsketch.gatech.edu/media/profiles/view/2626</a>
                  </li>
                </ul>
              </div>
            </div>

            <div id="outline-container-unnumbered-9" class="outline-4">
              <h4 id="unnumbered-9">
                Hello world
              </h4>

              <div class="outline-text-4" id="text-unnumbered-9">
                <p>
                  もっとも基本的な記述.
                </p>

                <p>
                  [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> from earsketch import *
                </p>

                <p>
                  init ()<br /> setTempo (120)
                </p>

                <p>
                  mySound = TECHNO_CLUB5THPAD_001<br /> fitMedia (mySound, 1, 1, 5)
                </p>

                <p>
                  print &#8216;Hello world!&#8217;
                </p>

                <p>
                  finish ()<br /> [/sourcecode]
                </p>
              </div>
            </div>

            <div id="outline-container-unnumbered-10" class="outline-4">
              <h4 id="unnumbered-10">
                作成した曲
              </h4>

              <div class="outline-text-4" id="text-unnumbered-10">
              </div>

              <ul class="org-ul">
                <li>
                  <a id="unnumbered-11"></a>music<br /> <div class="outline-text-5" id="text-unnumbered-11">
                    <iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/175464488&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe>
                  </div>
                </li>

                <li>
                  <a id="unnumbered-12"></a>code<br /> <div class="outline-text-5" id="text-unnumbered-12">
                    [sourcecode language=&#8221;python&#8221; title=&#8221;&#8221; ]<br /> # script_name: ProjectB.py<br /> # author : tsu-nera<br /> # history : created 2014.11.04<br /> from earsketch import *<br /> from random import *<br /> from math import *</p> 

                    <p>
                      init ()<br /> setTempo (140)
                    </p>

                    <p>
                      end_time = 38<br /> beat_list = [&#8216;0&#8212;0&#8212;00000+0+&#8217;,<br /> &#8216;0&#8212;&#8212;&#8212;&#8212;&#8212;&#8216;,<br /> &#8216;0+++++++++++++++&#8217;,<br /> &#8216;0+++0++++&#8212;&#8212;&#8211;&#8216;]
                    </p>

                    <p>
                      setEffect (1, VOLUME, GAIN, -10)<br /> setEffect (2, VOLUME, GAIN, -10)
                    </p>

                    <p>
                      for i in range (1, end_time):<br /> fitMedia (HOUSE_DEEP_ARPLEAD_001, 1, i, i+1)<br /> fitMedia (HOUSE_DEEP_CRYSTALCHORD_001, 2, i, i+1)
                    </p>

                    <p>
                      setEffect (3, VOLUME, GAIN, -5)<br /> for i in range (5, end_time):<br /> fitMedia (ELECTRO_ANALOGUE_SPACELEAD_001, 3, i, i+1)
                    </p>

                    <p>
                      setEffect (1, VOLUME, GAIN, -10, 9, -5, 13)<br /> setEffect (2, VOLUME, GAIN, -10, 9, -5, 13)<br /> setEffect (3, VOLUME, GAIN, -5, 9, 0, 13)<br /> setEffect (4, VOLUME, GAIN, -25)
                    </p>

                    <p>
                      for i in range (9, end_time):<br /> makeBeat (OS_SNARE05, 4, i, beat_list[0])
                    </p>

                    <p>
                      setEffect (1, VOLUME, GAIN, -5, 13, 0, 17)<br /> setEffect (2, VOLUME, GAIN, -5, 13, 0, 17)<br /> setEffect (3, VOLUME, GAIN, 0, 13, 5, 17)<br /> setEffect (4, VOLUME, GAIN, -20, 13, -15, 17)<br /> setEffect (5, VOLUME, GAIN, -10, 13, -5, 17)
                    </p>

                    <p>
                      for i in range (13, 25):<br /> makeBeat (OS_CLOSEDHAT05, 5, i, beat_list[1])
                    </p>

                    <p>
                      setEffect (6, VOLUME, GAIN, -5)<br /> for i in range (17, end_time):<br /> fitMedia (ELECTRO_ANALOGUE_LEAD_002, 6, i, i+1)
                    </p>

                    <p>
                      setEffect (3, VOLUME, GAIN, 5, 21, 10, 25)<br /> setEffect (4, VOLUME, GAIN, -15, 21, 0, 25)<br /> setEffect (7, VOLUME, GAIN, -20, 21, 0, 25)<br /> for i in range (21, end_time):<br /> makeBeat (OS_SNARE06, 7, i, beat_list[0])
                    </p>

                    <p>
                      setEffect (4, VOLUME, GAIN, 5, 25)<br /> setEffect (7, VOLUME, GAIN, 5, 25)<br /> setEffect (8, VOLUME, GAIN, 10)
                    </p>

                    <p>
                      for i in range (25, end_time):<br /> makeBeat (Y45_CRASH_1, 8, i, beat_list[2])
                    </p>

                    <p>
                      setEffect (3, VOLUME, GAIN, 12, 29)<br /> setEffect (4, VOLUME, GAIN, 10, 29)<br /> setEffect (7, VOLUME, GAIN, 10, 29)
                    </p>

                    <p>
                      for i in range (29, end_time):<br /> makeBeat (OS_KICK04, 9, i, beat_list[3])
                    </p>

                    <p>
                      soundFolder = DUBDRUM
                    </p>

                    <p>
                      for i in range (0, 20):<br /> sound = selectRandomFile (soundFolder)<br /> start = 29+ floor (gauss (5, 2))<br /> end = start + randint (2, 2) * 0.25<br /> track = randint (11, 20)<br /> fitMedia (sound, track, start, end)<br /> setEffect (track, VOLUME, GAIN, 12)
                    </p>

                    <p>
                      fitMedia (TECHNO_WHITENOISESFX_003, 10, end_time, end_time+2)
                    </p>

                    <p>
                      finish ()<br /> [/sourcecode]
                    </p>
                  </div>
                </li>
              </ul>
            </div>
          </div>
        </div>

        <div id="outline-container-unnumbered-13" class="outline-2">
          <h2 id="unnumbered-13">
            印象的な音楽の紹介
          </h2>

          <div class="outline-text-2" id="text-unnumbered-13">
            <p>
              最後に, 講義のなかで紹介された動画のなかで, 印象に残っているものをいくつか取り上げる.
            </p>
          </div>

          <div id="outline-container-unnumbered-14" class="outline-3">
            <h3 id="unnumbered-14">
              THE GREAT ANIMAL ORCHESTRA by Bernie Krause: Water Sounds
            </h3>

            <div class="outline-text-3" id="text-unnumbered-14">
              <p>
                サウンドスケープという方法. 音風景, 音景.
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://ja.wikipedia.org/wiki/%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97">サウンドスケープ &#8211; Wikipedia</a>
                </li>
              </ul>

              <p>
                採取した音源を組み合わせて音楽をつくる.
              </p>

              <p>
                <iframe width="560" height="315" src="//www.youtube.com/embed/Crk0REKzPAg" frameborder="0" allowfullscreen></iframe> </div> 

                <div id="outline-container-unnumbered-15" class="outline-4">
                  <h4 id="unnumbered-15">
                    Bookmarks
                  </h4>

                  <div class="outline-text-4" id="text-unnumbered-15">
                    <ul class="org-ul">
                      <li>
                        <a href="http://www.ted.com/talks/bernie_krause_the_voice_of_the_natural_world?language=ja">バーニー・クラウス: 自然界からの声 | Talk Video | TED.com</a>
                      </li>
                    </ul>
                  </div>
                </div></div> 

                <div id="outline-container-unnumbered-16" class="outline-3">
                  <h3 id="unnumbered-16">
                    Virtual Barber Shop (Audio&#x2026;use headphones, close ur eyes)
                  </h3>

                  <div class="outline-text-3" id="text-unnumbered-16">
                    <p>
                      バイノーラルサウンドという方法. 3D 映画のような体験ができる.
                    </p>

                    <p>
                      以下の動画は, ヘッドホンをつけてきくと, 本当におどろくぞ. 後ろに人が立っているような感覚に陥る.
                    </p>

                    <p>
                      <iframe width="560" height="315" src="//www.youtube.com/embed/IUDTlvagjJA?list=PLOEQDyige0NYA_xpI_Cy7oWqbzOciWEGa" frameborder="0" allowfullscreen></iframe> </div> </div> 

                      <div id="outline-container-unnumbered-17" class="outline-3">
                        <h3 id="unnumbered-17">
                          Antescofo: Live Accompaniment Demonstration
                        </h3>

                        <div class="outline-text-3" id="text-unnumbered-17">
                          <p>
                            スコアフォローシステム.
                          </p>

                          <p>
                            ピアノのテンポを自動検出して, 伴奏をつけてくれる. 一人で, ピアノコンチェルトだってできる.音大生が喜びそう.
                          </p>

                          <p>
                            <iframe width="560" height="315" src="//www.youtube.com/embed/YkMGtpcAA04?list=PLOEQDyige0NYA_xpI_Cy7oWqbzOciWEGa" frameborder="0" allowfullscreen></iframe>
                          </p>

                          <p>
                            Kinect でもにたようなことをしている人は結構いる.
                          </p>

                          <ul class="org-ul">
                            <li>
                              <a href="http://futurismo.biz/archives/1788">Kinect で指揮者になる! 世界の KinectHacker たち | Futurismo</a>
                            </li>
                          </ul>
                        </div>
                      </div>

                      <div id="outline-container-unnumbered-18" class="outline-3">
                        <h3 id="unnumbered-18">
                          Lejaren Hiller &#8211; Illiac Suite for String Quartet
                        </h3>

                        <div class="outline-text-3" id="text-unnumbered-18">
                          <p>
                            世界初, コンピュータが作曲した音楽.イリアック組曲.
                          </p>

                          <ul class="org-ul">
                            <li>
                              <a href="https://www.youtube.com/watch?v=n0njBFLQSk8&#038;list=PL48E509DBEE4010DB&#038;index=1">Lejaren Hiller &#8211; Illiac Suite for String Quartet &#8211; YouTube</a>
                            </li>
                          </ul>

                          <p>
                            <iframe width="560" height="315" src="//www.youtube.com/embed/n0njBFLQSk8" frameborder="0" allowfullscreen></iframe> </div> </div> 

                            <div id="outline-container-unnumbered-19" class="outline-3">
                              <h3 id="unnumbered-19">
                                Iannis Xenakis- ST/10
                              </h3>

                              <div class="outline-text-3" id="text-unnumbered-19">
                                <p>
                                  確率などの数学を音楽に適用した音楽.
                                </p>

                                <p>
                                  クセナキスが変態的な音楽だってことは, 前から知ってた.
                                </p>

                                <p>
                                  <iframe width="560" height="315" src="//www.youtube.com/embed/1H7JYwmM7vU" frameborder="0" allowfullscreen></iframe> </div> </div> 

                                  <div id="outline-container-unnumbered-20" class="outline-3">
                                    <h3 id="unnumbered-20">
                                      David Cope Emmy Vivaldi
                                    </h3>

                                    <div class="outline-text-3" id="text-unnumbered-20">
                                      <p>
                                        流行りの機械学習 (machine learning) で, ビバルディの音楽を解析して 自動作曲したもの.
                                      </p>

                                      <p>
                                        人工知能すごい.チェスでもコンピュータが人間より強い時代だからな.
                                      </p>

                                      <p>
                                        もはや作曲家いらない&#x2026;??
                                      </p>

                                      <p>
                                        <iframe width="560" height="315" src="//www.youtube.com/embed/2kuY3BrmTfQ" frameborder="0" allowfullscreen></iframe> </div> </div> 

                                        <div id="outline-container-unnumbered-21" class="outline-3">
                                          <h3 id="unnumbered-21">
                                            A Study In Keith
                                          </h3>

                                          <div class="outline-text-3" id="text-unnumbered-21">
                                            <p>
                                              Live Coding というもの. プログラムからリアルタイムで音楽を生成.
                                            </p>

                                            <p>
                                              <iframe width="560" height="315" src="//www.youtube.com/embed/b-8Cmd6k4_M" frameborder="0" allowfullscreen></iframe>
                                            </p>

                                            <p>
                                              Live Coding については, 別記事でまとめた.
                                            </p>

                                            <ul class="org-ul">
                                              <li>
                                                <a href="http://futurismo.biz/archives/2692">プログラミングでイケイケミュージックライブ?! Live Coding について調べたまとめ | Futurismo</a>
                                              </li>
                                            </ul>
                                          </div>
                                        </div>

                                        <div id="outline-container-unnumbered-22" class="outline-3">
                                          <h3 id="unnumbered-22">
                                            <a id="o2b:1ca396a1-2944-4b61-b2a0-deda0e19bb73"></a>Process Music スティーブ・ライヒ
                                          </h3>

                                          <div class="outline-text-3" id="text-unnumbered-22">
                                            <p>
                                              最後に, もっとも好きになった音楽. それは, ミニマル音楽.
                                            </p>

                                            <p>
                                              <iframe width="560" height="315" src="//www.youtube.com/embed/AnC5DhNqZ6w" frameborder="0" allowfullscreen></iframe>
                                            </p>

                                            <p>
                                              これが好き.八重奏曲.
                                            </p>

                                            <p>
                                              <iframe width="420" height="315" src="//www.youtube.com/embed/cGfUfu9vsj4" frameborder="0" allowfullscreen></iframe>
                                            </p>

                                            <ul class="org-ul">
                                              <li>
                                                <a href="http://matome.naver.jp/odai/2137008940212203701">癒しの現代音楽 スティーブ・ライヒ &#8211; NAVER まとめ</a>
                                              </li>
                                            </ul>
                                          </div>
                                        </div></div>

15 Nov 2014, 23:11

一人暮らしのひと必見!! 忙しい朝にインスタントお茶漬けが最強な 6 つの理由

はじめに

朝はお茶漬けがとてもおすすめ.私は毎日朝茶漬け.

そこで今回は, なぜ一人暮らしの朝のお茶漬けがオススメなのかを書いてみる.

理由 1: あっという間につくれる

お茶漬けはつくるのがとても簡単.時間が節約できる.

  1. お湯を沸かす
  2. ご飯にインスタント茶漬けをかける
  3. ご飯に追加の具を入れる
  4. お湯をかける

たったこれだけだ. 作業時間は 1 分!

自分はかなり寝坊が得意なのだが, そんな自分でも, 目覚めてから 10 分で, 朝食も食べつつ家を飛び出せる.

1.のお湯沸かしには, 安物の電気ケトルを利用している.

2.3.の手順をもっと簡単にするために, ビニールの小袋にあらかじめ 1 週間分の材料をわけておくのもよい.

この方法は, ココイチのバイトでやっていたことを真似た.

理由 2: あっという間に食べれる

お茶漬けは食べるのも早い.時間が節約できる. なぜなら, あまり噛まずに飲み込めるからだ.

これには, 賛美両論あることはみとめる.

アゴを動かすことによって, 目が覚めるし, 歯も頑丈になる. 噛まない習慣を加速するというデメリットがある.

しかし, 熱いお湯を胃のなかに注ぎ込むと,とても目が覚める.

熱すぎるのも問題だ.自分の場合は, 完全にお湯が沸騰しない程度に調整している. そうすると, 熱さにためらうことなく, 食べることができる.

理由 3: レパートリーが豊富

なんでも混ぜられ, それなりにおいしいのだ. アイデア次第で, 無限の可能性を秘めているのが魅力的だ.

スーパーに買い物にいくと, 調理済みの様々な缶詰やパックされたものがある.

のり, わかめ, 魚, ごま, 調味料…などなど.

毎週, 新しい材料を買って, それをお茶漬けに入れてみる.大抵, うまい. また, ネット上にもレシピはいくらでも検索で引っかかる.

私が, お茶漬けが好きで, 飽きない理由は, ここにある.

理由 4: 栄養満点!

お茶漬けでは, 栄養がとれないというのは偏見.

なんでも混ぜられて, それなりにおいしいので, とれない栄養はないといっても過言ではないのだ!!

  • ごまは, 活性酸素を撃退!!
  • カルシウムを補うために, 煮干しを入れている.
  • 卵をおとすことで, たんぱく質を摂取.
  • 海の海草類をまぜれば, ミネラル豊富.

実は, 野菜を調理するのは朝から手間なので, そういうときは野菜ジュースで補ったりする…

理由 5: 冷えたご飯をおいしく食べられる

朝は半合のご飯を食べている. 1 合では多いので.

一晩で, 1 合のご飯をたく. 半合をその日に食べて, 残りは冷蔵庫に入れる. そうすると, 2 日目のご飯は, 冷たく固くなっている.

そんなご飯でさえ, やや熱めの熱湯を注ぎ込むことで, まったく違和感を感じることがなく, 食べることができる.

一人暮らしの食料管理には, とても最適なのだ.

理由 6: 残飯整理ができる

子供のころ, 親戚のおばさんの家に犬かいた.

毎日のワンワンの食事は, おばさんの家であまった残飯とドッグフードを混ぜたもの.

たとえが悪いかもしれないが, 冷蔵庫で余っている食材を入れることで残飯整理にもなる.

一人暮らしだと, 材料があまることがとても多いのだが, そんなときは, 夜に簡単に火を通しておいて, 朝にお茶漬けに入れる.

最後に

どうだろうか? お茶漬けを食べたくなってきただろうか?

私が疑問に思うのは, お茶やお茶漬けは日本に昔からある文化なのに, それを専門にする食事のお店が少ないことだ.

なぜ, コーヒーを提供する喫茶店はたくさんあるのに, 日本茶を提供する喫茶店は皆無なのだろうか?

なぜ, 牛丼やそば, うどんなどのファーストフード店はたくさんあるのに, もっともファーストなお茶漬けのファーストフード店は皆無なのだろうか? (だし茶漬けえん というチェーン店は好き)

結論としては, お茶漬けがもっと世の中でもてはやされるべきということだ.

15 Nov 2014, 14:04

プログラミングでイケイケミュージックライブ?! Live Coding について調べたまとめ

はじめに

coursera の講義でライブコーディング (Live Coding) というものを知った.

正直, なんじゃこりゃ? といった不思議な世界.

日本語の情報はほとんどないのだが, 海外では有名っぽい. というわけで, 情報をまとめてみる.

Live Coding とは

TopLap のページから引用. (About | TOPLAP)

“Live coding is a new direction in electronic music and video, and is starting to get somewhere interesting. Live coders expose and rewire the innards of software while it generates improvised music and/or visuals. All code manipulation is projected for your pleasure.”

on-the-fly programming, just in time programming ともいう.

coursera からの表現を借りると,

  • パフォーマンスとしてのアルゴリズム作曲.
    • 編集過程を聴衆に見せる.
    • リアルタイムで編集する.

TopLap

Live Coding のためのコミュニティ.

アルゴリズム作曲用プログラミング言語

TOPLAP のベージに情報がまとまっている.

coursera の講義を参考にまとめてみた.

Supercollider

Smalltalk like な言語. OSS

開発盛ん.

ChucK

C - like な言語.

ChucK を学ぶ coursera のコース. Introduction to Programming for Musicians and Digital Artists | Coursera

ChucK を解説した本. Manning: Programming for Musicians and Digital Artists

Csound

C - like な言語. 開発は盛ん. (2014)

Impromptu

Mac OS のための live coding 言語. Lisp 系の言語. Andrew Sorensen さんがつくった.

Overtone

OSS の Clojure API.

A Clojure API to the SuperCollider synthesis engine.

MAX/MSP

有料のソフト.

Pure Data

オリジナルの開発者ミラー・パケットによるフリーソフトウェアプログラム. Max/Msp の OSS 版. Pd と略す.

動画

Live Coding で検索して引っかかったやつで,気になるやつを集めてみる.

TOPLAP のページに example がまとまっている.

Andrew Sorensen

Live Coding の世界で有名な人.

Andrew Sorensen OSCON 2014 Keynote: “The Concert Programmer”

Andrew Sorensen さんの ライブコーディング.

オライリーのイベント? のなかで, 解説を交えながらのコーディング.

ComputeMusic (now): Andrew Sorensen at TEDxQUT

これも, Andrew Sorensen さんの TED 講演.

A Study In Keith

Overtone

Clojure でのライブ.

なにかの講演.後半から実演している.

Meta-eX

Overtone を利用したミュージシャンデュオ

SuperCollider

ChucK

なんか, 初心者っぽい.

Haskell

Haskell?? の Live Coding

最後に

なんだか意味不明だが, かっこいい.

新しい世界を見た.

個人的には, Emacs 上で音楽が鳴らせる Overtune に惹かれる.

14 Nov 2014, 15:24

Javaで Visitor Patternを実装してみた

はじめに

今日、仕事でVisitorパターンの話題がでたけど なんのことだかわからなかったので、調べてみた.

Visitor Patternとは

ビジターパターンとは、Gofのデザインパターンの一つ.

データと処理の分離

ひとつの特徴は、データと処理を分離できること。

  • データに対応するのが、Accepter.
  • 操作に対応するのが, Visitor

よくあるVisitorパターンの例は、 コンポジットパターン(フォルダパターン)に対する操作.

  • データは,
    • フォルダ
    • ファイル
  • 操作は、
    • 最終更新日取得
    • 作成日取得
    • サイズ取得

型のパターンマッチのカプセル化

Visitorパターンは関数型言語ででてくる, 型によるパターンマッチにとても似ていると思った.

Accepterごとに異なる型を持たせ、 Visitorは型のパターンマッチによって型に対するメソッドを 割り当てるイメージ.

Code

class VisitorSample {

    ////////////////////
    // Data
    ////////////////////
    abstract public static class PrintData {
         abstract public void accept(Visitor printer);
    }

    public static class Data1 extends PrintData {

        public String getStr1 () {
            return "Suzuki";
        }

        public String getStr2 () {
            return "Ichiro";
        }

        public void accept(Visitor printer) {
            printer.visit(this);
        }
    }

    public static class Data2 extends PrintData {
        public String getStr () {
            return "Jonney";
        }

        public void accept(Visitor printer) {
            printer.visit(this);
        }       
    }

    ////////////////////
    // Operation
    ////////////////////
    public interface Visitor {
        public void visit(Data1 data);
        public void visit(Data2 data);  
    }

    public static class NamePrinter implements Visitor {
        public void visit(Data1 data) {
            String str1 = data.getStr1();
            String str2 = data.getStr2();
            System.out.println(str1 + " " + str2);
        }

        public void visit(Data2 data) {
            String str = data.getStr();
            System.out.println(str);            
        }
    }

    ////////////////////
    // Main procedre
    ////////////////////
    public static void main(String[] args) {
        NamePrinter printer = new NamePrinter();
        PrintData data;

        data = new Data1();
        data.accept(printer);

        data = new Data2();
        data.accept(printer);
    }
}

操作の柔軟な追加

Visitorを継承することで、容易に操作を追加することができる。 上の例では、名前の表示という操作がすでにある. ここに、出席番号表示という操作を追加する.

Code

class VisitorSample {

    ////////////////////
    // Data
    ////////////////////
    abstract public static class PrintData {
        abstract public void accept(Visitor printer);
        abstract public int getNum();       
    }

    public static class Data1 extends PrintData {

        public String getStr1 () {
            return "Suzuki";
        }

        public String getStr2 () {
            return "Ichiro";
        }

        public int getNum () {
            return 1;
        }

        public void accept(Visitor printer) {
            printer.visit(this);
        }
    }

    public static class Data2 extends PrintData {
        public String getStr () {
            return "Jonney";
        }

        public int getNum () {
            return 2;
        }

        public void accept(Visitor printer) {
            printer.visit(this);
        }       
    }

    ////////////////////
    // Operation
    ////////////////////
    public interface Visitor {
        public void visit(Data1 data);
        public void visit(Data2 data);  
    }

    public static class NamePrinter implements Visitor {
        public void visit(Data1 data) {
            String str1 = data.getStr1();
            String str2 = data.getStr2();
            System.out.println(str1 + " " + str2);
        }

        public void visit(Data2 data) {
            String str = data.getStr();
            System.out.println(str);            
        }
    }

    public static class NumberPrinter implements Visitor {
        public void visit(Data1 data) {
            System.out.println("出席番号: " + data.getNum());
        }

        public void visit(Data2 data) {
            System.out.println("出席番号: " + data.getNum());           
        }
    }

    ////////////////////
    // Main procedre
    ////////////////////
    public static void main(String[] args) {
        NamePrinter name = new NamePrinter();       
        NumberPrinter num = new NumberPrinter();
        PrintData data;

        data = new Data1();
        data.accept(name);      
        data.accept(num);

        data = new Data2();
        data.accept(name);      
        data.accept(num);
    }
}

さいごに

だれがこんな手法を考えついたのだろう??

デザインパターンってすごいね−。

Bookmarks