聊聊在家里折腾单线复用的经历

这篇就当作是当时计网VLAN实验的一个真实实践吧。

现在大部分人家里的光猫应该都是光纤/网线/高频入户,然后在弱电箱里有个猫,提供一个宽带口和一个IPTV口(不讨论光猫拨号的话)。这个时候一般得要两根网线从弱电箱里走暗线出去,一根去接路由器(当然要是你的弱电箱很大能塞得下路由器而且信号和散热也还行就不用往下看了),一根去接机顶盒。但是很多家庭里一个地方只穿了一根,不够用的话就得折腾一下,我随便说几个方案:

  • 自己再穿一根线,如果暗管的空间还足够的话。这个比较稳,而且也不难,像这个網路不通怎麼辦|最完整拉網路線教學|自己的網路自己救|禾我一起DIY EP.11【弱電通】,实在不行也可以请人来穿一根。
  • 单线复用,利用VLAN,在这根网线上面承载多项不同子网的业务。好处很明显,物理上不需要动线路了。而且目前内网单口千兆跑几个业务问题也不太大,除非是1000M的宽带这种会跑不满,不然应该都没有什么问题。
  • 如果机顶盒支持走无线IPTV(这个比较蛋疼)、光猫支持无线(当然你也用不上这个无线的话),并且能进光猫超级管理页,那么把IPTV的VLAN划到无线上就OK。这个方案可行但我个人不太感冒,毕竟很多时候都只能走2.4GHz频段,拥挤的时候稳定性堪忧。
  • 目前还很小众但是我挺看好的方案:光纤。网线走明线很明显,不太好看,但是光纤不会。TB上面能买到隐形光纤,搭配光纤收发器就可以了,成本不会很高。这里有篇文章提到了vleop mesh用隐形光纤组网达到有线回程-路由器交流。应该也可以买那种有线身补强的然后穿暗管。

这里主要讨论的是第二种方案,并不是我懒得去穿线,而是客厅的暗管很细还穿了2根网线(电视占了一根并且很难改造)和1根同轴电缆,卡得很紧动都动不了(淦,当时他是怎么穿过去的,服了),只好买两个简易的网管交换机来做单线复用了。

其实如果你的路由器可以划VLAN的话(比如自己刷了固件的K2P之类的)或者支持IPTV流量隔离,那买一个其实就够了;另外如果你能完全控制光猫的VLAN,那么应该不需要买了。现在这个时候,家用的简单网管交换机有很多,比较经典的就是网件的GS105E/GS108E(接口数量不一样),价格有点高(不过也有很多洋垃圾)。最近也有人在淘亚马逊(中亚直邮/美亚转运)上面的网件GS908E,价格不错。TP-LINK的TL-SG2005/TL-SG2008(8口这个内置了电源大了点),还有水星的SG105 Pro/SG108 Pro也都可以。

开工之前来复习一下:

比如这几篇:Fundamentals of 802.1Q VLAN Tagging – Cisco MerakiTagged, Untagged, and Native VLANs – Network DirectionWhat is PVID – Jason’s Web SiteHow to configure 802.1Q VLAN on TP-Link Easy Smart/Unmanaged Pro Switches? | TP-Linkdifference between untagged VLAN and PVID。还有问题的话…那就去看802.1Q吧,看完顺便带带弟弟。

首先,我们希望把互联网、IPTV和内网这三个子网隔离开来。我们知道可以通过VLAN来隔离广播域,使得同一个物理交换机上面有多个不互通的子网,除非有三层设备(路由器之类的)做转发。其次,我们希望可以单线复用,就是在一根线上承载不同子网的业务。我们知道Trunk用来连接两个交换机,两个交换机上同一VLAN的设备就可以互相通信,就很符合现在的需求。

VLAN enabled ports are generally categorized in one of two ways, tagged or untagged. These may also be referred to as “trunk” or “access” respectively. The purpose of a tagged or “trunked” port is to pass traffic for multiple VLAN’s, whereas an untagged or “access” port accepts traffic for only a single VLAN. Generally speaking, trunk ports will link switches, and access ports will link to end devices.

Fundamentals of 802.1Q VLAN Tagging – Best Practices

不管是叫access还是untag,trunk还是tag。简言之,我们需要划分3个VLAN,分别承载互联网(光猫Internet到路由器WAN)、IPTV(光猫IPTV到IPTV机顶盒)和内网(和路由器LAN互通)。Trunk(tag)口用来连接这两个交换机,Access(untag)口用来连接设备,它们都用来决定离开这个端口时的动作;PVID来决定一个没有tag的包进入这个端口时应该如何做(不是所有厂商的交换机都有这个,有些是自动的)。

get到上面的点之后,就可以开工了。完工后的拓扑大概会是这个样子的,菜鸡本菜不会用Visio只能随便画一个了:

具体两个交换机上接线应该是这样的:

很显然了,两台交换机上的端口1都是Trunk口,然后端口2、端口3、端口45分别设不同的VLAN。如果假定VLAN 10给互联网,VLAN 20给IPTV,VLAN 11给内网,那么交换机A和B的设置应该一样,VLAN应该是这样的:

  • VLAN 10(Internet):端口1设为Tag;端口2设为Untag;
  • VLAN 20(IPTV):端口1设为Tag;端口3设为Untag;
  • VLAN 11(LAN):端口1设为Tag;端口4和5设为Untag;
  • PVID:端口1设为1,端口2设为10,端口3设为20,端口4和5设为11。

这适用于不在弱点箱内的主路由拨号然后通过弱电箱内的暗线共享给其它房间的设备(例如子路由)的场景。缺点也明显,某些地方的链路容易饱和。例如房间内的网线去公网最高就只能500Mbps,但对于我来说不是什么问题。要解决这个问题可以在光猫上拨号然后其它路由做AP,或者类似的方案,需要根据实际情况做取舍。

此时可以接线进行测试了,如果在两台交换机上不同VLAN间不能互相通讯而相同VLAN间可以通讯,那么应该可以开始正常使用了。

如果有任何错误或问题,烦请在评论区指出。不胜感激。

Material Theme UI 更新5.0+后图标包不再有效?

JetBrains全家桶(IntelliJ IDEA、CLion等)开始升级2020.1了,如果你正在使用Material Theme UI插件的话,更新5.0.0+后会发现图标包风格还是原生的样子。并且刚更新后会有小弹窗:

如果去插件介绍页可以看到更新历史中写了:

据此,图标包迁移到了Atom Material Icons – Plugins | JetBrains。可以直接在IDE的插件页中搜索并安装。

JetBrains Quest (March 13, 2020) Write-Up

废话少说,直接上图:

SGF2ZSB5b3Ugc2VlbiB0aGUgcG9zdCBvbiBvdXIgSW5zdGFncmFtIGFjY291bnQ/

看着像是BASE64编码后的

尝试BASE64解码,可以得到:Have you seen the post on our Instagram account?

所以直达https://jb.gg/kotlin_quest。有一段代码,简单阅读后直接改成这样爆破:

fun main() {
    val s = "Zh#kdyh#ehhq#zrunlqj#552:#rq#wkh#ylghr#iru#wkh#iluvw#hslvrgh#ri#wkh#SksVwrup#HDS1#Li#zh#jdyh#|rx#d#foxh/#lw#zrxog#eh#hdv|#dv#sl1"

    for (n in 1..10) {
        for (c in s) {
            print(c - n)
        }
        print('\n')
    }
}

然后第三行是规律的:We have been working 22/7 on the video for the first episode of the PhpStorm EAP. If we gave you a clue, it would be easy as pi.

那么根据提示就很容易搜到What’s Coming in PhpStorm 2020.1 – EAP Series | Season 2020.1 Episode 122/7pi都似乎在提示3.14,确实3分14秒左右画面出现了抖动,于是开到0.25倍:

右下角设置可以调整播放速率

放慢后注意到了,很明显那个homepage的地址变了一下:

homepage那个键值对的值在3分14秒的时候变成了这个

所以访问https://jb.gg/31415926,JetBrains Quest Quiz,是个答题游戏,建议把他家年度报告打开,还有Google。

第一段还好,第二段就不知道他在bb什么了,不过你会发现首字母都大写了,拿出来好像是一句话:.net day call for speakers blog post image hides the next clue。

那么能找到这篇文章JetBrains .NET Day Online 2020 – Call for Speakers – .NET Tools Blog.NET Tools Blog。图片查看源码能看到文件名写了要去下载版本号为201.6303的社区版IDEA,下一步在每日提示里。然后我就不想干了。

可以在IDEA 2020.1 Quest Build Edition – IntelliJ IDEA – Confluence下载并安装。

每日提示可以在主界面的Help->Tip of the Day中触发,打开主界面的时候默认应该也会打开的。看到大家的图是要求斐波那契数列的第50000000项的前4位和后4位。感觉有点奥数题的样子,应该是能找到规律的,另外我感觉递推来爆破应该问题也不大(Google Codelabs,启动!)。

直接搜的话能看到这篇文章The Mathematical Magic of the Fibonacci Numbers,后4位是15000一个周期,前4位似乎没看到?有空再想想吧,先这样了(先糊弄一下)。

JetBrains Quest (March 11, 2020) Write-Up

第二波解谜,可以在https://twitter.com/jetbrains/status/1237694815283879943找到。

原推文

给出了一段字符串:

.spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT

仔细看一下就会发现是倒序

比较明显是倒序的,先尝试复原:

fun main() {
    val string = ".spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT"
    print(string.reversed())
}

会得到:The product domain-specific languages are specified, is where the next of quest hides. The case where Dutch tax is processed, is a place you should show interest. Look hard as when text is white, sometimes it is out of sight. Cmd/Ctrl+A helps.

比较明显:

MPS

来到MPS: The Domain-Specific Language Creator by JetBrains,能发现这里有个:

搜索Dutch tax

打开报告,根据提示,全选来尝试看到白色的文字:

全选即可发现有白色的文字

复制出来可以得到:This is our 20th year as a company, we have shared numbers in our JetBrains Annual report, sharing the section with 18,650 numbers will progress your quest.

所以前往JetBrains 2019 Annual Highlights – Celebrating 20 Years!,找了半天没发现哪里有18650,后面才发现原来是这个加起来刚好是18650:

进去后慢慢翻,有个图片:

有一段火星文?可以慢慢看,也可以看看图片的alt属性:

能勉强看出来是:Did you know JetBrains is always hiring? Check out the kareers(careers) page and see if there is a job for you or a quest challenge to go further at least.

在招聘页面能找到这个Fearless Quester在https://www.jetbrains.com/careers/jobs/fearless-quester-356/,但是忘记截图了,现在已经404了,有点尴尬。

一直觉得自己执行力好差啊…还是要想办法做到今日事今日毕才行…

根据提示后续要到Game Development Tools by JetBrains,用科乐美秘技触发,有一个打砖块游戏,打完砖块就出现了:

CLion嵌入式开发上手

CLion从2019.1开始正式加入了对嵌入式开发的支持,虽然仅仅是整合了之前已经有的OpenOCD和STM32CubeMX的插件,但也有很强的可玩性了。其实大概一年前这个特性刚出来的时候我就试过,因为某些原因不了了之,具体内容可以在我原来博客的存档里面找到。好久没有做嵌入式了,这次因为选修嵌入式课程开始重操旧业。

现在是2020年3月,我正在Windows 10上面使用CLion 2019.3.4,Toolbox检查已是最新版本。还是要说明,这篇文章不是什么教程,仅仅只是我个人尝试的经历,分享出来希望能和大家一起交流,如果有哪里不好烦请不吝赐教。底部有评论区,恳请大家留点经验意见。

表情包来自互联网,侵删。

准备工作

在开始之前,你需要准备一些东西:

一块开发板(废话)。等了几天快递,今天终于刚到手一块NUCLEO-F446RE。用什么板子应该是无所谓的,最多是后面选Board config file的时候没有,要自己写(其实大部分都没几句话,应该问题不大)。

表情包来自互联网,侵删。

有了开发板还要调试器,通常还要给调试器安装驱动程序,由于NUCLEO板载ST-LINK/V2,所以去到STSW-LINK009 – ST-LINK, ST-LINK/V2, ST-LINK/V2-1 USB driver signed for Windows7, Windows8, Windows10 – STMicroelectronics安装驱动程序。

事先安装好CLion(废话)。我推荐先安装JetBrains Toolbox,然后再通过Toolbox安装CLion,使用Toolbox来管理这些IDE会比较方便。当然,要是你真的从头到尾都只使用他家的CLion的话,直接安装CLion也没啥问题。

Toolbox长这样的,方便管理各个工具和最近的项目

Mingw-w64。我是使用MSYS2安装的,不用应该也可以(比如那些预构建包,在MinGW-w64 – for 32 and 64 bit Windows download | SourceForge.net)。

平时偶尔写写C/C++,所以事先基本包已经怼上了

这个环境是用来构建C/C++程序的,这里主要好像只是用到了make(就是那个mingw32-make.exe)。根据文档,你想使用MinGW应该也没有问题。另外,我之前用子系统Ubuntu(官方文档没说可以)的工具链好像构建总是会失败,忘记报错信息了,你可以试试然后来分享一下。

OpenOCD。不是很了解,不敢瞎BB。看到这篇好像不错?跟我一起学OpenOCD(一) – 知乎,有空再看看文档。根据官方文档,如果有MSYS2,那么安装比较简单:

pacman -S mingw-w64-x86_64-openocd

没有好像也没关系,Getting OpenOCD « Open On-Chip Debugger下面有非官方的预构建包可以下载,解压后即可使用。随后都需要在设置中指定其位置(找不到可以两下Shift来Search Everywhere,然后搜你想要的)。

Settings->Build, Execution, Deployment->Embedded Development
测试一下

STM32CubeMX。用来生成代码框架等,官网下载安装即可,如果是默认的安装路径的话CLion中应该能自动检测到。

STM32CubeMX

gcc-arm-none-eabi。最重要的工具,交叉编译用。虽然GitHub – msys2/MINGW-packages: Package scripts for MinGW-w64 targets to build under MSYS2.里面有PKGBUILD:

但是根据How to install mingw-w64-arm-none-eabi-gcc · Issue #4068 · msys2/MINGW-packages · GitHub,需要自行构建,pacman暂时没法直接装上。不过可以直接到ARM的官网上下载预编译好的工具链,链接找不到可以点上面的。CLion此时的文档仍然是写的支持2019-q3或者2018-q2及之前的版本。看了一下,2019-q3是GCC 8,2019-q4是GCC 9,估计是没测试完就没写支持吧,自己斟酌。而且印象中这个时候的CLion对于版本高于8的gdb仍然会给出不支持的警告(虽然还是能用)。

我下载的.zip包,解压到了MSYS2环境里(自己建了个3rd文件夹),放哪里应该都是无所谓的。然后要到设置中手动指定arm-none-eabi-gcc.exearm-none-eabi-g++.exearm-none-eabi-gdb.exe。(这个方法是我突然想到的,感觉应该有更好的?)

Settings->Build, Execution, Deployment->Toolchains

你会注意到,如果这个配置文件在队列里不是第一个的话,并不会显示default,也就是说平时并没有用这个配置。如果你平时在使用多个Toolchain于不同用途,你并不需要一直在这里切换,而是可以在这里为每个Project单独设置:

Settings->Build, Execution, Deployment->CMake

你会注意到上面有个地方可以设置环境变量,因为我没有在PATH中设置编译器位置时,后续建好Project的时候CMake还是会找不到,像这样:

Reload CMake Project

你可以写一个.cmake文件来设置,不过我在这里直接给这个Project设置环境变量(这样不会影响系统的):

Settings->Build, Execution, Deployment->CMake->Environment

此时应该就没有问题了:

开工吧!

准备了这么多东西,现在该来尝试一下了。你需要先打开CLion,然后新建一个Project,就像这样:

New Project

项目名字自己起一个,尽量别untitled一路下来(我真的见过一堆项目untitled一直到untitled200的)。

点击打开STM32CubeMX来配置

默认上来的型号通常不是你想要的,点击Open with STM32CubeMX来启动STM32CubeMX。你可以在这里点击型号来改变:

点按STM32F030F4Px
搜索你的开发板或是MCU等

这是文档里这么干的,感觉有点奇怪。这并不能直接改型号,而是新建了一个Project,我感觉还不如直接新建好,然后再用CLion打开呢…因为这是新建的,所以你需要到这里来设置好名称和工具链。你需要保证生成的代码的位置和刚刚你在CLion中新建的Project一样,不然就白折腾了半天。就像下面这样:

Project Manager

此时点按GENERATE CODE来生成代码,会提示是否覆盖CLion自动生成的那份.ioc文件。覆盖吧,反正没啥用。总之我感觉这么干有点多此一举。

生成正常的话,现在就可以回到CLion中了。此时右下角应该会有气泡窗口显示已经自动检测到了:

这次弹窗要我选择Board config file,由于这里有现成的,就直接用了:(没有的话,应该在OpenOCD目录下的scripts里面可以依葫芦画瓢一下)

Board Config File

由于我之前设置环境变量是单独为Project设置的,所以每次新建都需要设置,不然就会:

Reload CMake Project

同样地,像上面那样设置好环境变量就OK了。回来再点击一下上一个图里左上角这个Reload CMake Project图标,应该就没有问题了。

注意到右上角,要执行任务的配置还是没设置好,此时还不能Run:

右上角,Edit Configurations

很简单,点按Edit Configurations…来修复错误。注意到窗口下方的错误信息是:

Edit Configurations下方有错误信息

那么只要指定Target就好了:

指定Target

此时Run和Debug的图标应该就不是灰色的了。插上开发板,点按Run(此时的配置应该是那份OCD的而不是CMake的),顺利的话应该很快就会:

此时应该已经烧录成功了,你也可以尝试着写点小程序来测试一下。

只能Run还不够,Debug也很重要。打上断点,点按Debug图标来启动,应该没有问题的:

下方的Debug窗口应该会显示变量、堆栈等信息。不知道你会不会在Debug窗口的第一栏看到这个很好使的小工具:

划重点,点按后即可在当前现场执行你想要的语句,有点像脚本语言一样?总之很好使就对了。

如果你想查看引脚信息,需要导入.svd文件,根据SVD files on ARM website – Keil forum – Software Tools – Arm Community,你可以在MDK5 Software Packs里先下载pack,然后从里面拿到。

如果你之前就在使用Keil做嵌入式开发,那么你应该已经有了这个pack,直接去找就好了。导入后就可以正常查看了。

应该暂时就这么多吧。想到啥再补充。

引用:(文中已做超链接的就不再列出了)
CLion 2019.1 EAP: CLion for Embedded Development, Part III | CLion Blog
STM32CubeMX Projects – Help | CLion
CLion for embedded development | CLion Blog
CLion for Embedded Development Part II | CLion Blog
MSYS2 installation · msys2/msys2 Wiki · GitHub
How to cross compile with cmake + arm-none-eabi on windows? – Stack Overflow
[柴工带你学习LiteOS系列]之—Windows下的GCC环境搭建_云博客_云社区-华为云
使用CLion做嵌入式开发 | 王晓磊贴代码用的Blog

JetBrains Quest (March 9, 2020) Write-Up

这篇文章是事先写好的,等到解谜到期后(“You have until the 15th of March at 12:00 CET to finish all the quests.”,也就是北京时间当日19:00)才放出的。总之我觉得,在结束前就到处发题解,大概就只能是破坏解谜气氛和便宜了黑产吧。

48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f

比较明显的十六进制的特征

看着很像是16进制表示的内容,尝试着转为ASCII字符。改行写Kotlin了,以后看到脚本长得跟你平时看见的不一样不要觉得奇怪…

import java.util.*

fun main() {
    val string = "48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f"
    val scanner = Scanner(string)
    while (scanner.hasNextInt(16)) {
        print(scanner.nextInt(16).toChar())
    }
}
输出的结果

得到输出:Have you seen the source code of the JetBrains website?

应该是一个提示。去看看官网的源码。访问JetBrains: Developer Tools for Professionals and Teams,然后Ctrl+U查看源代码(或者直接在网址前面打上view-source:)。比较长,于是尝试Ctrl+F搜索quest,发现了一段注释:

官网源代码中的注释,给出了hint

画个重点:

JetBrains has a lot of products, but there is one that looks like a joke on our Products page, you should start there… (hint: use Chrome Incognito mode)

产品页中有一个看起来像是个玩笑?提示用Chrome的无痕浏览。

其实还有一个更重要的重点:

It’s dangerous to go alone take this key: Good luck! == Jrrg#oxfn$

有一个奇怪的key。

先跳转产品页,也就是All Developer Tools and Products by JetBrains。3月12日的时候,直接访问相比Chrome的无痕浏览模式访问,会多出一个:

哈哈哈哈哈…很难笑欸
复制一个玩,当纪念吧。

点开康康:

仍然是hint

要求计算500到5000范围内的质数的数量。这个时候可能很多人会默默开始写脚本了,然而我选择WolframAlpha:

直接得到有574个质数

所以应该访问https://jb.gg/574。有一说一,这个域名挺难听的…被跳转到了https://www.jetbrains.com/help/pycharm/getting-help.html#quest

PyCharm的文档页

有用过YouTrack,或者是曾经发现JetBrains家的IDE有问题的人应该会知道这个编号的含义的。不知道的话,看上面的图标应该也能猜到要去看看这个产品是啥。到YouTrack的官网搜这个事件编号就可以了,甚至粗暴地Google一下也可以。所以就是访问JetBrains Quest : MPS-31816

有一串密文

考虑到之前给出的hint:Good luck! == Jrrg#oxfn$。能发现两个o都对应了r,应该只是进行了替换而已。好了,开工:

fun main() {
    val string = "Qlfh\$#Li#|rx#duh#uhdglqj#wklv#|rx#pxvw#kdyh#zrunhg#rxw#krz#wr#ghfu|sw#lw1#Wklv#lv#rxu#lvvxh#wudfnhu#ghvljqhg#iru#djloh#whdpv1#Lw#lv#iuhh#iru#xs#wr#6#xvhuv#lq#Forxg#dqg#iru#43#xvhuv#lq#Vwdqgdorqh/#vr#li#|rx#zdqw#wr#jlyh#lw#d#jr#lq#|rxu#whdp#wkhq#zh#wrwdoo|#uhfrpphqg#lw1#|rx#kdyh#ilqlvkhg#wkh#iluvw#Txhvw/#qrz#lw“v#wlph#wr#uhghhp#|rxu#iluvw#sul}h1#Wkh#frgh#iru#wkh#iluvw#txhvw#lv#‟WkhGulyhWrGhyhors†1#Jr#wr#wkh#Txhvw#Sdjh#dqg#xvh#wkh#frgh#wr#fodlp#|rxu#sul}h1#kwwsv=22zzz1mhweudlqv1frp2surpr2txhvw2"
    val stringBuilder = StringBuilder()
    string.forEach {
        stringBuilder.append(when (it) {
            'J' -> 'G'
            'r' -> 'o'
            'g' -> 'd'
            '#' -> ' '
            'o' -> 'l'
            'x' -> 'u'
            'f' -> 'c'
            'n' -> 'k'
            '$' -> '!'
            else -> it
        })
    }
    print(stringBuilder.toString())
}

得到的输出是这样的:

仍然是乱码

继续观察一下,结合ASCII表就发现,密文只是相对于明文右移了3位而已。那么可以尝试还原了:

fun main() {
    val string = "Qlfh\$#Li#|rx#duh#uhdglqj#wklv#|rx#pxvw#kdyh#zrunhg#rxw#krz#wr#ghfu|sw#lw1#Wklv#lv#rxu#lvvxh#wudfnhu#ghvljqhg#iru#djloh#whdpv1#Lw#lv#iuhh#iru#xs#wr#6#xvhuv#lq#Forxg#dqg#iru#43#xvhuv#lq#Vwdqgdorqh/#vr#li#|rx#zdqw#wr#jlyh#lw#d#jr#lq#|rxu#whdp#wkhq#zh#wrwdoo|#uhfrpphqg#lw1#|rx#kdyh#ilqlvkhg#wkh#iluvw#Txhvw/#qrz#lw“v#wlph#wr#uhghhp#|rxu#iluvw#sul}h1#Wkh#frgh#iru#wkh#iluvw#txhvw#lv#‟WkhGulyhWrGhyhors†1#Jr#wr#wkh#Txhvw#Sdjh#dqg#xvh#wkh#frgh#wr#fodlp#|rxu#sul}h1#kwwsv=22zzz1mhweudlqv1frp2surpr2txhvw2"
    val stringBuilder = StringBuilder()
    string.forEach {
        stringBuilder.append(it - 3)
    }
    print(stringBuilder.toString())
}

这下直接得到结果了:Nice! If you are reading this you must have worked out how to decrypt it. This is our issue tracker designed for agile teams. It is free for up to 3 users in Cloud and for 10 users in Standalone, so if you want to give it a go in your team then we totally recommend it. you have finished the first Quest, now it’s time to redeem your first prize. The code for the first quest is “TheDriveToDevelop”. Go to the Quest Page and use the code to claim your prize. https://www.jetbrains.com/promo/quest/

也就是前往上面这个链接兑奖就可以了。

片刻即可收到邮件:

三个月全家桶,算是个小惊喜吧。

Windows 10下使用Windows+Shift+S截图

好消息,好消息!如果你正在使用较新的Windows 10,那么截图只要:Windows徽标键+Shift+S即可触发截图和草图应用来抓取矩形截图、任意形状截图、窗口截图或是全屏幕截图Windows徽标键+PrtSc即可触发截图和草图应用直接抓取全屏幕截图不用再为了截图打开微信或QQ啦。

截图和草图应用

如果你觉得这个快捷键比较难按,你可以在设置->轻松使用->键盘中修改:

修改热键为PrtScn

什么?你说我火星了?好像不是我,是我的朋友们…(无中生友ing)

好,来说说这个功能。根据此文章Why doesn’t the screen clipping tool work anymore? – OneNote所述,该热键本是OneNote用户用于截图的,自Windows 10创意者更新(也就是1703)后,由截图与草图应用接管。相关文章还包括:What’s New in Windows 10’s Creators UpdateHow to take and annotate screenshots on Windows 10

还要注意的是,根据Snip & Sketch…. : Windows10 – Reddit。截取屏幕后,你通常直接从剪贴板中取得图片,但是在:%LOCALAPPDATA%\Packages\Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy\TempState\ScreenClip路径下仍然保存有图片的副本(也就是C:\Users\%USERNAME%\AppData\Local\Packages\Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy\TempState\ScreenClip)。可能有隐私泄露风险,请务必注意。

Chrome 离线安装

推荐同学用Google Chrome作为日常的浏览器,但是他表示很难下载成功。为了省事,我决定直接弄个离线安装包给他。

直接搜索chrome offline installer,找到了官方文档:下載及安裝 Google Chrome – 電腦 – Google Chrome說明。文中说明了在离线状态下安装Chrome,需要在联网的主机上下载备用Chrome安装程序,就是我想要的离线安装包了。

只要打开上述链接再点击下载Chrome就可以得到离线安装包了。

仔细看了一下那个链接,其实本质上只是在Chrome的官方网址https://www.google.com/chrome/后面加上?standalone=1而已。即:https://www.google.com/chrome/?standalone=1

访问试一下,没有问题,有图有真相:

IDM抓取到的,看文件名和大小应该没有问题。

类似问题:Google Chrome 离线安装包的官方下载地址是什么? – 知乎

Foobar2000 简单上手

Foobar2000是一个强大的音乐播放器。好久没有拿出来用了,今天简单记录一下。

官网:foobar2000

Monkey’s Audio files (.APE)

下载安装就不用说了。印象中默认是不能直接播放ape格式的文件的,需要安装解码器(decoder)。可以在官网找到:foobar2000: Components Repository – Monkey’s Audio Decoder。正常情况下下载后直接双击这个插件就可以安装了。

双击后应该会弹出插件列表

双击后应该会弹出插件列表,点击Apply即可。

如果没有弹出插件列表,可能是插件的文件格式没有被关联上,这个时候只需要到插件列表里手动安装即可:

进入设置,设置里的第一个(Components)就是了
点击Install,并找到你刚下载好的插件就可以了

安装会要求重启Foobar2000,重启后就可以播放ape格式的文件了。

Free Encoder Pack

想要转换格式的时候发现,如果想要转换成flac等格式的文件,会发现缺少编码器,要求你提供flac.exe的位置。

同样地,要解决这个问题,可以在官网上找到一个整合了很多编码器的包:foobar2000: Free Encoder Pack,描述称:这个包内含多个用于转换的编码器文件。下载安装即可。

安装后再执行转换就不会要求你选择编码器了。

音乐库扫描内含*.cue的文件

默认音乐库只扫描个人文件夹下的音乐文件夹,可以在设置中自行设置。打开设置(Preferences,偏好项),点击媒体库(Media Library)即可自行修改目录。

Preferences->Media Library

注意到了Exclude项,它默认排除识别*.cue文件,这通常不是我们想要的,因为这样会使得那些完全依赖cue文件进行分轨的整轨音乐无法被识别为多个音乐文件。在某些时候可以考虑删除它,此时应该能正常识别了。

此外,Shell Integration中也默认排除*.cue文件,自行根据需要调整吧。

要指出的是,某些安全软件会阻止你修改这些选项,有点迷…

大概就先这样吧,想到什么再补。

安卓 通过adb将TF(SD)卡用作内置存储

手上有个360 N6,平时当备用机,存点音乐视频什么的,存储空间不太够,于是乎买了张TF卡插上。(其实应该去看看紫光的超级SIM卡能不能用的,深圳联通公众号上也发可以参加预存话费赠卡的活动了)

我的第一部智能手机买的是黑莓Priv,插卡之后会提示格式化成外置的便携式存储(可以拔出来在不同设备,比如电脑上交换数据)还是内置存储(不能用在其它机器上),并且使用非常正常。

好了问题来了,N6插卡之后只能格式化成外置存储(?),这就很蛋疼,插卡的意义似乎就不大。后面发现其实可以用adb开启,虽然好像还是有点问题。

But how?

可以用sm来做到。

首先连续多次点按设置->系统->关于手机->版本号,打开开发者选项,然后在开发者选项打开USB调试。此时可以把手机连接到电脑上了。

我正在使用Android Studio,安装过Android SDK,可以直接在C:\Users\domain\AppData\Local\Android\Sdk\platform-tools中找到adb工具。没有也没关系,从SDK平台工具版本说明 | Android 开发者 | Android Developers可以下载到独立的工具包。

已经有了platform-tools之后,进入该目录,按住Shift再点击鼠标右键可以在该目录打开PowerShell。此时运行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
1f95707d        unauthorized

显示未授权,此时手机上应该会弹窗是否允许电脑进行调试(以及一个密钥),允许后再次执行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
1f95707d        device

此时可以:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe shell
QK1707:/ $

有了手机的Shell了,尝试sm工具查看存储:

QK1707:/ $ sm list-disks
disk:179,64

如果手机允许:

QK1707:/ $ sm has-adoptable
true

反之则可能需要尝试sm set-force-adoptable true。接下来 就可以:

QK1707:/ $ sm partition disk:179,64 private

来将存储卡格式化为内置存储。如果执行:

QK1707:/ $ sm partition disk:179,64 mixed 30

可以将部分空间格式化为内置存储,另一部分(30%)作为便携式存储。

此时可以在设置中看到存储卡已经被设置为内置存储了。发现容量显示有问题,而且迁移也有点问题。网友分享格机后,安装应用不要打开马上迁移就没有问题。决定这几天格机再试一下。

引用:
android – How to turn a portable SD card into internal storage via ADB command? – Stack Overflow
透過ADB方式開啟與配置Adoptable Storage空間(免root) @ 老梁’s blog :: 隨意窩 Xuite日誌
360N7Lite免root安装应用到内存卡的方法及其它玩机教程-更新自动安装到内存卡_360社区