Compare commits

...

6 Commits

Author SHA1 Message Date
f956786a44 vault backup: 2026-03-08 11:38:01 2026-03-08 11:38:01 +08:00
16ae667e2b vault backup: 2026-03-08 11:33:00 2026-03-08 11:33:00 +08:00
ec78ea8752 vault backup: 2026-03-08 11:27:59 2026-03-08 11:27:59 +08:00
fabdaaee1f docs: 优化Java NIO文档图解,使用Excalidraw可视化
- 将ASCII文字图替换为专业的Excalidraw图表
- 新增4个可视化图表:三大核心组件架构、Selector多路复用模型、Buffer核心属性、零拷贝原理对比
- 图表使用配色方案区分不同组件(蓝色-Channel, 绿色-Buffer, 橙色-Selector)
- 在Obsidian中可通过![[...]]语法直接嵌入查看
2026-03-08 11:25:54 +08:00
932dc8844d vault backup: 2026-03-08 11:22:59 2026-03-08 11:22:59 +08:00
34a440b064 vault backup: 2026-03-08 11:12:59 2026-03-08 11:12:59 +08:00
18 changed files with 12754 additions and 110 deletions

View File

@@ -1,10 +1,6 @@
[ [
"obsidian-git", "obsidian-git",
"dataview", "obsidian-excalidraw-plugin",
"kanban", "advanced-canvas",
"calendar", "mermaid-tools"
"heatmap",
"obsidian-tasks-plugin",
"obsidian-chart",
"obsidian-advanced-slides"
] ]

7548
.obsidian/plugins/advanced-canvas/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "advanced-canvas",
"name": "Advanced Canvas",
"version": "6.0.0",
"minAppVersion": "1.1.0",
"description": "Supercharge your canvas experience! Create presentations, flowcharts and more!",
"author": "Developer-Mike",
"authorUrl": "https://github.com/Developer-Mike",
"fundingUrl": "https://ko-fi.com/X8X27IA08",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,508 @@
/* src/styles.scss */
.properties-field > .setting-item-info {
flex: 0;
margin: 0;
padding: var(--size-4-1) var(--size-4-2);
border: var(--input-border-width) solid var(--background-modifier-border);
border-radius: var(--input-radius) 0 0 var(--input-radius);
}
.properties-field > .setting-item-control > input {
width: 100%;
border-radius: 0 var(--input-radius) var(--input-radius) 0;
}
.ac-settings-heading:not(:first-child) {
margin-top: var(--size-4-10) !important;
}
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) {
border-bottom-color: var(--background-modifier-border-hover);
}
.ac-settings-heading .setting-item-description {
margin-inline-end: 20px;
}
.settings-header-children {
transform-origin: top center;
transform: scaleY(1);
transition: transform 0.2s ease-in-out;
}
.settings-header-children details {
flex-direction: column;
align-items: initial;
}
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) + .settings-header-children {
opacity: 0.5;
pointer-events: none;
height: 0;
transform: scaleY(0);
}
details.setting-item[open] > summary {
margin-bottom: 0.75em;
}
details.setting-item > *:not(summary) {
padding-left: 1em;
border-left: 1px solid var(--color-accent);
}
.kofi-banner {
position: relative;
display: flex;
flex-direction: column;
padding: var(--size-4-3);
background-color: var(--background-secondary);
border: 1px solid var(--divider-color);
border-radius: var(--radius-s);
}
.kofi-banner h1 {
margin: 0;
margin-bottom: 10px;
font-size: var(--font-ui-large);
font-weight: 600;
}
.kofi-banner .progress-container {
display: flex;
flex-direction: row;
align-items: center;
justify-items: center;
}
.kofi-banner .progress-container progress {
background: transparent;
}
.kofi-banner .progress-container progress::-webkit-progress-bar {
background-color: var(--background-modifier-border);
border-radius: var(--input-radius);
}
.kofi-banner .progress-container progress::-webkit-progress-value {
background-color: var(--color-accent);
border-radius: var(--input-radius);
}
.kofi-banner .progress-container .hourly-rate {
margin-left: 10px;
font-weight: 600;
}
.kofi-banner .ac-kofi-button {
align-self: flex-end;
width: min-content;
height: min-content;
line-height: 0;
}
.kofi-banner .ac-kofi-button img {
min-width: 100px;
width: 25%;
max-width: 200px;
}
.canvas-wrapper > .document-search-container {
transform: translateZ(0);
margin: 0;
}
.canvas-wrapper:not(.mod-readonly) .show-while-readonly {
display: none;
}
.canvas-control-item[data-toggled=true] {
background-color: var(--color-accent);
}
.canvas-control-item[data-toggled=true] svg {
stroke: var(--text-on-accent);
}
.reactive-node,
.canvas-node[data-shape=database],
.canvas-node[data-shape=document],
.canvas-node[data-shape=predefined-process],
.canvas-node[data-shape=diamond] {
--border-color: rgb(var(--canvas-color));
--border-width: 3px;
--box-shadow: none;
}
.reactive-node.is-focused,
.is-focused.canvas-node[data-shape=database],
.is-focused.canvas-node[data-shape=document],
.is-focused.canvas-node[data-shape=predefined-process],
.is-focused.canvas-node[data-shape=diamond],
.reactive-node.is-selected,
.is-selected.canvas-node[data-shape=database],
.is-selected.canvas-node[data-shape=document],
.is-selected.canvas-node[data-shape=predefined-process],
.is-selected.canvas-node[data-shape=diamond] {
--border-color: var(--color-accent);
--border-width: 5px;
--box-shadow: var(--shadow-border-accent);
}
.reactive-node.is-themed,
.is-themed.canvas-node[data-shape=database],
.is-themed.canvas-node[data-shape=document],
.is-themed.canvas-node[data-shape=predefined-process],
.is-themed.canvas-node[data-shape=diamond] {
--border-color: rgba(var(--canvas-color), 0.7);
}
.reactive-node.is-themed.is-focused,
.is-themed.is-focused.canvas-node[data-shape=database],
.is-themed.is-focused.canvas-node[data-shape=document],
.is-themed.is-focused.canvas-node[data-shape=predefined-process],
.is-themed.is-focused.canvas-node[data-shape=diamond],
.reactive-node.is-themed.is-selected,
.is-themed.is-selected.canvas-node[data-shape=database],
.is-themed.is-selected.canvas-node[data-shape=document],
.is-themed.is-selected.canvas-node[data-shape=predefined-process],
.is-themed.is-selected.canvas-node[data-shape=diamond] {
--border-color: rgb(var(--canvas-color));
--box-shadow: var(--shadow-border-themed);
}
.canvas-node[data-text-align=center] .markdown-preview-view {
scrollbar-gutter: auto;
}
.canvas-node[data-text-align=center] .markdown-preview-view .markdown-preview-section {
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
vertical-align: middle;
}
.canvas-node[data-text-align=right] {
text-align: right;
}
.canvas-node[data-shape] .canvas-node-container .markdown-preview-view.markdown-rendered {
transform: unset;
}
.canvas-node[data-shape=pill] .canvas-node-container {
border-radius: 5000px;
}
.canvas-node[data-shape=diamond] {
}
.canvas-node[data-shape=diamond].is-focused,
.canvas-node[data-shape=diamond].is-selected {
border-radius: var(--radius-m);
outline: 2px solid var(--color-accent);
outline-offset: 5px;
}
.canvas-node[data-shape=diamond] .canvas-node-container {
border: none;
box-shadow: none !important;
}
.canvas-node[data-shape=diamond] .canvas-node-container:not(:has(.embed-iframe)) {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
}
.canvas-node[data-shape=diamond] .canvas-node-container .canvas-node-placeholder::after {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
}
.canvas-node[data-shape=diamond]::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
content: "";
position: absolute;
top: calc(var(--border-width) * -1);
left: calc(var(--border-width) * -1);
width: calc(100% + var(--border-width) * 2);
height: calc(100% + var(--border-width) * 2);
background-color: var(--border-color);
}
.canvas-node[data-shape=parallelogram] .canvas-node-container {
transform: skewX(-20deg);
backface-visibility: hidden;
}
.canvas-node[data-shape=parallelogram] .canvas-node-container .canvas-node-content .markdown-embed-content {
transform: skewX(20deg);
}
.canvas-node[data-shape=circle] .canvas-node-container {
border-radius: 50%;
}
.canvas-node[data-shape=circle] .canvas-node-container .markdown-preview-view {
overflow-y: initial;
}
.canvas-node[data-shape=predefined-process] .canvas-node-container .canvas-node-content {
padding: 0 10px;
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
content: "";
z-index: 1;
position: absolute;
top: 0;
width: 0;
height: 100%;
border-left: var(--border-width) solid var(--border-color);
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::before {
left: calc(10px - var(--border-width));
}
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
right: calc(10px - var(--border-width));
}
.canvas-node[data-shape=document] {
--border-width: 2.5px;
filter: drop-shadow(0 var(--border-width) 0 var(--border-color)) drop-shadow(0 calc(var(--border-width) * -1) 0 var(--border-color));
}
.canvas-node[data-shape=document] .canvas-node-container {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: 100%;
-webkit-mask-size: 100%;
border: var(--border-width) solid var(--border-color);
border-top: none;
border-bottom: none;
}
.canvas-node[data-shape=document].is-focused,
.canvas-node[data-shape=document].is-selected {
--border-width: 4px;
}
.canvas-node[data-shape=database] {
}
.canvas-node[data-shape=database] .canvas-node-container {
border: var(--border-width) solid var(--border-color);
border-bottom: 0;
border-top: 0;
border-radius: 0;
box-shadow: none !important;
}
.canvas-node[data-shape=database] .canvas-node-container .canvas-node-placeholder {
transform: translateY(25px);
}
.canvas-node[data-shape=database]::before,
.canvas-node[data-shape=database]::after {
content: "";
position: absolute;
left: 0;
box-sizing: border-box;
width: 100%;
height: 50px;
border-radius: 50%;
border: var(--border-width) solid var(--border-color);
background-color: var(--background-primary);
}
.canvas-node[data-shape=database]::after {
top: -25px;
}
.canvas-node[data-shape=database]::before {
bottom: -25px;
}
.canvas-node[data-shape=database].is-themed .canvas-node-content {
background-color: transparent;
}
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe)) .canvas-node-container,
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::after,
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::before {
box-shadow: inset 0 0 0 1000px rgba(var(--canvas-color), 0.07) !important;
}
.canvas-node[data-shape=database] .canvas-node-content:not(:has(.embed-iframe)) {
transform: translateY(20px);
}
.canvas-node[data-shape=database]:has(.embed-iframe)::after {
z-index: -1;
}
.canvas-node[data-border=dashed] .canvas-node-container {
box-shadow: none;
border-style: dashed;
}
.canvas-node[data-border=dotted] .canvas-node-container {
box-shadow: none;
border-style: dotted;
}
.canvas-node[data-border=invisible] {
box-shadow: none;
}
.canvas-node[data-border=invisible]:not(.is-focused):not(.is-selected) .canvas-node-container {
border-color: transparent !important;
}
.canvas-node[data-border=invisible] .canvas-node-label {
display: none;
}
.canvas-node[data-border=invisible] .canvas-node-container {
background-color: transparent;
box-shadow: none;
}
.canvas-node[data-border][data-shape=predefined-process] {
--border-width: 2px;
}
.canvas-node[data-border][data-shape=predefined-process] .is-focused,
.canvas-node[data-border][data-shape=predefined-process] .is-selected {
--border-width: 2px;
}
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::after {
border-left: var(--border-width) dashed var(--border-color);
}
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::before,
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::after {
border-left: var(--border-width) dotted var(--border-color);
}
.canvas-node[data-border][data-shape=document] .canvas-node-container {
border-top: none;
border-bottom: none;
}
.canvas-edges path[data-path=dotted] {
stroke-dasharray: calc(3px * var(--zoom-multiplier));
}
.canvas-edges path[data-path=short-dashed] {
stroke-dasharray: 9px;
}
.canvas-edges path[data-path=long-dashed] {
stroke-dasharray: 18px;
}
.canvas-edges [data-arrow=triangle-outline] polygon,
.canvas-edges [data-arrow=diamond-outline] polygon,
.canvas-edges [data-arrow=circle-outline] polygon {
fill: var(--canvas-background);
stroke: rgb(var(--canvas-color));
stroke-width: calc(3px * var(--zoom-multiplier));
}
.canvas-edges [data-arrow=thin-triangle] polygon {
fill: transparent;
stroke: rgb(var(--canvas-color));
stroke-width: calc(4px * var(--zoom-multiplier));
}
.canvas.is-exporting {
--zoom-multiplier: 1;
}
.canvas.is-exporting * {
pointer-events: none !important;
transition: none !important;
}
.canvas.is-exporting .collapse-button {
display: none;
}
.canvas.is-exporting #watermark-ac {
z-index: 9999999;
position: absolute;
}
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas.is-exporting .canvas-node .canvas-group-label {
left: 0;
}
.progress-bar-modal-ac {
margin-top: 0.75em;
}
.progress-bar-modal-ac.error .setting-progress-bar {
color: var(--color-error);
}
.canvas-wrapper[data-disable-font-size-relative-to-zoom=true] {
--zoom-multiplier: 1 !important;
}
.canvas-wrapper.mod-readonly .canvas-controls .canvas-control-group:nth-child(3),
.canvas-wrapper.mod-readonly .canvas-card-menu {
display: none;
}
.canvas-wrapper.mod-readonly[data-hide-background-grid-when-in-readonly=true] .canvas-background {
visibility: hidden;
}
.collapse-button {
position: absolute;
left: 0;
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
padding: var(--size-4-1) var(--size-4-2);
transform-origin: bottom left;
transform: translate(0, -100%) scale(var(--zoom-multiplier));
border-radius: var(--radius-s);
color: var(--text-muted);
background-color: rgba(var(--canvas-color), 0.1);
font-size: 1.5em;
line-height: 1;
pointer-events: initial;
cursor: pointer;
transition: transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
}
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas-node .canvas-group-label {
left: calc(40px * var(--zoom-multiplier));
}
.canvas-node[data-collapsed] .canvas-node-container {
display: none;
}
.canvas-node[data-collapsed] .canvas-group-label {
max-width: initial;
}
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container {
display: block;
opacity: 0.5;
border-style: dashed;
}
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container .canvas-node-content {
background-color: transparent;
}
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer {
pointer-events: none;
cursor: inherit;
}
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer .canvas-node-connection-point {
display: none;
pointer-events: none;
}
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group)::after {
all: unset;
content: "";
z-index: 100;
position: absolute;
top: 50%;
left: 50%;
width: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
height: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
transform: translate(-50%, -50%);
border-radius: var(--radius-m);
outline: calc(4px * var(--zoom-multiplier)) dashed hsla(var(--color-accent-hsl), 0.5);
}
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group).hovering-floating-edge-zone::after {
outline-color: var(--color-accent);
outline-style: solid;
background-color: hsla(var(--color-accent-hsl), 0.1);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-node:not(.is-focused) {
filter: blur(5px);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-edges > g:not(.is-focused) {
filter: blur(5px);
}
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-path-label-wrapper > .canvas-path-label:not(.is-focused) {
filter: blur(5px);
}
.canvas-wrapper.presentation-mode .canvas-controls {
visibility: hidden;
}
.canvas-wrapper.presentation-mode .canvas-card-menu {
visibility: hidden;
}
.canvas-wrapper:not(.presentation-mode) .canvas-node[data-is-start-node=true]::before {
content: "Start";
position: absolute;
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
right: 0;
transform: translate(0, -100%) scale(var(--zoom-multiplier));
transform-origin: bottom right;
max-width: calc(100% / var(--zoom-multiplier));
padding: var(--size-4-1) var(--size-4-2);
font-size: 1em;
border-radius: var(--radius-s);
color: var(--color-green);
background-color: rgba(var(--color-green-rgb), 0.1);
}
.canvas-node[data-is-portal-loaded=true] {
pointer-events: all;
}
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) {
pointer-events: none;
}
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) .canvas-node-label {
pointer-events: all;
}
.canvas-node[data-is-portal-loaded=true] .canvas-node-container {
background-color: transparent;
border-style: dashed;
}
.canvas-node[data-is-portal-loaded=true] .canvas-node-container .canvas-node-content {
display: none;
}
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer {
pointer-events: none;
cursor: inherit;
}
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer .canvas-node-connection-point {
pointer-events: all;
}

2633
.obsidian/plugins/mermaid-tools/main.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
{
"id": "mermaid-tools",
"name": "Mermaid Tools",
"version": "1.3.0",
"minAppVersion": "1.4.0",
"description": "Improved Mermaid.js experience for Obsidian: visual toolbar with common elements & more",
"author": "dartungar",
"authorUrl": "https://dartungar.com",
"fundingUrl": "https://www.paypal.com/paypalme/dartungar",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,149 @@
.mermaid-toolbar-container, .mermaid-toolbar-container * {
max-width: 100%;
max-height: 100%;
}
.mermaid-toolbar-top-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 8px;
}
.mermaid-toolbar-elements-container {
padding-top: 1rem;
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.mermaid-toolbar-element {
font-size: var(--font-ui-small);
cursor: pointer;
padding: 2px 2px 2px 5px;
border-radius: 3px;
flex: 1 0 auto;
}
.mermaid-toolbar-element:hover {
background-color: var(--interactive-hover);
}
.mermaid-tools-element-category-header::before {
content: "▼ ";
font-size: 70%;
padding-bottom: 2px;
}
.mermaid-tools-element-category-header.collapsed::before {
content: "▶ ";
font-size: 70%;
padding-bottom: 2px;
}
.mermaid-tools-element-container {
padding-top: 6px;
border-bottom: var(--border-width) solid var(--color-base-35);
}
.mermaid-tools-edit-element-modal > div {
margin-bottom: 0.5rem;
}
.mermaid-tools-edit-element-modal label {
margin-right: 1rem;
}
/* Custom Category Management Styles */
.mermaid-tools-category-management {
margin-bottom: 2rem;
padding: 1rem;
border: 1px solid var(--color-base-25);
border-radius: 8px;
background-color: var(--color-base-00);
}
.mermaid-tools-category-management h3 {
margin-top: 1rem;
margin-bottom: 0.5rem;
color: var(--text-accent);
}
.mermaid-tools-category-management button.mod-cta {
margin-bottom: 1rem;
}
/* Edit Category Modal Styles */
.mermaid-tools-edit-category-modal {
min-width: 500px;
}
.mermaid-tools-edit-category-modal .setting-item {
padding: 8px 0;
border: none;
}
.mermaid-tools-edit-category-modal .setting-item-info {
flex-grow: 1;
margin-right: 12px;
}
.mermaid-tools-edit-category-modal .setting-item-name {
font-weight: 600;
color: var(--text-normal);
}
.mermaid-tools-edit-category-modal .setting-item-description {
color: var(--text-muted);
font-size: var(--font-ui-smaller);
}
.mermaid-tools-edit-category-modal input,
.mermaid-tools-edit-category-modal textarea {
width: 100%;
padding: 4px 8px;
border: 1px solid var(--color-base-30);
border-radius: 4px;
background-color: var(--color-base-00);
color: var(--text-normal);
}
.mermaid-tools-edit-category-modal input:focus,
.mermaid-tools-edit-category-modal textarea:focus {
border-color: var(--color-accent);
outline: none;
box-shadow: 0 0 0 2px var(--color-accent-2);
}
.modal-button-container {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 20px;
padding-top: 16px;
border-top: 1px solid var(--color-base-25);
}
.modal-button-container button {
padding: 6px 16px;
border: 1px solid var(--color-base-30);
border-radius: 4px;
background-color: var(--color-base-10);
color: var(--text-normal);
cursor: pointer;
font-size: var(--font-ui-small);
}
.modal-button-container button:hover {
background-color: var(--color-base-20);
}
.modal-button-container button.mod-cta {
background-color: var(--color-accent);
color: var(--text-on-accent);
border-color: var(--color-accent);
}
.modal-button-container button.mod-cta:hover {
background-color: var(--color-accent-hover);
}

View File

@@ -0,0 +1,820 @@
{
"copyLinkToElemenetAnchorTo100": false,
"copyFrameLinkByName": false,
"disableDoubleClickTextEditing": false,
"folder": "Excalidraw",
"cropFolder": "",
"annotateFolder": "",
"embedUseExcalidrawFolder": false,
"templateFilePath": "Excalidraw/Template.excalidraw",
"scriptFolderPath": "Excalidraw/Scripts",
"fontAssetsPath": "Excalidraw/CJK Fonts",
"loadChineseFonts": false,
"loadJapaneseFonts": false,
"loadKoreanFonts": false,
"compress": true,
"decompressForMDView": false,
"onceOffCompressFlagReset": true,
"onceOffGPTVersionReset": true,
"autosave": true,
"autosaveIntervalDesktop": 60000,
"autosaveIntervalMobile": 30000,
"drawingFilenamePrefix": "Drawing ",
"drawingEmbedPrefixWithFilename": true,
"drawingFilnameEmbedPostfix": " ",
"drawingFilenameDateTime": "YYYY-MM-DD HH.mm.ss",
"useExcalidrawExtension": true,
"cropSuffix": "",
"cropPrefix": "cropped_",
"annotateSuffix": "",
"annotatePrefix": "annotated_",
"annotatePreserveSize": false,
"previewImageType": "SVG",
"renderingConcurrency": 3,
"allowImageCache": true,
"allowImageCacheInScene": true,
"displayExportedImageIfAvailable": false,
"previewMatchObsidianTheme": false,
"width": "400",
"height": "",
"overrideObsidianFontSize": false,
"dynamicStyling": "colorful",
"isLeftHanded": false,
"desktopUIMode": "tray",
"tabletUIMode": "compact",
"phoneUIMode": "mobile",
"iframeMatchExcalidrawTheme": true,
"matchTheme": false,
"matchThemeAlways": false,
"matchThemeTrigger": false,
"defaultMode": "normal",
"defaultPenMode": "never",
"penModeDoubleTapEraser": true,
"penModeSingleFingerPanning": true,
"penModeCrosshairVisible": true,
"panWithRightMouseButton": false,
"renderImageInMarkdownReadingMode": false,
"renderImageInHoverPreviewForMDNotes": false,
"renderImageInMarkdownToPDF": false,
"allowPinchZoom": false,
"allowWheelZoom": false,
"zoomToFitOnOpen": true,
"zoomToFitOnResize": false,
"zoomToFitMaxLevel": 2,
"zoomStep": 0.05,
"zoomMin": 0.1,
"zoomMax": 30,
"linkPrefix": "📍",
"urlPrefix": "🌐",
"parseTODO": false,
"todo": "☐",
"done": "🗹",
"hoverPreviewWithoutCTRL": false,
"linkOpacity": 1,
"openInAdjacentPane": true,
"showSecondOrderLinks": true,
"focusOnFileTab": true,
"openInMainWorkspace": true,
"showLinkBrackets": false,
"syncElementLinkWithText": false,
"allowCtrlClick": true,
"forceWrap": false,
"pageTransclusionCharLimit": 200,
"wordWrappingDefault": 0,
"removeTransclusionQuoteSigns": true,
"iframelyAllowed": true,
"pngExportScale": 1,
"exportWithTheme": true,
"exportWithBackground": true,
"exportPaddingSVG": 10,
"exportEmbedScene": false,
"keepInSync": false,
"autoexportSVG": false,
"autoexportPNG": false,
"autoExportLightAndDark": false,
"autoexportExcalidraw": false,
"embedType": "excalidraw",
"embedMarkdownCommentLinks": true,
"embedWikiLink": true,
"syncExcalidraw": false,
"experimentalFileType": true,
"experimentalFileTag": "✏️",
"experimentalLivePreview": true,
"fadeOutExcalidrawMarkup": false,
"loadPropertySuggestions": false,
"experimentalEnableFourthFont": false,
"experimantalFourthFont": "Virgil",
"addDummyTextElement": false,
"zoteroCompatibility": false,
"fieldSuggester": true,
"compatibilityMode": false,
"drawingOpenCount": 0,
"library": "deprecated",
"library2": {
"type": "excalidrawlib",
"version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.20.6",
"libraryItems": []
},
"imageElementNotice": true,
"mdSVGwidth": 500,
"mdSVGmaxHeight": 800,
"mdFont": "Virgil",
"mdFontColor": "Black",
"mdBorderColor": "Black",
"mdCSS": "",
"scriptEngineSettings": {},
"previousRelease": "2.20.6",
"showReleaseNotes": true,
"compareManifestToPluginVersion": true,
"showNewVersionNotification": true,
"latexBoilerplate": "\\color{blue}",
"latexPreambleLocation": "preamble.sty",
"taskboneEnabled": false,
"taskboneAPIkey": "",
"pinnedScripts": [],
"sidepanelTabs": [],
"customPens": [
{
"type": "default",
"freedrawOnly": false,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": 0,
"penOptions": {
"highlighter": false,
"constantPressure": false,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 0.6,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "easeOutSine",
"start": {
"cap": true,
"taper": 0,
"easing": "linear"
},
"end": {
"cap": true,
"taper": 0,
"easing": "linear"
}
}
}
},
{
"type": "highlighter",
"freedrawOnly": true,
"strokeColor": "#FFC47C",
"backgroundColor": "#FFC47C",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": null,
"penOptions": {
"highlighter": true,
"constantPressure": true,
"hasOutline": true,
"outlineWidth": 4,
"options": {
"thinning": 1,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "linear",
"start": {
"taper": 0,
"cap": true,
"easing": "linear"
},
"end": {
"taper": 0,
"cap": true,
"easing": "linear"
}
}
}
},
{
"type": "finetip",
"freedrawOnly": false,
"strokeColor": "#3E6F8D",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"roughness": 0,
"penOptions": {
"highlighter": false,
"hasOutline": false,
"outlineWidth": 1,
"constantPressure": true,
"options": {
"smoothing": 0.4,
"thinning": -0.5,
"streamline": 0.4,
"easing": "linear",
"start": {
"taper": 5,
"cap": false,
"easing": "linear"
},
"end": {
"taper": 5,
"cap": false,
"easing": "linear"
}
}
}
},
{
"type": "fountain",
"freedrawOnly": false,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 2,
"roughness": 0,
"penOptions": {
"highlighter": false,
"constantPressure": false,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"smoothing": 0.2,
"thinning": 0.6,
"streamline": 0.2,
"easing": "easeInOutSine",
"start": {
"taper": 150,
"cap": true,
"easing": "linear"
},
"end": {
"taper": 1,
"cap": true,
"easing": "linear"
}
}
}
},
{
"type": "marker",
"freedrawOnly": true,
"strokeColor": "#B83E3E",
"backgroundColor": "#FF7C7C",
"fillStyle": "dashed",
"strokeWidth": 2,
"roughness": 3,
"penOptions": {
"highlighter": false,
"constantPressure": true,
"hasOutline": true,
"outlineWidth": 4,
"options": {
"thinning": 1,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "linear",
"start": {
"taper": 0,
"cap": true,
"easing": "linear"
},
"end": {
"taper": 0,
"cap": true,
"easing": "linear"
}
}
}
},
{
"type": "thick-thin",
"freedrawOnly": true,
"strokeColor": "#CECDCC",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": null,
"penOptions": {
"highlighter": true,
"constantPressure": true,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 1,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "linear",
"start": {
"taper": 0,
"cap": true,
"easing": "linear"
},
"end": {
"cap": true,
"taper": true,
"easing": "linear"
}
}
}
},
{
"type": "thin-thick-thin",
"freedrawOnly": true,
"strokeColor": "#CECDCC",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": null,
"penOptions": {
"highlighter": true,
"constantPressure": true,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 1,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "linear",
"start": {
"cap": true,
"taper": true,
"easing": "linear"
},
"end": {
"cap": true,
"taper": true,
"easing": "linear"
}
}
}
},
{
"type": "default",
"freedrawOnly": false,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": 0,
"penOptions": {
"highlighter": false,
"constantPressure": false,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 0.6,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "easeOutSine",
"start": {
"cap": true,
"taper": 0,
"easing": "linear"
},
"end": {
"cap": true,
"taper": 0,
"easing": "linear"
}
}
}
},
{
"type": "default",
"freedrawOnly": false,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": 0,
"penOptions": {
"highlighter": false,
"constantPressure": false,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 0.6,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "easeOutSine",
"start": {
"cap": true,
"taper": 0,
"easing": "linear"
},
"end": {
"cap": true,
"taper": 0,
"easing": "linear"
}
}
}
},
{
"type": "default",
"freedrawOnly": false,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"fillStyle": "hachure",
"strokeWidth": 0,
"roughness": 0,
"penOptions": {
"highlighter": false,
"constantPressure": false,
"hasOutline": false,
"outlineWidth": 1,
"options": {
"thinning": 0.6,
"smoothing": 0.5,
"streamline": 0.5,
"easing": "easeOutSine",
"start": {
"cap": true,
"taper": 0,
"easing": "linear"
},
"end": {
"cap": true,
"taper": 0,
"easing": "linear"
}
}
}
}
],
"numberOfCustomPens": 0,
"pdfScale": 4,
"pdfBorderBox": true,
"pdfFrame": false,
"pdfGapSize": 20,
"pdfGroupPages": false,
"pdfLockAfterImport": true,
"pdfNumColumns": 1,
"pdfNumRows": 1,
"pdfDirection": "right",
"pdfImportScale": 0.3,
"gridSettings": {
"DYNAMIC_COLOR": true,
"COLOR": "#000000",
"OPACITY": 50,
"GRID_DIRECTION": {
"horizontal": true,
"vertical": true
}
},
"laserSettings": {
"DECAY_LENGTH": 50,
"DECAY_TIME": 1000,
"COLOR": "#ff0000"
},
"embeddableMarkdownDefaults": {
"useObsidianDefaults": false,
"backgroundMatchCanvas": false,
"backgroundMatchElement": true,
"backgroundColor": "#fff",
"backgroundOpacity": 60,
"borderMatchElement": true,
"borderColor": "#fff",
"borderOpacity": 0,
"filenameVisible": false
},
"markdownNodeOneClickEditing": false,
"canvasImmersiveEmbed": true,
"startupScriptPath": "",
"aiEnabled": true,
"openAIAPIToken": "",
"openAIDefaultTextModel": "gpt-5-mini",
"openAIDefaultTextModelMaxTokens": 4096,
"openAIDefaultVisionModel": "gpt-5-mini",
"openAIDefaultImageGenerationModel": "gpt-image-1",
"openAIURL": "https://api.openai.com/v1/chat/completions",
"openAIImageGenerationURL": "https://api.openai.com/v1/images/generations",
"openAIImageEditsURL": "https://api.openai.com/v1/images/edits",
"openAIImageVariationURL": "https://api.openai.com/v1/images/variations",
"modifierKeyConfig": {
"Mac": {
"LocalFileDragAction": {
"defaultAction": "image-import",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-import"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": true,
"meta_ctrl": false,
"result": "link"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-url"
},
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": true,
"meta_ctrl": false,
"result": "embeddable"
}
]
},
"WebBrowserDragAction": {
"defaultAction": "image-url",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-url"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": true,
"meta_ctrl": false,
"result": "link"
},
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": true,
"meta_ctrl": false,
"result": "embeddable"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-import"
}
]
},
"InternalDragAction": {
"defaultAction": "link",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "link"
},
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": true,
"result": "embeddable"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": true,
"result": "image-fullsize"
}
]
},
"LinkClickAction": {
"defaultAction": "new-tab",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "active-pane"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "new-tab"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": true,
"meta_ctrl": false,
"result": "new-pane"
},
{
"shift": true,
"ctrl_cmd": true,
"alt_opt": true,
"meta_ctrl": false,
"result": "popout-window"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": true,
"result": "md-properties"
}
]
}
},
"Win": {
"LocalFileDragAction": {
"defaultAction": "image-import",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-import"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "link"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-url"
},
{
"shift": true,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "embeddable"
}
]
},
"WebBrowserDragAction": {
"defaultAction": "image-url",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-url"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "link"
},
{
"shift": true,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "embeddable"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image-import"
}
]
},
"InternalDragAction": {
"defaultAction": "link",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "link"
},
{
"shift": true,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "embeddable"
},
{
"shift": true,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "image"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": true,
"meta_ctrl": false,
"result": "image-fullsize"
}
]
},
"LinkClickAction": {
"defaultAction": "new-tab",
"rules": [
{
"shift": false,
"ctrl_cmd": false,
"alt_opt": false,
"meta_ctrl": false,
"result": "active-pane"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": false,
"result": "new-tab"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": true,
"meta_ctrl": false,
"result": "new-pane"
},
{
"shift": true,
"ctrl_cmd": true,
"alt_opt": true,
"meta_ctrl": false,
"result": "popout-window"
},
{
"shift": false,
"ctrl_cmd": true,
"alt_opt": false,
"meta_ctrl": true,
"result": "md-properties"
}
]
}
}
},
"slidingPanesSupport": false,
"areaZoomLimit": 1,
"longPressDesktop": 500,
"longPressMobile": 500,
"doubleClickLinkOpenViewMode": true,
"isDebugMode": false,
"rank": "Bronze",
"modifierKeyOverrides": [
{
"modifiers": [
"Mod"
],
"key": "Enter"
},
{
"modifiers": [
"Mod"
],
"key": "k"
},
{
"modifiers": [
"Mod"
],
"key": "G"
}
],
"showSplashscreen": true,
"pdfSettings": {
"pageSize": "A4",
"pageOrientation": "portrait",
"fitToPage": 1,
"paperColor": "white",
"customPaperColor": "#ffffff",
"alignment": "center",
"margin": "normal"
},
"disableContextMenu": false
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.20.6",
"minAppVersion": "1.5.7",
"description": "Sketch Your Mind. An Obsidian plugin to edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"author": "Zsolt Viczian",
"authorUrl": "https://excalidraw-obsidian.online",
"fundingUrl": "https://ko-fi.com/zsolt",
"helpUrl": "https://github.com/zsviczian/obsidian-excalidraw-plugin#readme",
"isDesktopOnly": false
}

File diff suppressed because one or more lines are too long

View File

@@ -13,12 +13,12 @@
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "questions/02-数据库/MyBatis核心原理.md", "file": "10-中间件/Java NIO核心原理.md",
"mode": "source", "mode": "source",
"source": false "source": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "MyBatis核心原理" "title": "Java NIO核心原理"
} }
} }
] ]
@@ -78,7 +78,7 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 300 "width": 369.5
}, },
"right": { "right": {
"id": "302ba9ccf0f34d23", "id": "302ba9ccf0f34d23",
@@ -94,7 +94,7 @@
"state": { "state": {
"type": "backlink", "type": "backlink",
"state": { "state": {
"file": "questions/02-数据库/MyBatis核心原理.md", "file": "10-中间件/Java NIO核心原理.md",
"collapseAll": false, "collapseAll": false,
"extraContext": false, "extraContext": false,
"sortOrder": "alphabetical", "sortOrder": "alphabetical",
@@ -104,7 +104,7 @@
"unlinkedCollapsed": true "unlinkedCollapsed": true
}, },
"icon": "links-coming-in", "icon": "links-coming-in",
"title": "MyBatis核心原理 的反向链接列表" "title": "Java NIO核心原理 的反向链接列表"
} }
}, },
{ {
@@ -113,12 +113,12 @@
"state": { "state": {
"type": "outgoing-link", "type": "outgoing-link",
"state": { "state": {
"file": "questions/02-数据库/MyBatis核心原理.md", "file": "10-中间件/Java NIO核心原理.md",
"linksCollapsed": false, "linksCollapsed": false,
"unlinkedCollapsed": true "unlinkedCollapsed": true
}, },
"icon": "links-going-out", "icon": "links-going-out",
"title": "MyBatis核心原理 的出链列表" "title": "Java NIO核心原理 的出链列表"
} }
}, },
{ {
@@ -156,13 +156,13 @@
"state": { "state": {
"type": "outline", "type": "outline",
"state": { "state": {
"file": "questions/02-数据库/MyBatis核心原理.md", "file": "10-中间件/Java NIO核心原理.md",
"followCursor": false, "followCursor": false,
"showSearch": false, "showSearch": false,
"searchQuery": "" "searchQuery": ""
}, },
"icon": "lucide-list", "icon": "lucide-list",
"title": "MyBatis核心原理 的大纲" "title": "Java NIO核心原理 的大纲"
} }
}, },
{ {
@@ -191,16 +191,30 @@
"templates:插入模板": false, "templates:插入模板": false,
"command-palette:打开命令面板": false, "command-palette:打开命令面板": false,
"bases:新建数据库": false, "bases:新建数据库": false,
"obsidian-git:Open Git source control": false "obsidian-git:Open Git source control": false,
"obsidian-excalidraw-plugin:新建绘图文件": false,
"mermaid-tools:Open Mermaid Toolbar": false
} }
}, },
"active": "16a7ce8de420dd10", "active": "fcbc762a80282002",
"lastOpenFiles": [ "lastOpenFiles": [
"10-中间件/Java NIO三大核心组件架构.excalidraw",
"10-中间件/Netty核心原理.md",
"10-中间件/Buffer核心属性.excalidraw",
"10-中间件/零拷贝原理对比.excalidraw",
"10-中间件/零拷贝原理对比.md",
"10-中间件/Selector多路复用模型.excalidraw",
"10-中间件/Selector多路复用模型.md",
"10-中间件/Java NIO核心原理.md",
"10-中间件/Buffer核心属性.md",
"Java NIO三大核心组件架构.md",
"10-中间件/Java NIO三大核心组件架构.md",
"README.md",
"00-项目概述/项目概述.md",
"questions/02-数据库/MyBatis核心原理.md",
"Obsidian技能使用指南.md", "Obsidian技能使用指南.md",
"Obsidian可视化插件指南.md", "Obsidian可视化插件指南.md",
"10-中间件/Netty实战场景.md", "10-中间件/Netty实战场景.md",
"10-中间件/Java NIO核心原理.md",
"10-中间件/Netty核心原理.md",
"10-中间件", "10-中间件",
"16-LeetCode Hot 100/从前序与中序遍历序列构造二叉树.md", "16-LeetCode Hot 100/从前序与中序遍历序列构造二叉树.md",
"16-LeetCode Hot 100/路径总和.md", "16-LeetCode Hot 100/路径总和.md",
@@ -214,23 +228,10 @@
"16-LeetCode Hot 100/完全平方数.md", "16-LeetCode Hot 100/完全平方数.md",
"16-LeetCode Hot 100/最大正方形.md", "16-LeetCode Hot 100/最大正方形.md",
"16-LeetCode Hot 100/柱状图中最大的矩形.md", "16-LeetCode Hot 100/柱状图中最大的矩形.md",
"16-LeetCode Hot 100/单词搜索.md",
"16-LeetCode Hot 100/子集.md",
"16-LeetCode Hot 100/最长回文子串.md",
"16-LeetCode Hot 100/括号生成.md",
"16-LeetCode Hot 100/删除链表的倒数第N个结点.md",
"16-LeetCode Hot 100/电话号码的字母组合.md",
"16-LeetCode Hot 100/盛最多水的容器.md",
"16-LeetCode Hot 100/三数之和.md",
"16-LeetCode Hot 100/无重复字符的最长子串.md",
"16-LeetCode Hot 100", "16-LeetCode Hot 100",
"00-项目概述", "00-项目概述",
"questions/15-简历面试", "questions/15-简历面试",
"questions/14-Web3与区块链", "questions/14-Web3与区块链",
"12-面试技巧", "12-面试技巧"
"08-算法与数据结构",
"questions/13-Golang语言",
"questions/12-面试技巧",
"questions/11-运维"
] ]
} }

View File

@@ -0,0 +1,93 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
Buffer 核心属性与操作方法 ^title
Buffer 内存布局 ^8JjCGz6b
已处理数据 ^875zBsDl
可读/写数据 ^cipaXLtw
不可访问 ^Ncptto5V
mark ^1ryRw0Uu
position ^S6OCIPfM
核心操作方法 ^lg23asBD
mark「」
标记当前 position 位置 ^method1
reset「」
恢复到 mark 位置 ^method2
clear「」
position=0, limit=capacity ^method3
flip「」
limit=position, position=0 ^method4
%%
## Drawing
```compressed-json
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebR4ABm0ANho6IIR9BA4oZm4AbXAwUDBSiBJuaDVgtNLIWERKqCwoWrLMbmSAVgT+MphuAGZeosgKEnUhroBGbQB2BLmATjm5
niWAFiWeaaW+yEkEQmVpKf2Ia2UatBG6iGYoUjYAawQAYTZ8NlJKgGJphAbBK4ABmbUgmlw2GeyieQg4xA+Xx+Eke1mYcFwgRy4IgIMI+HwAGVYNd0IIPLiHk9XgB1CaSbh8Ub3R4vBAkmBk+6fCrnOEnDjhPJoabnNiY7BqAaihK3Mqw4RwACSxBFqHyAF1+cIEULmOqOEJCecwghiNwxSzGCx2Fw0My7oRmAARDLNC1oEEEMLnTS64gAUWCWRy
6q15yEcGIuA9ltW6yByQAHF0k+ciBxntwjSaWV9oebuN78L6Wc1MK0JAAhIQgkFMVCADgtAMP6gD0dQDkBoA4OUAsyaAHXlAJ2mgFWbXEgzhQImEIziXjJ85jnIAMVw+gJMtQXXOFagAEEiMp7egxDkmLibVBzAQ98dDxBV8RiDVznocrhCELSKqc8b8OLSMd3wIAAVFpKlretG1bTte0HEdzlwIQoDYAAlcIpxnR4hAQDN3wQAAJI4TirVBZh4T
drSYVhOAAOU4MQph4DZuhmOcWXfYgsEqXAElHcgsi/NBc1/FlJFCEDKwAGXfbMvR9bCWXIChxOIiAICKABfPoSjKCoJGTAApAArN4AHEjGSTRcQaGdoFA84OjQOYenOddpjlc5xmISZRSWZJtC6VMli6HgnOTOZkyWBJknOQ5jlONBBjici7kuMl5QENlXiRb4/gBIFQVxSFoUVeFEU+HLUXIDgMSxbJWnnAliVJGyKT5FlqXZekvMZB1TUyjlms
qVqLR1PxJH1dUrTuCUoWlS13JZEqVTVAptQUgMJu/PM7jNT1eHOG0qMPR0dNdd0i1k0t5Luf1SuDTI6vDNa7ijGM41FBNNii1N03zaStuEu4C1ePaSzLO5tzAusG1IVBAFDFQANbUAYD1AAEdUdx0nacmWilkFygZdV3wddkrKbdrwPSpj2aH4DqYC93HJ2970fJBn3HN8PwE1AhL/ACOGA0Ca2hxtEdR3EEKQ1DWCxtBMOuspM3wwj4pI+IScgQ
67Vojh6NFLYnK6JZthOyB2M4iRcGmXiVwQLmeZEsSWikrNizk/lKGUyo1NKTSim0029ogOAnjEA1zWcf0Oi3eAbMCbAog4K5WZZBzeAWu5XOSdKIE87zZ2z2KiO4ZNs9Smds46rLypRdBfh4EElkBDZCqhGE4QRbKa4gX5NHrnhNEshrCU5blhqpfqurzk3WRpAauRa3kRvWsbNtFcVJTm2Vs6W1UntGvVhW4f36hjoZRl9naEAu1BBlp21OCZc5
nTdYJ3tQMH5YhAN7tDXJVsjaMsZr7TE+kmH6UUcIu0Ej+DMbBCygzdhRe+HBta6xIokDYgwArJhxk6BE5t0C4B4Nbfie17Z3FEswZSzsZLvzkhpLSbFA5hS6EYasrp8BWVPqiOyKcmQlxcpaVMHkGSWjcjFZWxEQr+XgonNKfVZ6dz+P3ZMuBBjJxuq3EqHdq5NCqjVbE9VcaNRHgvSkCjOqiN6u1fqpihqL1xAKcah814shmlKWA81t5wmWnvZe
B8DQA1NFfPaGw75HUfmxM6r9r4fz9N/EMj1/4slekAvaIC1hfRTGmCBf0oHcxgfmOBINXZXS3ILdAgAn3UACCagAwF0AA6mgA7Y3RjkTGM4eDTzxgTNc3B1a2UrIzSmdVTx33plefcTMSAs1xC+KIuFPxkMKdNf8/gBaVkqDUhpzT4KIRQmhGWqA5aQKVnFYipE+maxonRGciVGIgJWNnM2qcLiDBIbbRZ20yiUOof9S64MyiKU9hIb2YAL7FCYZ
UQIuBiAUH/M0CObAo7lm4egOOCck64lTlsbOmds65x6qgIEBdJHF1LnI8uFiq7IlyisaY2BiF+i0e3Mq1KJC/FwF0YgyZ6yjhMYNCQY9KUIEngS6elc56jwcaNQULiSLr1mp4re5wd4rTQBGfxxBV6oGPtAFFgxz7BOvhcyidpIlOmiQgN+cSWS3QRD/JJarnplFSW/DJiZvo5NwQrX5BTPmQGBrExBdxLkoOuZ0HggxkyJWTNMMJbF8HPNwM3ec
fF3lBIdlQp2PqP4ML9hCiQUpMQAA0JJQCoNHRoPD1n2U6OIlkrlhEsnxZaDp2hBgbF2EFCN2wujhSml8klDo5gyJZGXbgFd+pKLZdMHBGxcCDxtUygMU70BomqpiQxvLh78vJFKmxs8RVmrKOKuxAq913CcVq/tkB3GbxIunBUPjd7JIvRtWV5Dj0hM6OE011jzUv0tYGspNqEkPTDC+51gDXWgI9b9IGPqP3+uKUB/59QKkQEAPfKgBv6IUIATM
UmktInOhJknTxzdKJr08pAyJlDJPDTJBYz8CDIkMzJ8LJZkcyYHbJZZRvh8zWSpbDeGCM7MlvsjCpAsLHIIqcy0asf1XJ1jONyM6EjBUGJGp+CauJdDedxv1UhHaSWzUGgFHt0MgrBf7cogdALYFDqwTQwQEVIohiiiAaKx01rQJFHFlos4iO6vw4lsm0ACNHeS8dQqV3dwQAkQY0wEst2KsymLvx6zYCWJlrdTV572PMfuyxQW/3HtsTunkBXX0
r1ldeiAt7FX3u8UqZ9jr96atlTq6yZ86hgoEF+xyCnjpPwtVa0zX87qJPA61lJUHgEweyXB71+TEMQADQg4DwaTWKbQdMLogws6RQ7XGvBHFE2pBTTbfTgMvlGagDQ0pYRc2lGs7pdA1FsBwBkGwLoAA1LhlbV28LuKnB5gjRSNruM2sLrEKGDt4MOvpY6bjRd0WyzLPAiG4GS23ZdqPV36I3XVHLp7d2VdKweqx+1CuvBJxVtqVWZWBNcdNDeDW
3JNajC1jUTrIDMq1St3axdBtHtNiNlDn8IC2qDJNv+02XqzfSfN8BXr/UIZ40h+BD2JeQwkIAWDkMOAH7owAd6mEbaSR+cZGVw9LQH0smNGC3DPo5t0gjHmPoFYxosoHH5lXd5qs/AQL0D6+N+LXZUtiOy0kxLxWMmi6ink0go6qCbkJH1lnZy8bTtcTmHpj512Di3fu38iXgKLNPfBU6QO0xSAwGQhQBIABVIQ/2bKQ282nPzDouh9Kh4S5M2hU
/LGTMPpY0ws67ZV1IOH0jEeReR9T94ePu4gkNnFhdmiUu49Zfj9EhOcRD1y5KsnGUKfFapztMreWz3H488IRnk15UeNcg+yAKq/FVYCYadX9x+uoD2In39c/U6ADUbDbMoKXe1KbbnABN6ObTJMBT1SBWhFbNbLXKjFSfQLEbMC3VpCPXgUjJcK3CjG3dAt3CAKmEZBjS8Jje3d3KZNjO4b3TmPPP3QCAPdDTA0gbA0dMPcTbgI5PJE5OPVWMiQb
ZPbgLYVMBIMiOtE7AhC4ZMXPdNChQvEzMA3nczdZYFcvF7QOIkZIAAeTeGVAAAUQQABZFvJoIHdoCQyKMHXgbvQLPOZMDYFIDTFYHYZIZYFMJyCRULeHEdFKOfVACdRRJfX4QYTQZMeuc7RdTfUqGLNdAxInA/WnQVBfQ9ErE/dkdI89AFO/ZxJnOVNxVnZ/DnXxCDXnN9YogXX/WQsoENEXcoMXdbVDSXUDX+d/SDWAxXeA2DXJeDZbb/VA4vdA
yoOANgVgC8B+HAojA5DpOY8jYmUg2g8gx3M8Omagsgj3GZdmH3FgtxFZNgwPIOKYtQU1UTPZaWCTKTQQ2PFWc5MQsNNAZILOSNTBBYLTLPC2JYJQ6BAzb5LNfJa1C9TQlSSzRhSvSoLIdQNgNUFzKwiQTzSLdvRITvG+RIZwglXzfw4QxiMlDFefC/cI7fbuLobAOYbAb0bHbRFlCqWuYgBIBATQHlNI8rDIkkorKeIVPIm/S9GrR/O9dnZVJ9VV
aAjVLVTrPVA1dqeo2+AAh+bIlokA8XeJCbMDWXCU+XXo+MfohbQYpbZAkY5DNoiXENcQ0UN47oDTAKb4+Q3AHcf431fPQzTNYzEE+hH2KEnSQOfAZQCNUIasF0JEwHatPhG3LE+tIYLBbEy0LoSfQuFWRKIIsoJHUIlHMkyI5IDYEESk2k1LJfZIvfIxO4fEbdK/Unencnbk0VXkjk/I6o6rYo2rerco0U5rcU9VD/drWo7/QXPWYXZU5+c6M09U
u1GXboyAF1OA91A0yfTMY0gzUYuhdQ/pFSVsfsYcU3PAngSfLpIglY8sFoMgigp3RorYhmNY3YtmV8A45Q3jY4/mdgrQ9ATc2CUPMTG4/gqPaTOHJ4xU0NJTXpVPJYHBBo02bTC2asZ0lbIEj02hUEszJSMvb0vNaEljS1SQeEq2CtVvGwyAVOAkhwolOMh0aYOIJYQYI2I7KKUQkSOHDPYIokjMhfNLQYOYDtGYAsrfBk6AAnWqffYxCso/asnI
ukSnMVS/USpeBnIoh/UohVdsxaMUqc2/Uqfnfs+o41ZBZokcmJMckDDUroqoiAGcvouc5XJAh8jXEpMY4818u8LAwAGAZABYBgAB0OBABwC0AAbowAZX1ABZJVQEmOmLtFQEAFl5QAO38dyFjs4DzCYjyIYTy1jggQRSyLyXdtjrz6DPdIAmCuNDjll+MXyMCXKPLvL/KgqQqLjOAIroqrjw8DkBChihDHiE9nck8Xj8CNgmIeAo1HkoLCE3hYLv
94K7s1D2jS9HLIT0LfSYSsL4SGVkUAd1zMVOhwsM4JCX8c5KddslgUhlhfIdgApEgEtp4kziImK0yQiwj2R2LOLdtcL4icdEiiyBLN12TKy6dZKayJKz8pLZ4+SxL1L79LQhS2dtq39TK+d30tLgFJ8mjhzWi0CjKJzNS1LzK9TLLEC8klzXSVykK0NHLAgwgoA3LPLAAjA0AFhNQABiVUBODng6qYr2k4rLcErKMHLdwUqEA0rNjMqrybwYScq9
i7zmCbK6snyBNIVwhLVyaOBqa6aGamaGq+DI87iWqHizl2qMrOrgKfNIo9yQovjM8HSQyLtSFxaxqi9VzJrwSvYdD813cFriBXk8LrDwzgcmQgQSKNqyhe9GJBgUhdgYi1gFgehwo8SVYrrIB0zbqqU+LIiHruLGUEidEyTizBL0rIByzD8zFgbxUsigDxKJU86fqmzQbmdeMyivEOzOcuyed1LP9xaBySI5ghyi6VTRyUabpOiHVtSei0ksaskr
LcbxaCaxtVqC1ggsQ5bqqZiOAABeXoVAIgVcKABevAauuYs3B0Vmwg9mkgzmsg1KrOhgS88ZQWljYW28uZMWgE10vjf3U47Aae0gWe84+epe6gFewgNeje3ALengr8vA5qpbVqrW+ijqrWLqxLBMyQzTE2xNQMEawE1Qz0tcqaiEh2jCp2uE4gZNZa/Cj22w1432yAdcDYMhna/6oEbQMKMC4KRMbYGdGHAdAI6Oi4G6zMhOjirip6jfF6tOvijO
j64S3O/LfOieSS+sr6zkgo5shSlnJSmulSzstSmGvsgzFumddu6efSwDQynu4yvu7sge6DfUkeoYvG2BTXeypKxykEIgOAOW1etQBeueu0b+jxzgJe5mpkPe/GQ8jm+xrmy+9AE+vm13bKh8Bgr3fYu+l01g5804xxwgZx8q1x9e7xjgLxj+u0XxlW78tW6PXCTWuTSBnW6BvW+HBMsKdtSfJ5LiRcFB10q2iakvO27Qn2cAZ6C4OAOAEkIBI+Io
aAQ4LISofcU4PoBgQgBACgasJdV6rM+sFZsEaZ7AEQQxZUZofQEkUkhOgEQ5z3cgzZuqbZzIBZ1O+kruER1IkZjZ0gLZnZxcPlWR/Ik5x5s5nZvZ2so9D5p5zIH5mnBssnf5r5zIZCQoq9dZ05nIc5/QAw6upVe52FqAeFxcNm63DcGFz5uF55jGXc+UMFvFzIZSY+nm9K4ltF75qIF3HcR5tgCgQ4aFB8ql+FwMBEelp4JlkIQOLEbltoNlnZrl
xloCdzZlQVh5gF/QRcVNSFskD9e4bAJ4QkItbgZwEBNwnYRYRiHMnBeLf/Y9ZVz4fAAATWLkDo+OSGouSD6t4dWGmaMDYAMGGeDQICwjkzHzmFteTHLyFYhZqPVEbp+ogFhBIB3rTmmbDeIBJAQDgGCdf3/GIHMPhIQA5fnWCEMcTZIBXWs2rE+EDlIGUEhAAAodg27eAQFv7y3v6kgugABKXEVCZQY0LESFYt3AMt4Yat7t3gXtutxtv1qVuqIF
hARF+er/T5PEOV7IDif8ROV1sobIDN6+UBvKpxn89WsofmcZ4p8URCRWTdiXBmpgaiG2I984E90gdNpzVdqPP1uwQyBAeOZgIkfmOAFNjiG9zN7umO+OQgRgICZ1zhNAazLrAVDIf92Y9jIQB4AwMVgHFA00397Op4XZyD+elD1bUIXcf9wD4DgGP1xwZgFdj4E8Sscw7IZvYvcAC+PEAkcII+dSEAdSIAA=
```
%%

View File

@@ -0,0 +1,678 @@
{
"type": "excalidraw",
"version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.20.6",
"elements": [
{
"id": "title",
"type": "text",
"x": 400,
"y": 30,
"width": 306.87994384765625,
"height": 35,
"angle": 0,
"strokeColor": "#1e40af",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 1,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "Java NIO 三大核心组件",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Java NIO 三大核心组件",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 934674734,
"index": "a0",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "channel-box",
"type": "rectangle",
"x": 150,
"y": 150,
"width": 220,
"height": 140,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 3
},
"seed": 2,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"versionNonce": 1200124082,
"index": "a1",
"frameId": null,
"hasTextLink": false
},
{
"id": "WUWQQFAl",
"type": "text",
"x": 215,
"y": 165,
"width": 86.06393432617188,
"height": 30,
"angle": 0,
"strokeColor": "#1864ab",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 3,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "Channel",
"fontSize": 24,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Channel",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 670673774,
"index": "a2",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "QFgWpovs",
"type": "text",
"x": 160,
"y": 210.17819684651062,
"width": 80,
"height": 60,
"angle": 0,
"strokeColor": "#374151",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 4,
"version": 3,
"isDeleted": false,
"boundElements": [],
"updated": 1772940885556,
"link": null,
"locked": false,
"text": "数据通道\n双向数据流\n非阻塞I/O",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "数据通道\n双向数据流\n非阻塞I/O",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 1563719794,
"index": "a3",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "buffer-box",
"type": "rectangle",
"x": 830,
"y": 150,
"width": 220,
"height": 140,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 3
},
"seed": 5,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"versionNonce": 516820398,
"index": "a4",
"frameId": null,
"hasTextLink": false
},
{
"id": "HHe1ugZH",
"type": "text",
"x": 895,
"y": 165,
"width": 75.86393737792969,
"height": 30,
"angle": 0,
"strokeColor": "#2b8a3e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 6,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "Buffer",
"fontSize": 24,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Buffer",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 119893042,
"index": "a5",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "7Gq30uCz",
"type": "text",
"x": 840,
"y": 210,
"width": 64,
"height": 60,
"angle": 0,
"strokeColor": "#374151",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 7,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "数据容器\n数据存储\n读写切换",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "数据容器\n数据存储\n读写切换",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 2036082670,
"index": "a6",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "selector-box",
"type": "rectangle",
"x": 490,
"y": 450,
"width": 220,
"height": 140,
"angle": 0,
"strokeColor": "#f59e0b",
"backgroundColor": "#ffd8a8",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 3
},
"seed": 8,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"versionNonce": 2009929202,
"index": "a7",
"frameId": null,
"hasTextLink": false
},
{
"id": "QB6vfwLt",
"type": "text",
"x": 545,
"y": 465,
"width": 95.75991821289062,
"height": 30,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 9,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "Selector",
"fontSize": 24,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Selector",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 128776750,
"index": "a8",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "1NOeMBmL",
"type": "text",
"x": 500,
"y": 510,
"width": 128,
"height": 60,
"angle": 0,
"strokeColor": "#374151",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 10,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "多路复用器\n事件监听\n单线程管理多连接",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "多路复用器\n事件监听\n单线程管理多连接",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 1364821938,
"index": "a9",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "arrow-channel-buffer",
"type": "arrow",
"x": 370,
"y": 220,
"width": 450,
"height": 0,
"angle": 0,
"strokeColor": "#3b82f6",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 2
},
"seed": 11,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
450,
0
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"versionNonce": 816415854,
"index": "aA",
"frameId": null,
"hasTextLink": false
},
{
"id": "y4PVGoYN",
"type": "text",
"x": 545,
"y": 195,
"width": 64,
"height": 20,
"angle": 0,
"strokeColor": "#3b82f6",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 12,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "数据读写",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "数据读写",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 737263986,
"index": "aB",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "arrow-channel-selector",
"type": "arrow",
"x": 260,
"y": 290,
"width": 260,
"height": 150,
"angle": 0,
"strokeColor": "#f59e0b",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 2
},
"seed": 13,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
260,
150
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"versionNonce": 370853550,
"index": "aC",
"frameId": null,
"hasTextLink": false
},
{
"id": "WhZFanNR",
"type": "text",
"x": 345,
"y": 350,
"width": 64,
"height": 20,
"angle": 0,
"strokeColor": "#f59e0b",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 14,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "注册事件",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "注册事件",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 48022322,
"index": "aD",
"frameId": null,
"hasTextLink": false,
"rawText": ""
},
{
"id": "arrow-selector-channel",
"type": "arrow",
"x": 710,
"y": 450,
"width": 250,
"height": 130,
"angle": 0,
"strokeColor": "#f59e0b",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": {
"type": 2
},
"seed": 15,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
-250,
-130
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"versionNonce": 950649070,
"index": "aE",
"frameId": null,
"hasTextLink": false
},
{
"id": "QItxiuFB",
"type": "text",
"x": 545,
"y": 390,
"width": 64,
"height": 20,
"angle": 0,
"strokeColor": "#f59e0b",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"roundness": null,
"seed": 16,
"version": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1772940884174,
"link": null,
"locked": false,
"text": "事件分发",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "事件分发",
"autoResize": true,
"lineHeight": 1.25,
"versionNonce": 1350667506,
"index": "aF",
"frameId": null,
"hasTextLink": false,
"rawText": ""
}
],
"appState": {
"theme": "light",
"viewBackgroundColor": "#ffffff",
"currentItemStrokeColor": "#1e1e1e",
"currentItemBackgroundColor": "transparent",
"currentItemFillStyle": "solid",
"currentItemStrokeWidth": 2,
"currentItemStrokeStyle": "solid",
"currentItemRoughness": 1,
"currentItemOpacity": 100,
"currentItemFontFamily": 5,
"currentItemFontSize": 20,
"currentItemTextAlign": "left",
"currentItemStartArrowhead": null,
"currentItemEndArrowhead": "arrow",
"currentItemArrowType": "round",
"currentItemFrameRole": null,
"scrollX": -126.31591366168612,
"scrollY": 37.49614013341022,
"zoom": {
"value": 1.271417
},
"currentItemRoundness": "round",
"gridSize": 20,
"gridStep": 5,
"gridModeEnabled": false,
"gridColor": {
"Bold": "rgba(217, 217, 217, 0.5)",
"Regular": "rgba(230, 230, 230, 0.5)"
},
"currentStrokeOptions": null,
"frameRendering": {
"enabled": true,
"clip": true,
"name": true,
"outline": true,
"markerName": true,
"markerEnabled": true
},
"objectsSnapModeEnabled": false,
"activeTool": {
"type": "selection",
"customType": null,
"locked": false,
"fromSelection": false,
"lastActiveTool": null
},
"disableContextMenu": false
},
"files": {}
}

View File

@@ -84,28 +84,7 @@ while (true) {
--- ---
### 2. NIO 三大核心组件 ### 2. NIO 三大核心组件
![[Java NIO三大核心组件架构.excalidraw]]
```
┌────────────────────────────────────────┐
│ Java NIO 架构 │
├────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │Channel │◄──►│ Buffer │ │
│ └────┬────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │Selector │ │
│ │(多路复用)│ │
│ └─────────┘ │
│ │
└────────────────────────────────────────┘
Channel: 数据通道(双向)
Buffer: 数据容器
Selector: 多路复用器
```
#### **核心组件关系** #### **核心组件关系**
@@ -137,29 +116,7 @@ buffer.clear();
#### **工作原理** #### **工作原理**
``` ![[Selector多路复用模型]]
Selector 多路复用模型:
┌──────────────────────────────────┐
│ Selector │
│ │
│ select() - 阻塞等待就绪事件 │
│ │
│ ┌────┐ ┌────┐ ┌────┐ │
│ │Ch1 │ │Ch2 │ │Ch3 │ ... │
│ │就绪│ │就绪│ │就绪│ │
│ └────┘ └────┘ └────┘ │
└──────────────────────────────────┘
│ one thread
┌─────────┴──────────┐
│ Event Loop │
│ - select() │
│ - process() │
│ - repeat │
└────────────────────┘
```
#### **SelectionKey 事件类型** #### **SelectionKey 事件类型**
@@ -307,25 +264,7 @@ sourceChannel.transferTo(0, sourceChannel.size(), destChannel);
#### **Buffer 结构** #### **Buffer 结构**
``` ![[Buffer核心属性]]
Buffer 核心属性:
┌───────┬──────────┬──────────┬─────────┐
│ 0 │position │ limit │capacity │
│ │ │ │ │
│ 已处理 可读/写数据 │ 不可访问 │
│ 数据 │ │ │
└───────┴──────────┴──────────┴─────────┘
↑ ↑ ↑
mark position limit
操作方法:
- mark(): 标记当前 position
- reset(): 恢复到 mark 位置
- clear(): position=0, limit=capacity
- flip(): limit=position, position=0 (读→写)
- rewind(): position=0, limit 不变
```
#### **Buffer 使用流程** #### **Buffer 使用流程**
@@ -439,17 +378,7 @@ if (bytesWritten == 0) {
#### **传统 I/O vs 零拷贝** #### **传统 I/O vs 零拷贝**
``` ![[零拷贝原理对比]]
传统 I/O4 次拷贝4 次上下文切换):
1. 磁盘 → 内核缓冲区 (DMA)
2. 内核缓冲区 → 用户缓冲区 (CPU)
3. 用户缓冲区 → Socket 缓冲区 (CPU)
4. Socket 缓冲区 → 网卡 (DMA)
零拷贝2 次拷贝2 次上下文切换):
1. 磁盘 → 内核缓冲区 (DMA)
2. 内核缓冲区 → 网卡 (DMA)
```
#### **transferTo 实现** #### **transferTo 实现**

View File

@@ -0,0 +1,91 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
Selector 多路复用模型 ^title
Selector
select「」等待 ^PQ5TCqR4
Channel1
就绪 ^K7clAQPy
Channel2
就绪 ^TB56AkxD
Channel3
就绪 ^n6T3kYLo
... ^QZYyxIMx
Event Loop ^p9IOsECm
• select「」 - 等待就绪事件
• process「」 - 处理事件
• repeat - 循环执行 ^PjLUBcm9
单线程管理 ^9bR9jOTv
%%
## Drawing
```compressed-json
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=
```
%%

View File

@@ -0,0 +1,153 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
零拷贝 vs 传统 I/O ^title
传统 I/O「4次拷贝, 4次切换」 ^pPR2Zi0q
磁盘 ^r8UcNJoO
内核缓冲 ^lOhSI8AQ
用户缓冲 ^ExFxKHzC
Socket缓冲 ^GFkKE7aE
网卡 ^nic-text
① DMA ^label1
② CPU ^label2
③ CPU ^label3
④ DMA ^label4
零拷贝「2次拷贝, 2次切换」 ^IIlpdTRV
磁盘 ^P64EyGfA
内核缓冲 ^gSiJQa7m
网卡 ^OdYyV6Ec
① DMA ^label5
② DMA ^label6
优势: 减少2次CPU拷贝, 减少2次上下文切换 ^A7Gs02Kh
零拷贝 vs 传统 I/O ^title
① DMA ^label1
② CPU ^label2
③ CPU ^label3
④ DMA ^label4
① DMA ^label5
② DMA ^label6
%%
## Drawing
```compressed-json
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=
```
%%

View File