虽然Ubuntu 11.04发布的时间还有点早,不过作为一个Ubuntu的Fans,还是怀着期待的心情。于是,我在我的Blog上放了一个Ubuntu 11.04发布的倒计时器(见右边)
如果你也有兴趣,可以参考wowubuntu放出的代码,有大图标和小图标版本,还有迷你型和文字型,可以直接嵌入到你的blog或者BBS中。 由此传送到Wow! Ubuntu
君看一叶舟,出没风波里
虽然Ubuntu 11.04发布的时间还有点早,不过作为一个Ubuntu的Fans,还是怀着期待的心情。于是,我在我的Blog上放了一个Ubuntu 11.04发布的倒计时器(见右边)
如果你也有兴趣,可以参考wowubuntu放出的代码,有大图标和小图标版本,还有迷你型和文字型,可以直接嵌入到你的blog或者BBS中。 由此传送到Wow! Ubuntu
掩饰不住内心的激动,哥还是做出了一个很艰难的决定,决定把这个不错的PushMail服务端跟大家分享一下。yuchberry,是一个国人的程序员开发的用于黑莓的PushMail服务端程序。它的好处不言而喻:开源、免费、而且发送、接受的邮件不带广告。 yuchberry的官网地址:http://code.google.com/p/yuchberry/
在接触到yuchberry之前,我用过SmartMail,和ShangMail(尚邮),都是一些比较有名的第三方PushMail软件,不过用过后还是有不尽人意的地方。SmartMail的服务器端轮询时间太长,好像最短只能设为30分钟,这样实时性大打折扣。ShangMail,比较方便,可以绑定多个邮箱,不过比较讨厌的是,免费版的所有邮件,都会加上广告尾巴。而且使用免费版,我发现有时候PushMail的速度会很慢,估计是用户太多的问题。
其实上面的一些缺点,还不是关键问题,最关键最关键的是:使用第三方的PushMail服务,会需要你向第三方提供你的邮箱密码,这样,服务端程序才能够登录你的邮箱,去检索是否有新邮件。这也是我最担心的一点,毕竟密码都被第三方知道了,邮箱的安全性确实比较难保障,尤其这些第三方提供商,又是在国内……
既然把邮箱密码提供给第三方,整天惶惶不可终日,不如自己来作那个第三方。yuchberry,就是这样的一个解决方案,让你也来过足一翻自己DIY搭建PushMail服务端的瘾。yuchberry的代码是用java实现的,虽然我并不是搞java的,不过配置一下服务端还是能搞定的。并且,用java的好处,是java的程序都是以字节代码的形式,在java虚拟机中运行,这也成为跨平台的一个有利条件。yuchberry的官方提供的批处理文件,是运行在windows下的,不过这也不麻烦,有Linux服务器的同学,可以直接用shell脚本来启动服务端。前提是你的服务器必须安装JRE环境,不会的同学,可以参考我刚刚发的这篇文章:Ubuntu中安装JRE
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的一个忠实粉丝了。不知道为啥,最近打开我的Blog,总是发觉速度很慢。开始,我一直认为是因为我在页面嵌入了百度广告,导致页面加载变慢,其实也不排除有这样的因素。后来发现每次打开我的blog的时候,都会在一个地方卡住一下,而且Firefox下面的状态栏,会显示正在等待superfish.com 。奇怪了,难道是我的页面被插入了脚本木马?也不像!后来从google搜索了一下这个怪异的superfish.com,发现有问题的并不只我一个。原来这是IE Tab插件捣的鬼,貌似这插件是superfish赞助的。IE Tab默认会把一个支持价格比较的功能打开,这个功能,就会去访问superfish.com。 了解了大概,二话不说,把这功能关掉即可。 具体的介绍,可以参考我在google上搜索出来的一同学的解决方法:由此传送过去
最近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吸了主人的汗,受潮了。键盘上所有的按键都不灵了,要不就是按键乱窜的情况。
.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上的方法。有兴趣的同学请移步过去看看。
修改表情传送门: https://xiaozhou.net/go/wange_smile 修改字数统计传送门:https://xiaozhou.net/go/wange_comment
中午用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的更新脚步也放慢了,大家见谅。
其实,哥写代码的时候,并不孤单。我可以一边到虾米上听着音乐,一边写代码,自然感觉轻松不少。虾米还算挺不错的,以前常去豆瓣电台,不过音乐都是很随机的,虾米上还可以自己搜索自己喜欢的歌来听,而且音乐的品质很赞。代码写累的时候,塞上入耳式耳机,听一下音乐,感觉整个世界都清净了。听着阿哲的经典老歌,仿佛又回到了从前……
由于最近比较忙,突然发现想做的事情很多,但是又感觉力不从心,看来我应该放慢点脚步,安静一下了。
牢骚完毕……
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上有一篇专门介绍此软件使用方法的文章,这里就不再累述了。有兴趣的同学可以过去看看:点击此传送门