kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

iframe网页嵌套

https://www.jb51.net/javascript/31553808l.htm

iframe(内嵌框架)是 HTML 中一种用于将一个网页嵌入到另一个网页中的标签,它可以在一个页面中显示来自其他页面的内容。在网页中,使用 <iframe> 标签可以将一个网页嵌套在另一个网页中,实现网页间的互联互通。

1
<iframe src="URL"></iframe>

虽然 <iframe> 标签可以很方便地实现上述功能,但是需要注意以下几点:

嵌入的网页必须与主页面同源,否则会受到浏览器的安全限制。

嵌入的网页可能会影响页面性能和加载速度,特别是当嵌入的网页包含大量的资源(如图片、CSS 和 JavaScript)时。

嵌入的网页可能会被恶意攻击者用于钓鱼或注入恶意代码的攻击,因此需要谨慎使用。

总之,在使用 <iframe> 标签时,需要仔细权衡其优缺点,确保安全和性能。

传值

URL传参

可以在iframe的src属性中使用查询参数(也称为URL参数)将数据传递到嵌入的页面。例如,假设iframe嵌入的页面URL是 index.com/page.html,那么可以使用如下的URL来传递数据:

1
<iframe src="index.com/page.html?param1=value1¶m2=value2"></iframe>

在嵌入的页面中,可以使用JavaScript获取查询参数并使用它们:

1
2
3
var params = new URLSearchParams(window.location.search);
var param1 = params.get('param1');
var param2 = params.get('param2');

或者写一个函数获取对应的值(该方法来自拓维的一位前端工程师大佬):

5.2 postMessage()传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//从url获取参数
export const getQuery = (name: string, url?: string) => {
	const params = new URLSearchParams(url || window.location.search);
	const value = params.get(name);
	if (value) {
		return value;
	}
	return getQueryString(name, url);
};

export const getQueryString = (name: string, url?: string) => {
	const reg = new RegExp('(^|&|/?)' + name + '=([^&]*)(&|$)', 'i');
	const r = encodeURI(url || window.location.search || window.location.href || window.location.hash)
		.substr(1)
		.match(reg);
	if (r != null) return unescape(r[2]);
	return null;
};

postMessage()方法是一种用于在不同窗口或文档之间传递消息的通用方法,它可以实现跨域通信。在使用postMessage()方法时,需要在发送消息的窗口(发送方)和接收消息的窗口(接收方)中分别编写代码。

5.2.1 子传父:

子:

1
2
// 发送消息给接收方窗口
window.parent.postMessage("Hello, parent!", "http://parent.com");

父:

1
2
3
4
5
6
7
8
9
10
// 监听message事件,接收消息
window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
	// 判断消息来源是否是指定的发送方窗口
	if (event.origin === "http://child.com") {
		// 处理接收到的消息
		console.log(event.data);
	}
}

5.2.2 父传子:

父:

创建实例对象:

1
2
const iframe = document.getElementById('my-iframe');
const iframeWindow = iframe.contentWindow;

发送消息:

1
2
3
const message = { type: 'GREETINGS', data: 'Hello, child!' };
const targetOrigin = 'http://child.com'; // 指定接收方的源
iframeWindow.postMessage(message, targetOrigin);

子:

接收消息

1
2
3
4
5
6
7
window.addEventListener('message', receiveMessage, false);

function receiveMessage(event) {
	if (event.origin === 'http://parent.com') { // 验证消息来源
		console.log(event.data); // 处理接收到的消息
	}
}

以上就是iframe的基本介绍与使用的详细内容.

textarea自动调整高宽

https://blog.51cto.com/haihuiwei/1734068

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
/**
 * 统计区分中英文字符字数
 */
function getWordsCnt(str)
{
	var n = 0;
	var ch = 0;
	for(var i = 0; i < str.length; i ++){
		var ch = str.charCodeAt(i);
		if (ch > 255) { // 中文字符集
			n += 2;
			ch = 1;
		} else {
			n ++;
		}
	}
	if (ch == 1) {
		if (n >= 23)
			return 160;
		if (n >= 19)
			return 140;
		if (n >= 15)
			return 110;
		if (n >= 10)
			return 92;
		if (n > 7)
			return 80;
	} else {
		if (n >= 22)
			return 150;
		if (n >= 18)
			return 135;
		if (n >= 14)
			return 110;
		if (n >= 10)
			return 90;
		if (n > 7)
			return 80;
	}
	return 0;
}

function autoTextarea (elem, extra, maxHeight)
{
	extra = extra || 0;
	var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
	isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
	addEvent = function (type, callback) {
		elem.addEventListener ?
			elem.addEventListener(type, callback, false) :
			elem.attachEvent('on' + type, callback);
	},
	getStyle = elem.currentStyle ? function (name) {
		var val = elem.currentStyle[name];
		if (name === 'height' && val.search(/px/i) !== 1) {
			var rect = elem.getBoundingClientRect();
			return rect.bottom - rect.top -
				parseFloat(getStyle('paddingTop')) -
				parseFloat(getStyle('paddingBottom')) + 'px';
		};
		return val;
	} : function (name) {
		return getComputedStyle(elem, null)[name];
	},
	minHeight = parseFloat(getStyle('height'));

	elem.style.resize = 'none';
	var change = function () {
		var scrollTopp, height,
			padding = 0,
			style = elem.style;
		if (elem._length === elem.value.length) return;
		elem._length = elem.value.length;
		if (!isFirefox && !isOpera) {
			padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
		};
		scrollTopp = document.body.scrollTopp || document.documentElement.scrollTopp;
		elem.style.height = minHeight + 'px';

		// 控制最小宽度
		var minw = getWordsCnt(elem.value);
		if (elem.style.minWidth < minw)
			elem.style.minWidth = minw;

		if (elem.scrollHeight > minHeight) {
			if (maxHeight && elem.scrollHeight > maxHeight) {
				height = maxHeight - padding;
				style.overflowY = 'auto';
			} else {
				height = elem.scrollHeight - padding;
				style.overflowY = 'hidden';
			};
			style.height = height + extra + 'px';
			scrollTopp += parseInt(style.height) - elem.currHeight;
			document.body.scrollTopp = scrollTopp;
			document.documentElement.scrollTopp = scrollTopp;
			elem.currHeight = parseInt(style.height);
		};
	};
	addEvent('propertychange', change);
	addEvent('input', change);
	addEvent('focus', change);
	change();
}

NTP log 记录每次发包

vim /etc/ntp.conf

logfile /var/log/ntp.log

修改rpm

https://rpmfind.net/linux/RPM/centos/7.9.2009/x86_64/Packages/ntp-4.2.6p5-29.el7.centos.2.x86_64.html

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
diff --git a/libntp/humandate.c b/libntp/humandate.c
index 705f4c8..ece409e 100644
--- a/libntp/humandate.c
+++ b/libntp/humandate.c
@@ -26,9 +26,14 @@ humanlogtime(void)

  LIB_GETBUF(bp);

+/*
  snprintf(bp, LIB_BUFLENGTH, "%2d %s %02d:%02d:%02d",
       tm->tm_mday, months[tm->tm_mon],
       tm->tm_hour, tm->tm_min, tm->tm_sec);
+*/
+ snprintf(bp, LIB_BUFLENGTH, "%04d-%02d-%02d %02d:%02d:%02d",
+      tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+      tm->tm_hour, tm->tm_min, tm->tm_sec);

  return bp;
 }
diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c
index 89b1e96..46d1692 100644
--- a/ntpd/ntp_io.c
+++ b/ntpd/ntp_io.c
@@ -3191,6 +3191,9 @@ sendpkt(
      DPRINTF(2, ("%ssendpkt(%d, dst=%s, src=%s, ttl=%d, len=%d)\n",
              ismcast ? "\tMCAST\t***** " : "", src->fd,
              stoa(dest), stoa(&src->sin), ttl, len));
+     msyslog(LOG_INFO, "%ssendpkt(%d, dst=%s, src=%s, ttl=%d, len=%d)\n",
+             ismcast ? "\tMCAST\t***** " : "", src->fd,
+             stoa(dest), stoa(&src->sin), ttl, len);
 #ifdef MCAST
      /*
       * for the moment we use the bcast option to set multicast ttl

tail -f /var/log/ntp.log

1
2024-08-09 17:23:14 ntpd[45933]: sendpkt(19, dst=106.55.184.199, src=192.168.100.80, ttl=0, len=48)