Changkun's Blog欧长坤的博客

Science and art, life in between.科学与艺术,生活在其间。

  • Home首页
  • Ideas想法
  • Posts文章
  • Tags标签
  • Bio关于
Changkun Ou

Changkun Ou

Human-AI interaction researcher, engineer, and writer.人机交互研究者、工程师、写作者。

Bridging HCI, AI, and systems programming. Building intelligent human-in-the-loop optimization systems. Informed by psychology, philosophy, and social science.连接人机交互、AI 与系统编程。构建智能的人在环优化系统。融合心理学、哲学与社会科学。

Science and art, life in between.科学与艺术,生活在其间。

276 Blogs博客
165 Tags标签
Changkun's Blog欧长坤的博客

Linux 内核分析 之六:Linux 内核创建进程的过程

Published at发布于:: 2015-04-12   |   Reading阅读:: 2 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、准备工作 这节课的任务依旧很简单,我们来尝试分析一下在一个实际的操作系统下(Linux),它是如何实现操作系统理论中关于进程创建和相关调度的过程。 因此,如果学过操作系统理论的话,我们可以根据相关理论知识来提前预测一下task_struct的应该会存在哪些结构: 进程状态、将纪录进程在等待、运行、或死锁 调度信息、由哪个调度函数调度、怎样调度等 进程的通讯状况 有插入进程链表的相关操作,因此必须有链表连接指针、当然是task_struct型 时间信息,比如计算好执行的时间、以便CPU资源的分配 标号,决定改进程归属 可以读写打开的一些文件信息 进程上下文和内核上下文 处理器上下文 内存信息等等 我们可以在/linux-3.18.6/include/linux/sched.h中找到tast_struct的定义: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 struct task_struct { volatile long state; //说明了该进程是否可以执行,还是可中断等信息 unsigned long flags; //进程号,在调用fork()时给出 int sigpending; //进程上是否有待处理的信号 mm_segment_t addr_limit; //进程地址空间,区分内核进程与普通进程在内存存放的位置不同 //0-0xBFFFFFFF for user-thead //0-0xFFFFFFFF for kernel-thread //调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度 volatile long need_resched; int lock_depth; //锁深度 long nice; //进程的基本时间片 //进程的调度策略,有三种,实时进程:SCHED_FIFO,SCHED_RR, 分时进程:SCHED_OTHER unsigned long policy; struct mm_struct *mm; //进程内存管理信息 int processor; //若进程不在任何CPU上运行, cpus_runnable 的值是0,否则是1 这个值在运行队列被锁时更新 unsigned long cpus_runnable, cpus_allowed; struct list_head run_list; //指向运行队列的指针 unsigned long sleep_time; //进程的睡眠时间 //用于将系统中所有的进程连成一个双向循环链表, 其根是init_task struct task_struct *next_task, *prev_task; struct mm_struct *active_mm; struct list_head local_pages; //指向本地页面 unsigned int allocation_order, nr_local_pages; struct linux_binfmt *binfmt; //进程所运行的可执行文件的格式 int exit_code, exit_signal; int pdeath_signal; //父进程终止是向子进程发送的信号 unsigned long personality; int did_exec:1; pid_t pid; //进程标识符,用来代表一个进程 pid_t pgrp; //进程组标识,表示进程所属的进程组 pid_t tty_old_pgrp; //进程控制终端所在的组标识 pid_t session; //进程的会话标识 pid_t tgid; int leader; //表示进程是否为会话主管 struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr; struct list_head thread_group; //线程链表 struct task_struct *pidhash_next; //用于将进程链入HASH表 struct task_struct **pidhash_pprev; wait_queue_head_t wait_chldexit; //供wait4()使用 struct completion *vfork_done; //供vfork() 使用 unsigned long rt_priority; //实时优先级,用它计算实时进程调度时的weight值 …… //后面就不看了 我们不关心 }; 可以看到,现在的Linux系统基本上是按照操作系统理论来进行设计的,但是在实现的过程中,理论往往是不够的,为了实现很多实际的需求,tast_struct还定义了很多额外的结构,来方便系统的相关管理,比如后面没有列出来的一些文件操作相关的结构,这些结构一般用于当一个进程没有按照规范来操作文件时,当进程被杀掉后,系统任然可以对这些不规范的操作进行管理。当然,后面还有很多内容也是如此,我们就不一一叙说了,我们只看创建一个进程的相关重点。
Read More阅读更多 »

小说「泽缘」

Published at发布于:: 2015-04-11   |   Reading阅读:: 1 min
本文最初写于2010年6月10日前后,因百度空间关闭搬迁至此。 笔者已无法记起当时写下下面这段文字的心情和情景。 预知后事如何,请读者自行脑补。 终于,我能够静下心来阐述我的某些遭遇,而这些遭遇,对你而言,是必要的。我写这篇小说的目的并不是为了明确什么观点,也不是为了叙述某些事情,而是… 四岁那年的事情,从某种层面来看,我是没有记忆的。事实并非如此,四岁的记忆宛如昨日光景,在我的脑海,记忆犹新。当时的我很幼稚,可以说在大人们眼里,我仅仅只是个孩子。别的,什么也不是。你很难想象当时的我是什么个样子,因为,它只刻印在我的脑海,独一无二,不可传授。很多人会说和我有关的人会有那些所谓“关于我”的记忆,但是我只能够说,他们拥有我的:外貌,行为表现,文化素养,等等。而他们无法获取的一点,也是最重要的一点,那就是我内心深处的心房。 从小就这样,我不喜欢而且憎恨和别人说话,因为我从小就这个样子,没有父母的我或许命中注定了我就是这个样子,阴暗,封闭。这就是我的宿命。 我很清晰的记得,我一个人住在孤儿院的某个房间,封闭自己,足不出户。当然这种封闭不是绝对的,由于生理的需要我会同其他同龄的孤儿同桌吃饭,和其他的人共同出恭,诸如此类的事情比比皆是,但是,我的原则依旧是“金口难开”。 有一次,孤儿院的老院长无意中从我身边经过,也许是我那阴森的气息过于浓重,她叫住了我:“泽缘,你怎么从来就没有和其他的小朋友说话呢?有什么事情别往心里藏,过度的封闭自己是不好的。”筱泽缘,如果不是院长叫我,大概四岁的我长期这样封闭自己很有可能永远都无法知晓我的名字。 “泽缘,知道了么?”我很难以相信,为什么会有人向我主动说话,并且和蔼可亲。我瞪大了双眼,直直的看着院长,满脸莫名。五秒钟后,我飞快的奔往我的房间,碰的关上门,门外,夕阳满天。 十五岁那年我终于憋不住了,当我说出这些年来的第一句话的时候,我释然了。尽管这样,偏偏命运的捉弄,这种感觉稍纵即逝,无影无踪。这次说话是一个女生说话,不知道为什么,我只想和她说一句话:“我喜欢你。”我不知道,喜欢这个词语是怎么跑进我的脑海,我只记得我在孤儿院接受过小学程度的教育,然而这里的条件不好,所以只能够供应我受到这种程度的教育。对此我并没有在意过。对于这样的我,或许是最真实的。 一个瞬间,我的脸上多了一个手印,她气愤的走了,抛下一句:“流氓。” 手印留下的瞬间我十分疑惑我自己,为什么会说出这样的话,为什么从来不说话的我会这个样子,我读不懂我自己,我读不懂这十一年。 我又再和别人说话的那一年是我有记忆起的十四年,是我成年的那年。我独自坐在房间,等待十二点钟声的敲响,它代表这我独立了。九月二十五号的第一鸣钟声响彻整个城市,他呼唤我,向我招手,告诉我说,泽缘,你成年了,你已经来到人间十八年了。是该考虑自己的未来了。 我离开了孤儿院,之前的院长不知去往何处,在五年前新校长就上任了,然而我在新校长面前始终被认为是个异类,对此我感到很正常,因为这个世界上和我说过话的除了那个女生,以及老院长,别无他人。 (待续) 补充: 我居然在硬盘里发现了一个重写过的后续版本 爱情不是轰轰烈烈的誓言,而是平平淡淡的陪伴。 序 终于,我能够静下心来阐述我的某些遭遇。而这些遭遇,对你我而言,无可厚非是必要的。 我些这篇小说的目的并不是为了明确任何的观点,也不是为了叙述某些我想记住的事情。而是…… 四岁那年的事情,从某种层面来看,我是没有记忆的。事实却并非如此,四岁的记忆宛如昨日光景,在我的脑海,记忆犹新。当时的我很幼稚,可以说在大人们眼里,我仅仅只是个孩子。别的,什么也不是。你很难想象当时的我是什么个样子。因为它只刻印在我的脑海,独一无二,不可移植。很多人会说,和我有关的人会有那些所谓“关于我”的记忆,但是我只能够说,他们拥有我的:外貌,行为表现,文化素养等等。而他们无法获取的一点,也是最重要的一点,那就是我内心深处的心房。 从小就这样,我不喜欢而且憎恨和别人说话,因为我从小就这个样子,没有父母的我或许命中注定了我就是这个样子。阴暗,封闭。这就是我的宿命。 我很清晰的记得,我一个人住在孤儿院的某个房间,封闭自己,足不出户。当然这种封闭不是绝对的,由于生理的需求我会同其他同龄的孤儿同桌吃饭,和其他的人共同出恭等等诸如此类的事情。但是,我的原则依旧是“金口难开”。 有一次,孤儿院的老院长无意中从我身边经过,也许是我那阴森的气息过于浓重,她叫住了我:“泽缘,你怎么从来就不和其他的小朋友说话呢?有什么事情别往心里藏,过度的封闭自己是不好的。”筱泽缘,如果不是院长叫我,大概四岁的我长期这样封闭自己很有可能永远都无法知晓我的名字。 “泽缘,知道了么?”我很难相信,为什么会有人向我主动说话,并和蔼可亲。我瞪大了双眼,直直的看着院长,满脸莫名。五秒钟后,我飞快奔向我的房间。碰!门外,夕阳满天。 十五岁那年我终于憋不住了,当我说出这些年来第一句话时,我释然了。尽管这样,偏偏命运的捉弄,这种感觉稍纵即逝,无影无踪。这次说话是和一个女生说话,不知道为什么,我只想和她说一句话:“我喜欢你。”我不知道,喜欢这个词语怎么跑进我的脑海,我只记得我在孤儿院接受过初等程度的教育,然而这里的条件不好,所以只能够供应我收到这种成都的教育。崔次我并没有在意过。对于这样的我,或许是最真实的。 一个瞬间,我的脸上多了一个手印,她气氛的走了,抛下一句:“流氓。” 手印留下的瞬间我十分一伙我自己,为什么会说出这样的话,为什么从来不说话的我会这个样子,我读不懂我这十一年。 我又再和别人说话的那年是我有记忆起的十四年,是我成年的那年。我独自坐在房间,等待十二点钟声的敲响,它代表着我独立了。九月二十五号的第一鸣钟声响彻整个城市,它呼唤我,向我招手,告诉我说:泽缘,你成年了,你来到人间已经走过了十八个年头。是时候该考虑考虑自己的未来了。 第二天我找到新的院长,办理了退宿手续,离开了孤儿院。之前和我说过话的院长在五年前就不知所踪。新的校长自上任后就没有和我说过一句话。他似乎看见我来办理退宿手续就显得异常的兴奋和高兴,巴不得我赶紧离开。 风在撕裂谁? 离开孤儿院的第一天,我感到十分的迷茫,硕大的城市不知哪儿是我的归途。 孤儿院位于在新竹县的一条小巷内,里面的设施十分的简单,除了院长管理孤儿的生活起居外,还有一个人那就是龙老师。龙老师自从我有记忆以来就一直住在孤儿院了。我所有关于这个世界的看法以及各种杂七杂八的知识都来源于他。他只是一个普通的教师,他包揽了我印象中的所有初等教育的内容,有语文,有数学,甚至还有英语。我离开孤儿院的那天龙老师似乎哭的很伤心,虽然我没有跟他说过任何一句话,但是他依然泣不成声,因为每个从孤儿院走出去的孩子,都是他一手教大的。我收拾行李之前,龙老师坐到我的床边,嘱咐我在外奔波时应如何如何。大谈今后的我如果有出息,一定要记得回到孤儿院来看看他。我那时就感觉他是一个敬业的人。虽然我从未跟他说过话,但是他依旧待我不薄。而我却不知道龙老师究竟多少年纪,也不知我离开孤儿院后还能不能再见他一面。 走在路上,我回想起这十八年来走过的点滴。虽然记忆犹新,却暗淡无光。 前面是一堵墙,我看见一份关于房屋出租的广告,于是我撕掉下方的电话,走进公话超市,向其询问了关于住房的相关信息,总的来说价格还是能够接受。 离开孤儿院时院长从自己的银行卡里面取出了三千元钱,对我说:泽缘,这三千块钱就是你今后的所有家产了,至于之后的路,就看你自己了。 对于在世十多年都没有摸过钱是什么的我,三千在我当时看来是一笔不小的数目。给我的感觉就是三千块钱足够我使用一年了。但是很遗憾,当我离开孤儿院后在各种街道上看着那些从未见过的市面,彷徨失措。走过一个个商店的橱窗,看着一个个标着价格的商品。我才意识到,三千块钱最多够我维持三个月。 之后我沿路查看了很多关于房屋出租的信息,对比之下,四百一个月,是这里最便宜的价格了。于是我在天色即将拉下之时入住了一间小房间。 第一晚,我收拾好自己的东西,把房间整理成我想要的样子,躺在了床上,思考着明天的我又将归向何方。 门外的轰鸣声吵醒了我,原来是火车。我这才知道这件房屋背后的不远处就有火车的铁轨。看天色也已明亮,便收拾好各类证件,出了门。 第二天在路上,我明白我应该去找一份能够维持我生活下去的工作。异常的顺利,我成功的在一家餐厅里做起了服务员,月薪一千五。这个价格很符合我的胃口,我认为每个月一千块钱的使用是绰绰有余。所以当老板问及我月薪一千五能否接受的时候,我不假思索的答应了。而在我和老板签订劳动合同后才知道,这里的每个员工的工薪都比我高出很多。我这才知道,自己是被骗了。 遇见 就在这日复一日,乏味,单调,三点一线的日子中,又过去了两个月。这两个月我有尝试着和别人开放性的说话,因为上次我在和餐厅应聘的时候和老板说的话少之又少,老板对我说道,若是我在客人面前也是这个样子就立即解雇我。 这天在我回去的路上,我相信我没有眼花,对,我看见她了——那个打过我的女孩。 她似乎在寻找什么,四处张望,并不断找路人询问着什么。我有意的避开她了,我相信她十分不愿意见到我。因为在她眼中,我就是一个“流氓”。 我有留意过她,这是我从上一次被她打后再一次见到她。熟话说女大十八变,这话不假。她比几年前更加漂亮了。 是的,我错了,她实际上是在找我。几天后的晚上,她敲响了我所住房间的房门。打开房门的瞬间,她冲进来遍抱住了我,随之而来的就是:我找得你好苦。 (待续)

Linux 内核分析 之五:system_call中断处理过程的简要分析

Published at发布于:: 2015-04-05   |   Reading阅读:: 2 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、准备工作 本周的实验是第四周实验的自然延伸。同样的,它也并不难。 我们可以在http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl中查看系统调用号。 如果你上周没有看过我的文章,你可以看看这里。我使用了systeminfo这样一个系统调用。 二、实验过程:跟踪系统调用 我们使用了sysinfo这个库函数API。 下面的三张实验图显示了我们已经成功的使用gdb调试跟踪到了sysinfo这个系统调用(函数名为sys_sysinfo),但是随后使用next命令继续调试时,显然无法再继续调试了,因为不能直接使用gdb来对使用汇编代码编写的system_call进行调试和追踪。这里有一篇文章介绍了如何使用gdb来调试汇编代码,我就不继续展开了:http://www.doc88.com/p-0781911176267.html 三、system_call过程分析 不说废话,老师上课对system_call的分析过程非常清楚,伪代码抓住了重点,我们很容易就能够画出下面的流程图: 接下来我们逐行分析系统调用处理过程的汇编伪代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 .macro INTERRUPT_RETURN ; 中断返回 iret .endm .macro SAVE_ALL ; 保护现场 ... .macro RESTORE_INT_REGS ... .endm ENTRY(system_call) SAVE_ALL syscall_call: call *sys_call_table(,%eax,4) movl %eax, PT_EAX(%esp) ; store the return value syscall exit: testl $_TIF_ALLWORK_MASK, %ecx # current->work jne syscall_exit_work restore_all: RESTORE_INT_REGS irq_return: INTERRUPT_RETURN ; 到这里就算执行完了 ENDPROC(system_call) syscall_exit_work: testl $_TIF_WORK_SYSCALL_EXIT, %ecx jz work_pending END(syscall_exit_work) work_pending: testb $_TIF_NEED_RESCHED, %cl jz work_notifysig work_resched: call schedule jz restore_all work_notifysig: .
Read More阅读更多 »

大创项目的标题真是每年都在考验同学们的想象力啊

Published at发布于:: 2015-04-02   |   Reading阅读:: 1 min
今年大创申请结果出来了。虽然我没有申请。但是还是习惯性地关注了一下有哪些项目立项。 突然发现我们学校也开始玩起了前沿技术。 当年一个App可立国家级的项目的情形似乎已经一去不复返了。 校级项目里面几乎全是手机软件的开发,什么交友啊二手啊之类的。作为一个经历过四届大创的学长,所以真诚的提醒你们:计划明年申请的同学一定不要做这个了,评审老师估计也会彻底看不起了。 想当年一个垃圾短信屏蔽的安卓app都可以成为国家级…(逃 各个级别上得划分我看觉得特别合理,特别是我之前在帮学弟们找项目idea时候做的研究方向的预测,上省级的大多数都会大数据啊物联网啊ARVR之类的看起来很前沿很高端的技术上靠拢。 不过,今年的校级项目里面有一个项目从标题上看我觉得挺好,但是没有申请到更高级别显得比较遗憾。 家用NAS云服务器管理软件开发及研究 这个标题实在是太GEEK了,难怪没有申请到省级以上,这个产品毕竟太小众了,那么它的管理软件就更加小众了。(不过。我以后有钱了肯定是要在家里搞这么一个玩意的。 国家级五个项目里面除了我超级喜欢的飞行器和不明觉厉的面向民族地区的地图外,其他三个项目的核心技术我居然都有研究过啊哈哈哈哈哈哈哈哈我好棒(逃。 基于深度学习的人脸识别系统设计与实现 看到深度学习我突然感觉到好温馨啊。点个赞。 不过令我没想到的是人脸识别这项几乎已经被认为是攻克了的技术。居然连续三年不断申请终于从校级走到了国家级。 去年那个项目用的技术叫做压缩感知(这项技术早在08年Deep Learning被提出的时候就失去热度了)。 所以今年这个项目总算把技术赶了上来换成了当下最火的Deep Learning 。 恰好,去年的那个时候我对Deep Learning还不是很了解,始终认为压缩感知作为一种“被淘汰”的技术…我妥妥的在申请项目时候把Deep Learning作为要研究的核心技术。 反倒是在我研究Deep Learning的这一年当中,逐步认识到压缩感知可以作为Deep Learning的一个很重要的Foundation(尽管只是理论价值而已)。 然后实现Deep Learning的时候我还发现这货根本不是一般的dataset可以驾驭得了的……即便有了这样的dataset,也没有硬件成本驾驭这个dataset啊…那么问题来了……(逃 顺便我做一个广告,如果想快速构建一个 Deep Net 我用在做去年申请的项目过程中开发了一个框架叫做SmartNet,专门用来快速搭建DeepNet。项目结题后我就开源。(全世界唯一有中文文档的深度学习库哟 基于LeapMotion和偏振式3D显示器的三维模型演示系统 LeapMotion也是我在研究去年那个项目的过程中被我彻底抛弃的一项技术。 我大致可以想象这个项目最后会出现什么样的结果了…好吧,不跳进坑里你们是不知道这个坑有多深的。(逃 硬性广告:大一时候搞的那个手势识别在现在这个项目里我也做了优化 结题后我也会开源哟(轻量级可轻松扩展的自学习手势库哟 基于用户行为的大数据挖掘引擎——以新媒体平台为例 用户行为大数据引擎= =擦 我大创不就写得这个吗 。 以新媒体为例——我会告诉你我一个库解决了所有平台吗(逃 硬广:HorcruxLib是我开发的一个能够轻松实现分布式机器学习算法的库,性能甚至可以优于MapReduce架构的引擎,支持宕机容错,玩得动TB级的数据,配套使用的还有一个集成了大部分机器学习的算法库MLiteKit。结题后我就开源哟(世界上唯一一个有中文文档的分布式机器学习库和机器学习算法库哟 省级项目也不例外,有四个项目的关键技术我都有涉及: 基于蓝牙技术的通信软件的研究和开发 基于HTTP协议下地远控演示系统 基于Spark大数据处理的在线图书推荐系统 基于树莓派3G4G网络的可远程控制智能家居系统的实现 我擦蓝牙技术我用来做精准定位诶 我擦远控系统不就是拿了中国科学最高奖的透明计算吗 我做的一个演示demo就是远控 果然dr zhou带的项目就是不同 我也觉得spark是未来工业界的希望啊 (特别是spark1.3发布之后 树莓派我用来搭过三节点集群 好好玩真的 总结 国家级/省级中奖概率95%模板:基于XXX和YYY的ZZZ的MM和NN XXX和YYY至少有一样是热门技术名词; ZZZ一定是自己想的一个名词; MM和NN一般是“研究”、“实现”、“设计”等动词 ;
Read More阅读更多 »

Linux 内核分析 之四:使用库函数API和嵌入汇编两种方式使用同一个系统调用

Published at发布于:: 2015-03-29   |   Reading阅读:: 3 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、准备工作 本周的实验比起前三周的实验稍微容易得多。我们可以在http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl中查看系统调用号。 二、分析 在这里,我们决定使用sysinfo这个库函数API,首先,我们得会使用这个API。 在 Linux 中,sysinfo可以用来获取系统相关信息的结构体。 函数声明和原型如下所示: 1 2 #include <sys/sysinfo.h>int sysinfo(struct sysinfo *info); 那么,这个sysinfo的结构体长什么样? 1 2 3 4 5 6 7 8 9 10 11 12 struct sysinfo { long uptime; unsigned long loads[3]; // 启动到现在经过的时间 unsigned long totalram; // 总的可用的内存大小 unsigned long freeram; // 还未被使用的内存大小 unsigned long sharedram; // 共享的存储器的大小 unsigned long bufferram; // 缓冲区大小 unsigned long totalswap; // 交换区大小 unsigned long freeswap; // 还可用的交换区大小 unsigned short procs; // 当前进程数目 char _f[22]; // 64字节的补丁结构 }; 其实我们都并不关心这个sysinfo的结构到底长什么样,我们目前所关心的是如何能够成功的调用。 实际上看到这里,我们已经能够完成使用库函数调用的C代码了。
Read More阅读更多 »

Doxygen 生成中文 Latex 文档

Published at发布于:: 2015-03-28   |   Reading阅读:: 1 min
如今已经离不开 Mac 了,寒假的时候好好研究了一下Latex,终于在 Mac 能够熟练使用 MacTex 的各种生成方法了。 造轮子的时候,通常会遇到写文档的麻烦,了解到有 Doxygen 这个工具,还可以生成 Latex 的 pdf 文档,果断用了它。 但是似乎并不能直接根据代码生成中文文档,这就很讨厌了。 原因在于 doxygen 本身并不能直接输出 pdf 文件,而是生成 latex 目录,利用 makefile 来生成pdf文件。幸运的是,对于 latex 排版,doxygen 其实已经做了很多准备,保存的源文件是UTF-8编码,并默认使用了utf8 package。因此是支持多国语言的。 但是对于中文来说,还需要加载 CJKutf8 package,并配置好CJK环境。这才能顺利的使用中文。 所以解决方法其实很简单: 使用docxygen生成文档,注意选上 GENERATE_LATEX 、LATEX_OUTPUT、USE_PDFLATEX(最好还选上 PDF_HYPERLINKS); 用文本编辑器打开 docxygen 生成的 latex 目录中的 refman.tex。找到“\begin{document}”这一行,将其修改为 1 2 3 4 5 6 7 8 \usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn} [/code] 再找到“\end{document}”这一行,将其修改为 [code lang="latex"] \end{CJK} \end{document} 保存,输入make,完成编译。

Wordpress 站点搬家

Published at发布于:: 2015-03-27   |   Reading阅读:: 1 min
我的 Wordpress 站点使用的是 lnmp 快速搭建的,所以如果是搬家的话可以很快。 首先在新的VPS上安装lnmp。 下面这一行命令就可以解决了。 1 wget -c http://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz && tar zxf lnmp1.1-full.tar.gz && cd lnmp1.1-full && ./centos.sh 然后在执行: 1 /root/vhost.sh 就可以按照步骤创建好文件夹了。 下一步就是把文件备份过来。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 原服务器 tar -cvf euryugasaki.com.tar /home/wwwroot/euryugasaki.com # 网站打包 mysqldump -u 用户名 -p 数据库 &gt; 数据库.sql # mysql 数据备份 mv 文件 /home/wwwroot/euryugasaki.com/backup/ # 新服务器 wget http://euryugasaki.
Read More阅读更多 »

Linux 内核分析 之三:Linux内核启动函数start_kernel()的简单分析

Published at发布于:: 2015-03-20   |   Reading阅读:: 3 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、准备工作 废话不多说,命令一行行敲下去,搭建好环境。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 cd ~/Work/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz xz -d linux-3.18.6.tar.xz tar -xvf linux-3.18.6.tar cd linux-3.18.6 make i386_defconfig make cd ~/Work/ mkdir rootfs git clone https://github.com/mengning/menu.git # 话说这里为什么用MenuOS 我个人觉得老师一来是节约编译时间 二来也可以做做广告 cd menu sudo apt-get install libc6:i386 lib32stdc++6 # 这两行安装非常有必要 sudo apt-get install lib32readline-gplv2-dev # 在64bit的Ubuntu环境下不能编译这个MenuOS的roofs 需要这些包来支持 即使用了-m32 gcc -o init linktable.
Read More阅读更多 »

Ubuntu14.04 安装 Oracle 11g R2 Express Edition

Published at发布于:: 2015-03-17   |   Reading阅读:: 3 min
安装 Java 环境 1 2 sudo apt-get install openjdk-7-jre sudo apt-get install openjdk-7-jdk 设置 JAVA_HOME 1 sudo gedit /etc/bash.bashrc 拖到最后面,添加下面两行: 1 2 export JAVA_HOME=/usr/lib/jvm/java-7-oracle export PATH=$JAVA_HOME/bin:$PATH 退出,执行 1 source /etc/bash.bashrc 执行下面的语句: 1 echo $JAVA_HOME 你会得到下面的结果: 1 /usr/lib/jvm/java-7-oracle 安装 Oracle 11g 执行: 1 sudo apt-get install alien libaio1 unixodbc 一定要确保上面的安装完成了一个都不能漏,如果你漏装了libaio1,最后不会成功的运行Oracle服务,会返回下面的错误:
Read More阅读更多 »

Linux 内核分析 之二:基于时间片轮转的简单的系统内核构造

Published at发布于:: 2015-03-14   |   Reading阅读:: 7 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、准备工作 首先,我们需要先在自己的系统上搭建实验环境,老师给出了Linux内核版本为3.9.4的加载mykernel的方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo apt-get install qemu # 安装 QEMU # 这里对QEMU进行一个简单介绍,QEMU是一个Open Source Processor Emulator # 它能有效的模拟 x86 架构等个人电脑,有两种运行模式: # User mode模拟模式,QEMU 能启动那些为不同中央处理器编译的Linux程序。而Wine及 Dosemu是其主要目标。 # System mode模拟模式,QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。 # 一句话来说就是QEMU可以模拟运行我们编译的linux内核镜像 sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu # 为QEMU创建一个链接能够在系统级上直接执行而不需要通过目录来执行 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz # 下载 Linux3.9.4 内核 wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # 下载 mykernel_for_linux3.9.4sc.patch 补丁 xz -d linux-3.
Read More阅读更多 »
11 12 13 14 15 16 17 18 19
© 2008 - 2026 Changkun Ou. All rights reserved.保留所有权利。 | PV/UV: /
0%