
有点尴尬唉 你要寻找的东西已经被吃掉啦!
能力说明:
了解变量作用域、Java类的结构,能够创建带main方法可执行的java应用,从命令行运行java程序;能够使用Java基本数据类型、运算符和控制结构、数组、循环结构书写和运行简单的Java程序。
阿里云技能认证
详细说明2021年01月
2020年08月
2020年07月
2020年06月
2020年05月
2020年04月
2020的bug,2021改,是不是只有程序猿才有的福利
我是caster,
这封密书 我要送给Anna
感谢她的一直陪伴,并向她表白。
过去的他一直是一个人生活,享受着孤独,也憧憬着爱情。一个人的长廊,一个人的山岗,一个人的地铁,一个人的游乐场,但他依然乐观,微笑着,等待着。生活难免有风风雨雨,他总是能够轻松的应对 ,并且面带阳光、自信的笑容 。生活也不会总是一帆风顺 ,但他每次都能勇敢的面对 ,随时准备接受生活的挑战 。可是他的爱情又在哪里呢?在镜子里面吗?他不敢相信,他去问大树,我的爱情在哪里? 大树告诉他,也许就在不远的地方,于是,他一个人继续向前走,走在茫茫的雪地上 ,直到有一天他与她相遇了 。他喜欢她,因为她的出现,他脸上有了更加灿烂的笑容,可是她会喜欢他吗?
情书H5链接:https://research.devops.aliyun.com/letters/0f057b7c-ac54-458f-aa2e-930f7d97aec0?correct=true
国际短信和国内短息模板不通用
因为,国外短信发送时间需要携带地区编码, 国内不需要携带
呜呜呜 ~~原来我拖后腿了
https://tomcat.apache.org
一.作用:一般用于互联网一种数据的唯一性标识。
二.实体:本身是一个128位的0/1比特。一般被表示为16进制的字符串。4个比特位组成一个16进制字符,因此常常能见到的是(128/4=)32个16进制字符组成的字符串 4951 dd1c bff8 cbbe 4cd4 475c a939 fc8b,当然它实质是一种消息摘要算法
三.特点:
1.完全相同的一段数据,不论时间地点(加密算法相同的条件)加密出的32位的字符串完全相同。
2.加密过程本身就是一个有损的加密过程。因此几乎不能还原出原始数据。安全
补充:一般还原出原始数据都是使用碰撞的方式来还原。意思大概和穷举的意思一样,有足够多的原始数据量,世界上的所有数据用 1~n来表示,把1~n都用MD5计算一遍得1x~nx(x表示计算后得的数)。把1~n当成键值对的键,把1x~nx放入键值对的值,当得到一个MD5字符串,通过值去找键,就知道是什么数据了。因为你本来就拥有数据,因此才能找到数据。但当你没有原始数据时,想通过128比特的玩意去恢复大于128比特的数据本身就是玩笑,数据量都不一样,至于原理有兴趣的朋友可以研究研究信息论。不想研究的可以回想回想之前学的香农公式。再从这一点去研究。又有大的世界。
3.散列能力巨强。安全
1、postman背景介绍
postman是接口测试的神器之一,可以发送几乎所有类型的HTTP请求,前身是google-chrome的一个插件,2018年初google停止了对chrome应用程序的支持,postman插件就无法使用了,不过我们可以到postman的官网下载对应的程序。 2、postman优点
支持各种类型的请求:GET、POST、PUT、PATCH、DELETE等(其中最常用的是GET和POST)
支持请求头(Headers)的各种自定义,如:[{"key":"Content-Type","value":"application/x-www-form-urlencoded","description":"POST请求默认方式","enabled":true}]
支持请求自定义参数的设置
支持10种不同的授权认证机制,如:Inherit auth from parent、Bearer Token、Basic Auth、Digest Auth、OAuth 1.0,OAuth 2.0等
支持collection、folder数据在线存储:可根据账号来实现数据的迁移
3、postman下载
官网下载:https://www.getpostman.com/apps
具体的安装下载过程跟一般app下载差不多非常easy,基本不需要配置什么,一路next,在这里就不一一赘述了,另外也可以网上自行搜索第三方的网站下载postman。 4、postman界面熟悉
postman的界面非常的友好,没有过多的累赘功能,呈现出来的都比较好理解
4.1左上角菜单功能
File主要用来操作文件,如新建、导入、设置、关闭窗口、退出等
Edit用来编辑操作,如撤销、重做、剪切、复制、粘贴等
View用来设置postman软件的浏览方式,如全屏、放大、缩小、切换tab请求框等
Collection集合相当于其他软件的一个项目,可以新建集合、导入、集合运行配置
History不言而喻就是运行历史了
Help帮助接口,如升级、文档、支持、GitHub、Twitter等
4.2左侧界面
上面三个都是比较熟悉的功能在菜单界面已经介绍过了,这里就简单的带过
New:新建request请求、collection集合、environment、documentation、mocker server、monitor
Import:postman支持json和csv格式的导入
Runner:运行配置,如配置延迟时间、迭代次数等
添加的collection及fodler会显示在左侧白框框中,层级依次是collection-folder-request
4.3右上部分
此部分主要是request请求区,可以设置请求相关的参数,如授权机制、请求头、数据体、请求setup、用例等
4.4右下部分
此部分主要包含response响应数据区,可以通过此区域接受服务器的响应数据并查看。
创建一个包含模板间共享布局的模板,通常这样的模板包含: 页面头部、导航栏、脚部、内容展示区域。
Layout.html
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<title>Layout page</title>
<script src="common-script.js"></script>
</head>
<body>
<header>
<h1>My website</h1>
</header>
<section layout:fragment="content">
<p>Page content goes here</p>
</section>
<footer>
<p>My footer</p>
<p layout:fragment="custom-footer">Custom footer here</p>
</footer>
</body>
</html>
注意事项:
1. html标签上附上命名空间
2. section与脚部p标签上使用layout:fragment属性
这些是布局中的插入候选槽点,通过匹配内容模板中片段进行替换。
创建一些内容模板:
Content1.html
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{Layout}">
<head>
<title>Content page 1</title>
<script src="content-script.js"></script>
</head>
<body>
<section layout:fragment="content">
<p>This is a paragraph from content page 1</p>
</section>
<footer>
<p layout:fragment="custom-footer">This is some footer content from content page 1</p>
</footer>
</body>
</html>
html标签中的layout:decorate说明哪一个布局模板使用这个内容模板进行装饰。内容模板定义自身标题与脚本、content与custom-footer片段。custom-footer片段处于footer元素内部,这其实是不必要的,但是可能会是很方便的,如果想要做内容模板的静态模板,这是一开始使用Thymeleaf的原因之一。
在一个模板内片段名称必须唯一,否则可能会出现片段不匹配,各种各样的可笑事情会接踵而至。
不管如何,一旦告知Thymeleaf处理Content1.html,最终的页面会是这样子:
<!DOCTYPE html>
<html>
<head>
<title>Content page 1</title>
<script src="common-script.js"></script>
<script src="content-script.js"></script>
</head>
<body>
<header>
<h1>My website</h1>
</header>
<section>
<p>This is a paragraph from content page 1</p>
</section>
<footer>
<p>My footer</p>
<p>This is some footer content from content page 1</p>
</footer>
</body>
</html>
内容模板装饰Layout.html,结果是布局的组合,加上内容模板的片段(两个模板的<head>元素,来自内容模板的<title>元素替换布局文件内的,所有的元素来自布局文件,但是由所有指定的内容模板进行替换)
想了解更多可以如何控制<head>元素合并,参看<head>元素合并一小节。
装饰进程重定向处理从内容模板至布局,将layout:fragment部分从内容模板中挑选出来,因为布局需要它们。正因如此,任何在layout:fragment之外的东西实际从未得到执行,这说明在内容模板中不能这样做:
<div th:if="${user.admin}">
<div layout:fragment="content">
...
</div>
</div>
如果布局模板想要’内容’片段,那么会得到那个片段,不顾任何所在条件,因为那些条件不会执行。
如果说只想用绝对最小HTML代码量替换装饰器脚部:
Content2.html
<p layout:decorate="~{Layout}" layout:fragment="custom-footer">
This is some footer text from content page 2.
</p>
这就是全部所需的东西!<p>标签同时用作根元素与片段定义,生成一个像这样的页面:
<!DOCTYPE html>
<html>
<head>
<title>Layout page</title>
<script src="common-script.js"></script>
</head>
<body>
<header>
<h1>My website</h1>
</header>
<section>
<p>Page content goes here</p>
</section>
<footer>
<p>My footer</p>
<p>
This is some footer text from content page 2.
</p>
</footer>
</body>
</html>
可以把布局看作母版,会得以填充或者被内容(子模板)覆盖,仅当内容会填充/覆盖父类。以这种方式,布局充当某种’默认’,内容充当这种默认之上的实现。
给布局传送数据
子模板向上给母版布局传送数据,在涉及到布局/装饰过程的任意元素上使用th:with/ data-th-with属性处理器,可以在任何地方layout:decorate/ data-layout-decorate 或者可以发现 layout:fragment/data-layout-fragment, 例如:
孩子/内容模板:
<html layout:decorate="your-layout.html" th:with="greeting='Hello!'">
1
父类/布局模板:
<html>
...
<p th:text="${greeting}"></p> <!-- You'll end up with "Hello!" in here -->
将来,或许会增加支持使用分片局部变量,很像Thymeleaf用于创建片段签名。
配置标题
鉴于布局方言自动用内容模板中所发现的重载布局<title>,可能会发现自己重复布局中发现的标题部分,尤其是想要创建面包屑或者在页面标题中保留页面名称。layout:title-pattern处理器可以免除重复布局标题的问题,通过使用一些特殊标记以想要标题如何出现的模式。
这是一个例子:
Layout.html
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">My website</title>
</head>
...
</html>
layout:title-pattern处理器采取简单字符串,识别两种特殊标记:$LAYOUT_TITLE与$CONTENT_TITLE。每种标记在结果页中会被各自相应的标题替换。所以,如果有下面的内容模板:
Content.html
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="Layout">
<head>
<title>My blog</title>
</head>
...
</html>
结果页会是这样:
<!DOCTYPE html>
<html>
<head>
<title>My website - My blog</title>
</head>
...
</html>
这对<title>元素内的静态/内联文本或者<title>元素上发现使用th:text的动态文本均有效。
上述例子中的模式在布局中指定,所以对所有使用布局的内容模板均适用。如果在内容模板中指定另一种标题模式,那么会覆盖布局中发现的那个,允许细粒度的控制标题的展现形式。
可重用模板
假如发现有一些HTML或者结构经常性地重复,想要做成自己的模板从不同地方插入以便减少代码重复。(模块化Thymeleaf?)这个的例子可能会是一个模态面板,由几个HTML元素与CSS类构成,在网页应用中产生一个新窗口的效果:
Modal.html
<!DOCTYPE html>
<html>
<body>
<div id="modal-container" class="modal-container" style="display:none;">
<section id="modal" class="modal">
<header>
<h1>My Modal</h1>
<div id="close-modal" class="modal-close">
<a href="#close">Close</a>
</div>
</header>
<div id="modal-content" class="modal-content">
<p>My modal content</p>
</div>
</section>
</div>
</body>
</html>
会发现可以将一些东西转换成像头部、ID的变量,以便包含Modal.html的页面可以设定它们自己的名称/ID。继续尽可能泛型化编写模态代码,然而会遇到填充自己的模态框内容的问题,那是开始接触一些限制的地方。
一些页面使用单一消息的模态框,其他想要使用模态框容纳一些更复杂的东西比如接受用户输入的表单。模态框可能性变得无休无止,但是未支持想象,发现自己得不得将这段模态框代码拷贝到每一个模板中,每一次使用场合变化相应内容,重复同样的HTML代码维持同样的外观感受,打破了过程中的DRY原则。
主要妨碍适当重用的事情是无法将HTML元素传递至插入模板中。这正是layout:insert有用的地方。它运作起来完全像th:insert,但是通过指定与实现片段很像内容/布局实例,可以创建一个公共的结构,对插入它的模板使用场合作出响应。
这是一个更新的模态框模板,使用Thymeleaf与layout:fragment属性定义一个可替换的模态框内容部分以变得更加泛型化:
Modal2.html
Modal2.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<body layout:fragment="modal(modalId, modalHeader)">
<div th:id="${modalId} + '-container'" class="modal-container" style="display:none;">
<section th:id="${modalId}" class="modal">
<header>
<h1 th:text="${modalHeader}">My Modal</h1>
<div th:id="'close-' + ${modalId}" class="modal-close">
<a href="#close">Close</a>
</div>
</header>
<div th:id="${modalId} + '-content'" class="modal-content">
<div layout:fragment="modal-content">
<p>My modal content</p>
</div>
</div>
</section>
</div>
</body>
</html>
现在可以插入这个模板,使用layout:insert处理器与无论怎样需要实现modal-content片段,通过在调用模板插入元素内创建同样名称的片段:
Content.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
...
<div layout:insert="Modal2 :: modal(modalId='message', modalHeader='Message')" th:remove="tag">
<p layout:fragment="modal-content">Message goes here!</p>
</div>
...
</html>
就像内容/布局实例,插入模板layout:fragment会被匹配片段名称的元素替换掉。在这种场合下,Modal2.html的整个modal-content部分会被上述自定义段落替换掉。这是结果:
<!DOCTYPE html>
<html>
...
<div id="message-container" class="modal-container" style="display:none;">
<section id="message" class="modal">
<header>
<h1>Message</h1>
<div id="close-message" class="modal-close">
<a href="#close">Close</a>
</div>
</header>
<div id="message-content" class="modal-content">
<p>Message goes here!</p>
</div>
</section>
</div>
...
</html>
定义在模板内包含Modal2.html的自定义消息作为模态框内容的一部分。在插入模板上下文环境中的片段与用于内容/布局过程中的片段一样工作:如果片段未在模板中定义,那么它不会覆盖插入模板中的内容,使得在可重用版本中创建默认。
1.安装webpack
npm install -g webpack
1
2.安装vue-cli
vue-cli是什么?
vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的。
使用步骤:
安装vue-cli:
npm install -g vue-cli
1
使用vue-cli构建项目
vue init webpack project-name //创建一个基于webpack模板的名为project-name的项目
1
目前可用的模板包括:
browserify –全功能的Browserify + vueify,包括热加载,静态检测,单元测试。
browserify-simple–一个简易的Browserify + vueify,以便于快速开始。
webpack–全功能的Webpack + vueify,包括热加载,静态检测,单元测试。
webpack-simple–一个简易的Webpack + vueify,以便于快速开始。
安装项目依赖
cd project-name //进入项目目录
npm install //安装项目依赖
npm run dev //运行项目
1
2
3
此时在浏览器打开:localhost:8080即可看到欢迎页。
关于webpack和vue-cli的更多使用方法参见官方文档。
但是这个只能在本地跑,要如何在我们自己的服务器上访问呢?此时需要执行
npm run build
1
搭建开发环境
本来想用vue-cli重新创建项目,试了几次总是出现各种问题,没办法成功。最后在仔细查看 Element-UI 的官方文档的 快速上手 部分的时候发现 饿了么 团队给了一个他们自己的 项目模板 。于是我就用这个模板来尝试了下,结果成功了。所以,如果你不想太折腾的话,建议还是使用官方给的项目模板,可以省很多事。
第一步:安装项目模板
克隆/下载项目模板
将下载的模板放到你项目的根目录下
安装依赖
npm install
1
运行项目模板
npm run dev
1
此时在浏览器打开:localhost:8080即可看到欢迎页。
技术分享
项目模板里已经把需要配置的文件都配置好了。
第二步:安装element-ui
第一步,我们成功安装了项目模板,接下来,我们需要安装element-ui到项目下。
npm i element-ui@next -D
1
开始使用
接下来我们就可以参照 Element-UI 的官方文档上手开发了。
例子
我们参照官方的按钮组件使用说明,在项目模板的基础上做一个按钮的例子。其它文件不需要改动,只修改App.vue文件的内容。代码如下:
App.vue
效果如下图所示:
技术分享 使用过程中碰到的问题: 1. phantomjs安装失败
由于源的问题,安装phantomjs必须要“搭梯子”,使用内网无法下载。所以解决的方法有两种:
方法一:通过科学上网,然后安装。
方法二:对于不知道怎么“搭梯子”的同学,可以通过更改源来下载,操作方法如下:
npm install phantomjs --phantomjs_cdnurl=http://cnpmjs.org/downloads
1
2.打开页面乱码
通过 Element-UI 官方提供的项目模板开发,会发现在浏览器打开页面的时候,中文是乱码的。如下图所示:
技术分享
但html页面中已经设置了
。仔细查看该页面所涉及的文件的编码格式的时候,发现引用的App.vue 文件的编码格式是GBK ,所以把该文件编码格式改为UTF-8 即可。
xmlns:th="http://www.thymeleaf.org"
/获取本机的网络ip地址 function jsonpCallback(res) { var ip = res.Ip; // ip地址 var aa = res.Isp.split("市"); var isp = aa[0]; // ip省份 alert(ip); }
function getIntnetIP() { var JSONP=document.createElement("script"); JSONP.type="text/javascript"; JSONP.src="http://chaxun.1616.net/s.php?type=ip&v=&output=json&callback=jsonpCallback"; document.getElementsByTagName("head")[0].appendChild(JSONP); } getIntnetIP();
关于异步 同步的一些理解: 同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。 你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。
可以参考廖雪峰老师的这篇文章: https://www.liaoxuefeng.com/wiki/897692888725344/923057144964288
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。
中文官方文档:https://element.eleme.cn/#/zh-CN 按照文档来
如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:
INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法! 这个语法和适合用在需要判断记录是否存在,不存在则插入存在则更新的场景.