0%

Linux 用户和权限

用户

两个概念,用户用户组

每个用户帐号都拥有一个唯一的用户名和口令。

用户的增加, 删除

用户增加: useradd

用户删除 userdel

实例:

增加一个sam帐号, 主目录为 /home/sam:
useradd -d -m /home/sam sam

删除帐号:
userdel sam

修改帐号

用户的配置项目大致有几个:

  1. shell
    sudo usermod -s /bin/zsh sam
    sudo usermod -s /bin/false sam则没有shell
  2. 密码
    sudo usermod -p sam
  3. 主目录
    usermod -d /home/sam sam

权限

查看权限

In UNIX, every thing is file.

任何文件有三种权限: 读(w),写(r),执行(x).

特殊权限:
s 表示 该文件在执行阶段, 拥有文件所有者的权限.
t 任何用户可以在该目录新建文件,
但只能删除自己的文件, s/t 会占用 x 的位置

使用ls -l查看当前目录下的所有文件及其权限.

例如有
drwxrwxr-x 2 user usergroup 4.0K 9月 30 09:59 dir

第一项drwxrwxr-x固定长度为10.
第一位标志该文件类型. d 为 目录. - 为文件. l 为链接.
剩余9位分为三组, 每组为rwx, 若有-说明没有此权限.

第一组表示为文件所有者的权限,
第二组为所属组权限,
第三组是其他人的权限.

修改权限

直接修改文件权限

使用chmod修改文件权限
sudo chmod [ugoa][+-=][rwx] file

ugoa 含义
u 所有者
g 所属组
o 其他人
a 所有

或者使用”八进制”语法: 4 = r, 2 = w, 1 = x
例如要使文件获得rwxrwx--x 则为 771

修改文件所有者

sudo chown user file


参考:

systemctlsystemd的一个工具.

systemdlinux用来守护进程的。ddaemon(守护进程)

我们通过systemctl命令管理守护进程.

systemctl 命令

1
sudo systemctl start/stop/enable/reload unit.service

使用上述命令开启/停止/设置自启动/重载 某个服务。

sudo systemctl daemon-reload 重载修改过的配置文件.

Unit

systemd对每项系统资源称为unit.

一共有12种Unit.

  • Service unit:系统服务
  • Target unit:多个 Unit 构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定时器

本文中我们只关注用的比较多的ServiceTimer

Unit 配置

Unit配置文件通常在/usr/lib/systemd/system/中。

一个.service文件:

1
2
3
4
5
6
7
8
[Unit]
Description= # 描述
Documentation= # 文档地址
Requires= #依赖于其他service
[Service]
ExecStart= # 执行地址
[Install]
WantedBy= # target

Requires中写的是其他unit,如果其他unit未运行,本unit将启动失败。

WantedBy一般写的是multi-user.target

Targetsystemd用以代替RunLevel的,multi-user.targetinit 3(多用户,系统正常启动)

一个Unit想要能被启动,必须有Install

Timer 配置

除了基础的[Unit]``[Install]
还需要有

1
2
3
[Timer]
OnUnitActiveSec=1h
Unit=mytimer.service

  • OnActiveSec:定时器生效后,多少时间开始执行任务
  • OnBootSec:系统启动后,多少时间开始执行任务
  • OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
  • OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
  • OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
  • OnCalendar:基于绝对时间,而不是相对时间执行
  • AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
  • Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
  • Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
  • WakeSystem:如果系统休眠,是否自动唤醒系统

参考:

爱的艺术

[美] 弗洛姆著

这是一本相当不错的书,解决了困扰笔者已久的很多问题,受益匪浅。
现在整理出读书时做的笔记。

全文的核心论点就是:
爱是一门艺术,也就是说,爱可以通过学习和实践而掌握。

作者反对现代社会认为的几个谬误。 作者分析了爱情的要素,分析了爱的对象,也分析了现代西方社会爱情之衰亡的现象。
本文不讨论爱情的“技巧”。

实际上,按照笔者的理解,谈及爱的技巧便与真正的爱情相去甚远了。因为是爱情产生了种种“技巧”,而非“技巧”催生了爱情。按照现代流行词“PUA”来说,诚然如是。

爱的前提:

  • 有爱他人的能力
  • 谦恭
  • 勇敢
  • 有纪律

我们可以学会去爱,而非 “我们能否被爱”。不存在”被爱”的说法, 爱是一种能力。
现代社会存在爱的几个谬误:

  1. “能否被爱“。实际上,这种“爱”是赢得人心和对异性有吸引力的杂糅。
  2. “爱的问题对象的问题”。人不应该“追求爱情”。首先要给”爱“。
  3. fall in love & be in love 的区别。

学会爱这一门艺术的必要步骤:

  1. 学会爱的理论
  2. 去实践爱的理论
  3. 把成为爱的大师看作高于一切的东西。

爱的理论首先的人的理论。

人之需要爱,是因为人与生俱来的孤独感。动物是没有爱的,动物的所谓“爱”来自于其动物性。而人脱离与自然,人意识到了自我存在,人意识到自己的孤独。人需要克服这种孤寂感,实现人的统一

而克服这种孤独感有几种方式:

  • 纵欲(是暂时的,只能不断纵欲)
  • 同一组人结合(形成社会, 国家,这是人与人的假统一)
  • 创造性的劳动。(不是人与人的同意)
    实现人与人的真统一,其解决只有“爱”。

“共生有机体”:(不成熟的爱情)
消极表现 - 受虐癖;
积极表现 - 施虐癖.

成熟的爱情: 保留自己完整性和独立性的条件下, 与他人合二为一.
爱情是积极的, 首先是”给”, 其他要素: 关心, 责任心, 尊重, 认识.

爱的要素:

爱首先要给——这是创造性的,有生命力的。“给”即是“得”。
爱还要有:关心、责任心、尊重(尊重对象的独立、自由)、认识(了解爱的对象)。

父母与孩子的爱:

母亲给孩子的爱是无条件的。孩子的爱是一种消极的爱,“我被爱是因为我就是我”。

父爱是有条件的爱,必须靠努力才能赢得,是母爱的另一个极端,是“法律,秩序,纪律”,是“服从”。

爱的对象:

  • 博爱:
    一切爱的形式都以博爱为基础。对所有人都有爱。

    当我爱那些与我个人利益无关的人时,我的爱情才开始发展。

  • 母爱:
    对儿童的生活和需求做出的毫无保留的肯定。 母爱允许分离、而且促成分离(孩子长大)
  • 性爱:
    性爱要求完全彻底地实现合二为一。 是一种共同的自私。
  • 自爱:
    一切有能力爱别人的人必定也爱自己。原则上,爱自己和爱别人是不可分的。
  • 神爱: 宗教的,精神的,思想性的爱。存在一种发展过程。

现代西方社会(笔者:东方也一样),在资本主义制度下,一切社会活动以市场为基础,爱情正在逐渐衰亡,取而代之的假爱情——性满足(笔者:此处不应该理解为狭义的性满足,而存在更为广义的意义。)、结伴的思想; 把爱情看作防止孤独的避风港。

笔者:
总结一下,我们不能去“追求”爱,而是应该去“学会”爱。首先要学会“给”,首先要付出。这有点像尼采所言“赠与的道德”。在爱情中,给即是得,这是最核心的问题。爱也不是对象的问题,我们应该有博爱之精神,不存在某个特殊的“白马王子”或是“梦中情人”。两人之间的爱情应当是自发培养的。前提是,两个人是完整的人。

也正如作者对现代社会爱情的悲观态度,我一直以来也对自己的爱情呈悲观态度。一方面是我不够成熟,没有爱的能力,另一方面是现代社会,大写而完整的“人”实属是稀缺。 但最主要的是要培养自己的爱的能力,不论会不会与另一个人产生爱情。

前端踩坑 & 技巧(1)

0. 介绍

这是我的一个系列文章, 每篇技巧计划包括 5 个坑 or 技巧.

不定期更新, 不一定更新, 但一定是我在开发, 学习过程中遇到的问题.

后续有可能推出后端系列文章.

我目前正在学的前端技术栈: Vue3 + TypeScript + Sass

1. 赋值、相等、恒等 运算符:

=是赋值运算符

==是相等计算符

===是恒等计算符

1
2
3
var x = 10;
var y = "10";
if (x == y)

上述代码返回的是true.
在常规的比较中,数据类型是被忽略的。

1
2
3
var x = 10;
var y = "10";
if (x === y)

返回的是false
恒等运算符是考虑数据类型的。

2. JS中列表的sort方法默认为字典顺序

例如需要排序一个1~12的列表l

1
l.sort()

之后l为l = [1,10,11,12,2,3,4,5,6,7,8,9,10]

如果想要以数字是顺序排序, 那么需要对sort方法传入一个函数作为参数.

1
2
3
4
5
6
7
8
9
10
function compare(a,b){
if (a > b) {
return 1;
}
if (a < b){
return -1;
}
// a == b
return 0;
}

例如:

1
l.sort((a, b) => {a - b})

(为升序排序)

3. 基本包装类型

JS有 七种 基本类型:
string, number, bigint, boolean, null, undefined, symbol (symbol 是 ES2016 新增, 详见下一条)

除了 null 和 undefined 外, 其他五个基本类型都对应着一个基本包装类型:

String, Number, BigInt, Boolean, Symbol

基本包装类型顾名思义是对基本类型进行了包装. 使用ValueOf方法获得实例的基本类型值.

基本包装类型的类型是object.

4.Symbol

symbol 是 JS 的一种基本类型. 在 ECMAScript 2016 中 新增.
通过调用函数Symbol() 生成一个特殊的值, 可以作为一个对象的匿名的键.

5. 创建一个从0~N的数组

使用了Array的两个方法,
一个是from()从另一个数组创建一个新的数组.

另一个是keys()返回本数组的keys.

Array(n)可以创建一个大小为n的数组.

1
var a = Array.from(Array(n + 1).keys())

如果需要从1开始, 则

1
var a = Array.from(Array(n + 1).keys()).slice(1)

如何在v-for列表渲染出的组件中使用ref绑定到一个数组从而进行操作?

官方给出的方法是:

1
<div :ref="(el) => { divs.push(el)}"></div>

但是如果使用TypeScript, 必须定义好传入的函数的参数, 以及 divs 的类型

根据 StackOverFlow上的回答

ref接受一个联合类型Element | ComponentPublicInstance | null
(参数为联合类型, 返回值为void的)

所以应该写成类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
<div class="container">
<div class="item" v-for="i in 10" :ref="setRef">
{{ i }}
</div>
</div>
</template>
<script setup lang="ts">
import { ComponentPublicInstance, ref } from "vue";
type myType = ComponentPublicInstance | Element | null;

const divs = ref<Array<HTMLDivElement>>([]);

var setRef = (el: myType) => {
divs.value?.push(el as HTMLDivElement);
};
</script>

综述

本教程为精弘网络 2022 年暑期授课系列教程之讲义.

本文为Golang后端实战.

作者 FinleyGe

GitHub上的代码仓库

由于前面课程已经讲过了 Golang 的基础内容, 此处略去.

技术栈 & 名词解释

Gin框架: 一款轻量级, 高性能, 简单的Golang后端开发框架.

Gorm框架:

ORM: Object–Relational Mapping, 对象关系映射

对象就是Go中的struct, 关系就是MySQL中的各种表

Viper: 配置读取绑定

MySQL: 一款流行的关系型数据库

SQL: Structure Query Language 结构化查询语言

MySQL 使用 SQL 作为查询语言.

Git 一款版本控制软件. 通过Git 可以记录项目代码的变化情况.

GitHub 是 一个Git的远端管理平台, 可以在上面开源你的代码.

Apifox 一个管理API的工具, 可以方便的编写API文档, 进行测试等等.

API: Application Programming Interface 应用编程接口, 一般也简称接口. 本文后端主要面向的就是RESTful API的编程

RESTful API
Representational State Transfer API, 表征状态转移接口

统一资源接口
GET, POST, PUT, DELETE, PATCH

Method 用途
GET 查询
POST 增加
PUT 更新(传入全部信息)
DELETE 删除
PATCH 更新(传入部分信息)

1. 项目构建

  1. 项目的基本构建
    1
    2
    3
    4
    5
    mkdir class-schedule
    cd class-schedule
    vim main.go
    go mod init class-schedule
    go mod tidy

go mod 是 golang 的包管理器, 相当用 python 的pip 或者是 node.js 的 npm, yarn…

使用 go mod 创建项目 可以使用 go mod tidy 自动下载依赖包, 其下载位置在$GOPATH/pkg/mod

  1. git
    1
    git init
    即可建立一个初始化的仓库,当前这个仓库还没有任何东西.
1
vim README.md

编写一些东西

1
2
git add .
git commit -a -m 'init: first commit'
  1. 项目架构
    ├── config 配置文件
    ├── controller
    ├── db 数据库相关
    ├── go.mod
    ├── go.sum
    ├── LICENSE
    ├── main.go 入口文件
    ├── router 路由
    └── utility 工具

2. 配置管理

使用 viper 作为配置管理工具

  1. config.go
1
2
3
4
5
6
7
8
9
10
package go
import ...

type config struct {
// ...
}
var Config config
func InitConfig() {

}

访问权限控制: Go 中的访问控制为变量名, 函数名等首字母是否大写, 大写则为 Public, 小写则为 Private

yaml 文件: 相当简单的数据存储文件

3. 链接数据库

  1. 建立数据库
    1
    2
    3
    4
    sudo mycli -uroot
    create database class_schedule;
    create user 'class_schedule_admin'@'localhost' identified by 'password';
    grant all on class_schedule.* to 'class_schedule_admin'@'localhost';
    mycli: A command line client for MySQL that can do auto-completion and syntax highlighting.
  2. 链接
1
2
3
4
5
6
dsn := fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=utf8mb4&parseTime=True&loc=Local",
config.Config.DB.UserName,
config.Config.DB.Password,
config.Config.DB.Address,
config.Config.DB.DBName,
)
  1. Auto Migrate

    DSN : Data Source Name

    4. 编写Utility

  2. 密码加密解密
    bcrypt

    bcrypt : 一种非对称加密算法, 加盐hash

  3. Jwt生成和解密
    JWT

通过Jwt鉴权, 一般的鉴权是通过 Session. Session会在服务器端占用存储空间, 返回一个Session ID

而 Jwt 本质上是通过算力换空间.

  1. 响应格式化

5. 构建模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

type User struct {
UserID uint64 `gorm:"primaryKey" json:"user_id"`
Name string `gorm:"not null" json:"name" validate:"required"`
Email string `gorm:"not null" json:"email" validate:"required"`
Phone string `json:"phone"`
Password string `gorm:"not null" json:"password" validate:"required"`
School string `json:"school"`
StuID string `json:"stu_id"`
ClassAmount uint64 `gorm:"not null; default:12" json:"class_amount"`
WeekAmount uint64 `gorm:"not null; default:16" json:"week_amount"`
Classes []Class `json:"classes"`
}

type ClassInfo struct {
ClassID uint64 `json:"class_id"`
ClassInfoID uint64 `json:"class_info_id" gorm:"primaryKey"`
Week string `json:"week" validate:"required" gorm:"not null"`
Time string `json:"time" validate:"required" gorm:"not null"`
WeekDay string `json:"week_day" validate:"required" gorm:"not null"`
Address string `json:"address" validate:"required" gorm:"not null"`
}

type Class struct {
UserID uint64 `json:"-"`
ClassID uint64 `gorm:"primaryKey" json:"-"`
Name string `gorm:"not null" json:"name" validate:"required"`
ClassInfos []ClassInfo `json:"class_infos" validate:"required"`
Teacher string `json:"teacher"`
}

三个模型对应三张表(table)

关系

  1. Belong To
  2. Has One
  3. Has Many
  4. Many to Many

主键: 唯一,非空.可以标识这一列.

外键: 用于将两个表链接在一起的键.

6. CURD

Create-Update-Retrieve-Delete

7. 路由

  1. 路由初始化
  2. CORS 中间件

同源策略: 只能访问同源的资源.
同源: Scheme, Domain, Port 相同

Cors: Cross-Origin-Resource-Share 跨域资源共享

8. Controller & 中间件

Controller

  1. 用户注册 - 增
  2. 用户登陆 - 查
  3. 用户信息获取 - 查
  4. 添加课程 - 增
  5. 查询课程 - 查
  6. 更改课程 - 改
  7. 删除课程 - 删

Middleware:

  • 鉴权中间件

《如何读一本书》

是美国作家 Mortimer J. Adler 所著的一本工具性质的书。
正如书名所言,这本书就是在教导人们“如何读一本书”的。

什么是阅读

由于阅读的目的不同,我们可以把阅读分为三种:

  • 求得资讯的阅读,我们的理解力和作者的相当,所以这种阅读只能增加自己的知识,而不能增进自己的理解。
  • 求得理解的阅读,我们的理解力不如作者。所以这种阅读能增进自己的理解能力。
  • 消遣的阅读。

阅读就是学习

有两种学习方式:受人指导的学习自我启发的学习
受人指导的学习就是有老师的学习,而自我启发的学习是没有老师的。
但是学习都是有自主性的,而非被动的。
阅读和倾听都是受人指导的学习,对世界、自然的观察、总结是自我启发的学习。

阅读是老师缺席的受人指导的学习。

阅读的层次

  • 基础阅读:认字识字,知道所言为何。
  • 检视阅读(旨在了解大体内容,判断是否精读)
    • 有系统的略读或粗读(注意目录,序言,后记,附录等等。大致浏览阅读)
    • 粗浅的阅读(从头到尾读,遇到不懂的地方不停)
  • 分析阅读:本文主要讨论的问题
  • 主题阅读:面向主题的阅读,需要阅读很多同类书籍

一个读者应该提出四个基本问题

  1. 这本书整体在谈什么
  2. 作者细说了什么,怎么说的
  3. 有道理吗,全部或部分
  4. 这本书跟你有什么关系

分析阅读

分为三个阶段,每个阶段对应数个规则:

  1. 知道作者的问题是什么
  2. 构建作者的论述逻辑、以及对问题的解决程度。
  3. 评判一本书的好坏。

分析阅读的规则

  1. 第一阶段 在谈些什么
    1. 准确知道自己在读哪一类的书
    2. 用一个单一的句子,最多几句话叙述整本书的内容
    3. 列出书中的重要篇章
    4. 确定作者想要解决的问题
  2. 第二阶段 诠释阅读规则
    1. 找出重要单字,透过他们与作者达成共识。
    2. 找出一本书最重要的句子,找到主旨
    3. 架构一本书的基本论述
    4. 确定作者解决了什么问题,没有解决什么问题。
  3. 第三阶段 评论阅读规则
    1. 智慧礼节的一般规则
      1. 除非做到前面的诠释整本书,否则不要评论。
      2. 不要争强好胜
      3. 证明自己区别得出的真正的知识和个人观点的不同。
    2. 批评观点的特别标准
      1. 证明作者的知识不足
      2. 证明作者的知识错误
      3. 证明作者的不合逻辑
      4. 证明作者的分析和理由是不完整的

主题阅读

主题阅读的五个步骤

  1. 找到相关章节
  2. 带引作者与你达成共识
  3. 厘清问题
  4. 界定议题
  5. 分析讨论

Variety in Ubuntu 22.04 LTS

最近把Ubuntu升级到了 22.04 LTS, 有一说一比之前的改变有很多。
暂时没有遇到什么恶性的bug, 使用体验良好。

如何更新到22.04?

如何更新到22.04呢?
在执行更新以前,强烈建议备份您的重要数据
在Terminal中执行:

1
2
sudo apt install update-manager-core
sudo apt do-release-upgrade

由于网速等原因,更新过程用时不等。(笔者软件源为中科大软件源,整个更新过程大约一个小时)

更新完成后遇到的问题

1. 我的 gnome 插件去哪了?

由于更新到了 gnome 42,原先安装的插件可能不能支持(包括dash to dock,不过gnome 42的自带dock比之前好看太多)。
需要重新安装:

1
sudo apt install gnome-shell-extensions

并在浏览器插件或gnome-tweak中重新开启插件。

dock

原先使用的dash to dock还没有更新到gnome42版本,但是自带的ubuntu dock有了更新

可以在设置-外观中调整dock的样式,还是相对美观的。
ubuntu dock

2. howdy 失效

可以选择重新安装。
(使用ppa安装需要重新配置ppa)

3. variety 失效

需要修改script文件
可以直接执行:

1
sed -i '/^# Gnome 3, Unity*/a gsettings set org.gnome.desktop.background picture-uri-dark "file://$WP" 2> /dev/null' /home/$USER/.config/variety/scripts/set_wallpaper

参考:https://askubuntu.com/a/1404593/1594664

(P.S 国外dalao牛的啊)

4. 更新到最新的显卡驱动

通过

1
ubuntu-drivers devices

查看显卡驱动推荐版本
在21.10, 我的推荐版本是440
但是现在是510,执行:
1
sudo apt install nvidia-driver-510

设$X$和$Y$是任何两个集合,
$f$是 $X$ 到 $Y$ 的一个关系, 如果对于每一个$x \in X$有唯一的 $y \in Y$使得$ \in f$,称关系$f$为$X$到$Y$的函数,记作
$f:X \to Y$

函数, 也称映射, 变换.
$x$是自变元, $y$为像.
函数的两个条件:
存在性: 定义域$domf$中每个元素均有像, 即 $domf = X$
唯一性: 每个函数只有一个像, 且$ranf \subseteq Y$

函数相等:
对于函数$f,g$

  1. $domf = domg$
  2. $\forall x\in domf = domg$都有$f(x) = g(x)$

$X \times Y$的子集并不都能成为$X$到$Y$的函数.
设$X$和$Y$都是有限集, $|X|=m,|Y|=n$
有$n^m$个不同的函数.(有$m^n$个不同的关系)
用$Y^X$表示所有函数的集合.

函数的性质

满射
不存在多余的$y\in Y$

单射
不存在多对一.
双射
即满射+单射 = 双射.

逆函数

双射函数有逆函数.
记作$f^{-1}$

函数的复合

$g \circ f(x) = g(f(x))$
注意:和关系正好相反.
函数的复合是左复合
关系的复合是右复合

特殊的函数

常函数: $f(X) = {y_0}$
恒等函数: $I_x : X \to X$

谦狂交作。论事毋涉私心意气谓之谦,命世不计个人得失谓之狂。

长寿的意思是年命有限。

“我来了,我见了,我够了。”

人类对太奇怪的事,会不觉得奇怪。对那些并不奇怪的事倒咄咄称奇,大惊小怪。

天堂无趣,有趣的是人间。

宗教始终是信仰,哲学始终是怀疑。

几乎什么都能领会,几乎什么都不能领会—人与艺术的关系所幸如此,所不幸如此。

快乐是吞咽的,悲哀是咀嚼的;如果咀嚼快乐,会嚼出悲哀来。

现代没有英雄神话,只有许多冠军,第一奖获得者,啤酒泡沫般的畅销书。

生命是时时刻刻不知如何是好。