传送文件
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 用法
SCP 参数
-P port
指定连接远程连接端口。注意这个选项需要写成大写的模式。因为-p已经早保留了次数和模式
-S program
指定一个加密程序。这个程序必须可读所有ssh(1)的选项。
-p 指定修改次数,连接次数,还有对于原文件的模式
-q 把进度参数关掉
-r 递归的复制整个文件夹
-S program
指定一个加密程序。这个程序必须可读所有ssh(1)的选项。
-V 冗余模式。 让 scp 和 ssh(1) 打印他们的排错信息, 这个在排错连接,认证,和配置中非常有用。
SCP 命令诊断
scp 返回0 成功时,不成功时返回值大于0
导入文件的时候出现这样的问题
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;
这样就可以,哈
这是一个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秒!"
工作中通常会遇到要批量更新表里的某个字段。有此数据就更新,没有就新增数据。以前都是苦逼一条一条地处理。傻啊!
其实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 | +---+---+---+
这些数据就插进来了,简单吧!
一、多行开头批量加“#”
方法一
在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 选择当前行
同一个库,从一张表读取更新到另一张里面去
十几万数据做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
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/
一、通配符过滤
通配符过滤是非常强大的功能,但缺点,会对全表扫描、执行速度变慢,不宜过多使用
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、外键约束
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 配置上传图片
- 静态页面
<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>
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调用
}
这样图片上传后就可以以年月为目录,时间为文件名了
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);




