0%

1. tr

echo $PATH | tr ‘:’ ‘\n’

2. xargs

1
2
find . -type f | xargs -I{} md5sum {} # {} 是用来代替管道之前标准输出内容的。
cat ~/.zshrc | xargs -n 3

加 -I 参数 需要事先指定替换字符
args:xargs的默认命令是echo,空格是默认定界符。 默认替换符号是{}
-I {}批定了替换字符串,表示文件内容,能循环按要求替换相应的参数 使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,
当-I与xargs结合使用,每一个参数命令都会被执行一次:
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的
-d 自定义定界符

3. IFS

IFS(internal field separator)界定符,默认有三种:空格、制表符、换行符。Bash默认只要找到其中一种,就分隔字符,如果要指定使用如下方式:

  • 指定只用换行: IFS=$(‘\n’)
  • 指定空格: IFS=’ ‘
  • 指定,: IFS=’,’,这个在处理csv文件中有帮助。

4. 重定向

Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:
0——标准输入(stdin)
1——标准输出(stdout)
2——标准错误(stderr)

2>/dev/null
意思就是把错误输出到“黑洞”

/dev/null 2>&1
默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞”

2>&1 >/dev/null
意思就是把错误输出2重定向到标准出书1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕。

重定向的符号有两个:>或>>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。

5. 后台运行

ctrl + z 挂起程序,可以用bg恢复放入后台,恢复完之后可以用fg把后台任务召回前台。jobs可以查看后台任务,前面的+号代表默认后台任务,-号代表下一个默认任务。
ctrl + c 中断程序,不能恢复了。

默认情况下,当你在终端会话shell中运行脚本时,交互式shell会挂起,直到脚本运行完。可以在命令名后加一个&符号来让脚本或命令以后台模式运行。当你在后台模式运行命令或脚本时,交互式shell会返回,允许你继续输入其他命令。任何通过这种方法运行的后台进程仍会绑定到该终端会话。如果退出了终端会话,后台进程也会退出。

可以用nohup命令阻止这种情况发生。该命令会拦截任何发给某个命令来停止其运行的信号 (比如当你退出终端会话时)。这样就可以让脚本继续在后台运行,即便是你已经退出了终端会话。 当你将进程置入后台时,仍然可以控制它的运行。jobs命令可以查看该shell会话启动的进程。

只要知道后台进程的作业号,就可以用kill命令向该进程发送Linux信号,或者用fg命令将该进程带回到该shell会话的前台。你可以用Ctrl+Z组合键挂起正在运行的前台进程,然后用bg命令将 其置入后台模式。

1. ShadowSocks

ShadowSocks是Socks5代理。之前我在Bandwagon上有个OpenVZ的ShadowSocks代理,后来到期了,买了一个KVM的虚拟机,手工装了ShadowSocks.
网上有一键安装ShadowSocks的脚本,但是不支持CentorOS,只支持Debian和Ubuntu。我想用BBR加速,自带的镜像只有CenterOS有BBR,所以就手动安装。难点是Python的版本问题,CenterOS的默认自带Python时2.6版本,而ShadowSocks是要2.7版本。而如果升级了python,yum就使用不了,方案就是升级python,软连接python,然后yum还是使用python2.6,这样就不冲突。

1.1 CenterOS升级python为2.7

https://www.cnblogs.com/haoorhuai/p/9773628.html

安装python使用的是源码编译

1
2
3
4
5
6
7
8
9
10
11
yum -y update
yum groupinstall 'Development Tools'
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel

wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
tar -zxvf Python-2.7.15.tgz
cd Python-2.7.15
./configure --prefix=/usr/local
make all
make altinstall
make clean

不用使用easy_install安装python,使用官方自己带脚本。

1
2
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user

安装结束后使用pip2命令,不要使用pip。

1
pip2 install shadowsocks

1.2 安装ShadowSocks

https://www.linuxidc.com/Linux/2015-05/117290.htm

1
2
3
pip2 install shadowsocks
touch /etc/shadowsocks.json
vi /etc/shadowsocks.json

{
“server”:”138.128.208.158”,
“server_port”:443,
“local_address”: “127.0.0.1”,
“local_port”:1080,
“password”:”MyPass”,
“timeout”:600,
“method”:”rc4-md5”
}
备注:加密方式官方默认使用aes-256-cfb,推荐使用rc4-md5,因为 RC4比AES速度快好几倍。
各字段说明:

server:服务器IP
server_port:服务器端口
local_port:本地端端口
password:用来加密的密码
timeout:超时时间(秒)
method:加密方法,可选择 “bf-cfb”, “aes-256-cfb”, “des-cfb”, “rc4″等

使用配置文件在后台运行shadowsocks服务
[root@localhost /]# ssserver -c /etc/shadowsocks.json -d start
备注:若无配置文件,在后台可以使用一下命令运行:
[root@localhost /]# ssserver -p 443 -k MyPass -m rc4-md5 -d start
停止服务
[root@localhost /]# ssserver -c /etc/shadowsocks.json -d stop

2. BBR

Google的TCP BBR拥塞控制算法解析,只能内核4.9以上支持。

1
2
#   查看内核版本,含有 4.9 就表示 OK 了
uname -r

https://www.cnblogs.com/Eason1024/p/8177665.html
https://blog.csdn.net/dog250/article/details/52830576

3. 一键shadowsocks脚本

只支持debian和ubuntu
https://www.tennfy.com/2136.html

4. 拷贝公钥给目标服务器

[root@localhost .ssh]# ssh-copy-id -i id_dsa.pub omd@192.168.25.110 【 使用ssh登录的默认端口22】
[root@localhost .ssh]# ssh-copy-id -i id_dsa.pub –p 666 omd@192.168.25.120 【使用ssh登录设置的端口666】
https://www.cnblogs.com/ftl1012/p/ssh.html

1.快捷键

1.1 打开关闭side tool window

Ctrl + Cmd + F12

1.2 toggle terminal

Alt + F12

Read more »

1. Storyboard的Entry Point

选择一个ViewController,在Attributes Inspector中勾选Is Initial View Controller

2. Storyboard的导航

有两个导航Navigation ControllerTab Bar Controller,这两个在Editor-Embed In->Navigation Controller/Tab Bar Controller.加上去之后,根组件就会变成这两个。self.navigationController才会有值,不然是nil。

Read more »

1. 基本命令

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
27
28
29
30
31
32
33
34
35
# 运行镜像
docker run -t -i ubuntu:14.04 /bin/bash

# 查看运行的容器
docker ps

# 查看所有容器
docker ps -a

# 进入容器
docker exec -it $container_id /bin/bash

# 停用某个容器
docker stop $container_id

# 停用全部运行中的容器
docker stop $(docker ps -q)

# 杀死所有running状态的容器
docker kill $(docker ps -q)

# 查看镜像,不包含中间镜像
docker images

# 查看所有镜像,其中包含中间镜像
docker images -a

# 进入正在运行的容器
docker exec -it $container_id /bin/bash

# 给iamge改名
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

# 查看日志 docker logs 参数 容器名/容器id
docker logs -t -n 5 fe734a934051
Read more »

1. React Naitve启动顺(Android)

  1. ReactActivity->onCreate()
  2. MainApplication->mReactNativeHost.getPackages()
  3. ScannerPackage->Scanner.initScannerModule
    Read more »

1.集成react-native-maps

集成谷歌地图,分两步,客户端集成与Google Api设置。难点是Google Service的版本统一,iOS集成,Google Api设置。

  • Android的构建工具是gradle,所以集成还算方便,最多改下buildToolsVersion, targetVersion, Google Service使用一个全局变量来统一版本。
  • iOS可以手动集成,也可以用cocoaPods,难点在于同时使用这两个。react-native-maps我是用pod,创建PodFile后运行pod install,使用.xcworkspace打开,pod所有的依赖都打包到一起。
  • Google Map APi设置,需要分Android和iOS两个,开发环境也要分成2个,所以一共要4个。

1.集成react-native-google-signin

一开始我看最新版本是需要Google Service15,我想兼容性好用Google Service的11.8.0版本。所以一开始用了它的0.11版本。

  • Android上改了module的buildToolsVersion,把compileOnly,implementation改成compile.Java文件中@Override
    Android需要下载Google-Service,这个是Firebase导出的,事实上我们用不到Firebase。Firebase-core是analytics的别名,它的大部分功能是用来统计数据的,比如ads,crashlytics,google analtytics。Firbase-auth是可以支持更多的登录,跟Google-signin不一样。
  • iOS集成,我之前用cocoaPods安装了react-native-maps,一开始我手动集成react-native-google-signin,发现Arguments too long,按照FaceBook的说法是Header Search Paths里面的pod路径和手工路径重复了,可是我没有重复的;使用pod集成,找不到各种文件。
  • Google Signin Api跟Map Api差不多,唯一不同的是需要Android的packageName和SHA1指纹,iOS需要bunldeId。

如果再次引入其他包,可以主项目引入,然后加上Header Search Paths.iOS需要头文件和lib一起工作,如果主项目用到了头文件或者Framework用到了头文件,那么头文件路径需要设置(Framework可以到.framework文件夹,自定义头文件的需要到头文件文件夹路径)。

解决方案: 使用了最新的1.0.0-rc3,然后iOS就可以了,Android把Google Service的版本降低了。下次集成先集成iOS,Android相对容易些。

配置中,Android使用了webClientId,iOS使用了iOSClientId和webClientId.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { GoogleSignin, GoogleSigninButton } from 'react-native-google-signin'

if (IsAndroid) {
GoogleSignin.configure({
// scopes: ["https://www.googleapis.com/auth/drive.readonly"], // what API you want to access on behalf of the user, default is email and profile
webClientId: androidWebClientId,
offlineAccess: false,// if you want to access Google API on behalf of the user FROM YOUR SERVER
forceConsentPrompt: true // [Android] if you want to show the authorization prompt at each login
})
} else {
GoogleSignin.configure({
iosClientId: iosClientId, // only for iOS
webClientId: iOSWebClientId, // required, shoudle use same project name as iosClientId
offlineAccess: false,// if you want to access Google API on behalf of the user FROM YOUR SERVER
})
}

Read more »

下面的所述的是针对mongoDB4版本。

1.配置文件

Mac下在的tar文件,默认自带ssl,但是4.0版本默认不支持Openss 1.0版本,为了使用Openssl1.0版本所以配置文件中需要去掉SSL高版本的支持(disabledProtocols),

Read more »