程序员与大师系列

程序员见禅师:我学了 hello world 和水仙花数,想自己开发个操作系统,希望大师指点。

禅师笑而不语,抓来一只鸡,在鸡腿上缠根线,他一拉线,鸡立即跌倒,鸡挣扎起来继续走,禅师又一拉,鸡又跌倒,如此反复八次之多。

程序员若有所悟:“大师您是让百折不挠,再接再厉?”

禅师一笑:“小伙子,我是让你拉鸡八倒。”

1.2
程序员问禅师:我总是和我的同事们合不来,他们使用 Java,我使用 PHP。

禅师笑而不语,拿出一根筷子,递给青年:来,折断它。

青年接过筷子,很轻松地就折断了。

禅师又拿出四十七根筷子,青年抢过来,抄出把斧头全砍断了。

禅师沉吟片刻,摆出架式,双手合十:你们应该使用 Python 语言。

1.3
程序员对禅师说:“禅师,有些东西我放不下。”

禅师说:“没有什么东西是放不下的。”

程序员摇了摇头,打开电脑。

禅师说:“还是买个大点儿的硬盘吧。”

1.4
一程序员请教禅师:我最喜欢 java 语言,但是别人总说 java 不好,java 将死,我该如何?

禅师拿起一把斧子抛向天空,然后问:听到天空喊疼的声音了吗?

该程序员摇头:斧子又没伤到天空,天空怎么会喊疼呢?

禅师点头:天空那么高远辽阔,何事不能容。做名合格程序员,要像天空一样。斧子扔得再… 啊呀我操…

1.5
程序员去拜访禅师:每次遇到程序 bug,我都心急如焚,特向大师求心灵平静之道。

禅师一言不发,先去劈柴,然后打水,把柴放入灶中点燃,用大壶烧水,细细地一个个擦拭茶杯。

程序员恍然大悟:“您的意思是,要善于从生活的细处去体验人生!”

禅师放下手里的活计,淡然道:“我这刚上班,正忙着呢,别他妈烦我!!”

1.6
程序员问禅师:“我想开发一个网站,其中包罗万象,汇集人人、QQ、facebook、淘宝的所有特长,大师觉得如何?”

禅师一言不发带他来到院子里,几棵梅树正默默地吐露着芬芳。

“梅花香自苦寒来...”

程序员很受感动:“大师!您是想告诉我只要不断努力就能得偿所愿吗?”

禅师摇了摇头:“梅前你说个屁。”

摘自程序员联盟微信

呵呵嗒

我要建一座200层的世界最高的大楼,我已经想好怎么卖,怎么赚到用不完的钱了,设计也有了,就是抄一下地王大厦,就差堆钢筋水泥的了,来招俩码农,一个堆钢筋,一个堆水泥就可以了。来吧,给你10%股份,然后我再找风投,两个月就可以盖好,然后你有用不完的钱了……

来自开源中国

http://www.oschina.net/news/62390/we-only-need-programmer

10000小时定律

美国作家马尔科姆·格拉德威尔通过多年研究,得出一个定律——10000小时定律。他认为,天才不过是做了足够多的练习的人。一个人想在任何领域取得成功,就需要练习10000个小时,即每天3小时,练习10年。只有受到如此多的训练,才能达到精通的程度。

Android AlarmManager实现不间断轮询服务[转载]

来源:http://blog.csdn.net/ryantang03/article/details/9317499

写在这里是为了自己用来保持CPU不休眠做参考,内容有删减,在此感谢原作者

更多信息请看这里(原文地址)

-------------------------------------------------------

在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了。但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一次,那用轮询也是一个不错的选择,因为不需要额外搭建推送服务器,不用额外配置推送服务。另外推送现在一般以维持长连接的方式实现,在手机客户端也会耗费一定的电量。今天就介绍一个在Android上实现轮询机制的方法——使用AlarmManager

AlarmManager在Android中主要用来定时处理一个事件或是定期处理一个事件,比如闹钟应用就是使用AlarmManager来实现的,我们今天要使用AlarmManager的定期执行功能来实现轮询的功能。对于定期执行任务也可以用Timer和TimerTask来实现,也可以开一个Service在Thread里面以while循环来实现。但最好的方案还是选用AlarmManager,这里涉及一个Android系统锁的机制,即系统在检测到一段时间没有活跃以后,会关闭一些不必要的服务来减少资源和电量消耗。使用Timer和Service来实现的话很可能出现的情况就是屏幕熄灭后一段时间,服务就被停止了,当然轮询也就被停止了。

部分代码:

一、新建轮询工具类PollingUtils.java

public class PollingUtils {

    //开启轮询服务
    public static void startPollingService(Context context, int seconds, Class<?> cls,String action) {
        //获取AlarmManager系统服务
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
       
        //包装需要执行Service的Intent
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
       
        //触发服务的起始时间
        long triggerAtTime = SystemClock.elapsedRealtime();
       
        //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,
                seconds * 1000, pendingIntent);
    }

    //停止轮询服务
    public static void stopPollingService(Context context, Class<?> cls,String action) {
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //取消正在执行的服务
        manager.cancel(pendingIntent);
    }
}

二、构建轮询任务执行PollingService.java

public class PollingService extends Service {

    public static final String ACTION = "com.ryantang.service.PollingService";
   
    private Notification mNotification;
    private NotificationManager mManager;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        initNotifiManager();
    }
   
    @Override
    public void onStart(Intent intent, int startId) {
        new PollingThread().start();
    }

    //初始化通知栏配置
    private void initNotifiManager() {
        mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        int icon = R.drawable.ic_launcher;
        mNotification = new Notification();
        mNotification.icon = icon;
        mNotification.tickerText = "New Message";
        mNotification.defaults |= Notification.DEFAULT_SOUND;
        mNotification.flags = Notification.FLAG_AUTO_CANCEL;
    }

    //弹出Notification
    private void showNotification() {
        mNotification.when = System.currentTimeMillis();
        //Navigator to the new activity when click the notification title
        Intent i = new Intent(this, MessageActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i,
                Intent.FLAG_ACTIVITY_NEW_TASK);
        mNotification.setLatestEventInfo(this,
                getResources().getString(R.string.app_name), "You have new message!", pendingIntent);
        mManager.notify(0, mNotification);
    }

    /**
     * Polling thread
     * 模拟向Server轮询的异步线程
     * @Author Ryan
     * @Create 2013-7-13 上午10:18:34
     */
    int count = 0;
    class PollingThread extends Thread {
        @Override
        public void run() {
            System.out.println("Polling...");
            count ++;
            //当计数能被5整除时弹出通知
            if (count % 5 == 0) {
                showNotification();
                System.out.println("New message!");
            }
        }
    }
   
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service:onDestroy");
    }

}

三、在MainActivity.java中开启和停止PollingService

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Start polling service
        System.out.println("Start polling service...");
        PollingUtils.startPollingService(this, 5, PollingService.class, PollingService.ACTION);
    }
   
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //Stop polling service
        System.out.println("Stop polling service...");
        PollingUtils.stopPollingService(this, PollingService.class, PollingService.ACTION);
    }

}

四、运行效果

运行工程后可以在控制台输出看到,每隔5s就发出一个通知,退出Activity时,轮询服务就停止了,达到了我们事先期望的效果,并且锁屏后很长一段时间也不会停止服务,因为AlarmManager是系统及服务。(Demo效果图略)

当进入消息详情Activity时,顶部状态栏的消息通知就会取消,使用如下方式也可以取消状态栏顶部的消息通知显示:

NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        manager.cancelAll();

以上就实现了使用AlarmManger实现轮询的一种方式,有不足或缺陷的地方欢迎大家留言补充,以上代码只是部分,需要工程源码的同学可以到Github上Clone:https://github.com/tangren03/RTPollingDemo