Jul 24
在GAE中遇到一个很怪的模块导入问题,问题的本质,就像Java的classpath设置一样,是python中导入模块时搜索路径的问题。比如站点目录结果如下:
mysite
├─__init__.py
├─models.py
├─templates [dir]
├─static [dir]
└─check [dir]
├─__init__.py
├─views.py
└─models.py
在check目录的views.py中,我想引用根目录中的models.py中的函数,查看网页时,直接报错,找不到导入对
然后觉得很奇怪,就使用相对引用语法,应该能通过编辑器语法检查,但是在AppEngine无法运行。思前想后,应该是sys.path中,代码目录不在模块搜索路径中。搞之,修改django的启动文件,加入:
from os.path import dirname
import sys
sys.path.append(dirname(dirname(__file__)))
然后将sys.path的内容输出到浏览器,发现一个奇怪的现象:第一次访问时,上面加入的搜索路径是存在的;刷新浏览器后,新加的搜索路径莫明其妙的消失了!
万幸的是,根目录还是在搜索路径中的。所以只能灵活灵活地干活了:即将根目录的models.py,放到一个子目录中,然后使用from common.models import YourModuleObjectName ,OK!
mysite
├─__init__.py
├─templates [dir]
├─static [dir]
├─common [dir]
│ ├─__init__.py
│ └─models.py
└─check [dir]
├─__init__.py
├─views.py
└─models.py
Jul 22
因为办签证,一直以来看了很多签证方面的资料,于是也在写一个签证信息网站,使用django网页开发框架,基于Google AppEngine的主机,还不错的。
总体感觉是,测试版本的产品,使用起来还真麻烦啊!google datastore和数据库使用习惯也不一样,还需要继续摸索。但django的模板系统很喜欢,方便、灵活而强大!同样原因,开发.NET的情况,也非常喜欢MonoRail框架和NVelocity模板系统,:)
嗯,那个签证网站地址是http://visa.appspot.com/
Jul 21
现在计划换服务器主机了,大约等到8月底,将来的计划是买个这样的主机:
便宜的
独立IP地址
支持Python
支持Php
支持Java
教育网能访问的
初步意向是godaddy的主机,外加买独立IP地址和SSL证书。水木SocialSoftware网友推荐了免费IP地址查询,用来挑选godaddy的IP,挺好的先呗在这里:
http://www.nic.edu.cn/cgi-bin/reg/Qfreeip
Jan 13
背着笔记本,行走于宿舍和实验室之间,每次都要修改ip,一个要设成静态ip,另外一个是动态ip,小小研究了一下,写了两个脚本来做,以后不用点鼠标了,^_^
脚本lab.bat
netsh interface ip set address “LAN” dhcp
netsh interface ip set dns “LAN” dhcp
脚本lab.bat
netsh interface ip set address “LAN” static 59.66.96.123 255.255.254.0 59.66.96.1 1
netsh interface ip set dns “LAN” static 166.111.8.28 primary
netsh interface ip add dns name=”LAN” addr=166.111.8.29 index=2
其中LAN是我的局域网连接的名称。更详细的解释,参考netsh命令的帮助,或者查看“如何在命令行更改ip地址 ”。
如果对用Python完成这个工作感兴趣,请看“用Python干实事: 自动修改Windows的IP、网关和DNS设置 ”,呵呵。
Jan 06
GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。下表给出了一些主要的
预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。
预定义变量????????????????????? 含义
$*????????????? 不包含扩展名的目标文件名称。
$+????????????? 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$<????????????? 第一个依赖文件的名称。
$?????????????? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@????????????? 目标的完整名称。
$^????????????? 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$%????????????? 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称
??????????????? 为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
AR????????????? 归档维护程序的名称,默认值为 ar。
ARFLAGS???????? 归档维护程序的选项。
AS????????????? 汇编程序的名称,默认值为 as。
ASFLAGS???????? 汇编程序的选项。
CC????????????? C 编译器的名称,默认值为 cc。
CCFLAGS???????? C 编译器的选项。
CPP???????????? C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS??????? C 预编译的选项。
CXX???????????? C++ 编译器的名称,默认值为 g++。
CXXFLAGS??????? C++ 编译器的选项。
FC????????????? FORTRAN 编译器的名称,默认值为 f77。
FFLAGS????????? FORTRAN 编译器的选项。
出处:http://www.aka.org.cn/Lectures/001/Lecture-1/make.html
Jan 06
遍历并打印linux的环境变量的代码片段:
#include <stdlib.h>
//The ENVIRON variable contains the environment
extern char ** environ;
int main( ) {
char ** var;
for ( var = environ; *var != NULL ; ++var) {
printf ( "%s\n " , *var) ;
}
return 0 ;
}
如果需要读取、设置或清楚环境变量,请分别man这几个:getenv、setenv、unsetenv。
Jan 06
1. 包含getopt.h
2. 定义短选项,比如,ho:v
3. 定义长选项结构,注意最后一项全部设为0
4. 未定义的选项,解析时会返回’?’
5. 含有参数的选项,参数存于全局变量optarg中
6. 非参数选项的起始索引,存于全局变量optind中
示例程序如下:
#include <stdlib.h></stdlib.h>
#include <stdio.h></stdio.h>
#include <getopt.h></getopt.h>
const char * program_name;
void print_usage( FILE* stream, int exit_code) {
fprintf( stream, "Usage: %s options [ inputfile ...]n" , program_name) ;
fprintf( stream, " -h –help Display this uage information.n"
" -v –verbose Print verbose message.n"
" -o –output filename Write output to file.n" ) ;
exit( exit_code) ;
}
int main( int argc, char * argv[ ] ) {
int next_option;
const char * short_options = "ho:v" ;
const struct option long_options[ ] = {
{ "help" , 0 , NULL , ‘h’ } ,
{ "output" , 1 , NULL , ‘o’ } ,
{ "verbose" , 0 , NULL , ‘v’ } ,
{ NULL , 0 , NULL , 0 }
} ;
const char * output_filename = NULL ;
int verbose = 0 ;
program_name = argv[ 0 ] ;
do {
next_option = getopt_long( argc, argv, short_options, long_options, NULL ) ;
switch ( next_option) {
case ‘h’ :
print_usage( stdout, 0 ) ;
case ‘o’ :
//the global var optarg contains the specified argument
output_filename = optarg;
break ;
case ‘v’ :
verbose = 1 ;
break ;
case ‘?’ : //if the arg list contains invalid options
print_usage( stderr, 1 ) ;
case -1 :
break ;
default :
abort( ) ;
}
} while ( next_option != -1 ) ;
printf ( "[option] verbose: %dn" , verbose) ;
printf ( "[option] output: %sn" , output_filename) ;
if ( verbose) {
int i;
//the global var optind contains the index of the first nonoption argument
for ( i = optind; i<argc;></argc;> printf ( "Argument: %sn" , argv[ i] ) ;
}
}
return 0 ;
}
相应的Makefile:
CC=g++
CFLAGS=-Wall -g
all: getopt
getopt: getopt.o
$(CC) $(CFLAGS) -o $@ $@.o
%.o: %.c
$(CC) $(CFLAGS) -c $+
clean:
rm -f *.o
rm -f getopt
Dec 19
风传中国移动开始推128MB的SIM卡,最大可以达到2GB,号称内置一个卡上操作系统。只是不知道这个系统,是不是开放的,能有多少花样,^_^
相关视频演示:
Dec 12
花了些时间了解Android ,觉得它挺有前途的。本来以为,是基于J2ME框架之上的一个东东,没有想到是一个完全的框架,有自己的虚拟机、Java ME实现、视图实现等等,基本上是另一个Java ME框架,但还加入更好的设计,比如类似MVC的视图View、Activity、Intent等设计,让程序的界面和逻辑可以松散耦合,程序也灵活很多。
另外有趣的一个东东是UI的设计,可以通过声明的方式(declarative)创建,通俗地说,就是编写XML文件来创建界面。前些天Marcel也提到这个特性,当时貌似没听清楚,不过倒是听听出了他对XML UI的看法,他说:有点类似于微软的XAML,在Vista中有用到;但是呢,最早用这个技术的是Firefox,Firefox就是使用XUL构建的 ;然后他就对微软发表了一点看法。:)
?另外一个我感兴趣的,可以看Android的架构,注意里面有它是基于linux系统的,还有libc,不知道将来能否使用C语言开发,^____^
Dec 12
发信人: thinkpadfan (人,都是逼出来的…), 信区: NoteBook
标? 题: 关于笔记本4G内存的讨论(转载)
发信站: 水木社区 (Mon Nov 12 18:36:13 2007), 站内
关于4GB内存的讨论
在计算机上使用4GB(或者更多)内存一直以来有很多争议,这两天趁着养病仔细研究了一
下这个问题,也与大家分享一下结论。
首先在微软的网站上关于4GB内存限制问题有一篇技术文档:
http://support.microsoft.com/kb/929605/en-us
另外在一个论坛上也对此问题有比较深入的讨论:
http://www.brianmadden.com/content/article/The-4GB-Windows-Memory-Limit-What-doe
s-it-really-mean-
总结一下,大致可以归纳为以下几点:
1. 要在PC中使用超过4GB的内存,需要同时满足以下若干条件
(1)主板配置有支持至少8GB内存寻址的芯片组(例如Intel P965/P975)
(2)CPU支持X64指令集(例如Intel Core2处理器)
(3)BIOS支持memory remapping
(4)使用64bit的操作系统(或支持物理内存扩展技术的32bit操作系统)
2. Intel 945芯片组或更早期的芯片组,受到32bit的限制,最大只能寻址到4GB,也就是说
只能访问4GB以内的地址。但是这4GB地址并不是完全留给内存使用的,与此同时,各种接口
、IO设备都还需要分配大量的寻址空间(例如显卡通常就要占用数百MB),所以最后留给系
统物理内存这一硬件的寻址空间,就只剩下3GB多一些。而操作系统也只能识别到这么多的
物理内存。因此,如果PC系统的硬件达不到以上第一点中的(1)(2)(3)条时,即使在系统中
安装超过4GB的内存,能够被识别的物理内存也只有4GB,而留给操作系统使用的只有3GB多
一些。
3. 操作系统对识别的内存数也有影响。32bit的操作系统只具备4GB的寻址能力,即使硬件
满足上述使用4GB内存的条件,限于操作系统的寻址空间限制,必须要保留数百MB的寻址空
间给各种接口和IO设备,因此操作系统仍然最多只可以用到3GB多一些的物理内存。而
64bit的操作系统下,因为把各种接口和IO设备所占用的地址空间移到更靠后的地址段,因
此4GB物理内存可以完全寻址,也就是完全识别使用。再延伸一下,同理可以推断,假设某
64bit操作系统的最大寻址能力是8GB,而系统安装了8GB的物理内存,那么操作系统可以识
别并使用的内存也就是7GB多一些。
4. 我自己找了一台ThinkCentre M55(Intel 965芯片组)并安装了4GB内存,然后分别安装
了Vista 32bit、Vista 64bit、Ubuntu Linux 32bit和Ubuntu Linux 64bit进行测试,从结
果来看验证了上述观点。
补充:根据黑友“bobww”提供的信息,再补充两点如下:
以下两点均要求硬件满足以上第一点中的(1)(2)(3)。
5. 部分支持PAE技术的32bit操作系统(主要是服务器类系统),例如:
? Microsoft Windows 2000 Advanced Server
? Microsoft Windows 2000 Datacenter Server
? Microsoft Windows Server 2003 Enterprise Edition
? Microsoft Windows Server 2003 Datacenter Edition
可以通过启用PAE功能来支持4GB或者更多内存。参见微软知识库:
http://support.microsoft.com/kb/283037/zh-cn
而32bit的Linux通过在内核中配置支持Large Memory Support,也可以支持4GB内存。
(关于这一点,我还没有测试证实,如果有时间会试试看。)
关于微软操作系统支持内存的上限,可以参见我之前发布的文档:
http://thinklenovo.spaces.live.com/blog/cns!277BF25C1053199D!1289.entry
6. 至于32bit的Windows XP,在升级到SP2之前可以使用PAE技术使用到4GB内存,但是升级
到SP2之后,由于微软限制,即使开启PAE,系统也只能显示3GB左右的内存容量。参见微软
知识库:
http://support.microsoft.com/?scid=kb%3Ben-us%3B888137&x=15&y=12
(关于XP SP2之前版本的情况,我也还没有测试证实,如果有时间也会试试看。)
另外我在32bit的Vista上测试了强制启用PAE的情况,结果和不启用PAE没有差别,与XP
SP2的表现相同。
from: http://thinklenovo.spaces .live.com/PersonalSpace.aspx
最新评论