erlang リスト, 文字列

この時の冒頭の話ですが、「編集画面モード」からも出来る気がしてきた。

 *数字*[タグ1][タグ2]タイトル

って書けば良いっぽい・・・でも数字はどうやって決めるのでしょう?(=w=
ま、1日1件だけにしておけって事で!

リスト

  • 個数が決まっていないものを入れる
  • []で囲む
1> MyClass = [{boys, 20}, {girls, 10}].
[{boys,20},{girls,10}]
  • 要素は何型でもOK
2> X = [1, 2, 3, apple, '@', {name, hiroyuki}].
[1,2,3,apple,'@',{name,hiroyuki}]
  • リストの先頭の事をヘッドと呼び、残りをテールと呼ぶ
  • "|"をヘッドとテールの区切りとして使う
3> [Head | Tail] = MyClass.
[{boys,20},{girls,10}]
4> Tail.
[{girls,10}]
    • 残り要素が1個でも、テールはリストとして取り出される
  • "|"を使えば、リストへの追加もOK
5> Y = [99, 99, 99, MyClass | X].
[99,99,99,
 [{boys,20},{girls,10}],
 1,2,3,apple,'@',
 {name,hiroyuki}]
    • "|"を使う時はテールをリストにする
      • テールがリスト出ない時は「不正な形式」と呼ばれる
6> [1, 2| 3].
[1,2|3]
7> [A | B] = [1, 2| 3].
[1,2|3]
8> B.
[2|3]
9> [C | D] = B.
[2|3]
10> D.
3
        • ライブラリ関数の大半は「不正な形式」を仮定していない
  • リストの連結も可
11> Z = Y ++ X.
[99,99,99,
 [{boys,20},{girls,10}],
 1,2,3,apple,'@',
 {name,hiroyuki},
 1,2,3,apple,'@',
 {name,hiroyuki}]
  • リストから取り除く
12> Z -- [apple, '@', '@'].
[99,99,99,
 [{boys,20},{girls,10}],
 1,2,3,
 {name,hiroyuki},
 1,2,3,apple,
 {name,hiroyuki}]
    • 最初にあるものだけ取り除かれる
      • 2個消したいモノは2個書く
  • ここまでにも出てきていますが、取り出す場合は、タプルと同じような方法
13> [_, _, _, _, _, _, _, _, _, {_, Q}] = Y.
[99,99,99,
 [{boys,20},{girls,10}],
 1,2,3,apple,'@',
 {name,hiroyuki}]
14> Q.
hiroyuki

無名変数が多いと見難い>_<。

文字列

  • 厳密に言えばerlangにはない
    • 文字列は整数のリスト
  • ""で囲む
15> "Hello".
"Hello"
16> [97, 98, 99, 100, 10, 8].
"abcd\n\b"
17> [97, 98, 99, 100, 10, 7].
[97,98,99,100,10,7]
    • リストに含まれる値全ての整数がLatin-1(ISO-8859-1)の範囲で表示可能な文字である場合、リストを文字列として表示する
  • 文字と整数の対応を調べるのは"$"
18> $A.
65
19> [65 + 32].
"a"

何も考えずにwindowsで日本語を入れてみた。(番外編2)

番外編1

  • 全てを忘れたい
20> f().
ok
21> Z.
 * 1: variable 'Z' is unbound

人生で欲しいかも?

番外編2

1> "あ".
[130,160]
2> "あい".
[130,160,130,162]
3> "あい逃".
[130,160,130,162,147,166]
4> $"あい逃".


f()

aae
taetaetaetnaoetnaoi
rrrr
^G
Eshell V5.7.4  (abort with ^G)
1>

SJISのコードになるらしい
"$"をつけた後の無駄な改行や、f()や、変な文字列は、反応がなくなったので、適当に叩いた形跡です。

Erlang は文字列のエンコーディングについては、一切関知しません。そもそもErlang では文字列は整数のリストです。リストの中に好きなようにコードを並べてください、というスタンスのようです。
そのためソースファイルの文字コードSJISEUCUTF-8 等にしておけば、それらの文字コードで文字列リテラルを書くことができます。

http://ancient.s6.xrea.com/erlang/erlang.pdf

ま、勉強が進んだら調べよう。

erlang アトム, タプル

むむむ。。。編集機能を「その場編集モード」から「編集画面モード」に変えたのですが・・・カテゴリの入力の仕方と、1日に2件以上投稿する方法が分からないです。
最初は、何回も新規投稿しようとして、先程記述した記事の編集画面へと飛ばされて、ポカーンとしていました。
仕方ないので、諦めて「その場編集モード」からタイトルとカテゴリだけを入力して下書き保存をし、編集画面モードに入っています。
誰か助けてください(つдT)
で、では、気を取り直して!

アトム

  • 数値以外のさまざまな不変値を表す
  • 小文字で始まり、英数字、アンダースコア、アットマークと続く
  • 大文字や、英数字以外から始めたい場合は''を使う
1> true.
true
2> true_@.
true_@
3> +.
 * 1: syntax error before: '.'
3> '+'.
'+'
4> 'Sunday'.
'Sunday'

C言語とかで、最初に書く#defineみたいなものですね。

#define INVALID -1
#define FALSE 0
#define TRUE 1
#define SUNDAY 0

つまり、前回書いた↓はアトムと整数のパターン照合をしていたのです。

2> x = 1.
 ** exception error: no match of right hand side value 1

エラーになるわけです。
# 一瞬、「0って偽だったっけ?」と考え込んでしまったのは秘密です。

タプル

  • 項目を1つにまとめる時に使う
5> {2, 3, 4}.
{2,3,4}
  • タプルを表現するアトムを最初の要素に入れる事が多い
6> P = {point, 2, 3}.
{point,2,3}
1> Name = {name, hiroyuki}.
{name,hiroyuki}
2> Height = {height, 173}.
{height,173}
3> Person = {person, Name, Height}.
{person,{name,hiroyuki},{height,173}}
取り出す
4> {person, {name, N}, {height, H}} = Person.
{person,{name,hiroyuki},{height,173}}
5> H.
173
6> {_, {_, _}, {_, X}} = Person.
{person,{name,hiroyuki},{height,173}}
7> X.
173
  • 取り出したい位置に未束縛変数を置いたパターンを記述する
  • "_"は無名変数と呼ばれる
    • 1つのパターンの中で何度も使う場合でも、同じ値に束縛されない
      • つまり、興味がない変数の代わりとして使う

正直めんどくさい。

突然domUに繋がらなくなる

以前、Xenを使っていた時に、突然dom0からdomUに繋がらなくてハマったというお話。

症状

  • dom0からdomUに以下が出来ない
    • pingが飛ばない
    • sshでログイン出来ない
  • dom0を再起動すると繋がる
  • とあるdomUだけではなく、全domUに繋がらない

原因

  • dom0のiptablesを変更していた
    • domUNICはvirbr0を使用していたため、影響が出たと思われる
virbr0って?
  • libvirtd提供のブリッジ
    • 内部にDHCP, DNSサーバーを持っている
    • dom0の設定(/etc/hosts, iptables等)を見て、よしなに計らってくれる
    • domUから外へのアクセスはIPマスカレードを使っている

対処

libvirtdを再起動する。

/etc/init.d/libvirtd restart

原因から上記症状時の補足

上記の際、確認はしていないが、おそらく以下の事が言える。

  • GUIコンソールから見れば、画面は出る
  • xm consoleは繋がる

オマケ:virbr0を使っていない時

オフにしちゃいましょう

virsh net-autostart default --disable
virsh net-destroy default

オンにしたい時は

virsh net-start default
virsh net-autostart default

defaultのところは、ネットワーク名なので、各自異なると思います。

erlang インストール 〜 代入

普段は関数型言語から程遠い僕が、使った事もないerlangを今更勉強してみる企画。そしてその記録がココ。
1日坊主に終わらなかったら奇跡。
更新のペースが速くなる事はないと思います。
あと、Erlangと打つのが面倒なので、erlangと記述するのにはご容赦を。

なぜerlang?

  • 並列処理が得意なんだって!
  • これからはマルチスレッドが来るから関数型言語なんだって!
  • プログラマなら複数の言語が出来ないとダメなんだって!
  • 会社で使ってる言語だと自宅でやる気力が起きないよ!
  • 上司の机にerlangの本があるよ!

明確にこれが使いたいという理由があったわけではないです。
別に新しい言語というわけでもないですし。
でもまぁ、入門してみましょう。

erlangの特徴

http://ja.wikipedia.org/wiki/Erlang

プロセスの部分は調べないといけませんね。
でも、基本を抑えてから徐々に行く。
今更焦っても仕方ない。
ここで、大事なのは「並列処理が得意」と「単一代入」かな?

インストール

公式サイトのDownloadsから「Windows binary」の最新版を落とす。
あとは実行して、環境変数Erlangのbinフォルダへのpathを通して、コマンドプロンプトからお決まりをしてみる。

>erl
Eshell V5.7.4  (abort with ^G)
1> io:fwrite("Hello World\n").
Hello World
ok
  • erlはrubyirbみたいなもの
    • ちょっとしたものを試す時に便利
  • リセットをする時はCTRL+G

特徴的に感じたところ

erlに入力してみた。

1> 111111111111111 * 2222222222222 * 3333333333333333.
823045267489628724279835391037119341563786
2> x = 1.
 ** exception error: no match of right hand side value 1
3> X = 2.
2
4> X = 3.
 ** exception error: no match of right hand side value 3
5> X = X + 1.
 ** exception error: no match of right hand side value 3
6> 6/2.
3.0
  • 文の終わりはピリオド
  • 整数演算は多倍長整数
    • 整数演算では誤差がない
  • 変数は大文字
  • 変数へは単一代入
    • 二度代入するとエラー
      • 上記5番目は X1 = X + 1というように使った事のない変数に入れていく
  • 変数に代入する事を束縛するという
    • 代入済みの変数を束縛済み変数(bound variable)と呼ぶ
  • "="はパターン照合処理を意味する
    • 右辺を評価して、結果を左辺とパターン照合する
    • 数学の"="に近いかも
  • "/"は常に浮動少数を返す


と、今日はここまで。
早く並列処理まで行きたいな〜。。。
でも、基本からやらないと。