Ubuntu 22.04搭建TimeMachine

  • 创建一个目录,作为 TimeMachine 保存数据的目录。

  • 安装 netatalk 服务和 avahi-daemon 服务。

  • 编辑 netatalk 的配置文件:

  • 在该文件原来的基础上,或新增以下配置:

  • 重启服务。

现在,你在 TimeMachine 上应该可以看到这个备份服务了,选择该备份服务就可以开始你的第一次备份了。

注意: Debian 12.5 系统上不能安装 netatalk ,原因是这个项目已经长时间没人维护了,后续建议直接使用 SMB 建立 TimeMachine 的备份服务器。

参考链接


Flutter CustomPainter自动绘制属性repaint原理

这篇文章主要讨论的是Fluter中CustomPainter中使用repaint属性实现自动paint的原理。

首先使用CustomPaint创建一个StatefulWidget,demo中根据点击位置,对蓝色的圆进行位置变换。

代码如下

继续阅读Flutter CustomPainter自动绘制属性repaint原理

flutter升级到3.3.9后报错“Library not loaded: @rpath/libswiftCore.dylib”

flutter 升级到 3.3.9 后,代码编译报错,如下:

解决方法就是在工程的 "Build Settings->Linking->Runpath Search Paths" 加上 "/usr/lib/swift" 。

如下图:

继续阅读flutter升级到3.3.9后报错“Library not loaded: @rpath/libswiftCore.dylib”

VirtualBox 7.0.4安装macOS Monterey 12.6.1

硬件要求

Intel E3-1230 v3 可以成功安装, AMD Ryzen 5900 CPU 在 Linux 系统上,需要配置 CPU 模仿 Intel CPU 的特性。并且 CPU 部分,不要启用 嵌套VT-x/AMD-V

生成系统安装镜像

macOS (实验使用的系统是 macOS Big Sur (11.7.1))系统上,执行如下命令,生成系统安装镜像

继续阅读VirtualBox 7.0.4安装macOS Monterey 12.6.1

ubuntu 22.04升级到cpp-12后flutter编译报错"找不到 -lstdc++"

在今天晚上 ubuntu 22.04 执行如下升级命令之后

再次执行 flutter 的构建命令,报错。

操作过程如下:

解决方法是手工安装依赖:

之后再执行构建命令。

参考链接


Android R(11)文件选择兼容

对于 Android R(11) 使用 ContentResolver 检索图片,音乐,视频文件,参考 Android R(11) ContentResolver报错java.lang.IllegalArgumentException: Invalid token limit 里面的代码即可实现。但是如果想上传 PDFTXT等文件的时候,则会发现系统无任何数据返回。

下面探讨一下如何解决这个问题:

一.储存

首先,我们需要对Android的储存有所了解
Android储存器可分为内部储存外部储存,这里的内部储存和外部储存不是说有两个物理储存器而是系统在硬盘上划分了两个专用目录用作内部储存和外部储存。简单来说,我们通过系统文件管理器看到的目录都属于外部储存,外部储存又可分为三类目录,私有目录公共目录其它目录,而内部储存对于用户是隐藏的,如数据库、SharedPreferences等文件都放在内部储存中。

内部储存

内部储存对应的目录为/data/user/0/{应用包名},该目录下应用有权限进行文件操作,目录对外不可见,应用删除对应的目录也会被删除。

外部储存
1.私有目录

私有目录获取和内部储存获取方式类似,都有file和cache目录,且该目录下应用有权限进行文件操作,目录对外可见,应用删除对应的目录也会被删除。
从Android11开始,私有目录不能被外部访问,即使获取了“所有文件管理”权限也不行(当然也是有其它方式可以实现Data目录的访问,不过目前看来并不完美)

2.公共目录

Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等目录都是公共目录,Android11前可以通过文件路径直接访问,Android11后需要通过MediaStore来进行访问。

3.其它目录

外部储存中除了私有目录和公共目录外都是其它目录,Android11后不能直接对其它目录进行访问。

二.分区存储

Android10中已经加入了分区储存机制,不过是非强制的,适配Android10只需在AndroidManifest.xml中添加 android:requestLegacyExternalStorage="true"即可。而在Android11已经强制应用使用分区储存。

三.兼容方式

1.MANAGE_EXTERNAL_STORAGE(不推荐)

开启授权页面

获取“所有文件管理”的权限可以读写除私有目录外的所有文件,但是这种权限一般为文件管理类的软件才需要申请。一般APP申请此类权限若上架Google,华为等应用市场大概率被拒。

2.存储访问框架 (SAF)(推荐)

应用如果有做文件选择上传类的功能可以使用此方式,通过启动一个系统的文件浏览页面,选择需要的文件后返回一个uri,之后将uri转成流上传或者将通过uri复制文件到私有目录再操作复制后的文件进行上传,这里切记不能直接将uri转成File去进行操作。

参考链接


如何将其他设备通过 Windows 10 自带的“连接”功能无线投屏到计算机中

请确保计算机端已打开连接窗口,再使用无线投屏功能。

在计算机端打开“连接”窗口
  1. 点击任务栏中的网络图标,开启 WLAN 功能。

  2. 点击 Windows 图标。
    • 若有连接选项,请继续步骤 3 的操作。

    • 若无连接选项,请先进行如下操作后再进行步骤 3 的操作:
      1. 连接网络状态下,点击 Windows 图标 > 设置图标,选择系统。

      2. 点击投影到此电脑,选择可选功能。

      3. 点击添加功能。

      4. 在添加可选功能搜索框中输入无线,在搜索结果中勾选无线显示器,点击安装。

      5. 安装完成后,重启计算机(若您的计算机有更新,请更新后重启),您就可以在 Windows 应用列表中看到连接选项。

  3. 在连接窗口,您可以看到您的计算机设备名称,并显示您的计算机已准备好无线连接方式。

使用无线投屏功能

在其他设备端(如手机、平板、其他计算机)中打开无线投屏模式,搜索投影设备为上述计算机名称,进行连接即可。

 

  • 不同的设备打开无线投屏模式的操作不一样,具体请咨询设备供应商。
  • 通过华为电脑管家将手机与计算机连接,可能会影响到手机的无线投屏功能,请在我的设备>我的手机>断开连接中断开连接,并在计算机端关闭连接窗口,再重新尝试。

以华为 P30 为例:

  1. 下拉打开通知面板,开启 WLAN 功能,选择无线投屏。

  2. 手机端将自动搜索附近的可投屏设备,在可投屏的设备中选择计算机设备名称。

  3. 计算机端的连接窗口中将显示手机的投屏界面。

  4. 若要断开无线投屏,点击连接窗口右上角的关闭按钮,或关闭手机端的无线投屏功能即可。

参考链接


如何将其他设备通过 Windows 10 自带的“连接”功能无线投屏到计算机中

Windows 11右键设计反人类?教你恢复完整右键菜单

微软已经在10月5日发布了Windows 11正式版,很多朋友也已经升级了。不过对于Windows 11的一些新设计,并不是所有人都能适应的,例如新的右键快捷菜单,就不少朋友表示接受不了。

Windows 11的新右键菜单相比之前的旧款式,颜值上的确大有提升,不仅使用了Fluent Design设计语言,而且优化了文字排版,行间距更宽,便于阅读和触控。然而,Win11的右键菜单隐藏了很多选项,如果想要找到一些常用的功能,需要点击“显示更多选项”才能展开,这操作起来颇为麻烦。怎么办?今天就来给大家分享一些恢复Windows 11完整右键菜单的方法!

使用注册表修改

首先,通过修改注册表,我们就可以将Win11的右键菜单改为老样式。下面是具体的方法。

  ·运行“regedit”,开启注册表编辑器,定位到“HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID”;

  ·接着,右键点击“CLSID”键值,新建一个名为{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}的项;

  ·右键点击新创建的项,新建一个名为InprocServer32的项,按下回车键保存;

  ·最后选择新创建的项,然后双击右侧窗格中的默认条目,什么内容都不需要输入,按下回车键。

保存注册表后,重启explorer.exe,即可看到右键菜单恢复成旧样式了。

如果想要恢复成为Windows 11的设计,那么删掉InprocServer32的项就可以了。

参考链接


Win11右键设计反人类?教你恢复完整右键菜单

Android:加载PDF几种方法汇总对比

在安卓项目中,加载PDF文件,是一个比较常见的需求。又分为两大类,

1.加载网络PDF

2.加载一个本地静态PDF。


查阅资料,纵观网上在安卓中打开PDF的各种方式,大致可以分为以下几类,

1.直接使用第三方软件打开(包括浏览器打开和第三方软件打开)

如果是在app内部加载PDF文件,虽然安卓原生API对于PDF的支持又不是太好,但是各种第三方专门的阅读或者办公软件支持的是很不错的,可以通过Intent配置data和type实现。

其中,在实际需求中又会分为加载本地PDF和网络PDF的情况。

使用浏览器打开PDF:(APP外部打开,适用于加载网络PDF)

使用手机上已安装的可以打开PDF的第三方软件来打开PDF:(APP外部打开,适用于加载本地PDF)

(使用这种方式缺点是:手机上如果一个可以打开PDF的软件,那么就尴尬了~)


2.连接Google服务器解析

安卓的WebView不支持PDF解析,因此通过连接Google的一个服务器转换成功后返回给WebView显示。但是,但是,但是呢,大家都懂的,天朝和Google之间有一道高高的墙。方法还是贴出来,作为国际化APP的一种方案。


3.用第三方库加载

Github上有一个Java开源项目 https://github.com/barteksc/AndroidPdfViewer ,
这个库的大致原理,是内置了一个PDF解析器,以流的方式将网络PDF从网上Down下来,然后再以流的方式将其还原成PDF展示出来(具体细节没关注)。亲测中,这个库每次进入webview页面都会解析加载一遍PDF,如果PDF过大,费时无缓存不说,最致命的问题乃是,

APK包体积会瞬间增大15M左右,

具体原因不明,估计应该是内置PDF解析器的问题。于是,此方法被我抛弃了。


4.使用Moliza开源的Pdf.js

这个JS类库也是很强大的,配合原生的WebView使用,支持预览,缩放,翻页的功能,实现效果和WKWebView没差。同样也有体积问题,全部放到本地apk的话包大小差不多会增加5M左右。但相比上一种方式还是轻量一些:
http://www.jb51.net/article/136364.htm


5.使用安卓自带的PdfRenderer类加载

如果要求支持的功能不是很多,用安卓提供的PdfRender就可以满足需求了。PdfRender加载多页的话可以配合ViewPager或者RecyclerView使用。需要注意的是使用PdfRender需要先将PDF文件下载到本地,是线程不安全的,并且API>=21才能使用。因为这种方式是将PDF下载到本地,于是就产生了新问题:占内存。如果是静态的PDF文件不大还好,但是如果是频繁加载网络PDF的需求,那就头疼了,这种方式需要做好定时清理删除PDF的工作,否则,GG。

这里提供的示例是阿里巴巴Android开发手册,放到assets目录下.

PdfRender的大致调用方式是:

  • 初始化PdfRender,将PDF文件转换为ParcelFileDescriptor作为入参
  • 通过getPageCount()获得Pdf的总页数
  • 循环遍历,通过openPage()获得一个封装了当前页Pdf参数的内部类Page
  • 创建一个Bitmap对象,,用上步获取的Page加载,相当于把当前Pdf页的内容渲染到了Bitmap上
  • 对Bitmap进行你想要的操作,每次循环结束后关闭当前Page。

大部分都是常规操作,但要注意两点:

1. 每次循环创建的Page对象在使用完毕后必须调用close()。否则其内部的openPage()判断会抛异常;

2.Bitmap占用内存较大,如果用ViewPager加载一定要重写Adapter中的destroyItem(),及时的将需要销毁的视图从父容器中移除,否则快速滑动几页后会OOM。

参考链接


android:加载PDF几种方法汇总对比