工具

图解git工作原理

本文介绍了Git的工作原理。假定您对Git有足够的了解,可以使用它对项目进行版本控制。

本文着重于支撑Git的图结构以及该图的属性指示Git行为的方式。从基础上看,您的思维模型是建立在事实之上,而不是根据在尝试API时收集的证据构建的假设。这个更真实的模型使您可以更好地了解Git所做的事情,正在做的事情以及它将做的事情。

文本的结构是在单个项目上运行的一系列Git命令。有时会观察到有关构建Git的图形数据结构的信息。这些观察结果说明了图形的属性以及该属性产生的行为。

阅读后,如果您想更深入地研究Git,可以查看我在JavaScript中实现Git的注释严重的源代码。…

推荐六个鲜为人知的 Composer 命令

Composer 是 PHP 的一个依赖管理工具。 如果你是一名 PHP 开发人员,那么你很可能每天都在使用它并且频繁的运行命令 require, install 和 update。也许你并没有意识到, 我们可以使用一些其他的 Composer 命令,来更加轻松的使用它。

它有许多的命令可以使用,但今天我将分享我使用的并且每天都有帮助的 6 个命令。…

抓包工具tcpdump用法说明

本文原创地址:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7064286.html#auto_id_0

tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。

不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。

例如:

shell> tcpdump -nn -i eth0 icmp

下面是详细的tcpdump用法。…

如何画出一张合格的技术架构图?

摘要: 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。

image

阿里妹导读:技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。

接下来,阿里巴巴技术专家三画,将分享自己和团队在画好架构图方面的理念和经验,希望对你有所帮助。

当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况:

  • 对着画布无从下手、删了又来?
  • 如何用一张图描述我的系统,并且让产品、运营、开发都能看明白?
  • 画了一半的图还不清楚受众是谁?
  • 画出来的图到底是产品图功能图还是技术图又或是大杂烩?
  • 图上的框框有点少是不是要找点儿框框加进来?
  • 布局怎么画都不满意……

如果有同样的困惑,本文将介绍一种画图的方法论,来让架构图更清晰。

先厘清一些基础概念

1、什么是架构?

架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是一系列的决策。

架构是结构和愿景。

系统架构是概念的体现,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。

做好架构是个复杂的任务,也是个很大的话题,本篇就不做深入了。有了架构之后,就需要让干系人理解、遵循相关决策。

2、什么是架构图?

系统架构图是为了抽象地表示软件系统的整体轮廓和各个组件之间的相互关系和约束边界,以及软件系统的物理部署和软件系统的演进方向的整体视图。

3、架构图的作用

一图胜千言。要让干系人理解、遵循架构决策,就需要把架构信息传递出去。架构图就是一个很好的载体。那么,画架构图是为了:

  • 解决沟通障碍
  • 达成共识
  • 减少歧义

image

4、架构图分类

搜集了很多资料,分类有很多,有一种比较流行的是4+1视图,分别为场景视图、逻辑视图、物理视图、处理流程视图和开发视图。

场景视图

场景视图用于描述系统的参与者与功能用例间的关系,反映系统的最终需求和交互设计,通常由用例图表示。

image

逻辑视图

逻辑视图用于描述系统软件功能拆解后的组件关系,组件约束和边界,反映系统整体组成与系统如何构建的过程,通常由UML的组件图和类图来表示。

image

物理视图

物理视图用于描述系统软件到物理硬件的映射关系,反映出系统的组件是如何部署到一组可计算机器节点上,用于指导软件系统的部署实施过程。

image

处理流程视图

处理流程视图用于描述系统软件组件之间的通信时序,数据的输入输出,反映系统的功能流程与数据流程,通常由时序图和流程图表示。

image

开发视图

开发视图用于描述系统的模块划分和组成,以及细化到内部包的组成设计,服务于开发人员,反映系统开发实施过程。

image

以上 5

说说压力测试工具

系统写好了,能不能顺利上线?一般来说我们需要做一些压力测试来判断。比如系统预计每天一百万的接口访问量,并且访问时段主要集中在早八点到晚八点,那么平均下来 RPS 大约是 22 次左右,不过用户的访问量通常不会很平均,假设峰值流量是平均流量的 3 到 5 倍的话,那么我们可以推断出项目要想顺利上线,RPS 至少应该达到 66+ 次,110+ 次更好。由此可见上线前用压力测试工具测试 RPS 是一个很重要的环节。

既然压力测试工具如此重要,那么我们不妨挑几个来说说:

首先说说 ab:

ab 无疑是目前最常见的压力测试工具。其典型用法如下:

shell> ab -k -c 100 -t 10 http://domain/path

其中,参数「c」表示的是并发,参数「t」表示的是整个测试持续的时间。一个很容易被忽视的参数是「k」,它会增加请求头 Connection: Keep-Alive,相当于开启了 HTTP 长连接,这样做一方面可以降低测试服务器动态端口被耗尽的风险,另一方面也有助于给目标服务器更大的压力,测试出更接近极限的结果。

再来说说 wrk:

wrk 相对于 ab 来说最大的优点是它支持多线程,这样更容易发挥多核 CPU

用strace查找进程卡死原因

最近遇到进程卡死的情况,但是自己调试的过程中并不一定能复现,都是需要运行一段时间某些条件下才会触发,对于这种运行着不能破坏现场的情况,我们可以使用gdb -p和strace -p来跟踪。
首先我们用ps auxf查看我们的进程执行到了哪一步:

 

可以看到执行到了docker exec -i 178.20.1.229_0115034556 ls然后就卡死了
然后我们进一步通过strace查看执行这个操作死在哪个系统回调了: …

    

使用ffmpeg修改视频文件的分辨率

这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案。

更改视频文件的分辨率将是我们在处理视频文件时将执行的最常见操作之一,因此ffm​​peg能够完美地完成此操作。我们应该想要更改视频文件的分辨率有几个原因,例如:

  • 减少视频的大小。这可以通过降低视频的分辨率来实现。如果我们采用高清(1920x1080像素)的视频,但我们知道我们永远不会在支持比1024x768更高分辨率的屏幕上看到,我们可以降低视频分辨率以适应这种新分辨率,从而节省大量存储空间空间,如果在互联网上使用,也可以节省带宽。
  • 很多时候,视频文件的分辨率会发生变化,从而使其格式标准化。也就是说,如果我们有几个视频并且我们希望它们都在同一分辨率下,则必须经历这个改变分辨率的过程。

在现代网站的开发中,根据它们出现的位置来分辨各种分辨率的视频是非常有用的。我们可以开发具有响应式设计的网站,其中最适合用户的视频播放。例如,如果我们有各种格式的视频 - 我们说1920x1080,1280x720和640x360-我们可以设计一个响应式网站,让访问者根据访问者浏览器节省带宽重现正确的视频分辨率(请记住,移动用户通常支付传输数据,因此最好尽可能少地传输流量)

在这个例子中,我们将高清格式(1920x1080像素)的视频分辨率降低到640x360(对于宽高比16:9,这是一个相当常用的配置):

ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 -hide_banner

仅需要使用-vf scale = 640:360以新的所需分辨率(640:360)指示缩放视频滤波器  。要考虑:

  • 我们可以指出我们想要的任何分辨率,但生成的视频将始终具有相同的宽高比。也就是说,它不会扭曲图像,如果视频的宽高比为16:9,它将保持视频的16:9宽高比。该程序将调整生成的视频,使其符合我们给出的分辨率。
  • 更改分辨率时,视频必须再次进行编码过程,因此根据输出格式和用于输出的编解码器,过程可能会很慢。
  • 我们还没有提到它,但大多数时候  将视频转换为更高的分辨率  是没有意义的,因为视频质量没有任何改善。

更改视频宽高比

如果我们想要改变视频的外观,知道图像会显得扭曲,我们可以使用额外的过滤器“ setdar”。想象一下,在前一种情况下,我们想要将16:9的宽高比改为4:3,因此视频的分辨率为4:3宽高比,在这种情况下,它将是640x480。进行此转换的ffmpeg命令将是:

ffmpeg -i video_1920.mp4 -vf scale=640:480,setdar=4:3 video_640x480.mp4 -hide_banner

我们在这种情况下获得的视频输出  video_640x480.mp4  改变了原始视频的外观并且稍微扭曲了图像,但它将以新的外观获得我们想要的分辨率。

另一方面,如果我们不想依赖于使用可能