路上有惊喜
骑自行车或走路上班,都比坐公交车或自架车有趣。
可以遇到不同的路人,而不仅限于一辆车上的人;
可以有足够的时间去看清楚路人,而不是一晃而过;
可以在报刊亭停下来,看看喜欢的杂志有没有到;
可以骑得很快或很慢,超过前面的美女,或者被后来的美女超过。。。
TinyC 把 C 代码当脚本运行的编译器
主页:
http://bellard.org/tcc/
介绍文章:
http://www.ibm.com/developerworks/cn/linux/l-tinyc/part1/
像这样:
#include <stdlib.h>
/* Yes, TCC can use X11 too ! */
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
Display *display;
Screen *screen;
display = XOpenDisplay("");
if (!display) {
fprintf(stderr, "Could not open X11 display\n");
exit(1);
}
printf("X11 display opened.\n");
screen = XScreenOfDisplay(display, 0);
printf("width = %d\nheight = %d\ndepth = %d\n",
screen->width,
screen->height,
screen->root_depth);
XCloseDisplay(display);
return 0;
}
MySQL vs PostgreSQL 文章链接
都是从 Google 搜索的,特别好,所以保留下来
web2py 文章链接
看了一些 web2py 的文档,如下:
为了与其他 web 框架做比较,也看了一些其他框架的文档:
- Django Step by Step
-
KarrigellWebDev 快速体验 Karrigell WEB 开发
专门的比较文档:
投票式的比较:
讨论式的:
-
Anyone out there using Web2py? 其中有很多有益的观点。
其它:
PyCon ORM panel 介绍了各种 ORM 的历史等
链接:
名词解释:
Updated in 2009-05-13:15:33
Lxr ng 安装
http://lxr.linux.no/
lxrng 新版本的 lxr.
在 Asianux 3 中安装 lxr 很费劲,后来找到了如下两份参考文档:
http://lxr.linux.no/.static/contrib/lxr-notes-ubuntu.txt
对安装很有帮助。
Hello GTK+ in Linux Assembly Language
学着书里的例子,写一个 GTK+ 程序:
#
# as -g asm-gtk.s -o asm-gtk.s.o
# gcc asm-gtk.s.o `pkg-config --libs gtk+-2.0` -g -o test
# ./test
#
# Author: Pengu1n , Date: 20090508
#
.section .data
# Strings
APP_TITLE:
.ascii "GTK+ in ASM\0"
HELLO_ASM:
.ascii "Hello ........ ASM!\0"
BUTTON_CLICKED_INFO:
.ascii "Hello button clicked!\n\0"
.equ BUTTON_CLICKED_INFO_LEN, . - BUTTON_CLICKED_INFO # '.' means current address
# Constants
.equ GTK_WINDOW_TOPLEVEL, 0
.equ NULL, 0
# GTK+ Signal name
signal_button_clicked:
.ascii "clicked\0"
signal_delete_event:
.ascii "delete_event\0"
.section .bss
.equ WORD_SIZE, 4
.lcomm main_window, WORD_SIZE
.lcomm hello_button, WORD_SIZE
.section .text
.global main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp # args is here, but howto get &argc ?
# TODO: pass &argc, &argv to gtk_init
pushl $NULL
pushl $NULL
call gtk_init
addl $8, %esp
pushl $GTK_WINDOW_TOPLEVEL
call gtk_window_new
addl $4, %esp
movl %eax, main_window
pushl $APP_TITLE
pushl main_window
call gtk_window_set_title
addl $8, %esp
# Setup destory singal handler
pushl $NULL
pushl $NULL
pushl $NULL
pushl $destroy_handler
pushl $signal_delete_event
pushl main_window
call g_signal_connect_data # g_signal_connect is just a macro,
# so we must call g_signal_connect_data directly
addl $24, %esp
pushl $HELLO_ASM
call gtk_button_new_with_label
addl $4, %esp
movl %eax, hello_button
# Setup destory singal handler
pushl $NULL
pushl $NULL
pushl $NULL
pushl $button_clicked_cb
pushl $signal_button_clicked
pushl hello_button
call g_signal_connect_data
addl $24, %esp
pushl hello_button
pushl main_window
call gtk_container_add
addl $8, %esp
pushl main_window
call gtk_widget_show_all
addl $4, %esp
call gtk_main
movl $1, %eax
movl $0, %ebx
int $0x80
.type destroy_handler, @function
destroy_handler:
pushl %ebp
movl %esp, %ebp
call gtk_main_quit
movl $0, %eax
leave
ret
.type button_clicked_cb, @function
button_clicked_cb:
pushl %ebp
movl %esp, %ebp
movl $4, %eax # syscall __NR_write
movl $1, %ebx # stdout
movl $BUTTON_CLICKED_INFO, %ecx
movl $BUTTON_CLICKED_INFO_LEN, %edx
int $0x80
movl $0, %eax
leave
ret
遗留问题:还没有找到如何传 argc, argv 给 gtk_init。
Linux 下的汇编编程指南
<<Programming from the Ground Up>>
无意中看到了这本讲 Linux 下的汇编的书,看了几节,很容易看懂,推荐学习 Linux 下的汇编的朋友看一阅,直接下载 PDF。
想起来了,是在 AKA 成员编写的 <<Linux C编程一站式学习>> 中的连接中看到的,这是一本非常有特色的 C 编程教程。
顺手试了其中的第三章中的第二个例子,结果发现 Linux 系统中程序结束时的返回值好像限制在正负 255 以内?
如果 data_items 中的数值有大于 256 的,在程序结束后,echo $? 是打印不出正确的值的。
data_items:
.long 3,23,20,11,10,100,125,254,1,0
.section .text
.global _start
_start:
movl $0, %edi
movl data_items(, %edi, 4), %eax
movl %eax, %ebx
start_loop:
cmpl $0, %eax # check end
je loop_exit
incl %edi
movl data_items(, %edi, 4), %eax
cmpl %ebx, %eax
jle start_loop
# swap value
movl %eax, %ebx
# reloop
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
as src.s -o src.o
ld src.o -o test
./test
echo $?
---
Update: 已经由朋友证实返回值是被限制在 0~255 之间的。所以无法回返更大的值。
C++永久对象存储
Persistent Object Storage for C++
"POST++ provides a simple persistent storage for your application, making your objects persistent with no overhead on accessing objects at runtime."
文档: http://www.garret.ru/post/readme.htm
在考虑存储 c++ 对象的问题,所以找到了这个。对于 Python 中的永久对象存储,有 Zope 中的 ZODB,非常强大。
我是一个程序员
我其实就是一个程序员。
很长一段时间,都没有停下来思考过自己是个什么东西,当然我看到开始全面接触 GTK+ 中的一个连接 'galeki' (http://galeki.is-programmer.com/)时,我才重新意识到,我其实就是一个程序员。
* Pengu1n.c
*
* gcc -Wall -Werror -o pengu1n.is-programmer.com Pengu1n.c
*
*/
#include <stdio.h>
typedef struct _programmer programmer_t;
struct _programmer {
char * name;
int age;
char * from;
char * reg_date;
};
void dump_programmer (programmer_t *p)
{
if (!p) {
return;
}
printf ("Name: %s, Age: %d, From: %s, Register date: %s\n",
p->name,
p->age,
p->from,
p->reg_date);
}
int main (int argc, char *argv[])
{
programmer_t pengu1n = {
.name = "Pengu1n",
.age = 100 - 73,
.from = "SiChuan",
.reg_date = "20090430"
};
dump_programmer (&pengu1n);
return 0;
}
就这些。