242014
 

Windows从很早开始就支持了高分辨率(High DPI)的显示屏,在显示设置中使用高分辨率来使屏幕上的字体和图像变大,但不会模糊。效果如下(图片来自网络),和Retine版本的Macbook Pro上的效果类似:

但不幸的是,High DPI的功能需要应用程序支持。也就是说,如果应用程序不支持High DPI,即使在Windows中设置了,会造成应用程序的界面变得模糊,字体很虚,不容易识别。但很多开发商都不重视High DPI这个功能,以至于它到现在都没法正常地使用。Chrome也是一直到了37.x (目前的Beta)才支持High DPI。

设置方法如下:

  • 打开注册表,找到目录:HKEY_CURRENT_USER\Software\Google\Chrome\
  • 如果其下没有Profile这个键,就创建一个新的,方法是右键单击“Chrome”键,“新建”->“键”。
  • 在Profile中新建一个名为“high-dpi-support”的“DWORD值”,把它的值设为“1”。

然后重启Chrome就可以了。如果你觉得有什么问题,想把High DPI的功能关闭,直接把上述high-dpi-support的值改成“0”即可。

182014
 

最近在尝试写一点GAE(Google App Engine)的应用,以丰富自己的业余生活,同时也提升一下“全栈”的能力。在大公司的一个缺点就是每个人都只能接触到项目的一部分,在本职工作上的能力固然很强,但“从无到有”的开发能力则偏弱。这对于拓宽自身能力和视野都是有阻碍的。

先说一下这是个什么样的应用:
GAE是一个性价比很高的平台,运行一些小程序几乎免费,而且有免费的流量和存储,对于新手入门网络开发再好不过了。相比之下,AWS和Azure都显得诚意不足,AWS给提供了一年的免费额度(每张信用卡),Azure则是每天免费一小时。尽管在GAE上面开发没那么自由,它不是完整的机器,只支持4种语言,但对于新手来说,这或许算是一个优点。

我的计划是做一个短链接工具,类似t.cn、bit.ly。市面上这类工具有很多,为什么还要再做一个呢?我一直都在使用短链接功能(如mv2.it/gtranslate)。之前用了一个工具:YOURLS,它是一个很强大的工具,并且开源,可以随便部署在自己的服务器上。和公开的短链接工具不同,自己部署的实例可以选择好看的链接,比如上述的“gtranslate”,而不是几个随机字符。使用YOURLS的问题是,在AWS上升级一下太麻烦了,要SSH到主机上,下载新版文件,再复制到Apache的路径下。而且我对PHP也不熟悉(后面会详述),如果想添加一些功能会比较痛苦。但细想一下,短链接工具的内部逻辑其实很简单,它连关系型数据库都不用,一个哈希表就可以存下所有数据了。而且界面也简单,开发起来很方便。于是就有了自己做一个的动力。

接下来是开发环境:
在语言上我选择了Go。一开始我试过Java,因为Java是在GAE的4种语言中我最熟悉的一种,上手没有阻碍。但是后来发现,实现同样的功能,Go只需要大概十分之一的代码,而且Go提供了丰富的标准库,不需要去找第三方的,尤其是文档不足的,开源库。然后我就把Java的代码全删除了,完全用Go编写。之所以不考虑Python和PHP,是因为它们是弱类型且不用编译的。我在Javascript中已经吃够了苦头,虽然解释型语言有着各种各样的自由,但我依然需要一个编译器来帮我做一些粗略的检查,那些不必要的错别字、大小写问题可以很快被找出来,也省去了很多测试用例。如果要我新学一问语言,我肯定会考虑可编译的强类型语言,于是我就选了Go。

至于IDE,暂时这还是Go的弱项。由于是一门新语言,附属设施的建设还不到位。Eclipse的官方库还没有包含Go的编辑器,有几个开源工具正在开发中(进度不详);各类文本编辑器都有对Go的语法支持,但对标准库的自动补全暂时还都没有。不过正因为它有编译器,自动补全的必要性也不是那么强了。于是我用Sublime Text写了一会,感觉还可以,除了免费版经常跳出来版权提示之外,没什么不满意的地方。但后来,我还是把开发环境移到了Cloud 9上面去。

为什么选择Cloud 9?
Cloud 9是一个在线开发环境,大致相当于一个EC2的主机,提供了网页版的文本编辑器和命令行(Shell)权限,并且可以和Github无缝整合。这比起自己找一台机器,搭建一个Git开发环境要方便多了。关键一点,Cloud 9是免费的,比起自己搭建的机器肯定是便宜的,至少省电费。Cloud 9的优势是可以绑定Github帐号,直接使用“git push”就可以同步代码,密码都省了;并且提供了方便的预览(Preview)功能,写Markdown和网页都很方便。

如何在Cloud 9上部署GAE?
Cloud 9的基础用法就不介绍了,通过UI操作很直观,不需要看帮助就可以上手。要把工程部署到GAE上去,你需要一个GAE的SDK。以Go SDK为例:

先把SDK下载下来:
wget https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.7.zip

解压到.go_appengine目录,使用“.”开头可以让它不在Cloud 9的树型目录中显示出来:
unzip go_appengine_sdk_linux_amd64-1.9.7.zip
mv go_appengine .go_appengine

在~/.bashrc中设置环境变量:
export GOROOT=/home/ubuntu/workspace/.go_appengine
export PATH=$PATH:$GOROOT
export GOPATH=/home/ubuntu/workspace

其中workspace的实际路径可以通过echo ${PWD}找到。

接下来就可以使用goapp部署了。假设当前路径是工程的根路径,直接运行goapp deploy即可。

Cloud 9有哪些不足之处?
目前唯一发现的不足之处是,Cloud 9的免费版是公开的,也就是说你的workspace是公开的,任何人可以查看。这样就不可以使用.gitignore来忽略一些敏感文件(比如包含密码的文件)了。在设计代码的时候需要格外小心。

暂时没有发现其它问题,发现了再补。

102014
 

什么是Worker MPM?
MPM (多处理模块,Multi-Processing Modules)是Apache中的一种特殊模块,它被用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。在Apache的运行环境中,只能使用一种MPM,即不能混用,而MPM又和处理请求直接相关,于是MPM的效率对网站的响应速度有很大的影响。

Linux/Unit上的Apache可以使用三种MPM:Prefork、Worker和Event。其中Event在2.4之后才稳定下来,而2.4还没什么人用,这里暂时不作讨论。Prework和Worker MPM的主要区别是:

  1. Prefork MPM使用多个子进程,每个子进程只用一个线程,一次处理一个请求。
  2. Worker MPM使用多个子进程,每个子进程创建多个线程,可以同时处理多个请求。

对于单独一个请求来说,Prefork和Worker的性能没有太大差异,但如果并发请求数量很多,Prefork会产生出更多的进程,从而消耗更多的内存。对于AWS上的小型机来说,内存是影响网站性能的关键,所以在AWS上推荐使用Worker MPM。

如何开启Worker MPM?
Apache中默认使用的是Prefork,因为它是线程安全的(只用一个线程)。要切换到Worker MPM需要进行一些额外的设置。

首先检查一下Worker MPM有没有被安装上:
/usr/sbin/httpd.worker -l

在输出当中能看到“worker.c”字样的话,就说明可以使用Worker MPM。大多数情况都是有的。

接下来打开/etc/sysconfig/httpd,把HTTPD=/usr/sbin/httpd.worker之前的#号删掉,重启Apache就可以了。

如何配置Worker MPM?
Worker MPM的配置在Apache的配置文件中,打开/etc/httpd/conf/httpd.conf,可以找到类似下面的内容:

这是我使用的配置,可以根据实际情况进行修改,其中:

  1. StartServers: 初始状态下Worker进程的数量
  2. MaxClients: 最大可以接受的并发连接的数量
  3. MinSpareThreads: Worker MPM最少的所有子线程数量
  4. MaxSpareThreads: Worker MPM最多的所有子线程数量
  5. ThreadsPerChild: 每个Worker进程所包含的子线程数量
  6. MaxRequestsPerChild: 每个Worker进程可以处理多少个请求

详细解释可以参考Apache官方文档

什么是mod_fcgid?
Apache默认使用mod_php来解析PHP代码。mod_php的弱点是它不是线程安全的。这在Prefork中不是问题(因为它没有多线程),但是一旦使用了Worker,mod_php就不能再用了,Apache会经常崩溃。解决方案是使用mod_fcgid来解析PHP。

如何安装和启用mod_fcgid?
首先,运行命令:yum install php php-cli mod_fastcgi

然后打开/etc/httpd/conf.d/php.conf,把其中的内容替换为:

收尾
最后,重启一下Apache就可以了:

sudo service httpd restart

以上的所有命令都适用于(基于Redhat的)Amazon AMI,如果你使用的是其它的Linux分支(比如Ubuntu),可能需要适当地修改一些指令,比如把yum install改成apt-get。

072014
 

在64位的Windows中,你可能会发现带有*32后缀的进程名,尤其是chrome.exe *32(如下图),这代表什么意思呢?

64位的Windows中包含了32位应用程序的运行环境,可以让64位和32位的应用程序同时运行。在任务管理器中为了以示区分,32位的应用程序后面会加上“*32“的字样。“*32“只是表示这个应用程序是32位的,并不表示它有32个同时在运行,所以看到上图不要惊慌,Chrome的进程没有那么多。目前Chrome在Windows上还没有64位版本,所以所有的Chrome进程都会有“*32“。

不仅是Chrome,其它的应用程序,只要是32位的都会标上“*32“,反之64位的则不会。

至于为什么会有一排的Chrome进程,是因为Chrome的标签管理机制。简单来说,Chrome支持多标签(Tab),每个标签都是一个单独的进程,另外再加上一些管理进程和后台下载进程,总数就看上去很多了。这样做的好处是,一个标签崩溃了之后,其它的标签和Chrome本身不受影响,使Chrome运行得更稳定。当然坏处是开了很多进程,很占系统资源。如果想使Chrome运行得快一点,可以关闭几个标签,特别是那些界面很复杂,有动画或者影片的标签。

扩展阅读:64位和32位有什么区别?

072014
 

本页面短链接:mv2.it/gtranslate

谷歌翻译(Google Translate)是一个很常用的工具,特别是工作中经常用到外语的时候。但是由于各种各样的原因,Google Translate暂时处于不可用的状态。