2024年3月

作者引言

  • 很高兴啊,我们来到了接口定义语言(IDL)篇,RPC之基石,有了它,可以在各种各种语言中实现RPC通讯。

Slice 和 Protobuf 是什么?

IceRPC的核心是一个面向字节
bytes
的RPC框架 : 它可以轻松地发送携带字节的请求
requests
,并接收携带更多字节的响应
responses
.

IceRPC以字节为中心的体系结构和API,正是我们移动字节时所需要的框架。然而,如果想为RPC服务定义一个类型化的网络API,并不特别方便.

在RPCs的上下文中,使用
接口定义语言
(IDL)来指定RPCs,是目前非常常见的. 这些
定义也称为客户端和服务器之间的
契约
[
contract
]

代码生成器,根据这些定义[
contract
]生成代码,有如下功能:

  • 通过选择的编程语言,提供类型化的API
  • 通过将类型化数据(整数、字符串、structs等)编码/解码
    encoding/decoding
    到字节流中,或从字节流中解码,来实现此API,以方便定义友好的结构格式

使用IDL,完全不必担心如上细节。将数据结构,编码为可移植二进制格式和将其解码为可移植的二进制格式:
所有这些都由代码生成器,及其支持库来处理.

IceRPC 支持两个IDL,并完全实现对应序列化格式: Slice 与
Protobuf
. 来看看,应该选哪个!

Slice

Slice是与IceRPC协同开发的现代IDL和序列化格式. 它充分利用了所有
IceRPC的特性,并且在代码大小和带宽使用方面都非常紧凑.

例如,IceRPC支持单向RPCs(One-Wey,发送后不理会),Slice提供单向操作
映射到这些单向RPCs. 而Protobuf RPC方法总是返回一个响应,不支持使用Protobuf发送单向RPCs.

可以将Slice视为IceRPC的默认IDL:除非有充分的理由使用Protobuf,否则请使用Slice.

Protobuf

Protobuf(Protocol Buffers)是Google创建的一种流行的IDL和序列化格式。这是一个常见的二进制JSON的替代方案,在谷歌内部广泛使用,目前国内也非常流行.

如果已经熟悉Protobuf,或者您的应用程序与使用或发送的其他应用程序交互
Protobuf消息,应该将IceRPC与Protobuf一起使用.

作者结语

  • 从第一行翻译开始,查看各种翻译,比如 百度翻译,有道翻译,加上自已的理解,有点小累啊
  • 翻译的不好,请手下留情,人也要成长的,谢谢
  • 如果对我有点小兴趣,如可加我个人微信哦,大家交个朋友,一起探讨人生。
  • 觉得还不错的话,点个


    image

FFmpeg支持Linux、macOS、Windows、Android等操作系统,其中Linux系列包括Ubuntu、Debian、Mint、CentOS、RHEL、Fedora等分支。FFmpeg官网的编译入口地址为
https://trac.ffmpeg.org/wiki/CompilationGuide
,在这里可以找到FFmpeg对各系统的编译说明。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

一、在CentOS上编译安装FFmpeg

以常见的CentOS为例,FFmpeg的编译说明页面为
https://trac.ffmpeg.org/wiki/CompilationGuide/Centos
,这里给出了在CentOS上编译安装FFmpeg的详细步骤。

1、安装工具包

根据FFmpeg官网的说明,首先要通过yum安装下列工具:

yum install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel

接着创建名叫ffmpeg_sources的目录:

mkdir ~/ffmpeg_sources

2、安装NASM

某些库使用的汇编程序。强烈建议使用,否则生成的版本可能会非常缓慢。
NASM的编译和安装命令如下:

cd ~/ffmpeg_sources
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install

3、安装Yasm

某些库使用的汇编程序。强烈建议使用,否则生成的版本可能会非常缓慢。
Yasm的编译和安装命令如下:

cd ~/ffmpeg_sources
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install

4、安装libx264

H.264视频编码器。libx264依赖nasm-2.13以上版本。需要FFmpeg增加配置选项“ --enable-gpl --enable-libx264”。
libx264的编译和安装命令如下:

cd ~/ffmpeg_sources
git clone --branch stable --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make install

5、安装libx265

H.265/HEVC视频编码器。需要FFmpeg增加配置选项“ --enable-gpl --enable-libx265”。
libx265的编译和安装命令如下:

cd ~/ffmpeg_sources
git clone --branch stable --depth 2 https://bitbucket.org/multicoreware/x265_git
cd ~/ffmpeg_sources/x265_git/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make install

6、安装libfdk_aac

AAC音频编码器。需要FFmpeg增加配置选项“ --enable-nonfree --enable-libfdk_aac”。
libfdk_aac的编译和安装命令如下:

cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

7、安装libmp3lame

MP3音频编码器。需要FFmpeg增加配置选项“ --enable-libmp3lame”。
libmp3lame的编译和安装命令如下:

cd ~/ffmpeg_sources
curl -O -L https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make
make install

8、安装libopus

Opus音频解码器和编码器。需要FFmpeg增加配置选项“ --enable-libopus”。
libopus的编译和安装命令如下:

cd ~/ffmpeg_sources
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
tar xzvf opus-1.3.1.tar.gz
cd opus-1.3.1
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

9、安装libvpx

VP8/VP9视频编码器和解码器。需要FFmpeg增加配置选项“ --enable-libvpx”。
libvpx的编译和安装命令如下:

cd ~/ffmpeg_sources
git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make install

10、安装FFmpeg

FFmpeg的编译和安装命令如下:

cd ~/ffmpeg_sources
curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs=-lpthread \
  --extra-libs=-lm \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libfdk_aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree
make
make install
hash -d ffmpeg

二、在EulerOS(欧拉系统)上编译安装FFmpeg

欧拉系统是国内自主研发的服务器操作系统,截止2023年底,欧拉在服务器操作系统市场份额达36.8%。EulerOS基于CentOS的源码开发,运行环境兼容CentOS,国内的华为云、天翼云、移动云、联通云均采用欧拉系统。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

1、安装工具包

经实测,在欧拉系统上需要通过yum安装下列工具:

yum install nasm g++ openssl-devel curl-devel cmake git

2、安装x264

到这个网址下载最新的x264源码包
https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.gz
,将下载好的压缩包上传到欧拉服务器并解压,再执行下面的编译和安装命令:

./configure --enable-shared --enable-static
make
make install

3、安装x265

到这个网址下载最新的x265源码包
https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz
,将下载好的压缩包上传到欧拉服务器并解压,再执行下面的编译和安装命令:

cd build
cmake ../source
make
make install

4、安装FFmpeg

到这个网址下载最新的FFmpeg源码包
https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n5.1.2.tar.gz
,将下载好的压缩包上传到欧拉服务器并解压,再执行下面的编译和安装命令:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-iconv --enable-gpl --enable-nonfree
make
make install

安装完毕,运行以下命令查看FFmpeg的版本信息。

ffmpeg -version

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

大家好,我是树哥。

在一年多之前,我做了一次大胆的决定 —— 花 1 万块钱做一次付费咨询。但这并不是一次咨询的费用,而是 12 个月的年度咨询服务,每个月 1 次,每次大概 1.5 小时。时至今日,距离咨询结束已过去将近半年的时间,我也能更客观地看待此次咨询所带来的价值。所以,今天就让我和大家分享一下此次付费咨询的经历吧。

咨询背景

我大概是在 2022 年 9 月底开始咨询的,当时自己刚度过一段不是很平稳的职场经历,并且入职现在的公司。在心态上以及职场方向上比较摇摆不定,出于尝试的猎奇心态,想看看咨询到底能够带来什么价值,我开始了此次的咨询之路。

年度咨询

年度咨询,指的是以年为单位的持续咨询。这种咨询方式会对你进行全方位的了解,包括:你的家庭背景、成长经历、学习经历、工作经历,还会对你的性格做各种测验,从而更加全方位地了解咨询者。

与年度咨询形成对比的是整案咨询,它指的是针对某个特定案例进行的咨询。整案咨询目的是解决问题,并不会太深入地了解咨询者的家庭背景等信息。由于我后续考虑做年度咨询,因此我是先付了整案咨询的钱,但按照年度咨询做了全方位的评估。

在开始咨询前期,我填写了大量的测试题,做了各种类型的测试,包括但不限于:

  • MBTI 性格测试
  • 霍兰德职业倾向测验
  • 职业锚测试
  • 价值观测量
  • 盖洛普测试
  • 等等

做了这些测试之后,我与咨询师大概聊了两三个小时。咨询过后,大概过了几周的时间,我收到了一份「职业咨询报告」。在报告里面对我的个人情况做了分析,包括:

  • 教育/培训背景分析
  • 职业经历分析
  • MBTI 性格类型分析
  • 客户性格理解与分析
  • 客户职业价值观分析
  • 解决方案
  • 行动计划
  • 等等

总的来说,职业咨询报告的内容还是非常详细的。报告针对之前填写的测试内容,结合自身的经历以及性格特点的信息,给出了解决方案以及行动计划。
如果说咨询到这里截止,那么我大概是花 1000 块钱左右。
对于自己而言,花费 3000 多块获得这样一份咨询报告,算是物有所值。

职业生涯访谈

整案咨询过后,会有 3 个月的行动落地期。在这三个月的时间里,每个月会有 1 个小时的咨询时间。在这 3 个月的时间里,我从咨询师那边学到了一些不错的技能,其中一个就是 —— 职业生涯访谈。

职业生涯访谈指的是根据你的目标,去访谈你的目标岗位。例如你未来 3 年的目标是成为总监,那么你就去找现在已经是总监的人。去跟他们聊天,咨询他们目前的日常工作是什么,他们需要什么能力等等。

通过这样的方式,你可以更深刻地理解目标岗位的生活状态、所需技能。你也可以进一步反问自己:这是你想要的工作状态吗?你具备了这些工作技能了吗?

我非常认真地实践了「职业生涯访问」,并输出了一篇文章分享:
《找公司 CTO 聊了聊,原来技术总监需要这些能力!》

不断地重建

如果说咨询报告是开端,那么后续的整个咨询过程,就是对于咨询报告所写行动计划的落地。咨询报告毕竟是理论化的,实际情况比这复杂一百倍、一万倍,如何将方案落地才是最难的。

在我的理解里,后续的月度咨询应该是对行动计划的落地,应该坚定不移地落地执行。但实际上,我是在不断地咨询中调整原有的计划,寻找一条更适合自己的路径。为什么会是这样子呢?

因为理论只是理论,它没有加入太多的客观因素。但在实践中,我们受到各种客观因素影响,例如:公司是否有对应的发展机会?行业整体发展情况好不好?你的性格是否喜欢这么做?等等。

正是因为有如此多的因素影响着,所以一开始的行动计划慢慢就变成废纸一张。我对自己的认知也在不断地打翻、重建、打翻、重建,直到最后才稍微清晰、坚定一些。

这个过程,其实慢慢持续有 4、5 个月,到了后续的月份,对自己的认知以及路径上的理解,才慢慢比较成熟稳定下来。

找个人剖析自己

到了后面几个月,其实大方向上基本已经确定,并且很多改变也很难在一个月内能有所改变。于是,在最后几个月的咨询里,其实就变成了一种分享自己的想法和经历,找个人剖析认识自己了。

其实如果经济实力允许,找个人聊聊天更深刻地认识下自己,也挺好的。毕竟人家是 1000 块/小时的付费咨询,很多时候都不会只停留在单纯聊天的程度上,而是会给你一些真实的反馈。在某种程度上,这可以让你对自己的认知更上一层楼,可以让你发现自己身上的一些小细节。

很多东西的改变,其实就是从一些细微的地方发生的。咨询师能在聊天中,帮你发现这些细微的细节。你发现了这些细节,那么你就可以在下个月去改进。一个月一个月过去,你就可以持续地进步,这就是润物细无声式的进步吧。

值得吗

花了 1 万多做这么一次付费咨询,值得吗?

不同的人会有不同的答案。对于我来说,我觉得还是值得的。因为我实实在在获得了很多收获,例如:学会了「职业生涯访问」这项技能。比起其他人只会口头说说而已,我已经学会如何分析目标岗位了,并且还进行了实践。除此之外,我也在一次又一次的月度咨询中,实实在在地获得提升了对自己的认知。

如果有这个经济基础,付费咨询是挺值得尝试的,毕竟好不好还得自己试一试。

如果你觉得今天的文章对你有帮助,欢迎点赞转发评论支持树哥,你的支持对于我很重要,感谢大家!

写在开头

在之前的博文中,我们介绍了volatile关键字,Java中的锁以及锁的分类,今天我们花5分钟时间,一起学习一下另一个关键字:
synchronized

synchronized是什么?

首先
synchronized
是Java中的一个关键字,所谓关键字,就是Java中根据底层封装所赋予的一种具有特殊语义的单词,而synchronized译为同步之意,可保证在同一时刻,被它修饰的方法或代码块只能有一个线程执行,它的使用解决了并发多线程中的三大问题:
原子性、可见性、顺序性

很多小伙伴在过往的书籍中可能会看到说synchronized是一种重量级锁,性能差,不建议在代码中使用,其实这是早期的synchronized特点,自JDK1.6之后,synchronized 引入了大量的优化如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销,这些优化让 synchronized 锁的效率提升了很多。因此, synchronized 还是可以在实际项目中使用的,像 JDK 源码、很多开源框架都大量使用了 synchronized 。

synchronized的使用

synchronized在Java中主要的3种使用方式:

  1. 修饰实例方法:
    为当前对象实例加锁,进入同步方法需要先获取对象锁;
  2. 修饰静态方法:
    为当前类加锁,锁定的是Class对象,进入同步方法需要先获取类锁;
  3. 修饰代码块:
    为指定对象加锁,进入同步方法需要先获取指定对象的锁。

样例:

//修饰实例方法,为当前实例加锁
synchronized void method() {
    //业务代码
}
//修饰静态方法,锁为当前Class对象
synchronized static void method() {
    //业务代码
}
//修饰代码块,锁为括号里面的对象
synchronized(this) {
    //业务代码
}

写到这里,突然想到了3个面试可能会考的知识点,列举一下!

问题1:synchronized修饰代码块可以给类加锁吗?

当然可以!我们前面说了修饰代码块时,是给代码中的对象加锁,这里面的对象既可以是实例也可以是类。

问题2:静态 synchronized 方法和非静态 synchronized 方法之间的调用互斥么?

不互斥!如果线程A调用一个实例对象的非静态synchronized方法,线程B同时去调用这个实例对象所属类的静态synchronized方法并不会发生互斥,因为线程A此时拿到的是实例对象锁,而线程B拿到的是当前类的锁。

问题3:构造方法可以用 synchronized 修饰么?

不可以!构造方法本身就是线程安全的,在Java开发规范里也明确告诉我们

构造方法不能是抽象的(abstract)、静态的(static)、最终的(final)、同步的(synchronized)。

synchronized的底层原理

在synchronized的底层(JVM层面),针对方法与代码块的实现逻辑是不同的,因此我们在分析底层原理是也要分别来看。

1、当synchronized修饰方法时

public class Test {
    public synchronized void method() {
        System.out.println("synchronized 方法");
    }
}

我们通过对编译后的class文件进行反编译后,分析其底层实现。

知识点扩展:
我们通过javap命令进行反编译,javap是Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码等。
javap参数如下:

image

使用方式,既可以在电脑的命令行提示符中使用,也可以通过idea的terminal终端使用,我这里采用idea中进行反汇编操作。参考命令:
javap -c -v Test.class

【反汇编结果】

image

由上图可看出同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制,如果修饰的是实例方法,JVM会获取对象锁,如果修饰的是静态方法,JVM会获取当前类锁。

2、当synchronized修饰代码块时

public class Test {
    public void method() {
        synchronized (this) {
            System.out.println("synchronized");
        }
    }
}

【反汇编结果】

image

与同步方法不同,同步代码块中使用了monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置,并且monitorexit标识有2个,以保证在正常执行和异常情况下均可释放锁。

在命令执行到monitorenter时,线程会去尝试获取对象得锁,这里也可称之为对象所对应的monitor所有权。写到这里,我们又要做一个知识点扩展啦。

知识点扩展:

在JVM中monitor的底层基于C++实现,被称之为对象监视器,每个对象都会内置一个
ObjectMonitor
与之关联,关联的起始地址存于对象头的MarkWord中。

image

ObjectMonitor几个关键属性:

  • _owner:指向持有ObjectMonitor对象的线程
  • _WaitSet:存放处于wait状态的线程队列
  • EntryList:存放处于等待锁block状态的线程队列
  • recursions:锁的重入次数
  • _count:用来记录该线程获取锁的次数

当多个线程同时访问同步代码时,会被放入EntryList中,根据线程优先级尝试获取对象锁,如果锁的计数器为 0 则表示锁可以被获取,获取到锁的线程进入owner区域,count加1,这里其实还有之前说的object中的wait/notify/notifyall的组合,也依赖monitor,所以他们才必须用在同步方法或代码块中。
对象锁的的拥有者线程才可以执行 monitorexit 指令来释放锁。在执行 monitorexit 指令后,将锁计数器设为 0,表明锁被释放,其他线程可以尝试获取锁。

总结

关于synchronized的介绍其实远没有结束,还有很多细节可以值得学习,我们会在后面的文章中逐渐补充,避免文章过长,读者失去阅读的耐心!

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得
留言+点赞+收藏
呀。原创不易,转载请联系Build哥!

image

如果您想与Build哥的关系更近一步,还可以关注“JavaBuild888”,在这里除了看到《Java成长计划》系列博文,还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等,欢迎您的加入!

image

转载请注明出处:

iptables-save
命令在 Linux 系统中用于将当前运行的
iptables
防火墙规则导出到一个文件中。这对于备份规则、迁移规则或在不同系统间共享规则配置非常有用。

基本用法

基本用法是将当前的
iptables
规则保存到文件中,如下所示:

iptables-save > /path/to/your/rules.v4

这会将规则保存到
/path/to/your/rules.v4
文件中。可以将
/path/to/your/rules.v4
替换为你希望保存规则文件的路径和名称。

常用选项

iptables-save
命令有几个常用的选项:

  • -c

    --counters
    :导出规则时,也保存每个规则的计数器信息(即每个规则被匹配的次数)。
  • -t

    --table
    :指定要保存的
    iptables
    表的名称。默认是
    filter
    表,但也可以是
    nat

    mangle

    raw
    等其他表。

示例

示例 1:保存所有规则到文件

iptables-save > /etc/iptables/rules.v4

这会将所有
iptables
规则(默认为
filter
表)保存到
/etc/iptables/rules.v4
文件中。

示例 2:保存特定表的规则

如果你想保存
nat
表的规则,可以这样做:

iptables-save -t nat > /etc/iptables/rules.nat

示例 3:保存规则并包含计数器

如果你希望保存规则时同时包括每个规则的计数器信息,可以使用
-c
选项:

iptables-save -c > /etc/iptables/rules-with-counts.v4

使用场景

  1. 备份:在更改或升级系统之前,备份当前的
    iptables
    规则是一个好习惯。如果出现问题,你可以轻松地恢复到之前的状态。

  2. 迁移:当你从一个系统迁移到另一个系统时,你可能希望将
    iptables
    规则也迁移过去。使用
    iptables-save

    iptables-restore
    可以方便地实现这一点。

  3. 配置管理:如果你使用配置管理工具(如 Ansible、Chef 或 Puppet)来管理你的服务器,
    iptables-save
    可以帮助你捕获和存储当前的防火墙规则状态,以便在需要时应用它们。

注意

  • iptables-save
    命令只是导出规则,并不会修改任何现有的规则或配置。
  • 要应用保存的规则,你需要使用
    iptables-restore
    命令。
  • 在使用
    iptables-save

    iptables-restore
    时,请确保你完全理解你正在做什么,因为错误的规则配置可能会导致安全问题或网络中断。

通过
iptables-save
命令,可以轻松地管理和维护你的
iptables
防火墙规则。