2017年4月30日日曜日

[PocketMine] Pharファイルをwebで作る!解凍する!

こんにちは、haniokasaiです。
pharをいちいちdevtoolsで作ったり、展開したりするのが面倒な方に便利なツールを用意しました。
pmt.haniokasai.com

機能は4つ。

ZipからPharに変換

PharからZipに変換する

var_dump() ビュアー

PocketMineのCrash Dump解析

上2つは需要ありそうなので、使い方を解説したいと思います。

ZipからPharに変換

zipを選択して、検査が必要であればチェックを入れ、pharの作成を押すだけで完了できます。
devtoolsでやると、いちいちmakepluginでプラグイン名を入れる必要はありますが、pmtでやればそのような事は不要です。


PharからZipに変換する
    
ファイル選択ー>変換だけでおしまいです。解凍禁止コードを無視して開くこともできますが、(両親ではなく)良心に従って、適切に使ってください。


まとめ
近頃は、たいぶPMMP界が停滞しているように思えます。ですから、新しいデベロッパーが簡単にプラグインを作れるようになれば、界隈が活性化するのではと思います。
自分の記事を読んで、開発に関して知識を深められたらうれしいです。


2017年4月27日木曜日

phpのバイナリをramdiskとhdd上で動かして速度比較してみた

こんにちは、haniokasaiです。比較的精神が落ち着いています。
サーバーで、ramdisk使ってるのですがあまり速くない気がして、そもそもramdiskはファイル読み書き以外にも効果があるのか検証したいと思いました。

チェック環境
Core i7 3770s
ram 16GB(4.1 GB/s)
hdd 300gb(100MB/s)


ハッシュ値計算
まずは、ハッシュ値計算。明らかにcpuしか使わないとは思うのですが試してみました。

<?php
$time_start = microtime(true);
// ここに測定したいPHPの処理を記述
//http://qiita.com/ao_love/items/a2d8b8566d0426195002
$i=1;
while($i <= 10000){
echo hash(sha512, 'hoge hoge');
echo PHP_EOL;
$i++;
}
$time = microtime(true) - $time_start;
echo $time . " seconds\r\n";
?>

ramdisk
2.385381937027 seconds
2.3838350772858 seconds
2.381500005722 seconds
2.385363817215 seconds
2.3823990821838 seconds

hdd
2.386225938797 seconds
2.3824648857117 seconds
2.3904531002045 seconds
2.385146856308 seconds
2.3851881027222 seconds

変わらないですね()

変数に代入+擬似乱数速度

<?php
$time_start = microtime(true);
// ここに測定したいPHPの処理を記述
//http://qiita.com/ao_love/items/a2d8b8566d0426195002
$i=1;
while($i <= 100000){
$a[$i] = mt_rand();
echo $a[$i];
echo PHP_EOL;
$i++;
}
$time = microtime(true) - $time_start;
echo $time . " seconds\r\n";
?>
#test2.php
disk
2.1107099056244 seconds
2.1114587783813 seconds
2.1099500656128 seconds
2.1052420139313 seconds
2.085608959198 seconds

ramdisk
2.1087579727173 seconds
2.1096110343933 seconds
2.1064808368683 seconds
2.1081149578094 seconds
2.111673116684 seconds

やはり同じような値ですね。。。
(単位は秒)
##データはハードディスクにおいて
#bin:ramdisk phar:ramdisk 
0.19
0.19
0.171

#bin:disk phar:ramdisk 
0.184
0.211
0.228

#src:disk phar:disk
0.192
0.202
0.191

#bin:ram phar:disk
0.164
0.191
0.169

#ramdiskにファイルを置いて
#bin:ram phar:disk
0.193
0.197

#bin:ramdisk phar:ramdisk 
0.179
0.18
0.181
0.219

#bin:disk phar:disk
0.195
0.183
0.213
0.176
0.169

まとめ
 差はほぼ生まれないという結果が出ました。やはり読み書きを多くするプログラムでないとramdiskを生かすことはできなさそうです。

2017年4月6日木曜日

PocketMine-MPでマルチスレッド処理をする!Thread/AsyncTask

こんにちは、haniokasaiです。
誰も、PocketMine-MPのマルチスレッドについてまとめた人がいなかったのでまとめてみます。

イントロ
phpで書かれたpocketmineは重いです。それは、保守のかんたんさと引き換えにそうなっているのでしょうが、特にcurlで外部のapiにアクセスをするものを使うときには全体の処理を遅らせてしまうことでしょう。
そもそも、PMMPのbinには、pthreadが同梱されていますが、単純に使うことはどうやら
できないようです。そこでどうしようかなぁと思ってたら、記憶がうろ覚えなのですが、pocketmine\threadを使うと良いと、おぎわらが教えてくれました。彼は私の夢で何故か一度登場したことがあります。
マルチスレッドについては、検索すればいい説明が読めます。


プラグイン例
https://github.com/haniokasai/PocketMine-Thread/

Thread
threadは、返り値の伴わないスレッド処理ができます。ですから、serverlistの情報送信のような一方的な作業に使うことができます。

        $job1 = new thread_ex1("Hello");
        $job1->start();

class thread_ex1 extends Thread
{
    public function _construct($data)
    {
        $this->data = $data;
    }
    public function run()
    {
        echo $this->data;
       Server::getInstance()->getLogger()->notice($this->data);// 動かない、無言だがエラーとなる
    }
}

最初の $job1 = new thread_ex1("Hello");
で、仕事を生成します。
()内には、引き渡したい変数をかけます。
(引き渡し先は、_construct($data)です。この関数の中に $this->data = $data; と定義してあげると、run内で利用できます。)
$job1->start(); で仕事実行です。
すると、_construct、runの関数の順に実行されます。
ただし、run内で、phpで書いた関数はスレッドクラス外から呼び出せないです。


AsyncTask
これは動作完了時に、任意の作業をさせることができます。ですから、webに接続するタイプのログインプラグインであっても、通信が完了した時にログインを完了させれば、他の人がラグを感じずに済むわけです。

$this->getServer()->getScheduler()->scheduleAsyncTask($job4 = new thread_ex3(Server::getInstance()));

class thread_ex3 extends AsyncTask
{
public function __construct($instance)
{
$this->instance =$instance;
}
public function onRun()
{

echo PHP_EOL."job3 1-2";
//$this->instance->getLogger()->notice("job3 1-1"); //動かない、無言だがエラーとなる
}
public function onCompletion(Server $server)
{
echo PHP_EOL."job3 2-2";
$server->getLogger()->notice("job3 2-1");
}
}

最初の、 $job4 = new thread_ex3(云々 の変数で、仕事を作成、scheduleAsyncTask で開始させています。
すると、_construct が実行、onRun が実行され、 onRunが完了すれば、onCompletionが実行されるでしょう。
onRun内では、外部の関数が実行できませんが、onCompletionでは、Serverの変数が渡されるので、$server を$this->getServer()として見なせば、pmmpが操作できます。

イントロの逆ってアウトロなんですね!
以上、マルチスレッドの方法について、まとめてみました。
サンプルプラグインを触れば、何ができるかよりわかると思います。
もともと、ある人の鯖の軽量化のためだけに考えたのですが、もうその人は鯖をやめてしまい、自分も開かないことをその人に進めたので、墓場(github)に埋もれていました。ですから、せっかくなので拾い上げ、記事にしました。
これで少しでも使う人が増えたらいいなと思います。今回はざっとしか書いてないですけど、反応を見て続編を書きたいです。

参考:

https://github.com/pmmp/PocketMine-MP/blob/master/src/pocketmine/scheduler/AsyncTask.php
https://github.com/organization/SpawningPool
 お世話になった、おぎわら、ありがと!
https://twitter.com/CostlierRain464

2017年4月5日水曜日

libminecraft.soを解析して、パケットとか、いろいろ調べる! #2

こんばんは、haniokasaiです。

サーバーホスティングプロジェクトの前段階のプロジェクトに取り組んでいるのですが、最近、それができていないので、別のことをしようと思いました。そこで、パケット解析の手法を書きます。

今回使う、mcpeassemblyanalogyanalyzerの製作者のnewdelion(以後、あーたんと表記)とかなりもめたことがあり、記事が製作できませんでしたが、最近ではすっかり仲良くなり、後ろの穴を使わせてもらう関係となりました(大嘘)彼は残念ながら、ほかにも仲のいい男がいるので、私の片想いでしょうが、、、、 ホモじゃないですよ!!!

冗談はさておき、本題にはいります。

#修正
2017/4/5 片想いの漢字が間違っていると、本人から指摘を受けましたが、片想いであることは間違っていると指摘を受けませんでした

windowsでやります

まず、libminecraftpe.soバイナリからテキストファイルをつくらないといけません。
http://blog.haniokasai.com/2016/11/libminecraftpesowindows.html
以前、書いておきました。これにしたがって、やってください。

次に
https://ci.appveyor.com/project/haniokasai/mcpeassemblyanalogyanalyzer/build/artifacts
にて、ログインをし、PacketSearcherとSpliterを落としてください。
最新版ではありませんが、ここからも落とせます


Spliter

Spliter.zipを解凍し、Spliter.exeを実行してください。
すると、白黒のcuiの画面が出てきます。

上から、

Path:dumpmcpe.txtの保存場所
Output Path:出力されるフォルダ
Output Name:出力されるファイル名
Output Extension:空欄で構わない

と入力してください。


例:
Path:Z:\workdir\mcpelib\test\dumpmcpe.txt
Output Path:Z:\workdir\mcpelib\test\out
Output Name:out_dump
Output Extension:

エンターを押してかなり待ちます。

すると、 out_dump云々のファイルが作成されているでしょう。


PacketSearcher

searcherという名前ですが、検索するのには使いにくいです。

まず、PacketSearcherを開くと、ファイル指定の画面がでてきます。
それで、さっき生成されたファイルを選んで、開くを押します。

タイトルバーが解析中でなくなったら、saveで適切な場所に保管してください。







これで使い方の説明は終わりとなります。生成された物の見方がさっぱりわかりません。。。。
でも、この記事を読んで、パケットを調べられた!って声をきけたら嬉しいなと思います。



参考:
https://www.youtube.com/watch?v=OEMIiI3B0vU
https://github.com/NewDelion/MCPEAssemblyAnalogyAnalyzer
newdelion(あーたん)本人(Twitterが鍵垢のため、書きません)

2017年4月3日月曜日

timingsでどの処理にどのくらいの負荷がかるか調べる! Minecraft PC(Bukkit)/PE(PocketMine,Nukkit)のサーバーで軽量化! 

どうもおひさしぶりです。haniokasaiです。
最近は下書きを少し書いては、興味がなくなりの繰り返しでありました。

今回は、Minecraftのサーバーの負荷を減らすために、どのような処理に時間がかかっているのかを分析する方法を紹介します。

BlueLightでやってみます。ほかも大体は同じです
サーバーのコンソールで、

/timings on
を実行します
とします。

コンソール
timings on
[17:26:40] [Server thread/INFO]: タイミングをリセット及び有効にしました



普通に(または負荷をかけるように)プレイしてもらい、

/timings paste
をします。

すると 
timings paste
[17:45:36] [Server thread/INFO]: タイミングをhttp://paste.ubuntu.com/23792964/にアップロードします
[17:45:36] [Server thread/INFO]: 結果は http://timings.haniokasai.com/?url=23792964 で見ることができます


とコンソールに表示されるので、 http://timings.haniokasai.com/~等のリンクをブラウザで見てください。(PocketMineの場合、BlueLight以外、http://timings.云々なんとか.com/を、http://timings.haniokasai.com/に置き換えると日本語で見れるでしょう
すると、、、


このように表示されます!
上二つの項目は、サーバー全体の負荷、下2つはプラグインごとの処理の負荷が見れます。
Eventにイベントの種類が書かれています

このようにして、サーバーの負荷を知ることができれば、プラグインの処理を減らす、あるいはサーバーのスペックを増やす等の対策ができるわけです。

無料のMinecraftPEマルチプレイサーバーのMiRmMCPE運営して早2ヵ月...

どうも。はにおかさいです。 MiRmを運営して早く、2ヵ月経ちました。6月14日から運用しています。 mirm.info とは、MinecraftPE/PCの完全無料のレンタルサーバーです。 プラグインはすでにいれてあるものを使えます。 そもそも、MiRmの名前の...