springboot minio
发布于
minio

存储发展

  • DAS:Direct Attached Storage,通过SCSI总线扩展至一个外部的存储,作为服务器扩展的一部分,可扩展性有限、无法多主机共享
  • NAS:Network Attached Storage,通过网络协议如NFS、CIFS远程获取后端文件服务器共享的存储空间,将文件存储单独分离出来
  • SAN:Storage Area Network,分IP-SAN和FC-SAN,通过TCP/IP协议和FC(Fiber Channel)光纤协议连接到存储服务器,可扩展性强;但成本特别高、要HBA卡、FC交换机和支持FC接口的存储
  • OSS:随大数据发展,PB以上存储空间,需无限扩展

企业场景无非是这三种:磁盘(块存储设备),挂载至目录像本地文件一样使用(文件共享存储),通过API向存储系统中上传PUT和下载GET文件(对象存储)

minio

https://github.com/minio/minio > The MinIO documentation website >Software Development Kits (SDK) >Java Quickstart Guide 下面有个 Java Client API Reference

概念

https://www.abelsun.tech/arch/minio/minio-concept.html

https://gitee.com/ddatsh/minio-upload

ref

Gluster和Ceph对比

git
发布于
git

.gitattributes

功能:识别为文本或二进制、文本文件换行符转换、合并策略、差异显示等

文本与二进制

Git 对文本与二进制文件的处理是不同:

  • 文本文件会显示出修改的差异,并且在合并时会按照行进行合并
  • 二进制文件不显示修改的差异,在合并时会提示文件冲突,需要人工介入

Git 内部会自动根据扩展名识别文本与二进制文件,但是一些文本文件是由机器产生的,Git 会将其视作文本文件而自动进行合并,这会导致文件损坏,并且这种情况很难察觉

推荐将所有文件取消文本属性,然后根据项目的需要将部分文件开启文本属性

* -text

Assets/*.java text

换行符转换

Git 默认会对文本文件进行换行符转换,默认情况下在提交时转换为 LF,检出时根据当前平台转换为 LF 或 CRLF。建议 Git 仓库有自己独立的设置,不受 Git 全局配置的影响,否则文件的内容在不同的机器上会出现不同

比如 统一设置 C# 文件换行符为 Windows 换行符 CRLF

Assets/*.cs text eol=crlf

模板

gitignore.io

gitattributes.io

常用软件
发布于
soft

常用软件

  • quiterss

免费的开源 RSS/Atome 阅读器。可在 Windows、Linux 和 Mac 上运行。 QT 编写。提供广告屏蔽器、报纸视图,通过 URL 导入 RSS 源等特性

http://quiterss.org/en/download

  • clink

cmdLinux 终端一样容易使用

rclone
发布于
windows

Windows “映射网络驱动器”和“添加一个网络位置” 很鸡肋,不支持大多数常用协议

Rclone可以将webdav协议的共享文件夹挂载到电脑本地硬盘/文件夹

Rclone还支持HTTP、WebDav、FTP、SFTP、dlna、Amazon S3、阿里云OSS……等40+种常用网络共享协议

https://rclone.org/downloads/

https://github.com/rclone/rclone

使用前需要先安装WinFsp,一个开源的Windows文件系统代理软件,支持基于网络的文件系统 :

https://winfsp.dev/

https://github.com/winfsp/winfsp

rclone config,开始添加或修改你的webdav服务器

rclone mount ali:/ Y: --cache-dir z:/tmp  --vfs-cache-mode writes--checkers 64 --transfers 64
视频右键后卡死,转圈很久才能弹出菜单
发布于
windows

Windows资源管理器为针对视频文件做出快捷操作,需要分析一些视频的信息(长、宽、文件大小、视频长度等),依赖于读取视频内部的Meta标签

一些无此Meta信息的文件,Windows就会从头扫描到文件尾,然后才默默的放弃,弹出一个右键菜单来

一百多MB以下的小视频的时候倒感觉不出来,零点几秒就扫描完了。大几十GB,就要命了

缓解方案

ShellExView 禁用 各Property Handler

用的3C产品
发布于
3c

用的3C产品

罗技键鼠

公司开发者大会分享主题后公司提供

键盘型 罗技 MX Keys ,鼠标可以二选一 罗技 MX Anywhere3 和 罗技 MX Master3

go-sdl2 flappy bird编译
发布于
game

逛gocn发现 好玩的github项目 用go做个flappy bird

https://github.com/neomede/flappy.git

弄成go module项目

go mod init ddatsh.com/flappy
go: creating new go.mod: module ddatsh.com/flappy
go: to add module requirements and sums:
        go mod tidy

发现用新版依赖时编译报错

go mod tidy
go: finding module for package github.com/veandco/go-sdl2/sdl_ttf
go: finding module for package github.com/veandco/go-sdl2/sdl_image
ddatsh.com/flappy imports
        github.com/veandco/go-sdl2/sdl_image: module github.com/veandco/go-sdl2@latest found (v0.4.29), but does not contain package github.com/veandco/go-sdl2/sdl_image
ddatsh.com/flappy imports
        github.com/veandco/go-sdl2/sdl_ttf: module github.com/veandco/go-sdl2@latest found (v0.4.29), but does not contain package github.com/veandco/go-sdl2/sdl_ttf

发现和游戏代码提交时间对应的 go-sdl2的 0.1 tag 里的才是 sdl_image、sdl_ttf,新版就省了sdl_前缀

继续修复几行小变化

.\main.go:56:13: undefined: sdl.KeyUpEvent
.\main.go:72:13: undefined: sdl.KeyUpEvent
.\text.go:38:23: font.RenderUTF8_Solid undefined (type *ttf.Font has no field or method RenderUTF8_Solid)

wire
发布于
go

模拟 web 项目初始化过程

package main  
  
import "fmt"  
  
type DB struct {  
}  
  
type Cache struct {  
}  
  
type UserRepo struct {  
   DB    *DB  
   Cache *Cache  
}  
  
type UserService struct {  
   UserRepo *UserRepo  
}  
  
type App struct {  
   UserService *UserService  
}  
  
func (app *App) Start() {  
   fmt.Println("server starting")  
}  
  
func NewDB() (*DB, func(), error) {  
   db := &DB{}  
   cleanup := func() {  
      fmt.Println("close db connection")  
   }  
   return db, cleanup, nil  
}  
  
func NewCache() *Cache {  
   return &Cache{}  
}  
  
func NewUserRepo(db *DB, cache *Cache) *UserRepo {  
   return &UserRepo{DB: db, Cache: cache}  
}  
  
func NewUserService(userRepo *UserRepo) *UserService {  
   return &UserService{UserRepo: userRepo}  
}  
  
func NewApp(userService *UserService) *App {  
   return &App{UserService: userService}  
}  

不使用 wire

手动 new 方式初始化

func main() {  
   db, cleanup, err := NewDB()  
   if err != nil {  
      panic(err)  
   }  
   defer cleanup()  
   cache := NewCache()  
   userRepo := NewUserRepo(db, cache)  
   userService := NewUserService(userRepo)  
   app := NewApp(userService)  
   app.Start()  
}

使用 DI

go install github.com/google/wire/cmd/wire@latest

创建 wire.go  用于生成代码,申明了最初始的入参和最终的产出物

//go:build wireinject  
// +build wireinject  
  
package main  
  
import (  
   "github.com/google/wire"  
)  
  
// InitializeApplication  
func InitializeApplication() (*App, func(), error) {  
   panic(wire.Build(NewDB, NewCache, NewUserRepo, NewUserService, NewApp))  
}
wire .

生成对应的依赖关系和初始化过程

在使用的地方调用对应的初始化方法获得产物即可,不需要关心其中的依赖关系

func main() {  
   app, cleanup, err := InitializeApplication()  
   if err != nil {  
      panic(err)  
   }  
   defer cleanup()  
   app.Start()  
}

wire 在每个 new 方法中支持三个参数,对象,cleanup,error,参数 cleanup 就会在关闭的时候按照依赖的倒序依次进行关闭。

wire 做的事情就是根据你 new 方法的入参和出参,识别了他们之间的依赖关系,生成了对应的初始化代码