ziggle

Hail Hydra


  • Home

  • Archives

  • Search

set

Posted on 2018-03-14
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
import java.util.*;

public static void main(String[] args) {
Set<Integer> result = new HashSet<Integer>();
Set<Integer> set1 = new HashSet<Integer>(){{
add(1);
add(3);
add(5);
}};

Set<Integer> set2 = new HashSet<Integer>(){{
add(1);
add(2);
add(3);
}};

result.clear();
result.addAll(set1);
result.retainAll(set2);
System.out.println("交集:"+result);

result.clear();
result.addAll(set1);
result.removeAll(set2);
System.out.println("差集:"+result);

result.clear();
result.addAll(set1);
result.addAll(set2);
System.out.println("并集:"+result);

javascript

Posted on 2018-02-26

js 中switch 语句 区分类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function chooseUseRegion() {
$('#EffectiveType').change(function() {
$('.showdiv').hide();
switch ($(this).val()) {
case '1':
$('#use_time_2').show();
return;
case '2':
$('#use_time_1').show();
return;
case '0':
return;
default:
return;
};
});
}

前端路由实现之 #hash

前端路由实现方式 1 使用 h5 提供historyapi
2 使用hash 路由

跨域配置

简单请求

带cookie跨域 origin 不能为 *

ajax带cookie 请求

隐藏跨域
页面中api地址 /a?b=1&c=2

js map/reduce/filter/sort

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
// map
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);
// reduce
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x + y;
}); // 25

// filter
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

//sort

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
});
console.log(arr); // [1, 2, 10, 20]

html页面注入js

1
2
3
4
5
6
7
8
9
10
(function(d,s,id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)){ return; }
js = d.createElement(s); js.id = id;
js.onload = function(){
console.log(11111)
};
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
})(document,'script','facebook-jssdk')

Read more »

jvm

Posted on 2018-02-24

JVM小工具

在${JAVA_HOME}/bin/目录下Sun/Oracle给我们提供了一些处理应用程序性能问题、定位故障的工具, 包含

bin 描述 功能
jps 打印Hotspot VM进程 VMID、JVM参数、main()函数参数、主类名/Jar路径
jstat 查看Hotspot VM 运行时信息 类加载、内存、GC[可分代查看]、JIT编译
jinfo 查看和修改虚拟机各项配置 -flag name=value
jmap heapdump: 生成VM堆转储快照、查询finalize执行队列、Java堆和永久代详细信息 jmap -dump:live,ormat=b,file=heap.bin [VMID]
jstack 查看VM当前时刻的线程快照: 当前VM内每一条线程正在执行的方法堆栈集合 Thread.getAllStackTraces()提供了类似的功能
javap 查看经javac之后产生的JVM字节码代码 自动解析.class文件, 避免了去理解class文件格式以及手动解析 class文件内容
jcmd 一个多功能工具, 可以用来导出堆, 查看Java进程、导出线程信息、 执行GC、查看性能相关数据等 几乎集合了jps、jstat、jinfo、jmap、jstack所有功能
jconsole 基于JMX的可视化监视、管理工具 可以查看内存、线程、类、CPU信息, 以及对JMX MBean进行管理
jvisualvm JDK中最强大运行监视和故障处理工具 可以监控内存泄露、跟踪垃圾回收、执行时内存分析、CPU分析、线程分析…

VM常用参数整理

参数 描述
-Xms 最小堆大小
-Xmx 最大堆大小
-Xmn 新生代大小
-XX:PermSize 永久代大小
-XX:MaxPermSize 永久代最大大小
-XX:+PrintGC 输出GC日志
-verbose:gc -
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC时间戳(以基准时间的形式)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:/path/gc.log 日志文件的输出路径
-XX:+PrintGCApplicationStoppedTime 打印由GC产生的停顿时间

对内存分区情况截图

  • 生产故障JVM 进程cpu 占用率一直100%
    解决办法
    (
    首先找出问题进程内CPU占用率高的线程
    再通过线程栈信息找出该线程当时在运行的问题代码段
    )
    jvm负载一直居高不下,先使用了 top -c 查看当前进程详情
    使用

遍历树时递归结构栈溢出

jvm 参数要修改 -Xss
classpath : String path = this.getClass().getResource(“”).getPath();

Class.forName(xxx.xx.xxx) 返回一个类
作用时要求jvm查找并加载指定的类,也就是说JVM会执行该类的静态代码段。

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
# 查看运行的进程
jconsole


# 查看java堆配置
# jmap -heap <pid>

> jmap -heap 79376
Attaching to process ID 79376, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2105540608 (2008.0MB)
NewSize = 44040192 (42.0MB)
MaxNewSize = 701497344 (669.0MB)
OldSize = 88080384 (84.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 408420352 (389.5MB)
used = 57457288 (54.79553985595703MB)
free = 350963064 (334.70446014404297MB)
14.068174545816953% used
From Space:
capacity = 17301504 (16.5MB)
used = 0 (0.0MB)
free = 17301504 (16.5MB)
0.0% used
To Space:
capacity = 18350080 (17.5MB)
used = 0 (0.0MB)
free = 18350080 (17.5MB)
0.0% used
PS Old Generation
capacity = 116391936 (111.0MB)
used = 40436112 (38.56288146972656MB)
free = 75955824 (72.43711853027344MB)
34.741334657411315% used

33782 interned Strings occupying 3796288 bytes.


# java dump jvm堆内存使用情况 记录内存信息
> jmap -dump:format=b,file=dump.bin 79376
Dumping heap to E:\Doc\GitRepo\hydra\dump.bin ...
Heap dump file created


#如果我们只需要将dump中存活的对象导出,那么可以使用:live参数

>jmap -dump:live,format=b,file=heapLive.hprof 2576


# thread dump
jstack 79376 > thread.txt

heap dump
heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
thread dump
thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。

两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

可视化查看 jvm 内存dump

jhat -port 5000 dump.bin

Read more »

bash

Posted on 2018-02-07

bash 脚本 end of line sequence

在windows 中 要把bash脚本换行格式调账为 CRLF -> LF

bash 变量类别

  • 局部变量
    • 只在当前shell实例中有效,其他shell启动不能访问局部变量
  • 环境变量
    • 所有的程序包括shell启动的程序都可以访问环境变量,shell也可以定义环境变量
  • shell变量

单引号的限制

  • 单引号的任何字符都会原样输出,单引号总的变量都是无效的
  • 单引号中不能出现单引号,即使使用转义符

双引号的优点

  • 双引号中可以有变量
  • 双引号中可以出现转移字符

拼接字符串

1
2
3
4
5
6
7
name="ziggle"
greeting="hello ,"$name" ! "
greetin="hello , ${name} ! "

# 提取字符串长度
string="abcd"
echo ${#string} #输出 4

bash 只支持一维数组

  • 声明

    1
    2
    3
    4
    5
    arr_name=(value0 value1 value2) # 或者 
    arr_name=(
    value1
    value2
    )
  • 读取数组
    ${数组名[下标]}
    value=${arr_name[n]}

1
2
3
#!/bin/bash
my_arr=(A B C "D")
echo "first ele ${my_arr[0]}"

传递参数

在执行脚本时,向脚本传递参数,脚本内获取参数的格式为:$n

n 代表一个数字, 1 为执行脚本时传递的第一个参数 …

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个但字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set 命令功能相同
$? 显示最后命令的退出状态,0表示没错,其他值有错
$USER 运行脚本用户的用户名
$HOSTNAME hostname
$SECONDS 脚本运行since开始 的时间长
$LINENO 当前脚本行号

bash中数学运算

使用 awk ,expr
expr是表达式计算工具

1
2
3
#!/bin/bash
val=`expr 2 + 2`
echo " value : $val "

bash 使用let进行简单算术运算

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
let a=5+4
echo $a #9

let "a = 5 + 4"
echo $a #9

let a++
echo $a #10

let "a = 4 * 5"
echo $a # 20

使用双括号计算

1
2
3
#!/bin/bash
a=$(( 4 + 5 ))
echo $a #9

Read more »

jquery

Posted on 2018-02-07
  • 对img标签值修改
1
2
3
$('#imageId')[0].src;

$('#imageId').attr('src',path)
  • 前端路由
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var regexps = [
/[\-{}\[\]+?.,\\\^$|#\s]/g,
/\((.*?)\)/g,
/(\(\?)?:\w+/g,
/\*\w+/g,
]

function extractRoute (route) {
var matchs = []
route = route.replace(regexps[0], '\\$&')
.replace(regexps[1], '(?:$1)?')
.replace(regexps[2], function (match, optional) {
if (match) matchs.push(match.replace(':', ''))
return optional ? match : '([^/?]+)'
}).replace(regexps[3], function (match, optional) {
if (match) matchs.push(match.replace('*', ''))
return '([^?]*?)'
})
return {
regexp: new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'),
matchs: matchs
}
}

function extractParams (route, path) {
var params = route.exec(path).slice(1)
var results = []
for (var i = 0; i < params.length; i++) {
results.push(decodeURIComponent(params[i]) || null)
}
return results
}

// borwser
function extractQuery() {
var url = location.search
var pattern = /(\w+)=([^\?|^\&]+)/ig
var query = {}
url.replace(pattern, function(a, b, c) {
query[b] = c;
})
return query;
}

async function exec() {
var match = false
for (var i = 0; i < data.routes.length; i++) {
var route = extractRoute(data.routes[i].path);
if (!route.regexp.test(data.req.path)) {
continue
}
match = true
var results = extractParams(route.regexp, data.req.path)
data.req.params = data.req.params || {}
for (var j = 0; j < route.matchs.length; j++) {
data.req.params[route.matchs[j]] = results[j]
}
await data.routes[i].fn.call(data, data.req, data.res, data.next)
}
if (!match && typeof data.next === 'function') await data.next()
}

// borwser
function emit() {
if (data.req.url === location.href) return
data.req.url = location.href
data.req.path = location.pathname
data.req.query = extractQuery()
exec()
}

var data = {routes: [], resMethods: {}}
async function Router(req, res, next) {
if (typeof document === 'object') { // browser
data.env = 'browser'
data.req = {query: {}}
data.res = {}
window.addEventListener('popstate', emit, false)
}else if (next) { // express
data.req = req
data.req.url = data.req.originalUrl
data.res = res
data.next = next
data.env = 'express'
} else { // koa
data.ctx = req
data.req = data.ctx.request
// 替换掉问号后面的参数
data.req.path = data.req.url.replace(/\?.*/g, '')
data.res = data.ctx.response
data.next = res
data.env = 'koa'
}
for (var m in data.resMethods) {
data.res[m] = data.resMethods[m].bind(data)
}
data.env === 'browser' ? emit() : await exec()
}

Router.get = function(path, fn) {
data.routes.push({ path: path, fn: fn })
}

Router.addResMethod = function(name, fn) {
data.resMethods[name] = fn
}

<!-- more -->

/**
* browser
* 需要注意的是调用history.pushState()或history.replaceState()不会触发popstate事件,
* 只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用history.back())
*/
Router.go = function(path, isReplace) {
if (isReplace) {
history.replaceState({ path: path }, null, path);
} else {
history.pushState({ path: path }, null, path);
}
emit()
}

// browser
Router.back = function() {
history.back()
}

// browser, 代理链接功能
Router.proxyLinks = function(nodes) {
for (var i = 0; i < nodes.length; i++) {
nodes[i].addEventListener('click', function(e) {
Router.go(e.target.href)
e.preventDefault()
})
}
}

module.exports = Router
  • model->view
1
art-template

在使用jquery 对select 元素注册事件

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
var select  =  document.getElementById('use_time');

// 可以对 这个select元素进行
select.change(function(){
console.log(111);
var index = select.selectedIndex;
if (index > 0) {
console.log(option[index].vlaue);
}
})


----
//如果
var select =$('#use_time');

// 对select 绑定change事件时不能用上面的code
select.on('change',function(){
console.log('right');
})


----
var select = $('#use_time');
var option = select.options;
select.on('change',function () {
console.log(111);
var index = select.selectedIndex;
if (index > 0) {
console.log(option[index].vlaue);
}
});

选择input 标签属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$('#table td > input:checked').each((i, j) => { ids.push(parseInt(j.getAttribute('adid'))) });


<table class="table table-striped table-hover">
<thead>
<tr>
<th class="table-checkbox">
<input id="allUser" control="复选框" type="checkbox" class="group-checkable" data-set=".checkboxes" />
</th>
<th control="序号">序号</th>
<th control="讲师">用户</th>
</tr>
</thead>
<tbody id="userTable"></tbody>
</table>
// 选择 input 上级 tbody 子元素 的input 属性
$(this).parents('thead').next().children().find('input').prop('checked' ,true);

1
2
3
4
5
6
7
8
9
10
jQuery.parent(expr)           //找父元素
jQuery.parents(expr) //找到所有祖先元素,不限于父元素
jQuery.children(expr) //查找所有子元素,只会找到直接的孩子节点,不会返回所有子孙
jQuery.contents() //查找下面的所有内容,包括节点和文本。
jQuery.prev() //查找上一个兄弟节点,不是所有的兄弟节点
jQuery.prevAll() //查找所有之前的兄弟节点
jQuery.next() //查找下一个兄弟节点,不是所有的兄弟节点
jQuery.nextAll() //查找所有之后的兄弟节点
jQuery.siblings() //查找兄弟节点,不分前后
jQuery.find(expr) //跟jQuery.filter(expr)完全不一样,jQuery.filter(expr)是从初始的 jQuery对象集合中筛选出一部分,而jQuery.find()的返回结果,不会有初始集中 筛选出一部分,而jQuery.find()的返回结果,不会有初始集合中的内容,比如:$("p").find("span")是从元素开始找,等于$("p span")
1…161718…22
ziggle

ziggle

Hail Hydra !

110 posts
45 tags
RSS
GitHub
© 2021 ziggle
Powered by Hexo
|
Hail Hydra—