• pbcopy命令, pbcopy命令接收标准输出的内容, 并将它放置到剪切板, 支持纯文本和富文本格式(txt | rtf | ps). 输入以下命令将demo.txt中的内容复制到剪切板.
cat demo.txt | bcopy

  • pbpaste命令, pbpaste与pbcopy命令是一对, 它将剪切板的内容清除并写到标准输出, 支持txt、rtf和ps格式.
  • say命令, 将文字转化为语音输出, 还可将语音保存为文件, 挺强大的, 用man可以看到更加详细的用法.
say "hello world"

我们都知道, 在常用的JVM平台如Oracle JDK、OpenJDK中, int类型占用4个字节, 那么用如下代码是否就能正确地从byte[]解析出int了呢?

byte[] bytesOfInt = new byte[]{0x00, 0x00, 0x00, -0x01};
int result = ((int) bytesOfInt[3]      ) +
             ((int) bytesOfInt[2] <<  8) +
             ((int) bytesOfInt[1] << 16) +
             ((int) bytesOfInt[0] << 24);
System.out.println(result);

输出的结果为-1, 答案显然是不对的. 正确的做法是将result的计算方法改为:

int result = ((bytesOfInt[3] & 0xFF)      ) +
             ((bytesOfInt[2] & 0xFF) <<  8) +
             ((bytesOfInt[1] & 0xFF) << 16) +
             ((bytesOfInt[0]       ) << 24);

输出的结果为255. 那么为什么要对bytesOfInt中的低三个字节跟0xFF做按位与运算呢? 这就要牵扯到Java的补位机制和补码原理.

我们都知道字节在JVM中以补码的形式计算和存储, 首先快速回顾一下补码的概念.

  • 正数的补码与其原码、反码相同, 如byte b = 1的原码 = 00000001, 反码 = 00000001, 补码 = 00000001
  • 负数的补码是其反码加1的结果, 而负数的反码是其原码除符号位外, 按位取反的结果, 如byte b = -127的原码 = 11111111, 反码 = 10000000, 补码 = 10000001

而在Java中, byte转int的结果是在其补码的的高24位补符号位(正数补0, 负数补1), 即-127(byte)的补码为10000001, -127(int)的补码为11111111 11111111 11111111 10000001. 虽然它们表示的十进制数值是一样的(均为-127), 但是在byte到int的转换过程中, 其原始字节已经发生了变化. 因此, 这种转换对于位运算来说肯定是不对的. 解决方法就是先与0xFF做按位与运算, 例子如下:

-1(byte)的补码  =(11111111 11111111 11111111)10000001
0xFF(int)的补码 = 00000000 00000000 00000000 11111111
按位与的结果     = 00000000 00000000 00000000 10000001

看到这里, 是不是马上就能理解为什么bytesOfInt[0]不需要再跟0xFF做按位与运算了呢? 不得不说写JDK源代码的人就是扎实、严谨, 毕竟资源能省一点就是一点.

Redis Desktop Manager(RDM)是一款跨平台的Redis桌面客户端, 其支持SSH隧道连接, 批量删除等特性, 是非常优秀的Redis管理工具. 但是在最近的版本中, 作者停止了提供macOS平台的安装包, 需要我们以付费订阅的方式获得. 当然, 作者也提供了从源码安装的方式, 但对于我等又穷又不熟悉QT的小白来说, 方法过于简略.

本人在研究过RDM的Travis脚本后, 成功在macOS平台上编译了app格式的软件包, 在这里把编译方法分享给大家.

  1. 首先, 如果没有安装brew, 请通过以下脚本安装.

    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 安装qt5、openssl、libssh2(不同版本的RDM依赖可能不同, 请根据实际编译时的报错信息安装相应的依赖).

    $ brew update && brew install qt5 openssl libssh2
    $ export PATH=/usr/local/opt/qt5/bin:$PATH

  3. 克隆RDM版本库, 编译并安装CrashReporter.

    $ git clone --recursive git@github.com:uglide/RedisDesktopManager.git rdm && cd rdm
    $ cd 3rdparty/crashreporter && qmake DESTDIR=./bin && make -s -j 8
    $ mkdir -p ../../bin/osx/release && mv bin/crashreporter ../../bin/osx/release

  4. 编译RDM.

    $ cd ../../src && ./configure
    $ qmake CONFIG-=debug && make -s -j 8 && cd ..

  5. 将bin/osx/release文件夹下生成的rdm.app拖到应用程序文件夹中即可完成安装.

最后, 附上本人编译好的rdm.zip, 源码版本是8c439e4821188e11f360236b62e25ccdcab2ba95.