Submitted by admin on 2011, September 15, 4:49 PM
本文和大家分享Windows服务器网站文件同步备份解决方案,来自博客园dudu的文章。对于一个网站来说,用户上传文件的同步备份是必需要解决的问题。对于有着巨量上传文件的大型网站,一般采用分布式存储系统。而对于上传文件量不是很大的网站,只要在另外一台服务器上保存上传文件的同步备份,避免单点故障,就可以满足需求。如果采用分布式存储系统,性价比不是很高,而cwRsyn就是一个不错的选择。
下面简单介绍一下如何使用cwRsyn进行文件同步。
cwRsync是Windows平台的文件同步解决方案,cwRsync打包了rsync和cygwin,rsync是Linux平台的文件同步软件,cygwin是一个在Windows平台上运行的Linux模拟环境。
1. cwRsync服务端安装与配置
1) 下载并安装cwRsyncServer,下载地址:http://sourceforge.net/projects/sereds/files/。
安装过程中,会出现创建用户的窗口,输入用户名与密码后,安装软件会自动创建一个Windows帐户。该帐户用于运行RsyncServer的Windows服务(要注意该帐户对要同步的文件夹是否具有权限),当然你也可以用系统帐户来运行服务。安装完成后,在管理工具》服务中会出现RsyncServer服务。
2) 修改配置文件rsyncd.conf,配置文件如下:
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
uid = 0
gid = 0
[test]
path = /cygdrive/f/test
read only = false
transfer logging = yes
配置文件说明:
a) uid = 0,gid = 0是针对匿名访问的情况进行设置的,这样客户端同步时就不需要进行用户验证。如果不进行这样的设置,客户端同步时会出现“invalid uid nobody”或“invalid gid nobody”的错误提示。如果需要用户验证,就要进行另外的设置。
b) [test]相当于虚拟目录,客户端同步时,就是通过这个名字访问服务器上要同步的文件夹。
c) path = /cygdrive/f/test,同步文件夹的实际路径,f/test=f:/test。
3) 进入管理工具》服务,启动RsynServer服务。
注:cwRsyncServer默认端口是873,如果要指定端口,在rsyncd.conf中添加:port = 端口号。
2. 客户端使用方法
1) 下载并安装cwRsyn客户端,下载地址:http://sourceforge.net/projects/sereds/files/。
2)通过命令行进行同步操作:
假设cwRsync服务器的IP是192.168.0.58,使用默认端口873,要同步的虚拟目录是test,客户端进行同步的文件夹是h:/sync/test,则运行如下的命令进行同步:
rsync -av rsync://192.168.0.58:873/test /cygdrive/h/sync/test
注:如果服务器端删除文件,客户端同步时不会在客户端删除文件,只同步增加和更新的文件。
3) 创建同步批处理文件并加入任务计划。
为了让客户端同步操作自动进行,需要将同步命令放在批处理文件中,并将该批处理文件加入任务计划。
windows | 评论:0
| Trackbacks:0
| 阅读:1388
Submitted by admin on 2011, September 3, 4:01 PM
<?php
ini_set('display_errors','1');
ini_set('display_startup_errors','1');
//error_reporting(E_ALL);
error_reporting(E_ALL ^ E_NOTICE);
set_time_limit(60);
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
date_default_timezone_set('PRC');
$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curlHandle, CURLOPT_TIMEOUT, 20);
curl_setopt($curlHandle, CURLOPT_URL, 'http://www.163.com');
curl_setopt($curlHandle, CURLOPT_HEADER, 1);
$strRet = curl_exec($curlHandle);
if ($strRet === false) { /* 失败或超时 */
die('false');
} else {
$status = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
}
curl_close($curlHandle);
echo $status;
?>
php | 评论:0
| Trackbacks:0
| 阅读:1667
Submitted by admin on 2011, September 1, 3:30 PM
awk -F ':' '{gsub(/^[ \t]+/,"",$2);print $2}' | tr "\n" "|"
shell | 评论:0
| Trackbacks:0
| 阅读:1422
Submitted by admin on 2011, September 1, 2:52 PM
要排除指定目录,可以在客户端命令行中使用–exclude-from命令
例如
rsync -vzrtopg –progress –delete –exclude-from=/home/pcfile xxx@xxx.xxx.xxx.xxx::xxx /back/xxx
pcfile内容写成
aaa/
bbb/
这样,待同步目录中的子目录 aaa和bbb,就不在同步之列了
以下内容待定
同理,若要指定只同步某几个目录,可以用–include-from
include 和 exclude指令则可以排除或不排除指定的文件
linux | 评论:0
| Trackbacks:0
| 阅读:1500
Submitted by admin on 2011, August 30, 6:43 PM
最近对android 2.3.3的framework.jar进行了一些反编译和回编译的操作,写下来备忘。
一、framework.jar反编译为smali文件
1、下载smali-1.2.6.jar和baksmali-1.2.6.jar这两个工具(下载地址:http://code.google.com/p/smali/downloads/list)
2、将framework.jar中的classes.dex解压出来(好像不解压,直接用framework.jar也行)
3、使用baksmali.jar对classes.dex进行反编译(前提是安装了jdk,并且设置好了环境变量),执行命令:
java -jar baksmali-1.2.6.jar classes.dex -o out/
其中classes.dex是要反编译的文件,out/是要把反编译后的文件存放到的文件夹,如果不是在当前目录下,那么baksmali-1.2.6.jar还要加上路径
这样就OK了,在out文件夹中可以看到一堆扩展名为.smali的文件,用记事本就可以打开它们,从中可以窥到一些信息。但是与.java文件还是有一些不同,我也不太清楚这是什么结构。
二、smali文件回编译为classes.dex
1、一条命令就OK了:java -jar smali-1.2.6.jar out/ -o classes.dex
2、再把编译好的classes.dex放回到framework.jar中就行了(可以使用winrar、winzip之类的工具作为辅助)。
三、framework.jar反编译为.class和.java文件
1、下载以下工具:
(1)dex2jar(http://code.google.com/p/dex2jar/)
(2)xjad(http://www.skycn.com/soft/41898.html)或jd-gui(http://java.decompiler.free.fr/?q=jdgui)
2、使用dex2jar对framework.jar进行转换,执行命令:dex2jar.bat framework.jar 将会生成一个framework.jar.dex2jar.jar
3、直接对该jar文件解压,可以看到里面都是.class文件了
4、如果还需要转换成.java文件,可以使用xjad或jd-gui,均可将class文件变为java文件。
注:dex2jar工具也可以处理.dex文件,因此也可以不直接处理framework.jar。而是先将framework.jar解压,生成classes.dex后再处理也行。
android | 评论:0
| Trackbacks:0
| 阅读:2059
Submitted by admin on 2011, August 30, 8:09 AM
我们经常程序在生产环境上上线好几天了,突然不工作了,反复查找原因,发现在Linux操作系统下无法创建目录或文件了,那一般有哪些原因会导致出现这种情况呢?
1.磁盘满
最常出现的问题就是磁盘满了,第一时间查看这个原因,在linux系统下执行df命令,Use%这一列是否有100%的磁盘。
2.文件名称长度限制
linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符,包含完整路径名称及目录(/)的完整文件名为4096个字符。
测试代码:
- LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
- touch $LENTH
LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
touch $LENTH
当增加到256时,touch报错,File name too long
3.目录数量的限制
ext3文件系统下一级子目录是有数量限制的,一般是31998(个),为什么是这个数字,我也不清楚,网上有说是Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核.
测试代码:
- for i in {1..32000};do mkdir $i;done
- mkdir: cannot create directory `31999': Too many links
- mkdir: cannot create directory `32000': Too many links
for i in {1..32000};do mkdir $i;done
mkdir: cannot create directory `31999': Too many links
mkdir: cannot create directory `32000': Too many links
4.文件个数限制
目录下对于文件个数没有限制,文件个数的限制主要取决于磁盘文件系统的inode数。
df -i或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode数,后两个命令输出结果是一样的,但是跟df所得出的可用inode数会有些误差,至今不明白什么原因。
5.打开文件数限制(文件句柄、文件描述符)
ulimit -n 65535设置,或者/etc/security/limit.conf里设置用户打开文件数、进程数、CPU等
转
----------------------------------------
for i in `ls`;do echo $i;cd $i;ls -l | wc -l;cd ..;done
find ./ -type d -empty -exec rm -fr {} \;
linux | 评论:0
| Trackbacks:0
| 阅读:1301
Submitted by admin on 2011, August 25, 2:29 PM
1.简述
android 的坐标转换处理:
This implementation is a linear transformation using 7 parameters
(a, b, c, d, e, f and s) to transform the device coordinates (Xd, Yd)
into screen coordinates (Xs, Ys) using the following equations:
s*Xs = a*Xd + b*Yd + c
s*Ys = d*Xd + e*Yd + f
Xs,Ys:LCD坐标
Xd,Yd:触摸屏坐标
在编译好了的ANDROID根文件系统的system/etc/pointercal这个文件内,存放着7个数,
这7个数就是对应上面公式的a,b,c,d,e,f,s
比如我原来的:(如果表格没对齐,请拷到记事本里面看)
+----+-----+--------+------+--+--------+----+
| a | b | c | d |e | f | s |
+----+-----+--------+------+--+--------+----+
|-411|37818|-3636780|-51325|39|47065584|6553|
+----+-----+--------+------+--+--------+----+
2.处理说明:
“system/etc/pointercal”这个文件是被java程序读取使用的,文件目录:
f rameworks/base/services/java/com/android/server/InputDevice.java
---注:我用的是koolu的源码(http://git.koolu.org/),官方的源码请自行搜索。
该文件的第32行定义了:static final String CALIBRATION_FILE = "/system/etc/pointercal";
这个CALIBRATION_FILE变量在第237行被使用于打开该文件:
FileInputStream is = new FileInputStream(CALIBRATION_FILE);
后面的代码就是从这个文件里读取那7个数据,用于上层函数的坐标转换。
所以只要根据该公式通过手工计算出那7个值,就可以准确的进行触摸操作了。
3.计算
计算前需要取得4个触摸屏的坐标,我们取LCD 4个对角的坐标,因为只有这4个坐标知道确切的LCD坐标。
要取坐标必须打开内核中触摸屏的调试代码,启动后在console上使用dmesg命令来跟踪取得。
我是在一个角上用笔点一下,再用dmesg调出记录,然后记录下来。如下是我的320x240屏记录的结果:
坐标轴里小括号()里面的是调试信息给的触摸屏坐标,中括号[]里的是对应的LCD坐标。
x坐标
/|\
|(X:870, Y:140) (X:870, Y:890)
| [320,0] [320,240]
|
|
|
+-------------------------------> y坐标
(X:120, Y:140) (X:120, Y:890)
[0,0] [0,240]
*LCD 分辨率:320 x 240 ,也是LCD坐标的最大值
x y
设定s=65536
将那4个坐标代入那个公式,可以得出8个方程组
0 = a*120 + b*140 + c
0 = d*120 + e*140 + f
0 = a*120 + b*890 + c
65536*240 = d*120 + e*890 + f
65536*320 = a*870 + b*140 + c
0 = d*870 + e*140 + f
65536*320 = a*870 + b*890 + c
65536*240 = d*870 + e*890 + f
解方程组后就可得:
a = 0
b = 20971
c = -2935940
d = 27962
e = 0
f = -3355440
s = 65535
然后用工具打开andriod的“system/etc/pointercal”文件,把这几个数输进去,用空格分开,
注意不要改文件结尾的两个字节0x00 0x0A,我是用Ghex工具打开的,在右边窗口中进行输入,在编辑里可以切换插入和覆盖模式。
此时启动试试。
////////////////////////////
我的屏到这个步骤后触摸操作的左右变成了上下,上下变成了左右操作,
处理方法:把a,b,c值和d,e,f值分别对调。
再启动试试。。
还是不行,左右是正确的,上下是反的。
处理方法:
把Y坐标再反向的公式:
Ys‘ = 320 - Ys = 320 - (a*Xd + b*Yd + c)/s
重新计算a,b,c的值,就OK了。
现在我点击计算器的按钮等操作都很准了,指哪打哪。
前面发的那个视频里的坐标是在内核里调的坐标,不是很准。
这是手工调的方法,如果要用程序校准的话可以用tslib,有时间再玩下。
转
android | 评论:0
| Trackbacks:0
| 阅读:1251
Submitted by admin on 2011, August 19, 2:17 PM
不少开发员提交修改的时候都不写注释,导致查看历史时很费劲,也不太符合规范。有的公司要求每次提交修改时都写上bug号或者任务描述,那么如何在工具上防止开发员们不写注释呢? 利用svn的pre-commit钩子可简单实现此要求。 进入仓库project1/hooks目录
-
不少开发员提交修改的时候都不写注释,导致查看历史时很费劲,也不太符合规范。有的公司要求每次提交修改时都写上bug号或者任务描述,那么如何在工具上防止开发员们不写注释呢?
利用svn的pre-commit钩子可简单实现此要求。
进入仓库project1/hooks目录,找到pre-commit.tmpl文件,重命名,去掉后缀.tmpl。
编辑pre-commit文件:
将:
$SVNLOOK log -t "$TXN" "$REPOS" |
grep "[a-zA-Z0-9]" > /dev/null || exit 1
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
这三行注释掉(前面加#符号),
在此位置添加如下几行:
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];#要求注释不能少于5个字符,您可自定义
then
echo -e "nLog message cann't be empty! you must input more than 5 chars as comment!." 1>&2
exit 1
fi
保存,退出。
给pre-commit添加可执行权限:
chmod +x pre-commit
配置结束,可以使用了。
转
linux | 评论:0
| Trackbacks:0
| 阅读:1650