自転車故障中

TREKの8.3DSが故障中。

通勤の帰りにリアディレイラーが3段くらいしか切り替わらない。

手元の機械部分で、何かひっかかりがなくなっている感じ。

錆びついたのかなと、556をかけてみたが、数日たっても状況は変わらず。

修理に出そうか。それとも自分で分解してみようか?

ロードレーサーのケイデンスセンサーも、スマホと接続できない。

これからの季節、自転車には最高なのに、自転車の状況は悪くなっていく。

よし!気合で何とかしよう!

久々の自転車通勤は、

久々の自転車通勤。

走り出してから、スマホに速度が表示されないことに気づく。

自転車に取り付けてあるセンサーの電池が切れたのかもしれない。しょうがないのでそのまま走り続ける。

が、あとで見てみると2/3くらいは記録されていた。センサーと磁石の距離が遠いのかと、ちょっと調整してみる。

そのおかげか、帰りは全行程記録されていた。でも、なんだか不安。このままの状態で、レース中に電池が切れたら最悪だな。いや、出ないけど。

奈良市内で、なんだか警察官がうじゃうじゃいるなと思ったら、皇太子ご夫妻が来られてたみたい。

奈良ホテル前を通ったときも、係の人が観光客に今日は入れないと説明していたように見えた。

交通規制の時間からは外れていて一安心。

気温が下がってきているとは言え、土曜日は台風の影響か、向かい風が酷かった。

久々の自転車ということもあって、20キロ以上を維持できない。ずっと坂を登ってる感じ。

こんな時はバイクが恋しくなる。でも、自転車の方が好き。と、言うことにしておく。

にしても、歩道(自転車可)の舗装が汚い!国道なんだし、もう少し綺麗にしていただきたいところである。

VPythonを使ってマイクラの世界を覗いてみる

MinecraftをPythonで制御できるようになった。

ブロックを置きまくって遊んだ後は、マイクラの世界をスキャンしてみよう。そしてその情報を描画してみたい。

まずはブロックデータの取得。

posPlayer = mc.player.getPos()
for iGetX in range(int(posPlayer.x-iWidth), int(posPlayer.x+iWidth+1)):
for iGetY in range(int(posPlayer.y-iWidth), int(posPlayer.y+iWidth+1)):
for iGetZ in range(int(posPlayer.z-iWidth), int(posPlayer.z+iWidth+1)):
print(“Scan : %d, %d, %d = %d” % (iGetX, iGetY, iGetZ, mc.getBlock(iGetX,iGetY,iGetZ)))

とりあえず、こんな感じで自分の周りのブロックの情報を取得してみた。Python初心者なので、おもいっきり冗長なコードだが、気にしない。

出力は以下のようになった。

Scan : -7, -5, -22 = 12
Scan : -7, -5, -21 = 12
Scan : -7, -5, -20 = 12

Scan : 2, 5, -14 = 0
Scan : 2, 5, -13 = 0
Scan : 2, 5, -12 = 0

では、0でない座標に球を置いて描画してみたい。

まずは、Python3.6で描画機能を使いたいので、VPythonなるものをインストール。

> pip install vpython

初回実行時、次のようなエラーが表示されたが、再度事項してみると、エラーなく終了した。

NameError: free variable ‘install_kernel_spec’ referenced before assignment in enclosing scope

原因不明。そのうち解析したい。したいがするかどうかは別の話。

では、描画するコードを追加してみる。

import mcpi.minecraft as minecraft
import mcpi.block as block
from vpython import *

mc = minecraft.Minecraft()

iWidth = 200
posPlayer = mc.player.getPos()

arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(iWidth,0,0), color=vector(1,0,0), shaftwidth=5)
arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(0,iWidth,0), color=vector(0,1,0), shaftwidth=5)
arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(0,0,iWidth), color=vector(0,0,1), shaftwidth=5)

for iGetX in range(int(posPlayer.x-iWidth), int(posPlayer.x+iWidth+1), 5):
for iGetY in range(int(posPlayer.y-10), int(posPlayer.y+iWidth+10), 5):
for iGetZ in range(int(posPlayer.z-iWidth), int(posPlayer.z+iWidth+1), 5):
idBlock = mc.getBlock(iGetX,iGetY,iGetZ)
if idBlock != 0:
print(“Scan : %d, %d, %d = %d” % (iGetX, iGetY, iGetZ, idBlock))
colBlock = minecraft.Block(idBlock).getRGBA()
vpython.sphere(pos=vector(iGetX, iGetY, iGetZ), radius=2, color=vector(colBlock[0]/255,colBlock[1]/255,colBlock[2]/255), opacity=colBlock[3]/255)

で、細かい説明が面倒になったので、描画された結果がこちら↓

OSError: [WinError 10055] システムのバッファー領域が不足しているか、またはキューがいっぱいなため、ソケット操作を実行できませんでした。

。。。

えぇ、もうパソコンが追いつかない。

でも、なんとか描画できた結果がこちら↓

綺麗だな。でも遅いな。実用的な物になるのかな?

ソースコードも置いておこうか。BLOGに載せるとインデントがなくなってるみたいだし。

nori_mc_scan.py

mcpipyでの開発を快適に

Pythonのコード編集をNotepad++で行い、コマンドプロンプトから実行していたが、さすがに面倒。

Pythonには標準のIDEのIDLEが付属しているらしいとのことで、スタートメニューを見てみた。

ちゃんとPython 3.6フォルダ内に、IDLE (Python 3.6 32-bit)が入っていた。

起動すると、Pythonのインタプリタが起動した。

ソースを編集するには、メニューからOpen。そのままメニューの[Run]-[Run module]もしくはF5キーで、実行してくれる。

自動補完も[Ctrl]+[Space]で可能。

だいぶ楽だね。

マイクラPE(Pocket Edition)のサーバーを建ててみる

PC用マイクラのサーバーを建てられたので、PE版のサーバーも建ててみる。

まず、環境としては、CentOS7にユーザーminecraftがいて、/home/minecraft/が存在しているとする。

$ su minecraft

で、ユーザーを切り替えて、

$ cd ~/
$ mkdir pocketmine
$ cd pocketmine

で、サーバー用のフォルダを作って移動。

後は次のページを参考に、インストール。

https://pmmp.io/get.html

まず、環境を整えるために、必要なパッケージをインストール。

# yum install perl gcc g++ make automake libtool autoconf m4

続いてサーバー本体をインストール

$ wget -q -O – https://get.pmmp.io | bash -s –
[*] Found PocketMine-MP 1.6.2dev (build 234) using API 3.0.0-ALPHA6
[*] This stable build was released on 2017年 6月 25日 日曜日 22:15:51 JST
[-] This channel should have a signature, none found
[*] Installing/updating PocketMine-MP on directory ./
[1/3] Cleaning…
[2/3] Downloading PocketMine-MP 1.6.2dev phar… done!
[3/3] Obtaining PHP: detecting if build is available…
[3/3] Linux 64-bit PHP build available, downloading PHP_7.0.3_x86-64_Linux.tar.gz… checking… regenerating php.ini… done
[*] Everything done! Run ./start.sh to start PocketMine-MP

ちなみに、こちらのサイトからもインストール可能だが、バージョンが1.4.1。PHPもバージョン5が利用されている。

http://www.pocketmine.net/

先ほどインストールしたバージョンは、ログを見る限り1.6.2で、PHPもバージョン7を利用している。

それでは、サーバーをスタートしてみる。
太字のところ以外はエンターキーで次へ。

$ ./start.sh
[*] PocketMine-MP set-up wizard
[*] Please select a language
العربية => ara
Čeština => ces
中文 (简体) => chs
Deutsch => deu
Ελληνικά => ell
English => eng
Eesti => est
Suomi => fin
Français => fra
Gaeilge => gle
עברית => heb
Bahasa Indonesia => ind
Italiano => ita
日本語 => jpn
한국어 => kor
Latviešu => lav
Malti => mlt
Bahasa Melayu => msa
Nederlands => nld
Norsk => nor
Polski => pol
Português => por
Pyccĸий => rus
Español => spa
Svenska => swe
Tagalog => tgl
ภาษาอังกฤษ => tha
tlhIngan => tlh
Türkçe => tur
Українська => ukr
Tiếng Việt => vie
中文(繁體) => zho
[?] Language (eng):
[*] English has been correctly selected.
[*] Welcome to PocketMine-MP!\nBefore starting setting up your new server you have to accept the license.\nPocketMine-MP is licensed under the LGPL License,\nthat you can read opening the LICENSE file on this folder.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

[?] Do you accept the License? (y/N): y
[?] Do you want to skip the set-up wizard? (y/N):

[*] You are going to set up your server now.
[*] If you don’t want to change the default value, just press Enter.
[*] You can edit them later on the server.properties file.
[?] Give a name to your server (Minecraft: PE Server):
[*] Do not change the default port value if this is your first server.
[?] Server port (19132):
[*] Choose between Creative (1) or Survival (0)
[?] Default Game mode (0):
[?] Max. online players (20):
[*] The spawn protection disallows placing/breaking blocks in the spawn zone except for OPs
[?] Enable spawn protection? (Y/n):
[*] An OP is the player admin of the server. OPs can run more commands than normal players
[?] OP player name (example, your game name): nori
[*] The white-list only allows players in it to join.
[?] Do you want to enable the white-list? (y/N):
[!] Query is a protocol used by different tools to get information of your server and players logged in.
[!] If you disable it, you won’t be able to use server lists.
[?] Do you want to disable Query? (y/N):
[*] RCON is a protocol to remote connect with the server console using a password.
[?] Do you want to enable RCON? (y/N):
[*] Getting your external IP and internal IP
[!] Your external IP is 999.999.999.999. You may have to port-forward to your internal IP 192.168.1.2
[!] Be sure to check it, if you have to forward and you skip that, no external players will be able to join. [Press Enter]

[*] You have finished the set-up wizard correctly
[*] Check the Plugin Repository to add new features, minigames, or advanced protection to your server
[*] PocketMine-MP will now start. Type /help to view the list of available commands.

ここまでが設定ウィザード。

途中「sh: ifconfig: コマンドが見つかりません」と表示されるのは、ifconfigがインストールされていないから。特にサーバー自体は問題なく起動した。

次からが実際に起動時のログ。

[22:28:15] [Server thread/INFO]: Loading pocketmine.yml…
[22:28:15] [Server thread/INFO]: Loading server properties…
[22:28:15] [Server thread/INFO]: Selected English (eng) as the base language
[22:28:15] [Server thread/INFO]: Starting Minecraft: PE server version v1.1.0.55
[22:28:15] [Server thread/INFO]: Opening server on 0.0.0.0:19132
[22:28:15] [Server thread/INFO]: This server is running PocketMine-MP version 1.6.2dev-234 “Unleashed” (API 3.0.0-ALPHA6)
[22:28:15] [Server thread/INFO]: PocketMine-MP is distributed under the LGPL License
[22:28:15] [Server thread/INFO]: Loading recipes…
[22:28:15] [Server thread/INFO]: Loading resource packs…
[22:28:16] [Server thread/NOTICE]: Level “world” not found
[22:28:16] [Server thread/INFO]: Preparing level “world”
[22:28:16] [Server thread/NOTICE]: Spawn terrain for level “world” is being generated in the background
[22:28:16] [Server thread/INFO]: Starting GS4 status listener
[22:28:16] [Server thread/INFO]: Setting query port to 19132
[22:28:16] [Server thread/INFO]: Query running on 0.0.0.0:19132
[22:28:16] [Server thread/INFO]: Default game type: Survival Mode
[22:28:16] [Server thread/INFO]: Done (127.96s)! For help, type “help” or “?”

これでサーバーが起動した。

ちなみにファイアウォールのfirewalldでポートが閉じられている場合。
次のコマンドで開いておく。

# firewall-cmd –add-port=19132/udp –zone=public –permanent
# firewall-cmd –reload

ちなみに、ファイアウォールの設定は、次のコマンドで参照可能。

# firewall-cmd –list-all –zone=public

が、コマンドラインで、Pocketmineが起動中なので、設定は一旦サーバーを停止する必要がある。

stop
[22:42:45] [Server thread/INFO]: [CONSOLE: Stopping the server]
[22:42:46] [Server thread/INFO]: Unloading level “world”
[22:42:51] [Server thread/INFO]: Stopping other threads

再度起動して

$ ./start.sh
[22:46:33] [Server thread/INFO]: Loading pocketmine.yml…
[22:46:33] [Server thread/INFO]: Loading server properties…
[22:46:33] [Server thread/INFO]: Selected English (eng) as the base language
[22:46:33] [Server thread/INFO]: Starting Minecraft: PE server version v1.1.0.55
[22:46:33] [Server thread/INFO]: Opening server on 0.0.0.0:19132
[22:46:33] [Server thread/INFO]: This server is running PocketMine-MP version 1.6.2dev-234 “Unleashed” (API 3.0.0-ALPHA6)
[22:46:33] [Server thread/INFO]: PocketMine-MP is distributed under the LGPL License
[22:46:34] [Server thread/INFO]: Loading recipes…
[22:46:34] [Server thread/INFO]: Loading resource packs…
[22:46:34] [Server thread/INFO]: Preparing level “world”
[22:46:34] [Server thread/INFO]: Starting GS4 status listener
[22:46:34] [Server thread/INFO]: Setting query port to 19132
[22:46:34] [Server thread/INFO]: Query running on 0.0.0.0:19132
[22:46:34] [Server thread/INFO]: Default game type: Survival Mode
[22:46:34] [Server thread/INFO]: Done (0.656s)! For help, type “help” or “?”

スマホのマイクラPEから、サーバーに接続。
ちなみに、スマホが同じローカルネットワーク上にあるか、サーバーがグローバルアドレスで参照可能な必要がある。

世界に入ると、

次のようなログが表示される。

[23:28:44] [Server thread/NOTICE]: Player data not found for “nori”, creating new profile
[23:28:50] [Server thread/INFO]: nori[/192.168.1.3:99999] logged in with entity id 1 at (world, 256, 68, 256)
[23:29:01] [Server thread/INFO]: nori joined the game

だがしかし!!

スポーン付近の地面を掘っても掘っても、土が取れない。地面も元に戻ってしまう。

少し移動すれば土も掘れるし、木も切れる。

なぜ???