分类目录归档:不是技术

把网页上放置IM

看看这个首页右上角,点开之后可以用来发送msg给我,我用的是jabber。

能用就好,

1.我的jabber client可以看到当前的交谈对象的一些信息,比如IP之类。

2.这种方式可以在不暴露账号的情况下和访客交谈。

3.暂时还不支持显示在线离线。

4.可以发送离线消息,jabber默认支持的。

5.js代码还不算多。

后台本来想做成支持msn账号的,算了,没时间。

Ajax跨域访问的替代方案

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还是相对占优的。

用PHP写后台进程

因为我最后选择了一种

比较不合常规的方法来做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启动脚本放一起。

补记一下六一晚上的星象

傍晚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

状态不好还真不能写代码

ruby的执行效率

慢,不过也怪不了它的,看看我写的代码:

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用数据库实现的也挺多的。

web IM和 jabberd2交互

我实在很讨厌jabberd2上配jwchat和punjab,那看来不大适合人做,于是不干了。

找了一个jabber.php来换个角度做,

不要binding行不行?那就不要binding,每次发消息多发一些就是了。

不知道效果如何,先试一下吧。