uni-app 的 API 与微信小程序 API 基本一致。掌握微信小程序 API 对后面的开发很有帮助。微信小程序 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api/
注册微信小程序账号,获取到 AppID,我们后面配置的时候会用到。在 HBuilderX 工具栏,点击发行,选择小程序-微信。输入小程序名称和 AppID,单击发行就可以了。这样我们就会获得一个微信小程序的打包文件,接下来我们来发布微信小程序项目,打开微信小程序开发者工具,导入刚刚生成的微信小程序项目的打包文件,在微信小程序开发者工具中先测试一下,项目运行是否正常,项目测试没有问题后,点击右上角>>按钮,上传代码就可以发布微信小程序了,最后等待微信团队审核通过,别人就可以在线上访问到你的项目了。
Flask 是一个 Python 实现的 Web 开发微框架,但是这个“微”并不代表着 Flask 功能比较简陋、有所欠缺。微框架中的 “微” 意味着:Flask 旨在保持核心简单而易于扩展;Flask 不会替用户做出太多决策,比如使用何种数据库;Flask 的选项(比如使用何种模板引擎) 通常有多个,用户很容易替换。默认情况下,Flask 不包含数据库抽象层、模板引擎、身份认证或其它任何已有多种库可以胜任的功能,如下图所示。然而,Flask 支持用扩展来给应用添加这些功能,应用程序可以很方便的集成这些扩展。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。
微前端 尚处在发展时期,其核心概念和 微服务 相似。现阶段较为常用的微前端框架为 single-spa 和 qiankun,后者是基于前者实现的。该技术能做到 技术栈无关,即一个应用,能由多个不同技术的子应用构成,同时做到子应用的相互隔离,这里的隔离就可以选择采用 Web Components 实现。
咱们打开新浪微博,然后随便找个带皇冠的,按下F12键(Mac用户按command+option+i)然后选中控制台的箭头,再点击皇冠:再点开这个图片可以发现:可以看到那些大 V 图标皇冠图标以及各种微博认证等图标,都是放在了一张雪碧图里(即使再牛的大 V,身份标志也是放在雪碧图中的)。
这一步主要是确保自己的显卡能够正常使用,如果自己的 GPU 驱动过低,那么就需要根据自己的驱动版本进行相应的更新。目前来说只要将 Nvidia 显卡驱动更新至 410.x 版本及其以上就足够使用了。
请书写 SQL 语句得到imooc_class和imooc_user两表的笛卡尔积。分析:使用 Select 搭配 Cross Join 得到两表的笛卡尔积即可。语句:SELECT * FROM imooc_class CROSS JOIN imooc_user;+----+---------------+----+----------+----------+| id | class_name | id | username | class_id |+----+---------------+----+----------+----------+| 1 | SQL必知必会 | 1 | pedro | 1 || 2 | C语言入门 | 1 | pedro | 1 || 3 | JAVA高效编程 | 1 | pedro | 1 || 4 | JVM花落知多少 | 1 | pedro | 1 || 1 | SQL必知必会 | 2 | peter | 1 || 2 | C语言入门 | 2 | peter | 1 || 3 | JAVA高效编程 | 2 | peter | 1 || 4 | JVM花落知多少 | 2 | peter | 1 || 1 | SQL必知必会 | 3 | faker | 2 || 2 | C语言入门 | 3 | faker | 2 || 3 | JAVA高效编程 | 3 | faker | 2 || 4 | JVM花落知多少 | 3 | faker | 2 || 1 | SQL必知必会 | 4 | lucy | 4 || 2 | C语言入门 | 4 | lucy | 4 || 3 | JAVA高效编程 | 4 | lucy | 4 || 4 | JVM花落知多少 | 4 | lucy | 4 || 1 | SQL必知必会 | 5 | jery | <null> || 2 | C语言入门 | 5 | jery | <null> || 3 | JAVA高效编程 | 5 | jery | <null> || 4 | JVM花落知多少 | 5 | jery | <null> |+----+---------------+----+----------+----------+从结果中可以看出,交叉连接就是将一张表的每一条记录与另一张表的每一条记录进行连接成为一条新记录,排列组合完毕后得到两张表的笛卡尔积。交叉连接还可以通过隐式的连接方式来实现:SELECT * FROM imooc_class,imooc_user;
在互联网企业中,数字化办公早已经不是什么新鲜事了,其中以钉钉为代表的工具更是其中的主力军。目前公司中钉钉的使用已经较为普及,像钉钉打卡、钉钉会议室、钉盘等。本小节将针对钉钉群机器人进行介绍,助力利用钉钉群机器人实现高效、灵活的办公。
技巧 1如果我们的微服务监控平台没有任何数据,或者说,在打开微服务平台之后,各参数一直处于 loading 状态,这个时候,我们只需要在服务端调用任意一个服务接口即可,这样在微服务监控平台,我们就能看到被监控实例的参数了。技巧 2如果我们在访问 /actuator/hystrix.stream 路径时,系统找不到对应的路径,即报 404 异常,那么我们需要在对应项目的启动类中添加一个 Bean :@Beanpublic ServletRegistrationBean hystrixMetricsStreamServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); registration.addUrlMappings("/hystrix.stream"); return registration;}这样我们就能正常访问 /actuator/hystrix.stream 下的路径了。
1. 独立的页面维护了全局 错误码错误码由5位整数构成2. 每个接口一个独立的 参数说明页面正常情况下出参只返回业务实体异常情况才有 errCode errMsg每个接口下也可能有自己的业务错误码
有一定的不稳定性 : 经过长时间的使用可以得出,RabbitMQ 有时会出现消息补偿不及时、发送通道卡死等现象,但这不是经常发生的。速度还不是最快的 : 一般而言,RabbitMQ 本身的消息投递速度已经可以满足现实工作中绝大多数业务场景,在遇到复杂的业务场景时,比如,一次需要传递上万条数据时,消息间通信的速度可能就会达不到预期了,就需要我们对消息传递进行优化。
这节课程主要帮助大家如何在 Linux 与 Windows 上安装 TensorFlow-GPU 版本,值得注意的是GPU版本的安装需要因人而异,切忌直接搬用别人的安装方式。因为 TensorFlow-GPU 对于显卡的要求较高,因此如果我们对于自己的显卡性能不是很自信,那么可以尝试安装一下 CPU 版本。
实际上,肉眼对微小面积差异的敏感度并不高,很多情况下都应该用柱状图、折线图代替饼图,比如序列数据很多的时候,由于被拆分成很多扇区,不太容易一眼看出数据分布,示例:又或者是当数据分布得很均匀,差值不大的时候:从视觉效果考虑,饼图特别适合突出 某部分占总体的比重,也就是单体与总体的对比效果,例如:
我们都知道,什么事情都不可能是十全十美的。抛开 RabbitMQ 不说,在互联网行业中的其他工具,也不能百分百保证每时每刻都在正常工作,更何况是涉及到消息通信的工具。RabbitMQ 在传递消息时,由于一些客观原因或者是其本身的原因,可能会出现,在有大批量消息传递时,所有的消息不能百分百传递到目的地的问题。RabbitMQ 在设计之初就考虑到了这个问题的出现,所以,RabbitMQ 提供了内置的消息补偿机制,这里我们简单做一下介绍。当存在大批量的消息都需要经过 RabbitMQ 来投递时,RabbitMQ 会将这些消息划分成若干组,然后通过为组设置顺序的方式,来依次投递这些消息。如果在任意一组中,出现了消息未能投递到目的地的现象,那么, RabbitMQ 会将该条消息进行短暂的存储,待其他消息都到达目的地后,RabbitMQ 会重新将该条消息进行投递,然而,这个过程执行的时间是微乎其微的,几乎近于实时。
信息的搜集往往不是单一的,是由类似上面列举的很多方式的组合。我们经常听到一个词 人肉搜索,大家都很惊讶网络神人技术太强,其实主要还是因为我们散布在网上的资料信息太多了。这些零碎的资料拼一拼还是能获得很全的信息的。搜索引擎随便输入你的名字,或者外加几个关键词可能查到你在哪所学校,参加了某某活动,获得了某某名次的奖励你在哪所公司,缴交的一些社保信息你在某个网站的评论根据你的昵称到 QQ 上面搜索,同一个昵称到处用概率还是很大的,如果有手机号那就更加准确了,紧接着可以根据你的 QQ 空间获取更多你私人的信息。(这以前是非常好查的,现在腾讯也一直在完善信息安全这块)也可能是到其他平台去搜索:微博,头条,人人网,58同城 等照片网上搜索相似百度搜索引擎就有根据图片搜索到功能到政府的一些网站,如 信用xx ,上面根据法人名字也能搜索不少有价值的东西。
这一个步骤的版本因人而异,因为每个人的显卡版本不一样,并且每个人的显卡驱动也不尽相同,所以需要根据自己的实际情况而来。故而这一步的操作较为复杂。首先要查看自己显卡驱动的 CUDA Driver 版本。 打开 Nvidia 控制面板,并点击查看信息,再切换到“组件”选项卡,在此界面可以查看到自己的 CUDA Driver 版本,如下图所示:在上图的示例之中,CUDA Driver 的版本为 11.0 。去 Nvidia 开发者官方网站下载相应的 CUDA 工具包。 我们可以访问 Nvidia 开发者官网 CUDA 下载,访问的结果如下图所示:然后在这个页面之中选择符合自己版本的 CUDA 下载。 因为上文之中的CUDA Driver 版本为11.0版本,故而我们需要下载第一个 CUDA 工具包。安装 CUDA 工具包,该步骤较为简单,我们只需要双击打开,并根据指示一步步安装即可。安装完成之后根据提示,添加系统变量:并且在 Path 变量之中添加刚刚新增的变量:%CUDA10% 。Tips:该处的名字可以自己取,也可以将路径直接添加到PATH之中。
模板方法模式是定义一个操作中的算法的骨架,从而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通常对于一些重要的复杂方法和多个子类共有的方法且逻辑相同的情况下会使用模板方法模式。比如用户第三方用户认证的时候就比较适合使用模板方法。我们来看一个例子:假设我们现在需要用到微信、微博的第三方用户授权来获取用户的信息。//使用模板方法模式描述获取第三方用户信息的过程 public abstract class Authentication{ public void checkUserAuthentication(){ checkIdentity(); fetchInfo(); } protected abstract void checkIdentity(); protected abstract void fetchInfo(); } //微信用户 public class WechatAuthenication extends Authentication{ @Override protected void checkIdentity() { System.out.println("获得微信用户授权"); } @Override protected void fetchInfo() { System.out.println("获取微信用信息"); } } //微信用户 public class WeiboAuthenication extends Authentication{ @Override protected void checkIdentity() { System.out.println("获得微博用户授权"); } @Override protected void fetchInfo() { System.out.println("获取微博用信息"); } } //调用模板方法 public class Demo{ public static void main(String...s){ Authentication auth = new WechatAuthenication(); auth.checkUserAuthentication(); auth = new WeiboAuthenication(); auth.checkUserAuthentication(); } }输出结果:获得微信用户授权 获取微信用信信息 获得微博用户授权 获取微博用信信息现在我们使用 Lambda 表达式换个角度来思考模板方法模式。如果我们用函数式接口来组织模板方法中的调用过程,相比使用继承来构建要显得灵活的多。//定义一个处理接口,用来处理一项事务,如授权或者获取信息。 public interface Processer{ public void process(); } //封装调用过程 public class Authentication{ private final Processer identity; private final Processer userinfo; public Authentication(Criteria identity,Criteria userinfo){ this.identity = identity; this.userinfo = userinfo; } public void checkUserAuthentication(){ identity.process(); userinfo.process(); } } //使用模板方法 public class Demo{ Authentication auth = new Authentication(()->System.out.println("获得微信用户授权"), ()->System.out.println("获取微信用户信息")); auth.checkUserAuthentication(); auth = new Authentication(()->System.out.println("获得微博用户授权"), ()->System.out.println("获取微博用户信息")); auth.checkUserAuthentication(); }输出结果:获得微信用户授权 获取微信用信信息 获得微博用户授权 获取微博用信信息此时,我们的模板方法得到了大幅的简化,同时通过函数接口让模板方法获得了极大的灵活性。
如果运行的程序或者服务生成了日志文件,相应的日志信息也可以显示在 Run 控制台。 可以使用 Run/Debug Configuration 对话框中的 Logs 选项卡配置在控制台中的显示方式。为了帮助理解,在主程序里添加下列代码,生成日志文件 log.txt, 并写了三行信息到文件里。然后运行代码,这样就会在当前项目目录下生成 log.txt。if __name__ == '__main__': import logging logger = logging.getLogger(__name__) logger.setLevel(level=logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")打开"运行/调试配置"对话框中,单击"Logs"选项卡。点击 +, “Edit Log Files Aliases” 窗口将显示,选择要在控制台显示的日志文件,选择上面运行代码生成的日志文件 log.txt。选择日志文件后,显示下面窗口。 可以加多个日志文件,通过复选框 Is Active 控制是否要显示在控制台, 复选框 Skip Content 控制是否在控制台显示文件中原有的内容,如果选中,只显示本次运行生成的日志内容。运行程序,在 Run 控制台窗口 可以看到增加了log 选项卡。
接口有的是写给小组内部开发人员交流使用的,有的是对外开放给第三方调用的,接口文档是程序之间交互的桥梁。支付宝 / 微信 的接口是开发人员使用度比较广的第三方接口,我们经常会去调用他们的支付,小程序相关的接口,下面着重看看他们的错误码是如何定义的。
single-spaqiankunmicro-appwujie
PyCharm 提供了丰富的选项卡操作,选择其中一个打开的文件,右键点击会弹出下面的菜单,红色方框都是与选项卡相关的。另外,点击主菜单 Window -> Editor Tabs,菜单中列出所有与选项卡相关的操作。现在具体介绍菜单上的常用操作:要关闭所有打开的选项卡,右键单击任何选项卡并选择 Close All ;要关闭所有非活动选项卡,按住 (alt),然后单击活动选项卡上的 x 按钮。在这种情况下,只有活动选项卡保持打开状态;要关闭除活动选项卡和固定选项卡之外的所有非活动选项卡,右键单击单击任何选项卡并选择 Close Others 选项卡。重新打开已关闭选项卡,右键单击任何选项卡,然后从上下文菜单中,选择 Reopen Closed Tab 。若要在选项卡之间移动 ⌃→ or ⌃← (Alt + Right or Alt +Left), 或者使用上面的提到的切换器。Tips:有时候一些快捷键可能会有失效的情况,可能是与系统安装其它软件快捷方式有冲突导致的。固定或取消固定选项卡可以在编辑器中固定活动选项卡,以便当达到选项卡限制或使用 “Close Others” 命令时,该选项卡保持打开状态。要固定或取消固定活动选项卡,请右键单击它,然后从上下文菜单中选择 Pin Tab 或 Unpin Tab 。拆分屏幕有时候我们需要同时打开多个文件,这时可以使用多个选项来拆分屏幕。在编辑器中,右键单击所需的编辑器选项卡,然后选择要如何拆分编辑器窗口 Split Vertically or Split Horizontally(垂直拆分或水平拆分), 或者plit and Move Right or Split and Move Down(拆分右移动或向下移动选项)。PyCharm 将创建编辑器的拆分视图,并根据所选内容进行设置。下面的例子,先做了水平拆分,又做了垂直拆分,同时打开了三个文件。分离选项卡有时候你希望文件以单独窗口显示,这时选择某一选项卡,按 Shift + F4。
Hystrix 中的服务监控平台,就是对微服务项目进行监控的平台,包括服务运行的状态、服务有无宕机、服务异常信息监控等内容,为开发者和运维者提供了比较友好地界面支持,开发者和运维者可以直接通过观察服务平台界面,来判断具体微服务的状态信息,从而更好地对微服务进行控制。默认的 Hystrix 中间件已经为我们封装好了微服务监控平台,但是需要通过引入依赖的方式来使用它,接下来就让我们来看一下如何搭建该服务监控平台吧。
星投影是一种特殊的星号投影,它一般用来表示不知道关于泛型实参的任何信息,换句话说就是它表示一种特定的类型,但是只是这个类型不知道或者不能被确定而已。
适配器在生活中无处不在,比如电脑的转接头、读卡器、电源转接头。他们的共同点就是接口标准不一样,需要通过适配器转换后才能使用。就拿读卡器来说,存储卡的接口只能适配相机或者手机的卡槽。而电脑普遍为 USB 接口。那么如何在电脑上使用存储卡呢?我们可以用读卡器,一头卡槽能够插入存储卡,另一头 USB 可以插在电脑上。通过适配器可以解决接口不兼容的问题。还有个例子就是电脑的变压器,电脑一般接收20V电压,但是我国电压是220V,因此就需要变压器做转换,如下图所示,进来是220V,出来被转为20V。变压器其实就是适配器。
macvlan 是 Linux 的内核模块,是一种网卡虚拟化技术,功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的MAC地址在数据链路层进行网络数据的转发,一块网卡上配置多个 MAC 地址,每个interface 可以配置自己的 IP。Docker 的 macvlan 网络使用了 macvlan 驱动。 在物理网络拓扑结构上看,每张虚拟网卡都是一个单独的网口。我们需要两台装好 Docker 服务的 Linux 虚拟机,并且虚拟机的网络要互通。创建 macvlan 网络,在两个节点上都进行此操作:docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth1 -o macvlan_mode=bridge macvlan_net macvlan 是 kernel 的模块名;192.168.2.0/24是宿主机所在网络的网段;192.168.2.1是网关;eth1 是 Docker 宿主机(两台虚拟机)接入192.168.1.0/24 的物理网口。创建容器并指定 IP:容器b1:docker run -it -d --net macvlan_net --ip=192.168.1.101 --name b1 busybox容器b2:docker run -it -d --net macvlan_net --ip=192.168.1.102 --name b2 busybox测试容器通信容器b1:docker exec -it b1 ping 192.168.1.102容器b2:docker exec -it b2 ping 192.168.1.101
下面的这些属性都是用来进行项目配置的。一些常用的配置项,项目创建完成后,会自动帮我们生成,我们需要去了解每个配置项的含义,以及配置项对应的设置条件有哪些限制。比如导航栏标题颜色样式 navigationBarTextStyle 这一个配置项,仅支持black/white 这两个颜色的设置,很多人会设置成十六进制颜色,比如 #0000FF,这样系统就会识别不了。属性默认值说明支持平台全局配置页面配置navigationBarTextStylewhite导航栏标题颜色样式,仅支持 black/white所有✓✓navigationBarTitleText导航栏标题文字内容所有✓✓navigationBarBackgroundColor#F7F7F7导航栏背景颜色所有,默认值小程序平台有差异,以各小程序文档为准✓✓navigationBarShadow导航栏阴影,详见3.2.2所有✓navigationStyledefault导航栏样式,仅支持 default/custom微信小程序 7.0+、百度小程序、H5、App(2.0.3+)✓✓disableScrollfalse滚动条微信小程序(iOS)、百度小程序(iOS)✓backgroundColor#ffffff下拉显示出来的窗口的背景色微信小程序✓✓backgroundTextStyledark下拉 loading 的样式,仅支持 dark / light微信小程序✓✓enablePullDownRefreshfalse是否开启下拉刷新,详见3.1.1所有✓✓onReachBottomDistance50页面上拉触底事件触发时距页面底部距离,单位只支持px所有✓✓usingComponents引用小程序组件所有✓✓pageOrientationportrait横屏配置,屏幕旋转设置,仅支持 auto / portrait / landscape,详见3.1.2App 2.4.7+、微信小程序✓
一些物理设备的标准,如网卡网线,传输速率定义,最终实现将我们的数据转成电信号传输。
当动画造成页面的卡顿,可以用下面这种方式尝试解决:开启 GPU 加速,例如使用 transform:transition3d(0,0,0)。有时候需要实现鼠标 hover 到元素上,会出现一个提示效果。如果使用 transition 过渡属性发现总是不能实现这个效果,而 animation 是可以解决的:<div class="demo"> 往事不要再提<span>人生已多风雨</span></div>.demo{ cursor: pointer;}.demo>span{ display: none; }.demo:hover>span{ display: block; animation: shows 1s forwards;}@keyframes shows { from{ opacity: 0; }to{ opacity: 1; }}效果图说明: transition 不能实现(隐藏/显示)之间的过渡效,原因是 diaplay:none 设置之后虽然元素在页面中,但是这个标签不在浏览器的渲染进程里面。如果这个元素属性为 display:block 相当于元素从新渲染出来,这时里面的 opacity: 0 到 1 就不起作用了。所以这里使用 animation 正好可以弥补这个问题。
如果项目需求比较简单,建议直接下载使用编译文件。如果项目环境允许使用公共 CDN,建议使用 CDN 方式引入编译文件,可获得更好 HTTP 性能。如果开发环境已经配备 webpack、rollup 等工程化环境,则应优先使用 npm安装,并将 ECharts 与项目中使用到的其他第三方框架一起打包,减少客户端请求数。使用时,可根据需求,在 echarts.js、echarts.common.js、echarts.simple.js 之间选择最合适的编译版本。个人经验是优先使用 echarts.common.js,但需求无法满足时再使用 echarts.js,如果运行环境比较苛刻,如 3G 网络下,则自行构建最轻量级的版本,构建方式可参阅第二节 ECharts 自定义构建。
点击工具栏–运行–运行到内置浏览器,测试H5平台。点击工具栏–运行–运行到小程序模拟器–微信开发者工具,测试微信小程序平台。