本来是去动物园,太热了,动物也都不怎么能看到,游乐园也不想玩。
就去了军事博物馆。看到那个年代的机器也是很复杂的,感受到人在武器,战争面前,显示那么的渺小和脆弱。
izheyi.com
对于CPU消耗高的代码,可以用下面的方法来进行定位分析。
运行一段Java代码,让它消耗CPU。
用top
查找出高消耗CPU PID
1 | [root@Automation logs]# top |
用top -p <PID>
查找出线程ID - (输入H查看所有线程的统计信息)
1 | [root@Automation logs]# top -p 14538 |
用jstack <PID>
做线程Dump
1 | [root@Automation logs]# jstack 14538 |
转换(十进制 - 十六进制)nid
1 | 14539 --> 38cb |
在Dump中查找相应nid
1 | "main" prio=10 tid=0x00007f6ce8008800 nid=0x38cb runnable [0x00007f6ceec18000] |
基本上一定位一个准。
用JVisualVM连接远程JVM,监控系统运行性能参数。
要在监控的Server上,在tomcat的catalina.sh 中添加如下参数:1
2# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS='-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false'
配置后重启Tomcat,发现在连接不上。 做以下配置
Host Name
1 | [root@Automation bin]# vi /etc/sysconfig/network |
Hosts
1 | [root@Automation bin]# vi /etc/hosts |
最终结果如下,可以查看查看远程CPU、堆、类、线程的使用情况了。
基于种种原因,简单地对Python + Selenium的UI自动化做了一个简单的搭建。一些简单的分层:
python_selenium_page_object_example
做了一个BasicPage类,对Selenium做了简单封装
1 | class BasicPage(object): |
Page Object实现
1 | from utils.page import * |
对Browser进行封装,利用Pytest Fixture实现每个脚本运行前运行
1 | from selenium import webdriver |
脚本层实现
1 | from pages.page_object import * |
Python跟Java不一样,没有专门的方法来实现,在网上看到有人做了个实现,只是在这里做了个简单的实验: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__all__ = ['cacheable', 'callable_find_by', 'property_find_by']
def cacheable_decorator(lookup):
def func(self):
if not hasattr(self, '_elements_cache'):
self._elements_cache = {} # {callable_id: element(s)}
cache = self._elements_cache
key = id(lookup)
if key not in cache:
cache[key] = lookup(self)
return cache[key]
return func
cacheable = cacheable_decorator
_strategy_kwargs = ['id_', 'xpath', 'link_text', 'partial_link_text',
'name', 'tag_name', 'class_name', 'css_selector']
def _callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs):
def func(self):
# context - driver or a certain element
if context:
ctx = context() if callable(context) else context.__get__(self) # or property
else:
ctx = getattr(self, driver_attr)
# 'how' AND 'using' take precedence over keyword arguments
if how and using:
lookup = ctx.find_elements if multiple else ctx.find_element
return lookup(how, using)
if len(kwargs) != 1 or list(kwargs.keys())[0] not in _strategy_kwargs:
raise ValueError(
"If 'how' AND 'using' are not specified, one and only one of the following "
"valid keyword arguments should be provided: %s." % _strategy_kwargs)
key = list(kwargs.keys())[0];
value = kwargs[key]
suffix = key[:-1] if key.endswith('_') else key # find_element(s)_by_xxx
prefix = 'find_elements_by' if multiple else 'find_element_by'
lookup = getattr(ctx, '%s_%s' % (prefix, suffix))
return lookup(value)
return cacheable_decorator(func) if cacheable else func
def callable_find_by(how=None, using=None, multiple=False, cacheable=False, context=None, driver_attr='driver',
**kwargs):
return _callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs)
def property_find_by(how=None, using=None, multiple=False, cacheable=False, context=None, driver_attr='driver',
**kwargs):
return property(_callable_find_by(how, using, multiple, cacheable, context, driver_attr, **kwargs))
Page:1
2
3
4
5
6
7
8
9
10
11
12from utils.page import *
from utils.pageobject_support import callable_find_by as by
class BaiduPage(BasicPage):
search_box = by(id_="kw")
search_button = by(id_='su')
def search(self, keywords):
self.search_box().send_keys(keywords)
self.search_button().click()
二胎,在中国是个永远逃不掉的话题,有的人甚至三胎都提上了日程。
二孩政策都放开了,你不生就是自私;重男轻女的思想,没有男孩就是无后;一个孩子太单了,给她有个伴;当你老了,多个孩子好养老;你看周围的朋友都生了,你也应该生……太多的所谓正确的理由和建议充斥在耳旁,但生与不生,只有你知道自己内心最真实的想法。
想生二胎,首先想到的就是经济基础,网上有太多计算,生二胎要花多少多少钱,特别是在大城市,感觉一般工薪族是生不起的。时代不同了,养孩子远不止吃饱穿好,就说一点,教育,记得奇葩说里说过不要假装现代社会金钱不重要,不要误导年轻人,没有钱也能很好养育孩子。
孩子好生不好养,最主要的还是时间和精力。你有没有内心强大到再来一轮?有没有人给你带孩子?你能不能给她足够多的陪伴?你能不能平衡好大宝和二宝的关系?
最近跟闺女聊了很多,发现她并不是大人眼中想的那么独立,在新环境中她也有委屈,有愤怒,有失落,在面对她的种种问题的时候,我却束手无策,心理难免还是会有一些不好受。浮躁的社会,跟风攀比的家长,眼花缭乱的培训班,让孩子无所适从。在教育孩子上面还有很长的路要走,实在是没有准备好再有一个孩子,应该怎样让她们都能在这个浮躁的社会里成为幸福的人。
生与不生都是自己的问题,每个家庭的情况不同,选择自然也不同。生育是一种能力,不是一种义务,除了爱孩子,没有任何一个理由生二胎。
实现Jenkins + Terraform在AWS上创建基本环境。
创建main.tf
,并push到Github上。1
2
3
4
5
6
7
8
9
10
11provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "yongfeiuall" {
ami = "ami-1853ac65"
instance_type = "t2.micro"
tags{
Name = "integration with jenkins"
}
}
创建Pipeline Job:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24node {
stage('Preparation') { // for display purposes
// Get some code from a GitHub repository
git credentialsId: 'ee7a726b-e672-424d-9b78-e8015668d55a', url: 'git@github.com:yongfeiuall/pipeline-terraform-example.git'
}
stage('variable file') {
sh 'sudo cp ~/variables.tf ~/.jenkins/workspace/ci-terraform'
}
stage('init'){
sh "terraform --version"
sh "terraform init"
}
stage('plan'){
sh "terraform plan"
}
stage('apply'){
sh "terraform apply -auto-approve"
}
}
说明:
stage('variable file)
,提前放到Server上去terraform apply
加上-auto-approve
利用Salt,从Artifactory上Get Build,并部署。
创建Salt State
1 | [root@Automation ~]# cd /srv/salt/ |
执行Command
1 | [root@Automation salt]# salt '*' state.highstate |
去Minion检查
1 | [root@Automation opt]# ls |
用Command运行
1 | [root@Automation salt]# salt '*' cmd.run 'cd /opt; java -jar artifact_project.jar' |
检查成功
1 | [root@Automation opt]# curl http://192.168.220.131:8080/ |
用Shell:1
2
3sshpass -p yongfei.hu ssh -o "StrictHostKeyChecking no" root@192.168.220.130 "salt '*' state.highstate"
sshpass -p yongfei.hu ssh -o "StrictHostKeyChecking no" root@192.168.220.130 "salt '*' cmd.run 'cd /opt; java -jar artifact_project.jar'"