开始把vim当做vim来使用

一直将vim当作vi来用,也要稍作深入挖掘一下vim的功能来提高用vim做编辑器的工作效率了。

按照手把手教你把Vim改装成一个IDE编程环境 的介绍首先对vim的tags使用稍作尝试。
配合 Ctl-] 和 Ctl-O 的使用在函数间来回跳转,感觉很方便,不用再来回查找了。

一口吃不成胖子,先熟悉一下vim的一般命令和快捷键使用,然后在继续文章介绍的内容向下深入。

补一篇vim: lightning fast navigation in a large software project

Popularity: 23% [?]

Random Posts

在shell脚本中通过sendmail做邮件通知发送

根据Web日志做了一个简单的分析功能用以弥补一下Awstats日志分析的一些不足。
做了一个crontab将每天分析的结果发送出来。

  1. #param $1 the file name that contain message to send
  2. #param $2 message title
  3. #param $3 to mail box
  4. #param $4 from mail box
  5. function do_send_mail()
  6. {
  7.   local emailname=$3
  8.   local email=$3
  9.   local fromname=$4
  10.   local from=$4
  11.   local subject=$2
  12.   local messagebody=$1
  13.   echo -e "To:  \"${emailname}\" <${email}>\nFrom: \"${fromname}\" <${from}>\nSubject: ${subject}\n\n`cat ${messagebody}`" |
  14. /usr/sbin/sendmail -t
  15. }

使用时,将要发送的消息保存到文件中,然后调用上面的脚本。
比如我要将以support@sunnyu.com的身份将消息 hello 发送给 test@sunnyu.com,可以像下面这样使用。

  1.  echo "hello" > /tmp/tmpmail.tmp
  2.  do_send_mail /tmp/tmpmail.tmp hello test@sunnyu.com support@sunnyu.com
  3.  rm /tmp/tmpmail.tmp

刚看了一下Awstats的说明,他可以做一些功能扩展,接下来要研究一下将做的分析补充到 awstats 界面中,这样就不用发邮件出来了。

Popularity: 22% [?]

Random Posts

SEO Elite 做SEO 分析的一个好工具

SEO Elite 是一款优秀的反向链接分析工具,能分析网站反向链接各个因素,包括链接文字、链接页面PR、链接页面的外部链接、链接质量分析……总之一切非页面因素都能分析清楚,是SEO必备之工具之一。
SEO Elite 公司的网站,评价很高,不过价钱不便宜,打折后要 $167。找了半天没有找到试用的下载地址,只有购买地址。
网上搜了一下发现有破解,于是乎下在一个下来研究一下。

网上的一篇使用教程利用SEO Elite分析Google排名第一的网站

Popularity: 32% [?]

Related

给SPHINX做增量索引更新

Sphinx+LibMMSeg搭建中文全文搜索引擎_安装配置中安装试验了Sphinx 的使用,但是还有几方面的问题有待处理。

本篇主要是对动态增量更新的一些研究。关于分词数据的建立和前端界面的控制将在以后研究。

在利用 Sphinx 做搜索引擎的时候,一般他的索引建立构成有如下几个部分:

在实际操作中,需要需要为增量索引的建立创建辅助表,这样才可以记住最后建立索引的记录ID,做实际的增量部分的索引建立。

CREATE TABLE search_counter
  1. (
  2.    counterid INTEGER PRIMARY KEY NOT NULL,
  3.    max_doc_id INTEGER NOT NULL
  4. );

在主索引的数据源中作如下方式的取数据设置

sql_query_pre = SET NAMES utf8
  1.     sql_query_pre            = SET SESSION query_cache_type=OFF
  2.     sql_query_pre            = REPLACE INTO search_counter \
  3.         SELECT 1,MAX(pid) FROM cdb_posts  #创建主索引前更改标识位置
  4.     sql_query                 = \
  5.                 SELECT pid, fid,tid,authorid, dateline, \
  6.                 subject, message \
  7.                 FROM cdb_posts \
  8.                 WHERE pid &gt; $start AND pid &lt;= $end
  9.  
  10.     sql_query_range          = SELECT 1, max_doc_id FROM search_counter WHERE counterid = 1
  11.     sql_range_step            = 1000
  12.     sql_ranged_throttle      = 1000
  13.  
  14.     sql_query_info             = SELECT * FROM cdb_posts WHERE pid=$id

在增量索引的数据源中作如下方式的取数据设置

sql_query_pre = SET NAMES utf8
  1.     sql_query_pre            = SET SESSION query_cache_type=OFF
  2.     sql_query                 = \
  3.                 SELECT pid, fid,tid,authorid, dateline, \
  4.                 subject, message \
  5.                 FROM cdb_posts \
  6.                 WHERE pid &gt; \
  7.                  (SELECT max_doc_id FROM search_counter WHERE counterid=1)
  8.                  #增量索引是id大于标识位置的部分

在建立好配置后首先对sphinx中配置的全部索引做初始化

/usr/local/sphinx/bin/indexer –config –all /usr/local/sphinx/etc/sphinx.conf
  1. </pre>
  2. 为创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)
  3. <ul>
  4.  <li>1.创建主索引脚本build_main_index.sh</li>
  5. <pre lang="bash">#!/bin/sh
  6. /usr/local/sphinx/bin/searchd –stop&gt;&gt; /var/log/sphinx/searchdlog
  7. /usr/local/sphinx/bin/indexer discuz –config /usr/local/sphinx/etc/sphinx.conf&gt;&gt; /var/log/sphinx/mainindexlog
  8. /usr/local/sphinx/bin/searchd&gt;&gt;/var/log/sphinx/searchdlog
  • 2.创建增量索引脚本build_delta_index.sh
  • #!/bin/sh
    1. /usr/local/sphinx/bin/searchd –stop &gt;&gt; /var/log/sphinx/searchdlog
    2. /usr/local/sphinx/bin/indexer discuz_delta –config /usr/local/sphinx/etc/sphinx.conf &gt;&gt; /var/log/sphinx/deltaindexlog
    3. #/usr/local/sphinx/bin/indexer –merge discuz discuz_delta –config /usr/local/sphinx/etc/sphinx.conf &gt;&gt; /var/log/sphinx/deltaindexlog
    4. /usr/local/sphinx/bin/searchd &gt;&gt; /var/log/sphinx/searchdlog

    在crontab 中添加定时脚本,按照自己期望的策略定期执行重建索引的操作。
    比如可以每天凌晨2点执行主索引重建,其他每10分钟建立一次增量索引重建。

    Popularity: 27% [?]

    Related

    使用Bitmap Collection tool未能生成mbg文件?

    在vs.net中使用carbide.vs的Bitmap Collection tool为测试程序添加了一个小图片,结果在输入日志中提示有mbm文件生成,可是在源码目录下找不到对应的 mbg 文件。是Bitmap Collection tool没有生成mbg文件吗?
    看到输出日志中提示mbm文件是生成到sdk目录下的,想mbg是不是也会在sdk目录下呢?于是在sdk目录下搜索.mbg文件,发现在epoc32\include目录下还真的有。打开查看,发现其中定义了枚举量,和自己的文件名有对应关系。
    因为epoc32\include已经在工程中包含,所以按照命名的规则放心大胆的在工程中 #include 进来。然后代码中使用图片资源定义常量。

    Popularity: 27% [?]

    Related

    Symbian 程序运行碰到 KERN-EXEC 3异常问题

    编译的测试程序在模拟器上运行。出现 KERN-EXEC 3异常。
    分析代码,使用的功能很简单,只是创建一个 TDesC * 实例,使用后去 delete 释放了一下。
    看了一下代码觉得没有问题,但是事实是出错了,对出错原因不明。
    于是网上搜了一下,发现一篇 Symbian C++开发,误用NewLC导致的KERN-EXEC 3异常对照这比了一下,发现自己的还确实有问题,稍作代码调整,问题消失。
    编写代码尽量按照nokia建议的多使用 PushL, Pop, PopAndDestory 等方法来做资源的释放管理。

    Popularity: 28% [?]

    Related

    Symbian模拟器的 Cannot start ECMT Manager问题解决

    打开Symbian的epoc模拟器,看着菜单上的几个项目,比如 Tools > Preferences 每次选择后过一会就提示
    Cannot start ECMT Manager“,于是到nokia的论坛搜了一下,发现不只我一个人碰到这个问题,已经有解答,就是默认安装的只找java的1.4和1.5(5.0)的,新出的Java是6.0了,程序没有去找,当作系统没有安装java了。
    在他的配置文件 \epoc32\tools\ecmt\config\config.properties 中,修改epdt.java.version.start将 1.6和6.0添加到列表中,再次在模拟器上打开菜单,发现设置界面正常出来了。

    Popularity: 28% [?]

    Related

    通过删除升级补丁给WinXP的C盘释放一些空间

    前次C盘空间不足,整理了后到现在不过两个月就又不停提示C盘空间不足了。
    为此问题不想重装系统只有看能不能再像前次一样将装到C盘的软件卸载掉以获得一些空间。
    经检查发现有几个java升级包,每个有近100MB,只留一个最新的就可以了。
    在控制面板中删除 JAVA 升级带来的3个多余的更新版,获得 约 300MB 空间。

    空间还是不够多,再看能不能将WinXP的一些无用系统文件做删除,用以释放一些空间。
    网上差了一下还真可以。
    删除 日韩输入法。在
    C:\WINDOWS\ime\IMJP8_1 目录
    和 C:\WINDOWS\ime\IMKR6_1 目录,获得73.5MB空间
    删除 XP 升级补丁的安装备份程序目录
    为 C:\Windows\$NtUninstall 打头的目录,获得 213MB 空间。

    经过这次整理获得了近 600MB 空间,希望可以多支持一段时间。

    Popularity: 28% [?]

    Random Posts

    MySQL定时增量备份的恢复处理脚本(mysqlbinlog)

    在通过 MySQL定时增量备份处理脚本备份了数据后,我们还需要做恢复操作的脚本。
    恢复起来相对简单,找到最近一天的数据或指定某天的数据,然后使用 mysqllogbin 根据日志做恢复处理。

    步骤1:复制基准的全量数据

    从备份目录下将最近备份的全量数据复制到工作目录下

    1. #!/bin/bash
    2.  
    3. PATH=/usr/local/sbin:/usr/bin:/bin
    4.  
    5. #get cur date str 2008-10-12
    6. DATE=`date -I`
    7. TIME=' 01:0:0'
    8. DAYSTARTTIME=" $DATE $TIME"
    9.  
    10. #set backup path info
    11. DATADIR="/var/lib/mysql"
    12. BAK_DIR="/backup/$DATE"
    13.  
    14. #set mysql user name and password
    15. MYSQL_USER="root"
    16. MYSQL_PWD="rootpwd"
    17. MYACC=" -u'$MYSQL_USER' -p'$MYSQL_PWD' "
    18.  
    19. cp -r $BAK_DIR $DATA_DIR

    步骤2:根据日志文件对基准数据做恢复

    对使用使用mysqlbinlog做数据的恢复。

    1.   HOST=`hostname -s`
    2.  
    3.   for binfile in `ls $DATA_DIR/$HOST-bin.0* |sort`; do
    4.      CMD="mysqlbinlog –start-datetime='$DAYSTARTTIME' $binfile  | mysql $MYACC "
    5.      eval $CMD
    6.   done

    完整恢复脚本:

    1. #!/bin/bash
    2.  
    3. PATH=/usr/local/sbin:/usr/bin:/bin
    4.  
    5. #get cur date str 2008-10-12
    6. DATE=`date -I`
    7. TIME=' 01:0:0'
    8. DAYSTARTTIME=" $DATE $TIME"
    9.  
    10. #set backup path info
    11. DATADIR="/var/lib/mysql"
    12. BAK_DIR="/backup/$DATE"
    13.  
    14. #set mysql user name and password
    15. MYSQL_USER="root"
    16. MYSQL_PWD="rootpwd"
    17. MYACC=" -u'$MYSQL_USER' -p'$MYSQL_PWD' "
    18.  
    19. cp -r $BAK_DIR $DATA_DIR
    20.  
    21. HOST=`hostname -s`
    22.  
    23. for binfile in `ls $DATA_DIR/$HOST-bin.0* |sort`; do
    24.    RESTORECMD="mysqlbinlog –start-datetime='$DAYSTARTTIME' $binfile  | mysql $MYACC "
    25.    eval $RESTORECMD
    26. done

    Popularity: 28% [?]

    Related

    MySQL定时增量备份处理脚本

    在提出 MySQL主从结构灾难恢复策略机制设想 后尝试编写用于以上目的的备份脚本。

    增量日志备份

    每日一个全量备份,同时做binlog 的删减(只保留一个小时的日志,根据需要可以做延时),然后每小时对日志文件做增量部分的备份。

    1. #!/bin/bash
    2.  
    3. PATH=/usr/local/sbin:/usr/bin:/bin
    4.  
    5. #get cur date str 2008-10-12
    6. DATE=`date -I`
    7.  
    8. #set backup path info
    9. DATADIR="/var/lib/mysql"
    10. BASE_BAK_DIR="/backup"
    11. CUR_BAK_DIR="$BASE_BAK_DIR/current"
    12.  
    13. #set mysql user name and password
    14. MYSQL_USER="root"
    15. MYSQL_PWD="rootpwd"
    16. MYACC=" -u'$MYSQL_USER' -p'$MYSQL_PWD' "
    17.  
    18. #set backup type info
    19. INTERVAL="$1"
    20.  
    21. # days, files in base_bak_path
    22. # before this days will be deleted
    23. RETENTION=21
    24. #get host name (a part of bin log file names,
    25. #  if change set master bin file manual, need change this)
    26. HOST=`hostname -s`
    27.  
    28. #set mysql version
    29. MYVERSION="4.1"
    30.  
    31. if [ "$MYVERSION" = '4.1' ] || [ "$MYVERSION" = '5.0' ] ; then
    32.   #purge master logs to latest backup time (remain one hour bin log for slave replication delay)
    33.   PURGELOGS="mysql $MYACC -e \"PURGE MASTER LOGS BEFORE DATE_SUB( NOW(), INTERVAL 1 HOUR )\""
    34. else    
    35. echo "not support MYSql Ver $MYVERSION"
    36. exit 1
    37. fi
    38.        
    39. #check param input (daily or hourly)
    40. if [ ! $1 ];
    41. then    
    42.   read -p "Backup Interval? (Hourly|Daily) : " INTERVAL
    43. fi    
    44.  
    45. case $INTERVAL in
    46.   hourly | HOURLY | Hourly | H | h | 1 )
    47.   echo "Performing hourly level backup — `date`"
    48.   MYCMD="mysql $MYACC -e \"FLUSH LOGS\""
    49.   eval $MYCMD
    50.  
    51.   if [ -d $BASE_BAK_DIR/$DATE ] && [ "$MYVERSION" = '4.1' -o "$MYVERSION" = '5.0' ] ; then
    52.      rsync -aub $DATADIR/$HOST-bin.?????? $BASE_BAK_DIR/$DATE
    53.   else    
    54.      echo "dest dir not exists! please run daily backup first." 1>&2
    55.      exit 1
    56.   fi
    57.   exit 0
    58.   ;;
    59.  
    60.   daily | DAILY | Daily | D | d | 2 )
    61.   echo "Performing daily level backup — `date`"
    62.   # check dest path
    63.   if [ ! -d $CUR_BAK_DIR ]; then    
    64.      echo "Creating $CUR_BAK_DIR"
    65.      mkdir -p $CUR_BAK_DIR
    66.   fi
    67.  
    68.   MYCMD="mysqlhotcopy $MYACC –regexp=.* $CUR_BAK_DIR"
    69.   eval $MYCMD
    70.   chown -R mysql: $CUR_BAK_DIR/
    71.   mv $CUR_BAK_DIR $BASE_BAK_DIR/$DATE
    72.   eval $PURGELOGS
    73.  
    74.   #delete files that outdate
    75.   find $BASE_BAK_DIR -ctime +$RETENTION -exec rm -rf '{}' \;
    76.   exit 0
    77.   ;;
    78.  
    79.   * )
    80.   echo "Invalid Selection" 1>&2
    81.   exit 1
    82. esac

    可以在脚本的前面指定好备份目录参数

    DATADIR="/var/lib/mysql"
    BASE_BAK_DIR="/backup"
    CUR_BAK_DIR="$BASE_BAK_DIR/current"
    

    以及用来连接数据库的账号的参数

    #set mysql user name and password
    MYSQL_USER=”root”
    MYSQL_PWD=”rootpwd”

    通过参数 RETENTION=21 来指定备份文件保留的天数,要视具体用来做备份的磁盘大小和数据库大小做综合衡量处理。

    最后将脚本添加到crontab中定时运行
    首先设定每天备份一次的,然后再设定每小时的备份,其中第一次的每小时备份应该是在每天备份执行之后。
    数据库发生失败时的恢复在每日全量备份基础上通过日志文件快速恢复到最近时间的变化。

    Popularity: 38% [?]

    Related

    Next Page →