git多分支自动补全

1,下载安装一个git的脚本

git clone https://github.com/markgandolfo/git-bash-completion.git 
cp git-bash-completion/git-completion.bash ~/.git-completion.bash 
source ~/.git-completion.bash

2,修改~/.bashrc
增加以下内容
source ~/.git-completion.bash
3,最后
source ~/.bashrc
之后通过tab键就可以实现分支的自动补全了

[fisp]windows平台安装fisp

fis-plus 是扩展自FIS的前端集成解决方案。其提供 后端框架、前端框架、自动化工具、辅助开发工具等开发套件,被百度广泛应用

Windows安装fisp步骤
1, 安装nodejs
2, 安装 fis-plus: npm install –f fis-plus
3, 安装lights: npm install –g lights
4, 安装java (配置环境变量)
5, 安装php-cgi(配置环境变量)
这个步骤可以下载任何xampp或者wamp安装包
6, 操作 fisp server init
7, 下载demo 到www目录:https://github.com/fex-team/fis-plus-pc-demo
默认的www目录在C:\Users\will\AppData\Local\.fis-plus-tmp\www
8, 进入到www目录发布 fisp release –r comman ; fisp release –r home
9, fisp server start

完成!
fisp环境 还是很好安装的!

数据库的简单介绍

文章原地址:http://www.ruanyifeng.com/blog/2014/07/database_implementation.html
所有应用软件之中,数据库可能是最复杂的。
MySQL的手册有3000多页,PostgreSQL的手册有2000多页,Oracle的手册更是比它们相加还要厚。

但是,自己写一个最简单的数据库,做起来并不难。Reddit上面有一个帖子,只用了几百个字,就把原理讲清楚了。下面是我根据这个帖子整理的内容。
一、数据以文本形式保存
第一步,就是将所要保存的数据,写入文本文件。这个文本文件就是你的数据库。
为了方便读取,数据必须分成记录,每一条记录的长度规定为等长。比如,假定每条记录的长度是800字节,那么第5条记录的开始位置就在3200字节。
大多数时候,我们不知道某一条记录在第几个位置,只知道主键(primary key)的值。这时为了读取数据,可以一条条比对记录。但是这样做效率太低,实际应用中,数据库往往采用B树(B-tree)格式储存数据。
二、什么是B树?
要理解B树,必须从二叉查找树(Binary search tree)讲起。

二叉查找树是一种查找效率非常高的数据结构,它有三个特点。
(1)每个节点最多只有两个子树。
(2)左子树都为小于父节点的值,右子树都为大于父节点的值。
(3)在n个节点中找到目标值,一般只需要log(n)次比较。
二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。
B树是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。

这种数据结构,非常有利于减少读取硬盘的次数。假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。
三、索引
数据库以B树格式储存,只解决了按照”主键”查找数据的问题。如果想查找其他字段,就需要建立索引(index)。
所谓索引,就是以某个字段为关键字的B树文件。假定有一张”雇员表”,包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应第几条记录,然后再从表格中读取。
这种索引查找方法,叫做”索引顺序存取方法”(Indexed Sequential Access Method),缩写为ISAM。它已经有多种实现(比如C-ISAM库和D-ISAM库),只要使用这些代码库,就能自己写一个最简单的数据库。
四、高级功能
部署了最基本的数据存取(包括索引)以后,还可以实现一些高级功能。
(1)SQL语言是数据库通用操作语言,所以需要一个SQL解析器,将SQL命令解析为对应的ISAM操作。
(2)数据库连接(join)是指数据库的两张表通过”外键”,建立连接关系。你需要对这种操作进行优化。
(3)数据库事务(transaction)是指批量进行一系列数据库操作,只要有一步不成功,整个操作都不成功。所以需要有一个”操作日志”,以便失败时对操作进行回滚。
(4)备份机制:保存数据库的副本。
(5)远程操作:使得用户可以在不同的机器上,通过TCP/IP协议操作数据库。

Yii通过preload组件,使得https跳转到http

之前文章有涉及到http跳转到https的nginx跳转,这里是它的相反操作。
有时候网站并没有对https访问做到很好的支持,所以要让某些https的链接跳转到http.
对于Yii框架,可以利用preload这个组件,每次进入网站前先判断是否https安全链接,如果是安全链接则直接301跳转到相应的http页面。
一 配置config

'components' => array(
        'httpsRedirect' => array(
            'class' => 'HttpsRedirect',
        ),
),
'preload' => array(
        'httpsRedirect',
    )

二 添加HttpsRedirect类

<?php
/*
 * PC站https redirect
 * 请求到PC站的https 暂时301跳转到http
 */
class HttpsRedirect extends CComponent {
    
    public function init() {
        $request = Yii::app()->getRequest();
        if ($request->getIsSecureConnection() == false) {
        	return;
        }
        $host = $_SERVER['HTTP_HOST'];
        $uri  = $request->requestUri;
        switch($host) {
        	case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
        	default:                $flag = false;          
        }
        if($flag) {
            Header("HTTP/1.1 301 Moved Permanently");
            Header("Location: http://{$host}{$uri}");
        } 
    } 
}

这样就在php代码层面做到简单的https跳转到http啦。

nginx强制使用https访问的三种方法(http跳转到https)

原文:http://blog.csdn.net/wzy_1988/article/details/8549290

需求简介

基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转

我总结了三种方式,跟大家共享一下

nginx的rewrite方法

思路

这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可

配置

  1. server {
  2.     listen  192.168.1.111:80;
  3.     server_name test.com;
  4.     rewrite ^(.*)$  https://$host$1 permanent;
  5. }

搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了

nginx的497状态码

 

error code 497

  1. 497 – normal request was sent to HTTPS

解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码

思路

利用error_page命令将497状态码的链接重定向到https://test.com这个域名上

配置

  1. server {
  2.     listen       192.168.1.11:443;  #ssl端口
  3.     listen       192.168.1.11:80;   #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口
  4.     server_name  test.com;
  5.     #为一个server{……}开启ssl支持
  6.     ssl                  on;
  7.     #指定PEM格式的证书文件
  8.     ssl_certificate      /etc/nginx/test.pem;
  9.     #指定PEM格式的私钥文件
  10.     ssl_certificate_key  /etc/nginx/test.key;
  11.     #让http请求重定向到https请求
  12.     error_page 497  https://$host$uri?$args;
  13. }

index.html刷新网页

 

思路

上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转
可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://test.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转

index.html

  1. <html>
  2. <meta http-equiv=”refresh” content=”0;url=https://test.com/”>
  3. </html>

nginx虚拟主机配置

  1. server {
  2.     listen 192.168.1.11:80;
  3.     server_name test.com;
  4.     location / {
  5.                 #index.html放在虚拟主机监听的根目录下
  6.         root /srv/www/http.test.com/;
  7.     }
  8.         #将404的页面重定向到https的首页
  9.     error_page  404 https://test.com/;
  10. }

后记

上述三种方法均可以实现基于nginx强制将http请求跳转到https请求,大家可以评价一下优劣或者根据实际需求进行选择。

【转】微信公众平台配置

http://www.cnblogs.com/mchina/archive/2013/06/05/3108618.html

微信公众平台开发(二) 微信公众平台示例代码分析http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html

一、简介

微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。

二、通讯机制

三、注册微信平台公众帐号

注册地址:https://mp.weixin.qq.com

四、服务器端配置

4.1 示例代码设置

微信公众平台提供了一个php示例代码:

http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip

下载下来,解压缩,打开编辑。

将token值设置为你所需要的值,token可由开发者任意填写,用作生成签名。

编辑完保存并关闭文件,将文件wx_sample.php 更改成自定义的名字,这里改为wxapi.php,再次打包成wxapi.zip。

4.2 服务器平台设置

如果有自己的服务器,而且支持php,可以将接口文件上传至服务器,如果没有自己的服务器,则可以选择部分免费的云平台进行开发,如百度应用引擎BAE(http://developer.baidu.com/bae),新浪云平台SAE(http://sae.sina.com.cn/)。

4.2.1 百度BAE设置

a. 注册BAE帐户并登录

https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F

b. 加入开发者中心

c. 创建应用

接入方式选择 “手机web应用”。

d. 托管设置

选择云环境(BAE)-> 托管设置。

环境类型 选择 “PHP”。

e. 创建新版本,上传接口文件

f. 上线并获取链接

获得的URL为:http://zhuojin.duapp.com/

注:zhuojinsz 之前已经被我注册过了,所以不能再次注册。这里应该获得的二级域名应该和上面的截图中写的一样。

BAE 设置完毕。

4.2.2 新浪SAE设置

a. 注册SAE帐户并登录

http://sae.sina.com.cn/

b. 创建新应用

我的首页 -> 创建新应用

c. 配置应用

d. 上传代码

应用管理 -> 代码管理 -> 上传代码包

e. 获取URL地址

获得的URL 地址为:http://1.zhuojin.sinaapp.com/

SAE 配置完毕。

五、配置接口

5.1 登录微信公众平台 -> 高能功能 -> 开发模式

5.2 成为开发者

5.3 接口配置信息

URL填写上面得到的BAE URL:http://zhuojin.duapp.com/,再加上上传的php文件名。即 http://zhuojin.duapp.com/wxapi.php

Token 填写自定义的token 值,这里为zhuojinsz。

对于SAE,URL填写 http://1.zhuojin.sinaapp.com/wxapi.php

5.4 提交

点击 “提交”,若一切设置正确,则会提示 “提交成功”。

5.5 查看接口配置信息

BAE 接口信息

SAE 接口信息

5.6 开启开发模式

至此,配置完毕。

六、关注

请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于SAE 平台开发,针对于主流的微信功能进行开发测试。

您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

2. 扫描二维码:

卓锦苏州 小黄鸡测试。

[算法]求最大连续子数组和的PHP程序

之前遇到过这样一道题目:一个任意长度的整数数组{1,-3,4,5,6,7,-6,10,-15},求最大的连续子数组和。这里就是4,5,6,7,-6,10的和。这道题运用动态规划的思想,找以数组下标i位置的最大和Max[i]。
Max[i] = (Max[i-1] > 0) ? (Max[i-1] + Max[i] ) : Max[i];
之后在所有Max[i]中求一个最大值即可,时间复杂度为O(n),以下程序用php代码写出:

&lt;?php  
function maxArr($arr) {  
  
    $max    = $arr[0]; //最大值  
    $endMax = $arr[0]; //以KEY结尾的最大值  
  
    foreach($arr as $key =&gt; $value) {  
        if($key == 0) {  
            //以0结尾作为开始,这里直接跳过  
            continue;  
        }  
  
        $endMax = ($endMax &gt; 0) ?  ($endMax + $value) : $value;  //以$key结尾的数组最大值  
        $max    = ($endMax &gt; $max) ? $endMax : $max;             //总的最大值  
    }  
    return $max;  
}  
//测试用例  
$test = array(-1,4,5,6,-10,12,-2,1);  
echo maxArr($test);  

Yii框架下安装xhprof

xhprof 是一款非常不错的php性能分析工具,由facebook开发,有直观的图形分析,可以看到各个流程的性能损耗。下面是在Yii框架下安装xhprof
1,安装xhprof
如果安装了php,很简单执行:pecl install xhprof 就可以了
否则找个靠谱的源 sudo yum install xhprof 也可以
2,配置php.ini

1 view plaincopy
[xhprof]  
extension=xhprof.so  
xhprof.output_dir=/home/work/tmp/xhprof  

其中oupput_idr 是输出文件的目录
3,安装libpng

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz  
tar zxf libpng-1.5.1.tar.gz  
cd libpng-1.5.1  
./configure  
make  
make install 

或者直接sudo yum install libpng* 简单
4 安装Graphviz

 
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz  
tar zxf graphviz-2.24.0.tar.gz  
cd graphviz-2.24.0  
./configure --with-png=yes
make  
make install

5 配置nginx


server {  
    listen 8088;  
    root /home/work/local/php-5.5.18/lib/php/xhprof_html;  
  
    location @php {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME &quot;$document_root/index.php&quot;;  
        fastcgi_pass php;  
    }     
  
    location ~ /robots\.(txt|php) {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME &quot;$document_root/robots.php&quot;;  
        fastcgi_pass php;  
    }     
  
    location ~ \.php$ {  
        include fastcgi_params;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        fastcgi_pass php;  
        fastcgi_index index.php;  
    }     
  
  
    location / {   
        try_files $uri @php;  
    }     
}  

重启nginx , nginx -s reload
重启php-fpm , pkill -USR2 php-fpm, php-fpm
6 配置Yii框架下使用xhprof
找到protected目录下的yii.php
加入以下代码

public static function createApplication($class,$config=null) {  
&lt;span style=&quot;white-space:pre&quot;&gt;    &lt;/span&gt;$app-&gt;attachEventHandler(&quot;onBeginRequest&quot;, function() {  
                xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);  
            });   
       $app-&gt;attachEventHandler(&quot;onEndRequest&quot;, function() use ($app) {  
                $data = xhprof_disable();   //返回运行数据  
                include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;;  
                $objXhprofRun = new XHProfRuns_Default();   
                $run_id = $objXhprofRun-&gt;save_run($data, $app-&gt;name);  
            });   
}  

7 结束
打开你的任意网页,会在/home/work/tmp/xhprof目录下产生性能分析文件,之后通过localhost:8088/index.php就可以访问文件了,点击view_all_callgraph还可以看到直观的性能分析图。

[VIM]Linux下打造自己的IDE

对于用惯IDE的同学,突然用Vim会发现没有那么快捷和方便,以下用到的三个插件能打造VIM 比较方便的效果,先看效果:

要用到如此效果需要三个插件:
一 NERDTree
下载地址:http://www.vim.org/scripts/script.php?script_id=1658
然后解压,解压缩后把plugin,doc,syntax,nerdtree_plugin四个目录复制到/usr/share/vim/vim73/目录下,即可完成安装。
之后输入:NERDTre就可以打开
二 安装Taglist
taglist
下载下载Taglist
cp doc/taglist.txt /usr/share/vim/vim72/doc/
cp plugin/taglist.vim /usr/share/vim/vim72/plugin/
安装ctags => ctags -R
vimrc
let Tlist_Show_One_File=1 “只显示当前文件的tags
let Tlist_WinWidth=40 “设置taglist宽度
let Tlist_Exit_OnlyWindow=1 “tagList窗口是最后一个窗口,则退出Vim
let Tlist_Use_Right_Window=1 “在Vim窗口右侧显示taglist窗口
:Tlist就可以打开Taglist ,显示所有变量和函数
三 winmanager
前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=95
下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。
1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。
2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。
3)在~/.vimrc文件中加入以下几行:

let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0 

4)将Winmanager安装包解压到~/.vim目录。
5)在~/.vimrc文件中加入以下几行

let g:NERDTree_title=&quot;[NERDTree]&quot;  
let g:winManagerWindowLayout=&quot;NERDTree|TagList&quot;  
  
function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  
  
function! NERDTree_IsValid()  
    return 1  
endfunction  
  
nmap wm :WMToggle&lt;CR&gt; 

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

1 view plaincopy
function! &lt;SID&gt;ToggleWindowsManager()  
   if IsWinManagerVisible()  
      call s:CloseWindowsManager()  
   else  
      call s:StartWindowsManager()  
      exe 'q'  
   end  
endfunction

到这里,就大功告成了!
好啦 可以愉快的使用VIM了!!~~

c++函数实现*的正则匹配判断功能

今天在面试的时候面试官出了一道算法题,给出字符串a和字符串b,其中字符串a含有*,这个匹配所有的正则表达式符号,让写出一个函数判断字符串b是否符合规则,面试的时候有些紧张,思路又有些乱,写了一晚上终于成功了,这里提供一下我的算法,欢迎交流沟通。首先贴上完成的代码:

#include&lt;iostream&gt;
using namespace std;

/**********************************************************************
* 名    称:bool match(char *a, char *b, int startA, int startB)
* 功    能:匹配字符串b是否符合正则表达式规则
* 输入参数:字符串a(带*号匹配规则), 字符串b(被匹配的字符), a字符串开始的位置startA, b字符串开始的位置startB
* 返回参数:bool类型
-----------------------------------------------------------------------
* 说    明:无
***********************************************************************/
bool match(char *a, char *b, int startA, int startB)
{
	//字符串a,b的长度
	int lenA   = strlen(a);
	int lenB   = strlen(b);
	//posB,b字符串的startB位置标记
	int	posB = startB;
	//a,b同时结束返回真
	if(startA == lenA &amp;&amp; startB == lenB)
	{
		return true;
	}
	//不是*开头 一定要匹配b
	if(a[startA] != '*')
	{
		if(a[startA] != b[startB])
		{
			return false;
		}
		//递归
		return match(a, b, ++startA, ++startB);

	}else{
		//是*开头 找到非*开始的地方
		while(a[startA] == '*' &amp;&amp; startA &lt; lenA)
		{
			startA ++;
		}
		//以*结尾 同时遍历结束 返回真
		if(startA == lenA &amp;&amp; startB == lenB)
		{
			return true;
		}
	}
	//记录a的位置
	int posA = startA;
	while(startB &lt; lenB) 
	{
		//遍历b找到 与startA 相同的字符
		while(a[startA] != b[startB] &amp;&amp; startB &lt; lenB) 
		{
			startB ++;
		}	
		posB = startB;
		//相同均++, a到头或者a遍历到*结束
		while(a[startA] == b[startB] &amp;&amp; startA &lt; lenA &amp;&amp; a[startA] != '*')
		{
			startA ++;
			startB ++;
		}
		//a遍历到*并且没有结束的情况递归
		while(a[startA] == '*' &amp;&amp; startA &lt; lenA) 
		{
			return match(a, b, startA, startB);
		}
		//a,b同时到头的情况,返回true
		if(startA == lenA &amp;&amp; startB == lenB) {
			
			return true;
		}
		//没有发现满足的字符串,b的startB + 1,在次做遍历
		startA = posA;
		startB = posB + 1;
	}
	return false;
}


void main() 
{
	char *a = &quot;*a*b*c*&quot;;
	char *b = &quot;adbaeabeaeac&quot;;

	bool c = match(a, b, 0, 0);
	cout&lt;&lt;c&lt;&lt;endl;

}

算法解析:
函数是用C++写的,运用递归的思想。分为*开头和非*开头的情况。非*开头一路找到非*的位置开始匹配。
这里有个小坑,例如在字符串ababababcab中找abc的位置,这是比较常见的KMP算法,数据结构中有学,这里找到abc的位置后,两个字符串进行截取后再递归调用函数
测试用例:
分别进行了以下测试用例
字符串a为,字符串为符合和不符合的情况

测试通过!!
有兴趣的朋友们可以自己下载程序试一试,同时欢迎提供更好的算法。