个人备忘录

好记性不如烂笔头. - 中国谚语

Python

  1. # python起文件服务器
  2. python3.4 -m http.server
  3. python -m SimpleHTTPServer # python2
  4. python -u script.py # 刷新缓冲,执行脚本重定向结果到文件时候比较有用
  5. # logging
  6. FATAL(50) > ERROR(40) > WARNING(30) > INFO(20) > DEBUG(10)
  7. # 使用virtualenv制定python版本
  8. virtualenv -p /usr/bin/python2.7 ENV2.7
  9. # pyenv 安装多个版本的 python : https://github.com/pyenv/pyenv
  10. # pyenv-virtualenv https://github.com/pyenv/pyenv-virtualenv
  11. # mac install multiple version of python
  12. brew install pyenv pyenv-virtualenv
  13. pyenv install 3.6.4 # install python3.6.4
  14. pyenv virtualenv 3.6.4 v3.6.4
  15. pyenv activate v3.6.4
  16. pyenv deactivate
  17. # 格式化 json,这个可以配置在 vim 里用来格式化当前 json 文本
  18. cat some.json | python -m json.tool

pip/easy_install

  1. # 服务器上有时候没有 root 权限可以试试
  2. # https://stackoverflow.com/questions/7465445/how-to-install-python-modules-without-root-access
  3. # https://stackoverflow.com/questions/12332975/installing-python-module-within-code
  4. # pip install
  5. import pip
  6. def install(package):
  7. pip.main(['install', package])
  8. # Example
  9. if __name__ == '__main__':
  10. install('argh')

更换源, vi ~/.pip/pip.conf

  1. [global]
  2. timeout = 60
  3. index-url = http://pypi.douban.com/simple
  4. trusted-host = pypi.douban.com

IPython

  1. # ipython 如何使用 autoreload,每次重新修改了文件都得重新重启 ipython 很麻烦,解决方式
  2. # https://support.enthought.com/hc/en-us/articles/204469240-Jupyter-IPython-After-editing-a-module-changes-are-not-effective-without-kernel-restart
  3. # https://stackoverflow.com/questions/1254370/reimport-a-module-in-python-while-interactive
  4. # http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html
  5. In [1]: %load_ext autoreload
  6. In [2]: %autoreload 2
  1. # -*- coding: utf-8 -*-
  2. # ~/.ipython/profile_default/startup/startup.py
  3. # Ned's .startup.py file ipython 启动加载文件,用来导入一些自定义函数或者模块,方便调试
  4. # http://stackoverflow.com/questions/11124578/automatically-import-modules-when-entering-the-python-or-ipython-interpreter
  5. print("(.startup.py)")
  6. import datetime as dt
  7. import os
  8. import pprint
  9. import re
  10. import sys
  11. import time
  12. import json
  13. import requests as req
  14. try:
  15. import matplotlib.pyplot as plt
  16. import pandas as pd
  17. from pandas import Series, DataFrame
  18. import numpy as np
  19. except ImportError:
  20. pass
  21. print("(imported datetime, os, pprint, re, sys, time, json)")
  22. def _json_dumps(dict_data, indent=4):
  23. """用来处理一些包含中文的 json 输出"""
  24. print(json.dumps(dict_data, indent=indent, ensure_ascii=False))
  25. def _repr_dict(d):
  26. """https://stackoverflow.com/questions/25118698/print-python-dictionary-with-utf8-values"""
  27. print('{%s}' % ',\n'.join("'%s': '%s'" % pair for pair in d.iteritems()))
  28. def _json_dumps(dict_data, indent=4):
  29. """用来处理一些包含中文的 json 输出"""
  30. print(json.dumps(dict_data, indent=indent, ensure_ascii=False))
  31. repr_dict = _repr_dict
  32. pp = pprint.pprint
  33. json_dumps = _json_dumps
  34. # http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
  35. """
  36. !!! 注意,如果遇到了 TypeError: super(type, obj): obj must be an instance or subtype of type
  37. 请禁用 autoreload, http://thomas-cokelaer.info/blog/2011/09/382/
  38. """
  39. from IPython import get_ipython
  40. ipython = get_ipython()
  41. # ipython.magic("pylab")
  42. ipython.magic("load_ext autoreload")
  43. ipython.magic("autoreload 2")
  44. # Ipython 技巧,如何查询文档,比如 time.time 方法的文档
  45. # https://jakevdp.github.io/PythonDataScienceHandbook/01.01-help-and-documentation.html
  46. >>> import time
  47. >>> time.time? # 回车之后可以输出该函数的 docstring 文档
  48. >>> time.time?? # 回车之后可以输出该函数的定义

Ipdb

  1. # ~/.pdbrc
  2. # https://github.com/gotcha/ipdb/issues/111
  3. import os
  4. alias kk os._exit(0) # 如果不幸在循环里打了断点,可以用 os._exit(0) 跳出
  5. alias pd for k in sorted(%1.keys()): print "%s: %s" % (k, (%1[k]))
  6. # https://stackoverflow.com/questions/21123473/how-do-i-manipulate-a-variable-whose-name-conflicts-with-pdb-commands
  7. # 如果 pdb 里的内置命令和内置函数冲突了,可以加上 ! 使用内置函数
  8. !next(iter)

Chrome(Mac)

  1. # 使用 comamnd + l 可以立即定位到 url 输入框
  2. # 使用 vimium 或者 surfingkeys 插件可以用 vim 的模式操作 chrome
  3. # 用 vimium 如何不用鼠标从 url 输入框回到网页:
  4. https://superuser.com/questions/324266/google-chrome-mac-set-keyboard-focus-from-address-bar-back-to-page/324267#324267
  5. https://xavierchow.github.io/2016/03/07/vimium-leave-address-bar/
  6. # 清理 dns cache, https://superuser.com/questions/203674/how-to-clear-flush-the-dns-cache-in-google-chrome
  7. Navigate to chrome://net-internals/#dns # and press the "Clear host cache" button.
  8. # 收藏夹。注意分类收藏,否则后来会收藏多了比较乱。使用 surfingkeys ab (add bookmark) 和 gb(收藏夹管理) 可以快速操作

MacOS

  1. # NOTE: 使用『时间机器』定期备份你的mac 是一个好习惯,笔者买了一个移动硬盘用来定期备份
  2. # 文件字符串批量替换,git项目里替换的时候注意指定文件类型,防止破坏git信息
  3. find . -name \*.py -exec sed -i '' 's/old/new/g' {} \;
  4. # copy that data into the system’s paste buffer
  5. cat file.txt | pbcopy
  6. # The pbpaste command lets you take data from the system’s paste buffer and write it to standard out.
  7. pbcopy < birthday.txt
  8. pbpaste | ag name
  9. pbpaste > filename
  10. # updatedb https://superuser.com/questions/109590/whats-the-equivalent-of-linuxs-updatedb-command-for-the-mac
  11. sudo /usr/libexec/locate.updatedb
  12. # homebrew 更换源, https://maomihz.com/2016/06/tutorial-6/
  13. cd /usr/local
  14. git remote set-url origin git://mirrors.ustc.edu.cn/brew.git
  15. cd /usr/local/Library/Taps/homebrew/homebrew-core
  16. git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git
  17. # 从终端查 wifi 密码, https://apple.stackexchange.com/questions/176119/how-to-access-the-wi-fi-password-through-terminal
  18. security find-generic-password -ga "ROUTERNAME" | grep "password:"
  19. # XXX.APP已损坏,打不开.你应该将它移到废纸篓 MACOS 10.12 SIERRA
  20. sudo spctl --master-disable
  21. # 使用 mounty 挂载 ntfs 盘,Item "file.mov" is used by Mac OS X and cannot be opened.
  22. # https://apple.stackexchange.com/questions/136157/mov-file-in-external-hd-greyed-out-and-wont-open-this-item-is-used-by-mac-o?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
  23. cd /Volumes/[drive name]
  24. xattr -d com.apple.FinderInfo *
  25. # or
  26. SetFile -c "" -t "" path/to/file.mov
  27. # mac 使用命令挂载
  28. diskutil mount /dev/disk1s2
  29. diskutil unmount /dev/disk1s2
  30. # 使用 rmtrash 删除到 trash,防止危险的 rm 删除命令找不回来。在 bashrc or zshrc alias rm='rmtrash '
  31. # 如果是 linux 用户,可以使用 safe-rm https://github.com/kaelzhang/shell-safe-rm
  32. # 删除的文件会放到 $HOME/.Trash 方便恢复
  33. brew install rmtrash # npm install -g safe-rm; alias rm='safe-rm'
  34. # 增加 terminal 光标移动速度, https://stackoverflow.com/questions/4489885/how-can-i-increase-the-cursor-speed-in-terminal
  35. # defaults write NSGlobalDomain KeyRepeat -int 1
  36. mac: 系统设置-> 键盘 -> 修改按键重复到最快,重复前延迟最短。可以让光标在终端里移动更快
  37. # 如何在文件更新之后自动刷新浏览器,需要首先 pip 安装 when-changed
  38. alias flush_watch_refresh_chrome=" when-changed -v -r -1 -s ./ osascript -e 'tell application \"Google Chrome\" to tell the active tab of its first window to reload' "
  39. # 如何启用三指拖移(新版本把改设置移动到了辅助功能,使用三指移动可以方便地移动窗口,一般我会启用提高效率)
  40. 辅助功能 -> 鼠标与触控板 -> 触控板选项 -> 启用拖移 (之后就能直接三指翻译单词了)
  41. # 如何解决 mac 突然没有声音的问题(系统 bug,音频守护进程 coreaudiod出了问题)
  42. sudo killall coreaudiod
  43. # mac 如何使用 realpath, https://stackoverflow.com/questions/3572030/bash-script-absolute-path-with-os-x
  44. # brew install coreutils
  45. grealpath file
  46. # mac trackpad 蓝牙频繁掉线问题。尝试使用 5G wifi 而不是 2.4G
  47. # https://apple.stackexchange.com/questions/321948/why-does-my-magic-trackpad-2-randomly-disconnect-and-stop-clicking

如何发送 mac 通知,可以用来做提示

  1. # https://stackoverflow.com/questions/17651017/python-post-osx-notification
  2. # 配合 crontab 可以用来做一个简单的定时任务提醒功能 57-59 17 * * * python ~/.tmp/noti.py
  3. # ~/.tmp/noti.py
  4. import os
  5. def notify(title, text):
  6. os.system("""
  7. osascript -e 'display notification "{}" with title "{}"'
  8. """.format(text, title))
  9. notify("开会啦", "Go Go Go !!!")

SSH

二次验证自动登录跳板机脚本,根据你的密码和服务器配置修改即可。

  1. #!/bin/sh
  2. # 有二次验证登录跳板机的时候比较麻烦,可以用这个脚本自动登录跳板机 参考:https://juejin.im/post/5ce760cef265da1b6e657d6f
  3. # brew install expect
  4. # brew install oath-toolkit
  5. # {user} {ip} {yourpassword} {server_qr_token} 替换成对应的 用户名、ip、密码、服务器秘钥
  6. export LC_CTYPE="en_US.UTF-8"
  7. expect -c "
  8. spawn ssh user@ip -p22
  9. set timeout 3
  10. expect \"user@ip's password:\"
  11. set password yourpassword
  12. set token \"`oathtool --totp -b -d 6 server_qr_token`\"
  13. send \"\$password\$token\r\"
  14. interact
  15. "

Mac 蓝牙耳机(自用索尼 wi1000x)

如何给Macbook Pro 开启 Apt-X 蓝牙音质 https://www.jianshu.com/p/a1efa561ed9e 使用播放器 Audirvana Plus

Proxy

mac电脑下设置socks5代理 https://blog.csdn.net/fafa211/article/details/78387899

Oh My Zsh

  1. # Powerlevel9k 是一个强大的 zsh 主题
  2. # iTerm2 + Oh My Zsh + Solarized color scheme + Meslo powerline font + [Powerlevel9k] - (macOS)
  3. # https://gist.github.com/kevin-smets/8568070
  4. # https://gist.github.com/dogrocker/1efb8fd9427779c827058f873b94df95
  5. # 安装自动补全插件
  6. git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
  7. git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
  8. # nvi ~/.zshrc
  9. plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
  10. # 如何复制上一条命令, https://apple.stackexchange.com/questions/110343/copy-last-command-in-terminal
  11. alias lcc='fc -ln -1 | awk "{\$1=\$1}1" ORS="" | pbcopy '
  12. # 报错:_git:58: _git_commands: function definition file not found
  13. # 解决方式:rm ~/.zcompdump*; rm ~/.zplug/zcompdump # https://github.com/robbyrussell/oh-my-zsh/issues/3996
  14. # rm ~/.zcompdump; exec zsh -l # https://github.com/ohmyzsh/ohmyzsh/issues/3996

Linux(centos/ubuntu)

  1. # 查看版本
  2. lsb_release -a
  3. # virtual box虚拟机和windows主机共享目录方法:安装增强工具;win主机设置共享目录例如ubuntu_share;在ubuntu里建立/mnt/share后使用命令:
  4. sudo mount -t vboxsf ubuntu_share /mnt/share/
  5. # 映射capslock 为 ctrl
  6. setxkbmap -layout us -option ctrl:nocaps
  7. # 文件字符串批量替换
  8. grep oldString -rl /path | xargs sed -i "s/oldString/newString/g"
  9. # 递归删除某一类型文件
  10. find . -name "*.bak" -type f -delete
  11. # 监控某一日志文件变化
  12. tail -f t.log
  13. # 类似mac pbcopy, apt-get install xsel
  14. cat README.TXT | xsel
  15. cat README.TXT | xsel -b # 如有问题可以试试-b选项
  16. xsel < README.TXT
  17. # 将readme.txt的文本放入剪贴板
  18. xsel -c
  19. # 清空剪贴板
  20. # 可以把代码文件贴到paste.ubuntu.com共享,此命令返回一个网址
  21. # sudo apt-get install pastebinit; sudo pip install configobj
  22. pastebinit -i [filename]
  23. # json格式化输出
  24. echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
  25. python -m json.tool my_json.json
  26. # 或者apt-get intsall jq
  27. jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
  28. # 进程相关
  29. dmesg | egrep -i -B100 'killed process' # 查看被杀死进程信息
  30. # linux 批量杀掉筛选进程(比如定时脚本多个同时执行,最好限制) https://blog.csdn.net/weiyichenlun/article/details/59108463
  31. ps -ef | grep main.py | grep -v grep | awk '{print $2}' | xargs kill -9
  32. # scp
  33. scp someuser@192.168.199.1:/home/someuser/file ./ # 远程机器拷贝到本机
  34. scp ./file someuser@192.168.199.1:/home/someuser/ # 拷贝到远程机器
  35. # tar
  36. tar zxvf FileName.tar.gz # 解压
  37. tar zcvf FileName.tar.gz DirName # 压缩

代码搜索用ag/rg, 比ack快

  1. sudo apt-get install silversearcher-ag # ubuntu
  2. brew install ag
  3. ag string dir/ # search dir
  4. ag readme$ # regular expression
  5. ag -Q .rb # Literal Expression Searches, search for the exact pattern
  6. ag string -l # Listing Files (-l)
  7. ag string -i # Case Insensitive Searches (-i)
  8. ag string -G py$ # 搜索应py结尾的文件
  9. ag readme -l --ignore-dir=railties/lib # 忽略文件夹
  10. ag readme -l --ignore-dir="*.rb" # 忽略特性类型文件
  11. .agignore # 用来忽略一些vcs,git等文件。

Centos

  1. # 如何搜索和安装指定版本
  2. # https://unix.stackexchange.com/questions/151689/how-can-i-instruct-yum-to-install-a-specific-version-of-package-x
  3. yum --showduplicates list golang
  4. yum install package-version

crontab

分、时、日、月、周

  1. # 记得bashrc里边
  2. EXPORT EDITOR=vim
  3. export PYTHONIOENCODING=UTF-8
  4. # crontab注意:绝对路径;环境变量;
  5. 0 */5 * * * python -u /root/wechannel/crawler/sougou_wechat/sougou.py >> /root/wechannel/crawler/sougou_wechat/log 2>&1
  6. */5 * * * * /root/pyhome/crawler/lagou/changeip.sh >> /root/pyhome/crawler/lagou/ip.log 2>&1

可以用如下方式执行依赖其他模块的python脚本,用run.sh执行run.py,记得chmod +x可执行权限,运行前执行下sh脚本测试能否成功

  1. #!/usr/bin/env bash
  2. PREFIX=$(cd "$(dirname "$0")"; pwd)
  3. cd $PREFIX
  4. source ~/.bashrc
  5. python -u run.py # -u 参数强制刷新输出
  6. date

对于python脚本,可以用如下方式保证同一时间只有一个脚本在运行(一些定时任务同一台机器上多个同时跑可能有问题),可以用 如下方式限制。(多个机器上应该用分布式锁)

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import time
  4. # https://stackoverflow.com/questions/380870/make-sure-only-a-single-instance-of-a-program-is-running
  5. # 更好的方式使用 tendo
  6. # pip install tendo
  7. from tendo import singleton
  8. me = singleton.SingleInstance() # will sys.exit(-1) if other instance is running
  9. def main():
  10. time.sleep(10)
  11. print(time.time())
  12. if __name__ == '__main__':
  13. main()

Iterm2/Terminal

  1. # https://stackoverflow.com/questions/11913990/iterm2-keyboard-shortcut-for-moving-tabs-around
  2. # Preferences/Keys 自定义配置使用 Cmd +jk 来在 Iterm2 tab 前后移动,模仿 vim 键位
  3. # 如何防止 command+w 意外关闭导致工作丢失,这里可以如下设置,每次关闭提醒
  4. # Settings -> Profiles -> Session -> Prompt before closing 勾选 Always
  5. # 如何使用 rz/sz 传文件
  6. https://segmentfault.com/a/1190000012166969
  7. # 如何使用 iterm2 it2copy 从 服务器上用 vim 拷贝文件
  8. # https://stackoverflow.com/questions/10694516/vim-copy-mac-over-ssh/10703012
  9. 1. 安装 iTerm2 Utilities 到服务器。iTerm2 -> Install shell Integratio。后边是 bash or zsh,根据你用的 shell 选择
  10. curl -L https://iterm2.com/shell_integration/install_shell_integration_and_utilities.sh | zsh
  11. 2. 重新登录之后 it2copy 生效
  12. 3. vim visual 模式选择之后 执行 `:w !it2copy` 即可。或这直接 cat file.txt | it2copy
  13. # 终端输出乱序。有时候有一些脚本或者软件可能会修改终端配置但是失败后又没有恢复,导致输出乱序,解决如下
  14. `stty sane` 或者 `reset`

Tmux

  1. # https://wiki.archlinux.org/index.php/tmux
  2. tmux rename -t oriname newname
  3. tmux att -t name -d # -d 不同窗口全屏
  4. # 如果手贱在本机tmux里又ssh到服务器又进入服务器的tmux怎么办(退出 tmux 套娃)
  5. c-b c-b d
  6. # Vim style pane selection
  7. bind -n C-h select-pane -L
  8. bind -n C-j select-pane -D
  9. bind -n C-k select-pane -U
  10. bind -n C-l select-pane -R
  11. # https://stackoverflow.com/questions/22138211/how-do-i-disconnect-all-other-users-in-tmux
  12. tmux a -dt <session-name>
  13. # 如何 ssh 后自动 attach 到某个 session
  14. if [[ "$TMUX" == "" ]] && [[ "$SSH_CONNECTION" != "" ]]; then
  15. # Attempt to discover a detached session and attach it, else create a new session
  16. WHOAMI="lens" # attach 的 session 名称
  17. if tmux has-session -t $WHOAMI 2>/dev/null; then
  18. tmux -2 attach-session -t $WHOAMI
  19. else
  20. tmux -2 new-session -s $WHOAMI
  21. fi
  22. fi
  23. # 或者
  24. if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
  25. SESSION_NAME="sessionname"
  26. tmux attach-session -t $SESSION_NAME || tmux new-session -s $SESSION_NAME
  27. fi

SSH

  1. # https://superuser.com/questions/98562/way-to-avoid-ssh-connection-timeout-freezing-of-gnome-terminal/98565#98565
  2. Press Enter, ~, . one after the other to disconnect from a frozen session.
  3. # https://unix.stackexchange.com/questions/176547/copy-only-file-details-file-name-size-time-from-remote-machine-in-unix
  4. ssh remotemachine "ls -l /opt/apache../webapps/Context"
  5. # 使用 paramiko 库可以实现 ssh client 功能
  6. # https://www.digitalocean.com/community/tutorials/how-to-use-fabric-to-automate-administration-tasks-and-deployments

Fabric

可以用 Fabric 实现一些自动化控制服务器功能。示例 fabfile.py

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from fabric.api import run, env, get, local
  4. """
  5. 需求:经常忘记开发机 build 完go 二进制文件以后 scp 到本地,导致有时候部署还是老的二进制文件。
  6. 功能:
  7. 实现监听开发机的二进制文件变动,每一次和本地文件对比,如果有开发机二进制文件大小变了,就拷贝到本地来。
  8. # pip install fabric==1.14.0
  9. # brew install watch
  10. mac 下用 watch 用来定期执行命令 watch -n 60 ls
  11. 比如每分钟检查一下开发机上的 FaceFusionServer 是否重新 build 了,然后拉取到本地,可以执行
  12. watch -n 30 fab monitor_facefusion_server monitor_uploadserver
  13. 1. http://www.bjhee.com/fabric.html
  14. """
  15. class Bcolors:
  16. HEADER = '\033[95m'
  17. OKBLUE = '\033[94m'
  18. OKGREEN = '\033[92m'
  19. WARNING = '\033[93m'
  20. FAIL = '\033[91m'
  21. ENDC = '\033[0m'
  22. BOLD = '\033[1m'
  23. UNDERLINE = '\033[4m'
  24. env.hosts = ['dev']
  25. env.use_ssh_config = True
  26. env.password = ""
  27. def who():
  28. run('whoami')
  29. def is_change(remote_path, local_path):
  30. """ 根据 md5 判断是否变化,注意 centos 和 mac 命令和结果格式不同
  31. centos:
  32. md5sum UploadServer
  33. e4fccc07eafc7ef97d436c50546e352b UploadServer
  34. mac:
  35. md5 UploadServer
  36. MD5 (UploadServer) = e4fccc07eafc7ef97d436c50546e352b
  37. :param remote_path: absolute remote server path
  38. :param local_path: local path
  39. """
  40. output = run("md5sum {}".format(remote_path)) # 请保证路径存在,不会判断
  41. remote_md5 = output.split()[0].strip()
  42. if not os.path.exists(local_path): # 第一次本地没有文件直接拉取
  43. return True
  44. local_output = local("md5 {}".format(local_path), capture=True)
  45. local_md5 = local_output.split()[-1].strip()
  46. return remote_md5 != local_md5
  47. def monitor_uploadserver():
  48. remote_path = "/user/work/UploadServer"
  49. local_path = "./UploadServer"
  50. if is_change(remote_path, local_path): # 变化了就复制到本地 get(remote, local),存在会覆盖
  51. print(Bcolors.WARNING + "===========%s file changed=========" + Bcolors.ENDC)
  52. get(remote_path, local_path)
  53. local("chmod +x {}".format(local_path))
  54. else:
  55. print(Bcolors.HEADER + local_path + " not change" + Bcolors.ENDC)

Makefile

  1. # 如何设置子进程环境变量 https://stackoverflow.com/questions/23843106/how-to-set-child-process-environment-variable-in-makefile
  2. test: export NODE_ENV = test

Git

  1. # .gitconfig配置用如下配置可以使用pycharm的diff和merge工具(已经安装pycharm)
  2. [diff]
  3. tool = pycharm
  4. [difftool "pycharm"]
  5. cmd = /usr/local/bin/charm diff "$LOCAL" "$REMOTE" && echo "Press enter to continue..." && read
  6. [merge]
  7. tool = pycharm
  8. keepBackup = false
  9. [mergetool "pycharm"]
  10. cmd = /usr/local/bin/charm merge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
  11. # https://stackoverflow.com/questions/34549040/git-not-displaying-unicode-file-names
  12. # git 显示中文文件名,如果你的文件名有中文会好看很多
  13. git config --global core.quotePath false
  14. # 用来review:
  15. git log --since=1.days --committer=PegasusWang --author=PegasusWang
  16. git diff commit1 commit2
  17. # 冲突以后使用远端的版本: NOTE:注意在 git merge 和 git rebase 中 ours/theirs 含义相反
  18. # rebase 场景下,theirs 实际表示的是当前分之
  19. # merge 场景下相反,theirs 表示的确是远端分之
  20. # https://stackoverflow.com/questions/16825849/choose-git-merge-strategy-for-specific-files-ours-mine-theirs
  21. git checkout --theirs templates/efmp/campaign.mako
  22. # 防止http协议每次都要输入密码:
  23. git config --global credential.helper 'cache --timeout=36000000' #秒数
  24. # 暂存和恢复,当我们需要切分支又暂时不想 git add,可以先把目前的修改咱存起来
  25. git stash
  26. git stash apply
  27. git stash apply stash@{1}
  28. git stash pop # 重新应用储藏并且从堆栈中移走
  29. # 显示 git stash 内容 https://stackoverflow.com/questions/7677736/git-diff-against-a-stash
  30. git stash show -p # see the most recent stash
  31. git stash show -p stash@{1}
  32. # 删除远程分之
  33. git push origin --delete {the_remote_branch}
  34. # 手残 add 完以后输入错了 commit 信息
  35. git commit --amend
  36. # 类似的还可以修改上一个提交者的名字 https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi
  37. git config --global user.name "you name"
  38. git config --global user.email you@domain.com
  39. git commit --amend --reset-author
  40. # 撤销 add (暂存),此时还没有 commit。比如 add 了不该 add 的文件
  41. git reset -- file
  42. git reset # 撤销所有的 add
  43. # 撤销修改
  44. git checkout -- file
  45. # 手残pull错了分支就(pull是先fetch然后merge)。或者 revert 一个失误的 merge
  46. git reset --hard HEAD~
  47. # 如果 pull 产生了 冲突,可以撤销。
  48. git merge --abort
  49. # git rebase 同样可以
  50. git rebase --abort
  51. # How to revert Git repository to a previous commit?, https://stackoverflow.com/questions/4114095/how-to-revert-git-repository-to-a-previous-commit
  52. git reset --hard 0d1d7fc32
  53. # 手残直接在master分之改了并且add了
  54. git reset --soft HEAD^
  55. git branch new_branch # 切到一个新分支去 commit
  56. git checkout new_branch
  57. git commit -a -m "..."
  58. # 或者
  59. git reset --soft HEAD^
  60. git stash
  61. git checkout new_branch
  62. git stash pop
  63. # 如果改了master但是没有add比较简单,三步走
  64. git stash
  65. git checkout -b new_branch
  66. git stash pop
  67. # rename branch
  68. git branch -m <oldname> <newname>
  69. git branch -m <newname> # rename the current branch
  70. # 指定文件类型diff
  71. git diff master -- '*.c' '*.h'
  72. # 带有上下文的diff
  73. git diff master --no-prefix -U999
  74. # undo add
  75. git reset <file>
  76. git reset # undo all
  77. # 查看add后的diff
  78. git diff --staged
  79. # http://weizhifeng.net/git-rebase.html
  80. # rebase改变历史, 永远不要用在master分之,别人有可能使用你的分之时也不要用
  81. # only change history for commits that have not yet been pushed
  82. # master has changed since I stared my feature branch, and I want bo bring my branch up to date with master. - Dont't merge. rebase
  83. # rebase: finds the merge base; cherry-picks all commits; reassigns the branch pointer.
  84. # then git push -f
  85. # git rebase --abort
  86. # 全局 ignore, 对于不同编辑器协作的人比较有用,或者用来单独忽略一些自己建立的测试文件等。
  87. # NOTE: git 支持每个子文件夹下有一个自己的 .gitignore,文件路径也是相对当前文件夹
  88. git config --global core.excludesfile ~/.gitignore_global # 全局忽略一些文件
  89. # 拉取别人远程分支,在 .git/config 里配置好
  90. git fetch somebody somebranch
  91. git checkout -b somebranch origin/somebranch
  92. # prune all the dead branches from all the remotes
  93. # https://stackoverflow.com/questions/17933401/how-do-i-remove-deleted-branch-names-from-autocomplete?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
  94. git fetch --prune --all # 清理本地本删除的远程分之,补全的时候很干净,没有已经删除的分之
  95. # https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore
  96. # https://wildlyinaccurate.com/git-ignore-changes-in-already-tracked-files/
  97. # 如果一个文件已经被 git 跟踪但是你之后又不想提交针对它的修改了,可以这么做(比如我想修改一些配置,本地 debug 等)
  98. git update-index --assume-unchanged <file> # 忽略一个已经 tracked 的文件,修改后不会被 commit
  99. git update-index --no-assume-unchanged <file> # undo 上一步
  100. # 那如何列出这些文件呢? https://stackoverflow.com/questions/2363197/can-i-get-a-list-of-files-marked-assume-unchanged
  101. git ls-files -v | grep '^[[:lower:]]'
  102. # https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less
  103. # 禁止 git brach 的时候使用交互式
  104. git config --global pager.branch false
  105. # git rm file and add, https://stackoverflow.com/questions/9591407/unstage-a-deleted-file-in-git/9591612
  106. # this restores the file status in the index
  107. git reset -- <file>
  108. # then check out a copy from the index
  109. git checkout -- <file>
  110. # git 注意不要把二进制大文件,视频文件等放入到版本库,可能会导致 .git 非常大,删了也无济于事
  111. find . -executable -type f >>.gitignore # https://stackoverflow.com/questions/5711120/gitignore-without-binary-files
  112. # 如何恢复一个已经删除的分之, https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
  113. git reflog # 查找对应 commit hash
  114. git checkout -b branch-name hash
  115. # git diff 代码显示 tab 为 4 个空格,比如看 go 代码的时候,git diff 显示 8 个
  116. # https://stackoverflow.com/questions/10581093/setting-tabwidth-to-4-in-git-show-git-diff
  117. git config --global core.pager 'less -x1,5'
  118. # git 如何使用不同的 committer,除了每个项目和全局可以设置 gitconfig 里的 user 外,可以使用如下方式
  119. # https://stackoverflow.com/questions/4220416/can-i-specify-multiple-users-for-myself-in-gitconfig
  120. # global config ~/.gitconfig
  121. [user]
  122. name = John Doe
  123. email = john@doe.tld
  124. [includeIf "gitdir:~/work/"]
  125. path = ~/work/.gitconfig
  126. # ~/work/.gitconfig
  127. [user]
  128. email = john.doe@company.tld
  129. # 从提交历史搜索字符串,比如提交历史中引入了一个新的函数,可以通过这个方式搜索
  130. # https://stackoverflow.com/questions/5816134/how-to-find-the-git-commit-that-introduced-a-string-in-any-branch
  131. git log -S 'hello world' --source --all

Git工作流

  1. git checkout master # 切到master
  2. git pull origin master # 拉取更新
  3. git checkout -b newbranch # 新建分之,名称最好起个有意义的,比如jira号等
  4. # 开发中。。。
  5. git fetch origin master # fetch master
  6. git rebase origin/master #
  7. # 开发完成等待合并到master,推荐使用 rebase 保持线性的提交历史,但是记住不要在公众分之搞,如果有无意义的提交也可以用 rebase -i 压缩提交
  8. git rebase -i origin/master
  9. git checkout master
  10. git merge newbranch
  11. git push origin master
  12. # 压缩提交
  13. git rebase -i HEAD~~ # 最近两次提交

Git hook

比如我们要在每次 commit 之前运行下单测,进入项目的 .git/hooks 目录, “cp pre-commit.sample pre-commit” 修改内容如下:

  1. #!/bin/sh
  2. if git rev-parse --verify HEAD >/dev/null 2>&1
  3. then
  4. against=HEAD
  5. else
  6. # Initial commit: diff against an empty tree object
  7. against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
  8. fi
  9. # Redirect output to stderr.
  10. exec 1>&2
  11. if /your/path/bin/test: # 这里添加需要运行的测试脚本
  12. then
  13. exit 0
  14. else
  15. exit 1
  16. fi
  17. # If there are whitespace errors, print the offending file names and fail.
  18. exec git diff-index --check --cached $against --

vim

  1. " http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or-linux
  2. :set tabstop=2 " To match the sample file
  3. :set noexpandtab " Use tabs, not spaces
  4. :%retab! " Retabulate the whole file,替换tab为空格
  5. map <F4> :%retab! <CR> :w <CR> " 映射一个命令
  6. "https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjF6JzH8aTRAhXiqVQKHUQBDcIQFggcMAA&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F71323%2Fhow-to-replace-a-character-by-a-newline-in-vim&usg=AFQjCNGer9onNl_RExCUdE75ctTvVx8WGA&sig2=WrcRh9RFNvN6bUZoHpJvDg
  7. "vim替换成换行符使用\r不是\n
  8. " 多行加上引号 http://stackoverflow.com/questions/9055998/vim-add-tag-to-multiple-lines-with-surround-vim"
  9. :1,3norm yss"
  10. # Git 插件
  11. Plugin 'tpope/vim-fugitive' # 在 vim 里执行 :Gblame 可以看到当前文件每行代码的提交人和日期,找人背锅或者咨询的神器
  12. # 直接在 vim 里 diff 文件,比如打开了两个文件
  13. :windo diffthis
  14. :diffoff!
  15. # 解决中文输入法的问题
  16. # https://www.jianshu.com/p/4d81b7e32bff
  17. # https://zhuanlan.zhihu.com/p/23939198
  18. # 如果跳转到跳转之前的位置, https://vi.stackexchange.com/questions/2001/how-do-i-jump-to-the-location-of-my-last-edit
  19. # 使用场景:比如在当前函数里使用了logging,发现logging import,我会跳转到文件头去 import logging,编辑完后进入normal模式使用 `` 就可以跳转到之前编辑位置
  20. `` which will bring you back to where the cursor was before you made your last jump. See :help `` for more information.
  21. # 如何编辑远程服务器文件, https://superuser.com/questions/403664/how-can-i-copy-and-paste-text-out-of-a-remote-vim-to-a-local-vim
  22. :e scp://user@host/relative/path/from/home.txt
  23. # 跳转
  24. g<c-]> # list all match tag
  25. # 跳转到上一个 insert 的位置,经常用在修改之后跳转到之前的编辑位置 https://vi.stackexchange.com/questions/2001/how-do-i-jump-to-the-location-of-my-last-edit
  26. `^ 或者 '^

vim-go plugin Tips

  1. # 最近一直在开发机服务器上直接用 neovim+vim-go 写 golang,具有完备开发功能(vim-go借助各种go工具实现)
  2. # https://github.com/fatih/vim-go
  3. # https://github.com/fatih/vim-go-tutorial # vim-go 官方教程,最好过一遍
  4. let g:go_def_mode='godef' # 有时候 gopls 有问题可以用 godef 跳转,默认用 gopls
  5. # 如何生成 interface 接口定义
  6. type S struct{} # cursor 放在 S 上执行 :GoImpl io.Reader
  7. # 跳转到接口的实现 https://github.com/fatih/vim-go/issues/820
  8. :GoDef (或ctrl+]) 跳转到定义,但是如果是接口实现只能跳转到 interface 定义而非 struct 实现。
  9. :GoCallees 从函数调用处跳转到接口的真正实现,而不是接口定义 (在方法调用点使用 -> struct 方法实现列表)
  10. :GoCallers 找到当前函数被调用的地点 (caller 主调, callee 被调)
  11. :GoImplements 获取一个接口方法的所有实现列表。(interface method -> implement method list)
  12. # 常用的方便命令(命令模式Tab补全), 参考 https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt
  13. :GoFmt 格式化,你可以配置 vim-go 直接保存自动执行格式化或者直接执行 GoImports
  14. :GoRun, GoTest, GoTestFunc 运行代码和单测
  15. :GoMetaLinter 执行 lint,可以配置 .gometalinter.json 忽略一些 lint 错误。https://github.com/PegasusWang/linux_config/blob/master/golang/gometalinter.json
  16. :GoRename 快速重构
  17. :GoImpl struct 生成接口函数定义(光标放到struct定义上使用)。如果一个 interface 有很多需要实现的函数,比较方便
  18. :GoAddTags GoRemoveTags json 快速给 struct field 增加 json tag,支持 visual 模式多选。默认 tag 名是下划线命名
  19. :GoKeyify 把无名称初始化的 struct literals 转成包含字段名的初始化方式
  20. :GoIfErr 生成 if err 返回值(或者用 snippets)
  21. :GoChannelPeers 寻找可能的 channel 发送和接收点
  22. :GoFillStruct 给一个 struct 填充默认值

用markdown文件制作html ppt

  1. apt-add-repository ppa:brightbox/ruby-ng
  2. apt-get update
  3. apt-get install ruby2.2
  4. gem install slideshow
  5. slideshow install deck.js
  6. sudo pip install https://github.com/joh/when-changed/archive/master.zip
  7. when-changed rest.md slideshow build rest.md -t deck.js
  8. # mac: brew install fswatch, http://stackoverflow.com/questions/1515730/is-there-a-command-like-watch-or-inotifywait-on-the-mac
  9. jfswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh
  10. fswatch -o ./*.py | xargs -n1 ./runtest.sh # 比如写单元测试的时候修改后就让测试执行
  11. # 也可以使用下边的工具用 Jupyter 做 slideshow,最大的特点是直接在浏览器里敲代码交互演示
  12. # Reveal.js - Jupyter/IPython Slideshow Extension, also known as live_reveal
  13. # https://github.com/damianavila/RISE
  14. # 更推荐使用 reveal-md
  15. reveal-md slides.md -w

PPT 技巧

  1. # 如何粘贴代码到 PPT 里边: 转成 rtf。直接粘贴没有代码高亮,转成 rtf 格式就可以了
  2. # https://superuser.com/questions/85948/how-can-i-embed-programming-source-code-in-powerpoint-slide-and-keep-code-highli
  3. # pip install Pygments
  4. pygmentize -f rtf code.py | pbcopy
  5. # 粘贴到 ppt 之后需要选择 “保留源格式”,这样代码才有高亮

Benchmark

  1. sudo apt-get install apache2-utils
  2. ab -c 并发数量 -n 总数量 url

Ffmpeg && youbute-dl

  1. # brew install youtube-dl
  2. # https://askubuntu.com/questions/486297/how-to-select-video-quality-from-youtube-dl
  3. # http://www.cnblogs.com/faunjoe88/p/7810427.html
  4. youtube-dl -F "http://www.youtube.com/watch?v=P9pzm5b6FFY"
  5. youtube-dl -f 22 "http://www.youtube.com/watch?v=P9pzm5b6FFY"
  6. youtube-dl -f bestvideo+bestaudio "http://www.youtube.com/watch?v=P9pzm5b6FFY"
  7. # 截取视频
  8. ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
  9. # https://gist.github.com/PegasusWang/11b9203ffa699cd8f07e29559cc4d055
  10. # 截图
  11. ffmpeg -ss 00:10:00 -i "Apache Sqoop Tutorial.mp4" -y -f image2 -vframes 1 test.png
  12. # 提取音频mp3, https://stackoverflow.com/questions/9913032/ffmpeg-to-extract-audio-from-video
  13. ffmpeg -i sample.avi -q:a 0 -map a sample.mp3
  14. # 连接视频
  15. $ cat input.txt
  16. file '/path/to/file1'
  17. file '/path/to/file2'
  18. file '/path/to/file3'
  19. # 注意用 -safe 0
  20. ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
  21. # youtube-dl 下载音频: https://askubuntu.com/questions/178481/how-to-download-an-mp3-track-from-a-youtube-video
  22. youtube-dl --extract-audio --audio-format mp3 <video URL>
  23. # use socks5 proxy
  24. youtube-dl --proxy 'socks5://127.0.0.1:1080' [URL]
  25. # use aria2 # https://blog.51cto.com/14046599/2348642
  26. # brew install aria2
  27. youtube-dl https://www.youtube.com/watch?v=zAJUeZ0SNp8 --external-downloader aria2c --external-downloader-args "-x 16 -k 1M"
  1. # 脚本下载 youtube 视频
  2. #!/usr/bin/env python
  3. # -*- coding:utf-8 -*-
  4. # pip install youtube_dl,如果报错尝试升级
  5. # pip install --upgrade youtube_dl
  6. from __future__ import unicode_literals
  7. import youtube_dl
  8. class MyLogger(object):
  9. def debug(self, msg):
  10. pass
  11. def warning(self, msg):
  12. pass
  13. def error(self, msg):
  14. print(msg)
  15. def my_hook(d):
  16. if d['status'] == 'finished':
  17. print('Done downloading, now converting ...')
  18. ydl_opts = {
  19. 'format': 'bestaudio/best',
  20. 'postprocessors': [{
  21. 'key': 'FFmpegExtractAudio',
  22. 'preferredcodec': 'mp3',
  23. 'preferredquality': '192',
  24. }],
  25. 'logger': MyLogger(),
  26. 'progress_hooks': [my_hook],
  27. }
  28. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  29. url = 'https://www.youtube.com/watch?v=48VSP-atSeI'
  30. ydl.download([url])

Vlog 如何增加字幕

  1. # 首先安装 autosub。先安装 brew install ffmpeg
  2. pip3 install git+https://github.com/BingLingGroup/autosub.git@alpha ffmpeg-normalize
  3. # 使用方式。最后生成 srt 文件,名字为 视频.zh-cn.rst
  4. autosub -S zh-cn -D zh-cn -i 视频.mp4
  5. # 之后可以使用软件比如 ArcTime 或者之类的软件可以导入并生成新的视频。
  6. # 使用 ffmpeg 也可以增加字幕并输出到新的 mp4
  7. ffmpeg -i 视频.mp4 -vf subtitles=视频.zh-cn.srt output.mp4

Curl

  1. # 记录 curl 过程, https://askubuntu.com/questions/944788/how-does-curl-print-to-terminal-while-piping
  2. curl -v http://httpbin.org/headers > t.txt 2>&1

Pandoc 转换文档格式

  1. pandoc -s -o about.md about.rst

Wireshark(mac tcp 抓包)

Capture -> Options -> lo0 抓本地 127.0.0.1 包。筛选 tcp.port == 6379 抓 redis tcp 包 抓包后点击一条选择右键 Follow -> TCP Stream 就可以查看 tcp 包发送的文本内容。

抓包iOS: 输入 rvictl -s 设备[udid]。格式是rvictl -s [设备udid],设备的udid可以通过itunes或者itools获取 system_profiler SPUSBDataType | grep "Serial Number:.*" | sed s#".*Serial Number: "##

HHKB 静电容键盘。Karabiner 修改 mac 键位配置

  • HHKB 开关我只打开了 2 (mac 模式),貌似网上有说打开开关 6 会出现无法唤醒的问题。
  • Mac 模式 HHKB 可以用使用 Fn+Esc 休眠。
  • 如何禁用内置键盘: Karabiner-Elements 同时可以禁用内置键盘,配置在 Devices -> Advanced, 勾选 Disable the built-in keyboard.
  • 网易云音乐切歌:使用 Fn + 7/8/9 分别是上一首,暂停和下一首

如何使用 mac 使用 Karabiner-Elements 改键配置

配置文件放置位置在 https://github.com/PegasusWang/linux_config/blob/master/mac_karabiner/wasd.json

~/.config/karabiner/assets/complex_modifications/wasd.json

这里我把 right_command + WASD 修改成上下左右,方便 HHKB 方向键移动,默认的 HHKB 方向键不方便。