Lab 023

生成Google Play app signing文件

如果要使用Android App Bundle格式文件上传Google Play,就必须使用Google Play app signing。

官方邮件建议命令:

keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks
keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks

 

另:签名是全局的,如果App要单独使用签名需要发邮件。

Windows 10命令行TCP端口转发

添加端口转发:通过本机 192.168.1.88:60544访问远程地址192.168.1.103:6544

netsh interface portproxy add v4tov4 listenaddress=192.168.1.88 listenport=60544 connectaddress=192.168.1.103 connectport=6544

 

删除端口转发

netsh interface portproxy delete v4tov4 listenaddress=192.168.1.88 listenport=60544

PM2集群环境使用log4js打印日志

pm2的日志性能很好,但log4js写起来更爽,用Node做开发追求的不就是敏捷开发么?

2020.03.01 更新解决不打印Console日志问题

用Docker、Vagrant搭建Mesos实验环境

Mesos躺在我的学习列表里面2年了,最近终于一口气玩了一把,也算完成一桩心事。

整个实验做下来,感觉生产环境可能原生安装会比较好,隔着Docker会有一些奇怪的问题。鉴于没有实战经验,也就不浪费时间瞎说了。

IntelliJ IDEA IU数据库脚本: 导出JPA+JDBC Entity(无Lombok)

使用方法: Database -> 右键数据库表 -> Scripted Extensions -> yourScript.groovy

生成Entity Class

内详

Java和Kotlin混用遇到的各种问题

最近在旧Java项目中添加了Kotlin代码,感受到了新语法的魅力,也遇到了一些不尽如意的问题。使用不深,如有不妥还请指正。

 

加分项

  1. SpringBoot集成无压力,快速嵌入。
  2. 语法简洁有效,既减少了冗余代码,又提高了可读性。
  3. 文档相对完善,遇到问题基本可以搜到解决方案。

 

减分项

  1. 不支持Java代码的Lombok注释,或者说支持有缺陷。我配置了delombok也不能正确解析我自动生成的Entity类。
  2. 格式化代码很卡,我的2019.2 IU格式化或Inspection都会很卡顿(32G内存 + i7 7500U + 固态硬盘)。按理说自家产品支持力度应该很够,然并卵。
  3. Java和Kotlin互调问题。Kotlin调用Java无压力,Java调用Kotlin就要注意权限了。
  4. 写算法部分能带来大量快感,日常代码并不会有太多优势。
  5. 不喜欢Kotlin的List类,没有集成Collection的大部分方法。

 

人生在于尝试,有的人浅尝辄止,有的人深入学习。而我在IDEA卡顿问题解决之前,不会再深入使用。

Element截图(使用html2canvas类库)

安装类库

npm install html2canvas --save

 

main.js引入类库

import html2canvas from 'html2canvas'
const MyPlugin = {
  install(Vue, options) {
    window.html2canvas = html2canvas
  }
}
Vue.use(MyPlugin)

 

打印区域capture

<el-dialog :title="tempValues.bTable.title" id="capture" :visible.sync="tempValues.bTable.visiable"  width="550px" height="978px" top="0vh" >
  <!-- bTable -->
  <el-table :data="tempValues.bTable.actionDataList" :cell-style="{'border': '1px dashed #ebeef5'}"  :cell-class-name="_custom_tableCellClassNamePrint" :show-header="false" :key="tempValues.bTable.tableKey" v-loading="tempValues.bTable.loading" element-loading-text="正在加载数据" border fit highlight-current-row style="background: white!important; background-color: white!important; width: 100%">
    <el-table-column header-align="center" :width="_custom_setColumnWidth(item.key)" :align="setColumnAlign(item.key)" :label="item.display_name" :key="item.key" v-for="item in visiblePrint">
      <template slot-scope="scope">
        <span style="font-size: 20px; font-weight: 400; width: 100%; height: 100%; display:block; padding: 8px 0 8px;">{{ scope.row[item.key] }}</span>
      </template>
    </el-table-column>
  </el-table>
</el-dialog>

 

打印方法

async print(fileName) {
  setTimeout(async function() {
    window.html2canvas(document.querySelector('#capture').firstChild).then(canvas => {
      // npm install file-saver
      canvas.toBlob(function(blob) {
        saveAs(blob, fileName + '.png')
      })
    })
  }, 2000)
}

 

Java输出文字表格(更新V2)

自己动手封装了一个String打印表格的类,兼容中文。

推荐一个真正的等宽Coding字体 更纱黑体 Sarasa Term SC

Ansible Playbook自动配置SSH

---
- name: 16_PRO_SSHConfig.yml
  hosts: all
  gather_facts: yes
  vars:
    allow_root: True
    allow_password: False
    ssh_port: 34522
    ssh_change_port: True

  tasks:
    - name: Delete GSS
      lineinfile: dest=/etc/ssh/sshd_config state=absent regexp=".*GSS.*"
  
    - name: Set UseDNS no
      lineinfile: dest=/etc/ssh/sshd_config regexp=".*UseDNS.*" line="UseDNS no"

    - name: if permit root login via publickey
      lineinfile: dest=/etc/ssh/sshd_config regexp="^PermitRootLogin " insertafter="^#PermitRootLogin " line="PermitRootLogin without-password" 
      when: allow_root == 'True'

    - name: if not allow rootlogin
      lineinfile: dest=/etc/ssh/sshd_config regexp="^PermitRootLogin " insertafter="^#PermitRootLogin " line="PermitRootLogin no"
      when: allow_root == 'False'

    - lineinfile: dest=/etc/ssh/sshd_config regexp="^PasswordAuthentication" line="PasswordAuthentication yes"
      when: allow_password == 'True'

    - lineinfile: dest=/etc/ssh/sshd_config regexp="^PasswordAuthentication " line="PasswordAuthentication no"
      when: allow_password == 'False'

    - lineinfile: dest=/etc/ssh/sshd_config regexp="^RSAAuthentication " line="RSAAuthentication yes"
      when: allow_password == 'False'

    - lineinfile: dest=/etc/ssh/sshd_config regexp="^PubkeyAuthentication " line="PubkeyAuthentication yes"
      when: allow_password == 'False'

    - lineinfile: dest=/etc/ssh/sshd_config regexp="^AuthorizedKeysFile " line="AuthorizedKeysFile .ssh/authorized_keys"
      when: allow_password == 'False'

    - lineinfile: dest=/etc/ssh/sshd_config regexp=".*Port.*" line="Port {{ssh_port}}"
      when: ssh_change_port == 'True'

    - name: restart sshd service
      service: name=sshd state=restarted

Ansible Playbook申请Let's Encrypt证书

---
- name: Let's Encrypt CA CentOS 7.3[0.0.1] @LastModify 2018-11-13
  hosts: all
  gather_facts: yes
  vars:
    domain: www.***.com
    mail: ****@qq.com

  tasks:
  - yum: name=yum-utils state=latest
  - shell: yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
  - yum: name=python2-certbot-nginx state=latest
  - cron:
      name: "let's encrypt cron"
      minute: "0"
      hour: "0,12"
      job: "python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --rsa-key-size 4096"
  - name: certbot --rsa-key-size 4096 --nginx -d {{ domain }} --agree-tos --email {{ mail }} --no-bootstrap --server https://acme-v02.api.letsencrypt.org/directory
    shell: certbot --rsa-key-size 4096 --nginx -d {{ domain }} --agree-tos --email {{ mail }} --no-bootstrap --server https://acme-v02.api.letsencrypt.org/directory
    ignore_errors: yes
  - name: test renew
    shell: certbot renew --dry-run
    ignore_errors: yes
  # - shell: openssl dhparam -out /etc/letsencrypt/live/{{domain}}/dhparams.pem 4096