在 windows 下建立unix shell 环境

使用 Cygwin 建立 SSH 通道:桌面 Unix 仿真程序

链接:http://www.open.collab.net/scdocs/ddSSHGuideCygwin.html.zh-cn

Cygwin 是 windows 下的 linux shell 仿真环境。为什么要在 windows 上用 Cygwin 建立仿真环境呢?一个原因是,远程登陆windows进行文件操作太麻烦了。就拿最简单的编辑文本文件来说,使用远程桌面对网络要求高,在广域网环境下比较困难。并且在 windows xp 下 只允许一个人登陆;而windows下没有像 vi 那样的命令行编辑器。于是telnet,ssh等命令行工具不能派上用场。

当然,如果只是简单的应用,还是用 windows远程登陆,telnet 比较方便。

 

发表在 未分类 | 留下评论

apache 源码剖析之 content handlers

1  handle 概述

2 hanle 处理流程

ap_invoke_handler(r);

1 handle 数据结构

2 责任函数

AP_IMPLEMENT_HOOK_RUN_FIRST(int, handler, (request_rec *r),
(r), DECLINED)

AP_IMPLEMENT_HOOK_RUN_FIRST(int, quick_handler, (request_rec *r, int lookup),
(r, lookup), DECLINED)

3  示例:  proxy_handle

ap_hook_handler(proxy_handler, NULL, NULL, APR_HOOK_FIRST);

ap_run_handle

proxy_detect(request_rec *r)

proxy_run_scheme_handler(r, worker, conf, url, NULL, 0);

参考资料:

http://httpd.apache.org/docs/current/en/handler.html

发表在 开源,标准 | 留下评论

网站淘金之路之一--域名+虚拟主机,百元投资建个全功能独立博客

100块钱买一个空间,搭个便宜的域名。就可以搭建一个自己的博客空间。不用担心删帖,屏蔽的问题。还能获得广告费收益。何乐而不为?

就像本博客一样。这个像模像样的小窝只花了一百块钱。服务提供商是衡天主机

1、wordpress 的兴起。

wordpress 是一个个人博客软件包。可以让不懂任何技术的人五分钟之内建好自己的博客。wordpress 在2008年被 infoworld 评为 最有价值开源软件(2008 Best of Open Source Awards) 之后,一路走火。于是逐渐有了专门针对wordpress 的网站服务器提供商。由于博客对服务器的性能要求比较低,服务器提供商乐于提供这样的服务。于是,过于动辄上千元一年的博客服务器租用服务,现在降到了百元左右。

2、服务器空间。

服务器空间,主要考虑空间大小、流量、访问速度、稳定性等几个因素。一般的,刚开始不需要太大的空间。几百兆就够了。流量则因人而异。服务商会告诉你他们的服务器提供多大的空间每月多大的流量。你需要时时关注流量是否用完。

空间和流量是可以量化的,而稳定性和速度就不容易判断了。需要多多打听,多多积累经验。一般的,主机供应商越大,稳定性越好。当然,价格也就越贵。

3、域名:
域名价格不等,有的服务商会送域名。一般的一个新的域名国内100块钱左右,国外十几美元。不过国外的域名终究要便宜些的。比如 通过 google 注册 godaddy 通常也就 6、7美元。而有时更会有一些给力的活动--比如这几天 godaddy搞活动,输入优惠码,一个域名立刻变成 1美元。

godaddy  domain .just $1

godaddy 促销的一美元域名

 

 

 

 

我现在用的这个域名,花了 0.99美元。

4、用 google adsense 创造收益

其它:

1、域名解析:

GWF有时会把国外的域名解析服务器(Domain Name Server)屏蔽。导致网站无法访问。另外,国外域名解析也会比国内的慢一些。所以,申请域名后,把 dsn解析放在国内的服务器比较合适。国内有很多这种免费的服务,我使用的是 dnspod.

2 关于IP。

其实刚建站是不需要关注独立IP这个问题的。只不过在这里发发感慨。在国内,一个独立IP是很贵的。每个月 5000RMB,而且只允许公司或组织申请。(个人是不能申请的。)而在国外,独立IP是很便宜的。比如,在GODADDY, 一个月3美元,折合人民币20块钱。

有些感慨天朝的物价水平了~~

发表在 未分类 | 标签为 , , , | 留下评论

面试题目解析--TCP的状态字。

TCP/IP 协议中,一端发起第一次握手时,其连接状态?
来源:百度搜索引擎研发。
问题的提出:这道题目看起来考得比较偏。一般地,TCP主要考察三次握手描述( SYN, SYN+ACK,ACK ),差错控制特性,流量控制特性。对状态字的考察,一般比较少。
一个主要的原因是:状态字太多了,不好记。另一个主要的原因是,平时用得少。
那百度为什么会考察这个知识呢?当然是因为他们在工作中时常用到。
实际上,TCP状态字是分析网络性能时经常用到的东东。比如,在发现网络性能比较低时,一个最简单的办法就是使用 netstat 命令。
参考一个典型的应用:

聊聊mod_proxy配置过程

通过apache ab进行系统压力测试时,发现一个很严重的问题

./ab -k -c 15 -n 50000 http://10.20.156.49:2100/member/signin.htm

-k 指定保持keepalive
-c 并发数
-n 请求数

再通过netstat -nat命令看了下tcp状态,发现近2000左右的TIME_WAIT,在停止ab施压后,发现TIME_WAIT连接很快会得到释放

最后通过tcpdump在服务器上,发现了问题,每个请求都是走了新的socket链接,tcp链接快速打开,快速关闭,因此出现了大量了TIME_WAIT状态。

相关资料:

linux服务器上的11种tcp状态

发表在 面试题目解析 | 留下评论

fuck 山西联通!fuck 联通!fuck垄断!!!

自从回太原后。使用火狐上网时,浏览器左上角经常会弹出个广告。“长风向东看,广汽有本田”。需要手动刷新一下才能看到页面。一直都没研究广告从哪里来的。今天真的很烦,查了一下源代码。

<html><head><!–title>… D??  ?? ???  o  30 ?? ?? ? D?? ? D? …</title–></head><script language=JScript><!llErrors(){return true;} window.onerror = killErrors; –></script><frameset rows=*,0><frame src= http://www.ty.sx.cn/wangyi noresize><frame src= http://218.26.132.90/stat/stat.do?u=tytyad10023989$278$278$30$1301674961014$163158391$3051986568 noresize></frameset>< html>

搜索 218.26.132.90,发现了网上一片叫骂声。山西联通这种做法真龌龊。公然进行域名劫持,暴风影音事件比起这样的行为来,又算得了什么!
联通不是个好东西。以前在东软的时候,就听同事说,联通的官僚主义作风很严重。项目款一拖两三年。为了揽项目,部门的领导、售前、市场都是每人两个手机,一部移动的,用于打电话,一部联通的,用于向联通官员展现对联通的热爱。联通吞并网通后,联通业务支撑系统升级的一大半业务都划给了人人嗤之以鼻的联创(现在叫亚信联创)。联通的技术牛人比移动还多。服务质量呢?实时计费喊了三四年还没搞定。把接不通的CDMA扔给了电信。以为3G能挖着钱,结果两年来利润直线下降。倒是能发狠财,一条微博4000块钱。

山西联通如此明目张胆地劫持DNS,把别人的网页嵌入到自己的页面中,直踩法律边线。直接原因是利益的驱使,深层原因是由垄断而生的傲慢。垄断的地位,使得婊子也可以满嘴的民族使命,满腹的创收名目。借助垄断的大棒,婊子也敢立起牌坊。

在百度搜索“天价微博”,你得不到有价值的信息。在QQ签名输入“移动乱收费”,无法成功。 体现的是电信运营商对互联网企业的操控能力,还是两者之间的共同的利益立场?
对比之下,电信运营商权力难以触及,以及没有共同利益体的MSN,google.com,无奈地退出,也就是是必然结局了。

三网整合的大潮已经势不可当。以审查见长的电视,以屏蔽见长的电信运营商业,其触角范围必然伸向互联网。移动的飞信已经和腾讯的QQ短兵相接。三五年后,在垄断的魔杖之下,谁说腾讯不会嫁给移动呢?

相关链接:

奇艺网遭北京联通劫持插广告

发表在 未分类 | 标签为 | 留下评论

debug c++ 之拷备构造函数和赋值符号重载

继续上一节的代码,如果别的同事有如下调用:

我们的代码又崩溃了。

但是,即使我们给拷备构造函数加一个空的实现,像处理赋值函数那样。结果依然出乎意料。

实际使用中,拷备构造函数比赋值符重载用得更用广泛也更隐蔽。比如,临时对象的出没,常常留下拷备构造的脚印。于是,我们常常会看到简单的一行代码神奇地跳出“error!”。

小结:
拷备构造函数和赋值构造函数的区别在于:前者是在未初始化的内存上进行操作,后者是在已初始化的内存上进行操作。默认的情况下,编译器会为赋值函数和拷备构造函数生成相同的代码。当对象持有资源时(内存块,文件句柄等等),这些函数会带来麻烦。我们需要自己来处理这些函数。

发表在 debug c++ | 留下评论

debug c++之 vector or list

为什么 vector::front()的值在 push_back 之后不再正确?
class CMyClass
{
public:
int m_first;
CMyClass(  )
{
m_first = 3;
}

};
int vector_or_List()
{
CMyClass temp;
vector<CMyClass> vecInt;
cout <<  “temp:” <<  temp.m_first << endl;
vecInt.push_back( temp );
const CMyClass& shadow_vec_front= vecInt.front();
cout <<  “shadow_vec_front:” <<  shadow_vec_front.m_first << endl;
vecInt.push_back( temp);
cout <<  “shadow_vec_front:” <<  shadow_vec_front.m_first << endl;

list<CMyClass> listInt;
cout <<  “temp” <<  temp.m_first << endl;
listInt.push_back( temp );
const CMyClass& shadow_list_front = listInt.front();
cout <<  “shadow_list_front:” <<  shadow_list_front.m_first << endl;
listInt.push_back( temp);
cout <<  “shadow_list_front:” <<  shadow_list_front.m_first << endl;
return 0;
}
int main()
{
vector_or_List();
system( “pause” );
return 0;
}

如何改进?

1、vector中存储指针而不是存储变量

2、用 resize 预先分配足够大小的空间

3、多线程环境下,用 list而不用 vector。

扩大地来讲,直接对容器中的对象进行操作,经常是一个比较危险的动作。

发表在 debug c++, 编译*调试*逆向 | 留下评论

debug c++ 之 “多用组合,少用继承”之惑--默认赋值函数带来了麻烦

先有如下代码:

class A
{
public:
A()
{
this->m_byte = (char*)malloc( 1 );
}
~A()
{
free(  this->m_byte );
}
void show_hello() const
{
cout <<  “hello! A object is work!” << endl;
}
private:
char* m_byte;
};

经过测试,这是一段没有问题的代码。同时收到同事的反馈:效果不错!我的工作简单多了!

class B :public A
{
public:
B(const A &a) // B的构造函数
{
}
};

int main()
{
A*  first = new A;
B*  second = new B(*first);
second->show_hello();
delete first;
delete second;
// system( “pause” );
return 0;
}

另一位同事B提出了不同的意见: second->show_hello() 报告: I am A object! 这是多么荒谬的事情!B同事拿来 砖头厚的 < head first design pattern >,引用其中的原话:多用组合,少用继承。(Favor composition over inheritance)。于是他写出了如下代码:

class B
{
public:
B(const A &a) // B的构造函数
{
this->m_a = a;
}
private:
A m_a; // 成员对象
};

问题出现了!

原因:没有声明拷备构造的情况下, A 对象的 m_byte的地址并拷备了两份,并被两次释放。

怎样解决:

在Class A 中增加拷备构造函数:

A& operator =( const A &other)
{
return *this;
}

这个函数看起来什么都没有做。是的,它确实什么都没做。让这并不意味着它没有贡献。它的贡献在于:它让编译器不做什么--声明这个函数后,编译器不再为此类添加默认的 operator = 函数。默认地,c++为为每个类添加四个函数:构造、析构、拷备构造、赋值。

参考资料:

高质量C++/C编程指南(林锐)之九-类的构造函数、析构函数与赋值函数

文章目录:

第一篇:c++导航

1 c++加了什么之一? this 指针

2 c++ 加了什么之二--虚表( virtual table)

3 更加广泛的 const 关键字

第二篇:编译期错误

1、模板参数转为 void?

1、引用( referance  )是个啥玩意儿

2、模板编译的噩梦

第三篇:让人崩溃的运行时错误( c++ run time error )

1、模板参数转为 void*的错误(参考赵工的错误)

2、vector 还是 list

3:啥都不做带来的灾难--赋值与拷备构造?

4:默认的不总是对的--让人崩溃的虚析构函数。

5:临时对象在哪里

如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。(《深度探索C++对象模型》P275)

这里的“reference的生命结束”和“临时对象的生命范畴(scope)结束”有什么区别?感觉说的是一样的。谁能针对这两种情况,举两个例子?

(To ckt1120 :我是感觉他说的后半句不对。查了C++标准,对引用这种情况,并没有他说的那种情况)

 

 

 

发表在 debug c++, 未分类 | 留下评论

OllyDbg 2.01有了更好的源码调试功能

在 OllyDbg 1.x中,查看源码的功能(view->source)的功能是不尽完美。今天发现 OllyDbg 2.x 中已经在这方面有更新了。

查看 od 作者主页 的表述:

Source debugging is here again, a bit incomplete. It supports only Microsoft compilers via dbghelp.dll. New is support for symbol server, stack walking using dbghelp and names of procedure parameters.

新版本中通过dgbhelp.dll改善了对微软编译器的支持。能够连接到 微软的 符号服务器下载函数符号信息,能进行栈信息查看,查找程序的 .pdb 文件,能识别 函数参数名称。

这些功能有点像ida, wdb的签名识别功能。当然,还没有 ida 那么强大,它还不能像ida 那样,为 dll生成函数签名。

看看操作界面吧

odb 源代码调试参数设置
可能有人要问:有源代码的情况下,为啥还要用 od 来调试呢?理由很多。与 visual studio 相比,od 能够支持更加丰富的断点--内存断点(调试内存溢出/内存错误的必杀技),模块 load/unload,线程 start/exit 的断点(大型项目中用得着);对多线程调试有良好的支持--od2.x中能够对线程分别进行暂停/运行的操作。此外,visual studio 对宏/模板代码支持不好。比如,stl的代码,我们跟踪进去后,那些奇怪的 -s,_p会把我们弄得晕头转向。这种场合下,结合汇编代码来分析反倒更容易一些。在多CPU环境下,OD可以指定程序使用哪一个/哪几个CPU。而其它的开发级调试器没有这样的功能。

od2.0确实很好用。暂时日常应用中就不需要再开启 ida 了。
od 2.x 目前还没有流行起来,一个很重要的原因是不支持插件。对于它的专长--病毒分析来说,这是个很大的问题。但对于我们做开发的来说,这不是什么大问题。编写代码时碰上疑难问题时,不妨试试这个工具哈!

发表在 编译*调试*逆向 | 标签为 | 留下评论

打造一个开源的博客管理器

想把 博客园 的文章搬过来。没有找到合适的免费工具。于是 diy一个。

分析一下,需要的技术,一是 http protrol,二是 html/xml parse。http protrol协议同时需要支持 汉字 url,ssl,cookies,。html不是格式良好的 xml 文档,出于容错的考虑,使用 sax而不用 dom。同时,html parse 也需要支持编码集的转换。utf-8,unicode,gb2312。除此之外,我还想使文章照原来的日期显示。这可能需要用到 mysql的接口。

以前做过一个类似的项目,使用的是 gsoap toolkit。使用时发现的主要问题有: 对汉字标签处理有问题,不能处理格式不符合w3c规范的 html(比如 <br /> 可以被识别,而 <br>会被认为错误)。

从网上找找相关的文章。这次找了下面的套件:

 

html/xml parse 使用 expat。这玩意是 firefox 用的。使用注册机制来处理结点。想必对格式并不良好的 html有较好的支持。

字符集转换,使用 apache 的 apr-iconv。

http协议,使用 apache 的 apr-unit的 socket 库。

 

http client 的开发库,curl 提供了一个列表,并对各个库做了比较。curl 提供的这个列表 有点儿旧,有的已经不再维护了。按照“稳定易用,跨平台”的原则,瞄准了以下 library:

c++ 有 GNU Common C++ 。这是一个跨平台的库。类似于 apache 的apr-util。其中的class  URLStream 提供了http/ftp/file 的 get/put方法。能够支持多线程,支持 cookies,proxy,authentication。可以满足简单的 http 应用。似乎没有提供 ssl 的接口。xml方面,class XMLStream 提供了 xml 的 sax读写。似乎有些单薄。没有提供字符集转换、结点注册机制,不支持文件嵌套。因此不适用用来处理复杂的 html。

c 有 libcurl, 据称不够“轻量级”。

java apache 的 httpclient 支持插件。

 

发表在 开源,标准 | 留下评论