Go 语言中执行外部命令的方法
Go 语言中执行外部命令主要的方法是使用包 os/exec。
此包的详细文档见 exec package - os/exec - pkg.go.dev,这里只介绍几种常用操作。
执行命令也分几种情况:
仅执行命令;
执行命令,获取结果,不区分 stdout 和 stderr;
执行命令,获取结果,区分 stdout 和 stderr。
另外,默认的命令执行是在 go 进程当前的目录下执行的,我们可能还需要指定命令执行目录。
下面我们逐个说。
1. 仅执行命令执行命令,首先要拼接一下命令和参数,然后运行命令。
拼接命令与参数使用 exec.Command(),其会返回一个 *Cmd;
1func Command(name string, arg ...string) *Cmd
执行命令使用 *Cmd 中的 Run() 方法,Run() 返回的只有 error。
1func (c *Cmd) Run() error
我们直接看代码:
1234567891011121314151617package mainimport ( "log" &qu ...
Python 压缩图片大小(非尺寸)
这篇文章要说的是,在不改变图片尺寸的前提下,缩小图片的大小(肯定会降低图片质量)。
如果你同时想要改变图片的尺寸,看 Python 缩放图片(保持宽高比)。
思路:
设定一个期望大小 target_size;
牺牲部分质量压缩图片,得到新图片大小 new_size;
比较 new_size 和 target_size;
如果 new_size <= target_size,结束。否则重复 2 - 4。
同时我们还需要设定一个最大压缩次数,或者等价的概念,因为有可能我们的图片无法压缩至目标大小。
代码:同样的只演示过程,代码尽量精简。
123456789101112131415161718192021import osfrom PIL import Imageimg_path = "path/to/your/image" # 要压缩的图片路径new_img_path = "path/to/your/new/image" # 压缩好的图片保存路径target_size = 150 * 1024 # 单位:字节(B),即目标大小 1 ...
Python 缩放图片(保持宽高比)
一个最简单的方法就是直接 resize(),唯一要额外做的就是计算新的宽(或高)。
我们记原图宽和高分别为 $width$ 和 $height$,新图的宽和高分别为 $new_width$ 和 $new_height$,那么有如下等式:
\frac{width}{height} = \frac{new\_width}{new\_height}即有
new\_width = width \times new\_height \div height
new\_height = height \times new\_width \div width
下面,我们以固定宽,计算高的方式来举一个例子:
我写这篇博客的时候,是想把一些大尺寸图片,转换为宽固定为 2560 的图片,保持宽高比,所以需要计算的是新的高 new_height。
下面看代码:
这里使用 Pillow 中的 Image 实现。
1234567891011from PIL import Imageimg_path = "path/to/your/image" # 要缩放的图片路径new_img_p ...
GFS 论文阅读笔记
GFS 论文原文传送门:The Google File System
1. 什么是 GFSGFS,全称 Google File System,谷歌文件系统。
这篇论文是 2003 年发表的,在这之前,GFS 已经大规模应用在了 Google 内部。
GFS 是 Google 提出的一个文件系统,其是分布式的,主要用于处理越来越庞大的数据。因为当数据量大到一定程度时,传统的数据存储与处理方式就显得很笨重了,不适用了(比如你很难很快地读取数百 TB 的数据)。
2. 设计概述2.1. 假想(目标)GFS 在设计的时候有一些假想,即预期要实现的目标。
这个系统由很多廉价的、经常会故障的商用组件构建,所以在日常使用中,这个系统必须持续地监控自身,以检测、容忍组件故障,并迅速从组件故障中恢复。
这个系统存储数量适中的大文件。Google 期望是几百万个文件,每个一般是 100MB 或者更大。数 GB 大小的文件在这个系统中也是很常见的,需要高效管理。而小文件肯定也要支持,但是不需要为了这些小文件专门优化。
工作负载主要包括两类读:大文件流的读(流只能顺序读)和小文件的随机读。
大文件流的读: ...
MapReduce 论文阅读笔记
MapReduce 论文原文传送门:MapReduce: Simplified Data Processing on Large Clusters
这里需要一个前置知识,你需要先了解一下函数式语言中的 map 和 reduce,因为 MapReduce 就是借鉴了函数式语言中的 map 和 reduce 的思想,如果你不了解这个,后面理解起来可能会有些困难。
还有就是建议先读 GFS 这篇论文,MapReduce 论文中在一些地方提到了 GFS。不过不是很深入,即便你没读过 GFS 论文,倒也不会有太大的压力。
这篇文章不是教学,是原文的翻译,但更是笔记(在很多地方我加了自己的理解,或者以更容易理解的方式改述原文),也许对你有用,也许只有我自己看得懂 =。= !
1. 什么是 MapReduceMapReduce 是一个编程模型,是一个为了处理与生成大数据集的相关实现。用户指定一个 map 函数,处理一个 key/value 键值对,以生成一系列中间 key/value 对,用户再指定一个 reduce 函数,合并与所有同一中间 key 的所有中间 value。很多真实世界的任务都 ...
Rust -- 编写自动化测试
Rust 是一个相当注重正确性的编程语言。
Rust 的类型系统在此问题上下了很大的功夫,不过这仍然不可能捕获所有种类的错误。
为此,Rust 也在语言本身包含了编写软件测试的支持。
例如,我们可以编写一个叫做 add_two() 的函数,将传递给其的值加 2。其声明有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 String 或无效的引用给这个函数。不过,Rust 无法检查这个函数是否会准确地完成我们期望的工作:返回参数加 2 后的值。这也就是测试出场的地方。
我们可以编写测试断言,比如说,当传递 3 给 add_two() 函数时,返回值是 5。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。
这篇文章我们来使用 Rust 语言本身提供的测试功能!
1. 如何编写测试测试函数体通常执行如下三种操作:
设置任何所需的数据或状态;
运行需要测试的代码;
断言其结果是我们所期望的。
让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 ...
Linux 中 curl 命令的常用方法
1. 什么是 curl?curl 是一个使用 URL 语法传输数据的命令行工具和库。
curl 是开源的,项目地址为 https://github.com/curl/curl ,官网为 https://curl.se/ 。
0
curl 其支持的协议有 DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET 和 TFTP。
curl 命令被设计为无需用户交互即可工作。
curl 提供了大量有用的技巧,例如代理支持、用户身份验证、FTP 上传、HTTP post、SSL 连接、cookie、文件传输恢复等。curl 提供的功能的数量可能会让我们眼花缭乱头晕炫目。
2. curl 基本用法
curl 的功能非常强大,非常多,本文只会介绍笔者认为比较常用的用法。详细文档请参阅 man curl 和 man curl-config。
同样因为 curl 的功能实在是太多了,所以本文大概会偶尔追加更新 ...
CentOS 下使用 systemd 守护自定义的进程
我们知道有一些服务型的 Linux 的进程始终在后台运行,并且通常可以做到开机自启,意外退出后自动重启等,始终保持进程常驻不死。我们怎样可以让自己编写的程序实现这样的效果呢?这篇文章就来说说这个,主角便是 systemd。
本文不打算溯源历史,我们只需要知道 systemd 是当前 Linux 系统的基本构建块套件。它提供了一个系统和服务管理器,该系统和服务管理器以 PID 1 运行并启动系统的其余部分。
systemd 是目前绝大部分发行版的 Linux 系统的 1 号进程:
12$ sudo cat /proc/1/status | grep Name:Name: systemd
systemd 直接与内核交互,性能出色,功能极其强大。我们完全可以将程序交给 systemd,让系统统一管理,成为真正意义上的系统服务。
当然了,我们本文要说的进程开机自启、意外退出重启等也只是 systemd 所提供功能的冰山一角,不过足以熟悉其基本使用流程,以后深入使用也更容易。
官方说法:systemd 的拼写是的 “systemd“,而不是 “system D“ 或 “System D“,甚 ...
C++ PImpl 设计模式
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。