Snake's Home

snake


  • 首頁

  • 歸檔

  • 標籤
Snake's Home

喝酒

發表於 2016-04-12

每次回老家,最怕喝酒和打牌。被拉着灌,我很不爽。

但是老家的风俗如此。每次都是很应付。

清明节前回去搬了个家。

把老头子从山沟沟里接到省城生活。后面顿顿都是酒局,不管在家,还是外面吃。总被拉着喝酒,都逃不掉。

因为思想观念不一样。老头子总觉得我对人不够热情,不会招待客人,太内向,不会劝酒劝菜。

我的原则是,不敬酒敬烟夹菜。茶水不能少。

  1. 你不知道这个人的酒量。强迫人家喝,身体出问题怎么办。如果人家开车来,出事故怎么办。
  2. 你不知道这个人的爱好,禁口。你跟人夹了一碗人家不喜欢的菜,你叫人家怎么办。然后如果人家信教,或者有忌口,你那是对人不尊重。
  3. 卫生问题。
  4. 我一向反感抽烟。抽人家一屋子的烟,你爽了,知道别人怎么想。

思想观念真的是太不一样了。

Snake's Home

健康无价

發表於 2016-04-12 | 分類於 生活

周末的时候,跟几个老家伙小聚了一下。

酒足饭饱之后,就是吹牛逼的时候了。

这里面,兵混得最好,开了自己的公司,比我们这上班族,挣得多得多。

但是美中不足,他身体不好。 太肥胖了。

走几步就走不动了,像个球。

导致他很多业务没法去做。

所以无论啥时候,健康无价。哪怕你挣得再多,那又有什么用,没命花。

坚持锻炼,保持健康的身体和心态。

come on!

Snake's Home

说与做

發表於 2016-04-12 | 分類於 生活

参加了几次技术沙龙。后面越来越不想去了。

主要是没什么干货,没有啥技术含量,也认识不到几个人。

就是打广告,吹水,沽名钓誉。 每次讲一样的Topic.

但是有个事情还是让我比较有感触的。

就是坚持做一件事。如果一直做,总有一些人进来。总能蒙蔽到一些人,然后就达到自己的目的了。

很多事情看起来很难,很没水平,很多人都不去做。

但是一旦坚持了,也许就成气候了。

最近发现自己在技术上出现了瓶颈。

自动化测试,接口测试等,也就那么回事。 那几个开源的框架,基本上花点时间就能上手。没什么竞争优势。
虽然朝着精通的方向发展,那种东西,做多了,也就疲惫了。

然后想出路,看了一些开发的视频,虽然android,ios, nodejs开发的视频看了好多。

但是一直没怎么动手,所以还停留在理论上。 一直停滞不前。

要多多实践了。

记得有次,安吉利拉跟我说,要少说多做。我觉得很有道理。

但是有的时候,也要多说,然后有拿得出手的东西。

Snake's Home

做高端

發表於 2016-04-12 | 分類於 生活

小部门欢迎新来的同事,去了鼎泰丰。

这是我第一个去这种高档的地方,第一次吃这么贵的包子。

而且厨房是透明的,可以看到食物的制作过程。

那种地方吃的人还不少。老外特别的多。

后面看到一个招测试的高端职位。虽然适合我,但是在北京。

跟水水聊到这个事情。

就是什么行业,入门比较容易,做精很难,做到高端也很难。

所以不管做什么,要做到高端,做到精通。不是浅尝辄止。

虽然测试入行的人多。真正做到精通的人凤毛麟角。

行业内对高端人才还是有需求的。

Snake's Home

人脉

發表於 2016-04-12 | 分類於 生活

最近有几个伙计回老家省城了。发现好久都没跟那些家伙联系。
电话号码也找不到了,就在QQ上留言。

过了几天都没有人理我。

以前一直只钻研技术。发现自己慢慢跟很多人疏远。
就算碰到一起,也没有什么话说,没啥共同话题。

在这里这么久,也没啥聊的来的朋友。首先大家都会有戒心。人情也比较淡薄。

那天跟他们几个讨论,其中菜就说了。(菜在一家公司做到了比较高的职位)

“在技术眼里,业务不值钱,啥也不会,就一张嘴吹。”

“在业务眼里,技术不值钱,只会写几行代码,除此之外,啥也不会。”

聊到了情商,聊到了人脉。

我发现自己很失败,最近一直在研究技术,除此之外,什么也没太关心。

不能只能做技术,除了技术,还有很多值得去钻研的。

Snake's Home

chromedriver on mac

發表於 2016-04-12 | 分類於 python

最近在Mac上折腾selenium, 一直都装不上chromedriver.
今天终于找到了一个方法:

automationtest

曾今尝试过用npm安装,但是速度极其慢。(换了淘宝镜像)
chromedriver

最后的步骤是:

1.

1
npm install --save selenium-webdriver@2.44.0

2.

1
npm install --save chromedriver@2.12.0

然后实验了一个小程序,就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from selenium import webdriver

import time

drivers = ['HtmlUnit']

dervers_time = {
'HtmlUnit' : 0,
}
times = 50

def run_with_Chrome():
common_step(webdriver.Chrome())
'''
def run_with_FF():
common_step(webdriver.Firefox())

def run_with_IE():
common_step(webdriver.Ie())

def run_with_PhantomJS():
common_step(webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe'))

def run_with_HtmlUnit():
driver = webdriver.Remote("http://localhost:4444/wd/hub",
desired_capabilities=webdriver.DesiredCapabilities.HTMLUNIT)
common_step(driver)
'''

def common_step(driver):
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('su')
print ele.get_attribute('value')
driver.quit()

for i in range(times):
print '=============Times %s============' % i
for driver in drivers:
start = time.time()
print start
# eval('run_with_%s()'%driver)
end = time.time()
print end
elapse_time = end-start
dervers_time[driver] += elapse_time
print 'elapse for %s:%s' % (driver, elapse_time)

for k,v in dervers_time.items():
print 'avg elapse for %s in %s times:%s' % (k, times, v/times)
Snake's Home

js_array

發表於 2016-03-28 | 分類於 js

创建数组

在实际生产中,创建数组的方式基本有两种。

使用Array构造函数

可以使用Array构造函数来创建数组,如下所示:

arr = new Array();output: []```
1
上面的代码就是创建了一个空的数组[]。可以通过数组的length属性验证。

```console.log(arr.length); //output: 0

如果预先知道要创建的数组的项目数量,可以在构造函数中传递该数量:

arr = new Array(5);output: [undefined × 5]```
1
这个时候,该数量会自动变成数组的length值:

```console.log(arr.length); //output: 5

也可以向构造函数Array直接传入需要创建的数组中应该包含的数组项:

arr = new Array('a', 'b', 'c');output: ["a", "b", "c"]```
1
从上面几个简单的示例,我们可以得知,通过Array构造函数创建数组,我们可以:

创建一个空数组: ```new Array()

创建一定数量的数组:

Array(5)```
1

创建指定数组项目的数组: ```new Array('a','b','c')

需要注意的是,当只给new Array()传递一个值创建数组时,问题会变得比较复杂。如果传递的是一个数值,则会按该数值创建包含给定项数的数组;如果传递的是其它类型的参数时,则会创建包含那个值的只有一项的数组。来看个简单的示例:

1
2
3
4
5
6
7
var arr1 = new Array(3); // 创建一个包含3项的数组
var arr2 = new Array('3'); // 创建一个包含1项的数组,该项的值为字符串"3"

console.log(arr1); //[undefined × 3]
console.log(arr2); // ["3"]
console.log(arr1.length); // 3
console.log(arr2.length); // 1

在实际生产中,使用Array构造函数创建数组时,还可以省略new操作符。如:

1
2
var arr1 = Array('china');  // "china" arr1.length=1
var arr2 = new Array('china'); // "china" arr2.length=1

使用[]创建数组

除了使用Array构造函数创建数组之外,还可以直接使用[](数组字面量表示法)创建数组。采用这种方式创建数组时,数组的每个数组项之间以逗号(,)分隔开,如下所示:

1
2
var arr1 = ['a','b']; //创建一个包含两个字符串的数组
var arr2 = []; //创建一个空数组

数组元素的访问
前面也说过,数组每一项都有对应的索引号,而且其索引号从0开始,到数组的length值结束。在实际生产中,总是需要访问数组的数组项,我们就可以通过数组的索引号来访问数组元素。如:

1
2
3
4
5
var colors = ['blue','red','green']; //创建了一个字符串数组
console.log(colors[0]); // output: "blue"
console.log(colors[1]); // output: "red"
console.log(colors[2]); // output: "green"
colors[0]方括号[]中的索引表示要访问的数组元素。

很多时候我们需要对JavaScript中数据类型(Function、String、Number、Undefined、Boolean和Object)做判断。在JavaScript中提供了typeof操作符可以对这些常用的数据类型做判断。

typeof操作符

typeof可以解决大部分数据类型的检测,如:

1
2
3
4
5
6
7
console.log(typeof function () {return;}); // function
console.log(typeof "a"); // string
console.log(typeof 123); // number
console.log(typeof a); //undefined
console.log(typeof true); // boolean
console.log(typeof NaN); // number
console.log(typeof !NaN); //boolean

push()方法可以在数组的末属添加一个或多个元素

shift()方法把数组中的第一个元素删除

unshift()方法可以在数组的前端添加一个或多个元素

pop()方法把数组中的最后一个元素删除

sort()方法

sort()方法对数组的元素做原地的排序,并返回这个数组。默认情况下,sort()方法是按升序排列数组项。即最小的值位于最前面,最大的值排列在最后面。为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。

push()

使用push()方法可以给数组末尾添加一个或多个数组项。

var arr = [];
arr.push(‘a’,’b’);
console.log(arr); // [‘a’,’b’]

unshift()

使用push()方法可以给数组末尾添加一个或多个数组项,那么使用unshift()方法可以在数组的前面添加一个或多个数组项:

var arr = [‘a’,’b’];
arr.unshift(1,2);
console.log(arr); // [1, 2, “a”, “b”]
除了这两种方法之外,还可以使用splice()方法给数组添加数组项:

var arr = [‘a’,’b’,’c’,1,2];
arr.splice(2,0,’d’,’c’,’e’);
console.log(arr); // [“a”, “b”, “d”, “c”, “e”, “c”, 1, 2]

另外除了splice()方法之外还可以使用concat()方法可以给数组添加数组项,只不过使用这种方法不会改变原数组,会在原数组中创建一个新数组:

var arr = [‘a’,’b’,’c’];
var arr2 = arr.concat(‘d’,1,2,[‘e’,3]);
console.log(arr); // [“a”, “b”, “c”]
console.log(arr2); // [“a”, “b”, “c”, “d”, 1, 2, “e”, 3]
删除数组项

对于数组的操作,除了增加数组项,很多时候还需要对数组进行删除操作。删除数组项常用的方法有pop()和shift()两种方法。

pop()

pop()方法可以从数组的末尾删除一个数组项:

var arr = [‘a’,’b’,’c’,’d’,1,2];
arr.pop();
console.log(arr); // [“a”, “b”, “c”, “d”, 1]

shift()

shift()方法和pop()方法刚好相反,它可以删除数组的第一项:

var arr = [‘a’,’b’,’c’,’d’,1,2];
arr.shift();
console.log(arr); // [“b”, “c”, “d”, 1, 2]
不管是pop()或shift()方法每次只能给数组删除一个数组项,但很多时候这样删除数组项相对来说是比较麻烦的。在数组的操作中,除了这两种方法之外,还可以通过slice()和splice()方法来删除数组项。

slice()

slice()方法可以给一个数组中删除多个数组项,只不过不同的是,slice()不会影响原数组,只是会在原数组基础上创建一个数组副本:

var arr = [1,2,3,4,’a’,’b’];
var arr2 = arr.slice(2);
console.log(arr); // [1, 2, 3, 4, “a”, “b”]
console.log(arr2); // [3, 4, “a”, “b”]
console.log(arr3); // [“a”, “b”]

splice()

splice()方法除了能给数组添加数组项之外,还可以给数组删除数组项:

var arr = [1,2,3,4,’a’,’b’,’c’];
var arr2 = arr.splice(2,2);
console.log(arr); // [1, 2, “a”, “b”, “c”]
console.log(arr2); // [3, 4]
改变数组

数组中splice()方法是数组中一个强大的方法,其除了可以给数组添加数组项、删除数组项之外,还可以改变一个数组:

var arr = [1,2,3,4,5,6];
var arr2 = arr.splice(2,3,’a’,’b’,’c’);
console.log(arr); // [1, 2, “a”, “b”, “c”, 6]
console.log(arr2); // [3, 4, 5]

数组的查询

这里所说的数组查询其实指的是数组的查询提取。其使用的方法是slice()方法:

var arr = [1,2,3,4,5,6];
var arr2 = arr.slice(-3);
console.log(arr); // [1, 2, 3, 4, 5, 6]
console.log(arr2); // [4, 5, 6]

Snake's Home

模拟各种网络环境

發表於 2016-03-27 | 分類於 工具

作者最近要release一个Android版本, 在网络测试时却遇到了难题。
没有各种网络环境。
然后网上有Facebook/atc来模拟各种网络。
然后各种安装让我望而却步。

我知道IOS是用Network Link Conditioner(NLC)来测试,能否在Android也可以尝试一下呢。

结果让人振奋。将过程分享一下,也许能帮到有跟我一样遇到这种问题的。

Mac 下 xcode 自带的 Network Link Conditioner(NLC)

NLC 是 xcode 的插件,可以在 “Hardware IO Tools for Xcode” 中找到。你可以在苹果开发者页面找到这个插件
NLC

查找 “Network Link Conditioner”, 然后选择 “Hardware IO Tools for Xcode” package.
NLC

下载好之后, 打开 DMG 然后双击 “Network Link Condition.prefPane” 来安装.
NLC
装好以后, 你就可以通过 ON 和 OFF 来开启/关闭网络模拟了.
NLC
Network Link Conditioner 可以模拟多种网络环境,以下是该工具目前自带的:

1
2
3
4
5
6
7
EDGE
3G
DSL
WiFi
High Latency DNS
Very Bad Network
100% Loss

每种情况都是通过设置上载、下载的 带宽, 延迟, 和 丢包率 (如果设置为 0, 即不影响你当前的网络环境,本来网络是什么样子就是什么样子).
NLC

你也可以自建配置一个环境,在 【Manage Profiles…】里面自定义

wifi
博主这里用的是安卓测试机,所以就通过 mac 的网络共享来建一个 wifi (度娘:Mac共享无线网络)然后用安卓机连上 mac 建的 wifi 就好了。接下来就可以通过切换各种网络环境来测试应用了。在面板上切换各种网络。

如果是 IOS 的话是可以直接用苹果提供的开发者模式连上该网络(详细见:http://nshipster.com/network-link-conditioner/),
NLC

参照:Network Link Conditioner

Snake's Home

jenkins去掉security

發表於 2016-03-27 | 分類於 工具

最近公司的DLAP更改了服务器,导致不能访问。Jenkins无法登录。

于是用了种暴力的模式,直接将security去掉。
以下为解决办法

• 停止jenkins服务

1
launchctl unload /Library/LaunchAgents/homebrew.mxcl.jenkins.plist

• 修改jenkins的config.xml文件 将以下内容全部删除

1
<useSecurity>true</useSecurity>
 <authorizationStategy class="hudson.sucrity.FullControlOnceLoggedInAuthorizationStrategy">
 ......
 </authorizationStategy>
 <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>false</disableSignup>
 .. 
 </securityRealm>

• 重启jenkins服务

1
launchctl load /Library/LaunchAgents/homebrew.mxcl.jenkins.plist

注:删处上面文件内容后,所做的权限分配也就全部没有了,但是用户还在。

暂时先度过了这次危机。

Snake's Home

python_spider

發表於 2016-03-21 | 分類於 python

此文发表在: 爬了几本书

前面自娱自乐,爬了几本书。
发帖出来,有些改进意见。
用多线程,用类,啥的。

改进前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
__author__ = 'anderson'


#coding=utf-8
import urllib
import re
import os

def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html

def getlink(html,type):
pattern = re.compile('<li> <a href="(.*?)" target="_blank">(.*?)</a>',re.S)
source = re.compile(pattern)
sourcelist = re.findall(source,html)
for item in sourcelist:
print item[0],item[1]
if item[1] != r"在线阅读":
#print item[0]
if type in item[1]:
os.popen("curl -O %s" %(item[0]))

type = """
1.pdf
2.epub
3.mobi"""


print type

html = getHtml("https://testerhome.com/topics/4419")


yourtype = raw_input("please input your type: ")

downtype = ""
if yourtype != '':
if yourtype =='1':
downtype = 'PDF'
elif yourtype =='2':
downtype = 'EPUB'
elif yourtype =='3':
downtype = 'MOBI'
else:
print "please check your choice!"
else:
print "please choose one type!"

getlink(html,downtype)

改进后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
__author__ = 'anderson'


#coding=utf-8
import urllib
import re
import os
import threading,time
from time import sleep, ctime

class get_book():

def __init__(self,nsec, url, types) :
#super(myThread, self).__init__()
self.types = types
self.nsec = nsec
self.url = url

def now(self) :
return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )

def getHtml(self,url):
page = urllib.urlopen(self.url)
html = page.read()
return html

def getlink(self,html,types):
pattern = re.compile('<li> <a href="(.*?)" target="_blank">(.*?)</a>',re.S)
source = re.compile(pattern)
sourcelist = re.findall(source,html)
for item in sourcelist:
print item[0],item[1]
if self.types in item[1]:
os.popen("curl -O %s" %(item[0]))
sleep(self.nsec)


def main():

types = {1:"PDF",2:"EPUB",3:"MOBI"}

print types.items()

html = "https://testerhome.com/topics/4419"

yourtype = raw_input("please input your type: ")

if int(yourtype) not in range (1,3):
print "please select again"
else:
print types[int(yourtype)]

get = get_book(2,html,types[int(yourtype)])
url = get.getHtml(html)

print 'starting at:',get.now()
threadpool=[]

for i in xrange(10):
th = threading.Thread(target= get.getlink,args=(url,types[int(yourtype)]))
threadpool.append(th)

for th in threadpool:
th.start()

for th in threadpool :
threading.Thread.join( th )

print 'all Done at:', get.now()

if __name__ == '__main__':
main()

然后看看效果。

1234…7
Snake

Snake

不要被困难击倒,除非你躺着睡大觉

69 文章
17 分類
57 標籤
© 2017 Snake
由 Hexo 強力驅動
主題 - NexT.Muse