reset-checkout-revert

  • git
Reset, Checkout and Revert git reset、git checkout和git revert是git工具集中最常用的一些命令。它们都允许你对你的仓库undo某类改动,git reset和git checkout可作用于commits或files,revert只能作用于commits。 由于它们的功能非常的相似,在开发过程中很难区分哪个命令应该用于哪个开发场景。在这篇文章中我们将会比较这三个命令。希望你能在你的仓库中熟练地使用这些命令。 当你浏览这篇文章时,把每个命令的作用效果与git仓库的三个概念(工作目录,暂存区,提交历史)结合起来会对你很有帮助。 Commit级操作 git reset和git checkout根据传入的参数来决定其作用的范围。当参数中不含有文件路径时,它们作用于整个commits。这正是我们这个部分所要讨论的。注意,git revert不作用于files。 Reset 当作用于commit时,reset可以用于改变分支指针的指向。这可以被用来删除当前分支的commits。例如,下面的命令将hotfix分支向后移动两个commits。 git checkout hotfix git reset HEAD~2 hostfix分支尾部的两个commits现在处于悬挂状态,这意味着在下次git执行垃圾回收时这两个commits会被删除。换句话说,你在告诉git正在抛弃这两个commits。请看下面图示: git reset的这种用法常用于undo还没有被共享的改动。当你正添加一个新的feature且突然想重新开始时,这是你的goto命令。 除了在当前分支来回移动,通过命令行选项git reset也可用来改动暂存区和工作目录: * –soft – 不改动暂存区和工作目录 * –mixed – 更新暂存区到特定的commit,但是不改动工作目录。这是默认行为。 * –hard – 更新暂存区和工作目录到特定commit 请看下面图示: 这些选项常被用于HEAD commit。例如,git reset --mixed HEAD将暂存区的改动移回工作目录。另外,如果你想完全抛弃所有未提交的改动,可以使用git reset --hard HEAD。这两个场景也是最常用的。 当git reset作用于非HEAD commit时一定要格外小心,因为它变更了commit history。 Checkout 现在你应该很熟悉git commit作用于commits了。当作用于分支名时,它允许你在在分支间进行切换。 git checkout hotfix 上面的命令将HEAD指向另一个分支并更新工作目录到相应分支。由于这个命令有可能覆盖本地的变更,git会要求我们commit或stash工作目录可能会被覆盖的变更。git reset与git checkout不切换分支。

import

module 模块是一个文件。文件名=模块名+文件后缀,后缀有.py、.pyc、.pyo、.so等。模块中可以使用__name__获取模块名。 模块搜索路径 当模块被导入时,解释器首先搜索built-in模块,如果未找到,再搜索sys.path列表。 示例1 # file: demo.py import sys foo = 1 _bar = 1 通过import导入 >>> import demo >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'demo'] >>> dir(demo) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '_bar', 'foo', 'sys'] >>> 通过from…import…导入 >>> from demo import foo >>> from demo import _bar >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', '_bar', 'foo'] >>> 通过from…import * 导入 >>> from demo import * >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'foo', 'sys'] >>> package 包是一个目录。包目录下为首的一个文件便是__init__.

记windows通过linux共享上网

背景 女友家用笔记本的无线网卡突然罢工了,尝试有线还是能用的。但是网线连接到路由器不够长。我本人台式机装的是archlinux,一块有线网卡,一块USB无线网卡,平时使用USB无线网卡上网。两电脑距离较近,使用网线完全合适,于是想到能不能让windows通过linux上网。作为一个爱折腾的码农,关键时候怎能不好好表现一下,说干就干。 环境 windows7笔记本一台,双网卡, 一块有线网卡(没用),一块无线网卡(已坏) archlinux台式机一台,双网卡,一块有线网卡(没用),一块USB无线网卡(正常上网) 普通网线(双绞线)一根 目的:通过网线连接两块有线网卡,使windows通过linux上网 配置步骤 用网线连接两块有线网卡 开启ip转发sysctl net.ipv4.ip_forward=1 开启nat伪装iptables -t nat -A POSTROUTING -j MASQUERADE 配置linux有线网卡静态IP: 192.168.1.2/24 配置windows有线网卡静态IP: 192.168.1.3,MASK: 255.255.255.0, GATEWAY: 192.168.1.2 配置windows的DNS为linux机器上的DNS或者google公共DNS: 8.8.8.8 观察网络 在linux上观察windows ping百度的网络数据,其中192.168.0.114是linux上USB无线网卡的IP地址: [root@arch ~]# tcpdump -i any -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 23:00:03.298518 IP 192.168.1.3 > 115.

常用调试工具

linux下常用调试工具 fuser fuser使用文件或者套节字来识别进程 示例 fuser <filename> 常用选项 -n # 指定namespace(file, tcp, udp) -m # 指定挂载点 lsof lsof(list open files)列出当前系统打开文件 示例 lsof lsof -p 1234 常用选项 -p <pid> # 指定特定进程 -c <cmd> # 指定命令 -n # 不解析主机名 -P # 不解析端口号 gstack gstack打印的堆栈信息 示例 gstack <pid> strace strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 示例 strace cat /dev/null strace -p 1234 常用选项 -p <pid> # 指定特定进程 -o <filename> # 输出到文件 -f # 踪子进程 -ff # 跟-o连用,每个进程输出到各自文件 tcpdump tcpdump抓包

lvs

背景 提高业务系统的处理能力及可靠性 集群:方案采用多节点集群 负载均衡:调度器 高可用:HA 方案 pacemaker + lvs + ldirectord 由于项目的主要负载是rdp及ssh协议,所以lb采用lvs。同时使用pacemaker保证lvs的可靠性。 集群由lvs进行负载均衡高度,使用pacemaker来保证lvs的高可用。 为了节约成本,lvs由pacemaker随机选取集群节点中的一个节点来运行。调度策略采用lvs的dr模式,调度算法采用lc。 实施 由于lvs要求real server必须禁止arp响应而virtual server必须支持arp响应,所以pacemaker定义资源运行在Master/Slave模式并与ldirectord绑定关系。 lvs资源 lvs运行在master/slave模式。master节点在指定网卡上配置vip,响应arp,并启用转发;slave节点在网卡lo上配置vip,不响应arp。 响应arp需要通知路由更新arp表,由程序send_arp向路由发送更新消息,该程序由resource-agents的IPaddr中提取,IPaddr位于/usr/lib/ocf/resource.d/heartbeat/IPaddr。 以下agent脚本由pacemaker提供的Stateful模板改编而来,模版默认位于/usr/lib/ocf/resource.d/pacemaker/Stateful。 文件名:lvs #!/bin/sh # # # Example of a stateful OCF Resource Agent. # # Copyright (c) 2006 Andrew Beekhof # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation.

logging

一个简单的例子 import logging logging.warning('Watch out!') # 输出到控制台 logging.info('I told you so') # 什么都不输出 输出: WARNING:root:Watch out! logging默认输出到控制台,默认输出级别为WARNING,所以INFO级别没有输出。 异常处理 logging为异常专门提供了logger.exception()接口以便输出异常,该接口只应该在异常处理时使用。 try: 1/0 except: logging.exception('Excepion:') 输出: ERROR:root:Excepion: Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: integer division or modulo by zero 配置日志 logging.basicConfig(filename='example.log',level=logging.DEBUG) basicConfig应该在记录日志之前被调用,可以被调用多次,但只有第一次调用会生效。 高级话题 logging模块提供了loggers, handlers, filters, and formatters更加现代的组件: Loggers: 暴露接口以便应用程序直接调用 Handlers: 将日志发送到相应目的地 Filters: 对日志进行过滤 Formatters: 指定日志的输出格式 日志的传输方向为: looggers->handlers->filters->formatters。