Skip to main content

如何在android虚拟机上执行java jar文件

大家都知道,andriod apk大部分代码都是java代码,但是apk并不是运行在java虚拟机,而是运行在DVM上,而且编译好的java 代码也不能直接运行在DVM上。接下来就简单说下怎么运行jar在andriod手机上。

1.DVM & JVM

Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.

Java虚拟机,大家可以google,很多详细的资料。

2.如何在andriod手机上运行jar

# 编辑java源文件
javac -cp src -d build src/Hello.java

# 在jvm上测试
java -cp build Hello

#通过dx工具把java class转化为dex文件
dx –dex –output=hello.jar Hello.class
cd ..

# 在andriod虚拟机上执行
dalvikvm -cp build/hello.jar Hello

如何快速地把页面另存为pdf

最近在设计企业风险报告的产品,我们就希望可以直接把页面保存为pdf文档,这样方便客户保存和分享。

常规的做法有以下几种:

1. 通过浏览器的打印,另存为pdf

这个方法,自己使用很方便,但是有个局限就是:不是所有的页面都能保存为pdf,尤其是动态的页面。具体怎么操作,可以baidu,很多这样的文章。

2. 装一个chrome 插件

https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg
fireshot插件

这个插件可以很方便地截取整个页面或者你想选择的区域

3. 通过pdf库生成页面所有的组件

这个方法需要写很多代码,尤其如果页面有图表的时候,需要花很多的时间去维护和更新。

4. html2canvas

利用html2canvas库,可以很方便地把dom元素保存为base64编码的图片,在后台,利用pdf库把图片转化为pdf
优势:html2canvas可以把后台不容易处理的组件用图片来代替,后台可以专门处理常规的展示,比如表格,文字等等。

最后上代码:
html2canvas 代码
[code]
function exportAsPdf() {
console.log("export as pdf")
let imageBase64 = []
html2Canvas(document.querySelector("#fullPage")).then(canvas => {
let imgData = canvas.toDataURL(‘image/png’)
imageBase64.push(imgData)
}).then(event => {
dispatch({
type: "dashboard/exportAsPdf",
payload: {
name: dashboard.companylaw.name,
imageBase64: imageBase64,
}
})
});
};
[/code]

java生成pdf代码
[java]
private boolean generatePdf(String title, String[] imagesPath, File outputFile) {
try {
PDDocument doc = new PDDocument();
for (int i = 0; i < imagesPath.length; i++) {
String image = imagesPath[i];
File imageFile = new File(image);
if (!imageFile.exists()) {
log.warn("Image file:{} can’t be found", image);
continue;
}

BufferedImage bufferedImage = ImageIO.read(imageFile);
int width = PDF_PADDING * 2 + bufferedImage.getWidth();
int height = PDF_PADDING * 2 + bufferedImage.getHeight();
int imageY = 0;
if (i == 0) {
height += PDF_TITLE_HEIGHT;
imageY += PDF_TITLE_HEIGHT;
}

PDPage page = new PDPage(new PDRectangle(width, height));
PDPageContentStream contents = new PDPageContentStream(doc, page);

if (i == 0) {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("fonts/simhei.ttf");
PDFont formFont = PDType0Font.load(doc, inputStream);
contents.beginText();
contents.newLineAtOffset(15, height – imageY);
contents.setFont(formFont, 30);
contents.showText(title);
contents.endText();
}
PDImageXObject pdImage = PDImageXObject.createFromFileByContent(imageFile, doc);
contents.drawImage(pdImage, PDF_PADDING, PDF_PADDING);
contents.close();
doc.addPage(page);
}
doc.save(outputFile);
doc.close();
log.info("Generate pdf file:{}", outputFile);
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
}

return false;
}
[/java]

参考资源
html2canvas

Base64编码介绍

做web开发或者图片处理,经常会遇到Base64编码。到底什么是base64呢?

1.base64介绍

百度百科的介绍:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

什么是“可打印字符”呢?为什么要用它来传输8Bit字节码呢?在回答这两个问题之前我们有必要来思考一下什么情况下需要使用到Base64?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64编码二进制数据。

Base64,就是使用64个可打印字符来表示二进制数据的方法。Base64的索引与对应字符的关系如下表所示。
base64

也就是说,如果将索引转换为对应的二进制数据的话需要至多6个Bit。然而ASCII码需要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit当然不能存储8个Bit的数据,但是4*6个Bit可以存储3*8个Bit的数据啊!如下表所示:20180313131013494

所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

其实base64编码就是一种常见的加密和解密方式。你可以自己设置Base128或者其他的编码格式,只要能保证HTTP传输和正确还原就可以工作。

2.Base64编码-Java代码

maven:
[code]
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
[/code]

[java]
–byte[] 转成base64的字符串
String encodedString = Base64.getEncoder().encodeToString(fileContent);
–base64的字符串转成byte[]
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
[/java]

java-base64

Jsoup的select选择器

如果爬虫采集数据,肯定会用到Jsoup 组件。Jsoup的强大在于它对文档元素的检索,Select方法将返回一个Elements集合.

1、Selector选择器基本语法

  • tagname: 通过标签查找元素,比如:a
  • ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 元素
  • #id: 通过ID查找元素,比如:#logo
  • .class: 通过class名称查找元素,比如:.masthead
  • [attribute]: 利用属性查找元素,比如:[href]
  • [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
  • [attr=value]: 利用属性值来查找元素,比如:[width=500]
  • [attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
  • [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
  • *: 这个符号将匹配所有元素

2、Selector选择器组合使用语法

  • el#id: 元素+ID,比如: div#logo
  • el.class: 元素+class,比如: div.masthead
  • el[attr]: 元素+class,比如: a[href]
  • 任意组合,比如:a[href].highlight
  • ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在”body”元素下的所有 p元素
  • parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
  • siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
  • siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
  • el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

3、Selector伪选择器语法

  • :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
  • :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
  • :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
  • :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
  • :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表
  • :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
  • :containsOwn(text): 查找直接包含给定文本的元素
  • :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
  • :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素

————————————————————————————————————————————-
链接:
Jsoup selector接口

阿里云服务器安装wordpress

网上有很多介绍如何安装wordpress的,但是几乎没有一个从头到尾能成功的。最近在搭建一个,就把步骤一个个都记录下来,方便大家参考。

1.安装mysql数据库
#yum -y install mysql-community-server

a

详细内容可以参照博客:
https://www.jb51.net/article/76493.htm

2.安装PHP

b

详细的安装可以参考博客:
https://my.oschina.net/u/3447660/blog/1786974

3.配置php-fpm

之前的apache httpd(<2.4),一般就通过编译好的libphp5.so 来动态解析php网页。apache 2.4之后,可以通过配置php-fpm来解析php页面。简单迅速。 然后去掉mod_proxy.so和mod_proxy_fcgi.so之前的注解,确保他们被apache加载。 如果php-fpm使用的是TCP socket,那么在httpd.conf末尾加上:
SetHandler “proxy:fcgi://127.0.0.1:9000”

如果用的是unix socket,那么httpd.conf末尾加上:


ProxySet disablereuse=off


SetHandler proxy:fcgi://php-fpm

重启apache和php-fpm服务:
systemctl restart httpd.service
systemctl restart php-fpm.service

4.下载wordpress
从官方地址下载最新的wordpress包
https://wordpress.org/download/

详细的配置可以参考官方向导:
https://codex.wordpress.org/zh-cn:%E5%AE%89%E8%A3%85_WordPress

如果一路没什么错误,就可以看见下边的页面,那就恭喜你安装成功了!

c