1. 字符画生成工具
如果让我们手工的来编辑这些字符画,显然是一件非常困难的差事。所以,我们可以借助下面这些工具,轻松地根据文字或图片来生成用于Banner输出的字符画。
ps:
2. K8S部署pod尽量分散在不同节点node上
由于nlp分词服务属于CPU密集型,所以需要在部署的时候尽量使得pod分散在不同node上,已缓解cpu负载,目前发现线上部署每次发布都会到同一节点上,故如下改造
apiVersion: apps/v1
kind: Deployment
metadata:
name: shenjian-nlp
namespace: shenjian-local
spec:
replicas: 2
selector:
matchLabels:
project: shenjian-nlp
app: shenjian-local
template:
metadata:
labels:
project: shenjian-nlp
app: fangjia-local
buildId: latest
spec:
// 主要以下起作用
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: project // 改为自己标签key
operator: In
values:
- shenjian-nlp // 改为自己的名称值
topologyKey: kubernetes.io/hostname
3. Object转JSON日期格式化并保持数据顺序及Value为空Key仍返回
3.1 业务背景
(1)项目全景不可配置化,过程修改返回字段前端页面也需相应修改,可扩展性差。
(2)要想可配置化,字段需从过程中取,但AJAX返回的JSON数据KEY顺序不与过程中返回字段顺序一致
3.2 原因分析
fastjson在Object转JSON的时候,底层采用HashMap, 若有序,则需为LinkedHashMap, 查看源码发现
public JSONObject(int initialCapacity, boolean ordered){
if (ordered) {
map = new LinkedHashMap<String, Object>(initialCapacity);
} else {
map = new HashMap<String, Object>(initialCapacity);
}
}
可是Object如何转为JSON字符串,查看源码并没有发现转的方法,但是过程中返回的是标准的Map类型,故贴上以下代码
3.3 解决代码
SerializeConfig serializeConfig = new SerializeConfig();
ObjectSerializer serializer = new SimpleDateFormatSerializer(DateUtils.format());
serializeConfig.put(Timestamp.class, serializer);
serializeConfig.put(java.sql.Date.class, serializer);
serializeConfig.put(Date.class, serializer);
if (obj instanceof Map){
JSONObject jsonObject = new JSONObject(16, true);
jsonObject.putAll((Map) obj);
// 输出key时是否使用双引号,默认为true
// 是否输出值为null的字段,默认为false
result = JSON.toJSONStringZ(jsonObject, serializeConfig, SerializerFeature.QuoteFieldNames, SerializerFeature.WriteMapNullValue);
}
4. Oracle单字段字符串分割由一行改为多行
4.1 项目需求
虚拟核销中,若起草人离职,则已办视图项目客户专员无法查看,故需新增虚拟核销项目对应客户专员查看权限。
SELECT ID,PROJECTNO, CREATOR FROM FORM_MADJ_ACCOUNT WHERE ID IN('8cfa11ee-6ef4-448a-b75b-d7c99c96a76b', 'bf7ca28c-6d97-48b7-ad6e-a7398b5a11e4')
可见,项目中存在多项目编号,|分割,故首先分离项目
4.2 开始分离
SELECT DISTINCT
ID,
REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO -- 搜索正则匹配的串
FROM
YDAMS.FORM_MADJ_ACCOUNT
WHERE ID='8cfa11ee-6ef4-448a-b75b-d7c99c96a76b'
CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1 -- level关键字,代表树形结构中的层级编号
AND ID = PRIOR ID -- 主键ID 表示从下往上查找数据,可以理解为从叶子节点往上查找父级节点点
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL --该句不变
分离为多行结果:
4.3 注意事项
由于在子查询中ID无法使用外部别名ID,故采用左连接查询方式
注:项目表中存在项目客户专员信息
SELECT DISTINCT id FROM table_name ORDER BY number DESC;
--- 运行时往往会报错。因为在order by中出现的number没有在select distinct中出现,所以正确的写法应该是
SELECT DISTINCT id, number FROM table_name ORDER BY number DESC;
4.4 最终SQL语句
SELECT
DISTINCT FMA.ID,
FMA.PROJECTNO,
to_char(fma.create_date,'yyyy-mm-dd hh24:mi:ss') as create_date,
FMA.CREATE_DATE CREATE_DATE2 -- 注意这个在ORDER BY中存在,必须写否则会报错
FROM
FORM_MADJ_ACCOUNT FMA
LEFT JOIN sys_user SU ON FMA.CREATOR = SU.ID
LEFT JOIN (
SELECT DISTINCT
ID,
REGEXP_SUBSTR( PROJECTNO, '[^|]+', 1, LEVEL ) AS PROJECTNO
FROM
YDAMS.FORM_MADJ_ACCOUNT CONNECT BY LEVEL <= REGEXP_COUNT ( PROJECTNO, '|' ) + 1
AND ID = PRIOR ID
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
) PSI ON FMA.ID = PSI.ID
LEFT JOIN PROJ_INFO pi ON pi.PROJECTNO = PSI.PROJECTNO
WHERE
FMA.STATUS = 1
AND (SU.LOGINNAME = 'XXX' OR PI.PROJECT_MANAGER_ID = '08BA5F8B2CC4FC29E05010ACB550646D' )
ORDER BY
FMA.CREATE_DATE DESC
5. linux图形化界面安装与卸载
1.yum安装图形界面:
yum groupinstall "X Window System"
2.安装GNOME桌面环境
yum groupinstall "GNOME Desktop Environment"
3.安装KDE桌面环境
yum groupinstall "KDE (K Desktop Environment)"
(如果其中一环境不能安装,尝试用另一环境,亲测)
4.图形界面启动
键入命令 startx
5.图形界面想要卸载:
yum groupremove "GNOME Desktop Environment"
yum groupremove "X Window System"
ps:作为服务器强烈不建议安转图形化界面
6. Linux下Java中文字体不显示(解决图像中文乱码问题)
在Java中可以使用如下判断支持的字体
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilies = ge.getAvailableFontFamilyNames();
for (String s : fontFamilies) {
System.out.println(s);
}
在jdk15以后,只需在~/jre/lib/fonts/下建一个fallback目录,把你想在java中使用的字体烤贝到这个目录中即可
以下方法在fc6下测试通过,假设用户的jre路径为 /usr/java/jdk1.6.0_03/jre/
#cd /usr/java/jdk1.6.0_03/jre/lib/fonts
#sudo mkdir fallback
将C:\WINDOWS\Fonts\simsun.ttc拷贝到 /usr/java/jdk1.6.0_03/jre/lib/fonts/fallback文件夹内 ok!
win7中没有,win2003 有simsun.ttc
测试程序
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class Test {
public static void main(String[] args) throws Exception {
int width = 100;
int height = 100;
System.err.println(System.getProperty("sun.jnu.encoding"));
String s1 = "时段";
// String s2 = new String("你好".getBytes(System.getProperty("sun.jnu.encoding")), "UTF-8");
// String s3 = new String("你好".getBytes("GBK"), System.getProperty("sun.jnu.encoding"));
// String s4 = new String("你好".getBytes(), System.getProperty("sun.jnu.encoding"));
File file = new File("/home/image.jpg");
Font font = new Font("Serif", Font.BOLD, 10);
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D) bi.getGraphics();
g2.setBackground(Color.WHITE);
g2.clearRect(0, 0, width, height);
g2.setPaint(Color.RED);
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(s1 , context);
double x = (width - bounds.getWidth()) / 2;
double y = (height - bounds.getHeight()) / 2;
double ascent = -bounds.getY();
double baseY = y + ascent;
g2.drawString(s1, (int) x, (int) baseY);
ImageIO.write(bi, "jpg", file);
}
}
7. 浅谈linux系统内存优化
最近发现系统卡顿,排查内存的原因,发现
虚拟内存竟然使用2.5G!!! 系统不卡顿才怪
果断
# 将swap数据转储到内存中,并清空swap里数据(前提,可用内存大于swap已用内存)
swapoff -a && swapon -a
2个G清理该命令竟然执行了10分钟。。要耐心等待,结果
防止内存充足仍然使用swap:
# 注意不使用交换分区,注意不是禁用
echo "vm.swappiness=0" >> /etc/sysctl.conf
# 使其立即生效
sysctl -p
8. 浏览器间接性崩溃服务器400错误排查分析
3.1 问题现象描述
最近谷歌浏览器间接性的崩溃,服务器400错误,所用livebos-tomcat为6.5
3.2 排查过程
多次记录出现错误的日期,搜索上下文,未发现任何服务器报错的信息;
恰好计划tomcat升级为livebos-tomcat8.5,故优先升级tomcat为8.5;
后仍然出现该错误,只不过有了错误提示: java.lang.IllegalArgumentException: Request header is too large
想到最近开发的新功能rest方式调用oa接口,流程传递json串,可能因为json串的过长原因导致;
3.3 解决方案
**普通tomcat**
在server.xml中
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxPostSize="0" maxHttpHeaderSize ="102400"/>
处加上maxHttpHeaderSize ="102400"
**SpringBoot**
在application.properties文件中添加 `server.max-http-header-size=102400`