置顶囚生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
- 实例对比:
- 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)的主要内容,如果未能解决你的问题,请参考以下文章