我老了

去年春天,右腿膝盖突然还是疼。虽然觉得是旧伤复发,但是以前疼两天就好了,然而这次断断续续疼了半年多。时至今日,我都不敢进行太剧烈的运动。

福无双至,祸不单行,上周末开始,突然没有征兆的疼了起来。虽然修养了一周,疼痛有些缓解了。但是还是不得不开始想想自己真的变老了。人到30,身体真的是不行了?

我曾经告诉自己,永远不服老,即使身体老了,还是得保持一颗年轻的心,所以我也一直在给自己塑造一种闷骚搞笑的形象。目的,当然是不希望身边的朋友觉得我是一个年轻人。

直到最近,我在和朋友讨论播客(https://tlxxfm.com)的内容时,我发现,我可能真的老了。大家都说,初生牛犊不怕虎,反而我现在是越来越不敢说话,或者在公共场合发表自己的观点。即使是播客的内容,我也更倾向于陈述事实,给观众更多思考的余地,但很少发表评论,生怕会扛精来说些不知所谓的话。

我还翻了一下自己的博客,年轻的自己是真的敢说,甚至敢说到自己的博客直接被墙了。反观现在,我已经很少在博客里发表这样的观点了,反而是技术类的文章越来越多。毕竟,技术是中立的。

要说自己为什么变得不敢说了,可能还得是因为大学的时候。在那个时候,我也是意气风发,总觉得自己可以通过自己的声音改变世界,所以在校内等平台,疯狂的输出自己的观点。后来有个朋友因为不能理解我的观点,于是和我吵了起来。我还在莫名其妙的时候,他就把我好友删掉了。从那以后,我们就再也没联系过了。大概已经过了10年了吧。

虽说,10年没联系的朋友有很多,但是这个人让我印象很深刻,因为他让我知道,我身边的很多朋友,并不能接受和而不同这个观点。我总觉得,我不认同你的想法,但我应该尊重你的想法。可是总有些人遇到不认同的想法时,第一反应是让你闭嘴。如果你是一个陌生人,我可能真的不介意你不理我了,但如果你是我认识的人,我还真的觉得挺惋惜的。

人们都说,随着阅历越来越多,人也会越来越成熟。随着见过听过的越来越多,人也会变得越来越不敢表达。如果成熟是变老的一个标志的话,我觉得我可能真的变老了。有机会还是应该把这个博客利用起来,即使不在公开的大型平台上发表自己的观点,但是我在我自己的独立域名博客上随便说说,总没有什么问题吧?

为Chrome插件加载Javascript

上一次(其实就是昨天),为了防止中华职棒官方的录播页面剧透比分,所以我写了个简单的Chrome插件,用来屏蔽比分。也写出了第一个版本。

虽然星期一是休赛日,甚至连比赛都没有,但是我还是觉得,如果把所有比赛分数都隐藏了,那如果我有时候还是想看到比分,这可怎么办啊。在过去的一天,我试过了一些方法,通过菜单来实现显示和隐藏所有比分,但是那个菜单做的很丑,而且,把所有比分都显示出来,还是有剧透的风险,所以,我决定要给每一场比赛加一个开关,用来显示当场比赛的分数。

肉壳是个前段小白,真的试了好久,才解决这个简单的问题。

首先,这个网站还在用table来制作表格,而且,也没有为比分栏设定id。如果每个比分栏没有固定id的话,就无法定位到这个比分,进而无法控制这个比分的显示或隐藏。所以,第一个要解决的问题是,为每一个比分添加一个id。我们使用JavaScript来解决这个问题。

var scores = document.getElementsByClassName("score");
for (var i = 0; i < scores.length; i++) {
    var score = scores.item(i);
    score.id = "score_" + i;
}

我们通过class找到每一个score,然后给他加一个id。

其次,我们需要给表格增加一列,用来显示开关,我们把开关放在表格最后面。

var tbl = document.getElementsByClassName('vod_table'), // table reference
tbl = tbl.item(0);

for (var i = 0; i < tbl.rows.length; i++) {
    var row = tbl.rows[i];
    if (i == 0) {
        var th = document.createElement('th');
        th.innerText = "显示/隐藏分数";
        row.appendChild(th);
    } else {
        createCell(tbl.rows[i].insertCell(tbl.rows[i].cells.length), i-1, 'stadium');
    }
}

然后,我们要为每一个开关,写一个function,用来把开关和分数栏对应起来。这样,在点击开关的时候,就会显示或隐藏相应的比赛分数了。

function createCell(cell, id, style) {
    cell.setAttribute('class', style);
    cell.innerHTML = "<label class=\"switch\"><input id=\"switch_" + id + "\" type=\"checkbox\"><span class=\"slider round\"></span></label>";
    var toggle = document.getElementById("switch_" + id);
    toggle.onclick = function(){toggleSwitch(id)};
}

function toggleSwitch(id) {
    var score = document.getElementById("score_" + id);
    if (document.getElementById("switch_" + id).checked) {
        score.setAttribute("style", "visibility: visible;");
    } else {
        score.setAttribute("style", "visibility: hidden;");
    }
}

这这里,开关我们用了一个checkbox,我还找来了一个css,以便让它看起来更美观。大家有兴趣可以去看看我的css文件

当然,我们要把之前写的js代码,都存放在一个文件中。最终代码的样子在这里

因为css,我们还是写在了旧的文件中,那我们刚刚写的js文件要怎么办?如何让自己的插件可以加载JavaScript?其实很简单,只要打开manifest.json,在content_scripts中加入一行"js": ["assign_ids.js"],用来加载我们刚刚创建的assign_ids.js文件就可以了。最终文件长这个样子

值得注意的一点是,在js中,在建立开关的时候,我用了一种类似hardcode的方式添加的onclick事件。这是因为Chrome插件在使用content_scripts加载js的时候,并不会一只保留js文件,所以如果只是简单的调用某个function,浏览器会找不到这个function。所以只能退而求其次的hardcode。不过我看大家好像都是这么做的,也无所谓了。

其实本来还想用这个js来替换掉比分,而不是简单的隐藏。但是发现,js会在网页加载之后才会被调用,于是有那么一个瞬间,比分是会被显示出来的。

所以这个插件的整体流程就是,默认先通过css将所有分数隐藏,等网页加载后,为每个分数添加id,并为每一行添加开关。等用户点击相应的开关时,根据开关的状态,显示或隐藏对应的比分。

未来,我会再加一个开关,用来一键显示所有比分。而且,还会为插件添加一个开关,以便用户可以关掉屏蔽比分的功能,而不需要通过后台停用整个插件。

肉壳已经为大家打包好了这个插件,大家可以直接去Github下载。

https://github.com/Rokeer/CPBLTV-Spoiler-Alert/releases

最终的网站效果如下图……终于又能看到比分咯……

看到右边的开关没?

未来,我还会继续学习开发这个插件,这两天研究一下,如何把它丢去商店里,方便大家下载……

另外,如果没有什么太大问题,我就不每次更新都为大家更新文章了。请大家关注我的Github

4月14日更新:

花了一晚上的时间把这个插件完善了一下,增加了一些功能,并发布在了Chrome Web Store中……大家可以搜索CPBLTV Spoiler Alert或访问这个链接下载使用……

v1.0.0
04/14/2020
正式版上线,并发布于Chrome扩展平台
添加开关用于显示、隐藏所有比赛分数
为插件添加菜单
用户无需停用扩展,即可在菜单中关闭此功能
为扩展添加图标
为踏浪寻星广播电台做广告
添加英文,简体中文,和繁体中文支持

用Chrome插件隐藏网页信息

上回我们说到,由于疫情的原因MLB停摆了,所以现在没有MLB可以看了。好在台湾的中华职棒决定今年在没有观众(实际上是只允许季票观众入场)的情况下开赛。于是,时隔多年,肉壳再一次购买了CPBLTV,这样就可以继续看棒球比赛了。价格也比15年刚开始收费的时候便宜了一点。不过,在15年的时候,我还在国内,所以可以在每天晚上看比赛直播。但是,现在由于时差的关系,我只能看比赛录播了。想想也没有什么大问题,因为周围的朋友都很少有人在讨论中华职棒的比赛,所以也不怕剧透。这里不得不吐槽一下CPBLTV的画质,直播只有540p,录播也只有720p。没想到,都2020年了,即使在官网看比赛,画质也就是和10年前看的网络电视的画质一样……

刚才我们说到,不怕朋友剧透。但是官方剧透更可怕……随着赛季开始,肉壳打算开始收看录播比赛。但是惊人的一幕发生了,官网上赛事录播的页面上,把所有的比赛结果都列了出来……所以肉壳就被赤裸裸的剧透了。

官方剧透最可怕……

本着自己动手丰衣足食的原则,肉壳写了一个非常简单的Google Chrome的插件,用来屏蔽掉页面上的比赛分数。肉壳对前端方面没有太多了解,所以仅仅是把所有分数隐藏了起来,并没有其他特别花哨的功能。如果有需要的话,以后再说。所以今天,就来给大家讲一讲,如何写一个可以修改网页内容的Chrome插件。

首先,我们要建立一个文件,名为manifest.json。大家可以阅读Google的官方文档来进一步了解这个文件,我在这里只写出了我需要的地方。

{
  "manifest_version": 2,
 
  "name": "CPBLTV Spoiler Alert",
  "version": "0.0.1",
  "description": "Hide game results in CPBLTV website.",
 
  "content_scripts": [{
    "css": ["styles.css"],
    "matches": ["https://www.cpbltv.com/lists.php*"]
  }]
 
}

其中name,version和description是插件的名字,版本号和描述。可以自己随便定。下面content_scripts定义了插件要加载的css文件,这里我们给这个文件起名为styles.css。matches里定义了插件起作用的网页。

然后,新建我们要加载的css文件styles.css。网页中的数据,是通过一个table来显示的,好在他们对score这一栏定义了一个名为score的css element。不得不吐槽啊,都2020年了,还在用table来显示内容,而不是用div,我以为只有我这种前端小白才会用table呢……所以,很简单,我们只需要将score的元素全都隐藏起来就好了。下面是styles.css文件的内容。

.vod_table .score{
	visibility: hidden;
}

至此,这个简单的插件就写好了。至于安装调试,首先将刚才写的两个文件放在同一个文件夹下,再将文件夹拖入Chrome的插件页面,chrome://extensions/,就安装完成了。

终于不怕官方剧透了……

这样我就对比分一无所知了……哈哈哈!

另外,我将代码放在了Github上,并且会持续更新,有兴趣的朋友可以下载来用……

https://github.com/Rokeer/CPBLTV-Spoiler-Alert

2020年的几大遗憾事件

这是一篇被分在记日本分类下的文章,这个分类主要用于记录自己的生活,看了一下,上一次在记日本分类下的文章居然已经是2012年年底发布的iPad mini的开箱文。看来我这些年真的都忘记记录自己的生活了,也可能是因为年龄大了吧……

最近新冠肺炎在全球肆虐,截止2020年4月8日下午6点,全美报告的确诊人数已经达到了43万人。肉壳也已经整整在家隔离了一个月。这一个月里,几乎从来不出门,买菜都靠外卖。不过,体重竟然没有增加,也是神奇……

不过也是由于疫情,本来自己的很多计划都被打乱了,有好也有坏。而且,由于肉壳正在为了毕业而努力,所以今年很可能是自己在匹兹堡呆的最后一年。今天就来稍微记录一下,由于疫情,为肉壳带来的遗憾事情吧,也是给自己一个留念。大体就按时间顺序列出,未来可能还会继续增加。

第零件事可能还不算遗憾,因为学校封了,所以本来计划在3月27号的开题报告被迫改成了线上。虽然顺利通过了,但也给我的整个PhD生涯带了一些和别人不一样的体验。不过由于不需要为导师们准备吃喝,所以省下了不少钱,而且因为可以念稿子了,还没导师表扬了一番……

第一件事是关于春假的,从16年开始,肉壳每年春假都会去一波纽约,找雷妈妈打打球,找戴小铲吃吃饭,找郝同学喝喝酒。今年本来还打算去纽约,保持一下自己的记录,但是因为纽约是最早出现确诊的几个地方之一,所以这个计划很早就被自我阉割了。这样之前的记录就被终结了,你说遗憾不遗憾。

第二件事就是和MLB相关了,由于MLB停赛了,今年没有比赛看了。肉壳是洛杉矶道奇队的球迷,从15年来到美国,就一直在关注道奇对客场打海盗的比赛。但是由于每年比赛场次少,而且肉壳每年赛季期间,大部分时间都不在匹兹堡,算下来,只有17年和今年的夏天,肉壳会呆在匹兹堡。在之前几年,肉壳都没能赶上道奇在匹兹堡的比赛,可以说是非常遗憾了。终于,道奇今年要在4月底来匹兹堡比赛,肉壳在1月的时候,就购买4月25号的门票,连看比赛时要穿的衣服都想好了。可惜由于赛季被无限期推迟,今年能不能比赛都是个变数,即使能打,还不知道赛程会变成什么样,到时候我能不能有机会看到道奇的比赛,都是未知数。虽说以后去加州,看道奇的机会肯定很多,实际上,前两年去加州实习的时候,每次都会看道奇的比赛。但是,如果能在匹兹堡看道奇的比赛,肯定是种更好的体验。毕竟海盗是我的第二主队。但现在别说比赛有没有的看了,连买的票能不能退,怎么退都不知道,你说遗憾不遗憾。

第三件事是关于萝卜的,从16年开始,萝卜每年都会来美国开展会,16,17,18年分别去了匹兹堡,纳什维尔和费城,肉壳也都跟着去了。非常怀念16年顾总和萝卜都穿的黑色黄色的衣服,被路人认为是匹兹堡本地人(因为匹兹堡的代表色就是黑和黄)。17年在纳什维尔跟大饼和萝卜买小龙虾吃,还吃了两顿。至今我还会经常在那个网站买小龙虾。另外值得一提的是,那年买了Neil Sadaka的演唱会票,打算和萝卜一起去看的,结果演出被取消了。18年的时候在费城,正好Paul Anka当时在费城附近开演唱会,结果演出又取消了。19年的时候在匹兹堡,但是因为肉壳着急去实习,所以没能陪萝卜开会。20年在克利夫兰,因为可能是肉壳最后一次有机会陪萝卜开会,所以很早就开始策划这个事儿了,结果,萝卜来不了了,你说遗憾不遗憾。

第四件事是因为一件好事引起的,那就是肉壳去年投去EMNLP没有中的paper,中了今年的ACL。这可是我们领域的顶级会议啊,虽然肉壳以前参加过ACL,但是paper是发表在workshop的。这次终于中了主会,本来还期待7月去西雅图玩一圈。结果,今年的ACL也改成纯线上了。所以,可能我唯一一次在顶会上给家讲解我的paper的机会也没有了。最终,这个会的形式可能就是提前录一段视频,然后播给大家看一看就好了。没机会吃吃喝喝了……细数这几年去开会,都玩的非常开心。细想下来,才发现,我每年都有机会去开个会,也是挺爽的。17年去温哥华开ACL,是第一次去开会,在一个华人多的地方,好处就是吃的非常开心。而且萝卜之前在温哥华念书,所以推荐了很多好吃的餐厅。18年是新奥尔良的NAACL,这可是肉壳梦寐以求的地方,爵士乐+小龙虾+酒,我差点就不想回来了。本来还打算3月春假的时候,再去次新奥尔良的,因为太喜欢了,但是也没去了,这也算是一个小遗憾吧。19年和yangbing去夏威夷开AAAI,两个酒鬼一礼拜干掉了两瓶烈酒,每天晚上就是喝酒吃肉。如今去西雅图的机会没有了,你说遗憾不遗憾。

目前就只有这么多,至于什么健身房的会员费因为不敢去现场退费,所以一直这么白交钱之类的事情,就不在这里细说了。以后有什么事,我再来更新,等年底的时候,不行录一期节目,也不失为一种水节目的方法吧……

7月14日更新:

突然又想起来一件事,如果运气好的话,今年就可以逃离匹兹堡这个寒冷的地方了,本来之前计划在离开之前,要去看一场匹兹堡钢人的比赛。因为企鹅和海盗的比赛都看过了,美国三大体育联盟里,就差橄榄球还没有看过了。之前一直觉得橄榄球票价太贵了,所以一直没有太有兴趣去看,只看过NCAA的比赛。今年终于下定决心放血去看一场NFL的比赛,结果去不了了,你说遗憾不遗憾。

如何给使用SX OS的Switch系统升级

因为从2020年12月开始,SX OS就再也没有更新了,肉壳已经从SX OS转到大气层Atmosphere系统了,转换流程请参考这篇文章

此文章仅适用于SX OS的系统升级,如果你在使用Atmosphere,请参考这篇文章来升级你的系统。

———- 分割线 ———-

2020年11月20日更新,新的塞尔达无双已经出了,所以需要安装新的系统才能玩。自从上次升级了9.2.0,后面陆陆续续出了好多个系统版本升级,分别是10.0.0,10.0.1,10.0.2,10.0.3,10.0.4,10.1.0,以及10.2.0。SX OS的版本最新的也已经是3.0.5 beta了。大家记得下载对应的更新版。我在自己升级的时候,是一个版本一个版本升级上去的。但是据我观察,实际上每个系统的安装包大小差不多,安装过程貌似也是增量安装。所以有可能可以一次性从9.2.0升级到10.2.0。我胆子小没有尝试,不过我的勇士朋友董女士打算以身试法,回头给大家更新结果……

2020年11月21日更新,感谢勇敢的董女士以身试法。系统升级确实可以跳级直升……所以无论你的系统版本现在是多少,都可以直接升级到你想要的版本。

2021年6月27日更新,此教程仅仅是本人操作的记录,本人的NS是最初没有patch的switch,并且只使用过emunand启动CFW过,原则上没有污染过正版系统(OFW)。如果你的机器和我的不一样,可能你需要进行一些额外操作。另外,破解有风险,请提前备份自己的机器。如果在操作中出现问题,本人概不负责……

———- 分割线 ———-

今年过年前,把自己的Switch破解了,安装了SX OS。简单地说,这个SX OS就是个双系统,这样你的Switch既可以进入正版系统,和别人联机,也可以进入盗版系统玩盗版游戏。声明!不是不报,时候未到,破解机器带来的风险还是有的!如果你的机器还没有破解,我建议你继续玩正版游戏!如果你想破解的机器,需要知道,即使是这样的双系统,也可能导致未来被Ban,只是目前来说,理论上不会被Ban而已。不过今天,我们不谈如何破解机器,有兴趣的朋友,可以去网上搜搜其他资料。

最近,动物森友会发售了,肉壳也很想玩一玩,于是下载了下来,发现,必须要安装最新的NS系统才可以。所以,必须要升级系统才可以玩,虽然所有系统都可以通过各种手段在线升级,但是肉壳还是比较小心谨慎地,所以打算继续用离线的方式升级。再声明一下,本片文章的内容,是教大家如何把NS的系统从9.1.0升级到9.2.0,以及SX OS 2.9.3升级到2.9.4,并未测试在其他版本上,如果未来我还会升级系统,我会继续在文章底部更新版本。如果你的系统和我的系统版本不一样,请自行斟酌是否要跟随本教程操作。

首先,我们需要去Darthsternie下载NS最新的9.2.0固件。

然后,我们需要一个Homebrew插件ChoiDujourNX,目前看到的最新版是1.0.2,与2019年4月更新。

此时,我们已经有两个文件了,一个是Firmware 9.2.0.zip,一个是ChoiDujourNXv102.zip。

将Firmware 9.2.0.zip解压到一个文件夹,我们就叫它Firmware 9.2.0。将这个文件夹拷贝到Switch的SD卡的根目录下。

将ChoiDujourNXv102.zip解压到另一个地方,里面会包含一个ChoiDujourNX.nro文件。将这个文件拷贝到Switch的SD卡的switch目录下。如果没有switch文件夹,就新建一个即可。

将SD卡放回Switch,进入SX OS。进入相册,此时,应该可以看到SX OS的菜单。如果没看到,说明你进错系统了……

进入到HOMEBREW菜单,可以看到ChoiDujourNX程序,点击进入。

进入后,选择进入Firmware 9.2.0文件夹。

按屏幕右下角的Choose。

等待程序检测完毕,按9.2.0 (exFAT)。这里假设大家的SD卡都是exFAT格式化的。毕竟,很多大于4G的游戏,在FAT32格式的SD卡里是存储不了的。

等到程序检测完毕,选择屏幕下方的Select firmware。

在下一个界面,我们可以看到,有个选项叫做Prevent fuse burning (enable AutoRCM)。默认是选择的,大家可以继续选这个。具体的解释这个功能是什么,我放在文章结尾了。这时候,大家只要点选Start installation就可以了。

等安装完成,选择右下角的Reboot,重启机器。

这个界面,我们选择Shutdown now! 因为我们还要更新SX OS。

关机后,就可以取出SD卡,接回电脑上了。

当然,我们还需要去Team Xecuter SX下载最新的固件,最新的版本是2.9.4 beta。

下载后的文件名叫SXOS_beta_v2.9.4.zip,解压里面的文件,得到boot.dat文件。将这个文件复制到SD卡的根目录。准确的说,是要覆盖原有的boot.dat。

此时,可以把刚才的Firmware 9.2.0文件夹删掉以节省SD卡空间。

将SD卡放回Switch。如果你刚才选择了AutoRCM。那么现在就不需要手动进入恢复模式了。只要把XS OS的loader插在机器的电源接口,按电源键,就可以直接进入系统了。

进入系统,我们就可以发现,破解系统的版本已经是9.2.0,而SX OS的版本也升级到了2.9.4了。

———- 分割线 ———-

下面给大家稍微解释一下,什么是AutoRCM。简单地说,在没有启动AutoRCM的时候,你每次想进入子系统,就需要把短接器和loader都接在机器上,然后按住音量键和电源键开机,再选择进入哪个系统。不过,如果启动了AutoRCM,每次开机就不需要那么繁琐,只需要接上loader,然后按电源键即可。

除此以外,AutoRCM还有个好处,就是可以让机器保留以后降级回旧系统的可能性。

我们都知道,这个世界上是不可能存在完美的程序的。所以,厂商总希望通过升级系统来修复bug,或者堵住漏洞。为了防止用户再降级到某个有漏洞的版本。所以,他们在主机里加了一块芯片。芯片里面有很多导线。当系统升级的时候,主机会熔断其中的导线。当系统启动的时候,系统会检查还剩下多少导线没有被熔断。如果被熔断的导线太多,导致剩余的导线比系统需要的少,系统则自动关机,反而系统则启动。所以,当你升级到更高级的系统的时候,主机自然会熔断更多导线,而当你想降级的时候,系统发现熔断的导线过多,就无法启动了。

另外,由于熔断导线这种操作是不可逆的,所以真的就是断了就断了。虽然说可以拆开机器和芯片,再手动接导线上去,但是成本太高,几乎就是理论上可行的阶段。

而AutoRCM会防止主机熔断导线,继而提供未来降级系统的可能性。大概就是这样。