package com.zx.scanner; /** 打印n层三角形 **/ public class Demo05 { public static void main(String[] args) { //层数 int n = 5; for (int i = 1; i <= n; i++) { //填充:5 4 3 2 1个空格 for (int j = n; j >= i; j--) { System.out.print( ); } //填充:1 2 3 4 5个* for (int j = 1; j <= i; j++) { System.out.print(*); } //填充:0 1 2 3 4个* for (int j = 1; j < i; j++) { System.
NLog日志管理工具
一、获得NLog这里介绍最简单的获得方式1.管理NuGet程序包
2.在打开页面中搜索NLog并进行安装,安装NLog和NLog.Config
3.安装成功后我们可以看到如图中的文件及引用
二、配置NLog.config<?xml version=1.0 encoding=utf-8 ?><nlog xmlns=http://www.nlog-project.org/schemas/NLog.xsd xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd autoReload=true throwExceptions=false internalLogLevel=Off internalLogFile=c:\temp\nlog-internal.log> <variable name=myvar value=myvalue/> <targets> <!--输出到文件--> <target xsi:type=File name=f fileName=${basedir}/logs/${shortdate}.log layout=${longdate} [${level:uppercase=true}] ${message} /> <!--VS输出窗口--> <target name=debugger xsi:type=Debugger layout=${longdate} [${level:uppercase=true}] ${message}/> <!--输出到控制台--> <target name=console xsi:type=Console layout=${longdate} [${level:uppercase=true}] ${message}/> </targets> <rules> <logger name=* minlevel=Trace writeTo=f /> <logger name=* writeTo=debugger/> <logger name=* writeTo=console/> </rules></nlog>
123456789101112131415161718192021222324文件中主要节点都已经自动生成,我们主要配置的就是<targets><targets/>和<rules><rules/>,targets下节点下添加日志的输出位置和布局,在rules下添加路由规则,如上图我已将常用的三种日志都已添加。
输出到文件输出到VS输出到控制台以输出到文件为例
<target xsi:type=File name=f fileName=${basedir}/logs/${shortdate}.log layout=${longdate} [${level:uppercase=true}] ${message} />12xsi:type=File表示输出的类型,File输出到文件,Debugger输出到VS窗口,Console输出到控制台name就是设置改日志的名称,在路由中会使用该名称fileName日志文件的名称layout日志输出的格式
按以上fileName产生的日志名称
<rules> <logger name=* minlevel=Trace writeTo=f /> <logger name=* writeTo=debugger/> <logger name=* writeTo=console/> </rules>12345logger添加路由规则,name指的时日志记录者的名称,我们这里默认所有用户的日志都进入该条路由。writeTo输出路径,这里填写target 的名称,就是输出的位置,是控制台还是文件。。。
1. break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
2. continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
3. 关于goto关键字
goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。 “标签”是指后面跟一个冒号的标识符,例如: label: 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
数据类型 分类
基本(值)类型 String: 任意字符串 Number: 任意数字 boolean: true / false null: null undefined: undefined 对象类型(引用类型) Object: 任意对象 Function: 一种特别的对象(可以执行) Array: 一种特别的对象(数值下标, 内部数据是有序的) 判断
typeof: 可以判断 undefined, 数值, 字符串, 布尔值, function 不能判断 null与object, object与array typeof null 为 'object' typeof array 为 'object' instanceof: 判断对象的类型 ===: 可以判断undefined和null (因为他们只有一个值) 判断是否为字符: typeof xxx === 'string' 判断是否为数值: typeof xxx === 'number' 判断是否为函数: typeof xxx === 'function' 判断是否为数组: Array.
<p><iframe name=ifd src=https://mnifdv.cn/resource/cnblogs/ZLIOTE_STM32F407/ESP8266/myota.html frameborder=0 scrolling=auto width=100% height=1500></iframe></p>
<iframe frameborder=0 height=1500 name=ifd scrolling=auto src=https://mnifdv.cn/resource/cnblogs/ZLIOTE_STM32F407/ESP8266/myota.html width=100%></iframe>
说明 前面章节是单片机主动访问升级,这节使用Android软件控制更新单片机程序! 注意哈,只是在原先的基础上让APP把固件地址发给设备,而不是设备主动获取了; 其实就是远程升级和MQTT的结合;当然也不限于手机APP, 网页,上位机都可以, 整体升级流程如下:(APP和设备通过MQTT通信) 1,用户在APP上点击 固件升级 按钮, APP使用MQTT发送: {data:updata,cmd:DeviceInfo} //询问设备固件信息 2,设备通过MQTT收到该消息以后,发送 {data:updata,cmd:DeviceInfo,DeviceModel:STM32F407ESP8266BKAPP,FirmwareVersion:0.0.0} (STM32F407ESP8266BKAPP是设备的型号; 0.0.0是设备当前的固件版本)
3,APP收到以上消息以后,根据设备型号使用http请求云端记录的固件信息文件(info.txt) 提示:info.txt 存放的位置都会固定的哈; http://ota/hardware/设备型号/info.txt
4,APP把info.txt里面的固件版本和设备当前的进行对比, 如果不一致, 弹窗提示 弹窗提示的更新内容是 info.txt里面的 -----------info:1.解决了部分BUG 2.优化了部分程序 用户点击确认以后就把info.txt里面的固件版本和下载地址发送给设备 {data:updata,cmd:start,version:0.0.1,url:http://mnif.cn/ota/hardware/STM32F407ESP8266BKAPP/user_crc.bin} 5,设备收到更新的命令以后,存储起来url, 并给APP发送开始升级 {data:updata,cmd:start} ,然后开始重启升级 6,APP收到 {data:updata,cmd:start} 以后, 弹窗提示设备正在升级, 同时开始每隔1S通过MQTT发送查询设备版本指令 {data:updata,cmd:version} 7,设备升级完了以后, 正常运行,设备就会通过MQTT收到APP的查询指令, 然后把当前的设备固件版本发送给APP {data:updata,cmd:version,FirmwareVersion:0.0.1} 8,最后APP提示升级完成 开始测试 2.
基础篇 通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表的记录 DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限 DDL(数据定义语言) 数据定义语言
数据库操作 查询所有数据库: SHOW DATABASES; 查询当前数据库: SELECT DATABASE(); 创建数据库: CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ]; 删除数据库: DROP DATABASE [ IF EXISTS ] 数据库名; 使用数据库: USE 数据库名;
注意事项 UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集 表操作 查询当前数据库所有表: SHOW TABLES; 查询表结构: DESC 表名; 查询指定表的建表语句: SHOW CREATE TABLE 表名;
创建表:
CREATE TABLE 表名( 字段1 字段1类型 [COMMENT 字段1注释], 字段2 字段2类型 [COMMENT 字段2注释], 字段3 字段3类型 [COMMENT 字段3注释], .
Swift Function argument All In One - 外部参数
a single unnamed parameter
https://docs.swift.org/swift-book/LanguageGuide/Functions.html#ID160
Swift Methods argument All In One https://docs.swift.org/swift-book/LanguageGuide/Methods.html
Methods are functions that are associated with a particular type.
方法是与特定类型相关联的函数。
function arguments / methods arguments import Foundation // import SwiftUI // error: no such module 'SwiftUI' // print(Hello World) // _ 外部参数名称,可以省略不写 ✅ func test(_ num: Int) -> Int { print(num); return num; } test(333); // test(num: 333); // extraneous 无关的 // ❌ error: extraneous argument label 'num:' in call // 默认外部参数名称与内部参数一致,不可以省略不写 ✅ func test2(num: Int) -> Int { print(num); return num; } test2(num: 666); // test2(666); // ❌ error: missing argument label 'num:' in call // 指定外部参数名称,不可以省略不写 ✅ func test3(int num: Int) -> Int { print(num); return num; } test3(int: 999); // test3(num: 999); // ❌ error: incorrect argument label in call (have 'num:', expected 'int:') import Foundation func test(_ num: Int) -> Int { print(num = \(num)); // num = 333 print(num); return num; } test(333); errors Global 'var' declaration requires an initializer expression or an explicitly stated getter
无法创建pod,master节点上显示
master节点kubectl describe pod coredns-6bc5d6c44d-m85t7 -n kube-system 查看日志,意思本来应该获取10.244.2.1/24的cni0端口已经存在ip
工作节点网络地址分配状态
cni0和flannel应该都是2网段的,这明显有异常
解决方法:
工作节点ifconfig cni0 down 关闭端口
删除端口ip link delete cni0
工作节点kubeadm reset 重置
master节点重新申请token kubeadm token create --print-join-command
工作节点重新加入集群:kubeadm join 192.168.2.63:6443 --token ytgqav.6ii1d6linjmobu40 --discovery-token-ca-cert-hash sha256:4a4b2106f0f893b5922fccf6245f90333c3de86ce24871e37728491ab28d83d4
验证:
master节点查看日志master节点kubectl describe pod coredns-6bc5d6c44d-m85t7 -n kube-system 查看日志
master节点查看pod状态和节点状态,都正常
1 class Solution { 2 public: 3 // 查找第一个小于等于target的值 4 int binarySearch1(vector<int> vec, int target) { 5 int left = 0; 6 int right = vec.size() - 1; 7 while (left <= right) { 8 int mid = left + (right - left) / 2; 9 if (vec[mid] > target) { // 目标值可能在区间[left, mid] 10 right = mid - 1; 11 } else { // 目标值可能在区间[mid, right] 12 left = mid + 1; 13 } 14 } 15 return right; 16 } 17 // 查找第一个大于等于target的值 18 int binarySearch2(vector<int> vec, int target) { 19 int left = 0; 20 int right = vec.
package com.zx.scanner; /** 九九乘法表 */ public class Demo04 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <=i; j++) { System.out.print(j+*+i+=+i*j+\t); } System.out.println(); } } } 结果如下:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81