2026年4月

FMCRAFT 2026年5月 公开注册公告

亲爱的玩家:

为迎接更多新玩家加入FMCRAFT我的世界服务器,体验纯正的多人联机生存乐趣,服务器将于2026年5月开启限时公开注册活动,本次注册无需邀请码,具体规则与时间安排如下:

一、注册开放时间

  • 开放开始时间:2026-05-02 00:00:01
  • 开放结束时间:2026-05-05 23:59:59

注:上述时间窗口内,服务器将自动开启公开免费注册,无需任何邀请码;时间窗口外,服务器将恢复常规邀请制注册,未持有有效邀请码的玩家无法完成注册。

二、注册通道(两种方式任选)

  1. 网页端注册
    访问官方注册地址:https://user.fmcraft.top/auth/register.php,按页面提示填写账号、密码及相关信息,完成验证即可注册成功。
  2. 游戏内注册
    直接进入FMCRAFT服务器,在游戏内按照指引输入注册指令,完成账号创建与绑定。

三、重要规则说明

  1. 邀请码绑定规则
    本次免费注册的账号,可在注册后的任意时间,绑定其他玩家的邀请码,绑定后可享受邀请码对应的专属福利与权限。
  2. 账号清理规则
    为保障服务器资源合理分配与生态健康,未绑定邀请码、且长期未登录的账号,服务器有权无理由予以封禁清理,请各位玩家及时绑定邀请码并保持账号活跃。
  3. 账号安全须知
    请务必填写真实有效的注册信息,妥善保管账号密码,严禁账号交易、共享、转借等行为,违者一经查实将永久封禁账号。

四、温馨提示

  • 本次公开注册为限时活动,逾期将关闭通道,恢复邀请制,请有意向的玩家把握注册时机。
  • 注册过程中如遇问题,可通过官方交流群联系管理员协助处理。
  • 服务器严禁使用外挂、作弊模组、恶意破坏等违规行为,违者将严厉处罚,共同维护公平友好的游戏环境。

期待各位新玩家加入FMCRAFT,一起开启精彩的MC冒险之旅!

FMCRAFT
2026年4月27日

FMCRAFT 2026 年 5 月 新插件投票 & 管理选举大会

前言

基于现有发展状况,我们决定在 2026 年 4 月 26 日 至 5 月 5 日发布《FMCRAFT 2026 年 5 月 新插件投票 & 管理选举大会》相关投票。

新插件投票

关于

我们在 Spigot | SpigotMC - High Performance Minecraft Software 选择了一些可能适用于服务器的新插件。

我们会根据投票结果,进行新插件的安装。

投票完成之后,会进行测试,再进行第二轮投票。

警告整理,内容如下:

LevelledMobs

功能:给怪物加上RPG等级系统,怪物越强血量/攻击越高,掉落也更丰厚,生存更有挑战性!
插件链接:LevelledMobs | SpigotMC - High Performance Minecraft Software

Magic

功能:超酷魔法插件,魔杖、法术、技能、魔法装备全都有,秒变魔法RPG服!
插件链接:Magic | SpigotMC - High Performance Minecraft Software

GSit

功能:可以坐下、躺平、爬行、叠坐互动,主城聊天、拍照、休闲超好用!
插件链接:[GSit - Modern Sit (Seat and Chair), Lay and Crawl Plugin! - [1.16 - 26.1.2] | SpigotMC - High Performance Minecraft Software](https://www.spigotmc.org/resources/gsit-modern-sit-seat-and-chair-lay-and-crawl-plugin-1-16-26-1-2.62325/)

AntiPopup

功能:屏蔽聊天举报和烦人的系统弹窗,纯净游戏体验,不弹乱七八糟提示!
插件链接:✨ AntiPopup - No chat reports and Popup! ✨ | SpigotMC - High Performance Minecraft Software

Villager Market

功能:玩家商店系统,自己开村民店铺,买卖物品、做生意、搞经济超方便!
插件链接:Villager Market | The ultimate shop plugin | SpigotMC - High Performance Minecraft Software

投票链接

FMCRAFT 2026 年 5 月 新插件投票 – 填写表单

如果您的答卷理由充分、选择客观,您可以获得对应的积分奖励。

一旦发现刷票行为给予警告/封禁。

管理选举大会

关于

字面意思。

目前的管理员名单及选择理由:

管理员理由
121230指令
WinucAlan特别选择
kekele历届好评高、管理能力强
langke1145历届好评高、管理能力强
zlejdu有一定的运维经验

投票中,您可以选择撤下某位管理的权限或保持某位管理的权限,但是需要提供理由(如果选择了保持,可以复制上面的理由)。

额外的,您可以额外选择至多 3 位玩家成为管理,不允许自己,但是需要提供理由。

投票链接

FMCRAFT 2026 年 5 月 管理选举大会 – 填写表单

如果您的答卷理由充分、选择客观,您可以获得对应的积分奖励。

一旦发现刷票行为给予警告/封禁。

m3u8 下载器

简介

一款m3u8批量下载的软件,支持部分分分加密的m3u8文件,有些加密的应该是没办法搞定

当复制到链接的时候会自动粘贴进入,不需要自己手动点复制粘贴

其它信息如图,自己测试了还能用,不知道其他老铁们能不能正常用,有兴趣的可以源码查看修改.....

不喜勿喷

关于为什么要从吾爱复制这个东西,因为觉得这个东西是真的有用,然而有时又可能找不到

图片

mnvso78g.png

源代码

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import threading
import queue
import os
import time
import requests
import m3u8
from concurrent.futures import ThreadPoolExecutor
from urllib.parse import urljoin
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
 
# -------------------------- 配置项 --------------------------
DEFAULT_THREAD_NUM = 8
TIMEOUT = 15
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows 10; Win64; x64) AppleWebKit/537.36"
}
DEFAULT_PATH = os.path.join(os.path.expanduser("~"), "Desktop")
 
 
# ------------------------------------------------------------
 
class M3U8Downloader(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("M3U8批量下载器V0.1  By豪哥")
        self.geometry("570x450")
        self.resizable(False, False)
 
        # 全局变量
        self.save_path = tk.StringVar(value=DEFAULT_PATH)
        self.total_ts = 0
        self.finish_ts = 0
        self.msg_queue = queue.Queue()
        self.is_downloading = False
        self.key = None
        self.iv = None
        self.last_clipboard = ""
        self.thread_num = tk.IntVar(value=DEFAULT_THREAD_NUM)
        self.last_link = ""
 
        # 下载计时&速度统计
        self.start_time = 0
        self.total_downloaded_bytes = 0
 
        # 批量下载变量
        self.video_list = []
        self.current_video_idx = 0
        self.total_videos = 0
        self.remaining_videos = 0  # 剩余视频数量
        self.video_size = 0.00
 
        self.init_ui()
        self.check_queue()
        self.watch_clipboard()
        self.link_text.bind("<<Modified>>", self.on_link_changed)
 
    def init_ui(self):
        """初始化界面"""
        # ====================== 顶部按钮区域 ======================
        top_frame = tk.Frame(self, pady=5)
        top_frame.pack(fill=tk.X, padx=10)
 
        self.btn_path = tk.Button(
            top_frame, text="&#128194; 下载目录", command=self.select_save_path,
            width=12, font=("微软雅黑", 9)
        )
        self.btn_path.pack(side=tk.LEFT)
 
        self.label_path = tk.Label(
            top_frame, textvariable=self.save_path, fg="blue", font=("微软雅黑", 9)
        )
        self.label_path.pack(side=tk.LEFT, padx=5)
 
        self.btn_start = tk.Button(
            top_frame, text="&#9654;&#65039; 开始下载", command=self.start_batch_download,
            width=12, font=("微软雅黑", 9)
        )
        self.btn_start.pack(side=tk.RIGHT)
 
        # ====================== 进度条+百分比 ======================
        progress_frame = tk.Frame(self, pady=3)
        progress_frame.pack(fill=tk.X, padx=10)
        tk.Label(progress_frame, text="下载进度:", font=("微软雅黑", 9)).pack(side=tk.LEFT)
 
        self.progress_bar = ttk.Progressbar(progress_frame, mode="determinate", length=380)
        self.progress_bar.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
 
        self.progress_label = tk.Label(progress_frame, text="0%", font=("微软雅黑", 9))
        self.progress_label.pack(side=tk.LEFT)
 
        # ====================== M3U8链接列表 + 线程选择 ======================
        link_frame = tk.Frame(self, pady=5)
        link_frame.pack(fill=tk.X, padx=10)
        tk.Label(link_frame, text="M3U8链接列表(每行一个):", font=("微软雅黑", 9)).pack(anchor=tk.W)
 
        self.link_text = tk.Text(link_frame, height=4, font=("微软雅黑", 9))
        self.link_text.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
        self.link_text.edit_modified(False)
 
        # 右侧:线程数选择
        thread_frame = tk.Frame(link_frame)
        thread_frame.pack(side=tk.RIGHT, padx=5)
 
        tk.Label(thread_frame, text="下载线程:", font=("微软雅黑", 9)).pack(anchor=tk.N)
        self.thread_combobox = ttk.Combobox(
            thread_frame, textvariable=self.thread_num,
            values=[1, 2, 4, 8, 16, 32], state="readonly", width=5
        )
        self.thread_combobox.current(3)
        self.thread_combobox.pack(anchor=tk.N)
 
        self.btn_clear = tk.Button(
            thread_frame, text="清空", command=self.clear_link,
            width=6, font=("微软雅黑", 9)
        )
        self.btn_clear.pack(anchor=tk.N, pady=5)
 
        # ====================== 左右分栏布局 ======================
        bottom_frame = tk.Frame(self, pady=5)
        bottom_frame.pack(fill=tk.BOTH, expand=True, padx=10)
 
        # 左侧:视频统计信息
        self.stats_frame = tk.LabelFrame(bottom_frame, text="视频统计信息", font=("微软雅黑", 9), width=180)
        self.stats_frame.pack(side=tk.LEFT, fill=tk.BOTH, padx=(0, 5))
        self.stats_frame.pack_propagate(False)
 
        # ========== 【总视频 + 剩余视频】 ==========
        self.label_total_videos = tk.Label(self.stats_frame, text=f"总视频数:0", font=("微软雅黑", 8))
        self.label_total_videos.pack(anchor=tk.W, padx=5, pady=2)
 
        self.label_remaining_videos = tk.Label(self.stats_frame, text=f"剩余视频数:0", font=("微软雅黑", 8))
        self.label_remaining_videos.pack(anchor=tk.W, padx=5, pady=2)
        # ==========================================
 
        # 视频大小
        self.label_size = tk.Label(self.stats_frame, text=f"大小:{self.video_size:.2f} MB", font=("微软雅黑", 8))
        self.label_size.pack(anchor=tk.W, padx=5, pady=2)
        # TS总数/已下载
        self.label_ts_info = tk.Label(self.stats_frame, text=f"TS总数:{self.total_ts}/{self.finish_ts}", font=("微软雅黑", 8))
        self.label_ts_info.pack(anchor=tk.W, padx=5, pady=2)
        # 总下载速度
        self.label_speed = tk.Label(self.stats_frame, text="总速度:0.00 MB/s", font=("微软雅黑", 8))
        self.label_speed.pack(anchor=tk.W, padx=5, pady=2)
        # 已耗时
        self.label_cost = tk.Label(self.stats_frame, text="已耗时:00:00", font=("微软雅黑", 8))
        self.label_cost.pack(anchor=tk.W, padx=5, pady=2)
        # 预估剩余时间
        self.label_remain = tk.Label(self.stats_frame, text="剩余时间:--:--", font=("微软雅黑", 8))
        self.label_remain.pack(anchor=tk.W, padx=5, pady=2)
 
        # 右侧:运行日志
        log_frame = tk.LabelFrame(bottom_frame, text="运行日志", font=("微软雅黑", 9))
        log_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
 
        log_scroll = tk.Scrollbar(log_frame)
        log_scroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.log_text = tk.Text(
            log_frame, height=5, font=("微软雅黑", 8),
            yscrollcommand=log_scroll.set, state=tk.DISABLED
        )
        self.log_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        log_scroll.config(command=self.log_text.yview)
 
    def time_format(self, seconds):
        """秒数转换为 分:秒 格式"""
        if seconds < 0:
            return "00:00"
        m = int(seconds // 60)
        s = int(seconds % 60)
        return f"{m:02d}:{s:02d}"
 
    def on_link_changed(self, event):
        """链接框内容变化 → 自动更新总视频数"""
        self.link_text.edit_modified(False)
        links = self.link_text.get(1.0, tk.END).strip().splitlines()
        valid_links = [l.strip() for l in links if l.strip().startswith("http")]
 
        # 自动统计视频数量
        self.total_videos = len(valid_links)
        self.remaining_videos = self.total_videos
        self.update_video_count_labels()
 
        if self.is_downloading:
            return
 
        first_link = next((l.strip() for l in valid_links), "")
        if first_link == self.last_link:
            return
        self.last_link = first_link
        if not first_link:
            self.reset_stats()
            return
        threading.Thread(target=self.pre_parse_m3u8_info, args=(first_link,), daemon=True).start()
 
    def update_video_count_labels(self):
        """更新总视频数 / 剩余视频数"""
        self.label_total_videos.config(text=f"总视频数:{self.total_videos}")
        self.label_remaining_videos.config(text=f"剩余视频数:{self.remaining_videos}")
 
    def pre_parse_m3u8_info(self, m3u8_url):
        """预解析M3U8信息"""
        try:
            m3u8_obj = m3u8.load(m3u8_url, headers=HEADERS, timeout=TIMEOUT)
            temp_size = 0.0
            if m3u8_obj.playlists:
                new_url = urljoin(m3u8_url, m3u8_obj.playlists[-1].uri)
                m3u8_obj = m3u8.load(new_url, headers=HEADERS, timeout=TIMEOUT)
            temp_total_ts = len(m3u8_obj.segments)
            for seg in m3u8_obj.segments:
                temp_size += seg.duration * 0.5
            self.video_size = temp_size
            self.total_ts = temp_total_ts
            self.finish_ts = 0
            self.update_stats()
        except Exception as e:
            self.reset_stats()
 
    def reset_stats(self):
        """重置统计信息"""
        self.video_size = 0.00
        self.total_ts = 0
        self.finish_ts = 0
        self.total_downloaded_bytes = 0
        self.start_time = 0
        self.update_stats()
 
    def watch_clipboard(self):
        """监听剪贴板,自动换行添加链接"""
        try:
            content = self.clipboard_get().strip()
            if content != self.last_clipboard and content.startswith("http") and ("m3u8" in content):
                self.last_clipboard = content
                self.link_text.insert(tk.END, content + "\n")
        except:
            pass
        self.after(1000, self.watch_clipboard)
 
    def select_save_path(self):
        path = filedialog.askdirectory(title="选择保存目录", initialdir=DEFAULT_PATH)
        if path:
            self.save_path.set(path)
 
    def clear_link(self):
        self.link_text.delete(1.0, tk.END)
        self.total_videos = 0
        self.remaining_videos = 0
        self.update_video_count_labels()
        self.reset_stats()
 
    def write_log(self, msg):
        self.msg_queue.put(("log", msg))
 
    def update_progress(self):
        self.msg_queue.put(("progress", None))
 
    def update_stats(self):
        self.msg_queue.put(("stats", None))
 
    def download_finish(self):
        self.msg_queue.put(("finish", None))
 
    def check_queue(self):
        """刷新GUI(线程安全)"""
        while not self.msg_queue.empty():
            task, data = self.msg_queue.get()
            if task == "log":
                self.log_text.config(state=tk.NORMAL)
                self.log_text.insert(tk.END, f"[{time.strftime('%H:%M:%S')}] {data}\n")
                self.log_text.config(state=tk.DISABLED)
                self.log_text.see(tk.END)
            elif task == "progress":
                percent = int(self.finish_ts / self.total_ts * 100) if self.total_ts > 0 else 0
                self.progress_bar["value"] = self.finish_ts
                self.progress_label.config(text=f"{percent}%")
                self.label_ts_info.config(text=f"TS总数:{self.total_ts}/{self.finish_ts}")
                if self.finish_ts > 0 and self.start_time > 0:
                    cost_time = time.time() - self.start_time
                    speed_mb = (self.total_downloaded_bytes / 1024 / 1024) / cost_time if cost_time > 0 else 0
                    remain_ts = self.total_ts - self.finish_ts
                    remain_time = (remain_ts * cost_time) / self.finish_ts if self.finish_ts > 0 else 0
                    self.label_speed.config(text=f"总速度:{speed_mb:.2f} MB/s")
                    self.label_cost.config(text=f"已耗时:{self.time_format(cost_time)}")
                    self.label_remain.config(text=f"剩余时间:{self.time_format(remain_time)}")
            elif task == "stats":
                self.label_size.config(text=f"大小:{self.video_size:.2f} MB")
                self.label_ts_info.config(text=f"TS总数:{self.total_ts}/{self.finish_ts}")
                self.label_speed.config(text="总速度:0.00 MB/s")
                self.label_cost.config(text="已耗时:00:00")
                self.label_remain.config(text="剩余时间:--:--")
            elif task == "finish":
                self.is_downloading = False
                self.btn_start.config(state=tk.NORMAL, text="&#9654;&#65039; 开始下载")
                self.progress_label.config(text="0%")
        self.after(50, self.check_queue)
 
    def get_decrypt_key(self, key_uri, base_url):
        try:
            key_url = urljoin(base_url, key_uri)
            res = requests.get(key_url, headers=HEADERS, timeout=TIMEOUT)
            res.raise_for_status()
            return res.content
        except:
            return None
 
    def decrypt_ts(self, ts_data):
        if self.key is None:
            return ts_data
        try:
            cipher = AES.new(self.key, AES.MODE_CBC, self.iv or self.key)
            return unpad(cipher.decrypt(ts_data), AES.block_size)
        except:
            return ts_data
 
    def download_ts(self, ts_url, save_dir, index):
        """下载单个TS分片"""
        ts_name = f"{index:05d}.ts"
        ts_path = os.path.join(save_dir, ts_name)
        try:
            with requests.get(ts_url, headers=HEADERS, timeout=TIMEOUT, stream=True) as r:
                r.raise_for_status()
                ts_data = self.decrypt_ts(r.content)
                self.total_downloaded_bytes += len(ts_data)
                with open(ts_path, "wb") as f:
                    f.write(ts_data)
            self.write_log(f"下载:{ts_name}")
            self.finish_ts += 1
            self.update_progress()
        except Exception as e:
            self.write_log(f"失败:{ts_name}")
 
    def merge_ts(self, ts_dir, save_path):
        video_name = time.strftime("%Y%m%d_%H%M%S") + ".mp4"
        video_path = os.path.join(save_path, video_name)
        ts_files = sorted([f for f in os.listdir(ts_dir) if f.endswith(".ts")])
        with open(video_path, "wb") as out:
            for ts in ts_files:
                with open(os.path.join(ts_dir, ts), "rb") as f:
                    out.write(f.read())
        for ts in ts_files:
            os.remove(os.path.join(ts_dir, ts))
        os.rmdir(ts_dir)
        self.write_log(f"&#9989; 下载完成!文件地址:{video_path}")
 
    def parse_m3u8(self, m3u8_url):
        m3u8_obj = m3u8.load(m3u8_url, headers=HEADERS, timeout=TIMEOUT)
        self.video_size = 0.0
        if m3u8_obj.playlists:
            new_url = urljoin(m3u8_url, m3u8_obj.playlists[-1].uri)
            return self.parse_m3u8(new_url)
        self.total_ts = len(m3u8_obj.segments)
        for seg in m3u8_obj.segments:
            self.video_size += seg.duration * 0.5
        self.key = None
        self.iv = None
        if m3u8_obj.keys and m3u8_obj.keys[0]:
            key_info = m3u8_obj.keys[0]
            self.key = self.get_decrypt_key(key_info.uri, m3u8_url)
            self.iv = bytes.fromhex(key_info.iv[2:]) if key_info.iv else None
        return m3u8_obj, m3u8_url.rsplit("/", 1)[0] + "/"
 
    def download_single_video(self, m3u8_url):
        """下载单个视频"""
        try:
            self.start_time = time.time()
            self.total_downloaded_bytes = 0
            self.write_log(f"&#127916; 开始下载第 {self.current_video_idx} 个视频")
            m3u8_obj, base_url = self.parse_m3u8(m3u8_url)
            self.update_stats()
            if not m3u8_obj.segments:
                self.write_log("&#10060; 未找到视频分片!")
                return
            self.finish_ts = 0
            self.progress_bar["maximum"] = self.total_ts
            self.progress_bar["value"] = 0
            self.write_log(f"解析完成!总TS数:{self.total_ts}")
            ts_dir = os.path.join(self.save_path.get(), "temp_ts")
            os.makedirs(ts_dir, exist_ok=True)
            thread_count = self.thread_num.get()
            self.write_log(f"&#128640; 启动 {thread_count} 线程下载...")
            with ThreadPoolExecutor(thread_count) as executor:
                for idx, url in enumerate([urljoin(base_url, seg.uri) for seg in m3u8_obj.segments]):
                    executor.submit(self.download_ts, url, ts_dir, idx)
            self.merge_ts(ts_dir, self.save_path.get())
        except Exception as e:
            self.write_log(f"&#128165; 下载异常:{str(e)}")
 
    def batch_download_worker(self):
        """批量下载主逻辑"""
        try:
            links = self.link_text.get(1.0, tk.END).strip().splitlines()
            self.video_list = [link.strip() for link in links if link.strip().startswith("http")]
            self.total_videos = len(self.video_list)
            self.remaining_videos = self.total_videos
            self.current_video_idx = 0
            self.update_video_count_labels()
 
            if self.total_videos == 0:
                messagebox.showerror("错误", "请输入有效的M3U8链接!")
                return
 
            self.write_log(f"&#128229; 共加载 {self.total_videos} 个视频,开始批量下载")
 
            for url in self.video_list:
                self.current_video_idx += 1
                # ========== 【核心修改:开始下载前就 -1】 ==========
                self.remaining_videos -= 1
                self.update_video_count_labels()
                # ================================================
                self.download_single_video(url)
 
            self.write_log("&#127881; 所有视频下载完成!")
            messagebox.showinfo("完成", "全部视频下载成功!")
            self.clear_link()
 
        except Exception as e:
            self.write_log(f"批量下载异常:{str(e)}")
        finally:
            self.download_finish()
 
    def start_batch_download(self):
        """启动批量下载"""
        if self.is_downloading:
            messagebox.showwarning("提示", "正在下载中!")
            return
        self.is_downloading = True
        self.btn_start.config(state=tk.DISABLED, text="&#9208; 下载中...")
        self.log_text.config(state=tk.NORMAL)
        self.log_text.delete(1.0, tk.END)
        self.log_text.config(state=tk.DISABLED)
        threading.Thread(target=self.batch_download_worker, daemon=True).start()
 
 
if __name__ == "__main__":
    app = M3U8Downloader()
    app.mainloop()

我已经几年都没写文章了,今天来写一篇罢。

Main: 公开课

概述

公开课我觉得就是一个傻逼玩意儿
每次想到这个逼东西我就想吐,并非心理上,而是生理上,胃爆炸的了那种

为什么?
演戏罢了
全班演戏,老师演戏,校长演戏,连来听课的那几个傻逼也在演戏
所有人都知道自己在演,但所有人都装作没在演
你说这不是有病是什么

课前

傻逼老师:”同学们,明天的公开课很重要,关系到学校的评级“
好吧,开始傻逼了
班主任站在讲台上面,慷慨激昂,似乎叫我们去打仗
说难听点,班主任说的这些话让我认为好像这节课不上学校就会倒闭😂

他花了长达 20min 的时间布置任务
例如:

  • 谁坐哪
  • 谁在什么时候举手
  • 谁在门口喊“老师好”
  • 谁回答什么问题
  • 用哪只手举手

很明显,是个剧本
全部都安排的明明白白

  • “记住了吗?”
  • “记住了————”

好吧,看起来就是长音姐发力了
全班齐声回答,声音大到傻逼特朗普都听到了

平时上课我问你“记住了吗”你他妈屁都不放一个,现在倒是挺齐的啊?贱不贱啊?

最搞笑的是她说了一句:“大家一定要自然一点,千万不要像排练过一样。”
自然你大坝
他妈的蛋的你 让我背十遍答案,让我自然?
何意味
当我傻逼?

课时

早上一进教室,我还以为是我走错了教室
黑板擦得跟镜子似的,反光
讲台上摆了一盆花,假的
后面板报重新贴了一遍,颜色鲜艳得像他妈幼儿园
这种摆弄有什么意思呢?
应付检查?

班主任站在门口,穿着那件只有过年才穿的红外套,笑得跟朵菊花似的
“欢迎欢迎,老师们辛苦了——”
依旧震碎特朗普的耳朵
平时骂我们的时候,声音可不是这样的
听课的老师进来了,三个人,都戴着眼镜,手里拿着本子,一脸“我是专家”的表情
我演,你演,他演

开课了

“同学们好——“
“老师好————”

我操,这声音,比合唱团还正宗,平时这声”老师好“乱的要命,像一团死尸似的;然而今天不一样

老师开始提问了
第一个问题,照旧,课代表举手,标准姿势,五指并拢,手肘贴耳,回答的一字不差。废话,他昨天背了一晚上
突然,有一个人没按预期计划举手了... 老师给了他一个眼神,然后就放下了
第二个问题,举手
第三个问题,举手
全是安排好的
平时上课老师问个问题,全班低头,像集体猝死了一样;今天倒好,一个个抢着举手,跟直播间抢优惠券似的
我看着他们,觉得恶心
不是骂他们,是觉得这个场面恶心

所有人都在这演戏,演给那三个戴眼镜的傻逼看,那三个傻逼还真的在点头,还在本子上写东西,好像真的学到了什么了不起的教学方法一样
学你大坝
这场戏给谁看的?我们又学到了什么?学到了个几把
真实的,任何人都知道

好笑的

老师要写板书了。
她拿起黑板擦——一个新的,还包着塑料纸。
她愣了一秒。
然后她把那个新的放下,从抽屉里拿出旧的。旧的上面全是粉笔灰,灰扑扑的,边上缺了个角。
她用旧的擦了黑板。
粉笔灰落下来,落在她的袖口上。
那一刻我忽然觉得,这是整堂公开课里,唯一真实的东西。
但也就一秒。
下一秒她又笑了,又开始演了。

我并不是喜欢加标点符号,但是这里加了标点符号

课后

下课铃响了

  • “同学们再见”
  • “老师再见——————————”

合唱团 + 14514

听课老师站起来,和班主任握手 “这节课上得很好,学生状态特别棒”
班主任笑得跟花一样:“哪里哪里,还有很多不足”

不足你妈,你明明就是在等这句话

他们走了
关上门的那一刻,教室的气氛就变了

班主任的脸,垮了,声音也变了
“今天表现还行”她说,“但是——明天随堂测验,别以为公开课上完了就没事”

我就知道
这是肯定的
表演结束

最后

第二天,那个新的黑板擦被放回了抽屉

旧的又躺回了黑板槽里,灰扑扑的,上面还有昨天的粉笔灰

没人再碰它