客户端
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using UnityEngine.UI; public class Walk : MonoBehaviour { //socket和缓冲区 Socket socket; const int BUFFER_SIZE = 1024; public byte[] readBuff = new byte[BUFFER_SIZE]; //玩家列表 Dictionary<string, GameObject> players = new Dictionary<string, GameObject>(); //消息列表 List<string> msgList = new List<string>(); //Player预设 public GameObject prefab; //自己的IP和端口 string id; //添加玩家 void AddPlayer(string id, Vector3 pos) { GameObject player = (GameObject)Instantiate(prefab, pos, Quaternion.identity); TextMesh textMesh = player.
DIY开源mini桌面i3结构3D打印机--开篇 开篇闲谈3D打印的历史从何处了解到 工作原理如何开始结束语 开篇闲谈 3D打印的历史 日常生活中使用的普通打印机可以打印电脑设计的平面物品,而所谓的3D打印机与普通打印机工作原理基本相同,只是打印材料有些不同,普通打印机的打印材料是墨水和纸张,而3D打印机内装有金属、陶瓷、塑料、砂等不同的“打印材料”,是实实在在的原材料,打印机与电脑连接后,通过电脑控制可以把“打印材料”一层层叠加起来,最终把计算机上的蓝图变成实物。通俗地说,3D打印机是可以“打印”出真实的3D物体的一种设备,比如打印一个机器人、打印玩具车,打印各种模型,甚至是食物等等。之所以通俗地称其为“打印机”是参照了普通打印机的技术原理,因为分层加工的过程与喷墨打印十分相似。这项打印技术称为3D立体打印技术。----来源于百度百科.
从何处了解到 自从从esp8266开始了解到arduino,也玩了大半年了arduino,最香的就是其中的开源库和开源项目,像mini气象站、3D打印机、四轴飞行器、各种车床、鼠标键盘、机器人、示波器…等,其中最吸引我的还是3D打印,于是一番搜索,了解到入门级i3结构打印机开源版用的是arduino MEGA 2560 R3 开发板,芯片是ATMEGA2560 ,固件开源!可以很方便的修改打印机参数,看了看腰包还是可以搞一搞,各大平台找了一波资料,收集到了打印机外形、铝材、电机、螺丝、同步带、同步齿轮等等配件参数,但是大意了啊,其中结构件是3D打印的,在淘宝上找了发现代打印有点贵,后又转向咸鱼,找了个老哥代打,价格还不错,万事俱备,开工!!!
工作原理 首先将设计好的3D模型导出为.stl文件(市场主流,也支持其他格式.OBJ、.AMF、.3MF),放入切片软件中调整你需要的参数(模型大小、打印位置、填充密度,填充格式等等)切片生成.gcode文件,然后联机打印或者导出到TF、SD卡,在打印机中打印,然后就是等待模型打印完成。
其中DIY的过程最考验的是机械组装,打印精度直接受组装影响,然后就是调平和一些小细节了,比如打印温度、热床温度、挤出倍率。。。
i3结构最突出的特点是结构简单。总建筑面积小,满足桌面要求。装配零件精度要求不高,适合新手装配。主体为龙门结构,直立的龙门负责Z轴、X轴移动,水平的负责Y轴移动,这种结构简单,但是打印的模型容易晃动,其弊端就是不能打印过快且模型不能太高,所以3D打印还有其他能解决这些问题的机型,没办法,小白就从这里开始吧!
(PS:第一张图片是开源文件里的成品图,第二张是我的打印机)
如何开始 在互联网上找到所需的配件、结构件、主控就可以开始组装了,建议刚接触打印机的小伙伴,先去了解下打印机的工作原理,各个部件的功能,还有打印过程各种bug怎样优化,有了一定的理论基础再开始上手玩3D打印
结束语 整台打印机从组装到最后能打印我大概花费了500左右,成本不高,打印精度也一般,但是对于我这种要求不高的玩家来说足够了,这台打印机的优缺点我下期再专门细讲,打印机开源资料网上很多,这里就不填坑了,如果有需要,我后面会放一期资料包,东西虽然开源但是整理不易,还望打赏一下,感谢理解!
因一次笔试中忘记如何用python创建二维数组,遂记录下来.
成功没有捷径,一定要脚踏实地.
没有使用numpy模块,若想使用numpy模块创建二维数组请移步。
一:初始化一个元素从0 - n*m的二维数组
row = int(input()) column = int(input()) dp = [[i*column + j for j in range(column) ] for i in range(row)] #第i行第j列元素=元素所在行数*总列数+该元素所在的列数 print(dp) 二:初始化一个元素全为0的二维数组
row = int(input()) column = int(input()) dp = [[0 for j in range(column)] for i in range(row)] print(dp) 三:手动输入,一个n*m的二维数组(一个一个元素输入)
row = int(input()) column = int(input()) dp = [] array = [] for i in range(row): for j in range(column): value = int(input()) array.
1)什么叫门禁系统?
门禁系统,指“门”的禁止权限,是对“门”的戒备防范。通常包括控制器,读卡器,锁,开门按钮,管理软件。像现在很多办公区、仓库、危险区、监狱等禁止外人进入的区域,都会用到门禁系统。
2)门禁系统的识别流程
常规门禁系统识别权限的流程分为五步:
① 平台软件编辑权限;
② 权限下发至门禁控制器;
③ 刷卡时,卡号信息上传至门禁控制器;
④ 门禁控制器判断刷卡权限,合法则开门,非法则不开门;
⑤ 刷卡事件上传至管理平台;
3)IC卡与ID卡的区别?
① ID卡是一种不可写入的感应卡,生活中常见的有考勤卡,门禁卡等。
门禁卡
② IC卡支持读写功能,常见的有公交卡 ,员工卡等(可用于消费)。
PS:IC卡的安全性能 远高于 ID卡的安全性能
4)读卡器是如何读取卡片信息的?
目前IC卡和ID卡常见的类型都是射频卡,运用的是无线射频技术。当卡片靠近读卡区时,卡片会自动发送信息,读卡器读取并解码信息后,将卡片信息传送至控制主机判断权限。
5)什么是韦根协议?
韦根(Wiegand)协议是国际上统一的通讯协议,有着很多的格式,为了与其他厂家进行区分,门禁产品使用的是私有韦根27和韦根35协议;
① 通常一根信号线只能接一个读卡器;
② 理论传输距离达110米,实际传输在80米左右;
6)什么是RS485协议?
RS485协议也是一种常见的通讯协议,但是各个厂家之间不通用;
① 可通过一根信号总线,采用手拉手方式串接多个读卡器;
② 传输距离相对较远,当信号波特率在19200时,传输距离可达600-800米;
7)什么是“常开常闭”?
常开常闭指的是门禁继电器的一种开关状态:
常开(NO)型指的是继电器平常时间断开,感应到信号后闭合;
继电器示意图
常闭(NC)型指的是继电器平常时间闭合,感应到信号后断开。
继电器示意图
8)门禁常见电锁
门禁系统一般常用的是三种类型的电锁:
① 磁力锁:通电吸合,断电开锁,属于常闭型,一般用于90°开的木门,玻璃门,铁门。
② 电插锁:通电上锁,断电开锁,属于常闭型,一般用于180°开的木门,玻璃门,铁门。
③ 阴极锁:断电上锁,通电开锁,属于常开型,使用场景较电插锁的小,一般用于木门,铁门。
mysql的innodb中事务日志ib_logfile(0/1)
概念:
事务日志或称redo日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在,可以手工修改参数,调节开启几组日志来服务于当前mysql数据库,mysql采用顺序,循环写方式,每开启一个事务时,会把一些相关信息记录事务日志中(记录对数据文件数据修改的物理位置或叫做偏移量);
这个系列文件个数由参数innodb_log_files_in_group控制,若设置为4,则命名为ib_logfile0~3。
这些文件的写入是顺序、循环写的,logfile0写完从logfile1继续,logfile3写完则logfile0继续。
作用:
在系统崩溃重启时,作事务重做;在系统正常时,每次checkpoint时间点,会将之前写入事务应用到数据文件中。
Ib_logfile的checkpoint field
实际上不仅要记录checkpoint做到哪儿(LOG_CHECKPOINT_LSN),还要记录用到了哪个位置(LOG_CHECKPOINT_OFFSET)等其他信息。所以在ib_logfile0的头部预留了空间,用于记录这些信息。
因此即使使用后面的logfile,每次checkpoint完成后,ib_logfile0都是要更新的。同时你会发现所谓的顺序写盘,也并不是绝对的
相关的一些数字
a) InnoDB留了两个checkpoint filed,按照注释的解释,目的是为了能够“write alternately”
b) 每个checkpint field需要的大小空间为304字节。(相关定义在log0log.h)
c) 第一个checkpoint的起始位置在ib_logfile0的第512字节(OS_FILE_LOG_BLOCK_SIZE)处;
d) 第二个在1536 (3 * OS_FILE_LOG_BLOCK_SIZE)字节处。
特点:
redo log只是记录所有innodb表数据的变化。
redo log只是记录正在执行中的dml以及ddl语句。
redo log可以作为异常down机或者介质故障后的数据恢复使用
引入一个问题:
在m/s环境中,innodb写完ib_logfile后,服务异常关闭,会不会主库能用ib_logfile恢复数据,而
binlog没写导致从库同步时少了这个事务?从而导致主从不一致;
redo日志写入方式:1.ib_logfile写入当前事务更新数据,并标上事务准备trx_prepare2.写入bin-log3.ib_logfile当前事务提交提交trx_commit
恢复方式:
如果ib_logfile已经写入事务准备,那么在恢复过程中,会依据bin-log中该事务是否存在恢复数据。
假设:1)结束后异常,因没有写入bin-log,从库不会同步这个事务,主库上,重启时,在恢复日志中这个事务没有commit,即rollback这个事务.2)结束后异常,这会bin-log已经写入,从库会同步这个事务。主库依据恢复日志和bin-log,也正常恢复此事务
综上描述:
bin-log写入完成,主从会正常完成事务;bin-log没有写入,主从库rollback事务;不会出现主从库不一致问题.
相关参数(全局&静态):
innodb_log_buffer_size
innodb_log_file_size
innodb_log_files_in_group
innodb_log_group_home_dir
innodb_flush_log_at_trx_commit
innodb_log_buffer_size:
事务日志缓存区,可设置1M~8M,默认8M,延迟事务日志写入磁盘,把事务日志缓存区想象形如"漏斗"状,会不停向磁盘记录缓存的日志记录,而何时写入通过参数innodb_flush_log_at_trx_commit控制,稍后解释,启用大的事务日志缓存,可以将完整运行大事务日志,
暂时存放在事务缓存区中,不必(事务提交前)写入磁盘保存,同时也起到节约磁盘空间占用;
innodb_log_file_size:控制事务日志ib_logfile的大小,范围5MB~4G;所有事务日志ib_logfile0+ib_logfile1+..累加大小不能超过4G,事务日志大,checkpoint会少,节省磁盘IO,但是大的事务日志意味着数据库crash时,恢复起来较慢.
引入问题:修改该参数大小,导致ib_logfile文件的大小和之前存在的文件大小不匹配
解决方式:在干净关闭数据库情况下,删除ib_logfile,而后重启数据库,会自行创建该文件;
innodb_log_files_in_group:DB中设置几组事务日志,默认是2;
innodb_log_group_home_dir:事务日志存放目录,不设置,ib_logfile0...存在在数据文件目录下
innodb_flush_log_at_trx_commit:控制事务日志何时写盘和刷盘,安全递增:0,2,1事务缓存区:log_buffer;0:每秒一次事务缓存区刷新到文件系统,同时文件系统到磁盘同步,但是事务提交时,不会触发log_buffer到文件系统同步;2:每次事务提交时,会把事务缓存区日志刷新到文件系统中去,且每秒文件系统到磁盘同步;1:每次事务提交时刷新到磁盘,最安全;
适用环境:0:磁盘IO能力有限,安全方便较差,无复制或复制延迟可以接受,如日志性业务,mysql损坏丢失1s事务数据;2:数据安全性有要求,可以丢失一点事务日志,复制延迟也可以接受,OS损坏时才可能丢失数据;1:数据安全性要求非常高,且磁盘IO能力足够支持业务,如充值消费,敏感业务;
引入ib_logfile的写入策略
1、基本概念
a)、ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0和ib_logfile.
b)、文件为顺序写入,当达到最后一个文件末尾时,会从第一个文件开始顺序复用。
c)、lsn: Log Sequence Number,是一个递增的整数。 Ib_logfile中的每次写入操作都包含至少1个log,每个log都带有一个lsn。在内存page修复过程中,只有大于page_lsn的log才会被使用。
d)、lsn的保存在全局变量log_sys中。递增数值等于每个log的实际内容长度。即如果新增的一个log长度是len,则log_sys->lsn += len.
田海立@CSDN 2021-01-20
高通的骁龙888在苏黎世联邦理工学院(ETH)的AI-Benchmark榜单上发布,并刷新了榜首位置。不过数据来自Dev Platform,采用888芯片的XiaoMI 11的分数并不那么亮眼。麒麟990 5G通过系统升级,排行也进入前三,并且头两名是后发布的芯片。
高通的骁龙888发布已有一段时间,搭载888的手机都已经正式发售,苏黎世联邦理工学院(ETH)的AI-Benchmark榜单上却迟迟不见动静。此时发布果然就再次刷新了榜首位置。
看Mobile SOC榜单(https://ai-benchmark.com/ranking_processors.html):
骁龙888采用X1超核,CPU AI性能最强;INT8最强;FP16比不上海思麒麟9000。但INT8太强远超其他,所以助其登顶。
不出所料:骁龙(Snapdragon)888、麒麟(Kirin)9000、天玑(Dimensity)1000+占据前面位置。
麒麟990 5G这里也更新了,分数已经超过天玑1000+,还记得在AI-Benchmark 4.0刚发布之初笔者在《AI Benchmark v4榜首风云:天玑1000+ vs 麒麟990 5G》里的分析吗?果然海思麒麟990 5G只是凭借系统升级就能登顶(彼时还没有麒麟9000和骁龙888,去掉这两个目前榜首的来看),只是来得晚了些,有第一、第二在,目光不会再聚焦在第三上了。
不过有一点还需注意,Phone榜单(https://ai-benchmark.com/ranking.html)中,与Mobile SOC对比,骁龙888 soc分数应该采用的Dev Platform的分数,与Phone榜单上XiaoMI 11的分数差别巨大,这个差距太大了,也许背后又有不少故事,但愿不出事故。
另外,MTK天玑1200今天也正式发布了,不过也没有出现在AI-Benchmark的榜单上。
可以预计的是,随着新移动soc尤其是各家旗舰芯片的发布,AI算力直观上的体现 -- AI-Benchmark榜单上必定又要掀起新一轮的军备竞赛。
我们拭目以待!
Python基础知识7 序字符串(2)字符串的判断字符串的常用操作字符串的替换字符串的合并 字符串的比较操作字符串的切片操作格式化字符串%作占位符{}做占位符f格式化宽度和精度的表示 字符串的编码和解码 序 非常抱歉这么久一直没有更新文章,距离上次的分享已经有了一个多月了(博主还健在),这段时间发生了很多事情(跌跌宕宕,增长了社会经验,具体也不阐述了)
好啦,废话也不多说,今天我们来分享字符串第二部分的内容吧!字符串第一部分内容如有忘记可以前去复习下Python入门基础语法知识6。
字符串(2) 字符串的判断 isidentifier()
判断指定的字符串是不是合法的标识符,符合返回值为True,反之为False;
(合法的标识符:只能包括字母、数字、下划线、汉字;不能以数字开头;纯数字不能作为标识符;不能包含非法字符、运算符、空格;)示例代码如下: a='a1_语法' b='1a_语法' c='a&b' print(a.isidentifier()) print(b.isidentifier()) print(c.isidentifier()) 运行结果如下:
"C:\Program Files\Python38\python.exe" F:/pycharm项目/py/CSDN博客/语法7.py True False False Process finished with exit code 0 isspace()
判断指定的字符串是否全部由字符串由空白字符组成;
【空白字符包括:回车(\r)、换行(\n)、水平制表符(\t)、空格】
代码示意如下: a1=' \r\n\t' print(a1.isspace()) 运行结果如下:
"C:\Program Files\Python38\python.exe" F:/pycharm项目/py/CSDN博客/语法7.py True Process finished with exit code 0 下面几个的使用方法和上面类似,为了避免内容过于冗余,顾不做过多赘述;
isalpha()
判断指定的字符串是否全部由字母组成;(包括中英文)isdecima()
判断指定的字符串是否全部由十进制数字组成;(阿拉伯数字)isnumeric()
判断指定的字符串是否全部由数字组成;(==阿拉伯数字、罗马数字、汉字的数字)isalum()
判断指定的字符串是否全部由字母和数字组成; 字符串的常用操作 字符串的替换 a、字符串的替换:replace()
字符串的替换就类似与Word中的查找替换语法格式为:str.replace(‘待替换内容’,‘替换内容’,最大替换次数)其中最大替换次数可以省略,就是相当于如果有相同的待替换内容替换几次,默认的是全部替换;
示例代码如下: text='我最喜欢的城市是上海,上海很繁华,有很多高楼大厦,上海有很多的美食' text2=text.replace('上海','长沙',1) # 替换次数为1 text3=text.replace('上海','长沙') # 默认全部替换 print(text2) print(text3) 运行结果如下:
Python语法 1.几个概念 1.1表达式 表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。表达式特点:
1.表达式一般仅仅用于计算一些结果,不会对程序产生实质性的影响
2.如果在交互模式中输入一个表达式,解释器会自动将表达式的结果输出
1.2语句 一个语法上自成体系的单位,它由一个词或句法上有关连的一组词构成语句的执行一般会对程序产生一定的影响,在交互模式中不一定会输出语句的执行结果
if 判断语句 只有符合判断语句的条件的时候,才会进入到if语句内部去执行代码,后面的代码是一个tab或者四个空格的距离。pass做占位的作用,防止报错。if语句里面的代码,我们称呼为一个代码块,代码块要么都执行,要么都不执行。 1.3程序(program) 程序就是由一条一条的语句和一条一条的表达式构成的。 1.4函数 函数就是一种语句,函数专门用来完成特定的功能函数长的形如:xxx()函数的分类:
1.内置函数 : 或者内建函数,就是由语法规定存在的函数,这些函数,包含在编译器的运行时库中,程序员不比单独书写代码实现它,只需要调用既可。
2.自定义函数 : 由程序员自主的创建的函数 当我们需要完成某个功能时,就可以去调用内置函数,或者自定义函数函数的2个要素
1.参数
2.返回值 下图为debug演示:
1.在代码前打红色断点(称呼为调试,就是帮你解决代码有问题的情况)
2.右键鼠标选择debug模式,逐行执行代码,查找问题。
注释的意思:当你运行程序的时候,你如果不想要某一行代码执行,你可以直接注释它,那么注释的那一行代码将不再执行。 2.标识符 2.1关键字 python一些具有特殊功能的标识符,这就是所谓的关键字,关键字是python已经使用的了,所以不允许开发者自己定义和关键字相同的名字的标识符
下图为查看关键词操作:
2.2标识符概念 开发人员在程序中自定义的一些符号和名称。标识符是自己定义的,如变量名 、函数名等组成:由26个英文字母大小写,数字 0-9 符号 _$标识符的规则:1.标识符中可以包含字母、数字、_,但是不能使用数字开头 例如:name1 name_1 _name1 1name(不行)
2.Python中不能使用关键字和保留字来作为标识符 保留字是 Python 语言中一些已经被赋予特定意义的单词,这就要求开发者在开发程序时,不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。
命名方式
1.驼峰命名法小驼峰式命名法: 第一个单词以小写字母开始;第二个单词的首字母大写,例如:myName、aDog大驼峰式命名法: 每一个单字的首字母都采用大写字母,例如:FirstName、LastName
2.下划线命名法
不过在程序员中还有一种命名法比较流行,就是用下划线“_”来连接所有的单词,比如 get_url buffer_size 基本数据类型 1.整数和小数 基本数据类型 数据类型指的就是变量的值的类型,也就是可以为变量赋哪些值 整数和小数 整数 : 所有整数 例如 : a = 1 b = 100 c =999 都是int类型小数常量 : 所有小数 例如 a = 1.
《深入理解计算机系统》思维导图 文章目录 《深入理解计算机系统》思维导图前言一、第1章 计算机系统漫游二、第2章 信息的表示和处理三、第5章 优化程序性能四、第7章 链接五、第9章 虚拟内存六、第10章 系统级I/O总结 前言 近期发现之前阅读CSAPP而整理的部分章节的思维导图,当初也费了不少功夫,所以现在上传希望能给其他人提供一些帮助。
这些思维导图是我结合《深入理解计算机系统》中文译本原书第3版,以及哈工大csapp课程课件制作而成。
一、第1章 计算机系统漫游 二、第2章 信息的表示和处理 三、第5章 优化程序性能 第3章的内容特别的多,我发现当时没有整理完就不上传了,第4章的内容也同样很多,更多的各种指令的理解和记忆,思维导图不好整理。所以就到了第5章。
四、第7章 链接 第6章的存储器也没整理,直接到第7章的链接。
五、第9章 虚拟内存 第8章的异常控制流也没有,我现在发现自己是有点懒。
六、第10章 系统级I/O 第11章的内容由于在计算机网络中学过了于是也就没看,12章也差不多。
总结 刨去第1章的内容,也就只有五章的内容,但是还是希望可以对你有用。
点击蓝色“奔跑吧攻城狮”关注我哟
加个“星标”,天天和你一起奔跑
这个假期过得尤其漫长,还得时不时地提防一觉醒来,假期延长的消息到来。好在,现在情况越来越好,很多地方都紧锣密鼓地进入了正轨,比如我已经通过一周的远程办公,一周的办公室办公,开开心心地投入到工作状态(我TMD有病,工作了还这么开心)。
想了下前几天,天天足不出户的日子,突然明白了原来猪的生活这么单一也这么无聊,养了我一身的肉,猪不长肉根本不存在呀。当然,趁着机会,我从自身角度总结了20个对我帮助挺大的学习网站,在这里和大家分享(排名不分先后噢)。
1. 极客时间
极客时间是极客邦科技出品的IT 类知识服务产品,内容包含专栏订阅、极客新闻、热点专题、直播、视频和音频等多种形式的知识服务。产品形态包括移动 App,移动端网站、PC 端网站、微信平台等。
极客时间也是我最近用的频率最高的平台,在这里首先安利。我现在很多知识方面的提升都在极客时间里获得,其中尤其推荐耗子叔的《左耳听风专栏》,真的是相见恨晚。
2. 知识星球
知识星球,原名小密圈,是内容创作者连接铁杆粉丝,做出品质社群,实现知识变现的工具。
很多优秀的大V都在星球入驻了,并且有很高的粘性。大V们的朋友圈你不一定能围观到,知识星球给我们提供了一个很好的机会来围观他们的所见所闻所想。
我是知识星球的重度用户,在这里看到了很多不一样的一面,开阔了视野。同时在2019年12月09日也开通了星球,记录下自己学习的点点滴滴,没准一年之后也能做一本小的精华手册。
3. GitHub — 开发者最最最重要的网站
世界上最大的同性社区网站哦,代码托管网站,上面有很多资源,想要什么轮子,上去搜就好了。并且呢,上面有很多优秀的程序员,你可以在这里交到很多好朋友喔。
4. Stack Overflow
解决 bug 的社区,开发过程中遇到什么 bug,上去搜一下,只要搜索的方式对,百分之 99 的问题都能搜到答案。
这里提供一篇我之前写的翻译,《Medium高赞系列,如何正确的在Stack Overflow提问》,欢迎前去观看,提意见。
5. 掘金
现在国内优质的开发者交流学习社区,可以去看大佬们写的文章,也可以自己分享学习心得,与更多开发者交流。认识更多的小伙伴儿,提升个人影响力。
掘金还有一个小册,我买过一个数据库的,一个Netty开发相关的,这两个册子也是很赞,而且价钱也不贵,还能和作者进行深度交流,简直了。
6. CSDN网站
创立于1999年,致力于为中国软件开发者提供知识传播、在线学习、职业发展等全生命周期服务,是一个老牌社区。
2019年开始,尝试了很多的改版,推出了付费阅读、原力计划、新的排名机制等等,对于热爱技术的、探索技术的你来说绝对不能错过。
7. 博客园
博客园创立于2004年1月,是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识,从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。很多早期的高质量内容都在博客园。
我在2017年写过一篇《别了,杭州》,收到很多读者的共鸣和评论。
8. Medium
国外优质文章网站,Medium 的整体结构非常简单,容易让用户沉下心来专注于阅读。
上面有很多优秀的博文,优秀的分享,我这里第4条提到的那篇翻译出处就处在Medium上。还有很多优秀的公司,尤其是硅谷的公司,都在Medium上有专题,有能力的同学绝对要去看看。
9. Seamentfault,中文名思否
SegmentFault 中文技术交流平台,在这里你可以检索,交流和分享任何技术编程相关的问题及知识。我们的目标是覆盖和服务 1,000 万以上中国软件开发者和IT信息从业者,其实现方法是充分利用在各个平台上所能获得的各种技术创新机会为他们开发产品应用和服务。
10. 开源中国
是目前国内最大的开源技术社区,拥有超过200万会员,形成了由开源软件库、代码分享、资讯、协作翻译、码云、众包、招聘等几大模块内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台
旗下还有一个云开发平台--码云,算是中国版的GitHub。现在用户量也逐渐增长,对我们国内的开发者来说,是一个好事。
11. 算法学习 LeetCode
算法学习网站,上去每天学习下,刷几道算法题,走遍天下都不怕。
有中英文两个网站,这个网站其实不需要说太多了,大家可以去看下算法岗位,可以去关注下校招对算法的要求,重要性不言而喻。
我一直在刷题,在ARTS打卡的时候,每周一题,这个好习惯我会一直坚持下去,和大家共勉。
12. spring4all
国内首个 Spring 及 Spring Cloud 构建微服务架构的交流社区,想要学习微服务相关,在这里你总能找到你所要的。
MySQL 密码参数配置与修改 validate_password
场景
通过root用户创建travel_agency数据库,目标是,新建一个用户然后对仅对该用户开放travel_agency数据库而非其他数据库
过程
创建对所有ip开放的用户sx
CEATE USER 'xx'@'%' IDENTIFIED BY 'xx@2';
仅对sx用户开放travel_agency数据库,并刷新权限使授权生效
GRANT ALL PRIVILEGES ON `travel_agency`.* TO 'sx'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
回收可以使用 REVOKE ... ON ... FROM 'xxx'@'xxx';
@前面为用户名,@后面接限制的主机,%表示任何地方。(注意:这里%有的版本不包括本地,遇到这个问题再加一个localhost的用户就可以)
删除用户:
DROP USER ‘xx’@'xx';
but
在默认配置下进行第一步时会报出1819问题,说密码不符合规范
默认配置的介绍
在mysql5.7版本后已经默认安装validate_password插件,该插件可以控制密码的最低要求
我们先查询未改动的状态,即默认状态
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
mysql 5.6对密码的强度进行了加强,推出了 validate_password 插件。支持密码的强度要求。
安装办法:
在配置文件中打开
[mysqld]
plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_policy=2
并装载plugin:
mysql>>INSTALL PLUGIN validate_password SONAME 'validate_password.so';
即可。
当建立用户密码时,如果不符合预设的规则,那么就不会通过:
mysql>grant all on *.* to tester@'localhost' identified by 'tasssss';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements;
下面接着给大家介绍mysql 5.6密码强度插件使用
在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件。支持密码的强度要求。
此插件要求版本:5.6.6 以上版本
安装方式:
1.安装插件:(默认安装了插件后,强度插件就启用了,关闭,需要在配置文件假如相关关闭参数)
mysql>INSTALL PLUGIN validate_password SONAME 'validate_password.so';
2.配置文件添加部分参数:
plugin-load=validate_password.so
validate_password_policy=2
validate-password=FORCE_PLUS_PERMANENT
3.以上处理后,就可以测试了:
mysql> SET PASSWORD = PASSWORD('abc');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
ScoreInformation.java
import java.util.Scanner;
class ScoreInformation {
private String stunumber; //八位学号
private String name;
private double mathematicsscore;
private double englishscore;
private double networkscore;
private double databasescore;
private double softwarescore;
//构造函数
ScoreInformation(String stunumber,String name,double mathematicssore,double englishscore,double networkscore,double databasescore,double softwarescore) {
this.stunumber=stunumber;
this.name=name;
this.mathematicsscore=mathematicssore;
this.englishscore=englishscore;
this.networkscore=networkscore;
this.databasescore=databasescore;
this.softwarescore=softwarescore;
};
ScoreInformation(){};
//读取和设置变量信息
public void setstunumber(String stunumber)
{
this.stunumber=stunumber;
}
public String getstunumber()
{
return stunumber;
}
public void setname(String name)
{
this.name=name;
}
一 概述 之前介绍过使用Flutter构建移动应用,本文介绍使用Flutter构建Web应用
配置flutter sdk以支持Web在新项目中开启Flutter Web创建一个支持Web运行的新应用向已有的应用添加Web支持 二 配置flutter 工具以支持Web 在创建支持Web的Flutter应用前,你需要安装下面的应用:
Flutter SDK(安装并添加到环境path变量中)浏览器(谷歌、Edge),调试Web应用时,需要浏览器支持 三 在新项目中开启Flutter Web 3.1 开启Web支持 输入下面的指令来开启Web支持
flutter config --enable-web 这个命令,会生成.flutter_settings配置文件,Windows环境下,生成文件的路径是:
C:\Users\用户名\AppData\Roaming 打开后内容为
{ "enable-web": true } 3.2 查看支持的设备(浏览器) 开启Web支持后,运行flutter devices命令(类似于Android中的adb devices),会列出所有支持的浏览器信息(QQ浏览器和IE浏览器虽未列出,但也支持)
flutter devices 2 connected devices: Chrome (web) • chrome • web-javascript • Google Chrome 87.0.4280.141 Edge (web) • edge • web-javascript • Microsoft Edge 87.0.664.75 四 创建一个支持Web运行的新应用 4.1 集成开发环境(IDE) 4.1.1 创建Web项目(Android Studio为例) 依次点击:File——>New Flutter Project——>Flutter Application——>配置Flutter应用
GoJS 是什么 GoJS是一个功能丰富的js库,用于在浏览器上实现自定义交互式图表和复杂的可视化图表。 GoJS通过可自定义的模板和布局构建复杂节点,链接和组,绘制js图表。
GoJS为用户交互提供了许多高级功能,如拖放,复制和粘贴,文本编辑,工具提示,上下文菜单,自动布局,数据绑定和模型,事务状态和撤销管理,事件处理程序,命令以及用于自定义操作的可扩展工具系统等等。
为什么使用GoJS 为了更直观地表达信息,我们常常需要用图形来展示数据以及逻辑关系,例如最常见的架构图、ER图、流程图、BPMN图等等,都是用来解决实际应用所遇到的问题。前端可使用canvas,svg,html+css技术来绘制图形。主流的前端库有mxGraph,Joint等这篇文章介绍的比较清楚了。
我们对用户交互有很高的需求,并且有深入定制模板的需求,因此我们选择GoJS
如何使用GoJS 官网上介绍:GoJS支持图形模板 以及 图形对象属性与模型数据的数据绑定。
GoJS supports graphical templates and data-binding of graphical object properties to model data.
我们通过下面两个部分,来理解这句话。
GoJS 的概念 图表(Diagram) GoJS图表即最后看到的可视化视图,它是由这些部分构成的:一个或多个可能有连接关系的、可能成组的节点。所有这些节点和链路聚集在相同或不同的层中,并呈现出一定的布局(开发者预定好的或GoJS自动布局)。
模型(Modal) 每个图表都有一个数据模型,用于保存和解释开发者程序的数据。
模型描述了节点之间的连接关系和组成员关系。图表自动为模型 Model.nodeDataArray 中的每个数据项创建一个节点或组, 为模型 GraphLinksModel.linkDataArray 中的每个数据项创建一个链接。而且,我们可以为每个数据对象添加所需的任何属性。
模板(Template) 模板声明了每个节点或链路的外观、位置和行为。
面板(Panel) 每个模板由GoJS中的面板Panel构成,面板本身作为一个图形对象GraphObject,保存其他图形对象作为它的元素,同时,面板需要负责图形对象的尺寸、位置。
每个面板建立自己的坐标系,面板中的元素按顺序绘制,从而确定了这些元素的z坐标。
面板有很多种类,比如 Panel.Position,Panel.Auto,Panel.Vertical,Panel.Horizontal 等等。
所有部件(这里指构成面板的图形对象,比如 Shapes、Pictures、TextBlocls)都有默认模板。
图形对象属性与模型数据属性的数据绑定使得数据的每个节点或链接都是唯一的。
下面这张图会更直观地解释上面的概念:
HTML
js外链地址
//引入的内容js如有需求请私聊我 //gojs <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta content="a1z51.23600852" name="spm-id" /> <title> demo </title> <script src="
控制台显示如图
解决办法:去除路由配置中父级的name属性
原因:因为当某个路由有子路由的时候,父级路由需要一个默认的路由,所以此时父级路由不能定义name属性。
mysql中timestamp和date如何转换为字符串我是要用日期做模糊查询的.
timestamp和date本身就是字符串了,模糊查询可以直接用,如果不确定格式,可以用date_format()转换下。例如
select * from tb where date_format(ct,'%Y-%m-%d') like '2016-08%';
ssm里面如何将mysql的timestamp转为java.lang.String
这个报错不是转字符串的时候报错的,是数据库里面的值有问题,应该设置一个默认值,插入的时候如果为空就取当前时间。这个0000-00-00 00:00:00数据库转不了Timestamp
将MYSQL数据库里的时间戳转换成时间
from_unixtime()是MySQL里的时间函数
select uid,userid,username,email,FROM_UNIXTIME(addtime,'%Y年%m月%d') from members
以上例子是sql语句的例子,直接能将mysql的时间戳类型转换成日期格式
date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串
后面的 '%Y%m%d' 主要是将返回值格式化 (这里的时间格式可以动态定义)
例如:
mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d' )
->20071120
mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' )
->2007年11月20
UNIX_TIMESTAMP()是与之相对正好相反的时间函数,将日期时间转换为时间戳类型
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
若无参数调用,则返回一个 Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) 作为无符号整数。若用date 来调用 UNIX_TIMESTAMP(),它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回。date 可以是一个 DATE 字符串、一个 DATETIME字符串、一个 TIMESTAMP或一个当地时间的YYMMDD 或YYYMMDD格式的数字。
例如:
mysql> SELECT UNIX_TIMESTAMP() ; (执行使得时间:2009-08-06 10:10:40)
->1249524739
栈的介绍 栈(stack),是一种线性存储结构,它有以下几个特点:
栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
向栈中添加/删除数据时,只能从栈顶进行操作。
栈通常包括的三种操作:push、peek、pop。
push——向栈中添加元素。
peek——返回栈顶元素。
pop——返回并删除栈顶元素的操作。
1. 栈的示意图
栈中的数据依次是30→20→10。
2. 出栈
出栈前:栈顶元素是30。此时,栈中的元素依次是30→20→10。
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是20→10。
3. 入栈
入栈前:栈顶元素是20。此时,栈中的元素依次是20→10。
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40→20→10。
栈的C实现 1 数组实现的栈,并且只能存储int数据 实现代码:
运行结果:
tmp=30tmp=20stack size()=3402010 结果说明:该示例中的栈,是通过"数组"来实现的!
由于代码中已经给出了详细了注释,这里就不再对函数进行说明了。仅对主函数main的逻辑进行简单介绍:
在主函数main中,先将 "10, 20, 30"依次压入栈。此时,栈的数据是:30→20→10。
接着通过pop()返回栈顶元素;pop()操作并不会改变栈中的数据。此时,栈的数据依然是:30→20→10。
接着通过peek()返回并删除栈顶元素。peek操作之后,栈的数据是:20→10。接着通过push(40)将40压
入栈中。push(40)操作之后,栈的数据是:40→20→10。
2 单向链表实现的栈,并且只能存储int数据 实现代码:
代码说明:"运行结果" 以及 "主函数main的逻辑"都和"C语言实现一"的一样。不同的是,该示例中的栈是通过单向链表实现的。
3 双向链表实现的栈,并且只能存储int数据 实现代码:
(1)双向链表的头文件(double_link.h)
(2)双向链表的实现文件double_link.c)
(3)双向链表的测试程序(dlink_stack.c)
代码说明:"运行结果" 以及 "主函数main的逻辑"都和前两个示例的一样。不同的是,该示例中的栈是通过双向链表实现的。
4 双向链表实现的栈,能存储任意类型的数据 实现代码:
(1)双向链表的头文件(double_link.h)
(2)双向链表的实现文件(double_link.c)
(3)双向链表的测试程序(dlink_stack.c)
运行结果:
id=40, name=danid=20, name=jodyid=10, name=sky 结果说明:该示例中的栈是通过双向链表实现的,并且能存储任意类型的数据。示例中是以结构体类型的数据进行演示的,由于代码中已经给出了详细的注释,这里就不再介绍了。
*本文转自博客园,作者skywang12345
*原文地址
问题背景
mysql主从同步
1、结构:主库业务数据增删改查,从库是负责报表的查询
2、问题:主从异常导致报表数据不准确,上线期间,出现多次,发现时同步已经中断很长时间。
3、解决:脚本自动监控+短信提醒,及时发现异常,人工干预恢复。
mysql查询效率
问题:系统上线运行后,随着数据的不断增长,可能一些语句执行会越来越慢。
解决方向:借助mysql EXPLAIN 排查sql语句。进行针对性修改。
mysql连接数增长异常
1、问题:4月底多次出现知识库mysql连接被占满,导致系统故障。
不是瞬间,隔几天会出现一次。
2、排查:死锁、连接未关闭(接口平台groovy脚本)、show processlist
3、解决:根据排查,优化代码及jdbc连接数配置,解决故障。
代码执行效率
排查:借助Fiddler(http协议调试代理工具),查找执行慢的代码。
解决:优化代码结构,解决问题。
mysql主从同步
监控脚本
监测内容:
1、检查主机IP及端口是否一致
2、检查主从mysql-bin文件是否一致
3、检查主从日志文件位置Position是否一致
4、检查slave_IO_running和slave_sql_running两个线程是否启动【重要】
异常短信发送:使用curl -d 参数 请求连接 (发送短信内容及号码)
人工干预
1、通过sql查询导致同步异常的数据 select * from performance_schema.replication_applier_status_by_worker\G
2、步骤1会查出具体哪张表的问题数据,修改查询出来的异常数据
3、跳过异常步骤 set global sql_slave_skip_counter =1;
4、重新启动同步操作 start slave;
5、查询同步状态是否正常 show slave status\Gmysql连接数异常
监控脚本
监测内容:
1、查询mysql进程,select * from infomation_schema.processlist
Id: 就是这个线程的唯一标识\User: 启动线程的用户\Host: 记录了发送请求的客户端的 IP 和 端口号\DB: 数据库名称\Command: 是指此刻该线程正在执行的命令\Time: 表示该线程处于当前状态的时间(秒)\State: 线程的状态\Info: 记录线程执行的语句。默认只显示前100个字符.
2、查询锁表信息:show open tables where in_use> 0;
文章目录 一、设置线宽度二、绘制单条线段 GL_LINES三、绘制多条线段 GL_LINES四、绘制依次连接的点组成的线 GL_LINE_STRIP五、绘制圈 GL_LINE_LOOP ( 偶数个点 )六、绘制圈 GL_LINE_LOOP ( 奇数个点 )七、绘制彩色的线八、相关资源 一、设置线宽度 线的绘制宽度是 OpenGL 状态机中的一个值 , 通过 glLineWidth 方法设置 ; 下面的代码将线的宽度设置为 2 像素 ;
// 设置线的宽度 glLineWidth(2.0f); 二、绘制单条线段 GL_LINES 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来 ;
可以调用 glVertex3f 方法设置成对的点 , 每两个点代表一条线 ;
注意必须成对设置 , 如果设置 奇数个点 , 最后一个点会被丢弃 ;
绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ;
在 glBegin(GL_LINES) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 ;
如在上述 glBegin 和 glEnd 两个方法之间调用了