跳转界面是通过进栈和出栈的方式进行的
最简单的跳转方式如下
Navigator.push( context, MaterialPageRoute( builder: (context) => const ResetPasswordSubmitStateless()), ); 出栈方式
Navigator.pop(context); 如果你想出两个栈就如下
Navigator.pop(context); Navigator.pop(context); 如果你想带参数跳转
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) { return ResetPasswordSubmit(//这个是要跳转的界面 userPhone: _userPhoneController.text,//参数一 userCode: _AuthCodeController.text,//参数二 ); })); 接收的地方
class ResetPasswordSubmit extends StatefulWidget { String userPhone;//全局 String userCode; ResetPasswordSubmit({key, this.userPhone, this.userCode}) : super(key: key);//这里接收 @override ResetPasswordSubmitState createState() => ResetPasswordSubmitState(); } 使用如下
print("${widget.userPhone}"); print("${widget.userCode}"); 第一个界面如下
import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'DialogRouter.dart'; import 'LoadingDialog.dart'; import 'ResetPasswordSubmit.
代码:
void wxTestDialog::OnPaint(wxPaintEvent& event) { /* wxPaintDC */ wxPaintDC dc(this); /* 准备wxMemoryDC */ wxMemoryDC memDC; wxRect rect = this->GetRect(); wxBitmap bitmap(rect.GetSize()); memDC.SelectObject(bitmap); /* 开始绘图 */ memDC.SetBackground(*wxRED_BRUSH); memDC.Clear(); double r = 5; wxCoord x, y, lstX, lstY; memDC.SetPen(*wxWHITE_PEN); for (int a = 0; a <= 720; ++ a) { double b = a * 3.1415 / 180; x = cos(b) * r; y = sin(b) * r; if(a != 0) { memDC.
举例一 一、视图 二、代码 作者:CoderMan 链接:https://www.zhihu.com/question/503639152/answer/2257427351 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 clear;clc; [x, y, z] = peaks(30); min_z = min(z(:)); max_z = max(z(:)); % 映射到 0 - 1 z = (z - min_z) ./ (max_z - min_z); % 映射到 0 - 1000 z = z * 1000; % 颜色 简单起见 设置成数据范围大小的数组 c_map = zeros(1000, 3); % 绿色 c_map(1:160, :) = repmat([0, 1, 0], 160, 1); % 蓝色 c_map(161:260, :) = repmat([0, 1, 1], 100, 1); % 黄色 c_map(261:530, :) = repmat([1, 1, 0], 270, 1); % 红色 c_map(530:end, :) = repmat([1, 0, 0], 471, 1); subplot(1, 2, 1) surf(x, y, z); colormap(c_map) colorbar shading interp subplot(1, 2, 2) contourf(x, y, z); colormap(c_map) colorbar 举例二、MATLAB画二维线条渐变颜色
在VOIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,30秒就断线,注册问题,回声等。这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定的排查方式,工具非常高效地解决这些问题。但是,因为读者技术水平参差不齐,网络上的很多技术也不完整。笔者今天系统归纳了这些问题。根据一些用户的使用环境和用户经常遇到一些问题,我们列举了以下十个在SIP呼叫中经常遇到的问题,并且给出了相应的排查方式,博主weixin@yuyinjiqiren用户可以按照这些方法来解决SIP通话中的这些问题。这十个经典的问题包括:
不能注册或呼叫到SIP服务器端
30秒挂断呼叫的黄金法则
咬线或摘机状态
单通或无语音
收到400 bad request
收到413,513 Request Entity Too Large或Message Too Large消息
收到408, 480或者487 消息
483 - Too Many Hops
488 – Not Acceptable Here
语音质量和思科语音文件示例分享
这里,读者一定要注意,我们这里仅讨论关于SIP环境中的常见问题,博主weixin@yuyinjiqiren可能涉及网络环境或者硬件终端的问题,因为很多厂家和SIP服务器的配置不同,可能存在一定的差异,所以用户在我们的方法中特别需要根据厂家的不同,增加一些专门针对每个厂家或者SIP服务器的排查方式。我们仅讨论一般情况下的排查方式。
1
在一般的SIP 环境中,通常来说,SIP 终端需要注册到SIP服务器端来实现认证,服务器端获得SIP终端的位置,然后才能进行正常的呼叫流程。注册问题可能有以下几种呈现方式:
不能注册,完全没有和SIP服务器连接。如果终端发送注册消息给服务器端时,双方完全可能完全没有实现通讯。用户需要在服务器端通过日志排查方式,检查SIP终端是否有注册消息进入到服务器端,或者SIP终端通过网络工具对服务器端进行排查,例如使用Ping 命令。如果连Ping命令都检测不到服务器地址,基本上可以断定SIP终端根本没有和服务器端连接。关于服务器端排查方式很多,最典型的就是使用的Asterisk,FreeSWITCH,OpenSIPS或者Kamailio等开源的软交换平台。每个平台都有各自的排查命令,用户可以参考官方手册来判断。当然,用户也可以使用linux排查工具对5060端口抓包排查(例如,sngrep)。本人非常推荐这个工具,非常好用,可以实时检查SIP消息。
SIP终端发出了注册消息,但是SIP服务器端没有返回的消息。如果SIP终端对SIP服务器端发送了注册消息,但是服务器端没有返回响应消息,则可能是服务器端的问题。用户需要排查服务器端为什么没有返回消息,或者在返回路径上的节点是否出现了问题。
客户端收到错误消息,收到太多401/407 Unauthorized。SIP终端在注册时,如果用户的安全设置出现了错误,可能导致服务器端发送多个 401 错误。服务器端第一次发送到是正常的401验证信息,如果连续多次发送401/407 错误的话,可能是SIP终端输入了错误的用户账号信息,SIP终端侧需要配合服务器端进行排查,也可能服务器端的SIP账号消息保存错误,或者没有重新加载服务器相应模块,用户最好通过服务器端的CLI命令来检查内存中的SIP终端的真实数据信息。
客户端收到403 Forbidden 消息。如果用户帐户信息没有问题的话,SIP终端可能没有输入正确的From domain或者R-URI。有时,服务器端禁止同时注册几个SIP终端账号,或者注册过于频繁,服务器端可能过滤了此地址。需要用户配合服务器端地址进行进一步检查。这里,笔者仅讨论注册阶段出现的403 问题,当然也可能是系统防火墙或者其他的配置禁止了注册消息。如果是呼叫时出现403的话,则可能是另外的原因,例如可能欠费,可能呼叫了服务器端禁止的号码码位等其他因素。
2
我们经常会遇到客户抱怨这样的问题,电话通话时,在大概30秒左右就断线。这样的问题最主要的原因是SIP终端没有收到ACK消息。SIP终端发送了 200 OK以后就开始了媒体的创建,RTP语音流开始启动,事实上,SIP终端可能还没有收到ACK消息,因此在30秒左右,没有收到消息的一方就发送了一个BYE消息。那么,为什么我们没有收到ACK消息呢?
具体的场景如下两种示例,返回时因为NAT问题导致ACK没有办法返回到相应的终端:
在很多应用场景中,用户可能遇到更为复杂的NAT环境,如果其中一个代理出现了NAT处理无效的结果,就可能导致整个SIP信令路径出现ACK丢失的问题。
一般情况下,缺少ACK消息的原因主要来自于以下几个方面:
Contact header 错误
客户端没有支持router header
网关在NAT后
Contact header 的地址在NAT后
以上几种情况都需要用户排查网络环境和NAT设置。因为NAT问题,ACK返回的路径地址发生了改变,所以SIP终端没有收到ACK消息。
一些厂家的设备或者媒体服务器也有类似的设置,例如Lync 服务器,它支持了RTCP 呼叫活动检测功能,如果超过30秒的检测周期没有收到RTCP数据包,则会挂机。在开源Asterisk平台上,RTP的默认设置时间为30秒,一些SIP运营商可能会忽略UPDTAE消息,在SIP的设置中可以对其进行设置调整disallowed_methods=UPDATE 或SIP的会话定时器设置。
3
查看内核代码位置 bitbake -e linux-s32 | grep ^S=
重新编译内核和dtb bitbake linux-s32 -C compile -f
查找精确的软件包名字 bitbake -s | grep linux
查找软件包任务配置 find -name linux-s32*.bb
查看软件包支持哪些可执行的动作 bitbake <软件包名字> -c listtasks
yocto中rpm包管理 http://static.kancloud.cn/digest/yocto/138638
显示层 bitbake-layers show-layers
显示所有task bitbake-layers show-recipes
查找软件包: oe-pkgdata-util find-path /usr/bin/nc.netcat
查看软件包部署哪些文件: oe-pkgdata-util list-pkg-files
批量查找二进制文件所属的软件包 cat ~/work/f | xargs -d\n -n1 oe-pkgdata-util find-path
f文件内容: /bin/dnsdomainname /bin/hostname.net-tools /bin/su /bin/su.shadow ... ... 批量查找rootfs里面有没有二进制文件 cat ~/work/binarys | xargs -d\n -n1 find -name | sort
python 基于标签的推荐Tag-based及SimpleTagBased、TagBased-TFIDF等算法实现 1. 概览2. 基本概念2.1 用户画像2.1.1 定义2.1.2 步骤2.1.3 标签来源2.1.4 标签相关的数据结构2.1.5 如何给用户推荐标签 2.2 Simple Tag-based2.2.1 计算公式 2.3 Norm Tag-based2.3.1 计算公式 2.4 Tag-based TFIDF2.4.1 计算公式 3. 代码实现3.1 数据介绍 3.2 基于pandas dataframe的标签推荐3.2.1 python代码3.2.2 结果展示 1. 概览 本篇主要介绍关于推荐算法相关的知识:基于标签的推荐,涉及了3个原理较简单的计算方法(Simple Tag-based、Normal Tag-based、Tag-based-Tfidf ),以及基于pandas dataframe的python代码实现。
dataframe的效率比用字典实现低很多,主要是因为该算法涉及到较多的取值操作,字典的取值的平均时间复杂度当然要比dataframe用loc快很多。
2. 基本概念 2.1 用户画像 2.1.1 定义 用户画像毋庸置疑,即是对用户行为特征的总结归纳和描述,以更好的提升业务质量。
2.1.2 步骤 定义全局的用户唯一标识id(例如身份证、手机号、用户id等)给用户打标签根据标签为为业务带来不同阶段的收益。在用户生命周期的3个阶段:获客、粘客、留客 中,根据各类的用户数据对用户进行标签化、用户画像等,尽最大限度对用户进行留存。 2.1.3 标签来源 PGC:通过工作人员进行打标签(质量高,数据规范)
通过聚类算法对物品进行降为形成不同的标签。物品的标签化,本身是对物品的降维,所以可以利用聚类、降维的方法进行物品标签的生成。目前主流的聚类方法有:Kmeans,EM,DBScan,层级聚类,PCA等等。
UGC:通过用户进行打标签(质量低,数据不规范)
2.1.4 标签相关的数据结构 用户打标签的记录【user_id, item_id, tag】用户打过的标签【user_id, tag】用户打过标签的item【user_id, item】打上某标签的item【tag, item】同样打过某标签的用户【tag, user_id】 2.1.5 如何给用户推荐标签 根据用户的标签行为数据,通过SimpleTagBased 、 NormTagBased 及 TagBased-TFIDF 等方法,当用户A给某item打了标签T,进行以下4种类型的推荐:
TeamViewer删除信任设备 因为TeamViewer免费版的设备限制在了2个,所以每次都会去删设备。
它的页面藏得真的深。
在右上角有个编辑配置文件
当时真的找了好久
就可以发现可信任设备 的选项了
最后选择你想删除了设备点击删除即可
问题引入 有时我们会遇到一维数组、二维数组、矩阵之间的相互转换问题,清楚的区分一维数组、二维数组的特点和操作方式便会轻松的处理问题。
例如:
一维数组:int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; //静态初始化
现在定义一个3行4列的二维数组:int b[3][4],那么如何将数组a中的元素分别存储到数组b中呢?基于此,我们采用3中形式实现,每一种形式原理相同,区别在于“赋值结构、形式”的变化。
代码实现 1.第1种方式(基础方法) (1)代码实现 #include<stdio.h> int main(){ printf("第 1 种方法:\n\n"); int i,j;//控制循环的变量 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};//一维数组 int b[3][4];//二维数组 int k=0;//控制数组a中数值位置 for(i=0;i<3;i++){ //控制行 for(j=0;j<4;j++){ //控制列 b[i][j]=a[k];//每行4个元素,赋完为止 k++; } } //输出查看 for(i=0;i<3;i++){ //控制行 for(j=0;j<4;j++){ //控制列 printf("%3d ",b[i][j]); } printf("\n");//换行 } } (2)运行结果 2.第2种方式(借助边界) (1)代码实现 #include<stdio.h> int main(){ printf("第 2 种方法:\n\n"); int i,j;//控制循环的变量 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};//一维数组 int b[3][4];//二维数组 for(i=0;i<12;i++){ //控制数组a b[0][i]=a[i]; //赋值 } //输出查看 for(i=0;i<3;i++){ //控制行 for(j=0;j<4;j++){ //控制列 printf("
使用工具:VSCode
目录
一、快速生成HTML模板
二、在浏览器观察页面的基本结构
三、添加注释
四、标题标签
五、段落标签
六、标签,换行~
七、几种格式化标签
八、img图片标签
九、超链接标签
十、表格标签
十一、列表标签
十二、表单标签
十三、无语义标签
关于HTML的更多内容,参考以下文档:MDN HTML文档:HTML(超文本标记语言) | MD
一、快速生成HTML模板 输入!,并且按Tab,就可以生成一组默认的页面模板
二、在浏览器观察页面的基本结构 按F12,打开开发者工具~
通过修改title标签修改网页标题,boby标签内部为浏览器内容,此处文章内容为hello world~,页面标题为Test。
三、添加注释 注释是:<!-- -->
可以直接通过ctrl + / 来切换注释~~
可以看出,类似于IDEA,注释并不起到什么实质性的作业,网页中并不显示注释的内容~~~
注意:注释不能嵌套~
四、标题标签 h1-h6
数字越大,里面的内容,就越粗越大
数字越小,里面的内容,就越细细越小
输入标签名,按Tab就可以快速生成一对标签
五、段落标签 附加操作:每个段落首行缩进两个汉字:
HTML无法实现,需要搭配CSS来实现
六、标签,换行~ 在HTML中,换行会被直接忽略,要想内容中换行,需要使用<br>标签。
<br>标签是一个单标签,只有开始标签,没有结束标签。
在此处同时存在一个问题,HTML也会忽而略空格。会把多个相邻的空格,合并成一个空格。
如果想要使用多个空格,就需要使用转义字符。
除了空格之外,像<>&等这些特殊符号,就需要使用转义字符~
常见的几个转义字符:
几个空格,就几个转义字符~
七、几种格式化标签 页面效果如下: 这几个格式化标签,不是独占一行的,如果想要换行,就需要使用<br>标签~
八、img图片标签 下面对这些标签内的属性进行描述:
src:通过这个属性来指定一个具体的图片资源,写法格式参考文件操作时的文件路径选择~
alt:如果这个图片发生错误,则要描述一个内容,表示这个图片曾经存在过~
titile:光标放到图片之后,有一个小小的提示框~
width:表示宽度~
height:表示高度~
border:给图片加上边框~
下面来看页面效果:
九、超链接标签 <a href=""></a>
href属性:双引号内部是是一个网页的网址。
标签内容:可以在页面中点击标签的内容进行页面跳转,从初始页面转到双引号内部的页面
页面如下:
此时可以点击这个超链接跳转至百度页面~
等式约束二次规划 基本思想变量消除法对 A x = b Ax=b Ax=b的求解唯一解条件 KKT法拉格朗日法到KKT点两种方法的比较 基本思想 如果遇到这种简单的问题:
m i n x 1 2 + x 2 2 + x 1 + 2 x 2 s . t . x 1 + x 2 = 1 \begin{aligned} &min x^2_1+x^2_2+x_1+2x_2 \\ &s.t. x_1+x_2=1 \end{aligned} min x12+x22+x1+2x2s.t. x1+x2=1
基本的思想就有两个,第一种是消除一个变量,这样就可以很简单的求解出来:
m i n ( 1 − x 2 ) 2 + x 2 2 + 1 − x 2 + 2 x 2 \begin{aligned} &min (1-x_2)^2+x^2_2+1-x_2+2x_2 \end{aligned} min (1−x2)2+x22+1−x2+2x2
Flink中Window的介绍和使用 Flink中的窗口大致分为两类,分别是Keyed Windows和Non-Keyed Windows,接下来我们从其简单应用方面看看Window都包含哪些内容,基本的用法等。
1. 窗口分类 1. 按照使用场景分类 Keyed Windows:跟在KeyedStream后使用
stream .keyBy(...) <- keyed versus non-keyed windows .window(...) <- required: "assigner" [.trigger(...)] <- optional: "trigger" (else default trigger) [.evictor(...)] <- optional: "evictor" (else no evictor) [.allowedLateness(...)] <- optional: "lateness" (else zero) [.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data) .reduce/aggregate/apply() <- required: "function" [.getSideOutput(...)] <- optional: "output tag" Non-Keyed Windows:直接使用WindowAll
stream .windowAll(...) <- required: "assigner" [.
目录
1 断点调试
2 Debug的优化设置:更加节省内存空间
3 条件判断
4 查看表达式的值
1 断点调试 调试Debug在开发中大量应用
作用
可以有效地看到程序运行的步骤,可以看到程序一步一步运行数据的变化。
断点调试按钮解释
步骤:
打断点------->Debug
一步一步的向下运行代码,不会走入任何方法中。
一步一步的向下运行代码,不会走入系统类库的方法中,但是会走入自定义的方法中。
一步一步的向下运行代码,会走入系统类库的方法中,也会走入自定义的方法中。
跳出方法
结束程序
进入到下一个断点,如果没有下一个断点了,就直接运行到程序结束。
在当前次取消未执行的断点。
2 Debug的优化设置:更加节省内存空间 Debug的优化设置:更加节省内存空间:
设置Debug连接方式,默认是Socket。 Shared memory是Windows 特有的一个属性,一般在Windows系统下建议使用此设置,
内存占用相对较少。
3 条件判断 【1】条件判断:
说明:
调试的时候,在循环里增加条件判断,可以极大的提高效率,心情也能惧悦。 具体操作: 在断点处右击调出条件断点。可以在满足某个条件下,实施断点。 4 查看表达式的值 【1】查看表达式的值:
选择行,alt+f8。
项目的需求是设定一个 预算日均值线 ,虽然是日均,但是和查询出来的每日数据毫无关系,并不是每日数据的均值,如果直接按照echarts中:
series : [ { name:'示例', type:'line', data:[10,20,30,40], markLine : { data : [ { type : 'average', name: '平均值' } ] } } ] 这样的 均值线 的数值是 data中数据的平均值,达不到我想要的自定义数据的要求。(值不能自定义)
有些查询结果是利用 label 中的 formatter 自定义了一个显示结果,举个例子:
如刚刚 data:[10,20,30,40], 实际的均值是 25 ,但是我想要的均值线是 28 ,于是我就把显示的 25更换为想要的数据。
这样有一个巨大的弊端,就是数据的实质还是25,它的位置永远都是25,不会因为你修改了而改变,所以一旦你的均值线数据是 35 ,图表上依然在 25 的位置,一眼假。(位置不正确)
正确的方法应该是:
如图,设置对应的yAxis值就可以得到想要的均值线(值自定义 且 在正确的位置),完整如下
markLine: { data: [ { yAxis: **值** } ] } 补充:也可以做一条数据恒定得折线,变相得到直线
背景: 因为项目要加水印,所以才有以下事情。
首先,使用的是php的gd库,但服务器环境上的gd库没有webp格式处理函数,而且gd库是连同php源码一起安装,所以无法处理webp格式。后来使用,imageMagick,是高效处理图片的应用。在本地安装,使用没问题,线上服务器时候,发现缺少处理webp格式的相关扩展。怀疑有三: 是系统类库里,或者imageMagi,缺少对webp图片格式的支持是安装imageMagic,时候缺少相关安装命令是imageMagic版本问题 目前问题定位并没有解决,相关试错成本太高,而且没有意义,结论成功能用就行
安装流程 1,下载&&安装imagegick
wget https://www.imagemagick.org/download/ImageMagick.tar.gz tar -xvfz ImageMagick.tar.gz cd ImageMagick-7.0.10-28 ./configure --prefix=/usr/local/imagemagick --with-webp=yes // 重要,这行 make && make install 2,安装php-imagick扩展(使用pecl安装)
pecl install imagick /usr/local/imagemagick 在php.ini中加入这个行extension=imagick.so 3,查看支持的格式
imagegick: convert -list formatphp --ri imagick
4,若是缺少webp库类,可以通过yum安装 yum -y install libwebp-devel libwebp-tools PS:源码安装php-imagick扩展
链接: 源码安装——php-imagick扩展.
1,官网地址下载:
https://www.apachehaus.com/cgi-bin/download.plx 2,本地解压
3,打开 安装目录\conf\httpd.conf,修改以下信息(修改 ROOT 路径)
4,进入 bin 路径下,以管理员身份打开终端:输入
httpd.exe -k install -n "MyServiceName" 把 Apache 当作一个 Windows NT 服务来运行,MyServiceName 为服务名,可以自定义,安装后直接下次启动apache时,直接调用相关服务名即可
5,apache 服务器卸载
httpd.exe -k uninstall -n "MyServiceName" 6,启动apache 之前, 可以测试 apache 服务配置文件是否合法,测试命令:
httpd.exe -n "MyServiceName" -t 7,启动 apache 命令
httpd.exe -k start -n "MyServiceName" 8,停止 apache 命令
httpd.exe -k stop -n "MyServiceName" 或
httpd.exe -k shutdown -n "MyServiceName" 9,当修改完 apache 配置文件后,可以用以下命令启动 apache
httpd.exe -k restart -n "MyServiceName" 10,apache 启动后可以 任意打开一个浏览器,输入 localhost 来进行测试,出现类似于下面,欢迎页界面,代表已经安装成功了。
问题分析 “水仙花数”是指一个三位数,其每位数字的立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 基于此,利用for循环控制100-999个数,每个数分解出个位,十位,百位,再分别求立方相加并判断即可。
代码实现 //导入头文件 #include<stdio.h> #include<stdlib.h> //主函数 int main(){ int i,j,k,n,sumi,sumj,sumk;//定义7个整型数据 printf("\n100-1000 包含的“水仙花”数分别有: \n\n"); for(n=100;n<1000;n++){ //循环求数字个位、十位、百位上的数字 i=n/100;//求百位 j=n/10%10; //求十位 k=n%10; //求个位 //求i、j、k的立方和 sumi=i*i*i;//求个位立方和 sumj=j*j*j;//求十位立方和 sumk=k*k*k;//求百位立方和 //判断是否为 水仙花数 if(n==sumi+sumj+sumk){ printf("%-5d",n);//输出 水仙花数 } } printf("\n");//换行 return 0; } 运行结果
环境 系统:Ubuntu 22.04
Python版本:3.10.4
安装lsp-mode及lsp-pylsp 第一步 使用use-package安装lsp-mode
(use-package lsp-mode) 或者
M-x package-list-packages查找lsp-mode并安装
注:查找快捷键C-s (ctrl+s) 第二步 参考Python-LSP-Server并安装python-lsp-server
依次执行以下命令:
pip install -U setuptools pip install 'pyhon-lsp-server[all]' pip install pylint #按照github上的安装步骤完成后,打开emacs会报错 按照错误提示安装pylint pip install pylint --upgrade pip install pyls 如果提示警报:
WARNING: The script pylsp is installed in '/home/chen/.local/bin' which is not on PATH. 在终端依次输入:
echo echo 'export PATH=/home/chen/.local/bin:$PATH' >>~/.bashrc # /home/username/.local/bin chen为我的用户名 source ~/.bashrc 再一次重复按转步骤
安装完成
最近了解这个k8s在PVC存储这儿卡了两天,今天终于算是大概搞明白是个怎么回事了。
以下是该过程的总结:
创建由物理存储支持的 PersistentVolume。你不会将卷与任何 Pod 关联。
创建一个 PersistentVolumeClaim, 它将自动绑定到合适的 PersistentVolume。
创建一个使用 PersistentVolumeClaim 作为存储的 deployment
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
原理图 路径说明/mnt/data本地主机上的目录/app/wizminikube容器里的路径/wiz/storage/pod的路径 步骤 镜像拉取 这里以WIZ为测试,具体可以参考为知笔记docker私有化部署 docker pull wiznote/wizserver minikube 挂载本地目录 启动挂载 minikube start --mount --mount-string="/mnt/data:/app/wiz" 验证 minikube ssh cd /app/wiz # 创建一个文件再去主机上 /mnt/data 查看是否存在即可 PV 创建 配置文件wiz-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: wiz-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/app/wiz" 部署 kubectl create -f wiz-pv.yaml 查看 kubectl get pv 删除 kubectl delete pv wiz-pv-volume PVC 创建 配置文件wiz-pvc.
前言 本文讲述使用kubernetes建立纯ipv6的集群,以及ipv6网络插件该如何设置。
实验环境 我所使用的平台是VMware,在其中创建了CentOS7的虚拟机,在上面进行实验部署。在创建虚拟机的时候需要支持ipv6网络,我所设置的网络模式为NAT模式,然后在虚拟网络编辑器里选择NAT设置,如下图所示:
然后选择启用IPv6,如下图所示:
之后启动虚拟机,使用ifconfig命令可以看到ipv6地址
然后在每台虚拟机上开启ipv6转发
sysctl -w net.ipv6.conf.all.forwarding=1 部署集群 首先在充当master节点的主机上建立一个kubeadm-config.yaml的kubeadm配置文件,其中的ipv6地址需要改成你自己主机的ipv6地址
apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: "fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7" bindPort: 6443 nodeRegistration: kubeletExtraArgs: node-ip: fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7 --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.23.5 networking: podSubnet: 2001:db8:42:0::/56 serviceSubnet: 2001:db8:42:1::/112 etcd: local: extralArgs: listen-metrics-urls: http://[::]:2381 然后执行如下命令
kubeadm init --config=kubeadm-config.yaml 如上所示成功建立,然后按照提示输入以下命令
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 然后在node节点的主机上建立kubeadm-config.yaml文件用于加入集群,与master节点类似,下面的node-ip需要改成自己主机的ipv6地址,apiServerEndpoint中的ip地址改成master节点的ip地址,当然你集群的令牌和 CA 证书也同样需要进行替换
apiVersion: kubeadm.k8s.io/v1beta3 kind: JoinConfiguration discovery: bootstrapToken: apiServerEndpoint: "
目录
1.为什么要使用连接池
2.自定义连接池-初级版本
3.自定义连接池-进阶版本
4.装饰者模式
5.自定义连接池-终极版本
6.C3P0连接池
1.通过硬编码来编写【了解】
2.通过配置文件来编写
3.使用c3p0改写工具类
7.DRUID连接池
1.通过硬编码方式【了解】
2.通过配置文件方式
3.Druid工具类的制作
8.DBUtils完成增删改
9.DBUtils完成查询
查询一条记录(使用ArrayHandler,使用BeanHandler,使用MapHandler)
查询多条数据封装到List集合中(使用ArrayListHandler,使用BeanListHandler,使用MapListHandler)
查询单个数据(使用ScalarHandler())
查询单列多个值(使用ColumnListHandler)
10.元数据
参数元数据
结果集元素数据
11.自定义DBUtils增删改
1.为什么要使用连接池 Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了(close).每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.
程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.
程序一开始就创建一定数量的连接,放在一个容器(集合)中,这个容器称为连接池。
使用的时候直接从连接池中取一个已经创建好的连接对象, 使用完成之后 归还到池子
如果池子里面的连接使用完了, 还有程序需要使用连接, 先等待一段时间(eg: 3s), 如果在这段时间之内有连接归还, 就拿去使用; 如果还没有连接归还, 新创建一个, 但是新创建的这一个不会归还了(销毁)
集合选择LinkedList
增删比较快
LinkedList里面的removeFirst()和addLast()方法和连接池的原理吻合
2.自定义连接池-初级版本 创建连接池类
在连接池类中,定义一个LinkedList集合(表示连接池)
在连接池类的静态代码块中,创建固定数量的连接,并存储到LinkedList集合中
提供一个公共的非静态方法来获取连接对象(getAbc)
提供一个公共的非静态方法来归还连接对象(addBack)
提供一个公共的静态方法来获取连接池中连接的数量
package com.jcli.demo02_自定义连接池初级版; import com.jcli.utils.JDBCUtils; import java.sql.Connection; import java.sql.SQLException; import java.util.LinkedList; /** * - 创建连接池类 */ public class MyDataSource01 { //- 在连接池类中,定义一个LinkedList集合(表示连接池) private static LinkedList<Connection> pools = new LinkedList<>(); //- 在连接池类的静态代码块中,创建固定数量的连接,并存储到LinkedList集合中 static { for (int i = 0; i < 6; i++) { try { //获得连接 Connection connection = JDBCUtils.
雷达感应又称微波感应,是根据多普勒原理,采用现在最先进的平面天线技术,可有效抑制高次谐波和其他杂波的一些干扰﹑灵敏度高﹑可靠性强﹑安全方便智能节能,是现代智能化的首选产品。
当有人进入雷达感应的探测范围,微波雷达传感器工作点亮灯,当人离开探测范围后,灯自动熄灭。可自动识别白天和黑夜。
智能雷达感应模块,基于多普勒效应,工作与5.8G ISM频段,感应距离灵活可调,采用成熟CMOS工艺,单芯片集成,超高性价比,具有自校准功能,不受外部干扰影响。
满足RED、CE、FCC以及ETL等认证标准,广泛应用于照明感控、人体存在感应、运动检测与控制等领域。
雷达感应在检测到人体的每一次活动后会自动顺延一个周期,并以最后一次人体活动的顺延时间为起始点。根据外界的光线强度,来控制雷达感应开关是否工作,以达到节能效果。
与红外产品比较,雷达感应距离更远,角度广,无死区,能穿透玻璃,和薄木板,根据功率不同,可以穿透不同厚度的墙壁,不受环境、温度、灰尘等影响。
智能雷达感应模组,集成雷达收发,中频电路及MCU处理等,外围搭配天线和少量外围电路即构成完整雷达传感器,可嵌入灯具、家电及各种电子产品内,可实现人体以及各种运动目标的感应探测。
普通走廊灯开关打开后一直亮,如果忘记关灯要浪费不少电,有一种方法可以让长亮LED灯变成感应灯,人来灯灭,人走后灯具自动关灯,节能能源。
雷达感应最大的优点就是不易受外界干扰,同时它的感应的灵敏度也更加强悍,为此,雷达感应产品也为人们带来了无限的希望。
存在感应雷达模组,性能强大,可做丰富算法,拓展性强,适合高性能要求的场景。支持标准UART接口,可与其他主控或传感器互联互通,也可作为主控使用,可基于人体呼吸的探测,实现存在感应。
雷达感应无需开关控制,自动识别移动物体感应。可人来灯亮,人走灯灭,节省人力,减少浪费,节省电力资源,适用于走廊、楼道、卫生间、地下室、车库、仓库、监控等节能自动照明场景。
雷达感应开关接通后,在延时时间段内,如有人体存在,开关将持续接通,直到人离开并顺延时间。
人、车等移动物体进入感应范围,可自动开启,移动物体离开后可自动延时关闭,杜绝常规灯具有人开,无人关的人为浪费,延长灯具的使用寿命,集节能、方便、环保于一体。
前面说到了数据分析常用函数,今天我们来说说另一个和数据相关的,大家在学习数据结构的时候,简单的四则运算可谓是基础中的基础,不过看了这么多,作为一个初学者,还是得自己亲自上手试试的,那么具体怎么用Python来实现呢?
项目目标 实现一个简易的计算器,可以实现简单的加减乘除运算
代码示例 def add(x, y): return x + y def subtract(x, y): return x - y def muliply(x, y): return x * y def divide(x, y): return x / y print("选择运算:") print("1.相加\n2.相减\n3.相乘\n4.相除") choice = input("输入你的选择(1/2/3/4):") num1 = int(input("输入第一个数字:")) num2 = int(input("输入第二个数字:")) if choice == '1': print(f"{num1}+{num2}={add(num1,num2)}") elif choice == '2': print(f"{num1}-{num2}={subtract(num1,num2)}") elif choice == '3': print(f"{num1}*{num2}={muliply(num1, num2)}") elif choice == '4': if num2 != 0: print(f"{num1}/{num2}={divide(num1,num2)}") else: print("
制作数据表可能不难,但分析其中的数据时,使用公式寻找重要结论的过程往往让人抓耳挠腮。现在,《Excel》推出了“分析数据”功能,可以创建一系列推荐图表和数据表,让你不需使用复杂的公式,就能提取重要信息。
下面就通过一个例子,来看看如何轻松在数据中发现趋势吧。
入门技能:把重活交给《Excel》
你的目标:分析自行车维修店在四个地区的销售数据,发现趋势,找到见解。
传统方法:为数据的不同视图与汇总创建多个图表,并针对每个图表重新整理数据表。
使用“分析数据”:让《ECl》来替你创建这些图表和数据表,并提供多种见解供你选择。
例如,下图左侧的数据表显示了自行车维修连锁店一个月内的销售数据,每家分店都会销售整车、轮胎和维修套件等商品。
要获取自动化见解,只需点按数据表任意位置,然后在“开始”页面工具栏点按“分析数据”。《Excel》会详细分析数据表中的数据,在右侧通过新的面板来展示结果:
在《Excel》生成的20多个结果中,你会看到地区销售汇总、每种产品的销售额图表、不同地区的比较等等一如果手动制作这些视觉化分析,可能要花掉你好几个小时!
分析数据面板中的结果不会自动更新,所以如果你改动了数据表中的内容,需要关掉这项工具,再打开它时就可以看到更新的结果了。
此外,你还可以把任意图表及随之生成的定制数据表拖出面板,在《Excel》)《Word》或者《PowerPoint》里使用它们:点按对象下方的“+插入.”文本,将其插入到工作簿的新工作表里(包括原数据表里的相关数据)。
进阶用法:让《Excel》)解答你的疑问
你的目标:找到数据相关问题的答案
传统方法:创建一个定制公式计算答案,这可能需要你重新调整数据表,或者再创建一个仅容纳相关数据的表格。
使用“分析数据”:在分析数据面板顶部的文本框里使用自然语言向《EC》提出问题(暂不支持中 文)。例如,对于上图的数据表,你可以问:“Which Item Sold had the highest Revenue?”(哪种已出售商品的销售额最高?)《Excel》)给出的答案也许会让你感到意外一“Back Tire”(后胎):
你也可以输入涉及多个数据字段的问题,比如“山地自行车和城市自行车的总售額是多少?”或者“西部地区的前胎与后胎总量是多少?”。只要在问题里写对数据字段的名称,就能得到答案。
专业建议:选择每个字段的分析方式
分析数据面板还能从分析中排除某些字段,以及确认《Excl》正确对待了每个字段。你可以点按“发现见解”旁边的设置(齿轮)按键,调出“你对哪些字段最感兴趣?”对话框:
在这个自行车维修连锁店的例子里,你可以看到分析数据正确地识别出了非数值字段,但你可能需要让它把“Pice”(价格)当成平均数而非总数来分析。点按“求和”,再选择“平均值”,现在你可以输入“各个地区的价格分别是多少?”这样的问题,然后就能看到按地区分类的平均价格图表了。
进一步了解分析数据功能:Analyze Data in Excel
Microsoft Excel LTSC 2021 for Mac 激活
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
from:https://stackoverflow.com/questions/32434488/the-type-org-apache-http-header-cannot-be-resolved-it-is-indirectly-referenced
If you are compiling against Android 6.0 (SDK 23), you need to include org.apache.http.legacy library.
In Android Studio add
android { useLibrary 'org.apache.http.legacy' } to build.gradle.
In Eclipse copy org.apache.http.legacy.jar from AndroidSDK/platforms/android-23/optional to libs folder.
以下文章来源于大数据左右手 ,作者左右
前言
实时数仓,难免会遇到join维表的业务。现总结几种方案,供各位看官选择:
查找关联(同步,异步)状态编程,预加载数据到状态中,按需取冷热数据广播维表Temporal Table JoinLookup Table Join 查找关联
查找关联就是在主流数据中直接访问外部数据(mysql,redis,impala ...)去根据主键或者某种关键条件去关联取值。
适合: 维表数据量大,但是主数据不大的业务实时计算。
缺点:数据量大的时候,会给外部数据源库带来很大的压力,因为某条数据都需要关联。
同步
访问数据库是同步调用,导致 subtak 线程会被阻塞,影响吞吐量
import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}
import com.wang.stream.env.{FlinkStreamEnv, KafkaSourceEnv}
import org.apache.flink.api.common.functions.FlatMapFunction
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer
import org.apache.flink.util.Collector
def analyses(): Unit ={
val env: StreamExecutionEnvironment = FlinkStreamEnv.get()
KafkaSourceEnv.getKafkaSourceStream(env,List("test"))
.map(JSON.parseObject(_))
.filter(_!=null)
.flatMap(
new FlatMapFunction[JSONObject,String] {
override def flatMap(jSONObject: JSONObject, collector: Collector[String]): Unit = {
// 如果topic就一张表,不用区分,如果多张表,可以通过database 与 table 区分,放到下一步去处理
// 表的名字
val databaseName:String = jSONObject.
文章目录 变形定义平移百分比是相对于自身计算——应用平移特点z轴平移 旋转平移和旋转可以一起写注意backface-visibility 练习钟表原理:针不转,转的是针外面的容器 立方体的旋转 缩放例子:鼠标移入,图片放大 变换原点: transform-origin 变形定义 变形就是指通过css来改变元素的形状或位置
变形不会影响到页面的布局
transform用来设置元素的变形效果 页面的默认坐标:
(注意旋转后坐标的指向就会发生变化,跟着旋转的方向变)
平移 translatex():沿着x轴方向平移translateY(): 沿着y轴方向平移translateZ():沿着z轴方向平移
平移元素
可以以px为单位
也可以以百分号为单位:百分比是相对于自身计算的
eg:
百分比是相对于自身计算——应用 使元素居中,
我们通常使用
margin: 0 auto; 但是使用该方法的前提是width是确定的,如果width不是确定的那应该如何居中,可以使用百分比是相对于自身计算的这个属性。
.box2{ position: absolute; background-color: darkseagreen; left: 50%; transform:translateX(-50%); } eg:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> .box1{ width: 200px; height: 200px; background-color: darksalmon; margin: 0px auto; margin-top: 200px; /* 使用函数做参数 */ transform:translateX(-50%); } .box2{ position: absolute; background-color: darkseagreen; left: 50%; top: 50%; transform:translateX(-50%) translateY(-50%); } </style> </head> <body> <div class="
所有的实际优化问题都是多目标的,如果不是显式的至少也是隐式的。接下来讨论多目标优化问题(MOP)如何修改进化算法。实际的优化问题包含多个目标,那些目标常常互相冲突。例如:
在购买汽车时,我们可能想要车最舒适并且花钱最少。最舒适的汽车太贵,最便宜的汽车又不太舒服。在设计一座桥时,我们可能想让它的费用最低强度最大。用泡沫塑料建造的桥可能费用最低,但他非常脆弱。用钛合金建造的桥可能强度最大但它非常昂贵,在费用和强度之间如何才是最好的折中? MOP又被称为多准则优化、多性能优化,以及向量优化。假定独立变量x为n维向量,并假定MOP是最小化问题。MOP可以写成如下的形式:
MOP的目标是同时最小化k个函数。
MOP常常包含约束,我们不处理带约束的MOP。我们可以将约束融入多目标进化算(MOEAs),其方式与将约束融入单目标进化算法相同。
目录
帕累托最优性
支配
多目标优化的目标
1.超体积
2.相对覆盖度
基于非帕累托的进化算法
1.集结方法
凹帕累托前沿的目标达成
2.向量评价遗传算法
3.字典排序
4.-约束方法
5.基于性别的方法
基于帕累托进化算法
1.多目标进化优化器
a.简单多目标进化优化器(simple evolutionary multi-objective optimizer,SEMO)
b.多样性多目标进化优化器(divercity evolutionary multi-objective optimizer,DEMO) 2.基于的多目标进化算法
3.非支配排序遗传算法NSGA
NSGAⅡ
4.多目标遗传算法 5.小生境帕累托遗传算法NPGA
6.优势帕累托进化算法SPEA
SPEA2
7.帕累托归档进化策略PAES
基于生物地理学的多目标优化
1.向量评价BBO
2.非支配排序BBO
3.小生境帕累托BBO
4.优势帕累托BBO
帕累托最优性 我们首先列出在多目标优化中经常用到的一些定义。
1.支配。称点支配x如果下面的两个条件成立:(1)对所有i∈[1,k],并且(2)对至少一个j∈[1,k],<,即对所有目标函数值,至少与x一样好,并且至少有一个目标函数值比x好,用记号
表示支配x,符号表示的函数值小于或等于x的函数值。
2.弱支配。 称点弱支配x如果对所有i∈[1,k],,即对所有目标函数值,至少与x一样好,如果支配x,它也弱支配x。 如果对所有i∈[1,k],=, 则与x互相弱支配。用记号
表示 弱支配x。
3.非支配。 称点是非支配的,如果不存在能支配它的x。非劣、允许的,以及有效的,都是非支配的同义词。
4.帕累托最优点。 帕累托最优点,也被称为帕累托点,是不受搜索空间中任意一点x支配的点。即,
5.帕累托最优集。也被称为帕累托集并记为,是所有非支配的的集合。
6.帕累托前沿。也被称为非支配集合,并记为,是相应于帕累托集的所有函数向量f(x)的集合。
注意,是非支配的并不意味着支配所有与不等的x。对所有i∈[1,k],可能会有 = ,在这种情况下x和互相都是非支配的,其中一个不会支配另一个。还可能出现的情况是,以有两个目标的问题为例,其中并且。在这种情况下x和都是非支配的,其中一个不会支配另一个。
支配 帕累托集这个概念的局限在于它的非此即彼,非黑即白的性质。例如,考虑下面三个费用函数值的集合:
x支配y和z,但是帕累托支配的概念并不考虑支配水平之间的差别,也不会识别在目标函数空间中相互靠的很近的两个候选解。在(11)式中,x支配y,但是因为x和y很相似,相互之间几乎都是非支配的。实际上,差不多也可以说y支配z。由此引出了支配的概念。
加性支配: 称点加性支配x,如果对某个>0和所有i∈[1,k], < +。也就是说, “接近”支配x,这里的“接近”有加性参数来量化。乘性支配: 称点乘性支配x,如果对某个>0和所有i∈[1,k], < +(1+)。也就是说, “接近”支配x,这里的“接近”有乘性参数来量化。 我们用记号
在Java中从字符串中删除空格有很多不同的方法,如trim,replaceAll等。但是,在JDK 11添加了一些新的功能,如strip、stripLeading、stripTrailing等。
想要从String中移除空格部分,有多少种方法,下面介绍JDK原生自带的方法,不包含第三方工具类库中的类似方法
trim() : 删除字符串开头和结尾的空格。
strip() : 删除字符串开头和结尾的空格。
stripLeading() : 只删除字符串开头的空格
stripTrailing() : 只删除字符串的结尾的空格
replace() : 用新字符替换所有目标字符
replaceAll() : 将所有匹配的字符替换为新字符。此方法将正则表达式作为输入,以标识需要替换的目标子字符串
replaceFirst() : 仅将目标子字符串的第一次出现的字符替换为新的字符串
需要注意的最重要的一点是,在Java中String对象是不可变的,这意味着我们不能修改字符串,因此以上所有的方法我们得到的都是一个新的字符串。
在线运行工具
trim() trim()是Java开发人员最常用的删除字符串开头和结尾的空格方法
public class StringTest { public static void main(String[] args) { String stringWithSpace = " Hello word java "; StringTest.trimTest(stringWithSpace); } private static void trimTest(String stringWithSpace){ System.out.println("Before trim : \'" + stringWithSpace + "\'"); String stringAfterTrim = stringWithSpace.trim(); System.out.println("After trim : \'" + stringAfterTrim + "
479-最大回文数乘积 题目描述: 给定一个整数 n ,返回 *可表示为两个 n 位整数乘积的最大回文整数 。因为答案可能非常大,所以返回它对 1337取余 。
示例1:
输入:n = 2 输出:987 解释:99 x 91 = 9009, 9009 % 1337 = 987 示例2:
输入: n = 1 输出: 9 提示:
1 <= n <= 8 思路:
首先要知道什么是回文数,回文数即,正序和反序一样的数字。例如: 1001、9999、999 等都是回文数10、1000、10100 等不是回文数 首先我们应该知道,如果输入的数字为n,那么两个 n 位数乘积位数最大为 2n,且回文数左右两部分应该是对称,即从 10 ^ n - 1 开始枚举左半部分就可以了。详细步骤参照代码讲解。 class Solution { public int largestPalindrome(int n) { if (n == 1) { return 9; } // 定义一个常量upper用以定义两个n位数相乘最大的数 int upper = (int) Math.
一:下载安装
1.下载MobaXterm_Portable
百度网盘
链接:https://pan.baidu.com/s/1uQTVMzg8E5QULQTAoppdcQ 提取码:58c5 2.不需要安装,直接解压
3.解压后可以看到
进入这个文件夹可以看到
直接点击它就可以运行MobaXterm_Portable了 。
二:简单使用
1.添加虚拟机
我的IP地址是:192.168.17.128 用户名是:root(用户名默认是root)
IP地址可以用 ip addr 查看
显示连接成功
2.上传文件到
直接把文件拖到MobaXterm_Portable的框框里就行。
最近在Ubuntu上使用npm install 命令安装的时候,有时候能成功有时候就是报错:
error Linux 4.15.0-169-generic error argv "/usr/bin/node" "/usr/bin/npm" "install" "socket.io" error node v8.10.0 error npm v3.5.2 error code EMISSINGARG error typeerror Error: Missing required argument #1 error typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3) error typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22) error typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12) error typeerror at /usr/share/npm/lib/install/deps.js:190:5 error typeerror at /usr/share/npm/node_modules/slide/lib/async-map.js:52:35 error typeerror at Array.forEach (<anonymous>) error typeerror at /usr/share/npm/node_modules/slide/lib/async-map.js:52:11 error typeerror at Array.forEach (<anonymous>) error typeerror at asyncMap (/usr/share/npm/node_modules/slide/lib/async-map.
在使用用conda install 命令时出现读入权限问题,导致所需库导入失败
1.更改anaconda3文件夹的访问权限,案例将一般用户设置为了完全控制
2.再次执行,导入成功
想看到网盘的《登录界面》,电脑不能连网,所以要先断网,等《登录界面》出现了,电脑再连网,网盘才能登录上
目前,MATLAB已成为国际上最为流行的科学计算与工程计算软件工具之一,如今的MATLAB已经不仅仅是矩阵运算或数值计算的软件,它已经发展成为一种具有广泛应用前景、全新的计算机高级编程语言,可以说它是“第四代”计算机语言。
自20世纪90年代,美国和欧洲的各个大学将MATLAB正式列入研究生和本科生的教材计划,MATLAB软件已经成为数值计算、数理统计、数字信号处理、自动控制、时间序列分析、动态系统仿真等课程的基本教学工具,成为学生必须掌握的基本软件之一。在研究单位和工业界,MATLAB也成为工程师们必须掌握的一种工具,被认为是进行高效研究与开发的首选软件工具。
1.1.2 MATLAB的主要特点 1.编程效率高 MATLAB允许使用数学形式的语言编写程序,而且比Basic、Fortran和C等语言更加接近人们书写计算公式的思维方式,用MATLAB编写程序犹如在演算纸上排列出公式与求解问题。因此,MATLAB语言也可通俗地称为演算纸式科学算法语言。
2.使用方便 MATLAB语言把编辑、编译、连接和执行融为一体,其调试程序手段丰富,调试速度快 ,需要学习时间少。 3.扩充能力强 用户可以根据自己的需要方便地建立和扩充新的库函数,以便提高MATLAB使用效率和扩充它的功能。
4.语句简单,内涵丰富 MATLAB的库函数功能丰富,大大减少了需要的磁盘空间,MATLAB编写的M文件简单而高效。 5.高效方便的矩阵和数组运算 MATLAB语言规定了矩阵的一系列运算符,它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时,体现出简捷、高效、方便的优势。
6.方便的绘图功能 MATLAB有一系列的绘图函数,例如线性坐标、对数坐标、半对数坐标及极坐标等,均只需调用不同的绘图函数,在图上标出图题、坐标轴标注、网格线的绘制等也只需调用相应的命令,简单易行。 7.极好的开放性 除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的函数文件来构成新的工具箱。 MATLAB系统由五大部分构成: 1.MATLAB开发环境 MATLAB开发环境包括MATLAB桌面、命令行窗口、M文件编辑调试器,MATLAB工作区和在线帮助文档等。 2.MATLAB数学函数库 MATLAB数学函数库包括了大量的计算算法,从基本运算到复杂算法,体现了其强大的数学计算功能。 3.MATLAB语言 MATLAB语言是一个高级的基于矩阵和数组的语言。用户既可以用它来快速编写简单的程序,也可以用它来编写大型复杂的程序。 4.MATLAB图形处理系统 图形处理系统使得MATLAB能方便地图形化显示矩阵和向量,而且能对图形添加标注和打印。它包括强力的二维及三维图形函数、图像处理和动画显示等函数。 5.MATLAB程序接口 MATLAB程序接口可以使MATLAB方便地调用C和Fortran程序,以及在MATLAB与其它应用程序之间建立客户/服务器关系。 1.4.1 菜单和工具栏 包含了下述功能:
(1)新建脚本:用于建立新的.m脚本文件,也可以通过快捷键Ctrl+N来完成。
(2)新建:用于建立新的.m文件、函数、示例、模型、图形和图形用户界面。
(3)打开:用于打开MATLAB的.m文件、.fig文件、.mdl文件、.mat文件、.ssc文件等,也可以通过快捷键Ctrl+O来实现这个操作。
(4)查找文件:基于文件名称或内容搜索文件。
(5)比较:比较两个文件的内容。
(6)导入数据:用于从其它文件导入数据,单击后弹出对话框,选择导入文件的路径和位置。
(7)保存工作区:用于把工作区的数据存放到相应的路径文件中。
(8)分析代码:分析当前文件夹中的MATLAB代码文件,查找效率低下编码和潜在的错误。
(9)Simulink库:打开Simulink模块库。
(10)预设:用于设置命令行窗口的属性。
(11)布局:提供工作界面上各个组件的显示选项,并提供预设的布局。
(12)帮助:打开帮助文件或其它帮助方式。
1.4.2 命令行窗口 MATLAB的命令行窗口是MATLAB最主要的窗口,它实现了MATLAB的交互性。命令行窗口是用户使用MATLAB进行工作的窗口,同时也是实现MATLAB各种功能的窗口。用户可以直接在MATLAB命令行窗口内输入命令和得到除图形以外的执行结果的显示。该窗口中的“>>”是命令提示符,表示MATLAB处于准备状态,等待用户输入指令进行计算。在此符后输入命令,按Enter键,执行命令。 【例1-4-1】计算
(1)用键盘在MATLAB命令窗中输入以下内容
(12+2*(7-4))/3^2
(2)在上述表达式输入完成后,按【Enter】键,该指令被执行。
(3)在指令执行后,MATLAB指令窗中将显示以下结果。
ans =
2
图1-9 在命令行窗口里的计算
说明:1、“ans”是MATLAB的一个默认变量,用户也可将表达式的值赋值给某个变量如a。
2、可以输入多条命令,这时各命令间要以逗号或分号隔开。
3、当输入命令的语句过长,需要两行或多行才能输入,则要使用“…”作连接符号,按回车键转入下一行继续输入。
4、在默认情况下,命令行窗口中各字符的颜色:关键字采用蓝色;字符串采用褐红色;命令、表达式和运行结果采用黑色。
5、单击命令行窗口右上角的下三角图标并选择“取消停靠”可以使命令行窗口脱离MATLAB界面成为一个独立的窗口;选择独立命令行窗口右上角的下三角形图标并选择“停靠”,可以使命令行窗口再次回到MATLAB主界面。
1.4.3 工作区
工作区窗口显示当前的内存中所有的MATLAB变量的变量名、数据结构、字节数及数据类型等信息,如图1-10所示。不同变量类型分别对应不同的变量名图标。
可以选中已有变量,单击鼠标右键对其进行各种操作,工作界面的菜单和工具栏上也有相应的命令供用户使用。
新建变量:向工作区添加新的变量。
文章目录 我的vimrc运行环境特征插件安装插件管理工具`vim-plug`其他插件 设置`vim`自身设置`gui`设置编码设置插件和一些其他功能完整的`vimrc`文件 我的vimrc 运行环境 windows10 1909+gvim8.2+python38
特征 利用airline状态栏美化,vim-one提供好看的语法高亮利用coc.nvim提供基于LSP的语义补全利用ale提供实时代码检查利用neofornat进行代码格式化。其实coc.nvim集成了语法检查和代码格式化,但是个人觉得体验不佳,就把这两项功能分离开来。支持c,c++,fortran,python,LaTeX语言的补全,编译,运行。 插件安装 插件管理工具vim-plug 选择一个插件安装目录,在gvim里面输入:version命令,查看设置文件的目录。
这里选择$HOME/vimfiles/autoload然后去vim-plug官网下载plug.vim文件,将其放入$HOME/vimfiles/autoload文件夹里面。
例如
call plug#begin('$HOME/vimfiles/plugged') " 插件安装目录$HOME/vimfiles/plugged Plug 'junegunn/vim-easy-align' "github上插件地址 call plug#end() 其他插件 "----------------插件-------------------------" call plug#begin('$HOME/vimfiles/plugged') Plug 'scrooloose/nerdcommenter' "注释 Plug 'junegunn/vim-easy-align' "对齐 Plug 'dense-analysis/ale' "语法检查 " use pre build Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() } } "markdownpreview Plug 'vim-airline/vim-airline' "状态栏 Plug 'vim-airline/vim-airline-themes' Plug 'rakr/vim-one' "语法高亮 Plug 'joshdick/onedark.vim' Plug 'preservim/nerdtree',{'on':'NERDTreeFind'} "文件树 Plug 'neoclide/coc.nvim', {'branch': 'release'} "补全 Plug 'lervag/vimtex',{'for':'tex'} "
a=int(input("请输入一门课成绩:")) b=int(input("请输入一门课成绩:")) c=int(input("请输入一门课成绩:")) sum=a+b+c adv=(a+b+c)/3 print("你的总成绩为:",sum) print("平均分:",adv) a=int(input("请输入一个三位数:")) print("百位为:",a//100) print("十位为:",a%100//10) print("个位为:",a%10)
/* 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。
目标下标 是一个满足?nums[i] == target 的下标 i 。
将 nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。
如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。
示例:
输入:nums = [1,2,5,2,3], target = 2
输出:[1,2]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 2 的下标是 1 和 2 。
来源:力扣(LeetCode) */
//法一 先排序再全部遍历一遍 class Solution{ public: vector<int> targetIndices(vector<int>& nums,int target){ int n=nums.size(); sort(nums.begin(),nums.end()); //从小到大排序 vector<int> result; for(int i=0;i<n;i++){ if(nums[i]==target){ result.push_back(i); } } return result; } }; //法二 class Solution { public: vector<int> targetIndices(vector<int>& nums, int target) { int n=nums.
uni-app中调取接口的三种方式与封装uni.request() 一、uni-app中调取接口的三种方式 1、uni.request({})
uni.request({ url:'/api/getIndexCarousel.jsp', method:'get', success:res=>{ console.log(res.data); this.carouselData = res.data } }) 2、uni.request({}).then()
uni.request({ url:'/api/getIndexCarousel.jsp', method:'get', }).then((result)=>{ let [error,res] = result; //result将返回一个数组[error,{NativeData}] //NativeData:调取接口后返回的原生数据 if(res.statusCode === 200){ this.carouselData = res.data } if(res.statusCode === 404){ console.log('请求的接口没有找到'); } }) 3、async/await
async:用在函数定义的前面 async request(){ //函数体;} await:用在标明了async关键字的函数内部,异步操作的前面。 onLoad() { this.request(); }, methods: { async request(){ let result = await uni.request({ url:'/api/getIndexCarousel.jsp' }) console.log(result) let [err,res] = result; if(res.statusCode === 200){ this.carouselData = res.data; } } } 二、封装uni.
我将本地的工作空间workspace删除后,在p4上新建同样名字的workspace,显示重名,不能建,
I felt very angry。
进行如下操作,缓解一下。
1、点击窗口view
2、选择workspace.
3、操作右边窗口,过滤出自己要删除的工作空间(服务器端名称),选择右击delete.
4、现在就可以在自己电脑上new workspace,但是p4下拉列表中还有,点击选择,显示无工作空间,哈哈哈,这下结束了。
转载于:搜狗百科ASCII - 搜狗百科
Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释0000 00000000x00NUL(null)空字符0000 00010110x01SOH(start of headline)标题开始0000 00100220x02STX (start of text)正文开始0000 00110330x03ETX (end of text)正文结束0000 01000440x04EOT (end of transmission)传输结束0000 01010550x05ENQ (enquiry)请求0000 01100660x06ACK (acknowledge)收到通知0000 01110770x07BEL (bell)响铃0000 100001080x08BS (backspace)退格0000 100101190x09HT (horizontal tab)水平制表符0000 1010012100x0ALF (NL line feed, new line)换行键0000 1011013110x0BVT (vertical tab)垂直制表符0000 1100014120x0CFF (NP form feed, new page)换页键0000 1101015130x0DCR (carriage return)回车键0000 1110016140x0ESO (shift out)不用切换0000 1111017150x0FSI (shift in)启用切换0001 0000020160x10DLE (data link escape)数据链路转义0001 0001021170x11DC1 (device control 1)设备控制10001 0010022180x12DC2 (device control 2)设备控制20001 0011023190x13DC3 (device control 3)设备控制30001 0100024200x14DC4 (device control 4)设备控制40001 0101025210x15NAK (negative acknowledge)拒绝接收0001 0110026220x16SYN (synchronous idle)同步空闲0001 0111027230x17ETB (end of trans.
使用英文写的,但是都很简单,
简单图解了使用STM32CUBEMX导入wolfssl库的方法
1.usage of wolfSSL with picture 1.open a stm32cubemx project
打开一个stm32工程
2.choose “Software Packs” then choose “select components”
点击红框内的按钮,添加组件
3.Find and check all components for the wolfSSL.wolfSSL packs (wolfSSL / Core, wolfCrypt / Core and wolfCrypt / Test). Close
在组件中,选择红框内与wolfssl相关的三个组件,点击’OK’
4.For Cortex-M recommend “Math Configuration” -> “Single Precision Cortex-M Math”
在software pakages里,修改数学设置为 “Single Precision Cortex-M Math”,按照官网意思是,这样可以提高计算精度和效率,
5.clock configuration配置时钟
6.generate code
点击生成代码,即可得到一个含有wolfssl库的stm32工程
1. 软件下载地址(点击下载)
2. 首先将下载后的文件解压到本地
3. 右键选择以管理员身份运行navicat_15.0-64bit.exe
4.然后点击下一步按钮
5.勾选我同意,然后点击下一步按钮
6.选择指定的安装目录,然后点击下一步按钮
7.点击下一步按钮
8.点击下一步按钮
9.点击安装按钮
10.点击完成按钮
基于TensorFlow的卷积神经网络的岩石图像分类识别 题目简述个人项目运行环境数据处理模型实现结果分析完整代码 题目简述 今有砾岩(Conglomerate)、安山岩(Andesite)、石灰岩(Limestone)、石英岩(Quartzite)和花岗岩(Granite)5种岩石图片,每张图片的大小不一。试建立卷积神经模型,利用训练数据集进行训练,并对测试集进行分类识别。
数据集百度云盘下载 https://pan.baidu.com/s/1Ok20EhvV9F0-JMyONrsnFA 解压码:t35r.
个人项目运行环境 PyCharm 2017.1Python 3.8.6numpy 1.19.5TensorFlow 2.5.0scikit-learn 0.24.2 导入模块
import os import numpy as np from PIL import Image from tensorflow.keras import layers,models from sklearn.model_selection import train_test_split 数据处理 这里我们构造卷积神经网络模型所需要的输入数据和输出数据,其中输入数据为所有彩图数据。我所展示的样例共有300张图片,统一取图像中心点100×100像素,共有R、G、B三个通道,并对每个通道像素值归一化,彩色图片有3个通道(也可以使用OpenCV的函数查看自己使用图片的通道数),故所有彩图数据可以用一个四维数组来存储,其形态为 (300,100,100,3)。记为X。输出数据为岩石类型,依次为砾岩、安山岩、石灰岩、石英岩和花岗岩(不确定顺序,我也不能分清具体岩石是哪个类,按照图片的类别来分不同岩石),类型编号为0、1、2、3、4,记为Y。代码如下:
# 数据处理 def DataDispose(X,Y,ImgList): for i in range(len(ImgList)): # 读取第一张图片,img有R、G、B(三色)三个通道 img = Image.open(ImgPath + "\\" +ImgList[i]) # 分离R、G、B通道 sep = img.split() # R 通道 R = np.array(sep[0]) # 注意中心点 row_1 = int(R.shape[0]/2) - 50 row_2 = int(R.
1、前端如何实现word导出? 使用docxtemplater,需要word模板,但功能有限制,复杂功能无法实现
2、前端如何实现pdf导出? 可使用pdfmake,由于默认不支持中文,因此需要引入中文字体包,体积较大,酌情使用
3、vue多级路由如何实现路由缓存? vue三级及以上层级路由默认无法缓存,原因是keepalive只能缓存到二级标签,解决方案:①将二级标签组件强行放入缓存,但由于一般而言所有二级路由标签公用同一个组件,因此会有一些奇怪的未知问题,舍弃;②在路由跳转前监听路由,删除所要跳转路由之前的所有中间层级路由,使跳转路由变为二级标签,测试后发现未发现任何问题,完美解决。
4、vue钩子函数的特点 vue的钩子函数遵循的特点:
①生命周期函数(mounted,created等)都是一个方法(原因:能直接调用函数中的代码块);
父子组件生命周期执行顺序: 父beforeCreat,父created,父beforeMount,子beforeCreat,子created,子beforeMount,子mounted,父mounted,父beforeDestory,子beforeDestory,子destroyed,父destroyed
②其余钩子函数是多为对象(components、metheds、watch、computed等)(原因:都需要设置变量用来调用);
③特别钩子:name为字符串(原因:命名是唯一的字符串),mixins为数组(原因:直接引入多个代码块不需要其它调用),data为return一个对象的方法(原因:js的特性,为了避免多个组件之间的data是引用数据类型导致修改一个数据地址所有data的地址都变化,function不会有这个问题)
5、如何实现跨域 跨域除了后台放开访问限制以外,前端可以用以下方式实现
①使用jsonp请求实现跨域
②使用标签实现跨域(所有自带src属性的标签都可以)
③可以通过配置代理实现跨域
④移动端可以通过使用android或ios原生请求(原生请求没有跨域这一概念)
前两种只能用于get请求,通常用来访问静态资源;正常web端框架(vue,angular等)建议使用第三种;移动端第三种无效,建议使用第四种
6、css扩展语言sass、scss、less的区别 css有三种常见的扩展语言sass、scss,less,scss就是sass 3,对于sass的的缩进语法做了优化,更符合开发习惯。
scss和less 的区别:
①开发环境不同;
②变量定义不同,scss用$,拼接变量则在外层添加#{},less用@;
③变量作用域不同,less变量只在花括号内部生效,scss所有变量在当前文件作用域生效;
④scss支持使用条件语句和循环语句,使用方式:@if ... {...} @else if ... {...} @else {...} @for...from...to... @for...from...through... @each...in...,less则不支持。
总结:正常项目使用scss,使用sass的项目建议使用scss替换,没有复杂样式逻辑的项目使用less
7、怎样实现拖拽排序 可以基于draggable组件实现拖拽排序,组件使用方式: vue.draggable中文文档
8、前端性能优化方式 1、CDN分发加速(将资源文件提给cdn厂商,让厂商去智能拉取,主要的工作是把我们需要被分发的内容分发到世界各地的各个节点上,让世界各地的人都可以在距离最近的网络节点拿到想要拿到的内容,减少网络传输距离从而达到加速的目的)
2、减少网络请求(减少建立网络连接的次数)
3、使用服务端渲染替代客户端渲染(服务端渲染不需要二次调用页面资源,但对服务器压力较大,并且对前后端分离不友好,对SEO搜索引擎优化较好,加快了页面访问速度)
4、将 CSS 放在文件头部,JavaScript 文件放在底部(CSS 执行会阻塞渲染,阻止 JS 执行,先加载 HTML 再加载 CSS,会让用户第一时间看到的页面没有样式,JS 加载和执行会阻塞 HTML 解析,JS 文件也不是不可以放在头部,只要给 script 标签加上 defer 属性就可以了,异步下载,延迟执行。)
5、使用字体图标 iconfont 代替图片图标(iconfont文件较小且不会失真)
1.下载最新版本git 官网:https://gitforwindows.org/
https://github.com/git-for-windows/git/releases/download/v2.35.3.windows.1/Git-2.35.3-64-bit.exe 2.安装git 安装说明比较详细 https://blog.csdn.net/yanwennian/article/details/118515116 3.配置并使用 安装完成 回到桌面鼠标右键 会看到多了两个git配置
选择git bash
3.1 本地生成密钥,同步到git服务器 mkdir ~/.ssh cd ~/.ssh ssh-keygen -t rsa -C "xxxxx@qq.com" 运行完成后本地会生成如图配置文件,将id_rsa.pub 密钥拷贝同步到git项目服务器上
3.2 git服务器新增密钥 粘贴完成新增密钥
3.3 本地验证密钥 ssh -T git@gitlab.com 没有出现密码认证说明密钥配置成功
git config --global user.name "zhangfan" #配置本地用户 git config --global user.email "zhangfan@xxxx.com" #配置本地邮箱 4.测试验证 本地新建目录,git bash切换目录执行
git clone git@gitlab.com:coherent1/test.git(此处更换为对应仓库的地址)
模拟了一个创建代码并提交过程git log 发现已经提交了
发现git 代码仓库已经有个刚才提交的代码,验证成功
5.git常用的命令 Git 全局设置 git config --global user.name "zhangfan" git config --global user.email "
40个问题【前10问】— 及答案 1、简述一下你对HTML语义化的理解? HTML语义化:就是页面去掉样式或者加载失败的时候能够让页面呈现出清晰的结构。HTML5新增了好多语义化的标签,例如:header、footer、nav、menu、section、article等等
单单从字面上理解,就知道标签的含义。在写页面的时候,我们可以直接引用这些标签,不需要再用没有任何含义的div标签了,对于机器可以识别,对于开发人员很容易明白。这就是HTML语义化。
1 html 语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析
2 用正确的标签做正确的事情
3 有利于SEO利于被搜索引擎收录,更便于搜索引擎的爬虫程序来识别
4 便于项目的开发及维护,使HTML代码更具有可读性,可维护、可理解
2、标签上title与alt属性的区别是什么? alt与 title 属性区别:
图片中的alt 属性是在图片不能正常显示时出现的文本提示。
图片中的 title属性是在鼠标在移动到元素上的文本提示。
3、iframe的优缺点? iframe的优点: 1、iframe能够原封不动地把嵌入的网页展现出来。
2、如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷。
3、网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用。
4、如果遇到加载缓慢的第三方内容如图标和广告,这些问题可以由iframe来解决。
iframe的缺点: 会产生很多页面,不容易管理。
1、iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能会出现上下、左右滚动条,会分散访问者的注意力,用户体验度差。
2、代码复杂,无法被一些搜索引擎索引到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe中的内容,所以使用iframe会不利于搜索引擎优化。
3、很多的移动设备(PDA 手机)无法完全显示框架,设备兼容性差。
4、iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
分析了这么多,现在基本上都是用Ajax来代替iframe,所以iframe已经渐渐的退出了前端开发。
其他静态文件的引用:https://segmentfault.com/a/1190000020144193
4、垂直居中几种方式? 1、用于文字和行内元素
line-height等于hieght/只设line-height
2、元素是行内块元素,父元素设有等于自身高度的行高 -- 常用在图片与文字的对齐
vertical-align: middle
3、绝对定位加负外边距
position: absolute;//设为绝对定位
top: 50%;//top值为50%
transform: translateY(-50%);//设为元素高度倒退一半
4、绝对定位加margin:auto
这种方法好处是不止可以实现垂直居中,还可以实现水平居中,坏处是在网络或性能不好的情况下会有盒子不直接定到位的情况,造成用户体验不好。
5、flex布局
display: flex;//设为flex
justify-content: center;//水平居中
align-items: center;//垂直居中
5、介绍一下css的盒子模型? CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。
盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。
6、rgba和opacity的透明效果有什么不同? opacity作用于元素,以及元素内的所有内容的透明度
rgba()只作用于元素的颜色或其背景色
7、position的值,relative和absolute分别是相对于谁进行定位的? relative(相对定位)并没有脱离文档流,而absolute(绝对定位)脱离了文档流;
1、无任何参数的状态
git log 参数介绍:
参数说明-p按补丁格式显示每个更新之间的差异–stat显示每次更新的文件修改统计信息–shortstat只显示 --stat 中最后的行数修改添加移除统计–name-only仅在提交信息后显示已修改的文件清单–name-status显示新增、修改、删除的文件清单–abbrev-commit仅显示 SHA-1 的前几个字符,而非所有的 40 个字符–relative-date使用较短的相对时间显示(比如,“2 weeks ago”)–graph显示 ASCII 图形表示的分支合并历史–pretty使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)-(n)仅显示最近的 n 条提交–since, --after仅显示指定时间之后的提交–until, --before仅显示指定时间之前的提交–author仅显示指定作者相关的提交–committer仅显示指定提交者相关的提交 2、控制更新显示的个数
git log -p -2 3、增改行数统计
每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
git log --stat 4、设置展示方式
可以指定使用完全不同于默认格式的方式展示提交历史
git log --pretty=oneline git log --pretty=short git log --pretty=full git log --pretty=fuller ##定制格式 git log --pretty=format:"%h - %an, %ar : %s" 5、限制日志输出长度
按照时间作限制的选项,如 --since 和 --until
git log --since / git log --until ##例1: 列出所有最近两周内的提交 git log --since=2.
一、前言 今天在项目中遇见了Feign.Builder并通过内部的拦截器对feign接口做了一些配置,比较感兴趣,所以去特地了解了一下Feign.Builder的简要原理,在此记录一下,后面会慢慢去尝试读取源码并分享:
feign.Feign它是最上层的API,是使用者直接使用的对象,它能完成对接口生成动态代理对象,从而很方面的让你面向接口编程,而不用太过例会Feign内部的实现细节。
二、feign.Feign Feign的目的是简化针对rest的Http Api的开发。在实现中,Feign是一个用于生成目标实例Feign.newInstance()的工厂,这个生成的实例便是接口的代理对象。
该类是个抽象类:
public abstract class Feign { // 唯一的public的抽象方法,用于为目标target创建一个代理对象实例 public abstract <T> T newInstance(Target<T> target); // -----------------静态方法----------------- // 工具方法,生成configKey // MethodMetadata#configKey属性的值就来自于此方法 public static String configKey(Class targetType, Method method) { ... } // Feign的实例统一,有且只能通过builder构建,文下有详解,它是重点 public static Builder builder() { return new Builder(); } } feign.Feign它有且仅有一个唯一实现类ReflectiveFeign,但这个实现类并不面向使用者,使用者只需用Builder构建,面向接口/抽象类编程足矣。
三、ParseHandlersByName 在接触ReflectiveFeign之前,我认为很有必要了解下它。
该类有且仅提供一个方法:将feign.Target转为Map<String, MethodHandler>,就是说为每一个configKey(其实就是一个Method),找到一个处理它的MethodHandler。
首先展示一下类和大概的理解,然后我们细细的理解:
static final class ParseHandlersByName { // 提取器 private final Contract contract; private final Options options; private final Encoder encoder; private final Decoder decoder; private final ErrorDecoder errorDecoder; private final QueryMapEncoder queryMapEncoder; // 这个工厂只产生SynchronousMethodHandler实例 // 从这也很好理解:所有的Method最终的处理器都是SynchronousMethodHandler private final SynchronousMethodHandler.
bootstrap简单总结 Bootstrap4基础知识结构 Bootstrap4前台框架
「生信技能树」单细胞数据挖掘_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1pa4y1s76J?p=10
P3.1 QC空细胞及重复细胞质控以及细胞周期判断 空细胞质控 load("scRNA.Rdata") library(Seurat) ##1、detect special cells---- # empty droplet # BiocManager::install("DropletUtils") library(DropletUtils) e.out <- emptyDrops(GetAssayData(scRNA,slot="counts",assay="RNA")) #Error in testEmptyDrops(m, lower = lower, ...) : #no counts available to estimate the ambient profile ##https://support.bioconductor.org/p/123554/#123562 #如上回答所说,empty droplet往往在第一步就已经过滤掉了,而一般上传到GEO的也都是过滤掉空液滴的。 先是空细胞,用dropletutils包
GEO数据往往以及完成了质控,因此返回的是个error值。
重复细胞质控(跑不通) #double droplet #https://osca.bioconductor.org/doublet-detection.html # BiocManager::install("scran") head(scRNA@meta.data) library(scran) library(Matrix) #GetAssayData(scRNA,slot="counts",assay="RNA")[1:8,1:4] ?doubletCluster #检查有无double droplet聚在一起的类 db.test <- doubletCluster(GetAssayData(scRNA,slot="counts",assay="RNA"), clusters=scRNA@meta.data$seurat_clusters) head(db.test) table(scRNA@meta.data$seurat_clusters) library(scater) chosen.doublet <- rownames(db.test)[isOutlier(db.test$N, type="lower", log=TRUE)] chosen.doublet #结果显示没有 #还有其它多种方法 这里有个问题,
> db.