Surface Pro 已连接未充电问题总结

Author:zhang Date:2015年7月3日 - 0:00 AM

最近被Surface Pro的已连接未充电问题折腾的够呛. 因为一旦遇到这个问题, 又不知道原因, 只能束手待毙, 看着电池电量一点点的掉光, 然后突然关机, 然后无论怎么也启动不了了.

第一次碰到这个问题是很突然的, 因为一直用的好好的, 从来没有这种问题, 直到有一次, 用着用着突然黑屏了, 尽管充电器一直是联通着的. 从此以后就不得安宁, 问题反复出现.

more

Python win32 编程: 实现快捷键切换窗口并注册为service

Author:zhang Date:2015年7月2日 - 0:00 AM

窗口切换是我们平时经常用到的一个操作, 我的感觉是普通的Alt + Tab的切换方式有些许不足, 在效率方面有值得改进的地方. 一个很普遍的现象是, 虽然一般我们会开很多个窗口, 但是使用最频繁的那些窗口数量是有限的, 我使用最频繁的几个窗口是: Emacs编辑器, cmd控制台, Chrome浏览器, 这几个基本是一直开着. 其他的窗口基本都是临时打开的, 或者很少去看的.

然而使用Alt + Tab的方式, 这些很频繁的操作很少能够一键直达, 而是要筛选, 而且会分散注意力, 因为Alt + Tab之后要计算还需按几下才能到达目的地. 做多了之后, 就会感觉是个负担. 其实在Emacs内也有同样的问题, 在不同的Buffer之间切换的时候, 有时候也要找一找. 应该说凡是带有标签栏的多窗口应用程序例如浏览器, Emacs, Eclipse之类的IDE, 都存在这选择困难低效的情况.

more

Python print 字符串编码问题

Author:zhang Date:2015年7月1日 - 0:00 AM

又一次, 被Python的编码问题搞得焦头烂额. 过去的记忆中, Python给我的印象之一就是让人痛不欲生的编码问题, 后来基本不碰Python很可能与此有关. 这次又用到Python了, 基本上, 整个过程还是比较顺畅的, Python在某些问题上面的确有优势. 但是不可避免的又碰到编码问题.

事情是这样, 在Python中调用win32的api, 枚举所有活动的窗口, 得到窗口的句柄, 窗口标题, 和窗口类名, 拿到这些数据之后, 用print 输出到控制台中. 开始一切都很好, 突然某次在运行的时候出错: UnicodeEncodeError, 但是之前都没有报过错, 而且接下来问题时有时无.

more

Clojure之atom详解

Author:zhang Date:2015年5月14日 - 0:00 AM

atom是Clojure的同步原语中最基本的一个组件, 实现上没有什么特别的, 就是对Java的java.util.concurrent.atomic中的AtomicReference的一个wrapper. Atomic功能需要直接的CPU硬件的支持, 而不仅仅是一个第三方软件库而已. 所以应该先从这里讲起.

这个问题我觉得讲的最好的是"PThreads Primer A Guide to Multithreaded Programming" 的第六章 Synchronization.

more

关于Clojure STM write skew详解

Author:zhang Date:2015年5月4日 - 0:00 AM

考虑一个数据库系统重的普遍情形: 对同一个数据, 一个线程对其进行读取, 另一个线程写入, 两者同时发生. 如果不加控制, 结果肯定会出问题, 以表的一个行为例子, 可能一个线程更新了某个字段, 另一个字段还没有更新, 另一个线程就读取了这一行, 等两个线程都执行完成, 他们看到的数据肯定是不一致的. 为了解决这个问题, 最简单, 最直接的方式就是加锁, 读的时候锁定, 其他线程等待, 读完了之后释放, 写的时候也加锁, 其他线程访问的时候等待.

这样的问题也同样出现在多人并行开发的版本控制系统当中, 采用最简单的方法相当于, 某个开发人员修改代码的时候, 文件就会被锁住, 其他人不能访问, 只能干等. 很显然这样的模式可以保证数据的完整性, 但是要牺牲系统的效率.

more

Clojure宏练习: 让代码运行指定的时间段

Author:zhang Date:2015年5月1日 - 0:00 AM

在模拟某些事件的时候, 我们可能需要一个无限循环, 例如哲学家进餐的例子中, 就可能会用一个无限循环来模拟一个哲学家进餐的过程. 这样的弊端是, 一旦运行, 我们的REPL就无法返回, 唯一的办法就是强行终止JVM, 然后重开. 而实际上, 我们不一定需要这样做, 将无限循环变成运行指定的时间段同样可以达到模拟的效果, 而系统可以更加优雅的结束.

和dotimes一样, 我们可以用macro来做到这一点, 区别只是一个指定次数, 一个指定时间.

more

为什么Clojure的for loop不会栈溢出

Author:zhang Date:2015年4月17日 - 0:00 AM

Clojure中的for loop是用macro实现的, 我发现展开之后的代码中是包含递归的, 例如下面的代码,

展开之后

Update: 什么时候for loop会溢出

more