xattr 命令清除 app 的隔离属性
macOS 中如果安装一些修改版或破解版软件,通过拖拽方式放到 application 目录,在打开 app 的时候可能提示程序无法运行,通常我们在系统 preference - security 里可以手动允许运行,但是有时候使用这种方法也无法打开,这是由于系统识别到这个 app 可能有问题所以给它加上了 com.apple.quarantine 隔离属性阻止了他的运行。
如果我们需要运行它,就需要删除 app 的 com.apple.quarantine 属性,可以使用 xattr 来处理。
macOS 上的文件不只有 “normal” 属性,也有 “读”, “写”, “执行” 等其他属性。常规属性可以用 ls -l myfile 命令来查看。除此之外还可以定义扩展属性,扩展属性的修改可以用 xattr 来处理。
命令语法如下:
1xattr [options] attributes [files]
可用 option:
123456789101112131415-c CLear all Atrributes.-d Delete the given attribute.-h ...
jds实现方式
上一篇文章中我们介绍了JAVA 简单同步框架的诞生,这一次我们介绍下其是如何实现的。本文基于 1.0.1-SNAPSHOT 版本进行说明。
回顾考虑JDS JAVA Data Sync 数据同步框架 中提到的几点:
数据分发 ,偏移量持久化
重试机制
消息持久化
偏移量持久化实际场景中服务会停机,服务重启的时候需要重新读取最新的数据偏移量状态(最后同步到了哪条记录),需要从最后同步的那条记录开始继续同步
重试消息分发过程中可能会遇到各种问题,比如网络抖动,目标服务停止,业务逻辑出错等等。数据在某些场景下需要重发,而有些场景可能不需要重发;重发也需要考虑间隔问题,不能一直死循环重发
消息持久化基于上面2条,自然还需要将消息进行持久化,否则服务重启会造成要同步的数据丢失。
架构
主要分为2大模块(逻辑上)
Core 提供API接口和数据处理逻辑
存储层 提供数据持久化能力(包括待分发数据和偏移量)
Core 模块核心模块,提供了 API,数据处理的能力。接收用户数据,传输给底层存储;启动分发任务,调用用户逻辑进行数据处理;失败数据进行重试;分发成功调用存储层持久化偏移量 ...
JAVA简单数据同步框架
JAVA 简单数据同步(传输)框架
为了保持代码样式和格式,所有代码使用了图片;使用到的相关代码见文末
背景A服务(称为上游服务)推送了数据过来后,需要服务转发数据给B,C,D(称为下游服务)。上游服务发送成功后就不关心这个数据了,需要本服务负责将这些数据安全的转发给下游服务。
但是下游服务中的任一个任何时刻都有可能出现问题,比如网络不通,服务停机维护等。所以需要本服务在提供转发数据的同时,尽可能减少其他服务的影响(B停机不影响C和D的转发),需要并行分发,同时提供重试机制。
需要考虑的问题在介绍具体方案前,先考虑下这个场景需要考虑的问题
主要为以下2条:
数据分发 ,状态同步
重试机制
数据分发,状态同步同一条源数据(待同步数据)需要能够分发给B、C和D。分发的过程需要并发进行,不能相互影响;由于分发任务相互独立,分发的进度也就基本上是不一致的,可能 B 已经分发到了第10条,C 分发到了第20条,D 才分发到第2条,那么每个任务的消费记录id需要分别记录。
重试机制因为是分发给下游其他服务,不可避免的会遇到下游服务网络或者维护等情况,这种情形下,当前这一条数据分发 ...
门面日志框架之slf4j
在上一篇中,我们介绍了各种日志框架和其作用,本篇将介绍门面日志框架中的slf4j。
简介slf4j 是 Simple Logging Facade for Java 的缩写(java简单门面日志),其官方网站为 http://www.slf4j.org/ 。它作为各种实现日志框架的一个接口存在,允许用户在部署的时候方便的替换具体的实现日志框架,而不需要重新修改代码中的log部分。
其他门面框架对比除了slf4j,还有一个非常常见的门面框架JCL(Apache Jakarta Commons Logging)。相比JCL, slf4j使用的是静态绑定,JCL使用的是ClassLoader方式。slf4j的方式避免了 JCL 中存在的因为Classloader导致的内存泄露问题,并且更为高效。
版本最新稳定 1.7.32, 开发版最新为2.0.0(使用了java8的 serviceloader 方式加载绑定)。这里我们使用的是最新稳定版 1.7.32 。
使用使用slf4j方式非常简单,只需要引入 *slf4j-api-${latest.stable.version}. ...
java日志框架简介
java日志框架简介
这个图片和本文没有任何关系,唯一有用的可能是让你的眼睛放松一下。
日志框架主要分为3大类
门面日志框架(Logging Facade Framework)
实现日志框架(简称日志框架 Logging Framework)
日志桥接框架(或者叫做适配)
门面日志框架 Logging Facade简而言之门面日志框架只提供接口,不负责日志的最终解析和输出。用户使用的时候只需要关心这个门面日志的接口,不需要调用其他日志框架接口。
主要阵营:
slf4j(Simple Logging Facade for Java http://www.slf4j.org )
commons-logging (apache)
实现日志框架最终负责日志解析和内容输出的框架,比如输入 log.inf(“一行日志,用户名:{}”, username),它负责解析和输出为(实际跟日志格式定义有关):
2021-12-19 21:28:30 INFO main 一行日志,用户名:sdvdxl
主要阵营:
Log4j
JUL(jdk-logging)
Log4j2
...
log4j 漏洞攻击
事情起因于前几天(2021-12-10号)被全球广泛应用的组件Apache Log4j被曝出一个高危漏洞,攻击者仅需一段代码就可远程控制受害者服务器的事件。受影响的版本为 Apache Log4j 2.x <= 2.14.1。
其实这个本来算是log4j的一个特性,这个玩意在log4j里面叫做 lookup,简而言之可以使用一些特定的变量进行数据处理包括远程调用。但也因为这个特性,如果是用户填写的内容被解释了,那么可能会造成远程调用,造成执行任意代码的危害,接下来我们演示下怎么重现这个问题。
代码已经放在了码云-sdvdxl上,该工程是 maven+springboot项目,建议使用 idea 或者 eclipse 打开操作和运行程序(本人使用 mac + idea 作为开发调试环境)
仅供技术学习交流使用,切勿用来进行非法行为!如果因此造成危害,后果自付!
log4j远程执行过程方便起见,这里使用了 spring-start 创建了一个 springboot 项目,完整代码参见上面连接。
该演示工程主要分为两部分:
RMI Server(参见源码 top.todu.log ...
java-web程序模拟time_wait
tcp close_wait 模拟https://start.spring.io/ 创建一个基本的web工程
程序只添加一个java代码:
12345678910111213141516171819package top.todu.top.demo;import java.util.concurrent.TimeUnit;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class Controller { @GetMapping("/") public void c() { // 无限等待,故意造成请求未结束 try { TimeUnit.DAYS.sleep(24); } catch (InterruptedException e) { e ...
mysql知识点
MySQL 中有哪几种锁(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。
(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 低,并发度也最高。
(3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表 锁和行锁之间,并发度一般。
MySQL 中有哪些不同的表共有 5 种类型的表:
(1)MyISAM
(2)Heap
(3)Merge
(4)INNODB
(5)ISAM
简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别MyISAM:
(1)不支持事务,但是每次查询都是原子的;
(2)支持表级锁,即每次操作是对整个表加锁;
(3)存储表的总行数;
(4)一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件;
(5)采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。
InnoDb:
(1)支持 ACID 的事务,支持事务的四种隔离级别;
(2)支持行级锁及外键约束:因此可以支持写并发;
(3)不存储总行数:
(4)一个 ...
redis知识点
入门级 Redis 试题试题一:为什么使用 redis?分析: 博主觉得在项目中使用 redis,主要是从两个角度去考虑: 性能和并发。当然,redis 还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件 (如 zookpeer 等) 代替,并不是非要使用 redis。因此,这个问题主要从性能和并发两个角度去答。回答: 如下所示,分为两点(一)性能我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
(二)并发在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 redis 做一个缓冲操作,让请求先访问到 redis,而不是直接访问数据库。
参考资料疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 面试必备 + 面试必备
Redis 基础试题
Redis 有哪些数据结构?
字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet。如果 ...
jvm知识点
元空间会产生内存溢出么?在什么情况下会产生内存溢出?
具体问题:元空间会产生内存溢出么?在什么情况下会产生内存溢出?
java8 及以后的版本使用 Metaspace 来代替永久代,Metaspace 是方法区在 HotSpot 中的实现,它与持久代最大区别在于,Metaspace 并不在虚拟机堆内存中而是使用本地内存。
永久代(java 8 后被元空间 Metaspace 取代了)存放了以下信息:
虚拟机加载的类信息
常量池
静态变量
即时编译后的代码
出现问题原因错误的主要原因, 是加载到内存中的 class 数量太多或者体积太大。
如果服务中有动态编译代码(比如js)的地方,则会造成metaspace占用增加。
解决办法增加 Metaspace 的大小
1-XX:MaxMetaspaceSize=512m
代码演示模拟 Metaspace 空间溢出,我们不断生成类往元空间灌,类占据的空间是会超过 Metaspace 指定的空间大小的
查看元空间大小
1java -XX:+PrintFlagsInitial | grep Metaspace
-XX:+PrintFlag ...