本文为 Java 注册 classpath 协议读取文件的目的就是要让下面的代码能工作起来1String text = IOUtils.toString(new URL("classpath:/db.properties"), "UTF-8"); 2System.out.println(text);
假设在 classpath 下有个文件 db.properties, 比如在 Maven 项目的 src/main/resources 目录中,或是在某个 jar 包的根位置。如果我们直接执行上面的代码将会得到异常Exception in thread "main" java.net.MalformedURLException: unknown protocol: classpath
说是不认识的 classpath 协议。
at java.net.URL.<init>(URL.java:617)
at java.net.URL.<init>(URL.java:507)
前面代码是有实际用途的,比如说我们使用 XML 时就能支持远程协议1Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() 2 .parse("https://www.w3schools.com/xml/note.xml"); 3System.out.println(document.getDocumentElement().getTagName());
Read More
Java 一路突突突, 版本 16 在 2021-03-16 都发布了, 而我们一直碍于 Java 9 的大改还在 Java 8 上原地踏步, 以往每当有新版本 JDK 发布后都是很快就验证,立马升级。Java SE versions history) 列出了所有 Java 的历史版本的发布日期。在今天(2021-05-04) 网站 Java SE Downloads 上直接提供下载的 Java SE 版本有以下三- Java SE 16.0.1
- Java SE 11.0.11(LTS)
- Java SE 8u291
两个 LTS(长期支持) 版 8 和 11,外加一个目前最新的非 LTS 版本 16, 其他的版本都被归档到了 Java Archive. 查看一下 Java 支持的 roadmap, 几个 LTS 版本的服务支持年限版本本 发布日 原定支持至 延期支持至
注意到 Java 8 将比 Java 11 和将来的 Java 17 生命力还顽强,一下就觉得这么久坚守在 Java 8 的阵地上不应觉得有什么好害羞的。眼看着下一个 LTS 版本的 Java 17 就要在今年 9 月份发布了,Java 11 看来是要错过了,等准备好和 Java 8 告别时要直接跳到 Java 17 了。 Read More
Java 8 2014/3 2022/3 2030/12
Java 11 2018/9 2023/9 2026/9
Java 17 2021/9 2026/9 2029/9- 通常我们都会配置 Web 服务端对响应数据进行压缩,如用 Apache 的 mod_deflate 模块,或配置 Tomcat connector 启用压缩,又或者是在 Java Web 项目中加 Web Filter 来压缩特定的响应数据。这样客户端发送 HTTP 请求时在头中声明如 Accept-Encoding: gzip,服务端就可能会对响应数据进行压缩,同时带上 Content-Encoding: gzip 响应头。
有时候 HTTP Post 的数据太大同样会要求客户端在传输数据之前对请求数据进行压缩,本文主要关注服务端如何自动解压客户端发出的压缩数据。
先以 Apache2 为例,以 Ubuntu 20.04 为例,用命令apt-get install apache2安装 Apache 2.4.41, 它自动启用了 mod_deflate 模块。mod_deflate 模块的配置文件 /etc/apache2/modes-enabled/deflate.conf 内容如下1<IfModule mod_deflate.c> 2 <IfModule mod_filter.c> 3 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css 4 AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript 5 AddOutputFilterByType DEFLATE application/rss+xml 6 AddOutputFilterByType DEFLATE application/xml 7 </IfModule> 8</IfModule>
它表示只对以上特定的响应数据类型进行压缩,下面来测试下对 html 内容的压缩 Read More
前面尝试过用 Java 转换 Apache Avro 数据为 Parquet 格式,本文用 Python 来做同样的事情,并且加入 logicalType: date 类型的支持。本测试中的 Avro 数据也是由 Python 代码生成的。
重复一句 Avro 与 Parquet 的最粗略的区别:Avro 广泛的应用于数据的序列化,如 Kafka,它是基于行的格式,可被流式处理,而 Parquet 是列式存储格式的,适合于基于列的查询。
第一步,生成 Avro 数据文件 user.avro, 须先安装 fastavropip install fastavro
生成 user.avro 的代码
Read More
前方许多有关于 Kafka, Docker, Python 和 Kubernates 的文章都是在 Vagrant 虚拟机中做的 Demo,经常用到的一些 Vagrant 命令是时候有必要写篇日志记录下来。Vagrant 是 HashiCorp 家族中的一员,HashiCorp 旗下著名的工具还有 Terraform, Consul, Vault, Boundary, Packer, Nomad 和 Waypoint.
说起 Vagrant,不得不提起与之仿佛类似的 Docker,其实它们相差还是比较大的,只因它们给人的外在感觉都是命令行控制 Linux。Vagrant 实质是一个虚拟机的外挂,让我们更方便的用 Vagrant 命令与虚拟机交互,而不用在宿主机与虚拟机间来回切换,管理多个虚拟机就更得心应手了; 而 Docker 是一个容器,容器的本质是宿主机上的一个进程,只是用命名空间与该进程的文件系统,进程,网络等进行了隔离,使得该容器进程看似一个虚拟 OS。
Vagrant 是开发环境的部署工具, 而 Docker 是运行环境的部署工具; Vagrant 操作的是一个标准的 Linux 或 Windows 操作系统,而 Docker 的镜像考虑到发布服务的个头,通常是一个裁剪的系统,去除了服务器非必要的命令。既然 Vagrant 对应的是虚拟机,那么在 Vagrant 中的操作,安装的软件在 Vagrant 退出后都会保留下来,而 Docker 中操作的都是当前容器(copy-on-write),并不影响所对应的镜像, 除非用 docker commit 固化为新的镜像.
明白了 Vagrant 只是一个虚拟机的皮,那他在不同的硬件平台或操作系统下需要与不同的 Provider, 如 VirtualBox, Hyper-V, VMware 等配合工作,还能用 Vagrant 来操作 Docker。
有了 Vagrant, 从此不再需要下载不同操作系统的 ISO 安装镜像文件,耗时的逐步安装操作系统,也不用手工的下载别人安装好并导出的虚拟机文件,一切有点类似 Docker 一样从远程公共仓库中选择系统即可。
Read More
在上篇 使用 Java 转换 Apache Avro 为 Parquet 数据格式 实现把 Avro 数据转换为 Parquet 文件或内存字节数组,并支持 LogicalType。其中使用到了 hadoop-core 依赖,注意到它传递的依赖都非常老旧, 到官方 Maven 仓库一看才发现还不是一般的老
长时间无人问津的项目,那一定有它的替代品。对啦,据说 hadoop-core 在 2009 年 7 月份更名为 hadoop-common 了,没找到官方说明,只看到 StackOverflow 的
Differences between Hadoop-coomon, Hadoop-core and Hadoop-client? 是这么说的。 应该是这么个说法,不然为何 hadoop-core 一直停留在 1.2.1 的版本,
而且原来 hadoop-core 中的类在 hadoop-common 中可以找到,如类 org.apache.hadoop.fs.Path。不过在 hadoop-core-1.2.1 中的 fs/s3包不见, 这么重要的 s3 文件系统没了。 Read More
Avro 和 Parquet 是处理数据时常用的两种编码格式,它们同为 Hadoop 大家庭中的成员。这两种格式都是自我描述的,即在数据文件中带有 Schema。 Avro 广泛的应用于数据的序列化,如 Kafka,它是基于行的格式,可被流式处理,而 Parquet 是列式存储格式的,适合于基于列的查询,不能用于流式处理。
既然是一个系统中可能同时用到了这两种数据存储格式,那么就可能有它们之间相互转换的需求。本文探索如何从 Avro 转换为 Parquet 格式数据,以 Java 语言为例,所涉及到的话题有- 转换 Avro 数据为 Parquet 文件
- 如何支持 Avro 的 LogicalType 类型到 Parquet 的转换, 以 date 类型为例
- 实现转换 Avro 数据为 Parquet 字节数组(内存中完成 Avro 到 Parquet 的转换)
本文例子中所选择 Avro 版本是当前最新的 1.10.1 Read More
管理一个远程机器最常规的做法是 SSH(Unix/Linux, Mac) 或 PowerShell/RDP(Windows),这就要求远端机器要开通相应的访问端口及打开防火墙,配置好登陆用的用户名密码或 SSH Key。当选择一个 EC2 实例的时候,可以点击 "Connect" 按,它提供有三种连接选择:- EC2 Instance Connect: 要求 EC2 配置了 SSH Key, 启动了 sshd 并开启了 ssh 的 Security Group,还要在实例上安装了
ec2-instance-connect(如安装命令 sudo yum install ec2-instance-connect) - Session Manager: 这就是我们本文要讲述的,sshd 不用启动,Security Group 只要求能往连接外部的 443 端口,SSH Key 不需要
- SSH client: 客户端 SSH 到 EC2 实例,需要打开 sshd 其 22 号端口接受连接的 Security Group,用 SSH Key 或 AMI 中的用户名和密码,或配置加入了域后使用域帐号验证登陆
AWS 的 Session Manager 提供了通过浏览器或 AWS CLI 来访问 EC2 实例,甚至是本地机房的机器或虚拟机(需 advanced-instances tier 的支持),不再依赖于 SSH。 Read More- EC2 Instance Connect: 要求 EC2 配置了 SSH Key, 启动了 sshd 并开启了 ssh 的 Security Group,还要在实例上安装了
- 自去年 10 月底搬家后就基本没再写日志了,其间常登陆后台看到 WordPress 及其插件不停的有提示升级,每次都是能升就就升,至少前台的页面显示没多大问题。只有过一个小问题,左边最新评论的 Widget 显示不出东西来,把最后更新日期为 8 年前的 WP-RecentComments 插件变成了 Decent Comments 后解决。
昨天才开始琢磨着写一篇关于 Mockito Mock 静态方法的日志,才意识到一直以来不知拒绝的跟风似的升级 WordPress 主体和插件给后台带来了不得不面对的问题。
首先,传文件总是失败,在 Media 或Add Media时也无法浏览图片,翻看 Apache2 的错误日志也没找到问题。无奈,手工通过 SCP 上传吧,一登陆到服务器上却发现即使界面提示失败,但文件实际上是在已上传到了服务器上了的。先这么着吧,切换编辑器到文本模式手工写 <img> 标签来引用图片。 Read More
Java 单元测试最趁手的 Mock 组件当属 Mockito,虽然它最初是基于继承来实现 Mock 的,所以对私有方法,私有属性,静态方法, final 类,final 方法,构造函数无能为力。于是有时不得不引入 JMockit 或 PowerMockit 来辅助。不过现在的 Mockito 功力有所增强。
首先是 Mockito 2.1.0 开始可以 Mock final 类和 final 方法,要在 classpath 下创建个文件mockito-extensions/org.mockito.plugins.MockMaker, 内容为mock-maker-inline。 之前写过一篇介绍:Mockto 也能 Mock final 类和 final 方法了,其中也探索了它的实现细节,使用到了 ByteBuddy 修改字节码。
从 Mockito 3.4.0 通过类似的 mockto-extensions 扩展的方式,实现了对静态方法的 Mock。所有使用到的接口是 org.mockito.MockedStatic, 它当前在 Mockito 3.7.7 中还是一个试验性方法 @Incubating,能拿来用就行。 Read More