除了赋值操作符重载,想来想去只想到一个应用,使用下面的左值为其他模块提供操作本模块的接口。
static int g_i = 0;
int & set_g_i()
{
return g_i;
}
int * set_g_i2()
{
return &g_i;
}
。。。。
int main(int argc, char * argv[], char * envp[])
{
set_g_i() = 5;
printf("%d\n", g_i);
*set_g_i2() = 7;
printf("%d\n", g_i);
}
但是这样太牵强了。也许只有面试的时候才会有用吧,^_^。
(字节数 : 518)
最近Google频繁上不去,非常烦人。上不去也就罢了,用“阉割版”还能凑合,我忍,但是gmail常常时断时续,实在是难以忍受。我有个习惯,用gmail草稿箱来保存一些资料,但是不幸的是,我常常在家使用gmail的收件箱没问题,一使用草稿箱马上就出错,gmail就没法访问了。也许是我的草稿箱内有些敏感字符吧。总之问题很难缠。
于是我想到了Tor,那么什么是TOR呢?下面给大家介绍一下。
普通的上网模式是 浏览器<--http线路-->目标网站服务器 , 浏览器直接访问目标服务器。
利用代理服务器上网模式是 浏览器<--http线路-->代理服务器<--http线路-->目标网站服务器。所以利用代理服务器能够一定限度上隐藏访问者的IP地址和真实身份。
TOR的原理和代理服务器类似,但是更高级。实际上TOR在架构上依然使用了Http代理服务器协议,Tor是这样工作的:
有一个目录服务器提供服务,把全世界正在使用Tor软件的同志们IP信息记录下来;
使用Tor的部分同志不仅“索取”,还要“贡献”,为其他人提供Http代理服务;
当Tor普通用户上网时,目录服务器为其随机安排一个虚拟线路,这个虚拟线路可能是:
Tor用户<--->Tor用户A<--->Tor用户B<--->Tor用户C....<--->Tor用户Z<--->目标服务器
这样,就随机的隐藏了访问者用户的身份。
以上是TOR的主线路,在一台PC机上,TOR是这样工作的。同志们可以在这里下载安装Tor软件包,软件包有三部分:
Tor :负责PC机和目录服务器、其他Tor用户的底层通讯。(据我分析大部分是Sock5协议)
Vidalia:负责提供GUI界面,让用户操作和观察Tor网络。
Privoxy:负责提供HTTP代理服务器,为浏览器提供Http代理服务(默认服务地址是127.0.0.1:8118)。
所以互联网上一些介绍让大家安装Tor组合软件包,这种做法有些多余,启动上面三个软件,剩下的工作仅仅剩下一个,那就是设置浏览器的代理服务器配置,把代理服务器地址设置成“127.0.0.1:8118”就行了。
说到这里,整个Tor网络访问的线路就可以这样描述了:
Tor用户浏览器访问Privoxy的127.0.0.1:8118;
Privoxy通过Sock5访问Tor.exe;
Tor.exe通过Sock5访问目录服务器;
目录服务器为本次访问提供一条虚拟线路;
Tor.exe访问Tor用户A<--->Tor用户B<--->Tor用户C....<--->Tor用户Z<--->目标服务器
怎么样,很好玩吧,赶紧去bbs注册马甲吧,哈哈。
[附录]Tor代理全套解决方案是篇好文章,写的比我好。
(字节数 : 2065)
子曰“见贤思齐焉,见不贤而内自省也”,但是我想我自己,见贤思齐太容易太常见了,但是见不贤内自省却从来没有。比如我看到好学的朋友非常勤奋,见贤思齐,效仿人家,暗自决心向人家学习。但是我见到“犯懒”的朋友,或者见到勤奋的朋友“一时犯懒”,我却常常也跟着放纵自己的懒惰了。这,大概是常人和圣人的区别吧。
2。天之道,损有余而补不足。那么人之道?
天道如此,人道亦然。人生常常是此“损”彼“补”,时间损,金钱补;闲适损,成就补;精神损,物质补;意志损,欲望补。每个人只有一个水缸,贪厌的我们不会选择,什么砖头瓦块的都往里装,结果呢?清水从水缸里溢出来,我们还在为此而欣喜。
(字节数 : 388)
这次认真的测试了三种浏览器(ie/firefox/opera)的xmlhttp并发行为,发现如果用户同时发出很多xmlhttp 异步请求,那么浏览器不是一股脑全把请求发出去,而是存在一个最大并发数。我的机器测试发现,ie和ff里面是2,opera是4。
所以说,在设计一个站点时,让ajax页面同时载入数十个xmlhttp请求不是明智的做法。在考虑减少接口耦合的同时,也应该斟酌速度问题。实际上,可以使用某些细化的设计,可以把多种请求绑定到一起发送,从而达到优化的目的。
下面是我的测试代码:
<?php //服务端ajaxserver.php
function _getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function _exit($msg)
{
echo("$msg\n");
exit();
}
$mode = $_GET["mode"];
$f = fopen("$mode.log", "a+");
if(!$f) _exit();
$begin = _getmicrotime();
$str = "$begin\t". $_GET["flag"] . "\t begin \n";
fwrite($f, "$str");
fclose($f);
echo($str);
sleep(2);
$f = fopen("$mode.log", "a+");
if(!$f) _exit();
$end = _getmicrotime();
$str = "$end\t". $_GET["flag"] . "\t end \n";
fwrite($f, "$str");
fclose($f);
echo($str);
?>
//这是.html网页代码:
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--
function $(id)
{
return document.getElementById(id);
}
function ajax_object() {
var A;
try {
A=new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
A=new ActiveXObject("Microsoft.XMLHTTP");
} catch (oc) {
A=null;
}
}
if(!A && typeof XMLHttpRequest != "undefined")
A = new XMLHttpRequest();
return A;
}
function doit(flag)
{
var uri = "ajaxserver.php?mode=opera&flag=" + flag ;
var x = ajax_object();
x.open("GET", uri, true);
function callback()
{
if (x.readyState != 4)
return;
if (x.status==200)
{
$("result").value += x.responseText;
}
}
if ("[XMLHttpRequest]"==x.constructor)
{
x.onload = callback ;
}
else
{
x.onreadystatechange = callback ;
}
x.send(null);
}
function doajax()
{
doit(1);
doit(2);
doit(3);
doit(4);
doit(5);
}
//-->
</script>
</head>
<body>
<input type="button" value="doajax" onclick="doajax();">
<textarea cols="80" rows="60" id="result"></textarea>
</body>
</html>
************************************************
下面是测试结果:
IE的测试结果:
1157288179.03 2 begin
1157288179.03 1 begin
1157288181.03 1 end
1157288181.04 2 end
1157288181.05 3 begin
1157288181.06 4 begin
1157288183.05 3 end
1157288183.06 5 begin
1157288183.09 4 end
1157288185.09 5 end
firefox的测试结果
1157288092.36 1 begin
1157288092.38 2 begin
1157288094.36 1 end
1157288094.38 2 end
1157288094.39 3 begin
1157288094.39 4 begin
1157288096.4 4 end
1157288096.42 3 end
1157288096.42 5 begin
1157288098.43 5 end
opera的测试结果:
1157288410.88 1 begin
1157288410.89 4 begin
1157288410.89 2 begin
1157288410.89 3 begin
1157288412.89 1 end
1157288412.89 2 end
1157288412.92 5 begin
1157288412.92 4 end
1157288412.92 5 begin
1157288412.92 3 end
1157288414.93 5 end
1157288414.95 5 end
(字节数 : 11052)
偶然研究DOM文档,发现一个“深奥”的问题——DOM中的element和Note什么区别?
google到这篇文章--《XMLDOM学习笔记》:
(4)Node的类型
| nodeType | Named Constant | nodeTypeString | nodeName | nodeValue |
|---|---|---|---|---|
| 1 | ELEMENT_NODE | element | tagName | null |
| 2 | ATTRIBUTE_NODE | attribute | name | value |
| 3 | TEXT_NODE | text | #text | content of node |
| 4 | CDATA_SECTION_NODE | cdatasection | #cdata-section | content of node |
| 5 | ENTITY_REFERENCE_NODE | entityreference | entity reference name | null |
| 6 | ENTITY_NODE | entity | entity name | null |
| 7 | PROCESSING_INSTRUCTION_NODE | processinginstruction | target | content of node |
| 8 | COMMENT_NODE | comment | #comment | comment text |
| 9 | DOCUMENT_NODE | document | #document | null |
| 10 | DOCUMENT_TYPE_NODE | documenttype | doctype name | null |
| 11 | DOCUMENT_FRAGMENT_NODE | documentfragment | #document fragment | null |
| 12 | NOTATION_NODE | notation | notation name | null |
看起来,只有NodeType==1的node类型才是element,这就是他们的区别.
之所以想起这个问题,是因为我在使用dom解析xml文档时,在firefox和opera中,一个cdata数据元素(element),同时存在两个节点(node) , childNode[0]节点是一个#text节点,内容是空的,childNode[1]节点是一个#cdata-section类型节点。而IE的cdata元素只有一个#cdata-section类型节点。所以解析起来需要顾及浏览器兼容问题。
我一直感到text节点是个奇怪的节点,用firefox的dom查看器查看网页时,会看到很多空的#text节点,似乎这和文档的源文件有关系。具体深层的问题我还没有搞清楚。暂且按照惯例,认为firefox和opera的行为是标准行为吧。
(字节数 : 2952)
当然不是,孔子的原话是这么说的:
子曰:吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲不踰矩。
首句是“十有五而志于学”,后面的“三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲不踰矩”都是承接首句的“志于学”,以十年为一个阶段介绍了孔子一生在“学”方面的成果和历程。
那么孔子的“学”是指什么呢?当然是说孔子对文化的学习和对思想境界的修为。
引用《论语今解·为政第二》卫君翰 的引申解释:
本章亦可稍作引申为修德进学的阶段:一为有志向学;二为建立自己的基本思想以确有所立;三为不惑,人事多异,虽自己已有志且能立,但与外在事物不免有冲突矛盾,此心因而会有惑,所以必须穷究事理,以求得不惑;四为知天命,虽已有志有所立又能不惑,但实行时又可能遭遇困难阻碍,所以必须要能知天命;五为耳顺,入耳之事有顺,有不顺,因为知道那些不顺的其实亦有其道理(由不惑来),甚至也属天命(由知天命来),是故应能修养到一切入耳的皆为顺;六为从心所欲不踰矩,到此境界则一切发于心所为,皆合于天命,所以自然可以符合人类社会所形成的规范。这也就是为学修德的最高境界了。
可见修德进学是一生的计划。我们这些追求有房有车的人们是不是也该想想了呢?
(字节数 : 1178)
我的电脑是win xp,平时一般用firefox,很少用ie。即使用ie我对activex也做了限制,所以自从上网以来很少中流氓软件的招。
今天安装一个共享软件,不幸意外安装上了叫做cdn、letscool等流氓冬冬,怎么卸载都卸载不了。据查cdn是CNNIC的一个软件,号称“通用网址”,看样子和3721是同类。虽然cdn提供了卸载程序,但是卸载后无论如何都依然存在。
看到cdn的安装目录是“c:\program files\cnnic\cdn”于是手工删除这个目录,没想到文件夹下的所有dll文件都被进程锁定,无法删除。打开“任务管理器”发现有个叫做“cdnup”的进程无法中止。看来就是这个流氓进程了。
从网上google相关信息,看到这篇《垃圾流氓反删除批处理文件》文章写的很酷,于是马上打开命令行窗口试验,发现没有起到作用。但是里面这两行给了我启发:
rem kao kao cao cao windirected 傲迅 wmpdrm.dll
rem 这个垃圾流氓卸载 需要在安全模式下进行,也可以终止explorer.exe,taskmgr.exe,输入法等进程只留下基本进程,在CMD窗口中执行可以卸载
看起来和流氓软件相关的进程太多了,所以我无法删掉这些文件。
于是马上重启机器,按住F8进入“带命令行的安全模式”,登陆后系统为我打开一个cmd命令行窗口。输入命令tasklist回车,发现现在进程很少,的确没有cdn/explorer等程序。这下好了。为了确保把一切cdn相关文件一网打进,我使用了这个命令:
for /R %d in (*cdn*) do echo "%d" //没有使用del命令是怕删掉别的无辜文件
发现包含cdn关键字的文件很多,除了program files文件夹下的文件,Documents and Settings\User\Local Settings\Temp下也有很多。于是我输入:
for /R %d in (*cdn*) do del "%d" //用引号是避免路径中的空格对del命令的干扰
然后
rmdir "program files\cnnic\cdn"
rmdir "\program files\cnnic"
这样,cnnic相关文件就被清除干净了。用同样的办法,我也清除了letscool这个流氓。最后打开regedit,查找所有run的项,删除未知来源的键值。我的电脑终于恢复了宁静和谐,哈哈。
(字节数 : 1653)
1. for in 结构:
下面这个语句可以把当前文件夹所有子文件夹下的txt文件合并成一个文件
for /D %%d in (*) do type %%d\*.txt >>result.txt
有时候程序输出的txt文件最后一行缺少回车符号,如果两个文件直接用type重定向合并,会导致错误,所以可以做一个空行文件oneline.txt,然后改成这种:
for /D %%d in (*) do type %%d\*.txt oneline.txt >>result.txt
这样多个文件合并时总是把oneline.txt
2. 取日期和时间。
批处理环境里可以使用%date%变量和%time%变量,不同的机器这个变量的格式也不同,
可以试试echo %date% %time%看格式
然后使用:~begin,len的方式取的变量的字串类似函数substr($str, $begin, $len),例如
echo %date%
结果输出:2006-06-20 星期二
那么取从0开始的索引0,字串长度为10,既:
echo %date:~0,10%
结果输出:2006-06-20
例如我想合并今天的日志文件,可以这样:
set myval=%date:~0,10%
for /D %%d in (*) do type %%d\%myval%.log >>result.txt
(字节数 : 743)
php不支持多线程,但是我们可以把问题转换成“多进程”来解决。由于php中的pcntl_fork只有unix平台才可以使用,所以本文尝试使用popen来替代。
下面是一个例子:
被并行调用的子程序代码:
<?php
if($argc==1){
echo("argv\n");
}
$arg = $argv[1];
for($i=0; $i<10; $i++)
{
echo($i.".1.".time()." exec $arg \n");
if($arg=='php2')
{
sleep(1);
echo($i.".2.".time()." exec $arg \n");
sleep(1);
}
else
sleep(1);
}
?>
----------------------------
主调用者程序,由他调用子进程,同时并发的收集子程序的输出
<?php
error_reporting(E_ALL);
$handle1 = popen('php sub.php php1', 'r');
$handle2 = popen('php sub.php php2', 'r');
$handle3 = popen('php sub.php php3', 'r');
echo "'$handle1'; " . gettype($handle1) . "\n";
echo "'$handle2'; " . gettype($handle2) . "\n";
echo "'$handle3'; " . gettype($handle3) . "\n";
//sleep(20);
while(!feof($handle1) || !feof($handle2) || !feof($handle3) )
{
$read = fgets($handle1);
echo $read;
$read = fgets($handle2);
echo $read;
$read = fgets($handle3);
echo $read;
}
pclose($handle1);
pclose($handle2);
pclose($handle3);
?>
-------------------
下面是我机器上的输出:
<?
C:\my_proxy_hunter>php exec.php
'Resource id #4'; resource
'Resource id #5'; resource
'Resource id #6'; resource
0.1.1147935331 exec php1
0.1.1147935331 exec php2
0.1.1147935331 exec php3
1.1.1147935332 exec php1
0.2.1147935332 exec php2
1.1.1147935332 exec php3
2.1.1147935333 exec php1
1.1.1147935333 exec php2
2.1.1147935333 exec php3
3.1.1147935334 exec php1
1.2.1147935334 exec php2
3.1.1147935334 exec php3
4.1.1147935335 exec php1
2.1.1147935335 exec php2
4.1.1147935335 exec php3
5.1.1147935336 exec php1
2.2.1147935336 exec php2
5.1.1147935336 exec php3
6.1.1147935337 exec php1
3.1.1147935337 exec php2
6.1.1147935337 exec php3
7.1.1147935338 exec php1
3.2.1147935338 exec php2
7.1.1147935338 exec php3
8.1.1147935339 exec php1
4.1.1147935339 exec php2
8.1.1147935339 exec php3
9.1.1147935340 exec php1
4.2.1147935340 exec php2
9.1.1147935340 exec php3
5.1.1147935341 exec php2
5.2.1147935342 exec php2
6.1.1147935343 exec php2
6.2.1147935344 exec php2
7.1.1147935345 exec php2
7.2.1147935346 exec php2
8.1.1147935347 exec<