Tokyo Cabinet table表的jsp接口

作者 : admin 于 2011年08月16日, 14:50:22
2011
08-16

终于完成了Tokyo Cabinet的jsp接口,在tomcat下性能不是那么出众,看来性能还是得用c。

部署方法看上一偏配置说明。

代码 api.tar.gz

信息插入与修改:

  1. $data['database'] = "sunboyudata2";
  2. $jsondata = array();
  3. while($row = mysql_fetch_array($query,MYSQL_ASSOC)){
  4. $jsondata[] = $row;
  5. }
  6. $data['jsondata'] = json_encode($jsondata);
  7. $url= http_build_query($data );
  8. $postdate = array (
  9. 'http' => array (
  10. 'method' => 'POST',
  11. 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .
  12. "Content-Length: " . strlen($url) . "\r\n",
  13. 'content' => $url
  14. ),
  15. );
  16. $postcontent = stream_context_create($postdate);
  17. $return= file_get_contents('http://192.168.138.29:8080/api.jsp', false, $postcontent );

查询:

http://192.168.138.29:8080/search.jsp?database=sunboyudata2&query=fid:QCNUMEQ:1604&skip=20000&max=10

database:数据库文件名[无扩展名]
query:查询条件 每组查询条件三个部分 字段:规则:值 每组之间用|分割
skip:记录起始
max:返回的记录条数

缺点:在频繁大数据量提交的时候,tomcat总是影响失败。性能没有预期那么好,tc需要优化。

linux下tokyocabinet存储引擎java接口的配置

作者 : admin 于 2011年08月12日, 15:01:47
2011
08-12

tokyocabinet是一个性能极高的存储引擎,除支持传统的keyvalue存储外,还支持table表的存储,具体可以看这里 http://fallabs.com/tokyocabinet/spex-en.html#tctdbapi

使用tc常用的工具就是作者另外写的一个api:tt http://fallabs.com/tokyotyrant/ 兼容memcached协议,非常好用和高效。

但这里我期望使用的是table表,它提供了C的接口,但没有php方便调用的的方式,所以张宴同学做了一个很方便的tcsql http://blog.s135.com/tcsql/

因为我C的水平问题,一直没有写出稳定的操作接口,并且张宴同学tcsql的设计理念非常好,支持分布式的结构。

因此我改变了设计思路,并且使用我想对熟悉的java接口来做这个事情。

linux下配置过程:

环境装备:标准JDK环境

1、下载java api http://fallabs.com/tokyocabinet/javapkg/

2、解压后进入 tokyocabinet-java-1.24 目录

3、运行 ./configure –prefix=/opt/tcjava && make && make install

4、环境变量配置:
这里是包含JDK的全部配置

export JAVA_HOME=/opt/jdk
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/opt/tcjava/lib/tokyocabinet.jar:/opt/tcjava/lib/libjtokyocabinet.so:/opt/tcjava/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/tcjava/lib/
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jrei
JAVA_OPTS="-server"
JAVA_OPTS="$JAVA_OPTS -Xms64m -Xmx128m"
JAVA_OPTS="$JAVA_OPTS -D64 -Djava.library.path=/usr/local/lib/"

把以上代码增加到 /etc/profile 文件尾部,而后 source /etc/profile

配置完成,开始测试:

进入 tokyocabinet-java-1.24/example 执行 make

然后运行 java TCTDBEX 如果看到跟代码中预期的结果,则tc的javaapi在此服务器上安装成功。

使用PHP来生成二维码

作者 : admin 于 2011年08月11日, 21:55:44
2011
08-11

二维码是什么?

看这里:百度百科:二维码

二维码我用的最多的就是利用android手机的二维码扫描功能扫描网址,当然这种方法还大量应用在货物标签,比如我们去超市结账的条码扫描。

二维码利用近距离的光线进行数据传输,打破了网络数据线的依赖,可以说是一种打破常规的非常方便的应用。尤其在各种设备并不那么兼容的情况下,用二维码交换少量信息是非常便利的。

二维码的算法是通用的,二维码PHP的生成,我发现了以下几种方式:
1、某日本作者写的PHP http://www.swetake.com/qr/qr_cgi.html
2、开源社区上的PHP程序 http://phpqrcode.sourceforge.net/
3、google提供的一个接口 http://code.google.com/intl/zh-CN/apis/chart/

这里我尝试了第二种方法:下载软件包后,使用里边的方法:QRcode::png

我写了个代码是这样:

require_once(APP_PATH.'/include/phpqrcode/qrlib.php');
QRcode::png("http://www.sunboyu.cn");

这样就可以输出二维码图形了,可以用手机尝试一下。

2011
08-6

android Activity之间传参

作者 : admin 于 2011年07月26日, 13:40:59
2011
07-26

貌似跟网页不一样,没有get post了,但提供了这样的传参方式:

前一个页面

Intent intent = new Intent(IndexappActivity.this, LoginappActivity.class);
intent.putExtra("test", "这是来自MainActivity的数据。");
startActivity(intent);

接受页面


Bundle extras = getIntent().getExtras();
String data = null;
if(extras != null)
{
data = extras.getString("test");
}
setTitle( data);

还有其他数据格式,不过这种意境够我用了,结贴

常用的Intent的URI及示例 (转)

作者 : admin 于 2011年07月25日, 22:20:59
2011
07-25

以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent。
一、打开一个网页,类别是Intent.ACTION_VIEW
Uri uri = Uri.parse(“http://blog.3gstdy.com/”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
二、打开地图并定位到一个点
Uri uri = Uri.parse(“geo:52.76,-79.0342″);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

三、打开拨号界面 ,类型是Intent.ACTION_DIAL
Uri uri = Uri.parse(“tel:10086″);
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
四、直接拨打电话,与三不同的是,这个直接拨打电话,而不是打开拨号界面
Uri uri = Uri.parse(“tel:10086″);
Intent intent = new Intent(Intent.ACTION_CALL, uri);
五、卸载一个应用,Intent的类别是Intent.ACTION_DELETE
Uri uri = Uri.fromParts(“package”, “xxx”, null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
六、安装应用程序,Intent的类别是Intent.ACTION_PACKAGE_ADDED
Uri uri = Uri.fromParts(“package”, “xxx”, null);
Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED, uri);
七、播放音频文件
Uri uri = Uri.parse(“file:///sdcard/download/everything.mp3″);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setType(“audio/mp3″);
八、打开发邮件界面
Uri uri= Uri.parse(“mailto:admin@3gstdy.com”);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
九、发邮件,与八不同这里是将邮件发送出去,
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos = { “admin@3gstdy.com” };
String[] ccs = { “webmaster@3gstdy.com” };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, “I come from http://blog.3gstdy.com”);
intent.putExtra(Intent.EXTRA_SUBJECT, “http://blog.3gstdy.com”);
intent.setType(“message/rfc882″);
Intent.createChooser(intent, “Choose Email Client”);
//发送带附件的邮件
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, “The email subject text”);
intent.putExtra(Intent.EXTRA_STREAM, “file:///sdcard/mysong.mp3″);
intent.setType(“audio/mp3″);
startActivity(Intent.createChooser(intent, “Choose Email Client”));
十、发短信
Uri uri= Uri.parse(“tel:10086″);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(“sms_body”, “I come from http://blog.3gstdy.com”);
intent.setType(“vnd.android-dir/mms-sms”);
十一、直接发邮件
Uri uri= Uri.parse(“smsto://100861″);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra(“sms_body”, “3g android http://blog.3gstdy.com”);
十二、发彩信
Uri uri= Uri.parse(“content://media/external/images/media/23″);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(“sms_body”, “3g android http://blog.3gstdy.com”);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType(“image/png”);
十三、# Market 相关
1 //寻找某个应用
Uri uri = Uri.parse(“market://search?q=pname:pkg_name”);
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where pkg_name is the full package path for an application
2 //显示某个应用的相关信息
Uri uri = Uri.parse(“market://details?id=app_id”);
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where app_id is the application ID, find the ID
//by clicking on your application on Market home
//page, and notice the ID from the address bar
十四、路径规划
Uri uri = Uri.parse(“http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en”);
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

android点击返回按钮弹出的提示

作者 : admin 于 2011年06月28日, 11:53:18
2011
06-28


import android.view.KeyEvent;
import android.app.AlertDialog;
import android.content.DialogInterface;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
AlertDialog.Builder dlg=new AlertDialog.Builder(this);
dlg.setTitle("Alert");
dlg.setMessage("退出?");
dlg.setPositiveButton("是", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setResult(RESULT_OK);
finish();
}
});
dlg.setNegativeButton("不", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {

}
});
dlg.show();
}
return super.onKeyDown(keyCode, event);
}

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();

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

 Page 1 of 30  1  2  3  4  5 » ...  Last »