2016年读书计划

2016年读书计划

读书

正在读的书

	6.PaaS实现与运维管理:基于Mesos +Docker+ELK的实战指南
	7.Python 学习手册第四版
	8.互联网生态:重构商业规则
	9.黑客
	12.我的互联网方法论
	14.编写高质量代码

已读的书

	1.拆掉思维里的墙
	2.高性能linux服务器构建实战
	3.MacTalk 人生元编程
		http://item.jd.com/11398297.html
	4.SaltStack技术入门与实战
		http://item.jd.com/11804150.html(好友沈灿的书)
	5.自动化运维软件设计实战
		http://item.jd.com/11734638.html
	6.皮囊
	7.奔跑吧Ansible
		http://item.jd.com/11839215.html
	8.活着
	9.ELK Stack权威指南
		http://item.jd.com/10038199385.html(好友三斗的书)
	10.海量运维运营规划
		http://item.jd.com/11366105.html(重读)
	11.vim使用技巧
	12.黑客与画家
	13.重新定义公司:谷歌是如何运营的
	14.技术管理之巅
	15.精进 采铜
	16.Ansible自动化运维:技术与最佳实践
		http://item.jd.com/11917729.html(好友沈灿的书)
	17.跟任何人都聊得来:最受世界500强企业欢迎的沟通课
	18.为什么精英都是清单控
	19.梦在青春在
	20.周鸿祎自述:我的互联网方法论
	21.毅力: 如何培养自律的习惯
	22.凤凰项目:一个IT运维的传奇故事
	23.DevOps实践:驭DevOps之力强化技术栈并优化IT运行
读书 

Mac技巧:为终端设置Shadowsocks代理

Mac技巧:为终端设置Shadowsocks代理

准备工作 1.首先要有ShadowSocks 2.要有翻墙账号 3.安装配置自行Google install brew install polipo config # 设置每次登陆启动polipo ln -sfv /usr/local/opt/polipo/*.plist ~/Library/LaunchAgents # 修改配置文件"homebrew.mxcl.polipo.plist" ~/Documents ⮀ cat /usr/local/opt/polipo/homebrew.mxcl.polipo.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>homebrew.mxcl.polipo</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>ProgramArguments</key> <array> <string>/usr/local/opt/polipo/bin/polipo</string> <string>socksParentProxy=127.0.0.1:1080</string> #### 需要添加的文件 </array> <!-- Set `ulimit -n 65536`. The default macOS limit is 256, that's not enough for Polipo (displays 'too many files open' errors). It seems like you have no reason to lower this limit (and unlikely will want to raise it). [Read More]
Mac 

转载:职场菜鸟的内心独白

转载:职场菜鸟的内心独白

职场菜鸟的内心独白

zhichang

	虽然这已经是小编工作的第二年,但单纯的小编依然是职场菜鸟、社会小白,这一年多,经历了入职-离职-再入职,事业单位-私企的转变适应过程,最近心情起伏不定,甚至感觉体内的“抑郁细胞”再次苏醒,不吐不快。
	
	    有没有一种人,就是适应不了这个社会?有没有一个社会,能接受适应不了它的人?
	
	其实小编并不是从小就那么爱思考,小编也曾经无忧无虑、大大咧咧的过日子,吃饱了就学、学累了就睡,爸爸妈妈爷爷奶奶从来没要求小编有什么大的成就,中学毕业打个工养活自己就行了,没想到小编竟然这么“争气”,一路大学读下来还一不小心第一名的成绩考上研究生,继续深钻“心理学”,从此再没有了没心没肺的小编。
	
	当然不是说心理学能把人改头换面(虽然对小编确实是这样),经历倒真的让小编变了。但小编也从来没想过自己会变成这样抑郁的一个,今天刚看到一本书上,把小编这种情况叫做“内射性抑郁”和“情感依附性抑郁”(OS:×,什么鬼?!)。
	
	内射性抑郁:将愤怒转向自我以回避想杀死他人的罪疚感。不明白?通俗来讲就是:被Boss骂了,潜意识想杀了他,但是你强大的高尚的道德感和超我不允许你这么想,进而你将这种愤怒转向了自己,觉得都是自己的错,老板骂得对(好贱,可是好准😢),然后你就抑郁了。
	
	情感依附性抑郁:由丧失导致的抑郁。对,是丧失,不是丧尸。你最依恋的人去世了,但你没有机会正常的完成哀悼(比如去世时不在身边,未能参加他/她的追悼会等),那么你就可能会大量收集并极其依恋与死者相关的事情(纪念品、物品、记忆等),把自己的家变成了一座永久的“陵墓”,你就做了一辈子的“守陵人”。可怕吗?可怕,所以就抑郁了。
	
	今天小编不说情感依附性抑郁,既然说职场,那就聊内射性抑郁。小编内射了,哦,不,抑郁了。
	
	第一份工作在学校。“哇,学校福利多好啊,最吸引人的就是寒暑假,多好啊,谁这么傻×,要辞掉这个工作”。是的,小编就是这个傻×,熬了一年,不干了,为啥,抑郁了。小编受不了官官相护,受不了“当官不为民做主”,受不了教师地位低下的落差,从没想过一份工作给小编带来多大的金钱利益(到目前仍是这样想法),但小编无法适应,无法“随波逐流”。有人跟我说“你活的太阳春白雪了”,太对了!小编就是阳春白雪啊,小编看到那么恶的人性,不应该继续坚持“情怀”这个东西吗?!

zhichang

	小编第二份工作,也是现在在做的事情,不能说是小编最喜欢的,但专业相关,小编擅长,还算做的舒服。私企当然不像事业单位,每天打酱油似的舒服过日子,所有精力都花在了“打官腔”、人情往来。私企要求做好事情,做好你的本职工作外,老板一声令下,马上达到200%的完成度。KAO!各种抱怨就不再传播了,已经看到太多,但是小编却发现了这“内射性抑郁”找上门来,老板,哪天小编跳楼了,不会找你的。
	
	偏偏别人不把你当菜鸟,哦,是思想上没把你当菜鸟,希望你做出的成绩是混迹沙场几十年的结果,如果人人都献出一点爱/(ㄒoㄒ)/~~
	
	虽说这是每个新人都经历的事情,但是万一这个新人过不去怎么办,万一这个新人是抑郁型特质的人怎么办,万一这个新人就是适应不了社会怎么办。“自作自受”,几乎大多人都会对他这么说,但是他真的很努力啊,对这个社会,他充满情怀啊,充满热爱啊,但这个社会,到处是不小心的敌意啊。
	
	什么时候,这个社会尊重每一个人,尊重每一个人的特殊,尊重每一个人的发展,尊重他就是他,不是任何人?
	
	有没有一个社会,能接受适应不了它的人?
	
	有没有一个人,告诉你:如果很辛苦,就不用去适应社会。

zhichang

职场 

python基础学习06

python基础语法学习-理解python装饰器

概念

装饰器(Decorator)的基本定义:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”。

装饰器的定义是:装饰器实质上是一个函数。它把一个函数作为输入并且返回另外一个函数。其实其是闭包概念的深化

优点

抽离出大量函数中与函数功能本身无关的雷同代码并继续重用

可以将函数“修饰”为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限和身份验证从业务中独立出来

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

装饰器入门

In [43]: def foo():
    ...:     print('in foo()')
    ...: foo()
    ...:
in foo()

In [44]:
In [44]: import time

In [45]: def foo():
    ...:     start = time.clock()
    ...:     print('in foo()')
    ...:     end = time.clock()
    ...:     print('used:', end - start)
    ...: foo()
    ...:
in foo()
used: 2.1999999997746045e-05

In [46]:
[Read More]

python基础学习04

python基础语法学习-元组与切片

元组

元组是一个不可变结构 是不允许修改的,只查询
In [164]: t = tuple()

In [165]: t
Out[165]: ()

In [166]: t = (1,2,3)

In [167]:

In [171]: t.count(1)
Out[171]: 1

In [175]: t = (1)

In [176]: t
Out[176]: 1

In [177]: t = (1,)

In [178]: t
Out[178]: (1,)

In [179]:

列表和元组的区别

list是[]号
元组是()号
list可以修改
元组不可以修改
[Read More]

python基础学习05

python基础语法学习-字符串

1.什么是字符串

	什么是字符串?
		python3里面是unicode序列
		在python2里面是byte序列
		字符串也是不可变的
		支持切片 也支持索引 支持解包操作
		支持遍历
	用在哪些特定的环境
	为什么是内置数据结构
	In [26]: s = 'geek'

In [27]: s
Out[27]: 'geek'

In [28]: s[0]
Out[28]: 'g'

可以反转:
In [30]: s[::-1]
Out[30]: 'keeg'

In [31]:
支持解包
In [36]: a = 'geek'

In [37]: g,*s = a

In [38]: g
Out[38]: 'g'

In [39]: s
Out[39]: ['e', 'e', 'k']

In [40]:

2.字符串的连接

**join使用方法:**
In [45]: list = ['my','name','is ','steven']

In [46]: list
Out[46]: ['my', 'name', 'is ', 'steven']

In [47]: ' '.join(list)
Out[47]: 'my name is  steven'

In [48]: ','.join(list)
Out[48]: 'my,name,is ,steven'

In [49]:

###字符串的分割
**split**  从左边开始分割
**rsplit**  从右边开始分割
**splitlines**
**partition**
**rpartotion**

**split练习使用**
In [119]: a = "my name is steven"

In [120]: a
Out[120]: 'my name is steven'

In [121]: a.split()
Out[121]: ['my', 'name', 'is', 'steven']

In [122]: a.split('is')
Out[122]: ['my name ', ' steven']

In [123]: a.split(' ', 1)
Out[123]: ['my', 'name is steven']

In [124]: a.split(' ', 2)
Out[124]: ['my', 'name', 'is steven']

In [125]: a.split(' ', 3)
Out[125]: ['my', 'name', 'is', 'steven']

In [126]: a.split(' ', 4)
Out[126]: ['my', 'name', 'is', 'steven']

In [127]: a.split(' ', -1)
Out[127]: ['my', 'name', 'is', 'steven']

案例:

In [131]: line = 'usr:http://opsnotes.net'

In [132]: line.split()
Out[132]: ['usr:http://opsnotes.net']

In [133]: line.split(':', 1)
Out[133]: ['usr', 'http://opsnotes.net']
In [135]: key, value = line.split(':', 1)

In [136]: key
Out[136]: 'usr'

In [137]: value
Out[137]: 'http://opsnotes.net'

In [138]:

**splitlines的使用方法:**
In [138]: text = '''i an geek
   .....: i an a boy'''

In [139]: text
Out[139]: 'i an geek\ni an a boy'

In [140]: text.splitlines()
Out[140]: ['i an geek', 'i an a boy']

In [141]:

**partition的使用方法:**
In [141]: a
Out[141]: 'my name is steven'

In [142]: a.partition(' ')
Out[142]: ('my', ' ', 'name is steven')

In [143]: a.split(' ', 1)
Out[143]: ['my', 'name is steven']

In [144]: line.partition(':')
Out[144]: ('usr', ':', 'http://opsnotes.net')

In [145]: key, _, value = line.partition(':')

In [146]: key
Out[146]: 'usr'

In [147]: _
Out[147]: 'usr'

In [148]: value
Out[148]: 'http://opsnotes.net'

In [149]:
[Read More]

python基础学习03

python基础语法学习-list使用

1.list增加的使用方法

1.append使用方法
	原地修改list,给list增加一个元素,append的方法的返回值是None
list.append(12)

In [4]: list.append(12)

In [5]: list
Out[5]: [1, 2, 3, 4, 5, 12]
In [8]: help(list.append)

2.insert的使用方法,根据索引位置添加.
	insert操作的索引超出范围,如果是正索引,等效于append,如果是负索引.等效于insert(0, object)
In [10]: list
Out[10]: [1, 2, 3, 4, 5, 12]

In [11]: list.insert(0,7)

In [12]: list
Out[12]: [7, 1, 2, 3, 4, 5, 12]

In [13]: list.insert(3,0)

In [14]: list
Out[14]: [7, 1, 2, 0, 3, 4, 5, 12]

In [15]:
超出列表不存在的话
In [16]: list.insert(12,3)

In [17]: list
Out[17]: [7, 1, 2, 0, 3, 4, 5, 12, 3]

In [18]: list.insert(13,13)

In [19]:

3.extend的使用方法
	把一个list扩展到我们的list后边
In [20]: list.extend([1,2,3])

In [21]: list
Out[21]: [7, 1, 2, 0, 3, 4, 5, 12, 3, 13, 1, 2, 3]

In [22]:
In [23]: help(list.extend)####学会使用
Help on built-in function extend:

extend(...) method of builtins.list instance
    L.extend(iterable) -> None -- extend list by appending elements from the iterable
(END)
[Read More]

python基础学习01

python基础语法学习运算符

python算数运算符
 ~/code ⮀ cat yunsuanfu1.py
#!/usr/bin/env python
# -*- encoding: UTF-8 -*-

'''
    python算数运算符
'''

a = 21
b = 10
c = 0

c = a + b
print "1 - c的值为: ", c

c = a - b
print "2 - c的值为: ", c

c = a * b
print "3 - c的值为: ", c

c = a / b
print "4 - c的值为: ", c

c = a % b
print "5 - c的值为: ", c


'''
修改变量: a,b,c
'''

a = 2
b = 3
c = a ** b
print "6 - c的值为: ", c

a = 10
b = 5
c = a // b
print "7 - c的值为: ", c
 ~/code ⮀
[Read More]

python基础学习02

python基础语法学习

**Python range用法**
range([start ,] stop [, step])


上面方括号内的参数表示是可选的,但所有参数必须是整数。如果参数step被省略的话,它的默认值是1;如果参数start被省略的话,它的默认值将是0。但是无论如何,参数stop是不允许省略的,所以range()函数只有一个参数时,它表示range(stop);当range()函数带有两个参数时,它表示range(start,stop)。

我们知道range()返回的是一个列表,列表中的整数值为[start, start + step, start + 2 * step, start + 3 * step,...]。如果参数step为正值,那么列表中最后一个元素为小于参数stop的那个最大的整数 start + i * step ;如果参数step为负值,那么列表中最后一个元素为大于参数stop的那个最小的整数 start + i * step 。但是任何时候参数step的值都不能为零。只要将上面的列举的range()示例跟这里的一般性介绍相结合,我们就能更好的理解该内建函数的用法。

需要注意,当参数step为正值时,参数start必须小于参数step;当参数step为负值时,参数start必须大于参数step,否则range()函数将返回一个空表

习题练习1:写一个猜数字游戏,预先设定一个数字,游戏玩家输入一个数字,如果与预设的数字相等,玩家获胜,如果不等,提示玩家太大还是太小,玩家有三次猜数字的机会。
!/usr/bin/env python
# -*- coding: utf-8 -*-

result =  4
count = 3

while not count == 0:
    guess = int(raw_input('Please enter Guess Number: '))
    if  guess == result:
        print u'猜对了,游戏结束'
        break

    elif guess > result:
        print u'数字偏大,再猜一次'
        count -= 1

    else:
        print u'数字偏小,再猜一次'
        #continue
        count -= 1

else:
    print u'只能猜三次游戏结束!!'
[Read More]

Python多版本管理软件pyenv

Python多版本管理软件pyenv

Pyenv是什么

git地址:https://github.com/yyuu/pyenv
1.pyenv是python版本多功能切换工具,对系统无任何依赖关系和损坏.
2.能支持多个python版本
3.可以在多个python不同版本之间切换

安装部署

环境:
Centos7.0  阿里云
安装:
1.curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
2.修改配置/etc/profile文件,添加如下文件
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
3. source /etc/profile
更新pyenv版本:
pyenv update
删除pyenv:
只需要删掉目录就可以(注意是隐藏文件)
rm -fr ~/.pyenv

使用pyenv在CentOS7.1上安装python3.5.2

1.先解决依赖关系
yum -y install gcc patch make gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel readline-devel
2.下载python3.5.2压缩包
wget http://7d9qvq.com1.z0.glb.clouddn.com/Python-3.5.2.tgz
3.把下载的文件重命名移动到如下目录
[root@zm-test-ops-01 ~]# mkdir /root/.pyenv/cache
[root@zm-test-ops-01 ~]# mv Python-3.5.2.tar.gz /root/.pyenv/cache/
[Read More]

ansible源码安装zabbix agent

名词解释
	[root@iZ23nvakegvZ zabbix_agent]# ls  
	files  需要安装包  
	handlers  重启相关信息  
	meta  galaxy_info相关信息  
	tasks  安装部署的任务  
	templates  相关的模板配置文件 
	vars   变量配置文件  
	[root@iZ23nvakegvZ zabbix_agent]#
目录结构
	[root@iZ23nvakegvZ zabbix_agent]# tree
	
	.
	
	├── hosts
	├── roles
	│   └── zabbix_agent
	│       ├── files
	│       │   └── zabbix-2.4.5.tar.gz
	│       ├── handlers
	│       ├── meta
	│       │   └── main.yml
	│       ├── tasks
	│       │   ├── copy.yml
	│       │   ├── delete.yml
	│       │   ├── install.yml
	│       │   └── main.yml
	│       ├── templates
	│       │   ├── zabbix_agentd
	│       │   └── zabbix_agentd.conf
	│       └── vars
	│           └── main.yml
	└── site.yml
	
	8 directories, 11 files
	
	[root@iZ23nvakegvZ zabbix_agent]#
[Read More]

java中for循环的优化

java中for循环的优化

作为java中三大循环之一的for循环,大家应该用的特别多,今天那就以我在项目中遇到的for循环优化来聊一聊for循环的优化.

首先是for循环的写法上面

最原始的写法

public void optimalizeFor() {
   List list = new ArrayList<>();
   for (int i = 0; i < list.size(); i++) { 
      }        
}
调优写法
public void optimalizeFor() {
   List list = new ArrayList<>();
     for (int i = 0, len = list.size(); i < len; i++) {
       }
      }
结果
优化前用时:47871
优化后用时:566
#为什么
在循环中,循环条件会被反复计算,如果不使用复杂表达式,而是使循环条件不变的话,程序将会运行的更快,所以在循环中应该避免使用复杂的表达式
java之循环嵌套
外小内大型
                for (int i = 0; i < 10; i++) {
                    for (int j = 0; j < 100000; j++) {
                    }
                }
外大内小型
                for (int i = 0; i < 100000; i++) {
                    for (int j = 0; j < 10; j++) {
                    }
                }
结果
                优化前用时:7541608
                优化后用时:4316
为什么
        从结果可以看出来所用时间的差异非常大,这个就像拿大文件和小文件一样的道理
循环嵌套提取不需要循环的逻辑
无用逻辑再循环中
                int a = 10, b = 11;
                for (int i = 0; i < 10; i++) {
                    i = i * a * b;
                }
无用逻辑再循环外
                int c = a * b;
                for (int i = 0; i < 10; i++) {
                    i = i * c;
                }
结果
                优化前用时:48664
                优化后用时:651
为什么
        还是像之前说到的,避免在循环中重复的计算发生
异常处理
异常在循环中
                for (int i = 0; i < 10; i++) {
                    try {

                    } catch (Exception e) {

                    }
                }
异常在循环外
                try {
                    for (int i = 0; i < 10; i++) {
                    }
                } catch (Exception e) {

                }
结果
                优化前用时:33916
                优化后用时:489
为什么
        每次抓捕异常时非常耗时的,应该放在循环外一次性抓取,而不是应该放在循环内去每循环一次都抓取一次异常
java