222. 完全二叉树的节点个数 思路:题目要求统计完全二叉树的节点个数,如果抛开树的类型,我们完全可以用普通的递归的方式,比如DFS,BFS都可以: public int countNodes(TreeNode root) { if (root == null) return 0; return countNodes(root.left) + countNodes(root.right) + 1; } 但是这样完全没有利用完全二叉树的特性,首先,完全二叉树的特点是树的节点是一层一层的从左往右放的,也就是说该树的层数是完全取决于最左边的叶子节点的深度的,并且只要右边的叶子节点存在,那么其左边所有叶子节点(同一层的)就一定存在。
那么我们只需要知道该树的层数以及最后一层的叶子节点的个数,就可以算出整个树的节点数了。
如果满二叉树的层数为h,则总节点数为:2^h - 1.
那么我们来对 root 节点的左右子树进行高度统计,分别记为 left 和 right,有以下两种结果:
1.left == right。这说明,左子树一定是满二叉树,因为节点已经填充到右子树了,左子树必定已经填满了。所以左子树的节点总数我们可以直接得到,是 2^left - 1,加上当前这个 root 节点,则正好是 2^left。再对右子树进行递归统计。
2.left != right。说明此时最后一层不满,但倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点 +root 节点,总数为 2^right。再对左子树进行递归查找。
public int countNodes(TreeNode root) { if(root == null){ return 0; } int left = countLevel(root.left); int right = countLevel(root.right); if(left == right){ return countNodes(root.
android开发一些体会 文章目录 android开发一些体会前言一、学习知识汇总1.1、Java se基础1.2、android UI编程1.3、android网络编程与数据存储 二、进阶之路(初级->中级->高级)2.2、中级工程师2.3、高级工程师 三、全套功能源码 + 从业过程中的企业源码,百分百可跑四、网盘下载地址 前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。
如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大。
最近看到很多Android新手问Android学习路线,学习方法啊,如何入门啊,所以我从网上找了一些资料,然后以我的工作经验给大家总结一下,让你们少走弯路,提取一些工作中经常用到的技术。
一、学习知识汇总 1.1、Java se基础 1).Java基本数据类型与表达式,分支循环。
2).String和StringBuffer的使用、正则表达式。
3).面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回收;构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类。
4).对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析;对象的多态性:子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。
5).Java异常处理,异常的机制原理。
6).常用的设计模式:Singleton、Template、Strategy模式。
7).JavaAPI介绍:种基本数据类型包装类,System和Runtime类,Date和DateFomat类等。
8).Java集合介绍:Collection、Set、List、ArrayList、LinkedList、Hashset、Map、HashMap、Iterator等常用集合类API。
9).JavaI/O输入输出流:File和FileRandomAccess类,字节流InputStream和OutputStream,字符流Reader和Writer,以及相应实现类,IO性能分析,字节和字符的转化流,包装流的概念,以及常用包装类,计算机编码。
10).Java高级特性:反射和泛型。
11).多线程原理:如何在程序中创建多线程(Thread、Runnable),线程安全问题,线程的同步,线程之间的通讯、死锁。
1.2、android UI编程 1)、Android开发环境搭建:Android介绍,Android开发环境搭建,第一个Android应用程序,Android应用程序目录结构。
2)、Android初级控件的使用:
TextView控件的使用
Button控件的使用方法
EditText控件的使用方法
ImageView的使用方法
RadioButton的使用方法
Checkbox的使用方法
Menu的使用方法
3)、Android高级控件的使用:
ListView的使用方法
GridView的使用方法
Adapter的使用方法
Spinner的使用方法
Gallary的使用方法
ScrollView的使用方法
RecyclerView
4、对话框与菜单的使用:
Dialog的基本概念
BlockquoteAlertDialog的使用方法
DatePickerDialog的使用方法
Menu的使用方法
自定义Menu的实现方法
5.控件的布局方法:
线性布局的使用方法
相对布局的使用方法
6.多Acitivity管理:
AndroidManifest.xml文件的作用
Intent的使用方法
使用Intent传递数据的方法
启动Activity的方法
IntentFilter的使用方法
Activity Group的使用方法
7、自定义控件实现方法:
自定义ListView的实现方法
可折叠ListView的使用方法
自定义Adapter的实现方法
自定义View的实现方法
动态控件布局的上实现方法
由于IPv6拥有128位的长度,所以表达和书写时都具有一定难度。IPv6将整个地址分为8节来表示,每节含16个地址位,以4个十六进制数书写,节与节之间用冒号分隔。如果在4位的十六进数中,如其高位为0,则可省略。连续的一个或者多个全零组可用重叠的冒号“::”表示。
IPV6地址128位
IPV6地址用十六进制表示,分为8段,中间用“:”隔开2020:0410:0000:0001:0000:0000:0000:abcd
若以零开头零可以省略,全段为0可以用一个0表示,连续的全零的段可用“::”表示(只能出现一次) 。
同一个地址不同表示法的例子:
2020:0410:0000:0001:0000:0000:0000:abcd
2020:410:0:1:0:0:0:abcd
2020:410:0:1::abcd
IPv6地址可以按照类似CIDR地址的方式表示, IPv6地址与前缀长度以斜杠区分。前缀长度由一个十进制值表示,指定该地址中最左边的用于组成前缀的比特位数。
例如:
13AB::CD30:0:0:0:0/60 标识一个子网前缀为60位的子网。
当需要同时写出该节点的节点地址和前缀(例如:节点的子网前缀)时,可以通过如下方式将二者合一,可以简写成
13AB:0:0:CDEF:1234:5678:90AB:CDEF/60
Matlab函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Matlab提供了许多内建函数,比如disp()。但你也可以自己创建函数,这被叫做用户自定义函数
matlab
disp(‘hello world’)
hello world
总的来说,自定义函数分为两步:即定义函数和调用函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以 function关键词开头,后接输出变量和函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以end结束。
函数需要定义在脚本文件(*.m)中运行,不可以在命令窗口中临时创建。
语法
Matlab定义函数需要使用function关键字,一般格式如下:
matlab
function 输出变量 = 函数名(输入变量)
函数体
end
这里的输入变量和输出变量都可以根据实际情况缺省。
实例
创建一个函数,用来输出“hello world!” ,步骤如下:
新建一个脚本,命名为eg1.m
matlab
test();
function test()
disp(‘hello world!’)
end
点击顶部菜单的运行按钮,即可在命令窗口输出:
matlab
eg1
hello world!
更复杂一点的应用,我们让函数带上输入变量和输出变量:
matlab
s = calc_area(4,5);
function s = calc_area(w,h)
s = w*h;
disp([‘area=’,num2str(s)]);
end
以上实例输出:
matlab
eg2
area=20
输入变量缺省
有时候,输入变量的个数不确定,但是又想将不同个数情况统一到一个函数里,即输入变量有缺省时,可以利用nargin来判断,然后给出对应的输出。例如:
matlab
out(1)
out(1,2)
out(1,2,3)
往期推荐:
Flink基础:入门介绍
Flink基础:DataStream API
Flink基础:实时处理管道与ETL
Flink深入浅出:资源管理
Flink深入浅出:部署模式
Flink深入浅出:内存模型
Flink深入浅出:JDBC Source从理论到实战
Flink深入浅出:Sql Gateway源码分析
Flink深入浅出:JDBC Connector源码分析
本篇终于到了Flink的核心内容:时间与水印。最初接触这个概念是在Spark Structured Streaming中,一直无法理解水印的作用。直到使用了一段时间Flink之后,对实时流处理有了一定的理解,才想清楚其中的缘由。接下来就来介绍下Flink中的时间和水印,以及基于时间特性支持的窗口处理。
1 时间和水印 1.1 介绍 Flink支持不同的时间类型:
事件时间:事件发生的时间,是设备生产或存储事件的时间,一般都直接存储在事件上,比如Mysql Binglog中的修改时间;或者用户访问日志的访问时间等。 摄入时间:事件进入Flink的时间,这个时间不常用。 处理时间:某个特殊的算子处理事件的时间,当不在意事件的顺序时,为了保证高吞吐低延迟,会采用这种时间。 比如想要计算给定某天的第一个小时的股票价格趋势,就需要使用事件时间。如果选择处理时间进行计算,那么将会按照当前Flink应用处理的时间进行统计,就可能会造成数据一致性问题,历史数据的分析也很难复现。还有个典型的场景是流式处理往往是7*24小时不间断的运行,加入使用处理时间,当中间停机进行代码更新或者BUG处理时,再次启动,中间未处理的数据会堆积当重启时间一次性处理,这样对统计结果就造成大大的干扰。
1.2 使用EventTime Flink默认使用的是处理时间,可以通过下面的方法修改成事件时间:
final StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
如果需要使用事件时间,还需要提供时间抽取器和水印生成器,这样Flink才可以追踪到事件时间的处理进度。
1.3 水印 通过下面的例子,可以了解为什么需要水印,水印是怎么工作的。在这个例子中,每个事件都带有一个时间标识,下面的数字就是事件上的时间,很明显它们是乱序到达的。第一个到达的是4,然后是2:
23 19 22 24 21 14 17 13 12 15 9 11 7 2 4(第一个事件)
加入现在希望对流进行排序,那么每个事件到达的时候,就需要产生一个流,按照时间戳排好序输出每个到达的事件。
上帝视角:第一个到达的事件是4,但是不能立刻就把它当做第一个元素放入排序流中,因为现在事件是乱序的,无法确定前面的事件是否已经到达。当然现在你已经看到完整的事件顺序,当然会知道只要再等待一个事件,4之前的事件就都处理完了(这就是上帝视角),但在现实中我们是一条条接收的数据,无法知道4后面出现的是2。 缓存和延迟:如果使用缓存,那么很有可能会永远停止等待。第一个事件是4,第二个事件是2,我们是不是只需要等待一个事件就能保证事件的完整?可能是,也可能不是,比如现在事件就永远等待不到1。 排序策略:对于任何给定的时间事件停止等待之前的数据,直接进行排序。这就是水印的作用:用来定义何时停止等待更早的数据。Flink中的事件时间处理依赖于水印生成器,每当元素进入到Flink,会根据其事件时间,生成一个新的时间戳,即水印。对于t时间的水印,意味着Flink不会再接收t之前的数据,那么t之前的数据就可以进行排序产出顺序流了。在上面的例子中,当水印的时间戳到达2时,就会把2事件输出。 水印策略:每当事件延迟到达时,这些延迟都不是固定的,一种简单的方式是按照最大的延迟事件来判断。对于大部分的应用,这种固定水印都可以工作的比较好。 1.4 延迟和完整性 在批处理中,用户可以一次性看到全部的数据,因此可以很容易的知道事件的顺序。在流处理中总需要等待一段时间,确定事件完整后才能产生结果。可以很激进的配置一个较短的水印延迟时间,这样虽然输入结果不完整(有的时间延迟还未到达就已经开始计算),但是速度会很快。或者设置较长的延迟,数据会相对完整,但是会有一定的延迟。也可以采用混合的策略,刚开始延迟小一点,当处理了部分数据后,延迟增加。
1.5 延时 延时通过水印来定义,Watermark(t)代表了t时间的事件是完整的,即小于t的事件都可以开始处理了。
1.6 使用水印 为了支撑事件时间机制的处理,Flink需要知道每个事件的时间,然后为其产生一个水印。
Springboot自动装配原理 springboot自动装配 springboo最核心的东西就是自动装配原理,那么自动装装配原理是什么呢?自动装配原理其实就是对strat提供好的xxxAutoConfiguration、配置文件进行读取,当读取完后就配置好这些类。
详说springboot自动装配 进入项目后,我们发现springboot为开发者提供了一个类,类里有个run方法,看上去很简单没什么东西需要了解,但是细心的你会发现这个类上有个注解@SpringBootApplication,这个注解表示的就是这个类是springboot的启动类也就是入口。
@SpringBootApplication public class Demo2Application { public static void main(String[] args) { SpringApplication.run(Demo2Application.class, args); } } 点击这个注解后我们可以看到这个注解上面除了四个元注解还有三个注解,@ComponentScan表示扫描注解,那么@SpringBootConfiguration、@EnableAutoConfiguration又代表什么呢?我们点击进入@SpringBootConfiguration注解里面。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { .... } @SpringBootConfiguration 进入注解后我们看到这个注解里面出现了@Configuration注解,@configuration注解代表这个类就是一个配置文件,功能等同于在spring中的Application.xml文件。那么就是说@SpringBootConfiguration注解想表达的意思就是在类上面添加了他,他就把这个类变成一个配置类。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; } 我还是不放心,害怕springboot欺骗我,我继续点击@Configuration注解进入后发现他确实是个配置注解,这个注解里出了通用注解,剩下的也就是元注解。
随机梯度下降法(SGD)对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。那么使用BN之后,你可以不需要那么刻意的慢慢调整参数。 1.我们知道数据在输入到神经网络之前要进行预处理,其中包括数据增强,裁剪、归一化等操作,这会使网络对数据分布达到更好的训练效果。
2.那是不是考虑将每一层网络的输出也经过一次预处理再输送到下一层网络,通过这样的做法使网络的泛化性和训练速度更优呢?
3.BN层主要是解决“Internal Covariate Shift”的问题,因为网络主要学习的是数据集的分布。但数据经过深层次的网络后分不会发生变化,这样变化后的数据在经过下一层网络,会引发梯度爆炸或消失(只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度)。
4.BN的计算流程:
对每层数据都进行这样的操作,防止数据的分布
计算样本均值。计算样本方差。样本数据标准化处理。进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。如果γ和β分别等于此batch的方差和均值,那么yi就还原到了归一化前的x,β 和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。正向传播时,计算β 和γ,使输出达到和输入相同的分布,反向传播时通过计算β 和γ的梯度,调整权重。
假设我们的数据分布如a所示,参数初始化一般是0均值,和较小的方差,此时拟合的y=wx+b y=wx+by=wx+b如b图中的橘色线,经过多次迭代后,达到紫色线,此时具有很好的分类效果,但是如果我们将其归一化到0点附近,如图c,显然会加快训练速度,如此我们更进一步的通过变换拉大数据之间的相对差异性(图d),那么就更容易区分了。 总结 1.加入BN层后由于网络每层的训练数据分布相同,极大的提高了训练速度和收敛速度。
2.减少对初始化参数的依赖
3.改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求(对梯度爆炸和下降有大的改善)
4.对于彻底打乱的数据鲁棒性高,因为输入分布被归为一致化。
enjoy~
作者:程序猿的内心独白
原文链接:http://suo.im/5Zxx2L
前言 在开发应用系统的时候,导出文件是必不可放的功能。
以前用过POI、easyexcel等工具的导入导出功能,但总感觉太麻烦了,代码特别多,感觉并不是很好用。
今天给大家介绍一款新工具,java工具类库Hutool。
Hutool简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让使用者更轻松。
Hutool中的工具方法来自于每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
使用 首先在POM.xml中加入GAV
cn.hutool
hutool-all
5.0.7
org.apache.poi
poi-ooxml
4.1.1
org.apache.poi
poi-ooxml-schemas
3.17
然后在控制层使用就行
@RequestMapping("/export")
@ResponseBody
public void export(HttpServletResponse response){
List list = new ArrayList<>;
list.add(new User("zhangsan
感谢商汤科技给我一次面试的机会,通过面试也暴漏了自己很多问题。立体匹配中很多网络都是用的 smooth L1 loss。那他和L1、L2 loss的区别是什么呢? L1 loss(MAE) 其中 x 为预测框与 groud truth 之间 elementwise 的差异。
先说下L1 loss的优点: 优点:L1 的导数为常数。,无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解。如果训练数据被异常值破坏的话(也就是我们在训练环境中错误地接收到巨大的不切实际的正/负值,但在测试环境中却没有),MAE会很有用。 L1 的缺点: 对于数据集的一个小的水平方向的波动,回归线也许会跳跃很大(如,在转折点处求导)。在一些数据结构上,该方法有许多连续解;但是,对数据集的一个微小移动,就会跳过某个数据结构在一定区域内的许多连续解。在跳过这个区域内的解后,最小绝对值偏差线可能会比之前的线有更大的倾斜。
上图形象的说明了L1的缺点,当损失很小的时候,L1 loss还是以固定的损失值调整模型,这就导致训练后期,预测值与 ground truth 差异很小时,损失对预测值的导数的绝对值仍然为 1,而 learning rate 如果不变,损失函数将在稳定值附近波动,难以继续收敛以达到更高精度。 L2 loss 其中 x 为预测框与 groud truth 之间 elementwise 的差异。
L2的优势 注意L2的曲线图,当损失值很小的时候,梯度会随着损失值的减小而变小,使模型更易收敛,损失函数达到最小值。
L2 缺点: 因为MSE是误差的平方值(y — y_predicted = e),那么误差(e)的值在e > 1时会增加很多。如果我们的数据中有异常值,e的值会非常高,e²会>> |e|,引发梯度爆炸的现象。这会让存在MSE误差的模型比存在MAE误差的模型向异常值赋予更多的权重。 smooth L1损失 smooth L1在 x 较小时,对 x 的梯度也会变小,而在smooth L1很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。 smooth L1完美地避开了 L1 和 L2损失的缺陷。其函数图像如下:
实现代码为:
<div class="row"> <div class="column" style="float:left;width:75%"> <u>Consider the familiar child’s game of tic-tac-toe.</u> Because a skilled player can play so as never to lose, let us assume that we are playing against an <u>imperfect player</u>, one whose play is sometimes incorrect and allows us to win. For the moment, in fact, let us consider draws and losses to be equally bad for us. How might we <u>construct a player</u> that will <u>find the imperfections in its opponent’s play and learn to maximize its chances of winning</u>?
效果如下:
点击任意地方,小球会根据选择的曲线类型进行测试移动,更直观查看曲线运动轨迹。
在Unity开发过程中,我们都可能会需要用到DOTween来做一些补间动画,其中,这些补间动画往往会有一些曲线效果。那么,如何来查看这些曲线的轨迹以及曲线的作用效果呢?DOTween插件里好像没有对应的预览器,所以我在闲杂时间便撸了个代码,方便后面编辑动画时,查看动画曲线的效果。直接上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using DG.Tweening;
public class EasingDemoPreviewWindow : EditorWindow
{
[MenuItem("Window/Dotween Easing Demo")]
public static void ShowWindow()
{
GetWindow<EasingDemoPreviewWindow>("Dotween Easing Demo");
}
const int POINT_COUNT = 60;
const float TIME_DELTATIME = 0.02f;
const int POINT_LENGTH = 10;
Ease _ease = Ease.Linear;
private int _easeEnumLength = 0;
Vector2 _rectStartPos = new Vector2(50,200);
private Vector3 _ballTmpPos = new Vector3(200, 200, -10);
private float _ballMoveTimer;
1.配置 配置提交人姓名 --------- git config --global user.name -----name姓名
配置提交人邮箱 ---------- git config --global user.email ---email邮箱
查看配置信息 --------- git config --list
删除配置 --------- git config --global --unset user.name/user.email
2.缓存区 添加缓存区 git add . --------一次性全部添加 git add 文件列表-----指定添加
缓存区文件提交到仓库 ----------git commit -m "提交信息"(没有提交信息不可以提交)
查看提交记录 ---------- git log(按q退出)
缓存区的文件覆盖工作目录的文件 ----------- git checkout 文件名
删除缓存区中的文件(不会删除工作目录文件) ----------------- git rm --cached 文件名
直接将所有文件都删除 ----------- 可以执行命令 git rm --f 文件名(慎用)
缓存区返回上一次修改的版本 ---------- git reset 文件名
从提交记录中恢复 ------------ git reset --hard 提交记录ID(如果不写提交id默认最新) ------------ 会覆盖缓存区和工作目录 ------------- 恢复后,该commitID之后的提交记录都会被删除 ------------- 加了--hard会直接将文件删除,不会保留,如果需要保留文件,就不要加--hard 3.
linux下安装redis报Please select the redis executable path []Mmmm… it seems like you don’t have a redis executable. Did you run make install yet? 问题很明显[ ],里没有东西,这设置系统程序时其他[ ]里都是有路径的。
需要在[ ]没有路径下加入自己的/src/redis-server,这个路径一般是自己解压或者安装的路径。
Please select the redis executable path [] /opt/app/redis-6.0.9/src/redis-server
剩下的就是一路回车就可以了
报个错网上没找到明显的正确答案,现在分享一下。
【远程服务器 关掉连接工具 依然执行任务】 远程服务器 关掉连接工具 依然执行任务 以阿里云服务器 和 Xshell 运行 java 代码为例
先运行任务
之后ctrl + z
之后 bg 1
最后 disown -h %1
之后查看 ps -aux
使用reflect(反射)包下面的Field和Method类获得类的属性和方法,并对属性和方法进行操作。
在框架中经常会会用到method.invoke()方法,用来执行某个的对象的目标方法。以前写代码用到反射时,总是获取先获取Method,然后传入对应的Class实例对象执行方法。然而前段时间研究invoke方法时,发现invoke方法居然包含多态的特性,这是以前没有考虑过的一个问题。那么Method.invoke()方法的执行过程是怎么实现的?它的多态又是如何实现的呢?
本文将从java和JVM的源码实现深入探讨invoke方法的实现过程。
首先给出invoke方法多态特性的演示代码:
public class MethodInvoke { public static void main(String[] args) throws Exception { Method animalMethod = Animal.class.getDeclaredMethod("print"); Method catMethod = Cat.class.getDeclaredMethod("print"); Animal animal = new Animal(); Cat cat = new Cat(); animalMethod.invoke(cat); animalMethod.invoke(animal); catMethod.invoke(cat); catMethod.invoke(animal); } } class Animal { public void print() { System.out.println("Animal.print()"); } } class Cat extends Animal { @Override public void print() { System.out.println("Cat.print()"); } } 代码中,Cat类覆盖了父类Animal的print()方法, 然后通过反射分别获取print()的Method对象。最后分别用Cat和Animal的实例对象去执行print()方法。其中animalMethod.invoke(animal)和catMethod.invoke(cat),示例对象的真实类型和Method的声明Classs是相同的,按照预期打印结果;animalMethod.invoke(cat)中,由于Cat是Animal的子类,按照多态的特性,子类调用父类的的方法,方法执行时会动态链接到子类的实现方法上。因此,这里会调用Cat.print()方法;而catMethod.invoke(animal)中,传入的参数类型Animal是父类,却期望调用子类Cat的方法,因此这一次会抛出异常。代码打印结果为:
Cat.print() Animal.print() Cat.print() Exception in thread "
往期推荐:
Flink基础:入门介绍
Flink基础:DataStream API
Flink深入浅出:资源管理
Flink深入浅出:部署模式
Flink深入浅出:内存模型
Flink深入浅出:JDBC Source从理论到实战
Flink深入浅出:Sql Gateway源码分析
Flink深入浅出:JDBC Connector源码分析
Flink的经典使用场景是ETL,即Extract抽取、Transform转换、Load加载,可以从一个或多个数据源读取数据,经过处理转换后,存储到另一个地方,本篇将会介绍如何使用DataStream API来实现这种应用。注意Flink Table和SQL api 会很适合来做ETL,但是不妨碍从底层的DataStream API来了解其中的细节。
1 无状态的转换 无状态即不需要在操作中维护某个中间状态,典型的例子如map和flatmap。
map() 下面是一个转换操作的例子,需要根据输入数据创建一个出租车起始位置和目标位置的对象。首先定义出租车的位置对象:
public static class EnrichedRide extends TaxiRide { public int startCell; public int endCell; public EnrichedRide() {} public EnrichedRide(TaxiRide ride) { this.rideId = ride.rideId; this.isStart = ride.isStart; ... this.startCell = GeoUtils.mapToGridCell(ride.startLon, ride.startLat); this.endCell = GeoUtils.mapToGridCell(ride.endLon, ride.endLat); } public String toString() { return super.toString() + "," + Integer.
from keras.models import load_model 改为 from tensorflow.keras.models import load_model
在我们的前端项目中,npm install之后会自动生成package-lock.json文件,不要把这个加入.gitignore
因为我们实践出过一个问题,我们将package-lock.json放入.gitignore文件中,虽然我们把package.json中依赖的版本号写死了,但是有一天突然发现在编译机编译失败了,用之前编译成功的代码去编译也失败了,很奇怪。
然后尝试本地复现这个问题,重新编译没有问题,但是当我们把node_modeuls和package-lock.json文件都删掉之后就出现了这个问题,但是把原来的package-lock.json文件加回来就好了。
所以建议不要把package-lock.json加入.gitignore
知乎上有人是这么说的:
npm 5.x 发布以来到现在的5.6.0 lock的作用变更过好多次, 自npm 5.0版本发布以来,npm i的规则发生了三次变化。 1、npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm这个 issue 控诉了这个问题,明明手动改了package.json,为啥不给我升级包!然后就导致了5.1.0的问题... 2、5.1.0版本后 npm install 会无视lock文件 去下载最新的npm然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm控诉这个问题,最后演变成5.4.2版本后的规则。 3、5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm大致意思是,如果改了package.json,且package.json和lock文件不同,那么执行`npm i`时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。如果两者是同一状态,那么执行`npm i `都会根据lock下载,不会理会package实际包的版本是否有新。 也就是说保证你的npm版本在5.4.2以后就不会有lock的问题。
参考链接 https://www.zhihu.com/question/264560841
问题现象 安装harbor时ERROR: for nginx Cannot start service proxy: driver failed programming external connectivity on endpoint nginx (d55f2dc113ed3cf55606bfb054bf0cee9deec6fe4529e99f2180fddd3d6821e8): Bind for 0.0.0.0:80 failed: port is already allocated
这是因为端口被占用了 可以 docker ps -a 查看哪个占用了这个端口号,stop停止掉或者修改一下就可以了
【单选题】下列关于Python版本的说法中,正确的哪一项?
【简答题】language points.ppt
【单选题】Python语言属于以下哪一种语言?
【单选题】Python 语句x="char’;y=2,print(x+y)输出的结果是哪一项?()
【简答题】跳转语句break和continue的区别是什么?
【简答题】电动自行车的电池不能充电了,可能是怎么回事?请上网搜集相关资料上传
【单选题】执行下面的操作后,lst的值是多少? lst1=[3,4,5,6] lst2=lst1 lst1[2]=100 print(lst2)
【单选题】以下代码段,运行结果正确的是哪?() i=3; j=0; k=3.2; if (i
【简答题】简述Python程序的执行过程。
【简答题】请列举IDLE编程环境下快捷键的功能。
【单选题】以下代码运行结果正确的是哪一项?() x=2 if x:print(True) else:print(False)
【编程题】输人两个正整数m和n,求其最大公约数和最小公倍数。
【编程题】在列表中给出若干字符串,计算并输出最大字符串的长度。
【单选题】Python语句print(type(["a","1",2,3]))的输出结果是哪一项?
【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜一下
【简答题】完成13,14页第10,11题,拍照上传
【编程题】编写程序,根据给出的三角形的三个边,输出三角形的面积。
【单选题】以下代码段,运行结果正确的是哪一项?() a=17 b=6 result=a%b if(a%b>4) else a/b print(result)
【编程题】从键盘交互式输入-一个人的18位的身份证号,以类似于“2001年09月12日”的形式 输出该人的出生日期。
【简答题】Python的常用数值类型有哪些,举例说明。
【单选题】下列选项中,正确定义了一个字典的是哪个选项?
【编程题】
【单选题】下列代码的输出结果是哪一项?() print("数量{1},单价{0}"。format(23.4,34.2))
【编程题】给定某一字符串s,对其中的每一 字符c大小写转换:如果c是大写字母,则将它转换 成小写字母;如果c是小写字母,则将它转换成大写字母;如果c不是字母,则不转换。
【编程题】一个数如果恰好等于它的因子这和,这个数就称为“完数”,例如,6的因子为1,2,3, 而6=1+2+3,因此6就是“完数”。编程找出100内的所有完数。
【单选题】下列选项中,不属于Python循环结构的是哪一项?()
【单选题】下列选项中,不属于字典操作的方法是哪一项?
【简答题】format()方法的参数有哪些?
【编程题】编写程序,根据输入的三科成绩值,计算平均分和总分
【单选题】下列数据类型中,Python不支持的是哪一项?( )
【单选题】python语句temp=["a","1",2,3,None];print(len(temp))的输出结果是哪一项?
【简答题】挫折应对团队活动的感悟 (5.0分)
【简答题】简述Python标识符的命名规则。
【简答题】编写程序,给出一个字符串,将其中的字符"E"用空格替换输出。
【单选题】下列选项的功能是求两数值x、y中最大数,不正确的是哪一项?()
【单选题】下列计算机语言中,不属于解释型语言的是哪一项?
【编程题】编写程序,给出一个英文句子,统计单词个数。
【简答题】简述程序的编译方式和解释方式的区别。
【简答题】整数的二进制、八进制、十六进制都用什么格式表示?将十进制数转换为二进制、八进制、十六进制的函数是什么?
【简答题】简述程序设计的IPO模式的特点。
今天探讨了下关于python的一个练习剪刀石头布,可能程序还是多少有些不足,欢迎各位批评指正:
代码如下:
import random
def main():
#将玩家和机器视为两个参量,机器产生随机数1-3,代表着"1":"石头","2":"剪刀","3":"布"
#然后玩家可以输入进行模拟比赛了
print("*******************begin*******************")
#先设置一个空表以及初始化infos
player_info = []
player_score = 0
infos = {"1":"石头","2":"剪刀","3":"布"}
while True:
#控制程序可以一直比赛下去
computer = str(random.randint(1,3))
player = input("请选择:1-石头,2-剪刀,3-布:")
if player not in ["1","2","3"]:
print("输入有误,请重新输入:")
continue
else:
ret = (player,computer)
player_info.append(ret)
if ret==("1","2") or ret==("2","3") or ret==("3","1"):
print("玩家赢了")
player_score += 1
elif player == computer:
print("平局")
else:
print("机器赢了")
player_score -= 1
print("对战双方结果:玩家:%s,机器;%s"%(infos[player],infos[computer]))
#设置结束条件
choice = input(" 是否继续游戏?(yes/no):")
if choice=="no":
break
前言 在小程序中组件与组件之间的通信是通过在引用组件处,在自定义组件上添加自定义属性实现的,子组件内部通过properties进行接收
更多关于组件与组件之间的通信可参考小程序-实现自定义组件以及自定义组件间的通信这篇文章
那页面与页面之间又如何传递数据?
您将阅读完本文后,将收获到:
页面间跳转携带参数(通过url的方式)传递数据
如何返回上一级页面,并刷新页面呢
使用全局app页面定义的变量实现数据的传递
使用本地缓存数据
使用 eventChannel 向被打开页面传送数据(wx.navigateTo高级用法)
01 页面间通过 url 方式传递数据
在小程序中当中,在父页面,通过url方式传递参数到子页面,是一种比较常见的做法
如下示例所示:应用场景
点击列表页面,进入详情页
动态改变详情页面的navBar中的title
扫码即可体验
父页面实例代码 <view> <view class="list-wrap"> <block wx:for="{{listDatas}}" wx:key="index"> <view bindtap="onListTap" data-list="{{item}}"> <text>{{ item.list_text}}</text> </view> </block> </view> </view> css代码
.list-wrap { display: flex; justify-content: space-between; flex-wrap: wrap; padding: 15px 15px; } .list-wrap view { width: 30%; height: 300rpx; border: 1px solid #ccc; margin-bottom: 15px; text-align: center; line-height: 300rpx; font-size: 28rpx; } js代码
如果本文对您有所帮助,可以点一下赞👍
本文只是学习笔记,欢迎指错,转载标明出处
1、原来项目结构 2、子模块改名 2.1rename操作
2.2修改子模块的pom文件
2.3修改父模块pom文件module里面子模块的名称,如果没有modules,就自己加上去
3、父模块改名字 3.1右键中父模块,Rename操作,结果如下图
3.2修改pom文件
3.3修改子模块parent标签父模块的名称(可选)
3.4退出idea
3.5重命名项目文件夹名称
3.6找到项目根目录,删除.idea文件
3.7打开idea重新导入项目即可
3.8由于删除了.idea文件,所有idea存储项目的一些信息也没有了,需要重新设置jdk版本和maven仓库这些
四象限波形显示控件 视图展示创建步骤给自定义控件添加事件添加一个图片控件(pictureBox1)代码部分 视图展示 十字坐标轴方式
一象限坐标轴方式
二象限坐标轴方式
创建步骤 ##创建自定义控件(名字可随意)
给自定义控件添加事件 以上个事件一个就Load(初始化)、背景颜色发生改变(不多说)、控件大小发生改变(支持大小拖动)
添加一个图片控件(pictureBox1) 直接从工具箱中拖到自定义控件的绘制板就OK啦!
记得将pictureBox1.Dock=Fill;
代码部分 下面有点儿长我直接拷贝整个代码的(有些同学控件名字不一样要修改哦)
注意长篇出现 ↓↓↓↓↓↓↓↓↓↓
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Char控件使用 { public partial class New_Chart : UserControl { //private int 上边距 = 20, 下边距 = 35; //private int 左边距 = 50, 右边距 = 20; //private int X轴格数 = 6, Y轴格数 = 6; //private double X_Min=-50, X_Max=50,Y_Min=-50,Y_Max=50; private int 线数量 = 1; private float X_0点位置, Y_0点位置, X_轴长, Y_轴长; private Graphics g; private Bitmap bmp; public DrLine[] dr_line; #region [Description("
Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/18870/AppData/Local/Temp/temporary-acc01e20-1ddb-4bfb-bb81-89c2657e97e5 from C:/Users/18870/AppData/Local/Temp/temporary-acc01e20-1ddb-4bfb-bb81-89c2657e97e5 is not a valid DFS filename. at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:196) at org.apache.hadoop.hdfs.DistributedFileSystem.access$000(DistributedFileSystem.java:105) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1819) at org.apache.spark.sql.execution.streaming.StreamExecution.<init>(StreamExecution.scala:90) at org.apache.spark.sql.execution.streaming.MicroBatchExecution.<init>(MicroBatchExecution.scala:48) at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:281) at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:322) at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:325) at Log2Console$.main(Log2Console.scala:36) at Log2Console.main(Log2Console.scala) 感谢国际友人帮助
添加了core-site.xml文件到resources中
一直以为是.option(“startingOffsets”, “earliest”)有问题,添加了.option(“checkpointLocation”, path)也不行
没办法听从国际友人安排,给这个文件改个名字就好了
打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需针对不同的JDK进行配置:
32 位:idea.exe.vmoptions
64 位:idea64.exe.vmoptions
-Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=225m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true 上面列出的是idea64.exe.vmoptions的默认内容,我们可以根据需要进行修改。
下面内容转自http://www.cnblogs.com/jack204/archive/2012/07/02/2572932.html
各参数的含义分别为:
一、设置JVM内存设置
1. 设置JVM内存的参数有四个:
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn Java Heap Young区大小,不熟悉最好保留默认值;
-Xss 每个线程的Stack大小,不熟悉最好保留默认值;
2. 如何设置JVM内存分配:
(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test
(2)当在集成开发环境下(如eclipse)启动并使用JVM时:
a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):
-vmargs -Xms40m -Xmx256m -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
此处设置的参数值可以通过以下配置在开发工具的状态栏显示:
在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true
修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:
-debug options -vm javaw.exe 重新启动eclipse,就可以看到下方状态条多了JVM信息。
b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)
编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m
c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)
centos6安装glibc2.14 1、源码编译安装glibc1.1、编译安装glibc1.2、备份原有动态链接后删除旧动态链接1.3、补救(因为上面删除之后,linux基本不能敲,所以下面这条命令,直接复制即可)1.4、创建新的软连接1.5、检查是否安装成功1.6、报错问题解决 2、make常用命令 1、源码编译安装glibc 1.1、编译安装glibc 一定要用root用户哦!!!
wget https://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz tar -xzvf glibc-2.14.tar.gz # 进入文件夹 cd glibc-2.14 # 在glibc-2.14目录下建立build文件夹 mkdir build cd build # 配置glibc并设置当前glibc-2.14安装目录 ../configure --prefix=/usr/local/glibc-2.14 # 编译安装glibc-2.14库 make make install 1.2、备份原有动态链接后删除旧动态链接 # 备份 cp /lib64/libc.so.6 /lib64/libc.so.backup # 谨慎操作后不要乱动 rm -rf /lib64/libc.so.6 1.3、补救(因为上面删除之后,linux基本不能敲,所以下面这条命令,直接复制即可) LD_PRELOAD=/usr/local/glibc-2.14/lib/libc-2.14.so ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6 1.4、创建新的软连接 ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6 1.5、检查是否安装成功 strings /lib64/libc.so.6 | grep GLIBC 1.6、报错问题解决 1、Can’t open configuration file /usr/local/glibc-2.14/etc/ld.so.conf: No such file or directory
2020-11-06 03:42:43,205 ERROR org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt: Error trying to assign container token and NM token to an allocated container container_1604647286933_0002_01_000001
java.lang.IllegalArgumentException: java.net.UnknownHostException: k8s-node1
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:378)
at org.apache.hadoop.yarn.server.utils.BuilderUtils.newContainerToken(BuilderUtils.java:261)
at org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager.createContainerToken(RMContainerTokenSecretManager.java:220)
at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt.pullNewlyAllocatedContainersAndNMTokens(SchedulerApplicationAttempt.java:456)
at org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp.getAllocation(FiCaSchedulerApp.java:270)
at org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler.allocate(CapacityScheduler.java:988)
at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl$AMContainerAllocatedTransition.transition(RMAppAttemptImpl.java:991)
at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl$AMContainerAllocatedTransition.transition(RMAppAttemptImpl.java:983)
at org.apache.hadoop.yarn.state.StateMachineFactory$MultipleInternalArc.doTransition(StateMachineFactory.java:385)
at org.apache.hadoop.yarn.state.StateMachineFactory.doTransition(StateMachineFactory.java:302)
at org.apache.hadoop.yarn.state.StateMachineFactory.access$300(StateMachineFactory.java:46)
at org.apache.hadoop.yarn.state.StateMachineFactory$InternalStateMachine.doTransition(StateMachineFactory.java:448)
at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl.handle(RMAppAttemptImpl.java:808)
at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl.handle(RMAppAttemptImpl.java:108)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager$ApplicationAttemptEventDispatcher.handle(ResourceManager.java:803)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager$ApplicationAttemptEventDispatcher.handle(ResourceManager.java:784)
at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:184)
at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:110)
有时,ResourceManager去找nodeManager的时候,会通过hostname查找具体机器,而非slave文件中的node** 但是修改了对应nodeManager的host还是不能通过node**查找。
这样可以修改ResourceManager的hosts文件 指定hostname也指向node**的机器IP。这样就可以规避了此类问题
[root@localhost gitlab]# gitlab-ctl start
fail: alertmanager: runsv not running
fail: gitaly: runsv not running
fail: gitlab-exporter: runsv not running
fail: gitlab-workhorse: runsv not running
fail: grafana: runsv not running
fail: logrotate: runsv not running
fail: nginx: runsv not running
fail: node-exporter: runsv not running
fail: postgres-exporter: runsv not running
fail: postgresql: runsv not running
fail: prometheus: runsv not running
fail: redis: runsv not running
fail: redis-exporter: runsv not running
类就是用{}包着的
对象也可以说是函数,
一个大类包着多个对象(函数)
看列子:
<?php //声明类的方法,我们用class来声明我们的类. // class 类名 { 类的内容 } // 注:这里的$this是值当前的类 class test{ var $a; var $b = "111"; var $c = "我是c"; function name(){ echo $this->c;//指向当前类的c } function age(){ echo "父类的年龄"; } }; // 引用类 new方法 $all = new test; // $a = $all->a;//声明a,因a没有值,页面什么也不输出 // echo $a; // $a = $all->b;//这就输出111,因为$b有值 // echo $a; // $a = $all->name();//调用函数 // 子父类问题 // 我们可以继承test类/继承之后我们的可以使用父类里面的对象(函数),也可以再次定义他的对象(函数)继承extends class two extends test{ function name(){ echo "
1. 文件操作 ls、mk、rm、cp
【1】列出文件夹:ls(".")
结果列表 = ls ( 文件全路径, 包含前缀=True, 选项="" ) # 选项="-r" 表示递归列出
【2】创建文件 or 文件夹:mk("./a1.txt")
mk ( 文件全路径, 已有跳过_不删除=True, 选项="-p" ) # 选项="-p" 表示递归创建,也可以是-r
【3】删除文件 or 文件夹:rm("./a1.txt")
rm ( 文件全路径, 选项="-rf" ) # 选项="-r" 表示递归删除
【4】复制文件 or 文件夹:cp("./main.py","./main2.py")
2. 文件打开模式 (1)三种基本模式:r、w、a
r 只读
w 删除原文,只写
a 保留原文(追加),只写
(2)附加后缀
b 表示二进制读写
+ 表示额外赋予读写权限
U 表示读取的换行全部改成\n
(3)三种模式的不同
无文件时: r 报错,w、a 新建
是否清除原文:r 、a 否,w 是
初始读取位置:r、w 开头,a 结尾
目录 Flash编程基础知识Flash Programming微信公众号 Flash编程基础知识 参考 Flash_Programming_1 for KIT_AURIX_TC397_TFT, 本例展示了如何烧写PFLASH(Program Flash memory) 和 DFLASH(Data Flash memory).
数据存储单元(DMU, Data Memory Unit)控制执行在PFLASH和DFLASH上的命令序列, 连接FSI(Flash Standard Interface)和PFI(Programming Flash Interface).FSI在所有闪存上执行擦除, 编程和验证操作.PFI为每个PFLASH块与CPU提供唯一的点对点快速连接TC39x 提供 6 Program Flash Banks(PFx) 和 2 Data Flash Banks(DFx)TC3xx 具有相同扇区结构的PFLASH块PFx, PFx块大小可能不用: 3/2/1 Mbyte Program Flash BankTC39x 有5个3MB大小的PFx(PF0…PF4) 和 1个1MB大小的PF5. 每个PFx被划分为1024KB大小的物理扇区(Physical Sectors), 每个物理扇区又被划分为16KB大小的逻辑扇区(Logical Sectors)TC39x具有两个数据闪存存储区DFLASH0和DFLASH1, 两者都包括多个通常用于EEPROM仿真的EEPROM扇区. 仅DFLASH0包含用于数据保护的用户配置块(UCBs, User Configuration Blocks)和1个配置扇区(CFS, Configuration Sector), 用户无法直接访问该配置扇区.DFLASH EEPROM可以配置为单端模式(默认)或补码检测(incomplement sensing). 根据所选模式, 每个扇区的大小分别设置为4KB和2KB闪存中可以编程的最小数据量是页(Page), 程序闪存(Program Flash)页由32字节组成, 数据闪存(Data Flash)页由8字节组成仅在擦除操作后才能对页面进行编程可以执行擦除操作的最小单元是逻辑扇区(Logical Sector) TC39x Program Flash Memeory:
CSS 预处理器:一种具有编程逻辑的CSS语言。允许使用类似变量、函数、继承、运算符等编程方法来编写CSS文件。
三种流行的CSS预处理器:Sass、LESS 和 Stylus 转载
Etcd 的租约机制 实现定时任务 1 > 创建租约 example :60s (租约立刻开始倒计时)
2 > 更改租约 (先回收,再创建租约)
3 > 回收租约 回收租约对应的删除key
4 > 续约 (再次创建新的租约,绑定到指定的key)
实验:此 key 只让存在 60 s
5 > 解约
#etcdctl lease revoke 018f6d7bd032c117
注意:
* 租约创建在绑定key前就开始生效 !
1、方法分类
str.trim(); //去掉首尾空格str.replace(" ",""); //去除所有空格,包括首尾、中间str.replaceAll(" ", ""); //去掉所有空格,包括首尾、中间str.replaceAll(" +",""); //去掉所有空格,包括首尾、中间str.replaceAll("\\s*", ""); //可以替换大部分空白字符, 不限于空格 ; \\s* 可以匹配空格、制表符、换页符等空白字符的其中任意一个。
2、代码示例
package test; public class Test { /** * description:字符串去除空格的方法 */ public static void main(String[] args) { String str = " hi world ~ "; //方法1:str.trim() System.out.println("1--->"+str.trim()); //方法2:str.repalce(" ","") System.out.println("2--->"+str.replace(" ", "")); //方法3:str.repalceAll(" ","") System.out.println("3--->"+str.replaceAll(" ", "")); //方法4:str.repalceAll(" +","") System.out.println("4--->"+str.replaceAll(" +", "")); //方法5:str.repalceAll("\\s*","") System.out.println("4--->"+str.replaceAll("\\s*", "")); } } 3、输出结果
4、replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: (1) replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串); (2) replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "
第 1 章 数据库概述
1. 试说明数据、数据库、数据库管理系统和数据库系统的概念。
答:数据是描述事物的符号记录。
数据库是长期存储在计算机中的有组织的、可共享的大量数据的集合。
数据库管理系统是一个专门用于实现对数据进行管理和维护的系统软件。
数据库系统是指在计算机中引入数据库后的系统,一般由数据库、数据库管理系统(及相关的实用工具)、应用程序、数据库管理员组成。
2. 数据管理技术的发展主要经历了哪几个阶段?
答:文件管理和数据库管理。
3. 与文件管理相比,数据库管理有哪些优点?
答:与文件系统管理数据相比,数据库系统管理数据带来了如下好处:将相互关联的数据集成在一起,较少的数据冗余,程序与数据相互独立,保证数据的安全可靠,最大限度地保证数据的正确性,数据可以共享并能保证数据的一致性。
4. 在数据库管理方式中,应用程序是否需要关心数据的存储位置和存储结构?为什么?
答:不需要。因为数据库管理系统提供了逻辑独立性和物理独立性。
5. 在数据库系统中,数据库的作用是什么?
答:数据库是数据的汇集,它以一定的组织形式保存在存储介质上。
6. 在数据库系统中,应用程序可以不通过数据库管理系统而直接访问数据文件吗?
答:不能
7. 数据独立性指的是什么?它能带来哪些好处?
答:数据独立性是指应用程序不会因数据的物理表示方式和访问技术的改变而改变,即应用程序不依赖于任何特定的物理表示方式和访问技术,它包含两个方面:逻辑独立性和物理独立性。
物理独立性是指当数据的存储位置或存储结构发生变化时,不影响应用程序的特性;
逻辑独立性是指当表达现实世界的信息内容发生变化时,不影响应用程序的特性。
8. 数据库系统由哪几部分组成,每一部分在数据库系统中的作用大致是什么?
答:数据库系统一般包括数据库、数据库管理系统(及相应的实用工具)、应用程序和数据库管理员四个部分。数据库是数据的汇集,它以一定的组织形式保存在存储介质上;数据库管理系统是管理数据库的系统软件,它可以实现数据库系统的各种功能;应用程序专指以数据库数据为基础的程序,数据库管理员负责整个数据库系统的正常运行。
第2章 数据模型与数据库结构
1.解释数据模型的概念,为什么要将数据模型分成两个层次?
答:答:数据模型是对现实世界数据特征的抽象。数据模型一般要满足三个条件:第一是数据模型要能够比较真实地模拟现实世界;第二是数据模型要容易被人们理解;第三是数据模型要能够很方便地在计算机上实现。由于用一种模型来同时很好地满足这三方面的要求在目前是比较困难的,因此在数据库系统中就可以针对不同的使用对象和应用目的,采用不同的数据模型。根据模型应用的不同目的,将这些模型分为两大类:概念层数据模型和组织层数据模型,以方便对信息的描述。
2.概念层数据模型和组织层数据模型分别是针对什么进行的抽象?
答:概念层数据模型是对现实世界的抽象,形成信息世界模型,组织层数据模型是对信息世界进行抽象和转换,形成具体的DBMS支持的数据组织模型。
3.实体之间的联系有哪几种?请为每一种联系举出一个例子。
答:实体之间的联系有一对一、一对多和多对多三种。例如:系和正系主任是一对一联系(假设一个系只有一个正系主任),系和教师是一对多联系(假设一个教师只在一个系工作),教师和课程是多对多联系(假设一个教师可以讲授多门课程,一门课程可由多个教师讲授)。
4.说明实体-联系模型中的实体、属性和联系的概念。
5.指明下列实体间联系的种类:
(1)教研室和教师(设一个教师只属于一个教研室,一个教研室可有多名教师)。
(2)商品和顾客。
(3)国家和首都(假设一个国家的首都可以变化)。
(4)飞机和乘客。
(5)银行和账户。
(6)图书和借阅者。(设一个借阅者可同时借阅多本书,可在不同时间对同一本书借阅多次)
6.数据库系统包含哪三级模式?试分别说明每一级模式的作用?
答:数据库系统包含的三级模式为:内模式、模式和外模式。外模式是对现实系统中用户感兴趣的整体数据结构的局部描述,用于满足不同数据库用户需求的数据视图,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是对数据库整体数据结构的子集或局部重构。模式是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。内模式是对整个数据库的底层表示,它描述了数据的存储结构。
7.数据库管理系统提供的两级映像的作用是什么?它带来了哪些功能?
答:数据库系统的两级映象是模式与内描述间的映象和外模式与模式间的映象。模式/内模式的映象带来了物理独立性,即如果数据库的存储结构改变了,可通过调整模式/内模式的映象,使模式能够保持不变。外模式/概念模式间的映象带来了逻辑独立性,当概念模式的结构可发生改变时,也可通过调整外模式/模式间的映象关系,使外模式可以保持不变。
8.数据库三级模式划分的优点是什么?它能带来哪些数据独立性?
答:数据库的三级模式的划分实际上将用户、逻辑数据库与物理数据库进行了划分,使彼此之间的相互干扰减到最少。这三个模式的划分实际上带来了两个数据独立性:物理独立性和逻辑独立性。这使得底层的修改和变化尽量不影响到上层。
第3章 关系数据库
1. 试述关系模型的三个组成部分。
答:关系数据结构、关系操作集合和关系完整性约束。
2. 解释下列术语的含义:
(1) 笛卡尔积:设D1,D2,…,Dn为任意集合,定义笛卡尔积D1,D2,…,Dn为:
D1×D2× …×Dn ={(d1,d2,…,dn) | di ∈Di,i=1,2,…,n }
GitHub地址:https://github.com/lin-lx/wx-demo.git
【1】创建内容:alt+insert
【2】main方法:psvm
【3】输出语句:sout
【4】复制行:ctrl+d
【5】删除行:ctrl+y
【6】代码向上/下移动:Ctrl + Shift + Up / Down
【7】搜索类: ctrl+n
【8】生成代码 :alt + Insert(如构造函数等,getter,setter,hashCode,equals,toString)
【9】百能快捷键 : alt + Enter (导包,生成变量等)
【10】单行注释或多行注释 : Ctrl + / 或 Ctrl + Shift + /
【11】重命名 shift+f6
【12】for循环 直接 :fori 回车即可
【13】代码块包围:try-catch,if,while等 ctrl+alt+t
【14】 代码自动补全提示: alt+/
【16】代码一层一层调用的快捷键:
前进:ctrl + alt + -->
后退:ctrl + alt + <--
【17】显示代码结构 : alt + 7
【18】显示导航栏: alt +1 【19】撤回:ctrl+z
【20】REDO操作:ctrl+shift+z
【21】缩进:tab 取消缩进: shift+tab
目录 1 File类的使用1.1 File类概述1.2 File类的常用构造器1.3File的常用方法 2 IO流原理及流的分类2.1 IO流原理2.2 流的分类2.3 流的体系结构 3 节点流(文件流)3.1 字符输入流(FileReader)3.2 字符输出流(FileWrite)3.3 字节输入流(FileInputStream)与字节输出流(FileOuputStream) 4 处理流之一:缓冲流4.1缓冲流简介4.2 缓冲流的使用 5 处理流之二:转换流5.1 转换流简介5.2 转换流的使用5.3 编码解码的解释 6 标准的输入输出流6.1 标准输入输出流简介6.2 标准输入输出流使用 7 打印流7.1 打印流简介 8 数据流8.1 数据流简介8.2 数据流的使用 9 对象流9.1 对象流简介9.2 对象的序列化机制9.3 对象流的使用9.4 自定义类的序列化 10 随机存取文件流10.1 随机存取文件流简介10.2 随机存取文件的使用 本节练习ex1ex2ex3ex4ex5ex6 1 File类的使用 1.1 File类概述 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录
File对象可以作为参数传递给流的构造器
1.2 File类的常用构造器 相对路径与绝对路径
相对路径:相较于某个路径下,指明的路径
绝对路径:包含盘符在内的文件或文件目录的路径对于路径的分割符号
window:\
unix:/ @Test public void test1(){ //构造器1 File file1 = new File("
1.1 adminLTE介绍 1、adminLTE 介绍 1、基于Bootstrap3高度可定制的响应式管理模板,免去前端架构师大量的js和css的编写
2、adminLTE除了可以使用bootstrap3的大多数样式之外,自身也提供了一些非常实用的样式包装,并且在样式演示中已经基本罗列出来了。
3、adminLTE的插件中使用的基本都是bootstrap和jquery的插件。
2、adminLTE 功能 1、AdminLTE 也同样具备了后台应有模板,像登录模板、注册模板、个人模板、404模板、500模板、空白模板等,这些可以在下载后在 Examples 菜单里查看到。
2、里面的组件 Widgets 页面,不要以为是一些像 easyui 的组件,其实也是 AdminLTE 定义的一些css 样式,像 box 样式,是里面最基础最常用的一个。
3、里面的 js 插件除了bootstrap自带那模态窗、导航、下拉菜单外,其它就是集成一些有名的第三方插件,像 select2、CK Editor、iCheck、DataTables 等等。
3、网址 1、adminLTE官网:https://adminlte.io/
2、官方模板:http://adminlte.la998.com/
1.2 基本使用(base.html) 1、利用adminLTE完成最基础后台界面(base.html) base.html
<!DOCTYPE html> <html> <head> <meta charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="refresh" content="{% block refresh_time %}{% endblock %}"> <title>{% block title %}{% endblock %}{% if settings.SITE_TITLE %} | {{ settings.SITE_TITLE }}{% endif %}</title> <meta content="
seata 下载 http://seata.io/en-us/blog/download.html
选择自己的版本下载
seata和nacos整合开发分布式 第一步 配置seata的服务器端的数据库 1、全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table
2、建立一个数据库名字随意(我起的名字——seata)用来做seata服务端的库,存储全局事务的会话信息
3、拿到服务端数据库的脚本文件执行并且建立表第0步三张表
https://github.com/seata/seata/tree/1.2.0/script/server/db
上面地址可以拿到数据库脚本,选择mysql然后自己执行
第二步 修改服务端启动包的文件 1、启动包: seata–>conf–>file.conf,修改store.mode=“db”
2、修改自己的db连接信息
这些信息是存在file.conf当中的也就是seata启动的时候会去读取这个配置文件;如果我们使用nacos可以把这些信息放到nacos的注册中心;从而实现动态更新;
如果你需要把这些信息放到nacos配置中心就需要修改seata–>conf–>registy.conf文件当中的注册中心和配置中心的信息,修改成为nacos;(为什么需要修改config和register呢?因为如果你的seata服务器想要去配置中心读取配置,那么一定到得把自己注册到nacos;所以registy.conf当中需要配置注册中心的地址也需要配置配置中心的地址)
这样我们如果后面启动seata就可以看到他是作为了一个nacos的客户端注册到了nacos的注册中心的;记住这点seata已经可以作为客户端注册到nacos了;
第三步 把配置信息上传到nacos配置中心 1、启动nacos
2、https://github.com/seata/seata/tree/1.2.0/script/config-center到这个地址上面获取config.txt,然后把config.txt当道idea当中去编辑;推荐使用idea编辑;因为可能有编码原因;保留自己想要的信息
我这里给出的是精简后的,你们需要自己对应修改自己的信息;主要是数据库配置信息
注意这些信息是服务器端和客户端都要使用的;
由于上面我们已经把seata注册到了nacos;所以他的file.conf当中的信息可以直接从nacos读取;也就是下面我们配置的信息;换句话说如果你配置了seata作为nacos的一个客户端去读取配置那么file.conf可以不用配置了;这两步是重复的;这也是网上很多资料没有说明的;
换成大白话的意思就是你如果配置了registy.conf那么file.conf当中的信息基本无效——都是从配置中心读取;甚至可以删了file.conf;你们可以自己测试;如果你不配置registy.conf,那么seata就会从file.conf当中读取配置;所以file.conf和registy.conf其实只需要配置一个;
精简后的配置如下 #事务分组——my_test_tx_group 这值会在我们客户端对应,需要注意 service.vgroupMapping.my_test_tx_group=default service.default.grouplist=127.0.0.1:8091 store.mode=db store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://ip::3306/seata?useUnicode=true store.db.user=username store.db.password=password store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 那么这些精简后的配置如何传到nacos呢?
https://github.com/seata/seata/tree/1.2.0/script/config-center
从上面这个地址下载nacos文件下面的nacos-config.sh文件然后执行
sh 你下载后的路径/nacos-config.sh;当然如果你的nacos地址断后不上默认的,需要修改naocs-config.sh当中指定你的路径;也可以在sh命令后面指定;
https://github.com/seata/seata/tree/1.2.0/script/config-center这个地址里面有个readme文件有说明
执行完成之后,你可以看到nacos的配置中心上面多了很多配置;注意这个时候seata服务器用的就是这些配置了;你可以修改一个错误的试试是不能启动seata服务器的
第四步 启动seata服务器 讲道理可以启动成功——注意不要用jdk11;
第五步 建立微服务项目----以spring cloud为例 maven引入seata-spring-boot-starter、spring-cloud-alibaba-seata这两个jar
其中seata-spring-boot-starter选择你对应的seata版本比如1.2;但是spring-cloud-alibaba-seata这个jar当中自动依赖了seata-spring-boot-starter但是版本对应不上;比如spring-cloud-alibaba-seata当中依赖的seata-spring-boot-starter可能是0.9;所以需要剔除他;什么意思呢?
<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>你的版本比如1.2.0</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-seata</artifactId> <!
法向量材质介绍和使用 1.法向量材质介绍2.demo说明3.demo代码 1.法向量材质介绍 MeshNormalMaterial渲染出来的每一面颜色都稍有不同,即使在物体旋转时,这些颜色基本保持原来的位置,之所以这样,是因为每一个面的颜色是从该面向外指的法向量计算得到,法向量即与面垂直的向量,在 three.js 库中法向量有着广泛的应用。它可以用来决定光的反射方向,在三维物体上映射材质时起到辅助作用。还可以在计算光照、阴影时提供有用信息,从而为物体表面像素上色。
MeshNormalMaterial材质的属性也比较少,有如下几个属性可以设置
属性描述wireframe是否显示线框wireframeLinewidth线框的宽度shading(移除)该属性用来设置着色方法,THREE.FlagShading表示平面着色,THREE.SmoothShading表示平滑着色flatShading(替换shading)该属性用来设置着色方法,是否用平面着色器着色,true:表示平面着色,false:表示平滑着色 2.demo说明 如上图,该示例支持以下功能
调整visible属性控制物体是否显示通过勾选transparent和调整opacity属性控制物体透明度通过勾选wireframe属性控制物体是否为线框通过勾选arrows属性控制是否展示法向量辅助对象通过下拉选择side属性控制渲染前面、后面、全部通过下拉选择shadow属性控制物体使用平面着色还是平滑着色通过下拉选择mesh属性控制页面绘制球体、方块还是平面 3.demo代码 <template> <div> <div id="container"></div> <div class="controls-box"> <section> <el-row> <el-checkbox v-model="properties.visible">visible</el-checkbox> </el-row> <el-row> <el-checkbox v-model="properties.transparent">transparent</el-checkbox> </el-row> <el-row> <el-checkbox v-model="properties.wireframe">wireframe</el-checkbox> </el-row> <el-row> <el-checkbox v-model="properties.arrows">arrows</el-checkbox> </el-row> <el-row> <div v-for="(item,key) in properties" :key="key"> <div v-if="item&&item.name!=undefined"> <el-col :span="8"> <span class="vertice-span">{{item.name}}</span> </el-col> <el-col :span="13"> <el-slider v-model="item.value" :min="item.min" :max="item.max" :step="item.step" :format-tooltip="formatTooltip"></el-slider> </el-col> <el-col :span="3"> <span class="vertice-span">{{item.value}}</span> </el-col> </div> </div> </el-row> <el-row> <el-col :span="8" class="label-col"><label>side</label></el-col> <el-col :span="
文章目录 一、ES集群安装配置1、ES1的部署2、ES2的部署3、ES1、ES2安装管理插件 二、在生产服务器上部署Logstash收集日志1.downloads 软件包2.Logstash 向es集群写数据(测试)3.下面演示一下如何收集系统日志(测试) 三、Kafka集群安装配置1、kafka12.配置zookeeper集群3.创建zookeeper所需要的目录4、验证.启动kafka 四、Kafka集群部署logstashkafka1&kafka2&kafka3安装logstash三台kafak编写logstash配置文件webserver1上写入测试内容三台kafka启动logstash(注意顺序1>2>3)查看es管理界面 ES集群: http://10.11.67.32:9200/ http://10.11.67.33:9200/ http://10.11.67.32:9200/_plugin/head/ http://10.11.67.33:9200/_plugin/kopf kibana服务器: http://10.11.67.32:5601/ kafka集群: 10.11.67.19 kafka-1 10.11.67.20 kafka-2 10.11.67.21 kafka-3 生产服务器 web-server:10.11.67.69 Kafka消息队列中间件介绍
Apache kafka是消息中间件的一种,是一种分布式的,基于发布/订阅的消息系统。能实现一个为处理实时数据提供一个统一、高吞吐、低延迟的平台,且拥有分布式的,可划分的,冗余备份的持久性的日志服务等特点。kafka是一个消息队列服务器。kafka服务称为broker(中间人), 消息发送者称为producer(生产者), 消息接收者称为consumer(消费者);通常我们部署多个broker以提供高可用性的消息服务集群.典型的是3个broker;消息以topic的形式发送到broker,消费者订阅topic,实现按需取用的消费模式;创建topic需要指定replication-factor(复制数目, 通常=broker数目);每个topic可能有多个分区(partition), 每个分区的消息内容不会重复
业务层可以直接写入到kafka队列中,不用担心elasticsearch的写入效率问题
Kafka的术语
kafka-broker:中间人
webserver/logstash-producer:消息生产者/消息发送者
elasticsearch-consumer:消费者
logs-topic:话题
replication-facter:复制数目-中间人存储消息的副本数=broker数目
一个topic有多个分区partition:
Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻);一个Topic中的每个partions,只会被一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。
一、ES集群安装配置 1、ES1的部署 1.安装java-1.8.0以及依赖包(每台服务器都安装JAVA)
[root@elk-node1 ~]# yum -y install epel-release
[root@elk-node1 ~]# yum install -y java-1.8.0 git wget lrzsz
缓存该包–downloadonly --downloaddir=./
2.获取es软件包
[root@elk-node1 ~]# wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
[root@elk-node1 ~]# tar -xf elasticsearch-1.7.3.tar.gz -C /usr/local
作者:王易诺,人工智能算法工程师,Python/C++ 程序员,推理/科幻小说作者。曾于高中获得全国青少年信息学奥林匹克联赛一等奖。
现已取得复旦大学计算机科学技术学士学位,以及爱丁堡大学计算机科学硕士学位,目前正于东京大学攻读信息科学博士学位。
主要研究方向包括自然语言处理、深度学习中的跨模态任务等。
前 言 首先得声明一下,本文不是在黑 Python。
事实上已经有非常多的程序员朋友在用 Python 做项目,但在使用的过程中,也常常碰到过一些坑,凡用过一段时间的人也该深有体会。哪怕是资深大佬,很多时候也很难避免。
Python 的坑也许还有更多,很想听到各位的见解或经历,欢迎留言,小编将挑选 3 名精彩留言的读者,送上一本图灵 Python 类图书。(统计截止时间:11月9日 12:00)
What the f**k! Python! GitHub 上有一个项目叫做 “wtfpython”,目的就是记录那些 Python 程序猿总会感到 “What the f**k!” 的瞬间。我把这个项目的地址贴在下面,然后从里面摘录几个最经典的例子出来。
https://github.com/satwikkansal/wtfpython 首先,一些关于字符串的 “基本” 操作 1
2
3
说明: 1. 这些行为是由于 Cpython 在编译优化时,某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[string interning])。
2. 发生驻留之后,许多变量可能指向内存中的相同字符串对象(从而节省内存)。
3. 在上面的代码中,字符串是隐式驻留的。何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:
所有长度为 0 和长度为 1 的字符串都被驻留。
字符串在编译时被实现( 'wtf' 将被驻留,但是 ''.join(['w', 't', 'f']) 将不会被驻留)
字符串中只包含字母,数字或下划线时将会驻留,所以 'wtf!' 由于包含 ! 而未被驻留。
当在同一行将 a 和 b 的值设置为 "
Chrome浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
Firfox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releases
IE浏览器驱动下载地址:http://docs.seleniumhq.org/download/
Edge浏览器驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Safari:
https://webkit.org/blog/6900/webdriver-support-in-safari-10/
docker这种报错一般情况都是docker未启动对于这种情况只用重启docker就行了:
service docker restart
还有一种情况则是docker配置文件出错按照提示查看报错,并找到相应位置进行更改:
systemctl status docker.service 或 journalctl -xn
对于初学者且很难找到报错位置并改正的同学,推荐一个快速的方法—重装大法
cd /var/lib/docker
rm –rf *
service docker restart
ps:如果在删除docker文件时报错删除不了,可以选择删除docker或者暂停docker yum remove docker
ps:有一个同学使用Ubuntu安装遇到下面问题
刚在新的Centos上安装Docker,后运行docker run hello-world报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决办法
$ systemctl daemon-reload
$ sudo service docker restart
$ sudo service docker status
$ sudo docker run hello-world
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
此文章来源于项目官方公众号:“AirtestProject”
前言 花了整整5个小时整理的Airtest教程干货汇总,赶紧先收藏起来以后慢慢看!
1.各种官方教程文档: 1)官方教程文档:https://airtest.doc.io.netease.com/
2)Airtest API文档:https://airtest.readthedocs.io/zh_CN/latest/
3)poco API文档:https://poco.readthedocs.io/zh_CN/latest/index.html
4)Airtest官方博客:https://juejin.im/user/1275089221067928
2.各种官网地址: 1)AirtestProject项目官网:http://airtest.netease.com/
2)AirtestIDE下载官网:http://airtest.netease.com/changelog.html
3)Airtest开源地址:https://github.com/AirtestProject/Airtest
4)poco开源地址:https://github.com/AirtestProject/Poco/
5)企业级自动化解决方案-私有云:https://airlab.163.com/b2b
3.与官方交流 1)官方公众号:AirtestProject
2)官方答疑Q群:1群437119175(已满)、2群1017250147(仅剩少量名额)
4.常见api的详细介绍 1)touch点击: https://mp.weixin.qq.com/s/rrAgQCjGKZs2pzgzG496HA
2)swipe滑动:https://mp.weixin.qq.com/s/EjVDlRtM99EW_Uw7M0dQ-Q
3)text输入: https://mp.weixin.qq.com/s/WyqNa9-riLIpzEBEemT2GQ
4)keyevent大全:https://mp.weixin.qq.com/s/HXZVd1uwaOd9gt7IVBGNDQ
5)Assert断言: https://mp.weixin.qq.com/s/DEe-Emyi0hN0JZA83i1Wmg
5.测试框架教程 1)poco的元素定位: https://mp.weixin.qq.com/s/PYI-kGWZCpoaxe2Tmw5d5Q
2)poco常用api介绍: https://mp.weixin.qq.com/s/PonBynNPfLqaWzp2oc689Q
3)在IDE中使用airtest-selenium:https://mp.weixin.qq.com/s/Fw5O8dXQ3bAX8UoyWuW9Lw
4)selenium常用api介绍:https://mp.weixin.qq.com/s/USSITxVH9ebueyIfSPhbSw
6.基础知识教程 坐标相关 1)Airtest和poco的坐标系介绍(绝对坐标与相对坐标):https://mp.weixin.qq.com/s/6yu0gjCEZQ_x6NwEY_rBjQ
截图相关 2)截图识别失败、提高截图脚本兼容性01:https://mp.weixin.qq.com/s/M5RXb9Gts_nMGHODovjQew
3)截图识别失败、提高截图脚本兼容性02:https://mp.weixin.qq.com/s/lOK5lrBlmd6CGAleCZ1KwA
4)Airtest的截图识别算法介绍:https://mp.weixin.qq.com/s/cGFvU9C7mBpsmnWgDLPW5A
报告相关 5)生成、导出报告全攻略:https://mp.weixin.qq.com/s/NDCcs4egVFe4Bngg_qjfjA
6)用脚本实现自动发送测试报告到指定邮箱:https://mp.weixin.qq.com/s/a23cKOBYU9jOcw6VSEcBRg
7)用命令行生成、导出报告:https://mp.weixin.qq.com/s/bc-xcCmbgHLKP9cMdhS97g
iOS自动化 8)iOS应用自动化实操: https://mp.weixin.qq.com/s/XEqsOxIhXGjpGhUzCe4RXw
9)模拟清除iOS后台应用:https://mp.weixin.qq.com/s/wfXATdx_U5gpwIQcSQHe2g
Windows自动化 10)Windows自动化实操: https://mp.weixin.qq.com/s/SaBCwYHTF8mnNLjBlnzt7w
11)IDE连接Windows窗口相关问题:https://mp.weixin.qq.com/s/sFdxHOXt9nIM326pnK0UGw
设备连接相关 12)各种连接设备的接口介绍:https://mp.weixin.qq.com/s/znYi-eCifeMXfce9GDpW-w
13)连接安卓模拟器的常见问题:https://mp.weixin.qq.com/s/us4Jr9t21nNyKs-bGD9yyg
14)连接模拟器的案例实操:https://mp.weixin.qq.com/s/2_K4AKCfHQ59wgedXZ23wA
安卓微信小程序 15)测试安卓的微信小程序:https://mp.weixin.qq.com/s/R02Ac3ZC1B_ND7QVik_Z8Q
7.常见问题及解决办法 1)录制脚本运行的视频: https://mp.weixin.qq.com/s/3JsVjwikjo4OmtcjvmktRw
2)Yosemite输入法的相关问题:https://mp.weixin.qq.com/s/LnzToiXFVcfkeOGz8Vz9Pw
3)IDE的安卓小助手: https://mp.weixin.qq.com/s/EH0aQnr2AwG0MmFdgoE7mw
4)模拟滑动解锁、多指滑动等:https://mp.weixin.qq.com/s/JiIT0CkiY7zcdqUo-AI0GQ
5)局部截图和局部找图功能:https://mp.weixin.qq.com/s/Kd_EQit9UG5CLxw-EHM1Uw
使用百度地图过程中常常需要给某个区域添加边界,这里有两种方法:
一种是使用百度地图自带的Boundary方法,通过输入区域名称可自动给地图添加边界
不足:这种方法只适用于省市区级行政区域的,如果想自定义区域增加边界,则不能使用该方法
code:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script> <title>添加行政区划</title> </head> <body> <div id="allmap"></div> </body> </html> <script type="text/javascript"> // 百度地图API功能 var map = new BMap.Map("allmap"); map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5); map.enableScrollWheelZoom(); function getBoundary(){ var bdary = new BMap.Boundary(); bdary.get("北京市海淀区", function(rs){ //获取行政区域 map.clearOverlays(); //清除地图覆盖物 var count = rs.boundaries.length; //行政区域的点有多少个 if (count === 0) { alert('未能获取当前输入行政区域'); return ; } var pointArray = []; for (var i = 0; i < count; i++) { var ply = new BMap.
今天看到《码农》的一本杂志里的一篇文章,说用Python+PythonCarrd做一只电子宠物,于是好奇地用Python+tkinter做了起来
一、 绘制素材 我用的3D画图软件是MagicaVoxel,因为技术渣,啊不是,因为这不是重点,所以只是随便画画。
二、 思考算法 书上的太普通了,我要自己思考算法
把宠物的一天分为60个部分每部分24分钟,相当于人的一天宠物在50个部分醒着,10个部分睡觉宠物有饥饿度,伤心度,健康度,疲劳度,范围为1 ~ 10宠物可以睡觉,醒着却什么也不做,看病,吃饭,玩耍,散步所以要六张照片睡觉时,疲劳度每部分时间 - 2吃饭时,饥饿度每部分时间 - 2看病时,健康度每部分时间 - 2散步时,伤心度每部分时间 - 1 ,疲劳度每部分时间 + 1玩耍时,伤心度每部分时间 - 2 ,疲劳度每部分时间 + 2如果宠物睡觉时被叫醒(做任何事都回让宠物醒),伤心度 + 2如果饥饿度低于5,每部分时间伤心度增加 5 - 当前饥饿度如果饥饿度低于3,每部分时间健康度增加 3 - 当前饥饿度如果疲劳度高于7,宠物会睡到疲劳度低于 5在玩家关闭窗口后(在mainloop()函数后),将当前时间写入sqlite数据库在玩家再次打开游戏时,计算过去了多少部分时间,更改数值在玩家离线时,宠物会睡觉或醒着却什么也不做 三、 发布项目 我看了看上面的算法,觉得这是一个大项目,于是把他发布到了GitHub
项目地址是ttzc/ElectronicPet
天天早晨:Python+tkinter开发一个电子宠物(2 按钮)zhuanlan.zhihu.com 本文同步发布在简书
Python+tkinter开发一个电子宠物(1 开始)www.jianshu.com