月度归档:2016年10月

Java单元测试遇到的一个问题

在进行单元测试的时候出现了一个奇怪的问题。报错为cannot create JDBC driver。但是我无论是JDBC的配置还是数据库的运行状态均正常,所以就产生了疑惑。

在求助了场外队友后,终于得到了解决。问题出现的可能原因是由于PowerMock的使用产生了一些与字节码相关的问题。解决方法是在eclipse中找到jre的配置,修改Default VM arguments参数,将参数置为

-XX:-UseSplitVerifier

Ubuntu 16.04安装Docker(Linode)

官方已经对如何安装有了详细的文档,本文仅对Linode安装的区别进行解释。(官方文档)

首先执行apt更新

apt update

向系统添加新的GPG Key

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

将docker源加入apt

echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

执行apt更新

apt update

安装依赖包(Linode版Ubuntu需要安装这些包)

apt-get install dmsetup
dmsetup mknodes

安装docker

apt install docker-engine

参考:https://github.com/docker/docker/issues/23347

dpkg lock解决

当之前运行apt install命令被异常终止时,重新运行apt install将会抛出dpkg lock错误。

执行以下命令将lock解除即可。

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock

Ubuntu 16.04部署minecraft服务器

更新系统软件

apt update && apt upgrade

安装jre(java运行环境)

apt install default-jre

安装screen

apt install screen

创建新用户minecraft用于运行minecraft服务

sudo adduser minecraft

如果设置了iptable,请加入以下规则开放25565端口

-A INPUT -p tcp --dport 25565 -j ACCEPT

现在,退出当前ssh连接,并使用minecraft用户重新登录。(注意:此处请退出ssh,而不是直接使用su minecraft命令切换用户。否则执行screen命令的时候将报错,具体原因和解决方法看 此贴 )。以下步骤使用minecraft用户进行。

创建minecraft目录,从 官网 下载jar包放入目录。

mkdir minecraft
cd minecraft
wget https://s3.amazonaws.com/Minecraft.Download/versions/1.xx.xx/minecraft_server.1.xx.xx.jar

创建一个脚本以运行server

脚本:/home/minecraft/minecraft/run.sh

#!/bin/sh
BINDIR=$(dirname "$(readlink -fn "$0")")
cd "$BINDIR"

java -Xms1024M -Xmx1536M -jar minecraft_server.1.xx.xx.jar -o true

赋予权限:

chmod +x run.sh

尝试执行

$ ./run.sh
[21:39:43] [Server thread/INFO]: Starting minecraft server version 1.8.8
[21:39:43] [Server thread/INFO]: Loading properties
[21:39:43] [Server thread/WARN]: server.properties does not exist
[21:39:43] [Server thread/INFO]: Generating new properties file
[21:39:43] [Server thread/WARN]: Failed to load eula.txt
[21:39:43] [Server thread/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[21:39:43] [Server thread/INFO]: Stopping server

提示需要统一EULA协议。很简单,修改minecraft目录下生成的eula.txt文件,将eula置为true即可。

文件:/home/minecraft/minecraft/eula.txt

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Tue Jan 27 21:40:00 UTC 2015
eula=true

* 如果有需要,可以禁用掉minecraft的用户在线校验,打开 server.properties, 修改:

online-mod=false

创建一个screen以运行minecraft

screen -S minecraft

此操作相当于重新开了一个console。

在这个screen中运行minecraft服务器

./run.sh

此时,如果看到类似以下提示,服务器便已经正常运行了

[22:00:06] [Server thread/INFO]: Starting minecraft server version 1.8.8
[22:00:06] [Server thread/INFO]: Loading properties
[22:00:06] [Server thread/INFO]: Default game type: SURVIVAL
[22:00:06] [Server thread/INFO]: Generating keypair
[22:00:07] [Server thread/INFO]: Starting Minecraft server on *:25565
 
....
 
[22:00:07] [Server thread/INFO]: Preparing level "world"
[22:00:08] [Server thread/INFO]: Preparing start region for level 0
[22:00:09] [Server thread/INFO]: Preparing spawn area: 3%
 
....
 
[22:00:21] [Server thread/INFO]: Preparing spawn area: 96%
[22:00:22] [Server thread/INFO]: Done (14.737s)! For help, type "help" or "?"

附,screen的一些操作

可以使用-ls查询当前正在使用的screen

screen -ls

可以使用-x [screenname] 回到指定的screen

screen -x minecraft

参考:https://www.linode.com/docs/applications/game-servers/minecraft-on-debian-and-ubuntu

启动器:http://teamshiginima.com/

解决使用Screen出现Cannot open your terminal办法

这个问题出现在我在搭建minecraft时。首先我创建了用户: minecraft

adduser minecraft

然后进行minecraft的安装配置。具体略。

之后,切换到root安装screen

~$ su root
~# apt install screen

切换回minecraft用户,准备开启screen运行服务器。此时报错了

~# su minecraft
~$ screen -S minecraft
Cannot open your terminal '/dev/pts/2' - please check.
  • 解决方法1:

切换到root,然后执行

script /dev/null

之后切换回minecraft用户即可。

  • 解决方法2:

重新开启一个ssh连接,直接使用minecraft用户登录。然后进行screen操作就不会报错了。

参考:http://blog.sina.com.cn/s/blog_704836f401010osn.html

http://serverfault.com/questions/116775/sudo-as-different-user-and-running-screen

将本地项目上传到Github

首先需要在github上新建一个空项目,例如foo.git,此时将得到项目地址:

https://github.com/username/foo.git

之后在本地初始化git并提交。进入项目目录进行以下操作:

# 新建一个README.md的文件,并将项目名写入此文件
echo "# Foo" >> README.md
 
# 初始化本地仓库
git init

# 将README.md文件加入到仓库中 
git add README.md 

# 将文件commit到本地仓库
git commit -m "init"

# 添加远程仓库,origin只是一个远程仓库的别名,可以随意取
git remote add origin https://github.com/username/foo.git

# 将本地仓库push远程仓库,并将origin设为默认远程仓库
git push -u origin master

此时,本地文件夹就与远程git仓库关联起来了。项目中仅有一个README.md的说明文件,接下来将项目的其他文件push到远程仓库

# 新建.gitignore文件,将需要排除的文件/文件夹写入
vim .gitignore

# 添加本地文件
git add .

# 提交到本地仓库
git commit -m "init"

# push到远程仓库
git push origin master

Django Model一对多、多对多关系

在Django的Model中,可以定义多种关系:一对一,多对一/一对多,多对多。

分别为:

  • 一对一:OneToOneField
  • 多对一:ForeignKey
  • 多对多:ManyToManyField

可以更加natural的表述为:

  • 多个属于一个,即 belong to : ForeignKey,多个属于一个
  • 一个有一个,即 only has one: OneToOneField
  • 一个有很多个,即 has many: lots of A belong to B 与 B has many A,在建立 ForeignKey 时,另一个表会自动建立对应的关系
  • 一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。

在官方的tutorial中,有这样一个例子:

import datetime

from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

在Model定义中表现了如下一对多关系:

               |---- Choice 1
               |
Question 1 ----|---- Choice 2
               |
               |---- Choice 3

我们可以看到,在“多”的一方(Choice)中定义了“一”的一方(Question)的外键。

当从“多”的一方展开查询时,只需要指明属性名即可

>>> c = Choice.objects.get(id=1)
>>> c.question

当从“一”的一方展开查询时,则需创建一个foo_set集合:

>>> q = Question.objects.get(id=1)
>>> q.choice_set.all()

对于多对多关系,其实和一对多非常的像,定义ManyToManyField的Model访问和它关联的Model时,直接访问该Model的名字就可以了,反过来,就需要加上“_set”了。

参考:http://logic0.blog.163.com/blog/static/18892814620137343447299/

http://blog.csdn.net/hackerain/article/details/39838559

mysql_config not found解决方法

这是一个在安装mysqldb(mysql-python) – python2 或者mysqlclient – python3时经常出现的问题,问题原因是缺少mysql client 的一个依赖包。解决方法:

sudo apt-get install libmysqlclient-dev

将依赖包安装好后就能够正常安装了。 参考:http://stackoverflow.com/questions/5178292/pip-install-mysql-python-fails-with-environmenterror-mysql-config-not-found

apt-get update stuck: Connecting to security.ubuntu.com

使用apt-get update安装更新时经常会卡在

[Connecting to archive.ubuntu.com ]

这一步,这里提供解决方法:

编辑/etc/gai.conf ,取消34行处的注释。

#
#    For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100

参考:http://askubuntu.com/questions/272796/connecting-to-archive-ubuntu-com-takes-too-long