随身小笔记

写在前面

      总之是日常学习生活中遇到的一些随身小笔记啦!希望后续有时间记得将这些好好整理整理一下啦!诶嘿嘿小博客要开始动笔动笔啦,云游君赞美赞美!listder酱sukisuki!


料理制作

麻婆豆腐

食材准备

制作一份麻婆豆腐所需食材包括:

  • 嫩豆腐、嫩牛肉各一份
  • 生姜、大蒜、大蒜叶、小葱、豆瓣酱、豆豉
  • 盐、白糖、生抽、老抽、辣椒粉、淀粉水

制作过程

  • 取一个嫩豆腐,切成片,切成条,最后切成小方块
  • 取一份嫩牛肉,切碎,剁成末,制得牛肉末
  • 取5g生姜,切成末
  • 取两个大蒜,拍一下,切成末
  • 取一段小葱,切成葱花
  • 取适量大蒜叶,切成蒜花
  • 取一勺豆瓣酱,置于案板上;取少许豆豉,将其与豆瓣酱放在一起,剁碎
  • 锅中烧水,加入豆腐焯水,并放入少许盐增加底味,待水沸腾后,倒出控水
  • 在锅中倒入少许油,加入牛肉末,进行翻炒
  • 炒香后加入葱姜蒜,并加入少许料酒去腥
  • 加入豆瓣酱豆豉,继续翻炒
  • 炒出红油后加入适量清水
  • 加入适量白糖、生抽、老抽
  • 加入一勺辣椒粉,搅匀
  • 加入焯过水的豆腐,烧制五六分钟
  • 分三次加入淀粉水
  • 浇洒适量明油,并撒上蒜花

Valaxy

简单命令

新建文章

通过 Git cmd 进入到博客根目录下,借由输入命令:

pnpm valaxy new "filename"

可以创建新的文章,这里 filename 为新建文章的文件名。例如当我输入:pnpm valaxy new "origami"时,会在 pages/posts/ 目录下新建一个 origami.md 文件

新生成的 .md 文件默认具有格式:

markdown
---
layout: post
title: origami
date: 2025-01-08 06:05:04
---

此格式省略了部分控制参数,实际上我们可以在文件开头写入:

markdown
layout: post
title: 祭神纸偶——纸片上的心愿,折纸抽奖小活动!
tags:
    - GINKA
    - 手工
    - 折纸
    - 拜年祭
categories: 拜年祭活动
cover: img/origami/cover.png
date: 2025-01-08 06:05:04
top: 3

这里 title 代表标题, tags 代表标签,categories 代表文件被归入的文件夹,cover 代表封面,其默认路径在 public 下,data 代表文件的创建日期,可自由修改

博客内各文章的排序方式以 top (应取正整数) 为主要关键词,以 data 为次要关键词


VScode

快捷键

  • 在当前文件进行搜索:Ctrl+F
  • 注释一段代码:Ctrl+/
  • 跳转至当行内容的末尾 End

python

条件命令

any(iteration)

iteration 中有至少一个元素为 True,则此函数返回 True,否则将返回 False,例如:

python
numbers = [0, 1, 2, 3]
has_positive = any(num > 0 for num in numbers)

可用于判断 numbers 中是否存在正数,其对偶为:

python
numbers = [0, 1, 2, 3]
has_positive = not any(num <= 0 for num in numbers)

可用于判断 numbers 中是否全为正数


迭代命令

lambda表达式

lambda 表达式是 Python 中用于创建匿名函数的一种方式。匿名函数意味着没有明确的函数名,通常用于一些短小的、只需要用一次的函数。其语法为:

python
lambda arguments: expression

这里 arguments 为函数的传入参数,可以为一个或多个;expression 为一个表达式,用以作为 lambda 的返回值

例如:

python
words = ['apple', 'banana', 'cherry', 'date']
sorted_words = sorted(words, key=lambda word: word[1])
print(sorted_words)  # 输出 ['banana', 'date', 'cherry', 'apple']

可用以实现以第二个字符为索引进行排序

由于 lambda只能包含一个表达式,不能包含多行代码,因此它的功能是有限的。所以lambda常与 mapfliter 结合使用

map

map 可用于将指定函数应用于给定可迭代对象(如列表、元组等)的每一个元素,其语法结构如下:

python
map(function, iterable, ...)

这里 function 为一个函数,或者是一个可以接受一个或多个参数的可调用对象;iterable为一个或多个可迭代对象(如列表、元组等);可以传入多个可迭代对象,但 function 需要接收多个参数,以与之一一对应

map() 返回的是一个迭代器,只有在实际遍历(如使用 list())时才会执行计算。

例如:

python
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
result = map(lambda x, y: x + y, numbers1, numbers2)
print(list(result))

fliter

类似于 map(),不过此函数是用于筛选出符合条件的元素,而非对可迭代对象的每个元素应用某个函数;但由于 filter() 返回的是一个迭代器,故而若想得到可直接访问的数据结构,需结合 list()tuple() 使用

例如:

python
numbers = [-1, 2, -3, 4, -5]
result = filter(lambda x: x > 0, numbers)
print(list(result))

zip

用以将多个可迭代对象(如列表、元组、字符串等)按位置打包成元组,返回一个由这些元组组成的迭代器;由于返回值为迭代器,故而常常需要同 list 结合使用

使用 * 运算符可以“解压”一个由 zip() 产生的可迭代对象。这样可以将打包好的元组还原成单独的元素,例如:

python
names = ['Alice', 'Bob', 'Charlie']
scores = [90, 85, 88]
zipped = zip(names, scores)
unzipped_names, unzipped_scores = zip(*zipped)
print(unzipped_names)  # ('Alice', 'Bob', 'Charlie')
print(unzipped_scores)  # (90, 85, 88)

也可利用 zip() 来实现矩阵的转置:

python
matrix = [(1, 2, 3), (4, 5, 6)]
transposed = list(zip(*matrix))
print(transposed)

列表生成式

介绍

列表生成式是形如 [expression for item in iteration if condition] 这样的命令结构,其相比 for 循环具有如下优势:

  • 列表生成式在内部是一个单一的表达式,它在创建列表时,所有的操作都在一个上下文中完成,减少了上下文切换的开销
  • 使用 for 循环时,通常需要调用 append 方法来添加元素,这会涉及到多次的函数调用。而列表生成式直接在内存中构建列表,一次性分配足够的内次,减少了内存分配的次数
  • 列表生成式生成的字节码通常比 for 循环生成的字节码要少

故而列表生成式一般比 for 循环更高效,这可以通过执行命令:

python
import timeit
list_comp_time = timeit.timeit('[x**2 for x in range(1000)]', number=10000)
for_loop_time = timeit.timeit('''
squares = []
for x in range(1000):
    squares.append(x**2)
''', number=10000)

print(f"列表表达式时间: {list_comp_time}秒")
print(f"for 循环时间: {for_loop_time}秒")

得到的运行结果所看出,参考值:列表表达式时间: 0.45448099999885017 for 循环时间: 0.5347337000002881

应用

列表生成式可以用于空数组的生成,例如:

python
array=[[] for _ in range(0,num)]

这会生成一个大小为 num 的列表,列表中的每一个元素均为一个空列表


字符串操作

str(object)

此函数可将整数、浮点数等数据转换成字符串,将 Bool 值转换成 "True" 或者 "False"

此函数可将容器对象(如列表、元组、字典)转换成它们的字符串表示

string.strip([chars])

此函数用于去除字符串两端的特定字符,返回值为得到的字符串,不会对原字符串进行修改

chars 为可选参数,不传入时此函数将会去除字符串两端的空白字符(如空格、制表符、换行符等);传入时可作为字符集传入,函数将去除字符串两端所有的字符集包含的字符,例如 s=string.strip("abc") 所得到的字符串两端将不含 'a','b','c'

此函数存在衍生函数 lstrip()rstrip(),各自分别只去除字符串左端和右端的字符

eval(expression, globals=None, locals=None)

此函数可用于执行字符串表达式并返回表达式值,例如:

python
x = 10
result = eval('x + 5')

若传入表达式来自不可信的源,则可能存在安全问题,这时我们可以通过限制可用的全局和局部命名空间,来保证安全性,例如在:

python
# 创建一个安全的环境
safe_globals = {"__builtins__": None, "abs": abs, "max": max}
safe_locals = {}

# 允许执行简单的数学运算
result = eval("abs(-10) + max(1, 2, 3)", safe_globals, safe_locals)

中,便通过将 __builtins__ 设为 None 以禁用内建函数与模块,修补了潜在的安全漏洞

eval() 只能用于执行表达式而不能用于执行控制流语句 (如 if, while, for等)


文件写入写出

open(file,mode)

file 参数

此函数的file参数用于传入文件的地址,类型为str,可采用相对路径

  • 可使用open("X.txt",'r'),但不可使用 open("\X.txt",'r'),这之中双引号单引号可相互替换
  • 当输入这样的命令时,程序会在当前目录下搜索 X.txt 文件并打开

此函数也支持使用绝对路径,但应当注意:

  • 若直接复制文件地址作为函数参数传入,会出现 warning。例如当输入:
python
open("F:\VScode Project\project\Subarray Partition in Array Antenna\The Algorithm X\X.txt",'r')

时,会出现提示:

<>:1: SyntaxWarning: invalid escape sequence '\V'
<>:1: SyntaxWarning: invalid escape sequence '\V'
<ipython-input-22-d09f392ca732>:1: SyntaxWarning: invalid escape sequence '\V'
  open("F:\VScode Project\project\Subarray Partition in Array Antenna\The Algorithm X\X.txt",'r')

  • 这是因为路径表达式中的 \转义字符中的 \ 间存在歧义,对此存在着以下几种解决方案:

  1. 在字符串前加上字符 r,即改写成:
python
open(r"F:\VScode Project\project\Subarray Partition in Array Antenna\The Algorithm X\X.txt",'r')
  1. \ 替换成 \\/,即改写成:
python
open(r"F:\\VScode Project\\project\\Subarray Partition in Array Antenna\\The Algorithm X\\X.txt",'r')

python
open(r"F:/VScode Project/project/Subarray Partition in Array Antenna/The Algorithm X/X.txt",'r')

mode 参数

mode 用于传入关于打开方式的参数,其有以下几种选择:

  • r: 只读模式,即默认模式,若文件不存在,会返回 No such file or directory 错误;若在此模式尝试写入,会返回 not writable 错误;此模式下指针初始化为在文件的开头
  • w: 写入模式,若文件已经存在,新增内容会覆盖此文件;若文件不存在,则会新建文件后写入;若在此模式尝试读取,会返回 not readable 错误;此模式下指针初始化为在文件的开头
  • a: 追加模式,若文件已经存在,新增内容会追加到文件末尾;若文件不存在,则会新建文件后写入;若在此模式尝试读取,会返回 not readable 错误;此模式下指针初始化为在文件的末尾
  • r+: 读写模式,若文件不存在,会返回 FileNotFoundError 错误;此模式可写入,指针初始化为在文件的开头
  • w+: 写读模式,若文件已经存在,新增内容会覆盖此文件;若文件不存在,则会新建文件后写入;此模式既可读取也可写入,指针初始化为在文件的开头
  • a+: 追加读写模式,若文件已经存在,新增内容会追加到文件末尾;若文件不存在,则会新建文件后写入;此模式既可读取也可写入,指针初始化为在文件的末尾
  • b: 二进制模式,即在读取文件时不对内容进行编码或解码,直接读取二进制值(用 rw 打开文件时会默认为文本文件);常和其他模式组合使用,例如:rbwb
  • x: 独占创建模式 仅在文件未被创建时可正常运行。若文件已经存在,会返回 File exists 错误;可用于防止文件内容被覆盖
  • t: 文本模式 即在读取文件时以文本形式进行读取,会进行编码和解码;类似于 b 二进制模式,常搭配其他模式一同使用,不过实际上 t 即为 python 中的默认模式

相关函数

当使用 open(file, mode) 打开一个文件时,系统会为之分配资源,故而需要使用 close() 以关闭文件,来释放资源

若写入文件但没有及时调用 close(),可能会造成数据丢失或文件没有保存

利用 with 语句,可以自动管理文件的打开和关闭,是推荐的使用方式,例如:

python
with open('X.txt', 'w') as file:
    file.write("hello")

file.seek(offset, whence)

此函数用于操纵文件指针到指定位置,以进行读写操作,其中:

  • offset: 控制指针移动的字节数,正数代表向后移动,负数代表向前移动
  • whence: 控制计算偏移量的基准点,其可取的参数值为:
    • 0: 表示从文件的开头开始,为默认值
    • 1: 表示从当前位置开始
    • 2: 表示从文件的末尾开始

例如下述代码:

python
with open('X.txt', 'r') as file:
    file.seek(10)
    data = file.read(5)
    print(data)

代表打开 X.txt 文件并打印第11~15个字符串

此函数可用于重置化文件的指针 (文件指针只在打开一个文件时会自动重置到文件开头)


file.tell()

此函数用于获取当前指针的位置,在文本模式下返回返回字符数,在二进制模式下返回字节数。故而返回值可能与编码方式有关系

file.read(size=-1)

此函数用于读取文件, size 用于传入从当前位置开始,读取的字节数;默认为 -1,用于表示读取整个文件;读取内容将作为函数的返回值,并且若没有内容可读取,函数将返回空字符串 ""

读取过程中涉及指针的移动

file.readline(size=-1)

此函数用于按行读取文件,即遇到换行符 \n 时即停止读取,并返回包括换行符 \n 在内的当行内容,其他同 file.read() 函数

size 参数用法同 file.read(size=-1) 中的 size 参数

file.readlines(hint=-1)

功能类似 file.read(size=-1),但返回值为列表,其中列表元素为每行的读取内容

truncate(size)

此函数用于将文件大小截断到指定的字节数。size 参数用于传入目标文件的字节数,而后会从文件开头开始,将第 size 个字节后面的内容截断删除;size 为可选参数,不传入 size 时会将文件截断至当前指针所在处


函数库

bisect

bisectPython 标准库中的一个模块,主要用于对有序表进行二分查找和插入操作,其提供了以下函数:

  • bisect_left(arr, x, lo=0, hi=len(arr))
  • bisect_right(arr, x, lo=0, hi=len(arr))
  • insort_left(arr, x, lo=0, hi=len(arr))
  • insort_right(arr, x, lo=0, hi=len(arr))

这里 arr 为升序列表, x 为待插入元素,lohi 分别为查找的起始和结束位置; bisect_leftbisect_right 分别返回左插入与右插入的位置,insort_leftinsort_right 为直接对有序表进行排序

由于该库只适用于对升序列表进行插入,故而对于降序列表,可通过两次反转结合 bisect 的方式实现插入,例如:

python
import bisect
arr = [9, 7, 5, 3, 1]
sorted_arr = arr[::-1]
bisect.insort_left(sorted_arr, 4)
arr = sorted_arr[::-1]
print(arr)  # 输出: [9, 7, 5, 4, 3, 1]

time

timePython 标准库中的一个模块,提供了许多用于时间处理的函数,包括测量代码执行时间、获取当前时间、格式化时间等:

  • time():返回当前时间的时间戳(自1970年1月1日(UTC)以来的秒数)
  • sleep():使程序暂停指定的时间(以秒为单位)。
  • localtime():用以将一个时间戳转换为当前时区的本地时间,若没有输入时间戳,则默认为当前时间,返回 struct_time对象
  • gmtime():类似 localtime(),不过是将时间戳转换为协调世界时(UTC)
  • mktime():用以将一个 struct_time 对象转换为时间戳(秒数)
  • struct_time(string, format):用以将一个时间字符串解析为一个 struct_time 对象,这里 string 为具有一定格式的时间字符串,如 "2025-02-05 13:45:00"format 为一个格式化字符串,用来指定如何解析 string 中的日期和时间,常用的格式字符串如下:
    • %Y:四位年份
    • %m:两位月份
    • %d:两位日
    • %H:24小时制的小时
    • %M:分钟
    • %S:秒
    • %a:星期几的缩写
    • %A:星期几的全称
    • %b:月份的缩写
    • %B:月份的全称
    • %I:12小时制的小时
    • %p:AM 或 PM

例如:

python
import time
time_string = "2025-02-05 13:45:00"
format_string = "%Y-%m-%d %H:%M:%S"
parsed_time = time.strptime(time_string, format_string)
print(parsed_time)
  • perf_counter:返回一个性能计数器的值,用于测量较短时间间隔。它具有更高的精度和可靠性,适用于性能测试和高精度计时。

以及:

python
import time
time_string = "Mon, 05 Feb 2025 13:45:00"
format_string = "%a, %d %b %Y %H:%M:%S"
parsed_time = time.strptime(time_string, format_string)
print(parsed_time)

timeit

timeitPython 标准库中的一个模块,用于测量小段代码的执行时间。其提供了如下的函数:

  • timeit() 用于计算一段代码的执行时间,其基本形式为:timeit.timeit(stmt='pass', setup='pass', number=1000000),这里 stmt 用以表示要执行的代码片段,setup 为测试代码之前需要运行的初始化代码,二者均要求为字符串类型;number 用以表示代码要执行的次数

该函数最后将返回执行 stmt 所花费的总时间,并且通过:

python
import timeit
timeit.timeit(stmt="corner_add_matrix(matrix1,matrix2,0,0)",setup="from __main__ import corner_add_matrix; import torch; matrix1=torch.zeros(4,3); matrix2=torch.tensor([[0,0,1],[0,0,1],[1,1,1],[1,1,1]])", number=10000)

也可实现对自定义函数的执行时间的测量

repeat() 类似于 timeit(),其基本形式为:timeit.repeat(stmt='pass', setup='pass', repeat=3, number=1000000),增加的参数 repeat 用以控制重复测量的次数

该函数最后将返回一个包含多次测量结果的列表


shutil

shutilPython 标准库中的一个模块,提供了许多高层次的文件操作功能,主要用于文件和目录的管理。其提供了以下的函数:

  • copy(src, dst):用以将 src 复制至 dst,并返回目标路径。若 dst 不存在,则新建名为 dst 的文件;若 dst 为目录,则将 src 复制到该目录下并保留原文件名 例如:
python
import shutil
shutil.copy('Linked list.py', r"optimal solution")

会将当前目录下的文件 Linked list.py 复制到当前目录下的文件夹 optimal solution,并返回值'optimal solution\\Linked list.py'

  • copy2(src, dst):类似于 copy(src, dst),但会保留源文件的元数据(例如,修改时间等)。
  • copytree(src, dst):递归地复制整个目录树,从 src 复制到 dstdst 目录必须不存在。
  • move(src, dst):将文件或目录从 src 移动到 dst,如果目标位置存在,源文件或目录会被覆盖。
  • rmtree(path):递归地删除整个目录树,此操作不可恢复
  • make_archive(base_name, format, root_dir, base_dir):用以将指定目录打包成一个压缩文件。这里 base_name 为压缩文件的输出路径,format 为压缩格式,root_dir 为源目录,base_dir为要压缩的
  • unpack_archive(filename, extract_dir):用以解压缩文件,这里 filename 为压缩文件的路径,extract_dir是解压缩的目标目录
  • disk_usage(path):返回给定路径(通常是文件夹)的磁盘使用情况,包括总空间、已用空间和剩余空间。
  • os.makedir(path):递归创建目录,即若父目录不存在,会一并创建

os

osPython 标准库中的一个模块,提供了与操作系统交互的功能,可用来进行文件操作、目录操作、环境变量管理、进程管理等:

  • rename(src, dst):重命名文件或目录,从 src 路径更改为 dst 路径。 例如:
python
import os
os.rename('old_name.txt', 'new_name.txt')

可直接将文件 old_name.txt 重命名为 new_name.txt

python
import os
os.rename('old_name.txt', '/path/to/new/directory/new_name.txt')

可将文件从当前目录移动至 /path/to/new/directory/ 并同时重命名文件 同时 os.rename() 的各错误类型分别为:

  1. FileNotFoundError:源文件或目录不存在,或者路径错误
  2. PermissionError:没有足够的权限执行重命名操作,或者文件正在被其他程序使用
  3. IsADirectoryError:目标路径是一个目录且目标是文件,或者源路径是目录而目标是文件
  4. OSError:一些其他错误(如跨文件系统重命名)
  • remove(path):删除指定路径的文件。
  • rmdir(path):删除指定路径的空目录,若目录非空会提示 OSError错误
  • mkdir(path):创建指定路径的单个目录
  • makedirs(path):创建多层目录。若中间的目录不存在,会自动创建。
  • listdir(path):返回指定目录中的文件和子目录的列表,默认值为当前所在目录
  • path.exists(path):检查指定的路径是否存在
  • path.isdir(path):检查指定路径是否为一个目录
  • path.isfile(path):检查指定路径是否为一个文件
  • environ:一个字典-like 对象,用于访问和修改环境变量。
  • path.join(path1,path2):用以将多个路径连接成一个路径,会自动添加分隔符
  • path.split(path):将路径分为目录部分和文件部分
  • path.abspath(path):返回指定路径的绝对路径
  • path.basename(path):返回路径中的文件名部分
  • path.dirname(path):返回路径中的文件名部分

Pytorch

类型转换

tensor.to(dtype=None, device=None, non_blocking=False, copy=False)

该函数返回一个新的张量,此张量具有指定的数据类型设备,默认状态下不为强制复制,并且传入的参数均为可选参数:

  • dtype: 指定转换的目标数据类型,例如 torch.float32, torch.int, torch,double
  • device: 指定要将张量移动到的设备,例如 'cpu''cuda'(GPU)
  • non-blocking: 若为 True,则在将数据从一个设备移动到另一个设备时不会阻塞当前线程
  • copy 若为 True,则强制复制张量,即无论目标数据与原数据类型是否相同,都新建一个张量副本

张量操作

torch.equal(tensor1, tensor2)

此函数用于比较两个张量是否相等,若他们的形状、和元素值完全相同,则返回 True,否则,将返回 False


文件类型

文本编辑类

编码类型

Unicode 字符集

为全球性的字符编码标准,旨在为计算机系统中的每一个字符提供唯一的标识符。通常以 U+开头,后面跟随一个十六进制数,例如 U+07FF

同时,Unicode 字符集可划分为:

  • 基本多语言平面 (BMP): 即 U+0000U+FFFF 的字符,包含大多数常用字符,如拉丁字母、汉字、阿拉伯字母、标点符号等
  • 辅助平面: 即 U+1000010FFFF 的字符

ASCII

仅支持英文字符且每个字符占用一个字节

UTF-8

为一种可变长度的字符编码,兼容 ASCII,可用以编码 Unicode,其编码方式为:

  • U+0000U+007F(即 ASCII 字符),使用一个字节,编码方式与 ASCII 相同
  • U+0080U+07FF,使用两个字节
  • U+0800U+FFFF,使用三个字节
  • U+10000U+10FFFF,使用四个字节

大多数网页、数据库系统均支持 UTF-8 编码,现代编程语言(如 python Java JavaScript 等) 默认使用 UTF-8 编码

UTF-16

Unicode 中的 基本多语言平面(BMP),使用两个字节进行表示;对于 Unicode 中的 辅助平面,使用一对称为“代理对”的共计16位单元进行编码

拜年祭相关

邀请致辞

备选UP

以及一些群内活跃群友们

话题1

       转眼之间,自20年6月的 ATRI 发售已然过去了四年半的时间。在这不算短的时间当中,ATRI 陪伴着我们,一同经历了新冠疫情的肆虐、AI技术的普及、黑神话的诞生,以及除此之外的道不尽、数不清的各类纷繁事物。


       四年的时间,足以让每个人都改变良多,不知曾经那位稚嫩的少年或少女,如今成长成了什么样子呢?如若有一次同过去对话的机会,大家还能辨认出现在的自己吗?


       形形色色的人以自己的方式度过了这四年的时光,千姿百态的大家在这四年中沿着自己的方向体悟着属于着自己的人生。曾经交汇的轨迹再一次发散,奔向各自的远方。


       但不知道大家还是否记得在那年夏天,让本应天南海北的我们相聚在一起的那一缕夏日的清凉呢?


       是否记得被患肢痛所折磨的夜晚,亚托莉所传递给我们的,让伤痕累累的心归于平静的温暖;是否记得于教室之内,看着沉寂了许久的灯光被大家所点亮之时,所感受到的激动与欣慰;是否记得翻动着的日记从自己颤抖的双手中滑落的瞬间,自己内心的波涛云涌,心跳不止。


       是否记得在伊甸所听到的,久久回荡于我们内心而不去的话语;是否记得那场将未来与过去一同揭开的,混杂着泪水的晴日暴雨;是否记得最后在点点星光的点缀之下,映入你我眼中的小镇的灯光。


       想知道四年已逝,大家现在又是如何看待小镇上的这段故事的呢?想知道同亚托莉相邂逅的这段时光,对大家来说,又各自意味着什么,大家又各自怀抱着什么样的想法。

话题2

       “为什么是现在”,相信这是一个会时常悬于大家每一个人心头之上的疑问——我们总是期盼着能以最好的状态去完成最出彩的事情。因而一旦当事情出现了超乎我们意料的发展,使我们在一开始就陷于一种糟糕的境地,便总是有一种将之暂且搁置,日后再徐徐图之的想法浮现于我们的脑海。


       而这样的困境应该也会多多少少地出现于大家进行同人创作的过程之中。参与二创的大家,在下定决心创作些什么的时候,恐怕自己也难以说的上是完全做好了准备。


       工作、学习、考试,家庭、同学、朋友,还有太多其他的琐事需要我们去耗费时间与精力,这些细小而又琐碎的事情宛若来自现实的阴雨,不断试图浇灭刚从我们的内心燃起的,创作的火焰。


       但即便如此,大家也还是在竭尽所能地坚持着创作,坚持着坚持着,直至作品的诞生。随后大家盘踞于内心的想法也终于得以变成现实,化作有形的作品,让大家切实感受到借由汗水与灵感浇灌出来的,作品的厚重。


       也正是因为这样,大家的作品才格外具有意义,但这样的过程也注定了不会一帆风顺,因而想知道大家在创作时所发生的故事。在大家将自己的身心投入于作品进行创作的过程中,究竟经历了什么样的事情,又体悟到了哪些东西呢?

话题3

       纵使斗转星移,几度春秋,依然犹在眼前—— ATRI 宣布动画化消息的放出与大家那满怀着期待的心情相互碰撞的刹那,所迸发而出的,激烈的火花。


       曾有无数个这样的夜晚,在一个又一个的 ATRI 群聊中,每一个人发自肺腑,畅谈着 ATRI 动画的可能性:有人因 ATRI 背后的 Aniplex 而信心十足,有人因接连的三个 pv 而认为势在必行;有人认为 gal 改难上加难,有人认为既然长久以来杳无音信,那么最后也难免归于沉寂。


       混杂着对动画的期待与对出圈的担忧,这样的心情在群内的每一寸角落悄然滋生,并贪婪地生长着。


       但终将到来的事情不会因此而提前一刻,注定无缘的事情也不会因此而靠近分毫。最后,ATRI 动画确也如期而至,恰若当时大家不同的人有着各样的观点一般,ATRI 的动画化也给了不同的人以完全不同的感受。


       纵使动画化在许多地方饱受争议,但不可否认的是,也是动画化,让这样的一个 IP 又一次地焕发了生机,再一次地走进了大家每一个人的视野


       即便动画在诸多的地方都同原作有着较大的出入,难免让从原作一路走来的大家一时间难以接受。但也让我们由此看到了不一样的一段故事与别样的亚托莉。


       原作中所传递给我们的,更多的是一种在来自现实的无可奈何直逼眼前的情况之下,抗争到底坚持到最后的不轻易放弃的精神;而在动画中,向我们表达出来的却是身为仿生人的亚托莉,个人所做出来的选择。


       不知道对大家而言,ATRI 动画的诞生又意味着什么呢

关于我们的未来

一路走来,真的非常感谢

       一片喧闹之中,今年的拜年祭还是迎来了它的终点。屏幕中缓缓升起的"Ending",让人不禁意识到我们的第二届拜年祭,居然已经就这么被画上了一个句号,些许思绪止不住地在内心翻涌:既在感叹时间的流逝,也在感慨这一两年来,和大家之间的回忆竟然已经如此厚重。


       依然记得,刚开始提出这个企划那段时间,一位位先前认识而如今却又有几分生疏的群友陆陆续续地加到群里来的情景。那种感觉令人怀念,仿佛一次跨越天南海北的同学会,一种奇妙的羁绊将我们每一个人连结到了一起,在这里共同倾注着各自的热情与心意。


       起初,没有人有将我们同“拜年祭”这样的企划联想起来过。最开始的时候,我们只是觉得,在 GINKA 的诞生之年,如果大家能一起折折纸,写下每个人自己的对于未来的那小小展望,该是多么好的一件事情呀;当时光流转,自那个难忘的暑假已经过去三年光阴的时候,大家再一起去重温 ATRI,回顾着令人心生暖意的海边的故事的时候,该是多么浪漫的一次回忆呀——我们企划的名字也是如此诞生的,冬夏凝思——于冬日重拾当年的感动、祭神纸偶——纸片上的心愿


       后来,伴随着一位又一位群友的加入

2025拜年祭作品合集