基于协同过滤的音乐推荐系统实践

废话:近年来,「人工智能/大数据/机器学习/区块链」等等词汇越发「甚嚣尘上」(误)。作为一个仅仅对web开发有些许了解并且不想成为码畜的普通计算机本科生,虽然顶着「计算机科学与技术」这样一个看似响亮的名号,但说实在的,我对上述词汇的认知可以说是「聊胜于无」(误),直到本学期学校开了人工智能的相关课程,才逐渐对相关信息有所了解,也直到完成本次课程实践作业,我或许才算得上真正的入门「机器学习」。

项目背景

据报道 [1],中国有超过 9.77 亿人每周都听音乐,而 66%的人通过流媒体来听音乐。为了 给用户提供更好的体验,如何为用户推荐喜爱的音乐就变得非常重要。本项目使用的数据 集来自 Last.fm 音乐网站 [2],数据集在 2011 推荐系统会议(ACM RecSys)中发布。——人工智能实践课程项目一 音乐推荐系统

Recommenders: systems, sites and software that mine data to find stuff you’ll like——reddit

据报道,推荐系统给亚马逊带来了35%的销售收入,给Netflix带来了高达75%的消费,并且Youtube主页上60%的浏览来自推荐服务。——msra

完成课程目标(误,其实还是很感兴趣,不然也不会专门写博客) ——citizen5

通过本次项目实践,我们学会了如何为推荐系统预处理数据,通过相对简单的方法和第三方库实现了「协同过滤」和「随机梯度下降」,最终达到了普通人也能实现的「人工智能」。——总结

相关工作

什么是推荐系统

推荐系统是一种信息过滤系统,用于预测用户对物品的“评分”或“偏好”。[1]

推荐系统近年来非常流行,应用于各行各业。推荐的对象包括:电影、音乐、新闻、书籍、学术论文、搜索查询、分众分类、以及其他产品。也有一些推荐系统专门为寻找专家[2]、合作者[3]、笑话、餐厅、美食、金融服务[4]、生命保险、网络交友,以及Twitter页面[5]设计。

推荐系统产生推荐列表的方式通常有两种:协同过滤以及基于内容推荐,或者基于个性化推荐。[6] 协同过滤方法根据用户历史行为(例如其购买的、选择的、评价过的物品等)结合其他用户的相似决策建立模型。这种模型可用于预测用户对哪些物品可能感兴趣(或用户对物品的感兴趣程度)。[7] 基于内容推荐利用一些列有关物品的离散特征,推荐出具有类似性质的相似物品。[8]两种方法经常互相结合(参考混合推荐系统

协同过滤基于内容推荐的区别可以比较两个流行的音乐推荐系统 — Last.fmPandora Radio.

  • Last.fm 建立通过观察用户日常收听的乐队或歌手,并与其它用户的行为进行比对,建立一个“电台”,以此推荐歌曲。Last.fm 会播放不在用户曲库中,但其他相似用户经常会播放的其它音乐。鉴于这种方式利用了用户行为,因此可以认为它是协同过滤技术的一种应用范例。
  • Pandora 使用歌曲或者艺人的属性(由音乐流派项目提供的400个属性的子集)从而生成一个电台,其中的乐曲都有相似的属性。用户的反馈用于精化电台中的内容。在用户“不喜欢”某一歌曲时,弱化某一些属性;在用户喜欢某一歌曲时,强化另一些属性。这是一种基于内容推荐的方式。

每一种系统都有其长处与弱点。在上面的例子中,为了提供精准推荐,Last.fm 需要大量用户信息。这是一个冷启动问题,在协同过滤系统中是常见的问题[9][10][11]。而 Pandora 启动时则仅需要很少信息,然而这种方法的局限性很大(例如,这类方法只能得出与原始种子相似的推荐)。

推荐系统是一种有效代替搜索算法的方式,因为他们帮助用户找到一些他们自己没有办法找到的物品。有趣的是,推荐系统在实现之时通常使用搜索引擎对非传统数据索引。——Wikipedia

推荐系统常用算法

常用的推荐系统算法有五种,每一种都有其优点,不同场景下每一种算法效果会不一样。——zhan-bin

  • 1.基于内容的推荐
  • 2.协同过滤推荐
  • 3.基于关联规则的推荐
  • 4.基于知识的推荐
  • 5.混合推荐

实验方法

推荐方法选型

在经过大量的资料查阅和长期的小组讨论后,我们最终决定采用「Collaborative Filtering」即「协同过滤」的推荐方法。

协同过滤,简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。协同过滤又可分为评比(rating)或者群体过滤(social filtering)。其后成为电子商务当中很重要的一环,即根据某顾客以往的购买行为以及从具有相似购买行为的顾客群的购买行为去推荐这个顾客其“可能喜欢的品项”,也就是借由社群的喜好提供个人化的信息、商品等的推荐服务。——Wikipedia

我认为,通俗的来说,你可以这样理解协同过滤:在一个无聊的漫漫长夜里,你难以入睡并打开了某听歌软件,面对如此庞大的曲库你不知道要听些什么歌来衬托黑夜。这时,或许具备传说中「artificial intelligence」能力的听歌软件会获取和你具有相似行为的用户信息,又或许它获取了你对哪些歌曲点过红心,从而根据上述两种方式找到你或许会喜欢的歌曲。「伟大的协同过滤诞生了」。

A lot of research has been done on collaborative filtering (CF), and most popular approaches are based on low-dimensional factor models (model based matrix factorization. I will discuss these in detail). The CF techniques are broadly divided into 2-types:——Prince Grover

在查阅众多资料后,我认为协同过滤可以分为 两个大类:基于记忆「memory」的协同过滤(不知道怎么翻译更准确)和基于模型的协同过滤。而「Memory-Based Collaborative Filtering」,正是我在前文中所提到的「user-item filtering」和「 item-item filtering」,在此就不再引例。

而「基于模型的协同过滤」又基于「 matrix factorization」即「矩阵分解」,矩阵分解被用作一种在潜在变量分解和降维时的无人监管的学习方法,他比「Memory-Based Collaborative Filtering」更具有可扩展性和稀疏性。在查了矩阵分解的定义后我逐渐明白了到底什么是「基于模型的协同过滤」,但又被众多的定义和术语搞得云里雾里。那么有了矩阵分解或者说是「基于模型的协同过滤」后我们到底能做些什么呢?简而言之,我们可以通过「预测」的方式来模拟原始矩阵中的缺失条目,也就是下文中即将提到的「ratings」。

Collaborative Filtering (CF)

Memory-Based Collaborative Filtering

Memory-Based CF methods can be divided into two sections: user-item filtering and item-item filtering. Here is the difference:

  • Item-Item Collaborative Filtering: “Users who liked this item also liked …”
  • User-Item Collaborative Filtering: “Users who are similar to you (kinda like the twin you never knew you had) also liked …”

Both methods require user-item matrix that contain the ratings for user uu for item ii. From that, you can calculate the similarity matrix.

The similarity values in Item-Item Collaborative Filtering are calculated by taking into account all users who have rated a pair of items.

For User-Item Collaborative Filtering, the similarity values are calculated by observing all items that are rated by a pair of users.

Model-Based Collaborative Filtering

Model-based CF methods are based on matrix factorization (MF). MF methods are used as an unsupervised learning method for latent variable decomposition and dimensionality reduction. They can handle scalability and sparsity problems better than Memory-based CF.

The goal of MF is to learn latent user preferences and item attributes from known ratings. Then use those variable to predict unknown ratings through the dot product of the latent features of users and items.

Matrix factorization restructures the user-item matrix into a low-rank matrix. You can represent it by the multiplication of two low-rank matrices, where the rows contain a vector of latent variables. You want this matrix to approximate the original matrix, as closely as possible, by multiplying the low-rank matrices together. That way, you predict the missing entries in the original matrix.

引用第三方库
1
2
3
4
5
6
7
8
import graphlab as gl
import pandas as pd
import numpy as np
import math
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from math import sqrt
from sklearn.metrics import mean_squared_error
导入last.fm数据集并作预处理

使用pd.read_csv()导入user_artists.dat和artists.dat,并将两个dframe合并为一个新的dframe:「ap」,并将weight重命名为playcount。

1
2
3
4
5
6
7
8
9
10
plays = pd.read_csv('C:\Users\Eric000\dataSets\dat\user_artists.dat', sep='\t')
artists = pd.read_csv('artists.dat',sep='\t')

ap = pd.merge(
artists, plays,
how="inner",
left_on="id",
right_on="artistID"
)
ap = ap.rename(columns={"weight": "playCount"})
排序

通过pandas的groupby()对播放量的相关信息进行处理,并按照playCount降序排列。

1
2
3
4
5
6
7
8
artist_rank = ap.groupby(['name']) \
.agg({'userID' : 'count', 'playCount' : 'sum'}) \
.rename(columns={"userID" : 'totalUniqueUsers', "playCount" : "totalArtistPlays"}) \
.sort_values(['totalArtistPlays'], ascending=False)
artist_rank['avgUserPlays'] = artist_rank['totalArtistPlays'] / artist_rank['totalUniqueUsers']

ap = ap.join(artist_rank, on="name", how="inner") \
.sort_values(['playCount'], ascending=False)
graphlab入场

使用

1
2
3
4
ap.to_csv('artistsANDplays.csv')

sf = gl.SFrame('artistsANDplays.csv')
sf.remove_columns(['X1','id','url', 'pictureURL'])

将dfrmae输出为「artistsANDplays.csv」并实例化一个sFrme对象sf,通过remove_columns()删除暂时用不到的数据。

1

数据可视化

通过graphlab的canvas,我们可以非常容易地对数据进行可视化处理,这将及其简化我们的工作,不得不再次感叹python强大的工具库。

我们只需要将处理后的数据实例化为一个SFrame对象,即可通过鼠标的交互得到我们想要的可视化结果,免于手动使用代码绘制图像。

1
sf.show()

2

总览

3

总播放量对应的歌手

image-20200602220058235

有多少独立用户听过对应歌手的歌

image-20200602220214830

通过独立用户和总播放量的对应关系基本可以看出歌手的流行程度

image-20200602220506766

推荐系统实现

为了实现协同过滤,我们将ap中的playCount转换为了一个矩阵,在处理过playCount以及通过assign和pivot两个方法后重新塑造dataframe后,「ratings」的概念逐渐清晰,我们将ratings赋值与[0-1]之间,基于原始数据的playCount构建了一个评价体系,并用0补齐数据缺失的地方。

1
2
3
4
5
6
7
8
9
10
pc = ap.playCount
play_count_scaled = (pc - pc.min()) / (pc.max() - pc.min())
ap = ap.assign(playCountScaled=play_count_scaled)

ratings_df = ap.pivot(
index='userID',
columns='artistID',
values='playCountScaled'
)
ratings = ratings_df.fillna(0).values

计算ratings矩阵的稀疏度

1
2
3
4
sparsity = float(len(ratings.nonzero()[0]))
sparsity /= (ratings.shape[0] * ratings.shape[1])
sparsity *= 100
print('{:.2f}%'.format(sparsity))

接下来我们通过重写后的sklearn.model_selection的train_test_split将ratings分为「训练组」和「校验组」,并用0代替了一些参考价值不大的rating。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
train, val = train_test_split(ratings)

MIN_USER_RATINGS = 35
DELETE_RATING_COUNT = 15
def train_test_split(ratings):
validation = np.zeros(ratings.shape)
train = ratings.copy()
for user in np.arange(ratings.shape[0]):
if len(ratings[user,:].nonzero()[0]) >= MIN_USER_RATINGS:
val_ratings = np.random.choice(
ratings[user, :].nonzero()[0],
size=DELETE_RATING_COUNT,
replace=False
)
train[user, val_ratings] = 0
validation[user, val_ratings] = ratings[user, val_ratings]
return train, validation
测量误差

我们采用「RMSE」即「均方根误差」来测量误差,通过这一算法,我们对真值和预测值的偏差有了一个大概的认识。

image-20200602220925621

训练推荐系统

使用「SGD」即「随机梯度下降」训练,赋予未知对象预测值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def fit(self, X_train, X_val):
m, n = X_train.shape
self.P = 3 * np.random.rand(self.n_latent_features, m)
self.Q = 3 * np.random.rand(self.n_latent_features, n)
self.train_error = []
self.val_error = []
users, items = X_train.nonzero()
for epoch in range(self.n_epochs):
for u, i in zip(users, items):
error = X_train[u, i] - self.predictions(self.P[:,u], self.Q[:,i])
self.P[:, u] += self.learning_rate * \
(error * self.Q[:, i] - self.lmbda * self.P[:, u])
self.Q[:, i] += self.learning_rate * \
(error * self.P[:, u] - self.lmbda * self.Q[:, i])
train_rmse = rmse(self.predictions(self.P, self.Q), X_train)
val_rmse = rmse(self.predictions(self.P, self.Q), X_val)
self.train_error.append(train_rmse)
self.val_error.append(val_rmse)

实验结果

评估推荐结果

在使用RMSE比较训练组和校验组,并且通过SGD训练模型之后,我们很直观的发现两个对照组之间的差距越来越小,训练时间与预测误差呈反比例关系,即训练时间越长,误差就越小。这也是我们推荐系统的评价标准,简而言之,当「训练组」和「校验组」的差距越来越小(即二者的重合程度越来越大时),我们的推荐系统也就越精确,即项目要求文档中的「推荐的精确度」。

image-20200603100501243·

做出最后的推荐

还记得上文中我们将矩阵中的一些对象置零吗,接下来,我们将用推荐系统获得的预测值将这些稀疏矩阵填充。

1
2
3
4
def predict(self, X_train, user_index):
y_hat = self.predictions(self.P, self.Q)
predictions_index = np.where(X_train[user_index, :] == 0)[0]
return y_hat[user_index, predictions_index].flatten()

这是预测前的结果

image-20200602220555572

1
2
3
4
5
6
7
8
9
10
11
user_id = 999
user_index = ratings_df.index.get_loc(user_id)
predictions_index = np.where(train[user_index, :] == 0)[0]
rating_predictions = recommender.predict(train, user_index)
existing_ratings_index = np.where(train[user_index, :] > 0)[0]
existing_ratings = train[user_index, existing_ratings_index]
create_artist_ratings(
artists,
existing_ratings_index,
existing_ratings
)

这是预测后的结果

image-20200602220616046

1
2
3
4
5
create_artist_ratings(
artists,
predictions_index,
rating_predictions
)

可以看出,id为999的用户,说不定不只是ColdPlay的忠实听众,Minnie Riperton或许也能让他在某个暗流涌动的寂寞之夜产生感官的愉悦。

「伟大的推荐系统诞生了」。

参考文献

[1] pandas-docs https://pandas.pydata.org/pandas-docs

[2] graphlab-docs https://turi.com/products/create/docs/index.html

[3] Wikipedia

https://en.wikipedia.org/wiki/Root-mean-square_deviation

https://en.wikipedia.org/wiki/Stochastic_gradient_descent

https://en.wikipedia.org/wiki/SGD_(disambiguation)

https://en.wikipedia.org/wiki/Recommender_system

and so on

[4] smartweed https://www.cnblogs.com/smartweed/p/7210689.html

[5] lastfm https://www.last.fm/.

[6] googlecolab https://colab.research.google.com/

[7] google Scholar https://scholar.google.com

[8] StackOverflow

https://stackoverflow.com/questions/33000061/graphlab-create-canopy-runtime-exception-unable-to-evaluate-lambdas

https://stackoverflow.com/questions/38983295/issues-downloading-graphlab-dependencies-get-dependencies?r=SearchResults

https://stackoverflow.com/search?q=Downloading+xz.

https://stackoverflow.com/questions/44994717/import-graphlab-does-not-work-properly/45596896?r=SearchResults&s=6

https://stackoverflow.com/questions/25960070/graphlab-create-importerror-no-module-named-graphlab

https://stackoverflow.com/questions/38938236/attributeerror-module-object-has-no-attribute-sframe

and so on

[9] Music artist Recommender System using Stochastic Gradient Descent | Machine Learning from Scratch https://www.curiousily.com/posts/music-artist-recommender-system-using-stochastic-gradient-descent/

[10] Various Implementations of Collaborative Filtering https://towardsdatascience.com/various-implementations-of-collaborative-filtering-100385c6dfe0

[11] v2ex https://v2ex.com

[12] github https://github.com

[13] Music Recommendation https://www.kaggle.com/myonin/music-recommendation-random-forest-xgboost

[14] surprise-docs https://surprise.readthedocs.io/en/stable/

[15] Building the optimal Book Recommender and measuring the role of Book Covers in predicting user ratings

偏好与权利及权力

阿城「中国当代作家,非哈尔滨市阿城区」在「爱情与化学」中说:

《爱情与化学》

这个题目换成“化学与爱情”,也无所谓。不过,我们的秩序文化里,比如官场中接见时的名次序列,认为排在前面的一定高贵,或者比较重要,就好像判死刑之后,最先拉出去枪毙的总应该是首犯吧。鲁迅先生有过一个讲演,题目是《魏晋风度与药及酒的关系》,很少有人认为其中三者的关系是平等的,魏晋风度总是比较重要的吧。因此,把“爱情”放在前面,无非是容易被注意,查一下页数,翻到了,看下去,虽然看完了的感想可能是“煞风景”。

那么本文写作「权利与偏好及权力」,「权力与偏好及权利」或者6种排列中的任意一种,「也无所谓」。不过本文的写作灵感抽象后的顺序即为偏好→权利→权力,题目由此而来。

昨天和我爸在超市买了很多东西,顺便一提,蜀大侠的番茄锅底是真的很淡。其中五花肉花费69¥,由我爸通过微信完成支付。毫无疑问,这块五花肉的所有权隶属于我爸,这是前提。

今天,我爸做了他概念中的「回锅肉」,制作过程在此不表,制作的结果也与以往差别不大,即是连炒锅上桌,很多油,整体趋于黑色化,猪皮很硬,较大量白糖和豆瓣、豆豉带来的甜咸味,我的食欲也与以往差别不大。不过似乎我和我爸也对这种场景都已形成了下意识反应,他比我更先采用了「玷污」一词,「难道我又玷污了这块肉?」但我却与以往差别较大,我真的有「权利」表达我爸「浪费」了这块肉吗?很显然,我没有,这是「所有权」上的没有。

「偏好」是实际潜藏在人们内心的一种情感和倾向,它是非直观的,引起偏好的感性因素多于理性因素。偏好有明显的个体差异,也呈现出群体特征。在微观经济学价值理论中,偏好是价值上相对主观的一个概念,指消费者按照自己的意愿对可供选择的商品组合进行的排列。

「引起偏好的感性因素多于理性因素,偏好有明显的个体差异,也呈现出群体特征」。我爸有对他所制作的回锅肉的「偏好」,我也有对他所制作的回锅肉的「偏好」,显而易见,我们的「偏好」并不相同,就算是我妈和我的「偏好」基本一致,但是「这世上没有人和我爸同一阵营」是永假的,所以我也没有「偏好」上的「权利」去指责,我所能做的只能是不认同。简而言之,我爸享有这块肉的「所有权」,以及狭义的「使用权」和「支配权」以及「无可置疑权」。

那么假设我爸不认可我的「偏好」,甚至直接无视和践踏我的「偏好」,强制将食物置于我的胃中,那么即是形成了一种「宰制(domination)与被宰制关系」,在反对情况下仍能实现自己意志的能力(米尔斯)。即为权力。权力具有强制性,很显然,人类社会始终会存在权力滥用的事实。

对此,我与我爸及我们都无能无力。

win10下通过wsl自定义安装ubuntu及图形界面

由于各种各样的原因无法完全从Windows转向Linux,在尝试过双系统、VMware以及Hyper-V后,我个人感觉双系统便利性不高,而虚拟化技术资源占用较高,于是便想到了wsl。众所周知,「Windows Subsystem for Linux」即「windows下的Linux子系统」已经问世相当一段时间。作为微软与Canonical公司合作开发的兼容层,我(主观)认为wsl对Ubuntu的支持及优化可能要胜于其他Linux发行版,于是在考虑过微软官方列出的支持发行版本后,选择了Ubuntu。题外话,我认为人们在选择操作系统时应完全按照自己的意愿及使用习惯,对于所谓的操作系统鄙视链我本人嗤之以鼻。

安装环境及准备

Item Location Description
Windows Subsystem for Linux 启用或关闭Windows功能 开启wsl
目标系统镜像 Microsoft Manually download Windows Subsystem for Linux distro packages
LxRunOffline Github A full-featured utility for managing Windows Subsystem for Linux (WSL),用于自定义安装路径

开启wsl

使用Cortana搜索「程序和功能」→启用或关闭Windows功能

设置→应用→程序和功能→启用或关闭Windows功能

image-20200403201409330

等待重启。

安装LxRunOffline

参见官方Wiki

You can install via Chocolatey choco install lxrunoffline, Scoop scoop bucket add extras, scoop install lxrunoffline, or download the binaries directly:

在此我选择直接下载解压,从Github release下载后解压得到「LxRunOffline.exe」即可。

安装Ubuntu

获取安装包

更改准备好的Ubuntu镜像文件拓展名为「.zip」,解压后得到「install.tar.gz」

image-20200403203132739

Run the following command once LxRunOffline is registered to the OS:

1
LxRunOffline i -n UF -d c:\WSL\UFull -f  -s

安装

使用powershell或其他终端输入:

1
lxrunoffline i -n <WSL名称> -d <安装路径> -f <安装包路径>.tar.gz

eg:在「D:\Ubuntu」中安装名为「Ubuntu1804」且安装包位于「D:\Ubuntu\prep\」之下的镜像,其命令为

1
lxrunoffline i -n Ubuntu1804 -d D:\Ubuntu -f D:\Ubuntu\prep\install.tar.gz

等待片刻,即可完成自定义安装Ubuntu。

设置密码

在此,我采用默认root用户进行操作,输入以下命令设置密码:

1
sudo passwd

换源

在换源之前我挂了全局代理,奇怪的是速度依然跑不上去。无奈换源

备份源文件

1
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

修改源为国内阿里云

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

在此可以通过「Everything」或「uTools」快速定位*sources.list*

更新和升级

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove

安装xfce和xrdp并修改端口

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get install xorg
sudo apt-get install xfce4
sudo apt-get install xrdp
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
sudo echo xfce4-session >~/.xsession
sudo service xrdp restart

image-20200403205653292


参考文章:

http://www.fanyingjie.com/cn/2019/11/win_linux/

https://p3terx.com/archives/manage-wsl-with-lxrunoffline.html#E5AE89E8A385LxRunOffline

让写作回归于写作本身

随着年岁的增长,「极简主义」渐渐覆盖了对事物总的看法和认知。

即使在重装系统的工具上也发生了根本性的改变:不再采用任何pe工具,也不再采用任何第三方分区工具,甚至一度想放弃Windows转而投身Manjaro。最后,Rufus和Windows自带的「磁盘管理」成为了最佳选择,当然,还包括了最精简的Windows 10——ltsc。

在尝试过wordpress,自建springboot-vue博客,hexo-next后,发现自己的问题并不是在外观、主题、插件本身,繁杂冗余的一切杂项无形中会影响写作的效率。有舍才有得,今后的热河,舍弃了包括但不限于访客统计,Google AdSense,音乐,等等等等。最终选择了 saki.li,希望今后再也不会纠结于写作之外,专注于写作本身。当然,也要对看到这些文字的你说声抱歉,由于太多原因,「被禁忌的游戏」即日起停止服务,如果你需要相关信息,那么邮件至将会得到不错的建议。

让写作回归于写作本身,在「多事之年」的2020,希望看到这些文字的你,保重身体。

呕吐物

4oCLCeS7luW5s+mdmeS4reiHquingeeBtemtguaxuea2jOOAggoK4oCLCeaXtuiHs+S7iuaXpeW3suWcqOS6uuS4lua8q+a8q+S6jOWNgei9veacieS9me+8jOWRleWQkOeahOasoeaVsOacquacieiusOi9veS9huWcqOaYoOWDj+S4reS4jeaYr+W+iOWkmuOAguaBkOaYr+Wkqui/h+eVmeaBi+aVheS5oeeogOWlh+eahOWPr+S7peimhuebluakjeiiq+eahOWkp+mbqu+8jOiEkea1t+mHjOS7heacieeahOS4gOasoeaZlei9puWRleWQkOeahOiusOW/huS4jumCo+asoeaXheeoi+acieWFs+OAguivtOaYr+aXheeoi++8jOS4jei/h+WwseaYr+iusOS6i+i1t+S4uuaVsOS4jeWkmueahOebuOWvuea4qemmqOWutuW6reeUn+a0u+mHjOeahOS4gOasoeWbnuWutu+8jOS4jei/h+aXoueEtuaJk+S4iuS6hua4qemmqOeahOagh+etvu+8jOaDs+adpeS5n+S4jeS8muWSjOWRleWQkOacieS9leWFs+iBlOOAguWPr+iDveaYr+ebrueahOWcsOmDveaYr+mCo+S4quawuOi/nOactOWunu+8jOS4peWvkumHjOiiq+eis+eBsOeDmOeGn+eahOa0i+iKi+aJgOe7meS6iOeahOawuOi/nOaaluiJsuiwg+eahOS5oemVh++8jOS5n+aYr+mqqOWtkOmHjOawuOi/nOeahOeyvuelnuWQkeW+gO+8jOS4gOS4quS6pOWPieiusOW/hue9ouOAggoK4oCLCeivtOiKsee+juWwseS8muacieS6uuivtOKAnOS5n+acieS4jee+jueahOiKseKAne+8jOmihOaDs+WIsOS8muaciei/meenjeaKseaAqOS6juaYr+WGmeKAnOaXouaciee+juS4veeahOiKseS5n+acieS4jee+jueahOiKsSLvvIzov5nlt7Lnu4/mmK/lup/or53kuobvvIwg6K6p5omA5pyJ5Lq66YO96K6k5ZCM55qE5paH5a2X56ew5LiN5LiK6KGo6L6+IO+8jOihqOi+vumcgOimgeWLh+awlOOAggoK4oCLCeKAneeDreays+KAnCDnmoTliJ3oobfmraPmmK/kuLrkuoborqnoh6rlt7HmraPop4bkuIDkupvoqIDorrrkvJrluKbmnaXnmoTnp4HkurrlkI7mnpzku47ogIzpmZDliLboh6rlt7HnmoTmgJ3nu6rlj4rlhbbkuqfnianvvIzli4fkuo7ooajovr7jgIIKCuKAiwnkuIrkuIrmrKHlkZXlkJDmmK/kuIDmrKHnpZ7nu4/mgKflkZXlkJDjgILmiJDlm6Dkuo7nn63ml7bpl7TlhoXmkYTlhaXov4fph4/pppnng58g77yM5piv5bC85Y+k5LiB5Lit5q+S55qE55eF55CG6KGo546w5LmL5LiA77yM5L+X56ew6YaJ54Of44CC6YaJ54Of5Li76KaB6KGo546w5Li65aS05pmV5oG25b+D77yM5pyJ5by654OI55qE5ZGV5ZCQ5oSf77yM5ous57qm6IKM5p2+5byb77yM5YWo6Lqr5peg5Yqb77yM5Lya5pyJ5aSn5bCP5L6/5aSx56aB55qE546w6LGh44CC5LiA6Iis5oyB57ut5Y2B5Yeg5YiG6ZKf77yM6YeN6ICF5Lya5Y2x5Y+K55Sf5ZG944CC56Gs6KaB5b2S5Zug55qE6K+d77yM5LiN5YGl5YWo55qE5Lq65qC877yM57G76L+r5a6z5aaE5oOz55qE5pWP5oSf56We57uP77yM5a+55pei5a6a5LqL5a6e5LuN5oqx5pyJ5LiA5Lid5bm75oOz562J562J5ZCn44CC6YKj5qyh5ZGV5ZCQ5ZCO77yM5Y2z5ZGK6K+r6Ieq5bex5YaN5Lmf5LiN6KaB6L+H6YeP5oq954Of44CCCgrigIsJ5LiK5qyh5ZGV5ZCQ5p2l5rqQ5LqO5oCl5oCn6YWS57K+5Lit5q+S44CCIOS4gOasoeaRhOWFpeWkp+mHj+mFkueyvu+8iOS5memGh++8ieWQjuWPkeeUn+eahOacuuS9k+acuuiDveW8guW4uOeKtuaAge+8jOWvueelnue7j+ezu+e7n+WSjOiCneiEj+S8pOWus+acgOS4pemHjeOAguWMu+WtpuS4iuWwhuWFtuWIhuS4uuaApeaAp+S4reavkuWSjOaFouaAp+S4reavkuS4pOenje+8jOWJjeiAheWPr+WcqOefreaXtumXtOWGhee7meaCo+iAheW4puadpei+g+Wkp+S8pOWus++8jOeUmuiHs+WPr+S7peebtOaOpeaIlumXtOaOpeWvvOiHtOatu+S6oeOAguS4quS6uuaEn+iniemGieeDn+WSjOmGiemFkueahOmavuWPl+eoi+W6puS4jeWxnuS4gOS4quaVsOmHj+e6p+OAgumGiemFkuWRleWQkOi/h+WQjuWxheeEtuWPiOiDveWbnuWIsOmFkuahjO+8jOWGjeasoemlrumFku+8jOiAjOmGieeDn+WRleWQkO+8jOiDveiuqeS9oOaEn+WPl+WIsOexu+a/kuatu+aEn+aIluiAheivtOaYr++8jOa/kuatu+aEn+OAggoK4oCLCeaYqOWkqeaYrzIx5LiW57qqMTDlubTku6PnmoTmnIDlkI7kuIDlpKnvvIzotormnaXotorlpJrnmoTnjrDku6PkurrlsIblhYPml6bkuI7ov4flubTmt7fkuLrkuIDosIjjgILkvYblnKjmiJHnmoTop4Llv7Xph4zvvIzkvKDnu5/lhpzljobmlrDlubTlsIbkuIDnm7TkvZzkuLroh6rlt7HnmoTnuqrlubTmlrnlvI/vvIzov5nkuZ/orqnmiJHkuI7lkajlm7Tkurrlr7nigJ3lhYPml6bigJzov5nkuKrkvLzmmK/ogIzpnZ7nmoToioLml6XmnInmiKrnhLbkuI3lkIznmoTnnIvms5Xlj4rooYzliqjjgILlpKflpJrmlbDkurrku6zpg73pmbflhaXliLDlubTku6PkuqTmm7/vvIzkuIfosaHmm7TmlrDnmoTllpzluobkuYvkuK3jgILln47luILnmoTkuLvopoHooZfpgZPovabovobmjpLooYzvvIzllYblnLrkurrlo7DpvI7msrjvvIzmkanogqnmjqXouLXjgILmnKrog73lhY3kv5fvvIzmu6HotrPlj6PohbnkuYvmrLLlkI7lho3kuZ/kuI3mg7PkuI7pl7nluILmnInku7vkvZXkuqTpm4bvvIzliqDkuYvmoKHop4TmnInnuqbvvIzkvr/pgZPkuIDlo7DigJ3lhYPml6blv6vkuZDigJzvvIzml6nml6nlvZLlr53jgIIKCuKAiwnml6XljobnqIvluo/lgZrov4foh6rlop7kuYvlkI7vvIzlrqTlj4vmj5Dorq7pmLPlj7Dmir3ng5/jgILkuI3nn6XkvZXmlYXpmo/lo7DpmYTlkozvvIzkvr/luKbmnaXkuobov5nmrKHlkZXlkJDjgILnrKzkuIDmoLnng5/miJHnnIvliLDnnLzliY3muoPotKXnmoTmoJHlubLvvIznnIvliLDmsqHmnInkuIDpopfmmJ/mmJ/nmoTpu5HlpJzlkozngbzkurrnmoTngavnuqLjgILnrKzkuozmoLnng5/miJHnnIvliLDpgJ3ljrvnmoTkurLkurrvvIznnIvliLDog4zlj5vnmoTlqZrlp7vvvIznnIvliLDmsLjml6DmraLlooPnmoTkuonlkLXvvIznnIvliLDmnaXljrvml6XmnJ/mmI7kuobnmoTovabnpajvvIznnIvliLDotKrlqarnmoTlj43lmazjgILnrKzkuInmoLnng5/miJHnnIvliLDoh6rlt7HvvIzlj6/mg5zmiJHlpKrmqKHns4rkuobvvIzmiJHnnIvkuI3muIXoh6rlt7HnmoTouqvku73vvIznnIvkuI3muIXoh6rlt7HnmoTlhbPns7vvvIznnIvkuI3muIXoh6rlt7HkuLrkvZXlnKjmraTlpITml6Dnl4XlkbvlkJ/jgILmsqHnrYnnrKzkuInmoLnng5/mir3lrozvvIzmiJHlt7Lnu4/nn6XpgZPoh6rlt7HljbPlsIbph43ouYjopobovpnvvIzkvIHlm77pgJrov4flnZDkuIvmnaXpmLvmraLni7zni4jnmoTlj5HnlJ/vvIzlj6/mmK/ohb/pg6jnmoTogozogonorrDlv4bmnIDnm7Tnmb3kuI3ov4fkuobjgIIKCuKAiwnlsJrlpITmtojljJbpmLbmrrXnmoTpo5/niankvLTpmo/og4Pphbjnu4/nlLHog4PogqDpgZPlkozmtojljJbpgZPmtozlh7rvvIzlkYror4nlj6PohZTlkozlpKfohJHlrr/kuLvmraPnu4/ljoblvLrng4jnmoTlupTmv4Dlj43lupTjgILpnaLlr7nlj6/og73nmoTmrbvkuqHml7bkurrnsbvml6DorrrlpoLkvZXkuZ/pmr7mjqnmnIDnnJ/lrp7nmoTmgZDmg6fvvIzigJ3ml7bpl7TigJzlnKjmhI/or4bph4zkuI3mlq3ph43lpI3vvIzlh7rnlJ/jgIHmrbvkuqHjgIHnu5PlqZrjgIHnprvlqZrjgIHniLbmr43jgIHlrZDlpbPjgIHnlLfkurrjgIHlpbPkurrjgILkuIDkuKrlj4jkuIDkuKrlj5HnlJ/miJbmnKrlj5HnlJ/nmoTlvbHlg4/lnKjmnoHnn63nmoTml7bpl7Tph4zot4PliqjvvIzmg7PliLDoh6rlt7HljbPlsIbliaXnprvmiYDmnInnmoTkuIDliIfvvIznm7jkv6HmiJHvvIzlho3lnZrlvLrnmoTkurrmraTliLvkuZ/kvJrmtYHkuIvnlJ/nkIbmgKfnmoTms6rmsLTvvIzogIzpgqPkupvlj6/mgJznmoTmh6blvLHogIXml6nlt7LlsJ3liLDkuobms6rohbrmiYDkuojnmoTlkrjlkbPjgIIKCuKAiwnlnKjpgqPkuYvlkI7vvIzmnLrkvZPkvJrmhJ/lj5fliLDotoXkuY7lr7vluLjnmoTlubPpnZnvvIzlroHpnZnvvIzmr4/lpKnpg73kvJrmiormiYvmnLrlhbPmnLrmlL7lnKjohJrovrnnmoTplb/kuYXkuaDmg6/lnKjov5nnp43lubPpnZnpnaLliY3kuI3loKrkuIDlh7vvvIzmjqXkuIvmnaXmmK/oh6rnhLbogIznhLbnmoTnnaHnnKDku6Xlj4rmnKznr4fmlofnq6DjgIIKCuKAiwnop4bnur/lj6/op4HojIPlm7TlhoXlj4jlpJrkuobkuIDmoLnnmb3lj5HvvIzoh6rlt7Hlrp7lnKjmi5TkuI3kuIvmnaXvvIzkuZ/msqHkurrluK7miJHmi5TkuIvmnaXjgIIKCg==

《受戒》

《大淖记事》为汪曾祺的经典小说精选集。

《大淖记事》书中所收录篇目,皆是对汪曾祺中短篇小说多次遴选后得出的精品。其中包括《大淖记事》《邂逅》《老鲁》《看水》《七里茶坊》等名篇。

《大淖记事》中,汪曾祺的小说充溢着“中国味儿”,充溢着对传统文化的挚爱,在创作上追求回到现实主义,回到民族传统中去。他的小说让读者重新发现了民族心灵、性灵以及传统美德。

此处的《大淖记事》指ISBN为9787506389310的小说精选集,本文为其中《受戒》的读书笔记

字词

宝刹【bǎo chà】

—— 诸佛的国土或其教化的国土的敬称; 敬辞,称僧尼所在的寺庙。

“宝刹何处?”——“荸荠庵。“ 愚见取意二。

(一)qiáo 割。《齐民要术·收种》:“选好穗纯色者,~刈高悬之。”

(二)qiāo 阉割。~猪。

放瑜伽焰口,拜梁皇忏

瑜伽焰口——佛事仪式。施放焰口,能令饿鬼得度,也是对亡者追荐的佛事之一。除了施舍食物,以解除饿鬼的饥虚之外,最重要的是为他们说法、皈依、授戒,令其具足正见,不再造罪受苦,以祈早日脱离苦趣,成就菩提。 拜忏 ——忏悔。梁皇宝忏即《 慈悲道场忏法 》。

面如朗月,声如钟磬

形容男子样貌

穿堂

指宅院中,座落在前后两个庭院之间可以穿行的厅堂。

韦驮【wéi tuó 】

韦驮又名韦驮天,本是婆罗门的天神,后来被佛教吸收为护法诸天之一。在中国寺院通常将之安置在天王大殿弥勒菩萨之后,面对着释迦牟尼佛像。

龛【kān】

供奉神位、佛像等的小阁子。

炉香乍爇【 ruò 】 法界蒙薰 诸佛现金身

佛语。“ 炉香乍爇 法界蒙熏 诸佛海会悉遥闻 随处结祥云 诚意方殷 诸佛现全身 ” 香炉里头的香,刚刚烧起来。所有的十方无穷无尽的世界,就都受到了这个香气的熏了。许多的佛,同了像海这样大的法会,都远远的闻到这个香气。 香烧出来的烟,随便什么地方,都结成功了吉祥的云。 烧香的人,刚刚动了至诚恳切的念头。 就感动了许多的佛,现出全身来了。见于文中明海与舅舅仁山念早经的场景。

水蓼【liǎo】

一年生草本植物

“ 逢寺挂褡 ”

“就是在庙里住。有斋就吃。”

肐膝【gē】

膝盖

随笔

明海九岁出家。 “宝刹何处?”——“荸荠庵。”

明海在家叫小明子。他是从小就确定要出家的。他的家乡不叫“出家”,叫“当和尚”。他的家乡出和尚。就像有的地方出劁猪的,有的地方出织席子的,有的地方出箍桶的,有的地方出弹棉花的,有的地方出画匠,有的地方出婊子,他的家乡出和尚。

「出家」与「当和尚」,似乎出家更加虔诚,和尚像官一样可以「当」,飘飘然的身份好像也就跌下神坛了。婊子和和尚在文章开头一先一后出现在众多世俗职业中,实在是与众不同。那么本文中婊子和和尚会是主角吗,通读全文后,我想是的。

明子的舅舅就是这样一个「当」和尚的。约定的时间一到,明子便要改名明海了。大淖,”官盐店,税务局,肉铺里挂着成边的猪,一个驴子在磨芝麻,满街都是小磨香油的香味,布店,卖茉莉粉、梳头油的什么斋,卖绒花的,卖丝线的,打把式卖膏药的,吹糖人的,耍蛇的 …… “烟火气的世俗世界多么引人入胜啊,在舅舅的呵斥中,熟悉的生活就像行舟过后的烟波,一去不复返。明子在受戒后能放下这一切吗?

一个女人除外。

“是你要到荸荠庵当和尚吗?” 明子点点头。 “当和尚要烧戒疤呕!你不怕?” 明子不知道怎么回答,就含含糊糊地摇了摇头。 “你叫什么?” “明海。” “在家的时候?” “叫明子。” “明子!我叫小英子!我们是邻居。我家挨着荸荠庵。——给你!” 小英子把吃剩的半个莲蓬扔给明海,小明子就剥开莲蓬壳,一颗一颗吃起来。 大伯一桨一桨地划着,只听见船桨拨水的声音:“哗——许!哗——许!”

和尚与婊子会是明子和小英子吗。

”一花一世界 三藐三菩提“——荸荠庵到了。荸荠庵共有六人, 连明海在内,五个和尚。 这五个和尚似与人们映像中寻常的和尚不太一样:老和尚普照” 一天关在房里,就是那“一花一世界”里。也看不见他念佛,只是那么一声不响地坐着。他是吃斋的,过年时除外。“;大师傅仁山” 即明子的舅舅,是当家的。不叫“方丈”,也不叫“住持”,却叫“当家的”,是很有道理的,因为他确确实实干的是当家的职务。他屋里摆的是一张帐桌,桌子上放的是帐簿和算盘。帐簿共有三本。一本是经帐,一本是租帐,一本是债帐。 “或许还因为仁山相貌黄、胖,声似母猪,打牌老输,不穿袈裟。到底是方丈还是当家的,明眼人不难给出答案。说这荸荠庵有六人却只有五个和尚,剩下一人是谁呢?—— 二师傅仁海的老婆。” 这两口子都很爱干净,整天的洗涮。傍晚的时候,坐在天井里乘凉。 白天,闷在屋里不出来。“ 闷在屋子里干什么呢,小孩子也许不知道。三师傅仁渡聪明精干,” 经忏俱通 ,身怀绝技 “,”会飞铙,会放让大姑娘小媳妇失踪的花焰口 “人们说仁渡有不止一个相好的,可是在荸荠庵里,仁渡” 看到姑娘媳妇总是老老实实的,连一句玩笑话都不说,一句小调山歌都不唱 “。情不过的时候会唱这样的安徽小调:

姐和小郎打大麦,一转子讲得听不得。 听不得就听不得, 打完了大麦打小麦 。…… 姐儿生得漂漂的,两个奶子翘翘的。 有心上去摸一把, 心里有点跳跳的

他们吃肉不瞒人。年下也杀猪。杀猪就在大殿上。一切都和在家人一样,开水、木桶、尖刀。捆猪的时候,猪也是没命地叫。跟在家人不同的,是多一道仪式,要给即将升天的猪念一道“往生咒”,并且总是老师叔念,神情很庄重:“……一切胎生、卵生、息生,来从虚空来,还归虚空去往生再世,皆当欢喜。南无阿弥陀佛!” 三师父仁渡一刀子下去,鲜红的猪血就带着很多沫子喷出来。

明子曾经跟这位正经人(寺院常客)要过铜蜻蜓看看。他拿到小英子家门前试了一试,果然!小英的娘知道了,骂明子:“要死了!儿子!你怎么到我家来玩铜蜻蜓了!”小英子跑过来: “给我!给我!” 她也试了试,真灵,一个黑母鸡一下子就把嘴撑住,傻了眼了!

” 向阳门第春常在 积善人家庆有余 “这里便是明子常去的小英子家了。小英子家四口人,” 赵大伯、赵大妈,两个女儿,大英子、小英子。老两口没得儿子。“为了提高大英子的绣花水平,小英子给赵大妈”保举“了一个人,不偏不倚,正是会画画的明子。

小英子把明海请到家里来,给他磨墨铺纸,小和尚画了几张,大英子喜欢得了不得:“就是这样!就是这样!这就可以乱孱! ……小英子就像个书童,又像个参谋:“画一朵石榴花!” “画一朵栀子花!” 她把花掐来,明海就照着画。 到后来,凤仙花、石竹子、水蓼、淡竹叶,天竺果子、腊梅花,他都能画。 大娘看着也喜欢,搂住明海的和尚头:“你真聪明!你给我当一个干儿子吧!” 小英子捺住他的肩膀,说:“快叫!快叫!” 小明子跪在地下磕了一个头,从此就叫小英子的娘做干娘。…… 每回明子来画花,小英子就给他做点好吃的,煮两个鸡蛋,蒸一碗芋头,煎几个藕团子。 因为照顾姐姐赶嫁妆,田里的零碎生活小英子就全包了。她的帮手,是明子。…… 薅三遍草的时候,秧已经很高了,低下头看不见人。一听见非常脆亮的嗓子在一片浓绿里唱:栀子哎开花哎六瓣头哎……姐家哎门前哎一道桥哎……明海就知道小英子在哪里,三步两步就赶到,赶到就低头薅起草来,傍晚牵牛“打汪”,是明子的事。——水牛怕蚊子。这里的习惯,牛卸了轭,饮了水,就牵到一口和好泥水的“汪”里,由它自己打滚扑腾,弄得全身都是泥浆,这样蚊子就咬不通了。低田上水,只要一挂十四轧的水车,两个人车半天就够了。明子和小英子就伏在车杠上,不紧不慢地踩着车轴上的拐子,轻轻地唱着明海向三师父学来的各处山歌。打场的时候,明子能替赵大伯一会,让他回家吃饭。——赵家自己没有场,每年都在荸荠庵外面的场上打谷子。他一扬鞭子,喊起了打场号子: “格当XX——” 这打场号子有音无字,可是九转十三弯,比什么山歌号子都好听。赵大娘在家,听见明子的号子,就侧起耳朵:“这孩子这条嗓子!” 连大英子也停下针线:“真好听!” 小英子非常骄傲地说:“一十三省数第一!”

晚上,他们一起看场。——荸荠庵收来的租稻也晒在场上。他们并肩坐在一个石磙子上,听青蛙打鼓,听寒蛇唱歌,——这个地方以为蝼蛄叫是蚯蚓叫,而且叫蚯蚓叫“寒蛇”,听纺纱婆子不停地纺纱,“XX——”,看萤火虫飞来飞去,看天上的流星。 “呀!我忘了在裤带上打一个结!”小英子说。 这里的人相信,在流星掉下来的时候在裤带上打一个结,心里想什么好事,就能如愿。

她老是故意用自己的光脚去踩明子的脚。 她挎着一篮子荸荠回去了,在柔软的田埂上留了一串脚印。明海看着她的脚印,傻了。五个小小的趾头,脚掌平平的,脚跟细细的,脚弓部分缺了一块。明海身上有一种从来没有过的感觉,他觉得心里痒痒的。这一串美丽的脚印把小和尚的心搞乱了。

从庵赵庄到县城,当中要经过一片很大的芦花荡子。芦苇长得密密的,当中一条水路,四边不见人。划到这里,明子总是无端端地觉得心里很紧张,他就使劲地划桨。 小英子喊起来: “明子!明子!你怎么啦?你发疯啦?为什么划得这么快?”……

明子要去善因寺受戒了。受过戒的明海要被选为” 沙弥尾 “。” 沙弥尾 “可是要一直待在庙里当方丈的。

“你当沙弥尾吗?” “还不一定哪。” “你当方丈,管善因寺?管这么大一个庙?!” “还早呐!” 划了一气,小英子说:“你不要当方丈!” “好,不当。” “你也不要当沙弥尾!” “好,不当。”

又划了一气,看见那一片芦花荡子了。 小英子忽然把桨放下,走到船尾,趴在明子的耳朵旁边,小声地说:

“我给你当老婆,你要不要?” 明子眼睛鼓得大大的。 “你说话呀!” 明子说:“嗯。” “什么叫‘嗯’呀!要不要,要不要?” 明子大声地说:“要!” “你喊什么!” 明子小小声说:“要——!” “快点划!”

待续

本想另起一篇,让本篇专注于《受戒》的读书笔记。罢了,如果不是翻开书本想必自己也不会或者说也懒得开始写文,何况在这里,我也是免于“受戒”的。

重拾书本已是三年之后了。三年前稀里糊涂误打误撞完成了文科男到程序员的转变,然而,人们总是在变的。闲适懒散的性格注定了我无法在节奏极快的高压环境下获得身心的满足。我喜爱编程,喜爱在调通代码后的很多个清晨午后深夜,创造带给人精神层面的愉悦是一切物质享受所不可媲美的。

可是我还是倦了。

种种迹象表面,我对计算机事业是时候深入浅出了。越来越多的内因外因,量变引起质变,权衡利弊后,我最终决定转向。放弃自己倾注三年的专业,有的人可能会觉得后悔,有的人可能会觉得惋惜,有的人则长期处于焦虑,举棋不定。“东隅已逝,桑榆非晚。”这句话其实是有一个时间节点的,好在目前尚处大三,还有回旋的余地。

我没有浅尝辄止,我尊重并且愈发肯定自己的选择。

英子跳到中舱,两只桨飞快地划起来,划进了芦花荡。芦花才吐新穗。紫灰色的芦穗,发着银光,软软的,滑溜溜的,像一串丝线。有的地方结了蒲棒,通红的,像一枝一枝小蜡烛。青浮萍,紫浮萍。长脚蚊子,水蜘蛛。野菱角开着四瓣的小白花。惊起一只青桩(一种水鸟),擦着芦穗,扑鲁鲁鲁飞远了。

本站文章使用 CC BY-NC-SA 4.0 许可证