生活点滴 - 20141114

一直都想写些文章,写些有用的东西,记录那瞬间流逝的灵感,可是,整天“胡思乱想”,徒然增添烦恼,于是只好暂借圣贤先哲之训,一步步道来。

古之学者为己,一句话:说出你的心声!
文章合为时而著,歌诗合为事而作:动机与激情!或为国,或为时政,或为民,或为家。

路漫漫其修远兮,吾将上下而求索


看完《看不见的战争》,心中忐忑不安,却又坦然可笑。

忐忑是担忧政府能否扛起国家公器,保卫家园;

不安是怕有生之年遭遇战乱,尤其年迈无力之时;

坦然是因为祖国正如初升太阳,冉冉升起,越来越强大;

可笑是这个世界的本来面目就是如此,过去发生过的,今天仍旧在发生,当然,未来还会发生。


《环球人物》杂志:印度总理莫迪,百天要建530万厕所。

莫迪说:厕所先于神庙。绝妙口号!看来他是深知印度的病根在哪啊!
不过,一个国家领导人总是对厕所“念念不忘”,也是怪不容易的!

对了,BBC新的纪录片《生而不幸为印度女》中披露的令人憎恨和恶心的习俗和现象,也是一大问题,再来一句口号吧:尊重女性先于神庙。


锻炼腹肌、三角肌和背阔肌已经有3个多礼拜了,祝贺下,坚持就是胜利。看着腹肌一块块慢慢变得明显,成就感还是杠杆的,不过,腹肌太难练了,而且真的很难坚持。

以下是好料推荐:

  1. iOS应用Naeto App.: 让你直接在通知中心记录笔记!(尝鲜,目前Android没有哦,可考虑开发!)
  2. 访谈记录片《看不见的战争》(The War You Don’t See)
  3. 电影《月球》, 关键字:孤独与情感诉求,克隆人与归宿,资源争夺;感想:无以言表

Udacity公开课:软件调试(优酷旁听)

Udacity公开课:CS259软件调试

课程概览

目标
如何系统化的调试
使用自动化调试工具
使用一系列试验,进行程序科学调试假设验证

大纲

  1. 调试如何工作?
  2. 断言实验
  3. delta 自动化调试方法
  4. 程序 bug 如何产生
  5. 重复错误如何发生,统计调试错误源
  6. 信息挖掘 :bug 数据库和变更数据库

第一节

序言:深夜调试

  • 程序员手工调试的弊端:注意力有限,不集中;花费更多时间以致减少了和陪伴家人的时间;
  • 软件工作量占比:测试和调试经常在 50% ~ 75%
  • 调试的困难:无法估计

启程

  • 处理 HTML 输出文本(tag 模式与有限状态机);
  • 简单例子foo:两种状态(tag、text);
  • 第一个漏洞,foo:三种状态(tag、text 和 quote)
  • 第二个漏洞,”foo“;
  • 任意输出变量值调试:时间杀手!任意变更代码调试:混乱杀手!
  • 《代码大全》- 历史:魔鬼调试指南;
  • 修复调试;糊弄单元调试案例;
  • 程序变量的状态 -> defect 感染点 -> 感染点传染 -> 错误;引发感染的情形 -> 调试/测试的 cases
  • 解决:科学假设 -> 预测 -> 试验 -> 渐进式改进假设 —> 理论
  • 假设I:简单测试,输入”foo” -> “bar” -> “”;(因果链)

进度:Udacity公开课:CS259软件调试:01-29 你好断言

未完待续

Android 面试题记录 (三)

1. 关于 Service 的一些细节

  • Service 的种类:Started Service 和 Bound Service,分别对应于 Context.startService(Intent) 和 Context.bindService;
  • 如果一个 Service 在 onStartCommand 执行的过程中被终止,则已提交的 Intent 将得不到机会启动,该 Intent 仍会被视为一个挂起的请求,而非一个已启动的请求(started request);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Started Service
public class StartedEatService extends Service {
@Override public int onStartCommand(Intent intent, int flags, int startId) { ... }
@Override public IBinder onBind(Intent intent) { return null; }
}
// return value of onStartCommand:
// 1. START_STICKY,Service 将以新进程的形式予以重新启动而不管是否有任何挂起的请求,
// 被终止的请求将不会重新提交,如果有挂起的请求,flags 值将被设置为 START_FLAG_RETRY,
// 如果没有任何挂起的请求,重新启动后,onStartCommand 的 Intent 值为 null;
// 2. START_NOT_STICKY,与上一个 flag 相同,但有一个区别是,Service 只在有挂起的请求时才重新启动;
// 3. START_REDELIVER_INTENT,将为那些挂起的请求或正在执行的而没有完成的请求重新启动,
// 其中挂起的请求,flags 值将设置为START_FLAG_RETRY,而未完成的请求则为 START_FLAG_REDELIVERY;
//
public class BoundService extends Service {
@Override public IBinder onBind(Intent intent) { /* Return communication interface */ }
@Override public boolean onUnbind(Intent intent) { /* Last component has unbound */ }
}

Local Binding

more >>

Android 面试题记录(二)

1. 管理基本线程的生命期

生命期 :New -> Runnable -> Blocked/Waiting(Thread.sleep() | Thread.yield()) -> Terminated

Uncaught Exceptions

  • Thread global handler:static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler);
  • Thread local handler:void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler);
  • Unhandled Exceptions on the UI Thread,参见面试题记录(一)
1
2
3
4
5
6
7
8
9
10
11
12
Thread t = new Thread(new Runnable() {
@Override public void run() {
throw new RuntimeException("Unexpected error occurred");
}
});
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override public void uncaughtException(Thread thread, Throwable throwable) {
// A basic logging of the message. Could be replaced by log to file or a network post.
Log.d(TAG, throwable.toString());
}
});
t.start();

在 Activity 中保持线程

  • public Object onRetainNonConfigurationInstance():Called by the platform before a configuration change occurs, the implementation should return any object that you want to be retained across a configuration change (e.g., a thread) and passed to the new Activity object.
  • public Object getLastNonConfigurationInstance():Called by the platform before a configuration change occurs, it can be called in onCreate or onStart and returns null if the Activity is started for another reason than a configuration change.

more >>

自愿的死亡/施予的道德 —— 《查拉图斯特拉如是说》

21. 自愿的死亡

  • 自愿需要智慧、旷达
  • 死亡需要勇气、意志

书:要死得其时,这是我对死亡的唯一教义。(古人说:生逢其时,死得其所!)

书:但是,你们习而不察,并不知道何谓圆满的死亡,后者即便是对活着的人,亦是一种鼓舞与允诺,而这正是我要教给你们的。(壮哉!戊戌变法七君子。悲乎!精忠报国岳父子。)

书:我什么时候需要死亡?对于那些胸怀宏图大业的人士,只有当其完成事业,或者为其未竟的事业找到了继承人之时,才能了无遗憾,撒手人寰,只有这时,他才需要死亡。
书:你们口口声声自称要忍受大地的一切;相反,大地忍受你们这些多余的人,已经太久了。
书:他所通晓的,不过是希伯来人的泪水和忧伤,以及善人君子之间的相互怨恨。这个希伯来人耶稣,… 可惜他还未成熟,过早地凋零了。作为年轻人,他尚且不够成熟,所以他幼稚地憎恨人类和大地

书:坦荡地奔赴死亡,死后必得大解脱。既然已经完成了人的肯定的事业,那么现在应当是翻过新的一页,完成神圣的否定事业的时候了,这是他对生死的了悟。(风萧萧兮水易寒,壮士一去兮不复返!荆轲“好读书击剑”,“虽游于酒人乎,然其为人沉深好书”)
书:我愿如此地死去,因为我的死,你们反而更加热爱大地。(一代天骄成吉思汗)

22. 施予的道德

程序员的自我修养 - 从Hello World!说起

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

背景知识

  • 不要让CPU打盹:分时多任务、进程、抢占式分配CPU;
  • 磁盘:扇区、LBS(逻辑扇区号)、文件系统;
  • 内存不够怎么办:1. 分段(解决地址空间不隔离);2. 分页【页大小、虚拟页/物理页、页错误和MMU(虚拟地址到物理地址的转换)】(解决使用效率低);
  • 线程:一个进程由一个或多个线程组成;一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成;状态(就绪、运行、等待);Linux的多线程(fork、exec和clone、写时复制);
  • 线程安全:竞争与原子操作、同步与锁(二元信号量和信号量【即多元信号量】、互斥量和临界区、读写锁、条件变量);可重入;
  • volatile:阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回;
  • 对象构造(pInst = new PInst())包含三个顺序的步骤:1. 分配内存;2. 在内存的位置上调用构造函数;3. 将内存的地址赋值给pInst;【在上述三个步骤中,CPU完全有可能动态调整2和3的执行顺序!】
  • 线程并发模型:1. 一对一模型;2. 多对一模型(将多个用户线程映射到一个内核线程上);3. 多对多模型;

Hello World 程序构建

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}

初级:

  1. 预处理: $ gcc -E hello.c -o hello.i 或 $ cpp hello.c > hello.i
  2. 编译: $ gcc -S hello.i -o hello.s(现在版本的 GCC 把预处理和编译两个步骤合并成一个步骤,使用一个cc1的程序。)
  3. 汇编:$ as hello.s -o hello.o 或 $ gcc -c hello.s -o hello.o(根据汇编指令和机器指令的对照表一一翻译即可。)
  4. 链接:$ ld -static /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.3/crtbeginT.o -L/usr/lib/gcc/1486-linux-gnu/4.1.3 -L/usr/lib -L/lib hello.o —start-group -lgcc -lgcc_eh -lc —end-group /usr/lib/gcc/i486-linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

more >>

Android 面试题纪录(一)

目录

  1. JVM和DVM的不同
  2. Android如何启动一个应用
  3. UI Thread 如何工作
  4. UI Thread 消息机制 API 概览
  5. 阐述 MessageQueue.IdleHandler
  6. Android 平台如何调度线程
  7. Android下线程有哪些通信方式
  8. 进程间如何通信
  9. Android 如何管理内存


1. JVM和DVM的不同

  • JVM is a stack-based machine; while DVM is register-based(执行相同任务比JVM使用更少的指令);
  • A stack-based virtual machine must transfer data from registers to the operand stack before manipulating them. In contrast, a register-based VM operates by directly using virtual registers. This increases the relative size of instructions because they must specify which registers to use, but reduces the number of instructions that must be executed to achieve the same result.

2. Android如何启动一个应用

Zygote启动应用流程

  • Android启动时将率先运行一个独特的进程Zygote。而Zygote将启动一虚拟机,该虚拟机将预先加载Android核心库并初始化各种共享资源体,最后它将使用套接字进行监听。
  • 当用户启动一个Android应用时,Zygote将创建一个虚拟机(通过写时复制(Copy-On-Write)的技术拷贝Zygote虚拟机)以便其运行,并以子进程的身份和其父进程共享内存。

more >>

Stockeye项目 - CalendarStock包(初步设计)

预构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// class UtilCalTime
public int getIntCal();
public String getStrCal();
public String getCalFormat();
public String getTimeHHMMSS();
public String getTimeFormat();
public String getLatestDayOfStock();
public String[] getWorkdayArrayUtilNow();
public int getIntWeekday();
public String getWeekday();
public int getCountByTenSecond();
public boolean checkIsWorkday();
public String convertIntToCalFormat();
public int convertStrCalToInt();
public int getQuarterByMonth();
public int getWeekIndexOfYear();
public int getDateIndexOfYear();

more >>

生活点滴 - 141106

晨早起床,仍然有些困,大概这是长期熬夜积累下来的债务吧,怎么睡都不够。

继续恶补 Java 基础知识。

在网上买的书寄到了,nice!如果我有什么收藏爱好的话,那就是书籍,正希望家的旁边就是一座拥有最新书籍的图书馆!

问:今天我进步了吗?除了收集了一堆知识,还有什么?

  1. 创造了应用?(继续构思 Stockeye 用户界面)
  2. 独特的生活体会或启发?(面试建议问的问题:在您看来,怎么样才能算胜任这个岗位呢? 您认为这个岗位最大的挑战是什么? 在这里工作您最喜欢的,还有最不喜欢的是什么?)
  3. 使用了高效率的工具促进工作、生活?(开通了worktile,IT团队协作工具。)

以下是好料推荐

  1. 混球幸福哲学
  2. 旅游去处:丽江。