<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>星空之窗</title><link>https://blog.rising-galaxy.top/</link><atom:link href="https://blog.rising-galaxy.top/rss.xml" rel="self" type="application/rss+xml"/><description>学如逆水行舟，不进则退。</description><generator>Halo v2.20.14</generator><language>zh-cn</language><image><url>https://minio.drivefly.cn/image-risinggalaxy/myselfWhite.png</url><title>星空之窗</title><link>https://blog.rising-galaxy.top/</link></image><lastBuildDate>Sun, 19 Jul 2026 06:46:16 GMT</lastBuildDate><item><title><![CDATA[浅浅了解 Java 中的 switch]]></title><link>https://blog.rising-galaxy.top/archives/88a92bdd-38cb-443f-981b-fd357a56580c</link><description><![CDATA[<img src="https://blog.rising-galaxy.top/plugins/feed/assets/telemetry.gif?title=%E6%B5%85%E6%B5%85%E4%BA%86%E8%A7%A3%20Java%20%E4%B8%AD%E7%9A%84%20switch&amp;url=/archives/88a92bdd-38cb-443f-981b-fd357a56580c" width="1" height="1" alt="" style="opacity:0;">
<h1 id="浅浅了解-Java-中的-">浅浅了解 Java 中的 <code>switch</code></h1>
<blockquote>
 <p>Coding 时正好遇到了一个 <code>switch</code> 的高版本特性，以前没见过，就正好兴致来了去简单了解下 <code>switch</code> 随着 Java 版本更新的变化。</p>
</blockquote>
<h2 id="Java-1-0-至-Java-4--传统--语句的基础支持"><strong>Java 1.0 至 Java 4: 传统 <code>switch</code> 语句的基础支持</strong></h2>
<p>支持类型: 仅限整型 (<code>byte</code>、<code>short</code>、<code>int</code>) 和字符型 (<code>char</code>)</p>
<pre><code class="language-java">switch (expression) {
    case value1:
        // 代码块
        break;
    case value2:
        // 代码块
        break;
    default:
        // 默认代码块
}
</code></pre>
<p>特性限制:</p>
<ul>
 <li>必须显式使用 <code>break</code> 防止贯穿 <em>(fall-through)</em></li>
 <li><code>case</code> 值需为编译时常量，且不可重复</li>
 <li>无法处理字符串或复杂对象</li>
</ul>
<h2 id="Java-5"><strong>Java 5</strong></h2>
<p>新增支持: 允许 <code>case</code> 标签使用<strong>枚举常量</strong></p>
<p>意义: 增强类型安全性, 避免魔法值</p>
<pre><code class="language-java">enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day day = Day.TUESDAY;
switch(day) {
    case MONDAY:
        System.out.println("Monday");
        break;
    case TUESDAY:
        System.out.println("Tuesday");
        break;
    default:
        System.out.println("Other day");
}
</code></pre>
<h2 id="Java-7"><strong>Java 7</strong></h2>
<p>新增支持：支持<strong>字符串类型</strong>和<strong>包装类</strong>（Byte, Short, Character, Integer）</p>
<pre><code class="language-java">String fruit = "apple";
switch(fruit) {
    case "apple":
        System.out.println("Apple is red.");
        break;
    case "banana":
        System.out.println("Banana is yellow.");
        break;
    default:
        System.out.println("Unknown fruit.");
}
</code></pre>
<p>实现原理:</p>
<ul>
 <li>
  <p>通过调用 <code>hashCode()</code> 将字符串转换为整型, 再通过 <code>equals()</code> 验证匹配, 确保唯一性</p></li>
 <li>
  <p>反编译示例:</p>
  <pre><code class="language-java">switch(fruit.hashCode()) {
    case 99162322:
        if (fruit.equals("apple")) { /* case代码 */ }
        break;
    // ...
}
</code></pre></li>
</ul>
<p>注意事项:</p>
<ul>
 <li>区分大小写，依赖 <code>equals()</code> 的精确匹配</li>
 <li>性能略低于整型 <code>switch</code>, 但可读性显著提升</li>
</ul>
<h2 id="Java-12"><strong>Java 12</strong></h2>
<p>语法革新:</p>
<ul>
 <li><strong>箭头语法 (<code>-&gt;</code>)</strong> : 替代 <code>break</code>, 避免贯穿问题</li>
 <li><strong>多值匹配</strong>: 允许逗号分隔多个 <code>case</code> 值</li>
 <li><strong>表达式化</strong>: <code>switch</code> 可作为表达式返回值</li>
 <li>通过 <code>break</code> 关键字返回值</li>
</ul>
<p><strong>通过 <code>break</code> 关键字返回值例子</strong></p>
<pre><code class="language-java">return switch (day) {
    case "Monday":
        break "Weekday";
    case "Tuesday":
        break "Weekday";
    case "Wednesday":
        break "Weekday";
    case "Thursday":
        break "Weekday";
    case "Friday":
        break "Weekday";
    case "Saturday":
        break "Weekend";
    case "Sunday":
        break "Weekend";
    default:
        break "Unknown";
};
</code></pre>
<p><strong>通过箭头运算符返回值</strong></p>
<pre><code class="language-java">return switch (day) {
    case "Monday" -&gt; "Week day";
    case "Tuesday" -&gt; "Week day";
    case "Wednesday" -&gt; "Week day";
    case "Thursday" -&gt; "Week day";
    case "Friday" -&gt; "Week day";
    case "Saturday" -&gt; "Weekend";
    case "Sunday" -&gt; "Weekend";
    default -&gt; "Unknown";
};
</code></pre>
<p><strong><code>case</code> 中多个值的例子</strong></p>
<pre><code class="language-java">return switch (day) {
    case "Monday","Tuesday","Wednesday","Thursday","Friday" -&gt; "Week day";
    case "Saturday", "Sunday" -&gt; "Weekend";
    default -&gt; "Unknown";
};
</code></pre>
<h2 id="Java-13"><strong>Java 13</strong></h2>
<p><strong>新增关键字</strong>: <code>yield</code> 用于从 <code>switch</code> 块中返回值，替代 <code>break</code> 结合表达式的方式</p>
<pre><code class="language-java">String type = switch (obj) {
    case Integer i:
        yield "整数";
    case String s:
        yield "字符串";
    default:
        yield "未知类型";
};
</code></pre>
<h2 id="Java-14"><strong>Java 14</strong></h2>
<p>标准化特性: 将 Java 12-13 的预览特性(通过标记参数 <code>-enable-preview=true</code> 开启)定为标准功能</p>
<h2 id="Java-17--Preview-"><strong>Java 17 (Preview)</strong></h2>
<p><strong>模式匹配:</strong> 可以在 <code>switch</code> 条件下传递对象，并且可以在 <code>switch case</code> 标签中检查该对象的不同类型, 如下面的例子:</p>
<pre><code class="language-java">return switch (obj) {
    case Integer i -&gt; "It is an integer";
    case String s -&gt; "It is a string";
    case Employee s -&gt; "It is a Employee";
    default -&gt; "It is none of the known data types";
};
</code></pre>
<hr>
<p><strong>保护模式</strong></p>
<p>before:</p>
<pre><code class="language-java">case Employee emp:
	if(emp.getDept().equals("IT")) {
		yield "This is IT Employee";
	}
</code></pre>
<p>after:</p>
<pre><code class="language-java">return switch (obj) {
    case Integer i -&gt; "It is an integer";
    case String s -&gt; "It is a string";
    case Employee employee when employee.getDept().equals("IT") -&gt; "IT Employee";
    default -&gt; "It is none of the known data types";
};
</code></pre>
<hr>
<p><strong>空值处理</strong></p>
<p>对于 <code>null</code> 的处理</p>
<pre><code class="language-java">static void test(Object obj) {
  switch (obj) {
    case null -&gt; System.out.println("null!");
    case String s -&gt; System.out.println("String");
    default -&gt; System.out.println("Something else");
  }
}
</code></pre>
<p>在此预览功能之前，当 <code>obj</code> 为 <code>null</code> 时, 此示例会抛出 <code>NullPointerException</code></p>
<p>而在此后则是正常处理能够打印出 <code>null!</code></p>
<p>也可以组合起来用:</p>
<pre><code class="language-java">static void testStringOrNull(Object obj) {
  switch (obj) {
    case null, String s -&gt; System.out.println("String: " + s);
    default -&gt; System.out.println("Something else");
  }
}
</code></pre>
<p>不过值得一提的是如果选择器表达式的计算结果为 <code>null</code> 并且 <code>switch</code> 块没有 <code>null</code> case 标签, 那么就会正常抛出 <code>NullPointerException</code></p>
<pre><code class="language-java">String s = null;
switch (s) {
  case Object obj -&gt; System.out.println("This doesn't match null");
  // No null label; NullPointerException is thrown
  // if s is null
}
</code></pre>]]></description><guid isPermaLink="false">/archives/88a92bdd-38cb-443f-981b-fd357a56580c</guid><dc:creator>星河景明</dc:creator><enclosure url="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fs3.rising-galaxy.top%2Fimg%2F%E9%9A%8F%E6%8B%8D1.jpg&amp;size=m" type="image/jpeg" length="0"/><category>编程向</category><pubDate>Thu, 27 Mar 2025 15:50:55 GMT</pubDate></item><item><title><![CDATA[[日常知识] - Docker 小问]]></title><link>https://blog.rising-galaxy.top/archives/95b47d66-98cd-40a9-b298-d64df42955b7</link><description><![CDATA[<img src="https://blog.rising-galaxy.top/plugins/feed/assets/telemetry.gif?title=%5B%E6%97%A5%E5%B8%B8%E7%9F%A5%E8%AF%86%5D%20-%20Docker%20%E5%B0%8F%E9%97%AE&amp;url=/archives/95b47d66-98cd-40a9-b298-d64df42955b7" width="1" height="1" alt="" style="opacity:0;">
<h1 id="-日常知识----Docker-小问">[日常知识] - Docker 小问</h1>
<h2 id="Docker-代理相关">Docker 代理相关</h2>
<blockquote>
 <p>单纯修改 Shell 环境变量的方法无法使 docker 使用上代理，须为守护进程配置代理</p>
</blockquote>
<p>推荐方式：</p>
<p>在 Docker Engine 23.0 及更高版本中，您还可以在 <code>daemon.json</code> 文件中为守护进程配置代理行为<a href="https://docs.docker.com/engine/daemon/proxy/">[1]</a><a href="https://docs.docker.com/engine/daemon/">[2]</a>：</p>
<pre><code class="language-json">{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}
</code></pre>
<h2 id="Tabby-隧道不稳定">Tabby 隧道不稳定</h2>
<p>通过上述方法给 docker 配置好代理后采取了远程端口 ssh 连接的方式使用代理，但是使用 tabby 却断断续续的，导致 pull 失败，使用 finalshell 成功了。</p>
<h2 id="docker-ps-指定输出格式">docker ps 指定输出格式</h2>
<blockquote>
 <p>很多时候 docker ps 时，展示可能会折行或者显示不下等，看着乱七八糟的</p>
</blockquote>
<h3 id="解决方案-使用-docker-format-格式化搭配-less-分页展示">解决方案：使用 docker format 格式化搭配 less 分页展示</h3>
<p>推荐使用 docker format 的方法，将下述函数写入 Shell 环境变量然后重登或 <code>source</code> 环境变量。</p>
<pre><code class="language-bash">docker-ps() {
    local format="table"
    local columns=()
    local show_all=false

    # 解析参数
    for arg in "$@"; do
        case $arg in
            -a)
                show_all=true
                ;;
            --all)
                columns=("{{.ID}}" "{{.Image}}" "{{.Names}}" "{{.Status}}" "{{.Ports}}")
                ;;
            --id)
                columns+=("{{.ID}}")
                ;;
            --image)
                columns+=("{{.Image}}")
                ;;
            --names)
                columns+=("{{.Names}}")
                ;;
            --status)
                columns+=("{{.Status}}")
                ;;
            --ports)
                columns+=("{{.Ports}}")
                ;;
        esac
    done

    # 如果没有指定列，使用默认列
    if [ ${#columns[@]} -eq 0 ]; then
        columns=("{{.ID}}" "{{.Image}}" "{{.Names}}" "{{.Status}}")
    fi

    # 构建格式字符串
    local format_str="$format"
    for col in "${columns[@]}"; do
        format_str="$format_str\t$col"
    done

    # 执行 docker ps 命令并通过 less 分页显示
    if [ "$show_all" = true ]; then
        docker ps -a --format "$format_str" | less -S
    else
        docker ps --format "$format_str" | less -S
    fi
}
</code></pre>
<h3 id="参数说明">参数说明</h3>
<table>
 <thead>
  <tr>
   <th>参数</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>-a</code></td>
   <td>显示所有容器（包括已停止的），等同于 <code>docker ps -a</code>。</td>
  </tr>
  <tr>
   <td><code>--all</code></td>
   <td>格式化显示所有列信息，包括 <code>ID</code>、<code>Image</code>、<code>Names</code>、<code>Status</code> 和 <code>Ports</code>。</td>
  </tr>
  <tr>
   <td><code>--id</code></td>
   <td>仅显示容器的 <code>ID</code> 列。</td>
  </tr>
  <tr>
   <td><code>--image</code></td>
   <td>仅显示容器使用的 <code>Image</code> 列。</td>
  </tr>
  <tr>
   <td><code>--names</code></td>
   <td>仅显示容器的 <code>Names</code> 列。</td>
  </tr>
  <tr>
   <td><code>--status</code></td>
   <td>仅显示容器的 <code>Status</code> 列。</td>
  </tr>
  <tr>
   <td><code>--ports</code></td>
   <td>仅显示容器的 <code>Ports</code> 列。</td>
  </tr>
 </tbody>
</table>
<h3 id="默认行为">默认行为</h3>
<ul>
 <li>若不提供任何参数，函数将显示运行中容器的 <code>ID</code>、<code>Image</code>、<code>Names</code> 和 <code>Status</code> 列。</li>
 <li>若使用 <code>-a</code> 参数，将显示所有容器的 <code>ID</code>、<code>Image</code>、<code>Names</code> 和 <code>Status</code> 列。</li>
</ul>]]></description><guid isPermaLink="false">/archives/95b47d66-98cd-40a9-b298-d64df42955b7</guid><dc:creator>星河景明</dc:creator><category>技术向</category><pubDate>Thu, 13 Feb 2025 15:53:58 GMT</pubDate></item><item><title><![CDATA[Flex-1]]></title><link>https://blog.rising-galaxy.top/archives/87926985-b6e0-46fb-840b-0c1e2a7eede2</link><description><![CDATA[<img src="https://blog.rising-galaxy.top/plugins/feed/assets/telemetry.gif?title=Flex-1&amp;url=/archives/87926985-b6e0-46fb-840b-0c1e2a7eede2" width="1" height="1" alt="" style="opacity:0;">
<h1 id="Flex--1">Flex: 1</h1>
<p>今天在学习 <a href="https://www.youtube.com/watch?v=o080tU3sd0k&amp;t=3974s">Full-Stack Social Media App Tutorial with React 19 &amp; Next.js 15 &amp; MySql | React Next.js Full Course</a> 时遇到了好几次使用 <code>flex-1</code>，这是由 <a href="https://tailwindcss.com/docs/flex">Tailwindcss</a> 提供的预定义的类名，等同于为该元素挂上了 <code>flex: 1</code>。</p>
<p><code>flex</code> 是 CSS 中一个常用的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/Shorthand_properties">简写属性</a>，其实际上是 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow"><code>flex-grow</code></a>、<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink"><code>flex-shrink</code></a>、<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis"><code>flex-basis</code></a> 三个属性的简写，而 <code>flex: 1</code> 则等同于 <code>flex: 1 1 0%</code>。</p>
<ul>
 <li><code>flex-grow: 1</code>：定义项目的放大比例，值为 1 表示如果存在剩余空间，项目将按比例放大。</li>
 <li><code>flex-shrink: 1</code>：定义项目的缩小比例，值为 1 表示如果空间不足，项目将按比例缩小。</li>
 <li><code>flex-basis: 0%</code>：定义在分配多余空间之前，项目占据的主轴空间，值为 0% 表示项目的初始大小为 0。</li>
</ul>
<h2 id="-与--的区别"><code>flex: auto</code> 与 <code>flex: 1</code> 的区别</h2>
<p>在 CSS Flex 布局中，<code>flex: 1</code> 和 <code>flex: auto</code> 都用于定义弹性项目如何在容器中分配空间，但它们的行为有所不同，主要区别在于 <code>flex-basis</code> 属性的取值：</p>
<ul>
 <li><code>flex: 1</code>：等同于 <code>flex: 1 1 0%</code>，其中 <code>flex-basis</code> 为 <code>0%</code>。这意味着元素的初始大小被设为 0，在分配剩余空间时，各元素按比例平分剩余空间，而不考虑其内容的固有大小。</li>
 <li><code>flex: auto</code>：等同于 <code>flex: 1 1 auto</code>，其中 <code>flex-basis</code> 为 <code>auto</code>。这表示元素的初始大小基于其内容的固有尺寸，在分配剩余空间时，首先考虑元素的内容大小，然后再根据剩余空间进行伸缩。</li>
</ul>
<p><strong>具体区别：</strong></p>
<ul>
 <li>
  <p><strong>空间分配方式</strong>：</p>
  <ul>
   <li>使用 <code>flex: 1</code> 时，所有设置了该属性的元素会忽略自身内容的宽度，平分容器的剩余空间。</li>
   <li>使用 <code>flex: auto</code> 时，元素首先根据自身内容确定初始大小，然后在剩余空间中按比例分配。</li>
  </ul></li>
</ul>
<p><strong>适用场景：</strong></p>
<ul>
 <li><code>flex: 1</code>：适用于需要所有元素等分剩余空间的场景，例如创建等宽的导航按钮或卡片布局。</li>
 <li><code>flex: auto</code>：适用于希望元素根据自身内容动态调整大小的场景，例如导航栏中的菜单项，其宽度根据文字长度自动调整。</li>
</ul>
<h2 id="Flex">Flex</h2>
<p>以下摘取自 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top">MDN Web Docs</a> 中对该属性的语法解释：</p>
<h3 id="语法"><strong>语法</strong></h3>
<hr>
<pre><code class="language-css">/* 关键字值 */
flex: auto;
flex: initial;
flex: none;

/* 单值，无单位数字：flex-grow
flex-basis 此时等于 0。 */
flex: 2;

/* 单值，宽度/高度：flex-basis */
flex: 10em;
flex: 30px;
flex: min-content;

/* 双值：flex-grow | flex-basis */
flex: 1 30px;

/* 双值：flex-grow | flex-shrink */
flex: 2 2;

/* 三值：flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;

/* 全局值 */
flex: inherit;
flex: initial;
flex: revert;
flex: revert-layer;
flex: unset;
</code></pre>
<p>可以使用一个、两个或三个值来指定 <code>flex</code> 属性。</p>
<ul>
 <li>
  <p><strong>单值语法</strong>：值必须是以下之一：</p>
  <ul>
   <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow"><code>flex-grow</code></a> 的有效值：此时简写会扩展为 <code>flex: &lt;flex-grow&gt; 1 0</code>。</li>
   <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis"><code>flex-basis</code></a> 的有效值：此时简写会扩展为 <code>flex: 1 1 &lt;flex-basis&gt;</code>。</li>
   <li>关键字 <code>none</code> 或者全局关键字之一。</li>
  </ul></li>
 <li>
  <p><strong>双值语法</strong>：</p>
  <ul>
   <li>
    <p>第一个值必须是一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow"><code>flex-grow</code></a> 的有效值。</p></li>
   <li>
    <p>第二个值必须是以下之一：</p>
    <ul>
     <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink"><code>flex-shrink</code></a> 的有效值：此时简写会扩展为 <code>flex: &lt;flex-grow&gt; &lt;flex-shrink&gt; 0</code>。</li>
     <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis"><code>flex-basis</code></a> 的有效值：此时简写会扩展为 <code>flex: &lt;flex-grow&gt; 1 &lt;flex-basis&gt;</code>。</li>
    </ul></li>
  </ul></li>
 <li>
  <p><strong>三值语法</strong>：值必须按照以下顺序指定：</p>
  <ol>
   <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow"><code>flex-grow</code></a> 的有效值。</li>
   <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink"><code>flex-shrink</code></a> 的有效值。</li>
   <li>一个 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis"><code>flex-basis</code></a> 的有效值。</li>
  </ol></li>
</ul>
<h3 id="取值"><strong>取值</strong></h3>
<hr>
<ul>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#initial"><code>initial</code></a>：<br>
   元素会根据自身宽高设置尺寸。它会缩短自身以适应 flex 容器，但不会伸长并吸收 flex 容器中的额外自由空间来适应 flex 容器。相当于将属性设置为 <code>flex: 0 1 auto</code>。</li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#auto"><code>auto</code></a>：<br>
   元素会根据自身的宽度与高度来确定尺寸，但是会伸长并吸收 flex 容器中额外的自由空间，也会缩短自身来适应 flex 容器。这相当于将属性设置为 <code>flex: 1 1 auto</code>。</li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#none"><code>none</code></a>：<br>
   元素会根据自身宽高来设置尺寸。它是完全非弹性的：既不会缩短，也不会伸长来适应 flex 容器。相当于将属性设置为 <code>flex: 0 0 auto</code>。</li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#flex-grow"><code>flex-grow</code></a>：<br>
   定义 flex 项目的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow"><code>flex-grow</code></a>。负值无效。省略时默认值为 <code>1</code>。 (初始值为 <code>0</code>)</li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#flex-shrink"><code>flex-shrink</code></a>：<br>
   定义 flex 元素的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink"><code>flex-shrink</code></a>。负值无效。省略时默认值为 <code>1</code>。 (初始值为 <code>1</code>)</li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#flex-basis"><code>flex-basis</code></a>：<br>
   定义 flex 元素的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis"><code>flex-basis</code></a> 属性。若值为 <code>0</code>，则必须加上单位，以免被视作伸缩性。省略时默认值为 <code>0</code>。(初始值为 <code>auto</code>)</li>
</ul>
<h2 id="主要参考">主要参考</h2>
<ul>
 <li><em><a href="https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=chatgpt.com">Flex 布局教程：语法篇 - 阮一峰的网络日志</a></em></li>
 <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex?utm_source=blog.rising-galaxy.top#%E5%BD%A2%E5%BC%8F%E5%AE%9A%E4%B9%89">mdn web docs &gt; CSS &gt; flex</a></li>
</ul>]]></description><guid isPermaLink="false">/archives/87926985-b6e0-46fb-840b-0c1e2a7eede2</guid><dc:creator>星河景明</dc:creator><category>编程向</category><pubDate>Sat, 8 Feb 2025 11:20:12 GMT</pubDate></item><item><title><![CDATA[开机启动项]]></title><link>https://blog.rising-galaxy.top/archives/kai-ji-qi-dong-xiang</link><description><![CDATA[<img src="https://blog.rising-galaxy.top/plugins/feed/assets/telemetry.gif?title=%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8%E9%A1%B9&amp;url=/archives/kai-ji-qi-dong-xiang" width="1" height="1" alt="" style="opacity:0;">
<h1 id="开机启动项">开机启动项</h1>
<h2 id="初见">初见</h2>
<p>前些时日每次开机总是会打开一个文件夹 <code>SysdiagDisabledAutoruns</code></p>
<p>直接我的常规流程：</p>
<p><code>任务管理器 -&gt; 启动应用 -&gt; 找到它并禁用</code></p>
<p>但是其中并没有找到，继而我又尝试了：</p>
<p><code>火绒 6.0 - 安全工具 - 启动项管理</code></p>
<p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F%25E5%25BC%2580%25E6%259C%25BA%25E5%2590%25AF%25E5%258A%25A8%25E9%25A1%25B9%25E5%259B%25BE1&amp;size=m" alt=""></p>
<p>很不错啊，找到了，并且采用了禁止启用，即上图中的操作 ①。然后我就放心没管了，结果在第二天再一次打开我的电脑时，我又看到了那个文件夹。于是我又采取了上图中的操作 ② - 删除了此项，再次重启，很好还是没用，实际上删除掉它后都不用重启直接重新打开这个 <code>启动项管理</code> 就会发现它又被扫出来了。</p>
<p>然后继而又尝试了几款能够管理启动项的工具（我下了不少各式各样的小工具，但是由于没整理，很多记不到放哪了，这次只尝试了少数几个），比火绒这边还差点，都没扫到这个启动项。</p>
<p>最后因为就开机出现一次，顺手就关了嘛，我就懒得管了。</p>
<h2 id="端倪">端倪</h2>
<p>又是忍他好几天后，我终于忍无可忍，决心找出它。</p>
<p>当时脑子里忽然想起来还有个地方没看过——<code>Windows</code> 自带的开机自启动文件夹。</p>
<blockquote>
 <p><strong>当前用户：</strong></p>
 <p>路径为：<code>C:\Users\{User}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code></p>
 <p>快捷打开方式：<code>Win + R</code> -&gt; <code>shell:startup</code></p>
 <p><strong>所有用户：</strong></p>
 <p>路径为：<code>C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup</code></p>
 <p>快捷打开方式：<code>Win + R</code> -&gt; <code>shell:common startup</code></p>
</blockquote>
<p>进入当前用户的启动项文件夹后，果不其然，看到一个文件夹 <code>SysdiagDisabledAutoruns</code> 躺在其中。</p>
<p>果断删掉它，之后重启就没再遇到过了。</p>
<p>当时细品了下这个文件夹的名字，大概是禁用开机自启动项的，里面确实有几个快捷方式，印象中是我之前禁用过的。可是这处理方式着实有点让人无语，我猜它把这些快捷方式扔到文件夹里统一管理是为了便于后续通过工具再次启用，可是它直接把这个文件夹放在了 <code>Windows</code> 自带的开机自启动文件夹里面就很逆天，就因为它这操作，导致我每次开机都弹个文件夹出来。</p>
<p>由于我是很多工具混用着管理的，因此我一时间想不起来是谁干的好事儿，当时也没想着去搜搜看。想着已经解决了，下次再遇到的时候再去找吧。</p>
<h2 id="线索">线索</h2>
<p>这天闲暇，再看下这个问题。</p>
<p>我先是测试了下用我常用的那几个方式去禁用开机自启项，但都没有出现 <code>SysdiagDisabledAutoruns</code> 文件夹。</p>
<p>于是上网搜索了下，也有人遇到问过，有在微软社区问的，但是无果，还有一个就是在火绒安全论坛里问的：<a href="https://bbs.huorong.cn/thread-14892-1-1.html">SysdiagDisabledAutoruns 这是什么东东？</a> 这都是 <code>2016-5-28</code> 的帖子了，评论区里的回复不多，前面所有 2016 年的回复中倒是看到一条说与火绒有关：</p>
<p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F%25E5%25BC%2580%25E6%259C%25BA%25E5%2590%25AF%25E5%258A%25A8%25E9%25A1%25B9%25E5%259B%25BE2&amp;size=m" alt=""></p>
<p>但是我试过啊，并没有复现问题。</p>
<p>直到看到最后一条 2021 年的评论指出应该是火绒剑弄的。</p>
<blockquote>
 <p>火绒剑已经下线了：<a href="https://www.huorong.cn/dynamic/2023-11-21/17005358181096.html">关于火绒安全软件 5.0 下线“火绒剑”安全工具的通知</a>、<a href="https://bbs.huorong.cn/archiver/?tid-90782.html">网络上流传的火绒剑独立版安全问题</a></p>
</blockquote>
<p>于是我就用火绒剑在 <code>火绒 6.0</code> 版本中的对应工具 <code>火绒 6.0 -&gt; 安全工具 -&gt; 安全分析工具 -&gt; 启动项</code> 中试了下。</p>
<p>这个问题居然还在，只要是原有快捷方式存在于启动目录，那么在安全分析工具中禁用就会创建 <code>SysdiagDisabledAutoruns</code> 文件夹。</p>
<p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F%25E5%25BC%2580%25E6%259C%25BA%25E5%2590%25AF%25E5%258A%25A8%25E9%25A1%25B9%25E5%259B%25BE3&amp;size=m" alt=""></p>
<p>至此，问题出现的原因已找到。</p>
<h2 id="定睛">定睛</h2>
<h3 id="为什么任务管理器扫出来的启动项这么少-">为什么任务管理器扫出来的启动项这么少？</h3>
<p>在网上并未获取到太多有用信息，不过基本能看出任务管理器似乎只扫了以下几个位置：</p>
<ol>
 <li>
  <p><span id="zyglq"></span>资源管理器</p>
  <ol>
   <li><code>C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code></li>
   <li><code>C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup</code></li>
  </ol></li>
 <li>
  <p><span id="zcb"></span>注册表</p>
  <ol>
   <li><code>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run</code></li>
   <li><code>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</code></li>
  </ol></li>
</ol>
<p>我也测试了下：</p>
<p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F%25E5%25BC%2580%25E6%259C%25BA%25E5%2590%25AF%25E5%258A%25A8%25E9%25A1%25B9%25E5%259B%25BE4&amp;size=m" alt=""></p>
<p>在启动目录下创建了一个文件夹和一个指向其它目录的快捷方式。</p>
<p>在任务管理器中只能扫出那个快捷方式，扫不到文件夹。</p>
<h3 id="如何在你的-Windows-上添加开机启动项">如何在你的 Windows 上添加开机启动项</h3>
<ol>
 <li><code>Win + I</code> 打开 <code>设置</code> -&gt; <code>应用</code> -&gt; <code>启动</code></li>
 <li>创建快捷方式，并将其存放至启动目录下，具体路径与快捷打开方式参见 <a href="https://blog.rising-galaxy.top#zyglq">上文</a></li>
 <li><code>Win + R</code> -&gt; <code>shell:appsfolder</code> -&gt; <code>将该目录中你想要添加的应用拖至启动目录</code></li>
 <li>部分软件的设置中自带有开机自启动设置项</li>
 <li><code>Win + S</code> -&gt; <code>任务计划程序 / Task Scheduler</code> -&gt; <code>根据引导创建任务</code></li>
 <li><code>Win + R</code> -&gt; <code>regedit</code> -&gt; <code>根据需求定位到</code> <a href="https://blog.rising-galaxy.top#zcb">上文</a> <code>中提到的两个注册表位置</code>-&gt;<code>新建一条</code></li>
</ol>
<p>上述内容可在 <a href="https://nerdschalk.com/windows-11-add-startup-program">此处</a> 获知详情。</p>
<h3 id="管理你的-Windows-开机启动项">管理你的 Windows 开机启动项</h3>
<ol>
 <li>上述添加方式中都可以查看并管理</li>
 <li>任务管理器里的启动页</li>
 <li>很多第三方软件都可以，比如上文中提到火绒安全软件中就有两个地方都可以管理启动项</li>
</ol>
<p>此处推荐一个工具 - <a href="https://learn.microsoft.com/zh-cn/sysinternals/downloads/autoruns">Autoruns</a></p>
<blockquote>
 <p>此实用工具对任何启动监视器的自动启动位置都有最全面的了解，它显示在系统启动或登录期间，以及在启动各种内置 Windows 应用（如 Internet Explorer、Explorer 和媒体播放器）时，配置为运行哪些程序。 这些程序和驱动程序包含在启动文件夹、Run、RunOnce 和其他注册表项中。 <em>Autoruns</em> 报告 Explorer 外壳扩展、工具栏、浏览器帮助程序对象、Winlogon 通知、自动启动服务等等。 <em>Autoruns</em> 远超其他自动启动实用工具。</p>
 <p><em>Autoruns</em> 的“<strong>隐藏已签名的 Microsoft 项</strong>”选项可帮助放大已添加到系统中的第三方自动启动映像，并支持查看为系统上配置的其他帐户配置的自动启动映像。 下载包中还包含命令行等效项，可输出 CSV 格式 Autorunsc。</p>
</blockquote>]]></description><guid isPermaLink="false">/archives/kai-ji-qi-dong-xiang</guid><dc:creator>星河景明</dc:creator><enclosure url="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2FAutoruns.png&amp;size=m" type="image/jpeg" length="0"/><category>技术向</category><pubDate>Fri, 2 Aug 2024 18:55:04 GMT</pubDate></item><item><title><![CDATA[Base64 编码的原理与应用]]></title><link>https://blog.rising-galaxy.top/archives/base64-bian-ma-de-yuan-li-yu-ying-yong</link><description><![CDATA[<img src="https://blog.rising-galaxy.top/plugins/feed/assets/telemetry.gif?title=Base64%20%E7%BC%96%E7%A0%81%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8&amp;url=/archives/base64-bian-ma-de-yuan-li-yu-ying-yong" width="1" height="1" alt="" style="opacity:0;">
<h1 id="Base64">Base64</h1>
<blockquote>
 <p><code>Base64</code> 一词出自一种特定的 <a href="https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%94%A8%E9%80%94%E4%BA%92%E8%81%AF%E7%B6%B2%E9%83%B5%E4%BB%B6%E6%93%B4%E5%B1%95#%E5%86%85%E5%AE%B9%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81">MINE</a> <a href="https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%94%A8%E9%80%94%E4%BA%92%E8%81%AF%E7%B6%B2%E9%83%B5%E4%BB%B6%E6%93%B4%E5%B1%95#%E5%86%85%E5%AE%B9%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81">内容传输编码</a></p>
</blockquote>
<h2 id="它是什么-">它是什么？</h2>
<p><a href="https://zh.wikipedia.org/wiki/Base64">Wiki</a> 上的一句话解释得很恰当：</p>
<blockquote>
 <p>Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法</p>
</blockquote>
<p>这 64 个可打印字符中包括了字母 <code>A-Z</code>、<code>a-z</code>、数字 <code>0-9</code>，这里就有 62 个字符了，还剩下两个可打印字符在不同的版本中有不同的变化。</p>
<p>一般我们单独提到术语 <code>Base64</code> 指代特定算法时，通常指的是 <a href="https://datatracker.ietf.org/doc/html/rfc4648">RFC 4648</a> 第 4 节中概述的 <code>Base64</code> 版本。</p>
<p>也就是下表这些字符：</p><img id="index-table" src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F202407171716850.png&amp;size=m" alt="RFC 4648 标准的 Base64 索引表">
<h2 id="编码方式">编码方式</h2>
<p>由于 <span class="language-math">​log_264 = 6</span>，所以每 6 个 <code>bit</code> 为一组，对应上表中的某一个可打印字符。我们知道 1 个字节有 8 位，即 <code>1 byte = 8 bit</code>。因此我们可以找到 6 和 8 的最小公倍数 24，即每 3 个字节相当于 4 组 <code>Base64</code> 字符。</p>
<p>示例：</p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F202407171826039.png&amp;size=m" alt="刚好三个字节的转换示例图" title="刚好三个字节的转换示例" style="zoom:50%;">
<p>可以看到 <code>Man</code> 转成 <code>Base64</code> 编码就成了 <code>TWFu</code></p>
<p>上面这个是刚好 3 个字节能够对应转换的，那么问题来了，如果我没有刚好 3 个字节呢，也就是说我给的输入没有 24 或其倍数的位数该怎么处理？</p>
<p>在上面的 <a href="https://blog.rising-galaxy.top#index-table">索引表</a> 中可以看到除了那 64 个可打印字符外，还有一个填充字符 <code>=</code>，它就是来解决这个问题的。</p>
<ol>
 <li>二进制位不足 6 个的情况在末尾补 0 至满足。</li>
 <li>不足 4 组的，直接在结尾添填充符。</li>
</ol><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F202407180024287.png&amp;size=m" alt="添加填充符的示例图" title="添加填充符的示例" style="zoom:50%;">
<h2 id="变种">变种</h2>
<p>base64 编码对应的 64 个可打印字符在一些特定的程序或协议中可能不适合使用，特别是字符表第 62 位 <code>+</code>、63 位 <code>/</code> 和填充字符 <code>=</code>，因此存在一些如下的变种：</p><img src="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F202407180046925.png&amp;size=m" alt="Base64 编码变种图" title="Base64 编码变种图" style="zoom:50%;">
<blockquote>
 <p>上图源自 <a href="https://zh.wikipedia.org/wiki/Base64#:~:text=%E5%A6%82%E4%B8%8B%E7%9A%84%E5%8F%98%E7%A7%8D%EF%BC%9A-,%E7%BC%96%E7%A0%81,-%E7%BC%96%E7%A0%81%E5%AD%97%E7%AC%A6" title="Wiki中的Base64变种表格">Wiki</a></p>
</blockquote>
<h2 id="Base64-优缺点">Base64 优缺点</h2>
<ul>
 <li>
  <p>优点</p>
  <ol>
   <li><strong>简化数据传输</strong>：通过将二进制数据转换为文本字符，<code>Base64</code> 编码使得数据在文本协议（如 HTTP、SMTP 等）中的传输更加安全和可靠。</li>
   <li><strong>兼容性好</strong>：编码后的数据可以在几乎所有文本处理系统中处理和存储，而不会出现乱码问题。</li>
   <li><strong>易于实现</strong>：<code>Base64</code> 编码和解码算法简单，容易在各种编程语言中实现。</li>
   <li><strong>减少数据损坏</strong>：避免了在传输过程中由于字符编码问题导致的数据损坏。</li>
  </ol></li>
 <li>
  <p>缺点</p>
  <ol>
   <li><strong>增加数据量</strong>：编码后的数据体积约为原始数据的 1.33 倍（即每 3 个字节的数据编码成 4 个字节的文本），这会增加传输和存储成本。</li>
   <li><strong>不适合大文件</strong>：由于编码后数据量的增加，不适合处理和传输非常大的文件。</li>
   <li><strong>无数据压缩</strong>：<code>Base64</code> 编码不会对数据进行压缩，仅仅是转换，因此不会减少数据的实际存储空间。</li>
   <li><strong>安全性有限</strong>：<code>Base64</code> 编码并不是加密方法，仅仅是编码方式，对敏感数据的保护作用有限，需要配合加密技术使用。</li>
  </ol></li>
</ul>
<h2 id="Base64-应用">Base64 应用</h2>
<ol>
 <li>数据传输：在 <code>HTTP</code> 协议中，表单数据通常以键值对的形式存在，这些数据在传输过程中可能会被截断或篡改。为了确保数据的完整性和安全性，可以使用 <code>Base64</code> 编码对表单数据进行编码后再传输。</li>
 <li>邮件传输：<code>SMTP</code> 协议不支持直接传输二进制文件，因此需要将二进制文件（如附件）转换为 <code>ASCII</code> 格式。<code>Base64</code> 编码可以用于将二进制文件转换为适合在邮件中传输的格式。</li>
 <li>数据加密：虽然 <code>Base64</code> 编码本身并不提供加密功能，但它可以与其他加密技术结合使用，如 <code>AES</code> 或 <code>RSA</code> 加密。首先对数据进行加密，然后使用 <code>Base64</code> 编码将加密后的数据进行编码，以便在不支持二进制数据的协议中传输。</li>
 <li>数据存储：在某些数据库或文件系统中，可能需要将二进制数据存储为文本格式。使用 <code>Base64</code> 编码可以将二进制数据转换为文本字符串，以便在数据库或文件系统中存储。</li>
 <li><code>URL</code> 编码：<code>URL</code> 中的参数通常需要进行编码，以避免特殊字符（如空格、<code>&amp;</code> 等）导致的问题。虽然 <code>URL</code> 编码和 <code>Base64</code> 编码是不同的概念，但有时可以将 <code>Base64</code> 编码的数据作为 <code>URL</code> 参数的一部分进行传输。</li>
 <li>证书和 <code>API</code> 密钥：在处理敏感信息（如 <code>SSL</code> 证书、<code>API</code> 密钥等）时，可以使用 <code>Base64</code> 编码对这些信息进行编码，以保护数据的隐私和安全。但请注意，<code>Base64</code> 编码并不能替代加密措施，它只是一种编码方式。</li>
</ol>
<p>总之，<code>Base64</code> 编码在许多场景中都有应用，主要用于将二进制数据转换为适合在文本协议中传输的格式。然而，需要注意的是，<code>Base64</code> 编码并不能提供加密功能，因此在处理敏感数据时，还需要结合其他加密措施来确保数据的安全。</p>]]></description><guid isPermaLink="false">/archives/base64-bian-ma-de-yuan-li-yu-ying-yong</guid><dc:creator>星河景明</dc:creator><enclosure url="https://blog.rising-galaxy.top/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fminio.drivefly.cn%2Fimage-risinggalaxy%2F202407190216208.png&amp;size=m" type="image/jpeg" length="0"/><category>网络安全向</category><pubDate>Thu, 18 Jul 2024 17:41:00 GMT</pubDate></item></channel></rss>