分类目录归档:Tools

个人笔记软件比较(Typora+Boostnote+Notable+Joplin)

Typora

  • 存储以及同步方式:采用系统目录,无内置支持,可以直接用nextcloud,坚果云盘存储
  • 标签: 不支持
  • 附件:自定义附件存放位置
  • 开源:否
  • 搜索:不支持
  • 其他:界面美观,支持多种主题,速度快

Boostnote

  • 存储以及同步方式:采用boostnote.json存储虚拟目录,每个虚拟目录对应一个文件夹,文件采用cson格式UUID命名存放,支持多个目录笔记本,可以直接用nextcloud,坚果云盘存储
  • 标签: 支持
  • 附件:独立目录
  • 开源:GPL v3
  • 搜索:支持
  • 其他:美观性一般,速度一般

Notable

  • 存储以及同步方式:采用单一文件夹,markdown格式,标签作为虚拟目录存放在metadata,多笔记支持不够友好,可以直接用nextcloud,坚果云盘存储
  • 标签: 支持
  • 附件:独立目录
  • 开源:1.5 以后已经不开源
  • 搜索:支持
  • 其他:美观性较好,速度较好

Joplin

  • 存储以及同步方式:采用sqlite存储,内置nextcloud,onenote,dropbox,webdav同步支持
  • 标签: 支持
  • 附件:独立目录
  • 开源:MIT License
  • 搜索:支持
  • 其他:美观性较好,速度较好

结论

选择Joplin,内置同步支持,协议开放,插件较多,可定制性高,有浏览器插件和手机客户端。

多平台实时同步方案比较(cp,scp,rsync,DRBD,lsyncd,Syncthing,seafile,Nextcloud)

cp命令实现增量同步

可用于linux/mac,可以增量,不能跨机器。

使用-u参数实现增量,-r递归,使用实例

cp -ru dir1/* dir2/

详细参数

用法:cp [选项]... [-T] 源文件 目标文件
 或:cp [选项]... 源文件... 目录
 或:cp [选项]... -t 目录 源文件...
将源文件复制至目标文件,或将多个源文件复制至目标目录。

长选项必须使用的参数对于短选项时也是必需使用的。
  -a, --archive                 等于-dR --preserve=all
      --backup[=CONTROL         为每个已存在的目标文件创建备份
  -b                            类似--backup 但不接受参数
      --copy-contents           在递归处理是复制特殊文件内容
  -d                            等于--no-dereference --preserve=links
  -f, --force                   如果目标文件无法打开则将其移除并重试(当 -n 选项
                                        存在时则不需再选此项)
  -i, --interactive             覆盖前询问(使前面的 -n 选项失效)
  -H                            跟随源文件中的命令行符号链接
  -l, --link                    链接文件而不复制
  -L, --dereference             总是跟随符号链接
  -n, --no-clobber              不要覆盖已存在的文件(使前面的 -i 选项失效)
  -P, --no-dereference          不跟随源文件中的符号链接
  -p                            等于--preserve=模式,所有权,时间戳
      --preserve[=属性列表      保持指定的属性(默认:模式,所有权,时间戳),如果
                                        可能保持附加属性:环境、链接、xattr 等
  -c                           same as --preserve=context
      --sno-preserve=属性列表   不保留指定的文件属性
      --parents                 复制前在目标目录创建来源文件路径中的所有目录
  -R, -r, --recursive           递归复制目录及其子目录内的所有内容
      --reflink[=WHEN]          控制克隆/CoW 副本。请查看下面的内如。
      --remove-destination      尝试打开目标文件前先删除已存在的目的地
                                        文件 (相对于 --force 选项)
      --sparse=WHEN             控制创建稀疏文件的方式
      --strip-trailing-slashes  删除参数中所有源文件/目录末端的斜杠
  -s, --symbolic-link           只创建符号链接而不复制文件
  -S, --suffix=后缀             自行指定备份文件的后缀
  -t,  --target-directory=目录  将所有参数指定的源文件/目录
                                           复制至目标目录
  -T, --no-target-directory     将目标目录视作普通文件
  -u, --update                 copy only when the SOURCE file is newer
                                 than the destination file or when the
                                 destination file is missing
  -v, --verbose                explain what is being done
  -x, --one-file-system        stay on this file system
  -Z, --context=CONTEXT        set security context of copy to CONTEXT
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

scp命令实现跨机器增量同步

可用于linux/mac系统,可以增量,可以跨机器,跨机器通过ssh。

使用实例

scp user@host1:/dir/* /home/www/

详细参数

usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

-B  使用批处理模式(传输过程中不询问传输口令或短语) 
-C  允许压缩。(将-C标志传递给ssh,从而打开压缩功能) 
-p  保留原文件的修改时间,访问时间和访问权限。 
-q  不显示传输进度条。 
-r  递归复制整个目录。 
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。  
-c cipher  以cipher将数据传输进行加密,这个选项将直接传递给ssh。  
-F ssh_config  指定一个替代的ssh配置文件,此参数直接传递给ssh。 
-i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。   
-l limit  限定用户所能使用的带宽,以Kbit/s为单位。    
-o ssh_option  如果习惯于使用ssh_config(5)中的参数传递方式,  
-P port  注意是大写的P, port是指定数据传输用到的端口号  
-S program  指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

rsync 命令实现跨机器增量同步

可用于linux/mac系统,可以增量,可以跨机器,跨机器通过ssh。相对于scp推荐。可以显示进度、排除软链等。

用例

rsync -e "ssh -p22222" -avpgolr --progress  host:/dir/file /dir/file

详细参数


Usage: rsync [OPTION]... SRC [SRC]... DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

Options
 -v, --verbose               increase verbosity
 -q, --quiet                 suppress non-error messages
     --no-motd               suppress daemon-mode MOTD (see manpage caveat)
 -c, --checksum              skip based on checksum, not mod-time & size
 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
     --no-OPTION             turn off an implied OPTION (e.g. --no-D)
 -r, --recursive             recurse into directories
 -R, --relative              use relative path names
     --no-implied-dirs       don't send implied dirs with --relative
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         set backup suffix (default ~ w/o --backup-dir)
 -u, --update                skip files that are newer on the receiver
     --inplace               update destination files in-place (SEE MAN PAGE)
     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -d, --dirs                  transfer directories without recursing
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            transform symlink into referent file/dir
     --copy-unsafe-links     only "unsafe" symlinks are transformed
     --safe-links            ignore symlinks that point outside the source tree
 -k, --copy-dirlinks         transform symlink to a dir into referent dir
 -K, --keep-dirlinks         treat symlinked dir on receiver as dir
 -H, --hard-links            preserve hard links
 -p, --perms                 preserve permissions
 -E, --executability         preserve the file's executability
     --chmod=CHMOD           affect file and/or directory permissions
 -A, --acls                  preserve ACLs (implies --perms)
 -X, --xattrs                preserve extended attributes
 -o, --owner                 preserve owner (super-user only)
 -g, --group                 preserve group
     --devices               preserve device files (super-user only)
     --copy-devices          copy device contents as regular file
     --specials              preserve special files
 -D                          same as --devices --specials
 -t, --times                 preserve modification times
 -O, --omit-dir-times        omit directories from --times
     --super                 receiver attempts super-user activities
     --fake-super            store/recover privileged attrs using xattrs
 -S, --sparse                handle sparse files efficiently
 -n, --dry-run               perform a trial run with no changes made
 -W, --whole-file            copy files whole (without delta-xfer algorithm)
 -x, --one-file-system       don't cross filesystem boundaries
 -B, --block-size=SIZE       force a fixed checksum block-size
 -e, --rsh=COMMAND           specify the remote shell to use
     --rsync-path=PROGRAM    specify the rsync to run on the remote machine
     --existing              skip creating new files on receiver
     --ignore-existing       skip updating files that already exist on receiver
     --remove-source-files   sender removes synchronized files (non-dirs)
     --del                   an alias for --delete-during
     --delete                delete extraneous files from destination dirs
     --delete-before         receiver deletes before transfer, not during
     --delete-during         receiver deletes during transfer (default)
     --delete-delay          find deletions during, delete after
     --delete-after          receiver deletes after transfer, not during
     --delete-excluded       also delete excluded files from destination dirs
     --ignore-errors         delete even if there are I/O errors
     --force                 force deletion of directories even if not empty
     --max-delete=NUM        don't delete more than NUM files
     --max-size=SIZE         don't transfer any file larger than SIZE
     --min-size=SIZE         don't transfer any file smaller than SIZE
     --partial               keep partially transferred files
     --partial-dir=DIR       put a partially transferred file into DIR
     --delay-updates         put all updated files into place at transfer's end
 -m, --prune-empty-dirs      prune empty directory chains from the file-list
     --numeric-ids           don't map uid/gid values by user/group name
     --timeout=SECONDS       set I/O timeout in seconds
     --contimeout=SECONDS    set daemon connection timeout in seconds
 -I, --ignore-times          don't skip files that match in size and mod-time
     --size-only             skip files that match in size
     --modify-window=NUM     compare mod-times with reduced accuracy
 -T, --temp-dir=DIR          create temporary files in directory DIR
 -y, --fuzzy                 find similar file for basis if no dest file
     --compare-dest=DIR      also compare destination files relative to DIR
     --copy-dest=DIR         ... and include copies of unchanged files
     --link-dest=DIR         hardlink to files in DIR when unchanged
 -z, --compress              compress file data during the transfer
     --compress-level=NUM    explicitly set compression level
     --skip-compress=LIST    skip compressing files with a suffix in LIST
 -C, --cvs-exclude           auto-ignore files the same way CVS does
 -f, --filter=RULE           add a file-filtering RULE
 -F                          same as --filter='dir-merge /.rsync-filter'
                             repeated: --filter='- .rsync-filter'
     --exclude=PATTERN       exclude files matching PATTERN
     --exclude-from=FILE     read exclude patterns from FILE
     --include=PATTERN       don't exclude files matching PATTERN
     --include-from=FILE     read include patterns from FILE
     --files-from=FILE       read list of source-file names from FILE
 -0, --from0                 all *-from/filter files are delimited by 0s
 -s, --protect-args          no space-splitting; only wildcard special-chars
     --address=ADDRESS       bind address for outgoing socket to daemon
     --port=PORT             specify double-colon alternate port number
     --sockopts=OPTIONS      specify custom TCP options
     --blocking-io           use blocking I/O for the remote shell
     --stats                 give some file-transfer stats
 -8, --8-bit-output          leave high-bit chars unescaped in output
 -h, --human-readable        output numbers in a human-readable format
     --progress              show progress during transfer
 -P                          same as --partial --progress
 -i, --itemize-changes       output a change-summary for all updates
     --out-format=FORMAT     output updates using the specified FORMAT
     --log-file=FILE         log what we're doing to the specified FILE
     --log-file-format=FMT   log updates using the specified FMT
     --password-file=FILE    read daemon-access password from FILE
     --list-only             list the files instead of copying them
     --bwlimit=KBPS          limit I/O bandwidth; KBytes per second
     --write-batch=FILE      write a batched update to FILE
     --only-write-batch=FILE like --write-batch but w/o updating destination
     --read-batch=FILE       read a batched update from FILE
     --protocol=NUM          force an older protocol version to be used
     --iconv=CONVERT_SPEC    request charset conversion of filenames
 -4, --ipv4                  prefer IPv4
 -6, --ipv6                  prefer IPv6
     --version               print version number
(-h) --help                  show this help (-h works with no other options)

DRBD 高性能网络磁盘同步

DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。
用于linux/mac,类似于一个网络RAID-1的功能,高性能。

rsync+inotify 实时增量同步

1、先安装好inotify包

  wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  

tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14

 ./configure --prefix=/usr/local/inotify-3.14

make && make install

2、创建监控脚本inotify.sh

#!/bin/bash
#para
host01=192.168.0.144  #rsync服务器地址
src=/backup        #本地监控的目录
dst=backup         #rsync服务器的模块名称
user=nowview      #rsync服务器的虚拟用户
rsync_passfile=/etc/rsyncd.password   #本地调用rsync服务的密码文件
inotify_home=/usr/local/inotify-3.14    #inotify的安装目录
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Folder"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
#  rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0

lsyncd 多机器实时同步文件神器

lsyncd 是一个支持实时、双向、多机器的多模式文件同步工具。

使用 Lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。

Syncthing

支持Windows/linux/mac/android,采用go语言开发,提供多个平台的客户端。没有iOS客户端。

seafile

同样采用go开发,Seafile 是一款开源的企业云盘,注重可靠性和性能。支持 Windows, Mac, Linux, iOS, Android 平台。支持文件同步或者直接挂载到本地访问。

Nextcloud/ownCloud

采用PHP基于ownCloud开发,支持 Windows, Mac, Linux, iOS, Android 平台。

参考

Win10磁盘清理

临时文件

依此选择“c盘”》属性》磁盘清理

修改系统分页文件存储位置

我的电脑,右键,“高级系统设置”》“高级”》“性能”》“高级”》“虚拟内存”》修改C盘为无分页文件;

关闭休眠文件内存占用

开始菜单输入cmd,选择管理员身份运行"命令提示符",在命令提示符运行 powercfg -h off;

删除旧版windows备份文件

如果windows升级上来的,Windows.old备份文件也是可以删除的

开源CRM/ERP比较

名称 语言 协议 提供外部API 项目地址
悟空 PHP/JAVA 商业 否(但是管理后台采用rest) https://gitee.com/wukongcrm/72crm
PSI PHP GPLv3 插件化ERP https://gitee.com/crm8000/PSI
SugarCRM PHP GPLv3 开源版本已不更新 https://sourceforge.net/projects/sugarcrm/
SuiteCRM PHP GPLv3 基于SugarCRM,目前仍在更新 https://github.com/salesagility/SuiteCRM
VtigerCRM PHP GPLv3 基于SugarCRM,开源版本已不更新
Odoo Python GPLv3 插件化ERP https://github.com/odoo/odoo
OFBiz Java Apache 未知 https://ofbiz.apache.org/

最后得出,
CRM完全免费用SuiteCRM,悟空收费中文支持好。
小型ERP选择Odoo,大公司ERP选择OFBiz。

Appwrite介绍:开源的移动和WEB后端服务

Appwrite是面向前端和移动开发人员的新型开源端到端后端服务器,可让您更快地构建应用程序。

Appwrite的目标是抽象和简化REST API和工具背后的常见开发任务,以帮助开发人员更快地构建高级应用程序。

在这篇文章中,我将简要介绍一些主要的Appwrite服务,并解释它们的主要功能以及它们的设计方式,以帮助您比从头开始编写所有后端API时更快地构建下一个项目。

Appwrite服务器打包为docker容器,您可以使用本地计算机或云提供商终端上的简单docker-compose命令轻松设置。

mkdir appwrite-ce && \
cd appwrite-ce && \
curl -o docker-compose.yml https://appwrite.io/docker-compose.yml && \
docker-compose up -d --remove-orphans

Appwrite身份验证

您可以轻松地将OAuth提供程序集成为应用程序的新登录方法

通过Appwrite身份验证服务,您可以轻松管理用户注册并登录您的应用。Auth服务还提供与多个OAuth提供商的内置集成,如Facebook,Github,LinkedIn等。

除了管理对您的应用及其不同资源的访问控制之外,Auth服务还抽象其他重复任务,例如管理用户电子邮件确认和密码恢复。

使用Auth服务可以节省构建稳定安全的用户身份验证和授权系统所带来的大量时间和顾虑,同时还必须与多个第三方登录方法集成。

Appwrite帐户

file

Appwrite Account服务向您的客户端公开了一个API,允许您与当前登录的用户帐户进行交互。

Appwrite帐户服务可让您管理用户活动会话。

帐户服务允许您的用户更新其帐户相关信息,并保存他们的私人偏好,如用户界面语言,时区或喜爱的主题。您可以使用您希望的任何偏好设置用户。

您还可以使用API获取用户活动会话的列表,包括有关会话位置,设备,操作系统和用户代理的信息。使用API安全日志端点,您可以让用户查看其最新登录,密码恢复和其他安全敏感事件。

Appwrite数据库

file

Appwrite数据库仪表板允许您轻松浏览项目集合和文档。

Appwrite数据库服务允许您直接从客户端应用程序集成您的用户和应用程序数据,无论是浏览器还是本机应用程序。数据库中的每个文档都能够嵌套其他子文档。使用Appwrite数据库筛选器,您可以应用高级查询并筛选嵌套文档集合。

每个文档都可以为特定用户,用户团队,API密钥或用户角色设置读写权限。使用Appwrite数据库,简单而灵活的权限机制,您可以为您的应用程序管理复杂和复杂的访问控制逻辑。

Appwrite数据库还可以灵活地选择结构化数据收集或灵活的收集,以便随时管理数据。使用Appwrite,简单而强大的数据集合,您可以为集合中的每个文档强制执行数据结构和验证规则。

Appwrite存储

Appwrite Storage服务是让您或您的应用用户安全,简单地上传和管理文件的最简单方法。

Appwrite Storage API利用了Appwrite数据库使用的相同的简单读写权限机制。这使您可以轻松确定所有用户,特定用户甚至用户团队是否可以访问您的文件。

var appwrite = new window.Appwrite();

appwrite
    .setEndpoint('https://localhost/v1')
    .setProject('[PROJECT-ID]')
;

var file  = document.getElementById('file-input').files[0];
let read  = ['*']; // wildecard read access
let write = ['user:self']; // write access only to me

appwrite.storage.createFile(file, read, write)
    .then(function (response) {
        console.log('file uploaded successfully');
    }, function (error) {
          console.log(error);
    });

Appwrite Storage API允许您轻松地在应用程序中集成安全文件上载。

Appwrite Storage服务还提供与自动更新的防病毒服务器的内置集成。所有上传到您系统的新文件都会进行扫描和验证,以确保您和您的用户的安全。

Appwrite Storage服务提供的最有用的功能之一是能够预览文件内容并在应用程序或网站中将其显示为缩略图。您还可以动态更改缩略图的大小,在不同的图像格式之间进行转换(支持webp!)并更改其质量以提高网络性能。

Appwrite Teams

Appwrite Teams服务允许您和您的用户创建团队并共享不同API资源(如文件或文档)的权限。这是为您的产品实施复杂访问控制要求的一种非常简单的方法。

每个团队成员也可以被授予不同的角色,以便您获得更大的灵活性。

Appwrite Task

file

Appwrite Task 服务是设置定期计划作业的好方法。

而不是使用复杂的crontabs或长时间运行的守护进程处理并担心容错,监视和错误记录等问题,您需要做的就是提交一个表单,其中您的任务作为HTTP端点和类似cron的语法来指示如何经常应该执行。就这么简单。

您还可以使用任务高级选项向请求添加不同的HTTP标头,或使用基本HTTP身份验证对其进行保护。不用说,所有敏感的HTTP密码都在Appwrite内部数据库中安全加密。

Appwrite Webhooks

file

您可以从Appwrite控制台轻松注册新的webhook。

Appwrite Webhooks旨在让您轻松方便地集成后端的自定义行为。

想要在新用户注册到您的应用时收到短信?想要在您的某个应用文档获得更新时清除缓存吗?只需添加一个新的webhook,当特定的Appwrite事件触发时,该webhook会触发您端点的HTTP端点。使用Appwrite Webhooks你只会受到想象力的限制。

Appwrite Github

https://github.com/appwrite/appwrite

Arch linux / manjaro开启bbr

查看内核版本号

uname -r

如果内核版本大于等于4.9可以直接开启

检查bbr模块是否存在

然后使用命令modinfo tcp_bbr查看内核模块是否存在。

modinfo tcp_bbr

开启bbr模块

sudo  modprobe tcp_bbr

下次自动开启

默认没有开启,自动开启

echo "tcp_bbr" > /etc/modules-load.d/80-bbr.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/80-bbr.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.d/80-bbr.conf

立即加载

sysctl -p 

检查是否成功

sysctl net.ipv4.tcp_congestion_control

内网穿透工具比较(ngrok,frp,lanproxy,goproxy,nps)

从是否有API,客户端单独key,子域名,收费模式,采用语言,github stars多个维度比较了ngrok, frp, lanproxy, goproxy, nps几款内网穿透工具

file

ngrok

https://github.com/inconshreveable/ngrok

frp

https://github.com/fatedier/frp

lanproxy

https://github.com/ffay/lanproxy

goproxy

https://github.com/snail007/goproxy

nps

https://github.com/cnlh/nps

综合比较后发现nps比较符合需求,但是目前版本(0.23)存在稳定性问题,作者打算在未来版本收费

centos下supervisor安装和使用

安装

dnf update -y
dnf install supervisor
sytemctl enable supervisord

配置

vim /etc/supervisor/xxx.conf

    [program:testprogram]
    directory = /root/go/src/test
    command = /root/go/src/test/bin/server
    autostart = true
    startsecs = 5
    autorestart = true
    startretries = 3
    user = root
    redirect_stderr = true
    stdout_logfile = /var/log/supervisor/test.log

使用

supervisorctl reload
supervisorctl start xxx
supervisorctl status

nginx access log 记录cgi执行时间

log_format combined_with_time '$remote_addr - $remote_user [$time_local]  '
                     '$request $status $body_bytes_sent '
                     '$http_referer $http_user_agent '
                     '$request_time $upstream_response_time';

access_log  /data/wwwroot/xxxx/vagrant/nginx/log/frontend-access.log combined_with_time;

letsencrypt https证书自动更新和续期(支持泛域名)

https://github.com/tengattack/certbot-dns-aliyun

获取证书

certbot certonly -a certbot-dns-aliyun:dns-aliyun \
    --certbot-dns-aliyun:dns-aliyun-credentials /data/aliyun.ini \
    -d c4ys.com \
    -d *.c4ys.com

更新证书

certbot renew

自动重新加载nginx(需要更新成功后,所以等前一个任务进行几分钟之后再执行)

nginx -s reload