2014-05-31

魅惑の Qyoto (5) - ListWidget & ComboBox

Qyoto (Qt) を用いたリストウィジェットとコンボボックスを紹介します。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

リストウィジェット

リストウィジェット QListWidget はあらかじめ用意された選択肢の中から 1 つあるいは複数の項目を選択するためのウィジェットです。

List: listwidget.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QListWidget widget.
 * The option selected from the lw box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "リストウィジェット";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QListWidget lw = new QListWidget ();

        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed);
        lw.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            lw.AddItem (pref);
        }

        Connect (lw, SIGNAL ("itemSelectionChanged()"), this, SLOT ("OnSelected()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
        vbox.AddWidget (lw);
    }

    [Q_SLOT]
    public void OnSelected ()
    {
        QListWidget l = (QListWidget)Sender ();
        Console.WriteLine (l.CurrentItem ().Text () + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs listwidget.cs -pkg:qyoto
$ mono listwidget.exe
岩手県が選択されました。
福島県が選択されました。

コンボボックス

コンボボックス QComboBox は文字入力あるいは表示のための矩形領域と項目選択リストを組み合わせたウィジェットです。

List: combobox.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QComboBox widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "コンボボックス";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QComboBox combo = new QComboBox (this);

        label.SetSizePolicy (QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred);
        combo.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            combo.AddItem (pref);
        }

        Connect (combo, SIGNAL ("activated(QString)"), this, SLOT ("OnActivated(QString)"));

        QHBoxLayout hbox = new QHBoxLayout (this);
        hbox.AddWidget (label);
        hbox.AddWidget (combo);
    }

    [Q_SLOT]
    public void OnActivated (string text)
    {
        Console.WriteLine (text + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs combobox.cs -pkg:qyoto
$ mono combo.exe
岩手県が選択されました。
福島県が選択されました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-25

魅惑の Qyoto (4) - Buttons

Qyoto (Qt) を用いたボタン類のウィジェットを紹介します。Signal/Slot の使い方についてですが、参考文献 1 で紹介しているやり方ではコンパイルできなかったため、違うやり方をしています。この部分は改善の余地がありそうだということをご了承下さい。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

プッシュボタン

プッシュボタン QPushButton は Hello World! でも使ったウィジェットですが、再度紹介します。ボタンをマウスでクリックすると、イベント clicked() などが発生して、そのイベントに対応した処理をおこなうウィジェットです。

List: pushbutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QPushButton but1 = new QPushButton ("ボタンA");
        QPushButton but2 = new QPushButton ("ボタンB");
        QPushButton but3 = new QPushButton ("ボタンC");

        but1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (but1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (but1);
        vbox.AddWidget (but2);
        vbox.AddWidget (but3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QPushButton b = (QPushButton)Sender ();
        Console.WriteLine (Sender () + ":" + b.Text + "がクリックされました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs pushbutton.cs -pkg:qyoto
$ mono pushbutton.exe
Qyoto.QPushButton:ボタンAがクリックされました。
Qyoto.QPushButton:ボタンBがクリックされました。
Qyoto.QPushButton:ボタンCがクリックされました。

チェックボックス

チェックボックス QCheckBox は、特定の項目のオンとオフ(二値)を切り替えるために用いられるウィジェットで、オンとオフの状態が保持されます。

List: checkbox.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "チェックボックス";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QCheckBox chk1 = new QCheckBox ("チェックボックスA");
        QCheckBox chk2 = new QCheckBox ("チェックボックスB");
        QCheckBox chk3 = new QCheckBox ("チェックボックスC");

        chk1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (chk1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (chk1);
        vbox.AddWidget (chk2);
        vbox.AddWidget (chk3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        string statusMsg;
        QCheckBox c = (QCheckBox)Sender ();
        if (c.Checked) {
            statusMsg = "オン";
        } else {
            statusMsg = "オフ";
        }
        Console.WriteLine (Sender () + ":" + c.Text + "が" + statusMsg + "になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs checkbox.cs -pkg:qyoto
$ mono checkbox.exe
Qyoto.QCheckBox:チェックボックスAがオンになりました。
Qyoto.QCheckBox:チェックボックスBがオンになりました。
Qyoto.QCheckBox:チェックボックスCがオンになりました。
Qyoto.QCheckBox:チェックボックスAがオフになりました。
Qyoto.QCheckBox:チェックボックスBがオフになりました。

ラジオボタン

ラジオボタン QRadioButton は、複数の項目の中から 1 つだけ選択させるために用いられるウィジェットです。Qt の場合、親ウィジェットが同じであれば複数のラジオボタンは同じグループとして扱われます。同じ親の下で、複数のラジオボタンを複数のグループで管理したい場合には、QButtonGroup でグループを区別します。以下の例ではラジオボタンA、B、Cと、ラジオボタンD、Eを別のグループとして扱っています。

List: radiobutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ラジオボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QButtonGroup g1 = new QButtonGroup ();
        QButtonGroup g2 = new QButtonGroup ();

        QRadioButton rb1 = new QRadioButton ("ラジオボタンA");
        QRadioButton rb2 = new QRadioButton ("ラジオボタンB");
        QRadioButton rb3 = new QRadioButton ("ラジオボタンC");
        QRadioButton rb4 = new QRadioButton ("ラジオボタンD");
        QRadioButton rb5 = new QRadioButton ("ラジオボタンE");

        rb1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);            

        Connect (rb1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb4, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb5, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        g1.AddButton (rb1, 1);
        g1.AddButton (rb2, 2);
        g1.AddButton (rb3, 3);
        g2.AddButton (rb4, 4);
        g2.AddButton (rb5, 5);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (rb1);
        vbox.AddWidget (rb2);
        vbox.AddWidget (rb3);
        vbox.AddWidget (rb4);
        vbox.AddWidget (rb5);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QRadioButton r = (QRadioButton)Sender ();
        Console.WriteLine (Sender () + ":" + r.Text + "がオンになりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs radiobutton.cs -pkg:qyoto
$ mono radiobutton.exe
Qyoto.QRadioButton:ラジオボタンAがオンになりました。
Qyoto.QRadioButton:ラジオボタンBがオンになりました。
Qyoto.QRadioButton:ラジオボタンCがオンになりました。
Qyoto.QRadioButton:ラジオボタンDがオンになりました。
Qyoto.QRadioButton:ラジオボタンEがオンになりました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-24

魅惑の Qyoto (3) - Label

Qyoto (Qt) を用いたウィジェットを紹介していきますが、まだ Qt の Signal/Slot の理解が十分ではないので、今回は文字を表示するだけのラベルを紹介します。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ラベル

ラベル QLabel は、文字列(あるいは画像)を表示するウィジェットです。

List: label.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses QLabel to 
 * show lyrics of a song.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * laste modified 24-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "雨ニモマケズ";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        string text = @"雨ニモマケズ
風ニモマケズ
雪ニモ夏ノ暑サニモマケヌ
丈夫ナカラダヲモチ
慾ハナク
決シテ瞋ラズ
イツモシヅカニワラッテヰル
一日ニ玄米四合ト
味噌ト少シノ野菜ヲタベ
アラユルコトヲ
ジブンヲカンジョウニ入レズニ
ヨクミキキシワカリ
ソシテワスレズ
野原ノ松ノ林ノ蔭ノ
小サナ萓ブキノ小屋ニヰテ
東ニ病気ノコドモアレバ
行ッテ看病シテヤリ
西ニツカレタ母アレバ
行ッテソノ稲ノ朿ヲ負ヒ
南ニ死ニサウナ人アレバ
行ッテコハガラナクテモイヽトイヒ
北ニケンクヮヤソショウガアレバ
ツマラナイカラヤメロトイヒ
ヒドリノトキハナミダヲナガシ
サムサノナツハオロオロアルキ
ミンナニデクノボートヨバレ
ホメラレモセズ
クニモサレズ
サウイフモノニ
ワタシハナリタイ";

        QLabel label = new QLabel (text);
        label.Font = new QFont (null, 8);
        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

フォントの設定をしている QFont では、日本語フォントを制御する確認ができていないので、とりあえずフォントを null にしてサイズだけ指定しています。

コンパイルおよび実行例を以下に示します。

$ mcs label.cs -pkg:qyoto
$ mono label.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-23

【備忘録】Rパッケージのアップデート

R のパッケージを更新してくれるコマンドがあるとは知らず、あるかもしれないと探してみたら、やはりありましたので、自分のためにメモしておきます。

パッケージの動作がおかしいなぁと思っていたら、実はバグだったということがあり、しかも最新のバージョンでは既にフィックスされていて、自分の環境で使っているパッケージが古いだけだった、ということが無いようにしたいものです。

> update.packages()
 --- このセッションで使うために、CRAN のミラーサイトを選んでください --- 
 警告: package 'bitops' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'boot' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'class' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'cluster' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'foreign' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'KernSmooth' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'lattice' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'MASS' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'Matrix' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'mgcv' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'nlme' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'nnet' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'rpart' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'spatial' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'survival' in library '/usr/lib64/R/library' will not be updated 
 警告: package 'qcc' in library '/usr/share/R/library' will not be updated 
ggplot2 :
 Version 0.9.3.1 installed in /home/bitwalk/R/x86_64-redhat-linux-gnu-library/3.0 
 Version 1.0.0 available at http://cran.ism.ac.jp
Update (y/N/c)?  y
 URL 'http://cran.ism.ac.jp/src/contrib/ggplot2_1.0.0.tar.gz' を試しています 
Content type 'application/x-gzip' length 2351447 bytes (2.2 Mb)
 開かれた URL 
==================================================
downloaded 2.2 Mb

* installing *source* package ‘ggplot2’ ...
**  パッケージ ‘ggplot2’ の解凍および MD5 サムの検証に成功しました 
** R
** data
*** moving datasets to lazyload DB
** inst
** preparing package for lazy loading
** help
*** installing help indices
  converting help for package ‘ggplot2’
    finding HTML links ...  完了 
    absoluteGrob                            html  
    add_theme                               html  
    aes                                     html  
...
(省略)
...
    waiver                                  html  
    xylim                                   html  
    zeroGrob                                html  
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (ggplot2)

 ダウンロードされたパッケージは、以下にあります 
  ‘/tmp/RtmpW7V7cU/downloaded_packages’ 
> 

参考サイト

  1. R Installation and Administration - 6.4 Updating packages

2014-05-20

実験計画法 (Design of Experiment) とは何か? (8)

RSM, Response Surface Methodology(応答曲面法)を利用した実験計画と解析例について、前回は、今までの流れから、因子の水準の全ての組合せの計画(完全実施要因計画, Full Factorial Design)を例に取り上げて解析してみましたが、今回は RSM でよく使われる「中心複合計画」について説明します。※ 説明が不十分ですが、まずは公開して、徐々に書き足していくことをご了承下さい。

中心複合計画(Box-Wilson 法)

中心複合計画 Central Composite Design は、 二次の多項式モデルを用いて最適な条件を探索するのに適した計画の一つです。

中心複合計画の特徴は以下の通りです。

  • 各因子について、2 水準の完全実施計画(あるいは部分実施計画)。一次の項と 2 因子の交互作用効果の推定に寄与。
  • 軸上の 2k 個の計画点。ある点は、ある因子について水準の α 倍ないしは −α 倍、他の因子について 0 とした水準。二次の項の推定に寄与。
  • n 個の中心条件。誤差の推定と二次項の推定に寄与。

3 因子の計画の場合、左図のような水準の組み合わせになります。

実験計画法 (Design of Experiment) とは何か? (7) で扱った例は、以下のような因子と水準範囲でした。

温度[℃]
80 - 120
流量[リットル毎分]
30 - 50
回転数[回転毎分]
250 - 350

これに中心複合計画を適用すると以下のようになります。中心条件の繰り返し数は 3 としました。

> library("rsm")
>  (tbl <- ccd(3, n0 = c(3,0), alpha = "rotatable", randomize = FALSE, inscribed = FALSE, coding = list (x1 ~ (温度 - 100)/20, x2 ~ (流量 - 40)/10, x3 ~ (回転数 - 300)/50), oneblock = TRUE))
   run.order std.order      温度     流量   回転数
1          1         1  80.00000 30.00000 250.0000
2          2         2 120.00000 30.00000 250.0000
3          3         3  80.00000 50.00000 250.0000
4          4         4 120.00000 50.00000 250.0000
5          5         5  80.00000 30.00000 350.0000
6          6         6 120.00000 30.00000 350.0000
7          7         7  80.00000 50.00000 350.0000
8          8         8 120.00000 50.00000 350.0000
9          9         9 100.00000 40.00000 300.0000
10        10        10 100.00000 40.00000 300.0000
11        11        11 100.00000 40.00000 300.0000
12         1         1  66.36414 40.00000 300.0000
13         2         2 133.63586 40.00000 300.0000
14         3         3 100.00000 23.18207 300.0000
15         4         4 100.00000 56.81793 300.0000
16         5         5 100.00000 40.00000 215.9104
17         6         6 100.00000 40.00000 384.0896

Data are stored in coded form using these coding formulas ...
x1 ~ (温度 - 100)/20
x2 ~ (流量 - 40)/10
x3 ~ (回転数 - 300)/50
> 
条件温度流量回転数収率
1803025080.18
21203025082.73
3805025079.79
41205025082.49
5803035080.81
61203035082.12
7805035076.44
81205035079.90
91004030081.01
101004030080.98
111004030081.95
12664030079.63
131344030082.17
141002330081.76
151005730080.26
161004021682.33
171004038479.63

右のテーブル全体を選択して(クリップボードへ)コピーしてから、R 上で次のコマンドを実行してください。クリップボードの値が R のデータフレーム(テーブル)へ読み込まれます。

> tbl <- read.table("clipboard", header = T)
>
> tbl
   条件 温度 流量 回転数  収率
1     1   80   30    250 80.18
2     2  120   30    250 82.73
3     3   80   50    250 79.79
4     4  120   50    250 82.49
5     5   80   30    350 80.81
6     6  120   30    350 82.12
7     7   80   50    350 76.44
8     8  120   50    350 79.90
9     9  100   40    300 81.01
10   10  100   40    300 80.98
11   11  100   40    300 81.95
12   12   66   40    300 79.63
13   13  134   40    300 82.17
14   14  100   23    300 81.76
15   15  100   57    300 80.26
16   16  100   40    216 82.33
17   17  100   40    384 79.63
> 

パッケージ rsm を読み込んで、回帰分析をするために、tbl の因子水準を -1, 0, 1 にコード化します。

> (tbl.coded <- coded.data(tbl, x1 ~ (温度 - 100)/20, x2 ~ (流量 - 40) / 10, x3 ~ (回転数 - 300) / 50))
   条件 温度 流量 回転数  収率
1     1   80   30    250 80.18
2     2  120   30    250 82.73
3     3   80   50    250 79.79
4     4  120   50    250 82.49
5     5   80   30    350 80.81
6     6  120   30    350 82.12
7     7   80   50    350 76.44
8     8  120   50    350 79.90
9     9  100   40    300 81.01
10   10  100   40    300 80.98
11   11  100   40    300 81.95
12   12   66   40    300 79.63
13   13  134   40    300 82.17
14   14  100   23    300 81.76
15   15  100   57    300 80.26
16   16  100   40    216 82.33
17   17  100   40    384 79.63

Data are stored in coded form using these coding formulas ...
x1 ~ (温度 - 100)/20
x2 ~ (流量 - 40)/10
x3 ~ (回転数 - 300)/50
> 

コード化したデータを使って高々二次の線形モデル (SO) にフィッティング(回帰分析)をします。

> (tbl.rsm <- rsm(収率 ~ SO(x1, x2, x3), data = tbl.coded))

Call:
rsm(formula = 収率 ~ SO(x1, x2, x3), data = tbl.coded)

Coefficients:
         (Intercept)      FO(x1, x2, x3)x1      FO(x1, x2, x3)x2  
             81.3329                1.0405               -0.7090  
    FO(x1, x2, x3)x3  TWI(x1, x2, x3)x1:x2  TWI(x1, x2, x3)x1:x3  
             -0.7663                0.2875               -0.0600  
TWI(x1, x2, x3)x2:x3    PQ(x1, x2, x3)x1^2    PQ(x1, x2, x3)x2^2  
             -0.7450               -0.2255               -0.1874  
  PQ(x1, x2, x3)x3^2  
             -0.2044  

> 

重回帰分析の統計値の算出は、通常の場合と同じように summary を使います。

> summary(tbl.rsm)
Call:
rsm(formula = 収率 ~ SO(x1, x2, x3), data = tbl.coded)

            Estimate Std. Error  t value  Pr(>|t|)    
(Intercept) 81.33287    0.38906 209.0510 1.513e-14 ***
x1           1.04049    0.18174   5.7251 0.0007165 ***
x2          -0.70900    0.18174  -3.9011 0.0058903 ** 
x3          -0.76630    0.18264  -4.1957 0.0040573 ** 
x1:x2        0.28750    0.23852   1.2053 0.2672386    
x1:x3       -0.06000    0.23852  -0.2515 0.8086174    
x2:x3       -0.74500    0.23852  -3.1234 0.0167648 *  
x1^2        -0.22548    0.19782  -1.1398 0.2918503    
x2^2        -0.18742    0.19782  -0.9474 0.3749705    
x3^2        -0.20440    0.20184  -1.0127 0.3449259    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.9185,    Adjusted R-squared:  0.8137 
F-statistic: 8.766 on 9 and 7 DF,  p-value: 0.004582

Analysis of Variance Table

Response: 収率
                Df  Sum Sq Mean Sq F value    Pr(>F)
FO(x1, x2, x3)   3 29.8579  9.9526 21.8665 0.0006232
TWI(x1, x2, x3)  3  5.1303  1.7101  3.7571 0.0678184
PQ(x1, x2, x3)   3  0.9213  0.3071  0.6747 0.5944141
Residuals        7  3.1861  0.4552                  
Lack of fit      5  2.5776  0.5155  1.6945 0.4112877
Pure error       2  0.6085  0.3042                  

Stationary point of response surface:
       x1        x2        x3 
 1.453147 -1.286240  0.256269 

Stationary point in original units:
    温度     流量   回転数 
129.0629  27.1376 312.8134 

Eigenanalysis:
$values
[1]  0.2123273 -0.2428227 -0.5868074

$vectors
         [,1]        [,2]       [,3]
x1 -0.2766053  0.93416169  0.2254583
x2 -0.7064912 -0.03863937 -0.7066663
x3  0.6514290  0.35475192 -0.6706649


> 

応答の等高線図 (Contour Map) をプロットしてみましょう。

> par (mfrow = c (2,3))
> contour(tbl.rsm, ~x1+x2+x3, at = xs(tbl.rsm))
> persp (tbl.rsm, ~x1+x2+x3, at = xs(tbl.rsm)) 
>

参考サイト

  1. Central composite design - Wikipedia, the free encyclopedia
  2. 5.3.3.6.1. Central Composite Designs (CCD)
  3. 応答曲面法のための実験計画

2014-05-15

魅惑の Qyoto (2) - Layout

Qyoto (Qt) でウィジェットを配置するには、Hello Wold! で紹介したサンプルのように絶対座標を指定する方法の他に、レイアウトマネージャを使う方法があります。レイアウトには「ボックスレイアウト」「グリッドレイアウト」「フォームレイアウト」そして「スタックトレイアウト」の四種類がありますが、その内最初の 2 つを使ってウィジェットを配置するサンプルを紹介します。

ここでは二種類のサンプルを紹介しますが、どちらもベタなコーディングで申し訳ありません(もう少し繰り返しを無くしたすっきりしたコーディングにしたいのですが、できていません)。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ボックスレイアウト

縦方向 (QVBoxLayout) あるいは横方向 (QHBoxLayout) にウィジェットを配置するレイアウトマネージャです。レイアウトマネージャを組み合わせて、縦横にウィジェットを配置することができます。

参考サイト 1. に掲載されているサンプルをベースにしたボックスレイアウトのサンプルを示します。

List: boxlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use box layouts
 * to position two buttons in the
 * bottom right corner of the window.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "BoxLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {    
        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout(this);
        QHBoxLayout hbox1 = new QHBoxLayout();
        QHBoxLayout hbox2 = new QHBoxLayout();

        hbox1.AddWidget(but_1);
        hbox1.AddWidget(but_2);
        hbox1.AddWidget(but_3);

        hbox2.AddWidget(but_4);
        hbox2.AddWidget(but_5);

        vbox.AddLayout(hbox1);
        vbox.AddLayout(hbox2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs boxlayout.cs -pkg:qyoto
$ mono boxlayout.exe


グリッドレイアウト

QGridLayout は、格子状にウィジェットを配置するレイアウトマネージャです。

次に、同じく参考サイト 1. に掲載されているサンプルをベースにした QGridLayout のサンプルを示します。

List: gridlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use the QGridLayout manager
 * to create a New Folder example.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "GridLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {
        QGridLayout grid = new QGridLayout(this);

        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        grid.AddWidget(but_1, 0, 0);
        grid.AddWidget(but_2, 0, 1);
        grid.AddWidget(but_3, 0, 2);
        grid.AddWidget(but_4, 1, 0);
        grid.AddWidget(but_5, 1, 1, 1, 2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs gridlayout.cs -pkg:qyoto
$ mono gridlayout.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-14

魅惑の Qyoto (1) - Hello World!

Java のように、Linux 上で開発したプログラムを Windows でも動作させることができる開発環境を常に探索していますが、.Net/Mono もそのように利用できそうだと注目しています。

ただ GUI ライブラリに何を使うかが悩みの種です。C# については、Windows 上では .Net、Linux 上では Mono の開発環境を使えば良いと考えています。そういう考えに立って Windows と Linux の両方で利用できる GUI ライブラリを考えた場合、Linux 上での Mono / GTk# の組み合わせは問題ないのですが、Windows 上で Mono 抜きに .Net / GTk# の開発環境を構築する壁にぶつかります。

そこで wxWidgets の wx.Net や Qt の Qyoto などの .Net / Mono バインディングを調べてみたところ、Qyoto が Fedora で利用できることが判りましたので、とりあえず試してみました。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは以下の通りです。なお、Fedora 20 における Mono-3.4 系のパッケージの入手については、本記事の最後にある、参考サイト 1. を参照してください。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

参考サイト 2. に掲載されているサンプルをベースにして、簡単な Hello World! プログラムで動作確認をしました。

List: hello-qyoto.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 13-May-2014
 */


public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "mono/qyoto";

        InitUI();

        Resize(180, 60);
        Move(300, 300);
        Show();
    }

    public void InitUI() 
    {    
        QPushButton but = new QPushButton("こんにちは、世界!", this);

        Connect(but, SIGNAL("clicked()"), qApp, SLOT("quit()"));
        but.SetGeometry(10, 10, 160, 40);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

Mono によるコンパイルおよび実行例を以下に示します。

$ mcs hello-qyoto.cs -pkg:qyoto
$ mono hello-qyoto.exe

参考サイト 2. に掲載されているサンプルをざっとみたところ、これなら自分でもできそうだと思いましたので、そこに掲載されているサンプルをベースに、今後何回かに分けて Qyoto を使った Mono のプログラミング例を紹介していく予定です 4.

ちなみに、Windows 上での実行ですが、まだ成功していません。これについても調査結果を紹介していきたいと考えています。

参考サイト

  1. bitWalk's: Mono で GUI プログラミング - Mono 3.4 を試す
  2. C# Qyoto tutorial
  3. Development/Languages/Qyoto - KDE TechBase
  4. bitWalk's: 魅惑の Qyoto

2014-05-11

Mono で GUI プログラミング - Mono 3.4 を試す

Fedora 20 で Mono 3.4 を試してみましたので、備忘録的にまとめておきます。

レポジトリの追加

Fedora 20 を導入した時、クリーンインストールをしました。その際、monodevelopyum でインストールしてあります。当然その際、必要な関連パッケージもインストールされています。

この状態で、参考サイト [1] のレポジトリ情報 fedora-monodevelop.repo を、ルート権限で /etc/yum.repos.d/ にこのレポジトリ情報を追加(保存)して、yum update で MonoDevelop 4.22 および Mono 3.4.0 に更新しました。

最初、サンプルプログラムを正常にコンパイル・実行できなかったので、試行錯誤の結果、下記のパッケージを追加インストールしています。

  • libgdiplus-devel
  • mono-data-oracle
  • gtk-sharp2-devel

再び Hello World プログラム

いまさら Hello World プログラムというのもなんですが、簡単なプログラムで動作確認をします。

List: hello-winforms.cs
using System;
using System.Windows.Forms;
 
class HelloWorldApp {
    public static void Main() {
        MessageBox.Show("こんにちは、世界!", "mono");
    }
}

以前は mscorlib のバージョンによって gmcs, smcs, dmcs と複数のコンパイルコマンドが存在していましたが、参考サイト [2] によると、コンパイルコマンドは、Mono 2.11 以降 mcs に統合されたということですのでこれをコンパイルに使います。

$ mcs hello-winforms.cs -pkg:dotnet -target:winexe
$ mono hello-winforms.exe
$

コンパイルの際、-target:winexe を省略すると、Windows 上で実行した時に、コマンドプロンプトのウィンドウも表示されます。

以下は hello-winforms.exe を Windows 7 (32bit) へコピーして実行した例です。

Mono の標準の GUI Toolkit である GTk# を利用した場合の Hello World プログラムを下記に示しました。

List: hello-gtksharp.cs
using Gtk;
using System;
 
class Hello {
 
    static void Main()
    {
        Application.Init ();

        // Set up a button object.
        Button btn = new Button ("こんにちは、世界!");
        // when this button is clicked, it'll run hello()
        btn.Clicked += new EventHandler (hello);

        Window window = new Window ("mono");
        // when this window is deleted, it'll run delete_event()
        window.DeleteEvent += delete_event;

        // Add the button to the window and display everything
        window.Add (btn);
        window.ShowAll ();

        Application.Run ();
    }

    // runs when the user deletes the window using the "close
    // window" widget in the window frame.
    static void delete_event (object obj, DeleteEventArgs args)
    {
        Application.Quit ();
    }

    // runs when the button is clicked.
    static void hello (object obj, EventArgs args)
    {
        Console.WriteLine("こんにちは、世界!");
        Application.Quit ();
    }
}
$ mcs hello-gtksharp.cs -pkg:gtk-sharp-2.0
$ mono hello-gtksharp.exe
こんにちは、世界!
$ 

Windows と Linux 両方で動作することに興味があるのですが、今さら Windows Forms (winforms) に力を入れるのはやや時代遅れな気がしないでもありません。むしろ GTk# の環境を Windows でも使えるようにして GTk# の GUI を Linux と Windows 両方で利用できる方が価値が高いような気がしています。うまくいくようであれば、本ブログで報告します。

【注記】その後、Qt の C# バインディング Qyoto に注目して調べています。魅惑の Qyoto を参照してください。


参考サイト

  1. http://repos.fedorapeople.org/repos/elsupergomez/monodevelop/fedora-monodevelop.repo
  2. CSharp Compiler - Mono

2014-05-09

Mono で GUI プログラミング - Fedora 21 と Mono 3.4

Mono は、Ecma 標準に準じた .NET Framework 互換の環境を実現するためのオープンソースのプロジェクトです。

Fedora でも Mono を利用できますが、永らく Mono のバージョンは 2.10 のままでした。しかし、下記プロジェクトサイトによると、2014 年 10 月頃に予定されている次回のリリース Fedora 21コードネームなし)では、一気に Mono のバージョンが 3.4 になるようです。

このサイトによると、Fedora 19, 20 を使っている開発者向けにも Mono 3.4 および Monodevelop 4.x.x 系を試せるように Mono 専用のレポジトリが用意されています(下記)。

早速 /etc/yum.repos.d/ にこのレポジトリ情報を追加(保存)して、yum update で Mono を 3.4.0 に更新しました。後日、情報をまとめて本ブログに掲載します。

2014-05-07

実験計画法 (Design of Experiment) とは何か? (7)

RSM, Response Surface Methodology(応答曲面法)を利用した実験計画と解析例を、まず、今までの紹介した実験例の延長で扱ってみたいと思います。というのは RSM における実験計画には、回帰分析をすることを前提とした計画があるためですが、それについては次回以降に説明をする予定です。


3 因子 3 水準の実験(繰り返しなし)

今回取り上げる例は、「高」「低」や「大」「小」といった離散的な水準あるいは「A 社品」「B 社品」といった質的な量ではなく、連続量を設定できる因子の水準を扱います。

条件温度流量回転数収率
1803025081.64
2803030080.14
3803035081.08
4804025080.57
5804030078.77
6804035078.95
7805025080.53
8805030077.88
9805035076.18
101003025081.68
111003030081.14
121003035082.61
131004025082.60
141004030080.19
151004035080.04
161005025081.85
171005030079.65
181005035077.89
191203025083.53
201203030083.53
211203035081.95
221204025083.04
231204030082.36
241204035081.92
251205025083.60
261205030081.79
271205035079.80

例)

ある製品の製造工程において、「温度」、「流量」、「回転数」の 3 つの因子が収量に影響を与えるかどうかを調べるため、3 水準の実験を計画し、各条件の収量を測定した結果を右に示した。この 3 因子が収量に及ぼす影響を分析せよ。ただし、過去の知見から「流量」と「回転数」には交互作用のあることが判っているものとする。

右のテーブル全体を選択して(クリップボードへ)コピーしてから、R 上で次のコマンドを実行してください。クリップボードの値が R のデータフレーム(テーブル)へ読み込まれます。

> tbl <- read.table("clipboard", header = T)
>
> tbl
   条件 温度 流量 回転数  収率
1     1   80   30    250 81.64
2     2   80   30    300 80.14
3     3   80   30    350 81.08
4     4   80   40    250 80.57
5     5   80   40    300 78.77
6     6   80   40    350 78.95
7     7   80   50    250 80.53
8     8   80   50    300 77.88
9     9   80   50    350 76.18
10   10  100   30    250 81.68
11   11  100   30    300 81.14
12   12  100   30    350 82.61
13   13  100   40    250 82.60
14   14  100   40    300 80.19
15   15  100   40    350 80.04
16   16  100   50    250 81.85
17   17  100   50    300 79.65
18   18  100   50    350 77.89
19   19  120   30    250 83.53
20   20  120   30    300 83.53
21   21  120   30    350 81.95
22   22  120   40    250 83.04
23   23  120   40    300 82.36
24   24  120   40    350 81.92
25   25  120   50    250 83.60
26   26  120   50    300 81.79
27   27  120   50    350 79.80
> 

パッケージ rsm を読み込んで、回帰分析をするために、tbl の因子水準を -1, 0, 1 にコード化します。

> library("rsm")
> (tbl.coded <- coded.data(tbl, x1 ~ (温度 - 100)/20, x2 ~ (流量 - 40) / 10, x3 ~ (回転数 - 300) / 50))
   温度 流量 回転数  収率
1    80   30    250 81.64
2    80   30    300 80.14
3    80   30    350 81.08
4    80   40    250 80.57
5    80   40    300 78.77
6    80   40    350 78.95
7    80   50    250 80.53
8    80   50    300 77.88
9    80   50    350 76.18
10  100   30    250 81.68
11  100   30    300 81.14
12  100   30    350 82.61
13  100   40    250 82.60
14  100   40    300 80.19
15  100   40    350 80.04
16  100   50    250 81.85
17  100   50    300 79.65
18  100   50    350 77.89
19  120   30    250 83.53
20  120   30    300 83.53
21  120   30    350 81.95
22  120   40    250 83.04
23  120   40    300 82.36
24  120   40    350 81.92
25  120   50    250 83.60
26  120   50    300 81.79
27  120   50    350 79.80

Data are stored in coded form using these coding formulas ...
x1 ~ (温度 - 100)/20
x2 ~ (流量 - 40)/10
x3 ~ (回転数 - 300)/50
> print(tbl.coded, decode = FALSE)
   条件 x1 x2 x3  収率
1     1 -1 -1 -1 81.64
2     2 -1 -1  0 80.14
3     3 -1 -1  1 81.08
4     4 -1  0 -1 80.57
5     5 -1  0  0 78.77
6     6 -1  0  1 78.95
7     7 -1  1 -1 80.53
8     8 -1  1  0 77.88
9     9 -1  1  1 76.18
10   10  0 -1 -1 81.68
11   11  0 -1  0 81.14
12   12  0 -1  1 82.61
13   13  0  0 -1 82.60
14   14  0  0  0 80.19
15   15  0  0  1 80.04
16   16  0  1 -1 81.85
17   17  0  1  0 79.65
18   18  0  1  1 77.89
19   19  1 -1 -1 83.53
20   20  1 -1  0 83.53
21   21  1 -1  1 81.95
22   22  1  0 -1 83.04
23   23  1  0  0 82.36
24   24  1  0  1 81.92
25   25  1  1 -1 83.60
26   26  1  1  0 81.79
27   27  1  1  1 79.80

Variable codings ...
x1 ~ (温度 - 100)/20
x2 ~ (流量 - 40)/10
x3 ~ (回転数 - 300)/50
> 

コード化したデータを使って高々二次の線形モデル (SO) にフィッティング(回帰分析)をします。

> (tbl.rsm <- rsm(収率 ~ SO(x1, x2, x3), data = tbl.coded))
Call:
rsm(formula = 収率 ~ SO(x1, x2, x3), data = tbl.coded)

Coefficients:
         (Intercept)      FO(x1, x2, x3)x1      FO(x1, x2, x3)x2  
            80.54815               1.43222              -1.00722  
    FO(x1, x2, x3)x3  TWI(x1, x2, x3)x1:x2  TWI(x1, x2, x3)x1:x3  
            -1.03444               0.37083               0.00250  
TWI(x1, x2, x3)x2:x3    PQ(x1, x2, x3)x1^2    PQ(x1, x2, x3)x2^2  
            -0.90833               0.10889              -0.02278  
  PQ(x1, x2, x3)x3^2  
             0.47556  

>

重回帰分析の統計値の算出は、通常の場合と同じように summary を使います。

> summary(tbl.rsm)

Call:
rsm(formula = 収率 ~ SO(x1, x2, x3), data = tbl.coded)

             Estimate Std. Error  t value  Pr(>|t|)    
(Intercept) 80.548148   0.274184 293.7743 < 2.2e-16 ***
x1           1.432222   0.126922  11.2842 2.563e-09 ***
x2          -1.007222   0.126922  -7.9357 4.073e-07 ***
x3          -1.034444   0.126922  -8.1502 2.831e-07 ***
x1:x2        0.370833   0.155448   2.3856   0.02896 *  
x1:x3        0.002500   0.155448   0.0161   0.98736    
x2:x3       -0.908333   0.155448  -5.8433 1.956e-05 ***
x1^2         0.108889   0.219836   0.4953   0.62672    
x2^2        -0.022778   0.219836  -0.1036   0.91869    
x3^2         0.475556   0.219836   2.1632   0.04506 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.9466,    Adjusted R-squared:  0.9184 
F-statistic:  33.5 on 9 and 17 DF,  p-value: 4.426e-09

Analysis of Variance Table

Response: 収率
                Df Sum Sq Mean Sq F value    Pr(>F)
FO(x1, x2, x3)   3 74.445 24.8150 85.5786 1.839e-10
TWI(x1, x2, x3)  3 11.551  3.8504 13.2786 0.0001029
PQ(x1, x2, x3)   3  1.431  0.4771  1.6452 0.2163396
Residuals       17  4.929  0.2900                  
Lack of fit     17  4.929  0.2900                  
Pure error       0  0.000                          

Stationary point of response surface:
       x1        x2        x3 
-1.672520 -2.868849 -1.647805 

Stationary point in original units:
     温度      流量    回転数 
 66.54960  11.31151 217.60974 

Eigenanalysis:
$values
[1]  0.7583657  0.1520116 -0.3487107

$vectors
         [,1]      [,2]       [,3]
x1 -0.1477192 0.9303944  0.3354777
x2 -0.5230889 0.2143790 -0.8248755
x3  0.8393789 0.2973346 -0.4550111

上の赤字の部分は Windows 版 (R 3.1.0) の場合に表示されるのですが、Linux 版 (Fedora 20, R 3.0.2) では表示されません。表示されない理由は不明ですが、重相関係数 (R2) などは算出されています。

> names(summary(tbl.rsm))
 [1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"         "df"            "r.squared"    
 [9] "adj.r.squared" "fstatistic"    "cov.unscaled"  "canonical"     "lof"           "coding"       
> summary(tbl.rsm)$r.squared
[1] 0.946626

通常の解析では、ここで変数選択(ステップワイズ)をしてフィッティングを良くするのですが、その場合、他のパッケージを利用する必要がありますので、今回はこのまま続けます。なお、回帰式の変数 x1, x2, x3 は、それぞれ因子 温度, 流量, 回転数の水準が -1, 0, 1 にコード化されていますので、それぞれの係数の推定値の大きさが、応答に及ぼす大きさであると評価することができます。主効果であれば、x1, x2, x3、交互効果であれば x1:x2, x1:x3, x2:x3 の係数の推定値の大きさになります。

残渣などからを回帰分析の善し悪しを診断します。なお、この例は意図的に作ってあるため、極端な外れ値は存在しません。

> par (mfrow = c (2,2))
> plot(tbl.rsm)
>

応答の等高線図 (Contour Map) をプロットしてみましょう。

> par (mfrow = c (2,3))
> contour(tbl.rsm, ~x1+x2+x3, at = xs(tbl.rsm))
> persp (tbl.rsm, ~x1+x2+x3, at = xs(tbl.rsm)) 
>

応答のターゲットあるいは極小値/極大値を見つけ出すコマンドは、rsm パッケージに用意されていませんが、応答曲面の傾斜に沿って、最も降下あるいは上昇するラインの応答の予測値 (yhat) を算出できますので、求める応答の値を実現する因子の組合せを探索する出発点として利用できます。

> steepest(tbl.rsm)
Path of steepest ascent from ridge analysis:
   dist    x1     x2     x3 |   温度  流量 回転数 |    yhat
1   0.0 0.000  0.000  0.000 | 100.00 40.00 300.00 |  80.548
2   0.5 0.370 -0.150 -0.301 | 107.40 38.50 284.95 |  81.536
3   1.0 0.677 -0.038 -0.735 | 113.54 39.62 263.25 |  82.587
4   1.5 0.864  0.205 -1.209 | 117.28 42.05 239.55 |  83.893
5   2.0 0.997  0.469 -1.669 | 119.94 44.69 216.55 |  85.538
6   2.5 1.106  0.737 -2.118 | 122.12 47.37 194.10 |  87.549
7   3.0 1.204  1.004 -2.558 | 124.08 50.04 172.10 |  89.927
8   3.5 1.296  1.270 -2.993 | 125.92 52.70 150.35 |  92.681
9   4.0 1.383  1.535 -3.426 | 127.66 55.35 128.70 |  95.815
10  4.5 1.467  1.800 -3.855 | 129.34 58.00 107.25 |  99.320
11  5.0 1.549  2.064 -4.282 | 130.98 60.64  85.90 | 103.198
> 

RSM の目的

RSM の目的は、真の理論式を探し出すことではありません。実験範囲において多項式などの回帰モデルを用いて、できるだけ精度よく現象を近似すること、さらには欲しい最適な水準の組合せ(最適条件)を探し出すことです。

2014-05-05

【備忘録】Microsoft's TrueType Core Fonts on Linux

Linux の X Window 上で、Microsoft Windows の True Type Font が使えれば。。。、という以前の記事(下記)のアップデートです。

これは Microsoft がインターネット上で公開していた True Type Font(英文用のみ)を利用して Linux の RPM パッケージを作成するための spec ファイルを公開しているプロジェクトサイトです。

  1. Smart package of Microsoft's core fonts | Free software downloads at SourceForge.net
  2. Microsoft's TrueType core fonts on rpm based systems

Fedora の場合は、下記のパッケージが予めインストールされている必要があります。

  • rpm-build
  • wget
  • ttmkfdir

試しに自分の環境で上記パッケージをインストールしようとすると下記のようになります。

$ su
パスワード:
# yum install rpm-build wget ttmkfdir
読み込んだプラグイン:langpacks
Dropbox                                                  |  951 B     00:00     
google-chrome                                            |  951 B     00:00     
rpmfusion-free-updates                                   | 3.3 kB     00:00     
rpmfusion-nonfree-updates                                | 3.3 kB     00:00     
updates/20/x86_64/metalink                               | 4.8 kB     00:00     
パッケージ rpm-build-4.11.2-2.fc20.x86_64 はインストール済みか最新バージョンです
パッケージ wget-1.14-12.fc20.x86_64 はインストール済みか最新バージョンです
パッケージ ttmkfdir-3.0.9-40.fc20.x86_64 はインストール済みか最新バージョンです
何もしません
# 

あとは spec ファイルをダウンロードして、自分でビルドしてインストールするだけです。ところが最新の spec ファイルは上記のプロジェクトサイド [1] の Files には無く、プロジェクトの Web サイト [2] のリンクから入手するようになっています(もっと言えば、このファイルは Web サイトと同じディレクトリにあります)。このファイルを msttcorefonts-2.5-1.spec という名前で適当な場所へ保存します。なお、rpmbuild コマンドでビルドするデフォルトの spec ファイルの保存場所は、$HOME/rpmbuild/SPECS になります。

ダウンロードした spec ファイルから RPM パッケージをビルドするには以下のようにします(Fedora 20 の場合)。

$ cd rpmbuild/SPECS
$ rpmbuild -ba msttcorefonts-2.5-1.spec
警告: %changelog に偽の日付: Fri Aug 25 2001 Daniel Resare 
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.g0ZA7m
+ umask 022
+ cd /home/bitwalk/rpmbuild/BUILD
+ mkdir -p msttcorefonts/downloads
+ cd msttcorefonts/downloads
+ mirrors=aarnet+cdnetworks-kr-1+citylan+dfn+freefr+garr+heanet+hivelocity+ignum+internode+iweb+jaist+nchc+netcologne+space+superb-dca2+superb-dca3+superb-sea2+switch+tenet+ufpr+voxel+waix
+ mirror_count=23
+ andale32_md5='cbdc2fdd7d2ed0832795e86a8b9ee19a  andale32.exe'
+ arial32_md5='9637df0e91703179f0723ec095a36cb5  arial32.exe'
+ arialb32_md5='c9089ae0c3b3d0d8c4b0a95979bb9ff0  arialb32.exe'
+ comic32_md5='2b30de40bb5e803a0452c7715fc835d1  comic32.exe'
+ courie32_md5='4e412c772294403ab62fb2d247d85c60  courie32.exe'
+ georgi32_md5='4d90016026e2da447593b41a8d8fa8bd  georgi32.exe'
+ impact32_md5='7907c7dd6684e9bade91cff82683d9d7  impact32.exe'
+ times32_md5='ed39c8ef91b9fb80f76f702568291bd5  times32.exe'
+ trebuc32_md5='0d7ea16cac6261f8513a061fbfcdb2b5  trebuc32.exe'
+ webdin32_md5='230a1d13a365b22815f502eb24d9149b  webdin32.exe'
+ verdan32_md5='12d2a75f8156e10607be1eaa8e8ef120  verdan32.exe'
+ wd97vwr32_md5='efa72d3ed0120a07326ce02f051e9b42  wd97vwr32.exe'
+ download_files='andale32.exe arial32.exe arialb32.exe comic32.exe courie32.exe georgi32.exe impact32.exe times32.exe trebuc32.exe webdin32.exe verdan32.exe wd97vwr32.exe'
+ failures=0
+ set_mirror
+ local r m
++ expr 17518 % 23 + 1
+ r=16
++ echo aarnet+cdnetworks-kr-1+citylan+dfn+freefr+garr+heanet+hivelocity+ignum+internode+iweb+jaist+nchc+netcologne+space+superb-dca2+superb-dca3+superb-sea2+switch+tenet+ufpr+voxel+waix
++ cut -d+ -f16
+ m=superb-dca2
+ mirror=http://superb-dca2.dl.sourceforge.net/project/corefonts/the%20fonts/final/
+ for f in '$download_files'
+ check_file andale32.exe
+ matches=
+ '[' '!' -r andale32.exe ']'
+ echo 'andale32.exe does not exist'
andale32.exe does not exist
+ return
+ '[' '!' ']'
+ download http://superb-dca2.dl.sourceforge.net/project/corefonts/the%20fonts/final/ andale32.exe
+ wget --timeout=5 -O andale32.exe http://superb-dca2.dl.sourceforge.net/project/corefonts/the%20fonts/final/andale32.exe
--2014-05-05 12:28:40--  http://superb-dca2.dl.sourceforge.net/project/corefonts/the%20fonts/final/andale32.exe
Resolving superb-dca2.dl.sourceforge.net (superb-dca2.dl.sourceforge.net)... 209.61.193.20
Connecting to superb-dca2.dl.sourceforge.net (superb-dca2.dl.sourceforge.net)|209.61.193.20|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 198384 (194K) [application/octet-stream]
Saving to: 'andale32.exe'

100%[======================================>] 198,384      178KB/s   in 1.1s   

2014-05-05 12:28:42 (178 KB/s) - 'andale32.exe' saved [198384/198384]

+ check_file andale32.exe
+ matches=
+ '[' '!' -r andale32.exe ']'
++ basename andale32.exe .exe
+ local variable_name=andale32_md5
+ local stored_checksum
+ eval 'stored_checksum=$andale32_md5'
++ stored_checksum='cbdc2fdd7d2ed0832795e86a8b9ee19a  andale32.exe'
++ md5sum andale32.exe
+ local 'computed_checksum=cbdc2fdd7d2ed0832795e86a8b9ee19a  andale32.exe'
+ '[' 'cbdc2fdd7d2ed0832795e86a8b9ee19a  andale32.exe' = 'cbdc2fdd7d2ed0832795e86a8b9ee19a  andale32.exe' ']'
+ matches=yes
+ '[' '!' yes ']'
...
(省略)
...
+ '[' '!' yes ']'
+ exit 0
実行中(%build): /bin/sh -e /var/tmp/rpm-tmp.XOcnWu
+ umask 022
+ cd /home/bitwalk/rpmbuild/BUILD
+ font_files='andale32.exe arial32.exe arialb32.exe comic32.exe courie32.exe georgi32.exe impact32.exe times32.exe trebuc32.exe webdin32.exe verdan32.exe'
+ cd msttcorefonts
+ rm -rf cab-contents fonts
+ mkdir cab-contents
+ mkdir fonts
+ for i in '$font_files'
+ '[' -f downloads/andale32.exe ']'
+ cabextract --lowercase --directory=cab-contents downloads/andale32.exe
Extracting cabinet: downloads/andale32.exe
  extracting cab-contents/fontinst.inf
  extracting cab-contents/andale.inf
  extracting cab-contents/fontinst.exe
  extracting cab-contents/andalemo.ttf
  extracting cab-contents/advpack.dll
  extracting cab-contents/w95inf32.dll
  extracting cab-contents/w95inf16.dll

All done, no errors.
+ cp cab-contents/andalemo.ttf fonts
+ rm -f cab-contents/advpack.dll cab-contents/andale.inf cab-contents/andalemo.ttf cab-contents/fontinst.exe cab-contents/fontinst.inf cab-contents/w95inf16.dll cab-contents/w95inf32.dll
...
(省略)
...
+ cp cab-contents/tahoma.ttf fonts
+ cd fonts
+ /usr/bin/ttmkfdir
+ exit 0
実行中(%install): /bin/sh -e /var/tmp/rpm-tmp.4fPbUF
+ umask 022
+ cd /home/bitwalk/rpmbuild/BUILD
+ '[' /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64 '!=' / ']'
+ rm -rf /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
++ dirname /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
+ mkdir -p /home/bitwalk/rpmbuild/BUILDROOT
+ mkdir /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
+ '[' /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64 '!=' / ']'
+ rm -rf /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
+ cd msttcorefonts/fonts
+ mkdir -p /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64//usr/share/fonts/msttcorefonts
+ cp andalemo.ttf arial.ttf arialbd.ttf arialbi.ttf ariali.ttf ariblk.ttf comic.ttf comicbd.ttf cour.ttf courbd.ttf courbi.ttf couri.ttf georgia.ttf georgiab.ttf georgiai.ttf georgiaz.ttf impact.ttf tahoma.ttf times.ttf timesbd.ttf timesbi.ttf timesi.ttf trebuc.ttf trebucbd.ttf trebucbi.ttf trebucit.ttf verdana.ttf verdanab.ttf verdanai.ttf verdanaz.ttf webdings.ttf fonts.dir /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64//usr/share/fonts/msttcorefonts
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
ファイルの処理中: msttcorefonts-2.5-1.noarch
警告: ファイルが2回表記されています: /usr/share/fonts/msttcorefonts
Provides: font(:lang=aa) font(:lang=af) font(:lang=an) font(:lang=ar) font(:lang=av) font(:lang=ay) font(:lang=az-az) font(:lang=be) font(:lang=bg) font(:lang=bi) font(:lang=bin) font(:lang=br) font(:lang=bs) font(:lang=bua) font(:lang=ca) font(:lang=ce) font(:lang=ch) font(:lang=co) font(:lang=crh) font(:lang=cs) font(:lang=csb) font(:lang=cy) font(:lang=da) font(:lang=de) font(:lang=el) font(:lang=en) font(:lang=eo) font(:lang=es) font(:lang=et) font(:lang=eu) font(:lang=fi) font(:lang=fil) font(:lang=fj) font(:lang=fo) font(:lang=fr) font(:lang=fur) font(:lang=fy) font(:lang=gd) font(:lang=gl) font(:lang=gn) font(:lang=gv) font(:lang=he) font(:lang=ho) font(:lang=hr) font(:lang=hsb) font(:lang=ht) font(:lang=hu) font(:lang=ia) font(:lang=id) font(:lang=ie) font(:lang=ig) font(:lang=ik) font(:lang=io) font(:lang=is) font(:lang=it) font(:lang=jv) font(:lang=kaa) font(:lang=ki) font(:lang=kj) font(:lang=kk) font(:lang=kl) font(:lang=ku-tr) font(:lang=kum) font(:lang=kwm) font(:lang=ky) font(:lang=la) font(:lang=lb) font(:lang=lez) font(:lang=lg) font(:lang=li) font(:lang=lt) font(:lang=lv) font(:lang=mg) font(:lang=mh) font(:lang=mn-mn) font(:lang=ms) font(:lang=mt) font(:lang=na) font(:lang=nb) font(:lang=nds) font(:lang=ng) font(:lang=nl) font(:lang=nn) font(:lang=no) font(:lang=nr) font(:lang=nso) font(:lang=ny) font(:lang=oc) font(:lang=om) font(:lang=os) font(:lang=pap-an) font(:lang=pap-aw) font(:lang=pl) font(:lang=pt) font(:lang=rm) font(:lang=rn) font(:lang=ru) font(:lang=rw) font(:lang=sc) font(:lang=se) font(:lang=sel) font(:lang=sg) font(:lang=sk) font(:lang=sl) font(:lang=sma) font(:lang=smj) font(:lang=smn) font(:lang=sn) font(:lang=so) font(:lang=sq) font(:lang=sr) font(:lang=ss) font(:lang=st) font(:lang=su) font(:lang=sv) font(:lang=sw) font(:lang=tk) font(:lang=tl) font(:lang=tn) font(:lang=tr) font(:lang=ts) font(:lang=tt) font(:lang=tyv) font(:lang=uk) font(:lang=uz) font(:lang=vo) font(:lang=vot) font(:lang=wa) font(:lang=wen) font(:lang=wo) font(:lang=xh) font(:lang=yap) font(:lang=yi) font(:lang=za) font(:lang=zu) font(andalemono) font(arial) font(arialblack) font(comicsansms) font(couriernew) font(georgia) font(impact) font(tahoma) font(timesnewroman) font(trebuchetms) font(verdana) font(webdings) msttcorefonts = 2.5-1
Requires(interp): /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Requires(preun): /bin/sh
パッケージに含まれないファイルの検査中: /usr/lib/rpm/check-files /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
書き込み完了: /home/bitwalk/rpmbuild/SRPMS/msttcorefonts-2.5-1.src.rpm
書き込み完了: /home/bitwalk/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.8lANUn
+ umask 022
+ cd /home/bitwalk/rpmbuild/BUILD
+ '[' /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64 '!=' / ']'
+ rm -rf /home/bitwalk/rpmbuild/BUILDROOT/msttcorefonts-2.5-1.x86_64
+ exit 0
$ 

このパッケージは、必要なソース(フォント)全てを wget でダウンロードしてビルドします。ダウンロードに失敗する場合がありますので、その場合は繰り返しビルドし直してください。パッケージが無事ビルドできたら、ルート権限になり yum でインストールします(私の環境では既にインストールされてますので下記のようになります)。

$ su
パスワード:
# yum localinstall /home/bitwalk/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm
読み込んだプラグイン:langpacks
/home/bitwalk/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm を調べています: msttcorefonts-2.5-1.noarch
/home/bitwalk/rpmbuild/RPMS/noarch/msttcorefonts-2.5-1.noarch.rpm: インストールされたパッケージを更新しません。
何もしません
# 

ライセンス

Microsoft がインターネット上で公開していたこれらのフォントは、Microsoft End-User License Agreement ("EULA") によれば、Microsoft の許可なしに何か他のパッケージに加えて配布することはできないけれど、公開されているフォントをそのままの状態で再配布することは可能とのことです。また、使用用途を Windows に限定した記述はありません。そのため、SourceForge の上記プロジェクトサイトで、Microsoft が公開していたままをアップし、RPM パッケージを作成するときに wget でダウンロードしに行くというやり方を取っているわけです。

気になる点は、spec ファイルの %description に記載されている Microsoft のサイトがもはや存在しないことです。

%description
The TrueType core fonts for the web that was once available from
http://www.microsoft.com/typography/fontpack/. The src rpm is cleverly
constructed so that the actual fonts are downloaded from Sourceforge's site
at build time. Therefore this package technically does not 'redistribute'
the fonts, it just makes it easy to install them on a linux system.

その代わり、下記に Web 用のフォントパックの公開は中止した旨が掲示されています。

オリジナルのサイトが無くなっても、フォントパックが公開されていた時の配布条件に従って使用している限りは問題はないはずだと解釈して、ありがたく利用しています。

2014-05-02

誕生から50年を迎えたプログラム言語BASICの歴史、その精神とは - GIGAZINE

BASIC 言語が誕生して 50 年ということは、つい先日、自分が迎えた歳と同じということで、今更ながら妙な愛着を持ちます。BASIC 言語と言えば、いまどきの若い方は Visual Basic を思い浮かべるかもしれませんが、これは独自の発展をしているので、もはや昔の BASIC とは違った言語になってしまっています。

私が(自分のツールとして自由に使える環境で)はじめて使った BASIC は、SHARP MZ-80K2E 上で標準で利用できた SHARP BASIC でしたから、もうかなり昔のことです。BASIC 以前は、カシオ計算機から発売されていたプログラム関数電卓 FX-502P で 256 ステップに収まるよう工夫してプログラミングをしていましたので、いわゆるパソコン上の BASIC によって、プログラミングの世界は随分と広がりました。高校時代の懐かしい思い出です。

GOTO 文などで批判が多い BASIC 言語ですが、幸か不幸か、私の場合は他の言語に取り憑かれてしまったので、その後 BASIC を使って本格的にアプリケーションを作る機会は訪れませんでした。

今ではアプリケーション開発における BASIC 言語の重要性は、Microsoft Windows が普及する前に比べるとずっと低くなっていますが、上記の記事にあるとおり、BASIC を通じてケメニー教授とカーツ教授が実現したかった「誰にでもコンピューターが使える世の中」は、今まさに現実のものになったといえるでしょう。