Things you should do immediately after you install Unbuntu

前天晚上为了在我那破旧的Y450上装Windows 10和Ubuntu 14.04的双系统,折腾了两天。最后成功把Windows 10系统给装没了。总结原因主要是有两点,一是没有搞清楚如何在双硬盘(我的主硬盘是128G的SSD,光驱位置放的是原来320G的HDD)条件下给两个盘装两个系统,始终纠结于为何SSD上的启动器找不到HDD上的Ubuntu;二是没有搞清楚Ubuntu安装过程中的分区,导致操作失误,导致把整个SSD给格了,Windows 10也因此没了。思来想去,考虑到Y450的硬件老化问题,以及无意再去搞破解、授权之类的乱七八糟的东西,所以下定决心使用Ubuntu。

Inside the C++ Object Model

经常遇到有关C++的奇怪问题,而且常常不是什么难题,但是就是觉得一团糟。偶然接触到C++对象模型的概念,挖掘出一本经典的书籍Inside the C++ Object Model,虽然年代久远,书中也有多处明显错误,但瑕不掩瑜,仔细品读,还是有茅塞顿开的感觉。参考shifan的总结,我将部分关键的图片罗列出来,以便以后查阅。

Spring Struts Hibernate

最近遇到一个比较棘手的有关Web服务器的性能问题,概括起来就是大规模并发数据库异步查询请求的高效性问题。由于项目时间有限,所以采取缓存查询结果的方式提高响应速度,但是仍然不能解决首次查询所带来的时间消耗。倘若某个耗时查询正在执行中,还存在新的相同请求该如何处理的问题。重复造轮子并不是很好的解决办法,看看Java中是如何解决这些问题的,这里以流行的Spring Struts Hibernate(SSH)为例。

Scalable Event Multiplexing

事件多路复用

去年因为搞MindNetwork项目接触了Sigma.js,进而又接触了Node.js,当时对Node.js印象比较深刻的一点是它的事件驱动/非阻塞IO的特性,由于是首次接触到这么底层的描述,以为事件驱动是Node.js的一大发明,还以为所谓的事件循环就是简单的用一个端口连接代替多个端口连接。后来在实习面试过程中,得知所谓的事件驱动并不是框架层面的事,而是操作系统层面的事,Node.js只不过利用了这一特点。后来崔老师又在微信圈里分享了一篇技术分享文档【服务器并发,“事件驱动”的本质】,勾起了我对服务器端并发深层次技术的好奇。那篇微信分享有些地方翻译不是很通顺,所以我又在Google上搜了一些文档,基本上对如何提高服务器端并发有了深层次的理解。

Mind Challenges

Mind Challenges

These challenges are copied from a book Learn More, Study Less written by Scott Young. Four challenges(2,6,7,10) are shown details because of their difficulties in practicing by myself. I will cover the rest challenges first.

1. Increase reading speed and comprehension.

  • Buy or find one book for practice reading.
  • Commit for at least 3 weeks to practice for 15 minutes a day.
  • User finger as a pointer on all written material on paper.
  • Practice active reading once a week.

What should I do when I am in trouble?

  • Question yourself. Ask more questions smartly, professionally and simply. Ask yourself first.
  • Search by yourself. Search on Intelnet, in libraries and books. Find the best existing solution to your question. Sometimes, maybe asking for a professor directly is the best solution, especially when you are in an urgent situation. If there is no one proper solution, work out one all by yourself. And sometimes, a few researches are needed.
  • Solve by yourself. Just do it when you finally get a solution. When you meet new troubles, go to step one.

The best way is to be prepared before the bad things occurs. Asking questions, searching and researching beforehand are never worthless.
Never give up untill the last second.

VPS+OpenVPN搭建VPN服务器

#安装OpenVPN最新版

1
2
3
yum install rpm-build openssl-devel lzo-devel pam-devel gcc
wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.6.tar.gz
rpmbuild -tb openvpn-xxx.xxx.tar.gz

在rpmbuild/RPMS目录下(或者子目录下)找到openvpn-x.x.x.-xxx.rpm

1
rpm -ivh rpmbuild/RPMS/XXX/openvpn-x.x.x-xxx.rpm

Java字符编码与Unicode字符集

昨天某人问我Java中如下代码的输出结果为什么不一样(”A”为1,”一”为2)?

1
System.out.println("A".getBytes().length+"\t"+"一".getBytes().length);
1	2

咋一看,好像是不对劲,Java中的字符不都是Unicode编码(16bit,2字节)的吗?怎么英文字母只占1字节呢?于是立马查看《Java编程思想(Thinking in Java)第四版》,关于常用类型的基本信息表(见“第二章-一切都是对象”,“2.2.2-特例:基本类型”,第23页)里赫然写着char的大小为16bit的Unicode。于是断定问题出在getBytes函数上。