转眼又一年过去了,一年没写blog了,今天换了wordpress,新的系统新的起点,原来自己的java版的blog系统打算去掉了,目前服务器比较吃紧,java占用内存太大了。
而blog访问量很小,所以换成wordpress,主要是为了方便,原先的内容已经迁移到新的系统中来了。
每周2篇技术相关的blog,提升自己的战斗力,同时希望对大家也有帮助。
转眼又一年过去了,一年没写blog了,今天换了wordpress,新的系统新的起点,原来自己的java版的blog系统打算去掉了,目前服务器比较吃紧,java占用内存太大了。
而blog访问量很小,所以换成wordpress,主要是为了方便,原先的内容已经迁移到新的系统中来了。
每周2篇技术相关的blog,提升自己的战斗力,同时希望对大家也有帮助。
最近在搞http://www.game13.net的小游戏采集,需要用到下载图片和下载文件。
在python中可以使用urllib方便的实现图片和flash下载,测试:
import urllib
url = "http://www.udooo.com/cooperate/qq/images/081128/left.swf"
path = "c:/spider/left.swf"
data = urllib.urlopen(url).read()
f = file(path,"wb")
f.write(data)
f.close()
python中还有更简洁的方法:
import urllib
url = r"http://www.udooo.com/cooperate/qq/images/081128/left.swf"
path = r"c:/spider/left2.swf"
data = urllib.urlretrieve(url,path)
sitemap的重要性就不多说,了解SEO的都知道。
下面说说我在使用google sitemap generator的过程:
1、下载google sitemap generator : https://www.google.com/webmasters/tools/docs/en/sitemap-generator.html#download
2、解压安装 python setup.py install,
在解压目录中有example_config.xml、example_urllist.txt、setup.py、sitemap_gen.py、test_sitemap_gen.py等文件。
3、配置config.xml文件
拷贝一份 example_config.xml 到 ntsky_config.xml
配置ntsky_config.xml的信息:
base_url : 站点
store_into: sitemap.xml文件的路径,这里是存放到了ntsky.com的跟目录下了
设置ntsky.com的访问日志为access级别,sitemap generator是读取日志文件进行分析的。日志中的访问信息会生成到sitemap.xml中去。
apache中的设置:
<VirtualHost *.*.*.*:80>
ServerName www.ntsky.com
DocumentRoot /usr/local/tomcat/www/ntsky_cms
ServerAdmin yntsky@gmail.com
ErrorLog logs/error_ntsky.com_log
CustomLog logs/ntsky.com-access_log combined
</VirtualHost>
生成的sitemap.xml文件中包含了scripts,和images目录信息,现在需要过滤怎么办呢?
<filter action="drop" type="wildcard" pattern="*/images/*" />
<filter action="drop" type="wildcard" pattern="*/UserFiles/*" />
4、执行生成
python sitemap_gen.py –config=ntsky_config.xml
将看到如下信息:
….
Writing Sitemap file "/usr/local/tomcat/www/ntsky_cms/sitemap.xml" with 533 URLs
Notifying search engines.
Notifying: www.google.com
Notification URL: http://www.google.com/webmasters/sitemaps/ping?sitemap=http%3A%2F%2Fwww.ntsky.com%2Fsitemap.xml
Count of file extensions on URLs:
94 .action
1 .bmp
12 .css
38 .gif
1 .gz
5 .htm
331 .html
1 .ico
10 .jpg
16 .js
13 .png
1 .swf
5 .xml
5 /
Number of errors: 0
Number of warnings: 0
http://www.google.com/webmasters/sitemaps/ping?sitemap=http%3A%2F%2Fwww.ntsky.com%2Fsitemap.xml 这里会调用google的接口更新sitemap.xml文件。
配合crontab,可以使用shell让站点在每天早上凌晨给google提交sitemap.xml文件了。
参考:
https://www.google.com/webmasters/tools/docs/en/sitemap-generator.html
http://www.google.cn/support/webmasters/bin/topic.py?topic=8467
使用了一段时间apache+mod_python的组合,发现问题多多,所以尝试了下apache+fastcgi的组合,下面是整合步骤,注意,下面的目录是www.game13.net站点的路径,大家根据自己的实际情况设置这些路径。
1、安装apache和fastcgi
2、apache中整合fastcgi
LoadModule fastcgi_module modules/mod_fastcgi.so
FastCGIExternalServer /usr/local/python2.5/Django-1.0.2-final/game13/mysite.fcgi -host 127.0.0.1:3033
我的项目目录在/usr/local/python2.5/Django-1.0.2-final/game13/目录,在该目录下有mysite.fcgi文件。
文件内容如下:
注意 PROJDIR 目录为django的安装目录。
修改game13中的setting,设置MEDIA_ROOT和TEMPLATE_DIRS
MEDIA_ROOT = ‘/usr/local/python2.5/Django-1.0.2-final/game13′
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don’t forget to use absolute paths, not relative paths.
#’./templates’,
‘/usr/local/python2.5/Django-1.0.2-final/game13/templates’,
)
3、启动项目
[Sun Jan 04 08:16:58 2009] [notice] Digest: generating secret for digest authentication …
[Sun Jan 04 08:16:58 2009] [notice] Digest: done
[Sun Jan 04 08:16:58 2009] [notice] FastCGI: process manager initialized (pid 16566)
[Sun Jan 04 08:16:58 2009] [warn] No JkShmFile defined in httpd.conf. Using default /usr/local/apache/logs/jk-runtime-status
[Sun Jan 04 08:16:58 2009] [notice] Apache/2.2.8 (Unix) PHP/5.2.5 mod_fastcgi/2.4.6 mod_jk/1.2.25 configured — resuming normal oper
ations
JS/CSS文件大,用户访问站点的时候需要下载JS/CSS的时间长就会感觉慢,有的甚至由于CSS的文件而造成页面初始打开很凌乱。
我们怎么提高用户下载JS/CSS的速度呢?
1、我们无法改变用户的网络状况,只有自己网站使用更快的带宽或者使用更强的服务器,使用户访问我们的时候感觉很快。
2、对JS/CSS文件进行压缩,由于文件较小,用户下载的时间就很短。
解决方案1,需要花费比较多的money,方案2实现比较简单,而且效果也明显。
下面我们介绍使用YUI Compressor进行JS/CSS压缩
1、下载yuicompressor http://www.julienlecomte.net/yuicompressor/
2、使用ant编译得到yuicompressor-x.y.z.jar的包,进入yuicompressor-x.y.z目录运行ant -f build.xml
3、在build目录下得到yuicompressor-x.y.z.jar的包,使用java -jar yuicompressor-2.4.2.jar in.js -o out.js
看下out.js的源文件就会发现去掉了注释空格等信息。
更多yui compressor的帮助请查看 http://www.julienlecomte.net/yuicompressor/README
直接使用jquery的ajax方法是不能跨域访问数据的,执行时候会报"uri denied"的错误, 需要使用$.getJSON来处理。
$.getJSON("http://*****.com/checkEmail?email="+email+"&callback=?",
function(json){
if(json.status==1){
// 执行代码
}
});
Java代码处理:
跨域执行的代码:
callback = request.getParameter("callback");
print(out,callback+"({ status: ‘1′, info: ‘填写正确!’ })");
原始ajax请求json的代码
print(out,"{ status: ‘1′, info: ‘填写正确!’ }");
区别:
跨域代码中多了callback参数,同时输出json数据时候{之前的是(
python的urlencode说明:
调用方法:
d= {’par1′:’a',’par2′:’b',}
print urllib.urlencode(m) ===>par2=b&par1=a
urlencode的参数必须是Dictionary
问题:现在模拟请求Google和baidu,由于baidu使用的是gb2312编码,google使用的是utf8编码,两个站点提交到URL中的中文参数的urlencode值是不一样,下面以"帝国"为例:
python文件的# coding: UTF-8,执行urllib.urlencode("帝国")得到的结果是:%E5%B8%9D%E5%9B%BD,此结果说明默认使用urlencode得到的结果是utf8编码的“帝国”,现在想得到gb2312编码的“帝国”怎么办呢?
st = u’帝国’
st = st.encode(’gb2312′)
m = {’par’:st,}
s = urllib.urlencode(m)
print s
结果为par=%B5%DB%B9%FA
django中urlencode类似,方法如下:
from django.utils.http import urlquote
a = urlquote(’帝国’)
print a
sequoia是一个开源的数据库集群中间件,它允许任何JAVA程序(独立的JAVA应用程序,EJB容器,servlet等)通过JDBC驱动透明的访问数据库集群。他的前身是cjdbc,由于sun的关系不得不改名。
为什么使用sequoia?
1、网站访问量大了,数据量大了,增加了数据库服务器,这个时候可以将访问比较频繁的表和访问量不频繁的表分开存储,频繁的表使用性能牛B的机器,访问不频繁的表使用稍微差点的机器,这个时候可以使用sequoia的raidb-0模式。
raidb-0的优点:
raidb-0的缺点:
看看raidb-0的代码:
config/controller中文件配置:
config/virtualdatabase
Java测试代码:
如果cjdbc有表User,这个时候select查看下就会发现增加了条记录"test"
2、访问量大,单台server已经承受不起了,需要扩展成多台server,当money大大的时候,考虑不如用多台db server来处理吧。这个时候可以考虑使用raidb-1模式
raidb-1的优点:
raidb-1的缺点:
看看raidb-1的代码实现:
config/controller中文件配置:
config/virtualdatabase设置
Java代码实现:
执行Java代码,查询cjdbc和cjdbc2两个库的User表,发现两个表中均有"test"数据。
3、由于raidb-3的情况我不会用到就没去接触了,有需要的可以查看下sequoia的文档。
fckeditor提供了上传图片功能,但代码是python的,而且一般设置fckeditor目录为静态目录没法加载python的文件,在网上找了下代码,google中早就有这样的代码了,我的项目中具体的使用步骤为:
1、打开项目链接,django-fckconnector: http://code.google.com/p/django-fckconnector/ 使用svn下载最新的源代码,svn地址:svn checkout http://django-fckconnector.googlecode.com/svn/trunk/
2、使用django-fckconnector 需要lxml和ElementTree这两个项目支持
3、将svn下载的django添加自己的项目,需要做些简单的修改,主要是文件路径类的,大家可以通过print来调试
4、修改fckconfig.js文件设置上传的文件路径:
我的django项目中定义了fckeditor/browser的链接,打开看看浏览图片,就可以看到自定义的上传目录的图片。
django的admin后台提供了基本的添加、修改、删除,由于基本admin后台的添加计较简陋,所以我就将fckeditor整合到后台中去。
admin.py的定义:
class ContentTextAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['content']}),
(None, {’fields’: ['title']}),
(None, {’fields’: ['text']}),
]
list_display = (’id’,'title’)
search_fields = ['title']
class Media:
js = (’/scripts/fckeditor/fckeditor.js’,'/scripts/fckeditor/text.js’,)
这里定义了个class Media,标示admin后台载入这部分信息的时候会加载这两个js.第一个js是fck需要的js,第二个js的代码如下:
刷新下admin后台,查看源代码,就可以看到admin后台的顶部会生成midea中定义的js
刚学django,总想知道神奇的django在操作中到底执行了那些SQL语句,我们写了个SQL的middelware,将django的SQL语句给打印到控制台。
sqlmiddleware.py的代码如下:
from time import time
from django.db import connection
from django.db import connection
class PrintSQL(object):
def process_response(self, request, response):
temp = 0
for x in connection.queries:
print x
temp += float(x['time'])
print ‘time count:’,temp,’=’ * 40
return response
修改你app的setting.py,MIDDLEWARE_CLASSES中增加:app.sqlmiddleware.PrintSQL’,
刷新下你有数据库的操作看看控制台,将会看到执行过程中的SQL语句。