Other

打印三角形

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日志管理工具 一、获得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 的名称,就是输出的位置,是控制台还是文件。。。

break continue goto

1. break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用) 2. continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。 3. 关于goto关键字 goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。 “标签”是指后面跟一个冒号的标识符,例如: label: 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。

尚硅谷JavaScript高级学习笔记

数据类型 分类 基本(值)类型 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.

2-STM32F407+ESP8266程序升级篇(自建物联网平台)-STM32通过ESP8266使用http或https下载程序文件,升级程序(手机APP控制更新)

<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.

MySQL 学习

基础篇 通用语法及分类 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

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

k8s工作节点组件状态报ContainerCreating,未获取到ip地址

无法创建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状态和节点状态,都正常    

二分查找等于target、第一个小于等于target、第一个大于等于target的值

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