刘新明的博客
文件传送scp/rsync
星期六 28 四月 2012 @ 11:00 上午

 

传送文件

scp Framework.tar.gz  root@174.11.210.67#3100:/data/webroot/

 

传送文件夹

rsync  -av -P 3100 ./images   root@174.11.210.67:/data/webroot/dev.open.t.qq.com/

 

rsync 用法

         rsync [OPTION]… SRC DEST
  rsync [OPTION]… SRC [USER@]HOST:DEST
  rsync [OPTION]… [USER@]HOST:SRC DEST
  rsync [OPTION]… [USER@]HOST::SRC DEST
  rsync [OPTION]… SRC [USER@]HOST::DEST
  rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]
对应于以上六种命令格式,rsync有六种不同的工作模式:

  1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
                  如:rsync -a /data /backup
  2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。
                  如:rsync -avz *.c foo:src
  3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。
                   如:rsync -avz foo:src/bar /data
  4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。
                  如:rsync -av root@172.16.78.192::www /databack
  5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。
                  如:rsync -av /databack root@172.16.78.192::www
         6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
                  如:rsync -v rsync://172.16.78.192/www
scp 用法

      scp [-1245BCpqrv] [-c cipher] [F ssh_config] [-I identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:] file1 […] [[suer@]host2:]file2

SCP  参数

-P port
指定连接远程连接端口。注意这个选项需要写成大写的模式。因为-p已经早保留了次数和模式
-S program
指定一个加密程序。这个程序必须可读所有ssh(1)的选项。
-p 指定修改次数,连接次数,还有对于原文件的模式
-q 把进度参数关掉
-r 递归的复制整个文件夹
-S program
指定一个加密程序。这个程序必须可读所有ssh(1)的选项。
-V 冗余模式。 让 scp 和 ssh(1) 打印他们的排错信息, 这个在排错连接,认证,和配置中非常有用。

SCP 命令诊断
scp 返回0 成功时,不成功时返回值大于0

 

 

 

评论关闭 - Posted in linux,服务器 by  



mysql 导入文件ERROR 13
星期一 23 四月 2012 @ 11:57 上午

导入文件的时候出现这样的问题

ERROR 13 (HY000): Can’t get stat of ’XXXX.xxx’ (Errcode: 13)

 

-h$WDBHOST -P$WDBPORT -u$WDBUSER -p$WDBPASS $WDBNAME  –default-character-set=utf8  –local_infile=1

mysql> load data local infile '/tmp/app_api_usenum.txt' into table statis_app_apisum_tmp;

这样就可以,哈

评论关闭 - Posted in mysql,服务器 by  



不同表 批量插数据 mysql shell脚本
星期五 20 四月 2012 @ 7:48 下午
这是一个shell脚本,在linux环境下跑的,五六百万数据 25秒就跑完了。很快!
主要是解决从A数据库取表,存到B数据库中,而且两表结构不一样。
#!/bin/bash
############################### 分析 API统计月表,获得历史每个接口调用总数###########
#											#
############################### ************************	#########################
#											#
# @author sammyliu 									#
# @email: swinginsky@gmail.com								#
# @date  2012-04-20									#
#											#
#########################################################################################

date
TIMESTART=`awk 'BEGIN {printf("%d\n",systime())}'`

#[配置DB参数]
RDBHOST="test.com"
RDBPORT="3306"
RDBUSER="test"
RDBPASS="testpass"
RDBNAME="testDB"

#[配置DB参数]
WDBHOST="localhost"
WDBPORT="3306"
WDBUSER="opent"
WDBPASS="openapp"
WDBNAME="wb_open_t1"

#[DB连接语句]
ITILDBR="-h$RDBHOST -P$RDBPORT -u$RDBUSER -p$RDBPASS $RDBNAME  --default-character-set=utf8 "
OPENDBW="-h$WDBHOST -P$WDBPORT -u$WDBUSER -p$WDBPASS $WDBNAME  --default-character-set=utf8 "

#[删除历史文件]
rm /home/sammy/shell/db/everyapi_tmp.txt
rm /home/sammy/shell/db/app_everyapi.txt

#[导出四个月的数据]
for((i=1;i<5;i++)); do 

APIMONTHTABLE="t_mbcgi_api_month_20120"$i
GETDATASQL="select  TRIM(sop)  as app_key,sbiz as app_apiname,sum(num) as app_apiall from $APIMONTHTABLE where length(sop)>2 group by sop,sbiz"
mysql $ITILDBR -e "${GETDATASQL}" | awk '{if(match($1,/^[a-zA-Z0-9]+$/)) print $0;}' >> everyapi_tmp.txt 

done 

#[写入临时表]
load_data_infile_apisum_tmp_sql="load data infile '/home/sammy/shell/db/everyapi_tmp.txt' into table statis_app_everyapi_tmp; "
mysql ${OPENDBW} -e "${load_data_infile_apisum_tmp_sql}"

#[分析临时表并写入接口统计表]
GETEVERAPIUSEDSQL="SELECT app_key,app_apiname, SUM(app_apiall) FROM statis_app_everyapi_tmp GROUP BY app_key,app_apiname"
mysql ${OPENDBW} -e "${GETEVERAPIUSEDSQL}" | awk 'NR>1 {print $0}' >> app_everyapi.txt
load_data_infile_apisum_sql="load data infile '/home/sammy/shell/db/app_everyapi.txt' into table statis_app_everyapi; "
mysql ${OPENDBW} -e "${load_data_infile_apisum_sql}"

#[计算脚本运行时间]
TIMEFINISH=`awk 'BEGIN {printf("%d\n",systime())}'`
EXECUTETIME=$[ $TIMEFINISH - $TIMESTART ]
echo "一共花费$EXECUTETIME秒!"
评论关闭 - Posted in mysql,SHELL,服务器 by  



批量更新字段
星期五 20 四月 2012 @ 7:30 下午

工作中通常会遇到要批量更新表里的某个字段。有此数据就更新,没有就新增数据。以前都是苦逼一条一条地处理。傻啊!

其实mysql语句还是很强大的

 

我们先看两个表 aa和bb 表 需求是   b=b+e     情况有两种, a=d ,与a!=d

我们的方案是,a=d就让b=b+e

a!=d, 那就在aa表里插条新数据

表数据如下

mysql> select * from aa;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 1 | 0 |
+---+---+---+
mysql> select * from bb;
+---+---+
| d | e |
+---+---+
| 4 | 4 |
| 2 | 2 |
| 3 | 1 |
| 5 | 5 |
+---+---+

1)两表有相等字段的处理

解决a=d的情况: a=2那条数据,的b值变成4了。

mysql> update aa,bb set b=b+e where a=d;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from aa;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 1 | 1 |
| 2 | 4 | 2 |
| 3 | 2 | 0 |
+---+---+---+
1)两表有不相等字段的
当aa表里a不等于bb.d的值,即a!=d 就让这些数据插到aa表中
我们用到insert int select 语句
mysql> insert into aa(a,b) SELECT d, e FROM bb WHERE d NOT  IN ( SELECT a FROM aa );
Query OK, 2 rows affected, 1 warning (0.00 sec)
mysql> select * from aa;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 1 | 1 |
| 2 | 4 | 2 |
| 3 | 2 | 0 |
| 4 | 4 | 0 |
| 5 | 5 | 0 |
+---+---+---+
这些数据就插进来了,简单吧!

 

 

 

评论关闭 - Posted in mysql by  



vim 技巧
星期四 22 三月 2012 @ 7:31 下午

一、多行开头批量加“#”

方法一

在10 – 20行添加 # 注释

:10,20s/^/#/g

在10 – 20行删除 # 注释

:10,20s/^#//g

方法二

1、ctrl+v使用方向键上下选择范围;

2、shift+i进入编辑模式,添加“#”。随后按esc退出(也可理解为运行批量添加);此时批注已加好

3、删批注:ctrl+v使用方向键上下选择去除批注的范围,按“x”;

 

2、复制本行
yy ,在所在复制行按“P” 即可

全文复制    
:1,$y

全文删除
:1,$d

删除当前下面n行

按”esc” 按20dd 就删除20行

d/text 删除从文本中出现“text”中所指定字样的位置  (非常实用)

d$ 删除到某一行的结尾

d0 删除到某一行的开始位置

shift+v 选择当前行

 

 

评论关闭 - Posted in linux by  



shell 处理数据库
星期四 22 三月 2012 @ 10:58 上午
同一个库,从一张表读取更新到另一张里面去
十几万数据做shell做效率高一些

#!/bin/sh
# author sammyliu
# date  20120322
DBHOST="127.0.0.1"
DBPORT="3306"
DBUSER="root"
DBPASS="openapp"
DBNAME="test"
UPDSQL=''
#GET DATA
OPENDBSQL="-h$DBHOST -P$DBPORT -u$DBUSER -p$DBPASS $DBNAME  --default-character-set=utf8"
tables=`mysql $OPENDBSQL" -e" "SELECT CONCAT_WS(',',id,name)  FROM  test" | awk 'NR>1 {print $0}'`

#BUILD MYSQL SCRIPT
for list in $tables
    do
        id=`echo  $list| awk -F ',' '{print $1}'`
        tname=`echo  $list| awk -F ',' '{print $2}'`
	UPDSQL = $UPDSQL"UPDATE table1 SET  tname =  '$tname' WHERE  id ='$id';"
	done
#echo $UPDSQL
#EXECUTE MYSQL
mysql $OPENDBSQL <<EOFMYSQL
show tables;
SELECT *  FROM  table1;
SELECT * FROM test;
$UPDSQL
EOFMYSQL
评论关闭 - Posted in SHELL by  



Chrome插件开发简单实战教程(转)
星期三 7 三月 2012 @ 4:15 下午

Chrome凭借其简单,稳定,快速的优点迅速风靡全球,占领浏览器市场,直逼IE的市场份额,超越也只是时间问题。初次打开Chrome浏览器,你会发现整个页面只有一个地址栏,一对箭头,刷新按钮和一把扳手,当然还有最重要的空白页面,这就是Chrome的整体构造,可以说是最简单的浏览器了,但是仔细深入你会Chrome的功能远不止这些,通过Chrome的扩展中心你可以安装成千上万的插件来丰富你的浏览器功能,这时你就会发现Chrome的强大之处。

Chrome的扩展中心地址是 https://chrome.google.com/webstore,里面有全球的开发者开发的插件,你只需要选择,然后点击添加到Chrome即可。目前从事Chrome开发的人非常少,我觉得可能是某种网络不稳定因素造成的Google服务不稳定,导致了大家都不愿意开发这片市场,所以在网络上关于Chrome开发的资料少之又少,目前官方的开发文档也都是英文的,阻挡了不少E文小白对Chrome开发的热情。
Chrome官方开发文档地址:http://code.google.com/chrome/extensions/dev/devguide.html 我大致看了一下,对他的结构也有所了解,这里将做一个简单的实战来检测一下我的开发水平。 学艺不精,多多包涵,老鸟路过,新手可以参考下,作为入门教程。

过去大家在添加插件后,图标会出现在地址栏的右边,点击即可快速打开插件,在新版的Chrome中,又多出了一个叫Apps的东西,如下图画红线的部分:

App的开发和扩展大同小异,为了满足大家的成就感快速开发出一个可用的App这里就从App讲解。

一个最简单的APP需要由一个图标和一个名为manifest.json的文件组成。

第一步:

新建一个文件夹,准备一个图标,建议128×128大小的。然后创建一个文件,命名为manifest.json,用记事本打开,复制以下代码:


{
"app": {
"launch": {
"web_url": "http://blog.sina.com.cn/eyeofming"
},
"urls": [ "http://blog.sina.com.cn/eyeofming" ]
},
"description": "Ming's China Blog",
"icons": {
"128": "eye.png"
},
"name": "Eye Of Ming",
"version": "1.0"
}

web_url和url是你要启动的网址,description是App的描述,icons下的128是图标的尺寸,比如说你的图标是16×16的,那么你就填16,建议128×128的大小,然后eye.png就是你的图标文件名。name是App的名字,下面的version是版本号,这个就自定义了,需要注意的是避免使用中文,一定要用utf-8。

第二步:

这一步可以称之为调式,在Chrome中输入chrome://settings/extensions 打开插件页,先勾选开发者模式,这样会出现一个载入插件的选项,如下图:

点击载入插件后,在路径中找到保存文件的文件夹然后打开就行了,如果顺利的打开,就说明你的插件没有任何问题,如果错误的话,他会提示你在哪里错了,然后按照他的提示修改就行了。来看看我的作品,如下图:

是不是很简单,如果你还没学会,不要急多试几次就好了,这里是打包的源码,大家可以自行修改。

第三步:

制作好App后,要想出现在Google的扩展中心你需要提交给Google进行审核,提交地址:https://chrome.google.com/webstore/developer/update 注意要压缩成zip格式后提交,不要用.crx格式。上传后,填写相关信息,然后就是等待审核上线。

相关资源推荐

转自:http://www.chromi.org/archives/13915

图标大全:http://findicons.com/
代码编辑工具:Notepad++ http://notepad-plus-plus.org/

 

 

 

 

 

 

 

 

 

评论关闭 - Posted in chrome by  



mysql 知识点
星期二 21 二月 2012 @ 10:47 上午

一、通配符过滤

通配符过滤是非常强大的功能,但缺点,会对全表扫描、执行速度变慢,不宜过多使用

1、单字符匹配 “_”

where field like ‘_enny’

就会匹配到Jenny,Kenny 这样的字符串

 

2、多字符匹配 “%”

where field like ‘A%’

匹配“A”开头,长度不限的字符

where field like ‘%A’
匹配“A”结尾,长度不限的字符

where field like ‘%A%’

匹配包含有“A” 的字符串

3、集合匹配

where field like [ab]%

匹配第一个字符为‘a’或‘b’、长度不限的字符串。如abrile、apple、blue、abc
where field like [^ab]%
匹配第一个字符不是‘a’或‘b’、长度不限的字符串  如:sammy、cache

 

二、外键

外键是非常重要的概念,关系数据库的“关系”二字体现

建立外键,格式:FOREIGN KEY ‘外键字段名称’ PEFERENCES 目标表名(被关联的字段名称)

删除表注册事项

如果表创建了外键关联,那么在删除被引用数据表的时候,必须首先删除引用表,然后才能删除被引用表,否则会导致关联关系破坏,删除失败!

如A表创建了指向B表的外键关联关系,那么先删除A表,再删除B表。

 

三、低效的where 1=1

不适合大表查询

1=1 看似解决了问题,但会造成非常大的性能损失,系统无法使用索引等查询优化策略,被迫全表扫描,查询速度变慢,

 

四 实用函数

1、大小字LCASE UPPER

2、去空格 TRIM|LTRLM|RTRLM

3、取字符串 substring |LEFT|RIGHT

4、字符替换 REPALCE

5、发音匹配 SOUNDEX

6、特有函数 if、conv (数字进制转换) 、

6.1 填充函数 LPAD|RPAD 设定长度,不足补,多裁剪

6.2 重复字符串 REPEAT

6.3 字符串颠倒 REVERSE

6.4 字符串集合操作 ELT(N,str1,str2,str3,str4….strN) 若N=1,返回值str1 若N=3,返回 str3

五、约束

1、非空约束

2、惟一约束

3、CHECK约束

如年龄不可能小于0, 月份不可能大于12,可以在CHECK条件进行判断是否写入

CREATE TABLE  T_table {

age int check(age>0),

month int check(month<12)

}

4、主键约束

外键关联的基础条件,是UNIQUE约束与非空约束的集合

5、外键约束

评论关闭 - Posted in mysql by  



编辑器ckeditor+ckfinder 配置上传图片
星期三 11 一月 2012 @ 5:55 下午

 

ckeditor  是fckeditor是重构版本,fckeditor已不更新了 fckeditor.com 也直接 跑到ckeditor.com 域名下了

ckfinder 是ckeditor  上传管理插件

首先下载

http://download.cksource.com/CKEditor/CKEditor/CKEditor%203.6.2/ckeditor_3.6.2.zip

http://download.cksource.com/CKFinder/CKFinder%20for%20PHP/2.1.1/ckfinder_php_2.1.1.zip

 

简单说一下如何配置吧

一、ckeditor 配置(不能上传图片)

 

看代码就可以了

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>发表新文章</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="/js/plugs/ckeditor/ckeditor.js"></script>
</head>
<body>
<div>
<textarea  cols="80" id="editor1" name="editor1" rows="10">test</textarea>
<script type="text/javascript">
var editor = CKEDITOR.replace( 'editor1' );
</script>
</div>
</body>
</html>

二 ckeditor+ckfinder 配置上传图片

  1. 静态页面
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>发表新文章</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="/js/plugs/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/js/plugs/ckfinder/ckfinder.js"></script>
</head>
<body>
<div>
<textarea cols="80" id="editor1" name="editor1" rows="10">test</textarea>
<script type="text/javascript">
var editor = CKEDITOR.replace( 'editor1' );
CKFinder.setupCKEditor(editor,'/js/plugs/ckfinder/');
</script>
</div>
</body>
</html>
2.修改ckeditor/config.js 文件
CKEDITOR.editorConfig = function( config )
{
	// Define changes to default configuration here. For example:
	// config.language = 'fr';
	// config.uiColor = '#AADC6E';
	config.filebrowserBrowseUrl = '/js/plugs/ckfinder/ckfinder.html';
	config.filebrowserImageBrowseUrl = '/js/plugs/ckfinder/ckfinder.html?Type=Images';
	config.filebrowserFlashBrowseUrl = '/js/plugs/ckfinder/ckfinder.html?Type=Flash';
	config.filebrowserUploadUrl = '/js/plugs/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files';
	config.filebrowserImageUploadUrl = '/js/plugs/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images';
	config.filebrowserFlashUploadUrl = '/js/plugs/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash';
};
就可以了。

3.修改上传的图片名称自建目录(可以忽略这步)
找到\js\plugs\ckfinder\core\connector\php\php5\CommandHandler\FileUpload.php 文件
第136行 $sServerDir = $this->_currentFolder->getServerPath()
在后面加上
/**
         * 以年月为目录
         * Enter description here ...
         * @author sammyliu
         */
        if (in_array($sExtension, array('png','gif','jpg','bmp'))) {
        	$dateFolder = '/'.date('Ym').'/';
	        $sServerDir = $sServerDir.$dateFolder;
	        if (!file_exists($sServerDir)) mkdir($sServerDir, 0777);
        	list($xx,$imageTimeName) =  explode('.', microtime(true));
        	$sFileName = date('YmdHis').$imageTimeName.'.'.$sExtension;
	        $oRegistry->set("FileUpload_fileName", $sFileName); //修改后的名字上传成功后返回给JS调用
	        $oRegistry->set("FileUpload_url", $this->_currentFolder->getUrl().$dateFolder);//修改后的路径上传成功后返回给JS调用
        }

 这样图片上传后就可以以年月为目录,时间为文件名了

 

 

 

 

 

 

 

 

评论关闭 - Posted in PHP知识,前端JS by  



CodeIgniter 地址重写
星期一 9 一月 2012 @ 11:41 下午

http://www.445s.com/index.php/home/test

如果要去掉index.php

一、修改

config/config.php 里面的$config['index_page'] = ”;

二、http.conf

<VirtualHost *:80>
    ServerName dev.445s.com
    ErrorLog "logs/445s.com-error.log"
    .....
    <Directory "D:/www/445s.com/">
	    Options FollowSymLinks
	    AllowOverride All
	    #Order deny,allow
	    #Deny from all
   </Directory>
</VirtualHost>
三、在根目录
新建.htaccess 文件
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]


CI路由使用技巧一二
一、获得控制器地址
$this->load->helper('url'); //必需加载才能使用下面的函数
echo site_url("news/local/123"); // http://example.com/index.php/news/local/123
$segments = array('news', 'local', '123');

echo site_url($segments); // http://example.com/index.php/news/local/123
anchor('news/local/123', 'My News', 'title="News title"');
//<a href="http://example.com/index.php/news/local/123" title="News title">My News</a>
 redirect('/login/form/', 'refresh');
redirect('/article/13', 'location', 301);
评论关闭 - Posted in CodeIgniter,PHP知识 by  



Older Posts »