English Sentence Loading...
英语句子加载中...
预览模式: 普通 | 列表

SyntaxHighlighter 的安装

今天突然在网上看到了syntaxhighlighter, 于是下载了个试试看。
在<head>里加入:
 <link type="text/css" rel="stylesheet" href="/SyntaxHighlighter/styles/shCore.css"/> 
 <link type="text/css" rel="stylesheet" href="/SyntaxHighlighter/styles/shThemeDefault.css"/>

 <script src="/SyntaxHighlighter/scripts/shCore.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushBash.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushCpp.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushCSharp.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushCss.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushDelphi.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushDiff.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushGroovy.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushJava.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushJScript.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushPerl.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushPhp.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushPlain.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushPython.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushRuby.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushScala.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushSql.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushVb.js" type="text/javascript"></script>
 <script src="/SyntaxHighlighter/scripts/shBrushXml.js" type="text/javascript"></script>
 <script type="text/javascript">
 	SyntaxHighlighter.config.clipboardSwf = '/SyntaxHighlighter/scripts/clipboard.swf';
 	SyntaxHighlighter.all();
 </script>

下面我们看一下php代码:
 <pre class="brush:php">
 <?php
 	echo "SyntaxHighlighter testing...";
 	echo date("Y-m-d H:i:s");
 ?>
 </pre> 

可支持的代码类型有:bash, shell,c-sharp, csharp,cpp, c,css,delphi, pas, pascal,diff, patch,groovy,js, jscript, javascript,java,perl, pl,php,plain, text,py, python,rails, ror, ruby,scala,sql,vb, vbnet,xml, xhtml, xslt, html, xhtml

Joomla 1.6的权限控制分析

近段时间在看joomla1.6的权限控制,总想去网上找一些说明,但大部分都在说joomla1.6对此做了很大的改进,以及一些权限的操作,而真正面对PHP开发的说明却没有找到,没办法只能自己研究一下了,可能不是太难,不过顺着joomla的代码捋真是一件让人头疼的事。
joomla1.6是权限到组的,而没有做到权限到每个用户。首先用#__usergroups来保存组的信息,这里的lft,rgt估计是做权限覆盖用的,没细研究,不敢乱发言。如果当前用户的lft和rgt分别的3和7,那么我们就可以用lft<3 and rgt>7来取出当前用户的所有父结点(可能名称不是很准确)。
接下来我们来看#__assets表,这个表存储了真正的权限,components和contents以及一些需要权限控制的模块和数据库的每条记录都可以在这里进行权限控制,这个表的lft和rgt也和#__usergroups表类似,rules字段存储的是访问控制的信息,它是一个json字符串,我们可以把它变成数组,这样可以更直观一些。下面我们用com_content来举例,就能一目了然了。
我们首先把#__assets里面`name`='com_content'的rules拿出来,用json_decode解析一下,数组如下:

  1. stdClass Object
  2. (
  3.     [core.admin] => stdClass Object
  4.         (
  5.             [7] => 1
  6.         )
  7.  
  8.     [core.manage] => stdClass Object
  9.         (
  10.             [6] => 1
  11.         )
  12.  
  13.     [core.create] => stdClass Object
  14.         (
  15.             [10] => 0
  16.             [3] => 1
  17.             [5] => 1
  18.         )
  19.  
  20.     [core.delete] => Array
  21.         (
  22.         )
  23.  
  24.     [core.edit] => stdClass Object
  25.         (
  26.             [4] => 1
  27.         )
  28.  
  29.     [core.edit.state] => stdClass Object
  30.         (
  31.             [5] => 1
  32.         )
  33.  
  34. )

上边对象里每个二级对象的属性是组的id值。
我们再点开Article Manager的Options->Permissions看看:

attachments/201002/7342714697.gif

对比一下,发现结果了么?呵呵^_^
当然我们还可以把某篇文章的权限改一下,再打印出这些信息看看,也是类似的。

个人觉得这样有一个缺点,就是对于#__usergroups表,每更改一次用户,都要把所有的记录都修改一遍,因为要重新分配lft和rgt。#__assets应该也是这样的,所以如果数据量特别大的话,要更改某一条记录,就不免有些浪费数据库,有些牵一发而动全身的感觉,有些影响效率哦~~

查看图例: http://www.eduicc.com/read-9.html
标签: Joomla,php

php生成动态验证码图片

无意中发现了个php生成动态的验证码图片,发上来共享一下
下载文件php生成动态验证码图片.zip (22.9 KB ,下载:21次)
标签: php

shell 之 awk

调用awk的方式有三种,第一种是命令行方式:
awk [-F field-separator] 'commands' input-file(s)
-F 指定域分隔符,可选,默认为空格。如:
awk -F : '{print $1" "$4}' /etc/passwd
第二种方法是将所有的awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,通过键入脚本来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
-f 选项指明在文件awk-script-file中的awk脚本,input-file(s)是使用awk进行浏览的文件名。

$ tail -f apache2/logs/access_log | awk '{print $1" "$4" "$7" "$9}'

#打印报告头/信息尾
$ awk 'BEGIN {print "Name Belt ---------"}{print $1" "$4}' grade.txt
$ awk '{print $1" "$4} END {print "End"}' grade.txt


初次awk时,可能会经常出现错误,在碰到错误时,可以按以下方式查找:
!确保整个awk命令用单引号括起来
!确保命令内所有引号成对出现
!确保用花括号括起动作语句,用圆括号括起条件语句
!确保文件路径正确

如果没有输入文件,awk将等待键盘输入,如:
$ awk 'BEGIN {print "Name Belt -------"}{print$1" "$4}'

Name    Belt
----------
>


BEGIN部分打印了文件头,但awk最乡里停止操作并等待,并没有返回shell提示符。因为没有输入文件,awk假定下面将会给出。这时可以按顺序输入文件,完成后敲<Ctrl-D>。

$ awk '{if($1~/test/) print $0}' grade.txt
这里的~的意思是要匹配正则表达式,!~反之。

$ awk '$3=="test" {print $0}' grade.txt

同时awk有许多内置变量设置环境信息。这些变量可以被改变。下面是一些常用的内置变量。
ARGC      命令行参数个数
ARGV      命令行参数排列
EVVIRON   支持队列中系统环境变量的使用
FILENAME  awk浏览的文件名
FNR       浏览文件的记录数
FS        设置输入域分隔符,等价于命令行-F选项
NF        浏览记录的域个数
NR        已读的记录数
OFS       输出域分隔符
ORS       输出记录分隔符
RS        控制记录分隔符
有点抽象,下面简单解释一下,然后我们以实例来说明
ARGC支持命令行中传入awk脚本的参数个数。ARGV是ARGC的参数排列数组,其中每一元素表示为ARGV[n],n为期望访问的命令行参数。
ENVIRON支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如EVNIRON["EDITOR"]="Vi"
FILENAME支持awk脚本实际操作的输入文件。因为awk可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。
FNR支持awk目前操作的记录数。其变量值小于等于NR。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。
FS用来在awk中设置域分隔符,如:FS=","。
NF支持记录域个数,在记录被读之后再设置。
OFS允许指定输出域分隔符,缺省为空格。如:OFS="#"。
ORS为输出记录分隔符,缺省为新行( )。
RS是记录分隔符,缺省为新行( )。

#要快速查看记录个数,应使用NR。如导出一个数据库后,想快速浏览记录个数:
$ awk 'END {print NR}' grade.txt

#下面将打印每条记录有多少个域,已读行数,并打印文件名
$ awk '{print NF,NR,$0} END {print FILENAME}' grade

#当然也可以和正则一起使用
$ awk '{if(NR>2 && $4~/test/) print $0}' grade.txt

#NF的一个强大功能是将变量$PWD的返回值传入awk并显示其目录。这里需要指定域分隔符/。
$ pwd
/home/liubing/awketc
$ echo $PWD | awk -F / '{print $NF}'
awketc

#在awk中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素。
$ awk '{name=$1;belts=$4;if(belts~/test/) print name}' grade.txt
$ awk 'BEGIN {BASELINE="27"}{if($6<BASELINE)print $0}' grade.txt
$ awk '{if($1=="Monday") $6-=1;print $1,$6,$7}' grade.txt
$ awk '{if($1=="Monday") $1="Today"; print $0}' grade.txt
$ awk '{if($1=="Monday") day=$1;print day;}' grade.txt

#计算当前目录下所有文件大小,不包括目录及子目录文件
$ ls -l | awk '{if($1!~/^d/) print $9" "$5} {tot+=$5} END {print "Total:"tot}'


下面我们来写一个awk程序。命名为awketc.awk
!/bin/awk -f
#print a header first
BEGIN{
print "Student    Date    Member No.    Grade    Points"
print "===================================="
}
#let's add the scores of points
(tot+=$5)

#finished processing now let's print the record
End {
print "Total points :" tot
print "Average points :" tot/NR
}

$ chmod u+x awketc.awk
$ awketc.awk grade.txt


我们也可以向awk程序传值,如下例:
#!/bin/awk -f
NF!=MAX {print "line "NR" doesn't have "MAX" fields"}

$ fieldchk.awk MAX=7 FS=":" /etc/passwd

#awk同时也支持数组操作
$ awk 'BEGIN {print split("123#45#678",myarray,"#")}'


下面写一个具体的小实例,数据如下:
$ cat grade.txt
Yellow#Junior
Orange#Senior
Yellow#Junior
Purple#Junior
Brown-2#Junior
White#Senior
Orange#Senior
Red#Junior
Brown-2#Senior
Yellow#Senior
Red#Junior
Blue#Senior
Green#Senior
Purple#Junior
White#Junior

脚本的功能是读文件并输出以下信息
1)Yellow,Orange和Red的级别的人各是多少
2)有多少未成年人和成年人

我设计的脚本如下:
#!/usr/bin/awk -f
{
split($0,info,"#")
for(i in ary) {result[info[i]]+=1;}
}

END {
for(i in result) {print "result["i"]="result[i]}
}
#运行如下:
$ ./awketc.awk grade.txt
result[Orange]=2
result[Blue]=1
result[Green]=1
result[Brown-2]=2
result[Junior]=8
result[Senior]=7
result[White]=2
result[Purple]=2
result[Red]=2


查看示例代码如下:
!/bin/awk -f
BEGIN{
    FS="#"
    belt["Yellow"]
    belt["Orange"]
    belt["Red"]
    Student["Junior"]
    Student["Senior"]
}
{
    for(color in belt) if($1==color) belt[color]++;
    for(level in student) if($2==level) student[level]++;
}
END{
#output ...
}


哎呀,不少,睡觉了,这两天感冒,难受~~
标签: shell awk linux

shell 之 find 使用总结

以前写过一段时间的Linux命令学习笔记,但是后来没有跟上了,现在平时也在用Linux,但是总感觉操作不能得心应手,所以找了个手册,学习一下shell。
find 命令是一个文件查找命令,它可以遍历任何目录下的文件,只要你有权限。在终端输入
find --help
可以看到它的用法。它的一般形式为: find path -options [-print -exec -ok]
其中:
        path        find命令查找的目录路径,既可以是相对路径,也可以是绝对路径。
        -print       find命令将查找的结果输出到标准输出。
        -exec       find命令对查找的结果执行此参数的shell命令。形式为 command {} ;注意{}和;之间的空格
        -ok-exec的作用相同,只是以一种更为安全的模式来执行命令,在执行以前会给出提示。

        下面是一些options选项:
        -name        按照文件名查找文件
        -perm        按照文件权限查找文件
        -depth        查找时先查找当前目录下的文件,再在子目录中查找。
        -prune        使用此选项可以使find忽略某个目录,但如果同时用了-depth选项,此选项将被忽略。
        -user         按文件属主查找文件。
        -nouser     查找无效属主的文件,即该文件的属主不在/etc/passwd中。
        -group/-nogroup        与上类似
        -newer file1 ! -newer file2        查找更改时间比文件file1早但比文件file2旧的文件。
        -type        查找某一类型的文件,如:
                b - 块设备文件
                d - 目录
                c - 字符设备文件
                p - 管道文件
                l - 符号链接文件
                f - 普通文件
        -size n[c]        查找文件长度为n块的文件,带c表示以字节计。
        -fstype        查找位于某一文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到。
        -mount        在查找文件时不跨越文件系统mount点。
        -follow        跟踪符号链接文件。
        
 举例:
find ~ -name "*.txt
find . -perm 755

#忽略/home/user目录查找
find / -name "/home/user" -prune -o
        
#查找更改时间在5日以内的文件
find / -mtime -5     
   
#查找更改时间在3天以前的文件
find / -mtime +3

#查找更改时间在两个小时以内的文件
touch -t 201002022000 dstamp
find . ! -newer dstamp

#查看文件大于1M的文件
find . -size +1000000c
find . -type f -exec ls -l {} ;

 #注意使用以下命令一定要注意
find . -type f -exec rm {} ;

 在使用find命令的-exec选项时,find会将所有的结果一起抛给exec执行,有可能导致长度受限而发出的错误。此时就是xargs的用武之地了。find会把一部分结果传给xargs而不是全部,如:
find . | xargs chmod 0755

标签: shell find linux