C#中的抽象基类(Abstract Base Class)和接口(Interface)

抽象基类和接口有很多类似的地方,那么我们在软件架构的过程中如何决定该用抽象基类还是接口呢?Stack Overfollow上有一个回答总结得比较好,虽然只有短短几十个字:

Abstract classes and interfaces are semantically different, although their usage can overlap.

An abstract class is generally used as a building basis for similar classes. Implementation that is common for the classes can be in the abstract class.

An interface is generally used to specify an ability for classes, where the classes doesn't have to be very similar.

可以这么理解:基类是爹,接口是能力。爹只能有一个,而且他决定了你是什么,但能力可以有多个。

应该考虑使用抽象基类的场景:

  • 逻辑上是同一类的东西(is a...);
  • 有需要实现的公共方法或属性;
  • 需要序列化的成员类型(因为接口无法序列化);

阅读:144

为Ubuntu Linux创建Swap分区

前不久在Amazon购买了一台EC2服务器运行WordPress,配置为双核CPU,内存1G。运行了一段时间后,发现mysql经常崩溃。检查mysql的error.log发现,崩溃前最后一条日志是:

160328 16:50:26 InnoDB: Completed initialization of buffer pool
160328 16:50:26 InnoDB: Fatal error: cannot allocate memory for the buffer pool
160328 16:50:26 [ERROR] Plugin 'InnoDB' init function returned error.
160328 16:50:26 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160328 16:50:26 [ERROR] Unknown/unsupported storage engine: InnoDB
160328 16:50:26 [ERROR] Aborting

因为网站访问量比较大,推测可能是系统内存不足导致的。使用下面的命令查看了一下,发现apache已经使用了60%多的内存(总内存为1G)。

$ ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Total (MB): "x/1024; print "Average (MB): "x/((y-1)*1024)}'

Total (MB): 622.996
Average (MB): 14.8332

apache、mysql都是吃内存的大户,1G屋里内存显然不够用了。使用swapon查看交换文件状态:

$ sudo swapon -s

Filename                Type        Size    Used    Priority

OMG,竟然没有。。。那就创建一个。

先创建一个4G的文件:

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4000
4000+0 records in
4000+0 records out
4194304000 bytes (4.2 GB) copied, 5.12 s, 1203 MB/s

然后把它转变为swap文件: 继续阅读为Ubuntu Linux创建Swap分区

阅读:145

Linux常用命令整理(不定期更新)

#查看系统版本
uname -a
cat /etc/issue

#修改系统时区
#先使用tzselect按提示一步步找到对应的时区,比如Asia/Shanghai,然后:
echo "Asia/Shanghai" | sudo tee /etc/timezone
sudo dpkg-reconfigure --frontend noninteractive tzdata

#查看进程侦听的端口
lsof -iTCP -sTCP:LISTEN -n -P

#查看目录大小(h:自动使用最佳可读单位,c:最后显示总大小)
du -hc /path
du -k /path | sort -nr

#查看磁盘使用情况
df -h

#创建空文件
touch filename

继续阅读Linux常用命令整理(不定期更新)

阅读:263

UnityException: Launching iOS project via Xcode failed. Check editor log for details.

每次Xcode升级后,使用Unity的Build & Run发布iOS项目时经常会出现无法自动打开Xcode并编译的问题。Unity的Console错误提示为:UnityException: Launching iOS project via Xcode failed. Check editor log for details.

研究发现,是因为Xcode升级后某个UUID发生了变化,导致Unity的Xcode插件无法正常工作。可使用以下方法修复:

继续阅读UnityException: Launching iOS project via Xcode failed. Check editor log for details.

阅读:494

在搬瓦工(Bandwagonhost)的VPS上搭建Ubuntu VPN Server

关于如何在Ubuntu Server上搭建VPN服务器的文章Google中随便一搜就有很多,但实际配置过程中有几个关键点很容易出错。下文将对这些关键步骤做出重点的说明。本文使用的是Ubuntu Server 14.04.4 LTS 64位版本。(http://blog.droidking.com/)

1、安装pptpd

sudo apt-get update
sudo apt-get install pptpd

2、修改/etc/pptpd.conf

sudo vi /etc/pptpd.conf

在文件结尾添加下面两行,然后保存。

localip 10.10.0.1
remoteip 10.10.0.2-255

注意:localip、remoteip都应该使用Internet的保留IP,比如10.64.0.0-10.127.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255。尤其是localip,切勿填写为服务器的真实外网ip。

3、修改/etc/ppp/pptpd-options

继续阅读在搬瓦工(Bandwagonhost)的VPS上搭建Ubuntu VPN Server

阅读:1007

在Mac OS X上使用海马模拟器调试Unity Android游戏程序

在游戏开发过程中经常需要使用USB连接安卓真机进行调试,每次打包后都要花很长时间等待传输数据和安装。其实如果安装了海马模拟器的话,直接在电脑上就可以实现和真机一样的调试效果了。

启动了海马模拟器后,在Unity中直接使用Build & Run,或者导出Android Project然后使用Eclipse编译、运行,都会提示没有找到设备。怎么解决这个问题呢?很简单,只要打开终端,然后输入:

$ adb connect 192.168.56.101
$ adb shell

继续阅读在Mac OS X上使用海马模拟器调试Unity Android游戏程序

阅读:142

Unity的C#编译器的一个BUG:Object Initializer错误

假设有如下代码:

using System;
 
class A
{
 public int i = 1;
 public int j = 2;
}
public class Program
{ 
 public static void Main()
 {
 A a = new A {i = 0, j = 0};
 Console.WriteLine("a.i = {0}, a.j = {1}", a.i, a.j);
 }
}


继续阅读Unity的C#编译器的一个BUG:Object Initializer错误

阅读:20