2017年5月5日金曜日

MCPEのパケット解析結果を見れるサイト!

こんにちは、haniokasaiです。
すごそうなサイトを見つけたので紹介します。
D言語で書かれた、MCPEサーバープロジェクト、https://github.com/sel-projectで、パケット解析をしていることに気づきました。
Githubでサーフィンしていたら、たまたまphpやjavaなど多数の言語のMCPEのライブラリを見つけて、その投稿者のホームページをみたら、詳細な解析結果が載っていました。

https://sel-utils.github.io/



















上から、Minecraft PC、MCPE,Raknet,(sel-serverの)hubとnode通信パケット、(sel-serverの)外部からwebsocketで操作するパケットが書かれています。

たとえば、https://sel-utils.github.io/pocket/112.htmlを見てみると、1つ1つのパケットの型、id、サーバーかクライアントが処理するかが書かれています。
これさえ読み解ければ、パケット解析をしなくとも、パケットが読めるというわけです。

しばらくはブログ更新できそうですので、その読み方を解説できればなぁと思います。

2017年5月4日木曜日

appwchr氏のMCPEのマルチプレイアプリで遊んでみた!

こんにちは、はにおかさいです。
精神状態がやばいけれども、それがある意味安堵できる状況でもあるという状態です。

mixiappwchr氏がマルチパーティというアプリを作ったようなので、レビュー書きます。
彼はもともとおしゃまるプロジェクトの開発者でしたが、おしゃまるがなんやかんやで終わってしまいました。でもマイクラで何かをしたかったそうで、今回のマルチプレイのアプリを作ったようです

Android端末が2台ありますので、試してみました。

まず、マイクラPEとマルチパーティーをインストールします。

次に、開きます

許可を開始を押します。(オレンジ色のボタンは長押ししないと反応しないのでしょうか。)


心優しいappwchr氏は変なことをしないと思うので、許可。


許可。

これも許可してください。

設定はこれで終了です!


ーーマルチプレイのワールドを開く側ーー

「パーティー」を作るには、パーティー名を決めて、右下のオレンジボタンを押してください。


名前を決めて、「開始」ボタンを長押しします。
根気強く工夫して押さないとなぜか反応しません。

このあと、マイクラPEのアプリが立ち上がるので、マルチプレイしたいワールドを開いてください。


ーーマルチプレイに参加する側ーー
設定後、アプリを立ち上げます。


先ほどのパーティー名と同じパーティーを押します。




パーティーに参加の参加ボタンを長押しします。


遊ぶを押します。


LANゲームにパーティーを開いた人の名前の部屋があるはずなので、それを押して、参加します。

読み込みを待つと、、


マルチに入れました!


感想
mob等をふ化させて、動きを確認しましたが、今回のこのアプリはおしゃまると違って、サーバーを通さないで通信するので快適にできました。
コマンドはうまく使うことができません。
欠点としては、パーティーに入る際、許可がいらないので、知らない人がどんどんきちゃうことです。テスト中も関係ない人が入ってきて困惑しました。
まだまだ、開発途中ですので、そこは改善してほしいです。。。
1年ほど前、まだ自分に割と友達がいたころにこのアプリがあったら、結構使ってたことでしょうね....
どんどんこれからもMCPEの記事を書けるのであれば、書きたいと思っています。









宇都宮で餃子食べてきた!

どうも、はにおかさいです。
GWどこにも行かないのも寂しいので、宇都宮で餃子食べてきたました。

数時間かけて、宇都宮に行ったのですが、思った以上に栄えてまして驚きました。

まずは、宇都宮 みんみん ステーションバル店に。
11:8ごろ(GWの水)に行ったのですが、一応並ばずには入れました。
注文してから15分後、商品が届きました。

水餃子と焼き餃子を注文、安かったのですが味もそこそこでした。
店には遠出をしていて途中で寄ってる人が多いようです。新幹線もありますからね。


つぎは、同じ駅ナカ(あとで建物が同じことに気づきました())の青源に行きました。
(11:30ごろから)15分ほど並び、店に入って、注文。また10分ほどたったら、オーダーしたものが来ました。

ネギみその焼き餃子
程よい濃さのみそで、ねぎも味噌が染みてて、今回食べた餃子の中では一番気に入りました。


水餃子。みそに浸かってて、味が染みています。スープは酸味が効いてて、餃子にあいますが、飲むには少し酸っぱい気がします。(スープも飲めると書いてあるので飲むことも想定されてるでしょう。)

宇都宮駅から15分ほど歩いて、来らっせ本店に着いた(13時ごろ)のですが、数
十人が既に並んでいて、とても並ぶ気になれなかったのであきらめました。

そっから、オリオン通りに行きました。昔の商店街みたいなところでしたが、正直見どころは少ないです。

歩いていたら、餃子ナンピザなるものを発見!ヒルズカフェ(HillsCafe)という店でした。

店内は、一階がお土産ショップ、2階がレストランです。レストランはファストフードのコーナー的なものを想定して行ったのですが、レストラン色が強かったです。

味はいいのですが、 具が少ない 上に載ってる餃子の焼いた皮がもはやただのせんべい 冷めてる ナンという割には、薄すぎる生地 隣の客がキ〇ガイでからまれた(店関係ないww) 
でいい気分しませんでした。ラー油をかけると、餃子っぽくなっておいしいです。
店はかなり空いてました(二時半ごろ)

また、ぶらぶらしたら、宇都宮餃子館を発見しました。


店内に入るのに、10分(3時ごろ)、店内では2,30分待たされました()


川越シェフも来たことがあるようw


湯葉入り餃子。高いですけど、おいしい。具はほんのり湯葉感がしました。
わさびをつけて食べます。
皮は一番おいしかったです。ちょうどいい歯ごたえ。。。

帰り、駅前の「餃天堂」に行こうとしたのですが、15:30にもかかわらず、1時間以上ほど並んでいそうだったのであきらめて帰りました、、、。
食べたかった。。。。

まとめ
味としては、ねぎみそ焼き餃子。餃子の皮は宇都宮餃子館の餃子がよかった。
んー。全体的に店が混んでます。ゴールデンウイークだったからでしょうか。
正直、宇都宮の名所というものはなさそうなので、行くとしたら餃子食べ歩きがメインになりそうです。
後悔としては、オリオン通り近くの焼きそば屋に行きたかったことです。
店が一見さん厳しい感じだったので入れませんでした。。。
焼きそばが250円。かなり安い。おいしいのかなぁ。
1日中歩き回ってへとへとです。文章のグラマーもなんか変かもしれません。
初食レポ記事なので、だいぶ編集が雑ですけど、ご容赦くださいませ。

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が鍵垢のため、書きません)

MCPEのパケット解析結果を見れるサイト!

こんにちは、haniokasaiです。 すごそうなサイトを見つけたので紹介します。 D言語で書かれた、MCPEサーバープロジェクト、 https://github.com/sel-project で、パケット解析をしていることに気づきました。 Githubでサーフィンして...