[{"content":"","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/tags/terminal/","section":"Tags","summary":"","title":"Terminal","type":"tags"},{"content":"","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/tags/tmux/","section":"Tags","summary":"","title":"Tmux","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 tmux 新手全指南：会话、窗口、分屏、复制、恢复一次搞定 # 从インストール到进阶，把 tmux 的会话/窗口/窗格、复制模式、同步输入、設定与恢复完整讲清；覆盖 macOS、Linux、WSL，并配大量 SVG 示意图。\n你读完这篇，会从“只会开终端”变成“能稳定管理一堆后台任务”的人。tmux 的本质就一句话： 让你的终端永不下班 。最大的坑只有一个： 关窗口!= 退出会话 ，搞清楚“detach/attach”你就赢了一半。\n这篇是完整チュートリアル，带你从 0 建起可长期常驻的终端工作台，包含設定、恢复、同步输入、排错，以及大量图示。\ntmux 的四层结构 tmux 由 server 管理，内部是 session，再往下是 window，最底层是 pane。 tmux server session 会话 window 窗口 pane 窗格\n0. 准备：インストール tmux # 目的： 在你的システム上インストール tmux，并确认版本。\n操作：\nmacOS：\nbrew install tmux Ubuntu/Debian：\nsudo apt-get update \u0026amp;\u0026amp; sudo apt-get install -y tmux CentOS/Rocky：\nsudo yum install -y tmux Arch：\nsudo pacman -S tmux Windows（推荐 WSL2）：\nwsl --install 进入 WSL 后再用 apt インストール。\n你应该看到：\ntmux -V 输出类似 tmux 3.x 。\n失败怎么办：\ncommand not found ：确认包管理器是否存在，或在 WSL 内执行。 无权限：联系管理员或用有 sudo 的账户。 1. 先记住三件事：会话、窗口、窗格 # 目的： 知道 tmux 的三层结构，避免把“窗口”和“会话”混成一团。\nSession（会话） ：最大的容器，一般一个项目一个会话。 Window（窗口） ：会话里的多个“标签页”。 Pane（窗格） ：窗口里的分屏区域。 会话/窗口/窗格层级示意 一个 session 下包含多个 window，每个 window 下包含多个 pane。 Session: work Window 1: editor Pane A Pane B Window 2: server Pane A Session: lab 2. 启动你的第一个会话 # 目的： 作成一个会话，把任务放进 tmux。\n操作：\ntmux new -s work 你应该看到：\n进入一个新的终端界面 底部出现状态栏（默认绿色） 失败怎么办：\n提示已存在：换一个名字，或用 tmux attach -t work 直接进入。 会话启动流程 tmux new 作成会话，C-b d 退出，tmux attach 再次进入。 tmux new -s work 进入会话 C-b d detach 退出 tmux attach -t work 重新进入 3. 学会“detach / attach”这两个动作 # 目的： 让会话在后台继续跑，你断网/关机也不影响。\n操作：\n退出但不中断： Ctrl+b その後 d 確認会话列表： tmux ls 重新进入： tmux attach -t work 你应该看到：\ndetach 后提示： [detached (from session work)] tmux ls 有一行 work: 1 windows (created ...) 失败怎么办：\nno sessions ：説明当前没有会话，重新 tmux new -s work 。 4. 窗口操作：像浏览器标签一样切换 # 目的： 把不同任务拆成不同窗口。\n操作：\n新建窗口： C-b c 列出窗口： C-b w 切换窗口： C-b n / C-b p 重命名窗口： C-b , 你也できます用コマンド：\ntmux new-window -n editor 你应该看到：\n状态栏里窗口列表发生变化 失败怎么办：\n快捷键没反应：先按 C-b ? 確認当前键位，再试一次。 窗口像标签页 一个会话里できます开多个窗口，每个窗口是一个任务面板。 editor server logs 当前窗口内容 5. 窗格分屏：把一个窗口切成多个视角 # 目的： 一边跑服务，一边看日志/编辑。\n操作：\n垂直分屏： C-b % 水平分屏： C-b \u0026quot; 在窗格间切换： C-b o 或 C-b 方向键 关闭当前窗格：在窗格里执行 exit 或 C-d 你也できますコマンド方式分屏：\ntmux split-window -h 你应该看到：\n一个窗口被分成多个区域 光标只在一个窗格里活动 失败怎么办：\n分屏后太小：在コマンド模式输入 C-b : resize-pane -L 10 之类进行调整。 窗格分屏示意 一个窗口できます分成左右或上下的窗格。 Pane A Pane B Pane C 6. 前缀键与快捷键的基本逻辑 # 目的： 理解为什么要先按 C-b ，避免“按了没反应”。\ntmux 的控制コマンド都必要先按 前缀键 。默认前缀是 C-b （Ctrl + b）。按下前缀后，tmux 等待下一个键，决定执行哪个コマンド。\n你できます用下面コマンド確認当前前缀表：\ntmux lsk -Tprefix -N 前缀键流程 按下前缀键后，tmux 才会识别下一次按键为コマンド。 你按键 C-b 下一键 コマンド\n7. 复制模式与滚屏 # 目的： 在 tmux 里像终端一样向上翻历史并复制。\n操作：\n进入复制模式： C-b [ 移动光标：方向键 / PageUp / PageDown 开始选择： Space 复制并退出： Enter 粘贴： C-b ] 你应该看到：\n进入复制模式后，光标可移动 选中区域高亮 失败怎么办：\n选不中：你的键位可能是 vi 模式，执行 tmux list-keys -Tcopy-mode 確認当前绑定。 复制模式示意 进入 copy-mode 后できます滚动历史并选区复制。 选中的文本区域 copy-mode 光标移动中 8. 鼠标与滚轮支持（推荐开启） # 目的： 用鼠标滚轮滚屏、点击切换窗格。\n操作： 在 ~/.tmux.conf 加一行：\nset -g mouse on その後重载設定：\ntmux source-file ~/.tmux.conf 你应该看到：\n鼠标滚轮できます滚历史 点击窗格即可切换 失败怎么办：\n仍旧无效：确认你在 tmux 里（ [ -n \u0026quot;$TMUX\u0026quot; ] \u0026amp;\u0026amp; echo inside tmux ）。 鼠标滚动与切换 开启 mouse 后できます用滚轮和点击切换。 鼠标 滚轮滚屏 / 点击切换 9. 会话管理：用コマンド精准控制 # 目的： 管理多个会话，快速切换。\n操作：\ntmux ls tmux attach -t work tmux rename-session -t work ops 也できます用“存在即进入，不存在就作成”：\ntmux new -As work 你应该看到：\ntmux ls 显示所有会话 重命名后列表更新 失败怎么办：\n名字冲突：先 tmux ls 确认名称。 10. 同步输入：一条コマンド发给所有窗格 # 目的： 适合同时执行多台机器或多プロセスコマンド。\n操作：\n开启同步： C-b : その後输入 setw -g synchronize-panes on 关闭同步： C-b : その後输入 setw -g synchronize-panes off 你应该看到：\n输入的コマンド在多个窗格同时出现 失败怎么办：\n没反应：确认当前窗口有多个窗格。 同步输入示意 开启同步后，一条コマンド会广播到多个窗格。 Pane A Pane B Pane C 同一条コマンド广播 11. 設定ファイル：让 tmux 更顺手 # 目的： 固化你的常用习惯。\n操作： 新建 ~/.tmux.conf ，写入下面内容：\n# 允许鼠标 set -g mouse on # 更大的历史滚动 set -g history-limit 100000 # 把前缀从 C-b 改成 C-a（可选） set -g prefix C-a unbind C-b bind C-a send-prefix # 复制模式用 vi 键位（可选） setw -g mode-keys vi # 快速重载配置 bind r source-file ~/.tmux.conf \\; display-message \u0026#34;tmux reloaded\u0026#34; 重载設定：\ntmux source-file ~/.tmux.conf 你应该看到：\n状态栏弹出 “tmux reloaded” 失败怎么办：\n没提示：手动执行 tmux show -g history-limit 看設定是否生效。 設定加载流程 変更.tmux.conf 后通过 source-file 立即生效。 ~/.tmux.conf tmux source-file 立即生效 12. 进阶：多端同时连接同一会话 # 目的： 让两台设备同时看同一 session（适合リモート协作或手机备份）。\n操作： 在另一台机器上执行：\ntmux attach -t work 你应该看到：\n两个终端同步显示 在一个端输入，另一个端实时更新 失败怎么办：\n连接后把别人踢下线：用 tmux attach -d -t work ，确保你是主动接管。 多客户端连接 多个终端できます连接同一个 tmux 会话。 终端 A 终端 B 会话 work 13. 进阶：会话恢复（重启机器也能回来） # 目的： 机器重启后恢复之前的 tmux 布局。\n操作： 使用 TPM + tmux-resurrect/continuum。\nインストール TPM： git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm 在 ~/.tmux.conf 加： set -g @plugin \u0026#39;tmux-plugins/tpm\u0026#39; set -g @plugin \u0026#39;tmux-plugins/tmux-resurrect\u0026#39; set -g @plugin \u0026#39;tmux-plugins/tmux-continuum\u0026#39; set -g @continuum-restore \u0026#39;on\u0026#39; 在 tmux 内按 C-b I インストール插件。 你应该看到：\n底部出现インストール提示 重启后会话可恢复（需手动或自动） 失败怎么办：\n插件没装上：确认 ~/.tmux/plugins/tpm ディレクトリ存在。 会话恢复流程 tmux-resurrect 保存快照，continuum 自动恢复。 保存快照 システム重启 自动恢复 14. 常用快捷键速查（够你一周内上手） # 场景 快捷键 新建会话 tmux new -s name 退出但不中断 C-b d 新建窗口 C-b c 切换窗口 C-b n / C-b p 分屏（垂直/水平） C-b % / C-b \u0026quot; 切换窗格 C-b o 或方向键 复制模式 C-b [ 粘贴 C-b ] 確認快捷键 C-b ? 15. 排错清单（最常见的 6 个坑） # 快捷键没反应 ：确认先按 C-b ，再按目标键。 复制模式不好用 ：检查是否启用了 mode-keys vi 。 鼠标滚轮无效 ：确认 set -g mouse on 并重载。 分屏太小 ：用 resize-pane 调整，或把窗口拆成不同 window。 会话消失 ：确认是否误用了 kill-session 或 kill-server 。 WSL 无法滚动 ：更新 Windows Terminal/WSL，或开启 mouse。 もし你只记住一句话： tmux 是“会话常驻器” 。会话一旦建立，你的工作就不再依赖窗口是否开着。把它变成你的默认终端习惯，你就会自然进入长期高产的状态。\n","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/notes/tools/tmux_guide/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 tmux 新手全指南：会话、窗口、分屏、复制、恢复一次搞定 # 从インストール到进阶，把 tmux 的会话/窗口/窗格、复制模式、同步输入、設定与恢复完整讲清；覆盖 macOS、Linux、WSL，并配大量 SVG 示意图。\n","title":"tmux ガイド","type":"notes"},{"content":"","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/notes/tools/","section":"ノート","summary":"","title":"ツールとデプロイ","type":"notes"},{"content":"","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/notes/","section":"ノート","summary":"","title":"ノート","type":"notes"},{"content":"Welcome to my blog!!!\n","date":"2026年5月13日","externalUrl":null,"permalink":"/ja/","section":"響け！ユーフォニアム","summary":"Welcome to my blog!!!\n","title":"響け！ユーフォニアム","type":"page"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/notes/linux/","section":"ノート","summary":"","title":"Linux","type":"notes"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/tags/pty/","section":"Tags","summary":"","title":"PTY","type":"tags"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/tags/shell/","section":"Tags","summary":"","title":"Shell","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Shell、Terminal、TTY/PTY 的区别 # 简单来说つまり以下关系：\n人 ↓ 输入命令 终端模拟器 Terminal Emulator ↓ 提供一个“终端窗口” TTY / PTY ↓ 传递输入输出 Shell ↓ 解释命令并调用程序 操作系统内核 / 程序 1. Shell 是什么？ # Shell 是コマンド解释器。\n你输入：\nls -l cd Desktop python main.py 真正理解这些コマンド并执行的是 shell。\n常见 shell 有：\nsh 最早期的 Unix shell bash Linux 中很常见 zsh macOS 现在默认使用 fish 更现代、交互体验更好 powershell Windows 上常见 zsh,bash,fish 这些的不同之处つまり它们的语法、功能、交互体验不同，但它们都是 shell，都是コマンド解释器。 Shell 的作用主要是：\n读取你输入的命令 解析命令 执行程序 处理变量、管道、重定向、脚本 たとえば：\ncat a.txt | grep hello \u0026gt; result.txt 这里的 |、\u0026gt; 这些符号不是 cat 或 grep 自己理解的，而是 shell 解析的。\n2. 终端模拟器是什么？ # 终端模拟器是你看到的那个窗口。\n比如：\nmacOS Terminal iTerm2 Windows Terminal GNOME Terminal Konsole Alacritty Kitty WezTerm 它本身不是 shell。\n它的作用是：\n显示文字界面 接收键盘输入 显示程序输出 模拟传统终端设备的行为 启动一个 shell そのため你打开 macOS 的“终端”后，里面默认启动的可能是：\nzsh 打开 Windows Terminal 后，里面可能启动：\nPowerShell 或者：\nUbuntu WSL bash そのため：\n终端模拟器 ≠ Shell 终端模拟器是“窗口”，shell 是窗口里面実行的“コマンド解释器”。\n3. TTY 是什么？ # TTY 原本是 Teletypewriter，电传打字机。\n早期计算机没有现代显示器，用户通过一种像打字机一样的设备和计算机交互：\n你在机器上打字 计算机返回文字 机器打印出来 这种设备就叫 TTY。\n后来虽然物理打字机没了，但 Unix/Linux 仍然保留了この抽象：\nTTY = 一种终端设备接口 在 Linux 中你できます看到类似：\n/dev/tty /dev/tty1 /dev/tty2 /dev/pts/0 /dev/pts/1 其中：\n/dev/tty1, /dev/tty2 ... 通常是真正的虚拟控制台。\nたとえば在 Linux 里按：\nCtrl + Alt + F1 Ctrl + Alt + F2 进入的黑底登录界面，つまり比较接近传统意义上的 TTY。\n4. PTY 是什么？ # 你现在在图形界面的终端模拟器里用 shell，通常用的不是传统 TTY，而是 PTY。\nPTY 全称是：\nPseudo Terminal 伪终端 它是一对虚拟设备：\nPTY master ←→ PTY slave 关系大概是：\n终端模拟器 ↓ PTY master ↓ PTY slave ↓ shell 终端模拟器通过 PTY master 和 shell 通信。\nshell 以为自己连接的是一个真正的终端设备，但其实是一个伪终端。\nたとえば你在终端里実行：\ntty 可能看到：\n/dev/pts/0 この /dev/pts/0 つまり一个伪终端设备。\n5. 它们之间的关系 # 最常见的情况是：\n你打开 iTerm2 / Terminal / Windows Terminal ↓ 终端模拟器创建一个 PTY ↓ 终端模拟器启动 shell，比如 zsh/bash ↓ shell 绑定到这个 PTY ↓ 你输入命令 ↓ 终端模拟器把输入发给 PTY ↓ shell 收到命令并执行 ↓ 程序输出返回到 PTY ↓ 终端模拟器显示在窗口里 できます画成这样：\n+----------------+ | 用户 | +----------------+ | v +----------------+ | 终端模拟器 | | Terminal/iTerm2 | +----------------+ | v +----------------+ | PTY / TTY | | /dev/pts/0 | +----------------+ | v +----------------+ | Shell | | bash / zsh | +----------------+ | v +----------------+ | 命令 / 程序 | | ls, vim, python | +----------------+ 6. 举个具体例子 # 你打开 macOS Terminal，その後输入：\necho hello 实际发生的是：\n1. Terminal.app 打开一个窗口 2. Terminal.app 创建一个伪终端 PTY 3. Terminal.app 启动 zsh 4. 你输入 echo hello 5. zsh 解析这个命令 6. zsh 执行 echo 7. echo 输出 hello 8. 输出经过 PTY 返回 Terminal.app 9. Terminal.app 把 hello 显示出来 7. Shell 和终端最容易混淆的地方 # 很多人说：\n打开 shell 打开 terminal 打开命令行 日常说法里经常混着用，但严格来说：\n名称 本质 例子 Shell コマンド解释器 bash, zsh, fish, PowerShell 终端模拟器 图形窗口程序 Terminal, iTerm2, Windows Terminal TTY 终端设备抽象 /dev/tty1 PTY 伪终端设备 /dev/pts/0 Console 控制台，语义较宽 Linux 虚拟控制台、システム控制台 CLI コマンド行界面这种交互方式 git、npm、python コマンド 8. Terminal、Console、Shell 的区别 # Terminal # 更偏向“输入输出设备”或“终端窗口”。\n你通过 terminal 和程序交互。 Console # 历史上指“システム控制台”，通常更接近直接连接到机器的主控输入输出设备。\n现在很多时候 console 和 terminal 也会混用。\nたとえば：\nbrowser console game console system console 含义会根据场景变化。\nShell # 是里面真正处理コマンド的程序。\nterminal 负责显示 shell 负责解释命令 9. 为什么 Vim、Top 这类程序必要 TTY？ # 有些程序不是简单输出一行文字，而是必要控制整个屏幕，比如：\nvim top htop less nano ssh tmux 它们必要知道：\n终端有多少行多少列 光标在哪里 颜色怎么显示 按键是什么 Ctrl+C 怎么处理 这些能力都是通过 TTY/PTY 这套终端接口完成的。\nそのため你在某些环境里実行コマンド会看到：\nthe input device is not a TTY 意思つまり：\n这个程序需要一个交互式终端，但当前环境没有提供真正的 TTY/PTY。 たとえば Docker 里经常见到：\ndocker run -it ubuntu bash 这里：\n-i = interactive，保持标准输入 -t = 分配一个伪终端 TTY 没有 -t，有些交互程序就不好用。\n10. SSH 里的关系 # 当你 SSH 到サーバー时：\nssh user@server 关系大概是：\n本地终端模拟器 ↓ 本地 ssh 客户端 ↓ 网络 远程 ssh 服务端 ↓ 远程 PTY ↓ 远程 shell リモートサーバー上也会给你分配一个 PTY。\nそのため你在リモートサーバー実行：\ntty 可能看到：\n/dev/pts/3 11. tmux / screen 又是什么？ # tmux 和 screen できます理解成“终端复用器”。\n它们夹在终端模拟器和 shell 中间：\n终端模拟器 ↓ PTY ↓ tmux ↓ 多个 shell / 程序 它们的作用是：\n一个终端窗口里开多个会话 断开 SSH 后程序继续运行 分屏 恢复会话 そのため tmux 本质上也会大量使用 PTY。\n12. まとめ一句话 # 终端模拟器是你看到的窗口； TTY/PTY 是连接窗口和命令程序的终端设备接口； Shell 是真正解释并执行命令的程序； 命令行程序通过这套机制和你交互。 最核心的关系是：\n用户 → 终端模拟器 → TTY/PTY → Shell → 程序 → 操作系统 ","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/notes/linux/shell_terminal_tty_diff/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Shell、Terminal、TTY/PTY 的区别 # 简单来说つまり以下关系：\n","title":"shell・terminal・tty の違い","type":"notes"},{"content":"","date":"2026年5月12日","externalUrl":null,"permalink":"/ja/tags/tty/","section":"Tags","summary":"","title":"TTY","type":"tags"},{"content":" 関西旅行記⛺️ # はじめに # 事前に作成した関西旅行プランと関西旅行実行ガイドをもとに、2026年4月18日、私は広州からバスで香港国際空港へ向かい、翌日の人生初フライトに備えました。ここからいよいよ関西へ降り立ち、大阪、京都、奈良を巡り、現地の文化やグルメ、美しい風景を体験する旅の始まりです。\nDay 0（2026年4月18日） # チェックインと手荷物預け # 18日の夜8時過ぎ、深セン湾からイミグレーションを通過しました。同じく正佳から一緒に出発した方がいたので、その人についていくことにしました。しかし、税関を抜けた後、彼女が左に寄りすぎて運転手さんとすれ違いそうになるハプニングが。幸い人が少なかったおかげで無事に合流でき、車に乗り込むことができました。\n夜9時頃、香港国際空港に到着しました。\nまずは人の流れに沿って中に入り、空港のロビーへ。最初は空港内の環境や設備、人々の様子を観察しながら、全体の手続きの流れを把握しようと30分ほど歩き回りました。どうやらこの階でチェックインと手荷物預けを行うようです。吹き抜けのデザインになっていて、下の階は到着ロビーになっているため、ここからは直接降りられない構造でした。\n最初は「なぜ今の自動チェックイン機で自分の航空会社が見つからないのか？」と戸惑いましたが、スタッフに聞くと、奥の列に行かないといけないとのことでした。\n空港のチェックインカウンターは航空会社ごとに分かれています。自分の利用する航空会社に対応したエリアを探して手続きを行う必要があります。 その後、正しい列を見つけ、自動チェックイン機で手続きをしようとしたのですが、エラーが発生。スタッフから有人カウンターへ行くよう指示され、そこで無事にチェックインと手荷物預けを完了しました。その後は保安検査場へと向かいました。\n保安検査と搭乗 # 保安検査の流れは国内の空港とほぼ同じで、手荷物をトレイに乗せ、金属探知機を通るというものです。必要に応じてボディチェックも行われますが、特に問題なくスムーズに通過できました。\n検査後、案内板に従って搭乗口に到着。着いた時は搭乗口にほとんど人がおらず、「このフライト、全然人がいないのかな？」と勘違いしました。後で気づいたのですが、乗客のほとんどが香港の地元の方で、出発ギリギリになってから続々と集まってくるスタイルだったのです。\nそんな感じで空港で一晩を過ごしましたが、快適に眠れる場所もなく、寝入りばなにどんどん気温が下がってきて寒かったため、一睡もできませんでした。\nいよいよ搭乗の朝。搭乗前に香港空港での免税手続きを済ませようと思い、Global Exchangeのカウンターへ。 しかし、地元のスタッフが何を言っているのか分からず、ただ「免税できない」とだけ伝えられました。「どういう意味ですか？」と聞いても、英語の直訳のような返事が返ってくるだけ。 「いやいや、それじゃ意味ないでしょ！」こっちは理由を聞いているのに、そんな返答で問題解決になるわけがありません。これが彼らの“接客態度”のようです。😡\nDay 1（2026年4月19日） # 人生初の飛行機だったので、窓側の席を選びました。飛行機がゆっくりと離陸し、地面から離れて雲の中へ入っていく瞬間。窓から見下ろす街や風景がどんどん小さくなっていく景色は、本当に美しかったです。 空を飛んでいる3時間ちょっとの間、眠ろうとしましたがうまく眠れず、座っているだけで結構疲れました。最初は「飛行機ってこんなもんか、そんなに速くないな」と思っていましたが、後で電車に乗ってから初めて「やっぱり飛行機は速かったんだ」と実感することになります。\n日本の空域に入ると、海と街が山を囲むように広がっているのが見えました。まるでギャルゲーに出てくるような日本の田舎町に戻ってきた感覚があり、とても感動しました。\nPrevious Next 関西国際空港に到着 # 関空に到着後は、人の流れに乗って空港内のシャトルに乗り、入国審査のフロアへ。 ここで事前にネットで登録しておいたVisit Japan Web (VJW)のQRコードの出番です。進む途中に専用の端末があり、QRコードをスキャンして緑色のランプが点灯すれば先に進める仕組み。さらに案内用のディスプレイも至る所にあり、非常に便利で進んでいるなと感じました。手続きはとてもスムーズでした。\nその後、入国審査の列に並びます。ここの流れも基本的には同じです。\nしかし、初めての経験で人の流れにただ付いていってしまったため、外に出る直前になって「あれ？預けた荷物ってどこで受け取るんだっけ？」と完全に忘れていました。スタッフに聞こうにも、私の日本語は壊滅的だったので全く聞き取れず。そのままロビーに出てしまいました。 後になって戻る道を探すも見つからず。スタッフに聞くと「まっすぐ行って左」とのことでしたが、近くに行っても案内所らしきものがありません。仕方なく小紅書（RED）を開いて攻略法を検索。無事に「ある扉の奥に行ってスタッフに助けを求める」という解決策を見つけました。 こうしてスタッフの方に手伝ってもらい、無事に預け荷物を回収。いよいよJRはるかの駅を探して京都へ向かいます。\n無事にJRはるかに乗り込み、1時間ちょっと揺られて京都駅に到着しました。\n京都駅到着 # 京都駅に着いてから、Googleマップを見ながらホテルへ向かいチェックインしようと思ったのですが……。この京都駅、一体どういう設計になっているんでしょうか。まるで巨大な迷宮です。お店、電車の案内板、そして人混みで完全に頭がパニックに。最後は「ええい、マップ通りに進んでやる！」と半ばヤケクソで歩き、なんとか外に出られました。ホテルのチェックイン自体は問題なくスムーズに完了しました。\n前日からお風呂にも入っておらず、何も食べていなかったので限界でした。まずはコンビニでカップ麺を買い、2階の自販機をチェック。バスタブにお湯を張っている間にカップ麺をすすりました。お風呂上がりは最高に気持ちよかったです！ただ、フルーツ牛乳的なものが無かったのが少し心残りですね😂。\nさっぱりした後、夕食を探すことにしました。Geminiにオススメを聞いてみると東洋亭を提案されたので、小紅書でレビューを確認。評判が良かったので、おすすめされていたセットメニューを注文しました。\nハンバーグもあったのですが、写真を撮り忘れました。全体的な感想としては、「まあ普通に美味しいけど、そこまで感動するほどではないかな」というレベル。 おそらく、私がアニメ『食戟のソーマ』を見すぎて、料理へのハードルが異常に上がっていたせいだと思います😂\nお会計はこちら： お店を探したり迷ったりしていたせいで、食べ終わる頃には夜9時近くになっていました。ユニクロで服を買いたかったのですが、またしても迷子に。歩き回っているうちに薬局を見つけたので、口コミで評判の良かったLION PAIRとACNEIGEのニキビ薬を購入しました。効果が楽しみです。\n買い物を終えてホテルへ。帰り道、京都の夜は驚くほど静かで、人通りも少なく少し寂しい雰囲気でした。もっと地元の人が出歩いているのかと思いきや、見かけるのは欧米の観光客ばかり。空港から京都への道のりでも感じましたが、ここに来る観光客の多くは欧米人なんですね。これは私が抱いていた日本の第一印象を大きく覆すものでした。\nDay 2（2026年4月20日） # 貴船神社 # 事前の計画通り、この日の朝は貴船神社（きふねじんじゃ）へ向かいます。 前日早く休んだおかげで目覚めはバッチリ。セブンイレブンで400円くらいのおにぎり🍙とミネラルウォーターを買い、京都駅へ向かって地下鉄に乗ろうとしました。\n最初は本気で地下鉄だと思っていたのですが、駅構内で迷子になりスタッフに聞きながら案内板を追ってようやく理解しました。私が乗ろうとしていたのは地下鉄（メトロ）ではなく電車🚃だったのです。日本では地下鉄も含めて全部「電車」と呼ぶのだと思い込んでいたのですが、京都市内にはちゃんと地下鉄もあるんですね。京都駅にはあらゆる路線が集結していて、最初のうちは本当に混乱しました。さらに、中国の分かりやすすぎる案内に慣れきっていたせいで、日本の案内板のシステムに余計に戸惑ってしまったようです。 なんだかんだで30分も無駄にしましたが、ようやく電車に乗り込み、貴船神社への旅がスタートしました。\n日本のマナーは非常に良く、公共交通機関ではみんな自発的に並び、割り込みや押し合いはしません。「降りる人優先」「車内では静かにする」のが基本です。 乗ったのは叡山電鉄。春の息吹を感じる山の中へと入っていく路線で、ものすごくエモい雰囲気でした。途中で中国から来たと思われる女の子2人組がカメラで写真を撮っていましたが、私は周りの迷惑になりたくなかったので撮影は控えました。でも、あの風景はしっかり目に焼き付いています。\n貴船口駅に到着後、バスで直接神社へ向かうのではなく、あえて徒歩で山を登るルートを選びました。 理由の一つは、まだバスの乗り方（支払い方法など）に自信がなくビビっていたから。もう一つは、自分の足で登った方が「旅をしている感」があって神社の雰囲気をより味わえると思ったからです。道のりは長かったですが、沿道の景色がとても美しく、歩く価値は十分にありました。\n通常の参拝ルートは以下の通りです：入口 → 本宮 →（徒歩10～15分）→ 結社 →（さらに上へ）→ 奥宮。 これが基本ですが、途中で出会った日本人の女性は逆ルートで参拝していました。一気に奥宮まで登り、そこから結社、最後に本宮へと降りてくるスタイル。こういう自由な参拝方法も面白いですね。次回は私も試してみたいです。\n写真からも分かる通り、沿道の景色は本当に素晴らしく、歩いて登る価値アリです。\nまず到着したのは神社の本宮です。\n夕暮れ時にライトアップされるとすごく綺麗らしいのですが、夕方にここへ来るのは少し怖かったので断念。日本はよくクマ出没注意の看板があるのでビビってしまいました。\n本宮では有名な「水占みくじ」を体験。おみくじの紙を水に浮かべると文字が浮かび上がってくるというもので、初めて見たのでとても神秘的でした。しかも紙にQRコードが付いていて、スマホで翻訳結果が見られるというハイテク仕様😂\nさらに上へと歩き、結社に到着。ここは人が少なかったので、スマホで参拝の作法を検索して実践してみることにしました。本宮は人が多すぎて、作法を間違えて笑われるのが怖かったんです。\n手水舎を使わない基本的な参拝の作法：二礼 → 二拍手 → 一礼 そしてついに奥宮へ。雰囲気は下と似ていますが、大きな桜の木がありました。ただ、4月中旬だったため既に散っており、桜吹雪を見られなかったのが残念です。抹茶を楽しめる休憩所もありましたが、後で宇治に行く予定だったので、抹茶は本場で楽しむことにしてここでは我慢しました。\n瑠璃光院 # 貴船神社を出た時点で既にお昼の12時近く。予定ではご飯の時間でしたが、まだ瑠璃光院に行っていません。AIに「無駄のないルート」を相談した結果、「先に瑠璃光院へ行き、その後一乗寺でラーメンを食べる」というプランに決定しました。\n瑠璃光院は以前から動画などで見て知っていました。春の青もみじと秋の紅葉の時期に特別公開される名所です。混雑状況によっては事前予約が必要とのこと。\n私が行った時の拝観料は2000円で、併設の美術館も見学できました。\n靴を脱いで袋に入れ、中へ入ります。\n瑠璃光院は本当に息を呑むほど美しい場所なのですが、私の撮影技術が壊滅的なため、その美しさを完全には伝えきれません。まずは他の方が撮った素晴らしい写真をご覧ください。 そしてこちらが、私がお見苦しくも撮影した写真です：\n見学を終えて外に出ると、ある人からすみません、写真を撮っていただけませんか。と声をかけられました。「これ、日本に来る前からずっと自分が言おうと練習してたセリフじゃん！」と内心ツッコミを入れつつ😂\nいいですよ。と答えて、数枚写真を撮ってあげました。\nスマホを返し、立ち去ろうとすると、その方が「あなたも撮りましょうか？」というニュアンスの日本語（正確な言葉は忘れました）をかけてくれました。元々撮るつもりはなかったのですが、せっかくの好意なのでいいですよ。とお願いしました。撮り終わって階段を降りる時、不注意で足を踏み外しそうになり、慌てて大丈夫、大丈夫と言ったら、相手の方に笑われてしまいました（もちろん嫌な笑いではありません）。\nその後、一緒に道を下りながら少しお喋りしました。最初にどこに住んでいますか。と聞くと、\n彼女はフランスと答えました。発音が完全にネイティブだったので驚き、日本人ですかと尋ねると、やはり日本人で、ご家族と一緒にフランスから日本へ旅行に来ているとのことでした。その後「日本には何日いる予定？」と聞かれたのですが、「9日間」の日本語がパッと出てこず、記憶を探りながら適当に答えてしまい間違えました（彼女が訂正してくれましたが、緊張で頭が真っ白でした）。※正解は：ここのかかん\nうまく会話できない申し訳なさから、すみません、私の日本語はあんまり上手です。と言ってしまいました。(後になって気づきましたが、ここでも痛恨のミス。「上手ではありません」と言うべきでした…😭) それでも彼女は（お世辞かもしれませんが）いいえ、上手いよと言ってくれました。（最初は「うまい」の意味がピンときませんでしたが、すぐに褒め言葉だと理解しました）。とても嬉しかったです😊\nその後、彼女は美術館の中へ。もう少しお話したかったのですが、自分にチケットがあるか分からなかったので入りませんでした。後になって「あ、瑠璃光院のチケットに美術館の入場料も含まれてるって言われたわ！」と思い出し、また会えるかもと期待して中に入りました。（入る前にわざわざ「また会いましたね」の日本語を検索したほどです😂）。でも結局彼女は見当たらず、少しだけ見学して出てきました。\nでも、面白いものを見つけました：\n一乗寺 # 次は待ちに待ったご飯！ラーメン激戦区の一乗寺へ向かいます。あまり脂っこいものは避けたかったのでGeminiに相談すると、「中華そば高安」をおすすめされました。ここはスープが比較的あっさりしていてコクがあり、とても美味しかったです（ただ食後はかなり喉が渇きました）。\n一つ心残りだったのは、まだ初日で日本のマナーに慣れておらず、食後にごちそうさまでしたと言う習慣を知らなかったことです。少し勿体ないことをしました。\n食後は周辺を散策。有名な「恵文社」を見つけ、中にお客さんもいたのですが、なんとなくビビってしまい入れませんでした。これも初日ならではのチキンっぷりですね。\nそして次の聖地巡礼スポット、「鴨川の飛び石」へ向かいます。出町柳駅から徒歩10分ほどの場所にあります。\n電車を待っている間、「試運転」の表示を出した電車が来ました。誰も乗らないので不思議に思っていましたが、日本にも試運転の電車があるんですね。面白かったです。\n鴨川の飛び石（出町の飛び石） # 川辺の階段で、高校生の男女二人がトランペット🎺とサックス🎷を練習しているのを見かけました。「えっ、エモすぎん！？これが青春か！！」と感動し、思わず記録。\nPrevious Next この景色を見ていると、『たまこラブストーリー』でたまこと餅蔵が川辺にいるシーンを思い出します。 たまこが飛び石を渡り、その後ろで餅蔵が告白しようか躊躇い、最終的に告白してたまこが川に落ちるあの名シーンです。\n続いて、出町桝形商店街（たまこ商店街）へ。\n巨大なサバのオブジェは見当たりませんでした。食べ歩きできそうなスナックも少なく、外れの方にクッキーを売っているお店があったくらいです。ここの文房具屋さんでペンを何本か買い、日本の文房具屋の雰囲気を味わいました。\nその後、再び飛び石の場所に戻り、ベンチに座って休憩。川のせせらぎと人々の話し声を聞きながら風に吹かれていると、まるで日本アニメの世界に入り込んだような心地よさがありました。これぞ青春！\n京都駅に戻った後、Avantiにあるアニメイトへ。6階まで上がってみたのですが……えっ、狭っ！？ 私の想像とは全く違い、小さなラノベコーナーとグッズ、カードショップが合体しただけの空間でした。正直ガッカリです。 ラノベコーナーで『遊びのカンケイ』を探しましたが見つからず。女性店員に聞いても私の日本語が通じず、ずっと「画像を見せて」と言われ、マジで言葉を失いました。 結局、男性店員が奥から出してきてくれました。最終的に『負けヒロインが多すぎる！』3冊と『遊びのカンケイ』を購入しましたが、免税額に届かず。後ろに人が並んでいたので焦って、適当に『薬屋のひとりごと』を2冊追加しました（本当は『ノーゲーム・ノーライフ』が欲しかったのに）。\n『ノゲノラ』みたいな名作はもっと目立つところに置くべきでは！？\nというか、後で大阪の梅田店に行って気づいたのですが、この京都のアニメイトがショボいだけでした。梅田店はビル一棟まるごとアニメイトで、これこそが私の思い描いていたオタクの楽園でした。\nこの日の予定はこれで終了。帰りもまた京都駅で迷子になりました。本当にあの駅は迷宮です。夕食はコンビニや駅構内の売店で適当に買って済ませました。\nDay 3（2026年4月21日） # いよいよこの旅のメインイベント、宇治へ向かいます！『響け！ユーフォニアム』ファンにとって、ここは主人公・久美子たちの舞台となる絶対に外せない聖地です。\n予定より少し遅めに出発したため最初は焦りましたが、時間は十分間に合いました。\nまずは定番の伏見稲荷大社へ。到着した頃には既に人が多く、修学旅行生だらけでした。\n下まで降りてくると、ちょうどお祭りをやっていてとても賑やかでした。 今思えば、夜に来た方が雰囲気があって良かったかもしれません。（初日の京都駅の夜が静かすぎてビビってしまったのが悔やまれます）\n屋台で10円パンを購入。これがめちゃくちゃ美味しくて、忘れられない味になりました。大福も買いましたが、本当はお団子🍡が食べたかったのに売り切れていて残念。\nそしていよいよ、宇治へ向かいます！\n電車を待っている時、女性専用車両というものを初めて見て少し驚きました。\n宇治駅を出てすぐのところに宇治市観光案内所があり、そこで宇治観光マップをもらえます。 最初は勝手に持っていっていいか分からず、すみません、これ、写真を撮っていいですかと聞くと、スタッフさんが「持って行っていいですよ」と教えてくれました。どこから来たの？と軽く立ち話になり、またしても「日本語上手いね、びっくりした！」と褒められ、ニヤニヤが止まりませんでした😊\nこのマップは宇治の観光名所が網羅されていて便利ですが、「ユーフォのキャラが走っていた場所」のようなマニアックな聖地情報は載っていません。\nマップを頼りに宇治橋へ向かいましたが、紙の地図を読むのが苦手な私は結局Google Mapに頼ることに。この日の宇治は風が強く、それがまたアニメチックな雰囲気を醸し出していました。 昼間の宇治橋は撮り忘れましたが、夕暮れの写真はバッチリです：\nまずは宇治川沿いへ向かい、あの久美子ベンチへ！\nそのまま朝霧橋（部長失格橋）へ。\nその後、宇治神社、宇治上神社、平等院、そして大吉山といった王道の聖地を巡りました。\n大吉山を登っている途中、現地の女性からこんにちは。と挨拶され、心がほっこり😊 私も元気よくこんにちは。と返しました。\nそして、どうしても欲しかったのが京阪電車×響け！ユーフォニアムのコラボ一日乗車券。Grokにどこで買えるか調べてもらい、宇治からわざわざ淀屋橋駅まで大移動して1700円のコラボ乗車券をゲット！その後また宇治に戻り、JRで京都へ帰るという強行軍でした。\n乗車券を買いに行く道中で見つけたコラボパネルや自販機の数々。最高です。\nパネル：\nコラボ自販機たち（久美子、麗奈、奏、真由）： 駅へ向かう途中で、王道中の王道であるサイゼリヤや奏のバス停も発見！\nその他のコラボ要素：\nこの日は歩き回った割に観光地らしい場所にはあまり行かず、買い物もしませんでした。我が家で抹茶を飲むのは私だけなので、大行列の中村藤吉本店で抹茶パフェを食べるのは諦めました。でも、せっかくの機会なので並んででも体験しておけばよかったと少し後悔しています。\n京都駅に戻り、昨日と同じスーパーハーベス (Harves)で夜食を購入。店名を見ていなかったので記憶を頼りに探した結果、また迷子になり30分ロスするというアホな展開に。ここのシュークリームとパンを買いましたが、シュークリームが絶品でした！（写真撮り忘れ）\n参考画像： 今日の夕食はパンとシュークリーム、そしてコンビニで買ったお酒。\nこのお酒はアルコール度数が高すぎました。「ほろよい」のような乳酸菌系の甘い味を想像していたのですが、イマイチでした。\n「ほろよい」の白いサワーは本当に美味しいですね。もも味🍑を試さなかったのが心残りです。\n寝る前にユーフォの映画のチケットも無事予約完了！\nDay 4（2026年4月22日） # 本来の予定では豊郷町立豊郷小学校旧校舎群へ『けいおん！』の聖地巡礼に行くはずでした。 しかし、往復3時間という移動時間にビビってしまい、「短い滞在期間なのに、移動ばかりで終わっていいのか？もっと手軽な文化体験にするべきでは？」と迷った挙句、近場の奈良に変更してしまいました。\nいや、聖地巡礼こそが最高の文化体験であり没入感を得られる方法なのに、「遠いから」と妥協した時点で私の負けです。今さら言っても遅いですが、本当に行かなかったことを激しく後悔しています😔😔 奈良駅を出て商店街を歩いていると、中谷堂のような高速餅つきをしているお店がありました（本当に中谷堂だったのかは不明）。外国人が群がって動画を撮っていたので、人混みに飛び込む勇気が出ずスルー。\n奈良はひたすら鹿、鹿、鹿。人馴れしすぎていて全く物怖じしません。\n鹿がお辞儀をする姿には本当に驚きました！動画を撮れなかったのが残念。\n奈良でも修学旅行生に遭遇。これぞ青春です😭😭\nお昼ご飯は、人混みを避けてひたすら歩き回った結果、観光客が全くいない路地裏にある老夫婦が営む定食屋に入りました。\n洋食カツ丼を注文。味は「日本の普通の食堂の800円の味」という感じで、素朴で美味しかったです。\nその後京都に戻り、京都タワーに登って京アニグッズを買うか迷いましたが、前日に1700円の乗車券を買ったこともあり予算をケチって断念。小紅書で調べると「上まで行かなくても買える」という情報があったのですが、それすらもビビって行けませんでした。結局近くのAvantiでGUをぶらぶらして終了。\n夕食は京都駅で九十九うどん (つくもうどん)へ。食券機で買ってカウンターで受け取るシステムです。鶏卵カレーうどん＋鶏天を食べましたが、普通に美味しかったです。\n日本の食事って本当に「炭水化物＋炭水化物」が多くて、野菜🥬が全然ないからカロリー爆弾ですよね。\nDay 5（2026年4月23日） # 嵐山 竹林の小径 # この日は嵐山の竹林の小径へ。ここは『俺ガイル』の八幡が自爆した場所であり、『空の境界』の舞台にもなった立派な聖地です。雨にもかかわらずものすごい人でした。\n適当に撮った写真：\n日本のこういうシトシト降るウザい雨の中でも、修学旅行生は元気に歩き回っていました。\n見かけたお寺：\n周恩来総理の記念詩碑も発見：\n雨宿りしながら歩いていると、湖（川？）のほとりの東屋に到着。「ここ、『俺ガイル』で結衣が八幡に依頼した場所じゃん！」と興奮しましたが、例の小道は撮り忘れました。\n雨のせいかテンションも上がらず、駅周辺の屋台で肉まんじゅう（分厚い水餃子みたいなやつ）を食べて嵐山を後にしました。\n錦市場 # まだ時間が早かったので、「せっかく日本に来たのに何もしてない感」を払拭すべく、祇園四条の錦市場へ。ここは地元民よりも圧倒的に欧米の観光客が多かったです。\n途中でこんなものも見かけました。\nここも錦市場では有名なスポットなのかもしれません。\nここでたこ焼きを買いました。「4個で800円、8個で1000円」という強気な価格設定に「どういう計算！？」とツッコミましたが、いざ食べてみると8個は脂っこすぎてキツかったです。\nたこ焼きを食べた後は京都駅方面へ戻りました。この日は雨でかなり疲れていたので、早めにホテルへ戻ってアニメを見ながら休むことにしました。ただ、今思えば本当にもったいない時間の使い方でした。せっかく日本まで来たのだから、もっとちゃんと歩き回るべきだったと思います。 とはいえ、毎日かなり歩いていたので、8日間の旅程でも体力と精神力は完全には回復しません。あれは休息のために必要なサボりだった、と自分に言い聞かせつつも、やはり少し悔いは残ります。\nDay 6（2026年4月24日） # 京都水族館 # 今日は**『最終楽章 響け！ユーフォニアム 前編』**を見る日です！本当にワクワク！！ 正直に言います。私が今回関西旅行を企画したのは、すべてはこの映画を見るためです。（映画という「餃子のタレ」のために、関西旅行という「餃子本体」をわざわざ用意したようなものです笑）\nホテルから京都水族館への道中：\n道に全然人がいなくて、「日本の社会ってどう回ってるの？みんな仕事してないの？」と本気で不思議でした。\n小紅書のレビューでは「海遊館に比べて小さい」と不評でしたが、そもそも海遊館とはコンセプトが違うので無視して水族館へ。\nここにも修学旅行生が！4校くらい来ていました。\n入場料は2600円と少し高めですが、イルカショーまで見ると全然小さく感じません。オフシーズンに一人で来たら最高に癒やされる空間だと思います。\n水族館＋日本の女子高生の最強の青春コンボ写真：\nここからは水族館で撮った魚たちの写真です。\nPrevious Next ペンギンの写真。\nクラゲの写真。\nPrevious Next その他、館内で撮った写真いろいろ。\nそして、魚を見ている途中で、めちゃくちゃ可愛いメガネっ娘の日本の女子高生を見かけました。あまりにもエモくて青春だったので、思わず後ろ姿を撮ってしまいました。\nこれぞ青春だあああ😭😭😭\nこの一瞬の青春感は、もう完全に記憶の中へ封印するしかありません。中国語の原文では勢い余って base64 に気持ちを詰め込んでいますが、日本語版では「声をかける勇気が出なかった旅のワンシーン」として残しておきます。 最初は思い切って声をかけようか迷いました。日本の高校生と少しでも話せたら、旅の思い出として最高じゃないですか。 でも結局チキン発動で声をかけられず。イルカショーの後にもう一度見かけるかなと思いましたが、映画の時間が迫っていたため、そのまま水族館を後にしました。\nイルカショーも大満足でした！\nPrevious Next MOVIX 京都 # 水族館の後はバスで四条のMOVIX 京都へ。人生初の日本の路線バスでしたが、iPhoneと小紅書の攻略法のおかげで余裕でした。\n映画の前に腹ごしらえ：\nグッズ売り場で「ボイス付きアクリルスタンド」を探したのですが、売り切れなのか置いておらず、クリアファイルとキーホルダーだけ買いました。\n記念撮影：\nMOVIX京都の周辺。\nコナンくんの映画の宣伝がものすごくて、圧倒的な覇権ジャンルっぷりを見せつけられました。\nユーフォの3期は演奏シーンが少なかったり、原作からの改変（久美子がソリを吹かない）があったりと複雑な心境でしたが、今回の前編は8分間もの濃厚な演奏シーンがあり、本当に最高でした！感動！\n京都大学 # 映画の後は時間が余ったので、バスで京都大学周辺へ。\n華南師範大学より建物が古く、キャンパスが分散している印象を受けました。\n京都大学の百周年時計台記念館は撮り忘れました。\n大学の近く（西部講堂？）でイベントをやっていたので、少し写真を撮りました。\nその後も周辺を少し歩き、何枚か写真を撮りました。\n最後は京都駅へ戻り、コンビニで適当に買い物をしてホテルで休みました。\nDay 7（2026年4月25日） # この日は京都から大阪へ移動する日です。前日に買った京阪電車のコラボ一日乗車券を、ここでようやく使うことになります。 ホテルから京阪電車に乗るには、スーツケースを引きながら1キロ以上歩いて東福寺駅へ向かい、そこから淀屋橋駅まで移動して、さらに大阪市内の地下鉄に乗り換える必要がありました。\n地下鉄の駅を出ると、こんな景色が広がっていました。\nそのまま宿泊先の東横INNへ向かいました。ホテルは大阪のビジネス街にあり、かなり栄えているエリアでした。ただ、梅田の店舗ほどの立地ではないのかもしれません。\nホテル近くの公園 # チェックインと荷物預けを済ませた後、ホテル近くの公園を少し散策しました。\nベンチに座っていると、隣にいたおじいちゃんに話しかけられました。訛りが強くてほとんど聞き取れなかったのですが、いっぱい、WIFI、携帯電話、データ といった単語だけは分かりました。 しばらくしてようやく、スマホのデータ通信量を使い切ってしまい、ネットに繋がらないので近くにWi-Fiがないか聞いているのだと理解しました。私がスマホを2台持っていたので、助けを求めて声をかけてくれたようです。 10分ほどカタコトでやり取りした後、お礼に「ももミルク」をくれました。アニメに出てくるいちごミルクの仲間みたいで、ちょっと嬉しかったです。\n大阪城公園 # その後は大阪城公園へ向かいました。とにかく広く、地元の人がジョギングしたり散歩したりしている姿も多く見かけました。\n途中で見かけた大阪NHKの建物。\n大阪城公園の写真です。\n園内にはコナンのコラボショップもありました。コナン、どこに行っても強すぎます。\n豊臣秀吉像：\n以前、Bilibiliかどこかで見た江ノ島駅の「服を着た小鳥」の大阪版らしきものも発見しました。\n江ノ島駅の小鳥（クリックで参照元へ） なんば # MOVIX京都で買えなかった映画館コラボのボイス付きアクリルスタンドを探すため、大阪の映画館も回ってみることにしました。まず向かったのはなんばパークスシネマです。\n道中では路上ライブが行われていました。\n映画館のグッズ売り場に行ってみると、やはり目当てのアクスタはありませんでした。歩き疲れて、もう他の大阪の映画館を回る気力もなくなり、外のテラス席で休憩することにしました。そこでもライブイベントが行われていて、4月29日に京都駅でTRUEさんが出演するイベントもこんな感じなのかな、と少し想像しながら音楽を聴いて休みました。\n20分ほど休んだ後、今度は5500円の服を買うかどうか迷いながら、もう一度ショップを見に行きました。正直、ユニクロの服が1900円くらいなのにこれは高すぎるだろ、と思ってかなり悩んでいました。\nすると、さっきまでなかったアクスタが1つだけ追加されているではありませんか。しかも最後の1つ。これはもう迷っている場合ではないと思い、即購入しました。4550円と高額でしたが、ボイス付きのアクスタなんて本当に珍しいので、これは取るしかありません。\n心斎橋 # 最後に、オタク仲間に頼まれて近くのアニメイトでCDを探すことにしました。大阪のアニメイトに行って初めて気づきました。「京都のアニメイトが小さかっただけだ。大阪のアニメイト、デカすぎ！！」\n店内の雰囲気はこんな感じです。\nまた、街中では店の宣伝や客引きをしている女の子たちも見かけました。京都では全く見なかったので、関西にはあまりないのかと思っていたのですが、単に京都が伝統的で、大阪の方がこういう繁華街らしい雰囲気が強いだけなのかもしれません。\n昼食をまともに食べていなかったので、早めに何か食べることにしました。AIに聞いたところ、Madras Curry (マドラスカレー)をおすすめされたので行ってみました。 量が本当に多く、小盛りでも十分お腹いっぱいになります。写真は撮り忘れましたが、行くなら普通に小盛りで十分です。隣の人が中盛りを注文して、カレーまできれいに完食していたのにはマジで言葉を失いました🤯。\nその後は大阪の街をぶらぶら。大阪は京都とは全く違い、夜になっても人が多く、街全体に活気がありました。\n最後はホテルに戻って休みました。京都のホテルと比べると、こちらの方が部屋は少し広かったです。ただ、設備の新しさでは京都のホテルの方が上だった気がします。\nDay 8（2026年4月26日） # この日のメインは大阪大学の見学です。\nホテルの朝食 # ホテルの朝食は、小さなパン、おにぎり、コーヒー、少し酸味のあるオレンジ色の飲み物、緑色の野菜ジュースっぽい飲み物、そして味噌汁など。思ったより美味しく、東横INNはかなりおすすめできるホテルだと感じました。\n大阪大学 # 大阪大学へ向かう途中、地下鉄でまた少し混乱しました。電車を待っている間も、「やっぱり奈良の日に豊郷町立豊郷小学校旧校舎群へ聖地巡礼に行くべきだったのでは」と後悔がぶり返していました。\n大阪大学は郊外にあり、中国でいう大学城のような雰囲気でした。ただ、敷地の広さは大学城の大学2つ分くらいありそうです。大学へ向かう道も、とても日本アニメっぽい雰囲気がありました。\n大阪大学の入口。\n掲示板：\n案内板：\nキャンパスの景色と学生運動の名残らしきもの。\n見学後、万博記念公園の太陽の塔に行こうとしたのですが、入り口が分からず、有料っぽいので断念しました。 その後、地下鉄で梅田方面へ向かいます。車内で大学生っぽい人を見かけました。\n梅田 # 梅田に戻ると、ルミシェリー (Lumi Cherie)という地下アイドル？がチェキ会をやっていて大盛況でした。\n親からの「日本に行ったら鰻を食え」というミッションを果たすべく、「鰻の成瀬」でうな重を堪能。\n食後、近くに縁結びの神社があったので少し散策しました。\nその後、梅田スカイビル 空中庭園展望台へ向かいました。\n途中で見かけたもの。\n到着してみると、人はそこまで多くありませんでした。観光客もちらほらいて、インド系の方も見かけました。\n上に登ってもスマホでしか写真を撮れず、入場料もかかるので、結局展望台には上がりませんでした。少し休憩してから、MARUZEN \u0026amp; ジュンク堂書店 梅田店へ向かいます。\nその後、「MARUZEN \u0026amp; ジュンク堂書店 梅田店」へ。 この書店は本当に巨大でした。雑誌、小説、名著、参考書、専門書まで何でも揃っています。コンピュータ書の棚にはCopilotやGPTの使い方を解説した本まであり、少し不思議な気分になりましたが、年配の方などにはこういう本も需要があるのだろうと思います。 それ以上に驚いたのは、RustやLinux eBPFの専門書まで普通に置いてあったことです。O\u0026rsquo;Reillyの本も多く、日本の出版文化の厚みに圧倒されました。 しかも最上階には駿河屋まであり、これは完全に予想外でした。\nその後ホテルに戻り、またコンビニで夜食を買いました。\nこのミルクプリン🍮には本当に驚きました。 蓋にプリンがくっつかない仕様になっていて、舐める必要がない！ 日本の細部へのこだわりに感動。しかもめちゃくちゃ美味しかったです。初日から毎日食べなかったことを激しく後悔しました。\nDay 9（2026年4月27日） # ついに帰国の日です。朝はいつも通りホテルで朝食を食べ、チェックアウトして荷物を預けました。大阪は買い物以外だと、個人的にはそこまで行きたい場所が残っていなかったので、飛行機の時間まで大阪城公園周辺をもう一度散策することにしました。\n道中でまた見かけたNHKの建物。\n近くにあった古い雰囲気の建物。\n芝生では幼稚園の先生が子どもたちを連れて遊んでいました。\n大阪城公園と高校に何か関係があるのでしょうか。\n適当に撮った景色。\n結局、特に行く場所もなく、ホテル近くの公園に戻って日本での最後の時間をぼんやり過ごしました。 この日もまだ、なぜ豊郷町立豊郷小学校旧校舎群へ『けいおん！』の聖地巡礼に行かなかったのかと後悔していました。4時間かかっても今日行けるなら行こうと調べてみましたが、月曜日は休館日。しかも前日はイベントもあったようです。 こんなに後悔するくらいなら、昨日『けいおん！』聖地巡礼に行き、今日大阪大学を見学すればよかったです。月曜日なら大阪大学にも人が多かったはずですし。\nその後も公園やホテル周辺をうろうろしながら、街の様子や食べられそうな店を見て回りました。最終的に、迷った末にごんべという店に入りました。\nここも年配のご夫婦が営むお店でした。店に入っても特に「いらっしゃいませ」がなく、どう座ってどう注文すればいいのか少し不安になりました。とりあえず入口近くの席に座ると、何を食べるか聞かれたので親子丼を注文。お茶を出してもらい、料理を待ちました。\n待っている間にGoogle Mapsの口コミを見てみると、「挨拶がない」「親子丼の量が少なく、鶏肉が数切れしかない」といったコメントがありました。一方で、静かで落ち着く、気を使わずに食べられるという好意的な口コミも多かったです。\n料理が出てきて見てみると、確かに鶏肉は少なめで、4切れほどしかありませんでした。卵は美味しかったのですが、800円でこれだと少し物足りない気もしました。\n仕方なく公園でぼーっとしていると、昼の1時なのにもう小学生が下校していました。早すぎない？\n水鉄砲で遊んでいる子どもたち3人組がいて、水をかけられたので「日本の子どもか…」と思ったら、バリバリの中国語を喋っていてさすがにツッコミそうになりました。\nせっかくなら声をかけて、日本での生活や学校のことを少し聞いてみればよかったかもしれません。\nその後、別の公園にも少し寄りました。\n最後にホテルへ戻って荷物を受け取り、空港へ向かいました。\nところが、天王寺でJRはるかに乗ろうとしたところ、Trip.comで買っていた指定席の時間が過ぎており、指定席が無効になっていました。仕方なく自由席に座れるか賭けることにしました。空港での手続きに不安もあったので、次の便を待たずにそのまま乗車。幸い、料金的にはそこまで損した感じではありませんでした。\n乗車後しばらくすると、車掌さんが6、7人の外国人乗客と何か話していました。なぜか追加料金を払う必要があったようで、30分ほどやり取りしていました。 車内には空港へ向かう中国人も2人ほどいて、その中に白いマスクをしたとても綺麗な女性がいました。写真を撮れなかったのが残念です。空港に着いてから、彼女が春秋航空で上海へ帰る人だと分かり、少し惜しい気持ちになりました。\nいよいよ搭乗です。\nさよなら日本！\nDay 10（2026年4月28日） # 3時間ほどのフライトを経て、深夜0時過ぎに香港空港へ到着しました。そして、ここでまた一晩を過ごすことに。正直、眠るのはかなり難しく、かなりしんどい夜でした。\n香港空港で荷物受け取りがない場合、急いで入国せず、制限エリア内にあるシャワールームを使うと快適です。外のロビーより環境が良いですよ。 朝5時半から6時頃、深夜に小紅書で見つけた攻略を頼りに、該当するバス停へ向かいました。私はモバイル通信が使えず、しかも下車地点にも少し不安があったので、近くにいた人に声をかけてみました。\nちょうどその人も広州へ戻るところでした。ただし、彼は深セン湾口岸へ向かう予定で、私は当初、福田口岸から高速鉄道で学校へ戻るつもりでした。それでも親切そうな方だったので、一緒に帰ることにしました。 バスの中で少し話し、うとうとしようとしたところ、気づけば一駅乗り過ごしていました。仕方なく作戦変更して、別のバスに乗り換えることになりました。\nバスを待っている間、近くに「ペットトイレ」と書かれた公園がありました。\n香港の気候は広州とほとんど同じで、蒸し暑くてかなりしんどかったです。\n最終的には永東のバスに乗り、広州へ戻ることができました。\nただ、広州に戻ってから黄埔区で大渋滞に巻き込まれました。帰国早々この光景を見せられて、疲れも相まってかなり参りました。休日でもなく、退勤時間でもないのにここまで渋滞するのかと、帰国早々日本のストレスフリーな交通機関が恋しくなりました。\nおわりに # 午後1時過ぎ、無事に寮に到着し、これにて関西旅行は完結です！\n数々の心残りや後悔はありますが、特に4/29の京都駅でのTRUEさんのライブと宇治・太陽が丘公園のサンフェスを逃したのは痛恨の極みです😭😭😭\n告知が出たのが3月末〜4月中旬で、その頃にはもう航空券もホテルも変更不可でした。もう少し告知が早ければ予定をずらしたのに……！！！😭😭😭\n最後に、今回の戦利品です：\n","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/life/travel/kansai-trip/","section":"生活","summary":"関西旅行記⛺️ # はじめに # 事前に作成した関西旅行プランと関西旅行実行ガイドをもとに、2026年4月18日、私は広州からバスで香港国際空港へ向かい、翌日の人生初フライトに備えました。ここからいよいよ関西へ降り立ち、大阪、京都、奈良を巡り、現地の文化やグルメ、美しい風景を体験する旅の始まりです。\n","title":"関西旅行記⛺️","type":"life"},{"content":"","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/life/","section":"生活","summary":"","title":"生活","type":"life"},{"content":"","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/tags/%E6%97%A5%E6%9C%AC/","section":"Tags","summary":"","title":"日本","type":"tags"},{"content":"","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/tags/%E6%97%A5%E6%9C%AC%E6%97%85%E8%A1%8C/","section":"Tags","summary":"","title":"日本旅行","type":"tags"},{"content":"","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/categories/%E6%97%85%E8%A1%8C/","section":"Categories","summary":"","title":"旅行","type":"categories"},{"content":"","date":"2026年5月2日","externalUrl":null,"permalink":"/ja/life/travel/","section":"生活","summary":"","title":"旅行","type":"life"},{"content":" 🎌 関西 9日8泊 聖地巡礼と文化巡遊の最終手冊 # 📌 出発前・到着時の重要メモ # 交通系 IC チャージ： 到着前に Apple Wallet の ICOCA へ 15,000円チャージしておく（Mastercard/Amex/JCB 使用）。 HARUKA 発券： 関西空港 JR 駅の緑色券売機 ➔ 繁体中国語を選択 ➔ QR コードをスキャン ➔ パスポート原本をスキャン ➔ 紙の切符を受け取って入場。 映画初日座席指定（最重要！）： 4月21日/22日 深夜0:00、MOVIX 京都公式サイトで 4.24 の初回上映座席を時間通りに取る。支払い時は「ムビチケ」を選び、実物カード裏面の10桁購入番号と4桁暗証番号を入力。実物カードは必ず自分で保管。現地ではスマホ内の QR コードを発券機で読み取って発券するだけ！ 免税原則： “一般物品”（服、本、スマホ、風鈴、ポストカード）は5,000円以上で免税、その場で開封・使用可能。 “消耗品”（薬妆、食品）は免税後絶対に開封不可。 **お土産の大物は全部、関西空港の保安検査後に買う。**荷物重量に入らず、そのまま免税。 究極の免税・避坑ガイド（Tips） 1. 二つの免税方式の比較 # 方式 手順 よくある場所 利点・注意点 直接免税（第一候補） 会計時に店員がパスポートを読み取り、10%の消費税を差し引く。残額を支払う。 Uniqlo, GU, 大国薬妆, 各種ドラッグストア, Yodobashi 最も楽。追加費用なし。 購入後退税 税込み全額を先に支払い、レシートと商品を持って百貨店の“免税カウンター (Tax Free Counter)”へ行き、現金またはカード返金を受ける。 高島屋, 大丸, 伊勢丹などの大型百貨店 百貨店側が約1.55%の手数料を取るため、実際の返金は約8.45%。混雑時は長く並ぶ可能性あり。 2. 免税の核心条件（絶対覚える） # 金額： 一人が同じ店舗で、同じ日に購入した金額が **5,000円（税抜）**以上であること。 証明書： パスポート原本が必須。店員が入国スタンプ/証明部分を読み取る。コピーや写真は絶対不可。 3. “一般物品” と “消耗品” の致命的な違い # 一般物品（服、ライトノベル、中古 iPhone、電子製品）： 免税会計後、そのまま開封して使用可能。買った服をすぐ着られる。 消耗品（薬妆、お菓子、飲料）： 免税会計後、店員が免税表示入りの透明な密封袋に入れる。日本国内では絶対に開封してはいけない！ 開封すると出国時の確認で10%消費税の追納を求められる可能性がある。 4. 中古 iPhone 避坑メモ # 日本で販売される iPhone は、サイレント設定でも写真撮影時に必ずシャッター音が鳴る（盗撮防止の法律による）。購入前にこの点を理解しておく。後で国内利用時に特定の方法で回避することは可能。 本体に大きな打痕がないか、画面端が劣化して黄ばんでいないか確認する。 📅 日別詳細行程と実操作ガイド # Day 1（4.19）：京都到着、チェックインと装備更新 # 08:00 - 12:45： 香港出発、関西国際空港（KIX）到着。 13:30 - 14:30（発券と乗車）： “鉄道”の案内表示に従って JR 関西空港駅へ向かう。 このリンクで QR 乗車の流れを学べる。 主に赤い改札を見る。 16:00 チェックイン： 京都第一ホテル ➔ 荷物を置き、身軽に出発。 17:30 装備調達： * 京都アバンティ (Kyoto Avanti) ➔ GU と Workman を見る。 * イオンモールKYOTO ➔ Uniqlo で U シリーズ白 T シャツを買う。大垣書店でライトノベルを数冊買い、会計時にCover onegaishimasuと言ってブックカバーをもらう。 19:00 夕食： 東洋亭 京都ポルタ店 ➔ 名物のアルミホイル包みハンバーグセットは必食。 20:30 日用品補給： ホテル近くのダイコクドラッグでライオン PAIR Acne 祛痘膏 (ペアアクネクリームW)などの消耗品を買う。 Day 2（4.20）：叡山電車北線（自然と日常系アニメ巡礼） # MOVIX 京都公式サイトで座席指定すること：E10 または F10 優先、4.24 の初回上映。支払い時は「ムビチケ」を選び、実物カード裏面の10桁購入番号と4桁暗証番号を入力。実物カードは必ず自分で保管。現地ではスマホ内の QR コードを発券機で読み取って発券するだけ！ 08:30 朝の森系： 貴船神社 ➔ 朝光の中の赤灯籠を撮る。 11:30 春の新緑： 瑠璃光院。 13:00 ギーク昼食： 麺屋 極鶏 または 天天有 本店。 14:30 🎐 文創購入： 恵文社一乗寺店 ➔ 世界で最も美しい書店の一つで、独立作家のポストカードや綺麗なしおりを選ぶ。 15:30 聖地巡礼： 鴨川デルタ ➔ K-ON! の飛び石。 出町桝形商店街 ➔ たまこマーケットのモデル。 必食：出町ふたばの豆大福。 18:00 夕食： 鳥貴族 京都駅前店 ➔ 全品均一価格の居酒屋。 Day 3（4.21）：京吹の本番（宇治深度巡礼） # 💡 連動任務： 京阪駅で「京阪電車×響け！ユーフォニアム2026春 1日乗車券」（1700円）を購入。全行程でスマホ GPS をオンにし、公式特設ページで歩きながらデジタルスタンプを集める。 08:00 混雑回避： 伏見稲荷大社。 11:30 宇治到着と昼食： 中村藤吉 本店 ➔ 抹茶そば + パフェ。ついでに高級煎茶/抹茶粉を数袋買って家族や年長者へのお土産にする。 14:00 - 17:00 吹奏部巡礼： グッズ購入：宇治市観光センター ➔ 紙の“舞台探訪MAP”をもらい、『京吹』限定ポストカードを購入。 核心場面：宇治橋 ➔ 宇治上神社 ➔ 久美子ベンチ。 17:30 黄昏チェックイン： 大吉山展望台 ➔ 夕暮れの名シーンを見る。 足りないもの、漏れているものがあれば、スマホに保存してある宇治のネット画像を確認する。 19:30 夕食： 京都勝牛 京都駅前店 ➔ サクサクの牛カツ。 Day 4（4.22）：奈良千年古都（文化遺産と境界の彼方） # 09:30 奈良到着： 近鉄奈良駅。 10:00 聖地チェックイン： 猿沢池 ➔ 栗山未来の実景地。 10:30 世界遺産： 東大寺。 12:00 名物昼食： 志津香 釜めし 公園店 ➔ 奈良名物釜飯。 14:00 鹿と神道： 奈良公園 ➔ 春日大社。春日大社で学業成就御守を求め、7月の日本語試験と将来の修士入試の合格を祈願する。 16:00 古い町並み散策： ならまち ➔ 改装カフェを巡る。 17:30 必食おやつ： 中谷堂のよもぎ餅。 19:00 京都駅へ戻る ➔ ✨ 限定イベント： ニデック京都タワー ➔ 展望室で京吹コラボ開催中。キャラクター等身大パネルを撮影し、重ね押しスタンプを完成させる。 Day 5（4.23）：嵐山散歩（『春物』と風景） # 09:00 朝の散歩： 嵐山 竹林の小径 ➔ 天龍寺。 11:00 🎐 風鈴探し： 嵐山 昇龍苑 ➔ 音が澄んだ金属風鈴、または清水焼風鈴を選ぶ。注意：風鈴は機内持ち込み。絶対に預け荷物にしない！ 12:00 豆腐料理： 嵯峨とうふ 稲。 14:00 大先生チェックイン： 渡月橋。 Day 6（4.24）：京都市内縦貫線（劇場版の日） # 💡 チケットメモ：この日は地下鉄駅で「地下鉄一日券（800円）」を購入\n08:30 🚨 劇場物販争奪戦： 一日券を持って直接MOVIX京都のグッズ売り場へ突撃し、『最終楽章』パンフレットと限定グッズを購入。買い終わったら発券機でスマホ QR コードを読み取り、夜の紙チケットを発券。 10:00 みぞれと希美： 京都水族館。 12:00 ✨ 限定ランチ： ホテル京阪 京都八条口 レストラン ➔ 「久美子のレッドユーフォニアム」ドリンクを注文し、等身大タペストリーに囲まれて没入食事。 14:00 縦貫線： 京都御所 ➔ 京都大学 ➔ 禅林寺 永観堂。 18:00 速攻夕食： 餃子の王将 三条店 ➔ 熱々の餃子と天津飯を食べる。 18:45 劇場補給： MOVIX京都のカウンターに戻り、オリジナルトートとミニクリアファイル付きの京吹限定ポップコーンセットを購入。 19:00 究極のロマン： ポップコーンと映画チケットを持って入場し、『響け！ユーフォニアム』劇場版を鑑賞！ Day 7（4.25）：大阪へ移動、天守閣を抱く # 09:30 🎁 京都締めの買い物： 京都駅内で生八ツ橋を数箱購入。賞味期限が短いので、このタイミングで買えば家族や友人に配るのにちょうどよい。 10:30 チェックアウト・移動： 東横INN大阪谷四交差点に宿泊。 13:00 歴史名城： 大阪城。 14:00 カレーうどん： 得正 谷町店。 18:00 繁華街の夜景： 道頓堀。 19:30 お好み焼き： 美津の。 Day 8（4.26）：硬核ショッピングとレトロ大阪 # 10:00 ギーク時間： 日本橋でんでんタウン。 スマホ掘り出し：イオシス 日本橋店 / じゃんぱら ➔ SIM Free と Battery Health を確認。 書籍掘り出し：周辺の書店で、OS、カーネル技術、Rust 言語、C 言語など低レイヤー系の日本語図解書を見てみる。 13:00 強制回復： 天地人 日本橋店の炭火豚丼。 17:00 昭和風情： 新世界 / 通天閣。 18:30 串カツ夕食： 八重勝 ➔ 大阪らしい串カツ。ソース二度漬け厳禁。 Day 9（4.27）：最終買い物と満載帰国 # 13:00 空港前哨： チェックアウトし、りんくうプレミアム・アウトレットで最後の散策。 16:00 空港到着： 関西国際空港 (KIX) ➔ 最初にチェックインし、重い荷物を全部預ける！ 17:00 🎁 究極のお土産祭り（免税エリア）： 保安検査後、中の KIX Duty Free 免税店で大量購入。 必買リスト：Royce\u0026rsquo; 生チョコ（保冷剤追加）、白い恋人、神戸風月堂ゴーフル。 会計後、そのまま免税ショッピング袋を持って搭乗。軽く完璧に締める。 20:00 満載で帰航！ ","date":"2026年4月16日","externalUrl":null,"permalink":"/ja/life/travel/kansai-trip-implementation-guide/","section":"生活","summary":"🎌 関西 9日8泊 聖地巡礼と文化巡遊の最終手冊 # 📌 出発前・到着時の重要メモ # 交通系 IC チャージ： 到着前に Apple Wallet の ICOCA へ 15,000円チャージしておく（Mastercard/Amex/JCB 使用）。 HARUKA 発券： 関西空港 JR 駅の緑色券売機 ➔ 繁体中国語を選択 ➔ QR コードをスキャン ➔ パスポート原本をスキャン ➔ 紙の切符を受け取って入場。 映画初日座席指定（最重要！）： 4月21日/22日 深夜0:00、MOVIX 京都公式サイトで 4.24 の初回上映座席を時間通りに取る。支払い時は「ムビチケ」を選び、実物カード裏面の10桁購入番号と4桁暗証番号を入力。実物カードは必ず自分で保管。現地ではスマホ内の QR コードを発券機で読み取って発券するだけ！ 免税原則： “一般物品”（服、本、スマホ、風鈴、ポストカード）は5,000円以上で免税、その場で開封・使用可能。 “消耗品”（薬妆、食品）は免税後絶対に開封不可。 **お土産の大物は全部、関西空港の保安検査後に買う。**荷物重量に入らず、そのまま免税。 究極の免税・避坑ガイド（Tips） 1. 二つの免税方式の比較 # 方式 手順 よくある場所 利点・注意点 直接免税（第一候補） 会計時に店員がパスポートを読み取り、10%の消費税を差し引く。残額を支払う。 Uniqlo, GU, 大国薬妆, 各種ドラッグストア, Yodobashi 最も楽。追加費用なし。 購入後退税 税込み全額を先に支払い、レシートと商品を持って百貨店の“免税カウンター (Tax Free Counter)”へ行き、現金またはカード返金を受ける。 高島屋, 大丸, 伊勢丹などの大型百貨店 百貨店側が約1.55%の手数料を取るため、実際の返金は約8.45%。混雑時は長く並ぶ可能性あり。 2. 免税の核心条件（絶対覚える） # 金額： 一人が同じ店舗で、同じ日に購入した金額が **5,000円（税抜）**以上であること。 証明書： パスポート原本が必須。店員が入国スタンプ/証明部分を読み取る。コピーや写真は絶対不可。 3. “一般物品” と “消耗品” の致命的な違い # 一般物品（服、ライトノベル、中古 iPhone、電子製品）： 免税会計後、そのまま開封して使用可能。買った服をすぐ着られる。 消耗品（薬妆、お菓子、飲料）： 免税会計後、店員が免税表示入りの透明な密封袋に入れる。日本国内では絶対に開封してはいけない！ 開封すると出国時の確認で10%消費税の追納を求められる可能性がある。 4. 中古 iPhone 避坑メモ # 日本で販売される iPhone は、サイレント設定でも写真撮影時に必ずシャッター音が鳴る（盗撮防止の法律による）。購入前にこの点を理解しておく。後で国内利用時に特定の方法で回避することは可能。 本体に大きな打痕がないか、画面端が劣化して黄ばんでいないか確認する。 📅 日別詳細行程と実操作ガイド # Day 1（4.19）：京都到着、チェックインと装備更新 # 08:00 - 12:45： 香港出発、関西国際空港（KIX）到着。 13:30 - 14:30（発券と乗車）： “鉄道”の案内表示に従って JR 関西空港駅へ向かう。 このリンクで QR 乗車の流れを学べる。 主に赤い改札を見る。 16:00 チェックイン： 京都第一ホテル ➔ 荷物を置き、身軽に出発。 17:30 装備調達： * 京都アバンティ (Kyoto Avanti) ➔ GU と Workman を見る。 * イオンモールKYOTO ➔ Uniqlo で U シリーズ白 T シャツを買う。大垣書店でライトノベルを数冊買い、会計時にCover onegaishimasuと言ってブックカバーをもらう。 19:00 夕食： 東洋亭 京都ポルタ店 ➔ 名物のアルミホイル包みハンバーグセットは必食。 20:30 日用品補給： ホテル近くのダイコクドラッグでライオン PAIR Acne 祛痘膏 (ペアアクネクリームW)などの消耗品を買う。 Day 2（4.20）：叡山電車北線（自然と日常系アニメ巡礼） # MOVIX 京都公式サイトで座席指定すること：E10 または F10 優先、4.24 の初回上映。支払い時は「ムビチケ」を選び、実物カード裏面の10桁購入番号と4桁暗証番号を入力。実物カードは必ず自分で保管。現地ではスマホ内の QR コードを発券機で読み取って発券するだけ！ 08:30 朝の森系： 貴船神社 ➔ 朝光の中の赤灯籠を撮る。 11:30 春の新緑： 瑠璃光院。 13:00 ギーク昼食： 麺屋 極鶏 または 天天有 本店。 14:30 🎐 文創購入： 恵文社一乗寺店 ➔ 世界で最も美しい書店の一つで、独立作家のポストカードや綺麗なしおりを選ぶ。 15:30 聖地巡礼： 鴨川デルタ ➔ K-ON! の飛び石。 出町桝形商店街 ➔ たまこマーケットのモデル。 必食：出町ふたばの豆大福。 18:00 夕食： 鳥貴族 京都駅前店 ➔ 全品均一価格の居酒屋。 Day 3（4.21）：京吹の本番（宇治深度巡礼） # 💡 連動任務： 京阪駅で「京阪電車×響け！ユーフォニアム2026春 1日乗車券」（1700円）を購入。全行程でスマホ GPS をオンにし、公式特設ページで歩きながらデジタルスタンプを集める。 08:00 混雑回避： 伏見稲荷大社。 11:30 宇治到着と昼食： 中村藤吉 本店 ➔ 抹茶そば + パフェ。ついでに高級煎茶/抹茶粉を数袋買って家族や年長者へのお土産にする。 14:00 - 17:00 吹奏部巡礼： グッズ購入：宇治市観光センター ➔ 紙の“舞台探訪MAP”をもらい、『京吹』限定ポストカードを購入。 核心場面：宇治橋 ➔ 宇治上神社 ➔ 久美子ベンチ。 17:30 黄昏チェックイン： 大吉山展望台 ➔ 夕暮れの名シーンを見る。 足りないもの、漏れているものがあれば、スマホに保存してある宇治のネット画像を確認する。 19:30 夕食： 京都勝牛 京都駅前店 ➔ サクサクの牛カツ。 Day 4（4.22）：奈良千年古都（文化遺産と境界の彼方） # 09:30 奈良到着： 近鉄奈良駅。 10:00 聖地チェックイン： 猿沢池 ➔ 栗山未来の実景地。 10:30 世界遺産： 東大寺。 12:00 名物昼食： 志津香 釜めし 公園店 ➔ 奈良名物釜飯。 14:00 鹿と神道： 奈良公園 ➔ 春日大社。春日大社で学業成就御守を求め、7月の日本語試験と将来の修士入試の合格を祈願する。 16:00 古い町並み散策： ならまち ➔ 改装カフェを巡る。 17:30 必食おやつ： 中谷堂のよもぎ餅。 19:00 京都駅へ戻る ➔ ✨ 限定イベント： ニデック京都タワー ➔ 展望室で京吹コラボ開催中。キャラクター等身大パネルを撮影し、重ね押しスタンプを完成させる。 Day 5（4.23）：嵐山散歩（『春物』と風景） # 09:00 朝の散歩： 嵐山 竹林の小径 ➔ 天龍寺。 11:00 🎐 風鈴探し： 嵐山 昇龍苑 ➔ 音が澄んだ金属風鈴、または清水焼風鈴を選ぶ。注意：風鈴は機内持ち込み。絶対に預け荷物にしない！ 12:00 豆腐料理： 嵯峨とうふ 稲。 14:00 大先生チェックイン： 渡月橋。 Day 6（4.24）：京都市内縦貫線（劇場版の日） # 💡 チケットメモ：この日は地下鉄駅で「地下鉄一日券（800円）」を購入\n","title":"関西旅行実行ガイド","type":"life"},{"content":" 4月18日に空港へ行き、4月19日に日本へ飛ぶ方針に決定。 準備 # ビザ、またはその他の事前手続き # 淘宝で代行業者にビザ申請を依頼する（一、二百元程度） 電子版ビザを準備しておく。往路のチェックイン時に QR コード認証が必要 vjw（Visit Japan Web）は事前入力しておく。入国手続きを速くするため チュートリアル🔗 VJWサイト 航空券（三か月前くらいから見ればよい） # 目的地：関西（関西国際空港）\nまず高速鉄道で、直行便があり、なおかつ費用がそこまで高くない空港都市へ移動する案を検討する（この場合、広州や深圳発ではないことが多い） 早めに価格を確認し、良さそうな価格なら直行便を購入する（広州・深圳発でも可能な場合がある） 香港へ行ってから日本へ飛ぶ案もあり。当時の価格次第 香港発なら香港エクスプレスとPeachを検討する。ただし荷物料金が別途かかる可能性があるので、航空券を選ぶ時は条件をよく見ること。 できるだけ朝便を選ぶ。午後に関西へ到着でき、行程を組みやすく、慌ただしくなりにくい。 航空券価格はSkyscanner、東方航空、携程などで確認すればよい。\n宿泊 # 保留意見。時期によって価格が変わるため。京都なら候補は==ホテルエクセレンス京都駅前==、==サクラテラス ザ・ギャラリー==、==京都烏丸五条ホテル==あたり。 京都第一ホテル（Kyoto Daiichi Hotel）はすでに6泊分予約済み。 3日+3日のように分けてもよい。\nホテルを移る場合、チェックイン前の午後に荷物を預けられるか先輩に確認した方がよさそう。荷物を持って歩き回るのが怖い。\nサクラテラス ザ・ギャラリー\n小紅書🍠 # 🏨予約先：価格が安い順の目安は booking.com \u0026lt; Agoda \u0026lt; Google map \u0026lt; 美団 \u0026lt; 携程 \u0026lt; Airbnb。\nかなり早めに予約すること。直前だと部屋がないうえに価格も高くなる。 大阪難波道頓堀アクロカプセルホテル1（Acro Capsule Hotel Namba Dotonbori） 大阪東急 REI ホテル（SHIN-OSAKA ESAKA TOKYU REI HOTEL） 京都—Wise Owl Hostels Kyoto（京都明智猫头鹰青年旅馆） 京都第一ホテル（Kyoto Daiichi Hotel）6泊予約済み THE POCKET HOTEL 京都烏丸五条（THE POCKET HOTEL Kyoto-Karasumagojo - Private Rooms） 京都-サクラテラス ザ・ギャラリー（Sakura Terrace The Gallery -Adult Only） 相鉄フレッサイン 京都四条烏丸（Sotetsu Fresa Inn Kyoto-Shijokarasuma） ホテルエクセレンス京都駅八条口（Hotel Excellence Kyoto Station） ==宿泊日数は、実際にどのランドマーク周辺に何日泊まるか相談して決める==\n交通 # 地下鉄とは何か、できれば先輩に確認した方がよい。\n先輩の攻略からの抜粋 # 携程で関西空港から京都までの HARUKA を購入（空港から京都へ行く用）（2〜2.5か月前に予約） 携程説明 京都駅の観光案内所で京都一日地下鉄券を2枚購入（1100円、初日と三千院/貴船へ行く日に使用）。バスに乗らないなら一日地下鉄券の方が少し安い（800円） 地下鉄 地下鉄説明 Suica を購入 Suica説明 一人旅なら LUUP のシェア電動キックボードも試す価値あり。かなり便利。パスポートと学習クイズだけでよい。ただし画面は英語 LUUP🔗 SIMカード / データ通信カード # 淘宝で softbank のデータ SIM を直接購入 もう一枚の SIM は国際ローミングをオンにして SMS 受信用にする（無憂行を有効化すればデータ通信にも使える。個人の選択次第）。無憂行 app を入れる まずこのデータ SIM だけを挿し、スマホを再起動する。電波を掴めたら、自分の SIM をカード2として挿す（ローミング通信は禁止）。再起動する。\nこうすれば、このカードでデータ通信を行い、自分のカードでは認証 SMS などを受信できる。\n観光ルート # 現地の特色ある商品（お土産）を買うこと。 kon聖地巡礼\n瑠璃光院（最新情報を基準にする）\n春季特別拝観：2025年4月15日（火）〜5月31日（土） 夏季特別拝観：2025年7月1日（火）〜8月17日（日） 秋季特別拝観：2025年10月1日（水）〜2025年12月14日（日） 各期間の拝観時間は 10:00〜17:00（最終入場 16:30）。\nチケット購入方法\n春季・夏季の特別拝観期間は予約不要で参拝できる。\n秋季特別拝観の予約については、決まり次第公式サイトで発表される。\n拝観料\n大人：2,000円 子ども（中学生以上、学生証持参）：1,000円 小学生および未就学児：無料 DAY 0（上海発）2026.04.18 # 直行便は高いので、先輩の攻略を参考に、前日に上海へ飛んで一日遊び、翌日に関西国際空港へ飛ぶ案。送迎付きのホテルを探せばよい。去哪儿などで探せる。 広州/深圳 \u0026ndash;\u0026gt; 上海 # 軽く観光してもよい。ひとまず唯庭軽居酒店（上海虹橋空港国家会展中心店）を候補にする。\n深圳発が安いか、広州発が安いかをその時に確認する（一か月以上前から航空券を見ること）。\n到着後、まずホテルでチェックインし、荷物を置いてから遊ぶ。\n送迎は事前予約すること。荷物、便名、人数、時間などを伝える。 上海 \u0026ndash;\u0026gt; 関西国際空港（Day 1）2026.04.19 # 浦東空港🛫を選ぶ。 朝便なので、昼前後に関西国際空港へ到着する想定。\n関西国際空港到着後、事前購入した携程 HARUKA チケットを、緑の窓口で有人交換するか、緑色の券売機で交換する（有人、または人が少ない方を推奨）。\n京都駅到着後、各自地下鉄券を2枚購入する（京都で長く遊ぶなら3枚でもよいかも）。\nだいたい==午後2時半ごろ==ホテルに到着できる想定（京都第一ホテルに宿泊。高ければ京都烏丸五条にする）。チェックインし、荷物を預けられれば身軽に散策できる。\nチェックイン後はまず食事をして、周辺を散策する。天気次第で傘を買う（雨 or 雪）。\nDAY 0（香港発） # 香港から関西国際空港への直行便は比較的便利。価格次第で検討。直行便が安ければ直接飛び、そうでなければ広州/深圳案と組み合わせる。 広州/深圳 \u0026ndash;\u0026gt; 香港 # 広州または深圳にいる場合、高速鉄道または都市間鉄道で香港空港へ行く（出境時間を考え、1〜2時間余裕を持つ） google travel / 携程 / Skyscannerで香港発関西国際空港行きの便を比較する 午前または昼便を推奨。関西到着後に行程を組む時間が残る 香港 \u0026ndash;\u0026gt; 関西国際空港（Day 1）2026.04.19 # 香港空港に到着\nチェックイン（パスポートと港澳通行証/ビザに注意） 荷物を預ける（ある場合） 関西国際空港へ飛ぶ\n直行便推奨（約4時間） LCC の場合、搭乗券を事前に印刷するか電子搭乗券を保存しておく 関西国際空港到着後\n事前購入済みの携程 HARUKA チケットを使用 有人交換窓口または自動緑色券売機を選ぶ（人が少ない場所優先） 京都駅へ向かう（約1時間15分〜1時間30分） 京都駅到着後\n各自2〜3枚の地下鉄券を購入（滞在時間と観光計画による） 京都第一ホテルへ向かう チェックインし、荷物を預ける 時間と体力に応じて、近くで食事して散策 天気が悪い場合（雨や雪）、傘や小さな防寒用品も買う 空港で一晩過ごす可能性もあるかもしれない。 京都観光 # 京アニ実店舗詳細\n京アニ実店舗住所\n食後、時間を見てASTY Kyotoがまだ営業しているか確認する。ここには基本的に多くの店があるので、いろいろ見て回れる。営業中なら京アニ実店舗へ行く。ユーフォ、来たぞ😋 その後は買い物祭り。\nその後、京都タワーを見に行ってもよい（または夜散策）。先に食事してから行く。最後に、近くの京都駅から地下鉄で鴨川周辺へ行く（たまこマーケットのあたりではない）。\n最後はホテルに戻ってしっかり休み、翌日の観光に備える。\nDAY2 2026.04.20 # ホテル \u0026ndash;\u0026gt; 貴船神社 # 貴船神社 \u0026ndash;\u0026gt; 瑠璃光院 # 瑠璃光院 \u0026ndash;\u0026gt; 三千院 # 途中でいろいろ散策してもよい。\nDAY3 2026.04.21 # ホテルを変更（先に荷物を預けられない場合） ホテル \u0026ndash;\u0026gt; 伏見稲荷神社 # 伏見稲荷神社 \u0026ndash;\u0026gt; 宇治 # 宇治市観光センター 平等院 宇治神社、宇治上神社 大吉山 宇治橋 久美子ベンチ 莬兔高校は状況次第 抹茶関連の商品を買うこと。抹茶スイーツも食べる😋 DAY4 2026.04.22（Twitter の状況を見て順番調整） # ホテル \u0026ndash;\u0026gt; 豊郷小学校（kon） # これは DAY3 や DAY5、あるいは別の日と入れ替え可能。kon 聖地巡礼の開放時間を見る必要があるため。 kon聖地巡礼開放時間\n行く場所は豊郷小学校（旧校舎）であることに注意。 豊郷自体はそこまで特別な場所が多いわけではないので、周辺を散策してから軽鉄/地下鉄で京都へ戻る。\n京都へ戻った後は、時間と状況に応じて散策を入れる。\nDAY5 2026.04.23 # ホテル \u0026ndash;\u0026gt; 嵐山 # 嵐山には竹林の小径がある（大先生自爆ポイント、空の境界） # 嵐山 \u0026ndash;\u0026gt; 天龍寺 # 天龍寺 \u0026ndash;\u0026gt; 御髪神社 # 散策 # ホテルへ戻る # DAY6 2026.04.24 # 響け！ユーフォニアム劇場版、今回の山場。 新風館\n京都水族館\n京都御所\n京アニたまこマーケット\n鴨川デルタ\nホテル \u0026ndash;\u0026gt; 京都水族館 # 基本的に店は10時開店が多いので、時間を見て調整する。\n京都水族館でチケットを買い、一、二時間ほど見たら run。地下鉄で次の目的地へ。\n**これで午前中はほぼ終わる。**昼食を食べてから出発。\n京都水族館 \u0026ndash;\u0026gt; 新風館 # 地下鉄で移動し、Kyotoらしい地元商品を買う（要するに商店を回る😃）。\n新風館 \u0026ndash;\u0026gt; 京都御所 # 徒歩でも地下鉄でもよい。現地の街並みを見たいなら歩く。\n京都御所 \u0026ndash;\u0026gt; たまこマーケット # 歩いて行ける。商店街と三角洲（たまこが川に落ちるシーン😄）を見る。\n鴨川デルタ \u0026ndash;\u0026gt; 京都大学 # 歩いて行ける。京都大学を散策し、雰囲気を感じる。\nこの時点でたぶん夕方5時すぎくらい。\n京都大学 \u0026ndash;\u0026gt; 禅林寺 # 禅林寺 \u0026ndash;\u0026gt; ホテル # 30分ほどの距離。ホテルに着いたら食事を探す。\nその後は状況次第で夜散歩するか考える。\nDAY7 2026.04.25 # 朝10:00前に京都第一ホテルを出る\n京都 \u0026ndash;\u0026gt; 大阪 # 以下は暫定（大阪にあまり詳しくないため）\n大阪駅 \u0026ndash;\u0026gt; 心斎橋 # 心斎橋 \u0026ndash;\u0026gt; 道頓堀 # 食べる食べる😋\n道頓堀 \u0026ndash;\u0026gt; 大阪城公園 / 神社 # 夜の適当散策（買い物） # ホテルへ戻って寝る。翌日は空港から帰国 # Day8 2026.04.26 # 飛行機で大阪を離れ、国内へ戻る。\n参考文献 # 関西旅行記\n太字は第一候補\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2026年2月12日","externalUrl":null,"permalink":"/ja/life/travel/kansai-trip-guide/","section":"生活","summary":" 4月18日に空港へ行き、4月19日に日本へ飛ぶ方針に決定。 準備 # ビザ、またはその他の事前手続き # 淘宝で代行業者にビザ申請を依頼する（一、二百元程度） 電子版ビザを準備しておく。往路のチェックイン時に QR コード認証が必要 vjw（Visit Japan Web）は事前入力しておく。入国手続きを速くするため チュートリアル🔗 VJWサイト 航空券（三か月前くらいから見ればよい） # 目的地：関西（関西国際空港）\n","title":"関西旅行プラン","type":"life"},{"content":" 連絡先 # GitHub: GitHub ブログ: ブログ QQ: 2145256133 メール: nni461904@gmail.com ","date":"2025年8月11日","externalUrl":null,"permalink":"/ja/about/","section":"響け！ユーフォニアム","summary":"連絡先 # GitHub: GitHub ブログ: ブログ QQ: 2145256133 メール: nni461904@gmail.com ","title":"自己紹介","type":"about"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/categories/alist/","section":"Categories","summary":"","title":"Alist","type":"categories"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 sudo mount -t glusterfs 192.168.1.108:/myvolume /mnt/gluster 关于 GlusterFS，这是一个分布式ファイルシステム，常用コマンド主要围绕卷（volume）的管理和確認状态。下面我整理了一些常用的確認卷信息和管理卷的コマンド。\nGluster 常用コマンド（卷信息及管理） # 1. 確認卷信息 # 確認所有卷列表： gluster volume list 確認某个卷的详细信息： gluster volume info \u0026lt;卷名\u0026gt; 確認某个卷的状态： gluster volume status \u0026lt;卷名\u0026gt; 確認卷的設定信息（たとえば副本数、分布等）： gluster volume get \u0026lt;卷名\u0026gt; all 確認所有节点状态： gluster peer status 2. 卷的基本管理コマンド # 作成卷： gluster volume create \u0026lt;卷名\u0026gt; \u0026lt;brick1\u0026gt; \u0026lt;brick2\u0026gt; ... 启动卷： gluster volume start \u0026lt;卷名\u0026gt; 停止卷： gluster volume stop \u0026lt;卷名\u0026gt; 削除卷： gluster volume delete \u0026lt;卷名\u0026gt; 3. 节点管理相关 # 確認当前集群中的节点： gluster peer status 移除一个节点： gluster peer detach \u0026lt;hostname|uuid\u0026gt; 追加一个节点（节点本身需先インストール好 glusterfs）： gluster peer probe \u0026lt;hostname\u0026gt; 4. 確認卷使用情况和配额 # 確認配额信息： gluster volume quota \u0026lt;卷名\u0026gt; list 启用配额： gluster volume quota \u0026lt;卷名\u0026gt; enable 设置配额： gluster volume quota \u0026lt;卷名\u0026gt; limit-usage /path \u0026lt;size\u0026gt; 5. 確認日志位置 # Gluster 的日志一般在：\n/var/log/glusterfs/ できます用 tail -f 来实时確認日志：\ntail -f /var/log/glusterfs/glusterd.log 6. 其他实用コマンド # 確認卷挂载点： mount | grep glusterfs 確認卷的brick信息： gluster volume status \u0026lt;卷名\u0026gt; detail 一次情况的处理 # 一、检查 brick 挂载及状态相关コマンド # 確認 volume 详细状态，包括 brick 状态：\nsudo gluster volume status myvolume detail 確認 volume 简单状态：\nsudo gluster volume status myvolume 確認 brick 对应磁盘设备信息（ファイルシステム、UUID 等）：\nsudo blkid /dev/sdb1 確認挂载点是否挂载成功：\nmount | grep extended_gluster 手动挂载所有 fstab 中定义的设备：\nsudo mount -a 编辑 fstab ファイル設定自动挂载：\nsudo nano /etc/fstab 二、处理 brick 离线与恢复 # 强制启动 volume（重启 brick 服务）：\nsudo gluster volume start myvolume force （慎用）强制移除并重新追加 brick：\nsudo gluster volume remove-brick myvolume ice:/mnt/extended_gluster/extended_brick force sudo gluster volume add-brick myvolume ice:/mnt/extended_gluster/extended_brick 三、管理 rebalance 任务 # 確認 rebalance 任务状态：\nsudo gluster volume rebalance myvolume status 启动 rebalance 任务：\nsudo gluster volume rebalance myvolume start 停止（清理）rebalance 任务：\nsudo gluster volume rebalance myvolume stop 实时监控 rebalance 状态（循环查询）：\nwatch -n 2 sudo gluster volume rebalance myvolume status 四、日志排查相关コマンド # 確認 GlusterFS プロセス日志（全局）：\nsudo less /var/log/glusterfs/glusterfsd.log 確認指定 brick 的日志：\nsudo less /var/log/glusterfs/bricks/extended_brick.log 过滤日志中 rebalance 相关内容：\nsudo grep rebalance /var/log/glusterfs/glusterfsd.log 五、其它实用コマンド # 確認 volume 信息（类型，副本数等）：\nsudo gluster volume info myvolume 確認挂载ディレクトリファイル分布情况（判断数据是否正常）：\nls -lh /mnt/extended_gluster/extended_brick 检查ファイルシステム挂载情况和容量：\ndf -h | grep extended_gluster ","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/notes/tools/alist%E4%BB%A5%E5%8F%8Agluster/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 sudo mount -t glusterfs 192.168.1.108:/myvolume /mnt/gluster 关于 GlusterFS，这是一个分布式ファイルシステム，常用コマンド主要围绕卷（volume）的管理和確認状态。下面我整理了一些常用的確認卷信息和管理卷的コマンド。\n","title":"alist と gluster","type":"notes"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/categories/gluster/","section":"Categories","summary":"","title":"Gluster","type":"categories"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8/","section":"Tags","summary":"","title":"分布式存储","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"文件管理","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E6%8C%82%E8%BD%BD/","section":"Tags","summary":"","title":"挂载","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/brick/","section":"Tags","summary":"","title":"Brick","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 节点（Node） 节点指的是参与 GlusterFS 集群的物理或虚拟サーバー主机。每个节点上できます実行 GlusterFS 服务，并提供存储资源。\nPeer（对等体） Peer 指的是集群中彼此认识并通信的节点。一个 GlusterFS 集群由多个 peer 组成，peer 之间通过ネットワーク互联，形成分布式存储システム。\n在加入集群时，必要执行 gluster peer probe \u0026lt;hostname\u0026gt; 将节点加入集群，建立 peer 关系。 Brick（砖块） Brick 是 GlusterFS 中最小的存储单元，实际是节点上的一个ディレクトリ或磁盘パーティション，作为卷（volume）的基本构建块。\n每个 brick 代表一个ディレクトリパス，比如 /data/brick1。 一个节点上できます有多个 brick。 Volume（卷） Volume 是对外暴露的逻辑存储池，由一个或多个 brick 组成。它是客户端挂载和使用的存储资源。\nVolume できます有多种类型，如分布式（distributed）、复制（replicated）、分布式复制（distributed replicated）、条带（striped）等。 Volume 通过将多个 brick 组合起来，实现数据分布、冗余备份和性能提升。 它们之间的关系まとめ # 节点 是物理サーバー，承载着 GlusterFS 服务和存储资源。 Peer 是节点之间建立的集群关系，节点通过 peer 连接组成集群。 Brick 是节点上的ディレクトリ或磁盘パーティション，提供实际的数据存储空间。 Volume 是由多个 brick 组成的逻辑存储单元，供客户端挂载使用。 示意：\n[节点1] -- peer连接 -- [节点2] -- peer连接 -- [节点3] 节点1: brick1 (/data/brick1), brick2 (/data/brick2) 节点2: brick3 (/data/brick3) 节点3: brick4 (/data/brick4), brick5 (/data/brick5) VolumeA = brick1 + brick3 + brick4 （组成分布式卷） 客户端挂载 VolumeA，通过集群访问分布在各节点上的brick数据。 ","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/notes/tools/gluster%E6%A6%82%E5%BF%B5/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 节点（Node） 节点指的是参与 GlusterFS 集群的物理或虚拟サーバー主机。每个节点上できます実行 GlusterFS 服务，并提供存储资源。\n","title":"gluster 概念","type":"notes"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/volume/","section":"Tags","summary":"","title":"Volume","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E9%9B%86%E7%BE%A4/","section":"Tags","summary":"","title":"集群","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8/","section":"Categories","summary":"","title":"分布式存储","type":"categories"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/categories/blog/","section":"Categories","summary":"","title":"Blog","type":"categories"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/categories/university/","section":"Categories","summary":"","title":"University","type":"categories"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E3%83%96%E3%83%AD%E3%82%B0/","section":"Tags","summary":"","title":"ブログ","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E5%80%8B%E4%BA%BA%E7%9A%84%E3%81%AA%E8%A8%98%E9%8C%B2/","section":"Tags","summary":"","title":"個人的な記録","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/tags/%E6%88%90%E9%95%BF%E8%AE%B0%E5%BD%95/","section":"Tags","summary":"","title":"成长记录","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E6%88%90%E9%95%B7%E8%A8%98%E9%8C%B2/","section":"Tags","summary":"","title":"成長記録","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%A7%E5%AD%A6%E7%94%9F%E6%B4%BB/","section":"Tags","summary":"","title":"大学生活","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%A7%E5%AD%A6%E4%BA%8C%E5%B9%B4/","section":"Tags","summary":"","title":"大学二年","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/tags/%E5%A4%A7%E4%BA%8C/","section":"Tags","summary":"","title":"大二","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/ja/life/diary/","section":"生活","summary":"","title":"日常","type":"life"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/tags/%E5%8D%9A%E5%AE%A2/","section":"Tags","summary":"","title":"博客","type":"tags"},{"content":"","date":"2025年8月10日","externalUrl":null,"permalink":"/tags/%E4%B8%AA%E4%BA%BA%E5%9B%9E%E5%BF%86/","section":"Tags","summary":"","title":"个人回忆","type":"tags"},{"content":"","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/tags/ssh/","section":"Tags","summary":"","title":"SSH","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 一、在客户端生成 SSH 密钥对 # 在你的ローカル客户端（たとえば你的笔记本或开发机器）上：\nssh-keygen -t rsa -b 4096 -C \u0026#34;your_email@example.com\u0026#34; 説明：\n-t rsa：生成 RSA 类型的密钥； -b 4096：密钥长度，建议至少 4096； -C：注释，通常填邮箱方便识别。 システム会提示你保存ファイル位置，默认是：\n~/.ssh/id_rsa (私钥) ~/.ssh/id_rsa.pub (公钥) 也できます自定义ファイル名，方便区分不同用途。\n二、将公钥复制到サーバー # 假设你的サーバー IP 是 192.168.1.108，用户名是 ice345：\n方法一（推荐）使用 ssh-copy-id 自动复制： # この通常都会无法成功 copy 到サーバー上 ssh-copy-id -i ~/.ssh/id_rsa.pub ice345@192.168.1.108 システム会提示输入サーバー密码，输入一次即可自动把公钥复制到サーバー的 ~/.ssh/authorized_keys 里，并设置好权限。\n方法二：手动复制 # もし没有 ssh-copy-id：\n確認公钥内容： cat ~/.ssh/id_rsa.pub 登录サーバー（使用密码）： ssh ice345@192.168.1.108 在サーバー上作成 ~/.ssh/ ディレクトリ（もし还没有）： mkdir -p ~/.ssh chmod 700 ~/.ssh 编辑 authorized_keys ファイル： nano ~/.ssh/authorized_keys 将你刚才 cat 出来的公钥粘贴进去，保存。\n変更权限： chmod 600 ~/.ssh/authorized_keys 三、测试免密登录 # 回到客户端，执行：\nssh ice345@192.168.1.108 もし一切顺利，不必要输入密码就能登录。\n四、サーバー設定 SSH 服务 # 在サーバー上编辑 sshd 設定ファイル：\nsudo nano /etc/ssh/sshd_config 重点設定项：\n# 允许公钥认证（默认通常是yes） PubkeyAuthentication yes # 允许密码登录（如不想允许可以关闭） PasswordAuthentication yes # 或 no # 允许使用 authorized_keys 文件 AuthorizedKeysFile .ssh/authorized_keys # 禁止 root 直接登录（安全建议） PermitRootLogin no 変更后，重启 ssh 服务：\nsudo systemctl restart sshd 五、额外注意事项 # もし你希望完全关闭密码登录，保证只允许密钥登录，できます把 PasswordAuthentication 改为 no。 确认ディレクトリ权限正确： ディレクトリ/ファイル 权限 ~/.ssh/ 700 ~/.ssh/authorized_keys 600 防火墙确认开放 22 端口。 六、完整快速版流程まとめ # # 1. 客户端生成密钥 ssh-keygen -t rsa -b 4096 # 2. 复制公钥到服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip # 3. 测试免密登录 ssh user@server_ip # 4. 修改服务器 /etc/ssh/sshd_config（可选） sudo nano /etc/ssh/sshd_config # 确认或修改： PubkeyAuthentication yes PasswordAuthentication yes (或 no) # 5. 重启 SSH 服务 sudo systemctl restart sshd ","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/notes/tools/ssh%E7%AE%80%E5%8D%95%E9%85%8D%E7%BD%AE/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 一、在客户端生成 SSH 密钥对 # 在你的ローカル客户端（たとえば你的笔记本或开发机器）上：\n","title":"SSH 簡単設定","type":"notes"},{"content":"","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/tags/%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5/","section":"Tags","summary":"","title":"远程连接","type":"tags"},{"content":"","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/categories/%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0/","section":"Categories","summary":"","title":"深入学习","type":"categories"},{"content":"","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/tags/%E5%AF%86%E9%92%A5%E8%AE%A4%E8%AF%81/","section":"Tags","summary":"","title":"密钥认证","type":"tags"},{"content":"","date":"2025年6月13日","externalUrl":null,"permalink":"/ja/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/","section":"Tags","summary":"","title":"网络安全","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 問題描述 # なぜなら通过上一节的描述, 我们できます通过 cloudflare tunnel 和 alist 结合实现加速访问以及稳定加载, 但是这又导致了一个問題:alist 上传出现了問題.\n经过分析, 有以下原因:\ncloudflare 的 tunnel 的免费服务无法支持不稳定的连接和长时间的连接支持 家里的サーバーなぜなら被墙, そのため无法稳定连接 (なぜなら cloudflare 是在国外) 解決办法 # そのため, 我们想有一种办法能够同时解決这两种問題: 不稳定加载和访问 和 稳定上传 这是无法免费的解決办法できます解決的.\nそのため, 我们只好设置两个口来访问 alist 就行.\n通过上一节的办法为 alistip.050626.xyz 再申请一个域名, その後設定在 /opt/alist/data/config.json 中即可, その後设置 cloudflare 的 DNS 记录\n这样就できます有域名访问 alist 了, このつまり直接通过サーバー的 ipv6 链路直连的, 稳定性相比設定 cloudflare 的 tunnel 稳定不少\n/opt/alist/data/config.json 里的 force_https 这里仍然是 false, 不然 cloudflare 的 tunnel 绑定的域名会发生問題, 无法访问 そのため, 现在我们就会有两个域名来访问 alist\n但是这两种访问的用途就不一样.\nalist.050626.xyz つまり用来提升下载和访问速度的 alistip.050626.xyz つまり用来上传的 ","date":"2025年6月11日","externalUrl":null,"permalink":"/ja/notes/tools/alist%E9%85%8D%E7%BD%AE%E5%8F%8C%E8%AE%BF%E9%97%AE/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 問題描述 # なぜなら通过上一节的描述, 我们できます通过 cloudflare tunnel 和 alist 结合实现加速访问以及稳定加载, 但是这又导致了一个問題:alist 上传出现了問題.\n","title":"alist の二重アクセス設定","type":"notes"},{"content":"","date":"2025年6月11日","externalUrl":null,"permalink":"/ja/tags/cloudflare-tunnel/","section":"Tags","summary":"","title":"Cloudflare Tunnel","type":"tags"},{"content":"","date":"2025年6月11日","externalUrl":null,"permalink":"/ja/tags/%E4%B8%8A%E4%BC%A0%E4%BC%98%E5%8C%96/","section":"Tags","summary":"","title":"上传优化","type":"tags"},{"content":"","date":"2025年6月11日","externalUrl":null,"permalink":"/ja/tags/%E5%8F%8C%E5%9F%9F%E5%90%8D/","section":"Tags","summary":"","title":"双域名","type":"tags"},{"content":"","date":"2025年6月11日","externalUrl":null,"permalink":"/ja/tags/%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE/","section":"Tags","summary":"","title":"网络配置","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 先前做法 # 先前, 我们是通过脚本来和 cloudflare 配合来不断将域名和 ipv6 进行一个绑定来変更, 但是这样我的サーバーつまり一个直接的出站, 并没有经过什么加速. そのため相比通过代理的方式, 速度会慢很多.\n脚本以下:\n#!/bin/bash # CHANGE THESE auth_email=\u0026#34;nni461904@gmail.com\u0026#34; #你的CloudFlare注册账户邮箱,your cloudflare account email address auth_key=\u0026#34;188f5f3f1ba73b37fd2a0\u0026#34; #你的cloudflare账户Globel ID ,your cloudflare Globel ID（就是我的个人资料里的global api key，应该就是用来做身份识别用的） zone_name=\u0026#34;050626.xyz\u0026#34; #你的域名,your root domain address record_name=\u0026#34;alist.050626.xyz\u0026#34; #完整域名,your full domain address record_type=\u0026#34;AAAA\u0026#34; #A or AAAA,ipv4 或 ipv6解析 ip_index=\u0026#34;local\u0026#34; #use \u0026#34;internet\u0026#34; or \u0026#34;local\u0026#34;,使用本地方式还是网络方式获取地址 eth_card=\u0026#34;enp1s0\u0026#34; #使用本地方式获取ip绑定的网卡，默认为eth0，仅本地方式有效,the default ethernet card is eth0 ip_file=\u0026#34;ip.txt\u0026#34; #保存地址信息,save ip information in the ip.txt id_file=\u0026#34;cloudflare.ids\u0026#34; log_file=\u0026#34;cloudflare.log\u0026#34; if [ $record_type = \u0026#34;AAAA\u0026#34; ];then if [ $ip_index = \u0026#34;internet\u0026#34; ];then ip=$(curl -6 ip.sb) elif [ $ip_index = \u0026#34;local\u0026#34; ];then if [ \u0026#34;$user\u0026#34; = \u0026#34;root\u0026#34; ];then ip=$(ifconfig $eth_card | grep \u0026#39;inet6\u0026#39; | cut -f2 | awk \u0026#39;{ print $2}\u0026#39; | grep -v \u0026#39;^::1$\u0026#39; | grep -v \u0026#39;^fe80\u0026#39; | grep -v \u0026#39;^f[d|c]\u0026#39; | head -1) else ip=$(/sbin/ifconfig $eth_card | grep \u0026#39;inet6\u0026#39; | cut -f2 | awk \u0026#39;{ print $2}\u0026#39; | grep -v \u0026#39;^::1$\u0026#39; | grep -v \u0026#39;^fe80\u0026#39; | grep -v \u0026#39;^f[d|c]\u0026#39; | head -1) fi else echo \u0026#34;Error IP index, please input the right type\u0026#34; exit 0 fi elif [ $record_type = \u0026#34;A\u0026#34; ];then if [ $ip_index = \u0026#34;internet\u0026#34; ];then ip=$(curl -4 ip.sb) elif [ $ip_index = \u0026#34;local\u0026#34; ];then if [ \u0026#34;$user\u0026#34; = \u0026#34;root\u0026#34; ];then ip=$(ifconfig $eth_card | grep \u0026#39;inet\u0026#39;| grep -v \u0026#39;127.0.0.1\u0026#39; | grep -v \u0026#39;inet6\u0026#39;|cut -f2 | awk \u0026#39;{ print $2}\u0026#39;) else ip=$(/sbin/ifconfig $eth_card | grep \u0026#39;inet\u0026#39;| grep -v \u0026#39;127.0.0.1\u0026#39; | grep -v \u0026#39;inet6\u0026#39;|cut -f2 | awk \u0026#39;{ print $2}\u0026#39;) fi else echo \u0026#34;Error IP index, please input the right type\u0026#34; exit 0 fi else echo \u0026#34;Error DNS type\u0026#34; exit 0 fi # 日志 log file log() { if [ \u0026#34;$1\u0026#34; ]; then echo -e \u0026#34;[$(date)] - $1\u0026#34; \u0026gt;\u0026gt; $log_file fi } # SCRIPT START log \u0026#34;Check Initiated\u0026#34; #判断ip是否发生变化,check the ip had been changed? if [ -f $ip_file ]; then old_ip=$(cat $ip_file) if [ $ip == $old_ip ]; then echo \u0026#34;IP has not changed.\u0026#34; exit 0 fi fi #获取域名和授权 get the domain and authentic if [ -f $id_file ] \u0026amp;\u0026amp; [ $(wc -l $id_file | cut -d \u0026#34; \u0026#34; -f 1) == 2 ]; then zone_identifier=$(head -1 $id_file) record_identifier=$(tail -1 $id_file) else zone_identifier=$(curl -s -X GET \u0026#34;https://api.cloudflare.com/client/v4/zones?name=$zone_name\u0026#34; \\ -H \u0026#34;X-Auth-Email: $auth_email\u0026#34; \\ -H \u0026#34;X-Auth-Key: $auth_key\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; | grep -Po \u0026#39;(?\u0026lt;=\u0026#34;id\u0026#34;:\u0026#34;)[^\u0026#34;]*\u0026#39; | head -1 ) record_identifier=$(curl -s -X GET \u0026#34;https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?type=${record_type}\u0026amp;name=$record_name\u0026#34; \\ -H \u0026#34;X-Auth-Email: $auth_email\u0026#34; \\ -H \u0026#34;X-Auth-Key: $auth_key\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; | grep -Po \u0026#39;(?\u0026lt;=\u0026#34;id\u0026#34;:\u0026#34;)[^\u0026#34;]*\u0026#39;) echo \u0026#34;$zone_identifier\u0026#34; \u0026gt; $id_file echo \u0026#34;$record_identifier\u0026#34; \u0026gt;\u0026gt; $id_file fi #更新DNS记录 update the dns update=$(curl -s -X PUT \u0026#34;https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier\u0026#34; \\ -H \u0026#34;X-Auth-Email: $auth_email\u0026#34; \\ -H \u0026#34;X-Auth-Key: $auth_key\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; \\ --data \u0026#34;{\\\u0026#34;type\\\u0026#34;:\\\u0026#34;$record_type\\\u0026#34;,\\\u0026#34;name\\\u0026#34;:\\\u0026#34;$record_name\\\u0026#34;,\\\u0026#34;content\\\u0026#34;:\\\u0026#34;$ip\\\u0026#34;,\\\u0026#34;ttl\\\u0026#34;:1,\\\u0026#34;proxied\\\u0026#34;:false}\u0026#34;) #反馈更新情况 gave the feedback about the update statues if [[ $update == *\u0026#34;\\\u0026#34;success\\\u0026#34;:true\u0026#34;* ]]; then message=\u0026#34;IP changed to: $ip\u0026#34; echo \u0026#34;$ip\u0026#34; \u0026gt; $ip_file log \u0026#34;$message\u0026#34; echo \u0026#34;$message\u0026#34; else message=\u0026#34;API UPDATE FAILED. DUMPING RESULTS:\\n$update\u0026#34; log \u0026#34;$message\u0026#34; echo -e \u0026#34;$message\u0026#34; exit 1 fi その後, 在 cloudflare 中設定一条 DNS 记录 (先设为 AAAA, その後つまり先输入一次 ipv6, 之后更改就会通过脚本自动推送的了, 不设置代理即云朵为灰色)\n但是, 显然这样的方法, 速度会很慢. そのため就有了以下改进.\n通过 Cloudflare 的 Tunnel 和 alist 绑定 # なぜなら alist 一开始是直接通过本サーバー的自身 ipv6 链路出站的, そのため速度很慢.\n现在换成通过 cloudflare 节点加速的话, 設定就改变一下. (其实つまり通过 cloudflare 代理), そのため要削除原先的 DNS记录 才行\nそのため, 先设置 /opt/alist/data 的 config.yaml 中的 force_https 为 false\n还有つまりなぜなら已经通过 cloudflare 代理了, そのため我们不用自己设置端口号为 443, 我们できます通过设置 http://localhost:5244 このローカル的端口就行, 免得发生冲突\n用 cloudflared 将 Alist 暴露为 https://yourname.cloudflare.workers.dev\nCloudflare 代理可自动走优质线路，无需暴露真实 IPv6\n几乎所有地区都有高质量访问速度\n适合你的场景（远端用户多，原生 IPv6 差）\n非常好，你已经使用了 IPv6 + DDNS 访问 https://alist.050626.xyz，接下来我们要做的是：\n使用 Cloudflare Tunnel 给你的 Alist 提速（绕过 IPv6 出口限制） # 目标： # 通过 Cloudflare Tunnel 实现：\n不暴露真实 IP（保护隐私） 自动走 Cloudflare 高质量 CDN 节点 提升远端访问速度（避免你当前的“IPv6 出站带宽被限速”問題） 手順一：在サーバー上インストール cloudflared # 以 Arch 为例（你是 Arch 用户）：\nsudo pacman -S cloudflared 若是其他システム：\n# Debian/Ubuntu sudo apt install cloudflared # RedHat/CentOS sudo yum install cloudflared 若没有, 就要通过 wget 下载 deb 包その後 dpkg 解压インストール\n手順二：登录并授权 cloudflared # cloudflared tunnel login 这会打开浏览器登录 Cloudflare，授权后你できます作成 tunnel。\n手順三：作成 tunnel 并绑定 Alist 服务 # cloudflared tunnel create alist-tunnel 会输出一个 tunnel ID，たとえば：\nCreated tunnel alist-tunnel with ID 12345678-aaaa-bbbb-cccc-123456abcdef 手順五：作成設定ファイル # 默认ディレクトリ在 ~/.cloudflared/config.yml, 你也要設定在 /etc/cloudflared/ ディレクトリ中：\ntunnel: 12345678-aaaa-bbbb-cccc-123456abcdef # 你的 tunnel ID credentials-file: /home/\u0026lt;user\u0026gt;/.cloudflared/12345678-aaaa-bbbb-cccc-123456abcdef.json # 你的json文件 ingress: - hostname: alist.050626.xyz service: http://localhost:5244 # Alist 默认端口 - service: http_status:404 确保 localhost:5244 是 Alist 的监听地址和端口。\n手順六：作成 DNS 记录 + 启动 tunnel # 将 tunnel 与 Cloudflare DNS 绑定：\ncloudflared tunnel route dns alist-tunnel alist.044454.xyz その後実行 tunnel：\ncloudflared tunnel run alist-tunnel 如需后台実行，できます用 systemd 或 --no-autoupdate 参数。\n成功后你できます： # 使用 https://alist.044454.xyz 高速访问 Alist（通过 Cloudflare 节点加速） 客户端访问走的是 Cloudflare 的全球加速ネットワーク，而不是你サーバー自身出站 IPv6 链路 可选：设置为 systemd 后台服务 # sudo cloudflared service install 这样サーバー重启后自动启动 tunnel。\n验证： # 用浏览器打开 https://alist.044454.xyz 使用 curl -v https://alist.044454.xyz，应看到 Cloudflare 代理标识 リモート测速明显比直接 IPv6 快，尤其是下载时 通过 systemd 来自动実行 # 一键启用后台服务 # sudo cloudflared service install このコマンド会自动为你生成 systemd 服务ファイル并启用开机启动。\nその後启动服务： # sudo systemctl start cloudflared 设置开机自动実行（通常默认启用）： # sudo systemctl enable cloudflared 检查実行状态： # systemctl status cloudflared 会看到 tunnel 正常実行，输出中包含 alist-tunnel 和你的域名。\n验证 # 浏览器访问你的域名 https://alist.050626.xyz 用コマンド確認： curl -I https://alist.050626.xyz 看是否有响应头包含：\nHTTP/1.1 200 HTTP/2 200 cf-ray: xxxx server: cloudflare 説明已通过 Cloudflare Tunnel 代理 ✅\n完整例:\nHTTP/1.1 200 Connection established HTTP/2 200 date: Fri, 06 Jun 2025 05:12:42 GMT content-type: text/html cf-cache-status: DYNAMIC speculation-rules: \u0026#34;/cdn-cgi/speculation\u0026#34; report-to: {\u0026#34;group\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;max_age\u0026#34;:604800,\u0026#34;endpoints\u0026#34;:[{\u0026#34;url\u0026#34;:\u0026#34;https://a.nel.cloudflare.com/report/v4?s=UOD6%2Fislw4MqZ951XaKh0jczFwySa4dshAcWMzNleVhuay3NDTkvlRwkqr%2BRv5PBb%2FPMW7aQ2mZFerZSiEZxvZpKE4CPVIpvxGXTdWO5ph4%3D\u0026#34;}]} nel: {\u0026#34;report_to\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;success_fraction\u0026#34;:0.0,\u0026#34;max_age\u0026#34;:604800} server: cloudflare cf-ray: 94b56a8e293909f0-HKG alt-svc: h3=\u0026#34;:443\u0026#34;; ma=86400 ❗ 常见問題提示 # もし你設定了多个 tunnel，できます指定要実行的 tunnel，比如编辑 /etc/default/cloudflared，或手动作成一个 service ファイル（进阶使用）。 もし你使用 --config ~/.cloudflared/config.yml，确保 cloudflared インストールパス和 config パス匹配 ","date":"2025年6月7日","externalUrl":null,"permalink":"/ja/notes/tools/alist%E5%8A%A0%E9%80%9F/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 先前做法 # 先前, 我们是通过脚本来和 cloudflare 配合来不断将域名和 ipv6 进行一个绑定来変更, 但是这样我的サーバーつまり一个直接的出站, 并没有经过什么加速. そのため相比通过代理的方式, 速度会慢很多.\n","title":"alist 高速化","type":"notes"},{"content":"","date":"2025年6月7日","externalUrl":null,"permalink":"/ja/tags/cdn/","section":"Tags","summary":"","title":"CDN","type":"tags"},{"content":"","date":"2025年6月7日","externalUrl":null,"permalink":"/ja/tags/cloudflare/","section":"Tags","summary":"","title":"Cloudflare","type":"tags"},{"content":"","date":"2025年6月7日","externalUrl":null,"permalink":"/ja/tags/ipv6/","section":"Tags","summary":"","title":"IPv6","type":"tags"},{"content":"","date":"2025年6月7日","externalUrl":null,"permalink":"/ja/tags/%E7%BD%91%E7%BB%9C%E5%8A%A0%E9%80%9F/","section":"Tags","summary":"","title":"网络加速","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 LazyVim 中自定义插件的快捷键 # 要自定义 LazyVim 插件使用的快捷键，有几种不同的方法，具体取决于你希望快捷键在哪些地方生效以及如何应用。LazyVim 是基于 Neovim 并由 lazy.nvim 插件管理器驱动的，提供了灵活的方式来管理插件的快捷键，同时保持高效的懒加载机制。下面，我将详细紹介几种主要的方法，并提供完整的例コード，同时解答是否必要手动加载相关ファイル。\n自定义快捷键的方法 # 1. 在插件规范ファイル中定义快捷键 (lua/plugins/\u0026lt;plugin\u0026gt;.lua) # 最常见和推荐的方法是在插件的规范ファイル中使用 keys 字段直接定义快捷键。这种方法できます让 LazyVim 在按下快捷键时才加载插件，从而优化启动时间。\n工作原理： # keys 字段できます指定快捷键，同时设置按键映射，并触发插件加载。 适用于插件提供的コマンド或功能（たとえば，切换ファイル浏览器或打开 Telescope 搜索）。 例：自定义 nvim-tree 的快捷键 # 假设你想将 \u0026lt;C-n\u0026gt; 绑定为 nvim-tree ファイル浏览器的切换键，而不是它的默认快捷键。\n作成或编辑 lua/plugins/nvim-tree.lua： -- lua/plugins/nvim-tree.lua return { { \u0026#34;kyazdani42/nvim-tree.lua\u0026#34;, dependencies = { \u0026#34;kyazdani42/nvim-web-devicons\u0026#34; }, config = function() require(\u0026#34;nvim-tree\u0026#34;).setup({ view = { width = 30 }, -- 可选配置 }) end, keys = { { \u0026#34;\u0026lt;C-n\u0026gt;\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;Toggle NvimTree\u0026#34; }, }, }, } 解释： \u0026lt;C-n\u0026gt;（Ctrl+n）被映射为 NvimTreeToggle コマンド。 desc 字段提供了快捷键的描述（可在 WhichKey 等ツール中可见）。 当你按下 \u0026lt;C-n\u0026gt; 时，LazyVim 会加载 nvim-tree（もし尚未加载），并切换ファイル浏览器。 追加多个快捷键： もし你还希望 \u0026lt;leader\u0026gt;e 也能切换 nvim-tree，できます这样做： keys = { { \u0026#34;\u0026lt;C-n\u0026gt;\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;Toggle NvimTree\u0026#34; }, { \u0026#34;\u0026lt;leader\u0026gt;e\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;Toggle NvimTree\u0026#34; }, }, 解释：现在 \u0026lt;C-n\u0026gt; 和 \u0026lt;leader\u0026gt;e 都できます触发相同的操作，并在必要时加载插件。 2. 在插件的 config 函数中自定义快捷键 # 有些插件会在其 setup 設定中定义快捷键（たとえば nvim-cmp 这样的补全插件）。对于这些插件，できます直接在 config 函数中変更快捷键。\n工作原理： # config 函数在插件加载后执行，そのためできます覆盖插件的默认按键映射。 适用于有自己内部映射システム的插件（たとえば，补全菜单的导航）。 例：自定义 nvim-cmp 的快捷键 # 假设你想用 \u0026lt;Tab\u0026gt; 和 \u0026lt;S-Tab\u0026gt;（Shift+Tab）来导航补全菜单，而不是默认的 \u0026lt;C-n\u0026gt; 和 \u0026lt;C-p\u0026gt;。\n编辑 lua/plugins/nvim-cmp.lua： -- lua/plugins/nvim-cmp.lua return { { \u0026#34;hrsh7th/nvim-cmp\u0026#34;, dependencies = { \u0026#34;hrsh7th/cmp-nvim-lsp\u0026#34;, \u0026#34;L3MON4D3/LuaSnip\u0026#34; }, config = function() local cmp = require(\u0026#34;cmp\u0026#34;) cmp.setup({ -- 其他配置（如补全来源、代码片段设置等） mapping = { [\u0026#34;\u0026lt;Tab\u0026gt;\u0026#34;] = cmp.mapping.select_next_item(), [\u0026#34;\u0026lt;S-Tab\u0026gt;\u0026#34;] = cmp.mapping.select_prev_item(), [\u0026#34;\u0026lt;C-y\u0026gt;\u0026#34;] = cmp.mapping.confirm({ select = true }), }, }) end, }, } 解释： mapping 表定义了补全菜单的快捷键。 \u0026lt;Tab\u0026gt; 选择下一个补全项，\u0026lt;S-Tab\u0026gt; 选择上一个，\u0026lt;C-y\u0026gt; 确认补全。 这些快捷键仅在补全菜单打开时生效，并在 nvim-cmp 加载时设置。 3. 在 lua/config/keymaps.lua 中定义快捷键 # もし你希望所有快捷键集中管理，できます在 lua/config/keymaps.lua ファイル中定义它们。但もし插件是懒加载的，必须确保插件在按下快捷键时已加载。\n工作原理： # keymaps.lua 中的快捷键会在 Neovim 启动时生效。 对于懒加载的插件，もし插件尚未加载，コマンド可能不可用，除非插件已被触发加载。 例：为 nvim-tree 追加快捷键 # 假设你想使用 \u0026lt;leader\u0026gt;nt 来切换 nvim-tree，并希望在 keymaps.lua 中定义它。\n方案 A：立即加载插件： 在插件設定中设置 lazy = false，确保插件在启动时加载： -- lua/plugins/nvim-tree.lua return { { \u0026#34;kyazdani42/nvim-tree.lua\u0026#34;, lazy = false, -- 启动时加载 config = function() require(\u0026#34;nvim-tree\u0026#34;).setup({ view = { width = 30 }, }) end, }, } その後，在 lua/config/keymaps.lua 中： -- lua/config/keymaps.lua vim.keymap.set(\u0026#34;n\u0026#34;, \u0026#34;\u0026lt;leader\u0026gt;nt\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, { desc = \u0026#34;Toggle NvimTree\u0026#34; }) 解释：由于 nvim-tree 在启动时已加载，\u0026lt;leader\u0026gt;nt できます立即生效。 方案 B：保持懒加载（推荐）： 在插件规范ファイル的 keys 字段中定义快捷键： -- lua/plugins/nvim-tree.lua return { { \u0026#34;kyazdani42/nvim-tree.lua\u0026#34;, keys = { { \u0026#34;\u0026lt;leader\u0026gt;nt\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;Toggle NvimTree\u0026#34; }, }, config = function() require(\u0026#34;nvim-tree\u0026#34;).setup({ view = { width = 30 }, }) end, }, } 解释：这样できます保持懒加载，仅在按下快捷键时加载插件，提高启动速度。 注意：もし在 keymaps.lua 中为懒加载插件定义快捷键，且没有手动触发插件加载，可能会遇到コマンド不可用的情况。そのため，最佳做法是将快捷键放在插件规范ファイル的 keys 字段中。\n必要手动加载ファイル吗？ # 不必要！LazyVim 的 lazy.nvim 会自动管理插件加载：\n在 keys 字段中定义快捷键：按下键时加载插件并执行コマンド。 在 config 函数中定义快捷键：插件加载后按键才会生效。 在 keymaps.lua 中定义快捷键：适用于已加载的插件，否则可能必要 lazy = false。 まとめ # 最佳实践：在 lua/plugins/\u0026lt;plugin\u0026gt;.lua 中的 keys 字段定义快捷键，以便懒加载插件。 对于内部映射：在 config 函数中変更插件的默认按键（如 nvim-cmp）。 集中管理快捷键：もし插件已加载（lazy = false），できます使用 keymaps.lua。 按照这些方法，你できます轻松、高效地为任何 LazyVim 插件自定义快捷键\n","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/vim/lazyvim-keymap/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 LazyVim 中自定义插件的快捷键 # 要自定义 LazyVim 插件使用的快捷键，有几种不同的方法，具体取决于你希望快捷键在哪些地方生效以及如何应用。LazyVim 是基于 Neovim 并由 lazy.nvim 插件管理器驱动的，提供了灵活的方式来管理插件的快捷键，同时保持高效的懒加载机制。下面，我将详细紹介几种主要的方法，并提供完整的例コード，同时解答是否必要手动加载相关ファイル。\n","title":"LazyVim keymap","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/categories/neovim/","section":"Categories","summary":"","title":"NeoVim","type":"categories"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/categories/vim/","section":"Categories","summary":"","title":"Vim","type":"categories"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/vim/","section":"ノート","summary":"","title":"Vim / Neovim","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E7%BC%96%E8%BE%91%E5%99%A8/","section":"Tags","summary":"","title":"编辑器","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E5%BF%AB%E6%8D%B7%E9%94%AE/","section":"Tags","summary":"","title":"快捷键","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE/","section":"Tags","summary":"","title":"插件配置","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 如何在 LazyVim 中設定插件？ # LazyVim 使用 lazy.nvim 作为插件管理器，允许以模块化和灵活的方式定义和設定插件。要設定插件，您必要作成或変更 Lua ファイル来指定要インストール的插件及其设置和加载条件。这些ファイル通常位于 LazyVim 設定的 lua/plugins/ ディレクトリ中。\n每个插件設定都写作一个 Lua 表，包含插件的リポジトリ地址、依赖项、設定函数以及加载条件（如立即加载或在特定事件/按键时延迟加载）。LazyVim 的 lazy.nvim 设置（通常在 lua/config/lazy.lua 中定义）会自动发现并加载这些插件設定。\n設定插件的手順： # 在 lua/plugins/ 中作成或変更ファイル：通过在此ディレクトリ中作成新的 .lua ファイル或编辑现有ファイル来追加插件。 定义插件规格：返回一个表（或表列表）来指定插件详细信息。 保存ファイル：保存后，lazy.nvim 会根据您的設定自动管理插件。 插件設定ファイル保存在哪里？ # 根据您的ディレクトリ结构：\n. ├── init.lua ├── lazy-lock.json ├── lazyvim.json ├── LICENSE ├── lua │ ├── config │ │ ├── autocmds.lua │ │ ├── keymaps.lua │ │ ├── lazy.lua │ │ ├── options.lua │ │ └── plugins.lua │ └── plugins │ ├── example.lua │ ├── nvim-cmp.lua │ ├── nvim-tree.lua │ └── treesistter.lua ├── README.md └── stylua.toml 插件設定ファイル保存在 lua/plugins/ ディレクトリ中。该ディレクトリ中的每个ファイル（如 nvim-cmp.lua、nvim-tree.lua、treesistter.lua、example.lua）通常定义一个或多个插件。たとえば：\nnvim-cmp.lua 可能設定 nvim-cmp 自动补全插件 nvim-tree.lua 設定 nvim-tree ファイル管理器 treesistter.lua（可能是 treesitter.lua 的拼写错误）可能設定 nvim-treesitter 这些ファイル会被 lazy.nvim 自动加载，由 lua/config/lazy.lua ファイル统筹管理（该ファイル会导入 lua/plugins/ 的所有模块）。\n注意：您的结构中包含 lua/config/plugins.lua，这不是 LazyVim 的默认設定。通常插件設定应放在 lua/plugins/，而 lua/config/ 存放通用設定ファイル（如 lazy.lua、options.lua 等）。除非 lua/config/plugins.lua 被显式导入，否则默认不会使用。建议遵循 LazyVim 惯例，将插件設定放在 lua/plugins/。\n详细例：設定 telescope.nvim 插件 # 以追加强大的模糊搜索插件 nvim-telescope/telescope.nvim 为例：\n手順 1：作成新ファイル # 在 lua/plugins/ 中作成 telescope.lua ファイル（パス：~/.config/nvim/lua/plugins/telescope.lua）。\n手順 2：定义插件规格 # 将以下内容追加到 lua/plugins/telescope.lua：\nreturn { { \u0026#34;nvim-telescope/telescope.nvim\u0026#34;, -- 指定依赖项 dependencies = { \u0026#34;nvim-lua/plenary.nvim\u0026#34; }, -- 插件加载后运行的配置函数 config = function() require(\u0026#34;telescope\u0026#34;).setup({ defaults = { -- 自定义Telescope行为 layout_strategy = \u0026#34;horizontal\u0026#34;, layout_config = { prompt_position = \u0026#34;top\u0026#34;, }, sorting_strategy = \u0026#34;ascending\u0026#34;, }, pickers = { find_files = { hidden = true, -- 显示隐藏文件 }, }, }) end, -- 定义触发插件加载的快捷键 keys = { { \u0026#34;\u0026lt;leader\u0026gt;ff\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;Telescope find_files\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;查找文件\u0026#34; }, { \u0026#34;\u0026lt;leader\u0026gt;fg\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;Telescope live_grep\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;实时搜索\u0026#34; }, }, -- 当执行Telescope命令时加载插件 cmd = { \u0026#34;Telescope\u0026#34; }, }, } 設定详解： # nvim-telescope/telescope.nvim：插件的 GitHub リポジトリ dependencies：Telescope 必要 plenary.nvim 作为依赖 config：插件加载后调用的設定函数，设置布局策略和显示隐藏ファイル keys：定义快捷键 \u0026lt;leader\u0026gt;ff（查找ファイル）和 \u0026lt;leader\u0026gt;fg（实时搜索） cmd：実行 :Telescope コマンド时加载插件 手順 3：保存并同步 # 保存ファイル后，在 Neovim 中実行 :Lazy 并选择 \u0026ldquo;Sync\u0026rdquo;（或重启 Neovim）来インストール插件。LazyVim 会自动处理下载和設定。\n如何使用这些插件？ # 在 lua/plugins/ 中設定插件后，lazy.nvim 会根据您指定的条件（如 lazy = false、keys、cmd、event）管理加载。使用方式以下：\n自动功能：许多插件加载后即用。たとえば：\n設定 telescope.nvim 后，按 \u0026lt;leader\u0026gt;ff 即可打开ファイル搜索 nvim-cmp.lua 設定后会在插入模式自动激活补全 コマンド：插件常提供コマンド。たとえば Telescope 的 :Telescope find_files，設定中的 cmd = { \u0026quot;Telescope\u0026quot; } 确保执行コマンド时加载插件\n快捷键：使用插件规格中定义的快捷键（如 \u0026lt;leader\u0026gt;ff），或在 lua/config/keymaps.lua 追加自定义快捷键：\nvim.keymap.set(\u0026#34;n\u0026#34;, \u0026#34;\u0026lt;leader\u0026gt;ff\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;Telescope find_files\u0026lt;cr\u0026gt;\u0026#34;, { desc = \u0026#34;查找文件\u0026#34; }) 插件文档：通过 :help 插件名（如 :help telescope）確認具体用法\n延迟加载注意事项： # 默认插件会延迟加载（按需加载）以加快启动速度 在 Telescope 例中，插件会在按下 \u0026lt;leader\u0026gt;ff 或実行 :Telescope 时加载。如需立即加载，可在规格中追加 lazy = false 必要在其他設定ファイル中加载插件吗？ # 通常不必要。lua/plugins/ 中的插件設定会被 lazy.nvim 自动加载（通过 lua/config/lazy.lua 的设置，通常包含）：\nrequire(\u0026#34;lazy\u0026#34;).setup({ spec = { { import = \u0026#34;plugins\u0026#34; }, -- 导入 lua/plugins/ 所有文件 }, -- 其他性能设置等 }) 这意味着您无需在 init.lua、options.lua 或 keymaps.lua 中手动加载插件。但以下情况需注意：\n在 keymaps.lua 定义快捷键：\nもし在 keymaps.lua 中定义依赖插件的快捷键（如 \u0026lt;leader\u0026gt;ff），lazy.nvim 会在按键时通过 cmd 或 keys 设置自动加载插件 例：在 keymaps.lua 追加 Telescope 快捷键仍会正常触发加载 选项或自动コマンド：\nもし插件必要 Neovim 选项或自动コマンド（如设置 vim.g.some_option），建议将設定放在插件的 config 函数中 或放在 lua/config/options.lua/autocmds.lua，但需确保插件已加载（如设置 lazy = false） 插件间依赖：\n在插件规格中使用 dependencies 字段确保先加载依赖项 例：設定 nvim-tree 的快捷键 # 在 lua/plugins/nvim-tree.lua 中：\nreturn { { \u0026#34;kyazdani42/nvim-tree.lua\u0026#34;, dependencies = { \u0026#34;kyazdani42/nvim-web-devicons\u0026#34; }, config = function() require(\u0026#34;nvim-tree\u0026#34;).setup({ view = { width = 30 }, }) end, keys = { { \u0026#34;\u0026lt;leader\u0026gt;e\u0026#34;, \u0026#34;\u0026lt;cmd\u0026gt;NvimTreeToggle\u0026lt;cr\u0026gt;\u0026#34;, desc = \u0026#34;切换文件树\u0026#34; }, }, }, } 按下 \u0026lt;leader\u0026gt;e 时会加载插件，无需在其他地方额外設定。\nまとめ # 設定插件：在 lua/plugins/ 中追加/変更 .lua ファイル，返回包含插件详情的表 設定ファイル位置：保存在 lua/plugins/（如 telescope.lua） 使用插件：通过コマンド、快捷键或插件自动功能访问 其他ファイル加载：一般不必要，lazy.nvim 通过 lazy.lua 自动管理。如需在快捷键/选项中引用插件，确保設定加载顺序 ","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/vim/lazyvim-plugins/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 如何在 LazyVim 中設定插件？ # LazyVim 使用 lazy.nvim 作为插件管理器，允许以模块化和灵活的方式定义和設定插件。要設定插件，您必要作成或変更 Lua ファイル来指定要インストール的插件及其设置和加载条件。这些ファイル通常位于 LazyVim 設定的 lua/plugins/ ディレクトリ中。\n","title":"LazyVim plugins","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E7%BC%96%E8%BE%91%E5%99%A8%E9%85%8D%E7%BD%AE/","section":"Tags","summary":"","title":"编辑器配置","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E6%8F%92%E4%BB%B6%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"插件管理","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Neovim 的「宏编程」つまり通过录制并使用宏（macro）来快速执行重复性操作。它是 Vim/Neovim 中非常实用、效率极高的功能之一。\n✅ 什么是 Neovim 的宏？ # 宏本质上是：你在 Normal 模式下的操作序列的录音回放。\n你できます：\n录制一系列操作 保存到某个寄存器（比如 a） 通过 @a 来重复执行 还できます用 @@ 重复上一次宏调用 📌 宏的基本使用手順： # 动作 コマンド 开始录制宏 q\u0026lt;寄存器\u0026gt; たとえば qa 开始录到寄存器 a 执行操作 你正常地输入コマンド（比如 dw, j, iHello\u0026lt;Esc\u0026gt; 等） 停止录制 q 执行宏 @a 执行寄存器 a 的宏 重复执行上一个宏 @@ 🛠 例：削除每一行的第一个单词 # qa → 开始录制到 a ^dwj → 移动到行首 (^)，削除一个词 (dw)，跳到下一行 (j) q → 结束录制 @a → 执行一遍宏 @@ → 再次执行刚才的宏 也できます：10@a → 执行 10 次 📎 技巧和注意事项： # 宏只能录制 Normal/Insert/Visual 模式下的操作，不能直接录制 Lua 或 Vimscript。 宏操作受当前光标位置、寄存器内容、编辑器状态影响，操作前最好保证状态一致。 もし你在 Insert 模式下输入内容，宏也会录进去。 宏中的移动建议用固定逻辑（たとえば 0, $, ^）而非手动左右移动（如 l, h），避免光标状态不同导致行为异常。 🚀 想更强？できます结合： # :normal 批量应用宏到多个行，比如：\n:10,20 normal @a Lua 中调用宏或用 Lua 实现更强的批处理（如使用 vim.api.nvim_feedkeys）\n例 # test1 1.txt test2 2.txt test3 3.txt ... test10 10.txt 你想借助 Neovim 宏编程（比如使用 @a）自动生成这些行。我们来分两种情况：\n✅ 情况一：你只有第一行 test1 1.txt，想生成接下来的行 # 这种情况，我们できます借助宏 + Ctrl-a（数字加一コマンド）来自动生成每一行！\n🪄 操作手順以下： # 手动输入第一行：\ntest1 1.txt 移动光标到行首，执行：\nqa \u0026#34; 开始录制宏到寄存器 a yyp \u0026#34; 复制整行并粘贴 w\u0026lt;C-a\u0026gt; \u0026#34; 移动到数字1，加1（变成2） w\u0026lt;C-a\u0026gt; \u0026#34; 再往后移动到 1.txt 中的1，再加1（变成2.txt） q \u0026#34; 停止录制 その後执行：\n@a \u0026#34; 执行宏一次 @@ \u0026#34; 重复上一次宏（可以多次按） 或者批量执行 9 次（再加9行）：\n9@a 👀 结果你将得到： # test1 1.txt test2 2.txt test3 3.txt test4 4.txt ... test10 10.txt 💡 补充説明 # yyp：复制整行并粘贴\nw\u0026lt;C-a\u0026gt;：先跳到第一个数字（1），その後 Ctrl-a 加1\n再 w\u0026lt;C-a\u0026gt;：继续跳到下一个数字加1（即 1.txt 中的 1）\n只要你的格式是 英文单词+空格+数字.txt，这套宏就能自动推进\nもし你之后格式变复杂，比如：\nprefix-test01 result_001.txt 这种带前导零的情况，也できます用 g\u0026lt;C-a\u0026gt;（更高级的 Vim 自增コマンド）或 Lua 批量生成\n","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/vim/neovim-macro/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Neovim 的「宏编程」つまり通过录制并使用宏（macro）来快速执行重复性操作。它是 Vim/Neovim 中非常实用、效率极高的功能之一。\n","title":"Neovim macro","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E7%BC%96%E8%BE%91%E6%95%88%E7%8E%87/","section":"Tags","summary":"","title":"编辑效率","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E5%AE%8F%E7%BC%96%E7%A8%8B/","section":"Tags","summary":"","title":"宏编程","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/","section":"Tags","summary":"","title":"自动化","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/dhcpcd/","section":"Tags","summary":"","title":"Dhcpcd","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/dns/","section":"Tags","summary":"","title":"DNS","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 是的，你できます在 /etc/resolv.conf ファイル中変更 DNS サーバー。该ファイル用于設定 Linux システム使用的 DNS 解析サーバー。通过编辑该ファイル，你できます手动指定 DNS サーバー（たとえば Google 的 8.8.8.8 或 Cloudflare 的 1.1.1.1 等）。\n最好使用的是 dhcpcd 服务，この最容易変更，就在 /etc/dhcpcd.conf 中変更就行 如何変更 /etc/resolv.conf ファイル来更改 DNS サーバー # 编辑 /etc/resolv.conf ファイル\n使用文本编辑器（たとえば nano、vim 或 gedit）编辑 /etc/resolv.conf ファイル：\nsudo nano /etc/resolv.conf 変更 DNS サーバー\n在ファイル中，你できます追加或変更 nameserver 行来指定 DNS サーバー。たとえば：\nnameserver 8.8.8.8 # Google Public DNS nameserver 8.8.4.4 # Google Public DNS (备用) nameserver 2001:4860:4860::8888 nameserver 2001:4860:4860::8844 或者，你できます使用其他 DNS 服务提供商的 IP 地址，たとえば：\nnameserver 1.1.1.1 # Cloudflare DNS nameserver 1.0.0.1 # Cloudflare DNS (备用) 保存ファイル并退出编辑器。\n检查 DNS 设置\n编辑完成后，できます使用以下コマンド检查 DNS 設定是否生效：\ncat /etc/resolv.conf 你应该看到你追加的 DNS サーバー IP 地址。\n注意事项 # ネットワーク管理ツール的干扰\n在某些システム中，/etc/resolv.conf ファイル可能会被ネットワーク管理ツール（如 NetworkManager、systemd-resolved 或 dhclient）覆盖或自动生成。もし你手动変更了该ファイル，但ネットワーク管理ツール恢复了默认的 DNS 设置，変更将会被覆盖。\n禁用自动生成的 /etc/resolv.conf\nもし你希望手动管理 DNS 設定并防止它被覆盖，你できます采取以下方法：\n禁用 systemd-resolved（もし在使用 systemd）：\nもし你的システム使用 systemd-resolved 管理 DNS 設定，できます禁用它，その後手动変更 /etc/resolv.conf。\nsudo systemctl disable systemd-resolved.service sudo systemctl stop systemd-resolved.service sudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf 変更 NetworkManager 设置：\nもし你使用的是 NetworkManager，できます通过変更其設定ファイル来防止它覆盖 /etc/resolv.conf。编辑 /etc/NetworkManager/NetworkManager.conf 并追加以下行：\n[main] dns=none その後重新启动 NetworkManager 服务：\nsudo systemctl reload NetworkManager その後要重新编辑 resolv.conf ファイル\nその後再继续执行\nsudo systemctl reload NetworkManager 通过 DHCP 自动获取 DNS\nもし你的ネットワーク通过 DHCP 自动获取 IP 設定，DHCP サーバー也可能会向 /etc/resolv.conf 写入 DNS 設定。你できます禁用 DHCP 設定 DNS 设置来防止这种情况，具体方法依赖于你的ネットワーク管理ツール。 使用的是 dhcpcd # 编辑 /etc/dhcpcd. conf 的, 找到/追加: static domain_name_server=.....\n使用的是 systemd-networkd # この可能就要在 /etc/systemd/network/ 中编辑ファイル，作成一个ファイル ,以. network 结尾たとえば: 20-wired. network\n[Match] Name=eth0 [Network] Address=192.168.1.100/24 Gateway=192.168.1.1 DNS=8.8.8.8 DNS=1.1.1.1 まとめ # 你确实できます手动编辑 /etc/resolv.conf 来设置 DNS サーバー，但要注意一些ネットワーク管理ツール可能会自动覆盖该ファイル。もし你想持久化更改，可能必要禁用某些自动管理 DNS 的服务或ツール。\n","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/linux/linux-dns%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 是的，你できます在 /etc/resolv.conf ファイル中変更 DNS サーバー。该ファイル用于設定 Linux システム使用的 DNS 解析サーバー。通过编辑该ファイル，你できます手动指定 DNS サーバー（たとえば Google 的 8.8.8.8 或 Cloudflare 的 1.1.1.1 等）。\n","title":"Linux DNS ネットワーク管理","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/resolv.conf/","section":"Tags","summary":"","title":"Resolv.conf","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"ネットワーク管理","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/tags/%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"网络管理","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/hyprland/","section":"Tags","summary":"","title":"Hyprland","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 まず声明，并不是所有功能都是通过快捷键打开的，つまり比如说: Kool_Quick_Settings.sh このつまり先通过 yad 或者 rofi 这些ツール图形化功能栏目，その後就できます通过コマンド打开ファイル ディレクトリ结构 # 省流版 # .config/hypr/ . ├── animations ├── application-style.conf ├── configs ├── hypridle.conf ├── hyprland.conf ├── hyprlock-2k.conf ├── hyprlock.conf ├── hyprpaper.conf ├── initial-boot.sh ├── Monitor_Profiles ├── monitors.conf ├── scripts ├── UserConfigs ├── UserScripts ├── v2.3.15 ├── wallpaper_effects ├── wallust └── workspaces.conf 大概説明 # 最重要ファイル: hyprland.conf, このファイルつまり一个相当于 hyprland 的根設定ファイル，窗口管理(WM)的根基設定\nanimations 是控制窗口、工作区、图层等 UI 元素的动画效果的一个ディレクトリ的設定ファイル. (できます通过 SUPER SHIFT A 来选择)\napplication-style.conf: hyprland-qt-support provides a QML style for hypr qt6 apps\nconfigs 是项目 Default config ディレクトリ, 最好不要改动. scripts 同样是\nUserConfigs 则不一样，是表示用户级别的設定ディレクトリ，できます自定义设置. UserScripts 同样\nhypridle.conf :\nhyprlock.conf 是与锁屏有关的設定ファイル\nhyprpaper.conf 是显示器 wallpaper 设置的設定ファイル\ninitial-boot.sh 是 hyprland 启动的时候，如何渲染つまり通过この脚本ファイル来設定的\nmonitors.conf 是由 Monitor_Profile この与monitor設定有关的ディレクトリ里的 default.conf 生成的\nwallpaper_effects 是 wallpaper 改变之后生成的一个ディレクトリ，有两个隐藏ファイル: .wallpaper_current 和 .wallpaper_modified\nworkspaces.conf 是一个由 Userconfigs 里的 WorkSpaceRules ファイル生成的一个ファイル，是一个工作区如何定义和管理的設定ファイル\nwallust 是颜色定义ディレクトリ，里面有个ファイル (相当于一个常量头ファイル)\nUserConfigs/WindowRules.conf このファイルつまり管理窗口的，定义规则看如何给窗口贴标签，分配 workspace 这些等1\nたとえば:\nwindowrulev2 = tag +projects, class:^(codium|codium-url-handler|VSCodium)$ windowrulev2 = tag +projects, class:^(VSCode|code-url-handler)$ windowrulev2 = tag +projects, class:^(jetbrains-.+)$ # 这个可以实现在规定workspace启动应用窗口 windowrulev2 = workspace 4, tag:projects 详细版ディレクトリ结构 # .config/hypr . ├── animations │ ├── 00-default.conf │ ├── 01-default - v2.conf │ ├── 03- Disable Animation.conf │ ├── END-4.conf │ ├── HYDE - default.conf │ ├── HYDE - minimal-1.conf │ ├── HYDE - minimal-2.conf │ ├── HYDE - optimized.conf │ ├── HYDE - Vertical.conf │ ├── Mahaveer - me-1.conf │ ├── Mahaveer - me-2.conf │ ├── ML4W - classic.conf │ ├── ML4W - dynamic.conf │ ├── ML4W - fast.conf │ ├── ML4W - high.conf │ ├── ML4W - moving.conf │ └── ML4W - standard.conf ├── application-style.conf ├── configs │ └── Keybinds.conf ├── hypridle.conf ├── hyprland.conf ├── hyprlock-2k.conf ├── hyprlock.conf ├── hyprpaper.conf ├── initial-boot.sh ├── Monitor_Profiles │ ├── default.conf │ └── README ├── monitors.conf ├── scripts │ ├── AirplaneMode.sh │ ├── Animations.sh │ ├── BrightnessKbd.sh │ ├── Brightness.sh │ ├── ChangeBlur.sh │ ├── ChangeLayout.sh │ ├── ClipManager.sh │ ├── DarkLight.sh │ ├── Distro_update.sh │ ├── GameMode.sh │ ├── Hypridle.sh │ ├── KeyBinds.sh │ ├── KeyHints.sh │ ├── KillActiveProcess.sh │ ├── Kitty_themes.sh │ ├── Kool_Quick_Settings.sh │ ├── KooLsDotsUpdate.sh │ ├── LockScreen.sh │ ├── MediaCtrl.sh │ ├── MonitorProfiles.sh │ ├── Polkit-NixOS.sh │ ├── Polkit.sh │ ├── PortalHyprland.sh │ ├── RefreshNoWaybar.sh │ ├── Refresh.sh │ ├── RofiEmoji.sh │ ├── RofiSearch.sh │ ├── RofiThemeSelector-modified.sh │ ├── RofiThemeSelector.sh │ ├── ScreenShot.sh │ ├── Sounds.sh │ ├── SwitchKeyboardLayout.sh │ ├── TouchPad.sh │ ├── UptimeNixOS.sh │ ├── Volume.sh │ ├── WallustSwww.sh │ ├── WaybarCava.sh │ ├── WaybarLayout.sh │ ├── WaybarScripts.sh │ ├── WaybarStyles.sh │ └── Wlogout.sh ├── UserConfigs │ ├── 00-Readme │ ├── 01-UserDefaults.conf │ ├── ENVariables.conf │ ├── LaptopDisplay.conf │ ├── Laptops.conf │ ├── Startup_Apps.conf │ ├── UserAnimations.conf │ ├── UserDecorations.conf │ ├── UserKeybinds.conf │ ├── UserSettings.conf │ ├── WindowRules.conf │ ├── WindowRules-new.conf │ └── WorkSpaceRules ├── UserScripts │ ├── 00-Readme │ ├── RainbowBorders.sh │ ├── RofiBeats.sh │ ├── RofiCalc.sh │ ├── WallpaperAutoChange.sh │ ├── WallpaperEffects.sh │ ├── WallpaperRandom.sh │ ├── WallpaperSelect.sh │ ├── Weather.py │ ├── Weather.sh │ └── ZshChangeTheme.sh ├── v2.3.15 ├── wallpaper_effects ├── wallust │ └── wallust-hyprland.conf └── workspaces.conf 設定 # 应用自启动設定 # 在 hyprland.conf このファイル里自定义软件的自启动2\nexamples:\nexec-once = [workspace 1 silent] kitty exec-once = [workspace 1 silent] subl exec-once = [workspace 3 silent] mailspring exec-once = [workspace 4 silent] firefox exec VS exec-once # You can execute a shell script on:3\nstartup of the compositor every time the config is reloaded. shutdown of the compositor exec-once = command will execute only on launch support rules\nexecr-once = command will execute only on launch\nexec = command will execute on each reload support rules\nexecr = command will execute on each reload\nexec-shutdown = command will execute only on shutdown\n工作区 (Workspace) # つまり如何自定义和管理 workspaces 的，そのため都是在 UserConfigs/WorkspaceRules 来设置来管理(不过この一旦设置つまり全部通用)，或者通过 workspaces.conf このファイル来定义4\n显示器 (Monitor) # できます直接通过 nwg-displays 来快速设定 (できます SUPER SHIFT E 打开功能栏目その後搜索就できます了)\n也できます直接自定义 monitors.conf ファイル5\nできます通过 nwg-display ツール来设定显示器\n快捷键 (keybinds) # rules: bind = MODS, key, dispatcher, params6\nexamples: bind = SUPER, B, exec, firefox\n根据上面ディレクトリ结构所说的，できます在 UserConfigs/UserKeybinds.conf 里定义，也有 UserScripts/UserKeybinds.sh 里定义脚本，还有一个 UserScripts/UserKeyHints.sh 有常用快捷键提示\n这里说到快捷键要説明一下，渲染問題 (有 yad 和 rofi 这两个实现脚本的 GUI)\n简单对比:\n功能 yad rofi 图形风格 GTK，传统 GUI 样式 极简、dmenu 风格 多列显示 ✅ 原生支持 🚫 不支持多列（需手动 hack） 自定义交互复杂度 高（按钮、表单、进度条等） 中（菜单交互 + 自定义脚本） 外观主题支持 GTK 主题 rofi 主题（通过 config 设置） 使用场景 設定ツール、提示菜单、设置界面 启动器、搜索菜单、快速选择器 環境変数 ENV # 在 /etc/environment 加载 fcitx5\n下面的注释是 fcitx5 的 wayland 前端好像是会自动加载这些，そのため还追加的话，这样每次启动都会有提示消息 #GTK_IM_MODULE=fcitx #QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx SDL_IM_MODULE=fcitx GLFW_IM_MODULE=ibus 加载 nvidia (还是怕 nvidia 驱动没有加载，そのため在システム级别的 evn 中追加)\n__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia Nvidia # まず禁用 nouveau この开源驱动，fedora 和 arch 方法不一样，arch できます直接在 /etc/mkinitcpio.conf 里的 HOOK 字段変更 (削除 kms 就行), その後就mkinitcpio -P 禁用 nouveau 驱动 # 在 /etc/modprobe.d このディレクトリ里编写一个ファイル:blacklist-nouveau. conf(ファイル名できます自己自定义)\nblacklist nouveau options nouveau modeset=0 その後, 我们要加载この禁用的ファイル設定\n/etc/default/grub ファイル中:\nGRUB_CMDLINE_LINUX=\u0026#34;rd.driver.blacklist=nouveau modprobe.blacklist=nouveau\u0026#34; その後就要: sudo dracut --force 重新生成 grub 引导ファイル\n以防 nvidia 驱动没有启动，我们在很多方面都写了相关環境変数\n在 /etc/modprobe.d 编写一个nvidia. confファイル7\noptions nvidia_drm modeset=1 UserConfigs/ENVariables.conf 定义各种 env 包括nvidia的 (そのため基本我们为了项目化，都在この改动 env)\n输入法设置 # Fcitx5 各种設定以及問題 # Rime 的大写模式下的問題 # 在 Rime 的中文输入法下按下 capslock键 你就处于大写模式无法输入中文了,その後就各种文档参看, 找到2013 年的的 issue8, 这种应该按道理不管在哪个 DE 或者 WM 下都应该修复了才对的啊!!🤔\nI\u0026rsquo;ll look into this problem tonight.\nYou can temporarily disable mode switching with Caps Lock by patching default.yaml:\n# default.custom.yaml patch: { ascii_composer/switch_key/Caps_Lock: noop } 软件窗口里的输入法 # 不知道是 electron 应用的問題还是 hyprland 和 fcitx5 还不是很兼容的問題。我们必要在 desktop file 里的Exec字段手动定义实现できます用 fcitx5 的中文输入 补充以下設定:\n--enable-wayland-ime もし是用户级别的软件，我们必要在 .local/share/applications 里的 desktop file 里定义。否则，我们要在 /usr/share/applications 里查找 desktop file 来変更\nなぜなら有些应用会出现输入中文的拼音会漏词 (つまり明明想要输入 shuru 但是可能会漏出 h 到 fcitx5 的候选词栏中), 有些ブログ说できます:\n在 ~/.config/gtk-3.0/config ファイル中追加:9\n[Settings] gtk-im-module = fcitx Electron 相关应用参考官方链接 # 比如软件:obsidian,vscode,chrome等10\nなぜなら在 linux+nvidia+wayland 这种情况下，nvidia この gpu 加速不一定适配，そのため可能就无法实现很流畅地渲染，但是为了进可能地渲染\n我们在 desktop file 里也定义:\n--enable-features=UseOzonePlatform --ozone-platform=wayland StartupWMClass=obsidian # 这个field就是添加窗口class属性(可以更好在窗口管理管理) 代理問題: この也是要在 .desktop 里根据各个 applications 的要求设置 proxy\n奇奇怪怪的問題 # firefox 的 class 問題 # 目的: 想要实现在打开某些窗口的时候打开到固定的工作区\n.config/hypr/UserConfigs/WindowRules.conf このファイル里定义窗口规则的时候，发现以下設定:\nwindowrule2 = tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin) windowrule2 = workspace 4, tag: browser 这样的設定根本没有在 workspace 4 打开 firefox, 我使用 hyprctl clients コマンド確認属性的时候，发现是正常的.\n但是听从 gpt 意见写成:\nwindowrele2= workspace 4, tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin) 这样的設定却できます生效，问了一下 gpt, 就说是以下原因:\n窗口作成时机：某些应用程序在启动时可能会先作成窗口，その後再设置类名（class）等属性。もし tag 是基于 class 设置的，而 class 尚未被识别，tag 就不会被应用，导致依赖于该 tag 的规则无法生效。(比如 firefox)\nwaybar 的 icon 显示問題: 比如 waybar 的 rose 的主题，有时候会出现蓝牙图标没有显示(==我想到的可能性是蓝牙启动比 waybar 慢，そのため无法显示==)，只有重新 refresh waybar 才行，そのためできます尝试在 hyprland.conf 中设置 exec-once = blueman-applet 我们手动设置让蓝牙启动\n结论:\nHyprland 的 windowrulev2 规则在处理标签（tag）和工作区（workspace）时，应用顺序和窗口作成时机非常关键。​もし窗口在作成时尚未被赋予标签，那么依赖于该标签的工作区规则可能不会生效。​ spotify 也是这样，wiki 里也有提及11\n为确保窗口在作成时立即被分配到正确的工作区，建议将标签和工作区的设置合并为一条规则，并确保窗口在作成时就匹配该规则。\n参考🔗 # hyprland wiki workspace rules\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki autostartup apps\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki executing\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki workspaces\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki monitors\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki keybinds\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki nvidia\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nrime-issue\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nfcitx5漏字\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki electron\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nhyprland wiki spotify\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/notes/tools/hyprland%E7%AE%80%E6%98%8E%E6%8C%87%E5%8C%97/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 まず声明，并不是所有功能都是通过快捷键打开的，つまり比如说: Kool_Quick_Settings.sh このつまり先通过 yad 或者 rofi 这些ツール图形化功能栏目，その後就できます通过コマンド打开ファイル ディレクトリ结构 # 省流版 # .config/hypr/ . ├── animations ├── application-style.conf ├── configs ├── hypridle.conf ├── hyprland.conf ├── hyprlock-2k.conf ├── hyprlock.conf ├── hyprpaper.conf ├── initial-boot.sh ├── Monitor_Profiles ├── monitors.conf ├── scripts ├── UserConfigs ├── UserScripts ├── v2.3.15 ├── wallpaper_effects ├── wallust └── workspaces.conf 大概説明 # 最重要ファイル: hyprland.conf, このファイルつまり一个相当于 hyprland 的根設定ファイル，窗口管理(WM)的根基設定\n","title":"Hyprland 簡明ガイド","type":"notes"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/wayland/","section":"Tags","summary":"","title":"Wayland","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83/","section":"Tags","summary":"","title":"桌面环境","type":"tags"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/categories/%E6%A1%8C%E9%9D%A2%E8%AE%BE%E8%AE%A1/","section":"Categories","summary":"","title":"桌面设计","type":"categories"},{"content":"","date":"2025年6月6日","externalUrl":null,"permalink":"/ja/tags/%E7%AA%97%E5%8F%A3%E7%AE%A1%E7%90%86%E5%99%A8/","section":"Tags","summary":"","title":"窗口管理器","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 杂谈 # alist 的相关ディレクトリ設定全部都在 /opt/alist ディレクトリ下，这里できます設定相关的比如:\nhttps 设置 (即证书的设置) 端口设置 密码设置 (高版本已经不行了) この脚本是できます使用缓存的ファイル的, そのため設定新的域名或者什么的, 请先削除 ip.txt, cloudflare.log, cloudflare.ids ファイル 谈到有关证书的事情，我この alist サーバー有关 https 访问，就要申请 ssl 证书。那么就要将相关的情况分类説明:\n情况一 # 你的 cloudflare 代理不是仅 DNS 的 (即你的云朵是橙色的), 这就要看你的暗号化方式是什么了 (在 边缘证书 那里できます看到相关设置)\nCloudflare 提供三种主要的 SSL/TLS 模式，决定了 Cloudflare 与源站之间的连接方式：\n灵活（Flexible）：​浏览器与 Cloudflare 之间使用 HTTPS，但 Cloudflare 与源站之间使用 HTTP。​\n完全（Full）：​浏览器与 Cloudflare 之间使用 HTTPS，Cloudflare 与源站之间也使用 HTTPS，但不验证源站证书的有效性。​\n完全（严格）（Full (Strict)）：​浏览器与 Cloudflare 之间使用 HTTPS，Cloudflare 与源站之间也使用 HTTPS，并且验证源站证书的有效性（必须是受信任的 CA 签发的有效证书）。\n在“完全（严格）”模式下，Cloudflare 会验证你サーバー上的 SSL 证书是否有效且由受信任的证书颁发机构（CA）签发。​もし你使用 Let’s Encrypt 证书，并确保其未过期，Cloudflare 将接受该证书。​\nそのため，もし你想设置 cloudflare 的证书，你就要自己手动设置相关的还有续期也要分不同情况来决定是否会自动续期.\n情况二 # 你的 cloudflare 代理是仅 DNS 的 (即你的云朵是灰色的)\n我的サーバー是通过 cerbot この来申请 ssl 证书的，他的相关設定ファイル存储在 /etc/letsencrypt 下\n/etc/letsencrypt/live/yourdomain/：包含实际使用的证书ファイル的符号链接。​ 以下是先骨干ディレクトリ结构内容:\nfullchain.pem：完整的证书链，供サーバー使用。​\nprivkey.pem：私钥ファイル。​\n/etc/letsencrypt/archive/yourdomain/：存储所有历史版本的证书和私钥。​\n/etc/letsencrypt/renewal/yourdomain.conf：包含续期所需的設定信息。​\n/var/log/letsencrypt/letsencrypt.log：Certbot 的日志ファイル，记录操作过程和错误信息。\n以下是通过 cerbot 申请 ssl 证书手順:\n申请 SSL 证书: 通过 standalone 模式申请证书：(なぜなら我不是使用 nginx 的，そのため是 standalone 模式) sudo cerbot certonly --standalone -d alist.050626.xyz 验证过程: Certbot 会启动一个临时的 web サーバー，向 Let\u0026rsquo;s Encrypt 证明你拥有该域名。验证完成后，它会生成证书并保存在 /etc/letsencrypt/live/yourdomain.com/ ディレクトリ下。 证书自动续期: Certbot 会自动設定一个 cron 任务来定期检查并续期证书。验证证书是否会自动续期: sudo cerbot renew --dry-run 設定定时任务: sudo crontab -e 每天检查证书并进行续期 (もし必要), その後重启 alist\n0 0 * * * certbot renew --quiet \u0026amp;\u0026amp; systemctl restart alist その後有了证书之后，就在 /opt/alist/data ディレクトリ下:\n在 cert_file 以及 key_file 上放置相关設定ファイル\nたとえば:\n\u0026#34;cert_file\u0026#34;: \u0026#34;/etc/letsencrypt/live/alist.050626.xyz/fullchain.pem\u0026#34;, \u0026#34;key_file\u0026#34;: \u0026#34;/etc/letsencrypt/live/alist.050626.xyz/privkey.pem\u0026#34;, ","date":"2025年4月20日","externalUrl":null,"permalink":"/ja/notes/tools/alist%E9%85%8D%E7%BD%AE/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 杂谈 # alist 的相关ディレクトリ設定全部都在 /opt/alist ディレクトリ下，这里できます設定相关的比如:\n","title":"alist 設定","type":"notes"},{"content":"","date":"2025年4月20日","externalUrl":null,"permalink":"/ja/tags/https/","section":"Tags","summary":"","title":"HTTPS","type":"tags"},{"content":"","date":"2025年4月20日","externalUrl":null,"permalink":"/ja/tags/ssl%E8%AF%81%E4%B9%A6/","section":"Tags","summary":"","title":"SSL证书","type":"tags"},{"content":"","date":"2025年4月20日","externalUrl":null,"permalink":"/ja/tags/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"配置管理","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%90%8E%E5%90%91%E5%BC%95%E7%94%A8/","section":"Tags","summary":"","title":"后向引用","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/","section":"Tags","summary":"","title":"正则表达式","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/regex/","section":"ノート","summary":"","title":"正規表現","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/","section":"Tags","summary":"","title":"正規表現","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 零宽断言（lookahead 和 lookbehind）、负向断言、后向引用以及平衡组是正規表現中的高级特性，能够处理更复杂的匹配需求。以下是它们的功能和在 Python 中的具体应用。\n1. 零宽断言 # 正向零宽断言（Positive Lookahead） # 匹配某个位置后面紧跟着特定内容，但不会把この内容包括在结果中。\n语法： # (?=pattern) 例： # 提取所有后面跟着数字的单词：\nimport re text = \u0026#34;apple 123, banana456, cherry 789.\u0026#34; # 匹配后面紧跟数字的单词 pattern = r\u0026#39;\\b\\w+(?=\\d)\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;banana\u0026#39;] 负向零宽断言（Negative Lookahead） # 匹配某个位置后面不跟特定内容。\n语法： # (?!pattern) 由感叹号都知道这是表示非\n例： # 提取所有后面不跟数字的单词：\nimport re text = \u0026#34;apple 123, banana456, cherry 789.\u0026#34; # 匹配后面不跟数字的单词 pattern = r\u0026#39;\\b\\w+(?!\\d)\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;apple\u0026#39;, \u0026#39;cherry\u0026#39;] 2. 后向零宽断言 # 正向后向断言（Positive Lookbehind） # 匹配某个位置前面紧跟着特定内容。\n语法： # (?\u0026lt;=pattern) 例： # 判断条件是 \u0026ldquo;@\u0026rdquo; ：\nimport re text = \u0026#34;Contact us at support@example.com or sales@company.com.\u0026#34; # 匹配 \u0026#34;@\u0026#34; 后的部分 pattern = r\u0026#39;(?\u0026lt;=@)\\w+\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;example\u0026#39;, \u0026#39;company\u0026#39;] 负向后向断言（Negative Lookbehind） # 匹配某个位置前面不紧跟特定内容。\n语法： # (?\u0026lt;!pattern) 例： # import re text = \u0026#34;Contact us at support@example.com or sales@company.com.\u0026#34; # 匹配前面不是 @ 的单词 pattern = r\u0026#39;(?\u0026lt;!@)\\b\\w+\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;Contact\u0026#39;, \u0026#39;us\u0026#39;, \u0026#39;at\u0026#39;, \u0026#39;support\u0026#39;, \u0026#39;or\u0026#39;, \u0026#39;sales\u0026#39;] 3. 后向引用 # 后向引用是指在正規表現中引用之前捕获的内容，できます用 \\1, \\2, 等等表示。\n例： # 匹配文本中的重复单词：\nimport re text = \u0026#34;I saw a dog and a cat, but I didn\u0026#39;t see the dog dog.\u0026#34; # 匹配重复单词 pattern = r\u0026#39;\\b(\\w+)\\b\\s+\\1\\b\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;dog\u0026#39;] 4. 平衡组 # 平衡组主要用于匹配嵌套结构（たとえば括号对等结构）。Python 的标准库 re 不直接支持平衡组操作，但できます通过复杂的逻辑来实现。たとえば，使用 pyparsing 或 regex 模块できます更好地处理。\n例：使用 regex 匹配嵌套括号：\nimport regex text = \u0026#34;(a(b(c)d)e)f(g(h)i)\u0026#34; # 匹配嵌套括号 pattern = r\u0026#39;\\((?\u0026gt;[^\\(\\)]+|(?R))*\\)\u0026#39; matches = regex.findall(pattern, text) print(matches) # 输出：[\u0026#39;(a(b(c)d)e)\u0026#39;, \u0026#39;(b(c)d)\u0026#39;, \u0026#39;(c)\u0026#39;, \u0026#39;(g(h)i)\u0026#39;, \u0026#39;(h)\u0026#39;] 解释：\n(?R) 是递归调用整个正規表現本身。 (?\u0026gt;...) 是原子组，确保括号内的内容是完整匹配。 组合练习：解析复杂数据 # 任务： # 提取所有括号中的内容，但要求括号内不含特定关键词（如 \u0026ldquo;skip\u0026rdquo;）。\n例コード： # import re text = \u0026#34;Match (this), (skip this), and (not skip).\u0026#34; # 匹配括号中的内容，但不包含 \u0026#34;skip\u0026#34; pattern = r\u0026#39;\\((?!.*skip).*?\\)\u0026#39; matches = re.findall(pattern, text) print(matches) # 输出：[\u0026#39;(this)\u0026#39;, \u0026#39;(not skip)\u0026#39;] 任务：验证嵌套括号结构是否匹配 # たとえば：\n输入 \u0026quot;(a(b)c)d\u0026quot; 是有效的。 输入 \u0026quot;a(b(c)d\u0026quot; 是无效的。 例コード： # import regex def is_valid_parentheses(s): # 匹配嵌套括号 pattern = r\u0026#39;^\\((?\u0026gt;[^\\(\\)]+|(?R))*\\)$\u0026#39; return bool(regex.match(pattern, s)) print(is_valid_parentheses(\u0026#34;(a(b)c)d\u0026#34;)) # False print(is_valid_parentheses(\u0026#34;(a(b)c)d)\u0026#34;)) # False print(is_valid_parentheses(\u0026#34;(a(b)c)\u0026#34;)) # True まとめ # 零宽断言：用于检查前后内容是否满足条件，但不消耗匹配的内容。 后向引用：引用前面的捕获内容，特别适合处理重复和结构化数据。 平衡组：用于复杂嵌套结构匹配（需借助 regex 模块）。 通过练习这些场景，你できます熟悉它们的强大功能，并灵活应用到数据处理、ファイル操作和复杂匹配任务中！\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/regex/regrex%E8%A1%A5%E5%85%85/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 零宽断言（lookahead 和 lookbehind）、负向断言、后向引用以及平衡组是正規表現中的高级特性，能够处理更复杂的匹配需求。以下是它们的功能和在 Python 中的具体应用。\n","title":"正規表現補足","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%B9%B3%E8%A1%A1%E7%BB%84/","section":"Tags","summary":"","title":"平衡组","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E9%9B%B6%E5%AE%BD%E6%96%AD%E8%A8%80/","section":"Tags","summary":"","title":"零宽断言","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/regrex/","section":"Categories","summary":"","title":"Regrex","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%AE%9E%E6%88%98%E5%BA%94%E7%94%A8/","section":"Tags","summary":"","title":"实战应用","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E7%BB%83%E4%B9%A0%E9%A2%98/","section":"Tags","summary":"","title":"练习题","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 以下是一些精心设计的正規表現练习，结合了 Python 编程 和 ファイル操作，帮助你熟悉正規表現在不同场景中的实际应用。\n练习一：基本字符匹配 # 目标：掌握正規表現的基础功能。\n任务：\n提取字符串中的所有电话号码（格式如：123-456-7890 或 1234567890）。 提取所有以 \u0026ldquo;test\u0026rdquo; 开头的单词。 コード模板：\nimport re text = \u0026#34;\u0026#34;\u0026#34; 联系人1：123-456-7890 联系人2：9876543210 测试数据：test1, test2, testing \u0026#34;\u0026#34;\u0026#34; # 匹配电话号码 phone_pattern = r\u0026#39;\\d{3}-\\d{3}-\\d{4}|\\d{10}\u0026#39; phones = re.findall(phone_pattern, text) print(\u0026#34;电话号码列表：\u0026#34;, phones) # 匹配以 test 开头的单词 test_pattern = r\u0026#39;\\btest\\w*\\b\u0026#39; test_words = re.findall(test_pattern, text) print(\u0026#34;以 test 开头的单词：\u0026#34;, test_words) 练习二：处理ファイル名 # 目标：熟悉正規表現操作ファイル名。\n任务：\n在指定ファイル夹中，找到所有以 test_ 开头的ファイル。 将这些ファイル重命名为去掉 test_ 的新名字。 コード模板：\nimport os import re folder_path = r\u0026#39;F:\\your_folder\u0026#39; # 替换为你的文件夹路径 # 正则匹配以 test_ 开头的文件 pattern = re.compile(r\u0026#39;^test_(.+)$\u0026#39;) for root, dirs, files in os.walk(folder_path): for file in files: match = pattern.match(file) if match: new_name = match.group(1) os.rename(os.path.join(root, file), os.path.join(root, new_name)) print(f\u0026#34;重命名：{file} -\u0026gt; {new_name}\u0026#34;) 练习三：文本清洗 # 目标：使用正規表現清洗文本数据。\n任务：\n移除文本中的所有 HTML 标签。 替换所有连续的空白字符为单个空格。 コード模板：\nimport re text = \u0026#34;\u0026#34;\u0026#34; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt;\u0026lt;title\u0026gt;测试页面\u0026lt;/title\u0026gt;\u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h1\u0026gt;标题\u0026lt;/h1\u0026gt; \u0026lt;p\u0026gt;这是一个段落。\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt; 还有一些 多余的空格。\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; \u0026#34;\u0026#34;\u0026#34; # 移除 HTML 标签 html_pattern = r\u0026#39;\u0026lt;[^\u0026gt;]+\u0026gt;\u0026#39; clean_text = re.sub(html_pattern, \u0026#39;\u0026#39;, text) print(\u0026#34;去掉 HTML 标签后的文本：\\n\u0026#34;, clean_text) # 替换连续空格为单个空格 space_pattern = r\u0026#39;\\s+\u0026#39; clean_text = re.sub(space_pattern, \u0026#39; \u0026#39;, clean_text) print(\u0026#34;清理空格后的文本：\\n\u0026#34;, clean_text) 练习四：验证用户输入 # 目标：使用正規表現对用户输入进行格式验证。\n任务：\n验证一个输入是否是有效的电子邮件地址。 验证一个输入是否是有效的 URL。 コード模板：\nimport re # 验证电子邮件 email = input(\u0026#34;请输入一个电子邮件地址：\u0026#34;) email_pattern = r\u0026#39;^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$\u0026#39; if re.match(email_pattern, email): print(\u0026#34;有效的电子邮件地址\u0026#34;) else: print(\u0026#34;无效的电子邮件地址\u0026#34;) # 验证 URL url = input(\u0026#34;请输入一个 URL：\u0026#34;) url_pattern = r\u0026#39;^https?://[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}(/.*)?$\u0026#39; if re.match(url_pattern, url): print(\u0026#34;有效的 URL\u0026#34;) else: print(\u0026#34;无效的 URL\u0026#34;) 练习五：提取日志中的 IP 地址 # 目标：从日志ファイル中提取所有的 IP 地址。\n任务：\n打开一个日志ファイル。 提取其中的所有 IPv4 地址。 コード模板：\nimport re # 假设日志内容 log_data = \u0026#34;\u0026#34;\u0026#34; 192.168.0.1 - - [24/Nov/2024:14:15:22] \u0026#34;GET /index.html HTTP/1.1\u0026#34; 200 10.0.0.5 - - [24/Nov/2024:14:16:00] \u0026#34;POST /form.html HTTP/1.1\u0026#34; 404 Invalid log entry 123.456.789.0 \u0026#34;\u0026#34;\u0026#34; # 匹配 IPv4 地址 ip_pattern = r\u0026#39;((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\u0026#39; # 使用 finditer 获取迭代器 matches = re.finditer(ip_pattern, log_data) ips = [match.group(0) for match in matches] print(\u0026#34;提取的 IP 地址：\u0026#34;, ips) 练习六：复杂ファイル名处理 # 目标：掌握ファイル名匹配和高级正規表現。\n任务：\n查找ファイル夹中的所有符合以下模式的ファイル名：课程编号_章节名_説明_时间戳.ext。 从ファイル名中提取 课程编号 和 章节名，生成新的ファイル名格式：课程编号-章节名.ext。 コード模板：\nimport os import re folder_path = r\u0026#39;F:\\your_folder\u0026#39; # 替换为你的文件夹路径 # 匹配复杂文件名 pattern = re.compile(r\u0026#39;^(课程\\d+)_(章节\\d+)_.+?_(\\d+)\\.(.+)$\u0026#39;) for root, dirs, files in os.walk(folder_path): for file in files: match = pattern.match(file) if match: course = match.group(1) chapter = match.group(2) ext = match.group(4) new_name = f\u0026#34;{course}-{chapter}.{ext}\u0026#34; os.rename(os.path.join(root, file), os.path.join(root, new_name)) print(f\u0026#34;重命名：{file} -\u0026gt; {new_name}\u0026#34;) 练习七：动态生成正規表現 # 目标：掌握在コード中动态构造正規表現。\n任务：\n根据用户输入的关键词列表，生成一个动态正規表現，用来查找文本中包含任意关键词的句子。 コード模板：\nimport re text = \u0026#34;\u0026#34;\u0026#34; 今天我学习了正则表达式，它非常有用。 Python 编程语言让我感觉很强大。 我还想学习更多关于人工智能的知识。 \u0026#34;\u0026#34;\u0026#34; # 用户输入关键词 keywords = input(\u0026#34;请输入关键词，用空格分隔：\u0026#34;).split() keyword_pattern = \u0026#39;|\u0026#39;.join(map(re.escape, keywords)) # 动态构造正则表达式 sentence_pattern = fr\u0026#39;\\b.*?({keyword_pattern}).*?\\.\u0026#39; sentences = re.findall(sentence_pattern, text, re.IGNORECASE) print(\u0026#34;匹配的句子：\u0026#34;, sentences) 通过以上练习，你できます逐步熟悉 正規表現的匹配规则，以及如何在 Python ファイル操作 中使用正規表現。完成每个任务后，试着改动规则或扩展功能，进一步加深理解！\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/regex/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%BB%83%E4%B9%A0/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 以下是一些精心设计的正規表現练习，结合了 Python 编程 和 ファイル操作，帮助你熟悉正規表現在不同场景中的实际应用。\n","title":"正規表現練習","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/","section":"Tags","summary":"","title":"文件操作","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%85%83%E5%AD%97%E7%AC%A6/","section":"Tags","summary":"","title":"元字符","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 版本：v2.4.1 (2019-11-15) 作者：deerchao 转载请注明来源\nディレクトリ # 本文目标 如何使用本チュートリアル 正規表現到底是什么东西？ 入门 测试正規表現 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 更新纪录 本文目标 # 30分钟内让你明白正規表現是什么，并对它有一些基本的了解，让你できます在自己的程序或网页里使用它。\n如何使用本チュートリアル # 别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正規表現其实并没有想像中的那么困难。当然，もし你看完了这篇チュートリアル之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的——我认为，没接触过正規表現的人在看完这篇チュートリアル后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还必要多练习，多使用，才能熟练掌握正規表現。\n除了作为入门チュートリアル之外，本文还试图成为できます在日常工作中使用的正規表現语法参考手册。就作者本人的经历来说，この目标还是完成得不错的——你看，我自己也没能把所有的东西记下来，不是吗？\n清除格式 文本格式约定：专业术语 元字符/语法格式 正規表現 正規表現中的一部分(用于分析) 对其进行匹配的源字符串 对正規表現或其中一部分的説明\n隐藏边注 本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常できます忽略。\n本文紹介的大部分正则语法，在不同的正規表現引擎中都できます使用，但也有一些会有所差异。本文紹介的是 .Net 下的正規表現，其它环境下的具体情况できます在读完本文后去参考官方文档，或者確認正規表現引擎特性对比。\n最重要的是——请给我30分钟，もし你没有使用正規表現的经验，请不要试图在30秒内入门——除非你是超人 :)\n正規表現到底是什么东西？ # 在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的必要。正規表現つまり用于描述这些规则的ツール。换句话说，正規表現つまり记录文本规则的コード。\n很可能你使用过Windows/Dos下用于ファイル查找的通配符(wildcard)，也つまり*和?。もし你想查找某个ディレクトリ下的所有的Word文档的话，你会搜索*.doc。在这里，*会被解释成任意的字符串。和通配符类似，正規表現也是用来进行文本匹配的ツール，只不过比起通配符，它能更精确地描述你的需求——当然，代价つまり更复杂——比如你できます编写一个正規表現，用来查找所有以0开头，后面跟着2-3个数字，その後是一个连字号“-”，最後に是7或8位数字的字符串(像010-12345678或0376-7654321)。\n字符是计算机软件处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。字符串是0个或更多个字符的序列。文本也つまり文字，字符串。说某个字符串匹配某个正規表現，通常是指この字符串里有一部分（或几部分分别）能满足表达式给出的条件。\n入门 # 学习正規表現的最好方法是从例子开始，理解例子之后再自己对例子进行変更，实验。下面给出了不少简单的例子，并对它们作了详细的説明。\n假设你在一篇英文小说里查找hi，你できます使用正規表現hi。\n这几乎是最简单的正規表現了，它できます精确匹配这样的字符串：由两个字符组成，前一个字符是h,后一个是i。通常，处理正規表現的ツール会提供一个忽略大小写的选项，もし选中了この选项，它できます匹配hi,HI,Hi,hI这四种情况中的任意一种。\n不幸的是，很多单词里包含hi这两个连续的字符，比如him,history,high等等。用hi来查找的话，这里边的hi也会被找出来。もし要精确地查找hiこの单词的话，我们应该使用\\bhi\\b。\n\\b是正規表現规定的一个特殊コード（好吧，某些人叫它元字符，metacharacter），代表着单词的开头或结尾，也つまり单词的分界处。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是\\b并不匹配这些单词分隔字符中的任何一个，它只匹配一个位置。\nもし必要更精确的说法，\\b匹配这样的位置：它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\\w。\n假如你要找的是hi后面不远处跟着一个Lucy，你应该用\\bhi\\b.*\\bLucy\\b。\n这里，.是另一个元字符，匹配除了换行符以外的任意字符。*同样是元字符，不过它代表的不是字符，也不是位置，而是数量——它指定*前边的内容できます连续重复使用任意次以使整个表达式得到匹配。そのため，.*连在一起就意味着任意数量的不包含换行的字符。现在\\bhi\\b.*\\bLucy\\b的意思就很明显了：先是一个单词hi,その後是任意个任意字符(但不能是换行)，最後に是Lucyこの单词。\n换行符つまり\u0026rsquo;\\n\u0026rsquo;,ASCII编码为10(十六进制0x0A)的字符。\nもし同时使用其它元字符，我们就能构造出功能更强大的正規表現。比以下面この例子：\n0\\d\\d-\\d\\d\\d\\d\\d\\d\\d\\d匹配这样的字符串：以0开头，その後是两个数字，その後是一个连字号“-”，最後に是8个数字(也つまり中国的电话号码。当然，この例子只能匹配区号为3位的情形)。\n这里的\\d是个新的元字符，匹配一位数字(0，或1，或2，或……)。-不是元字符，只匹配它本身——连字符(或者减号，或者中横线，或者随你怎么称呼它)。\n为了避免那么多烦人的重复，我们也できます这样写この表达式：0\\d{2}-\\d{8}。这里\\d后面的{2}({8})的意思是前面\\d必须连续重复匹配2次(8次)。\n测试正規表現 # もし你不觉得正規表現很难读写的话，要么你是一个天才，要么，你不是地球人。正規表現的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，そのため找一种ツール对正規表現进行测试是很有必要的。\n不同的环境下正規表現的一些细节是不相同的，本チュートリアル紹介的是微软 .Net Framework 4.x 下正規表現的行为，そのため，我向你推荐我编写的.Net下的ツール Regester。请参考该页面的説明来インストール和実行该软件。\n下面是Regester実行时的截图：\n你也できます试试この在线测试ツール：Wegester, JavaScript正規表現测试器。\n现在你已经知道几个很有用的元字符了，如\\b,.,*，还有\\d.正規表現里还有更多的元字符，比如\\s匹配任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等。\\w匹配字母或数字或下划线或汉字等。\n对中文/汉字的特殊处理是由.Net提供的正規表現引擎支持的，其它环境下的具体情况请確認相关文档。\n下面来看看更多的例子：\n\\ba\\w*\\b匹配以字母a开头的单词——先是某个单词开始处(\\b)，その後是字母a,その後是任意数量的字母或数字(\\w*)，最後に是单词结束处(\\b)。\n\\d+匹配1个或更多连续的数字。这里的+是和*类似的元字符，不同的是*匹配重复任意次(可能是0次)，而+则匹配重复1次或更多次。\n\\b\\w{6}\\b 匹配刚好6个字符的单词。\n好吧，现在我们说说正規表現里的单词是什么意思吧：つまり不少于一个的连续的\\w。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大 :)\nコード 説明 . 匹配除换行符以外的任意字符 \\w 匹配字母或数字或下划线或汉字 \\s 匹配任意的空白符 \\d 匹配数字 \\b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 元字符^（和数字6在同一个键位上的符号）和$都匹配一个位置，这和\\\\b有点类似。^匹配你要用来查找的字符串的开头，$匹配结尾。这两个コード在验证输入的内容时非常有用，比如一个网站もし要求你填写的QQ号必须为5位到12位数字时，できます使用：^\\d{5,12}$。\n这里的{5,12}和前面紹介过的{2}是类似的，只不过{2}匹配只能不多不少重复2次，{5,12}则是重复的次数不能少于5次，不能多于12次，否则都不匹配。\nなぜなら使用了^和$，そのため输入的整个字符串都要用来和\\d{5,12}来匹配，也つまり说整个输入必须是5到12个数字，そのためもし输入的QQ号能匹配この正規表現的话，那就符合要求了。\n和忽略大小写的选项类似，有些正規表現处理ツール还有一个处理多行的选项。もし选中了この选项，^和$的意义就变成了匹配行的开始处和结束处。\n正規表現引擎通常会提供一个“测试指定的字符串是否匹配一个正規表現”的方法，如JavaScript里的RegExp.test()方法或.NET里的Regex.IsMatch()方法。这里的匹配是指是字符串里有没有符合表达式规则的部分。もし不使用^和$的话，对于\\d{5,12}而言，使用这样的方法就只能保证字符串里包含5到12连续位数字，而不是整个字符串つまり5到12位数字。\n字符转义 # もし你想查找元字符本身的话，比如你查找.,或者*,就出现了問題：你没办法指定它们，なぜなら它们会被解释成别的意思。这时你就得使用\\来取消这些字符的特殊意义。そのため，你应该使用\\.和\\*。当然，要查找\\本身，你也得用\\\\.\nたとえば：deerchao\\.cn匹配deerchao.cn，C:\\\\Windows匹配C:\\Windows。\n重复 # 你已经看过了前面的*,+,{2},{5,12}这几个匹配重复的方式了。下面是正規表現中所有的限定符(指定数量的コード，たとえば*,{5,12}等)：\nコード/语法 説明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 下面是一些使用重复的例子：\nWindows\\d+匹配Windows后面跟1个或更多数字\n^\\w+匹配一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)\n字符类 # 要想查找数字，字母或数字，空白是很简单的，なぜなら已经有了对应这些字符集合的元字符，但是もし你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？\n很简单，你只必要在方括号里列出它们就行了，像\n\\[aeiou\\]就匹配任何一个英文元音字母，\n\\[.?!\\]匹配标点符号(.或?或!)。\n我们也できます轻松地指定一个字符范围，像\n\\[0-9\\]代表的含意与\\dつまり完全一致的：一位数字；同理\n\\[a-z0-9A-Z\\_\\]也完全等同于\\w（もし只考虑英文的话）。\n下面是一个更复杂的表达式：\\(?0\\d{2}\n\\[) -\\]?\\d{8}。\nこの表达式できます匹配几种格式的电话号码，像(010)88886666，或022-22334455，或02912345678等。我们对它进行一些分析吧：まず是一个转义字符\\(,它能出现0次或1次(?),その後是一个0，后面跟着2个数字(\\d{2})，その後是)或-或空格中的一个，它出现1次或不出现(?)，最後に是8个数字(\\d{8})。\n“(”和“)”也是元字符，后面的分组节里会提到，そのため在这里必要使用转义。\n分枝条件 # 不幸的是，刚才那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。要解決この問題，我们必要用到分枝条件。正規表現里的分枝条件指的是有几种规则，もし满足其中任意一种规则都应该当成匹配，具体方法是用|把不同的规则分隔开。听不明白？没关系，看例子：\n0\\d{2}-\\d{8}|0\\d{3}-\\d{7}この表达式能匹配两种以连字号分隔的电话号码：一种是三位区号，8位ローカル号(如010-12345678)，一种是4位区号，7位ローカル号(0376-2233445)。\n\\(0\\d{2}\\)\n\\[- \\]?\\d{8}|0\\d{2}\n\\[- \\]?\\d{8}この表达式匹配3位区号的电话号码，其中区号できます用小括号括起来，也できます不用，区号与ローカル号间できます用连字号或空格间隔，也できます没有间隔。你できます试试用分枝条件把この表达式扩展成也支持4位区号的。\n\\d{5}-\\d{4}|\\d{5}この表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之そのため要给出この例子是なぜなら它能説明一个問題：使用分枝条件时，要注意各个条件的顺序。もし你把它改成\\d{5}|\\d{5}-\\d{4}的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，もし满足了某个分枝的话，就不会去再管其它的条件了。\n分组 # 我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但もし想要重复多个字符又该怎么办？你できます用小括号来指定子表达式(也叫做分组)，その後你就できます指定この子表达式的重复次数了，你也できます对子表达式进行其它一些操作(后面会有紹介)。\n(\\d{1,3}\\.){3}\\d{1,3}是一个简单的IP地址匹配表达式。要理解この表达式，请按下列顺序分析它：\\d{1,3}匹配1到3位的数字，(\\d{1,3}\\.){3}匹配三位数字加上一个英文句号(この整体也つまりこの分组)重复3次，最後に再加上一个一到三位的数字(\\d{1,3})。\n不幸的是，它也将匹配256.300.888.999这种不可能存在的IP地址。もし能使用算术比较的话，或许能简单地解決この問題，但是正規表現中并不提供关于数学的任何功能，そのため只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：((2\n\\[0-4\\]\\d|25\n\\[0-5\\]|\n\\[01\\]?\\d\\d?)\\.){3}(2\n\\[0-4\\]\\d|25\n\\[0-5\\]|\n\\[01\\]?\\d\\d?)。\n理解この表达式的关键是理解2\n\\[0-4\\]\\d|25\n\\[0-5\\]|\n\\[01\\]?\\d\\d?，这里我就不细说了，你自己应该能分析得出来它的意义。\nIP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字できます包含有前导 0 (leading zeroes).\n反义 # 有时必要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时必要用到反义：\nコード/语法 説明 \\W 匹配任意不是字母，数字，下划线，汉字的字符 \\S 匹配任意不是空白符的字符 \\D 匹配任意非数字的字符 \\B 匹配不是单词开头或结束的位置 \\[^x\\] 匹配除了x以外的任意字符 \\[^aeiou\\] 匹配除了aeiou这几个字母以外的任意字符 例子：\\S+匹配不包含空白符的字符串。\n\u0026lt;a\n\\[^\u003e\\]+\u0026gt;匹配用尖括号括起来的以a开头的字符串。\n以下是将你提供的内容変更成适合 Markdown 格式的笔记版本：\n后向引用 # 使用小括号指定一个子表达式后，匹配この子表达式的文本（也つまり此分组捕获的内容）できます在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个组号，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为 1，第二个为 2，以此类推。\n实际上，组号分配过程要从左向右扫描两遍：第一遍只给未命名组分配，第二遍只给命名组分配——そのため所有命名组的组号都大于未命名的组号。你できます使用 (?:exp) 这样的语法来剥夺一个分组对组号分配的参与权。\n后向引用例 # 后向引用用于重复搜索前面某个分组匹配的文本。たとえば，\\\\1 代表分组 1 匹配的文本。以下正規表現できます用来匹配重复的单词：\n\\\\b(\\\\w+)\\\\b\\\\s+\\\\1\\\\b この表达式まず匹配一个单词，その後是 1 个或几个空白符，最後に是分组 1 中捕获的内容（也つまり前面匹配的那个单词）。\n你也できます自己指定子表达式的组名。要指定一个子表达式的组名，请使用这样的语法：\n(?\u0026lt;Word\u0026gt;\\\\w+) その後できます使用 \\\\k\u0026lt;Word\u0026gt; 来反向引用この分组捕获的内容，そのため上一个例子できます改写为：\n\\\\b(?\u0026lt;Word\u0026gt;\\\\w+)\\\\b\\\\s+\\\\k\u0026lt;Word\u0026gt;\\\\b 常用分组语法 # 分类 コード/语法 説明 捕获 (exp) 匹配 exp 并捕获文本到自动命名的组里 捕获命名组 (?\u0026lt;name\u0026gt;exp) 匹配 exp 并捕获文本到名称为 name 的组里 非捕获分组 (?:exp) 匹配 exp，不捕获匹配的文本，也不给此分组分配组号 零宽断言 (?=exp) 匹配 exp 前面的位置 零宽回顾 (?\u0026lt;=exp) 匹配 exp 后面的位置 负向零宽断言 (?!exp) 匹配后面跟的不是 exp 的位置 负向零宽回顾 (?\u0026lt;!exp) 匹配前面不是 exp 的位置 注释 (?#comment) 这类分组不会影响正規表現的处理，用于注释 零宽断言 # 零宽断言用于查找在某些内容（但并不包括这些内容）之前或之后的东西。它们像 \\\\b, ^, $ 那样用于指定一个位置，この位置应该满足一定的条件（即断言），そのため它们也被称为零宽断言。\n正向先行断言 # (?=exp) 也叫零宽度正预测先行断言，它断言当前位置后面能匹配 exp。\nたとえば：\n\\\\b\\\\w+(?=ing\\\\b) 它会匹配以 ing 结尾的单词的前部分。\n正回顾后发断言 # (?\u0026lt;=exp) 也叫零宽度正回顾后发断言，它断言当前位置前面能匹配 exp。\nたとえば：\n(?\u0026lt;=\\\\bre)\\\\w+\\\\b 它会匹配以 re 开头的单词的后半部分。\n负向零宽断言 # もし你想要确保某个字符没有出现，できます使用负向零宽断言。たとえば，匹配包含字母 q 且后面不是字母 u 的单词：\n\\\\b\\\\w*q[^u]\\\\w*\\\\b もし q 是单词的最後に一个字符，できます使用负向先行断言解決問題：\n\\\\b\\\\w*q(?!u)\\\\w*\\\\b 例 # \\\\d{3}(?!\\\\d) 匹配三位数字，且后面不能是数字。 (?\u0026lt;=\u0026lt;(\\\\w+)\u0026gt;).*?(?=\u0026lt;\\\\/\\\\1\u0026gt;) 匹配 HTML 标签内的内容。 贪婪与懒惰 # 贪婪匹配表示尽可能多地匹配字符，而懒惰匹配表示尽可能少地匹配字符。\n贪婪匹配 # たとえば：\na.*b 它会匹配以 a 开头，以 b 结尾的最长字符串。\n懒惰匹配 # 懒惰匹配通过在量词后面加上问号 ? 来实现：\na.*?b 它会匹配以 a 开头，以 b 结尾的最短字符串。\n处理选项 # 在正規表現中，你できます使用一些选项来改变处理方式，たとえば忽略大小写、处理多行等。\n名称 説明 IgnoreCase 匹配时不区分大小写 Multiline 使 ^ 和 $ 匹配任意一行的行首和行尾 Singleline 使 . 匹配所有字符（包括换行符） IgnorePatternWhitespace 忽略表达式中的空白符并启用注释 ExplicitCapture 仅捕获显式命名的组 平衡组/递归匹配 # 平衡组语法用于匹配嵌套的层次结构，如括号之间的内容。以下是一个使用平衡组的正規表現例：\n\u0026lt; # 最外层的左括号 [^\u0026lt;\u0026gt;]* # 非括号的内容 ( ( (?\u0026#39;Open\u0026#39;\u0026lt;) # 左括号，压入 \u0026#34;Open\u0026#34; [^\u0026lt;\u0026gt;]* # 左括号后面的内容 )+ ( (?\u0026#39;-Open\u0026#39;\u0026gt;) # 右括号，弹出 \u0026#34;Open\u0026#34; [^\u0026lt;\u0026gt;]* # 右括号后面的内容 )+ )* (?(Open)(?!)) # 检查是否存在未弹出的 \u0026#34;Open\u0026#34; \u0026gt; # 最外层的右括号 この例できます匹配嵌套的 \u0026lt;div\u0026gt; 标签。\n其他未提到的内容 # コード/语法 説明 \\\\a 报警字符（电脑发出嘀声） \\\\b 单词边界（在字符类里是退格符） \\\\t 制表符（Tab） \\\\r 回车符 \\\\n 换行符 \\\\xnn 十六进制表示的 ASCII 字符 \\\\unnnn Unicode 字符 \\\\A 字符串开头（类似 ^） \\\\Z 字符串结尾或行尾（不受多行选项影响） ","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/regex/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F30%E5%88%86%E9%92%9F%E5%85%A5%E9%97%A8/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 版本：v2.4.1 (2019-11-15) 作者：deerchao 转载请注明来源\n","title":"正規表現 30 分入門","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/","section":"Tags","summary":"","title":"入门教程","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F/","section":"Tags","summary":"","title":"匹配模式","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%88%86%E7%BB%84/","section":"Tags","summary":"","title":"分组","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/pip/","section":"Tags","summary":"","title":"Pip","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/python/","section":"Categories","summary":"","title":"Python","type":"categories"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 1. 基础结构 # setup.py 是 Python 打包的核心設定ファイル，需使用 setuptools 库定义包的元数据和构建规则。\n基本模板 # from setuptools import setup, find_packages setup( name=\u0026#34;your-package-name\u0026#34;, # 包名（PyPI唯一标识） version=\u0026#34;0.1.0\u0026#34;, # 版本号 author=\u0026#34;Your Name\u0026#34;, author_email=\u0026#34;your@email.com\u0026#34;, description=\u0026#34;Short description\u0026#34;, long_description=open(\u0026#34;README.md\u0026#34;).read(), # 长描述（README内容） long_description_content_type=\u0026#34;text/markdown\u0026#34;, # README格式 url=\u0026#34;https://github.com/yourusername/your-package\u0026#34;, # 项目地址 packages=find_packages(), # 自动发现包目录 install_requires=[], # 依赖库列表 entry_points={}, # 命令行工具入口 classifiers=[], # PyPI分类标签 python_requires=\u0026#34;\u0026gt;=3.6\u0026#34;, # Python版本要求 ) 2. 关键参数详解 # (1) name # 作用：包在 PyPI 上的唯一标识符。 规则： 必须全小写，可用连字符（-），如 my-package。 需在 PyPI 上未被占用（上传前检查）。 (2) version # 作用：包的版本号，每次更新必须递增。 格式：推荐语义化版本（如 1.0.0, 0.2.5）。 (3) packages # 作用：指定包含的 Python 包ディレクトリ。 自动发现： packages=find_packages(), # 自动搜索所有含 __init__.py 的目录 手动指定： packages=[\u0026#34;my_package\u0026#34;, \u0026#34;my_package.submodule\u0026#34;], (4) install_requires # 作用：定义包的依赖库及版本约束。 例： install_requires=[ \u0026#34;requests\u0026gt;=2.25.1\u0026#34;, # 最低版本 \u0026#34;numpy\u0026lt;1.22,\u0026gt;=1.20\u0026#34;, # 版本范围 \u0026#34;pandas\u0026#34;, # 不限制版本 ] (5) entry_points # 作用：定义コマンド行ツール入口，生成可执行コマンド。 例： entry_points={ \u0026#34;console_scripts\u0026#34;: [ \u0026#34;my-command=my_package.module:main\u0026#34;, # 格式：命令名=包.模块:函数 ], } 用户インストール后可直接実行 my-command。 (6) package_data # 作用：包含包内的非コードファイル（如数据、設定ファイル）。 例： package_data={ \u0026#34;my_package\u0026#34;: [\u0026#34;data/*.csv\u0026#34;, \u0026#34;templates/*.html\u0026#34;], }, (7) include_package_data # 作用：自动包含 MANIFEST.in 中指定的ファイル。 用法： include_package_data=True, # 需配合 MANIFEST.in 文件 (8) classifiers # 作用：为 PyPI 提供包的分类标签（便于搜索）。 常用选项： classifiers=[ \u0026#34;Programming Language :: Python :: 3\u0026#34;, \u0026#34;License :: OSI Approved :: MIT License\u0026#34;, \u0026#34;Operating System :: OS Independent\u0026#34;, \u0026#34;Topic :: Software Development :: Libraries\u0026#34;, ] 完整列表见：PyPI Classifiers 3. 完整例 # 假设项目结构以下：\nmy_project/ ├── my_package/ │ ├── __init__.py │ ├── main.py │ └── data/ │ └── config.json ├── README.md ├── LICENSE └── setup.py 对应的 setup.py：\nfrom setuptools import setup, find_packages setup( name=\u0026#34;my-awesome-tool\u0026#34;, version=\u0026#34;0.1.0\u0026#34;, author=\u0026#34;Jane Doe\u0026#34;, author_email=\u0026#34;jane@example.com\u0026#34;, description=\u0026#34;A tool to do awesome things.\u0026#34;, long_description=open(\u0026#34;README.md\u0026#34;).read(), long_description_content_type=\u0026#34;text/markdown\u0026#34;, url=\u0026#34;https://github.com/janedoe/my-awesome-tool\u0026#34;, packages=find_packages(), install_requires=[ \u0026#34;requests\u0026gt;=2.25.1\u0026#34;, \u0026#34;click\u0026gt;=8.0.0\u0026#34;, # 命令行库 ], entry_points={ \u0026#34;console_scripts\u0026#34;: [ \u0026#34;awesome-tool=my_package.main:cli\u0026#34;, # 假设 main.py 有 cli() 函数 ], }, package_data={ \u0026#34;my_package\u0026#34;: [\u0026#34;data/*.json\u0026#34;], # 包含 data 目录下的 JSON 文件 }, classifiers=[ \u0026#34;Programming Language :: Python :: 3\u0026#34;, \u0026#34;License :: OSI Approved :: MIT License\u0026#34;, \u0026#34;Operating System :: OS Independent\u0026#34;, ], python_requires=\u0026#34;\u0026gt;=3.7\u0026#34;, ) 4. 包含额外ファイル：MANIFEST.in # もし必要包含包外的ファイル（如文档、测试数据），需作成 MANIFEST.in ファイル：\ninclude LICENSE README.md recursive-include docs * recursive-include tests * 5. 验证与打包 # (1) 生成分发包 # pip install setuptools wheel # 确保工具已安装 python setup.py sdist bdist_wheel # 生成源码包和二进制包 生成ファイル在 dist/ ディレクトリ。 (2) ローカル测试インストール # pip install . # 在当前目录安装包 awesome-tool # 测试命令行工具 6. 关键注意事项 # 包名唯一性：在 PyPI 搜索确认包名未被占用。 版本号递增：每次更新コード后需変更 version。 依赖管理：精确指定依赖版本，避免未来更新导致兼容性問題。 许可证：必须包含 LICENSE ファイル，并在 classifiers 中声明。 入口函数：确保 entry_points 指向的函数已正确定义。 通过以上手順，你できます编写一个完整的 setup.py ファイル，为发布到 PyPI 做好准备。\n7. 提一嘴之生成可执行ファイル # 使用ツール如 PyInstaller 或 cx_Freeze 将Python脚本转换为独立的可执行ファイル：\n1. 使用 PyInstaller # インストール： pip install pyinstaller 生成可执行ファイル： pyinstaller --onefile your_script.py --onefile 生成单个可执行ファイル。\n输出在 dist/ ディレクトリ中。\n跨平台：需在目标操作システム下分别打包。\n2. 注意事项 # 依赖处理：PyInstaller会自动分析脚本依赖，但某些复杂情况（如动态导入）可能必要手动設定（使用 .spec ファイル）。\nファイル大小：因包含Python解释器和依赖库，生成ファイル较大。\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/tools/python%E4%BD%BF%E7%94%A8pip%E4%B9%8Bsetup-py%E7%BC%96%E5%86%99/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 1. 基础结构 # setup.py 是 Python 打包的核心設定ファイル，需使用 setuptools 库定义包的元数据和构建规则。\n","title":"Python pip 用 setup.py の書き方","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/setup.py/","section":"Tags","summary":"","title":"Setup.py","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/setuptools/","section":"Tags","summary":"","title":"Setuptools","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/","section":"Categories","summary":"","title":"プログラミング","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/categories/%E7%BC%96%E7%A8%8B/","section":"Categories","summary":"","title":"编程","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E5%8C%85%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"包管理","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/android/","section":"Tags","summary":"","title":"Android","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 3. Add a provider that offers secure DNS # This is where it can get a bit tricky. You need to have the address of a provider that offers Private DNS. Here\u0026rsquo;s my provider of choice: 1dot1dot1dot1.cloudflare-dns.com Some other possible hostnames you can use: # Google DNS: dns.google\nQuad9: dns.quad9.net\nCleanbrowsing DNS: security-filter-dns.cleanbrowsing.org\nOpen DNS: 208.67.222.222\nNextDNS: 45.90.28.0\nComodo Secure 8.26.56.26\nOpenNIC: 192.95.54.3\nNote: Although the above free DNS services are all worth trying, I recommend going with Cloudflare (1dot1dot1dot1.cloudflare-dns.com). I find it the fastest and the most secure of the bunch. On top of the speed, Cloudflare adds DNS filtering into the mix, which can help prevent email from being sent from malicious IP addresses.\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/tools/android-privatedns/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 3. Add a provider that offers secure DNS # This is where it can get a bit tricky. You need to have the address of a provider that offers Private DNS. Here’s my provider of choice: ","title":"Android Private DNS","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/%E6%9D%82/","section":"Categories","summary":"","title":"杂","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/","section":"Categories","summary":"","title":"计算机","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E9%9A%90%E7%A7%81/","section":"Tags","summary":"","title":"隐私","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E7%A7%BB%E5%8A%A8%E8%AE%BE%E5%A4%87/","section":"Tags","summary":"","title":"移动设备","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E7%BD%91%E7%BB%9C/","section":"Tags","summary":"","title":"网络","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 You can find my dotfiles here.\nOpen a terminal window # Open a terminal window on your macOs or linux machine.\nI’m using Alacritty on macOs and I’m using the zsh shell.\nInstall Homebrew # Run the following command:\n/bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; If necessary, when prompted, enter your password here and press enter. If you haven’t installed the XCode Command Line Tools, when prompted, press enter and homebrew will install this as well.\nAdd To Path (Only Apple Silicon Macbooks) # After installing, add it to the path. This step shouldn’t be necessary on Intel macs.\nRun the following two commands to do so:\necho \u0026#39;eval \u0026#34;$(/opt/homebrew/bin/brew shellenv)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.zprofile eval \u0026#34;$(/opt/homebrew/bin/brew shellenv)\u0026#34; #1: fzf (command line fuzzy finder) # fzf is an amazing fuzzy finder for the command line.\nInstall fzf with homebrew:\nThis will vary slightly depending on the shell that you’re using, I’m using zsh.\nOpen ~/.zshrc file with your favorite editor. I personally use Neovim.\nWith TextEdit:\nWith VSCode (you have to have it installed):\nWith Neovim (what I use):\nTo the bottom of the file add:\n# ---- FZF ----- # Set up fzf key bindings and fuzzy completion eval \u0026#34;$(fzf --zsh)\u0026#34; After saving, in your terminal reload the zsh configuration:\nNow you can use fzf!\nExamples of what you can do with it:\nExample Description CTRL-t Look for files and directories CTRL-r Look through command history Enter Select the item Ctrl-j or Ctrl-n or Down arrow Go down one result Ctrl-k or Ctrl-p or Up arrow Go up one result Tab Mark a result Shift-Tab Unmark a result cd **Tab Open up fzf to find directory export **Tab Look for env variable to export unset **Tab Look for env variable to unset unalias **Tab Look for alias to unalias ssh **Tab Look for recently visited host names kill -9 **Tab Look for process name to kill to get pid any command (like nvim or code) + **Tab Look for files \u0026amp; directories to complete command Use fd with fzf # fzf by default uses the find command to look for files and directories.\nLet’s replace that with fd for better functionality, like ignoring files ignored by git (with .gitignore).\nInstall fd:\nOpen ~/.zshrc with preferred text editor.\nAdd to the bottom of this file:\n# -- Use fd instead of fzf -- export FZF_DEFAULT_COMMAND=\u0026#34;fd --hidden --strip-cwd-prefix --exclude .git\u0026#34; export FZF_CTRL_T_COMMAND=\u0026#34;$FZF_DEFAULT_COMMAND\u0026#34; export FZF_ALT_C_COMMAND=\u0026#34;fd --type=d --hidden --strip-cwd-prefix --exclude .git\u0026#34; # Use fd (https://github.com/sharkdp/fd) for listing path candidates. # - The first argument to the function ($1) is the base path to start traversal # - See the source code (completion.{bash,zsh}) for the details. _fzf_compgen_path() { fd --hidden --exclude .git . \u0026#34;$1\u0026#34; } # Use fd to generate the list for directory completion _fzf_compgen_dir() { fd --type=d --hidden --exclude .git . \u0026#34;$1\u0026#34; } After saving, in your terminal do:\nSetup fzf-git # fzf-git is a really nice script to look for git related things (commits, hashes, files and more) with fzf.\nNavigate to your home directory:\nClone the repository:\ngit clone https://github.com/junegunn/fzf-git.sh.git Open ~/.zshrc with preferred text editor and add to the bottom:\nsource ~/fzf-git.sh/fzf-git.sh Save and in terminal run:\nNow you can use the following:\nKeybind Description CTRL-GF Look for git files with fzf CTRL-GB Look for git branches with fzf CTRL-GT Look for git tags with fzf CTRL-GR Look for git remotes with fzf CTRL-GH Look for git commit hashes with fzf CTRL-GS Look for git stashes with fzf CTRL-GL Look for git reflogs with fzf CTRL-GW Look for git worktrees with fzf CTRL-GE Look for git for-each-ref with fzf Hold down CTRL and then press GF or one of the others consecutively and quickly.\nSetup a custom theme for fzf # You can also setup a custom theme for fzf.\nTo use mine you can add this to ~/.zshrc:\n# --- setup fzf theme --- fg=\u0026#34;#CBE0F0\u0026#34; bg=\u0026#34;#011628\u0026#34; bg_highlight=\u0026#34;#143652\u0026#34; purple=\u0026#34;#B388FF\u0026#34; blue=\u0026#34;#06BCE4\u0026#34; cyan=\u0026#34;#2CF9ED\u0026#34; export FZF_DEFAULT_OPTS=\u0026#34;--color=fg:${fg},bg:${bg},hl:${purple},fg+:${fg},bg+:${bg_highlight},hl+:${purple},info:${blue},prompt:${cyan},pointer:${cyan},marker:${cyan},spinner:${cyan},header:${cyan}\u0026#34; If you want to make your own check out the theme generator\n#2: bat (better cat) # bat is a really nice alternative to cat to display file contents in the terminal with syntax highlighting.\nInstall with homebrew:\nNow you can start using it!\nExample:\nThe example above would print out the contents of a file called filename.txt.\nTo see examples of all of the themes you can use:\nbat --list-themes | fzf --preview=\u0026#34;bat --theme={} --color=always /path/to/file\u0026#34; Make sure to replace /path/to/file with the path to an actual file.\nInstall a custom theme # If you find a theme on github for example, you can follow these steps.\nThe first time you do this create the following directory:\nmkdir -p \u0026#34;$(bat --config-dir)/themes\u0026#34; Then move into it:\ncd \u0026#34;$(bat --config-dir)/themes\u0026#34; Then you can download the file for the theme you want to use into this directory.\nThe file should use the .tmTheme extension.\nFor example:\ncurl -O https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/sublime/tokyonight_night.tmTheme This will install the night version of the tokyonight theme.\nThen to use it run:\nAnd then add the following to your ~/.zshrc:\n# ----- Bat (better cat) ----- export BAT_THEME=tokyonight_night Replace tokyonight_night with the name of the theme you would like to use.\nThen save this file and run:\n#3: delta (better git diff) # delta is a great way to produce better git diffs using the syntax highlighting functionality of bat.\nInstall it:\nThen open your ~/.gitconfig file.\nWith TextEdit:\nWith VSCode (you have to have it installed):\nWith Neovim (what I use):\nAdd the following to it:\n[core] pager = delta [interactive] diffFilter = delta --color-only [delta] navigate = true # use n and N to move between diff sections side-by-side = true # delta detects terminal colors automatically; set one of these to disable auto-detection # dark = true # light = true [merge] conflictstyle = diff3 [diff] colorMoved = default You can remove side-by-side=true if you don’t want side by side diffs.\nAfter saving this file your git diffs should look a lot nicer.\nSetup fzf previews # Now that you have eza and bat setup you can setup some really nice previews for fzf.\nIn your ~/.zshrc, where you’re configuring fzf, add the following:\nexport FZF_CTRL_T_OPTS=\u0026#34;--preview \u0026#39;bat -n --color=always --line-range :500 {}\u0026#39;\u0026#34; export FZF_ALT_C_OPTS=\u0026#34;--preview \u0026#39;eza --tree --color=always {} | head -200\u0026#39;\u0026#34; # Advanced customization of fzf options via _fzf_comprun function # - The first argument to the function is the name of the command. # - You should make sure to pass the rest of the arguments to fzf. _fzf_comprun() { local command=$1 shift case \u0026#34;$command\u0026#34; in cd) fzf --preview \u0026#39;eza --tree --color=always {} | head -200\u0026#39; \u0026#34;$@\u0026#34; ;; export|unset) fzf --preview \u0026#34;eval \u0026#39;echo $\u0026#39;{}\u0026#34; \u0026#34;$@\u0026#34; ;; ssh) fzf --preview \u0026#39;dig {}\u0026#39; \u0026#34;$@\u0026#34; ;; *) fzf --preview \u0026#34;bat -n --color=always --line-range :500 {}\u0026#34; \u0026#34;$@\u0026#34; ;; esac } This will setup file previews with bat as well as directory previews with eza and some other previews as well.\nThere is one slight issue with this code though. When we are looking for files and directories with Ctrl-T or doing something like nvim **Tab, we are using bat to generate the preview but this won’t work for directories and we’ll get an error.\nWe can fix this by using an if statement that checks whether the path to what we should preview is a directory or not and use eza instead for the preview in this case.\nTo do this you can replace the previous code with something like the following:\nshow_file_or_dir_preview=\u0026#34;if [ -d {} ]; then eza --tree --color=always {} | head -200; else bat -n --color=always --line-range :500 {}; fi\u0026#34; export FZF_CTRL_T_OPTS=\u0026#34;--preview \u0026#39;$show_file_or_dir_preview\u0026#39;\u0026#34; export FZF_ALT_C_OPTS=\u0026#34;--preview \u0026#39;eza --tree --color=always {} | head -200\u0026#39;\u0026#34; # Advanced customization of fzf options via _fzf_comprun function # - The first argument to the function is the name of the command. # - You should make sure to pass the rest of the arguments to fzf. _fzf_comprun() { local command=$1 shift case \u0026#34;$command\u0026#34; in cd) fzf --preview \u0026#39;eza --tree --color=always {} | head -200\u0026#39; \u0026#34;$@\u0026#34; ;; export|unset) fzf --preview \u0026#34;eval \u0026#39;echo ${}\u0026#39;\u0026#34; \u0026#34;$@\u0026#34; ;; ssh) fzf --preview \u0026#39;dig {}\u0026#39; \u0026#34;$@\u0026#34; ;; *) fzf --preview \u0026#34;$show_file_or_dir_preview\u0026#34; \u0026#34;$@\u0026#34; ;; esac } #4: eza (better ls) # eza is a better version of ls with lots of different options.\nInstall it:\nNow you can start using it!\nYou can create an alias for it in ~/.zshrc like so:\n# ---- Eza (better ls) ----- alias ls=\u0026#34;eza --color=always --long --git --no-filesize --icons=always --no-time --no-user --no-permissions\u0026#34; #5: tldr (user-friendly man pages) # tldr is a huge collection of community maintained help pages with helpful summaries for cli tools. You can use this as an alternative to man pages.\nInstall the rust client with homebrew:\nNow you can use it just like man to learn more about a tool.\nFor example to learn more about eza:\n#6: thefuck # thefuck is a really nice tool to auto correct mistyped commands.\nInstall it like so:\nThen open your ~/.zshrc file and add:\n# thefuck alias eval $(thefuck --alias) This will setup the alias which is fuck.\nYou can also add your own custom alias:\n# thefuck alias eval $(thefuck --alias) eval $(thefuck --alias fk) Save your zshrc file and run:\nNow if mistype a command you can run fuck afterwards.\nIf there are is more than one result you can use your up and down arrow keys and then enter to select the one you want.\n#7: zoxide (better cd) # zoxide is an amazing alternative to cd.\nIt will remember the directories you’ve visited in the past and make it really easy to navigate back to them by just typing out a portion of the name of the directory you want to visit.\nInstall it like so:\nThen add the following to ~/.zshrc:\n# ---- Zoxide (better cd) ---- eval \u0026#34;$(zoxide init zsh)\u0026#34; If you want to keep using cd then create an alias in ~/.zshrc:\n# ---- Zoxide (better cd) ---- eval \u0026#34;$(zoxide init zsh)\u0026#34; alias cd=\u0026#34;z\u0026#34; Save and then run:\nNow you can use z as a much smarter replacement to cd.\nIf you want to trigger fzf when you’re moving to a directory with z you can do space + tab.\nThat’s it! 🚀 # ","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/tools/7-amazing-cli-tools/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 You can find my dotfiles here.\n","title":"7 つの素晴らしい CLI ツール","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/cli%E5%B7%A5%E5%85%B7/","section":"Tags","summary":"","title":"CLI工具","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/categories/cli%E7%9B%B8%E5%85%B3/","section":"Categories","summary":"","title":"CLI相关","type":"categories"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/homebrew/","section":"Tags","summary":"","title":"Homebrew","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3/","section":"Tags","summary":"","title":"コマンドライン","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E7%BB%88%E7%AB%AF/","section":"Tags","summary":"","title":"终端","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/","section":"Tags","summary":"","title":"命令行","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/gnome/","section":"Tags","summary":"","title":"GNOME","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/kde/","section":"Tags","summary":"","title":"KDE","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/xorg/","section":"Tags","summary":"","title":"Xorg","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Wayland、Xorg、GNOME、KDE 这些术语在 Linux 图形システム和桌面环境中扮演着不同的角色。它们分别负责不同的功能，彼此之间相互协作，提供完整的图形用户体验。下面我将解释它们的关系以及各自的定义：\n省流:\n用户与桌面环境(KDE,GNOME)交互 桌面环境和显示サーバー协议(wayland,xrog)交互 显示サーバー和内核交互 内核与硬件交互 1. Xorg 和 Wayland: 显示サーバー协议 # Xorg 和 Wayland 是两种不同的 显示サーバー协议，它们负责在 Linux システム上管理图形显示、处理输入设备（如鼠标、键盘）的交互，协调窗口的绘制。\nXorg（X Window System 或 X 11）:\n概念: Xorg 是最早的、也是最广泛使用的显示サーバー协议，它在 Linux 和类 Unix システム上実行，已经有几十年的历史。 功能: Xorg 提供了客户端-サーバー架构，应用程序通过 X 协议与显示サーバー通信，显示サーバー负责处理输入设备、管理窗口绘制、以及将图形内容显示在屏幕上。 优缺点: 优点: 经过多年开发，兼容性好，支持广泛的硬件和软件。 缺点: 架构较为老旧，性能問題和安全性不足（如通过ネットワークリモート访问图形界面时可能有性能损失）。 使用场景: Xorg 仍然是大多数 Linux システム的默认显示サーバー，特别是在不支持 Wayland 的情况下。 Wayland:\n概念: Wayland 是一个较新的显示サーバー协议，旨在替代 Xorg，它简化了架构，提供更现代化的性能和安全性。 功能: Wayland 将显示管理和窗口管理的许多任务移交给应用程序，由窗口管理器（即 Wayland Compositor）来完成，减少了传统 Xorg 的复杂性和延迟問題。 优缺点: 优点: 架构简洁，性能更好，延迟更低，尤其是针对现代硬件的支持更完善，提供更好的图形效果和安全性。 缺点: 虽然已经发展了多年，但在某些方面的兼容性（如某些老应用程序或图形驱动程序）可能不如 Xorg 完善。 使用场景: GNOME 和 KDE 等现代桌面环境越来越多地采用 Wayland，尤其在高性能、高安全性要求的场景下。 2. GNOME 和 KDE: 桌面环境 # GNOME 和 KDE 是 Linux 上的 桌面环境（Desktop Environment），它们提供了图形用户界面（GUI）以及与用户交互的各种ツール和应用程序。\nGNOME:\n概念: GNOME 是一个广泛使用的桌面环境，以简洁、高效、现代的设计为特点。 功能: GNOME 提供了窗口管理器、ファイル管理器、应用程序启动器、システム设置等图形界面ツール，帮助用户管理システム和应用程序。它默认使用 Wayland 作为显示协议（但也兼容 Xorg），并且在一些 Linux 发行版（如 Fedora、Ubuntu GNOME）中默认采用。 特性: 用户界面简洁，强调简化操作，减少复杂的设置选项。 默认使用 Wayland，提供现代图形处理和显示性能。 窗口管理器: GNOME 使用 Mutter 作为窗口管理器，它同时也是 Wayland 的合成器。 KDE Plasma:\n概念: KDE Plasma 是另一个流行的桌面环境，以高度可定制化和丰富的功能著称。它适合那些希望更多自定义选项和控制的用户。 功能: KDE Plasma 提供了丰富的桌面定制ツール和应用程序，用户できます根据必要调整外观、行为和设置。KDE Plasma 也支持 Wayland 和 Xorg。 特性: 提供丰富的設定选项，用户できます对桌面环境的每个部分进行自定义。 支持 Wayland，但在某些情况下仍使用 Xorg，尤其是在 Wayland 兼容性不足的情况下。 窗口管理器: KDE Plasma 使用 KWin 作为窗口管理器，它同时支持 Xorg 和 Wayland 协议。 3. 关系まとめ # 显示サーバー协议（Xorg 和 Wayland）: 负责处理システム的图形输出和输入设备。它们是桌面环境的底层技术，直接与操作システム的内核和硬件交互。\nXorg 是老式的、功能成熟的显示サーバー协议，兼容性广泛。 Wayland 是现代的显示サーバー协议，提供更好的性能和安全性，正逐步取代 Xorg。 桌面环境（GNOME 和 KDE）: 是在显示サーバー之上実行的图形用户界面，它们提供了一整套交互ツール和应用程序，让用户できます方便地操作和管理システム。\nGNOME 提倡简洁、现代的界面设计，默认支持 Wayland。 KDE 强调可定制性和丰富功能，同时支持 Xorg 和 Wayland。 4. 工作方式举例： # 当你启动一个 Linux システム时，显示サーバー协议（如 Xorg 或 Wayland）まず负责启动和管理显示设备。 その後，桌面环境（如 GNOME 或 KDE Plasma）会通过显示サーバー协议与操作システム交互，提供你所看到的图形界面、窗口管理、任务栏等。 桌面环境的具体表现、功能和风格由其内部的组件（如 Mutter 和 KWin）决定，而这些组件则通过 Xorg 或 Wayland 来与硬件互动。 你目前使用的 GNOME 桌面环境 是基于 Wayland 的，但也できます切换回 Xorg。もし你有其他桌面环境（如 KDE Plasma），できます根据自己的需求选择不同的图形协议和桌面环境。\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/tools/%E5%9B%BE%E5%BD%A2%E5%8C%96%E7%9B%B8%E5%85%B3%E7%A7%91%E6%99%AE/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Wayland、Xorg、GNOME、KDE 这些术语在 Linux 图形システム和桌面环境中扮演着不同的角色。它们分别负责不同的功能，彼此之间相互协作，提供完整的图形用户体验。下面我将解释它们的关系以及各自的定义：\n","title":"グラフィカル環境関連の基礎知識","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/inode/","section":"Tags","summary":"","title":"Inode","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 ファイル描述符 # ファイル在 Linux システム中通过ファイル描述符与内核进行交互。打开ファイル时，Linux 内核会执行以下手順：\nシステム调用：当用户程序调用 open() 打开ファイル时，它会触发一个システム调用，通过内核与硬件进行交互。 ファイルシステム操作：内核会查找ファイルパス对应的 inode 结构，inode 存储ファイル的元数据（如ファイル大小、权限、数据块位置等）。 缓存与メモリ映射：内核会将ファイル数据从磁盘加载到メモリ中的缓存（page cache）中，以加速后续的ファイル读取操作。もしファイル很大，内核可能会使用メモリ映射（mmap()）将ファイル映射到プロセス的虚拟地址空间。 在 Linux 中，ファイル共享主要指多个プロセス或多个スレッド对同一ファイル的並行访问。ファイル共享不仅仅包括並行访问ファイル内容，还涉及对ファイル描述符和ファイル锁定的管理。\n3.1 ファイル描述符和共享 # 每个プロセス在打开ファイル时，都会获取一个ファイル描述符（file descriptor）。ファイル描述符是内核中的一个索引，它指向一个 file 结构，この结构包含了ファイル的状态和偏移量等信息。多个プロセスもし打开相同的ファイル，它们会共享ファイル描述符，指向同一个ファイル结构。\n内核在处理ファイル描述符时会采用 引用计数，即多个プロセス或スレッド共享ファイル描述符时，只要有一个プロセス关闭ファイル描述符，内核才会真正释放相关资源。\n3.2 ファイル锁定与並行访问 # 为了避免ファイル的並行写入产生冲突，Linux 提供了ファイル锁（flock）机制，プロセスできます对ファイル加锁，确保在某一时刻只有一个プロセス对ファイル进行写操作。\nファイル锁的类型： 共享锁（Shared Lock）：多个プロセスできます同时获得共享锁，适用于只读操作。 独占锁（Exclusive Lock）：只有一个プロセスできます获得独占锁，适用于写操作。 通过 flock() 或 fcntl() システム调用，程序できます请求对ファイル的共享或独占锁。\n3 .3 内核中的ファイル共享实现 # 内核通过 struct file 结构来实现ファイル共享。每当一个プロセス打开一个ファイル时，内核会为该ファイル分配一个 file 结构体，并将该ファイル的描述符映射到プロセス的ファイル表中。もし多个プロセス打开相同的ファイル，它们共享この file 结构体。プロセス间共享ファイル时，内核会确保数据的同步性和一致性，避免数据竞争和冲突。\nメモリ映射ファイル（mmap）：もし多个プロセス必要访问同一个ファイル的同一部分，Linux 提供了メモリ映射ファイル机制（mmap()），这使得プロセスできます将ファイル内容映射到プロセス的地址空间，プロセス之间できます直接通过共享メモリ区域访问ファイル数据。メモリ映射ファイル适合高效的ファイル共享和プロセス间通信（IPC）。\n读写锁（Read-Write Locks）：内核也提供了一些同步机制，如读写锁，确保对ファイル的並行访问不会引起数据不一致。\nindoe # 是的，正如你所说，在 Linux 中，几乎所有的资源都被视为ファイル，这包括普通ファイル、ディレクトリ、设备ファイル、管道、套接字等。这种“万物皆ファイル”的设计理念使得 Linux 操作システム对ファイル的管理变得统一且高效。与ファイル紧密相关的一个重要概念是 inode。\n什么是 inode？ # inode 是 Linux ファイルシステム中的一个重要数据结构，它存储了ファイル的元数据（metadata），即与ファイル内容无关的信息。每个ファイル（或ディレクトリ）在ファイルシステム中都有一个唯一的 inode 来描述该ファイル的属性。inode 并不包含ファイル的名称或ファイル的实际数据内容，而是包含了指向数据块的指针、ファイル的大小、权限、作成时间、変更时间等重要信息。\ninode 的主要内容 # 一个 inode 通常包含以下内容：\nファイル类型：たとえば普通ファイル、ディレクトリ、符号链接、设备ファイル等。 ファイル权限：ファイル的读、写、执行权限（たとえば 755、644 等）。 ファイル拥有者：ファイル的所有者 UID 和 GID（用户 ID 和组 ID）。 ファイル大小：ファイル的字节数。 时间戳： 作成时间（ctime）：inode 被作成或変更的时间。 変更时间（mtime）：ファイル内容最後に一次変更的时间。 访问时间（atime）：ファイル最後に一次被访问的时间。 数据块指针：指向ファイル数据的指针，表示该ファイル存储的数据位于磁盘的哪个位置。这些指针分为直接指针、间接指针等。 硬链接计数：指示指向此 inode 的硬链接数量。 ファイル与 inode 的关系 # 每个ファイル（无论是普通ファイル还是ディレクトリファイル）都有一个 唯一的 inode，这是ファイル的核心标识。ファイル名只是ファイルシステム中某个ディレクトリ项（directory entry）中的一部分，它与 inode 关联起来。在 Linux 中，ファイル名和 inode 之间的映射关系是通过 ディレクトリ项（directory entry）来实现的。\nディレクトリ项（如 readdir() 返回的内容）将ファイル名与其对应的 inode 号关联起来。ファイル名是ディレクトリ中的一个条目，而 inode 号则指向存储ファイル元数据的 inode 结构。 inode 如何工作 # 当你执行以下操作时，操作システム如何利用 inode 来实现ファイル访问：\n打开ファイル：当你打开一个ファイル时，操作システム会先查找该ファイル的ディレクトリ项，找到ファイル名对应的 inode 号。\n读取ファイル内容：一旦找到 inode，操作システム就知道ファイル数据的存储位置（通过 inode 中的块指针）。它会使用这些指针从磁盘中加载ファイル内容到メモリ中。\nファイル写入：当ファイル内容被変更时，内核会更新 inode 中的时间戳，并可能変更数据块指针。もしファイル增长或减少，内核会根据必要更新 inode 的大小字段。\nファイル和 inode 的生命周期 # ファイル作成：当你作成一个新ファイル时，内核会为该ファイル分配一个新的 inode，并在磁盘上为ファイル分配数据块。ファイル名会被存储在某个ディレクトリ中，并与 inode 号关联。\nファイル削除：当削除ファイル时，ファイル名会从ディレクトリ中移除，内核会减少 inode 的硬链接计数。当硬链接计数为零时，inode 和数据块会被释放。\n硬链接：硬链接是一个ファイル名和一个 inode 号的额外映射。硬链接作成后，多个ファイル名できます指向同一个 inode。这时，削除某个ファイル名不会立即释放 inode 或数据块，只有当所有硬链接都削除后，inode 才会被释放。\n软链接（符号链接）：符号链接（symlink）是一种特殊类型的ファイル，它包含指向另一个ファイルパス的字符串，而不是直接指向 inode。通过符号链接，できます间接访问ファイル。\ninode 与ディレクトリ的关系 # ディレクトリ也是ファイル。在 Linux 中，ディレクトリ实际上是一个特殊的ファイル，它的内容是ディレクトリ项，每个ディレクトリ项包含一个ファイル名和其对应的 inode 号。そのため，ディレクトリ与ファイル的关系也是通过 inode 来建立的。\nディレクトリ的 inode：ディレクトリ本身也有一个 inode，它包含了ディレクトリ的元数据（如权限、拥有者等）。然而，ディレクトリ的内容并不是ファイル数据，而是ディレクトリ项，这些ディレクトリ项将ファイル名映射到其对应的 inode。\nディレクトリ项与 inode：当你確認一个ディレクトリ时，内核会通过ディレクトリ项中的 inode 号来访问每个ファイル的 inode，进而获得ファイル的元数据和实际数据。\ninode 的限制与优化 # ファイルシステム的 inode 数量：每个ファイルシステム在格式化时会指定一个 inode 的数量。この数量决定了ファイルシステム最多能作成多少个ファイル。通常情况下，inode 的数量与磁盘的容量相关，但它也受到ファイルシステム设计的影响。\nファイルシステム优化：为了解決 inode 数量不足的問題，许多现代ファイルシステム（如 ext4、XFS 等）采用了动态 inode 分配机制，也つまり说，在ファイルシステム作成后できます根据必要扩展 inode 的数量。\nまとめ # inode 是 Linux ファイルシステム中每个ファイル（或ディレクトリ）都有的一个数据结构，存储了ファイル的元数据（如权限、大小、时间戳等）以及指向ファイル数据块的指针。 ファイル名 和 inode 是通过 ディレクトリ项 关联起来的。ファイル名只是一个标识符，而 inode 存储了实际的ファイル信息。 ディレクトリファイル 本身也是特殊的ファイル，包含了ファイル名和 inode 号的映射关系，ディレクトリ中的每个条目指向一个ファイル的 inode。 硬链接 允许多个ファイル名指向同一个 inode，而 符号链接 则是指向另一个ファイルパス的引用，不直接指向 inode。 通过 inode，Linux ファイルシステム能够高效地管理ファイル的存储和访问，提供了ファイル的元数据和数据的分离，极大地提升了ファイル管理的灵活性和性能。\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/linux/linux%E6%96%87%E4%BB%B6file/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 ファイル描述符 # ファイル在 Linux システム中通过ファイル描述符与内核进行交互。打开ファイル时，Linux 内核会执行以下手順：\n","title":"Linux ファイル FILE","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/","section":"Tags","summary":"","title":"ファイルシステム","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/","section":"Tags","summary":"","title":"文件共享","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/tags/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/","section":"Tags","summary":"","title":"文件系统","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6/","section":"Tags","summary":"","title":"文件描述符","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 作者: 杰克小麻雀\n原文链接: https://blog.csdn.net/yushuaigee/article/details/107883964\n1、从一个最常见的例子说起 # 在使用Linux的过程中， 我们平时经常看到下面这样的用法：\n1 echo log \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026gt; ：表示将输出结果重定向到哪里，たとえば：echo “123” \u0026gt; /home/123.txt /dev/null ：表示空设备ファイル そのため echo log \u0026gt; /dev/null 表示把日志输出到空ファイル设备，也つまり将打印信息丢弃掉，屏幕上什么也不显示。\n1 ：表示stdout标准输出 2 ：表示stderr标准错误 \u0026amp; ：表示等同于的意思 そのため 2\u0026gt;\u0026amp;1 表示2的输出重定向等同于1，也つまり标准错误输出重定向到标准输出。なぜなら前面标准输出已经重定向到了空设备ファイル，そのため标准错误输出也重定向到空设备ファイル。\nこの用法平时很常见，重点是为什么这里是用 2 和 1 ，不是3456什么的呢？这要从 Linux 中的ファイル描述符说起。\n2、Linux中的ファイル描述符（file descriptor） # 我们知道在Linuxシステム中一切皆できます看成是ファイル，ファイル又可分为：普通ファイル、ディレクトリファイル、链接ファイル和设备ファイル。在操作这些所谓的ファイル的时候，我们每操作一次就找一次名字，这会耗费大量的时间和效率。そのためLinux中规定每一个ファイル对应一个索引，这样要操作ファイル的时候，我们直接找到索引就できます对其进行操作了。\nファイル描述符（file descriptor）つまり内核为了高效管理这些已经被打开的ファイル所作成的索引，其是一个非负整数（通常是小整数），用于指代被打开的ファイル，所有执行I/O操作的システム调用都通过ファイル描述符来实现。同时还规定システム刚刚启动的时候，0是标准输入，1是标准输出，2是标准错误。这意味着もし此时去打开一个新的ファイル，它的ファイル描述符会是3，再打开一个ファイルファイル描述符つまり4……\nLinux内核对所有打开的ファイル有一个ファイル描述符表格，里面存储了每个ファイル描述符作为索引与一个打开ファイル相对应的关系，简单理解つまり下图这样一个数组，ファイル描述符（索引）つまりファイル描述符表この数组的下标，数组的内容つまり指向一个个打开的ファイル的指针。\n上面只是简单理解，实际上关于ファイル描述符，Linux内核维护了3个数据结构：\nプロセス级的ファイル描述符表 システム级的打开ファイル描述符表 ファイルシステム的i-node表 一个 Linux プロセス启动后，会在内核空间中作成一个 PCB 控制块，PCB 内部有一个ファイル描述符表（File descriptor table），记录着当前プロセス所有可用的ファイル描述符，也即当前プロセス所有打开的ファイル。プロセス级的描述符表的每一条记录了单个プロセス所使用的ファイル描述符的相关信息，プロセス之间相互独立，一个プロセス使用了ファイル描述符3，另一个プロセス也できます用3。除了プロセス级的ファイル描述符表，システム还必要维护另外两张表：打开ファイル表、i-node 表。这两张表存储了每个打开ファイル的打开ファイル句柄（open file handle）。一个打开ファイル句柄存储了与一个打开ファイル相关的全部信息。\nシステム级的打开ファイル描述符表：\n当前ファイル偏移量（调用read()和write()时更新，或使用lseek()直接変更） 打开ファイル时的标识（open()的flags参数） ファイル访问模式（如调用open()时所设置的只读模式、只写模式或读写模式） 与信号驱动相关的设置 对该ファイルi-node对象的引用，即i-node 表指针 ファイルシステム的i-node表：\nファイル类型（たとえば：常规ファイル、套接字或FIFO）和访问权限 一个指针，指向该ファイル所持有的锁列表 ファイル的各种属性，包括ファイル大小以及与不同类型操作相关的时间戳 ファイル描述符、打开的ファイル句柄以及i-node之间的关系以下图：\n在プロセス A 中，ファイル描述符 1 和 20 都指向了同一个打开ファイル表项，标号为 23（指向了打开ファイル表中下标为 23 的数组元素），这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个ファイル多次调用了 open() 函数形成的。 プロセス A 的ファイル描述符 2 和プロセス B 的ファイル描述符 2 都指向了同一个ファイル，这可能是在调用 fork() 后出现的（即プロセス A、B 是父子プロセス关系），或者是不同的プロセス独自去调用 open() 函数打开了同一个ファイル，此时プロセス内部的描述符正好分配到与其他プロセス打开该ファイル的描述符一样。 プロセス A 的描述符 0 和プロセス B 的描述符 3 分别指向不同的打开ファイル表项，但这些表项均指向 i-node 表的同一个条目（标号为 1976）；换言之，它们指向了同一个ファイル。发生这种情况是なぜなら每个プロセス各自对同一个ファイル发起了 open() 调用。同一个プロセス两次打开同一个ファイル，也会发生类似情况。 这就説明：同一个プロセス的不同ファイル描述符できます指向同一个ファイル；不同プロセスできます拥有相同的ファイル描述符；不同プロセス的同一个ファイル描述符できます指向不同的ファイル（一般也是这样，除了 0、1、2 这三个特殊的ファイル）；不同プロセス的不同ファイル描述符也できます指向同一个ファイル。\n3、Linux上打开ファイル举例 # 比如在Linux上用 vim test.py 打开一个ファイル，保持打开状态，再新打开一个新的shell，输入コマンドpidof vim 获取vimプロセス的pid号，その後 ll /proc/$pid/fd 確認vim プロセス所使用的ファイル描述符列表。\n/dev/pts是リモート登陆(telnet,ssh等)后作成的控制台设备ファイル所在的ディレクトリ。なぜなら我是通过Xshellリモート登录的，そのため标准输入0，标准输出1，标准错误2的ファイル描述符都指向虚拟终端控制台 /dev/pts/6 。 再看下面是新打开的 test.py 的ファイル描述符，竟然是4，说好的从3开始呢？\nこの我也困扰了好久，查了各种资料，终于在一个大佬的帮助下在一个论坛找到原因，有时候中文查不到还是要试试英文搜索啊。なぜならvim这种编辑器的原理是先打开源ファイル并拷贝，その後关闭源ファイル再打开自己的副本，変更完ファイル保存的时候直接将副本重命名覆盖源ファイル。そのため打开源ファイル的时候用的ファイル描述符3，その後打开自己的副本是时候就该用ファイル描述符4了，その後关闭源ファイル，ファイル描述符3就被释放了，我们確認的时候就只剩下了4，这里它指向的是vim作成的副本ファイル。这里只是说个大概意思，具体深究要去深入了解一下 vim的实现原理——奥尔特星云大使，下面是当时我看到的论坛上的资料截图，链接在这：StackOverFlow。\nもし不相信できます试一试别的プロセス，比如 tail。\n在Linux上用 tail -f test.py 打开一个ファイル，保持打开状态，再新打开一个新的shell，输入コマンドpidof tail 获取tailプロセス的pid号，その後ll /proc/$pid/fd確認tailプロセス所使用的ファイル描述符列表，できます看到ファイル描述符确实是从3开始使用的。tail不是编辑器不存在変更ファイル的情况，そのため直接ファイル描述符直接打开的源ファイル。实际上できます使用 ll /proc/$pid/fdコマンド获取当前実行的任意プロセス的ファイル描述符使用情况。\n4、C语言中ファイル描述符的使用 # C语言中できます通过 open 函数返回一个ファイル的ファイル描述符，まず作成一个 test.py ファイル用于打开，その後作成一个 test.c ファイル，输入下面コード保存。 コンパイル后执行，发现新打开ファイル的ファイル描述符是3。\n1 2 3 4 5 6 7 8 9 10 11 12 13 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;fcntl.h\u0026gt; #include \u0026lt;unistd.h\u0026gt; int main(int argc, char* argv[]) { int fd = open(\u0026quot;test.py\u0026quot;, O_RDONLY); if (fd == -1) { return -1; } printf(\u0026quot;test.py fd = %d \\n\u0026quot;, fd); close(fd); return 0; } 5、Python中ファイル描述符的使用 # Python中通过 sys 模块封装了标准输入、标准输出和错误输出。通过我们平时常用的内建函数 open できます获取一个ファイル的ファイル描述符，まず作成一个 test.py ファイル用于打开，その後作成一个 test2.py ファイル，输入下面コード保存。 执行，发现新打开ファイル的ファイル描述符是3。\n1 2 3 4 5 6 7 8 import sys print('stdin fd = ', sys.stdin.fileno()) print('stdout fd = ', sys.stdout.fileno()) print('stderr fd = ', sys.stderr.fileno()) with open(\u0026quot;test.py\u0026quot;, \u0026quot;w\u0026quot;) as f: print('test.py fd = ', f.fileno()) 6、Linux設定システム最大打开ファイル描述符个数 # （1）システム级限制\n理论上システムメモリ有多少就できます打开多少的ファイル描述符，但是在实际中内核是会做相应的处理，一般最大打开ファイル数会是システムメモリ的10%（以KB来计算），称之为システム级限制。この数字できます通过 cat /proc/sys/fs/file-max 或者 sysctl -a | grep fs.file-max コマンド確認。\n更改システム级限制有临时更改和永久更改两种方式：\n临时更改：session断开或者システム重启后会恢复原来的设置值。使用コマンド sysctl -w fs.file-max=xxxx，其中xxxxつまり要设置的数字。 永久更改：vim编辑 /etc/sysctl.conf ファイル，在后面追加 fs.file-max=xxxx，其中xxxxつまり要设置的数字。保存退出后还要使用sysctl -p コマンド使其生效。 （2）用户级限制\n同时为了控制每个プロセス消耗的ファイル资源，内核也会对单个プロセス最大打开ファイル数做默认限制，即用户级限制。32位システム默认值一般是1024，64位システム默认值一般是65535，できます使用 ulimit -n コマンド確認。\n7、参考链接 # 每天进步一点点——Linux中的ファイル描述符与打开ファイル之间的关系——cywosp Linuxファイル描述符到底是什么？——C语言中文网 句柄和ファイル描述符（FD）——阳光丶不锈 带你破案：ファイル描述符到底是什么？——vran Linux設定调优：最大打开ファイル描述符个数——Idea Buffer 変更Linuxシステム下的最大ファイル描述符限制——BlueguyChui ","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/linux/linux%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6-fd/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 作者: 杰克小麻雀\n原文链接: https://blog.csdn.net/yushuaigee/article/details/107883964\n","title":"Linux ファイルディスクリプタ fd","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/stderr/","section":"Tags","summary":"","title":"Stderr","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/stdout/","section":"Tags","summary":"","title":"Stdout","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E9%87%8D%E5%AE%9A%E5%90%91/","section":"Tags","summary":"","title":"重定向","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 需求 # 最近我们在开发一个基于树莓派的小盒子，我们会采购一些树莓派，装好外盒，装好arm版本的【Ubuntu Server 20.04】システム，并且装上我们开发的配套软件，对接我们云端的服务，最终把小盒子卖给用户并提供一些收费的服务。我们在インストールシステム的时候使用了Ubuntu自带的磁盘暗号化功能，确保机器在不开机的情况下不能被轻易的取出TF卡读取数据。\n另一方面，我们作成了一个低权限的Linux用户【user】，方便用户进行一些基本操作。\n默认情况下【Ubuntu Server 20.04】システム开机后，会要求你输入账号和密码来登录，但我们希望用户开机后，システム自动以【user】身份登录，并且自动実行一些脚本。\n实现 # 在ネットワーク搜索了一下，资料很多，但是坑也很多，最终まとめ出一个最简单的办法。\n先作成一个用户【user】\nsudo adduser user\nその後一路回车，这时候发现无法给この用户指定空密码，提示\nNo password supplied\n不用担心，先胡乱设一个密码，一路回车，作成完毕后，削除该用户的密码\nsudo passwd -d user\n接下来つまり設定终端的自动登录\nsudo vim /etc/systemd/system/getty.target.wants/getty@tty1.service\n変更【getty@tty1.service】ファイル的【ExecStart】这一行内容，从\nExecStart=-/sbin/agetty -o ‘-p – \\u’ \u0026ndash;noclear %I $TERM\n変更为\nExecStart=-/sbin/agetty -a user -o ‘-p – \\u’ \u0026ndash;noclear %I $TERM\n其实是つまり加了-a \\[用户名\\]最後に让systemd重新加载一下設定ファイル\nsudo systemctl daemon-reload\nその後重启システム\nsudo reboot\n便可实现Ubuntu Server的无密码开机自动登录\n","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/notes/linux/linux%E6%97%A0%E9%9C%80%E5%AF%86%E7%A0%81%E7%99%BB%E9%99%86-%E9%80%82%E5%90%88%E6%9C%8D%E5%8A%A1%E5%99%A8/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 需求 # 最近我们在开发一个基于树莓派的小盒子，我们会采购一些树莓派，装好外盒，装好arm版本的【Ubuntu Server 20.04】システム，并且装上我们开发的配套软件，对接我们云端的服务，最终把小盒子卖给用户并提供一些收费的服务。我们在インストールシステム的时候使用了Ubuntu自带的磁盘暗号化功能，确保机器在不开机的情况下不能被轻易的取出TF卡读取数据。\n","title":"Linux パスワードなしログイン（サーバー向け）","type":"notes"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/ubuntu-server/","section":"Tags","summary":"","title":"Ubuntu Server","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95/","section":"Tags","summary":"","title":"自动登录","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"服务器管理","type":"tags"},{"content":"","date":"2025年2月4日","externalUrl":null,"permalink":"/ja/tags/%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"用户管理","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/tags/hexo/","section":"Tags","summary":"","title":"Hexo","type":"tags"},{"content":"提示されたコードには、すでにサイトの稼働日数を表示する機能が追加されています。次に、必要に応じてアクセス人数統計を追加できます。以下は具体的な手順です。\n1. 不蒜子によるアクセス数統計コードの追加 # 不蒜子は非常にシンプルで、無料かつ設定不要のアクセス統計ツールです。Hexo サイトへ直接埋め込めます。\n手順： # \u0026lt;div class=\u0026quot;footer-inner\u0026quot;\u0026gt; の中で適切な位置（たとえばサイト稼働日数の下）を探し、以下の不蒜子統計コードを追加します。 \u0026lt;!-- 访问人数统计 --\u0026gt; \u0026lt;span id=\u0026#34;busuanzi_container_site_pv\u0026#34; style=\u0026#34;display: none;\u0026#34;\u0026gt; 本站总访问量：\u0026lt;span id=\u0026#34;busuanzi_value_site_pv\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 次 \u0026lt;/span\u0026gt; \u0026lt;script async src=\u0026#34;https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; コード説明： # id=\u0026quot;busuanzi_container_site_pv\u0026quot; と id=\u0026quot;busuanzi_value_site_pv\u0026quot; は不蒜子が提供する ID です。ページ読み込み後、自動的にサイト全体の PV を集計して表示します。 busuanzi.pure.mini.js で不蒜子の統計スクリプトを読み込み、アクセス数を自動計算・更新します。 変更後のファイル： # \u0026lt;div class=\u0026#34;footer-inner\u0026#34;\u0026gt; \u0026lt;% if (theme.footer.content) { %\u0026gt; \u0026lt;div class=\u0026#34;footer-content\u0026#34;\u0026gt; \u0026lt;%- theme.footer.content %\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;% } %\u0026gt; \u0026lt;% if (theme.footer.statistics.enable) { %\u0026gt; \u0026lt;%- partial(\u0026#39;_partials/footer/statistics.ejs\u0026#39;) %\u0026gt; \u0026lt;% } %\u0026gt; \u0026lt;% if(theme.footer.beian.enable) { %\u0026gt; \u0026lt;!-- 备案信息 ICP for China --\u0026gt; \u0026lt;%- partial(\u0026#39;_partials/footer/beian.ejs\u0026#39;) %\u0026gt; \u0026lt;% } %\u0026gt; \u0026lt;% if(theme.web_analytics.cnzz) { %\u0026gt; \u0026lt;!-- cnzz Analytics Icon --\u0026gt; \u0026lt;span id=\u0026#34;cnzz_stat_icon_\u0026lt;%= theme.web_analytics.cnzz %\u0026gt;\u0026#34; style=\u0026#34;display: none\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;% } %\u0026gt; \u0026lt;!-- 网站存活时间计时功能 --\u0026gt; \u0026lt;div id=\u0026#34;site-lifetime\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; // 设置网站的创建日期 const creationDate = new Date(\u0026#39;2024-04-21\u0026#39;); // 请根据实际情况修改日期 // 计算当前日期和网站创建日期之间的天数差 function calculateDaysSinceCreation() { const now = new Date(); const timeDifference = now - creationDate; const daysSinceCreation = Math.floor(timeDifference / (1000 * 60 * 60 * 24)); return daysSinceCreation; } // 页面加载完成后执行 document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, function() { // 计算存活天数 const daysSinceCreation = calculateDaysSinceCreation(); // 更新存活时间 const lifetimeElement = document.getElementById(\u0026#39;site-lifetime\u0026#39;); lifetimeElement.textContent = `网站存活了 ${daysSinceCreation} 天`; }); \u0026lt;/script\u0026gt; \u0026lt;!-- 访问人数统计 --\u0026gt; \u0026lt;span id=\u0026#34;busuanzi_container_site_pv\u0026#34; style=\u0026#34;display: none;\u0026#34;\u0026gt; 本站总访问量：\u0026lt;span id=\u0026#34;busuanzi_value_site_pv\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 次 \u0026lt;/span\u0026gt; \u0026lt;script async src=\u0026#34;https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;/div\u0026gt; 2. プラグイン方式でアクセス数を表示する # プラグイン（例：hexo-wordcount）を使ってページアクセス数を統計・表示したい場合は、以下の手順で設定できます。\n手順： # プラグインをインストール：\nまず hexo-wordcount をインストールします。\nnpm install hexo-wordcount --save テンプレートファイルを変更：\nテーマフォルダ内のページテンプレート（例：themes/your-theme/layout/_partial/footer.ejs または footer.ejs）を探し、適切な場所（サイト稼働日数や备案情報の後など）に以下のコードを追加します。\n\u0026lt;!-- 访问人数统计 --\u0026gt; 本站总访问量：\u0026lt;%= page.total_count %\u0026gt; 注意： このプラグインは文字数、読了時間などを統計できます。他の統計機能と組み合わせて使うこともできます。\nHexo を更新し、静的ファイルを生成：\n完了後、以下のコマンドで更新後の静的ファイルを生成します。\nhexo clean hexo generate その後、サイトをデプロイします。\nhexo deploy 3. Moe-Counter アニメ風カウンター # github🔗\n基本的な考え方は、ドキュメントに従って操作するだけです。まずコードを生成します（img形式のコード）。\nその後、フッターに挿入したい場合は、/home/ice/my-blog/themes/fluid(your-theme)/layout/_partials/footer.ejs にコードを挿入します。具体例は以下の通りです。\n\u0026lt;!-- Moe-Counter 访问人数统计 --\u0026gt; \u0026lt;div style=\u0026#34;text-align: center; margin-top: 10px;\u0026#34;\u0026gt; \u0026lt;span style=\u0026#34;font-size: 16px; font-weight: bold;\u0026#34;\u0026gt;访问人数统计: \u0026lt;/span\u0026gt; \u0026lt;img src=\u0026#34;https://count.getloli.com/@:ice345?name=%3Aice345\u0026amp;theme=gelbooru\u0026amp;padding=7\u0026amp;offset=0\u0026amp;align=bottom\u0026amp;scale=1\u0026amp;pixelated=1\u0026amp;darkmode=auto\u0026#34; alt=\u0026#34;visitor count\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; フッターにメール、GitHub リンク、QQなどを表示したい場合は、以下を参考にできます。\n\u0026lt;!-- 添加社交链接 --\u0026gt; \u0026lt;div style=\u0026#34;font-size: 13px; font-weight: bold; text-align: center;\u0026#34;\u0026gt; \u0026lt;div style=\u0026#34;display: flex; justify-content: center; gap: 20px;\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;https://github.com/ice345\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fab fa-github\u0026#34; style=\u0026#34;color:#409EFF;\u0026#34; aria-hidden=\u0026#34;true\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; GitHub \u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;mailto:nni461904@gmail.com\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fa fa-envelope\u0026#34; style=\u0026#34;color:#409EFF\u0026#34; aria-hidden=\u0026#34;true\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; 邮箱 \u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;https://alist.050626.xyz\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fa-solid fa-cloud-download\u0026#34; style=\u0026#34;color:#409EFF;\u0026#34; aria-hidden=\u0026#34;true\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; Alist \u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br /\u0026gt; \u0026lt;/div\u0026gt; 4. 稼働日数 # これはアクセス人数統計と同じような形で追加すればよいです。\n","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/misc/hexo%E6%B7%BB%E5%8A%A0%E5%AD%98%E6%B4%BB%E6%97%B6%E9%97%B4%E5%92%8C%E8%AE%BF%E9%97%AE%E4%BA%BA%E6%95%B0/","section":"その他","summary":"提示されたコードには、すでにサイトの稼働日数を表示する機能が追加されています。次に、必要に応じてアクセス人数統計を追加できます。以下は具体的な手順です。\n","title":"Hexo にサイト稼働日数とアクセス数を追加する","type":"misc"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/tags/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E7%B5%B1%E8%A8%88/","section":"Tags","summary":"","title":"アクセス統計","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/misc/","section":"その他","summary":"","title":"その他","type":"misc"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/tags/%E3%83%96%E3%83%AD%E3%82%B0%E6%94%B9%E5%96%84/","section":"Tags","summary":"","title":"ブログ改善","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/tags/%E8%AE%BF%E9%97%AE%E7%BB%9F%E8%AE%A1/","section":"Tags","summary":"","title":"访问统计","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/categories/%E5%80%8B%E4%BA%BA%E3%83%96%E3%83%AD%E3%82%B0/","section":"Categories","summary":"","title":"個人ブログ","type":"categories"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/tags/%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96/","section":"Tags","summary":"","title":"博客优化","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/tags/%E4%B8%8D%E7%AE%97%E5%AD%90/","section":"Tags","summary":"","title":"不算子","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/ja/tags/%E4%B8%8D%E8%92%9C%E5%AD%90/","section":"Tags","summary":"","title":"不蒜子","type":"tags"},{"content":"","date":"2025年1月27日","externalUrl":null,"permalink":"/categories/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/","section":"Categories","summary":"","title":"个人博客","type":"categories"},{"content":"","date":"2025年1月15日","externalUrl":null,"permalink":"/tags/%E5%A4%A7%E4%B8%80/","section":"Tags","summary":"","title":"大一","type":"tags"},{"content":"","date":"2025年1月15日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%A7%E5%AD%A6%E4%B8%80%E5%B9%B4/","section":"Tags","summary":"","title":"大学一年","type":"tags"},{"content":"","date":"2024年12月20日","externalUrl":null,"permalink":"/ja/tags/.desktop%E6%96%87%E4%BB%B6/","section":"Tags","summary":"","title":".Desktop文件","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 好用的ツール: desktop-file-validate この来检查编写的错误 例子 # [Desktop Entry] Version=1.0 Name=Todoist Comment=This is balabala(填任何东西都可以) Exec=/home/ice/.... Icon=/home/ice/..... Terminal=false Type=Application Categories=Utility このつまり典型的 .desktop 的编写例子, 其余什么的 .desktop ファイル都できます参考この来编写\n错误 # 最近在 arch 中编写この发现出错，但是想破了脑袋都没有想明白哪里出了問題，问 chatgpt, 我就简单进行比对，发现一模一样就没有想清楚。\n我就只好まとめ询问 Google, 功夫不负有心人，在 reddit 中，看到この question 发现できます通过 desktop-file-validate \u0026lt;.desktop file name\u0026gt; 来检查编写出现的错误.\n最後に，给我这样的信息:\ntodoist.desktop: error: value \u0026#34;Application \u0026#34; for key \u0026#34;Type\u0026#34; in group \u0026#34;Desktop Entry\u0026#34; is not a registered type value (\u0026#34;Application\u0026#34;, \u0026#34;Link\u0026#34; and \u0026#34;Directory\u0026#34;) 但是我看我的 Type 行没有发现有什么空格，我就不能理解.\n但是最後に我在 Application 后发现この后面有个空格导致了出现这样的错误\n我会在この后面出现空格，是なぜなら nvim 编写时，もし你不加空格，你按 enter 就会接受提示词，そのため才会导致这样的問題的😠 参考 # reddit\n","date":"2024年12月20日","externalUrl":null,"permalink":"/ja/notes/linux/linux%E4%B8%8B-desktop%E5%88%9B%E5%BB%BA%E6%97%B6%E5%8F%91%E7%94%9F%E7%9A%84%E9%94%99%E8%AF%AF/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 好用的ツール: desktop-file-validate この来检查编写的错误 例子 # [Desktop Entry] Version=1.0 Name=Todoist Comment=This is balabala(填任何东西都可以) Exec=/home/ice/.... Icon=/home/ice/..... Terminal=false Type=Application Categories=Utility このつまり典型的 .desktop 的编写例子, 其余什么的 .desktop ファイル都できます参考この来编写\n","title":"Linux で .desktop 作成時に発生したエラー","type":"notes"},{"content":"","date":"2024年12月20日","externalUrl":null,"permalink":"/ja/tags/%E3%82%A8%E3%83%A9%E3%83%BC%E8%AA%BF%E6%9F%BB/","section":"Tags","summary":"","title":"エラー調査","type":"tags"},{"content":"","date":"2024年12月20日","externalUrl":null,"permalink":"/ja/tags/%E6%A1%8C%E9%9D%A2%E5%9B%BE%E6%A0%87/","section":"Tags","summary":"","title":"桌面图标","type":"tags"},{"content":"","date":"2024年12月20日","externalUrl":null,"permalink":"/tags/%E9%94%99%E8%AF%AF%E6%8E%92%E6%9F%A5/","section":"Tags","summary":"","title":"错误排查","type":"tags"},{"content":"","date":"2024年12月20日","externalUrl":null,"permalink":"/ja/tags/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/","section":"Tags","summary":"","title":"配置文件","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/cpu%E6%BC%8F%E6%B4%9E/","section":"Tags","summary":"","title":"CPU漏洞","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/meltdown/","section":"Tags","summary":"","title":"Meltdown","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/spectre/","section":"Tags","summary":"","title":"Spectre","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 就利用到了 cache 的缓存的时间不一样 (访问某些位置时会发生访问时间快的問題使得できます通过この来得到其他プロセス的数据内容)\n分支预测 (speculative execution) 侧信道攻击 (side-channel attack) 访问时间差异获取数据内容 通过下面的这张图基本也できます理解个大概了\n","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/notes/system/spectre%E5%92%8Cmeltdown/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 就利用到了 cache 的缓存的时间不一样 (访问某些位置时会发生访问时间快的問題使得できます通过この来得到其他プロセス的数据内容)\n","title":"Spectre と Meltdown","type":"notes"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/notes/system/","section":"ノート","summary":"","title":"システム底层","type":"notes"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/","section":"Tags","summary":"","title":"侧信道攻击","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E5%88%86%E6%94%AF%E9%A2%84%E6%B5%8B/","section":"Tags","summary":"","title":"分支预测","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/cpu%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"CPU管理","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 00:00 - ⏰ プロセス调度 # まとめ： # プロセス调度的目的是在多个程序或プロセス之间合理分配 CPU 时间。最初，程序通过主动调用 API 函数交出 CPU，但有时プロセス不合作，比如陷入死循环或长时间占用 CPU，导致其他プロセス无法执行。\n为了避免这些問題，システム引入了时钟中断机制，在每个时钟周期结束时，强制切换プロセス，这つまり抢占式调度的基础。每个プロセス被分配一个固定的时间片（比如 100 毫秒），时间片用完时，调度器会选择其他プロセス执行。\n随着プロセス数量增加，システム通过就绪队列管理プロセス（即正在等待 CPU 执行的プロセス）。此外，将阻塞的プロセス（如等待 I/O 或锁的プロセス）移到等待队列，避免 CPU 空转。\n例： # 假设你有 5 个プロセス在実行，每个プロセス执行 100ms，调度器每 100ms 中断一次。もしプロセス A 被选中実行，但它一直在等待 I/O，システム就会把它移入等待队列，调度下一个プロセス。这样，CPU 就不会空闲，而是去执行其他プロセス。\n2:09 - 🤔 プロセス过多导致システム卡顿 # まとめ： # 初始时システムプロセス较少，実行流畅，但随着プロセス增多（达到数百个），即使每个プロセス的执行时间很短（たとえば 10 毫秒），每个プロセス上下文切换的开销依然很大。\n上下文切换包括保存和加载プロセス的状态，这些操作有较高的开销。もし进一步缩短每个プロセス的执行时间，虽然每个プロセス的 CPU 时间减少了，但上下文切换的开销却增加了，反而导致システム卡顿。\n例： # 假设有 1000 个プロセス，每个プロセス分配 10ms 执行时间。理论上每个プロセス执行 10ms 后进行一次上下文切换，但上下文切换本身必要时间（假设每次切换花费 1ms），もしシステム做过多上下文切换，反而会导致效率低下，システム变得卡顿。\n2:47 - ⏳ 双队列プロセス调度 # まとめ： # 为了解決高プロセス数量带来的效率問題，システム采用了双队列调度： active 队列：用于存放正在実行的プロセス。 expi 队列：用于存放高优先级的プロセス，暂时不执行。 这种方法的关键是避免高优先级プロセス长期占用 CPU 资源，导致低优先级プロセス**“饿死”。在某一轮调度后，システム将高优先级プロセス移到 expi 队列**，その後继续执行 active 队列中的プロセス，直到所有プロセス都执行完后，交换两个队列指针，确保所有优先级的プロセス都有机会执行。 例： # 假设有两个队列：\nactive 队列：[プロセス A, プロセス B, プロセス C] expi 队列：[プロセス D, プロセス E] 调度时，高优先级プロセス（D, E）会被暂时放入 expi 队列，只有 active 队列中的プロセス（A, B, C）能被调度。待 active 队列中的プロセス执行完后，交换队列指针，使得 expi 队列中的プロセス得以执行。\n5:33 - 优先级调度改进 # まとめ： # 为了解決优先级调度中出现的問題，采用了动态时间片分配アルゴリズム。该アルゴリズム根据プロセス的优先级来分配时间片：优先级较高的プロセス拥有较短的时间片，优先级较低的プロセス则拥有较长的时间片。\n举例来说，优先级为 20 的プロセス的时间片是 100 毫秒，每升高或降低一级，时间片增加或减少 5 毫秒。然而，存在缺陷：もし两个プロセス优先级相差 1，CPU 占用的差距可能非常大，有时能达到几倍的差异。\n例： # 假设有两个プロセス，プロセス A 和プロセス B，优先级分别为 20 和 19：\nプロセス A 时间片是 100ms，プロセス B 时间片是 105ms。理论上，プロセス B 会占用更多的 CPU 时间，但もしシステム频繁切换プロセス，B 却可能なぜなら时间片过长而阻塞过久，A 反而会更频繁地被调度，影响公平性。 7:01 - ⏳ 权重优先调度 # まとめ： # 权重优先调度アルゴリズム基于プロセス优先级的权重来分配 CPU 时间。每个プロセス的时间片根据其权重进行调整，权重越大的プロセス获得更多的 CPU 时间。\nたとえば，プロセス A 权重为 1，プロセス B 权重为 2，プロセス A 每次获得 100 毫秒的时间片，而プロセス B 则获得 200 毫秒的时间片。为了避免过度切换，アルゴリズム还设置了最小时间片。\nもしプロセス的时间片没有完全用完，调度器会考虑优先执行那些実行时间最短的プロセス。通过引入虚拟実行时间，アルゴリズム能够补偿权重差异所导致的时间片分配不均，确保システム公平。\n例： # 假设プロセス A 的权重是 1，プロセス B 的权重是 2。假如它们的时间片分别为 100ms 和 200ms。 もしプロセス A 没有完全用完 100ms，它会较快地再次获得 CPU，プロセス B 则较慢。为了补偿プロセス B なぜなら权重较大而执行时间过长，调度器会让プロセス A 在某些时刻得到更多的 CPU 时间。 9:02 - ⏱️ 虚拟时间调度 # まとめ： # 这种调度アルゴリズム的核心思想是通过プロセス的虚拟时间来决定其执行顺序。虚拟时间是指プロセス已消耗的“公平时间”，プロセス的虚拟时间越短，它会越早被选中执行。\n为了高效管理这些プロセス，システム使用红黑树来维护プロセス。通过缓存最左节点（虚拟时间最短的プロセス），调度器能够快速找到下一个应该执行的プロセス。\n这种方式与 Linux 的 O(1) 调度アルゴリズム和 CFS 调度アルゴリズム类似，但做了一些简化，仍然能保证高效且公平的调度。\n例： # 假设有 3 个プロセス A、B 和 C，它们的虚拟时间分别为 5ms、10ms 和 15ms。调度器会根据虚拟时间来选择最短的プロセス（A）执行。 红黑树用于快速查找最短虚拟时间的プロセス，プロセス A 会被选中执行。 ","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/notes/linux/linux%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 00:00 - ⏰ プロセス调度 # まとめ： # プロセス调度的目的是在多个程序或プロセス之间合理分配 CPU 时间。最初，程序通过主动调用 API 函数交出 CPU，但有时プロセス不合作，比如陷入死循环或长时间占用 CPU，导致其他プロセス无法执行。\n","title":"Linux プロセススケジューリング","type":"notes"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E6%8A%A2%E5%8D%A0%E5%BC%8F%E8%B0%83%E5%BA%A6/","section":"Tags","summary":"","title":"抢占式调度","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E6%97%B6%E9%97%B4%E7%89%87/","section":"Tags","summary":"","title":"时间片","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/","section":"Tags","summary":"","title":"进程调度","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 1. 多プロセス (Multiprocessing) # 例：假设你必要进行大量的ファイル处理任务，比如读取多个ファイル、处理内容并写入新ファイル。\n如何使用多プロセス： 你できます为每个ファイル作成一个独立的プロセス，每个プロセス处理一个ファイル。 每个プロセス在操作システム层面上拥有独立的メモリ空间，互不干扰。 もし你有四核 CPU，操作システムできます将这些プロセス分配给不同的核心进行並列处理，提高效率。 实际应用：如图像处理、视频编码等计算密集型任务，它们できます通过多プロセス来分摊计算负载，每个プロセス执行不同的计算任务。\n2. 多スレッド (Multithreading) # 例：你正在开发一个 web サーバー，サーバー必要同时处理多个用户的请求（比如访问不同的网页）。\n如何使用多スレッド： 每一个用户请求できます由一个スレッド来处理。所有スレッド共享サーバー的メモリ和资源，たとえば共享缓存数据。 スレッド间的通信和数据共享更容易（通过共享メモリ），但也必要注意同步，以避免並行問題。 もし是多核 CPU，多个スレッドできます同时在不同核心上执行，增强サーバー的响应能力。 实际应用：如ネットワーク服务、数据库连接池等场景，スレッド之间必要频繁的资源共享，适合使用多スレッド来处理高並行请求。\n3. 並行 (Concurrency) # 例：你有一个任务是同时进行多个 I/O 操作（如ネットワーク请求、ファイル读写等），但システム只有一个 CPU 核心。\n如何使用並行： 虽然システム只有一个核心，但通过操作システム的调度，できます在短时间内交替执行多个任务。たとえば，任务 1 正在等待ネットワーク响应，操作システムできます切换到任务 2，继续执行ファイル操作。这样看起来像是同时进行，但实际上是任务间的切换。 操作システム通过时间片轮转等机制，实现任务的“並行”，即在一个 CPU 上交替执行多个任务。 实际应用：如高並行的ネットワーク爬虫，爬虫必要同时发送多个请求，虽然只有一个 CPU 核心，但通过任务调度（並行）能有效地提高 I/O 操作的效率。\n4. 並列 (Parallelism) # 例：假设你必要处理一个大规模的图像处理任务，比如对大量图片进行滤镜处理。\n如何使用並列： もし你的システム有多个 CPU 核心（たとえば四核），你できます将任务分成 4 个子任务，每个子任务分别在一个核心上处理不同的图片。 这样所有图片的处理是同时进行的，充分利用了多核 CPU 的计算能力，显著提高处理速度。 实际应用：如深度学习模型训练、科学计算、视频渲染等场景，这些任务往往计算密集型，并且できます通过並列化加速处理过程。\n並行和並列的区别つまり: 並列つまり多个任务同时进行;並行并不是多个任务同时进行，而是多个任务轮流进行，なぜなら调度得好，从而看上去是同步进行的. (==並行つまり多プロセス通过プロセス调度アルゴリズム调度从而实现的==) まとめ：具体例子对比 # 任务类型 举例：图片处理任务 举例：Web サーバー 举例：ネットワーク爬虫 举例：科学计算 多プロセス 每个プロセス处理一张图片（独立プロセス） 每个用户请求一个プロセス处理（多个用户请求並列） 不常见，プロセス间通信开销大 每个プロセス处理一个计算任务（分布式计算） 多スレッド 不适用（图片处理通常不必要共享资源） 每个请求一个スレッド处理，スレッド共享数据 合适，スレッド共享メモリ、频繁I/O 适合计算任务的拆分（如大规模模拟） 並行 不常见（计算任务通常不能並行） 多个请求轮流处理（在一个核心上交替执行） 多个ネットワーク请求交替执行 适合 I/O 密集型任务（单核） 並列 同时处理多个图片（多核 CPU） 多个请求同时处理（多核 CPU） 适合在多核机器上同时发起请求 多个计算任务同时执行（多核 CPU） 每种方法都适用于不同的场景：多プロセス适合任务独立且计算密集型；多スレッド适合任务间必要频繁交互的场景；並行强调任务的调度和交替执行；而並列则适合计算任务的加速和负载分配。\n","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/notes/linux/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%92%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B-%E5%B9%B6%E5%8F%91%E5%92%8C%E5%B9%B6%E8%A1%8C/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 1. 多プロセス (Multiprocessing) # 例：假设你必要进行大量的ファイル处理任务，比如读取多个ファイル、处理内容并写入新ファイル。\n","title":"マルチプロセスとマルチスレッド、並行と並列","type":"notes"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/","section":"Tags","summary":"","title":"多线程","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%9A%E8%BF%9B%E7%A8%8B/","section":"Tags","summary":"","title":"多进程","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E5%B9%B6%E5%8F%91/","section":"Tags","summary":"","title":"并发","type":"tags"},{"content":"","date":"2024年12月13日","externalUrl":null,"permalink":"/ja/tags/%E5%B9%B6%E8%A1%8C/","section":"Tags","summary":"","title":"并行","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/aes/","section":"Tags","summary":"","title":"AES","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/categories/algorithm/","section":"Categories","summary":"","title":"Algorithm","type":"categories"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/rsa/","section":"Tags","summary":"","title":"RSA","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/notes/security/","section":"ノート","summary":"","title":"セキュリティと暗号","type":"notes"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86/","section":"Tags","summary":"","title":"对称加密","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/%E6%B7%B7%E5%90%88%E5%8A%A0%E5%AF%86/","section":"Tags","summary":"","title":"混合加密","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在处理大ファイル或大量数据时，流行的暗号化方法通常是采用 混合暗号化方案，即结合了 对称暗号化（如 AES）和 非对称暗号化（如 RSA）的方法。这样できます在保证安全性的同时，提高效率，避免直接对大ファイル进行暗号化所带来的性能瓶颈。\n1. 混合暗号化方案 # 混合暗号化方案利用了对称暗号化和非对称暗号化各自的优势：\n对称暗号化（如 AES）：处理速度快，适合暗号化大数据。 非对称暗号化（如 RSA）：安全性高，适合用来暗号化对称暗号化的密钥。 典型流程 # 生成对称密钥：まず，生成一个随机的对称密钥（如 AES 密钥），この密钥用来暗号化ファイル。对称暗号化通常很快，适用于处理大量数据。\n用对称密钥暗号化ファイル：使用 AES 或其他对称暗号化アルゴリズム将大ファイル或大量数据暗号化。なぜなら对称暗号化效率高，できます迅速暗号化大ファイル。\n暗号化对称密钥：用接收方的公钥（RSA）暗号化对称密钥。这样，只有持有私钥的接收方才能復号对称密钥，从而復号ファイル。\n传输暗号化数据：将暗号化后的ファイル和暗号化后的对称密钥一起发送给接收方。\n接收方復号：接收方まず用自己的私钥復号对称密钥，その後使用復号得到的对称密钥復号ファイル。\n这种方案的优点：\n效率高：对称暗号化（AES）非常快速，适合处理大ファイル。 安全性高：非对称暗号化（RSA）保证了对称密钥的安全传输。 灵活性：适用于大ファイル、流媒体、云存储等场景。 2. 分块暗号化 # 对于一些特殊应用，分块暗号化也是一种流行的方法，尤其是在直接使用非对称暗号化时：\n将大ファイル分成多个较小的块（通常每个块的大小限制在 RSA 暗号化能够处理的范围内，比如 256 字节）。 对每个块使用 RSA 或其他暗号化アルゴリズム进行暗号化。 这种方法适用于一些小型システム或者必要直接暗号化而没有对称暗号化需求的场景，但效率比混合暗号化方案低。 3. 端到端暗号化 (End-to-End Encryption) # 端到端暗号化也在暗号化大量数据时广泛使用，特别是用于云存储或消息传递服务中。以下是典型的端到端暗号化方案：\n数据暗号化：客户端对数据进行暗号化，その後发送到サーバー。 密钥管理：密钥管理是关键，通常使用公私钥对来暗号化通信密钥。 復号：只有授权的接收方能够復号数据。 在很多应用场景中，端到端暗号化结合了对称暗号化和非对称暗号化（类似混合暗号化方案），确保通信的安全性和效率。\n4. 使用专用暗号化ツール # 许多暗号化ツール和协议已经优化了大ファイル的暗号化过程，たとえば：\nGPG (GNU Privacy Guard)：基于 OpenPGP 标准，常用于ファイル暗号化，支持对称和非对称暗号化。 SSL/TLS：用于保护ネットワーク传输中的数据，特别适合流媒体、实时通信等大数据量传输。 5. 硬件加速 # 为了进一步提高暗号化效率，很多システム使用硬件加速：\n硬件加速的对称暗号化アルゴリズム：如 AES-NI（Intel 提供的 AES 加速指令），できます显著加速 AES 暗号化过程，尤其是在暗号化大ファイル时。 硬件安全模块 (HSM)：用于生成和存储密钥，确保暗号化操作的安全性和高效性。 6. 云服务暗号化 # 对于云存储和云计算中的大ファイル暗号化，很多云服务提供商会自动处理暗号化：\nたとえば，Amazon S 3、Google Cloud Storage 等会自动对存储在云中的数据进行暗号化，通常使用 AES-256（对称暗号化アルゴリズム）。 同时，密钥管理服务（如 AWS KMS 或 Google Cloud KMS）提供了暗号化密钥的管理和访问控制。 7. 流式暗号化 # 对于实时数据流的暗号化（如视频流、音频流、实时通信数据），流式暗号化アルゴリズム（如 RC 4、ChaCha 20）常常被使用。这些アルゴリズム专门针对数据流进行暗号化，能够在流数据传输过程中保证安全性。\nまとめ # 处理大ファイル或大量数据时，最流行的暗号化方法是采用 混合暗号化方案，即结合 对称暗号化（如 AES）和 非对称暗号化（如RSA）的优点。对称暗号化用于高效地暗号化数据，而非对称暗号化用于暗号化对称密钥，确保密钥的安全性。这种方法广泛应用于云存储、ファイル暗号化、数据传输等场景，同时，使用硬件加速、分块暗号化、端到端暗号化等技术できます进一步提高效率和安全性。\n","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/notes/security/%E6%B5%81%E8%A1%8C%E7%9A%84%E5%A4%A7%E9%87%8F%E6%95%B0%E6%8D%AE%E6%88%96%E8%80%85%E5%A4%A7%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在处理大ファイル或大量数据时，流行的暗号化方法通常是采用 混合暗号化方案，即结合了 对称暗号化（如 AES）和 非对称暗号化（如 RSA）的方法。这样できます在保证安全性的同时，提高效率，避免直接对大ファイル进行暗号化所带来的性能瓶颈。\n","title":"大量データ・大容量ファイル暗号化の一般的な方式","type":"notes"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86/","section":"Tags","summary":"","title":"非对称加密","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/","section":"Categories","summary":"","title":"密码学","type":"categories"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/hash%E7%AE%97%E6%B3%95/","section":"Tags","summary":"","title":"Hash算法","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 情境概述 # Alice 和 Bob 是通信双方。 目标：确保消息 \\( M \\) 的机密性、完整性和来源可验证。 使用的技术：RSA 暗号化、数字署名和 Hash アルゴリズム。 双方应持有的密钥 # Alice:\n私钥$( d_{A})$ ：用来署名消息。 公钥 $(e_{A})$：用来暗号化消息（もし Alice 要接收暗号化消息）。 Bob:\n私钥 $( d_{B})$ ：用来復号消息。 公钥 $(e_{B})$：用来暗号化消息（もし Bob 要接收暗号化消息）。 注意：双方的公钥是公开的，任何人都できます获取，而私钥则是保密的，只能由对应的密钥持有者使用。\n已知信息 # Alice 和 Bob 都知道对方的 公钥。即： Alice 知道 Bob 的公钥 $(e_{B})$。 Bob 知道 Alice 的公钥 $(e_{A})$。 过程説明 # 1. Alice 准备消息 # Alice 要向 Bob 发送一条消息 \\( M \\)，比如： $$ M = \\text{\"Hello, Bob!\"} $$ 2. Alice 对消息进行 RSA 暗号化 # Alice 使用 Bob 的公钥 $(e_{B})$ 对消息 \\( M \\) 进行暗号化，得到密文 \\( C \\)： $$ C = M^{e_{B}} \\mod n_{B} $$这里，$( n_{B} )$ 是 Bob 公钥的一个组成部分。\n密文 \\( C \\) 是暗号化后的消息，只有拥有 Bob 私钥 $( d_{B})$ 的 Bob 才能復号。\n3. Alice 计算消息的 Hash 值并生成数字署名 # 为了确保消息的完整性和来源，Alice 使用 Hash アルゴリズム（如 SHA-256）计算消息 \\( M \\) 的 Hash 值 \\( H (M) \\)： $$ H(M) = \\text{SHA-256}(M) $$ その後，Alice 使用 自己的私钥$( d_{A})$ 对 Hash 值 \\( H (M) \\) 进行署名，生成数字署名 \\( S \\)： $$ S = H(M)^{d_{A}} \\mod n_{A} $$这里，$( n_{A} )$ 是 Alice 私钥的一个组成部分。\n4. Alice 发送暗号化消息和署名 # Alice 将暗号化后的消息 \\( C \\) 和数字署名 \\( S \\) 一同发送给 Bob。 $$ \\text{发送数据} = (C, S) $$ 5. Bob 接收消息和署名 # Bob 收到 Alice 发送的暗号化消息 \\( C \\) 和署名 \\( S \\)。 6. Bob 使用私钥復号消息 # Bob 使用 自己的私钥 $( d_{B})$ 復号密文 \\( C \\)，得到原始消息 \\( M \\)： $$ M = C^{d_{B}} \\mod n_{B} $$ 復号后，Bob 得到原始的消息 $( M = \\text{\"Hello, Bob!\"} )$。\n7. Bob 使用 Alice 公钥验证署名 # Bob 使用 Alice 的公钥 $(e_{A})$ 对署名 \\( S \\) 进行验证： $$ H'(M) = S^{e_{A}} \\mod n_{A} $$这里，\\( H' (M) \\) 是通过公钥復号署名后得到的 Hash 值。\nその後，Bob 对收到的消息 \\( M \\) 使用相同的 Hash アルゴリズム计算 Hash 值 \\( H (M) \\)，即： $$ H(M) = \\text{SHA-256}(M) $$ 8. Bob 验证署名的有效性 # もし计算得到的 Hash 值 \\( H (M) \\) 与通过公钥復号得到的 Hash 值 \\( H' (M) \\) 相同： $$ H(M) = H'(M) $$那么消息 \\( M \\) 没有被篡改，且确实是由 Alice 发送的，署名有效。\nもし $( H (M) \\neq H' (M) )$，则説明消息可能已被篡改，或者署名无效。\n9. Bob 进一步处理消息 # もし署名验证成功，Bob 知道消息完整且真实，接下来できます继续处理消息内容（比如显示消息：“Hello, Bob!”）。 まとめ # 在この过程中，RSA 暗号化和数字署名共同作用：\nRSA 暗号化：保护消息的机密性，确保只有 Bob（拥有私钥）才能復号消息。 数字署名：确保消息的完整性和来源，只有 Alice（拥有私钥）才能生成有效的署名，Bob できます用 Alice 的公钥验证署名。 双方持有的密钥 # Alice： 私钥$( d_{A})$ 公钥 $(e_{A})$ Bob： 私钥 $( d_{B})$ , 公钥 $( e_{B} )$ 双方应知的内容 # Alice 知道：Bob 的公钥 $(e_{B})$（用于暗号化消息） Bob 知道：Alice 的公钥 $(e_{A})$（用于验证署名） 通过这种方式，RSA 暗号化保证了消息的机密性，数字署名确保了消息的完整性和来源的真实性。\n","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/notes/security/rsa%E5%8A%A0%E5%AF%86-%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D%E5%92%8Chas%E7%AE%97%E6%B3%95%E7%BB%93%E5%90%88%E4%BE%8B%E5%AD%90/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 情境概述 # Alice 和 Bob 是通信双方。 目标：确保消息 \\( M \\) 的机密性、完整性和来源可验证。 使用的技术：RSA 暗号化、数字署名和 Hash アルゴリズム。 双方应持有的密钥 # Alice:\n","title":"RSA 暗号・デジタル署名・Hash アルゴリズムの組み合わせ例","type":"notes"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/rsa%E5%8A%A0%E5%AF%86/","section":"Tags","summary":"","title":"RSA加密","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/%E5%AE%89%E5%85%A8%E9%80%9A%E4%BF%A1/","section":"Tags","summary":"","title":"安全通信","type":"tags"},{"content":"","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/tags/%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D/","section":"Tags","summary":"","title":"数字签名","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 RSA 暗号化アルゴリズム解释 # 一、RSA 暗号化アルゴリズム的数学原理 # 1. 生成密钥对 # 手順以下：\n选择两个大素数：\\( p \\) 和 \\( q \\)。 计算 \\( n \\)： $$ n = p \\times q $$ 计算欧拉函数 ($\\varphi(n)$)： $$ \\varphi (n) = (p-1) \\times (q-1) $$ 选择一个公钥指数 ( e )，要求 $1","date":"2024年11月18日","externalUrl":null,"permalink":"/ja/notes/security/rsa%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 RSA 暗号化アルゴリズム解释 # 一、RSA 暗号化アルゴリズム的数学原理 # 1. 生成密钥对 # 手順以下：\n","title":"RSA 暗号アルゴリズム","type":"notes"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 sudo mount /dev/sdXX /mnt sudo mount /dev/sdaXX /mnt/home(有这个分区的话) sudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo mount --bind /run /mnt/run sudo mount --bind /etc/resolv. conf /mnt/etc/resolv. conf sudo mount --bind /tmp /mnt/tmp sudo chroot /mnt 什么是 chroot？ # chroot（Change Root）是 Linux/Unix システム中的一种ツール，它允许你将当前的根ファイルシステム切换到指定的ディレクトリ，使该ディレクトリ成为虚拟机或类似于容器的环境。简单来说，chroot できます将システム的根ディレクトリ / 改变为某个其他的ディレクトリ，这样你できます在この隔离的环境下操作，不影响主システム。这种方式通常用于恢复システム、测试环境、构建软件或者実行独立的システム。\n但是，chroot 环境并不自动包含宿主机所有功能。为了确保虚拟机能够正常使用类似宿主机的功能，比如设备访问、プロセス管理和ネットワーク功能，你必要手动挂载一些关键ファイルシステム。\n挂载的原理： # 这些挂载操作是通过 --bind 选项来实现的，它允许将宿主机的某个ディレクトリ或ファイルシステム“绑定”到 chroot 环境的某个位置。这样一来，虚拟机就できます直接访问宿主机上的这些资源，达到正常実行システム和ネットワーク功能的目的。\n这些ファイルシステム本身大多是虚拟的（たとえば /proc 和 /sys），そのため它们不是实际的存储内容，而是动态生成的システム信息。通过将它们挂载到虚拟机，虚拟机就できます和宿主机共享这些动态システム信息。\n挂载的ファイルシステム有哪些？为什么挂载？ # 为了让 chroot 环境有完整的システム功能，你必要挂载以下ファイルシステム或ファイル：\n/proc （プロセスファイルシステム） # /proc （プロセスファイルシステム） 作用：提供システム和プロセス的信息，如 CPU、メモリ使用情况、挂载点等。 为什么挂载：许多コマンド依赖 /proc 来获取システム状态（如 ps, top 等）。挂载后，chroot できます访问宿主机的システム和プロセス信息。 挂载コマンド： sudo mount --bind /proc /mnt/proc /sys （システムファイルシステム） # /sys （システムファイルシステム） 作用：提供关于システム硬件设备的信息，包括驱动程序、设备状态等。 为什么挂载：システム管理ツール（如 udevadm）和硬件相关的功能必要访问 /sys。 挂载コマンド： sudo mount --bind /sys /mnt/sys /dev （设备ファイルシステム） # /dev （设备ファイルシステム） 作用：提供设备节点，比如ディスク、终端设备、USB 等。 为什么挂载：/dev 让 chroot 环境できます访问实际的硬件设备，包括ディスク、鼠标、键盘等，以及管理这些设备。 挂载コマンド： sudo mount --bind /dev /mnt/dev /run （実行时信息） # /run （実行时信息） 作用：包含システム実行时生成的临时ファイル，比如 PID ファイル、socket ファイル等。 为什么挂载：一些システムプロセス和服务必要 /run 来存储它们的実行状态或通信ファイル。 挂载コマンド： sudo mount --bind /run /mnt/run /dev/pts （伪终端 # /dev/pts （伪终端） 作用：提供伪终端（pseudo-terminal），用于作成多个终端会话，比如 ssh 或 sudo 必要使用它。 为什么挂载：在 chroot 中执行必要伪终端的コマンド时（如 sudo），必须挂载 /dev/pts。 挂载コマンド： sudo mount --bind /dev/pts /mnt/dev/pts /etc/resolv.conf （DNS 設定） # /etc/resolv.conf （DNS 設定） 作用：設定システム如何解析域名，通过 DNS サーバー转换域名为 IP 地址。 为什么挂载：もし chroot 环境中必要访问ネットワーク（如更新软件），必须能解析域名，そのため要挂载 /etc/resolv.conf。 挂载コマンド： sudo mount --bind /etc/resolv.conf /mnt/etc/resolv.conf /tmp （临时ファイル） # /tmp （临时ファイル） 作用：用于存储临时ファイル和ディレクトリ。 为什么挂载：某些程序可能必要 /tmp ディレクトリ来存储临时数据。 挂载コマンド： sudo mount --bind /tmp /mnt/tmp 挂载顺序 # 一般来说，挂载这些ディレクトリ的顺序不是特别严格，只要你确保所有必要的ディレクトリ都已经挂载。できます按照以下手順进行：\nsudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo mount --bind /run /mnt/run sudo mount --bind /etc/resolv. conf /mnt/etc/resolv. conf sudo mount --bind /tmp /mnt/tmp その後进入 chroot：\nsudo chroot /mnt ","date":"2024年10月14日","externalUrl":null,"permalink":"/ja/notes/system/chroot/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 sudo mount /dev/sdXX /mnt sudo mount /dev/sdaXX /mnt/home(有这个分区的话) sudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo mount --bind /run /mnt/run sudo mount --bind /etc/resolv. conf /mnt/etc/resolv. conf sudo mount --bind /tmp /mnt/tmp sudo chroot /mnt 什么是 chroot？ # chroot（Change Root）是 Linux/Unix システム中的一种ツール，它允许你将当前的根ファイルシステム切换到指定的ディレクトリ，使该ディレクトリ成为虚拟机或类似于容器的环境。简单来说，chroot できます将システム的根ディレクトリ / 改变为某个其他的ディレクトリ，这样你できます在この隔离的环境下操作，不影响主システム。这种方式通常用于恢复システム、测试环境、构建软件或者実行独立的システム。\n","title":"chroot","type":"notes"},{"content":"","date":"2024年10月14日","externalUrl":null,"permalink":"/ja/tags/chroot/","section":"Tags","summary":"","title":"Chroot","type":"tags"},{"content":"","date":"2024年10月14日","externalUrl":null,"permalink":"/ja/tags/%E9%9A%94%E7%A6%BB%E7%8E%AF%E5%A2%83/","section":"Tags","summary":"","title":"隔离环境","type":"tags"},{"content":"","date":"2024年10月14日","externalUrl":null,"permalink":"/ja/tags/%E7%B3%BB%E7%BB%9F%E6%81%A2%E5%A4%8D/","section":"Tags","summary":"","title":"系统恢复","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/bios/","section":"Tags","summary":"","title":"BIOS","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/categories/boot/","section":"Categories","summary":"","title":"BOOT","type":"categories"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 A bootloader is a program responsible for loading the operating system kernel into memory and starting the operating system. It operates at the low level, interfacing directly with the system\u0026rsquo;s firmware (e.g., BIOS/UEFI). A boot manager is a higher-level program that allows users to select from multiple operating systems or kernels to boot into. ==It operates after the system firmware has selected a boot device but before the operating system is loaded.== The bootloader and the boot manager（不仅できます引导多システム，还できます引导多个 bootloader） are closely related components in the system boot process, but they serve different purposes. Here\u0026rsquo;s a breakdown of the relationship and differences between the two:\n1. Bootloader # A bootloader is a program responsible for loading the operating system kernel into memory and starting the operating system. It operates at the low level, interfacing directly with the system\u0026rsquo;s firmware (e.g., BIOS/UEFI).\nKey Features of a Bootloader: # Low-level function: The bootloader\u0026rsquo;s primary function is to load the operating system into memory and hand over control to it. It is the first software that runs after the system firmware (BIOS/UEFI) has done its hardware initialization. Location: In MBR systems, the bootloader is stored in the Master Boot Record (the first 446 bytes of the disk). In GPT systems, bootloaders are stored in the EFI System Partition (ESP). Doesn’t typically have a user interface: The bootloader’s role is primarily functional. Its main task is to load the OS without necessarily providing user choices (unless it also serves as a boot manager). Examples: GRUB (GRand Unified Bootloader) is one of the most common bootloaders used in Linux systems. Windows Bootloader loads Windows from the disk. LILO (Linux Loader) is another example of a Linux bootloader. 2. Boot Manager # A boot manager is a higher-level program that allows users to select from multiple operating systems or kernels to boot into. It operates after the system firmware has selected a boot device but before the operating system is loaded.\nKey Features of a Boot Manager: # Presents a menu for OS selection: A boot manager allows users to choose which operating system or kernel to boot from when multiple OSes are installed. It displays a menu or interface for this purpose. Works with multiple bootloaders: The boot manager can direct the system to load specific bootloaders for different operating systems. For example, GRUB can load the bootloaders for both Linux and Windows, allowing the user to choose which one to boot. Located in the EFI System Partition or MBR: In UEFI systems, the boot manager files are stored in the EFI System Partition (ESP). In MBR systems, a boot manager like GRUB can reside in the MBR. Can be part of a bootloader: Some bootloaders, like GRUB, also serve as boot managers. GRUB not only loads the OS but also presents a menu to choose between multiple operating systems or kernel configurations. Examples: GRUB: GRUB is both a bootloader and a boot manager, allowing users to choose from different operating systems or kernel versions. Windows Boot Manager: The default boot manager for Windows systems that presents a menu if multiple versions of Windows are installed. rEFInd: A standalone boot manager for UEFI systems that can load operating systems directly from their bootloaders. 3. Relationship Between Bootloader and Boot Manager # Interdependency: The boot manager works with bootloaders. The boot manager is responsible for presenting the user with options (like which OS to boot), while the bootloader executes the task of actually loading the chosen OS. For example, GRUB (which can act as both a bootloader and a boot manager) will present a menu to choose between Linux and Windows. Once the user makes a selection, GRUB will load the corresponding bootloader to boot into the chosen operating system.\nBoot Sequence:\nSystem firmware (BIOS/UEFI) starts the boot process and looks for a bootloader or boot manager based on the configured boot device order. The boot manager (if present) presents the user with a choice of operating systems. The bootloader for the selected OS is executed, and it loads the kernel of that OS into memory. Control is handed over to the OS, which completes the boot process. 4. Key Differences Between Bootloader and Boot Manager: # Feature Bootloader Boot Manager Primary Role Loads the operating system kernel into memory Manages user selection of which OS or bootloader to run When It Runs Runs immediately after system firmware (BIOS/UEFI) Runs before the bootloader to offer OS selection Functionality Directly loads and starts the OS Presents a menu for choosing which OS or bootloader to run User Interface Typically no user interface (unless integrated) Provides a menu for OS selection Examples GRUB (bootloader function), Windows Bootloader GRUB (boot manager function), Windows Boot Manager, rEFInd Storage Location MBR or EFI System Partition (ESP) EFI System Partition (ESP) or sometimes in the MBR Multiple OS Support Directly loads one OS Manages multiple bootloaders or OS choices 5. Summary: # Bootloader: Loads the operating system and is responsible for starting the boot process. It’s a critical low-level program that the system needs to begin loading the OS. Boot Manager: Allows the user to select between different operating systems or configurations. It provides the user interface that can offer choices when there are multiple OSes installed. In modern systems, GRUB is a common tool that combines the roles of boot manager and bootloader, offering both OS selection and actual loading of the OS. However, some systems may use separate programs for these two roles, especially in more complex multi-boot environments.\n","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/bootloader%E5%92%8Cboot-manager%E7%9A%84%E5%8C%BA%E5%88%ABenglish/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 A bootloader is a program responsible for loading the operating system kernel into memory and starting the operating system. It operates at the low level, interfacing directly with the system’s firmware (e.g., BIOS/UEFI). A boot manager is a higher-level program that allows users to select from multiple operating systems or kernels to boot into. ==It operates after the system firmware has selected a boot device but before the operating system is loaded.== The bootloader and the boot manager（不仅できます引导多システム，还できます引导多个 bootloader） are closely related components in the system boot process, but they serve different purposes. Here’s a breakdown of the relationship and differences between the two:\n","title":"Bootloader と Boot Manager の違い（English）","type":"notes"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 A bootloader is a program responsible for loading the operating system kernel into memory and starting the operating system. It operates at the low level, interfacing directly with the system\u0026rsquo;s firmware (e.g., BIOS/UEFI). A boot manager is a higher-level program that allows users to select from multiple operating systems or kernels to boot into. ==It operates after the system firmware has selected a boot device but before the operating system is loaded.== 引导加载程序 和 引导管理器 是システム引导过程中密切相关的组件，但它们的用途不同。下面详细紹介了两者之间的关系和区别：\n1. 引导加载程序(bootloader) # 引导加载程序 是一个负责将操作システム内核加载到メモリ中并启动操作システム的程序。它在低级実行，直接与システム的固件（たとえば BIOS/UEFI）交互。\n引导加载程序的主要功能： # 低级功能：引导加载程序的主要功能是将操作システム加载到メモリ中并将控制权移交给它。它是システム固件（BIOS/UEFI）完成硬件初始化后実行的第一个软件。 位置：在 MBR システム中，引导加载程序存储在主引导记录（磁盘的前 446 个字节）中。在 GPT システム中，引导加载程序存储在 EFI システムパーティション (ESP) 中。 通常没有用户界面：引导加载程序的作用主要是功能性的。其主要任务是加载操作システム，而不一定提供用户选择（除非它还充当引导管理器）。 例： GRUB（GRand Unified Bootloader）是 Linux システム中最常用的引导加载程序之一。 Windows Bootloader 从磁盘加载 Windows。 LILO（Linux Loader）是 Linux 引导加载程序的另一个例。 2. 引导管理器（boot manager） # 引导管理器是一个高级程序，允许用户从多个操作システム或内核中进行选择以进行引导。它在システム固件选择引导设备之后但在加载操作システム之前実行。\n引导管理器的主要功能： # 提供操作システム选择菜单：引导管理器允许用户在インストール了多个操作システム时选择从哪个操作システム或内核进行引导。它为此显示菜单或界面。 可与多个引导加载程序配合使用：引导管理器できます指示システム为不同的操作システム加载特定的引导加载程序。たとえば，GRUB できます加载 Linux 和 Windows 的引导加载程序，让用户できます选择要引导的引导加载程序。 位于 EFI システムパーティション或 MBR 中：在 UEFI システム中，引导管理器ファイル存储在 EFI システムパーティション (ESP) 中。在 MBR システム中，像 GRUB 这样的引导管理器できます驻留在 MBR 中。 できます成为引导加载程序的一部分：某些引导加载程序（如 GRUB）也可用作引导管理器。GRUB 不仅加载操作システム，还提供菜单供用户在多个操作システム或内核設定之间进行选择。 例： GRUB：GRUB 既是引导加载程序又是引导管理器，让用户できます从不同的操作システム或内核版本中进行选择。 Windows 引导管理器：Windows システム的默认引导管理器，もしインストール了多个版本的 Windows，则会显示菜单。 rEFInd：UEFI システム的独立启动管理器，できます直接从其引导加载程序加载操作システム。 3. 引导加载程序和引导管理器之间的关系 # 相互依赖：引导管理器与引导加载程序协同工作。引导管理器负责向用户提供选项（たとえば要引导哪个操作システム），而引导加载程序则执行实际加载所选操作システム的任务。たとえば，GRUB（可充当引导加载程序和引导管理器）将显示一个菜单，供用户在 Linux 和 Windows 之间进行选择。一旦用户做出选择，GRUB 将加载相应的引导加载程序以引导到所选操作システム。\n引导顺序：\nシステム固件 (BIOS/UEFI) 启动引导过程，并根据設定的引导设备顺序查找引导加载程序或引导管理器。 引导管理器（もし存在）向用户提供操作システム选择。 执行所选操作システム的 引导加载程序，并将该操作システム的内核加载到メモリ中。 控制权移交给操作システム，操作システム完成启动过程。 4. 引导加载程序和引导管理器之间的主要区别： # 功能 引导加载程序 引导管理器 主要角色 将操作システム内核加载到メモリ中 管理用户选择要実行的操作システム或引导加载程序 実行时 在システム固件 (BIOS/UEFI) 之后立即実行 在引导加载程序之前実行以提供操作システム选择 功能 直接加载并启动操作システム 显示用于选择要実行的操作システム或引导加载程序的菜单 用户界面 通常没有用户界面（除非集成） 提供用于选择操作システム的菜单 例 GRUB（引导加载程序功能）、Windows 引导加载程序 GRUB（启动管理器功能）、Windows 启动管理器、rEFInd 存储位置 MBR 或 EFI システムパーティション (ESP) EFI システムパーティション (ESP) 或有时在 MBR 中 多操作システム支持 直接加载一个操作システム 管理多个引导加载程序或操作システム选择 5. 摘要： # 引导加载程序：加载操作システム并负责启动引导过程。它是システム开始加载操作システム所需的关键低级程序。 引导管理器：允许用户在不同的操作システム或設定之间进行选择。它提供了できます在インストール多个操作システム时提供选择的用户界面。 在现代システム中，GRUB 是一种常用ツール，它结合了引导管理器和引导加载程序的角色，提供操作システム选择和操作システム的实际加载。但是，某些システム可能会为这两个角色使用单独的程序，尤其是在更复杂的多引导环境中。\n","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/bootloader-%E5%92%8C-boot-manager%E7%9A%84%E5%8C%BA%E5%88%AB%E4%B8%AD%E6%96%87/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 A bootloader is a program responsible for loading the operating system kernel into memory and starting the operating system. It operates at the low level, interfacing directly with the system’s firmware (e.g., BIOS/UEFI). A boot manager is a higher-level program that allows users to select from multiple operating systems or kernels to boot into. ==It operates after the system firmware has selected a boot device but before the operating system is loaded.== 引导加载程序 和 引导管理器 是システム引导过程中密切相关的组件，但它们的用途不同。下面详细紹介了两者之间的关系和区别：\n","title":"Bootloader と Boot Manager の違い（中国語版）","type":"notes"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/gpt/","section":"Tags","summary":"","title":"GPT","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 GPT（GUID パーティション表） パーティション方案在结构、功能以及与引导加载程序和システム引导的交互方式方面与 MBR（主引导记录） 方案有很大不同。让我们比较一下这两者，并了解 GPT 在システム引导环境中的工作原理，尤其是对于双引导场景。\n1. GPT 和 MBR パーティション方案之间的差异： # 方面 MBR GPT パーティション表大小 64 字节（限制为 4 个主パーティション） 将多个パーティション存储在更大的表中 パーティション数 最多 4 个主パーティション（或 3 个主パーティション + 1 个带逻辑パーティション的扩展パーティション） 默认支持最多 128 个パーティション（できます追加更多パーティション） 磁盘大小支持 最大 2 TB 支持大于 2 TB 的磁盘（最多 9.4 ZB） 引导コード 包含 446 字节的引导加载程序コード（主引导コード） GPT 不以相同的方式存储引导加载程序。引导加载程序存储在 EFI システムパーティション (ESP) 中 冗余 无冗余，パーティション表仅存储在磁盘的开头 GPT 存储パーティション表的多个副本以实现冗余（一个在开头，一个在磁盘的末尾） 损坏恢复 更容易损坏；没有自动恢复 更强大，できます使用备份表从损坏中恢复 兼容性 适用于旧式 BIOS 启动模式 专为 UEFI 设计，但できます模拟 MBR 以实现向后兼容（通过“保护性 MBR”） 2. 使用 GPT 启动： # 使用 GPT 启动与 MBR 不同，なぜなら UEFI（统一可扩展固件接口） 是传统 BIOS 的现代替代品。让我们来探索一下启动差异：\n使用 GPT 和 UEFI 启动： # EFI システムパーティション (ESP)：\n在使用 UEFI 的基于 GPT 的システム中，引导加载程序存储在称为 EFI システムパーティション (ESP) 的特殊パーティション中。\nESP 包含各种操作システム的引导加载程序ファイル。这些引导加载程序ファイル采用 EFI 可执行ファイル (. efi) 的形式（できます用 c语言 来写），UEFI できます直接加载。\n您インストール的每个操作システム都できます将其自己的引导加载程序放置在 ESP 中。たとえば，GRUB 可能位于 /EFI/grub 中，而 Windows 启动管理器位于 /EFI/Microsoft/Boot 中。\n没有主引导记录 (MBR) コード：\n与 MBR 不同，GPT 中没有单个“主引导コード”。相反，UEFI 根据引导顺序设置或用户输入（通过引导菜单 grub）从 ESP 加载适当的引导加载程序。\n引导管理器：\nUEFI 本身できます充当基本引导管理器。它できます提供一个菜单（取决于 uefi 的固件支不支持），列出存储在 ESP 中的可用操作システム或引导加载程序。这允许您选择从哪个操作システム引导，而无需单独的引导管理器（如 GRUB）。\n但是，对于更复杂的设置（たとえば，使用 Linux 和 Windows 双引导），仍然できますインストール GRUB 或其他引导管理器以提供更多灵活性（たとえば，自定义引导选项、在不同的 Linux 内核之间进行选择等）。\n使用 GPT 和传统 BIOS（CSM 模式）启动： # 兼容性支持模块 (CSM)： 一些支持 UEFI 的システム还提供兼容性支持模块 (CSM)，允许它们在传统 BIOS 模式下启动。 もし您使用的是 GPT 磁盘，但想要在传统 BIOS 模式下启动，则できます将システム設定为通过 CSM 模拟 BIOS。在这种情况下，您可能必要“保护性 MBR”以避免与不理解 GPT 的旧ツール发生兼容性問題。 但是，使用 GPT 在传统模式下启动通常不太常见，并且不是 GPT 的预期设计，GPT 旨在与 UEFI 配合使用。 3. 使用 GPT 进行双启动： # 在使用 GPT 的双启动场景中，所涉及的过程和ツール与基于 MBR 的システム略有不同：\nインストール多个操作システム：\n两个操作システム（たとえば Linux 和 Windows）都将其引导加载程序ファイル放在 EFI システムパーティション (ESP) 中。每个操作システム都会在 ESP 中作成一个ディレクトリ来存储其引导加载程序。\nUEFI 启动菜单：\nUEFI できます识别 ESP 中的多个引导加载程序条目，并且通常提供基本启动菜单。您できます在启动期间按下某个键（通常是 F 12、ESC 或根据制造商的不同而不同的其他键）来访问该菜单，以手动选择要加载哪个引导加载程序（たとえば Windows 启动管理器、GRUB）。\nGPT 上的 GRUB：\nもし您在具有 UEFI 的 GPT 磁盘上インストール GRUB，它仍将用作启动管理器，允许您在多个操作システム之间进行选择。GRUB 将检测 Windows 启动管理器和其他可启动条目，并在其启动菜单中显示它们。\nGRUB 的引导加载程序インストール在 EFI システム中パーティション（不在 MBR 中，なぜなら GPT 不使用 MBR 引导コード），UEFI 将从 ESP 加载 GRUB。\n没有 GRUB？：\nもし您不インストール GRUB 或任何其他引导管理器，UEFI 将从 ESP 启动默认操作システム引导加载程序（たとえば，Windows 引导管理器）。もし只有一个操作システム的引导加载程序存在或設定为默认，则不会有任何引导菜单，システム将直接启动到该操作システム。\n4. MBR 和 GPT 之间双引导设置的主要区别： # MBR：\n引导加载程序存储在 MBR 中。\n有限的パーティション支持。\n必要在 MBR 中インストール GRUB（或其他引导管理器）以提供双引导システム的引导菜单。\nGPT：\n引导加载程序存储在 EFI システムパーティション中。\n没有像 MBR 中的单个“主引导コード”； UEFI 直接从 ESP 加载引导加载程序。\nもし ESP 中存在多个引导加载程序，UEFI できます提供基本启动菜单，但できますインストール GRUB 或其他启动管理器以实现更高级的控制。\n支持更多パーティション和更大的磁盘大小。\n摘要： # MBR 依赖于主引导记录中的单个引导加载程序，并支持有限的パーティション和较小的磁盘大小。 GPT 专为 UEFI システム设计，使用 EFI システムパーティション (ESP) 来存储多个引导加载程序，并允许使用许多パーティション和更大的磁盘进行灵活的启动管理。 使用 GPT，UEFI できます提供启动菜单以在不同的操作システム之间进行选择（もし已設定），但更高级的启动管理（如 GRUB）仍可用于复杂的双启动设置。 ","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/gpt%E5%88%86%E5%8C%BA%E6%96%B9%E6%A1%88/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 GPT（GUID パーティション表） パーティション方案在结构、功能以及与引导加载程序和システム引导的交互方式方面与 MBR（主引导记录） 方案有很大不同。让我们比较一下这两者，并了解 GPT 在システム引导环境中的工作原理，尤其是对于双引导场景。\n","title":"GPT パーティション方式","type":"notes"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 是的，GRUB 不会将其所有引导加载程序コード都存储在 /boot/grub 中。它使用 多阶段架构，其中引导加载程序的不同部分存储在不同的位置，这对于使用 MBR 和 GPT パーティション方案的システム至关重要，尤其是在 BIOS 模式 下启动时。\nGRUB 的多阶段架构説明 # GRUB 的启动过程分为几个阶段，每个阶段都存储在不同的位置，具体取决于パーティション方案（MBR 或 GPT）和启动模式（BIOS 或 UEFI）。以下是细分：\n1. GRUB 第 1 阶段 # 位置：存储在 MBR（主引导记录）或 GPT システム中的 保护性 MBR（protective MBR） 中。 大小：仅 446 字节（磁盘前 512 字节的一部分）。 功能：阶段 1 的唯一目的是加载 GRUB 的下一阶段（阶段 1.5 或阶段 2）。由于阶段 1 非常小，そのため它无法执行读取ファイルシステム等复杂任务。 2. GRUB 阶段 1.5 # 位置： 在 MBR 磁盘 上：存储在 后 MBR 间隙（post-mbr gap）（MBR 和磁盘上第一个パーティション之间的小空间）中。 在 GPT 磁盘 上：存储在专用的 BIOS 启动パーティション（通常大小为 1-2 MB）中。 功能：阶段 1.5 包含必要的 ファイルシステム驱动程序 和从パーティション（たとえば /boot/grub）读取所需的其他コード。它弥补了阶段 1（最小）和阶段 2（功能齐全）之间的差距。 もし没有阶段 1.5，GRUB 将无法找到并读取存储在 /boot/grub ディレクトリ中的实际ファイル，なぜなら阶段 1 本身缺乏理解ファイルシステム（たとえば ext 4、Btrfs 等）的能力。 3. GRUB 阶段 2 # 位置：存储在パーティション（通常是 /boot パーティション或操作システム的根パーティション）上的 /boot/grub/ ディレクトリ中。 功能：阶段 2 是完整的引导加载程序，它： 显示 GRUB 菜单（もし有多个操作システム或内核）。 允许用户选择要引导的操作システム或内核。 将 操作システム内核 加载到メモリ中（たとえば Linux 内核）。 将控制权传递给操作システム。 当我们在多启动システム上看到 GRUB 菜单时，我们经常与 Stage 2 交互。它できます自定义，できます提供图形界面，并处理启动操作システム的更复杂任务。\nGRUB 为什么必要 Stage 1.5？ # Stage 1.5 的主要原因是 Stage 1 太小，无法包含对不同ファイルシステム的支持。もし没有 Stage 1.5，GRUB 的 Stage 1 将无法理解从パーティション中加载 Stage 2 的位置或方式，なぜならパーティション通常使用复杂的ファイルシステム（如 ext 4、XFS 等）。Stage 1.5 包括ファイルシステム驱动程序，允许 GRUB 在パーティション上找到 /boot/grub ディレクトリ，并从中加载 Stage 2。\n带有 Stage 1.5 的 MBR：在 MBR システム上，Stage 1.5 存储在 MBR 后间隙中，这为其提供了足够的空间来存储必要的ファイルシステム驱动程序。 带有 Stage 1.5 的 GPT：在 GPT システム上，不存在 MBR 后间隙，そのため Stage 1.5 存储在 BIOS 启动パーティション中。这是 **GRUB 在 GPT 上以 BIOS 模式実行所必需的。 摘要 # Stage 1（存储在 MBR 中）非常小，仅用于加载 Stage 1.5 或 Stage 2。 Stage 1.5（存储在 MBR 的 MBR 后间隙中或 GPT 的 BIOS 启动パーティション中）是加载ファイルシステム驱动程序和继续启动过程所必需的。 第 2 阶段（存储在 /boot/grub/ 中）是功能齐全的引导加载程序，它显示 GRUB 菜单、允许选择操作システム并加载操作システム内核。 そのため，GRUB 不仅将引导コード存储在 /boot/grub/ 中；它还将关键的引导加载程序コード存储在 MBR（第 1 阶段）中，もし是 GPT 磁盘上的 BIOS 模式，则存储在 BIOS 引导パーティション（第 1.5 阶段）中。这种架构使 GRUB 能够正确加载和引导操作システム。\n","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/grub/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 是的，GRUB 不会将其所有引导加载程序コード都存储在 /boot/grub 中。它使用 多阶段架构，其中引导加载程序的不同部分存储在不同的位置，这对于使用 MBR 和 GPT パーティション方案的システム至关重要，尤其是在 BIOS 模式 下启动时。\n","title":"GRUB","type":"notes"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/grub/","section":"Tags","summary":"","title":"GRUB","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/mbr/","section":"Tags","summary":"","title":"MBR","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 MBR（主引导记录） 结构つまり主引导コード+パーティション表（+post-mbr gap），主引导コード つまり专门负责用来加载システム到メモリ中的，パーティション表 つまり一个磁盘的整体布局。post-mbr gap つまり用来过渡引导的阶段 1 和阶段 2 的。もしつまり，主引导记录用来引导 GRUB，==则就会出现 grub 的コード覆盖了原本的主引导的原先コード。== 1. MBR 结构： # 主引导记录 (MBR) 由两个主要部分组成： 主引导コード (446 字节)：此部分包含负责将操作システム或其他引导加载程序（如 GRUB）加载到メモリ中的引导加载程序コード。 パーティション表 (64 字节)：此部分包含磁盘パーティション的布局，包括其起始和结束位置。 在 MBR（主引导记录） 设置中，磁盘布局在 MBR（占用前 512 个字节）和磁盘上的第一个パーティション之间留下一小块未使用的空间。此空间通常称为 后 MBR 间隙（post-mbr gap），通常约为 31 KB。此间隙用于存储 BIOS 在启动过程中加载的额外引导加载程序コード。(==そのため从这里可知: 单纯靠 mbr 无法完整引导システム，そのため要靠 post-mbr gap 来将阶段 1 过渡到阶段 2) もし MBR 的主引导コード部分为空或已损坏，则システム将无法加载任何操作システム，なぜなら没有コード来指示システム如何继续引导过程。パーティション表可能仍然完好无损，但もし没有引导コード，システム将不知道如何从这些パーティション启动引导。\n2. 启动具有双操作システム（GRUB 和 MBR）的システム： # 当您拥有双システム（たとえば Linux 和 Windows）时，引导加载程序是必需的，以便提供选择要启动哪个操作システム的方法。 もし MBR 包含标准引导加载程序（如默认的 Windows 引导加载程序），它将仅启动默认操作システム（在本例中为 Windows），而不提供选择其他操作システム的菜单。 另一方面，GRUB 是一种更高级的引导加载程序，できます检测多个操作システム。もし MBR 中インストール了 GRUB，它将加载并提供启动菜单，允许您选择要启动哪个操作システム。 もし MBR 不包含 GRUB（或任何启动管理器）： # 没有启动管理器菜单：もし MBR 中没有インストール GRUB（或其他启动管理器，如 rEFInd 或 LILO），您将没有菜单来选择要启动哪个操作システム。システム将直接启动到与已インストール的引导加载程序关联的默认操作システム。 Windows 引导加载程序：たとえば，もし Windows 引导加载程序 位于 MBR 中，它将直接启动到 Windows，而不提供启动 Linux 的选项。 3. GRUB 和引导管理器角色： # 当 GRUB インストール在 MBR 中时，它会用自己的コード替换默认引导コード，该コードできます： 检测多个操作システムインストール（たとえば Linux 和 Windows）。 在启动期间显示启动菜单，允许您选择要启动的操作システム。 もし您在设置双システム后インストール GRUB，GRUB 通常会扫描其他已インストール的操作システム（如 Windows）并将其追加到其启动菜单中。もし MBR 不包含 GRUB 或任何其他引导管理器，您将只能启动与 MBR 中存在的引导加载程序关联的操作システム（たとえば，もし Windows 引导加载程序存在，则为 Windows）。\n结论： # もし您的 MBR 为空，您将根本无法启动システム。 もし您有 双システム，但 GRUB（或其他启动管理器） 未インストール在 MBR 中，您将无法获得启动菜单来选择要启动的操作システム。システム将默认使用现有的任何引导加载程序（たとえば，Windows 引导加载程序），这可能会自动加载一个操作システム而不显示另一个システム的任何选项。 要启用双启动功能，在 MBR 中インストール像 GRUB 这样的启动管理器是必不可少的。\n补充説明 post-mbr gap # 流程 # 第 1 阶段引导加载程序执行： 第 1 阶段引导加载程序（MBR 中的小引导コード）非常有限。它的工作是定位和加载引导加载程序的下一阶段，通常称为第 1.5 阶段或直接称为第 2 阶段。 由于 MBR 只有 446 字节的空间，そのため它无法容纳完整的引导加载程序（如 GRUB 或其他引导管理器），也无法容纳直接引导操作システム所需的复杂コード。 MBR 后间隙（也称为“嵌入区域”）： 在 MBR 之后，MBR 与磁盘上的第一个パーティション之间通常存在间隙。此间隙通常称为 MBR 后间隙 或 嵌入区域。 在 传统 BIOS-MBR 引导 中，此间隙为引导加载程序的 第 1.5 阶段 コード提供了额外的空间。第 1.5 阶段コード是必需的，なぜなら： 它包含理解磁盘上ファイルシステム的コード。 它提供加载完整 第 2 阶段引导加载程序 所需的额外功能。 此间隙通常介于 30 KB 到 60 KB 之间，具体取决于パーティション方案和引导加载程序。 阶段 1.5 引导加载程序： 阶段 1.5 是 MBR 中最小 阶段 1 引导加载程序 与完整 阶段 2 引导加载程序 之间的桥梁。 它位于 MBR 后间隙中，包含理解存储 阶段 2 引导加载程序的ファイルシステム（たとえば ext 4、NTFS 等）所需的基本驱动程序或コード。 たとえば，在 GRUB 的情况下，阶段 1.5 允许 GRUB 访问包含完整 /boot/grub ディレクトリ的パーティション。 阶段 2 引导加载程序： 一旦加载 阶段 1.5，它就会找到完整的 阶段 2 引导加载程序，该程序通常存储在操作システムパーティション上的 /boot ディレクトリ中。 第 2 阶段 是完整的引导加载程序（たとえば GRUB 或 LILO），它： 显示引导菜单（もし設定了多个操作システム）。 将所选操作システム的内核加载到メモリ中。 将控制权移交给内核以引导システム。 操作システム内核： 一旦 第 2 阶段引导加载程序 将内核加载到メモリ中，它就会开始执行内核，从而接管引导过程、初始化硬件、加载驱动程序并最终引导システム。 为什么后 MBR 间隙很重要？ # MBR 引导コード 只有 446 个字节，非常小，不足以加载完整的引导加载程序（如 GRUB）。 后 MBR 间隙 为引导加载程序的コード（第 1.5 阶段）提供了额外的空间，而这些空间无法容纳在 MBR 本身中。 使用 MBR 磁盘 时，此间隙对于 基于 BIOS 的启动 至关重要，なぜなら它包含读取磁盘ファイルシステム和加载完整引导加载程序所需的コード。 ","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/mbr%E5%88%86%E5%8C%BA%E6%96%B9%E6%A1%88/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 MBR（主引导记录） 结构つまり主引导コード+パーティション表（+post-mbr gap），主引导コード つまり专门负责用来加载システム到メモリ中的，パーティション表 つまり一个磁盘的整体布局。post-mbr gap つまり用来过渡引导的阶段 1 和阶段 2 的。もしつまり，主引导记录用来引导 GRUB，==则就会出现 grub 的コード覆盖了原本的主引导的原先コード。== 1. MBR 结构： # 主引导记录 (MBR) 由两个主要部分组成： 主引导コード (446 字节)：此部分包含负责将操作システム或其他引导加载程序（如 GRUB）加载到メモリ中的引导加载程序コード。 パーティション表 (64 字节)：此部分包含磁盘パーティション的布局，包括其起始和结束位置。 在 MBR（主引导记录） 设置中，磁盘布局在 MBR（占用前 512 个字节）和磁盘上的第一个パーティション之间留下一小块未使用的空间。此空间通常称为 后 MBR 间隙（post-mbr gap），通常约为 31 KB。此间隙用于存储 BIOS 在启动过程中加载的额外引导加载程序コード。(==そのため从这里可知: 单纯靠 mbr 无法完整引导システム，そのため要靠 post-mbr gap 来将阶段 1 过渡到阶段 2) もし MBR 的主引导コード部分为空或已损坏，则システム将无法加载任何操作システム，なぜなら没有コード来指示システム如何继续引导过程。パーティション表可能仍然完好无损，但もし没有引导コード，システム将不知道如何从这些パーティション启动引导。\n","title":"MBR パーティション方式","type":"notes"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 boot 方式和パーティション方案的最佳配合 # uefi+gpt bios+mbr BIOS+MBR # MBR (主引导记录)的整体详细结构简单紹介つまり：主引导コード+パーティション表+post-mbr gap 单纯靠 主引导コード 无法完整引导システム，そのため要有 post-mbr gap （MBR 与第一个磁盘パーティション之间的间隙）来辅助引导システム，できます说是一个过渡用的。\n第一阶段つまり主引导コード，主要作用つまり定位和加载下一阶段的引导 第 1.5 阶段つまり（post-mbr gap 做的）主要作用つまり理解存储阶段 2 引导加载程序的ファイルシステム（たとえば ext 4、NTFS 等）所需的基本驱动程序或コード, つまり可能也有一部分加载程序在ファイルシステム(grub additional code)中，这样就できます读取ファイル (一些加载程序ファイル从而辅助 boot) 第 2 阶段つまり引导加载程序了（bootloader boot manager） 到此，基本就できます引导完システム了，その後操作システム就加载在メモリ中了，控制权就交给システム内核了\nUEFI+GPT # この基本就没有什么，就主要在パーティション时，有个 ESP パーティション 就できます了，この引导程序（bootloader boot manager）就存储在 ESP パーティション\n一些 linux 中的コマンド：\n下载設定ファイル grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH 生成設定ファイル并放置于/boot パーティション（この ESP パーティション） grub-mkconfig -o /boot/grub/grub.cfg 有多システム的记得下载 os-prober, 并 vim /etc/default/grub 追加 GRUB_DISABLE_OS_PROBER=false 这一行 :::tips **注意：**这里只要是将提前装好システム并使用上述コマンド生成了grub的，你将このディスク换到另一个机子上来実行OS的话。这是你要 重新用live-usb这些启动重新再新机子上重新使用上述コマンド来生成grub，否则无法启动システム :::\nBIOS+GPT # まず声明，这种情况，你要追加一个 1 M-2 M 的 BIOS パーティション才行\n理由 # gpt 磁盘本身第一个扇区（磁盘的前 512 个字节）つまり一个 protective mbr パーティション，这是为了向只能 BIOS 引导的旧机子兼容而产生的。\n讲述 protective mbr 的文章。大致重要内容以下：\n大概内容说白了つまり为了兼容和保护 gpt 磁盘\n==省流: つまりこの BIOS boot パーティション相当于 mbr 的 post-mbr gap 用来辅助 bootloader 的加载的==\n第 1 阶段引导加载程序加载 BIOS 引导パーティション： # 由于システム使用的是 GPT パーティション方案，そのため不存在 后 MBR 间隙（MBR 和第一个パーティション之间的空间），MBR システム通常会使用该间隙来存储其他引导加载程序コード（如 GRUB Stage 1.5）。 相反，在磁盘上作成了一个专用的 BIOS 引导パーティション（通常大小为 1-2 MB）。此パーティション不包含ファイルシステム，也不用于存储常规ファイル - 它仅用于保存 GRUB Stage 1.5。 来自保护性 MBR 的 第 1 阶段コード定位 BIOS 引导パーティション并从中加载 第 1.5 阶段引导加载程序コード。 GRUB Stage 1.5 处理ファイルシステム访问： # Stage 1.5 是至关重要的一步，なぜなら它包含 GRUB 理解磁盘ファイルシステム（たとえば ext 4、Btrfs 等）所需的驱动程序和コード。 加载 BIOS 启动パーティション后，Stage 1.5 现在できます读取磁盘中的ファイル，たとえば GRUB 設定和Stage 2 引导加载程序コード，这些コード存储在 /boot/grub/ 中。 Stage 2 引导加载程序从 /boot/grub 加载： # Stage 1.5 加载后，它会找到Stage 2 引导加载程序，这些コード存储在其中一个パーティション上的 /boot/grub/ ディレクトリ中。 Stage 2 是功能齐全的 GRUB 引导加载程序。它： もし您インストール了多个操作システム（双启动设置），则显示 GRUB 启动菜单。 允许您选择要启动的操作システム或内核。 将所选操作システム的 内核 加载到メモリ中。 ","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93mbr%E5%92%8Cgpt%E5%88%86%E5%8C%BA/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 boot 方式和パーティション方案的最佳配合 # uefi+gpt bios+mbr BIOS+MBR # MBR (主引导记录)的整体详细结构简单紹介つまり：主引导コード+パーティション表+post-mbr gap 单纯靠 主引导コード 无法完整引导システム，そのため要有 post-mbr gap （MBR 与第一个磁盘パーティション之间的间隙）来辅助引导システム，できます说是一个过渡用的。\n","title":"MBR と GPT パーティションの簡単なまとめ","type":"notes"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/post/","section":"Tags","summary":"","title":"POST","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/sysfs/","section":"Tags","summary":"","title":"Sysfs","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/uefi/","section":"Tags","summary":"","title":"UEFI","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 Linux 中，固件 是指与特定硬件组件紧密相关的低级软件，通过提供指令和控制机制使它们能够正常実行。此固件在内核之下実行，但对于硬件与操作システム交互至关重要。\n让我们分解一下問題的每个部分：\n1. Linux 中的固件 # 在 Linux システム中，固件通常是指在以下硬件设备上実行的微コード或二进制コード：\nCPU（たとえば，Intel 或 AMD 微コード） GPU（显卡固件） 网卡（Wi-Fi 或以太网适配器固件） 存储控制器（たとえば，SSD 固件） 外围设备（たとえば，USB 设备、声卡） ==一些固件内置于硬件本身，而其他固件则由操作システム在启动期间加载。==Linux 使用存储在 /lib/firmware ディレクトリ中的ファイル来处理固件加载。\n2. /sys ディレクトリ中的固件 # Linux 中的 /sys ディレクトリ是 sysfs 虚拟ファイルシステム的一部分，它提供了内核和用户空间之间的接口，公开了有关硬件设备和内核子システム的详细信息。尽管 sysfs 主要处理内核和设备信息，但它也できます公开固件相关数据。\n/sys/firmware：此ディレクトリ包含与システム固件相关的信息和接口，たとえば： /sys/firmware/efi：もし您的システム以 UEFI 模式启动，则此ディレクトリ包含有关 UEFI 固件的详细信息，たとえば設定表、実行时变量和メモリ映射。 /sys/firmware/acpi：与 ACPI（高级設定和电源接口）固件相关的信息，可帮助进行电源管理和硬件設定。 /sys/firmware/dmi：DMI（桌面管理接口）表提供システム信息，たとえば主板型号、システム制造商和 BIOS/UEFI 版本。 3. 固件、内核、硬件和システム之间的关系 # 这些组件中的每一个都在计算机的整体実行中发挥着关键作用：\n固件 # 它是什么：固件是嵌入硬件或由システム在実行时加载的低级软件。它提供了硬件应如何実行和与操作システム通信的基本指令。 角色：固件直接控制硬件，使其能够実行。もし没有固件，网卡、CPU 和 GPU 等硬件组件可能无法正常工作或根本无法工作。 位置：固件要么预装在硬件中（非易失性存储器），要么从操作システム加载（来自 Linux 中的“/lib/firmware”）。 内核 # 它是什么：Linux 内核是操作システム的核心。它管理システム资源，包括メモリ、プロセス和硬件。 角色：内核负责通过驱动程序与硬件通信，驱动程序充当内核和硬件设备之间的中介。在必要时，内核还できます加载固件来初始化和控制特定硬件。 与固件的关系：内核与固件交互以初始化设备。它在必要时将固件加载到设备中，并处理固件与更高级别システムプロセス之间的通信。 硬件 # 它是什么：计算机的物理组件，たとえば CPU、GPU、网卡、ディスク和外围设备。 角色：硬件执行システム所需的物理任务（たとえば计算、存储、输入/输出）。但是，硬件必要固件和内核驱动程序才能正常実行并与システム的其余部分交互。 システム # 它是什么：整个计算机，包括硬件、固件、内核和用户级软件（应用程序、实用程序等）。 角色：システム作为一个整体，提供用户できます与应用程序和服务交互的环境，而应用程序和服务又依赖内核来访问硬件资源。もし没有固件，システム可能无法正确初始化硬件组件。 交互例： # 当 Linux システム启动时：\n固件 (BIOS/UEFI) 初始化硬件，执行 POST（开机自检），その後将控制权传递给引导加载程序（如 GRUB）。 引导加载程序将 内核 加载到メモリ中。 加载内核后，它开始初始化设备（如网卡或 GPU）。もし硬件必要额外的固件，内核将从 /lib/firmware 加载它。 内核使用 驱动程序 来管理硬件和操作システム之间的通信。 硬件现在已正确初始化并由其固件和内核驱动程序控制，できます执行其任务（たとえば，ネットワーク传输、渲染图形等）。 关系摘要： # 固件是直接控制硬件组件的低级软件。==できます与硬件直接通信，不依赖于操作システム。== 内核是操作システム的核心，它使用驱动程序管理システム资源和硬件，并在必要时加载固件。 硬件依靠固件和内核驱动程序与操作システム通信。 システム包含所有这些组件，共同为用户提供功能环境。==システム要控制硬件，必须要通过驱动程序。== ","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/%E5%9B%BA%E4%BB%B6-%E7%A1%AC%E4%BB%B6-%E7%B3%BB%E7%BB%9F/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 Linux 中，固件 是指与特定硬件组件紧密相关的低级软件，通过提供指令和控制机制使它们能够正常実行。此固件在内核之下実行，但对于硬件与操作システム交互至关重要。\n","title":"ファームウェア・ハードウェア・システム","type":"notes"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 固件 # 定义：固件是嵌入硬件或由システム加载以直接控制硬件内部操作的低级软件。它通常存储在硬件设备本身的非易失性存储器（如 ROM、EEPROM 或闪存）中。\n角色：固件提供允许硬件正常実行的基本控制指令。它非常接近硬件并且通常在最基本的层面上実行。这意味着它控制硬件的基本行为和特性，たとえば网卡如何处理数据传输或显卡如何处理渲染。\n直接控制：在某些情况下，固件直接与硬件通信，而不依赖于操作システム (OS)。たとえば，BIOS/UEFI 固件甚至在操作システム启动之前就控制硬件。某些设备できます仅使用其固件（たとえば嵌入式システム）実行，但もし没有来自操作システム的高级控制，它们可能会受到限制。\n例：\nBIOS/UEFI，用于在计算机启动时初始化和設定システム硬件。\n显卡固件（如 VBIOS），用于设置 GPU 以进行基本渲染和与操作システム通信。\nSSD 固件，用于管理存储设备的内部磨损均衡、垃圾收集和错误更正过程。\n驱动程序 # 定义：驱动程序是一种软件，允许操作システム（如 Linux、Windows 或 macOS）与硬件设备通信。驱动程序充当操作システム和硬件之间的中介。\n角色：驱动程序使操作システム和更高级别的软件能够控制和使用硬件。固件控制硬件的内部操作，而驱动程序解释来自操作システム的コマンド并将其转换为硬件できます理解和执行的指令。驱动程序还抽象硬件复杂性，允许操作システム和应用程序与硬件交互，而无需了解其低级细节。\n操作システム控制：与固件不同，驱动程序由操作システム在実行时加载。もし没有驱动程序，操作システム就无法直接控制硬件，但一旦インストール了驱动程序，操作システム就できます通过驱动程序向硬件发送请求（たとえば，读取/写入数据、显示图形、发送ネットワーク数据包）。驱动程序还使操作システム能够以标准化的方式访问硬件资源。\n例：\n图形驱动程序（如 NVIDIA、AMD 或 Intel 驱动程序）允许操作システム和应用程序渲染复杂的图形并访问 GPU 功能。 ネットワーク驱动程序使操作システム能够与システム的网卡通信并处理ネットワーク上的数据传输。 存储驱动程序使操作システム能够与ディスク驱动器、SSD 和 USB 设备交互。 固件和驱动程序之间的主要区别 # 方面 固件 驱动程序 位置 嵌入硬件或存储在 /lib/firmware インストール在操作システム中（たとえば，在 Linux 上存储在 /lib/modules/ 中） 控制级别 直接控制硬件的内部工作 为操作システム提供与硬件通信的接口 加载时间 在操作システム启动前加载（たとえば，BIOS/UEFI）或由操作システム加载以初始化硬件 由操作システム在実行时加载以管理硬件功能 用途 管理基本的低级硬件功能 使操作システム能够访问和控制硬件 与操作システム的交互 通常独立于操作システム；在硬件级别工作 必要操作システム才能実行；作为操作システム和硬件之间的中介 例 GPU 固件、SSD 固件、UEFI 固件 图形驱动程序、ネットワーク驱动程序、声音驱动程序 固件和驱动程序如何协同工作 # 固件控制硬件的内部操作：たとえば，网卡上的固件管理卡在ネットワーク上物理发送和接收数据包的方式。它在非常低的级别处理数据包缓冲和错误检查等事情。\n驱动程序在硬件（由固件控制）和操作システム之间进行接口：操作システム中的网卡驱动程序从操作システム接收更高级别的请求（如“发送此数据包”或“连接到此ネットワーク”）并将其传递给网卡，网卡使用其固件执行这些指令。\n固件 + 驱动程序例：\n显卡上的固件设置其低级操作并确保它できます渲染基本图像，但操作システム中的图形驱动程序通过在应用程序和硬件之间提供接口，允许用户充分利用 GPU 的游戏、3 D 建模或视频渲染功能。\n摘要 # 固件直接控制硬件的内部、低级操作，使其正常実行。 驱动程序通过抽象硬件复杂性并提供标准化接口，允许操作システム与硬件进行通信和控制。 固件和驱动程序共同确保硬件设备正常工作，并可由操作システム和用户级应用程序充分利用。\n","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/%E5%9B%BA%E4%BB%B6-%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 固件 # 定义：固件是嵌入硬件或由システム加载以直接控制硬件内部操作的低级软件。它通常存储在硬件设备本身的非易失性存储器（如 ROM、EEPROM 或闪存）中。\n","title":"ファームウェアとドライバ","type":"notes"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%90%AF%E5%8A%A8/","section":"Tags","summary":"","title":"启动","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%BC%80%E6%9C%BA%E6%B5%81%E7%A8%8B/","section":"Tags","summary":"","title":"开机流程","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F/","section":"Tags","summary":"","title":"驱动程序","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%BC%95%E5%AF%BC%E5%8A%A0%E8%BD%BD/","section":"Tags","summary":"","title":"引导加载","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%BC%95%E5%AF%BC%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F/","section":"Tags","summary":"","title":"引导加载程序","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%BC%95%E5%AF%BC%E7%A8%8B%E5%BA%8F/","section":"Tags","summary":"","title":"引导程序","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%9B%BA%E4%BB%B6/","section":"Tags","summary":"","title":"固件","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/categories/%E7%A1%AC%E7%9B%98/","section":"Categories","summary":"","title":"硬盘","type":"categories"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E7%A1%AC%E4%BB%B6%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"硬件管理","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E7%A1%AC%E4%BB%B6%E6%8E%A7%E5%88%B6/","section":"Tags","summary":"","title":"硬件控制","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 当然！启动计算机的过程，从开机到加载操作システム并进入桌面，涉及多个阶段和组件。下面详细紹介了整个启动过程，包括 BIOS/UEFI、引导加载程序、启动管理器的作用以及操作システム的加载。\n1. 开机自检 (POST) # 开机： 当您打开计算机电源时，电源会向主板和所有连接的组件供电。 POST： 固件（BIOS 或 UEFI）実行一系列称为开机自检 (POST) 的诊断测试。这会检查必要的硬件组件（CPU、RAM、存储设备等）以确保它们正常実行。もし发生任何错误，システム可能会显示错误消息或蜂鸣コード。 2. 固件初始化 # BIOS/UEFI 初始化： 完成 POST 后，固件初始化硬件并为启动过程设置环境。 BIOS（基本输入/输出システム）是旧システム中使用的传统固件，而 UEFI（统一可扩展固件接口）是现代替代品，可提供增强的功能，包括支持更大的磁盘和更快的启动时间。 UEFI 固件会初始化storage（SSD, HDD 等）, cpu, memory（RAM） 基本外围设备。一开始，主机控制权在 UEFI 固件中，その後もし有 bootloader 或者 boot manager，控制权可能就转交给他们。システム加载完成后，控制权就交给システム了。 3. 启动设备选择 # 启动顺序： 固件確認其设置中設定的启动顺序以确定从哪个设备启动（たとえばディスク、SSD、USB、ネットワーク）。 UEFI 通常具有图形界面来設定启动选项，而 BIOS 可能具有基于文本的界面。 4. 加载引导加载程序（bootloader） # 引导设备访问： 固件访问所选的引导设备并查找引导加载程序。 もし GPT 磁盘带有 UEFI，它将扫描 EFI システムパーティション (ESP) 以查找引导条目。 加载引导加载程序： UEFI 根据引导顺序找到适当的 .efi ファイル（たとえば，GRUB 的 grubx64.efi）并将其加载到メモリ中。 5. 引导管理器（もし适用） # 引导管理器角色： もし引导加载程序（如 GRUB）包含引导管理器功能，则在检测到多个操作システム时，它将向用户显示菜单。たとえば，GRUB できます显示 Linux 和 Windows 的选项。 もし没有显示菜单，它将自动加载默认操作システム。 6. 加载操作システム # 操作システム内核加载： 一旦用户选择操作システム或选择默认操作システム，引导加载程序就会执行必要的コマンド，将操作システム的内核加载到メモリ中。 引导加载程序将控制权交给内核，初始化内核的子システム并加载実行操作システム所需的基本驱动程序。 用户空间初始化： 内核初始化システムプロセス和服务，挂载根ファイルシステム，并为用户空间应用程序准备环境。 这包括加载必要的驱动程序和システム服务，使计算机能够与键盘、鼠标和显示器等硬件进行通信。 启动过程摘要： # 固件 (BIOS/UEFI) 执行开机自检 (POST)。 固件初始化硬件组件并检查启动顺序。 找到并从EFI システムパーティション或 MBR 加载引导加载程序（如 GRUB）。 もし适用，启动管理器会显示一个菜单供操作システム选择。 引导加载程序将操作システム内核加载到メモリ中。 操作システム初始化システムプロセス并准备用户环境。 从开机到进入桌面的整个过程通常只需几秒到一分钟，具体取决于硬件性能以及操作システム及其設定的复杂性。\n","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/notes/system/%E4%B8%80%E4%B8%AA%E6%95%B4%E4%BD%93%E7%9A%84%E5%BC%80%E6%9C%BA%E6%B5%81%E7%A8%8B/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 当然！启动计算机的过程，从开机到加载操作システム并进入桌面，涉及多个阶段和组件。下面详细紹介了整个启动过程，包括 BIOS/UEFI、引导加载程序、启动管理器的作用以及操作システム的加载。\n","title":"全体的な起動プロセス","type":"notes"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/","section":"Tags","summary":"","title":"操作系统","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8/","section":"Tags","summary":"","title":"多系统启动","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%88%86%E5%8C%BA/","section":"Tags","summary":"","title":"分区","type":"tags"},{"content":"","date":"2024年10月10日","externalUrl":null,"permalink":"/ja/tags/%E5%88%86%E5%8C%BA%E5%AF%B9%E6%AF%94/","section":"Tags","summary":"","title":"分区对比","type":"tags"},{"content":"","date":"2024年9月27日","externalUrl":null,"permalink":"/ja/tags/lvm/","section":"Tags","summary":"","title":"LVM","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 大致流程 # 流程以下：\n将ディスクパーティション，并将其初始化为 物理卷（PV）。 将物理卷加入到一个 卷组（VG） 中。 在卷组中作成 逻辑卷（LV）。 在逻辑卷上作成ファイルシステム（如 Ext4、XFS 等）。 将逻辑卷 挂载 到システムディレクトリ中，以便访问和存储数据。 ファイルシステム紹介 # 1. ファイルシステム # ファイルシステム说白了つまり操作システム管理ディスク中数据的一个方式。 详细点つまり：问阿金システムできます管理 ディスク，SSD，u盘 等存储设备的数据布局，提供读写ファイル的接口。ファイルシステム负责存储ファイル、ファイル的元数据（如ファイル名称、权限、时间戳等），以及组织ファイル所在的パス结构（如ファイル夹层级）。\n2. ファイルシステム格式 # 主流格式以下：\nNTFS（Windows默认ファイルシステム） FAT32（一种兼容性较好的ファイルシステム，用于U盘等设备） exFAT（常用于大容量的外部存储设备） XFS（高性能的ファイルシステム，适合大数据存储） Btrfs（现代Linuxファイルシステム，提供高级功能，如快照、子卷等） ZFS（跨平台、具有高数据完整性和快照功能） 不同的ファイルシステム格式的区别つまり：性能，容量，恢复 等的区别。 ディスク操作和ファイルシステム关系 # 回顾 # 上一节的ディスク相关-卷この操作流程：\n将ディスクパーティション，并将其初始化为 物理卷（PV）。 将物理卷加入到一个 卷组（VG） 中。 在卷组中作成 逻辑卷（LV）。 其实还不能达到我们平时打开ファイル资源管理器中点击ファイル夹就できます实现跳转并显示下一层的ファイル内容。（说白了この逻辑卷还只是一个没有关联的存储空间，无法读取和写入数据）我们还要在逻辑卷上操作その後才できます实现如上效果。 要进行的操作つまり：\n在逻辑卷上作成ファイルシステム（如 Ext 4、XFS 等）。 将逻辑卷 挂载 到システムディレクトリ中，以便访问和存储数据。 このファイルシステム的格式是できます自己选择的，つまり我们インストールシステム的时候，选择自定义インストール或者高级インストール方式，できます手动选择ファイルシステム格式，手动划分ディスク，位每个パーティション或者逻辑卷选择ファイルシステム格式。たとえば：\n你できます选择在 / 根ディレクトリパーティション上使用 Ext4。 在 /home パーティション上使用 XFS。 在 /boot パーティション上使用 Ext 3，等等。 作成好ファイルシステム格式后，我们就要将其挂载到システムディレクトリ下了。原因以下：\n原因 # ==我们作成好ファイルシステム格式后，是できます让ディスク知道怎么管理数据了，但是この数据是怎么来的，つまり从操作システム上来的。既然是从操作システム上来的，我们就要挂载到操作システム上才できます来让数据写入到ディスク中，从而ファイルシステムできます按照格式来管理数据==\n让操作システム识别并访问数据： 挂载的作用是将存储设备（如ディスクパーティション或逻辑卷）关联到操作システム中的某个ディレクトリ。\nたとえば，执行一下挂载コマンド：\nsudo mount /dev/myvg/mylv /mnt/mydata（/mnt一般是挂载目录） ファイルシステム的入口点： ファイルシステム是用于组织数据的，而挂载点（如 /mnt/mydata）是ファイルシステム与操作システム交互的入口。 多卷管理：挂载できます实现在不同ディレクトリ下挂载多个存储设备或逻辑卷。类比于：つまり在电脑上できます同时挂载个 u 盘或者挂载个移动ディスク。 动态扩展和迁移：つまり继续上面的例子，u 盘和移动ディスクできます随时卸载（umount），插在别的电脑上。 ","date":"2024年9月27日","externalUrl":null,"permalink":"/ja/notes/system/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%92%8C%E5%8D%B7%E7%9A%84%E5%85%B3%E7%B3%BB/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 大致流程 # 流程以下：\n","title":"ファイルシステムとボリュームの関係","type":"notes"},{"content":"","date":"2024年9月27日","externalUrl":null,"permalink":"/ja/tags/%E9%80%BB%E8%BE%91%E5%8D%B7/","section":"Tags","summary":"","title":"逻辑卷","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 LVM（逻辑卷管理器）的概念 # LVM（Logical Volume Manager，逻辑卷管理器）是一种用于管理计算机存储设备上磁盘空间分配的方法。它提供了一种更灵活和动态的磁盘管理方式，与传统的パーティション方式相比，更加灵活和便于调整。\n1. 物理卷（Physical Volume，PV） # 物理卷是 LVM 的基本存储单元，通常对应于物理ディスクパーティション或整个ディスク。一个物理卷できます包含在一个或多个卷组中。\n物理卷的作成： 你できます使用 pvcreate コマンド将一个物理パーティション或ディスク初始化为物理卷。たとえば：\nsudo pvcreate /dev/sda3 物理卷的信息： 通过 pvs コマンドできます確認所有物理卷的信息。\nsudo pvs 2. 卷组（Volume Group，VG） # 卷组是 LVM 的第二个层次，包含了一个或多个物理卷。一个卷组できます看作是一个存储池，できます在其上作成逻辑卷。\n卷组的作成： できます使用 vgcreate コマンド将一个或多个物理卷组合成一个卷组。たとえば：\nsudo vgcreate ubuntu-vg /dev/sda3 卷组的信息： 通过 vgdisplay コマンドできます確認卷组的详细信息。\nsudo vgdisplay 3. 逻辑卷（Logical Volume，LV） # 逻辑卷是在卷组之上作成的，できます看作是传统的パーティション。它提供了实际的存储空间，できます像普通パーティション一样使用（格式化、挂载等）。\n逻辑卷的作成： できます使用 lvcreate コマンド在卷组上作成逻辑卷。たとえば：\nsudo lvcreate -L 100G -n ubuntu-lv ubuntu-vg 逻辑卷的信息： 通过 lvdisplay コマンドできます確認逻辑卷的详细信息。\nsudo lvdisplay 它们之间的关系 # 物理卷（PV）： 物理卷是 LVM 管理的最基本单位，它们是ディスクパーティション或整块ディスク。多个物理卷できます加入到一个卷组中。\n卷组（VG）： 卷组由一个或多个物理卷组成，它们将多个物理卷的空间整合在一起，形成一个大的存储池。卷组提供了逻辑卷作成和管理的基础。\n逻辑卷（LV）： 逻辑卷是在卷组之上作成的虚拟パーティション，它们できます动态调整大小，并且できます像普通的パーティション一样进行格式化和挂载。\n与ディスク的关系及使用 # ディスクパーティション（或整块ディスク）： まず将ディスクパーティション（如 /dev/sda1、/dev/sda2 等）初始化为物理卷。\n作成卷组： 将一个或多个物理卷追加到卷组中，形成一个统一的存储池。\n作成逻辑卷： 在卷组上作成一个或多个逻辑卷，逻辑卷将使用卷组中的空间。\n格式化和挂载： 作成好的逻辑卷できます进行格式化，如 ext 4 ファイルシステム，并挂载到ファイルシステムパス上。\n使用ディスク空间的方式 # 初始化物理卷：\nたとえば，使用 pvcreate /dev/sda3 将物理パーティション初始化为物理卷。 作成卷组：\n使用 vgcreate コマンド将一个或多个物理卷组合成一个卷组，如 vgcreate ubuntu-vg /dev/sda3。 作成逻辑卷：\n使用 lvcreate コマンド在卷组上作成逻辑卷，如 lvcreate -L 100G -n ubuntu-lv ubuntu-vg。 格式化逻辑卷：\nたとえば，使用 mkfs.ext4 /dev/ubuntu-vg/ubuntu-lv 格式化逻辑卷。 挂载逻辑卷：\n使用 mount コマンド挂载逻辑卷，如 mount /dev/ubuntu-vg/ubuntu-lv /mnt。 通过这些手順，你できます动态地管理和调整存储空间，而不必像传统パーティション那样必要在作成时确定固定的大小。这种灵活性对于サーバー和大规模存储管理尤其重要。\nコマンド及其解释 # sudo vgdisplay： 显示卷组（Volume Group，VG）的详细信息。\nsudo vgdisplay 输出解释：\n--- Volume group --- VG Name ubuntu-vg # 卷组的名称 System ID Format lvm2 # 卷组使用的LVM版本 Metadata Areas 1 # 元数据区域数量 Metadata Sequence No 2 # 元数据序列号 VG Access read/write # 卷组的访问权限 VG Status resizable # 卷组的状态 MAX LV 0 # 最大逻辑卷数量（0表示没有限制） Cur LV 1 # 当前逻辑卷数量 Open LV 1 # 当前打开的逻辑卷数量 Max PV 0 # 最大物理卷数量（0表示没有限制） Cur PV 1 # 当前物理卷数量 Act PV 1 # 当前活动的物理卷数量 VG Size \u0026lt;462.71 GiB # 卷组的总大小 PE Size 4.00 MiB # 每个物理扩展区（PE）的大小 Total PE 118453 # 总的物理扩展区数量 Alloc PE / Size 25600 / 100.00 GiB # 已分配的物理扩展区数量及大小 Free PE / Size 92853 / \u0026lt;362.71 GiB # 未分配的物理扩展区数量及大小 VG UUID xDrQn5-82mb-GSRY-IqDV-VR4V-fNOk-JodsIE # 卷组的唯一标识符 sudo lvdisplay： 显示逻辑卷（Logical Volume，LV）的详细信息。\nsudo lvdisplay 输出解释：\n--- Logical volume --- LV Path /dev/ubuntu-vg/ubuntu-lv # 逻辑卷的路径 LV Name ubuntu-lv # 逻辑卷的名称 VG Name ubuntu-vg # 逻辑卷所属的卷组名称 LV UUID OeCqDd-O039-JMhk-TWaJ-og8T-BPgi-rL6hcd # 逻辑卷的唯一标识符 LV Write Access read/write # 逻辑卷的访问权限 LV Creation host, time ubuntu-server, 2024-07-13 10:44:07 +0000 # 逻辑卷创建的主机和时间 LV Status available # 逻辑卷的状态 # open 1 # 当前打开的逻辑卷数量 LV Size 100.00 GiB # 逻辑卷的大小 Current LE 25600 # 当前逻辑扩展区数量 Segments 1 # 逻辑卷的段数 Allocation inherit # 分配策略 Read ahead sectors auto # 预读扇区数 - currently set to 256 # 当前设置的预读扇区数 Block device 252:0 # 逻辑卷的块设备号 sudo pvs： 显示物理卷（Physical Volume，PV）的信息。\nsudo pvs 输出解释：\nPV VG Fmt Attr PSize PFree /dev/sda3 ubuntu-vg lvm2 a-- \u0026lt;462.71g \u0026lt;362.71g PV: 物理卷的パス。 VG: 所属的卷组名称。 Fmt: 物理卷的格式（LVM 版本）。 Attr: 属性（a-- 表示激活状态）。 PSize: 物理卷的总大小。 PFree: 物理卷的空闲大小。 sudo vgs： 显示卷组的摘要信息。\nsudo vgs 输出解释：\nVG #PV #LV #SN Attr VSize VFree ubuntu-vg 1 1 0 wz--n- \u0026lt;462.71g \u0026lt;362.71g VG: 卷组的名称。 #PV: 物理卷数量。 #LV: 逻辑卷数量。 #SN: 快照数量。 Attr: 属性（wz--n- 表示可写状态、可调整大小、未关闭的卷组）。 VSize: 卷组的总大小。 VFree: 卷组的空闲大小。 sudo lvs： 显示逻辑卷的摘要信息。\nsudo lvs 输出解释：\nLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert ubuntu-lv ubuntu-vg -wi-ao---- 100.00g LV: 逻辑卷的名称。 VG: 所属的卷组名称。 Attr: 属性（-wi-ao---- 表示写入状态、初始化状态、可用状态）。 LSize: 逻辑卷的大小。 Pool: 池（もし是精简卷池）。 Origin: 源（もし是快照）。 Data%: 已使用数据的百分比（对于精简卷池）。 Meta%: 已使用元数据的百分比（对于精简卷池）。 Move Log: 移动日志。 Cpy%Sync: 同步的复制百分比。 Convert: 转换状态。 这些コマンド及其输出提供了详细的 LVM 布局和卷的状态信息，帮助你管理和监控你的存储設定。もし有其他問題或必要进一步的解释，请告诉我。\nコマンド # 在 Linux システム中，逻辑卷管理（LVM，Logical Volume Manager）是一种用于管理磁盘存储设备的ツール。LVM 使得システム管理员できます更灵活地管理ファイルシステム和磁盘パーティション。以下是一些常用的 LVM コマンド以及它们的详细紹介：\n1. 物理卷 (Physical Volume, PV) # 物理卷是 LVM 的基本存储单元。物理卷できます是整个ディスク，ディスクパーティション，或者是 RAID 设备。\n作成物理卷:\npvcreate /dev/sda1 確認物理卷:\npvdisplay 確認物理卷信息:\npvscan 削除物理卷:\npvremove /dev/sda1 2. 卷组 (Volume Group, VG) # 卷组是由一个或多个物理卷组成的逻辑集合。逻辑卷是在卷组上作成的。\n作成卷组:\nvgcreate my_vg /dev/sda1 /dev/sdb1 扩展卷组:\nvgextend my_vg /dev/sdc1 確認卷组:\nvgdisplay 確認卷组信息:\nvgscan 减少卷组:\nvgreduce my_vg /dev/sdc1 削除卷组:\nvgremove my_vg 3. 逻辑卷 (Logical Volume, LV) # 逻辑卷是在卷组上作成的，它类似于传统的磁盘パーティション，但更灵活。\n作成逻辑卷:\nlvcreate -L 10G -n my_lv my_vg 扩展逻辑卷:\nlvextend -L +5G /dev/my_vg/my_lv 確認逻辑卷:\nlvdisplay 確認逻辑卷信息:\nlvscan 减少逻辑卷（在减小逻辑卷之前，请确保ファイルシステム大小已经减小）:\nlvreduce -L -5G /dev/my_vg/my_lv 削除逻辑卷:\nlvremove /dev/my_vg/my_lv 4. ファイルシステム # 在作成逻辑卷后，通常必要在其上作成ファイルシステム。\n作成ファイルシステム:\nmkfs.ext4 /dev/my_vg/my_lv 挂载ファイルシステム:\nmount /dev/my_vg/my_lv /mnt/my_mount_point 確認挂载的ファイルシステム:\ndf -h 5. 其他有用的 LVM コマンド # 显示所有 LVM 信息:\nlvs vgs pvs 显示详细的 LVM 信息:\nlvdisplay vgdisplay pvdisplay 通过这些コマンド，システム管理员できます更灵活地管理存储资源，动态调整存储容量，并且减少システム停机时间。\n补充 # 在 Ubuntu 中確認磁盘空间できます使用以下コマンド：\ndf -h：显示磁盘使用情况，以人类可读的格式（たとえば GB、MB）。\ndf -h du -sh /path/to/directory：显示指定ディレクトリ的大小，以人类可读的格式。\ndu -sh /home lsblk：列出所有块设备，包括它们的挂载点和大小。\nlsblk fdisk -l：列出所有パーティション和详细信息。\nsudo fdisk -l lsblk：列出所有块设备及其大小。\nlsblk fdisk -l：显示所有磁盘及其パーティション信息。\nsudo fdisk -l df -h：显示各个挂载点的使用情况，包括总空间、已用空间和可用空间。\ndf -h parted -l：显示所有磁盘及其パーティション信息。\nsudo parted -l 这些コマンド将帮助你確認ディスク的总大小和パーティション信息。\n","date":"2024年9月27日","externalUrl":null,"permalink":"/ja/notes/system/%E7%A1%AC%E7%9B%98%E7%9B%B8%E5%85%B3-%E5%8D%B7/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 LVM（逻辑卷管理器）的概念 # LVM（Logical Volume Manager，逻辑卷管理器）是一种用于管理计算机存储设备上磁盘空间分配的方法。它提供了一种更灵活和动态的磁盘管理方式，与传统的パーティション方式相比，更加灵活和便于调整。\n","title":"ディスク関連：ボリューム","type":"notes"},{"content":"","date":"2024年9月27日","externalUrl":null,"permalink":"/ja/tags/%E7%A3%81%E7%9B%98%E5%AD%98%E5%82%A8/","section":"Tags","summary":"","title":"磁盘存储","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/tags/jar%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB/","section":"Tags","summary":"","title":"JARファイル","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/tags/jar%E6%96%87%E4%BB%B6/","section":"Tags","summary":"","title":"JAR文件","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/categories/java/","section":"Categories","summary":"","title":"Java","type":"categories"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/notes/java/","section":"ノート","summary":"","title":"Java","type":"notes"},{"content":"以下は、複数の Java ファイルをパッケージとして整理し、パッケージを import し、さらに JAR ファイルへ打包する流れをまとめた詳細なチュートリアルです。\n1. Java パッケージを作成する # 1.1 ディレクトリ構造 # com.example.myappというパッケージを作ると仮定すると、ディレクトリ構造は以下のようになります。\n一般的に、パッケージ名はディレクトリ構造名です。そのため、パッケージを実行・コンパイルする時は、通常ディレクトリのルート構造下でコマンドを実行します。たとえばcom.example.myappというパッケージがmyapp/src/com/example/myappに対応している場合、srcルートディレクトリでコマンドを実行する必要があります。 myapp/ │ ├── src/ │ └── com/ │ └── example/ │ └── myapp/ │ ├── HelloWorld.java │ └── Utils.java └── bin/ 1.2 Java ファイルを書く # HelloWorld.java:\npackage com.example.myapp; public class HelloWorld { public static void main(String[] args) { System.out.println(\u0026#34;Hello, World!\u0026#34;); Utils.printMessage(\u0026#34;This is a message from Utils.\u0026#34;); } } Utils.java:\npackage com.example.myapp; public class Utils { public static void printMessage(String message) { System.out.println(message); } } 2. Java ファイルをコンパイルする # ターミナルを開き、srcディレクトリへ移動します。\ncd path/to/myapp/src javacで Java ファイルをコンパイルします。\njavac com/example/myapp/*.java -d ../../bin ここで-d ../../binは、コンパイルで生成された.classファイルをbinディレクトリへ置くという意味です。\n3. Java プログラムを実行する # binディレクトリにいることを確認します。\ncd ../../bin プログラムを実行します。\njava com.example.myapp.HelloWorld 4. JAR ファイルを作成する # 引き続きbinディレクトリで、jarコマンドを使って JAR ファイルを作成します。\njar cvf myapp.jar com/example/myapp/*.class ここでcは作成、vは詳細出力、fは JAR ファイル名の指定を表します。\nJAR ファイルが作成されたか確認します。\nls myapp.jarファイルが見えるはずです。\n5. JAR ファイルを実行する # JAR ファイルを実行する時は主クラスを指定する必要があります。HelloWorldクラスの場合、MANIFEST.MFで主クラスを指定することもできますし、コマンドラインから直接実行することもできます。 java -cp myapp.jar com.example.myapp.HelloWorld この方法なら、JAR ファイル内の任意のクラスを実行できます。cpコマンドで指定すればよいです。\n6. JAR ファイルに主クラスを追加する # JAR ファイルを直接実行できるようにするには、MANIFEST.MFに主クラスを追加します。\nMANIFEST.MFというファイルを作り、内容を以下のようにします。\nManifest-Version: 1.0 Main-Class: com.example.myapp.HelloWorld JAR ファイル作成時にMANIFEST.MFを指定します。\njar cvfm myapp.jar MANIFEST.MF com/example/myapp/*.class 7. JAR ファイルを直接実行する # これで、主クラスを指定せずに JAR ファイルを直接実行できます。\njava -jar myapp.jar 8. サードパーティパッケージを使う # Java ファイルで使うパッケージが他人によって打包されたものなら、コンパイル時に引数を追加してそのパッケージを使えるようにします。例：\nコンパイル：\njavac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX.java 実行：\njava --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX 9. 自分でローカルに打包したパッケージを使う # まず、元のディレクトリ構造は以下です。\nmyapp ├── bin │ ├── com │ │ └── example │ │ ├── myapp │ │ ├── HelloWorld.class │ │ └── Utils.class │ │ │ │ │ └── myapp.jar └── src └── com └── example ├── app │ ├── HelloWorld.java │ └── Utils.java └── test └── MainApp.java 次に、新しい構造を以下のように作成します。\nmyapp ├── bin │ ├── com │ │ └── example │ │ ├── myapp │ │ │ ├── HelloWorld.class │ │ │ └── Utils.class │ │ └── test │ │ └── MainApp.class │ └── myapp.jar └── src └── com └── example ├── app │ ├── HelloWorld.java │ └── Utils.java └── test └── MainApp.java このtestフォルダの Java ファイルは以下です。\npackage com.example.test; import com.example.myapp.Utils; // 导入 Utils 类 public class MainApp { public static void main(String[] args) { Utils.printMessage(\u0026#34;Hello from MainApp!\u0026#34;); } } com.example.myappパッケージ内のUtilsクラスを import し、このファイルをcom.example.testパッケージとして設定しています。\nこのファイルのコンパイル方法 # exampleフォルダ下のすべての Java ファイルをまとめてコンパイルする。こうすれば依存関係の問題が起きにくい コンパイル時にパス（-cp）を設定する。srcフォルダ下で以下を実行：javac -cp ../bin com/example/test/MainApp.java -d ../bin -cpと jar パッケージを組み合わせてもよい。srcフォルダ下で以下を実行：javac -cp ../bin/myapp.jar com/example/test/MainApp.java -d ../bin ==最後に、パッケージを設定した時点でディレクトリ構造があるため、javacでファイルをコンパイルして具体的なディレクトリへ出力すると、対応するディレクトリ構造も生成されます。つまりフォルダが増えます。==\nこのファイルの実行方法 # 実行コマンド：\njava com.example.test.MainApp クラスファイルへのリンクが必要かどうかは状況次第です。同じパッケージルートcom/example下にあるなら-cpは不要なようです。同じルート下にない場合は-cpが必要です。\n要するに、実行できなければ手動で-cpを付ければよいです。\n10. --module-path と -cp の違い # --module-pathと-cp（または--class-path）は Java の異なるオプションで、異なる場面で使います。Java には二つのコード整理方式があるためです：モジュールシステムとクラスパス。\n違い： # 1. -cp（--class-path）： # -cpはクラスパスを指定するオプションで、従来の Java プロジェクト構造に適しています。つまり、すべての.classファイルと JAR ファイルをクラスパスで管理・読み込みます。\n使用場面：従来型 Java プロジェクトで.classファイルや JAR パッケージを探す時。 適したプロジェクト：Java 9 で導入されたモジュールシステムを使っていないプロジェクト、または依然としてクラスパスで管理しているライブラリや依存。 例：\njavac -cp /path/to/library.jar YourProgram.java java -cp /path/to/library.jar YourProgram 2. --module-path（-p）： # --module-pathはモジュールシステム用のオプションです。これは Java 9 で導入された機能です。モジュールシステムでは、コードと依存（例：JAR ファイル）はモジュールとして打包され、各モジュールは明確な依存関係と公開 API を持ちます。\n使用場面：モジュールパス（つまりモジュール化された JAR ファイル）を指定する時。Java 9 以上のプロジェクト、特に Java のモジュールシステムを使うプロジェクトに適しています。 適したプロジェクト：コードと依存をモジュールとして整理するプロジェクト。たとえば JavaFX はモジュールシステムベースのライブラリです。 例：\njavac --module-path /path/to/modules --add-modules javafx.controls YourProgram.java java --module-path /path/to/modules --add-modules javafx.controls YourProgram なぜ JavaFX には--module-pathが必要なのか？ # JavaFX は Java 9 以降、独立したモジュールになりました（JDK には含まれなくなりました）。そのため、JavaFX アプリをコンパイル・実行する時は、Java コンパイラと実行環境に JavaFX モジュールの場所を教える必要があります。これが--module-pathで JavaFX モジュールのパスを指定する理由です。\n例の説明：\njavac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX.java --module-path：JavaFX SDK のパスを指定します。ここには JavaFX のモジュール化 JAR ファイルが含まれています。 --add-modules javafx.controls：コンパイラまたは実行時にjavafx.controlsモジュールを読み込むよう明示します。これは JavaFX が提供する主要 UI コントロールモジュールです。 いつ-cpと--module-pathを使うか？ # -cpを使う：非モジュール化 Java プロジェクトや依存を使う場合は、従来通りクラスパス（-cp）を使います。 --module-pathを使う：プロジェクトまたは依存がモジュール化されている場合、特に Java 9 のモジュールシステムを使う場合、たとえば JavaFX ではこちらを使います。 小まとめ # -cpは従来のクラスパス管理に適しています。 --module-pathはモジュール化プロジェクトやライブラリ（Java 9 のモジュールシステムなど）に適しています。 まとめ # ここまでで、以下の手順を完了しました。\nJava パッケージを作成する。 Java ファイルを書いてコンパイルする。 Java プログラムを実行する。 JAR ファイルを作成する。 JAR ファイルに主クラスを追加し、直接実行する。 この方法により、コードを整理し、プロジェクト管理を簡略化し、配布しやすくできます。\n","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/notes/java/java%E4%B8%AD%E6%9C%89%E5%85%B3%E5%8C%85%E7%9A%84%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE%E4%BB%A5%E5%8F%8A%E4%BB%8B%E7%BB%8D/","section":"ノート","summary":"以下は、複数の Java ファイルをパッケージとして整理し、パッケージを import し、さらに JAR ファイルへ打包する流れをまとめた詳細なチュートリアルです。\n1. Java パッケージを作成する # 1.1 ディレクトリ構造 # com.example.myappというパッケージを作ると仮定すると、ディレクトリ構造は以下のようになります。\n","title":"Java のパッケージ設定と紹介","type":"notes"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/tags/package/","section":"Tags","summary":"","title":"Package","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/tags/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"パッケージ管理","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/ja/tags/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%A7%8B%E9%80%A0/","section":"Tags","summary":"","title":"プロジェクト構造","type":"tags"},{"content":"","date":"2024年9月21日","externalUrl":null,"permalink":"/tags/%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84/","section":"Tags","summary":"","title":"项目结构","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/categories/git/","section":"Categories","summary":"","title":"Git","type":"categories"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/notes/git/","section":"ノート","summary":"","title":"Git","type":"notes"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/svn%E5%AF%B9%E6%AF%94/","section":"Tags","summary":"","title":"SVN对比","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/svn%E6%AF%94%E8%BC%83/","section":"Tags","summary":"","title":"SVN比較","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"バージョン管理","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC/","section":"Tags","summary":"","title":"ワークフロー","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86/","section":"Tags","summary":"","title":"コマンド集","type":"tags"},{"content":" よく使う Git コマンド # Git 概要 # Git はオープンソースの分散型バージョン管理システムで、小規模から大規模まで、あらゆるプロジェクトを高速かつ効率よく扱うために使われます。 Git は Linus Torvalds が Linux カーネル開発を管理するために開発した、オープンソースのバージョン管理ソフトウェアです。 Git は CVS、Subversion などの一般的なバージョン管理ツールと異なり、分散型リポジトリ方式を採用しており、サーバー側ソフトウェアに依存しなくても利用できます。 Git と SVN の違い # Git は単なるバージョン管理システムではなく、コンテンツ管理システム（CMS）や作業管理システムとしての側面もあります。 SVN を使ってきた経験がある場合、Git が提供する概念や特徴に慣れるには、ある程度考え方を切り替える必要があります。\nGit と SVN の主な違い：\nGit は分散型で、SVN は分散型ではない。これは Git と SVN、CVS などの非分散型バージョン管理システムとの最も根本的な違いです。 Git は内容をメタデータ方式で保存し、SVN はファイル単位で保存します。多くのバージョン管理システムは、.svnや.cvsのようなフォルダにファイルのメタ情報を隠します。 Git のブランチと SVN のブランチは異なります。SVN のブランチは特別なものではなく、リポジトリ内の別ディレクトリに近いものです。 Git にはグローバルなリビジョン番号がありませんが、SVN にはあります。これは SVN と比べた時に Git にない大きな特徴です。 Git の内容完全性は SVN より優れています。Git は SHA-1 ハッシュアルゴリズムで内容を保存するため、コード内容の完全性を保証し、ディスク障害やネットワーク問題によるリポジトリ破損を減らせます。 Git はよく使いますが、多くのコマンドはなかなか覚えられません。日常利用なら下図の7つのコマンドを覚えれば十分です。ただ、熟練するには40〜60個ほど覚える必要があるため、よく使う Git コマンド一覧を整理しました。\nWorkspace：作業ツリー Index / Stage：ステージングエリア Repository：リポジトリ領域（またはローカルリポジトリ） Remote：リモートリポジトリ ユーザー名とメールアドレスの設定 # $ git --version # git のバージョン情報を確認 $ git config --global user.name # 現在ログインしているユーザーを取得 $ git config --global user.email # 現在ログインしているユーザーのメールを取得 Git にログインする設定：\n# ユーザー設定が取得できない場合、コードの pull はできても変更はできない。git を使うには、誰が使っているのか git に伝える必要がある $ git config --global user.name \u0026#39;userName\u0026#39; # git アカウントを設定。userName は git アカウント名 $ git config --global user.email \u0026#39;email\u0026#39; # Git 設定情報を取得するには、以下を実行 $ git config –list https / ssh push 時にユーザー名とパスワードを保存する設定 # # https 提交時にユーザー名とパスワードを保存 $ git config --global credential.helper store # 公開鍵と秘密鍵を生成し、公開鍵を GitHub に設定すれば、ssh 提交時にユーザー名とパスワード入力を省略できる # Enter を3回押せば ssh key を生成できる $ ssh-keygen -t rsa # 生成済み公開鍵を確認 $ cat ~/.ssh/id_rsa.pub リモートリポジトリへ push する正しい流れ # 1. git init # リポジトリを初期化 2. git add .(文件name) # ファイルをローカルリポジトリへ追加 3. git commit -m \u0026#34;first commit\u0026#34; # ファイル説明情報を追加 4. git remote add origin 远程仓库地址 # リモートリポジトリを接続し、メインブランチを作成 5. git pull origin master --allow-unrelated-histories # ローカルリポジトリの変更をリモートの master ブランチと接続 6. git push -u origin master # ローカルリポジトリのファイルをリモートへ push 一、ローカルリポジトリの新規作成 # # フォルダを作成 $ mkdir GitRepositories # GitRepositories フォルダを作成 $ cd GitRepositories # GitRepositories ディレクトリへ移動 # 現在のディレクトリに Git コードリポジトリを新規作成 $ git init # 新しいディレクトリを作り、Git コードリポジトリとして初期化 $ git init [project-name] # プロジェクトとその全コード履歴をダウンロード $ git clone [url] 二、設定（グローバルとプロジェクト） # # Git の設定ファイルは .gitconfig。ユーザーホーム（グローバル設定）またはプロジェクトディレクトリ（プロジェクト設定）に置ける # 現在の Git 設定を表示 $ git config --list # Git 設定ファイルを編集 $ git config -e [--global] # コード提出時のユーザー情報を設定 $ git config [--global] user.name \u0026#34;[name]\u0026#34; $ git config [--global] user.email \u0026#34;[email address]\u0026#34; 三、ファイルの追加 / 削除 # # 指定ファイルをステージングエリアへ追加 $ git add [file1][file2] ... # 指定ディレクトリをステージングエリアへ追加。サブディレクトリも含む $ git add [dir] # 現在のディレクトリ内の全ファイルをステージングエリアへ追加 $ git add . # 各変更の前に確認を求める # 同じファイル内の複数変更を分けてコミットできる $ git add -p # 作業ツリーのファイルを削除し、この削除をステージングエリアへ入れる $ git rm [file1] [file2] ... # 指定ファイルの追跡を停止。ただしファイルは作業ツリーに残る $ git rm --cached [file] # ファイル名を変更し、この変更をステージングエリアへ入れる $ git mv [file-original] [file-renamed] 四、コードコミット # # ステージングエリアをリポジトリへコミット $ git commit -m [message] # ステージングエリアの指定ファイルをリポジトリへコミット $ git commit [file1] [file2] ... -m [message] # 前回 commit 以降の作業ツリー変更を直接リポジトリへコミット $ git commit -a # コミット時にすべての diff 情報を表示 $ git commit -v # 新しい commit で前回のコミットを置き換える # コードに新しい変更がない場合、前回 commit のメッセージを書き換えるために使う $ git commit --amend -m [message] # 前回 commit をやり直し、指定ファイルの新しい変更も含める $ git commit --amend [file1] [file2] ... 五、ブランチ # # すべてのローカルブランチを一覧表示 $ git branch # すべてのリモートブランチを一覧表示 $ git branch -r # ローカルブランチとリモートブランチをすべて一覧表示 $ git branch -a # 新しいブランチを作成。ただし現在のブランチに留まる $ git branch [branch-name] # 新しいブランチを作成し、そのブランチへ切り替える $ git checkout -b [branch] # 指定 commit を指す新しいブランチを作成 $ git branch [branch] [commit] # 指定リモートブランチとの追跡関係を持つ新しいブランチを作成 $ git branch --track [branch] [remote-branch] # 指定ブランチへ切り替え、作業ツリーを更新 $ git checkout [branch-name] # 一つ前のブランチへ切り替え $ git checkout - # 既存ブランチと指定リモートブランチの間に追跡関係を作成 $ git branch --set-upstream [branch] [remote-branch] # 指定ブランチを現在のブランチへマージ $ git merge [branch] # 一つの commit を選んで現在のブランチへ取り込む $ git cherry-pick [commit] # ブランチを削除 $ git branch -d [branch-name] # リモートブランチを削除 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch] 六、タグ # # すべての tag を一覧表示 $ git tag # 現在の commit に tag を新規作成 $ git tag [tag] # 指定 commit に tag を新規作成 $ git tag [tag] [commit] # ローカル tag を削除 $ git tag -d [tag] # リモート tag を削除 $ git push origin :refs/tags/[tagName] # tag 情報を確認 $ git show [tag] # 指定 tag を push $ git push [remote] [tag] # すべての tag を push $ git push [remote] --tags # ある tag を指す新しいブランチを作成 $ git checkout -b [branch] [tag] 七、情報確認 # # ディレクトリを確認 $ ls -al\tまたは $ ll # リポジトリ状態を確認し、変更されたファイルを表示 $ git status # 現在のブランチの履歴を表示 $ git log # commit 履歴と、各 commit で変更されたファイルを表示 $ git log --stat # キーワードでコミット履歴を検索 $ git log -S [keyword] # ある commit 以降のすべての変更を表示。各 commit を一行で表示 $ git log [tag] HEAD --pretty=format:%s # ある commit 以降のすべての変更を表示し、その「コミット説明」が検索条件に一致するものだけを表示 $ git log [tag] HEAD --grep feature # 指定ファイルの履歴を表示。ファイル名変更も含む $ git log --follow [file] $ git whatchanged [file] # 指定ファイルに関する各 diff を表示 $ git log -p [file] # 過去5回の commit を表示 $ git log -5 --pretty --oneline # commit した全ユーザーを、commit 数順に表示 $ git shortlog -sn # 指定ファイルが誰にいつ変更されたか表示 $ git blame [file] # ステージングエリアと作業ツリーの差分を表示 $ git diff # ステージングエリアと前回 commit の差分を表示 $ git diff --cached [file] # 作業ツリーと現在ブランチ最新 commit の差分を表示 $ git diff HEAD # 二つの commit 間の差分を表示 $ git diff [first-branch]...[second-branch] # 今日自分が何行コードを書いたか表示 $ git diff --shortstat \u0026#34;@{0 day ago}\u0026#34; # ある commit のメタデータと内容変更を表示 $ git show [commit] # ある commit で変更されたファイルを表示 $ git show --name-only [commit] # ある commit 時点での指定ファイル内容を表示 $ git show [commit]:[filename] # 現在ブランチの直近の commit を表示 $ git reflog 八、リモート同期 # # リモートリポジトリのすべての変更をダウンロード $ git fetch [remote] # すべてのリモートリポジトリを表示 $ git remote -v # 指定リモートリポジトリの情報を表示 $ git remote show [remote] # 新しいリモートリポジトリを追加し、名前を付ける $ git remote add [shortname] [url] # リモートリポジトリの変更を取得し、ローカルブランチとマージ $ git pull [remote] [branch] # ローカルの指定ブランチをリモートへアップロード $ git push [remote] [branch] # コンフリクトがあっても現在ブランチを強制 push $ git push [remote] --force # すべてのブランチをリモートへ push $ git push [remote] --all 九、取り消し # # ステージングエリアの指定ファイルを作業ツリーへ戻す $ git checkout [file] # ある commit の指定ファイルをステージングエリアと作業ツリーへ戻す $ git checkout [commit] [file] # ステージングエリアの全ファイルを作業ツリーへ戻す $ git checkout . # ステージングエリアの指定ファイルを前回 commit と一致するようにリセット。ただし作業ツリーは変えない $ git reset [file] # ステージングエリアと作業ツリーを前回 commit と一致するようにリセット $ git reset --hard # 現在ブランチのポインタを指定 commit へリセットし、ステージングエリアもリセット。ただし作業ツリーは変えない $ git reset [commit] # 現在ブランチの HEAD を指定 commit へリセットし、ステージングエリアと作業ツリーも指定 commit と一致させる $ git reset --hard [commit] # 現在 HEAD を指定 commit へリセット。ただしステージングエリアと作業ツリーは保持 $ git reset --keep [commit] # 指定 commit を取り消すための新しい commit を作成 # 後者のすべての変更は前者で相殺され、現在ブランチへ適用される $ git revert [commit] # 未コミット変更を一時的に退避し、あとで戻す $ git stash $ git stash pop 十、その他 # # 現在ディレクトリの全ファイルからテキストを検索 $ git grep \u0026#34;Hello\u0026#34; # あるバージョン内でテキストを検索 $ git grep \u0026#34;Hello\u0026#34; v2.5 # 配布可能な圧縮アーカイブを生成 $ git archive 付録：Git よく使うコマンド早見表 # 付録：Git 指令早見表 # 付録：資料リンク # Git 常用命令总结 Git常用命令，很全很详细讲解的也不错 Git详细使用教程 Git使用详细教程 Git 安装和使用教程 Git 教程\n","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/notes/git/%E5%B8%B8%E7%94%A8git%E5%91%BD%E4%BB%A4/","section":"ノート","summary":"よく使う Git コマンド # Git 概要 # Git はオープンソースの分散型バージョン管理システムで、小規模から大規模まで、あらゆるプロジェクトを高速かつ効率よく扱うために使われます。 Git は Linus Torvalds が Linux カーネル開発を管理するために開発した、オープンソースのバージョン管理ソフトウェアです。 Git は CVS、Subversion などの一般的なバージョン管理ツールと異なり、分散型リポジトリ方式を採用しており、サーバー側ソフトウェアに依存しなくても利用できます。 Git と SVN の違い # Git は単なるバージョン管理システムではなく、コンテンツ管理システム（CMS）や作業管理システムとしての側面もあります。 SVN を使ってきた経験がある場合、Git が提供する概念や特徴に慣れるには、ある程度考え方を切り替える必要があります。\n","title":"よく使う Git コマンド","type":"notes"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E5%B7%A5%E4%BD%9C%E6%B5%81/","section":"Tags","summary":"","title":"工作流","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/","section":"Tags","summary":"","title":"版本控制","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E5%91%BD%E4%BB%A4%E9%9B%86/","section":"Tags","summary":"","title":"命令集","type":"tags"},{"content":" Git コマンドを使ってみた感想 # Git コマンドの初歩的な使い方 # git initで.gitリポジトリを作る（ローカルファイル全体の写真を撮るようなもの）。これでローカルリポジトリを作成し、コードをリモートへ push できるようにする git add .はドット一つか二つかをパスに応じて判断する。追加したいコードファイルだけを指定することもできる。これでファイルをステージングエリアへ送る git statusで push/追加の状況を見る。どのファイルが追加され、どれが失敗したか確認できる git commit -m “説明”でコミットする まだブランチを作っていないなら、git branch -M ブランチ名を使う（一般的にはmasterまたはmain） git remote add origin url（できれば SSH 鍵を作って使う。以後パスワードを聞かれにくい） git push origin ブランチ名 SSH 鍵の作成 # まずcd ~/.sshしてllでid_rsa、id_rsa_pubがあるか確認する。なければ次のコマンドで作成する。 *** ssh-keygen -t rsa -b 4096 -C \u0026ldquo;nni461904@gmail.com\u0026rdquo; *** 作成後、catコマンドでid_rsa_pub内の公開鍵を取得する。vimでコピーしてもよい その後 GitHub の Web 設定画面で SSH 鍵を設定すればよい git push のエラー # これはかなり奥が深く、エラー内容を見る必要がある。多くはコンフリクト系の問題 git push エラー：git push コンフリクト\n長く試行錯誤したので、最後に以前うまくいかなかった時に取った妥協的な操作を書いておく。 まず GitHub の Web 画面から clone する こうするとローカルとリモートの同期を実現でき、ローカル版がリモートより新しい状態になる その後は通常通り add してコミットすればよい フォルダ内に .git が含まれていたため GitHub 上でサブモジュール扱いになった場合 # まずこの.gitファイルを削除する：rm -rf .git 次にgit rm --cached ファイル名でステージングエリアからこのフォルダを削除し、追跡を停止する。これで修復できる git addコマンドでステージングエリアへ再追加する 最後にgit commitでコミットする 最後にgit push 修復 Git コマンド学習 # Git コマンド学習\n","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/notes/git/git-use/","section":"ノート","summary":" Git コマンドを使ってみた感想 # Git コマンドの初歩的な使い方 # git initで.gitリポジトリを作る（ローカルファイル全体の写真を撮るようなもの）。これでローカルリポジトリを作成し、コードをリモートへ push できるようにする git add .はドット一つか二つかをパスに応じて判断する。追加したいコードファイルだけを指定することもできる。これでファイルをステージングエリアへ送る git statusで push/追加の状況を見る。どのファイルが追加され、どれが失敗したか確認できる git commit -m “説明”でコミットする まだブランチを作っていないなら、git branch -M ブランチ名を使う（一般的にはmasterまたはmain） git remote add origin url（できれば SSH 鍵を作って使う。以後パスワードを聞かれにくい） git push origin ブランチ名 SSH 鍵の作成 # まずcd ~/.sshしてllでid_rsa、id_rsa_pubがあるか確認する。なければ次のコマンドで作成する。 *** ssh-keygen -t rsa -b 4096 -C “nni461904@gmail.com” *** 作成後、catコマンドでid_rsa_pub内の公開鍵を取得する。vimでコピーしてもよい その後 GitHub の Web 設定画面で SSH 鍵を設定すればよい git push のエラー # これはかなり奥が深く、エラー内容を見る必要がある。多くはコンフリクト系の問題 git push エラー：git push コンフリクト\n","title":"git_use","type":"notes"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/ssh%E9%8D%B5/","section":"Tags","summary":"","title":"SSH鍵","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/ssh%E5%AF%86%E9%92%A5/","section":"Tags","summary":"","title":"SSH密钥","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%BC%E3%83%89%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"コード管理","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"代码管理","type":"tags"},{"content":"複数人で協作する時、Git を使ったバージョン管理はコンフリクトを効果的に回避・解決できます。それでも、バージョンコンフリクトに遭遇することはあります。主な原因は、複数の開発者が同じファイルの同じ部分を変更し、Git が自動的にそれらを統合できないことです。以下では、Git のバージョンコンフリクトが発生する場面、解決方法、そして複数人協作でのバージョン管理について説明します。\n一、Git バージョンコンフリクトが発生する場面 # 同じファイルの同じ部分を複数の開発者が変更した場合： 複数の開発者が同じファイルの同じ部分を変更すると、それらをマージしようとした時、Git はどちらの変更を残すべきか自動判断できません。例：\n開発者 A が file.txt の10行目を変更し、コミットして push した。 開発者 B も、開発者 A が push する前に file.txt の10行目を変更し、その後 push しようとした。 異なるブランチのマージ： 異なるブランチ上のコードは通常、異なる開発進捗を持っています。ある開発者が二つの異なるブランチで同じファイルの同じ部分を変更した場合、ブランチをマージする時にコンフリクトが発生します。\n手動コンフリクト解決の失敗： コンフリクト発生時、開発者が手動で解決する際に必要なコードを正しく残さなかった場合、リモートリポジトリへ push する時に再びコンフリクトが起きることがあります。\n二、Git バージョンコンフリクトの解決方法 # コンフリクトが発生すると、Git は衝突箇所をマークします。ファイル内容は次のような形式になります。\n\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; HEAD # 現在のブランチのコード ======= # 他のブランチのコード \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; この場合、どちらのコードを残すか、または二つのバージョンをどう統合するかを手動で決める必要があります。具体的な手順は以下の通りです。\n1. コンフリクトファイルを確認する # コードをマージしようとした時、コンフリクトがあるとコミットが止まり、衝突ファイルが表示されます。以下のコマンドで確認できます。\ngit status コンフリクトファイルは \u0026ldquo;Unmerged paths\u0026rdquo; の下に表示されます。\n2. 手動でコンフリクトを解決する # 衝突ファイルを開き、\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;、=======、\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; のマーカーを見ながら手動で解決します。片方のコードを残すことも、異なる部分を統合することもできます。解決後、衝突マーカーを削除して保存します。\n3. コンフリクト解決済みとしてマークする # 解決後、git addコマンドで Git にコンフリクトが解決済みであることを伝えます。\ngit add \u0026lt;conflict-file\u0026gt; 4. マージ結果をコミットする # 最後に、コンフリクト解決後の変更をコミットします。\ngit commit -m \u0026#34;Resolve merge conflict\u0026#34; 5. リモートリポジトリへ push する # コンフリクト解決後、マージ後のコードをリモートリポジトリへ push できます。\ngit push origin \u0026lt;branch-name\u0026gt; 三、複数人協作における Git バージョン管理の実践 # コンフリクトを避け、減らすために、チームで協作する時はいくつかのベストプラクティスに従うべきです。以下は詳細なバージョン管理フローと戦略です。\n1. ブランチ戦略を使う # メインブランチ（main または master）：安定し、リリース済みのコードを置く。 開発ブランチ（develop）：開発用の主ブランチ。すべての開発者のコードを統合する。 機能ブランチ（feature/xxx）：機能や修正ごとに独立したブランチを作り、開発中に他機能へ影響しないようにする。 開発者は機能ブランチで作業し、機能開発が完了したらdevelopへマージし、最後にdevelopをmainへマージします。\n2. 定期的にコードを pull する（git pull） # 開発者は作業前とコード提出前に、リモートリポジトリから最新コードを定期的に pull し、自分のコードが最新状態を基にしていることを確認します。\ngit pull origin \u0026lt;branch-name\u0026gt; 3. 頻繁かつ小規模な変更をコミットする # 大規模なコミットほどコンフリクトが起こりやすいため、頻繁で小さい変更をコミットするとコンフリクト発生を減らせます。以下のコマンドでコミットできます。\ngit add . git commit -m \u0026#34;Describe the changes made\u0026#34; git push origin \u0026lt;branch-name\u0026gt; 4. コードレビュー（Code Review）と Pull Request # 複数人協作では、開発者は Pull Request を作成してコードをマージするべきです。Pull Request により、他のチームメンバーがコードをレビューし、品質を確保しつつコンフリクトを減らせます。 Pull Request は通常、feature/xxxブランチとdevelopブランチの間で行い、レビュー通過後にマージします。 5. コンフリクト解決のコツ # 頻繁にコードを pull する：機能開発中、定期的にdevelopブランチを自分の機能ブランチへマージし、自分のブランチが常に他人の作業と同期している状態にします。これにより潜在的なコンフリクトを早めに発見できます。 明確なコミット履歴を保つ：コミット時に分かりやすいメッセージを書くことで、他の開発者が各コミットの目的を理解しやすくなります。 6. ロールバック操作 # マージに失敗した場合、以下のコマンドでロールバックできます。\n最後のコミットを取り消す（まだ push していない場合）： git reset --soft HEAD^ 特定のコミットへ戻す： git reset --hard \u0026lt;commit-hash\u0026gt; 四、まとめ # 複数人協作ではバージョンコンフリクトを完全に避けることはできません。しかし、適切な Git ブランチ戦略、定期的な pull、頻繁で小規模なコミット、コードレビューなどを通じて、コンフリクトを効果的に減らし、高効率に解決できます。各チームメンバーはできるだけ早くコンフリクトに対応し、発生時には落ち着いて丁寧に解決することで、コードの安定性と協作の円滑さを確保できます。\n","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/notes/git/git%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/","section":"ノート","summary":"複数人で協作する時、Git を使ったバージョン管理はコンフリクトを効果的に回避・解決できます。それでも、バージョンコンフリクトに遭遇することはあります。主な原因は、複数の開発者が同じファイルの同じ部分を変更し、Git が自動的にそれらを統合できないことです。以下では、Git のバージョンコンフリクトが発生する場面、解決方法、そして複数人協作でのバージョン管理について説明します。\n","title":"Git バージョン管理","type":"notes"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AA%E3%82%AF%E3%83%88%E8%A7%A3%E6%B1%BA/","section":"Tags","summary":"","title":"コンフリクト解決","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"ブランチ管理","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E5%8D%8F%E4%BD%9C%E5%BC%80%E5%8F%91/","section":"Tags","summary":"","title":"协作开发","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E5%8D%94%E8%AA%BF%E9%96%8B%E7%99%BA/","section":"Tags","summary":"","title":"協調開発","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"分支管理","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3/","section":"Tags","summary":"","title":"冲突解决","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/api%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/","section":"Tags","summary":"","title":"APIドキュメント","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/api%E6%96%87%E6%A1%A3/","section":"Tags","summary":"","title":"API文档","type":"tags"},{"content":" Javadoc とは？ # Javadoc は、Java プログラミング言語で API ドキュメントを生成するためのツールです。ソースコード内の特殊なコメントを解析し、構造化されたドキュメントを持つ HTML ファイルを生成します。これにより、クラス、メソッド、フィールドなどの説明ドキュメントを作成できます。Javadoc は Java 開発において非常に重要なドキュメント生成ツールで、開発者がコードを理解し、利用する助けになります。\nJavadoc の役割 # API ドキュメントの生成：Javadoc は Java ソースコード内のコメントから、クラス、メソッド、フィールドの使い方を含む詳細な API ドキュメントを生成できます。 コード可読性の向上：Javadoc は構造化されたコメント形式を提供し、開発者がコードの機能と使い方を理解しやすくします。 保守の簡略化：良い Javadoc ドキュメントは自分で保守しやすいだけでなく、他の開発者が素早くコードを使い始める助けになります。特にオープンソースプロジェクトやチーム開発では重要です。 javadoc が注釈ファイルを生成する仕組み # Javadoc ツールは主にJava ソースコード内の Javadoc コメント部分（/** ... */形式のコメント）を抽出し、これを解析して API ドキュメントを生成します。ただし、Javadoc が生成する文書はコメント部分だけに依存するわけではありません。ソースコードからクラス、インターフェース、メソッド、コンストラクタ、フィールドなどの宣言構造とシグネチャも抽出し、完全な API ドキュメントを生成します。\nJavadoc が生成する文書には二つの部分があります。\nコメント部分：/** ... */コメントで書かれた説明、タグ内容（@param、@return、@throwsなど）。これらは抽出され、コードの用途や引数の意味などを説明する文書として生成されます。\nコード構造部分：Javadoc はコメントだけでなく、クラス、インターフェース、メソッド、コンストラクタ、フィールドなどの宣言も自動的に含めます。これらの要素はコメントがなくても生成された API ドキュメントに表示されます。Javadoc は要素の名前、型、修飾子（public、privateなど）を表示するため、文書はコードの機能説明だけでなく、構造も詳しく列挙します。\n例：コメントのない Java クラス # Javadoc コメントを追加していなくても、Javadoc ツールは基本的な API ドキュメントを生成し、クラス、メソッド、フィールドの構造を列挙します。\npublic class Example { private int value; public Example(int value) { this.value = value; } public int getValue() { return value; } } 生成された Javadoc ドキュメントには、Exampleクラスの構造、クラス名、コンストラクタ、getValueメソッドのシグネチャが表示されます。\n例：Javadoc コメントのある Java クラス # クラスやメソッドなどに Javadoc コメントを追加すると、生成される文書はより詳細になり、説明文も含まれます。\n/** * Example 类用于展示 Javadoc 的使用。 */ public class Example { /** 存储数值的字段 */ private int value; /** * 构造函数，初始化数值。 * * @param value 初始化的数值 */ public Example(int value) { this.value = value; } /** * 获取存储的数值。 * * @return 返回存储的数值 */ public int getValue() { return value; } } この例では、Javadoc ツールはクラスとメソッドの構造情報だけでなく、コメントも抽出し、生成された HTML ドキュメント内に詳細な説明、引数説明、戻り値説明を表示します。\n結論 # まとめると、Javadoc は完全な API ドキュメントを生成します。コード内のコメント部分だけでなく、クラスやメソッドの構造情報も抽出します。コメントがない部分でも、Javadoc は基本的な構造ドキュメントを生成します。コメントを追加すれば、文書はより詳しくなり、開発者がコードに書いた説明やヒントを含むようになります。\nJavadoc コメント形式 # Javadoc は特殊なコメント形式を使います。通常、Javadoc コメントはクラス、メソッド、フィールドなどの宣言の前に書き、/** ... */でコメント内容を示します。通常のコメント/* ... */と異なり、Javadoc は特定のタグを解析して構造化ドキュメントを生成します。\n/** * 这是一个简单的类，演示如何使用 Javadoc。 * 它包含两个字段和一个计算加法的方法。 * * @author 作者姓名 * @version 1.0 */ public class Calculator { /** 第一个数字 */ private int num1; /** 第二个数字 */ private int num2; /** * 构造函数，初始化两个数字。 * * @param num1 第一个数字 * @param num2 第二个数字 */ public Calculator(int num1, int num2) { this.num1 = num1; this.num2 = num2; } /** * 计算两个数字的和。 * * @return 返回 num1 和 num2 的和 */ public int add() { return num1 + num2; } } Javadoc のよく使うタグ # Javadoc には、コードの機能を整理・説明するための多くのタグがあります。以下はよく使うタグです。\n@author\nクラスの作者を示します。\n@author John Doe @version\nクラスまたはメソッドのバージョン情報を指定します。\n@version 1.0 @param\nメソッドの引数を説明します。各引数には@paramタグを一つ使い、その意味を説明する必要があります。\n@param parameterName 参数描述 @return\nメソッドの戻り値の型や意味を説明します。戻り値があるメソッドにのみ使います。\n@return 返回类型和含义 @throws / @exception\nメソッドが投げる可能性のある例外型とその意味を説明します。\n@throws IOException 如果读取文件时发生错误 @see\n参考となるクラス、メソッド、文書リンクを提供します。\n@see java.lang.String @since\nそのクラス、メソッド、フィールドがどのバージョンから追加されたかを示します。\n@since 1.5 @deprecated\nクラスまたはメソッドが非推奨であり、使用を避けるべきであることを示します。通常は代替クラスや代替メソッドも併記します。\n@deprecated Use newMethod() instead. Javadoc を生成する # コマンドラインで Javadoc を生成する # コマンドラインでは、javadocコマンドで文書を生成します。ソースコードファイルがCalculator.javaだと仮定すると、以下を実行します。\njavadoc Calculator.java 生成された Javadoc ドキュメントは HTML 形式で保存され、ブラウザで閲覧できます。\nよく使うjavadocコマンドオプション：\n-d：生成する文書の保存ディレクトリを指定。 -author：文書内に@authorタグの内容を含める。 -version：文書内に@versionタグの内容を含める。 例：\njavadoc -d doc -author -version Calculator.java これにより、文書はdocフォルダに生成され、作者とバージョン情報も含まれます。\nJavadoc 文書構造 # 生成された Javadoc 文書には通常、以下の部分が含まれます。\nクラス概要：すべてのクラス、インターフェース、列挙型の名前を列挙し、簡単な説明を提供します。 クラス詳細：各クラスの詳細情報。コンストラクタ、フィールド、メソッドの説明を含みます。 メソッド詳細：各メソッドの詳細情報。引数説明、戻り値説明、投げられる可能性のある例外を含みます。 継承構造：クラスの継承階層を表示し、開発者がクラス間の関係を理解しやすくします。 Javadoc のベストプラクティス # 各クラスとメソッドに Javadoc を書く：private メソッドであっても、後続の保守やチーム開発に役立つため、Javadoc を書くことを推奨します。\n簡潔な言葉を使う：Javadoc は簡潔で明確な言葉を使い、複雑な用語を避けるべきです。目的は他の開発者がコードの用途と使い方を理解できるようにすることです。\n引数と戻り値を詳しく説明する：特に複雑なメソッドでは、各引数の意味とメソッドの戻り値を詳しく説明する必要があります。投げられる可能性のある例外も説明すべきです。\nコードと同期させる：Javadoc 文書はコードと一致している必要があります。コードが変更されたら、Javadoc コメントもすぐ更新します。\nまとめ # Javadoc は Java 開発で非常に有用なツールです。明確で構造化された API ドキュメントを生成し、コードの可読性と保守性を高めます。チーム開発やオープンソースプロジェクトでは、Javadoc はコード品質と理解効率を大きく向上させます。Javadoc の形式とタグを理解し、ベストプラクティスに従えば、理解しやすく完全な文書を生成でき、開発効率を高められます。\n","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/notes/java/javadoc%E7%94%9F%E6%88%90%E6%B3%A8%E9%87%8A%E6%96%87%E4%BB%B6/","section":"ノート","summary":"Javadoc とは？ # Javadoc は、Java プログラミング言語で API ドキュメントを生成するためのツールです。ソースコード内の特殊なコメントを解析し、構造化されたドキュメントを持つ HTML ファイルを生成します。これにより、クラス、メソッド、フィールドなどの説明ドキュメントを作成できます。Javadoc は Java 開発において非常に重要なドキュメント生成ツールで、開発者がコードを理解し、利用する助けになります。\n","title":"javadoc で注釈ドキュメントを生成する","type":"notes"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88/","section":"Tags","summary":"","title":"コードコメント","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/ja/tags/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E7%94%9F%E6%88%90/","section":"Tags","summary":"","title":"ドキュメント生成","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E4%BB%A3%E7%A0%81%E6%B3%A8%E9%87%8A/","section":"Tags","summary":"","title":"代码注释","type":"tags"},{"content":"","date":"2024年9月20日","externalUrl":null,"permalink":"/tags/%E6%96%87%E6%A1%A3%E7%94%9F%E6%88%90/","section":"Tags","summary":"","title":"文档生成","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 インストール最新版本 neovim # 要在 Ubuntu 上将 Neovim 更新到 0.8.0 及以上版本，できます通过以下手順操作：\n1. 卸载当前版本的 Neovim # まず，卸载你当前版本的 Neovim：\nsudo apt remove neovim 2. 追加 Neovim 官方 PPA # Neovim 提供了一个官方的 PPA，包含最新的 Neovim 版本。你できます通过追加该 PPA 来获取最新版本：\nsudo add-apt-repository ppa:neovim-ppa/stable 之后更新软件包列表：\nsudo apt update 3. インストール最新版本的 Neovim # 现在インストール Neovim：\nsudo apt install neovim 这会インストール最新的稳定版本，通常是 0.8.0 或更新版本。\n4. 检查版本 # インストール完成后，你できます检查是否成功更新到所需版本：\nnvim --version 5. 設定 LazyVim # 更新 Neovim 后，确保你的 ~/.config/nvim ディレクトリ下有正确的 LazyVim 設定ファイル。一般你できます通过 GitHub 获取 LazyVim 設定。\n其他提示 # もし你仍然遇到版本問題，できます尝试通过 Neovim 官方发布页面 下载预コンパイル二进制ファイル，手动インストール Neovim。\nLazyVim 是一个很受欢迎的 Neovim 設定框架，它提供了一个开箱即用的 Neovim 設定，使得 Neovim 的使用更加高效。下面是一些常用コマンド和导航键的紹介：\n常用コマンド # 启动 Neovim\nnvim 打开ファイル\n:e 文件名 保存ファイル\n:w 保存并退出\n:wq 退出不保存\n:q! 查找ファイル\n:find 文件名 替换文本\n:%s/旧文本/新文本/g 跳转到行号\n:行号 显示帮助文档\n:help 常用导航键 # 基本导航\nh：左移 j：下移 k：上移 l：右移 单词导航\nw：跳到下一个单词的开始 e：跳到当前或下一个单词的结尾 b：跳到当前或上一个单词的开始 行导航\n0：跳到行首 $：跳到行尾 G：跳到ファイル末尾 gg：跳到ファイル开头 页面导航\nCtrl + f：向下翻一页 Ctrl + b：向上翻一页 跳转到标签\nCtrl + o：跳回到上一个跳转位置 Ctrl + i：跳到下一个跳转位置 LazyVim 特性 # LazyVim 在启动时会自动加载一系列插件，并且設定了很多便捷的功能。以下是一些特定于 LazyVim 的操作：\n插件管理\n使用 :Lazy コマンドできます管理插件，如インストール、更新和削除插件。 :Lazy install：インストール插件 :Lazy update：更新插件 :Lazy clean：削除不再使用的插件 設定ファイル\nLazyVim 的設定ファイル通常位于 ~/.config/nvim/lua/user/ ディレクトリ下，你できます在这里找到和変更 LazyVim 的設定ファイル。 快捷键\nLazyVim 可能会定义一些自定义的快捷键，你できます在 LazyVim 的文档或者設定ファイル中找到这些快捷键的定义。 快速导航方法 # 在 Neovim 中，有几种高效的方式できます快速导航到当前行中的某个单词附近，而不必要使用方向键。这些方法できます帮助你更快速地定位到你必要编辑的位置：\n1. 使用 / 查找 # 你できます使用 / コマンド进行文本查找：\n按 /\u0026lt;字符\u0026gt; 进入查找模式。 输入你要查找的单词或文本，その後按 Enter。 使用 n 跳转到下一个匹配项，N 跳转到上一个匹配项。 たとえば，要查找当前行中的 foo，你できます按 /foo，その後按 Enter。\n2. 使用 f 和 t # f 和 t コマンドできます帮助你快速跳转到当前行中的特定字符位置：\nf\u0026lt;char\u0026gt;：跳转到当前行中第一个 \u0026lt;char\u0026gt; 位置。 t\u0026lt;char\u0026gt;：跳转到当前行中第一个 \u0026lt;char\u0026gt; 之前的位置。 たとえば：\n按 f その後是 a 将跳转到当前行第一个 a 位置。 按 t その後是 a 将跳转到当前行第一个 a 之前的位置。 3. 使用 ; 和 , # ;：重复上一个 f、t、F 或 T コマンド。 ,：重复上一个 f、t、F 或 T コマンド的反向操作。 4. 使用 g コマンド # g/\u0026lt;字符\u0026gt;：在当前行中查找 \u0026lt;字符\u0026gt;。 5. 使用 * 和 # # *：查找光标下单词的下一个匹配项。 #：查找光标下单词的上一个匹配项。 在插入模式下，你できます使用一些技巧来快速移动到行中的特定位置，无需退出插入模式或使用方向键。以下是一些常用的方法：\n1. 使用 \u0026lt;C-o\u0026gt; # \u0026lt;C-o\u0026gt;（Control + o）：在插入模式下按下 \u0026lt;C-o\u0026gt; 进入一次普通模式コマンド，その後できます使用普通模式コマンド进行导航。たとえば： \u0026lt;C-o\u0026gt;f\u0026lt;char\u0026gt;：跳转到当前行中的第一个 \u0026lt;char\u0026gt; 位置。 \u0026lt;C-o\u0026gt;t\u0026lt;char\u0026gt;：跳转到当前行中的第一个 \u0026lt;char\u0026gt; 之前的位置。 \u0026lt;C-o\u0026gt;/pattern：在当前行中查找 \u0026lt;pattern\u0026gt;。 2. 使用 \u0026lt;C-w\u0026gt; # \u0026lt;C-w\u0026gt;（Control + w）：在插入模式下按下 \u0026lt;C-w\u0026gt; できます帮助你快速移动到单词边界： \u0026lt;C-w\u0026gt; + h/j/k/l：在插入模式下，按 \u0026lt;C-w\u0026gt; 后接方向键できます移动到当前单词的边界。 3. 使用插入模式快捷键 # \u0026lt;C-a\u0026gt; 和 \u0026lt;C-e\u0026gt;：这些快捷键帮助你在插入模式下进行更精确的光标移动： \u0026lt;C-a\u0026gt;：将光标移动到当前单词的开头。 \u0026lt;C-e\u0026gt;：将光标移动到当前单词的结尾。 4. 使用 \u0026lt;C-f\u0026gt; 和 \u0026lt;C-b\u0026gt; # \u0026lt;C-f\u0026gt; 和 \u0026lt;C-b\u0026gt;：在插入模式下，你できます使用这些快捷键在当前行中进行前向和后向滚动： \u0026lt;C-f\u0026gt;：向前滚动。 \u0026lt;C-b\u0026gt;：向后滚动。 5. 使用 \u0026lt;C-u\u0026gt; 和 \u0026lt;C-d\u0026gt; # \u0026lt;C-u\u0026gt; 和 \u0026lt;C-d\u0026gt;：这些快捷键できます用于向上和向下滚动文本，在插入模式下也有效： \u0026lt;C-u\u0026gt;：向上滚动半屏。 \u0026lt;C-d\u0026gt;：向下滚动半屏。 ","date":"2024年9月15日","externalUrl":null,"permalink":"/ja/notes/vim/nvim-command/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 インストール最新版本 neovim # 要在 Ubuntu 上将 Neovim 更新到 0.8.0 及以上版本，できます通过以下手順操作：\n","title":"nvim command","type":"notes"},{"content":"","date":"2024年9月15日","externalUrl":null,"permalink":"/ja/tags/ppa/","section":"Tags","summary":"","title":"PPA","type":"tags"},{"content":"","date":"2024年9月15日","externalUrl":null,"permalink":"/ja/tags/ubuntu/","section":"Tags","summary":"","title":"Ubuntu","type":"tags"},{"content":"","date":"2024年9月15日","externalUrl":null,"permalink":"/ja/tags/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/","section":"Tags","summary":"","title":"安装教程","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 Vim 中，常用的コマンド和导航键位对初学者和高级用户都非常有帮助。以下是一些常用コマンド、移动方向的键位以及如何快速移动到某个行内的位置。\n常用コマンド模式コマンド # 进入コマンド模式：按 Esc 键进入コマンド模式。 退出 Vim： :q 退出 :q! 强制退出（不保存） :wq 保存并退出 :x 保存并退出（等同于 :wq） 保存ファイル： :w 保存ファイル :w new_filename 另存为新ファイル 移动方向的键位 # 基本方向移动：\nh：向左移动一个字符 j：向下移动一行 k：向上移动一行 l：向右移动一个字符 快速移动：\n0：移动到行首 $：移动到行尾 gg：移动到ファイル开头 G：移动到ファイル末尾 :n：移动到第 n 行（たとえば :5 会移动到第 5 行） 精确跳转到行内的某个位置 # 精确跳转到某个字符：\nf\u0026lt;char\u0026gt;：向右跳转到下一个指定的字符，たとえば fa 会跳到当前行的下一个字母 a。 F\u0026lt;char\u0026gt;：向左跳转到上一个指定的字符。 t\u0026lt;char\u0026gt;：向右跳转到指定字符的前一个位置。 T\u0026lt;char\u0026gt;：向左跳转到指定字符的后一个位置。 快速跳转到行内的某个位置：\nnG：跳到第 n 行。 n|：跳到当前行的第 n 列。たとえば 5| 会跳到当前行的第 5 列。 插入模式 # 进入插入模式：\ni：在当前光标位置前插入 I：在当前行的行首插入 a：在当前光标位置后插入 A：在当前行的行尾插入 o：在当前行下方插入新行 O：在当前行上方插入新行 退出插入模式：\n按 Esc 退出插入模式，返回コマンド模式。 其他常用コマンド # dd：削除整行 x：削除光标所在的字符 u：撤销上一步操作 Ctrl+r：重做上一步操作 yy：复制当前行 p：粘贴复制/剪切的内容 Vim 的操作是高度可定制的，掌握这些基本的コマンド和导航后，你できます更高效地编辑コード。\n","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/notes/vim/vim-command/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 在 Vim 中，常用的コマンド和导航键位对初学者和高级用户都非常有帮助。以下是一些常用コマンド、移动方向的键位以及如何快速移动到某个行内的位置。\n","title":"vim command","type":"notes"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E5%AF%BC%E8%88%AA%E9%94%AE%E4%BD%8D/","section":"Tags","summary":"","title":"导航键位","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%BC%8F/","section":"Tags","summary":"","title":"命令模式","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 两者区别 # 作成桌面图标和作成软连接的方式有不同的用途和应用场景，以下是它们的主要区别：\n1. 软连接（符号链接） # 作用：软连接（ln -s コマンド）本质上是ファイルシステム中的快捷方式，它为ファイル或ディレクトリ作成一个指向目标ファイル的链接。通过软连接，用户できます使用不同的パス来访问同一个ファイル或ディレクトリ。 应用场景： 用于コマンド行中简化对某个ファイル或可执行程序的パス访问。たとえば，你できます通过软连接将 /opt/myapp/myapp_executable 映射到 /usr/local/bin/myapp，使得你できます通过コマンド myapp 来実行程序，而不必要输入完整パス。 主要用于コマンド行和ファイルシステム级别的操作，无法直接作成带图形界面或图标的可视化快捷方式。 特点： 无图形界面，纯粹是ファイルシステム中的一个链接。 用于コマンド行或脚本的便捷操作。 只适用于终端或脚本中调用程序，而不涉及桌面图标、应用菜单等图形界面元素。 2. 桌面图标（.desktop ファイル） # 作用：.desktop ファイル是一种定义应用程序启动方式的ファイル，通常用于 Linux 桌面环境。它不仅できます指向一个可执行ファイル，还できます包含应用的图标、名称、描述等信息。通过它，用户できます在桌面或应用菜单中图形化地启动应用程序。 应用场景： 用于在桌面环境下为应用程序作成图标或快捷方式，たとえば将应用程序显示在 Ubuntu 的应用菜单、启动器、桌面等地方。 允许通过图形界面启动程序，而不是通过コマンド行。 .desktop ファイルできます定义更多的行为，如是否在终端実行、传递特定参数、设置图标等。 特点： 主要用于图形化的桌面环境，允许用户通过鼠标点击图标来启动应用程序。 できます设置图标、名称、描述、类别等信息，用户体验更友好。 できます設定应用程序是否実行在终端、是否使用特定的图标等。 主要区别まとめ： # 特性 软连接 桌面图标（.desktop ファイル） 作用 作成ファイル或ディレクトリ的快捷方式，用于简化コマンド行操作 为应用程序作成桌面快捷方式，允许在图形界面中启动应用 应用场景 ファイルシステム、コマンド行中的快捷方式 桌面环境、应用菜单中的图标，图形化启动应用程序 使用方式 通过终端コマンド执行 通过点击桌面图标或应用菜单启动 图标支持 无图标支持，只是ファイルパス的指向 支持图标显示，できます自定义图标、描述、应用类别等 是否必要图形界面 不必要，完全依赖于コマンド行或ファイルシステム的パス操作 必要图形界面环境，用于桌面或应用菜单中的应用程序快捷方式 可执行ファイル的設定选项 只能指向ファイル或ディレクトリ，没有其他設定选项 できます設定是否使用终端、参数传递、应用程序分类、图标等 何时使用软连接？ # 当你主要通过コマンド行使用应用程序时，软连接是一个方便的方式。它できます让你在终端中使用简短コマンド，而无需输入完整パス。 何时使用桌面图标（.desktop ファイル）？ # 当你希望在桌面、应用菜单或启动器中图形化启动应用程序时，应该使用 .desktop ファイル。它适用于日常用户必要通过点击图标的方式启动应用程序的场景。 两者できます结合使用，比如为コマンド行用户作成软链接，同时为图形化用户提供 .desktop ファイル，这样既方便终端操作，也方便图形界面使用。\n例 # 当然，以下是分别使用软连接和 .desktop ファイル的例，以帮助你更清楚地理解两者的区别和用途。\n1. 软连接的例 # 场景：假设你インストール了一个应用程序 myapp，它的可执行ファイル位于 /opt/myapp/myapp_executable。你希望在终端中直接使用 myapp コマンド来启动この程序，而不必要输入完整パス。\n手順： # 查找可执行ファイル的パス（假设它在 /opt/myapp/myapp_executable）。 作成软连接，将其链接到 /usr/local/bin/，方便在终端中使用： sudo ln -s /opt/myapp/myapp_executable /usr/local/bin/myapp 结果： # 你现在できます直接在终端中通过输入 myapp 来启动この应用程序，而不必要输入完整パス /opt/myapp/myapp_executable。 软连接つまりファイルシステム中的一个快捷方式，できます通过コマンド行快速访问应用程序。 验证： # できます実行以下コマンド確認软链接是否作成成功：\nls -l /usr/local/bin/myapp 你会看到输出类似于：\nlrwxrwxrwx 1 root root 24 Sep 14 10:00 /usr/local/bin/myapp -\u0026gt; /opt/myapp/myapp_executable 这意味着 /usr/local/bin/myapp 现在指向 /opt/myapp/myapp_executable。\n2. 作成桌面图标的例 # 场景：你希望为 myapp 作成一个图标，显示在桌面或应用菜单中，方便通过点击启动程序。同时，你希望この图标有一个合适的名称和图标ファイル。\n手順： # まず，找到应用程序的可执行ファイル（たとえば /opt/myapp/myapp_executable）和图标ファイル（たとえば /opt/myapp/myapp_icon.png）。 作成 .desktop ファイル。你できます使用文本编辑器作成一个新的 .desktop ファイル： gedit ~/.local/share/applications/myapp.desktop 在 .desktop ファイル中追加以下内容： [Desktop Entry] Version=1.0 Name=MyApp Comment=This is my custom application Exec=/opt/myapp/myapp_executable # 应用程序的实际路径 Icon=/opt/myapp/myapp_icon.png # 图标文件路径 Terminal=false # 不需要在终端中运行 Type=Application Categories=Utility; # 类别，可根据需要选择 保存并关闭ファイル。\n赋予 .desktop ファイル执行权限：\nchmod +x ~/.local/share/applications/myapp.desktop 结果： # 你现在できます在 Ubuntu 的应用菜单中搜索 MyApp，并通过图标启动它。 もし你希望将图标显示在桌面上，还できます将 .desktop ファイル复制到桌面： cp ~/.local/share/applications/myapp.desktop ~/Desktop/ 验证： # 在应用菜单中搜索 MyApp。 双击桌面上的图标，应用程序将启动。 对比まとめ： # 特性 软连接例 桌面图标例 目的 在コマンド行中方便実行应用程序 在桌面或应用菜单中方便启动应用程序 操作システム级别 ファイルシステム（终端和パス操作） 桌面环境（图形用户界面） 作成コマンド sudo ln -s /opt/myapp/myapp_executable /usr/local/bin/myapp 编辑并作成 .desktop ファイル，赋予执行权限 启动方式 在终端中输入 myapp 点击桌面或应用菜单中的图标 是否支持图标 不支持图标，仅支持コマンド行使用 支持图标，できます在桌面、应用菜单中显示自定义图标 适合的用户 终端用户、开发者、必要频繁通过コマンド行启动程序的用户 图形界面用户、希望通过点击图标方便启动应用的普通用户 这两个方法できます结合使用，たとえば：\n为终端用户作成一个软链接，方便通过コマンド行快速启动程序。 为桌面用户作成一个 .desktop ファイル，提供友好的图形化启动方式。 説明 # 在 Ubuntu 及其他类 Unix システム中，通常将软链接（符号链接）放到 /usr/local/bin ディレクトリ有几个重要原因。この做法涉及到ファイルシステム的组织、環境変数和可执行ファイル的查找机制。\n1. /usr/local/bin 是用户ローカルインストール软件的标准ディレクトリ # /usr/local/bin 是 Linux システム中一个专门用来存放用户自己インストール的软件或脚本的ディレクトリ，而不是操作システム包管理器（如 apt）管理的软件。其主要目的包括：\n分离システム软件和用户自定义软件：システム自带的核心程序通常位于 /bin、/usr/bin 等ディレクトリ，而 /usr/local/bin 是为ローカル用户インストール的软件或脚本准备的，不会被システム包管理器覆盖或削除。 避免システム升级影响：もし用户将自己的程序放在 /usr/bin 或 /bin，在システム升级时可能会被システムファイル覆盖。而 /usr/local/bin 被保留用于ローカル用户操作，システム升级不会动このディレクトリ里的ファイル。 2. /usr/local/bin 在システム的 PATH 環境変数中 # PATH 是 Linux システム中的一个環境変数，存放着システム在终端中查找可执行ファイル的ディレクトリ。当你在终端中输入コマンド时，システム会从 PATH 列出的ディレクトリ中按顺序查找该コマンド对应的可执行ファイル。もし你将软链接放到 PATH 中的某个ディレクトリ（如 /usr/local/bin），用户できます直接在终端中実行该程序，而无需输入完整パス。\nできます通过以下コマンド確認 PATH 变量的内容：\necho $PATH 通常 PATH 中包含 /usr/local/bin，そのため将应用程序或其软链接放到このディレクトリ中后，システム能够自动找到它。\nたとえば，$PATH 通常可能包含类似以下パス：\n/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin もし将软链接放在 /usr/local/bin，就无需输入绝对パス，できます直接通过コマンド名実行程序。\n3. 方便コマンド行调用 # 将软链接放在 /usr/local/bin 中后，用户できます直接在终端中输入程序名称，而不必输入程序的完整パス。たとえば，もし你的程序可执行ファイル位于 /opt/myapp/myapp_executable，而你作成了一个软链接到 /usr/local/bin/myapp，则只需输入 myapp 即可実行该程序，而不必要每次都输入 /opt/myapp/myapp_executable。\n4. 遵循ファイルシステム层次标准（FHS） # Linux システム通常遵循 ファイルシステム层次标准（FHS, Filesystem Hierarchy Standard）。根据 FHS 规范：\n/bin 和 /usr/bin：用于存放操作システム自带的程序和包管理器インストール的软件。システム的核心ツール和程序都放在这些ディレクトリ中。 /usr/local/bin：这是专门为用户インストール的程序、脚本或ツール准备的ディレクトリ，通常用于非操作システム提供的、用户自定义インストール的软件。它できます看作是 \u0026ldquo;ローカル\u0026rdquo;（local）空间，供管理员或用户自行管理。 そのため，遵循这种标准，できます帮助管理员和开发者更好地组织システム中的应用程序，确保システム升级和维护的安全性与一致性。\n5. 权限管理 # 通常，システムディレクトリ（如 /bin、/usr/bin）是只读的，只有超级用户（root）できます对其进行写操作。相反，/usr/local/bin 通常为システム管理员和某些用户提供写权限，便于用户インストール自定义程序和脚本，而不会影响システム的核心ファイル。\nまとめ： # 将软链接放在 /usr/local/bin 是一种惯例和最佳实践，なぜなら该ディレクトリ是专门为用户インストール的ローカル程序保留的，它在 PATH 变量中，确保了你できます在终端中方便地访问和実行程序。 这样做できます保持システム的整洁和安全，避免ローカルインストール的软件与操作システム自带的核心软件发生冲突。 通过这种方式，用户できます在不破坏システム核心ファイル的情况下，自由インストール和使用自己的软件。\n","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/notes/linux/%E8%BD%AF%E8%BF%9E%E6%8E%A5%E5%92%8C-desktop%E5%9B%BE%E6%A0%87/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 两者区别 # 作成桌面图标和作成软连接的方式有不同的用途和应用场景，以下是它们的主要区别：\n","title":"シンボリックリンクと .desktop アイコン","type":"notes"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E8%BD%AF%E8%BF%9E%E6%8E%A5/","section":"Tags","summary":"","title":"软连接","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F/","section":"Tags","summary":"","title":"快捷方式","type":"tags"},{"content":"Java でプログラムをコンパイルして実行する時は、主にいくつかのコマンドを使います。代表的なものはjavac（コンパイラ）、java（実行コマンド）、その他の補助コマンドです。以下は最もよく使う Java のコンパイル・実行コマンドです。\n1. Java ソースコードを書く # まず Java ソースファイルが必要です。たとえばHelloWorld.javaというファイルを作り、内容を以下のようにします。\npublic class HelloWorld { public static void main(String[] args) { System.out.println(\u0026#34;Hello, World!\u0026#34;); } } 2. Java プログラムをコンパイルする # javacコマンドで Java ソースファイルをコンパイルします。このコマンドは.javaファイルを Java バイトコードへコンパイルし、対応する.classファイルを生成します。\njavac HelloWorld.java 実行後、HelloWorld.classファイルが生成されます。これが Java 仮想マシン（JVM）で実行できるバイトコードファイルです。\n複数ファイルをコンパイルする： # 複数の Java ファイルがある場合、一緒にコンパイルできます。\njavac File1.java File2.java または、現在ディレクトリ下のすべての Java ファイルをコンパイルします。\njavac *.java 3. Java プログラムを実行する # javaコマンドで、コンパイル済みの Java クラスファイルを実行します。\njava HelloWorld 注意：Java プログラムを実行する時、.class拡張子は付けません。クラス名だけを指定します。\n4. 出力ディレクトリを指定してコンパイルする # -dオプションで、コンパイル後の.classファイルの出力先ディレクトリを指定できます。\njavac -d bin HelloWorld.java これにより、コンパイル後の.classファイルはbinディレクトリへ出力されます。\n5. クラスパス（CLASSPATH）を設定する # Java プログラムが他のライブラリやclassファイルに依存している場合、-cp（または-classpath）オプションでクラスパスを指定する必要があります。例：\njava -cp .:lib/somelibrary.jar HelloWorld この例では、現在ディレクトリ（.）とlib/somelibrary.jarがクラスパスに追加されています（Linux はコロン:で区切り、Windows はセミコロン;で区切る点に注意）。\n6. JAR ファイルへパッケージ化する # Java プログラムを JAR ファイル（Java Archive）としてまとめ、JVM から直接実行できるようにできます。手順は以下の通りです。\nJAR ファイルを作成する： # jar cvf HelloWorld.jar HelloWorld.class 実行可能 JAR ファイルを作成する： # Java プログラムにmainメソッドがある場合、実行可能な JAR ファイルを作れます。\nまずmanifest.txtファイルを作成し、エントリポイントを指定します。 Main-Class: HelloWorld 次に、以下のコマンドで JAR ファイルを作成します。 jar cfm HelloWorld.jar manifest.txt HelloWorld.class JAR ファイルを実行します。 java -jar HelloWorld.jar JAR ファイルへパッケージ化する別の方法 # jarコマンドを使い、生成済みのバイトコードファイルをパッケージ化します。\njar -cvf hello.jar HelloWorld.class ここでcは新しいjarパッケージを作成すること、vは作成過程の情報を出力すること、fは新しく生成するjarに名前を付けることを表します。\n最後に、以下のコマンドでjarパッケージを実行します。\njava -jar hello.jar ただし、このままでは期待した結果は出ず、hello.jarにメインマニフェスト属性がないというエラーが発生します。これは、まだMENIFEST.MFファイルにMain-Class属性を追加していないためです。 圧縮ソフトで先ほど作成したhello.jarを開くと、HelloWorld.classファイル以外にMETA-INFフォルダが追加され、その中にMENIFEST.MFファイルがあります。このファイルをエディタで開き、以下のコードを追加します。（追加後、ファイル末尾に空行を一行残すことを忘れない）\nMain-Class: HelloWorld 追加後、再びjava -jar hello.jarを実行すれば、コンソールにHello World!を正常に出力できます。\n7. よく使う JDK コマンドまとめ # javac：Java コンパイラ。Java ソースファイル（.java）をバイトコードファイル（.class）へコンパイルする。\njavac HelloWorld.java java：Java インタプリタ。コンパイル済みバイトコード（.class）ファイルを実行する。\njava HelloWorld jar：JAR ファイル（Java アーカイブファイル）を作成・管理するためのコマンド。複数の.classファイルやその他リソースをまとめられる。\njar cvf HelloWorld.jar HelloWorld.class javadoc：Java ソースコードの API ドキュメントを生成する。\njavadoc HelloWorld.java javap：.classファイルを逆コンパイルし、バイトコードやメソッドシグネチャを確認する。\njavap HelloWorld 8. デバッグ（jdb） # Java プログラムをデバッグする必要がある場合、Java Development Kit にはjdbコマンド（Java Debugger）も用意されています。ブレークポイント設定、変数確認などに使えます。\njdb HelloWorld まとめ # Java プログラムのコンパイルと実行では、主に二つの核心コマンドを使います。javac（コンパイル）とjava（実行）です。これらのコマンドにより、Java コードを書き、コンパイルし、実行できます。さらに、jarコマンドで Java プログラムを JAR ファイルにパッケージ化でき、javapでバイトコードを逆コンパイルでき、jdbで Java プログラムをデバッグできます。これらのコマンドを組み合わせることで、Java 開発は非常に柔軟で強力になります。\n","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/notes/java/java-command/","section":"ノート","summary":"Java でプログラムをコンパイルして実行する時は、主にいくつかのコマンドを使います。代表的なものはjavac（コンパイラ）、java（実行コマンド）、その他の補助コマンドです。以下は最もよく使う Java のコンパイル・実行コマンドです。\n","title":"java_command","type":"notes"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/jdk/","section":"Tags","summary":"","title":"JDK","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/","section":"Tags","summary":"","title":"コンパイル","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/tags/%E7%BC%96%E8%AF%91/","section":"Tags","summary":"","title":"编译","type":"tags"},{"content":" javacでコンパイルする時やjavaで実行する時にライブラリを追加するには、--module-pathでライブラリパスを指定し、--module-addでライブラリを追加する。 比較的新しい Ubuntu バージョン（例：22.04）では、openjdk-8-jdkパッケージには OpenJDK 8 のコア機能のみが含まれ、JavaFX ライブラリは含まれなくなっています。JavaFX は Java 11 以降 JDK から削除されたため、OpenJDK 8 にも自動では含まれていません。\n原因： # JavaFX の分離：\nJava 11以降、JavaFX は標準 JDK から削除され、独立したモジュールになりました。OpenJDK 8 には JavaFX が含まれていません。これは設計理念や、将来の JavaFX モジュール化方針が異なるためです。 JavaFX と OpenJDK 8：\nOpenJDK 8 の時代には JavaFX は JDK の一部として提供されていましたが、より新しいバージョン（Java 11 以降）では独立したライブラリへ移されました。そのため、OpenJDK 8 のパッケージには JavaFX が含まれなくなっています。 解決方法： # OpenJDK 8 を使うシステムで JavaFX を追加するには、JavaFX SDK を手動でインストールする必要があります。以下の手順で操作します。\nJavaFX SDK をダウンロード：\nOpenJFX 公式サイトへアクセスし、自分の OS に合う JavaFX SDK をダウンロードします。 JavaFX を展開して設定：\nダウンロードした SDK ファイルを展開します。JavaFX の JAR ファイルを含むlibフォルダが得られます。 JavaFX アプリケーションのコンパイルと実行：\nJavaFX プログラムをコンパイルする時は、--module-path引数で JavaFX JAR ファイルの場所を指定します。 JavaFX プログラムを実行する時は、--module-pathと--add-modules引数を使い、JavaFX モジュールが利用できるようにします。 例： # ダウンロードして展開した JavaFX SDK が/path/to/javafx-sdkにあると仮定すると、以下のコマンドで JavaFX プログラムをコンパイル・実行できます。\nコンパイル：\njavac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX.java 実行：\njava --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX これで JavaFX ライブラリを OpenJDK 8 と正しく組み合わせて使用できます。\n","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/notes/java/java-lib%E5%B8%B8%E8%A7%81error/","section":"ノート","summary":" javacでコンパイルする時やjavaで実行する時にライブラリを追加するには、--module-pathでライブラリパスを指定し、--module-addでライブラリを追加する。 比較的新しい Ubuntu バージョン（例：22.04）では、openjdk-8-jdkパッケージには OpenJDK 8 のコア機能のみが含まれ、JavaFX ライブラリは含まれなくなっています。JavaFX は Java 11 以降 JDK から削除されたため、OpenJDK 8 にも自動では含まれていません。\n","title":"java_lib よくある error","type":"notes"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/openjdk/","section":"Tags","summary":"","title":"OpenJDK","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"ライブラリ管理","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/tags/%E5%BA%93%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"库管理","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/classpath/","section":"Tags","summary":"","title":"CLASSPATH","type":"tags"},{"content":"Windows で Java 環境を設定し、Java ソースプログラムをコンパイル・実行できるようにするには、主に三つの手順があります。JDK のインストール、環境変数（JAVA_HOME、PATH、CLASSPATHを含む）の設定、そして必要なライブラリファイルをプログラムが見つけられるようにCLASSPATHを設定することです。以下は詳細手順です。\n1. JDK のインストール # Oracle 公式サイト または OpenJDK へアクセスし、自分の OS に合う Java Development Kit (JDK) をダウンロードします。 ダウンロードした JDK をインストールします。インストールウィザードに従って進めればよく、デフォルトのインストールパスは通常C:\\Program Files\\Java\\jdk-versionです。 2. 環境変数の設定 # システムが Java コンパイラと実行環境を認識して使えるようにするには、JAVA_HOMEとPATH環境変数をシステムへ設定する必要があります。\nJAVA_HOME環境変数を設定する # 「此电脑」または「我的电脑」を右クリックし、**「属性」**を選択します。 **「高级系统设置」をクリックし、次に「环境变量」**をクリックします。 **「系统变量」の部分で「新建」**をクリックし、新しい環境変数を作成します。 変数名：JAVA_HOME 変数値：JDK のインストールパス。例：C:\\Program Files\\Java\\jdk-17（自分がインストールしたバージョンのパスに合わせる）。 确定をクリックして保存します。 PATH環境変数を設定する # 同じ「環境変数」ウィンドウのシステム変数で、Pathという名前の変数を探し、選択して編集をクリックします。\n**「新建」**をクリックし、以下のパスをPath変数に追加します。\n%JAVA_HOME%\\bin\n确定をクリックして保存します。\n3. CLASSPATH環境変数を設定する（任意） # CLASSPATHは、Java コンパイラと実行環境に、ユーザー定義のクラスやパッケージをどこから探すかを伝えるために使います。サードパーティライブラリを使う場合や、自分の Java クラスを独自ディレクトリに置く場合は、CLASSPATHでパスを設定できます。普通の Java 開発では、JDK が標準ライブラリを自動で探すため、通常この手順は省略できます。\nCLASSPATHを設定する必要がある場合： # **「システム変数」の部分で「新建」**をクリックし、新しい環境変数を作成します。\n変数名：CLASSPATH 変数値：ライブラリファイルのパスを含める。.を追加すると現在ディレクトリを表します。 .;%JAVA_HOME%\\lib;%JAVA_HOME%\\jre\\lib\n确定をクリックして保存します。\nCLASSPATHの各パスはセミコロン（;）で区切ります。.は現在ディレクトリを表し、JVM はここからクラスファイルを探し始めます。\n4. 設定確認 # コマンドプロンプトを開き、以下のコマンドでJAVA_HOMEが正しく設定されているか確認します。\necho %JAVA_HOME%\nインストールした JDK のパスが出力されるはずです。\njavaとjavacコマンドが正常に使えるか確認します。\njava -version javac -version\nJava のバージョン情報が表示されるはずです。正しいバージョンが表示されない場合は、環境変数の設定を確認してください。\n4. Linux で Java バージョンを変更する # java バージョンを変更する # 出力を見ると、OpenJDK 8（openjdk-8-jdk）がすでにシステムにインストールされており、バージョンは8u422-b05-1~22.04です。したがって、現在 OpenJDK 8 はすでに利用可能なはずです。\njava -versionを実行しても OpenJDK 11 が表示される場合、システムがまだ OpenJDK 11 をデフォルト Java バージョンとして使っている可能性があります。\n以下のコマンドでデフォルトの Java バージョンを切り替えられます。\nsudo update-alternatives --config java 表示される一覧から OpenJDK 8 のパス（通常java-8-openjdkを含む）を選択します。\nこのコマンドを実行した後、もう一度java -versionを実行すれば、設定した Java バージョンが表示されるはずです。\njavac バージョンを変更する # javacのバージョンを OpenJDK 8 に切り替えるには、javaのバージョンを設定した時と同じように、update-alternativesツールを使ってデフォルトのjavacバージョンを設定します。\n利用可能なjavacバージョンを確認します。 sudo update-alternatives --config javac 表示された一覧から OpenJDK 8 関連のパスを選択します。通常、パスにjava-8-openjdkが含まれています。\n選択後、もう一度javacのバージョンを確認します。\njavac -version これでjavacのバージョンをjavaと同じ OpenJDK 8 に設定できます。\n","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/notes/java/java-set/","section":"ノート","summary":"Windows で Java 環境を設定し、Java ソースプログラムをコンパイル・実行できるようにするには、主に三つの手順があります。JDK のインストール、環境変数（JAVA_HOME、PATH、CLASSPATHを含む）の設定、そして必要なライブラリファイルをプログラムが見つけられるようにCLASSPATHを設定することです。以下は詳細手順です。\n","title":"java_set","type":"notes"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/windows%E8%A8%AD%E5%AE%9A/","section":"Tags","summary":"","title":"Windows設定","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/tags/windows%E9%85%8D%E7%BD%AE/","section":"Tags","summary":"","title":"Windows配置","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/tags/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/","section":"Tags","summary":"","title":"环境变量","type":"tags"},{"content":"","date":"2024年9月14日","externalUrl":null,"permalink":"/ja/tags/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0/","section":"Tags","summary":"","title":"環境変数","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/github-pages/","section":"Tags","summary":"","title":"GitHub Pages","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 三条常用コマンド：\nhexo clean hexo generate hexo deploy 上面的这些コマンド以及設定ファイル（. yml）这些全部都是基于 source ディレクトリ下去搜索执行的。そのため，もし是設定パス是就要注意この是要基于 source ディレクトリ的，設定パス直接/img/test. jpg 这种是以 source ディレクトリ作为根ディレクトリ的。そのため要你就写完整相对ディレクトリ，不然就在 source 文夹下作成ファイル夹。 Github + Hexo 实现個人ブログ及主题設定（超详细） # 前言 # 现在市面上的ブログ很多，如 CSDN，ブログ园，简书等平台，できます直接在上面发表，用户交互做得好，写的文章百度也能搜索到。缺点是比较不自由，会受到平台的各种限制和恶心的广告。\n而自己购买域名和サーバー，構築ブログ的成本实在是太高了，不光是说这些购买成本，单单是花力气去自己搭这么一个网站，还要定期的维护它，对于我们大多数人来说，实在是没有这样的精力和时间。\n那么就有第三种选择，直接在 GitHub Pages 平台上托管我们的ブログ。这样就できます安心的来写作，又不必要定期维护，而且 Hexo 作为一个快速简洁的ブログ框架，用它来構築ブログ真的非常容易。\nHexo 简介 # Hexo 是一个快速、简洁且高效的ブログ框架。Hexo 使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。\n大家できます进入 Hexo 官网进行详细確認，なぜなら Hexo 的作成者是台湾人，对中文的支持很友好，できます选择中文进行確認。\nHexo 是基于 Node.js 的静态ブログ框架，依赖少易于インストール使用，できます方便地生成静态网页托管在 GitHub 和 Coding 上，是構築ブログ的首选框架。\nHexo 構築チュートリアル # 本次チュートリアル主要分为 8 个部分，看完便可構築自己喜欢的個人ブログ。\nインストール Git インストール Node.js インストール Hexo GitHub 作成个人リポジトリ 将 Hexo 部署到 GitHub 设置个人域名 更改主题（以 Fluid 为例） 发布文章 1. インストール Git # Windows: 到 Git 官网 下载并インストール即可，下载后会有一个 Git Bash 的コマンド行ツール，以后就用このツール来使用 Git。 Mac: 可通过 MacPorts 或インストール程序インストール。 Linux (Ubuntu, Debian): sudo apt-get install git-core Linux (Fedora, Red Hat, CentOS): sudo yum install git-core 2. インストール Node.js # Hexo 是基于 Node.js 编写的，そのため必要インストール Node.js 和 npm ツール。\nWindows: 官方インストール，选择 LTS 版本即可。 Linux: sudo apt-get install nodejs sudo apt-get install npm インストール完成后，打开コマンド行，输入以下两行检查インストール是否成功： node -v npm -v 3. インストール Hexo # インストール好 Git 之后，选择你想要インストール Hexo 的地方（たとえば新建ファイル夹）。进入ファイル夹后，我们できます右击选择 \u0026ldquo;Git Bash Here\u0026rdquo; 来打开コマンド行窗口，输入：\n$ npm install -g hexo-cli 输入 hexo -v 確認一下版本，至此环境准备完成，开始使用 Hexo 構築個人ブログ。\n4. 初始化 Hexo # 在你选择的ファイル夹中，输入以下指令：\n$ hexo init 文件夹名 $ cd 文件夹名 $ npm install 这会生成许多ファイル夹，不用担心，了解設定即可。\nnode_modules: 依赖包 public: 存放生成的页面 scaffolds: 生成文章的一些模板 source: 存放你的文章 themes: 主题 _config.yml: ブログ的設定ファイル 接着，输入以下指令进行ローカル启动確認：\n$ hexo clean $ hexo g $ hexo s 在浏览器中输入 localhost:4000 就できます看到生成的ブログ页面了。使用 ctrl + c できます关闭服务。\n5. 作成 GitHub リポジトリ # まず，你必要有一个 GitHub 账户。もし还没有，请去注册一个。\n注册完后，登录 GitHub，在 GitHub. com 中点击 \u0026ldquo;New repository\u0026rdquo; 作成一个新的リポジトリ。作成一个与用户名相同的リポジトリ，后面加 .github.io。たとえば，もし你的 GitHub 用户名是 zjc2782171149，则リポジトリ名称应为 zjc2782171149.github.io。\n6. 生成 SSH 密钥并追加到 GitHub リポジトリ # もし之前已绑定 GitHub リポジトリ的 SSH 密钥，可跳过此手順。在 Git Bash 中输入：\ngit config --global user.name \u0026#34;yourname\u0026#34; git config --global user.email \u0026#34;youremail\u0026#34; 替换 yourname 和 youremail 为你的 GitHub 用户名和邮箱。检查設定：\ngit config user.name git config user.email 生成 SSH 密钥：\nssh-keygen -t rsa -C \u0026#34;youremail\u0026#34; 在 GitHub 的设置中找到 SSH keys 选项，点击 \u0026ldquo;New SSH key\u0026rdquo; 并将 id_rsa.pub 的内容复制进去。\n7. 将 Hexo 部署到 GitHub # 打开 Hexo 的站点設定ファイル _config.yml，変更以下内容：\ndeploy: type: git repo: git@github.com:zjc2782171149/zjc2782171149.github.io.git branch: master インストール hexo-deployer-git 插件：\nnpm install hexo-deployer-git --save 进行部署：\nhexo clean hexo generate hexo deploy 访问 http://你的用户名.github.io 確認部署结果。\n8. 个人域名設定 # 购买并注册一个域名，たとえば通过阿里云。設定域名解析，将域名解析到 你的用户名.github.io 上。在 GitHub リポジトリ的 \u0026ldquo;Settings\u0026rdquo; 中，设置 Custom domain，输入你的域名。\n在 source ファイル夹中作成一个名为 CNAME 的ファイル，ファイル内容为你的域名。たとえば：\nblog.zhangjiancong.top 更改默认分支为 master，并重新部署：\nhexo clean hexo g hexo d 更改主题 # 以 Fluid 主题为例：\n下载 Fluid 主题的压缩包，将其解压到 themes ファイル夹下，并更名为 fluid。 変更 _config.yml ファイル，将 theme 属性更改为 fluid，并将 language 属性変更为 zh-CN。 输入以下指令重新部署： hexo clean hexo g hexo d 发布文章 # 发布新文章：\nhexo new newpapername 编辑 source/_posts 中的 Markdown ファイル，完成后进行重新部署：\nhexo clean hexo g hexo d 每次更新文章或設定ファイル时都必要重新部署。\n如有小伙伴觉得每次重新部署都麻烦，できます研究 GitHub Pages 的自动部署功能。\nhexo 网站的完善 # 在 Hexo 网站上，标签页面和分类页面是两种不同的内容组织方式，但它们都できます帮助你对文章进行分类和组织。让我们先看看如何分别实现 标签页面 和 分类页面，以及如何使用 tags 和 categories 来实现文章的标签和分类。\n1. 标签页面（Tags Page） # 标签页面展示所有文章的标签及其对应的文章。它通常和文章的 tags 属性相结合，让读者できます通过点击某个标签来浏览该标签下的所有文章。\n如何实现标签页面 # 作成标签页面： 在 source ディレクトリ下作成一个 tags ファイル夹，并在其中作成一个 index.md ファイル。\nmkdir -p source/tags touch source/tags/index.md 编辑 index.md： 在 index.md ファイル中，追加以下内容来指定它是一个标签页面：\n--- title: Tags date: 2024-09-06 00:00:00 type: \u0026#34;tags\u0026#34; --- 这里 type: \u0026quot;tags\u0026quot; 告诉 Hexo 这是一个标签页面，Hexo 会自动生成所有标签的列表。\n使用文章中的 Tags： 在你的文章（.md ファイル）中使用 tags 字段来为文章指定标签。たとえば：\n--- title: 我的文章 date: 2024-09-06 tags: - 技术 - Hexo --- 在この例子中，文章被打上了 技术 和 Hexo 两个标签。生成网站后，在标签页面 (/tags/) 中，点击这些标签会列出相关的文章。\n2. 分类页面（Categories Page） # 分类页面展示所有文章的分类及其对应的文章。与 tags 不同，分类是更高层次的组织方式，通常用于将文章分组为不同的主题或类型。\n如何实现分类页面 # 作成分类页面： 和作成标签页面类似，在 source ディレクトリ下作成一个 categories ファイル夹，并在其中作成一个 index.md ファイル。\nmkdir -p source/categories touch source/categories/index.md 编辑 index.md： 在 index.md ファイル中，追加以下内容来指定它是一个分类页面：\n--- title: Categories date: 2024-09-06 00:00:00 type: \u0026#34;categories\u0026#34; --- 这里 type: \u0026quot;categories\u0026quot; 告诉 Hexo 这是一个分类页面，Hexo 会自动生成所有分类的列表。\n使用文章中的 Categories： 在你的文章（.md ファイル）中使用 categories 字段来为文章指定分类。たとえば：\n--- title: 我的文章 date: 2024-09-06 categories: - 编程 - 前端开发 --- 在この例子中，文章被归类为 编程 和 前端开发。生成网站后，在分类页面 (/categories/) 中，点击这些分类会列出相关的文章。\n3. 标签（Tags）和分类（Categories）的区别与组合使用 # 标签 (Tags)：标签通常用于给文章追加多个关键字，便于读者快速找到具有相似标签的文章。文章できます有多个标签，没有层级结构，通常适合更细粒度的内容分类。\n分类 (Categories)：分类则是将文章组织成更大的类别，具有层级结构。たとえば，一个分类できます有子分类。每篇文章通常只有一个主分类，适合更广泛的内容分组。\n例文章使用标签和分类 # --- title: 我的博客文章 date: 2024-09-06 tags: - Hexo - 博客搭建 categories: - 技术 - Web开发 --- Tags (标签)：文章有两个标签 Hexo 和 ブログ構築，点击这些标签できます找到所有有这些标签的文章。 Categories (分类)：文章被归类为 技术 -\u0026gt; Web开发，读者できます通过分类页面找到属于该分类的所有文章。 4. 关于我（about）页面 # 在 Hexo 中，你できます通过作成“关于页面”（About Page）来展示个人信息，比如 GitHub 链接、ブログ、QQ 等。できます通过作成一个单独的 Markdown ファイル，并在其中定义这些信息。接下来，我会详细紹介如何设置“关于页面”以及如何在其中展示和跳转到你的个人信息。\n1. 作成“关于页面” # まず，你必要在 Hexo 的 source ディレクトリ下作成一个新的ファイル夹，并在其中追加一个 index.md ファイル：\nmkdir -p source/about touch source/about/index.md 2. 编辑 index.md ファイル # 在 index.md ファイル中，你できます使用 Markdown 来书写内容并追加个人信息。Hexo 会将このファイル渲染成 HTML 页面。你できます使用 HTML 或 Markdown 链接来跳转到 GitHub、ブログ等。\n以下是一个“关于页面”的例：\n--- title: 关于我 date: 2024-09-06 type: \u0026#34;about\u0026#34; --- # 关于我 你好，我是 [你的名字]，这是一段关于我的介绍。 ## 联系方式 - **GitHub**: [我的 GitHub](https://github.com/yourusername) - **博客**: [我的博客](https://yourblog.com) - **QQ**: 123456789 欢迎通过以上方式联系我！ 3. 显示个人信息并追加链接 # 你できます用 Markdown 格式轻松展示个人信息并追加超链接，比如：\nGitHub 链接できます写成我的 GitHub。 ブログ链接できます写成我的ブログ。 QQ 号できます直接展示为文本或通过一些 QQ API 实现联系跳转。 4. 在导航栏中追加“关于”页面 # 为了让用户できます轻松访问“关于页面”，你できます在 Hexo 的主题設定ファイル（通常是 themes/your-theme/_config.yml）中，将“关于”页面的链接追加到导航栏中。\n找到 menu 設定项，并追加 about 页面：\nmenu: Home: / Archives: /archives About: /about 这样，导航栏中就会出现“关于”链接，点击后会跳转到 /about 页面。\n5. 自定义样式 # もし你想要让“关于页面”更加个性化，できます在主题的 CSS ファイル中追加自定义样式。たとえば，できます为页面的个人信息部分定义一些自定义的样式，以美化显示效果。\n在 themes/your-theme/source/css/ 中的样式ファイル（たとえば style.css 或 custom.css）中，追加以下内容：\n.about-info { font-size: 18px; color: #333; } .about-info a { color: #007bff; text-decoration: none; } .about-info a:hover { text-decoration: underline; } その後，在 index.md ファイル中将内容包裹在一个 div 里：\n\u0026lt;div class=\u0026#34;about-info\u0026#34;\u0026gt; ## 联系方式 - **GitHub**: [我的 GitHub](https://github.com/yourusername) - **博客**: [我的博客](https://yourblog.com) - **QQ**: 123456789 \u0026lt;/div\u0026gt; 这样，你就できます通过 CSS 自定义“关于页面”的样式。\n","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/misc/hexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%88%9B%E5%BB%BA/","section":"その他","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 三条常用コマンド：\n","title":"Hexo 個人ブログの作成","type":"misc"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E3%83%86%E3%83%BC%E3%83%9E%E8%A8%AD%E5%AE%9A/","section":"Tags","summary":"","title":"テーマ設定","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E3%83%96%E3%83%AD%E3%82%B0%E6%A7%8B%E7%AF%89/","section":"Tags","summary":"","title":"ブログ構築","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/tags/%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/","section":"Tags","summary":"","title":"主题配置","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/","section":"Tags","summary":"","title":"博客搭建","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 The program code, global variables, and constant global variables are all stored in static segments, as these all have static lifetimes and known sizes at compile time.\nIf we look at the addresses printed by mexplore, we see that the global variables stored in are at relatively low memory addresses (around 0x60'0000 hexadecimal and 0x40'0000 hexadecimal), while the local variable is stored at a high address, close to 0x7fff'ffff'ffff (about 247), and the dynamically allocated character is stored in between (albeit closer to the static segments).\nThere is a reason for this placement: it allows both types of segments to grow without risk of getting in each other\u0026rsquo;s way. In particular, the automatic-lifetime segment grows downwards as more local variables come into scope, while the dynamic-lifetime segment grows upwards. If they ever meet, your computer runs out of memory.\nメモリ区域划分 # 在计算机中，程序実行时的メモリ布局通常分为多个区域，每个区域负责存储特定类型的数据。这种メモリ布局通常包括以下主要部分：\nコード段（Text Segment）:\n存储内容: 存放程序的可执行コード，也つまりコンパイル后的机器指令。该区域通常是只读的，以防止程序的コード被意外或恶意変更。 特性: 常见操作システム将其标记为只读并可执行。 数据段（Data Segment）:\n存储内容: 存放已初始化的全局变量和静态变量。この段できます进一步分为两部分： 已初始化数据段（Initialized Data Segment）: 存储在コンパイル时已初始化的全局和静态变量。 未初始化数据段（BSS Segment，Block Started by Symbol）: 存放未初始化的全局变量和静态变量。在程序开始执行时，BSS 段的内容会被初始化为零。 特性: 数据段是可读写的。 堆（Heap dynamic-lifetime segment is called the heap）:\n存储内容: 用于动态分配的メモリ块。malloc、calloc、realloc 等函数在実行时从堆中分配メモリ。堆的大小できます在実行时增长和缩小。 特性: 堆区域通常从低地址向高地址扩展。 栈（Stack automatic-lifetime segment is called the stack.）:\n存储内容: 用于存放函数的局部变量、函数参数和返回地址。当函数被调用时，会在栈上分配一个新的栈帧，用于存储该函数的局部数据。函数调用结束后，栈帧会被释放。 特性: 栈区域通常从高地址向低地址扩展。栈的大小是有限的，过度使用栈空间（如过深的递归调用或大量局部变量）可能导致栈溢出。 常量段（Rodata Segment）:\n存储内容: 存放只读数据，比如字符串常量和其他不变数据。这些数据通常在コンパイル时确定并在実行时不会改变。 特性: 常量段通常是只读的。 执行堆栈（Call Stack）:\n存储内容: 特指用于存储每个スレッド的调用信息，包括函数调用的返回地址、局部变量和函数参数。执行堆栈与栈区域有些重叠的概念。 特性: 递归调用或大量局部变量可能导致栈溢出。 メモリ布局示意图 # 典型的メモリ布局==从高地址到低地址==できます以下表示：\n+--------------------+ | 栈 (Stack) | +--------------------+ | 堆 (Heap) | | (动态分配区) | +--------------------+ | 未初始化数据段 (BSS) | +--------------------+ | 已初始化数据段 (Data) | +--------------------+ | 只读数据段 (Rodata) | +--------------------+ | 代码段 (Text) | +--------------------+ | 其他系统区域 (Other) | +--------------------+ 在 C 语言中，变量根据其类型和作用域分布在程序的不同メモリ区域。以下是不同类型的变量及其存储位置的详细説明：\n全局变量（Global Variables）:\n定义: 在函数外部定义的变量，具有全局作用域，整个程序実行期间都できます访问。 存储位置: 已初始化的全局变量存储在**数据段（Data Segment）**的已初始化数据区域。 未初始化的全局变量存储在BSS 段（Block Started by Symbol Segment），程序开始时 BSS 段的内容被初始化为零。 静态变量（Static Variables）:\n定义: 使用 static 关键字修饰的变量。できます是全局或局部的，但在程序的生命周期内都只分配一次，并保留其值。 存储位置: 静态全局变量：与全局变量类似，已初始化的存储在数据段，未初始化的存储在 BSS 段。 静态局部变量：尽管其作用域仅限于函数内，但其生命周期与程序相同，也存储在数据段或 BSS 段中。 常量变量（Constant Variables）:\n定义: 使用 const 关键字修饰的变量，声明后不能更改其值。 存储位置: 常量全局变量：通常存储在只读数据段（Rodata Segment）。但もし常量是局部的，它可能存储在栈或寄存器中，具体取决于コンパイル器优化。 常量局部变量：通常在栈上分配，或者在某些情况下コンパイル器可能将它们优化到寄存器中。 局部变量（Local Variables）:\n定义: 在函数或块中定义的变量，只在其定义的作用域内有效。 存储位置: 通常存储在**栈（Stack）**中。函数调用时，局部变量在栈上分配空间，函数返回时这些空间被释放。 动态分配的メモリ:\n定义: 使用 malloc、calloc、realloc 等函数动态分配的メモリ。大小和数量在実行时决定。 存储位置: 存储在**堆（Heap）**中。堆メモリ的生命周期由程序员控制，必要手动释放（使用 free 函数），否则会导致メモリ泄漏。 まとめ # コード段（Text Segment）: 存放程序的可执行コード。 数据段（Data Segment）: 存放已初始化的全局变量和静态变量。 BSS 段（Block Started by Symbol Segment）: 存放未初始化的全局变量和静态变量，程序开始时初始化为零。 只读数据段（Rodata Segment）: 存放常量数据和字符串常量。 栈（Stack）: 存放局部变量、函数参数和返回地址。 堆（Heap）: 存放动态分配的メモリ。 理解这些メモリ区域及其作用对于高效和安全的编程至关重要，特别是在涉及到动态メモリ管理、全局状态和並行問題时。\n","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/notes/system/%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F%E4%BB%8B%E7%BB%8D/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 The program code, global variables, and constant global variables are all stored in static segments, as these all have static lifetimes and known sizes at compile time.\n","title":"メモリ領域の紹介","type":"notes"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E6%95%B0%E6%8D%AE%E6%AE%B5/","section":"Tags","summary":"","title":"数据段","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E5%A0%86%E5%92%8C%E6%A0%88/","section":"Tags","summary":"","title":"堆和栈","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E4%BB%A3%E7%A0%81%E6%AE%B5/","section":"Tags","summary":"","title":"代码段","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"内存管理","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/categories/%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F/","section":"Categories","summary":"","title":"内存区域","type":"categories"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/futamura%E6%8A%95%E5%BD%B1/","section":"Tags","summary":"","title":"Futamura投影","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E7%BC%96%E8%AF%91%E6%8A%80%E6%9C%AF/","section":"Tags","summary":"","title":"编译技术","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/categories/%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3%E5%92%8C%E8%AF%AD%E8%A8%80/","section":"Categories","summary":"","title":"编程思想和语言","type":"categories"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E8%A7%A3%E9%87%8A%E5%99%A8/","section":"Tags","summary":"","title":"解释器","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Futamura 投影（Futamura Projection）是编程语言和コンパイル技术中的一个重要概念，由日本计算机科学家 Futamura Yoshihiko 在 1971 年提出。Futamura 投影解释了如何通过对解释器进行部分求值（Partial Evaluation），将解释器转换为コンパイル器，以及进一步的可能转变。\n背景与基本概念 # 在理解 Futamura 投影之前，必要了解以下两个概念：\n解释器（Interpreter）：一种程序，它读取并执行另一个程序的コード。解释器按コード的一行或一段来处理，逐行或逐段地将源コード翻译成目标コード并执行。\n部分求值（Partial Evaluation）：一种コンパイル技术，旨在通过提前计算程序中能够在コンパイル时确定的部分，从而生成更高效的コード。部分求值会保留在実行时才知道的部分，从而使得程序既高效又灵活。\n三次 Futamura 投影 # Futamura 投影できます分为三个阶段，称为“第一次投影”、“第二次投影”和“第三次投影”：\n第一次 Futamura 投影：\n将解释器和一个特定的源程序作为部分求值器的输入，生成一个针对该特定源程序的专用コンパイル器。このコンパイル器できます直接将源程序翻译成目标コード。 形式化描述：もし有解释器 I 和源程序 P，通过部分求值（PE），我们できます生成一个等价的目标程序 P'。 表示为：PE(I, P) = P'，其中 P' 是源程序 P 对应的目标コード。 第二次 Futamura 投影：\n将解释器本身作为部分求值器的输入，生成一个针对任何源程序的コンパイル器。这意味着将解释器的行为部分求值，得到一个コンパイル器。 形式化描述：通过部分求值器 PE 对解释器 I 进行部分求值，できます生成一个コンパイル器 C，このコンパイル器できます将任何源程序 P 翻译成目标程序 P'。 表示为：PE(PE, I) = C，其中 C 是一个できます将源程序 P コンパイル成目标コード P' 的コンパイル器。 第三次 Futamura 投影：\n将部分求值器本身作为输入，对其进行部分求值，生成一个できます生成コンパイル器的コンパイル器生成器（也称为コンパイル器生成器、コンパイル器コンパイル器）。 形式化描述：通过部分求值器 PE 对 PE 进行部分求值，できます生成一个コンパイル器生成器 G，该生成器能够生成コンパイル器。 表示为：PE(PE, PE) = G，其中 G 是一个できます生成コンパイル器的コンパイル器生成器。 意义与应用 # Futamura 投影展示了如何通过部分求值将解释器转化为コンパイル器，并进一步展示了コンパイル器生成器的潜力。这一思想在编程语言的实现和优化领域具有重要意义，特别是在自动化生成コンパイル器和提高コンパイル效率方面。\n第一次投影提供了从解释器生成专用コンパイル器的方法，使得特定源程序できます直接被コンパイル为目标コード。 第二次投影展示了如何生成通用コンパイル器，从而无需解释器就できます直接コンパイル任何源程序。 第三次投影则展示了生成コンパイル器生成器的可能性，即自动化ツールできます生成コンパイル器，这对编程语言设计与实现具有深远影响。 Futamura 投影是一种理论ツール，展示了コンパイル和解释之间的深层联系，并引导了コンパイル器自动生成技术的发展。\n摘自论坛 # 相比上一节强调物理或逻辑上客观存在的 “界限”，本节主要强调一种心智活动。这样的心智活动具有一个明显的特征，那つまり它具有一种 “递归” 的结构。我们まず从一个概念中抽象出它的形成过程，再将这样的思维过程应用于この概念自身。如此，我们得到的新概念常常具有这样的结构： A 的 A。\n个人认为，本节讨论的思想或许是本文的所有思想中最为重要的那一个。这是なぜなら高阶这一思想具有很好的方法论层面上的指导意义，并且在实践中操作起来又有趣又直截了当——同时，个人的看法是通过这一思想生成的很多概念对启迪编程初学者的思维具有非常重要的意义（事实上，もし要从整个技术界中选一个本科教育一般不大重视、但又极度有价值的术语，我会选闭包和高阶函数）。\n通过这样一种 “递归式” 的抽象过程得到的 A 的 A 这一形式的概念，我们通常将其称作 “高阶 A”。比如，将函数代表的过程 (A -\u0026gt; B) 抽象出来，再应用于函数自身，我们就得到了 函数的函数，即 高阶函数（higher-order function）。个人认为高阶函数和闭包是计算机领域最为重要的抽象之一。\nたとえば，将类型的形成过程（类型描述一个语言中最小单位的类别）抽象出来，应用于类型自身，我们就得到了 类型的类型，即 型别（kind）。\n二村映射 (Futamura Projections) # 最後に，作为压轴，讲一个我昨晚在一篇屯了半年一年的文章中看到的一个概念。我想この概念应该是超出大部分读者的经验的，而我觉得它还蛮有意思，そのため放到最後に来大概说说。我们必要从故事的最开始讲起——可能要过很久才能最终看到この词。\nコンパイル技术的分类 # 我们知道大体上コンパイル技术できます分为两种，分别是 コンパイル器 (compiler) 和 解释器 (interpreter)。コンパイル器执行的是一个两阶段的过程：まず，自源コードコンパイル出目标程序 (target program)，再向目标程序提供输入，その後得到程序的输出；解释器执行的则是一个一阶段的过程：解释器接收源コード和输入，并直接得到程序的输出。在本节中，我们主要关注解释器。\n绝大部分的コンパイル原理教科书和课程都只涵盖这两者。然而，事实上还存在着第三种コンパイル技术：某种程度上，它介于解释器和コンパイル器之间，但它既不是解释器又不是コンパイル器——请特别注意这一点。为了方便理解，我先岔开点讲。\n函数式编程中的概念 # 稍有函数式经验的读者应该都听过 柯里化 (Currying)。もし有一个接收 n 个输入的函数，我们できます把它转化成一叠嵌套的高阶函数，这叠高阶函数中的第 i 个接收原函数中的第 i 个输入（仅一个），その後返回接收剩下 n-i 个输入的函数（故为 “高阶函数”）：比如，一个接收 3 个输入的函数 ((A, B, C) -\u0026gt; Output) 经柯里化后会成为一叠高阶函数，この高阶函数中的第一个接收一个输入 A，その後返回一个接收输入 B 的高阶函数；再向其提供输入 C，才能得到最终结果，即柯里化后的结果是 (A -\u0026gt; (B -\u0026gt; (C -\u0026gt; Output)))。\n尽管在支持闭包和高阶函数的语言中柯里化和 反柯里化 (Uncurrying) 都能以非常浅显 (trivial) 的方式实现，但仅有少数的编程语言才一等地支持了柯里化，比如 ML 系语言（Haskell, SML, OCaml, F#）和 Scala。\n对于一个经柯里化后的函数，もし我们只向它提供前 i (i\u0026lt;n) 个输入，那么我们必然得不到最终的输出，而只能得到一个高阶函数，它会再处理余下的输入：这称作 部分应用 (Partial Application)。\n讲了这么一大堆，其实主要つまり为了部分应用この概念。你可能会想知道为什么我在上文不用参数この惯用说法而是用输入，你可能也已经猜到了，这是なぜなら我希望在此强调将解释器理解成一个函数的思想：它的输入是源コード和这段コード的输入，它的输出是这段コード的输出（事实上，很多语言都提供一些十分类似解释器的机制，它们确实是函数（比如 eval））。\n部分求值 (Partial Evaluation) # 是的，之そのため要将解释器理解成一个函数，是なぜなら我正是要借用部分应用的思想：既然解释器的输入是源コード和输入，那么我能不能部分应用この “函数”（即解释器），まず给定源コード，得到一个 “处理剩下参数的高阶函数”（即一个中间程序），その後对于この中间程序，再提供它的输入，その後得到结果？\n答案是，这是可行的。事实上，这一过程称作 部分求值 (Partial Evaluation)，而执行这一过程的程序我们称作 部分求值器 (Partial Evaluator)。部分求值器作用于一个程序和它的一些参数，输出一个该程序对于这组参数 “特化” 后的新的程序。这里的 “一个程序” 我们称作 源程序 (Source Program)，“新的程序” 我们称作 残差程序 (Residual Program)。\n回到上边有关解释器举例上来。我们将一个解释器和一个源程序传入部分求值器中，得到的残差程序つまり一个接收 输入 返回 输出 的中间程序。\n是不是觉得非常的熟悉……？第一阶段我们提供源コード，得到中间程序；第二阶段我们提供输入，随后得到输出。这是在做什么…？\n是的，这つまりコンパイル。神奇之处在于，我们并没有手工编写一个コンパイル器，我们只是将一个解释器和必要被求值的源コード扔给了部分求值器而已——某种意义上来说，我们是 “免费” 得到了一个コンパイル器。\n部分求值器与语言虚拟机 # 你可能在思考这有什么用？你或许已经将这一思路和语言虚拟机联系了起来：众所周知，实现コンパイル器通常比实现解释器难得多，那我们能不能弄一个本质其实是一个部分求值器的语言虚拟机，在この虚拟机上实现一门新的语言只必要编写一个解释器就行了，而语言虚拟机会调用它的部分求值器自动帮我生成对应的、更加高效的 “コンパイル器” 呢？\n显然，这是完全可行的——事实上这是有产业实践的。PyPy 是一个 Python 语言的解释器实现，它正是基于以上语言虚拟机的思路实现的：在 PyPy VM 上工作的语言有 Python, Ruby 和逻辑编程语言 Prolog 等；除此以外，泛语言高级语言虚拟机（HLLVM）GraalVM 的一个重要组件同样如此，工作在 GraalVM 上的语言包括 JavaScript, Ruby, Python, Java, R 等。\n这其实つまり 第一类二村映射 (First Futamura Projection)。\n二村映射的递归性 # 既然是放在 “高阶” 这一主题下的，我们当然要用到这一思想：正如前几段的粗体所提示的，部分求值器其实也是一个程序，它自身也能够被部分求值。\n回想一开始，解释器 的输入是 源コード 和 输入，我们将 解释器（主体） 和 源コード（主体的其中一个输入） 单独拎出来，扔进了部分求值器中，这是第一类二村映射；即是说，在第一类二村映射中，部分求值器 的输入是 解释器 和 源コード。\n我们将这一过程——即 “将 主体 和 主体的其中一个输入 单独拎出来扔进部分求值器中”—— “高阶化”，作用于自身，简单的代换就能得到，我们必要将 部分求值器（主体） 和 解释器 （主体的其中一个输入） 扔进一个部分求值器中。现在我们必要弄清楚，この “高阶过程” 得到的残差程序是什么。\n注意到，在第一类二村映射中输入只有 解释器 和 源コード。既然我们已经部分求值了前者，那么下一步自然只剩下后者了：向上一段提到的 残差程序 提供 源コード，我们就能得到 目标程序。\n向一个程序提供源コード得到另一个程序…… 听起来有点像是某个我们已经知道的东西会做的事情。是的，这つまりコンパイル。我们的この “高阶过程” 得到的残差程序其实是一个コンパイル器，而我们的この “高阶过程” 所做的，正是在生成コンパイル器，即，这一过程其实是コンパイル器的コンパイル器——如此，我们终于见到了本节概述中提到的 A 的 A 这样的结构，もし你愿意的话，或许你还できます将这称作高阶コンパイル器。\n这其实つまり 第二类二村映射 second Futamura projection。\n那么，この “高阶化” 的过程还能继续下去吗？显然如此。再继续下去，我们就能得到_コンパイル器的コンパイル器的コンパイル器_，也即第三类二村映射 third Futamura projection。再往后呢？这点就留给读者自行阅读和思考啦。\n","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/notes/system/%E4%BA%8C%E6%9D%91%E6%98%A0%E5%B0%84/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Futamura 投影（Futamura Projection）是编程语言和コンパイル技术中的一个重要概念，由日本计算机科学家 Futamura Yoshihiko 在 1971 年提出。Futamura 投影解释了如何通过对解释器进行部分求值（Partial Evaluation），将解释器转换为コンパイル器，以及进一步的可能转变。\n","title":"二村映射","type":"notes"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E9%83%A8%E5%88%86%E6%B1%82%E5%80%BC/","section":"Tags","summary":"","title":"部分求值","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/c%E8%AF%AD%E8%A8%80/","section":"Tags","summary":"","title":"C语言","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/gcc/","section":"Tags","summary":"","title":"GCC","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 コンパイルシステム（过程） # コンパイル过程是将源コード转换成可执行ファイル的几个手順的集合。每一步生成不同类型的ファイル，这些ファイル在最终的可执行程序中扮演不同的角色。以下是详细的手順以及每个阶段产生的ファイル的作用：\n1. 预处理（Preprocessing） # コマンド: gcc -E test.c -o test.i\nファイル: test.i\n作用:\n预处理器处理 #include、#define 和其他预处理指令。\n结果是一个展开的源ファイル，其中所有的宏已被展开，包含ファイル已被插入。\n2. コンパイル（Compilation） # コマンド: gcc -S test.i -o test.s\nファイル: test.s\n作用:\nコンパイル器将预处理过的源ファイル（通常是 .i ファイル，但できます直接使用 .c ファイル）转换成汇编语言コード。 生成的汇编ファイル包含目标平台的汇编指令，但尚未转换为机器コード。 3. 汇编（Assembling） # コマンド: gcc -c test.s -o test.o\nファイル: test.o\n作用:\n汇编器将汇编语言コード（.s ファイル）转换为机器コード。 生成的目标ファイル（.o ファイル）包含机器コード以及与程序相关的其他信息，如符号表和重定位信息。 目标ファイル尚未完全链接为可执行ファイル。它是できます被其他目标ファイル链接的中间ファイル。 4. 链接（Linking） # コマンド: gcc test.o -o test\nファイル: test\n作用:\n链接器将一个或多个目标ファイル（.o ファイル）和可能的库ファイル链接成一个最终的可执行ファイル。 处理符号解析和重定位。符号解析涉及到解決目标ファイル中引用的外部符号（たとえば库函数）的地址。 生成的可执行ファイルできます直接在操作システム上実行。 中间ファイルまとめ # .i ファイル（预处理输出）:\n包含展开的源コード，所有宏和包含ファイル都被处理。 用于检查预处理后的コード是否正确。 .s ファイル（汇编コード）:\n包含汇编语言的源コード，描述了机器指令。 用于確認コンパイル器生成的汇编コード。 .o ファイル（目标ファイル）:\n包含机器コード、符号表、重定位信息等。 用于最终的链接手順，是コンパイル的中间产物。 可执行ファイル（通常没有ファイル扩展名）:\n包含最终的机器コード，できます直接実行。 经过链接器处理，所有符号都被解析，重定位信息已处理。 例子まとめ # 假设 test.c 内容以下：\nvoid f() { // 空实现 } int main() { return 0; } 预处理: gcc -E test.c -o test.i コンパイル: gcc -S test.c -o test.s 汇编: gcc -c test.c -o test.o 链接: gcc test.c -o test 解释:\ntest.i 是预处理后的源コード。 test.s 是コンパイル生成的汇编コード。 test.o 是コンパイル生成的目标ファイル。 test 是最终生成的可执行ファイル，できます実行。 gcc 相关コマンド用法 # GCC（GNU Compiler Collection）是一个强大的コンパイル器，支持多种编程语言。以下是一些常用的 GCC コマンド和选项，特别是用于コンパイル C 程序以及生成汇编ファイル的相关选项：\nコンパイル C 程序 # コンパイル并链接\ngcc -o output_executable source.c -o output_executable：指定输出可执行ファイル的名称。 source.c：源ファイル。 仅コンパイル，不链接\ngcc -c source.c -c：只コンパイル源コード，==不链接==生成可执行ファイル。这会生成一个目标ファイル（source.o）。 生成汇编ファイル # 生成汇编コード gcc -S source.c -S：将源コードコンパイル为汇编コード，而不是目标ファイル。生成的汇编ファイル扩展名通常为 .s。 预处理 # 仅进行预处理 gcc -E source.c -o source.i -E：仅执行预处理，并将结果输出到指定ファイル。 显示コンパイル信息 # 显示コンパイル过程中调用的コマンド\ngcc -v source.c -v：显示コンパイル过程中的详细信息。 显示预定义宏\ngcc -dM -E - \u0026lt; /dev/null -dM：显示所有预定义的宏。 -E：执行预处理。 优化选项 # 优化コード gcc -O1 source.c -o output_executable gcc -O2 source.c -o output_executable gcc -O3 source.c -o output_executable -O1, -O2, -O3：分别表示不同级别的优化。 调试信息 # 生成调试信息 gcc -g source.c -o output_executable -g：生成调试信息，用于调试器（如 gdb）。 其他常用选项 # 定义宏\ngcc -DNAME=value source.c -o output_executable -DNAME=value：定义一个预处理宏。 包含ディレクトリ\ngcc -I/path/to/include source.c -o output_executable -I/path/to/include：指定额外的头ファイル搜索パス。 链接库\ngcc -L/path/to/lib -lname source.c -o output_executable -L/path/to/lib：指定库ファイル搜索パス。 -lname：链接名为 libname.so 或 libname.a 的库。 实例 # 假设有一个简单的 C 程序ファイル main.c，我们できます使用以下コマンド：\nコンパイル并链接生成可执行ファイル\ngcc -o my_program main.c 生成汇编ファイル\ngcc -S main.c 仅コンパイル为目标ファイル\ngcc -c main.c 进行优化コンパイル\ngcc -O2 -o my_program main.c 生成带有调试信息的可执行ファイル\ngcc -g -o my_program main.c 这些コマンド和选项できます帮助你在不同的场景下灵活使用 GCC コンパイル器。\nobjdump 和 hexdump 是两个在软件开发和分析中非常有用的コマンド行ツール。它们用于处理和確認二进制ファイル的内容，但用途和输出方式不同。下面是这两个コマンド的详细紹介及例説明。\n相关常用的コード分析ツール # objdump # objdump 是一个用于显示二进制ファイル的内容的ツール，尤其是可执行ファイル、目标ファイル和库ファイル。它できます显示反汇编コード、符号表、段信息等。objdump 常用于调试和逆向工程。\n常用选项 # -d：反汇编可执行ファイル或目标ファイル的コード。 -S：在反汇编コード中插入源コード（もし可用）。 -t：显示符号表。 -h：显示段头信息。 -x：显示所有头信息。 例 # 假设有一个简单的 C ファイル hello.c：\n#include \u0026lt;stdio.h\u0026gt; void hello() { printf(\u0026#34;Hello, World!\\n\u0026#34;); } int main() { hello(); return 0; } コンパイル成可执行ファイル hello：\ngcc -o hello hello.c 使用 objdump 確認反汇编コード：\nobjdump -d hello 输出可能以下所示（部分）：\nhello: file format elf64-x86-64 Disassembly of section .text: 0000000000001139 \u0026lt;hello\u0026gt;: 1139: 55 push %rbp 113a: 48 89 e5 mov %rsp,%rbp 113d: bf 00 00 00 00 mov $0x0,%edi 1142: e8 00 00 00 00 callq 0 \u0026lt;puts@plt\u0026gt; 1147: 90 nop 1148: 5d pop %rbp 1149: c3 retq 000000000000114a \u0026lt;main\u0026gt;: 114a: 55 push %rbp 114b: 48 89 e5 mov %rsp,%rbp 114e: e8 f0 ff ff ff callq 1139 \u0026lt;hello\u0026gt; 1153: b8 00 00 00 00 mov $0x0,%eax 1158: 5d pop %rbp 1159: c3 retq hexdump # hexdump 是一个用于確認ファイル的十六进制表示的ツール。它できます显示ファイル内容的十六进制值及其对应的 ASCII 字符。hexdump 常用于確認和分析二进制ファイル或数据ファイル的内容。\n常用选项 # -C：以十六进制和 ASCII 字符显示ファイル内容。 -n：指定读取的字节数。 -v：显示所有行（默认情况下，连续相同的行会被压缩）。 例 # 假设有一个文本ファイル example.txt，内容以下：\nHello, World! 使用 hexdump 確認其十六进制表示：\nhexdump -C example.txt 输出可能以下所示：\n00000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a |Hello, World!.| 0000000e 其中，左侧是ファイル的偏移地址，中间是ファイル内容的十六进制表示，右侧是对应的 ASCII 字符。\nまとめ # objdump：用于分析和反汇编二进制ファイル，适合调试和逆向工程。 hexdump：用于確認ファイル的十六进制表示，适合確認和分析ファイル的低级内容。 这两个ツール在不同的情况下都有很大的用处，できます帮助开发者和分析人员更好地理解和处理二进制ファイル。\nc 程序中内联汇编コード # 在 C 程序中插入汇编コード有两种主要的方法：内联汇编（Inline Assembly） 和 汇编语言ファイル（Assembly Language Files）。这两种方法允许在 C 程序中嵌入汇编コード，但它们的用法和应用场景有所不同。下面是对这两种方法的详细説明：\n1. 内联汇编（Inline Assembly） # 内联汇编允许在 C コード中直接嵌入汇编指令。这种方法适用于在 C 程序中必要插入少量汇编コード的情况。它使得在一个 C 函数中直接嵌入汇编コード成为可能。\n语法 # 在 GCC 中，内联汇编使用 __asm__ 或 asm 关键字。できます使用以下语法：\nasm(\u0026#34;assembly code\u0026#34; : output operands : input operands : clobbered registers); \u0026quot;assembly code\u0026quot;: 要插入的汇编コード。 output operands: 説明汇编コード将写入哪些 C 变量（もし有的话）。 input operands: 説明汇编コード将读取哪些 C 变量（もし有的话）。 clobbered registers: 説明汇编コード将変更哪些寄存器（もし有的话）。 例 # 下面是一个在 C コード中使用内联汇编的例：\n#include \u0026lt;stdio.h\u0026gt; int main() { int a = 10; int b; // 内联汇编代码：将 a 的值加到 b 中 asm(\u0026#34;addl %1, %0\u0026#34; : \u0026#34;=r\u0026#34; (b) : \u0026#34;r\u0026#34; (a), \u0026#34;0\u0026#34; (b)); printf(\u0026#34;The result is %d\\n\u0026#34;, b); return 0; } 解释:\naddl %1, %0 是要执行的汇编指令，将 a 的值加到 b 中。 \u0026quot;=r\u0026quot; (b) 表示 b 是一个输出操作数，使用一个通用寄存器。 \u0026quot;r\u0026quot; (a) 表示 a 是一个输入操作数，也使用一个通用寄存器。 \u0026quot;0\u0026quot; (b) 表示 b 在汇编コード中也是一个输入操作数，但也用作输出操作数，0 表示它是输出操作数的寄存器的相同位置。 2. 汇编语言ファイル（Assembly Language Files） # 汇编语言ファイル是使用汇编语言编写的独立ファイル，通常具有 .s 或 .asm 扩展名。这种方法适用于必要大量汇编コード或必要将汇编コード与 C コード分开的情况。\n使用方法 # 作成汇编语言ファイル:\n作成一个名为 example.s 的汇编ファイル，内容以下：\n.global my_function .text my_function: movl $42, %eax ret 解释:\n.global my_function 将 my_function 声明为全局符号，使其できます被其他ファイル引用。 movl $42, %eax 将值 42 加载到寄存器 %eax。 ret 返回到调用函数的地方。 在 C 程序中声明和调用汇编函数:\n#include \u0026lt;stdio.h\u0026gt; extern int my_function(); int main() { int result = my_function(); printf(\u0026#34;The result is %d\\n\u0026#34;, result); return 0; } コンパイル和链接:\nコンパイル和链接汇编语言ファイル和 C ファイル：\ngcc -c example.s -o example.o gcc -o main main.c example.o 这将生成可执行ファイル main，其中包含汇编和 C コード的混合。\nまとめ # 内联汇编：直接在 C コード中插入汇编指令，适用于少量汇编コード和必要直接与 C 变量交互的场景。 汇编语言ファイル：将汇编コード放在独立ファイル中，适用于较复杂的汇编コード或必要与多个 C ファイル分开的情况。 这两种方法各有其优点和适用场景，できます根据具体需求选择使用。\n","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/notes/tools/gcc%E4%BB%8B%E7%BB%8D/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 コンパイルシステム（过程） # コンパイル过程是将源コード转换成可执行ファイル的几个手順的集合。每一步生成不同类型的ファイル，这些ファイル在最终的可执行程序中扮演不同的角色。以下是详细的手順以及每个阶段产生的ファイル的作用：\n","title":"gcc 紹介","type":"notes"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B/","section":"Tags","summary":"","title":"编译过程","type":"tags"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/categories/%E7%BC%96%E8%AF%91%E5%99%A8/","section":"Categories","summary":"","title":"编译器","type":"categories"},{"content":"","date":"2024年9月7日","externalUrl":null,"permalink":"/ja/tags/%E9%A2%84%E5%A4%84%E7%90%86/","section":"Tags","summary":"","title":"预处理","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/tags/hamming-number/","section":"Tags","summary":"","title":"Hamming Number","type":"tags"},{"content":" hamming number 解法メモ # 問題：Codewars サイト # solutions # ***自分の最初の考え方：***ある数を素因数分解し、その素因数が 2、3、5 だけかどうかを確認すればよい。 # def is_hamming_number(num): \u0026#34;\u0026#34;\u0026#34;判断一个数是否是 Hamming 数\u0026#34;\u0026#34;\u0026#34; while num % 2 == 0: num //= 2 while num % 3 == 0: num //= 3 while num % 5 == 0: num //= 5 return num == 1 def generate_hamming_numbers(n): \u0026#34;\u0026#34;\u0026#34;生成前 n 个 Hamming 数\u0026#34;\u0026#34;\u0026#34; hamming_numbers = [] num = 1 while len(hamming_numbers) \u0026lt; n: if is_hamming_number(num): hamming_numbers.append(num) num += 1 return hamming_numbers def nth_hamming_number(n): \u0026#34;\u0026#34;\u0026#34;查询第 n 个 Hamming 数\u0026#34;\u0026#34;\u0026#34; hamming_numbers = generate_hamming_numbers(n) return hamming_numbers[-1] if n \u0026lt;= len(hamming_numbers) else None この考え方は単純明快です。ひたすら数を走査し、素因数が 2、3、5 だけの数を見つけたらリストに入れていきます。\nその後、上の solutions と自分の考え方を比べると、明らかな最適化が見えます。solutions は余計な操作をせず、直接次の Hamming number を見つけています。これができるのは、数字の規則性を簡単に分析し、少し数学的分析と数論の知識を使っているからだと思います。以下は自分なりの簡単な分析証明です。\nアルゴリズムの正しさに関する自分の証明 最後に自分が「不可能」と思ったのは、当時は思いつかなかったからです。実際には、その数が 2、3、5 の倍数であればよい、というだけでした。\n","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/notes/math/hamming-number-solutions/","section":"ノート","summary":"hamming number 解法メモ # 問題：Codewars サイト # solutions # ***自分の最初の考え方：***ある数を素因数分解し、その素因数が 2、3、5 だけかどうかを確認すればよい。 # def is_hamming_number(num): \"\"\"判断一个数是否是 Hamming 数\"\"\" while num % 2 == 0: num //= 2 while num % 3 == 0: num //= 3 while num % 5 == 0: num //= 5 return num == 1 def generate_hamming_numbers(n): \"\"\"生成前 n 个 Hamming 数\"\"\" hamming_numbers = [] num = 1 while len(hamming_numbers) \u003c n: if is_hamming_number(num): hamming_numbers.append(num) num += 1 return hamming_numbers def nth_hamming_number(n): \"\"\"查询第 n 个 Hamming 数\"\"\" hamming_numbers = generate_hamming_numbers(n) return hamming_numbers[-1] if n \u003c= len(hamming_numbers) else None この考え方は単純明快です。ひたすら数を走査し、素因数が 2、3、5 だけの数を見つけたらリストに入れていきます。\n","title":"hamming_number_solutions","type":"notes"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/categories/math/","section":"Categories","summary":"","title":"Math","type":"categories"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/tags/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/","section":"Tags","summary":"","title":"アルゴリズム","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/tags/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%B7%B4%E7%BF%92/","section":"Tags","summary":"","title":"プログラミング練習","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/tags/%E7%BC%96%E7%A8%8B%E7%BB%83%E4%B9%A0/","section":"Tags","summary":"","title":"编程练习","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/tags/%E9%A2%98%E8%A7%A3/","section":"Tags","summary":"","title":"题解","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/tags/%E8%A7%A3%E6%B3%95/","section":"Tags","summary":"","title":"解法","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/tags/%E7%AE%97%E6%B3%95/","section":"Tags","summary":"","title":"算法","type":"tags"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/notes/math/","section":"ノート","summary":"","title":"数学","type":"notes"},{"content":"","date":"2024年6月6日","externalUrl":null,"permalink":"/ja/tags/%E6%95%B0%E5%AD%A6/","section":"Tags","summary":"","title":"数学","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/ja/tags/%E3%83%99%E3%82%BA%E3%83%BC%E3%81%AE%E7%AD%89%E5%BC%8F/","section":"Tags","summary":"","title":"ベズーの等式","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/tags/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97/","section":"Tags","summary":"","title":"扩展欧几里得","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/tags/%E8%B4%9D%E7%A5%96%E5%AE%9A%E7%90%86/","section":"Tags","summary":"","title":"贝祖定理","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/ja/tags/%E6%8B%A1%E5%BC%B5%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89/","section":"Tags","summary":"","title":"拡張ユークリッド","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/tags/%E6%95%B0%E8%AE%BA/","section":"Tags","summary":"","title":"数论","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/ja/tags/%E6%95%B0%E8%AB%96/","section":"Tags","summary":"","title":"数論","type":"tags"},{"content":" #数論知識 # :raised_hands: 個人的な理解と思考のメモです。素数に関する部分は本を読むのがおすすめです。本の説明はかなり良く、細かく証明していない点もあります。特に Extened Chinese Remider Theroy の部分は個人的な思考まとめなので、参考程度にしてください。:raised_hands:\n数論 pdf #数論知識 #ベズーの等式（Bézout\u0026rsquo;s identity） #拡張ユークリッドの考え方解析： #拡張ユークリッド c++ コード #中国剰余定理（Chinese Remainder Theorem） #拡張中国剰余定理（Extened Chinese Remider Theroy） #拡張中国剰余定理コード実装： #ベズーの等式（Bézout\u0026rsquo;s identity） # ベズーの等式を使って方程式 ax + by = c の解を求める\nx = x0 + b/gcd(a, b) * t y = y0 - a/gcd(a, b) * t ベズーの等式の右辺 c を 1 にすれば、これはモジュラ逆元を求める式になります。だからこそ、拡張ユークリッドの本質はベズーの等式を使うことだと言えます。\nベズーの等式の証明\n#拡張ユークリッドの考え方解析： # 実はこの拡張ユークリッドは、本質的にはベズーの等式を使っているだけだと思います\n拡張されている点は、自分自身で検証できることです。一番有用な点は、計算過程の中でベズー係数を見つけられるため、そこからモジュラ逆元を求められることです。\nwiki を見ればだいたい分かります\nextgcd wiki 手書きメモ\n#拡張ユークリッド c++ コード # #include \u0026lt;iostream\u0026gt; using namespace std; int extgcd(int a, int b, int \u0026amp;x, int \u0026amp;y) { if (b == 0) { x = 1; y = 0; return a; } int d = extgcd(b, a % b, x, y); int t = x; x = y; y = t - a / b * y; return d; } /* 另一种写法，更接近数学表达 struct EuclidResult { int d, x, y; }; int extgcd(int a, int b) { int x_0 = 1, y_0 = 0, x_1 = 0, y_1 = 1; while (b) { int temp; int q = a / b; temp = a- q * b; a = b; b = temp; temp = x_0 - q * x_1; x_0 = x_1; x_1 = temp; temp = y_0 - q * y_1; y_0 = y_1; y_1 = temp; } return EuclidResult{a, x_0, y_0}; } */ この x と y がベズー係数であり、一組の解です。\n#中国剰余定理（Chinese Remainder Theorem） # 大まかな説明：ある数 x について、法 n1,n2,n3...nr に対する余りがそれぞれ r1,r2,r3...rn であり、n1,n2,n3...nr が互いに素なら、x の法 n1*n2*n3...*nr における解を構成できる。\nこの考え方は個別に書いておく必要があります。後の拡張中国剰余定理で使う重要な考え方だからです。さらに、ベズーの等式の考え方にも注目する必要があります。\n$$ S : \\left\\{ \\begin{array}{ll} x \\equiv r_1 \\pmod{a_1} \\\\ x \\equiv r_2 \\pmod{a_2} \\\\ % \\cdots \\\\ \\vdots \\\\ x \\equiv r_n \\pmod{a_n} \\\\ \\end{array} \\right. $$モジュラ逆元の計算には拡張ユークリッドアルゴリズムを使います。下のtipsを参照。\n$$ N = n_1 \\cdot n_2 \\cdot n_3 \\cdots n_i \\cdots n_n \\\\ 記N_i = \\frac{N}{n_i} = n_1 \\cdot n_2 \\cdots n_{i-1} \\cdot n_{i+1} \\cdots n_n \\\\ 可得 N_i 和 n_i 互质 即 gcd(N_i, n_i) = 1 \\\\ 所以 模逆元 N_i \\cdot t_i \\equiv 1 \\pmod{n_i} \\\\ 即 a_i \\cdot N_i \\cdot t_i \\equiv a_i \\pmod{n_i} \\\\ 可得：当j \\neq i时，a_j \\cdot N_j \\cdot t_j \\equiv 0 \\pmod{n_i} \\text{因为}N_j包含了n_i \\\\ $$ $$ \\begin{align} x\u0026=a_1 \\cdot N_1 \\cdot t_1 + a_2 \\cdot N_2 \\cdot t_2 + \\cdots + a_n \\cdot N_n \\cdot t_n \\\\ \u0026= a_i \\cdot N_i \\cdot t_i + \\sum_{j \\neq i} a_j \\cdot N_j \\cdot t_j \\\\ \u0026\\equiv a_i \\pmod{n_i} \\end{align} $$ $$ 所以可以得到：x的一个解为：a_1 \\cdot t_1 \\cdot N_1 + a_2 \\cdot t_2 \\cdot N_2 + \\cdots + a_n \\cdot t_n \\cdot N_n \\\\ 记x_1 and x_2 为两个解，可得：\\\\ x_1 \\equiv a_i \\pmod{n_i} \\\\ x_2 \\equiv a_i \\pmod{n_i} \\\\ x_1 - x_2 \\equiv 0 \\pmod{n_i} \\\\ 所以可得：n_i | x_1 - x_2 \\\\ 因为任何一个i都成立，所以可得：n_1 \\cdot n_2 \\cdots n_i \\cdots n_n | x_1 - x_2 \\\\ 即：N | x_1 - x_2 \\\\ =\u003e x_2 = x_1 + kN \\\\ 则x_2 和 x_1 差kN 所以最终的解为：x=a_1 \\cdot t_1 \\cdot N_1 + a_2 \\cdot t_2 \\cdot N_2 + \\cdots + a_n \\cdot t_n \\cdot N_n + kN $$中国剰余定理\n#拡張中国剰余定理（Extened Chinese Remider Theroy） # 分析：中国剰余定理の前提は、法が互いに素であることです。では法が互いに素でない場合はどうするか。参考になる考え方は二つあります。一つ目は、この合同方程式系を直接解くことです。その時、ベズーの等式と中国剰余定理の考え方を使います。二つ目は、法を互いに素な形へ変換し、中国剰余定理に帰着して解を求めることです。\n拡張中国剰余定理の考え方\n拡張中国剰余定理を中国剰余定理へ変換する考え方\n#拡張中国剰余定理コード実装： # int exCRT(int n, int *a, int *m) { int M = 1; for (int i = 0; i \u0026lt; n; i++) M *= m[i]; int ans = 0; for (int i = 0; i \u0026lt; n; i++) { int Mi = M / m[i]; ans = (ans + a[i] * Mi % M * mod_inv(Mi, m[i])) % M; } return (M + ans % M) % M; } ","date":"2024年5月15日","externalUrl":null,"permalink":"/ja/notes/math/%E6%95%B0%E8%AE%BA%E7%9F%A5%E8%AF%86/","section":"ノート","summary":"#数論知識 # :raised_hands: 個人的な理解と思考のメモです。素数に関する部分は本を読むのがおすすめです。本の説明はかなり良く、細かく証明していない点もあります。特に Extened Chinese Remider Theroy の部分は個人的な思考まとめなので、参考程度にしてください。:raised_hands:\n","title":"数論知識","type":"notes"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/ja/tags/%E4%B8%AD%E5%9B%BD%E5%89%B0%E4%BD%99%E5%AE%9A%E7%90%86/","section":"Tags","summary":"","title":"中国剰余定理","type":"tags"},{"content":"","date":"2024年5月15日","externalUrl":null,"permalink":"/tags/%E4%B8%AD%E5%9B%BD%E5%89%A9%E4%BD%99%E5%AE%9A%E7%90%86/","section":"Tags","summary":"","title":"中国剩余定理","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Divide-and-Conquer Method Share # \\section{Substitution Method}\n1. 阐释 # 代换法的关键在于利用数学归纳法。まず，要猜测一个大致的上界，并结合数学归纳法进行证明。その後，验证基本条件，确保递归满足この上界。若无法准确猜测界限，可能必要一个一个试着证明，直到达到比较准确的界限为止。\n2. 例子 # $$ T(n) = 2T\\left(\\frac{n}{2}\\right) + \\Theta(n) $$ 3. 解释 # この递归表达式明显属于归并排序，时间复杂度为 $\\mathcal{O}(n \\log n)$。できます尝试用 $c n \\log n$ 进行证明。まず，假设小于 n 的情况符合この式子，その後证明当 n 时也符合。\n$$ \\begin{align} T(n) \u0026= 2T\\left(\\frac{n}{2}\\right) + \\Theta(n) \\\\ \u0026= 2 \\cdot c \\cdot \\left(\\frac{n}{2}\\right) \\cdot \\log\\left(\\frac{n}{2}\\right) + \\Theta(n) \u0026\u0026 \\text{代入猜想} \\\\ \u0026= c n \\cdot (\\log n - \\log 2) + \\Theta(n) \u0026\u0026 \\text{展开} \\\\ \u0026= c n \\cdot \\log n - c n \\cdot \\log 2 + \\Theta(n) \\\\ \u0026\\leq c n \\cdot \\log n \u0026\u0026 \\text{得到不等式} \\end{align} $$一般 n 和常数 c 都要很大，通常都趋近于无穷大。この分析表明 n 必须大于 1，なぜなら有对数运算。そのため，我们必要验证 n=2 或 n=3 之类的基本情况。具体分析过程できます参考《アルゴリズム导论》。\n4. 注意 # 在代换法中，连续使用渐进符号 $\\mathcal{O}$ 会导致忽略常数的影响。在数学递归论证中，应避免使用渐进符号，なぜなら它们可能会导致论证不严谨。此外，代换法中必须有余项，尤其是负的余项。这是なぜなら渐进符号可能会忽略常数的影响。\n例：若 n 为 $\\Theta(1)$，まず 1=$\\Theta(1)$。假设小于 n 的情况都符合この式子，则 n-1=$\\Theta(1)$。そのため，n = (n-1) + 1 = $\\Theta(1)$。这种情况是不行的，なぜなら它忽略了常数的影响。\n\\section{Recursion-Tree Method}\n递归树方法是分析其他递归問題的有力ツール。您できます参考此递归树的图片了解更多。\n\\section{Master Method}\n根据 PDF 所讲内容： Case 1: もし存在常数 $\\epsilon \u003e 0$，使得 $f(n)=O(n^{log_ba-\\epsilon})$，则 $T(n)=\\Theta(n^{log_ba})$。 Case 2: もし存在常数 k $\\geq 0$，使得 $f(n)=\\Theta(n^{log_ba} \\cdot lg^k n)$，则 $T(n)=\\Theta(n^{log_ba} \\cdot lg^{k+1}n)$。 Case 3: もし存在常数 $\\epsilon \u003e 0$，使得 $f(n)=\\Omega(n^{log_ba+\\epsilon})$，并且 f(n) 满足正则性条件 $ af(n/b) \\leq cf(n) $ 对于某个常数 $c \u003c 1$ 且足够大的 n，则 $T(n) = \\Theta(f(n))$。 主要思路：比较 f(n) 和 $n^{log_b(a)}$ 即驱动函数和分水岭函数，即 $T(n)=aT(n/b)+f(n)$ 表达式，つまり要比较 f(n) 和 $n^{log_b(a)}$。 # 为什么会有この $n^{log_b(a)}$? # なぜなら前面的 $T(n)$ 由递归树分析得到，そのため直接比较最高项。\n1. case1: 对应数学符号是 \u0026gt;，即分水岭函数 $n^{log_b(a)}$ \u0026gt; 驱动函数 f(n)。 # $f(n)=O(n^{log_b(a)-\\epsilon})$，存在常数 $\\epsilon \u003e 0$。 那么 $T(n)=\\Theta(n^{log_b(a)})$。 2. case2: 对应数学符号是 =，即分水岭函数 $n^{log_b(a)}$ = 驱动函数 f(n)。 # $f(n)=\\Theta(n^{log_b(a)}*lg^k(n))$，k 是非负数，即 k $\\geq$ 0。 $T(n)=\\Theta(n^{log_b(a)}*lg^{k+1}(n))$。 3. case3: 对应数学符号是 \u0026lt;，即分水岭函数 $n^{log_b(a)}$ \u0026lt; 驱动函数 f(n)。 # $f(n)=\\Omega(n^{log_b(a)+\\epsilon})$，存在常数 $\\epsilon \u003e 0$。 若 $af(n/b)\\leq(1-\\epsilon')*f(n)$，其中 $\\epsilon' \u003e 0$，可判断 f(n) 是递减的，并且下一层是上一层的常数倍。そのため，顶层是最大的，できます简化得出 $\\Theta(f(n))$。 $T(n)=\\Theta(f(n))$。 \\section{Master Method Prove}\nLemma Definition # 令 a \u0026gt; 0 和 b \u0026gt; 1 为常数，且 f(n/b) 为在实数范围内定义的函数 $n\\geq 1$。那么递归：\n\\[ T(n) = \\begin{cases} \\Theta(1), \u0026 \\text{if } 0\\leq n\u003c1 \\\\ aT(n/b)+f(n), \u0026 \\text{if } n \\geq 1 \\end{cases} \\]其解为 $T(n) =\\Theta(n^{\\log_b a}) + \\sum\\limits_{j=0}^{\\lfloor{log_bn}\\rfloor}a^j f(n/b^j)$。\n1. case 1 prove # f(n)=O($n^{log_b(a)}$)\n$$ \\begin{align} g(n) \u0026= \\sum_{j=0}^{\\lfloor{log_b{n}}\\rfloor}a^j*f\\left(\\frac{n}{b^j}\\right) \\\\ \u0026= \\sum_{j=0}^{\\lfloor{log_b{n}}\\rfloor}a^j*O\\left(\\left(\\frac{n}{b^j}\\right)^{log_b(a)-\\epsilon}\\right) \\\\ \u0026= O\\left(n^{log_b(a)-\\epsilon}\\sum_{j=0}^{\\lfloor{log_b{n}}\\rfloor}\\frac{a^j}{(b^j)^{log_b(a)-\\epsilon}}\\right) \\\\ \u0026= O\\left(n^{log_b(a)-\\epsilon}\\sum_{j=0}^{\\lfloor{log_b{n}}\\rfloor}(b^\\epsilon)^j\\right) \\\\ \u0026 \\leq O\\left(n^{log_b(a)-\\epsilon}*\\frac{n^\\epsilon*b^\\epsilon-1}{b^\\epsilon-1}\\right) \\\\ \u0026= O\\left(n^{log_b(a)}\\right) \\end{align} $$ 2. case 2 prove # f(n)=$\\Theta(n^{log_b(a)}*lg^k(n))$\n$$ \\begin{align} \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\lg^k n - {j \\cdot \\log_b b \\cdot \\lg^k n}\\right) \\tag{eq:1} \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\lg^k n\\right) \\quad (\\text{なぜなら } b \u003e 1) \\end{align} $$将上式代入公式(\\ref{eq:1})并反复应用习题3-5(c)，得\n$$ \\begin{align} g(n)\u0026= \\Theta\\left(\\sum_{j=0}^{\\lfloor \\log_b n\\rfloor} a^j \\left(\\frac{n}{b^j}\\right)^{\\log_b a} \\cdot \\lg^k \\left(\\frac{n}{b^j}\\right)\\right) \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\sum_{j=0}^{\\lfloor \\log_b n\\rfloor} \\frac{a^j}{(b^j)^{\\log_b a}} \\cdot \\lg^k \\left(\\frac{n}{b^j}\\right)\\right) \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\sum_{j=0}^{\\lfloor \\log_b n\\rfloor} \\left(\\frac{a}{b^{\\log_b a}}\\right)^j \\cdot \\lg^k \\left(\\frac{n}{b^j}\\right)\\right) \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\sum_{j=0}^{\\lfloor \\log_b n\\rfloor} \\left(\\frac{a}{b^{\\log_b a}}\\right)^j \\cdot \\lg^k n\\right) \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\sum_{j=0}^{\\lfloor \\log_b n\\rfloor} \\left(\\frac{a}{b^{\\log_b a}}\\right)^j\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\frac{\\left(\\frac{a}{b^{\\log_b a}}\\right)^{\\lfloor \\log_b n\\rfloor + 1} - 1}{\\frac{a}{b^{\\log_b a}} - 1}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\frac{\\left(\\frac{a}{b^{\\log_b a}}\\right)^{\\log_b n} \\cdot \\frac{a}{b^{\\log_b a}} - 1}{\\frac{a}{b^{\\log_b a}} - 1}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\frac{a^{\\log_b n} - b^{\\log_b a}}{a - b}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\frac{a^{\\log_b n}}{a - b}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(n^{\\log_b a} \\cdot \\frac{n^{\\log_b a}}{a - b}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(\\frac{n^{\\log_b a + 1}}{a - b}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(\\frac{n^{\\log_b a} \\cdot n}{a - b}\\right) \\cdot \\lg^k n \\\\ \u0026= \\Theta\\left(\\frac{n^{\\log_b a} \\cdot n}{a - b} \\cdot \\lg^k n\\right) \\\\ \u0026= \\Theta\\left(\\frac{n^{\\log_b a} \\cdot n \\cdot \\lg^k n}{a - b}\\right) \\end{align} $$","date":"2024年4月30日","externalUrl":null,"permalink":"/ja/notes/tools/latex/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 Divide-and-Conquer Method Share # \\section{Substitution Method}\n","title":"LaTeX","type":"notes"},{"content":"","date":"2024年4月30日","externalUrl":null,"permalink":"/ja/tags/latex/","section":"Tags","summary":"","title":"LaTeX","type":"tags"},{"content":"","date":"2024年4月30日","externalUrl":null,"permalink":"/ja/categories/technology/","section":"Categories","summary":"","title":"Technology","type":"categories"},{"content":"","date":"2024年4月30日","externalUrl":null,"permalink":"/ja/tags/%E6%95%B0%E5%AD%A6%E5%BD%92%E7%BA%B3%E6%B3%95/","section":"Tags","summary":"","title":"数学归纳法","type":"tags"},{"content":"","date":"2024年4月30日","externalUrl":null,"permalink":"/ja/tags/%E4%BB%A3%E6%8D%A2%E6%B3%95/","section":"Tags","summary":"","title":"代换法","type":"tags"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/devops/","section":"Tags","summary":"","title":"DevOps","type":"tags"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 注意这些全都要根据自己所用システム是什么，ubuntu和debian这些可能都有些许出入，架构問題等 # 更新，インストール依赖项 # sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common\n追加docker官方gpg密钥 # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n根据自己来设定，なぜならこの可能debian已经不用apt-key了，已经改用gpg这些了 # 追加dockerリポジトリ # sudo add-apt-repository \u0026ldquo;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\u0026rdquo;\nインストールdocker-ce # sudo apt update sudo apt install docker-ce\n验证是否インストール # sudo systemctl status docker\n作成gitlabディレクトリ来存放数据这些 # sudo mkdir -p /srv/gitlab/config /srv/gitlab/data /srv/gitlab/logs\n実行容器 # sudo docker run \u0026ndash;detach \u0026ndash;hostname ubuntu \u0026ndash;publish 443:443 \u0026ndash;publish 80:80 \u0026ndash;publish 22:22 \u0026ndash;name gitlab \u0026ndash;restart always \u0026ndash;volume /srv/gitlab/config:/etc/gitlab \u0026ndash;volume /srv/gitlab/logs:/var/log/gitlab \u0026ndash;volume /srv/gitlab/data:/var/opt/gitlab \u0026ndash;env GITLAB_ROOT_PASSWORD=LJB626901 yrzr/gitlab-ce-arm64v8:latest\n最後に一行つまり要根据自己架构来获取镜像了，arm架构和amd都不一样的，Your hostname要改 # 有时要注意这些端口是否被占用 # netstat -tuln | grep 80\n查询所有的镜像 # docker ps -a\n此时会看到一个 gitlab-ce 的容器是没有启动的状态 # 削除 gitlab-ce 容器 # docker rm gitlab-ce\n再次実行时，削除开放的 22 端口 # docker run \u0026ndash;detach \u0026ndash;restart always \u0026ndash;name gitlab \u0026ndash;privileged \u0026ndash;memory 4096M \u0026ndash;publish 80:80 \u0026ndash;publish 443:443 \u0026ndash;hostname ubuntu \u0026ndash;env GITLAB_OMNIBUS_CONFIG=\u0026quot; nginx[\u0026lsquo;redirect_http_to_https\u0026rsquo;] = true; \u0026ldquo;\n\u0026ndash;volume /srv/gitlab/config:/etc/gitlab \u0026ndash;volume /srv/gitlab/logs:/var/log/gitlab \u0026ndash;volume /srv/gitlab/data:/var/opt/gitlab \u0026ndash;env GITLAB_ROOT_PASSWORD=LJB626901 yrzr/gitlab-ce-arm64v8:latest\n","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/notes/tools/docker-gitlab-md/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 注意这些全都要根据自己所用システム是什么，ubuntu和debian这些可能都有些许出入，架构問題等 # 更新，インストール依赖项 # sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common\n","title":"Docker GitLab メモ","type":"notes"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/gitlab/","section":"Tags","summary":"","title":"GitLab","type":"tags"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/%E9%83%A8%E7%BD%B2/","section":"Tags","summary":"","title":"部署","type":"tags"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/%E5%AE%B9%E5%99%A8/","section":"Tags","summary":"","title":"容器","type":"tags"},{"content":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 docker learn # table of contents # docker learn table of contents 虚拟机和docker docker和容器 docker讲解 docker_desktop紹介 虚拟机和docker # 虚拟机和容器都是一种虚拟化技术，都是能实现一个操作システム上実行一些别的システム，実行一些インストール包什么的\n虚拟机和docker的区别：\n虚拟机是在主机操作システム上借助vwmare这些实现利用ローカル的硬件设施完成将ローカルサーバー拆分为逻辑サーバー，以此来实现できます実行多个システム。但是，このつまり会占用到很多ローカル硬件设施，会导致一些资源利用問題，比如：本来，我就只是想用一些软件包就行的，但非要インストールosシステム才行等。而且，虚拟机得启动缓慢，性能不是很好。\ndockerつまり一个容器化平台，できます实现通过“鲸鱼”运载“集装箱”，以此我只是必要インストール镜像就できます利用到我必要的容器即软件包等东西。占用的资源少，启动快，并且相比虚拟机できますインストール很多个，只要看你想インストール什么镜像，用到什么容器即可。\n图片连接解释\ndocker和容器 # 容器也是一种虚拟化技术，从上面的描述和比较就できます知道。而dockerつまり一种使用到容器虚拟化技术的一个平台，そのためdockerつまり容器化平台。\nこの容器化平台つまり有了很多功能和设置，使得我们更好利用到この虚拟化技术，而且其实このつまり图形化界面，你直接用コマンド行インストールdocker也行的。\ndocker讲解 # docker包含镜像，容器等概念。\n镜像つまり从dockerhub上下载的，你也できます自己コンパイル吧，应该。このdockerhubつまり类似github的东西，这里有一些大佬弄出来的镜像。他相当于c++的类，この镜像是自定义了一些东西。\n容器つまり我们使用dockerコマンド弄了出来的，その後是通过镜像この类弄出来的一个实例，他是一个独立的，轻量级的可执行软件包，包含：コード，环境，システムツール等\n图片链接解释\ndocker_desktop紹介 # docker desktop里的container是指容器，つまり镜像的一个实例つまり你自己的一个东西了\nimageつまり镜像，つまり你自己从docker hub上下载下来，用于你自己搞东西的一个模板\nbuildsつまり通过使用Docker Desktop中的Build功能，你できます方便地在ローカル开发环境中构建和测试Docker镜像，その後できます将这些镜像推送到Docker Hub或者其他Dockerリポジトリ中，以便在其他地方部署和使用。\nvolumesつまり你本来用docker搞东西，这些ファイル什么的，つまり一个类似虚拟化的东西，保存时间不久的，そのため当你想保存的时候，你要将其放到ローカル主机的ディスク上，そのため你就要用到volume了，将其弄成卷放到ローカル上。\n很好的视频讲解\n","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/notes/tools/docker/","section":"ノート","summary":" この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。 docker learn # table of contents # docker learn table of contents 虚拟机和docker docker和容器 docker讲解 docker_desktop紹介 虚拟机和docker # 虚拟机和容器都是一种虚拟化技术，都是能实现一个操作システム上実行一些别的システム，実行一些インストール包什么的\n","title":"Docker","type":"notes"},{"content":"","date":"2024年4月28日","externalUrl":null,"permalink":"/ja/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/","section":"Tags","summary":"","title":"虚拟化","type":"tags"}]