`
yjl49
  • 浏览: 109563 次
社区版块
存档分类
最新评论
文章列表
     目前android应用不如人意的一点就是收费,大批开发者靠着内置广告点击、应用推广下载收入微薄。苹果开发者由于有苹果这么个平台,收入颇丰。这里介绍下android中的SP计费方式,为各位androider多一种赚钱的选择。      ...
      移动应用软件开发中比较重要的一点就是客户端的标识。所谓的“标识”就是指给每个发布出去的客户端一定的预置属性,方便我们在软件更新、数据统计、 商业合作、版本控制等等场合对这些客户端进行区别分类。天 ...
      最近在找android手机上的消息推送的解决方案。目前看来有以下几种常用的方式: 1.定期查询:按照指定的时间间隔连接服务器查询获取最新的消息。实现起来简单,非实时,查询时间过短则流量耗费多,耗电量大。下面是一个爱立信的测试结果:   2.短信方式:需要及时发送消息给客户端时也可以通过这种方式,但大家都懂的,这个很花钱。   3.长轮询:基本上与目前很多网站使用的方式一样(WEB阿里旺旺、微博、人人等等)。客户端发起一个很长超时时间的请求,然后服务器端在没有消息的时候阻塞这个请求(一直不给返回值)直到快要超时为止,有消息到来再返回响应。客户端收到响应或超时后立即再发起请 ...
项目中遇到一个ID生成策略的需求:需要在系统中为每个用户分配一个ID用作以后的用户标示。这个需求应该是非常普遍的,对于使用人数较少的系统而言不会 是一个问题,不过对于向用户众多的互联网系统来讲这不是一个简 ...
        移动互联网不是互联网,无论从网络环境还是从终端状况看都不能简单套用后者的那一套。         用户注册时要讲求个“快”字。不要让用户输入一大堆东西:什么密码、邮件、用户名......在目前手机上输入不太方便的情况下,这是找“SHI”------要么被弃之不用、要么被卸载。         有很多应用将手机号码作为注册时的ID,包括后台数据库设计也是如此。个人建议抛弃这种做法。          一是很多智能手机并不能直接获取到手机对应的号码,只有IMSI,IMEI一类的信息,而这些信息与号码的对应关系是存放在运营商那里的,所以会有一个号码的间接获取过程(这个过程并不轻松 ...
          一个常见的情况: supervisor 下启动了N个子进程,如何访问这些子进程?           一般可以通过两种方式:           1.通过PID              所有的子进程在创建完成后都会有相应的PID,将这些个PID存到本地的表中,需要时通过PID去访问进程。           2.通过进程名              在注册一个进程的时候为其指定相应的名称,需要时通过进程名访问进程。            下面为一个简单的例子:             建立一个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 启动时不会主动启动任何子进程,需要自行使用supervisor:start_child 来启动。         这么做的好处是明显的:例如一个接收客户端连接的socket supervisor进程在刚启动的 ...
        假设某天某公司做了一个拥有很多子系统的项目,其中有一些公共的字典表可能被多个子系统用到。例如一个产品类型表tb_product,基本的字段有 fid(ID),fname (名称),fprice (价格)。         在A子系统中需要一个标 ...

Erlang 尾递归

         尾递归就是在一系列语句的最后又跳转到被调用函数的开头。这里的“最后”两个字很关键,不正确的递归调用会吃光你的内存。 litaocheng 在他的blog中就提到过一个很好的例子:here       观察下面的代码:   do_t1() -> try recive _-> do_t1() end catch _:_ -> do_t1() end.     ...
  接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。          修改room_manager.erl中的内容: 新建一个函数来初始化房间信息表: initTab()-> ets:new(roominfo,[public, ordered_set, named_table, {keypos,#roominfo.id} ] ...
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, OUT Po_int3 INT, OUT Po_int4 INT, OUT Po_ret INT ) BEGIN DECLARE v_strtemp VARCHAR(50); DEC ...
之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为chat_room init(Para)-> {ok, { {one_for_one,3,5}, [ {the_room, {chat_room, ...
先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]} 修改客户端发送请求消息部分: clientThread.sendMsg(new Message("get","client", ...
如果要转换到的Bean类中含有类似ArrayList、Map、List这样的集合时,要对集合进行处理,否则会报“net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX” 这样的异常。 处理方法如下: 1.定义一个Map Map <String,Class> mymap = new HashMap<String,Class>(); 2.向Map中put Bean中集合成员名和对应的类型 mymap.put("content",ClientInfo.class); //我这 ...
上篇 开了个头编写了基本的框架,这次连同客户端服务器端代码一起完善下。 首先修改客户端代码: 之前在数据交换 部分,客户端中定义了一个Message bean类,里面包含了发送一条消息所需要的基本信息,包括id、type、subject、from、to、content等。但这里的 content是一个String 类型,如果要表示更复杂的消息就不太适用了。 由于所有的消息id、type、subject、from、to 这几个成员的类型是确定的,对应的操作方法也是固定的,所以我们抽象出一个抽象类:Packet 用来表示交互中的所有消息: Packet.java:   ...
Global site tag (gtag.js) - Google Analytics