firefox 使用侧边标签栏替换顶部标签栏

安装侧边插件 tab-tree

推荐安装使用 Tree Style Tab 插件实现侧边插件,其他插件也可自行探索。

配置自动隐藏顶栏

地址栏输入

about:config —> toolkit.legacyUserProfileCustomizations.stylesheets —> true

帮助—> 更多排障信息—> 配置文件夹—> 打开文件夹—> 新建 chrome 文件夹

把配置文件 userChrome.css 放置在 chrome 目录下

内容从这里 拷贝。

最后完全关闭 Firefox 重启即可。

Reference

高能效人士的七个习惯

  • 要事第一
    • 重要性:《成功的普遍共性》一文的作者格雷(E.MGray)发现成功的决定因素并非辛勤的工作、出众的运气和良好的人际关系,虽然这些因素对于一个人的成功有举足轻重的影响,但都比不上另外一个更加重要的因素,那就是习惯三”要事第一”。 格雷说:成功者能为失败者所不能为,纵使并非心甘情愿,但为了理想与目标,仍可以凭毅力克服心理障碍
    • 时间管理的时代演进
      • 第一代:利用便条与备忘录,在忙碌中调配时间与精力
      • 第二代:强调行事历与日程表,反映出时间管理已注意到规划未来的重要
      • 第三代:依据轻重缓急设定短、中、长期目标,再逐日制定实现目标的计划,将有限的时间、精力加以分配,争取最高的效率 有人发现,过分强调效率,把时间崩得死死的,反而会产生反效果,使人失去增进感情、满足个人需要以及享受意外之喜的机会。
      • 第四代:根本否定”时间管理”,主张关键不在于时间管理,而在于个人管理,把重心放在维持产出与产能的平衡上。
    • 时间管理矩阵
      • 象限
        • 重要:凡有价值、有利于实现个人目标的就是要事。
        • 紧迫:必须立即处理
      • 事务分类
        • 1⃣️ 既紧迫又重要
          • 危机
          • 迫切问题
          • 在限定时间内必须完成的任务
        • 2⃣️ 不紧迫但重要
          • 预防性措施
          • 建立关系
          • 明确新的发展机会
          • 制定计划和休闲
        • 3⃣️ 不重要但紧急
          • 接待访客、某些电话
          • 某些邮件、某些报告
          • 某些会议
          • 迫切需要解决的事务
          • 公共活动
        • 4⃣️ 不重要也不紧急
          • 繁琐忙碌的工作
          • 某些邮件
          • 某些电话
          • 消磨时间的活动
          • 令人愉快的活动
      • 偏重某一事务的结果
        • 1⃣️ 既紧迫又重要 urgent and important
          • 压力大
          • 筋疲力尽
          • 被危机牵着鼻子走
          • 忙于收拾残局
        • 2⃣️ 不紧迫但重要 important but not urgent
          • 愿景、远见
          • 平衡
          • 自律
          • 自制
          • 很少发生危机
        • 3⃣️ 不重要但紧急 unimportant but urgent
          • 急功近利
          • 被危机牵着鼻子走
          • 被视为巧言令色
          • 轻视目标和计划
          • 认为自己是受害者,缺乏自制力
          • 人际关系肤浅,甚至破裂
        • 4⃣️ 不重要也不紧急 unimportant and not urgent / 3⃣️ 不重要但紧急
          • 完全不负责任
          • 被炒鱿鱼
          • 基本生活都需要依赖他人或社会机构
    • 个人管理四步骤
      • 确认角色
      • 选择目标
      • 安排进度
      • 每日调整

整理 Notion 导出文档名称

从 Notion 导出 md 格式的文档,默认会对文件名做一些处理,

大概是这样,会讲过长的文档名称压缩,在首行使用 md 一级标签标记文件名,再将文档截断为图示的样子。

这样的文档导入其他笔记软件是很不方便的,特别是内容多了就很不方便。

为此准备了一个 perl 的脚本来处理。

整理前文件清单如下:

整理后自动将第一个一级标题作为文件名,并自动将文件名等于首行标题的首行去掉。

以下是 Perl 源码。整理后直接运行即可:

#!/usr/bin/perl -w

use strict;
use warnings;

my $target_dir = $ARGV[0];

collate_name_with_title($target_dir);
scan_with_remove_first_line($target_dir);

sub collate_name_with_title {
    my $target_dir = shift;

    my $file_re = qr/^.*\s[0-9a-z]{5}\.md$/;

    for my $file (glob "$target_dir/*.md") {
        if ($file =~ $file_re) {
            open my $fh, '<', $file or die "Can't open $file: $!";
            my $line = <$fh>;
            close $fh;
            chomp $line;
            if ($line =~ /^#\s(.*)$/) {
                my $title = $1;
                $title =~ s/\s//g;
                $title =~ s/[|.:\/]/-/g;
                print "$file: \t$title\n";
                rename $file, "$target_dir/$title.md";
            }
        }
    }
}

sub scan_with_remove_first_line {
    my $target_dir = shift;

    for my $file (glob "$target_dir/*.md") {
        open my $fh, '<', $file or die "Can't open $file: $!";
        $file =~ /$target_dir\/(.*)\.md$/;
        my $file_name = $1;
        my @lines = <$fh>;
        close $fh;
        my $title = $lines[0];
        #print "$file_name: \t$title";
        chomp $title if $title;
        if ($title && $title =~ /^#\s(.*)$/) {
            $title = $1;
            if ($title eq $file_name) {
                #print "file: $file\n";
                #print "$file_name: \t$title\n";
                print "remove first line: $file\n";
                remove_first_line($file);
            }
        }
    }
}

sub remove_first_line {
    my $target_file = shift;

    open my $fh, '<', $target_file or die "Can't open $target_file: $!";
    my @lines = <$fh>;
    close $fh;
    shift @lines;
    open my $fh, '>', $target_file or die "Can't open $target_file: $!";
    print $fh @lines;
    close $fh;

}

运行方法:

$  perl collate-md-name-export-by-notion.pl ~/Documents/MyWiki/Note
...

记得备份数据,避免误操作导致数据丢失!

Arch Linux ARM 安装 electron 版微信

偶然逛 ArchWiki 的 微信 页面,发现在 Arch 下提供了很多种运行微信的方案,在我的 ARM 版 ARCH 下搜索了一下,发现提供了一个基于 electron 直接可用的微信:

$ sudo pacman -Ss wechat  
archlinuxcn/electronic-wechat-uos-bin v2.3.1.fix-2  
   Linux 下更好用的微信客户端. 更多功能, 更少bug. 使用Electron构建, 利用UOS请求头修复了登陆问题.  
archlinuxcn/wine-wechat-setup 1.2-1  
   Setup and run WeChat Windows version with Wine (Chinese version)

安装 electron 版的尝试一下:

$ sudo pacman -S electronic-wechat-uos-bin

安装没有任何困难,直接安装,运行起来发现是可以正常使用的:

扫码登录,毫无障碍:

简单看了一下,应该是基于网页版的,目前是可以正常使用。

如果这个方案不行,还可以尝试一下 wine 版的。

总之,在 Linux 下使用微信,应该是不成问题了。

Parallels m1 安装 arch 虚拟机并配置 KDE 和辅助程序

最近在探索 m1 MacBook 下运行 linux 虚拟机的可能性,计划未来在 linux 虚拟机下完成所有开发工作,parallels desktop 天然提供了 debian/ubuntu/fedora 等 linux 发行版支持,但是在我个人使用场景中还是多少有些问题。

几天在浏览 archWiki 时发现社区提供了一个直接可用的 parallels Deskto 虚拟机模版,可以用来快速配置 linux 开发环境,比较省时省力,在这里介绍几个关键步骤。

获取 arch linux 虚拟机模版

这里下载 Arch Linux Parallels Desktop 虚拟机模版。

下载完毕后解压,使用 Parallels 打开即可。

在 对应的 README 文件中可以看到默认的用户名和密码。

如果一切顺利,启动虚拟机,即可看到一个配置好的 arch linux。

安装 KDE 桌面

# 根据需要配置镜像后进行
# 建议配置 ustc arch arm 镜像后继续
pacman -Syyu # 升级系统中全部包
pacman -S sudo vim xf86-video-vesa 

# 创建非 root 账号
useradd -m -G wheel -s /bin/bash myusername
passwd myusername
# 最后记得赋予新用户 sudo 权限

# 安装 kde plasma 桌面
pacman -S plasma-meta konsole dolphin 
# plasma-meta 元软件包、konsole 终端模拟器和 dolphin 文件管理器
pacman -S plasma-wayland-session xdg-desktop-portal
sudo pacman -S packagekit-qt5 packagekit appstream-qt appstream # 确保 Discover(软件中心)可用,需重启
systemctl enable sddm
systemctl start sddm  # 直接启动显示管理器

# 安装中文字体
sudo pacman -S adobe-source-han-serif-cn-fonts wqy-zenhei # 安装几个开源中文字体。一般装上文泉驿就能解决大多 wine 应用中文方块的问题
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra # 安装谷歌开源字体及表情
sudo pacman -S kdeconnect # 安装 KDE Connect,可以用智能手机控制 KDE

安装 Parallels Tools

实测默认无法通过 Parallels 菜单栏的安装 Parallels Tools 来安装辅助工具,需要手动挂载安装。

前往 /Applications/Parallels Desktop.app/Contents/Resources/Tools 文件夹,找到 prl-tools-lin-arm.iso 文件,手动挂载到虚拟机中,运行安装即可。

效果展示

以上描述了几个需要特别注意的点,之后按照需要配置系统即可:

搭载 Apple Sillicon 芯片的 MacBook 目前软件生态还有待完善,虚拟化方面,我尝试了 UTM、VMware Fusion 和 Parallels Desktop 三种虚拟化桌面软件,以及 Debian/Fedora/Ubuntu 等系统。

体验下来 Parallels Desktop 比较省时省力,系统方面貌似 Arch 和 Debian 下 aarch64 的软件生态相对完善,如果有时间建议都尝试一下选择适合自己的。

体验下来我个人更倾向 Arch Linux,KDE 支持比较好,软件生态也相对更好。不管选择什么,记得日常配置多打快照,避免哪一天滚挂了。

相比于 macOS,linux 下的 aarch64 软件生态相对更好些,特别是开源软件和终端下常用的软件,未来我是打算将所有开发和终端操作全部放在 linux 虚拟机中使用了。

参考文献

arm64 版 picgo 提示已损坏解决办法

PicGo 是一款很好用的图床辅助软件,一直在使用。

最新下载最新版的 picGo arm64 版安装,提示已损坏,执行以下命令解决:

sudo xattr -d com.apple.quarantine "/Applications/PicGo.app"

参考

Emacs 集成 Github Copilot

copilot.el 是一个非官方实现的 Github Copilot 插件,实测在 x86/arm64 、macos/debian 下均可使用,下面介绍最关键的几个配置步骤。

准备

  • Emacs >= 27
  • 安装 node.js
  • emacs 安装好 e, editorconfig 插件

以上是对您环境最基础的要求,确认无误后继续下一步。

配置 copilot.el

官方可以直接引用 github 链接作为插件,但考虑到网络环境问题,在这里使用手动克隆代码库来引用。

运行以下命令将 copilot.el 克隆到 emacs 配置文件夹:

$ cd ~/.emacs.d
$ git clone https://github.com/zerolfx/copilot.el.git

克隆完毕后,在 emacs 配置中将 copilot.el 载入,并配置一些必要的内容:

比如将以下内容写入 ~/.emacs.d/init.el

;;copilot
(add-to-list 'load-path
         (expand-file-name (concat user-emacs-directory "copilot.el")))
(require 'copilot)
;; copilot automatically provide completions
(add-hook 'prog-mode-hook 'copilot-mode)

; complete by copilot first, then auto-complete
(defun my-tab ()
  (interactive)
  (or (copilot-accept-completion)
      (ac-expand nil)))

(with-eval-after-load 'auto-complete
  ; disable inline preview
  (setq ac-disable-inline t)
  ; show menu if have only one candidate
  (setq ac-candidate-menu-min 0))

(define-key copilot-completion-map (kbd "
<tab>") 'copilot-accept-completion)
(define-key copilot-completion-map (kbd "TAB") 'copilot-accept-completion)

以上配置均来自代码库最基础的配置,可以实现最直观的功能。

使用

配置完毕后即可开始使用,首先需要登陆:

# 登陆
M-x copilot-login

如果一切顺利,完成授权,就可以开始使用了。

重启 Emacs,尝试一下吧:

参考文献

PVE 批量创建、配置虚拟机 IP、网卡、启停及销毁

# 从模版批量派生,100 虚拟机仅需2 min
for i in {001..128}; do qm clone 336 11$i --name stl-ceph-bare-node$i --pool stl-ceph-cluster2; done

# 使用 cloud-init 批量配置 ip,需在模版提前装好 cloud-init 软件包并添加设备
for i in {1..128}; do num=`echo $i | awk '{printf("%03d",$0)}'`; qm set 10${num}  --ipconfig1 ip=10.24.88.$i/24,gw=10.24.88.254; done

# 批量断开网络接口
for i in {002..128}; do qm set 10$i --net0 virtio,link_down=1; done

# 批量开机
for i in {001..128}; do qm start 10$i; done

# 批量销毁
for i in {001..111}; do qm destroy 10$i; done

PVE 虚拟机导入 vmdk 磁盘

  1. 先把磁盘镜像上传到 pve 服务器中,若空间不足可挂载本地存储;
  2. vmdk 转为 qcow2
qemu-img convert -O qcow2 test.vmdk test.qcow2

注:-O 是大写的字母 O

  1. 使用 qm importdisk 命令导入
$ qm importdisk  
<vmid> <images-name> <storage pool>  --format=<disk-fs> 

# vmid:vm的id 例如102
# images-name:磁盘镜像的名字
# storage poll: 存储磁盘镜像的位置,一般写存储的名称,如pve01data
# disk-fs: 磁盘镜像格式  raw/vmdk/qcow2

参考文献