sql语句报错:Out of range value,一般是超出了数值范围。
我在数据库中定义的字段为:
ADD COLUMN `score` tinyint(3) NOT NULL DEFAULT '0' COMMENT '得分' 但是因为分数有时计算后的负值超出-128,所以就会报错。所以如果得分字段定义上直接使用int类型,存储长度默认就好了
MODIFY COLUMN `score` int NOT NULL DEFAULT 0 COMMENT '得分' 这里对int类型进行一个详细说明:
tinyint(1) 和 tinyint(3) 中的1和3并不表示存储长度,只有字段指定zerofill才有效果
例如:tinyint(3),实际值是1,如果列指定了zerofill,查询结果就是001,左边用0来填充。
闲来无事,打开虚拟机上的扫雷玩了玩,觉得自己计算很浪费时间,还容易遗漏,就做了个自动扫雷。
简单模式下很容易通关,困难的就看脸了,感兴趣的可以拿去运行一下。
自动化处理核心代码段在 168~273行。
========================
次日,发现自动扫雷算法并不完整,上次的代码仅对单个数字周围进行判断。
但在一些情况下,单个数字无法判断,要综合一片小区域确定某些方块是否一定是炸弹,或者一定安全。
暂且称为高级算法。(并不是算法有多高级,本质上还是取集合(区域),进行大量的判断,难在复杂判断的逻辑关系以及集合、字典的操作上)。
通过半天的归纳总结,找到规律后开始设计代码。
本次修改还优化了输出格式,使得在大区域下更容易确定方块的坐标。
【代码中一些重复的地方可以提取出来作为单独的方法,通过改变参数位置来实现相同的功能,让代码看上去更精简】
【但长时间的修改代码,随着变量、变量类型、数据结构嵌套和逻辑关系的不断增加,有点被搞得头晕了】
【所以既然运行上没有错误,多次试验也没有发现毛病,就不去管它了。说不定也是靠着什么bug运行起来了呢】
【事实上最初写出来的高级算法代码还多了一个子模块,这个模块在一次高级算法结束之后进行进一步处理】
【在设计算法的时候,考虑到这样能减少遍历游戏窗口的次数,加快运行速度,并且可以确定更多的更复杂的坐标及操作】
【虽然写好代码之后第一次运行全自动困难模式顺利通关,但在后来的几次测试中总会错把炸弹点开😭】
【而且计算出的坐标我实在是看不懂根据什么条件算出来的,修改多次无果,想着是不是算法最初处理的时候就是错误的】
【把这段代码注释掉之后,多次测试,没有任何错误,而且计算出来的坐标和操作都是正确的!计算不出来的时候,我看着也是无法确定哪个方块安全】
【这种情况下只能靠运气随机选择。所以上文说到,说不定是靠着什么bug运行起来的呢。】 教学时间:
咱都上榜一了,咋能不出个教学呢。
(绿色底为算法讲解,蓝色底为举例说明,无色底、算是旁白或设计算法的过程吧。)
首先介绍下扫雷的冷知识:
扫雷上面数字的意思是该方块周围八格方块中的雷的个数。
有时候点一下会开一大片。是因为点到了数字0。0周围没有方块,游戏会自动向四周扩散,直到有数字的方块停止。(0向四周扩散是不可能遇到雷的)
这段“点到0向四周扩散”的代码在141~150行,通过126-128行进入。通过非常简单的递归实现的,遍历一遍0方块周围的方块,是数字就显示数字,是0就再次调用该方法,传入该位置。这段代码可以优化,但重点是自动扫雷。
生成一局扫雷的方法:(对应代码43 ~ 63行)
先生成指定大小(m×n)的空间。我在这里用了二维数组表示,初始化全为0,程序中变量名为game_space, 然后随机k(k个雷)个不同坐标,用’‘表示雷,记录在数组中。
然后遍历一下每个雷的周围八个格子,如果不是字符’‘,则+1。生成完成。(可以验证,数字与周围雷的数量都是匹配的)
可能有同学会质疑,既然game_space列表已经记录了雷的位置,那还有啥扫的?
实际上,扫雷游戏就是提前生成好的游戏棋盘数据,然后在每个格子上都盖上盖子而已。这里表示顶层盖子的列表是show_list。
所有的操作都在show_list列表上,game_space列表仅用于点击show_list列表时进行数据补充。相当于掀开了外层的盖子,露出了里面的内容。
自动扫雷:
自动扫雷就是一个模拟玩家扫雷的过程。你开一局扫雷,第一个肯定是要随便点的。如果运气爆棚,是可以直接点到雷结束该局游戏的。
点到数字一般也不会是8。一般都是从点到0开始才能判断哪里是雷,哪里是安全的。
这里开一局“简单”模式的扫雷,8*8大小,10个雷。用于举例说明。(顺带一提,我写的输出格式在pycharm里输出是整齐的。没有在IDLE里测试过。这里粘贴过来■就比数字宽些)
随机选择【4, 3】点开
Game Over!
1│ ■ ■ ■ ■ ■ ■ ■ ■
2│ ■ ■ ■ ■ ■ ■ ■ ■
3│ ■ ■ ■ ■ ■ ■ ■ ■
背景 在看源码时,一些源码方法没有方法体,难道说明这些方法为空?例如:time.Now 调用的 now(), time.Sleep , reflect.makechan // Provided by package runtime. func now() (sec int64, nsec int32, mono int64) func Sleep(d Duration) func makechan(typ *rtype, size int) (ch unsafe.Pointer) 在写代码时,如果我们想使用别的包下没有导出的方法或者变量时,怎么操作 go:linkname 的用法 实际上,上述提到的三个没有方法体的方法,其实现都在 src/runtime包下
time.now timestub.go 文件中 //go:linkname time_now time.now func time_now() (sec int64, nsec int32, mono int64) { sec, nsec = walltime() return sec, nsec, nanotime() } time.Sleep time.go 文件中 // timeSleep puts the current goroutine to sleep for at least ns nanoseconds.
笔记
Flutter
IDE:Androidstudio 快捷键
系统:macOS
快速添加Widget
先将光标放在SingleChildScrollView 上面然后按
option + 回车[return] => 选择需要的widget
删除 widget
先将光标放在SingleChildScrollView 上面然后按
option + 回车[return] => 选择 Remove this widget
错误提示
先将光标放在有红色错误地方,然后按
option + 回车[return] => 选择对应的解决方式
例如 可以帮忙import library、添加构成方法、添加关键字 等等
查看类定义
command + b 就会跳进去【相当于 command + 鼠标单击】
返回上一步【跳进去查看完之后 想后退】
(1) option + command + 方向左键
(2) shit + command + [
(3) 有些鼠标的侧键自带返回
我是比较喜欢 command + 鼠标单击 + 鼠标侧键 返回
按两下 shit
常见大坑: 关于动态规划,老师不会告诉你现在学习的状态转换方程以后用不到,校内动态规划的学习非常基础,它只举出常见的几个例题,类似于要求你背例题。想着让你触类旁通,我明明白白告诉你,可能性几乎为0。
因为每道题都有属于自己的解,而题目在不停的更新,你学的动态转换方程会随题目而改变,因此真正笔试做题没用,只是告诉面试官,我是科班出来的。我学过动态转换,至于能不能解出题目,那是另外一回事。
下面是动态转换的要点,我可以向你保证,你在网上找动态规划入门的教程,找不到比我写的更好的
你在网上找的许多题解,有关动态规划的,几乎是看不懂的,你会惊讶于他们怎么想到的,感觉差距这么大,惊为天人。
网上总有那么一些人,他们通过数学规律得出解,优化后,通过解出的答案去死扣理由,然后把扣出来的理由发到网上,你找的绝大部分题解正是他们扣出来的二次加工后的产物,为的就是显得他们很聪明,为的就是让你佩服他,听明白没有,都是这种货色。
动态规划核心 : 动态规划的解题核心内容就是对表的解进行优化(俗称打表找规律),
动态规划的难点在于试法,教课书上的那些状态转移方程是别人在打表之后,在表中找出数学规律之后,才写出来的。也就是说,要已知解,才能写出状态转移方程。(搞笑,我已经知道答案还写个毛方程)
动态规划试法的优化(例如斜率优化)核心是通过邻接位置,代替枚举行为。
动态规划的套路: 尝试——记忆化搜索——优化(打表找规律)——严格表结构dp——精致dp
尝试原则:
原则1:单可变参数最好只是一个值(单可变参数维度最好为低维(0维度))
原则2:可变参数个数少(越少越好找规律)
由于找数学规律不需要理由, 因此不建议在优化的时候找理由(纯装B)
题目1:整数拆分问题 使用动态规划法求解整数拆分问题。动态规划函数(状态转移方程),真代码/伪代码,动态规划数组dp。 解法:
设f(n,k)为n的k拆分的拆分方法数
N表示要拆分的数字,k表示最多能被拆成k个的所有情况
n=4,k=4:
4—1+1+1+1 2+1+1 3+1
4 -------------------------------------------------------
n=4,k=3:
4—2+1+1 3+1
4 ---------------------------------------------------------
n=4,k=2:
4—3+1
4 ------------------------------------
n=4,k=1:
4—4
1.算出一些解
2.打表(根据你算出来的解,填表)如下
如上图所示,打表后对解进行优化。
可得出规律:f(n,k)=f(n-k,k)+f(n,k-1)
因此,在找出规律后
可以总结出
动态规划步骤就这么简单,算出前面几个解后,填表,找规律,就能求出解,
真正的难点在于试法(这个表该怎么画,是应该一维的还是二维的,变量要怎么选,要选几个),清楚了如何去试之后,解题就没什么难点,后面重点就是优化了。
题目2:0/1背包问题 使用动态规划法求解0/1背包问题。动态规划函数(状态转移方程),真代码/伪代码,动态规划数组dp。 解法:
使用上述打表法解此题:
dp[i][r]:
i代表可选物品{1,2,3,4…i}
r代表背包的剩余容积
整个dp[i][r]代表在可选物品中选出不超重物品的最大价值。
此问题中w1-w5{2,2,6,5,4}
通过打表可以找到上述规律,可通过此规律完成动态转换方程:
dp[i][r] = max(dp[i-1][r],dp[i-1][r-w[i]]+v[i])
如果硬要掰理由,那么方程含义应为:
此行此列最大价值为上一行此列最大价值与(上行-wi列最大价值+vi)之间的最大值
翻译一下:
上一行此列最大价值:没有选第i个物品的最大价值
上行-wi列最大价值+vi:没有选第i-1个物品但选了第i个物品的最大价值。
因此,此题解的核心就是对第i个物品(不选/选)所得出的最大价值进行讨论。
不选——0
选——1
index.vue页面
<template> <div> <h1>props、属性、事件传递</h1> <app-parent test="123" :name="name" :age="age" v-on:start1="say1" @start2="say2"></app-parent> </div> </template> <script> import AppParent from './parent.vue'; export default { data() { return { name: '传给父组件的值', age: '18' }; }, components: { AppParent }, methods: { say1() { console.log('第一个。。。。。'); }, say2() { console.log('第二个。。。。。'); } } } </script> parent.vue组件
<template> <div> <h3>父组件</h3> <div>组件名上绑定的非props特性($attrs): {{$attrs}}</div> <app-child v-on="$listeners" v-bind="$props"></app-child> </div> </template> <script> import AppChild from './child.vue'; export default { data() { return { }; }, inheritAttrs: false, props: ['name', 'age'], components: { AppChild }, mounted() { this.
非原创,借鉴别人,顺便学习
启动环境 首先新建一个odoo12环境,并在应用列表中搜索sales并安装。
开启多公司功能 打开settings页面,然后点击点击General Settings, 接着再勾选Multi-companies之后点击保存。页面会重新加载,再次回到设定那栏,选择如图中蓝色方框中的companies进入公司列表,再创建一个名为company sub的公司,并把下面选项中的parent字段的值设置成系统默认自带的YourCompany,这代表company sub是YourCompany的子公司,在多公司规则中,子公司记录之前是独立的,同时父公司可以看到所有子公司的记录。
再次刷新页面,此时页面的右上角便会出现一个可点击的下拉列表允许你切换当前使用的公司。
多公司的基本操作 多公司就如字面意思一样简单直了,所以展示起来也很直接。
单据操作 打开sales模块,默认进来的时候可以发现模块自带了一些demo数据,我们随便点击一个单据进去,由于我们开启了多公司功能并且是用Mitchell Admin登录,系统会为我们当前用户分配多公司权利(只有开启了多公司权利的用户才能使用多公司功能,稍后会讲解这个。),在Other Information中会出现Company字段,这允许我们通过设置这个字段来让单据数据归属到对应公司。
现在我们设置Company字段的值为我们刚创建的公司company sub,并回到列表视图,在右上角切换当前的公司为company sub,页面刷新好后我们便会发现刚刚编辑的单据出现在了company sub公司的列表视图中,并且我们再也看不到其他单据内容。
此时我们再新建一个单据,并随机填入数据,再通过右上角切换回YourCompany公司,我们会发现刚刚在company sub公司新建的单据也在列表中,这就是刚刚提到的,父公司可以看到子公司全部数据。
用户相关操作 在Settings中打开用户列表,并点击我们当前的用户,可以看到视图中多了Multi Companies的操作项,其中Allowed Companies就是允许该用户能切换到哪些公司,Current Company则代表用户当前是归属到哪个公司。
再往下拉点,在Extra Rights中还有一项与多公司有关的选项Multi Companies,也就是多公司权利,这是odoo中实际控制用户是否可以切换公司,是否在页面显示Company字段的重要选项。如果你勾选了Multi Companies,并且用户的Allowed Companies数量 > 1,那么即使不在settings中开启多公司功能,该用户也可以使用多公司功能。
那么读者可能就会好奇了,如果是这样,那么在settings中开启多公司功能有什么作用呢?它们之前的区别在于,如果设定中开启了多公司功能,那么全用户都拥有改多公司权利,可以查看到页面中Company相关字段,同时,除非Allowed Companies数量 = 1,右上角的多公司切换选项才会消失。如果不通过settings中开启多公司的话,那么可以在用户页面主动分配多公司权利和Allowed Companies,这样就可以只允许特定用户使用多公司的功能。需要注意的是单独Allowed Companies是没有效果的,需要同时勾选中Multi Companies。
为自定义模块实现多公司功能 让项目支持多公司不算复杂,因为odoo已经为我们完成了大量基础代码,我们只要通过两个步骤,即可实现基本的多公司功能。
在自定的相关模型中新增company_id字段
在所有需要多公司功能相关的字段中都需要加上以下示例代码 1 company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id) 当然如果单据之前是存在明显关联的外键关系,比如订单和订单项,那么订单项定义该字段时可以通过related属性自动从单据身上获取。增加ir.rule过滤规则
在security中新建xml,并定义相关过滤规则并引入,以下是相关的示例代码 1 2 3 4 5 6 <record id="account_comp_rule" model="ir.rule"> <field name="name">Account multi-company</field> <field name="model_id" ref="model_account_account"/> <field name="
我们在Odoo开发时基本都会对模型定义相关视图,其中常常用到的有form,tree,kanban,另外还有calendar,pivot,graph等视图,可以说视图是Odoo很重要的一个组成部分。此外有时视图自带的功能无法满足需求时,我们还需要尝试去对视图做自定义扩展,所以适当的了解视图的背后的运行机制可以让我们更从容、高效的面对视图开发。
这篇教程中我会介绍如何定义视图,视图的基本运行流程,一些主要属性以及实战部分。为了避免篇幅过长,一些在 Odoo 中添加自定义dashboard页面已经讲解过相同功能点,这篇教程中我不再作讲解,如果读者学习本篇教程感觉困难,那么可以先阅读自定义dashboard的教程。
Prerequisite 本教程基于以下环境开发:
系统: windows wsl - Ubuntu 18.04Odoo: Nightly Odoo 构建的post-20200101 12.0 版本数据库: PostgreSQL 10.11 本教程中的示例代码可以从https://github.com/findsomeoneyys/odoo-custom-view-tutorial中获取,仓库中的每个tag对应一个章节结束后的完整代码,读者可以通过类似以下方式来自由切换到不同章节代码。
1 git checkout v0.1 定义基本模型 可以通过git checkout v0.1查看本章节的完整代码
为了方便展示新视图,我们需要建立基本的模型,视图,和默认数据,这里我建了个Game模型,包含名称,下载量和平台字段。
1 2 3 4 5 6 7 8 9 10 11 # -*- coding: utf-8 -*- from odoo import models, fields, api class Game(models.Model): _name = 'echart_views.game' _description = 'Games' name = fields.Char('游戏名', required=True) downloads = fields.Integer(string='下载量', default=0) platform = fields.
在使用Odoo开发时,有时会有这样的业务需求: 希望可以设计一个dashboard,以图表可视化的方式来展现相关数据。
其实Odoo内置的模块中很多页面都有实现了类似的功能,然而可惜的是官方对于这部分的教程Customizing the web client还是基于Odoo 8.0写的,已经过时很久了。
虽然网上也有像Ruter大神写的相关基础教程,但是为了照顾读者,一些比较深入的功能并没有提及到,本教程会在基于Ruter教程上,示范一些更深入的功能点。
一旦完成本教程,你的页面看起来会是这样子的
Prerequisite 本教程基于以下环境开发:
系统: windows wsl - Ubuntu 18.04Odoo: Nightly Odoo 构建的post-20200101 12.0 版本数据库: PostgreSQL 10.11 在阅读本教程时,我会假定你已经具备了以下相关基础知识:
已经阅读过Ruter的在Odoo中添加自定义页面教程了解odoo的基本开发流程了解html,css,javascript,jQuery了解基本git操作 教程目标 通过本教程你将学会以下知识:
了解定制Odoo action_client的Js中相关的生命周期以及常用方法。事件绑定如何与后台交互获取数据一些Odoo实用小组件 本教程中的示例代码可以从https://github.com/findsomeoneyys/Odoo-Tutorial-Demo中获取
安装模块 由于教程是于Ruter的,所以我们先在项目根目录下执行以下命令来获取项目模块。
git clone https://github.com/ruter/Odoo-Tutorial-Demo.git
然后需要把项目路径加入到odoo的addons_path中,可以在odoo.conf配置
addons_path=...,/path/to/Odoo-Tutorial-Demo
亦或者可以在启动的时候加入参数方式
./odoo-bin -c odoo.conf --addons-path="./Odoo-Tutorial-Demo"
命令行的输出可以检测你是否正确配置了路径
接着访问odoo页面,打开开发者模式,更新app列表,再搜索custom_page模块安装即可。
定义相关页面 这里不多与Ruter教程过程差不多,唯一区别是js会多出一些方法,稍后我们会用到。
创建页面 在custom_page/static/src/xml/ 下新建 echart.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8"?> <templates id="template" xml:space="preserve"> <t t-name="
前言 Boilsoft Video Joiner是一个功能强大的视频合并工具,可以将AVI,MPEG,MPG,VOB,RM / RMVB,3GP,ASF,WMV,WMA,MP4,MP4A,MKV或FLV等视频文件组合成一个"不间断"的视频。
Boilsoft Video Joiner Boilsoft Video Joiner提供直接流模式和编码模式两种方式,可以更有效地合并您的视频,并支持以超快的速度将不同格式的视频连接在一起。
软件特色 直接加入视频文件,无需重新编码
直接流克隆模式无需重新编码即可连接相同类型的文件,非常快速且没有任何质量损失。输出文件质量与源视频/音频质量相同。
加入不限数量的不同格式的视频文件
编码模式支持将任何格式,任何类型的文件连接在一起,并根据需要输出到任何格式的文件。支持几乎所有类型的视频格式。
支持多种视频格式
该视频拼接器支持许多视频格式,包括AVI,DivX,MPEG-1,MPEG-2,MPEG-4 VOB,RM,RMVB,ASF,WMV,WMA,3GP(.3gp.3g2),MP4(.mp4.m4a.m4v),MKV,FLV,MTS,MPEG音频和Windows Media音频。
简单的GUI和非常容易使用
支持视频预览、支持“拖放”
通过调整比特率,宽高比,编解码器,帧速率,帧大小等来创建完美的定制视频。
使用说明 链接(失效留言):https://www.123pan.com/s/gjcA-vM4fd
v9.1.7英文版
1.安装主程序,安装完毕后不要启动
2.启动Keygen,点击Patch选择程序的安装目录,等待至显示“done”,默认路径:C:\Users\你的用户名\AppData\Local\Programs\boilsoft-video-joiner(可以右键桌面图标,选择“打开文件所在位置”找到)
3.在keygen中“Name”后输入名字,最好是英文,点击“Generate Offline Registration Response File”
会生成一个Code,以及在keygen文件夹内生成一个“license.xml”文件
4.!!断网!!,然后将 127.0.0.1 oper.boilsoft.com 添加到hosts文件中
5.启动Boilsoft Video Joiner,点击“Help”→“Register”,输入第三步生成的Code,点击“Offline Registration”
6.点击“Select offline registration response file”选择第三步生成的“license.xml”文件,即可完成注册
v7.02.2中文版
单文件可以直接运行使用
将字符串 s1 = "武当派"与字符串 s2 = "张三丰"相加:
demo: #include<iostream> #include<string> #include<Windows.h> using namespace std; int main(void) { string s1 = "武当派"; string s2 = "张三丰"; string s3; s3 = s1 + s2;//字符串s1与字符串s2相加,赋值给s3 cout << "s3=" << s3 << endl; system("pause"); return 0; } 输出为:
s3=武当派张三丰
前言: 如下我创建了一个AD域,现在只有一个主域控制器,也就是创建AD域的第一台服务器默认为主域控制器。为防止主域服务器出现故障影响整个域的运作,故现在要为该域添加一个辅域服务器,用来做备用域服务器。
域:lk.adi.com
主域控制器:adi.lk.adi.com (主域服务器计算机名:adi)
计划要添加的辅域控制器:adi01.lk.adi.com (辅域服务器计算机名:adi01)
添加备用域控制器的好处:
在添加辅域控制器的过程中,辅域会自动复制域中所有域控制器的配置数据信息到自己的域控制器中(也就是数据同步),当主域服务器出现故障无法提供域服务时,备用域服务器会自动代替主域控制器为域中的计算机提供AD域服务。
操作步骤:如下操作全程在备用服务器操作。
一:将备用服务器加入域 ps:将当前要做辅域的服务器的计算机:“adi01”加入当前域(lk.adi.com)。
步骤:此电脑——属性——高级系统设置——计算机名——更改(输入计算机名跟域名)——确定——重启电脑。
二:添加ad域服务: ps:给要作为辅域的服务器的计算机:“adi01”安装ad域服务。
步骤:服务器管理器——添加角色和功能——开始之前(下一步)——安装类型(下一步)——服务器选择(默认就行,继续下一步)——服务器角色(只需要选择AD域服务)——功能(下一步)——AD DS(下一步)——确认即可。
三:将辅域控制器加入现有域: ps:安装完ad域服务之后将辅域服务器:“adi01”添加到现有域(lk.adi.com)中。
1. 点击将此服务器提升为域控制器
2. 部署配置(将此域控制器加入当前域 [填写要加入的域的域名] [提供域中管理员账号密码],下一步)
3. 输入密码(该密码建议和域的管理员密码一致,因为它会替换域管理员的密码!)其他的保持默认设置即可
4.警告不用管,直接下一步
5. 默认即可
6. 默认即可
7. 点击安装即可
PS:安装过程中该域控制器会使用复制的方式同步域中的其他域控制器的配置数据,完成之后该辅域就配置完成了!
必读:
【adi:辅域在安装完成之后会使用复制的方式同步域中(lk.adi.com)其他域控制器(比如主域:“adi”)中的配置数据,比如域策略,域用户、域用户配置,域默认共享文件NETLOGON、SYSVOL,dns服务器配置,(ps:如果该域服务器同时作为打印服务器跟文件共享服务器,那打印服务器中的打印机与共享文件服务中的配置不会被同步!) 那么这时候就算主域:“adi ”无法开机或者系统崩溃都没有影响,因为辅域:“ adi01 ” 这时候会替代主域为域中(lk.adi.com)的计算机提供服务,这就是辅域的好处!如下主域:“adi ”的ad域配置数据与刚刚添加到域(lk.adi.com)中的的辅域:“ adi01 ” 的ad域配置数据】
主域——adi:
辅域——adi01:
ps:可以看到他们的域配置数据都是一样的,因为它们会自动同步!
至此主备域(主辅域)就配置完成了,就有了两台域服务器,现在可以你将主域服务器关机,让辅域服务器继续运行,然后在client端,加域退域,或者登录域账号等等来测试该域是否可以正常运作。因为正常来说域服务器都关机了肯定是加不了域,登录不了新的域账号的!
下载modelsim,安装后运行破解所用的patch_dll.bat发生闪退,闪过的界面显示找不到mgls.dll文件,网上一堆方法用了也没有解决,最后在角落里找到一个方法,瞎搞一通给解决了,记录一下方法,免得忘记。
编辑patch_dll.bat文件,添加标红两条语句
@echo off
attrib -r mgls.dll
attrib -r mgls64.dll
MentorKG.exe -patch . attrib +r mgls.dll
attrib +r mgls64.dll
保存后再次运行即可产生LICENSE.TXT文件。
流量从 HTTP 重定向到 HTTPS(端口 443)时,收到了错误“ERR_TOO_MANY_REDIRECTS”。如何在不将后端侦听器更改为端口 443 的情况下解决此错误?
简短描述
负载均衡无法将 HTTP 流量重定向到 HTTPS,可以在 Web 服务器上重写规则。
重写规则配置为使用 X-Forwarded-Proto 标头和仅重定向 HTTP 客户端。否则,重写规则可能会和它后面的实例之间创建重定向请求的无限循环。此类循环将导致错误“ERR_TOO_MANY_REDIRECTS”。
解决方法
查看以下针对 Apache、NGINX 和 IIS Web 服务器的示例配置。配置负载均衡
后面的 Web 服务器,让其使用 X-Forwarded-Proto 标头根据客户端使用的是 HTTP 还是 HTTPS 来定向流量。请务必将如下所述的重写规则添加到 Web 服务器中:
将使用 HTTP 的客户端重定向到 HTTPS URL
直接为使用 HTTPS 的客户端提供服务
NGINX 服务器
server { listen 80; server_name _; if ($http_x_forwarded_proto = 'http'){ return 301 https://$host$request_uri; } } 重启 NGINX。
200
200 OK请求成功(这是对HTTP请求成功的标准应答。) 301
301 Moved Permanently所请求的页面已经转移至新的 URL 302
302 Found所请求的页面已经临时转移至新的 URL 。 400
400 Bad Request因为语法错误,服务器未能理解请求。 401
401 Unauthorized合法请求,但对被请求页面的访问被禁止。因为被请求的页面需要身份验证,客户端没有提供或者身份验证失败。 402
402 Payment Required此代码尚无法使用。 404
404 Not Found服务器无法找到被请求的页面。 500
500 Internal Server Error请求未完成。服务器遇到不可预知的情况。 501
501 Not Implemented请求未完成。服务器不支持所请求的功能,或者服务器无法完成请求 502
502 Bad Gateway请求未完成。服务器充当网关或者代理的角色时,从上游服务器收到一个无效的响应。 503
503 Service Unavailable服务器当前不可用(过载或者当机)。
理解AdamW
我们先弄清楚什么是weight decay
其实是在损失函数求导后,放在正则项前面的系数,比如L2正则,我们看一下weight decay的位置
我 们 可 以 认 为 λ 就 是 w e i g h t d e c a y min w L 2 ( w ) = min w f ( w ) + λ 2 n ∑ i = 1 n w i 2 L 2 ′ ( w ) = f ′ ( w ) + λ n ∑ i = 1 n w i 我们可以认为\lambda就是weight\ decay\\ \min_wL_2(w)=\min_wf(w)+\frac{\lambda}{2n}\sum_{i=1}^nw_i^2\\ L_2^{'}(w)=f^{'}(w)+\frac{\lambda}{n}\sum_{i=1}^nw_i 我们可以认为λ就是weight decaywminL2(w)=wminf(w)+2nλi=1∑nwi2L2′(w)=f′(w)+nλi=1∑nwi
1、int。
最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)
2、double。
最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)
最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)
3、long。
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)
4、float 。
最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)
最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)
先了解什么是补码,以及计算机怎么表示带符号整数:
带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换为其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的原码、反码和补码都一样,负数的反码是对原码的除符号位外的其他位进行取反后的结果(取反即如果该位为0则变为1而该位为1则变为0操作)而补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+1
再看看补码有什么好处:
1、因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。【至于加法运算为什么比减法运算易于实现以及CPU如何实现各种算术运算等问题,则需要通过对数字电路的学习来理解CPU运算器的硬件实现问题的相关内容了】
这样的运算有两个好处:
a、使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;减法运算可以用加法运算表示出来。
b、加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
2、两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。而这样计算仍然正确。
另外:
采用补码表示还有另外一个原因,那就是为了防止0机器数有两个编码。原码和反码表示的0有两种形式+0和-0,而采用补码表示的时候,00000000是+0即0,10000000不再是-0而是-128这样,补码表示的数的范围就是-128~+127,不但增加了一个数得表示范围,而且还保证了0编码的唯一性。
1.三者之间的关系 List接口:存储有序的、可重复的数据,—> “动态数据” ArrayList:作为List接口的主要实现类,线程不安全的,执行效率高,底层使用Object[]存储LinkedList:对于频繁的插入和删除操作,使用此类比ArrayList效率高,底层使用双向链表存储Vector:作为List接口的古老实现类,线程安全的,执行效率低,底层使用Object[]存储 2.ArrayList和LinkedList之间的区别 (1)相同点
ArrayList和LinkedList都继承了AbstractList抽象类,都实现了List接口
ArrayList和LinkedList是两个集合类,用于存储对象引用
(2)不同点
ArrayList底层通过动态数组实现,而LinkedList底层通过双向链表实现
ArrayList根据索引查找元素的效率比较高,但是插入、删除数据时性能比较低,需要将待插入或删除元素之后的元素往后或往前移动
LinkedList查询元素的效率比较低,需要从头部或尾部开始查找,挨个遍历每一个元素直到找到所需元素,但是插入、删除元素的效率比较高,比如,删除一个元素只需要把它的前一个元素的指针指向它后一个元素就可以
3.ArrayList和Vector之间的区别 (1)相同点
ArrayList和LinkedList都继承了AbstractList抽象类,都实现了List接口
ArrayList和Vector底层都是通过数组实现的
默认初始化大小都是10
(2)不同点
Vector是线程安全的,而ArrayList是线程不安全的,Vector类中的方法通过synchronized修饰实现线程的同步,但实现同步需要很高的开销,这也导致了访问Vector比ArrayList慢
ArrayList和Vector都是采用连续的内存空间存储元素,但是当空间不足的时候,两个类扩容的方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍
ArrayList扩容:
Vector扩容
Vecot可以设置增长因子,而ArrayList不可以
4.源码分析 ArrayList的源码分析:
jdk7中ArrayList的情况 List list = new ArrayList();//底层创建了长度是10的Object[]数组 List.add(123);//elementData[0] = new Integer(123); .. List.add(11);//如果此次的添加导致底层elementData的数组容量不够,则扩容 默认情况下,扩容为原来容量的1.5倍,同时需要将原来数组中的数据复制到新的数组中 结论:建议开发中使用带参的构造器,ArrayList list = new ArrayList(capacity); jdk8中ArrayList的变化 ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度为10的数组 list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData[0] ... 后续的添加和扩容操作与jdk7无异 小结:jdk7中的ArrayList的创建类似于单例的饿汉式,而jdk8中的ArrayList对象的创建类似于单例的懒汉式,延迟了数组的创建节省了内存 LinkedList源码分析:
jdk8中的LinkedList源码分析 LinkedList list = new LinkedList();//内部声明了Node类型的first和last属性,默认值为null list.add(123);//将123封装到Node中,创建了Node对象,其中,Node定义为:体现了LinkedList双向链表的说法 private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.
当执行Java的jar包的时候执行如下代码:
java -jar -Djava.rmi.server.hostname=192.168.1.230 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1141 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dfile.encoding=UTF-8 -Dspring.profiles.active=dev xiaohh-cost-1.0.0.jar 重要参数讲解
-Djava.rmi.server.hostname=192.168.1.230 // 主机地址 -Dcom.sun.management.jmxremote=true // 运行远程链接jvm虚拟机 -Dcom.sun.management.jmxremote.port=1141 // 远程链接jvm的端口 -Dcom.sun.management.jmxremote.ssl=false // 是否使用ssl加密传输 -Dcom.sun.management.jmxremote.authenticate=false // 是否需要认证 如图:
回车后运行,然后到达本地安装jvm的目录,到bin目录下,找到 jvisualvm.exe 可执行文件
双击打开
右击远程选项添加远程主机
然后将我们服务器的IP地址输入到输入框中
点击确定,然后右击远程主机点击 添加JMX链接...
然后将我们之前设置的端口添加IP地址的输入到链接输入框中,然后点击确定
显示如下消息代表链接成功:
双击这个远程链接我们可以看到应用程序的详细信息:
同时可以对内存、GC、类、线程经行监控
查看线程运行状态:
查看对象实例化状态:
好了下课