Eric 发布的文章

使用 USB 转TTL 连接树莓派

网上购买了 USB 转 TTL 的线, 可是这货把RXD,TXD标错了.
usbttl.jpg

  1. 这个线的型号是: CH340G. 要安装驱动, 如果你电脑是linux,默认不需要装, 若win 和mac 需要安装. 我是mac, google 一下 驱动在这: https://github.com/adrianmihalko/ch340g-ch34g-ch34x-mac-os-x-driver 里面有安装说明;
  2. 根据说明要在 系统设置里面 把这个驱动软件解禁, 然后重启mac;
  3. 重启后, 插入接好的USB, ls /dev/cu. Tab 键, 就能看到新的设备;
  4. 然后连上树莓派. sudo cu -l /dev/cu.wchusbserial1410 -s 115200 然后entry 键, 就显示要输入pi的用户名密码了.

动态加载JS 动态添加CSS 转换页面DIV 为pdf

动态加载JS

function loadScript(scriptUrl, callback) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = scriptUrl;
    document.head.appendChild(script);
    callback();
}

loadScript("https://code.jquery.com/jquery-3.3.1.min.js", function() {
    console.log("loading script");
    setTimeout(function () {
        console.log("loading done");
            //部分DIV 变为整个页面
        $("body").html($('#sbo-rt-content').wrap('<p/>').parent().html());
            //动态添加CSS
        $(document.head).append(`<style>
            @media print {
                #sbo-rt-content {
                    background-color: white;
                    height: 100%;
                    width: 100%;
                    position: fixed;
                    top: 0;
                    left: 0;
                    margin: 0;
                    padding: 15px;
                    font-size: 14px;
                    line-height: 18px;
                }
            }
        </style>`);
            //打印
        window.print();
    }, 3000);
});

linux 本地端口 使用

今天查问题 遇到如下异常:
java.net.ConnectException: Cannot assign requested address

看到网上大多数是说 本地往外连接的端口已经被占用完.

  1. 首先查看本地的 ulimit 设置, 是否过小
    _$ ulimit -a
  2. 如果不是很小, 查看当前的 端口使用情况
    _$ ss -s
  3. 查看本地往外连接端口的设置:
    _$ cat /proc/sys/net/ipv4/ip_local_port_range

更多的 linux 网络配置参数:https://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.obscure.html#AEN1252

参考:
https://ma.ttias.be/linux-increase-ip_local_port_range-tcp-port-range/

最简单的基于 nginx 的下载服务器

有时候, 有些地方不能从互联网下载东西, 但是可以上传一些内部的 docker image, 比如 生产环境, 一般是连不上外网的, 及时使用代理, 很有可能也不允许下载很大的东西. 这个时候, 可以做个 docker image 上传上去, 然后供生产环境使用. 下面是一个基于 nginx 的最简单 web 服务器.

需要2个文件, 里面的 mat.zip 和 那个 jdk 的 exe 是我需要下载的东西.
Dockerfile (去除下面的所有注释)

FROM alpine
RUN apk update
RUN apk --no-cache add nginx   #安装 nginx
ADD nginx.conf /etc/nginx/nginx.conf  #复制本地的配置文件
RUN mkdir -p /run/nginx  #建立 nginx pid 文件需要的文件夹
ADD mat.zip /usr/share/nginx/www/  #复制本地需要复制的文件1 例子
ADD jdk-8u171-windows-x64.exe /usr/share/nginx/www/  #复制本地需要复制的文件2 例子
RUN chmod 755 /usr/share/nginx/www/*  #更改文件读权限
EXPOSE 80  #暴露80端口
CMD ["nginx", "-g", "daemon off;"]  #启动 nginx

nginx.conf

events {
  worker_connections 1024;
}

http {
  include /etc/nginx/mime.types;
  index index.html;
  default_type application/octet-stream;
  sendfile     on;

  server {
    location / {
      root /usr/share/nginx/www;
      index not_a_file;
      autoindex on;
      types {}
    }
  }
}

打包: docker build -t repo.tianxiaohui.com/xiatian/test:0.1 .
上传: docker push repo.tianxiaohui.com/xiatian/test:0.1
下载: docker pull repo.tianxiaohui.com/xiatian/test:0.1
运行: docker run -p 9191:80 repo.tianxiaohui.com/xiatian/test:0.1
使用: http://container.tianxiaophui.com:9191/

JVM 常见的参数

//jit 编译器类型

  • -client //32位 client, 启动早, 编译不耗时
  • -server //32位 server, 启动晚, 编译耗时, 最终代码更优化,更快
  • -d64 //64位
  • -XX: TieredCompilation //必须使用 server 编译器, 先 client, 再 server 重新编译
  • -XX:InitialCodeCacheSize=N //初始 code cache 值, 可以通过 jconsole 查看
  • -XX:ReservedCodeCacheSize=N //最大 code cache 值
    //编译开始的 threshold, 不是全局累加计数, 而是移动区间计数
  • -XX:PrintComplilation //打印编译日志 可以通过 jstat 查看编译的统计信息或 jconsole
  • -XX:CompileThreshold=N //是否启动编译的 threshold (方法调用计数器 循环回边计数器)
  • -XX:OnStackReplacePercentage=N //OSR 的 threshold 值, 需要通过公式计算次数
  • -XX:CICompilerCount=N //编译器的线程数
  • -XX:Printflagsfinal 启动时打印所有标志 flags;
  • -XX:+Inline //内联 默认是 true
  • -XX:+DoEscapeAnalysis //逃逸分析 默认是 true

//GC refer: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:-UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
  • -XX:+UseParNewGC
  • -XX:+UseG1GC

//GC log refer: https://dzone.com/articles/enabling-and-analysing-the-garbage-collection-log

  • -XX:+PrintGC

  • -XX:+PrintGCDetails

  • -XX:+PrintGCTimeStamps

  • -XX:+PrintGCDateStamps

  • -Xloggc:

  • -XX:+PrintGCApplicationStoppedTime

  • -XX:+PrintGCApplicationConcurrentTime

  • -XX:+UseGCLogFileRotation

  • -XX:NumberOfGCLogFiles=5

  • -XX:GCLogFileSize=2000k

  • -XX:ParallelGCThreads=N //并发启动的GC 回收线程数目

  • -XX:+DisableExplicitGC

//heap related

  • -Xms //heap start eg: -Xms3000m
  • -Xmx //heap max eg: -Xmx:4000m
  • -XX:NewRatio=N //新生代和老年代占比用比率, default 2. 新生代大小=总堆大小/(1+NewRatio)
  • -Xns //Nursery Start eg: -Xns800m
  • -XX:NewSize=N //新生代初始大小
  • -XX:MaxNewSize=N //新生代最大值
  • -XX:PermSize=N //永久带初始大小
  • -XX:MaxPermSize=N //永久带最大值
  • -XX:MetaspaceSize=N //java8 元空间初始大小
  • -XX:MaxMetaSpaceSize=N //java8 元空间最大值
  • -XX:+PrintAdaptiveSizePolicy //打印自适应策略相关信息
  • -XX:+UseAdaptiveSizePolicy //使用自适应策略. 若xms,xmn,xns固定死,则不使用

//JFR

  • -XX:UnlockCommercialFeatures
  • -XX:+flightRecorder