我是如何搭建一个低成本的 Minecraft 小型服务器的

注目:本人不接受任何的免费的技术咨询指导,提问请先发红包!

自己有个小型的 Minecraft 服务器,为了节约成本以及管理方便,做了一整套自动化的管理方案。整套方案代码量近万行,同时很多东西都写死在了代码里,想开源但是很多东西目前还不完善,根本没法拿出手……所以写了个思路整理,若有需要的朋友可以参考着搭一个。

一、 服务端的选用

没啥好说的,由于需要 mod ,用的 KCauldron-1.7.10, mod 都是自己打的, Forge + LiteModLoader ,大概十几个 mod 。

插件用了一个非正版验证插件,配合宏与按键绑定(Marcos and key bind)进行自动登录。

二、 ISP 的选择

ISP 使用青云。由于服务器在线人数常年在 5 人以下,故选用青云可以随时开关实例,节约运行成本。

青云关机的话,公网 IP 和硬盘也收费,故使用 API 将 ip 释放,仅保留硬盘扣费。

三、 如何开启服务器

由于公网 IP 变动和服务器常年关闭,在另外一台服务器上搭建了一个 HTTP 服务,并自己写了个启动器。

当启动器启动的时候调用那个服务去开启服务器、下发公网 IP 并写入 servers.dat,避免动态域名解析被缓存的问题。

开启服务器后,利用 Telegram bot API ,在群里进行通知服务器的新 IP。

利用 mc 协议检查十分钟没人登录后,服务器自行关闭。

四、 如何管理 mc 服务

使用 supervisord 进行自启动。

需要控制台时,利用 supervisorctl fg minecraft 来调用控制台。

在 Windows 下使用 boot2docker 搭建 docker 开发环境

很久以前研究过一会儿 docker ,当时觉得只是一个轻量级的虚拟机包装而已,没觉得有多大用。

最近发现这玩意还蛮好玩的,但是又懒得翻以前的虚拟机了,于是发现一个叫 boot2docker国内下载(via DaoCloud) 的东西。官方宣称是“It runs completely from RAM, weighs ~27MB and boots in ~5s (YMMV).”。

下载回来的安装包有 100 多 MB,当时在想说好的 27MB 呢,结果发现包里有个 VirtualBox 和一个 msysgit ……简直坑。

如果你的机器上没有这俩玩意,那就放心大胆的直接安装吧。它会帮你把各种琐事配置好,官方的指导文档里也写的十分详细。

如果你的系统里有 VirtualBox 了,那也就直接安装,它会自动识别系统上的 vbox 的,不过你最好先测试一下你的 Host-only 网卡是否正常。

那么重点来了:如果你的系统里有 msysgit,并且还有其它的 GNU 工具链,比如我这种装了 Gow 的人,那么其实这个玩意是有坑的。

要说这个坑,首先要谈一谈 boot2docker 的工作原理。 boot2docker 由 VirualBox 里的一个叫 boot2docker 的虚拟机、一个用来管理 Virual Box 里的虚拟机的工具 boot2docker.exe 和 docker 本体 docker.exe 组成。

当你执行 sh start.sh 的时候,它首先调用 boot2docker init 来创建这个虚拟机(如果已经存在则跳过);其次将该虚拟机启动;最后使用 boot2docker ip 来获取虚拟机的 ip 地址并设置环境变量。

boot2docker ip 这个命令,是调用系统中的 ssh 来获取 ip 地址的。它在 init 的时候,将虚拟机的 22 端口转发到宿主机的 2022 端口,并运行 ssh -p 2022 docker@localhost ip addr show dev eth1 来获取 ip 地址(详细的命令可运行 boot2doker -v ip 来显示)。而 Gow 里的 ssh 指令,则是调用了 PuTTY 的 plink.exe

那么问题来了:plink.exe 根本不支持 -p 语法,也不支持它所使用的 -o 等参数。

所以,如果你装了 Gow,请一定把 msys git 的路径加到 PATH 的最前方……起码是在 Gow 的前面,这样就不会被坑了。

处理完这些乱七八糟的事情之后,运行 boot2docker status 即可看到你的虚拟机的当前状态。下次使用时,只需执行 sh start.sh 即可自动配置好环境变量并且开启 git bash。在这个 git bash 里,你就可以执行你的 docker 指令了~

如果不想用 git bash,那么执行 boot2docker shellinit ,也可以看到应设置的环境变量,如:

export DOCKER_HOST=tcp://192.168.111.222:2376
export DOCKER_CERT_PATH='C:\Users\oott123\.boot2docker\certs\boot2docker-vm'
export DOCKER_TLS_VERIFY=1

此时,用 set 将这些环境变量设置好,即可在 cmd 中使用 docker 来管理 docker 容器了,如:

set DOCKER_HOST=tcp://192.168.111.222:2376
set DOCKER_CERT_PATH=C:\Users\oott123\.boot2docker\certs\boot2docker-vm
set DOCKER_TLS_VERIFY=1

试试 docker info 能不能显示出虚拟机的信息来吧。

Tiny Tiny RSS 推送到 kindle

前方高能预警:以下内容本人仅照原样提供,不对其有任何支持!伸手党速速退散,折腾指数五颗星!

前方预警:如果你没有 kindle 或者不打算用 kindle 看 RSS,以下内容对你而言并无作用。

很久以前折腾了一个 Calibre 的自定义脚本,用这个脚本可以将 tiny tiny rss 中的内容推送到 kindle 上实现 kindle 的 rss 阅读。

kindle 上的阅读体验

不过在最新的 ttrss 上,我发现它已经没法实现分类阅读了,估计是 api 有所改动,毕竟写了也有好几个月了,懒得调整了……

先放上脚本链接,包含 recipe 文件和推送脚本,后者需要 mailgun 账户。

如果你用的是 Linux VPS,那么只要按照calibre 官网上所述的安装方法安装好 calibre,最后将 recipe 文件和 push.sh 放到 VPS 上,修改一些变量就能用了。

如果你用的是 Windows (自己的电脑或者 VPS 都好),那打开 calibre,点新闻抓取,高级,自己添加一个 recipe,将我的 recipe 文件粘贴进去,最后设置登录用户名为: username;http://<ttrss-url>;test,密码为 ttrss 的密码,然后设置自动抓取推送即可。

最后说一句,对此脚本不负任何责任,这玩意需要自己慢慢折腾,我之前没写折腾笔记所以现在懒得写 step-by-step 了……

SyntaxHighlighter 的正确使用姿势 – InstantClick 哭晕在厕所

今天闲得无聊,让 InstantClick 支持了 SynatxHighlighter,并且对 Typecho 动了些手脚,使得在 Markdown 渲染的时候无需手动指定就可自动识别代码语言并渲染高亮。

看起来逼格很高的两个事情,其实只需要简单的几个操作。

InstantClick 不支持 SynatxHighlighter ,是因为后者是监听 document.ready 事件的。这种动态渲染的插件,大多和 InstantClick 不兼容。解决方法和在 使用 InstantClick 时 piwik 、 MathJax 的配置 文中描述的一样,只需要加入一段渲染的代码就完工了:

InstantClick.on('change', function() {
    SyntaxHighlighter.highlight();
});

值得一提的是,我之前一直在试着加 SyntaxHighlighter.all() 发现没有用,后来读源码才发现, SyntaxHighlighter.all() 这个函数依然是监听 document.ready 事件,并在监听后调用 SyntaxHighlighter.highlight() 的,所以应该直接调用后者。

另外,SyntaxHighlighter 在换页后似乎无法 Autoload 对应的 Brush,所以需要在页面中预先用 script 标签加载所有的 brush。

至于 Markdown 渲染的时候加入自动识别,其实也就是加了个简单的正则。是在 /var/MarkdownExtraExtended.php 文件中,修改 _doCodeBlocks_callback 函数如下:

<?php
    protected function _doCodeBlocks_callback($matches) {
            $codeblock = $this->unhashHTMLBlocks($matches[1]);

            $codeblock = $this->outdent($codeblock);
            $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);

            # trim leading newlines and trailing newlines
            $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
            $codeRegexs = array(
                    'php' => '#\\?php#',
                    'html' => '#\(html|body|head|title|h1|div|p|?xml)#',
                    'js' => '#var|function \(|window\.|document\.|innerHTML#',
                    'bash' => '#curl|wget|sh|^\#!|service .* start|yum install|clone |cd #',
                    'sql' => '#SELECT|UPDATE|DELETE|WHERE#',
                    'python' => '#if.*:|def .*\(#',
                    'css' => '#background-color|font-family|margin|padding#',
            );
            $brush = 'text';
            foreach ($codeRegexs as $lang => $reg) {
                    if(preg_match($reg, $codeblock)){
                            $brush = $lang;
                            break;
                    }
            }
            $codeblock = "<pre class='brush: $brush'>$codeblock\n</pre>";
            return "\n\n".$this->hashBlock($codeblock)."\n\n";
    }

好了,从此告别手动指定语言,走向新时代啦~

Cmder / Listary 搭配使用的若干技巧

Cmder 是一个在 Windows 下用起来很舒服的控制台。以下引自官方网站,请自行阅读。

Cmder is a software package created out of pure frustration over the
absence of nice console emulators on Windows. It is based on amazing
software, and spiced up with the Monokai color scheme and a custom
prompt layout. Looking sexy from the start.

确切的说来,Cmder 是基于 ConEmu 定制的。我这里要说的,主要是 Cmder 如何和其它软件进行集成。

一、 免 UAC 以管理员权限启动 Cmder (或者任何程序)

这里用到的所谓 “免 UAC” 其实是利用 Windows 的计划任务功能。在“控制面板”中搜索“计划任务”打开计划任务的控制台,新建一个任务。路径选择你的 Cmder.exe(新版本)或者 Cmder.bat(老版本),并选上“使用最高权限运行”。触发器可以全都删掉,最后得到的结果大概如下图:

常规标签

然后记住图中的“位置”和“名称”。接着,打开一个非管理员的命令行,执行:

C:\WINDOWS\system32\schtasks.EXE /run /tn "\Best33.com\Cmder"

其中 /tn 后的参数则是“位置”和“名称”用\拼合的结果。

二、在任何地方打开你的 Cmder

这里我的 Cmder 是一个比较老的版本,1.1 吧。新版本很简单,用.\cmder.exe /REGISTER ALL注册就可以了。

老版本的话比较麻烦。我是这么做的:

修改 vendor\init.bat 加入以下内容到最尾部:

@IF "%~1"=="" GOTO endparse
@cd /D %1
:endparse

然后就可以用命令行:ConEmu.exe /Icon <CmderPath>\icons\cmder.ico /Title Cmder /LoadCfgFile <CmderPath>\vendor\conemu-maximus5\ConEmu.xml /Single /cmd cmd.exe /k <CmderPath>\vendor\init.bat "%path%"来启动 Cmder ,其中 %path% 则是你要启动的路径,而<CmderPath>则是你 Cmder 的路径。。

当然,说到 listary ,就不得不提它的智能菜单。我实现了一个这样的功能,双击资源管理器的空白处的菜单中增加了“在这里打开 Cmder 选项”,还是十分的好用的。

双击快速菜单

具体方法,则是在 选项->菜单->智能命令 中,点击“+”->启动应用程序,在“路径”中输入 ConEmu 的路径,大概是<CmderPath>\vendor\conemu-maximus5\ConEmu.exe;“参数”中输入/Icon <CmderPath>\icons\cmder.ico /Title Cmder /LoadCfgFile <CmderPath>\vendor\conemu-maximus5\ConEmu.xml /Single /cmd cmd.exe /k <CmderPath>\vendor\init.bat "%path%"

Listary 设置

附注

由于配置这一系列的东西的时间比较早,现在才整理出来,不免有些杂乱。如果有任何问题可以直接在下面留言。

勇敢的少年,快来创造奇迹!

UPDATE: 由于群成员已经达到预期,本群暂停接受申请。对之前申请被放置 play 的几位同学深表歉意。

UPDATE2: 本群已于 2016-06-03 被解散,请参考 Telk 群解散告知

前几天把好友列表中几位有意思的人拉到一起,建了一个 QQ 群。
(至于为什么是 QQ ,我们可以不讨论这个问题么……)

这个群大概是 ACG 向的的 Web 开发者交流扯淡小圈子。

初步打算控制在 25 人以内。现在的人数是 22 人,去掉一个小号是 21 人。 群成员已达到预期,暂时停止新成员的加入。

我们有:

  • 全端攻城狮囧叔 @orzFly
  • 00 后少年前端攻城狮钉子 @dimpurr
  • 可萌的CS博士(妹子)@**(保护个人隐私……)

那么,如果你:

  • 是 Geek ,或者有一颗想当 Geek 的心
  • 喜欢 web 开发
  • 喜欢 ACG
  • 不是基佬(重要)

(以上是必要条件)

如果是:

  • 技术不那么厉害,但是很可爱
  • 女孩子(我们有良好的男女比例!自从发了这篇文章之后就没有了)
  • 想要一个可以随便扯淡的群

那就更好了!(非必要条件)

那么,点击这里,完成一个 10 分钟的小谜题,来加入我们吧!

UPDATE: 由于群成员已经达到预期,本群暂停接受申请。对之前申请被放置 play 的几位同学深表歉意。

UPDATE2: 本群已于 2016-06-03 被解散,请参考 Telk 群解散告知

分享我的 Star 文章 rss 订阅

RSS 地址:

http://best33.com/usr/stared_feed.php

信息源列表:
信息源列表

从明天开始我会在这些信息源中筛选我觉得有意思/有价值/值得一看的文章标星。大概会控制在10篇/日的频率。

也不知道能够坚持多久,总之觉得做一下一定很不错~

各位用 rss 的欢迎订阅~也欢迎订阅我的博客 rss 哟。

另外如果你也在用 rss ,也请把你的 star 文章的 rss 订阅分享给我~

Firefox 35 下可用的 pentadactyl

pentadactyl 是一个以类 vim 方式操作 Firefox 的插件。

由于某些原因,pentadactyl 并未停止开发,但火狐附加组件页面和官方每日构建页面都停止了更新,导致火狐新版无法支持 。

于是我自己构建了一个版本,是文章发布时的最新源码构建的。放在了百度网盘,需要的人自取。

构建其实也很简单,以 CentOS 为例,假设你安装了 epel ,然后:

yum install mercurial zip make # 安装hg,zip,gmake等依赖
hg clone http://dactyl.googlecode.com/hg/ dactyl # 将 dactyl 的源码克隆到本地
cd dactyl/
make -C pentadactyl xpi # 制作 pentadactyl 的 xpi 文件

然后你会在 downloads 文件夹下发现构建好的 xpi 文件。直接用火狐安装即可。

更新:Firefox 35 可用的版本已经传到了百度网盘

使用 InstantClick 时 piwik 、 MathJax 的配置

InstantClick 是一个利用 hover 和 click 的时间差,预加载网页的黑科技。原理主要是在 hover 的时候预读网页,然后点击的时候就替换整个页面,让你的网站看起来整个都 PJAX 过~很酷炫。

不过造成的问题也很显然:换页的时候很多统计工具会失效;像我博客用的 piwik 就无法统计到页面的切换。同样,MathJax 这类渲染页面的插件也失效了。

解决方法很简单,只需在初始化之前,监听 InstantClick 对象的 change 事件,在事件中处理统计和渲染操作。代码如下:

InstantClick.on('change', function() {
    //piwik
    _paq.push(['setDocumentTitle', document.title]);
    _paq.push(['trackPageView']);
    //mathjax
    MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
});
InstantClick.init();

Enjoy ~

supervisord 管理多进程程序如 pyspider 时的合适配置

现在的工程中,有一部分是用 pyspider 来抓取数据的,使用 supervisord 来管理它的进程。在使用过程中,遇到一个奇怪的问题:用supervisorctl stop pyspider之后,pyspider 并未全部停止,而是留下了三四个进程在系统中。

查阅官方手册,在 [program:x] Section Settings 中找到了名为 stopasgroup 的选项,解释如下:

If true, the flag causes supervisor to send the stop signal to the whole process group and implies killasgroup is true. This is useful for programs, such as Flask in debug mode, that do not propagate stop signals to their children, leaving them orphaned.

在 [program:pyspider] 小节,开启这个选项。如:

[program:pyspider]
command=/home/oott123/pyspider/run.py
autorestart=true
startsecs=2
user=oott123
directory=/home/oott123/pyspider/
redirect_stderr=true
stopasgroup=true
environment=WEBUI_HOST="127.0.0.1",WEBUI_PORT="5033"

然后重启 supervisord ,再测试停止 pyspider 的服务,它就不会残留那几个进程了。