前言:

一、为什么要用Rsync+sersync架构?

1、sersync是基于Inotify开发的,类似于Inotify-tools的工具

2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。

二、Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?

1、Rsync+Inotify-tools

(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。

2、Rsync+sersync

(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;

(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

说明:

操作系统:CentOS 5.X

源服务器:192.168.21.129

目标服务器:192.168.21.127,192.168.21.128

目的:把源服务器上/home/www.osyunwei.com目录实时同步到目标服务器的/home/www.osyunwei.com下

系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容 版权所有,转载请注明出处及原文链接

具体操作:

第一部分:分别在两台目标服务器192.168.21.127,192.168.21.128上操作

一、分别在两台在目标服务器安装Rsync服务端

1、关闭SELINUX

vi /etc/selinux/config #编辑防火墙配置文件

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq! #保存,退出

setenforce 0 #立即生效

2、开启防火墙tcp 873端口(Rsync默认端口)

vi /etc/sysconfig/iptables #编辑防火墙配置文件

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

:wq! #保存退出

/etc/init.d/iptables restart #最后重启防火墙使配置生效

3、安装Rsync服务端软件

yum install rsync xinetd #安装

vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync

disable = no #修改为no

:wq! #保存退出

/etc/init.d/xinetd start #启动(CentOS中是以xinetd来管理Rsync服务的)

4、创建rsyncd.conf配置文件

vi /etc/rsyncd.conf #创建配置文件,添加以下代码

log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建

pidfile = /var/run/rsyncd.pid #pid文件的存放位置

lock file = /var/run/rsync.lock #支持max connections参数的锁文件

secrets file = /etc/rsync.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件

motd file = /etc/rsyncd.Motd #rsync启动时欢迎信息页面文件位置(文件内容自定义)

[home_www.osyunwei.com] #自定义名称

path = /home/www.osyunwei.com/ #rsync服务端数据目录路径

comment = home_www.osyunwei.com #模块名称与[home_www.osyunwei.com]自定义名称相同

uid = root #设置rsync运行权限为root

gid = root #设置rsync运行权限为root

port=873 #默认端口

use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份

read only = no #设置rsync服务端文件为读写权限

list = no #不显示rsync服务端资源列表

max connections = 200 #最大连接数

timeout = 600 #设置超时时间

auth users = home_www.osyunwei.com_user #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开

hosts allow = 192.168.21.129 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

hosts deny = 192.168.21.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

:wq! #保存,退出

5、创建用户认证文件

vi /etc/rsync.pass #配置文件,添加以下内容

home_www.osyunwei.com_user:123456 #格式,用户名:密码,可以设置多个,每行一个用户名:密码

:wq! #保存退出

6、设置文件权限

chmod 600 /etc/rsyncd.conf #设置文件所有者读取、写入权限

chmod 600 /etc/rsync.pass #设置文件所有者读取、写入权限

7、启动rsync

/etc/init.d/xinetd start #启动

service xinetd stop #停止

service xinetd restart #重新启动

第二部分:在源服务器192.168.21.129上操作

一、安装Rsync客户端

1、关闭SELINUX

vi /etc/selinux/config #编辑防火墙配置文件

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq! #保存退出

setenforce 0 #立即生效

2、开启防火墙tcp 873端口(Rsync默认端口,做为客户端的Rsync可以不用开启873端口)

vi /etc/sysconfig/iptables #编辑防火墙配置文件

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

:wq! #保存退出

/etc/init.d/iptables restart #最后重启防火墙使配置生效

3、安装Rsync客户端端软件

whereis rsync #查看系统是否已安装rsync,出现下面的提示,说明已经安装

rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz

yum install xinetd #只安装xinetd即可,CentOS中是以xinetd来管理rsync服务的

yum install rsync xinetd #如果默认没有rsync,运行此命令进行安装rsync和xinetd

vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync

disable = no #修改为no

/etc/init.d/xinetd start #启动(CentOS中是以xinetd来管理rsync服务的)

4、创建认证密码文件

vi /etc/passwd.txt #编辑文件,添加以下内容

123456 #密码

:wq! #保存退出

chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可

5、测试源服务器192.168.21.129到两台目标服务器192.168.21.127,192.168.21.128之间的数据同步

mkdir /home/www.osyunwei.com/ceshi #在源服务器上创建测试文件夹,然后在源服务器运行下面2行命令

rsync -avH --port=873 --progress --delete /home/www.osyunwei.com/ home_www.osyunwei.com_user@192.168.21.127::home_www.osyunwei.com --password-file=/etc/passwd.txt

rsync -avH --port=873 --progress --delete /home/www.osyunwei.com/ home_www.osyunwei.com_user@192.168.21.128::home_www.osyunwei.com --password-file=/etc/passwd.txt

运行完成后,分别在两台目标服务器192.168.21.127,192.168.21.128上查看,在/home/www.osyunwei.com目录下有ceshi文件夹,说明数据同步成功。

系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容 版权所有,转载请注明出处及原文链接

二、安装sersync工具,实时触发rsync进行同步

1、查看服务器内核是否支持inotify

ll /proc/sys/fs/inotify #列出文件目录,出现下面的内容,说明服务器内核支持inotify

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches

备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核

CentOS 5.X 内核为2.6.18,默认已经支持inotify

2、修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值:

sysctl -a | grep max_queued_events

结果是:fs.inotify.max_queued_events = 16384

sysctl -a | grep max_user_watches

结果是:fs.inotify.max_user_watches = 8192

sysctl -a | grep max_user_instances

结果是:fs.inotify.max_user_instances = 128

修改参数:

sysctl -w fs.inotify.max_queued_events="99999999"

sysctl -w fs.inotify.max_user_watches="99999999"

sysctl -w fs.inotify.max_user_instances="65535"

vi /etc/sysctl.conf #添加以下代码

fs.inotify.max_queued_events=99999999

fs.inotify.max_user_watches=99999999

fs.inotify.max_user_instances=65535

:wq! #保存退出

参数说明:

max_queued_events:

inotify队列最大长度,如果值太小,会出现" Event Queue Overflow "错误,导致监控文件不准确

max_user_watches:

要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)

max_user_instances:

每个用户创建inotify实例最大值

3、安装sersync

sersync下载地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz

上传sersync2.5.4_64bit_binary_stable_final.tar.gz到/usr/local/src目录下

cd /usr/local/src

tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz #解压

mv GNU-Linux-x86 /usr/local/sersync #移动目录到/usr/local/sersync

4、配置sersync

cd /usr/local/sersync #进入sersync安装目录

cp confxml.xml confxml.xml-bak #备份原文件

vi confxml.xml #编辑,修改下面的代码

<?xml version="1.0" encoding="ISO-8859-1"?>

<head version="2.5">

<host hostip="localhost" port="8008"></host>

<debug start="false"/>

<fileSystem xfs="false"/>

<filter start="false">

<exclude expression="(.*).svn"></exclude>

<exclude expression="(.*).gz"></exclude>

<exclude expression="^info/*"></exclude>

<exclude expression="^static/*"></exclude>

</filter>

<inotify>

<delete start="true"/>

<createFolder start="true"/>

<createFile start="false"/>

<closeWrite start="true"/>

<moveFrom start="true"/>

<moveTo start="true"/>

<attrib start="false"/>

<modify start="false"/>

</inotify>

<sersync>

<localpath watch="/home/www.osyunwei.com">

<remote ip="192.168.21.127" name="home_www.osyunwei.com"/>

<remote ip="192.168.21.128" name="home_www.osyunwei.com"/>

<!--<remote ip="192.168.8.40" name="tongbu"/>-->

</localpath>

<rsync>

<commonParams params="-artuz"/>

<auth start="true" users="home_www.osyunwei.com_user" passwordfile="/etc/passwd.txt"/>

<userDefinedPort start="false" port="874"/><!-- port=874 -->

<timeout start="false" time="100"/><!-- timeout=100 -->

<ssh start="false"/>

</rsync>

<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

<crontab start="true" schedule="600"><!--600mins-->

<crontabfilter start="false">

<exclude expression="*.php"></exclude>

<exclude expression="info/*"></exclude>

</crontabfilter>

</crontab>

<plugin start="false" name="command"/>

</sersync>

<plugin name="command">

<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->

<filter start="false">

<include expression="(.*).php"/>

<include expression="(.*).sh"/>

</filter>

</plugin>

<plugin name="socket">

<localpath watch="/opt/tongbu">

<deshost ip="192.168.138.20" port="8009"/>

</localpath>

</plugin>

<plugin name="refreshCDN">

<localpath watch="/data0/htdocs/cms.xoyo.com/site/">

<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>

<sendurl base="http://pic.xoyo.com/cms"/&gt;

<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>

</localpath>

</plugin>

</head>

:wq! #保存退出

参数说明:

localpath watch="/home/www.osyunwei.com":#源服务器同步目录

192.168.21.127,192.168.21.128:#目标服务器IP地址

name="home_www.osyunwei.com": #目标服务器rsync同步目录模块名称

users="home_www.osyunwei.com_user": #目标服务器rsync同步用户名

passwordfile="/etc/passwd.txt": #目标服务器rsync同步用户的密码在源服务器的存放路径

remote ip="192.168.21.127": #目标服务器ip,每行一个

remote ip="192.168.21.128": #目标服务器ip,每行一个

failLog path="/tmp/rsync_fail_log.sh" #脚本运行失败日志记录

start="true" #设置为true,每隔600分钟执行一次全盘同步

5、设置sersync监控开机自动执行

vi /etc/rc.d/rc.local #编辑,在最后添加一行

/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml #设置开机自动运行脚本

:wq! #保存退出

6、添加脚本监控sersync是否正常运行

vi /home/crontab/check_sersync.sh #编辑,添加以下代码

#!/bin/sh

sersync="/usr/local/sersync/sersync2"

confxml="/usr/local/sersync/confxml.xml"

status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)

if [ $status -eq 0 ];

then

$sersync -d -r -o $confxml &

else

exit 0;

fi

:wq! #保存退出

chmod +x /home/crontab/check_sersync.sh #添加脚本执行权限

vi /etc/crontab #编辑,在最后添加下面一行

/5 * root /home/crontab/check_sersync.sh > /dev/null 2>&1 #每隔5分钟执行一次脚本

service crond reload #重新加载服务

6、测试sersync实时触发rsync同步脚本是否正常运行

在源服务器192.168.21.129上创建文件inotify_rsync_ceshi

mkdir /home/www.osyunwei.com/inotify_rsync_ceshi

重新启动源服务器:192.168.21.129

等系统启动之后,查看两台目标服务器192.168.21.127,192.168.21.128的/home/www.osyunwei.com下是否有inotify_rsync_ceshi文件夹

然后再在源服务器192.168.21.129创建文件夹inotify_rsync_ceshi_new

mkdir /home/www.osyunwei.com/inotify_rsync_ceshi_new

继续查看两台目标服务器192.168.21.127,192.168.21.128的/home/www.osyunwei.com下是否有inotify_rsync_ceshi_new文件夹

如果以上测试都通过,说明inotify实时触发rsync同步脚本运行正常。

至此,Linux下Rsync+sersync实现数据实时同步完成。

扩展阅读:

sersync开发者网站:http://blog.johntechinfo.com/sersyncguild

rsync参数

-v, --verbose 详细模式输出

-q, --quiet 精简输出模式

-c, --checksum 打开校验开关,强制对文件传输进行校验

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

-r, --recursive 对子目录以递归模式处理

-R, --relative 使用相对路径信息

-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。

--backup-dir 将备份文件(如~filename)存放在在目录下。

-suffix=SUFFIX 定义备份文件前缀

-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

-l, --links 保留软链结

-L, --copy-links 想对待常规文件一样处理软链结

--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结

--safe-links 忽略指向SRC路径目录树以外的链结

-H, --hard-links 保留硬链结

-p, --perms 保持文件权限

-o, --owner 保持文件属主信息

-g, --group 保持文件属组信息

-D, --devices 保持设备文件信息

-t, --times 保持文件时间信息

-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间

-n, --dry-run现实哪些文件将被传输

-W, --whole-file 拷贝文件,不进行增量检测

-x, --one-file-system 不要跨越文件系统边界

-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节

-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步

--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息

-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

--delete 删除那些DST中SRC没有的文件

--delete-excluded 同样删除接收端那些被该选项指定排除的文件

--delete-after 传输结束以后再删除

--ignore-errors 及时出现IO错误也进行删除

--max-delete=NUM 最多删除NUM个文件

--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输

--force 强制删除目录,即使不为空

--numeric-ids 不将数字的用户和组ID匹配为用户名和组名

--timeout=TIME IP超时时间,单位为秒

-I, --ignore-times 不跳过那些有同样的时间和长度的文件

--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间

--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0

-T --temp-dir=DIR 在DIR中创建临时文件

--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份

-P 等同于 --partial

--progress 显示备份过程

-z, --compress 对备份的文件在传输时进行压缩处理

--exclude=PATTERN 指定排除不需要传输的文件模式

--include=PATTERN 指定不排除而需要传输的文件模式

--exclude-from=FILE 排除FILE中指定模式的文件

--include-from=FILE 不排除FILE指定模式匹配的文件

--version 打印版本信息

--address 绑定到特定的地址

--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件

--port=PORT 指定其他的rsync服务端口

--blocking-io 对远程shell使用阻塞IO

-stats 给出某些文件的传输状态

--progress 在传输时现实传输过程

--log-format=formAT 指定日志文件格式

--password-file=FILE 从FILE中得到密码

--bwlimit=KBPS 限制I/O带宽,KBytes per second

-h, --help 显示帮助信息

转载于:https://blog.51cto.com/benchmarking/2104061

Rsync+sersync实现数据实时同步

相关文章

  1. c语言那些细节之a+1和a+1的区别

    首先a是一个数组名&#xff0c;当看到这个a与&a时&#xff0c;一般我们的理解都是这个数组的首地址。没错&#xff0c;如果加上打印的话&#xff0c;确实两个值是一样的。 不过&a是整个数组的首地址&#xff0c;a则是数组首元素的地址&#xff0c;虽然值一样&#xff…...

    2023/3/28 17:46:26
  2. Android 自定义控件之基础几何图形绘制详解

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/52562488 本文出自&#xff1a;周游的博客 前言CanvasPaintPaint常用函数setStylesetShadowLayer Canvas常用函数绘制背景绘制一条直线绘制多条直线绘制单点绘制多点绘制矩形绘制圆角矩形绘制圆形绘…...

    2023/3/28 17:46:26
  3. c语言那些细节之结构体字节对齐

    相信很多人学c的时候就不知道c中还有位域这么一说&#xff0c;自认为c学得还行&#xff0c;可是离精通还是有一定的距离啊&#xff0c;赶紧搞明白位域这一说法。所谓“位域”是把一个字节中的二进位划分为几个不同的区域&#xff0c;并说明每个区域的位数。每个域有一个域名&am…...

    2023/3/28 17:46:25
  4. Android 自定义控件之圆形扩散View(DiffuseView)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/52683193 本文出自&#xff1a;周游的博客 实现效果使用属性方法代码源码下载参考链接 实现效果 使用 XML中&#xff1a; <com.airsaid.diffuseview.widget.DiffuseViewandroid:id"id/di…...

    2023/3/28 17:46:25
  5. 嵌入式linux那点东东之整体框架

    从事嵌入式linux工作也1年有余了&#xff0c;如果算上大学期间的自学&#xff0c;那么也有两年多光景了。期间也写过底层bootloader、内核的驱动和上层应用程序。对于芯片内部的模块也在大学时候用fpga的verilog玩过&#xff0c;所以对于整个嵌入式的框架也算是有点小小的理解吧…...

    2023/3/28 17:46:24
  6. Android 传感器开发详解

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/52902299 本文出自&#xff1a;周游的博客 前言使用第一步第二步第三步 方向传感器陀螺仪传感器磁场传感器重力传感器线性加速度传感器温度传感器光传感器压力传感器心率传感器实例获取各传感器数据…...

    2023/3/28 17:46:24
  7. 人生顿悟之浮躁的心该静一静

    从周六的一次意外扭伤脚&#xff0c;然后就打着石膏&#xff0c;乖乖地窝在10来平米的房间里&#xff0c;浑浑噩噩地过到了今天。算一下也快要一周了。时间过得真得好快。本来的现在应该还在公司加班的&#xff0c;想着明天周五了&#xff0c;然后又是周末可以睡个懒觉了。可是…...

    2023/3/28 17:46:23
  8. Android 自定义控件之圆点指示器 View (IndicateDotView)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/52904344 本文出自&#xff1a;周游的博客 前言 最近公司项目中&#xff0c;有一个如下的UI&#xff1a; 可以看到&#xff0c;右侧的圆点&#xff0c;虽然可以直接用布局实现&#xff0c;但是…...

    2023/3/28 17:46:23
  9. c语言那些细节之little-endian和big-endian

    知道大小端&#xff0c;但是都没有整理下&#xff0c;只知道网络要用到big-endian&#xff0c;也就是大端模式。 在各种计算机体系结构中&#xff0c;对于字节、字等的存储机制有所不同&#xff0c;因而引发了计算机通信领域中一个很重要的问题&#xff0c;即通信双方交流的信息…...

    2023/3/28 17:46:22
  10. Android 从0开始自定义控件之 View 基础知识与概念(一)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/53057091 本文出自&#xff1a;周游的博客 前言什么是ViewView位置参数MotionEventTouchSlopVelocityTrackerGestureDetector参考 前言 自定义 View 可以说是 Android 路上的一道坎&#xff0c;会…...

    2023/3/28 17:46:21
  11. 和菜鸟一起学linux内核源码之启动篇

    又是一个周末&#xff0c;日子过得比较散&#xff0c;虽然期间也有不断地看书学习&#xff0c;总觉得有点小盲目。想想毕业也快要1年了&#xff0c;从事嵌入式linux的研发工作也1年多了。这1年多的从实习到正式工作到现在的自己&#xff0c;进步有&#xff0c;也很大&#xff0…...

    2023/3/28 17:46:21
  12. 和菜鸟一起学linux内核源码之基础准备篇

    注&#xff1a;以下大部分内容摘自linux内核编程入门篇和linux内核完全注释 在工作的这段时间&#xff0c;发现我的visio画图熟悉了点点&#xff0c;总喜欢把什么源码啊&#xff0c;结构啊之类的就当作流程图来画来理解&#xff0c;因为对于图&#xff0c;有一个很直观的认识&a…...

    2023/3/28 17:46:20
  13. Android 从0开始自定义控件之 View 的滑动(二)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/53143754 本文出自&#xff1a;周游的博客 前言scrollByscrollTo使用动画改变布局参数实例随手指滑动的ImageView 总结参考 前言 由于 Android 的屏幕局限性&#xff0c;为了展示更多的东西&#…...

    2023/3/28 17:46:20
  14. 和菜鸟一起学android4.0.3源码之wifi的简单分析

    关于wlan的组成 关于wifi应用层的接口的调用 首先从上层android wifi的应用开始&#xff0c;首先会根据android的wifimanager的类&#xff0c;实例化一个mwifimanager的对象&#xff0c;这个对象处理了所有wifi需要处理的任务&#xff0c;接着比如说打开wifi&#xff0c;那么就…...

    2023/3/28 17:46:19
  15. Android 从0开始自定义控件之 View 的弹性滑动(三)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/53207851 本文出自&#xff1a;周游的博客 前言Scroller动画延时策略总结参考 前言 在上一篇&#xff08;Android 从0开始自定义控件之View的滑动&#xff08;二&#xff09;&#xff09;中&#…...

    2023/3/28 17:46:19
  16. java 开发工具介绍

    java 开发工具介绍 1、java初学者 常用开发工具介绍 2、java ide&#xff0d;常见java开发工具的特点比较 3、安装 myeclipse7.0 m1下载汉化注册码 myeclipse 6.5ga 下载 汉化方法 不知道什么原因,最近想mono、myeclipse等官方网站根本就无法访问,所以在线更新语言包的做法…...

    2023/3/28 17:46:18
  17. 和菜鸟一起学android4.0.3源码之wifi direct的简单分析

    关于wifi direct Wifi direct的连接 下面的图表示的是wifi direct的发现过程。 整个过程可以见下图。 关于android上的wifi direct 首先上层通过调用p2p manager的接口来实现p2p的使能&#xff0c;扫描&#xff0c;连接&#xff0c;群组的创建等等的功能。具体接口如下。 如上…...

    2023/3/28 17:46:18
  18. [置顶]《与Java相恋》(初级篇)二-内部类

    在上一节里给大家留了一个算法,不知大家做得怎样了,现在给出这个算法的参考程序代码。 public class sum1_5 { /** * param args */ public static void main(string[] args) { system.out.println(sum(100)); } public static int sum(int x) { int msum0; if(x%…...

    2023/3/28 17:46:17
  19. 和菜鸟一起学linux之bluez学习记录1

    关于蓝牙协议栈体系结构 底层硬件模块 RF 1、利用2400M&#xff5e;2483.5M频带 2、采用调频方式传输数据&#xff0c;一共有79/EDR,40/BLE个hops,每秒 3、采用GFSK&#xff08;DQPSK和8DPSK)调制方式 4、信道间隔&#xff08;1MHZ/EDR模式,2MHZ/BLE模式&#xff09; BB 蓝…...

    2023/3/28 17:46:17
  20. Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

    java的jvm的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身. 3.一般由程序…...

    2023/3/28 17:46:16
  21. 和菜鸟一起学linux之bluez学习记录2

    这里主要摘取对于hci&#xff0c;l2cap&#xff0c;sdp和rfcomm的一些应用编程。 关于hci 一、HCI层协议概述 1、HCI Command Packets 详见bluez源码&#xff1a;lib/hci.h /* Link Control */ #define OGF_LINK_CTL 0x01 #define OCF_INQUIRY 0x0001 #define OCF_…...

    2023/3/28 17:46:16
  22. 和菜鸟一起学linux之wifi相关应用的移植和使用

    一、 libnl移植 下载源码&#xff1a;http://www.infradead.org/~tgr/libnl/ libnl-3.2.21.tar.gz 解压缩后&#xff0c;在libnl-3.2.21当前目录下&#xff0c;新建build.sh&#xff0c;编辑内容如下&#xff1a; ---------------------------------------分割线-------------…...

    2023/3/28 17:46:15
  23. javascript书籍推荐

    头几年是后端开发的黄金时代,在哪个年代web前端是不被人们鄙视的,至少不被看哈,可是慢慢的互联网越做越大用户越来越多前端工程也慢慢的发展起来,逐渐被人重视,相信在很多一线城市同时掌握html5,css3和javasscript的业内人士并不多。所以web前端研发工程师,在国内算是一个朝阳职…...

    2023/3/28 17:46:14
  24. Android 从0开始自定义控件之 View 的滑动冲突详解(四)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/53244984 本文出自&#xff1a;周游的博客 前言常见的滑动冲突场景滑动冲突的处理规则滑动冲突的解决方式外部拦截法实例 内部拦截法实例 总结 前言 滑动冲突可以说每一个 Android 开发者都遇到过…...

    2023/3/28 17:46:14
  25. 和菜鸟一起学linux内核之引导启动篇

    注&#xff1a;以下大部分内容摘自linux内核编程入门篇和linux内核完全注释 对于linux的整个体系结构有了一定的了解&#xff0c;看了每个目录的文件整体概要&#xff0c;那么就 可以开始看内核的源码了&#xff0c;首先那便是引导启动了。 关于磁道&#xff0c;扇区等信息 在…...

    2023/3/28 17:46:14
  26. 【转】几个Java的网络爬虫

    几个java的网络爬虫,有兴趣的可以参考一下,也可以改成c#的。我用过其中j-spider,只爬取网页,不做解析。感兴趣的可以把这个下载下来,看看源代码。我最初的爬虫就是用j-spider扩展的,后来因为字符的编码问题,就放弃了改用c#。 页面:http://www.open-open.com/68.htm heritrix点…...

    2023/3/28 17:46:13
  27. 和菜鸟一起学linux内核之初始化init篇

    注&#xff1a;以下大部分内容摘自linux内核编程入门篇和linux内核完全注释 断断续续地看着内核源码&#xff0c;发现很多知识点都不是很明白&#xff0c;特别是对于操作系统的一些基础。虽然看到了块设备了&#xff0c;但是发现也总结不出什么了&#xff0c;这篇好像好久前更新…...

    2023/3/28 17:46:13
  28. 求java学习推荐几本书

    求java学习推荐几本书 希望从零开始学习java,推荐几本好书,覆盖多方面的。比如一开始的java基础,到j2se,j2ee,j2me,等等每个层次都要有的、、、 绿色通道:好文要顶关注我收藏该文与我联系 posted 2011-05-26 13:39 红笺小字 阅读(14) 评论(0)编辑 收藏 注册用户登录后才能…...

    2023/3/28 17:46:12
  29. Android 从0开始自定义控件之 ViewRoot 与 DecorView (五)

    转载请标明出处&#xff1a; http://blog.csdn.net/airsaid/article/details/53525335 本文出自&#xff1a;周游的博客 前言ViewRootDecorView 前言 好几个星期没写博客了&#xff0c;今天继续来学习 View 相关的知识&#xff1a;View 的三大流程&#xff1a;测量流程、布局…...

    2023/3/28 17:46:12
  30. 和菜鸟一起学linux总线驱动之启动篇

    突然觉得学了这么久的内核驱动&#xff0c;都没有很深入看内核总线底层的实现。简单看过了最低版本的内核的源码&#xff0c;总算可以稍微理清一些头绪了。现在回过头来&#xff0c;把这一部分的知识给补上去。 Linux设备的模型有&#xff1a;总线&#xff08;bus&#xff09;、…...

    2023/3/28 17:46:11

最新文章

  1. 使用 Flash Builder 的 Apple iOS 开发过程

    使用 Flash Builder 的 Apple iOS 开发过程 iOS 开发和部署过程概述 构建、调试或部署 iOS 应用程序前的准备工作 在测试、调试或安装 iOS 应用程序时选择的文件 将应用程序部署到 Apple App Store 时选择的文件 在使用 Flash Builder 开发 iOS 应用程序之前&#xff0c;必须…...

    2023/3/16 19:40:03
  2. exchange日常管理之九:升级SP1后的灾难恢复

    将exchange 2007升级到了exchange 2010&#xff0c;但是没有打最新的SP1补丁和累积更新&#xff0c;没想到这补丁一打就出问题了&#xff0c;汗了一把啊。 升级过程摘要 1、在前端服务器和后端服务器上安装microsoft office filter pack 2.0 2、停掉后端的beremote备份进程 3…...

    2023/3/16 17:29:51
  3. iOS开发 - js oc相互调用

    2019独角兽企业重金招聘Python工程师标准>>> 首先导入 JavaScriptCore.framework 框架 #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <JavaScriptCore/JavaScriptCore.h>protocol ServerJSProtocol <JSExport>// 微…...

    2023/3/16 6:11:48
  4. git学习之创建版本库

    创建版本库 什么是版本库呢&#xff1f;版本库又名仓库&#xff0c;英文名repository&#xff0c;你可以简单理解成一个目录&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改、删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪…...

    2023/3/16 5:38:29
  5. List集合中的数据按照某一个属性进行分组

    有的时候&#xff0c;我们需要在java中对集合中的数据进行分组运算。例如&#xff1a;Bill对象有money(float)和type(String)属性&#xff0c;现有个集合List<Bill>&#xff0c;需要按照Bill的type属性进行分组&#xff0c;计算money的总和。有以下两种思路&#xff1a; …...

    2023/3/18 2:30:34
  6. 游戏编程性能优化--------------------------------------------------------------------------------------...

    游戏编程性能优化------------------------------------------------------------------------------------------- 1.全局变量名尽量用缩写&#xff0c;尽可能短&#xff0c;可以减小程序最终生所的体积 2.for循环在较大的循环空间&#xff0c;写成几个循环&#xff0c;以利用…...

    2023/3/16 12:35:44
  7. 2017年软件工程作业-“Hello World!”团队互评beta版本

    A.欢迎来怼——博客园安卓APP&#xff08;测评人&#xff1a;刘淑霞&#xff09; 博客地址&#xff1a;http://www.cnblogs.com/liusx0303/p/7905928.html B.Thunder——爱阅app&#xff08;测评人&#xff1a;方铭&#xff09; 博客地址&#xff1a;http://www.cnblogs.com/…...

    2023/3/16 12:07:11
  8. ibatis 批量插入逻辑

    为什么80%的码农都做不了架构师&#xff1f;>>> ibatis oracle 批量插入配置 <!--批量新增--><insert id"CreateLawStatisticsClassifyBatch" parameterClass"ArrayList">insert into T_LAW_STATISTICS_CLASSIFY(ID,TEMPLATE,ALIA…...

    2023/3/16 5:39:32
  9. secureCRT免密码登陆Linux

    转自&#xff1a;http://blog.csdn.net/wangquannetwork/article/details/46062675 1.实现原理&#xff1a; 通过CRT生成的密钥对&#xff0c;把公钥上传到Linux服务器指定用户下的.ssh目录中&#xff0c;在客户端上只需输入秘钥的密码即可登陆&#xff0c;而且验证一次以后可以…...

    2023/3/16 11:10:31
  10. PP代码生成器(二) 解决方案, 生成任务, 辅助设计面板

    我们接着上一篇博客继续讨论如何使用PP生成代码. 首先, 我们介绍两个概念”解决方案”和 “生成任务”. 解决方案: 解决方案是一系列生成任务的集合. 它包含若干个生成任务.生成任务: 每个任务会关联一个freemarker模板, 最终会使用这个模板来生成一个结果文件解决方案和任务的…...

    2023/3/16 10:41:54
  11. 函数的运用二(一个一个字读,便于学会机率)

    看完前篇的函数运用是不是不在疑惑&#xff0c;那么下面就来点复杂一点的&#xff0c;也不难的。 如下图所示&#xff1a;读绿色和黄色注释。 是不是能写出来了&#xff0c;调用函数的方式&#xff0c;都是一样的。跟上面前篇的调用几乎一样的&#xff0c;不同就是函数名不同而…...

    2023/3/24 2:33:26
  12. 困扰你的Git操作?

    前端学习笔记篇之git那些事 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。学习前端&#xff0c;离不开Git的使用&#xff0c;面试时也是一个常考的话题&#xff0c;在日常开发中&#xff0c;也困扰我们许久&#xff0c;下面就让…...

    2023/3/24 2:33:28
  13. ArrayList和LinkedList的区别

    2019独角兽企业重金招聘Python工程师标准>>> ArrayList和Vector使用了数组的实现&#xff0c;可以认为ArrayList或者Vector封装了对内部数组的操作&#xff0c;比如向数组中添加&#xff0c;删除&#xff0c;插入新的元素或者数据的扩展和重定向。 LinkedList使用了…...

    2023/3/16 17:29:27
  14. Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程...

    在上篇随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示》中介绍了我的整个CRM系统的概貌&#xff0c;本篇继续本系列的文章&#xff0c;介绍如何基于我的《winform开发框架》的基础上进行CRM系统模块的开发工作&#xff0c;希望对大家在系统模块开发…...

    2023/3/16 5:37:14
  15. shell 日期加减运算

    比如今日是2012-04-22$ date -d "1 day" %Y-%m-%d2012-04-23$ date -d "-1 day" %Y-%m-%d2012-04-21$ date -d "2012-04-10 -1 day " %Y-%m-%d2012-04-09$ date -d "2012-04-10 1 day " %Y-%m-%d2012-04-11$ date -d "-1 week &q…...

    2023/3/15 19:12:30
  16. PHP 字符串替换 substr_replace 与 str_replace 函数

    PHP 字符串替换 用于从字符串中替换指定字符串。 相关函数如下&#xff1a; substr_replace()&#xff1a;把字符串的一部分替换为另一个字符串 str_replace()&#xff1a;使用一个字符串替换字符串中的另一些字符substr_replace() substr_replace() 函数用于把字符串的一部分替…...

    2023/3/16 12:34:47
  17. Android开发者指南(12) —— Android Supported Media Formats

    本文档描述了Android平台支持的媒体播放解码器、网络协议。 作为一名应用软件开发者&#xff0c;你可以自由使用平台上的媒体解码器&#xff0c;这些编解码可以是平台提供&#xff0c;或者是特定设备支持。然而&#xff0c;最好习惯于使用媒体编码配置信息使得应用软件代码编写…...

    2023/3/16 12:06:17
  18. Quartz.NET

    概述 Quartz.NET是一个开源的作业调度框架&#xff0c;非常适合在平时的工作中&#xff0c;定时轮询数据库同步&#xff0c;定时邮件通知&#xff0c;定时处理数据等。 Quartz.NET允许开发人员根据时间间隔&#xff08;或天&#xff09;来调度作业。它实现了作业和触发器的多对…...

    2023/3/16 11:38:32
  19. java算法-递归算法

    2019独角兽企业重金招聘Python工程师标准>>> 不废话直接上代码 public class maxtest {public static void main(String[] args) {//###################阶乘递归算法start###################//System.out.println(f(5));//###################阶乘递归算法start##…...

    2023/3/16 11:09:32
  20. Lifecycle-library-stable

    Google 最近发布了稳定Lifecyclelibrary。笔者认为&#xff1a;如果你正在使用alpha或者beta版本&#xff0c;以下内容可能对你有用。 Deprecated LifecycleActivity 在stable version 1.0.0 之前&#xff0c;LifeCycle Library 并没有实现 LifecycleOwner这个接口&#xff0c;…...

    2023/3/16 10:41:08
  21. 数据结构——哈希表

    前言 使用哈希表可以进行非常快速的查找操作。但是&#xff0c;哈希表究竟是什么玩意儿&#xff1f;很多人避而不谈&#xff0c;虽然知道经常用到&#xff0c;很多语言的内置数据结构像python中的字典&#xff0c;java中的HashMap&#xff0c;都是基于哈希表实现。但哈希表究竟…...

    2023/3/16 10:14:40
  22. Bootstrap~Panel和Table

    在我们对一个页面进行设计时&#xff0c;分块是必须的&#xff0c;没有一个网站是一栏而下的&#xff0c;除非你是在看小说&#xff0c;否则你的页面设计一定是分块的&#xff0c;即它由于多个panel组件&#xff0c;在bootstrap里叫到栅格系统&#xff0c;而在每行每列进行宏观…...

    2023/3/16 6:40:03
  23. pyspider操作千万级库,pyspider在对接量级较大库的策略

    pyspider操作千万级库&#xff0c;pyspider在对接量级较大库的策略 如果是需要pyspider正常的流程去执行&#xff0c;那必然是会在on_strat()时任务执行超时&#xff0c;可能只读取出几万条或十几万条数据就会被破终止&#xff0c;然后执行index_page()&#xff0c;由于这个超时…...

    2023/3/16 6:09:47
  24. Js+MVC~公用API的设计,返回jsonp后使ajax的error属性生效!

    相关知识说明 项目用公用的&#xff21;&#xff30;&#xff29;事实上就是其它子项目&#xff0c;包括非子项目需要从这个项目中得到一个公用的信息&#xff0c;这种产生信息的接口我们称为公用的&#xff21;&#xff30;&#xff29;(application program interface)&#…...

    2023/3/16 8:48:42
  25. 【CentOS 7笔记51】,screen虚拟终端#171207

    2019独角兽企业重金招聘Python工程师标准>>> hellopasswd screen工具 为了不让一个任务意外终端nohup command &screen是一个虚拟终端yum install -y screenscreen直接回车就进入了虚拟终端ctral a组合键再按d退出虚拟终端&#xff0c;但不是结束screen -ls查看…...

    2023/3/16 0:46:40
  26. 行内元素和块级元素(转)

    行内元素和块级元素 2013-01-05 11:40 by greenal, 88623 阅读, 3 评论, 收藏, 编辑 1 块级元素&#xff1a;div , p , form, ul, li , ol, dl, form, address, fieldset, hr, menu, table行内元素&#xff1a;span, strong, em, br, img , input, label…...

    2023/3/16 12:33:43
  27. 微信JSApi支付~坑和如何填坑

    微信一直用着不爽&#xff0c;这几天研究它的jsapi支付&#xff0c;即在微信内打开H5页面&#xff0c;完成支付的过程&#xff0c;在这个过程中&#xff0c;你将会遇到各种各样的问题&#xff0c;而大叔将把这些问题的解决方法写一下&#xff0c;希望可以给你带来帮助&#xff…...

    2023/3/16 12:05:20
  28. 阿里云ECS服务器Linux环境下配置php运行环境

    阿里云ECS服务器Linux环境安装配置PHP的运行环境&#xff0c;不同于window操作系统下配置&#xff0c;因为是linux操作系统主要是在命令窗体里输入命令来操作&#xff0c;对于初次接触过linux系统的可能会有点怕怕的&#xff0c;下不去手。。。。。。 需要安装的软件有Apacheph…...

    2023/3/16 0:45:51
  29. vim文本编辑器和yum的搭建

    rpm -ivh 软件名-版本信息-.rpm &#xff08;安装软件&#xff09; rpm -q 软件名 (查看软件是否安装) rpm -e 软件名 &#xff08;卸载转件&#xff09; 因为rpm有依赖关系而yum刚好解决此问题 使用vim创建/修改文本文件 vim文本编辑器 命…...

    2023/3/16 13:02:32
  30. sql developer 连接oracle错误一例(ORA-12505)

    Oracle安装于VM中用sql developer连接oracle报ORA-12505再三检查lsnrctl status&#xff0c;不得正常后来再发现是oracle instance没有启动。转载于:https://blog.51cto.com/9882derek/2049088...

    2023/3/16 13:02:32