海船
2020/07/26摄于 南京-大胜关
很久没有写字了,但却从未停止思考。这么一方小天地,自是无人问津,可以畅快表达。
永恒的事物,必要时间去证明它的价值 – 或是它的荒诞。
思考太多却很少见诸笔端的主要原因有三:
一是不够自信,一直处于自我怀疑之中;
二是读书太少,更加不敢开口,怕暴露智商;
三是不敢胡说,文字表达天生存在缺陷,开口即是错。
在我自己开辟的一方赛博领土之上,我倒是愿意说一些莫名其妙的真话。但最好也是猥琐到让人不能轻易看懂,自己也安全。
今天就来谈谈,很久以来,一些一直在思考却从未有结果的事情。我想很多我早已想通的道理,而世界却未必明白。
所以我将它写下来,孤独的思想者,把一切苍白的辩驳都交给时间。
眼前的光景,是荒唐的人间。世界观没来得及稳固就被颠覆的感觉,不知道是否有人能够体会。
我们的生活,B站、抖音,歌舞升平,一浪高过一浪。生活仿佛从未发生变化甚至快要高潮一样,而这正是当下最该警惕的地方。
不禁想回忆起,从什么时候开始觉得生活变得逐渐不一样?我觉得是从2012年。
混沌是什么?混沌是无法描述的,就如此刻我想诉说的事物,它无法被琢磨,无法被找寻,无法被把握。
但能清楚的感受到它的存在。更进一步的,是能感知到,它将去向哪儿。
我们身处混沌的中心,眼前充斥着一切迷雾,混沌假以掩饰,令我们亦步亦趋。
我们的生活,如今被互联网所支配。而互联网是一个无法停止的事物,一旦启动,就必将改变眼前的一切。
而有一些价值观,需要被表达,也是此文的意义。
可能有些人,看到这里,就不再继续读下去了。这也正是每当想要对这个世界阐述一种立场时,最悲观的地方。
黑客在看待一个问题时,首先是质疑。如果想要知道一道上锁的门是否可靠,只需要推敲即可。记住,质疑,再然后是推敲。
世上之事,大抵如此。从SQL注入,到人生的意义。其实世上之事,大都经不起推敲。
地球上所有的信息系统,都有漏洞。甚至可能连数学理论本身都有漏洞。如果你认为printf(“hello world\n”)这样的代码不会有漏洞,请看看射线导致磁盘、内存位反转的案例。类似这样的,甚至更加古怪的问题,人类黑客,可能永远也无法发现它。而很多时候逻辑深处的漏洞,甚至比物理漏洞还要隐蔽。之所以常人觉察不到,仅仅是因为认知和格局还无法辅佐我们抵达。
可悲的是,如今大部分具有黑客思维的人,所从事的工作,竟然是在给这个世界上最愚蠢的程序猿们开发的CRUD系统寻找所谓的安全问题!更可悲的是,很多在质疑和推敲方面具有良好潜质、良好的思辨能力的选手,竟沉迷在这样的工作当中无法自拔,自我满足。
黑客生存的意义,绝不应该局限在给信息系统寻找漏洞这件经不起推敲的事情。当好不容易具备了与别人不一样的怀疑视角,一定不要把这种能力埋没在和傻瓜比数数,以及指导他们做作业这些无聊事情上。而是应该去研究金融、经济、Politics、管理。当然,如果你的脑核足够富余,哲学和数学更是个不错的选择。
只提出愿景,而忽视现实,是非常惹人讨厌的。你可能会说,黑客也是人,黑客要吃饭,养家糊口,就必须去做一些很傻的事情。其实这是经不起推敲的,看透一切事物的本质,便知道物欲也是虚无。穷且益坚,求真务实,就成为了一个黑客该有的追求。
其实,只要能理解,这个世界上,大部分事情,都经不起推敲的道理,就不会再去追求物质。
就说金钱吧。在以黑客思维去看待地球文明时,货币系统只各个互斥的群体为了内部耦合与外部协作而构建出的一套算法罢了。货币、贵金属、古董,乃至一切等价物,都只是对价值结构体的引用罢了。
个体的贫穷和富有,取决于这套算法的实现逻辑。掌握了这套算法,未必能实现富裕。有commit的权限和编码的水平,兴许倒可以实现利益最大化。
但是跳脱出这个系统,才是黑客精神。仅仅沉迷在这套系统之间,还是没有意义。
最近的这几个VirtualBox版本(6.1.4、6.1.6、6.1.8)比以前多了一些变化,主要体现在Guest Additions上。
在6.1.4、6.1.6的版本里,曾经遇到过虚拟机和宿主机(Guest and Host)之间不能共享粘贴板(Clipboard)的bug,以及Windows 7、Debian10的Guest机器无法全屏的Bug。
之前的解决方法是,在 VirtualBox官网上下载Virtualbox 6.1.2版本的Guest Additions ISO,挂载并且安装ISO镜像中的VBoxLinuxAdditions.run文件后,即可解决这些问题。
但在今天的6.1.8版本的Release Changelog中,提到已经解决了多个这样的Bug,于是试试运气,结果遇到这样的问题:
1 | VboxClient: The parent session seems to be non-X11. Exiting... |
这里分享我在Windows 10 Host,Debian 10.0 Guest上的解决方法:
先注销当前用户:
再在登录的时候选择X11选项:
即可解决。
Rails 6.0 发布已经有一段时间了,之前没有什么项目可以练手,最近总算遇到可以使用Rails 6开发的场景了。Rails 6中新增了一些功能和特性,有一些内容官方文档里并没有写的很具体,所以在摸索的过程中也遇到了一些坑点。这里以一个新工程从头到尾的构建,来简单记录在Rails6中使用jQuery和Bootstrap的过程。希望能够给新来的同学做个参考。
编程和码字的水平有限,如有错漏敬请指教,也请多包涵!下面就开始吧。
1 | test@debian:~$uname -a |
这里新建一个项目“TestApp”,并在其中建立控制器“Test”和测试方法“test”:
1 | test@debian:~$rails new TestApp |
创建好之后,修改test页面,添加一个表单和按钮,用于稍后测试Bootstrap。(在执行创建控制器和方法的命令后,Rails已经为我们自动添加了到Test控制器test方法的路由,所以不需要我们再新增路由。)
app/views/test/test.html.erb 代码:
1 | <h1>Test#test</h1> |
启动Rails服务,访问http://localhost:3000/test/test:
1 | test@debian:~/TestApp$rails s |
此时应用已经创建成功。
这里采用yarn作为Javascript包管理器。在TestApp目录中运行bin/yarn,如果出现以下内容,说明yarn没有安装:
1 | test@debian:~/TestApp$bin/yarn |
安装方法在这里, 以当前使用的Debian 10为例,安装的方法是:
1 | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - |
安装好yarn之后,就可以用yarn添加jQuery包和Bootstrap包:
1 | test@debian:~/TestApp$yarn add jquery |
由于Bootstrap还需要基于popper.js,不装的话会报依赖错误,所以安装一下:
1 | test@debian:~/TestApp$yarn add popper.js |
安装的执行结果:
因为众所周知的原因,网速慢的同学就尴尬了,这里可能要等很久,所以你需要选一个科学一点的方式。
此时查看TestApp/node_modules目录,所需的前端库已经添加好了:
1 | test@debian:~/TestApp$ls node_modules/jquery/ |
跟Rails5有所不同的是,Rails6采用webpack打包的方式,把需要打包的资源统一放在一个文件里(Rails6之前是采用Gemfile的方式引入第三方库,再通过Asset Pipeline汇聚)。
于是在安装好所需的前端库之后,就需要在app/javascript/packs/application.js中先引用它:
以Bootstrap为例,在其中添加import 'bootstrap'引入语句:
与此同时还需要在application.scss中引入Bootstrap的CSS样式表:
在app/assets/stylesheets/application.scss文件中添加@import "bootstrap/dist/css/bootstrap";:
2020/05/28 Patch
纠个错,如果想要通过@import "bootstrap/dist/css/bootstrap";的方式引用bootstrap相关的CSS,需要把app/assets/stylesheets/application.css文件重命名为app/assets/stylesheets/application.scss。
如果直接使用app/assets/stylesheets/application.css的话,那么采用如下方式来引用:
1 | /* |
Ending Patch
接着继续修改app/views/test/test.html.erb文件中的代码,添加相应的CSS类来测试Bootstrap是否已经引入成功:
1 | <h1>Test#test</h1> |
启动应用,再次访问测试页面:
虽然界面有点丑,但是从渲染效果来看,Bootstrap已经成功引入了。
继续修改app/javascript/packs/application.js,添加用于测试jQuery的代码:
1 | // This file is automatically compiled by Webpack, along with any other files |
保存并运行,刷新https://localhost:3000/test/test页面,发现添加的代码无法执行,控制台中有报错:
1 | ReferenceError: $ is not defined |
这是因为jQuery库也需要引入一下,但是引入的方式有些不同,并不是在页面中直接引入,而是需要在config/webpack/environment.js中添加以下引入代码:
1 | var webpack = require('webpack'); |
通过声明一个全局的导出,就可以在全局的JS代码文件中使用”$”符号了。
刷新并再次访问,代码能够运行,控制台也没有再报错,说明jQuery已经成功集成:
另一种方法
还有一种方法是通过在JS文件按中使用import $ from 'jquery'来使”$”符生效,但是这样比较繁琐,需要在每个JS文件中出现,所以不再介绍了,当然,也提供一下详细的代码参考
1 | // This file is automatically compiled by Webpack, along with any other files |
在网上主要参考了这篇文章。Rails 6中的变化还是挺大的,不知道webpack会不会真的成为Rails的未来,感觉之前使用coffee script来写JS的同学不是很多,但是我倒是已经非常习惯于使用它来开发前端功能了。
但是想必Rails的先驱们有着他们更成熟的考虑吧,那就一起继续探索好了。
物物而不物于物,则胡可得而累邪!
庚子年这倒霉病毒的事儿,就不多言了。受此影响,正月里,神州大地的人民,都在家中宅着,用最简单的方式为祖国做着贡献。我自然也不例外,只不过我是个闲不下来的人。虽然平日里我就比较宅,但是按照计划,正月我至少也是要走动走动的。其实若是完全依我自己,我肯定宁愿在家宅着,毕竟守寂淡泊才是我的志趣所在,走亲访友这根本不是我的爱好。只是要考虑家人感受,所以不得不应付罢了。
在家我自然也不会闲着,一早就想要做的事情就是把自己的东西好好整理整理,苦于一直没有时间和思路。这次正好,有了新的思路,也正好有时间,于是在这里谈谈后续的收纳计划。
首先是为什么要收纳。原因很简单,一是家中置物空间有限,不得不收纳。二是,人要时常给自己减轻物质方面的负担,所以要时常扔东西,卖二手,或者是收纳。
我的杂物是很多的,大到健身设备,家电、小家具,小到二极管、电容这些零碎的电子元器件,所以收纳起来相当费事。而我又是一个比较极简和有强迫症的人,所以这就形成了非常鲜明的矛盾。对于不想看到的东西,我的原则就是甩锅。能扔的扔,不能扔的,父母今年正好开着小货车来我这里过年,于是把那些大件的杂物一股脑全让他们拖回到农村老家,老家的地下室、后院,尽可以随便放置,眼不见,则心不烦。但是很多的小物件,就得一一归纳,汇总打包了。
于是我问自己,有什么东西,是十年之内用不到,但又是我不想扔的。
这样一来,就清楚多了。这批物品中,包括到期的保险单、人生的第一枚鼠标,积攒的用来制作特斯拉线圈的铜线,还有用来制作电磁炮的铝管、智能小车上的18650电池组、嵌入式开发板。也许未来十年,我不会有时间去完成那些小制作和小梦想了,但是未来的某一天,希望我有时间,可以再拾起它们。对这些物品,我需要准备打包盒将他们封印,放在一个看不见的地方,等待下一次搬家。
当初在收集和购买它们的时候,对自己的时间,是有着满满的自信的。以为可以无忧无虑,废寝忘食地投入在爱好当中。而现实是,自己既没有无忧无虑的资格,又没有经得住废寝忘食的身体。普通人的精力是有限的,最近几年深深地意识到这一点,于是把自己的领域逐渐收窄,想必,这辈子大部分工作的时间和精力,会扑在软件和互联网领域了,这是我选择的方向。
庄子说,物物而不物于物。我的内心有着太多的物,却不能够物之,这是非常不应该的,也是我心累之根源。
相信在之后不久的日子里,我就要与这些杂物短暂地告别了,就让我将他们尘封在时光机里,在未来的某一个时候再见吧。
身外的杂物,终究是容易收拾的,而心里的杂念,整理还需要时间。什么时候,待我不再物于物,想必才能真的理解庄子。
最近有不少好剧,有时候网速不好追剧太累了,而且有的有广告。看了一下几个主流的视频网站,有不少都还是用的标准的hls协议,没有在此基础上做修改(所以容易导致影视资源泄漏)。用标准hls协议的好处就是我们可以基于hls协议很方便地将影视资源多线程快速下载到本地,既可以流畅观看又可以去广告(部分)。
于是写了一个多线程的m3u8的文件下载器,基于python3纯原生库,安全放心:
代码链接:
https://github.com/Chorder/m3u8_downloader
顺便说一句,m3u8文件挺有意思的,结合ffmepg的缺陷,曾经爆出过播放器任意文件读取漏洞 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1897 ,但是亲测在浏览器中m3u8文件其实还有更多妙用。感兴趣的童鞋可以进一步玩耍一下。
在PostgresSQL中如果尝试删除一个用户,可能会遇到这个报错:
1 | ERROR: role "XXX" cannot be dropped because some objects depend on it |
这是因为没有撤销该用户的权限所导致的。
具体以一个例子来说明。创建一张叫做“xxx”的表,再创建一个“test”用户,并将这张表的所有权限赋予“test”用户。
直接尝试删除这个用户,就会出现这个权限提示。
1 | root=# CREATE TABLE xxx ( id SERIAL PRIMARY KEY , name CHAR(15) NOT NULL ); |
可以通过下面这条语句查询PG中“test”用户的权限,并根据查询到的结果撤销之。
1 | root=# SELECT * FROM information_schema.table_privileges WHERE grantee='test'; |
批量撤销用户在数据库中所有表的权限:
1 | revoke all on database XX from test; |
PG权限的基本操作
赋予权限的语句是
1 | GRANT *privilege ON *obj TO *user |
撤销权限的语句从语法上与之对应:
1 | REVOKE *privilege ON *obj FROM *user |
删除用户:
查看用户权限:
2019很快就要过去了,这一年似乎做了很多事,又似乎只做了一件事。
回顾这过去的一年,和过去的很多年,生活悄然发生着变化。
这些年过得并无什么遗憾,此时谈遗憾还为时甚早。生活偶尔让人一时兴起,似是来者可追。
心头最大的怀念是关于过去的时光,很多人相聚又离开,奔走为了生存。
如果可以,我希望能辟一方寒舍,偶尔能把这些家伙们聚在一起,灌几口老酒,寒暄中宽慰过往。
然而岁月不曾等待谁,故事总有结尾,尘埃终将落定。
就像今年,有些人的终身大事定了,有人不再同我来往,有人觉得自己老了,有人升官发财。
我想做一棵守在原点的大树,却无法不在风里晃荡枝桠,无奈又极端,命运的使然。
有了愿意靠在这棵树上的人,为了让她靠得更稳,就需要再向土里埋入长长的根。
平平淡淡,浮浮沉沉,一蓑烟雨,一湾江湖。
在每个沉默的白天,每个雨落的深夜,心头点点,汇在一起,便是如此。
SSH远程转发存在常见的三种使用方法,分别是-D/-L/-R。
-D是动态转发,用例为
ssh root@REMOTE_HOST -D 8080
启用时会在SSH Client侧监听一个本地端口8080,在浏览器中配置该端口作为代理,SSH Client会将浏览器中的流量转发到SSH Server侧进行发出。
-L俗称本地转发,用例为
ssh root@REMOTE_HOST -L FromPort:DestHost:DestPort
启用时,SSH Client侧会在本地监听FromPort端口,同时将流量转发到DestHost的DestPort端口。
此时的DestHost是相对于SSH Server侧REMOTE_HOST这台远程主机而言的目的主机。
-R称之为远程转发,用例为
ssh root@REMOTE_HOST -R FromPort:DestHost:DestPort
启用时,SSH Server侧会监听FromPort端口,并将该端口的流量转发到SSH Client这边的DestHost主机的DestPort端口,实现从远程到本地的转发。此时的DestHost是相对于SSH Client侧的本地主机而言的目的主机。
主机安装SSH服务,并开启证书登录。然后运行ssh-keygen命令,在 ~/.ssh/ 目录中生成 id_rsa 和 id_rsa.pub 文件,并将id_rsa.pub内容拷贝到 ~/.ssh/authorized_key 中(如果没有就新建该文件),目的是能够开启主机到自身的ssh证书登录。
将hadoop-3.1.2.tar.gz和jdk-8u231-linux-x64.tar.gz拷贝到服务器中并解压,例如 /data/ 目录。
1 | [root@localhost data]# ls jdk1.8.0_231/ |
1 | ####大数据测试环境配置 |
1 | mkdir /data/hadoop |
1 | <configuration> |
1 | <configuration> |
1 | <configuration> |
1 | export JAVA_HOME=/data/jdk1.8.0_231 |
额外选项
可能会遇到报错,抛出以下报错信息:
1 | ERROR: Attempting to operate on hdfs namenode as root |
解决办法:
修改 hadoop-3.1.2/sbin/start-dfs.sh 和 hadoop-3.1.2/sbin/stop-dfs.sh 文件,在脚本开始处添加以下内容:
1 | HDFS_DATANODE_USER=root |
修改 hadoop-3.1.2/sbin/start-yarn.sh 和 hadoop-3.1.2/sbin/stop-yarn.sh 文件,在脚本开始处添加以下内容:
1 | YARN_RESOURCEMANAGER_USER=root |
首先载入/etc/profile文件中的配置:
1 | source /etc/profile |
然后初始化hadoop namenode:
1 | hadoop namenode -format |
启动dfs:
1 | /data/hadoop-3.1.2/sbin/start-dfs.sh |
启动yarn:
1 | /data/hadoop-3.1.2/sbin/start-yarn.sh |
查看运行情况:
HADOOP_HOST是你的环境IP。
Update your browser to view this website correctly. Update my browser now