JRE是Java的Runtime Environment,就像.NET的Framework一样,是Java程序运行的必要环境。在Ubuntu中,安装JRE的方法有很多,可以去官网下载.deb安装包,用dpkg的方式安装。这里要介绍一种比较简单的方法,就是适用apt-get来安装。貌似Ubuntu中默认的源是没有JRE的,需要我们手动改一下/etc/apt/sources.list,加入下面的一行地址: deb http://archive.canonical.com/ubuntu lucid partner 保存后,先用sudo apt-get update,更新一下源,这样,就会提示你,是否要更新JRE相关的包了。一路yes,回车后,JRE的安装就完成了。 最后,可以验证一下,在命令提示符处,输入java -version,会显示JRE的版本号等相关信息,表示安装完成。
Firefox打开网页缓慢的问题
我一直比较喜欢用Firefox,也算是Firefox的一个忠实粉丝了。不知道为啥,最近打开我的Blog,总是发觉速度很慢。开始,我一直认为是因为我在页面嵌入了百度广告,导致页面加载变慢,其实也不排除有这样的因素。后来发现每次打开我的blog的时候,都会在一个地方卡住一下,而且Firefox下面的状态栏,会显示正在等待superfish.com 。奇怪了,难道是我的页面被插入了脚本木马?也不像!后来从google搜索了一下这个怪异的superfish.com,发现有问题的并不只我一个。原来这是IE Tab插件捣的鬼,貌似这插件是superfish赞助的。IE Tab默认会把一个支持价格比较的功能打开,这个功能,就会去访问superfish.com。 了解了大概,二话不说,把这功能关掉即可。 具体的介绍,可以参考我在google上搜索出来的一同学的解决方法:由此传送过去
从Fremont到Dallas
最近Linode的Fremont机房老是抽风,不是断电,就是VPS被强制重启。痛定思痛,哥最终做出了一个很艰难的决定:把VPS从Fremont搬到Dallas。或许是Fremont名气太大,导致国内的站长都一窝蜂的涌向此机房,不过哥最终需要的不是名气,一切都是浮云,哥需要的是稳定。所以,在周五晚上,喝过几两酒后,哥很镇定的做出了此决定,并联系了Linode的客服,将VPS从Fremont搬迁到Dallas.
整个搬迁的过程,可谓非常顺利,也非常便捷,都是自动化的。在客服操作之后,在偶的Linode面板,出现了如下的操作界面:
Linode会给你缓冲的时间,让你提前对你的VPS做好备份,备份好后,手动关闭你的VPS,然后点击搬迁按钮。
搬迁过程也是非常自动化的,系统会自动把你的VPS镜像,从Fremont机房,同步到Dallas机房。当然,搬迁后,VPS的IP会产生变化,需要重新解析你的域名。整个搬迁过程,花了大概45分钟左右,就OK了。然后手动重新启动VPS即可。待域名解析生效后,blog就可以访问了。值得令人欣慰的是,数据是无缝迁移的,迁移后,并不需要充装系统,一切照旧。
希望VPS在Dallas能长久安定下去……
偶把自己的BB9000给拆了
杯具发生在周五,公司组织出去玩,其间打了乒乓球,又打了网球,把BB9000一直放在裤兜里。估计是因为运动较为猛烈,出汗了,BB9000吸了主人的汗,受潮了。键盘上所有的按键都不灵了,要不就是按键乱窜的情况。
小试Emit
.NET中的Emit,其实是个很强大的东东,它允许你在你的程序运行时,动态的生成代码。看到这里,也许大家会联想到Reflection,的确,Reflection也是我们平时用得比较多的一种技术,通过Reflection,我们能通过程序集中的元数据,动态的生成目标程序集的Instance,并执行它。而Emit的功能,恰恰和Reflection遥相呼应,前者允许我们动态的生成代码,后者允许我们动态的“查看”和运行代码。Emit和Reflection合在一起,简直就是双剑合璧,简直就是幸福的一家……难怪,微软也很邪恶的把Emit放在了System.Reflection.Emit。
其实哥平时的开发中,用得比较多的,还是Reflection(反射)了,不过早已久仰Emit的大名,又没闲暇时间来窥探一把,最近总算比较闲了,决心研究研究强大的Emit。
话不多说,代码是最有力的说明,先献上一个通过Emit动态创建并生成程序集的例子:
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace Emit_Learn
{
class Program
{
static void Main(string[] args)
{
var name = new AssemblyName("HelloEmit");
var assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(name,
AssemblyBuilderAccess.RunAndSave); //创建程序集
var modelBuilder = assemblyBuilder.DefineDynamicModule("HelloEmit", "HelloEmit.dll"); //创建模块
var typeBuilder = modelBuilder.DefineType("HelloEmit"); //定义类型
var methodBuilder = typeBuilder.DefineMethod("Execute", MethodAttributes.Public, null, null); //创建MethodBuilder
var il = methodBuilder.GetILGenerator(); //获取ILGenerator,用于生成方法的IL
il.Emit(OpCodes.Ldstr, "Hello, Emit");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
typeBuilder.CreateType();
assemblyBuilder.Save("HelloEmit.dll"); //保存动态生成的程序集到磁盘文件
}
}
}
在IDE中输入以上代码,F5运行,你会发现,在你的程序的Debug目录,会生成一个HelloEmit.dll。没错,这就是我们的程序动态生成的程序集,并且它是可执行的。以上的代码,动态生成的程序集,包含一个叫HelloEmit的类,类中有一个public属性的Execute方法。方法中调用Console输出字符串:Hello,Emit
这个类,等价于如下的C#代码:
internal class HelloEmit
{
// Methods
public void Execute()
{
Console.WriteLine("Hello, Emit");
}
}
我们也可以使用.NET Reflector一类的工具,打开生成的Dll查看,顺便验证一下。
Emit适用的场景:适用于对业务灵活性要求很高的系统,可以在运行时动态更改业务逻辑,并动态生成代码。
Blog评论效果小改
工作上的事总算告一段落,于是又开始折腾自己的blog。这次在评论功能中加入了表情效果,和一个动态的字数统计效果。
表情以及字数统计的具体实现,参考了万戈的blog上的方法。有兴趣的同学请移步过去看看。
修改表情传送门: https://xiaozhou.net/go/wange_smile 修改字数统计传送门:https://xiaozhou.net/go/wange_comment
Fremont机房断电导致blog无法访问
中午用iPhone上网的时候,发现blog不能打开,估计是VPS出了问题。最先开始怀疑的是VPS的IP被qiang,不过想想也不大可能。后来经验证,并非某墙所为。在google上搜索了一下最新的消息,原来是Fremont机房出现断电故障。登陆Linode后台,准备关闭和重启VPS,发现问题依旧,无果。后来干脆来到Linode的Support页面,一个大大的通知挂在上面:
原来网上的消息是真的。后来得知,这次断电的故障,不光影响到Linode一家的VPS,BuyVM的VPS也受了影响,因为他们的服务器也在Fremont机房。既然Linode出了这样的通知,看来他们也挺负责的,至少正在积极的解决问题中。除此之外,俺们只有默默的等待…… 从Linode的status页面,可以详细的查询到他们对于这次断电时间的处理情况:
从发现问题,到问题解决,大概花了6小时左右,事后,从我的监控宝告警邮件,也证实了这一点。恢复后,VPS顺利的启动了,blog再次恢复访问…… 尽管这次掉电事件让俺有点不爽,不过就着Linode认真、负责、及时的处理,确实值得表扬一下。
来冒个泡
嗯,很久没来这里写点什么了。原因是因为最近工作上比较忙,需要重构一个工程的某个模块,实际上改动比较大,基本上算是重写了。并且,这样的工作会持续到12月底左右,囧rz。所以,本Blog的更新脚步也放慢了,大家见谅。
其实,哥写代码的时候,并不孤单。我可以一边到虾米上听着音乐,一边写代码,自然感觉轻松不少。虾米还算挺不错的,以前常去豆瓣电台,不过音乐都是很随机的,虾米上还可以自己搜索自己喜欢的歌来听,而且音乐的品质很赞。代码写累的时候,塞上入耳式耳机,听一下音乐,感觉整个世界都清净了。听着阿哲的经典老歌,仿佛又回到了从前……
由于最近比较忙,突然发现想做的事情很多,但是又感觉力不从心,看来我应该放慢点脚步,安静一下了。
牢骚完毕……
使用SFTP替代FTP传输文件
FTP(文件传输协议)是一种使用非常广泛的在网络中传输文件的方式,这种传输文件的方式,大家再熟悉不过了。但是,它也同样存在被网络窃听的危险,因为它也是以明文传送用户认证信息。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure FTP)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。 若要开启 SFTP功能,非常的简单,下面以偶的VPS为例,系统为Ubuntu。修改sshd_config文件的下列内容: Subsystem sftp /usr/lib/openssh/sftp-server 在配置文件中找到类似的一行,去掉行首的“#”,然后重新启动SSH服务器,即可。这样在进行SSH连接时就可以同时使用SFTP传输文件。 关于客户端,在这里推荐两个: 第一个是我最常用的FileZilla,一款开源的FTP客户端软件,并且支持SFTP方式,很好用,而且经常更新。 第二个,是一个叫WinSCP,也是图形化的操作界面,配置简单。并且那个界面,实在像极了Total Commander,经常用TC的同学,一定上手很快。vpser.net上有一篇专门介绍此软件使用方法的文章,这里就不再累述了。有兴趣的同学可以过去看看:点击此传送门
关于SSH的小问题
话说前两天,为了安装SendMail服务,我把之前的SSH设成了25端口。为了给SendMail让路,把25端口空出来,我又不得不把SSH的端口从25改成了2255(这数字是多么对称的重复,呵呵~)。本想到这事儿就算完了,结果有意思的事情更多了。用SSH上网,发现经常网页开着开着就没响应了,查看一下Tunnelier日志,提示如下: Client connection closed before completion of protocol. 一看这提示,貌似是协议交互还没完完成,客户端的连接就被强行掐断了,囧rz… 刚开始以为是VPS防火墙在作怪,检查了一下规则,没有半点问题。百思不得其解,又把SSH的端口,从2255改成了9999,结果还是不行,郁闷了。又改成其他端口(嘘,保密),谁知问题圆满解决了,相当的怪异。于是在google上搜了一下2255和9999端口,得到类似如下的信息: TCP 2255=Illusion Mailer TCP 9999=Prayer Trojan 原来9999是个常用的木马用的端口,另外又google了一下Illusion Mailer,貌似也是个比较有名的backdoor程序。难道这些端口作为默认的木马端口,要被封杀掉?汗…… 看来以后改SSH端口,要避开这些端口号。
VPS安装SendMail小记
在VPS之前,用的是付费的PHP空间,所以我的WordPress上的Mail To Commenter插件可以正常使用。后来迁移到VPS,也没有管这功能是否正常,在zww同学的提醒下,才知道原来这类通过邮件发送回复提醒的插件,本身不带smtp服务器,需要主机自带邮件发送功能才可以。看来需要给VPS装一个SendMail才行。
SendMail是Linux中比较常见的邮件发送组件之一,这类的组件还有很多。此文主要记录一下SendMail的安装步骤。VPS的系统是Ubuntu,所以安装异常简单:
apt-get install sendmail
安装完后,如果不出意外的话,SendMail就能自动进行默认配置,并启动服务了。
检验你的SendMail服务是否启动,可以用类似命令查看:
netstat -anp|grep sendmail
不过我在安装的时候,遇到了一些小插曲。因为当初了为了安全起见,把SSH默认的端口号从22改成了25,而SendMail的SMTP协议,刚好需要25这个端口,导致安装后服务无法启动。还有个地方需要注意,就是系统中那个默认的mail用户组和mail用户,必须保留。当初以为无用,就删掉了,结果在服务启动的时候报错,找不到用户帐户。后来添加了一个叫mail的用户组,以及一个叫mail的account,服务就能正常启动了。
接下来是PHP中的配置,需要在php.ini中打开对邮件的支持。用vim或者其他编辑器,编辑php.ini,找到如下类似的配置行,改成这样:sendmail_path = /usr/sbin/sendmail -i -t ,去掉前面的注释,并把路径填写正确即可。然后就可以通过php的mail函数来验证SeneMail是否能正常调用,还有个方法,大多的探针程序,都支持检验邮件功能,也可以试试。