java.util.function
包下的都是/** |
R apply(T t)
方法。使用示例如下:/** |
还有其他2个默认方法:compose、andThen
compose: 返回一个组合函数,首先将入参应用到before函数,再将before函数结果应用到该函数中
Function<String, String> function = a -> a + " Jack!"; |
andThen: 返回一个组合函数,该函数结果应用到after函数中
Function<String, String> function = a -> a + " Jack!"; |
常用的还有:BiFunction<T,U,R>
接受两个参数并返回结果的函数
public class ConsumerExample { |
BiConsumer<T,U>
提供两个自定义类型的输入参数,不返回执行结果// 示例1 |
public class PredicateExample { |
java.util.function
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量
为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel的主要特征如下图:
sentinel-dashboard-1.8.6.jar
java -jar sentinel-dashboard-1.8.6.jar
来启动sentinel
,可以再启动的时候,修改配置,环境变量配置如下:配置项 | 类型 | 默认值 | 最小值 | 描述 |
---|---|---|---|---|
auth.enabled | boolean | true | - | 是否开启登录鉴权,仅用于日常测试,生产上不建议关闭 |
sentinel.dashboard.auth.username | String | sentinel | - | 登录控制台的用户名,默认为 sentine l |
sentinel.dashboard.auth.password | String | sentinel | - | 登录控制台的密码,默认为 sentinel |
sentinel.dashboard.app.hideAppNoMachineMillis | Integer | 0 | 60000 | 是否隐藏无健康节点的应用,距离最近一次主机心跳时间的毫秒数,默认关闭 |
sentinel.dashboard.removeAppNoMachineMillis | Integer | 0 | 120000 | 是否自动删除无健康节点的应用,距离最近一次其下节点的心跳时间毫秒数,默认关闭 |
sentinel.dashboard.unhealthyMachineMillis | Integer | 60000 | 30000 | 主机失联判定,不可关闭 |
sentinel.dashboard.autoRemoveMachineMillis | Integer | 0 | 300000 | 距离最近心跳时间超过指定时间是否自动删除失联节点,默认关闭 |
sentinel.dashboard.unhealthyMachineMillis | Integer | 60000 | 30000 | 主机失联判定,不可关闭 |
server.servlet.session.cookie.name | String | sentinel_dashboard_cookie | - | 控制台应用的 cookie 名称,可单独设置避免同一域名下 cookie 名冲突 |
修改环境变量修改示例如下:
# 其中server.port=8080 是启动端口,后面是账号和密码 |
启动之后然后访问:http://localhost:8080
即可访问控制台
控制台更多稳定可查看官方文档:https://github.com/alibaba/Sentinel/wiki/
<dependency> |
spring: |
簇点链路
给接口添加流控规则流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
一条流控规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
resource:资源名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default
则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
count:限流阈值
strategy:调用关系限流策略,0表示直接,1表示关联,2表示链路;
controlBehavior:流量控制效果(,0表示快速失败,1表示Warm Up,2表示排队等待)
FlowException
FlowException
clusterMode:是否为集群模式
[ |
sentinel的熔断状态有三种状态:
熔断策略:
[0.0, 1.0]
,代表 0% - 100%
经过熔断时长后熔断器会进入半恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(不被熔断策略记录)则结束熔断,否则会再次被熔断。
属性 | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade | 限流模式 | QPS 模式 |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx | 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 | |
paramFlowItemList | 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型 | |
clusterMode | 是否是集群参数流控规则 | false |
clusterConfig | 集群流控相关配置 |
簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源
sentinel 默认会监控SpringMVC的每一个端点(Endpoint
)
因此SpringMVC的每一个端点就是调用链路中的一个资源
如果我们想在链路中添加一个资源,那就可以使用 @SentinelResource
注解
注解的参数如下:
value
资源名称
entryType
entry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler
处理BlockException的函数名称,函数要求:
blockHandlerClass
存放blockHandler的类,对应的处理函数必须static修饰。
fallback
用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。
fallbackClass
存放fallback的类。对应的处理函数必须static修饰。
defaultFallback
用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
exceptionsToIgnore
指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace
需要trace的异常
sentinel会把controller的接口作为一个资源,我们可以在service下手动添加资源,只需要在方法上加上@SentinelResource
示例如下,在TestService的方法上添加sentinel资源:
"/sentinel") ( |
流控模式:链路
的流控失效,需要修改bootstrap.yml
,添加配置spring: |
/sentinel/sayHi?name=rstyro
控制台的簇点链路即可看到TestService#sayHi
的资源sentinel-datasource-nacos
<dependency> |
[ |
bootstrap.yml
中设置sentinel的datasource:spring: |
]]>具体的规则类型可参考:com.alibaba.cloud.sentinel.datasource.RuleType
图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。
曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离
两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积 定义为:a·b=a1b1+a2b2+……+anbn。
向量可以表示一个事物,一段文字,一张图片,那向量怎么生成呢?
可以使用在HuggingFace中的sentence-transformers的预训练模型来生成我们的向量
查看地址模型介绍:https://www.sbert.net/docs/pretrained_models.html
或者访问HuggingFace模型中心
大部分深度学习框架都是PyTorch和TensorFlow,使用的基本都是python
如何通过使用Java调用这些模型呢?可以使用DJL
Deep Java Library (DJL) 是一个用于深度学习的开源、高级、与引擎无关的 Java 框架。
①、首先安装:sentence-transformers
pip install -U sentence-transformers |
②、使用模型的python代码例子
from sentence_transformers import SentenceTransformer |
③、导出为TorchScript模型
from sentence_transformers import SentenceTransformer |
dense_vector
可参考官方文档的解释:https://www.elastic.co/guide/en/elasticsearch/reference/8.8/dense-vector.html
PUT vector_test |
PUT vector_test/_doc/1 |
// 向量使用的是:今天天气不错 |
Python/C++/Java/Swift/C#
将它移植到各个平台。flowchart LR subgraph Step direction TB C(Text Det) --> D(Text Cls) --> E(Text Rec) end A[/OurSelf Dataset/] --> B(PaddleOCR) --Train--> Step --> F(PaddleOCRModelConverter) F --ONNX--> G{RapidOCR Deploy\nPython/C++/Java/C#} G --> H(Windows x86/x64) & I(Linux) & J(Android) & K(Web) & L(Raspberry Pi) click B "https://github.com/PaddlePaddle/PaddleOCR" _blank click F "https://github.com/RapidAI/PaddleOCRModelConverter" _blank
方式一:本地直接运行
# 项目含有库文件,导致下载可能较慢 |
方式二:引入其他项目
在方式一中下载之后进行打包(mv clean compile install
),然后引入pom依赖,
不会打包可参考文档:(需要自己下载项目打包,过程参考如何自行打包jar包?)
<dependency> |
注意:如果是采用方式二打包,务必将src/resources下的ncnn或者onnx的库文件引入到自己的项目resources中
调用测试:
public class OcrUtilTest { |
LibConfig参数说明如下:
参数名 | 说明 | 类型 | 权限 |
---|---|---|---|
libraryDir | 动态链接库路径 | String | 读写 |
modelsDir | 模型路径 | String | 读写 |
deleteOnExit | 是否在JVM退出时删除动态链接库和模型文件 | boolean | 读写 |
detName | Det文件名称 | String | 只读 |
clsName | Cls文件名称 | String | 只读 |
recName | Rec文件名称 | String | 只读 |
keysName | 词单 | String | 只读 |
HardWareConfig参数说明如下:
参数名 | 说明 | 类型 | 权限 |
---|---|---|---|
numThread | CPU 核心数量 | int | 读写 |
gpuIndex | GPU0一般为默认GPU,参数选项:使用CPU(-1)/使用GPU0(0)/使用GPU1(1)/…,默认0 | int | 读写 |
⚠️ ONNX不使用GPU,即使用-1
ParamConfig参数说明如下:
参数名 | 说明 | 类型 | 权限 |
---|---|---|---|
padding | 图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。默认50。 | int | 读写 |
maxSideLen | 按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen为0表示不缩放 | int | 读写 |
boxScoreThresh | 文字框置信度门限,文字框没有正确框住所有文字时,减小此值,默认0.5f | float | 读写 |
boxThresh | 值越大,文字部分会越小,默认0.3f | float | 读写 |
unClipRatio | 单个文字框大小倍率,越大时单个文字框越大,默认1.6f | float | 读写 |
doAngleFlag | 启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测,默认关闭 | boolean | 读写 |
mostAngleFlag | 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭 | boolean | 读写 |
✍️ 想更深入了解,请移步config.yaml参数解释
com.benjaminwan.ocrlibrary: 核心代码,用来与dll、so、dylib进行交互。‼️ 千万不要改包名!!!
com.github.monster.ocr
config
JarFileUtils: 从jar包中加载动态库
PathConstants: 模型/文件路径常量
OcrUtil: 调用核心代码工具类
当前使用版本如下(此处的版本指的是RapidOcrNcnn或者RapidOcrOnnx的版本)
Mac-Arm64: v1.2.0
Mac-x86_64、Linux、Win:v1.1.2
win7可能存在问题,未经测试
如何更新模型?
Mac-Arm64: v1.2.2
Mac-x86_64、Linux、Win:v1.2.2
win7可能存在问题,未经测试
如何更新模型?
1.按照Rapid官方说明文档转换即可
src\main\resources\onnx\models
PathConstants.MODEL_REC_NAME
为你模型的名称此方式使用了打包插件,会将resources下的所有动态库均打包进jar,这会导致jar包将近100M。
当然,实际使用过程中,可以通过调整includes标签来只打包相应系统的动态库(比如只打包onnx mac-arm64,jar包只有30M左右)
<build> |
在这种方式下,当引入该jar后,直接使用即可
同样的,通过打包插件可以控制不打包动态库,打包后jar只有19KB
<build> |
在这种方式下,当引入该jar后,还需在项目src/main/resources下添加相应的动态库(如下图所示)
否则会抛出NoSuchFileException
具体使用哪种方式还是按照自己的需求来
方式 | 原理/大致流程 | 优点 | 缺点 | 其他说明 |
---|---|---|---|---|
使用RapidOcr-Java | Java程序通过JNI调用编译好的OCR动态库 | 下载即用,跨平台,开发者无需了解OCR相关知识 | 无法直接对模型进行控制 | 已开源维护,推荐使用👍 |
直接调用onnx-runtime | 通过onnx-runtime调用并使用模型 | 下载即用,跨平台,可对模型直接进行控制 | 开发者需了解OCR相关知识 | 开发中,暂未开源,推荐使用👍 |
通过DJL实现间接调用 | 不直接使用onnx-runtime,使用DJL间接调用onnx-runtime | 无需关注打包时平台依赖,DJL已整合好 | DJL语法学习成本较大,开发者需了解OCR相关知识 | 开源但停止维护,不推荐 |
API调用 | 在服务器/容器中开启OCR服务,通过http请求进行OCR | 功能解耦 | 对于小型系统来说完全没必要再引入Docker | 自行查找镜像源或web服务,例如RapidOCR-web版本 |
tessdata
即可,可以下载中文包地址:https://github.com/tesseract-ocr/tessdata/raw/4.00/chi_sim.traineddatatesseract.exe --help
或者 tesseract.exe --help-extra
查看命令提示# 把图片help.png转换文字,输出到D:/test.txt |
tess4j
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --> |
import net.sourceforge.tess4j.Tesseract; |
有些pdf是又有图片又有文字的,如果直接获取文字可能会漏字符
可以尝试pdf转图片,然后再使用过OCR识别
PDF转图片,可以使用pdfbox
依赖如下:
<dependency> |
完整的PDF图片识别文字代码
import cn.hutool.core.io.file.FileWriter; |
application.yml
配置启动就可以了application.example.yml
示例配置# Copyright 1999-2019 Seata.io Group. |
seataServer.properties
script\config-center\config.txt
然后改改就行#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html |
script\server\db
一般的pom文件:
<dependency> |
然后应用服务配置seata
seata: |
]]>其中
default_tx_group
是如上seataServer.properties
里面配置的事务组
字符集 | 字数 | Unicode 编码 |
---|---|---|
基本汉字 | 20902字 | 4E00-9FA5 |
基本汉字补充 | 90字 | 9FA6-9FFF |
扩展A | 6592字 | 3400-4DBF |
扩展B | 42720字 | 20000-2A6DF |
扩展C | 4154字 | 2A700-2B739 |
扩展D | 222字 | 2B740-2B81D |
扩展E | 5762字 | 2B820-2CEA1 |
扩展F | 7473字 | 2CEB0-2EBE0 |
扩展G | 4939字 | 30000-3134A |
扩展H | 4192字 | 31350-323AF |
康熙部首 | 214字 | 2F00-2FD5 |
部首扩展 | 115字① | 2E80-2EF3 |
兼容汉字 | 472字② | F900-FAD9 |
兼容扩展 | 542字 | 2F800-2FA1D |
汉字笔画 | 36字 | 31C0-31E3 |
汉字结构 | 12字 | 2FF0-2FFB |
汉语注音 | 43字 | 3105-312F |
注音扩展 | 32字 | 31A0-31BF |
〇 | 1字 | 3007 |
public class ChineseCharUtil { |
C:\Users\你的用户名\AppData\Roaming\Tencent\WeChat\XPlugin\Plugins\WMPFRuntime
要退出微信才能删除成功
<script src="你的网站路径/tinymce/tinymce.min.js"></script>
|
"/tinyImage","tinyFile"}) (value = { |
详细用法:
# 查看命令使用 |
常见问题:
用法:
# 获取命令的详细帮助 |
npm install crypto-js -S
// 引入单个库 |
// Crypto-JS 支持 MD5、SHA、RIPEMD-160、HMAC、PBKDF2、AES、DES、3DES(Triple DES)等 |
-
]]>来自:百度百科
地址相关:
安装服务 |
语法 | 描述 |
---|---|
CREATE | 创建节点,关系和属性 |
MATCH | 检索有关节点,关系和属性数据,要匹配的图形模式。这是从图形中获取数据的最常见方法。 |
RETURN | 返回查询结果 |
WHERE | 提供条件过滤检索数据 |
DELETE | 删除节点和关系 |
REMOVE | 删除节点和关系的属性 |
ORDER BY | 排序检索数据 |
SET | 添加或更新标签属性 |
MERGE | 创建节点,关系和属性 |
// 方式一: 格式 |
// 创建大话西游两部电影节点 Movie |
ACTED_IN 代表关系类型,表演的意思,DIRECTED 也是关系类型,导演
// 查询所有节点 |
|
|
|
和DELETE的主要区别
// 删除 节点name=莫文蔚的born属性 |
// 查询 Person所有节点,按born升序返回 |
// 上面删除了吴孟达的关系属性roles,现在重新给他加上 |
UNION
的意思是合并,可以将不同的结果合并成一组结果UNION ALL
也是合并,和UNION
不同的是:UNION
会去重,UNION ALL
不会// 合并 Person类型和Movie类型,不同字段名,所以需要用as 使用别名 |
// 这个是创建节点不成功的,因为Person已经有name=周星驰的节点了 |
// 创建意中人关系的A、B节点 |
常用函数有:
字符串函数
数字相关函数
关系函数
STARTNODE
ENDNODE
ID
TYPE
// 朱茵的 eName 大写返回 |
// 创建一个以 Person类型的name属性为索引 |
apoc-4.4.0.8-core.jar
(不同版本,这里的名称也不同)复制到plugins目录下即可conf/neo4j.conf
配置文件中添加:dbms.security.procedures.unrestricted=apoc.*
RETURN apoc.version()
就会返回apoc的版本(说明成功)call apoc.help("apoc");
返回apoc的函数相关信息// apoc 的命令帮助文档 |
apoc.conf
apoc.conf
配置文件放在Neo4j安装目录的conf目录下apoc.import.file.enabled=true |
import
目录。neo4j.conf
内容中看到:dbms.directories.import=import
(可修改)①、导入:
导入的语法格式:apoc.import.csv(<nodes>, <relationships>, <config>)
属性 | 描述 | 示例 |
---|---|---|
fileName | 文件所在位置,string类型 | 'file:/persons.csv' |
labels | 节点的标签,是一个数组类型 | ['Person', 'Movie'] |
属性 | 描述 | 示例 |
---|---|---|
fileName | 文件所在位置,string类型 | 'file:/persons.csv' |
type | 关系类型 | 'WORKS_AT' |
属性 | 类型 | 默认 | 描述 |
---|---|---|---|
delimiter | String | , | 列之间的分隔符字符 |
arrayDelimiter | String | ; | 数组中的分隔符字符 |
ignoreDuplicateNodes | Boolean | false | 对于重复的节点,仅加载第一个节点并跳过其余节点(真)或导入失败(假) |
quotationCharacter | String | “ | |
stringIds | Boolean | true | 将 ID 视为字符串 |
skipLines | Integer | 1 | 要跳过的行(包括标题) |
ignoreBlankString | Boolean | false | 如果为 true,则忽略具有空白字符串的属性 |
ignoreEmptyCellArray | Boolean | false | 如果为 true,则忽略包含单个空字符串的数组属性,如导入工具 |
compression | Enum[NONE, BYTES, GZIP, BZIP2, DEFLATE, BLOCK_LZ4, FRAMED_SNAPPY] | null | 允许获取未压缩(值:)或压缩(其他值)的二进制数据。请参阅二进制文件示例NONE |
如果是多类型节点加关系的话,用apoc导入好麻烦,感觉用代码快多了
下面时apoc导入的官方示例:
// persons.csv 是存节点的,knows.csv 是建立关系 |
persons.csv
:ID|name:STRING|speaks:STRING[] |
knows.csv
:START_ID|:END_ID|since:INT |
②、导出:
//导出数据为movie1.csv文件,点击右边的下载按钮,文件会下载到安装目录的import目录下 |
小数据量,我们可以用Cypher语法导入
千万上亿级别的,推荐使用 neo4j-admin import
来看栗子:演员 -出演->电影
我们现在需要准备3个csv文件:演员节点文件、电影节点文件、演员与电影的关系文件
演员节点文件:actors.csv
,内容大致如下:
personId:ID,username,:LABEL |
personId:ID
中的:ID
代表是节点的id,之后的关系连接也是用这个字段
username
是这个节点的属性字段:名字,如果需要多个属性,可以往后添加列
:LABEL
代表生成的节点Label叫什么,如果有多个Lable用;
隔开
电影节点文件:movies.csv
,内容如下:
movieId:ID,title,year:int,:LABEL |
movieId
代表节点ID,
title
和year:int
代码节点的属性,year:int
代表year
这个属性是int
类型的。
:LABEL
和演员节点一样意思,代表生成的节点Label叫什么,后期不再介绍
演员与电影关系文件:rel.csv
:START_ID
代表建立关系的开始节点ID
role
就是关系的属性,多个就在后面多加几列即可
:END_ID
代表建立关系的结束节点ID
:TYPE
代表关系的Label名称
当文件准备好,我们就可以使用命令导入了,把上面的3个文件放到neo4j安装目录下的import
目录下
在neo4j安装目录下的bin目录下有:neo4j-admin
可执行程序执行它,命令如下:
neo4j-admin import --database=neo4j --nodes=import/actors.csv --nodes=import/movies.csv --relationships=import/rel.csv --force=true --skip-duplicate-nodes=true |
--database
导入到哪个库--nodes
代表存放节点数据的文件,包含header(列头就是属性名)--relationships
代表存放节点之间的关系文件--force
代表在导入之前强制删除任何现有数据库文件--skip-duplicate-nodes
代表 确定是否跳过导入具有相同 ID/组的节点--skip-bad-relationships
代表允许跳过引用关系缺失节点ID(找不到节点)--multiline-fields
表示输入源中的字段是否可以跨越多行,即包含换行符--delimiter
表示csv数据中值之间的分隔符导入成功如下:
来自官网的一个介绍,简单的说就是,让开发人员更方便的操作 PDF。
22.7.1
2022年8月5号发布的。<repository> |
<dependency> |
import javassist.*; |
cracked
的jarresources/lib
下面的。<dependency> |
Invoke-WebRequest
这个命令,会报错:'Invoke-WebRequest' 不是内部或外部命令,也不是可运行的程序
下载minio.exe ,保存到 D:\package\minio.exe |
Identity
–> Service Accounts
–> Create service account
<dependency> |
import cn.hutool.core.io.file.FileWriter; |
easyexcel
easyexcel-test
模块中com.alibaba.easyexcel.test.demo
这个包下的导入POM文件
<dependency> |
然后就可以开始使用了:EasyExcel 这个工具类了。
/** |
如上是最简单的用法,复杂用法可参考com.alibaba.easyexcel.test.demo
这个包下示例
Poi-tl
版本 | POI版本 | JDK版本 |
---|---|---|
1.12.0 Documentation(当前最新版本) | Apache POI5.2.2+ | JDK1.8+ |
1.11.x Documentation | Apache POI5.1.0+ | JDK1.8+ |
1.10.x Documentation | Apache POI4.1.2 | JDK1.8+ |
1.10.3 Documentation | Apache POI4.1.2 | JDK1.8+ |
1.9.x Documentation | Apache POI4.1.2 | JDK1.8+ |
1.8.x Documentation | Apache POI4.1.2 | JDK1.8+ |
1.7.x Documentation | Apache POI4.0.0+ | JDK1.8+ |
1.6.x Documentation | Apache POI4.0.0+ | JDK1.8+ |
1.5.x Documentation | Apache POI3.16+ | JDK1.6+ |
引入POM
<dependency> |
然后我们要先创建一个word模板,如: template.docx
比如我们在模板中,编写一个: Java如何操作办公软件
我们简单的导出代码如下:
XWPFTemplate template = XWPFTemplate.compile("template.docx").render( |
/
。
,标签位置在:图表区格式—> 可选文字—>(新版本Microsoft Office标签位置在:编辑替换文字-替换文字)
。替换文字
。ChartSingleSeriesRenderData pie = Charts.ofPie("编程语言分类", |
aspose-cells-8.5.2.jar
包的。import com.aspose.cells.License; |
license.xml
内容如下:
|
pdfbox
或 e-iceblue
或 Aspose.PDF for Java
<dependency> |
public static void main(String[] args) throws IOException { |
<dependency> |
import com.spire.pdf.PdfDocument; |
有机会再补充
ForkJoinPool
它和ThreadPoolExecutor
一样,也实现了Executor和ExecutorService接口。/** |
/** |
spring-boot-devtools
与 JRebel插件
spring-boot-devtools 与 JRebel 对比
licensing service
(许可服务器)http://idea.lanyus.com:80
./ReverseProxy_windows_amd64.exe -l "0.0.0.0:8081" -r "http://idea.lanyus.com:80"
http://127.0.0.1:8888/{guid}
ctrl + shift + alt +/
这四个键, 点击registry
,将compiler.automake.allow.when.app.running
这个选项勾选上rebel.xml
文件,这个文件可以忽略掉不用管。完结撒花 ❀
]]>逆波兰表达式
。刚好可以满足我想要的结果。J・卢卡西维兹(J・ Lukasiewicz)
于1929年首先提出的一种表达式的表示方法 。( 1 + 2 ) * ( 3 + 4)
,加减乘除等运算符写在中间,因此称呼为 中缀表达式。(* (+ 1 2) (+ 3 4))
,将运算符写在前面,因而也称为前缀表达式。((1 2 +) (3 4 +) *)
,将运算符写在后面,因而也称为后缀表达式。栈
结构,我们怎么把中缀表达式转成计算器更容易处理的后缀表达式呢?数字
或者 运算符
放到同一个List中
|
拆分成项:[(, 1, +, 2, ), *, (, 3, +, 4, )] |
虽然对自己代码也算自信,但是多重防护还是有必要的
crontab -l
no crontab for root
或者 显示当前的任务列表 或者 不报错 那说明已经安装# 安装crontab |
/etc/crontab
%
是代表着换行,所以需要转义* * * * * root echo \"test-$(date '+\%Y\%m\%d\%H\%M\%S') info\" >> /root/cron.log
crontab -e
命令编辑* * * * * echo \"test-$(date '+\%Y\%m\%d\%H\%M\%S') info\" >> /root/cron.log
/var/spool/cron/
目录下以当前用户名字命名的文件/var/spool/cron/root
这个文件
|
monitor
方法就是监控程序执行的cron.log
日志文件中crontab -e
添加内容:*/1 * * * * /home/met/server.sh monitor
优点:
从8.3版本开始支持位图索引。
受欢迎程度
PostgreSQL 数据库写着太长了,以下简称 PG 数据库,哈哈
# 安装yum 源 |
/usr/pgsql-13/
,数据目录在:/var/lib/pgsql/13/data/
postgres
,密码随机,但是psql可以连接。psql
连接数据库,但是需要切换到 postgres
用户。修改postgres的默认密码:
postgres
用户,执行、psql
进入控制台。\password
,然后按提示输入你要修改的密码即可。postgres
用户,执行、psql
进入控制台。# 切换到postgres 库 |
还有其他命令
如,关闭重启服务,如下:
# 重启PG数据库 |
YUM安装到这基本就结束了
|
Ⅰ、配置postgres用户环境变量
.bash_profile
文件vim /home/postgres/.bash_profile |
/postgresql/data
是PG数据库的存放数据目录Ⅱ、初始化数据库
# 创建PG数据库的数据目录 |
psql
登陆到控制台了,后面的操作就可以yum按照一样了。常用命令:
pg_ctl start |
pg_hba.conf
和 postgresql.conf
配置文件1、修改pg_hba.conf
# 新增如下,把192.168.32.1 改成你所在的网段即可 |
2、修改postgresql.conf
listen_addresses='localhost'
改成 listen_addresses='*'
pg_ctl restart
记得把系统防火墙放开,默认的PG数据库端口是 5432
# 设置密码 |
# 安装依赖 |
lsscsi
查看SCSI设备信息(必选) mtx
操作带库机械臂(必选) mt-st
– 操作带库的驱动(必选) sg3_utils
、iscsi-initiator-utils
用于使用 SCSI 命令集的设备的实用程序scsi-target-utils
安装stgt以便将磁带机分配给其他服务器上的备份软件使用开启iSCSI服务:
# centos6 |
sysstat
Linux系统管理工具包(可选)Github地址:https://github.com/markh794/mhvtl
使用Git下载源码:git clone https://github.com/markh794/mhvtl.git
下载之后,大致目录如下:
# 根据内核,安装对应的内核开发工具,如果对应的内核没安装成功,可能会导致后面的步骤安装失败 |
# 把mhvtl加入开机自启动计划 |
命令: lsscsi -g
|
类型为:mediumx
为两个磁带机(机械手),例: /dev/sg6
、/dev/sg2
/dev/st5
、/dev/st4
、/dev/st2
、/dev/st1
分别表示·/dev/sg6
的磁带驱动器,刚好对应从0索引开始/dev/st3
、/dev/st0
、/dev/st7
、/dev/st6
分别表示·/dev/sg2
的磁带驱动器,刚好对应从0索引开始类型为:tape
的就是磁带驱动器,8个驱动器
-g显示SCSI通用设备文件名称 |
# 查看机械手状态: mtx -f /dev/sg6 status |
# 装载磁带命令格式:mtx -f <机械手设备号> load <slots> <drive> |
# 向驱动器读数据,假如磁带上没有任何文件,则列目录会报错,忽略即可。 |
# 移动磁带,从 8 插槽移动到2插槽 |
Usage : vtlcmd <DeviceNo> <command> [-h|-help] |
vtlcmd <DeviceNo> <command>
# 列出可以操作的磁带 |
Usage: mktape [OPTIONS] [REQUIRED-PARAMS]Where OPTIONS are from: |
# -l 是虚拟带库的ID,-m 是条形码,-s 是磁带容量,-t是磁带存储类型,-d 是磁带型号 |
简介
iSCSI target
:就是储存设备端,存放磁盘或 RAID 的设备,目前也能够将 Linux 主机仿真成 iSCSI target 了!目的在提供其他主机使用的『磁盘』iSCSI initiator
:就是能够使用 target 的客户端,通常是服务器。 也就是说,想要连接到 iSCSI target 的服务器,也必须要安装 iSCSI initiator 的相关功能后才能够使用 iSCSI target 提供的磁盘就是了所需软件与软件结构
CentOS 将 tgt 的软件名称定义为scsi-target-utils
,因此你得要使用 yum 去安装他才行。至于用来作为 initiator 的软件则是使用 linux-iscsi 的项目,该项目所提供的软件名称则为iscsi-initiator-utils
。所以,总的来说,你需要的软件有:
scsi-target-utils
:用来将 Linux 系统仿真成为 iSCSI target 的功能;iscsi-initiator-utils
:挂载来自 target 的磁盘到 Linux 本机上。那么 scsi-target-utils 主要提供哪些档案呢?基本上有底下几个比较重要需要注意的:
/etc/tgt/targets.conf
:主要配置文件,设定要分享的磁盘格式与哪几颗;/usr/sbin/tgt-admin
:在线查询、删除 target 等功能的设定工具;/usr/sbin/tgt-setup-lun
:建立 target 以及设定分享的磁盘与可使用的客户端等工具软件。
/usr/sbin/tgtadm
:手动直接管理的管理员工具 (可使用配置文件取代);/usr/sbin/tgtd
:主要提供 iSCSI target 服务的主程序;/usr/sbin/tgtimg
:建置预计分享的映像文件装置的工具 (以映像文件仿真磁盘);其实 CentOS 已经将很多功能都设定好了,因此我们只要修订配置文件,然后启动 tgtd 这个服务就可以了! 接下来,就让我们实际来玩一玩 iSCSI target 的设定吧!
# 目标端,服务端 |
# 查看磁带库设备相关信息 |
# 将机械臂和驱动器通过ISCSI的方式映射出去 |
# 服务发现 |