分类
Java

CompletableFuture

Java 8 的 CompletableFuture

创建

  • 创建一个已完成的
  • 类似 guava 的 SettableFuture, 先创建一个空的,再在合适的地方完成它
  • 异步计算或运行
分类
代码 安卓

Dora.js – Android 上的内容型编程平台,学习 JavaScript 开发!

最近刷酷安发现一个很酷的软件:Dora.js

官方介绍

Dora.js 是 Android 上的一个内容型编程平台,提供了强大且简单的一套扩展框架,让你可以轻松写出诸如提供视频、图片、漫画、音乐、图书、文章等的扩展,打造属于自己的内容中心。

简单来说,你可以把它当做一个可以安装许多扩展的 App。

如果你想学习 JavaScript,Dora.js 可以给你提供非常大的帮助。

Dora.js 使用 V8 作为脚本引擎,提供完善的 Node.js 运行时:

  • 支持 npm 依赖包
  • 虚拟文件路径让文件访问更轻松、更安全

Dora.js 包含一个强大的代码编辑器:

  • 支持代码高亮,多种字体、配色可选
  • 支持智能补全、签名提示
  • 提供 VSCode 插件
  • 提供多种快捷工具使手机上编程成为一件容易事
  • 取经自 “纯纯写作” 的优秀编辑器体验

注意:Dora.js 目前还处于不稳定阶段,很多能力还很简陋,你在使用过程中还有几大概率出现闪退现象。

下载地址:https://www.coolapk.com/apk/com.linroid.dora
分类
Java

[JavaFx] PDF 工具:目录、合并、密码

这是一个去年写的自用小工具。有些 PDF 文件没有目录,所以想自己加上,还有的分章节的小文件想合并为一个文件,就有了这个软件。
这几天又看了下几个 PDF, 发现在 Firefox 里目录不能正常跳转,于是修复了一下软件。

分类
代码

如何编写一个油猴脚本

公司的单点登录从 RSA Token 改成 OTP 了,为了避免每次登录需要输入 Token 的麻烦,想使用浏览器插件来实现。
原来的 RSA Token 不知道怎么生成当前 Token,但是新的 OTP token,有现成的算法可以算出每时刻的 Token,因此完全可以实现自动登录。

OTP(One Time Password) 就是那种动态密码,谷歌验证器那种。安卓可以使用 andOTP

要在浏览器中使用 OTP, 可以使用 yeojz/otplib 这个工具,具体用法看 GitHub 文档就可以。
生成任意时刻的方法可以看 issue 的写法 。

分类
电脑软件

Mac 常用软件 + PHP 环境

首先祝大家新年快乐!已经很久没更新了,新的一年新的开始哈哈~

由于电脑装的东西比较杂,希望把 Mac 整得干净些,所以元旦把电脑重置了一下,然后就是必装软件都补上了。列个清单:(主要参考 awesome-mac

分类
Java

自己实现 Java8 的 Stream 流(串行版)

先看使用方式

List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 9, 9, 1, 2, 3, 2, 3, 4);
String[] strings = Flow.of(list)
        .filter(x -> x % 2 == 0)
        .map(x -> x + "s")
        .limit(30)
        .skip(1)
        .distinct()
        .sorted(Comparator.reverseOrder())
        .toArray(String[]::new);
///[8s, 6s, 4s, 2s]
System.out.println(Arrays.toString(strings));
分类
Java

二叉树相关: 遍历、创建、打印

题目来自 leetcode-cn 的探索卡片:
https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/

遍历

com.youthlin.leetcode.tree.TreeVisitor

前序遍历

递归版本的太简单了,只贴前序遍历方式。
前序递归是先访问本结点,然后递归调用左子树,再递归调用右子树。
中序和后序都差不多,只是把访问结点那行移动一下就行。

    public <T, N extends BinTreeNode<T, N>> void preOrderTraversalRecursion(BinTreeNode<T, N> root,
            Consumer<BinTreeNode<T, N>> action) {
        if (root == null) {
            return;
        }
        action.accept(root);
        preOrderTraversalRecursion(root.getLeft(), action);
        preOrderTraversalRecursion(root.getRight(), action);
    }

这里我传入了一个 Consumer, 而不是在方法中直接打印结点值,或者加到链表、数组中。

分类
代码

Golang Web 框架 Beego 体验:一个天气网站

最近好像看到 Go 语言的文章更多了,趁着 5 月休假在家有空,也学习了一下。
基本语法很快就熟悉了,跟着这个网站 Go 语言之旅 有编程基础很容易就可以上手。
当然一些细节还是不太知道,比如怎么遍历数组、map,也是后来边做网站边学习,毕竟刚开始都是囫囵吞枣先看个大概,到用的使用自己写一遍才能加深印象。这也是为什么我要用 Golang 写一个小项目的原因。
熟悉了基本语法后,就开始看《Go Web 编程》,讲的是 Go 自带的 http server / template

分类
代码

滚动网页时固定表头

当网页的表格高度比较大时,比如超过一屏,我们希望表头能够一直显示,就像 Excel 的“首行冻结”一样。
搜索一下,看到一种思路是表头写两个,第一个只有表头,默认不显示,定位为 fixed 在顶部,第二个有表头和数据单元格。
然后滚动网页时,使用 js 计算表头是否应该显示,实时的设置可见性。

示例如下:

分类
Java

B+ 树的插入与删除(Java 实现)

上周在某公众号看到一个掘金小册的推荐,《MySQL 是怎样运行的:从根儿上理解 MySQL》。购买后看了前几篇,真的写得非常好,看到索引后的章节,讲“表空间”的一章,稍微有点吃力了,因为这一章出现了太多名词,所以暂停了往下看。作者在前面讲索引时提到 B+ 树,但由于本小册主要是讲 MySQL 因此并没有细说 B+ 树如何插入、删除,于是我就自己搜了一下。

关于 B+ 树的资料,搜索出来肯定很多。但是有些内容的质量真是低下(而且我发现必应也会在搜索结果最底部推荐广告了),不过还是被我找到了一篇写得很棒的文章:《B树和B+树的插入、删除图文详解》

这篇文章把 B+ 树的插入删除算法都写得挺详细了,而且有图例说明,强烈推荐。于是我就跟着文章的算法用 Java 尝试实现了 B+ 树这个数据结构。