Git修改提交记录的提交信息

修改前提交历史记录如下图:
修改前

修改提交记录的提交信息有两种情况:

  • 修改最近一次提交的提交信息
    使用命令git commit --amend,进入到下图:
    改前
    修改提交信息,然后保存退出,
    使用命令git log,查看历史提交记录,可以发现最近一次提交信息已被修改,如下图:
    修改后提交信息

如果想要修改最近三次提交信息,或者那组提交中的任意一个提交信息呢?那就是我们要说的第二种情况了:

  • 修改多个提交信息
    使用命令git rebase -i 节点,节点即HEAD~2^HEAD~3或某一次的提交记录的哈希值;
    例:git rebase -i HEAD~3进入下图:
    进入rebase -i交互界面

注意:
1. 上面列出的历史提交记录信息正好和我们提交的时间是相反的,我们最近一次的提交反而在最下面;
2. 可以看到,这个文件相当于一个与Git的交互界面,你可以使用不同的命令达到后续不同的操作;
3. 上图中命令在附录1中说明.

第一方法,使用reword操作:
如果只需要修改提交历史信息,把pick修改为reword即可,在列出的记录里,需要修改哪个提交信息,就把这条记录前的pick修改为reword,保存退出后,Git就会弹出每个提交信息的编辑信息的编辑器,编辑完成退出后,就会弹出下一个,直到全部完成。

第二方法,使用edit操作,这个方法能使用所有git commit --amend的功能,比如修改提交者的邮箱信息等等:
这里我们只修改倒数第二次的提交信息,把第二个pick修改为edit,如果你要修改这三次所有的提交信息,可以都把pick都修改为edit,如下图:
修改你要使用的操作命令

保存并退出编辑器后如下图:
Git提示

接下来,使用命令git commit --amend来修改提交信息,你发现了么,是不是和上一种情况很像!
修改提交信息,然后退出编辑器。最后,运行git rebase --continue,这个命令将会自动地应用另外两个提交,然后就完成了。
如果需要将不止一处的pick改为edit,需要在每一个修改为edit的提交上重复这些步骤。每一次,Git都将会停止,让你修正提交,然后继续直到完成。

使用命令git log,查看历史提交记录,可以发现倒数第二次的提交信息已被修改,如下图:
修改后提交信息


警告:这是一个变基命令-在HEAD~3..HEAD范围内的每一个提交都会被重写,无论你是否修改信息。不要涉及任何已经推送到中央服务器的提交-这样做会产生一次变更的两个版本,因而会使他人困惑。

附录1

命令名称 说明
pick 使用提交,不做修改
reword 使用提交,但编辑提交信息
edit 使用提交,但会为了使用amend命令停止
squash 使用提交,但会把列表里后面的提交压缩到第一次合并成一次提交
fixup 和使用squash类似,但不会保留提交信息
exec 使用shell命令,待测试
drop 删除掉某一次提交,此次修改将全部消失(危险)

共享篮球架脑洞

背景:博主目前在北京工作,自己是一个业余篮球爱好者,很希望在周未休息时能找一个地方打打球,但这样的地方太少了。有篮球场的地方主要是在:学校,某些公园,极少数小区。
这些地方都有很大局限性:
1. 数量少;
2. 与自己住的地方相距甚远;
3. 很多学校不允许校外人员进入,有些公园也是收费的,小区有的也是封装型的。

基于以上这些情况,我设想,要是有共享篮球架就好了,这个篮球架应该有以下这些特性:
1. 可以太阳能充电,能抵抗轻微的自然灾害,比如:烈日暴晒,狂风和大雨等;
2. 篮球架有GPS定位功能,方便使用者寻找;
3. 有一个自动的盖子可以把篮框闭合(或者篮框在篮板后面),这样别人就不能使用;
4. 篮球架架身上有二维码,可以供使用者使用APP扫描支付使用费用,支付成功后闭合的盖子会自动打开(或者篮框自动会移动到篮板前);
5. 收费设置,比如 5RMB/H;
6. 计时结束后,盖子会自动闭合(自动移动到篮板后面),如要使用需要再次支付;
7. 篮球架允许运营方远程控制调节,比如,调节成每天上午9:00~12:00盖子自动打开,可以免费使用,其它时间需要扫码支付后使用。

优点:
1. 公共场合,方便寻找,每个爱好者都可以来玩;
2. 几个人一起玩,AA制付款就行,便宜;
3. 推广我国体育运动,强身健体:);

当然,它其实存在很多问题:
1. 场地问题,如果设计制作出了篮球架,但是却缺少能使用的场地,在一线城市,场地其实更稀缺,如果租赁场地的话,应该也很昂贵;
2. 篮球架的制作成本,我在网上搜了一下,一个普通的篮球架售价为1.8K RMB左右,造价也不便宜;
3. 受众少,相较其它共享项目(共享单车)来说,共享篮球架的使用者就少很多了。

其它思考:
1. 是否可以和共享篮球一起运作,运动者自己没有篮球可以现场使用共享篮球;
2. 是否可以和自动贩卖饮料机一起运作,运动者运动渴了可以直接买水喝解渴;
3. 篮球架本身是否有更好的设计,是否可以把支柱变宽而可以放显示屏播放广告。

补充:
1. 可以在篮球架的某个位置增加一个摄像头,防止架子被故意破坏,最重要的是可以录入用户打球视频,扫码付费的用户可以通过App观看,这个用户可以直播和分享这个视频给别人。他能够看自己或别人哪些投球很酷,很帅,也能够查看争议犯规的录像,知道是谁犯规。如果可以的话,还可以具有自动剪辑出五佳球等功能!
2. 还可以有很多玩法,比如,半场模式和全场模式,篮球架会自动录像,计时,计分,用户可以实时在手机APP上查看,还可以直播比赛。比如PK模式,两个人同时付费,结束后,输的一方会扣费,赢的一方会退款,再结合饮料自动贩卖机,加一瓶饮料的赌注,也是提前付费,比赛结束饮料会自动出来。
3. 更大的脑洞是,可以使用AR技术,用这个摄像头虚拟出几个人和用户一起打篮球!:)

自动化检测PHP语法和编程规范(Git pre-commit)

自动化检测PHP语法和编程规范

使用到的知识点:

  • 命令php -l检测文件语法,可以通过php -h查看PHP CLI支持哪些操作,如下:.
[:~]$ php -h
Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot] [router]
   php [options] -- [args...]
   php [options] -a

  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No configuration (ini) files will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.


  • 安装PHP编程规范工具php-cs-fixer,可以在GitHub上查看详细信息.
    1. 下载:wget http://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -O php-cs-fixer
    2. 给予执行权限:sudo chmod a+x php-cs-fixer
    3. 把文件移动到自己喜欢的目录,我一般是放在/usr/local/bin下:sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer

  • 利用Git的钩子pre-commit达成commit前自动检测功能.
    这个钩子,顾名思意就是在git commit之前会触发,此钩子结合网上和朋友的写法,感谢他们.
    首先,点击查看这个文件,复制文件内容.
    然后,进入到自己的项目下git钩子目录:cd path/to/your/project/.git/hooks,复制pre-commit.sample文件并重命名:cp pre-commit.sample pre-commit,把文件内容替换为上一步复制的内容.
    最后,每次commit时就会先检测语法和规范是否正确,不正确会提示文件名和你需要规范代码格式的命令,简单测试如下图:.
    php-cs-fixer pre-commit

最省钱搭建自己的Shadowsocks服务

为了科学上网,一直找别人提供的shadowsocks服务(以下简称ss),使用过免费的,也使用过收费的,免费的要么流量和速度受限,要么不稳定。收费的更坑,说不定什么时候跑路了,我就碰到过。

所以决定自己搭建一个ss服务,所以开始在网上查资料,中间经过了这样的几步:

  1. 需要一台自己的境外vps(Virtual Private Server 虚拟专用服务器),注意是境外的哟,因为我们的请求会转发到这台服务器,再转发出去,如果这台服务器就在GFW内,到头来还是在墙内打转。可以购买的vps的地方很多,比如阿里云的香港服务器,AWS的服务器,或是其它第三方的(Vultr,搬瓦工等等)
  2. 在这台服务器上安装ss服务,加以配置
  3. 在本地安装ss客户端,转接自己搭建的服务

第一步:为了最省钱,你可以找那种免费提供试用的vps,我去很多vps的官网上找了,都没有找到相关的活动与优惠,不过,每个提供商会不定期提供,所以,也许是我找的时机不正确,最后我发现了AWS现在(2017-05-08)正好有一个活动,可以试用12个月,见下图:
查看地址
aws活动
在注册过程中,也许你之前已经有amazon的账号,那么你可以直接登录,然后做一些验证,最重要的是它需要你绑定信用卡,在这个过程中,我扣了$2美元,也是一顿饭呢,最后就可以创建自己的EC了,虽然我说的很简略,你可能没有看明白,不过不用担心,这个过程其实很简单,去操作吧,有问题欢迎来找我!

注意,这里要ping <Public IP>一下,把<Public IP>换成AWS给你提供的ip地址,检查自己的vps是否能够直接连接,如果ping不通,要先修改自己的安全组(Security groups),修改为不受限制

第二步:在自己的服务器上安装ss服务,因为我创建创建的ec是CentOS,而且AWS好像只提供了7.x的版本,CentOS安装命令:

yum install python-setuptools && easy_install pip
pip install shadowsocks

也许提示error,no package等信息,只要去网上找到对应的源,添加一下,再安装就好了,很简单,不用担心。
加以配置:
增加配置文件,路径看自己喜好,我增加在家目录下,~/ss/ssservice.json

{
    "server": "my_server_ip", // 输入本机的 IP 地址,可以使用ifconfig查看自己服务器的ip,不能配置成AWS给你提供的public ip
    "server_port": 8388,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "mypassword", // 设置密码
    "timeout": 300,
    "method": "aes-256-cfb",
}

启动服务:ssserver -c ~/ss/ssserver.json -d start

第三步:本地安装ss客户端,配置然后连接,这步省略(或参考下这里),因为如果你会上面第二步了,这一步就更简单了。

ubuntu apt update时提示缺少public key

问题原因:

apt包管理系统具有一组可信密钥,用于对每个包进行身份验证,确定每一个包是否可以信任的安装在系统上。有时,系统没有所有需要的密钥进行验证,所以会遇到这个问题。幸运的是,系统会列出缺失的每个密钥的信息,只需要把这个密码添加到apt密钥管理器中,以便它可以验证包就可以了.

  • 使用命令sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys xxxxxx
    xxxxxx 代表系统提示你缺少的密钥,我缺少的密钥是40976EAF437D05B5,使用后结果如下图,然后再sudo apt update就没有问题了.
    增加密钥

Ubuntu安装Chrome稳定版(google-chrome-stable)

Ubuntu安装Chrome稳定版(google-chrome-stable)

  • 推荐PPA方法,免翻墙
  1. wget -q -O - https://raw.githubusercontent.com/longhr/ubuntu1604hub/master/linux_signing_key.pub | sudo apt-key add

  2. sudo sh -c 'echo "deb [ arch=amd64 ] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list

  3. sudo apt-get update

  4. sudo apt-get install google-chrome-stable

  • 安装Google Chrome unstable 版本:
    sudo apt-get install google-chrome-beta
  • 安装Google Chrome beta 版本:
    sudo apt-get install google-chrome-unstable

Symfony常用命令

  • 创建数据库

    php app/console doctrine:database:create

  • 删除数据库

    php app/console doctrine:database:drop --force

  • 生成单个实体

    php app/console doctrine:generate:entity

    1. 输入:AppBundle:Product会创建一个Product的Entity
    2. 输入要映要的字段名称:name
    3. 输入字段类型(默认字符串):string
    4. 输入字段长度(默认255):255
    5. 输入字段是否允许为空(默许不能为空):false
    6. 输入字段是否唯一(默认不为唯一值):false
    7. 回车完成
  • 创建|更新数据表(前提是有对应表的Entity)

    php app/console doctrine:schema:update --force

  • 更新所有实体(参数--no-backup不生成备份文件)

    php app/console doctrine:generate:entities AppBundle --no-backup

  • 清理缓存:

    php app/console cache:clear
    生产环境加上-e prod参数:
    php app/console cache:clear -e prod

  • 重新生成 app/bootstrap.php.cache:

    php ./vendor/sensio/distribution-bundle/Resources/bin/build_bootstrap.php

thrift的安装和php的简单示例

  • 首先,请粗略查看Thrift安装说明文档,这里列出了不同系统需要的各种依赖,后面编译安装失败的原因有可能是缺少依赖,第一步就是把需要的依赖解决,我的系统是Ubuntu 16.04 LTS,所以参照的是这里的说明;

  • 其次,下载thrift源码和示例,下载完成后可用md5sum校验文件是否下载完整。解压文件tar -xzvf thrift-0.10.0.tar.gz,解压后目录里包含很多文件,有现有可使用thrift的各种语言的库,在lib目录里,以及对应语言的使用示例,在tutorial目录;

  • 然后,配置,编译,安装:

  1. ./configure && make
  2. sudo make install
  3. 检查是否安装成功thrift -version,我的显示Thrift version 0.10.0,安装成功,版本为0.10.0
    > 可参考官方文档Building from source
  • 最后,创建php服务端和用户端,开发流程:
  1. 配置环境.PHP的php-fpm,Nginx等.
  2. 根据需求,编写thrift接口定义文件(IDL定义文件),解压的目录里已经包含各种示例所需的IDL文件,在解压目录/tutorial/.
  3. 使用thrift程序,为不同的语言生成代码.
  4. 根据需求,修改生成的代码(主要是Server端),编写实际的业务逻辑.
    > 参考博客
  • 实际步骤:
  1. 移动到PHP项目目录下.
  2. 创建目录mkdir thrift_php_server_client_demo.
  3. 复制上面解压目录PHP相关文件到thrift_php_server_client_demo目录下:
    > cp -r 你的解压目录/lib/php/lib/Thrift/ xxx/thrift_php_server_client_demo
    > cp -r 你的解压目录/tutorial/php/ xxx/thrift_php_server_client_demo
    > cp 你的解压目录/tutorial/tutorial.thrift xxx/thrift_php_server_client_demo
    > cp 你的解压目录/tutorial/shared.thrift xxx/thrift_php_server_client_demo
  4. 生成php代码thrift -r --gen php tutorial.thrift
    > 可参考官方文档Apache Thrift Tutorial
  5. 运行PHP服务端php -S localhost:8080
  6. 运行客户端php php/client.php --http,即可以看到结果运行结果,运行服务端的终端也会显示请求过程.
    > 注:我在运行客户端文件时,一直提示server.php里\tutorial\CalculatorProcessor类找不到,开始以为是我命名空间或其它配置有问题,后来查看对比了这个php-thrift-server项目才知道,我使用步骤4生成的目录文件(gen-php/tutorial/Calculator.phpgen-php/shared/SharedService.php)里都缺少相关内容,这个可太坑了,花费了好长时间才发现;我clone了这个项目后,用这个项目里的thrift文件生成代码后也缺少相关类的内容,我怀疑是我安装的thrift版本的问题,把内容加上就正常了。
  7. 我的github示例地址,下载代码即可使用上述步骤5和步骤6运行.

fg和bg简述

Linux的bg和fg命令

我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的任务。

假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然后可以看到系统提示(方括号中的是作业号):
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了。

fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
一,& 最经常被用到
这个用在一个命令的最后,可以把这个命令放到后台执行
二,ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
三,jobs
查看当前有多少在后台运行的命令

四,fg
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
五,bg
将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

SOA和微服务架构的区别

  • 首先,可以肯定的是SOA和微服务的确是一脉相承的.
  • SOA:面向服务的架构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.
  • 以一个公司为例:有基层员工 有管理层 有老板,最初大家都听老板指挥,谁干什么,根据需要,你可能今天干A事情,明天干B事情,后来人越来越多了,事情也越来越多了,做事情的效率越来越低,管理也很混乱;
  1. 现在开始做部门划分(服务化),不同部门做不同事情,IT部门只做研发,人事部门只做招聘;
  2. 这个时候就无法避免的发生跨部门协作(服务器调用);
  3. 但是你怎么知道有这样一个部门可以做这个事情呢?这就要依赖行政部门(注册中心);
  4. 新成立的部门要在行政那里做一个备案(服务注册);
  5. 然后公布一下,让其他部门知道(服务发布),大家就可以在新的工作秩序里面嗨皮的上班了,这个时候依然是在公司的组织架构中运转;
  6. 上述就是我理解的SOA的概念.
  • 微服务:微服务有一定SOA的概念在里面,只是在粒度中,微服务更加细一点;
  1. 比如说用户业务服务:登录 注册 个人中心 包含3个业务,SOA中都由userService提供的;
  2. 但是在微服务中,登录会被独立出来一个微服务,注册也会被独立出来微服务,他们可能采用不同的语言开发,相对SOA的粒度更细,业务场景耦合更低;
  3. 另外微服务强调一个去中心化,上述的公司的组织架构会被打散,没有老板,没有管理层,每一个人都是一个服务,做着自己的事情;
  • 还是以公司举例:
  1. 工资计算是会计的事情,但我把会计部门独立出来一个公司(微服务),他们不仅能计算自己公司的财务情况,还能帮别的公司计算账务情况;
  2. IT部门只做研发,但我把IT部门独立出来一个公司(微服务),他们不仅能给自己公司开发项目,也能接别的公司的项目;
  3. 同理,HR也能客串一把猎头.

转载但有许多修改,转载地址