So Tired !_! 逆水行舟, 不进则退!

30Jul/11

Django数据库模型的字段类型总结

Posted by Nick Xu

从网上找了好长时间,总算是找了个差不多。因为经常用,自己又记不住,所以还是总结一下。帮助自己的同时也能帮助别人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
V=models.CharField(max_length=None[, **options])    #varchar
V=models.EmailField([max_length=75, **options])    #varchar
V=models.URLField([verify_exists=True, max_length=200, **options])    #varchar
V=models.FileField(upload_to=None[, max_length=100, **options])    #varchar
#upload_to指定保存目录可带格式,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])    #varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar
V=models.SlugField([max_length=50, **options])    #varchar,标签,内含索引
V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varchar
V=models.IntegerField([**options])    #int
V=models.PositiveIntegerField([**options])    #int 正整数
V=models.SmallIntegerField([**options])    #smallint
V=models.PositiveSmallIntegerField([**options])    #smallint 正整数
V=models.AutoField(**options)    #int;在Django代码内是自增
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimal
V=models.FloatField([**options])    #real
V=models.BooleanField(**options)    #boolean或bit
V=models.NullBooleanField([**options])    #bit字段上可以设置上null值
V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date
#auto_now最后修改记录的日期;auto_now_add添加记录的日期
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])    #time
V=models.TextField([**options])    #text
V=models.XMLField(schema_path=None[, **options])    #text
——————————————————————————–
V=models.ForeignKey(othermodel[, **options])    #外键,关联其它模型,创建关联索引
V=models.ManyToManyField(othermodel[, **options])    #多对多,关联其它模型,创建关联表
V=models.OneToOneField(othermodel[, parent_link=False, **options])    #一对一,字段关联表属性
Tagged as: , No Comments
26Jul/11

django简单的入门例子

Posted by Nick Xu

建立项目:django-admin.py startproject test1

建立目录:django-admin.py startapp views

django-admin.py startapp db

django-admin.py startapp templates

hello.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.http import HttpResponse
from django.template import Context,Template
from django.template.loader import get_template
from django.shortcuts import render_to_response
 
import datetime
def current_time(request):
    now=datetime.datetime.now()
    html="It is now %s ." %now
    return HttpResponse(html)
 
def hours_ahead(request,offset):
    offset=int(offset)
    dt=datetime.datetime.now()+datetime.timedelta(hours=offset)
    html="In %s hour(s) ,it will be %s." %(offset,dt);
    return HttpResponse(html)
 
def hours_after(request,offset):
    offset=int(offset)
    dt=datetime.datetime.now()-datetime.timedelta(hours=offset)
    html="%s hour(s) ago,it will be %s." %(offset,dt);
    return HttpResponse(html)
 
# plus_or_minus和offset参数由urls.py中设置,这里的设置是
#(r'^now/(plus|minus)(\d{1,2})hours/$', hello.hours_offset),
#与位置顺序有关
def hours_offset(request,plus_or_minus,offset):
    offset=int(offset)
    if plus_or_minus=='plus':
        dt=datetime.datetime.now()+datetime.timedelta(hours=offset)
        html="In %s hour(s) ,it will be %s." %(offset,dt);
    else:
         dt=datetime.datetime.now()-datetime.timedelta(hours=offset)
         html="%s hour(s) ago,it will be %s." %(offset,dt)
    return HttpResponse(html)
 
#使用模板
def t_current_time(request):
    now=datetime.datetime.now()
    html="It is now {{current_time}}."
    t=Template(html)
    c=Context({'current_time':now})
    ret=t.render(c)
    return HttpResponse(ret)
 
#使用模板,需要在setting.py文件里配置TEMPLATE_DIRS , 在这里的地址是'f:/django/test1/templates',
def tl_current_time(request):
    now=datetime.datetime.now()
    t=get_template('current_time.html')
    c=Context({'current_time':now})
    ret=t.render(c)
    return HttpResponse(ret)
 
#使用render_to_response()方法渲染模板
def render_current_time(request):
    now=datetime.datetime.now()
    return render_to_response('current_time.html',{'current_time':now})
 
def renderl_current_time(request):
    current_time=datetime.datetime.now()
    #locals()返回一个包含当前作用域里面的所有变量和他们的值的字典
    #在这里就相当于{'current_time':current_time}
    return render_to_response('current_time.html',locals())
 
#前台循环
def musician_list(request):
    MUSICIANS = [
        {'name': 'Django Reinhardt', 'genre': 'jazz'},
        {'name': 'Jimi Hendrix',     'genre': 'rock'},
        {'name': 'Louis Armstrong',  'genre': 'jazz'},
        {'name': 'Pete Townsend',    'genre': 'rock'},
        {'name': 'Yanni',            'genre': 'new age'},
        {'name': 'Ella Fitzgerald',  'genre': 'jazz'},
        {'name': 'Wesley Willis',    'genre': 'casio'},
        {'name': 'John Lennon',      'genre': 'rock'},
        {'name': 'Bono',             'genre': 'rock'},
        {'name': 'Garth Brooks',     'genre': 'country'},
        {'name': 'Duke Ellington',   'genre': 'jazz'},
        {'name': 'William Shatner',  'genre': 'spoken word'},
        {'name': 'Madonna',          'genre': 'pop'},
    ]
    return render_to_response('musician_list.html',{'musicians':MUSICIANS})

urls.py

这里开通了django的后台管理的功能,1.0版本与0.96版本不太一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
#from test1.views.hello import current_time
from test1.views import hello
from test1.views import test_form
from test1.views import login
 
urlpatterns = patterns('',
    # Example:
    # (r'^test1/', include('test1.foo.urls')),
    #(r'^index/', include('test1.test.index')),
    (r'^now/$', hello.current_time),
    #(r'^now/plus(\d{1,2})hours/$', hello.hours_ahead),
    #(r'^now/minus(\d{1,2})hours/$', hello.hours_after),
    (r'^now/(plus|minus)(\d{1,2})hours/$', hello.hours_offset),
    (r'^tnow/$', hello.t_current_time),
    (r'^tlnow/$', hello.tl_current_time),
    (r'^rnow/$', hello.render_current_time),
    (r'^rlnow/$', hello.renderl_current_time),
    (r'^list/$', hello.musician_list),
    (r'^forms/$', test_form.search),
    (r'^login/$', login.login),
 
    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
 
    # Uncomment the next line to enable the admin:
    (r'^admin/(.*)', admin.site.root),
)

数据库的简单操作:

这里与0.96似乎有很大的差别,

0.96的版本是class Admin: pass 这样加入admin的管理后台去

而1.0之后的版本则是通过admin.site.register(User) 这个语句是把User表加入到admin的管理后台去

另外也有变化,则需要参考文档,还没有使用那部分的功能

这是models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db import models
from django.contrib import admin
 
# Create your models here.
 
class User(models.Model):
    id = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=150, blank=True)
    password = models.CharField(max_length=150, blank=True)
 
class TUser(models.Model):
    username = models.CharField(max_length=150, blank=True)
    password = models.CharField(max_length=150, blank=True)
 
admin.site.register(User)
admin.site.register(TUser)

应用:test_form.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.db.models import query
from django.db.models import Q
from django.shortcuts import render_to_response
from test1.db.models import TUser
 
def search(request):
    queryStr=request.GET.get('q','')
    #print request.GET.get('q','')
    #查询所有的对象
    #all=TUser.objects.all()
    #查询指定的对象
    #all=TUser.objects.filter(username='test')
    #查询大于test2的对象
    #all=TUser.objects.filter(username__gte='test2')
    #startswith 相当于WHERE username LIKE 'test%'
    #all=TUser.objects.filter(username__startswith='test').filter(password='test')
    #Q对象 |表示or &表示and
    qset=(Q(username='test6')&Q(password='test6'))
    all=TUser.objects.filter(qset)
 
    #if queryStr=='':
    #    all=TUser.objects.all()
    #else:
    #    all=TUser.objects.filter(username=queryStr)
 
    #print all
    #results = User.objects
    #if request.method=='POST':
    #    print 1
    #else:
    #    print 2
    return render_to_response('formtest.html',{'all':all,'queryStr':queryStr})

templates:formtest.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en"> <head>
<title>Search{% if query %} Results{% endif %}</title>
</head> <body>
<h1>Search</h1>
<form action="." method="GET">
<label for="q">Search: </label>
<input type="text" name="q" value="{{ queryStr|escape }}">
<input type="submit" value="Search">
</form>
<ul>
    {% for a in all %}
<li>{{a.username}}-------------{{a.password}}</li>  
{% endfor %}
 
</ul>
 
</body>
</html>

用户登录例子:login.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.http import HttpResponse
from test1.db.models import TUser
from django.shortcuts import render_to_response
 
def login(request):
    username=request.GET.get('username','')
    password=request.GET.get('password','')
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT count(*) FROM db_tuser WHERE username = %s group by id", [username])
    row = cursor.fetchone()
    print row
 
    return testsss(username,password)
   #if request.session.get('username')==username:
   #     return HttpResponse(username+' is login')
   # flag=checkLogin(username,password)
   # if flag==1:
   #     request.session['username']=username
   #     return HttpResponse('login success!')
   # else:
   #     return HttpResponse('login error')
    #return render_to_response('login.html',{'username':username,'info':''})
 
def testsss(username,password):
    flag=checkLogin(username,password)
    if flag==1:
        return HttpResponse('login success!')
    else:
        return HttpResponse('login error')
 
def checkLogin(username,password):
    try:
        m=TUser.objects.get(username=username)
        if password==m.password:
            #print 'login success'
            return 1
        else:
            #print 'password is error'
            return 2
    except:
        #print 'username is error'
        return 3

页面:login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{% extends "base.html" %}
{% block title %}login{% endblock %}  
 
{% block content %}
<form action="." method="GET">
<label for="q">login: </label>
<div>用户名:<input type="text" name="username" value="{{ username|escape }}" /></div>
<div>密码:<input type="password" name="password" value="" /></div>
<div><input type="submit" value="login"></div>
</form>
 
<p>
    {% for a in info   %}
    <div>username:{{a.username|escape}}------------password:{{a.password|escape}}</div>    
    {% endfor %}
</p>
 
{% endblock %}

base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">  
<html lang="en">  
<head>  
    <title>{% block title %}{% endblock %}</title>  
</head>  
<body>  
    <h1>My helpful timestamp site</h1>  
    {% block content %}{% endblock %}  
    {% block footer %}  
    <hr>  
    <p>Thanks for visiting my site.</p>  
    {% endblock %}  
</body>  
</html>

django 框架, 模板在templates中 ,样式和图片在site_media,

templates/index.html

文件内容:

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<link href="/site_media/admin/css/manager.css" rel="stylesheet" type="text/css" media="screen" />
 
<link href="/site_media/admin/css/manager.css" rel="stylesheet" type="text/css" media="screen" />

没有没什么方法可以在templates中的文件只用写 <link href="css/manager.css" rel="stylesheet" type="text/css" media="screen" />

这样美工做完页面后只用拿过来加入数据就可以了,而不用在改样式图片的路径。

在url.py中

1
2
3
4
import os
site_media = os.path.join(
os.path.dirname(__file__),'site_media/admin/css/'
)

然后

1
2
3
urlpatterns = patterns('',
(r'^css/(?P<path>.*)$','django.views.static.serve',
{ 'document_root': site_media }),

就可以了。

Filed under: Django No Comments
22Jul/11

Debian定时任务管理cron设置

Posted by Nick Xu

(最简便每天定时关机办法:1. gedit  /etc/crontab 2.在文件最后添加一行:01 22  * * *  root halt -p #表示每天22:01关机)
任何系统管理员权限内的任务都必须位于 /etc 内,因为它们都是配置文件。如果您有一些需要以管理员身份每天 (daily),每周 (weekly) 或每月(monthly) 运行的定时任务,请将它们放置在 /etc/cron.{daily,weekly,monthly} 中。它们将从 /etc/crontab 中被激活,然后按照文件名的字典顺序依次运行。

另一方面,如果您有某个定时任务需要以某个特定的用户身份运行,或者需要在某个特定时刻或以特定周期运行,您或者可以使用 /etc/crontab,或 /etc/cron.d/whatever,而后者会更好一些。这些特殊的文件可以包含一个额外的域,允许您指定运行该定时任务的用户帐户。

在任何情况下,您只需编辑这些文件,cron 将会自动处理它们。没有必要再运行某个特殊的命令。

有两种方法来让一个命令或者脚本执行:
crontab : 执行一个任务一次或者多次.
at : 只执行一次.

crontab是通过读取一个crontab文件来工作,这是一个普通的文本文件,里面列出了要执行的任务
每行都含有要指定的任务的 命令 参数与选项,以及要执行任务的时间。(cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。)

所有的用户都可以设置他们自己的crontab文件,然而,root可以使用两个文件来控制访问:

/etc/cron.allow:如果这个文件存在,只有列在这里面的用户才可以用crontab.
/etc/cron.deny:如果这个文件存在,列在这个文件里面的用户不能用crontab.

所有的crontab文件都保存在/var/spool/cron/crontabs/目录。然而,因为普通用户是无法读写这个目录的,他们必须用crontab命令来加入计划任务

许多系统管理员工使用3个文件来调度任务:/etc/cron.daily, /etc/cron.weekly, 和 /etc/cron.monthly.就像他们的名字所提示的那样,这些目录含有规则的计划任务,在每天,每周或者每月间隔执行一次

“如何使用crontab文件”

键入 crontab options user 或者 crontab -e

(只有root 才能指定其他用户的 crontab文件)

crontab 命令 (调度)

=======================================================================

1.直接用crontab命令编辑

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除每个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:
crontab -u root -l
再例如,root想删除fred的cron设置:
crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:
crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:

*/1 * * * * ls >> /tmp/ls.txt

这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可 以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)
小? (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6) //0代表星期天

除了数字还有几个个特殊的符号就是* / – ,

* 代表所有的取值范围内的数字
/ 代表每的意思
*/5 表示每5个单位
- 代表从某个数字到某个数字
, 分开几个离散的数字

以下举几个例子说明问题:

每天早上6点
0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了

每两个小时
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo “Have a good dream:)” >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line

1月1日早上4点
0 4 1 1 * command line

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在 这个文 件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

Tagged as: , No Comments
22Jul/11

ssh超时断开的解决方法

Posted by Nick Xu

感谢厚积网的投递
当用SSH Secure Shell连接Linux时,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,每次都重复相同的操作,很是烦人,本文总结了两种解决的方法。

方法1:更改ssh服务器的配置文件/etc/ssh/sshd_config

ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0,不发送。而ClientAliveInterval 60表示每分钟发送一次,然后客户端响应,这样就保持长连接了。这里比较怪的地方是:不是客户端主动发起保持连接的请求(如FTerm, CTerm等),而是需要服务器先主动。

另外,至于ClientAliveCountMax,使用默认值3即可。ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值,就自动断开,正常情况下,客户端不会不响应。

 

ClientAliveCountMax

Sets the number of client alive messages (see below) which may be sent without sshd(8) receiving any messages back from the client. If this threshold is reached while client alive messages are being sent, sshd will disconnect the client, terminating the ses-sion. It is important to note that the use of client alive messages is very different from TCPKeepAlive (below). The client alive messages are sent through the encrypted channel and therefore will not be spoofable. The TCP keepalive option enabled by TCPKeepAlive is spoofable. The client alive mechanism is valuable when the client or server depend on knowing when a connection has become inactive.The default value is 3. If ClientAliveInterval (see below) is set to 15, and ClientAliveCountMax is left at the default, unresponsive SSH clients will be disconnected after approximately 45 seconds. This option applies to protocol version 2 only.

 

ClientAliveInterval

Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent to the client. This option applies to protocol version 2 only.

vim /etc/ssh/sshd_config

找到ClientAliveInterval 参数,如果没有就自己加一行。

ClientAliveInterval 参数的数值是秒,比如你设置为540,就是9分钟.

ClientAliveInterval 540

对于ClientAliveCountMax

指如果发现客户端没有相应,则判断一次超时,这个参数设置允许超时的次数,比如10。

ClientAliveInterval 540

ClientAliveCountMax 10;

则代表允许超时 5400秒 = 90分钟。

方法2:配置客户端

1 linux下的ssh命令

vim /etc/ssh/ssh_config

然后找到里面的ServerAliveInterval 参数,如果没有你同样自己加一个就好了。参数意义相同,都是秒数,比如9分钟:

ServerAliveInterval 540

2 SecureCRT

设置反空闲,如下图所示

securecrt_to

3 Putty

启用putty keepalive

putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为60。

Tagged as: No Comments
21Jul/11

plink的使用方法

Posted by Nick Xu

基本格式

plink 选项 user@host 命令

选项介绍

-ssh 强迫使用ssh协议,其实默认的就是ssh

-P port 连接到指定的端口, 一般默认是22
-l user 用户名, 如果你不愿意使用user@host的格式的花

-pw "FuckGFW" 使用FuckGFW作为password,嘿嘿ie

-D [listen-IP:]listen-port
动态socks端口转发 这个最重要, listen-ip 可以填127.0.0.1也可不填,也可填你的外部IP,比如192.168.0.99

另外两个转发参数

-L [listen-IP:]listen-port:host:port
转发本地端口 到 远程主机地址
-R [listen-IP:]listen-port:host:port
转发远程端口 到 本地地址

-X -x enable / disable X11 forwarding
-A -a enable / disable agent forwarding
-t -T enable / disable pty allocation

-1 -2 force use of particular protocol version
-4 -6 force use of IPv4 or IPv6
-C 使用压缩传输

-i key private key file for authentication

-N don’t start a shell/command (SSH-2 only) 不要开启shell

范例

plink.exe -4 -C -N -i d:\key.ppk -D 127.0.0.1:7080 -l b335925 205.196.216.115

plink -N 205.196.216.115 -l username -pw "FuckGFW" -D 127.0.0.1:7080

很多参数 跟OpenSSH是一样的,不过OpenSSH我也记不住

Tagged as: , No Comments
18Jul/11

搞定Google Syntax for WordPress MU

Posted by Nick Xu

昨天花了半天时间专门处理代码高亮的插件问题,尝试了很多个都以失败告终。一直以为是因为版本兼容的问题。

我使用的是WordPress MU2.9.2版,很多插件都是很早发布的,所以不确定问题在哪。幸好发现了“WordPress与Google Syntax的兼容性问题”,发现的确pre标签的属性被修改了。不过这个只解决一个问题,就是默认的WordPress编辑器的visual和html切换时的问题,在wp-admin/includes/post.php的“initArray”最后面添加了一行代码,

view plaincopy to clipboardprint?
'extended_valid_elements' => "pre[name|class]"
之后的确不会在切换时不会在去掉name属性了。

可是这样代码高亮还是显示不出来,因为保存时还是会将name和class两个属性都去掉。经搜索发现,WordPress MU的确对HTML标签做了过滤操作,具体见“变态的WordPress MU的html过滤”。由于不会PHP,也不想改那么多不懂的地方,于是继续搜索更加可行的解决方案。“怎样在WordPress MU中使用Javascript标签”这篇文章的方法比较简单方便,于是尝试着做了下面的改动:

修改wp-includes文件夹下的kses.php文件,查找到“allowedposttags”,这里定义了所有允许的标签和相应的属性,由于Google Syntax插件只需要对pre标签添加两个属性:name和class(更多的属性自己可以考虑添加),所以我找到在“allowedposttags”里的pre标签(所有标签是按字母顺序排列的,很好找)的定义

view plaincopy to clipboardprint?
'pre' => array(
'style' => array(),
'width' => array())
在里面添加了name和class属性,如下

view plaincopy to clipboardprint?
'pre' => array(
'style' => array(),
'width' => array(),
'name' => array(),
'class' => array()
)
这样保存的时候就不会过滤掉name和class属性了,Google Syntax也可以正常显示了。

Filed under: 其它 No Comments
17Jul/11

debian时间设置

Posted by Nick Xu

在/etc/timezone里面写上中国的时区,Asia/Shanghai,在/etc/default/rcS里面把UTC设成yes,也就是用 utc,这是Debian推荐做法。最后也是最重要的,把/etc/localtime删除,再从/usr/share/zoneinfo/Asia里面拷贝Shanghai这个文件到/etc下,名字还是localtime。这样做完,不需重启,过会就自己生效了。

15Jul/11

Ubuntu 9.04 server用apt安装nginx并配置php(fastcgi)

Posted by Nick Xu

由于Ubuntu 904已经包含了nginx,所以根本不要编译,安装超简单!

修改/etc/apt/sources.list文件内容为国内镜像,然后运行:

apt-get update
apt-get install nginx

即可完成安装

启动nginx:

/etc/init.d/nginx start
然后就可以访问了,http://localhost/ , 一切正常!如果不能访问,先不要继续,看看是什么原因,解决之后再继续。

下面配置php和mysql。

安装php和MySQL:

apt-get install php5-cli php5-cgi mysql-server-5.0 php5-mysql
我们需要/usr/bin/spawn-fcgi这个文件,而它是属于lighttpd这个包里面的,所以我们安装lighttpd然后把它设置为开机不启动:

apt-get install lighttpd #我们只要/usr/bin/spawn-fcgi
rcconf #去掉lighttpd开机自启动
修改nginx的配置文件:/etc/nginx/sites-available/default
修改 server_name 58.30.17.154;
修改index的一行修改为:
index index.php index.html index.htm;

去掉下面部分的注释:

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
重新启动nginx:

/etc/init.d/nginx stop
/etc/init.d/nginx start
启动fastcgi php:

spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi
为了让php-cgi开机自启动:

cd /etc/init.d
cp nginx php-cgi
vim php-cgi
替换nginx为php-cgi
并修改相应部分为:

DAEMON=/usr/bin/spawn-fcgi
DAEMON_OPTS=”-a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi”

stop)
echo -n “Stopping $DESC: ”
pkill -9 php-cgi
echo “$NAME.”
然后运行rcconf设置php-cgi为开机自启动

在/var/www/nginx-default/目录下创建一个文件:

echo ‘< ?phpinfo();?>’ > /var/www/nginx-default/index.php
然后浏览器访问nginx就可以看到一切正常了

15Jul/11

Debian命令行下网络参数设置的方法

Posted by Nick Xu

以eth0为例

1. 以DHCP方式配置网卡

编辑文件/etc/network/interfaces:

sudo vi /etc/network/interfaces

并用下面的行来替换有关eth0的行:

# The primary network interface - use DHCP to find our address

auto eth0

iface eth0 inet dhcp

用下面的命令使网络设置生效:

sudo /etc/init.d/networking restart

当然,也可以在命令行下直接输入下面的命令来获取地址

sudo dhclient eth0

2. 为网卡配置静态IP地址

编辑文件/etc/network/interfaces:

sudo vi /etc/network/interfaces

并用下面的行来替换有关eth0的行:

# The primary network interface

auto eth0

iface eth0 inet static

address 192.168.3.90

gateway 192.168.3.1

netmask 255.255.255.0

network 192.168.3.0

broadcast 192.168.3.255

将上面的ip地址等信息换成你自己就可以了.

用下面的命令使网络设置生效:

sudo /etc/init.d/networking restart

3. 设定第二个IP地址(虚拟IP地址)

编辑文件/etc/network/interfaces:

sudo vi /etc/network/interfaces

在该文件中添加如下的行:

auto eth0:1

iface eth0:1 inet static

address 192.168.1.60

netmask 255.255.255.0

network x.x.x.x

broadcast x.x.x.x

gateway x.x.x.x

根据你的情况填上所有诸如address,netmask,network,broadcast和gateways等信息.

用下面的命令使网络设置生效:

sudo /etc/init.d/networking restart

4. 设置主机名称(hostname)

使用下面的命令来查看当前主机的主机名称:

sudo /bin/hostname

使用下面的命令来设置当前主机的主机名称:

sudo /bin/hostname newname

系统启动时,它会从/etc/hostname来读取主机的名称.

关于设置主机名称的更多信息,请访问这里

5. 配置DNS

首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.

要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.

假设DNS服务器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的内容应为:

search test.com

nameserver 192.168.3.2

更一般地,还有ifconfig和route这两个命令,可用来临时设置IP和网关:
ifconfig -a 显示网络设置
ifconfig eth0 inet down 先关掉eth0
ifconfig eth0 inet up 192.168.1.2 \
netmask 255.255.255.0 broadcast 192.168.1.255 这是一行。设置个IP
route add default gw 192.168.1.1 eth0 设置网关
route del default gw 192.168.1.1 网关错了可以删掉,设完后可以用route来检查
设置DNS,直接写/etc/resolv.conf即可,多写几个没问题,只是不知道会不会用到。下面这两个是Opendns的,还是不错的,尤其是对网通和电信的用户来说。
domain
nameserver 208.67.222.222
nameserver 208.67.220.220
还有主机名:
hostname 显示主机名
hostname 名字 设置主机名
可以直接编辑/etc/hostname

Tagged as: , , No Comments
13Jul/11

debian/ubuntu安装 vsftpd+mysql虚拟用户

Posted by Nick Xu

1,需要的软件包

1),vsftpd

very secure FTP daemon

2),mysql-server,mysql-client

前者是MySQL数据库服务器,用于存储虚拟用户信息,后者提供一个命令行的MySQL Client. 由于我之前配置postfix时,已经安装过了MySQL,所以我不必安装这个包了^_^

3),libpam-mysql

vsftpd是通过PAM验证用户信息的,这个包可以让PAM去读取MySQL完成验证.

2,安装

以root登录Debian,输入以下命令,搞定~

代码:#apt-get install vsftpd,libpam-mysql

3,创建一个必要的本地用户

虽说是虚拟用户,不过,由于虚拟用户的信息存储在MySQL数据库中,所以还是需要一个能够读取MySQL数据库的本地用户.

1),创建本地用户的家目录,此目录也是FTP的家目录

代码:#mkdir /home/ftp

2),创建名为ftpguest的本地用户

代码:#useradd ftpguest -d /home/ftp

3),修改FTP家目录的所有者和组

代码:#chown ftpguest.nogroup /home/ftp

4,配置MySQL数据库

1),创建用于存储虚拟用户信息的数据库ftpvuser

代码:#mysqladmin -u root -p create ftpvuser

2),连接数据库

代码:#mysql -u root -p

3)创建用于存储虚拟用户信息的表users

代码:mysql>use ftpvuser;
mysql>CREATE TABLE users (username varchar(20) NOT NULL,password varchar(40) NOT NULL,PRIMARY KEY (username)) TYPE=MyISAM;

4)让本地用户ftpguest能读取ftpvuser数据库的users表的内容

注:YourPassword用于设定ftpguest访问数据库的密码.

代码:mysql>grant select on ftpvuser.users to ftpguest@localhost identified by 'YourPassword';
mysql>flush privileges;

5),建立虚拟用户

代码:mysql>insert into users (username,password) values ('normal','555555');
mysql>insert into users (username,password) values ('admin','666666');
mysql>insert into users (username,password) values ('webmaster','777777');

6),完成MySQL的配置

代码:mysql>quit;

5,配置vsftpd的PAM验证

1),打开PAM配置文件

代码:#nano /etc/pam.d/vsftpd

2),将以前的内容注释掉,然后添加下面2行内容

注:YourPassword就是刚才在前面设定的ftpguest访问数据库的密码.

代码:auth required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0
account required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0

6,配置vsftpd

1),打开vsftpd的配置文件

代码:#nano /etc/vsftpd.conf注意:一旦修改了/etc/vsftpd.conf文件的内容,必须重启vsftpd才能使新的设置生效,方法是:

代码:#/etc/init.d/vsftpd stop
#/etc/init.d/vsftpd start直接#/etc/init.d/vsftpd restart,好像不起作用?

2),修改vsftpd.conf文件如下

listen=YES

# 关闭匿名FTP登录

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

use_localtime=YES

xferlog_enable=YES

connect_from_port_20=YES

# 禁止用户跳出自己的目录

chroot_local_user=YES

secure_chroot_dir=/var/run/vsftpd/empty

pam_service_name=vsftpd

rsa_cert_file=/etc/ssl/private/vsftpd.pem

# My config to add virtual users support.

guest_enable=YES

guest_username=vuser

local_root=/home/vuser/$USER

user_sub_token=$USER

virtual_use_local_privs=YES

user_config_dir=/etc/vsftpd_user_conf

建立新用户

1. 在accounts表中加入用户。运行SQL

INSERT INTO `accounts` (`username`, `pass`) VALUES ('testuser', 'testpw');

2. sudo mkdir –p /home/vuser/testuser

3. sudo chown vuser:vuser /home/vuser/testuser

Filed under: Linux No Comments
site
site