文章目录 返回默认值修改指针类型,返回NUll增加 tag:omitempty 不返回该字段调整为 interface{} 返回空对象 {} 返回默认值 package main import ( "encoding/json" "fmt" ) type User struct { Uid int `json:"uid"` UserName string `json:"username"` LoginInfo UserLoginInfo `json:"logininfo"` } type UserLoginInfo struct { Time int64 `json:"time"` } func main() { p := User{Uid: 10, UserName: "weibin"} data, _ := json.Marshal(&p) fmt.Println(string(data)) } 响应结果:给结构体赋值默认值
{ "uid":10, "username":"weibin", "logininfo":{ "time":0 } } 修改指针类型,返回NUll type User struct { Uid int `json:"uid"` UserName string `json:"
年初的时候写了一个光栅化的软件渲染器,能够绘制立方体、能够做颜色插值。纹理映射还没实现,基于NDC 坐标系的剪裁也没有做。虽然完成度没有那么高,但是让自己对线性代数和渲染管线的理解一下提升到了一个全新的高度。这里贴一个 github 仓库地址吧。
https://github.com/yunyou730/spinning.git
最近一段时间,开始重新学习 OpenGL. 学习的网站是 Learn OpenGL. 主要看的是中文版。https://learnopengl-cn.github.io/每个章节都动手实践下来,对 Phong 光照的理解比以前加深了许多。这次又重新手写了一个基于泛型的简单数学库,对矩阵变换的理解比之前好像又深刻了点。进度刚刚看完基础、光照、加载模型。后面的"高级OpenGL" 相关的内容计划在7月份看完。这里也贴一个 github 仓库地址。
https://github.com/yunyou730/gl_portal.git
折腾完了光栅化渲染器,再回过头来看OpenGL ,感觉通透了许多。这两个代码仓库,算是能代表自己对图形学这方面的目前的最高理解了。不过远远还没完。我最近受到旁边同事的熏陶,学习踏实了许多。对 OpenGL 和 图形学的学习目前方向很明确,我还会继续跟进的。
短期计划是先看完并实践 Learn OpenGL 的全部内容。等有空的时候,还要跟一个 raytracing in one weekend 的教程,写一个光线追踪渲染器。后处理方面的知识也要加深一些。要学的东西真多啊。
这半年一直没有更新,主要是因为工作太忙了。其次的原因是发现飞书文档太好用了,秒杀csdn博客。很多临时的想法都记录在飞书文档上了。可能这里暂时不会做大段技术细节的更新了,但是有一些进度上的更新,我会继续同步在这里。
Windows11正式版iso镜像已经被微软正式推出,在这个全新的操作系统中,大家可以享受到更加智能更加个性化的操作体验,拥有着现代、清爽、干净、漂亮等优势,很多新的特性都是大家未曾想到的,如果你想要抢先体验到这款系统的话,那么就可以在本页面进行下载,相信大家会得到意想不到的惊喜。
Windows 11 ISO下载地址:https://down.easck.com/soft/172761.html
【版本特色】 【新的UI界面】
正如此前偷跑的那样,Window 11针对用户界面进行了大刀阔斧的修改。人类都是视觉动物,而UI在操作系统中一直是用户最直观感受的层面。为什么WIndows 8反响平平,就是因为Modern UI取消传统的开始菜单,割裂了用户与经典Windows界面之间的操作体验,让用户觉得这种体验非常不伦不类。
那么,Windows 11给我们带来了怎么样的UI改动呢?首先,和传统靠左设计不同,Windows 11的任务栏采用了默认居中的呈现方式。考虑到人的视野都是居中的,比起需要用眼角余光扫过的传统开始菜单,这样的设计看起来确实简洁了许多,就看用户能否适应。
打开开始菜单后,可以看到传统的磁铁设计遭到取消,取而代之的简化的网格布局。现在,开始菜单的顶部区域是快捷搜索栏,第二排是应用列表,用户可以随时将应用固定在第二排上,第三排会显示推荐文件和应用程序,而电源选项现在位于右下角,带有关闭、睡眠或重新启动系统等选项。
在基础UI设计上,我们可以看到更加简洁的图标样式、回归经典的毛玻璃效果、新的白天/夜间模式、以及无处不在的窗口圆角。单纯从UI设计来看,WIndows 11的观感还是很顺眼的。
最后,Windows 11带来了全新的页面布局选项。现在,当你将鼠标悬停在最大化窗口的图标上时,系统就会自动弹出一个小部件,允许用户将窗口按照自定义的页面布局进行窗口排序。对于同时需要使用多个应用的用户而言,这个功能提供了新的选择,或许能让生产力成倍提升。
安装方法与Windows 10相似,初始阶段的磁盘和版本选择与Windows 10中的类似,对话几乎没有什么不同。
顺便说一下,Windows 11有六大类型版本:家庭版、家庭单语版、教育版、专业版、专业教育版和专业工作站版,在这个ISO中包括了11种不同的版本供大家选择安装。
安装时只能用微软账号登录才能安装,不能建立本地账户了,所以在安装前要申请一个微软账号(可以免费申请)。
安装时要创建一个PIN码,也就类似于我们用本地账户时建立的登录密码,以后登录时要用它登录系统。
中文显示不是很完整,在系统设置中设置中文显示后,只有部分内容和界面是显示的是中文,这也说明是一个测试版。
操作方法和Windows10几乎一致,可以使用Windows10方法激活。
【硬件要求】 CPU:现代1Ghz 64bit双核处理器
内存:4GB RAM
存储:64GB硬盘
显示:9英寸1366x768分辨率
固件:UEFI Secure Boot &; TPM 2.0 compatible
显卡:DirectX 12兼容显卡/ WWDM 2.x
与 Win10 系统的 2+32GB 存储相比,Win11 需要 4+64GB,另外 CPU 必须是64位的,意味着 32 位 CPU 不再支持了,以后的 Win11 系统显然也没有32位系统下载了。
【安装方法】 1、下载后即可获得win11正式版中文系统镜像文件和中文语言包
2、可对其进行解压或是直接利用驱动器来打开
3、双击“setup.exe”进行加载
4、依提示进行安装
5、在这里选择国家地区
6、选择装个人的还是学校或是工作的模式版本
7、接着等待安装完成,不过此时系统是英文的
8、然后将本站提供的win11中文补丁直接解压到系统根目录,或是解压后将Windows文件复制到C盘中,有提示重复的点跳过。
文章目录 前言一、拓扑图1.Trunk的作用 二、划分VLAN三、配置trunk四、测试连通性总结 前言 因为这两天经常遇到划VLAN的问题,所以写个博客加深一下记忆
提示:以下是本篇文章正文内容,下面案例可供参考
一、拓扑图 1.Trunk的作用 只使用一条链路,且通过标识来区分不同VLAN的数据
二、划分VLAN 1. 在交换机SW1里创建VLAN 10 20 30
并且在SW2重复该步骤
[SW1]vlan bat 10 20 30
2.进入e0/0/1接口,将它绑定vlan10
[SW1]int e0/0/1 [SW1-Ethernet0/0/1]port link-type access [SW1-Ethernet0/0/1]port default VLAN 10 3.进入e0/0/2接口,将它绑定vlan20
[SW1-Ethernet0/0/1]int e0/0/2 [SW1-Ethernet0/0/2]port link-type access [SW1-Ethernet0/0/2]port default VLAN 20 4.进入e0/0/3接口,将它绑定vlan30
[SW1-Ethernet0/0/2]int e0/0/3 [SW1-Ethernet0/0/3]port link-type access [SW1-Ethernet0/0/3]port default vlan30 三、配置trunk 将e0/0/22设置为trrunk线,并允许vlan10 20 30通过
[SW1-Ethernet0/0/3]int e0/0/22 [SW1-Ethernet0/0/22]port link-type trunk [SW1-Ethernet0/0/22]port trunk allow-pass vlan 10 20 30 再在SW2重复以上过程,配置如下
[SW2]VLAN bat 10 20 30 Info: This operation may take a few seconds.
win10安装软件需要管理员权限的处理办法|win10装软件提示error launching installer如何处理??
win10安装软件需要管理员权限的处理办法
大家在使用win10系统时,经常在安装软件或者对文件进行操作的时候,系统会提示“需要管理员权限”,这会让大家感觉到很烦。明明已经使用了管理员账户登录了,还一直提示:需要管理员权限。这什么情况?那要怎么处理这样的故障呢?接下来就一起去看看win10安装软件需要管理员权限的处理办法。
办法如下:
1、安装软件、文件操作都需要”管理员账户权限“:
有时候新装了系统,会出现已经使用了管理员账户登录,但是进行文件操作或安装软件的时候还提示需要“管理员账户权限”才能进行此操作。
处理这个故障,就要首先进入账户中心,打开“更改网友账户控制”,进入账户控制界面进行设置;
2、更改网友账户控制:
查看“网友账户控制”,会发现左侧的滑块处于顶部“始终通知”,看右边的说明,也就是说这个设置没有论是安装软件还是对电脑中的文件进行操作时,都会进行通知。把滑块下拉,依据需要选中合适的设置便可。
3、某些文件复制、移动需要管理员权限:
如果处理了上面的故障,还是没有法对文件进行复制或移动操作,那么久看下文件的安全访问设置——单击右键——打开属性——打开安全选项卡,然后可以看到,Everyone网友的权限中只有“读取和输入”权限,而无就”完全控制“权限;
4、设置文件的安全访问权限:
打开编辑按钮,然后勾选Everyone权限的“完全控制”,再打开确定;
5、可以对文件进行操作:
再实现对文件进行移动操作,已经可以顺利进行。
win10安装软件需要管理员权限的处理办法就给我们详细详解到这里了。其实对于这个故障,大概是系统设置故障,也大概是文件本身设置了安全访问限制,只要进行相应的设置就能处理故障了。
win10装软件提示error launching installer如何处理?
在平时的工作中,大家会安装非常多的软件,但是在大家安装软件的时候会出现提示error launching installer,那么当你碰到win10装软件提示error launching installer如何处理呢?如果你不熟悉的话,那么赶紧看看以下文章内容吧!
问题分析:
出现安装软件时软件时出错“error launching installer”故障是由于界面语言和非unicode程序语言不一致导致。
处理办法:
1、打开“开始”菜单。
2、鼠标左键单击选中“控制面板”。
3、控制面板的查看方式选中“大图片”或“小图片”。
4、选中“区域和语言”打开点击。
5、在区域和语言界面,打开“管理”。
6、切换到“管理”面板,查看非unicode程序语言是不为中文。
7、如果不是,打开“更改系统区域设置”。
8、进入设置界面后,将当前系统区域设置为“中文”。
9、设置完成后打开“确定”。
10、设置成功需重启才能生效,打开“现在重头启动”。
11、重启后再进行安装。
以上就是win10装软件提示error launching installer的处理办法了,大家只需要进入系统的区域和语言,以后更改系统区域设置,最后改成中文便可。
计算机可分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类。是现代一种用于高速计算的电子计算机器,按照程序运行,自动、高速处理海量数据的现代化智能电子设备。本篇文章主要向大家介绍一下计算机毕业设计答辩的内情,希望对你的答辩有所帮助。
一、计算机毕业设计答辩时的注意问题
1、加强自信心,不要紧张答辩前应做好充分准备,加强自信心,认定自己一定能成功。只有充满自信、沉着冷静,才会在答辩时有良好的表现。
2、听清老师的问题后,经过思考再作回答主答辩 老师在提问题时,学员要集中注意力认真聆听,并将问题略记在本子上,然后仔细推敲主答辩老师所提问题的要害和本质是什么。如果对所提问题没有听清楚,可以请提问老师再说-一遍;如果对问题中有些概念不太理解,可以请提问老师做些解释,等得到肯定的答复后再作回答。
3、回答问题要简明扼要,层次分明回答问题时,一要抓住要害,简明扼要;二要力求客观、全面、辨证,留有余地;三要条分缕析,层次分明:此外还要注意吐词清晰,声音适中等。
4、对回答不出的问题,不可强辩。答辩委 员会的老师对答辩人所作的回答不太满意,还会进- -步提出问题,以求了解论文作者是否切实搞清和掌握了这个问题。遇到这种情况,答辩人如果有把握讲清,就可以申明理由进行答辩:如果不太有把握,可以审慎地试着回答,能回答多少就回答多少;如果确实是自己没有搞清的问题,就实事求是地讲明自己没有搞清楚,表示今后- -定认真研究这个问题,切不可强词夺理。
5、观点不一-致时,可以展开辩论,与答辩老师展开辩论时,应以维护自己的观点为主,反驳对方的论点要尽可能采用委婉的语言、请教的口气,用旁说、暗说、绕着说的办法,不露痕迹地把自己的观点输入对方。让提问老师感受到虽接受你的意见,但百己的自尊并没受到伤害。
6、要讲文明礼貌论文答辩的过程是- -种学术思想交流的过程。答辩人应该尊重答辩委员会的老师,言行举止要讲文明、有礼貌,尤其是在答辩老师提出的问题难以回答,或答辩老师的观点与自己的观点不相一致时,更应该注意如此。答辩结束,无论答辩情况如何,都要从容、有礼貌地退场。
二、计算机毕业设计答辩时可能会被问到的问题
1. 程序技术方面提问
根据答辩老师的不同会询问到你的程序使用的技术有哪些?Javaweb使用到的技术主要包含了:JAVA/HTML/CSS/MYSQL数据库/JQUERY/SSM框架等需要根据你的程序做具体分析
也有可能详细咨询到某个功能是如何实现的、比如借书是如何实现的、用户借书后换书的流程等
如果老师对JAVAWEB有一定的了解可能会问到某个具体功能的数据流动方向等、例如用户登录时、账号密码信息是如何从页面添加到数据库进行对比的等
2. 程序设计方面提问
此方面有可能会问到程序完成的大致流程是如何的、回答应从确定题目主题、确定程序功能、完善功能流程、完善程序逻辑、根据程序功能绘制功能流程图、根据功能流程图编写前端页面、根据前端页面结合系统功能完成数据库即后端设计等方面进行回答
3. 程序完善方面提问
在提问的最后通常性老师会提出该系统还有哪些方面可以提升等类似问题、解决该问题应着重从自己的系统入手
分析该问题可以从系统的用户体验、系统流程、系统前景等方面进行思考
或可提升用户体验、或可以完善系统流程、或可改变系统定位等、
三、计算机毕业设计答辩技巧
1、积极与指导教师联络在整个计算机毕业论文写作过程中,应积极与指导教师联系,对自己毕业论文的进展、遇到的问题及时与进行交流、探讨,按照指导教师的指导意见进行修正、改进论文,确保文章的质量。
一些同学因为是业余学习,平日里工作繁忙,有时无法按时在约定的日期与指导教师见面,为此应采用其他方法与老师联络,如电话、传真、 E-mail 等等。而且要尽可能地参加老师约定的见面会。通过与老师的交流探讨,确保自己的毕业论文沿着合格正确的方向进行。
指导教师对整个毕业论文成绩是很有发言权的,其中包括你平日对待毕业论文写作的态度成绩。因此,不要给指导教师留下你对毕业论文漠不关心的印象。
比如个别学生只是在最后论文答辩的那一天才来见一见老师交毕业论文,这样的做法应当竭力避免。
2、计算机毕业论文答辩计算机毕业论文答辩,是面对面与评委们的交流,是评委们对同学们毕业论文的认定与评价,主要考核同学们语言表达能力、对问题的说明能力。
同学们在参加答辩之前,应确保完成各项准备工作,包括按要求装订毕业论文、列写答辩提纲、制作展示挂图等等,这一切都是为了给参加答辩作好物质上的准备。
物质上进行了准备,对计算机毕业论文答辩的精神准备也要充分。重要的一条就是要消除紧张心理。绝对不能一见到评委会的"阵势"就什么也不会说了。特别是一旦评委指出了文中存在的一些错误,就不知所措、无言以对。请同学们记住,在这种情况下,要稳住阵脚,继续着眼于问题本身,可以回答 :"您指出的错误确实存在,因条件所限,未能及时发现与改正,在今后的工作中将加以改正, 感谢您的提醒。"显得大方得体,有利于对问题的继续陈述。
同学们对评委的各项提间、质疑,一定要做到有问必答、一针见血,切忌答非所问、不懂装懂。答辩过程是展现自己才华的一个好机会,应予以重视。
以上就是"计算机毕业设计答辩(问题+技巧)"的全部介绍,希望通过上面的了解,大家都可以顺利通过答辩。
使用MySQL进行数据分析——以淘宝用户数据为例 1. 背景介绍 本文主要是练习使用 mysql 进行数据分析,结合 excel 进行可视化分析,数据来源为阿里云天池的淘宝用户数据集,本数据集(UserBehavior.csv)包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。
字段解释为:
列名称说明用户ID整数类型,序列化后的用户ID商品ID整数类型,序列化后的商品ID商品类目ID整数类型,序列化后的商品所属类目ID行为类型字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’)时间戳行为发生的时间戳 注意到用户行为类型有四种,分别是:
行为类型说明pv商品详情页pv,等价于点击buy商品购买cart将商品加入购物车fav收藏商品 关于数据集的大小说明:
维度数量用户数量987,994商品数量4,162,024用户数量987,994商品类目数量9,439所有行为数量100,150,807 由于数据集太过庞大,本人电脑可能不堪重负,用 python 读取发现有十亿条数据,用 mysql 载入也太费时间(导入一个小时才导入了几百万条),因此本文使用部分数据进行分析。
2. 3. 数据清洗 3.1 缺失值处理 select count(UserID),count(ItemID),count(CategoryID),count(BehaviorType),count(TimeStamp) from userbehavior 发现并没有缺失值,总共有3694900条数据
3.2 重复值处理 select UserID,ItemID,Timestamp from userbehavior group by UserID,ItemID,Timestamp having count(*) > 1 发现有两行数据是重复的,因此删除这两行数据。
3.3 时间变量处理 观察数据发现Timestamp字段为时间戳,并非传统的时间日期,需要对这一字段进行处理。
alter table userbehavior add date DATE ,add time VARCHAR(10) 新增 日期date 和 时间time 字段
update userbehavior set date = from_unixtime(Timestamp,'%Y-%m-%d'), time = from_unixtime(Timestamp,'%k') 利用 from_unixtime 函数将 日期 和 时间 从时间戳中提取出来,这一过程时间很长,可能需要几分钟,大家可以喝口水稍等一会儿 😃😃😃
现如今,升级自己的笔记本电脑配置已经成了大势所趋,一般来说升级的无非就是多加一根内存条,问题是,你的电脑配备了额外的内存条插孔了么?好了,接下来就请大家速来围观我的经验啦。
1、首先,请大家对着电脑桌面的任务栏图标击右键,选择任务管理器。
2、打开任务管理器之后,点击性能页面,将任务管理器的状态显示页面切换到硬件的性能指标显示页面。
3、接下来,点击内存,然后我们就能看到内存条的运行状态啦,不过别着急,好戏还在后头呢。
4、如下图所示,查看如图所示的位置,然后我们就能看到清晰地显示出了,内存条插槽有两个,只使用了一个,嗯哼,就是这么简单。
温馨提示:此功能仅限在Win8系统中才可以使用哦,因为只有在Win8系统的任务管理器中才有这个功能,如果你也想体验的话,那么就赶紧升级自己的操作系统咯。
相关推荐:
dell戴尔笔记本电脑怎么加内存条?
电脑主板刚插入内存条就报警声该怎么办?
8g内存条安装后显示3.19G怎么办? 电脑内存条8g可用4g的两种解决办法
一.地址映射流程 二.内核空间 在内核空间,通过malloc类似的两个系统调用来进行内存的分配,它们分别是kmalloc和vmalloc
1.kmalloc kmalloc用于为内核空间的直接内存映射区分配内存.
kmaloc以字节为分配单位,通常用于分配小块内存,并且kmalloc确保分配的页在物理地址上是连续的(虚拟地址也必然是连续的),并且kmalloc为了防止内存碎片的问题,其底层页面分配算法是基于slab分配器实现的.
2.vmalloc vmalloc用于为内核空间中的动态内存映射区进行内存分配.
vmalloc分配的内存只保证了虚拟地址是连续的,而物理地址不一定连续.它通过分配非连续的物理内存块,再通过修正内核页表的映射关系,把内存映射到虚拟地址空间的连续区域,就能够做到这一点.
三.用户空间 3.1 malloc存在的问题 在C语言中我们可以使用malloc来在用户空间中动态的分配内存,而malloc作为库函数,其本质就是对系统调用进行了一层封装,因此在不同的系统中其实现不同.
在Linux中,当我们申请的内存小于128KB时,malloc会使用sbrk或者brk在堆区分配内存.而当我们申请大于128KB的大块空间时,会使用mmap在文件映射区进行分配.
由此会产生两个问题:
由于上述的brk/sbrk/mmap都属于系统调用,因此当我们每次调用它们的时,就会从用户态切换至内核态,在内核态完成内存分配后再返回用户态. 倘若每次申请内存都要因为系统调用而产生大量的CPU开销,那么性能就会大打折扣(变差).堆是从低地址往高地址增长,如果高地址的内存没有被释放,则低地址的内存就不能被回收,就会产生内存碎片的问题. 那么这两个问题是如何解决的呢?
为了减少内存碎片和系统调用的开销,malloc在底层采用了内存池的管理方式来解决这个问题.
ptmalloc采用边界标记法将内存划分为很多块,从而对内存的分配与回收进行管理.为了内存分配函数malloc的高效性,ptmalloc会预先向操作系统申请一块内存供用户使用,当我们申请和释放内存的时候,ptmalloc会将这些内存管理起来,并通过一些策略来判断是否将其回收给操作系统.这样做的最大好处是:使用用户申请和释放内存的时候更加高效,避免产生过多的内存碎片.
Linux中使用的是glibc(c运行库,是linux系统最底层的应用程序编程接口)的malloc()接口函数,并且通过glibc的ptmalloc(内存分配器)管理堆内存.
3.2 ptmalloc(内存管理器) ptmalloc是glibc中默认的内存管理器.其底层采取了分箱式内存管理机制,也就是实现了一个类似的哈希桶结构的内存池,当我们通过malloc和free申请和释放内存的时候,ptmalloc就会代替我们将这些内存进行管理.通过一系列的内存合并,申请策略,来让用户申请和释放内存的时候更加的高效且安全.
Arena(分配区) 设置分配区的原因:
在老版本的glibc中使用的内存分配器是dlmalloc,其底层对于多线程的支持并不友好,因为所有线程共享同一个内存管理结构.所以当多个线程并发执行malloc时,为了保证线程安全,其通过使用互斥锁进行加锁,使得只能有一个线程能够访问临界资源,因此在并发环境下使用dlmalloc时会花费大量的时间在互斥锁的阻塞等待上,因此整个应用的效率就极低.
在ptmalloc中,为了解决多线程并发争抢锁的问题,其设定了主分配区(main_arean)和非主分配区(non_main_arena).
每个进程有一个主分配区,以及多个非主分配区主分配区可以使用brk和mmap来分配空间,而非主分配区只能使用mmap非主分配区的数量只能增加,不能减少主分配区和非主分配区使用环形链表进行管理,并使用互斥锁保证线程安全 通过引入多个非主分配区,就可以将线程分发到不同的分配区中,将原先多个线程共享一个分配区变为了多个线程共享多个分配区,在一定程度上减轻了并发的压力.
Chunk(内存块) ptmalloc通过名为chunk的数据结构来管理和组织内存单元.为了节约内存,在使用时它的数据结构分为空闲的chunk和使用中的chunk两个版本.
使用中的chunk:
chunk指针指向chunk的起始地址,mem指向用户使用的内存块的起始地址,而next chunk则指向下一个chunkP:表示前一个chunk是否空闲,主要用于合并内存块的操作.当P=1时代表着上一次chunk正在使用,此时prev_size无效.P=0代表前一个chunk空闲,prev_size有效.在ptmalloc分配第一个chunk时,总会将P置为1,防止程序越界访问M:用于表示内存所处的区域,当M=1时为mmap内存映射区域分配,M=0为堆区域分配A:用于表示分配区,A=1为非主分配区分配,A=0为主分配区分配 空闲的chunk:
空闲的chunk会被放到空闲的链表bins上,当用户申请内存时,其先去bins查找是否存在合适的内存对于空闲的chunk,为了方便其在空闲链表上快速查找合适大小的chunk,它有指向上一个和下一个空闲chunk的指针,同时还有指向上一个和下一个空闲chunk的内存大小指针 Bins 对于空闲的chunk,ptmalloc采用分箱式内存管理,通过bins来维护空闲的chunk.ptmalloc一共维护了128个bin,同时每个bin又维护了一个大小相近的chunk链表.
当用户使用free函数释放内存时,ptmalloc并不会立马将内存交还给操作系统,而是被ptmalloc本身的空闲链表bins管理了起来.这样当下次进程需要malloc申请一块内存的时候,ptmalloc就会从空闲的bins上寻找一块合适大小的内存块分配给用户使用.这样的好处就是可以避免频繁的系统调用导致的用户态到内核态的转换带来的系统开销,降低内存分配的开销.
fastbinsY数组: 用来以保存fast bins
bins数组: 用以保存 unsorted,small,large bins
根据chunk的大小以及状态不同,bins又分为以下四个种类:
fast bins: 独立bins之外的,大约有10个. fast bins 是 small bins的高速缓存区,享有最快的内存分配,释放速度. 当用户释放一块小于等于MAX_FAST(默认为64字节)的chunk时,会默认将其存放到fast bins中。当用户需要分配小内存时,会首先查看fast bins中是否存在合适的内存块,如果有则直接返回,如果没有才会去查看small bins上的空闲chunk。同时,ptmalloc会遍历fast bins,查看是否有合适的chunk需要合并,则将其合并后放入unsorted bin中unsorted bin:只有一个,在bins数组的第一个位置. 当用户释放的内存大于MAX_FAST 或者 fast bins合并后的chunk都会进入unsorted bin上.当用户malloc的时候会先到unsorted bin上查找是否存在合适的bin,如果没有合适的bin,ptmalloc则会将unsorted bin上的chunk放入bins上,然后再到bins上查找合适的空闲chunk。small bins: 用来存放固定大小的chunk,bin的大小从16字节开始,以8字节不断递增.
事情发生背景:
使用IDEA从gitlab上面下载项目,修改代码后打包部署,项目使用maven-assembly-plugin插件打包成多环境部署zip包。
结果:
其他同事均正常部署,而出自我本地打包的项目偏偏无法部署,
最后各种文件对比,发现项目中主要执行文件server.sh文件格式为doc,而linux中文件格式为unix。所以开始查看本地编码格式,git环境的编码格式,发现本地sh格式为doc,git上sh的格式为unix,那么是哪个步骤出现了问题呢。
最后在一篇文章中发现了结果,
Git 作为一个源码版本控制系统,提供了一个“换行符自动转换”功能。既:当你在签出文件时,它试图将 UNIX 换行符(LF)替换为 Windows 的换行符(CRLF);当你在提交文件时,它又试图将 CRLF 替换为 LF。同时GIT的这个功能默认处于“自动模式”。
因此本地打包sh的格式就会根据本地系统来确定。
那么要如何才能关闭git的这一功能呢?
方法
针对已经安装GIT环境来说,打开“Git Bash”,
然后输入:git config --global core.autocrlf false
之后删除项目,重新从GIT上下载项目,重新打包部署
问题解决。
参考链接:git 换行问题_解决 Git 换行符自动转换问题的方法_weixin_39854326的博客-CSDN博客
现象如图,点击左边的文件中间编辑区不显示!!!
重启Android studio无效!!!重启电脑无效!!!清缓存无效!!!
解决办法:此时 Android studio 右下角会出现红色感叹号,里面会提示原因,按着操作即可。。。
我的问题是插件与AS冲突,disable就好了。。。。虚惊一场
Furthest Nearest Neighbor 方法就是其他文章中的Descripency方法,是一种diversity samplig方法。 由于特征空间是不断变化的,在特征空间上使用Descripency方法违背了该准则的初衷。
import os import torch import numpy as np from copy import deepcopy from collections import OrderedDict from PIL import Image from sklearn.model_selection import StratifiedKFold class FNN_2DLDA(object): def __init__(self, X_train, y_train, labeled, budget, X_test, y_test): self.X = X_train self.y = y_train self.X_test = X_test self.y_test = y_test self.nSample = X_train.shape[0] print("样本个数=",self.nSample) self.labeled = list(deepcopy(labeled)) # 已标记样本的索引 self.unlabeled = self.init_unlabeled_index() self.labels = np.sort(np.unique(y_train)) # 标签列表 self.
从TCP/IP协议看到IP数据报,看到Checksum的算法描述,不甚了了。
The checksum field is the 16 bit one’s complement of the one’s complement sum of all 16 bit words in the header. ————RFC791
1、怎么算IP Header Checksum? 百度百科里对校验和的解释提到了:1的补码和(one’s complement sum)就是带循环进位(end round carry)的加法,在最后对累加结果取反码。
其实这里讲得很清楚了,但不完全清楚。因为对1的补码和到底怎么算,理解错了。
最开始是按照学数电时对反码加法的理解,即正数的反码等于原码,负数的反码由原码的按位(除了符号位保持为1)取反得到。错。百科最后有附的程序,感觉第10行代码是迷之取反。按这个思路求的结果也不对。 找到一个求IP Header Cheaksum的正确方法: 把划分出所有的16bit数据逐个相加,一旦有进位,就把它加到最低位。最后把结果所有位按位取反。 又找到一个等价的方法:IP数据报首部校验和算法 详细 非代码(接收方检验结果有笔误,但总体写得很棒!) 所有数据逐个相加(使用32位的int类型)把高16位右移16位,再与低16位相加。循环该步,直至结果的二进制表示不超过16位。 2、反码究竟是什么?怎么可以这样用? 可行的方法找到了,可为什么是这样的呢?就像这篇博客里说的那样,这些16bit数据谈不上有正负号,没有什么符号位,一律按位取反,跟加减算数里的用法相去甚远。
首先根据一下表格明确各个概念:
名称英文名称直译名称反码one’s complement1的补码补码two’s complement2的补码 然后看一下维基百科对ones’ complement的解释
The ones’ complement of a binary number is the value obtained by inverting all the bits in the binary representation of the number (swapping 0s and 1s).
我们都知道在web中进行数据传参用的最多的就是GET型或者POST型方法,所以根据此我们也可以把注入分为GET型注入和POST型注入
GET型:http://192.168.80.146/2_Shotting_Range/sql/Less-1/?id=1 通过在可见的URL中进行传参POST型:与数据库交互是通过post数据进行,url不可见 post型注入例子
有两种方法,一种是-r的方式,另一种是--data
1. sqlmap -r
如下获取到post的数据,在我们可能认为存在注入的参数后面加上*号,*号代表优先级,sqlmap会识别优先注入这个参数。然后将HTTP请求包保存为txt文件,接着sqlmap -r xx.txt就行。
或者我们不在参数后面加*,sqlmap会依次询问你是否对所有参数进行注入
2. --data
这种不需要将数据进行保存,我们只需要将post数据复制下来
sqlmap -u --data="key=value" (1)复制所有post数据下来
sqlmap会逐个的检测每一个参数是否存在注入
或者我们也可以在参数后面加*,sqlmap会优先检测这个参数
(2)只复制我们想测试的部分post参数
如下,sqlmap虽然也会检测,但是一直显示不存在漏洞
所以我们使用 --data参数时需要将所有的post数据都复制下来进行测试
sqlmap -r和--data两种方式都可以,看自己方便
连接服务器后,运行显示No such file or directory 错误提示如下:
这种错误是你pycharm和服务器得mapping配置路径不对。
解决方法:
tools->deploment->configuration,检查root path+deployment path路径是不是服务器中文件的路径,检查local path中的路径是不是你本地文件的路径。
本地VMware虚拟机,网络模式为NAT,现在需要局域网其他电脑通过ssh连接这台VMware虚拟机
宿主机地址:192.168.0.72
VMware虚拟机地址:192.168.149.132
局域网其他机器地址:192.168.0.84
1、"编辑: -> "虚拟网络编辑器"(先关闭所有虚拟机运行的主机),点击“更改设置”。
2、选择VMnet8 ,点“NAT设置”
2、添加 “端口转发”,如图,映射物理机8888到虚机22(ssh端口)
3、这里需要将宿主机192.168.0.72的防火墙关闭或者放行8889端口。
4、在192.168.0.84上通过SSH连接VMware主机。
习题 CF283E. Cow Tennis Tournament (正难则反 + 线段树维护异或) CF283E. Cow Tennis Tournament (正难则反 + 线段树维护异或) 链接:https://codeforces.com/contest/283/problem/E
题意:有 n n n 个能力值,能力值越大越强。有 m m m 个区间,每个区间代表能力值在 [ a , b ] [a,b] [a,b] 内的人的强弱关系翻转,区间外的人对区间内的人的强弱关系不变(没有传递关系)。问有多少个三元组 ( p , q , r ) (p,q,r) (p,q,r)满足: p p p 打败 q q q, q q q 打败 r r r, r r r 打败 p p p 。 ( 1 ≤ n ≤ 1 0 5 ) (1\le n \le 10^5) (1≤n≤105)
const d = Math.floor(timestamps / 86400000); // 天 const h = Math.floor(timestamps % 86400000 / 3600000); // 时 const m = Math.floor(timestamps % 86400000 % 3600000 / 60000); // 分 const s = Math.floor(timestamps % 86400000 % 3600000 % 60000 / 1000); // 秒
练习题 HDU - 4027 Can you answer these queries? (同时维护单点更新 + 区间更新)POJ - 2528 D - Mayor’s posters (离散化 + 单点查询)HDU - 1540 Tunnel Warfare (求最大连续区间) HDU - 4027 Can you answer these queries? (同时维护单点更新 + 区间更新) 题意:维护两种操作
0 a b 代表将区间 [ a , b ] [a,b] [a,b] 内的数值,变为自己的平方根1 a b 代表查询区间 [ a , b ] [a,b] [a,b] 内总值 思路:可以发现,一个数最多暴力更新 7 次,所以就是维护单点更新和区间更新。
#include <bits/stdc++.h> #define ls (rt<<1) #define rs (rt<<1|1) #define ll long long using namespace std; const int maxn=1e5+5; int n,m; ll a[maxn]; ll sum[maxn<<2]; void build(int rt,int L,int R) { if(L==R) { sum[rt]=a[L]; return; } int mid=(L+R)>>1; build(ls,L,mid); build(rs,mid+1,R); sum[rt]=sum[ls]+sum[rs]; } void update(int rt,int l,int r,int L,int R) { if(l<=L&&R<=r&&R-L+1==sum[rt]) return; if(L==R) { sum[rt]=sqrt(sum[rt]); return; } int mid=(L+R)>>1; if(l<=mid) update(ls,l,r,L,mid); if(r>mid) update(rs,l,r,mid+1,R); sum[rt]=sum[ls]+sum[rs]; } ll query(int rt,int l,int r,int L,int R) { if(l<=L&&R<=r) return sum[rt]; int mid=(L+R)>>1; ll ans=0; if(l<=mid) ans+=query(ls,l,r,L,mid); if(r>mid) ans+=query(rs,l,r,mid+1,R); return ans; } int main() { int Case=0; while(~scanf("
想归想,难过归难过,若你岁岁平安,我可生生不见。。。
---- 网易云热评
一、检测是否存在注入
1、通过BurpSuite抓包获取提交的数据
2、sqlmap -u "http://192.168.139.129/pikachu/vul/sqli/sqli_id.php" --data "id=1&submit=%E6%9F%A5%E8%AF%A2"
--data指定提交的数据
运行结果:id值存在注入,可能是布尔盲注、报错注入、时间盲注、联合注入
[14:37:09] [INFO] POST parameter 'id' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
POST parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N]
sqlmap identified the following injection point(s) with a total of 46 HTTP(s) requests:
---
Parameter: id (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause