Nov 262012
 

一些思考方法 Some way of thinking 一直以来,导师和一些优秀的同学都有不同寻常的有趣的思考方式、交流方式。通过和他们的接触,我总结了一些思考方法。 1. STAR 与别人交流学术往往在于交流方法,交流思考的方式。而人由于所处环境,学习过程的影响,往往有不同的知识结构。比如学习空间统计的人,往往把问题往空间统计模型上靠。这时,有效的交流不是两个人在各自的领域发表见解,而应该是了解对方的思想。 在这种场合,可以使用STAR方法。 STAR方法通常在找工作时回答Behavior Question时使用。它指的是(wiki): The STAR (Situation, Task, Action, Result) format is a job interview technique used by interviewers to gather all the relevant information about a specific capability that the job requires. This interview format is said[by whom?] to have a higher degree of predictability of future on-the-job performance than the […]

Nov 142012
 

制作Scientific Poster How to make scientific poster 做一个好的poster需要用Illustrator,简单的来讲,Poster中任何非文字的部分都应该采取矢量图(公式、图示、表格),而文字部分应该在Illustrator里完成。 如果想我一样从没用过Illustrator,应该看这个youtube教学视频,这个视频专门针对Scientific Poster分八讲讲解Illustrator中各个细节。 下面一些链接都很有用: UMichigan library link Illustrator Creating Text Scientific Poster Design A good pattern of color

Oct 242012
 

作为一个工科学生,学术水平应该和管理水平同步提高。 吳俊瑩 老师,据我所知,在一个IT公司工作过,同时对公司、项目管理有仔细的思考。 今年以来,读他的文章给我很多启发。 比如 “研發人員應該「拜」王陽明”中首先提到了获取知识的两个方法,看书和问人。之后提出实践,最后讲“在技術的各種領域中,根本的道理有很多還是相通的,新東西永遠學不完,重點應該是自己有沒有把每一件研發工作都 徹底完成,一步一腳印地累積。” 在学术领域,我凭着兴趣接触了各种项目,在很多方面都有自己小小的贡献,但没有适当的总结,写出论文。如果能早早研读吳俊瑩老师的文章,一定会有更好的结果。 吳俊瑩经常在台湾的ITHOME杂志发文。很多文章非常精彩。可惜没有一个索引页面把他所有的文章组织起来。 我就列出几个最近的文章链接吧: 彼得杜拉克如是說 「不聞不問」不算「信任」

Aug 302012
 

2015-06-16 更新: 这里讲的方法可能已经不管用了,至少在我使用Solaris 10 的VirtualBox Image的时候,下面的方法行不通。 Install Solaris 10 and install R under Solaris 最近的写的一个R package vcf2geno不能在Solaris 10 下编译。 为了解决这个问题,我决定重复CRAN上Solaris 10的测试环境。 下面写个流水账 1.安装Virtual Box 下载,安装。 2.安装Solaris 10 和 Guest OS 一定要注意的是手动分区,把/tmp的容量设置到5G以上。不然默认的/tmp只有512M,这样就不方便安装Solaris Studio (第3步)。 安装virtualBox的Guest OS 软件后,Solaris的屏幕分辨率增加。 3.安装Solaris Studio 12.3 下载,解压,安装 (就是特别慢) 4.安装OpenSolaris Solaris里面没有ubuntu的apt和fedora的yum,但是有个类似的软件叫做OpenCSW Link. 参考OpenCSW的手册Getting Start. 然后用pkgutil安装tetex, gcc4g++, iconv, readline 5.下载R 去R的主页下载源代码,然后解压 6.配置环境参数,安装 export CC=suncc […]

Aug 282012
 

查看gcc build-in specs gcc -dumpspecs -dumpspecs Print the compiler’s built-in specs—and don’t do anything else. (This is used when GCC itself is being built.) 看gcc到哪些目录查找头文件: gcc -print-search-dirs -print-search-dirs Print the name of the configured installation directory and a list of program and library directories gcc will search—and don’t do anything else. This is useful when […]

May 252012
 

Mac Mail设置邮件签名的时候,签名字体和邮件正文总是无法一致。 比如下图:(之前) 参考:http://apple.stackexchange.com/questions/10530/mail-signature-changes-font-size-when-sent-to-gmail 发现Mac下解决这个问题不难,但也很烦。 把步骤写下来,以备不时之需吧。 1. 退出Mail 2. 进入: ~/Library/Mail/Signatures 3. 用Web Archive Folderizer打开: DBA028E6-8465-492D-B0AF-4B19D3C06450.webarchive (总之是一个奇怪的文件名字) 之后会出现新目录“DBA028E6-8465-492D-B0AF-4B19D3C06450”,里面有一个叫做“localhost”的文件。 4. 用Text Edit打开这个文件,把所有font-size = medium,都改成font-size = 12px 。 因为默认的邮件字体是Helvetica 12。 5. 把改好的文件存为localhost.html 6. 用Safari打开localhost.html,然后存成Webarchive格式,覆盖:DBA028E6-8465-492D-B0AF-4B19D3C06450.webarchive 7. 打开Mail 好了,现在的签名字体和邮件正文的字体一致了。 (之后)

Apr 052012
 

Measure memory consumption of programs in Linux 在衡量程序性能时不仅需要测量运行时间,还常常需要测量其内存使用。比如如果一个程序比更一个程序快,有可能是以空间换取时间,因此单纯比较运行速度就失去了意义。我们这里演示如何在Linux环境下测量程序的内存占用。 我们先要弄清楚内存的含义:对于运行中的程序而言,它有四个部分:数据,文本,堆,栈(data, text, stack, heap)。对于操作系统而言,所有分配给程序的内存都用虚拟内存表示(Virtual Memory)。对硬件而言,内存分为物理内存(Physical)和交换内存(Swap)。这三种环境的关系有两种:(1)程序内存会被映射到虚拟内存,即虚拟内存中分段对应数据、文本、堆、栈; (2)虚拟内存中某些部分放在物理内存中,另一些放到交换内存中。 为了程序运行有空间上的效率,Linux系统下会共享内存。例如共享程序库(比如libc)或者是内存映射(memory map)。据我的理解,共享部分在程序空间中可以是文本部分,在虚拟内存中放在相同的地址,在硬件中可放在物理内存或交换内存。 对应上面不同的概念,Linux常用的内存相关术语有: 常驻内存(Resident memory), 表示硬件中物理内存的占用。 虚拟内存,Virtual memory,操作系统使用内存的一种抽象。 页(page),操作系统以页为单位管理(分配,回收)内存 测量程序的内存占用可以用不同的统计量。从程序的生命周期来看,可以分为最大(peak)内存占用,即时内存占用,和平均(average)内存占用。从内存的含义来讲,可以在程序本身的语境(context),或是操作系统,或是硬件的语境,比如:栈内存使用(heap memory),虚拟内存占用,物理内存占用。 测量一个程序的内存占用时,最理想的是我们知道(每时每刻)程序的四个部分(在虚拟内存中)分别有多大,对应的,在物理内存或者交换内存中占用了多少空间。但是这是一个很难达到的目标,因为:(1)操作系统以页方式分配内存,很难得到每一个页中具体多少空间被占用;(2)虚拟内存往往比物理内存大很多,当操作系统给一个运行的程序分配内存时总是提供多余程序精确需要的内存;(3)注程序在物理内存的占用加上程序在交换内存的占用构成了程序总的使用情况,但是现有的工具并不直接给出这一数值,需要手动把Resident Memory和Shared Memory相加 。 在实际情况下,通过一些现有的工具,我们往往更关心这几个易于获得统计量: (1)max resident memory size 可以使用time -v命令(要指定全部路径,否则bash的time命令不识别-v) 注意这个测量值往往远远高于程序运行时消耗的内存。 (这是time 1.7版本的bug,time 报告的内存用量是实际的4倍,因为wait3/wait4返回的实际内存用量,单位是kbyte,但time错把单位设定为page) 本质上time使用了wait3或者wait4命令来获取程序的resources (见 ‘man wait3’)。 使用Python实现时,可以用resources module来获取。 另外,使用这个思路还可以得到程序的运行时间(用户时间,内核时间,实际时间) (2)top 或者ps 可以查看程序的Resident Size(RES)列,Share Memory(SHR)以及Virtual Memory Size(VIRT),这一统计量默认每秒更新一次。这一方式的缺点是测量值为即时测量,每时每刻这个值都有可能变化。优点是使用起来很方便。 使用Python实现时,可以先使用multiprocesing.Process启动一个程序,然后使用psutil […]

Apr 032012
 

将Python嵌入C/C++ 首先嵌入和扩展是相关联但不同的两个概念:嵌入是指在C语言中使用Python,而扩展是在Python中使用C语言(以library的形式)。 其次嵌入Python的本质是嵌入Python 解释器(Interpretor)。因此我们需要调用相应的Initialize, Finalize函数。另外,为了让C/C++识别Python相关的函数,我们还需要#include 以及相应的linker options:-Xlinker -export-dynamic -ldl -lrt -lutil 另外,Python语句有两种:statement 和 expression。注意statement是没有返回值的。因此Python语言里有exec和eval分别对应这两种情形。最本质的区别是statement有副作用(side effect),比如会把值绑定到一个名称上,比如: a = 3 。当我们用PyRun_SimpleString(“a=3”)时,这种副作用是在当前的environment下(内部实现是dict)多出一个变量(dict的key),名称是a。 此外要注意Python的执行代码是和environment相关的,比如global和local,想用的函数名称(例如:dir,str,print),变量都是保存在各自的environment里。平时我们写的 if name == “__main__” 就是说默认的环境是在模块__main__里面。我们要取出默认的函数或者变量(Python内部不严格区分这两个概念,知识函数可以callable),可以用下面的代码(以取出dir函数为例): 嵌入Python还应注意内存的使用。因为Python主要使用(另一种是Python的malloc, free)Reference count方式来管理新的变量,我们应记住在获得一个PyObject*类型的指针之后,用Py_DECREF或者Py_XDECREF来减少reference count (注意,特殊情况下取出的结果是不能减少reference count的,比如取出list中某个元素)。 最后给一个例子来说明怎么在Python里计算任何表达式expression (参考了FAQ[1]) 重要参考资料 【1】 扩展/嵌入Python的FAQ Extending/Embedding FAQ 【2】API 手册 Python/C API Reference Manual 【3】嵌入Python的流程性说明 Embedding Python in Another Application 【4】扩展Python的流程性说明,这里介绍了Python底层的知识,这些知识不会在”嵌入Python的流程性说明”中重复出现 Extending Python with C […]

Feb 282012
 

How to set up Meta appropriately for iTerm2 学校的电脑是Mac,Mac下最好的terminal是iTerm2;我用的编辑器是Emacs,但Terminal下的Emacs不能正常工作,比如M+/是我设置的hippie-expand,我不能用Alt/Command + /按出来,一定要用Esc+/ 。 被困扰了好久之后,我终于下定决心彻底解决这个问题。 NOTE:Alt/Command 指的是一个按键,在windows键盘上是Alt,Mac键盘上叫做Command,上面有一个四瓣的小花(Apple Clove) 首先要弄清楚流程: 1. 我按的键能不能传入iTerm2? 2. iTerm2如何把我的击键传到远处的Linux Terminal? 3. 远端的Terminal里的Emacs能不能正确解析击键? 1. 我按的键能不能传入iTerm2? 在Mac系统,一些组合键还真不一定能传到iTerm2,举个例子:Alt/Command + / ,这个是iTerm2里Find Cursor的Shortcuts,就是我一按这个组合键,就执行Find Cursor的功能,iTerm里的shell是收不到我的按键的。 解决方法:详细见这个邮件列表 http://groups.google.com/group/iterm2-discuss/browse_thread/thread/e960f5098ff3c4a0 就是增加一个系统级别的设置,把Find Cursor的组合键Overwrite掉。 顺便说,我顺便发现一个工具ShiftIt,就是用组合键安排窗口,比如:把窗口最大化,放在左边1/2,右边1/2…… 非常顺手。 2. iTerm2如何把我的击键传到远处的Linux Terminal? 下面是假设我按下键了,iTerm2会把我的击键传到Linux Terminal上。注意这个过程并不简单,因为我的按键会被remap,也会被改动。 举例来说,如果我按下Alt/Command,如果有remap(比如在iTerm2里设置了,或者用Double Command等设置了Remap),实际打出的可能是Option(就是Windows键盘上的Win键)。 还有一种可能是我的击键是Alt/Command,但Linux Terminal不认识Alt/Command,只有强制iTerm2把Alt/Command输出成+Esc 才成。 简单来说,在iTerm2 针对每个Session的设定里,在设定keys时,选择Preset xterm;然后把左右Option Key都选成+Esc。 另外在Linux Terminal中.inputrc文件中加入: set […]

Feb 252012
 

Valgrind – a cool tool to check memory related problems Valgrind是非常有用的检查内存相关问题的工具。比如: 内存泄漏,double free memory,内存非法访问。基本上Segmentation fault都能用Valgrind查出来。我刚刚查出了一个很刁钻的bug,在找bug的过程中发现valgrind非常有用,但要用好,还需要点技巧。 先描述一下问题: 自己的程序总是Segmentation Fault。我先用Valgrind运行,重要结果如下: ==11060== Invalid write of size 8 ==11060== at 0x44FF07: FileReader::FileReader() (in /net/nfsb/dumbo/home/zhanxw/smallTool/BamPileup) ==11060== by 0x410D05: BufferedReader::BufferedReader(char const*, int) (IO.h:232) ==11060== by 0x41126C: LineReader::LineReader(char const*) (IO.h:332) ==11060== by 0x41047A: RangeList::addRangeFile(char const*) (RangeList.cpp:128) ==11060== by 0x405B28: main (BamPileup.cpp:258) ==11060== […]