青羽的博客

恭喜你发现了一个不为人知的小岛

关于因果,大致上存在三种说法(这里的因果指的是多见于宗教相关话题下的因果报应,而不是因果律):

  1. 存在一种宇宙的绝对审判,公正地评判一切并给出相应的奖励或惩罚,体现为因果。
  2. 宇宙对我们所有(无论正面或负面的)思想、情感和意志进行回应,体现为因果。
  3. 没有因果这回事,都是宗教编出来忽悠人的。

在质疑和思考中,结合我以前的经历与学习,我得到了一些体悟,或许可以尝试统一以上三种观点——只需要两条假设。

假设1:宇宙对我们所有(无论正面或负面的)思想、情感和意志进行回应,体现为因果。

假设2:灵魂(泛指除肉体以外的人的或非人的一切灵体)存在。

如果您不能接受假设2,那么请关闭本篇文章,我尊重任何与我相同或不同的观点或信念。

假设以上两条假设是真的,好了,那么,佛教里的那些和第一种说法类似的观念又是怎么回事呢?没有因果业力,难道坏人就不会受惩罚吗?

我小时候是无神论,秉持的是第三种观点,高中开始接触灵性,前前后后把新纪元、佛家、道家的资料杂七杂八的看了一些,新纪元大多秉持的是第二种观点,佛家和道家基本秉持的是第一种观点,看似矛盾的两种观点居然都出现在了我很相信的资料上,于是我开始纠结这些,总是会情不自禁地去想,一直在第一种说法和第二种说法之间徘徊。某天突然想通了,这两种观点根本就不冲突啊!

先说结论:假设1和假设2,(在地球上)能够聚合出第一种观点的现象。

我不想长篇大论地跟写论文似的证明我的观点,我现在也没有条件去严谨地调查取证、分析数据,因此我并不保证我说的就是对的,我只是提出我的想法和假设。

简单写一下:

公理1:地球上存在很多生命。

公理1说明:生命在这里的意思是”有情众生“。

公理2:生命会喜欢帮助自己的生命,讨厌伤害自己的生命。

公理2说明:尽管存在拥有斯德哥尔摩综合征的人,但是由于数量很小,故不影响主要推论。这里并不包括”伤害是另一种帮助“这种不是人该说的说法(不是人该说并不等于就是鬼该说)。另外提醒一下,公理2的三个”生命“,可以是同一个人。

公理3:绝大多数人没有前世记忆。

公理3说明:放心,我也没有。

推论1:由假设2可知,人的(一部分)灵魂需要成长。

推论1说明:为什么是一部分?因为有些部分可能是如如不动的。动的部分,自然是变化的,有意识,终究会拓展自己,体现为成长。这里隐含了一个假设:成长会向着正面(服务他人,或集体利益最大化)的方向发展。这里暂不讨论向着负面(服务自我,或倾向于毁灭)的方向发展的成长。

推论2:由假设2和公理3可知,地球上存在着一个轮回系统。

推论2说明:”地球上“这个前提很重要,别忽略了。这个轮回系统有一个很重要的功能:在进入转世之前封印/屏蔽灵体的记忆,或者是切断肉体与灵体的记忆通道。

推论3:由推论1可知,帮助/伤害他人者,终将得到来自自己灵魂的果报。

推论3说明:这里隐含一个假设:一切都被记录着(灵魂记忆或者阿赖耶识/宇宙数据库),那么,在整合/提升时,必将面对自己曾经做的每一件好事/坏事。

TODO:这里有漏洞:万一提升就完全不care以前的事情了呢?

推论3,构成了来自内部的果报。

推论4:由假设1和公理1、2可知,存在一种力量,评判地球上的一切并给出相应的奖励或惩罚,体现为因果。

推论4说明:地球上的众生的意念/思想/情感的“合力”体现为一个”因果报应法则“。任何普通个体的力量,在这个合力面前都是不堪一击的。注意,这里的“众生”不仅仅指人类。

推论4,构成了来自外部的果报。

推论3、4,共同构成了因果效应。

正文完。


最后提出一个彩蛋:

假设3:单线程不可逆的时间是(地球上的被人类大脑解释的)幻象。

假设3说明:无。

推论5:由假设3和推论2、3、4可知,时间和轮回延迟和阻碍了因果效应的及时显现。

推论5说明:无。

仔细想想,有点意思。


这是 Operating Systems: Three Easy Pieces 的习题解答。

中译本叫《操作系统导论》,但我是看的英文原版PDF做的,因为中译本有些地方翻译得不全。

我不保证答案一定全部正确,因为没有标准答案,但至少我都是在本地Linux环境下测试通过了的。

答案以Markdown文档的形式放在Gitee上(GitHub在国内几乎上不去了)。

从第四章开始,因为前三章没有作业。

仓库地址:OSTEP。 不定期更新。


1. Brainfuck简介

我在此假定本文读者了解图灵机的概念。

Brainfuck(以下简称BF)是一门图灵完备的编程语言,也就是说,别的编程语言能做的事情BF都能做,甚至你可以用它来写一个操作系统。

来,先用一个Hello World来感受一下BF的画风:

1
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

输出:

1
Hello World!

BF的规则和语法我这里就不说了(懒得打字,这东西网上一查一大堆,我就不生产冗余信息了),本文重点是解释器的实现。

人们常开玩笑说,最底层的编程语言是0和1(所谓的二进制编程)。实际上并不是这样的,因为01序列对应的还是指令,比如01110100实际上实现的是MOV指令的功能‬(举个栗子),指令少则几十个,多则上百个,各种分支跳转条件判断等等,跟BF相比还是显得很高级的。

我在此宣布:在软件界最底层的语言是BF!(esoteric programming languages就不说了……不然没完没了)

为什么要加软件界这个定语呢?因为不限定这个的话,Verilog会不服的。

2. 解释器的实现

因为我没有在网上找到让我满意的BF解释器,所以我就自己用C语言写了一个BF的解释器bf.exe。哈哈,听起来很装,其实不难,挺简单的,因为BF的语法本来就非常简单(虽然写起来很烧脑,这也是为什么这个语言叫Brainfuck)。

在了解了BF的规则和语法之后,学过C语言的应该都能知道怎么写了,比如>就是++p+就是++*p等等,不过循环部分需要仔细想一想,因为有嵌套的[ ],不能直接做match,需要有一个counter。

话不多说,直接上代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/************************************************************
Copyleft
File Name: bf.c
Author: Chobits
Date: 2021.04.25
Description: Brainfuck interpreter implementation in C
Version: 1.0.0
***********************************************************/

#include <stdio.h>

#define TAPE_SIZE 1024

void bf(FILE *fp);

int main(int argc, char const *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Error: parameter number mismatch.\n");
fprintf(stderr, "Usage:\n");
fprintf(stderr, "bf <src_file> # Interpret the brainfuck source code.\n");
return 1;
}

FILE *fp = fopen(argv[1], "r");
if (fp == NULL)
{
fprintf(stderr, "Error: failed to open file \"%s\".\n", argv[1]);
return 2;
}

bf(fp);

fclose(fp);

return 0;
}

void bf(FILE *fp)
{
int bracket_cnt; // count brackets
signed char command; // current command character, signed because EOF
unsigned char data[TAPE_SIZE] = {0}; // memory data
unsigned char *dp; // memory data pointer

// Move dp to middle of the data tape
dp = &data[TAPE_SIZE / 2];

signed char c;
while ((command = getc(fp)) != EOF)
{
switch (command)
{
/* Move data pointer to next address */
case '>':
++dp;
break;

/* Move data pointer to previous address */
case '<':
--dp;
break;

/* Increase value at current data cell by one */
case '+':
++*dp;
break;

/* Decrease value at current data cell by one */
case '-':
--*dp;
break;

/* Output character at current data cell */
case '.':
putc(*dp, stdout);
break;

/* Accept one character from user and advance to next one */
case ',':
*dp = getc(stdin);
break;

/* When the value at current data cell is 0,
advance to next matching ] */
case '[':
if (!*dp)
{
for (bracket_cnt = 1; bracket_cnt; fseek(fp, 1, SEEK_CUR))
{
c = getc(fp);
fseek(fp, -1, SEEK_CUR);
if (c == '[')
{
bracket_cnt++;
}
else if (c == ']')
{
bracket_cnt--;
}
}
}
break;

/* Moves the command pointer back to matching
opening [ if the value of current data cell is not 0 */
case ']':
if (*dp)
{
// Move command pointer just before ]
fseek(fp, -2, SEEK_CUR);
for (bracket_cnt = 1; bracket_cnt; fseek(fp, -1, SEEK_CUR))
{
c = getc(fp);
fseek(fp, -1, SEEK_CUR);
if (c == ']')
{
bracket_cnt++;
}
else if (c == '[')
{
bracket_cnt--;
}
}
// Advance pointer after loop to match with opening [
fseek(fp, 1, SEEK_CUR);
}
break;

/* Ignore other characters */
default:
break;
}
}
}

真正实现解释器功能的核心代码不到一百行。

为了好看(装逼),注释都是英文的,英语四级过了的小伙伴应该都看得懂。

运行截图:

3. PlainCode

如果说那个BF的Hello World代码不容易看懂的话,那么可以利用Python搞一个plain版本的,也就是这样:

1
2
3
4
5
6
def fun(ascii):
return "+"*ascii + ".>"

string = "Hello World!"

print(''.join(list(map(fun, map(ord, string)))))

转换结果就是很plain的BF代码:

1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++.>

如果还看不明白的话,可以再人性化一点:

1
2
3
4
5
6
def fun(ascii):
return "+"*ascii + ".> // '" + chr(ascii) + "'\n"

string = "Hello World!"

print(''.join(list(map(fun, map(ord, string)))))

转换结果:

1
2
3
4
5
6
7
8
9
10
11
12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'H'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'e'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'l'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'l'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'o'
++++++++++++++++++++++++++++++++.> // ' '
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'W'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'o'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'r'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'l'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'd'
+++++++++++++++++++++++++++++++++.> // '!'

其中的//只是为了强调这是注释,因为实际上在BF解释器里面任何那八种操作之外的字符都会被忽略:default: break;

运行结果:

但是,写到这里,我突然发现,如果要是注释里面需要有那八个字符怎么办?

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 't'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 'e'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 's'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // 't'
++++++++++++++++++++++++++++++++.> // ' '
+++++++++++++++++++++++++++++++++++++++++++++++.> // '/'
+++++++++++++++++++++++++++++++++++++++++++++++.> // '/'
+++++++++++++++++++++++++++++++++++++++++++.> // '+'
+++++++++++++++++++++++++++++++++++++++++++.> // '+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // '>'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // '>'
++++++++++++++++++++++++++++++++++++++++++++.> // ','
++++++++++++++++++++++++++++++++++++++++++++++.> // '.'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> // '['

那么程序就会出问题,因为任何出现在代码里面的那那八个字符都会被解释执行,除非……把//变成单行注释!

好吧,两个字符的单行注释不好写,用;当作单行注释吧!和汇编还吻合呢~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; 't'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; 'e'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; 's'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; 't'
++++++++++++++++++++++++++++++++.> ; ' '
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; ';'
+++++++++++++++++++++++++++++++++++++++++++.> ; '+'
+++++++++++++++++++++++++++++++++++++++++++.> ; '+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; '>'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; '>'
++++++++++++++++++++++++++++++++++++++++++++.> ; ','
++++++++++++++++++++++++++++++++++++++++++++++.> ; '.'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; '['
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> ; ';'

BF的代码是这样子的,那么,就需要在bf.c里面再加一个case了:

1
2
3
4
5
6
/* Single-line comment */
case ';':
while ((c = getc(fp)) != '\n' && c != EOF)
{
}
break;

因为单行注释的结束有两种可能:一种是到下一行,一种是直接到文件结尾(没有换行符),所以需要那样写。一开始我只写了个while ((c = getc(fp)) != '\n')在最后就会引发一个无限循环的bug。

测试:

注意,上图.\bfcode_comment.bf最后的';'后面是没有换行符的,这里换行的效果是VS Code终端的设置。

OK,完美~

咦?我好像不知不觉间给BF实现了单行注释的功能……啊哈哈哈

可能很多人会觉得这很无聊,觉得作者太闲了,做这些有什么用呢?这些确实没有什么用,我并不是为了实用性而写的,也不能说是完全为了学习而写,其实做这些更像是一种娱乐吧。这有点像小孩子玩积木一样,全心全意地把自己的注意力放在积木上面。日常的生活中,其实有很多的烦恼和苦闷,而当我沉浸在计算机世界里的时候,能够让自己的心沉浸在这小小的天地中,能够体会到宁静和满足,就足够了。


面向对象语言中,经常说“子类”和“父类”,但是我觉得这不好,应该改一改。

“子类(child class)”改成“派生类(derived class)”;“父类(parent class)”改成“基类(base class)”。

这样统一叫法有以下好处:

  1. 语义清晰。比如Rectangle类继承自Shape类,说Rectangle类是派生类,Shape类是基类,总比说Rectangle类是子类,Shape类是父类来得更恰当。“父”与“子”的关系完全不能准确描述“继承”的机制嘛。父类少,子类多,不如说基类少,派生类多。
  2. 平权主义。虽然人们不会觉得有什么,但是“子类”和“父类”这种叫法可能会在潜意识里加强男权主义。

声明:本人不信佛教,也不是佛教徒,就一普通人,了解了解佛学。因为佛学里有许多值得我们学习的东西。有必要诚实地说一下,本文部分语句是直接复制网上的。

「善念,善言,善行。诸恶莫作,诸善奉行。」


1. 「苦」的定义

《佛地经》第五卷曰:「逼恼身心名苦。适悦身心名乐。」

改天有缘再说「乐」。

这个逼就是压力,各种压力,身心两方面都有。恼是烦恼,让身心都不自在。

世间苦难太多了,由于分类不同,众多的苦可分为

  • 「二苦」,即「内苦、外苦」
  • 「三苦」,即「苦苦、坏苦、行苦」
  • 「四苦」,即「生苦、者苦、病苦、死苦」
  • 「八苦」,即「生苦、老苦、病苦、死苦、爱別离苦、怨僧会苦、求不得苦、五阴炽盛苦」。

光看名词可能会以为八苦比三苦多,其实不是,三苦比八苦多。三苦是总说,八苦是细说苦苦。


2. 三苦

2.1 苦苦

第一个苦是个动词,第二个苦是名词。

逼迫身心,苦上加苦,故曰苦苦。

苦苦再细分,就是八苦,「八苦者,乃人间之苦」,任何一个人都不能够避免。

前四种「生、老、病、死」是内苦。上自帝王,下至乞丐,都逃不了生老病死。

后四种「爱别离、怨憎会、求不得、五阴炽盛」是外苦。可以通过修行在一定程度上缓解。

2.1.1 生苦

人投胎在母亲肚子里,受胎到出胎都是苦,佛把这一段期间(这十个月)形容为地狱。

母亲喝一杯热水,就好像在八热地狱,难过、痛苦;喝一杯冰水,就像在八寒地狱,苦不堪言。出生的时候更苦,犹如在地狱中受夹山地狱之苦。刚刚出生皮肤柔嫩接触到外界空气,佛形容有如利刀割皮肤一样,所谓风刀解体。每个人都经历过,只是把痛苦忘掉了。

此谓生苦。

2.1.2 老苦

人的年龄大了就会老态龙钟,耳也聋了,眼也花了,动作也不灵了,处处需要人照顾。如果不想老苦,那只有短命;要想长命,那非受老苦不可。

此谓老苦。

2.1.3 病苦

病有两种,一种是身病,一种是心病。

「身病,谓四大不调,众病交攻。若地大不调,举身沉重。水大不调,举身胖肿。火大不调,举身蒸热。风大不调,举身倔强。」,这里倔强引申为不柔软,身体僵硬。

「心病,谓心怀苦恼,忧切悲哀。」

几乎人人都经历过病苦。特別是现在,心病更多了。

此谓病苦。

2.1.4 死苦

死有二种,一种「病死」,生病死的;第二种「外缘」,横祸死的。

「或遇恶缘或遭水火等难而死」

这都是死苦。死是真苦,佛在经上形容死之苦,讲神识离开身体,那痛苦就像生龟脱売(如果没有留恋会比较轻松)。所以临命终时,那一口气不好咽,不容易断,非常痛苦。

此谓死苦。

2.1.5 求不得苦

众生都有欲望、渴求,想要却又得不到满足就感到很痛苦。此谓求不得苦。

2.1.6 爱别离苦

喜欢的人、物,常常要离别,不能常聚,很痛苦。这都是人之常情。此谓爱别离苦。

2.1.7 怨憎会苦

越讨厌的人,结果越常常看到;越不喜欢的环境,越想离也离不开。此谓怨僧会苦。

2.1.8 五阴炽盛

这是以上七苦的因。五阴即是五蕴,就是「色、受、想、行、识」。

  • 色阴炽盛,四大不调,而有疾病之苦。
  • 受阴炽盛,领纳分别,使诸苦转本加极。
  • 想阴炽盛,想相追求,而有求不得、爱别离、怨憎会苦。
  • 行阴炽盛,起造诸业,又为后来得报之因,且因行而迁流不停,而有老衰之苦。
  • 识阴炽盛,起惑造业,三世流转,而有生死之苦。

2.2 坏苦

人生苦多乐少,有时候偶尔苦中断了一段时期,就觉得很乐。其实那不是真正的乐,而是苦暂停。

怎么说乐是苦?佛法讲真妄的标准永远不变。如苦,我一天不吃饭很苦,两天不吃饭更苦,三天不吃饭还苦,绝对不会说四天不吃饭会快乐起来。所以苦是真的不会变的。如乐,喜欢吃的东西,吃一碗好吃,吃得很快乐,再吃一碗还可以,连续吃个十碗、二十碗,就苦了。它会变苦的,乐会变苦,乐就不是真的,而是假的。玩游戏很乐,连着玩数十年,那就是苦不堪言。做爱很乐,但随着快感阈值的提高,终究乐会变成苦,而苦不会变成乐。

乐是坏苦,因为乐是暂时、片刻的,苦就在后面,乐极就生悲,不会长久的。

2.3 行苦

行就是不住,不能够停止。因果业力流转不息,动心起念成住坏空。

世人追求永恒,希望健康永恒、幸福永恒、爱情永恒、各种永恒……

但世事无常,美好的事物往往昙花一现,转瞬即逝。事实上世间没有一样永恒的东西(除了自然规律,然而自然规律就是无常。好吧除了数学)


3. 三界

三界,乃一切有情众生生死往来的世界。即:欲界、色界、无色界。

3.1 欲界

我用大白话解释,不一定对。欲界就是七情六欲杂念丛生的世界。此界众生苦苦、坏苦、行苦都有。

3.2 色界

我用大白话解释,不一定对。色可以简单理解为物质。色界没有杂欲导致的痛苦。此界众生只有坏苦和行苦。

3.3 无色界

我用大白话解释,不一定对。无色可以简单理解为没有物质。无色界众生都是精神体/光体之类的。此界众生只有行苦。


4. 三法印

4.1 诸行无常

世间一切都是变化无常。

「一切有为法,如梦幻泡影,如露亦如电,应作如是观」

4.2 诸法无我

在一切有为无为的诸法中,没有“我”的实体;所谓“我”的存在只是相对的生理和心理幻象。此色身乃四大和合之躯,凡我之物皆是为我所用,非我所有。若真有我,何以我之心绪、生死皆非己能掌控?而我执则为一切众生之通病。唯有了知无我,方可觅得真我。

4.3 涅槃寂静

涅槃,灭除一切生死,无为安乐,故曰涅槃寂静。意指不生不灭,身心俱寂之解脱境界。佛究竟涅盘,以其死不复再生,不生则不灭,无始无明,彻见本来面目。言语文字不能表述其万分之一。

如果要我用大白话来猜测一下的话,那就是佛活腻了,彻底不玩了,永远拜拜了。

佛寿无量,就是说佛的寿命无法以时间计量。现在地球人说这些还太早了,只是「诸行无常」「诸法无我」「涅槃寂静」是三法印,是识别真佛法与假佛法的标准,所以有必要提一下。


“也可能可以留一小小部分在灵体世界某一地方,用来标记,免得迷路?”

想到了赛斯资料里赛斯说祂有一小段片段体在地球的一只狗身上,是这个原因吗hhhh?


源头,这里指一切创造的源头,也叫(万物)本源,我认为是无任何倾向性的,是无法形容的,是无限。

任何有倾向性的,都不严格等于(万物)本源。


「这里、那里」,我知道你对圣灵的存在、空间还无法理解。

再次印证了空间只是假象,那么时间也是假象(广义相对论时空统一性)。

就像玩电脑游戏,游戏里面的地图超级大(这个次元世界超级大),但是游戏外的存在在地图上的哪个地方呢?无法定义。为什么游戏外的存在能瞬间移到到游戏内地图上的任何一个地方呢?(无视空间限制),甚至无视该游戏的最高速度设定(光速)?而人类,是暂时封印了记忆玩这场全息VR游戏的灵魂的载体吧?这游戏里有需要灵魂学习的东西。


只要你真心祈祷,祂们都会听到。

真心为什么很重要?猜测:可能因为发自真心就等价于发自“游戏外的存在”。越真心,游戏内的角色的信息(包括但不限于情感和思想)就越能在游戏外产生高强度的信号源,从而提高了得到响应的概率和强度。具体机制/原理就别猜了,人类近几十年从零开始搭建起来的通信系统都那么复杂,大部分专业人士都还搞不懂呢。


实际上我们在西方极乐世界未曾离开过。

西方极乐世界不是这个次元,次元之间可能无所谓空间的距离,因为(我们通常说的)空间是这个次元的一个基础设定。可能无法用大脑去理解,因为大脑“生活”在时间之中。时间和空间看似是两个设定,但很可能是一个设定的两个表现形式,而这个设定很可能与“光速”有关。



忠告:
想提升可以,靠自己嗷!
不到绝望时刻,不要依赖外物,包括,佛,菩萨,佛经,符咒,药物,等。
对自己灵魂和思想上的改动手段,尽量是自己了解原理,且自愿,并自我操作的。最好先观测已有的实验案例,案例越多越好。

我也同意,最好不要随便念自己不懂的经文,因为不知道效果到底是怎样的以及自己是否能接受。


“当然,我还是要感谢它们送了一份质量极高的信息过来,在具体做法上推广一下自家势力也是情有可原的,毕竟算是一份质量极高的软广。”

对,能有幸学习到这些高质量的资料已经很好了,常怀感恩之心。


“「康纳的生命游戏」”

啊啊啊!居然说到了我喜欢的复杂性理论!起飞!~
康纳?康娜?应该是康威(Conway)。
当初第一眼见到生命游戏的时候我被震撼了整整一个下午,这就是我内心一直在寻找的东西啊。可惜研究了一下之后发现真正的“生命创造”没那么简单……


“毕竟,额外的「因果业力系统」确实做到了,让灵体社会的阶级不极端化(指少数精英永远的剥削弱者和新手),并且维持了一定的公平。”

与《道德经》第四章里的“挫其锐,解其纷,和其光,同其尘”中的“挫其锐”对上了。

“挫其锐”:“锐”是一种“突出”,是一种极性的不平衡,是一种可能会伤害其他个体的“突出”。“挫其锐”就是一种回归平衡的力量,使得万物能够维持在一个较稳定的秩序内,避免过度两极分化而导致崩溃。(引用自汤文洁的文章)


“「顺天者」和「逆天者」们的派系之争。”

这是一个很不错的猜想。不过我认为真正的「万物本源」不是这里的「天」。

万物本源是

“一个无限的、不生不灭、无形无相的自由意识(Freewil)/精神(Spirit),有着无穷无尽的自发幻想(Imagination/思想Thoughts),其景象(Imaginations/表现Expressions)就是无数多样的宇宙和万物及各自的规则和不规则。”(引用自早期元吾氏博客)

虽然这很像客观唯心主义……


“额外的「因果业力系统」”

我认为因果和业力是两个不同的系统。我认为自然发展的因果系统就叫“因果系统”,“额外的「因果业力系统」”叫“业力系统”,这样可能更清晰一些。


以上例子,A的业报绝对不是1:1,而是会多得多,这就是上帝的业力法则。

可能业力的产生像种下了一颗种子,会在各种情绪/思想的浇灌下越长越大,并且可能会计算牵扯到其他衍生的事件的因果业力……总结:越及时化解,越容易消除。


“只能猜测,「源头」真的只在意灵体意识上的进步和体验”

对。自以为是的自我感动,自认为做的是“好事”,如果对他人造成的是负面影响,也可能造业。


前言

这篇文章主要针对知道赛斯资料的人。不知道的也无妨,这篇文章可以当作一个引子。众所周知(实际上看过赛斯资料的人很少),赛斯资料里的话在我个人看来稍微有点啰嗦,所以我在阅读的过程中突发奇想,干脆我试着写一个摘录吧?把一些核心和重要的知识点提炼出来。这对我也是一种学习和乐趣。

赛斯资料是一系列的书籍:

  1. Seth Speaks: The Eternal Validity of the Soul (1970.1.21-1971.9.27)
    《灵魂永生》 / 《时空之外》
  2. The Nature of Personal Reality (1972.4.10-1973.7.11)
    《个人实相的本质》
  3. The “Unknown” Reality Vol.1&2 (1974.2.4-1975.4.23)
    《未知的实相卷一、二》
  4. The Nature of the Psyche: Its Human Expression (1975.7.28-1977.4.4)
    《心灵的本质》
  5. The Individual and the Nature of Mass Events (1977.4.18-1979.8.15)
    《个人和群体事件的本质》
  6. Dreams, “Evaluation,” and Value Fulfillment: A Seth Book Vol. 1 & 2 (1979.9.13-1982.2.8)
    《梦、进化与价值完成》
  7. The Magical Approach: Seth Speaks about the Art of Creative Living (1980.8.6-1980.10.15)
    《神奇之道》
  8. The Way Toward Health (1984.1.3-1984.8.30)
    《健康之道》

《灵魂永生》和《时空之外》都是同一本书的不同译本。我将《灵魂永生》与《时空之外》的第一章逐字逐句地对比了一下,以下是我的个人观点:

  • 《灵魂永生》译者多采用直译,看得出为了避免翻译腔译者还做了适当的文学化精简,尽可能精确优雅地保留了原句的意思。但是同时带来了语句的晦涩,提高了理解门槛,阅读理解较为吃力。
  • 《时空之外》译者多采用意译,看得出译者是在充分理解原文意思的基础上做了适当的重构以使得其更加符合中国人的阅读习惯。经过逐句对比,并没有损失什么信息精度,阅读理解较为轻松。

为什么是赛斯资料?

我直接引用知乎 @汤文洁 的回答吧:

作者:汤文洁
链接:https://www.zhihu.com/question/30907249/answer/798222799

理由一:逻辑自洽

抛开通灵这件事本身,赛斯资料是逻辑自洽、自圆其说的。虽然他/她说了很多很多,有些看上去还挺玄。但是,却没有失控,而且与现实中能够找到的证据高度相符,也与我的很多猜想相互验证。你很难想象作者夫妇(诗人和画家)在那个年代(上个世纪七十年代)能够通过普通的阅读或自己yy编造出如此庞大的体系内容。

理由二:实用价值

赛斯资料涉及的范围个人、群体、梦境、灵魂进化、时空等等的本质,启发性很强。既满足好奇心,又贴近生活,具有指导价值,又方便验证。

理由三:极强的解释能力

能够兼容科学实验结论和各种超自然现象,尽管是以不同的解读方式。换句说话,科学能解释的它能解释,传统宗教能解释的它也能解释,但它能解释的科学和传统宗教却不一定能解释。

理由四:非宗教性

赛斯资料不搞偶像崇拜,不提救世主,不建立宗教组织,没有政治意图。它只是提供一套解释世界和打造自己的理想世界的工具和方法。而并不要求读者必须要怎么做。看赛斯资料,感觉像是在看专业书,只是在摄取知识和获得启发。

理由五:与个人实践基本相符

作为一个热衷于探索/创造/体验的心灵世界的研究者,我的很多经验与猜想都与赛斯资料相符。

除了第五点之外,其他四点我全部同意。因为我目前只是个麻瓜,没啥实践经验可言……

前四章是从原文中摘录出来并重构为陈述句的文字,从第五章开始是直接摘录。少部分斜体表示我自己的感悟。


Seth Speaks: The Eternal Validity of the Soul

第一章:我不具形体,但是我却在写书

赛斯是一个以“能量”为构成单位的个体,已不再用肉体示存了。

五官感觉不能带给人真情实意,因为这些感官会骗人死心塌地地相信这花花世界。

在很多情况下梦中的人要比醒着的时候聪明得多,更具创造力,也更有知识。

人的世界是人自己创造的,人具有几乎是宇宙间最值得敬畏的天赋:将思想向外投射变成物质形态的能力。

语言是物质世界有先后秩序观念后的末端产物。线性结构的语言无法在瞬间沟通复杂的经验。

人自己基本的本体也与赛斯的一样,并不是物质。

第二章:我目前的环境、工作及活动

有些时候人死了还不知道自己死了,但是出生则几乎永远意味着一种尖锐及突然的认知。不必害怕死亡,死了这么多次的赛斯还在写书呢。

所有的外在世界都是由意识创造出来的,总是意识创造形相,而非有了形相才有意识。

任何的世界皆非以形相为本。有些世界根本连形体都没有,也谈不上所谓的“性别”,赛斯多世“男性”的身份在那些世界完全无法作用。

赛斯祂们以心电感应方式沟通。心电感应实际上是人们语言的基石,如果没有心电感应作为语境的基础,语言的象征便毫无意义。

赛斯祂们不生活于所谓的时间架构中,时、分、秒对赛斯祂们失去了意义与吸引力。不过赛斯祂们对各种世界中的时间架构相当清楚,因为在通讯时,必须要考虑到这项因素。

赛斯祂们的工作、发展及感受全都在赛斯称之为“时点”中一次发生。在“时点”中最细微的思维已然了愿,最小的可能性已然探索,连各种可能发生之状况也已完全视过,甚至最不重要或最强烈的情感都受到照顾。

面对不断的刺激,本体需要学习、发展、经历后才能稳定自己。在这过程中赛斯祂们有不少“人”迷失,忘了自己是谁,直到有一天再一次醒悟过来。大部分这类的事情目前对赛斯祂们而言已成为一种自然的形式。在无量的意识变化中,赛斯祂们仍然能够保持一点根性,在赛斯祂们“迷失”的时候,赛斯祂们进入一些最简单的生命形态,和它们掺合在一起,比如花一百年时间在其他世界中当一棵树。

如果赛斯祂们愿意,祂们能由自己的心灵“全我”中创造出其他的“我”,不过这些“我”却要自己照顾自己的“特性”来进化,运用它们天生具足的创造力来进展,它们有绝对的自主权,不过赛斯祂们不轻易尝试这种做法。

每个人都是他或她“全我”的一部分,也都正在向着赛斯目前的生存境界,发展迈进之中。每一个人在童年时代及睡梦中,都能或多或少的,知道属于他们内在意识的真正自由,所以这种能力是每一个独立个体及他的“全我”本来具足的。

人的肉体感官迫使人接受三维空间的世界,不过意识却具有内在感官,不论进步到什么程度的意识,全都具有这种内在感官。这些内在感官,不因意识所采取的形相不同而有不同的认知方法,它独立于形相之外。

肉体感官创造出它们所认知的世界。

物质世界并不“错”,物质形相只不过是认知“假相”的各种无量方法之一,经由这种认知,意识方能自我表达。

由于心理结构的原故使得物质环境呈现出人所见到的外貌。如果转而以“领悟后的联想”来感觉自己生命的延续,而不用“自己在时间中过来多少日子”来感觉自己持续的存在,那么便可以以一种崭新的角度来感受这个物质世界,可以在瞬间认识各种过去现在的事物,并可在事物所显示的各种现象中举一反三。

第三章:我的工作及进入我的空间

赛斯祂们的心灵结构使得祂们能与多种形相的世界沟通,祂们与之沟通的方式很多。就好比说如果你遇见了一个你早已忘怀的童年伙伴,现在你们已经没有什么情投意合的地方,但是某一天下午当你们谈及过去的老师及同学时,你们仍然可以有某种美好的回忆。

过去、现在、未来其实并不真正存在。

赛斯祂们不觉得有隐藏自己情感及思想的必要,因为祂们已经认清了所有意识及世界互相协助的本质,也了解了自己在其中扮演的角色。

当一个人出生又死亡了很多次,他起初以为每次死之后就是什么都没有了,但是等他发现生存仍然继续之后,惊喜之余,一种神圣的感觉便会油然而生。

在某方面来说,人们将生命看得太认真了;但是由另外一个角度来看,人们却又不将这种具游戏倾向的生存当作一回事。

所以,对待生活,要认真而不当真。
像玩游戏一样,玩游戏很认真,但是不会有谁把游戏里角色的生离死别当真,这并不妨碍我们去体验游戏。
战略上藐视,战术上重视,和上面的思想有异曲同工之妙。

身为一个导师,赛斯常常进入许多不同的世界,就像一个巡回讲课的教授,在不同地方及不同国家中讲学一样,但是也只有讲学这一点相同而已,因为赛斯必须先调整自己的精神架构,并深入了解各种不同的学生,才能真正的开始讲课。

在真实情况下,人们所认为的太空根本不存在。除了肉体感官的作用造成了人们对太空的幻觉之外,人们所接受的心理模式更加深入了这种幻觉,这种模式是人们,在这个物质系统中的意识,进化到某一个阶段时所采用的。

当人们到达或者进入物质生命时,心灵不是一张等着加写其他经验的白纸;人们带来了一个记忆库,其中资料之多任何电脑皆难望其项背。人们降生的第一天就带着足够的技巧与能力,虽然这些技巧与能力有些会应用到,有些不会,它们并非如人们所认为的那样来自“遗传”。

这些事物其实全部是心灵的,但这并不意味着,在物质宇宙中,人们就无法到其他星球上面去,因为在这个宇宙中,这么说就代表着,桌上不能摆书、不能摆茶杯,虽则桌子的本身并不具有实质的特性。

“时间”与“空间”是人这个生命体进入三维空间所预制的基本“程式”。

每种生命系统都有不同的假设程式。

全我,或者说灵魂的本质非常复杂,而且具有极大的创造力,比宗教中所提及的还要伟大。

灵魂能改变它意识的焦点,灵魂运用意识的方式,就像我们用大脑指挥眼睛看东西的方式一样。

“我”和“我”的意识,并非同一件东西,“我”的意识只是被“我”运用的一种东西而已,这一点适用于每一个这本书的读者,只是各位也许不知道这个潜藏的真相。所以灵魂——或是全我——比意识包涵的范围要广、要多。

人们在梦中努力工作的情形并不亚于白天。

赛斯和我们这个世界的接触,就如赛斯进入我们的梦中一样。赛斯清楚自己透过珍•罗伯特来口述书,但是同时也明白在原来环境中的自己,因为赛斯只投出部分的自己,就如同你们写信给朋友时,投递出你们部分的意识,而同时却清楚自己所在的房间是一样的。当然赛斯投射出的部分比你们写信的情形要多,赛斯的部分意识进入这位女士,不过这个比喻还算接近事实。

虽然物质空间是假相,但是这个幻想却是由广大实相所造成的,它有目的,也有意义。

物质世界是实相的“一种形式”,这样形容会比较好。

三维空间是个无价的训练场所,无疑的,人们目前所发展出来的个体与性格会永久存在,并成为有记忆的一部分,但是它只是整体的一部分而已,就像童年在生命中是非常重要的一部分一样。

肉体及环境是自己思想、感情的物质化反映。

在三维空间里,事物组合的方式和电视萤光幕组合光点形成影像的方式相似,但是两者之间当然有差异,“如果你们没有调准某种频道,你们就会看不到物质事物。”

各位其实在不知不觉中扮演着“变压器”的角色,自动的把非常特殊的电磁单位转换成物质的事物。人们处于一种“以物质为中心的系统”中,外围围绕着一些较弱的区域,其中存在着一些所谓的“假物质事物”。每一个思想及情感以一种简单或复杂的电磁单位存在——这是目前科学家尚不知道的事情。

思想及情感的电磁强度决定它们物质化影像存在的长短。

形相不可能永久存在,因为所有的意识都处于“不断变动”的情况中。

当人们想到别人的时候,人们会向外送出自己的部分能量,其强度稍次于物质,但是的确可以称为一个形相,这个形相由人们的意识向外投射,但是人们的自我完全不知道。赛斯在想到他人时也一样向外投射能量,所不同的是赛斯的意识可与那部分的能量共同进退,所以赛斯能和人们相互沟通。

若是不探讨的话,人们的意识就好像是被禁锢在脑袋里一样,叫人觉得每一个念头过去了就死了,每一个记忆遗忘了也好像是死了一样,事实并非如此,念头及记忆并不因为过了或忘了就死了。

第四章:转世剧

人们对自己在戏中所扮的角色专注得过了度,完全的投入了戏中的一切,以至于进入了剧中人的问题、挑战、希望、悲伤之中,完全忘记了这些只不过是他们自己,自导自演的戏剧而已。

此外还有其他的戏也同时在上演中,人们在那些戏中也有扮演的角色。那些戏自有他们自己的布景及架构,时代背景亦不相同。也许某一场戏名叫“十二世纪生活”,另一场戏名叫“十八世纪生活”,或者“西元五百年前”,甚至“三十世纪”。这些戏也还是人们自导自演的。

时间并非一连串的片刻。人们说的话、做的动作好像发生于时间之中,就像是椅子、桌子看起来占了空间一样,但是这些只是人们“预先”设计好的复杂结构而已,在戏中,这些复杂的结构,这些道具,必须要让人们感觉像真的一样。

比如说晚上九点你去看戏,而剧中的时间是早晨,演员正在吃早餐,你也就会接受剧中的时间,当作那是早上。

每一个人目前都涉身于一个大型戏剧之中,在其中人们全都同意以某些基本假设作为整出戏的架构,以便戏能演的下去,这些假设包括了——时间是由一个接一个的片段所组成、外在世界存在于创作及认知之外、人们被困于“肉体衣服”之中,以及人们受到时间与空间的限制。

在同样的理由之下,大家同意的其他假设还包括了——知觉来自肉体感官,也就是说信息来自外界,而非内心。所以人们被迫将注意力大量集中在所上演的戏上。这些一出出的戏及创作性的片段便是人们称之为转世的一生生经验了。

不同的戏基本上同时存在,但是那些仍然置身于这类复杂的转世剧情剧中的人很难看破它们。

戏好像一出接着一出不断在上演,所以这种连贯只加深了人们以为“时间是一连串片刻”的错误观念,以为时间循着一条直线,由不可溯的以往延伸向同样不可追的未来。

在每一出戏中,每一个人都面临不同的困难,而进步的判断标准,是以困难如何被解决与如何未被解决来衡量的。例如:在某段期间,人类有过伟大的突破,但那种进步以人类的衡量标准来看,可能根本不认为那是进步。

虽然用了“戏剧”的比喻,但是要知道这些“戏”是自然而然、自动自发的在进行,它们只有主要的架构,每个演员都可以在架构范围之内完全自由发挥。每个演员都同意戏中所有既定的假设,演起戏来也不需要彩排。这些戏都有观察者在观察,这一点在书中会讲到。就像是每一出好戏都有个贯穿全剧的主题,这些人生的戏也一样有它的主题。

进步与时间全然无关,却关系心灵与精神之焦点。每出戏都完全不同,所以认为今生是前生之果,或是因为前生做坏事,今生遭罚,都不正确。多世之生命其实发生于同时。

这些戏都有它的目的。在戏里人们那多重空间性的生命体能由自己所作所为中学到东西,它尝试各种数不清的身份、行为及态度,其尝试的结果亦影响了他人。

一提到“果”这个字,人们立刻联想到因果关系:先有因,再有果,这只是曲解的一个小例子而已。“语言思维”在表达上,具有天生就难以克服的困难,使得观念被扭曲,令得思想被看成是单线性导向的发展。

多重空间性的“我”正在学习实现的技巧。祂具有无穷的创造力与无限发展的可能,可是祂还要学习实现的方法,因为在祂之内远有许多未知的创造潜能,有待发掘与发挥。

多重空间性的“我”创造各种情况供自己操作,并给自己立下挑战。有些挑战在你们看来至少初期是失败的,没有关系,因为祂必须创造出能激发再创造的情况。这一切的创造皆出自自然及无拘的欢欣。

在“休息”时段中,祂还了解到是祂自己在写剧本,那时祂不再受到演戏时各种假设的角色所束缚。这些时段经常出现在睡眠状态及梦里情境中;但是也有其他的时刻,每个演员会忽然醒悟自己是在演戏,被道具所包围,会忽然看穿似真非真的制作假相。

这么说并不表示戏不真实,也不是说不必认真;重要的是扮演一个角色——一个重要的角色,每个演员必须了解制作的原意是什么,以及他在其中扮演的是什么。他必须在重重限制的三维空间布置之中实现自己。

在这个重要创作的背后,是伟大的协调。每个演员先要使自己在三维空间世界中实际出现,来扮演角色;除非多重空间性的“我”先将自己的一部分物质化,不然就无法在三维空间中演戏。

那多重空间性的“我”完全知道祂自己是什么,也同时以祂的真知实见参与在每一个祂制作的角色中。

存在于三维空间世界的“我”必须将注意力焦点放在世界中。一种内在的了解为他们提供了能量及力量的泉源。他们“最后”终究会明白:他们只是戏中的演员而已,再经过另一番领悟而回归于全我。

有些人虽出现在这些剧中,可是他们心中完全明白,他们自愿参加演出,也知道他们只是来演戏,来的目的是导引他人迈向了悟与发展。他们引导那些演员超越自我及自设之布景向外张望。这些人可以说是身在演员之列,但是却由别的生存层次来看戏,他们的目的是为那些三维空间的众“我”开启一道通往心灵的门户,将三维空间的“我”释放出来,以进入另一境界,获得更大的进展。

人们正在学怎么做一个共同者;人们现在了解了什么叫“神”,人们正在学习去做“神”;人们正学着了解什么叫责任——任何一个已然个人化的人都应有的责任;人们也在学如何处理自己的能量并将这个能量用于创造性的目标之上。

人们与所爱的人及所恨的人相处在一起,但是人们将会学会怎么去放开、化解仇恨,人们甚至能运用仇恨的力量将之转换成更高、更善的情操,最后将之转化为爱。

从一个广大一点的角度来说,肉体感官实际造出了一个物质世界,因而这个物质世界也就是唯一肉体感官能认知得到的世界,肉体感官本身就是伪装的一部分,它们就像戴在自然内在知觉能力上的眼镜,强迫人们只“看”得到物质世界的活动,所以他们只能告诉人们假相中发生了什么事情。例如:能认出演员的位置、知道钟上指的是什么时间,但是这些肉体感官不会告诉人们时间本身是假相,也不会告诉人们其他演员也是意识创造出来的,更不会告诉人们那些存在于物质之外而看不见的世界实际上是那么的显而易见。

人们能办得到运用自己的内在感官去认知存在于你们这场戏及所扮演的角色之外的世界。为了要做到这件事,人们当然必需暂时将注意力自五花八门的世间事物上转移——关掉肉体感官的感觉,把注意力放到原先所忽略掉的内我认知上。

这个做法很简单,而效果也很显著。肉体感官对内在感官而言,基本上来说可以说是人造的,就像眼镜和助听器之于肉体一般。所以内在感官很少在意识完全清楚的情况下被运用。

现在,假装你是站在一个打了灯光的舞台上,这个舞台便是你现在所处的房间,你把眼睛闭上,假装灯熄灭掉了,布景也被搬走了,你独自一个人在那儿。

到处是黑黑的,安静不要出声。开始尽可能生动的想象内在感官的存在,接着想象它们向你的肉体感官发出讯息,你心中不要想任何事情,也不要忧虑,尽量放松接收消息。耳朵轻轻的听,不是听物质环境的声音而是听内在感官传来的声音。

也许会有一些影像开始出现,你要像肉眼见物一般生动的接受这些影像。假装有一个内在世界存在,在你学着运用这些内在的感官去了解感觉它时,它会向你展现。

假装你这生对此内在世界而言一直是盲的,但是渐渐的你能在这个世界中看到东西。请不要用你最初看到的零碎不连贯的影像来评判整个内在世界,也不要用你最初听到的声音来评判整个内在世界,因为你运用内在感官的能力还不够完善。

在睡前或是休息时做几分钟这样的练习,你也可以在不花精神的日常家务中作此练习。

以上便是学习将焦点放在新层次知觉的方法,如同在陌生环境中,脑中会印下一些快照一样。就这样接受它们,在这个阶段还不要想以此来做全面性的评判与诠释。

每天练习十分钟就足够了。这本书就是赛斯经由这位女士出神时的内在感官所写出的,这种工作是高度有组织的内在精确性及训练的结果。在鲁柏将焦点放在物质世界的时候,他无法由赛斯处接收到讯息,也无法转换诠释各种讯息。所以内在感官即是提供各种不同空间讯息交流的管道。即使如此,信息在转换成物质文字时还是会有相当程度的扭曲,但是若非如此,讯息就根本传不过来。

赛斯不断在强调每一个人都形成了自己的环境,人们自己必须对自己的生命及环境负责。

如果不相信上面这一点,那么便是受到限制的人;而环境所代表的也只是物质世界知识与经验的总合。如果一直相信环境是客观因素造成的,自己与之无关,那么就会对大多数的事物感到无力改变,无力超越,也想不出其他还有什么改变方法。赛斯以后会教许多大幅度改变环境,令之成为美善的方法。

人们在每一生中都自选及创造自己的布景或环境;此生人们自选父母,自己安排童年以获取经历。剧本是人自己写的。

意识自我就像一个健忘的老教授,把这些全忘了,在剧本中有悲剧、困难或挑战发生时,他就怨天尤人。在这本书中,赛斯希望能精确地指出:究竟人们是怎么样创造了每一个经验的细则,如此人们才能真正开始有意识的负起创造的责任。

第五章:思想如何形成物质——调和点

从这一章开始使用第二人称:文中的“你”指读者,“我”指赛斯。因为每一句都要重构为陈述句的话太麻烦了……

你说的话含有讯息、感情及思想,很明显的:思想、情感和文字并不是同样的东西,在书页上的虽是象征,但是你承认它们与一些特定的意义相关联。平常你理所当然的用它们,而几乎不曾想到过这些象征——这些文字——并不等于是讯息或思想的本身,它们只是传输讯息或思想而已。

同样的道理,事物也是代表实相的符号,它们也像文字一样传递实相的意义。文字本身不是思想,事物本身也不是讯息。文字是表达的方式,物质事物也只是表达的另一媒体。

物质事物是另一种表达方式的结果,它们就跟文字语言一样也是你创造出来的,此处指的不是你光用手或经由某种制造过程就可以把物质事物制造出来,真正的意思是:它们是人类进化过程的自然副产品,就像文字一样。

你并不明白自己如何操纵与掌握文字,如何在成堆的符号中精确的挑选出足以表达特定思想的文字,所以就这个情形来看,你根本不明白你自己是如何思想的。

你是如何将本页的文字符号转换成思想而储备、甚而转变成你自己的思想的?这个过程你并不明白。既然你在意识层面上对平常说话转换的过程所知极少,当然你对自己在做的其他复杂的转换过程就更不知道了。例如,你不断的在创造你的物质环境以作为一种交流与表达的方式,便是这种复杂的过程之一。

只有从这个角度才能明白物质事物的真正本质,只有在体会到思想与希望不断的在转换成物质事物之后,你才能明白你是真正超越环境、时间及命运的。

也许你会辩说书是实际生产出来的,而不是由鲁柏脑袋中一蹦出来就是印好、订好的书,你也要借、要买才看得到,自然你会认为:“这本书肯定不是我的或我创造出来的,我并没有像制造言语一样的创造出这本书来。”但是在大家看完这本书之后便会明白:基本上来说是你们每一个人共同创造了你们手中的书,而你们整个的物质环境自然的出自你们的内心,就如同语言自然的出自你们的口一样。人在意识层面上也是这样不自觉的形成了物质事物,就像是他赋予自己呼吸的能力一样自动。

你们的物质世界依靠你们生存于其中及将注意力集中在里面才得以存在,物质宇宙对于不生存于其中的人来说完全不具实质。

其他种类意识的生命混住于你们世界相同的“空间”之中,他们感觉不到你们的物质事件,因为他们伪装系统的结构与你们的不同。你们感觉不到他们,一般说来他们也感觉不到你们。不过这只是一般性的说法,因为你们的生存空间在许多点的确会“重合”。

这些点你们可以称之为“双重空间”,其中含藏着极大的潜在能量,这些“调和点”的确是空间重叠的地方。有几处主要的“调和点”,其中在数学上确有不可思议之能量;次要的调和点则数目很多。

有四个绝对的调和点贯穿所有的空间,这几个调和点是能量流通的孔道,也是世界与世界间无形的通路,更是一个“变压带”,供应你们继续创造的能量。

你们的空间中有许多“次调和点”。你们以后会知道,这些点非常重要,能使你们思想及情感转化为物质事物。当思想或情感到达相当的强度时,便自动会吸引这些次调和点的能量,将此一思想或情感充分充电,并予以放大——非指尺寸的放大——这些点会对你们称之为时间及空间的东西造成冲击,所以在时空中有些点——这也是你们的说法——因为气旺而会较其他地方更有助益,在那儿思想及物质都能得到高度充电,以实际角度来说,就是建筑物能保存得很久,而附着于物质形象上的精神力量也能久存,比如说金字塔便是一个例子。

不论是绝对的、主要的或次要的调和点,都代表着纯能量的聚焦和踪迹,至于其大小则由极细至极巨——小的比科学家所知的任何最小粒子还要小,但却都由纯能量所组成。这些潜藏能量必须被思想或情感激发才能作用,但是物质办法却无法激发这种潜藏的能量。

在此提供你们或者数学家几个线索:在所有这些主调和点及次调和点的四周,地心引力总是不断的、细微的在改变,物理定律都会产生某种程度的动摇。次调和点具有辅助性的功能,以加强那形成各种世界的无形能量之网。虽然所有调和点都是纯能量的聚集或痕迹,但是主调和点与绝对调和点之间的能量差异极大,次调和点与次调和点之间的能量亦不同。

这些调和点都是能量浓缩聚集的地方。次要的调和点比比皆是,以实际的角度来说,它们影响你们的日常生活,在有些地方盖房子或建筑物较其他地方更好,因为在这些点上你们的健康与活力更得助益,同时植物也会生长得更好,种种有利的条件似乎皆已齐备。

有些人能直觉得感觉到这些点的邻近范围,它们与此世界以某种角度相接。调和点本身绝非物质的——也就是说我们看不见那些点。这些点可以用数学方法推算出来。总之它们是一种浓缩能量的形态,可以让人感觉得出来。

在某一特定房间中,某一特别区域的植物生长得会比其他区域好,当然这是指各处都具备同样必须条件——如光线——的情形下而言。人们的空间中到处散存着这些调和点,所以形成了一些看不见的角度。

“浓缩能量点”是由你们正常范围内的情感来驱动的,你们的情感及感觉能启动这些调和点而不管你们知道还是不知道调和点的存在。大量的“能”因情感或感受的驱动而附诸于你原来发出的想法或感受上,以加速感受及思想投射形成物质事物。不论情感的成分是什么,这种能量附加的情况只与其强度有关。

换句话说,这些点就像隐形的电厂,由足够强度的情感或思想所驱动。这些电厂以一种无选择的态度强化任何足以驱动它的情感或思想。

用非常简化的方式来说:任何意识主观的感觉都自动会变成一种电磁能量的单位,这些单位是构成物质事物的“底层”粒子,人们可以称之为尚未转变为物质的“初期粒子”。

这些电磁能量单位由种种各样的意识中自然流出,它们是意识在受到刺激之下所反应而形成的无形东西。它们极少单独存在,而以特定的法则结合。它们的形相及脉动状态时时在改变,而它们存在的时间长短则依其初发时的强度而定——也就是说,由其初发时背后的思想、情感、刺激或反应的强度来决定它们存在的时间长短。

在这里我仍旧以非常简化的方式来说:在某种情况下,这些电磁能量单位凝固成了物质,那些具有高强度的电磁能量单位便自动的驱动了前面所说的次调和点,调和点助长了将高强度电磁单位转化为物质的速度——这是用你们的话来说——对这些单位来说,分子就像星球这么大。原子、分子、星球以及这些电磁能量单位,其实是源自同一法则的不同显现与存在而已,由于你们处于一个相对的状况中,你们只执著于某种特别的时空,使得它们变得似乎是这么不可想象。

每一个思想或情感皆是以一个或一组电磁能量单位的方式存在,加上调和点的助长,它们通常以物质的形态出现。这种物质事物的显现,出自一种“中性”的“结果”,而不论其思想与情感的本质为何。心灵的影像加上强烈的情感便是相关的物质事物、环境与事件发生的蓝图。

所以情感或思想或心灵影像的强度是决定物质化的重要因素。

强度是电磁能量单位聚集的核心。用你们的话来说:核心的强度越大,物质化的速度就越快,不论其心灵影像是属于恐怖的还是愉快的都一样。所以这儿产生了一个很重要的问题:如果你的心灵活动很强烈,而你们以很生动的方式想象各种情景,那么这些情景便很快的就会形成物质事件;如果你们的思想高度的悲观,尽念着大灭难就要来临,那么这些想法就会忠实的复制于生活之中。

你们心中想象力及内在感受愈强,则你对内在感受转成实物方法的了解就愈显重要。在概念一开始产生时,你们的思想及情感就开始进行转换实物的历程。如果你们刚好住在调和环境强的地方,即是我称之为“传导性不寻常”的地方,而恰好你们思想的本质又悲观,那么你们会不断生病,遭遇灭难,因为所有的思想在这个环境中都会被助以能量。反之,若你们的情感及主观感觉都相当平衡、乐观、而具建议性的创造力,那么你们会有不寻常的好运道,因为你们乐观的预测很快就会实现。

这些调和点促成原子及分子活动的情形恰如太阳促进植物之生长。调和点促进原子及分子的活动,并且大大助长了其协调合作的能力,使得它们趋向于群聚在一起,进而结合成各种结构。

调和点放大并加强了潜藏于物质内本然自发的能力,令之成为一个“心灵发电机”,推动尚未变为物质的东西转化为物质。

这本书不是技术方面的著作,所以此时此地不宜详细讨论这些调和点的作用、性质或效果;也不必深论电磁能量单位——我刚才提及它们是意识自然流出的东西。但是我希望各位明白思想与情感经由一定的方法及定律形成了物质,虽然这些法则及定律目前尚不为人知。在其他的资料中,我会另行详述这些过程,供愿意进一步研究的人,或愿意由科学角度来看的人参考。

所有的意识——包括细胞的意识——皆在放出这种东西,其差异仅在程度的大小而已;它们使你们整个大气中充满了看不见的电磁网,由这个网中,形成了物质的各种粒子。

在人类真正了解“由念成相”的过程之后,能导致所谓的现代技术全面修正,而使得建筑物、道路及其他结构保存得更久。由于你们忽视了物质事物背后的心灵力量,你们无法有效的运用那些实际上已存的方法,也无法自那里获益。你们不会了解你们物质世界的真正原动力来自心灵,除非你们先了解你们自己心灵实相是独立于物质法则之外的。

我的首要目的便是使诸位明白:你们心里面有个“全我”,你们是那“全我”的一部分。同时我要为你们清除一些障碍,这些包括了理性与迷信的种种障碍阻碍了你们对自己潜能的了解,也束缚了你们本来的自在。然后,你们或会知道如何从多方面去运用你们的自由。

第六章:灵魂及其知觉的本质

灵魂不是你们所拥有的东西,它就是你们自己。我宁可常用“全我”而少用“灵魂”这个名词,这是因为“全我”比较不会引起错误观念与联系的缘故,而且“全我”这个名词由字面来看也比较不会牵扯到宗教。

你们的毛病在于你们常常认为灵魂或全我是一个封闭式、静态、属于你、而并不是“你”的“东西”。实际上灵魂或全我——换言之就是你们最亲密、最有力量的内我——“永远”而且必须处于“恒变”的状态,所以它并非像是一件珍藏的宝贝,它是活的、有反应的、而且非常好奇。它形成了血肉、大地,恒处于蕴蓄变化的状态之中。

灵魂或全我基本上来说是存在于其他的空间中,在那里它并不需要靠到达什么目的地才能有所收获。这里说的到达包括精神上的及其他方面的。

灵魂或全我恒处于变迁、学习或进展的状态中,它的发展与主观感受有关,而与时间或空间无关,这种情形并非像听起来这么神秘。每一位读者都在玩一种游戏,在游戏之中你的自我意识部分假装不知道你的全我本来就知道的事情,因为“自我”既是“全我”的一部分,所以基本上它一定知道这些事情,但是在它全力将焦点集中于物质世界时,它假装不知道,直到它觉得自己能在物质事物中运用这些知识为止。

所以你们的确有进入内我的途径,你们并没有与你们的灵魂或本体分家。你的“自我”宁可自任掌舵的龙头,因为在风云莫测的物质大海中鼓浪前进的是它,它不愿在考验之中分心。

通往心理及心灵的通道永远存在,讯息在多重“我”的层次中被来回的传递着。“自我”毫不犹豫的接受由内我传来有用的消息与资料,事实上它的地位仰仗的都是这种对内在资料毫不怀疑就接受的态度。“自我”换句话说即是你的“外我”,它之所以能保持它自己的安全及它那看起来好像在发号施令的地位,完全由于你们自己的内心层面允许它这么做的原故。内心层面也同时维持了肉体的运作,并与外来的以及内在的众多刺激保持沟通。各种或然世界的生存经验以及转世的经历并不会使灵魂或全我萎缩,反而是向外扩大。有关“或然世界”我以后再解释。

完全是由于你们对自己“全我”的观念非常狭窄,才造成你们目光如豆的思想。你们的身体中有千千万万个细胞,但是你们却称身体为一个单位,还认为它是属于你的。你们的确由内而外形成了你们自己的肉体,但是材料却是无数小生命,而每一个小粒子都自有生命的意识。物质可以丛聚,同样的,意识也可以丛聚,每一个个体都有它们自己的命运、能力及潜能。你们自己的全我不受任何限制,对“全我”而言,“界限”根本不存在,因为界限所意味的是限制与不自由。

我愿本书不仅为各位肯定“灵魂不死”,也能帮助你们认识那活活泼泼在你们内心中的世界。话说回来,你们必须先对你们自己心理及心灵的结构有点了解,等到你们相当了解你是谁、是个什么之后,我才能更清楚的向你解释我又是谁、又是个什么。我希望介绍你认识深藏在你内心的创造力的各种面貌,这样你们便能用以开扩发展你们整个的体验。

很多人以为灵魂是不朽的自我,忘记了你们所知的自我只是“我”的一小部分,而这一部分永远不断的在投射。由于你们对自己实相的空间了解太少,所以你们的观念必然受到限制而狭窄。当人类想到“不朽”时,似乎只想到“自我”的进步得以不朽,但又不愿这种进步牵涉到变迁。人类的宗教信仰令人相信他们有灵魂,但他们却又问都不问灵魂是什么?常常误认灵魂为人们所拥有的一种东西。

即使你们现在已经知道了灵魂或全我是处于不断改变的状态中,它的变化并不经常在预期之中,事实上在大部分情形下,它的变化毫无轨迹可循。你们固执的将注意力焦点只集中在与自己行为相类似的地方,据此类推,你们建立了一套理论,认为每一个自我皆循着某种公式在活动,而你所走的也不过是大家都走的路而已。这种理论使你们无法真正认清自我,也由于这个原因,你们采用同一扭曲的观点来看灵魂,所以你们对灵魂的观念也是错误的,这个错误甚至发生在你们对肉身性质的认知上。

即使是难逃一死的肉身也比你们所知的要神奇、美妙的多,它具有的能力比你们归纳出来的要多得多。你们不知道真正知觉的本质是什么,甚至连肉身的知觉范围都还了解不全,所以你们也就不了解灵魂的知觉究竟如何。毕竟灵魂最重要的特性便是知觉与创造。请记住你便是整体,所以在你内心的灵魂始终在知觉之中,它认知的方法始终如一,不管是在你的出生前还是在你肉体死亡后都一样。所以基本上你的灵魂不会因你肉体的死亡而忽然改变它的知觉方式与特性。

因此你们现在就可以知道灵魂究竟是什么,它不是一个在你们死后才拥有的东西,也不是一个必须拯救或赎罪的东西,它是一个你无法失去的东西。你们说:“必须拯救灵魂,否则就会失去它。”这种说法真是误解、扭曲得太历害了。你们的这一个部分是不会被毁灭的。我们在谈到宗教与神的观念那一章时再来细谈。

你们那有独特个性的自我——即你们认为最重要、最能代表自己的那一部分也永远不会被毁而失去,它虽然是你灵魂的部分,但却不会被灵魂吞食,也不会被抹杀,更不会被征服,甚至不可能被分隔。它只是你们灵魂的一面。你这个个体——不论你怎么定义——永远存在。

自我会继续成长及发展,但是它的成长与发展关系于它是否能了解领悟到:虽然它是单独的个体,但在同时,它也是灵魂的一种显现,一直要到它明白了这一点之后,它才能开始在创造中尽量发展,以及运用它本来具足的能力。

不幸的是:用很简单的话来告诉你们——你们个人将永存,不要再担心——并不难办到,可是这种说法也会带来危险。就像寓言故事所说的一样,太过单纯的故事反而会导致危机。所以我再重申,事实是你的现在、过去、将来——这是用你们所了解的时间方式来说——所有的生生世世都是你灵魂的多种显现罢了!

这些独立存在于灵魂中的“个体”是灵魂的一部分,每一个个体都能自由创造与自由发展。

每一个人心里都存在着一个内在通讯网,你的任何一个个体所获的经验及感受都能为你所有的其他个体所分享,这种通讯并不需要在一个个体的肉体死亡后才能发生,它的发生就在现在——此时此刻。灵魂本身,我前面提过,不是静止不动的;它由组成它的每一个独立存在的个体中汲取经验,以供它不断的成长与发展。用简化的办法来说:“它比组成它的全部总合还要大得多。”

生命是开放的,在你们的物质世界系统中,你们认知的性质相当的囿限了你们对生命的观念及想法,因为你们有意的将焦点放在一个划定的界限内。但基本上,意识绝不是一个关闭系统,所有的障碍、界限都是幻想,所以灵魂本身不是一个关闭式的系统。

这里所提到的许多观念要用文字表达非常困难。因为你们的自我不敢承认自己的灵魂是一个无边无际的开放式精神系统,所以你们不敢承认灵魂就像是“一个具创造力的巨大能场”,向每一个方向放射,可是事实的确如此。

我告诉你们这些,也同时再度提醒你们:你们目前的这个个体绝不会失去。灵魂的另一用词是全我。你们必须明白对“灵魂”或“全我”下定义并不简单,因为即使是我略为做一点有条理的说明,你们都必须要先对精神、心灵及电磁这些名词有相当的了解,同时还要了解意识及其活动的基本性质,这样才能揣摩到一点什么叫灵魂或本体。但是你们却能在“悟”中顿时明了灵魂或全我的本质是什么。在许多方面来说,自“悟”中所得到的了解胜过任何经由其他办法所得的了解。

要想对灵魂有所“悟”,其首要条件在于你必须有大惑“得解”的渴望,如果这种渴望够强,那么你便会自动的被导引向生动、正确、出自内心的“悟”了。若要培养这种渴望也有办法,我在书的后章中会告诉你们一些方法。

现在我来说一个有效而简单的练习:本章读到这里暂时放下,闭上眼睛,努力用心感觉你们自己呼吸及生命力之能量泉源。有些人第一次试就会成功,而其他的人也许还要多试几次。当你感觉到你内在这种力量的泉源之后,开始感觉这种力量由你整个肉身向外流出,由指尖、脚尖、全身的毛孔朝外放射,以你自己为中心,遍及每一个方向。想象那些放出的光不会萎缩或减弱,它们穿过植物、穿过云层、穿过地心,直向宇宙之外延伸。

我说的这个练习并非只是象征式的,在开始也许需要借助想象力,但这个练习却是根据事实而得,你们意识的放射与灵魂的创造力正像这种情形一样向外伸展。这个练习能让你们明白一些灵魂真正的本质、创造力及活力,你们由这个灵魂获得能量,而对这个灵魂来说,你们是其中一个个体,一个独特的部分。


待续……

不好意思,短时间内我不会更新了,因为我要做的事情太多了,暂时没时间精力做这些了。这个摘录只是一些很粗浅的摘录,以后我有空的话会好好把赛斯资料提炼一下的。

不要因为不好的人和事让自己堕入黑暗。守卫内心世界。

情感的力量非理智能驾驭,提前用理智保护好情感。值得的人才付出真心。

付出的真心像泼出去的水,后悔是没用的,别犹豫,向前走。

情绪是有“惯性”的,在一种特定情绪上灌注注意力的时间越长/意念越多,这种情绪的能量越强大,“惯性”也就越大。因此,如果不想体验负面情绪的话,就算再悲伤再痛苦,也要把注意力灌注在正面情绪上。

思想和情感都是有能量的,慎用。

除了特殊的修行之外,过度的道德感是不好的。在弗洛伊德看来,死的本能和爱的本能是人类两种最基本的驱动力,其中爱的本能主要表现为性的本能和生的本能。过度的道德感会极大地压制爱的本能。

把心灵寄托放在他人身上是极其不明智的,但却是难以避免的一种选择。正如《唐人街探案3》最后讲的从小缺少父爱的女孩对年长男人特别渴求一样,男孩/女孩缺少母爱/父爱/母爱与父爱会产生六种组合(家庭和谐的孩子很幸运,这里就不讨论了),这六种组合会使孩子产生特定的依恋类型。当然可以利用这些依恋类型去体验别样的感情,但如果想要稳妥一些的话,还是尽快发现自己的依恋类型然后矫正之。因为这个世界上真正善良的人其实很少。


前言

众所周知,C语言里面有一个qsort()函数,底层是结合了回调函数的快排,功能很强大,可以实现任意类型的数组排序,今天我们就来复现一下。

目标:实现一个sortArray()函数,实现任意类型的数组排序。

回调函数

所谓回调函数,本质上就是函数指针做函数参数。

C语言嘛,万物皆可指针,当然函数也不例外。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

void func(void)
{
printf("Hello World\n");
}

int main(void)
{
printf("%d",func);
return 0;
}

以上程序执行之后输出的不是Hello World,而是类似4199760这样的一串数字。实际上这就是函数入口地址,只不过是十进制显示的。

要实现任意类型的排序,那么待排序的元素类型就不确定,有可能是整数,有可能是小数,还有可能是结构体,我们不可能确定待排序元素的类型。C又没有面向对象,解决办法就是抽象出两个层:服务层用户层

在服务层写好排序算法,然后抽象出一个涉及具体元素的函数,交给用户去实现,因为只有用户知道这个类型是什么。服务层只是在底层提供一个统一的接口,配合用户层利用回调函数完成整个功能。

用户层就是实现具体的回调函数。用过qsort()函数的同学应该都明白,你得写一个int compar(const void *, const void *)这样的函数然后把函数名当作参数传入qsort(),这里就不赘述了(懒……

排序算法

如果从排序效率来说的话,当然是快排高咯,但是本文重点是任意类型的数组排序,所以就只演示一下用冒泡排序(用快排的话指针满天飞太吓人了……)

冒泡排序没啥好说的,应该都会。涉及到具体的元素,比如比较两个元素大小只能用回调函数了,但是交换任意类型的两个元素呢?

虽然也可以再用一个回调函数,但是原则是:如果能自己做到就不要麻烦用户

那么,有没有什么办法不用回调函数实现任意类型的元素互换呢?如果是int,直接定义一个临时变量然后交换就好了,可是现在我们面临的是任意类型……嗯……有了!我们有元素首地址eleAddr,有每个元素的大小eleSize,那么直接互换内存不就好了?对!用memcpy()函数,bingo!

于是服务层的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void sortArray(void *arr, int eleSize, int len, int (*myCmp)(const void *, const void *))
{
char *temp = malloc(eleSize);
for (int i = 0; i < len - 1; i++)
{
int isSwapped = 0;
for (int j = 0; j < len - i - 1; j++)
{
char *eleAddr = (char *)arr + eleSize * j;
char *eleAddrPlus = (char *)arr + eleSize * (j + 1);
if (myCmp(eleAddrPlus, eleAddr))
{
// 利用memcpy()交换元素
memcpy(temp, eleAddrPlus, eleSize);
memcpy(eleAddrPlus, eleAddr, eleSize);
memcpy(eleAddr, temp, eleSize);
isSwapped = 1;
}
}
if (isSwapped == 0)
{
break;
}
}
free(temp);
temp = NULL;
}

整数数组排序

然后用户层的回调函数实现起来就很简单了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int myCmpInt(const void *a, const void *b)
{
const int *p1 = a;
const int *p2 = b;
return *p1 > *p2; // ">" 降序排列
}

int main(void)
{
int arrInt[] = {2, 5, 7, 5, 4, 3, 8, 21, 9, 0, 99};

/* 动态获取长度 */
int lenArrInt = sizeof(arrInt) / sizeof(int);
sortArray(arrInt, sizeof(int), lenArrInt, myCmpInt);
for (int i = 0; i < lenArrInt; i++)
{
printf("%d ", arrInt[i]);
}
printf("\n");

return 0;
}

输出结果是:

1
99 21 9 8 7 5 5 4 3 2 0

结构体数组排序

直接内存互换的好处就在这里:无论是什么类型,直接在最底层执行内存互换,还有什么换不了的?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
struct Person
{
char name[64];
int age;
};

int myCmpPersonAge(const void *a, const void *b)
{
const struct Person *p1 = a;
const struct Person *p2 = b;
return p1->age < p2->age;
}

int myCmpPersonName(const void *a, const void *b)
{
const struct Person *p1 = a;
const struct Person *p2 = b;
return strcmp(p1->name, p2->name) < 0;
}

int main(void)
{
// int arrInt[] = {2, 5, 7, 5, 4, 3, 8, 21, 9, 0, 99};
struct Person arrPerson[] = {
{"Alice", 18},
{"Sakura", 19},
{"Homura", 20},
{"Mei", 17},
{"Yuzu", 18},
};

/* 动态获取长度 */
// int lenArrInt = sizeof(arrInt) / sizeof(int);
// sortArray(arrInt, sizeof(int), lenArrInt, myCmpInt);
// for (int i = 0; i < lenArrInt; i++)
// {
// printf("%d ", arrInt[i]);
// }
// printf("\n");

/* 动态获取长度 */
int lenArrPerson = sizeof(arrPerson) / sizeof(struct Person);
/* 根据结构体元素的年龄排序 */
printf("Order by Age-----------\n");
sortArray(arrPerson, sizeof(struct Person), lenArrPerson, myCmpPersonAge);
for (int i = 0; i < lenArrPerson; i++)
{
printf("Name: %s\tAge: %d\n", arrPerson[i].name, arrPerson[i].age);
}
/* 根据结构体元素的姓名排序 */
printf("Order by Name----------\n");
sortArray(arrPerson, sizeof(struct Person), lenArrPerson, myCmpPersonName);
for (int i = 0; i < lenArrPerson; i++)
{
printf("Name: %s\tAge: %d\n", arrPerson[i].name, arrPerson[i].age);
}

return 0;
}

输出结果是:

1
2
3
4
5
6
7
8
9
10
11
12
Order by Age-----------
Name: Mei Age: 17
Name: Alice Age: 18
Name: Yuzu Age: 18
Name: Sakura Age: 19
Name: Homura Age: 20
Order by Name----------
Name: Alice Age: 18
Name: Homura Age: 20
Name: Mei Age: 17
Name: Sakura Age: 19
Name: Yuzu Age: 18

以上。


前提

此文所说的一些方法主要针对像我一样找番只会百度的萌新。

如果你对压制组P2P协议等关键词比较了解,那么这篇文章就是废话了。

百忙之中下一步闲棋

这段时间我特别忙,忙着忙着,感觉都快要迷失自我了。

忙,心亡,也就是心逃跑了,心不在祂自己的位置上了。那么,注意力和感知力,以及对生活的掌控力,就容易失去。

百忙之中下一步闲棋,是很有必要的。

所以,我决定重温Citrus。^_^(其实只是想看百合了

门户网站

最常见的就是通过门户网站观看动漫了。

而对于各种被“和谐”的番来说,比如Citrus,B站是指望不上了(以前B站还有的时候我专门付费以示支持结果过了一段时间就被下架了……)。

各种小型门户网站也面临随时被下架的可能(之前我收藏的网站基本都被下架了)。

樱花动漫可以看无修版的,唯一的缺点就是画质不够清晰。

和许多人一样,网上找了一大圈,要不就是和谐版,要不就是模糊的,根本没办法好好欣赏动漫。

这些难不倒我对百合的喜爱。所以,我摸索出了一套购买正版动漫和漫画以及找番的方法和工具链。

购买正版

这篇文章不是讲怎么购买正版,更何况我知道,许多人是不会购买正版的,因为没必要,也没有这种意识。我以前也是。

但是,一个良好的文化环境,必然是由创作者和消费者共同维持的(当然,这里不讨论政治)。

对于创作者的支持,真的很重要。因为大多数创作者也是要为生存发愁的。

我记忆中,许多优秀的动漫作品,都因为资金问题被迫中止或是明明有第二季但是停止了。

如果真的喜欢,并且有购买能力的话,还请多多支持正版吧。

国产正版动漫/漫画购买渠道很容易找到,不赘述了。

要购买(特别是在大陆被广电禁了的)日本正版动漫/漫画的话,通过常规渠道不太好购买。

在某宝上如果你没有一定的分辨能力很容易买到盗版。比如要购买Citrus的漫画的话,贴吧上有一个教你分辨正版漫画的贴子就得先看看。

日本正版动漫/漫画的话,可以通过亚马逊的日区(一般叫日亚)进行购买。关于日亚的教程网上有很多,这个也不是本文的重点,就不赘述了。

科学上网

通过科学上网,去到墙外观看动漫是一种选择。

可是通常来说,免费梯子速度不够快,容易导致视频卡顿,而速度快的可能又要收费。

有没有更好的办法?有!

BitTorrent

技术,是为了全人类的幸福而服务的——这一点我深信不疑。

2003年,软件工程师Bram Cohen发明了BitTorrent协议。

BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断向其他下载者上传已下载的数据。而在FTP,HTTP协议中,每个下载者在下载自己所需文件的同时,各个下载者之间没有交互。当非常多的用户同时访问和下载服务器上的文件时,由于FTP服务器处理能力和带宽的限制,下载速度会急剧下降,有的用户可能访问不了服务器。BT协议与FTP协议不同,特点是下载的人越多,下载速度越快,原因在于每个下载者将已下载的数据提供给其他下载者下载,充分利用了用户的上载带宽。通过一定的策略保证上传速度越快,下载速度也越快。在很短时间内,BitTorrent协议成为一种新的变革技术。

通过BT种子、磁力链接,可以搜索到许多拥有情怀和技术的压制组、字幕组制作的优秀资源。

但是,BT/磁力门户网站通常是被屏蔽了,或者会有很多广告,速度也不尽人意。

这时候,开源精神派上用场了。

GitHub上有一个优秀的开源项目——magnetW,谁用谁知道。更赞的是,作者还是中国人!

还有一个门户网站:蜜柑计划也是不错的。

然后就是下载了。在大陆,免费版的我目前只知道迅雷,其他免费小众下载器也大多是迅雷破解换个壳。

这里给出早已绝版的迅雷极速版ThunderSpeed:

链接:https://pan.baidu.com/s/1vimdp7g7nRgSQmXStRGmvw
提取码:46y7

这是以前迅雷为了挽回市场临时推出的良心版本。

海外有一个qBittorrent也是很良心的,不过我一般就用ThunderSpeed,下载无修动漫资源是足够了。

播放器

分辨率高不等于画质就好,画质还和码率、帧率、编码方式等等有关。事实上,播放器也是影响画质的一个因素。

Windows10自带的媒体播放器在播放高码率的mkv视频的时候偶尔会出一点bug,这里推荐一款超级好用的,而且还是免费的视频播放器:PotPlayer,直接去官网下载即可。看见英文不要怕,许多优秀的软件都只有英文官网,一定要习惯去英文官网下载。现在的中文互联网,到处都是坑(海外也有,但相对好一些)。

解决之道

以上这些技术只是一时不得已而为之。

一个良好的环境应当是能够

  • 让人们方便地购买正版作品
  • 让人们光明正大地讨论作品
  • 让人们领略到多样的文化与精神

最终的解决办法,只能是提高人们的意识水平


起因

我的手机已经用了挺多年了,比较卡了,于是计划着买一个新手机。因为还是学生嘛,所以预算就一千到两千就行了。打开浏览器,逛了一大圈,发现要么是“水滴屏”,要么是“升降摄像头”,要么是“打孔屏”,要么是其他奇奇怪怪的异形屏……太丑了吧。我就只想买一个普普通通的矩形屏幕手机,然而淘宝上看了一大圈,居然没有一款一千到两千价位的矩形屏幕手机!我原以为那么多的款式里至少应该有一个是矩形屏幕手机吧,但我真的高估了逐利资本的下限,着实被恶心到了。

然后我妥协了,只要不是“升降摄像头”或者“打孔屏”就好。然后我在考虑其他因素的时候,又被各种噱头和系统内置广告给恶心到了……

所以我决定写一篇文章,吐槽一下目前的手机设计,同时描绘一下我心目中的理想型手机。

特征

矩形屏幕

看一款手机的设计,最简单的就是看屏幕。在我看来,最好的设计,其实就是最简单的设计:矩形。如果技术不够,没关系,大额头也很好看的,但请不要整出一些奇形怪状的屏幕然后说这是全面屏。在这一方面,Google的Nexus系列和Sony的Xperia系列做得不错。(Xperia太贵了只能以后买了……)

  • 算力

    不可能因为你搞了一个异形屏幕,GPU就不去算那一部分的内容了,因为那样反而更慢。屏幕是由像素矩阵组成的,矩阵的大小是由两个整数(M, N)决定的,GPU直接用算法处理矩阵才是最高效的。所以,手机的GPU是参与运算了原矩形屏幕的所有内容,但是异型屏幕少显示了一部分(你也可以通过截图之后看看截的图是不是矩形来验证这个观点)。也就是说,虽然异形屏显示不完整,但GPU是全部运算了的。异形屏是在浪费GPU的资源。

  • 系统

    GPU算出来像素矩阵之后,本应该直接显示在屏幕上的,但是因为异形屏的奇形怪状,最终结果并不能直接显示,而是还要通过系统层面的适配,这就加大了系统的开销,一定程度上让系统变得臃肿而复杂了。

  • 美观

    屏幕的四角都是弧形我还能理解,可以接受。但屏幕的边缘不是直线,甚至屏幕的一角被打了一个孔,好看吗?如果不是亲眼看见“打孔屏”这种东西,我根本不相信人类居然会设计出如此难看的屏幕。为了“屏占比”这个没啥参考价值的指标,本末倒置。对于手机来说,“屏幕”这个概念,有时候不仅仅指显示屏,还隐含着一种“手机物理边框”的“潜意识”。因此,“升降摄像头”在我看来也是一种破环美感与和谐的设计。

操作系统

好的操作系统(包括UI部分),意味着没有各种负优化,没有各种诱导,没有把用户当成傻子,没有化简为繁。说起来好的操作系统,目前国内能用的只有 iOS 了。Google的Nexus系列和Microsoft的Windows Phone系列在国内都基本扑街了。我并不是排斥本地化,我只是排斥诱导消费和广告轰炸。

  • 设计哲学

    一个好的操作系统,可以参考Arch Linux的设计哲学:简洁——避免任何不必要的添加、修改和复杂增加;现代——尽全力保持软件处于最新的稳定版本;实用——最终的设计决策都是由开发者的共识决定,开发者依赖基于事实的技术分析和讨论,避免政治因素,不被流行观点左右。

  • 隐私保护

    一款拥有良好设计的手机应该尽可能地保护合法用户的隐私。在这一点上,国内的小米手机做了一个良好的示范。当然,公安机关可以依法查看犯罪嫌疑人的隐私数据。

  • 权限开放

    用过电脑的都知道,电脑上你的日常操作是以一个用户(user)的身份进行的,但是某些情况下你也可以使用管理员(root/admin)身份进行操作。但是国内的手机基本上都不提供管理员权限,导致部分手机本来可以使用的功能无法使用。良好的设计哲学可以带来良好的权限开放。权限开放,意味着提供开发接口,提供root权限,提供定制化的可能性。在这一点上,国内的一加手机做得不错。鉴于现实情况,权限开放可能需要有一个门槛。


前言

我这标题起得怎么这么像课程论文呢……

啊,放心啦,这不是课程论文,这只是一个有趣(且值钱)的程序。

起因是这样的。我加了几个软件兼职群,前几天我发现其中有一个项目,是利用FFT识别信号啥的,报价700,性价比对于我来说我觉得挺高的了,看样子好像也不难,我就接了。


过程

1. 理解题意

题目要求是这样的:

然后有一个五百多KB的dat文件和一个频号对应表。就是说,要用傅里叶变换把dat文件里具体有哪些号码给识别出来。

看着还有点难度,看看PDF,噢,原来这是格拉斯哥大学工程系的一个Assignment……

以前有个新闻是说南京有个大学生通过分析采访视频里面的拨号音知道了周鸿伟的手机号码,大概就是这么回事儿。

2. 读取数据

打开dat文件看一下,是这样的:

大概有五万多行。吭哧吭哧搞出来了数据读取模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
def read_data(file):
''' 读取数据 '''

data = []

with open(file, encoding='utf8') as fo:
# 读取文件的每一行
lines = fo.readlines()
for line in lines:
# 处理得到采样数据
data.append(int(line.split()[1]))

return data

OK,准备工作到此结束。

3. 频谱图

要识别信号,首先得看一下信号大概长啥样子。这肯定要用到numpy和matplotlib咯。

学习了一下numpy的语法,参考了一下网上的代码吭哧吭哧搞出了频谱图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def calc_fft(data):
''' 计算频谱 '''

# 采样长度
length = len(data)

# 根据采样率和采样长度生成时间序列
t = np.linspace(0, length/SAMPLE_RATE, length)

# 将采样数据转换成numpy的array格式
xt = np.array(data)

# 利用np.fft.rfft()进行FFT计算
xf = np.fft.rfft(xt) / length

# 根据采样率和采样长度计算出每个下标对应的真正频率
freqs = np.linspace(0, SAMPLE_RATE/2, length//2+1)

# 取绝对值表示幅值
xfa = np.abs(xf)

return (freqs, xfa)


def plot_diagram(data):
''' 绘制数据的时域和频域图像 '''

length = len(data)
t = np.linspace(0, length/SAMPLE_RATE, length)
xt = np.array(data)

(freqs, xfa) = calc_fft(data)

# 作图
plt.subplot(2, 1, 1)
plt.title("Time Domain")
plt.xlabel("Time (s)")
plt.ylabel("A")
plt.plot(t, xt)

plt.subplot(2, 1, 2)
plt.title("Freq Domain")
plt.xlabel("freq (Hz)")
plt.ylabel('A')
plt.plot(freqs[1:], xfa[1:]) # [1:]去掉f=0的直流信号

plt.subplots_adjust(hspace=0.4) # 拉宽上下子图距离,不然会挡住字
plt.show()

画出来是这个样子:

嗯……还挺好看的?

4. 检测频率

要识别号码,首先得知道频率和号码之间的对应关系。查了查,这应该是一个DTMF,所谓的双音多频。

这里他们的对应表并不是国际标准推荐的,但是基本原理一样(个鬼啊!后面就会有坑。我怀疑这是格大专门搞来坑人的)。

然后参考了一下网上的代码吭哧吭哧搞出了频率:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 计算频谱
(freqs, xfa) = calc_fft(data)

# 寻找高频和低频
local = []
for i in np.arange(1, len(xfa)-1):
if xfa[i] > xfa[i-1] and xfa[i] > xfa[i+1]:
local.append(xfa[i])
local = sorted(local)
loc = np.where(xfa == local[-1])
high_freq = freqs[loc[0][0]]
loc = np.where(xfa == local[-2])
low_freq = freqs[loc[0][0]]
# 查看具体频率,调试很有用
# print('high_freq, low_freq = {:.2f}, {:.2f}'.format(high_freq, low_freq))

5. 识别号码

找到高低频之后,接下来只需要把频率送到一个函数里进行判断就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'''
209 336 477 633
303 1 2 3 A
230 4 5 6 B
148 7 8 9 C
59 * 0 # D
'''
FREQ_ROW = (303, 230, 148, 59)
FREQ_COL = (209, 336, 477, 633)
# 频率号码对应表
FREQ_TABLE = {
(FREQ_ROW[0], FREQ_COL[0]): '1',
(FREQ_ROW[0], FREQ_COL[1]): '2',
(FREQ_ROW[0], FREQ_COL[2]): '3',
(FREQ_ROW[0], FREQ_COL[3]): 'A',

(FREQ_ROW[1], FREQ_COL[0]): '4',
(FREQ_ROW[1], FREQ_COL[1]): '5',
(FREQ_ROW[1], FREQ_COL[2]): '6',
(FREQ_ROW[1], FREQ_COL[3]): 'B',

(FREQ_ROW[2], FREQ_COL[0]): '7',
(FREQ_ROW[2], FREQ_COL[1]): '8',
(FREQ_ROW[2], FREQ_COL[2]): '9',
(FREQ_ROW[2], FREQ_COL[3]): 'C',

(FREQ_ROW[3], FREQ_COL[0]): '*',
(FREQ_ROW[3], FREQ_COL[1]): '0',
(FREQ_ROW[3], FREQ_COL[2]): '#',
(FREQ_ROW[3], FREQ_COL[3]): 'D',
}


def judge_char(high_freq, low_freq):
''' 判断字符 '''

p = ''
delta = 10 # 频率识别允许误差半径

for row in range(len(FREQ_ROW)):
for col in range(len(FREQ_COL)):
row_check = FREQ_ROW[row]-delta < low_freq < FREQ_ROW[row]+delta
col_check = FREQ_COL[col]-delta < high_freq < FREQ_COL[col]+delta
if row_check and col_check:
p = FREQ_TABLE[(FREQ_ROW[row], FREQ_COL[col])]

return p

用了一个字典,看起来优雅一些。

6. 分离单音

慢着!这号码是有顺序的,即要识别出正确的拨号顺序,而这是时域的信息,所以,光是频域还不行,得时域和频域结合起来看。

而从全局频谱图来看,时域信号显然不是等间隔的,所以没法等间隔提取单音。

一开始我想是检测时域拨号上升沿,即把一次拨号当成一次触发,触发flag上升沿检测识别,持续一段时间,如此循环就能把时域给走一遍然后把每一次拨号都检测到。

最后用了个比较复杂的方式写出来了。我没想到我有一天居然会用软件实现一个信号上升沿触发机制……

燃鹅,误差很大,好多位都没有识别出来。识别出来的数字倒是对了。怎么看对不对呢?我用的笨办法,用magic number截取时域信号看频谱然后人工查表识别。

我以为是上升沿检测的问题,毕竟在Python里面实现一个上升沿检测并且触发信号是“检测到号码”确实于我而言有点复杂,而一旦程序复杂就容易出错。

后来换了一种思路,检测一段时间内的时域信号峰值的最大值,大于一个阈值就判定为拨号中,也写出来了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def detect_all(data):
''' 识别所有号码 '''

length = len(data)
result = [] # 结果
digit = [] # 待处理的一位拨号音频数据

# 最少连续取样间隔,保证间隔内至少有一个完整的最低频率信号周期
# 通过采样率除以最低频率向上取整计算得出
# 对于msc_matric_5.dat,间隔是17
interval = int(np.ceil(SAMPLE_RATE / min(min(FREQ_ROW), min(FREQ_COL))))
# print(interval)

# 检测开启阈值,大于此阈值才识别信号
# 通过 (平均值 + (最大值-平均值)*比例) 计算得出
# 比例值不能太大也不能太小,这里取0.2
# 对于msc_matric_5.dat,阈值是3261
threshold = int(np.mean(data) + (np.max(data) - np.mean(data))*0.2)
# print(threshold)

for i in range(length - interval):
# 用了个列表生成式,根据阈值和间隔判断是否是有效信号
if np.max([data[i] for i in range(i, i + interval)]) > threshold:
digit.append(data[i])
else:
if len(digit) != 0:
p = detect_one(digit)
result.append(p)
digit = []

return result


def detect_one(data):
''' 识别一位号码 '''

# 绘制每一位号码的时域和频域图像
# plot_diagram(data)

# 计算频谱
(freqs, xfa) = calc_fft(data)

# 寻找高频和低频
local = []
for i in np.arange(1, len(xfa)-1):
if xfa[i] > xfa[i-1] and xfa[i] > xfa[i+1]:
local.append(xfa[i])
local = sorted(local)
loc = np.where(xfa == local[-1])
high_freq = freqs[loc[0][0]]
loc = np.where(xfa == local[-2])
low_freq = freqs[loc[0][0]]
# 查看具体频率,调试很有用
# print('high_freq, low_freq = {:.2f}, {:.2f}'.format(high_freq, low_freq))

# 判断字符
p = judge_char(high_freq, low_freq)

return p

但是还是不对!误差仍然很大,和之前的方法似乎差不多。

正在我焦头烂额之际,我重新把每个频率打印出来仔细查看了一遍,发现……原来高频群的频率并不是真的都比低频群的频率高啊!显而易见,这不符合标准的DTMF信号定义,但是这个信号编码的方式又确实是DTMF……只能说,我大意了。

所以,其实只需要在判断字符那里加几行就行了:

1
2
3
4
5
6
7
8
# 判断字符
p = ''
p1 = judge_char(high_freq, low_freq)
p2 = judge_char(low_freq, high_freq)
if p1 != '' or p2 != '':
p = p1 + p2

return p

7. 测试

OK,测试一下。

啊啊啊终于对了!


尾声

好!交货,拿钱!

客服抽成20%,所以我只能拿560。

欸?财务人员呢?

啊,最终还是拿到钱了哈哈哈~

第一次做几百块的项目,钱不算多,但是对我来说算是一个新的起点吧。


前言

我怎么开始搞函数式编程了呢?其实两年前就开始接触所谓的函数式编程了,当时是看了那本《黑客与画家》然后就产生了“LISP好厉害,我要学LISP”的想法……但是呢,当时就只是随便玩玩,根本就没入门,只是会使用一些map或者filter之类的东西。

两年后,看了一部动漫:《玲音(Serial Experiments: Lain)》,赛博朋克和意识流的佳作,里面也有函数式编程:

后来,不知道是什么缘分,知乎上有个人找到我,问我会不会Racket编程语言,能不能给她的孩子补习一下Racket,我想我也会一点Racket,就说好的,然后就谈妥了开始一对一网课。

妈呀,不上不知道,一上吓一跳,他们的Racket怎么这么不一样啊,map呢?filter呢?怎么全是cons?噢,滑铁卢大学的CS 135……好吧,马上学习!吭哧吭哧学下来,我大概算是摸清了滑铁卢的套路。不得不说滑铁卢的CS 135真的有点意思,打个比方就是说,学校只教会你使用最基本的拼音和汉字以及最基础的语法,然后就让你写出一首押韵的回文诗。

这篇文章只是用几个非常基本的小例子来展示一下函数式编程的样子,主要是与过程式编程和面向对象编程区别开来,因此并不能完全地体现出函数式编程的特性。

话不多说,开始。


1. len

len()函数应该是在各大编程语言中很常见的一个内置函数了,它的基本作用是求一个列表(list)的长度(length),即列表中元素的个数。那么,怎么用函数式编程的方式来实现len()这么一种函数呢?

注意,函数式编程一般不会用循环,因此如果直接循环遍历每一个结点然后cnt++这样是不合适的。

能用的只有两个基本特性:条件判断和递归。当然,基本的算术运算符肯定还是要用的。

这里用Racket语言当作例子。Racket是Scheme的一个分支,而Scheme是由LISP而来。

1
2
3
4
5
6
7
8
9
10
;; (my-len l) Returns the number of elements in list.

;; my-len: (listof Any) -> Num
(define (my-len l)
(cond
[(empty? l) 0]
[else (+ 1 (my-len (rest l)))]))

;; Examples:
(my-len '(1 2 3 4)); => 4

简单说一下

  • cond表达式,它会依次计算参数列表中每个参数的第一个表达式,如果结果为真则计算该参数的第二个表达式,然后结束,如果都没有真,则计算else分支的表达式。整个cond也是一个表达式,因为在函数式编程里,任何子句都是纯粹的表达式。这个cond可以简单理解为C语言中的switch。
  • empty?表达式,它会计算参数是否为空,返回布尔值。
  • l(代表list,列表)是形参,其实参本质上是一个链表。
  • rest表达式,它会返回除开链表头结点之后的剩余链表。

OK,再简单说一下这个函数是怎么算出列表长度的。

  • 递归两大要素:基例和链条。基例就是,当列表为空时,返回0给上一层。
  • 链条就是,每次递归到下一层时,最顶层表达式加1。递归到下一层传进去的实参是(rest l),这样一直递归下去直到基例,当到达基例的时候,在最顶层看来就已经加了总元素个数那么多个1了,于是返回到最顶层的时候累加起来就得到了结果。

不理解没关系,因为这需要一定的前置知识的铺垫。没搞过函数式编程的话应该是看不懂的……

嘛,大概就是这样,就算出了一个列表的长度。

上面那个是最简单的版本,时间复杂度比较高,可以改进一下:

1
2
3
4
5
6
7
8
9
10
; Tail Recursion version
(define (my-len-TR l)
(define (iter l len)
(cond
[(empty? l) len]
[else (iter (rest l) (+ len 1))]))
(iter l 0))

;; Examples:
(my-len-TR '(1 2 3 4)); => 4

嗯……尾递归版本,要快一些。

2. map

map()函数是函数式编程的一个很常用的函数了,Python里面也有。简单来说就是把一个函数当成参数作用到后面列表的每一个元素上。

1
2
3
4
5
6
7
8
9
10
;; (my-map f l) Constructs a new list by applying a function to each item on list. 

;; my-map: func (listof Any) -> (listof Any)
(define (my-map f l)
(cond
[(empty? l) empty]
[else (cons (f (first l)) (my-map f (rest l)))]))

;; Examples:
(my-map string-upcase '("ready" "set" "go")); => '("READY" "SET" "GO")

尾递归版本:

1
2
3
4
5
6
7
8
9
10
; Tail Recursion version
(define (my-map-TR f l)
(define (iter l backward-result)
(cond
[(empty? l) (reverse backward-result)]
[else (iter (rest l) (cons (f (first l)) backward-result))]))
(iter l empty))

;; Examples:
(my-map-TR string-upcase '("ready" "set" "go")); => '("READY" "SET" "GO")

3. filter

filter()函数是函数式编程的一个很常用的函数了,Python里面也有。

1
2
3
4
5
6
7
8
9
10
11
12
;; (my-filter p? l) Constructs a list from all those items on a list for which the predicate holds.

;; my-filter: func (listof Any) -> (listof Any)
(define (my-filter p? l)
(cond
[(empty? l) empty]
[(p? (first l)) (cons (first l) (my-filter p? (rest l)))]
[else (my-filter p? (rest l))]))

;; Examples:
(my-filter odd? '(0 1 2 3 4 5 6 7 8 9)); => '(1 3 5 7 9)
(my-filter even? '(0 1 2 3 4 5 6 7 8 9)); => '(0 2 4 6 8)

4. min/max

min()/max()这两个函数也是非常常用的,顾名思义,取出一个列表中的最小值/最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
;; (my-min l) Determines the smallest number.

;; my-min: (listof Num) -> Num
(define (my-min l)
(cond
[(empty? (rest l)) (first l)]
[(< (first l) (my-min (rest l))) (first l)]
[else (my-min (rest l))]))

;; Examples:
(my-min '(1 2 3 4)); => 1


;; (my-max l) Determines the largest number.

;; my-max: (listof Num) -> Num
(define (my-max l)
(cond
[(empty? (rest l)) (first l)]
[(> (first l) (my-max (rest l))) (first l)]
[else (my-max (rest l))]))

;; Examples:
(my-max '(1 2 3 4)); => 4

5. sum

sum()这个函数也是非常常用的,顾名思义,对列表求和,前提是该列表的元素是数字。

1
2
3
4
5
6
7
8
9
10
;; (my-sum l) Returns the summation of elements in list.

;; my-sum: (listof Num) -> Num
(define (my-sum l)
(cond
[(empty? l) 0]
[else (+ (first l) (my-sum (rest l)))]))

;; Examples:
(my-sum '(1 2 3 4)); => 10

6. index

index()这个函数的作用是取出该列表中指定索引(index)的值。本质上就是查找一个链表中指定位置结点的值。

1
2
3
4
5
6
7
8
9
10
;; (my-index l n) Extracts the n-th element from list. 

;; my-index: (listof Any) Num -> Any
(define (my-index l n)
(cond
[(zero? n) (first l)]
[else (my-index (rest l) (- n 1))]))

;; Examples:
(my-index '(1 2 3 4) 3); => 4

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(my-len '(1 2 3 4)); => 4
(my-len-TR '(1 2 3 4)); => 4

(my-map string-upcase '("ready" "set" "go")); => '("READY" "SET" "GO")
(my-map-TR string-upcase '("ready" "set" "go")); => '("READY" "SET" "GO")

(my-filter odd? '(0 1 2 3 4 5 6 7 8 9)); => '(1 3 5 7 9)
(my-filter even? '(0 1 2 3 4 5 6 7 8 9)); => '(0 2 4 6 8)

(my-min '(1 2 3 4)); => 1
(my-max '(1 2 3 4)); => 4

(my-sum '(1 2 3 4)); => 10

(my-index '(1 2 3 4) 3); => 4

以上。


早些时候看到过一篇文章,说的是雷军以前由于一次意外,导致他电脑上好多年积攒起来的代码和资料全部丢失了,由于没有备份所以也不可能找回了,很可惜。

这种痛,我并不想懂。

随着我电脑上的代码和资料越来越多并且越来越重要,我决定研究一下文件备份。


待续


我帮许多人优化过电脑,在这个过程中,我逐渐发现了一些东西,我决定写下来。

首先明确一点,本文的题目是《让个人电脑成为你的好伙伴》,因此,只谈论个人电脑(PC, Personal Computer)的使用和优化。以下就简称“电脑”了。


我以前写过一篇文章:《Windows系统优化》,讲的是Windows系统的优化,比如卸载不需要的预装应用等等,那只适合Windows系统的应用层面的简单优化,其实没多大用。要知道,电脑是为人而服务的,根本在于人。所以关键就在于——人如何去使用电脑、人如何让电脑成为好伙伴。我从几个方面分别来说,但这几个方面其实都有一个共同的精神内核。


  1. 应用下载

    许多问题,比如计算机病毒,比如弹窗广告,在很大程度上都可以避免,一个办法就是——应用软件尽量去官方网站下载。

    官方网站下载的应用软件是不用担心病毒的,除非这个开发软件的公司不想做了。其次,官方网站下载应用就直接是下载应用,一般不会给你捆绑乱七八糟的东西(个别公司的产品会给你捆绑一堆东西,安装的时候要留意一下安装界面的默认选项)。

  2. 正版软件

    许多问题,比如计算机病毒,比如弹窗广告,在很大程度上都可以避免,另一个办法就是——应用软件尽量使用正版的。

    除非迫不得已,比如学生出于学习需要而使用MATLAB这种非常昂贵的软件但又没有购买能力,就只能破解了。

  3. 杀毒软件

    先吐槽一下,有一些电脑里装了一大堆杀毒软件,什么360杀毒、金山毒霸、腾讯电脑管家、卡巴斯基等等,我想问一下,这是在养蛊吗?无意讽刺,但这确实是一个问题。杀毒软件,只需要一个就好,多了反而会打架,毕竟一山不容二虎。

    对于使用Windows 10系统的普通用户来说,系统自带的Windows Defender就挺好。对于工程师/程序员来说,杀毒软件误删文件是一个很头疼的问题,不过既然都是工程师/程序员了,那么肯定能想到一个两全其美的解决办法吧。

  4. 文件归档

    这里的文件,代指电脑上的所有数据,包括代码(*.c, *.py, *.java, ...)、文档(*.doc, *.txt, *.ppt, ...)、图片(*.jpg, *.gif, *.png, ...)等等。文件归档,顾名思义,就是把文件分门别类地放好,保持文件之间的有机联系,以便于保存和取用。

    一百个人恐怕有一百零一个文件归档的方法,但对于Windows系统来说,一个通用的原则就是尽量别把文件放在C盘,因为Windows操作系统基本上就储存在C盘,因此C盘又叫系统盘,系统盘里的文件太多太杂的话很容易卡。

  5. 桌面整洁

    这里的桌面,不光是电脑里名为“桌面(Desktop)”的这个文件夹,也是物理世界中放置电脑的桌面。一个整洁的桌面,会大大提高工作/学习的效率。

    对于Windows系统来说,电脑里名为“桌面(Desktop)”的这个文件夹,是C盘中的一个文件夹,因此所有放在桌面的文件,实际上都是储存在C盘的。由第四点可知,C盘尽量别放文件,所以,可以考虑将桌面的文件全部放在其他盘里。另外,回收站其实也是文件夹,每个硬盘分区都有一个叫“回收站(Recycle Bin)”的特殊隐藏文件夹。


计算机可以说是人类智慧的结晶,若使用得当,潜力是巨大的。


1. 改革婚姻制度

《家庭、私有制和国家的起源》(作者:[德] 弗里德里希·恩格斯)

以爱情为核心的现代婚姻,欺骗性十足


2. 改革财产继承制度

《后浪》一出,阶级矛盾被进一步放大。B站上《韭浪》、《非浪》等讽刺作品层出不穷,且有向娱乐化发展的趋势。许多人讨论这件事,或激进,或戏谑,或讽刺,或感叹。这不妨看作是一种“发泄”,而“发泄”是暂时的,影响也有限。再之后就是沉闷,因为心理能量都“发泄”完了。

“翼装飞行女大学生不幸身亡”的新闻一出,知乎上有部分答案阴阳怪气地说这个女大学生家里有钱如何如何,抛开仇富心理不说,这位女大学生并没有做错任何事,无非就是安全措施没做到位导致了这个事件的发生。此事件为何会引发这么多的讨论?一说是死者亲属花钱买的热搜,目的是给景区压力以此加大赔偿/报复心理。我看还有另一部分原因,这个原因和《后浪》事件一样:阶级矛盾。若要仇富,那么真正该把矛头对准的,应该是“财产可以继承”这件事以及背后的法律条文。这个才是核心。

“权力不得继承”已是共识,那么下一步就是实现“财产不得继承”,这是阶级差异的源头之一。


3. 作息自由

夜猫子宣言


4. 社会化抚养

成立一个专业的中立机构来统一抚养未成年人。

孩子的法定监护人默认是该机构。

孩子的生父生母如想取得孩子的抚养权,即成为孩子的法定监护人,需经过严格的考核。

在理想情况下,每一对父母都能够很容易通过考核并取得孩子的抚养权。

社会化抚养展望

为避免不必要的误会,特此澄清,本人父母还是挺好的,这个想法的提出来源于对于社会普遍存在的原生家庭相关问题的思考


5. 学习自由

关于改进大学教育的建议


以上纯粹是空想。

这就是我心目中的理想社会。

初稿(或者说是草稿更贴切)写于2020年9月。

困了就睡吧,睡到自然醒。每个人本可以如此的。

每个人都能自由地安排作息(特殊紧急工作需要除外,比如特警/急诊医生/消防队员/重大岗位领导),且不能干涉他人的作息。

由人组成的社会应当为了每个人的幸福而服务,不是吗?


关于生物钟、“夜猫子”睡眠型、“早起鸟”睡眠型等详细资料请看下面这个链接:

夜猫子宣言

如果你对于“夜猫子”睡眠型产生的原因、对生物钟能否通过后天调整等问题并无确凿的答案的话,强烈建议你看一看上面的链接给出的文章列表。


作息自由可能带来哪些问题?

  1. 效率问题

    无论是公司还是学校,统一作息的本质原因都是追求效率最大化。

    现代社会讲究分工合作,一个团队里的人多半有“夜猫子”睡眠型也有“早起鸟”睡眠型,作息自由之后就无法实时配合达到效率最大化。

    缓解办法:

    首先容我吐槽一下,就目前而言,效率达到最大化了吗?显然没有,而且连边都没碰着。

    • 工作:

      绝大多数工作其实根本没必要固定时间,远程办公、弹性工作制、工作任务中心制等都是缓解这个问题的好办法。

      退一步讲,光是中国就有十多亿人,而“夜猫子”睡眠型的人群占比大概五分之一(实际上这句话并不准确也不严谨,只是我为了方便传达意思而这样表述,目前还没有关于这方面的固定划分。你看了文章就会知道,所谓“夜猫子”睡眠型其实分很多种,这更像是一个“睡眠频谱”,而不是一刀切成俩。类比:彩虹的“七种颜色”是为了方便统一而人为规定的,彩虹的颜色其实是一个连续的色谱),算下来有几亿人都是“夜猫子”睡眠型,夜猫子们可以自己组成团队进行生产活动。

      一般人睡眠时长是八小时,所以无论哪种睡眠型的人,至少有八小时可以和另一种睡眠型的人进行互动。

    • 学习:

      两步走:

      第一步,将一个公共时间段(比如14:00-18:00)设置为统一的上课时间,上午和晚上的教学活动分别由两种睡眠型的人来进行。待网课条件全面成熟后,执行第二步。

      第二步,全面网课的方式。基本和重要的课程在教室上课时同步录制网课以方便未到场的同学进行学习。部分课程根据情况可以只录制视频(就像MOOC那样)。体育课和实验课这种需要到场的课程在公共时间段进行。

  2. 饮食问题

    作息自由之后半夜也会有饮食需求。其他娱乐需求可以不要,但是“民以食为天”,自己做饭会产生环境噪音问题,别人做饭会需要餐饮业来配合。

    缓解办法:

    • 自己做饭:如果是电磁炉这类的厨具,本身噪音就不大。切菜剁肉、用炒锅炒菜的话确实是一个不好解决的问题,在人群居住密度降下来之前夜猫子们尽量点外卖吧,避免打扰到早起鸟们。
    • 别人做饭:别人做饭={餐厅堂食, 购买外卖}。如第一条所述,算下来有几亿人都是“夜猫子”睡眠型,夜猫子们可以自己组成团队进行生产活动。
  3. 噪音问题

    作息自由之后,白天和半夜都会有不少人在活动,因此将会造成一定的噪音,给正在睡眠的人带来影响。

    缓解办法:

    尽量小声,照顾别人的感受。其实,无论是做饭还是其他活动,都应该尽量照顾别人的感受。哪怕是作息自由之前的白天,电子产品的声音外放很大声的话也会给别人带来困扰的。

  4. 特殊问题

    比如战争时期,社会运转不能与和平时期一样。

    缓解办法:

    特殊问题另当别论。


作息自由可以解决哪些问题?

  1. 解放生产力

    每个“夜猫子”睡眠型的人能真正为社会发挥作用而不是白天一直犯困。许多人觉得白天提不起精神而夜晚却很兴奋,除开报复性熬夜之外,很可能就是一定程度上的“夜猫子”睡眠型。

  2. 缓解交通拥堵

    早高峰和晚高峰的拥挤将成为历史。交通流量将在全时段更为平缓。

  3. 提高公民幸福感

    即使睡不着,也无所谓,失眠将不再是一个令人困扰的问题。而由失眠造成的焦虑、紧张和神经衰弱等问题都将迎刃而解。

  4. 扩展未来

    让自由的理念更加深入人心,进而将出现更多的能让每个人都幸福的可能性。未来会是美好的。


在问题“这个世界有哪些不合理的地方?”的回答里,有一个回答特别能打动我,如下:

作者:Max Snow
链接:https://www.zhihu.com/question/267919864/answer/379461810

全球总生产力已经翻了不知道多少倍了,人均下来也早就能满足一个人的日常需求(类似于大多数古代人的生活),然而我们还是处在剥削的状态下每天不得不让工作占据绝大多数时间,另外还有一大批人因为没有争取到被剥削的机会而食不果腹。

某些地方未利用的土地明明还有很多,房价高绝不是因为土地不够人用,然而就是有既得利益者控制着不去开荒,使得普通都市白领终身房奴。

任何生产出来的产品都应被消费,总生产力比古代提高100倍即意味着我们比古代人多消费了100倍的商品,然而一个人的刚需是有限的,生产力的极大提高无疑意味着对人类种种欲望的挖掘和无限放大,我们不经要问:人类真的需要消费这么多东西吗?

我们到底在为谁工作?资本家吗?好像也不是,资本家本人能消费的毕竟只是极少一部分,绝大部分利润会投入再生产,否则他就会被其他竞争对手资本家击垮。也就是说,所有人,包括资本家,都无法逃脱这个荒谬的循环。

工业革命明明解放了工人的双手提高了生产力,然而却导致工人们大批失业流离失所。进一步讲,对一个与外界绝缘的国家而言,以提高生产力为目的的技术的进步并不能提升个体的幸福感,因为朴实的生活已足够幸福。但是绝缘的假设并不成立,你不发展技术别人发展技术你就要挨打,因此技术革命本质上是“革命”,星星之火可以燎原的革命,即使是古中国这种拥有极成熟政治和文化的国家也不可幸免。

互联网原本是给人以便利的工具,然而当互联网渗透到这个时代整个社会的每一根血管的时候,作为个体的我们就丧失了拒绝互联网的权利,反而每天必须去应对因为网络而产生的种种繁忙。其它技术也同理。

资本主义制度明明比之前的制度更自由更高效,然而制度本身就蕴含了不可避免的周期性经济危机,资本家宁可把牛奶倒进河里也不肯施舍给吃不饱饭的穷人。经济危机甚至有可能进一步引发战争,而战争的破坏力也正是因为资本主义制度的优越性而空前的大。

资本主义精神源自新教伦理,如今上帝已死,资本主义外壳却留了下来,世俗化禁欲主义的精神内核被消费主义享乐主义所取代,作为个体的知识分子可以很清楚地看到市场经济时代的种种弊端,然而人类作为一个群体却因囚徒困境在资本的钢铁牢笼里越陷越深无法自拔。

科学思想意味着对世界采取理性,严肃的态度,然而科学式的思维在破除迷信和固有偏见的同时也解构了伦理学和传统文化,取而代之的看不到任何希望的后现代虚无主义,死水一潭。当代左派的政治正确即是表现。

政治,技术,社会体制这些东西,绝不是我们可以招之即来挥之即去的外物,它们如此深刻地影响了我们的生活方式,以致于我们再也不可能回到古人的生活。一方面我们直觉上醒悟到了以上这些不合理,另一方面我们发现这些都是可以解释通的,我们世界的这些不合理并非由于人性的邪恶或者存在少部分别有用心的坏人,而似乎不过就是韦伯说的理性化过程和文明发展的必然结果而已。

历史这种东西,绝不是简单空洞的线性叙事,而是由我们每一个在历史中的活人书写的活生生的历史,每个人都向往追求着更好的生活,但人类作为一个整体却一次又一次在深渊里越陷越深。

这就是我觉得这个世界最不合理的地方。


之前看到了一篇文章,文章所引用的书中的观点和内容准确地说出了我一直以来模糊不清的感觉。

以下是那篇文章的部分段落。

作者:夏冰雹
链接:https://zhuanlan.zhihu.com/p/103474691

在《狗屁工作(Bullshit Jobs)》一书中,伦敦经济学院的人类学家 David Graeber研究发现社会中毫无意义、甚至是有害的工作占了所有工作的一半以上,这种狗屁工作到处都是,还在不断膨胀。

什么是狗屁工作?Graeber将其定义为:一种有偿就业,完全没有意义的、不必要的、甚至有害的工作,连员工自己都不能为其工作的存在而正言;作为就业的前提,员工还不得不假装热爱工作;一旦这些工作突然从地球上消失,社会反而会运转地更好。

人类无休止的工作不仅没有创造相应的社会价值,而且折磨着从事者的心灵,工作就是高尚的社会美德枷锁更让工作者还无法敞开心扉谈真实的感受从而陷入绝望。

Graeber认为,狗屁工作的爆炸式增长完全不符合经济发展规律。凯恩斯早在19世纪30年代的预言,21世纪社会的高水准机器自动化可以取代大部分毫无价值的工作,人们一周只需要工作15个小时。然而,现实与凯恩斯的预言大相径庭,蔓延开来的不是自动化实现的优越,反而是自动化恐惧。Graeber指出,统治阶层发明狗屁工作的终极目的是为了维持社会稳定。

Graeber将狗屁工作归纳为以下五类:1. 马屁型:他们的存在就是为了让上级觉得自己很重要,如接待员、行政助理、门卫。2. 打手型:他们是雇主积极的打手,巩固权贵利益的附庸,例如游说者、公司律师、电话推销员、公关。3. 补丁型:处理本来可以完全避免的问题,比如程序员修补劣质代码、航空公司前台工作人员安抚拿不到行李的乘客。4. 报价机型:专门写书面文件、做些放空炮的报告,例如绩效分析师、公司内部宣传员。5. 监工型:不必要的上级,他们管理那些不需要管理就能运作的人,没事儿也要找点事儿给人瞎忙活,例如中层管理人员、领导力专员。

当1%的人掌控了社会99%的资本时,创造巩固那1%的人的利益的岗位(比如大量金融服务和公司法务岗位)并赋予这些岗位无限的尊严、把拼命三郎的社会价值观强加给职员就显得至关重要了,从而转移大众对社会财富分配不均衡的注意力,让他们干到死也不可能摆脱贫困陷阱。经济越是充满掠夺性质,低效和不必要的工作就越膨胀。

Graeber指出,更让人匪夷所思的是那些真正有对社会做出贡献的人,比如护士、清洁工、幼儿教师、社工等这些「关怀工作者 (caring class)」,却得不到应有的回报。美国经济学家Benjamin B. Lockwood 、Charles G. Nathanson 和E. Glen Weyl 研究了不同职业的社会成本与效益,得出结论:对社会最有价值的职业是医学研究员(每支付他们1美元薪水,他们就能创造9美元的价值);对社会最没价值的是金融职员(每支付他们1美元薪水,他们就扣除社会1.8美元的价值)。学者们警示,当社会无法按真正价值分配社会财富,经济增长会停滞。

Graeber并没有提出可行的解决方案,也不相信政策能做出任何改变,因为作者是无政府主义者。靠政策解决问题就暗示着占人口3%至5%的精英阶层拿捏的决定可以强加给任何人,把自己的命运交给别人,还等着别人大发慈悲,是不可能的事情。他认为,从政策层面思考社会变革是错误的,这意味着被统治的人自我假想成统治者,只会成为统治者的帮凶。

他呼吁人们必须从价值观上进行突破,不应当内化统治阶级炮制的工作哲学,而应该找到自我,从基层发起社会变革。社会也应该将时间归还给人们,每个人都拥有无限的创造力,只有在对自我时间的掌控中,人才能发挥天赋和创造力。

社会应从财富取向变成价值取向,这才能真正摆脱奴役的生活,转而迈入追寻精神价值的生活。


我写了一些话,都删了,因为无非就是再把上面的内容进行二次加工而已。

我想表达什么?

其实我暂时什么也不想表达,把这一切当游戏客观看待就好。

认真,而不当真。


Bad Apple - STM32 OLED版本

MCU: STM32F103

OLED: 7-Pin SPI SSD1306

所有文件已上传至GitHub:Bad-Apple-STM32-OLED


整个工程文件如下:

BadApple.mp4是原版高清视频

VideoToBin.m是处理视频/处理图片的MATLAB代码

images.zip是视频抽帧后保存的图片压缩包

BadApple.bin是处理图片后保存的bin文件

FATFS是将W25Q128格式化为FATFS的工程

USB是将bin文件写入W25Q128的工程

BadApple是让OLED显示动画的工程

killer.bat是删除多余的工程中间文件的批处理代码

readme.txt是说明文本


使用步骤:

  1. 用FATFS工程将W25Q128格式化为FATFS文件系统(如果W25Q128已经有FATFS了则跳过此步骤)

  2. 用USB工程将bin文件从电脑导入W25Q128

  3. 连接好电路,运行BadApple工程


开发步骤:

  1. 今年寒假因为项目相关原因,借了同学一个32板子,准备开学还的,没想到因为疫情原因,借了整整一个学期。为表示感谢,整点事情。搞一个OLED版的BadApple吧,先买一个OLED模块,然后找到一个Bad Apple宽屏版的原版高清视频(找了好久,终于找到了一个原版高清视频,结果抽帧之后发现图片比例不对,宽高比是4:3的话resize成128x64之后就看起来太胖了。前面的白做了……于是又重新找,又找了好久终于在B站找到了宽屏版的视频,然后要下载的话比较麻烦,最后是用Python的一个第三方库:you-get通过命令行来下载的。没想到第零步就花了这么多时间)

  2. 用VideoToBin.m抽取每一帧保存为128x64的BMP格式图片(然后就可以把视频处理部分的代码注释了,以后再用就只需处理图片了,比如《有屏幕的地方就有Bad Apple之ASCII版本》,处理视频实在是有点耗时)

  3. 用VideoToBin.m把图片转换成bin文件(核心就是二值化,这样每个像素占用空间从原来的 3通道 x 8bit = 24bit 降低到了 1通道 x 1bit = 1bit,于是约222MB的图片就能压缩成一个约9.25MB的文件,而W25Q128有16MB的容量,足够了。然后再把图片压缩成一个压缩包,毕竟两百多M传输太慢)

  4. 用FATFS工程将W25Q128格式化为FATFS文件系统(如果W25Q128已经有FATFS了则跳过此步骤)

  5. 用USB工程将bin文件从电脑导入W25Q128(USB协议真的好复杂啊……)

  6. (划掉)用FATFS工程计算bin文件的物理地址(原理是在W25QXX的读取函数内部嵌入一句发送地址的语句,然后用FATFS读取bin文件的第一个字节,将地址通过串口打印即可。文件地址一般是连续的,于是就可以直接用内部SPI通过绝对地址来读取数据,这样比通过FATFS来读取速度快很多)

  7. 连接好电路,运行BadApple,大功告成~(咦?怎么是上下颠倒的?改代码,不行,OLED的GRAM很奇怪,不是线性顺序的。于是吭哧吭哧查资料查datasheet,在OLED初始化里设置COM扫描方向那里试了半天,终于弄好了。咦?怎么播放到最后一小段是乱码?视频/图片/bin文件都没有问题,难道是传输过程中出错了?不应该,USB有校验的。推测可能是9.25MB的文件对于FLASH来说太大了,FATFS把它分成了两部分储存,所以读连续地址就不管用了。改用FATFS的读取函数试试,终于对了……所以,前面的又白做了)


广义相对论告诉我们,时间并不是以恒定速度流逝的,更不是独立存在的一个标尺。

那么“时间”是从哪来的?是从我们体验“熵增”这个过程中来的。究其原因,是因为人类并不能感知到每个粒子的状态而只能感知到一个宏观现象。详见关于时间存在的几个质疑


双缝干涉实验告诉我们,粒子拥有叠加态,测量会导致叠加态的坍缩。通常这会扯到“意识”,但目前还没有这方面公开的权威研究结果,就不说了。


作者:赵泠
链接:https://www.zhihu.com/question/410716897/answer/1371899384

你可以看一点20世纪的物理,以便理解“熵增原理”对宇宙压根没用。要是你谈的“世界”不是宇宙而是地球表面,那就更和熵没什么关系了,19世纪的物理也不会在一个有外部热源不断输入能量、自身还不断向外辐射能量的非封闭系统里讨论什么熵增。
对宇宙谈“熵增”是毫无意义的。宇宙不适用热力学第二定律。宇宙在膨胀且是个自引力系统,是具有负热容的不稳定系统,没有平衡态,永远不会热寂。

根据位力定理,对于自引力系统,在一个周期内动能的时间平均值等于总能量的负值,即Ek=-E。也就是说,自引力系统> 得到能量时动能减小,失去能量时动能增大。
热学中比热容的定义是物体温度每升高1开尔文所需要的热量。
而对于自引力系统来说,释放能量才能提高温度,这就是负的热容量。
负热容系统没有稳定的平衡态。
宇宙是自引力系统,它根本不可能达到平衡态。
其实,在1872年,全人类都不知道什么量子力学的时候,玻尔兹曼就用涨落捅穿了热寂说的屁股。他就是凶手。现在都2020年了,还有人对着这盒骨灰“变得悲观”,几悲观的。
将一切现象都推给熵增等于说熵增不起任何作用,“宇宙的熵增”是无意义概念。
而且,除了在理想气体之类极少数系统里有用之外,在绝大多数系统里,熵都是无意义概念。

宇宙也不适用能量守恒定律。

膨胀的时空没有时间平移不变性。能量守恒定律由类时killing场生成,宇宙中没有这种场。宇宙非渐近平直,不能对全时空定义守恒的ADM能量[1]。简单粗暴地对宇宙套用能量守恒定律是不可行的。
按照目前的观测事实,宇宙中存在辐射和暗能量。从早期宇宙形成以来,暗能量在增长,从早期宇宙里几乎不含暗能量的状态发展至现在暗能量占据宇宙总能量的68.3%。
弗里德曼-勒梅特-罗伯逊-沃尔克度规[2]描述了符合观测事实(均匀、各向同性)的四维时空的大尺度结构,度规中随时间变化的尺度因子对应着宇宙空间尺寸的变化。重子物质的能量密度正比于尺度因子的负三次方,辐射的能量密度正比于尺度因子的负四次方,暗能量的能量密度不随尺度因子变化,因此宇宙不适用能量守恒定律。

  1. ^无限远处重力场强度的计量
  2. ^(riedmann-Lemaître-Robertson-Walker metric,FLRW度规)

上面这个关于热寂的回答告诉我们,宇宙并不适用热力学第二定律,也不适用能量守恒定律。当然也就没有热寂一说了。


倘若只是“知识”变了,看似知道的更多了,其实并没有改变什么。

无论是绝对时空观,还是相对时空观,还是玄学时空观,都是别人告诉你的死知识,知道这些和知道“显示屏上的图像是由像素构成的”没什么两样。

核心在于,能否用心去感受这些知识背后所隐藏的广阔天地带给自己内心的震撼以及察觉这些知识对自己潜移默化的改变。

“显示屏上的图像是由像素构成的”

第一层:哦,原来如此。

第二层:看似模拟的图像其实源头是离散的,有趣……

第三层:模拟信号也可表示图像比如老式电影胶卷,为什么要用数字信号?哦,因为数字信号方便处理。

第四层:这背后可是一整个数字世界啊!

还有受限于作者有限的思考能力而无法知道的第五层、第六层……

我们需要从一个全新的角度来看待这个世界,这些离我们并不遥远,相反,没有比这些更能影响我们日常生活的事物了。广义相对论的时空观,双缝干涉实验里的观察者,这些已经被实验证实的——哪怕并不是最终的真理,哪怕几百年后也都会被推翻——也足够揭示:现代人的世界观只是一个阶段性认识的产物、或者说直白点,一个幻象。我们生活在其中的这个世界,值得我们好好去体悟。