背景

因为在项目中需要使用阿里云的视频点播服务,需要获取视频点播的时长信息。

工具类

生成签名串Signature
SignatureUtils.java


package com.meeno.wzq.alibaba.signature;import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import lombok.extern.java.Log;
import sun.misc.BASE64Encoder;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.*;/*** @description: 生成签名串Signature* @author: Wzq* @create: 2020-01-14 17:38*/
@Log
public class SignatureUtils {/*对所有参数名称和参数值做URL编码*/public static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) {List<String> encodeParams = new ArrayList<String>();if (publicParams != null) {for (String key : publicParams.keySet()) {String value = publicParams.get(key);//将参数和值都urlEncode一下。String encodeKey = percentEncode(key);String encodeVal = percentEncode(value);encodeParams.add(encodeKey + "=" + encodeVal);}}if (privateParams != null) {for (String key : privateParams.keySet()) {String value = privateParams.get(key);//将参数和值都urlEncode一下。String encodeKey = percentEncode(key);String encodeVal = percentEncode(value);encodeParams.add(encodeKey + "=" + encodeVal);}}return encodeParams;}/*获取 CanonicalizedQueryString*/public static String getCQS(List<String> allParams) {ParamsComparator paramsComparator = new ParamsComparator();Collections.sort(allParams, paramsComparator);String cqString = "";for (int i = 0; i < allParams.size(); i++) {cqString += allParams.get(i);if (i != allParams.size() - 1) {cqString += "&";}}return cqString;}/*字符串参数比较器,按字母序升序*/public static class ParamsComparator implements Comparator<String> {@Overridepublic int compare(String lhs, String rhs) {return lhs.compareTo(rhs);}}public static byte[] hmacSHA1Signature(String accessKeySecret, String stringToSign) {try {String key = accessKeySecret + "&";try {SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");Mac mac = Mac.getInstance("HmacSHA1");mac.init(signKey);return mac.doFinal(stringToSign.getBytes());} catch (Exception e) {throw new SignatureException("Failed to generate HMAC : " + e.getMessage());}} catch (SignatureException e) {e.printStackTrace();}return null;}public static String newStringByBase64(byte[] bytes)throws UnsupportedEncodingException {if (bytes == null || bytes.length == 0) {return null;}return new String(new BASE64Encoder().encode(bytes));}/*特殊字符替换为转义字符*/public static String percentEncode(String value) {try {String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8");String plusReplaced = urlEncodeOrignStr.replace("+", "%20");String starReplaced = plusReplaced.replace("*", "%2A");String waveReplaced = starReplaced.replace("%7E", "~");return waveReplaced;} catch (UnsupportedEncodingException e) {e.printStackTrace();}return value;}/*生成当前UTC时间戳Time*/public static String generateTimestamp() {Date date = new Date(System.currentTimeMillis());SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");df.setTimeZone(new SimpleTimeZone(0, "GMT"));return df.format(date);}/*生成随机数SignatureNonce*/public static String generateRandom() {String signatureNonce = UUID.randomUUID().toString();return signatureNonce;}}

httpUtils.java
请求工具类

package com.meeno.framework.util;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.meeno.encryptionmodule.testPaper.service.TestpaperServiceImpl;
import com.meeno.wzq.config.PlatformServerConfig;
import com.meeno.wzq.constants.EncryptionConstants;
import com.meeno.wzq.constants.PlatformUrlEnum;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HttpContext;import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.*;/*** @Auther: Wzq* @Date: 2019/4/2 11:20* @Description: 得不到的永远在骚动,被偏爱的都有恃无恐。 -- HttpUtils*/
public class HttpUtils {private final static PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager();  //连接池管理器private final static HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {  //retry handlerpublic boolean retryRequest(IOException exception,int executionCount, HttpContext context) {if (executionCount >= 5) {return false;}if (exception instanceof NoHttpResponseException) {return true;}if (exception instanceof InterruptedIOException) {return false;}if (exception instanceof UnknownHostException) {return false;}if (exception instanceof ConnectTimeoutException) {return false;}HttpClientContext clientContext = HttpClientContext.adapt(context);HttpRequest request = clientContext.getRequest();if (!(request instanceof HttpEntityEnclosingRequest)) {return true;}return false;}};static {   //类加载的时候 设置最大连接数 和 每个路由的最大连接数poolConnManager.setMaxTotal(200000);poolConnManager.setDefaultMaxPerRoute(100000);}/*** ########################### core code#######################* @return*/private static CloseableHttpClient getCloseableHttpClient() {CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(poolConnManager).setRetryHandler(httpRequestRetryHandler).build();return httpClient;}/*** 封装HTTP GET方法* 有参数的Get请求* @param* @param* @return* @throws ClientProtocolException* @throws java.io.IOException*/public static String getAjax(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {HttpClient httpClient = getCloseableHttpClient();HttpGet httpGet = new HttpGet();List<NameValuePair> formparams = setHttpParams(paramMap);String param = URLEncodedUtils.format(formparams, "UTF-8");httpGet.setURI(URI.create(url + "?" + param));HttpResponse response = httpClient.execute(httpGet);String httpEntityContent = getHttpEntityContent(response);httpGet.abort();return httpEntityContent;}/*** 封装HTTP GET方法* 有参数的Get请求* @param* @param* @return* @throws ClientProtocolException* @throws java.io.IOException*/public static String get(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {paramMap = getParamsData(paramMap);HttpClient httpClient = getCloseableHttpClient();HttpGet httpGet = new HttpGet();List<NameValuePair> formparams = setHttpParams(paramMap);String param = URLEncodedUtils.format(formparams, "UTF-8");httpGet.setURI(URI.create(url + "?" + param));HttpResponse response = httpClient.execute(httpGet);String httpEntityContent = getHttpEntityContent(response);httpGet.abort();return httpEntityContent;}/*** 封装HTTP GET方法* 无参数的Get请求* @param* @return* @throws ClientProtocolException* @throws java.io.IOException*/public static String get(String url) throws ClientProtocolException, IOException {//首先需要先创建一个DefaultHttpClient的实例HttpClient httpClient = new DefaultHttpClient();//先创建一个HttpGet对象,传入目标的网络地址,然后调用HttpClient的execute()方法即可:HttpGet httpGet = new HttpGet();httpGet.setURI(URI.create(url));HttpResponse response = httpClient.execute(httpGet);String httpEntityContent = getHttpEntityContent(response);httpGet.abort();return httpEntityContent;}/*** 获得响应HTTP实体内容* @param response* @return* @throws java.io.IOException* @throws java.io.UnsupportedEncodingException*/private static String getHttpEntityContent(HttpResponse response) throws IOException, UnsupportedEncodingException {//通过HttpResponse 的getEntity()方法获取返回信息HttpEntity entity = response.getEntity();if (entity != null) {InputStream is = entity.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));String line = br.readLine();StringBuilder sb = new StringBuilder();while (line != null) {sb.append(line + "\n");line = br.readLine();}br.close();is.close();return sb.toString();}return "";}/*** 封装支付HTTP POST方法* @param* @param* @return* @throws ClientProtocolException* @throws java.io.IOException*/public static String postPayMsg(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {HttpClient httpClient = new DefaultHttpClient();httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);HttpPost httpPost = new HttpPost(url);paramMap = getParamsData(paramMap);List<NameValuePair> formparams = setHttpParams(paramMap);UrlEncodedFormEntity param = new UrlEncodedFormEntity(formparams, "UTF-8");//通过setEntity()设置参数给posthttpPost.setEntity(param);//利用httpClient的execute()方法发送请求并且获取返回参数HttpResponse response = httpClient.execute(httpPost);String httpEntityContent = getHttpEntityContent(response);httpPost.abort();return httpEntityContent;}/*** 设置请求参数* @param* @return*/private static List<NameValuePair> setHttpParams(Map<String, String> paramMap) {List<NameValuePair> formparams = new ArrayList<NameValuePair>();Set<Map.Entry<String, String>> set = paramMap.entrySet();for (Map.Entry<String, String> entry : set) {formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}return formparams;}public static Map<String,String> getParamsData(Map<String,String> paramsMap){Map<String,String> params = new HashMap<>();String dataJson = JSONObject.toJSONString(paramsMap);params.put("Data",dataJson);return params;}/*** @描述:  获取http请求的JSONObject* @参数: [jsonStr]* @返回值: com.alibaba.fastjson.JSONObject* @创建人 WZQ* @创建时间: 11:38 2019/4/2*/public static JSONObject getResponseJson(String jsonStr){JSONObject jsonObject = JSONObject.parseObject(jsonStr);return jsonObject;}/*** @描述: 获取新增返回的data id* @参数: [jsonStr]* @返回值: java.lang.Long* @创建人 WZQ* @创建时间: 11:38 2019/4/2*/public static Long getResponseData(String jsonStr){return JSONObject.parseObject(jsonStr).getLong("data");}/*** @描述: 执行获取Id* @参数: [url, paramsMap]* @返回值: java.lang.Long* @创建人 WZQ* @创建时间: 17:24 2019/4/2*//*  public static Long executeHttpGetId(String url,Map<String,String> paramsMap){
//        JSONObject jsonObject = executeHttp(url,paramsMap);System.out.println(url);String getStr = null;try {getStr = get(url,paramsMap);} catch (IOException e) {e.printStackTrace();}return JSONObject.parseObject(getStr).getLong("data");}*//*** @描述: 执行返回JSONArr* @参数: [utl, paramsMap]* @返回值: java.lang.String* @创建人 WZQ* @创建时间: 17:17 2019/4/2*/public static JSONArray executeHttpGetResultArr(String url, Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = get(url,paramsMap);} catch (IOException e) {e.printStackTrace();}return JSONObject.parseObject(getStr).getJSONArray("data");}public static JSONArray executeHttpGetResultArr(PlatformUrlEnum url, Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = postPayMsg(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);} catch (IOException e) {e.printStackTrace();}return JSONObject.parseObject(getStr).getJSONArray("data");}public static void executeHttpNoReturn(String url,Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = get(url,paramsMap);} catch (IOException e) {e.printStackTrace();}//JSONObject jsonObject = JSONObject.parseObject(getStr);}/*** @描述: 执行返回JSON* @参数: [utl, paramsMap]* @返回值: java.lang.String* @创建人 WZQ* @创建时间: 17:17 2019/4/2*/public static JSONObject executeHttpGetResult(String url,Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = get(url,paramsMap);} catch (IOException e) {e.printStackTrace();}JSONObject jsonObject = JSONObject.parseObject(getStr);return jsonObject.getJSONObject("data");}public static JSONObject executeHttpGetResult(PlatformUrlEnum url, Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = get(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);} catch (IOException e) {e.printStackTrace();}return JSONObject.parseObject(getStr).getJSONObject("data");}/*** @描述:* @参数: [url, paramsMap]* @返回值: com.alibaba.fastjson.JSONObject* @创建人 WZQ* @创建时间: 15:44 2019/4/8*//*  public static JSONObject execute(String url,Map<String,String> paramsMap){System.out.println(url);String getStr = null;try {getStr = get(url,paramsMap);} catch (IOException e) {e.printStackTrace();}return JSONObject.parseObject(getStr);}
*//*** @描述: 执行获取Id* @参数: [url, paramsMap]* @返回值: java.lang.Long* @创建人 WZQ* @创建时间: 17:24 2019/4/2*/public static Long executeHttpGetId(String url,Map<String,String> paramsMap){Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);Method method = (Method) tempMap.get("method");Object obj = tempMap.get("object");List params = Lists.newArrayList();for(String key : paramsMap.keySet()){String value = paramsMap.get(key);if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){Long tempVal = Long.valueOf(value);params.add(tempVal);}else{if("null".equals(value)){params.add(null);}else{params.add(value);}}}Object object = null;try {/*LocalVariableTableParameterNameDiscoverer u =new LocalVariableTableParameterNameDiscoverer();String[] params1 = u.getParameterNames(method);String name = method.getParameters()[0].getName();*/object =  method.invoke(obj,params.toArray());} catch (Exception e) {e.printStackTrace();MeenoAssert.notTrue(true,"加密数据发生错误!");}return ((JSONObject)object).getLong("id");}/*** @描述: 执行返回JSON* @参数: [utl, paramsMap]* @返回值: java.lang.String* @创建人 WZQ* @创建时间: 17:17 2019/4/2*/public static JSONObject executeHttp(String url,Map<String,String> paramsMap){Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);Method method = (Method) tempMap.get("method");Object obj = tempMap.get("object");List params = Lists.newArrayList();for(String key : paramsMap.keySet()){String value = paramsMap.get(key);if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){Long tempVal = Long.valueOf(value);params.add(tempVal);}else{if("null".equals(value)){params.add(null);}else{params.add(value);}}}Object object = null;try {object =  method.invoke(obj,params.toArray());} catch (Exception e) {e.printStackTrace();MeenoAssert.notTrue(true,"加密数据发生错误!");}return ((JSONObject)object);}/*** @描述:* @参数: [url, paramsMap]* @返回值: com.alibaba.fastjson.JSONObject* @创建人 WZQ* @创建时间: 15:44 2019/4/8*/public static JSONObject execute(String url,Map<String,String> paramsMap){Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);Method method = (Method) tempMap.get("method");Object obj = tempMap.get("object");List params = Lists.newArrayList();for(String key : paramsMap.keySet()){String value = paramsMap.get(key);if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){Long tempVal = Long.valueOf(value);params.add(tempVal);}else{if("null".equals(value)){params.add(null);}else{params.add(value);}}}Object object = null;try {object =  method.invoke(obj,params.toArray());} catch (Exception e) {e.printStackTrace();MeenoAssert.notTrue(true,"加密数据发生错误!");}return ((JSONObject)object);}}

VideoUtils.java
videoUtils获取视频信息工具类


package com.meeno.wzq.alibaba.video;import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import com.meeno.wzq.alibaba.signature.SignatureUtils;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** @description: videoUtils获取视频信息工具类* @author: Wzq* @create: 2020-01-14 19:31*/
public class VideoUtils {/***@Description 获取签名结果*@Param [accessKeyId, accessKeySecret, videoId]*@Return java.lang.String*@Author Wzq*@Date 2020/1/14*@Time 19:30*/public static String getVideoInfo(String accessKeyId,String accessKeySecret,String videoId) throws IOException {String timestamp = SignatureUtils.generateTimestamp();String signatureNonce = SignatureUtils.generateRandom();//1.1. 构造规范化的请求字符串Map<String, String> privateParams = Maps.newLinkedHashMap();privateParams.put("Action","GetVideoInfo");privateParams.put("VideoId", videoId);Map<String, String> publicParams = Maps.newLinkedHashMap();publicParams.put("Timestamp",timestamp);publicParams.put("Format","JSON");publicParams.put("AccessKeyId",accessKeyId);publicParams.put("SignatureMethod", "HMAC-SHA1");publicParams.put("SignatureNonce",signatureNonce);publicParams.put("Version", "2017-03-21");publicParams.put("SignatureVersion","1.0");List<String> allParams = SignatureUtils.getAllParams(publicParams, privateParams);String canonicalizedQueryString = SignatureUtils.getCQS(allParams);//1.2. 构造待签名的字符串/*构造待签名的字符串*/String StringToSign = "GET" + "&" + SignatureUtils.percentEncode("/") + "&" + SignatureUtils.percentEncode(canonicalizedQueryString);//1.3. 计算待签名字符串的HMAC值byte[] bytes = SignatureUtils.hmacSHA1Signature(accessKeySecret, StringToSign);//1.4. 编码得到最终签名值//按照 Base64 编码规则将1.3中计算得到的HMAC值编码成字符串,得到最终签名值(Signature)。String signature = SignatureUtils.newStringByBase64(bytes);
//        log.info("-------------"+signature);Map<String,String> videoInfoMap = Maps.newLinkedHashMap();videoInfoMap.put("Action","GetVideoInfo");videoInfoMap.put("VideoId", videoId);videoInfoMap.put("Format","JSON");videoInfoMap.put("AccessKeyId",accessKeyId);videoInfoMap.put("Signature",signature);videoInfoMap.put("SignatureMethod","HMAC-SHA1");videoInfoMap.put("SignatureVersion","1.0");videoInfoMap.put("SignatureNonce",signatureNonce);videoInfoMap.put("Timestamp", timestamp);videoInfoMap.put("Version","2017-03-21");//调用http get请求String resultStr = HttpUtils.getAjax("http://vod.cn-shanghai.aliyuncs.com", videoInfoMap);
//        log.info(s);return resultStr;}}

调用获取视频点播工具类获取videoinfo

controller层代码如下:

/***@Description 获取视频点播的视频信息*@Param [session, request, response, data]*@Return void*@Author Wzq*@Date 2020/1/14*@Time 19:34*/@RequestMapping(value = "getVideoInfo.action")public void getVideoInfo(final HttpSession session,final HttpServletRequest request,final HttpServletResponse response,@RequestParam(value = "Data") String data) throws IOException {JSONObject jsonObject = JSONObject.parseObject(data);//视频点播videoIdString videoId = jsonObject.getString("videoId");Bank indexBank = this.enterpriseDao.getEnterprise().getIndexBank();String accessKeyId = "";String accessKeySecret = "";String videoInfo = VideoUtils.getVideoInfo(accessKeyId, accessKeySecret, videoId);JSONObject resultJson = null;if(videoInfo != null && !videoInfo.isEmpty()){resultJson = JSONObject.parseObject(videoInfo);}CommonUtil.toJson(response, new ResponseBean(Constant.RESPONSE_SUCCESS,"",resultJson));}

个人微信公众,经常更新一些实用的干货:

阿里云视频点播获取视频点播的video信息相关推荐

  1. 阿里云点播获取播放路径

    阿里云点播获取播放路径 需要的jar包 代码 #背景介绍 一个项目听说要做视频点播,发现阿里有云播放模块.尝试把视频放在上面,项目只能数据存储和播放.但是怎么获取到云播放视频的地址走了一点弯路记录一下 ...

  2. 修改串口设备名ttymxc1_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

  3. esp8266 阿里云 arduino_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

  4. 获取阿里云mysql实例名称_阿里云如何获取数据库名字

    全网最新活动请看下方内容或右侧内容! --------------- 阿里云如何获取数据库名字,阿里云服务器回滚数据库. 对于大多数小型或初期项目来说,我们可能常用的做法是先将web.数据库全部安装在 ...

  5. 阿里云盘获取Refresh Token的方法

    阿里云盘获取Refresh Token的方法 先打开浏览器开发工具 F12

  6. 阿里云OSS获取文件强制下载的签名URL

    需求: 视频文件在后台可预览,可下载. 目前难题: 在点击下载时,OSS的签名url在浏览器中会直接播放,不提示下载 原因 : OSS在上传时未指定文件元信息.官方推荐,指定文件元信息 'Conten ...

  7. 阿里云HaaS700硬件连接与开机信息

    摘要:HaaS700是一款带摄像头的开发板,带有物联网功能,可以通过python轻应用来开发.本文介绍一下对它的初步理解和开机之后的运行信息. 硬件:HaaS700,USB串口模块 软件:win7 x ...

  8. 【逗老师带你学IT】PRTG监控系统通过阿里云API获取云产品运行状况

    本文介绍如何使PRTG监控系统通过阿里云监控API获取阿里云产品监控数据.例如网络带宽,ECS性能,RDS产品性能等. 本文主要涉及的技术点: 1.PRTG监控系统高级自定义传感器的使用 2.PRTG ...

  9. https 阿里云 的获取和配置 http变成https

    http变成https 名字起得很俗,应该叫 如何给web服务上ssl证书,是的,上了这个证书是变成https的关键 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTP ...

最新文章

  1. java thread.await_使用Thread.Sleep进行等待的替代方法
  2. 并查集(边带权,拓展域)
  3. ArcEngine判断要素(feature)是否为multipart feature及分解(炸开)代码
  4. LNSYOJ201小胖的奇偶【并查集+离散化】【做题报告】
  5. [原创]DebugTools系列(4):AQTime经验总结
  6. Flux --gt; Redux --gt; Redux React 入门 基础实例教程
  7. 反向链接推进技巧: 有技巧的“跟风”策略
  8. 推荐一款强大的SQL Internal 查看工具InternalsViewer
  9. 事务的传播行为和隔离级别?
  10. 一个开发周期为6个月的中小型软件开发项目成本预算大致表,不足之处请指点...
  11. 创建一个urdf机器人_Matlab官方机器人工具箱Robotics System Toolbox官网翻译教程2
  12. PHP-FPM 设置多pool、配置文件重写
  13. idea创建一个javaweb项目
  14. 基于FPGA的数字电压表设计
  15. 解决Autodesk License Patcher (NLM Crack)重命名电脑名的问题
  16. 电脑的ppt打不开计算机二级,ppt打不开怎么办?详细教您详细解决方法
  17. 百度地图WEB服务-全景静态图使用心得
  18. 区分PV、IV、UV
  19. If-else与三目运算符的区别
  20. H5微信中棋牌游戏域名防封解决方案

热门文章

  1. metacoder-相关进化树图的绘制于实践
  2. iMeta | 宏基因组生物信息期刊-创刊背景和简介
  3. iMeta期刊顾问James M Tiedje当选中国科学院外籍院士
  4. NC:中科院动物所王关红等综述基因技术防控蚊媒疾病
  5. 第一:做学位论文期间,不要有任何度假休息的打算;第二,导师错的时候不多;第三……...
  6. 121个人电脑搭建微生物组分析平台(Win/Mac)
  7. Nature Protocols:整合高通量组学数据集鉴定潜在机制联系的计算框架
  8. R语言使用coin包应用于独立性问题的置换检验(permutation tests、响应变量是否独立于组、两个数值变量是独立的吗、两个分类变量是独立的吗)、以及coin包的常用置换检验函数
  9. R语言将ggplot2对象转化为plotly对象并通过shiny将可视化结果在应用程序或者网页中显示出来
  10. RStudio环境或者ggsave函数保存生成的图像为指定文件格式(pdf、jpeg、tiff、png、svg、wmf)、指定图像宽度、高度、分辨率(width、height、dpi)