python的debug方法

经过摸索在两大层面都可以进行debug调试。
一,命令行
debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程。
Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观。
Python的debug有两种方式: 1.在命令行中运行, 2.在脚本当中运行。两种方式都需要使用pdb模块。
方式一:在命令行中运行
$ python -m pdb my_script.py
方式二:脚本中运行

在需要设置断点的地方,插入方法 pdb.set_trace()

import pdb

def make_bread():
pdb.set_trace()
return “I don’t have time”

print(make_bread())
命令: 在进入调试状态之后,就可以输入命令进行调试了。
c: (continue)继续执行
w:(words)显示当前行的上下文信息
a:(arguments)打印当前函数的参数列表
s:(stop)执行当前行,并在顶一个可能的时机停止
n:(next)继续执行直到当前函数的下一行或者函数返回值

二,IDE中
本人使用IDLE(即python安装时带的)。
打开shell,代码窗口,和debugger。三大窗口。
第一步,在代码中可以加断点。
第二步,
在shell命令行中可以准备些环境引用,包括,
import sys
sys.path.append(“”)
当然,可以再import你写的包,或者第三方的包。
第三步,可以通过包引用来选择测试你要的任意函数。在单步调试时,可以看到所有的变量,一目了然。

对于IDE中调试,改了代码后,要重启shell,并再次引用。这一点来看不如命令行调试。

VC权威剖析:MFC原理、机制与开发实例—-读后感

基础概念和消息映射

Image
窗口:
按级别分:
桌面窗口
     顶级窗口
          子窗口
     重叠或弹出窗口
CS_PARENTDC:
     有此属性(并不是窗口风格),它可以继承父窗口的显示设备上下文。edit,button都是如此的。
WS_CHILD:
     纯子窗口,只有客户区,并且客户区的显示界面要在WM_PAINT消息处理中进行绘制。edit,button都是如此的。
WS_OVERLAPPED:
     若不同时指定WS_CHILD那么它是顶级窗口,总有标题栏WS_CAPTION和边框,并且自动设置WS_CLIPSIBLINGS。创建重叠窗口时可以指定默认大小选项CW_USEDEFAULT。
WS_POPUP:
     弹出窗口创建时,也会自动设置WS_CLIPSIBLINGS。但其它风格必须专门指定,包括WS_CAPTION,也不能指定默认大小选项。
检索窗口:可以跨进程找到窗口的句柄,因为用的是CWnd的静态函数,如下:
FindWindow()
GetWindow()
以下相对来说是内部查找了。
用于找父窗口的:
CWnd::GetParent(),可以省略CWnd
但有可能父又是别人的子,所以
CWnd::GetParentOwner()
用于找子窗口的:
CWnd::GetTopWindow()
CWnd::GetDlgItem()
CWnd::GetDescendantWindow()——–通过ID号取得窗口指针
CWnd::GetWindowFromPoint(POINT)函数取得占用父窗口客户区指定点的子窗口。实参POINT是客户区坐标。
消息:
Image
窗口消息(区别于线程消息):
     窗口消息:除了WM_COMMAND外,所有WM_开关的消息。与某类窗口紧密相关。
1,系统自动生成的窗口消息映射
2,通过类向导来生成的消息映射
3,通过宏ON_MESSAGE(message,memberFxn)
主要讲解以下三类消息,原因是类向导不能自动帮助生成,也没有系统建立好,要手工添加。包括自定义消息。
     命令消息
          菜单(工具栏,加速键)、按钮向窗口发送,要求执行某个功能操作的消息,与程序动作相关。
          用宏ON_COMMAND(id,memberFxn)来建立消息映射。加入数组的第二参数为,CN_COMMAND(内容是0,而通知消息则是非零值)
     通知消息
          MFC为每个通知消息都定义了宏,如果控件的内容变化ON_EN_CHANGE,ON_EN_UPDATE,鼠标滚动等。
          通过ON_CONTROL(wNotifyCode,id,memberFxn)来生成消息映射。其实它是ON_COMAND的重载而己。新控件都使用专门的ON_NOTIFY来建立了。它能传递更多的附加信息。如:
         纯正,新式的通知消息使用如下:
          ON_NOTIFY(TVN_KEYDOWN,IDC_TREE,OnKeydown)
          注:在两层面变化了,通知代码和处理的函数原型上,后者有实参,并引入新的结构了。
          不通过ON_CONTROL来消息映射的特殊通知消息。WM_CTLCOLOR
     反射消息
          由主窗口通过CWnd::ReflectLastMsg()发给子窗口,此函数调用了子窗口的OnChildNotify()—-ReflectChildNotify()
          在其中,就是原始的switch了。
               对旧式通知消息的反射消息和通知消息的反射消息时
               —–OnCmdMsg()
Image
命令ID:
     [0x8000,0xF000)———–全局命令,可由不同对象处理。菜单项的的ID值都在此范围内。
     小于0x8000—————-局部命令,按钮
MFC应用程序角度—-CWndApp分析

接开发者地气的些设计。它的父和子,都是一个程序从生到死的维护者。在继承的应用类实例中,把这爷仨的属性都设置了,找到相应的归宿。
有三种主窗口:单选的。事实看看MFC应用程序向导即可。
单,多文档的主窗口都是CFrameWnd(后者派生的)。而基于对话框的就不用多说了。
Image
m_pszAppName
向导中填写的工程名称,可以在CWndApp构造时传参指定。如果没有指定,会使用字符串资源“AFX_IDS_APP_TITLE”,如果还没设置这个串,将由可执行文件名代替。
属于CWndApp类
m_pszExeName
属于CWndApp类
m_pszProfileName
应用程序的INI配置文件名,在继承应用类中设置自己的配置文件 。
GetProfileString()等系列函数来配合。
属于CWndApp类(默认是执行程序.ini)
m_hInstance
模块在进程中的装入地址
属于CWndApp类
m_pMainWnd
在CSingleDocTemplate或CMultiDocTemplate构造时,就把资源文件绑定和主窗口框架类,文档类,视图类全都实例化,同时设置了此指针。基于对话框的也按其方式会设置此指针。注:没有命令行参数时,默认执行ID_FILE_NEW
文档,视图,都是MFC管理的,实例在堆上,不用手动回收。
当设置好,别忘记
ShowWindow(SW_SHOW);
UpdateWindow();
SetWindowText(“XXX程序”);
这样这个主窗口的消息循环,在Run时触发。
属于CWinThread。设置了此指针的UI窗口,在销毁时,都是安全的。
用向导也好,自己个性化改造也好,反正重载的initInstance函数至少有有模有样了。
命令行参数功能,有时在不同进程启动的相互调用时很有用。

双系统搭建及ubuntu和CentOS下安装Qt5

把大象放冰箱里需要三步,同样,玩linux也需要。第一,制作USB启动盘,第二,安装系统,第三,安装Qt5。

第一篇,材料准备

有多种方式来制作USB启动盘。本人实验了两个,用vmware12和ultraISO.

虚机方式:

建立好空白虚机后,就是提示第一坑。
第一个坑,就是开启intel VT-x.从bios中设置。
重启,再来,可以了,不要装vmware-tool先,不然就在抢占CD-rom。
在我本机S1 yoga的bios上设置两处:
一,sercurity中的安全引导去掉
二,startup中的boot中选择both,即允许传统模式。
用烧录方式:
当然就是把ISO用ultraISO来烧录到USB中了。这个方式不用过多介绍。
当做好USB启用盘后,你F12引导从U盘进入系统,你会看到try和安装两个大按键的情况。我们即可进入第二篇章了。
第二篇章,系统安家
你是租房还是要买房?系统放到你的U盘上还是,想系统在你的硬盘上?这个问题赶快想,尤其是安装步骤到了分区时。但不管如何,选择安装到硬盘是入口。
如果是想在USB上玩linux,那当然安全,不会破环原来的系统。但是磁盘空间,硬件支持和使用体验必须是要慢被理解的。分区方法如下:(我的U盘就16G)
要在U盘上/dev/sdb建立新分支,一个主15G,一个交换分区9百M。
安装不必细说,当出现提示重启时,拔出U盘即可。
当你是个老司机,硬盘富余,且酷的话,来吧,装在硬盘上。并且让windows来当房东。这个意义深远了,因为,如果你想linux撤出,只要格式下那个分区即可。方便的代价就是要懂得原理并实现,还有找到利器,比如easybcd。
原理其实就是:
MBR—-grub2—-bootmgr(由grub来接管系统,在它的分支中选择windows还是linux)
现在:
MBR—-bootmgr—-grub(由windows提供的引导菜单,它当房东,grub就只管引导linux即可,不用去学习grub命令行,好主意)
那个利器就是编辑bootmgr的。所以,我用后面的引导模式了。
用windows的磁盘管理,压缩卷,把最后一个分区给缩小,然后就会多出一个空闲分区,这个就是给硬盘linux的“新房”。
然后,重启用U盘引导,这次同样选择安装到硬盘选项。在分区时,需要充分小心了。
先看看前人的指导:http://blog.csdn.net/pop_rain/article/details/70477085
在我的环境中最终分三个,/,/boot,/home分别为10G,200M,50G,注意引导要放在与/boot同映射的分区上。注意没有/swap区。
因为据说17.04后的版本不需要分交换分区了,而变成了交换文件的方式。
并且,如果你把引导装在了/boot对应的分区,grub2不会跑出来作怪,这是让windows来引导的前提。不然,得用工具修复MBR,所以,装完ubuntu,再重启应该是熟悉的wiondows不是grub。如果是后者,你分区错了。
当你再重启发现进入了熟悉的windows了,没有错,因为,房东管理着客户linux。此时,搬家已经完成,linux入住了,但房东没有给配好钥匙。进系统后,找那个利器吧。easybcd中加一个引导条目,分区选择为/boot那个系统分区。
再重启,windows给你选择权了,让你进linux去吧。不过,我碰到了问题。
最大的坑是:ext4 superblock checksum 。没错,这个是硬盘格式的错误。卡了我一下午。
一个国外帖子搞定了。
先用USB安装盘,启动进去,用root修复好挂载/的那个分区/dev/sda7.
然后,重启硬盘引导后发现可以有root的命令行,看来修复硬盘格式有戏。
然后,就是把其它的两个linux分区修复。之后,ubuntu17.04的用户登陆界面出现。
但最后,反朴归真了,发现在busybox的initramfs的命令提示符下,用 (sudo) fsck.ext4 /dev/sda7,8,9,三次命令后,reboot即可。
终于是躺在我硬盘里的,与win7同床的,让微软引导的小弟系统呀。
第一件事,开启root。
技巧把$变成#,sudo -s.或sudo su
此时安装东东已经够了,但如果你想用root来登陆系统。继续下面操作。
然后执行: vi /etc/lightdm/lightdm.conf.
增加 greeter-show-manual-login=true  allow-guest=false  . 修改完的整个配置文件是
[SetDefaults]
greeter-session=unity-greeter
user-session=ubuntu
greeter-show-manual-login=true #手工输入登陆系统的用户名和密码
allow-guest=false   #不允许guest登录
然后我们启动root帐号:
sudo passwd root
根据提示输入root帐号密码。
重启ubuntu,登录窗口会有“登录”选项,这时候我们就可以通过root登录了。
第三篇章 系统装修
与房东win7磨合得不错,但linux下没啥好玩的就有些寒酸了。装个Qt5来。
如果你是CentOS,这可以这么玩了。
{
一,编译器准备:
yum check-update
yum -y install gcc
yum -y install gcc-c++
—–解释
gcc: yum install gcc
g++: yum install gcc-c++
此外还有以下方法:
yum install make
– 或者
yum groupinstall “Development Tools”
– 或者(这个省事,把系列工具全搞定)
yum install gcc gcc-c++ kernel-devel
二,Qt5依赖库准备:
#yum install mesa-libGL-devel mesa-libGLU-devel
#yum install freeglut-devel

}//end CentOS

ubuntu:
{
首先不可或缺的就是编译器与基本的函式库,如果系统没有安装的话,依照下面的方式安装:
  $ sudo apt-get install build-essential
安装OpenGL Library
  $ sudo apt-get install libgl1-mesa-dev
安装OpenGL Utilities
  $ sudo apt-get install libglu1-mesa-dev
  OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。
安装OpenGL Utility Toolkit
如果不行就把,sudo apt-get install libglut-dev命令改成
$ sudo apt-get install freeglut3-dev
}//end ubuntu
三.直接运行安装包
#sh qt-opensource-linux-x64-5.5.1.run
四.安装好之后,需要添加环境变量
#vim /etc/profile
在最后一行,添加以下内容:
export PATH=”/opt/Qt5.5.1/5.5/gcc_64/bin:$PATH”
export PATH=”/opt/Qt5.5.1/Tools/QtCreator/bin:$PATH”
如果第四步没有搞好,编译好的测试项目不能运行执行文件。本人就碰到了xcb的插件要求报错。原来在5.5以上的高级Qt版本中,引用了platform的概念。所以,要使用LD_LIBRARY_PATH来找那些库。当然,你找那个qtcreator.sh执行,里面有自动配置好系统环境的处理。
until now,enjoy!

git局网实战

介绍个轻量级方案,让局网下使用git方便,抛砖引玉了。

第一步,首先在A机上,把代码的目录变成仓库。
用git init或者用GUI操作,这没啥新鲜的。
第二步,在A机某个共享文件夹中建立个裸仓库(基于第一步的仓库)
即使用命令:在第一步的目录中,而share则是本机的共享目录。
git clone –bare . /c/Users/Administrator/Downloads/share/bare-cad.git
但,此时,第一步的仓库并没有把第二步刚建立的仓库当成远程仓库。所以,还要手工建立联系。
git remote add origin /c/Users/Administrator/Downloads/share/bare-cad.git
再加上一个
git push –set-upstream origin master
可保万全,它设置了第一步仓库的上游或者说远端源是第二步仓库了。不信,你用git branch -a或git push来测试。
到此,A机内循环通道完毕。
第三步,在局网的其它机器B上,映射驱动器为A机的那个共享目录。
Y:/bare-cad.git就是那个第二步建立的仓库。
并同时克隆一个仓库在自己喜欢的目录下。
git clone /Y/bare-cad.git
上游或远程关系自动建立好,git pull/push都没问题了。
第四步,开始协同开发,推拉自如。好像装箱和开箱,而这个中转箱,则为bare-cad.git.

翻墙小记

以为下了chrome和ssh 隧道技术以国外主机做支点,即可访问google了。
非也。因为,chrome不能使用默认的代理服务器功能。它需要专用的扩展。这块,它不如360,因为,在那里一设置好socks,百度ip查询一下,就显示为境外ip了。
但360也有不如chrome的地方,当所有的环节都通了时,facebook,youtube和google。这种大名鼎鼎的网站还是访问不了的,因为,360毕竟是要吃饭的。这几个url已经被硬编码进了浏览器。
当然,这是猜的。
总之,两个工具配合起来就完全太棒了。
首先,用翻墙了的360去查chrome的扩展,那可是海量的应用呀,大开眼界,虽然这些也能和360来配合。但我不做这种强扭瓜甜的事。
于是,找到了proxy_switchyomega2.4.5这个扩展的网页,拷贝出它的id。注意在网址中截取像ID的一串码,位长度多少忘记了。
然后,在一个专门提供离线扩展下载的网址里输入此id后,就能下载到crt文件。
这个就是扩展的安装包。可以被chrome无缝的使用,可以说是想插就插,方便的很呀。把下载的
Proxy-SwitchyOmega_v2.4.5.crx
直接拖入chrome后,就可以配置代理服务器的ip和端口了。
应用设置后,在chrome地址栏的右侧,可以看到启动和关闭代理服务器的开关了。
你来控制,说翻就翻吧。
装了这个chrome扩展后,后面的扩展和应用就会让你忍都忍不住,因为实在是太好用,太方便了。
随便推荐两个。
gmail和diigo annotate

git学习笔记

基础概念:
合并(merge):一般在分支到主线
     快进:另一分支并没有更改过。
     合并:两分支各自变化了,需要解决冲突
比如,如果要将开发中的分支(develop),合并到稳定分支(master),
  首先切换的master分支:git checkout master。
  然后执行合并操作:git merge develop。
  如果有冲突,会提示你,调用git status查看冲突文件。
  解决冲突,然后调用git add或git rm将解决后的文件暂存。
  所有冲突解决后,git commit 提交更改。
分支衍合(rebase):一般在主线到分支
     最好的场景是把主线的修复推向需要的支线。
分支衍合和分支合并的差别在于,分支衍合不会保留合并的日志,不留痕迹,而 分支合并则会保留合并的日志。
  要将开发中的分支(develop),衍合到稳定分支(master)。
  首先切换的master分支:git checkout master。
  然后执行衍和操作:git rebase develop。
  如果有冲突,会提示你,调用git status查看冲突文件。
  解决冲突,然后调用git add或git rm将解决后的文件暂存。
  所有冲突解决后,git rebase –continue 提交更改
     一个对象名,是根据内容sha出来的40字符串。
     二个目录:git目录,工作目录
     三个:
          index,staging area,未入仓库的,由仓库管理的,暂存区
     四种对象:每个对象都包括三部分:类型,大小和内容。
          blob,git show
          tree,git ls-tree
          commit,git show -s –pretty=raw ,一个commit只指向一个tree,它用来标记某一个特定时间点的状态。包括时间戳,提交者,(parent)指向上次提交对象的指针,(tree)。
          tag,git cat-file tag v1.5.0 用来标识某个提交的方法,包括对象名,对象类型,标签名,,标签创建者名字。
以下转来的思路清楚的后台逻辑:
————————————-

设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”。

现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库。

执行 git add number.txt 会将 number.txt 添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录 number.txt -> first,同时 add 命令还会把一个包含了 first 字符串的二进制对象加入 Git 的对象数据库里。

现在执行 git commit -m first。这条命令会做三件事情。首先在对象数据库内创建一个树对象,用以记录 alpha 目录下的文件列表,这个对象有一个指针指向前面 git add 命令创建的 first 二进制对象;第二,这条命令还会创建一个 commit 对象用以代表刚刚提交的版本,它包含一个指针指向刚刚的树对象;第三,master 分支也会指向这个新创建的 commit 对象。

现在执行 git clone . ../beta。它会创建一个新目录 beta 并将其初始化为 Git 仓库,然后把 alpha 仓库的对象数据库中所有对象拷贝给 beta 的对象数据库,将 beta 的 master 分支像 alpha 的 master 一样指向相应的对象。它还根据 first提交的内容配置索引,并根据索引更新目录下的文件——也就是 number.txt

现在切换到 beta 目录,修改 number.txt 的内容为“second”,执行 git add number.txt 和 git commit -m second,新创建的提交对象 second(译注:姑且称之为 second)会有一个指向父提交(first)的指针,表示 second 继承自 first,而 master 分支则指向 second 提交。

回到 alpha 目录,执行 git remote add beta ../beta,将 beta 仓库设为远程仓库。然后执行 git pull beta master

在这条命令背后,它其实会执行 git fetch beta master,从 beta 仓库中找到 second 提交的相关对象拷贝到 alpha 仓库;把 alpha 中关于 beta 的 master 分支记录指向这个 second 提交;更新 FETCH_HEAD 指向刚刚从 beta 仓库拉取的 master 分支,还是这个 second 提交。

此外,pull 命令还会执行 git merge FETCH_HEAD。从 FETCH_HEAD 得知最近拉取的分支是 beta 仓库的 master 分支,据此拿到相应的对象,也就是 second 提交对象。此时 alpha 的 master 分支指着 first 提交,正好是 second 的祖先提交,于是对于 merge 命令来说只需要将 master 分支指向 second 提交即可。接下来 merge 命令还会更新索引以匹配 second 提交的内容,并且相应更新工作目录中的文件。

现在执行 git branch red,创建一个名为“red”、指向 second 提交的新分支。

然后执行 git checkout red。在 checkout 之前,HEAD 指向 master 分支,执行命令之后它就指向了 red 分支,使得 red 成为当前分支。

接下来把 number.txt 的内容修改为 “third”,执行 git add numbers.txt 和 run git commit -m third

之后再执行 git push beta red,这条命令会把 alpha 仓库内跟 third 提交相关的对象拷贝至 beta 仓库,并且将(alpha 仓库内记录的)beta 仓库 red 分支指向 third 提交。就酱。

—————————-

事实上只有理解后台的动作,才能在命令中游刃有余。下面个人总结的,请大家抛砖。

后台的勤劳者
git clone
—后台把新仓库的同名分支和旧仓库的远程分支(相对于新仓库)做“自动追踪”映射了。
手工改的命令是:
git branch –set-upstream master origin/next
–set-upstream-to=origin/next master
在push后加下面的效果一致(关联阅读):注远程没有next也会生推过去,并设置了跟踪关系。
-u origin next
git pull <远程主机或仓库默认origin> <远程分支>:<本地分支>
—后台的动作包括fetch FETCH_HEAD(默认是远程的master并设置,在不加参数情况下,它也会全取来远程下面的所有分支)
—后台还有merge动作。前提是当前分支与远程分支存在追踪关系了。
git push<远程主机或仓库默认origin> <本地分支>:<远程分支>
—注意这是危险的,要先pull才好。它在后台只接受“快进”,并且要注意冒号前的分支所属
rebase
—后台有个删除动作的,为了让树看起来漂亮,他会像橡皮一样擦除本分支内的commit对象,然后做好搬运合并。所以,这一般都在非主分支上。
附个技巧:有点像“月光宝盒”哟
#保留你当前状态,包括未跟踪的垃圾文件,并最后再搞回来
git stash
git checkout fe9c4
#看代码等操作
git checkout master
git stash pop
注意pop是会删除stash对象的,而apply不会,要有多个stash时,用stash@{num}来指代。

git工作流设计

对于源码管理和产品线管理为了避免混乱,应该有个大致的管理方案:
项目名假如为:tj_dj
则产品管理线:(主机)
主分支–master
开发分支–develop-tj_dj
发布分支–release-tj_dj
特性分支(短生命线分支)–f-[特性名]-tj_dj
修复分支–hotfix-tj_dj

轻量级开发情况:(AB机间没有网络)
在各自本机建立环境,本地建立好bare仓库和本地开发仓库。
总体上要求,bare仓库是同名的,但在自己的本地开发仓库中把远程仓库命名个性化。Dell为例:
dell-前缀。
技巧:
bare仓库用来fetch和push的“箱子”,为远程仓库。
使用拷贝方式来和其它机共享bare仓库。
各机器为主工作时,则要使用很多分支技术来merge其它机的进度代码。

多人联合开发情况:
这里就仁者见仁,智者见智了。但是最典型的就是gitflow了。但不是起对了几个分支名就行了。要得其要领。
原则:
master和develop分支是稳定分支,一直存在。
master只允许release和hotfix分支来的merge
develop日常开发
feature上开发功能,功能成熟后合并到develop上
release是从develop上分出来,bug修复后,打上tag后,要同时合并回develop和master
很小的bug修复会则会在hotfix上进行。
1). 首先将远程代码拉取到本地
  git clone xxx
  git checkout -b develop origin/develop
2).新建feature分支
  git checkout -b feature
3).多人在feature上开发,如果中途需要将develop的变更合入feature,所有人需要将本地的代码变更提交到远程
  git fetch origin
  git rebase origin/feature
  git push origin feature
然后由feature负责人rebase develop分支,删除原来feature分支,重新新建feature分支;
  git fetch origin
  git rebase origin/feature
  git rebase develop
  git push origin :feature
  git push origin feature
这样可以保证feature保持线性变更;
4).feature开发完成后,所有人需要将本地的代码变更提交到远程
  git fetch origin
  git rebase origin/feature
  git push origin feature
然后由feature负责人rebase develop分支,然后将feature分支合入develop,删除feature;
  git fetch origin
  git rebase origin/feature
  git rebase develop
  git checkout develop
  git merge feature
  git push origin :feature
这样可以保证develop保持线性变更,各feature的变更完整可追溯;
5).合入feature后拉出对应的release/feature分支,后续bug修复在release/feature上
  git checkout develop
  git checkout -b release/feature
release/feature分支的同步合并与feature分支相同
6).release/feature分支bug修复完成后,拉取对应的tag推送远程进行发布
  git tag -a v1.0 -m ‘feature发布’
  git push origin v1.0
之后将release/feature合入develop分支,然后删除
  git rebase develop
  git checkout develop
  git merge release/feature
  git push origin :release/feature
7).发布完成后将release合入master分支,保证master为最新稳定版本(实际操作为发起merge request)

写给三十岁以上的程序员

本人80年生,这一般是个适合开始的,也是个容易总结的年份,总结就是一种创新,所以我的话就多。

中国IT圈,是有传统特色的,你会找到江湖的味道。那么,混不好的话你就可能挨几刀或者走火入魔。

做技术的你真的需要职业规划,个人战略,运气,勤劳,魄力,以及聆听自己的心声。

切记一,江湖上的传说都留给别人吧,富二代,财团,那些争夺虚名的胜利者。

切记二,心静了,也不能滥学,不然你会被半浅不深的技术淹死,半熟不热的噎死,千万别“以苦做舟”,没兴趣,不快乐的话,快点闪人,时间和精力有限,别等开进了胡同倒不出车。—-入魔的

我的一个同学R,做开发工作5年时,就嘴上总挂着转行,不想搞开发。心理的呼唤,没有理,况他也不忍失掉机会成本,因为不做技术,去新行业又拿不到高薪,由奢入俭难,然后先干着,一晃几年又过去了,嘴上又挂着转行,但这时可能就是被外界种种逼的。—-挨刀的

如果你没有保持对新技术的敏感

如果你没有对技术掌握的成就感,好奇心

如果你没有自己家里的开发环境和实验码田

如果你没有技术微博和一箱子的书和案头的手册

如果你没有最想深入了解的技术方向

如果你没有无数个深夜面着电脑搞这搞那儿,忘记吃饭和睡觉

如果你没有承担40岁后失业勇气

如果有,全有。

亲,那么恭喜你,我们进阶吧。

 

IT带来的不是多少个职位和行业,而是一个时代。虽然你30岁多了,但是你是这个时代的建设者和亲历见证者,你有权要求发声音,也应该有了担当来发声音。

一,认清大环境

中国的IT业还不是个完全市场导向的,因为这是共产主义国家。

传统行业的信息化和新行业相比,后者才是IT圈新贵们蛰伏的乐土,但是急功近利。

程序员想搞科研去大学,研究所,少在老板面前晃悠,等你真去了说不定,他主动找上你,在你眼前晃悠了。但我劝大家,IT只是工具和手段,应用科学需求量总是比理论高,就是个金字塔型的下端之于上端。

二,认清生存元素

好的IT公司是应该有自己的擅长的领域并且能留人。就像天龙八部里的少林,藏经阁里的扫地僧。

那些领域更适合你

三,认清自己的风格

你是哪类程序员,喜欢静,宅,喜欢看百家讲坛多过于娱乐频道。

白天求生存,夜晚求发展

人们从他的身上感觉到一股力量。

以上是几年前写的,现在我在一个不以技术为主的,以业务实体更看重的公司(甲方是国企),这样的确是比较稳定的,对技术人员也很尊重,(一个有老程序员较多的公司坏不了多少),我放弃许多挑战自己的骨气和机会,只为稳定,也不知对不对,希望这观点别太深的影响你的判断。

nginx+redis应用服务架构搭建

事实上,两个东东功能独立。nginx作为开源的web服务器,可以用做反向代理等。而redis说白了就是一个内存数据库,存储键值对,可以多节点部署在多个物理机做为应用层,可以集群方式自动管理。可以不用重启,灵活增删节点等。
此处放在一起是因为工作中整理需要。当然,你可以分开阅读或借鉴。
前提:
CentOS6.5 x86_64
一,基础软件:有些并不是必须的补丁。
先用yum install -y XXX,如何需配置本地安装源有本站另外文档介绍。
如果没有yum那必须要有安装光盘的Packages文件夹了,里面是配套的软件包。用rpm -ivh XXX.rpm即可。
gcc的依赖如下:

cloog—–ppl
cpp—–mpfr
g++(gcc-c++)

libstdc++-devel
jdk

使用的openjdk的版本

把起作用的路径先设置成HOME路径,然后加入path。
如,java的默认路径是/etc/alternatives/jre_openjdk
#vi ~/.bash_profile
加入内容:
export JAVA_HOME=/etc/alternatives/jre_openjdk
export JRE_HOME=/etc/alternatives/jre
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
如下两个补丁包可以略,因为,在nginx的安装过程中也必须要源码编译安装。
PCRE
openssl-devel、pcre-devel、zlib-devel
zlib:
./configure
make
make install
ruby

libruby
ruby-libs
—-libreadline()
cd /path/ruby
./configure -prefix=/usr/local/ruby
make
make install
sudo cp ruby /usr/local/bin
事实上,用yum安装的话:yum install ruby,即可了
rubygems:

首先使用yum install rubygems来“投石问路”,就看到它所依赖的包,然后,在Packages目录里把rdoc和另一个包安装好,
最后,去网上下到了rubygems,
rubygems-1.3.7-5.el6.noarch.rpm
解压安装,成功。
没有yum的情况:
cd /path/gem
sudo ruby setup.rb
sudo cp bin/gem /usr/local/bin
gem-redis:

这是ruby和redis之间的桥,此时yum已经插手不上了。
方法一:
gem install redis –version 3.0.7
#由于源的原因,可能下载失败,就手动下载下来安装
#download地址:http://rubygems.org/gems/redis/versions/3.0.7
wget加url
方法二:
下载gem文件,在上面的url里一定会找到。
现场使用语句
gem install -l /root/tool/redis-3.0.7.gem
二,redis安装和运维:
安装集群:
tar -zxvf redis-3.0.7.tar.gz
mv redis-3.0.7 /usr/local/redis3.0.7
cd /usr/local/redis3.0.7
make
make install
cp /usr/local/redis-3.0.7/src/redis-trib.rb /usr/local/bin/
mkdir -p /usr.local/cluster
cp /usr/local/redis-3.0.7/redis.conf /usr.local/cluster
cd /usr.local/cluster
mkdir 7000
mkdir 7001
mkdir 7002
1)启动节点,或说实例,在/usr.local/cluster/
现行配置redis.conf如下:
daemonize yes
port 9001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
cd 7000;redis-server /opt/redis/conf/redis.conf > redis-0.log 2>&1 &
cd ../7001;redis-server /opt/redis/conf/redis.conf > redis-1.log 2>&1 &
cd ../7002;redis-server /opt/redis/conf/redis.conf > redis-2.log 2>&1 &
2)构建集群关系
#redis-trib.rb的create子命令构建
#–replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点
#节点角色由顺序决定,先master之后是slave(为方便辨认,slave的端口比master大1000)
—单机情况下:
redis-trib.rb create –replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
—双机情况下:
redis-trib.rb create –replicas 1 130.1.2.11:7000 130.1.2.11:7001 130.1.2.11:7002 130.1.2.12:7000 130.1.2.12:7001 130.1.2.12:7002
3)检测集群工作情况
  #redis-trib.rb的check子命令构建
#ip:port可以是集群的任意节点
redis-trib.rb check 1 130.1.2.11:7000
结果是:
[OK] All nodes agree about slots configuration.
>>> Check for open slots…
>>> Check slots coverage…
[OK] All 16384 slots covered.
说明运行正常了。或者redis-cli -c -p,-h 10.0.0.1 -p 后ping/PONG
现场抓图:
技巧:
重改配置时常用语句:
cd ../7002/;rm nodes.conf -f;mv redis.conf redis.conf.v0
三,nginx安装
版本:
在/root/tool/下进行解压和编译安装。
现场最终起作用的语句:
./configure –with-pcre=pcre-8.12 –with-openssl=openssl-1.0.1c –with-zlib=zlib-1.2.8 –with-poll_module –prefix=/home/linux/nginx/nginx-1.9.4/run –with-stream
make;make install
把安装路径加入到path中,export NGINX_HOME,参考上面java安装。即/home/linux/nginx/nginx-1.9.4/run。
配置文档如下:在/home/linux/nginx/nginx-1.9.4/run/conf下面,名为nginx.conf.
删除http节,如果发现已经存在stream节,即把同名的节替换即可。
stream {
    server {
        listen 80;
        proxy_pass app;
    }
    upstream app {
        server 130.1.2.11:4442;
        server 130.1.2.12:4442;
    }
    server {
        listen 81;
        proxy_pass appp;
    }
    upstream appp {
        server 130.1.2.11:6666;
        server 130.1.2.12:6666;
    }
    server {
        listen 82;
        proxy_pass apppp;
    }
    upstream apppp {
        server 130.1.2.11:4433;
        server 130.1.2.12:4433;
    }
}
.nginx的启动
nginx -c /home/linux/nginx/nginx-1.9.4/run/conf/nginx.conf
重启命令 nginx -s reload
关闭
  1.从容停止:kill -QUIT nginx主进程号 (注释:进程号查询方法;ps -ef|grep nginx 看master进程号)
  2.快速停止:kill -TERM nginx主进程号
  3.强制停止:pkill -9 nginx
测试端口是否开放,当然先装好nc工具
nc -z -w 1 127.0.0.1 8883
可以快速开放一个tcp端口,相当于建立一个socket server:
nc -l 8884
用这个命令开放某个端口穿越防火wall
iptables -I INPUT -p tcp –dport 82 -j ACCEPT
iptables -L -n | grep 82
service iptables save
四,业务程序:

yum本地安装源配置

使用yum要具备工具,所以,安装好这个包很重要。
在Linux下有了它,就像是光夫有机器猫,大圣有了金箍棒。
在/etc/yum.repo.d/目录下,一般会有四个文件。
…………CentOS_Base.repo——-网络源,要想在无网络状态下就要禁用它,重命名,加上.bak
…………CentOS_Media.repo—–这个就是光盘或挂载的文件了,修改它。
在baseurl 中修改第2个路径为/mnt/cdrom(即为光盘挂载点),注意,挂载点下面要有repodata/repomd.xml(这个是纽带)
将enabled=0改为1
然后保存,#yum update后就可以使用了。
注意,还包含一些很长文件名的文件。所以,即使没有光盘,可以把xml和长文件名文件拷出来放到系统内文件夹中。