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 设置跟目录的初始权限

参考资料


linux inode 简单理解

Inode是 linux 操作系统中的一种数据结构,包含了各文件相关的一些重要信息。在创建文件系统时,就会同时创建大量的inode,一般inode表会占用文件系统磁盘空间的1%,inode的中文译名为”索引节点”。

我们对一个文件进行操作,如vi编辑,系统在inode表中找到inode编号(inumber),才允许我们打开该inode。

当文件的inode分派给一个用户时,另一个用户如果要操作这个文件时,就要等该inode释放了才可以操作。

查看

ls -i # 看文件inode节点号

df -i # 查看硬盘分区的inode总数和已使用情况

特点

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。inode总数在格式化的时候就确定了。

由于inode号码与文件名分离,导致一些Unix/Linux系统具备以下几种特有的现象。

  1. 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用,
find ./* -inum 节点号 -delete
  1. 移动文件或重命名文件,只是改变文件名,不影响inode号。
  2. 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。

这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

inode耗尽故障

由于每个文件必须有一个inode,因此就有可能发生inode节点用光,但硬盘空间还剩不少,却无法创建新文件的情况。

参考资料


Linux下使用 PDFtk 进行命令行操作pdf

Linux下的一些操作,第一时间想到的还是命令行。

最近要对pdf进行操作,便找到了、这个工具——PDFtk: the pdf tool kit,简单易用。这篇文章做个记录。

功能

PDFtk 目前分为三个版本:

  • PDFtk Server:命令行工具。支持 windows、Linux、Mac。
  • PDFtk Free:图形界面基础免费版;仅限 windows 用户;功能仅限于 PDF 合并和分割;
  • PDFtk Pro:图形界面专业收费版;仅限 windows 用户,可以对 PDF 文档进行合并、分割、旋转、加水印、加邮戳、加密。

对于 Linux 用户,唯一的选择是免费的 PDFtk Server,功能与收费 PDFtk Pro 完全相同。

  • 合并 PDF;
  • 分割 PDF 页面;
  • 旋转 PDF 页面;
  • PDF 带密码访问;
  • PDF 填加密码;
  • 用 X/FDF 填写 PDF 表格;
  • 从 PDF 表格中生成 PDF Data Stencils;
  • 加背景水印或前景印章;
  • 报告 PDF Metrics,书签和元数据;
  • 增加 / 更新 PDF 书签或元数据;
  • 给 PDF 页面或文档加附件;
  • 解压 PDF 附件;
  • 分解 PDF 文档为多个单页;
  • 解压缩和重压缩页面流;
  • 修复受损的 PDF 文档;

安装

Linux上安装:

$ sudo apt-get install pdftk # Debian/Ubuntu
$ sudo yum install pdftk # CentOS

Mac上安装:

$ brew install https://raw.githubusercontent.com/turforlag/homebrew-cervezas/master/pdftk.rb

用法示例

具体选项看这里: http://www.pdflabs.com/docs/pdftk-man-page/,

#提取1-15页为一个文件
$ pdftk input.pdf cat 1-15 output new.pdf

#提取第1至3,第5,第6至10页,并合并为一个pdf文件
$ pdftk input.pdf cat 1-3 5 6-10 output combined.pdf

#合并(concatenate) 前面所有的pdf为output.pdf
$ pdftk file1.pdf file2.pdf ... cat output new.pdf

#拆分PDF的每一页为一个新文件 并按照指定格式设定文件名
$ pdftk input.pdf burst output new_%d.pdf

#按照通配符,合并大量PDF文件
$ pdftk *.pdf cat output combined.pdf

#去除第 13 页,其余的保存为新PDF
$ pdftk in.pdf cat 1-12 14-end output out1.pdf

#扫描一本书,odd.pdf 为书的全部奇数页,even.pdf 为书的全部偶数页,下面的命令可以将两个 pdf 合并成页码正常的书
$ pdftk A=odd.pdf B=even.pdf shuffle A B output collated.pdf

#按180°旋转所有页面
$ pdftk input.pdf cat 1-endsouth output output.pdf

#按顺时针90°旋转第三页,其他页不变
$ pdftk input.pdf cat 1-2 3east 4-end output output.pdf

#输入密码转换成无密码PDF
pdftk secured.pdf input_pw foopass output unsecured.pdf

例子原文,一些翻译如下:

加密 PDF:

pdftk secured.pdf input_pw foopass output unsecured.pdf

PDF 128 位加密,保留全部权限:

pdftk 1.pdf output 1.128.pdf owner_pw foopass

PDF 128 位加密,保留全部权限,打开文档需输入密码 “baz”:

pdftk 1.pdf output 1.128.pdf owner_pw foo user_pw baz

PDF 128 位加密,打开文档需输入密码 “baz”,保留打印之外的其他权限:

pdftk 1.pdf output 1.128.pdf owner_pw foo user_pw baz allow printing

合并 in1.pdf 和 in2.pdf 到新 PDF 中:

pdftk in1.pdf in2.pdf cat output out1.pdf
pdftk *.pdf cat output combined.pdf

去除 in1.pdf 中的第 13 页,并创建 out1.pdf:

pdftk in.pdf cat 1-12 14-end output out1.pdf

对输出进行 40 位加密,撤销所有权限,设置 owner 密码为 foopass:

pdftk 1.pdf 2.pdf cat output 3.pdf encrypt_40bit owner_pw foopass

解压 PDF 页面流,然后就可以在文本编辑器中编辑 PDF 文件:

pdftk doc.pdf output doc.unc.pdf uncompress

压缩 PDF:

pdftk mydoc.pdf output mydoc.clear.pdf compress

修复破损的 PDF:

pdftk broken.pdf output fixed.pdf

将一个 PDF 文档分割成一页一个文档:

pdftk in.pdf burst

将一个 PDF 文档分割成一页一个文档,并加密,允许低质量的打印:

pdftk in.pdf burst owner_pw foopass allow DegradedPrinting

获取 PDF 问的元数据和书签信息:

pdftk in.pdf dump_data output report.txt

将 PDF 第一页顺时针旋转 90 度:

pdftk in.pdf cat 1east 2-end output out.pdf

将整个 PDF 文档旋转 180 度:

pdftk in.pdf cat 1-endsouth output out.pdf

修改目录

  • 提取PDF的目录结构为一个txt文件
  • 手动修改txt文件中的目录结构
  • 将txt文件重新加载到PDF中并生成一个新文件
# 提取信息
$ pdftk sample.pdf dump_data output info.txt

# 修改信息
# ...

# 把更改的信息加载回PDF
$ pdftk sample.pdf update_info info.txt output sample2.pdf

参考资料


docker 运行 mysql 客户端 phpmyadmin

我喜欢 navicat 这个客户端。但毕竟是收费的,总是用着破解版也不是个办法,还要去找源。

我平时使用的多是 postgresql,用的官方的 pgadmin,也是容器化部署。

Mysql的最有名的还是 phpmyadmin ,简单记录一下yaml文件。

version: "3.1"

services:
  phpmyadmin:
    image: phpmyadmin
    container_name: pma
    network_mode: bridge
    ports:
      - 13306:80
    environment:
      - PMA_HOST=10.19.0.230
      - PMA_PORT=13306
      - PMA_ARBITRARY=1
      - PMA_USER=user
      - PMA_PASSWORD=password

更多变量参数可直接参考官方:https://hub.docker.com/_/phpmyadmin