cygwin

windows 下安装 cygwin 环境。 下载 setup-x86_64.exe,通常应从 mirror 安装软件包,否则可能很慢。 GUI 下不方便查找选择 mirror,而且可能没有要使用的 mirror,可直接用命令行指定 mirror。

setup-x86_64.exe --local-package-dir D:\software\ --root D:\cygwin64\ -O -s http://mirrors.ustc.edu.cn/cygwin/
  • --help 查看命令行帮助。
  • 默认会下载软件包并安装,--download 只下载,-L--local-install 直接从本地目录安装。
  • --local-package-dir D:\software\ 本地软件包目录。--root cygwin 安装根目录,安装程序会自动创建此目录。
  • -O -s http://xxx/cygwin/ 直接从指定 site (mirror) 安装。

其他可能有用的选项:

  • --no-admin 普通用户安装,不要求 admin 权限。--no-shortcuts 不创建快捷方式。
  • -g--upgrade-also 升级已有软件包,--packages 指定要安装的软件包。
  • -q 安静模式(自动安装)。

cygwin 下可使用如下命令自动安装软件包:

setup-x86_64.exe --local-package-dir 'D:\software\' --root 'D:\cygwin64\' -O -s http://mirrors.ustc.edu.cn/cygwin/ --no-shortcuts --no-admin --packages ping,vim -q

cygwin 默认将 windows 分区盘符挂载在 /cygdrive/ 下,第一次启动 cygwin shell 环境前可修改配置,命令如下:

D:\cygwin64\bin\sed -re "s/(^[^#].*?\s\/)cygdrive(\b\s+\w+\s+)(.*)$/#\0\n\1\2\3\nD:\/home \/home auto \3/" /etc/fstab -i~
D:\cygwin64\bin\bash --norc -c "x=$(/bin/readlink -m /etc/hosts) && /bin/ln -sf ${x#/cygdrive} -T /etc/hosts"
  • 设置 windows 分区直接挂载在根目录(/)下,使用 D:/home 作为 /home 目录。
  • 修正 hosts 软链接(?)。

还可以直接使用 vi 编辑:

D:\cygwin64\bin\vi -u NONE /etc/fstab

第一次启动登录 shell(如 mintty -) 时将自动创建用户 home 目录。

git 配置

  • 默认用户(全局)配置文件 ~/.gitconfig
  • 全局 ignore 文件可通过全局 core.excludesFile 配置,其能够识别 ~ home 路径。
git config --global core.excludesFile "~/.config/gitignore"
#echo ".envrc .local/" | tr " " "\n" >> ~/.config/gitignore

eclipse java 开发环境

  • 环境:ubuntu-mate 16.04
  • 版本:oxygen (4.7.x)
  • 时间:2017-12

  1. 下载软件包,可从国内镜像下载,如 USTC eclipse 镜像。 java 开发可下载 java 版,其他插件按需安装。

  2. 解压下载的软件包,解压后默认文件夹名为 eclipse,建议修改为对应开发环境和版本名,如 eclipse-java-oxygen-3a,同时设置一个对应开发环境的软链接。

    tar xf ~/software/eclipse/eclipse-java-oxygen-3a-linux-gtk-x86_64.tar.gz
    mv eclipse eclipse-java-oxygen-3a -T
    ln -s eclipse-java-oxygen-3a/ eclipse-java -Tf
  3. 设置 jvm 参数。编辑 eclipse.ini,在 -vmargs 前添加 -vm 设置 jdk bin 路径,如:

    -vm
    /usr/lib/jvm/java-8-openjdk-amd64/bin/

    按需修改 -Xms, -Xmx 等参数,建议修改为 1024m 。 其他配置参考 eclipse 运行时参数帮助文档

    操作命令:

    ( vm=$'-vm\\\n'"$(readlink -f "${JAVA_HOME}")/bin/" && if ! grep -Pe '^-vm$' eclipse.ini ; then sed -e '/^-vmargs$/ i '"${vm}" eclipse.ini -i ; else sed -re '/^-vm$/,+1 c '"${vm}" eclipse.ini -i ; fi )
    sed -r -e 's#^(-Xms|-Xmx)[0-9].*$#\11024m#g' eclipse.ini -i
    mvn dependency:get -Dartifact=org.projectlombok:lombok:1.16.22
    sed -r -e "\$ a -javaagent:$HOME/.m2/repository/org/projectlombok/lombok/1.16.22/lombok-1.16.22.jar" -e "/^-javaagent.*\/lombok\/.*\.jar/ d" eclipse.ini -i
  4. 设置 dock 图标关联。建议每个开发环境 eclipse 关联一个 dock 图标。 linux dock 软件 (如 mate-desktop 自带的 dock applet) 通常使用 StartupWMClass 关联应用程序和 dock 图标。 eclipse 启动后默认使用 plugins/org.eclipse.epp.package.*/plugin.xml 插件配置的 appName property 设置主窗口 nameclass。 默认为 "Eclipse",建议修改为对应开发环境名,如 "eclipse-java" 。 这个配置应在第一次启动前修改,或修改后第一次启动 eclipse 时添加 -clean 参数清空配置缓存使修改生效。

    ( epp=java && sed -re '/\bname="appName"/,+1 s#\b(value=").*?(")#\1eclipse-'"${epp}"'\2#g' plugins/org.eclipse.epp.package.${epp}_*/plugin.xml -i )

    编写一个简单 desktop 文件 ~/.local/share/applications/eclipse-java.desktop 内容如下:

    [Desktop Entry]
    Version=1.0
    Encoding=UTF-8
    Name=eclipse-java
    Type=Application
    Terminal=false
    Exec=sh -c "exec \$HOME/opt/eclipse-java/eclipse"
    Icon=/home/hanyong/opt/eclipse-java/icon.xpm
    StartupNotify=true
    Keywords=Run;
    StartupWMClass=eclipse-java

    将此 desktop 文件添加为 dock 图标即可。

  5. eclipse workspace 相关的配置保存在 .metadata 目录下。 一个 workspace 目录只能被一个 eclipse 使用,切换 eclipse 版本时可备份恢复 .metadata 文件夹。

  6. 其他设置。

    • 为避免 eclipse swt 使用 gtk3(gtk2 可能更稳定友好?),可设置环境变量 SWT_GTK3=0
    • 关掉 always show welcome 。
    • Fonts 设置基本字体为 Monospace 11,或 DejaVu Sans Mono 11 。
    • 关掉 "Automatic Updates", News 关掉自动拉取 RSS , "Error Reporting" "Send mode" 设置为 "Never send reports"。
    • Web Browser 设置使用外部浏览器。
    • "Java"/"Build Path", "Output folder name" 从 "bin" (eclipse 默认) 修改为 "target/classes" (maven 默认)。
    • Marketplace 安装 Spring Tools(需要优雅上网?),可只安装必须组件, Maven Support 和 spring boot support 。
  7. eclipse 应用市场搜索 fileExtension_<xxx> 可找到编辑对应扩展名文件的相关插件。

个人偏好设置:

  • 应用 Spring Tools 推荐的 M2E 配置(JDT 配置不需要)。
  • Java "Code Style", "Exception variable name in catch blocks" 设置为 "ex"(默认为 "e")。
  • Java "Code Style" Formatter 设置 "Eclipse [built-in-fixed]"。
    • "Indentation" 页勾选 "Indent" 勾选 "Empty lines" 。
    • "Line Wrapping" 页勾选上 "Never join already wrapped lines" 。
    • "Comments" 页取消 "Format line comments on first column" (4.8已默认), 勾选 "Never join lines",取消 "New line after @param tags"。 "Line width"/"Maximum width for comments" 设置为 120, 取消勾选 "Count width from comment's starting position"。
  • Java -> Editor -> "Content Assist" 页:
    • Insertion 选择 "Completion overwrites" 。
    • 取消勾选 "Inert single proposals automatically" 。
    • 取消勾选 "Use static imports" 。
  • 快捷键
    • "Copy Qualified Name" 设置为 "Shift+Ctrl+C", When "Editing Java Source", 对应的 "Toogle Comment" 取消快捷键设置以避免冲突。
  • "Organize Imports" 设置 "Number of static imports needed for .*" 为 5。

eclipse c++ 开发环境

  • 基本配置与 eclipse java 开发环境类似。
  • 为方便跨平台及命令行编译,建议使用 cmake 管理编译,可安装 cmake4eclipse 插件集成管理项目构建,安装 CMake Editor 插件方便编写 cmake 配置。

cmake4eclipse 插件使用(参考插件文档 "CMake for CDT User Guide" / "Getting Started"):

  • 新建 eclipse 管理编译的 C++ 项目。默认有 "Debug","Relase" 两套设置,可删掉只保留一套,稍后再复制出来(?)。
  • 项目设置 "C/C++ Build" 节点,"Builder Settings" tab 勾选 "Generate Makefiles automatically"。通常默认已勾选。
  • "C/C++ Build" / "Tool Chain Editor" 节点,"Current builder" 选择 "CMake Builder (portable)"。默认可能为 "Gnu Make Builder"(?)。
  • "C/C++ General" / "Paths and Symbols" 节点,"Source Location" 设置源码根目录,默认为项目根目录。

docker

  • 时间: 2018-03
  • 系统: ubuntu 16.04

配置 docker 软件包仓库:

# docker-engine
#sudo tee /etc/apt/sources.list.d/docker.list <<< "deb [arch=amd64] http://mirrors.aliyun.com/docker-engine/apt/repo/ ubuntu-$(lsb_release -cs) main"
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F76221572C52609D
#curl -sS -L http://mirrors.aliyun.com/docker-engine/apt/gpg | sudo apt-key add -

# aliyun docker-ce
sudo tee /etc/apt/sources.list.d/docker.list <<< "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
curl -sS -L http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# aliyun docker-ce VPC
#sudo tee /etc/apt/sources.list.d/docker.list <<< "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
#curl -sS -L http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

安装 docker-ce:

sudo aptitude install docker-ce=17.03.2~ce-0~ubuntu-xenial -y
sudo aptitude hold docker-ce
sudo sed -r -e 's/^(#?\s*)(deb.*)$/#\2/' /etc/apt/sources.list.d/docker.list -i
  • 17.03.x 是当前 rancher 上 kubenetes 1.8 支持的 docker 版本(?) 。
  • 不自动升级 docker 。

清理被 docker 污染的 iptables 等相关网络设置:

for t in filter nat ; do sudo iptables -t $t -F ; sudo iptables -t $t -X DOCKER ; done
sudo iptables -t filter -X DOCKER-ISOLATION
#sudo rmmod iptable_filter iptable_nat
sudo ip link delete dev docker0

LXD 网络管理更友好,可使用 LXD 重新创建 docker NAT 网桥:

lxc network create docker1 ipv4.{address=192.168.254.1/24,dhcp=false,nat=true,routing=false,firewall=false} ipv6.address=none dns.domain=docker
  • docker 外部网桥名不能使用 docker0,否则 docker 会修改其地址,这是个 bug?

此时应设置 docker 服务依赖 lxd 服务(以设置 docker 网桥):

sudo sed -r -e '/^(After=|Requires=)/ s#$# lxd.service#' /etc/systemd/system/docker.service -i

或者 docker 创建网桥,但手动设置 NAT(避免 docker 污染):

sudo iptables -t nat -A POSTROUTING -s 192.168.254.0/24 ! -d 192.168.254.0/24 -j MASQUERADE

可编写 systemd 服务 iptables-nat.service

[Unit]
Description=Setup iptables NAT rule for localhost network
After=network.target

[Service]
Type=oneshot
Environment=LOCAL_NET=192.168.254.0/24
EnvironmentFile=-/etc/default/iptables-nat
ExecStart=/bin/bash -exc ' x="$${LOCAL_NET}" && x="$${x/-/\\/}" && iptables -t nat -A POSTROUTING -s $${x} ! -d $${x} -j MASQUERADE '
ExecStop=/bin/bash -exc ' x="$${LOCAL_NET}" && x="$${x/-/\\/}" && iptables -t nat -D POSTROUTING -s $${x} ! -d $${x} -j MASQUERADE '
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable iptables-nat.service
sudo systemctl start iptables-nat.service

设置 docker 服务启动参数:

sudo rsync -ai /{lib,etc}/systemd/system/docker.service
sudo sed -r -e 's#^(ExecStart=.*?\s+-H\s+\S+)(.*)$#\1 --graph /home/repo/docker -b nat0 --fixed-cidr=192.168.128.192/27 --iptables=false --ip-forward=false#' /etc/systemd/system/docker.service -i

或设置 docker daemon json 配置文件 /etc/docker/daemon.json

{
	"graph": "/home/repo/docker/",
	"registry-mirrors": [
		"https://registry-vpc.cn-hangzhou.aliyuncs.com"
		],
	"bridge": "nat0",
	"fixed-cidr": "192.168.128.192/27",
	"iptables": false,
	"ip-forward": false
}

操作命令:

sudo bash -c "! test -s /etc/docker/daemon.json && jq -n \"{}\" | sponge /etc/docker/daemon.json"
sudo jq '.bip = "192.168.254.1/24" | .iptables = false | ."ip-forward" = false | ."registry-mirrors" = ["https://registry-vpc.cn-hangzhou.aliyuncs.com"]' /etc/docker/daemon.json | sudo sponge /etc/docker/daemon.json
sudo jq '."registry-mirrors" = [ "https://registry.docker-cn.com" ] + ."registry-mirrors"' /etc/docker/daemon.json | sudo sponge /etc/docker/daemon.json
  • systemd 启动时默认设置 -H fd://,表示 systemd 提供 socket,命令行直接启动时不需要指定此参数,默认使用 unix:///var/run/docker.sock
  • -H tcp://[host:port] 指定监听 TCP 端口, --tls* 相关设置配置 TLS 安全校验支持。
  • --config-file 指定 json 配置文件路径(默认 /etc/docker/daemon.json),减少命令行参数配置并更容易管理。
  • graph 设置 docker 服务根目录,目录不存在会自动创建。
  • registry-mirror 配置镜像注册中心的镜像(mirror)站点,支持配置多个,命令行可指定多次,配置文件中使用复数配置名 registry-mirrors 直接配置列表。 配置注册中心镜像(mirror)后,将尝试从该注册中心拉取镜像(替代官方 docker hub,可省略 host 前缀?要求 docker-ce 17.03.2 以上版本?), 拉回后本地 tag 也不带 host 前缀(但 push 时还是必须添加添加 host 前缀)。 可配置为官方中国镜像 https://registry.docker-cn.com , 参考 官方文档
  • 访问镜像默认使用 TLS (https) 加密,如果访问未加密的站点,需要显示指定 insecure-registry/insecure-registries,参考 Deploy a plain HTTP registry
  • 使用自定义网桥,禁用默认网络配置(iptables, ip-forward)。

    设置 --default-gateway= 时报如下错误:

    3月 25 21:52:43 han2017 dockerd[13947]: Error starting daemon: Error initializing network controller: Error creating default "bridge" network: failed to allocate secondary ip address (DefaultGatewayIPv4:192.168.128.1): Address already in use

    看报错信息,docker 尝试为指定网桥设置指定 IP 失败,删除此配置即可。docker 会自动检查指定网桥得到合适的网关配置(?)。

搭建官方镜像 hub 的镜像站点,registry 服务设置 proxy.remoteurl 为官方 hub 地址即可:

docker run --name registry -d --restart=unless-stopped --net=host -v /var/lib/registry:/var/lib/registry -e REGISTRY_PROXY_REMOTEURL=https://registry.docker-cn.com registry:2
  • 目前搭建镜像站点仅支持官方 hub (?)。

添加 registry, 如果为 http 协议(非 https),则同时配置 insecure-registries

jq 'del(."registry-mirrors") | del(."insecure-registries")' /etc/docker/daemon.json | sponge /etc/docker/daemon.json
for e in ${HUB:-http://192.168.22.23:5000} ; do
sudo cat /etc/docker/daemon.json | python2 -c 'import sys, json; a = json.load(sys.stdin); 
k = "registry-mirrors"; v = a[k] = dict.get(a, k, []); rUrl = sys.argv[1]; rUrl in v or v.append(rUrl); 
k = "insecure-registries"; from urlparse import urlparse; rObj = urlparse(rUrl); 
'$'\n''if rObj.scheme == "http": v = a[k] = dict.get(a, k, []); h = rObj.hostname + (rObj.port is not None and ":" + str(rObj.port) or ""); h in v or v.append(h); 
'$'\n''print( json.dumps(a, indent=2) )' "${e}" | sudo sponge /etc/docker/daemon.json
done

或者直接覆盖设置第一个 registry:

sudo cat /etc/docker/daemon.json | python2 -c 'import sys, json; a = json.load(sys.stdin); 
k = "registry-mirrors"; a[k] = dict.get(a, k, [""]); rUrl = sys.argv[1]; a[k][0] = rUrl; 
k = "insecure-registries"; from urlparse import urlparse; rObj = urlparse(rUrl); 
'$'\n''if rObj.scheme == "http": a[k] = [ rObj.hostname + (rObj.port is not None and ":" + str(rObj.port) or ""), ]; '$'\n''else: a[k] = []; 
'$'\n''print( json.dumps(a, indent=2) )' http://192.168.22.23:5000 | sudo sponge /etc/docker/daemon.json
  • 典型设置,第一个为官方 hub 镜像站点,第二个为私有 registry 仓库。修改官方 hub 镜像站点时,直接覆盖第一个 registry。

相关技巧:

  • 挂载 /var/cache/apt 等到容器内,可以复用宿主机上的 cache 等文件,方便制作镜像。 不过当前 docker build 不支持 -v 执行挂载,参考 issue #14080

hosts

  • hostess,支持增删查改,支持设置 hosts 路径,不支持多个候选(提示冲突?)。
  • goodhosts, 支持增删查改,功能更简陋。

Visual Studio Code

参考:https://code.visualstudio.com/docs/setup/linux#_installation

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

sudo apt-get update
sudo apt-get install code # or code-insiders

pssh

pssh 使用 python 编写,官方代码库为 google code parallel-ssh。 现已不再更新,但代码已经稳定。 ubuntu 下可直接从软件仓库安装 pssh 软件包,安装后默认命令名为 parallel-ssh 等。

sudo aptitude install pssh -y

也直接下载源码包,最新版本 pssh-2.3.1.tar.gz, 解压后使用 python 2.4 及以上(包括 python 3.1 及以上)版本即可直接运行。

curl -sSL https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/parallel-ssh/pssh-2.3.1.tar.gz | sudo tar xz -C /opt/

可使用 update-alternatives 设置 pssh 等更简短方便的命令别名:

sudo update-alternatives --install /usr/local/bin/pssh pssh /usr/bin/parallel-ssh 60 --slave /usr/local/bin/prsync prsync /usr/bin/parallel-rsync
sudo update-alternatives --install /usr/local/bin/pssh pssh /opt/pssh-2.3.1/bin/pssh 40 --slave /usr/local/bin/prsync prsync /opt/pssh-2.3.1/bin/prsync

pssh 很多选项也可以使用环境变量设置(全局默认值,优先级低于命令行参数),代码 psshlib/cli.py 可看到相关选项与环境变量的对应关系。 常用全局默认设置如下:

  • -i, --inline,输出执行命令的标准输出和标准错误,PSSH_INLINE。建议 PSSH_INLINE=1
  • -O OPTION, --option=OPTION,附加 ssh 选项,PSSH_OPTIONS。 可包含多个空格分割的 token,每个 token 为一个完整的 ssh 选项,因此 ssh 选项 key/value 应用 = 连接(不要用空格分割)。 可设置 PSSH_OPTIONS="StrictHostKeyChecking=no"

direnv

参考:https://direnv.net/

sudo aptitude install direnv -y

~/.bashrc 添加:

eval "$(direnv hook bash)"

sdkman

sdkman 使用 bash,不兼容基本 sh,只能在 .bashrc 中引入。

  • 环境变量配置 SDKMAN_OFFLINE_MODE=true

  • 配置文件 ~/.sdkman/etc/config,设置 sdkman_colour_enable=false

    sed -r -e 's#^(sdkman_colour_enable)=.*$#\1=false#g' ~/.sdkman/etc/config -i
  • 不要自动检查版本。

    sdkman (版本 5.6.1+290 及以上?) 执行非 update 命令时尝试自动检查版本更新。 sdkman-main.sh 中代码如下:

      # Check version and candidates cache
      if [[ "$COMMAND" != "update" ]]; then
          ___sdkman_check_candidates_cache "$SDKMAN_CANDIDATES_CACHE" || return 1
          ___sdkman_check_version_cache
      fi

    执行检查的代码在 sdkman-cache.sh, 可注释掉如下一行避免检查:

          SDKMAN_REMOTE_VERSION=$(__sdkman_secure_curl_with_timeouts "$version_url")

    sed 命令:

    sed -r -e '/^(\s|#)*SDKMAN_REMOTE_VERSION=\$\(__sdkman_secure_curl/ s/(^\s*)#?(SDKMAN)/\1#\2/g' ~/.sdkman/src/sdkman-cache.sh -i

python 环境

通常可使用 GNU/Linux 发行版系统自带的包管理工具安装 python 解释器,建议优先考虑 python3 。 操作系统软件包管理通常已包含常用 python 软件包,可作为系统全局安装。

sudo aptitude install python3 python3-virtualenv python3-pip -y

用户 python 应用建议创建独立的 virtualenv 环境并使用 pip 安装软件包,这样可以使用最新的软件包,同时避免应用依赖冲突。 创建 virtualenv 时默认会安装 pip 等基本软件包。 pip 用户级别默认配置为 $HOME/.config/pip/pip.conf,virtualenv 下配置为 $VIRTUAL_ENV/pip.conf。 通常可配置 pypi 镜像加速 python 软件包安装,详情参考 pip 配置说明

(默认官方地址 https://pypi.python.org/simple )。

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
#trusted-host = mirrors.aliyun.com
  • global 是全局配置,剩下的每段为对应命令的配置。
  • 配置项与命令行参数长选项同名,如查看 python3 -m pip install --help 就可以知道 install 的相关配置项。
  • index-url 配置软件包索引地址(默认官方地址 https://pypi.python.org/simple/ ),包含海量内容,不要直接访问(否则卡死浏览器)。
  • trusted-host 配置信任主机,链接不安全但信任主机时可以使用。

创建应用 virtualenv 环境:

$ python3 -m virtualenv --python python3 app/
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/hanyong/opt/app/bin/python3
Also creating executable in /home/hanyong/opt/app/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

$ python3 -m pip --version
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

$ ./app/bin/pip --version
pip 9.0.2 from /home/hanyong/opt/app/lib/python3.5/site-packages (python 3.5)

$ ./app/bin/python3 -c 'import sys; print(sys.path)'
['', '/home/hanyong/opt/app/lib/python35.zip', '/home/hanyong/opt/app/lib/python3.5', '/home/hanyong/opt/app/lib/python3.5/plat-x86_64-linux-gnu', '/home/hanyong/opt/app/lib/python3.5/lib-dynload', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/home/hanyong/opt/app/lib/python3.5/site-packages']
  • --python 指定 python 解释器,这是必须的,默认使用的是 python2 (虽然提示 Already using ... ?)。
  • 系统上同时安装了多个 python 版本,所以使用 python3 -m pip 明确指定使用的 python 版本。 virtualenv 下只有一个版本,可直接执行 pip 。可看到 virtualenv 下自动安装了新版本的 pip 。
  • virtualenv 下的脚本默认是写死 virtualenv 目录的绝对路径的。不能修改路径,否则新安装的脚本无法使用。所以不要改路径,要么全部重新安装一遍。
  • virtualenv 创建完后可修改为相对路径(使用 #!/usr/bin/env python),但这样要求配置好 PATH ,通用性也不好(并且有坑?),不推荐。

既然 virtualenv 目录不方便移动,可重新创建,可将其与应用配置和数据分开。 应用根目录模拟 Linux 系统目录结构,则可将其安装在应用 usr/ (或更独立的 python3/ ?)目录下。 为了实现可移植性,其他应用配置也需要考虑适配相对路径。

$ python3 -m virtualenv --python python3 app/usr/
# ... ...

$ source app/usr/bin/activate

(usr) 
$ which -a python3
/home/hanyong/opt/app/usr/bin/python3
/usr/bin/python3

(usr) 
$ pip --version
pip 9.0.2 from /home/hanyong/opt/app/usr/lib/python3.5/site-packages (python 3.5)

(usr) 
$ deactivate 

$ pip --version
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
  • source virtualenv 目录下的 bin/activate 文件可自动设置 PATH 等环境变量,方便在 shell 下调用 virtualenv 下安装的命令。 经测试 man 手册也可以查看。
  • PS1 提示符自动增加 virtualenv 名字前者,默认为其目录名(所以为 usr)。创建 virtualenv 时可使用 --prompt 自定义设置。
  • 执行 deactivate 可退出 virtualenv 相关设置。

pip 安装指定版本软件包:

pip install pyzmq==16.0.4

输入不存的版本(如空?),就会提示可用的版本,可作为查询可用版本的小技巧。

$ pip install pyzmq==
Collecting pyzmq==
  Could not find a version that satisfies the requirement pyzmq== (from versions: 2.0.7, 2.0.8, 2.0.10, 2.0.10.1, 2.1.1, 2.1.4, 2.1.7, 2.1.9, 2.1.10, 2.1.11, 2.2.0, 2.2.0.1, 13.0.0, 13.0.1, 13.0.2, 13.1.0, 14.0.0, 14.0.1, 14.1.0, 14.1.1, 14.2.0, 14.3.0, 14.3.1, 14.4.0, 14.4.1, 14.5.0, 14.6.0, 14.7.0, 15.0.0, 15.1.0, 15.2.0, 15.3.0, 15.4.0, 16.0.0, 16.0.1, 16.0.2, 16.0.3, 16.0.4, 17.0.0b1, 17.0.0b2, 17.0.0b3, 17.0.0b4, 17.0.0)
No matching distribution found for pyzmq==

node 环境安装配置

安装 node:

使用 nvmnvs(推荐)安装。

  • 第一次执行任意 nvs 命令即会下载 bootstrap node 作为 nvs 本身的解析器,默认从 defaults.json 文件中解析下载 URL, 默认为 https://nodejs.org/dist/ ,可临时修改为淘宝镜像 https://npm.taobao.org/mirrors/node/
  • source nvs.sh 后 nvs(函数)才能修改 $PATH
  • 第一次执行 nvs remote(管理各种 node 的下载 URL)时自动拷贝默认配置到 settings.json,之后默认配置文件可以还原。
  • nvs add 安装 node 版本,如 nvs add node/6
  • nvs use 使用指定版本,如 nvs use node/6
  • nvs link 设置默认版本。source nvs.sh 时自动添加默认版本到 $PATH(bug: 会重复添加?)。 不推荐使用。
  • nvs install 自动修改 shell 配置文件,bash 下默认添加 source nvs.sh 到 ~/.bashrc 文件(shell 函数不能从父进程继承)。 同时可手动在 .profile 文件中添加 nvs use 设置登录 shell 默认的 node 版本。 注意:nvs uninstall 还会进一步移除 PATH 设置和默认版本(不建议设置默认版本(?),可忽略)设置(副作用?)。
git clone git@github.com:jasongin/nvs.git
cd nvs
sed -e 's#https://nodejs.org/dist/#https://npm.taobao.org/mirrors/node/#' defaults.json -i
. nvs.sh
nvs remote default
git checkout .
nvs add node/6
nvs use node/6
# 修改 .bashrc 。可选手动修改 .profile(?)
nvs install

配置 npm:

使用 npm config set <key> <value> 配置或 npm config edit 直接编辑(可看到可配置项及默认值)。 用户默认配置文件为 ~/.npmrc。 参考 npm help config (man npm-config), man npmrc

npm config set registry https://registry.npm.taobao.org/
# 升级 npm
npm install -g npm
  • 使用镜像搜索可能有问题,搜索时可能需要设置回官方仓库。可包装为一条简单命令 npm-search
npm search --registry=https://registry.npmjs.org/ jquery
  • 初始化 node 项目。
npm init -y
# 安装依赖
npm install semantic-ui --production --save jquery
# 设置 direnv
echo "layout node" > .envrc
# 非开发环境可直接设置 NODE_ENV=production
echo "export NODE_ENV=production" >> .envrc
direnv allow .

latex 环境

在线编辑:https://www.sharelatex.com/

sudo aptitude install texlive -y
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D6BC243565B2087BC3F897C9277A7293F59E4889
echo "deb http://miktex.org/download/ubuntu xenial universe" | sudo tee /etc/apt/sources.list.d/miktex.list
sudo apt-get update
sudo apt-get install miktex

执行 latex(或 miktex-latex)命令生成 dvi 文件,可使用 xdvi 查看。

支持中文(参考:http://blog.csdn.net/u014803202/article/details/50410748):

转为 PNG 图片(参考:https://tex.stackexchange.com/questions/11866/compile-a-latex-document-into-a-png-image-thats-as-short-as-possible):