摘要:
这是本人在研究 Cocoa 开发过程中写过的一些文章,涵盖 runtime,class, message,多线程,core data,网络,framework,plugin等各方面,还比较成系列,所以整理出来,贴在这里,希望对大家有帮助。文章错误之处,也希望大家指正。所有文章均遵循“署名-非商业用途-保持一致”创作公用协议。 阅读全文
摘要:
贝叶斯定理的思想出现在18世纪,但真正大规模派上用途还得等到计算机的出现。因为这个定理需要大规模的数据计算推理才能凸显效果,它在很多计算机应用领域中都大有作为,如自然语言处理,机器学习,推荐系统,图像识别,博弈论等等。本文先介绍贝叶斯定义,然后对定义进行解释,再通过一些列子的分析,力图让贝叶斯定理通俗易懂。 阅读全文
摘要:
我在 github 上用 octopress 搭建了个人博客,octopress 使用Markdown语法编写博文。之前我在CSDN博客上也写过不少的技术博文,都说自己的孩子再丑也是个宝,所以就起了把CSDN博客里面的文章导出到个人博客上的念头。刚开始想找个工具把CSDN博客导出为xml或文本,然后再把xml或文本转换为Markdown博文。可惜搜了一下现有博客导出工具,大部分要收费才能将全部博文导出为xml格式,所以就只好发明轮子了:写个工具将全部博文导出为Markdown博文(也是txt格式的)。
我将详细介绍这个工具的编写过程,希望没有学习过编程的人也能够学会一些简单的Python语法来修改这个脚本工具,以满足他们将其他类型的博客导出为文本格式。这也是我第一次学习和使用Python,所以相信我,你一定也可以将自己的博客导出为想要的文本格式。
本文源代码在这里:ExportCSDNBlog.py 阅读全文
摘要:
在本系列文章的第一篇《Android多线程分析之一:使用Thread异步下载图像》中,曾演示了如何使用 Thread 来完成异步任务。Android 为了简化在 UI 线程中完成异步任务(毕竟 UI 线程是 app 最重要的线程),实现了一个名为 AysncTask 的模板类。使用 AysncTask 能够在异步任务进行的同时,将任务进度状态反馈给 UI 线程(如让 UI 线程更新进度条)。正是由于它与 UI 线程紧密相关,使用的时候要就有一些限制,AysncTask 必须在 UI 线程中创建,并在 UI 线程中启动(通过调用其 execute() 方法);此外,AysncTask 设计的目的是用于一些耗时较短的任务,如果是耗时较长的任务不推荐使用 AysncTask。 阅读全文
摘要:
在前面两篇文章《Android多线程分析之二:Thread的实现》,《Android多线程分析之三:Handler,Looper的实现》中分别介绍了 Thread 的创建,运行,销毁的过程以及 Thread与 Handler,Looper 之间的关联:Thread 在其 run() 方法中创建和运行消息处理循环 Looper,而 Looper::loop() 方法不断地从 MessageQueue 中获取消息,并由 Handler 分发处理该消息。接下来就来介绍 MessageQueue 的运作机制,MessageQueue。 阅读全文
摘要:
在前文《Android多线程分析之二:Thread的实现》中已经详细分析了Android Thread 是如何创建,运行以及销毁的,其重点是对相应 native 方法进行分析,今天我将聚焦于 Android Framework 层多线程相关的类:Handler, Looper, MessageQueue, Message 以及它们与Thread 之间的关系。可以用一个不太妥当的比喻来形容它们之间的关联:如果把 Thread 比作生产车间,那么 Looper 就是放在这车间里的生产线,这条生产线源源不断地从 MessageQueue 中获取材料 Messsage,并分发处理 Message (由于Message 通常是完备的,所以 Looper 大多数情况下只是调度让 Message 的 Handler 去处理 Message)。正是因为消息需要在 Looper 中处理,而 Looper 又需运行在 Thread 中,所以不能随随便便在非 UI 线程中进行 UI 操作。 UI 操作通常会通过投递消息来实现,只有往正确的 Looper 投递消息才能得到处理,对于 UI 来说,这个 Loop 阅读全文
摘要:
在前文《Android多线程分析之一:使用Thread异步下载图像》中演示了如何使用 Thread 处理异步事务。示例中这个 Java Thread 类都是位于 Framework 层的类,它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的。因此要分析 Androd 中的线程,就需要分析这两层中的与线程相关的代码,这就是本文要探讨的主题。本文将把 Framework 层中的 Java Thread 称为 Android 线程/Thread,而把 dalvik 中的 Thread 成为 dalvik 线程/Thread。 阅读全文
摘要:
打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask,当然不可避免地要涉及到 native 方法,因此也会分析 dalvik 中和线程以及消息处理相关的代码:如 dalvik 中的 C++ Thread 类以及 MessageQueue 类。本文将从一个使用 Thread 的简单 应用入手,引入 Thread 这个话题,接下来的几篇文章会依次介绍前面提到的那些主题。 阅读全文
摘要:
众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文完整源码:点此查看
首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator)。其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vector,第二组是 map 和 set。 阅读全文
摘要:
前不久我发了一篇《八一八招聘的那些事儿》讲了我自己作为求职者对招聘的一些看法。那个时候我还在求职,对求职的结果还是挺满意的,五家公司面试,放弃了其中三家的offer(包括盛大云计算,东航信息部以及一小美资公司),拒了一家的二面(因为我已经做好决定了),最后选择了以前工作过的老东家-上海科泰。虽然科泰给的 offer 待遇不是所有 offer 中最高的,但我还是选择回归,主要是基于两点:对做的事情感兴趣能有担当,人好打交道团队氛围自由融洽(像我离开了又回来了)。
回来之后,就开始忙着招人的事情,可是招人的成功率远不像我求职时成功率那么高,大概只有20%的成功率。我想待招聘的事情告一段落之后,或许可以整理一篇《八一八求职的那些事儿》来讲讲从招聘方角度来看求职的一些想法。暂且列举一些目前碰到的常见求职问题:不了解招聘岗位要求,没有职业规划,工作多年却大部分时间在做维护(大公司病,局限于现有成熟框架内某个模块里的修修补补,而对框架以及其他模块却不甚了解),没有求知欲。或许是因为简历大都是从招聘网站上过来的,导致求职人员技术水平参差不齐,因此就有借博客宝地招人的想法。
先来说说我们在 阅读全文
摘要:
让gcc支持成员函数模板的trick
同样的代码在 VS2010 中编译运行是没有问题的,但在 gcc 4.7.3下,编译都通不过:
../src/MemFunTemplate.h:21:14: error: explicit specialization in non-namespace scope ‘struct Functor’
../src/MemFunTemplate.h:22:24: error: template-id ‘function’ in declaration of primary template
../src/MemFunTemplate.h:26:14: error: explicit specialization in non-namespace scope ‘struct Functor’
../src/MemFunTemplate.h:26:38: error: template-id ‘function’ in declaration of primary template
../src/MemFunTempla 阅读全文
摘要:
Ubuntu下安装 jdk6 阅读全文
摘要:
最近换了份工作,有一些求职的经历,再加上之前在公司做过一些招聘的事情,对于应聘与招聘有很多的感悟。趁着这感悟还尚未退温,在这职业的空挡期整理一下,记录下来。下面,我将从有工作经验的求职者的角度来八一八我对招聘的一些看法。 阅读全文
摘要:
在前文《深入浅出Cocoa多线程编程之block与dispatch quene》中我介绍了 block 的一些基本语法以及如何和 GCD 结合的使用示例。block 是在 iOS 4 中引入的新特性,它和 C++ 11 中的 lamba 表达式概念相似,有时候也被称为闭包。经过一段时间的使用,我发现要用对用好 block 还是有不少需要注意的地方,今天就来八一八这些值得注意的事儿。
1,block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝。
2,非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制。
3,使用 weak–strong dance 技术来避免循环引用。
4,block 内存管理分析 阅读全文
摘要:
前文《iOS网络编程之Socket》 和《iOS网络编程之CFNetwork》 讲了最底层的 socket 和Core Foundation层的 CFNetwork,本文将介绍位于 Cocoa 中的 NSStream。NSStream 其实只是用 Objective-C 对 CFNetwork 的简单封装,它使用名为 NSStreamDelegate 的协议来实现 CFNetwork 中的回调函数的作用,同样,runloop 也与 NSStream 结合的很好。NSStream 有两个实体类:NSInputStream 和 NSOutputStream,分别对应 CFNetwork 中的 CFReadStream 和 CFWriteStream。
本文示例代码请查看:
https://github.com/kesalin/iOSSnippet/tree/master/KSNetworkDemo 阅读全文
摘要:
本文将介绍位于 Core Foundation 中的 CFNetwork。CFNetwork 只是对 BSD socket 的进行了轻量级的封装,但在 iOS 中使用 CFNetwork 有一个显著的好处,那就是 CFNetwork 与系统级别的设置(如:天线设置)以及 run-loop 结合得很好。每一个线程都有自己的 run-loop,因此我们可以 CFNetwork 当中事件源加入到 run-loop 中,这样就可以在线程的 run-loop 中处理网络事件了。本文示例代码就是这样做的,源码请查看:
https://github.com/kesalin/iOSSnippet/tree/master/KSNetworkDemo 阅读全文