linux初学者简明指导手册

linux是什么

如何学习

选择发行版

安装,虚拟机环境,硬盘、光盘、U盘

目录结构,挂载

认识终端命令行,基本命令:cd, ls, mkdir, cat, less

yum

三板斧:yum update, yum install, yum erase

yum进阶:yum provides, yum list, yum grouplist(groupinstall)

vim生存技能:模式,移动光标,保存搜索

bash进阶:多任务,jobs, &, bg, fg, kill

 

极简单/简陋的wordpress插件:网站访客追踪记录 v0.0.2

这是对旧文中提到的wordpress访客记录的一次升级版,照样很简陋,算作给自己玩的吧;谁需要的话,也可以拿去玩。

源码

<?php
/*
Plugin Name: fs trace
Plugin URI: http://blog.path8.net/
Description: This plugin will trace all visitor's visit action.
Version: 0.0.2
Author: fengyqf
Author URI: http://blog.path8.net/
*/

/*  
    Copyright 2008  fengyqf  (email : fengyqf@gmail.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

function fstrace_by_fengyqf(){
  global $wpdb;

  $url=mysql_escape_string(substr($_SERVER["REQUEST_URI"],0,200));
  $referer=mysql_escape_string(substr($_SERVER["HTTP_REFERER"],0,200));
  $cookie=mysql_escape_string(substr($_SERVER["HTTP_COOKIE"],0,250));
  $client=mysql_escape_string(substr($_SERVER["HTTP_USER_AGENT"],0,200));
  if(getenv('HTTP_CLIENT_IP')) {
    $ip = getenv('HTTP_CLIENT_IP');
  } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
    $ip = getenv('HTTP_X_FORWARDED_FOR');
  } elseif(getenv('REMOTE_ADDR')) {
    $ip = getenv('REMOTE_ADDR');
  } else {
    $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
  } 
  $ip=mysql_escape_string(substr($ip,0,16));
  $sql="insert into `log`.`wp_trace_{$wpdb->prefix}`(`referer`,`url`,`unixtime`,`ip`,`client`,`cookie`) 
          values('{$referer}','{$url}',".time().",'{$ip}','{$client}','{$cookie}')";
  $wpdb->query($sql);
  if($wpdb->last_error){
    echo "<script type=\"text/javascript\">alert('Something Wrong! get messages at page bottom. | 出错了,到页底查看详细');</script><h1>fs trace message</h1><p>You Need to Create a table for <strong>fs trace</strong>, to log your visitor active. this table was in database <i>log</i>, you can change the wp-plugin <strong>fs trace</strong> file, in wp pannel - plugins - edit - fs trace, find the line \"  \$sql=\"insert into `log`.`wp_trace_{$wpdb->prefix}`... \", and change it to <pre>\$sql=\"insert into `wp_trace_{$wpdb->prefix}`...</pre> (yes, delete <i>`log`.</i>),and sava it </p>
<p>您需要创建一个表,用于 <strong>fs trace</strong>存储wordpress的将追踪记录. 该表默认位于数据库 log 中。如果您不方便创建一个名为log的数据库,可以将该表放在当前数据库中,只是要修改一下<strong>fs trace</strong>源码了,到wordpress仪表盘 - 插件 - 编辑 - fs trace, 找到这样一行  \"  \$sql=\"insert into `log`.`wp_trace_{$wpdb->prefix}`... \", 改成 <pre>\"insert into `wp_trace_{$wpdb->prefix}`...</pre> (就是删除 <i>`log`.</i>),保存。 </p>
<p>create the table as below/建表语句如下</p>
<pre>use `log`; 
CREATE TABLE `wp_trace_{$wpdb->prefix}` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `referer` varchar(200) NOT NULL DEFAULT '',
  `url` varchar(200) NOT NULL DEFAULT '',
  `unixtime` int(10) unsigned NOT NULL DEFAULT '0',
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ip` varchar(16) NOT NULL DEFAULT '',
  `client` varchar(200) NOT NULL DEFAULT '',
  `cookie` varchar(250) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;</pre> <p>grant the mysql user INSERT privileges at least;In fact, INSERT is enough. </p> <p>为 mysql 用户赋权限,至少需要对该表的INSERT权限;事实上只需要insert权限即可. </p> <p> Alert by the plugin <strong>fs trace</strong> </p>";
//    var_dump($wpdb);
  }
}
add_action('wp_footer','fstrace_by_fengyqf');
?>

下载源码

使用说明

wordpress后台,通过上传zip文件方式上传该插件,(或解压后,连目录上传到wordpress下 wp-content/plugins/ 目录),启用插件,然后到打开前台任意页面,照错误提示操作。消息提示有中英两种语言。提示文字可能因为您的模板关系而排版错乱,看起来有些费力。

本插件不会自己创建数据表,需要您按消息提示手工创建。

本表默认在一个名为log的数据库里,因为追踪表通常会比较大,可以减少wordpress主数据库体积,主要是方便备份。单独。如果不方便创建这个数据库(如在虚拟主机上,主机商通常只给一个数据库),可以修改本插件源码,上述错误消息里也有提示。

microsoft sql server 2008数据库恢复到2005(版本降级)

实例:一个mssql 2008的数据库备份,要还原到2005上,本来以为备份时把数据库兼容级别为2005或2000、再备份,就可以还原到2005上,但事实上不行。

通过google找到了一个办法,有点麻烦,但还是可以比较完美还原的。

高版本上导出兼容在低版本上的创建数据库结构的的sql脚本,拿到低版本上执行,创建数据库及表结构,然后使用导入数据功能,从高版本上导入到低版本上。导入时,要对每个表勾选“启用标识插入”。

具体来说:

mssql manger studio 打开"对象资源管理器"(没有的话按F8), 连接到待备份的数据库,在待备份的数据库上点右键 - 任务 -生成脚本

在"脚本向导"的"选择数据库"中, 勾选"为所选数据库中的所有对象编写脚本"

下一步的"设置脚本选项"中, 找到"为服务器版本编写脚本"项, 选择合适的低版本("SQL Server 2005"或2000 )(这步很重要!!)

mssql_export_as_script mssql_export_as_script_adv

继续完成向导过程,最后把脚本保存到一个 .sql 脚本文件

拿这个sql脚本文件到目标数据库(低版本mssql)上,执行。

然后使用mssql的导入导出功能,勾选需要的表(通常是“全选”),然后点选所有的表,点“编辑映射”,启用标识插入。然后继续即可。

mssql_export_as_script_mapping

php函数mult_iconv:转换任意维数组的字符集编码(扩展iconv函数功能)

php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。

注意:不转对象。

function mult_iconv($in_charset,$out_charset,$data)
{
    if(substr($out_charset,-8)=='//IGNORE'){
        $out_charset=substr($out_charset,0,-8);
    }
    if(is_array($data)){
        foreach($data as $key => $value){
            if(is_array($value)){
                $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                $rtn[$key]=mult_iconv($in_charset,$out_charset,$value);
            }elseif(is_string($key) || is_string($value)){
                if(is_string($key)){
                    $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                }
                if(is_string($value)){
                    $value=iconv($in_charset,$out_charset.'//IGNORE',$value);
                }
                $rtn[$key]=$value;
            }else{
                $rtn[$key]=$value;
            }
        }
    }elseif(is_string($data)){
        $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data);
    }else{
        $rtn=$data;
    }
    return $rtn;
}

下载程序文件(含示例)

调用示例:

$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');

一个复杂一点的测试示例(不转对象)

// ******* 一个复杂一点的测试示例 ********************
class MyClass
{
    public $v1='不转对象,恭喜发财';
    public $v2='skipped object';
    public function f()
    {
        return true;
    }
}
$obj=new MyClass();

$foo=array('abcd','随便写点文字'
    ,array('中文下标'=> 789,'天地玄黄'
        =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象'
                    ,array('更深的数组'=>'照样可以转换')
                )
    )
    ,'恭喜发财,不转对象' => $obj
    ,'如需转对象'=>'Do It Yourself!'
    ,'作者很懒'=>'用不到就不写了'
    );
$bar=mult_iconv('gbk','utf-8//IGNORE',$foo);
var_dump($bar);

php+MSSQL的坑:(n)varchar型字段被截断

很自虐的搭配php+MSSQL,太多的坑,就不说text型被截断了。

受限于现有的asp+mssql应用,新增的部分功能使用php开发。对一个表的读写,后台使用asp,读写都很正常。前台一个调用是php写的,但就是遇到一个诡异的问题,要对数据做一个很复杂的解析处理,结果是数据丢失一部分。一层一层的输出,最后才发现是从数据库读出来了数据就不完整,这可奇怪了。又不是text型的数据,加了ini_set()修正text型默认长度限制,也不行。

但被截断长度很奇怪,恰恰是254个字节,似乎正好是较老的mssql里varchar()的默认最大长度;而该字段的实际是varchar(1000);

难道是字段类型问题?

于是修改该字段为text型,再执行,全好了,没有一点异常。

看来php+mssql实在是个自虐的搭配,不知道还有多少坑....

不过限于老的程序架构,也是个没办法的,人总是要吃饭的....

[另记: 盘点php+mssql下的坑]

这些坑还是有解决方案的,先留着,以后补充

1 text/ntext型字段长度被截断

2 php下mssql 库不支持ntext类型的数据

3 “varchar(n) 其中n>254 ”类型数据被截断

4 php5.3以后的win32 官方二进制版不支持mssql库