Initial commit
BIN
__pycache__/config.cpython-312.pyc
Normal file
BIN
__pycache__/logger_utils.cpython-312.pyc
Normal file
BIN
__pycache__/pretty_html_table.cpython-312.pyc
Normal file
BIN
backgrounds/.DS_Store
vendored
Normal file
BIN
backgrounds/IMG_5775.WEBP
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
backgrounds/IMG_5776.WEBP
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
backgrounds/IMG_5777.WEBP
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
backgrounds/IMG_5778.WEBP
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
backgrounds/IMG_5779.WEBP
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
backgrounds/IMG_5780.WEBP
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
backgrounds/IMG_5781.WEBP
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
backgrounds/IMG_5782.WEBP
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
backgrounds/IMG_5783.WEBP
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
backgrounds/IMG_5784.JPG
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
backgrounds/IMG_5785.JPG
Normal file
|
After Width: | Height: | Size: 355 KiB |
BIN
backgrounds/IMG_5786.JPG
Normal file
|
After Width: | Height: | Size: 300 KiB |
BIN
backgrounds/IMG_5787.JPG
Normal file
|
After Width: | Height: | Size: 889 KiB |
BIN
backgrounds/IMG_5788.JPG
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
backgrounds/IMG_5789.JPG
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
backgrounds/IMG_5790.JPG
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
backgrounds/IMG_5791.JPG
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
backgrounds/IMG_5792.JPG
Normal file
|
After Width: | Height: | Size: 178 KiB |
BIN
backgrounds/IMG_5793.JPG
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
backgrounds/IMG_5794.JPG
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
backgrounds/IMG_5795.JPG
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
backgrounds/minimal.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
backgrounds/resized_IMG_5785.JPG
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
backgrounds/resized_IMG_5790.JPG
Normal file
|
After Width: | Height: | Size: 44 KiB |
60
backup/config.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# config.py
|
||||||
|
|
||||||
|
#定义内容字体
|
||||||
|
fonts_path = {
|
||||||
|
'title': 'fonts/LXGWWenKai-Medium.TTF',
|
||||||
|
'subtitle': 'fonts/LXGWWenKai-Medium.TTF',
|
||||||
|
'body': 'fonts/LXGWWenKai-Light.TTF',
|
||||||
|
'signature': 'fonts/LXGWWenKai-Light.TTF'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#定义底图模版
|
||||||
|
templates = {
|
||||||
|
'minimal': {
|
||||||
|
'background': 'backgrounds/IMG_5784.JPG',
|
||||||
|
'padding': 50
|
||||||
|
},
|
||||||
|
'modern': {
|
||||||
|
'background': 'backgrounds/IMG_5789.JPG',
|
||||||
|
'padding': 60
|
||||||
|
},
|
||||||
|
'vintage': {
|
||||||
|
'background': 'backgrounds/IMG_5793.JPG',
|
||||||
|
'padding': 70
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#定义各部分内容样式
|
||||||
|
styles = {
|
||||||
|
'title': {
|
||||||
|
'size': 48,
|
||||||
|
'letter_spacing': 0,
|
||||||
|
'color': (30, 30, 30),
|
||||||
|
'line_spacing': 10,
|
||||||
|
'top_spacing': 0,
|
||||||
|
'bottom_spacing': 20
|
||||||
|
},
|
||||||
|
'subtitle': {
|
||||||
|
'size': 32,
|
||||||
|
'letter_spacing': 0,
|
||||||
|
'color': (60, 60, 60),
|
||||||
|
'line_spacing': 10,
|
||||||
|
'top_spacing': 20,
|
||||||
|
'bottom_spacing': 20
|
||||||
|
},
|
||||||
|
'body': {
|
||||||
|
'size': 24,
|
||||||
|
'letter_spacing': 0,
|
||||||
|
'color': (20, 20, 20),
|
||||||
|
'line_spacing': 15
|
||||||
|
},
|
||||||
|
'signature': {
|
||||||
|
'size': 28,
|
||||||
|
'letter_spacing': 2,
|
||||||
|
'color': (80, 80, 80),
|
||||||
|
'position': 'right', # 水平位置:left, center, right
|
||||||
|
'vertical_position': 'bottom', # 垂直位置:bottom, flow
|
||||||
|
'offset': 30 # 距离底部的偏移量
|
||||||
|
}
|
||||||
|
}
|
||||||
31
backup/logger_utils.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# 公共的日志类
|
||||||
|
class CommonLogger:
|
||||||
|
def __init__(self, log_file=None):
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
self.logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建控制台处理器
|
||||||
|
console_handler = logging.StreamHandler()
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建文件处理器(如果指定了日志文件)
|
||||||
|
if log_file:
|
||||||
|
file_handler = logging.FileHandler(log_file)
|
||||||
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
self.logger.addHandler(file_handler)
|
||||||
|
|
||||||
|
# 设置日志格式
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
if log_file:
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
# 添加处理器
|
||||||
|
self.logger.addHandler(console_handler)
|
||||||
|
|
||||||
|
def get_logger(self):
|
||||||
|
return self.logger
|
||||||
|
|
||||||
154
backup/parse_markdown_file.ai.py
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
|
def parse_markdown_file(file_path):
|
||||||
|
xhsdata = defaultdict(dict)
|
||||||
|
filename = file_path.split('/')[-1]
|
||||||
|
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
lines = file.readlines()
|
||||||
|
|
||||||
|
# 解析 YAML 元数据
|
||||||
|
metadata = {}
|
||||||
|
current_key = None
|
||||||
|
current_list = []
|
||||||
|
in_front_matter = False
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '---':
|
||||||
|
if in_front_matter:
|
||||||
|
break
|
||||||
|
in_front_matter = True
|
||||||
|
continue
|
||||||
|
if not in_front_matter:
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.rstrip('\n') # 去除行尾换行符
|
||||||
|
|
||||||
|
# 处理列表项
|
||||||
|
if line.startswith(' - '):
|
||||||
|
if current_key:
|
||||||
|
current_list.append(line[4:].strip())
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 处理键值对
|
||||||
|
if ':' in line:
|
||||||
|
# 保存之前的列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
current_list = []
|
||||||
|
|
||||||
|
key, *value_parts = line.split(':', 1)
|
||||||
|
key = key.strip()
|
||||||
|
value = value_parts[0].strip() if value_parts else ''
|
||||||
|
|
||||||
|
# 检查是否为多行值的开始
|
||||||
|
if value == '':
|
||||||
|
current_key = key
|
||||||
|
current_list = []
|
||||||
|
else:
|
||||||
|
metadata[key] = value
|
||||||
|
current_key = None
|
||||||
|
|
||||||
|
# 保存最后一个列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
|
||||||
|
# 处理标签和分类
|
||||||
|
for field in ['tags', 'xhstags', 'categories']:
|
||||||
|
if field in metadata:
|
||||||
|
value = metadata[field]
|
||||||
|
if isinstance(value, str):
|
||||||
|
# 处理 "[标签1,标签2]" 格式
|
||||||
|
if value.startswith('[') and value.endswith(']'):
|
||||||
|
value = value[1:-1].replace('"', '').split(',')
|
||||||
|
value = [tag.strip() for tag in value if tag.strip()]
|
||||||
|
else:
|
||||||
|
value = [value]
|
||||||
|
xhsdata[filename][field] = value
|
||||||
|
|
||||||
|
# 处理图片路径(重点优化)
|
||||||
|
if 'image' in metadata:
|
||||||
|
image_path = metadata['image']
|
||||||
|
# 移除开头的 /img/ 或 img/,保留后续路径
|
||||||
|
clean_image = re.sub(r'^(/?img/)', '', image_path)
|
||||||
|
xhsdata[filename]['image'] = clean_image
|
||||||
|
|
||||||
|
# 将剩余元数据添加到结果中
|
||||||
|
for key, value in metadata.items():
|
||||||
|
if key not in xhsdata[filename]:
|
||||||
|
xhsdata[filename][key] = value
|
||||||
|
|
||||||
|
# 解析内容和图片
|
||||||
|
xhsdata[filename]['content'] = []
|
||||||
|
xhsdata[filename]['images'] = []
|
||||||
|
in_xhs_section = False
|
||||||
|
current_paragraph = []
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '<!--xhs-->':
|
||||||
|
in_xhs_section = True
|
||||||
|
continue
|
||||||
|
if in_xhs_section:
|
||||||
|
if line.strip() == '':
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
in_xhs_section = False
|
||||||
|
else:
|
||||||
|
# 提取图片路径
|
||||||
|
image_matches = re.findall(r'!\[.*?\]\((.*?)\)', line)
|
||||||
|
image_matches.extend(re.findall(r'!\[\[(.*?)\]\]', line))
|
||||||
|
for match in image_matches:
|
||||||
|
clean_match = re.sub(r'^(/|img/)', '', match)
|
||||||
|
xhsdata[filename]['images'].append(clean_match)
|
||||||
|
|
||||||
|
# 去除图片标记后的文本
|
||||||
|
text = re.sub(r'!\[.*?\]\(.*?\)', '', line).strip()
|
||||||
|
text = re.sub(r'!\[\[.*?\]\]', '', text).strip()
|
||||||
|
if text:
|
||||||
|
current_paragraph.append(text)
|
||||||
|
|
||||||
|
# 处理最后一个段落
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
|
||||||
|
return xhsdata
|
||||||
|
|
||||||
|
# 修改文件路径
|
||||||
|
file_path = 'markdown/test.md'
|
||||||
|
result = parse_markdown_file(file_path)
|
||||||
|
print(json.dumps(result,indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
|
|
||||||
|
''' 豆包自动生成,提示语:
|
||||||
|
用python实现,解析markdown文件,如附件所示,要求:
|
||||||
|
1. 解析的内容放到defaultdict数据结构中:
|
||||||
|
xhsdata =
|
||||||
|
{
|
||||||
|
"filename": {
|
||||||
|
"title": "Labubu爆火现象",
|
||||||
|
"date": "2025-06-19 11:00",
|
||||||
|
"tags": ["潮玩","labubu"……],
|
||||||
|
"where": "杭州市西湖风景名胜区",
|
||||||
|
"open": "yes",
|
||||||
|
"content": ["paragraph1","paragraph2","paragraph3"……],
|
||||||
|
"images":["image1","image2","image3"……],
|
||||||
|
……
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2. 只解析标识<!--xhs-->的段落(直到空行)。
|
||||||
|
3. 文字内容按段放到xhsdata的content[]中的元素里。
|
||||||
|
4. ,,![[path/zzz]]为图片,解析后放到xhsdata的images[]中,如下["path/xxx","path/yyy","path/zzz"]
|
||||||
|
|
||||||
|
元数据中:
|
||||||
|
image路径中去掉/img/或img/;
|
||||||
|
tags、xhstags、categories格式为[游玩,生活]或者
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
解析为tags[]和categories[]
|
||||||
|
'''
|
||||||
335
backup/parse_markdown_file.py
Normal file
@@ -0,0 +1,335 @@
|
|||||||
|
|
||||||
|
#########################################################
|
||||||
|
## @file : parse_markdown_file.py
|
||||||
|
## @desc : parse hugo markdown file
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
# 配置日志
|
||||||
|
def setup_logger(log_file=None):
|
||||||
|
logger = logging.getLogger('markdown_parser')
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建控制台处理器
|
||||||
|
console_handler = logging.StreamHandler()
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建文件处理器(如果指定了日志文件)
|
||||||
|
if log_file:
|
||||||
|
file_handler = logging.FileHandler(log_file)
|
||||||
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
logger.addHandler(file_handler)
|
||||||
|
|
||||||
|
# 设置日志格式
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
if log_file:
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
# 添加处理器
|
||||||
|
logger.addHandler(console_handler)
|
||||||
|
|
||||||
|
return logger
|
||||||
|
|
||||||
|
class MarkdownParser:
|
||||||
|
def __init__(self, log_file=None):
|
||||||
|
self.logger = setup_logger(log_file)
|
||||||
|
self.logger.info("MarkdownParser initialized")
|
||||||
|
|
||||||
|
def parse_markdown_file(self, file_path):
|
||||||
|
"""解析 Markdown 文件,提取元数据和 XHS 内容"""
|
||||||
|
xhsdata = defaultdict(dict)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 验证文件路径
|
||||||
|
file_path = Path(file_path)
|
||||||
|
if not file_path.exists():
|
||||||
|
self.logger.error(f"文件不存在: {file_path}")
|
||||||
|
raise FileNotFoundError(f"文件不存在: {file_path}")
|
||||||
|
|
||||||
|
if not file_path.is_file():
|
||||||
|
self.logger.error(f"不是有效的文件: {file_path}")
|
||||||
|
raise ValueError(f"不是有效的文件: {file_path}")
|
||||||
|
|
||||||
|
filename = file_path.name
|
||||||
|
self.logger.info(f"开始解析文件: {filename}")
|
||||||
|
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
lines = file.readlines()
|
||||||
|
|
||||||
|
# 解析 YAML 元数据
|
||||||
|
metadata = self._parse_metadata(lines)
|
||||||
|
|
||||||
|
# 处理标签和分类
|
||||||
|
self._process_tags_categories(metadata, xhsdata, filename)
|
||||||
|
|
||||||
|
# 处理图片路径
|
||||||
|
self._process_image_path(metadata, xhsdata, filename)
|
||||||
|
|
||||||
|
# 添加剩余元数据
|
||||||
|
for key, value in metadata.items():
|
||||||
|
if key not in xhsdata[filename]:
|
||||||
|
xhsdata[filename][key] = value
|
||||||
|
|
||||||
|
# 解析内容和图片
|
||||||
|
self._parse_content_images(lines, xhsdata, filename)
|
||||||
|
|
||||||
|
self.logger.info(f"文件解析完成: {filename}")
|
||||||
|
return xhsdata
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"解析文件时发生错误: {file_path}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_metadata(self, lines):
|
||||||
|
"""解析 Markdown 文件中的 YAML 元数据"""
|
||||||
|
metadata = {}
|
||||||
|
current_key = None
|
||||||
|
current_list = []
|
||||||
|
in_front_matter = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '---':
|
||||||
|
if in_front_matter:
|
||||||
|
break
|
||||||
|
in_front_matter = True
|
||||||
|
continue
|
||||||
|
if not in_front_matter:
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.rstrip('\n') # 去除行尾换行符
|
||||||
|
|
||||||
|
# 处理列表项
|
||||||
|
if line.startswith(' - '):
|
||||||
|
if current_key:
|
||||||
|
current_list.append(line[4:].strip())
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 处理键值对
|
||||||
|
if ':' in line:
|
||||||
|
# 保存之前的列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
current_list = []
|
||||||
|
|
||||||
|
key, *value_parts = line.split(':', 1)
|
||||||
|
key = key.strip()
|
||||||
|
value = value_parts[0].strip() if value_parts else ''
|
||||||
|
|
||||||
|
# 检查是否为多行值的开始
|
||||||
|
if value == '':
|
||||||
|
current_key = key
|
||||||
|
current_list = []
|
||||||
|
else:
|
||||||
|
metadata[key] = value
|
||||||
|
current_key = None
|
||||||
|
|
||||||
|
# 保存最后一个列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
|
||||||
|
self.logger.debug(f"解析元数据完成: {metadata}")
|
||||||
|
return metadata
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception("解析元数据时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _process_tags_categories(self, metadata, xhsdata, filename):
|
||||||
|
"""处理标签和分类字段"""
|
||||||
|
try:
|
||||||
|
for field in ['tags', 'xhstags', 'categories']:
|
||||||
|
if field in metadata:
|
||||||
|
value = metadata[field]
|
||||||
|
if isinstance(value, str):
|
||||||
|
# 处理 "[标签1,标签2]" 格式
|
||||||
|
if value.startswith('[') and value.endswith(']'):
|
||||||
|
value = value[1:-1].replace('"', '').split(',')
|
||||||
|
value = [tag.strip() for tag in value if tag.strip()]
|
||||||
|
else:
|
||||||
|
value = [value]
|
||||||
|
xhsdata[filename][field] = value
|
||||||
|
self.logger.debug(f"处理 {field}: {value}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"处理标签/分类时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _process_image_path(self, metadata, xhsdata, filename):
|
||||||
|
"""处理图片路径,移除/img/或img/前缀"""
|
||||||
|
try:
|
||||||
|
if 'image' in metadata:
|
||||||
|
image_path = metadata['image']
|
||||||
|
clean_image = re.sub(r'^(/?img/)', '', image_path)
|
||||||
|
xhsdata[filename]['image'] = clean_image
|
||||||
|
self.logger.debug(f"处理图片路径: {image_path} -> {clean_image}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"处理图片路径时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_content_images(self, lines, xhsdata, filename):
|
||||||
|
"""解析内容和图片"""
|
||||||
|
try:
|
||||||
|
xhsdata[filename]['content'] = []
|
||||||
|
xhsdata[filename]['images'] = []
|
||||||
|
xhsdata[filename]['tables'] = [] # 新增表格存储字段
|
||||||
|
in_xhs_section = False
|
||||||
|
current_paragraph = []
|
||||||
|
in_table = False
|
||||||
|
table_rows = []
|
||||||
|
last_line_was_heading = False # 标记上一行是否为标题
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '<!--xhs-->':
|
||||||
|
# 遇到新的 <!--xhs--> 标记,处理当前段落并开始新的
|
||||||
|
if current_paragraph and in_xhs_section:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
self.logger.debug(f"添加段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
in_xhs_section = True
|
||||||
|
last_line_was_heading = False # 重置标题标记
|
||||||
|
continue
|
||||||
|
|
||||||
|
if in_xhs_section:
|
||||||
|
# 结束条件:空行或下一个 <!--xhs-->
|
||||||
|
if line.strip() == '':
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
self.logger.debug(f"添加段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
if in_table:
|
||||||
|
xhsdata[filename]['tables'].append(table_rows)
|
||||||
|
table_rows = []
|
||||||
|
in_table = False
|
||||||
|
in_xhs_section = False
|
||||||
|
last_line_was_heading = False # 重置标题标记
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 检查是否为标题行
|
||||||
|
if line.strip().startswith('#'):
|
||||||
|
# 如果当前有累积的段落内容,先添加到content
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
self.logger.debug(f"添加段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
# 将标题单独添加为一个段落
|
||||||
|
xhsdata[filename]['content'].append(line.strip())
|
||||||
|
self.logger.debug(f"添加标题: {line.strip()[:30]}...")
|
||||||
|
last_line_was_heading = True # 标记上一行是标题
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 如果上一行是标题且当前行没有 <!--xhs--> 标识,则忽略当前行
|
||||||
|
if last_line_was_heading:
|
||||||
|
self.logger.debug(f"忽略标题后的内容: {line.strip()[:30]}...")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 提取图片路径
|
||||||
|
image_matches = re.findall(r'!\[.*?\]\((.*?)\)', line)
|
||||||
|
image_matches.extend(re.findall(r'!\[\[(.*?)\]\]', line))
|
||||||
|
for match in image_matches:
|
||||||
|
clean_match = re.sub(r'^(/?img/)', '', match)
|
||||||
|
xhsdata[filename]['images'].append(clean_match)
|
||||||
|
self.logger.debug(f"提取图片: {clean_match}")
|
||||||
|
|
||||||
|
# 去除图片标记后的文本
|
||||||
|
text = re.sub(r'!\[.*?\]\(.*?\)', '', line).strip()
|
||||||
|
text = re.sub(r'!\[\[.*?\]\]', '', text).strip()
|
||||||
|
|
||||||
|
# 检查是否为表格行
|
||||||
|
if line.strip().startswith('|'):
|
||||||
|
if not in_table:
|
||||||
|
in_table = True
|
||||||
|
row = [cell.strip() for cell in line.strip().strip('|').split('|')]
|
||||||
|
table_rows.append(row)
|
||||||
|
else:
|
||||||
|
if in_table:
|
||||||
|
xhsdata[filename]['tables'].append(table_rows)
|
||||||
|
table_rows = []
|
||||||
|
in_table = False
|
||||||
|
if text:
|
||||||
|
current_paragraph.append(text)
|
||||||
|
last_line_was_heading = False # 重置标题标记
|
||||||
|
|
||||||
|
# 处理最后一个段落
|
||||||
|
if current_paragraph and in_xhs_section:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
self.logger.debug(f"添加最后一个段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
# 处理最后一个表格
|
||||||
|
if in_table:
|
||||||
|
xhsdata[filename]['tables'].append(table_rows)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"解析内容和图片时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def render_to_html(self, xhsdata):
|
||||||
|
"""将 xhsdata 内容渲染为 HTML"""
|
||||||
|
html_parts = []
|
||||||
|
|
||||||
|
for filename, data in xhsdata.items():
|
||||||
|
# 添加 xhstitle
|
||||||
|
if 'xhstitle' in data:
|
||||||
|
html_parts.append(f'<h1 style="font-size: 24px;">{data["xhstitle"]}</h1>')
|
||||||
|
|
||||||
|
# 添加 content
|
||||||
|
for item in data.get('content', []):
|
||||||
|
if item.startswith('#'):
|
||||||
|
level = len(item.split(' ')[0])
|
||||||
|
title_text = item.replace('#' * level, '').strip()
|
||||||
|
font_size = 24 - (level - 1) * 2
|
||||||
|
html_parts.append(f'<h{level} style="font-size: {font_size}px;">{title_text}</h{level}>')
|
||||||
|
else:
|
||||||
|
html_parts.append(f'<p style="font-size: 16px;">{item}</p>')
|
||||||
|
|
||||||
|
# 添加 tables
|
||||||
|
for table in data.get('tables', []):
|
||||||
|
html_parts.append('<table border="1">')
|
||||||
|
for row in table:
|
||||||
|
html_parts.append('<tr>')
|
||||||
|
for cell in row:
|
||||||
|
html_parts.append(f'<td style="font-size: 14px;">{cell}</td>')
|
||||||
|
html_parts.append('</tr>')
|
||||||
|
html_parts.append('</table>')
|
||||||
|
|
||||||
|
# 添加空行,让 xhstags 与内容之间空 3 行
|
||||||
|
for _ in range(3): html_parts.append('<br>')
|
||||||
|
|
||||||
|
# 添加 xhstags,每个 tag 单独一行
|
||||||
|
if 'xhstags' in data:
|
||||||
|
for tag in data['xhstags']:
|
||||||
|
html_parts.append(f'<span style="font-size: 14px;">#{tag}</span><br>')
|
||||||
|
|
||||||
|
# 添加 xhssign
|
||||||
|
if 'xhssign' in data:
|
||||||
|
html_parts.append(f'<br><br><br><span style="font-size: 14px;">{data["xhssign"]}</span><br>')
|
||||||
|
|
||||||
|
html = '\n'.join(html_parts)
|
||||||
|
return html
|
||||||
|
|
||||||
|
# 示例使用
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = MarkdownParser(log_file='markdown_parser.log')
|
||||||
|
try:
|
||||||
|
file_path = 'markdown/test.md'
|
||||||
|
result = parser.parse_markdown_file(file_path)
|
||||||
|
|
||||||
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
|
html_output = parser.render_to_html(result)
|
||||||
|
# 以 GBK 编码保存到文件
|
||||||
|
with open('test.html', 'w', encoding='gbk') as f: f.write(html_output)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"程序运行出错: {e}")
|
||||||
|
|
||||||
242
backup/parse_markdown_file.py.bk
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
|
||||||
|
#########################################################
|
||||||
|
## @file : parse_markdown_file.py
|
||||||
|
## @desc : parse hugo markdown file
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
from collections import defaultdict
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# 配置日志
|
||||||
|
def setup_logger(log_file=None):
|
||||||
|
logger = logging.getLogger('markdown_parser')
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建控制台处理器
|
||||||
|
console_handler = logging.StreamHandler()
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建文件处理器(如果指定了日志文件)
|
||||||
|
if log_file:
|
||||||
|
file_handler = logging.FileHandler(log_file)
|
||||||
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
logger.addHandler(file_handler)
|
||||||
|
|
||||||
|
# 设置日志格式
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
if log_file:
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
# 添加处理器
|
||||||
|
logger.addHandler(console_handler)
|
||||||
|
|
||||||
|
return logger
|
||||||
|
|
||||||
|
class MarkdownParser:
|
||||||
|
def __init__(self, log_file=None):
|
||||||
|
self.logger = setup_logger(log_file)
|
||||||
|
self.logger.info("MarkdownParser initialized")
|
||||||
|
|
||||||
|
def parse_markdown_file(self, file_path):
|
||||||
|
"""解析 Markdown 文件,提取元数据和 XHS 内容"""
|
||||||
|
xhsdata = defaultdict(dict)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 验证文件路径
|
||||||
|
file_path = Path(file_path)
|
||||||
|
if not file_path.exists():
|
||||||
|
self.logger.error(f"文件不存在: {file_path}")
|
||||||
|
raise FileNotFoundError(f"文件不存在: {file_path}")
|
||||||
|
|
||||||
|
if not file_path.is_file():
|
||||||
|
self.logger.error(f"不是有效的文件: {file_path}")
|
||||||
|
raise ValueError(f"不是有效的文件: {file_path}")
|
||||||
|
|
||||||
|
filename = file_path.name
|
||||||
|
self.logger.info(f"开始解析文件: {filename}")
|
||||||
|
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
lines = file.readlines()
|
||||||
|
|
||||||
|
# 解析 YAML 元数据
|
||||||
|
metadata = self._parse_metadata(lines)
|
||||||
|
|
||||||
|
# 处理标签和分类
|
||||||
|
self._process_tags_categories(metadata, xhsdata, filename)
|
||||||
|
|
||||||
|
# 处理图片路径
|
||||||
|
self._process_image_path(metadata, xhsdata, filename)
|
||||||
|
|
||||||
|
# 添加剩余元数据
|
||||||
|
for key, value in metadata.items():
|
||||||
|
if key not in xhsdata[filename]:
|
||||||
|
xhsdata[filename][key] = value
|
||||||
|
|
||||||
|
# 解析内容和图片
|
||||||
|
self._parse_content_images(lines, xhsdata, filename)
|
||||||
|
|
||||||
|
self.logger.info(f"文件解析完成: {filename}")
|
||||||
|
return xhsdata
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"解析文件时发生错误: {file_path}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_metadata(self, lines):
|
||||||
|
"""解析 Markdown 文件中的 YAML 元数据"""
|
||||||
|
metadata = {}
|
||||||
|
current_key = None
|
||||||
|
current_list = []
|
||||||
|
in_front_matter = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '---':
|
||||||
|
if in_front_matter:
|
||||||
|
break
|
||||||
|
in_front_matter = True
|
||||||
|
continue
|
||||||
|
if not in_front_matter:
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.rstrip('\n') # 去除行尾换行符
|
||||||
|
|
||||||
|
# 处理列表项
|
||||||
|
if line.startswith(' - '):
|
||||||
|
if current_key:
|
||||||
|
current_list.append(line[4:].strip())
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 处理键值对
|
||||||
|
if ':' in line:
|
||||||
|
# 保存之前的列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
current_list = []
|
||||||
|
|
||||||
|
key, *value_parts = line.split(':', 1)
|
||||||
|
key = key.strip()
|
||||||
|
value = value_parts[0].strip() if value_parts else ''
|
||||||
|
|
||||||
|
# 检查是否为多行值的开始
|
||||||
|
if value == '':
|
||||||
|
current_key = key
|
||||||
|
current_list = []
|
||||||
|
else:
|
||||||
|
metadata[key] = value
|
||||||
|
current_key = None
|
||||||
|
|
||||||
|
# 保存最后一个列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
|
||||||
|
self.logger.debug(f"解析元数据完成: {metadata}")
|
||||||
|
return metadata
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception("解析元数据时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _process_tags_categories(self, metadata, xhsdata, filename):
|
||||||
|
"""处理标签和分类字段"""
|
||||||
|
try:
|
||||||
|
for field in ['tags', 'xhstags', 'categories']:
|
||||||
|
if field in metadata:
|
||||||
|
value = metadata[field]
|
||||||
|
if isinstance(value, str):
|
||||||
|
# 处理 "[标签1,标签2]" 格式
|
||||||
|
if value.startswith('[') and value.endswith(']'):
|
||||||
|
value = value[1:-1].replace('"', '').split(',')
|
||||||
|
value = [tag.strip() for tag in value if tag.strip()]
|
||||||
|
else:
|
||||||
|
value = [value]
|
||||||
|
xhsdata[filename][field] = value
|
||||||
|
self.logger.debug(f"处理 {field}: {value}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"处理标签/分类时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _process_image_path(self, metadata, xhsdata, filename):
|
||||||
|
"""处理图片路径,移除/img/或img/前缀"""
|
||||||
|
try:
|
||||||
|
if 'image' in metadata:
|
||||||
|
image_path = metadata['image']
|
||||||
|
clean_image = re.sub(r'^(/?img/)', '', image_path)
|
||||||
|
xhsdata[filename]['image'] = clean_image
|
||||||
|
self.logger.debug(f"处理图片路径: {image_path} -> {clean_image}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"处理图片路径时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _parse_content_images(self, lines, xhsdata, filename):
|
||||||
|
"""解析内容和图片"""
|
||||||
|
try:
|
||||||
|
xhsdata[filename]['content'] = []
|
||||||
|
xhsdata[filename]['images'] = []
|
||||||
|
in_xhs_section = False
|
||||||
|
current_paragraph = []
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '<!--xhs-->':
|
||||||
|
# 遇到新的 <!--xhs--> 标记,处理当前段落并开始新的
|
||||||
|
if current_paragraph and in_xhs_section:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
self.logger.debug(f"添加段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
in_xhs_section = True
|
||||||
|
continue
|
||||||
|
|
||||||
|
if in_xhs_section:
|
||||||
|
# 结束条件:空行或下一个 <!--xhs-->
|
||||||
|
if line.strip() == '':
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
self.logger.debug(f"添加段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
in_xhs_section = False
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 提取图片路径
|
||||||
|
image_matches = re.findall(r'!\[.*?\]\((.*?)\)', line)
|
||||||
|
image_matches.extend(re.findall(r'!\[\[(.*?)\]\]', line))
|
||||||
|
for match in image_matches:
|
||||||
|
clean_match = re.sub(r'^(/?img/)', '', match)
|
||||||
|
xhsdata[filename]['images'].append(clean_match)
|
||||||
|
self.logger.debug(f"提取图片: {clean_match}")
|
||||||
|
|
||||||
|
# 去除图片标记后的文本
|
||||||
|
text = re.sub(r'!\[.*?\]\(.*?\)', '', line).strip()
|
||||||
|
text = re.sub(r'!\[\[.*?\]\]', '', text).strip()
|
||||||
|
if text:
|
||||||
|
current_paragraph.append(text)
|
||||||
|
|
||||||
|
# 处理最后一个段落
|
||||||
|
if current_paragraph and in_xhs_section:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
self.logger.debug(f"添加最后一个段落: {xhsdata[filename]['content'][-1][:30]}...")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"解析内容和图片时发生错误")
|
||||||
|
raise
|
||||||
|
|
||||||
|
# 示例使用
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = MarkdownParser(log_file='markdown_parser.log')
|
||||||
|
try:
|
||||||
|
file_path = 'markdown/test.md'
|
||||||
|
result = parser.parse_markdown_file(file_path)
|
||||||
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"程序运行出错: {e}")
|
||||||
|
|
||||||
|
|
||||||
141
backup/parse_markdown_file.py.bk2
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#########################################################
|
||||||
|
## @file : parse_markdown_file.py
|
||||||
|
## @desc : parse hugo markdown file
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
|
def parse_markdown_file(file_path):
|
||||||
|
xhsdata = defaultdict(dict)
|
||||||
|
filename = file_path.split('/')[-1]
|
||||||
|
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
lines = file.readlines()
|
||||||
|
|
||||||
|
# 解析 YAML 元数据
|
||||||
|
metadata = {}
|
||||||
|
current_key = None
|
||||||
|
current_list = []
|
||||||
|
in_front_matter = False
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '---':
|
||||||
|
if in_front_matter:
|
||||||
|
break
|
||||||
|
in_front_matter = True
|
||||||
|
continue
|
||||||
|
if not in_front_matter:
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.rstrip('\n') # 去除行尾换行符
|
||||||
|
|
||||||
|
# 处理列表项
|
||||||
|
if line.startswith(' - '):
|
||||||
|
if current_key:
|
||||||
|
current_list.append(line[4:].strip())
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 处理键值对
|
||||||
|
if ':' in line:
|
||||||
|
# 保存之前的列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
current_list = []
|
||||||
|
|
||||||
|
key, *value_parts = line.split(':', 1)
|
||||||
|
key = key.strip()
|
||||||
|
value = value_parts[0].strip() if value_parts else ''
|
||||||
|
|
||||||
|
# 检查是否为多行值的开始
|
||||||
|
if value == '':
|
||||||
|
current_key = key
|
||||||
|
current_list = []
|
||||||
|
else:
|
||||||
|
metadata[key] = value
|
||||||
|
current_key = None
|
||||||
|
|
||||||
|
# 保存最后一个列表项
|
||||||
|
if current_key and current_list:
|
||||||
|
metadata[current_key] = current_list
|
||||||
|
|
||||||
|
# 处理标签和分类
|
||||||
|
for field in ['tags', 'xhstags', 'categories']:
|
||||||
|
if field in metadata:
|
||||||
|
value = metadata[field]
|
||||||
|
if isinstance(value, str):
|
||||||
|
# 处理 "[标签1,标签2]" 格式
|
||||||
|
if value.startswith('[') and value.endswith(']'):
|
||||||
|
value = value[1:-1].replace('"', '').split(',')
|
||||||
|
value = [tag.strip() for tag in value if tag.strip()]
|
||||||
|
else:
|
||||||
|
value = [value]
|
||||||
|
xhsdata[filename][field] = value
|
||||||
|
|
||||||
|
# 处理图片路径(重点优化)
|
||||||
|
if 'image' in metadata:
|
||||||
|
image_path = metadata['image']
|
||||||
|
# 移除开头的 /img/ 或 img/,保留后续路径
|
||||||
|
clean_image = re.sub(r'^(/?img/)', '', image_path)
|
||||||
|
xhsdata[filename]['image'] = clean_image
|
||||||
|
|
||||||
|
# 将剩余元数据添加到结果中
|
||||||
|
for key, value in metadata.items():
|
||||||
|
if key not in xhsdata[filename]:
|
||||||
|
xhsdata[filename][key] = value
|
||||||
|
|
||||||
|
# 解析内容和图片
|
||||||
|
xhsdata[filename]['content'] = []
|
||||||
|
xhsdata[filename]['images'] = []
|
||||||
|
in_xhs_section = False
|
||||||
|
current_paragraph = []
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if line.strip() == '<!--xhs-->':
|
||||||
|
# 遇到新的 <!--xhs--> 标记,处理当前段落并开始新的
|
||||||
|
if current_paragraph and in_xhs_section:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
in_xhs_section = True
|
||||||
|
continue
|
||||||
|
'''
|
||||||
|
if line.strip() == '<!--xhs-->':
|
||||||
|
in_xhs_section = True
|
||||||
|
continue
|
||||||
|
'''
|
||||||
|
if in_xhs_section:
|
||||||
|
if line.strip() == '':
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
current_paragraph = []
|
||||||
|
in_xhs_section = False
|
||||||
|
else:
|
||||||
|
# 提取图片路径
|
||||||
|
image_matches = re.findall(r'!\[.*?\]\((.*?)\)', line)
|
||||||
|
image_matches.extend(re.findall(r'!\[\[(.*?)\]\]', line))
|
||||||
|
for match in image_matches:
|
||||||
|
clean_match = re.sub(r'^(/|img/)', '', match)
|
||||||
|
xhsdata[filename]['images'].append(clean_match)
|
||||||
|
|
||||||
|
# 去除图片标记后的文本
|
||||||
|
text = re.sub(r'!\[.*?\]\(.*?\)', '', line).strip()
|
||||||
|
text = re.sub(r'!\[\[.*?\]\]', '', text).strip()
|
||||||
|
if text:
|
||||||
|
current_paragraph.append(text)
|
||||||
|
|
||||||
|
# 处理最后一个段落
|
||||||
|
if current_paragraph:
|
||||||
|
xhsdata[filename]['content'].append(' '.join(current_paragraph))
|
||||||
|
|
||||||
|
return xhsdata
|
||||||
|
|
||||||
|
# 修改文件路径
|
||||||
|
file_path = 'markdown/test.md'
|
||||||
|
result = parse_markdown_file(file_path)
|
||||||
|
print(json.dumps(result,indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
|
|
||||||
237
backup/pretty_html_table.py
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
import io
|
||||||
|
|
||||||
|
# Reformat table_color as dict of tuples
|
||||||
|
|
||||||
|
dict_colors = {
|
||||||
|
'yellow_light' : ('#BF8F00', '2px solid #BF8F00', '#FFF2CC', '#FFFFFF'),
|
||||||
|
'grey_light' : ('#808080', '2px solid #808080', '#EDEDED', '#FFFFFF'),
|
||||||
|
'blue_light' : ('#305496', '2px solid #305496', '#D9E1F2', '#FFFFFF'),
|
||||||
|
'orange_light' : ('#C65911', '2px solid #C65911', '#FCE4D6', '#FFFFFF'),
|
||||||
|
'green_light' : ('#548235', '2px solid #548235', '#E2EFDA', '#FFFFFF'),
|
||||||
|
'red_light' : ('#823535', '2px solid #823535', '#efdada', '#FFFFFF'),
|
||||||
|
'yellow_dark' : ('#FFFFFF', '2px solid #BF8F00', '#FFF2CC', '#BF8F00'),
|
||||||
|
'grey_dark' : ('#FFFFFF', '2px solid #808080', '#EDEDED', '#808080'),
|
||||||
|
'blue_dark': ('#FFFFFF', '2px solid #305496', '#D9E1F2', '#305496'),
|
||||||
|
'orange_dark' : ('#FFFFFF', '2px solid #C65911', '#FCE4D6', '#C65911'),
|
||||||
|
'green_dark' : ('#FFFFFF', '2px solid #548235', '#E2EFDA', '#548235'),
|
||||||
|
'red_dark' : ('#FFFFFF', '2px solid #823535', '#efdada', '#823535')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def build_table(
|
||||||
|
df,
|
||||||
|
color,
|
||||||
|
font_size='medium',
|
||||||
|
font_family='Century Gothic, sans-serif',
|
||||||
|
text_align='left',
|
||||||
|
width='auto',
|
||||||
|
index=False,
|
||||||
|
even_color='black',
|
||||||
|
even_bg_color='white',
|
||||||
|
odd_bg_color=None,
|
||||||
|
border_bottom_color=None,
|
||||||
|
escape=True,
|
||||||
|
width_dict=[],
|
||||||
|
padding="0px 20px 0px 0px",
|
||||||
|
float_format=None,
|
||||||
|
conditions={}):
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
# Set color
|
||||||
|
color, border_bottom, odd_background_color, header_background_color = dict_colors[color]
|
||||||
|
|
||||||
|
if odd_bg_color:
|
||||||
|
odd_background_color = odd_bg_color
|
||||||
|
|
||||||
|
if border_bottom_color:
|
||||||
|
border_bottom = border_bottom_color
|
||||||
|
|
||||||
|
a = 0
|
||||||
|
while a != len(df):
|
||||||
|
if a == 0:
|
||||||
|
df_html_output = df.iloc[[a]].to_html(
|
||||||
|
na_rep="",
|
||||||
|
index=index,
|
||||||
|
border=0,
|
||||||
|
escape=escape,
|
||||||
|
float_format=float_format,
|
||||||
|
)
|
||||||
|
# change format of header
|
||||||
|
if index:
|
||||||
|
df_html_output = df_html_output.replace('<th>'
|
||||||
|
,'<th style = "background-color: ' + header_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';color: ' + color
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';border-bottom: ' + border_bottom
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">', len(df.columns)+1)
|
||||||
|
|
||||||
|
df_html_output = df_html_output.replace('<th>'
|
||||||
|
,'<th style = "background-color: ' + odd_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
|
||||||
|
else:
|
||||||
|
df_html_output = df_html_output.replace('<th>'
|
||||||
|
,'<th style = "background-color: ' + header_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';color: ' + color
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';border-bottom: ' + border_bottom
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
|
||||||
|
#change format of table
|
||||||
|
df_html_output = df_html_output.replace('<td>'
|
||||||
|
,'<td style = "background-color: ' + odd_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
body = """<p>""" + format(df_html_output)
|
||||||
|
|
||||||
|
a = 1
|
||||||
|
|
||||||
|
elif a % 2 == 0:
|
||||||
|
df_html_output = df.iloc[[a]].to_html(na_rep = "", index = index, header = False, escape=escape)
|
||||||
|
|
||||||
|
# change format of index
|
||||||
|
df_html_output = df_html_output.replace('<th>'
|
||||||
|
,'<th style = "background-color: ' + odd_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
|
||||||
|
#change format of table
|
||||||
|
df_html_output = df_html_output.replace('<td>'
|
||||||
|
,'<td style = "background-color: ' + odd_background_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
|
||||||
|
body = body + format(df_html_output)
|
||||||
|
|
||||||
|
a += 1
|
||||||
|
|
||||||
|
elif a % 2 != 0:
|
||||||
|
df_html_output = df.iloc[[a]].to_html(na_rep = "", index = index, header = False, escape=escape)
|
||||||
|
|
||||||
|
# change format of index
|
||||||
|
df_html_output = df_html_output.replace('<th>'
|
||||||
|
,'<th style = "background-color: ' + even_bg_color
|
||||||
|
+ '; color: ' + even_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
|
||||||
|
#change format of table
|
||||||
|
df_html_output = df_html_output.replace('<td>'
|
||||||
|
,'<td style = "background-color: ' + even_bg_color
|
||||||
|
+ '; color: ' + even_color
|
||||||
|
+ ';font-family: ' + font_family
|
||||||
|
+ ';font-size: ' + str(font_size)
|
||||||
|
+ ';text-align: ' + text_align
|
||||||
|
+ ';padding: ' + padding
|
||||||
|
+ ';width: ' + str(width) + '">')
|
||||||
|
body = body + format(df_html_output)
|
||||||
|
|
||||||
|
a += 1
|
||||||
|
|
||||||
|
body = body + """</p>"""
|
||||||
|
|
||||||
|
body = body.replace("""</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<table border="1" class="dataframe">
|
||||||
|
<tbody>
|
||||||
|
<tr>""","""</td>
|
||||||
|
</tr>
|
||||||
|
<tr>""").replace("""</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table><table border="1" class="dataframe">
|
||||||
|
<tbody>
|
||||||
|
<tr>""","""</td>
|
||||||
|
</tr>
|
||||||
|
<tr>""")
|
||||||
|
|
||||||
|
if conditions:
|
||||||
|
for k in conditions.keys():
|
||||||
|
try:
|
||||||
|
conditions[k]['index'] = list(df.columns).index(k)
|
||||||
|
width_body = ''
|
||||||
|
w = 0
|
||||||
|
for line in io.StringIO(body):
|
||||||
|
updated_body = False
|
||||||
|
if w == conditions[k]['index']:
|
||||||
|
try:
|
||||||
|
if int(repr(line).split('>')[1].split('<')[0]) < conditions[k]['min']:
|
||||||
|
if 'color: black' in repr(line):
|
||||||
|
width_body = width_body + repr(line).replace("color: black", 'color: ' + conditions[k]['min_color'])[1:]
|
||||||
|
elif 'color: white' in repr(line):
|
||||||
|
width_body = width_body + repr(line).replace("color: white", 'color: ' + conditions[k]['min_color'])[1:]
|
||||||
|
else:
|
||||||
|
width_body = width_body + repr(line).replace('">', '; color: ' + conditions[k]['min_color'] + '">')[1:]
|
||||||
|
updated_body = True
|
||||||
|
elif int(repr(line).split('>')[1].split('<')[0]) > conditions[k]['max']:
|
||||||
|
if 'color: black' in repr(line):
|
||||||
|
width_body = width_body + repr(line).replace("color: black", 'color: ' + conditions[k]['max_color'])[1:]
|
||||||
|
elif 'color: white' in repr(line):
|
||||||
|
width_body = width_body + repr(line).replace("color: white", 'color: ' + conditions[k]['max_color'])[1:]
|
||||||
|
else:
|
||||||
|
width_body = width_body + repr(line).replace('">', '; color: ' + conditions[k]['max_color'] + '">')[1:]
|
||||||
|
updated_body = True
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if not updated_body:
|
||||||
|
width_body = width_body + repr(line)[1:]
|
||||||
|
|
||||||
|
if str(repr(line))[:10] == "' <td" or str(repr(line))[:10] == "' <th":
|
||||||
|
if w == len(df.columns) -1:
|
||||||
|
w = 0
|
||||||
|
else:
|
||||||
|
w += 1
|
||||||
|
body = width_body[:len(width_body)-1]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if len(width_dict) == len(df.columns):
|
||||||
|
width_body = ''
|
||||||
|
w = 0
|
||||||
|
if conditions:
|
||||||
|
for line in body.split(r"\n'"):
|
||||||
|
line = line.replace("\n", "")
|
||||||
|
width_body = width_body + repr(line).replace("width: auto", 'width: ' + width_dict[w])[1:]
|
||||||
|
if str(repr(line))[:10] == "' <td" or str(repr(line))[:10] == "' <th" :
|
||||||
|
if w == len(df.columns) -1:
|
||||||
|
w = 0
|
||||||
|
else:
|
||||||
|
w += 1
|
||||||
|
else:
|
||||||
|
for line in io.StringIO(body):
|
||||||
|
line = line.replace("\n", "")
|
||||||
|
width_body = width_body + repr(line).replace("width: auto", 'width: ' + width_dict[w])[1:]
|
||||||
|
if str(repr(line))[:10] == "' <td" or str(repr(line))[:10] == "' <th" :
|
||||||
|
if w == len(df.columns) -1:
|
||||||
|
w = 0
|
||||||
|
else:
|
||||||
|
w += 1
|
||||||
|
return width_body[:len(width_body)-1].replace("'", "")
|
||||||
|
else:
|
||||||
|
return body.replace(r"\n'", "")
|
||||||
43
backup/push_files.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def get_uncommitted_changes():
|
||||||
|
"""获取所有未提交的修改,并区分新增、删除、修改状态"""
|
||||||
|
changes = {
|
||||||
|
'added': [],
|
||||||
|
'deleted': [],
|
||||||
|
'modified': []
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 获取工作区和暂存区的完整状态
|
||||||
|
status_output = subprocess.check_output(
|
||||||
|
["git", "status", "--porcelain"],
|
||||||
|
text=True,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
).splitlines()
|
||||||
|
|
||||||
|
for line in status_output:
|
||||||
|
status_code = line[:2].strip()
|
||||||
|
file_path = line[3:].strip()
|
||||||
|
|
||||||
|
if status_code == '??':
|
||||||
|
changes['added'].append(file_path)
|
||||||
|
elif status_code == 'D':
|
||||||
|
changes['deleted'].append(file_path)
|
||||||
|
elif status_code in ('M', 'AM', 'MD'):
|
||||||
|
changes['modified'].append(file_path)
|
||||||
|
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return changes
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
changes = get_uncommitted_changes()
|
||||||
|
for status, files in changes.items():
|
||||||
|
if files:
|
||||||
|
print(f"\n{status.upper()}:")
|
||||||
|
for file in files:
|
||||||
|
print(f" - {file}")
|
||||||
|
|
||||||
326
backup/txt_to_image.py
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
#########################################################
|
||||||
|
## @file : txt_to_image.py
|
||||||
|
## @desc : text content convert to image
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
from logger_utils import CommonLogger
|
||||||
|
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
||||||
|
import textwrap
|
||||||
|
import random
|
||||||
|
import os
|
||||||
|
from config import fonts_path, templates, styles
|
||||||
|
|
||||||
|
class TextToImage:
|
||||||
|
"""将文字内容转换为美观图片的类"""
|
||||||
|
def __init__(self, log_file=None):
|
||||||
|
"""初始化字体和模板路径"""
|
||||||
|
self.logger = CommonLogger(log_file).get_logger()
|
||||||
|
self.fonts_path = fonts_path
|
||||||
|
self.templates = templates
|
||||||
|
self.target_size = (1244, 1660) # 目标尺寸:1244x1660
|
||||||
|
|
||||||
|
def create_image(self, title, content, subtitle=None, signature=None,
|
||||||
|
template='minimal',
|
||||||
|
output_path='output.png'):
|
||||||
|
"""创建文字图片"""
|
||||||
|
try:
|
||||||
|
# 确保模板存在
|
||||||
|
if template not in self.templates:
|
||||||
|
raise ValueError(f"模板 '{template}' 不存在")
|
||||||
|
template_data = self.templates[template]
|
||||||
|
|
||||||
|
# 处理背景图片尺寸
|
||||||
|
background = self._process_background(template_data['background'])
|
||||||
|
draw = ImageDraw.Draw(background)
|
||||||
|
width, height = background.size
|
||||||
|
padding = template_data['padding']
|
||||||
|
|
||||||
|
# 从config获取styles
|
||||||
|
title_style = styles['title']
|
||||||
|
subtitle_style = styles['subtitle']
|
||||||
|
body_style = styles['body']
|
||||||
|
signature_style = styles['signature']
|
||||||
|
top_offset = styles['top_offset']
|
||||||
|
bottom_offset = styles['bottom_offset']
|
||||||
|
paragraph_spacing = styles['paragraph_spacing'] # 获取段间距
|
||||||
|
|
||||||
|
# 检查字体文件是否存在
|
||||||
|
for key, path in self.fonts_path.items():
|
||||||
|
if not os.path.exists(path):
|
||||||
|
raise FileNotFoundError(f"字体文件 '{path}' 不存在,请确认已放入fonts目录")
|
||||||
|
|
||||||
|
# 加载字体
|
||||||
|
title_font = ImageFont.truetype(self.fonts_path['title'], title_style['size'])
|
||||||
|
subtitle_font = ImageFont.truetype(self.fonts_path['subtitle'], subtitle_style['size'])
|
||||||
|
body_font = ImageFont.truetype(self.fonts_path['body'], body_style['size'])
|
||||||
|
signature_font = ImageFont.truetype(self.fonts_path['signature'], signature_style['size'])
|
||||||
|
|
||||||
|
# 绘制标题
|
||||||
|
title_x = (width - self._get_text_width(title, title_font, title_style['letter_spacing'])) // 2
|
||||||
|
title_y = padding + title_style['top_spacing'] # 使用 top_spacing
|
||||||
|
self._draw_text_with_spacing(draw, (title_x, title_y), title,
|
||||||
|
title_font, title_style['color'], title_style['letter_spacing'])
|
||||||
|
|
||||||
|
# 计算标题高度
|
||||||
|
title_bbox = draw.textbbox((0, 0), title, font=title_font)
|
||||||
|
title_height = title_bbox[3] - title_bbox[1]
|
||||||
|
|
||||||
|
# 绘制副标题
|
||||||
|
current_y = title_y + title_height + title_style['bottom_spacing']
|
||||||
|
if subtitle:
|
||||||
|
subtitle_x = (width - self._get_text_width(subtitle, subtitle_font, subtitle_style['letter_spacing'])) // 2
|
||||||
|
self._draw_text_with_spacing(draw, (subtitle_x, current_y), subtitle,
|
||||||
|
subtitle_font, subtitle_style['color'], subtitle_style['letter_spacing'])
|
||||||
|
subtitle_bbox = draw.textbbox((0, 0), subtitle, font=subtitle_font)
|
||||||
|
subtitle_height = subtitle_bbox[3] - subtitle_bbox[1]
|
||||||
|
current_y += subtitle_height + subtitle_style['bottom_spacing']
|
||||||
|
|
||||||
|
# 分割内容为段落
|
||||||
|
paragraphs = content.split('\n\n')
|
||||||
|
page_num = 1
|
||||||
|
output_paths = []
|
||||||
|
for i, paragraph in enumerate(paragraphs):
|
||||||
|
if i > 0: # 如果不是第一个段落,添加段间距
|
||||||
|
current_y += paragraph_spacing
|
||||||
|
|
||||||
|
if current_y + self._get_paragraph_height(paragraph, body_font, body_style) > height - bottom_offset:
|
||||||
|
# 绘制签名
|
||||||
|
if signature:
|
||||||
|
self._draw_signature(draw, width, height, padding, signature, signature_font, signature_style)
|
||||||
|
# 保存当前图片
|
||||||
|
output_path_current = output_path.replace('.png', f'_{page_num}.png')
|
||||||
|
background.save(output_path_current)
|
||||||
|
self.logger.info(f"图片已保存至: {output_path_current}")
|
||||||
|
output_paths.append(output_path_current)
|
||||||
|
# 创建新的图片
|
||||||
|
background = self._process_background(template_data['background'])
|
||||||
|
draw = ImageDraw.Draw(background)
|
||||||
|
current_y = top_offset
|
||||||
|
page_num += 1
|
||||||
|
|
||||||
|
# 绘制段落
|
||||||
|
max_width = width - padding * 2
|
||||||
|
wrapped_text = self._wrap_text(paragraph, body_font, max_width, body_style['letter_spacing'])
|
||||||
|
self._draw_multiline_text_with_spacing(
|
||||||
|
draw, (padding, current_y), wrapped_text,
|
||||||
|
body_font, body_style['color'],
|
||||||
|
body_style['letter_spacing'], body_style['line_spacing']
|
||||||
|
)
|
||||||
|
|
||||||
|
# 计算段落高度
|
||||||
|
text_bbox = draw.textbbox((0, 0), wrapped_text, font=body_font)
|
||||||
|
text_height = (text_bbox[3] - text_bbox[1]) + (body_style['line_spacing'] * (wrapped_text.count('\n') or 1))
|
||||||
|
current_y += text_height + body_style['line_spacing']
|
||||||
|
|
||||||
|
# 绘制签名
|
||||||
|
if signature:
|
||||||
|
self._draw_signature(draw, width, height, padding, signature, signature_font, signature_style)
|
||||||
|
|
||||||
|
# 保存最后一张图片
|
||||||
|
output_path_current = output_path.replace('.png', f'_{page_num}.png')
|
||||||
|
background.save(output_path_current)
|
||||||
|
self.logger.info(f"图片已保存至: {output_path_current}")
|
||||||
|
output_paths.append(output_path_current)
|
||||||
|
|
||||||
|
return output_paths
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.exception(f"创建图片时发生错误: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_text_width(self, text, font, letter_spacing):
|
||||||
|
"""计算包含字间距的文本总宽度"""
|
||||||
|
if not text:
|
||||||
|
return 0
|
||||||
|
bbox = font.getbbox(text)
|
||||||
|
return bbox[2] - bbox[0] + (letter_spacing * (len(text) - 1))
|
||||||
|
|
||||||
|
def _draw_text_with_spacing(self, draw, position, text, font, fill, letter_spacing):
|
||||||
|
"""绘制包含字间距的文本"""
|
||||||
|
x, y = position
|
||||||
|
for char in text:
|
||||||
|
draw.text((x, y), char, font=font, fill=fill)
|
||||||
|
# 获取字符宽度并加上字间距
|
||||||
|
char_width = font.getlength(char)
|
||||||
|
x += char_width + letter_spacing
|
||||||
|
|
||||||
|
def _draw_multiline_text_with_spacing(self, draw, position, text, font, fill,
|
||||||
|
letter_spacing, line_spacing):
|
||||||
|
"""绘制包含字间距和行间距的多行文本"""
|
||||||
|
x, y = position
|
||||||
|
lines = text.split('\n')
|
||||||
|
for line in lines:
|
||||||
|
self._draw_text_with_spacing(draw, (x, y), line, font, fill, letter_spacing)
|
||||||
|
# 获取行高并加上行间距
|
||||||
|
line_bbox = draw.textbbox((0, 0), line, font=font)
|
||||||
|
line_height = line_bbox[3] - line_bbox[1]
|
||||||
|
y += line_height + line_spacing
|
||||||
|
|
||||||
|
def _add_decorations(self, draw, width, height, template_data):
|
||||||
|
"""添加装饰元素"""
|
||||||
|
padding = template_data['padding']
|
||||||
|
color = (30, 30, 30) # 默认装饰颜色
|
||||||
|
# 顶部和底部添加细线条
|
||||||
|
#draw.line([(padding, padding//2), (width-padding, padding//2)], fill=color, width=1)
|
||||||
|
#draw.line([(padding, height-padding//2), (width-padding, height-padding//2)], fill=color, width=1)
|
||||||
|
|
||||||
|
# 添加几何装饰点
|
||||||
|
for _ in range(8):
|
||||||
|
x = random.randint(padding, width-padding)
|
||||||
|
y = random.randint(padding, height-padding)
|
||||||
|
draw.ellipse([(x-2, y-2), (x+2, y+2)], fill=color)
|
||||||
|
|
||||||
|
def _wrap_text(self, text, font, max_width, letter_spacing):
|
||||||
|
"""根据最大宽度和字间距智能换行"""
|
||||||
|
if not text:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
avg_char_width = font.getlength('a') + letter_spacing
|
||||||
|
max_chars_per_line = int(max_width // avg_char_width)
|
||||||
|
|
||||||
|
wrapped_text = ""
|
||||||
|
lines = text.split('\n')
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
if not line:
|
||||||
|
wrapped_text += "\n\n"
|
||||||
|
continue
|
||||||
|
|
||||||
|
words = list(line)
|
||||||
|
current_line = ""
|
||||||
|
current_width = 0
|
||||||
|
|
||||||
|
for word in words:
|
||||||
|
word_width = font.getlength(word) + letter_spacing
|
||||||
|
if current_width + word_width > max_width:
|
||||||
|
if current_line:
|
||||||
|
wrapped_text += current_line + "\n"
|
||||||
|
current_line = word
|
||||||
|
current_width = word_width
|
||||||
|
else:
|
||||||
|
wrapped_text += word + "\n"
|
||||||
|
current_line = ""
|
||||||
|
current_width = 0
|
||||||
|
else:
|
||||||
|
current_line += word
|
||||||
|
current_width += word_width
|
||||||
|
if current_line:
|
||||||
|
wrapped_text += current_line + "\n"
|
||||||
|
|
||||||
|
return wrapped_text.strip()
|
||||||
|
|
||||||
|
def _process_background(self, background_path):
|
||||||
|
"""处理背景图片,将宽度调整为1440并等比例缩放高度,然后裁剪或扩展为目标尺寸1244x1660"""
|
||||||
|
target_width, target_height = self.target_size
|
||||||
|
try:
|
||||||
|
# 打开背景图片
|
||||||
|
background = Image.open(background_path).convert("RGBA")
|
||||||
|
bg_width, bg_height = background.size
|
||||||
|
|
||||||
|
# 调整宽度为1440并等比例缩放高度
|
||||||
|
if bg_width != 1440:
|
||||||
|
ratio = 1440 / bg_width
|
||||||
|
new_height = int(bg_height * ratio)
|
||||||
|
background = background.resize((1440, new_height), Image.LANCZOS)
|
||||||
|
|
||||||
|
bg_width, bg_height = background.size
|
||||||
|
|
||||||
|
# 如果图片尺寸大于目标尺寸,进行裁剪
|
||||||
|
if bg_width >= target_width and bg_height >= target_height:
|
||||||
|
# 计算裁剪区域(居中裁剪)
|
||||||
|
left = (bg_width - target_width) // 2
|
||||||
|
top = (bg_height - target_height) // 2
|
||||||
|
right = left + target_width
|
||||||
|
bottom = top + target_height
|
||||||
|
background = background.crop((left, top, right, bottom))
|
||||||
|
|
||||||
|
# 如果图片尺寸小于目标尺寸,进行扩展(白色填充)
|
||||||
|
else:
|
||||||
|
new_background = Image.new("RGBA", self.target_size, (255, 255, 255, 255))
|
||||||
|
# 计算粘贴位置(居中)
|
||||||
|
paste_x = (target_width - bg_width) // 2
|
||||||
|
paste_y = (target_height - bg_height) // 2
|
||||||
|
new_background.paste(background, (paste_x, paste_y))
|
||||||
|
background = new_background
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# 如果背景图片处理失败,创建默认尺寸的白色背景
|
||||||
|
self.logger.exception(f"背景图片处理失败: {e}")
|
||||||
|
background = Image.new("RGBA", self.target_size, (255, 255, 255, 255))
|
||||||
|
|
||||||
|
return background
|
||||||
|
|
||||||
|
def _get_paragraph_height(self, paragraph, font, style):
|
||||||
|
"""计算段落的高度"""
|
||||||
|
max_width = self.target_size[0] - 2 * self.templates['minimal']['padding']
|
||||||
|
wrapped_text = self._wrap_text(paragraph, font, max_width, style['letter_spacing'])
|
||||||
|
text_bbox = ImageDraw.Draw(Image.new("RGBA", self.target_size)).textbbox((0, 0), wrapped_text, font=font)
|
||||||
|
text_height = (text_bbox[3] - text_bbox[1]) + (style['line_spacing'] * (wrapped_text.count('\n') or 1))
|
||||||
|
return text_height
|
||||||
|
|
||||||
|
def _draw_signature(self, draw, width, height, padding, signature, signature_font, signature_style):
|
||||||
|
"""绘制签名"""
|
||||||
|
signature_width = self._get_text_width(signature, signature_font, signature_style['letter_spacing'])
|
||||||
|
signature_bbox = draw.textbbox((0, 0), signature, font=signature_font)
|
||||||
|
signature_height = signature_bbox[3] - signature_bbox[1]
|
||||||
|
|
||||||
|
# 根据配置确定签名垂直位置
|
||||||
|
if signature_style['vertical_position'] == 'bottom':
|
||||||
|
# 固定在底部
|
||||||
|
signature_y = height - padding - signature_height - signature_style['offset']
|
||||||
|
else:
|
||||||
|
# 跟随内容流动(原逻辑)
|
||||||
|
signature_y = current_y + 40
|
||||||
|
|
||||||
|
# 根据配置确定签名水平位置
|
||||||
|
if signature_style['position'] == 'left':
|
||||||
|
signature_x = padding
|
||||||
|
elif signature_style['position'] == 'center':
|
||||||
|
signature_x = (width - signature_width) // 2
|
||||||
|
else: # 'right'
|
||||||
|
signature_x = width - padding - signature_width
|
||||||
|
|
||||||
|
self._draw_text_with_spacing(draw, (signature_x, signature_y), signature,
|
||||||
|
signature_font, signature_style['color'], signature_style['letter_spacing'])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# 示例内容
|
||||||
|
title = "夏日阅读清单"
|
||||||
|
subtitle = "2025年必读书单推荐"
|
||||||
|
content = """日本寺院有抽签的风尚,大概也是收入不菲的创收项目吧。一个个签位,标了价格,无人售票,这种方式挺好,没有买卖的功利和压力。
|
||||||
|
|
||||||
|
不免俗,抽了支,下下,中间有句,大意是人财分离。虽不作兴这个,还是略有不悦。
|
||||||
|
|
||||||
|
逛完突然想着去吃抹茶小点,老杨发现转角处就有一家抹茶专业店,可惜刚打烊。边上小店点了一个撒着浅草字样的冰激凌,无惊喜。
|
||||||
|
|
||||||
|
途经一家电玩店,别有洞天,一排排整齐划一,机器挨着机器,每一排机器造型不同,应该超过500台,空间被利用到极致。充斥着机器电音,令人想起工业朋
|
||||||
|
克。一簇簇坐着的玩家,电子烟是标配,60%是中老年人,秃头大爷和白发老奶不少见,并无少年,颠覆我对游戏厅的印象。
|
||||||
|
|
||||||
|
这里机器是掌控者,人是机器的有机体延伸,机器设定规则,发出吼叫,刺激神经,填满有机体空虚孤独的心。比起从站台跳下去,被机器奴役也并不算太差,这样想来,风月场也好,游戏厅也好,经营者都有功德。"""
|
||||||
|
signature = "@刀波儿"
|
||||||
|
|
||||||
|
# 确保目录存在
|
||||||
|
os.makedirs('fonts', exist_ok=True)
|
||||||
|
os.makedirs('backgrounds', exist_ok=True)
|
||||||
|
|
||||||
|
# 创建简单背景(如果模板不存在)
|
||||||
|
if not os.path.exists('backgrounds/minimal.jpg'):
|
||||||
|
img = Image.new('RGB', (1244, 1660), color=(240, 240, 240))
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
for i in range(0, 1660, 20):
|
||||||
|
draw.line([(0, i), (1244, i)], fill=(230, 230, 230))
|
||||||
|
img.save('backgrounds/minimal.jpg')
|
||||||
|
|
||||||
|
# 生成图片
|
||||||
|
converter = TextToImage(log_file='logs/txt_to_image.log')
|
||||||
|
output_paths = converter.create_image(
|
||||||
|
title=title,
|
||||||
|
subtitle=subtitle,
|
||||||
|
content=content,
|
||||||
|
signature=signature,
|
||||||
|
template='minimal',
|
||||||
|
output_path='temp/reading_list.png'
|
||||||
|
)
|
||||||
|
print("生成的图片路径:", output_paths)
|
||||||
130
config.py
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
#########################################################
|
||||||
|
## @file : config.py
|
||||||
|
## @desc : manage the config params
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
|
||||||
|
#定义内容字体
|
||||||
|
fonts_path = {
|
||||||
|
'title': 'fonts/LXGWWenKai-Medium.TTF',
|
||||||
|
'subtitle': 'fonts/LXGWWenKai-Medium.TTF',
|
||||||
|
'body': 'fonts/LXGWWenKai-Light.TTF',
|
||||||
|
'signature': 'fonts/LXGWWenKai-Light.TTF',
|
||||||
|
'table': 'fonts/LXGWWenKai-Light.TTF'
|
||||||
|
}
|
||||||
|
|
||||||
|
#定义底图模版
|
||||||
|
templates = {
|
||||||
|
'minimal': {
|
||||||
|
'background': 'backgrounds/IMG_5784.JPG',
|
||||||
|
'padding': 150
|
||||||
|
},
|
||||||
|
'modern': {
|
||||||
|
'background': 'backgrounds/IMG_5789.JPG',
|
||||||
|
'padding': 60
|
||||||
|
},
|
||||||
|
'vintage': {
|
||||||
|
'background': 'backgrounds/IMG_5793.JPG',
|
||||||
|
'padding': 70
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#--------------------------------
|
||||||
|
#top_spacing
|
||||||
|
#____________________
|
||||||
|
#____________________title
|
||||||
|
#bottom_spacing
|
||||||
|
#____________________
|
||||||
|
#____________________subtitle
|
||||||
|
#bottom_spacing
|
||||||
|
#____________________
|
||||||
|
#____________________content paragraph
|
||||||
|
#paragraph_spacing
|
||||||
|
#____________________
|
||||||
|
#____________________content paragraph
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#____________________
|
||||||
|
#____________________@sign
|
||||||
|
#offset
|
||||||
|
#--------------------------------
|
||||||
|
#定义各部分内容样式
|
||||||
|
styles = {
|
||||||
|
'bottom_offset': 100, #定义新段落距离模版底部的最小距离
|
||||||
|
'top_offset': 200, #定义内容分页,内容的起始距离模版顶部的距离
|
||||||
|
'paragraph_spacing': 50, #定义段间距
|
||||||
|
'title': {
|
||||||
|
'size': 100,
|
||||||
|
'letter_spacing': 0,
|
||||||
|
'color': (30, 30, 30),
|
||||||
|
'line_spacing': 10,
|
||||||
|
'top_spacing': 70,
|
||||||
|
'bottom_spacing': 70
|
||||||
|
},
|
||||||
|
'subtitle': {
|
||||||
|
'size': 50,
|
||||||
|
'letter_spacing': 0,
|
||||||
|
'color': (60, 60, 60),
|
||||||
|
'line_spacing': 10,
|
||||||
|
'bottom_spacing': 70
|
||||||
|
},
|
||||||
|
'body': {
|
||||||
|
'size': 45, # 增大字体适应更大尺寸
|
||||||
|
'line_spacing': 25,
|
||||||
|
'letter_spacing': 5,
|
||||||
|
'color': (100, 100, 100),
|
||||||
|
'bottom_spacing': 100
|
||||||
|
},
|
||||||
|
# 表格样式(核心优化部分)
|
||||||
|
#'table': {
|
||||||
|
# 'header': {
|
||||||
|
# 'font_size': 24,
|
||||||
|
# 'font_color': 'black',
|
||||||
|
# 'background_color': '#E6E6E6',
|
||||||
|
# 'height': 60, # 增加行高
|
||||||
|
# 'font_family': 'LXGWWenKai-Medium, SimHei, Arial' # 支持中英文字体
|
||||||
|
# },
|
||||||
|
# 'cells': {
|
||||||
|
# 'font_size': 22,
|
||||||
|
# 'font_color': 'black',
|
||||||
|
# 'background_color': 'white',
|
||||||
|
# 'height': 50, # 增加行高
|
||||||
|
# 'line_color': 'black',
|
||||||
|
# 'font_family': 'LXGWWenKai-Light, SimHei, Arial', # 支持中英文字体
|
||||||
|
# 'align': 'left' # 左对齐
|
||||||
|
# },
|
||||||
|
# 'layout': {
|
||||||
|
# 'width': 1200,
|
||||||
|
# 'height': 800,
|
||||||
|
# 'margin': {'t': 50, 'b': 50, 'l': 50, 'r': 50},
|
||||||
|
# 'title': {'text': '项目评估表格', 'font': {'size': 30, 'family': 'LXGWWenKai-Medium, SimHei, Arial'}},
|
||||||
|
# 'showlegend': False
|
||||||
|
# },
|
||||||
|
# 'image': {
|
||||||
|
# 'format': 'png',
|
||||||
|
## 'width': 1200,
|
||||||
|
# 'height': 800,
|
||||||
|
# 'scale': 2
|
||||||
|
# },
|
||||||
|
# 'border': { # 新增边框配置
|
||||||
|
# 'width': 1,
|
||||||
|
# 'color': 'black'
|
||||||
|
# },
|
||||||
|
# 'header_alignment': 'center', # 表头居中
|
||||||
|
# 'cell_alignment': 'left' # 单元格左对齐
|
||||||
|
#},
|
||||||
|
|
||||||
|
'signature': {
|
||||||
|
'size': 36,
|
||||||
|
'letter_spacing': 2,
|
||||||
|
'color': (80, 80, 80),
|
||||||
|
'position': 'right', # 水平位置:left, center, right
|
||||||
|
'vertical_position': 'bottom', # 垂直位置:bottom, flow
|
||||||
|
'offset': 50 # 距离底部的偏移量
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BIN
fonts/LXGWWenKai-Light.ttf
Normal file
BIN
fonts/LXGWWenKai-Medium.ttf
Normal file
BIN
fonts/LXGWWenKai-Regular.ttf
Normal file
BIN
fonts/LXGWWenKaiMono-Light.ttf
Normal file
BIN
fonts/LXGWWenKaiMono-Medium.ttf
Normal file
BIN
fonts/LXGWWenKaiMono-Regular.ttf
Normal file
BIN
fonts/造字工房致黑体.TTF
Normal file
189
generate_table.py
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
|
||||||
|
#########################################################
|
||||||
|
## @file : generate_table.py
|
||||||
|
## @desc : 从json数据,生成html表格,转化为图片
|
||||||
|
## @create : 2025/6/24
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
from pretty_html_table import build_table
|
||||||
|
from PIL import Image
|
||||||
|
import imgkit
|
||||||
|
import os
|
||||||
|
from logger_utils import CommonLogger
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
|
||||||
|
class GenerateTable:
|
||||||
|
def __init__(self, top_margin=100, bottom_margin=100, side_margin=100, table_spacing=100, offset=0):
|
||||||
|
# 初始化日志记录器
|
||||||
|
self.logger = CommonLogger(log_file='temp/example_generate_table.log').get_logger()
|
||||||
|
self.top_margin = top_margin # 表格距离图片顶部的边距,单位为像素,可通过参数传入自定义值
|
||||||
|
self.bottom_margin = bottom_margin # 表格距离图片底部的边距,单位为像素,可通过参数传入自定义值
|
||||||
|
self.side_margin = side_margin # 表格距离图片左右两侧的边距,单位为像素,可通过参数传入自定义值
|
||||||
|
self.table_spacing = table_spacing # 相邻表格之间的间距,单位为像素,可通过参数传入自定义值
|
||||||
|
self.offset = offset # 一个偏移量,用于在计算表格布局时进行微调,单位为像素,可通过参数传入自定义值
|
||||||
|
self.img_width = 1440 # 生成图片的宽度,固定为 1440 像素
|
||||||
|
self.img_height = 1600 # 生成图片的高度,固定为 1600 像素
|
||||||
|
self.options = {
|
||||||
|
"enable-local-file-access": "", # 确保启用本地文件访问
|
||||||
|
"encoding": "UTF-8",
|
||||||
|
"width": self.img_width,
|
||||||
|
"height": self.img_height,
|
||||||
|
'crop-h': self.img_height, # 只保留前 img_height 的图像,后面裁掉
|
||||||
|
|
||||||
|
}
|
||||||
|
self.current_dir = os.getcwd() # 获取当前执行路径
|
||||||
|
self.background_original_path = os.path.join(self.current_dir, 'backgrounds', 'IMG_5790.JPG')
|
||||||
|
self.background_resized_path = os.path.join(self.current_dir, 'backgrounds', 'resized_IMG_5790.JPG')
|
||||||
|
self.temp_dir = os.path.join(self.current_dir, 'temp')
|
||||||
|
self.cell_height = 100 # 单元格高度,便于精确估算表格高度
|
||||||
|
|
||||||
|
# 调整底图大小
|
||||||
|
def resize_background_image(self):
|
||||||
|
try:
|
||||||
|
image = Image.open(self.background_original_path)
|
||||||
|
resized_image = image.resize((self.img_width, self.img_height))
|
||||||
|
resized_image.save(self.background_resized_path)
|
||||||
|
self.logger.info("底图调整大小并保存成功。")
|
||||||
|
return True
|
||||||
|
except FileNotFoundError:
|
||||||
|
self.logger.error("底图文件未找到,请检查文件路径。")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"调整底图大小时出现未知错误: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# 提取表格内容,处理被<p>标签包裹的情况
|
||||||
|
def extract_table_content(self, html_str):
|
||||||
|
try:
|
||||||
|
html_str = html_str.strip()
|
||||||
|
|
||||||
|
# 处理被<p>标签包裹的情况
|
||||||
|
if html_str.startswith('<p>') and html_str.endswith('</p>'):
|
||||||
|
html_str = html_str[3:-4].strip()
|
||||||
|
|
||||||
|
# 确保字符串包含<table class="dataframe">和</table>
|
||||||
|
if '<table class="dataframe">' in html_str and '</table>' in html_str:
|
||||||
|
start_idx = html_str.index('<table class="dataframe">')
|
||||||
|
end_idx = html_str.index('</table>') + len('</table>')
|
||||||
|
return html_str[start_idx:end_idx]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"提取表格内容时出现错误: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 生成 HTML 表格并转换为图片
|
||||||
|
def generate_table_images(self):
|
||||||
|
try:
|
||||||
|
if not self.resize_background_image():
|
||||||
|
return
|
||||||
|
|
||||||
|
df = pd.DataFrame(data={
|
||||||
|
'ID': [1, 2, 3, 4],
|
||||||
|
'First Name': ['Flore', 'Grom', 'Truip', 'Ftro'],
|
||||||
|
'Last Name': ['Ju', 'Re', 'Ve', 'Cy'],
|
||||||
|
'Age': [23, 45, 67, 12],
|
||||||
|
'Place of Birth': ['France', 'USA', 'China', 'India'],
|
||||||
|
'Date of Birth': ['1996-10-04', '1974-10-10', '1952-04-07', '2007-10-06']
|
||||||
|
})
|
||||||
|
|
||||||
|
df2 = pd.DataFrame(data={
|
||||||
|
'维度': ['项目A/Project A', '项目B/Project B', '项目C/Project C', '评估标准/Evaluation'],
|
||||||
|
'进度 Progress': ['按时完成90%的关键里程碑,延期完成10%', '提前两周完成所有阶段', '频繁延期,关键任务延误超过一个月', '按时完 成率≥90%为优秀,80%-89%为良好,<80%为需改进'],
|
||||||
|
'质量 Quality': ['客户满意度调查得分92分', '产品缺陷率低至0.5%', '多次因质量问题返工', '客户满意度≥90%,产品缺陷率≤1%为高质>量'],
|
||||||
|
'成本 Cost': ['超支5%,在可接受范围内', '预算内完成,成本控制出色,节约3%', '成本超支20%', '成本控制在预算+5%内为优秀,+5%-10%>为良好,>10%为需改进'],
|
||||||
|
'风险 Risk': ['无重大损失', '风险识别全面', '风险管理不足', '风险识别率≥90%,有效缓解率≥80%为优秀'],
|
||||||
|
'沟通 Communication': ['定期召开项目会议,沟通记录详尽,反馈及时', '建立了高效的沟通机制使用管理工具促进协作', '沟通不畅,信息 延误导致决策失误', '沟通满意度≥90%,信息传递准确率≥95%为高效沟通']
|
||||||
|
})
|
||||||
|
|
||||||
|
build_table_default = partial(build_table,
|
||||||
|
height=self.cell_height,
|
||||||
|
text_valign='middle',
|
||||||
|
padding="5px 10px 5px 20px",
|
||||||
|
font_family='雅痞-简',
|
||||||
|
font_size='25px'
|
||||||
|
)
|
||||||
|
tables = [
|
||||||
|
build_table_default(df, 'blue_dark'),
|
||||||
|
build_table_default(df2, 'red_dark'),
|
||||||
|
build_table_default(df, 'grey_light'),
|
||||||
|
build_table_default(df2, 'grey_dark'),
|
||||||
|
build_table_default(df, 'orange_light'),
|
||||||
|
build_table_default(df2, 'orange_dark'),
|
||||||
|
build_table_default(df, 'yellow_light'),
|
||||||
|
build_table_default(df2, 'yellow_dark'),
|
||||||
|
build_table_default(df, 'green_light'),
|
||||||
|
build_table_default(df2, 'green_dark'),
|
||||||
|
build_table_default(df, 'red_light'),
|
||||||
|
build_table_default(df2, 'red_dark'),
|
||||||
|
build_table_default(df, 'red_dark'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# 确保临时 HTML 文件夹存在
|
||||||
|
if not os.path.exists(self.temp_dir):
|
||||||
|
os.makedirs(self.temp_dir)
|
||||||
|
|
||||||
|
page_num = 1
|
||||||
|
relative_background_path = os.path.relpath(self.background_resized_path, self.temp_dir)
|
||||||
|
table_width = self.img_width - 2 * self.side_margin
|
||||||
|
current_index = 0 # 记录当前处理到的表格索引
|
||||||
|
|
||||||
|
while current_index < len(tables):
|
||||||
|
current_top = self.top_margin
|
||||||
|
html_content = f"""<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
</head>
|
||||||
|
<body style="background-image: url('{relative_background_path}'); background-size: {self.img_width}px {self.img_height}px;">"""
|
||||||
|
|
||||||
|
while current_index < len(tables):
|
||||||
|
table = tables[current_index]
|
||||||
|
#self.logger.info("原始表格字符串内容:\n%s", table)
|
||||||
|
|
||||||
|
# 提取表格内容
|
||||||
|
table_content = self.extract_table_content(table)
|
||||||
|
if not table_content:
|
||||||
|
self.logger.warning("无法从表格字符串中提取有效表格内容,跳过该表格。")
|
||||||
|
current_index += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
#self.logger.info("提取的表格内容:\n%s", table_content)
|
||||||
|
|
||||||
|
# 精确估算表格高度
|
||||||
|
table_height_est = len(table_content.split('<tr>')) * self.cell_height
|
||||||
|
if current_top + table_height_est + self.bottom_margin > self.img_height - self.offset:
|
||||||
|
break
|
||||||
|
|
||||||
|
style = f"margin-top: {self.table_spacing}px; margin-left: {self.side_margin}px; margin-right: {self.side_margin}px; margin-bottom: {self.table_spacing}px; width: {table_width}px;"
|
||||||
|
table_with_style = f'<table style="{style}">{table_content.split("<table class=\"dataframe\">")[1].split("</table>")[0]}</table>'
|
||||||
|
html_content += table_with_style
|
||||||
|
|
||||||
|
#self.logger.info("当前表格 page_num %s current_index %s current_top %s table_height_est:%s \n%s",
|
||||||
|
# page_num,current_index,current_top,table_height_est,html_content )
|
||||||
|
|
||||||
|
current_top += table_height_est + self.table_spacing
|
||||||
|
current_index += 1
|
||||||
|
|
||||||
|
html_content += "</body></html>"
|
||||||
|
|
||||||
|
html_path = os.path.join(self.temp_dir, f'example_page_{page_num}.html')
|
||||||
|
with open(html_path, 'w', encoding='utf-8') as f:
|
||||||
|
f.write(html_content)
|
||||||
|
img_path = os.path.join(self.temp_dir, f'example_page_{page_num}.png')
|
||||||
|
imgkit.from_file(html_path, img_path, options=self.options)
|
||||||
|
|
||||||
|
self.logger.info("第 %d 页 HTML 文件和图片生成成功。", page_num)
|
||||||
|
page_num += 1
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"生成表格图片时出现未知错误: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
table_generator = GenerateTable()
|
||||||
|
table_generator.generate_table_images()
|
||||||
|
|
||||||
|
|
||||||
8
header
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#########################################################
|
||||||
|
## @file :
|
||||||
|
## @desc :
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
38
logger_utils.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#########################################################
|
||||||
|
## @file : logger_utils.py
|
||||||
|
## @desc : 日志公共类
|
||||||
|
## @create : 2025/6/22
|
||||||
|
## @author : Chengan,doubao AI
|
||||||
|
## @email : douboer@gmail.com
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# 公共的日志类
|
||||||
|
class CommonLogger:
|
||||||
|
def __init__(self, log_file=None):
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
self.logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建控制台处理器
|
||||||
|
console_handler = logging.StreamHandler()
|
||||||
|
console_handler.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# 创建文件处理器(如果指定了日志文件)
|
||||||
|
if log_file:
|
||||||
|
file_handler = logging.FileHandler(log_file)
|
||||||
|
file_handler.setLevel(logging.DEBUG)
|
||||||
|
self.logger.addHandler(file_handler)
|
||||||
|
|
||||||
|
# 设置日志格式
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
if log_file:
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
# 添加处理器
|
||||||
|
self.logger.addHandler(console_handler)
|
||||||
|
|
||||||
|
def get_logger(self):
|
||||||
|
return self.logger
|
||||||
|
|
||||||
137
logs/markdown_parser.log
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
2025-06-23 09:29:02,536 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 09:29:02,536 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 09:29:02,538 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 09:30:14,691 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 09:30:14,692 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 09:30:14,692 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 09:30:35,920 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 09:30:35,920 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 09:30:35,920 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 11:14:22,828 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 11:14:22,828 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 11:14:22,830 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 11:19:44,819 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 11:19:44,819 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 11:19:44,820 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 11:25:33,330 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 11:25:33,331 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 11:25:33,331 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 11:25:46,899 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 11:25:46,899 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 11:25:46,899 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 11:30:33,367 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 11:30:33,367 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 11:30:33,367 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:28:51,553 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:28:51,554 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:28:51,555 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:31:06,945 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:31:06,946 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:31:06,946 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:31:46,290 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:31:46,290 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:31:46,291 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:35:45,309 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:35:45,309 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:35:45,310 - markdown_parser - ERROR - 解析文件时发生错误: markdown/test.md
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/parse_markdown_file.py", line 84, in parse_markdown_file
|
||||||
|
self._parse_content_images(lines, xhsdata, filename)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
AttributeError: 'MarkdownParser' object has no attribute '_parse_content_images'
|
||||||
|
2025-06-23 12:36:16,251 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:36:16,251 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:36:16,252 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:38:41,172 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:38:41,172 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:38:41,173 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:38:55,328 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:38:55,329 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:38:55,329 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:39:08,013 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:39:08,013 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:39:08,013 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:39:16,380 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:39:16,380 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:39:16,381 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 12:39:34,857 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 12:39:34,857 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 12:39:34,858 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:11:52,725 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:11:52,725 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:11:52,726 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:17:03,766 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:17:03,767 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:17:03,767 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:17:08,458 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:17:08,458 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:17:08,458 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:23:31,744 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:23:31,745 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:23:31,746 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:24:02,879 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:24:02,879 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:24:02,880 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:32:05,715 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:32:05,715 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:32:05,716 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:32:15,816 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:32:15,816 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:32:15,816 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:33:33,286 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:33:33,287 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:33:33,287 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:36:40,379 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:36:40,380 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:36:40,380 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:38:10,581 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:38:10,582 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:38:10,582 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:40:56,071 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:40:56,071 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:40:56,072 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:41:27,279 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:41:27,279 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:41:27,280 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:43:50,952 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:43:50,952 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:43:50,953 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:44:36,585 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:44:36,585 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:44:36,586 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:44:55,883 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:44:55,883 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:44:55,884 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:47:17,006 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:47:17,006 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:47:17,007 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 13:48:31,771 - markdown_parser - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 13:48:31,771 - markdown_parser - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 13:48:31,772 - markdown_parser - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 16:40:10,642 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 16:40:10,643 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 16:40:10,644 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 17:36:04,997 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 17:36:04,997 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 17:36:04,998 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 18:55:12,981 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 18:55:12,982 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 18:55:12,983 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 20:56:36,335 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 20:56:36,336 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 20:56:36,337 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 21:02:42,759 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 21:02:42,759 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 21:02:42,760 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 21:35:11,026 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 21:35:11,027 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 21:35:11,028 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 21:43:50,479 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 21:43:50,480 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 21:43:50,481 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 21:44:25,238 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 21:44:25,238 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 21:44:25,239 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
|
2025-06-23 21:46:14,682 - logger_utils - INFO - MarkdownParser initialized
|
||||||
|
2025-06-23 21:46:14,682 - logger_utils - INFO - 开始解析文件: test.md
|
||||||
|
2025-06-23 21:46:14,683 - logger_utils - INFO - 文件解析完成: test.md
|
||||||
2
logs/push_files.log
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
2025-06-23 16:40:34,591 - logger_utils - INFO - 未提交修改: {'added': ['xhsautopublisher/__pycache__/', 'xhsautopublisher/backgrounds/.DS_Store', 'xhsautopublisher/backgrounds/IMG_5775.WEBP', 'xhsautopublisher/backgrounds/IMG_5776.WEBP', 'xhsautopublisher/backgrounds/IMG_5777.WEBP', 'xhsautopublisher/backgrounds/IMG_5778.WEBP', 'xhsautopublisher/backgrounds/IMG_5779.WEBP', 'xhsautopublisher/backgrounds/IMG_5780.WEBP', 'xhsautopublisher/backgrounds/IMG_5781.WEBP', 'xhsautopublisher/backgrounds/IMG_5782.WEBP', 'xhsautopublisher/backgrounds/IMG_5783.WEBP', 'xhsautopublisher/backgrounds/IMG_5784.JPG', 'xhsautopublisher/backgrounds/IMG_5785.JPG', 'xhsautopublisher/backgrounds/IMG_5786.JPG', 'xhsautopublisher/backgrounds/IMG_5787.JPG', 'xhsautopublisher/backgrounds/IMG_5788.JPG', 'xhsautopublisher/backgrounds/IMG_5789.JPG', 'xhsautopublisher/backgrounds/IMG_5790.JPG', 'xhsautopublisher/backgrounds/IMG_5791.JPG', 'xhsautopublisher/backgrounds/IMG_5792.JPG', 'xhsautopublisher/backgrounds/IMG_5793.JPG', 'xhsautopublisher/backgrounds/IMG_5794.JPG', 'xhsautopublisher/backgrounds/IMG_5795.JPG', 'xhsautopublisher/backup/config.py', 'xhsautopublisher/backup/logger_utils.py', 'xhsautopublisher/backup/parse_markdown_file.ai.py', 'xhsautopublisher/backup/parse_markdown_file.py', 'xhsautopublisher/backup/push_files.py', 'xhsautopublisher/config.py', 'xhsautopublisher/logger_utils.py', 'xhsautopublisher/push_files.log'], 'deleted': ['xhsautopublisher/parse_markdown_file.ai.py'], 'modified': ['xhsautopublisher/.DS_Store', 'xhsautopublisher/backgrounds/minimal.jpg', 'xhsautopublisher/backup/txt_to_image.py', 'xhsautopublisher/markdown_parser.log', 'xhsautopublisher/parse_markdown_file.py', 'xhsautopublisher/push_files.py', 'xhsautopublisher/reading_list.png', 'xhsautopublisher/txt_to_image.py']}
|
||||||
|
2025-06-23 17:32:49,297 - logger_utils - INFO - 未提交修改: {'added': [], 'deleted': [], 'modified': []}
|
||||||
80
logs/txt_to_image.log
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
2025-06-23 17:36:27,152 - logger_utils - INFO - 图片已保存至: reading_list.png
|
||||||
|
2025-06-23 18:58:11,319 - logger_utils - INFO - 图片已保存至: reading_list.png
|
||||||
|
2025-06-23 19:11:49,961 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:11:50,234 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 19:43:06,222 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:43:06,509 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 19:43:06,845 - logger_utils - INFO - 图片已保存至: reading_list_3.png
|
||||||
|
2025-06-23 19:43:07,142 - logger_utils - INFO - 图片已保存至: reading_list_4.png
|
||||||
|
2025-06-23 19:44:18,598 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:44:18,883 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 19:44:19,216 - logger_utils - INFO - 图片已保存至: reading_list_3.png
|
||||||
|
2025-06-23 19:44:19,511 - logger_utils - INFO - 图片已保存至: reading_list_4.png
|
||||||
|
2025-06-23 19:45:48,683 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:46:57,358 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:48:40,960 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:48:41,230 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 19:49:06,452 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:49:06,720 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 19:57:34,020 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 19:57:34,401 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:00:21,869 - logger_utils - ERROR - 创建图片时发生错误: 'bottom_spacing'
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 69, in create_image
|
||||||
|
current_y = title_y + title_height + title_style['bottom_spacing']
|
||||||
|
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
|
||||||
|
KeyError: 'bottom_spacing'
|
||||||
|
2025-06-23 20:01:21,538 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:01:21,921 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:02:07,604 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:02:07,987 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:07:49,482 - logger_utils - ERROR - 创建图片时发生错误: 'paragraph_spacing'
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 48, in create_image
|
||||||
|
paragragh_spacing = styles['paragraph_spacing']
|
||||||
|
~~~~~~^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
KeyError: 'paragraph_spacing'
|
||||||
|
2025-06-23 20:08:38,844 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:08:39,227 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:12:22,639 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:12:23,015 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:13:03,566 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:13:03,946 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:13:26,912 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:13:27,291 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:25:46,696 - logger_utils - INFO - 图片已保存至: reading_list_1.png
|
||||||
|
2025-06-23 20:25:47,076 - logger_utils - INFO - 图片已保存至: reading_list_2.png
|
||||||
|
2025-06-23 20:34:52,439 - logger_utils - INFO - 图片已保存至: temp/reading_list_1.png
|
||||||
|
2025-06-23 20:34:52,816 - logger_utils - INFO - 图片已保存至: temp/reading_list_2.png
|
||||||
|
2025-06-23 21:10:34,685 - logger_utils - INFO - 图片已保存至: temp/reading_list_1.png
|
||||||
|
2025-06-23 21:10:35,077 - logger_utils - INFO - 图片已保存至: temp/reading_list_2.png
|
||||||
|
2025-06-23 21:15:00,783 - logger_utils - ERROR - 创建图片时发生错误: 'table'
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 61, in create_image
|
||||||
|
table_font = ImageFont.truetype(self.fonts_path['table'], body_style['size']) # 增加表格字体
|
||||||
|
~~~~~~~~~~~~~~~^^^^^^^^^
|
||||||
|
KeyError: 'table'
|
||||||
|
2025-06-23 21:16:13,027 - logger_utils - INFO - 图片已保存至: temp/reading_list_1.png
|
||||||
|
2025-06-23 21:16:13,416 - logger_utils - INFO - 图片已保存至: temp/reading_list_2.png
|
||||||
|
2025-06-23 21:27:12,900 - logger_utils - ERROR - 创建图片时发生错误: 'TextToImage' object has no attribute '_draw_text_with_spacing'
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 49, in create_image
|
||||||
|
title_paths = self._draw_title_page(draw, width, height, padding, title, subtitle,
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 90, in _draw_title_page
|
||||||
|
self._draw_text_with_spacing(draw, (title_x, current_y), title,
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
AttributeError: 'TextToImage' object has no attribute '_draw_text_with_spacing'
|
||||||
|
2025-06-23 21:29:28,609 - logger_utils - ERROR - 创建图片时发生错误: 'TextToImage' object has no attribute '_draw_text_with_spacing'
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 50, in create_image
|
||||||
|
title_paths = self._draw_title_page(draw, width, height, padding, title, subtitle,
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "/Users/gavin/myweb/xhsautopublisher/txt_to_image.py", line 91, in _draw_title_page
|
||||||
|
self._draw_text_with_spacing(draw, (title_x, current_y), title,
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
AttributeError: 'TextToImage' object has no attribute '_draw_text_with_spacing'
|
||||||
|
2025-06-23 21:31:22,378 - logger_utils - INFO - 图片已保存至: temp/reading_list_1.png
|
||||||
|
2025-06-23 21:31:22,760 - logger_utils - INFO - 图片已保存至: temp/reading_list_2.png
|
||||||
|
2025-06-24 18:13:50,849 - logger_utils - INFO - 图片已保存至: temp/reading_list_1.png
|
||||||
|
2025-06-24 18:13:51,064 - logger_utils - INFO - 图片已保存至: temp/reading_list_2.png
|
||||||
BIN
markdown/.DS_Store
vendored
Normal file
30
markdown/2025ZK3.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 2025篆刻记录-0413
|
||||||
|
subtitle: ""
|
||||||
|
description:
|
||||||
|
date: 2025-04-13 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 篆刻
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 小艺
|
||||||
|
slug: "2025ZK3"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
![[2025ZK3-4.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK3-3.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK3-2.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK3-1.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK3.jpg]]
|
||||||
|
|
||||||
99
markdown/2025ZK4.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 2025篆刻记录-1月
|
||||||
|
subtitle: ""
|
||||||
|
description:
|
||||||
|
date: 2025-01-11 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 篆刻
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 小艺
|
||||||
|
slug: "2025ZK4"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
||r 琴瑟在御莫不静好
|
||||||
|
---
|
||||||
|
![[天长地久-15.jpg]]
|
||||||
|
![[天长地久-10.jpg]]
|
||||||
|
|
||||||
|
![[天长地久-11.jpg]]
|
||||||
|
|
||||||
|
||r 大音希声
|
||||||
|
---
|
||||||
|
![[天长地久-12.jpg]]
|
||||||
|
|
||||||
|
||r 不笑不足为道
|
||||||
|
---
|
||||||
|
![[天长地久-18.jpg]]
|
||||||
|
|
||||||
|
![[天长地久-13.jpg]]
|
||||||
|
|
||||||
|
||r 清静为天下正
|
||||||
|
---
|
||||||
|
![[天长地久-14.jpg]]
|
||||||
|
|
||||||
|
||r 三生万物
|
||||||
|
---
|
||||||
|
![[天长地久-16.jpg]]
|
||||||
|
![[天长地久-9.jpg]]
|
||||||
|
|
||||||
|
||r 有余以奉天下
|
||||||
|
---
|
||||||
|
![[天长地久-17.jpg]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
三代古玺总体上以朱文小印为主体,古人在这么小空间里,能够错落有致的把文字排布妥帖,或刻或凿或焊或铸,经得起用放大镜检视,不简单。
|
||||||
|
|
||||||
|
个人,金文基础,刀法的逐步熟练,加上对古玺的理解加深,基本可以比较自如设计古玺,气息上与古通连。
|
||||||
|
|
||||||
|
近期从道德经81章的每一章中取若干字,设计成稿,镌刻成印,以为练习。
|
||||||
|
|
||||||
|
后续需精研白文和隶书边款呢。
|
||||||
|
|
||||||
|
|
||||||
|
||r 用之不勤
|
||||||
|
---
|
||||||
|
![[天长地久.jpg]]
|
||||||
|
|
||||||
|
||r 知常曰明
|
||||||
|
---
|
||||||
|
![[天长地久-1.jpg]]
|
||||||
|
|
||||||
|
||r 能婴儿乎
|
||||||
|
---
|
||||||
|
![[天长地久-2.jpg]]
|
||||||
|
|
||||||
|
||r 虚而不屈
|
||||||
|
---
|
||||||
|
![[天长地久-3.jpg]]
|
||||||
|
|
||||||
|
||r 静笃
|
||||||
|
---
|
||||||
|
![[天长地久-4.jpg]]
|
||||||
|
|
||||||
|
||r 天长地久
|
||||||
|
---
|
||||||
|
![[天长地久-5.jpg]]
|
||||||
|
|
||||||
|
||r 肖形蛇🐍
|
||||||
|
---
|
||||||
|
![[天长地久-6.jpg]]
|
||||||
|
|
||||||
|
||r 高下相盈
|
||||||
|
---
|
||||||
|
![[天长地久-7.jpg]]
|
||||||
|
|
||||||
|
||r 若水
|
||||||
|
---
|
||||||
|
![[天长地久-8.jpg]]
|
||||||
|
|
||||||
|
|
||||||
28
markdown/2025ZK6.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 2025篆刻记录-0314
|
||||||
|
subtitle: ""
|
||||||
|
description: ""
|
||||||
|
date: 2025-03-14 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 篆刻
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 小艺
|
||||||
|
slug: "2025ZK6"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
![[2025ZK6-3.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK6-2.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK6-1.jpg]]
|
||||||
|
|
||||||
|
![[2025ZK6.jpg]]
|
||||||
|
|
||||||
25
markdown/2025ZK7.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 2025篆刻记录-0308
|
||||||
|
subtitle: ""
|
||||||
|
description:
|
||||||
|
date: 2025-03-08 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 篆刻
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 小艺
|
||||||
|
slug: "2025ZK7"
|
||||||
|
---
|
||||||
|
|
||||||
|
这两方刻完并不满意,仅做练习。回头再看,有几分自然意趣。
|
||||||
|
|
||||||
|
**金石刻画臣能为**
|
||||||
|

|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
**为学日益**
|
||||||
|
![[2025ZK7.jpg]]
|
||||||
595
markdown/C语言指针.md
Normal file
@@ -0,0 +1,595 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: C语言指针
|
||||||
|
subtitle:
|
||||||
|
description: 因流媒体转发问题, 需要c改写nginx, 超过10年没有使用C。C以前搬弄指针是最烦心。有人总结的这么好。很好的温习材料。
|
||||||
|
date: 2024-04-18 9:00:00
|
||||||
|
author: 大童
|
||||||
|
image: /img/cprogram.jpg
|
||||||
|
showtoc: true
|
||||||
|
type: _draft
|
||||||
|
tags:
|
||||||
|
- 笔记
|
||||||
|
URL:
|
||||||
|
categories:
|
||||||
|
- 杂烩
|
||||||
|
slug: "Cyuyanzhizhen"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 题记:因流媒体转发问题, 需要c改写nginx, 超过10年没有使用C。C以前搬弄指针是最烦心。有人总结的这么好。很好的温习材料。
|
||||||
|
|
||||||
|
> 搬运自, 做了一些格式优化:
|
||||||
|
https://zhuanlan.zhihu.com/p/520095710
|
||||||
|
|
||||||
|
# C语言指针
|
||||||
|
|
||||||
|
如果我们要掌握指针, 多多少少会出现一些比较复杂的类型, 所以我先介绍一下如何完全理解一个复杂类型, 要理解复杂类型其实很简单, 一个类型里会出现很多运算符, 他们也像普通的表达式一样, 有优先级, 其优先级和运算优先级一样, 所以我总结了一下其原则:从变量名处起, 根据运算符优先级结合, 接下来我们一步一步分析, 先从简单的类型开始慢慢分析到复杂的指针精髓。
|
||||||
|
|
||||||
|
```c
|
||||||
|
int p; //这是一个普通的整型变量
|
||||||
|
|
||||||
|
int *p; //首先从P 处开始, 先与*结合, 所以说明P 是一个指针, 然后再与int 结合, 说明指针所指向的内容的类型为int 型。所以P是一个返回整型数据的指针
|
||||||
|
|
||||||
|
int p[3]; //首先从P 处开始, 先与[]结合, 说明P 是一个数组, 然后与int 结合, 说明数组里的元素是整型的, 所以P 是一个由整型数据组成的数组
|
||||||
|
|
||||||
|
int *p[3]; //首先从P 处开始, 先与[]结合, 因为其优先级比*高, 所以P 是一个数组, 然后再与*结合, 说明数组里的元素是指针类型, 然后再与int 结合, 说明指针所指向的内容的类型是整型的, 所以P 是一个由返回整型数据的指针所组成的数组
|
||||||
|
|
||||||
|
int (*p)[3]; //首先从P 处开始, 先与*结合, 说明P 是一个指针然后再与[]结合(与"()"这步可以忽略, 只是为了改变优先级), 说明指针所指向的内容是一个数组, 然后再与int 结合, 说明数组里的元素是整型的。所以P 是一个指向由整型数据组成的数组的指针
|
||||||
|
|
||||||
|
int **p; //首先从P 开始, 先与*结合, 说是P 是一个指针, 然后再与*结合, 说明指针所指向的元素是指针, 然后再与int 结合, 说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中, 所以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针。
|
||||||
|
|
||||||
|
int p(int); //从P 处起, 先与()结合, 说明P 是一个函数, 然后进入()里分析, 说明该函数有一个整型变量的参数, 然后再与外面的int 结合, 说明函数的返回值是一个整型数据
|
||||||
|
|
||||||
|
Int (*p)(int); //从P 处开始, 先与指针结合, 说明P 是一个指针, 然后与()结合, 说明指针指向的是一个函数, 然后再与()里的int 结合, 说明函数有一个int 型的参数, 再与最外层的int 结合, 说明函数的返回类型是整型, 所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针
|
||||||
|
|
||||||
|
int *(*p(int))[3]; //可以先跳过, 不看这个类型, 过于复杂从P 开始, 先与()结合, 说明P 是一个函数, 然后进入()里面, 与int 结合, 说明函数有一个整型变量参数, 然后再与外面的*结合, 说明函数返回的是一个指针, 然后到最外面一层, 先与[]结合, 说明返回的指针指向的是一个数组, 然后再与*结合, 说明数组里的元素是指针, 然后再与int 结合, 说明指针指向的内容是整型数据。所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
说到这里也就差不多了, 我们的任务也就这么多, 理解了这几个类型, 其它的类型对我们来说也是小菜了, 不过我们一般不会用太复杂的类型, 那样会大大减小程序的可读性, 请慎用, 这上面的几种类型已经足够我们用了。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```c
|
||||||
|
int *p[3] //是一个指针数组,其中 p 是一个有3个元素的数组,每个元素都是指向 int 类型的指针。
|
||||||
|
int (*p)[3] //是一个指向数组的指针,其中p 是一个指针,它指向一个有3个 int 类型元素的数组。
|
||||||
|
int* (*p)[3] // 是一个指向数组的指针,其中p是一个指针,这个指针指向整个数组,数组中的每个元素都是一个指向 int 的指针。
|
||||||
|
```
|
||||||
|
|
||||||
|
指针数组 `int *p[3]`:
|
||||||
|
```c
|
||||||
|
int a = 10, b = 20, c = 30;
|
||||||
|
int *p[3] = {&a, &b, &c};
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
p: | p[0] | p[1] | p[2] |
|
||||||
|
+------+------+------+
|
||||||
|
| 0x01 | 0x02 | 0x03 | (假设的内存地址)
|
||||||
|
+------+------+------+
|
||||||
|
| | |
|
||||||
|
v v v
|
||||||
|
0x01 0x02 0x03
|
||||||
|
| | |
|
||||||
|
v v v
|
||||||
|
10 20 30
|
||||||
|
|
||||||
|
指针数组 int *p[3],p本质上是一个数组
|
||||||
|
```
|
||||||
|
|
||||||
|
指向数组的指针 int (*p)[3]:
|
||||||
|
```c
|
||||||
|
int arr[3] = {10, 20, 30};
|
||||||
|
int (*p)[3] = &arr;
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
arr: | 10 | 20 | 30 |
|
||||||
|
+------+------+------+
|
||||||
|
^
|
||||||
|
|
|
||||||
|
0x04 (假设的内存地址)
|
||||||
|
|
|
||||||
|
p
|
||||||
|
|
||||||
|
指向数组的指针 int (*p)[3],p本质上是一个指针
|
||||||
|
```
|
||||||
|
|
||||||
|
指向数组的指针 int* (*p)[3]:
|
||||||
|
这个指针指向整个数组,数组中的每个元素都是一个指向 int 的指针。
|
||||||
|
```c
|
||||||
|
int a = 10, b = 20, c = 30; // 定义三个整数变量
|
||||||
|
int* arr[3] = {&a, &b, &c}; // 定义一个包含三个整数指针的数组
|
||||||
|
int* (*p)[3] = &arr; // 定义一个指向上述数组的指针
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
p
|
||||||
|
|
|
||||||
|
v
|
||||||
|
+---+---+---+
|
||||||
|
| * | * | * |
|
||||||
|
+---+---+---+
|
||||||
|
| | |
|
||||||
|
v v v
|
||||||
|
int int int
|
||||||
|
|
||||||
|
指向包含三个整数指针的数组的指针 int* (*p)[3],p本质上是一个指针
|
||||||
|
```
|
||||||
|
|
||||||
|
## 一、详解指针
|
||||||
|
**指针是一个特殊的变量, 它里面存储的数值被解释成为内存里的一个地址**。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。
|
||||||
|
先声明几个指针放着做例子:
|
||||||
|
|
||||||
|
例一:
|
||||||
|
```c
|
||||||
|
(1)int*ptr;
|
||||||
|
(2)char*ptr;
|
||||||
|
(3)int**ptr;
|
||||||
|
(4)int(*ptr)[3];
|
||||||
|
(5)int*(*ptr)[4];
|
||||||
|
```
|
||||||
|
|
||||||
|
1、指针的类型
|
||||||
|
从语法的角度看, 你只要把指针声明语句里的指针名字去掉, 剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
|
||||||
|
```c
|
||||||
|
(1)int*ptr;//指针的类型是int*
|
||||||
|
(2)char*ptr;//指针的类型是char*
|
||||||
|
(3)int**ptr;//指针的类型是int**
|
||||||
|
(4)int(*ptr)[3];//指针的类型是int(*)[3]
|
||||||
|
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
|
||||||
|
```
|
||||||
|
怎么样?找出指针的类型的方法是不是很简单?
|
||||||
|
|
||||||
|
2、指针所指向的类型
|
||||||
|
当你通过指针来访问指针所指向的内存区时, 指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
|
||||||
|
从语法上看, 你只须把指针声明语句中的指针名字和名字左边的指针声明符`*`去掉, 剩下的就是指针所指向的类型。例如:
|
||||||
|
```c
|
||||||
|
(1)int*ptr; //指针所指向的类型是int
|
||||||
|
(2)char*ptr; //指针所指向的的类型是char
|
||||||
|
(3)int**ptr; //指针所指向的的类型是int*
|
||||||
|
(4)int(*ptr)[3]; //指针所指向的的类型是int()[3]。是指针,指向数组,数组包含3个int
|
||||||
|
(5)int*(*ptr)[4]; //指针所指向的的类型是int*()[4]。是指针,指向数组,数组包含4个int*
|
||||||
|
(6)int*ptr[3]; //是数组,数组包含3个int*
|
||||||
|
```
|
||||||
|
|
||||||
|
在指针的算术运算中, 指针所指向的类型有很大的作用。
|
||||||
|
|
||||||
|
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C 越来越熟悉时, 你会发现, 把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念, 是精通指针的关键点之一。我看了不少书, 发现有些写得差的书中, 就把指针的这两个概念搅在一起了, 所以看起书来前后矛盾, 越看越糊涂。
|
||||||
|
|
||||||
|
3、指针的值----或者叫指针所指向的内存区或地址
|
||||||
|
指针的值是指针本身存储的数值, 这个值将被编译器当作一个地址, 而不是一个一般的数值。在32 位程序里, 所有类型的指针的值都是一个32 位整数, 因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始, 长度为si zeof(指针所指向的类型)的一片内存区。以后, 我们说一个指针的值是XX, 就相当于说该指针指向了以XX 为首地址的一片内存区域; 我们说一个指针指向了某块内存区域, 就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中, 指针所指向的类型已经有了, 但由于指针还未初始化, 所以它所指向的内存区是不存在的, 或者说是无意义的。
|
||||||
|
|
||||||
|
4、指针本身所占据的内存区
|
||||||
|
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32 位平台里, 指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。
|
||||||
|
|
||||||
|
**以后, 每遇到一个指针, 都应该问问**:
|
||||||
|
- 这个**指针的类型**是什么?
|
||||||
|
> 指针声明语句里的指针名字去掉, 剩下的部分就是这个指针的类型。
|
||||||
|
- **指针指的类型**是什么?
|
||||||
|
> 只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉, 剩下的就是指针所指向的类型。
|
||||||
|
- 该**指针指向了哪里**?(重点注意)
|
||||||
|
指针的值是指针本身存储的数值, 这个值将被编译器当作一个地址, 而不是一个一般的数值。
|
||||||
|
|
||||||
|
## 二、指针的算术运算
|
||||||
|
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的, 以单元为单位。例如:
|
||||||
|
|
||||||
|
例二:
|
||||||
|
```c
|
||||||
|
char a[20];
|
||||||
|
int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
|
||||||
|
ptr++;
|
||||||
|
```
|
||||||
|
|
||||||
|
在上例中, 指针ptr 的类型是int*, 它指向的类型是int, 它被初始化为指向整型变量a。接下来的第3句中, 指针ptr被加了1, 编译器是这样处理的:它把指针ptr 的值加上了sizeof(int), 在32 位程序中, 是被加上了4, 因为在32 位程序中, int 占4 个字节。由于地址是用字节做单位的, 故ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。由于char 类型的长度是一个字节, 所以, 原来ptr 是指向数组a 的第0 号单元开始的四个字节, 此时指向了数组a 中从第4 号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组, 看例子:
|
||||||
|
|
||||||
|
例三:
|
||||||
|
```c
|
||||||
|
int array[20]={0};
|
||||||
|
int *ptr=array;
|
||||||
|
for(i=0;i<20;i++)
|
||||||
|
{
|
||||||
|
(*ptr)++;
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1 个单元, 所以每次循环都能访问数组的下一个单元。
|
||||||
|
|
||||||
|
再看例子:
|
||||||
|
例四:
|
||||||
|
```c
|
||||||
|
char a[20]="You_are_a_girl";
|
||||||
|
int *ptr=(int *)a;
|
||||||
|
ptr+=5;
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个例子中, ptr 被加上了5, 编译器是这样处理的:将指针ptr 的值加上5 乘sizeof(int), 在32 位程序中就是加上了5 乘4=20。由于地址的单位是字节, 故现在的ptr 所指向的地址比起加5 后的ptr 所指向的地址来说, 向高地址方向移动了20 个字节。
|
||||||
|
在这个例子中, 没加5 前的ptr 指向数组a 的第0 号单元开始的四个字节, 加5 后, ptr 已经指向了数组a 的合法范围之外了。虽然这种情况在应用上会出问题, 但在语法上却是可以的。这也体现出了指针的灵活性。如果上例中, ptr 是被减去5, 那么处理过程大同小异, 只不过ptr 的值是被减去5 乘sizeof(int), 新的ptr 指向的地址将比原来的ptr 所指向的地址向低地址方向移动了20 个字节。
|
||||||
|
下面请允许我再举一个例子:(一个误区)
|
||||||
|
|
||||||
|
例五:
|
||||||
|
```c
|
||||||
|
#include<stdio.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char a[20]=" You_are_a_girl";
|
||||||
|
char *p=a;
|
||||||
|
char **ptr=&p;
|
||||||
|
//printf("p=%d\n", p);
|
||||||
|
//printf("ptr=%d\n", ptr);
|
||||||
|
//printf("*ptr=%d\n", *ptr);
|
||||||
|
printf("**ptr=%c\n", **ptr);
|
||||||
|
ptr++;
|
||||||
|
//printf("ptr=%d\n", ptr);
|
||||||
|
//printf("*ptr=%d\n", *ptr);
|
||||||
|
printf("**ptr=%c\n", **ptr);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
误区一、输出答案为Y 和o
|
||||||
|
误解:ptr 是一个char 的二级指针, 当执行ptr++;时, 会使指针加一个sizeof(char), 所以输出如上结果, 这个可能只是少部分人的结果。
|
||||||
|
误区二、输出答案为Y 和a误解:ptr 指向的是一个char * 类型, 当执行ptr++;时, 会使指针加一个sizeof(char * )(有可能会有人认为这个值为1, 那就会得到误区一的答案, 这个值应该是4, 参考前面内容), 即&p+4; 那进行一次取值运算不就指向数组中的第五个元素了吗?那输出的结果不就是数组中第五个元素了吗?答案是否定的。
|
||||||
|
|
||||||
|
```
|
||||||
|
正解: ptr 的类型是char **, 指向的类型是一个char *类型, 该指向的地址就是p的地址(&p), 当执行ptr++时, 会使指针加一个sizeof(char*), 即&p+4;那*(&p+4)指向哪呢, 这个你去问上帝吧, 或者他会告诉你在哪?所以最后的输出会是一个随机的值, 或许是一个非法操作。
|
||||||
|
```
|
||||||
|
|
||||||
|
总结一下:
|
||||||
|
一个指针ptrold 加(减)一个整数n 后, 结果是一个新的指针ptrnew, ptrnew 的类型和ptrold 的类型相同, ptrnew 所指向的类型和ptrold所指向的类型也相同。ptrnew 的值将比ptrold 的值增加(减少)了n 乘sizeof(ptrold 所指向的类型)个字节。就是说, ptrnew 所指向的内存区将比ptrold 所指向的内存区向高(低)地址方向移动了n 乘sizeof(ptrold 所指向的类型)个字节。指针和指针进行加减:两个指针不能进行加法运算, 这是非法操作, 因为进行加法后, 得到的结果指向一个不知所向的地方, 而且毫无意义。两个指针可以进行减法操作, 但必须类型相同, 一般用在数组方面, 不多说了。
|
||||||
|
|
||||||
|
## 三、运算符&和*
|
||||||
|
`这里&是取地址运算符, *是间接运算符`。
|
||||||
|
|
||||||
|
**&a 的运算结果是一个指针, 指针的类型是a 的类型加个*, 指针所指向的类型是a 的类型, 指针所指向的地址嘛, 那就是a 的地址**。
|
||||||
|
*p 的运算结果就五花八门了。总之*p 的结果是p 所指向的东西, 这个东西有这些特点:它的类型是p 指向的类型, 它所占用的地址是p所指向的地址。
|
||||||
|
|
||||||
|
例六:
|
||||||
|
```c
|
||||||
|
int a=12;
|
||||||
|
int b;
|
||||||
|
int *p;
|
||||||
|
int **ptr;
|
||||||
|
|
||||||
|
p=&a; //&a 的结果是一个指针, 类型是int*, 指向的类型是int, 指向的地址是a 的地址。
|
||||||
|
*p=24; //*p 的结果, 在这里它的类型是int, 它所占用的地址是p 所指向的地址, 显然, *p 就是变量a。
|
||||||
|
ptr=&p; //&p 的结果是个指针, 该指针的类型是p 的类型加个*, 在这里是int **。该指针所指向的类型是p 的类型, 这里是int*。该指针所指向的地址就是指针p 自己的地址。
|
||||||
|
*ptr=&b; //*ptr 是个指针, &b 的结果也是个指针, 且这两个指针的类型和所指向的类型是一样的, 所以用&b 来给*ptr 赋值就是毫无问题的了。
|
||||||
|
**ptr=34; //*ptr 的结果是ptr 所指向的东西, 在这里是一个指针, 对这个指针再做一次*运算, 结果是一个int 类型的变量。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 四、指针表达式
|
||||||
|
一个表达式的结果如果是一个指针, 那么这个表达式就叫指针表式。
|
||||||
|
下面是一些指针表达式的例子:
|
||||||
|
|
||||||
|
例七:
|
||||||
|
```c
|
||||||
|
int a, b;
|
||||||
|
int array[10];
|
||||||
|
int *pa;
|
||||||
|
pa=&a; //&a 是一个指针表达式。
|
||||||
|
Int **ptr=&pa; //&pa 也是一个指针表达式。
|
||||||
|
*ptr=&b; //*ptr 和&b 都是指针表达式。
|
||||||
|
pa=array;
|
||||||
|
pa++; //这也是指针表达式。
|
||||||
|
```
|
||||||
|
|
||||||
|
例八:
|
||||||
|
```c
|
||||||
|
char *arr[20];
|
||||||
|
char **parr=arr; //如果把arr 看作指针的话, arr 也是指针表达式
|
||||||
|
char *str;
|
||||||
|
str=*parr; //*parr 是指针表达式
|
||||||
|
str=*(parr+1); //*(parr+1)是指针表达式
|
||||||
|
str=*(parr+2); //*(parr+2)是指针表达式
|
||||||
|
```
|
||||||
|
|
||||||
|
**由于指针表达式的结果是一个指针, 所以指针表达式也具有指针所具有的四个要素:指针的类型, 指针所指向的类型, 指针指向的内存区, 指针自身占据的内存**。
|
||||||
|
|
||||||
|
好了, 当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话, 这个指针表达式就是一个左值, 否则就不是一个左值。在例七中, &a 不是一个左值, 因为它还没有占据明确的内存。`*ptr` 是一个左值, 因为`*ptr` 这个指针已经占据了内存, 其实`*ptr` 就是指针pa, 既然pa 已经在内存中有了自己的位置, 那么`*ptr` 当然也有了自己的位置。
|
||||||
|
❓
|
||||||
|
|
||||||
|
## 五、数组和指针关系
|
||||||
|
数组的数组名其实可以看作一个指针。看下例:
|
||||||
|
|
||||||
|
例九:
|
||||||
|
```c
|
||||||
|
int array[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, value;
|
||||||
|
value=array[0]; //也可写成:value=*array;
|
||||||
|
value=array[3]; //也可写成:value=*(array+3);
|
||||||
|
value=array[4]; //也可写成:value=*(array+4);
|
||||||
|
```
|
||||||
|
|
||||||
|
上例中, 一般而言数组名array 代表数组本身, 类型是int[10], 但**如果把array 看做指针的话, 它指向数组的第0 个单元, 类型是int* 所指向的类型是数组单元的类型即int**。因此\*array 等于0 就一点也不奇怪了。同理, array+3 是一个指向数组第3 个单元的指针, 所以*(array+3)等于3。其它依此类推。
|
||||||
|
|
||||||
|
例十:
|
||||||
|
```c
|
||||||
|
char *str[3]={ "Hello, thisisasample!", "Hi, goodmorning。", "Helloworld" };
|
||||||
|
|
||||||
|
char s[80];
|
||||||
|
strcpy(s, str[0]); //也可写成strcpy(s, *str);
|
||||||
|
strcpy(s, str[1]); //也可写成strcpy(s, *(str+1));
|
||||||
|
strcpy(s, str[2]); //也可写成strcpy(s, *(str+2));
|
||||||
|
```
|
||||||
|
|
||||||
|
上例中, str 是一个三单元的数组, 该数组的每个单元都是一个指针, 这些指针各指向一个字符串。把指针数组名str 当作一个指针的话, 它指向数组的第0 号单元, 它的类型是char ** , 它指向的类型是char *。
|
||||||
|
|
||||||
|
`*str` 也是一个指针, 它的类型是char * , 它所指向的类型是char, 它指向的地址是字符串"Hello, thisisasample!"的第一个字符的地址, 即'H'的地址。注意:字符串相当于是一个数组, 在内存中以数组的形式储存, 只不过字符串是一个数组常量, 内容不可改变, 且只能是右值。如果看成指针的话, 他即是常量指针, 也是指针常量。
|
||||||
|
str+1 也是一个指针, 它指向数组的第1 号单元, 它的类型是char**, 它指向的类型是char*。
|
||||||
|
`*(str+1)`也是一个指针, 它的类型是char*, 它所指向的类型是char, 它指向"Hi, goodmorning。"的第一个字符'H'。
|
||||||
|
|
||||||
|
下面总结一下数组的数组名(数组中储存的也是数组)的问题:
|
||||||
|
声明了一个数组TYPE array[n], 则数组名称array 就有了两重含义:
|
||||||
|
- 第一, 它代表整个数组, 它的类型是TYPE[n];
|
||||||
|
- 第二, 它是一个常量指针, 该指针的类型是TYPE* , 该指针指向的类型是TYPE, 也就是数组单元的类型, 该指针指向的内存区就是数组第0 号单元, 该指针自己占有单独的内存区, 注意它和数组第0 号单元占据的内存区是不同的。该指针的值是不能修改的, 即类似array++的表达式是错误的。在不同的表达式中数组名array 可以扮演不同的角色。在表达式sizeof(array)中, 数组名array 代表数组本身, 故这时sizeof 函数测出的是整个数组的大小。
|
||||||
|
|
||||||
|
在表达式* array 中, array 扮演的是指针, 因此这个表达式的结果就是数组第0 号单元的值。sizeof(* array)测出的是数组单元的大小。
|
||||||
|
表达式array+n(其中n=0, 1, 2, 。。。。。)中, array 扮演的是指针, 故array+n 的结果是一个指针, 它的类型是TYPE * , 它指向的类型是TYPE, 它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。在32 位程序中结果是4
|
||||||
|
|
||||||
|
例十一:
|
||||||
|
```c
|
||||||
|
int array[10];
|
||||||
|
int (*ptr)[10];
|
||||||
|
ptr=&array;
|
||||||
|
```
|
||||||
|
|
||||||
|
上例中ptr 是一个指针, 它的类型是int(* )[10], 他指向的类型是int[10] , 我们用整个数组的首地址来初始化它。在语句ptr=&array中, array 代表数组本身。
|
||||||
|
|
||||||
|
本节中提到了函数sizeof(), 那么我来问一问, sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?
|
||||||
|
答案是前者。例如:
|
||||||
|
```c
|
||||||
|
int(*ptr)[10];
|
||||||
|
```
|
||||||
|
则在32 位程序中, 有:
|
||||||
|
```c
|
||||||
|
sizeof(int(*)[10])==4 // 是指针
|
||||||
|
sizeof(int[10])==40 // 是数组
|
||||||
|
sizeof(ptr)==4 // 是指针
|
||||||
|
```
|
||||||
|
|
||||||
|
实际上, **sizeof(对象)测出的都是对象自身的类型的大小**, 而不是别的什么类型的大小。
|
||||||
|
|
||||||
|
## 六、指针和结构类型的关系
|
||||||
|
可以声明一个指向结构类型对象的指针。
|
||||||
|
|
||||||
|
例十二:
|
||||||
|
```c
|
||||||
|
struct MyStruct
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
};
|
||||||
|
struct MyStruct ss={20, 30, 40}; //声明了结构对象ss, 并把ss 的成员初始化为20, 30 和40。
|
||||||
|
struct MyStruct *ptr=&ss; //声明了一个指向结构对象ss 的指针。它的类型是MyStruct *, 它指向的类型是MyStruct。
|
||||||
|
int *pstr=(int*)&ss; //声明了一个指向结构对象ss 的指针。但是pstr 和它被指向的类型ptr 是不同的。
|
||||||
|
```
|
||||||
|
|
||||||
|
请问怎样通过指针ptr 来访问ss 的三个成员变量?
|
||||||
|
答案:
|
||||||
|
```c
|
||||||
|
ptr->a; //指向运算符, 或者可以这们(*ptr)。a, 建议使用前者
|
||||||
|
ptr->b;
|
||||||
|
ptr->c;
|
||||||
|
```
|
||||||
|
|
||||||
|
又请问怎样通过指针pstr 来访问ss 的三个成员变量?❓
|
||||||
|
答案:
|
||||||
|
```c
|
||||||
|
*pstr; //访问了ss 的成员a。
|
||||||
|
*(pstr+1); //访问了ss 的成员b。
|
||||||
|
*(pstr+2) //访问了ss 的成员c。
|
||||||
|
```
|
||||||
|
|
||||||
|
虽然我在我的MSVC++6。0 上调式过上述代码, 但是要知道, 这样使用pstr 来访问结构成员是不正规的, 为了说明为什么不正规, 让我们看看怎样通过指针来访问数组的各个单元: (将结构体换成数组)
|
||||||
|
|
||||||
|
例十三:
|
||||||
|
```c
|
||||||
|
int array[3]={35, 56, 37};
|
||||||
|
int *pa=array; //通过指针pa 访问数组array 的三个单元的方法是:
|
||||||
|
|
||||||
|
*pa; //访问了第0 号单元
|
||||||
|
*(pa+1); //访问了第1 号单元
|
||||||
|
*(pa+2); //访问了第2 号单元
|
||||||
|
```
|
||||||
|
|
||||||
|
从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。
|
||||||
|
|
||||||
|
所有的C/C++编译器在排列数组的单元时, 总是把各个数组单元存放在连续的存储区里, 单元和单元之间没有空隙。但在存放结构对象的各个成员时, 在某种编译环境下, 可能会需要字对齐或双字对齐或者是别的什么对齐, 需要在相邻两个成员之间加若干个"填充字节", 这就导致各个成员之间可能会有若干个字节的空隙。
|
||||||
|
|
||||||
|
所以, 在例十二中, 即使\*pstr 访问到了结构对象ss 的第一个成员变量a, 也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a 和成员b 之间可能会有若干填充字节, 说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节, 嘿, 这倒是个不错的方法。
|
||||||
|
|
||||||
|
不过指针访问结构成员的正确方法应该是象例十二中使用指针ptr 的方法。
|
||||||
|
|
||||||
|
## 七、指针和函数的关系
|
||||||
|
可以把一个指针声明成为一个指向函数的指针。
|
||||||
|
```c
|
||||||
|
int fun1(char *, int);
|
||||||
|
int (*pfun1)(char *, int);
|
||||||
|
pfun1=fun1;
|
||||||
|
int a=(*pfun1)("abcdefg", 7); //通过函数指针调用函数。
|
||||||
|
```
|
||||||
|
可以把指针作为函数的形参。在函数调用语句中, 可以用指针表达式来作为实参。
|
||||||
|
|
||||||
|
例十四:
|
||||||
|
```c
|
||||||
|
int fun(char *);
|
||||||
|
int a;
|
||||||
|
char str[]="abcdefghijklmn";
|
||||||
|
a=fun(str);
|
||||||
|
int fun(char *s)
|
||||||
|
{
|
||||||
|
int num=0;
|
||||||
|
for(int i=0;;)
|
||||||
|
{
|
||||||
|
num+=*s;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
这个例子中的函数fun 统计一个字符串中各个字符的ASCII 码值之和。前面说了, 数组的名字也是一个指针。在函数调用中, 当把str作为实参传递给形参s 后, 实际是把str 的值传递给了s, s 所指向的地址就和str 所指向的地址一致, 但是str 和s 各自占用各自的存储空间。在函数体内对s 进行自加1 运算, 并不意味着同时对str 进行了自加1 运算。
|
||||||
|
|
||||||
|
## 八、指针类型转换
|
||||||
|
当我们初始化一个指针或给一个指针赋值时, 赋值号的左边是一个指针, 赋值号的右边是一个指针表达式。在我们前面所举的例子中, 绝大多数情况下, 指针的类型和指针表达式的类型是一样的, 指针所指向的类型和指针表达式所指向的类型是一样的。
|
||||||
|
|
||||||
|
例十五:
|
||||||
|
```c
|
||||||
|
float f=12.3;
|
||||||
|
float *fptr=&f;
|
||||||
|
int *p;
|
||||||
|
```
|
||||||
|
|
||||||
|
在上面的例子中, 假如我们想让指针p 指向实数f, 应该怎么办?
|
||||||
|
是用下面的语句吗?
|
||||||
|
```c
|
||||||
|
p=&f;
|
||||||
|
```
|
||||||
|
|
||||||
|
不对。因为指针p 的类型是int * , 它指向的类型是int。表达式&f 的结果是一个指针, 指针的类型是float * , 它指向的类型是float。
|
||||||
|
两者不一致, 直接赋值的方法是不行的。至少在我的MSVC++6。0 上, 对指针的赋值语句要求赋值号两边的类型一致, 所指向的类型也一致, 其它的编译器上我没试过, 大家可以试试。为了实现我们的目的, 需要进行"强制类型转换":
|
||||||
|
|
||||||
|
```c
|
||||||
|
p=(int*)&f;
|
||||||
|
```
|
||||||
|
|
||||||
|
如果有一个指针p, 我们需要把它的类型和所指向的类型改为TYEP * TYPE, 那么语法格式是: (TYPE * )p;
|
||||||
|
|
||||||
|
这样强制类型转换的结果是一个新指针, 该新指针的类型是TYPE * , 它指向的类型是TYPE, 它指向的地址就是原指针指向的地址。
|
||||||
|
|
||||||
|
**而原来的指针p 的一切属性都没有被修改**。(切记)
|
||||||
|
|
||||||
|
一个函数如果使用了指针作为形参, 那么在函数调用语句的实参和形参的结合过程中, 必须保证类型一致, 否则需要强制转换
|
||||||
|
|
||||||
|
例十六:
|
||||||
|
```c
|
||||||
|
void fun(char*);
|
||||||
|
int a=125, b;
|
||||||
|
fun((char*)&a);
|
||||||
|
void fun(char*s)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
c=*(s+3); *(s+3)=*(s+0); *(s+0)=c;
|
||||||
|
c=*(s+2); *(s+2)=*(s+1); *(s+1)=c;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
注意这是一个32 位程序, 故int 类型占了四个字节, char 类型占一个字节。函数fun 的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中, 实参&a 的结果是一个指针, 它的类型是int * , 它指向的类型是int。形参这个指针的类型是char * , 它指向的类型是char。这样, 在实参和形参的结合过程中, 我们必须进行一次从int * 类型到char * 类型的转换。
|
||||||
|
|
||||||
|
结合这个例子, 我们可以这样来
|
||||||
|
想象编译器进行转换的过程:编译器先构造一个临时指针char * temp, 然后执行temp=(char * )&a, 最后再把temp 的值传递给s。所以最后的结果是:s 的类型是char * , 它指向的类型是char, 它指向的地址就是a 的首地址。
|
||||||
|
|
||||||
|
我们已经知道, **指针的值就是指针指向的地址**, 在32 位程序中, 指针的值其实是一个32 位整数。
|
||||||
|
那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
|
||||||
|
```c
|
||||||
|
unsigned int a; // 声明一个无符号整数变量
|
||||||
|
TYPE *ptr; //TYPE 是int, char 或结构类型等等类型。
|
||||||
|
a=20345686;
|
||||||
|
ptr=20345686; //我们的目的是要使指针ptr 指向地址20345686
|
||||||
|
ptr=a; //我们的目的是要使指针ptr指向地址20345686编译一下吧。结果发现后面两条语句全是错的。
|
||||||
|
```
|
||||||
|
|
||||||
|
那么我们的目的就不能达到了吗? 不, 还有办法:
|
||||||
|
```c
|
||||||
|
unsigned int a;
|
||||||
|
TYPE *ptr; //TYPE 是int, char 或结构类型等等类型。
|
||||||
|
a=N //N 必须代表一个合法的地址;
|
||||||
|
ptr=(TYPE*)a; //呵呵, 这就可以了。
|
||||||
|
```
|
||||||
|
|
||||||
|
**严格说来这里的(TYPE * )和指针类型转换中的(TYPE * )还不一样。这里的(TYPE*)的意思是把无符号整数a 的值当作一个地址来看待**。上面强调了a 的值必须代表一个合法的地址, 否则的话, 在你使用ptr 的时候, 就会出现非法操作错误。
|
||||||
|
|
||||||
|
想想能不能反过来, 把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来, 然后再把这个整数当作一个地址赋给一个指针:
|
||||||
|
|
||||||
|
例十七:
|
||||||
|
```c
|
||||||
|
int a=123, b;
|
||||||
|
int *ptr=&a;
|
||||||
|
char *str;
|
||||||
|
b=(int)ptr; //把指针ptr 的值当作一个整数取出来。
|
||||||
|
str=(char*)b; //把这个整数的值当作一个地址赋给指针str。
|
||||||
|
```
|
||||||
|
现在我们已经知道了, 可以把指针的值当作一个整数取出来, 也可以把一个整数值当作地址赋给一个指针。
|
||||||
|
|
||||||
|
## 九、指针的安全问题
|
||||||
|
看下面的例子:
|
||||||
|
|
||||||
|
例十八:
|
||||||
|
```c
|
||||||
|
char s='a';
|
||||||
|
int *ptr;
|
||||||
|
ptr=(int *)&s;
|
||||||
|
*ptr=1298; // ❌
|
||||||
|
```
|
||||||
|
|
||||||
|
指针ptr 是一个int * 类型的指针, 它指向的类型是int。它指向的地址就是s 的首地址。在32 位程序中, s 占一个字节, int 类型占四个字节。**最后一条语句不但改变了s 所占的一个字节, 还把和s 相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道, 而写程序的人是不太可能知道的**。也许这三个字节里存储了非常重要的数据, 也许这三个字节里正好是程序的一条代码, 而由于你对指针的马虎应用, 这三个字节的值被改变了!这会造成崩溃性的错误。
|
||||||
|
|
||||||
|
让我们再来看一例:
|
||||||
|
|
||||||
|
例十九:
|
||||||
|
```c
|
||||||
|
char a;
|
||||||
|
int *ptr=&a;
|
||||||
|
ptr++; // ❌ 指向未知内存空间
|
||||||
|
*ptr=115; // 改变未知内存空间的内容 ❌
|
||||||
|
```
|
||||||
|
该例子完全可以通过编译, 并能执行。但是看到没有?**第3 句对指针ptr 进行自加1 运算后, ptr 指向了和整形变量a 相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据, 甚至可能是一条代码**。
|
||||||
|
|
||||||
|
而第4 句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时, 程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候, 也要注意不要超出数组的低端和高端界限, 否则也会造成类似的错误。
|
||||||
|
|
||||||
|
**在指针的强制类型转换:ptr1=(TYPE * )ptr2 中, 如果sizeof(ptr2的类型)大于sizeof(ptr1 的类型), 那么在使用指针ptr1 来访问ptr2所指向的存储区时是安全的**。如果sizeof(ptr2 的类型) 小于sizeof(ptr1 的类型), 那么在使用指针ptr1 来访问ptr2 所指向的存储区时是不安全的。至于为什么, 读者结合例十八来想一想, 应该会明白的。
|
||||||
|
|
||||||
|
---
|
||||||
|
## 一些图示
|
||||||
|
|
||||||
|
![[C语言指针-8.png]]
|
||||||
|
|
||||||
|
第一种写法:p先和[]结合, 所以是一个数组, 后与* 结合, 是指针数组。
|
||||||
|
第二种写法:()的优先级比[]高, * 号和p2构成一个指针的定义, 指针变量名为p, int 修饰的是数组的内容, 即数组的每个元素。数组在这里并没有名字, 是个匿名数组, 那现在我们清楚p 是一个指针, 它指向一个包含10 个int 类型数据的数组, 即数组指针
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[C语言指针-3.png]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[C语言指针-4.png]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[C语言指针-5.png]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[C语言指针-6.png]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[C语言指针-7.png]]
|
||||||
|
|
||||||
|
|
||||||
|
## 符号优先级
|
||||||
|
|
||||||
|
```
|
||||||
|
括号运算符。包括()、[]、->、.,它们的优先级最高,用于改变表达式的计算顺序。
|
||||||
|
|
||||||
|
一元运算符。包括!、~、++、--、-、*、&、sizeof等,它们的优先级次之,且具有从右到左的结合性。
|
||||||
|
|
||||||
|
乘法类运算符。包括*、/、%、+,它们的优先级再次之,先进行乘法、除法和取模运算,然后进行加法和减法运算。
|
||||||
|
|
||||||
|
移位运算符。包括<<、>>,其优先级低于乘法类运算符。
|
||||||
|
|
||||||
|
关系运算符。包括>、<、>=、<=、!=、== ,其优先级低于移位运算符。
|
||||||
|
|
||||||
|
位运算符。包括&、^、|,其优先级低于关系运算符。
|
||||||
|
|
||||||
|
逻辑运算符。包括&&、||,其优先级低于位运算符。
|
||||||
|
|
||||||
|
赋值运算符。包括=、+=、-=、'*=、/=等,其优先级低于逻辑运算符。
|
||||||
|
|
||||||
|
逗号运算符。其优先级最低,用于连接多个表达式,形成一个逗号表达式。
|
||||||
|
|
||||||
|
大多数运算符都是从左到右结合,但单目运算符、三目运算符和赋值运算符是从右到左结合。
|
||||||
|
```
|
||||||
|
|
||||||
|
![[static/img/C语言指针-1.png]]
|
||||||
25
markdown/header
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title:
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2025-06-24 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image:
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
-
|
||||||
|
URL:
|
||||||
|
#draft: true
|
||||||
|
#weight: 5
|
||||||
|
#hidden: true # 不在列表中显示,但可通过直接 URL 访问
|
||||||
|
categories:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 历史
|
||||||
|
- 小艺
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
- 杂烩
|
||||||
|
slug:
|
||||||
|
---
|
||||||
50
markdown/language.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 程序猿往事
|
||||||
|
subtitle: ""
|
||||||
|
description: ""
|
||||||
|
date: 2015-01-19 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
draft: true
|
||||||
|
tags:
|
||||||
|
- 代码
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考 ]
|
||||||
|
slug: "language"
|
||||||
|
---
|
||||||
|
97年上大学,学的Fortran77,一门面向过程语言。Fortran算较早的高级编程语言,提供了丰富的内嵌函数库,工程和数值计算领域曾经广泛应用。后来出来fortran90/95,据说支持派生数据类型,也就是结构体,为设计数据结构适用大型软件提供了方便。
|
||||||
|
|
||||||
|
大学毕业后,就没有再使用。Fortran现在来看比较落后,但在当时,作为编程启蒙还是相当不错的。
|
||||||
|
|
||||||
|
2003年开始用C++/C编程,逐步学习C++/C语言,做桌面应用,可视化用用QT,跨平台。 C++在当时确实打开了一扇窗户,OOP观念实在先进。写程序除了抽象思维,还和现实世界有了更多链接,OOP概念就是现实世界的语言描述。如果说原来面向过程编程是记流水账,想到哪里写到哪里,那么OOP就是写小说,更多考虑架构及内生关系;面向过程特点是线性的,零散的,重复的;OOP强调抽象组合、有机的、复用的,解耦的。C则便于写出快速精炼的函数,C语言专家往往强调C语言是完全不同于C++语言,有其他语言不可替代性,诚然不虚,但对一般使用者,除非要写面向底层高并发高性能特殊应用或组件,应用层面C++已经完全可以取代C语言,况且硬件资源限制越来越不是问题了,高效才是关键,另外C语言的内存管理需要程序猿考虑,对于新手来说实在是一趟艰难的冒险之旅。
|
||||||
|
|
||||||
|
说说QT,是一家叫奇趣科技的芬兰公司几个程序员开发,后来被诺基亚收购。完全开源,源代码写的非常规范易读,绝不故弄玄虚,大量的注释(当然是英文),是学习C++上上好的源码。QT并不是一个玩具,最早在Fedora上标配的桌面KDE全部用QT写,如此大型的桌面项目,全面检验了QT的成产力和成熟度。QT的文档化做的非常好,Tutorial和Practice做的很好,我至今印象深刻的是Tutoral中Step By Step例程是实现一架动态的加农炮;QT的注释也相当完备,无论入门还是高阶用户都能从中得到有效指南,C++本身有较好的封装和解耦特性,QT在此基础上采用Slot/Signal的机制,该机制进一步把实现者和使用者进行解耦。
|
||||||
|
|
||||||
|
在Linux下写代码,有些类似瑞士军刀式工具,可以大大提高效率,比如用的较多awk和perl,awk脚本特点是灵活小巧,能够高效支撑文本处理,也支持正则;perl相比awk,提供了各类高级特性,尤其突出的是强大数据结构和天生文本匹配能力。perl可以写出简单oneliner代码,也支持写出复杂软件,perl信奉条条大路通罗马的哲学,用不同的方法实现同一需求。perl作者larry wall是自然语言家,所以perl很多表达类似写作,这点是perl的优势,可以写出灵活多变的程序,很多程序体现作者乍现的灵感。但这也是问题,perl代码常常会显得晦涩难懂,这在当前开源盛行注重产出和生产力作坊式或生产线模式下,是尤其不友好。开源和流水线对让代码可理解易阅读性要求较高,沟通成本要低,造轮子要少,晦涩难懂的好代码往往成为一堆无人问津的数字垃圾。我相信Python作者一定领悟到perl的前车之鉴,python坚持简单,清晰,与perl理念相反,python提倡只用一种方法来完成一件事。这实在是设计哲学范畴,孰优孰略很难界定,perl见证了兴衰,python终于后来居上,从另一个角度印证了传播性在语言设计中重要性。
|
||||||
|
|
||||||
|
突然想起当年学python的一桩小事,2007年某天我决定用python写点东西,于是我翻了下python手册,大概了解了数据类型、控制结构、文件处理。从哪里着手呢,从熟悉的工作吧,当时我正在实现一个用仿真通信系统用户模型,语音通信模型里用户到达符合泊松分布,用户使用时间符合指数分布,在数据通信里涉及类型更多,我们用马可夫链来计算概率,[用蒙特卡洛算法模拟大量用户请求事件来输出系统指标 ](https://github.com/douboer/wisim)。算法是同事刘伟写的,北大高材生,这哥们大抵是个数学家,大约2012年移民韩国搞5G去了。我当时已经完成C++实现, 并达到预期效果。 这个软件的大部分底层C代码是Michael Mandell写的,我们叫他老孟博士,美国人,UT首席科学家,原来波音公司的首席科学家,的确NB闪闪,难以企及。回到python,于是就拿这个还热乎又有一定复杂度的应用来练手,大约花了一周业余时间写好算法代码,问题是这个python的应用运行的概率结果就是不对,这个问题又大约花了2天业余时间加部分工作时间,还是没有解决,绝望之下放弃了python。
|
||||||
|
|
||||||
|
之后在大约2008年左右开始用JAVA写WEB应用,原因是当时MVC架构的Struts给web编写提供了相当便捷性,代码结构清晰,与数据库oracle交互的采用基于JDBC封装的Hibernate持久层中间件,屏蔽了原生SQL,而是用一系列Bean来交互存储数据,用起来也是相当顺手。此外,apache有个叫mina的NIO框架免去自己写异步通信的烦恼,这个mina的作者也是后来netty的作者,厉害。C++转JAVA基本上没什么门槛,跨平台也更加方便,工具集更加友好,开发环境搭建更容易,开源资源更加丰富,入门容易。丰富资源和活跃社区意味着程序很多时候只需要复制黏贴修改,用JAVA作为开发语言的软件公司越来越多,JAVA长期徘徊在语言排行榜第一位置,JAVA程序员供不应求,工作容易找,薪水水平高,又助推小孩们学JAVA,这种现象似乎现在也出现在Python上。可这么容易写一个东西,类似堆几块积木,想必缺乏内在生命力?
|
||||||
|
|
||||||
|
大部分软件大咖,是以写代码为乐,写代码对他们来只是另一种游戏而已--一种思维游戏,他们甚至在写代码过程进入心流状态,Linus Torvalds传记说他linux时状态,就是:编程――睡觉――编程――睡觉――编程――吃饭――编程――睡觉――编程――洗澡――编程……,一切编程之外就是简化到维持生命必须,我想他必定是体验到规则之下自由创造的乐趣。我不知道其他大部分程序猿写代码的状态,但对我来说,大多数时间,并没有体验到自由创造的乐趣,编程对于我更多的是苦役,这不是说我不能集中精力沉浸其中,而是,常常沉溺细节,而无法构建一个恢弘的大教堂,我们所做更多的是重复性而非创造性的工作。这让我想起小时候,帮父亲家具作坊搬木头,劳累又厌倦。大约在2012年后,我基本上告别编程,也切断由此带来的烦恼。当然,偶尔会写点perl来自动化分析工作,那算不上编程。
|
||||||
|
|
||||||
|
这么多年,软件业已呈现出星河日月之势,编程已经交织到我们的生活当之,只是我们不自知而已,代码构筑虚拟世界的触角会延伸渗入物质世界中,侵蚀软硬的边界,甚至未来,世界的形态根本就可能由虚拟之物构成,我们所珍视,精神层面的东西都可以是一片算法而已。如此想来,我们是不是当及早了解一二,以在我们变得更老而探索之力消逝的时候仍然可以理解这个世界。
|
||||||
|
|
||||||
|
老孟
|
||||||
|
---
|
||||||
|
2008-05-29
|
||||||
|
|
||||||
|
老孟姓名孟凡克,原名Michael Mandell,地道美国人。
|
||||||
|
老孟2002年离开美国波音公司chief Scientist岗位,再之前在美国军工企业Hughes Space and Communications公司也是Chif Scientist。
|
||||||
|
|
||||||
|
第一份工作,老孟第一个面试官,大抵问了些诸如正弦曲线、数值算法之类的数学问题。
|
||||||
|
|
||||||
|
老孟喜欢与人聊天,喜欢平仄不分的音调,援引简单的中国小诗,摆弄汉字四字成语,常让我想起美国版孔乙己。老孟喜欢拿用滑动铅笔在废纸片上涂画汉字。老孟的日常爱好和后来的中文精进,推想老孟刚来中国时中文应该还比较烂。老孟的本地化进程不止在语言上。老孟在某老小区居住,据说该小区的大爷、大妈和老孟都挺熟的,碰到老孟都会寒暄几句。腰间别一手机并加套,在这里流行过,又不流行了,不知老孟是因为流行还行因为方便。
|
||||||
|
|
||||||
|
与老孟一起工作始于2003年,参与老孟主导开发的一个项目,项目组总共就5人,一起干了4年不到。2006年老孟调去深圳做WiMAX芯片开发。期间,老孟的建议和指点虽寥寥数语却总能起到指点迷津。
|
||||||
|
|
||||||
|
老孟头衔很多,孟老师、孟博士、专家、首席科学家……,这些头衔对于老孟,都是货真价实无虚假成分的。我看,老孟本质上是一个程序员,老孟具有一个好程序员的特质,老孟有扎实的数学基础,严谨的思维,对未知东西热烈的好奇,热情的付出。老孟写的代码,简洁清晰富逻辑、具美感,折射出其深厚的编码素养。但老孟代码注释极少,有注释处也是极其精炼,对于阅读者是一个不小挑战,极不符合开源精神。这种个人英雄主义的做派,我猜想一定程度上受美国当时Linus等人影响,另一方面可能跟原来波音和休斯军工背景有一定关系。
|
||||||
|
|
||||||
|
老孟性情温和、或者说随和、或者说亲和更贴近些。在中国几年,老孟已深谙中庸之道,不知是品性使然,还是被国人中庸感染。其实,和他一起工作的很多中国人都不那么中庸了。
|
||||||
|
|
||||||
49
markdown/markdown.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: markdown渲染测试
|
||||||
|
subtitle:
|
||||||
|
description: 为快速渲染markdown文章,修改框架代码
|
||||||
|
date: 2024-05-10 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 知识库
|
||||||
|
URL: ""
|
||||||
|
categories: [ 杂烩]
|
||||||
|
slug: "markdown"
|
||||||
|
---
|
||||||
|
|
||||||
|
|| 为快速渲染markdown文章,修改框架代码,实现(会牺牲一点渲染时间,渲染后的静态页面不影响):
|
||||||
|
- "⎟⎟ "开头,默认,灰色背景
|
||||||
|
- "⎟⎟r "开头,暗红色背景,白色文字
|
||||||
|
- "⎟⎟g "开头,草绿色背景
|
||||||
|
- "⎟⎟b "开头,深灰色背景
|
||||||
|
- "⎟⎟y "开头,黄色背景
|
||||||
|
|
||||||
|
**效果如下**:
|
||||||
|
|
||||||
|
哈贝马斯天生患有唇颚裂,童年时曾两度接受矫形手术;亦因为这个先天缺陷的关系,使他无法清楚咬字,并严重影响到他的社交生活。有语言障碍的哈贝马斯却发展出了沟通行为理论。足见思想比语言能触达的更深广。
|
||||||
|
|
||||||
|
人们担忧高度发达的理性、世俗化导致宗教大厦岌岌可危。就像马克思韦伯认为的那样:
|
||||||
|
> 我们这个时代,因为它所独有的理性化和理智化,最重要的是,因为世界已经被除魅,它的命运便是那些终极的、最高贵的价值,已经从公共生活中销声匿迹。
|
||||||
|
|
||||||
|
||r 但近年的事实是美国的信教人数在稳步增长,美国大选中,宗教议题显得越来越重要,对堕胎问题,性少数群体等看法,本质上是宗教议题。阿拉伯原教旨主义主义也并未因世界“祛魅”而销声匿迹,反有卷土重来并在很多点上立足脚跟的态势。所有迹象似乎指出,现代性和消费主义包围下,宗教并没有萎缩,反而有壮大趋势?
|
||||||
|
|
||||||
|
理性强大、宗近萎靡导致现代人缺少精神支点,堕向虚无;
|
||||||
|
反之,宗教野蛮生长,又导致现代政治遭受侵扰,出现政教边界淡化,甚至走向政教不分的危险。
|
||||||
|
|
||||||
|
这的确是一对悖论。信仰和理性在本质上**不可调和**的,宗教要求:
|
||||||
|
> "割断与所有世俗感性有关的爱的连结,并同时还确信没有什么可失去的"
|
||||||
|
|
||||||
|
就像上帝要求亚伯拉罕以最爱的儿子以撒献祭,亚伯拉罕没有犹豫,这种把一切交给上帝的“信”。在世俗主义理性视角下,这等同于“谋杀”,这样的行为是解释不通的。
|
||||||
|
|
||||||
|
||g 这对看似无解的悖论,也是阿拉伯世界对抗西方世界和很多其他问题的**病因**。在宗教全面干预生活的世界里,现代性带来的思维模式的根本性转变,导致宗教的影响力削减。阿拉伯国家,人们一方面享受着现代进程带来的物质改善的好处,因此他们并不反对美元,但另一方面又痛恨人们在现代进程的影响下用世俗主义的思维替代宗教思维后对宗教的独断性形成的挑战。宗教的唯一解释权遭到破坏,权力的来源遭到瓦解,这是他们不能容忍的,以至于,他们用各种方式,抵御现代性影响,尝试着让人们退回到宗教传统的硬壳中,而不管个体对社会进步带来的新的权利诉求,用一刀切的宗教教条统辖所有方面,从而倒向原教旨主义。
|
||||||
|
|
||||||
|
哈贝马斯后期思考这个问题,提出的**解药**是,“宗教回归”或“神学转向”。一方面用宽容的姿态对待宗教,用协商对话的方式让宗教进入精神日常甚至政治公共领域。而另一方面,给宗教进入政治领域画上一条界限,即宗教不应保留在神秘主义境界来约束人,在政教分离和平等对待每一个人的立场上,才谈得上宗教信仰和结社自由,主张宗教语言应翻译为哲学的命题范畴,加以探讨、检验而为人所接受。
|
||||||
|
|
||||||
|
||b 哈贝马斯的理想是建立在对现代性问题充分体察之上。现代性代表了人类的进步一面,也蕴含了堕落的因子。宗教则在更高维度,隐藏着人类底层的智慧和世界和人性的隐喻,世俗和宗教相互资借。这种范式看上去很美好,值得借鉴思考,如能够践行,必定能够完善政治,也能滋养精神生态。然而,这对悖论岂会如此轻易的一劳永逸的解决。哈贝马斯的思考,很多人并不能同意。
|
||||||
|
|
||||||
|
一面是人们担心宗教平等参与政治协商的过程,宗教的内生力量纵容宗教的侵入,出现政治倒退,甚至可能促成宗教力量对国家权力的控制。另一方面很多宗教人士对此也并不赞同,他们认为哈贝马斯划红线的做法,要求通过“翻译”成世俗或哲学语言的方式来表达宗教精神,并不是一种平等的做法。这种方式,极有可能丧失宗教语言的魅力和富有洞见的意义,导致宗教过度“理性化”,使得超验的宗教性丧失灵性、话语权,沦为“理性”的奴仆和装饰物。
|
||||||
|
|
||||||
|
||y 开头的美国宗教壮大的现象,恰恰说明哈贝马斯“宗教回归”推演的前瞻性,这种回归可以作为马克思韦伯对“祛魅”的现代性的担忧的回应,这也提醒我们对现代性的担忧是不是应该转向或兼顾宗教的“侵入性”对政治领域的影响?
|
||||||
53
markdown/socrates.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 苏格拉底如是说
|
||||||
|
subtitle:
|
||||||
|
description: 我与世界相遇,我与世界相蚀,我不辱使命,我与众生相聚。
|
||||||
|
date: 2022-02-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 哲学
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 思考
|
||||||
|
- 读书
|
||||||
|
slug: "socrates"
|
||||||
|
---
|
||||||
|

|
||||||
|
- **对哲学家来说,死是最后的自我实现。是求之不得的事,因为它打开了通向真正知识的门。灵魂从肉体的羁绊中解脱出来,终于实现了光明的天国的视觉境界。**
|
||||||
|
苏格拉底关于理念的学说,是对人死后世界的确信,作为一个肉身的具体的人,在苏格拉底这里没有那么重要,重要的在于永恒的理念的人。
|
||||||
|
<br/>
|
||||||
|
- **我去死,你们去活,究竟谁更幸福,唯有神知道。**
|
||||||
|
<br/>
|
||||||
|
- **在死亡面前,我们要思量的不是生命的空虚,而是它的重要性。**
|
||||||
|
<br/>
|
||||||
|
- **我与世界相遇,我与世界相蚀,我不辱使命,我与众生相聚。**
|
||||||
|
> 凯撒名言:“我来过,见过,征服过!” 「**I came, I saw, I conquered**」
|
||||||
|
- 快乐的秘密并不在于寻求更多想要的,而是在于培养**清心寡欲**的能力。
|
||||||
|
> The secret of happiness, you see,is not found in seeking more,but in developing the capacity to enjoy less.
|
||||||
|
- 清闲是一切财富中最难得的。
|
||||||
|
<br/>
|
||||||
|
- **最热烈的恋爱,会有最冷漠的结局。**
|
||||||
|
<br/>
|
||||||
|
- 好的婚姻仅给你带来幸福,**不好的婚姻则可使你成为一位哲学家**。
|
||||||
|
<br/>
|
||||||
|
- **未经审视的人生不值得度过。**
|
||||||
|
> The unexamined life is not worth living.
|
||||||
|
- 你是为了吃饭而生存,还是为了生存而吃饭呢?
|
||||||
|
> Other men live to eat,while I eat to live.
|
||||||
|
- 我的母亲是个助产婆,我要追随她的脚步,我是个**精神上的助产士**,帮助别人产生他们自己的思想。
|
||||||
|
<br/>
|
||||||
|
- 思想应当诞生在学生的心里,教师仅仅应当像助产士那样办事。
|
||||||
|
<br/>
|
||||||
|
- **教育不是灌输,而是点燃火焰。**
|
||||||
|
<br/>
|
||||||
|
- **好习惯是一个人在社会交场中所能穿着的最佳服饰。**
|
||||||
|
<br/>
|
||||||
|
- 在这个世界上,除了阳光. 空气. 水和笑容,我们还需要什么呢!
|
||||||
|
<br/>
|
||||||
|
- 世上只有一样东西是珍宝,那就是知识,世上只有一样东西是罪恶,那就是无知。
|
||||||
|
> 我:又说“我唯一可以知道的,是我的无知”,由此,苏格拉底是罪恶的。
|
||||||
90
markdown/test.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 游青州
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2025-06-05 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: /img/青州.jpeg
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 旅行
|
||||||
|
URL:
|
||||||
|
categories:
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
slug: qingzhou
|
||||||
|
xhstitle : 解放路;阿迪焦雷饭店叫司机大佬;放假了咖啡;啊
|
||||||
|
xhsdate : 2025-06-25 11:00
|
||||||
|
xhstags : [flakdsj,lfajd,fasdljl]
|
||||||
|
xhswhere : 杭州西湖区
|
||||||
|
xhsopen : yes
|
||||||
|
xhssign : 刀波儿
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
## 流水账
|
||||||
|
计划4天的行程,提早一天结束。
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
第一天下午去了古城和云门山。
|
||||||
|
第二天上午参观青州博物馆,下午登驼山,逛龙兴寺和广福寺。
|
||||||
|
第三天已经没有什么可以安排游玩的地方了。改签9日中午的回程票回。
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
### 7日
|
||||||
|
<!--xhs-->
|
||||||
|
到酒店,稍休息。古城小店点了一碗驴杂米粉、一个驴肉火烧,女老板清秀,吃的东西也精致。
|
||||||
|
吃完逛古城、偶园、古街,人不少。路边有个小伙子做鲜榨果汁,要了一杯火龙果汁,不错。
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
路过衡王府残碑,在一个不知名的职业学校内,一共三组,造型像牌坊。每一组,前后4对古兽,端庄威严,须发开丝缜密,底座、立柱上雕刻云纹龙凤,风吹日晒显得斑驳,但仍看得出不凡。
|
||||||
|
|
||||||
|
{{<gallery dir="/img/qingzhou/7"/>}}{{<load-photoswipe>}}
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
### 8日
|
||||||
|
|
||||||
|
9点到青州博物馆。已经有不少人。
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
青州博物馆共5层,馆藏4层,作为古九州之一,陶器、瓷器,青铜器等都有较精彩的展品,但看过陕西博物馆、河南博物院、洛阳博物馆等,青博这类藏品就算不上大器。其中两件印象深刻。一件是战国陶文,没想明白这件东西的用途,文字像封泥。另一件,《崔氏宗门宝塔之颂》,魏碑之精品,书法刻工相当精湛,比魏碑高氏皇家墓志不差。
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
青州博物馆的绝对精品是96年出土的龙兴市造像,没有这批东西,青州没有这么出名,青州博物馆作为县级博物馆也不可能比肩省级博物馆。
|
||||||
|
此前看过很多青州造像的图片影像,身临博物馆现场观摩,那种震撼还是出乎意料,你一下子会明白,为什么作者倾注毕生心力在这些造像上。
|
||||||
|
"熙熙攘攘皆为名利"是解释不通的,这些杰作出自无名氏之手,并未署名。在观摩其中一尊造像时,边上一个中年人轻声说,让他想起妈妈,我见他眼中闪着泪光。这大概就是偶像或虔诚的力量,无保留的信和付出。
|
||||||
|
|
||||||
|
{{<gallery dir="/img/qingzhou/8/bowuguan1" caption="杂类" />}}{{<load-photoswipe>}}
|
||||||
|
{{<gallery dir="/img/qingzhou/8/bowuguan2"/>}}{{<load-photoswipe>}}
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
![[test/青州-1.jpg]]
|
||||||
|
![[青州-4.png]]
|
||||||
|
![[青州-3.png]]
|
||||||
|
![[青州-2.jpg]]
|
||||||
|
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
| ID | 日期 | 安排 |
|
||||||
|
| ---- | ------- | ----|
|
||||||
|
| day1 | 6-7,周六 | 12:40下高铁,**取车**,车牌无限性。去酒店,半小时。<br> 下午进处走走,青州古城,偶园,昭德古街 |
|
||||||
|
| day2 | 6-8,周日 | 青州博物馆 |
|
||||||
|
| day3 | 6-9,周一 | 广福寺,驼山石窟,云门山; **还车** |
|
||||||
|
| day3 | 6-10,周二 | 7.47高铁回,打车 |
|
||||||
|
|
||||||
|
<!--xhs-->
|
||||||
|
|维度| 项目A| 项目B| 项目C| 评估标准
|
||||||
|
|---|------|------|------|--------
|
||||||
|
|进度| 按时完成90%的关键里程碑,延期完成10%| 提前两周完成所有阶段| 频繁延期,关键任务延误超过一个月| 按时完成率≥90%为优秀,80%-89%为良好, <80%为需改进
|
||||||
|
|质量| 客户满意度调查得分92分| 产品缺陷率低至0.5%| 多次因质量问题返工| 客户满意度≥90% 产品缺陷率≤1%为高质量 ,
|
||||||
|
|成本| 超支5%,在可接受范围内| 预算内完成,成本控制出色,节约3%| 成本超支20%| 成本控制在预算+5%内为优秀,±5%-10%为良好, >10%为需改进。
|
||||||
|
|风险| 无重大损失| 风险识别全面| 风险管理不足| 风险识别率≥90% 有效缓解率≥80%为优秀
|
||||||
|
|沟通| 定期召开项目会议,沟通记录详尽,反馈及时| 建立了高效的沟通机制,使用管理工具促进协作| 沟通不畅,信息延误导致决策失误| 沟通满意度≥90%,信息传递准确率≥95%为高效沟通
|
||||||
|
|
||||||
154
markdown/不老时代.md
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "不老时代"
|
||||||
|
subtitle: "年轻又长寿的科学与方法 | [美]迈克尔·罗伊森"
|
||||||
|
description: 书中描绘了医学领域的一些新技术,基于这些新技术,人类在不久的未来,如2050年,寿命或可达150岁,平均年龄甚至可以突破120岁。 寿命的延长是一方面,本书的蓝图里,更重要的是,同样的年龄,人的综合状态年轻化,比如50岁的人,在生理机能上等同于30岁。老年人身体的物理质量有质的飞跃,即作者所谓的:黄金年龄重启。
|
||||||
|
date: 2024-02-21 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 思考
|
||||||
|
- 生活
|
||||||
|
slug: "bulaoshidai"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
再年轻10年,此类书一定不会出现在我书架上。
|
||||||
|
中年,人的局限性显现。解药就是,转向内心,顺应世界,求诸自身。
|
||||||
|
无非路径和方法不同,求神拜佛,折腾身体,倾听中医、玄学或哲学。
|
||||||
|
大概也是中年油腻的来源吧。
|
||||||
|
|
||||||
|
新冠疫情期间成书,有很多最新医学研究佐证,书中观点大多有明确论文出处,每一章后面都有几十本参考书目清单。
|
||||||
|
看着是一本很硬的医学科普书。好在翻译很好,似在读科普小文。
|
||||||
|
|
||||||
|
书中描绘了医学领域的一些新技术,基于这些新技术,人类在不久的未来,如2050年,寿命或可达150岁,平均年龄甚至可以突破120岁。
|
||||||
|
寿命的延长是一方面,本书的蓝图里,更重要的是,同样的年龄,人的综合状态年轻化,比如50岁的人,在生理机能上等同于30岁。老年人身体的物理质量有质的飞跃,即作者所谓的:黄金年龄重启。
|
||||||
|
|
||||||
|
长寿是人类自驱的梦想,这事目前总体平等。人类精英怎会受困于此,他们总有成神的倾向,就像电影《普罗米修斯》中的彼得.维兰德。好一面是,这为这个领域注入无限的人才和资金。这些医学领域的新技术,也许我们听上去陌生,却已做了大量研究。书中提到一些:
|
||||||
|
|
||||||
|
### 干细胞技术
|
||||||
|
|
||||||
|
干细胞可能是人类健康长寿的最大希望之一。干细胞是人体的母体,所有其他细胞源自干细胞。我们曾经认为干细胞是长生不老的,但事实是它们只能复制40~60次(海弗利克极限)。人濒死的迹象是,干细胞末端——被称为端粒——太短了,无法进行复制。因此,为了一次又一次地自我修复,变得更加年轻长寿,需要补充干细胞供应。来自特定外泌体的干细胞和生长因子很可能未来20年主要进展之一,修复细胞并使其恢复活力是黄金年龄重启重要部分。
|
||||||
|
|
||||||
|
该领域研究有很多进展,书中有些综述,但障碍不少。
|
||||||
|
其中之一是:如果用于修复再生的干细胞太多,其中一些细胞无休止地分裂并癌变的概率就会增加。
|
||||||
|
|
||||||
|
**但值得注意**:当前很多公司并不能在干细胞领域做的像他们宣扬那么好,骗局很多,当然可能主要是割富人韭菜。在美国,除了在美国食品药品监督管理局批准的特定临床试验下(截至2020年年中,只有两项临床试验获得批准)使用干细胞疗法,其他的都是非法的。这也导致干细胞欺诈转向了监管不那么完善的国家。
|
||||||
|
|
||||||
|
### 重塑衰老细胞
|
||||||
|
|
||||||
|
来自加州大学旧金山分校的科学家们持续地将年轻小鼠的血液注入年老小鼠体内,他们发现年老小鼠的身体机能因此变得与年轻小鼠一样好。
|
||||||
|
衰老细胞甚至在我们婴儿时期就已形成,但清除机制能保持平衡,直到接近30岁时,它们开始积累。
|
||||||
|
年龄增长,衰老细胞在人体中的数量和影响都在增加,主要引发慢性炎症,对身体造成伤害。
|
||||||
|
更具破坏性的是,它们分泌的物质会使邻近的健康细胞衰老,像某种可怕的感染。
|
||||||
|
|
||||||
|
如此,我们大概能够理解,关于富人定期换血的传言--不管传言真假--有一定的科学性啊。
|
||||||
|
|
||||||
|
普通人没法换血,一个可行的方法就是用轻断食启动自噬的方式来加速衰来细胞的清理。
|
||||||
|
关于自噬机制,听上去像某种玄学,实则是经过大量实证研究,是靠谱的,是保健学理论唯一获诺贝尔奖的。
|
||||||
|
难在管住嘴。
|
||||||
|
|
||||||
|
**但值得注意**:一些证据表明,自噬可能会在某个阶段保护肿瘤,从而帮助被化疗破坏的肿瘤重新生长。
|
||||||
|
听起来很合理?如果自噬负责修复受损细胞,那么它也会修复被化疗损伤的癌细胞。自噬可能是癌细胞最好的朋友。
|
||||||
|
化疗期间不能禁食,因为禁食会诱发自噬,让你的肿瘤暂时进入休眠状态,然后更强劲地复发。
|
||||||
|
在癌症被治愈后,可以尝试间歇性禁食或限制性进食,这些简单、无副作用的干预,可以帮助作癌症幸存者,获得更好的生活质量。
|
||||||
|
|
||||||
|
### DNA操控基因&表观遗传学
|
||||||
|
|
||||||
|
衰老是由一个被称为甲基化和去甲基化的过程启动或关闭的。基于此,有种被称为衰老表观遗传模型的假说,认为如果衰老是由基因表达而不是基因本身的损伤引起的,就能够操纵DNA,以控制蛋白质产生的过程,从而恢复到年轻时水平。
|
||||||
|
|
||||||
|
此外,人类22500个DNA基因中,大约1500个基因在任何时候都是“开放”的,这表明我们体内的确有生物开关。通过表观遗传基因编辑,打开或关闭控制特定基因。
|
||||||
|
|
||||||
|
在表观基因编辑和DNA操控技术成熟先,普通人怎么办?
|
||||||
|
书中说生活方式(如饮食和压力管理)能够影响80%的基因的开放或关闭,即选择生活方式控制基因开关。
|
||||||
|
我们总是在改变基因的功能或表达方式,像运动和饮食这样的行为在任何时候都会影响基因的工作方式,也会影响这1500个基因中的哪一个将被表达(制造它对应的蛋白质)。事实上,你可以操控其中的1200个基因,即使你的化学不及格,你会因此而成为世界上杰出的自我操控工程师。
|
||||||
|
|
||||||
|
当你6岁以下时,你身体上所发生的事情是由基因决定的;当你55岁时,你80%的健康结果是由你的选择决定的,你的选择决定了你的哪些基因是开启的,哪些是关闭的。
|
||||||
|
|
||||||
|
### 其他技术
|
||||||
|
|
||||||
|
3D器官打印技术,微型人体清理机器人,褐色脂肪替换,骨骼生长技术等等。
|
||||||
|
|
||||||
|
褐色脂肪替换,人体有白色脂肪和褐色脂肪,褐色脂肪是一种好脂肪,研究将白色脂肪转化为褐色脂肪注入人体,让胖人健康的变瘦,也许可以让你无所顾忌地享用冰激凌。
|
||||||
|
|
||||||
|
骨骼生长技术,骨骼的自我吸收(变薄)和生长聚合(变厚)并行,药物往往在促进聚合的同时,加速了自我吸收。最新研究的药物,书中提到安进公司的罗慕单抗,能够在促生长的同时,减缓自我吸收造成的骨质疏松。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
本书前半部分给我们描绘了长寿医学的美好蓝图,这些蓝图中的很多部分在2050前能够实现。
|
||||||
|
前提是我们在变革到来之前,我们身体和财富已经准备好了,所以本书也涉及一些似乎无关主题的理财观点,真煞费苦心。
|
||||||
|
关于身体的准备,作者列出一些有实操性建议,让我们在变革到来之前,身体不会出现不可逆的伤害,以至于以上新技术也回天乏力。
|
||||||
|
|
||||||
|
## 一些容易自我对标的TIPS:
|
||||||
|
- 压力管理。减轻压力有助于改善心脏病和脑部问题。经常参加减压活动的人感知压力的水平会大大降低。
|
||||||
|
- 间歇性禁食形式帮助端粒再生。
|
||||||
|
- 动起来。运动有各种各样的生物学好处,包括减轻压力、改善心脏功能、加快新陈代谢、防止脂肪囤积等等,但最被低估的可能是它对大脑的好处。
|
||||||
|
- 避免摄入添加糖和糖浆。
|
||||||
|
- 吃鱼。一项又一项研究表明,鱼类是对大脑最有益的食物之一,特别是鱼肉中含有的DHA(二十二碳六烯酸)和ω-3脂肪酸(可能还有ω-7)。
|
||||||
|
- 不要吃含有饱和脂肪的食物。这些脂肪存在于红肉、蛋黄、奶酪和大多数其他乳制品中,它们与诸多健康问题相关。
|
||||||
|
- 避免摄入单一碳水化合物。全谷物和纤维食品(比如豆类、燕麦、水果和蔬菜)属于优质碳水化合物,它们可以抑制炎症,对大脑和心脏健康有益处。
|
||||||
|
- 适量饮酒对心脏有益处,然而,饮酒被认为会对大脑产生伤害。
|
||||||
|
- 多吃果蔬。如果你的饮食中缺乏各种微量营养素,你的免疫功能就会降低,所以你要多吃绿叶蔬菜、十字花科蔬菜、浆果和柑橘类水果等,力求种类繁多。
|
||||||
|
- 高质量睡眠。
|
||||||
|
- 喝过滤咖啡(不加奶油或甜味剂)以及多吃蓝莓。
|
||||||
|
- 每周蒸几次桑拿。
|
||||||
|
- 训练你的大脑速度。基本理念是“用进废退”。
|
||||||
|
- 连续几周服用复合维生素,在注射流感疫苗前几天保持良好的睡眠,可以提高流感疫苗保护你免受流感病毒侵扰的成功率。
|
||||||
|
- 接种疫苗。接种最新的流感疫苗,每年接种一次流感疫苗。
|
||||||
|
- 补充剂。虽然许多补充剂背后确实有科学依据,但其他补充剂不过是“割韭菜”的工具。
|
||||||
|
- 每天用牙线剔牙。每年看两次牙医,预防牙周病。
|
||||||
|
|
||||||
|
## 关于体检的建议:
|
||||||
|
- 每年一次体检,包括血液检查和其他检查,以帮助你最大限度地减少心脏病、中风、骨病、代谢异常和痴呆的风险。
|
||||||
|
- 结肠镜检查:45岁后每3~10年检查一次,这取决于之前结肠镜检查的结果以及你身体中是否有危险因素(一些有特殊危险因素的人,如40岁的非洲裔美国人,可能需要更早进行检查)。
|
||||||
|
- 妇科和泌尿科检查:每年一次。
|
||||||
|
- 针对女性以及乳腺发育的男性的乳房X光检查:从30岁到84岁,每一到两年进行一次。
|
||||||
|
- 其他:眼睛、耳朵、嗅觉、单腿站立、握力方面的检查,50岁以后每两年做一次骨密度检查。
|
||||||
|
|
||||||
|
## 关于应对压力的建议:
|
||||||
|
- 冥想。研究显示,冥想可以帮助改善端粒长度(端粒位于DNA的末端,它的变化与年龄增长有关),从而提高人整体的健康状态,减少压力反应。即使每天只进行几分钟的冥想,你也会从中获益,有很多应用程序和在线视频可以帮助你冥想。
|
||||||
|
- 深呼吸。深呼吸可以让你放松。认真考虑一下从你的腹部和隔膜开始进行呼吸吧。
|
||||||
|
- 更好的情感联系。社会支持是帮助减少压力的负面影响的关键。
|
||||||
|
- 找到一个团体(如果你没有的话)或定期参与你的团体活动(如果你有的话)。
|
||||||
|
- 睡眠的质量和时长。这可能是我们大多数人最大的自我改造问题之一。较差的睡眠质量与免疫功能下降和传染过程导致的过早衰老有关。
|
||||||
|
|
||||||
|
## 关于运动建议:
|
||||||
|
- 每天走1万步(或者进行其他每坚持一分钟就相当于走100步的活动)。
|
||||||
|
- 每周进行2~3天的某种形式的抗阻训练。
|
||||||
|
- 进行足够强度的心血管运动(跑步、快走、游泳、骑自行车),每周3次,每次20分钟,使心率至少达到年龄校正后的最大心率的80%(男女均为约220减去年龄)。
|
||||||
|
- 每天跳大约40次。
|
||||||
|
- 10个练习:一个接一个做,然后重复两次以上,达到30分钟的设定目标。
|
||||||
|
1. 以“行走”的速度原地踏步(高抬腿),持续20秒。
|
||||||
|
2. 原地深蹲,重复10次(蹲下时保持大腿与地面平行)。
|
||||||
|
3. 用膝盖或脚趾抵着地面做俯卧撑,重复5次。如果觉得太难,你可以先站着推墙面。
|
||||||
|
4. 原地跳跃20秒。5.平板支撑15秒。保持俯卧撑“向上”的动作。背部保持水平,臀部放低。
|
||||||
|
6. 原地踏步20秒,比第一次稍微快一点儿。
|
||||||
|
7. 原地蹲下,但要慢慢地——用整整3秒的时间蹲下,再用整整3秒的时间站起来。做深蹲30秒。
|
||||||
|
8. “熊爬”。手脚并用,在房间里爬20秒。
|
||||||
|
9. “模拟拳击”45秒。膝盖微微弯曲,以拳击动作向空中猛击,左右臂交替出拳。
|
||||||
|
10. 触摸你的脚趾,保持这个姿势一分钟。
|
||||||
|
|
||||||
|
> 重新打造药柜,书中详细介绍了服用理由和摄入剂量:
|
||||||
|
- 维生素D3。42%~82%的人缺乏维生素D。几乎可以肯定,缺乏维生素D会缩短寿命。
|
||||||
|
- 复合维生素/复合矿物质。每天补充两次复合维生素/矿物质,每次半片,可以让你的心脏更年轻,跳动更有力。
|
||||||
|
- 柠檬酸钙和镁。钙可以让你在很多方面保持年轻,包括增强骨骼强度。
|
||||||
|
- DHAω-3。DHA可以帮助你保持健康,对60岁以上人群的随机对照试验中,DHA被证明可以改善大脑功能。
|
||||||
|
- 小剂量阿司匹林。建议49岁以上服用这种长寿补充剂。其抗炎作用有助于保护你免受癌症和动脉功能障碍的影响。
|
||||||
|
- ω-7。ω-7脂肪酸似乎可以减轻炎症和胰岛素抵抗,从而延长寿命。
|
||||||
|
- 益生菌。益生菌(发酵食品中的有益细菌)有助于代谢食物中利于保持年轻并保证能量供给的成分。
|
||||||
|
- 辅酶Q10。这种辅酶会与其他酶一起促进能量的产生。也可以通过降低患糖尿病和高血压的风险,来增强你的大脑功能。
|
||||||
|
- 鳄梨豆非皂化物(ASU)。20世纪90年代以来,在法国,鳄梨豆非皂化物被用于预防关节炎。
|
||||||
|
- 姜黄素和胡椒素。姜黄素有助于改善认知功能,随着年龄的增长,姜黄素在改善认知方面发挥着越来越重要的作用。
|
||||||
|
- 二甲双胍。动物研究和一项流行病学人体试验已经证实二甲双胍可以延长寿命及减少慢性疾病带来的负担。
|
||||||
|
|
||||||
|
## 结语
|
||||||
|
|
||||||
|
作者畅想了一个高寿的美好新时代:老年人不再是社会的寄生虫,一帮充满朝阳气息的老年人,不断为社会添砖加瓦,社会财富因老人的贡献持续增长而非耗。这是作者的臆想,还是未来的事实,实难判断。一方面,所有这些--如换血奖、干细胞定向注入等--技术的医疗费用,并非普通人能够承受,这是另一种形式的阶层裂化;此外,老气横秋并不是形容一个人的物理体格的,人是在社会的复杂关系中,被磨的圆滑。我们在问一个社会怎么了的时候,一般并不意指平均寿命,在这个意义上,平均年龄并不改变什么。异常健壮的一代人,不一定拥有异常健康的人格。
|
||||||
|
|
||||||
|
试想,一个平均年龄120岁的社会,一群120岁的人类……?
|
||||||
39
markdown/与堂姐谈篆刻(1).md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "谈篆刻(1)"
|
||||||
|
subtitle:
|
||||||
|
description: 《人间世》中颜回问仲尼何为心斋,仲尼回答:“唯道集虚。虚者,心斋也。“。“生白”之“白”在庄子这代表了一切美好,吉祥止止,喜庆之事便会源源不断。
|
||||||
|
date: 2024-06-22 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "yutangjietanzhuanke(1)"
|
||||||
|
---
|
||||||
|
|
||||||
|
堂姐说要学篆刻,发了一个“止止”,问如何布局。我想了下说,可以用元朱、缪篆或金文,笔画少反而不好布局。
|
||||||
|
|
||||||
|
小时候堂姐教我书法,印象中,堂姐书法极好,暑假她住天台,她写一张,我临一通。临近开学,她走前,留下《颜勤礼碑》、《玄秘塔碑》、一本《千家诗》和一捆毛边纸,有空就在楼上自个儿房间临帖,很好的启蒙。
|
||||||
|
|
||||||
|
她给我看了先前临的一方汉印,有点基础,线条略显稚嫩。懂书法者眼高,学篆刻不算难。眼最要紧,手熟不难。
|
||||||
|
|
||||||
|
第二天,试以“止止”为题,写了几方印稿。之前刻过“虚室生白”,与”止止“同出自《庄子.内篇.人间世》: “虚室生白,吉祥止止”。“致虚极,守静笃”,虚静是老庄哲学的要义。天地唯心,庄子所谓“虚室”是即“心斋”。
|
||||||
|
|
||||||
|
《人间世》中颜回问仲尼何为心斋,仲尼回答:“唯道集虚。虚者,心斋也。“。“生白”之“白”在庄子这代表了一切美好,吉祥止止,喜庆之事便会源源不断。
|
||||||
|
|
||||||
|
下午刻三方,陶和青田“吉祥止止”朱白各一方,青田“止止”朱一方。三方中规中矩。
|
||||||
|
![[与堂姐谈篆刻(1)-4.jpg]]
|
||||||
|
|
||||||
|
陶印典型汉白,陶脆,切刀,面目苍茫,倒是显得大气。
|
||||||
|
![[与堂姐谈篆刻(1)-1.jpg]]
|
||||||
|
|
||||||
|
青田“吉祥止止”,线条两侧各一刀冲,毫无新意,于是去了边框,气韵全散。此印宜改缪篆,汉印有一方“巨蔡千万“可资参考。
|
||||||
|
![[与堂姐谈篆刻(1)-3.jpg]]
|
||||||
|
|
||||||
|
青田小印“止止”,字形极简者,刻朱文小印或满百大印都是合适的。拟隋唐印法,不过考虑到堂姐并未了解隋唐印风,刻意取向更为规整。其实反失去了隋唐印,应率直不羁之本色。
|
||||||
|
![[与堂姐谈篆刻(1)-2.jpg]]
|
||||||
|
|
||||||
|
|
||||||
31
markdown/与堂姐谈篆刻(2).md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "谈篆刻(2)"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-06-29 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "yutangjietanzhuanke(2)"
|
||||||
|
---
|
||||||
|
|
||||||
|
堂姐临汉印目前主要是线条问题,刀法基础没有解决。或许先临一方简单的长线条的汉印,临到原印气息。辅助线条练习。
|
||||||
|
|
||||||
|
近来自己在篆刻上也勤了,尤其是原来没有认真研究的规整一路的印风。
|
||||||
|
|
||||||
|
> 正和奇,字法、篆法、刀法之外便是章法,章法是布局,纹饰学重要的美学基础就是对称,对称是所以艺术门类里的基础,趋向稳定性是根植于人类基因里的本能,匀停对称便是最基本的平衡稳定,对称在印中达到稳重平正的效果,汉印给人的庄严静穆气息这种匀停对称的效果。
|
||||||
|
|
||||||
|
稳态是审美的自觉,锐意创新是人性躁动造成的例外。高质量的稳态并不简单,是低熵的状态,需要能量维持。
|
||||||
|
|
||||||
|
稳态的美确实根植底层思维中。据说关于美女帅哥,世界各地的人观点出奇一致,有专家研究--实验并不复杂--人类平均状态的脸孔最美,平均状态柔化了所有的突兀。当然,这么说不是不允许异类审美的存在。篆刻的匀停工稳相当于这种稳态。
|
||||||
|
|
||||||
|
工稳一路,首先做到对称,呼应和线条匀称可以视作对称的一种。方法论上,表现在印稿的设计很关键,基本刀法解决后,印稿决定了90%的效果。因左右的视觉偏差,弧线的对称很难,但又很关键,弧线对称性问题基本就可以废一方印,比如:⋔⋒,不用工具下,**就多用辅助线**。
|
||||||
|
|
||||||
|
一方“文心雕虫”🐛🐲工稳印稿总不满意,干脆放开手脚。
|
||||||
|
![[与堂姐谈篆刻(2).png]]
|
||||||
|
|
||||||
125
markdown/东京旅行.md
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 东京见闻
|
||||||
|
subtitle:
|
||||||
|
description: 浮世绘是特色,相关藏品不少,有几副是葛饰北斋作品。 尺寸普遍比想象中小很多,画上往往有不少蝇头小字,富款。让我想起连环画或年画。 浮世绘反映人间百态,据说很多表现情色场人事物,不见于藏品。 浮世绘门槛并不高,不像中国文人画,承载太多审美意趣和生活立场,外国人也看不懂。
|
||||||
|
date: 2024-01-10 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 旅行
|
||||||
|
- 日本
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
slug: "dongjinglvxing"
|
||||||
|
---
|
||||||
|
|
||||||
|
1
|
||||||
|
---
|
||||||
|
入住日本桥Prince Hotel。中饭已经2:00过后,3人酒店对面吃小馆子对付下,天妇罗+乌冬面,不知是否有些饿的缘故,出奇的好吃。结账,出奇的便宜,不到150¥,吃爽了。三人发了一通日本消费不高%^&#@¥%……。
|
||||||
|
![[东京旅行.jpg]]
|
||||||
|
|
||||||
|
浅草寺,并没有名字的诗意,也不见寺院的清幽,寺院版小商品市场。 不过作为旅游景点的寺院,似乎没有不喧闹的,比如灵隐寺,因其不再承担寺院修行场所之本意。远处两只仙鹤,一只独立寺顶,一只徜徉溪边,人来不惊,仪态不俗,倒像是两个修行的老仙,看人来人往。
|
||||||
|
|
||||||
|
浅草寺传统项目是观赏樱花和礼佛,这个季节无樱花可看,浅草寺又以落叶树为主,便略显萧杀;熙熙攘攘的人群更冲淡礼佛心境。佛寺似乎并无佛像,日本佛教不搞偶像崇拜?这个没研究,如是,倒契合了佛祖的初心。
|
||||||
|
|
||||||
|
日本寺院有抽签的风尚,大概也是收入不菲的创收项目吧。一个个签位,标了价格,无人售票,这种方式挺好,没有买卖的功利和压力。不免俗,抽了支,下下,中间有句,大意是人财分离。虽不作兴这个,还是略有不悦。
|
||||||
|
|
||||||
|
逛完突然想着去吃抹茶小点,老杨发现转角处就有一家抹茶专业店,可惜刚打烊。边上小店点了一个撒着浅草字样的冰激凌,无惊喜。
|
||||||
|
|
||||||
|
途经一家电玩店,别有洞天,一排排整齐划一,机器挨着机器,每一排机器造型不同,应该超过500台,空间被利用到极致。充斥着机器电音,令人想起工业朋克。一簇簇坐着的玩家,电子烟是标配,60%是中老年人,秃头大爷和白发老奶不少见,并无少年,颠覆我对游戏厅的印象。
|
||||||
|
|
||||||
|
这里机器是掌控者,人是机器的有机体延伸,机器设定规则,发出吼叫,刺激神经,填满有机体空虚孤独的心。比起从站台跳下去,被机器奴役也并不算太差,这样想来,风月场也好,游戏厅也好,经营者都有功德。
|
||||||
|
|
||||||
|
想从机器里获得充实感,你必须把情感和思考让渡出来,必须顺从,没有抵抗,哪怕一点点的抵抗,都难以获得疗愈。这跟小视频没有本质区别,放弃情感和思考,核心就是放弃抵抗,彻底顺从,跟着FLOW,自然快感。机器是中间路线,毒品是极端实现,缸中之脑是终极实现。
|
||||||
|
|
||||||
|
就近随便闯进一家小店,点了啤酒、清酒、烤生蚝和一个芝士饭。黑啤不错,清酒劣质,芝士饭惊艳。
|
||||||
|
|
||||||
|
2
|
||||||
|
---
|
||||||
|
因小黄的想法,闯入尼康博物馆,看影像世界里,一个没落帝国余晖和辉煌往事。我这个曾经的尼康忠实玩家,叹为观止,心里唏嘘。楼起楼塌,时代车轮终将碾压一切繁华。
|
||||||
|
![[jp/nikang.heic.jpg]]
|
||||||
|
|
||||||
|
东京国立博物馆,此行前夙愿。
|
||||||
|
博物馆是基础设施,政府行为,收费差评。
|
||||||
|
|
||||||
|
主馆日本藏品,极丰富,从公元前1万年前的绳文时代开始,到明治时代,二十几多个区块,区块连贯有序,方便导览。讲真这点收费并不算什么,相比于日本很多私人的小博物馆的收费,算很有良心。
|
||||||
|
![[jp/dongbo0.heic.jpg]]
|
||||||
|
|
||||||
|
有个“遮光镜土偶“的小泥人很有意思,取这个名字,是因为这个小泥人看上去像是带着一副遮光眼镜,有点后现代的意思。这是件日本国宝,据说是绳文时代,造型独特,纹饰优美,据说说是五千年前,有些难以置信。日本本土文化怎么都算不上辉煌,这是地域的局限性所致,本来不能说明民族性的任何问题,但在近代民族主义风行的时代,大家都想用老祖宗来证明民族优越性。于是考古成了任何国家的头等大事,回想中国建国后的考古热,人们刨开祖坟,也是要拿出祖上创造力的例证。殖民地尤其如此,印度,土耳其都是这般德行。日本是一个不多见的没有被殖民过的国家,日本人极力要证明自己的动机,恰恰说明日本中古以前没有什么拿的出手的东西。佛教传入前,神道教基本上是一种原始的萨满信仰,如此生长出来的东西,值得称道的东西不算太多。那个土偶如果是绳文时代的东西,似乎是个例外。
|
||||||
|
|
||||||
|
近代日本很多时候是扬眉吐气的,我认为主要得益于日本人善变通,大化革新全面汉化,明治维新全面西化。从洋务运动、改革开放,土耳其\阿拉伯国家革新,我们知道日本的做法并不通行。承认差距,放下自以为是,这种反人性的做法并不容易。
|
||||||
|
|
||||||
|
日本书法艺术总体境界不高,草书相对较好,走细滑路子,没有看到像黄庭坚、王铎、徐文长这类不拘一格的作品。也有很多写意山水,画在屏风上,规格较大。工笔则多小幅,不太懂,以我见识,似乎没有跳出或超越汉制。
|
||||||
|
![[jp/mingzhi.heic.jpg]]
|
||||||
|
|
||||||
|
浮世绘是特色,相关藏品不少,有几副是葛饰北斋作品。尺寸普遍比想象中小很多,画上往往有不少蝇头小字,富款。让我想起连环画或年画。
|
||||||
|
|
||||||
|
浮世绘反映人间百态,据说很多表现情色场人事物,但鲜见于展品。浮世绘欣赏门槛并不高,不像中国文人画,承载太多审美意趣和生活立场,外国人看不懂。
|
||||||
|
|
||||||
|
从艺术的本质-创造神秘感-上来讲,文人画,尤其写意一系,在中国是成功的,但神秘到玄学,也就一步之遥,过头了又有问题。就像"玄之又玄"是一句废话,似乎说了世间一切道理,看着很高,又好像什么都没说。字画也类似,八大山人用一笔画画了一只小鸟,你说实在是高,老外无法理解这究竟高在哪里--直观的看,但凡参加过素描训练班的小学生,一定比这个画的“好”--这符合写意精神,但不符合格物精神。
|
||||||
|
|
||||||
|
日本人对所谓“道”的追求,与中国“道之为物,恍兮惚兮,维恍维惚,其中有象”中的“道”根本不同。日本人的“道”,要能落实和复制,要求进入生活,如千休利的茶道,有一套规矩。玄之又玄的文化,不讲度量和证伪,和格物的科学精神冲突,你跟我说月亮上住着兔子,你说你发功导致了大西洋上的龙卷风,怎么证伪?玄之又玄,在操作层面就是怎么说都是对的,无法反驳。
|
||||||
|
|
||||||
|
这种格物精神,日本人称之为"道"的精神,在外物上获得改造力量。在操作层面上,必然要规范到细节,如日本产品的品控,日本天妇罗、炸猪排、饭团在细节上的高标准,这个对标准和规范性的要求。向内心理上,反而变成束缚心灵自由疏导,导致压抑扭曲。一方面日本在方方面面快速精进,另一方面塑造了国民性格,日本人的高自杀率与此或有些关联。
|
||||||
|
![[jp/dongbo6.heic.jpg]]
|
||||||
|
|
||||||
|
浮世绘不同,日本人用版画般线条来写实,这个东西一看就能还原。浮世绘有抽象,但不像写意画般虚空,又不像西方绘画般写实。中国文人画家眼中,西方像郎世宁这种西洋画,虽然也不值取法,至少在技法上还是诚服的;而浮世绘这种东西则无论技法还是表现,在中国文人眼中,都算不上高级。
|
||||||
|
|
||||||
|
老外根本搞不懂中国画,太抽象,完全是内心戏,无法切入。西洋画和大写意像两条平行线上的东西。但当莫奈\塞尚等大师看到浮世绘,立刻有了契入点,西洋画画家看到了浮世绘简洁、抽象、夸张的一面,能“破”西洋画过于写实的风气。大画家的推崇,浮世绘本身有些现代设计感的元素在里边,在纹饰、陈设等样式上的时尚感,易被取法,流行并不偶然。
|
||||||
|
|
||||||
|
馆中武士文化,武士刀,铠甲等,挺有意思。漆器精美。个人觉得日本的铠甲完全是行为艺术,华而不实,人称日本战国是村级械斗,有些道理。日本人在这种事情上,向来认真,善于自我感动,比如武士刀和破腹礼仪。让我想起动物世界里,两只凶猛的动物打仗,竖起毛发,扬起尘土,这样的行为艺术,目的是要不战而屈人之兵。最小化战损,最大化战果。
|
||||||
|
|
||||||
|
![[jp/dongbo1.heic.jpg]]
|
||||||
|
|
||||||
|
**东亚馆**非常值得看,内容不多,却都是精品。公元前1300多年前的埃及石雕,印度犍陀罗造像艺术,云岗等地佛造像,好东西!国内也并不多见,观止。吴昌硕之展不知是常展还是特展,藏品数量可以办个高规格的特展,还有不少邓石如、赵之谦等人的作品。当年日本人买了大量吴昌硕的作品,吴先在日本出名,大量的日本拥趸者。
|
||||||
|
|
||||||
|
铜镜跟国内比,差太远了,可不看;青铜器,其中饕餮纹三牺樽和文瓿是极品,不过看过陕博、洛博等的东西,这些也就不足称道了。
|
||||||
|
![[jp/dongbo2.heic.jpg]]
|
||||||
|
![[jp/dongbo3.heic.jpg]]
|
||||||
|
![[jp/dongbo4.heic.jpg]]
|
||||||
|
|
||||||
|
出门西方红云密布,乌鸦成群,一派末日景象。
|
||||||
|
![[jp/dongbo5.heic.jpg]]
|
||||||
|
|
||||||
|
3
|
||||||
|
---
|
||||||
|
忍野八海,远眺富士山,天真蓝,水真清。
|
||||||
|
在箱根吃怀石料理泡温泉。是旅行该有的样子。
|
||||||
|
|
||||||
|
![[jp/fushi.heic.jpg]]
|
||||||
|
|
||||||
|
4
|
||||||
|
---
|
||||||
|
所住的Godzilla主题酒店,上方建造了一个大大的哥斯拉造像,是原宿出名的打卡点。日本人对哥斯拉情有独钟,大概源于心理底层的不安全感吧,以喜闻乐见的方式为大危机做演练,倒也不差。
|
||||||
|
|
||||||
|
东京并不刻板。也许是因为在原宿,而不在格子间里。也许是因为有多压抑,便有多奔放,一张一弛活力之源。原宿的活力在美食、情色、酒精、二次元冲击下全面释放。开车师傅说东京4000万人口,这是东京的硬实力吧。
|
||||||
|
![[jp/xinshu.heic.jpg]]
|
||||||
|
|
||||||
|
晚上到一家中国人经营的烤肉店吃饭,顾客来自各国,热闹非凡。路上偶遇几波街头表演,跳街舞,摇滚乐队,精彩,我认为是可以选秀的那种。
|
||||||
|
|
||||||
|
5
|
||||||
|
---
|
||||||
|
近期因为日本核废水排放问题,大陆舆论哗然,抵制日本海鲜呼声高扬。到日本吃海鲜--并不算太正确的做法--有必要去筑地海鲜市场实地考察一番状况。
|
||||||
|
|
||||||
|
吓一跳,完全出乎意料。人从众!排了30分钟队伍,我们吃上了海鲜饭。说实话,味道不错。食为天,懒得分析是是非非,只想好好的感受这实在的米饭的味道。
|
||||||
|
![[jp/zhudi.heic.jpg]]
|
||||||
|
![[东京旅行-1.jpg]]
|
||||||
|
|
||||||
|
吃完饭,误打误撞走进筑地本愿寺,亲鸾大师净土真宗创立的地方,一向一揆的大本营,日本战国时被织田信长团灭。不过寺院像怎么看都不像寺院,倒像教堂,异教色彩浓郁,不伦不类。
|
||||||
|
![[jp/qingluan.heic.jpg]]
|
||||||
|
|
||||||
|
寺院边角有个咖啡厅,点了点喝的,坐在外面晒太阳,美好的下午。书架上看到一本《鬼灭之刃-学习一次佛教》的日文书--看过鬼灭之刃这部个人非常非常喜欢的剧--辅助照片翻译粗略看了下,作者从这部剧牵强附会的讲解了四圣谛,三法印,八正道等佛教基础概念。
|
||||||
|
|
||||||
|
6
|
||||||
|
---
|
||||||
|
明治神宫,神宫建筑考究,内以樟树为主,深冬依然郁郁葱葱。明治神宫纪念明治天皇夫妇,明治天皇在位45年,期间日本全面西化,快速崛起,对日本民族功勋卓绝意义非凡。对中国人则有相反的含义,中日在明治时期此消彼长,甲午海战就在此时期发生。
|
||||||
|
|
||||||
|
仇恨带来更多的仇恨,希望仇恨消融,而不是被铭记。
|
||||||
|
|
||||||
|
中午,排队20分钟,吃了地道猪排饭。日本猪排饭都很好吃,不知道秘诀在哪里。
|
||||||
|
|
||||||
|
期间看完了《疯狂的尿酸》,不管生活怎样,做好健康管理,去看去感受。
|
||||||
30
markdown/中医之经络.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "与老杨谈中医(1)"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-05-14 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 中医
|
||||||
|
URL: ""
|
||||||
|
categories: [ 生活 ]
|
||||||
|
slug: "zhongyizhijingluo"
|
||||||
|
---
|
||||||
|
|
||||||
|
早餐,老杨提了一个开脑洞说法:中医很早就提出气脉理论,这些知识似乎是无中生有的,会不会是源自另一个文明直接灌输? 就像三星堆,有人说,是外星人文明遗迹。确实很难否认。
|
||||||
|
|
||||||
|
个人倾向于,这不是外星人干的。中医的气脉理论和巫道的精气神同源,古人没有太多的实证和临床经验,怎么办?用神思得出一些超验的理论。
|
||||||
|
|
||||||
|
这些理论跟生活体验有关,又超脱生活经验之外,但也可以借助身\心\药来修证体验,从而达成逻辑闭环。这些理论的抽象性和含糊性,在结果的验证上,提供了不同的解读,理论能够自洽,便可认为实践可行。一方面,理论的自洽,可以通过指认一个不可证伪的鬼神、气脉、诚意体系来修正衔接,二方面,也没有更好的可选的机制资作参考,三方面,巫医究其本源是同构,属于信仰体系,信仰体系要求无条件的“信”,从这个角度“医”是副产品。
|
||||||
|
所以,中医并非无源,而是在大量先秦朴素的天地人的看法为底本作为其理论基础。
|
||||||
|
|
||||||
|
中医何以选择“气”“经络”,作为构建的基本要素而不是其他,比如更为显见的体液血管❓
|
||||||
|
|
||||||
|
外国据说也有经脉说,未加考证【印度认为人体有横行经脉(七次脉轮),埃及认为人有十六脉(metu),古希腊(还是罗马来着记不清)医学认为人体内至
|
||||||
|
少有三条通道模型存在。】。但西方发展过程中,逐步放弃了这套认知,中国则广泛流传至今,虽处于弱势,但与主流之西医争夺主流。
|
||||||
|
|
||||||
|
大概与中西方思维模式不同有关系,西方人重实证或实验,中国人好抽象或超验。古人的高妙就在这里,古人早就发现了"抽象超验的不可证伪性"。中医要有自洽(自说自话)的可能,必须扎根于此,才可能构建出千古不破的庞大体系,这也可能是中医在研究不可见的气脉穴位,而不重视(或不研究)血管血液的原因。试想如中医基于可见的解剖学构建理论,被斥之于荒谬是早晚的事情(血管血液是日常可见的重要人体构建,古人没有理由忽视?可能古人也发现了,实操解剖学层面的研究根本走不通,干脆放弃❓或者在中国哲学层面,实操性的境界不高❓就像庄子认为御风而行的列子境界不高。)。
|
||||||
|
|
||||||
39
markdown/中央帝国的哲学密码.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 中央帝国的哲学密码
|
||||||
|
subtitle: 郭建龙,鹭江出版社
|
||||||
|
description:
|
||||||
|
date: 2020-03-16 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags: [历史,读书]
|
||||||
|
URL: ""
|
||||||
|
categories: [读书]
|
||||||
|
slug: "zhongyangdiguodezhexuemima"
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1
|
||||||
|
一本中国文化思想史,条理清晰,援引丰富详细,常有可参处,可见作者真下了功夫。思想史要写的浅出是比较难,一来中国历史纵深长不可靠,二来流派纷杂,化繁为简要考据、取舍、也要深刻理解,比如去年读的一本《在新世纪的哲学思考》,旁征博引包罗万千,可终归太过学究气,失之晦涩。
|
||||||
|
|
||||||
|
跨度从西汉到清末约2100年,按时间轴推演中国主要思想发展逻辑及影响。
|
||||||
|
|
||||||
|
## 2
|
||||||
|
一本中国文化思想史,条理清晰,援引丰富详细,常有可参处,可见作者真下了功夫。思想史要写的浅出是比较难,一来中国历史纵深长不可靠,二来流派纷杂,化繁为简要考据、取舍、也要深刻理解,比如去年读的一本《在新世纪的哲学思考》,旁征博引包罗万千,可终归太过学究气,失之晦涩。
|
||||||
|
中国大一统的意识形态与权力形态紧密结合,哲学思想有几个绕不开的核心问题。一要回答为那个阶层服务的问题?二要回答权力的正统性问题?其次才是哲学服务心理层面需求的问题?大一统政治下,前两个问题总是主导着思想史走向。如两汉之前皇权都有个首要的问题,那就是合法性问题。凭什么你当皇帝我当不得,“黄侯将相宁有种乎”。董仲舒的“天人感应”理论就是在这样背景下出来的,他完成了儒家宗教化。皇权是天授,皇帝是天在世间唯一合法的代理人,而天反过来通过天象来确认这个代言人干的好不好,董仲舒在其中掺杂了大量道家谶纬等内容。由于其理论无所不包的特征,以及对人们生活的全面控制,加上一系列的仪轨,事实上已经出现宗教化倾向了,称儒教可能是恰当的。宗教和哲学,最大的区别就在于,宗教带有很强的强迫性和洗脑特征,并可以用来对人的生活进行强制性规范,哲学却做不到。
|
||||||
|
|
||||||
|
## 3
|
||||||
|
道教始于东汉中后期五斗米教,以《老子》《太平经》等为教义,有严密组织形式。从创始之日便与装神弄鬼和权力扯不清,是一个政教合一的组织。汉代的哲学是中国历史上最缺乏逻辑能力的,导致道教不喜欢深度思考问题,只习惯于用一系列的比附和符咒,动不动就跳大神,失去了进化的能力。道教从诞生之日起就是功利化的,总是希望与政权相结合,导致道教一直长不大,近代太平天国以道教借尸还魂又是一例证。
|
||||||
|
|
||||||
|
## 4
|
||||||
|
极盛时期往往意味着越来越多的礼数规仪,如儒教的产生,大乱是破尽陈规追求自我的开始,如玄学的产生,玄学源于道,又不同于道教,不实用、质疑和思辨是最重要的特点。“非汤武而薄周孔”“越名教而任自然”在当时相比振聋发聩吧。如此,部分消解了人们对权威盲从,隋唐时期,人们虽跳出了玄学,但思辨精神有所传承,直至元明清时期又被权威主义倾轧。
|
||||||
|
|
||||||
|
## 5
|
||||||
|
南北朝佛教从假借道教这条大船出海,佛学早期为世所知者主要是清虚无为、省欲去奢等内容,近于黄老之说,故浮屠(佛)每与老子并祭,甚至出现了“老子入夷狄为浮屠”的传闻,说佛祖就是老子化身的。但当人们真正开始了解佛教后,佛教的体系和思辨又远远超于道教,因此,在历史上多次的佛道大辩论中,道教始终是不上流的。
|
||||||
|
|
||||||
|
**关于佛教来龙去脉,书中有很好的总结梳理,值得看**
|
||||||
|
|
||||||
|
佛教的迅速崛起壮大,姿态独立,给佛教自身带来了磨难,一统政治下,出世的佛教,也不能忘记为谁服务问题,这个问题回答不好就不可能有好果子。与皇家争辩,不行跪拜,这些传为美谈的佛家事迹当然听起来很爽,较之道教的谄媚,以法术糊弄朝堂,佛教的确姿态相对独立。佛教盛行又与皇权争资源,一边是国家水深火热,一边是佛教香火鼎盛。从而催生了历史上“三武一宗”灭佛行动,这当然有主流意识形态斗争问题,根因在经济和皇权。至唐朝基本上佛道相生,轮流上位,总体上佛家更胜一筹。
|
||||||
|
|
||||||
|
唐中后期到宋朝,通过科举制度及一些大儒如韩愈的推动,让佛家归于世俗,管理内心,儒家归于政治,管理朝堂。程朱理学实现儒学大一统。
|
||||||
|
|
||||||
34
markdown/中苏关系.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "脆弱的联盟"
|
||||||
|
subtitle: "《中苏关系史纲:1917-1991年中苏关系若干问题再探讨》"
|
||||||
|
description:
|
||||||
|
date: 2024-12-03 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 历史
|
||||||
|
slug: "zhongsuguanxi"
|
||||||
|
---
|
||||||
|
|
||||||
|
有个评论用上帝视角回看那段历史,开出的药方是,要斗争不要意气。深有同感,意气这个词贴切,可能因为个人成长的原因,或者作为图书管理员时留下的大面积心理阴影,书中教员在1958之后的十几年,充满意气。这种意气下的行为,甚至让之前作为先锋队的队友--苏联人,完全猜不透南方的兄弟想什么要什么。
|
||||||
|
|
||||||
|
某些人在艰苦中,一旦掌握与天斗与人斗的斗争艺术,斗争能注入能量,感受无穷乐趣,没有斗争是活不下去的。
|
||||||
|
|
||||||
|
《庄子.列御寇》中学会了屠龙术的朱泙漫,《善恶的彼岸》中的屠龙少年,是恰当的隐喻。当他们学会了屠龙术,手握屠龙刀却发现这个世界并无真龙这一残酷的真相时,他总还是要踏上寻龙之路,屠龙术不会荒废,屠龙刀必须见血,砍向假想中的恶龙的时,它也就化作了恶龙。
|
||||||
|
|
||||||
|
中苏关系是脆弱的联盟,意识形态也不是牢不可破的。如果两者力量对比大到无法放在一个擂台上,意识形态一致性就会发挥作用,形成帮扶的联盟关系,比如当下中俄。问题是弱者总会成长,中苏都是大国,**国家体量和地缘**决定了两者只能是竞争,相互提防就不可避免。积弱的中国在50年代的快速崛起,矛盾自然浮出水面。并且前车之鉴,俄国对大国沙文主义的迷恋到了偏执的程度,对领土扩张有着无限渴望,并非善类,注定蜜月期不会长久。某天,北方的兄弟手握屠龙刀,南下试刀就不可避免。
|
||||||
|
|
||||||
|
当然,南方的小弟也有不服的时候。例如1961年发生的猪湾事件,中国对苏联就很有看法。猪湾事件是冷战时期美国反古巴社会主义运动的高峰。事情大题如下。在CIA帮助下,渗透到古巴的美国人发动了一场颠覆卡斯特罗的攻击行动,最后被古巴消灭,此后苏联介入,在古巴部署了核导弹。古巴核导弹危机一触即发的形势下,肯尼迪和赫鲁晓夫相互妥协,苏联从古巴撤出导弹,作为交换美国撤出土耳其的导弹部署。这个事件苏联其实是受益者,一方面美国丧失了对古巴的控制力,二来苏联在北约前沿的威胁解除。但中国对此很不满意,认为赫鲁晓夫过于软弱,对美国妥协,当时中国开动国家宣传机器来攻击苏联和赫鲁晓夫,大有不惜撕破脸的态势。
|
||||||
|
|
||||||
|
作者在“跋中苏同盟破裂的内在原因”中总结的很好。**社会主义国家关系内在结构弊病 ① 国际主义理念与民族主义追求的矛盾,以意识形态的同一性替代或掩盖国家利益的差异性 ② 同盟内部领导与被领导的组织原则与各国享有平等权利的准则之间的矛盾,党际关系等同于国家关系 ③ 中苏间争夺国际共产主义运动领导权以及为此而产生的证明其意识形态正统地位的斗争**。
|
||||||
|
|
||||||
|
BTW:赫鲁晓夫还写过一篇《回忆毛泽东》,很有意思。
|
||||||
|
|
||||||
31
markdown/临《游目帖》.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 临《游目帖》
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2022-12-04 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "lin《youmutie》"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[临《游目帖》-1.jpg]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[临《游目帖》-2.jpg]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<video width="100%" height="100%" autoplay loop controls> <source src="/img/shufa/youmutie.mp4" type="video/mp4"> </video>
|
||||||
109
markdown/为往圣继心学.md
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 为往圣继心学
|
||||||
|
subtitle: 周云峰
|
||||||
|
description: "先生游南镇,一友指岩中花树问曰:'天下无心外之物,如此花树,在深山中,自开自落,于我心亦何相关?'先生云:'尔未看此花时,此花与尔心同归于寂。尔来看此花时,则此花颜色,一时明白起来。便知此花,不在尔的心外。"
|
||||||
|
date: 2020-01-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 哲学
|
||||||
|
- 古风
|
||||||
|
URL: ""
|
||||||
|
categories: [ 杂烩]
|
||||||
|
slug: "weiwangshengjixinxue"
|
||||||
|
---
|
||||||
|
|
||||||
|
<p style="font-family:'Microsoft YaHei',sans-serif;background-color:#78C7C7 ;padding:20px;border-radius:20px;line-height:35px;">
|
||||||
|
了解阳明心学很好的文章,几年前偶然读到,剪藏于此。
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
世界上有几场著名的悟道:悉达多在菩提树下觉悟成佛,勘破“诸行无常、诸法无我、涅槃寂静”的感知世界真相,创立佛教,被称为“释迦牟尼”;耶稣在耶路撒冷的荒原上禁食苦修,得到上帝的启示,创立基督教,被称为“救世主”;默罕默德在山洞中隐修冥想,听到安拉真主的召唤,创立伊斯兰教,被称为“先知”。抹去宗教色彩,中国历史上著名的“龙场悟道”同样具有广泛而深远的影响。
|
||||||
|
|
||||||
|
明朝正德年间,王阳明于贵州龙场驿的深夜,在“居夷处困,动心忍性之余,忽悟格物致知之旨”,创立阳明心学。500年来,国内外无数政治家、思想家、军事家和企业家,都将王阳明奉为精神偶像和心灵导师,把他称为真正集“立德、立功、立言”三不朽于一身的千古圣人,并对阳明心学顶礼膜拜,从中汲取精妙智慧。
|
||||||
|
|
||||||
|
一切顿悟都是渐悟过程中的嬗变。王阳明从小天赋异禀,11岁就将成为圣贤作为人生终极目标,15岁开始“五溺”之旅,即“初溺于任侠之习,再溺于骑射之习,三溺于辞章之习,四溺于神仙之习,五溺于佛氏之习。”龙场悟道后,最终归于儒家的圣贤之学。“五溺”虽没有为他直接打通圣人之路,但精研儒释道文化,为日后创立阳明心学注入了兼收并蓄的思想基因;游侠和骑射经历为他将来带兵打仗、剿匪平乱提供了直接帮助。可以说,王阳明一生都是在“渐悟—顿悟—渐修”这样循环往复的过程中修炼提升,如果没有当初这“五溺”就没有日后的一夜顿悟。
|
||||||
|
|
||||||
|
科普阳明心学就得从程朱理学和陆九渊心学说起。理学由北宋大儒周敦颐、张载等人发端,经程颢、程颐兄弟发展创立,至南宋朱熹集其大成。理学引佛、道思想入儒学,并将“理”作为研究对象和宇宙的本体。与朱熹同一时代的陆九渊,提出“吾心即宇宙、宇宙即吾心”,初创“心学”,后经明代陈献章、湛若水完善与发展。王阳明继承并创新前人思想,以儒为本,众采佛、道精华,重构理论体系,将心学推至巅峰,使其大行于世。阳明心学既不是心理学,更不是心灵鸡汤,而是修心之学、实践之学、圣人之学。“心即理”“知行合一”“致良知”是其核心思想,也是阳明心学发展的三个阶段。
|
||||||
|
|
||||||
|
01.万物一体的第一层心法——心即理
|
||||||
|
---
|
||||||
|
在程朱理学的语境中,“理”类似于老子说的“道”,是高度抽象化的概念。“理”既是派生天地万物的宇宙本体,也是事物发展的规律,落实在道德层面则表现为社会伦理和行为规范,也称为“天理”,与“人欲”形成并立的概念。人欲,并非指人正常和基本的欲望,而是指那些违背道德的不合理、不正当的贪欲。后世对朱熹和理学口诛笔伐,认为他提倡的“存天理,去人欲”是扼杀人性,其实是不明本意的曲解和冤枉。实际上,心学和理学同属儒学范畴,都是对儒学的继承和发展,也都把“存天理,去人欲”视为完善人格的必由之路、成圣成贤的不二法门。
|
||||||
|
|
||||||
|
两者最大的分歧在于修行和为学的路径上,理学强调格物致知、即物穷理。认为“凡一物上有一理”,甚至“一草一木皆有理”,因此,应该穷究每个事物的道理,从而获得广泛知识,并认为人的道德境界会随着知识的增加而逐步提升,所以朱熹说:“格物穷理,乃吾人入圣之阶梯”。陆九渊则与之争锋相对,强调为学最重要的就是“先立乎其大者”,知识的增长并不能直接促成人格的完善,必须先认识到人的本心就是宇宙万物的本体,先要向内存养本心才能不被外物所迷惑。在不悟本体、不明本心的情况下徒然花费功夫向外求索,就会令修行和为学成为“无源之水”;如果按照理学的那条路去走,只能陷入“务外遗内、博而寡要、支离决裂”的困境。所以,陆九渊才会喊出那句振聋发聩的口号:“学苟知本,六经皆我注脚。”基于此,陆九渊提出了“心即理”的命题,从而创立了与程朱理学分庭抗礼的心学。
|
||||||
|
|
||||||
|
众所周知,王阳明早年是程朱理学的忠实信徒,不仅笃信格物穷理之说,而且身体力行,不眠不休格竹七天,结果一无所获、一病不起。究其原因,按照王阳明后来的反思,就在于朱熹的格物致知会导致“物理吾心终若判而为二”,也就是心与理割裂为二、知与行断成两截。最后,经过多年颠沛流离、出生入死的磨砺,王阳明终于在龙场驿那个“居夷处困”的绝境中明心见性、大彻大悟,高呼“始知圣人之道,吾性自足,向之求理于事物者误也。”王阳明认为,世儒都将格物之学弄错了,导致舍内心而逐外物。所谓格物并不是要格外物,而是要格内心,“理”也并非存在万事万物之中,而只存在自己心中。心外无物,心即是理。而圣人之所以为圣,只是其心纯乎天理而无私欲之杂。只要能把内心修炼得一尘不染,人人都可以成为圣人。阳明心学由此诞生。
|
||||||
|
|
||||||
|
在王阳明看来,理是自心本具、不假外求的,只要一念反观,当下体认这个心,便会发现,成圣成贤的潜能一直都隐藏于我们的躯体之中,人最终要依靠自己的力量来完善并成就自己。心即理是阳明心学的理论基础。《传习录》中记载,徐爱问:您讲只求之本心就可以达到至善境界,恐怕不能穷尽天下之理。王阳明说:心即理也,天下哪有心外之事、心外之理。王阳明认为,此心无私欲的遮蔽,即是天理。
|
||||||
|
|
||||||
|
据说,王阳明与朋友同游会稽山,友人指着岩中花树问道:“(你常说)天下无心外之物,如此花树在深山中自开自落,于我心亦何相关?”王阳明回答说:“你未看此花时,此花与汝同归于寂;你来看此花时,此花颜色一时明白过来,便知此花不在你的心外。”(CG:圣人的辩论手段自不一般,无法证伪,如何反驳)这段话也是心学被抨击为主观唯心主义的“靶心实证”。其实,王阳明在此更多是强调心与物的联系与感应,并没有以心来决定或否定物的存在。如果用僵化的思想和机械的标准来划分,古往今来世界上大多数哲学家和思想家都是唯心主义者(CG:谁说不是,说明作者对唯心主义有偏见)。准确地说,心学既不是唯物主义也不是唯心主义,心学是万物一体、万物互联的世界观,其本质是对主义的超越、对两分法的消解。在理论上,心学将万物归一于心,没有表里、内外、上下之分,心与理不可分、意与物不可分、知与行不可分,任何“一”都是至大无外、至小无内的整体。这也就是《华严经》所说的“一即一切、一切即一”。在实践中,王阳明将万法归一于心,再以一驭万物。在心上做减法实则比做加法难度更大。
|
||||||
|
|
||||||
|
02.内圣外王的第二层心法——知行合一
|
||||||
|
---
|
||||||
|
行问题是中国文化中一个久远的话题。一直以来,知和行就是一对既相辅相成又彼此独立的概念。《中庸》里将“知”称为“道问学”,将“行”称为“尊德性”。人们经常会顾此失彼,要么重知,要么重行,即便是将知行并重,也仍未摆脱二元对立的窠臼与桎梏。朱熹和陆九渊就曾在这个问题上争执不下:朱熹强调“道问学”,即以求知问学作为人格完善的前提,提倡先知后行;陆九渊强调“尊德性”,即以体悟本心作为圣贤之学的关键,提倡先行后知。而王阳明将二元归一,创造性地提出了“知行合一”学说,这也标志着阳明心学实现了对理学与传统心学的历史超越。因为,虽然王阳明重新定义了格物致知的概念,但“心即理”毕竟是先由陆九渊提出的,阳明心学的第一层心法只是传承基础上的理念创新。“知行合一”的提出不仅迅速成为阳明心学的新标签,更彰显了实践价值。
|
||||||
|
|
||||||
|
王阳明认为,“圣学只一个功夫,知行不可分作两事。”他用《大学》里的“如好好色,如恶恶臭”来具体解释。他说“见好色属知,好好色属行”,“闻恶臭属知,恶恶臭属行。”你看见一个美女,觉得她美,这就是知;随即动了一念喜欢之心,这就是行。你闻到一股臭味,觉得它臭,这就是知;随即动了一念厌恶之心,这就是行。也就是说,人的一切起心动念都是知,也都是行。换言之,知和行同为一个心体的两面。既然知行都不离本心,在阳明心学的语境中,“知”就不仅是程朱理学求知问学之知,更是对本心的体认;“行”也不仅是外在的道德践履,更是在心上做为善去恶的功夫。进而言之,人一旦体认了本心,自然懂得在心上做为善去恶的功夫,所以王阳明说“知之真切笃实处,即是行”。反之,一个人会在心上做为善去恶的功夫,自然可以处处体认本心,所以王阳明说“行之明觉精察处,即是知”。最后,王阳明得出结论,知行只是同一功夫过程的不同方面,“知是行的主意,行是知的功夫。知是行之始,行是知之成。”
|
||||||
|
|
||||||
|
这里需要再纠正一个认识上的误区。现在很多人被“知行合一”的提法吸引,将其想当然地理解为“知识与行动结合、理论指导实践”,这完全是曲解了王阳明提出“知行合一”的本意和目的。人的感知和反应是瞬间完成、高度一致的。感知就是知,反应就是行。感知通过意动完成反应,两者无缝隙、无歧出就是合一。一念发动即知即行,知而不行,只是未知。若发动处有不善,须彻底根除,使善念完全落实到行动上,这才是知行合一的本意。在实践论中,知行合一是修炼诚意的功夫,将其投影于外,即表现为心口合一、表里如一、言行一致。
|
||||||
|
|
||||||
|
如果将“知行合一”错误地理解为用理论指导实践,必然会先致力于增加知识储备,等存量足够大了再去行动,这也恰恰是朱熹“知先行后、格物致知”之法。庄子在2000多年前就批评了这种错误倾向,他说“吾生也有涯,而知也无涯。以有涯随无涯,殆已”。后人为了强调学习和求知的重要性而断章取义,刻意把这句话的后半部分略去不提。庄子认为,想要用有限的生命去追求无限的知识是不明智的,必然会走向失败。庄子一向主张“离形去知”,其本意并不是要否定学习求知,而是要在合乎于“道”上求索,抛弃那些悖道之学。庄子所说的“道”,相当于王阳明说的“心”。因此,“知行合一”的本质要求是克服“一念不善”,在正心诚意上下功夫。
|
||||||
|
|
||||||
|
在王阳明晚年,为了让大家更直接体认本心,也为了让心学更具“简易直截、当下即是”的特点,他干脆撇开“知行合一”,提出了最核心的终极理论:致良知。
|
||||||
|
|
||||||
|
(CG:知行合一,知是知善知恶 - 良知,行是为善去恶 - 格物)
|
||||||
|
|
||||||
|
03.其道大光的无上心法——致良知
|
||||||
|
---
|
||||||
|
致良知,是阳明心学的“塔尖”,也是他一生修学与传道的结晶。既包含了心学的本体论、认识论又包含了方法论和实践论。王阳明说“良知之说,从百死千难中得来,非是容易见得到此。不得已与人一口说尽。只恐学者得之容易,把作一种光景玩弄,不实落用功,负此知耳。”王阳明曾不止一次强调过这个命题的重要性:“致良知是学问大头脑,是圣人教人第一义。”而且强调致良知还是“吾圣门正法眼藏”,更是“千古圣贤相传一点骨血也”。由此可见,致良知不能从字面上简单理解为凭良心做人做事。
|
||||||
|
|
||||||
|
孟子曰:“人之所不虑而知者,其良知也。”良知是具有生命本源性的知觉,人人皆有,而且只能从自身找,不能向外求。孟子认为人天生就有“恻隐之心、羞恶之心、辞让之心、是非之心”,这也可以看作是良知在道德层面的主要内容。“致”就是找寻、实现、扩充的意思。
|
||||||
|
|
||||||
|
王阳明在《传习录》中多次从不同角度定义良知,认为良知不仅是人心所固有、先天所具备的道德意识,还是天理、是道之本源、是百行之规范、是辨善恶之标准、是无尘之明镜。总之,一切善,皆自良知出。唯致良知,能达于至善。
|
||||||
|
|
||||||
|
阳明心学以良知为宗,以良知证道,以良知见众生。事实上,王阳明后来的传道讲学,都是围绕这个内容展开。由于良知既是道之本源,又是内在于人的道德意识,所以当王阳明讲学时,只要一提良知,就自然含摄了“心、理、明德、亲民、至善”等儒学经常讨论的重要概念,覆盖了“格物、致知、诚意、正心、修身、齐家、治国、平天下”等儒学主要内容,用王阳明的话说,这就叫“一语之下,洞见全体”。
|
||||||
|
|
||||||
|
“致良知”的含义也代表了阳明心学的根本精神:一切圣贤学问,归根究底,都在于体认内心本具的良知;一切道德践履,也无非是在心上做为善去恶的功夫,并把这种功夫扩充到生活中的方方面面,进而推至万事万物。致良知既是“正念”的功夫,也是“事上为学”的功夫,处则静养心体,出则救时济世。
|
||||||
|
|
||||||
|
以上可以看作对阳明心学的概述。冯友兰关于学习传统文化有一个经典提法,他强调不仅要遵照原文原意“照着讲”,更要结合时代精神“接着讲”。这也要求我们既要在学习研究上“正本清源”,更要在现实践履中“返本开新”。心学之于当代的意义,就是实现人格完善和精神转化,帮助我们练就一颗强大的内心。
|
||||||
|
|
||||||
|
04.练就一颗动静皆定的心
|
||||||
|
---
|
||||||
|
由于不苟从作为当朝正统思想的理学,王阳明在会试中名落孙山。很多人在榜上未见到自己的名字而唉声叹气、捶胸顿足甚至嚎啕大哭,王阳明却无动于衷。大家以为他是伤心过度,于是过来安慰他。王阳明说:“你们都以落第为耻,我却以落第动心为耻。”王阳明的思想境界早已不在普通人的理解范围。每临大事有静气,不随境转,不为气乱,是王阳明最终能够建立奇功伟业的心决。
|
||||||
|
王阳明认为,只有“主宰常定”,才能做到“酬酢万变,常是从容自在”。而心无主宰,就很容易被自己的情绪、好恶、私欲左右,被外界和他人的言行所影响。保持从容自在的秘诀就是“只动脑,不动心”。不动心要求一个人无论面对怎样的境遇,都要保持内心的淡定与宁静,永远做自己心灵的主人和情绪的主宰。只有心态宁静才能保持最好的状态,来应对一切困难与挑战。
|
||||||
|
|
||||||
|
真正做到心外无物,才能练就不动心。王阳明在平定“宁王之乱”后,为朝廷立下了大功,却没得到相应的赏赐和荣誉,甚至还受到了非议和污蔑。他回顾这件事时说:“自经此大利害、大毁誉过来,一切得丧荣辱,真如飘风之过耳,奚足以动吾一念?今日虽成此事功,亦不过一时良知之应迹,过眼便为浮云,已忘之矣!”在王阳明的内心世界中,他将平叛乱看作是致良知对应的结果,看成是“事上练”的磨砺,将荣辱毁誉皆视为浮云,以出世之心做入世之事。
|
||||||
|
|
||||||
|
浮躁是当今社会的一个标签。我们很容易被他人的看法和言语左右,导致心态失衡、行为失范、结果失望;我们会为付出没有收获而烦恼、会为做好人没有好报而惋惜。在阳明心学的语境中,“善”本身就是为善者的最大回报,无须外求善的衍生物。这一思想也契合了大乘佛法中“无相布施、无住生心”的空性智慧。所以,“不动心”首先要让本心成为自己的主宰,不以物喜不以己悲,一切善行都是修行。
|
||||||
|
|
||||||
|
从另一方面看,不动心并不是要你看破红尘遁入空门,也不是要你逆来顺受忍气吞声。实际上,王阳明言行之犀利近乎于“狂狷”,这里的狂狷并不是贬义词。《论语》有云,“狂者进取,狷者有所不为也”。心学从来都不提倡做没有原则的老好人。佛学教人解脱放下,心学教人担当作为,这也是心学与佛学的重要区别。王阳明一生反复强调“若只好静,遇事便乱,终无长进。”指出“人须在事上磨,方立得住,方能静亦定、动亦定。”心学一个重要的精神价值就是强调“事上磨、事上练”。很多人静时情绪稳定,甚至独与天地精神相往来,一旦遇上事就心神大乱、丢盔卸甲。沉空守寂、徒知养静必然会走向枯禅,即便是当下开悟,也需要在事上实证实修。
|
||||||
|
|
||||||
|
事上练强调将“万物皆备于我”,化一切不利因素为有利因素。人生在世,工作和生活中总要面对很多你不想做又不得不做的事情,与其消极逃避,不如以坦然积极的心态去主动承担,把它当作磨砺的机会,当作对自己心性和能力的完善,不论结果如何,你都实现了一次自我超越。从哲学视角看,把你认为无意义的事接受下来,本身就是一种有意义的行为。
|
||||||
|
|
||||||
|
05.练就一颗至诚至善的心
|
||||||
|
---
|
||||||
|
王阳明以一介文官赴沙场征战,却能攻无不克战无不胜,而且每次打仗都是临时组织招募一支队伍,这是最为人称奇的地方。他把心学的精妙智慧与强大力量有效运用到战场上,率文吏弱卒,一举荡平了江西数十年的巨寇;他用几封书信扰乱敌心,一场火攻,三十五天就平定了宁王之乱;在没有朝廷的同意和支持下,王阳明为百姓计,毅然拖着病体深入崇山峻岭,根除了盘踞广西部族多年的各路匪患。王阳明成功将致良知从修身扩展到平天下,最后官至兵部尚书、督察院左都御史,有力证明了心存天理与功成名就并不矛盾,内圣同样可以外王。但他却说“破山中贼易,破心中贼难”。
|
||||||
|
王阳明认为《中庸》是讲“诚身”,“诚身”之极便是至诚。而《大学》是讲“诚意”,“诚意”之极便是至善。“内不欺己,外不欺人,上不欺天,君子所以慎独。”惟天下之至诚,能立天下之大本。诚意是心学理论中的重要基石。
|
||||||
|
|
||||||
|
从龙场悟道到天泉证道,从“心即理”到“四句教”,阳明心学经历了逐渐完善的过程。“四句教”被视为阳明心学的总结和旨归。即:无善无恶心之体、有善有恶意之动、知善知恶是良知、为善去恶是格物。500年来,对此有过很多不同的解释,我认为基本含义可以理解如下:心的本体原无善恶之分,就好比水本身没有善恶一样。奶牛喝了水可以转化为牛奶,毒蛇喝了水可以转化成毒液,人们普遍认为成奶之水是善的,成毒之水是恶的,这样的善恶都是从个人心中的喜好和厌恶生发出来,这就是有善有恶意之动;良知本身不是善,却是能够分辨善恶的能力和本性;王阳明认为格者,正也。心即理,心无外物,格物就是正心诚意,克已省察,为善去恶。四句教的最终落脚点还是格物,还是诚意的功夫。至诚至善是成就自我、成就他人、成就万物的一体之道,也是我们修心的重要目的。
|
||||||
|
|
||||||
|
一念收敛则万善来同,一念放恣则百邪乘衅。但现实中有很多人,往往意不诚,明知道是善的东西,却出于利害关系而不敢坚持;明知道是恶的东西,也由于习性使然而偏偏去做。这就是自欺,就是知行无法合一的阻碍。因此,要把正心诚意的功夫贯穿到整个修心过程中,反求诸己、反观内视,反身而诚,一旦萌生不良的欲望和念头应立即扫除荡涤,无复纤毫留滞,心体廓然,才能至诚至善。
|
||||||
|
|
||||||
|
06.练就一颗光明仁德的心
|
||||||
|
---
|
||||||
|
仁是儒家“五常”之首。孔子说:仁者,爱人。它表现为人与人之间的互敬、互助和互爱。而阳明心学中的仁,是超越了推己及人的万物一体之仁。在这样的境界中,圣人视万物为一个整体,不分你我与彼此,个体之得就是整体之得,整体之失也是个体之失。
|
||||||
|
|
||||||
|
爱因斯坦曾经的一段论述,与王阳明的“万物一体之仁”有异曲同工之妙。爱因斯坦说“一个人是我们称之为宇宙这一整体的一部分,是一部分有限的时空。他体验他自己、自己的思想和感觉,就像一种东西区别于其它东西一样——这是一种他个人意识的光学错觉。这种错觉对于我们就像是一个监狱,将我们限制在个人的欲望和我们周围一小部分人的影响之中。我们的任务是通过将我们的同情心扩展至所有的生灵和整个美好的自然,以使我们自己从这个监狱中解脱出来。”生活在同一块土地上,我们就拥有一个共同的命运。无论是波士顿二战纪念碑上“马丁・尼莫拉的忏悔”,还是当年佛山“小悦悦”事件都表明,让良知蒙尘绝不是一件明智的事情。每个人都信奉“事不关己高高挂起”,终有一天道德的氧气会日渐稀薄,大家都会缺氧窒息。这看起来是一种自我保护,其实却是一种无形的自我伤害。良知对灵魂的拷问和鞭挞,是更为严厉的刑罚,而执法者就是自己的心。
|
||||||
|
|
||||||
|
有学者说“我们的历史太长、权谋太深、兵法太多、黑箱太大、内幕太厚、口舌太贪、眼光太杂、预计太险,因此,对一切都构思过度”。厚黑学、权谋学、关系学看似是通往成功的捷径,实则是走向邪路的阶梯。阳明心学就是用“大巧若拙”的圣人之法扫除一切构思过度的灰尘,使“良知全体呈现,心灵彻底自由”。
|
||||||
|
|
||||||
|
王阳明临终之时,弟子问他要说点什么,王阳明给世界留下了最后的遗言:“此心光明,亦复何言”。至此,王阳明走完了他艰辛而伟大的一生。现在有一种说法,认为中国历史上有“两个半圣人”,其中孔子和王阳明各占其一,曾国藩算半个。且不论这样的溢美之词是否准确,单就“此心光明”这四个字就足以让人高山仰止。“此心光明”是对心学大道至简的高度概括、是其一生光明磊落的真实写照、也是对往圣先贤大音希声的致敬、更是对后世学子的心传。我一直认为“此心光明,亦复何言”是为人处世的最高境界,即听从内心光明的指引,让心性光明、意动光明、言行光明,通过致良知构建人生的大格局、大境界。
|
||||||
|
|
||||||
|
佛祖拈花,迦叶微笑,心领神会,正法已传。像释迦牟尼、苏格拉底、孔子等成佛成圣之人,通常是不立文字,心口相传,靠习者自己体悟。用禅宗的说法,叫“言语道断,心行处灭”。一方面,文有形而思无界,文字本身的局限性会制约思想的准确表达;另一方面,将抽象化的意识转化成书面记载或多或少会有损耗和失真。《传习录》主要是王阳明的书信和与弟子的对话,阳明心学的思想精髓就像星火一样散落于其中。我们沐浴在其思想光芒的同时,它也在对我们的心灵进行涤荡与洗礼。当此心尘垢落尽、皎洁明亮之时,你会发现自心本具的光芒,其实与圣人之光无二无别。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
出自于《尚书·虞书·大禹谟》:“人心惟危,道心惟微;惟精惟一,允执厥中。”
|
||||||
|
|
||||||
20
markdown/书岂能工聊自娱.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 书岂能工聊自娱
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-05-04 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "shuqinenggongliaoziyu"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 草书狂,楷书拘,书岂能工聊自娱
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
18
markdown/兔年八大头像一枚.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 兔年八大头像一枚
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-01-11 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "tunianbadatouxiangyimei"
|
||||||
|
---
|
||||||
|
|
||||||
|
![[兔年八大头像一枚.png]]
|
||||||
|
|
||||||
60
markdown/关于信仰.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 信仰 vs. 迷信
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-12-12 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 宗教
|
||||||
|
- 哲学
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 思考
|
||||||
|
slug: "guanyuxinyang"
|
||||||
|
---
|
||||||
|
|
||||||
|
作为知识去了解; 作为信仰去相信; 作为应对社会的手段(如PUA术); 同样是不加求证的“信”,迷信这个词总让人想到愚蠢愚昧,信仰则寓意高尚纯粹,有什么区别呢❓
|
||||||
|
- **迷信并没有反省和思考**,只是满足于我想要,就像饿汉满足于充饥。
|
||||||
|
迷信分子是通不过魔鬼的试炼的。
|
||||||
|
更重要迷信可能只是为了逃避"不一样"造成的窘境--异类是痛苦和孤独的。
|
||||||
|
异类祖先已在茹毛饮血时几乎被消灭殆尽,我们的基因里内置了对成为异类的恐惧。
|
||||||
|
- 信仰的建立者是异类中的极端分子,信念的力量足以对抗心灵的毒打。
|
||||||
|
内心必须通过反复修炼(催眠),完全的隔离杂质,到达圣人的境界。
|
||||||
|
普通信众也许高尚,也许只是让神帮助消除精神或肉体的饥饿感,后者是绝大多数。
|
||||||
|
同样通不过魔鬼的试练。
|
||||||
|
|
||||||
|
关于这一点,没有比陀思妥耶夫斯基《卡拉马佐夫兄弟》“宗教大法官”所写的更加生动又深刻的了。
|
||||||
|
陀对人们信仰的纯粹性是悲观,凯撒必须统治世界,耶稣必须被烧死。
|
||||||
|
|
||||||
|
== 所以,不管披着怎样的外衣,对大部分人来说,两者没有太大区别。
|
||||||
|
|
||||||
|
> 耶稣受试探 (马太福音 4:1-11) (自由、神迹、凯撒)
|
||||||
|
|
||||||
|
<p style="font-family: 'Microsoft YaHei', sans-serif; background-color: #B87333;color:white; padding: 20px; border-radius: 20px; line-height: 35px; ">
|
||||||
|
4:1 当时,耶稣被圣灵带领到旷野,受魔鬼的试探。 <br>
|
||||||
|
2 他禁食了四十昼夜后,就饿了。 <br>
|
||||||
|
3 那试探者进前来对他说:「你若是神的儿子,吩咐这些石头变成食物。」 <br>
|
||||||
|
4 耶稣却回答说:「经上记着说:『人活着不是单靠食物,乃是靠神口里所出的一切话。』」 <br>
|
||||||
|
<br>
|
||||||
|
5 魔鬼就带他进了圣城,叫他站在殿顶上, <br>
|
||||||
|
6 对他说:「你若是神的儿子,就跳下去。因为经上记着说:『主要为你吩咐他的使者,用手托着你,免得你的脚碰在石头上。』」 <br>
|
||||||
|
7 耶稣对他说:「经上又记着说:『不可试探主你的神。』」 <br>
|
||||||
|
<br>
|
||||||
|
8 魔鬼又带他上了一座很高的山,将世上的万国与万国的荣华都指给他看, <br>
|
||||||
|
9 对他说:「你若俯伏拜我,我就把这一切赐给你。」 <br>
|
||||||
|
10 耶稣就说:「走吧,撒旦!因为经上记着说:『当拜主你的神,单要事奉他。』」 <br>
|
||||||
|
<br>
|
||||||
|
11 于是魔鬼离开耶稣,有天使来伺候他。 <br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
年轻对世界充满好奇,用知识和经验不断填充,即成长,或者也可叫迷信。人类天生就是迷信,婴儿来者不拒。
|
||||||
|
知识匮乏,就容易迷信,迷之自信或迷之相信。因为知识图谱空白,写什么是什么,这是很好的学习模式,没有抵抗,没有消耗。
|
||||||
|
大概是,stay foolish,stay hungry的状态吧。老子叫:专气致柔能如婴儿乎。
|
||||||
|
|
||||||
|
年老能力变弱,好奇心减小;越了解局限性,越增长敬畏心;了解的越多,发现不懂的越多;信仰自然在生长。
|
||||||
|
|
||||||
31
markdown/养老.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "年轻的玩串 中年的养老"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-06-21 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 生活
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 生活 ]
|
||||||
|
slug: "yanglao"
|
||||||
|
---
|
||||||
|
|
||||||
|
年轻人践行养生,中年人筹备养老。年龄不同,行动不同,动机一致。悲观的看,大家对未来并不看好,不再敢放手向前冲。乐观的看,都是对美好还有所期望,也是提前锁定不确定未来的确定性。于是,在楼市最不被看好,在国家最需要的时候,我和老杨买了个养老的叠墅,毅然负上了巨债。
|
||||||
|
|
||||||
|
下午跟同事谈到养老院,同事说现在养老院很难进,他身边有些老人,进了养老院,老人们在一起生活变得丰富充实。同事说偶尔回老家,跟父亲聊天,观念上差距大,很难聊到一起,因为衰老,老人也变得幼稚,越来越有小孩脾气,常常相互生气,对比之下越发觉得养老院是好地方。我观念里,对养老院并无好感,估计我父母有同样的观感,父亲83,你说要把他送到养老院去,他一定坚决反对。
|
||||||
|
|
||||||
|
养老院怎会是好地方?进养老院,在我看来,首先意味着人逐步失去了照顾自己的能力,其次意味着家庭纽带的断裂,甚至被家庭抛弃,被社会视为"无用之人"。虽说都有成为无用之人化作尘土的一天,但承认自己软弱无能并不容易。设想未来都不结婚,都不生孩,养老院成为老人的唯一归属,这一天,养老院的形式会改变,人们的观念也会随之改变,人们也许会视养老院为最好的地方。
|
||||||
|
|
||||||
|
同事问我,老人院最欢迎哪一种人?我说不上来。他说“躺着进去”的,因为这类人可以给老人院大量的利润回报,躺着的老人简直是一头现金奶牛。当时我觉很有道理,竖着进去的不好伺候,回报不高。后来想想,有觉得这个事情挺可怕,养老院为了追求回报,会不会把竖着的人变成躺着的人?我猜想这在技术上并不复杂。
|
||||||
|
|
||||||
|
目前养老这个事情,靠机构还是难以获得优质服务,毕竟这个事情并不好标准化。前两天看媒体报道蔡澜的养老,83岁蔡澜租了一间无敌海景酒店套房,请了8人照顾他,覆盖管家、助理、医生、司机,情感陪伴到生活起居一样不缺,月开销50万。完全的个人定制,大概算是养老的天花板了吧。
|
||||||
|
|
||||||
|
蔡澜会享受人生,年轻就找美女、做美食。记得他说,香港社会和食物的关系,在于压抑,“我做得那么辛苦,吃顿好的可不可以?”。说的很好啊,会做也会花,做的时候辛苦的做,玩的时候开心的玩,都是专注当下,回到事情本身,很好的心态。
|
||||||
|
|
||||||
|
当下年轻人养生玩串,中年人养老躺平,畏惧未来,似乎心态已坏。
|
||||||
|
|
||||||
29
markdown/写金文.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 金文临摹
|
||||||
|
subtitle: 学金文大概就能领略什么是锥画沙了
|
||||||
|
description:
|
||||||
|
date: 2021-01-20 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 金文
|
||||||
|
- 书法
|
||||||
|
- 临摹
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "xiejinwen"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 心气和畅方能得心应手
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<video width="100%" height="100%" autoplay loop controls> <source src="/img/shufa/jinwenlingmo.mp4" type="video/mp4"> </video>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
34
markdown/刀锋.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 刀锋
|
||||||
|
subtitle: "[英]毛姆/周煦良"
|
||||||
|
description: The sharp edge of a razor is difficult to pass over; thus the wise say the path to Salvation is hard.
|
||||||
|
date: 2020-08-26 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 笔记
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书 ]
|
||||||
|
slug: "daofeng"
|
||||||
|
---
|
||||||
|
看电子书,不懂书名“刀锋”来由。Google方知。
|
||||||
|
> 扉页写着:The sharp edge of a razor is difficult to pass over; thus the wise say the path to Salvation is hard."
|
||||||
|
> —- Katha-Upanishad
|
||||||
|
|
||||||
|
> 中译意为:“剃刀锋利,越之不易;智者有云,得渡人稀”
|
||||||
|
> -- 印度《奥义书》
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
主角Larry有几年在印度流浪,他这人生也恰似践行扉页的段话,只是我们这些凡夫俗子难理解,会觉得这样的人不是疯就是傻。没有疯子的勇气自然不会想翻越剃刀,更无从说“我若向刀山,刀山自摧折”疯魔成活的境界。
|
||||||
|
|
||||||
|
毛姆写的人物总能很立体,<月亮与六便士>里的思特里克兰德,这里的Larry,都如此。毛姆喜欢制造反差和矛盾,喜欢把主角逼到墙角,再激发出能量和勇气。毛姆书里常能让人反思,反思是哲学的基本特点。这本书主角原型据说是哲学家维特根斯坦,气质倒是相似。不同是维特根斯坦出身豪门,主角Larry是个出身名门“富二代”,相比维特根斯坦不及。我猜作者有意为之吧,试想Larry如是没有希望的底层贫民,躺平毫不奇怪。如是豪门之家,视金钱如粪土,又显得理所当然。书中的Larry居于两者间,选择放弃世俗成功,追寻得救之道,更反人性,于是更显高尚。
|
||||||
|
|
||||||
|
Larry像披着人皮的耶稣,人格上过于完美,书中偶然的一两次性生活也像是渡人。Larry过于不食人间烟火,这可能跟毛姆那个时代,对东方神秘主义的痴迷的风潮有关。
|
||||||
|
|
||||||
|
书中主角之外的人物倒更有生活气息。
|
||||||
|
|
||||||
58
markdown/别说你懂日本.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 日本人的礼和型
|
||||||
|
subtitle:
|
||||||
|
description: 去日本旅行过几次,但也只是观光客,并没有正真领略风土人情。 对日本的了解,大概最多可能从以前的某个亲戚这里间接听说。 这两天翻了这本《别说你懂日本》,有些见解算得上有意思。
|
||||||
|
date: 2023-12-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: "/img/yixiu.jpg"
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 日本
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
slug: "bieshuonidongriben"
|
||||||
|
---
|
||||||
|
|
||||||
|
去日本旅行过几次,但也只是观光客,并没有正真领略风土人情。
|
||||||
|
对日本的了解,大概最多可能从以前的某个亲戚这里间接听说。
|
||||||
|
这两天翻了这本《别说你懂日本》,有些见解算得上有意思。
|
||||||
|
|
||||||
|
关于日本司马光在《资治通鉴》中写道:
|
||||||
|
> “知小礼而无大义,畏威而不怀德,强必寇盗,弱而卑伏,不顾恩义。”
|
||||||
|
|
||||||
|
我们会觉得日本是一个"不顾恩义",充满冷漠和压抑的国家。
|
||||||
|
日本社会里的一个人际交往准则,是不要让人“迷惑”,也就是**不给他人添麻烦**。
|
||||||
|
一直不是很懂,与中日韩同源,何以日本与中国差别如此之大,更别说韩国这样喧嚣外向的性格了。
|
||||||
|
这本书给了一个解释。
|
||||||
|
> 中国人强调私德,只要心是好的,外在言行可以不拘甚至放诞,微瑕不足以掩瑜。于是,许多人明明缺乏公德观念,却毫不怀疑自己内心良善,“心”成了简捷的托词。日本人强调公德,在外在的言行举止上礼节繁多,哪怕流于虚伪做作,至于内心是否真诚并不注重,“礼”成了便利的装饰。在日本社会中生活久的中国人,常常对日本人的“礼”讥为“虚伪”,倒不仅是怨言而已。
|
||||||
|
|
||||||
|
中国人对公家的东西是可以肆意攫取的,在传统一代人中,能拿公家的是本事。费孝通在乡土中国中实际上说到了本质,儒家这种差序文化,不光决定了君臣父子男女之别,也决定了你我之别。公家是在差序的外层,当然能捞一点是一点。
|
||||||
|
|
||||||
|
日本人对外层的东西特别关注,非常在意规范礼仪。
|
||||||
|
这种外在礼仪在我们看来流于表面、程式化、虚伪,造成日本人的普遍压抑。
|
||||||
|
但另一方面,与日本人对人际关系中对“羁绊”理解有关,羁绊意味着一种责任,日本人如何解决?
|
||||||
|
用礼仪恰恰在很大程度上化解了人与人之间过渡的“羁绊”。
|
||||||
|
如此,日本人的过分的友好,就不必太当真,这是化解彼此潜在的“羁绊”。你看中国人交往,要彼此看得起,累。
|
||||||
|
当然,任何问题有两面性,与家人的“羁绊”是我们深入彼此,建立纽带完善人格的需要。
|
||||||
|
|
||||||
|
日本人喜欢跟风,什么潮流都一窝蜂,这似乎跟日本人高教育水平相背。
|
||||||
|
关于日本人的群体性,加缪曾说过,马克思主义认为个人有罪而历史无罪。这是个人和历史的对应。
|
||||||
|
谈到日本人,我们或许可以把个人与群体联系起来,就会发现一个看似古怪的结论:群体有罪则个人无罪。
|
||||||
|
日本人期待加入群体的一个原因,是在集体的名义笼罩之下,个人行为的动机与后果受到了洗净与庇护。
|
||||||
|
这倒是不错的解释了日本人喜欢跟风缘由。
|
||||||
|
|
||||||
|
日本人型文化,有板有眼,啥事都要弄出个道。
|
||||||
|
比如茶道,受到禅宗影响,僧侣村田珠光将饮茶与宗教文化融合,提出“和、静、清、寂”的原则,茶道或以此为肇始,到千利休而发展完备。
|
||||||
|
|
||||||
|
知道了两个之前不懂的知识点:
|
||||||
|
- 绝对领域,女孩大腿以下,在0度的东京也领略的绝对领域之靓丽。
|
||||||
|
- 日本法律对性骚扰(痴汉)规定,若猥亵罪成,要被判处半年到七年的刑期及罚款。
|
||||||
|
|
||||||
|

|
||||||
|
但据说日本痴汉并不因此减少,有压抑的,也有玩票的,很多玩法也搬到影视中。
|
||||||
|
|
||||||
34
markdown/喝茶.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 一则关于茶叶的笑话
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-11-13 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: "/img/chaye.jpg"
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 社会
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 生活
|
||||||
|
- 历史
|
||||||
|
slug: "hecha"
|
||||||
|
---
|
||||||
|
|
||||||
|
之前看到一则笑话,说晚清鼓吹:
|
||||||
|
> **限制出口大黄茶叶,让老外便秘而亡。**
|
||||||
|
|
||||||
|
不料这并非笑话,而是名臣主流意识形态,且看:
|
||||||
|
> 夷人赖以为命,不可一日欠缺之物,乃茶叶、大黄。而此二物,皆我中原特产。——曾望颜
|
||||||
|
|
||||||
|
> 外夷土地坚刚,风日燥热。且夷人每日以牛羊肉作为口粮,不易消化,若无大黄,则大便不畅,夷人将活活憋死。故每餐饭后,需以大黄茶叶为通肠神药。——琦善
|
||||||
|
|
||||||
|
> 茶叶大黄,外国所不可一日无也,中国若靳其利而不恤其害,则夷人何以为生?——林则徐
|
||||||
|
|
||||||
|
> 茶叶大黄两种,尤为该国日用必需,非此即彼生疾病,一经断绝,不但该国每年缺少余息,日渐穷乏,并可制其死命。——百龄
|
||||||
|
|
||||||
|
> 西洋人民所必需者,内地之茶叶、大黄。——包世臣
|
||||||
|
|
||||||
|
> 外夷于中国内地茶叶、大黄,数月不食,有瞽目塞肠之患,甚至不能聊生。——周顼
|
||||||
|
|
||||||
22
markdown/她身之欲.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 她身之欲
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2019-05-07 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 思考
|
||||||
|
- 读书
|
||||||
|
slug: "tashenzhiyu"
|
||||||
|
---
|
||||||
|

|
||||||
|
|
||||||
|
> 当面对生活中琐碎的一大堆麻烦时,仿佛在泥潭中跋涉,要明白,不是我们走得不好,只是路太烂。
|
||||||
|
|
||||||
27
markdown/孪生兄弟.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "孪生兄弟"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-11-25 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 故事
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
- 生活
|
||||||
|
slug: "luanshengxiongdi"
|
||||||
|
---
|
||||||
|
|
||||||
|
电影《杰出公民》里有一段,丹尼尔搭胖子的车去萨拉斯的途中,车子抛锚,晚上两人围着火堆,无事可干。胖子让丹尼尔给他讲个故事。
|
||||||
|
|
||||||
|
丹尼尔讲这样一个故事:小镇有一对长得一摸一样的双胞胎兄弟,一个是铸铁厂工人,一个是富豪,为了人们能够区分,工人蓄起胡子。小镇上开了一家酒吧,两人会在晚上光顾喝点小酒。某天酒吧来了一位乌拉圭红发侍酒美女,说是陪酒,给足钱,也可以陪睡。过了一年,两兄弟都爱上了妓女,后来妓女嫁给富豪。工人经受一段时间的煎熬,杀了富豪兄弟,尸体扔进炼炉。他刮掉胡子,替代了富豪。两个月后,富豪在毫不知情的情况下被黑帮所杀,尸体扔进炼炉。最后,红发妓女继承了富豪的所有财产。
|
||||||
|
|
||||||
|
丹尼尔娓娓道来,胖子沉浸,最后丹尼尔用手指朝着胖子的脑门,“嘭”,胖子吓了一跳。
|
||||||
|
|
||||||
|
讲好一个故事不容易,当我试着复述这样一个简单的故事时,总不能营造出这种氛围节奏。有什么诀窍❓在B站看罗永浩讲如何讲好一个故事,说好故事三个基本要素:冲突、行动、结果,其次还要有细节、悬念、画面感、情感,要提炼和升华。丹尼尔的故事中,有冲突,行动,结果,细节,画面感,情感,没有提炼升华,但已经足够吸引人了。
|
||||||
|
|
||||||
67
markdown/审美的发生.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 审美如何发生
|
||||||
|
subtitle:
|
||||||
|
description: 所谓生物审美是从生物学/演化论角度来讲的。人类演化过程中,最重要的是生存和繁殖,生存是繁衍的前提,也是为繁衍服务的(为了保存繁衍成果,有些生物甚至可以在交配结束后,杀死自己或同伴)。演化论视角看,凡是有利于繁衍的,就是好的对的,不利于繁衍的,就是错的坏的。错的坏的,就不能通过繁衍这个筛子。比如突变出ABC三种鸟类,A厌恶同类,B厌恶虫子,C厌恶蛇喜欢虫子,最后A孤老,B饿死,C生了一堆小鸟,C喜欢虫子厌恶蛇的基因🧬被保留,久而久之喜欢虫子成了鸟类的属性。
|
||||||
|
date: 2025-05-21 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考,生活,小艺 ]
|
||||||
|
slug: "shenmeidefasheng"
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1
|
||||||
|
一直好奇审美的起源。以前看到一个帖子里把审美总结为两类,一是**生物审美**,一类是**人文审美**。很有道理。
|
||||||
|
|
||||||
|
所谓生物审美是从生物学/演化论角度来讲的。人类演化过程中,最重要的是生存和繁殖,生存是繁衍的前提,也是为繁衍服务的(为了保存繁衍成果,有些生物甚至可以在交配结束后,杀死自己或同伴)。演化论视角看,凡是有利于繁衍的,就是好的对的,不利于繁衍的,就是错的坏的。错的坏的,就不能通过繁衍这个筛子。比如突变出ABC三种鸟类,A厌恶同类,B厌恶虫子,C厌恶蛇喜欢虫子,最后A孤老,B饿死,C生了一堆小鸟,C喜欢虫子厌恶蛇的基因🧬被保留,久而久之喜欢虫子成了鸟类的属性。
|
||||||
|
|
||||||
|
人文审美,也许称为**文化审美**更加合适。指经过后天文化熏陶产生的审美取向。拿美食来举例,不同地域美食偏好不同,海边的人偏好海鲜,川渝偏好麻辣,是因为当地民俗和环境影响的结果。我们说“妈妈的味道”,小时候妈妈做的饭菜,形成了对美食的偏好。妈妈不同,偏好不同,和食物本身没有关系。
|
||||||
|
|
||||||
|
文化审美是被养成的。一个文盲农妇去逛博物馆,只会觉得无聊,不会产生愉悦,你不能怪这个农妇不懂审美,因为实际上她压根没觉得这是美的。年轻的喜欢金属摇滚迷,在SOLO响起时会激动,你让中国父辈的人听金属摇滚,只会觉得呱噪低俗,而革命歌曲会戳到他们的高潮。让老农欣赏维纳斯,他只会骂你流氓。
|
||||||
|
|
||||||
|
没有被教育(洗脑),没有养成,就不会共鸣,就没有美的体验。
|
||||||
|
|
||||||
|
## 2
|
||||||
|
生物审美和文化审美经常产生根本冲突,文化审美常常是对生物审美的约束,比如宗教要人克制欲望,美食、美景、美色都是不同宗教所反对,佛教为了抵御生物审美,提出“革囊众秽”,看到美色要透过皮囊观象,这不过是一堆污秽的下水,还有一门修炼叫“白骨观”,这可不是旁门左道,这是佛教正道的修炼方式哦。
|
||||||
|
|
||||||
|
那么生物审美和文化审美冲突时,哪一方会胜出呢?大概率生物审美最终还是会高于文化审美。比如,时尚界为了更好的衣架效果,推崇扁平模特终敌不过丰乳肥臀。清朝对弱化女子的病态审美终会回归正常。
|
||||||
|
|
||||||
|
## 3
|
||||||
|
审美被环境、家庭塑造,被成长经历,教育历程等等塑造。美不美到底谁说了算?弹钢琴 vs 玩泥巴,“落霞与孤鹜齐飞,秋水共长天一色” vs “风景真美”,蒙娜丽莎 vs 张三的涂鸦。哪个更美?我们也许有普遍的答案,但认为前者更美凭什么呢?
|
||||||
|
|
||||||
|
休谟在《人性论》中的洞见:"不是因为某个东西美,所以欣赏那个东西才会使得审美者感到开心。而是因为某个东西使得审美者感到开心,所以审美者才觉得那个东西美。"。美不美的关键不是那个东西,而在于看东西的人,换句话说客体不重要,审美主体才是关键。
|
||||||
|
|
||||||
|
这种说法,姑且称之为**功利主义审美**。按休谟的说法,不存在统一审美标准,审美是主观的,审美偏向由审美主体决定。那么,我们接着会问,审美主体偏爱什么?及何以偏爱这个?从功利主义的观点来看,什么对自己有利就偏爱什么。比如卖钢琴的会宣扬钢琴的优雅,文化人喜欢推广文化的古典美,奢侈品从业者会宣传品牌格调。特定文化被赋予了特定审美价值,说唱文化、摇滚文化、钢琴文化、唐诗文化、书法文化……,都有特定的审美趣味。
|
||||||
|
|
||||||
|
这很像病毒,被感染的人的审美偏好会发生变化,觉得自己的审美偏好更高级,比如王羲之的字比xxx的字要好。
|
||||||
|
|
||||||
|
这种病毒被有钱有权的人引导,以理想、健康、高尚的面目出现。他们的审美偏向影响更多的人,因为他们掌握更多的资源,而被影响的一大票掉入审美怪圈的人,愉快的给有钱有权的人输送更多的资源,并帮着去影响其他人。比如一个有钱人,手中有一堆xxx的字画,他可以利用影响力,让博物馆收藏,进入拍卖行,让人喜欢上这些字画,这些字画就具有了更高的审美价值,xxx字画的价值自然就不再普通。奢侈品品牌花费大笔钱请大牌模特或体育明星拍唯美广告,目的就是尽量广泛的传播审美病毒,让广告受众觉得背上一个特定包包可以让自己变得像明星模特那么高雅耀眼。更具强化作用的是,一旦群体感染了审美病毒,别人也觉得你变得高雅耀眼了,你还真的感受到高雅耀眼,变得更迷人。
|
||||||
|
|
||||||
|
权力金钱是制造审美偏好的发动机,人们自然对权力金钱本身产生了审美偏好,有了它们就可以制造审美病毒,让感染者慷慨解囊,加速权力金钱滚动。网上调侃,有些女生看到PT(某政治人物)能够原地排卵,说明面对权力的极大的愉悦感,说“权力是春药”大概表达的一个意思,这是不有自主的。喜欢美女是生物学上的,因为年轻貌美往往是比较健康的,有利于繁殖,喜欢权力金钱,更多的是功利主义审美。
|
||||||
|
|
||||||
|
女生觉得LV\爱马仕包好看,很大程度上是因为审美病毒的影响。某个群体一旦被某类审美病毒所感染,比如LV病毒,这种审美取向成为这个群体的集体认同,而不能匹配这个群体认同的人会被视为异类而受歧视,比如背了一个廉价包包的女生会觉得心理上的矮化,实际上不仅仅是她的主观心理,她可能会实实在在的感受到歧视。我们常常听到某个圈子或某个场合“安全穿着”,什么是“安全穿着”?就是符合这个群体审美标准的穿着。至于什么是这个群体审美标准,那得去研究这个群体感染了那一类审美病毒。
|
||||||
|
|
||||||
|
## 4
|
||||||
|
**功利主义审美**除了讨论金钱权力,可以推而广之的看。我断言,进到博物馆,看到的远古人类的物件(或许可以讲所有物件),没有纯粹的审美目的的物件,也没有不是因实用性而产生的物件。在历史的大部分时间里实用性产生的审美是占最主要的,也就是说我们当代人所谓的“美”的东西,在古人那里只是为了解决一个实际的问题。
|
||||||
|
|
||||||
|
有人会反对,并举例说陶器上面的花纹或者玉器上的精美雕饰,是古人出于纯粹的审美需要或部分的审美觉醒所创作的艺术。我不这么认为,我认为这跟审美无关。拿陶器来说,远古时代,制作陶器并不简单,而冒着更容易破裂的风险,在上面雕饰花纹,是出于某种实用的目的,否则一定会斥责为不务正业。你可以想想一种场景,就是飞机制造厂的员工,出于审美的需要,在飞机上自由作画。现代学者考据的结论是用于祈福或者祭祀,也证实了这个说法,比如鱼纹象征丰收,鸟纹以及饕餮是图腾。在他们眼中,这些纹饰跟粮食丰收高度关联,是事关生存的最实用的事情。我们以为先人只是吃饱了撑,作为艺术启蒙,在那里随便涂鸦,就过于轻描淡写了。又比如博物馆里最常见的西周青铜器,工艺繁复,精美绝伦,有人说它并不实用。错了,它首先是实用,而后脱离实用变成祭品,成为新的更高的实用,青铜大鼎是西周垄断性的、震慑四方的必需品,是国之大器,他的作用可以跟现代的顶尖武器媲美。那些精美玉器更如此,如良渚制作工艺繁复的玉器,在前机械时代制作费时费力程度是难以想象的,唯一的目的只能是祭祀。祭祀当然应该归为社会学的实用性的范畴里边去了,目的是更好的把人组织起来,形成有效合力去对抗风险。
|
||||||
|
|
||||||
|
那有人说我们常见的远古人类脸上涂花纹、耳朵嵌石头或者挂骨串呢?我同样认为并非审美需要,这么做要么用于区分族群,要么认为可以带来好运,与现代人理解的好看无关。而这一切的内在动机就是生存和繁衍,根本是繁衍,生存也是繁衍的需要。远古时期,所有我们叹为观止不可方物的器物,在当时就是实用目的,在严酷环境下,首先需要生存,有上顿没下顿的日子,在极端饥饿恐惧下的人,不可能花大量时间,搞风花雪月的艺术。
|
||||||
|
|
||||||
|
## 5
|
||||||
|
现代意义上的审美是吃饱了撑以后的事情。美从实用分化出来的,开始服务于内心。
|
||||||
|
|
||||||
|
PS. 生物性审美,如纯粹用实用性或喜好来定义,那么动物也有审美,动物有生物进化意义上产生的喜好,它厌恶某些东西,喜好某些东西,使它能够通过本能生存下来。但是显然,我们一般不会说一只狗有审美能力。我们所说的审美是更高一级的,建立在文化之上或因文化而产生的,而不纯粹是基因基因表达的喜好或生物学意义上偏好。
|
||||||
|
|
||||||
|
## 6
|
||||||
|
仔细审视甲骨文上的文字,现代人惊叹说好美。对于古人,这只是一个占卜工具和与神交流的工具。至于甲骨之上的文字,它为什么暗合了我们现代人的审美特点,密码在于,均衡稳定是内生在人类基因里的,稳定意味着死亡率的降低,所以,我们对对称、均衡的东西有天生的好感。也是这个原因,文字的发展总趋向于越来越精密和平衡,以至于没有了变化,这符合人类的审美追求,但不符合现代人对“审美”的定义,它少了“神秘感”,过于精确,失去了神秘感,又失去了另一层次的美,缺少了“意料之外的惊喜”。
|
||||||
|
|
||||||
|
美有层次,比如,基本的平衡稳定,这是内置在基因里的,是寻找确定性、代际繁衍的需要;美又需要神秘感,神秘感,不可复制性,稀缺性,从而产生“意料之外的惊喜”。稳定性和神秘性往往处于天平两端,过于神秘莫测,没法传承,降低了繁衍性;过于稳定,增加了可复制性,一切尽在意料中,少了稀缺性和神秘感。人类在发展过程中,一代一代的注入心力,让某样东西变得繁复又稳定精致,降低制造的成本,或者让更多人可以拥有,这个过程中又不可避免庸俗化,让生活失去惊喜。
|
||||||
|
|
||||||
|
## 7
|
||||||
|
可能可以这样说:审美是个体内在感知\心理\文化在外部世界的投射。
|
||||||
|
|
||||||
24
markdown/小楷日课-心经.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "小楷日课-心经"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-06-06 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "xiaokairike-xinjing"
|
||||||
|
---
|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
![[小楷日课-心经-4.png]]
|
||||||
|
|
||||||
|
![[小楷日课-心经-2.png]]
|
||||||
|
|
||||||
|
![[小楷日课-心经-3.png]]
|
||||||
32
markdown/小窗幽记.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 小窗幽记
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2020-05-08 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书 ]
|
||||||
|
slug: "xiaochuangyouji"
|
||||||
|
---
|
||||||
|

|
||||||
|
明代陈继儒格言体小品集,刊行于天启四年(1624年)。全书分醒、情、峭、灵、素、景、韵、奇、绮、豪、法、倩十二卷,内容涉修身、养性、立言、立德、为学、致仕、立业、治家等方面。古之金句,哪里开始看都可以,不必正儿八经读,宜睡前瞄两眼,或蹲坑扫读。文言警句学生写高分作文有些帮助,不过这种短小的大道理,看着都好有道理,属于好鸡汤,小孩读容易迂腐,过早油腻。摘录几则句子:
|
||||||
|
- **君子对青天而惧,闻雷霆而不惊;履平地而恐,涉风波而不疑。**
|
||||||
|
- 坦易其心胸,率真其笑语,疏野其礼数,简少其交游
|
||||||
|
- 酒能乱性,佛家戒之;酒能养气,仙家饮之。余于**无酒时学佛,有酒时学仙**。
|
||||||
|
- 人人爱睡,知其味者甚鲜;睡则双眼一合,百事俱忘,肢体皆适,尘劳尽消,即黄梁南柯,特余事已耳。静修诗云:“**书外论交睡最贤**。”旨哉言也。
|
||||||
|
- **胸中涤去数斗尘**
|
||||||
|
- 人生不得行胸怀,虽寿百岁,犹夭也。
|
||||||
|
- 俗气入骨,即吞刀刮肠,饮灰洗胃,觉俗态之益呈
|
||||||
|
- 负心满天地,辜他一片热肠;变态自古今,**悬此两只冷眼**。
|
||||||
|
- 点破无稽不根之论,只须冷语半言;看透阴阳颠倒之行,**惟此冷眼一只**。 **注:是不是有八大山人那只乌鸦的既视感**
|
||||||
|
- 武士无刀兵气,书生无寒酸气,女郎无脂粉气,山人无烟霞气,僧家无香火气,换出一番世界,便为世上不可少之人。
|
||||||
|
- 蒲团布衲,难于**少时存老去之禅心**;玉剑角弓,贵于**老时任少年之侠气**。
|
||||||
|
- 读书倦时须看剑,英发之气不磨;作文苦际可歌诗,郁结之怀随畅。
|
||||||
|
- **上马横槊,下马作赋**,自是英雄本色;熟读《离骚》,痛饮浊酒,果然名士风流。
|
||||||
|
- 尘情一破,便同鸡犬为仙,世法相拘,何异鹤鹅作阵。 - 202005xx
|
||||||
|
|
||||||
89
markdown/峨眉山.md
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 游峨眉
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2025-05-29 11:00:00
|
||||||
|
author: 大童
|
||||||
|
image:
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 旅行
|
||||||
|
URL:
|
||||||
|
categories:
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
slug: emeishan
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
## 流水账
|
||||||
|
|
||||||
|
### 31日
|
||||||
|
到乐山,取好车1点多,找了一家鱼火锅。点了点小酥肉之类。鱼肉味道佳。
|
||||||
|
下午坐邮轮游乐山,官网票已售罄,老杨闲鱼下单👍 🏻。
|
||||||
|
阴天,气温舒服,人多。
|
||||||
|
|
||||||
|
![[峨眉山-7.jpg]]
|
||||||
|
![[峨眉山-8.jpg]]
|
||||||
|
|
||||||
|
晚上乐山市酒店附近找了一家馆子,饭客不多,点了跷脚牛肉等几个菜,超级好吃,记得住的好味道。两个人吃的很满足。吃多了,晚上肚子不舒服,加上有点感冒。因为美食,都忍了吧。
|
||||||
|
![[峨眉山-9.jpg]]
|
||||||
|
|
||||||
|
### 1日
|
||||||
|
|
||||||
|
峨眉山一日游,全程大雨,上山的还有很多老人小孩,缆车排队20分钟以上,同样虔诚的一群人。金顶是愿力浑厚的一个地方。没有薄香,只有120一盒的大香。
|
||||||
|
![[峨眉山-13.jpg]]
|
||||||
|
|
||||||
|
一路开车上去,山腰的风光最好,小溪乱石,植被茂密,可惜路边也没有停车地方。
|
||||||
|
|
||||||
|
峨眉山下吃了豆花,欣赏不来。
|
||||||
|
|
||||||
|
![[峨眉山-10.jpg]]
|
||||||
|
|
||||||
|
![[峨眉山-11.jpg]]
|
||||||
|
|
||||||
|
### 2日
|
||||||
|
7点多,乐山的天还黑着。9点多到机场还了车,贵宾厅吃了两碗担担面。
|
||||||
|
|
||||||
|
3点到家,喉咙痛,吃了消炎药。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 出行前安排
|
||||||
|
### 行程
|
||||||
|
![[峨眉山.png]]
|
||||||
|
|
||||||
|
| 方向 | 机场 | 时间 |
|
||||||
|
| ----- | --- | ------------------ |
|
||||||
|
| 杭州-成都 | 双流 | 5-31,周六,9:00~12:00 |
|
||||||
|
| 成都-杭州 | 双流 | 6-2,周一,10:55~13:50 |
|
||||||
|
|
||||||
|
| | 日期 | 安排 |
|
||||||
|
| ---- | ---- | ------------------- |
|
||||||
|
| day1 | 5-31 | 12:30机场取车,去乐山,2小时车程 |
|
||||||
|
| day2 | 6-1 | 峨眉山 |
|
||||||
|
| day3 | 6-2 | 回杭州 |
|
||||||
|
|
||||||
|
### 酒店
|
||||||
|
![[峨眉山-2.png]]
|
||||||
|
|
||||||
|
### 机票
|
||||||
|
![[峨眉山-1.png]]
|
||||||
|
|
||||||
|
### 租车
|
||||||
|
![[峨眉山-1.jpg]]
|
||||||
|
|
||||||
|
### 参考路线
|
||||||
|
|
||||||
|
![[峨眉山-4.jpg]]
|
||||||
|
![[峨眉山-2.jpg]]
|
||||||
|
![[峨眉山-3.jpg]]
|
||||||
|
|
||||||
|
### 美食
|
||||||
|
![[峨眉山.jpeg]]
|
||||||
|
![[峨眉山-5.jpg]]
|
||||||
|
![[峨眉山-6.jpg]]
|
||||||
|
|
||||||
|
|
||||||
27
markdown/川普的社会学探讨.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "川普的社会学探讨"
|
||||||
|
subtitle: ""
|
||||||
|
description: ""
|
||||||
|
date: 2025-01-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 思考
|
||||||
|
- 生活
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考 ]
|
||||||
|
slug: "chuanpudeshehuixuetantao"
|
||||||
|
---
|
||||||
|
|
||||||
|
小黄学社会学,放假回来,昨晚跟老杨\小黄聊天。小黄提了一个问题,为什么中国人普遍比较倾向于喜欢川普?他私下问了他们的社会学教授,回答是川普比较亲共,这让我很诧异。虽说在我们看来,资本主义阵营下的共和党或民主党都是右派,但他们毕竟还是有左右之分。民主党相对的开放性不是一直契合我们的主张?共和党逆全球化的保守主义做法一直是为我们所不耻?
|
||||||
|
|
||||||
|
于是我提了不同意见。认为相比拜登和哈里斯,川普成功营造了一种charisma气质,我们这片大地上曾经历一波又一波的造神运动,领袖型气质能从底层心理上产生强大共鸣。这个观点同样可以解释,为什么很多人对"上天驾战机,下地驭灰熊"的所谓“普大帝”有强大的情感共鸣。川普被打掉耳朵的那一枪,简直是神来之笔,直接摸到了这类网友的G点,让他们高潮迭起,把他送上总统宝座。
|
||||||
|
|
||||||
|
哈马斯的支持者们,总说川普在破坏民主。相反,民主恰是川普的口号,并且很会利用民主。去年这个时候,小黄在读米勒的小书《什么是民粹主义》,我也顺带读了下,认同里边的观点。民粹不反对民主,他们甚至拥抱民主,以人民的名义,支持普遍民选。问题是他们反对多元化,给人民加了大量修饰词,进而垄断了人民的定义。我支持谁,谁就被划入人民范畴,我反对谁,谁就被划出人民的阵营。历史上黑五类、移民、有色人种、宗教人士都曾 --- 作为反面人物,以树立大旗,凝聚正面的力量 --- 被划出人民的范畴。
|
||||||
|
|
||||||
|
聊天当中,小黄突然发现老杨鼻子红红,原来上面有颗显眼的大痣不见了,问怎么回事?老杨说动了个手术去掉了。小黄诧异,说你不是说这个痣聚财吗?我说,那是老杨在没有深入学习玄学之前的说法,现在境界不同,观点就不一样的。也许哪天境界又上一台阶,又希望这颗痣回来,那时只能贴一颗了。这就像民粹主义者,昨天我需要你,就把你划入好痣范围,仔细呵护,明天对你有看法,就把你划入坏痣的范畴,加以消灭。
|
||||||
|
|
||||||
|
不过仔细想想这位教授说的也不是没有道理,川普的生意思维中少了一些主义,在当下俄乌局势下,民主党与红色左派硬刚下,川普倒是露出了些保守主义的底色。他的一些做法,反倒比较符合国人的中庸之道,显得更为亲和。
|
||||||
|
|
||||||
49
markdown/幽灵舰队.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 幽灵舰队
|
||||||
|
subtitle: 老人的战争六部曲第2部 | [美]约翰·斯卡尔齐
|
||||||
|
description:
|
||||||
|
date: 2019-12-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 笔记
|
||||||
|
- 科幻
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书 ]
|
||||||
|
slug: "youlingjiandui"
|
||||||
|
---
|
||||||
|
|
||||||
|
国庆日本旅行期间陆续读完,白天走的腰腿痛,晚上躺酒店看书是享受。
|
||||||
|
|
||||||
|
故事从三个外星种族结盟(勒雷伊\艾尼沙\奥宾)准备夹击人类展开。1对3的战争一旦爆发,人类胜算的概率几乎是0,于是人类防卫军的特种部队展开反围剿。计划各个击破,先瓦解掉勒雷伊、艾尼沙。
|
||||||
|
|
||||||
|
但期间发生了一件导致双发力量对比发生变化的关键事件,人类最厉害的脑科学家布廷叛逃,布廷是防卫军大脑"脑伴"的发明者。
|
||||||
|
|
||||||
|
说下防卫军及"脑伴"。防卫军战士是克隆身体,克隆出来的使命就是保护人类。通过植入"脑伴"使得刚克隆出来的身体拥有“大脑”,脑伴保存海量知识,如同一个微型量子计算机,脑伴与原生大脑通过神经无间隙链接,帮助指挥大脑。而且防卫军脑伴之间还可以相互链接形成网络,实时共享敌情和信息。于是防卫军能力超强,行动敏捷,突破原生人类各种能力的极限。防卫军无时无刻不生活在脑伴链接的世界,同伴间的交流、情绪都是通过脑伴传递,而一旦脑伴间断开链接,作为人类保护者的防卫军战士会产生极大的心理和生理负面反应,而失去作战能力。
|
||||||
|
|
||||||
|
回到布廷,布廷叛逃到奥宾人那里,在奥宾人帮助下继续研究脑伴,制作了断开脑伴链接的设备,而奥宾人则想让布廷帮助他们修补他们大脑中与生俱来的情绪缺失的问题(苏康人在制造奥宾人的时候埋下的雷,如同英国人离开交出殖民地领导权时必要埋几个雷便于他们以后继续操控一样道理),无情绪的奥宾人看起来都是相当佛系的,但奥宾人认为情绪这个东西是好东西,对此有种宗教般的向往,这在第三部《消失的殖民地》里有延续。
|
||||||
|
|
||||||
|
人类搞定勒雷伊、艾尼沙后,对殖民联盟来说最大的雷就是布廷了,于是克隆了一个防卫队士兵雅列,并把当时布廷叛逃是没有来的及销毁的他本人的大脑备份注入他的脑伴中,计划是通过唤醒布廷的意识回忆布廷叛逃的原因和藏匿的地点。这是个险招--虽然后来雅列激活布廷记忆,成功发现了布廷藏身奥宾人的地方,并与他的二排战友一起去完成刺杀布廷的任务-- 谁也没有把握能否唤醒布廷的意识,谁也没有把握唤醒了布廷意识后的雅列还是不是雅列,也没有把握唤醒后的雅克会不会像布廷一样去摧毁人类。
|
||||||
|
|
||||||
|
雅列后来见到布廷后,布廷的计划是抹去雅列的记忆后,让雅列杀了原生人布廷,留下的只有布廷的记忆,那么雅列就只有布廷的灵魂了,雅列就是真正的布廷了,而雅列在两个自我中最终选择了用智能杀了布廷和自己,从而世上无布廷了,人类殖民联盟避免被毁。
|
||||||
|
|
||||||
|
剧情宏大复杂,对话和人物还是相当有生动,故事精彩,科幻硬核,比《消失的星球》好看。
|
||||||
|
|
||||||
|
这是一个体制内的人对体制不满的反乌托邦的故事,人物并非那么的非黑即白,反面人物布廷在防卫联盟中有地位崇高,他的叛逃除了利益驱动外,也因对殖民联盟现状的不满。在殖民联盟制度下,各殖民地的人类似乎变成圈养的动物,尤其是地球上,殖民联盟严格控制着舆论和发展轨迹,摘录几段他和雅列的对话。
|
||||||
|
|
||||||
|
“我什么都不指望你,”布廷说,“因为你屁也不知道。防卫军的普通士兵根本不知道这件事。殖民者显然也都不知道。殖民联盟拥有所有的飞船、跃迁无人机和通讯卫星,在空间站处理所有贸易和少得可怜的外交事务。殖民联盟是信息流通的瓶颈,他们决定殖民地该知道什么,不该知道什么。不单是殖民地,还有地球。妈的,地球的情况最糟糕。”
|
||||||
|
“为什么?”雅列问。
|
||||||
|
“因为地球在过去两百年间被逼成了社交白痴,”布廷说,“狄拉克,殖民联盟在地球牧养人类,用富国补充兵源,用穷国充当殖民种子库。殖民联盟实在太喜欢这个安排了,甚至在尽力遏制地球的社会演变。他们不希望地球发生变化,免得搞乱士兵和殖民者的生产计划,所以他们把地球与其他人类隔绝开,不让地球上的人类知道他们被完美地控制在了停滞状态。他们制造出一种疾病——他们称之为‘去势病’——告诉地球人说这是外星传染病,以此借口隔离了地球。他们让这种病每隔一两代就发作一次,只是为了巩固这个借口。”
|
||||||
|
“我遇到过地球来的人,”雅列想起了克劳德中尉,“他们又不傻,要是被迫困在原始状态,他们会发现的。”
|
||||||
|
“哦,殖民联盟每隔几年就会允许他们发明一两样东西,让他们以为自己还在发展曲线上,但都不是真正有用的东西,”布廷说,“这次是新电脑,下次是音乐播放器,再下次是器官移植。偶尔允许大家为土地打打仗,免得人们失去活力。但另一方面,地球的社会和政治结构与两百年前毫无区别,他们居然认为这是因为达到了真正的稳定点。另外,他们活到七十五岁就会老死!太荒谬了。殖民联盟把地球管得实在太好,地球甚至都没有意识到他们受到了管理。彻底被蒙在鼓里。所有殖民地也都被蒙在鼓里。没人知道实情。”
|
||||||
|
|
||||||
|
这也是脑机世界里关于自我的故事。没有自我意识的奥宾人予取有度,无疑是非常好管理,有了自我意识就有了立场,就有了价值判断,就有了情绪,就有了是非,就有了欲求,就打开了潘多拉的盒子。然而,奥宾人对自我意识和情绪这类东西却无比珍视。《消失的殖民地》里,死去的布廷,对于奥宾人来说,是上帝般的存在。为了能感受情绪,全体奥宾人通过一个情绪感知系统链接到布廷女儿佐伊,通过佐伊来感知情绪。来看看布廷对雅列说的
|
||||||
|
“那又怎样?”布廷说,“白蚁有社会,每个物种都能交流,不需要有智能也可以记忆——你脑袋里的电脑记得住你做的每一件事情,但那东西从根本上说不比石头更聪明。说到思考,思考难道需要你的内省吗?完全不需要。你可以制造出一个有星航能力的种族,但他们不比原生动物更懂得内省,奥宾人就是活生生的例子。奥宾人能共同意识到种族的存在,但成员不具备所谓的‘人格’。没有自我,没有‘我’。”
|
||||||
|
“为什么?”布廷说,“自我意识的标志物是什么?奥宾人有吗?狄拉克,奥宾人没有艺术,没有音乐、文学和视觉艺术。他们能从知性上理解艺术这个概念,但不懂如何欣赏艺术。他们的交流仅限于彼此告知事实,去哪儿,山那边有什么,他们要杀多少人。他们不会撒谎。他们并没有限制撒谎的道德禁制——说起来,他们压根儿没有限制任何事的道德禁制——但他们无法编造谎言,就像你我无法凭借意念举起物体。我们的大脑没有这种构造,他们的大脑没有那种构造。每个人都会撒谎——每个有意识、需要维护自我形象的人都会撒谎,但他们不会撒谎。他们是完美的。”
|
||||||
|
“他们是完美的,”布廷坚持道,“他们不会撒谎。他们在他们的社会结构之内完美地彼此合作,按照预定方式解决挑战和分歧,从不背后伤人。他们是道德完美的,因为他们的道德是绝对的,是用编码写好的。他们没有虚荣心和野心,甚至没有性虚荣。他们全都是雌雄同体,交换遗传信息就像你我握手一样平常。他们也没有恐惧。”
|
||||||
|
“不,”布廷说,“生物只是生存本能,看似恐惧,但并不是一码事。恐惧是逃避死亡和痛苦的欲望,深植于你对自我有可能不复存在的认知之中。恐惧是和存在相关的。奥宾人无论怎么说都没有自我存在,所以他们从不投降,也不接受俘虏,所以殖民联盟害怕他们,明白了吗?因为你无法让他们害怕。多么了不起的优势啊!这个优势太伟大了,要是再让我负责制造人类士兵,我肯定会建议剥夺他们的意识。”
|
||||||
|
|
||||||
|
这还是一个关于选择的故事,雅列二等兵生为防卫兵,而被注入一个恶之灵,如同我们大脑中善恶两念无不在都在,成为怎样的人非生而为之,而在N次的选择中,雅列最后的选择让他成为更好的人。
|
||||||
|
|
||||||
31
markdown/成功的悖论.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "成功的悖论"
|
||||||
|
subtitle: ""
|
||||||
|
description: 早上,老杨在看一小视频,我旁听到,博主谈北京企业上半年营收情况,其中说到美团收益相当可观,增幅利润双高。又说,其他行业普遍低迷的情况下,美团这样的企业通过外卖业务,实际上是在“收割”实体经济,对小商贩的负面影响尤为严重。这种看法明显非黑即白,带有严重逻辑谬误。
|
||||||
|
date: 2024-08-29 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考,生活 ]
|
||||||
|
slug: "chenggongdebeilun"
|
||||||
|
---
|
||||||
|
||g 早上,老杨在看一小视频,我旁听到,博主谈北京企业上半年营收情况,其中说到美团收益相当可观,增幅利润双高。又说,其他行业普遍低迷的情况下,美团这样的企业通过外卖业务,实际上是在“收割”实体经济,对小商贩的负面影响尤为严重。这种看法明显非黑即白,带有严重逻辑谬误。
|
||||||
|
|
||||||
|
我反对吃外卖,但不反对美团。美团何罪,企业的本分就是顺应市场,产生利润。马儿的”善“(good)是奔跑,猫儿的“善”是捕鼠,企业家的“善”是创造价值。
|
||||||
|
|
||||||
|
如今,一些著名企业家常被扣上“作恶”的帽子,成为众矢之的。这些攻击并没有看到背后环境的大局和时代变革的力量。经济状况是政策和大环境复杂综合的产物,人和企业的行为受时代变革的影响,经济变差不能简单地归咎于某个企业家或企业。大众消费习惯已经形成,时代的变革不可逆转,即使没有美团,也会有其他平台来满足这个市场。
|
||||||
|
|
||||||
|
当下,人们困扰的问题很多,需要一个情绪宣泄的出口,而成功企业家成了替罪羊,这不但没有看到问题的根因,断错病用错药,可能还会妨碍病情好转。给企业家扣帽子,最终只会打压创新精神,削弱社会活力,导致经济进一步恶化。如果企业发展带来的不再是激励和自我实现,而是背负压力与负面效应,财务自由的企业家们还有什么动力去创新试错呢?
|
||||||
|
|
||||||
|
英国工业革命,圈地运动进程让农民和牧民遭受了巨大的冲击。中国改开,城镇化同样让农民妻儿聚少离多。时代变革总是伴随着这样那样的阵痛,但这种变化是不随个体想法转移的。阻碍它,只会让社会停滞,正如大清。
|
||||||
|
|
||||||
|
当下AI是新一波的变革,影响会更加深远剧烈,颠覆行业格局,AI甚至可能替代那些曾被认为不可替代的思想工作者和艺术工作者。与其抱怨和阻止,不如顺应潮流。时代变革总会带来新的社会发展动能,开辟出新的生态位。传统行业如不随之变化、进步和迭代,就会被更高效、更先进的生产力所淘汰。这种淘汰并不意味着坏事,因为新的生态位同时创造了新的就业机会,孕育出新的可能性。
|
||||||
|
|
||||||
|
老杨说,博主还是一个上市公司领导,这反映了当前主流价值取向的问题。这些所谓“大咖”对时代变革和社会进步的认知肤浅甚至愚蠢。但愚蠢并不妨碍他们赚钱,也不妨碍他们成为企业领导,进而影响舆论。“不患寡患不均”的思想劣根性作祟,对成功企业家扣帽子,容易博得舆论关注,进而提升自己知名度,而对商人的攻击又比较安全,所以,这些人攻击者不是蠢,分明是“恶”。
|
||||||
|
|
||||||
|
所以,中国成功企业家常常还得玩政治,或者讲政治,玩政治不是为了出名,是为了改变“人为刀俎我为鱼肉”的现状,是为了避免被人随意“扣帽子”,是为了寻求安全感,可是风险极大。近的不说,远的你看胡雪岩,缩头不行伸头也不行,复杂的现实性悖论下保持企业家的“善”并不容易!
|
||||||
|
|
||||||
42
markdown/我为何流泪.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "万事皆可泪"
|
||||||
|
subtitle:
|
||||||
|
description: 集体观影《志愿军:存亡之战》。炮弹轰鸣,泪流满面。
|
||||||
|
date: 2024-10-18 18:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 影视
|
||||||
|
URL: ""
|
||||||
|
categories: [ 生活 ]
|
||||||
|
slug: "woweiheliulei"
|
||||||
|
---
|
||||||
|
![[我为何流泪-1.png]]
|
||||||
|
# 1
|
||||||
|
集体观影《志愿军:存亡之战》。炮弹轰鸣,泪流满面。
|
||||||
|
|
||||||
|
2个多小时,结束后头痛,不知是因为炸弹轰的,还是情绪过于激动。
|
||||||
|
|
||||||
|
同事们说,不愧是陈凯歌导演,场面氛围值了这个时间,当珍惜当下,看来基本达到爱国主义教育目标。
|
||||||
|
|
||||||
|
# 2
|
||||||
|
这部戏反映朝鲜战争“铁原阻击战”,看完其实还是不了解铁原阻击战前因后果。我想让观众了解铁原阻击战不是导演的目的,导演只是要把观众带进去,制造一种氛围或情绪。战争动员,制造认同,喊口号总比说教有效。
|
||||||
|
|
||||||
|
昨天看到一帖子说,凌晨3点,拍到鸭绿江对岸灯火通明,口号声响彻云霄,看起来他们精于此道。
|
||||||
|
以前看视频,那边的人,看到领袖,泪花纵横,欢快的象小白兔,我总觉得太做作。
|
||||||
|
突然,我开始理解那边的百姓,我这样一个对宏大题材不太会共鸣的人,竟也能在影院泪流满面,在那种氛围下,他们为何不会发自肺腑的泪花纵横。
|
||||||
|
|
||||||
|
万事皆可泪。
|
||||||
|
|
||||||
|
# 3
|
||||||
|
细节过于造作。非得通过夸张“手撕鬼子”,才能彰显我方人物正确伟大?关键角色闭眼前,即便是被狙击手打成筛子(杨传玉),也一定能撑起来“讲几句”,才能彰显我方人物的不朽?莫非这就是催泪的秘密?我不知道。
|
||||||
|
|
||||||
|
好的战争片内核是“反战”,应该反映人性的多面性,而不只是敌我的“杀戮”。
|
||||||
|
|
||||||
|
我不知道自己为何泪流满面,就像不知道为何有时怒不可遏,情感脆弱且易被操纵!
|
||||||
|
|
||||||
|
不受控制的要流泪和不受控制的要排泄并没有太大区别。
|
||||||
|
|
||||||
|
|
||||||
31
markdown/拾荒者统治.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 拾荒者统治
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-11-12 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 影视
|
||||||
|
URL: ""
|
||||||
|
categories: [ 生活 ]
|
||||||
|
slug: "shihuangzhetongzhi"
|
||||||
|
---
|
||||||
|

|
||||||
|
人类进入殖民时代,修理工卡门擅自改变航行路线,致飞船遭遇事故,船员被迫提早用逃生舱登陆到类地球星球--灶神星。
|
||||||
|
这个星球已经进化出了千奇百怪生物,可以类比进化版白垩纪,危机四伏但又充满神奇。
|
||||||
|
修理工卡门,搬运工阿奇和机器人李维,船长山姆和厄休拉,三个team迫降登陆在三个地点,各自展开寻找母舰,推进三个故事线。
|
||||||
|
|
||||||
|
修理工卡门是现实生活中失败者。因为夫妻关系不和谐--你懂中年夫妻总有一堆这样那样的问题--说服妻子登上殖民舰,去探索不一样的生活,希望能够给关系注入一些新的活力。而舰上生活并没有给卡门注入动能,与妻子的关系依然不如意,与船员也相处不好,感受处处被船长山姆欺压。妻子在登陆灶神星前死了。卡门在登陆后不知何故无法打开舱门,被困舱中,总之,一堆烂事,人生处处不如意。正当卡门受困仓中,外星生物大蚂蚁听到他的呼唤,与他产生连结,组成强大共生关系。人生的懦弱阴暗,是此时的卡门报复世界的动力,在大蚂蚁的加持下彻底爆发……。**这是一个弱者逆袭后破坏一切最终也毁了自己的故事,是一个坏人背后的悲伤故事,让我想起《鬼灭之刃》中那些鬼**。
|
||||||
|
|
||||||
|
舰长山姆和厄休拉在不断努力下,最终远程连结上得墨忒耳舰号,成功让母舰在灶神星登陆。**这条主线是逆境中相互扶持又分离的故事**。一个是有强大能力和意志力的舰长,目标就是找到母舰,带领船员回家。一个是独立有思想的现代女性,与舰长目标一致,厄休拉用敏锐的直觉让多次脱险。两人越来越适应这里的生活,原本同志般的关系也似乎有了一些微妙的变化。不幸山姆被灶神星某种生物寄生,而最终会异化宿主,并控制宿主让寄生扩散。山姆在某次不由自主的准备用咳出的病毒投给厄休拉时,被醒来的厄休拉发现,也醒悟自己已经不是从前那个山姆了。山姆明白自己能做的就是尽可能久的护送厄休拉到母舰。在他们到达一个神话般巨大无比的树下,从远处就能看到得墨忒耳时,山姆终于停下来与厄休拉告别。
|
||||||
|
|
||||||
|
黑人女孩阿奇是一个有个性、有生活原则的人,不时迷茫但也勇敢追求自己理解的生活意义。因为厌倦原来工作成为舰上的搬运工,与舰上的另一个女孩邂逅。机器人李维是他工作中的帮手。阿奇在穿越峡谷时,遇上寄生了卡门的大蚂蚁,仇恨一切的卡门对他们发起进攻,阿奇幸存,李维被完全解体。孤独无援的阿奇发起求救信号,被某个脱离殖民地3人小分队截获,他们穿梭各种星球,以掠夺资源和获得科技为生。驾驶小型飞船前来劫夺得墨忒耳上的货物和科技。阿奇最终遇上了他们……。同时,登陆后李维的机器部件受到星球上病菌侵入,与这里的生物产生了共生关系,从原来的无机机械进化成了一种有机物种。在被大蚂蚁完全拆毁后,因为这种共生有机的存在,让李维能够重新组合生长,最终成为一个强大的新的生物体。在最后大蚂蚁要消灭阿奇时,李维及时赶到,阻止并解除了卡门和大蚂蚁的共生关系。李维分分钟解放大蚂蚁,感觉下一季机器人要封神。**这是个坚持自我,忠诚和背叛的故事**。
|
||||||
|
|
||||||
|
灶神星上各种生物脑洞大开。总体风格治愈、精美,让人想起宫崎骏。有少量惊悚场景,如某次山姆被克隆生出的怪物,救治山姆的老太太家,但三个故事讲得很精彩丰满,穿插一些登陆前的生活片段,娓娓道来绘出心理动机。
|
||||||
|
|
||||||
|
世界进化成我们现在这个样子也纯属一系列的偶然,所以,剧中场景也许并不玄幻。
|
||||||
|
不断融合共生进化,与爱死机S3E3《机器的脉动》画风隐喻有些相似。
|
||||||
|
|
||||||
36
markdown/文字的故事.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 文字的故事
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2020-03-16 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: "/img/jiaguwen9"
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 笔记
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 读书
|
||||||
|
- 小艺
|
||||||
|
slug: "wenzidegushi"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
读《说文解字》,就曾观止于古人造字之机巧精妙。不是研究文字学的读者,估计主要被文字伸展开来的隐藏文化故事所惊艳。这是一本打着文字考古幌子的杂文集。
|
||||||
|
|
||||||
|
历史常常服务于特定人群,包含书写者态度。文化总是有立场,我们所见,大抵是需要为你所见,而真相往往被过滤,就像一幅找不到关键碎片的拼图,靠想象力来弥补,却永远也不完整。
|
||||||
|
|
||||||
|
考古验证了一些传言,也不断否定一些事实,古老物件是亲历者,虽不能言却可人。**古老文字**就是这样一堆老物件,虽斧钺加身屡遭摧残(最近一次就是简化运动,一大把人提出一万个理由为这波操作助阵叫好。你看,数字化时代到来给了这拨人一记响亮耳光。),那点魂魄血脉仍不至于散若云烟。
|
||||||
|
|
||||||
|
书中涉及甲骨/金文字数不多,显然,文字只是引子。我学习古文字,感兴趣于说文解字,倒真被作者这不多的文字造字法解读吸引了。期盼作者能够以说文解字为蓝本,写一本更妙趣横生字源考略,这估计会花大把时间,而且又必定是一本滞销书,作者是文学家,估计不会干这种吃力不讨好的事。
|
||||||
|
|
||||||
|
或许等累积足够,又有大把时间,如果还有兴趣,我自己出一本吧。
|
||||||
|
|
||||||
|
### **0329补记**:
|
||||||
|
今读[《新编说文解字大全集》](https://book.douban.com/subject/6801529/) 大体够用,我的Flag可以推掉了 :smile: 。
|
||||||
|
|
||||||
|
书中一个有趣的字"且",读《说文.且部》说“且,荐也,从几”,似可解读为顾左右而言它,有意回避本义,或垫放物体之器物。我们看甲骨文“且”字,实为象形字,甲骨文象雄性生殖器,是初民生殖崇拜体现,远古时期狩猎防御纯粹靠人力,繁衍是定乎生死头等大事,先民认为男子生殖器是繁衍子孙的神秘器官,祭祀祖先时,将死者男性生殖器切成几段置于灵台(活脱脱的且),祈求人丁兴旺。后演化为石雕器型,一般已被破四旧捣毁殆尽,一些地方仍漏网之鱼可见到。今之木制牌位倒找到合理解释了,牌位与生殖器,你必定觉得严重亵渎神灵先祖,而恰相反,先祖觉得这是最庄严的隆重仪式。
|
||||||
|
|
||||||
20
markdown/是非vs立场.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "是非 Vs. 立场"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2024-05-25 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 社会
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 生活
|
||||||
|
slug: "shifeivslichang"
|
||||||
|
---
|
||||||
|
|
||||||
|
||g 豆瓣刷到这么一张图。李家村村民委员会竟有如此觉悟!这句话应该刷到墙上 -- 就像《庆余年》中叶轻眉立在监察院门口的石碑 -- 常常拂拭,时刻提醒。看似常识,践行不易。
|
||||||
|
|
||||||
|
![[是非vs立场.jpg]]
|
||||||
|
|
||||||
41
markdown/权力的本质.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 权力的本质是什么
|
||||||
|
subtitle:
|
||||||
|
description: 政治权力、资本权力、宗教权力、科技权力……,本质是什么?
|
||||||
|
date: 2023-12-08 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考 ]
|
||||||
|
slug: "quanlidebenzhi"
|
||||||
|
---
|
||||||
|

|
||||||
|
政治权力、资本权力、宗教权力、科技权力……,本质是什么?
|
||||||
|
|
||||||
|
### 政治权力
|
||||||
|
来自国家机器,国家机器垄断合法暴力,作为国家机器的官员就有了权力。
|
||||||
|
国家机器为何拥有合法暴力?因为人民让渡或许可。人民为何许可?因为合法暴力对内维护秩序,对外抵御侵犯,总之,出于安全的基本需要。
|
||||||
|
换言之,**人民为了获得安全,作为交换,交出了部分权力**。霍布斯关于国家的起源就是这么说的。
|
||||||
|
|
||||||
|
这也是为什么,古往今来所有政府帝王,不关实际行动如何,都宣扬勤政为民,因为这是其合法性的来源。
|
||||||
|
那么有人会问,古代帝王宣称,授之于天,权力似乎是无条件的?这其实是一种障眼法,这套戏法给权力披上天授的锦衣,是对权力僭越者是威慑。
|
||||||
|
但如果帝王沉迷于这个障眼法,以为自己真的天神护体,刀枪不入,可以胡作非为,老百姓一旦不能满足安全基本需求,权力终会崩塌。
|
||||||
|
|
||||||
|
### 资本权力
|
||||||
|
资本可以转化或购买权力。资本怎么来呢?资本源自于对需求的满足,这种对需求满足能力的差异、广度、深度越大,掌握资本的速度规模就越大。比如,工业革命这种颠覆性、满足生活各个方面需要的变革,就创造了巨量资本,资本家迅速崛起。现在大公司大量投入AI,也许到了某个奇点,领先者便成为新的权贵。
|
||||||
|
|
||||||
|
本质上,**人们为满足某种需求,让出部分金钱,交换服务或商品,资本家获得金钱,进而转化成权力**。
|
||||||
|
|
||||||
|
### 科技权力
|
||||||
|
实际上可以归类为资本权力,因科技提供差异化服务或商品,进而获得资本权力。
|
||||||
|
|
||||||
|
### 宗教权力
|
||||||
|
信仰能够抚慰人心,每个人都面临局限性,死亡是最大的局限性,信仰是一种底层需求。
|
||||||
|
**宗教系统化全方位的满足这种抚慰需求。为了满足这一需求,愿意付出什么?金钱、权力……,人们说把最好的东西献给神**。
|
||||||
|
功利的讲宗教是最广泛的商品。
|
||||||
|
|
||||||
|
分析一圈,可以说,权力本质是满足差异化的需求的能力。你(人或机构)提供这样的能力,作为交换,就能获得权力或者获得能转化为权力的东西。
|
||||||
39
markdown/理性的反噬.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "祛魅&理性的反噬"
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-05-10 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: true
|
||||||
|
tags:
|
||||||
|
- 哲学
|
||||||
|
- 笔记
|
||||||
|
URL: ""
|
||||||
|
categories: [ 思考 ]
|
||||||
|
slug: "lixingdefanshi"
|
||||||
|
---
|
||||||
|

|
||||||
|
按韦伯的理论,清教伦理促成资本主义精神,这里资本主义精神是资本主义制度原动力,而资本主义制度是可复制的,如当今日本中国等等。 所以,此处应区别精神和制度。
|
||||||
|
|
||||||
|
理性规划指导一切,如音乐之乐理、企业之治理,不断追求卓越的原动力来自上帝的calling,也就是韦伯说的“志业”。
|
||||||
|
|
||||||
|
这似乎是有些道理,现实情况这些资产百亿的大企业家,赚钱只能理解为是一种“志业”?!
|
||||||
|
|
||||||
|
那么问题是,按韦伯,清教伦理-资本主义精神-理性这一链条,理性终将蓬勃发展,理性的发展,“去魅”成为必然,去魅动摇了上帝calling的信仰,也就动摇了资本主义精神的原动力。
|
||||||
|
|
||||||
|
### 20230517补记
|
||||||
|
现代性导致“去魅”这个事情很严重,按韦伯的说法,这个对基督教世界确实是根本性。
|
||||||
|
|
||||||
|
> “我们这个时代,因为它所独有的理性化和理智化,最重要的是,因为世界已经被祛魅,它的命运便是,那些终极的、最高贵的价值,已经从公共生活中销声匿迹。”--韦伯
|
||||||
|
|
||||||
|
好在,理性已成规模,制度业已形成,一个规约下运行的社会,原初的精神动力也许可以放弃,所以,资本主义的生产模式可以移植到世界各地。 工具理性取代了价值理性,一切可以用理性的计算,生产线上的工人沦为一件件趁手的工具。 但人毕竟区别与工具,**“去魅”把人赖以支撑的精神内核抽离,人们不在那么笃定,如何能够填补这精神的空缺?新的刺激在哪里?**
|
||||||
|
|
||||||
|
娱乐产业便是很好的替代品,影视游戏能够让人们暂时脱离“工具理性”,沉浸在某种类似宗教的非理性状态中。
|
||||||
|
**吊诡的是,这种梦幻的非理性的背后却又是现代工业最理性的算计的成果,比如游戏工业,每个环节都是理性安排的产物。**
|
||||||
|
|
||||||
|
**理性的反噬**一个例证就是希特勒出现,希特勒无论从那个方面都没有成为他那个角色的素质和号召力,关键在于此时的德国人厌倦的工业化理性的安排,**人们渴望跳出这样的安排,把自己交给某个人,因信生义,就如同把自己交给上帝**。韦伯称之为charisma,**charisma**就是那个疯狂的人的特质。
|
||||||
|
|
||||||
|
> **韦伯认为弗洛伊德的精神分析,就是宗教仪式,病人就是教徒,治疗师就是牧师,病人的倾诉就是教徒的告解;病人和治疗师的角色权威性潜藏着不对称的关系,所以他们总能达成某种一致,就是诊疗师要传递的思想,方式就是诉诸不对称的权威,如同教徒忏悔后牧师以神之名义的宽恕。看似平等关系背后潜藏的权力关系。精妙啊,中医不就是。**
|
||||||
|
|
||||||
37
markdown/甘地论自治.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: "甘地论自治"
|
||||||
|
subtitle:
|
||||||
|
description: 甘地認為我們不可能將手段與目的分開,「認為手段和目的之間沒有聯繫,是一個嚴重錯誤的信念……我們總會以當初播種的方式收割。」舉例來說,你不能為了達到和平的目的而實施恐怖統治,或利用恐懼來驅逐恐懼,或期待能藉由武力來創造秩序,因為這些手段最終都會污染你的目的。
|
||||||
|
date: 2024-09-07 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书,思考 ]
|
||||||
|
slug: "gandilunzizhi"
|
||||||
|
---
|
||||||
|
||r 《政治哲学的十二堂podcast》,精彩!
|
||||||
|
|
||||||
|
有感于第六章<甘地论自治>某段:
|
||||||
|
> “甘地認為我們不可能將手段與目的分開,「認為手段和目的之間沒有聯繫,是一個嚴重錯誤的信念……我們總會以當初播種的方式收割。」舉例來說,你不能為了達到和平的目的而實施恐怖統治,或利用恐懼來驅逐恐懼,或期待能藉由武力來創造秩序,因為這些手段最終都會污染你的目的。”
|
||||||
|
|
||||||
|
马克思主义是这种分离的典范,认为暴力革命是达到目标所不能或缺的,暴力阶段和治理阶段可以泾渭分明的分离,甘地说这在现实上不可能。
|
||||||
|
|
||||||
|
马克思主义者或许会说:甘地所面临的局面简单,对手怀柔,甘地才得以用最小的牺牲换得最大的成就,相比之下,中国反殖状况复杂得多,敌人凶残的多,甘地的反抗方式轻描淡写的如同儿戏,怎么行得通?这很难假设,结果也许如同他们所言。甘地式的非暴力似乎隐含着一种靖绥,一种软弱无能。他们会说,甘地的路线确实减少了暴力冲突带来的整体伤害,但这种伤害的减少却是用靖绥和软弱换来的。
|
||||||
|
|
||||||
|
甘地的这种以退为进的非暴力的方式,不是我们所熟知的,是不是最好,也许值得商榷,但这并非软弱。对甘地本人来说,需要极大的智慧和意志力量,他所受的肉体上的摧残也并不小于任何一种暴力形式,而且最终甘地殉身了。可以说,这种宗教式的自我牺牲需要很大勇气,是坚定无畏的,是很沉重的。
|
||||||
|
|
||||||
|
你或许可以说他是另类的理想主义,但与软弱无关。
|
||||||
|
|
||||||
|
我倾向于同意甘地这番道理,至少在某些问题场景,是值得尝试的解决之道。法国大革命和光荣革命从正反两面验证了,中20世纪70年代发生的事及影响也部分验证了甘地的观点,马丁路德,曼德拉…都是甘地路线的实践者。
|
||||||
|
|
||||||
|
暴力制造暴力,非常手段制造与之对应的非常手段,目的总会非常过程所被污染。
|
||||||
|
|
||||||
|
了解过阿拉伯世界的历史,我甚至认为甘地的方式更适用于困局中的阿拉伯人。但问题是暴力象一头利维坦,一旦唤起就自我催化,阿拉伯人的悖论在于尝到过暴力的甜头,也体验暴力带来的苦难。
|
||||||
|
|
||||||
|
手段终将反噬或反哺目的,似乎包含着朴素的自然法。
|
||||||
|
|
||||||
42
markdown/生命不能承受之轻.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 生命中不能承受之轻
|
||||||
|
subtitle: 米兰.昆德拉
|
||||||
|
description: 昆德拉借萨宾娜的思索表达了他的看法,只要有公众存在,只要留心公众存在,而不是按自己的意愿行事,就免不了媚俗。不管我们承认与否,媚俗是人类境况的一个组成部分,很少有人能脱俗。媚俗不仅仅是某些人或某些国家的问题,而是整个人类的问题。由于媚俗,人们往往会用意志代替个人追求。由于媚俗,人们往往会扭曲自我的价值判断以迎合整体的价值取向。当整个价值判断体系完全失重,美与丑、善与恶、好与坏无从判别,甚至形成一体时,生命在外界和内心的沉重抗击之下也就变得无所适从,变成了不能承受之轻。
|
||||||
|
date: 2022-08-09 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 读书
|
||||||
|
- 思考
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书 ]
|
||||||
|
slug: "shengmingbunengchengshouzhiqing"
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> ❞ 轻为正,重为负。—— 巴门尼德
|
||||||
|
> ❞ 静胜燥,寒胜热,清静为天下正。 -- 老子
|
||||||
|
|
||||||
|
这点老子和昆德拉心意相通,生命的自然状态最好,所有忸怩作态和对作态的共鸣都是不耻的。
|
||||||
|
|
||||||
|
> 在《生命中不能承受之轻》中,昆德拉借萨宾娜的思索表达了他的看法,只要有公众存在,只要留心公众存在,而不是按自己的意愿行事,就免不了媚俗。不管我们承认与否,媚俗是人类境况的一个组成部分,很少有人能脱俗。媚俗不仅仅是某些人或某些国家的问题,而是整个人类的问题。由于媚俗,人们往往会用意志代替个人追求。由于媚俗,人们往往会扭曲自我的价值判断以迎合整体的价值取向。当整个价值判断体系完全失重,美与丑、善与恶、好与坏无从判别,甚至形成一体时,生命在外界和内心的沉重抗击之下也就变得无所适从,变成了不能承受之轻。
|
||||||
|
|
||||||
|
昆德拉揭示了人类生命中不能承受的轻,但他和我们一样,无力解决这个问题。因为'永劫回归'是不可能的。民族历史、个人生命都只有一次性,没有初排,没有草稿,选择也就变得毫无意义。我们不选择媚俗,又能选择什么呢?安知抗击媚俗的决心和勇气不是另一种更大的媚俗?一个生活在地球上的人怎么可能避免媚俗呢?如果媚俗不可避免,那么所有'沉重而艰难的决心'不都是轻若鸿毛吗?这又是一种生命中不能承受之轻。
|
||||||
|
|
||||||
|
昆德拉由此对生命的终极意义表示了怀疑,而那是我们的前人认为理所当然而又坚信不疑的。我们无可选择又必须选择,我们反对媚俗又时时刻刻都在媚俗。
|
||||||
|
|
||||||
|
米兰昆德拉讲了两滴眼泪看法,看到海边孩子欢乐的奔跑,流下了第一滴眼泪;因为自己被感动,感动于自己地感动,流下了第二滴眼泪;第一滴眼泪是真实的生命体验,第二滴眼泪是媚俗,自媚。
|
||||||
|
自己先有个行为(第一次感动)=> 自己对这一行动/感动地看法/评判 => 进一步驱动自己/别人某种行为
|
||||||
|
别人先有个行为(第一次感动)=> 自己对这一行动/感动地看法/评判 => 进一步驱动自己/别人某种行为
|
||||||
|
如此正反馈系统!推演开来好似群众心理学。
|
||||||
|
|
||||||
|
轻是自由、游戏人生、虚无、背叛的隐喻;重是责任、背负重担,实在的隐喻。
|
||||||
|
萨比娜一生追求生命之轻,但她不断奔向生命之轻的原因却是因为生命之重。她的童年和青年时代的一系列事情给她带来了残酷的影响,因此她想脱离这种命运,靠自己的力量,去寻找生命的自由。萨比娜背叛,挑战权威,不喜欢责任,反对媚俗;女人、音乐、游行、光明、美、忠诚,对她而言,都有些烦人、伤心、不堪回首的记忆。相反,她更喜欢与之对应的黑暗、丑陋与背叛。也正因为如此,萨比娜是书中第一个感受到生命之轻不能承受的人——当你把所有能在乎的东西都背叛完之后,这世上便没有什么再令你感受到生命意义的事件了。
|
||||||
|
|
||||||
|
> "在一切入侵、占领之下,掩盖着另一种更为本质,更为普遍的恶;这种恶的表现,便是结队游行的人们挥舞手臂,异口同声地呼喊着同样的口号。"
|
||||||
|
|
||||||
|
感动于这样的口号,如同感动于第二滴眼泪一样媚俗。人们怀着崇高使命感,被这种价值判断的使命感所驱动,是一种媚俗。这种媚俗于个人事小,于集体可能带来极大破坏性。用周敦颐的话说,这不是生命自然的“静虚动直”状态。
|
||||||
|
|
||||||
29
markdown/癸卯三小印.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 癸卯三小印
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-09-06 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 书法
|
||||||
|
URL: ""
|
||||||
|
categories: [ 小艺 ]
|
||||||
|
slug: "guimaosanxiaoyin"
|
||||||
|
---
|
||||||
|
|
||||||
|
> 三方小印,小楷自用
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[癸卯三小印-3.png]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
![[癸卯三小印-4.png]]
|
||||||
82
markdown/登泰山.md
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 登泰山
|
||||||
|
subtitle:
|
||||||
|
description:
|
||||||
|
date: 2023-03-25 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 笔记
|
||||||
|
- 登山
|
||||||
|
URL: ""
|
||||||
|
categories:
|
||||||
|
- 游玩
|
||||||
|
- 生活
|
||||||
|
slug: "dengtaishan"
|
||||||
|
---
|
||||||
|
|
||||||
|
三孔景区,孔庙门口黑压压一片小学生整齐划一,在膜拜孔圣,接受**孔礼驯化**。
|
||||||
|
|
||||||
|
据告知要预约,到售票中心告知当天已预约完,转闲鱼,花了18¥买了个预约二维码,刷进,闲鱼翻身。
|
||||||
|
什么孔家礼仪,什么儒家思想,毒害少年的玩意儿,实在提不起兴趣。
|
||||||
|
目标是汉碑,向附近导游打听,据说碑主要立在孔庙碑林里。手机地图找到碑林直奔而去,一路是黑压压的小学生。
|
||||||
|

|
||||||
|
|
||||||
|
碑林,十分壮观,制作精良,高大气派,基本楷书,主要是明清时期,内容多为帝王颂扬孔孟之道。应该算当时的国家工程了吧,没有活力,没啥意思。
|
||||||
|
后来有跟导游打听,了解到汉碑应该孔府,于是穿行孔府,在出来的一个不起眼的拐角看到“**汉魏碑刻陈列馆**”。孔府出口喧嚣和十步之遥的碑馆无人对比强烈。
|
||||||
|
|
||||||
|
碑馆不大,两道门两边分别立着两尊石像,没有说明,看造型像是汉魏造像,五官不像汉人,甚为古朴厚重。
|
||||||
|
看到了**张猛龙碑**、**礼器碑**、**史晨碑**,**孔宙碑**,**熹平残碑**和几块汉石刻,魏碑第一和汉碑第一都在里边了。对于学书法的人,看到这几块碑应该很激动的。
|
||||||
|

|
||||||
|
|
||||||
|
不虚此行!!!后来来了一对小夫妻或者男女朋友,应该是美术相关专业的,聊了几句。
|
||||||
|
|
||||||
|
**曹全碑在西安碑林**,西安碑林规模大,总体质量高,以唐碑为主,颜勤礼碑、玄秘塔碑,多宝塔碑,皇甫诞碑,李阳冰三坟记等等,记得高品质魏碑也有不少。西安碑林要逛一天。曲阜这个陈列馆里的这几块碑在我看来可以顶上整个西安碑林!竟冷落至此,中国人的旅行,上车睡觉下车撒尿看个热闹而已。
|
||||||
|
|
||||||
|
明天泰山门票已不能预约,山顶的酒店已订好,寄希望于闲鱼了。
|
||||||
|
|
||||||
|
找了个叫鲁礼家宴的馆子,4个菜根本吃不完,熏豆腐、炒鸡……。实话,不好吃,但真便宜。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
第二天,闲鱼早早告诉我票已经帮我抢到,60元抢票费。
|
||||||
|
|
||||||
|
早上近8点出发去泰安,9点左右到泰安,吃了一碗炒拉面。
|
||||||
|
到**红门停车站**,停车排队约半个小时,上山时近10点,人多。
|
||||||
|
红门一路向上,人人人,和这些人抛下的垃圾,沿路摊贩和电子录音的吆喝声,到处散落着使用过的矿泉水瓶和塑料袋。
|
||||||
|
一些并不算高妙的泰山石刻,一些想博得与天地同古的签名,而今又有谁知道他?
|
||||||
|
之所以要**红门上山**,是要去观览北齐**经石峪石刻**,大约11点,经一岔路到经石峪,见一老农在此养些小菜。
|
||||||
|
远处主道上摊贩的吆喝声仍隐约传来,这里已经算幽深了,北齐人选此地刻下如此洪幅巨制,定有有其姻缘。
|
||||||
|
找了个石椅对着斜坡刻石坐下,沐面山风微寒,清静打心底升起,烦躁瞬间归零,游目骋怀,身心双畅。
|
||||||
|

|
||||||
|
|
||||||
|
忽闻箫声似从天上飘来,幽远飘渺,与此情景交融;循着声音,只见一老者盘坐于石刻顶处一突石之上,长萧在手,长发黑衣。如无此声,我定会以为那是一尊黑石。
|
||||||
|
|
||||||
|
石刻漆色已褪去,字,单字半米见方,亦楷亦隶,严谨圆润。
|
||||||
|
北齐石刻大多方笔为主,原因书写材质和审美意趣兼而有之,此石刻则大不同,岁月冲洗,已不复棱角。
|
||||||
|
庄严和可爱很矛盾,这副石刻上,两者达到了统一,有心无旁骛的庄严,亦有一尘不染的可爱,矛盾统一,此书有佛性!
|
||||||
|

|
||||||
|
|
||||||
|
排队一个半小时,近2点天门**缆车上南天门**,在云巣宾馆住下。
|
||||||
|
下午登了玉皇顶和五岳独尊等打卡地。人多,北方人多,垃圾集散地!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
4:40分起来,随酒店导游登山观日出,风大,冷!
|
||||||
|
浩浩荡荡,一路到**“尧观顶”**的观赏点,约6点,日出,挺美,但远谈不上激动。
|
||||||
|
就像在任何地方,抬头望,一轮如水明月,一团如血残阳,总有些共鸣。仅此!
|
||||||
|
有一小伙挺激动,找角度摆姿势,请收费摄影师抓拍,如我早20年,也许如他!
|
||||||
|
登顶泰山,观了日出,了却一桩愿望,余生应不会再来。
|
||||||
|

|
||||||
|
|
||||||
|
还念着**孔庙的张迁碑**,速回!下山缆车大巴,各种排队后,11点到孔庙。乘大巴是遇一河北大爷,聊了起来,多次登泰山了,了解我是浙江人,说起他年轻时做采购员出差游历过杭州、衢州、舟山、新昌……,服他的矍铄和激情。问了工作人员张迁碑陈列地方,直奔而去,在一个金碧辉煌的xx殿东侧不起眼的小屋里,小屋牌匾应该时新近描金,写着**“历代碑刻陈列”**,题字并无署名。
|
||||||
|

|
||||||
|
|
||||||
|
从第一块开始看,明清唐宋并无特别之碑,记得一块郑板桥的,一套魏碑,都不算特别。
|
||||||
|
最后四块块是,西晋王夫人碑,挨着**衡方碑**、**张迁碑**,一块**李斯书刻**。张迁碑字约2指宽。
|
||||||
|
在观摩张迁碑时,有个导游给他顾客讲解时说,她常看到搞书法来祭拜,张迁碑在很多学书人这,应该确如神一般的存在。
|
||||||
|
今能观摩实物,旅行圆满无憾!
|
||||||
|

|
||||||
|
|
||||||
39
markdown/禅的故事.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: 禅的故事
|
||||||
|
subtitle: 易中天
|
||||||
|
description: 禅源自印度语"jana"静的意思,音译"禅那",后世称"禅",禅宗发源自印度,释迦摩尼讲法时通过“拈花微笑”传给摩柯迦叶,摩柯迦叶及之后在印度传了28祖,菩提达摩是禅宗在西天二十八祖,中国南北朝时达摩到中国传法,是汉禅宗始祖。
|
||||||
|
date: 2019-12-19 11:00:00
|
||||||
|
author: "大童"
|
||||||
|
image: ""
|
||||||
|
showtoc: false
|
||||||
|
tags:
|
||||||
|
- 宗教
|
||||||
|
- 笔记
|
||||||
|
URL: ""
|
||||||
|
categories: [ 读书 ]
|
||||||
|
slug: "chandegushi"
|
||||||
|
---
|
||||||
|
|
||||||
|
禅源自印度语"jana"静的意思,音译"禅那",后世称"禅",禅宗发源自印度,释迦摩尼讲法时通过“拈花微笑”传给摩柯迦叶,摩柯迦叶及之后在印度传了28祖,菩提达摩是禅宗在西天二十八祖,中国南北朝时达摩到中国传法,是汉禅宗始祖。
|
||||||
|
|
||||||
|
时梁武帝慕名问道于达摩。
|
||||||
|
|
||||||
|
梁武帝:“大师,我修众寺庙,抄众佛经,广供养,我功德如何?”
|
||||||
|
达摩:“无有功德”
|
||||||
|
梁武帝:“明明功德巍巍,大师为何说没有功德呢?怎样才是功德?”
|
||||||
|
达摩:“不可着功德之相,自净其意,自空其体,不着贪相,不以世求。”
|
||||||
|
|
||||||
|
鸡与鸭讲,谈话并不愉快
|
||||||
|
|
||||||
|
后达摩到少林寺后山洞中面壁9年,后传衣钵与慧可,授<楞伽经>四卷,并立下“直指人心,见性成佛,不立文字,教外别传”,这些故事当然大抵90%以上是扯淡的,印度那二十八祖印度历史和经书上不可考,所以叫教外别传,就是体系外的,所以无记录,倒也能自圆其说,不过禅宗在中国快速传播,尤其为很多士大夫所接受是事实,我们知道就有苏东坡与禅僧佛印的故事。
|
||||||
|
|
||||||
|
那么禅的核心精神是什么呢,按此书,总结来看几点。
|
||||||
|
- 一是悟,禅不是知识,通过讲授就具备了,所以在禅宗这里,有没有文化不重要,六祖慧能就是文盲,有没有地位不重要,几代祖师都是地道草根,有没有悟性是关键,禅宗师父干什么的,可以帮你悟,比如用讲故事,禅宗里叫公案,给些提示啊,禅宗叫机锋,甚至用粗暴的呵斥和殴打都有,手段不一而足,主要还是靠自己悟。悟可以是快或慢,既顿悟或渐悟,顿悟是六祖慧能南宗观点,渐悟是神秀北宗的观点,神秀后北宗无继,南宗光大。
|
||||||
|
- 二是执,或破执,执则迷,迷则不悟,破执就是去除一根筋,破了执就是自由了,每个人都有各种执念,破执是很难的事情,要破我执,法治,空执,我执就是自我执念,法执就是对规则的执念,空执就是对空的执念,这个不好理解,万法皆空,鸡汤常说的放空,怎么还有执,执着于空,开口闭口说空,你认为空无,就是实相?也是执,空也是空。大乘佛教观点就是:非有非无非亦有亦无非非有非无,其实翻译成计算机语言就是010011都不是。书里说破我执就是罗汉,破法执就是菩萨,破空执就是佛了,可见禅宗修为标准是很不同的
|
||||||
|
- 三是空,万法皆空,诸相空相,这里的空也是空,不是说这杯水空了,这是实相,落入实相又非空,所以,禅宗不可说,一说就错,就是一说就落入实相。靠体悟吧。
|
||||||
|
|
||||||
|
这本小书可读性好,关于空和执的理解精道,关于禅宗的核心要义不够系统,这本书是易中天讲演稿,是关照的趣味性和可讲性,了解个大概还是不错啊,关于破执里边的一些故事有趣。
|
||||||
|
|
||||||
|
[补充:禅宗法脉记要](https://app.yinxiang.com/fx/1bedd12c-c46b-4ba3-b7f8-c7bc0f4883e6)
|
||||||
|
|
||||||