0%

下面是使用neo4j构建知识图谱的简明教程,通过一番折腾发现,学习使用一个工具最快的方法不是看文档,而是看视频,然后实操,并记录。

neo4j功能简介

neo4j是一个图形数据关联软件。

可以使用它来构建和维护知识图谱。

知识图谱是智能教育的基础,它是学习者画像、智能推荐、学习分析、智慧内容以及智能导师的前提。

本案例尝试使用三元组构建图谱,所谓三元组是:节点1-连接-节点2。

首先导入csv需要将文件放置在import文件夹中,从neo4j面板可以打开这个文件夹。

每次修改这个文件夹,可能需要重启neo4j,否则可能无法加载。另外确保文件名一致。

常用命令

清空已有节点和关系
MATCH (n) DETACH DELETE n

导入CSV文件

LOAD CSV WITH HEADERS FROM "file:///node1.csv" AS line
MERGE (z:概念1{name:line.node1}) 

LOAD CSV WITH HEADERS FROM "file:///node2.csv" AS line
MERGE (z:概念2{name:line.node2}) 

LOAD CSV WITH HEADERS FROM "file:///tup.csv" AS line  
match (from:概念1{name:line.node1}),(to:概念2{name:line.node2})  
merge (from)-[r:关联{name:line.link}]->(to)

导入并创建节点和关系

LOAD CSV FROM 'file:///tup.csv' AS line CREATE (:Map { linkID: line[0], nod1: line[1], link: line[2], nod2:line[3] });

LOAD CSV FROM 'file:///tup.csv' AS line 
CREATE (line[1])-[r:line[2]]->(line[3]);

显示所有关系

MATCH (n) RETURN (n)

MATCH (n:概念1{name:"细胞"}) RETURN n

MATCH (n:概念1{name:"细胞"})-[]-() RETURN n

利用apoc创建三元图

apoc是一个插件,需要先安装,然后才能调用。

创建概念1节点

LOAD CSV WITH HEADERS FROM "file:///node1.csv" AS line
call apoc.create.node(["Concept1",line.node1],{name:line.node1}) yield node
return node

创建概念2节点

LOAD CSV WITH HEADERS FROM "file:///node2.csv" AS line
call apoc.create.node(["Concept2",line.node2],{name:line.node2}) yield node
return node

创建关联

LOAD CSV WITH HEADERS FROM "file:///tup.csv" AS line
match (c1:Concept1{name:line.node1}),(c2:Concept2{name:line.node2}) 
call apoc.create.relationship(c1,line.link,line{.type},c2) yield rel
return rel

清除重复节点和关系

MATCH (n:Tag)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node

MATCH (n:Concept2)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node

MATCH (a:Concept1)-[r]-(b:Concept2)
WITH a, b, collect(r) as rels
CALL apoc.refactor.mergeRelationships(rels,{properties:"combine"})
YIELD rel 
RETURN count(rel)

路径查询命令

# 两节点之间的所有路径
MATCH p=(a)-[*]->(b)
RETURN p
# a->b 直接连接
MATCH p=(a)-[]->(b)
RETURN p

MATCH p=(:Concept1{name:"细胞"})-[]->(:Concept2{name:"蛋白质"})
RETURN p

# a-...>b a、b之间有三个关系及两个节点
# 等价于 (a) - () - () -> (b)
MATCH p=(a)-[*3]->(b)
RETURN p

# 路径包含2个以上关系
MATCH p=(a)-[*2..]->(b)
RETURN p

# 路径包含6个以内关系
MATCH p=(a)-[*..6]->(b)
RETURN p

# 路径包含3~5个关系
MATCH p=(a)-[*3..5]->(b)
RETURN p

通过三元组csv数据表创建概念网络

这个工作用cmap或者node4j都可以做,cmap适合简单的制图,node4j更适合在服务器端构建知识图谱。下面介绍一下如何通过node4j和一个数据表来生成图库。

部分csv数据表结构如下

hc link tc role
细胞 包含 细胞膜
细胞 包含 细胞质
细胞 多包含 细胞核
细胞 包含 三分之二

其中hc表示head Concept,tc表示tail concept, link是连续词,role是补充说明。

添加节点

LOAD CSV WITH HEADERS FROM "file:///relation.csv" AS line
call apoc.create.node(["Concept",line.hc],{name:line.hc}) yield node
return node

LOAD CSV WITH HEADERS FROM "file:///relation.csv" AS line
call apoc.create.node(["Concept",line.tc],{name:line.tc}) yield node
return node

去除重复节点

MATCH (n:Concept)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node

添加链接

LOAD CSV WITH HEADERS FROM "file:///relation.csv" AS line
match (c1:Concept{name:line.hc}),(c2:Concept{name:line.tc}) 
call apoc.create.relationship(c1,line.link,line{.role},c2) yield rel
return rel

查看效果

MATCH p=()-->() RETURN p LIMIT 100

MATCH p=(:Concept{name:"细胞"})-[]->(:Concept{name:"蛋白质"})
RETURN p

MATCH p=(:Concept{name:"细胞"})-[*]->(:Concept{name:"蛋白质"})
RETURN p

显示结果如下:
map show all the linke between conception cell and protein

修改和完善图谱

增加节点

CREATE (n:Person {name:'John'}) RETURN n

CREATE (n:Concept {name:'细胞呼吸'}) RETURN n

增加链接

MATCH (a:Person {name:'Liz'}), 
      (b:Person {name:'Mike'}) 
MERGE (a)-[:FRIENDS]->(b)

MATCH (a:Concept {name:'光合作用'}), 
      (b:Concept {name:'光反应'}) 
MERGE (a)-[:包含]->(b)

MATCH (a:Concept {name:'光合作用'}), 
      (b:Concept {name:'暗反应'}) 
MERGE (a)-[:包含]->(b)

MATCH p=(:Concept{name:"光合作用"})-[*..3]->()
RETURN p LIMIT 100

数据库操作

备份数据库

如果你对数据库进行了修改,想保留一个备份以备今后使用,那么可以使用neo4j-admin dump命令。

首先先停止服务,然后在shell环境下,运行:

bin/neo4j-admin dump --database=neo4j --to=/dumps/neo4j/neo4j-<timestamp>.dump

具体可以参考官方文档

加载数据库

你还可以使用neo4j-admin load命令加载一个数据库。如果是替换一个已有数据库,你需要先将其停止运行。

bin/neo4j-admin load --from=/dumps/neo4j/neo4j-<timestamp>.dump --database=neo4j --force

复制数据库

使用neo4j-admin copy复制或者选择性复制

STOP DATABASE neo4j

bin/neo4j-admin copy --from-database=neo4j --to-database=copy

ls -al ../data/databases

CREATE DATABASE copy

SHOW DATABASES

还可以筛选数据,下面的命令就是删除cat,dog标签的节点

bin/neo4j-admin copy --from-database=neo4j --to-database=copy --delete-nodes-with-labels="Cat,Dog"

参考官方文档

GWD下载页面,这样写道:Create engaging, interactive HTML5-based designs and motion graphics that can run on any device.

这是GWD对自己的定位,而我接触GWD则是因为再寻找一个替代animate动画制作软件。居然真的被我找到了。GWD应该说是一个不错的替代品。第一它是免费的,第二它是谷歌出品的,第三它支持脚本交互。此外,它符合个人的开发思维习惯。

除了用它可以实现基本动画之外,还可以用它开发小游戏,比如:https://html5advertising.de/2015/09/game-development-with-google-web-designer-ninja-jump-part-i/

视频教程:https://www.youtube.com/watch?v=BPa9Z_t-Wxo

此外,Patrick Voelcker还提供了一个作弊清单如下:

Google Web Designer API Cheatsheet

Change Content:

Textfield: 
gwd.actions.events.getElementById(textFieldId:String).​textContent​= content:String;

Image: 
gwd.actions.events.getElementById(imageId:String).​setAttribute(​"source", imageUrl:String);

Video Player: 
gwd.actions.events.getElementById(videoId:String).s​etAttribute(​"sources", videoUrls:String);

YouTube Player:
gwd.actions.gwdYoutube.​setYouTubeId​(ytPlayerId:String, ytId:String, cueOnly:Boolean);

Exit: 
gwd.actions.events.getElementById(tapAreaId:String).​setAttribute​("data­exit­url", url:String);

CSS: 
gwd.actions.events.s​etInlineStyle(​objectId:String, cssCode:String);

Timeline

gwd.actions.timeline.​play​(objectId:String);
gwd.actions.timeline.​pause​(objectId:String); 
gwd.actions.timeline.​togglePlay​(objectId:String); gwd.actions.timeline.​gotoAndPlay​(objectId:String, labelName:String); gwd.actions.timeline.​gotoAndPause​(objectId:String, labelName:String);

Page Deck

gwd.actions.gwdPagedeck.​goToPage(​'gwd­ad', pageId:String, transitionStyle:String, duration:Number, transitionTiming:String, direction:String)

TaP Aera

gwd.actions.events.getElementById(tapAreaId:String).​setAttribute(​"data­exit­url", url:String) gwd.actions.gwdIframe.​setUrl​(iframeId:String, url:String)
gwd.actions.gwdDoubleclick.​initAd​('gwd­ad');
gwd.actions.gwdDoubleclick.​goToPage​('gwd­ad', pageId:String, transitionStyle:String, duration:Number,
transitionTiming:String, direction:String); gwd.actions.gwdDoubleclick.​exit​('gwd­ad', exitName:String, url:String, collapse:Boolean, pauseMedia:Boolean);
gwd.actions.gwdDoubleclick.​exitOverride​('gwd­ad', exitName:String, url:String, collapse:Boolean, pauseMedia:Boolean);
gwd.actions.gwdDoubleclick.​incrementCounter​('gwd­ad', counterName:String, isCumulative:Boolean); 
gwd.actions.gwdDoubleclick.​startTimer​('gwd­ad', timerName:String); 
gwd.actions.gwdDoubleclick.​stopTimer​('gwd­ad', timerName:String); 
gwd.actions.gwdDoubleclick.​reportManualClose​('gwd­ad‘);
gwd.actions.gwdSwipegallery.​goToFrame​(galleryId:String, frameNumber:Number, transitionStyle:String); 
gwd.actions.gwdSwipegallery.​goForwards​(galleryId:String); 
gwd.actions.gwdSwipegallery.​goBackwards​(galleryId:String); 
gwd.actions.gwdSwipegallery.​rotateOnce​(galleryId:String, duration:Number, direction:String); 
gwd.actions.gwdSwipegallery.​stopRotation​(galleryId:String);
gwd.actions.gwdCarouselgallery.​goToFrame​(galleryId:String, frameNumber:Number, transitionStyle:String); 
gwd.actions.gwdCarouselgallery.​goForwards​(galleryId:String); 
gwd.actions.gwdCarouselgallery.​goBackwards​(galleryId:String); 
gwd.actions.gwdCarouselgallery.​rotateOnce​(galleryId:String, duration:Number, direction:String); 
gwd.actions.gwdCarouselgallery.​stopRotation​(galleryId:String);
gwd.actions.gwd360gallery.​goToFrame​(galleryId:String, frameNumber:Number, transitionStyle:String, direction:String);
gwd.actions.gwd360gallery.​goForwards​(galleryId:String); 
gwd.actions.gwd360gallery.​goBackwards​(galleryId:String); 
gwd.actions.gwd360gallery.​rotateOnce​(galleryId:String, duration:Number, direction:String);

Audio Player

gwd.actions.gwdAudio.​play​(audioPlayerId:String); 
gwd.actions.gwdAudio.​pause​(audioPlayerId:String); 
gwd.actions.gwdAudio.​mute​(audioPlayerId:String); 
gwd.actions.gwdAudio.​replay​(audioPlayerId:String); 
gwd.actions.gwdAudio.​seek​(audioPlayerId:String, time:Number);

Video Player

gwd.actions.gwdVideo.​play​(videoPlayerId:String); 
gwd.actions.gwdVideo.​pause​(videoPlayerId:String); 
gwd.actions.gwdVideo.​mute​(videoPlayerId:String); 
gwd.actions.gwdVideo.​replay​(videoPlayerId:String); 
gwd.actions.gwdVideo.​seek​(videoPlayerId:String, time:Number);

从整个开发流程上,GWD与早期的Flash是否相似,便于快速上手。只不过有缺憾的是,中文教程几乎没有,需要自己试水。

作为动画制作软件,我最先接触的是Flash,完全是出于兴趣自学的业余爱好者。但是,由于教学的需要,偶尔需要动画制作,于是居然摸索着做了不少动画作品。所以,一旦喜欢上什么,潜力是无限的。

新教师是一个特殊群体,他们有热情和理想,却缺乏资源和经验。他们是一群可能会在复杂教育生态中受伤的群体,他们也是教育改革的希望。不知道出于何种原因,新教师可能会承担超负荷的期望和工作量,也许是因为他们脾气好,又或者是他们还缺乏话语权,再或者是给别人别人也不干,最后又只能给新教师。

当然,也有别的可能,比如领导信任或者新教师主动承担额外的工作,但无论是哪一种原因,这都不错一个好兆头。原因是它可能让新教师急于开展教学,而无暇思考教学。如果一名新手生物学教师一周的工作量超过15节,那么就会有问题了,如果超过20节,那么,问题会非常大。原因是新教师需要双倍或更多的时间备课,而且还需要参与培训和班主任工作。

为什么需要那么长的时间呢,因为他们缺少特定主题的教学资源和教学经验,缺乏学科教学知识,也就是把一个内容主题用何种方式能让学生达成更好的理解的知识,比如如何举例,开展何种活动,如何组织,如何评价,使用何种资源,如何使用,这些问题会消耗新手教师相当多的时间。很多老师因此只能疲于应付,结果是简单潦草的教学,失去了教学原本应有的从容和快乐。

如何解决这个问题,如何让新手教师真正的喜欢上教学、热爱教学、学会教学、善于教学,教学资源就是一个所有老师都关心和期待解决的问题。它不是简单的提供和获取资源,它好包括利用和完善资源、创造和交流资源。教学资源成为教师专业成长的关键一环。

sublime 支持正则表达式

#(#{1,})    #可以匹配##,###,####,#####等

更多可以参考廖雪峰的博客:https://www.liaoxuefeng.com/wiki/1252599548343744/1304066080636961

sublime 支持多文件搜索和替换

也就是你可以打开一个文件夹,然搜索该文件夹的所有文件中,是否有指定字符

sublime 支持在replace中使用捕获的字符

find:

my name is (\w+)

replace:

my name used to be $1

在比如,我想把博文中所以##,###,####后面都加上一个空格

find:

"#(#{1,})"

replace:

"#$1 "

为了让大家看到那个空格,我都加了””,实际使用时去除””。

常用的HEXO命令

hexo g #完整命令为hexo generate,用于生成静态文件
hexo s #完整命令为hexo server,用于启动服务器,主要用来本地预览
hexo d #完整命令为hexo deploy,用于将本地文件发布到github上
hexo n #完整命令为hexo new,用于新建一篇文章
hexo g -d #两个命令的合成,一般在修改或者添加博文后直接使用这个命令

pyenv是一个python环境版本管理器,当你有甚多项目,但是用的python版本不同时,为了让程序运行,你需要设定特点的py版本。这时pyenv就能发挥作用了。pyenv也能让你装多个py版本。

# 查看当前版本
pyenv version
# 查看所有版本
pyenv versions
# 查看所有可安装的版本
pyenv install --list
# 安装指定版本
pyenv install 3.6.5
# 安装新版本后rehash一下
pyenv rehash
# 删除指定版本
pyenv uninstall 3.5.2
# 指定全局版本
pyenv global 3.6.5
# 指定多个全局版本, 3版本优先
pyenv global 3.6.5 2.7.14
# 实际上当你切换版本后, 相应的pip和包仓库都是会自动切换过去的

virtualenv是一个虚拟环境管理器,当你的呈现需要不同的程序包版本支持的时候,而且它们往往还是相互排斥的,那么你就可以用它来解决,首先你创建一个虚拟环境,然后在这个环境下安装所需要的包,这样就可以运行相应的呈现了,前提是你需要先进入并激活对应的虚拟环境。

参考:这里

创建并进入虚拟环境

cd code/python_envs
# 方式1:
mkvirtualenv envname01  # 创建完毕会自动进入该虚拟环境
# 方式2:
virtualenv envname02
workon envname02  # 进入该虚拟环境
# 方式3:
virtualenv envname03
cd envname03
source bin/activate  # 激活并进入虚拟环境

配置环境

pip3 install flask
pip3 install django
pip3 install Scipy 

退出环境

deactivate

基于某Python环境创建虚拟环境:

mkvirtualenv -p python2.7 envname01
mkvirtualenv -p python3.6 envname02

常用命令:

mkvirtualenv envname02 #创建并进入虚拟环境
mkvirtualenv -p python3.6 envname02 #基于某Python3.6环境创建虚拟环境
workon #列出虚拟环境:
deactivate #退出虚拟环境
workon envname02  # 切换虚拟环境2
pip3 install 模块名 #为虚拟环境安装模块
pip3 uninstall 模块名 #为虚拟环境卸载模块
lssitepackages  |  pip list  |  pip3 list #查看虚拟环境里安装了哪些包
cpvirtualenv env1 env2  # 复制环境 前面的是原文件 后面的拷贝后的新文件
rmvirtualenv env2  #删除虚拟环境

用pyenv安装python3.6.14遇到的坑

最近升级了Big Sur mac系统,但是用pyenv安装python3.6.14失活不成功,运行:

CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.14 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

提示如下:

-c ./Modules/pwdmodule.c -o Modules/pwdmodule.o
./Modules/posixmodule.c:8210:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
./Modules/posixmodule.c:10432:5: warning: code will never be executed [-Wunreachable-code]
    Py_FatalError("abort() called from Python code didn't abort!");
    ^~~~~~~~~~~~~
1 warning and 1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....

后来,参考了这篇,运行了下面的代码:(功能是在bash_profile里添加环境判断):

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile #添加环境判断
source ~/.bash_profile #更新配置文件

最终才成功安装,这个坑很深。

在线教学在疫情期间成为唯一教学选择,那么教师真实的教学体验如何?通过问卷我们收集到了一些老师的回答,量化数据分析还好说,但是对于老师们的文字反馈,确实让人头疼。

如果严格的分析,需要使用质性分析的方法,通过逐句逐句阅读和编码,形成初步的一级编码,然后对一级编辑进行概括和联系形成二级编码,最后识别主要的theme,进而对问题形成解释模型。但是,时间关系我根本来不及做这样的分析,我只想得到一个大体的结果,形成一个具有概括性的图示来揭示问题。

于是我首先对每个回答进行的标签标记,再经过3个半天的工作后,终于完成了对1000多条反馈的初步标记。最终形成18个重要的类别,不同的教师反馈的标签组合也不同。我最终获得的数据就是1000X18的一个数据表,某个标签出现标记为1,否则0。标签工作是做完了,但是我总不能把这么大的一个表展示给同行吧,于是任务的关键变成了如何将这个数据表可视化。于是我想到了python。我在做博士论文数据可视化的时候就用过,但是还是zoom quite帮我编的程序,这次又需要它救场了。

首先我查了一下python可视化的方法,很多,比较常用的法案是matplotlib+pandas+networkx,其中pandas对接数据,networkx对接网图,matplot对接制图。

可视化的关键是找到绘图思路,我的思路就是如果哪些关键词同时出现,那么这些关键词之间就存在联系,如果同时出现的频率越高,联系也就越紧,所以我想用数据绘制一个关键词网络,进而反应关键词之间的关系和主体划分。

下面我解释一下代码实现过程,下面就是完整的代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

声明编码类型,这里选择UTF-8是为了兼容中英文。

# libraries
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

导入相应的库,python就一个优点,库多,没有找不到的,只有你想不到的,扩张了:)。

df = pd.read_csv('map.csv')  
#print df[1]

使用pd阅读csv文件,确保文件与程序文件在相同目录。

df=df.fillna(np.random.rand()*0.1)

填充缺省值,数据表中很多数据缺失,这里使用了一个小于0.1的随机数进行替换。

print(df.loc[0,:])

检测一下数据是否成功获取

# Calculate the correlation between individuals. We have to transpose first, because the corr function calculate the pairwise correlations between columns.
corr = df.corr()

# Transform it in a links data frame (3 columns only):
links = corr.stack().reset_index()
links.columns = ['var1', 'var2', 'value']

计算相关系数,并把计算结果储存在links中

# Keep only correlation over a threshold and remove self correlation (cor(A,A)=1)
links_filtered=links.loc[ (links['value'] > 0.1) & (links['var1'] != links['var2']) ]

筛选相关系数大于特点临界值的关联。

# Build your graph
G=nx.from_pandas_edgelist(links_filtered, 'var1', 'var2')
# Plot the network:
nx.draw(G, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=10)

基于links_filtered,利用nx构建和绘制网图

plt.show()

如果你的图没显示出来,上面的命令就是把绘制好的图展示出来。

新房子要装修,定制的柜子今天到了,老婆让我去接货,说师傅在外面等着呢。我刚把二宝哄睡,哄睡的方式十分奇葩,孩子吃完午饭,把她放在小车里,在小区里推一圈,推到一半孩子就睡着了。坐在睡着的,头歪在肩膀上,弯成九十度。即便是在搬砖铺砌的小路上颠簸,也没把她颠醒,可见是真困了。跟我一样,午饭后特别犯困。有人曾经一度以为这是一种病,其实就是血液都跑到肠道去了,大脑缺血导致的犯困。

接到催促的电话,我并没有马上行动,因为我发现孩子大臂内侧肿了一个长条形的大包。可能是推她遛弯的时候,不小心被蚊子咬了。我让自己保持镇定,赶紧去厨房找来大蒜,去皮然后用指甲扣掉一部分,反复刮大蒜瓣上的切口,搞出一点大蒜汁液抹在大包上。一般蚊子叮咬之后,越快抹上越有效果。等弄完了一切,我才找到车钥匙赶紧去给师傅开门。

等我到的时候,看到一辆大货车,但是并没看到人。我起着电瓶车就往楼门口骑,在楼房前面,迎面走来一位满脸汗水的汉子,他的个子并不高,但是上身很宽、很结实。我问他是不是往18楼送货,他说:是的,一卡车,有98包。这时保安骑着巡逻车跟了上了,说这里不能停车。我问他可以停哪,他说停到哪边的停车点。我说好的。汉子让我去看已经搬下车并放在楼外面的包裹。这些包裹都是用纸壳箱打包而成的,里面还裹着一层塑料泡沫,主要是防止里面的板材被刮伤。他指了指靠在墙上的2人多高长条形包裹,又指了指靠在另一边又长又宽的包裹,这个包裹用木头订了框架进行保护,他说估计这两个没办法弄上去,因为进不了电梯。我刚想回话,这时保安已经下了巡逻车,催促我不能停车,汉子这时帮腔道:他也没想停这里。我歉意的向汉子挥了挥手,我说等我一下,我先停一下车。于是停了车才回来研究如何把其中的超长和超宽包裹搞上去。汉子说如果能进电梯,我肯定能帮你都送进屋里,但是这2个估计困难,我不可能背着上18楼。我说我也没有办法。并埋怨到发货的也不动动脑子,这样的包裹能好进屋吗。如果不能进屋有两个办法,一个是走楼梯,18楼真实让人望而却步。另外一个办法是用绳子拽上去,但是根本没有这样的绳子和滑轮。于是我说:我也没办法,要不先搬能搬的吧。

于是,我开了门,就在屋里等着师傅把包裹送上了,等了10分钟,估计师傅基本已经把货都卸下来了,才看到师傅用小推车把六七个包裹送上了,我让他放在事先用纸壳铺好的客厅。纸壳是我用了100元在废品回收站买的,这样可以放在弄坏地板。于是我开始数包裹的数量,师傅开始往上搬。中间师傅接了一个电话,我听口音是四川话,就问他是不是四川人,他说是的。他让我计数,因为最后要拍照发给公司。中间他好说起自己曾经装过门窗,搞过装修,他说这个客厅移门可以拆掉,我就说你要不要,要的话,你就拉走好了。他说我可以找小区收废品的,不要钱他们会帮忙运走。大概花了2个小时,师傅终于把能进电梯的都搬上来了。中间我也下去帮忙了几次,主要是挡住电梯门和帮忙调整角度,都不是什么累活。在师傅搬货的过程中,我也打电话向老婆报告了情况,让她联系厂家看是否有办法。搬了一半的时候,刚好老婆和儿子参加完疯狂猫儿童表演活动回来。看到了最后三个无法进电梯的包裹,就跟厂家联系,最后只好把包裹拆开,看里面的货物是否可以一件一件拿上去。老婆看了客厅里的包裹后,十分吃惊,这都是师傅一个人搬上来的。加在一起,大概有一顿多重。她说应可把板子锯断也不能让师傅背了。她让我赶紧去送孩子去打网球,因为5点半的网球课马上开始了。我驮上孩子去出租屋取球拍,顺便我还带上了锯子,准备把特别长的板子锯断。中间我发了一条短信,我说如果师傅要走楼梯的话,就让他背那块板子,另外两个比较轻的我们可以自己拿上18楼。等我送完孩子,回来之后发现板子以及不见了,原来是他们把包裹拆了之后,放进电梯里弄上去了。最后剩下的两条长板子实在是太长不能放进电梯只能走楼梯,但是我们也没让师傅拿,而是我和老婆自己扛上18楼的,幸好并不重。只是每次转弯处都十分困难,想走快也走不快,只能慢慢爬楼,经过10分钟左右,我们两个重要把最后3块板子弄上了楼。

我刚送完孩子的时候,回来看到老婆正在和师傅谈话,因为离的比较远也不知道他们再聊什么。后来,老婆吃完饭的时候说,师傅太累了,她当时还劝师傅换一个工作。我补充到这个钱可不是那么好赚的。我妈说每个人都有自己的工作,他不干还是会有别人干。

回来上楼的时候,我遇到了一个男人和一个男孩,以为他们是父子,他们也到18楼。电梯里我就看这个男人十分熟悉,但是就是想不起来。后来还是老婆在楼下认出来了,他是孩子以前的钢琴启蒙老师赵老师。他就住我们隔壁,老婆问以后是否可以跟赵老师学钢琴。赵老师说他现在教的是基础比较好的,跟着他上楼的就是他的学生。我心想还是搞艺术的人挣钱容易呀。

中国有一群特别的年轻人,他们干劲十足,他们也有同情心,他们都是80后,他们心里也有不平衡,但更多的是拼搏,无论是自觉还是不自觉。他们有不同的社会分工,他们有很大的差异,但是相同的是他们都在牺牲着某些东西,进而追赶社会发展的车轮。而这些牺牲,可能是身体,可能是健康,可能是时间,可能是自由,他们换取的却主要是金钱,不知道他们老了之后,是否会后悔这样的选择。至少在我父亲(50后)弯曲的右手和蹒跚的双腿上,我从内心并不认同这种交换。但奇怪的是我们都被裹挟着、忙碌着、交换着,好像是自愿的,但却也可能是无意识的。我不禁要问:这真是我们最好的选择吗?这真是我们期待的时代吗?我们是不是都丢了什么?

爱因斯坦提出狭义和广义相对论,推翻了刚性时空观,解决了物理学在不同参考系的均权问题。其本质是物理学规律和实验不会随着参考系的不同而不同。也就是,所以的惯性参考系都是等权的。

狭义相对论还假设光速在不同参考系测量值应该相同。基于以上假定就可以推导出洛伦兹变换。见网页-简单推导洛伦兹变换(狭义相对论): https://zhuanlan.zhihu.com/p/105732091

在两个相对运动的参考系中,一个参考系对同一个事件的观察量与另一个参考系的观察量具有线性关系。真实的情况是相对运动的参考系尺度会比自身参考系尺度放大,他测结果会比我测结果小(动车收缩),他测时间会比我测时间短(动钟变慢)

有研究者放弃了光速恒定原理,而仅利用等权原理进行了洛伦兹推导,结果得出了带有参数K的洛伦兹变换。有意思的是当K取不同值时,其物理学意义也不同,特别是V可以区超光速时,其中蕴含了与因果关系相矛盾的情形,与量子力学中概率性、多因果性具有相似之处,作者提出是否可以作为量子力学与相对论联系的纽带。网址:https://www.sohu.com/a/393799883_348129

对于相对论的理解,讲得非常透彻的是《宇宙的琴弦》这本书,每个理论的提出都是源于物理学不可调和的冲突,而每个理论的产生又会制作新的麻烦,就是这这样的不断推翻、重建、再重建的过程中,物理学构建了自己的理论大夏,而即便是这样,其根基仍然尚未彻底牢固。

人生而受限,于是追求超越。胆怯的人选择捷径,结果弥足深陷,勇敢的人选择直面困难,反而实现超越。

阿德勒在《自卑与超越》概括了每个人必须面对的三大人生任务:从事对社会有用的职业或工作、建立卓有成效的人际关系和实现一个人在爱情、婚姻和家庭生活中的角色。

这三大任务如果从生物进化的角度看就是生存、社群、繁殖。其中社区的需要是作为社会性物质的必然,它通过提高生存率和繁殖成功率作用于人类的进化。这也是将人类连接在一起的3条纽带:身体与自然、个人与他人、男人与女人。

健康的人格是自尊、自力、合作。所有的天才都是为社会做出重大贡献的,因为他们更擅长合作。将自己的工作建立在人类工作的基础之上,将自己的工作作为他人继续工作的基础。个体发展相应的就存在自尊的障碍、自力的障碍、合作的障碍。

心智(mindset)或者精神是环境作用于身体神经器官和各种感官的反应,是身体与环境的中介,是个体现有生活方式和目的的桥梁。心智出现的问题,从个体心理学的角度看,往往是个体因为过往认知的偏差和局限导致自我蒙蔽、自我欺骗和自我设限,往往是个体因为缺乏面对环境变化的勇气,而选择了一个错误的目标和路径(捷径),从而逃避作为社会成员的责任,比如自力更生、与人合作、建立家庭。

“自我”本质上是心智进化的副产品。个体心理学研究的就是个体对自我印象的态度。但是这种自我印象往往是基于过去的经验和认知,因此具有局限性,制约我们对未来生活的预期,让我过度悲观或者盲目乐观。由于身体是心灵与社会的中介,身体的孱弱或器官功能的缺失会导致个体花费更多的心力才能达成与别人相同的目标,这容易使得他们没有余力留心环境和关爱他人,结果影响其社会情感和合作能力的发展。

与精神分析学派不同,个体心理学不再停留于对病理现象成因的解释,而是要充分获取个体各种表征片段的基础上,将一个人的目的与其行为作为一个整体进行诠释。《自卑与超越》中描述了这样一个案例:

有一个12岁的小男孩患有尿床症,并且他还经常和妈妈吵架,所以当年他被带到了我的诊所。他儿时的记忆中有这样一段经历:有一次,他躲进了衣橱中,然而妈妈却以为他走丢了,所以非常担心,于是她跑到大街上焦急地去寻找,拼命地呼喊。这样,在他的记忆中就留有了这样一种印象:要想引起别人的注意就要制造一些麻烦。在遭到别人忽视的时候,我可以通过欺骗他人而得到重视。尿床症使他成为众人关心和注意的对象,所以母亲的焦虑和担心更使他对自己的观点深信不疑。在这个例子中我们可以看出:在男孩的心里,外面是一个充满危险的世界,只有让别人担心他才会拥有安全感。他一直认为这是最可靠的方法,在需要的时候,这种办法屡试不爽。

从这个案例可以看出,医生如果只从尿床这个问题下手,根本无助于问题的解决。医生需要了解行为背后的前因后果,进而才能解释问题的本质,从根本上解决问题。比如医生需要改变男孩对环境的恐惧,形成与其他孩子的合作关系,降低对母亲的过度依赖,才能解决尿床问题。