看看这个首页右上角,点开之后可以用来发送msg给我,我用的是jabber。
能用就好,
1.我的jabber client可以看到当前的交谈对象的一些信息,比如IP之类。
2.这种方式可以在不暴露账号的情况下和访客交谈。
3.暂时还不支持显示在线离线。
4.可以发送离线消息,jabber默认支持的。
5.js代码还不算多。
后台本来想做成支持msn账号的,算了,没时间。
看看这个首页右上角,点开之后可以用来发送msg给我,我用的是jabber。
能用就好,
1.我的jabber client可以看到当前的交谈对象的一些信息,比如IP之类。
2.这种方式可以在不暴露账号的情况下和访客交谈。
3.暂时还不支持显示在线离线。
4.可以发送离线消息,jabber默认支持的。
5.js代码还不算多。
后台本来想做成支持msn账号的,算了,没时间。
Ajax是不能直接做跨域访问的!
看了一下流行的跨域处理,一个是dojo做的iFrame,无奈我对这个不熟,为避免出什么篓子,就不敢用了,另一个是美妙的flash。
flash的安全性控制集中在两个方面,一个是swf访问站点动态数据,另一个是swf和js的交互。
swf文件要访问不同域下的数据源时,需要该数据源所在的域A用crossdomain.xml的方式声明这种来自域B的swf的访问被允许。具体的控制由flash player实现。
一个crossdomain.xml的例子如:
?xml version=
1.0
?
!DOCTYPE cross-domain-policy
SYSTEM
http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd
cross-domain-policy
allow-access-from domain=
www.pjoke.com
/
allow-access-from domain=
zhengrenchi.blogbus.com
/
allow-access-from domain=
simonzh.spaces.live.com
/
/cross-domain-policy
当然也可以直接domain=
*
,那么来自任意域的swf都可以访问了它了。
同一个页面上的来自A域的swf和来自B域的HTML中的JS交互,首先需要把object 标签中的
AllowScriptAccess属性声明为always,
然后在A域的swf中添加这样的允许语句:
system.security.allowDomain(
www.pjoke.com
);
system.security.allowDomain(
zhengrenchi.blogbus.com
);
system.security.allowDomain(
simonzh.spaces.live.com
);
事实上,保证这两类安全性的完全在于Adobe发布的标准flashplayer,如果出了别的player就难说了。然而相对于ajax这样无法通过统一渠道控制安全的技术,安全性都变成由浏览器来决定了,flash还是相对占优的。
因为我最后选择了一种
比较不合常规的方法来做Jabber的web client。
其实也不算client,只是接收访客输入,保存到数据库里面,然后用一个Jabber的php client收集这些,转发给其他的客服账号。同时在Jabber上扩展了一点协议,处理客服账号到php client的分发。
这个php的jabber
client是不退出的,由于在web上执行可调试性不好,所以转为php xxxx.php的后台运行。
然而总是在一定时间后挂掉。看了一下原因,是memory exhausted了,16M都用光了,肯定有些地方内存泄漏而无法回收。
于是看代码,我写的都是简单的赋值语句,理论上是可以正常回收的。看看借过来的jabber.php,有地方用了unset,作者应该还算正常。再看看数据库操作,是从wordpress那边借用的代码,改改然后用的。
有这么两行:
if (SAVEQUERIES)
$this-
timer_start();
if (SAVEQUERIES)
$this-
queries[] = array( $query, $this-
timer_stop() );
SAVEQUERIES我是没有定义过的,看上去它被当作true,因为这两句都执行了。
问题应该出在下面那句,是一个不断往数组里面添加新元素的句子。事实上纪录数据库操作顺序和时间对我来说毫无意义,于是把它们都注掉了。再跑跑,一个晚上内存都没增加。
把代码放到公网服务器上的时候,发现ssh的界面一关,php xxxx.php也关掉了,后面加
也没有用。
好好查查,发现比内网代码少了一句:
set_time_limit(0);
难怪,由此可见,关闭终端的效果是跟关闭浏览器的效果是一样的,php程序立刻退出。
这个程序足够稳定之后,拟将它和jabber启动脚本放一起。
比如 我05年写的,关键词 国人通信
关键词 竹丝鸡
关键词 淮南子,世贤第十六
等等,都屡屡在第一屏出现
傍晚4点多离开深圳,到虎门的时候已经是7点了,车上看到月光很不错,是的,这两年来东莞的空气好了而深圳的空气差了。
在虎门吃过晚饭后回家,到家快9点了,看看星星,3等以下的都很清晰,于是开了Stellarium来看,月亮在东南方升起,月亮上面还有一个大大的木星,真是和谐。行星伴月的情景是最舒心的了,两者都是相位饱满的。
正南方是角宿,也就是处女宫了。
西方的狮子已经徐徐下去,土星也沉向珠江口了。
东北方有个伟大的亮星,织女,未来的银河压在她身下,而牛郎更是在地平下面。
斗柄朝东。。。极星很暗,不过帝星比较光,看到那么明显的帝星还是挺开心的。
当然,第二天报黄菊去世,是啊,现在贵国中央政权太稳固了。
小时候看日本出的益智系列的书,里面有一个很经典的问题。
甲地和乙地相距数公里,A公司和B公司都同时经营从甲地到乙地的公共汽车服务。两家公司都是每小时发车六次,平均每10分钟发车一辆。然而,某乘客发现,不带偏见的他乘坐A公司的客车的概率要远远高于乘坐B公司的客车的概率。
为什么?
给出的答案很简单,A公司的车的出车时间是整10分,00,10,20,30,40,50
而B公司的出车时间是1分,01,11,21,31,41,51
那么,假如乘客到达车站的时间是均匀分布的,那么A公司就把从1分到0分的乘客载上了,B公司载上的是0分到1分。乘客比例是9:1。
之所以想起这个问题,是因为昨晚在世界之窗等26路回桃源村久等不至,有点怒了。最后一下子来了三辆。
其实很简单,由于从皇岗到桃源村的路途遥远,早段的路上,发生塞车的概率非常高。塞车不是一个均匀发生的事件,有突发性和短期性。因此,往往N辆公交在同一段路上被堵住了,那么乘客等车的时间相当于塞车时间+正常等待时间。当塞车解决之后,这N辆公交又几乎同时抵达,造成大量的浪费。
解决方法是有的,一个就是解决塞车了,这个是废话。
另一个就是司机有自由切换线路避开塞车的权限,然而由于很多车采取无人售票,乘客数与他自己关系不是很大的情况下,司机就不会太care有多少人坐他的车,而开塞那段时间,他们反而有飙车的可能,fear。
第三个就是公交改线,或者长线变短线。这个似乎更可行。
Javascript写了个正则表达式,死活不能用
想砸了IE的时候,发现
Javascript
一词写错了,tnnd,写成
javascirpt
状态不好还真不能写代码
慢,不过也怪不了它的,看看我写的代码:
require
pathname
q = Pathname.new(
c:/temp/www.surnamedb.com
)
aFile = File.new(
C:/1.txt
,
w
)
for i in 42..1000
n = q.children[i]
s = String(n)
m = s.gsub(/[\s\S]*name=/,
)
p = m.gsub(/.htm/,
)
p = p.gsub(/\
/,
\\\\\
)
a = n.read
b = a.gsub(/[\s\S]*class=\
SurnameHistory\
/,
)
c = b.gsub(/
[\s\S]*/,
)
c = c.gsub(/\
/,
\\\\\
)
c = c.gsub(/\
/,
\\\\\
)
aFile.puts
insert into surname (name, desc) values (\
aFile.puts p
aFile.puts
\
, \
aFile.puts c
aFile.puts
\
);
end
aFile.close
测试了一下,其中要操作的文件中平均每个文件大概是20K左右,做一个read,做两次的大的正则表达式操作,然后写文件,文件名处理消耗应该不大。
然后这么1K个文件居然花了将近20分钟的时间,难道时间都用在list上去了?
要再测测具体时间开销才行,这么慢,六万多个文件岂不跑一整天
另外说说,之前一行ruby没写过,语法都是google一半猜一半的
今天本来是打算实现一个高效率的Jabber的php Proxy
不过发现好多东西的实现细节都不清楚,比如php的共享内存,什么时候分配,分配之后是不是退出了一直有效,等等。
不过总比用mysql实现共享会好一点吧
也难说,目前的IM proxy用数据库实现的也挺多的。
我实在很讨厌jabberd2上配jwchat和punjab,那看来不大适合人做,于是不干了。
找了一个jabber.php来换个角度做,
不要binding行不行?那就不要binding,每次发消息多发一些就是了。
不知道效果如何,先试一下吧。