全栈工程师工作干货总结(三)

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`

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈健_算法小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值