分类
代码

任意网站注入自定义 CSS 样式

需求来源

有些网站的广告元素很容易找,想直接把它 display:none 掉,或者把某些带背景图像的元素隐藏或更换背景图片。
然后找到了一个 Chrome 插件 Stylus 也能用但感觉没有必要单独装一个插件,还很复杂的样子。
想着油猴脚本应该有很多类似的,结果搜了一下都是针对特定网站的(比如百度/B站/知乎美化),于是就自己写了这个油猴插件。

效果图

分类
Go

Go Stream 仿照 Java8 的流造的轮子

Java 8 的 Stream 接口处理集合数据转换特别好用,之前写过《自己实现 Java8 的 Stream 流(串行版)》,现在工作语言主要使用 Go 了,所以用 Go 也实现了一遍,可以使用 go get github.com/youthlin/stream 引入。先看个使用示例吧:

// example_test.go

func ExampleStream_Filter() {
	stream.Of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).
		Filter(func(e types.T) bool {
			// 没有范型只能通过 e.(int) 的形式强制转换
			return e.(int)%3 == 0
		}).
		ForEach(func(e types.T) {
			fmt.Println(e)
		})
	// Output:
	// 0
	// 3
	// 6
	// 9
}
func ExampleStream_Map() {
	stream.IntRange(0, 5).
		Map(func(t types.T) types.R {
			return fmt.Sprintf("<%d>", t)
		}).
		ForEach(func(t types.T) {
			fmt.Printf("%v", t)
		})
	// Output:
	// <0><1><2><3><4>
}
分类
Go

Go 中的 Options 模式

Functional Options Pattern(函数式选项模式)可用于传递不同选项配置到方法中,而且每次新增选项时,可以不改变接口保持兼容。还可以用来实现类似 Java/C++ 中方法重写的功能~

分类
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, 而不是在方法中直接打印结点值,或者加到链表、数组中。