如何使用Tmux提高终端环境下的效率

我之前都是使用screen , 直到听到有人说tmux是screen的加强版
tmux有两个用处

  • 作为一名系统管理员,我大量的工作都需要在终端环境下。打开很多标签,然后在多个终端之间切换窗口会让我慢下来。尤其是当我的服务器出问题的时候,我不能浪费任何时间!
  • 当我远程连接到服务器的时候, 当突然断网的时候, 我不希望我的任何工作全部丢失

安装

ubuntu下

1
# sudo apt-get install tmux

centos等红帽系
yum install tmux

Archlinux:
sudo pacman -S tmux

tmux使用

tmux 有两个概念:

  • session
  • 窗口

一个session可以有多个窗口, 当远程连接断开的时候, session还在后台运行
窗口之间可以彼此切换, 也可以在一个屏幕上同时显示

session

让我们开始一个叫做”session”的会话,并且运行top命令

1
2
$ tmux new -s new session
$ top

然后输入CTRL-b d从此会话脱离,想要重新连接此会话,需输入:

1
$ tmux attach-session -t session

一些管理sessions的命令:

1
2
3
4
5
6
$ tmux list-session
$ tmux new-session <会话名>
$ tmux attach-session -t <会话名>
$ tmux rename-session -t <会话名>
$ tmux choose-session -t <会话名>
$ tmux kill-session -t <会话名>

窗口

在现代的GUI终端(比如 iTerm或者Konsole),一个窗口被视为一个标签。在会话中配置了我们默认的环境之后,我们就能够在一个会话中创建许多我们需要的窗口。窗口就像运行在会话中的应用程序,当我们脱离当前会话的时候,它仍在持续,让我们来看一个例子:

$ tmux new -s my_session

按下CTRL-b c

这将会创建一个新的窗口,然后屏幕的光标移向它。现在你就可以在新窗口下运行你的新应用。你可以修改你当前窗口的名字。在目前的例子里,我运行的top程序,所以top就是该窗口的名字

如果你想要重命名,只需要按下:

CTRL-b

状态条将会改变,这时你将可以重命名当前的窗口

CTRL-b <窗口号>

如果我们给窗口起了名字,我们可以使用下面的命令找到它们:

CTRL-b f

也可以列出所有窗口:

CTRL-b w

按照顺序切换到不同的窗口:

CTRL-b n(到达下一个窗口) CTRL-b p(到达上一个窗口)

想要离开一个窗口,可以输入 exit 或者:

CTRL-b &

关闭窗口之前,你需要确认一下。

多窗口

时候你在编辑器工作的同时,需要查看日志文件。在编辑的同时追踪日志真的很有帮助。Tmux可以让我们把窗口分成许多面板。举个例子,我们可以创建一个控制台监测我们的服务器,同时用编辑器构造复杂的开发环境,这样就能同时进行编译和调试了。

让我们创建另一个Tmux会话,让其以面板的方式工作。首先,如果我们在某个会话中,那就从Tmux会话中脱离出来:

CTRL-b d

开始一个叫做”panes”的新会话:

$ tmux new -s panes
你可以水平或者竖直分割一个窗口,水平分割输入:

CRTL-b "

现在你就拥有两个面板,现在我们竖直分割:

CRTL-b %

又增加了两个

在他们之间移动:

CTRL-b <光标键>

用tar为linux系统备份

实验室里面要在虚拟机里面搭建一个开发环境, 然后又要迁移到公司进行部署, 最坑的部署环境的时候不能联网,所以我就不能使用yum或者apt-get 自动安装软件, 解除依赖

于是我尝试了使用tar来实现, 经过几次的失败, 最终成功了系统备份(拷贝), 异地部署

[TOC]

##安装系统

系统版本

CentOS release 6.5 (Final)

备份命令

以下是备份系统时用的命令, 供参考

1
tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/boot --exclude=/tmp

cvpfz 重要的是p参数, 保存权限, –exclude 是不包含文件夹, boot文件夹最好还是不包含的
备份的时候会报错, 不用管, 主要是文件在读取的时候又发生了改变, 这些文件大多其实是没有必要备份的,只不过一一指出又比较麻烦.

恢复系统

  • 备份新系统的硬盘分区(*重要!!!!!!!!!!)

    cp /etc/fstab /

  • 恢复系统

要求: 系统必须先安装与之前系统同版本的linux系统(理论上只要是linux系统就行(要备份/boot)但我没试过)

1
2
3
su
mv backup.tgz /
tar xvpfz backup.tgz -C /
  • 恢复硬盘分区信息

    1
    cp /fstab /etc/fstab
  • 重启
    sudo shutdown -r now
    如果叫你输入密码, 应该输入原先备份系统的密码

是不是很简单

注意事项:
备份fstab 这个很关键, 不然系统启动的时候 , 挂载不了硬盘, 因为uuid不服, 不过如果是在同一台机器备份与还原, 又没有修改分区,应该没什么问题

更高级的备份需要备份硬盘, 要用到一个工具clonezila
我觉得比较麻烦, 有兴趣的可以自行baidu一发

另外:

事实上tar备份很简单,但有几个地方需要注意一下:
1.尽量使用LiveCD进行备份,以免系统正在运行时有变化;
rawedit2.tar的排除选项后直接就是本目录下的文件名,而不应该是路径名;
3.尽量使用LiveCD进行还原,重启前需要该一下grub.cfg和fstab两个文件里面相关的UUID(根目录、swap分区等)……

@author chenyun

用meld代替默认的diff工具

Meld 是一个可视化的文本差异比较工具,它可以跟多个版本控制系统集成,个人认为它是最好用的。
如何让Meld成为你SVN或GIT的默认diff工具呢? 下面我简单的说一下

##安装Meld
在Ubuntu下,只需一条简单的命令就可以了
sudo apt-get install meld
让SVN使用Meld作为diff工具
编辑 ‘~/.subversion’目录下的config文件,将meld赋值给diff-cmd,如下所示:

1
2
3
4
### Set diff-cmd to the absolute path of your 'diff' program.
### This will override the compile-time default, which is to use
### Subversion's internal diff implementation.
diff-cmd = meld

此后,使用svn diff命令时,将调用meld工具进行比较。

让GIT使用Meld作为diff工具
首先,设定GIT让它使用Meld
git config --global diff.external meld
然后像往常一样比较某个文件
git diff filename
这时,虽然Meld会被调用,但是系统会报错”Wrong number of arguments(Got 7)”。原因是GIT会送7个参数给Meld,但是Meld只需要两个参数,两个需要比较的文件名。所以不能直接用Meld,必需要做一点小修改:
在自己的目录下建立一个git-meld.sh的script
vim ~/git-meld.sh
加入以下内容:

1
2
#!/bin/sh
meld $2 $5

更改文件的权限:
hmod 777 ~/git-meld.sh
然后把external diff改成这个shell script:
git config --global diff.external ~/git-meld.sh

用crontab和xcowsay构建有趣的linux定时通知系统

crontab

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
  • 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

创建用户任务调度的命令是

crontab -e

用户调度任务的格式如下

m h  dom mon dow   command

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

crontab 命令

  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。
我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件

git中文乱码

git 中文显示不正常

1
2
3
4
5
6
7
8
9
10
位于分支 master
初始提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
"\345\217\202\350\200\203\346\226\207\346\241\243/"
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

解决方案
解决方案:

在bash提示符下输入:

1
git config --global core.quotepath false

core.quotepath设为false的话,就不会对0x80以上的字符进行quote。中文显示正常。

常见优化方法

常见的优化方法

— 梯度下降法和牛顿法

原文 http://www.cnblogs.com/maybe2030/p/4751804.html

学习和工作中遇到的大多问题都可以建模成一种最优化模型进行求解,比如我们现在学习的机器学习算法,大部分的机器学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优化,从而训练出最好的模型。常见的最优化方法有梯度下降法、牛顿法和拟牛顿法、共轭梯度法等等.

梯度下降法

梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。 梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。 梯度下降法的搜索迭代示意图如下图所示:
梯度下降法

文档格式之间的转化

文档格式之间的转化

markdown 编写

利用StackEdit编写markdown文档 ,可以实时预览 , 然后点击到处using template 生成HTML文件

html生成pdf

利用wkhtmltopdf从html生成pdf ,功能极其强大 , 相比于linux系统自带的打印到pdf功能,真的差的不是一点点 .

下载

可以从官网下载
http://wkhtmltopdf.org/downloads.html

ubuntu14.04 64位版本用:
http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

其中apt-get install安装的版本比较老旧, 功能不齐全

生成pdf

wkhtmltopdf  --outline 127.0.0.1/t/a.html b.pdf

其中--outline选项是用来生成pdf时带有目录的

更多的选项请查阅man wkhtmlpdf

python如何发生delete请求

python delete

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from urllib import urlencode
from urllib2 import urlopen
from urllib2 import urlopen,Request
url='http://alu:8080/wm/staticflowpusher/json'
data={"switch": "00:01:8c:90:d3:4c:14:01",
"name":"100.2.2.2_100.10.0.2",
"cookie":"0",
"active":"true"}
import json
data=json.dumps(data)
r=Request(url,data)
r.get_method=lambda:'DELETE'
res=urlopen(r)
result=res.read()

关键就是
r.get_method=lambda:”DELETE”

pandas-指南-2

@refer量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇

pandas–快速进阶

上一篇中我们介绍了如何创建并访问pandas的Series和DataFrame类型的数据,本篇将介绍如何对pandas数据进行操作,掌握这些操作之后,基本可以处理大多数的数据了。

创建dataframe的条件很宽松

1
2
df2 = pd.DataFrame({ 'A' : 1., 'B': pd.Timestamp('20150214'), 'C': pd.Series(1.6,index=list(range(4)),dtype='float64'), 'D' : np.array([4] * 4, dtype='int64'), 'E' : 'hello pandas!' })
print df2

scipy-指南

scipy

原文 : https://uqer.io/community/share/54d83bb3f9f06c276f651a6e

NumPy替我们搞定了向量和矩阵的相关操作,基本上算是一个高级的科学计算器。SciPy基于NumPy提供了更为丰富和高级的功能扩展,在统计、优化、插值、数值积分、时频转换等方面提供了大量的可用函数,基本覆盖了基础科学计算相关的问题。

在量化分析中,运用最广泛的是统计和优化的相关技术

1
2
3
import numpy as np
import scipy.stats as stats
import scipy.optimize as opt

统计

### 生成随机数
生成n个随机数可用rv_continuous.rvs(size=n)或rv_discrete.rvs(size=n),其中rv_continuous表示连续型的随机分布,如均匀分布(uniform)、正态分布(norm)、贝塔分布(beta)等;rv_discrete表示离散型的随机分布,如伯努利分布(bernoulli)、几何分布(geom)、泊松分布(poisson)等。我们生成10个[0, 1]区间上的随机数和10个服从参数a=4,b=2的贝塔分布随机数:

1
2
3
4
rv_unif = stats.uniform.rvs(size=10)
print rv_unif
rv_beta = stats.beta.rvs(size=10, a=4, b=2)
print rv_beta

在每个随机分布的生成函数里,都内置了默认的参数,如均匀分布的上下界默认是0和1。可是一旦需要修改这些参数,每次生成随机都要敲这么老长一串有点麻烦,能不能简单点?SciPy里头有一个Freezing的功能,可以提供简便版本的命令。SciPy.stats支持定义出某个具体的分布的对象,我们可以做如下的定义,让beta直接指代具体参数a=4和b=2的贝塔分布。为让结果具有可比性,这里指定了随机数的生成种子,由NumPy提供。

1
2
3
4
5
6
7
8
9
np.random.seed(seed=2015)
rv_beta = stats.beta.rvs(size=10, a=4, b=2)
print "method 1:"
print rv_beta
np.random.seed(seed=2015)
beta = stats.beta(a=4, b=2)
print "method 2:"
print beta.rvs(size=10)