在消息通知这块,钉钉可谓是玩出了花,比如工作通知、群机器人通知,还有那万恶的Ding一下。钉钉的通知不仅花样多,而且大部分渠道都支持自定义,也即可以自定义设置发送时间、发送内容,并且还支持多种样式的消息如文本、卡片、Markdown等。
这篇文章我主要介绍一下常用的两类:钉钉群机器人通知和钉钉工作通知。
钉钉群机器人通知效果图
钉钉工作通知效果图
具体的区别和对比我就不写了,简单来说钉钉群机器人消息通知发的消息所有人都可以看到,钉钉工作通知只有选择到的人才可以看到,所以钉钉群机器人消息通知适合发公告通知所有人,钉钉工作通知适合发工作安排通知到具体人,不过具体怎么用还得看业务的需要。
自定义机器人接入
:http://open.dingtalk.com/document/robots/custom-robot-access
自定义机器人安全设置
:http://open.dingtalk.com/document/robots/customize-robot-security-settings
由于创建自定义机器人必须选择安全设置,这里注意不要乱输,如果明白安全设置是啥最好,如果不懂建议选择加签的方式,然后看一下说明文档,不然测试的时候有可能会发送不成功。
<!-- 使用旧版钉钉开放api -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
package com.example.dingtalkmsg.service;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.request.OapiRobotSendRequest.Links;
import com.dingtalk.api.response.OapiRobotSendResponse;
import org.apache.tomcat.util.codec.binary.Base64;
public class DingTalkRobotSendService {
public static void main(String[] args) throws Exception {
//安全设置加签
Long timestamp = System.currentTimeMillis();
String secret = "xxx ";
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
//构建消息发送Client
DingTalkClient client = new DefaultDingTalkClient(
"http://oapi.dingtalk"
+ ".com/robot/send?access_token=xxx"
+ "×tamp="
+ timestamp + "&sign=" + sign);
//创建发送请求体
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
//文本消息
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("测试文本消息");
request.setText(text);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("xxxxx"));
// isAtAll类型如果不为Boolean,请升级至最新SDK
//at.setIsAtAll(true);
//at.setAtUserIds(Arrays.asList("109929","32099"));
request.setMsgtype("link");
OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
link.setMessageUrl("http://www.dingtalk.com/");
link.setPicUrl("");
link.setTitle("时代的火车向前开");
link.setText("这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林");
request.setLink(link);
request.setMsgtype("markdown");
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
markdown.setTitle("杭州天气");
markdown.setText("#### 杭州天气 @156xxxx8827\n" +
"> 9度,西北风1级,空气良89,相对温度73%\n\n" +
"> \n" +
"> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n");
request.setMarkdown(markdown);
request.setMsgtype("feedCard");
OapiRobotSendRequest.Feedcard feedcard = new OapiRobotSendRequest.Feedcard();
OapiRobotSendRequest.Links links1 = new OapiRobotSendRequest.Links();
links1.setTitle("时代的火车向前开1");
links1.setMessageURL("http://www.dingtalk.com/");
links1.setPicURL("http://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png");
OapiRobotSendRequest.Links links2 = new OapiRobotSendRequest.Links();
links2.setTitle("时代的火车向前开2");
links2.setMessageURL("http://www.dingtalk.com/");
links2.setPicURL("http://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png");
List<Links> links = new ArrayList<>();
links.add(links1);
links.add(links2);
feedcard.setLinks(links);
request.setFeedCard(feedcard);
OapiRobotSendResponse response = client.execute(request);
System.out.println(response);
}
}
总体来说,钉钉机器人推送消息的开发没有那些弯弯绕绕的设置,基本上能看懂文档就可以开发出来,也不需要什么特殊的环境支持。
第三方企业应用开发
:http://open.dingtalk.com/document/isvapp/send-job-notification
我本来以为企业内应用和第三方企业应用一样,创建应用之后都有一个工作通知。创建应用后发现,确实都有一个,但是区别非常大。企业内应用通知就是机器人群消息,而第三方企业应用则是模板消息。
<!-- 使用旧版钉钉开放api -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
package com.example.dingtalkmsg.service;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiServiceGetCorpTokenRequest;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiServiceGetCorpTokenResponse;
public class DingTalkWorkNoticeSendService {
public static void main(String[] args) throws Exception {
//获取小程序的accessToken
DefaultDingTalkClient client1 = new DefaultDingTalkClient("http://oapi.dingtalk.com/service/get_corp_token");
OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest();
req.setAuthCorpid("dingxxxx");
//suiteTicket获取比较麻烦,后续我会单独写文章说明
OapiServiceGetCorpTokenResponse execute = client1.execute(req, "xxx", "xxx", "xxx");
//构建工作通知推送Client
DingTalkClient client2 = new DefaultDingTalkClient(
"http://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
request.setAgentId(836390886L);
request.setUseridList("user123");
request.setToAllUser(false);
//构建消息模板
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("text");
msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
msg.getText().setContent("test123");
request.setMsg(msg);
msg.setMsgtype("image");
msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
msg.setMsgtype("file");
msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
msg.setMsgtype("link");
msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
msg.getLink().setTitle("test");
msg.getLink().setText("test");
msg.getLink().setMessageUrl("test");
msg.getLink().setPicUrl("test");
request.setMsg(msg);
msg.setMsgtype("markdown");
msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
msg.getMarkdown().setText("##### text");
msg.getMarkdown().setTitle("### Title");
request.setMsg(msg);
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("head");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setContent("xxx");
msg.setMsgtype("oa");
request.setMsg(msg);
msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
msg.getActionCard().setTitle("xxx123411111");
msg.getActionCard().setMarkdown("### 测试123111");
msg.getActionCard().setSingleTitle("测试测试");
msg.getActionCard().setSingleUrl("http://www.dingtalk.com");
msg.setMsgtype("action_card");
request.setMsg(msg);
OapiMessageCorpconversationAsyncsendV2Response rsp = client2.execute(request, execute.getAccessToken());
System.out.println(rsp.getBody());
}
}
其实工作通知开发的难度也不高,但是由于这是个三方应用,所有三方应用的接口都需要一个accessToken。而这个accessToken也不是简单的拿ak/sk去获取就行了,钉钉那边还需要一个suiteTicket,这个suiteTicket才是开发的最大难点。
suiteTicket不是调用接口去获取的,而是钉钉主动推送过来的,所以我们还需要写一个回调接口供钉钉侧调用,这个回调接口会在后续文章中补充。
OwnCloud一款文件主机服务软件,就是我们平时使用的云存储,不过这是在自己主机的服务器上建立属于自己的私有云,OwnCloud 使用AGPLv3协议发布。本项目是基于PHP和SQLite,MySQL,Oracle或PostgreSQL数据库,所以它可以运行在所有的平台上,本教程将教大家如何在 CentOS7上安装OwnCloud7。初始设置 安装CentOS7默认最小配置然后安装目前所有的更新:yum-yupdate接下来,我们需要安装PHP,ApacheWeb服务器和MySQL服务器和PHP扩展:yuminstallhttpdphpphp-mysqlmariadb-servermariadbsqlitephp-domphp-mbstringphp-gdphp-pdowgetvim设置SELinux允许owncloud写数据:setsebool-Phttpd_unified1防火墙设置:firewall-cmd--permanent--zone=public--add-service=http firewall-cmd--permanent--zone=public--add-se
一、选中添加功能完成首先打开在线编辑器进入我们的项目:https://editor.ivx.cn/在上一节咱们已经完成了对应的准备工作,在这一节中,咱们只需要对其进行调用即可,调用前还需要处理这些数据:首先选中时,咱们需要对当前影院的影片ID值赋值,为其新增一个ID内容,这个ID内容必须从获取到的影院ID上进行追加,所以在此还需要新建一个影片ID列表: 随后当循环遍历的影院内容的id对其进行赋值: 接着把当前的影片ID增加到这个列表末尾: 当然,影片中也是相同的操作,所以处理出具部分的动作事件如下: 随后再调用上一节中所准备的服务内容:二、座位内容的准备工作在选中对列表进行的操作是添加,那么在取消选中内容时所作的操作必然是删除,那么删除的话在这里就需要对其进行删除,对数组中指定值进行删除直接选择删除动作即可。此时动作编写如下: 接着直接调用对应的服务即可: 因为添加的内容都是列表,数据操作部分不自在数据库中制作,所以直接使用相同服务即可。三、动态座位设置动态座位设置如下: 动态座位设置是指点击对应的位置将会显示为白色,该部分内容是为了较为动态的设置位置信息,例如在发布电影前设置
一、人工智能、机器学习、深度学习的关系 通过一张图像来解释人工智能、机器学习。深度学习三者关系。假设让机器模拟人脑,分辨羊,猪,牛三种动物: (1)人工智能就是为机器赋予人的智能,模拟人脑分辨过程; (2)机器学习通过手动特征提取图像特征、设计算法区别特征,最后进行分类,给数据让机器自己学习去进行分辨,但在手动特征提取过程中工程庞大,逻辑复杂非常耗时,依恋经验; (3)深度学习是一种高效的机器学习算法,将特征提取与算法融合到一起让机器学习进行分辨。 三者关系如下图所示: 如上图所示,深度学习和机器学习的区别在于特征提取和算法的过程,机器学习依靠人工提取,提取过程与算法是分开的;而深度学习特征提取与算法是在一起的,深度学习是机器学习领域的一个新的方向。 那么我们来定义一下深度学习: 深度:多层的人工神经网络结构,可以只有一层,也可以有很多层 学习:通过大量的数据进行学习,正向传播到最终到达输出层,通过误差的反向传播进行模型网络的不断修正。 二、深度学习入门2.1生物神经网络生物神经网络(BiologicalNeuralNetworks)一般指生物的大脑神经元,细胞,触点等组成的网络,
给大家分享一个使用SVG做背景的个性播放器,效果如下:当滚动鼠标时,爱心会放大,播放区域也会跟着放大。以下是代码实现,欢迎大家复制粘贴和收藏。<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <metahttp-equiv="X-UA-Compatible"content="ie=edge"> <title>使用SVG当背景做一个有个性的播放器</title> <style> *{ margin:0; padding:0; box-sizing:border-box; font-family:'微软雅黑',sans-serif; } b
Xamarin是一个.NET开源的平台,主要用于通过.NET构建IOS、Android以及WindowsApp。利用Xamarin我们可以管理不同平台APP的共享代码与基础平台代码的通信,并且Xamarin上开发的APP是在托管环境中运行的,也就是说它会帮助我们来管理内存分配、垃圾回收等事情。Xamarin可以让开发人员跨平台共享应用程序的代码,这样就可以使用一种编程语言开发所有平台的App。Tip:编译、部署IOS应用程序必须在MacOS种进行。 零、原理Xamarin可以在每个平台上创建本机UI,并在C#里编写跨平台的共享业务逻辑。1.添加功能 Xamarin除了包含目标平台的功能,还新增了如下功能:基础SDK全绑定:Xamarin包含了IOS、Android平台几乎整个基础平台SDK的绑定。这些绑定都是强类型,这说明可以很简单的导航和使用并提供可靠的编译时类型检查以及开发过程,此外还可以减少运行时错误以及提高程序质量。互操作性:Xamarin可以直接调用Object-C、Java、C以及C++所开发的库,并且可以使用声明性语法绑定本机的Object-C以及Java库。充分利用C#
本文阅读预计需要10分钟,主要技术点来如下,感兴趣请继续: 游戏服务器特征短连接游戏服务器架构长链接游戏服务器架构分区分服服务器架构MMOARPG服务器架构房间服务器架构1游戏服务器特征游戏服务器端,是一个会长期运行的程序,并且它还要服务于多个不定时,不定点的网络请求。所以这类软件的特点是要非常关注稳定性和性能。这类程序如果需要多个协作来提高承载能力,则还要关注部署和扩容的便利性;同时,还需要考虑如何实现某种程度容灾需求。由于多进程协同工作,也带来了开发的复杂度,这也是需要关注的问题。功能约束,是架构设计决定性因素。基于游戏领域的功能特征,对服务器端系统来说,有以下几个特殊的需求:对于游戏数据和玩家数据的存储对玩家数据进行数据广播和同步把一部分游戏逻辑在服务器上运算,做好验证,防止外挂。针对以上的需求特征,在服务器端,我们往往会关注对电脑内存和CPU的使用,以求在特定业务代码下,能尽量满足承载量和响应延迟的需求。最基本的做法就是“空间换时间”,用各种缓存的方式来以求得CPU和内存空间上的平衡。在CPU和内存之上,是另外一个约束因素:网卡。网络带宽直接限制了服务器的处
几句话道出map和hash_map的区别1.stlmapisanassociativearraywherekeysarestoredinsortedorderusingbalancedtrees.whilehash_mapisahashedassociatedcontainer,wherekeysarenotstoredinanorderedway.key,valuepairisstoredusingahashedfunction. 2.insertionandlookuptakesologntimeinmap,alsoperformancewoulddegradeasthekeysizeincreases.mainlybalanceoperationsonlargekeyrangeswouldkillperformance.whilelookupisveryefficiento(1)inhash_map. 3.mapisusefulwhereyouwanttostorekeysinsortedorder,hash_mapisusedwherekeysorder
在这一篇文章里我们将去学习在计算机视觉中边缘检测的知识,并且去使用OpenCV来实现Canny边缘检测算法。一:什么是边缘检测边缘检测是计算机视觉领域非常重要的一种图像特征提取方法,同样也是比较好用的特征提取方法。我们通过边缘检测就是为了找到图像中像素亮度发生剧烈变化像素点集合,通常这些集合表现出来往往是轮廓。如果我们可以将物体的轮廓表现出来,拓展一下思路,我们可以把物体的面积,形状等等特征表示出来。在现实情况中,我们得到的边缘往往会分为4大类情况:①:深度的不连续(物体处在不同的物平面上); ②:表面方向的不连续(如正方体的不同的两个面); ③:物体材料不同(这样会导致光的反射系数不同); ④:场景中光照不同(如被树萌投向的地面);二:边缘检测的方法边缘检测与上一篇文章中的图像金字塔其实有关联,因为边缘的提取本身就是一个滤波的过程,通过不同的算子来去提取不同的特征。每种算子都有他的特点,抛开现在神经网络方法不谈,传统的方法一般有三种:Sobel算子,Laplacian算子,Canny算子。1:Sobel算子在这篇文章中,比较详细的介绍了Sobel算子的原理。CV学习笔记(十三):图像
存储世界最近发生了很大变化。十年前,FibreChannelSAN文件管理器是企业存储的标准。而在目前的环境中,受到基础架构即服务云的影响,数据存储需要更加灵活。 GlusterFS和Ceph是两个灵活的存储系统,在云环境中表现非常出色。在尝试了解GlusterFS与Ceph之间的相似之处和不同之处之前,让我们来讨论在云环境中对灵活存储的一些要求。纵向扩展和横向扩展。在云环境中,必须可以很容易地向服务器添加更多存储空间以及扩展可用存储池。Ceph和GlusterFS都可以通过轻松将新存储设备集成到现有存储产品中来满足这一要求。高可用性。GlusterFS和Ceph的复制是同时将数据写入不同的存储节点。这样做的结果是,访问时间增加,数据可用性也提高。在Ceph中,默认情况下将数据复制到三个不同的节点,这确保备份始终可用。商品化硬件。GlusterFS和Ceph是在Linux操作系统之上开发的。因此,对硬件唯一的要求是这些产品具有能够运行Linux的硬件。任何商品化硬件都可以运行Linux操作系统,结果是使用这些技术的公司可以大大减少在硬件上的投资——如果他们这样做的话。然而,实际上,许多
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘、信息处理或存储历史数据等一系列的程序中。本文着重介绍Scrapy架构及其组件之间的交互。Scrapy组件介绍ScrapyEngine 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。详细内容查看下面的数据流(DataFlow)部分。调度器(Scheduler) 调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。下载器(Downloader)下载器负责获取页面数据并提供给引擎,而后提供给spider。Spiders Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。每个spider负责处理一个特定(或一些)网站。ItemPipeline ItemPipeline负责处理被spider提取出来的item。典型的处理有清理、验证及持久化(例如存取到数据库中)。下载器中间件(Downloadermiddlewares) 下载器中间件是在引擎及下载器之间的特定钩子(specifichook
CSS语法CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。selector{declaration1;declaration2;...declarationN}复制选择器通常是你需要改变样式的HTML元素。每条声明由一个属性和一个值组成。属性(property)是你希望设置的样式属性(styleattribute)。每个属性有一个值。属性和值被冒号分开。selector{property:value}复制下面这行代码的作用是将h1元素内的文字颜色定义为红色,同时将字体大小设置为14像素。在这个例子中,h1是选择器,color和font-size是属性,red和14px是值。h1{color:red;font-size:14px;}复制下面的示意图为你展示了上面这段代码的结构:提示:请使用花括号来包围声明。值的不同写法和单位除了英文单词red,我们还可以使用十六进制的颜色值#ff0000:p{color:#ff0000;}复制为了节约字节,我们可以使用CSS的缩写形式:p{color:#f00;}复制我们还可以通过两种方法使用RGB值:p{color:rgb(255,0,0)
1.接口描述接口请求域名:wedata.tencentcloudapi.com。 判断集成任务名称是否存在 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:CheckIntegrationTaskNameExists。 Version 是 String 公共参数,本接口取值:2021-08-20。 Region 是 String 公共参数,详见产品支持的地域列表。 TaskName 是 String 任务名称 ProjectId 是 String 项目ID TaskId 否 String 任务ID SyncType 否 Integer 同步类型1.单表同步,2.解决方案 3.输出参数 参数名称 类型 描述
复制过来的虚拟机,可以看到没有IP地址了,MAC也可能是被复制过来的。 [root@localhost~]#ifconfig-aens33:flags=4098<BROADCAST,MULTICAST>mtu1500ether00:0c:29:f1:8b:ebtxqueuelen1000(Ethernet)RXpackets0bytes0(0.0B)RXerrors0dropped0overruns0frame0TXpackets0bytes0(0.0B)TXerrors0dropped0overruns0carrier0collisions0 这台被复制的虚拟机上/etc/sysconfig/network-scripts/ifcfg-配置_1TYPE=EthernetBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME="配
本地开了 Shadowsocks,然后postman模拟的twitter的接口是请求成功的,然后用php-curl去请求网址,出现以下错误 Failedtoconnecttoapi.twitter.comport443:Timedout 复制 检查是curl没有使用代理,在里面加上如下2行 CURLOPT_USERAGENT=>'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/59.0.3071.104Safari/537.36', CURLOPT_PROXY=>'127.0.0.1', 复制
1、添加 依赖包: implementation'no.nordicsemi.android:dfu:1.11.0'复制 2、DfuService类继承 DfuBaseService packagecom.example.ycblesdkdemo.dfu; importandroid.app.Activity; importandroid.os.Bundle; importandroidx.annotation.Nullable; importandroidx.appcompat.app.AppCompatActivity; importno.nordicsemi.android.dfu.DfuBaseService; /** *@authorFinn_ZENGYUAN *Blog:https://www.cnblogs.com/finn21/ *@date:2021/9/2311:49 *@description: */ publicclassDfuServiceextendsDfuBaseService{ @Override pr
之前做过一个测试,详情见这篇文章《多线程+1操作的几种实现方式,及效率对比》,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1.单线程下synchronized效率最高(当时感觉它的效率应该是最差才对); 2.AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点,但是高并发下,性能还不如synchronized,不同情况下性能表现很不稳定; 3.LongAdder性能稳定,在各种并发情况下表现都不错,整体表现最好,短时间的低并发下比AtomicInteger性能差一点,长时间高并发下性能最高(可以让AtomicInteger下台了); 这篇文章我们就去揭秘,为什么会是这个测试结果! 理解锁的基础知识 如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。 基础知识之一:锁的类型 锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上
本文认为已有的SR方法存在着三个主要的问题: ①采用预定义的上采样操作(例如双三次插值)会产生不必要的计算代价,并且结果可能会有重建伪影。而使用反卷积层这样的操作来替换预定义的上采样操作,网络结构又比较简单,性能较差,不能很好地学习复杂的映射; ②使用l2型损失函数时,不可避免地会产生模糊的预测,恢复出的高分辨图片往往会过于平滑; ③大部分的方法都只有一次上采样的步骤,这就会使得对于更高倍数因子的训练变得困难。 为了解决上述问题,本文提出了LapSRN,网络以LR图片作为输入,以低分辨到高分辨的方式来预测子带残差。在网络的每一层,一系列的卷积层被用来提取特征映射。此后,一个反卷积层用来将特征映射上采样,然后传递到最后一层。最后用一个卷积层来预测子带残差(sub-bandresidual,指各层上采样的结果与ground-truth的差别)。网络结构如图所示: 在训练时,采用的是l1型的损失函数Charbonnier,并且在每一级网络进行一次计算,最终将每一级的损失函数和进行优化。 与之前讲过的VDSR类似的,LapSRN也采用了很深的网
仍然需要修改: 1#encoding:utf-8 2#用户交互显示类似省市县N级联动的选择 3#*允许用户增加内容 4#*允许用户查看某一个级别内容 5 6dic={ 7"江西":{ 8"萍乡":["安源","彭高","上栗"], 9"新余":["良山","新钢","兴安岭"], 10}, 11"北京":{ 12"大兴区":["礼贤镇","魏善庄镇","北臧村镇"], 13"昌平区":["沙河","化庄","白浮泉"], 14}, 15"福建":{ 16"莆田":["荔城","西天尾","九化山"], 17"厦门":["湖里","思明","海仓"], 18} 19} 20print("目前可查询的省份:江西、北京、福建") 21province=input("请输入省份或者输入N新建:") 22 23ifprovince=="N": 24new_province=input("请输入省份:") 25new_city=input("请输入城市:") 26new_town=input("请输入城镇信息:") 27dic[new_province]={new_city:[ne
Vc++内存布局 测试平台 Windowsserver2012R2andvisualstudio2013professional。 本篇文章意在介绍vc++中类的内存布局方式,只是研究其大概的排列方式,对于内存对齐方面则没有进行深入探讨。如有需要研究类的具体大小可以参考其他博客。 测试方式 在vs中,查看类的内存布局主要有两种方式。一种是实例化一个类,然后在debug状态下查看其数据成员。另外一种是在工程属性的c/c++的commandline中加入/d1reportSingleClassLayout[className],其中的[className]是你想查看内存布局的类的名字,经过build之后查看build的output,里面就有这个类的内存布局。其实也可以将所有包含的类的布局打印出来,命令是/d1reportAllClassLayout。但是这个命令打印出来的东西非常多,不好找。所以还是推荐用前面的查看单个类布局的命令来查看。下面是测试用代码。 #include<iostream> classCommonBase {