• 利用rsync 从 windows2003⇒linux系统备份

    windows端 安装rsyncServer(WINDOWS)版本 1.程序目录下配置文件 rsyncd.conf 修改为:

    port = 873
    use chroot = false
    strict modes = false
    uid=0
    gid=0
    list = no
    hosts allow = *
    log file = rsyncd.log
    #rsync连接时需要提供的用户名密码
    auth users = rsync_picbak 
    secrets file = rsyncd.secrets (跟rsyncd.conf配置文件是同级目录)
    
    [test] #同步目录设置  /cygdrive/d/代表d盘
    path = /cygdrive/d/websites
    read only = yes
    transfer logging = yes

    2.rsyncd.secrets的内容为:

    rsync_picbak = 111111(密码)

    3.启动rsync服务

    打开“控制面板”-->“管理工具”-->“服务”:
    找到一个RsyncServer的服务,启动它(防火墙设置记得打开873端口)

    linux端安装rsync的client客户端

    安装完毕 ,telnet 服务器ip 873 通的就可以执行以下同步操作了

    rsync -vzrtopg --progress --delete --password-file=/var2/db_bak/pass_file rsync_picbak@122.225.115.*::test/ /var2/pic_bak/208
    
    /var2/db_bak/pass_file 为存放密码的文件
    
    /var2/pic_bak/208 为本机需要备份的文件夹名称
  • MySQL的mysqldump工具的基本用法

    几个常用用例:
    1.导出整个数据库
    mysqldump -u 用户名 -p 数据库名 > 导出的文件名
    mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
    2.导出一个表
    mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
    mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
    3.导出一个数据库结构
    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
    -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
    4.导入数据库 常用source 命令
    进入mysql数据库控制台,
    如mysql -u root -p
    mysql>use 数据库
    然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
    mysql>source d:\wcnc_db.sql
  • jQuery性能优化(ie6)

    ie6浏览器,js引擎解析速度很慢,所以只能选择优化js代码

    1.尽量使用#id去寻找元素(id是唯一的,无需遍历和循环DOM)

    2.jQuery中第二快的选择器就是Tag选择器,尽量在Classes前面使用Tags
    eg:var active_light = $(‘#traffic_light input.css’); 比$(‘.css’)快许多

    3.养成保存jQuery对象到一个变量上的习惯
    记住,永远不要让相同的选择器在你的代码里出现多次.

    eg:
    $(‘#traffic_light input.on).bind(‘click’, function(){…});
    $(‘#traffic_light input.on).css(‘border’, ‘3px dashed yellow’);
    $(‘#traffic_light input.on).css(‘background-color’, ‘orange’);
    $(‘#traffic_light input.on).fadeIn(‘slow’);
    取而代之,首现保存jQuery变量到一个本地变量后,再继续你的操作。

    var $active_light = $(‘#traffic_light input.on’);
    $active_light.bind(‘click’, function(){…});
    $active_light.css(‘border’, ‘3px dashed yellow’);
    $active_light.css(‘background-color’, ‘orange’);
    $active_light.fadeIn(‘slow’);

    4.更好的利用链:
    var $active_light = $(‘#traffic_light input.on’);$active_light.bind(‘click’, function(){…})
    .css(‘border’, ‘3px dashed yellow’)
    .css(‘background-color’, ‘orange’)
    .fadeIn(‘slow’);
    这样可以让我们写更少的代码,使JavaScript更轻量。

    5.使用子查询
    jQuery 允许我们对一个已包装的对象使用附加的选择器操作. 因为我们已经在保存了一个父级对象在变量

    里, 这样大大提高对其子元素的操作:
    var $traffic_light = $(‘#traffic_light’),
    $active_light = $traffic_light.find(‘input.on’),
    $inactive_lights = $traffic_light.find(‘input.off’);
    提示: 你可以用逗号分隔的方法一次声明多个局部变量 节省字节数

    6.将 jquery结果缓存到一个全局变量中
    // 在全局范围定义一个对象 (例如: window对象)
    window.$my =
    {
    // 初始化所有可能会不止一次要使用的查询
    head : $(‘head‘),
    traffic_light : $(‘#traffic_light‘),
    traffic_button : $(‘#traffic_button‘)
    };
    function do_something()
    {
    //现在你可以引用存储的结果并操作它们
    var script = document.createElement(‘script‘);
    $my.head.append(script);
    $my.cool_results = $(‘#some_ul li‘);
    $my.other_results = $(‘#some_table td‘);// 将全局函数作为一个普通的jquery对象去使用.
    $my.other_results.css(‘border-color‘, ‘red‘);
    $my.traffic_light.css(‘border-color‘, ‘green‘);
    }

    7.第三,多用父子关系,少用嵌套关系。

    例如,使用parent>child代替parent child。因为”>”是child选择器,只从子节点里匹配,不递归。而” “是后

    代选择器,递归匹配所有子节点及子节点的子节点,即后代节点。

    jQuery选择器使用频率列表

    选 择 器 统计频率
    #id 51.290%
    .class 13.082%
    tag 6.416%
    tag.class 3.978%
    #id tag 2.151%
    tag#id 1.935%
    #id:visible 1.577%
    #id .class 1.434%
    .class .class 1.183%
    * 0.968%

    续表

    选 择 器 统计频率
    #id tag.class 0.932%
    #id:hidden 0.789%
    tag[name=value] 0.645%
    .class tag 0.573%
    [name=value] 0.538%
    tag tag 0.502%
    #id #id 0.430%
    #id tag tag 0.358%
  • jQuery上传插件Uploadify详解及其中文按钮解决方案

    网上找了一天,大家都说Uploadify唯一的缺点就是不支持中文按钮,杯具之前,我看了下Uploadify的API,才发现了几个参数没被大家提及的,这正是解决此问题的关键。(以后坚决养成没事就看API的习惯)
    Uploadify有一个参数是 buttonText 这个无论你怎么改都不支持中文,因为插件在js里用了一个转码方法把这个参数的值转过码了,解码的地方在那个swf文件里,看不到代码,所以这条路不行。
    另一个参数,网上很少提到,是 buttonImg( 按钮图片),这时你完全可以用一个图片来替换掉插件自带的那个黑色的flash浏览按钮,只要你自己的图片上是中文,这不就解决了中文按钮问题么?如果只加这一个,你会发现你的按钮图片下面有一片白色区域,其实就是那个flash留下的,白色区域表示鼠标可用范围,这个范围可以用width,height来调整。还有一个参数 wmode 它的默认值是opaque,把它改成transparent就行了,也就是把那片白色区域透明化。再用刚才说的方法,把按键点击范围设置成跟你图片一样大就完全OK了。
    ============================================
    Uploadify的用法就不说了,网上文章很多,跟别的jquery插件用法一样,就是几种文件的摆放路径而已。
    以下附上Uploadify部分参数的介绍,要看全部的就去看其API文件了,一般在下载的包里都有。
    uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后弹出打开文件对话框,默认值:uploadify.swf。
    script : 后台处理程序的相对路径 。默认值:uploadify.php
    checkScript :用来判断上传选择的文件在服务器是否存在的后台处理程序的相对路径
    fileDataName :设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata
    method : 提交方式Post 或Get 默认为Post
    scriptAccess :flash脚本文件的访问模式,如果在本地测试设置为always,默认值:sameDomain
    folder : 上传文件存放的目录 。
    queueID : 文件队列的ID,该ID与存放文件队列的div的ID一致。
    queueSizeLimit : 当允许多文件生成时,设置选择文件的个数,默认值:999 。
    multi : 设置为true时可以上传多个文件。
    auto : 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。
    fileDesc : 这个属性值必须设置fileExt属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileDesc为“请选择rar doc pdf文件”,打开文件选择框效果如下图:
    fileExt : 设置可以选择的文件的类型,格式如:’*.doc;*.pdf;*.rar’ 。
    sizeLimit : 上传文件的大小限制 。
    simUploadLimit : 允许同时上传的个数 默认值:1 。
    buttonText : 浏览按钮的文本,默认值:BROWSE 。
    buttonImg : 浏览按钮的图片的路径 。
    hideButton : 设置为true则隐藏浏览按钮的图片 。
    rollover : 值为true和false,设置为true时当鼠标移到浏览按钮上时有反转效果。
    width : 设置浏览按钮的宽度 ,默认值:110。
    height : 设置浏览按钮的高度 ,默认值:30。
    wmode : 设置该项为transparent 可以使浏览按钮的flash背景文件透明,并且flash文件会被置为页面的最高层。 默认值:opaque 。
    cancelImg :选择文件到文件队列中后的每一个文件上的关闭按钮图标
    Uploadify还自带了很多参数及有用的方法和回调函数,都在API里,虽然是全英文的,但很容易看懂,这里就不说了。
    以下是我用到的代码,可以参考一下:
    <script type=”text/javascript”>
    $(document).ready(function() {
    $(“#uploadify”).uploadify({
    ‘uploader’       : ‘images/uploadify.swf’,
    ‘script’         : ‘<%=request.getContextPath()%>/content/ImportScheduleCommitAction.do’,
    ‘cancelImg’      : ‘images/cancel.png’,
    ‘folder’         : ‘/’,
    ‘queueID’        : ‘fileQueue’,
    ‘fileDataName’   : ‘uploadify’,
    ‘fileDesc’       : ‘支持格式:xls.’,
    ‘fileExt’        : ‘*.xls’,
    ‘auto’           : false,
    ‘multi’          : true,
    ‘height’         : 20,
    ‘width’          : 50,
    ‘simUploadLimit’ : 3,
    //’buttonText’     : ‘fdsfdsf…’,
    ‘buttonImg’      : ‘images/browse.jpg’,
    // ‘hideButton’     : true,
    // ‘rollover’       : true,
    ‘wmode’          : ‘transparent’ ,
    onComplete       : function (event, queueID, fileObj, response, data)
    {
    $(‘<li></li>’).appendTo(‘.files’).text(response);
    },
    onError          : function(event, queueID, fileObj)
    {
    alert(“文件:” + fileObj.name + ” 上传失败”);
    }
    // onCancel         : function(event, queueID, fileObj)
    // {
    //     alert(“取消文件:” + fileObj.name);
    // }
    });
    <script type=”text/javascript”>
    $(document).ready(function() {
    $(“#uploadify”).uploadify({
    ‘uploader’       : ‘images/uploadify.swf’,
    ‘script’         : ‘<%=request.getContextPath()%>/content/ImportScheduleCommitAction.do’,
    ‘cancelImg’      : ‘images/cancel.png’,
    ‘folder’         : ‘/’,
    ‘queueID’        : ‘fileQueue’,
    ‘fileDataName’   : ‘uploadify’,
    ‘fileDesc’       : ‘支持格式:xls.’,
    ‘fileExt’        : ‘*.xls’,
    ‘auto’           : false,
    ‘multi’          : true,
    ‘height’         : 20,
    ‘width’          : 50,
    ‘simUploadLimit’ : 3,
    //’buttonText’     : ‘fdsfdsf…’,
    ‘buttonImg’      : ‘images/browse.jpg’,
    // ‘hideButton’     : true,
    // ‘rollover’       : true,
    ‘wmode’          : ‘transparent’ ,
    onComplete       : function (event, queueID, fileObj, response, data)
    {
    $(‘<li></li>’).appendTo(‘.files’).text(response);
    },
    onError          : function(event, queueID, fileObj)
    {
    alert(“文件:” + fileObj.name + ” 上传失败”);
    }
    // onCancel         : function(event, queueID, fileObj)
    // {
    //     alert(“取消文件:” + fileObj.name);
    // }
    });
    要注意的是,我的script属性值是一个请求路径,我发现在我设置了同时上传多个文件后(比如3),并不是每请求一次去上传3个文件,而仍然是执行3次请求,请求一次上传一个文件。这也没办法,uplodify有那么多回调函数,要是一次处理多个,那回调函数的参数就不知道拿哪个了,因为这些参数都不是数组。
    也就是说,无论你设置同时上传几个文件,它都会一个一个去请求并上传,只是表面上感觉好像有多个线程同时在处理上传请求一样,只是表象而已。而且如果你把simUploadLimit设置过大就会经常出错,我设置成5的时候经常会有一两个文件上传失败。
  • 不同的按钮提交到不同的页面去处理

    <script>// <![CDATA[
    function mod1()
    {
    document.form1.action=”modify.jsp”;
    document.form1.submit();
    }
    function mod2()
    {
    document.form1.action=”delete.jsp”;
    document.form1.submit();
    }
    // ]]></script>
    <form> <input onclick=”mod1()” type=”Button” value=”修 改 ” />
    <input onclick=”mod2()” type=”Button” value=”删 除 ” />
    </form>
  • 一些网页设计师的web引用

    图片取色
    http://www.degraeve.com/color-palette/
    在线绘制图表的工具
    http://www.drawanywhere.com/

  • 在Linux服务器上手工释放内存

    在Linux服务器上手工释放内存

    总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑。而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下。最后,还附上我对这方法的意见,欢迎各位一同讨论。

      当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。

      一、通常情况

      先来说说free命令:

      [root@server ~]# free -m

      total used free shared buffers cached

      Mem: 249 163 86 0 10 94

      -/+ buffers/cache: 58 191

      Swap: 511 0 511

      其中:

      total 内存总数

      used 已经使用的内存数

      free 空闲的内存数

      shared 多个进程共享的内存总额

      buffers Buffer Cache和cached Page Cache 磁盘缓存的大小

      -buffers/cache (已用)的内存数:used – buffers – cached

      +buffers/cache(可用)的内存数:free + buffers + cached

      可用的memory=free memory+buffers+cached

      有了这个基础后,可以得知,我现在used为163MB,free为86MB,buffer和cached分别为10MB,94MB。

      那么我们来看看,如果我执行复制文件,内存会发生什么变化.

      [root@server ~]# cp -r /etc ~/test/

      [root@server ~]# free -m

      total used free shared buffers cached

      Mem: 249 244 4 0 8 174

      -/+ buffers/cache: 62 187

      Swap: 511 0 511

      在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐,都被cached吃掉了。别紧张,这是为了提高文件读取效率的做法。

      为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

      那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?

      [root@server test]# free -m

      total used free shared buffers cached

      Mem: 249 244 5 0 8 174

      -/+ buffers/cache: 61 188

      Swap: 511 0 511

      似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)

      那么我能否手动释放掉这些内存呢?回答是可以的!

    二、手动释放缓存

      /proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:

      [root@server test]# cat /proc/sys/vm/drop_caches

      0

      首先,/proc/sys/vm/drop_caches的值,默认为0。

      [root@server test]# sync

      手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)

      [root@server test]# echo 3 > /proc/sys/vm/drop_caches

      [root@server test]# cat /proc/sys/vm/drop_caches

      3

      将/proc/sys/vm/drop_caches值设为3

      [root@server test]# free -m

      total used free shared buffers cached

      Mem: 249 66 182 0 0 11

      -/+ buffers/cache: 55 194

      Swap: 511 0 511

      再来运行free命令,会发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB。那么有效的释放了buffer和cache。

      ◎ 有关/proc/sys/vm/drop_caches的用法在下面进行了说明

      /proc/sys/vm/drop_caches (since Linux 2.6.16)

      Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.

      To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;

      to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

      to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.

      Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.

      三、我的意见

      上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较“直观”的回复,我更觉得有点像是核心开发小组的妥协。

      对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:

      1、从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL 4.x之前的版本都没有;

      2、若对于系统内存是否够用的观察,我还是原意去看swap的使用率和si/so两个值的大小;

      用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放?

      但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:

      -/+ buffers/cache: 58 191

      这才是系统可用的内存大小。

      实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。

      相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?

      所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。

      一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。

      当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。

      我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。而生产环境下的服务器可以不考虑手工释放内存,这样会带来更多的问题。记住内存是拿来用的,不是拿来看的。不像windows, 无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因,你们想想多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存。硬盘怎么会快过内存,所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少。如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准哦。当然这仅代表我个人意见,也欢迎大家来交流讨论。

  • CentOS 5.2下Memcache的安装与配置

    安装服务器端:
    1,安装libevent库,它将Linux的epoll、freebsd操作系统的kqueue等事件处理功能封装成统一的接口,memcached使用这个库,可以发挥其高性能。
    [root@youxia205 opt]# yum install libevent libevent-devel
    2,下载memcache源码包:
    [root@youxia205 opt]# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
    3,解压、编译、安装:
    [root@youxia205 opt]# tar -zxvf memcached-1.4.5.tar.gz
    [root@youxia205 opt]# cd memcached-1.4.5
    [root@youxia205 memcached-1.4.5]# ./configure
    [root@youxia205 memcached-1.4.5]# make && make install
    4,安装完成之后可以看下memcache的参数:
    [root@youxia205 local]# memcached -help
    memcached 1.4.5
    -p <num>      TCP port number to listen on (default: 11211)
    -U <num>      UDP port number to listen on (default: 11211, 0 is off)
    -s <file>     UNIX socket path to listen on (disables network support)
    -a <mask>     access mask for UNIX socket, in octal (default: 0700)
    -l <ip_addr>  interface to listen on (default: INADDR_ANY, all addresses)
    -d            run as a daemon
    -r            maximize core file limit
    -u <username> assume identity of <username> (only when run as root)
    -m <num>      max memory to use for items in megabytes (default: 64 MB)
    -M            return error on memory exhausted (rather than removing items)
    -c <num>      max simultaneous connections (default: 1024)
    -k            lock down all paged memory.  Note that there is a
    limit on how much memory you may lock.  Trying to
    allocate more than that would fail, so be sure you
    set the limit correctly for the user you started
    the daemon with (not for -u <username> user;
    under sh this is done with ‘ulimit -S -l NUM_KB’).
    -v            verbose (print errors/warnings while in event loop)
    -vv           very verbose (also print client commands/reponses)
    -vvv          extremely verbose (also print internal state transitions)
    -h            print this help and exit
    -i            print memcached and libevent license
    -P <file>     save PID in <file>, only used with -d option
    -f <factor>   chunk size growth factor (default: 1.25)
    -n <bytes>    minimum space allocated for key+value+flags (default: 48)
    -L            Try to use large memory pages (if available). Increasing
    the memory page size could reduce the number of TLB misses
    and improve the performance. In order to get large pages
    from the OS, memcached will allocate the total item-cache
    in one large chunk.
    -D <char>     Use <char> as the delimiter between key prefixes and IDs.
    This is used for per-prefix stats reporting. The default is
    “:” (colon). If this option is specified, stats collection
    is turned on automatically; if not, then it may be turned on
    by sending the “stats detail on” command to the server.
    -t <num>      number of threads to use (default: 4)
    -R            Maximum number of requests per event, limits the number of
    requests process for a given connection to prevent
    starvation (default: 20)
    -C            Disable use of CAS
    -b            Set the backlog queue limit (default: 1024)
    -B            Binding protocol – one of ascii, binary, or auto (default)
    -I            Override the size of each slab page. Adjusts max item size
    (default: 1mb, min: 1k, max: 128m)
  • svn的安装与远程备份

    svn的安装与远程备份

  • linux下 A服务器到B服务器(远程)备份

    linux下 A服务器到B服务器(远程)备份
    一个示例脚本
    A:首先手动备份一个目录压缩成一个tar.gz
    写一个执行脚本
    #! /bin/sh
    rm /var/www/备份源文件_bak.tar.gz
    tar -cvzf /var/www/备份源文件_bak.tar.gz /var/www/源文件夹
    rq=`date +%Y%m%d` 生成当前日期
    scp /var/www/备份源文件_bak.tar.gz root@XXX.XXX.XXX.XXX:/var/wiki_copy/备份新名称i$rq.tar.gz
    scp命令 从A服务器拷贝文件到B服务器(XXX.XXX.XXX.XXX)