霖博客

生活如此多娇

CompletableFuture

Java 8 的 CompletableFuture

创建

  • 创建一个已完成的
  • 类似 guava 的 SettableFuture, 先创建一个空的,再在合适的地方完成它
  • 异步计算或运行
Read the full story

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
Read the full story

如何编写一个油猴脚本

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

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

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

Read the full story

自己实现 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));
Read the full story

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

题目来自 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, 而不是在方法中直接打印结点值,或者加到链表、数组中。
Read the full story

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

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

滚动网页时固定表头

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