置顶囚生CYのPOST(NEW VERSION)

Posted 囚生CY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了置顶囚生CYのPOST(NEW VERSION)相关的知识,希望对你有一定的参考价值。

2020.12.15

START or END? You start from the end of mine.

本文停更。四方之广,唯三分地中可寻自在。

JAVA百度AI接口调用示例(植物识别)

1. HTTP请求服务类:主要用于发起请求与响应处理:

package com.sufe.service;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * http 工具类
 */
public class HttpUtil 

    public static String post(String requestUrl, String accessToken, String params)
            throws Exception 
        String contentType = "application/x-www-form-urlencoded";
        return HttpUtil.post(requestUrl, accessToken, contentType, params);
    

    public static String post(String requestUrl, String accessToken, String contentType, String params)
            throws Exception 
        String encoding = "UTF-8";
        if (requestUrl.contains("nlp")) 
            encoding = "GBK";
        
        return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
    

    public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
            throws Exception 
        String url = requestUrl + "?access_token=" + accessToken;
        return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
    

    public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
            throws Exception 
        URL url = new URL(generalUrl);
        // 打开和URL之间的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 设置通用的请求属性
        connection.setRequestProperty("Content-Type", contentType);
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);

        // 得到请求的输出流对象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.write(params.getBytes(encoding));
        out.flush();
        out.close();

        // 建立实际的连接
        connection.connect();
        // 获取所有响应头字段
        Map<String, List<String>> headers = connection.getHeaderFields();
        // 遍历所有的响应头字段
        for (String key : headers.keySet()) 
            System.err.println(key + "--->" + headers.get(key));
        
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader in = null;
        in = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), encoding));
        String result = "";
        String getLine;
        while ((getLine = in.readLine()) != null) 
            result += getLine;
        
        in.close();
        System.err.println("result:" + result);
        return result;
    

 2. FileUtil:文件工具类,用于读取图片文件

package com.sufe.service;

import java.io.*;

/**
 * 文件读取工具类
 */
public class FileUtil 

    /**
     * 读取文件内容,作为字符串返回
     */
    public static String readFileAsString(String filePath) throws IOException 
        File file = new File(filePath);
        if (!file.exists()) 
            throw new FileNotFoundException(filePath);
         

        if (file.length() > 1024 * 1024 * 1024) 
            throw new IOException("File is too large");
         

        StringBuilder sb = new StringBuilder((int) (file.length()));
        // 创建字节输入流  
        FileInputStream fis = new FileInputStream(filePath);  
        // 创建一个长度为10240的Buffer
        byte[] bbuf = new byte[10240];  
        // 用于保存实际读取的字节数  
        int hasRead = 0;  
        while ( (hasRead = fis.read(bbuf)) > 0 )   
            sb.append(new String(bbuf, 0, hasRead));  
          
        fis.close();  
        return sb.toString();
    

    /**
     * 根据文件路径读取byte[] 数组
     */
    public static byte[] readFileByBytes(String filePath) throws IOException 
        File file = new File(filePath);
        if (!file.exists()) 
            throw new FileNotFoundException(filePath);
         else 
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            BufferedInputStream in = null;

            try 
                in = new BufferedInputStream(new FileInputStream(file));
                short bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                int len1;
                while (-1 != (len1 = in.read(buffer, 0, bufSize))) 
                    bos.write(buffer, 0, len1);
                

                byte[] var7 = bos.toByteArray();
                return var7;
             finally 
                try 
                    if (in != null) 
                        in.close();
                    
                 catch (IOException var14) 
                    var14.printStackTrace();
                

                bos.close();
            
        
    

 3. Base64Util:base6编码类,用于图片编码

package com.sufe.service;

/**
 * Base64 工具类
 */
public class Base64Util 
    private static final char last2byte = (char) Integer.parseInt("00000011", 2);
    private static final char last4byte = (char) Integer.parseInt("00001111", 2);
    private static final char last6byte = (char) Integer.parseInt("00111111", 2);
    private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
    private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
    private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
    private static final char[] encodeTable = new char[]'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/';

    public Base64Util() 
    

    public static String encode(byte[] from) 
        StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
        int num = 0;
        char currentByte = 0;

        int i;
        for (i = 0; i < from.length; ++i) 
            for (num %= 8; num < 8; num += 6) 
                switch (num) 
                    case 0:
                        currentByte = (char) (from[i] & lead6byte);
                        currentByte = (char) (currentByte >>> 2);
                    case 1:
                    case 3:
                    case 5:
                    default:
                        break;
                    case 2:
                        currentByte = (char) (from[i] & last6byte);
                        break;
                    case 4:
                        currentByte = (char) (from[i] & last4byte);
                        currentByte = (char) (currentByte << 2);
                        if (i + 1 < from.length) 
                            currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
                        
                        break;
                    case 6:
                        currentByte = (char) (from[i] & last2byte);
                        currentByte = (char) (currentByte << 4);
                        if (i + 1 < from.length) 
                            currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
                        
                

                to.append(encodeTable[currentByte]);
            
        

        if (to.length() % 4 != 0) 
            for (i = 4 - to.length() % 4; i > 0; --i) 
                to.append("=");
            
        

        return to.toString();
    

 4. 获取认证TOKEN的服务:

package com.sufe.service;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * 获取token类
 */
public class AuthService 

    /**
     * 获取权限token
     * @return 返回示例:
     * 
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * 
     */
    public static String getAuth() 
        // 官网获取的 API Key 更新为你注册的
        String clientId = "";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "";
        return getAuth(clientId, clientSecret);
    

    /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) 
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try 
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) 
                System.err.println(key + "--->" + map.get(key));
            
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) 
                result += line;
            
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = new JSONObject();
            jsonObject = JSONObject.parseObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
         catch (Exception e) 
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        
        return null;
    

5. 调取API的类

package com.sufe.service;

import com.sufe.service.Base64Util;
import com.sufe.service.FileUtil;
import com.sufe.service.HttpUtil;

import java.net.URLEncoder;

/**
* 植物识别
*/
public class OCRService 

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String plant(String filePath, String accessToken) 
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant";
        try 
            // 本地文件路径
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
         catch (Exception e) 
            e.printStackTrace();
        
        return null;
    



2020.12.14

用于监测系统接口连接情况的脚本。

使用netstat -ano 可以查看详细的接口连接情况:

os.system无法返回cmd命令的输出结果,我们可以通过使用os.popen("netstat -ano").read()来获取cmd命令的输出结果;

事实上os.popen并非专门用于返回cmd命令的返回结果。与普通的open类似,popen带有参数mode='r',默认是只读,可以改为'w'即表示开辟一个管道文件进行指令输入,允许写入指令后运行。

合理使用grep管道符可以获取需要监测的端口连接情况,因为netstat -ano返回的信息是非常多的,如果频繁记录会产生非常大的日志文件。

每个ESTABLISHED的端口必然会对应一个进程PID,如果需要切断端口连接,可以直接taskkill /pid <pid值>,pid值在netstat -ano输出的最后一列。

一般重点监测22与21端口的连接情况,分别对应sftp与ftp,开启ftp或sftp服务前必须制定严格的防火墙入栈规则,否则目前的网络环境不设防的主机很容易遭到攻击。

参考脚本如下:

# -*- coding: UTF-8 -*-

import os
import time

INTERVAL = 60

states = ['"ESTABLISHED"', '"CLOSE_WAIT"']								 # 需要记录的states
cmd1 = 'netstat -ano | find '.format									 # 列出当前所有连接情况
cmd2 = 'taskkill /pid '.format										 # 杀死进程(by pid)
cmd3 = 'tasklist /fi "pid eq "'.format								 # 查询指定pid的task详细信息

logname = 'log/established.log'
logheader = '\\t\\t\\t\\t\\t\\n'.format('protocol', 'localhost', 'remotehost', 'state', 'pid', 'timestamp')

try:																	 # 判断log文件是否存在
	with open(logname, "r") as f:
		pass

except:																	 # 不存在则新建一个log文件
	with open(logname, "w") as f:
		f.write(logheader)


def is_valid(protocol, localhost, remotehost, state, pid):				 # 根据连接情况判断该连接是否合法
	""" NOT IMPLEMENTED
	目前不知道怎么写逻辑, 所以默认都是合理的, 需要通过观察规律才能发现非法侵入;
	目前感觉应该ESTABLISHED里的remotehost端口不是443的可能是比较少见的,
	另外localhost的21和22端口正常情况下应该是不会被占用的, 否则肯定是出问题了;
	"""
	
	return True															 # 返回值为True

while True:

	for state in states:
		reslist = os.popen(cmd1(state)).read().splitlines()
		timestamp = int(time.time())
		for res in reslist:												 # 遍历每个连接行记录
			splits = res.split()							
			if len(splits)==5:											 # 只考虑有五个元素的行记录
				protocol, localhost, remotehost, state, pid = splits
				if is_valid(*splits):									 # 判断是否合法: 目前默认都合法
					pass
				else:													 # 不合法就杀死进程
					print("杀死进程: ".format(pid))
					print("  - 进程相关信息: \\n")
					print("#"*64)
					print(os.popen(cmd1(pid)).read())
					print("#"*64)
					os.system(cmd2(pid))
				with open(logname, "a") as f:							 # 记录
					f.write('\\t\\t\\t\\t\\t\\n'.format(protocol, localhost, remotehost, state, pid, timestamp))
	time.sleep(INTERVAL)

PS:

右膝这次伤得有点厉害,可能很长时间跑不了了。


2020.12.13

完蛋,右膝肿了,照例又给老妈臭骂了一通。

晚上霾还是有点重,但是准备好了是要上场的。

状态其实特别好,5km用时不到23'30'',且体力明显充沛,但是感觉右大腿隐隐作痛快要抽筋了;

以为是右腿压得太厉害,于是刻意把重心压到左边,但还是疼。

15圈结束感觉右膝盖开始抽筋,不得已只好停下,发现膝盖红肿,楼梯都走不动了。

最后是28'15''跑了15圈,一点力竭感都没有,本来极有可能把10km刷新到46分半以内的,太遗憾了。

搞了个护膝,可惜不知道几天才能恢复得过来。总之冬天千万别光着膝盖跑,真的是太伤了。

最近一个月不是在受伤,就是跑在即将受伤的路上,从右腿到左脚到右脚再到右膝,OMG。


2020.12.12

右膝确实伤了,一方面可能穿短裤跑没有护膝给冻坏了,另一方面连续3天的高强度速耐给整废了,休息一天,右脚也开始出现两个小泡,还好不是血泡。最近霾太重,晚上又跑了一次上下六楼加两个30米过道共计10次,耗时16'44'',平均1次上下楼加过道来回刚刚好100秒,爬楼太累了。

太冷了,之前一直都只在短袖外面套了一件卫衣,今天实在是顶不住了,不知道接下来还能否短袖短裤上场跑了。。。早八晚十,学点东西,困。

某人给我刷到10000访问量咋还在刷呢?我在后台是可以看到最频繁访问的几个IP地址的,是谁我大致能猜得到,有空可以帮我刷刷其他几篇还没到10000的,还有您这个刷法太慢了,建议参考一下https://caoyang.blog.csdn.net/article/details/110791414最后一节内容,我看着都嫌累。

PS:

S换了个头像,我翻列表时没找到以为自己终于是被删了..

列一点note,充实一下内容;

torch.Tensor 与 torch.tensor

  1. 实例对比:
  • Example1: 接收整型参数;
    print(torch.Tensor(5))
    print(torch.tensor(5))
    
    • 输出结果: 前者生成以参数值为维度的随机向量(随机值非常小), 后者生成一个tensor标量;
    tensor([1.0561e-38, 1.0653e-38, 1.0469e-38, 9.5510e-39, 8.7245e-39])
    tensor(5)
    
  • Example2: 接收列表型或元组型参数;
    print(torch.Tensor([1, 2, 3, 4, 5]))
    print(torch.tensor([1, 2, 3, 4, 5]))
    print(torch.Tensor((3, 4)))
    print(torch.tensor((3, 4)))
    
    • 输出结果: 两者输出结果基本类似, 前者会默认将数值类型从整型转为浮点型, 后者则会保持输入时的数值类型(整型), 且列表和元组本质上没有区别;
    tensor([1., 2., 3., 4., 5.])
    tensor([1, 2, 3, 4, 5])
    tensor([3., 4.])
    tensor([3, 4])
    
  • Example3: 接收多个整型参数;
    print(torch.Tensor(3, 4))
    #print(torch.tensor(3, 4))
    
    • 输出结果: 前者生成以多个整型参数为shape的随机张量(随机值非常小), 后者会报错, 因为后者只支持接收一个参数;
    tensor([[9.9184e-39, 9.0000e-39, 1.0561e-38, 1.0653e-38],
        [4.1327e-39, 8.9082e-39, 9.8265e-39, 9.4592e-39],
        [1.0561e-38, 1.0653e-38, 1.0469e-38, 9.5510e-39]])
    Traceback (most recent call last):
    ...
    TypeError: tensor() takes 1 positional argument but 2 were given
    
  • Example4: 接收numpy.ndarray类型的参数;
    print(torch.Tensor(numpy.array([[1, 2, 3], [4, 5, 6]])))
    print(torch.tensor(numpy.array([[1., 2., 3.], [4., 5., 6.]])))
    print(torch.tensor(numpy.array([[1, 2, 3], [4, 5, 6]])))    
    
    • 输出结果: 两者都将numpy.ndarray数组转为torch.Tensor, 前者默认转为浮点型数值, 后者保持原有数据类型;
    tensor([[1., 2., 3.],
            [4., 5., 6.]])
    tensor([[1., 2., 3.],
            [4., 5., 6.]], dtype=torch.float64)
    tensor([[1, 2, 3],
            [4, 5, 6]], dtype=torch.int32)
    
  • Example5: 接收torch.Size类型的参数:
    print(torch.Tensor(torch.Tensor([[1, 2, 3], [4, 5, 6]]).shape))
    print(torch.tensor(torch.Tensor([[1, 2, 3], [4, 5, 6]]).shape))
    
    • 输出结果: 前者会生成以torch.Size类型参数为形状的零张量, 后者则会将参数直接转为torch.Tensor
    tensor([[0., 0., 0.],
            [0., 0., 0.]])
    tensor([2, 3])
    

以上是关于置顶囚生CYのPOST(NEW VERSION)的主要内容,如果未能解决你的问题,请参考以下文章

完结囚生CYの备忘录(20220525-20220813)

更新囚生CYの备忘录(20230216~)

更新囚生CYの备忘录(20230216~)

更新囚生CYの备忘录(20221121-)

更新囚生CYの备忘录(20221121-)

连载囚生CYの备忘录(20220906-)