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, sociology, cognitive science, and philosophy.连接人机交互、AI 与系统编程。构建智能的人在环优化系统。融合心理学、社会学、认知科学与哲学。

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

284 Blogs博客
173 Tags标签
Changkun's Blog欧长坤的博客

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阅读更多 »

Linux 内核分析 之一:How Computer Works 实验

Published at发布于:: 2015-03-03   |   Reading阅读:: 3 min
说明 欧长坤 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操作系统的课程,上个学习就开始寻思研究研究Linux内核代码,恰好MOOC有这个课程,遂选了此课。 一、实验过程 首先,我们将C语言代码利用编译器编译成汇编代码,下面是C语言代码: 1 2 3 4 5 6 7 8 9 10 11 12 int g(int x) { return x + 999; } int f(int x) { return g(x); } int main(void) { return f(0) + 1; } 值得一提的是,事实上在我们没有使用标准C语言库的时候,可以不引用任何头文件(比如#include 就是不需要的)。显然,上面的代码并没有用到任何库函数。 通过gcc的功能,我们可以自定义编译参数来控制编译选项,我们为了让上面的代码编译成32位汇编代码,使用下面的命令: 1 gcc -S -o main.s main.c -m32 其中我们的编译环境为Mac OS X 10.10,所以提供的编译环境为64位编译环境,所以使用了参数-m32将C语言代码编译为32位汇编代码,而-S表示只是编译不汇编,生成汇编代码。而-o file表示将结果输出到file中。 我们可以观察生成的.s文件,如下图所示。 bwlq分别代表8、16、32、64位寄存器操作,所以我们可以看到这里的汇编指令l结尾,说明这些指令都是操控32位寄存器长度。 我们保留纯汇编代码的部分,得到如下的汇编代码 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 _g: pushl %ebp movl %esp, %ebp pushl %eax movl 8(%ebp), %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax addl $999, %eax ## imm = 0x3E7 addl $4, %esp popl %ebp retl _f: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax movl %eax, (%esp) calll _g addl $8, %esp popl %ebp retl _main: pushl %ebp movl %esp, %ebp subl $24, %esp movl $0, %eax movl $0, -4(%ebp) movl $0, (%esp) movl %eax, -8(%ebp) ## 4-byte Spill calll _f addl $1, %eax addl $24, %esp popl %ebp retl 下面我们来分析这段代码的行为。
Read More阅读更多 »

什么是泛函空间的大数定律?它是机器学习理论的里程碑吗?

Published at发布于:: 2015-02-17   |   Reading阅读:: 1 min

欧长坤初次发表于『知乎』, 转载请注明出处。

这个问题问得很深刻,人们花了很长的时间才领悟到这个问题的答案,所以解释起来有点费力。我这里尝试性地做一个解释。 首先,我们需要搞明白三件事情:什么是一个学习问题、什么是风险最小化、什么是经验风险最小化归纳原则。

什么是学习问题?

对于一个学习问题而言,给定了训练样本$(x_1,y_1),(x_2,y_2), … , (x_l,y_l)$,而训练的样本是根据联合分布$F(x,y)=F(x)F(y|x)$抽取的l个独立同分布的观测。学习问题就是从给定的函数集$f(x,\alpha),\alpha \in \Lambda$中选出能够最好地逼近训练样本的函数,换句话说,就是用最优函数估计样本背后蕴含的统计规律——用$f(x,\alpha)$估计$y$。 注意,$\Lambda$是参数集合,参数$\alpha\in\Lambda$并不一定必须是向量,可以是任意多抽象参数。

Read More阅读更多 »
16 17 18 19 20 21 22 23 24
© 2008 - 2026 Changkun Ou. All rights reserved.保留所有权利。 | PV/UV: /
0%