背景 在现代数字交流中,屏幕截图成为一种常见的工具,不仅用于记录和保存内容,还广泛用于分享信息。一篇题为《Why do people take Screenshots on their Smartphones?》1 的研究论文指出,有97%的受访者曾将截图发送给他人。这一数据表明,屏幕截图不仅仅是个人记录的手段,更是一种重要的社交互动方式。通过截图,用户能够快速分享对话、通知或有用的内容,从而在信息传播和交流中发挥关键作用。
然而,对于这样高比例的分享行为,用户可能的目的有:
认为当前屏幕的内容有趣,想要分享给其他人; 认为当前屏幕的内容不符合预期,想要反馈给开发者; 于是,我们可以从中做出这些事:
在用户截图时将品牌 logo 放置在不影响其他内容的地方,提高品牌宣传力; 将屏幕截图中的敏感信息隐藏起来,防止这些内容暴露给其他人,保护用户隐私; 在隐私协议允许范围内将诊断信息隐藏在截图中,从而更好地优化产品可能遇到的问题; 因此,接下来我们将开始研究实现方式。
使用 mask 隐藏 / 显示信息 本质上来讲,我们如果做到了可以在截屏时隐藏信息,那也就同样做到了显示信息,我们可以通过隐藏 / 显示蒙板的内容来控制实际内容的显示。对于 SwiftUI,有以下代码:
content .mask { ZStack { Color.white HideWhenTakingScreenshot { Color.black } } .compositingGroup() .luminanceToAlpha() } 假设我们已经实现了 HideWhenTakingScreenshot 中的内容,在屏幕截图时隐藏 Color.black ,对于 content ,也就相当于在屏幕截图时显示了,UIKit 同理。
在屏幕截图时隐藏信息 经过层层过滤,其实我们的真实需求是如何在屏幕截图时隐藏信息。
UITextField 的神奇作用 说到隐私保护,我们不得不想起当用户在密码框中输入密码时作为 iOS 系统级的保护,他会在用户截屏时自动隐藏密码输入框,如以下代码所示:
struct PasswordTextView: UIViewRepresentable { @Binding var password: String? func makeUIView(context: Context) -> UITextField { let textField = UITextField() textField....
在实际工程中,有时我们在以往的提交中忘记提交部分代码,当想起来的时候已经提交过很多笔了。于是想要把当前的更改提交到历史 commit 中去。
假设当前我们提交了三次:
$ git log commit 0e162000e27ba998d5a92cc04b489e3d3ec0e30d (HEAD -> master) Author: cloxnu <[email protected]> Date: Fri Nov 5 13:46:08 2021 +0800 3rd commit commit f5f470406634bb255e4f19bf62780868afeed32d Author: cloxnu <[email protected]> Date: Fri Nov 5 13:45:21 2021 +0800 2nd commit commit cf8c580d322e459fa1acf4ef1e6d08163aeb1a21 Author: cloxnu <[email protected]> Date: Fri Nov 5 13:41:30 2021 +0800 1st commit 这几次提交就只涉及一个文件 1.txt
$ cat 1.txt 11111111 22222222 33333333 其中第一行为第一次提交,第二行为第二次提交,第三行为第三次提交。
此时如果想要将第二次提交增加一个新文件 2.txt,该怎么操作呢?
步骤 首先新建 2.txt $ cat 2....
安装 由于开发需要,稍稍玩了玩 React Native 开发一个 App 的简要流程。
官网
安装使用时,可以使用 Expo ,可以省去在 Xcode 或者 Android Studio 配置的过程。
运行以下命令安装 Expo
npm install -g expo-cli 注意这里在 npm 前不要加 sudo,请提前确保权限通顺
sudo chown -R $(whoami) ~/.npm sudo chown -R $(whoami) /usr/local/lib/node_modules 安装好后,我试图运行 Expo,但是得到了 Expo 不支持当前的 Node 版本的错误,于是运行 nvm 来安装最新版本 Node(以下是未安装 nvm 的版本):
sudo npm install -g n sudo n latest 或者,使用 yarn
yarn global add expo-cli 开始 安装好后,生成第一个项目:
expo init rn_proj 进入目录并运行
cd rn_proj expo start 然后同时会打开一个 Web 控制台...
An implementation of generalized suffix tree using Ukkonen’s algorithm.
In this page:
The longest common substring problem How it works GST versus Dynamic programming Inspired by:
Ukkonen, E. On-line construction of suffix trees. Algorithmica 14, 249–260 (1995).
https://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf
The longest common substring problem Given two or more strings, find the longest common substring of these strings. Concretely, the longest common substring of the two strings “cacaocac” and “ccaooc” is “cao”....