手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年11月的文章

APNS 推送

关于apns这玩意,以前也写过不少的博客来介绍它了,国内的文章都是基于同一套代码的.
而正因为对apns了解的少,所以写的代码,以及对它的扩展都是不够完善的.

不过google code上终于有一套相对比较完善的代码了.https://code.google.com/p/apns-php/,其实在最近他已经迁移到了github了(October 26, 2012, Project source code has moved to github. )
看了一下代码,确实不错.
如果是原先的代码,其实一直有一个问题:如果某个token失效了,那么在接下来的10s左右,fwrite的推送都会失败.
虽然苹果提供了feedback的返回,但其实你翻看国内的文章,介绍,都没有告诉你怎么查询feedback,所以我到现在也没有好好的对Feedback处理过那些无效的信息.

上面介绍的这套代码就好很多了.可以进行推送,在失败的话,还能够继续推,如果成功的推送是直接可以进入下一条,不会胡乱浪费资源,真心不错...
代码也很简单:

PHP代码
  1. $push = new ApnsPush(ApnsAbstract::ENVIRONMENT_SANDBOX, '/dev.pem');  
  2.         // Set the Root Certificate Autority to verify the Apple remote peer  
  3.  
  4.         //$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');  
  5.         // Increase write interval to 100ms (default value is 10ms).  
  6.         // This is an example value, the 10ms default value is OK in most cases.  
  7.         // To speed up the sending operations, use Zero as parameter but  
  8.         // some messages may be lost.  
  9.         // $push->setWriteInterval(100 * 1000);  
  10.         // Connect to the Apple Push Notification Service  
  11.         $push->connect();  
  12.         foreach ($result as $data) {  
  13.             $token = $appCache->getAppTokenByUserId($data['receive_userid']);  
  14.             if(!$token){  
  15.                 continue ;  
  16.             }  
  17.             $token = str_replace(" ","",$token);  
  18.             // Instantiate a new Message with a single recipient  
  19.             $message = new ApnsMessage($token);  
  20.             // Set a custom identifier. To get back this identifier use the getCustomIdentifier() method  
  21.             // over a ApnsMessage object retrieved with the getErrors() message.  
  22.             //$message->setCustomIdentifier(sprintf("Message-Badge-%03d", $i));  
  23.             // Set badge icon to "3"  
  24.             $message->setBadge( intval($data['cnt']));  
  25.             // Add the message to the message queue  
  26.             $push->add($message);  
  27.         }  
  28.         // Send all messages in the message queue  
  29.         $push->send();  
  30.         // Disconnect from the Apple Push Notification Service  
  31.         $push->disconnect();  
  32.         // Examine the error message container  
  33.         $aErrorQueue = $push->getErrors();  
  34.         if (!empty($aErrorQueue)) {  
  35.             var_dump($aErrorQueue);  
  36.         }  

这段代码不要纠结,为什么与官方不一样,因为我在用yii框架的时候没有autoload成功它的 代码,花了5分钟将它全部改成基于namespace的了.

关于产品的设计

一个好的产品,必然是有灵魂的.
一个好的产品,即使是没有内容,也是能够被人喜欢的.
一个好的产品,就算没有内容,它本身也是内容

上面是我的乱谈,当然第一句话,我想,绝对没有说错:好的产品,是灌注着灵魂的.

下面的内容来自于:http://www.huxiu.com/article/9778/1.html
我这里只是摘要,如果你要看详细的,还是去看原文吧:

关于人性指导产品的一些看法——从神经系统到肉体反应
 
下面我再简单介绍下我对互联网产品设计的一些看法。
 
记 得以前看过有人介绍过2012年诺贝尔生物学奖,G蛋白偶联受体啥的。大概的意思是,人体细胞的表面到内核串联着一种蛋白胶G蛋白偶联受体。G蛋白偶联受 体可以接受人体分泌的类似荷尔蒙、肾上腺素等物质,产生反应后使得细胞收缩,产生肉体反应,然后再告知神经系统。神经系统通过之前的经验和环境的认知,来 做肉体反应做出喜怒哀乐的判断。
 
这个道理告诉我们,通过五官接触的声音、味道、图片、动画等,经过肉体的反应,远快于直接进入头脑的。前者相当于条件反射,这就让我们很好的理解为什么人的感性会大于理性了。而人的体验本质上,只有三个需求:性的需求,温饱的需求和安全的需求。
 
这个思想很有利于我们对体验设计的理解。当我们确定了产品满足的目标需求后,如何做出最符合人体条件反射的体验设计。比如:
 
一个按钮:如果只有一个按钮,人的条件反射就是要按它。即使是婴儿,也会非常自然的去按一个凸起或者凹进的按钮。
 
显著的反馈:每一次被理解的反馈(可用动画和声音模拟唤起用户记忆从而更加快速的理解)都是对条件发射的认可和强化。对比小孩,按钮以后有反馈,就会开心的笑。
 
节奏感:人体对节奏感会有本能的愉悦感。柔和的女声和沉着的男声,象征着性感。闪烁的特效,会让人引起安全警觉,从而努力去消除或者感受紧张。
 
安全感需求里面,衍生出一个需求:解决问题的需求。产品必须让用户第一时间理解他要解决的问题,并且用最直白的方法,告诉用户通过他自己的努力解决了这个问题。我们日常工作中的成就感,本质上是因为自己释放了对生存恐惧的压力而产生的。
 
下面讨论一个最复杂的问题:可选择过程中满足的解决问题,即安全需求。我们有很多产品,由于功能的需要不得不让用户有很多选择的操作。在这种情况下,就必须要引入教学机制,或者在刚需及无竞争情况下的让用户自学。
 
总结下来,要做一个好的产品思路,可以分下面三个步骤:
 
1.  解决什么需求,最好能一句话说清楚;
 
2.  解决需求的路径设计,最好能单线完成,过程中有反馈设计;
 
3.  选择指导:通过特效、亮点提醒和选择操作中的反馈,来完成用户对选择的理解。
 
思路明确以后,才是做产品的运营性功能设计,比如积分,信用体系等。
------EOF------
所以,在设计产品的时候,其实还是有很多地方需要想想的...

Tags: 打车

redis:Error: read error on connection

在使用redis的时候,出现了Error: read error on connection.
找了一下相关资料,在官方也有很多人提出这个问题
phpredis的作者的意思是,是因为default_socket_timeout的问题,将它设为0就好了.
但很多人都说设为0,在60秒后还是会挂 ,只有设为-1才OK
于是,在命令行下subscribe的时候,先init_set('default_socket_timeout',-1);
问题解决 .

Tags: redis

如何禁用flash

本来是不想禁用的,但发现机器的风扇就一直没停过,CPU消耗的最大的就是firefox下的flash插件 .没辙了.我还是禁用它吧.
嗯flashblock即可,但其实我是想从软件的底层就直接禁用它.可惜没有好的办法....只能用插件了.网上类似的教程还有很多,比如这个:

内容来源:http://orzl.com/weblog/disable-the-flash-on-mac

在Mac下禁用Flash的原因众所周知,这次实在是忍无可忍了。

  1. Firefox禁用Flash
    可以使用插件如 - Flashblock:
    下载地址: https://addons.mozilla.org/en-US/firefox/addon/flashblock/
    安装之后网页所有的Flash位置都会显示一个"Play"的占位图标,只有点击图标才会播放对应的资源。
    另:除了Flash以外,它也可以阻止Silverlight,且支持域名白名单。
    Flashblock的官方网站: http://flashblock.mozdev.org/
  2. Chrome禁用Flash:
    方法一: 使用和Flashblock一样的插件:https://chrome.google.com/webstore/detail/flashblock/gofhjkjmkpinhpoiabj...
    方法二:还有一种办法是针对Dev版本启用自带的插件:"Click to Play"。
    "Preferences" - "Privacy" - "Content settings" - "Plugin-in" - "Click to Play"。
    支持域名白名单。
  3. Safari禁用Flash:
    方法一:修改浏览器代理:
    修改浏览器代理为iPad,访问支持HTML5的网站如优酷土豆等会切换到HTML5版本。
    Step 1: 在菜单栏中显示"Develop"选项: "Preferences" - "Advanced" - "Show Develop menu in menu bar"
    Step 2: 在菜单中选择"Develop"选项,进入"User Agent",选择:“Sarafi iOS 5.1 - iPad” 。

    方法二:使用Safari插件:ClickToPlugin & ClickToFlash Safari extensions
    http://hoyois.github.com/safariextensions/clicktoplugin/

    推荐的这个插件分两个版本,一种仅针对Flash,另外一种支持屏蔽的插件包括:Flash、Java、Silverlight、Quicktime、Shockwave等。

    且均支持白名单。

于是乎,世界清静了.嗯,我没有那么急的需求要看flash....而且开了之后,耗电量也大增,何必呢.

Tags: flash

heredoc 的新用法?

事情的起因是这样的,神仙在群里贴了段代码:
.....
$lang = new Lang();
$code = <<<'EOF'
....
这是其中的两句,于是我对 <<<EOF上为什么加单引号感了兴趣,理论上,这是错误的用法。
神仙说,这是5.3的新用法,防止 定界符 中的变量被解析。

于是看了下手册,果然,<<<有了新的说法
<<<后面的字符串

  1. 如果是双引号:在PHP 5.3.0中还在Heredoc结构中用双引号来声明标志符【功能与原来一致】
  2. 如果是单引号:其实已经换了新名字,nowdoc,

    就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是 nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。

    一个nowdoc结构也用和heredocs结构一样的标记 <<<, 但是跟在后面的标志符要用 单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结 构,尤其是结束标志符的规则。
    不象 heredocs结构,nowdocs结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

官方解释:http://www.php.net/manual/zh/language.types.string.php

如果你觉得翻译的不好,还是看英文版 吧:http://www.php.net/manual/en/language.types.string.php