Blog Archives

Haproxy: uptime = 465d 9h37m14s

今天需要对服务器进行架构方面的调整,无奈需要重启Haproxy服务,发现它已经运行了465天没有重启过了,这一年多,还是挺省心的!

QQ截图20140107025807

今天才注意到,FreeBSD的ports已经升级使用svn了

公司一台开发机,5年前攒的,中间换过一次电源风扇,其他时间因为意外断过几次电,一直开着用到今天还很稳定,5年前安装的FreeBSD7.2的系统,升级过几次内核,最近280多天未重启也没升级,今天安装新的音频解码包的时候,发现官方的ports树已经早就更新为使用svn了,早前使用了很多年的cvs终于走到了尽头,真是个很好的进步啊!

也不知道身边还有多少人在用FreeBSD作为服务器系统,感觉有点孤独,国内的好几个cvsup镜像站貌似都已经不再维护,一度很好用的163的镜像站也不能访问了,其实FreeBSD真是很优秀的服务器系统,开发团队也是很伟大的,辛苦你们了!

Category: Linux / BSD  One Comment

在4.2.2系统上ScrollView包含LinearLayout不滚动的问题

之前写过的一个APP每日美图,支持最低的API版本是7,也就是2.1以上系统都没有问题,过了一年多没有维护了,前不久用安装有最新的4.2.2系统的手机测试,发现瀑布流图墙不滚动了,这里面其实是自定义的ScrollView中OnTouchListenr捕获手指事件后分发流程的问题,早期的实现有好多方式,大致都是通过在ScrollView上实现自定义的onTouchListener,重写onTouch()方法,把事件进行捕获,但是在API17以上不知道为啥就总是失败,会被ScrollView里面的LinearLayout给屏蔽掉了。

我重新梳理了这部分流程,用实现onGestureListener的自定义ScrollView方式搞定,因为我还需要在这个里面得到手指滚动的方向,这就是曾经一度很流行的LazyScrollView的改进版,支持判断方向的版本,经我测试,在API7-17的版本上都能正常滚动和捕获事件。

下面是ScrollView代码部分,layout和Activity部分就不贴了,和大部分的实现类似。

more »

ApnsPHP完成推送后处理错误日志的正确方法

通过苹果的apns批量发送push消息,如果中间发生错误,应该需要捕获错误发生的对象,然后对那些发生错误的消息应该在后台进行标识,这是我们常见的处理逻辑,在ApnsPHP中很好的实现了这个逻辑,大致的代码如下:


//假设前面已经有了下面一句
$message->setCustomIdentifier($id); //这里的id可以是你消息对于的数据库id

...

$push->send();
$push->disconnect();

//在发送完以后,可以进行下面的处理

$aErrorQueue = $push->getErrors();
$error_ids = array();
if (!empty($aErrorQueue)) {
foreach ($aErrorQueue AS $e) {
$error_ids[] = $e['MESSAGE']->getCustomIdentifier();
}

这里面关键的一句是 $e[‘MESSAGE’]->getCustomIdentifier();

getErrors()返回的数组,每条记录也是个数组,key为MESSAGE对应的值是个ApnsPHP_Message对象,该对象可以使用getCustomIdentifier()方法取回前面通过 setCustomIdentifier($id)传入的$id值

android中获取当前activity的名称

之前看到网上和教程中通常的做法如下:

private String getRunningActivityName(){       
        ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        String runningActivity=activityManager.getRunningTasks(1).get(0).topActivity.getClassName();
        return runningActivity;               
    }

这个方法不好的是需要在AndroidManifest.xml里面定义权限

<uses-permission android:name="android.permission.GET_TASKS" />

事实上有更简单的方法,我一般都这么干!

private String getRunningActivityName(){   
        String contextString = context.toString();
        return contextString.substring(contextString.lastIndexOf(".")+1, contextString.indexOf("@"));

既不用定义权限,也代码简单。

发布个竞彩足球预测软件测试版本

前些日子碰巧得到个有经验的朋友指点,研究了一番竞彩足球,实战几番后,萌发了用数学的方法了尽可能的提高选择投注命中率,经过前一段的测试验证,已经有了比较满意的算法结果,这两天把android的客户单弄了个屌丝版本发布出来,欢迎对足彩有兴趣的朋友下载交流!说不定你会发现找到了新的投资理财机会,哈哈!

安装APK下载地址: http://www.toplee.com/caipiao.apk

iphone的版本过些时间也会发布一个出来,尽请期待!

Yii rules验证中可以使用的占位符列表

Here’s a list of many placeholders and the validators that are using them:

  • CBooleanValidator: {true} {false}
  • CCaptchaValidator: {id}
  • CCompareValidator: {compareAttribute} {compareValue} {operator}
  • CExistValidator: {table} {column} {value}
  • CFileValidator: {file} {limit} {extensions}
  • CNumberValidator: {min} {max}
  • CRequiredValidator: {value}
  • CStringValidator: {min} {max} {length}
  • CTypeValidator: {type}
  • CUniqueValidator: {table} {column} {value}
  • CUrlValidator: {schemes}

Of course, {attribute} is known in all validators. So, which placeholders are known depends on the validator and the condition as well: By default {min} is only used when the value is below the min value (as defined in rules) and {max} when the value is above the max value.

选择

人一辈子总在不同阶段需要面临各种选择,选择真是个不容易的事情, 总是需要权衡得失和面临放弃,从心理上要过好多关。

而今,若干年前的类似选择又摆在面前了,这次还有些许不同,这次选择能容错的空间要小很多,也就是难度系数增大了不少。

这些天事情也多,忙活着好几个项目的事情,其中最有小乐趣的项目是突然奇想产生的,得到一个朋友的实战经验启发后,夜间睡觉中突然奇想想到搞个小东西,用一套目前看来合理的数学算法预测足彩,目前算法模型已经出来了,正在进行一些数据验证,期间也不断的在调整程序算法,过些天有空弄个手机端出来试试。

足彩算法的事情,多少可以让我纠结的内心得到时不时的休息,但选择终究是需要到来的,该怎么决定呢?

国税这个衙门真不好伺候!

最近要给一个废弃多年的公司补税交罚款,还得填一百多张乱七八糟的表格,崩溃了!

想起不久前和一个税务的哥们聊天开的玩笑话。

我: 你们这些腐败的GCD啊!
哥们:都你们害的,你们能做到不让我们腐败么?
我: 汗。。。

setenforce 0

不重启机器就得时不时来这么一下,不爽,习惯了FreeBSD,突然切换到CentOS,还得磨合!