svn添加钩子hooks并解决hooks速度慢。

前几天安装好了SVN,然后想要提交之后直接放到web目录中,可以直接通过web访问页面效果。于是知道了有钩子这么个东西。
假设已经有了svn project,我们需要做一下操作:

  • 在web目录里面checkout对应的代码文件
  • 创建钩子模板并赋予执行权限
  • 敲入钩子文件的内容
  1. checkout代码的文件
    在web目录下创建网站对应的文件夹,我这里直接给文件夹命名为svn,并且checkout

    mkdir /home/wwwroot/svn 
    cd /home/wwwroot/svn
    svn checkout svn://127.0.0.1 ./
    

    完成以后目录下会多了.svn的隐藏文件夹

  2. 创建钩子
    在创建好svn project之后会有如下目录结构。我们的钩子就存放在hooks里面。

    svn目录

    我们需要做下面步骤:

    代码如下:

    cd hooks
    cp post-commit.tmpl post-commit #拷贝一个钩子模板
    chmod 777 post-commit #赋予可执行权限
    vim post-commit
    
  3. 编辑钩子文件
    找到/svn/svntest/hooks/post-commit,
    进入到post-commit编辑状态后,我们最好把里面的内容都给注释。然后敲入以下代码:

    #!/bin/sh
    SVN=/usr/bin/svn #svn执行文件所在的文件夹
    WEB=/home/wwwroot/svn #svn项目所在目录
    LOG_PATH=/svn/svntest/svn_hook.log #我们定义的一个log文件
    echo "------------Start Commit -----------" >> $LOG_PATH
    echo "Time:"`date '+%Y-%m-%d %T'`>>$LOG_PATH #这里是在日志中写入执行的时间
    cd $WEB
    for dir in 'svnlook dirs-changed /svn/svntest'  #查找有修改过的文件,并将修改过的内容部署到web目录
    do
            #下面一句执行update命令
            $SVN  update $WEB --username "aoxiang" --password "aoxiang" >> $LOG_PATH 
    done
    echo "------------Commit End---------------" >>$LOG_PATH
    

    这里解释一下代码:
    我在部署完钩子之后,发现有一个问题:

    在本地commit 到服务器以后,速度都很快显示100%,但是进度条会一直卡在最后不动很长时间。

    我的项目大概400MB,当时就怀疑是钩子的原因,导致commit速度下降。
    最后找到方法:

    先找到有修改的目录,然后将修改的内容部署到web目录,这样就不会把整个项目部署到web目录

    for dir in 'svnlook dirs-changed /svn/svntest' 
    do
        #这里是要执行的代码
    done
    

    svnlook dirs-changed命令用来找打修改过内容的目录

    下面一句就相当于是在我们对应的svn的目录里面执行了update命令

    $SVN update -N $WEB --username "aoxiang" --password "aoxiang" >> $LOG_PATH

以上基本上就ok了。今天主要被上传速度困扰了一天。后来找到方法先检查修改的文件后,顿时就搞定了

Centos 安装SVN服务器

之前一直想搭Git服务器,搭了好久没有搭好。后来还是选择搭SVN了。代码丢上来

  1. 检查已安装版本 
    #检查是否安装了低版本的SVN
    rpm -qa subversion
    #卸载旧版本SVN
    [root@localhost modules]# yum remove subversion
    
  2. 安装SVN
    yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql
  3. 确认已安装了SVN模块
    cd /etc/httpd/modules
    ls | grep svn
    #会返回以下内容
    #mod_authz_svn.so
    #mod_dav_svn.so
    
  4. 验证安装
    检验已经安装的SVN版本信息

    svnserve --version

    返回以下内容:

  5. 创建代码库
    SVN软件安装完成后还需要建立SVN库

    mkdir -p /svn/web
    svnadmin create /svn/web
    

    执行上面的命令后,自动建立web库,查看/svn/web 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

  6. 配置代码库-设置SVN用户名及密码
    进入上面生成的文件夹conf下,进行配置

    cd /svn/svn/conf
    #用户密码passwd配置 
    
    规则如下username=password
  7. 权限控制-authz
    这里是设置用户访问权限、访问目录。

    vi authz
    #设置[/]代表根目录下所有的资源
    #rw是读写权限
    [/]
    aoxiang=rw
    
  8. 服务svnserve.conf配置
    vi svnserve.conf
    #追加以下内容
    [general]
    #匿名访问的权限,可以是read,write,none,默认为read
    anon-access=none
    #使授权用户有写权限
    auth-access=write
    #密码数据库的路径
    password-db=passwd
    #访问控制文件
    authz-db=authz
    #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
    realm=/svn/web
    
  9. 配置防火墙端口
    vi /etc/sysconfig/iptables
    #添加以下内容:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
    #保存后重启防火墙 
    service iptables restart
    
  10. 启动SVN
    svnserve -d -r /svn/web
  11. 查看SVN进程
    ps -ef|grep svn|grep -v grep
    #返回一下信息:
    #root     12538     1  0 14:40 ?        00:00:00 svnserve -d -r /opt/svn/repositories
    
  12. 检测SVN 端口
    netstat -ln |grep 3690
    #返回一下信息:
    #tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN
    
  13. 停止重启SVN
    killall svnserve    //停止 
    svnserve -d -r /svn/web  // 启动 
    

centos安装memcache

这两天搞定了nginx+php+mysql+svn,最后一个就是memcache了。准备这几项都搞定了以后,着手开始重写博客。

因为,妈蛋看了半年前自己用CI写的博客的代码,都在想“我次奥,我当时怎么会写出这么垃圾的代码!!!”

memcache分为服务器端和PHP扩展,所以我们是需要分两块进行安装的。

  1. 下载相关组件。
    这里是下载服务器端用的组件,memcached和libevent,libevent是用于做Socket处理,其他的我也不清楚具体怎么。
    memcached:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
    libevent:http://www.monkey.org/~provos/libevent-1.3.tar.gz
    附上libevent官网:http://www.monkey.org/~provos/libevent/

    这里有我在百度盘留存的一份可供下载“libevent+memcached下载

    mkdir /opt/memcached
    cd /opt/memcached/
    wget http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
    
    mkdir /opt/libevent
    cd /opt/libevent
    wget http://www.monkey.org/~provos/libevent-1.3.tar.gz
    
  2. 安装libevent
    tar zxvf libevent-1.3.tar.gz
    cd libevent-1.3
    ./configure –prefix=/usr
    make
    make install
    
  3. 测试libevent安装是否成功
    ls -al /usr/lib | grep libevent

    反馈如下

    libevent安装测试

  4. 安装服务器端memcached
    cd /opt/memcached
    tar zxvf memcached-1.2.2.tar.gz
    cd memcached-1.2.2
    ./configure –with-libevent=/usr
    make
    make install
    
    

    如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
    反正我是一路正常的走下来,没有发现有报错的情况
    安装完成后会把memcached放到 /usr/local/bin/memcached

  5. 测试是否安装成功
    ls -al /usr/local/bin/mem*
    

    反馈如下

    memcached安装反馈

继续阅读

Centos编译安装Nginx+php+Mysql

配过很多次服务器,一直都是在用lnmp的一键包。最近因为一直在玩Linux,所以试着自己编译安装Nginx、php、mysql、memcache。今天按照网上的找到的一篇教程,试着安装了一遍nginx+php+mysql。
下面把命令丢上来存档用。

  1. 配置防火墙,开启80端口、3306端口
    vi /etc/sysconfig/iptables 

    将下面两句丢在22端口下面

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
    
  2. 关闭SELINUX
    vi /etc/selinux/config
    #SELINUX=enforcing #注释掉
    #SELINUXTYPE=targeted #注释掉
    SELINUX=disabled #增加
    

    并重启系统

    reboot -n
  3. 系统约定这里我们自行约定软件包、编译安装位置如下。(后续命令会按照约定的目录来键入)

    1、软件源代码存放位置:/usr/local/src
    2、源码包编译安装位置:/usr/local/src/软件名字

  4. 下载软件下载nginx(目前稳定版)http://nginx.org/download/nginx-1.5.13.tar.gz下载pcre(支持nginx伪静态)http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre-8.35.tar.gz下载MySQL http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.37.tar.gz

    下载php http://ar2.php.net/get/php-5.5.10.tar.gz/from/this/mirror

    下载cmake(MySQL编译工具) http://www.cmake.org/files/v2.8/cmake-2.8.8.tar.gz

    下载libmcrypt(PHPlibmcrypt模块)
    http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz

    在天朝有时候可能访问不了sf等其他站点。这里我把我的软件包上传在百度云,可供大家下载。http://pan.baidu.com/s/1pJHUITH

    下载好以后,按照前文约定的目录树如下:

    nginx+mysql+php+cmake+pcre+libmcrypt目录树

    nginx+mysql+php+cmake+pcre+libmcrypt目录树


    继续阅读

Ubuntu默认root登陆

据说Ubuntu后面发行的版本,默认都不想允许以root登陆桌面。做一位一名幼猿,在搞不清权限的情况下,决定还是直接拿root作为默认登陆
那么命令来了

cd /usr/share/lightdm/lightdm.conf.d/
vim 50-unity-greeter.conf
#添加下面这一句
greeter-show-manual-login=true

重启ubuntu
搞定

ubuntu默认以root登陆

ubuntu默认以root登陆


ubuntu默认以root登陆

ubuntu默认以root登陆

Ubuntu vi/vim 上下左右变ABCD问题解决方法

这两天准备玩Linux,本来装了centos,后来因为centos上用sublime输入中文很麻烦,又的去解决这个那个。就干脆装了ubuntu

在ubuntu上用vim编辑代码的时候,上下左右键变成了ABCD啊我去
百度了一下解决方法

错误问题:vi上下左右键显示为ABCD的问题

sudo apt-get install vim

搞定

Ubuntu vi/vim 上下左右变ABCD问题解决方法

Ubuntu vi/vim 上下左右变ABCD问题解决方法

Centos下安装Sublime

一直以来写代码用的都是notepad++,最近看好多用Mac和Linux的人都在用Sublime,考虑到以后可能会经常要用到Linux,所以也想这换成sublime熟悉熟悉,在window平台安装好sublime后,觉得配色啊什么的还是蛮好看的。这几天在公司在办公室准备搞个小服务器。我机器里也撞了个虚拟机,所以这两天在玩Centos。

下面记录下安装Sublime

  1. 下载Sublime我是直接进入链接http://www.sublimetext.com/2然后下载对应版本的。
  2. 解压在我的机器里面,我放在根目录/tmp文件夹
    cd /tmp
    tar -jxvf Sublime Text 2.0.1.tar.bz2 -C /opt/
    

    这两条命令是把sublime安装包里面的文件解压到/opt文件夹下

  3. 将”应用程序”放到/usr/bin下面
    ln -s /opt/Sublime\ Text\ 2/sublime_text /usr/bin/sublime

    这一步相当于我们在window下,将一个应用程序.exe放入到c:\windows\system32文件夹,然后就可以通过cmd直接执行。
    我们把应用程序“sublime_text”放到/usr/bin文件夹下,并命名为sublime,就可以在任何情况下运行sublime+文件名去通过sublime编辑文件,类似于 vim index.html

编程能力层次模型

前言

程序员的编程技能随着经验的积累,会逐步提高。我认为编程能力可以分为一些层次。

下面通过两个维度展开编程能力层次模型的讨论。

一个维度是编程技能层次,另一个维度是领域知识层次。

编程技能层次

编程技能层次,指的程序员设计和编写程序的能力。这是程序员的根本。

0段—非程序员:

初学编程者,遇到问题,完全是懵懵懂懂,不知道该怎么编程解决问题。也就是说,还是门外汉,还不能称之为“程序员”。计算机在他面前还是一个神秘的黑匣子。

1段—基础程序员:

学习过一段时间编程后,接到任务,可以编写程序完成任务。

编写出来的代码,正常情况下是能够工作的,但在实际运行中,碰到一些特殊条件就会出现各类BUG。也就是说,具备了开发Demo软件的能力,但开发的软件真正交付给客户使用,恐怕会被客户骂死。

程序员程序是写好了,但到底为什么它有时能正常工作,有时又不行,程序员自己也不知道。

运行中遇到了bug,或者需求改变,需要修改代码或者添加代码,很快程序就变得结构混乱,代码膨胀,bug丛生。很快,就连最初的开发者自己也不愿意接手维护这个程序了。

2段—数据结构:

经过一段时间的编程实践后,程序员会认识到“数据结构+算法=程序”这一古训的含义。他们会使用算法来解决问题。进而,他们会认识到,算法本质上是依附于数据结构的,好的数据结构一旦设计出来,那么好的算法也会应运而生。

设计错误的数据结构,不可能生长出好的算法。

记得某一位外国先贤曾经说过:“给我看你的数据结构!”

3段—面向对象:

再之后,程序员就会领略面向对象程序设计的强大威力。大多数现代编程语言都是支持面向对象的。但并不是说,你使用面向对象编程语言编程,你用上了类,甚至继承了类,你就是在写面向对象的代码了。

我曾经见过很多用Java,Python,Ruby写的面向过程的代码。

只有你掌握了接口,掌握了多态,掌握了类和类,对象和对象之间的关系,你才真正掌握了面向对象编程技术。

就算你用的是传统的不支持面向对象的编程语言,只要你心中有“对象”,你依然可以开发出面向对象的程序。

如,我用C语言编程的时候,会有意识的使用面向对象的技巧来编写和设计程序。用struct来模拟类,把同一类概念的函数放在一起模拟类。如果你怀疑用C语言是否能编写出面向对象的代码,你可以看一下Linux内核,它是用C语言编写的,但你也可以看到它的源代码字里行间散发出的浓浓的“对象”的味道。

真正掌握面向对象编程技术并不容易。

在我的技术生涯中,有两个坎让我最感头疼。

一个坎是Dos向Windows开发的变迁过程中,框架的概念,很长一段时间我都理解不了。Dos时代,都是对函数库的调用,你的程序主动调用函数。Windows时代,则换成了框架。就算是你的main程序,其实也是被框架调用的。UI线程会从操作系统获取消息,然后发送给你的程序来处理。Java程序员熟悉的Spring框架,也是这样一个反向调用的框架。

现在因为“框架”这个术语显得很高大上,因此很多“类库”/“函数库”都自称为“框架”。在我看来这都是名称的滥用。

“类库”/“函数库”就是我写的代码调用它们。

“框架”就是我注册回调函数到框架,框架来调用我写的函数。

另一个坎就是面向对象。很长一段时间我都不知道应该怎么设计类和类之间的关系,不能很好的设计出类层次结构来。

我记得当时看到一本外国大牛的书,他讲了一个很简单、很实用的面向对象设计技巧:“叙述问题。然后把其中的名词找出来,用来构建类。把其中的动词找出来,用来构建类的方法”。虽然这个技巧挺管用的,但也太草根了点,没有理论依据,也不严谨。如果问题叙述的不好,那么获得的类系统就会是有问题的。

掌握面向对象思想的途径应该有很多种,我是从关系数据库中获得了灵感来理解和掌握面向对象设计思想的。

在我看来,关系数据库的表,其实就是一个类,每一行记录就是一个类的实例,也就是对象。表之间的关系,就是类之间的关系。O-Rmapping技术(如Hibernate),用于从面向对象代码到数据库表之间的映射,这也说明了类和表确实是逻辑上等价的。

既然数据库设计和类设计是等价的,那么要设计面向对象系统,只需要使用关系数据库的设计技巧即可。

关系数据库表结构设计是很简单的:

1、识别表和表之间的关系,也就是类和类之间的关系。是一对一,一对多,多对一,还是多对多。这就是类之间的关系。

2、识别表的字段。一个对象当然有无数多的属性(如,人:身高,体重,性别,年龄,姓名,身份证号,驾驶证号,银行卡号,护照号,港澳通行证号,工号,病史,婚史etc),我们写程序需要记录的只是我们关心的属性。这些关心的属性,就是表的字段,也就是类的属性。“弱水三千,我取一瓢饮”!

4段—设计模式:

曾经在网上看到这样一句话:“没有十万行代码量,就不要跟我谈什么设计模式”。深以为然。

记得第一次看Gof的设计模式那本书的时候,发现虽然以前并不知道设计模式,但在实际编程过程中,其实还是自觉使用了一些设计模式。设计模式是编程的客观规律,不是谁发明的,而是一些早期的资深程序员首先发现的。

不用设计模式,你也可以写出满足需求的程序来。但是,一旦后续需求变化,那么你的程序没有足够的柔韧性,将难以为继。而真实的程序,交付客户后,一定会有进一步的需求反馈。而后续版本的开发,也一定会增加需求。这是程序员无法回避的现实。

写UI程序,不论是Web,Desktop,Mobile,Game,一定要使用MVC设计模式。否则你的程序面对后续变化的UI需求,将无以为继。

设计模式,最重要的思想就是解耦,通过接口来解耦。这样,如果将来需求变化,那么只需要提供一个新的实现类即可。

主要的设计模式,其实都是面向对象的。因此,可以认为设计模式是面向对象的高级阶段。只有掌握了设计模式,才能认为是真正彻底掌握了面向对象设计技巧。

我学习一门新语言时(包括非面向对象语言,如函数式编程语言),总是会在了解了其语法后,看一下各类设计模式在这门语言中是如何实现的。这也是学习编程语言的一个窍门。

5段–语言专家:

经过一段时间的编程实践,程序员对某一种常用的编程语言已经相当精通了。有些人还成了“语言律师”,擅长向其他程序员讲解语言的用法和各种坑。

这一阶段的程序员,常常是自己所用语言的忠实信徒,常在社区和论坛上和其他语言的使用者争论哪一种语言是最好的编程语言。他们认为自己所用的语言是世界上最好的编程语言,没有之一。他们认为,自己所用的编程语言适用于所有场景。他们眼中,只有锤子,因此会把所有任务都当成是钉子。

继续阅读

离开了WM

是该写一篇记录一下近况了,真该!因为我换工作了。

1.12号离开新余,来到南昌,离开WM,意味着两年时间在零售业的职业生涯结束了。一开始就是冲着薪水和弯曲进入互联网这两个目的来到现在所在的公司的。现在到公司差不多正好一个月,觉得很乱。从组织架构、员工关系、岗位职能、团队协作各个方面都觉得不是很理想。我也向老板提过这个问题,老板也当场口头上提过有所认同,但是却没有付出多少实际行动,至此将近半个月过去了,还是没有任何动静。

临近年关,正好也借此文写写在WM近两年来的得失吧。有两个人我觉得特别要写:

  1. 舅妈

    为什么要写舅妈,原因在之前的文章《做到极致可以是一种习惯》可以看到为毛。我觉得在她身上看到的这点,算是我这两年最大的收获之一。

  2. 东哥

    为什么要提东哥。其实我的意思是想说明经验的重要性。记得之前有一次开会。
    东哥提问说:“鲜食大概卖了多少钱……”。
    当时鲜食的主管不看morning report也不清楚。
    但是东哥说:“我不看报告我也知道,一般正常的店鲜食大概占全店20%左右。我们月至今销售60W,显示销售大概12W……”。原话记不大清楚,大概是这样的意思。
    这件事情我印象非常深刻,一个是数据,一个就是经验。数据可以说明很多问题,经验可以让你知道一个数据而了解很多数据。那么在现在这家公司,很多都是没有做过零售的人。
    大老板算销售额居然是:“一个小区住户大概1500户,一户人家每天消费大概60块。所以我们一家店销售额每天9W左右……”
    所以我经常会想,如果东哥在这里做老大,这里不会是这个样子。

  3. 珠珠

    我也不知道为什么要提到珠珠,也许是觉得那次请珠珠、大熊、金金、gong超吃饭的时候,珠珠临时加班到晚上八点才下班赴约。后来她告诉我们,下班时候她老板临时告诉她最迟明天要把这项任务做完,于是她当天就做完,并交给已经下班的老板。
    她只比我大两岁,但是她在公司影响力、朋友圈比我强大得多。其实这也是跟舅妈身上一样的品质。只是我觉得她是同龄人,我会很有紧迫感。

  4. 舒大

    舒大是所有S级里面唯一一个会跟我们混的人,我觉得他还是有一个年轻的心。在他身上看到了太多“撸起袖子干”的例子,晚上睡觉了,老板一个电话就爬起床凌晨一点去公司,这点我是实在做不到的。加班到深夜更是家常便饭,我觉得他对我影响最大的就是

    • 执行力强
    • 加班

    我记得2525#开业的时候,舒大经常加班到深夜还在我们群里发消息。每次看到他的消息,我都会想,人家S级都这样拼,我还这个卵样子…而且经常公司有政策要执行、老板有要求提出来,他的反应都非常快立即执行下去。在现在这家公司,执行力非常差。
    还记得舒大说过两句话:

    • 方法永远比困难多
    • 要么撸起袖子干,要么收拾包袱滚

    第二条也是我的性格,我也不是一个喜欢多说废话的人,决定了就干。现在公司太多人太多的负面情绪,总在说一些无意义的话,真的也很想跟他们说“要么撸起袖子干,要么收拾包袱滚”

    其实清玉、大雄、加总等等这些人都有给过我感触,有过我觉得要向其学习的地方,只是有些不知道该怎么表达,有些这一下子也想不起来。

  5. 执行力

    WM真的是一家执行力非常强的企业,可能总裁一句话,5分钟内就能传达到全国400多家店每一个管理层耳中。并且能够得到立即执行。不得不佩服大家训练出来的这样一种默契。觉得非常有必要的是得带入到现在所在的企业。我觉得现在公司很多人都是在推脱工作,工作氛围也一点都不紧张,闲得慌。过段时间我真的是要换工作了。环境太差。

一下子也就想得起来这些东西了。先这样吧,如果后面有想起来什么,再补上。

HTML5 Geolocation 获取地理位置

周四回家了一趟,其实发现火车上看书是一件很好的事情。我在书《HTML5 高级程序设计》中看到通过Geolocation获取地理位置,大概是一个测量运动距离的简单例子。立马来了兴趣,今天简单的实现了获取地理位置并显示到地图。

HTML5 Geolocation 获取地理位置

HTML5 Geolocation 获取地理位置

Geolocation是HTML5获取地理位置的一个API。整理书中资料和百度的资料。获取地理位置有4种方法

  1. GPS
  2. IP地址
  3. GSM\CDMA等网络基站
  4. 已知的WIFI的MAC地址

这四种方法都是我们立马能理解的。

  • IP地址在我们日常使用的情况下只能精确到城市、片区。
  • GSM\CDMA这些网络是根据三大运营商的基站来定位的,基站很多街道都有,相对IP地址来说更准确一些。
  • WIFI的MAC地址,反正到现在我没遇上过。我认为这个是要依托大数据为基础,才能做到精确。

我在书中看到的Geolocation的方法,是使用GPS的。程序会先发出希望使用地理位置的请求,需要用户同意。废话不多说,代码上:

继续阅读