企鹅's Blog

Happy coding

路上有惊喜

骑自行车或走路上班,都比坐公交车或自架车有趣。

可以遇到不同的路人,而不仅限于一辆车上的人;

可以有足够的时间去看清楚路人,而不是一晃而过;

可以在报刊亭停下来,看看喜欢的杂志有没有到;

可以骑得很快或很慢,超过前面的美女,或者被后来的美女超过。。。

TinyC 把 C 代码当脚本运行的编译器

主页:

http://bellard.org/tcc/

介绍文章:

http://www.ibm.com/developerworks/cn/linux/l-tinyc/part1/

像这样:

 

#!/usr/bin/tcc -run -L/usr/X11R6/lib -lX11
#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 搜索的,特别好,所以保留下来

  1. MySQL vs PostgreSQL - Database - Tech - JavaEye论坛

  2. MySQL vs PostgreSQL - WikiVS

  3. MySQL vs. PostgreSQL

  4. 翻译:Oracle 10g vs PostgreSQL 8 vs MySQL 5(外围特性评比 ...

 

web2py 文章链接

看了一些 web2py 的文档,如下:

  1. 与Web2Py共舞:cookbook

  2. 名似质非的高可用web框架

  3. web2py SQLDesigner

为了与其他 web 框架做比较,也看了一些其他框架的文档:

  1. Django Step by Step
  2. KarrigellWebDev  快速体验 Karrigell WEB 开发

专门的比较文档:

  1. Web2py vs Django, PHP, Pylons, Turbogears, j2ee, cakephp

  2. Web2py vs Others

  3. Comparison of web application frameworks

  4. Benchmark for ORM

投票式的比较:

  1. Web2py vs Django (framework)

  2. Web2py vs Rails

讨论式的:

  1. Anyone out there using Web2py? 其中有很多有益的观点。

其它:

PyCon ORM panel 介绍了各种 ORM 的历史等

链接:

web2py google group

华蟒用户组 (CPyUG)

名词解释:

ORM

 Updated in 2009-05-13:15:33

Lxr ng 安装

http://lxr.linux.no/

lxrng 新版本的 lxr.

在 Asianux 3 中安装 lxr 很费劲,后来找到了如下两份参考文档:

[Howto] LXRng on Ubuntu 7.10

http://lxr.linux.no/.static/contrib/lxr-notes-ubuntu.txt

对安装很有帮助。

Hello GTK+ in Linux Assembly Language

学着书里的例子,写一个 GTK+ 程序:

 

# Hello GTK+ in Assembly
#
# 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 $? 是打印不出正确的值的。

 

 

.section .data

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++永久对象存储

POST++

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;
}

 

就这些。