cloudapi 悄然上线,欢迎各方人士拍砖

2010.3.24 最新消息,小宝宝出生了,为了表示庆祝,cloudapi也上线了,当前位于linode的fremont机房
很抱歉,由于目前网络问题,几个小小的线上设置一直有问题,在此向已经第一时间当小白鼠的各位用户道个歉~
稍事休整后将上次上线.谢谢支持!
最近云计算超级火爆呀,一米六二同学心一痒痒,也弄了一个域名来提供云服务.
本服务基于云上:运行于linode的vps上,达拉斯机房,有兴趣的朋友可以帮我测一下网速.
这个应用的地址是:
http://cloudapi.info/
域名还算很好记吧.
计划的目标是:
提供一个简单即用的分词,搜索,以及正文提取,文本智能分类,去重等文本处理的相关API.详情请查阅手册:
http://cloudapi.info/users/apidoc
通过phprpc提供的各种语言实现的php serialize函数,为多种语言提供调用.
如果一米六二有钱的话,会搭一套足够大的Key-value对数据库和消息队列以供使用,方便各位编程的同胞实现扩展性.
目前的实现已经能做到记录每一次出错的log.接下来还会对部分接口提供web界面试用(分词,提关键词,提正文之类的接口提供在线试用)

目前找小白鼠中.您的帐号信息一定会被保留,您的其他数据一定不会被保留(如果保留,纯属意外),但是测试期间意外发生的几率还是蛮大的~
同时,我们还在寻找:
1.更多的API提供.
2.计费模式等业务方面的指导(以后会提供收费接口)
3.rails我是前天才开始写,好多隐藏的小技巧不知道,如站点有漏洞什么的就请指出来,不胜感谢

到目前为止,我们还没有丢失数据~
寻找设计方面的哥们~ 有偿~

为什么我认为每个穷网站开发程序员都应该用Linux[工具篇]

1.因Mac很好用.详细的嘛,请看为什么我认为每个程序员都应该用Mac OS X?
而如果你买不起Mac的话,装个Ubuntu是不错的选择:Ubuntu可以免费给你把光盘寄到家,而WindowsXp不会(你可以昧着良心在小区门口以四块钱一张买,也可以挂机一天一夜从bt上download). 另外,Linux 跟Mac 有亲戚关系,他们都可以运行相同的Gnu程序,而windows不是.
2.讲好看的话,Linux 其实很好看了.比如我的这个桌面:
linux desktop
我的图标主题是elementary,一个热心的团队自己做的,打磨的非常精致.本来我以前是用的模仿Mac的一个主题,后来容易被人鄙视,所以就改用这个了.也挺好,不比Mac的差.但是我也不能保证这些图标可能有抄袭的成分什么的,也不接受在评论中讨论是Mac抄windows还是windows抄Mac的话题什么的.
3.这是正题:关于软件
a:开发工具:其实除开visual studio,我们有很多开发工具可以选.比如,最常见的vim.这里我就顺便秀一下我的vim.我主要装了这么几个插件:superTab,snipmate,zencoding. 很多人即使做服务器端开发也要用zend这个玩意,并且吧,还给不起钱,用破解版.他们对zend忠贞不二的原因是,记不住变量名,因此需要zend的自动被全功能.其实这个有了supertab后很简单:
vim
另外,vim的snipmates插件还能做到类似textmate的snippets功能.也秀一下:
新建一个php文件.输入fun,紧接着按tab键:
vim-snipmates1
按了tab键之后就成了这样:
vim snipmates2
直接输函数,按tab键,接着输函数内容.注意,这里自动补全的内容我稍做了调整,如果您也要做调整,请修改~/.vim/snippets/php.snippets文件.
zencoding的用法是这样的:
新建一个html文件,新起一行输入:

html>body>div#main-wrapper>ul.general-nav>li.no-list

按Ctrl-Y再按逗号,就会补全成为:

<html>
<body>
<div id=”main-wrapper”>
<ul>
<li></li>
</ul>
</div>
</body>
</html>

<html>
<body>
<div id=”main-wrapper”>
<ul class=”general-nav”>
<li class=”no-list”></li>
</ul>
</div>
</body>
</html>

怎么样,很省事吧.
b.开发语言了.嗯,这个我就这么说吧,我了解很多大公司的服务器端环境,基本上就知道稍大一点的用windows做服务器的就只有两种情况:一是被逼的,比如一些财经类的接收数据的….因为用卫星天线什么的收数据,只有windows的驱动.还有一种,是跟微软合作紧密,而且一开始就用的windows的系统,即便如此,他们也为windows服务器的高昂费用和不稳定性深感苦恼.我知道的这因为后一种原因上windows服务器系统的两家公司,后来都上了一半的linux机器做server. (题外话,有不少技术人员主导的创业,一开始选型的时候头脑不清醒,一种选择了windows做网站服务器后来不稳定,经常出问题.一种选择了python/ruby类的新技术,结果后来招不来人,来了人也给不起工资.我建议是,这些技术人员,要么对学新技术感到力不从心,没兴趣,要么没有团队精神.如果新创业,我建议就主流技术好了,php,jsp都行. .net吧,成本太高,一个lincense几万呢. rubyonrails呢,太新潮,团队一时半会成不了规模.)
既然服务器都用*nix系统,那你的笔记本,最好换成linux是不是?熟悉熟悉环境呗.
c.日常工作
如果您说,管理伤务太重,太多需要做PPT,画甘特图啥的,那你基本已经不是网站开发程序员了,不是受众了.如果将来您升成CEO,每天陪银行家打打高尔夫,没事去欧洲参加个达沃斯论坛什么的就行了,电脑也不需要了呀.
顺便说下,linux下的一些跟日常办公相关的替代工具(这些是我正在用的:)
邮件客户端,如果懒得换,用默认的evolution就挺好.基本就是一个outlook的翻版.我以前用它.并且用一个叫taque的GTD工具,把任务存在evolution-data-server里,这样evolution也可以提醒我.我现在用的是thunderbird 3 beta.非常好用,搜索功能很强大,界面也很漂亮.强烈五星级推荐.如果您也是苹果界面爱好者,您可以装上thunderbird的iLeopard-Mail 皮肤,很漂亮.thunderbird从2到3的这个大版本升级,很是让人惊喜.

项目管理:这个,默认的,planner.没啥好说的,我也用.团队小,用着很好,没啥不适.
截图工具:要给QA截个图报个bug?没问题,用shutter.支持截全屏,截指定窗口,截指定程序的菜单,截指定选区,截一个tips,截一个网页等,截完可以加标注,还可以一键上传到几个图片共享站和FTP站点.我需要的它全有.
网页和图片三剑客:这个,本来有gimp,但是我不习惯用.我用wine来模拟adobe的一全套软件:fireworks,dreamworks,photoshop. Macromedia是个好同志,啥东东都能用wine完美运行.而且这几个软件一来就可以试用上一个月.我一般都懒得找什么破解之类的,我就不停地试用,不停地重装(哥有毅力吧).wine工作得很好,速度也很快(我感觉比xp下快,就是不敢用wine跑IE6,那个超慢,IE7还可以接受).这么搞图片,猥琐是猥琐了点,不过我真的很喜欢~
我唯一的遗憾是:不能native地运行旺旺.虽然做为一个阿里系的,我仍然要鄙视一下阿里软件,到现在也没出一个支持mac或是linux的旺旺.这个是上班必须的,很痛苦.当然,如果你不是阿里巴巴的,也就没这个痛苦.
(另外还有点不爽的事,内网证书只能在xp下导入,无法搞到linux去,不爽)
其他工具:
Gnome-do:似乎是Linux 版的QuickSilver. 强烈推荐.这个窗口比较特殊,自动隐藏,不知道怎么截图.但是仍然强力推荐.
Docky:本身是gnome-do实现Dock效果的一套皮肤,后来独立出来,成为一个单独的软件.我觉得开发者很有功底,功能够用就好,简单极致,跟gnome-do一样,默认功能就够了, 一般人不用去做配置,这个跟一般linux程序还真不一样.那什么openbox,e17啥的,不配置简直没法用了.
easystroke:
是一个鼠标手势工具.我有一个汉王手写笔(鄙视我吧…..),用它来配置了,画个e就是启动chrome上网,画个叉是关闭窗口,画个波浪线是firefox上网.偶而无聊了偷偷懒.没什么大用.用鼠标也可以.
tomby:
linuxer们人手一个,不说了.

整理了一份招PHP高级工程师的面试题

嗯,基本上这些题都答得好 那就…
直接上题.

1. 基本知识点

  1. HTTP协议中几个状态码的含义:503 500 401 200 301 302。。。
  2. Include require include_once require_once 的区别.
  3. PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
  4. HEREDOC介绍
  5. 写出一些php魔幻方法;
  6. 一些编译php时的configure 参数
  7. 向php传入参数的两种方法。
  8. (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
  9. error_reporting 等调试函数使用
  10. 您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
  11. posix和perl标准的正则表达式区别;
  12. Safe_mode 打开后哪些地方受限.
  13. 写代码来解决多进程/线程同时读写一个文件的问题。
  14. 写一段上传文件的代码。
  15. Mysql 的存储引擎,myisam和innodb的区别。

2. web 架构,安全,项目经验

  1. 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。
  2. 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
  3. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
  4. 写出一种排序算法(原理),并说出优化它的方法。
  5. 请简单阐述您最得意的开发之作
  6. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
  7. 您是否用过模板引擎? 如果有您用的模板引擎的名字是?
  8. 请介绍Session的原理,大型网站中Session方面应注意什么?
  9. 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
  10. 正则提出一个网页中的所有链接.
  11. 介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。
  12. 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。
  13. 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
  14. 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
  15. 一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

3. unix/linux 基本使用

  1. linux下查看当前系统负载信息的一些方法。
  2. vim的基本快捷键。
  3. ssh 安全增强方法;密码方式和rsa key 方式的配置。
  4. rpm/apt/yum/ports 装包,查询,删除的基本命令。
  5. Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。
  6. gdb,strace,valgrind的基本使用.

4. 前端,HTML,JS

  1. css盒模型。
  2. javascript中的prototype。
  3. javascript中this对象的作用域。
  4. IE和firefox事件冒泡的不同。
  5. 什么是怪异模式,标准模式,近标准模式。
  6. DTD的定义
  7. IE/firefox常用hack.
  8. firefox,IE下的前端js/css调试工具。

好色的程序员:怎么加上彩色显示

问题列表

1.终端如何支持显示彩色
     现代终端基本上都已经支持彩色显示了。【8色的显示屏是什么时候发明的?】 您可以在bash下用这段来试试:<coolcode>
echo -e “33[40;32mcolored text33[0;0m”
</coolcode>
如果这里出来的是彩色文字,那就说明您的终端是支持彩色显示的。如是没有出来彩色文字,那就,改您的终端类型。一般情况下您的终端软件可选的有vt100,vt102,vt220,vt320,linux,xterm等几种。我一般选linux.
2.终端颜色和颜色表:
   要在终端中显示彩色文字,需要这样输出<coolcode>
ESC[attr;frontcolor;backgroundcolor;m

要加彩色的文字。
</coolcode>

ESC是ESCAPE键,它的ASC码是十进制的27,八进制的33.所以我们用echo -e “33…”来输入。attr是要给文字设置的属性代号,frontcolor是文字颜色代号,backgroundcolor是文字背景色代码。这些代号及意义如下:
<coolcode>

  前景             背景              颜色 
   ————————————— 
   30                40               黑色 
   31                41               紅色 
   32                42               綠色 
   33                43               黃色 
   34                44               藍色 
   35                45               紫紅色 
   36                46               青藍色 
   37                47               白色 

   代码              意义 
   ————————- 
   0                 OFF 
   1                 高亮显示 
   4                 underline 
   5                 闪烁 
   7                 反白显示 
   8                 不可见 
</coolcode> 
2.PS1,ls ,grep 如何加彩色
  PS1是bash一个特殊的变量,用来指定提示符。我们只要修改它的值就可以指定提示符如何显示。在这里h表示主机名,u表示当前用户,w表示当前目录。我的设置是:
<coolcode>export PS1=”[e[36;1m]u@[e[32;1m]H>:w>[e[0m]”</coolcode> 

这里bash的提示符已经变成彩色了,但是ls的输出还不是彩色的。也很简单,man一下就知道了,在linux下,

<coolcode>alias ls=”ls –color=auto”</coolcode>就行了。在FreeBSD下,<coolcode>alias ls=”ls -G”</coolcode>即可。

grep也是支持彩色的:
<coolcode>
alias grep=”grep –color=auto”
</coolcode> 
好了,现在我们可以把~/.bashrc文件 改一下:
<coolcode>
export PS1=”[e[36;1m]u@[e[32;1m]H>:w>[e[0m]”
alias ls=”ls –color=auto”
alias grep=”grep –color=auto”
</coolcode> 
 

2.svn diff怎么加彩色:
我写了一个脚本,放在http://xurenlu.googlecode.com/files/svncolor.py这里。只需要svn diff|python svncolor.py即可把svn diff的结果转成彩色的。

3.git diff怎么加彩色
git diff加颜色非常简单:修改.git/config,加上
<coolcode>
[diff]
    color = auto 
</coolcode> 

4.vim 怎么支持彩色
非常简单,如果是php文件:
<coolcode>
:set ft=php
:set syntax
</coolcode> 
就行了。 

6.怎么去彩色
为什么要去颜色呢,因为有时候我们需要把一些输出重定向到vim中间,这时在vim中会出现很多控制字符。所以我们要再转成黑底白字。
我这里也有一个脚本。 
<coolcode>
#!/usr/bin/python
import sys,re
PESC=chr(27)
nocolor_re=re.compile(PESC+'[[d;]+m’)
if __name__==”__main__”:
    while(True):
        line=sys.stdin.readline()
        if not line: break
        line=line.replace(“n”,””)
        print nocolor_re.sub(“”,line)
</coolcode>

完整解决vim不能记住上次的位置的问题

症状:
不能记住上次的位置: vim a 移到到第n行。关闭,再打开.vim 又回到了第1行。
跨文件复制粘贴时,报“寄存器里没有东西”.在文件a里复制,退出,打开b文件按P,无法复制。

解决:

1.在vim中输命令

:version

确认编译选项中有+viminfo.
2.若是ubuntu系统,请用update-alternatives –config vim 查看vim的具体版本。ubuntu有vim有vim.tiny,vim.gnome,vim.gtk等多个版本。如果是vim.tiny,将不支持 viminfo.[vim.tidy不支持很多特性,建议装完ubuntu即切换到vim.gnome.命令:update-alternatives –config vim]

3.在~/.vimrc文件中确认加上了:


au BufReadPost * if line(”‘””) > 0|if line(”‘””) <= line(”$”)|exe(”norm ‘”")|else|exe “norm $”|endif|endifset viminfo=’1000,f1,<500

4.请ls ~/.viminfo ,结果大致如下:

-rw——- 1 renlu renlu 7.5K 2009-06-05 14:29 /home/renlu/.viminfo

请确保:

a.用户属主是你。
b.文件属性是–rw——..,如果不是,请chmod 0600 ~/.viminfo

附:
今天遇到的问题是/home/$USER 目录满了,无法写入东西,.viminfo文件也不再被允许写入。这样跟.viminfo文件权限问题的表现是一样的。

archlinux 配置声卡

1.最新的内核已经将alsa包含了进去,我们不再需要安装alsa了,只需要安装alsa相关的工具就行了:
pacman -S alsa-lib alsa-utils alsa-oss
2.安装好以后就可以用alsaconf进行配置:
sudo alsaconf
这个基本没啥好说的,一路回车就OK了。
3.设置音量并保存
sudo alsamixer
sudo alsactl store
4. 设置alsa随系统启动
编辑/etc/rc.conf在DAEMONS里添加alsa, 如
DAEMONS=(syslog-ng network netfs crond kdm gpm alsa)
5.最最大的问题:
(在这里我花了大半天的时间,我公司里的HP的本,即不是很老,也没有我家里的正常工作的本本新,就是不出声,配置过程中也不点儿都没看到错误信息)
Archlinux下用alsaconf检测时,会把主板的那个只会吱吱响的东东识别成一个声卡,所以经常检测出来是两张声卡。现在我们要做的是,把这个破“声卡“干掉。
办法:
编辑/etc/rc.conf, 在MODULES=(…)一行中,在snd-pcsp的前面加一个感叹号,就是不自动加载这个模块的意思。老版本的使用MOD_BLACKLIST来达到这个效果。
再重启,马上发现声卡就很好使了!

Linux/Windows双系统并存方案:andLinux (不是虚拟机也不是双系统哦)

andLinux介绍:
1:来自linuxtoy:是一个基于 Ubuntu 的自由软件项目,其目的是让你不需要使用诸如 VMWare 之类的虚拟机就可以在 Windows 下运行 Linux,而且最有意思的是,你可以同时使用 Windows 和 Linux 而不需要像使用虚拟机那样来回切换!
2:andLinux实际上是Colinux的一个包装。coLinux是一个修改过的linux内核,修改后成为windows下的一个应用程序。然后其它linux进程就在这个内核的管理下运行。所以,这个colinux里运行的程序所能访问到的硬件就很有限了。但是colinux里跑的程序并不需要经过修改,也就是说,colinux里可以通过apt,yum等方式来安装,使用的就是debian,ubuntu,fedora的源。
3.andLinux基于colinux,是专门用coLinux来跑Ubuntu的。目前的版本就是Ubuntu 7.10,gutsy.和colinux相比,andLinux进行了一些更友好的设置,比如colinux默认的tap设备的ip取的太常见了,很多人装上就和原有网段冲突,andLinux就改的很好。
我已经成功地在XP sp2上安装好了andlinux.并成功设置好了中文显示和中文输入。具体过程介绍一下:
a:安装andLinux Kde版。有一步骤是要选择linux和windows的通信方式。我选择了cofs,并设置了D盘。
b:启动andLinux,然后注意看网上邻居里新增的网卡。这个网卡可能打开了防火墙。注意随时关闭这个防火墙。如果防火墙没有关闭,你将无法通过Xming运行需要X环境的软件。
c:安装中文环境:
以下从这里学来,感谢之.

首先,升级andLinux
sudo apt-get update
然后安装中文基本包
sudo apt-get install language-pack-zh
再安装kde的基本中文包
sudo apt-get install language-pack-kde-zh-base language-pack-kde-zh

d:设置字体:
安装wqy:
apt-get install xfonts-wqy
运行kcontrol,设置字体和区域。
e:好了,现在再启动andLinux应该能够显示中文了。但是中文还是无法输入啊!别着急,嘿嘿。
设置环境变量:

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games”
LANG=”zh_CN.UTF-8″
LC_ALL=”zh_CN.UTF-8″
LANGUAGE=”zh_CN.UTF-8″
export XMODIFIERS=@im=fcitx

注意照着修改。嘿嘿。接着安装fcitx:
apt-get install fcitx.
f:试试:重新启动andLinux,在终端运行fcitx &;怎么样,是不是出现了fcitx的小窗口?
恩,试试!
结果,还是打不出来中文啊!我试了好几次发现,fcitx也使用Ctrl+space切换的。于是,我先把windows的输入法换到英文,然后鼠标点击fcitx窗口的企鹅图标,哈哈,中文输入能用了!再按Ctrl+space,就能切换linux下的中英文了。
这里注意:如果fcitx启动了没报错却没有看到fcitx的窗口,请在windows里点击快速启动按钮的”回到桌面”小图标,这样所有窗口就都最小化了,这时再打开andLinux的终端。现在就能看到了。
好了,上几个图:

xfce4-terminal:


kcontrol:(现在我觉得kde也挺漂亮的嘛)

根据我的使用经验来看,确实值得一用。我最终选择XP+andlinux这样的方案的考虑是因为:在windows下我的声卡显卡都能发挥到最好,而且我可以玩下游戏腐败一下。另外我的手机和相机什么的设备也可以很好的工作。而且,作为一个网页开发人员,我确实需要IE.因此xp+andlinux是我最好的组合了。现在我启动andLinux主要是用一下终端下的vim,来搞搞编程。另外一些网络服务(lighttpd+php),运行在andlinux下。

Linux 声卡设置(喇叭和耳机同时出声的解决)

本本声卡比较新,windows下装上官方驱动才能使,在linux倒是有声,就是音箱和耳机一起响,上班时没法听音乐。后来终于解决了这个问题,记录一下过程:

1:
运行lsmod|grep snd,结果是:
snd_hda_intel 457780 4
snd_usb_audio 100608 0
snd_usb_lib 24960 1 snd_usb_audio
snd_rawmidi 30336 1 snd_usb_lib

事先知道声卡就是intel了,那就只记下第一行的snd_hda_intel这个名称。

2.
然后再查看:
cat /proc/asound/card0/codec#1|head
结果是:
Codec: Realtek ALC883
Address: 1
Vendor Id: 0x10ec0883
Subsystem Id: 0x10190000


接着下载alsa源代码中的一个文档,我是下载了alsa-driver的源码代码,然后在
alsa-driver-1.0.16/alsa-kernel/Documentation/中找到了ALSA-Configuration.txt
文件。
然后:
vim ALSA-Configuration.txt ,
搜索alc833,找到:
ALC883/888
3stack-dig 3-jack with SPDIF I/O
6stack-dig 6-jack digital with SPDIF I/O
3stack-6ch 3-jack 6-channel
3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
6stack-dig-demo 6-jack digital for Intel demo board
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
acer-aspire Acer Aspire 9810
medion Medion Laptops
medion-md2 Medion MD2
targa-dig Targa/MSI
targa-2ch-dig Targs/MSI with 2-channel
laptop-eapd 3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE)
lenovo-101e Lenovo 101E
lenovo-nb0763 Lenovo NB0763
lenovo-ms7195-dig Lenovo MS7195
haier-w66 Haier W66

好了,我的本本就是haier的,估计haier的就都是用的同一种芯片。于是我记下,haier-w66。
3:
再打开:vim /etc/modprobe.conf
加入一行:
options snd-hda-intel model=haier-w66
再重启,音箱和耳机可以单独控制音量了。

由于系统的不同,上面的各文件的路径可能略有不同。

Spread学习系列[1]-SP_receive函数说明

接在Spread 简介(试译)之后,我跟啃骨头一样一点点儿地把SP_receive的man文档看完了。
这是我做的笔记,基本就是原文翻译,但是我英文太差,翻得太烂了点:(
SP_receive
NAME
SP_receive, SP_scat_receive – Receive message from Spread

SYNOPSIS
#include

int SP_receive( mailbox mbox, service *service_type, char sender[MAX_GROUP_NAME], int max_groups, int *num_groups, char groups[][MAX_GROUP_NAME], int16 *mess_type, int *endian_mismatch, int max_mess_len, char *mess);

int SP_scat_receive( mailbox mbox, service *service_type, char sender[MAX_GROUP_NAME], int max_groups, int *num_groups, char groups[][MAX_GROUP_NAME], int16 *mess_type, int *endian_mismatch, scatter *scat_mess);

DESCRIPTION
SP_receive 函数主要实现接收消息的功能。这个函数不仅接收数据消息,也接收成员关系数据。当前连接所在的所有组的消息都会到达同一个
“收件箱”,因此SP_receive函数一次会从任意一个组中间取回一条消息。当接收完成后,一些成员变量会被设置值,以标记这条消息的各种属性。
因为这个函数是程序从spread 系统中取回消息的唯一渠道,因此在Spread中的应用也是最复杂的。基于这条消息是数据消息,还是成员关系消息,许多
参数的含义都会改变。
没有消息到达的时候,SP_receive函数会阻塞。
mbox参数指定了要在哪个(spread)连接上获取消息。Service_type是指向一个变量的指针,这个变量会
指出当前接收到的消息是”数据消息“,还是成员关系消息。这个变量要么是REG_MESSAGE,要么是
MEMBER_SHIP_MESS,当然会是特定的类型.这个变量也是一个输入参数,在一般的情况下应该被置为0。如果您置为”DROP_RECV”,则表示您愿意接收“不可信消息”,这可能导般如果为消息或组列表分配的缓冲不够的话,消息会被清空。更多关于DROP_RECV的介绍会在后面提到。
后面的参数的含义是依赖于service_type这个变量的取值的.如果service_type的取值是REG_MESSAGE(比如数据消息),那么:
sender参数是一个指向字符的指针,至少需要能容纳MAX_GROUP_NAME个字符。(很拗口吧?其实就是一个长度至为MAX_GROUP_NAME的字符串…)
这个参数将会被设置成为消息发送方的名称(它的组内名称)
max_groups参数是你为groups参数分配的地址所能容纳的最大的组的个数。
Num_groups是一个整型指针,指向在groups参数中返回的组的个数。
groups 参数可以容纳max_groups个组名,每个组名是一个最多有MAX_GROUP_NAME个字符的字符串。所有接收这个消息的组都会被更在这儿,除非数组太小(此时groups尽可能多地接纳至到它满了为止,并且
num_groups会设为负的值).比如,如果你的groups数组能接收5个数组名,而这个消息被7个组接收,前5个组的名字会存在groups这个数组中,num_groups会被设为-7.

真正的消息内容存在命名为mess的缓冲区中,这个缓冲区最少要有max_mess个字节。如果接收的消息的长度要比这个缓冲区大,默认将会返回BUFFER_TOO_SHOFT错误,并在endian_mismatch字域中提供需要的长度。如果DROP_RECV标记被在service_type中传进来,那么mess会尽量多地存储消息内容,多余的内容会被丢弃掉,同时,SP_receive的返回值会指示一个错误。如果使用SP_scat_receive,那么mess和length参数会被一个scat_mess scatter结构体所取代,这个结构会存储它收到的消息和消息的长度。它们会被以接收的次序存储。
如果是MEMB_MESSAGE(比如,成员关系消息),并且特别指出是TRANS_MESS,那么:
sender这个字符数据(字符串)就会设置为成员关系发生变化的组的名字。
max_groups和max_mess_len参数没有用,num_groups会是0,而groups参数因为当前正处于变动之中,暂时没有
了正常的组,由sender参数取代。mess_type参数设为-1,endian_mismatch参数为0(也因为组关系处于变动之中).mess参数只包含
关系变化作用的group的group_id。因此消息体就是:
group_id;

因此本质上你所得到的信息就是通过sender参数和group_id值反映的哪个组产生了变动。

TRANS_MEMB_MESS 的重要性在于,它告诉应用程序,在它之后,在来自同一组的REG_MEMB_MESS之前,接收到的消息都是’clean up’消息,这些消息在真正改变成员关系之前需要保持常态。请阅读其他文档或研究文献以得到更多相关资料。

如果这是一条MEMB_MESSAGE(比如成员关系消息)并且指定了是REG_MEMB_MESS,那么:
sender 字符数组指定了成员关系发生改变的组的名称。
max_groups和max_mess_len参数的含义跟前面一样,mess_type参数设定为当前进程在组成员数组中的索引。endian_mismatch会再次设为0.
groups参数和mess内容用来提供当前组内发生的变化的两种信息。num_groups参数设置为新成员关系中的当前组的成员数(指变动发生后)。相对地,groups 这个数组会被设置为新成员关系中当前组的所有成员的组内名称。这个名称的顺序常常是按接收方的顺序排序的,这样当程序需要一个做代表时就能取一个出来。不同的Spread版本的顺序不同,当前版本的首先按连接到守护进程的顺序,其次是它的私有名称。守护进程的顺序是按照它们在spread.conf文件中列出来的顺序排列的。
第二类信息存储在消息体中,提供了当前进程中所有私有组名称,这些名称从原来的成员关系迁到了新的成员关系中。
所有的内容都一个挨一个地放在message缓冲中。因为这个结构在各个版本中经常变,最好的处理办法就是使用
我们提供的解析函数来将消息体翻译成定义好的描述成员关系的结构体。解析函数有两个变量,一个用来处理字
节流,一个用来处理scatters格式的消息体。
SP_get_memb_info
SP_get_vs_sets_info
SP_get_vs_set_members
SP_scat_get_memb_info
这四个函数填入标准的应用程序用来设置以成员关系的gid和vs信息的结构体。
SP_scat_get_vs_sets_info
SP_scat_get_vs_set_members

这样,如果一个程序需要得到它自己的vs_set(Spread版本4之前提供的信息),他们可以被两个函数调用来文档化。先用SP_get_memb_info然后用SP_get_vs_set_members;

每个vs_set定义成若干成员和一个成员关系字符数组(字符串)。这个数组的类型是char members[][MAX_GROUP_NAME];
每个成员关系型的消息都可能含有一系列的vs_sets,当一个网络合并动作发生时,几个不同的部分可能同时发生合并,每个区块都有它自己的成员集合,这些既有旧成员关系的又有新成员关系的。
如果你想自行解析这个成员关系消息内容,下面的段落指出了当前的数据格式。这个格式肯定会改变(过去已经改变过好几次了),我们不对未来的改变做保证。如果您想自行解析数据,在更新Spread的版本时您需要更新您的代码。
成员关系消息体包含以下几段(它们是有顺序的)。每一段数据都是一个结构体,或者是一个整数(是整数时,一定是一个32位无符号的整数)。vs sets是这样定义的:
group_id gid;
unsigned int num_vs_sets;
unsigned int local_vs_set_offset;
以及一系列vs_sets;
所有的vs_sets都序列地存在成员关系消息体中,读完了一个vs_set,另一个vs_set就在下一个字节开始了。
每一个vs_set都以一下整数num_vs_members开始,因而程序能够得到members数组的长度来进行读取。
unsigned int num_vs_members;
char members[][MAX_GROUP_NAME]

vs_set members数组有num_vs_members个组名,每一个都是一个固定长度的字符串。vs_set members
数组的内容取决于成员关系变更的类型:
CAUSED_BY_JOIN:
vs_set包含有加入进来的进程的私有组名。
CAUSED_BY_LEAVE:
vs_set包含有退出的进程的私有组名。
CAUSED_BY_DISCONNECT:
vs_set 包含有关闭连接的进程的私有组名。
CAUSED_BY_NETWORK:
vs_set包含有形成新成员关系的各个成员组的组名称。每个加入的成员集合都有一个vs_set对应。包含有本地应用程序的私有组名的vs_set会有后来加入的成员。
如果这是一条MEMB_MESSAGE但是既不是REG_MEMB_MESS也不是TRANS_MEMB_MESS,那这就表明这种情形是接收消息的成员离开了组,这是一条通知消息。这种有时被称作”闪人通知”。
这个成员刚刚离开的组的成员们会收到一个正常的TRANS_MEMB_MESS,REG_MEMB_MESS消息对,就跟前面描述的一样。
SP_receive的参数如下:
sender参数就是成员关系发生改变的组的名字。
mess_type and endian_mismatch fields will again be set to 0.
max_groups和max_mess_len参数的含义与原来一样,mess_type和endian_dismatch参数再次置为0.
groups数组和消息体提供发生变动的组的两种信息。num_groups会置为0,groups数组会置为0(既然这个成员不再是组的一个成员了。mess的消息体内容也是空。

返回值:返回返回消息的长度(当成功时)或在失败时返回以下任何一个:
ILLEGAL_SESSION
指定的mbox不正确。
ILLEGAL_MESSAGE
消息包含一个正常的结构,比如一个scatter结构没有正确填充。
CONNECTION_CLOSED
在通信时发生了连接错误,接收无法完成。
GROUPS_TOO_SHORT
如果你的groups数组设定的太小了无法存下返回的数组,会返回一个GROUPS_TOO_SHORT的错误。
这时num_groups会返回负数。
BUFFER_TOO_SHORT
如果消息体缓冲(mess)设置的太短,存不下返回的消息时,会返回这个错误,就会返回这个错误,同时endian_mismatch参数会设置为需要的缓冲的长度。