git笔记


git修改提交作者和邮箱

  • 提交前

    如果代码未提交,则可以

    git config  user.name "Author Name"
    git config  user.email "Author Email"
    
  • 提交后

    如果代码已经提交,或者已经push到remote(只能修改最近一次提交)

    git commit --amend --author="NewAuthor <[email protected]>"
    

    修改全部commit,需要使用脚本 参考github官方

    #!/bin/sh
    
    git filter-branch --env-filter '
    OLD_EMAIL="[email protected]"
    CORRECT_NAME="Your Correct Name"
    CORRECT_EMAIL="[email protected]"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME …

docker笔记


docker删除硬盘残留的文件

使用 docker rmi ... 或者 docker image rm ... 并不能将镜像完全删除,还会一直占用硬盘空间

docker system prune

该命令不会删除已存在镜像(不管是否正在运行)

(硬盘一下子多个好几个G, 心情不错)

docker构建时禁用缓存

dockerfile 中有多个 RUN 或者 ADD .. 命令时, 每个 RUN 都会创建一个 image, 下一个 image 会以上一个为基础(缓存)继续构建,

可以使用 docker images -a 看到很多 <none> 的 image

不过作为一名有洁癖的coder, 这种情况不能忍

docker build --no-cache -t hello .

emacs自动更新文件头


前面已经说过,可以使用auto-insert自动添加文件头,今天来说一说自动更新文件头,比如说每次保存时自动更新last updated字段

自动更新Last Updated

如果使用的是header2,直接设置相关的变量就可,假如使用的是auto-insert,同样也可以使用emacs内置的time-stamp对Last Updated进行自动更新

time-stamp默认使用Time-stamp:,如果要对Last Updated进行自动更新,只需要简单的设置

(setq time-stamp-active t)
(setq time-stamp-line-limit 11)
(setq time-stamp-start "[lL]ast[ -][uU]pdate[ \t]*:?")
(setq time-stamp-end "\n")
(setq time-stamp-format " %#A %Y-%02m-%02d %02H:%02M:%02S (%Z)")

然后添加

(add-hook 'before-save-hook 'time-stamp)

这样就能在每次保存时自动更新相应的字段了 …

emacs自动添加文件头


想要在emacs中添加文件头有好几种方法:

  • 直接手打
  • 使用模板yasnippet
  • 使用header2
  • 使用内置的package auto-insert

header2可能是最方便的一种自动添加文件头的方式,但我之前使用过,想要自定义自己想要的内容很难,而且白白浪费header2的功能

今天主要说一说emacs内置里auto-insert,使用它在创建文件时自动添加文件头信息

基础使用

直接(auto-insert-mode) 并且设置

(setq auto-insert-query nil) ;; 不提醒

自定义文件头

(setq auto-insert-alist
      '(((python-mode . "Python program") nil
         "#!/usr/bin/env python\n"
         "# -*- coding: utf-8 -*-\n"
         "# **************************************************************************\n"
         "# Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n"
         "# File Name: " (file-name-nondirectory buffer-file-name) "\n"
         "# Author: " (user-full-name)"\n"
         "# Email: " user-mail-address "\n"
         "# Created: " (format-time-string "%Y-%m- …

helm与ivy简单对比


我为什么放弃ivy回到了helm

说一说ivy用的不爽的地方吧

counsel-find-file

counsel-find-file作为最常用的命令,ivy竟然没有把默认的find-file进行覆写,比如我在dired中想要复制文件,我习惯使用C-h退回上一个目录,但即使我之前已经设置了

:map counsel-find-file-map
("C-h" . counsel-up-directory)

但只有在使用counsel-find-file时有效,类似dired中是无效的,相比较于helm-find-filesfind-file进行覆写,无论何时都能使用自己自定义的按键,这很不爽

tab键

helm中,tab仅作为补全使用,想要打开选中项,则需要按一下enter键,而在ivy中,我不知道开发者怎么想的, 我需要记住两个或两个以上的按键

在ivy中,tab键就像命令名称ivy-alt-done一样,意味着按一下tab,就能得到helm中tab and enter的效果。

这很方便是不是?

但是,如果我要在emacs中重命名一个文件,把aaa …

linux笔记


记录

设置临时英文环境变量

LANG="en_US.UTF-8" git branch 2> /dev/null

linux下gif播放

feh只支持静态文件,可用

animate output.gif

supervisor增加新配置不重启

supervisorctl reread …

lua中匪夷所思的table长度


s = { 1, 2, 3, 4, 5, 6 }
print(#s)     -- output: 6
s[4] = nil
print(#s)     -- output: 6
s[7] = nil
print(#s)     -- output: 3
s[4] = 4
print(#s)     -- output: 6
s[4] = nil
print(#s)     -- output: 3

print()

s = { "1", "2", "3", "4", "5", "6" }
print(#s)     -- output: 6
s["4"] = nil
print(#s)     -- output: 6
s["7"] = nil
print(#s)     -- output …

ansible快速部署加速方案


ansible是基于Python的 自动化部署 方案,但是目前只是通过命令行

ansible -i hosts all -a 'uptime'
# or
ansible-playbook -i hosts playbook.yml -e 'args' -t deploy

实现自动化部署.

长此以往,虽然可以实现所谓的自动化,但产品业务线多且杂的情况下,项目很难维护,更不用说以文件为存储的表现形式很差,针对目前使用ansible的经验以及使用中的困难,可以针对性的提出一些解决方案

加速

问题

自动化部署其中最大的障碍就是 网络 的原因

其中需要通过网络上传一些模板文件,有的甚至还需要上传一些压缩包,虽然说几MB的东西很快就能上传成功,但如果把这上传文件所需要的2秒乘以上百,上千台主机呢,更不用说ansible的表现形式就是一个任务一个任务的往下执行,假如在上传模板这一步卡住(等待所有服务器上传成功),这时某台未模板化的服务器的某服务需要重启,是不是会出问题呢

方案

针对这一问题,目前想到的解决方案如下:

  • 适当增加fork数

    目前fork数默认为50,可以适当增加

  • 大文件使用内网(外网)下载

    从部署机上上传文件可能会出现这样那样的问题,尤其是上传到国外服务器时经常会出现ansible playbook的任务卡住问题 …

ansible-playbook中tasks单进程


之前有一个需求,ansible-playbook中需要某一步单步执行,也就是说在有多台服务器时,某个任务只能一台服务器执行完后,另一台服务器才能执行,否者对应集群的服务会出问题

这是一个很简单的需求,ansible中也有对应的实现, --fork 1 或者 使用 serial

但是如果有人忘记加 --fork 1 了呢,而且该任务是在子任务中,使用 include 加载, serial 关键字无法在某一特定任务中使用,只能与 hosts 同级

所幸,在这里 https://www.bountysource.com/issues/26342862-support-for-serial-on-an-individual-task 找到了解决办法,使用 delegate_to

- name: service restart
  # serial: 1 would be the proper solution here, but that can only be set on play level
  # upstream issue: https://github.com/ansible/ansible …

redis集群搭建


Table of Contents

参考资料

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集

准备

集群开始需要运行redis集群实例,而且要让集群正常运作至少需要三个主节点,这里创建六个节点,三个为主节点,三个为从节点,端口号分别为9001,9002,9003,9004,9005,9006

并创建六个以端口号为名字的目录, 在每个目录中运行一个Redis实例

mkdir -p redis/9001
cd redis
mkdir 9002
mkdir 9003
mkdir 9004
mkdir 9005
mkdir 9006

然后将对应的配置redis.conf放入相应的目录中(记得修改端口号)

最小配置选项:

port 9001
cluster-enabled yes
cluster-config-file node9001.conf
cluster-node-timeout 5000
appendonly yes

然后就可以启动redis实例了

redis-server redis/9001/redis.conf …