配列定義
# 同時に初期値を与える
val arr = Array( 1, 2, 3 )
( val arr = Array.apply( 1, 2, 3 ) と同義 )
# 初期化だけで後で値を与える
val arr = new Array[ Int ](3)
arr(0) = 1
arr(1) = 2
arr(2) = 3
( arr(0) = 1 は、arr.update( 0, 1 )と同義)
# var で変数だけ定義
var arr: Array[ Int ] = null
arr = new Array(10)
配列の要素を処理
array.foreach( v => 関数本体 )
array.foreach( ( v: 型 ) => 関数本体 )
# 部分適用された関数(partially applied function)
array.foreach( 式 )
for( v <- array ) 式
List定義
Arrayはミュータブルなので、可能な場合はListを使う方がベター
#Listの連結
List( 1, 2 ) ::: List( 3, 4 )
# List の先頭に追加
1 :: List( 2, 3 )
# 末尾に追加
List ( 1, 2 ) :+ 3
# 空のList Nil
1:: 2 :: 3 :: Nil
res0: List[Int] = List( 1, 2, 3)
注意:
先頭に追加はO(1)だが、末尾追加はO(n)なので、基本的には先頭追加を考える。
先頭追加で最後にreverse することで代用できる場合はそうする。
for式
for( i <- 0 to 2 ) 式
( 0 to 2 は、0.to( 2 ) と同義 scala.collection.immutable.Range.Inclusive = Range(0, 1, 2))
(まだ途中)
Jul 3, 2013
Scala メモ
Posted by
calmoka
at
10:33 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Jan 22, 2013
Mac OSX: コマンドで less を css に変換する
npm で、less をインストールし、lessc コマンドを使って、less を css に変換します。
(node.js と npm がインストールされている前提とします。)
(node.js は、ports、brew、公式サイトで配布されているインストーラーのいずれかを使ってインストールします。)
参考サイト
http://lesscss.org/
(node.js と npm がインストールされている前提とします。)
(node.js は、ports、brew、公式サイトで配布されているインストーラーのいずれかを使ってインストールします。)
$ node -v v0.8.17 $ npm -v 1.2.0 $ sudo npm install -g less (私は、グローバルにインストールしています。) $ which lessc /usr/local/bin/lessc $ lessc -v lessc 1.3.3 (LESS Compiler) [JavaScript] $ lessc -x main.less main.min.css (オプションの詳細は、less -h を参照)
参考サイト
http://lesscss.org/
Posted by
calmoka
at
9:24 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Nov 16, 2011
CentOS に 最新版の munin をインストール
epel の リポジトリがない場合は追加
epel の enabled を 0 にする。(お好みで)
dag の リポジトリがない場合は追加
yum でインストール
参考サイト
http://munin-monitoring.org/wiki/LinuxInstallation
rpm --import http://download.fedora.redhat.com/pub/epel/RPM-GPG-KEY-EPEL rpm -ivh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm※ 上記は64bitマシン
epel の enabled を 0 にする。(お好みで)
# vi /etc/yum.repo.d/epel.repo [epel] name=Extra Packages for Enterprise Linux 5 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch failovermethod=priority enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
dag の リポジトリがない場合は追加
# vi /etc/yum.repo.d/dag.repo [dag] name=Dag RPM Repository for Red Hat Enterprise Linux baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag gpgcheck=1 gpgkey=http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt enabled=0
yum でインストール
yum --enablerepo=dag --enablerepo=epel install munin munin-node※ munin, munin-node はそれぞれ必要に応じて
参考サイト
http://munin-monitoring.org/wiki/LinuxInstallation
Posted by
calmoka
at
10:55 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
centos,
monitor,
munin,
yum
Nov 15, 2011
Exim で SMTP ゲートウェイ の設定
/etc/exism/exim.conf の ROUTERS セクションの一番初めに以下の要領で記述します。
これ、ROUTERS セクションの一番最後に追記して、全然設定が反映されず、数時間ハマってしまいました。。
参考サイト
http://www.hserus.net/wiki/index.php/Exim
send_to_gateway: driver = manualroute domains = !+local_domains transport = remote_smtp route_list = * ispgw.smtp.host
これ、ROUTERS セクションの一番最後に追記して、全然設定が反映されず、数時間ハマってしまいました。。
参考サイト
http://www.hserus.net/wiki/index.php/Exim
Posted by
calmoka
at
11:34 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
centos,
exim
Nov 1, 2011
javascript プロパティ値の存在チェック
単純に、プロパティが存在しているかチェック
プロパティ継承を辿らず、自身のプロパティとして存在してるかチェック
'key' in obj
プロパティ継承を辿らず、自身のプロパティとして存在してるかチェック
obj.hasOwnProperty('key');
Posted by
calmoka
at
4:21 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
javascript
javascript ~~ 演算
n = ~~(n / 13);
13 で割って少数になった計算結果を整数に変換
Posted by
calmoka
at
3:18 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
javascript
Aug 31, 2011
vim で Java の setter / getter を自動で作成する
キーマッピングで以下の設定を .vimrc に追加します。
そして、Java のソースを例えば、以下のように書いたとすると、
クラス変数の private の最初のp のところで、マッピングしたキーを入力します。
(上の例だと Kk)
しかし、この一連のマッピング、、見事です。。
※ 参考サイトのものを自分の環境に合わせて若干変えています。
参考サイト
http://vim.wikia.com/wiki/Generate_Java_setters_and_getters_automatically
map Kk mawv/ <CR>"ty/ <CR>wve"ny/getters<CR>$a<CR><CR><Esc>xxa<Tab>public <Esc>"tpa<Esc>"npbiget<Esc>l~hea ()<CR>{<CR><Tab>return <Esc>"npa;<CR>}<Esc>=<CR><Esc>/setters<CR>$a<CR><CR><Esc>xxa<Tab>public void <Esc>"npbiset<Esc>l~hea (<Esc>"tpa<Esc>"npa)<CR>{<CR><Tab>this.<Esc>"npa = <Esc>"npa;<CR>}<Esc>=<CR>`ak
そして、Java のソースを例えば、以下のように書いたとすると、
クラス変数の private の最初のp のところで、マッピングしたキーを入力します。
(上の例だと Kk)
private int id; private String text = "initial value"; ^(ここで Kk を入力すると、// getters, //setters の下に追加されます。) // getters // setters↓
private int id;
private String text = "initial value";
// getters
public String getText ()
{
return text;
}
// setters
public void setText (String text)
{
this.text = text;
}
しかし、この一連のマッピング、、見事です。。
※ 参考サイトのものを自分の環境に合わせて若干変えています。
参考サイト
http://vim.wikia.com/wiki/Generate_Java_setters_and_getters_automatically
Posted by
calmoka
at
10:50 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
java,
vim
Aug 25, 2011
build.xml に tomcat ant タスクの登録
tomcat manager を使用するので、tomcat6-admin-webapps をインストールします。。
reload タスクなどは、manager の URL に REST でコマンドを送って実行します。
tomcat-users.xml を編集して、admin role の userを設定
${catalina.home}/bin にある、catalina-tasks.xml を import してタスクを登録
${catalina.home}/bin/catalina-tasks.xml の中にある classpath の設定通りに jar ファイルがない場合は、
該当のファイルをclasspath に登録します。
私の場合は、シンボリックリンクを張りました。
参考サイト
http://www.neutralworks.com/blog/osx/mecurial-on-mac.html
reload タスクなどは、manager の URL に REST でコマンドを送って実行します。
yum --enablerepo=jpackage-generic install tomcat6-admin-webapps
tomcat-users.xml を編集して、admin role の userを設定
vi /etc/tomcat6/tomcat-users.xml
# 任意のユーザーを追加
<user name="USERNAME" password="PASSWORD" roles="admin" />
${catalina.home}/bin にある、catalina-tasks.xml を import してタスクを登録
<project>
...
<property name="catalina.home" value="/usr/share/tomcat6" />
<import file="${catalina.home}/bin/catalina-tasks.xml"/>
<!-- Reload tomcat -->
<target name="reload">
<reload url="http://localhost:8080/manager"
username="USERNAME"
password="PASSWORD"
path="/CONTEXT" />
</target>
...
${catalina.home}/bin/catalina-tasks.xml の中にある classpath の設定通りに jar ファイルがない場合は、
該当のファイルをclasspath に登録します。
私の場合は、シンボリックリンクを張りました。
cd /usr/share/java
sudo ln -s tomcat6-servlet-2.5-api-6.0.18.jar servlet-api.jar
sudo ln -s tomcat6-jsp-2.1-api-6.0.18.jar jsp-api.jar
sudo ln -s tomcat6-el-1.0-api-6.0.18.jar el-api.jar
参考サイト
http://www.neutralworks.com/blog/osx/mecurial-on-mac.html
Posted by
calmoka
at
10:23 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
ant,
tomcat
Aug 19, 2011
Ant の native2ascii で「Couldn't load Kaffe's Native2Ascii class」
Ant のバージョンを上げると、解決するかもです。
以下のバージョンを、
jpackageリポジトリの最新版、
にアップデートすることで解決しました。
参考サイト
http://osdir.com/ml/java.ejbca.devel/2007-02/msg00007.html
以下のバージョンを、
ant-1.6.5
ant-nodeps-1.6.5
jpackageリポジトリの最新版、
ant-1.7.1
ant-nodeps-1.7.1
にアップデートすることで解決しました。
参考サイト
http://osdir.com/ml/java.ejbca.devel/2007-02/msg00007.html
Posted by
calmoka
at
2:14 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
ant,
centos
Aug 18, 2011
VMware Fusion3: 共有 の設定で「 実行時フォルダの共有ステータスを更新できません:不明なエラー」が出る場合
gcc をインストールした後に、vmware-tools をインストール(再インストール)する。
参考サイトは、openSUSE の記述だけど、同じ方法で解決した。
参考サイト
http://www.vmware.com/jp/support/support-resources/pubs/view_pubs/releasenotes_fusion_312.html#gosissues
参考サイトは、openSUSE の記述だけど、同じ方法で解決した。
参考サイト
http://www.vmware.com/jp/support/support-resources/pubs/view_pubs/releasenotes_fusion_312.html#gosissues
Posted by
calmoka
at
5:10 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
vmware fusion3
CentOS 5.5 に、mercurial のインストール
rpmforge のリポジトリにあるのをインストール。
rpmforge のインストールはこちら
参考サイト
http://d.hatena.ne.jp/red_snow/20100428/1272423744
rpmforge のインストールはこちら
yum --enablerepo=rpmforge install mercurial
参考サイト
http://d.hatena.ne.jp/red_snow/20100428/1272423744
Posted by
calmoka
at
12:55 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
centos,
mercurial
OSX に、Mercurial のリポジトリを構築
macports を使って、mercurial をインストール
リポジトリの作成
※ パーミッション等、Apacheのユーザが書き込めるようにしておく
hgrc の設置
hgweb.config の設置
hgweb.cgi の設置
Apacheの設定
参考サイト
http://www.neutralworks.com/blog/osx/mecurial-on-mac.html
http://blog.bluegold.me/2010/02/setup-mercurial-hgwebdir-fcgi-on-nginx/
http://d.hatena.ne.jp/eldesh/20110125/1295938971
http://www.proton.jp/main/programming/mercurial.html
sudo port install mercurial
リポジトリの作成
※ パーミッション等、Apacheのユーザが書き込めるようにしておく
mkdir -p /path/to/hg/repo
cd /path/to/hg/repo
hg init someproject
hgrc の設置
vi /path/to/hg/repo/someproject/.hg/hgrc
# こんな感じ
[web]
contact = me@me.com
description = Some Project
allow_push = *
allow_archive = zip
push_ssl = true
# 詳しくは
man hgrc
hgweb.config の設置
vi /path/to/hg/hgweb.config
# こんな感じ
[paths]
/ = /path/to/hg/repo/*
hgweb.cgi の設置
cp /opt/local/share/mercurial/hgweb.cgi /path/to/hg/
vi /path/to/hg/hgweb.cgi
# 設定ファイルのパスを修正
config = "/path/to/hg/hgweb.config"
# 文字化けする場合は以下を追加
import os
os.environ["HGENCODING"] = "UTF-8"
# 以下必要に応じて書き換え
import sys; sys.path.insert(0, "/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages")
Apacheの設定
sudo vi /etc/apache2/other/hg.config
# こんな感じ
Alias /hg /path/to/hg
<Directory "/path/to/hg">
Options ExecCGI FollowSymLinks
DirectoryIndex hgweb.cgi
AddHandler cgi-script .cgi
AuthType Basic
AuthName "Repository"
AuthUserFile /private/etc/apache2/.htpasswd
AuthGroupFile /dev/null
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx/24
Require valid-user
</Directory>
# Apache再起動
sudo /usr/sbin/apachectl restart
参考サイト
http://www.neutralworks.com/blog/osx/mecurial-on-mac.html
http://blog.bluegold.me/2010/02/setup-mercurial-hgwebdir-fcgi-on-nginx/
http://d.hatena.ne.jp/eldesh/20110125/1295938971
http://www.proton.jp/main/programming/mercurial.html
Posted by
calmoka
at
12:04 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
mac,
mercurial,
osx
Aug 13, 2011
centos 5.5 に、Apache + Tomcat6 な環境を作る
httpd のインストール
Tomcat のインストール
※ Jpackage のリポジトリを追加しておく。
※ webapps は必要に応じて。
ここで、以下のようなエラーが出る場合がある。
その場合は、jpackage-utils 5.0 を手動でインストールする。
参考サイト
http://wiki.hillockhosting.com/yum/usrbinrebuild-security-providers-is-needed/
sudo yum install httpd
Tomcat のインストール
※ Jpackage のリポジトリを追加しておく。
※ webapps は必要に応じて。
sudo yum --enablerepo=jpackage-generic install tomcat6 tomcat6-webapps
ここで、以下のようなエラーが出る場合がある。
Missing Dependency: /usr/bin/rebuild-security-providers is needed
その場合は、jpackage-utils 5.0 を手動でインストールする。
sudo rpm -Uvh http://plone.lucidsolutions.co.nz/linux/centos/images/jpackage-utils-compat-el5-0.0.1-1.noarch.rpm
参考サイト
http://wiki.hillockhosting.com/yum/usrbinrebuild-security-providers-is-needed/
Posted by
calmoka
at
12:19 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
centos,
java,
tomcat
yum Jpackage リポジトリの追加
su - rpm --import http://www.jpackage.org/jpackage.asc wget http://www.jpackage.org/jpackage50.repo -O /etc/yum.repos.d/jpackage.repo perl -p -i.old -e 's/enabled=1/enabled=0/' /etc/yum.repos.d/jpackage.repo # 問題なければ rm /etc/yum.repos.d/jpackage.repo.old
参考サイト
http://www.jpackage.org/
Posted by
calmoka
at
12:11 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
centos,
java,
yum
Jun 14, 2011
VMware fusion 3 の DHCP で、仮想マシンのIPアドレスを固定にする
/Library/Application Support/VMware Fusion/vmnet8/dhcpd.conf を編集してIPの設定を追加する。
その後、VMWare Fusion を終了し、dhcpd などのプロセスを再起動する。
参考サイト
http://www.linuxunbound.com/2010/04/static-ips-from-dhcpd-in-vmware-fusion/
$ sudo vi /Library/Application Support/VMware Fusion/vmnet8/dhcpd.conf
host dev1 {
hardware ethernet 00:**:**:**:**:**;
fixed-address 192.168.***.***;
}
その後、VMWare Fusion を終了し、dhcpd などのプロセスを再起動する。
$ cd /Library/Application Support/VMware Fusion/ $ sudo ./boot.sh --restart
参考サイト
http://www.linuxunbound.com/2010/04/static-ips-from-dhcpd-in-vmware-fusion/
Posted by
calmoka
at
11:13 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
vmware fusion3
Apr 7, 2011
Windows7 のタスクをコマンドで強制終了
1. PIDを確認する > tasklist 2. 強制終了 > taskkill /F /PID pid
Posted by
calmoka
at
11:30 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
windows
Apr 6, 2011
vim 現在行以降の置換
範囲指定の最初を空欄、最後を「$」に指定すると、現在行からファイルの最後までが検索対象になる。
:,$s/{検索文字列}/{置換文字列}/
Posted by
calmoka
at
2:22 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
vim
Mar 2, 2011
自宅のMac から、会社のWindows を経由して、IP制限のかかった環境へSSH
会社のPCから、自宅の環境へVPNで接続し、会社のPCに立てた HTTP Proxyを介して、
IP制限された接続環境へ、http, https, ssh するようにしてみました。
VPN 接続
まず、自宅に、Linux でVPNサーバを立ち上げます。
PPTP接続の環境は簡単に構築できます。
「 CentOS pptpd 」などで検索すると色々出てきます。
私の自宅の環境は、だいぶ前に作って、詳細を掘り起こすのが、、、割愛します。
HTTP Proxy の設定
会社のPCに、Free Proxy などを使って、HttpProxy を立ち上げます。
プロキシ構成ファイルの作成
http, https のアクセスは、制限のあるサーバだけをプロキシ経由にします。
そのため、例えば Mac の場合だと、以下にプロキシ構成ファイルを設定します。
システム環境設定 -> ネットワーク -> 詳細 -> プロキシ -> 自動プロキシ構成
プロキシ構成ファイル(.pac)の例
sshに、ProxyCommand の設定
まず、connect.c をインストールします。
~/.ssh/config の設定をします。
参考サイト
http://www.gcd.org/sengoku/docs/NikkeiLinux00-12/config.ja.html
http://dsas.blog.klab.org/archives/50765770.html
http://bent.latency.net/bent/darcs/goto-san-connect-1.85/src/connect.html
http://findproxyforurl.com/
IP制限された接続環境へ、http, https, ssh するようにしてみました。
VPN 接続
まず、自宅に、Linux でVPNサーバを立ち上げます。
PPTP接続の環境は簡単に構築できます。
「 CentOS pptpd 」などで検索すると色々出てきます。
私の自宅の環境は、だいぶ前に作って、詳細を掘り起こすのが、、、割愛します。
会社PC ---> 自宅VPNサーバ
HTTP Proxy の設定
会社のPCに、Free Proxy などを使って、HttpProxy を立ち上げます。
自宅Mac -- (VPN) --> 会社Win (Http Proxy) --> (http, https, ssh) --> 目的サーバ
プロキシ構成ファイルの作成
http, https のアクセスは、制限のあるサーバだけをプロキシ経由にします。
そのため、例えば Mac の場合だと、以下にプロキシ構成ファイルを設定します。
システム環境設定 -> ネットワーク -> 詳細 -> プロキシ -> 自動プロキシ構成
プロキシ構成ファイル(.pac)の例
function FindProxyForURL(url, host) {
var proxy = "PROXY mypc.at.office:8080";
if (isPlainHostName(host)
|| shExpMatch(host,"client.server")) {
return proxy;
}
return "DIRECT";
}
sshに、ProxyCommand の設定
まず、connect.c をインストールします。
curl http://www.meadowy.org/~gotoh/ssh/connect.c > connect.c gcc connect.c -o connect -lresolv
~/.ssh/config の設定をします。
Host *.client.server
ProxyCommand /path/to/connect -H mypc.at.office:8080 %h %p
参考サイト
http://www.gcd.org/sengoku/docs/NikkeiLinux00-12/config.ja.html
http://dsas.blog.klab.org/archives/50765770.html
http://bent.latency.net/bent/darcs/goto-san-connect-1.85/src/connect.html
http://findproxyforurl.com/
Posted by
calmoka
at
10:24 AM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
mac
Feb 28, 2011
yaws 1.8.9 インストール
環境:
CentOS 5.5 i386 on VMware Fusion3
Erlang R14B01
pam-devel が必要なので、事前にインストール。
CentOS 5.5 i386 on VMware Fusion3
Erlang R14B01
pam-devel が必要なので、事前にインストール。
# yum install pam-devel # ./configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/etc # make && make install
Posted by
calmoka
at
5:15 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Feb 23, 2011
Erlang のお勉強 自分用メモ 随時更新
浮動小数点の演算
/ での除算結果は、割りきれても必ず浮動小数点に変換される。
初めから浮動小数点の演算をしてるのかな?
アトム
小文字から始まる式は、全てアトムになる。
無名変数
「_」 は、何度でも代入している、不要な値を切り捨てるために使う変数。
文字列は整数のリスト
f() 変数の束縛状態を全て解除
リスト内包表記
リスト L から、Xを取り出して、F(X)した結果のリストを作成する。
ガード
ガード列、G1;G2;G3...;Gn がtrueになるのは、ガード G1 ~ Gn の少なくともいずれか1つがtrueになる場合。
ガードは一覧のガード式を「,」で区切ったもの。
GuardExpr1, GuardExpr2, ..,GuardExprn がtrueになるのは、全てのガード式が true の場合。
and, andalso, or, orelse
and, or は全ての式を評価する。
andalso, orelse は評価がわかった時点で結果を出す。
ガードで使えるBIF 例
レコードの定義
key=hoge とすると、hogeが初期値になる。
case文 で filter を書くと
リストは必ずヘッドに追加する
その方が効率がいいらしい。
並び順は逆になるがその場合最後に、lists:reverse/1 を呼び出す。
List ++ [H] は悪らしい。
アキュムレータ
一時的に保存する領域を使って関数を作る。
[H || filter(H)] よりも空間効率がいいらしい。
整数のリストを偶数と奇数のリストに分けるサンプル。
例外、エラー
try catch のスタイル
エラーが起こることが多い場合は、try catch を使わずに戻り値で処理する。
関数内で throw(Why) する場合は、
また、_:_, _ で補足できるのは、throw だけ。
ビット構文: 24ビットカラーのパック、アンパック
アンダースコア変数
_ で始まる変数は、一度しか使われなくても警告が出ない。
そのため、「_」の代わりに切り捨てるデータに使うことが可能。
クラッシュダンプ
webtool で解析。
プロセス タイムアウト付きの受信
on_exitハンドラ
プロセスが終了するときになにか処理をしたい場合は、
on_exit(Pid, F) を使う。
プロセスの終了時の処理
気にしないパターン
関数を全てexportする
パスの追加
file_info のレコードファイル
分散ノードの起動
クライアントとサーバが1つのホストで別ノード
-sname でショートネームを利用する設定にしてerlを起動
-name -setcookie クッキーで同じクラスタに設定。
Erlangで使いポートを設定して起動
インターネット上の別ホストで分散させる場合に開けておくポート
4369 の TCP/UDP epmd(Erlang Port Mapper Daemon)が利用する。
別ホストでプロセスを起動
spawn に Node名をつけて起動するだけ。他の関数も同様に第一引数がNodeになる。
別ホストで関数を実行
rpcモジュールの関数群を利用。
フォーマットした文字列を取得
Dialyzer
PLTファイルを生成して、beamファイルかerlファイルを指定して解析する。
参考本
/ での除算結果は、割りきれても必ず浮動小数点に変換される。
初めから浮動小数点の演算をしてるのかな?
1> 4/2. 2.0 2> 4 div 2. 2
アトム
小文字から始まる式は、全てアトムになる。
1> hello. hello 2> Hello. * 1: variable 'Hello' is unbound 3> hello=hello. hello 4> Hello=hello. hello 5> Hello. hello
無名変数
「_」 は、何度でも代入している、不要な値を切り捨てるために使う変数。
1> Person={person,{name,calmoka},{age,36}}.
{person,{name,calmoka},{age,36}}
2> {_,{name,Name},_}=Person.
{person,{name,calmoka},{age,36}}
3> Name.
calmoka
文字列は整数のリスト
1> [99,97,116]. "cat" 2> [H|T]="cat". "cat" 3> H. 99 4> T. "at"
f() 変数の束縛状態を全て解除
1> X=123. 123 2> f(). ok 3> X=234. 234
リスト内包表記
リスト L から、Xを取り出して、F(X)した結果のリストを作成する。
[F(X) || X <- L]. 1> [X * 2 || X <- [1,2,3,4,5]]. [2,4,6,8,10]
ガード
ガード列、G1;G2;G3...;Gn がtrueになるのは、ガード G1 ~ Gn の少なくともいずれか1つがtrueになる場合。
ガードは一覧のガード式を「,」で区切ったもの。
GuardExpr1, GuardExpr2, ..,GuardExprn がtrueになるのは、全てのガード式が true の場合。
and, andalso, or, orelse
and, or は全ての式を評価する。
andalso, orelse は評価がわかった時点で結果を出す。
f(X) = when (X == 0) or (1/X > 2) ... g(X) = when (X == 0) orelse (1/X > 2) ...X = 0 の時、f(X) は一致しない。
ガードで使えるBIF 例
is_atom(X) is_binary(X) is_constant(X) is_float(X) is_function(X) is_function(X, N) // 引数N個 is_integer(X) is_list(X) is_number(X) is_pid(X) is_port(X) is_reference(X) is_tuple(X) is_record(X, Tag) is_record(X, Tag, N) // TagのレコードでNサイズ abs(X) element(N, X) // タプルXのN番目の要素 float(X) hd(X) // リストXのヘッド length(X) node() // 現在のノード node(X) // X(プロセス、リファレンス、ポート)が作られたノード round(X) // 整数に四捨五入 self() // 現在のプロセスのPID size(X) trunc(X) // Xを整数に切り捨てる tl(X) // リストXのテールhttp://erldocs.com/R14B01/erts/erlang.html?i=0&search=erlang#undefined
レコードの定義
key=hoge とすると、hogeが初期値になる。
-record(rec, { key1=default, key2, key3 }).
% レコード定義は .hrl ファイル内で。
1> rr("record.hrl").
rec
2> X = #rec{key2=key2}.
#rec{key1 = default,key2 = key2,key3 = undefined}
% rf() で、レコード定義をクリア、各変数はタプルになる。
3> rf(rec).
ok
4> X.
{rec,default,key2,undefined}
case文 で filter を書くと
filter(P, [H|T]) ->
case P(H) of
true -> [H|filter(P, T)];
false -> filter(P, T)
end;
filter(P, []) ->
[].
case Expression of
Pattern1 [When Guard1] -> Expr_seq1;
Pattern2 [When Guard2] -> Expr_seq2
end
% ついでにif文
if
Guard1 -> Expr_seq1;
Guard2 -> Expr_seq2;
true -> Expr_seq3
end
リストは必ずヘッドに追加する
その方が効率がいいらしい。
並び順は逆になるがその場合最後に、lists:reverse/1 を呼び出す。
List ++ [H] は悪らしい。
アキュムレータ
一時的に保存する領域を使って関数を作る。
[H || filter(H)] よりも空間効率がいいらしい。
整数のリストを偶数と奇数のリストに分けるサンプル。
odds_and_evens(L) ->
odds_and_evens(L, [], []).
odds_and_evens([H|T], Odds, Evens) ->
case (H rem 2) of
1 -> odds_and_evens(T, Odds, [H|Evens]);
0 -> odds_and_evens(T, [H|Odds], Evens)
end;
odds_and_evens([], Odds, Evens) ->
{lists:reverse(Odds), lists:reverse(Evens)}.
1> lib_misc:odds_and_evens([1,2,4,5,6,7,8,89,3]).
{[2,4,6,8],[1,5,7,89,3]}
例外、エラー
exit(Why) - プロセスを終了したい場合 throw(Why) - 呼び出し側が補足する可能性がある例外 erlang:error(Why) - クラッシュエラー 内部的に発生したエラーと同等
try catch のスタイル
エラーが起こることが多い場合は、try catch を使わずに戻り値で処理する。
case f(X) of
{ok, Val} -> ...;
{error, Why} -> ...
end,
関数内で throw(Why) する場合は、
try f(X) of
Val -> ...R
catch
throw:{ExceptionA, Reason} -> ...;
throw:{ExceptionB, Reason} -> ...;
_:_ -> ...;
exit:Ex -> ...;
error:Ex -> ...
end
通常は、exit は補足しないほうがイイ?また、_:_, _ で補足できるのは、throw だけ。
ビット構文: 24ビットカラーのパック、アンパック
1> R = 16#ff. 255 2> G = 16#66. 102 3> B = 16#00. 0 4> RGB = <<R:8, G:8, B:8>>. <<255,102,0>> 5> <<R1:8, G1:8, B1:8>> = RGB. <<255,102,0>> 6> R1. 255 7> G1. 102 8> B1. 0
アンダースコア変数
_ で始まる変数は、一度しか使われなくても警告が出ない。
そのため、「_」の代わりに切り捨てるデータに使うことが可能。
クラッシュダンプ
webtool で解析。
webtool:start().
プロセス タイムアウト付きの受信
receive
Pattern1 [when Guard1] ->
Expression1;
Pattern2 [when Guard2] ->
Expression2
...
after
Time ->
Expression
end.
on_exitハンドラ
プロセスが終了するときになにか処理をしたい場合は、
on_exit(Pid, F) を使う。
プロセスの終了時の処理
気にしないパターン
spawn(fun() -> ... end)自分も死ぬ
spawn_link(fun() -> ... end)死んだことを知りたい
process_flag(trap_exit, true),
spawn_link(fun() -> ... end)
loop() ->
receive
{'EXIT', Pid, Reason} -> ...
end
関数を全てexportする
-compile(export_all).
パスの追加
パスの先頭に追加 $ erl -pa Dir1 -pa Dir2 > code:add_patha(Dir) パスの末尾に追加 $ erl -pz Dir1 -pz Dir2 > code:add_pathz(Dir)
file_info のレコードファイル
-include_lib("kernel/include/file.hrl").
分散ノードの起動
クライアントとサーバが1つのホストで別ノード
-sname でショートネームを利用する設定にしてerlを起動
erl -sname node1 (node1@localhost)1> xxx:start(). ok (node1@localhost)2> rpc:call(node2@localhost, M, F, A).クライアントとサーバが別ホスト
-name -setcookie クッキーで同じクラスタに設定。
erl -name node1 -cookie somecookie (node1@host1)1> xxx:start(). ok (node1@host1)2> rpc:call(node2@host2.example.com, M, F, A).
Erlangで使いポートを設定して起動
elr -name ... -setcookie ... -kernel inet_dist_listen_min Min inet_dist_listen_max Max
インターネット上の別ホストで分散させる場合に開けておくポート
4369 の TCP/UDP epmd(Erlang Port Mapper Daemon)が利用する。
別ホストでプロセスを起動
spawn に Node名をつけて起動するだけ。他の関数も同様に第一引数がNodeになる。
spawn('somenode@somehost.example.com', Mod, Fun, Args).
別ホストで関数を実行
rpcモジュールの関数群を利用。
rpc:call(Node, Mod, Fun, Args). など
フォーマットした文字列を取得
Str = lists:flatten(io_lib:format("foo ~p ~p", [bar, hoge])).
Dialyzer
PLTファイルを生成して、beamファイルかerlファイルを指定して解析する。
dialyzer --build_plt --apps erts kernel stdlib crypto compiler hipe dialyzer -Wunmatched_returns -Werror_handling -Wrace_conditions ... -c hoge.erl
参考本
Posted by
calmoka
at
3:21 PM
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
0
comments
Labels:
erlang