
技术文档
文章平均质量分 63
CherylNatsu
这个作者很懒,什么都没留下…
展开
-
pygtk给TextView设置值的g_utf8_validate问题
<br /> <br />今天在写的一个GTK程序内容是从一个文本文件(用utf-8编码)读取内容,并显示在窗口的TextView里,首先需要从TextView获得文本的buffer:<br />b = tv.get_buffer() <br />然后把字符串放入buffer:<br />b.set_text(s) <br />这时候发现一个问题,修改textbuffer的时候竟然提示:<br />./a.py:60: GtkWarning: gtk_text_buffer_emit_insert: ass原创 2011-04-29 17:26:00 · 3317 阅读 · 0 评论 -
Move-to-front transform 算法
Move-to-front transform 算法#!/usr/bin/env python# Move-to-front transform algorithmdef move_to_front(src): dst = [] index原创 2011-09-22 21:23:44 · 3123 阅读 · 0 评论 -
Burrows–Wheeler transform 算法
Burrows–Wheeler transform 算法#!/usr/bin/python# Burrows–Wheeler transform Algorithmdef transform(s, start_symbol, end_symbol): s原创 2011-09-22 21:37:26 · 5658 阅读 · 0 评论 -
GeekOS project0 -- 接收键盘输入并在屏幕回显
源代码包中的geekos-0.3.0/doc/hacking.pdf中有GeekOS的简略介绍,项目概览等等,同时在代码包中中给出了project0到project6等几个项目,这几个项目是部分代码缺失的,需要根据项目的要求填充缺失的代码实现所需要的功能,同时在这个过程中了解这个原创 2011-10-01 12:39:22 · 7509 阅读 · 1 评论 -
GNU/Linux环境下搭建GeekOS实验环境
我使用的操作系统为Debian GNU/Linux 6,基本系统安装好后GeekOS实验环境需要安装的组件只有bochs和nasm,直接使用源中的软件包即可:# apt-get install build-essential# apt-get install bochs b原创 2011-09-30 21:47:10 · 7706 阅读 · 3 评论 -
GeekOS内核的源码级调试
在进一步研究GeekOS内核之前,有必要掌握调试这个技能,有了调试器,可以更直观地查看内部变量的值,也可以单步跟踪程序运行的轨迹。这里研究的调试,当然是指源码级的调试。首先从apt里安装的bochs模拟器可能是没有gdb stub的,也就是不能支持和gdb进行远程连接调试原创 2011-10-01 09:45:21 · 3165 阅读 · 4 评论 -
GeekOS简介和研究GeekOS之前的知识储备
GeekOS是一个教学用的操作系统内核,虽然是个简易而且小型的内核,但是却可以运行在真实的X86 CPU硬件上,它包含了一个现代操作系统所必须的最少功能,比如虚拟内存、文件系统,进程间通信。GeekOS列出了一些项目,分别缺乏操作系统的一系列关键部件,通过补全这些部件的代码就原创 2011-10-01 12:34:39 · 2382 阅读 · 2 评论 -
GeekOS project1 -- 载入可执行文件
这次的项目内容是载入可执行文件。首先按照project0的做法,先修改Makefile,然后make depend, make,再修改.bochsrc,最后运行,竟然发现运行失败,连TODO都没有看到,如图:错误提示说,文件系统没有挂载。看看本次项目的过程就知道原原创 2011-10-01 20:56:00 · 7137 阅读 · 7 评论 -
代码加行号打印
直接在终端显示文件的话是没有行数标记的,比如:$ cat a.c#include int main(int argc, const char *argv[]){ printf("Hello, world!\n"); return 0;}$ 用下面的脚本可以原创 2011-09-17 13:37:03 · 1630 阅读 · 3 评论 -
21位花朵数
花朵数是这么一个N位数,它的各个位数字的N次方之和为它的本身,比如:1^3+5^3+3^3=153现要求三分钟之内求解21位的水仙花数。#include #include #include #include #define N 21#define NU原创 2011-09-17 12:52:15 · 1191 阅读 · 0 评论 -
Python sqlite获得查询结果表的列名
获得查询结果表的列名:db = sqlite.connect('data.db')cur = db.cursor()cur.execute("select * from table")col_name_list = [tuple[0] for tuple in cur.de原创 2011-07-25 01:20:27 · 11256 阅读 · 1 评论 -
相对静态的链表实现
<br /> <br />链表可以快速实现插入、删除节点,但是传统的链表实现在每次新建节点时都会malloc,经过glibc再经过申请内存空间的系统调用非常浪费时间,释放的时候还会造成内存空洞。<br />我想能否通过一次malloc预先分配足够的空间,之后自己维护链表需要的内存空间就不用频繁malloc了,制成一个相对“静态”的链表。<br />链表的结构如下定义:<br />enum states {STATE_FREE, STATE_IN_USED};struct linkedListNode原创 2011-04-30 10:14:00 · 1054 阅读 · 0 评论 -
用二叉查找数排序
<br />二叉查找树或二叉搜索树(Binary Search Tree),是这样一个二叉树:每个节点都有指向父parent和左孩子left_child,右孩子right_child的三个指针,如果没有父或子都可以指向NULL。如果每个节点都有值,而且左孩子的值<自己的值<右孩子的值。<br /> <br />我们可以利用这个特性来排序:首先从一个序列建立二叉查找树,把序列第一个元素作为根节点,然后依次抽出后面的数插入相应的位置。对二叉查找树进行中序遍历,这样就可以按顺序输出数字,实现排序。<b原创 2011-05-01 12:25:00 · 1245 阅读 · 0 评论 -
同时获取数组中的最大值和最小值
<br />找到一个数组中最大值一般用如下方法,首先拿出数组中第一个值作为当前的最大值,然后依次和后面所有的值比较,发现有比当前最大值还大的就更新最大值的记录:<br />int maximum(int *arr, int size){ int i; int max = arr[0]; for (i = 1; i < size; i++) { if (max < arr[i]) max = arr[i]; } return max;} <br />同理,原创 2011-05-03 12:51:00 · 9642 阅读 · 0 评论 -
bogo排序
<br />bogo是排序算法中的异类,它的原理非常简单,检查序列是否已经有序,如果有序就完成排序,否则打乱需要序列的顺序并重新执行判断,下面给出这个算法的实现。<br /> <br />/* 打乱数组的顺序 */void suffle(int *arr, int size){ int i, r, t; for (i = 0; i < size - 1; i++) { r = rand() % (size - i); t = arr[i]; arr[i原创 2011-05-02 09:48:00 · 3279 阅读 · 0 评论 -
Python输入密码
Python有个自带的getpass模块:import getpasspassword = getpass.getpass(Enter password: )print password 该模块继承了UNIX下的一贯风格,输入密码不回显屏蔽符。 如果需要显示屏蔽符以提示自己确实正在输入密码的话,可以使用下面的模块:import sys, tty, termio原创 2011-06-29 08:14:00 · 13767 阅读 · 1 评论 -
堆排序(Heap Sort)
#include #include #include #define MAX 10void maxHeapify(int *arr, int i, int size){ int l = (i + 1) * 2 - 1; int r = (i + 1) * 2; int largest, t; if (l + 1 arr[i]) largest = l;原创 2011-07-02 13:21:12 · 941 阅读 · 0 评论 -
Python生成器
<br />Python支持通过yield语句实现的生成器,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。这个机制可以很方便地实现一些东西,比如《Expert Python Programming》给出的这个生成fibonacci数列的例子:<br />def fibonacci(): a, b = 0, 1 while True:原创 2011-05-08 12:53:00 · 3066 阅读 · 0 评论 -
用Valgrind检测内存泄漏
有时候使用malloc或new分配内存空间后会因为各种原因忘记free或delete,而且这一段内存因为分配给了当前应用程序却没被收回而造成占用内存越来越多、可用内存越来越少。解决的办法就是检测内存泄漏并在恰当的地方释放分配的内存。Valgrind就是一个检测内存泄漏的好工具,它原创 2011-07-15 14:26:44 · 2754 阅读 · 0 评论 -
GeekOS源代码编译时的packed属性被忽略问题的解决
发生错误的代码segment.h的:struct Segment_Descriptor { ushort_t sizeLow PACKED ; uint_t baseLow : 24 PACKED ; uint_t type原创 2011-10-04 13:55:26 · 2271 阅读 · 0 评论 -
Emacs24隐藏工具栏菜单栏和滚动条无效的问题
前不久发布了Emacs 24.1,下载下来编译安装后发现这样一个问题,以前旧的.emacs文件里明确设置了不显示工具栏菜单栏滚动条,但是它还是都显示了出来,旧的配置是这样的。(tool-bar-mode nil)(menu-bar-mode nil)(scroll-bar-mode nil)后来经过提醒才发现,新版这里已经不能用nil了,必须用0改成:(tool-b原创 2012-06-14 15:14:25 · 10472 阅读 · 3 评论 -
Emacs+auto-complete+clang进行代码补全
Clang是一个C/C++/ObjectC语言的编译器前端,采用LLVM作为后端提供了一个性能接近GCC的编译器。不过我们现在的目标是使用Clang帮助进行代码分析和补全。首先去Clang的官方网站下载一套编译安装,官方网站地址是:http://clang.llvm.org/接下来需要安装auto-complete,下载一份,http://cx4a.org/software/aut原创 2012-06-17 10:47:47 · 19290 阅读 · 21 评论 -
自动Suspend CPU占用率最高进程,夏天CPU好帮手
内容如代码所示,温度和suspend、resume策略你需要自己修改一下:#!/usr/bin/env python# -*- coding=utf-8 -*-import commands, signal, time, os, realarm_temp = 90safe_temp = 70ignore_cpu_percent = 10.0pid_pool = []原创 2012-07-22 08:56:39 · 1977 阅读 · 0 评论 -
3DS实时时钟相关的问题
最近做的一个项目中正好需要获取时间,正好DS内部是有硬件时钟的,而且被整合到了标准库中的time相关函数中,devkitpro自带的example中就有这样的获取时间演示。其中有一个OpenGL的显示时钟演示,但是经过测试发现,这个钟并不会走,而是第一次调用time函数获取一次时间后,以后无论多少次调用都会获得同样的结果。为了方便测试,我设置了一个硬件时钟用于定期调用获取时间并定期显示在屏幕上原创 2012-10-15 20:08:03 · 3279 阅读 · 1 评论 -
main函数能调用吗?
main函数能调用吗?我想,它既然也是个函数,那它就应该有普通函数的特性,只是因为名字是main,所以被编译器作为代码段的入口而已。#include #include int main(int argc, const char *argv[]){ if (argc > 10) exit(0); printf("%d\n", argc); main(argc + 1, argv);原创 2012-11-24 21:19:57 · 4038 阅读 · 1 评论 -
升级python后导致的iBus输入法设置无效以及候补框消失的问题
用到的一个软件因为使用了python,但是总是莫名其妙的崩溃,可能是因为python旧版本的实现有bug,所以讲debian自带的python 2.6.6升级到了现在找到的新版的python2.7.3,升级后惊奇地发现,bug的确没有了,那个软件也十分稳定。今天下午进入系统,刚好需要切换输入法的时候,突然发现输入法图标没了,同时输入法的候选字输入框也没了,令我十分惊讶,重新点击GNOME的输入原创 2012-12-02 20:27:43 · 8092 阅读 · 4 评论 -
数学黑洞问题
“数学黑洞”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,最终会出现一个神秘的数,请编程输出这个神秘的数。#include #define INIT 1234#define SWAP(arr,i,j)\{arr[i]^=arr[j];arr[j]^=arr[i];arr[i]^=arr[j]原创 2012-06-01 16:48:02 · 4726 阅读 · 2 评论 -
计算Pi(2)
这次使用的是Gauss-Legendre算法,具体描述在:http://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_algorithm代码如下:#include #include int gauss_legendre(int precision){ double pi; double a, b, t, p; a = 1.0; b原创 2012-02-13 20:42:57 · 1918 阅读 · 0 评论 -
计算Pi(1)
利用公式为:pi/4 = 1 - (1/3)+(1/5)-(1/7)+...+1/(4n-3)-1/(4n-1)#include double pi(int n){ double s = 0.0; int i; for (i = 1; i <= 4*n - 1; i += 2) { s += (1 / (double)i); i += 2; s -= (1原创 2012-02-09 23:36:29 · 1840 阅读 · 1 评论 -
Vim输入左括号时自动匹配输入对应的右括号
使用方法为Alt+括号,比如在插入模式下输入(则会自动输入()同时光标在括号之间:imap ()iimap []iimap {}i原创 2011-11-07 22:19:46 · 5866 阅读 · 2 评论 -
8皇后问题
8皇后问题太经典了,各种算法书解释回溯都用这个例子,下面是求解8皇后问题的代码:#include static int count;#define QUEEN_NUMBER 8#define NO_QUEEN -1#define TRUE 1#define FALSE 0#define ABS(x) ((x)>0?(x):(-(x)))int conflict(i原创 2011-11-09 11:51:27 · 1045 阅读 · 0 评论 -
一道关于信号的题
信号是UNIX下常见的进程间通信机制。今天碰到一道信号方面题目,与大家分享,题目如下:用fork创建两个子进程,调用signal()让父进程接收键盘上的中断信号(control-c),捕捉到信号后父进程用kill()向子进程发送自定义信号,子进程捕捉到信号后分别输出如下信息后终止:Child process 1 is killed by parent!Child process 2 is原创 2011-11-13 13:04:48 · 2273 阅读 · 1 评论 -
调整过的6*12 ANSI字体
因为要做一个项目,需要小字体,本来想寻找更小的字体的,但是太小就不容易控制清晰度,昨天就刚好转换了一个字体,效果不错,特来分享。ProFontWindows字体在9的字体大小下截取,然后经过一些小的调整,首先是'#'字符太小,我将其拉长到和其他字符一样,还有'{'、'}',这两个字符太长,我将它们缩短了两个像素。现在凑成的字体看上去还挺不错的。效果如下:下载方法很简原创 2011-12-17 12:15:36 · 1687 阅读 · 0 评论 -
DS上音频播放相关问题
最近在搞DS上的开发,正好需要用到音频方面的功能。但是libnds音频方面问题实在是多,就我这两天遇到的问题总结一下。DS的有两个CPU,ARM7和ARM9。其中只有ARM7是能访问音频相关的控制寄存器的。我们一般编写程序主要在ARM9端,而需要用到音频功能时通过一些IPC手段发送消息到ARM7,然后ARM7再访问音频相关寄存器。在现在的较新版本libnds上,默认的模板已经做好了安装音频原创 2011-12-21 11:35:53 · 1842 阅读 · 0 评论 -
TCP网络通信实例--消息的发送与接收
TCP网络通信示例,用服务器等待客户端连接,并且在客户端连接后发送一个消息后切断。服务器端:#include #include #include #include #if defined(UNIX)#include #include #include #elif defined(WINDOWS)#include #define bzero(p, len) memset原创 2011-12-27 16:08:11 · 1634 阅读 · 0 评论 -
dda直线绘制算法
dda直线绘制算法,理论不好描述,这里就直接贴代码了:/* Draw Line */void line_dda(struct state *state, int x1, int y1, int x2, int y2){ float dx, dy, k, x, y; int r; int t; dx = x1 - x2; dy = y1 - y2; if (abs(dx) > a原创 2011-12-28 19:10:44 · 2206 阅读 · 0 评论 -
绘制贝塞尔曲线
简介明了直接上代码:#define PI 3.14159265struct point{ float x; float y;};void decas(int point_count, struct point *point_v, float t, struct point *point_dst){ int r; float t1 = 1 - t; struct poin原创 2011-12-28 19:46:24 · 1524 阅读 · 0 评论 -
升序输出三个整数
有这么个问题,升序输出三个整数。最直观的方式当然是排序:#include void sort(int *arr, int count){ int i, j; for (i = 0; i for (j = i + 1; j { if (arr[i] > arr[j])原创 2014-05-31 00:38:55 · 3721 阅读 · 3 评论 -
GameBoy系列(二):内存映射
内存映射0x0000-0x3FFF ROM bank(16KB)0x4000-0x7FFF switchable ROM bank(16KB)0x8000-0x9FFF Video RAM(8KB)0xA000-0xBFFF switchable RAM bank(8KB)0xC000-0xDFFF Internal RAM(8KB)0xE000-0xFDFF Echo of 8kB Internal RAM(3.5KB)0xFE00-0xFE9F Spirit Attrib Table(OA原创 2010-12-25 16:36:00 · 1851 阅读 · 0 评论 -
GameBoy系列(三):用户IO
<br /><br />用户IO<br /> <br />实现输入端口的地方只有switchable RAM bank(0xA000-0xBFFF)和ROM区域(0x6000-0x7FFF)(当然ROM要小于32KB)。<br />实现输出端口的地方只有0x6000-0xFDFF的地方,而且保证这些地方没有被用在其它地方。(因为CPU不能读写0xFE00以上的地址所以不能使用)原创 2010-12-25 16:50:00 · 1102 阅读 · 0 评论