git 命令行查看文件的某个版本历史

我一般使用可视化的 ui 工具来查看某个文件的历史,但也免不了有的场景只有命令行工具。

1. 使用 git log 查看历史记录并获取前一个版本的 commit hash

git log -- file_name
git log --stat  #展示每笔提交更详细的信息

这会显示该文件的提交历史记录,可以看到每次修改的 commit hash。

获取到 commit hash 后,使用以下命令查看文件的上一个版本:

git show commit_hash:file_name

2. 快速查看某个文件的上一个版本

如果只想查看上一个版本,而不想手动查找 commit hash,可以使用下面的命令(HEAD^ 指上一个提交):

git show HEAD^:file_name

这个命令直接展示文件在上一个提交时的内容。

3. 对比文件与上一个版本的差异

如果想要比较文件当前版本与上一个版本的差异,可以使用 git diff:

git diff HEAD^ HEAD -- file_name

linux 使用 unzip 解压的中文乱码问题

来自windows下的解压乱码真是痛:

image-20211220110600679

zip格式没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,Linux下的默认编码是UTF8。

可以使用 unzip-iconv 这个补丁包,指定解压的编码格式。

一、安装unzip-iconv补丁

$ wget https://github.com/ikohara/dpkg-unzip-iconv/archive/refs/heads/main.zip
$ unzip main.zip
$ cd main
$ make source
$ sudo make build-dep
$ make
$ sudo make install

更详细的说明参考GitHub上的项目信息: https://github.com/ikohara/dpkg-unzip-iconv

二、使用

unzip -O cp936 xxx.zip

参考帮助


增加docker的shm(共享内存)大小

接着上一篇《Linux下的 /dev/shm》,应用在docker中也会使用到容器里的shm。但创建 docker 的时候默认shm大小为64M,如果应用使用了比较大的shm,则很可能会崩溃。此时解决有2个办法:

  1. 挂载宿主机的shm,完美。

    services:
      app:
        image: kelvinblood/app
        ...
    	volumes:
      	- /dev/shm:/dev/shm
    
  2. 运行。

    services:
      app:
        image: kelvinblood/app
        ...
        shm_size: 512mb
        shm_size: '2gb'
    

    或者:

    docker run -it --shm-size="1g" ubuntu
    

selenium 裸安装备忘

  • 因为弄的standalone-chrome-debug,chrome老是崩溃,愤而裸机安装。
  • 因为裸机安装的hub/standalone或者hub/node,chromedriver启动的chrome老是黑屏,愤而用容器的node。
  • 用容器的node,依旧会chrome崩溃

由于上述几个原因,我在本机安装了 selenium,希望能更了解一些selenium,便有了本文。虽然最后我从其他地方解决了遇到的问题,这篇文章也就没有了实际意义,但还是记录下来。

一、安装java

selenium官方没有说明java使用的版本,我决定使用最新的版本。

image-20211214161118210

二、安装Selenium Grid

image-20211214163037163

三、安装chrome和chrome driver

四、4种不同的方式运行Grid

  • Standalone

    java -jar selenium-server-<version>.jar standalone
    java -jar selenium-server-4.1.0.jar standalone --host 0.0.0.0 --port 4445
    
  • Hub and Node

    java -jar selenium-server-4.1.0.jar hub --host 0.0.0.0 --port 4445
    java -jar selenium-server-4.1.0.jar node
    java -jar selenium-server-4.1.0.jar node --detect-drivers true --publish-events tcp://127.0.0.1:4442 --subscribe-events tcp://127.0.0.1:4443
    

    hub/node 用容器化的方式弄

    docker pull selenium/hub:4.1.0
    docker pull selenium/node-chrome:96.0
    
      node-chrome:
        image: selenium/node-chrome:96.0
        restart: always
        network_mode: bridge
        container_name: node-chrome
        ports:
          - "5901:5900"
        environment:
          SE_EVENT_BUS_HOST: 192.168.1.133
          SE_EVENT_BUS_PORT: 4445
          SE_EVENT_BUS_PUBLISH_PORT: 4442
          SE_EVENT_BUS_SUBSCRIBE_PORT: 4443
          NODE_MAX_SESSION: 4
          NODE_MAX_INSTANCES: 4
    
  • Distributed

  • Docker

访问地址:http://localhost:4445/

image-20211214171806096

chrome 崩溃

https://developers.google.com/web/tools/puppeteer/troubleshooting#tips

默认情况下,Docker 运行一个/dev/shm共享内存空间为 64MB的容器。这对于 Chrome来说 通常太小,并且会导致 Chrome 在渲染大页面时崩溃。

要修复,请运行容器 docker run --shm-size=1gb以增加/dev/shm.

从 Chrome 65 开始可以使用--disable-dev-shm-usage标志启动浏览器。这会将共享内存文件写入/tmp而不是/dev/shm.

const browser = await puppeteer.launch({
  args: ['--disable-dev-shm-usage'],
});

尤其是如果你的容器需要跑在kubernetes上,最好还是以添加参数--disable-dev-shm-usage 这种方式运行了。


Nginx 流速限制

我用 nginx 做了一个简单的文件下载,分享一些会议的 ppt 给朋友下载。但是我又担心小水管不小心被拖死,总不能对每一个朋友说“你限制一下你的下载速度”吧。

这篇文章做个简单记录。

http {

    limit_conn_zone $binary_remote_addr zone=perip:2m;

    server
    {
      listen 443 ssl;
      server_name d.kelu.org;

      ... ...

      limit_conn perip 5;
      limit_rate 250k;
      limit_rate_after 10240K;
      autoindex on;
      autoindex_localtime on;
      autoindex_exact_size off;
    }

}
  1. $binary_remote_addr IP地址。这里配置的是IP,也可以使用如 $server_name 作为KEY来限制域名级别的最大连接数。

  2. zone=perip:2m 设置zone为perip,每个ip缓冲区为2m。

  3. limit_conn perip 5 一个 IP 最多同时有5个连接。缓存区的大小为2m。

  4. limit_rate 250k;

    ​ 速率最大为250k/s。

  5. limit_rate_after 10240K

    ​ 忽略最初的流量。

参考资料


Linux下的 /dev/shm

关于/dev/shm

  • 它是linux下一个目录,不在磁盘上,而是在内存里。
  • 它的效率非常高,直接写进内存,无磁盘IO。
  • 它默认最大为内存的一半大小,使用df -h命令可以看到。
  • 它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节。
  • 默认系统就会加载/dev/shm ,就是所谓的tmpfs。
  • tmpfs是一个内存之上构建的文件系统(低内存下也可能会落在swap分区)。
  • Oracle 11g的amm内存管理模式就是使用/dev/shm。

调整shm大小

  1. 临时调整

    mount -o remount,size=1500000k /dev/shm
    
  2. 永久生效

    在/etc/fstab里面添加

    none      /dev/shm        tmpfs   defaults,size=8G        0 0
    
  3. 调整tmpfs大小

    mount -t tmpfs -o size=5G,nr_inodes=5k,mode=700 tmpfs /disk2/tmpfs
    
    • remount 重新加载,数据不丢。(如果umount,数据直接丢失!)
    • size=8G或者50% 指定/dev/shm文件系统字节数。默认为内存容量的一半。
    • nr_blocks作用和size类似,指定文件系统大小,但是指定的是多少个PAGE_CACHE_SIZE
    • nr_inodes=5k 最大inode数量,默认上限为物理内存页数量的一半。
    • mode=700 设置跟目录的初始权限

参考资料