今天一段时间一直在忙工作上的事,并没有系统地学习研究某一个具体的问题,但回顾这一个月的工作,发现还是有一些经验可以记录一下的。但这些经验没法系统地整理起来,因此只能算是开发中的杂项了。
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost postMethod = null;
try {
postMethod = new HttpPost(reqUrl);
postMethod.setConfig(RequestConfig.custom().setConnectTimeout(2000).setSocketTimeout(5000).build());
Map<String, Object> params = new HashMap();
params.put("param1", param1);
params.put("param2", param2);
postMethod.setEntity(new StringEntity(JSON.json(params), ContentType.APPLICATION_JSON));
HttpResponse response = httpClient.execute(postMethod);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity resEntity = response.getEntity();
JSONObject parsedJsonObj = (JSONObject) JSON.parse(EntityUtils.toString(resEntity, "UTF-8"));
//process parsedJsonObj
if (resEntity != null) {
try {
EntityUtils.consume(resEntity);
} catch (Exception ignore) {
}
}
}
} catch (Exception e) {
logger.error("请求失败", e);
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
}
}
上面这段代码还是太麻烦了,实际编码中可以将上述代码封装成函数,只需要传入reqUrl
,params
, JsonResponseProcessHandler
就可以了。
// 每个主机最大的连接数(如果会大量向同一主机发送大量http请求,需加大此值)
connectionManager.setDefaultMaxPerRoute(10);
// 总共最大的连接数
connectionManager.setMaxTotal(100);
httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
jdk6下的代码
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
param.setQuality(quality, true);
encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
jdk7下的代码
ImageWriter imageWriter = (ImageWriter)ImageIO.getImageWritersBySuffix("jpeg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(out);
imageWriter.setOutput(ios);
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(quality);
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(bufferedImage), null);
imageWriter.write(imageMetaData, new IIOImage(bufferedImage, null, null), null);
jdk6下的代码
public class CustomDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
...
}
}
jdk7下的代码
public class CustomDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
...
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
throw new java.sql.SQLFeatureNotSupportedException("getParentLogger not supported");
}
}
工作中使用python写了一部分与NLP相关的代码,但主程序是部署在Tomcat里的java程序,于是需要想办法分发python程序,同时完成java程序与python程序的交互。 1. 自带python程序的依赖库 python程序依赖于一些第三方python库,但很难让运维提前使用pip
安装第三方python库,研究了下,可以采用以下简易方法。 1. 在目录下新建一个libs
目录,将jieba
, snownlp
等第三方库放到libs
目录下。 2. 修改python程序入口,在最开始加入以下代码。
import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'libs'))
Multiset<String> nameCounter = HashMultiset.create();
for(String name : names) {
nameCounter.add(name);
}
Iterable<String> top5Names = Iterables.limit(Multisets.copyHighestCountFirst(nameCounter).asList(), 5);
还有一些更高级的用法参见https://openpyxl.readthedocs.io/en/default/
写了一个工具操作mysql数据库的工具方法如下:
def sql_query_generator(sql):
try:
conn = pymysql.connect(host=DB_IP, user=DB_USER, password=DB_PASSWD, \
db=DB_NAME, charset='utf8', cursorclass=pymysql.cursors.DictCursor)
with conn.cursor() as cursor:
cursor.execute(sql)
for row in cursor:
yield row
finally:
conn.close()
使用起来也比较简单:
query_generator = sql_query_generator('select * from user;')
for user in query_generator:
print(user)
import difflib
print(difflib.SequenceMatcher(None, 'hello world', 'hello').ratio())
# 也可以用Levenshtein
import Levenshtein
print(Levenshtein.ratio('hello world', 'hello'))