- 博客(166)
- 资源 (5)
- 收藏
- 关注
移动互联网SP计费
目前android应用不如人意的一点就是收费,大批开发者靠着内置广告点击、应用推广下载收入微薄。苹果开发者由于有苹果这么个平台,收入颇丰。这里介绍下android中的SP计费方式,为各位androider多一种赚钱的选择。 SP计费就是通过在手机应用中内置发送短信到SP提供商,直接从用户手机话费中扣费的计费方式。基本的流程如下: 基本流程的说明: ...
2012-07-30 19:20:37
772
原创 移动互联网中一种终端标识法
移动应用软件开发中比较重要的一点就是客户端的标识。所谓的“标识”就是指给每个发布出去的客户端一定的预置属性,方便我们在软件更新、数据统计、商业合作、版本控制等等场合对这些客户端进行区别分类。天然的属性中比较重要的包括“平台类型”、“软件类型”、“版本号”,一般的应用通过这几个属性即可对客户端达到一定程度的控制。但是要达到更精细更准确的控制就需要开发者预置属性进去。 ...
2012-07-17 10:23:40
639
手机上的消息推送
最近在找android手机上的消息推送的解决方案。目前看来有以下几种常用的方式:1.定期查询:按照指定的时间间隔连接服务器查询获取最新的消息。实现起来简单,非实时,查询时间过短则流量耗费多,耗电量大。下面是一个爱立信的测试结果: 2.短信方式:需要及时发送消息给客户端时也可以通过这种方式,但大家都懂的,这个很花钱。 3.长轮询:基本上与目前很多网站使用的方式一样...
2012-05-17 19:01:41
598
原创 Instagram 的ID生成策略[翻译]
项目中遇到一个ID生成策略的需求:需要在系统中为每个用户分配一个ID用作以后的用户标示。这个需求应该是非常普遍的,对于使用人数较少的系统而言不会是一个问题,不过对于向用户众多的互联网系统来讲这不是一个简单的问题。下面是翻译的最近最火爆的Instagram应用开发者的一篇文章,看看他们一个十几个人的公司是怎么解决这个问题的: 先给出原文链接:http://instagram-e...
2012-05-11 11:46:28
859
原创 移动互联网中的用户注册、升级
移动互联网不是互联网,无论从网络环境还是从终端状况看都不能简单套用后者的那一套。 用户注册时要讲求个“快”字。不要让用户输入一大堆东西:什么密码、邮件、用户名......在目前手机上输入不太方便的情况下,这是找“SHI”------要么被弃之不用、要么被卸载。 有很多应用将手机号码作为注册时的ID,包括后台数据库设计也是如此。个人建议抛弃这种做法...
2012-03-31 17:05:33
481
Erlang 中进程的两种调用方式
一个常见的情况: supervisor 下启动了N个子进程,如何访问这些子进程? 一般可以通过两种方式: 1.通过PID 所有的子进程在创建完成后都会有相应的PID,将这些个PID存到本地的表中,需要时通过PID去访问进程。 2.通过进程名 在注册一个进程的...
2012-03-29 18:16:42
955
原创 Erlang supervisor 中的simple_one_for_one
Erlang 中的supervisor子进程的启动策略定义除了one_for_one、one_for_all、rest_for_one还有一种比较常用的simple_one_for_one。 这种策略与one_for_one比较相似,但在supervisor:init中定义的子进程只能有一个,以后启动的子进程都是以这个为模板产生,且在supervisor 启动时不...
2012-03-28 12:46:35
731
原创 系统中字典表该怎么用
假设某天某公司做了一个拥有很多子系统的项目,其中有一些公共的字典表可能被多个子系统用到。例如一个产品类型表tb_product,基本的字段有 fid(ID),fname (名称),fprice (价格)。 在A子系统中需要一个标识来控制信息是否展示,所以负责这个子系统的A程序员就修改了表,添加了个字段IsShow。某天B子系统也需要一个标识来实现它的控制,所以负责...
2012-03-16 19:09:36
1315
原创 Erlang 尾递归
尾递归就是在一系列语句的最后又跳转到被调用函数的开头。这里的“最后”两个字很关键,不正确的递归调用会吃光你的内存。litaocheng 在他的blog中就提到过一个很好的例子:here 观察下面的代码: do_t1() -> try recive _-> ...
2012-03-14 18:08:12
593
原创 Erlang 聊天室程序(九) 主题房间2 ---房间信息管理
接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。 修改room_manager.erl中的内容:新建一个函数来初始化房间信息表:initTab()-> ets:new(roominfo,[public...
2012-03-14 14:20:15
385
原创 MySQL IP字符串转数字存储过程
DELIMITER $$USE `db_im`$$DROP PROCEDURE IF EXISTS `P_bi_parasIP`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `P_bi_parasIP`( IN Pi_ipstr VARCHAR(50), OUT Po_int1 INT, OUT Po_int2 IN
2012-03-05 22:18:31
3380
MySQL IP字符串转数字存储过程
DELIMITER $$USE `db_im`$$DROP PROCEDURE IF EXISTS `P_bi_parasIP`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `P_bi_parasIP`( IN Pi_ipstr VARCHAR(50), OUT Po_int1 INT, OUT Po_int2 INT, O...
2012-03-05 22:18:00
318
原创 Erlang 聊天室程序(八) 主题房间---supervisor 的使用
之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为
2012-03-02 18:03:20
4058
Erlang 聊天室程序(八) 主题房间---supervisor 的使用
之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为chat_room...
2012-03-02 18:03:00
463
原创 Erlang 聊天室程序(七) 获取在线用户
先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]}
2012-03-02 14:12:21
3735
Erlang 聊天室程序(七) 获取在线用户
先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]} 修改客户端发送请求消息部分: clientThread.send...
2012-03-02 14:12:00
356
原创 JAVA JSON String to Object 转换中的集合
如果要转换到的Bean类中含有类似ArrayList、Map、List这样的集合时,要对集合进行处理,否则会报“net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX”这样的异常。 处理方法如下: 1.定义一个Map Map mymap = new H
2012-03-02 12:28:02
8662
JAVA JSON String to Object 转换中的集合
如果要转换到的Bean类中含有类似ArrayList、Map、List这样的集合时,要对集合进行处理,否则会报“net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX”这样的异常。 处理方法如下: 1.定义一个Map Map <String,Class> mymap = new HashMap<Stri...
2012-03-02 12:28:00
480
原创 Erlang 聊天室程序(六) 设置客户端信息2
上篇开了个头编写了基本的框架,这次连同客户端服务器端代码一起完善下。 首先修改客户端代码: 之前在数据交换部分,客户端中定义了一个Message bean类,里面包含了发送一条消息所需要的基本信息,包括id、type、subject、from、to、content等。但这里的content是一个String 类型,如果要表示更复杂的消息就不太适用
2012-03-01 14:25:10
3631
Erlang 聊天室程序(六) 设置客户端信息2
上篇开了个头编写了基本的框架,这次连同客户端服务器端代码一起完善下。 首先修改客户端代码: 之前在数据交换部分,客户端中定义了一个Message bean类,里面包含了发送一条消息所需要的基本信息,包括id、type、subject、from、to、content等。但这里的content是一个String 类型,如果要表示更复杂的消息就不太适用了。 由于所有的消息id、...
2012-03-01 14:25:00
421
原创 Erlang 聊天室程序(五) 设置客户端信息
接下来实现设置客户端信息功能,使客户端可以设置自己的名称、性别、年龄、所做省份等信息。我们暂时不管客户端如何实现,先对服务器端代码进行调整。 这里需要做以下几件事: 1.修改client_session中handle_info({tcp,Socket,Data},State) 函数对接收到的消息包的处理,使其能支持“客户端信息设置消息”。
2012-02-28 17:30:09
3662
Erlang 聊天室程序(五) 设置客户端信息
接下来实现设置客户端信息功能,使客户端可以设置自己的名称、性别、年龄、所做省份等信息。我们暂时不管客户端如何实现,先对服务器端代码进行调整。 这里需要做以下几件事: 1.修改client_session中handle_info({tcp,Socket,Data},State) 函数对接收到的消息包的处理,使其能支持“客户端信息设置消息”。 考虑到后面还会有更多种类的消息,在这里添加一...
2012-02-28 17:30:00
174
原创 Erlang 聊天室程序(四) 数据交换格式---json的encode
上一篇实现了json数据到message记录的转换,这篇则是将message还原为json以便发送给客户端。 首先完善上篇中creationDate部分的解析:para({"creationDate",Val},Data)-> {obj,List}=Val, Time=#time{}, NewData1=Data#message{time=Time},
2012-02-27 21:03:56
3476
Erlang 聊天室程序(四) 数据交换格式---json的encode
上一篇实现了json数据到message记录的转换,这篇则是将message还原为json以便发送给客户端。 首先完善上篇中creationDate部分的解析:para({"creationDate",Val},Data)-> {obj,List}=Val, Time=#time{}, NewData1=Data#message{time=Time}, NewDat...
2012-02-27 21:03:00
146
原创 Erlang 聊天室程序(三) 数据交换格式---json的decode
霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng 为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库 先定义一个Message类:public class Message { String id; //消息ID String type; //消息类型 String fro
2012-02-27 18:29:25
4298
Erlang 聊天室程序(三) 数据交换格式---json的decode
霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng 为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库 先定义一个Message类: public class Message { String id; //消息ID String type; //消息类型 String from; //发送方 St...
2012-02-27 18:29:00
187
原创 Erlang 聊天室程序(二) 客户端的退出
接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下:client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},Sta
2012-02-25 13:01:09
4756
Erlang 聊天室程序(二) 客户端的退出
接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下:client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},State) 中捕捉到了Socket断链信息。h...
2012-02-25 13:01:00
248
原创 Erlang 聊天室程序( 一)
为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下: 1.服务器启动监听指定端口 2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端 3.服务器接受客户端连接,并绑定到一个gen_server进程
2012-02-24 16:01:55
9494
11
Erlang 聊天室程序( 一)
为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下: 1.服务器启动监听指定端口 2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端 3.服务器接受客户端连接,并绑定到一个gen_server进程 4.客户端维护进程接受客户端发送的消息,调用聊天室进程函数进行广播 5...
2012-02-24 16:01:00
324
原创 Erlang gen_server:start_link/3 和gen_server:start_link/4
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二个方法只比第一个多了个Serv
2012-02-24 11:32:04
5030
Erlang gen_server:start_link/3 和gen_server:start_link/4
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二个方法只比第一个多了个ServerName,在gen_server的源码中区别如下:start_lin...
2012-02-24 11:32:00
342
原创 Erlang mnesia(一) 生成sequence 查错过程
整了段代码,想用mnesia数据库来实现类似于Oracle中sequence 的功能。原代码如下:%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_server).
2012-02-17 17:57:56
2992
Erlang mnesia(一) 生成sequence 查错过程
整了段代码,想用mnesia数据库来实现类似于Oracle中sequence 的功能。原代码如下:%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_serv...
2012-02-17 17:57:00
128
原创 Erlang 从URL中截取尾部文件名
分析项目edownloader时看到的代码: 从 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "sr
2012-02-16 16:02:18
3127
Erlang 从URL中截取尾部文件名
分析项目edownloader时看到的代码: 从 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "srp" ho...
2012-02-16 16:02:00
146
原创 Erlide 的安装使用
erlang 开发平台很少,做JAVA开发的人做erlang开发,肯定会怀念eclipse中的快捷键操作,配置调试,语法高亮等。Erlide则是这么一款基于eclipse 的erlang开发插件,目前的版本是0.13.9 安装步骤如下: 1.安装erlang开发环境(版本至少为R13B-5)
2012-02-16 12:10:11
4725
Erlide 的安装使用
erlang 开发平台很少,做JAVA开发的人做erlang开发,肯定会怀念eclipse中的快捷键操作,配置调试,语法高亮等。Erlide则是这么一款基于eclipse 的erlang开发插件,目前的版本是0.13.9 安装步骤如下: 1.安装erlang开发环境(版本至少为R13B-5) 2.安装eclipse 3.eclipse-->help--->instal...
2012-02-16 12:10:00
164
原创 fqueue(二)
上一篇blog分析了fqueue 的数据存储层的实现。这篇主要分析通信部分。fqueue使用jmemcached做为通信层,jmemcached与客户端的交互使用netty框架。 主要的类如下: startNewQueue:启动类,每new一个instance 都会启动一个监听了相应端口的服务。 MemCacheDaemon:负责通信的
2012-02-09 21:02:56
3766
fqueue(二)
上一篇blog分析了fqueue 的数据存储层的实现。这篇主要分析通信部分。fqueue使用jmemcached做为通信层,jmemcached与客户端的交互使用netty框架。 主要的类如下: startNewQueue:启动类,每new一个instance 都会启动一个监听了相应端口的服务。 MemCacheDaemon:负责通信的管理,包括调用netty建立监听,接受连接等,这...
2012-02-09 21:02:00
249
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人