プログラミング言語 PG0.5
ライブラリ リファレンス
--
■はじめに
PG0はプログラミング学習を目的としたプログラミング言語です。
PG0.5はPG0を拡張したプログラミング言語です。
以下のライブラリのリファレンスになります。
・画面描画API (screen.pg0)
・数値処理API (math.pg0)
・文字列API (string.pg0)
・入出力API (io.pg0)
・通信API (net.pg0)
■制限事項
本ライブラリには以下の制限があります。
・動作環境はPG0(Web版)およびPG0(Windows版)です。
・デバイスやWebブラウザによって動作速度、描画速度が異なる場合があります。
・サウンド再生についてはiOSではセキュリティ制限のため機能しない場合があります。
・各APIの仕様は今後変更される可能性があります。
■画面描画API (screen.pg0)
以下のインポート文により利用することができます。
#import("lib/screen.pg0")
startScreen(width, height, option)
[説明]
スクリーンを開始します。
Webブラウザ上に指定したサイズのスクリーンを表示します。
[引数]
width - 画面の幅(数値)
height - 画面の高さ(数値)
option - オプションを連想配列で指定します。
{"color": 16進数のカラーコード(文字列), "fit": 画面サイズに合わせるかのフラグ(数値)}
[戻り値]
0
sleep(time)
[説明]
一定時間処理を停止します。
[引数]
time - 停止する時間をミリ秒を数値で指定します。
[戻り値]
0
time()
[説明]
現在時刻(UTC)を取得します。
[引数]
なし
[戻り値]
1970年1月1日 00:00:00からの経過ミリ秒を数値で返します。
timeString(time, format)
[説明]
時間を日時文字列にフォーマットします。
[引数]
time - 1970年1月1日 00:00:00からの経過ミリ秒を数値
format - 日時フォーマット。省略時はロケールに従った文字列にフォーマットされます。
YYYY - 年
MM or M - 月
DD or D - 日
hh or h - 時
mm or m - 分
ss or s - 秒
[戻り値]
日時文字列
startOffscreen()
[説明]
オフスクリーンを開始して、画面表示をオフスクリーンに描画します。
[引数]
なし
[戻り値]
0
endOffscreen()
[説明]
オフスクリーンを終了して、オフスクリーンの内容を画面に描画します。
[引数]
なし
[戻り値]
0
startMask(option)
[説明]
マスク描画モードを開始します。
マスク描画モード中は描画した領域のみが残り、それ以外の部分は透明になります。
[引数]
option - オプションを連想配列で指定します。
{"destination": マスクの場所(文字列)}
"out"を指定すると描画した領域が透明になります。
[戻り値]
0
endMask()
[説明]
マスク描画モードを終了します。
[引数]
なし
[戻り値]
0
clearRect(x, y, width, height)
[説明]
指定領域の描画を透明化します。
[引数]
x - 左上の水平座標(数値)
y - 左上の垂直座標(数値)
width - 幅(数値)
height - 高さ(数値)
[戻り値]
0
drawLine(x1, y1, x2, y2, option)
[説明]
直線を描画します。
[引数]
x1 - 開始の水平座標(数値)
y1 - 開始の垂直座標(数値)
x2 - 終了の水平座標(数値)
y2 - 終了の垂直座標(数値)
option - オプションを連想配列で指定します。
{"width": 線幅(数値), "color": 16進数のカラーコード(文字列)}
[戻り値]
0
drawRect(x, y, width, height, option)
[説明]
四角を描画します。
[引数]
x - 左上の水平座標(数値)
y - 左上の垂直座標(数値)
width - 幅(数値)
height - 高さ(数値)
option - オプションを連想配列で指定します。
{"width": 線幅(数値), "color": 16進数のカラーコード(文字列), "fill": 塗りつぶし(数値)}
塗りつぶしに1を設定すると指定された色で四角を塗りつぶします。
[戻り値]
0
drawCircle(x, y, radiusX, option)
[説明]
円を描画します。
[引数]
x - 円の中心の水平座標(数値)
y - 円の中心の垂直座標(数値)
radiusX - 水平方向の半径(数値)
option - オプションを連想配列で指定します。
{"width": 線幅(数値), "color": 16進数のカラーコード(文字列), "fill": 塗りつぶし(数値), "radius_y": 垂直方向の半径(数値), "rotation": 円の傾き(ラジアン), "start": 円が始まるX軸から時計回りの角度(ラジアン), "end": 円の終わるX軸から時計回りの角度(ラジアン), "close": 円弧の両端を繋ぐ(数値)}
塗りつぶしに1を設定すると指定された色で円を塗りつぶします。
radius_yを省略した場合はradiusXと同じ半径になります。
closeに1を設定すると円弧の両端を直線で繋ぎます。
[戻り値]
0
drawPolyline(coordinates, option)
[説明]
いくつかの座標で繋がった一連の直線を描画します。
[引数]
coordinates - 座標の配列
例) drawPolyline({{100, 100}, {200, 100}, {150, 50}}, {"close": 1}) // 三角形
option - オプションを連想配列で指定します。
{"width": 線幅(数値), "color": 16進数のカラーコード(文字列), "fill": 塗りつぶし(数値), "close": 1の場合は最後の線と最初の線を繋げる(数値)}
[戻り値]
0
drawFill(x, y, color)
[説明]
指定座標の色を指定の色で塗りつぶします。
隣接するピクセルを辿って指定の色で塗りつぶします。
[引数]
x - 塗りつぶしを開始する水平座標(数値)
y - 塗りつぶしを開始する垂直座標(数値)
color - 16進数のカラーコード(文字列)
[戻り値]
0
drawScroll(x, y)
[説明]
画面をスクロールします。
画面からはみ出た領域は逆側に表示されます。
[引数]
x - スクロールする水平の移動量(数値)
y - スクロールする垂直の移動量(数値)
[戻り値]
0
createImage(x, y, width, height, option)
[説明]
指定領域の画像を作成します。
戻り値を使ってdrawImage()で描画することができます。
[引数]
x - 左上の水平座標(数値)
y - 左上の垂直座標(数値)
width - 幅(数値)
height - 高さ(数値)
option - オプションを連想配列で指定します。
{"id": 既存のイメージID(数値)}
idを指定した場合は既存の画像を置き換えます。
[戻り値]
イメージID
drawImage(id, x, y, option)
[説明]
指定イメージIDの画像を描画します。
[引数]
id - イメージID
x - 左上の水平座標(数値)
y - 左上の垂直座標(数値)
option - オプションを連想配列で指定します。
{"width": 幅(数値), "height": 高さ(数値), "angle": 角度(ラジアン), "alpha": 透明度(数値)}
幅と高さの片方のみを指定した場合、もう片方は元の画像のサイズになります。
透明度は0.0~1.0の間で指定します。
[戻り値]
0
drawText(text, x, y, option)
[説明]
テキストを描画します。
[引数]
text - 描画するテキスト(文字列)
x - 開始の水平座標(数値)
y - 開始の垂直座標(数値)
option - オプションを連想配列で指定します。
{"width": 線幅(数値), "color": 16進数のカラーコード(文字列), "fill": 塗りつぶし(数値), "fontstyle": フォントスタイル(文字列), "fontsize": フォントサイズ(数値), "fontface": フォント(文字列)}
fillはデフォルトは1で、0を指定すると中抜き文字の描画になります。
フォントスタイルはnormal、bold、italic、obliqueのいずれかを指定します。
[戻り値]
0
measureText(text, option)
[説明]
テキストの描画サイズを取得します。
[引数]
text - テキスト(文字列)
option - オプションを連想配列で指定します。
{"fontstyle": フォントスタイル(文字列), "fontsize": フォントサイズ(数値), "fontface": フォント(文字列)}
フォントスタイルはnormal、bold、italic、obliqueのいずれかを指定します。
[戻り値]
描画サイズ
{"width": 幅, "height": 高さ}
rgbToPoint(x, y)
[説明]
指定座標の色を取得します。
[引数]
x - 水平座標(数値)
y - 垂直座標(数値)
[戻り値]
RGBの配列
{"r": 赤を示す255までの数値, "g": 緑を示す255までの数値, "b": 青を示す255までの数値}
rgbToHex(rgb)
[説明]
RGBの配列を16進数のカラーコードに変換します。
[引数]
rgb - RGBの配列
{"r": 赤を示す255までの数値, "g": 緑を示す255までの数値, "b": 青を示す255までの数値}
キーの大文字小文字は区別しません。
[戻り値]
16進数のカラーコード(文字列)
hexToRgb(hex)
[説明]
16進数のカラーコードをRGBの配列に変換します。
[引数]
hex - 16進数のカラーコード(文字列)
[戻り値]
RGBの配列
{"r": 赤を示す255までの数値, "g": 緑を示す255までの数値, "b": 青を示す255までの数値}
inTouch()
[説明]
タッチ位置を返します。
[引数]
なし
[戻り値]
タッチ状態
{"x": 水平座標, "y": 垂直座標, "touch": タッチ状態, "button": ボタン, "pos": {{水平座標, 垂直座標}, ...}}
タッチ状態が0の場合は現在はタッチされておらず、最終のタッチ座標になります。
buttonは0が左クリック、1が真ん中(ホイール)クリック、2が右クリックになります。
posはマルチタッチの座標が入ります。
inKey(key)
[説明]
キーボード入力を返します。
[引数]
key - 押されているか確認するキー文字列を指定します。
配列で指定した場合は配列内のすべてのキー文字列が押されているか確認します。
キー文字列はJavaScriptのKeyboardEvent.keyと同値になります。
[戻り値]
引数が指定されていない場合は、押されているキー文字列の配列を返します。
引数が文字列で指定されている場合は、キーが押されている場合は1を返し、押されていない場合は0を返します。
引数が配列で指定された場合はすべてのキーが押されている場合は1を返し、押されていないキーがある場合は0を返します。
playSound(note, start, end, volume = 1)
[説明]
指定された周波数を指定した時間再生します。
[引数]
note - 周波数(数値)
文字列を指定した場合は対応する周波数に変換されます。後ろに数字を入れるとオクターブになります。
'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'
オクターブを省略した場合は4になります。フラット(b)には対応していません。
例) playSound("C4", 0, 500)
start - 鳴り始めるまでの時間のミリ秒(数値)
end - startからの再生の長さのミリ秒(数値)
volume - ボリューム、省略時は1(数値)
[戻り値]
0
playMusic(notes, option)
[説明]
複数の周波数を連続で再生します。
[引数]
notes - noteの配列
{note, length, volume}
noteを文字列で指定した場合は対応する周波数に変換されます。後ろに数字を入れるとオクターブになります。
'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'
オクターブを省略した場合は4になります。フラット(b)には対応していません。
例) playMusic({{"C4", 500}, {"D4", 500}, {"E4", 500}})
volumeは省略可能です。
配列に以下のキーと値を設定すると特別な意味になります。
start: 開始位置、複数の音を同時に鳴らす場合には開始位置を0にして別の音を設定します。
例) playMusic({{"C4", 800}, {"start": 0}, {"E4", 800}, {"start": 0}, {"G4", 800}})
volume: これより後のボリューム
option - オプションを連想配列で指定します。
{"repeat": 繰り返しフラグ(数値)}
[戻り値]
0
bgm(notes, option)
[説明]
BGMを再生します。
再生中のBGMがあれば停止してから、指定したnotesを繰り返し再生します。
playSound()やplayMusic()で鳴らしている効果音は停止しません。
notesを省略した場合はBGMを停止します。
例) bgm({{"C4", 500}, {"E4", 500}, {"G4", 500}})
例) bgm() // BGMを停止
[引数]
notes - playMusic()と同じ形式のnoteの配列、省略可
option - オプションを連想配列で指定します。
{"repeat": 繰り返しフラグ(数値)}
省略時は1(繰り返す)。0を指定すると1回だけ再生します。
[戻り値]
0
stopSound()
[説明]
再生されているサウンドをすべて停止します。
bgm()で再生中のBGMも停止します。
[引数]
なし
[戻り値]
0
■数値処理API (math.pg0)
以下のインポート文により利用することができます。
#import("lib/math.pg0")
abs(num)
[説明]
絶対値を返します。
[引数]
num - 変換する数値
[戻り値]
絶対値
atan(num)
[説明]
アークタンジェントをラジアン単位で返します。
[引数]
num - 変換する数値
[戻り値]
引数のアークタンジェント
atan2(y, x)
[説明]
原点から点(x, y)への角度をラジアン単位で返します。
x軸の正方向からの角度で、-π~πの範囲になります。
例) atan2(1, 1) // 0.785... (45度)
[引数]
y - 垂直方向の値
x - 水平方向の値
[戻り値]
角度(ラジアン)
cos(num)
[説明]
コサインを返します。
[引数]
num - 数値
[戻り値]
引数のコサイン
exp(num)
[説明]
自然対数の底(e)のnum乗を返します。
[引数]
num - 数値
[戻り値]
自然対数の底(e)のnum乗
log(num)
[説明]
自然対数を返します。
[引数]
num - 数値
[戻り値]
自然対数
random(seed)
[説明]
乱数を返します。
seedを指定すると、そのシードから始まる再現可能な乱数列に切り替えて最初の値を返します。
以降のrandom()は同じ乱数列を続けます。
seedを一度も指定していない場合は毎回異なる乱数を返します。
[引数]
seed - 乱数のシード(数値または文字列)、省略可
[戻り値]
0以上1未満の乱数
sign(num)
[説明]
数値の符号が正か負かを表すフラグを返します。
[引数]
num - 数値
[戻り値]
1 - 正
-1 - 負
0 - ゼロ
sin(num)
[説明]
サインを返します。
[引数]
num - 数値
[戻り値]
引数のサイン
sqrt(num)
[説明]
平方根を返します。
[引数]
num - 数値
[戻り値]
平方根
tan(num)
[説明]
タンジェントを返します。
[引数]
num - 数値
[戻り値]
引数のタンジェント
pow(base, exponent)
[説明]
数値を累乗した値を返します。
[引数]
base - 底となる数値
exponent - 累乗する指数
[戻り値]
数値を累乗した値
max(a, b, ...)
[説明]
引数の中で最も大きい値を返します。
配列を渡した場合はその要素が比較の対象になります。
例) max(1, 5, 3) // 5
例) max({4, 2, 9}) // 9
[引数]
a, b, ... - 数値または数値の配列
[戻り値]
最大値
min(a, b, ...)
[説明]
引数の中で最も小さい値を返します。
配列を渡した場合はその要素が比較の対象になります。
[引数]
a, b, ... - 数値または数値の配列
[戻り値]
最小値
floor(num)
[説明]
数値以下で最大の整数を返します(切り捨て)。
例) floor(2.7) // 2
例) floor(-2.7) // -3
[引数]
num - 数値
[戻り値]
整数
ceil(num)
[説明]
数値以上で最小の整数を返します(切り上げ)。
例) ceil(2.1) // 3
例) ceil(-2.1) // -2
[引数]
num - 数値
[戻り値]
整数
round(num)
[説明]
数値を四捨五入した整数を返します。
例) round(2.5) // 3
例) round(-2.5) // -2
[引数]
num - 数値
[戻り値]
整数
hypot(x, y)
[説明]
2辺の長さから斜辺の長さ(x*x + y*y の平方根)を返します。
例) hypot(3, 4) // 5
[引数]
x - 数値
y - 数値
[戻り値]
斜辺の長さ
■文字列API (string.pg0)
以下のインポート文により利用することができます。
#import("lib/string.pg0")
trim(str)
[説明]
文字列の前後をトリミングする。
トリミング対象は空白(" ")、タブ("\t")、改行、全角空白などの空白文字(JavaScriptのtrimと同じ)となる。
[引数]
str - トリミングする文字列
[戻り値]
トリミングされた文字列
to_lower(str)
[説明]
英文字列を小文字に変換する。
[引数]
str - 小文字に変換する文字列
[戻り値]
小文字に変換された文字列
to_upper(str)
[説明]
英文字列を大文字に変換する。
[引数]
str - 大文字に変換する文字列
[戻り値]
大文字に変換された文字列
str_match(ptn, str)
[説明]
ワイルドカードを使って、文字列を比較する。
「*」で任意の複数文字列に一致し、「?」で任意の一文字に一致する。
大文字と小文字は区別しない。
[引数]
ptn - 比較元のパターン(こちらにワイルドカードを指定する)
str - 比較する文字列
[戻り値]
一致した場合は1を返し、一致しない場合は0を返す。
substring(str, begin, length = -1)
[説明]
文字列から部分文字列を抽出する。
[引数]
str - 抽出対象の文字列
begin - 開始インデックス
(負数は文字列の末尾からのインデックスとなる)
length - 抽出する長さ(負数は末尾までの長さとなる)
[戻り値]
抽出された部分文字列
in_string(str, search, from = 0)
[説明]
文字列内の指定文字列の位置を検索する。
[引数]
str - 検索対象の文字列
search - 検索する文字列
from - 検索を開始するインデックス(負数は0として扱う)
[戻り値]
見つかった文字列のインデックスを返す。
見つからない場合は -1 を返す。
split(str, separator)
[説明]
区切り文字列で文字列を分割する。
[引数]
str - 分割対象の文字列
separator - 区切り文字列(空文字列を指定すると1文字ずつに分割する)
[戻り値]
分割した文字列が入った配列
■入出力API (io.pg0)
以下のインポート文により利用することができます。
#import("lib/io.pg0")
println(line)
[説明]
標準出力に一行出力
[引数]
line - 出力文字列
[戻り値]
0
wait(ms)
[説明]
指定したミリ秒だけプログラムを待たせる
画面ライブラリは不要で、停止ボタンで中断できる
[引数]
ms - 待ち時間(ミリ秒)
[戻り値]
0
saveValue(key, value)
[説明]
値を保存します。
保存する値には数値、文字列、配列を指定します。
値はWebブラウザに保存されます。
スクリプトの保存場所を変更すると値は初期化されます。
・新規ファイル - 共通領域
・ローカルファイル - ローカルファイル名をキーとして保存
・オンラインファイル - オンラインのcidをキーとして保存
[引数]
key - キー
value - 保存する値
[戻り値]
0
loadValue(key)
[説明]
保存した値を読み出します。
[引数]
key - キー
[戻り値]
保存した値。保存されていない場合は0
removeValue(key)
[説明]
保存した値を削除します。
[引数]
key - キー
[戻り値]
0
get_clipboard()
[説明]
クリップボードのテキストを取得する。
[引数]
なし
[戻り値]
クリップボードのテキスト
set_clipboard(text)
[説明]
クリップボードにテキストを設定する。
[引数]
text - テキスト
[戻り値]
成功すると1、失敗すると0を返す。
■通信API (net.pg0)
以下のインポート文により利用することができます。
#import("lib/net.pg0")
同じプログラム(オンラインに保存した同じ cid のプログラム)を開いている人同士で、
値を送り合うことができます。オンライン対戦のゲームなどに使います。
・オンラインに保存したプログラムでだけ使えます(保存すると cid が付きます)。
・同じ cid のプログラム同士でだけつながります。別のプログラムとはつながりません。
・送った値はサーバーには保存されず、同じ部屋のほかの人に届くだけです。
・プログラムが終わる(停止ボタンを含む)と、部屋から出ます。
・送れる値の大きさと回数には上限があります(初期設定では1回16KBまで、1秒に60回まで)。
上限を超えた分は送られず、コンソールにお知らせが出ます。
例: 2人で座標を送り合う
#import("lib/net.pg0")
#import("lib/io.pg0")
me = netJoin()
if (me == 0) {
println("つながりませんでした")
exit
}
while (netCount() < 2) {
wait(100)
}
x = 100 * me
netSend({"x": x})
while (netAvailable() == 0) {
wait(100)
}
m = netReceive()
println(m["from"] + "番の人の x は " + m["data"]["x"])
netJoin(room, players)
[説明]
部屋に入る。部屋に入るか失敗するまで待つ(最大10秒)。
同じ cid・同じ部屋名の人とつながる。
部屋名を省略する(または "" にする)と、人数がそろっていない部屋に自動で入る。
自動の部屋は一度人数がそろうと、ほかの人は入らない。
部屋名を決めておくと、友だち同士で同じ部屋に入れる。
部屋がいっぱいのとき、netClose() で締め切られているときは入れない。
プログラムがオンラインに保存したものと同じでないと入れない(保存していない変更があれば保存してから、
新しい版が保存されていれば開き直してから実行する)。
すでに部屋に入っているときは、前の部屋から出てから入る。
Web 版では、スマホで別のアプリに切り替えるなどして接続が切れても、60 秒以内(サーバーの設定)に戻れば
その間に送られた値と一緒に同じ部屋に戻る(相手には伝わらない)。戻れなければ netId() が 0 になる。
[引数]
room - 部屋名(省略可、32文字まで)
players - 部屋の人数(省略時は2、2〜8)。部屋を最初に作った人の値が使われる。
[戻り値]
自分のプレイヤー番号(1, 2, ...)。入れなかったときは0。
番号は部屋に入った順に、空いているいちばん小さい番号になる。
入れなかったときは、理由がコンソールに表示される。
netLeave()
[説明]
部屋から出る。
[引数]
なし
[戻り値]
0
netClose()
[説明]
部屋を締め切り、ほかの人がこれ以上入れないようにする。
ゲームを始めるときに使うと、途中から人が入ってこない。
席が空いていても、あとで誰かが出て席が空いても、入れなくなる。
部屋にいる誰が呼んでもよく、元に戻すことはできない。
[引数]
なし
[戻り値]
締め切ったときは1、部屋に入っていないときは0。
例: 2〜4人で遊ぶゲームで、1番の人が2人以上そろったら始める
me = netJoin("", 4)
if (me == 1) {
while (netCount() < 2) {
wait(100)
}
netClose()
netSend("start")
}
netId()
[説明]
自分のプレイヤー番号を取得する。
[引数]
なし
[戻り値]
自分のプレイヤー番号。部屋に入っていないとき(通信が切れたときを含む)は0。
netRoom()
[説明]
入っている部屋の名前を取得する。
自動で入った部屋には "auto-" で始まる名前が付く。
[引数]
なし
[戻り値]
部屋の名前。部屋に入っていないときは ""。
netRooms()
[説明]
このプログラム(同じ cid)の部屋の一覧を取得する。部屋を選んで入るロビー画面に使う。
部屋に入っていなくても、入っていても呼べる。サーバーの答えが来るまで待つ。
一覧は作られた順(古い順)で、最大500部屋。誰もいなくなった部屋は消える。
呼ぶたびにサーバーに問い合わせるので、毎フレームではなく数秒おきに呼ぶ。
[引数]
なし
[戻り値]
部屋ごとに {"room": 部屋名, "count": 人数, "max": 定員, "closed": 締め切り(0/1)} を並べた配列。
部屋が1つもないときは {}。サーバーにつながらないときは0。
例: 空きのある部屋を選んで入る
rooms = netRooms()
if (isType(rooms) != 3) {
println("つながりませんでした")
exit
}
for (i = 0; i < length(rooms); i++) {
r = rooms[i]
if (r["count"] < r["max"] && !r["closed"]) {
me = netJoin(r["room"])
break
}
}
netCount()
[説明]
部屋にいる人数(自分を含む)を取得する。
[引数]
なし
[戻り値]
人数。部屋に入っていないとき(通信が切れたときを含む)は0。
netPlayers()
[説明]
部屋にいる人のプレイヤー番号を取得する。
[引数]
なし
[戻り値]
プレイヤー番号の配列(小さい順)。例: {1, 2}
netSend(value, to)
[説明]
値を送る。値には数値、文字列、配列を指定できる。
自分には届かない。
[引数]
value - 送る値
to - 送り先のプレイヤー番号(省略すると部屋のほかの全員)
[戻り値]
送ったときは1、部屋に入っていないなど送れなかったときは0。
netAvailable()
[説明]
受け取って、まだ netReceive() で取り出していない値の数を取得する。
[引数]
なし
[戻り値]
値の数(最大1000。超えると古いものから捨てられる)
netReceive()
[説明]
受け取った値をいちばん古いものから1つ取り出す。
[引数]
なし
[戻り値]
{"from": 送った人のプレイヤー番号, "data": 送られた値} の配列。
受け取った値がないときは0。
netLast(player)
[説明]
指定したプレイヤーから最後に受け取った値を取得する。
netReceive() で取り出したかどうかに関係なく、いちばん新しい値を返す。
毎回位置などを送り合うゲームでは、netReceive() を使わずにこれだけで相手の様子が分かる。
[引数]
player - プレイヤー番号
[戻り値]
最後に受け取った値。まだ受け取っていない、またはその人が部屋を出たときは0。
--
Copyright (C) 1996-2026 by Ohno Tomoaki. All rights reserved.
WEB SITE: https://nakka.com/
E-MAIL: [email protected]