git 命令

删除远程分支

1
2
3
4
# As of Git v1.7.0, you can delete a remote branch using
git push origin --delete <branch_name>
# which is easier to remember than
git push origin :<branch_name>

git用得时间多了,会变慢。 那么可以用下面的命令优化一下

1
2
git gc - Cleanup unnecessary files and optimize the local repository
git-repack - Pack unpacked objects in a repository

那些git命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
git push origin test:test # 提交本地test分支作为远程的test分支
git push --tags # 上传所有标签
git remote set-url --push [name] [newUrl] # 修改远程仓库
git pull [remoteName] [localBranchName]
git push [remoteName] [localBranchName]
git merge [name] # 将名称为[name]的分支与当前分支合并
git rebase [name] #会将[name]分支的代码合并过来,并按照提交的顺序排序(衍合指定分支到分支到当前分支)
git merge-base branchA branchB #查看2分支的公共节点
git diff $(git-merge-base A B) B
# 按时间逆序列出提交对象,常用于查找涉及到某些文件的提交的hash
git rev-list
git shortlog
# 查看在branch上的,但不在master上的记录
git log branch --not master
git fsck --lost-found //检查丢失的提交
git ls-files --stage //可以显示出索引的内容
git checkout . //撤销所有修改
git clean -xfd //连 gitignore 的untrack 文件/目录也一起删掉
git branch --merged | xargs git branch -d //删除已经合并的分支
# list all ignored files in this project
git ls-files --other --ignored --exclude-stanard
# reset and preserve uncommitted local changes
git reset --keep $COMMIT
# create a new tracking branch based on a remote branch
git checkout --track $UPSTREAM/$REMOTE_BRANCH

View a file in a different Git branch without changing branches

1
2
3
4
git checkout $REVISION -- $FILE
git checkout $REVISION -- "*" switch all files without changing brnaches
git show $REVISION:$FILE
git checkout --orphan $BRANCH

Make an existing Git branch track a remote branch

1
2
3
4
5
6
7
8
9
10
git branch -u $UPSTREAM/$REMOTE_BRANCH $LOCAL_BRANCH
git branch --set-upstream-to=$UPSTREAM/$REMOTE_BRANCH
git push -u $UPSTREAM $REMOTE_BRANCH
git remote add $UPSTREAM <remote-url>
git fetch $UPSTREAM
git branch -f --track $LOCAL_BRANCH $UPSTREAM/$REMOTE_BRANCH
# OR:
git branch --set-upstream $LOCAL_BRANCH $UPSTREAM/$REMOTE_BRANCH

diff changes only among certain file(s)

1
2
3
4
git diff $BRANCH1 $BRANCH2 -- $FILE1 $FILE2
(branch1 is optional and your current branch (the branch you are on) will be considered by default if branch1 is not provided)
git diff $REVISION $FILE

other command

1
2
3
4
5
6
7
8
9
10
bisect #Find by binary search the change that introduced a bug
grep #Print lines matching a pattern
git log --since="two weeks ago" --until="two days ago"
git log --since=four.days --until=two.days
git instaweb
git ls-tree #view git tree view
git rm -rf . # Delete everything in the orphan branch
git stash save --keep-index # stash only unstaged files
git merge --squash $BRANCH
git rev-parse --abbrev-ref HEAD #判断当前分支

列出当天某人的所有提交记录

1
git log --author=AUTHOR --oneline --since="6am" --graph --all --decorate

Find the nearest parent branch of the current git branch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env zsh
branch=`git rev-parse --abbrev-ref HEAD`
git show-branch | ack '\*' | ack -v "$branch" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'`
# How it works:
# 1| Display a textual history of all commits.
# 2| Ancestors of the current commit are indicated
# by a star. Filter out everything else.
# 3| Ignore all the commits in the current branch.
# 4| The first result will be the nearest ancestor branch.
# Ignore the other results.
# 5| Branch names are displayed [in brackets]. Ignore
# everything outside the brackets, and the brackets.
# 6| Sometimes the branch name will include a ~2 or ^1 to
# indicate how many commits are between the referenced
# commit and the branch tip. We don't care. Ignore them.

or

1
2
branch=`git rev-parse --abbrev-ref HEAD`
git show-branch -a 2>/dev/null | grep '\*' | grep -v "$branch" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'

iTerm2奇淫技巧

control + a
回到行首。这个对于用过unix系统的童鞋来说再熟悉不过。

control + e
有了回到行首,当然不能错过光标回到行尾,写文章,打命令,这两个快捷键都是用的很频繁的。

control + w
删除之前一个单词。这个快捷键是我意外发现的,既然有删除之前一个单词,我觉得应该会有删除后面一个单词,但我至今没发现,如果你会请告诉我,重金打赏。

control + u
清除当前行。

control + p
上一条命令。

control + k
删除命令行文本到末尾。

control + l
清屏。

control + r
搜索命令历史。这个也是我经常用的快捷键,有时候你忘了正行命令,用这个命令很不错的,当然history | grep ** 会更有用些。

前一标签页
+ shift + Left

后一标签页
+ shift + Right

配置linux服务器常用命令

安装lnmp

1
2
3
4
5
6
7
8
9
sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
sudo apt install -y language-pack-en-base
locale-gen en_US.UTF-8
sudo apt -y install php7.1
sudo apt install -y php7.1-fpm php7.1-mysql php7.1-curl php7.1-xml php7.1-mcrypt php7.1-json php7.1-gd php7.1-mbstring
sudo apt install mysql-server-5.7
sudo apt install nginx
sudo apt install redis-server php-redis

安装composer

1
2
3
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"\nphp composer-setup.php
php -r "unlink('composer-setup.php');"

配置 www \ www-data 用户权限

1
2
3
4
5
sudo -Hu www-data ssh-keygen -t rsa -C "entimm@gmail.com"
sudo chown -R www-data:www-data /var/www/
sudo visudo
sudo passwd www-data
vim /etc/passwd

安装ohmyzsh

1
2
apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

安装配置node环境

1
2
3
4
5
curl --silent --location https://deb.nodesource.com/setup_4.x | bash -
apt install -y nodejs
npm install -g gulp
npm install -g bower
echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \\n --cache=$HOME/.npm/.cache/cnpm \\n --disturl=https://npm.taobao.org/dist \\n --userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc

shell

shell 中的判断

  1. 字符串判断

str1 = str2     当两个串有相同内容、长度时为真
str1 != str2    当串str1和str2不等时为真
-n str1       当串的长度大于0时为真(串非空)
-z str1       当串的长度为0时为真(空串)
str1         当串str1为非空时为真

  1. 数字的判断

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

-n “$var” 判断一个变量是否有值

3 文件的判断

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

3、复杂逻辑判断

-a         与
-o        或
!         非

ssh保持链接

Client configuration

Try creating the file: ~/.ssh/config
Add the contents:

1
2
3
Host *
ServerAliveInterval 30
ServerAliveCountMax 5

Server configuration

Edit configuration file: /etc/ssh/sshd_config

1
2
ClientAliveInterval 20
ClientAliveCountMax 5

快速搭建vpn

VPS端一键安装Shadowsocks (SS Python版一键安装脚本支持CentOS 6,7,Debian所有版本,Ubuntu所有版本),

1
2
3
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log

中间会提示输入SS SERVER使用的端口和连接密码。不输入则是系统默认.

安装完成后,脚本提示如下(记得记录下来):
Congratulations, shadowsocks install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

看到以上提示后就表明VPS上SS已经安装成功,并且已经设置了开机启动,VPS重启后不用手工启动SS。
到此就安装成功可以科学上网了

卸载方法:
使用root用户登录,运行以下命令:

1
./shadowsocks.sh uninstall

单用户配置文件 Sample:
配置文件路径:/etc/shadowsocks.json

1
2
3
4
5
6
7
8
9
10
{
"server":"0.0.0.0",
"server_port":8989,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"yourpassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

多用户多端口配置文件 Sample:
配置文件路径:/etc/shadowsocks.json
```
{
“server”:”0.0.0.0”,
“local_address”:”127.0.0.1”,
“local_port”:1080,
“port_password”:{
“8989”:”password0”,
“9001”:”password1”,
“9002”:”password2”,
“9003”:”password3”,
“9004”:”password4”
},
“timeout”:300,
“method”:”aes-256-cfb”,
“fast_open”: false
}

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

那些配置

phpstorm 外部工具

Open Project With Subline
subl
$ProjectFileDir$
$ProjectFileDir$

Open File With Sublime
subl
$FilePath$:$LineNumber$
$ProjectFileDir$

PHP CS Fixer
/usr/local/bin/php-cs-fixer
–level=psr2 –verbose fix $FileDir$/$FileName$
$ProjectFileDir$

从连接中使用subl打开所连接文件

https://github.com/dhoulb/subl.git

接替app端的请求

电脑安装抓包工具(使用charles/fiddler)

同个局域网内,配手机代理,让手机的请求统统都要经过你的电脑

改电脑的hosts

1
2
3
192.168.0.100 test.api.entimm.com
# 反向代理用的
127.0.0.1 api.entimm.com

最后上nginx的反向代理

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
listen [::]:80;
server_name api.entimm.com;
location / {
proxy_pass http://test.api.entimm.com;
}
}

搞定!

快速搭建服务器

下载 deploy.sh 脚本

14.04安装脚本
wget https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/deploy.sh

16.04安装脚本
wget https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/deploy-16.sh

设置 MYSQL 密码

vi deploy.sh:

1
2
3
4
# Configure
MYSQL_ROOT_PASSWORD=""
MYSQL_NORMAL_USER="estuser"
MYSQL_NORMAL_USER_PASSWORD=""

开始安装

有需要的话可以使用网易镜像加速:
wget http://mirrors.163.com/.help/sources.list.trusty -O /etc/apt/sources.list

运行脚本:

1
2
chmod +x deploy.sh
./deploy.sh

注:请使用 root 运行。

安装完以后的配置和注意事项

php tips

  • explode 分割字符可以不是单字符

  • 强制类型转换的值不论是否有定义,转换后都会有值

  • E_ALL ^ E_NOTICE 和 E_ALL & ~E_NOTICE 是等效的

  • 无论是函数调用还是文件包含,像 FILE 这种变量,他写在哪个文件,那么他的值就在哪个文件,而不受调用者影响

  • 静态变量是在编译时解析的,不能跟表达式,比如:static $int = sqrt(121)

  • 子类重载父类的属性和方法时,可见性不能比父类小

  • 自 PHP 5.4 起可用 callable 类型指定回调类型 callback

    1. 一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()

    2. 一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名

    3. 静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 ‘ClassName::methodName’

    4. 也可传递 closure 给回调参数

  • 对浮点数,数字字符串,纯字母都能进行自增/减运算,对其他类型的值进行自增/减运算不会产生什么效果

  • call_user_func_array 如果回调函数默认设置需要接受的参数是引用传递的时候,按值传递,结果将会输出一个警告, 这时数组参数中的参数需要按引用传递

  • call_user_func 如果回调函数默认设置需要接受的参数是引用传递的时候,无论怎样传参都无法满足

  • 常量NAMESPACE的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串

  • 关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符
  • 命名空间不会因为被包含而影响其在包含文件中的使用方式

  • mysqli::real_escape_string 相比 addslashes 会针对真实数据库环境的字符集做出更好的处理,但是必须在建立数据库链接的基础上

  • 字符串类型变量可以直接当做一个数组,通过数字下面来访问字符串中的字符或者是通过 str_split 函数把字符串分割成单字符数组

那些有趣的代码片段

1
2
3
function multi ($a, $b) {
$b = is_array($b) ? $b : array_slice(func_get_args(), 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function incr()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
incr();
}
echo $count;
$count--;
}
incr();
// 结果输出:1234567891010987654321

不使用临时变量,交换2数的数值
下面三种方法不能对自身进行交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 不仅对数字有效,对字符串也是有效的
function swap1(&$x, &$y)
{
$x = $x ^ $y;
$y = $x ^ $y;
$x = $x ^ $y;
}
// 当心越界
function swap2(&$x, &$y)
{
$x = $x + $y;
$y = $x - $y;
$x = $x - $y;
}
// 当心越界、第二个数不能为0
function swap3(&$x, &$y)
{
$x = $x * $y;
$y = $x / $y;
$x = $x / $y;
}

命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace Myns;
class Test
{
}
// ok
new namespace\Test;
// ok
new Test;
// ok
$a = __NAMESPACE__ . '\Test';
new $a;
// ok
$a = 'Myns\Test';
new $a;
// failed, Class 'Myns\Myns\Test' not found
new Myns\Test;

这样的自增运算

1
2
3
4
5
6
7
8
9
10
11
<?php
$i1 = 0;
$i2 = 0;
$a= ++$i1 + ++$i1 + ++$i1;
$b= $i2++ + $i2++ + $i2++;
echo $a;
echo PHP_EOL;
echo $b;
// result:
// 6
// 3

安全两个原则

  1. 永远不要相信用户输入的东西。
  2. 将自己需要输出的数据进行转义。

对象的另一种理解