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

10 Nov 2014, 13:12

LinuxFoundation が MOOC に進出! edX で Introduction to Linux を受ける.

はじめに

会社で LPIC の資格をとれという, パワーハラスメントにあっている. ストレスで嫌だったらありゃしない.

なので, しぶしぶと Linux の勉強をするために, MOOC の Linux 講座を受講してみた.

Linux 生みの親登場

この edX の講座は, LinuxFoundation が主催. LinuxFoundation というのは Linux 普及のための教育期間. University 以外の機関が MOOC への参加を発表したことは, 少し話題になった.

すごいと思ったのは, このイントロ動画.

Linux 生みの親, リーナス・トーバルズ直々の宣伝活動だ.

  <div id="outline-container-unnumbered-3" class="outline-2">
    <h2 id="unnumbered-3">
      結構期待はずれだった&#x2026;
    </h2>

    <div class="outline-text-2" id="text-unnumbered-3">
      <p>
        結論から書くと, 期待はずれ.
      </p>

      <p>
        なぜかというと, 知っていることばかりだったから.
      </p>

      <p>
        Linux に触れたことがまったくない人のための, 本当の初心者をターゲットにしているように思う.
      </p>

      <p>
        なので自分のような, 仕事で Linux をつかったり, 自宅のノート PC に ArchLinux を入れて遊んでいるような人にとっては, 常識的なことばかりが書いてあるので, まったくつまらない.
      </p>

      <p>
        自分にとっては, この講座は意味がなかったな&#x2026;
      </p>

      <p>
        いやいや, そういう屁理屈は, LPIC L1 の試験に合格してから言わねば&#x2026;
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-4" class="outline-2">
    <h2 id="unnumbered-4">
      LPIC L1 の試験対策になるかな. .ならない
    </h2>

    <div class="outline-text-2" id="text-unnumbered-4">
      <p>
        edX で勉強しても, それが対策にはならないというのが感想.
      </p>

      <p>
        LPIC という試験は, 問題を暗記すると受かる試験なので. LPIC の勉強は, 問題集や ping-t をとくのがよい.
      </p>

      <p>
        ただし, Linux に触れたことがないひとには, この edX の講座はいいかもしれない. 毎週, Lab という項目で, 実際に手を動かして Linux にふれる課題が出される.
      </p>

      <p>
        暗記すれば, 試験には受かるが, 知識としてはすぐにわすれてしまう. 手を動かすと, 知識は体に残る.
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-5" class="outline-2">
    <h2 id="unnumbered-5">
      LPIC L1 と Introduction to Linux の対応
    </h2>

    <div class="outline-text-2" id="text-unnumbered-5">
      <p>
        最後に, LPIC L1 の出題範囲と, 今回の edX の講座の対応をかいておく.
      </p>
    </div>

    <div id="outline-container-unnumbered-6" class="outline-3">
      <h3 id="unnumbered-6">
        101 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-6">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 101:システムアーキテクチャ<br /> 101.1 ハードウェア設定の決定と構成<br /> 101.2 システムのブート<br /> 101.3 ランレベルの変更とシステムのシャットダウンまたはリブート</p> 

        <p>
          Chapter 01: The Linux Foundation<br /> Chapter 02: Linux Philosophy and Concepts
        </p>

        <p>
          主題 102:Linux のインストールとパッケージ管理
        </p>

        <p>
          102.1 ハードディスクのレイアウト設計<br /> 102.2 ブートマネージャのインストール<br /> 102.3 共有ライブラリを管理する<br /> 102.4 Debian パッケージ管理を使用する<br /> 102.5 RPM および YUM パッケージ管理を使用する
        </p>

        <p>
          Chapter 03: Linux Structure and Installation<br /> Chapter 07: Finding Linux Documentation
        </p>

        <p>
          * 主題 103:GNU と Unix のコマンド
        </p>

        <p>
          103.1 コマンドラインで操作する<br /> 103.2 フィルタを使ってテキストストリームを処理する<br /> 103.3 基本的なファイル管理を行う<br /> 103.4 ストリーム, パイプ, リダイレクトを使う<br /> 103.5 プロセスを生成, 監視, 終了する<br /> 103.6 プロセスの実行優先度を変更する<br /> 103.7 正規表現を使用してテキストファイルを検索する<br /> 103.8 vi を使って基本的なファイル編集を行う
        </p>

        <p>
          Chapter 06: Command Line Operations<br /> Chapter 10: Text Editors<br /> Chapter 13: Manipulating Text<br /> Chapter 17: Processes
        </p>

        <p>
          * 主題 104:デバイス, Linux ファイルシステム, ファイルシステム階層標準
        </p>

        <p>
          104.1 パーティションとファイルシステムの作成<br /> 104.2 ファイルシステムの整合性を保持する<br /> 104.3 ファイルシステムのマウントとアンマウントをコントロールする<br /> 104.4 ディスククォータを管理する<br /> 104.5 ファイルのパーミッションと所有者を管理する<br /> 104.6 ハードリンクとシンボリックリンクを作成・変更する<br /> 104.7 システムファイルを見つける, 適切な位置にファイルを配置する
        </p>

        <p>
          Chapter 08: File Operations<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-7" class="outline-3">
      <h3 id="unnumbered-7">
        102 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-7">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 105:シェル, スクリプト, およびデータ管理</p> 

        <p>
          105.1 シェル環境のカスタマイズと使用<br /> 105.2 簡単なスクリプトをカスタマイズまたは作成する<br /> 105.3 SQL データ管理
        </p>

        <p>
          Chapter 15 : Bash Shell Scripting<br /> Chapter 16: Advanced Bash Scripting
        </p>

        <p>
          * 主題 106:ユーザインターフェイスとデスクトップ
        </p>

        <p>
          106.1 X11 のインストールと設定<br /> 106.2 ディスプレイマネージャの設定<br /> 106.3 アクセシビリティ
        </p>

        <p>
          Chapter 04: Graphical Interface<br /> Chapter 18: Common Applications
        </p>

        <p>
          * 主題 107:管理業務
        </p>

        <p>
          107.1 ユーザアカウント, グループアカウント, および関連するシステムファイルを管理する<br /> 107.2 ジョブスケジューリングによるシステム管理業務の自動化<br /> 107.3 ローカライゼーションと国際化
        </p>

        <p>
          Chapter 05: System Configuration from the Graphical Interface<br /> Chapter 09: User Environment
        </p>

        <p>
          * 主題 108:重要なシステムサービス
        </p>

        <p>
          108.1 システム時刻を維持する<br /> 108.2 システムのログ<br /> 108.3 メール転送エージェント (MTA) の基本<br /> 108.4 プリンターと印刷を管理する
        </p>

        <p>
          Chapter 14: Printing
        </p>

        <p>
          * 主題 109:ネットワークの基礎
        </p>

        <p>
          109.1 インターネットプロトコルの基礎<br /> 109.2 基本的なネットワーク構成<br /> 109.3 基本的なネットワークの問題解決<br /> 109.4 クライアント側の DNS 設定
        </p>

        <p>
          Chapter 12: Network Operations
        </p>

        <p>
          * 主題 110:セキュリティ
        </p>

        <p>
          110.1 セキュリティ管理業務を実施する<br /> 110.2 ホストのセキュリティ設定<br /> 110.3 暗号化によるデータの保護
        </p>

        <p>
          Chapter11: Local Security Principles<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

09 Nov 2014, 12:04

Emacs で Python 開発環境を構築

はじめに

coursera で Python をつかう講座を 2 つとった.

もちろん Emacs で開発環境をつくったので, 構築メモ.

  <div id="outline-container-unnumbered-2" class="outline-2">
    <h2 id="unnumbered-2">
      入力支援
    </h2>

    <div class="outline-text-2" id="text-unnumbered-2">
      <p>
        python.el は公式, python-mode.el は Python コミュニティによって作成されたもの.
      </p>
    </div>

    <div id="outline-container-unnumbered-3" class="outline-3">
      <h3 id="unnumbered-3">
        python
      </h3>

      <div class="outline-text-3" id="text-unnumbered-3">
        <p>
          Emacs にデフォルトではいっているやつ.
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-4" class="outline-3">
      <h3 id="unnumbered-4">
        python-mode
      </h3>

      <div class="outline-text-3" id="text-unnumbered-4">
        <p>
          Python コミュニティによって作成されたもの.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/emacsmirror/python-mode">emacsmirror/python-mode</a>
          </li>
          <li>
            <a href="https://launchpad.net/python-mode/">python-mode.el in Launchpad</a>
          </li>
          <li>
            <a href="http://tnt.math.se.tmu.ac.jp/~tetsushi/nzmath/emacs-python-mode.html">Guide &#8211; Software &#8211; Emacs &#8211; python-mode</a>
          </li>
        </ul>

        <p>
          ショートカットがまとまっている.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://ikautimituaki.hatenablog.com/entry/20111120/1321806070">python-mode の便利なショートカットまとめ &#8211; まったりいんふぉまてぃくすめもらんだむ</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-5" class="outline-3">
      <h3 id="unnumbered-5">
        インデント設定
      </h3>

      <div class="outline-text-3" id="text-unnumbered-5">
        <p>
          4 で設定.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (add-hook &#8216;python-mode-hook<br /> &#8216;(lambda ()<br /> (setq indent-tabs-mode nil)<br /> (setq indent-level 4)<br /> (setq python-indent 4)<br /> (setq tab-width 4)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-6" class="outline-2">
    <h2 id="unnumbered-6">
      コードリーディング
    </h2>

    <div class="outline-text-2" id="text-unnumbered-6">
    </div>

    <div id="outline-container-unnumbered-7" class="outline-3">
      <h3 id="unnumbered-7">
        helm-etags-plus
      </h3>

      <div class="outline-text-3" id="text-unnumbered-7">
        <p>
          ダグジャンプ. ctags を利用する. そして, ctags を Emacs から利用するために, 最近は helm-etags-plus なるものを使っていたりする.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/jixiuf/helm-etags-plus">jixiuf/helm-etags-plus</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;helm-etags+)<br /> [/sourcecode]
        </p>

        <p>
          [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> $ ctags -o TAGS *.py<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-8" class="outline-3">
      <h3 id="unnumbered-8">
        swoop
      </h3>

      <div class="outline-text-3" id="text-unnumbered-8">
        <p>
          ctags はメソッドの定義にはジャンプできるけど, 変数の宣言にジャンプできない.
        </p>

        <p>
          変数の宣言に飛びたいときは, swoop が最近は大のお気に入り.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://fukuyama.co/emacs-swoop">Emacs バッファ内高速ナビゲーション Swoop.el を作りました. &#8211; Web 学び</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;swoop)<br /> (global-set-key (kbd &#8220;M-o&#8221;) &#8216;swoop)<br /> (global-set-key (kbd &#8220;C-M-o&#8221;) &#8216;swoop-multi)<br /> ;; (global-set-key (kbd &#8220;M-o&#8221;) &#8216;swoop-pcre-regexp)<br /> (global-set-key (kbd &#8220;C-S-o&#8221;) &#8216;swoop-back-to-last-position)
        </p>

        <p>
          (define-key isearch-mode-map (kbd &#8220;M-o&#8221;) &#8216;swoop-from-isearch)<br /> (define-key swoop-map (kbd &#8220;M-o&#8221;) &#8216;swoop-multi-from-swoop)
        </p>

        <p>
          ;; サイズ変更禁止<br /> (setq swoop-font-size-change: nil)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-9" class="outline-3">
      <h3 id="unnumbered-9">
        imenu
      </h3>

      <div class="outline-text-3" id="text-unnumbered-9">
        <p>
          関数一覧を表示する. そのままだと動かなかったので, いかのリンクを参考にした.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://qiita.com/lambdasakura@github/items/ceb9bc6fb008c959ec4b">Emacs の Python 開発環境構築メモ &#8211; Qiita</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (semantic-mode 1)<br /> (add-hook &#8216;python-mode-hook<br /> (lambda ()<br /> (setq imenu-create-index-function &#8216;python-imenu-create-index)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-10" class="outline-2">
    <h2 id="unnumbered-10">
      リファクタリング
    </h2>

    <div class="outline-text-2" id="text-unnumbered-10">
      <p>
        主に名前変更の Elisp を導入.
      </p>

      <p>
        参考リンク:
      </p>

      <ul class="org-ul">
        <li>
          <a href="http://stackoverflow.com/questions/28796/what-refactoring-tools-do-you-use-for-python">What refactoring tools do you use for Python? &#8211; Stack Overflow</a>
        </li>
      </ul>
    </div>

    <div id="outline-container-unnumbered-11" class="outline-3">
      <h3 id="unnumbered-11">
        anzu
      </h3>

      <div class="outline-text-3" id="text-unnumbered-11">
        <p>
          インタラクティブな補完.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/syohex/emacs-anzu">syohex/emacs-anzu</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-12" class="outline-3">
      <h3 id="unnumbered-12">
        iedit
      </h3>

      <div class="outline-text-3" id="text-unnumbered-12">
        <p>
          C-;から気軽に同じキーワードを編集できる.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/emacs/Iedit">EmacsWiki: Iedit</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-13" class="outline-3">
      <h3 id="unnumbered-13">
        Ropemacs
      </h3>

      <div class="outline-text-3" id="text-unnumbered-13">
        <p>
          Python 用のリファクタリングツール.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://rope.sourceforge.net/ropemacs.html">ropemacs, rope in emacs</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-14" class="outline-2">
    <h2 id="unnumbered-14">
      コーディング支援
    </h2>

    <div class="outline-text-2" id="text-unnumbered-14">
    </div>

    <div id="outline-container-unnumbered-15" class="outline-3">
      <h3 id="unnumbered-15">
        jedi
      </h3>

      <div class="outline-text-3" id="text-unnumbered-15">
        <p>
          Python のオムニ補完 (かしこい補完) をしてくれる.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://qiita.com/yuu116atlab/items/2a62cb880ac863dcc8ef">emacs-jedi の install &#8211; Qiita</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-16" class="outline-3">
      <h3 id="unnumbered-16">
        ac-python
      </h3>

      <div class="outline-text-3" id="text-unnumbered-16">
        <p>
          auto-complete の python 強化版.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ac-python)<br /> (add-to-list &#8216;ac-modes &#8216;python-2-mode)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-17" class="outline-3">
      <h3 id="unnumbered-17">
        quickrun
      </h3>

      <div class="outline-text-3" id="text-unnumbered-17">
        <p>
          quickrun を利用すれば, python コードを Emacs から実行可能.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/syohex/emacs-quickrun">https://github.com/syohex/emacs-quickrun</a>
          </li>
        </ul>

        <p>
          システムの version が 3 で, Emacs からは 2 を利用したいときは, 以下のようにすれば実行コマンドをオーバライドできる.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (quickrun-add-command &#8220;python&#8221;<br /> &#8216;((:command . &#8220;python2&#8221;))<br /> :override t)<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-18" class="outline-2">
    <h2 id="unnumbered-18">
      静的解析
    </h2>

    <div class="outline-text-2" id="text-unnumbered-18">
    </div>

    <div id="outline-container-unnumbered-19" class="outline-3">
      <h3 id="unnumbered-19">
        flymake
      </h3>

      <div class="outline-text-3" id="text-unnumbered-19">
        <p>
          flymake でエラーチェックを実施. エラーチェックのエンジンに pyflakes を利用する.
        </p>

        <p>
          [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> $ sudo pip install pyflakes<br /> [/sourcecode]
        </p>

        <p>
          Emacswiki を参考に設定.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/PythonProgrammingInEmacs">EmacsWiki: Python Programming In Emacs</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (when (load &#8220;flymake&#8221; t)<br /> (defun flymake-pyflakes-init ()<br /> ; Make sure it&#8217;s not a remote buffer or flymake would not work<br /> (when (not (subsetp (list (current-buffer)) (tramp-list-remote-buffers)))<br /> (let* ((temp-file (flymake-init-create-temp-buffer-copy<br /> &#8216;flymake-create-temp-inplace))<br /> (local-file (file-relative-name<br /> temp-file<br /> (file-name-directory buffer-file-name))))<br /> (list &#8220;pyflakes&#8221; (list local-file)))))<br /> (add-to-list &#8216;flymake-allowed-file-name-masks<br /> &#8216;(&#8220;\\.py\\'&#8221; flymake-pyflakes-init)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-20" class="outline-2">
    <h2 id="unnumbered-20">
      さいごに
    </h2>

    <div class="outline-text-2" id="text-unnumbered-20">
    </div>

    <div id="outline-container-unnumbered-21" class="outline-3">
      <h3 id="unnumbered-21">
        Environment
      </h3>

      <div class="outline-text-3" id="text-unnumbered-21">
        <ul class="org-ul">
          <li>
            ArchLinux
          </li>
          <li>
            Emacs 24.4
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-22" class="outline-3">
      <h3 id="unnumbered-22">
        Special Thanks
      </h3>

      <div class="outline-text-3" id="text-unnumbered-22">
        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/PythonProgrammingInEmacs">EmacsWiki: Python Programming In Emacs</a>
          </li>
          <li>
            <a href="http://www.jesshamrick.com/2012/09/18/emacs-as-a-python-ide/">Emacs as a Python IDE &#8211; Jessica Hamrick</a>
          </li>
          <li>
            <a href="http://pedrokroger.net/configuring-emacs-python-ide/">Configuring Emacs as a Python IDE &#8211; Pedro Kroger</a>
          </li>
          <li>
            <a href="http://uchikoshi22.hatenadiary.jp/entry/20110925/1316936253">Emacs を Python 用 IDE としてセットアップ &#8211; uchikoshi22&#8217;s blog</a>
          </li>
          <li>
            <a href="http://d.hatena.ne.jp/cou929_la/20110525/1306321857">emacs の python 開発環境を整える &#8211; フリーフォーム フリークアウト</a>
          </li>
          <li>
            <a href="http://blog.kzfmix.com/entry/1334218401">Emacs の Python 開発環境を整えた</a>
          </li>
          <li>
            <a href="http://lambdalisue.hatenablog.com/entry/2013/06/23/071344">Vim を最強の Python 開発環境にする 2 &#8211; Λ Lisue&#8217;s blog</a>
          </li>
          <li>
            <a href="https://github.com/gabrielelanaro/emacs-for-python">gabrielelanaro/emacs-for-python</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

09 Nov 2014, 11:42

システムトレードで億万長者になるぞ! coursera で Computational Investing Part I を受けた

はじめに

お金持ちになりたい! 仕事をしないで, 遊んでくらしたい!

ということで, coursera でアルゴリズム投資を勉強してみた.

      <div id="outline-container-unnumbered-2" class="outline-2">
        <h2 id="unnumbered-2">
          内容
        </h2>

        <div class="outline-text-2" id="text-unnumbered-2">
        </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>
              今, 投資の世界では, 1/3 の取引はコンピュータを介して実施されているら しい.それを, アルゴリズム取引という. <a href="http://en.wikipedia.org/wiki/Algorithmic_trading">Algorithmic trading &#8211; Wikipedia, the free encyclopedia</a>
            </p>

            <p>
              いわゆる, ヘッジファンドがなにをしているかが分かる.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/What-Hedge-Funds-Really-Introduction-ebook/dp/B00MYFT0TQ/ref=la_B00NR7UJ4A_1_1?s=books&#038;ie=UTF8&#038;qid=1414890856&#038;sr=1-1">Amazon.co.jp: What Hedge Funds Really Do: An Introduction to Portfolio Management 電子書籍: Philip J. Romero, Tucker Balch: 本</a>
              </li>
            </ul>
          </div>
        </div>

        <div id="outline-container-unnumbered-4" class="outline-3">
          <h3 id="unnumbered-4">
            Books
          </h3>

          <div class="outline-text-3" id="text-unnumbered-4">
            <p>
              講義で利用した本はこれ.Active Portfolio Management は もっとも重要な Algorithmic investing の本.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%83%BB%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E2%80%95%E9%81%8B%E7%94%A8%E6%88%A6%E7%95%A5%E3%81%AE%E8%A8%88%E9%87%8F%E7%9A%84%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%AA%E3%83%81%E3%83%A3%E3%83%BC%E3%83%89%E3%83%BBC-%E3%82%B0%E3%83%AA%E3%83%8E%E3%83%AB%E3%83%89/dp/4492711252/ref=sr_1_1?s=books&#038;ie=UTF8&#038;qid=1414412296&#038;sr=1-1">Amazon.co.jp: アクティブ・ポートフォリオ・マネジメント-運用戦略の計量的理論と実践: リチャード・ C. グリノルド, ロナルド・ N. カーン, Richard C. Grinold, Ronald N. Kahn, 明治生命特別勘定運用部, 日興証券アセットマネジメント本部: 本</a>
              </li>
              <li>
                <a href="http://www.amazon.co.jp/Active-Portfolio-Management-Quantitative-Controlling/dp/0070248826/ref=sr_1_1?s=english-books&#038;ie=UTF8&#038;qid=1414412270&#038;sr=1-1">Amazon.co.jp: Active Portfolio Management: A Quantitative Approach for Producing Superior Returns and Selecting Superior Returns and Controlling Risk (McGraw-Hill Library of Investment and Finance): Richard Grinold, Ronald Kahn: 洋書</a>
              </li>
            </ul>

            <p>
              この本にしたがって, 投資の基本的用語, 投資モデル, 投資に利用するた めの指標が解説される. 講義では, あまりプログラミングのことには降れず,経済用語の解説が多い. そして, この分野の知識はほぼない自分にとってはとてもつらい.
            </p>
          </div>
        </div>

        <div id="outline-container-unnumbered-5" class="outline-3">
          <h3 id="unnumbered-5">
            Assignment
          </h3>

          <div class="outline-text-3" id="text-unnumbered-5">
            <p>
              ただし, 宿題では, 毎回 Python プログラムを組むことになる. 講義で学んだ, 理論や考え方をコードに落とし込む.
            </p>

            <p>
              内容が実践的で楽しい.いくつか紹介.
            </p>

            <ul class="org-ul">
              <li>
                Yahoo ファイナンスからデータを取得.
              </li>
              <li>
                モンテカルロ法で最適なポートフォリオをシミュレートする.
              </li>
              <li>
                Event Study という投資戦略を実施するマーケットシミュレータを作成.
              </li>
              <li>
                あらかじめ決めておいたイベントを検出したら, 以下を実施. <ul class="org-ul">
                  <li>
                    100 ドルの BUY
                  </li>
                  <li>
                    5 日後に 100 ドルの SELL
                  </li>
                </ul>
              </li>

              <li>
                戦略をバックテストで評価する.
              </li>
            </ul>

            <p>
              各 Assignment は, 以下の wiki にある.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://wiki.quantsoftware.org/index.php?title=Computational_Investing_I#Assignments">http://wiki.quantsoftware.org/index.php?title=Computational_Investing_I#Assignments</a>
              </li>
            </ul>
          </div>

          <div id="outline-container-unnumbered-6" class="outline-4">
            <h4 id="unnumbered-6">
              Python
            </h4>

            <div class="outline-text-4" id="text-unnumbered-6">
              <p>
                ちなみに, 自分は Python 初挑戦だ. Ruby はできるので, それに似た Python はとくにつまづくことはなかった.
              </p>

              <p>
                Python に苦労するよりも, 以下のライブラリに苦戦.
              </p>

              <ul class="org-ul">
                <li>
                  Numpy
                </li>
                <li>
                  Pandas
                </li>
              </ul>

              <p>
                どちらも, Python で数値計算に利用するための デファクトスタンダードラ イブラリのなので, 情報元は多い.
              </p>

              <p>
                NumPy や pandas の参考書:
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E2%80%95NumPy%E3%80%81pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-Wes-McKinney/dp/4873116554/ref=pd_rhf_dp_s_cp_11_NKWA?ie=UTF8&#038;refRID=1RXNRYY640CBNJB4AVE8">Amazon.co.jp: Python によるデータ分析入門 -NumPy, pandas を使ったデータ処理: Wes McKinney, 小林 儀匡, 鈴木 宏尚, 瀬戸山 雅人, 滝口 開資, 野上 大介: 本</a>
                </li>
              </ul>
            </div>
          </div>

          <div id="outline-container-unnumbered-7" class="outline-4">
            <h4 id="unnumbered-7">
              QSTK
            </h4>

            <div class="outline-text-4" id="text-unnumbered-7">
              <p>
                初心者がいきなりアルゴリズム投資なんてできるのだろうか, と初めは思った.だが, Python の投資用ライブラリを利用すると, 簡単にデータの取得や分析をすることができた.
              </p>

              <p>
                QSTK というものを利用する.
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://wiki.quantsoftware.org/index.php?title=QuantSoftware_ToolKit">Quantwiki</a>
                </li>
                <li>
                  <a href="https://github.com/tucker777/QSTK">https://github.com/tucker777/QSTK</a>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>

      <div id="outline-container-unnumbered-8" class="outline-2">
        <h2 id="unnumbered-8">
          感想
        </h2>

        <div class="outline-text-2" id="text-unnumbered-8">
        </div>

        <div id="outline-container-unnumbered-9" class="outline-3">
          <h3 id="unnumbered-9">
            競馬の投資シミュレーションについて
          </h3>

          <div class="outline-text-3" id="text-unnumbered-9">
            <p>
              大学生のとき, 競馬のレースをモンテカルロ法でシミュレートして, その結果によって, 最適なポートフォリオを組んで競馬にかけるようなことをした.
            </p>

            <p>
              本当は, 大学生のときも競馬ではなくて投資を対象にトライアルを することも考えたのだが, 金融工学を一から学ぶにはハードルが高いので,止めた.
            </p>

            <p>
              大学生のころは, 社会人になったらもっとプログラミングの知識を身につけ て, 株式投資でも同じようなことをしたいと思っていた.
            </p>

            <p>
              今回の Assingment は, それと同じことをしてポートフォリオを算出した. つまりは, 望みがかなって, うれしい.
            </p>
          </div>
        </div>

        <div id="outline-container-unnumbered-10" class="outline-3">
          <h3 id="unnumbered-10">
            今後について
          </h3>

          <div class="outline-text-3" id="text-unnumbered-10">
            <p>
              このアルゴリズム取引は, 実用的で楽しかった. ここで終わらせることなくて, 継続させたい. あわよくば, 億万長者になって, 明日は会社を休みたい.
            </p>

            <p>
              今回の内容は Part1 だが, Part2 は 2015 年に予定されている. Part2 では, 機械学習をアルゴリズム取引に導入するらしい.
            </p>

            <p>
              Ruby によるシステムトレード本というものを買った. ひとまずはこれを読んでみる.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/Ruby%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89-%E7%8F%BE%E4%BB%A3%E3%81%AE%E9%8C%AC%E9%87%91%E8%A1%93%E5%B8%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%9D%82%E6%9C%AC%E3%82%BF%E3%82%AF%E3%83%9E/dp/4775991280/ref=pd_sim_b_1?ie=UTF8&#038;refRID=1RXNRYY640CBNJB4AVE8">Amazon.co.jp: Ruby ではじめるシステムトレード (現代の錬金術師シリーズ): 坂本タクマ: 本</a> <ul class="org-ul">
                  <li>
                    <a href="http://moneyzine.jp/article/corner/7">坂本タクマの絶対システムトレード原論:株/FX ・投資と経済がよくわかる MONEYzine</a>
                  </li>
                </ul>
              </li>
            </ul>
          </div>
        </div>
      </div>

08 Nov 2014, 06:26

コマンドラインから JUnit を使う方法

最近, Eclipse が嫌いになってしまったので, コマンドラインから JUnit を利用する方法を調べてみた.

Environment

  • ArchLinux
  • JUnit 4.11

事前準備

JUnit をダウンロード.

適当なフォルダに junit.jar を配置したあとに, CLASSPATH を通す.

[sourcecode language=”bash” title=””]
export JUNIT_HOME = /usr/share/java
export CLASSPATH = $JUNIT_HOME/junit.jar:$CLASSPATH
[/sourcecode]

コマンドラインから実行

以下のソースを動かしてみる. ここでは, Lab2Test.java というファイル名.

[sourcecode language=”java” title=””]
import static org.junit.Assert.*;
import org.junit.Test;

public class Lab2Test {
public static int num () {
return 10;
}

@Test
public void test () {
assertEquals (10, num ());
}
}
[/sourcecode]

コンパイルは普通に実施.

[sourcecode language=”bash” title=””]
javac Lab2Test.java
[/sourcecode]

コマンドラインから実行するには, java org.junit.runner.JUnitCore [クラス名] という書き方をして実行する.

[sourcecode language=”bash” title=””]
$ java org.junit.runner.JUnitCore Lab2Test
JUnit version 4.11
.
Time: 0.004

OK (1 test)
[/sourcecode]

クラスが増えてきたら, プログラムにクラス名を書く方法もある. 以下, 参照.

Ant を利用する

すこし大きなコードを扱うときはビルドツールとの連携が役に立つ. ここでは, ant を利用してみる.

build.xml を作成.

JUnit で必要な情報は, ここが詳しい.

[sourcecode language=”xml” title=””]














[/sourcecode]

エラー詳細を表示するためには, の 1 行が必要.

Eclipseで自動生成

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    もっといい方法を発見したので、追記.
  </p>

  <p>
    Eclipseでbuild.xmlは自動生成ができる.
  </p>

  <p>
    自動生成したいプロジェクトを選択して、
  </p>

  <ul class="org-ul">
    <li>
      Eclipseメニューから「ファイル」>「エクスポート」を選択.
    </li>
    <li>
      [エクスポート]ダイアログから, [一般] > [Antビルド・ファイル]を選択.
    </li>
  </ul>

  <p>
    以下のようなbuild.xmlが生成される. 手動で build.xmlを記述するのがバカらしくなった.
  </p>

  <p>
    [sourcecode language=&#8221;xml&#8221; title=&#8221;&#8221;]<br /> <?xml version="1.0" encoding="UTF-8" standalone="no"?><br /> <!&#8211; WARNING: Eclipse auto-generated file.<br /> Any modifications will be overwritten.<br /> To include a user specific buildfile here, simply create one in the same<br /> directory with the processing instruction <?eclipse.ant.import?><br /> as the first entry and export the buildfile again. &#8211;><project basedir="." default="build" name="tdd_by_example"><br /> <property environment="env"/><br /> <property name="ECLIPSE_HOME" value="../../../../usr/share/eclipse/"/><br /> <property name="junit.output.dir" value="junit"/><br /> <property name="debuglevel" value="source,lines,vars"/><br /> <property name="target" value="1.7"/><br /> <property name="source" value="1.7"/>
  </p>

  <p>
    <path id="Junit4.userclasspath"><br /> <pathelement location="../../../../usr/share/java/junit.jar"/><br /> </path><br /> <path id="tdd_by_example.classpath"><br /> <pathelement location="bin"/><br /> <path refid="Junit4.userclasspath"/><br /> </path><br /> <target name="init"><br /> <mkdir dir="bin"/><br /> <copy includeemptydirs="false" todir="bin"><br /> <fileset dir="src"><br /> <exclude name="**/*.ucls"/><br /> <exclude name="**/*.java"/><br /> </fileset><br /> </copy><br /> <copy includeemptydirs="false" todir="bin"><br /> <fileset dir="test"><br /> <exclude name="**/*.ucls"/><br /> <exclude name="**/*.java"/><br /> </fileset><br /> </copy><br /> </target><br /> <target name="clean"><br /> <delete dir="bin"/><br /> </target><br /> <target depends="clean" name="cleanall"/><br /> <target depends="build-subprojects,build-project" name="build"/><br /> <target name="build-subprojects"/><br /> <target depends="init" name="build-project"><br /> <echo message="${ant.project.name}: ${ant.file}"/><br /> <javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}"><br /> <src path="src"/><br /> <src path="test"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </javac><br /> </target><br /> <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/><br /> <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler"><br /> <copy todir="${ant.library.dir}"><br /> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/><br /> </copy><br /> <unzip dest="${ant.library.dir}"><br /> <patternset includes="jdtCompilerAdapter.jar"/><br /> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/><br /> </unzip><br /> </target><br /> <target description="compile project with Eclipse compiler" name="build-eclipse-compiler"><br /> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/><br /> <antcall target="build"/><br /> </target><br /> <target name="MoneyTest"><br /> <mkdir dir="${junit.output.dir}"/><br /> <junit fork="yes" printsummary="withOutAndErr"><br /> <formatter type="xml"/><br /> <test name="tdd_by_example.MoneyTest" todir="${junit.output.dir}"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </junit><br /> </target><br /> <target name="tdd_by_example"><br /> <mkdir dir="${junit.output.dir}"/><br /> <junit fork="yes" printsummary="withOutAndErr"><br /> <formatter type="xml"/><br /> <test name="tdd_by_example.MoneyTest" todir="${junit.output.dir}"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </junit><br /> </target><br /> <target name="junitreport"><br /> <junitreport todir="${junit.output.dir}"><br /> <fileset dir="${junit.output.dir}"><br /> <include name="TEST-*.xml"/><br /> </fileset><br /> <report format="frames" todir="${junit.output.dir}"/><br /> </junitreport><br /> </target><br /> </project><br /> [/sourcecode]
  </p>
</div>

Emacs で利用する

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    Emacs で ant を実行するときは, -emacs オプションをつける
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> $ ant -emacs test<br /> [/sourcecode]
  </p>

  <p>
    エラーした場合, エラー箇所にジャンプできる.
  </p>
</div>

01 Nov 2014, 02:12

ArchLinux でノート PC のバッテリを長持ちさせる方法

最近引越しをした. 引っ越す前の町には電源カフェがたくさんあったのだが, 引越し先では, 電源が利用できるカフェが少ない.

なので, ノート PC (ArchLinux) のバッテリを長持ちさせる方法を模索してみた.

バッテリ確認

残りバッテリーを調べる

apci コマンドで, バッテリ状態を見ることができる.

$ apci -b

cbatticon

システムトレイ用のバッテリアイコン.

エコの設定

明るさ調整

明るさを低くすることで, バッテリを長持ちできる.

xcalib

xcalib で, コマンドラインから明るさを調整できる.

# 設定クリア
$ xcalib -c 

# 明るさを 70
$ xcalib -co 70 -a

laptop-mode-tools

laptop-mode-tools は, ラップトップ PC の電源を, 使用状態に応じて適切に調整してくれるツール.

初期設定はここ. /etc/laptop-mode/laptop-mode.conf

起動方法

# サービス登録
$ sudo systemctl enable laptop-mode
# 再起動
$ sudo systemctl restart laptop-mode

# 手動起動
$ sudo laptop-mode auto
# ステータス確認
$ sudo laptop-mode status

追加インストール

  • apcid で laptop-mode-tools から 電源管理.
  • hdparm で Hard Disk の回転数をセーブ.

バッテリーが少なくなったらサスペンド

以下を記述することで, バッテリが少なくなったときに, 自動的にサスペンド状態にする.

/etc/udev/rules.d/99-lowbat.rules

# Suspend the system when battery level drops to 2% or lower
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="2", RUN+="/usr/bin/systemctl suspend"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="1", RUN+="/usr/bin/systemctl suspend"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="0", RUN+="/usr/bin/systemctl suspend"