首页 文章 精选 留言 我的

精选列表

搜索[加密工具],共10000篇文章
优秀的个人博客,低调大师

Go Getopt —— Go 解析命令行参数工具

Go GetOpt,让你在 go 里解析命令行参数无聊地跟写 shell 脚本一样。 为了不引起混淆,以下说明将使用 go getopt 表示本代码仓库 shell getopt、getopt 命令 表示 util-linux 中的 getopt 二进制程序 getopt(或 C getopt)表示 libc 中的 getopt 方法 但在某个上下文(如标题说明了该段是 shell getopt)中可能有时会直接使用 getopt 指代。请各位注意区分。 怎么用 go get gitee.com/go-getopt/go-getopt package main import ( "fmt" "os" // 这里为了方便,直接使用 . 进行 import。 // 这样可以直接调用 GetOpt、Get 和 Shift 方法。 . "gitee.com/go-getopt/go-getopt" ) func main() { // 传入 os.Args、options 和 longOptions 字符串参数即可 err := GetOpt(os.Args, "ab:c::", "a-long,b-long:,c-long::") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } // 解析后的参数列表存储在全局变量 Args 中 fmt.Println("Arguments:", Args) fmt.Println("Program name:", Args[0]) // 接下来的步骤就和 shell 差不多了 for loop := true; loop; { switch Get(1) { case "-a", "--a-long": fmt.Println("Option a") Shift(1) case "-b", "--b-long": fmt.Println("Option b, argument '" + Get(2) + "'") Shift(2) case "-c", "--c-long": if Get(2) == "" { fmt.Println("Option c, no argument") } else { fmt.Println("Option c with arg '" + Get(2) + "'") } Shift(2) case "--": Shift(1) loop = false default: fmt.Fprintln(os.Stderr, "Error: wrong argument '"+arg1+"'") os.Exit(1) } } fmt.Println("Remains:", Args[1:]) } 对比一下 shell getopt 解析命令行的脚本: # 检查 getopt 命令是否正常运行 getopt --test > /dev/null [ $? -ne 4 ] && echo "Error: command 'getopt --test' failed in this environment." && exit 1 # 设定 options 和 longOptions,调用 getopt 命令 options=ab:c:: longOptions=a-long,b-long:,c-long:: parsed=$(getopt --options=$options --longoptions=$longOptions --name "$0" -- "$@") [ $? -ne 0 ] && echo "Error: failed to parse cmd arguments" && exit 1 eval "set -- $parsed" # 循环判断是哪个 flag,处理完后 shift 掉 while true; do case "$1" in -a|--a-long) echo 'Option a' shift ;; -b|--b-long) echo "Option b, argument '$2'" shift 2 ;; -c|--c-long) [ -n "$2" ] && \\ echo "Option c, argument '$2'" || \\ echo 'Option c, no argument' shift 2 --) shift break *) echo "Error: wrong argument '$1'" exit 1 ;; esac done echo "Remains: $@" Go GetOpt 适合哪些人用 如果你符合以下的一条或多条,可能这个库会适合你: 想用一个库让 go 程序解析命令行参数方便一点。 只想解析出字符串形式参数,然后自己做处理或转换。 不想让类型断言、类型转换代码到处乱飞,也不需要调用的库提供 GetInt、MustGetInt 之类的方法。 忘不了前任 习惯了写 shell,想找个差不多的库接盘。 不喜欢 flag、pflag 这种类型的解析方式(pflag 也很久没维护了)。 不想用 cobra 这种很繁琐的库。 其他问题 并发(协程)安全吗? 没办法做到,也没必要。C 的 getopt 和 getopt_long 方法本身就不是并发安全的(用了全局变量 optind、optarg 来存储中间状态)。 而且,命令行应该只需要解析一次就可以了吧。有必要多次解析吗🤔? 支持哪些平台? 这个库是用 cgo 包装 libc 中的 getopt_long 方法实现的。原理和 shell getopt 命令行程序差不多。目前主流的 libc 都是支持的: mingw / msvc Windows 系 glibc Debian 系、CentOS 系 musl Alpine uclibc-ng BusyBox 附:各 libc getopt 和 getopt_long 源码地址 musl https://git.musl-libc.org/cgit/musl/tree/src/misc/getopt.c https://git.musl-libc.org/cgit/musl/tree/src/misc/getopt_long.c glibc https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/getopt.c;h=e9661c79faa8920253bc37747b193d1bdcb288ef;hb=HEAD https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/getopt1.c;h=990eee1b64fe1ee03e8b22771d2e88d5bba3ac68;hb=HEAD uclibc-ng https://gogs.waldemar-brodkorb.de/oss/uclibc-ng/src/master/libc/unistd/getopt.c https://gogs.waldemar-brodkorb.de/oss/uclibc-ng/src/master/libc/unistd/getopt_long-simple.c

优秀的个人博客,低调大师

Adlik —— 加速深度学习推理的工具

Adlik是深度学习模型的端到端优化框架。Adlik 的目标是在云和嵌入式环境中加速深度学习推理过程。 使用 Adlik 框架,不同的深度学习模型可以以非常灵活和简单的方式以高性能部署到不同的平台。 在云环境中,编译后的模型和 Adlik 推理引擎应构建为 docker 镜像,并部署为容器。 在边缘环境中,应将 Adlik 推理引擎部署为容器。编译后的模型应该转移到边缘环境,Adlik 推理引擎应该自动更新和加载模型。 在设备环境中,Adlik Inference Engine 和编译后的模型应编译为二进制文件。想要在设备上运行模型推理的用户应该将用户定义的 AI 函数和 Adlik 二进制文件链接到执行文件,并直接运行。 构建 本指南用于在Ubuntu系统上构建 Adlik。 首先,安装Git和Bazel。 然后,克隆 Adlik 并将工作目录更改为源目录: git clone https://github.com/ZTE/Adlik.git cd Adlik 构建客户端 安装以下软件包: python3-setuptools python3-wheel 构建客户端: bazel build //adlik_serving/clients/python:build_pip_package -c opt 构建 pip 包: mkdir /tmp/pip-packages && bazel-bin/adlik_serving/clients/python/build_pip_package /tmp/pip-packages 构建服务 首先,安装以下软件包: automake libtbb2 libtool make python3-six 使用 OpenVINO 运行时构建服务 从OpenVINO安装intel-openvino-runtime-ubuntu<OS_VERSION>-<VERSION>包。 假设 OpenVINO 的安装路径为/opt/intel/openvino_VERSION,运行如下命令: export INTEL_CVSDK_DIR=/opt/intel/openvino_VERSION export InferenceEngine_DIR=$INTEL_CVSDK_DIR/deployment_tools/inference_engine/share bazel build //adlik_serving \ --config=openvino \ -c opt 使用 TensorFlow CPU 运行时构建服务 运行以下命令: bazel build //adlik_serving \ --config=tensorflow-cpu \ -c opt 使用 TensorFlow GPU 运行时构建服务 假设使用 CUDA 版本 11.0 构建。 从这里和这里安装以下软件包: cuda-cupti-dev-11-0 libcublas-dev-11-0 libcudnn8=*+cuda11.0 libcudnn8-dev=*+cuda11.0 libcufft-dev-11-0 libcurand-dev-11-0 libcusolver-dev-11-0 libcusparse-dev-11-0 libnvinfer7=7.2.*+cuda11.0 libnvinfer-dev=7.2.*+cuda11.0 libnvinfer-plugin7=7.2.*+cuda11.0 libnvinfer-plugin-dev=7.2.*+cuda11.0 运行以下命令: env TF_CUDA_VERSION=11.0 TF_NEED_TENSORRT=1 \ bazel build //adlik_serving \ --config=tensorflow-gpu \ -c opt \ --incompatible_use_specific_tool_files=false 使用 TensorFlow Lite CPU 运行时构建服务 运行以下命令: bazel build //adlik_serving \ --config=tensorflow-lite-cpu \ -c opt 使用 TensorRT 运行时构建服务 假设使用 CUDA 版本 11.0 构建。 从这里和这里安装以下软件包: cuda-cupti-dev-11-0 cuda-nvml-dev-11-0 cuda-nvrtc-11-0 libcublas-dev-11-0 libcudnn8=*+cuda11.0 libcudnn8-dev=*+cuda11.0 libcufft-dev-11-0 libcurand-dev-11-0 libcusolver-dev-11-0 libcusparse-dev-11-0 libnvinfer7=7.2.*+cuda11.0 libnvinfer-dev=7.2.*+cuda11.0 libnvonnxparsers7=7.2.*+cuda11.0 libnvonnxparsers-dev=7.2.*+cuda11.0 运行以下命令: env TF_CUDA_VERSION=11.0 \ bazel build //adlik_serving \ --config=TensorRT \ -c opt \ --action_env=LIBRARY_PATH=/usr/local/cuda-11.0/lib64/stubs \ --incompatible_use_specific_tool_files=false 使用 TF-TRT 运行时构建服务 假设使用 CUDA 版本 11.0 构建。 从这里和这里安装以下软件包: cuda-cupti-dev-11-0 libcublas-dev-11-0 libcudnn8=*+cuda11.0 libcudnn8-dev=*+cuda11.0 libcufft-dev-11-0 libcurand-dev-11-0 libcusolver-dev-11-0 libcusparse-dev-11-0 libnvinfer7=7.2.*+cuda11.0 libnvinfer-dev=7.2.*+cuda11.0 libnvinfer-plugin7=7.2.*+cuda11.0 libnvinfer-plugin-dev=7.2.*+cuda11.0 运行以下命令: env TF_CUDA_VERSION=11.0 TF_NEED_TENSORRT=1 \ bazel build //adlik_serving \ --config=tensorflow-tensorrt \ -c opt \ --incompatible_use_specific_tool_files=false 使用 Tvm 运行时构建服务 安装以下软件包: build-essential cmake tvm 运行以下命令: bazel build //adlik_serving \ --config=tvm \ -c opt

优秀的个人博客,低调大师

ClickHouse 可视化工具 CH Visualize Release 1.11.0

DBM1.11.0版本发布! 发布时间:2022-02-22 功能 (增强) 支持Nullable修改列类型 构建数据表支持可选参数 支持版本更新检查 支持通过过滤条件清除分区数据 支持数据迁移 文档 中文文档支持 优化 优化数据库删除UI Bug 修复了无法构建日志相关引擎表的问题 修复了慢查询列表无法显示DDL的问题 修复README.md文件无法logo 修复新版本导致的CI异常 https://github.com/EdurtIO/dbm/releases/tag/1.11.0

优秀的个人博客,低调大师

Sentry 22.2.0 发布,跨平台实时应用监控工具

Sentry 从根本上是一项服务,可跨平台实时监控和修复应用程序崩溃,它重点关注于错误报告。Sentry 服务器使用 Python,但它包含一个完整的 API,用于在任何应用程序中从任何语言发送事件。 Sentry 可以帮助你将 Python 程序的所有 exception 自动记录下来,然后在一个好用的 UI 上呈现和搜索,处理 exception 是每个程序的必要部分,所以 Sentry 也几乎可以说是所有项目的必备组件。 目前, Sentry 发布了 22.2.0 版本,此版本带来以下内容: ref(ui)将表单移出视图/设置/组(#31785) feat(perf):当一些重要的网络数据丢失时,显示到文档的链接(#31764) feat(dashboard):在仪表盘编辑模式中添加重复的小部件按钮(#31776) feat(metrics):添加串联变压器指标(#31783) ref(new-widget-builder-experience):添加可视化和查询字段(#31786) feat(profiling): 添加 flamegraph 提示框 (#31663) ref(endpoints): 添加SentryApp 端点模块(#31749) feat(ui): 为审查选项卡添加空白状态 (#31782) ref(models):将更多模块移动到子模块(#31583) feat(workflow):添加 警报规则状态页面(alert-rule-status-page) 标志(#31796) fix(perf): 处理perfForSentry 中的事务丢失(#31801) feat(codeowners):将 api 所有者组添加到CODEOWNERS(#31739) meta(gha):部署工作流 issue-routing-helper.yml(#31798) chore(auth):为所有用户启用自动 IdP 迁移(#31774) feat(ratelimits): 开启速率限制执行功能(#31789) ref(perf):切换 VC 组件以使用 perf.now(#31795) ref(api): 重构 organization_member_team_details (#31751) fix(pagerduty): 修复日志参数问题 (#31794) ... 更新公告:https://github.com/getsentry/sentry/releases/tag/22.2.0

优秀的个人博客,低调大师

VSDB —— 数据库版本管理工具

VSDB 是一个 Key-Value 数据库形式的 'Git'。基于 VSDB 强大的版本控制功能,开发者可轻松为数据结构赋予版本管理能力。 功能亮点 支持类似 Git 的版本控制操作,例如: 创建无数分支并将它们合并到它们的父级 将“分支”回滚到指定的历史“版本” 查询指定'branch'上某个 key 的历史值 大多数 API 类似于标准库中对应的数据结构 使用Vecx就像Vec 使用Mapx就像HashMap 使用MapxOrd就像BTreeMap ... 示例 struct GreatAlgo { a: Vec<...>, b: BTreeMap<...>, c: u128, d: HashMap<...>, e: ... } #[dervive(Vs, Default)] struct GreatAlgo { a: VecxVs<...>, b: MapxOrdVs<...>, c: OrphanVs<u128>, d: MapxVs<...>, e: ... } let algo = GreatAlgo.default(); algo.get_by_branch_version(...); algo.branch_create(...); algo.branch_create_by_base_branch(...); algo.branch_create_by_base_branch_version(...); algo.branch_remove(...); algo.version_pop(...); algo.prune();

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册