《编程之美》做题笔记

1 中国围棋将帅问题 1.1 主要思路 使用一个字节,自然想到利用字符变量来存储数据。要保存A、B两个棋盘的信息,可将字符变量拆分为前后两个4bit数据,分开进行读写。将每个位置分别使用1-9表示,如下所示: 1.2 实现代码 #include<stdio.h> /* * 读取字符b左四位数值(b右移四位即可) */ #define LGET(b) (b >> 4) /* * 将b左四位数值设置为n * 先将b左四位清零,再和n右移四位后的值进行或运算赋值 */ #define LSET(b,n) ( b = ((b & 0x0f) | (n << 4) )) /* * 读取字符b右四位数值(将b左四位清零即可) */ #define RGET(b) (b & 0x0f) /* * 将b右四位数值设置为n * 先将b右四位清零,再和n进行或运算赋值 */ #define RSET(b,n) ( b = (b & 0xf0) | n ) int main() { unsigned char b; // 通过循环对b赋值,实现不新增变量 for(LSET(b, 1); LGET(b) < 10; LSET(b, LGET(b) + 1)) { for (RSET(b, 1); RGET(b) < 10; RSET(b, RGET(b) + 1)) if (LGET(b) % 3 !

在conda环境下安装h5py

首先查看自己conda的信息 conda info --envs 如果自己安装有多个环境,则先选择你要安装的环境 conda activate tf2x #激活tf2x环境 这时候就可以用pip安装了 如果不选择版本号,conda会自动安装最新版本 pip install h5py 如果你用tensorflow,可能会报错,报错原因是版本不对 可以先卸载再重新安装适合的版本 pip uninstall h5py pip install h5py==2.10.0

Vue3 修改 ref的值,不触发watchEffect的原因

const myRef = ref(name: ‘jinD’) 修改 myRef.value.xxx时,不触发watchEffect的原因在于,触发trigger传入的对象是否相同,在 watchEffect 里面访问 myRef.value 时,此时 track的target 是refCompImpl实例,也就是ref 但是修改值时,是通过 myRef.value.xxx = newValue, 不是给 myRef.value = {}设置新值,触发的trigger是在 proxy 的 getter里面(ref 都给传入的对象调用了reative, 也就是把传入的对象转为了proxy),此时trigger的target = {name: ‘xxx’}, 和之前track的 target不一致,没有获取到对应的effect(一个effect就是一个依赖,这里可以理解为watchEffect传入的cb), 所以不会导致 watchEffect 传入的cb重新执行 代码解析: import { defineComponent, computed, ref, watchEffect } from 'vue' const obj = { name: 'jinD', } export default defineComponent({ name: 'app', setup() { const myRef = ref({ name: 'jinD' }) watchEffect(() => { console.log('watchEffect 执行') console.

Win10优化大师Windows 10 Manager v3.4.6.0 官方安装&绿色版

Win10优化大师Windows 10 Manager v3.4.6.0 官方安装&绿色版优化、调整、修理和清理Windows 10的完整解决方案。 Windows 10 Manager是专门用于微软Windows10的集所有功能于一身的实用工具,它包括了40多个不同的实用程序来优化,调整,清理,加快和修复您的Windows 10,可以让你的系统执行速度更快,消除系统故障,提高稳定性和安全性,个性化您的Windows 10,它能满足您的所有期望。 信息 获得系统和系统上的所有硬件的详细信息;帮你找出的Windows,Office产品安装密钥;显示运行在你机器上进程和线程的详细信息;Windows 10 Manager提供1点击清理功能自动清扫系统;维修中心可以帮助您解决各种系统问题。 优化 调整你的系统以提高windows的启动及关机速度,调整你的硬件以提高系统速度和性能;控制哪些程序随着Windows启动而启动,检查并修复高级启动项目以恢复被病毒恶意的改变;调整和优化系统服务和计划任务,关闭一些不必要的系统服务和任务以提高系统性能。 清理 找出哪些文件占用了你的磁盘空间并用带图表显示;智能卸载程序能完全卸载程序而无残留的文件和注册表项目;查找并清除垃圾文件以减少硬盘空间占用;重复文件查找器可以扫描你的电脑中具有相同大小、名称和修改时间的文件;注册表清理能检查不正确的注册表项;注册表整理能重建和重新索引您的注册表,以减少注册表访问时间,从而提高应用程序的响应速度;桌面清理器可以轻松地清理桌面上的无用的图标和文件。 自定义 调整资源管理器的外观,桌面,开始菜单,任务栏和通知区域来自定义您的系统;管理被固定项目和固定任何文件或文件夹到任务栏和开始;在任务栏上创建快速启动的跳转列表项;调整Windows 10的启动菜单;鼠标右键单击的编辑上下文菜单;轻松编辑当鼠标右键点击桌面左下角或Win+ X键盘快捷键显示的Win + X菜单;创建快速执行在运行对话框中的快捷方式。可视化定制可以更改系统和文件类型图标,自动改变锁屏图像。 安全 调整系统,组件,UAC,登录设置,调整各种设置和限制访问驱动器和方案,提高系统的安全性;保护您的敏感文件和文件夹的安全性,加密文件,将系统文件夹移动到安全地点;隐私保护通过消除跟踪可以确保隐私及敏感信息的安全;文件恢复能恢复删除或格式化的逻辑磁盘上的文件;锁定一些系统功能,以提高安全性。 网络 优化和调整你的互联网连接和网络设置;调整微软Edge浏览器设置;IP切换器可以在不同的网络设置之间轻松切换;编辑Hosts文件以加快系统浏览互联网的速度; Wi-Fi管理可以查看和管理所有的无线网络。 多种实用程序 创建计划任务或触发任务的监控;显示和运行内置的Windows的有用的集合工具;将一个文件分成几个较小的文件或合并回原始文件;超级拷贝是自动复制或备份文件的有力工具;使用注册表工具很容易地操作你的注册表。 文章来源于就要应用网:http://www.91apps.cn/computer-series-1313.html

使用pyinstaller打包Python程序为exe可执行文件

使用pyinstaller打包Python程序为exe可执行文件 序安装pyinstaller第三方库安装第三方库的小技巧 打包将exe所需的文件迁移到一个文件夹结语 序 对于如何将py文件打包生成exe可执行文件最简单的应该我觉得就是使用pyinstaller第三方模块 下面我就分为三个步骤给大家讲解如何使用 并分享一点小技巧 下面直接进入分享啦 安装pyinstaller第三方库 既然要安装第三方库,当然离不了pip install啦 直接使用pip install pyinstaller就可以安装啦 (不过这样似乎遇到第三方模块比较大的话就很慢甚至无法成功安装啦 ) 安装第三方库的小技巧 当然有解决办法呀 那就是使用国内镜像源 添加后就像是开挂了的 pip install pyinstaller -i http//pypi.douban.com/simple --trusted-host pypi.douban.com 打包 打包的话首先需要找到你需要打包的py文件的路径 然后使用pyinstaller -F py文件的路径 -F 表示只生成一个扩展名为.exe可执行文件 下面附上安装图和安装成功的截图 根据提示的路径找到相应的exe打包文件 将exe所需的文件迁移到一个文件夹 最后就是将原来创建项目对于py文件所需的环境和文件移动到打包生成的exe同一个文件夹下就OK啦 结语 好啦 分享到这里就结束了啦,希望能对各位有所帮助 如发现有任何纰漏或者有任何建议都欢迎各位在评论区留言。

Redis Cluster集群搭建

Redis Cluster集群搭建 集群搭建参考官网:https://redis.io/topics/cluster-tutorial ​ redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地址就可以了)部署6个redis实例,三主三从,搭建集群的步骤如下: Redis 5.0以上版本 1、创建Redis节点安装目录 mkdir -p /usr/local/redis_cluster :指定目录下 创建 redis_cluster 2、在redis_cluster目录下,创建7000-7005个文件夹下 mkdir 7000 7001 7002 7003 7004 7005 3、并将redis-conf分别拷贝到7000-7005文件夹下 cp /opt/redis-5.0.4/redis.conf ./7000 4.修改Redis配置文件 /usr/local/redis_cluster/7000/redis.conf # 关闭保护模式 用于公网访问 protected-mode no port 7000 # 开启集群模式 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 # 后台启动 daemonize yes pidfile /var/run/redis_7000.pid logfile "7000.log" #dir /redis/data # 此处绑定ip 可以是阿里内网ip 和 本地ip 也可以直接注释掉该项 #bind 127.0.0.1 #用于连接主节点密码 masterauth guoweixin #设置redis密码 各个节点请保持密码一致 requirepass guoweixin 5、依次复制并修改 6个redis.

[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)解决方案

转载请标明出处:http://blog.csdn.net/donkor_/article/details/116013464 前言: 最近工作状态慢慢闲下来,开始研究Flutter,在创建和配置环境之后产生了如下的问题。 [!] Android toolchain - develop for Android devices (Android SDK version 30.0.3) ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses ▲ 问题分析 看到这里大概意思就是flutter doctor 执行命令之后提示我们:某些 Android 许可证不被接受。 ▲ 解决方案 怎么解决呢?实际上已经给出了答案, 在命令行里直接执行如下代码块: flutter doctor --android-licenses 然后,一路 y 同意即可。 ▲ 最后测试结论 解决 ヾ(◍°∇°◍)ノ゙ About me Email :donkor@yeah.net Android开发交流QQ群 : 537891203

解决System limit for number of file watchers reached

问题背景 系统: deepin 详情: 在用vue脚手架写项目的时候,用npm run serve启动服务,报错Error: ENOSPC: System limit for number of file watchers reached 解决办法 原因:文件监视程序的系统产生了限制,达到了默认的上限,需要增加限额。 查看限额 cat /proc/sys/fs/inotify/max_user_watch 临时增加限额 sudo sysctl fs.inotify.max_user_watches=524288 sudo sysctl -p 永久增加限额 echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf sudo sysctl -p

JAVA日常开发中常用的日志记录方式,攒个赞好不好?

引言: 日志大家都再熟悉不过了,日常开发中经常要用到,甲方接口人最喜欢对我说的话就是“赶紧去查一下日志,快点!”,说话的同时瞪着个铜铃大的眼睛。 就你接口人知道日志吗?还要你指挥啊,我心里可真来劲,但是没办法谁叫我是乙方的,我想大口喘气,也得拿手捂着,兄弟们都指着我好好说话呢,我这话一出口,我这一众兄弟这个月的绩效恐怕就打水漂了。 就在我进行心里斗争的时候,接口人又说了“什么时候能定位到问题,啥时候能解决?”。(甲方规定:超1小时通报、超过2小时扣分、超4小时约谈领导、24小时没搞定打包回家)。 下面恭迎今天的主角“日志”大神出场。 什么是日志 日志:记录程序的运行轨迹,打印一下设定的信息,比如错误,很方便查找关键信息,快速定位解决问题。 Java程序员在开发项目时都是依赖debug来调试错误、跟踪代码来解决bug,比如我们开发工具Eclipse/MyEclipse就有很强大错误调试功能,比如我自己就有4个版本的: (我怀疑你在做广告) 当然在开发环境下,要调试这些错误很容易,打好断点跟踪代码就行了,但项目发布到了测试、生产环境怎么办?不好意思你调试不了,甲方会断了一切你可以这么做的念想。所以日志就派上用场了,日志打印的好,就能根据日志的轨迹快速定位并解决线上问题,反之你光凭分析代码、分析数据,脑细胞胡乱打架是没法快速解决问题的,日志记录的信息能够很好的帮助开发人家快速定位到问题,并且解决。 记录日志的方式 有很多记录日志的方式,比如 log4j、Logging、commons-logging、slf4j 等等,这里呢我就说说我们做项目经常用到的几种。 log4j 配置文章可以看我的文章 Log4j配置详解 我用的是 log4j-1.2.15.jar 这个包,将其放在lib下 输出到控制台 log4j.properties配置 # DEBUG 日志优先级,stdout(自定义名字) 代表日志输出到那个地方 log4j.rootLogger= ERROR, stdout # 设置日志输出类型 appender负责控制日志记录操作的输出 ConsoleAppender:日志信息输出到控制台 log4j.appender.stdout= org.apache.log4j.ConsoleAppender # 日志自定义格式 log4j.appender.stdout.layout= org.apache.log4j.PatternLayout # 日志输出格式为 优先级、 [产生日志事件的线程名]、日志信息、换行 log4j.appender.stdout.layout.ConversionPattern= %5p [%t] %m%n 测试代码 package com.log; import org.apache.log4j.Logger; public class Log4jTest { Logger logger = Logger.getLogger(this.getClass()); public void test() { logger.debug("debug print"); logger.info("info print"); logger.warn("warn print"

阿里Nacos系列——配置中心为什么选择长轮询?

本系列是从头开始进行学习Nacos的相关知识,从相关概念到业务开发等等。本篇是第五篇,主要知道配置中心为什么选择长轮询? 入门篇:阿里Nacos系列——为什么要选择Nacos和Nacos的基础概念 入门篇:阿里Nacos系列——Nacos的核心概念 搭建篇:阿里Nacos系列——Nacos安装教程(带图–手把手教学) 搭建篇:阿里Nacos系列——(超详细、带图带源码)Nacos注册中心的搭建与测试 概念篇:阿里Nacos系列——配置中心为什么选择长轮询? 数据交互模式 数据交互有两种模式:Push(推模式)和 Pull(拉模式)。 推模式指的是客户端与服务端建立好网络长连接,服务方有相关数据,直接通过长连接通道推送到客户端。 优点是及时,一旦有数据变更,客户端立马能感知到;另外对客户端来说逻辑简单,不需要关心有无数据这些逻辑处理缺点是如果客户端的数量比较多,那么服务端需要耗费大量的内存资源来保存每个资源,并且为了检测连接的有效性,还需要心跳机制来维持每个连接的状态 拉模式指的是客户端主动向服务端发出请求,拉取相关数据 优点是此过程由客户端发起请求,故不存在推模式中数据积压的问题缺点是可能不够及时,如果服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的Pull操作 轮询与长轮询 两者都是拉模式的实现 轮询是指不管服务端数据有无更新,客户端每隔定长时间请求拉取一次数据,可能有更新数据返回,也可能什么都没有。配置中心如果使用「轮询」实现动态推送,会有以下问题: 推送延迟。客户端每隔 5s 拉取一次配置,若配置变更发生在第 6s,则配置推送的延迟会达到 4s。 服务端压力。配置一般不会发生变化,频繁的轮询会给服务端造成很大的压力。推送延迟和服务端压力无法中和。降低轮询的间隔,延迟降低,压力增加;增加轮询的间隔,压力降低,延迟增高。 长轮询则不存在上述的问题。客户端发起长轮询,如果服务端的数据没有发生变更,会 hold 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询。配置中心使用「长轮询」如何解决「轮询」遇到的问题也就显而易见了: 推送延迟。服务端数据发生变更后,长轮询结束,立刻返回响应给客户端。服务端压力。长轮询的间隔期一般很长,例如 30s、60s,并且服务端 hold 住连接不会消耗太多服务端资源。 长轮询核心流程 客户端发起长轮询 客户端发起一个 HTTP 请求,请求信息包含配置中心的地址,以及监听的 dataId(本文出于简化说明的考虑,认为 dataId 是定位配置的唯一键)。若配置没有发生变化,客户端与服务端之间一直处于连接状态。 服务端监听数据变化 服务端会维护 dataId 和长轮询的映射关系,如果配置发生变化,服务端会找到对应的连接,为响应写入更新后的配置内容。如果超时内配置未发生变化,服务端找到对应的超时长轮询连接,写入 304 响应。 304 在 HTTP 响应码中代表“未改变”,并不代表错误。比较契合长轮询时,配置未发生变更的场景。 客户端接收长轮询响应 首先查看响应码是 200 还是 304,以判断配置是否变更,做出相应的回调。之后再次发起下一次长轮询。 服务端设置配置写入的接入点 主要用配置控制台和 client 发布配置,触发配置变更 nacos实现长轮询 流程图 Nacos服务端收到请求后,会检查配置是否发生了变更,如果没有,那么设置一个定时任务,延期29.5秒执行。同时并且把当前的客户端长轮询连接加入到allSubs队列。 这时候有两种方式触发该连接结果的返回: 第一种:等待29.5秒(长连接保持的时间)后触发自动检查机制,这时候不管配置有无发生变化,都会把结果返回给客户端。第二种:在29.5秒内的任意一个时刻,通过Nacos控制台或者API的方式对配置进行了修改,那么触发一个事件机制,监听到该事件的任务会遍历allSubs队列,找到发生变更的配置项对应的ClientLongPolling任务,将变更的数据通过该任务中的连接进行返回,即完成了一次推送操作。 参考文章:SpringCloud-Nacos配置中心实现原理

802. 区间和 【离散化】超详细解析

https://www.acwing.com/problem/content/804/ 本题的数据范围实在太大,用哈希表做不出来,但是你会发现数轴上的数字是离散的,就是数轴上的数不是一个挨着一个的,数轴上的数并不是特别多。那么我们就可以将数轴上的点映射到一个挨着的数组里。 本解析一步步的求出结果,且根据案例。 故边看案例边看代码使用效果最好。 总共需要的数组 add : 保存真实的下标和相应的值alls : 用来保存真实的下标和想象的下标的映射关系query : 用来保存我们查询的左右两个端点a : 保存想象的坐标所对应的值s: 保存想象的坐标所对应的值的前缀和 第一步: 输入数轴上所对应的值 for(int i=0;i<n;i++) { int index,x; cin>>index>>x; add.push_back({index,x});//index 是我们真实的下标 x是数值 alls.push_back(index);// 将真实的下标和我们想象的坐标建立映射关系 } 第二步: 输入我们的查询的区间 for(int i=0;i<m;i++) { int l,r; cin>>l>>r; query.push_back({l,r});//保存查询的区间 alls.push_back(l); //将其左右端点也映射进来,目的是可以让我们在虚拟的映射表里找到,这对于我们后面的前缀和操作时是十分的方便的。 //如果当我们在虚拟的映射表里找的时候,如果没有找到左右端点,那么前缀和无法求。 alls.push_back(r); } 第三步: 将虚拟的坐标排序并去重 为啥去重: 是因为当我们输入 3 5 3 6 即给数轴上3的点加5 再加 6时。此时我们的坐标映射表里有了两个3 3 但其实它们对应的是同一个坐标。 故需要去重,排序。 sort(alls.begin(), alls.end());//排序 alls.erase(unique(alls), alls.end());//去重(坐标) 那么此时,我们来看一下,案例所建立的映射表是怎样的。 第四步:根据真的坐标,来找到对应虚拟的坐标,将其位置加上其相对应的数值。 根据真的坐标找其对应的映射的坐标,用二分来查找。 int find(int x) { int l=0,r=alls.

windows server 设置FTP域用户隔离

一、实验环境 三台设备 2012 域控制器 ip 192.168.10.101 2008r2 FTP服务器 ip 192.168.10.104 win10 客户机 ip 192.168.10.107 实验说明 将FTP服务器加入域控制器中,其完全域名为ftp.2021skills. com建立ftp 站点ftp.2021kils.com站点主目录为 C:\ftp,不允许匿名登录,所有用户只具有读取和写入文件权限,FTP站点欢迎消息为:“欢迎访问网络搭建FTP服务器!”,并且用命令浏览文件时使用UNIX方式显示,日志文件记录到 C: \\ftp\LogFiles目录下;为ftp1.2020skills.com设置域用户隔离,在域控制器中创建域用户ftpuser1和ftpuser2,密码为2020skills. com,设置两个用户主目录分别为网络文件夹\\ftp\ftpuser1、\\ftp\ftpuser2。 二、实验部署 1.在域控制器中添加用户,用户组,组织单元 2.在FTP服务器根目录中添加FTP的目录,与用户目录,并在各个目录中做好标记 3.建立站点ftp.2021skills. com, 这里我填写主机名最后无法访问,尝试只是用ip最后成功 4.不允许匿名登录,所有用户具有写入和读取权限 5.设置欢迎消息 6.设置用命令浏览文件时使用UNIX方式显示 7.文件记录到C:\ftp\logfiles目录下 8.将FTP服务器根目录共享并设置权限给用户组 这里的共享权限只给到域中的ftp组即可,防止samba访问越权 9.回到域控制器中的域用户管理点击查看-高级功能 10.选择用户-属性-属性编辑器修改msIIS-FTPRoot和msIIS-FTPDir 注意:msIIS-FTPRoot=FTP根目录=ADFTProot、msIIS-FTPDir=用户主目录=用户名目录 11.在FTP服务器中打开用户隔离 12.到win10客户端检测 这里可以看到,ftp不但做到了隔离同样具有写入权限 如果试图通过samba访问则无法成功

神经网络基础05-注意力机制

参考链接:https://blog.csdn.net/shenziheng1/article/details/89323074 Attention Model sequence-to-sequence模型由编码器-解码器体系结构组成,如图2(a)所示。编码器是一个RNN,它接受tokens的输入序列(x1,x2,…,xt),其中t是输入序列的长度,并将其编码为固定长度的向量(h1,h2,…,ht)。解码器也是一个RNN,它以一个固定长度的向量ht作为输入,通过tokens-to-tokens生成一个输出序列(y1,y2,…,ytt),其中tt是输出序列的长度。在每个位置t,ht和st分别表示编码器和解码器的隐状态。 关键理念 注意模型旨在通过允许解码器访问整个编码的输入序列(h1,h2,…,ht)来减轻这些挑战。其核心思想是在输入序列上引入注意权重α,以优先考虑存在相关信息的位置集,以生成下一个输出token。 Attention的使用 具有注意模型的相应编码器-解码器体系结构如图2(b)所示。网络结构中的注意力模块负责自动学习注意力权重αij,它可以自动捕获hi(编码器隐藏状态,我们称之为候选状态)和sj(解码器隐藏状态,我们称之为查询状态)之间的相关性。然后,这些注意力权重用于构建内容向量C,该向量作为输入传递给解码器。在每个解码位置j,内容向量cj是编码器所有隐藏状态及其相应注意权的加权和。 学习注意力权重 注意力权重是通过在体系结构中加入一个额外的前馈神经网络来学习的。该前馈网络学习一个特殊的注意权αij,作为两种状态h(i)和s(j-1)的函数。简单地说,就是用这两种状态作为神经网络的输入,进而学习αij关于他们的函数。 Taxonomy of Attention 我们将注意力分为四大类,并说明每一类中不同类型的注意力,如表1所示。我们要强调的是,这些类别并不相互排斥。注意力模型可以应用于多个类别的组合,如多层次的、self和soft注意力组合。因此,我们可以将这些类别视为维度,在将注意力用于感兴趣的应用时,可以考虑这些维度。为了使这一概念易于理解,我们提供了一份关键技术论文列表,并在表2中指定了作者在提出的方法中使用的多种注意类型。 Number of sequences 到目前为止,我们只考虑了涉及单个输入和相应输出序列的情况。当候选状态(candidate state)和查询状态(query state)分别属于两个不同的输入和输出序列时,使用这种注意模型的我们称之为区别性distinctive。大多数用于翻译、总结、图像字幕和语音识别的注意力模型都属于区别性distinctive的注意力类型。 共同注意模型co-attention同时对多个输入序列进行操作,并共同学习它们的注意力权重,以捕获这些输入之间的交互作用。刘等人使用共同注意力模型构建了视觉问答系统。作者认为,除了对输入图像进行视觉注意建模外,对问题注意建模也很重要,因为问题文本中的所有单词对问题的答案并不同等重要。此外,基于注意力的图像表示用于引导问题的注意力,反之亦然,这基本上有助于同时检测问题中的关键短语和与答案相关的图像的相应区域。 相反,对于文本分类和推荐等任务,输入是序列,但输出不是序列。在相同的输入序列中,注意力模型可以用于学习输入序列中每个tokens的相关tokens。换句话说,对于这类关注模型,查询和候选状态属于相同的序列。为此,Yang等人[Yang et al. ,2016]提出了自我关注,也就是内在注意力模型。 Number of abstraction levels 在最一般的情况下,只为原始输入序列计算注意力权重。这种注意力模型可以称为单一水平single-level。另一方面,注意力可以按顺序应用于输入序列的多个抽象层次。较低抽象级别的输出(内容向量)成为较高抽象级别的查询状态。此外,使用多层次注意力模型可以根据权重是自上而下(从较高抽象级别到较低级别)[Zhao and Zhang, 2018]还是自下而上学习[Yang et al., 2016]来进一步分类。 我们举例说明了这一类别中的一个关键示例,它在两个不同的抽象级别(即单词级别和句子级别)使用注意力模型来完成文档分类任务[Yang et al., 2016]。该模型被称为“层次注意力模型”(HAM),因为它捕获了文档的自然层次结构,即文档由句子组成,句子由单词组成。多层次的注意力模型允许提取句子中重要的单词和文档中重要的句子,如下所示。它首先建立了一种基于attention的句子表示法,并将第一级attention应用于单词嵌入向量序列。然后,它使用第二级注意来聚合这些句子表示,以形成文档的表示。文档的最终表示形式用作分类任务的特征向量。 Number of position 在第三类中,差异来自于计算注意力函数的输入序列的位置。Bahdanau等人引入的注意力模型也被称为软注意力soft attention [Bahdanau et al., 2014]。顾名思义,它使用输入序列所有隐藏状态的加权平均值来构建内容向量。软加权方法的应用使得神经网络易于通过反向传播进行有效的学习,同时也导致了二次计算代价。 Xu等人提出了一个硬注意模型 hard attention [Xu et al., 2015],其中内容向量是根据输入序列中随机抽样的隐藏状态计算出来的。这是通过使用由注意权重参数化的多努利分布来实现的。由于计算成本的降低,硬注意模型是有益的,但是在输入的每一个位置做出一个艰难的决策,使得所得到的框架不可微分,难以优化。因此,为了克服这一局限性,文献中提出了变分学习法和策略梯度法在强化学习中的应用。 在机器翻译任务的背景下,Luong等人提出了两种关注模型,即局部Local关注模型和全局Global关注模型[Luong et al. , 2015]。全局注意力模型与软注意力模型相似。另一方面,局部注意模型介于软注意和硬注意之间。关键思想是首先检测输入序列中的注意点或位置,然后在该位置周围选择一个窗口,以创建局部软注意模型。输入序列中的位置可以设置(单调对齐)或通过预测函数(预测对齐)学习。因此,局部关注的优势在于在软关注、硬关注、计算效率、窗口内可微性之间的参数权衡。 Number of representations 一般来说,输入序列的单一特征表示被大多数网络模型使用。但是,在某些情况下,使用输入的一个特征表示可能不足以完成下游任务。在这种情况下,一种方法是通过多个特征表示来捕获输入的不同方面。注意力机制可以用来为这些不同的表示分配重要权重,这些表示可以确定最相关的方面,而忽略输入中的噪声和冗余。我们将此模型称为多表示注意模型,因为它可以确定下游应用程序输入的多个表示的相关性。最终的表达是这些多重特征及其注意模型的权重加权组合。注意力模型的一个好处是通过检查权重,直接评估哪些嵌入是特定下游任务的首选嵌入。 Kiela等人在同一输入句的不同单词嵌入上学习注意力模型权重,以改进句子表示[Kiela et al. , 2018]。同样地,Maharjan等人也利用注意力来动态地给词汇、句法、视觉和体裁信息的书籍的不同特征表示赋予权重[Maharjan et al.

关于 $ Super $ $ 和 $ Sub $ $ 的用法

这个符号想必不少人也是在RT-Thread的KEIL MDK工程源码中接触到的,我也一样。 文章中我给$这个符号间加了很多空格为了防止跟文字的语法冲突了,需留意一下,实际使用没有空格 官方note: Keil帮助手册: 随便找了块STM32板子在MDK工程模板上测试这个符号的用法: void $Sub$$main(void) { // extern int main(void); extern int $Super$$main(void); //初始化HAL HAL_Init(); //初始化系统时钟 SystemClock_Config(); delay_init(80); //初始化延时函数 80M系统时钟 uart_init(115200); //初始化串口,波特率为115200 printf("初始化已完成\n"); //回到真正的main函数里 $Super$$main(); } int main(void) { u8 len; u16 times = 0; // HAL_Init(); // SystemClock_Config(); //初始化系统时钟为80M // delay_init(80); //初始化延时函数 80M系统时钟 // uart_init(115200); //初始化串口,波特率为115200 printf("main()\r\n"); while(1) { } 运行效果: 通俗一点讲,实际上就相当于在main函数之前先运行了$ Sub $ $ main这个函数,并且在$ Sub $ $ main这个函数里最后一句$ Super $ $ main();又用真正的main函数整体替换这个$ Super $ $main(), $ Sub $ $ main最后成为了真的main函数(类似宏定义)。这种方法就是用于表面上看简化了main函数的程序复杂度,但本质上没有啥区别。

【问题解决】如何将json字符串转为List

关于json字符串的处理 注:这是我通过接口远程调度得到的json字符串。 { "code":0, "message":"ok", "data":[ { "stationId":54416, "localDate":"2021-04-11T16:00:00.000+00:00", "temAvgDay":3.1125, "temMaxDay":7.4, "temMinDay":0, "winMax":1.8, "totalPrecip":0 }, { "stationId":54416, "localDate":"2021-04-12T16:00:00.000+00:00", "temAvgDay":12.04, "temMaxDay":16.4, "temMinDay":5.6, "winMax":4.7, "totalPrecip":0 } ] } ​ 在远程调度接口的时候,接口返回我们这一个json字符串。这时候我们需要提取出这个json字符串中的data数据,在事前我们已经写了一个这样的类对象,用于存储这里面的相关系,但是这之间应该如何操作呢? ​ 首先,这返回的是一个json字符串,我是无法对其进行操作的。所以第一步我们应该将这个json字符串转为json对象。 //getDataInfo() 这个是我远程调度接口的方法,这里不做详细展示 JSONObject jsonObject = (JSONObject) getDataInfo(match.getStationId()).getData(); ​ ​ 在转成json对象过后我们就可以去取里面的值了,完成数据的定向获取。这里用一个JSONArray数组来接收。 JSONArray data = jsonObject.getJSONArray("data"); ​ ​ 虽然拿到了这个数据,但是我们无法获取这一条一条数据中的具体属性,因为java虽然知道这是一个数组,但是也仅仅是一个数组,不知道他里面到底有什么。于是我们希望将这个JSONArray转为我们实现写好的DataInfo类的List,这样我们就可以去获取其中的属性了。 //JSONArray 转 List List<Station> list = JSONArray.parseArray(data.toJSONString(),DataInfo.class); 如此一来,我们就将这json字符串转为了我们写好的可操作的类对象List了。 但是我们虽然把这个数据进行处理了,但是我们想让他按照时间顺序排个序,不然这个无序的排列着实的让人不爽(强迫症患者= =)。 调用Collections.sort(List list, Comparator<? super T> c)方法 //重写 sort比较方法 Collections.sort(list, new Comparator<DataInfo>() { @Override public int compare(DataInfo o1, DataInfo o2) { return o2.

RocketMQ入门-RocketMQ批量消息

RocketMQ批量消息 批量发送消息能显著提高传递小消息的性能。限制是这些批量消息应该有相同的topic,相同的waitStoreMsgOK,而且不能是延时消息。此外,这一批消息的总大小不应超过4MB。 Producer 生产者发送消息调用的方法是:send(Collection<Message> msgs),与发送同步消息的区别是批量消息发送传入了一个消息的集合。 待发送的消息有如下的限制条件: 相同的topic相同的waitStoreMsgOK不能是延时消息消息列表总字节数不可大与4MB public class BatchProducer { public static void main(String[] args) throws Exception { // 1.关联生产者组 DefaultMQProducer defaultMQProducer = new DefaultMQProducer(MyRocketMqConstant.BatchLearn.BATCH_LEARN_PRODUCER_GROUP); // 2.关联注册中心 defaultMQProducer.setNamesrvAddr(MyRocketMqConstant.NAME_SRV); // 3.启动生产者 defaultMQProducer.start(); // 构造消息 List<Message> messages = buildMessages(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 4.发送消息 SendResult sendResult = defaultMQProducer.send(messages); System.out.println(String.format("SendResult status:%s,queueId:%d,body:%s" ,sendResult.getSendStatus() ,sendResult.getMessageQueue().getQueueId() ,"批量消息体....."+sdf.format(new Date()))); // 5.关闭生产者 defaultMQProducer.shutdown(); } public static List<Message> buildMessages() { List<Message> messages = new ArrayList<>(); for (int i = 0; i < 100; i++) { String str = "

图神经网络07-从零构建一个电影推荐系统

欢迎大家“Fork”,点击右上角的 “ Fork ”,可直接运行并查看代码效果 关注我的专栏 👉 数据挖掘与可视化教程方便第一时间获取更新的项目 【B站美食视频图鉴】干饭人干饭魂干饭都是人上人 ✔︎ 【【多伦多单车数据】车骑好,车停好,车锁好,车才好 ✔︎ 【中国移动手机用户统计】-为发烧而生 TODO 【⛹你是真的蔡】真真假假,假假真真,真亦假时假亦真! TODO 全球🌍COVID-19新冠疫苗接种数据分析 ✔︎ 【🅱️B站热点追溯】二次元世界的星辰大海 ✔︎ 🏬一饼吃透破产名单:哪些知名公司终究没能撑过疫情 ✔︎ 【🐶单身人士友好的“理想国”】透过探探的在线社交洞察 ✔︎ 【👱♀️七仙女系列】Pandas教程 ✔︎ 【📱移动5G套餐潜客识别】7步让你成为机器学习达人 ✔︎ 【🧠大脑还健康吗】脑中风疾病预测模型✔︎ 【🎬猜猜你喜欢看什么】从零构建一个电影推荐系统 推荐系统机器学习✔︎ 1 简介 这个项目的目标是为Netflix上的电影和电视节目开发一个基于内容的推荐引擎。我们将比较两种不同的方法: 使用演员、导演、国家、等级和类型作为特色。用电影/电视节目中的词语作为特征。 Image Name <figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">Image Name</figcaption> 2 导入工具包 <pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">!pip install nltk pytest -i https://pypi.

c++primer

c++ primer c++定义了几种基本内置类型(字符、整型、浮点数),也提供了自定义数据类型的机制;c++标准库定义了一些更加复杂的数据类型,如可变长字符串和向量。 第二章:变量和基本类型 2.1.基本内置类型 2.1.1算术类型 c++定义的基本数据类型包括算术类型(字符、整型数、布尔值、浮点数)和空类型。算术类型又分为两类:整型(int,字符,bool)和浮点型。 字符:c++提供了几种字符类型,基本的字符类型是char,一个char的空间应确保可以存放机器基本字符集中任意字符对于的数字值(就是说一个char的大小和一个机器字节一样)。wchar_t、char16_t、char32_t用于扩展字符集,wchar_t用于确保可以存放机器最大扩展字符中的任意一个字符,char16_t、char32_t为Unicode字符集服务。 整型:一个int(16位)至少和一个short(16位)一样大,一个long(32位)至少和一个int一样大,一个long long(64位)至少和一个long一样大。 1字节=8bit,字=4or8字节 浮点型:float:1个字(32bit),7个有效位 double:2个字(64bit),16个有效位 long double:3or4个字(96or128bit)被用于有特殊要求的硬件 带符号类型(正数、负数、0)和无符号类型(大于零的数):int、short、long、longlong都是带符号类型的,加上unsigned就可以得到无符号类型。 2.1.2类型转换 任意类型→bool:0→false,其它→true bool→任意类型:false→0,true→1 浮点数→整型:仅保留小数点前部分 整数→浮点型:小数部分记为0,若整数所占空间超过浮点型的容量,可导致精度损失。 给无符号类型一个超出它表示范围的值时,结果为对无符号类型表示数值总数取模后的余数。 赋给带符号类型一个产出其表示范围的值是,结果是未定义的。 无符号数与有符号数相加时,先将有符号数转成无符号数(直接给无符号数赋一个负值),再相加。 带符号类型和无符号类型不要混用。 2.1.3字面值常量 每个字面值常量都对应着一种数据类型,字面值常量的形式和值决定了它的数据类型。 整型和浮点型字面值:0开头代表八进制、0开头代表十进制、0x开头代表十六进制。整型字面值具体的数据类型由它的值和符号决定。默认十进制字面值的类型是带符号数而八进制和十六进制字面值可能带符号也可能是无符号的。 默认浮点型字面值是一个double 字符和字符串字面值: 'a'//字符字面值 "hello world"//字符串字面值 字符串字面值的类型实际上是由常量字符构成的数组,编译器在资格字符串的结尾处加上了一个空字符(’\0’),因此,字符串字面值的实际长度比它的内容多1. 转义序列:分为不可打印字符和含有特殊含义的字符。 \n 换行符 ,\t 横向制表符 ,等等 指定字面值的类型:通过给添加前缀和后缀可以改变整型、浮点型、字符型字面值的默认类型。字符和字符串字面值: 前缀:u(char16_t) ,U(char32_t),L(wchar_t),u8(char) 整型字面值: 后缀:u orU(unsigned),l orL(long),ll orLL(long long) 浮点型字面值: 后缀:f orF(float),l or L(long double) 布尔字面值:true,false 指针字面值:nullptr 2.2变量 变量提供一个具名的、可供程序操作的存储空间。数据类型决定着变量所占空间的大小和布局方式、给值能存储的值的范围,以及变量能参与的运算。 通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。(我们在使用对象这个词时,并不严格区分时类还是内置类型,也不区分是否命名或者只读) 2.2.1变量定义 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象当前的值擦除掉,用一个新值带替代。 列表初始化:利用花括号把一个或多个初始值放在一起的初始化形式。 默认初始化:若变量定义时并没有指定初值,则变量被默认初始化,此时变量被赋予了默认值。 定义于函数体内的内置类型对象如果没有被初始化,则其值违背定义。类的对象如果没有显式地初始化,则其值由类确定。建议初始化每一个内置数据类型。 2.2.2变量声明和定义的关系 c++支持分离式编译(程序分割为如干个文件,每个文件可被独立编译) 声明使得名字位程序所知,定义负责创建与名字关联的实体。 定义还申请了存储空间,也可能位变量夫一个初始值。

【洛谷算法1-7】【搜索DFS】习题解析

目录 [USACO1.5]八皇后 Checker Challenge 【经典】P1443 马的遍历 【经典bfs】P2392 kkksc03考前临时抱佛脚 【有意思】P1135 奇怪的电梯【经典】P2895 [USACO08FEB]Meteor Shower S 【有意思 / 秒】P1036 [NOIP2002 普及组] 选数 【经典 n中选k】P2036 [COCI2008-2009#2] PERKET 【经典】P1605 迷宫 【经典】P1101 单词方阵 【有意思】P2404 自然数的拆分问题 【有点意思 / 经典】P1596 [USACO10OCT]Lake Counting S 【经典】P1162 填涂颜色 【思维秒】P1032 [NOIP2002 提高组] 字串变换 【bfs 字符串】P1825 [USACO11OPEN]Corn Maze S 【有意思 传送门】 [USACO1.5]八皇后 Checker Challenge 【经典】 https://www.luogu.com.cn/problem/P1219 dfs经典的题目,题解不再赘述,记得需要剪枝,不然会超时。 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int a[16]; bool b[16]; int sum=0; int n; void dfs(int index) { for(int i=0;i<index;i++)//剪枝 { for(int j=i+1;j<index;j++) { if(abs(i-j)==abs(a[i]-a[j])) { return; } } } if(index==n) { sum++; if(sum<=3) { for(int i=0;i<n;i++) cout<<a[i]<<"