switch文

R の switch 文です。 switch文というよりも関数というところでしょうか?

switch(statement, list)

 具体的に

switch(x, 11, 22, 33)

 値で、リストの要素を返す、それだけです。

値がリストの範囲外にあると NULL になります。

 

値は文字で指定することもできます。

switch("x", x=50, y=33, -1)

 この場合、50が返されます。

対応する値がない場合には、指定がないデフォルト値(?)になります。

(デフォルト値もなければ NULL です。)

switch("z", x=50, y=33, -1)

 この場合は -1 です。

 

Rのベクトル

R言語では「ベクトル」という値のセットを扱うことができます。

 

c() という関数でベクトルを作ることができます。

c(10, 20, 30, 40, 50)

 ベクトルは、そのまま変数に代入できます。

x <- c(6, 7, 8, 9, 10)

 ベクトルの要素にアクセスするには、C言語の配列と同じようにできます。

ただし、要素番号は1から始まります。

x[1] + x[2] + x[3]

 コロン(:)演算子を使ってベクトルを作ることもできます。 これは、指定の範囲の連続する数値になります。

x <- 1:10     # 要素は 1 2 3 4 5 6 7 8 9 10

y <- 5:13     # 要素は 5 6 7 8 9 10 11 12 13

z <- 3:-3     # 要素は 3 2 1 0 -1 -2 -3

 

 

 計算式でベクトルを使うこともできます。

x <- c(3, 5, 6, 9)

y <- c(7, 2, 1, 1)

x + y + 2

 ベクトルの長さは同じでなくても計算は可能です。 その場合、計算結果は最も長いベクトルの長さに合わせられます。 足りない要素の部分は、循環します(最初の要素に戻ります)。

x <- c(12, 15)

y <- c(8, 6, 4, 2)

x - y

 ただし、以下のように要素数が倍数でない場合には、警告が出るようです。

x <- c(1, 2, 3)

y <- c(4, 5, 6, 7)

x * y + 3

 ベクトルが計算式に使えることから、コロン(:)演算子も計算式に含めることができます。

3 * 1:7 - 1

 

Rの制御文

R言語の制御文

 

if文

if (x == 10) TRUE else FALSE

 Rのif文もC言語のものとよく似ています。 条件式の比較にはC言語でお馴染みの == != < > <= >= とか && || ! も揃っています。 また、elseの部分はあっても無くても良いようです。

 

文を1つにまとめるには、{ } で文を囲います。

if (x == 10) {

  a <- 5

  b <- 25

} else {

  a <- 3

  b <- 9

}

 

while文

C言語でもお馴染みの while ループです。

i <- 0

while (i < 10) {

  i <- i + 1

  print(i)

}

 これは1〜10までの数字を表示します。

 

ループを途中で止めるには break文を、ループをスキップするには next文(C言語の continue文に相当)を使います。

 

break文の例:

i <- 0

while (i < 10) {

  i <- i + 1

  if (i == 5)  break

  print(i)

}

 next文の例:

i <- 0

while(i < 10) {

  i <- i + 1

  if (i == 5)  next

  print(i)

}

 

R言語での四則演算とか

「R」という統計計算向けのプログラミング言語での基本的な四則演算。

 

四則演算

1 + 1

2 - 1

3 * 4

100 / 20

括弧

(100 + 20) * 40

コメント

1 + 2 + 3  # コメント

 print

print("Hello!")

変数

変数への代入は = ではなく <- です。

a <- 100

b <- 50

(a + b) * 4

 

ただの戯言

腕を伸ばして人差し指を立て、その指先を見つめる。 その後、指先から背景に視線の焦点を合わせる。 指先と背景の焦点は同時に合うことがないことに気づくであろう。

 

ん?

 

そういえば、量子力学では位置と速度は、同時に求められない、だったような? 位置を求めれば速度が求められなくなり、速度を求めれば位置が求められなくなる。

 

それだけ。 以上。

 

pythonインストールしてLinuxカーネルのドキュメントを読む

Linuxカーネル (linux-4.17.1.tar.xz) をダウンロードした。 最近のは、

 

$  make  htmldocs

 

と打ち込めばHTML形式のドキュメントを生成できるらしい。

 

しかし、その際、sphinx-buildというコマンドが必要なのだそうな。 これは、どうやら Python のパッケージ (PyPI) のやつらしい。 VineLinux(6.5)にもあるようだが、古いものだったので、Python2.7からインストールすることに。

 

Python公式 (https://www.python.org/)から、Python-2.7.15をダウンロードし、いつも通り(./configure; make; make install)ビルドするが、これだと pip っていうコマンドがインストールされなかったので、

./configure  --with-ensurepip=install

make

make install

 という手順で pip も入った。

 

そして、sphinxのインストール。

$  pip  install  -U  sphinx

 

chrootコマンドを使う

chrootコマンドは、指定のディレクトリを、ルートディレクトリ(/)に変更するというコマンドです。

 

そのディレクトリを起点 (/) にしてしまったわけですから、元の /bin のコマンド群や /usr/lib のライブラリにはアクセスできません。 「chroot後、シェルを起動してくれ」といっても、新しい仮想的な環境の中に /bin/sh が存在しなければシェルを起動できませんし、プログラムが必要とする実行時ライブラリも入っていなければ起動不可能です。

 

しかし、新しいシステム環境を一から構築し、インストール、実行する場合には便利な機能です。

 

chrootで、起点を変更したあと、何かできなければ意味がありません。 デフォルトではシェルが起動するようになっているようですが、任意のコマンド実行することもできます。 chroot コマンドの形式:

 

chroot  directory  [command  [args] ...]

 

なので、空のディレクトリを作っただけで chroot してもエラーになってしまいます。 また、そのコマンドが必要とする実行時ライブラリ(共有ライブラリ)もなければなりません。 しかし、メモリ効率は無視してでも、単に実行するだけなら、静的リンクでビルドすれば、共有ライブラリ不要で実行可能です。

 

プログラムを静的リンクでビルドするには、gcc コマンドに -static オプションを指定します。

 

gcc  -static  -o program  source.c

 

しかし、glibcの静的ライブラリがシステムにインストールされてないかもしれません(私の場合はそうでした)。 その場合はパッケージマネージャから、glibcライブラリのスタティック版をインストールする必要があります。 VineLinuxでは、以下のようにインストールできました。

 

$  sudo  apt-get  install  glibc-static

 

このようにビルドされたプログラムを適当なディレクトリに配置すれば、chrootで実行可能です。 あと、chrootはスーパーユーザ権限が必要です。

 

$  sudo  chroot  MyDir/  /program

 

これでプログラムは実行されるでしょう。

 

もし、これに物足りなさを感じたら、ファイルシステムのすべてのファイルをコピーするという荒技もあります!