Code Monkey home page Code Monkey logo

dzlzh.github.io's Introduction

Hi there 👋

Anurag's github stats

dzlzh.github.io's People

Contributors

dzlzh avatar

Stargazers

 avatar

Watchers

 avatar  avatar

dzlzh.github.io's Issues

Docker 命令速查表

查看 Docker 的守护进程

service docker start

Docker 系统启动时运行

chkconfig docker on

登录 https://hub.docker.com/

docker login

查找官方仓库中的镜像

docker search

创建镜像

docker pull [ubuntu]

运行容器

docker run
    -t -i
    -d      //后台运行

启动已终止容器

docker start
    -i

终止容器

docker stop

终止并重启

docker restart

进入容器

docker attach

列出容器

docker ps
    -a

查看容器输出信息

docker log

列出本地镜像

docker images

提交更新

docker commit

    -m "" -a "作者"

修改镜像的标签

docker tag

创建新镜像 Dockerfile

docker buila

上传到仓库

docker push

导出镜像

docker save

裁入镜像

docker load

移除本地镜像

docker rmi

移除容器

docker rm

导出某个容器

docker export

导出某个容器

docker import

PHP 函数可变数量的参数列表

PHP5.5 及更早版本

使用以下函数:

function test()
{
    echo '参数总数;', func_num_args(), "\n";
    echo '第一个参数:', func_get_arg(0), "\n";
    echo '全部参数;';
    print_r(func_get_args());
}

test(1, 2, 3, 4);

/*
参数总数;4
第一个参数:1
全部参数;Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
)
*/

PHP5.6 及以上版本

使用 ... 语法实现

function test(...$params)
{
    print_r($params);
}

test(1, 2, 3, 4);

/*
Array         
(             
    [0] => 1  
    [1] => 2  
    [2] => 3  
    [3] => 4  
)
*/

PHP 小技巧

  • foreach 效率更高,尽量用 foreach 代替 whilefor 循环
  • 循环内部不要声明变量,尤其是对象这样的变量
  • 循环里别用函数
  • 在多重嵌套循环中,如有可能,应当将最长的循环放在内层,最短循环放在外层,从而减少 cpu 跨循环层的次数,优化程序性能
  • 用单引号替代双引号引用字符串以实现 PHP 性能优化
  • i+=1 代替 i=i+1。符合 c/c++ 的习惯,效率还高
  • 优化 Select SQL 语句,在可能的情况下尽量少的进行 InsertUpdate 操作,达到 PHP 性能优化的目的
  • 某些地方使用 isset 代替 strlen
  • 尽量的少进行文件操作,虽然 PHP 的文件操作效率也不低的
  • 尽可能的使用 PHP 内部函数
  • 在可以用 PHP 内部字符串操作函数的情况下,不要用正则表达式
  • 在可以用 file_get_contents 替代 filefopenfeoffgets 等系列方法的情况下,尽量用 file_get_contents,因为它的效率高得多。但是要注意 file_get_contents 在打开一个 URL 文件时候的 PHP 版本问题
  • 不要随便就复制变量
  • Apache 解析一个 PHP 脚本的时间要比解析一个静态 HTML 页面慢 2 至 10 倍。尽量多用静态 HTML 页面,少用脚本
  • 试着喜欢使用三元运算符(?:)
  • 使用选择分支语句,switch case 好于使用多个 ifelse if 语句,并且代码更加容易阅读和维护
  • echo 字符串时用逗号代替点连接符更快些。echo 一种可以把多个字符串当作参数的 “函数”。echo 是语言结构,不是真正的函数,故把函数加上了双引号
  • 去除 HTML 标签以及空格换行等字符 preg_replace("/(\s|\ \;| |\xc2\xa0)/", "", strip_tags($str))
  • 目录分隔符 DIRECTORY_SEPARATOR
  • 多路径分隔符 PATH_SEPARATOR
  • bool || die()

PHP7 install

0x00 下载源码 & 解压

wget http://php.net/get/php-7.1.7.tar.bz2/from/this/mirror -O php-7.1.7.tar.bz2
tar xjf php-7.1.7.tar.bz2
cd php-7.1.7

0x01 配置

./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-mysqli \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-libxml-dir=/usr \
--enable-xml \
--with-mhash \
--with-mcrypt \
--enable-pcntl \
--enable-sockets \
--with-bz2 \
--with-curl \
--enable-mbregex \
--with-gd \
--enable-gd-native-ttf \
--enable-zip \
--enable-soap \
--with-iconv \
--enable-sysvshm \
--enable-sysvmsg \
--with-pdo-mysql

可能会报错缺少库,按照错误安装好库。

我使用的是 ubuntu 中间安装了

  • gcc
  • make
  • libxml2-dev
  • libcurl4-openssl-dev
  • pkg-config
  • libbz2-dev
  • libjpeg-dev
  • libpng12-dev
  • libfreetype6
  • libfreetype6-dev
  • libmcrypt-dev

0x02 编译 & 安装

make & make install

PHP 安全小记

一切输入都是不可信的

一切输入都是不可信的

一切输入都是不可信的

变量的处理

web 程序中所有 get post cookies update_files 来的变量都是不可信的

  • 输入的变量组成 mysql SQL 前都要用 mysql_real_escape_string() 处理
  • 输入的变量回显在页面或者存入数据库钱都要用 htmlspecialchars() 函数处
  • 对于传入的整数或浮点数可以使用 intval()floatval() 处理
  • 关闭 magic_quotes_runtime 安全掌握到自己的手里 set_magic_quotes_runtime(false)

数据加密

序列化 -> 加密 -> 解密 -> 反序列化

$userinfo = '信息'; //用户信息
$secureKey = '密钥'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
echo "用户信息加密前:".$str;
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secureKey, $str, MCRYPT_MODE_ECB));
echo "用户信息加密后:".$str;
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str); 
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secureKey, base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:\n";
var_dump($uinfo);

密码加密

$password = '密码';
$salt = substr(uniqid(rand()), -6);
echo $salt . "\n";
$password = md5(md5($password).$salt);
echo $password;

CSS 杂记

css 样式优先级

内联样式表(标签内部)> 嵌入样式表(当前文件中)> 外部样式表(外部文件中)。

权值

浏览器会根据权值来判断使用哪种 css 样式的,权值高的就使用哪种 css 样式。

  • 标签的权值为 1
  • 类选择符的权值为 10
  • ID 选择符的权值最高为 100
p{color:red;}  /*权值为1*/
p span{color:green;}  /*权值为1+1=2*/
.warning{color:white;}  /*权值为10*/
p span.warning{color:purple;}  /*权值为1+1+10=12*/
#footer .note p{color:yellow;}  /*权值为100+10+1=111*/
p{color:red!important;}  /*权值为1但是因为有!important为最高权值*/

可以用 !important 来设置最高权值 !important 优先级样式,权值高于用户自己设置的样式。

层叠

层叠就是在 html 文件中对于同一个元素可以有多个 css 样式存在,当有相同权重的样式存在时,会根据这些 css 样式的前后顺序来决定,处于最后面的 css 样式会被应用。

px/em/pt 单位

  • px 像素 Pixel, 相对长度单位
  • em 相对长度单位, 相对于当前对象内文本的字体尺寸
  • pt 点(Point), 绝对长度单位

如果元素的 font-size 为 14px ,那么 1em = 14px;如果 font-size 为 18px,那么 1em = 18px。

盒模型代码简写

盒模型方向 上、右、下、左。(顺时针)

MySQL 8.0.11 踩坑记

在 MySQL 8.0.11 中默认的认证方式为 caching_sha2_password,导致数据库链接错误。

解决方法

1.修改密码认识方式

ALTER USER 'USER'@'HOST' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';

2.修改 MySQL 配置,重新创建用户

default-authentication-plugin = mysql_native_password

robots.txt

什么是 robots.txt

robots.txt 是一个纯文本 txt 文件,主要是为百度蜘蛛准备的,与我们用户没有丝毫关系,它是百度蜘蛛访问网站的时候要查看的第一个文件,robots.txt 文件告诉百度蜘蛛在服务器上什么文件是可以被查看的,哪些网页可以收录,哪些不允许收录,对与 seo 优化而言,放置一个 robots.txt 是对搜索引擎有好的表现,robots.txt 必须放置在一个站点的根目录下,且文件名必须全部小写。

robots.txt 作用

robots.txt 主要作用是保障网络安全与网站隐私,百度蜘蛛遵循 robots.txt 协议。通过根目录中创建的纯文本文件 robots.txt,网站就可以声明哪些页面不想被百度蜘蛛爬行并收录,每个网站都可以自主控制网站是否愿意被百度蜘蛛收录,或者指定百度蜘蛛只收录指定的内容。当百度蜘蛛访问某个站点时,它会首先检查该站点根目录下是否存在 robots.txt,如果该文件不存在,那么爬虫就沿着链接抓取,如果存在,爬虫就会按照该文件中的内容来确定访问的范围。

robots.txt 文件的格式

  • User-agent:_ 空白处为定义搜索引擎的类型;
  • Crawl-delay:_ 空白处为定义抓取延迟;
  • Disallow:_ 空白处为定义禁止搜索引擎收录的地址;
  • Allow:_ 空白处为定义允许搜索引擎收录的地址;
  1. 禁止所有 SE(搜索引擎)收录网站的某些目录:
    • User-agent: *
    • Disallow: / 目录名 1/
    • Disallow: / 目录名 2/
    • Disallow: / 目录名 3/
  2. 禁止某个 SE(搜索引擎)收录本站,例如禁止百度:
    • User-agent: Baiduspider
    • Disallow: /
  3. 禁止所有 SE(搜索引擎)收录本站:
    • User-agent: *
    • Disallow: /

iconv(): Detected an illegal character in input string

在导出 .csv 数据时,需要把 UTF-8 的数据转成 GBK 发现有好多错误:

iconv(): Detected an illegal character in input string

错误原因可能是存在 GBK 不包含的字,于是使用更大的字符集 GB18030 ,修改后的代码为:

$value = iconv('UTF-8', 'GB18030', $value);

后翻阅 iconv 的文档后,可加上 //TRANSLIT//IGNORE 两个选项。修改后的代码为:

$value = iconv('UTF-8', 'GB18030//TRANSLIT//IGNORE', $value);

参考资料

Manjaro 安装并配置

pacman

pacman -S    # 安装
pacman -R    # 删除单个软件包,保留其全部已经安装的依赖
pacman -Rs   # 删除指定软件包,及其所有没有被其他已安装软件使用的依赖
pacman -Rsc  # 删除软件包和所有依赖这个软件包的程序
pacman -Rdd  # 删除软件包,但不删除依赖这个软件包的其他程序
pacman -Syu  # 升级软件包
pacman -Syyu # 强制升级软件包
pacman -Sc   # 清理软件包缓存
pacman -Scc  # 清理所有软件包缓存
pacman -Ss   # 查询软件包数据库
pacman -Qs   # 查询已安装的软件包

yay -S  --mflags --skipinteg # 跳过checksums

初始化

sudo pacman-mirrors -GB testing -c China
sudo pacman-mirrors -c China
sudo pacman-mirrors -i -c China -m rank
sudo vim /etc/pacman.conf
    [archlinuxcn]
    SigLevel = Optional TrustedOnly
    Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
    # Server = https:://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
sudo pacman -Syu
sudo pacman -S archlinuxcn-keyring
sudo pacman -Syyu # 强制升级软件包
sudo pacman -Sy yay

字体

yay -S wqy-zenhei wqy-microhei-lite wqy-microhei wqy-bitmapfont
yay -S ttf-font-awesome paper-icon-theme ttf-weather-icons
# yay -S ttf-font-icons
# yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji
# yay -S adobe-source-code-pro-fonts adobe-source-han-serif-cn-fonts adobe-source-han-sans-cn-fonts
# 安装 powerline 字体
git clone https://github.com/powerline/fonts.git --depth=1
fc-cache -vf

常用软件

# polybar rofi dunst feh 
yay -S polybar rofi dunst feh 
# fcitx-rime
yay -S fcitx-im fcitx-configtool fcitx-rime
# jq aria2 ag
yay -S jq aria2 the_silver_searcher
# nvim tmux
yay -S neovim tmux
# zsh oh-my-zsh
yay -S zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
# v2ray Or shadowsocks
yay -S v2ray
yay -S shadowsocks
# google chrome
# google-chrome-stable --proxy-server="socks5://127.0.0.1:1080"
yay -S google-chrome
# deepin-screenshot
yay -S deepin-screenshot
# wechat
# /opt/deepinwine/apps/Deepin-WeChat/run.sh
yay -S deepin-wine-wechat
# music
yay -S iease-music
# Redshift Or f.lux
yay -S redshift
yay -S fluxgui
# xprop
yay -S xorg-xprop
# xrandr
# xrandr --output VGA1 --primary --auto --output VGA1 --auto --left-of LVDS1
yay -S xorg-xrandr
# telegram
yay -S telegram-desktop
# Rambox
yay -S rambox

VirtualBox

yay -S virtualbox $(pacman -Qsq "^linux" | grep "^linux[0-9]*[-rt]*$" | awk '{print $1"-virtualbox-host-modules"}' ORS=' ')
sudo vboxreload
sudo gpasswd -a $USER vboxusers

Centos7 编译安装 Libmcrypt 库

0x00 先下载 libmcrypt 库源码

libmcrypt-2.5.8.tar.gz 或者去这里 libmcrypt 下载你需要的版本。

0x01 将下载的源码解压到文件夹

tar -zxvf libmcrypt-2.5.8.tar.gz

0x02 进入文件夹

cd libmcrypt-2.5.8

0x03 配置

./configure

0x04 编译 && 安装

make && make install

到此,libmcrypt 库安装成功。

PHP - 魔术常量、魔术方法

PHP - 魔术常量

__LINE__

文件中的当前行号

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

__FUNCTION__

函数名称常量返回该函数被定义时的名字(区分大小写)。

__CLASS__

类的名称常量返回该类被定义时的名字(区分大小写)。

__TRAIT__

Trait 的名字常量返回 trait 被定义时的名字(区分大小写)。

__METHOD__

类的方法名返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

PHP - 魔术方法

构造函数

void __construct ([ mixed $args [, $... ]] )

PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

析构函数

oid __destruct ( void )

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

方法重载

public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )

在对象中调用一个不可访问方法时,__call() 会被调用。

用静态方式中调用一个不可访问方法时,__callStatic()会被调用。

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。

属性重载

public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset()empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

Note: 因为 PHP 处理赋值运算的方式,__set() 的返回值将被忽略。类似的, 在下面这样的链式赋值中,__get() 不会被调用:$a = $obj->b = 8

Note: 在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。为避开此限制,必须将重载属性赋值到本地变量再使用 empty()

__sleep()__wakeup()

public array __sleep ( void )
void __wakeup ( void )

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

Note:__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

__toString()

public string __toString ( void )

__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

__invoke()

mixed __invoke ([ $... ] )

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

__set_state()

static object __set_state ( array $properties )

自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。

本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。

PHP: 魔术常量

PHP: 魔法方法

正则表达式小记

  • \ 一般用于转义字符
  • [] 字符类定义
  • | 开始一个可选分支
  • () 子组
  • - 标记字符范围

常用的元字符

  • . 匹配除换行符以外的任意字符
  • \w 匹配字母或数字或下划线或汉字
  • \s 匹配任意的空白符
  • \d 匹配数字
  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束

常用的限定符

  • * 重复零次或更多次
  • + 重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复 n 次
  • {n,} 重复 n 次或更多次
  • {n,m} 重复 n 到 m 次

常用的反义代码

  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配任意非数字的字符
  • \B 匹配不是单词开头或结束的位置
  • [^x] 匹配除了 x 以外的任意字符
  • [^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符

常用分组语法

捕获

  • (exp) 匹配 exp,并捕获文本到自动命名的组里
  • (?<name>exp) 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)
  • (?:exp) 匹配 exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

  • (?=exp) 匹配 exp 前面的位置
  • (?<=exp) 匹配 exp 后面的位置
  • (?!exp) 匹配后面跟的不是 exp 的位置
  • (?<!exp) 匹配前面不是 exp 的位置

注释

  • (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

懒惰限定符

  • *? 重复任意次,但尽可能少重复
  • +? 重复 1 次或更多次,但尽可能少重复
  • ?? 重复 0 次或 1 次,但尽可能少重复
  • {n,m}? 重复 n 到 m 次,但尽可能少重复
  • {n,}? 重复 n 次以上,但尽可能少重复

模式修饰符

  • U 默认情况下为贪婪匹配(u 匹配结果存在歧义时取长),如果设置了这个修饰符,模式就会成为懒惰匹配(匹配结果存在歧义的取其短)
  • i 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配
  • m 默认情况下,PCRE 认为目标字符串是由单选字符组成的(然而实际上它可能会包含多行),“行首” 元字符 (^) 仅匹配字符串的开始位置,而 “行末” 元字符 ($) 仅匹配字符串末尾,或者最后的换行符(除非设置了 D 修饰符)。这个行为和 prel 相同。当这个修饰符设置之后,“行首” 和 “行末” 就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。这等同于 prel 的 /m 修饰符。如果目标字符串中没有 "\n" 字符,或者模式中没有出现 ^$ ,设置这个修饰符不产生任何影响。
  • s 如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的 /s 修饰符。一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。
  • x 如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略,并且位于一个未转义的字符类外部的 # 字符和下一个换行符之间的字符也被忽略。这个修饰符等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。注意:这仅用于数据字符。空白字符还是不能在模式的特殊字符序列中出现。

Git 时代的 VIM 不完全使用教程

最近整理了 VIM 的配置,换上插件管理的神器 ----- Vundle,由他引发的 VIM 生态环境的改善,堪称完美。遂打算写一份简单的教程,分享 Git 时代 VIM 新世界的美丽动人之处。对 VIM 有基础的同学,可直接跳至插件管理部分。

VIM 的模式

第一次使用 VIM,会觉得无所适从,他并不像记事本,你敲什么键就显示什么,理解 VIM 的需要明白他的两种模式:

  • 命令模式 (Command Mode)
  • 编辑模式 (Insert Mode)

命令模式下,可以做移动、编辑操作;编辑模式则用来输入。键入 iosa等即可进入编辑模式,后面解释原因。

模式的设计是 VIM 和其他编辑器最不同的地方,优势和劣势也全基于此而生。

基本操作

以下介绍的键盘操作,都是大小写敏感的,并且要在命令模式下完成,需注意:

以字为单位的移动

  • h 向左移动一个字
  • j 向下移动一行
  • k 向上
  • l 向右

这四个键在右手最容易碰到几个位置,最为常用。

以词为单位的移动

  • w 下一個 word w(ord)
  • W 下一個 word(跳过标点)
  • b 前一個 word b(ackward)
  • B 前一个 word(跳过标点)
  • e 跳到当前 word 的尾端 e(nd)

行移动

  • 0 跳到当前行的开头
  • ^ 跳到当前行第一个非空字符
  • $ 跳到行尾

助记:0(第 0 个字符),^ 和 $ 含义同正则表达式

段落移动

  • { 上一段 (以空白行分隔)
  • } 下一段 (以空白行分隔)
  • % 跳到当前对应的括号上 (适用各种配对符号)

跳跃移动

  • /xxxx 搜索 xxxx,然后可以用 n 下一个,N 上一个移动
  • # 向前搜索光标当前所在的字
  • * 向后搜索光标当前所在的字
  • fx 在当前行移动到光标之后第一个字符 x 的位置 f(ind)x
  • gd 跳到光标所在位置词 (word) 的定义位置 g(o)d(efine)
  • gg 到文档顶部
  • G 到文档底部
  • :x 跳到第 x 行 (x 是行号)
  • ctrl+d 向下翻页 d(down)
  • ctrl+u 向上翻页 u(p)

基本编辑

修改

  • i 在光标当前位置向前插入 i(nsert)
  • I 在本行第一个字符前插入
  • a 在光标当前位置向后插入 a(fter)
  • A 在本行末尾插入
  • o 向下插入一行
  • O 向上插入一行
  • :w 保存
  • :q 退出
  • :wq 保存并退出

删除

  • x 删除当前字符
  • dd 删除当前行 d(elete)
  • dw 删除当前光标下的词 d(elete)w(ord)

复制粘贴

  • yy 复制当前行 y(ank)
  • yw 复制当前光标下的词 y(ank)w(ord)
  • p 粘贴 p(aste)
  • P 粘贴在当前位置之前

进阶操作

限于篇幅,在这里我仅介绍下我非常常用的几个操作。

重复操作

因为 VIM 所有的操作都是原子化的,所以把这些操作程序化就非常简单了:

  • 5w 相当于按五次 w 键;
  • 6j 下移 6 行,相当于按六次 j;
  • 3J 大写 J, 本来是将下一行与当前行合并,加上数量,就是重复操作 3 次;
  • 6dwd6w 结果是一样,就是删除 6 个 word;
  • 剩下的无数情况,自己类推吧。

高效编辑

  • di" 光标在 ""之间,则删除"" 之间的内容
  • yi( 光标在 () 之间,则复制 () 之间的内容
  • vi[ 光标在 [] 之间,则选中 [] 之间的内容
  • 以上三种可以自由组合搭配,效率奇高,i(nner)
  • dtx 删除字符直到遇见光标之后的第一个 x 字符
  • ytx 复制字符直到遇见光标之后的第一个 x 字符

标记和宏 (macro)

  • ma 将当前位置标记为 a,26 个字母均可做标记, mb 、mc 等等;
  • 'a 跳转到 a 标记的位置;
  • 这是一组很好的文档内标记方法,在文档中跳跃编辑时很有用;
  • qa 将之后的所有键盘操作录制下来,直到再次在命令模式按下 q ,并存储在 a 中;
  • @a 执行刚刚记录在 a 里面的键盘操作;
  • @@ 执行上一次的 macro 操作;
  • 宏操作是 VIM 最为神奇的操作之一,需要慢慢体会其强大之处;

VIM 的基本操作,可以挖掘的东西非常多,不仅仅需要记忆,更需要自己去探索总结,熟练之后,效率会大幅度提升。后面会给出一些参考链接。

插件管理

Vundle

终于到这篇 Blog 我最想讨论的部分了。VIM 的强大不仅仅体现在操作的高效率,更有强大而充沛的插件做支援,插件丰富了之后,就面临查找和管理的问题。

在遇见 Vundle 之前,我用 Pathogen 管理插件。Pathogen 还算方便,只需要把相应插件,放在 bundle 目录下即可,不需要再像以前那样逐个放置单独的文件到相应目录,大大节省了劳动力,管理起来也一目了然,觉得还不错,至少比 vimball 那种需要执行命令安装的方式好一些。

我真希望我早些遇见 Vundle。Vundle 受到 Pathogen 和 Vimball 的启发,于是有了现在的模样。Vundle 的逻辑是这样的:

  • 在 Vim Script 选好你想要的插件;
  • 在 VIM 的配置文件中写一句 Bundle plugin_name
  • 执行一下 Vundle 的初始化命令,插件就装好了;
  • 升级和卸载也是同样的简单;

完美的世界!

Vundle 的配置

Vundle 的安装很简单:

git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

然后写配置文件.vimrc

set nocompatible    " be iMproved
filetype off        " required!

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'

" vim-scripts repos
Bundle 'vim-plugin-foo'
Bundle 'vim-plugin-bar'

filetype plugin indent on    " required!

其中 Bundle 后面的内容,就是插件的名字,插件维护在 Vim-Script.org

然后,打开 VIM 之后,可以输入以下命令:

"已安装插件列表
:BundleList

"安装插件:
:BundleInstall

"更新插件:
:BundleInstall!

"搜索插件
:BundleSearch

"卸载不在列表中的插件:
:BundleClean

现在大部分的插件都已经从 Vim.org 迁移到了 Vim-Script.org,而且很多作者也认领了自己的插件,直接在这个 Github 的项目下更新,一个比 Vim.org 更科学更有效的生态环境,就这样完美的形成了。

在此非常严重的感谢 vim-scripts.org 的创建者 Scott Bronson,和 Vundle 的作者 gmarik。他们的创新和分享精神,让这个世界又美好了一些。

也感谢业界良心 Github。Vim-Scripts.org 整站就是用 Github Pages 建立维护的,对于个人来说,这是很好的选择,有兴趣的同学可以参看我之前的博客:使用 Github Pages 建独立博客

插件介绍

有了 Vundle,再装插件就是件享受的事情了。我常用的插件有:

#相较于Command-T等查找文件的插件,ctrlp.vim最大的好处在于没有依赖,干净利落
Bundle 'ctrlp.vim'

#在输入(),""等需要配对的符号时,自动帮你补全剩余半个
Bundle 'AutoClose'

#神级插件,ZenCoding可以让你以一种神奇而无比爽快的感觉写HTML、CSS
Bundle 'ZenCoding.vim'

#在()、""、甚至HTML标签之间快速跳转;
Bundle 'matchit.zip'

#显示行末的空格;
Bundle 'ShowTrailingWhitespace'

#JS代码格式化插件;
Bundle '_jsbeautify'

#用全新的方式在文档中高效的移动光标,革命性的突破
Bundle 'EasyMotion'

#自动识别文件编码;
Bundle 'FencView.vim'

#必不可少,在VIM的编辑窗口树状显示文件目录
Bundle 'The-NERD-tree'

#NERD出品的快速给代码加注释插件,选中,`ctrl+h`即可注释多种语言代码;
Bundle 'The-NERD-Commenter'

#解放生产力的神器,简单配置,就可以按照自己的风格快速输入大段代码。
Bundle 'UltiSnips'

#让代码更加易于纵向排版,以=或,符号对齐
Bundle 'Tabular'

#迄今位置最好的自动VIM自动补全插件了吧
#Vundle的这个写法,是直接取该插件在Github上的repo
Bundle 'Valloric/YouCompleteMe'

以上插件可以在 vim-script.org 找到源码和文档,ZenCoding 和 EasyMotion 演示点链接, 你会心动的。

.vimrc 配置

因为配置不断在更新,所以放上我的配置的链接:.vimrc 配置

更多

VIM 在一开始会觉得非常不习惯,一定要坚持下去,收获的会更多,不仅仅是在装大侠方面的哦~

关于 VIM 的使用,这篇博客仅仅介绍了很小的一部分,网络上还有大量朋友总结的心得,常学常有收获:

转载与 BeiYuu 的 Git 时代的 VIM 不完全使用教程

JavaScript-console 对象

console.log(),console.warn(),console.error(),console.info(),console.debug()

console.log() 用于在 console 窗口显示普通信息。

console.warn() 用于在 console 窗口显示警示信息。

console.error() 用于在 console 窗口显示错误信息。

console.info() 用于在 console 窗口显示提示类信息。

参数可以是普通字符串、格式字符串

console.log("duan");                                //duan
console.log("zhi","lei");                           //zhi lei
console.log("%s","D-ZL");                           //D-ZL
console.log("%cD-ZL","font-size:20px;color:red;");  //D-ZL(red)

%s 字符串

%d,%i 整数

%f 浮点数

%o 对象的链接

%c CSS 格式字符串

console.table()

console.table 方法可以将复合类型的数据转成表格。

复合类型的数据转成表格,必须拥有主键。

//主键为数字
var dzl = [ { id: "1", value: "d" },
            { id: "2", value: "z" },
            { id: "3", value: "l" } 
];
console.table(dzl);
//主键为最外层键
var dzl = {
            D: { id: "1", value: "d" },
            Z: { id: "2", value: "z" },
            L: { id: "3", value: "l" }
};
console.table(dzl);

console.dir(),console.assert()

console.dir() 对一个对象进行检查。

console.assert() 验证某个条件是否为真。

// console.dir()用法格式
console.dir(object);
// console.assert()用法格式
console.assert(条件判断,输出信息);

console.time(),console.timeEnd()

console.time()console.timeEnd() 用于计算一个操作花的时间。

console.time() //表示开始
    //要计算时间的程序
console.End()  //表示结束

console.group(),console.groupend()

console.group()console.groupend() 对信息进行分组。在输出大量的信息的时候可以用,可以折叠 / 展开。

console.group(分组名称);
    //分组显示的信息
console.groupEnd();

console.clear()

console.clear() 对 console 窗口进行清屏。

参考链接

by 阮一峰 console 对象
刘哇勇的部落格 Chrome 控制台不完全指南

PHP 扩展 ZipArchive 安装

0x00 下载源码 & 解压

# 下载为最新版本(可上网站选择其它版本)
wget http://pecl.php.net/get/zip
tar -zxvf zip
cd zip-x.x.x

0x01 配置

phpize
./configure --with-php-config=/usr/local/php/bin/php-config

0x02 编译 & 安装

make & make install

0x03 配置 php.ini

# 找到 php.ini
php -i | grep php.ini
# 编辑 php.ini
vi /xxx/php.ini

php.ini 中添加 extension=zip.so

重启服务

查看是否已经成功安装 php -m | grep zip

安装中遇到的问题

  • 在运行 ./configure 时,提示: Please reinstall the libzip distribution 是因为 libzip 版本过低,编译升级
    # 先卸载了原先的 libzip
    yum remove libzip
    # 下载 libzip 源码(去网站选择合适的版本)
    wget https://nih.at/libzip/libzip-xxx.tar.gz
    # 解压
    tar -zxvf libzip-xxx.tar.gz
    cd libzip-xxx
    # 配置
    ./configure
    # 编译 & 安装
    make & make install
  • 在安装完新版的 libzip 时可能会出现打不到 zipconf.h,手动复制一下 cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h

Git 命令速查表

分支名称

master 稳定分支

develop 不稳定分支(开发分支)

issuefixbug BUG 分支

feature 新功能分支

release 预发布分支

本地操作

git init 初始化

git add 增加到暂存区

git commit -m 提交到分支

git status 查看状态

git diff 查看不同

git diff HEAD -- file 查看工作区和版本库里面最新版本的区别

git log 查看日志

git log --graph 查看分支合并图

git reflog 查看用过的命令

git reset --hard <HEAD^|commitID> 版本回退

git reset HEAD file 可以把暂存区的修改撤销掉

git checkout -- file 可以丢弃工作区的修改

git stash 把当前工作现场 “储藏” 起来

git stash list 查看储藏

git stash apply [stash@{x}] 恢复储藏,stash@{x} 指定恢复

git stash drop 删除储藏

git stash pop 恢复并删除

远程操作

git clone 克隆

git remote 远程库

git pull 拉取远程库到本地

git push 推送本地到远程库

分支

git branch 查看分支

git branch <name> 创建分支

git checkout <name> 切换分支

git checkout -b <name> [origin/name] 创建并切换 (-b) 分支,[origin/name] 指定远程分支

git merge <name> 合并指定分支到当前分支

git merge --no-ff -m "<message>" <branch> 用普通模式合并,并且提交描述

git branch -d <name> 删除分支,-D 强制删除

git branch --set-upstream <name> <origin/name> 指定本地分支与远程分支的链接

标签

git tag 查看标签

git tag <name> [commitid] 打一个新标签默认 HEAD,可以给历史提交打标签

git tag -a <name> -m <message> -a 指定标签名,-m 指定标签说明,-s 私钥签名一个标签 (PGP) 必须有 gpg

git show <tagname> 查看标签信息

git tag -d <name> 删除标签

git push origin <tagname|--tags> 推送 <标签|全部标签> 到远程

git push origin :refs/tags/<tagname> 删除远程标签,先删除本地然后推送

别名

git config --global user.name 'DZLZH'

git config --global user.email '[email protected]'

git config --global alias.st = status

git config --global alias.br = branch

git config --global alias.ch = checkout

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

忽略文件

.gitignore

.gitkeep

参考

常用 Git 命令清单

Git 远程操作详解

RESTful 架构

REST 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。

比如 GET、PUT、POST 和 DELETE。

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

理解 RESTful 架构 - 阮一峰的网络日志

数值变量交换常用方法

临时变量法

echo "\n---临时变量法---\n";
$num1 = 3;
$num2 = 6;
echo "交换前:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
$tmp  = $num1;
$num1 = $num2;
$num2 = $tmp;
echo "交换后:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
/*
---临时变量法---
交换前:
$num1 = 3
$num2 = 6
交换后:
$num1 = 6
$num2 = 3
*/

加减法

echo "\n---加减法---\n";
$num1 = 3;
$num2 = 6;
echo "交换前:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
$num1 = $num1 + $num2;
$num2 = $num1 - $num2;
$num1 = $num1 - $num2;
echo "交换后:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
/*
---加减法---
交换前:
$num1 = 3
$num2 = 6
交换后:
$num1 = 6
$num2 = 3
*/

异或法

echo "\n---异或法---\n";
$num1 = 3;
$num2 = 6;
echo "交换前:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
$num1 = $num1 ^ $num2;
$num2 = $num1 ^ $num2;
$num1 = $num1 ^ $num2;
echo "交换后:\n", '$num1 = ', $num1, "\n", '$num2 = ', $num2, "\n";
/*
---异或法---
交换前:
$num1 = 3
$num2 = 6
交换后:
$num1 = 6
$num2 = 3
*/

AT - 规则:@import,@media 和 @font-face

font-face 规则

@font-face 它现在被广泛用作在网页中嵌入字体。

@font-face {
    font-family: "font of all knowledge";
    src: local("font of all knowledge"), local(fontofallknowledge), url(fontofallknowledge.woff);
    font-weight: 400;
    font-style: normal;
}

Firefox、Chrome、Safari 以及 Opera 支持 .ttf (True Type Fonts) 和 .otf (OpenType Fonts) 类型的字体。

Internet Explorer 9+ 支持新的 font-face 规则,但是仅支持 .eot 类型的字体 (Embedded OpenType)。

import 规则

@import规则 用来导入其它的 CSS 文件。

@import URL(morestyles.css);

如果一个站点需要很长的,复杂的样式表如果他们被分解成更小的文件中,可能会更容易管理。

@import 规则必须被放置在一个样式表的顶部,在任何其他规则上面。

media 规则

@media 可用于样式应用到一个特定的媒体,如印刷品。

@media print {
    body {
        font-size: 10pt;
        font-family: times, serif;
    }

    #navigation {
        display: none;
    }
}

@media 可以包括_屏幕 (screen)打印 (print)投影 (projection)手持式设备 (handheld),和_所有 (all),或以逗号分隔的多个列表,如:

@media screen, projection {
    /* ... */
}

CSS 3 允许你的目标不只是特定的媒体也涉及该媒体的变量,如屏幕尺寸(针对手机特别有帮助)。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.