生成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
用Docker、Vagrant搭建Mesos实验环境
Mesos躺在我的学习列表里面2年了,最近终于一口气玩了一把,也算完成一桩心事。
整个实验做下来,感觉生产环境可能原生安装会比较好,隔着Docker会有一些奇怪的问题。鉴于没有实战经验,也就不浪费时间瞎说了。
IntelliJ IDEA IU数据库脚本: 导出JPA+JDBC Entity(无Lombok)
使用方法: Database -> 右键数据库表 -> Scripted Extensions -> yourScript.groovy
生成Entity Class
内详
Java和Kotlin混用遇到的各种问题
最近在旧Java项目中添加了Kotlin代码,感受到了新语法的魅力,也遇到了一些不尽如意的问题。使用不深,如有不妥还请指正。
加分项
- SpringBoot集成无压力,快速嵌入。
- 语法简洁有效,既减少了冗余代码,又提高了可读性。
- 文档相对完善,遇到问题基本可以搜到解决方案。
减分项
- 不支持Java代码的Lombok注释,或者说支持有缺陷。我配置了delombok也不能正确解析我自动生成的Entity类。
- 格式化代码很卡,我的2019.2 IU格式化或Inspection都会很卡顿(32G内存 + i7 7500U + 固态硬盘)。按理说自家产品支持力度应该很够,然并卵。
- Java和Kotlin互调问题。Kotlin调用Java无压力,Java调用Kotlin就要注意权限了。
- 写算法部分能带来大量快感,日常代码并不会有太多优势。
- 不喜欢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)
}
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