Skip to content

Instantly share code, notes, and snippets.

@senarukana
Last active January 19, 2016 02:53
Show Gist options
  • Save senarukana/0b59eac8abf636a3824b to your computer and use it in GitHub Desktop.
Save senarukana/0b59eac8abf636a3824b to your computer and use it in GitHub Desktop.
;; keys define by this won't get override by other module
(defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")
;; ident
(global-set-key (kbd ">") 'my-indent-region)
(global-set-key (kbd "<") 'my-unindent-region)
;; remap c-a
(global-set-key [remap move-beginning-of-line]
'smarter-move-beginning-of-line)
;; remap m-d
(global-set-key [remap kill-word]
'kill-whitespace-or-word)
;; remap search
(global-set-key [remap isearch-forward]
'swiper)
;; remap search
(global-set-key [remap isearch-backward]
'swiper)
;; remap kill ring to easy
(global-set-key [remap kill-ring-save] 'easy-kill)
(global-set-key [remap mark-sexp] 'easy-mark)
;; C= C-o C-/ C-t
;; kill lines backward
(global-set-key (kbd "C-<backspace>") (lambda ()
(interactive)
(kill-line 0)
(indent-according-to-mode)))
(global-set-key (kbd "C-M-j") 'top-join-line)
;; 美妙的mark
(global-set-key (kbd "C-\\") 'er/expand-region)
;; go to line
(define-key my-keys-minor-mode-map (kbd "C-l") 'goto-line)
;; winner mode
(define-key my-keys-minor-mode-map (kbd "C-q") 'winner-undo)
(define-key my-keys-minor-mode-map (kbd "M-q") 'winner-redo)
;; 快速跳转.
(define-key my-keys-minor-mode-map (kbd "C-r") 'avy-goto-word-or-subword-1)
;; M-n M-h M= M-/ M-c
(global-set-key (kbd "M-o") 'smart-open-line)
(global-set-key (kbd "M-RET") 'smart-open-line)
(global-set-key (kbd "M-O") 'smart-open-line-above)
(define-key my-keys-minor-mode-map (kbd "M-u") 'helm-buffers-list)
;; (global-set-key (kbd "M-u") 'helm-buffers-list)
(global-set-key (kbd "M-k") 'smarter-kill-move-beginning-of-line)
;; 自动填充
(global-set-key (kbd "M-\\") 'hippie-expand)
;; mark到char
(global-set-key (kbd "M-z") 'zop-up-to-char)
(global-set-key (kbd "M-Z") 'zop-to-char)
(define-key my-keys-minor-mode-map (kbd "M-j") 'helm-filtered-bookmarks)
(define-key my-keys-minor-mode-map (kbd "M-s") 'helm-projectile-ag)
(global-set-key (kbd "M-c") 'mc/mark-all-like-this)
(global-set-key (kbd "C-M-c") 'mc/mark-next-like-this)
(global-set-key (kbd "M-(") (prelude-wrap-with "("))
(global-set-key (kbd "M-{") (prelude-wrap-with "{"))
(global-set-key (kbd "M-=") 'god-local-mode)
;; "m-,"在emacs中默认upcase-work,现绑定到other-window,方便在几个window中移动
(global-set-key (kbd "M-,") 'other-window)
;; ace window
(global-set-key (kbd "M-m") 'ace-window)
(global-set-key (kbd "M-%") 'anzu-query-replace)
(global-set-key (kbd "C-M-%") 'anzu-query-replace-regexp)
(global-set-key (kbd "M-]") 'anzu-query-replace)
(global-set-key (kbd "C-M-]") 'anzu-query-replace-regexp)
(global-set-key (kbd "C-M-z") 'indent-defun)
(global-set-key (kbd "C-c c") 'pbcopy)
(global-set-key (kbd "C-c v") 'pbpaste)
(global-set-key (kbd "M-y") 'browse-kill-ring)
(global-set-key (kbd "C-c D") 'delete-file-and-buffer)
(global-set-key (kbd "C-c d") 'duplicate-current-line-or-region)
(global-set-key (kbd "C-c M-d") 'duplicate-and-comment-current-line-or-region)
(global-set-key (kbd "C-c K") 'kill-other-buffers)
(global-set-key (kbd "C-c i") 'goto-symbol)
(global-set-key (kbd "C-c I") 'find-user-init-file)
(global-set-key (kbd "C-c S") 'find-shell-init-file)
(global-set-key (kbd "C-c g") 'prelude-google)
(global-set-key (kbd "C-c G") 'prelude-github)
(global-set-key (kbd "C-c C-w") 'halve-other-window-height)
(global-set-key (kbd "C-c ,") 'golden-ratio)
(global-set-key (kbd "C-c o") 'gist-list)
;; 删除正行
(global-set-key (kbd "C-c C-k") 'my-kill-whole-line)
(global-set-key (kbd "C-c C-SPC") 'copy-line)
;; rename
(global-set-key (kbd "C-c C-r") 'rename-file-and-buffer)
(global-set-key (kbd "C-c r") 'rename-buffer)
;; shell command
(global-set-key (kbd "C-c s") 'shell-command)
;; align regexp
(global-set-key (kbd "C-c \\") 'align-regexp)
(global-set-key (kbd "C-c z") 'shell)
(global-set-key (kbd "C-c /") 'revert-buffer-no-confirm)
;; Start proced in a similar manner to dired
(unless (eq system-type 'darwin)
(global-set-key (kbd "C-x p") 'proced))
(global-set-key (kbd "C-x g") 'magit-status)
;; helm
(global-set-key (kbd "C-x f") 'helm-browse-project)
(global-set-key (kbd "M-x") 'helm-M-x)
(global-set-key (kbd "C-x C-m") 'helm-M-x)
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
(global-set-key (kbd "C-x b") 'helm-mini)
(global-set-key (kbd "C-x C-b") 'helm-buffers-list)
(global-set-key (kbd "C-x C-f") 'helm-find-files)
(global-set-key (kbd "C-h f") 'helm-apropos)
(global-set-key (kbd "C-h r") 'helm-info-emacs)
(global-set-key (kbd "C-h C-l") 'helm-locate-library)
(global-set-key (kbd "C-x r b") 'helm-filtered-bookmarks)
;; flycheck
(eval-after-load "flycheck"
'(progn
(define-key flycheck-mode-map (kbd "C-c f n") 'flycheck-next-error)
(define-key flycheck-mode-map (kbd "C-c f p") 'flycheck-previous-error)))
(define-minor-mode my-keys-minor-mode
"A minor mode so that my key settings override annoying major modes."
t " my-keys" 'my-keys-minor-mode-map)
(my-keys-minor-mode 1)
(defun my-minibuffer-setup-hook ()
(my-keys-minor-mode 0))
(add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
(defadvice load (after give-my-keybindings-priority)
"Try to ensure that my keybindings always have priority."
(unless (eq (caar minor-mode-map-alist) 'my-keys-minor-mode)
(let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
(assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys))))
(ad-activate 'load)
(provide 'core-keybindings)

Docker概念

Image: Docker的文件镜像 Container: 运行的隔离环境 挂载文件

Docker在OSX

  • 运行脚本: /Applications/Docker/Docker\ Quickstart\ Terminal.app/Contents/Resources/Scripts/start.sh
  • eval "$(docker-machine env default)"
  • 依赖于docker-machine来创建docker的宿主环境

docker-machine

  • craete docker-machine create -d virtualbox --virtualbox-memory 2048 machine-name
  • 查看环境信息 env docker-machine env default

Container

基本操作

RUN

-d: 后台执行 -e: 环境变量 -e TEST_ENV="env"

start stop ps rm

EXEC

在Container中执行命令

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

  -d, --detach=false         Detached mode: run command in the background
  -i, --interactive=false    Keep STDIN open even if not attached
  -t, --tty=false            Allocate a pseudo-TTY
  -u, --user=                Username or UID (format: <name|uid>[:<group|gid>])

Example:
$ docker run --name ubuntu_bash --rm -i -t ubuntu bash
$ docker exec -d ubuntu_bash touch /tmp/execWorks
$ docker exec -it ubuntu_bash bash

logs

  • 基本: docker logs container_name

  • tail: docker logs -ft container_name

状态

  • process: docker top container_name
  • 基本信息: docker inspect container_name

端口映射

  • 启动时expose: docker run -p inport:outport

  • 查看expose port: docker port inport container_name

osx端口映射问题

需要设置virtualbox开放端口

-p 5000:5000

连接多个container

run --link container-name:db 执行该条命令后,会在该container的/etc/hosts上添加一条到container的解析,如: 172.17.0.31 db 同时它还会产生对应env条目 DB_NAME= DB_PORT= xxx

镜像

基本操作

images, search, pull, rmi

存放位置

仓库内容: /var/lib/docker/repositories

数据卷

容器中数据的管理主要通过两种方式:数据卷和数据卷容器。数据卷是一个可供一个或过个容器使用的特殊目录,它可以在容器之间共享和重用、对数据卷的修改会马上生效、对数据卷的更新不会影响镜像,数据卷类似Linux下的对文件或目录进行mount。

  1. 在docker run 中加入-v可以创建或挂载数据卷:

$ docker run -d --name 'test' -v /data centos:latest /bin/bash 在DockerFile文件中可以通过VOLUME命令来添加数据卷

  1. 在-v可以挂载本机目录作为数据卷

$ docker run -d --name 'test' -v /shared/data:/data centos:latest /bin/bash 将本机的/shared/data挂载到容器的/data目录,作为数据卷,这种方式可以方便的共享主机的文件,比如一些安装或者检测文件,但是本机的路径必须是绝对路径而且DockerFile不支持这种方式,所以考虑到DockerFile的移植和分享,不要采用此种方式。可以在-v /shared/data:/data后面加上只读、读写等修饰比如 -v /shared/data:/data:ro

  1. 创建数据卷容器 数据卷容器,就是创建一个正常的容器,然后利用它来提供数据卷供其他容器挂载:

$ docker run -d --name 'test' -v /data centos:latest /bin/bash $ docker run -d --name 'test1' --volumes-from test centos:latest /bin/bash $ docker run -d --name 'test2' --volumes-from test centos:latest /bin/bash 第一行命令创建了一个数据卷容器test,后面两行分别创建两个容器test1和test2,并都挂载了数据卷容器test1,此外,容器可以从其他已经怪哉了数据卷的容器来挂载数据卷,也就是说test1挂载test后,test2可以通过挂载test1得到和上述相同的效果。

备份###

$ docker run --volumes-from test -v /shared/backup:/backup centos:latest tar cvf /backup/backup.tar /data 这句话有三个目的:首先挂载数据卷容器test;然后将本机的/shared/backup目录挂载到容器的/backup目录下;容器启动后调用tar命令将数据卷/data的数据打包备份到容器的/backup/backup.tar。通过这三个操作,我们就可以在本机的/shared/backup目录下得到备份文件backup.tar

恢复###

$ docker run --volumes-from test -v /shared/backup:/backup centos:latest untar xvf /backup/backup.tar /data 恢复实际上就是逆过程,将数据解压并放到数据卷下

网络##

Docker的网络的使用包括两大类:外部访问容器和容器之间互联,具体的实现原理可以看下面Docker原理部分。

外部访问容器 通过在容器启动是加入-p或-P来指定端口映射,Docker容器网络通过桥接模式连接到主机,端口映射通过NAT实现:

$ docker run -d --name 'test' -v /shared/data:/data -p 50022:22 -p 50080:80/udp centos:latest /bin/bash 将本地的50022端口映射到容器的22端口,将本地的udp端口50080映射到容器的80端口

容器互联 容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

$ sudo docker run -d --name db training/postgres $ sudo docker run -d -P --name web --link db:db training/webapp python app.py 通过--link name:alias 将web容器连接到db容器,这样可以让容器不用向外部暴露端口,容器之间可以进行安全的交互。

Docker Compose

name: image: ports:

#include <vector>
#include <unistd.h>
#include <atomic>
using namespace std;
template<typename T>
class LockFreeQueue {
public:
LockFreeQueue(int c) {
_capacity = c;
_n = atomic<int>(0);
queue = vector<T>(c);
}
void Enqueue(T obj) {
int n;
do {
enqueue:
n = _n.load();
if (n == _capacity) {
sleep(1);
goto enqueue;
}
} while (_n.compare_exchange_strong(n, n+1));
queue[_tail] = obj;
_tail = (_tail+1) % _capacity;
}
T Deque() {
int n;
do {
deque:
n = _n.load();
if (n == 0) {
sleep(1);
goto deque;
}
} while (_n.compare_exchange_strong(n, n-1));
T obj = queue[_head];
_head = (_head+1) % _capacity;
return obj;
}
private:
int _head, _tail, _capacity;
volatile atomic<int> _n;
vector<T> queue;
};
package marshal
import (
"bytes"
"encoding/json"
"testing"
)
type MarshalInterface interface {
Example() string
}
type MarshalObject struct {
key string
val string
}
func (m *MarshalObject) Example() string {
return m.key
}
func (m *MarshalObject) MarshalJSON() ([]byte, error) {
data := make(map[string]string)
data["key"] = m.key
data["val"] = m.val
buf := &bytes.Buffer{}
enc := json.NewEncoder(buf)
err := enc.Encode(data)
return buf.Bytes(), err
}
func (m *MarshalObject) UnmarshalJSON(data []byte) error {
marshalData := make(map[string]string)
buf := bytes.NewBuffer(data)
dec := json.NewDecoder(buf)
if err := dec.Decode(&marshalData); err != nil {
return err
}
m.key = marshalData["key"]
m.val = marshalData["val"]
return nil
}
func TestMarshal(t *testing.T) {
var im MarshalInterface
var m MarshalObject
im = &MarshalObject{
key: "Example",
val: "Test",
}
buf := &bytes.Buffer{}
enc := json.NewEncoder(buf)
err := enc.Encode(im)
if err != nil {
t.Fatal(err)
}
dec := json.NewDecoder(buf)
if err = dec.Decode(&m); err != nil {
t.Fatal(err)
}
if m.key != "Example" {
t.Fatal("key error")
}
if m.val != "Test" {
t.Fatal("key error")
}
}
'''
6 2 5 3 1 4
-----------
0 1 2 3 4 5
===========
0 0 0 0 0 0
1 3 4
-----
4 3 5
=====
1 1 0
2 5 6
-----
1 2 0
=====
1 0 0
1 2 3 4 5 6
===========
1 3 1 0 0 0
[2, 5, 6] [1, 3, 4]
'''
def merge_sort(nums, index, tmp, surpasser, left, mid, right):
i, j = left, mid+1
k = left
while i <= mid and j <= right:
if nums[index[j]] <= nums[index[i]]:
tmp[k] = index[j]
j += 1
else:
surpasser[index[i]] += right-j+1
tmp[k] = index[i]
i += 1
k += 1
if i <= mid:
tmp[k:right+1] = index[i:mid+1]
if j <= right:
tmp[k:right+1] = index[j:right+1]
index[left:right+1] = tmp[left:right+1]
def surpass_nums(nums, index, tmp, surpasser, left, right):
if left < right:
mid = (left+right) >> 1
surpass_nums(nums, index, tmp, surpasser, mid+1, right)
surpass_nums(nums, index, tmp, surpasser, left, mid)
merge_sort(nums, index, tmp, surpasser, left, mid, right)
nums = [6, 2, 5, 3, 3, 1, 4]
n = len(nums)
index = [i for i in range(n)]
tmp = [None] * n
surpasser = [0] * n
surpass_nums(nums, index, tmp, surpasser, 0, n-1)
print surpasser
def partition(nums, left, right):
smallerIdx = left
for idx in xrange(left+1, right+1):
if nums[idx] < nums[left]:
smallerIdx += 1
nums[idx], nums[smallerIdx] = nums[smallerIdx], nums[idx]
nums[smallerIdx], nums[left] = nums[left], nums[smallerIdx]
return smallerIdx
def topk_util(nums, left, right, k):
idx = partition(nums, left, right)
rank = idx-left+1
if rank == k:
return nums[idx]
elif rank < k:
return topk_util(nums, idx+1, right, k-rank)
else:
return topk_util(nums, left, idx-1, k)
def topk(nums, k):
if len(nums) < k:
return None
return topk_util(nums, 0, len(nums)-1, k)
nums = [5, 3, 4, 2, 1]
print topk(nums, 3)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment