存档在 ‘程序’ 分类

Elance新手入门

2011年7月15日

    Elance是全球最大的外包网站。给我的印象是门槛高,服务好,项目多,项目质量好。比起国内的猪八戒之类的网站好不知多少倍。如果你是程序员、翻译、设计师等,同时英文又好,那一定要到Elance上来接项目,这样才能充分体现你的优势嘛。因为Elance是个国际平台,上面的价格是国际价格,换算成人民币怎么都划算啊。

注册

    Elance的注册是需要验证电话号码的。注册完了之后,Elance的机器人会打电话过来,叫你把网页上的数字用英文念出来。通过验证之后就算注册成功了。可以开始接项目了。PS. 因为Elance涉及到钱,所以对帐号保护比较严,一定要记得你的密保答案啊,因为下次你换个地方登陆,它就会让你输入答案了。。。

包装自己

    新手要顺利接到项目比较难,因为没有历史项目经历和别人给的评分。所以要靠自己profile上的自我简介,profilio和skill tests等来打动客户了。其中比较特别的是skill tests。Elance使用了第三方测试平台来衡量测试者的各种技能。在Elance网站上选择想要测试的技能,比如PHP5 Code Test,然后会进入一个第三方测试网站。一般选择类题目是40题,时间是40分钟。PHP5 Code Test属于代码实践题,需要测试者根据题目提供一段PHP程序,然后后台执行这段程序看看是否正确。

    测试的结果是按你在测试者中占的百分比来的,而且貌似只有top 1%,5%,10%,20%,30%(上次我做了个JS测试的top 2%,结果给我显示5%,冤屈啊。。。),其他的就用图形来显示你的测试成绩和平均测试成绩。免费会员可以选择5个测试成绩显示在自己的profile上。如果升级成付费会员则可以显示更多的成绩。如果某个测试你觉得不满意,没关系,14天之后可以再次做这个测试(题目大部分都一样的哦)。这些成绩是很有说服力的。比如你刚注册,但是在Javascript测试中获得了top 5%的成绩,那么你在投标的时候就可以说 “我刚来Elance,但是我在前端方面有 X年的经验,不信你去看我的profile,我在Javascript测试中排前5%哦。”。然后报价再稍微比别人低一点,获得项目的机会就会大很多。

项目流程

    Elance的项目主要分为固定价格的项目和按小时计费的项目。先说说fixed price project。

    首先在网站上搜索自己感兴趣又力所能及的项目,要看清楚项目类型,项目预算和是否需要提供W9表格( W9表格貌似是美国用于税收方面的东西,需要美国人才可以有,不过有些个人项目如果要求了W9,你可以跟他商量让他去掉W9)。 

    然后就是投标了。

    投一个$500以下的项目需要1个Connect(Elance上的一种点数吧),$500-$1000的项目需要2个Connect … $2000以上的貌似都是5个Connect。而且这个点数是不退的,也就是说对方发个项目,你去投,然后对方没选中你,甚至对方把项目关了,你都会一样损失这些点数。免费会员每月是10个点。我是每月$10的付费会员,每月有20点。这种点数的规则就限制了像猪八戒上那些胡乱杀价的人,所以Elance上看到的基本上都是正儿八经的人报的合理价格。

    然后投标内容一般用正式的英文书信格式,例如:

Hi Alex,

I am very interested in your project. I ….

Regards,
Chunlong

    而且内容一定要根据对方的项目需求来写。切记写一个模板到处去投标。比如对方想做个图片编辑器,你就应该说你以前做过类似的东西,然后把demo地址贴上去。这样对方会很感兴趣的。

    这段时间有可能对方会跟你来回通信几次,一旦他确定给你做,就会把项目award给你,然后你在elance后台就会看到这个项目,里面有各种设置和功能。一般项目award给你之后,对方就会把项目款打到Elance,如果没打,你可以等对方打了钱再开始做。这种第三方担保类似支付宝,需要双方同意钱才能转移。此时,你就可以跟对方交流任何内容,比如Skype帐号(上面的人大部分都用Skype,因为必要时候可以视频通话)。

    项目后台最常用的是message功能,可以收发消息,还可以带附件,每个消息还会forward到你的邮箱,甚至你可以用邮箱直接回复。另外还有一个是status reports,项目开始后记得用这个来向对方报告项目进度。Terms & Milestones是一个必须双方都同意的协议,里面涉及到项目的里程碑(可以在里程碑上协定支付部分项目款),项目截止日期,项目总价等。每个修改都需要双方同意之后才会生效。

    当项目结束后,如果对方确认了你的成果。那么就可以把status reports里面设置为completed。并且提醒对方放款。

    对于按小时付费的项目,大部分流程都是一样的。但是投标的时候的金额是每小时多少钱而不是项目总共多少钱。然后开始做之后,需要你下载一个Elance的Tracker软件(是一个Adobe AIR软件)。这个软件可以记录你的项目时间和屏幕截图。开始做项目的时候,进这个软件点击开始。然后就老老实实做这个项目,因为这个软件会不定期截屏上传的!万一被看到你在玩,那是有损声誉的事情啊。

    项目做完了就是提款,具体可以看我的《从Elance提现到国内银行的完美方法



0条评论    
到PHP.JS.CN上围观原文

Marking up content with RDFa

2011年5月26日

presentation-vs-semantics

上图左边是代理对页面的理解,右边是人的理解,代理可读的和人类可读的数据之间的关联是相当少的,结果就是现在的浏览器在解析和处理web数据上的能力很差,因为浏览器更多的功能是负责展示这些信息。因此为了耦合人类和机器的理解可以通过为一些可视化的数据提供一系列的XHML属性而使得这些数据可以被机器所理解,让页面更有语意RDFa就是一种解决办法,(还有微格式-Microformats

RDFa “Resource Description Framework in attributes” 即资源描述框架,其应用格式可以参见W3C。例如为了表明h2代表页面的标题而h3代表作者可以用RDFa这样描述:

<div xmlns:dc="http://purl.org/dc/elements/1.1/">
   <h2 property="dc:title">Marking up content with RDFa</h2>
   <h3 property="dc:creator">Lefter</h3>
</div>

为什么要用dc:creator和dc:title而不简单地用creator和title呢?这是因为XHTML并没有为这两个概念保留关键词;而xmlns:dc=”http://purl.org/dc/elements/1.1/ 个人理解有点类似XML的命名空间,RDFa还提供了@property 来自定义属性因此也可以简写为:

<h2 property="title">RDFa: Now everyone can have an API</h2>
<h3 property="creator">Lefter</h3>

可以看出其优势为

  • 增强的搜索功能
  • 用户自定义,可扩展性
  • 数据再利用性
  • 自我控制
  • 模块化架构
  • 更具可访问性

推荐阅读

小窗口的的浏览体验

2011年5月26日

小窗口的的浏览体验是必须的,在保证页面内容的完整性的前提下,满足多终端设备的访问,细小部分的处理更能体现一个企业的水准。出现小窗口浏览的情形有很多,比如和女朋友抢电脑用的时候,女朋友要看电影,用户要看新闻,在难分高下的时候只能“AA”,因此浏览新闻就只能缩小窗口了:)

看了一下国内网站(满屏自适应部分)基本上没有考虑这点
tenPay_full
tenPay_minify
baidu
baidu_full
taobao
qq
再看Yahoo最上面的提示条满屏的时候是100%,占据整个宽度
yahoo
缩小的时候页面内容完整,布局没有错乱
yahoo_small

对于块级元素,宽度默认会继承父级的宽度也就是100%(内联元素没有宽度,即使定义了也无效),而最外层元素HTML的宽度一般是随窗口的改变而改变的(改变窗口大小再点击下面代码)

alert(document.body.offsetWidth + "px")

YAHOO的做法是为满屏的元素(顶部提示条)加上min-width ,IE6不支持此属性不知道是YAHOO是怎么解决的,但是让IE6支持min-width实现方法可以用执行表达式 Expression:

width:expression((documentElement.clientWidth < 400) ? "400px" : "auto" )

另一种方法是用border-width来模拟

* html .minwidth {
	border-left:600px solid #fff; float:left
}
* html .container {
	margin-left:-600px; float:left;	 position:relative;
}

查看演示

让IE支持HTML5的两种方案

2011年5月26日

structure-html5

HTML5 最主要的特性就是加入了更加具有语义的标签比如:嵌入音频、视频、图片的函数、客户端数据存储,以及交互式文档,和页面元素,比如 header, section, footer, figure等。更详细的介绍可以看下面几篇文章的介绍:
A Preview of HTML 5
Yes, You Can Use HTML 5 Today!
W3C HTML5

但IE不支持HTML5这些有用的标签,HTML5,有两种方法让IE支持HTML5.

1.用 Google Chrome Frame插件

这中方法没什么好说的,参见Google Chrome Frame的说明。

2.用JS将HTML5增加的标签创建出来

<script>
var html5Tags=['header' ,'footer','article','nav' ,'section','aside']
for(var i=0;i<html5Tags.length;i++){
    document.createElement(html5Tags[i]);
}
</script>

查看演示

今天才发现这个方法早就有人这样实施了:Moving markup towards HTML5

美丽的泸沽湖

2011年5月26日

泸沽湖为川滇两省界湖。为四川云南两省共有,泸沽湖古称鲁窟海子,又名左所海,俗称亮海。纳西族摩梭语“泸”为山沟,“沽”为里,意即山沟里的湖。

43405272200904191504493354930684347_000_640

43405272200904191504493354930684347_001_640

43405272200904191504493354930684347_002_640

43405272200904191504493354930684347_003_640

43405272200904191504493354930684347_004_640

43405272200904191504493354930684347_006_640

43405272200904191504493354930684347_007_640

43405272200904191504493354930684347_008_640

43405272200904191504493354930684347_009_640

手机里的世界

2011年5月26日

刚过完生日,有大家的陪伴,真是高兴,喝的一塌糊涂,感谢身边的人:小时候的老同学,高中时候的老同学,大学时候的新同学,和工作室以及里面的师兄师弟们。

这是我用手机(30万像素)拍下的我一段生活的画面,调了一下对比度和亮度,勉强还能看清,特此纪念一段难忘的时光,祝福我们大家一切都好。

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

手机里的世界

CSS,JS文件压缩工具

2011年5月26日

js/css文件常见的压缩工具有:

Yuicompressor的用法

java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar
--charset UTF-8 D:\my.js -o D:\my-min.js

java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar
--charset UTF-8 D:\my.css -o D:\my-min.css

具体语法和其他参数参考:julienlecomte Yuicompressor。 也可以写一个批处理文件具体格式,同时处理多个文件,例如:将D盘中的WEBsite文件夹下的所有.CSS , .JS文件进行压缩

@echo off
:设置YUI Compressor启动目录
SET YUIFOLDER=D:\yuicompressor-2.4.2\build
:设置你的JS和CSS根目录,脚本会自动按树层次查找和压缩所有的JS和CSS
SET JSFOLDER=D:\WEBsite
echo look for JavaScript, CSS ...
chdir /d %JSFOLDER%
for /r . %%a in (*.js *.css) do (
@echo It's compressing  %%~a ...
@java -jar %YUIFOLDER%\yuicompressor-2.4.2.jar --charset UTF-8 %%~fa -o %%~fa
 )
@echo OK!
pause & exit

ESC(ECMAScript cruncher)

这个工具只能在Windows下使用,ESC.wsf提供5种压缩级别,从0到4:
Level 0 : No compression 不对JS文件进行压缩
Level 1 : Comment removal 移除JS文件中的注释
Level 2 : Whitespace removal 移除JS文件中的注释及空行(默认)
Level 3 : Newline removal 移除JS文件中的注释,将所有代码合并为一行
Level 4 : Variable substitution 提供最新的压缩率,移除JS文件中的注释,将所有代码合并为一行,并且修改JS文件中的变量名。例如:将”big.js”按照压缩级别2来压缩(ESC.wsf默认压缩级别为2)为”min.js”

cscript ESC.wsf -ow min.js big.js 

Google Closure Tools 包含三大块

  1. Closure Compiler:这是个JavaScript优化器,可以将JavaScript编译成压缩的、高性能代码。它除了能移除无效代码,重写代码使其最小化且运行更快,还能检查语法、变量引用和类型,并对一些常见JavaScript错误提出警告。同时,它还提供了Closure Inspector(一个Firefox插件)用于调试编译后的代码。FireFox插件
  2. Closure Library:这是个广泛的、经过良好测试、模块化且跨浏览器的JavaScript库。在例子中可以看到,Google Docs就是用这个库写的。
  3. Closure Templates:这是一个为Java和JavaScript实现的模板系统,可在服务器和客户端使用相同的模板。值得一提的是,JavaScript模板会进行预编译处理,以提高其性能。此外,Gmail和Google Docs也是使用该模板系统。

Ajax实现用户名验证

2011年5月26日

基于AJAX的注册很多,网上大多用GET请求,我用POST实现了一下。

function CheckUser(){
	var xmlHttp;
	var UserName=document.regForm.userName.value;
	if(UserName==""||UserName==null){
		alert("input word");
	}
	else{
		if(window.ActiveXObject){
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}else if(window.XMLHttpRequest){
			xmlHttp = new XMLHttpRequest();
		}
		xmlHttp.onreadystatechange=function(){
			if(xmlHttp.readyState ==4){
				if(xmlHttp.status==200){
					var response=xmlHttp.responseText;
					alert(response );
				}
			}
		}
		xmlHttp.open("post", "/phpstudy/reg.php",true);
		xmlHttp.send(UserName);
	}
}
<form name="regForm">
	<fieldset>
		<legend>用户注册</legend>
		<label>name</label>
		<input name="userName" onblur="CheckUser()" type="text">
		<label>password</label>
	</fieldset>
</form>
$conn=mysql_connect("localhost","root","root")
or die('Could not connect: ' . mysql_error());	

$db_link=mysql_select_db("phpstudy",$conn)
or die('Could not select database');	

$sql="select * from user where name='$HTTP_RAW_POST_DATA'";
$result=mysql_query($sql,$conn);
$info=mysql_fetch_array($result);
if($info){
	echo "用户已被占用";
}
else{
	echo "可以注册";
}

用POST方法遇到的问题
服务器对POST请求和提交WEB表单的请求处理有差异,因此有两种思路来解决
1.用XMLHttpRequest模拟表单提交
首先将Content-Type头部信息设置为application/x-www-from-urlencoded,也就是表单体提交时的内容类型
其次是以适当的格式创建一个字符串

2.服务器端用$HTTP_RAW_POST_DATA来接收数据
由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收

关于丽江,关于其他

2011年5月26日

丽江印象点击此处查看更多图片

  • 关于丽江
    印象最深的是康巴园的孤山老人,一个人住在枯草丛生的小木屋,陪伴着那些雕像–孤寂也好,凄凉也罢,我难忘!
    丽江和我想象的有很大差异,现今景点都大同小异,日渐的商业化,早已失去她那原始的姿态。
  • 关于旅行
    旅行是用来体验的。我向往的旅游方式是一种随遇而安,走到哪里黑就在那里歇。
    想起前些年的时候参加高中同学的婚礼–“艰辛”“痛苦”但难忘!由于当时下雪,公路不通,我们在爬山下坎的在雪地里面从早上9点到晚上8点,路上颗粒未进,因此导致一个插曲:10多个男人在公路追一只鸡,打算就地生火,烤着吃;好不容易逮到的时候,主人出来了,结果被臭骂了一顿..
  • 关于摄影
    摄影等于欺骗。因此我不赞成排排艺术照,感觉是从一个模子里面雕刻出来的。
    衣服背景等。然后后期都是按照相同的步骤。我身边的朋友,拍的艺术照一个比一个漂亮。其次觉得花节约的钱都够买一部好点的照相机了。
  • 关于单反
    很久以前就像买单反了,忍在继续..
    第一次用,边拍边问同事,什么是光圈,快门,怎么调。其实掌握好这两个参数就能拍出很不错的片子,要掌握还是比较难的,比如2个数相加等于10的条件,有无穷多种,每种情况出来的效果是不同

Silverlight IPAD Detection

2011年5月26日
用JavaScript判断代理是否装有Silverlight插件:
IE:可以用ActiveXObject对象是否能够new 出

ActiveXObject('AgControl.AgControl');
非IE:用navigator的plugins属性来探测,

navigator.plugins["Silverlight Plug-In"]
JavaScript判断IPAD
IPAD的代理标识为:

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)
AppleWebKit/531.21.10 (KHTML, like Gecko)
Version/4.0.4 Mobile/7B334b Safari/531.21.10
因此用Javascript来探测为:

var isiPad = navigator.userAgent.match(/iPad/i) != null;

D630安装MAC成功

2011年5月26日

D630_MAC

我选的是.iatkos V7(10.5.7)现已升级到了10.5.8;安装有很多种方式,USB,虚拟机,光盘,硬盘安装,我选的是光盘安装.
PC装MAC对CPU的要求是,必须支持SSE3/SSE3指令集,可以到osx86Project.org查看支持情况.

我的D630配置:cpu:Intel Core2 Duo(Merom) T7250(2.0GHz);主板芯片组:Intel PM965+ICH8M;独立,NVIDIA Quadro NVS 135M;无线网卡:Dell Wireless 1395 WLAN Mini-Card;有线网卡:Broadcom NetXtreme 57xx Gigabit Controller.这里有篇比较详细的图文教程,我只是回忆一下我安装的过程:

将BIOS硬盘模式选为ACHI;第一次安装没有自定义选项就直接一路NEXT过来,结果提示找不到keyboard(键盘)进不了系统.当时旁边没的USB键盘,于是重装,再次装的时候,我把所有选项都选上,心里想这么多的驱动总有一个能用,结果大错特错了,MAC不像WINDOWS,驱动一般都是需要部署的.这次安装成功之后出现了开机界面(灰苹果)下面有个风火轮在转,就是进不了系统,等了很长时间风火轮不转了,系统也就此卡死了。

第三次选我看了一下网上的说明,根据自己配置选了一下.安装成功了,进入系统的第一步就是填写一些个人信息,比如你的使用环境等等,键盘还是不能用,用了一个USB外置键盘,不知道什么原因键盘会自动输入,特别是输入密码的时候,好像有一个什么键被按下了一样,后来我知道了输入的是”7″,原因是我在选项的时候把PS/2和VOODOOPS/2都选了.解决方法是在BIOS里面把MOUSE/TOUCHPAD改成PS/2,进入系统删除其中一项,当时我不知道怎么卸载驱动,直接找到VOODOOPS/2.kext删除了。

再下一步是修复VISTA并建立一个MAC引导,方法比较多,如拷贝TOOB到C:\,我用的是安装了一个小软件:EasyBCD;进了系统安装显卡驱动,Nvinstallerv.41,和其他一大堆.关于D630很详细的帖子.启动的时候发现又停留在灰色苹果界面那里,没有风火轮.用单用户模式进入发现几行skipping…,后面的我内容不是很清楚了,解决方法是删除驱动缓存文件,这里有两个方法:1:

rm -rf /System/Library/Extensions.kextcache
rm -rf /System/Library/Extensions.mkext
参数-rf 表示递归和强制

2:在windows下安装一个磁盘共享文件,由于自定义选项的时候选择了对NTFS的支持,MAC下能访问Window下的资源,但不能修改,但反过来不行,可以安装一个小软件-Macdrive ,然后就像删除WINDOWS文件一样,对文件进行管理了。
建议最好把Extensions里的驱动文件全部备份,以便恢复

升级到10.5.8的时候很顺利(点击右上角苹果图标选择软件更新,一切系统自动帮你搞定),只是wifi网卡要重新安装一次,现在的一个小问题就是关机不断电,其他的都不错。很简介,用起来很流畅

推荐一些不错的资源

如何提高NodeJS程序的稳定性

2011年5月17日

   当我们写了个NodeJS程序的时候,一般用node yourjsfile.js命令启动该程序。但是如果程序中有东西出错,这个进程就会退出。我们写程序不可能保证万无一失,肯定有些没有处理的错误,这就让很多人觉得NodeJS不稳定,容易产生很多故障。 下面我就讲讲几种方法增加你的NodeJS程序的稳定性。

   1.使用 try{…} catch(error){…} 来执行容易出错的代码段。比如解析一个外来的json字符串等。
   2.使用 process.on('uncaughtException', function(err){…}); 来处理未被捕捉的错误。
   3.试用奶妈进程来启动你的程序,检测子进程的退出,然后自动重启该进程。比如 mother.js :


start();
function start()
{
    console.log('Mother process is running.');
    var ls = require('child_process').spawn('node', ['yourjsfile.js']);
    ls.stdout.on('data', function (data)
    {
        console.log(data.toString());
    });
    ls.stderr.on('data', function (data)
    {
        console.log(data.toString());
    });
    ls.on('exit', function (code)
    {
        console.log('child process exited with code ' + code);
        delete(ls);
        setTimeout(start,5000);
    });
}

    4.使用 nohup 让nodejs进程在后台运行。 比如运行"nohup node yourjsfile.js > /dev/null &"



3条评论    
到PHP.JS.CN上围观原文

NodeJS实现HTTP/HTTPS代理

2011年5月8日

    身在天朝,难免会用到代理的时候。 比如在学校内网用代理免费上外网,在墙内用代理上404网站等。

    现在使用的代理大部分为HTTP和Socket代理。 Socket代理更底层,需要本地解析域名,而HTTP代理则是基于HTTP协议之上的,不需要本地解析域名。下面我讲讲HTTP(S)代理的设计思路以及NodeJS代码实现。

HTTP协议

    HTTP协议简单说来就是浏览器把一串字符串发送到目标服务器,然后把目标服务器返回回来的一串字符串显示给用户。

    浏览器发送的这串字符主要分为两个部分,一部分是头,里面包含目标服务器域名,当前请求的文件路径等信息。另一部分是正文,一般的GET请求没有正文。

    服务器返回来的字符串也分为头和正文。

HTTP代理原理

    HTTP代理需要做的事情就是接收浏览器发来的请求字符串,再从请求字符串的头部分找出浏览器请求的目标主机,然后直接把这串请求字符串发给目标主机,再把目标主机返回的数据发给浏览器。 “什么?就这么简单?” “呃。。是啊,但这还没完。。”

    现代浏览器一般都是默认采用HTTP/1.1版本,并且默认会发送Connection: keep-alive请求。 这些信息是写在请求的头部的,意思是通知目标服务器采用keep-alive技术继续处理后续的请求。 但是我们做的代理程序要想支持keep-alive是比较麻烦的。所以干脆就把这个篡改成Connection: close。 这样就可以保证浏览器请求的每个文件都会单独发送一个HTTP请求。

下面是NodeJS代码实现

 

var net = require('net');
var local_port = 8893;

//在本地创建一个server监听本地local_port端口
net.createServer(function (client)
{
    
    //首先监听浏览器的数据发送事件,直到收到的数据包含完整的http请求头
    var buffer = new Buffer(0);
    client.on('data',function(data)
    {
        buffer = buffer_add(buffer,data);
        if (buffer_find_body(buffer== -1return;
        var req = parse_request(buffer);
        if (req === falsereturn;
        client.removeAllListeners('data');
        relay_connection(req);
    });

    //从http请求头部取得请求信息后,继续监听浏览器发送数据,同时连接目标服务器,并把目标服务器的数据传给浏览器
    function relay_connection(req)
    {
        console.log(req.method+' '+req.host+':'+req.port);
        
        //如果请求不是CONNECT方法(GET, POST),那么替换掉头部的一些东西
        if (req.method != 'CONNECT')
        {
            //先从buffer中取出头部
            var _body_pos = buffer_find_body(buffer);
            if (_body_pos < 0_body_pos = buffer.length;
            var header = buffer.slice(0,_body_pos).toString('utf8');
            //替换connection头
            header = header.replace(/(proxy\-)?connection\:.+\r\n/ig,'')
                    .replace(/Keep\-Alive\:.+\r\n/i,'')
                    .replace("\r\n",'\r\nConnection: close\r\n');
            //替换网址格式(去掉域名部分)
            if (req.httpVersion == '1.1')
            {
                var url = req.path.replace(/http\:\/\/[^\/]+/,'');
                if (url.path != urlheader = header.replace(req.path,url);
            }
            buffer = buffer_add(new Buffer(header,'utf8'),buffer.slice(_body_pos));
        }
        
        //建立到目标服务器的连接
        var server = net.createConnection(req.port,req.host);
        //交换服务器与浏览器的数据
        client.on("data", function(data){ server.write(data); });
        server.on("data", function(data){ client.write(data); });

        if (req.method == 'CONNECT')
            client.write(new Buffer("HTTP/1.1 200 Connection established\r\nConnection: close\r\n\r\n"));
        else
            server.write(buffer);
    }
}).listen(local_port);

console.log('Proxy server running at localhost:'+local_port);

//处理各种错误
process.on('uncaughtException', function(err)
{
    console.log("\nError!!!!");
    console.log(err);
});

/**
* 从请求头部取得请求详细信息
* 如果是 CONNECT 方法,那么会返回 { method,host,port,httpVersion}
* 如果是 GET/POST 方法,那么返回 { metod,host,port,path,httpVersion}
*/
function parse_request(buffer)
{
    var s = buffer.toString('utf8');
    var method = s.split('\n')[0].match(/^([A-Z]+)\s/)[1];
    if (method == 'CONNECT')
    {
        var arr = s.match(/^([A-Z]+)\s([^\:\s]+)\:(\d+)\sHTTP\/(\d\.\d)/);
        if (arr && arr[1] && arr[2] && arr[3] && arr[4])
            return { method: arr[1], host:arr[2], port:arr[3],httpVersion:arr[4] };
    }
    else
    {
        var arr = s.match(/^([A-Z]+)\s([^\s]+)\sHTTP\/(\d\.\d)/);
        if (arr && arr[1] && arr[2] && arr[3])
        {
            var host = s.match(/Host\:\s+([^\n\s\r]+)/)[1];
            if (host)
            {
                var _p = host.split(':',2);
                return { method: arr[1], host:_p[0], port:_p[1]?_p[1]:80, path: arr[2],httpVersion:arr[3] };
            }
        }
    }
    return false;
}

/**
* 两个buffer对象加起来
*/
function buffer_add(buf1,buf2)
{
    var re = new Buffer(buf1.length + buf2.length);
    buf1.copy(re);
    buf2.copy(re,buf1.length);
    return re;
}

/**
* 从缓存中找到头部结束标记("\r\n\r\n")的位置
*/
function buffer_find_body(b)
{
    for(var i=0,len=b.length-3;i<len;i++)
    {
        if (b[i] == 0×0d && b[i+1] == 0×0a && b[i+2] == 0×0d && b[i+3] == 0×0a)
        {
            return i+4;
        }
    }
    return -1;
}

 

另外,可以用 "nohup node some.js > /dev/null &" 命令让nodejs程序在后台运行。



2条评论    
到PHP.JS.CN上围观原文

从Elance提现到国内银行的完美方法

2011年5月4日

    我开始做自由职业已经有一个月左右了。主要是在elance.com上接项目。

    第一个项目做的是用jQuery做一个图片裁剪的功能,包括图片上传进度显示,两个比例的图片裁剪框。这个项目是100刀,elance扣了8.75刀的中介费,到手91.25刀。这个比例还是可以接受的。

     第二个项目是用nodejs做一个gtalk聊天机器人、一个facebook chat聊天机器人、一个msn聊天机器人。每个机器人200刀。在5天内搞完另外给400刀的bonus。结果我顺利在规定时间搞完,拿了1000刀。哈哈哈。

     钱到了Elance帐户上,怎么变成能够提现的人民币是个麻烦事情。我搜了网上很多文章,都说只有用moneybookers的服务最便宜。 于是我又搞了个moneybookers帐户。 那天突然发现如果成为elance的付费会员(最便宜的付费会员$10/月),就可以享受每月一次的免费电汇(wire transfer),超出一次以后貌似每笔要给25刀手续费。于是就搞了个付费会员玩玩,不仅可以享受免费电汇,还有更多的点数和其他东西可以享受。那天试探提了200刀到我的中国银行活期一本通上,用的swiftcode是BKCHCNBJ570。过了大概4天,发现卡上真的有200美元,一分中间行费用都没扣。太TM爽了,这绝对是最便宜的提现途径,虽然每月只有一次机会。

     下一步就是去银行结汇,把美元转成人民币,这个步骤不知道要不要收手续费。



3条评论    
到PHP.JS.CN上围观原文

Mac OS 上的各种ipv6配置命令

2011年4月12日

IPv6 在Mac OS上是默认开启的。也可以用下面的命令手动开启或者关闭ipv6支持:

在所有网卡上开启ipv6:

ip6 -a

 

关闭ipv6:

ip6 -x

 

要打开router advertisements (RAs)可以用下面的命令:

sysctl -w net.inet6.ip6.accept_rtadv=1

 

关闭RAs的话,将上面的命令最后的数字改成0即可。

 

私有地址默认没有开启,可以用下面的命令开启:

sysctl net.inet6.ip6.use_tempaddr=1

 

在Mac OS上开启ISATAP隧道支持:

 

1、下载ISATAP client for Mac OS X

地址:http://www.momose.org/macosx/isatap.html

2、解压ISATAP client

 

cd /usr/local
sudo tar xfz ~/Downloads/macosx-isatap-*.tar.gz

 

3、更改权限

 

sudo chown -R root:wheel /usr/local/isatap
sudo chmod -R 644 /usr/local/isatap/isatap.kext

 

4、配置ISATAP

4.1 配置ist0和得到IPv4地址(你需要制定现在使用的网卡,比如en0)

 

sudo ./config-ist.sh en0

 

4.2 指定ISATAP router (111.111.111.111更换为你当地的ISATAP服务器地址)

 

sudo ./ifconfig ist0 isataprtr 111.111.111.111
sudo ./rtsold.sh &

 

4.3 设置路由表

 

sudo route delete -inet6 default

 

注:在执行上面命令之前可以用netstat -r查看ipv6路由表上是否有default这一项,没有则不用执行上面命令

 

sudo route add -inet6 default -interface ist0

 

4.4 启动IPv6

 

sudo ifconfig ist0 up

 

5、关闭IPv6

 

sudo ifconfig ist0 down

 

这样ISATAP就配置好了。

 

我的例子:

我在电子科技大学清水河校区,我们学校采用802.1X拨号上网。 我在拨号可以上网的前提下配置了RAs支持,即可正常上ipv6网站。 另外,我也可以通过配置ISATAP,使用隧道连接上ipv6。



0条评论    
到PHP.JS.CN上围观原文