git format-patch and git diff

git中则提供了两种patch方案:

用git diff生成的标准patch,可以提供上述的patch命令使用。
用git format-patch生成的git专用patch。
两种patch的比较:

兼容性:很明显,git diff生成的patch兼容性强。如果你在修改的代码的官方版本库不是git管理的版本库,那么你必须使用git diff生成的patch才能让你的代码被项目的维护人接受。
除错功能:对于git diff生成的patch,你可以用git apply –check查看补丁是否能够干净顺利地应用到当前分支中;如果git format-patch生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作,你也可以使用git am -3进行三方合并,详细的做法可以参考git手册或者《Progit》。从这一点上看,两者除错功能都很强。
提交信息:由于git format-patch生成的补丁中含有这个补丁开发者的名字,因此在应用补丁时,这个名字会被记录进版本库,显然,这样做是恰当的。因此,目前使用git的开源社区往往建议大家使用git format-patch生成补丁。

git merge 和 git rebase

git merge简要说明

  1. git merge会产生一次新的commit版本,并且此版本会有2个或者更多个父提交,可以通过HEAD^1,HEAD^2,HEAD^n方法来引用此提交的父提交。
  2. git merge是非破坏性的(non-destructive)操作,没有负作用,并且被合并的这些分支都可以git push发布到remote公共仓库中。
  3. 由于每次合并会产生一次新的提交历史,如果主分支非常活跃,就会产生很多这种合并分支的提交历史,会对项目本身的提交历史产生污染。
    git-rebase-test.sh测试脚本

git rebase简要说明

  1. git rebase 会产生一个修改过的很干净的项目提交历史,例如在feature分支上git rebase master,会将feature分支上的提交添加到master分支的最顶端。
  2. git rebase操作有负面效果,影响项目提交历史的安全性(safety)和可追溯性(traceability)。
  3. git rebase -i master可以交互式压缩提交(squash)或者忽略指定提交。
  4. git rebase使用黄金守则: NEVER USE IT ON PUBLIC BRANCHES.
  5. 不要将主分支rebase到特性分支上(don’t rebased master onto your feature branch: git rebase feature)。
  6. 其他开发者提交的新特性和修改(如patch)应该创建一个临时分支apply这些修改,再使用git merge合并修改到主分支上,而不是使用git rebase方式操作,因为rebase操作修改了提交历史,很难追溯哪些提交新增了这些特性和修改。

关于文件大小写

突然发现自己的电脑中,git对文件大小写是不敏感的,执行下面的命令吧

1
2
3
4
# 全局
git config --global core.ignorecase false
# 项目
git config core.ignorecase false

修正文件大小写

受文件系统的影响,直接修改可能会行不通

1
2
git mv filename FileName
# fatal: destination exists

方案1

1
2
git mv filename filename_tmp
git mv filename_tmp FileName

方案2(awesome)

1
git mv -f filename FileName

git本地化操作

很多时候我们会有一些本地化的代码修改操作,却并不想污染到代码仓库,有如下技巧

.git/info/exclude文件中进行文件的跟踪忽略,效果同.gitignore

假定开发人员不会更改文件,此标志用于提高 not-changing 文件夹(如SDK)的性能。
git update-index –skip-worktree

用于命 GIT 不再染指特定文件,即便开发人员可能更改它
git update-index –assume-unchanged

mysql配置远程访问

建立远程访问用户

1
2
3
4
5
GRANT ALL PRIVILEGES ON *.* TO 'YOURUSER'@'%' IDENTIFIED BY 'YOURPASSWORD' WITH GRANT OPTION;
FLUSH PRIVILEGES;
#查看结果:
SELECT * from information_schema.user_privileges where grantee like "'YOURUSER'%";

配置my.cnf,通常是/etc/mysql/my.cnf,找到并注释掉下面语句

1
2
3
bind-address = 127.0.0.1 # 或者改成 bind-address = 0.0.0.0
skip-networking

重启服务器

Bonus-Tip: Revoke Access

If you accidentally grant access to a user, then better have revoking option handy.

1
2
3
4
5
#Following will revoke all options for THEUSER from all machines:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'THEUSER'@'%';
#Following will revoke all options for THEUSER from particular IP:
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'THEUSER'@'1.2.3.4';

Its better to check information_schema.user_privileges table after running REVOKE command.

If you see USAGE privilege after running REVOKE command, its fine. It is as good as no privilege at all. I am not sure if it can be revoked.

那些概念

全局变量的缺点

全局变量的优点是使用方便。 其缺点也是明显的,这里指针对两点说明

  • 不能保证值的正确性;因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误非常难以发现。

  • 如果在多线程中使用全局变量,你的程序将会错的一塌糊涂。多线程会修改另一个线程使用的全局变量的值,如果不注意,一旦出错后果不堪设想。所以在这种情况下万不得意不要使用全局变量。

  • 增加了模块的偶合

  • 全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存。与局部变量的动态分配、动态释放相比,生存期比较长,因此过多的全局变量会占用较多的内存单元。

  • 全局变量破坏了函数的封装性能。前面的章节曾经讲过,函数象一个黑匣子,一般是通过函数参数和返回值进行输入输出,函数内部实现相对独立。但函数中如果使用了全局变量,那么函数体内的语句就可以绕过函数参数和返回值进行存取,这种情况破坏了函数的独立性,使函数对全局变量产生依赖。同时,也降低了该函数的可移植性。

  • 全局变量使函数的代码可读性降低。由于多个函数都可能使用全局变量,函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都非常不利。

全局函数 静态方法

global method适合定义一种与任何对象无紧密联系的服务

static method适合定义与对象类型关系密切,但是与单一对象不十分密切的服务。

函数副作用&纯函数

在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。

函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并降低程序的可读性。严格的函数式语言要求函数必须无副作用。

如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么,该函数就不是纯函数,叫作非纯函数(Impure Function)。

php中的异常与错误

异常是指程序运行中不符合预期情况以及与正常流程不同的状况。错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查设置无法运行的情况。

php只有在你throw 一个异常后,才能用try…catch来捕获异常(一般情况下如此,也有部分异常可以自动捕获)。

历史原因导致php的异常处理是不足的,绝大多数情况下,无法自动抛出异常,必须使用if…else先进行判断,再手动抛出异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
function customError($errno, $errstr, $errfile, $errline)
{
//自定义错误处理是,手动抛出异常
throw new Exception($errstr);
}
set_error_handler('customError', E_ALL | E_STRICT);
try {
$a = 5/0;
} catch (Exception $e) {
echo '错误信息:', $e->getMessage();
}

fetal error这样的错误无法捕获,也无法在发生后恢复流程处理,但是可以使用register_shutdown_function()函数在程序终止或die时触发一个函数,给程序带来一个短暂的回光返照。在php4时,不支持析构函数,也常用于模拟实现析构函数。

Parse error级别的错误,除了修改ini文件,将错误信息写到日志中,什么也做不了。

无论是错误还是异常,都可以使用handler接管系统已有的处理机制。