2009/05/29

windows XP 下用virtual box安装 ubuntu

没有评论:
虚拟机软件 :
Virtualbox是一个十分小
巧的虚拟化 软件,开源免费,相当不错。而且基本功能都具备,个人使用完全没有问题。约20M。 2008年2月virtualbox原来的公司 innotek被sun收购。

VMware Workstation with ACE, 600多M的安装包,适合公司内使用,便于管理多个设备。

Virtual PC 为微软产品。

本文介绍如何在windows XP 下用virtual box安装 ubuntu9.04

1. 安装 virtual box, 运行
点击“new”按钮创建一个ubuntu虚拟机

2. 不着急运行虚拟机,先配置ISO虚拟光盘。点击“setting”,在“光驱”选项中勾选“分配光驱”,点虚拟光盘。打开,创建一个并指向硬盘上的文件(下载 ubuntu-9.04-desktop-i386.iso文件)。

3 运行该虚拟机。会提示安装,余下皆如直接安装ubuntu过程。在预留硬盘空间时,选择 动态调整大小,并使用整个“硬盘”。该操作不会覆盖windows host也不占用整个空间,虚拟机只是在你的windows下开辟了一个目录存放。

注意: right ctrl 为切换键, right ctrl + F 为全屏切换。

其他问题:
1. VirtualBox Ubuntu全屏 , 分辨率
2. 共享文件
解决办法:
点击vbox菜单 devices -> install guest additions (似乎无反应). 重启后会发现在Ubuntu桌面上多出一个vbox光盘图标,这张光盘默认被自动加载到了文件夹/media/cdrom0 (或 链接 /cdrom )。

进入命令行终端,输入:
cd /media/cdrom0
sudo ./VboxLinuxAdditions.run
开始安装工具包。安装完毕后会提示要重启Ubuntu。之后屏幕分辨率问题应该解决。 windows 与ubuntu之间共享可以简单处理如下: windows设置共享目录, ubuntu connects to server。 或
借助virtual box设置共享文件夹
重启完成后点击"设备(Devices)" -> 共享文件夹(Shared Folders)菜单,添加一个共享文件夹,选项Make Permanent是指该文件夹是否是持久的。共享名可以任取一个自己喜欢的,比如"flamingo",尽量使用英文名称。
挂载共享文件夹
重新进入虚拟Ubuntu,在命令行终端下输入:
sudo mkdir /mnt/shared
sudo mount -t vboxsf flamingo /mnt/shared
其中"flamingo"是之前创建的共享文件夹的名字。OK,现在Ubuntu和主机可以互传文件了。
假如您不想每一次都手动挂载,可以在/etc/fstab中添加一项
flamingo /mnt/shared vboxsf rw,gid=100,uid=1000,auto 0 0
这样就能够自动挂载了。
注意:
共享文件夹的名称千万不要和挂载点的名称相同。比如,上面的挂载点是/mnt/shared,如果共享文件夹的名字也是shared的话,在挂载的时候就会出现如下的错误信息(看http://www.virtualbox.org/ticket/2265):
/sbin/mount.vboxsf: mounting failed with the error: Protocol error
原因分析可以看《Tips on running Sun Virtualbox》的Shared Folder on a Linux Guest节。
卸载的话使用下面的命令:
sudo umount -f /mnt/shared

2009/05/12

Ubuntu 9.04: firefox中不能输入中文

没有评论:
问题: firefox上不能用 ctrl+空格 启动scim输入法

解决:
1. 找到firefox 3.0.10启动脚本位置 /usr/bin/firefox

2. 用vi或其他编辑器打开/usr/bin/firefox,在文件开头处加入如下红色内容:
MOZDIR=$HOME/.mozilla
LIBDIR=/usr/lib/firefox-3.0.3
APPVER=3.0
META_NAME=firefox
GDB=/usr/bin/gdb
DROPPED=abandoned

XMODIFIERS=@im=SCIM
GTK_IM_MODULE=scim-bridge
export XMODIFIERS GTK_IM_MODULE

2009/05/06

Python 中循环引用导致内存泄漏

没有评论:
python的垃圾收集功能。首先python中的所有对象都是继承object对象,python源码中关于object类型的定义:
[object.h]
typedef struct _object{
int ob_refcnt;
struct _typeobject * ob_type;
} PyObject;
其中ob_type是用来确定对象类型的变量,而ob_refcnt是用于垃圾收集的对象的引用计数。当对象创建的时候此成员的值就是1,例如 a=MyType(),a的引用计数就是1,如果进行对象赋值操作,例如b = a, a的引用计数就变成2。相对的,如果再运行b = c,那么a的引用计数就减1. 当对象的引用计数为0时,表明没有其他对象引用该对象。该对象所分配的内存就可以回收了

当一个对象的引用计数减少至零时,它就会在适当时机被垃圾回收车拉走。然而,特定情况(循环引用)会阻止垃圾回收车销毁不再使用的对象,看下面的例子:

1 a = { } # a 的引用为 1
2 b = { } # b 的引用为 1
3 a['b'] = b # b 的引用增 1,b的引用为2
4 b['a'] = a # a 的引用增 1,a的引用为 2
5 del a # a 的引用减 1,a的引用为 1
6 del b # b 的引用减 1, b的引用为 1

在这个例子中,del语句减少了 a 和 b 的引用计数并删除了用于引用的变量名,可是由于两个对象各包含一个对方对象的引用,虽然最后两个对象都无法通过名字访问了,但引用计数并没有减少到零。因此这个对象不会被销毁,它会一直驻留在内存中,这就造成了内存泄漏。

解决办法1: break the circle.
before 5: a['b'] = None

因此,有 __del__() 函数的对象(如list,dict)间的循环引用是导致内存泄漏的主凶。特别说明:对没有 __del__() 函数的 Python 对象(如int)间的循环引用,是可以被自动垃圾回收掉的。

慎写自己的__del__() 函数啊 :-(

解决办法2:
定期的运行 pythn gc module的搜索器,若发现一个对象已经无法被访问 (untouchable),不论该对象引用计数是否为 0 ,都主动销毁它 del gc.garbage[:]。通过 gc 模块的函数来进行调整和控制gc.enable()

print 'begin collect...'
_unreachable = gc.collect()
print 'unreachable object num:%d' % _unreachable
print 'garbage object num:%d' % len(gc.garbage)
del gc.garbage[:]

解决办法3: (调试)
# 通过引用计数判断数据单元是否可以回收
# 通过扩展模块gc中的接口可以分析调试垃圾回收的情况

使用get_objects( )方法可以取得当前所有不能回收的对象(引用计数不为0)的列表
可以写个循环把他们都打印出来调试。该方法只执行一次,因为 它本生会增加变量的引用,特别是在有内存泄露的情况下.
For example:

# after potential wrong code
objs = gc.get_objects()
for obj in objs:
if isinstance( obj, XXX): print obj # check objects here





References:
[1] Python的Garbage Collector module (import gc)
http://docs.python.org/library/gc.html

[2] http://blog.csdn.net/horin153/archive/2007/06/08/1644512.aspx

Python和C混合编程时需注意内存泄漏

没有评论:
看下面的例子:

PyObject* py_func(PyObject *self, PyObject *args)
{
PyObject *pStr = Py_BuildValue("s", "a string for test....");
PyObject *pList = PyList_New(1);
PyList_SetItem(pList, 0, pStr);
Py_DECREF(pStr); // decrease the reference of pStr.
return pList;
}

当pStr被创建时,引用计数增1,加入pList后,引用计数又增1;同样,pList被创建时,引用计数也增1;pList返回给Python 使用,当不再需要时,pList和其包含的每个元素的引用计数都将减1;如果我们不在pStr加入pList后对其引用计数减1,每个创建的pStr都不会被销毁,一直保存在内存中。

另: 以下方式只对 PyList_SetItem(), PyTuple_SetItem()有效,其他的则会产生内存泄露

PyFunctions_XXXX(pList, 0, Py_BuildValue("s", "never destroy..."));

python文档告诉我们这两个函数是 burrow reference.

2009/05/05

C扩展接口程序中的Python引用计数器泄漏

没有评论:
如果是python code产生的内存泄露,可以用gc module来调试;

如果是接口C程序产生的内存泄露,可以用工具linux ,valgrind 或 vc++ 并 visual leak detector来调试。个人感觉后者更简单易用。

valgrind 为linux 下free 内存调试软件

http://valgrind.org/

内存泄漏调试过程
* 使用分析工具Valgrind对整个应用程序的运行过程进行分析
* 运行命令行
valgrind -v --leak-check=yes --num-callers=256 --logfile=d python d.py

分析内存占用情况
* 为valgrind增加命令行参数--show-reachable=yes,这将会把还在使用的内存情况也打印出来
* 运行命令行
valgrind -v --show-reachable=yes --leak-check=yes --num-callers=256 \
--logfile=d python d.py


附: 引用计数相关函数
(1)void Py_INCREF(PyObject *o)
void Py_XINCREF(PyObject *o)
增加引用计数,如果不确定对象o是否为空,使用后者

(2)void Py_DECREF(PyObject *o)
void Py_XDECREF(PyObject *o)
减少引用计数,如果不确定对象o是否为空,使用后者

(3)void Py_CLEAR(PyObject *o)同上

2.4以后版本使用Py_IncRef(PyObject *o), Py_DecRef(PyObject *o), Py_CLEAR(PyObject *o)

检查C++中的内存泄漏 -Visual Leak Detector

没有评论:

Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,用户可从http://www.codeproject.com/tools/visualleakdetector.asp下载,该软件以库形式与用户的被测工程一起使用,由于VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)协议对外开源,所以不必担心版权问题。

使用VLD

先从网站下载VLDzip包,当前最高版本是V1.0,解压后得到vld.hvldapi.hvld.libvldmt.libvldmtdll.libdbghelp.dll等文件,把这些所有.h头文件拷贝到VC默认的include目录下,将所有.lib文件拷贝到VC默认的lib目录下,安装工作就完成了。
使用VLD很简单,只须在包含入口函数的CPPC文件中把vld.h头文件包含进来即可。该include语句要求放在最前面,如果当前工程定义预编译head文件(如stdafx.h),则放在“#include ”语句之后就可以了。之后正常编译、按Debug方式运行被测程序,等程序运行结束时,查阅VCoutput窗口,会有“Visual Leak Detector is now exiting.”一句打印信息,在这条件信息之前,如果当前程序没有内存泄露会有“No memory leaks detected.”信息打印,但如果有内存泄露,将有类似如下信息打印:
C:"VcTester21"sample"vc6"SampleMain.c (80): main
crt0.c (206): mainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data: CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak.
这个信息指明当前发生内存泄露所在的函数及源文件行号,泄露内存块的地址、长度及当前内存值。用鼠标双击指示源码行的提示信息,VC即自动跳转到相应代码行,我们就很方便的知道是哪一行出错了。
可以看出,VLD用起来很简单,对它的实现原理感兴趣的朋友可以阅读VLD源码
memoryleak.cpp
#include "stdafx.h"
#include

int _tmain(int argc, _TCHAR* argv[])
{
char *pTest = new char[10];

return 0;
}


从output窗口我们可以看到有内存泄漏:
Visual Leak Detector Version 1.0 installed (multithreaded DLL).
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 109 at 0x003ACEC8: 10 bytes ----------
Call Stack:
e:\example\memoryleak\memoryleak\memoryleak.cpp (10): wmain
f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (583): __tmainCRTStartup
f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): wmainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data:
CD CD CD CD CD CD CD CD CD CD ........ ........

Visual Leak Detector detected 1 memory leak.
“MemoryLeak.exe”: 已卸载“C:\WINDOWS\system32\dbghelp.dll”
“MemoryLeak.exe”: 已卸载“C:\WINDOWS\system32\version.dll”
Visual Leak Detector is now exiting.
程序“[5056] MemoryLeak.exe: 本机”已退出,返回值为 0 (0x0)。
很方便我们找出内存泄漏的地方!

2009/05/01

Install CGAL-python under Ubuntu 9.04

没有评论:
如何安装:

问题在于ubuntu 9.04 uses python 2.6 instead of python 2.5, which makes the previous build of cgal-python0.9.3 invalid. Need to rebuild cgal-python.

Since the newest CGAL version is 3.4, we upgrade it from 3.3.

--------------------------
install boost-python

still use libboost-python1.34.1. note that 1.37.0 does not make the cgal-python building correct. If 1.37.0 exists, remove from synatic.

sudo apt-get install libboost-python1.34.1
sudo apt-get install libboost-python-dev

-------------------------
install CGAL 3.4

1. download
http://gforge.inria.fr/frs/?group_id=52

2. sudo apt-get install cmake

3. follow the instruction of INSTALL under CGAL-3.4 directory
cmake .

4. make

5. sudo make install

------------------------

install cgal-python0.9.4 beta1 (the latest. I guess 0.9.3 is also OK.)


download the package, and do
export CPATH=/usr/include/python2.6:$CPATH
export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH

python setup.py build
python setup.py install (possibly as root)