本地测试jqGrid环境

项目很多都地方都需要使用data grid,我参考了N久,还是jqGrid最为强大。当然不一定强大的就是最好的,看你的口味了,我反正是重口味。这个是 jQuery Grid Plugin的主页。首先下载jquery.jqGrid-3.6.4.zip,和jQuery UI 类似,可以根据所需模块自定义下载,达到文件的最小化,速度最优化,因为我比较菜,我全部选择,免得出问题。jquery.jqGrid-3.6.4.zip文件有283kB左右。是这样一个文件树结构(tree /f命令果然牛逼):

├─css
│      ellipsis-xbl.xml
│      ui.jqgrid.css
│
├─js
│  │  Changes.txt
│  │  install.txt
│  │  jquery-1.3.2.min.js
│  │  jquery.jqGrid.min.js
│  │
│  └─i18n
│          grid.locale-bg.js
│          grid.locale-bg1251.js
│          grid.locale-cat.js
│          grid.locale-cn.js
│          grid.locale-cs.js
│          grid.locale-de.js
│          grid.locale-dk.js
│          grid.locale-el.js
│          grid.locale-en.js
│          grid.locale-fa.js
│          grid.locale-fi.js
│          grid.locale-fr.js
│          grid.locale-he.js
│          grid.locale-is.js
│          grid.locale-it.js
│          grid.locale-ja.js
│          grid.locale-nl.js
│          grid.locale-no.js
│          grid.locale-pl.js
│          grid.locale-pt-br.js
│          grid.locale-pt.js
│          grid.locale-ro.js
│          grid.locale-ru.js
│          grid.locale-sp.js
│          grid.locale-sv.js
│          grid.locale-tr.js
│          grid.locale-ua.js
│
└─src
    │  grid.base.js
    │  grid.celledit.js
    │  grid.common.js
    │  grid.custom.js
    │  grid.formedit.js
    │  grid.import.js
    │  grid.inlinedit.js
    │  grid.jqueryui.js
    │  grid.loader.js
    │  grid.postext.js
    │  grid.setcolumns.js
    │  grid.subgrid.js
    │  grid.tbltogrid.js
    │  grid.treegrid.js
    │  jqDnR.js
    │  jqModal.js
    │  jquery.fmatter.js
    │  jquery.searchFilter.js
    │  JsonXml.js
    │  ui.multiselect.js
    │
    ├─css
    │      ellipsis-xbl.xml
    │      jquery.searchFilter.cs
    │      ui.jqgrid.css
    │      ui.multiselect.css
    │
    └─i18n
            grid.locale-bg.js
            grid.locale-bg1251.js
            grid.locale-cat.js
            grid.locale-cn.js
            grid.locale-cs.js
            grid.locale-de.js
            grid.locale-dk.js
            grid.locale-el.js
            grid.locale-en.js
            grid.locale-fa.js
            grid.locale-fi.js
            grid.locale-fr.js
            grid.locale-he.js
            grid.locale-is.js
            grid.locale-it.js
            grid.locale-ja.js
            grid.locale-nl.js
            grid.locale-no.js
            grid.locale-pl.js
            grid.locale-pt-br.js
            grid.locale-pt.js
            grid.locale-ro.js
            grid.locale-ru.js
            grid.locale-sp.js
            grid.locale-sv.js
            grid.locale-tr.js
            grid.locale-ua.js

src是给用来研究代码的,就需要js目录和css目录就ok了。再下载一个jqgrid_demo36.zip。需要用到demo包里面的example.html、example.php、dbconfig.php、database.sql。将dbconfig.php里面的数据库信息和自己的本地mysql账户相对应,然后新建一个名为griddemo的数据库。将database.sql导入griddemo。接下来到jqueryui.com下载一个主题,版本用1.7.2的,因为jqGrid基于jQuery 1.3.2开发。将jquery-ui-1.7.2.custom-1.zip的css目录下的文件jquery-ui-1.7.2.custom.css和images目录拷贝到example.html同目录下。修改example.html,将:

<link rel="stylesheet" type="text/css" media="screen" href="themes/sand/grid.css" />

改为:

<link rel="stylesheet" type="text/css" media="screen" href="/css/jquery-ui-1.7.2.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/css/ui.jqgrid.css" />

第一个是jquery ui的css,第二个是jqgrid自带的css。

将:

<script src="js/jquery.jqGrid.js" type="text/javascript"></script>

改为:

<script src="/js/i18n/grid.locale-cn.js" type="text/javascript"></script>
<script src="/js/jquery.jqGrid.min.js" type="text/javascript"></script>

一定要在载入jqGrid之前载入locale。

这样jqGrid利用json传数据的例子就弄好了。

本地测试jqGrid环境

用sequence+trigger实现oracle字段自增长

oracle不像mysql,字段有个autoincrement属性,可以实现字段数值的自增长。有人觉得oracle这个都不能实现,还敢称最牛逼的数据库。其实我倒是觉得没有autoincrement属性,倒是体现了oracle的灵活性。此文讲述如果通过序列和触发器来实现一行数据在insert前实现某字段的自增。 首先随便建立一个表,menuId是需要自增的字段

create table menu(
      menuId number(10) not null primary key,
      name varchar2(40) not null,
      id_parent number(10) not null,
      url    varchar2(300) null
);

然后建立一个序列,最小值是minvalue,从1开始,步进为1递增,无循环,无缓存。

关于create sequence的详细用法

create sequence menu_autoinc_seq
       minvalue 1
       start with 1
       increment by 1
       nocycle
       nocache;

然后建立一个触发器,在插入tun_menu表之前触发,选取序列的nextval作为新值。

关于create trigger的详细用法

create or replace trigger menu_autoinc_tg
       before insert on menu for each row
begin
       select menu_autoinc_seq.nextval into :new.id from dual;
end menu_autoinc_tg;

然后测试一下:

insert into menu values('','个人事务',0,'indi.php');
insert into menu values('','公共事务',0,'public.php');
insert into menu values('','信息维护',0,'maintain.php');
insert into menu values('','后台管理',0,'manage.php');

php+oracle 10g乱码问题

最近做毕设,采用php 5.2.x+oracle 10g,php统一采用utf-8字符集,oracle非常菜,在默认安装的情况下字符集是ZHS16GBK,造成php页面输出的数据全部乱码。

google了一下,发现以下方法可行。oracle采用高级安装:

php+oracle 10g乱码问题

进入第9步的时候选定AL32UTF8字符集。本地使用pl/sql developer可能会有乱码,是客户端和服务器端的字符集不一致造成的。修改客户端字符集需要打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1

,将NLS_LANG默认的SIMPLIFIED CHINESE_CHINA.ZHS16GBK 改为 AMERICAN_AMERICA.AL32UTF8或者 SIMPLIFIED CHINESE_CHINA.AL32UTF8

update 2010.4.27

上面的方法比较需要将整个全局的数据库的字符集转移到UTF8,如果其他表空间需要使用其他字符集,那上面的方法就不适用了。除非你新建一个数据库,但是那时比较耗费资源的一种方法。

新方法:

参看php文档里面的oci_connect()函数:

resource oci_connect ( string $username , string $password [, string $db [, string $charset [, int $session_mode ]]] )

将charset参数直接改为你php页面的字符集,比如:

$this->conn = oci_connect($user, $passwd, $db,'utf8');

结果一切正常,这样不过你的数据库用的什么字符集,相当于oracle内部的将字符集转到成$charset所对应的字符集。

oracle表空间操作详解-入门基础

来源
建立表空间

CREATE TABLESPACE data01
DATAFILE  '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE  128k;             #指定区尺寸为128k,如不指定,区尺寸默认为64k

删除表空间

DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;

修改表空间大小

alter database datafile '/path/NADDate05.dbf' resize  100M

移动表至另一表空间

alter table move tablespace room1;

一、建立表空间

CREATE TABLESPACE data01
DATAFILE  '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE  128k;             #指定区尺寸为128k,如不指定,区尺寸默认为64k

二、建立UNDO表空间

CREATE UNDO TABLESPACE UNDOTBS02
DATAFILE  '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M

#注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:

ALTER SYSTEM SET undo_tablespace=UNDOTBS02;

三、建立临时表空间

CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE  '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 50M

四、改变表空间状态
1.使表空间脱机

ALTER TABLESPACE game OFFLINE;

如果是意外删除了数据文件,则必须带有 RECOVER选项

ALTER TABLESPACE game OFFLINE FOR RECOVER;

2.使表空间联机

ALTER TABLESPACE game ONLINE;

3.使数据文件脱机

ALTER DATABASE DATAFILE 3 OFFLINE;

4.使数据文件联机

ALTER DATABASE DATAFILE 3 ONLINE;

5.使表空间只读

ALTER TABLESPACE game READ ONLY;

6.使表空间可读写

ALTER TABLESPACE game READ WRITE;

五、删除表空间

DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;

六、扩展表空间
首先查看表空间的名字和所属文件

select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0)  total_space
from dba_data_files
order by tablespace_name;

1.增加数据文件

 ALTER TABLESPACE game
 ADD DATAFILE  '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;

2.手动增加数据文件尺寸

 ALTER DATABASE DATAFILE  '/oracle/oradata/db/GAME.dbf'
 RESIZE 4000M;

3.设定数据文件自动扩展

 ALTER DATABASE DATAFILE  '/oracle/oradata/db/GAME.dbf'
 AUTOEXTEND ON NEXT 100M
 MAXSIZE  10000M;

4.设定后查看表空间信息

 SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES  USED, C.BYTES FREE,
 (B.BYTES*100)/A.BYTES "%  USED",(C.BYTES*100)/A.BYTES "% FREE"
 FROM SYS.SM$TS_AVAIL  A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
 WHERE  A.TABLESPACE_NAME=B.TABLESPACE_NAME AND  A.TABLESPACE_NAME=C.TABLESPACE_NAME;

5.ORACLE表空间的备份与恢复方法
表空间备份与恢复主要针对于大型数据库中,某个表空间数据变化非常大,增长速度非常快的情况。表空间的备份实现脚本:

run  {
allocate channel d1 type disk;
backup tablespace  "TEST","USERS" format ’d:\backup\tb_%d_%s_%p_%t’;
release channel  d1;
}

恢复时,如果用户是要恢复被删除的表空间中的表或视图,或者是使用者用drop tablespace正常命令删除了表空间,此时控制文件中记录的数据库结构也跟着做了改变,此时只能用不完全恢复,让数据库恢复到以前的一个时间点或 SCN。先恢复控制文件,再恢复表空间。

Shutdown abort;
Startup nomount;
run {
Allocate channel  d1 type disk;
Restore controlfile from  ‘d:\backup\CTL_TEST_0_1_6555’;
Release channel d1 ;
Alter  database open; //要为打开状态
set until time "TO_DATE(’08/08/2007  10:50:00’,’MM/DD/YYYY HH24:MI:SS’)";
sql ’alter tablespace TEST,  USERS offline immediate’;
allocate channel d1 type disk;
restore  tablespace  TEST, USERS;
recover tablespace  TEST, USERS;
release  channel d1;
sql ’alter tablespace TEST, USERS online’;
}

注意:After you perform TSPITR on a tablespace, you cannot use backups of that tablespace
from before the TSPITR was completed and the tablespace put back on line. If you
start using the recovered tablespaces without taking a backup, you are running your
database without a usable backup of those tablespaces. For this example, the users
and tools tablespaces must be backed up, as follows:
RMAN> BACKUP TABLESPACE users, tools;
You can then safely bring the tablespaces online, as follows:
RMAN> SQL “ALTER TABLESPACE users, tools ONLINE”;
Your recovered tablespaces are now ready for use.

HTML转XHTML

我准备做一个OA系统,设计能力比较差,所以找到了一个叫做MyOffice的模板,但是这个模板HTML代码是4.0规范的,为了我系统中XHTML 1.0 Transitional 保持一致,所以找到了一个好站:http://www.it.uc3m.es/jaf/html2xhtml/ 可以将html转换成xhtml,还可以美化代码缩进之类的。可以在线转换,也可以下载一个命令行程序批量转换,提高效率。另外值得一提的是,这个html2xhtml提供了一个HTTP API,调用起来很方便,不过正处于beta阶段。另外还有一个.net 40的库供调用,总之不错,得顶一下。

Windows 7打开.hlp文件

最近下载一本Win 32 Programmer’s Reference,解压是一个hlp文件,打开显示帮助,默认Win 7对hlp不兼容,需要下载兼容性更新包,更新地址
http://support.microsoft.com/kb/917607

在运行 Windows Vista、Windows 7、Windows Server 2008 或 Windows Server 2008 R2 的计算机上,可能无法打开需要使用 Windows 帮助 (WinHlp32.exe) 程序的帮助文件。本文提供有关帮助您修复此问题的下载的信息。
从 Windows Vista 和 Windows Server 2008 开始的 Windows 版本中,Microsoft 停止包含 32 位的帮助文件查看器。为了支持仍依靠旧 .hlp 文件的客户,Microsoft 下载中心提供用于 Windows Vista、Windows 7、Windows Server 2008 和 Windows Server 2008 R2 的 WinHlp32.exe 下载。

下载用于 Windows Vista 的 WinHlp32.exe

要获取用于 Windows Vista 的 WinHlp32.exe 下载,请访问以下 Microsoft 网站:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=6ebcfad9-d3f5-4365-8070-334cd175d4bb (http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=6ebcfad9-d3f5-4365-8070-334cd175d4bb)

下载用于 Windows 7 的 WinHlp32.exe

要获取用于 Windows 7 的 WinHlp32.exe 下载,请访问以下 Microsoft 网站:

下载用于 Windows Server 2008 的 WinHlp32.exe

要获取用于 Windows Server 2008 的 WinHlp32.exe 下载,请访问以下 Microsoft 网站:

下载用于 Windows Server 2008 R2 的 WinHlp32.exe

要获取用于 Windows Server 2008 R2 的 WinHlp32.exe 下载,请访问以下 Microsoft 网站:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=a83698ae-4ecb-4660-b402-2c5659dcb4ef (http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=a83698ae-4ecb-4660-b402-2c5659dcb4ef)
注意:安装下载的 WinHlp32.exe 后,某些宏可能会被禁用,存储在 Intranet 上的 .hlp 文件会被阻止。

16位:c:\windows\winhelp.exe
32位:c:\windows\winhlp32.exe
微软建议程序员编写文档从hlp转向chm,xml,html。
最近我发现和hlp文件有有缘,前几天我同学到我寝室来弄PB,PB 10的帮助文档也是hlp。

PHP的cURL模块批量下载脚本

<?php
/*
    Title:      download resource with regular URLs
    Author:     tunpishuang(http://tunps.com)
    Desc:       这个脚本可以下载url有规律的资源,比如数字递增,字母递增的。
                并且可以定义“循环数”。
    Usage:      php.exe this.php fromValue1  toValue1 fromValue2 toValue2 fromValue3 toValue3 ...
                this.php是这个脚本的名称
                fromValue1是第一个循环的初始值
                toValue1是第二个循环的初始值
                fromValue2以此类推
                toValue2以此类推 一直到fromValueN->toValueN
    Example:    php this.php http://tunps.com/uploads/*//*.jpg 001 206 001 500
    Thx:        jondro哥(http://stackoverflow.com/questions/2627000/how-to-write-a-function-to-output-unconstant-loop)对关键函数loop()的编写。
*/
    function plus($num){
        $len=strlen($num);
        $num++;
        while(strlen($num)<$len)
        {
            $num="0".$num;
        }
        return $num;
    }
    //generate loop
    function loop($a) {
    $from1 = array_shift($a);
    $to1 = array_shift($a);
    $result = array();
    while ($from1 <= $to1) {
    if (sizeof($a) > 0) {
      $rest = loop($a);
      foreach ($rest as $b) {
        $result[] = $from1.'|'.$b;
      }
    } else {
      $result[] = $from1;
    }
    $from1=plus($from1);
    }
    return $result;
    }
    //download resource
    function download($u,$f,$e){
        $ch = curl_init();
        $options=array(
            CURLOPT_URL=>$u,
            CURLOPT_RETURNTRANSFER=>true
        );
        curl_setopt_array($ch,$options);
        $data = curl_exec($ch);
        if(curl_getinfo($ch,CURLINFO_HTTP_CODE)==200){
            $fp=fopen($f.$e,"w");
            echo "downloading:".$u."->".$f.$e."\n";
            fwrite($fp,$data);
            fclose($fp);
        }
        curl_close($ch);
    }
    //main
    if($argc==1){
        print_r("用法:php ".basename(__FILE__)." url from to  from to ...\n");
        print_r("\turl      \t包含通配符*的网址\n");
        print_r("\tfrom \t\turl中通配符的起始数字or字母,按顺序匹配*\n");
        print_r("\tto       \turl中通配符的终止数字or字母,按顺序匹配*\n");
        print_r("\n");
        print_r("例子:\n");
        print_r("\tphp http://tunps.com/*/*.jpg 0 100  5 200 \n");
        print_r("\t\t\t\t         -----  -----\n");
        print_r("\t\t\t\t           ↓     ↓   \n");
        print_r("\t\t\t\t          *    *   \n");
    }else{
        if(($argc-2)%2 != 0){
            echo "argument error";
            exit();
        }else{
            $loopCount=($argc-2)/2;
            while($loopCount > 0){
                if($argv[($loopCount-1)*2+2] >= $argv[($loopCount-1)*2+3]){
                    echo "from cannot larger than to";
                    exit();
                }
                $loopCount--;
            }
        }
        if(!preg_match("/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^\"\"])*$/",$argv[1]) || strpos($argv[1],"*") === false){
            echo "url malformed or lack of char of \"*\" ";
            exit();
        }else{
            $url=$argv[1];
            $ext=substr($url,strrpos($url,'.'),strlen($url)-strrpos($url,'.'));
            $fileName=1;
            $originUrl=$url;
            array_shift($argv);
            array_shift($argv);
            $rangeArr=$argv;
            $numArr=loop($rangeArr);
            foreach($numArr as $n){
                $num=array_reverse(explode('|',$n));
                $i=0;
                while(strpos($url,'*') && $i<count($num)){
                    $lastOccur=strrpos($url,"*");
                    $url=substr_replace($url,$num[$i],$lastOccur,1);
                    $i++;
                }
                download($url,$fileName,$ext);
                $fileName++;
                $url=$originUrl;
            }
        }
    }
    exit();
?>

关于PHP CLI和CGI

因为最近写cli模式下面运行的php脚本,并且脚本使用到了curl,在cmd下面运行这个脚本报错:

D:\project\gal>php gal_gbk.php http://test.com/test.html 1 2
Fatal error: Call to undefined function curl_init() in D:\project\gal\gal_gbk.ph
p on line 40

也就是cul_init这个函数没有定义,改动了一下代码,在web下面运行,一些正常,抓狂,搞了一下午。于是就在高手云集的stackoverflow上发问。给了我灵感。其根本的原因是CLI和Apache Handler和CGI运行的PHP读取的配置文件互相是独立的。
以下就列出php手册列出来的以及本来发现的一些差别:

CLI Apache Handler
Server API => Command Line Interface Server API Apache 2.0 Handler
Loaded Configuration File => (none) Loaded Configuration File D:\phpnow\php-5.2.10-Win32\php-apache2handler.ini
register_argc_argv => On => On register_argc_argv Off Off
html_errors =>Off html_errors =>On
implicit_flush => TRUE implicit_flush => FALSE
max_execution_time => 0 max_execution_time => 30
register_argc_argv => TRUE register_argc_argv => FALSE

我们可以看出CLI模式下Loaded Configuration File 为None,所以可以将apache handler的配置文件复制到c:\windows\php.ini 供cli使用。
也可以用php -c指定php.ini所在路径。