已订阅

微信小程序订阅消息开发指南(java)

第一步 准备阶段

1、你得有一个小程序并且认证了个人的也行

2、开通订阅消息

小程序后台->功能->订阅消息

image

3、公共模板库选择一个模板

选择的时候,选择你需要的字段,因为字段有限制

image

4、我的模板点击详情

详情内容,模板 id 都是需要提供个服务端开发人员的

image

第二步 编码阶段

小程序端

小程序消息订阅,需要用户确认

1、首先小程序授权登陆获取 code

官网示例:http://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

wx.login({
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'http://example.com/onLogin',
        data: {
          code: res.code
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})
// 结果 {errMsg: "login:ok", code: "0a3kK4Ga10Gk3F0oBAHa1mGyRl3kK4Gd"}

uni-App 示例:http://uniapp.dcloud.net.cn/api/plugins/login.html#login

uni.login({
    provider: 'weixin', //使用微信登录
    success: function (loginRes) {
        console.log(loginRes)
    }
});
// 结果 {errMsg: "login:ok", code: "0a3kK4Ga10Gk3F0oBAHa1mGyRl3kK4Gd"}

2、将 code 传给服务端 获取用户唯一标识 openId

3、通过代码起小程序消息订阅界面、用户点击确定ok,小程序工作结束

官方示例:http://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

tmplIds 填写模板 id 即可,最多三个

wx.requestSubscribeMessage({
  tmplIds: [''],
  success (res) {
      console.log(res)
  }
})

4、注意事项:

避免重复拉起用户订阅通知,可以通过微信提供的 getSetting 判断用户是否订阅了,如果没有就拉起。

注意下面是用uniapp写的,方法前缀是uni 如果你小程序代码记得修改 wx 以及提示组件

到此小程序工作结束

getSetting() {
    uni.getSetting({
        withSubscriptions: true, // 获取用户订阅状态
        success(res) {
            // false 表示用户未订阅改消息
            if (!res.subscriptionsSetting.mainSwitch) {
                this.subscribeMessage();
            } else {
                uni.showToast({
                    title: '已订阅',
                    icon: 'none'
                })
            }
        }
    })
},
subscribeMessage() {
    uni.requestSubscribeMessage({
        tmplIds: ['模板id'],
        success(res) {
            if (res.errMsg === 'requestSubscribeMessage:ok') {
                uni.showToast({
                    title: '订阅成功',
                    icon: 'none'
                })
            }
        }
    })
}    

服务端

微信小程序的 appidsecret 小程序后台->开发->开发管理->开发设置->开发者 ID

注意事项

  1. http 请求这里使用 apache 的工具类,你也可以使用别的
  2. 微信消息模板字段 thing 字段有长度限制20,超过会失败
  3. 以下演示代码,生产环境还需进行优化

1、通过 code 获取用户 open id 官网文档

 public String getOpenId(String code) throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();
        params.put("appid", Constants.APPLET_APP_ID);
        params.put("secret", Constants.APPLET_SECRET);
        params.put("js_code", code);
        params.put("grant_type", "authorization_code");

        String url = handleParams("http://api.weixin.qq.com/sns/jscode2session", params);
        HttpGet httpGet = new HttpGet(url);

        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity(); // 响应结果
        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
}

public static void main(String[] args) throws IOException {
        HttpUtils httpUtils = new HttpUtils();
        String token = httpUtils.getToken();
        System.out.println(token);
}


响应结果:

{"access_token":"67_u22CQaWq22222222Q4griDE6kiT5hwg7jVxedn8J9te17Az1oWGGxPgB22222229Y4Wm6h_Yzci7-FSDjeH8YG6DsCOYrQXJCWsPXhT6nWbKIWCXfABACID","expires_in":7200}

2、通过 appidsecret 获取 token 超时 7200 秒 可 redis 缓存 官方文档

public String getToken() throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();
        params.put("appid", Constants.APPLET_APP_ID);
        params.put("secret", Constants.APPLET_SECRET);
        params.put("grant_type", "client_credential");

        String url = handleParams("http://api.weixin.qq.com/cgi-bin/token", params);
        HttpGet httpGet = new HttpGet(url);

        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity(); // 响应结果

        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
}

3、指定用户推送消息结束 官方文档

public String pushMsg(String token) throws IOException {

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();

        // 处理微信推送数据结构
        JSONObject mapData = new JSONObject();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("value", "任务名称");
        mapData.put("thing2", map1);

        Map<String, Object> map2 = new HashMap<>();
        map2.put("value", "2022-04-03 10:00:00");
        mapData.put("time3", map2);

        Map<String, Object> map3 = new HashMap<>();
        map3.put("value", "描述信息");
        mapData.put("thing4", map3);

        Map<String, Object> map4 = new HashMap<>();
        map4.put("value", "备注信息");
        mapData.put("thing10", map4);

        Map<String, Object> map5 = new HashMap<>();
        map5.put("value", "任务来源");
        mapData.put("thing11", map5);

        params.put("template_id", "templateId");// 模板 id
        params.put("touser", "openId"); // open id
        params.put("data", mapData); // 数据
        params.put("page", "page"); // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
        params.put("miniprogram_state", "trial"); //developer为开发版;trial为体验版;formal为正式版;默认为正式版
        params.put("lang", "zh_CN"); //

        HttpPost httpPost = new HttpPost("http://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token);
        httpPost.addHeader("ContentTyp", "application/json");

        // 参数转 JSON 格式
        String json = objToStr(params);
        StringEntity stringEntity = new StringEntity(json, CharSetType.UTF8.getType());
        stringEntity.setContentEncoding(CharSetType.UTF8.getType());
        httpPost.setEntity(stringEntity);

        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity(); // 响应结果
        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
    }

4、完整代码

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.chenlijia1111.utils.core.enums.CharSetType;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jeecg.modules.video.utitls.Constants;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @description:
 * @author: Mr.Fang
 * @create: 2023-04-03 17:06
 **/

public class HttpUtils {

    /**
     * description: 获取token,返回结果为 JSON 自行转 map
     * create by: Mr.Fang
     *
     * @return: java.lang.String
     * @date: 2023/4/3 17:46
     */
    public String getToken() throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();
        params.put("appid", Constants.APPLET_APP_ID);
        params.put("secret", Constants.APPLET_SECRET);
        params.put("grant_type", "client_credential");

        String url = handleParams("http://api.weixin.qq.com/cgi-bin/token", params);
        HttpGet httpGet = new HttpGet(url);

        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity(); // 响应结果

        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
    }

    /**
     * description: 获取 open id,返回结果为 JSON 自行转 map
     * create by: Mr.Fang
     *
     * @param: [code]
     * @return: java.lang.String
     * @date: 2023/4/3 17:46
     */
    public String getOpenId(String code) throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();
        params.put("appid", Constants.APPLET_APP_ID);
        params.put("secret", Constants.APPLET_SECRET);
        params.put("js_code", code);
        params.put("grant_type", "authorization_code");

        String url = handleParams("http://api.weixin.qq.com/sns/jscode2session", params);
        HttpGet httpGet = new HttpGet(url);

        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity(); // 响应结果
        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
    }

    /**
     * description: 消息推送 返回结果为 JSON 自行转 map;token 调用 getToken获取
     * create by: Mr.Fang
     *
     * @param: [token]
     * @return: java.lang.String
     * @date: 2023/4/3 17:46
     */
    public String pushMsg(String token) throws IOException {

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        Map<String, Object> params = new HashMap<>();

        // 处理微信推送数据结构
        JSONObject mapData = new JSONObject();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("value", "任务名称");
        mapData.put("thing2", map1);

        Map<String, Object> map2 = new HashMap<>();
        map2.put("value", "2023-04-03 12:00:00");
        mapData.put("time3", map2);

        Map<String, Object> map3 = new HashMap<>();
        map3.put("value", "描述信息");
        mapData.put("thing4", map3);

        Map<String, Object> map4 = new HashMap<>();
        map4.put("value", "备注系信息");
        mapData.put("thing10", map4);

        Map<String, Object> map5 = new HashMap<>();
        map5.put("value", "抖音");
        mapData.put("thing11", map5);

        params.put("template_id", "templateId");// 模板 id
        params.put("touser", "openId"); // open id
        params.put("data", mapData); // 数据
        params.put("page", "page"); // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
        params.put("miniprogram_state", "trial"); //developer为开发版;trial为体验版;formal为正式版;默认为正式版
        params.put("lang", "zh_CN"); //

        HttpPost httpPost = new HttpPost("http://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token);
        httpPost.addHeader("ContentTyp", "application/json");

        // 参数转 JSON 格式
        String json = objToStr(params);
        StringEntity stringEntity = new StringEntity(json, CharSetType.UTF8.getType());
        stringEntity.setContentEncoding(CharSetType.UTF8.getType());
        httpPost.setEntity(stringEntity);

        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity(); // 响应结果
        return EntityUtils.toString(entity, CharSetType.UTF8.getType());
    }


    /**
     * description: 对象转 字符串
     * create by: Mr.Fang
     *
     * @param: [obj]
     * @return: java.lang.String
     * @date: 2023/4/3 17:45
     */
    public static String objToStr(Object obj) {

        ObjectMapper objectMapper = new ObjectMapper();
        if (Objects.nonNull(obj)) {
            try {
                String jsonStr = objectMapper.writeValueAsString(obj);
                return jsonStr;
            } catch (JsonProcessingException var2) {
                var2.printStackTrace();
            }
        }

        return null;
    }

    /**
     * description: map 转 URL 地址拼接
     * create by: Mr.Fang
     *
     * @param: [url, params]
     * @return: java.lang.String
     * @date: 2023/4/3 17:45
     */
    public String handleParams(String url, Map<String, Object> params) {
        if (params.size() != 0) {
            Set<Map.Entry<String, Object>> entries = params.entrySet();
            String paramsString = entries.stream().map((e) -> {
                try {
                    StringBuilder sb = new StringBuilder();
                    sb.append(URLEncoder.encode(e.getKey(), CharSetType.UTF8.getType()));
                    sb.append("=");
                    if (Objects.nonNull(e.getValue())) {
                        sb.append(URLEncoder.encode(e.getValue().toString(), CharSetType.UTF8.getType()));
                    }

                    return sb.toString();
                } catch (UnsupportedEncodingException var2) {
                    var2.printStackTrace();
                    return null;
                }
            }).collect(Collectors.joining("&"));
            return url + "?" + paramsString;
        }
        return url;
    }


}

本文来自博客园,作者:天葬,转载请注明原文链接:http://www.cnblogs.com/bxmm/p/17283908.html

本文转载于网络 如有侵权请联系删除

相关文章

  • 使用 expect 重启失败的 git pull/push 操作

    问题的提出最近使用github上传、下载项目代码时,经常会卡很久,有时候在命令行打了gitpush然后就去上厕所了,结果等我回来的时候,发现push早已经失败了,还得重新提交一下。如果有一个工具,可以不停的重启失败的gitpush直到它成功才退出,那就好了。什么是expect在介绍使用expect重启git操作之前,先简单说明一下这个命令。其实它并不是一个新潮的东西,在很早以前就存在了,以至于现在一些系统默认都不带这个命令了,需要自己手工安装下:$sudoyuminstallexpect $expect-v expectversion5.44.1.15复制简单的说,expect就是完成一些需要与用户交互的任务,例如telnet、ftp、ssh远程登录机器的时候,这些命令会要求用户输入用户名、密码等相关信息,而这些,是无法通过shell脚本来完成的。这是因为这些命令是从控制终端而不是标准输入上读取的,所以无法事先将信息重定向到标准输入从而实现自动化运行。而expect就是用来解决这类问题的,下面是一个使用expect进行ssh登录的例子:1#!/usr/bin/expect-f 2set

  • ​一文看懂 Pandas 中的透视表

    一文看懂Pandas中的透视表透视表在一种功能很强大的图表,用户可以从中读取到很多的信息。利用excel可以生成简单的透视表。本文中讲解的是如何在pandas中的制作透视表。读取数据注:本文的原始数据文件,可以在早起Python后台回复“透视表”获取。复制importpandasaspd importnumpyasnp df=pd.read_excel("./sales-funnel.xlsx")#当前目录下的文件 df.head() 设置数据使用category数据类型,按照想要查看的方式设置顺序不严格要求,但是设置了顺序有助于分析,一直保持所想要的顺序复制df["Status"]=df["Status"].astype("category") df["Status"].cat.set_categories(["won","pending","presented","declined"],inplace

  • tf.matmul()和tf.multipy()的区别

    首先我们分析一下下面的代码:importtensorflowastf importnumpyasnp a=tf.constant([[1.,2.,3.],[4.,5.,6.]]) b=np.float32(np.random.randn(3,2)) #c=tf.matmul(a,b) c=tf.multiply(a,b) init=tf.global_variables_initializer() withtf.Session()assess: print(c.eval())复制问题是上面的代码编译正确吗?编译一下就知道,错误信息如下:ValueError:Dimensionsmustbeequal,butare2and3for'Mul'(op:'Mul')withinputshapes:[2,3],[3,2].显然,tf.multiply()表示点积,因此维度要一样。而tf.matmul()表示普通的矩阵乘法。而且tf.multiply(a,b)和tf.matmul(a,b)都要求a和b的类型必须一致。但是之间存在着细微的区别。在tf中所有返

  • 影响堪比登月!谷歌等探索深度学习新理论蓝图,让神经网络更深更窄

    转载来源公众号:新智元来源:quantamagazine作者:KevinHartnett编辑:肖琴“阅读本文大概需要6分钟。”一个关于计算机如何学习的新理论的蓝图正在形成,其影响甚至比登月更大!研究人员正试图解释神经网络工作原理,并保证如果以规定的方式构建一个神经网络,它就能够执行特定的任务。深度学习需要更多的理论!这是学术界的一个共识。神经网络十分强大,但往往不可预测。现在,谷歌大脑、FAIR、德州农工大学等的数学家们试图深究神经网络的理论基础,开始揭示神经网络的形式如何影响其功能。我们对神经网络几乎一无所知设计一座摩天大楼时,我们会要求它符合规范:塔台要能支撑一定程度的重量,并且要能承受一定强度的地震。 但是,对于现代世界最重要的技术之一,我们实际上是在盲目地建造。我们使用各种不同的设计,使用不同的设置进行修补,但在将它拿出来进行测试运行之前,我们并不真正知道它能做什么,也不知道它会在哪个地方失败。这项技术就是神经网络,它是当今最先进的人工智能系统的基础。神经网络正越来越多地进入社会的核心领域:它们通过社交媒体的信息流决定了我们对世界的了解,它们帮助医生诊断疾病,它们甚至影响一个被

  • Kafka 简介

    Kafka是分布式流平台。一个流平台有3个主要特征:发布和订阅消息流,这一点与传统的消息队列相似。以容灾持久化方式的消息流存储。在消息流发生时处理消息流。Kafka通常使用在两大类应用中:在系统或应用之间,构建实时、可靠的消息流管道。构建实时流应用程序,用于转换或响应数据流Kafka的几个基本概念:Kafka可以作为一个集群运行在跨越多个数据中心的多个服务上。Kafka集群按照分类存储的消息流叫做topic。每一个消息由一个主键、一个值、和一个时间戳组成。Kafka有4个核心的API:ProducerAPI允许应用向一个或多个topic发送信息流。ConsumerAPI允许应用订阅一个或多个topic并处理产生的信息流。StreamsAPI允许应用扮演一个流处理器,从一个或多个topic消费输入流,并向一个或多个topic生产输出流。 实际上是转换输入流到输出流。ConnectorAPI构建和运行连接Kafka的可复用的生产者或消费者,到已存在的应用或数据系统。例如:连接一个关系型数据库捕获表中的每一次变化。在Kafka中,客户端和服务器之间的通信是通过一种简单的,高性能的,语言不可知

  • 搞趣网:月流水破1500万产品出现,H5游戏或将迎

    2014年,Html5小游戏《看你有多色》上线2日用户数达3000万,《围住神经猫》创造了3天500万用户,1亿访问的奇迹,这都让人感受到H5技术的力量与魅力。今年初,沉寂了一段时间的H5游戏又传出了2016年的第一个重磅消息:蝴蝶互动宣布旗下《传奇世界H5》月流水突破1500万元!据蝴蝶互动CEO凌海介绍,《传奇世界H5》游戏的成功,除了游戏本身的素质,传奇IP的影响力也非常重要。“之前蝴蝶互动做H5游戏发行,发了半年不挣钱,即使流量不错也不挣钱,我意识到是游戏不够好,于是我决定自己来做。”凌海说:“我做游戏肯定做有IP的,我在行业呆得久,知道IP的力量。”这同时也表明,当前的H5游戏,经历了2014、2015的探索期后,正在走向成熟。未来的游戏,除了开发成本低的益智休闲游戏外,也将向大制作,强IP的方向靠拢。对于当前的手机游戏,H5游戏有着先天的优势。目前的手机游戏存在硬伤,主要有:1.安卓与iOS无法互通。苹果手机和安卓手机的玩家无法在同一服务器进行游戏。这一直都是最郁闷的地方,难道为了和朋友一起玩游戏,还得再备一台手机?2.不能和电脑端互通,明明身边有电脑,不能把手机游戏切换到

  • 腾讯云人脸核身身份信息及有效期核验api接口

    1.接口描述接口请求域名:faceid.tencentcloudapi.com。 本接口用于校验姓名、身份证号、身份证有效期的真实性和一致性。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:CheckIdNameDate。 Version 是 String 公共参数,本接口取值:2018-03-01。 Region 否 String 公共参数,本接口不需要传递此参数。 Name 是 String 姓名 IdCard 是 String 身份证号 ValidityBegin 是 String 身份证有效期开始时间,格式:YYYYMMDD。如:20210701 ValidityEnd 是 String 身份证有效期到期时间

  • 推荐系统推理优化

        推荐系统推理优化 推荐系统(RecSys)-“沉默的大多数” 互联网企业 算力提供商 RecSys黑盒 输入-输出 KPI RecSys算法模型 RecSys算法分类 DNNRecSys模型范式 典型DNNRecSys模型 WDL DIN DIEN DLRM DNNRecSys模型特征 SmallTensor+BigModel TensorOperationsmatter WorkloadHeterogeneity RecSysworkload性能优化 Overview 模型优化 优化Principles TensorOperationSub-graph 主要优化方法 涉及的优化principles CaseStudies FC&AttentionSub-graph Sub-graphfusion MatMul+BiasAdd+Activation Multi-HeadAttention Operatoroptimization IncreaseComputationIntensity In

  • CI框架源码阅读笔记9 CI的自动加载机制autoload

    本篇并不是对某一组件的详细源码分析,而只是简单的跟踪了下CI的autoload的基本流程。因此,可以看做是Loader组件的分析前篇。 CI框架中,允许你配置autoload数组,这样,在你的应用程序初始化时,会自动加载相应的类库,例如,在application/config/autoload.php中,autoload的配置如下: $autoload['libraries']=array("smarty","redis");复制 则CI框架初始化时,会自动加载libraries下面的smarty.php和redis.php,并且在你的应用程序控制器中,可以通过$this->smarty->xxx 和$this->redis->yyy的方式调用你的类库。 CI允许autoload中配置的自动加载的类别有: 1.Packages---包 2.Libraries--类库 3.Helperfiles---用户自定义的辅助文件 4.Customconfigfiles---用户自定义配置文件 5.Languagefiles---语言包 6.Models--

  • gym 102331 F. Fast Spanning Tree

    https://codeforces.com/gym/102331/problem/F 学到许多 首先有个显然的性质,假设一条边两边的权值和分别是\(x,y\),这条边的要求是\(S\) 由\(x+y\geS\)可以得到 \(x\ge\frac{S}{2}\\or\\y\ge\frac{S}{2}\) 我们把这条边的限制(上界)平均分别丢到\(x,y\)上,拿一个小根堆维护 \(x+\frac{s-x-y}{2}\) 当启发式合并两个联通块\(u,v(siz[u]<siz[v])\)时 \(a[v]+=a[u]\),把\(u\)的小根堆合并进去 然后查看堆顶,如果\(a[v]\ge\)堆顶的限制,那么说明\(v\)已经达到堆顶那条边的限制之一了,假设堆顶那条边是\((x,y,s)\),那么只需要判断如果\(a[x]+a[y]\ges\)就加入答案,否则把剩下的\(s-a[x]-a[y]\)再平均分配到\(x,y\)两个点上面的堆里,作为新的限制。 即新的上界限制是\(a[x]+\frac{s-a[x]-a[y]}{2}\),\(y\)同理 启发式合并的时间复杂度是\(O(nlog

  • 王家林的81门一站式云计算分布式大数据&amp;移动互联网解决方案课程第三门课程:云计算分布式大数据Hadoop征服之旅:HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;集群管理

    一:课程简介: 作为云计算实现规范和实施标准的Hadoop恰逢其时的应运而生,使用Hadoop用户可以在不了解分布式底层细节的情况下开发出分布式程序,从而可以使用众多廉价的计算设备的集群的威力来高速的运算和存储,而且Hadoop的运算和存储是可靠的、高效,的、可伸缩的,能够使用普通的社区服务器出来PB级别的数据,是分布式大数据处理的存储的理想选择。 本课程会助你深入浅出的掌握Hadoop开发(包括HDFS、MapReduce、HBase、Hive等),并且在此基础上掌握Hadoop集群的配置、维护、管理、监控、运维、测试、优化等主题,理论结合实际案例;助你轻松驾驭Hadoop以满足大数据的分布式处理与存储。 二:课程特色 1,     一次性贯通Hadoop开发和集群管理; 2,     掌握Hadoop四大焦点:MapReduce、HDFS、HBase、Hive 3,     涵盖Hadoop集群的配置、维护、管理、监控、运维、测试、优

  • Linux设置仅秘钥登录

    需求 Linux服务器设置仅秘钥登录,禁止密码登录。这个小破站都被黑了,密码被强制破解后登录,蚌埠住了。主要是想的自己小博客也没啥机密信息,不会真有人无聊到来黑吧,不会吧不会吧,结果还真有。头晚上发现被破解了也就去改了下root密码,就不想管了,结果第二天中午异地登录了,绷不住了,估计昨晚登录了后还留了其他超级权限账号,还是得想想办法。以下是我的处理方式linuxw命令先w下看是不是正在登录,结果一查,还真有个广州的登录还在线,记录下该登录的IP。腾讯云控制台-安全组马上去腾讯云控制台将服务器关闭,在安全组中将上面查询出异地登录的IP设为拒绝登录。腾讯云控制台-SSH秘钥控制台中创建秘钥并绑定自己的实例服务器。在Xshell中测试下使用秘钥登录测试可以登录成功。服务器设置禁止密码登录cd/etc/ssh目录下vi修改sshd_config文件配置内容,以下内容有的话就放开注释,没有就自行添加  RSAAuthenticationyes#开启RSA验证   PubkeyAuthenticationyes#是否使用公钥验证   AuthorizedKeysFile.ssh/authoriz

  • BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路   可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\)。那么第一问就是一个简单的数位\(dp\),第二问考虑递推按位做,设\(f(i)\)表示最后一位为\(0\)的答案,\(g(i)\)表示最后一位为\(1\)的答案,那么\(f(i)=g(i-1)+f(i-1)\),\(g(i)=f(i-1)\),整理一下发现\(f(i)=f(i-1)+f(i-2)\),就是斐波那契的形式,直接矩乘即可。 代码 #include<bits/stdc++.h> usingnamespacestd; constintN=70; constintMOD=1e9+7; typedeflonglongLL; inta[N],len; LLf[N][2][2],n; boolvis[N][2][2]; LLDFS(intx,intlst,intlim){ if(vis[x][lst][lim])returnf[x][lst][lim]; vis[x][lst][lim]=1; if(!x)re

  • 风险管理

    风险管理 风险管理是指如何在项目或者企业一个肯定有风险的环境里把风险可能造成的不良影响减至最低的管理过程。 风险管理当中包括了对风险的量度、评估和应变策略。理想的风险管理,是一连串排好优先次序的过程,使当中的可以引致最大损失及最可能发生的事情优先处理、而相对风险较低的事情则押后处理。 风险管理亦要面对有效资源运用的难题。这牵涉到机会成本(opportunitycost)的因素。把资源用于风险管理,可能使能运用于有回报活动的资源减低;而理想的风险管理,正希望能够花最少的资源去去尽可能化解最大的危机。 再次,风险管理要学会规避风险。在既定目标不变的情况下,改变方案的实施路径,从根本上消除特定的风险因素。例如设立现代激励机制、培训方案、做好人才备份工作等等,可以降低知识员工流失的风险。 意义: 有效地对各种风险进行管理有利于企业作出正确的决策、有利于保护企业资产的安全和完整、有利于实现企业的经营活动目标,对企业来说具有重要的意义。 概念: 风险管理是社会组织或者个人用以降低风险的消极结果的决策过程,通过风险评价,并在此基础上选择与优化组合各种风险管理技术,对风险实施有效控制和妥善处理风险所致

  • 软件质量属性-可测试性

    软件质量属性-可测试性 王建宁  (石家庄铁道大学,河北省石家庄市,050043) 摘 要:随着软件规模的扩大,软件的可测试性在软件质量属性中的位置越来越突出。本文简要阐述了软件可测试性的特征,引入MVC框架来描述可测试性的具体作用和意义,最后提出了提高软件的可测试性的几种方法。 关键词:可测试性,MVC框架 Softwarequalityattributes-testability WangJianNing (ShiJiaZhuangTieDaoUniversity,Shijiazhuang,Hebeiprovince,050043,China) Abstract:Withtheexpansionofsoftwarescale,thetestabilityofsoftwareismoreandmoreprominentinthesoftwarequalityattribute.Thispaperbrieflydescribesthecharacteristicsofsoftwaretestability,introducesMVCframeworktodescri

  • css定位中的百分比

    ----转载自自己在牛人部落中的相关文章--- 在前端css定位中经常面对的一个问题是,百分比定位究竟是针对于谁定位? 一、margin,padding的百分比 首先从css的设计意图说起,在浏览器默认的 writing-mode:horizontal-tb; 和 direction:ltr; 的情况下,因为CSS的基础需求是排版,而通常我们所见的横排文字,其水平宽度一定(仔细回想一下,如果没有显式的定义宽度或者强制一行显示,都会遇到边界换行,而不是水平延展),垂直方向可以无限延展。这也是为什么: 1. margin:auto; 无法在纵向上垂直居中,其实原因也是上面所说的,因为纵向是可以无限延展的,所以没有一个一定的值可以被参照被用来计算。 2.margin(包括margin-top,margin-bottom,margin-left,margin-right):使用百分比时都是相对于父元素的宽度定位; 3.padding(包括padding-top,padding-left,padding-bottom,padding-r

  • shell编程--遍历目录下的文件

    假定目录text下有如下文件   目录:dir_1、dir_2、dir_3    文件:text_1、text_2 遍历目录下所有的文件是目录还是文件 if--if类型: #!bin/sh forfilein./* do     iftest-f$file     then         echo$file是文件     fi     iftest-d$file     then         echo$file是目录     fi done if--else类型:

  • js-day02-BOM和DOM

    BOM和Document对象常见属性和方法: BOM是browserobjectmodel的缩写,简称浏览器对象模型.   Document对象每个载入浏览器的HTML文档都会成为Document对象。Document对象使我们可以从脚本中对HTML页面中的所有元素进行访问。 Document对象常见属性和方法:wondow.onload事件:当页面加载完成做一些事情 window.onload=function(){ //处理文档加载完之后的操作. };复制 -----------------------------------------------links    链接对象anchors   锚对象forms    表单对象images   图片对象------------------------------------------------document对象:能反映当前页面的各种属性。document对象的常用属性  title:显示文章的标题。  body:获取body元素节点。  bgColor:显示页面的背景色。  fg

  • sql server实现Mysql中的limit分页功能

    没有使用ORM框架前,一直使用原生sql分页,突然想起来,便随手一记吧。。   首先,在mysql中有一种常见的分页方式 LIMIT总是设定为pageSize; OFFSET计算公式为pageSize*(pageIndex-1)。 SELECTid,name,gender,score FROMstudents ORDERBYscoreDESC LIMIT3OFFSET0;复制 但是在sqlserver中没有limit关键词,相对应的是TOP关键字,所以可以使用以下方法查询 方法一:在这里查询的是根据userID排序的第7,8,9条 SELECT* FROMdbo.t_user WHEREuserIDIN(SELECTTOP3 userID FROMt_user WHEREuserIDNOTIN(SELECTTOP6 userID FROMt_user))复制   方法二:其中的PageSize(分页的大小)和PageIndex(分页索引,初始假设为1)均为变量 SELECT* FROM(SELECTTOPPageSize * FROM(SELECTTO

  • Python数据库连接池DBUtils

    DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式:    DBUtils提供两种外部接口:   PersistentDB:提供线程专用的数据库连接,并自动管理连接。   PooledDB:提供线程间可共享的数据库连接,并自动管理连接。   模式一 为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭 fromDBUtils.PersistentDBimportPersistentDB importpymysql POOL=PersistentDB( creator=pymysql,#使用链接数据库的模块 maxusage=None,#一个链接最多被重复使用的次数,None表示无限制 setsession=[],#开始会话前执行的命令列表。 ping=0, #pingMySQL服务端,检查是否服务可用。 closeable=False, #如果为False时,con

  • 配置同一台服务器中的所有容器为同一个网段,可以互ping互通

       1)创建一个自定义的网桥(网络桥接模式):Baiinfo    docker network create --driver bridge Baiinfo       dockernetworkls #查看docker的网络配置,确认一下创建成功     docker networkrmBaiinfo    2)编辑docker-compose.yml文件,手动指定容器启动时的默认网桥      services: ##services字段下指定networks名称       networks:       

相关推荐

推荐阅读