工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

分享Windows服务器网站文件同步备份解决方案之cwRsyn进行文件同步(转)

 

本文和大家分享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) 创建同步批处理文件并加入任务计划。

为了让客户端同步操作自动进行,需要将同步命令放在批处理文件中,并将该批处理文件加入任务计划。

php curl 获取状态码

<?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;

?>

shell awk 去除空格

awk -F ':' '{gsub(/^[ \t]+/,"",$2);print $2}' | tr "\n" "|"

rsync备份时排除指定目录

要排除指定目录,可以在客户端命令行中使用–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指令则可以排除或不排除指定的文件

反编译与回编译android的framework.jar(其他jar文件也可参考)

最近对android 2.3.3的framework.jar进行了一些反编译和回编译的操作,写下来备忘。

一、framework.jar反编译为smali文件

1、下载smali-1.2.6.jarbaksmali-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后再处理也行。

linux 操作系统下目录创建和文件创建的限制

我们经常程序在生产环境上上线好几天了,突然不工作了,反复查找原因,发现在Linux操作系统下无法创建目录或文件了,那一般有哪些原因会导致出现这种情况呢?

1.磁盘满
最常出现的问题就是磁盘满了,第一时间查看这个原因,在linux系统下执行df命令,Use%这一列是否有100%的磁盘。

2.文件名称长度限制
linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符,包含完整路径名称及目录(/)的完整文件名为4096个字符。
测试代码:

Java代码  
  1. LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`   
  2. touch $LENTH  


当增加到256时,touch报错,File name too long

3.目录数量的限制
ext3文件系统下一级子目录是有数量限制的,一般是31998(个),为什么是这个数字,我也不清楚,网上有说是Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核.
测试代码:

 
  1. for i in {1..32000};do mkdir $i;done    
  2. mkdir: cannot create directory `31999': Too many links   
  3. 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 {} \;

android触摸屏坐标手工校准/调整成功

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,有时间再玩下。

svn强制要求提交注释--pre-commit钩子

不少开发员提交修改的时候都不写注释,导致查看历史时很费劲,也不太符合规范。有的公司要求每次提交修改时都写上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

配置结束,可以使用了。