技术小黑屋

限时买一年送半年,618 国民级思维导图工具 XMind 2022 来袭!

提起思维导图,就不得不说 XMind,作为思维导图工具中的佼佼者,兼具丰富的导图模板、美观的配色方案、及多种创意工具。

无论是职场打工人、在校大学生,还是需要头脑风暴的创意工作者,掌握思维导图能帮你打破思路局限,养成结构思维。

XMind 2022 打磨的众多功能,都让理清思路、展现思维更上一层楼:

  • 模板、配色方案更智能;
  • 演说模式更自由;
  • 全新的贴纸、插画、手绘风格;
  • 优化了众多细节体验……

这次 618,数码荔枝迎来 XMind 2022 更新后的首次优惠大放送!

谁动了我的奶酪,通过 Git 找出内容变更历史

在日常的开发过程中,一段代码内容被添加,删除都是稀疏平常的事情。这也就造成了我们日常开发工作中会遇到这样两个问题

  • 这个代码内容是谁添加的,是一直存在还是被修改过多次
  • 有一段代码被删除了,是谁删除的呢

终端下 Git Diff 只展示文件名

通常我们使用git diff 可以查看具体的内容修改,默认会以patch的形式展示,但是有时候,我们仅仅是希望有一个修改的文件列表,不关心具体的修改内容。

这里完全可以借助 git diff 的一些指令来实现。

给「荔」一夏 618 正版软件大促,秒杀 + 折扣 + 满减一起来袭!

五月进入尾声,618 各种活动已经陆续开始了,又是年中采购,清空购物车的好机会。

除了可以买吃的、用的实物,趁 618 入手虚拟商品,如软件会员、正版授权码同样有巨多优惠,还不用担心快递因疫情延误,买完就能用。

https://asset.droidyue.com/image/lizhi_io/618_2022/%E5%9B%BE1.png

我们的朋友「数码荔枝」今年提前开启了 618 给「荔」一夏大促活动,让大家更早享受特价,和其他抢购不撞车。

Mac 下 终端也能生成二维码了

有些时候,我们需要将链接或者文本转换成 二维码,通常这时候我们会使用网上的在线服务进行处理,其实我们还可以做到更加简单,使用终端即可生成二维码。

这里,我们需要借助 Mac 下 homebrew 的一个库来实现,这个库的名字叫做 qrencode。下面就是关于 这个库的安装,封装,以及使用。

Flutter/Dart Release 模式下屏蔽 debugPrint 与 Print 输出

当我们在写 Flutter,Dart程序时,release 模式下,我们很奇怪的发现debugPrint和 print 这两个的输出内容,还是能够通过 flutter logs 展示出来。这一点尤其在端上暴露的问题要严重一些,比如涉及到一些敏感信息的日志打印。

本文,将会有两个超级简单的方法,来实现对这些输出的屏蔽,并且是专门治理 release 模式下的问题,debug 模式不受影响。

一个脚本,快速发现项目中的重复文件

项目中的文件越来愈多,导致生成的apk包也不断增大,可是这些文件中会不会存在重复的文件呢,这是一个值得验证的问题,毕竟解决了之后会减少很多apk的体积。

我们不可能依赖人工的手动查找,因为这样是时间成本太大。于是我们再次尝试使用脚本程序来实现检查项目中是否有重复文件。

Flutter 在 iOS 模拟器中运行卡住问题解决

当我们尝试在 iOS 模拟器运行 flutter run 可能会出现类似如下的卡住问题。

1
2
3
executing: xcrun simctl launch xxx-54F9-427F-8119-xxxx com.hahaha.app --enable-dart-profiling --enable-checked-mode --verify-entry-points --observatory-port=0
[+1000 ms] com.hahaha.app: 49573
[        ] Waiting for observatory port to be available

模拟器上的 App 也无法打开,也看不出有什么具体的崩溃问题。不知如何是好。

超快速实现 Svg 转 Png,jpg等格式

svg 是 用于描述二维矢量图形的图形格式,有着很多的优势,但是有时候并不是所有的场景都支持 svg,那么这时候,我们需要将svg 图片转换成 png 等格式。

当然,可以进行svg 转png 的方式有很多,比如通过在线的网页工具可以,也可以使用终端的命令处理。这里我们主要设计的使用终端命令进行转换处理。

简单一招,百倍提速 Flutter 开发

Flutter 开发中,为了实现更好的解耦与更高的复用,我们都会使用模块化的思路来处理,在Dart 和 Flutter 中,我们会使用 Dart 包或者插件包等,将它们发布到比如自己的unpub 服务器上,然后在壳工程(主工程)中聚合使用。

比如一个 壳工程的 yaml 是这样的

1
2
3
4
5
6
7
8
9
10
dependencies:
 flutter:
   sdk: flutter
 firebase_crashlytics: 2.4.5
 firebase_analytics: 9.0.5
 basic:
   hosted:
     name: basic
     url: https://unpub.droidyue.com
   version: 1.6.2

于是有这样一个场景,我们想要在basic 包里面加一个方法,并应用到 主工程中。

但是在执行处理的时候,我们会有这样的考虑

  • 如果修改的内容,通过 unpub 进行验证,时间成本很大。
  • 但是发布到unpub,需要有一定的质量把控,修改的内容必须进行验证通过后,才能发布到unpub 服务器上

所以,我们需要尝试寻找一种不通过 unpub,更快速验证修改内容的方式。

好在 dart 提供了 dependency_overrides 这个配置项来处理依赖重写问题。

Android 添加 Overlay View (覆盖视图)

在 Android 中,有一种黑科技,就是能够过在 Window 上添加一个视图,然后这个视图,会覆盖在所有的 应用视图的上面(包括桌面)。比如下面的视图。

https://asset.droidyue.com/image/2022/h1/android_overlay_view_sample.png

想要利用上面的黑科技,很简单。大概分为如下的步骤。

iSlide 插件 5 周年回馈,买两年送一年!每月不到 5 块钱

是不是每次在制作 PPT 时,都丝毫没有头绪?各种模板东拼西凑没有章法?你和 PPT 高手之间,其实就只差一个 iSlide。

iSlide 是一款口碑优秀的 PPT 插件,海量在线资源库,超 30 万专业模板、素材一键插入 PPT,更有一键排版等 38 种辅助功能,真正实现「让 PPT 设计简单起来」。

https://asset.droidyue.com/image/lizhi_io/islide/%E5%9B%BE1.png

如今,iSlide 插件发布已有 5 年时间,获得秋叶 PPT 等众多业内大咖推荐!最近它开启了 5 周年活动,前往数码荔枝买两年送一年,每月不到 5 元钱,新用户首单还能立减 5 元,非常值的价格别错过!

赶快点击[合作伙伴]专属链接收下这款人见人爱的 PPT 神器吧!活动时间:即日起至 5 月 8 日,订阅时长可叠加,趁现在便宜快买买买~

Fences 4 新版来袭,栅栏式桌面整理快速搞定,从此不再乱糟糟!

你有整理电脑桌面的习惯吗?还是各种文件、文件夹都往桌面塞,时间一久占满半个屏幕,既不美观也不好找文件。

想要保持桌面整洁,当然要试试经典的 Fences,自动归类整理 Windows 桌面文件。近期这款工具迎来了 4.0 大更新,这次也为大家带来了优惠价格!通过[合作伙伴]专属优惠链接39 元起即可实现整理自由,解放双手。新注册用户再享立减 5 元优惠,仅需34 元起!

https://asset.droidyue.com/image/lizhi_io/fences/%E5%9B%BE1.png


Android 中 利用 AccessibilityService 辅助服务 模拟点击事件

在 Android 中想要执行一些模拟点击操作,在无法修改页面源码的情况下,通常只能使用 adb 和借助辅助功能两种方式。

Adb 方式

借助 adb shell 的命令,我们可以使用下面的方式模拟一个执行点击坐标的操作。

1
adb shell input tap x y

但是 adb 操作有一些门槛

  • 需要一台电脑执行adb 命令(终端执行)
  • 需要一个数据线
  • 目标设备(手机)需要开启开发者模式

所有 adb 操作的问题就是无法借助一台设备独立完成。所以可以借助辅助服务来实现单一设备独立完成。

忘了 Mac 访达吧,QSpace 文件管理器一个更比多个强

注:QSpace 是我的一位超级优秀的前同事开发的,个人在软件发布之初就曾尝试,很不错,希望大家可以支持使用一下哈。

使用 Mac 的小伙伴,有多少人还在用原生的访达管理文件?虽然已经满足基本需求,但仍有一些槽点:不支持多视图查看、地址栏编辑不够直观、连接服务器仅只读等。

强烈安利一款单窗口多视图文件管理器:QSpace,拥有连接云服务器、右键增强、文件暂存等诸多实用自定义功能。

https://asset.droidyue.com/image/lizhi_io/qspace/%E5%9B%BE1.png

同类产品 Path Finder,订阅一年就要支付约 190 元,而今天的 QSpace 买断只要 47 元起,爆款产品数码荔枝独家代理。点击[合作伙伴]专属优惠链接,抢购就趁现在!新用户还能领券再省 5 元!

终端下 History 展示时间信息

经常使用终端的同学,最常用的命令之一可能就有 history, 它可以帮助我们查看执行过的终端命令的历史信息。

history 执行很简单

1
2
3
4
5
6
7
8
9
10
11
pi@raspberrypi:~ $ history
    1  clear
    2  ls
    3  sudo apt update
    4  df -h
    5  sudo apt install vim
    6  sudo reboot
    7  clear
    8  ls
    9  sudo apt install vim
   10  locale

MBP Touchbar 设置Fn 按键长期显示

TouchBar 的出现确实让 MBP 酷炫了很多,但是对于我来说,总感觉有点华而不实,原因有二

  • 动态变化的 按钮 几乎没有用到
  • 基础的Fn 按键 使用起来反而更加不方便。(比如 IDE 使用F3 查看Definition)

好在系统设置提供了长期显示 Fn 的配置选项

Flutter TabController 多次调用,导致切换异常问题

Flutter 中,TabController 是连接 TabBar 与 TabBarView 的纽带,处理选中状态时必不可少的内容。

但是当我们在监听 TabController 时,会发现又多次调用

1
2
3
4
5
6
7
8
@override
void initState() {
 super.initState();
 _tabController = TabController(vsync: this, length: myTabs.length);
 _tabController.addListener(() {
   debugPrint('initState currentIndex=${_tabController.index}');
 });
}

Flutter 中获取 TextField 中 Text 内容

在Flutter 中,TextField 是一个用来输入 文本的 控件。使用起来也很简单,比如这样,就可以轻松实现一个 TextField 来接收用户的输入内容。

1
2
3
4
5
6
7
TextField(
 decoration: const InputDecoration(
   border: OutlineInputBorder(),
   labelText: 'Contact Name',
 ),

)

但是 Flutter 是声明式 UI 编程,我们无法像 Android 里那样拿到 TextField 的实例,类似这样(textFieldInstance.text)获取到内部的输入内容。

不过,办法还是有的,只是略有不同而已。

Flutter 轻松实现动态更新 ListView

在 App 开发过程中,ListView 是 比较很常见的控件,用来处理 列表类的数据展示。当然 Flutter 也是支持的,由于 Flutter 是归属于声明式 UI 编程,其处理起来要更加的简单与便捷。

Android/iOS 终端快速截屏技巧

传统的方式进行截屏大概是这样:

  • 使用手机截屏按钮截屏
  • 将截屏软件通过 通讯软件(微信和飞书等)发到电脑上

但是这其中需要在手机上安装软件可能就不是十分的便捷和高效。

其实有更加边界的方式处理截屏。这其中有两种方式适用于安卓,一种方式适用于 iOS 设备。

一个检测 Json 合法性的脚本

越来越多的配置都是使用 json 的格式,当我们修改好,最好是进行一下 json 合法性校验。

我们可以使用下面的脚本进行校验。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env ruby
# encoding: utf-8
require 'json'
file = ARGV[0]


def is_json_valid(value)
  result = JSON.parse(value)
    result.is_a?(Hash) || result.is_a?(Array)
  rescue JSON::ParserError, TypeError
    false
  end


result = is_json_valid(File.open(file).read)
puts "json is valid(#{result})"