Warning: curl_exec() has been disabled for security reasons in /pub/host/sunboyu/sunboyu/www/wp-includes/http.php on line 1022
一个程序猿 孙小一,孙小二,PHP,MYSQL,LINUX,APACHE,原创技术,扯淡

新浪微博产品的部分功能分析

作者 : admin 于 2011年05月23日, 23:30:06
2011
05-23

最近比较关注新浪微博,虽然我使用比较多的是qq微博,微博也是社区的一个变形。

早在博客流行的时候,我跟同事们讨论了社区的形态:以主题分类为根的公告板,到以用户为根的博客。从以用户关系为根的sns,到以简单内容为根的微博。社区离开不以下几个元素:人、内容,在内容上构建话题,话题分类,在人上构建关系。

新浪微博以人的内容为主体,以话题为聚合,以新的内容展示方式创造了一个全新的社区,社区的特点是消息的传递更佳迅速,消息的传递途径以人的关系为基础。

基础内容和用户关系使这个社区异常活跃,但在微博发展中,微博也衍用了传统社区的一些功能。

排行榜、热门话题、热门标签是内容人工[或者程序]整理的一个关键词聚合页面,通过人工[或者程序]的方式归纳出热门的话题词汇,可方便用户关注整站最热话题。

名人堂、名人/草根/达人排行榜则是以用户不同形势的行为为依据进行归档排序,使用户可以找到社区内的活跃分子,同时也作为了社区潮流的风向标。

我最关注的是其娱乐功能:勋章功能。勋章类似mmorPG游戏的任务系统,用户通过完成任务取得勋章。而勋章则非常类似成就系统,熟悉魔兽世界的玩家对此应该非常熟悉。

跟很多社区系统一样,新浪微博开放了api功能,使得更多的应用进入了社区,包括很多游戏功能。

当今社区已经不单是信息的聚合平台,更多的功能会使其拥有娱乐的性质,即我们常说的”社区游戏化“;

easyui 在线演示

作者 : admin 于 2011年05月13日, 10:19:04
2011
05-13

easyui不如extjs,有在线演示,我找了很久, 没找到一个好用的演示,自己顺手做了一个,希望大家喜欢。

http://www.sunboyu.cn/easyui-1.2.3/index.html

绯闻是如何产生的-也说营销

作者 : admin 于 2011年05月09日, 17:37:14
2011
05-9

查看我的简历

五分钟写了个小玩意,希望大家喜欢

php和mysql guid的应用

作者 : admin 于 2011年04月24日, 19:00:07
2011
04-24

  GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。 GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。
  在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如如注册表项、类及接口标识、数据库、系统目录等对象。

php中并没有标准的guid,只是有个函数 uniqid() 生成唯一id。而在mysql中有函数生成guid:SELECT UUID()

兼容ie678 ff chrome的浮动层控制

作者 : admin 于 2011年04月23日, 18:38:14
2011
04-23

经过测试组严格测试的,其他浏览器还不清楚,依赖jquery

  1. if(typeof document.all !== "undefined") {   //IE
  2.     var left    = document.documentElement.scrollLeft;
  3.     var top     = document.documentElement.scrollTop;
  4.     drag_x = event.clientX;
  5.     drag_y = event.clientY
  6.     
  7. } else {    //FF,Chrome,Opera,Safari
  8.     var left    = document.documentElement.offsetLeft;
  9.     var top     = document.documentElement.offsetTop;
  10.     drag_x = e.pageX;
  11.     drag_y = e.pageY;
  12. }
  13. var tipsDiv = '<div class="tipsClass"><img src="http://pic.xoyo.com/zt/rt/mapdesign/load.gif" /></div>';
  14. $( 'body' ).append( tipsDiv );
  15. $( 'div.tipsClass' ).css({
  16. 'top' : (top+drag_y) + 'px',
  17. 'left' : (left+drag_x) + 'px',
  18. 'position' : 'absolute',
  19. 'padding' : '3px 5px',
  20. 'background': '#8FBC8F',
  21. 'font-size' : 12 + 'px',
  22. 'margin' : '0 auto',
  23. 'text-align': 'center',
  24. 'width' : 'auto',
  25. 'color' : '#fff',
  26. 'opacity' : '0.8'
  27. }).show();

作者 : admin 于 2011年04月10日, 23:12:16
2011
04-10

高亢的号角是集结的信号

黑夜里,一齐冲向目标

团结是信仰

即时面对猎人的枪

–应用文写作课堂随笔

mysql_udf_tc 未测试发布版

作者 : admin 于 2011年03月18日, 11:11:39
2011
03-18

受伤了,没时间折腾,先发布未测试版,欢迎各种bug提交,康复后继续

mysql数据同步到tc的table表,直接写文件,php读文件查询。

看手册,不解释。

有问题加qq 176300676

  1. #ifdef STANDARD
  2. #include <stdlib .h>
  3. #include <stdio .h>
  4. #include <string .h>
  5. #ifdef __WIN__
  6. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  7. typedef __int64 longlong;
  8. #else
  9. typedef unsigned long long ulonglong;
  10. typedef long long longlong;
  11. #endif /*__WIN__*/
  12. #else
  13. #include <my_global .h>
  14. #include <my_sys .h>
  15. #include <m_string .h>
  16. #endif
  17. #include <mysql .h>
  18. #include <ctype .h>
  19.  
  20. #include <float .h>
  21.  
  22.  
  23. #include <tcutil .h>
  24. #include <tctdb .h>
  25. #include <stdlib .h>
  26. #include <stdbool .h>
  27. #include <stdint .h>
  28.  
  29.  
  30.  
  31. #ifdef HAVE_DLOPEN
  32.  
  33. /*   TC_CREATE    */
  34. my_bool tc_create_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  35. {
  36. return 0;
  37. }
  38.  
  39. void tc_create_deinit(UDF_INIT *initid)
  40. {
  41. }
  42.  
  43. char * tc_create(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  44. {
  45. TCTDB *tdb;
  46. int ecode;
  47.     char *errormsg;
  48. char *tcfile;
  49. tdb = tctdbnew();
  50.  
  51. tcfile = args->args[0];
  52.  
  53.     /* open the database */
  54.     if(!tctdbopen(tdb, tcfile, TDBOWRITER | TDBOCREAT))
  55. {
  56.         ecode = tctdbecode(tdb);
  57.         sprintf(errormsg, "error: %s\n", tctdberrmsg(ecode));
  58.  
  59.     }
  60. else
  61. {
  62. sprintf(errormsg, "OK");
  63. }
  64. *length = strlen(errormsg);
  65. return errormsg;
  66. }
  67.  
  68. /*   TC_SET    */
  69. my_bool tc_set_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  70. {
  71.   if (args->arg_count < 3)
  72.   {
  73.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  74.     return 1;
  75.   }
  76.   return 0;
  77. }
  78.  
  79.  
  80. void tc_set_deinit(UDF_INIT *initid)
  81. {
  82. }
  83.  
  84.  
  85. char *tc_set(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  86. {
  87. char *dbfile,*errormsg,pkbuf[200];
  88. TCTDB *tdb;
  89. TCMAP *cols;
  90. int i = 0;
  91. int ecode,pksiz;
  92.     memcpy(result, "result string", 13);
  93.     *length = 13;
  94.  
  95. dbfile = args->args[0];
  96.  
  97. tdb = tctdbnew();
  98.  
  99.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  100.         ecode = tctdbecode(tdb);
  101.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  102.     }
  103.  
  104. cols = tcmapnew();
  105.  
  106. for(i = 2;i<args ->arg_count;i++)
  107. {
  108. tcmapput2(cols, args->attributes[i], args->args[i]);
  109. }
  110. pksiz = sprintf(pkbuf,"%s",args->attributes[1]);
  111. if(!tctdbput(tdb, pkbuf, pksiz, cols)){
  112.         ecode = tctdbecode(tdb);
  113.         sprintf(errormsg,"put error: %s\n", tctdberrmsg(ecode));
  114.  
  115.     }
  116. else
  117. {
  118. errormsg = "OK";
  119.  
  120. }
  121.     tcmapdel(cols);
  122.  
  123. if(!tctdbclose(tdb)){
  124.         ecode = tctdbecode(tdb);
  125.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  126.     }
  127. *length = strlen(errormsg);
  128. return errormsg;
  129. }
  130.  
  131. /*   TC_DEL    */
  132. my_bool tc_del_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  133. {
  134.   if (args->arg_count < 2)
  135.   {
  136.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  137.     return 1;
  138.   }
  139.   return 0;
  140. }
  141. void tc_del_deinit(UDF_INIT *initid)
  142. {
  143. }
  144. char * tc_del(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  145. {
  146. TCTDB *tdb;
  147. char *dbfile,*errormsg,*pkbuf;
  148. int ecode;
  149.  
  150. dbfile = args->args[0];
  151. pkbuf = args->args[1];
  152.  
  153. tdb = tctdbnew();
  154.  
  155.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  156.         ecode = tctdbecode(tdb);
  157.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  158.     }
  159. if(!tctdbout2(tdb,pkbuf))
  160. {
  161. ecode = tctdbecode(tdb);
  162.         sprintf(errormsg,"delete error: %s\n", tctdberrmsg(ecode));
  163. }
  164. else
  165. {
  166. errormsg = "OK";
  167. }
  168. if(!tctdbclose(tdb)){
  169.         ecode = tctdbecode(tdb);
  170.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  171.     }
  172. *length = strlen(errormsg);
  173. return errormsg;
  174.  
  175. }
  176. /*   TC_SETINDEX    */
  177. my_bool tc_sexindex_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  178. {
  179.   if (args->arg_count < 2)
  180.   {
  181.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  182.     return 1;
  183.   }
  184.   return 0;
  185. }
  186. void tc_sexindex_deinit(UDF_INIT *initid)
  187. {
  188. }
  189. char * tc_sexindex(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  190. {
  191. TCTDB *tdb;
  192. char *dbfile,*errormsg,*pkname[200];
  193. int ecode,indextype;
  194.  
  195. dbfile = args->args[0];
  196. *pkname = args->attributes[1];
  197.  
  198. tdb = tctdbnew();
  199.  
  200.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  201.         ecode = tctdbecode(tdb);
  202.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  203.     }
  204.     if(args->args[2]=="string")
  205. {
  206. indextype = TDBITLEXICAL;
  207. }
  208. else if(args->args[2]=="int")
  209. {
  210. indextype = TDBITDECIMAL;
  211. }
  212. if(!tctdbsetindex(tdb,*pkname,indextype))
  213. {
  214. ecode = tctdbecode(tdb);
  215.         sprintf(errormsg, "setindex error: %s\n", tctdberrmsg(ecode));
  216. }
  217.  
  218. if(!tctdbclose(tdb)){
  219.         ecode = tctdbecode(tdb);
  220.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  221.     }
  222. *length = strlen(errormsg);
  223. return errormsg;
  224. }
  225. #endif /* HAVE_DLOPEN */
  226. </args></stdint></stdbool></stdlib></tctdb></tcutil></float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译安装脚本,自理

  1. #!/bin/sh
  2. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I/opt/tokyocabinet-1.4.46/include -I. -shared -L/usr/lib -ltokyocabinet -lz -lbz2 -lrt -lpthread -lm -lc  udf_tt.c -o lib_mysqludf_tt.so
  3. #gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -static udf_tt.c -o lib_mysqludf_tt.so
  4. cp -f ./lib_mysqludf_tt.so /usr/lib/lib_mysqludf_tt.so
  5. service mysqld restart

使用:

  1. drop function tc_create;
  2. create function tc_create returns string soname 'lib_mysqludf_tt.so';
  3.  
  4. drop function tc_set;
  5. create function tc_set returns string soname 'lib_mysqludf_tt.so';
  6.  
  7. select tc_set("/home/sunboyu/test",`User`,`Host`) FROM user limit 1

谈我喜欢的作家-郑渊洁

作者 : admin 于 2011年03月07日, 23:31:01
2011
03-7

离开校园已经多年,书却一直伴我左右。从《科幻世界》到《飞碟探索》,从教科书到各种工具书;书卖了一批又一批,可办公桌和家里的书箱里总有沉甸甸的一摞书。

社会的竞争是残酷的,我更感觉到了“书到用时方恨少”的涵义。利用业余时间,我又走进了大学校园。令我惊讶的是,计算机专业居然开了语文课,我也碰上了一个国字脸上驾着金丝眼睛、白白净净满腹经纶的大学语文老师。

由于年初的一点意外,我没能赶上第一节课,不过我依然感受到这个老师的渊博-也许更因为我是工科生。

课间与老师攀谈,得知上次课后作业,随课上话题思路,遂写此文。

我喜欢书,毕业后每年买书的花费都近千元。当然大部分是计算机书籍,偶尔也在西三旗桥头买几本二手杂志,怀念一下青春。最近又喜欢上过期期刊,全新杂志但价格却不及全假三分之一。

要说我读过的书,可为杂而又杂:小说故事、杂文、诗歌;王朔的《过把瘾》、琼瑶的《碧云天》、长河落日刀等不知名的武侠故事。

要说我最喜欢那个作家,第一个下意识闪现的人物,就是郑渊洁。

平时我做心理测试,我的心理年龄远远超过了生理年龄:我在小学的时候让父亲带着我到石家庄最大的新华书店:中山路新华书专程去买一本小说:《奔腾验钞机》(后改名《我是钱》)-售货员惊讶,这么小的孩子爱看这种书!

其实爱上郑渊洁正是因为这部小说。当时父亲花几毛钱给我买了一本《童话大王》,里边节选了《奔腾验钞机》50元钞的经历。以一张钱的眼光来看世界,我被这个小说深深吸引了。

随着时光流逝,那本《奔腾验钞机》已经被我翻得惨不忍睹,中学的时候我也曾去书店寻找郑渊洁其他作品,但由于手头的拮据而不得放弃。

大学毕业后,得力于网络的便捷,我几乎阅读了郑渊洁所有的作品,被他的笔锋所深深得震撼。

他的笔法很犀利、尖刻,我总用鲁迅的作品来形容他的作品:他们的作品都是时代的匕首-鲁迅的作品作为一把手术刀在剔出社会的毒瘤,而又以一剂良药来治疗麻木的人;而郑渊洁的作品也非常尖刻得揭露一些社会现象给予讽刺,又赞扬了一些高尚的情操,凸现人性的美好。

《奔腾验钞机》这部作品以钱为第一视角,用其擅长的童话的方式去阐述不同的故事。这些故事深刻批判某些自私贪婪、拜金享乐型人群,这部小说描写人物心理活动比较多,通过人物心理的细腻揣摩和描写,使读者的内心与故事产生共鸣。

《飞马牌汽车》也是我喜欢的一部小说。书中大量夸张的描写批判了官僚主义、教条主义的思想,整部作品夸张让人忍俊不禁、却又阐明了作者此文的主旨。

郑渊洁的人也跟其作品一样:豪放、犀利。他儿子可直呼其名;儿子没有上学却自学成才;愤世嫉俗、远离污秽,为人低调不近商业活动。

也许、我喜欢的就是他的性格;他的书是我们心灵沟通的桥梁。

结合逍遥问问讲解如何利用LoadRunner进行性能测试

作者 : admin 于 2011年01月27日, 10:33:44
2011
01-27

最近群里聊到测试,我也拿公司测试部门的一个文档分享。我们测试组4个MM,负责平时的功能测试,性能测试和安全测试。既有很萌的测试主管,又有彪悍的千杯不醉,还有海吃不胖的瘦弱女生,包括由行政转为技术的全才。

PPT主要得靠演讲人的口述才能理解,这里PPT写的也比较详尽,大家可以看出一些功能和流程上的东西。

PPT部分内容删除,包括产品业务流程图,设计敏感账号和我们一些IP信息,不过不影响阅读。

附加一句:得用WPS打开。没装WPS的可以来这里下载 http://www.wps.cn/

顺便宣传我们的产品 逍遥问问

PPT下载

利用udf扩展mysql增加json_object函数

作者 : admin 于 2011年01月23日, 21:47:57
2011
01-23

其实已经有一个成形的mysql json编码的模块 http://www.mysqludf.org/lib_mysqludf_json/index.php

不过我们在使用的过程中,发现这个函数有版本兼容的问题,后看代码,发现它的json加密规则比较麻烦,没拆出来分析,就自己使用一个json类 http://sourceforge.net/projects/cjson/ 重写了一遍json_object函数。

目前在mysql-5.0.22版本上使用基本没问题,但在mysql5.5以上版本会有问题,udf接口格式好像有了变化。

mysql-5.0.22版本给出的例子是c++的代码。使用了extern语法,为了兼容gcc的语法。而我实际使用纯C环境,就抛弃了extern的语法。

udf_json源码下载

  1. file:udf_json.c
  2. #ifdef STANDARD
  3. #include <stdlib .h>
  4. #include <stdio .h>
  5. #include <string .h>
  6. #ifdef __WIN__
  7. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  8. typedef __int64 longlong;
  9. #else
  10. typedef unsigned long long ulonglong;
  11. typedef long long longlong;
  12. #endif /*__WIN__*/
  13. #else
  14. #include <my_global .h>
  15. #include <my_sys .h>
  16. #include <m_string .h>
  17. #endif
  18. #include <mysql .h>
  19. #include <ctype .h>
  20. #include <float .h>
  21. #include "cJSON.h"
  22. #ifdef HAVE_DLOPEN
  23. my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  24. {
  25.   if (args->arg_count < 1)
  26.   {
  27.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  28.     return 1;
  29.   }
  30.   return 0;
  31. }
  32. void json_object_deinit(UDF_INIT *initid)
  33. {
  34. }
  35. char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  36. {
  37. cJSON *root;
  38. char *out;
  39. int i = 0;
  40.  
  41. root=cJSON_CreateObject();
  42. for(i = 0;i<args->arg_count;i++)
  43. {
  44. if(args->arg_type[i] == STRING_RESULT)
  45. {
  46.     cJSON_AddStringToObject(root, args->attributes[i], args->args[i]);
  47. }
  48. else if(args->arg_type[i] == INT_RESULT)
  49. {
  50. cJSON_AddNumberToObject(root, args->attributes[i], *((int*)args->args[i])); //函数参数为double型,这里强转int是好使的,纳闷
  51. }
  52. }
  53. out=cJSON_Print(root);
  54.     cJSON_Delete(root);
  55. *length = strlen(out);
  56. return out;
  57. }
  58. #endif /* HAVE_DLOPEN */
  59.  
  60. file:make.sh
  61. #!/bin/sh
  62. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -shared udf_json.c cJSON.c -o lib_mysqludf_json.so
  63. cp -f ./lib_mysqludf_json.so /usr/lib/lib_mysqludf_json.so
  64. service mysqld restart
  65. </float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译完成,复制so文件至公共库,然后执行以下语句:

  1. drop function json_object;
  2. create function json_object returns string soname 'lib_mysqludf_json.so';

使用 :

  1. SELECT json_object(field1,field2……) AS jsdate FROM table;

PHP调用:

  1. $db = mysql_connect("127.0.0.1:3306","root","123456");
  2. mysql_select_db("test");
  3. $query = mysql_query("SELECT json_object(id,intval,value) FROM test LIMIT 6");
  4. while($row = mysql_fetch_array($query)){
  5.     var_dump(json_decode($row[0],true));
  6. }

结果显示:

array(3) {
["id"]=>
int(2)
["intval"]=>
int(43324)
["value"]=>
string(10) “fdsfdsfdsa”
}
array(3) {
["id"]=>
int(5)
["intval"]=>
int(432432432)
["value"]=>
string(10) “fdsafdsasa”
}

 Page 2 of 48 « 1  2  3  4  5 » ...  Last »