sqlzoo--using null

sqlzoo–select basics,select from world sqlzoo–select from nobel ,select in select sqlzoo–sum and count sqlzoo–the join operation sqlzoo–More JOIN operations sqlzoo–using null sqlzoo–self join sqlzoo–using null table:teacher教师 id編號dept學系name名字phone內線電話mobile流動電話1011Shrivell275307986 555 12341021Throd275407122 555 19201031Splint2293104Spiregrain32871052Cutflower321207996 555 6574106Deadyawn3345… table:dept学系 id編號name名稱1Computing2Design3Engineering… 列出学系department是null的老师姓名 select name from teacher where dept is null; 使用inner join 不列出没有学系的老师和没有没有老师的学系 SELECT teacher.name, dept.name FROM teacher INNER JOIN dept ON (teacher.dept=dept.id); 使用连接的方式列出全部老师和其对应的系名 select t.name,d.name from teacher t left join dept d on (d.id = t.

linux 安装 mysql8.0 两台

安装第一台,一般用到一个机器安装第二台的时候,一般机器上已经有一台mysql了,所以,如果你没有可以参考下面链接安装,链接没有指定mysql配置文件地址,因为一般大家都是这样子装的,所以,为了能同样流程在正式机器安装成功,所以我没有指定配置文件,保证测试机和正式一样的环境 linux安装 mysql8.0 ------------------------------------------------------------------现在安装第二个mysql---------------------------------------------------------------------- 一定要先先看一下当前系统版本再下载对应的包,我开始没看,然后就一堆麻烦: cat /proc/version Linux version 3.10.0-862.14.4.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed Sep 26 15:12:11 UTC 2018 64位就下载对应64位 1.先下载 可以去官网直接下载, mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz下载链接 我是直接从官网下载的,因为我安装的服务器之前已经安装了一个mariadb了,所以我现在使用另外一个端口3308 将下载的文件移到/usr/local 目录 # 切换到当前目录 cd /usr/local tar -xvf mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz 开始用的 tar -zxvf mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz,查资料说这个压缩包没有用gzip格式压缩,所以不用加z参数 ls,查看文件夹 然后重命名一下解压后的文件: mv mysql-8.0.17-linux-glibc2.12-x86_64 mysql3308 新建data目录,用于存放数据 cd mysql3308/ #新建mysql用户、mysql用户组,如果之前已经建立过,就不用建立了 groupadd mysql #给mysql添加用户 为 mysql useradd mysql -g mysql #将/usr/local/mysql的所有者及所属组改为mysql chown -R mysql:mysql /usr/local/mysql3308/

结合python的一次arcgis等时圈划分实践

最近在研究生活圈,或者说是等时圈,正好结合lbs提供的路线规划接口做一些工作 1、确定坐标系 因为要使用高德的lbs,所以所有的球坐标系都使用GCJ02坐标,同时在arcgis中设置好wmts服务,方便加载底图。 2、建立底图 arcgis中创建两个点图层,origin_pt_gcj02.shp 和 target_pt_gcj02.shp(源点和目标点),其中源点坐标是天津规划院:P。 目标点坐标的思路是这样:以源点为圆心,做一个1000米的缓冲区,然后在缓冲区中以20x20米建立格网,同时建立格网中心点。 选取缓冲区范围内的格网和中心点,分别为net_gcj02.shp, target_pt_gcj02.shp。 把两个点要素文件转成投影坐标,天津记得选51N带,分别为origin_pt_utm.shp 和 target_pt_utm.shp 好,基本的地图已经完成了。 3、使用高德lbs查询 这一块的思路就是,通过lbs,返回每个目标点和源点之间的步行时间(考虑道路实际情况,因为是步行,不考虑路况),然后赋值给点shp文件,用来做进一步可视化和分析处理。 (1)dbf转csv 由于shp文件的数据用dbf文件格式存储,为了方便在pandas中使用,我把他们转成csv格式的文件。 这一步上卡了很久,网上建议使用geopandas,但是我用的是win10系统,pip安geopandas所需的包文件好多都没有win64版本的,包括shapely、fiona啥的。在大牛网站https://www.lfd.uci.edu/~gohlke/pythonlibs/上找到的for win64的wheel文件,各个包单独安装倒是能安上,但是导入包的时候就是各种出错。 由于正规的dbf文件读写涉及sql操作,这是俺的短板,所以先绕着走…回头再改进。 所以我建议老老实实使用dbfread,虽然会出现编码问题,但是提前在读取的时候解决掉,就没问题了,无非是gbk或者utf-8。 # -*- coding: utf-8 -*- import pandas as pd from dbfread import DBF def dbf2csv(filepath): path = '/'.join(filepath.split('/')[:-1]) name = filepath.split('/')[-1] table = DBF(filepath) df = pd.DataFrame() for record in table: df = df.append(record, ignore_index=True) # 这里record是一个ordered dict所以能直接append filename = name.split('.')[0] + '.csv' newpath = path + '/' + filename df.

C++面试汇总中...

1、C++new与malloc的10点区别 https://www.cnblogs.com/ywliao/articles/8116622.html int *p = (int*)malloc(sizeof(int)); //申请 memset(p, 0, sizeof(int)); //赋值 free(p); //释放 int *q = new int; //申请 *q = 1; //赋值 delete q; //释放 2、预处理、编译、汇编、链接。https://blog.csdn.net/quinn0918/article/details/70024401 3、继承、隐藏、覆盖、重载。https://www.cnblogs.com/findumars/p/9845419.html 公有继承、保护继承、私有继承。https://www.cnblogs.com/weiyouqing/p/9648563.html 友元函数、友元类。http://c.biancheng.net/view/169.html 4、虚函数。https://blog.csdn.net/lyztyycode/article/details/81326699 纯虚函数。https://blog.csdn.net/Hackbuteer1/article/details/7558868 5、static。https://blog.csdn.net/qq_37059483/article/details/81662359 全局静态变量、局部静态变量、静态成员变量、静态成员函数(只能访问静态成员函数和静态成员变量)。存在全局数据区。 6、类this指针。http://c.biancheng.net/view/170.html

第四章第四节 池化层

回忆一下,在“二维卷积层”一节里介绍的图像物体边缘检测应用中,我们构造卷积核从而精确地找到了像素变化的位置。设任意二维数组X的i行j列的元素为X[i, j]。如果我们构造的卷积核输出Y[i, j]=1,那么说明输入中X[i, j]和X[i, j + 1]数值不一样。这可能意味着物体边缘通过这俩个元素之间。但实际图像里,我们感兴趣的物体不会总出现再固定位置:即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出Y中的不同位置,进而对后面的模式识别造成不便。 在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过渡敏感性。 4.4.1 二维最大池化层和平均池化层 同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。 图4.6:池化窗口形状为2X2的最大池化 图4.6:池化窗口形状为2X2的最大池化,阴影部分为第一个输出元素及其计算所使用的输入元素。输出数组的高和宽分别为2,其中的4个元素由取最大值元素max得出: 二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为的池化层称为池化层,其中的池化运算叫做池化。 让我们再次回到本节开始提到的物体边缘检测的例子。现在我们将卷积层的输出作为最大化的输入。设该卷积层的输入是X、池化层输出为Y。无论是X[i, j]和X[i, j+1]值不同,还是X[i, j+1]和X[i, j+2]值不同,池化层输出均有Y[i, j]=1。也就是说,使用最大池化层时,只要卷积层识别的模式在高和宽上移动不超过一个元素,我们依然可以将它检测出来。 下面把池化层的前向计算实现在pool2d的函数里。它跟“二维卷积层”一节里corr2d函数非常类似,唯一的区别在计算输出Y上。 我们可以构造图4.6中的输入数组X来验证二维最大池化层的输出。 同时我们实验一下平均池化层。 4.4.2 填充和步幅 同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。我们将通过nn模块里的二维最大池化层MaxPool2D来演示池化层填充和步幅的工作机制。我们先构造一个形状为(1,1,4,4)的输入数据,前两个维度分别是批量和通道。 默认情况下,MaxPool2D实例里步幅和池化窗口形状相同。下面使用形状为(3,3)的池化窗口,默认获得形状为(3,3)的步幅。 我们可以手动指定步幅和填充。 当然,我们也可以指定非正方形的池化窗口,并分别指定高和宽上的填充和步幅。 4.4.3 多通道 在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。下面将数组X和X+1在通道维上连结来构造通道数为2的输入。 池化后,我们发现输出通道数仍然是2。

IntelliJ IDEA自制主题theme--Type Color

在此分享一个我自制的IntelliJ IDEA的配色主题--“Type Color”,此主题适合java开发使用,也适合使用者根据自己的习惯再做修改 此主题基于IntelliJ IDEA的经典主题:“Classic Eclipse”改造而成,着眼于视觉和配色的个性化配置,所以主题中只包含了Theme Color子模块。 主题配色截图示例如下: 整体配色有几个考虑: 变量颜色整体为红色,均为粗斜体。其中成员变量为大红色,局部变量为橙红色,入参为玫红色。如果变量值会被修改,则会变为细体;成员变量会用下划点线标注,类变量(static修饰)会用下划横线标注方法声明与调用整体为蓝色,非斜体。普通方法的调用为天蓝色;类方法的调用为深蓝色,并且有下划线类的声明和定义,整体为绿色。包括接口、类、抽象类、泛型等,有细微的差异字符串、数字等字面量,用紫色粗体表示选择模式下,相同的变量或者类,都会被标记为黑色字体,并用黄色背景框标注没有被使用的类和对象、方法,会变为灰色字体错误信息会字体颜色置红,并且用淡红背景框标注,提醒较为醒目整体背景色为比较护眼的淡绿色,适合长时间编程使用对于scala语言,也做了类似的配色支持 附件中的资源包中,还内置了Menlo字体。此字体是Mac的标准字体,我个人觉得比较好用,windows开发者也可以进行安装。只是Menlo字体在Windows下,对汉字支持不太理想。可以把第二字体设为微软雅黑,整体效果就比较理想了。 ## 资源地址 Type Color Theme.zip

《2019秋招腾讯、招银面试问题》

朋友秋招面试问的问题,记录一下 招银网络电话面试一面 自我介绍 实习经历 测试方法 软件开发流程 链表设计,优点 设计模式,单例的场景 友元 多态 数据库事务,应用的场景 多表怎么查询 招银网络对数据库这块比较重视,问的问题可能会比较多 腾讯电话面一面-互娱 腾讯:30min 1.项目中搭建流媒体服务器的过程,rtsp的底层的什么协议,为什么选这个协议, 哪个字节到哪个字节是什么?视频流的时延,码流,分辨率?想过怎么优化吗? 2.TCP和UDP的区别 3.多线程项目中怎么用的,线程同步的方法,互斥锁和事件区别 4.C++用的那个版本,C++11的新特性?智能指针之前就有了啊,Lambda怎么用(不了解的别说) 5.cs结构和bs结构的区别,b是哪个单词 6.QT信号与槽,底层实现,点击一个按钮会经过哪些环节 7.对象模型,C++多态 8.设计模式,为什么要用设计模式 9.堆栈的区别 10.数据结构和算法了解过吗 11.创建一个对象,对象的成员变量和成员函数是怎么存储的,存储在哪 无自我介绍 没问实习,没问数据库

VsCode卸载删除插件及文件残留

快捷键 win + R 打开运行 %appdata% 回车 删除当前目录下的 Code 和 Visual Studio Code win + R 输入 %userprofile% 回车 删除当前目录下 删除 .vscode 文件夹

消灭 Java 代码的“坏味道”

消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在《传习录》谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。 让代码性能更高 需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。 反例: Map<String, String> map = ...; for (String key : map.keySet()) { String value = map.get(key); ... } 正例: Map<String, String> map = ...; for (Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); ... } 应该使用Collection.isEmpty()检测空

day05循环总结

1.基本运算符 python运算符注意:1.算数运算符+ , - , *, / 除 , % 取余 , //地板除(取商) , ** 幂运算 用义:返回一个数值。2.位运算符优先级 (<> ) > & > ^ > \3.比较运算符== 比较两个值是否相等 != 比较两个值是否不同 只会产生2个结果,要么是True 要么是False #用义:始终返回一个布尔值。4.身份运算符is 和 is not 用来判断两个数据的内存地址是否相同 #:每一个变量值都有内存地址5.成员运算符in 或 not in 判断某个值是否包含在(或不在)一个容器类型数据当中, 在 字典 当中判断的是键。 nick:判断元素是否在容器类元素里面(字符串)6.逻辑运算符优先级 () > not > and > or #: 把多个条件同时叠加7.赋值运算符a += 1 => a = a+1优先级算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符 > 赋值运算符 注:优先级最高的 ** 幂运算

在二分类问题中,准确率一直处于50%上下的解决方法

最近在 猫狗识别 项目中,不知为何准确率(训练集准确率和验证集准确率)一直处于0.5左右,这说明网络根本没有学习。后来查阅了许多他人的经验,并做了总结。 首先谈谈我的是如何解决的: 网络结构:AlexNet优化器:Adam (这里正是问题所在)框架:PyTorch 关于优化器,我最开始使用的的是 torch.optim.Adam(),但是训练100个Epoch后,准确率始终在 49% ~ 50%。 解决方法: 换个优化器!我使用的是 torch.optim.SGD(),其他的或许也行,但我还没有尝试。 Note: 出现以上问题时,我们会发现 loss 是 0.69,这是因为输出 0, 1 的概率都是0.5,而 \(-\ln 0.5=0.69\) 。 网络上也有一些解决方法,可以对照检查自己的代码: 训练数据需要打乱,要检查每此batch是否都是一个类别,如果是,则没有办法优化;检查网络是不是没有回传梯度,而是只做了前向运算;检查输入数据是否有做标准化,可能直接传入 \(0 \sim 255\) 像素进去了;二分类问题中 0.5 的 acc 接近随机猜测的值,可以检查下标签是否标错;检查参数有没有初始化;检查第一层的卷积输出是否正常,是不是全 0 之类的;尝试不同的 Learning Rate;检查是否在 logit 那层加了激活函数,导致 logits 有问题,例如全为 0,经过 softmax 后就是 0.5了 转载于:https://www.cnblogs.com/xxxxxxxxx/p/11508020.html

FiberSIM 16 v16.0.1

FiberSIM是专门用于复合材料设计和制造和设计的一套系统。FiberSIM支持工程复合材料所需的高度复杂且注重细节的端到端设计和制造流程。 航空航天、汽车、船舶和风能行业的领军企业认识到复合材料将在未来的创新型轻型耐用产品的开发中发挥重要作用,此外了解单个复合零件所需的数据也很重要。 Fibersim 集成在包括 NX? 软件、CATIA? V5 软件和 PTC Creo? 软件在内的领先型商用三维 CAD 系统中,可以实现无缝协同,是唯一一款能满足从概念、层合定义、层片生成到仿真、记录与制造的整个复合材料工程流程要求的综合软件。小编带来的是FiberSIM16,适合用于creo3.0和creo4.0,附有破解文件,欢迎下载体验,以下是详细的图文安装教程。 安装教程 1、用百度网盘下载好数据包,并解压,得到以下文件,运行主程序文件夹下的Fibersim_16.0.1_Setup_Creo_win64.exe,开始安装软件。 FiberSIM16??? 2、默认选择第一项 3、安装目录,建议不要更改 4、选择creo版本 5、默认不要更改 6、输入C:\ProgramData\Siemens\vistagy_SSQ.dat 7、同样不要更改 8、确认安装新,点击install开始安装 9、取消勾选SES License Options 10、将_SolidSQUAD_文件下的"ProgramData"文件夹拷贝到C盘更根目录,选择是,合并文件夹。 11、将win64文件下的netapi32.dll拷贝以下目录 默认目录为C:\Program Files\Fibersim 16.0.1\creo4_64 C:\Program Files\Fibersim 16.0.1\creo3_64 12、最后运行SolidSQUADLoaderEnabler.reg,将注册信息添加到注册表 13、重启电脑,以管理员身份运行SES License Options,选择Available Bundle(s),“SESSSQ”, 点击 “Apply”, 功能特色 1、帮助工程师指定复合材料以及为作业选择最佳的层片创建方法(不论是基于层片、基于区域还是基于结构的设计) 2、通过定义采用顺序剖面、降斜剖面和交错剖面(这些剖面可自动填充 CAD 模型)的过渡来自动创建层片几何图形,而摒弃了手动为3、每个层片创建 CAD 曲线这一枯燥无味的过程 4、生成可变偏置曲面和实体,包括用来进行干涉检查的样机曲面、供联合在一起的零件使用的配合曲面以及用于制造环节的工装曲面 5、通过自动生成工程文档和/或 Microsoft Excel 表格来验证和传达设计要求 6、根据材料和制造流程来对零件的生产能力进行仿真,从而及早提供反馈并提升开发过程的效率 7、定义制造边界和细节(如接头、三角形加强筋和条带走道),以降低成本并加快零件交付速度。 8、自动创建制造文档来指导工厂的车间加工,从而确保铺层和产品质量的一致性。 9、自动生成制造数据(例如用来驱动自动化切割机、激光投影系统、纤维布设机及铺带机的展平图和数据)并与下游环节以及在整个企业范围内共享这些数据 新特性 修正的问题:TeaveCype 11.2模板使用JETCAM平面模式输出错误的情况 有一个问题,从JielCad平面模式从FixSIM到TeaveCalp 11使用 以前提供的模板。由于此错误,导出将失败: FixSIM试图设置参考FS2JETCAM,而11.2的模板不使用所有 相反,它表现为“FS2JETCAM”。 模板已经被固定在16.0.1版本中。 校正问题:试图在层压规范中删除材料规范 提供泛型对象的错误 这个问题防止在层压指定形式内删除材料规范。

闲来无事

突然想说、喜欢安姐、?、优秀的那么自然、还有那么许多一直优秀的人、读读你们的故事、思考下自己的人生、是啊、对错并不重要、关键是成长和思考 希望所有人都能按照自己的意愿过一生 ------- 杂谈 ------- 最近在看了些电视剧、射雕英雄传、很多自己喜欢的角色、可能每个人都不完美、但刻画的是那么的真实 黄蓉 机敏、博学、善良、调皮、黄小邪 哈哈哈~、总是特别的机智 郭靖 老实、有点儿木讷、小事听蓉儿的、大事却会坚守自己的内心、机警不足、有些迂腐、哈哈哈、不过瑕不掩瑜、善良而又有责任心的他应该赢得了不少人的好感 华筝 善良、专一、任性、顾大局、对她没有蓉儿喜欢的深、却想不到有什么不好的地方 穆念慈 善良、希望过平凡的生活可生活却给了她一个不甘心平凡的相公 杨康 好的一点是 对自己在乎的人是很真心的、比如父王、母亲、念慈、师傅、不能忍受的是 做事情太残忍、不善良、喜欢他的规划性、年纪不大、做事情缺能充分考虑、前后关联、这种思维很重要, 如果方向不偏、应该是有一番成就的、抢夺丐帮帮主那事儿、我觉得不是一般20岁的孩子就能达到的思维水平、可以认可的是能力、但不证明他做的事情是正确的 丘处机 我觉得最不好的一点是 每次不给人说话的机会、太过于按照自己的想法去判定 至少 在开篇和江南奇怪打起来、导致主持过世他是有一部分责任的、如果先搞清楚是非黑白、就不至于这样、孙x来着的、同样的问题 老顽童 哈哈哈、很深入人心的一个角色、任性、贪玩儿、武功很好、对朋友也很好、有时候责任心不够 洪七公 武功好、人好、不古板、耐心好、我最欣赏的角色之一、不像大多数的角色一样、不给人说话解释的机会 黄老邪 挺喜欢的、热情、不古板、博学、有责任心、若说做错了什么、大概就是对他那几个徒儿吧、角色整体来说很喜欢、喜欢那份儿潇洒、喜欢那份儿真诚、或许也是经过世事历练的成长吧、从很多回忆来看、年轻时应该比较狂傲、大抵也不怎么听得进去劝~ 共性: 大侠们不喜欢搞清楚事实、过于江湖义气、过于在乎名誉 可能最喜欢的角色是一灯大师、一直的善良、对瑛姑的钟爱、人生鼎盛时的峰转、归于自身的身心修养、喜欢这种淡淡的人生态度~~~

在google浏览器下安装vue-devtools扩展

一、下载vue-devtools,下载地址:https://github.com/vuejs/vue-devtools 二、解压到对应目录,例如: D:\软件\vue-devtools-dev 三、进入解压的目录中 1.执行命令:npm install (需要静心等待一会) 2.执行命令:npm run build 3.修改配置文件,D:\软件\vue-devtools-dev\shells\chrome目录manifest.json文件里的"persistent":false改成true 4.打开扩展程序页面,然后点击"加载已解压的扩展程序 ",选择D:\软件\vue-devtools-dev\shells\chrome 5.在插件目录vue-devtools-dev下执行命令npm run dev,这样插件就会安装在浏览器中了。 打开localhost:8080可以看到插件已经安装并运行了 在vue项目页面下,按F12就可以看到vue面板 注:如果后期vue面板出不来,再到vue-devtools-dev文件夹下执行一遍npm run dev即可 ps : 如果图标亮但不能调试并且提示: Vue.js is detected on this page. Devtools inspection is not available because it's in production mode or explicitly disabled by the author. 是因为你页面引用的vue是压缩版本的,默认会关闭调试,要引入vue.js。 另外种方法是在或者在代码的主文件中配置vue的环境: Vue.config.devtools = true; (该方法没有亲测)

win10优化大师 v 1.0.0.8

软媒win10优化大师是一款针对win10系统的系统优化软件,有着软件管家、Win+X菜单管理、右键菜单快捷组、应用缓存清理、桌面显示图标等等多个常用功能,能更好的对用户的win10系统进行优化和清理,使用电脑毫无压力,就是那么流畅,操作简单,各个功能只需一键,就把你电脑清理的干干净净,优化的更加流畅,而且软媒win10优化大师还时刻保护着你的电脑,可以对系统进行加固,还可以对win10进行个性设置,win10用户快点安装win10优化大师试试吧! win10优化大师 特色功能 1、优化向导 轻点几下,操作电脑得心应手,涉及系统安全、网络、易用性、个性化操作,将Win 10调节至最佳状态! 2、软件管家 优秀的软件管理工具,轻松收藏、安装自己喜欢的软件和系统主题,100%纯净、100%屏蔽插件、100%无骚扰! 3、右键菜单快捷组 右键菜单快捷组,只需在桌面上点击鼠标右键,就可打开常用程序、进行关机重启操作,So Easy! 4、守护 维持系统最佳状态,提高系统安全性,保护浏览器主页、搜索引擎不被篡改,有了win10优化大师从此可以安心使用电脑了。 5、应用缓存清理 高效清扫Metro应用缓存,自动检测并清理磁贴应用缓存,节约硬盘空间、提升系统效率! 6、win+X菜单管理 win10优化大师扩充开始按钮右键功能,找回屏幕左下角经典的“开始菜单”,自定义每一项功能,让屏幕左下角都变得方便起来! 7、桌面显示图标 桌面有啥图标听我的,随心所欲调整桌面图标,快速找回用户文件、控制面板、回收站、IE浏览器的快捷方式! 8、应用布局备份还原 一键备份、还原应用布局,极速备份开始菜单和开始屏幕应用布局,再也不用担心它们丢失了! 更新日志: v 1.0.0.8(2019-09-05) 1、新增:支持Win10 Build 10061、10074、10102版本 2、新增:常用开关-开启开始菜单和任务栏Aero效果(仅支持10074或以后) 3、新增:常用开关-禁用任务栏和开始菜单透明(仅支持10056或之后) 4、新增:常用开关-使用经典任务栏时钟(仅支持10056或之后) 5、新增:常用开关-隐藏文件资源管理器左侧导航栏中的U盘、光盘等移动设备 6、改进:常用开关-将部分选项归为个性化分类中 7、改进:右键菜单快捷组-在文件夹右键菜单中创建快捷组时,会导致开始菜单的文档按钮功能错误,因此暂时不在此处创建菜单 8、修正:稳定性-修改Win+X菜单时可能发生的崩溃问题

分辨率、Dpi 的关系

概念: 分辨率,指的是图像或者显示屏在长和宽上各拥有的像素个数。比如一张照片分辨率为1920x1080, 意思是这张照片是由横向1920个像素点和纵向1080个像素点构成,一共包含了1920x1080个像素点。 dpi是分辨率的表示单位之一。它是英文Dot Per Inch的缩写,意思是“每英寸的点数”。上面我们说的 1920x1080或者800x600,是没加度量单位的简写,如果写全度量单位,完整的分辨率写法应该是 1920x1080dpi或者800x600dpi。 分辨率确实跟屏幕dpi有关系,但这个dpi跟屏幕大小直接影响到显示效果,比如说6寸的1080p 绝对没有4寸的1080p好,同样分辨率,大了就降低了dpi。但这只是在同一种材质的屏幕上, 换到电脑显示器,哪就不一样了,这个分辨率就跟dpi没有多大关系了,这个只是单纯的指可 支持的图片事情分辨率大小了,分辨率可以调的。 : : : 例子:分辨率300dpi中的dpi是什么?是像素/英寸?还是像素/厘米? 1.是图像每英寸长度内的像素点数,是一个单位,表示打印精度。 2.是像素/英寸。 3.dpi的意思是每英寸墨滴点数,比如600dpi的意思就是每英寸墨滴的个数为600。 打印尺寸、图像的像素数与打印分辨率之间的关系可以利用下列的计算公式加以表示: 图像的横向(竖向)像素数=打印横向(竖向)分辨率×打印的横向(竖向)尺寸; 图像的横向(竖向)像素数/打印横向(竖向)分辨率=打印的横向(竖向)尺寸。 针对特定的图像而言,图像的像素数是固定的,所以,打印分辨率和打印尺寸便呈现反比的关系。 如,1200×600dpi的意思是每平方英寸里面,横向的墨滴个数为1200,纵向的墨滴个数为600。 : : 同时: 4.dpi是英文dotperinch的缩写,表示每英寸点数(像素)。此数越大表示点越小,分辨率越高、 照片更清晰,可以放得更大而不至于模糊。** 图像的物理宽度(以英寸为单位)等于像素宽度除以水平分辨率。 例如,像素宽度为 216、 水平分辨率为 :72 点/英寸 的图像,它的物理宽度:216/72= 3 英寸。 也同样适用于 像素高度和物理高度。 使用图像的物理大小绘制图像,无论显示设备的分辨率(每英寸点数)是多少,图像大小(以英寸为单位) 都是正确的。 例如,假定图像的像素宽度为 216,水平分辨率为 72 点/英寸。 如果调用此方法在分辨率为 96 点/英寸的设备上绘制该图像,则所呈现图像的像素宽度就是: (216/72)*96 = 288。 : : : 如图,以像素/每英寸为单位的分辨率就是以dpi为单位。

(二)Andfix的手写实现

在上一篇Andfix文章中(一)Andfix热修复原理中提到了,Andfix需要根据Android版本来维护,所以要适配不同的Android版本,这里根据Android5.1版本为例,简单介绍一下Andfix的手写实现。 一、生成修复后java类的dex文件 假如类A中的方法B有bug,新建一个A_fixed类,并添加一个B方法,这里的B方法是修复后的,然后重新编译,生成dex文件,在app/build/intermediates/javac/debug/complieDebugJavaWithJavac/classes/包名路径下有全部类的class,将完整包名文件夹都复制出来,然后文件夹中只留下修正后的类的class文件 用dx命令生成dex文件(需要配置环境变量,具体方法: ) 然后会在配置的路径下生成一个dex文件(将这个文件放到服务器) 二、创建一个DexManager管理类管理dex的替换 回到项目代码: 新建一个DexManager管理类管理dex的替换 //加载dex文件,拿到修复好的class文件 DexFile dexFile = DexFile.loadDex(file.getAbsolutePath(),new File(mContext.getCacheDir(),"opt").getAbsolutePath(),Context.MODE_PRIVATE); Enumeration<String> entries = dexFile.entries(); while (entries.hasMoreElements()) { String className = entries.nextElement(); Class fixedClass = dexFile.loadClass(className, mContext.getClassLoader()); if (fixedClass != null) { fixClass(fixedClass); } } 要拿到修正的方法,就要在修正后的方法中添加自定义注解,告诉程序这个方法对应要替换的是哪个类的那个方法,自定义注解如下: @MethodReplace(className = "包名.A",methodName = "B") fixClass(Class fixClazz) 找到方法并替换: Method[] methods = fixClazz.getDeclaredMethods(); MethodReplace methodReplace; String className; String methodName; Class<?> bugClass; Method bugMethod; for (Method fixMethod : methods) { methodReplace = fixMethod.

(一)Andfix热修复原理

AndFix,全称是Android hot-fix。是阿里开源的一个Android热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug。支持Android 2.3 到 7.0。 一、动态加载 热修复、热更新、插件化都是利用动态加载的原理(相关知识:类加载机制、虚拟机) 二、热修复 Andfix(最轻量级的热修复,只能改方法)Android热修复的先驱,通过动态加载dex文件,在native层进行方法替换实现热修复,局限性:兼容性问题,每个Android版本都需要维护一套Andfix的实现代码,维护麻烦,现该开源库已停止维护了。优点:即时生效。 Tink dex替换,是在java层实现,不足:冷启动后生效 三、源码追踪 要通过方法替换实现热修复,那么就需要去了解一下底层的类加载机制,特别是方法加载这一块的具体实现流程。 大概流程就是先加载类,然后再将类中的method和field加载到class中,具体如下: 1、env->FindClass jni函数中找到类的函数(方法在类里面,根据类加载找到方法加载的途径) 2、ClassLinker::FindClass 是env->FindClass的主要实现的函数。 3、DefineClass 是ClassLinker::FindClass 中返回的类的类型。 4、LoadClass 在DefineClass 中调用,此函数是加载类的主要函数。 5、LoadClassMembers 在LoadClass中调用,此函数是加载方法的函数。 6、LinkCode 在LoadClassMembers中调用,此函数是加载字节码的函数。 7、LinkMethod 在LinkCode中调用,此函数设置方法的执行入口(两种:SetEntryPointFromPortableCompiledCode 和 SetEntryPointFromQuickCompiledCode)。 8、NeedsInterpreter 在LinkCode中调用,此函数设置是否需要解释器。 9、UnregisterNative 在LinkCode中调用,此函数中设置了访问权限和入口。 10、UpdateMethodsCode 在LinkCode中调用,此函数刷新方法的字节码。 11、UpdateEntrypoints 在UpdateMethodsCode中调用,此函数更新方法入口。 四、源码分析: 这里只列出关键代码片段,想直接看源码的话可以点每个方法的链接进去网页看 /art/runtime/mirror/art_method.h art_method 方法的结构体 592 struct PACKED(4) PtrSizedFields { 593 // Method dispatch from the interpreter invokes this pointer which may cause a bridge into 594 // compiled code.

js中 $的意思和用法

$("id"),是因为别人在别的地方定义了一个函数, function $(id){ return document.getElementById(id); } 这样以后用起来比较方便,或者人家导入了框架像jquery,当然直接$('id')是不可以的 $("#id")=document.getElementById("id");这样写看的懂吧,标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId'),绑定id前面要加一个"#",如果不加的话他绑定的是标签,而不是一个id,比如这个$("li").click(function(){ alert($(this).html()); 这个就是绑定li标签,点击所有的li标签都会触发这个点击事件。 如果你要用$(“#id”),你得引入JavaScript框架,你可以加上这个标签就可以了 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> 油猴脚本用法: // @require https://code.jquery.com/jquery-3.3.1.min.js

layui引用jquery、jquery-cookie

1.引入jquery layui.use(['layer', 'form','jquery'], function() { var layer = layui.layer, $=layui.jquery, form = layui.form(); //这样就可以正常使用jquery了 $("#btn").click(function(){ layer.msg('hello world') }) ; }); 2.引入jquery.cookie 将jquery.cookie源码修改为: layui.define(["jquery"], function (exports) { var jQuery = layui.jquery; (function ($) { /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2013 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory);