ABAC权限设计
这里我使用ABAC理论来设计:
数据库表设计
用户属性:
```sqlCREATE TABLE User(userId int,userName varchar(100),roleId int);
- 环境属性
- ```sql
CREATE TABLE Role
(
roleId int,
roleName varchar(100) # 比如:普通用户,付费用户,积分等级
);
操作属性:
```sqlCREATE TABLE action(actionId int,actionName varchar(100) # 比如:read读,write评论);
- 试读
- 付费读
- 免费读
- 评论
- Resources属性:
- ```sql
CREATE TABLE module # 我们最终操作的资源,例如查看的文章,数据
(
moduleId int,
moduleName varcha ...
opencv环境搭建
opencv 入门环境下载与搭建Windows用户直接在官网下载 Windows 文件:https://opencv.org/releases/ 。然后参考这篇文章:https://blog.csdn.net/qianlixiaomage/article/details/108416400。说实话Windows上操作太方便了。我用Mac捣鼓了半天,气死。
Mac用户直接在官网下载 Sources 文件:https://opencv.org/releases/ 。并进行解压。
下载cmake:brew install cmake
下载Ant:https://www.jianshu.com/p/bdca5215e9ca 这里是必须的,如果没有,最后无法生成jar包
cd opencv-4.7.0 # 这里是opencv源码包解压的文件地址
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. # 这俩点表示OpenCV的源码位置,不能省略
...
多线程事务
多线程事务 在Spring开发时,遇到一个从Excel表导入数据到数据库的需求,当然最简单的方法就是先使用EasyExcel把数据读出到集合中,然后依次插入到数据库中。但如何保证效率,原子性呢?我们一步步优化方案。这里会涉及到分布式事务的知识,如果感兴趣可以看我之前的文章:玲辰书斋,这里不会引入不必要的组件,而是我们自己模拟类似的思想。
方法1:依次顺序插入
void test() {
List<User> users = getAllUsers();
users.forEach(user -> userService.save(user));
}
方法2:使用批处理,一次操作中执行多条SQL
void test() {
List<User> users = getAllUsers();
userService.saveBatch(users);
}
方法3:使用多线程+批处理,每个线程插入多条数据
需要注意的一点,Spring容器不允许线程注入,也就是没办 ...
手写非公平锁(ReentrantLock)
手写非公平锁(ReentrantLock) ReentrantLock很多教程都在讲解,虽然很细致,但内容太多了,过段时间就很容易忘,我们知道ReentrantLock的核心是AQS(抽象队列同步器),我们这里试着使用AQS,自己写一个非公平锁使用,看看AQS承载了哪部分的职责,ReentrantLock承载了哪部分的职责
第一步:定义接口,面向接口编程嘛
public interface myLock {
// 很简单的加锁和释放锁
public void lock();
public void unlock();
}
第二步:看看ReentrantLock与AQS的关系
public class myUnFairLock implements myLock {
private final Sync sync = new Sync();
// 锁的核心由AQS管理,ReentrantLock只负责重写 tryAcquire 和 tryRelease方法的逻辑
private stat ...
Rails基础
Ruby On Rails基础介绍 Rails可以理解为一个快速构建Web应用的框架,本身基于Ruby开发,拥有很强的灵活性。
如何下载与使用Rails? 这里的前提是你已经下载好了Ruby
gem install rails # 通过ruby工具(当成功下载并使用Ruby时,该工具会一同配置好的) 下载 rails
rails -v # 如果正常下载则显示Rails版本
这里我在Mac上下载好rails并使用时,遇到了报错显示,显示rails还没有立刻被下载成功,需要再执行上面下载命令(但是并没什么用,至少我是这样,有的人说是有一个延迟时间):
Rails is not currently installed on this system. To get the latest version, simply type:
$ sudo gem install rails
You can then rerun your "rails" command.
这里我的解决方式为:
gem env # 显 ...
Shell的常规使用
shell的分类
/bin/bash 是我们在linux或者Mac下常用的shell
zsh 是一种增强shell,在Mac和Linux中可使用,Mac基本自带
日常文件操作
ls :显示文件
cd :进入文件夹
cp :拷贝文件
mv :重命名或迁移文件
cat :查看文件内容,并在控制台打印
head:查看文件头部信息,可指定多少行
tail :查看文件尾部信息,可指定行数,并且可跟踪日志文件
grep:查找过滤,一般用在 操作 | grep , | 表示管道符,将操作的返回的数据,通过grep进行过滤
fgrep : 无正则查询,普通查询快
egrep :有正则查看
shell的快捷键
↑ ↓ 会回显之前执行的代码。默认记录500条
ctrl + R , 快速查看之前执行的命令
ctrl + W,将已输入的命令,以空格划分,每次向前删除一部分
ctrl + U,删除已输入命令所有部分
ctrl + A,将光标移动到最前(已输入内容)
ctrl + E, 将光标移动到最后
ctrl + K,向右删除所有
ctrl + D,向右删除一位
ctrl + L ...
Ruby元编程
本文需要在了解Ruby基本语法的前提下,进行学习
元编程是什么? 元编程是编写能在运行时操作语言构件的代码
在我们使用编辑器编写代码后,代码按照我们所写的内容进行编译,运行。在启动后我们无权再对代码进行干涉,而在一些业务场景中,我们想在不修改源代码的前提下,对一个类进行增强,这在Java中也是一个成熟的技术,例如反射,动态代理。但是Java所能给予的操作相比Ruby,就显得格外的严格且复杂。
Ruby是一门可以在运行时操作语言构建的工具。语言构建就是我们代码中的各个成员(对象,类,模块儿,实例变量等)。通俗来说可以使用Ruby在运行时对已有的类进行灵活的修改,例如修改一个方法的定义。实例变量的定义,甚至我们可以在运行时创建一个没有的类。下面我们使用一些伪代码来进行演示。
我们想对数据库进行操作,最初我们的想法就是写一个Entity基类,然后由子类继承
class Entity
# 提供访问器
attr_accessor :table,:id
def initialize table,id
@table = table
@id = ...
查找算法的演化过程
查找算法的演化过程顺序查找 字面意思,一个个节点查找判断,对数据条件没什么要求,最简单,也最慢。
/**
* 顺序查找
* @param arr 数组
* @param target 目标值
* @return 下标
*/
public static int getIndex(int[] arr, int target) {
// 记录比较多少次找到目标值
int index = 0;
for (int i = 0; i < arr.length; i++) {
index++;
if (arr[i] == target) {
System.out.println("顺序查找次数:" + index);
return i;
}
}
return -1;
}
二分查找 如果我们能让数据有序,我们先找中间数,如果目标值大于中间数,则从中位数往 ...
Java内存模型与线程
Java内存模型与线程
上面的图就是线程,工作内存,主内存的关系,也可以看到线程想要获取数据,需要先到工作内存找,工作内存从主内存中找,那为啥需要这个工作内存 ? 而不直接访问主内存,也可以避免数据不一致的情况了。
这就需要我们对物理计算机中如何并发访问有一点儿了解,我们知道CPU内含有寄存器,但寄存器能存放的内容太少,而大部分时间都要从内存中获取,如果等待从内存中取得数据,CPU又被浪费了,因为两者间的速度差太多,所以引入了高速缓存。
除了增加高速缓存外,为了处理器内部的运输单元能被充分利用,处理器会对输入代码进行乱序执行,在计算后将乱序执行的结果重组,保证该结果与顺序执行的结果一致。而潜在的风险就是一个计算任务依赖另一个计算任务的中间结果,其顺序性不能靠代码的先后顺序来保证,而Java内存模型也保留了这一点,我们也可以看到上面两幅图结构是非常相似的。所以Java内存模型的定义也是由硬件决定的。
内存间交互操作 也就是图1中,线程,工作内存,主内存数据是怎么交互的,Java内存模型定义了8个操作,每个操作都是原子 ...
SQL语句: where 和 having 的区别
SQL语句: where 和 having 的区别
分组查询时,select的字段(不包含聚合函数的字段)是否一定要都在group by的字段中?
例如:
select name,age,sum(money) from user group by
上面所说情况在Mysql5.7之后:sql_mode=only_full_group_by 情况下适用,可以通过 select @@sql_mode;查询自己的sql_mode
解决方案:
修改sql_mode,删除:SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');(不推荐)
group by 主键字段
group by 唯一非空字段
select 字段集合 from table group by 相同字段集合
select @@sql_mode;
SET @@sql_mode = sys.list_add(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_dr ...

