仅做记录。
Step 1:在 WSL 中重新安装 OpenSSH
sudo dpkg-reconfigure openssh-server
Step 2:修改 /etc/ssh/sshd_config,将 Port 改为一个 1024 以上的值,如果没有配置密钥的话,允许密码登录
Step 3:重启 SSH 服务
sudo service ssh --full-restart
这样就可以从另一台 PC 上登录进本机的 WSL 了,VSCode Remote 之类的也都能正常运行。
仅做记录。
Step 1:在 WSL 中重新安装 OpenSSH
sudo dpkg-reconfigure openssh-server
Step 2:修改 /etc/ssh/sshd_config,将 Port 改为一个 1024 以上的值,如果没有配置密钥的话,允许密码登录
Step 3:重启 SSH 服务
sudo service ssh --full-restart
这样就可以从另一台 PC 上登录进本机的 WSL 了,VSCode Remote 之类的也都能正常运行。
如何在 Windows 上(Outlook 或 Win10 Calendar 应用)同步 Google Calendar,尤其是他人共享的日历是一个困扰了我很久的问题。 继续阅读
Windows 10 这个 UWP 的逻辑太垃圾了。
在以前版本的 Windows 中,我们如果想使用一个程序打开一个从来没注册过的扩展名,通常直接右键属性就可以完成。但是在 Windows 10 上,这个做法就失效了。例如,我需要使用 XnView MP 打开 .webp 文件,尽管我已经把 XnView 注册为默认的图像查看器,但是并不是所有的图像格式都被关联到了它上面(这个原因说实话也很简单,Windows 怎么知道什么格式的东西是”图像“,它也不可能维护一个世界上所有图像格式的列表),比如 .webp 格式就没有被关联。使用右键打开方式强行关联到 XnView 以后,就会有一个新的问题,在双击的时候,XnView 是打开了,但是没有打开对应的文件。
因此,还是需要找注册表解决。
在我们使用右键打开方式关联 .webp 格式以后,注册表的情况是这样的:
可以看到,创建了 .webp 这个扩展名,并且指向 .webp_auto_file,然后指向 XnView 执行文件,但是注意没有带任何参数,因此 XnView 无从知道要打开什么文件。
那么这时候可行的解决方法就是,更改 command 的值,在路径后加上 ”%1“ 这个参数。
或者也可以把这两个项都删掉,之后通过命令行解决:
ftype extfile="C:\Program Files (x86)\YourProgram.exe" "%1" assoc .ext=extfile
extfile 可以随便更改,只是描述文件的名字,然后将 .ext 指向这个项就可以了。
之后重启,且需要在 explorer 里面再在右键中打开方式处设置一下关联,关联到刚刚选择的程序,就能正常双击打开了。注意这步一定要做,否则似乎并不会很快生效。
Reference:
https://superuser.com/questions/1080453/adding-or-registering-a-file-type-so-it-can-be-associated-with-an-application
起因是这样的,美帝良心想这个 X1 Carbon 的官网上在调整 SSD 配置的时候,从 256G 加到 1T 需要增加 591USD,即使算上 45%off 的折扣也要 200 多刀。然而一个 SN750 1T 在美亚不过也才 200 刀,在官网加 SSD 就相当不合算了。
但是我注意到了一点,联想官网上对 SSD 的描述是 OPAL,也就是符合 OPAL 标准的自加密 SSD (Self-Encrypting Drive,SED),机器到手以后也默认开启了 BitLocker。在我的记忆中,BitLocker 是一个纯软件的实现,那么这里 SSD 的自加密和 BitLocker 的关系是什么呢?
查了一圈资料以后发现,BitLocker 存在硬件和软件两种实现方式。在检测到硬盘控制器支持硬件加密的时候,Windows 会直接使用该功能,且不对数据进行任何处理的方式就写入磁盘,由主控完成加密。如果主控不支持加密,则使用软件实现。具体的实现方式可以通过 manage-bde 这个命令查看:
如果是软件实现,那么在 Encryption Method 下就会显示类似于 XTS-AES 128 这样的字眼。在一些比较老的版本上可能只是 AES 128。
如果是启用了硬件加密特性,那么应该是这样:
如果是官网购买的 OPAL Drive,那么应该是可以显示为 Hardware Encryption 的,如果是自行购买的 SN700(官网是 SN720,也就是前者的 OEM 版本),那么就是软件加密。
如果没有关闭 BitLocker 就取下了硬盘,在数据可以抹掉的情况下,理论上有两种方法可以解开。一个是使用 BitLocker 恢复密钥,这个会自动同步到自己的 Microsoft Account 上,可以看这里。或者也可以考虑直接使用命令抹掉数据并重新生成密钥,这个可以看 ArchWiki 的详细讲解。
Reference:
https://wiki.archlinux.org/index.php/Self-Encrypting_Drives
https://helgeklein.com/blog/2015/01/how-to-enable-bitlocker-hardware-encryption-with-ssd/
https://support.microsoft.com/en-us/help/4026181/windows-10-find-my-bitlocker-recovery-key
https://howtogeek.com/fyi/you-cant-trust-bitlocker-to-encrypt-your-ssd-on-windows-10/
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV180028
VMware 的虚拟磁盘管理界面上有两个功能,一个是整理磁盘碎片,另一个是回收未使用的空间。这两个功能配合使用,就可以清理掉虚拟磁盘映像文件里面已经删除了的文件依然占用的空间。然而,辣鸡如 VirtualBox 并没有提供这两个功能,需要手动进行未使用空间填零和压缩磁盘映像文件两个步骤。
首先需要确保使用的映像文件格式是动态分配,这样才有压缩的可能性。
如果是 Windows 客户机,那么首先进行磁盘碎片整理,完成之后,下载 sdelete 工具,使用例如:
sdelete.exe c: -z
这样的命令对 C 盘完成填 0 操作。
如果是 Linux 客户机,那么需要使用 zerofree 命令完成这个操作。由于该命令不能在盘符分区已经挂载的情况下工作,且最近版本的 Ubuntu 在 Recovery 模式下也会挂载所有的盘符,因此如果要进行这个操作,需要使用一个 Live CD 进入系统。安装 zerofree 之后,运行:
# zerofree -v /dev/sda1
这样的命令对 /dev/sda1 进行填 0 操作,之后就可以进行压缩了。
压缩的操作我们需要使用 VBoxManage 命令:
VBoxManage modifymedium disk "/path/to/disk.vdi" --compact
在 Windows 下可能需要手动在 VirtualBox 安装路径下找到 VBoxManage.exe 进行操作。之后就压缩成功了。
在 Windows 上用习惯了微软全家桶,切到 Linux 就没指望了,又不能说装个 Windows 虚拟机就为了用 Office 365,那只好尝试找找替代品了。
首先是 Outlook,包含了学校账户的 Exchange ActiveSync,个人 Outlook 邮箱还有日程功能。在 Linux 上比较常见的邮件客户端是 Mozilla Thunderbird,通过插件配置可以最低限度地支持 Outlook 提供的一些服务。
有了这些插件以后,就可以依次添加自己的账户开始同步了。不能说多好用,勉强能用吧。
然后是 Microsoft To-Do,这个有好事者开发了一个跨平台的版本:klaussinani/ao。通过 snap 就可以安装。
还有 OneNote,这个似乎除了网页版就没有什么比较好用的版本,不过也有好事者用 Electron 做了一个本地网页客户端:patrikx3/onenote。还算能用,也是通过 snap 安装。
OneDrive 的同步,也有好事者写了 Linux 上可用的版本:skilion/onedrive。这个要写一下正确的安装流程,我装的时候差点就把 OneDrive 里面的文件全部删掉了,幸好有回收站。
对于 Ubuntu 18.04,安装流程是这样的:
sudo apt install libcurl4-openssl-dev sudo apt install libsqlite3-dev # Ubuntu 18 sudo snap install --classic dmd && sudo snap install --classic dub git clone https://github.com/skilion/onedrive.git cd onedrive make sudo make install
注意,在运行之前,一定是在运行之前,自行在 ~/.config 下创建配置文件目录,以 ~/.config/onedrive 为例,如果需要同步多个账户则应使用不同的目录名称:
mkdir -p ~/.config/onedrive cp ./config ~/.config/onedrive/config nano ~/.config/onedrive/config
config 文件结构类似这样:
# Directory where the files will be synced sync_dir = "~/OneDrive" # Skip files and directories that match this pattern skip_file = ".*|~*"
标记了默认的同步路径为 ~/OneDrive,由于在首次运行 onedrive 的时候默认就是授权,因此如果要更改同步目录的话,在这里要先在配置文件里面写好。然后运行 onedrive –confdir=”~/.config/onedrive” 开始进行授权操作,这样就会在 sync_dir 处创建对应的文件夹,然后开始下载。
如果要自动同步,在 make install 之后,在 /usr/lib/systemd/user 下已经被创建了一个 onedrive.service 文件,类似这样:
[Unit] Description=OneDrive Free Client Documentation=https://github.com/skilion/onedrive [Service] ExecStart=/usr/local/bin/onedrive -m Restart=no [Install] WantedBy=default.target
如果想要同步多个账户的话,把 ExecStart 改成类似于 onedrive -m –confdir=”~/.config/onedrivePersonal” 这样带有配置文件目录的形式。之后:
systemctl --user enable onedrive systemctl --user start onedrive
就可以启动服务自动运行了。
如果不想使用 User Service,希望在系统启动时运行,则在 /etc/systemd/system 下创建 onedrive.service,写入类似于:
[Unit] Description=OneDrive Free Client Documentation=https://github.com/skilion/onedrive [Service] ExecStart=/usr/bin/sudo -u <user> /usr/local/bin/onedrive -m --confdir="/home/<user>/.config/onedrive" Restart=always [Install] WantedBy=default.target
之后:
systemctl enable onedrive systemctl start onedrive
切记,不能在授权完成之后,复制 config 文件并更改 sync_dir,然后直接用 -m 参数运行 onedrive,这样会使得该程序认为本地有全部删除的更改,会直接删掉 OneDrive 上所有文件。所以一定要先写配置文件再授权。
最后记录一下添加 SMB 打印机的过程,Linux 通过 CUPS 管理打印机,但是图形界面的管理未必好用,可以尝试用 localhost:631 来管理,注意 cups-2.2.7 在 Linux 版 Chrome 上有 bug,会出现 unauthorized error,这个需要升级到 2.2.8 或者使用 firefox。具体配置可以看 Arch Wiki。
商店没办法打开,刷新 Store 应用的 cache、重置 Store 应用等都试过了,没有效果。
查询错误代码 0x80131500,发现与 TLS 有关。Winkey + R 运行 inetcpl.cpl,在高级中找到 TLS 1.2,打勾即可。
首先感谢 youlun 大佬介绍了 Syncthing 这个好用的文件同步工具,一次性解决了 Nextcloud 同步残废的问题。
有人可能会问,Nextcloud 不就已经可以搭建私有云平台了吗,为什么还要借助 Syncthing 这样一个同步工具呢?如果文件量不大的话,可能这并不是什么大问题,但是由于 Nextcloud 即使是使用它的客户端,也只能通过网页方式上传,在遇到较大的文件的时候,就会遇到各种各样的限制,比如上传超时或者是文件过大不能上传等等。但是 Syncthing 就不存在这样的问题,可以顺畅地进行文件同步。那么,有没有办法让二者配合工作,即 Syncthing 负责文件同步,Nextcloud 负责网页端的界面和移动端访问的功能呢?答案是有的,而且非常可行,考虑到没有现成的教程,因此在这里记录一下。
WebServer 环境依然使用了 LinuxEye 的 LNMP 一键包,需要注意的问题是 PHP 选择 7.1 版本(Nextcloud 13.0.1 的依赖),以及需要通过 addon.sh 安装 fileinfo 这个 PHP 模块。
在部署完成环境之后,添加一个 nginx vhost,现在最新版的一键包中已经加入了 Nextcloud 的 Rewrite Rule,这个给我们的安装带来了极大的方便,再也不用去折腾那些重写规则了。
然后需要调整一下 Zend OPcache 的设置,不然在下载源码之后无法进入配置。具体步骤为在 /usr/local/php/etc/php.d/ 文件夹中找到 opcache 的 .ini 配置文件,将里面的数值按照如下的错误信息调整:
之后在官网下载 tar.bz2 的安装包,解压之后拷贝进 wwwroot,注意这里需要将所有的文件权限改为 www:www,默认一般是登录的用户,会造成无法访问,之后在 MariaDB 中创建一个数据库,在初始化的时候填进 Nextcloud 中,这一步还是比较方便的。
然后更改一下 Nextcloud 的配置,消除缓存的警告。在 <site root>/config/config.php 中添加如下字段即可:
'memcache.local' => '\OC\Memcache\Redis', 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => array( 'host' => 'localhost', 'port' => 6379, ),
至此 Nextcloud 应该就可以正常使用了。
首先需要安装 Syncthing,官方文档中给出了 Ubuntu .deb 的链接,按照它配置即可。
这时候就会遇到一个问题,Syncthing 需要以 www 用户启动才能在和 Nextcloud 一同工作时避免一些权限的问题,但是 www 用户默认是 nologin 配置的,如何登陆进这个用户完成一些初始的设置是一个比较麻烦的问题。由于 www 用户无法登录,所以不能使用一般的 su <user> 来进行用户切换,以该用户的权限启动一个 bash 又不能完成完整的用户环境切换操作。在搜索之后,以一种比较 Tricky 的方法登录了进去:
su -s /bin/bash www
这条命令的意思是 override www 默认的 shell,再登录,然后就会发现你已经切换到 www 用户下了。运行 syncthing,该做什么做什么。
Syncthing 默认监听 localhost:8384 端口,那么在远端 VPS 上,如何进行配置呢?有两个方案,一个是修改监听端口,让程序监听 0.0.0.0:8384,另外一个是通过 nginx 配置一个反代。显然,第二个方案无论是在安全性,还是便利性(不用在域名后面输入端口号)上都优于第一个,所以我们就采用第二个方案。
Nginx 配置文件的关键部分如下:
server { listen 80; listen 443 ssl http2; if ($ssl_protocol = "") { return 301 https://$host$request_uri; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host localhost; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:8384; } }
需要注意的一点就是 proxy header 中的 Host 字段必须改为 localhost,否则 Syncthing 发现你的访问地址不是它的监听地址,就会拒绝访问,返回“Host check error“。
之后就是正常的 Syncthing 使用,这个不难,看官方文档就可以了。
一开始我以为,把 Syncthing 的同步文件夹设置为我的 Nextcloud 的数据目录就可以完成同步,实际上 Nextcloud 的文件列表并不是实时的,需要运行 OCC 重新进行扫描,但是这样的扫描并不能保证数据完全无损,而且在使用时也不可能频繁 SSH 上去进行重扫,因此必须采取其他的方法。
关于这个问题,官方给出的答案是 External Storage,在 Nextcloud 中启用 External Storage 这个组件以后,在设置中挂载外部的文件夹,这个可以是本地,也可以是 SFTP/FTP/Amazon S3/WebDAV 等等,在这个情况下,我们选择本地,然后添加对应的文件夹就可以在 Nextcloud 文件列表中看到我们的文件了,无论是网页版还是手机都可以。
在 Ubuntu 上,我们通过 systemd 服务来完成:
[Unit] Description=syncthing After=network-online.target [Service] ExecStart=/usr/bin/syncthing -no-browser -home="/home/www/.config/syncthing" ExecStop=/bin/kill -9 $(/bin/cat /run/syncthing.pid) Restart=always PIDFile=/run/syncthing.pid TimeoutStopSec=300 User=www [Install] WantedBy=multi-user.target
在 Windows 上,我们可以通过这样一个 .bat 完成启动:
start "Syncthing" syncthing.exe -no-console -no-browser
https://docs.syncthing.net/
https://docs.nextcloud.com/server/13/admin_manual/
https://serverfault.com/questions/333321/executing-a-command-as-a-nologin-user
https://www.jianshu.com/p/4235cc85c32d
%token INTEGER
#ifndef YYSTYPE #define YYSTYPE int #endif #define INTEGER 258 extern YYSTYPE yylval;
[0-9]+ { yylval = atoi(yytext); return INTEGER; }
%union { int iValue; /* integer value */ char sIndex; /* symbol table index */ nodeType *nPtr; /* node pointer */ };
则生成的头文件中的内容是:
typedef union { int iValue; /* integer value */ char sIndex; /* symbol table index */ nodeType *nPtr; /* node pointer */ } YYSTYPE; extern YYSTYPE yylval;
可以把标志(token)绑定到 YYSTYPE 的某个域。如:
%token INTEGER %% program: program expr '\n' { printf("%d\n", $2); } ; expr: INTEGER { $$ = $1; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } ; %% int yyerror(char *s) { fprintf(stderr, "%s\n", s); return 0; }
其中,$1 表示右边的第一个标记的值,$2 表示右边的第二个标记的值,依次类推。$$ 表示规约后的值。
main 函数是调用 yacc 解析入口函数 yyparse()。如:
int main(void) { yyparse(); return 0; }
递归的处理
//L文件: %{ #include "FIRST_TA.H" #include <stdio.h> #include <stdlib.h> %} %% a {return A_STATE;} b {return B_STATE;} c {return C_STATE;} not {return NOT;} %% //Y文件: %{ #include <stdio.h> #include <stdlib.h> %} %token A_STATE B_STATE C_STATE NOT %% program : A_STATE B_STATE { int c, d; c = 20; d = 25; } c_state_not { int e,f; e = 30; f = 35; } | A_STATE B_STATE { int a, b; a = 10; b = 15; } c_state_not : C_STATE NOT{} %% 输入文件的字符:a, b, c, f, c, not
碰上垃圾 VPS 提供商怎么办,商家说是亚洲优化,到本地还是绕 GTT 怎么办?不用担心,KCPTun 来帮你。
说来,网上那堆教程实在是写得不怎么好,要么太复杂,我就想加速一下网络连接,写那么多原理干什么……要么就是太简单,我真的不喜欢一键包。所以还是自己来吧。
KCP 简单来说,就是一个 UDP 暴力发包软件,如果原先建立的连接是这样
Client -> (TCP) -> Server
那么加入 KCP 以后就变成了这样
Client -> (TCP) -> KCP Client -> (UDP) -> KCP Server -> (TCP) -> Server
KCP 无论是客户端,还是服务端,都涉及到两个端口,在客户端有一个 listening port 和 remote,服务端有 一个 listening port 和一个 target。从连接的角度来说,是这样的一个流程:
Client -> KClient_Listening_Port -> KClient -> KRemote
KRemote = KServer_Listening_Port -> KServer -> KTarget = Server
原先 C->S 怎么连接,只要把地址改成对应的 KCP 端地址就可以无缝工作。
举个例子来说,比如我本地有个程序需要连接 Server:8388,原先直接连接就可以了,但是特别慢,打算用 KCP 来加速一下,且 KServer 监听 3389 端口。那么本地需要做的事情是:
"client_windows_amd64.exe" -l :1081 -r Server:3389 -key "test" -crypt none -mode fast2
这个的意思是说,KClient 监听 1081 端口并转发至 Server 的 3389 端口,密码是 test,没有加密,使用的模式是 fast2。
服务端要做的事情是:
server_linux_amd64 -l :3389 -t 127.0.0.1:8388 --key test --crypt none --mode fast2 --quiet
监听 3389 端口的传入连接,转发至本地的 8388 端口,也就是原来的服务端,其他和 Client 的配置相同。
这么简单就配置好了。
项目的 Github 在这里:https://github.com/xtaci/kcptun
这是一个图形化的 Windows 客户端:https://github.com/dfdragon/kcptun_gclient