<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://githubblog.yiyuemeow.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://githubblog.yiyuemeow.com/" rel="alternate" type="text/html" hreflang="zh" /><updated>2026-08-02T17:27:11+00:00</updated><id>http://githubblog.yiyuemeow.com/feed.xml</id><title type="html">我是一个标题</title><subtitle>Your Site Description
</subtitle><author><name>Yi Yue</name></author><entry><title type="html">Getx 让 flutter 更简单</title><link href="http://githubblog.yiyuemeow.com/posts/Getx-%E8%AE%A9-Flutter-%E6%9B%B4%E7%AE%80%E5%8D%95/" rel="alternate" type="text/html" title="Getx 让 flutter 更简单" /><published>2026-03-27T00:00:00+00:00</published><updated>2026-03-27T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/Getx%20%E8%AE%A9%20Flutter%20%E6%9B%B4%E7%AE%80%E5%8D%95</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/Getx-%E8%AE%A9-Flutter-%E6%9B%B4%E7%AE%80%E5%8D%95/"><![CDATA[<blockquote>
  <p>Flutter made easy
这可不是我说的啊，他们的 readme 就是这么写的</p>
</blockquote>

<p>虽然他们的文档已经写得很好了，但我还是想专门写点东西</p>
<h1 id="getx-是个啥">Getx 是个啥</h1>

<p>这是一个很方便使用的包，让状态管理、依赖注入和路由管理都变得简单多了，而且拿它写 MVVM 体感上和安卓原生是差不多的</p>

<p>当然它最主要的用途还是管理状态（数据），毕竟你也不想拖着<code class="language-plaintext highlighter-rouge">InheritedWidget</code>写一大堆模板代码吧</p>

<blockquote>
  <p>当然管理状态还有像 <a href="https://pub.dev/packages/provider">provider</a> 之类的包，可以都去了解一下，然后看看哪种更合适你（或者是你的项目）</p>
</blockquote>

<h1 id="状态管理">状态管理</h1>

<p>状态管理说着高级，实际上主要还是在不同的 Widget 之间共享变量</p>

<h2 id="简单的基本用法">简单的基本用法</h2>

<p>现在如果有两个页面 <code class="language-plaintext highlighter-rouge">PageA</code>和<code class="language-plaintext highlighter-rouge">PageB</code>，它们同时可以修改一个变量<code class="language-plaintext highlighter-rouge">count</code>并显示，那我们怎么才能让修改在两个页面间同步呢</p>

<p>聪明的你肯定想到在它们的父组件里面加个<code class="language-plaintext highlighter-rouge">InheritedWidget</code>，但是吧每次都要创建这么一个类加上一堆长长的方法名，也太麻烦了</p>

<p>此时 Getx 的 <code class="language-plaintext highlighter-rouge">controller</code>就派上用场了，顾名思义它是一个控制器，像<code class="language-plaintext highlighter-rouge">ViewModel</code>一样生命周期独立于视图（当然在合适的时机也会自动释放啦）。于是需要共享的变量就可以放在里面</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">CountController</span> <span class="n">extend</span> <span class="n">GetxController</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>然后在要使用这个变量之前初始化一下这个 <code class="language-plaintext highlighter-rouge">controller</code>（这部分涉及 Getx 的<a href="#依赖管理">依赖管理</a>）</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Get</span><span class="o">.</span><span class="na">put</span><span class="p">(</span><span class="n">CountController</span><span class="p">());</span> <span class="c1">// 初始化一个 CountController，并将它加入 Getx 的依赖管理器中</span>
</code></pre></div></div>
<p>然后在需要使用这个变量的时候获取这个<code class="language-plaintext highlighter-rouge">controller</code>的实例</p>
<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">PageA</span> <span class="n">extend</span> <span class="n">StatelessWidget</span> <span class="p">{</span>
    <span class="nd">@override</span>
    <span class="n">Widget</span> <span class="n">build</span><span class="p">(</span><span class="n">BuildContext</span> <span class="n">context</span><span class="p">)</span> <span class="p">{</span>
    
        <span class="kd">final</span> <span class="n">controller</span> <span class="o">=</span> <span class="n">Get</span><span class="o">.</span><span class="na">find</span><span class="p">&lt;</span><span class="n">CountController</span><span class="p">&gt;();</span> <span class="c1">// 在依赖管理器中找到一个 CountController 对象</span>
        <span class="n">print</span><span class="p">(</span><span class="n">controller</span><span class="o">.</span><span class="na">count</span><span class="p">);</span>
        
        <span class="p">...</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>就这么简单</p>

<p>但还有更方便的，因为我们要把这个<code class="language-plaintext highlighter-rouge">count</code>显示出来，所以在它变化时要更新 UI 就得用<code class="language-plaintext highlighter-rouge">setState</code>。可是如果我想写响应式呢？当然可以！只需要给这个变量做一点小标记，再在 UI 中略微修改就可以做到了</p>

<p>把<code class="language-plaintext highlighter-rouge">count</code>改成下面这样</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">CountController</span> <span class="n">extend</span> <span class="n">GetxController</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="o">.</span><span class="na">obs</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>把界面改成这样</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">PageA</span> <span class="n">extend</span> <span class="n">StatelessWidget</span> <span class="p">{</span>
    <span class="nd">@override</span>
    <span class="n">Widget</span> <span class="n">build</span><span class="p">(</span><span class="n">BuildContext</span> <span class="n">context</span><span class="p">)</span> <span class="p">{</span>
    
        <span class="kd">final</span> <span class="n">controller</span> <span class="o">=</span> <span class="n">Get</span><span class="o">.</span><span class="na">find</span><span class="p">&lt;</span><span class="n">CountController</span><span class="p">&gt;();</span> <span class="c1">// 在依赖管理器中找到一个 CountController 对象</span>
        
        <span class="k">return</span> <span class="n">Obx</span><span class="p">(()</span> <span class="o">=</span><span class="p">&gt;</span> <span class="n">Text</span><span class="p">(</span><span class="n">controller</span><span class="o">.</span><span class="na">count</span><span class="o">.</span><span class="na">value</span><span class="o">.</span><span class="na">toString</span><span class="p">()));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>这个<code class="language-plaintext highlighter-rouge">Text</code>的内容就会随着<code class="language-plaintext highlighter-rouge">count</code>的值改变而改变，妈妈从此再也不用担心我忘记<code class="language-plaintext highlighter-rouge">setState</code>了！</p>

<h2 id="不复杂的进阶用法">不复杂的进阶用法</h2>

<h3 id="obs-是啥">.obs 是啥</h3>

<p>给上面的<code class="language-plaintext highlighter-rouge">count</code>加上<code class="language-plaintext highlighter-rouge">.obs</code>之后，这个变量就是“<strong>可观察的</strong>”了，也就是 <strong>Observable</strong></p>

<p>除了直接加<code class="language-plaintext highlighter-rouge">.obs</code>，还可以用<code class="language-plaintext highlighter-rouge">Rx&lt;Type&gt;</code>来创建</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="n">count</span> <span class="o">=</span> <span class="n">Rx</span><span class="p">&lt;</span><span class="n">Int</span><span class="p">&gt;(</span><span class="mi">0</span><span class="p">);</span> <span class="c1">// 初始值是不必须的</span>
</code></pre></div></div>

<p>还有一些很常用的类有对应的能快速创建对象的方法</p>

<div class="language-dart highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">final</span> <span class="n">name</span> <span class="o">=</span> <span class="n">RxString</span><span class="p">(</span><span class="s">''</span><span class="p">);</span>
<span class="kd">final</span> <span class="n">isLogged</span> <span class="o">=</span> <span class="n">RxBool</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="kd">final</span> <span class="n">count</span> <span class="o">=</span> <span class="n">RxInt</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="kd">final</span> <span class="n">balance</span> <span class="o">=</span> <span class="n">RxDouble</span><span class="p">(</span><span class="mf">0.0</span><span class="p">);</span>
<span class="kd">final</span> <span class="n">items</span> <span class="o">=</span> <span class="n">RxList</span><span class="p">&lt;</span><span class="kt">String</span><span class="p">&gt;([]);</span>
<span class="kd">final</span> <span class="n">myMap</span> <span class="o">=</span> <span class="n">RxMap</span><span class="p">&lt;</span><span class="kt">String</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;({});</span>
</code></pre></div></div>

<p>还没写完呢</p>
<h1 id="依赖管理">依赖管理</h1>

<p>解释什么是依赖注入是一件复杂的事，你只需要知道 Getx 提供了一个很好用的依赖管理器：只要你之前把你需要用的对象给放进去，那你就能<strong>随时随地</strong>，不需要传递什么上下文，在代码的任何一个位置获取到这个对象的实例</p>

<p>当然最多的还是放 Getx 的 Controller：</p>

<pre><code class="language-Dart">Controller controller = Get.put(Controller());
</code></pre>

<p>如果你需要在别的地方用到它，只需要这样：</p>

<pre><code class="language-Dart">final controller = Get.find();
</code></pre>

<p>真是太简单了！</p>

<h2 id="但是很多时候事情没那么简单">但是很多时候事情没那么简单</h2>

<p>就是说，如果我放了不止一个对象，Getx 又怎么知道我要的是哪个呢？这倒不是难事，因为<code class="language-plaintext highlighter-rouge">Get.put()</code>和<code class="language-plaintext highlighter-rouge">Get.find()</code>都是能指定类型的，就像这样：</p>

<pre><code class="language-Dart">Get.put&lt;MyController&gt;(MyController()); // 这里边的指定不是必须的
Get.put&lt;YourController&gt;(YourController());

final someController = Get.find&lt;MyController&gt;();
</code></pre>

<p>这样就能稳稳地获取到正确的类型了</p>

<p>然后又出现了新的问题：如果我有好多个<code class="language-plaintext highlighter-rouge">MyController</code>，又该怎么找到想要的那个呢？</p>

<p>这也很简单，因为<code class="language-plaintext highlighter-rouge">Get.put()</code>和<code class="language-plaintext highlighter-rouge">Get.find()</code>还可以指定一个 tag：</p>

<pre><code class="language-Dart">Get.put&lt;MyController&gt;(MyController(), tag: 'My first Controller');
Get.put&lt;MyController&gt;(MyController(), tag: 'My second Controller');

final someController = Get.find&lt;MyController&gt;(tag: 'My first Controller'); // 当然是获取第一个 Controller 啦
</code></pre>

<p>只要保证 tag 的字符串是唯一的，就能保证一定能获取对应的对象了</p>

<p>下面是官方文档对<code class="language-plaintext highlighter-rouge">Get.put()</code>的参数介绍：</p>

<pre><code class="language-Dart">Get.put&lt;S&gt;(
  // 必备：你想得到保存的类，比如控制器或其他东西。
  // 注："S "意味着它可以是任何类型的类。
  S dependency

  // 可选：当你想要多个相同类型的类时，可以用这个方法。
  // 因为你通常使用Get.find&lt;Controller&gt;()来获取一个类。
  // 你需要使用标签来告诉你需要哪个实例。
  // 必须是唯一的字符串
  String tag,

  // 可选：默认情况下，get会在实例不再使用后进行销毁
  // （例如：一个已经销毁的视图的Controller)
  // 但你可能需要这个实例在整个应用生命周期中保留在那里，就像一个sharedPreferences的实例或其他东西。
  //所以你设置这个选项
  // 默认值为false
  bool permanent = false,

  // 可选：允许你在测试中使用一个抽象类后，用另一个抽象类代替它，然后再进行测试。
  // 默认为false
  bool overrideAbstract = false,

  // 可选：允许你使用函数而不是依赖（dependency）本身来创建依赖。
  // 这个不常用
  InstanceBuilderCallback&lt;S&gt; builder,
)
</code></pre>

<p>还有一些别的用法这里就不讲了，因为平常用得比较少，想学的话可以自己去研究 (￣﹃￣)</p>

<h1 id="路由管理">路由管理</h1>

<p><a href="https://github.com/jonataslaw/getx/blob/master/documentation/zh_CN/route_management.md">官方文档</a>是这么讲的</p>

<p><del>其实是我懒得写了，反正这些用法五分钟就学得会</del></p>

<h1 id="其他的好东西">其他的好东西</h1>

<h2 id="切换语言">切换语言</h2>

<p>可以像下面这样快速切换应用的语言：</p>

<pre><code class="language-Dart">var locale = Locale('en', 'US');
Get.updateLocale(locale);
</code></pre>

<h2 id="获取上下文">获取上下文</h2>

<p>可以用<code class="language-plaintext highlighter-rouge">Get.context</code>随时获取当前上下文，有一说一这个功能确实有点夸张，但是很多时候能少写一个参数欸</p>]]></content><author><name>Yi Yue</name></author><category term="flutter" /><summary type="html"><![CDATA[好用爱用]]></summary></entry><entry><title type="html">用 viewmodel 来连通一切</title><link href="http://githubblog.yiyuemeow.com/posts/%E7%94%A8-VIewModel-%E6%9D%A5%E8%BF%9E%E9%80%9A%E4%B8%80%E5%88%87/" rel="alternate" type="text/html" title="用 viewmodel 来连通一切" /><published>2025-11-24T00:00:00+00:00</published><updated>2025-11-24T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E7%94%A8%20VIewModel%20%E6%9D%A5%E8%BF%9E%E9%80%9A%E4%B8%80%E5%88%87</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E7%94%A8-VIewModel-%E6%9D%A5%E8%BF%9E%E9%80%9A%E4%B8%80%E5%88%87/"><![CDATA[<h2 id="viewmodel你简直就是救世主">ViewModel，你简直就是救世主</h2>

<p>但是为什么不能让Fragment直接访问Activity的值呢，就因为这样太丑陋了吗？</p>

<p>（好像还真是</p>

<h3 id="啥是viewmodel">啥是ViewModel</h3>

<p>这玩意就是 Activity 和 Fragment 之间的桥梁，而且即使 Acitivity 重新创建（旋转）了也不为所动，因此可以拿来保存两者共有的数据</p>

<p>更准确地说，它其实是逻辑与界面之间的桥梁</p>

<h3 id="怎么用">怎么用</h3>

<p>创建一个 ViewModel 只要继承一个就好啦</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">MyViewModel</span> <span class="p">:</span> <span class="nc">ViewModel</span><span class="p">()</span>
</code></pre></div></div>

<p>之后里边可以放一大堆数据，无论Activity还是（属于它的）Fragment都可看可查的的那种</p>

<p>经常拿来和LiveData配合打组合技</p>

<p>在Activity和Fragment里用ViewModel的方法都是一样的，首先创建一个private lateinit var</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">lateinit</span> <span class="kd">var</span> <span class="py">myViewModel</span><span class="p">:</span> <span class="nc">MyViewModel</span>
</code></pre></div></div>

<p>然后进行一个赋值</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">myViewModel</span> <span class="p">=</span> <span class="nc">ViewModelProvider</span><span class="p">(</span><span class="n">context</span><span class="p">)[</span><span class="nc">MyViewModel</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="n">java</span><span class="p">]</span>
</code></pre></div></div>

<p>就可以在后面加个.愉快地调用其中的变量与函数啦</p>

<h3 id="像对象一样传参并不">像对象一样传参（并不</h3>

<p>等下……我记得好像还有个<code class="language-plaintext highlighter-rouge">ViewModelProvider.Factory</code>吧，那是啥来着？</p>

<p>可以看作是<code class="language-plaintext highlighter-rouge">ViewModel</code>的一个构造方式吧，这样就可以像类和函数那样有预先传入的参数了<del>，不用像某个人一样手动把内部变量全部赋值一遍</del></p>

<p>那要怎么做呢？先对<code class="language-plaintext highlighter-rouge">ViewModel</code>本身动手脚</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">MyViewModel</span><span class="p">(</span><span class="n">number</span><span class="p">:</span> <span class="nc">Int</span><span class="p">)</span> <span class="p">:</span> <span class="nc">ViewModel</span><span class="p">()</span>
</code></pre></div></div>

<p>这样这个<code class="language-plaintext highlighter-rouge">ViewModel</code>就需要传入一个参数了</p>

<p>之后便要构建传参的路径，就需要那<code class="language-plaintext highlighter-rouge">ViewModelProvider.Factory</code>了</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">MyViewModelFactory</span><span class="p">(</span><span class="k">private</span> <span class="kd">val</span> <span class="py">number</span><span class="p">:</span> <span class="nc">Int</span><span class="p">)</span> <span class="p">:</span> <span class="nc">ViewModelProvider</span><span class="p">.</span><span class="nc">Factory</span> <span class="p">{</span> 
	<span class="k">override</span> <span class="k">fun</span> <span class="p">&lt;</span><span class="nc">T</span> <span class="p">:</span> <span class="nc">ViewModel</span><span class="p">&gt;</span> <span class="nf">create</span><span class="p">(</span><span class="n">modelClass</span><span class="p">:</span> <span class="nc">Class</span><span class="p">):</span> <span class="nc">T</span> <span class="p">{</span> 
		<span class="k">return</span> <span class="nc">MyViewModel</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> <span class="k">as</span> <span class="nc">T</span> 
	<span class="p">}</span> 
<span class="p">}</span>
</code></pre></div></div>

<p>最后在赋值的时候在参数里面添加这个<code class="language-plaintext highlighter-rouge">Factory</code>就好了，例如</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">myViewModel</span> <span class="p">=</span> <span class="nc">ViewModelProvider</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nc">MyViewModelFactory</span><span class="p">(</span><span class="n">number</span><span class="p">))[</span><span class="nc">MyViewModel</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="n">java</span><span class="p">]</span>
</code></pre></div></div>

<p>当当当，大功告成！</p>

<h2 id="大人时代变了">大人，时代变了</h2>

<p>在用 Compose 的时代，如果我们不在 Activity 或者 Fragment 的作用域里面，显然上面那些经典的方法是用不了的</p>

<p>当然，新时代也是有新时代的方法的！<del>（不过这些方法似乎不自带</del></p>

<p>首先需要加上<code class="language-plaintext highlighter-rouge">androidx-lifecycle-viewmodel-compose</code>这个包</p>

<p>然后我们只需要在 Composable 函数中这样</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">viewModel</span><span class="p">:</span> <span class="nc">HomepageViewModel</span> <span class="p">=</span> <span class="nf">viewModel</span><span class="p">()</span>
</code></pre></div></div>

<p>就可以用 ViewModel 了，是不是非常简单呢</p>]]></content><author><name>Yi Yue</name></author><category term="安卓" /><summary type="html"><![CDATA[这可方便了]]></summary></entry><entry><title type="html">Compose 的降临！</title><link href="http://githubblog.yiyuemeow.com/posts/Compose-%E7%9A%84%E9%99%8D%E4%B8%B4/" rel="alternate" type="text/html" title="Compose 的降临！" /><published>2025-11-23T00:00:00+00:00</published><updated>2025-11-23T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/Compose%20%E7%9A%84%E9%99%8D%E4%B8%B4%EF%BC%81</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/Compose-%E7%9A%84%E9%99%8D%E4%B8%B4/"><![CDATA[<h1 id="抛弃石山做回自己">抛弃石山，做回自己！</h1>

<p>你是否已经厌倦了在 xml 中拖拖拽拽，最终只是搓出了相当一般界面的日子了？</p>

<p>你是否已经对每次创建 Activity 和 Fragment 时都要加个布局文件，每个控件都要单独声明（即使用 binding 也很麻烦）的繁琐操作感到失望？</p>

<p>你是否羡慕例如 Flutter 那样的声明式 UI，优雅地将布局界面写到代码中去，不用在两个文件间反复切换，浪费生命？</p>

<p>那 <strong>Jetpack Compose</strong> 就能解决你的烦恼！</p>

<blockquote>
  <p>Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API，可以帮助您简化并加快 Android 界面开发。</p>
</blockquote>

<h2 id="让我们开始吧">让我们开始吧</h2>

<p>在古老的没有 Compose 的时代，程序员都是在 Activity 里面这样处理界面的：</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 首先要声明一个 binding</span>
<span class="k">lateinit</span> <span class="kd">var</span> <span class="py">binding</span><span class="p">:</span> <span class="nc">ActivityHomepageBinding</span>

<span class="k">override</span> <span class="k">fun</span> <span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">:</span> <span class="nc">Bundle</span><span class="p">?)</span> <span class="p">{</span>
    <span class="k">super</span><span class="p">.</span><span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">)</span>  
    <span class="c1">// 然后再给 binding 赋值</span>
    <span class="n">binding</span> <span class="p">=</span> <span class="nc">ActivityHomepageBinding</span><span class="p">.</span><span class="nf">inflate</span><span class="p">(</span><span class="n">layoutInflater</span><span class="p">)</span>  
    <span class="c1">// 还要绑定布局</span>
    <span class="nf">setContentView</span><span class="p">(</span><span class="n">binding</span><span class="p">.</span><span class="n">root</span><span class="p">)</span>
    
    <span class="c1">// 之后要调用 xml 中的某个控件还得加上 binding.</span>
    <span class="c1">// 如果不用 binding 也方便不到哪去</span>
<span class="p">}</span>
</code></pre></div></div>

<p>很容易发现，即使我们要绑定界面和 Activity，就要写上这么一大串的重复代码了（虽然可以自动生成）。如果代码量一大，这样的重复工作就会变得特别繁琐。</p>

<p>那 Compose 呢？</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">override</span> <span class="k">fun</span> <span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">:</span> <span class="nc">Bundle</span><span class="p">?)</span> <span class="p">{</span>  
    <span class="k">super</span><span class="p">.</span><span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">)</span>  

    <span class="nf">setContent</span> <span class="p">{</span>  
        <span class="c1">// 各种 Composable 函数</span>
    <span class="p">}</span>    
<span class="p">}</span>
</code></pre></div></div>

<p>真的是太简洁了有没有，如果要学习 Compose，主要就是学习那些 Composable 函数</p>

<h2 id="composable">@Composable</h2>

<p>只要给函数加上一个<code class="language-plaintext highlighter-rouge">@Compsable</code>注解，这个函数就是 Composable 的（废话</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Composable</span>
<span class="k">fun</span> <span class="nf">Ciallo</span><span class="p">()</span> <span class="p">{</span>
    <span class="nc">Text</span><span class="p">(</span><span class="s">"Ciallo~"</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>这就是个简单的 Composable 函数，可以被放到<code class="language-plaintext highlighter-rouge">setContent</code>里面，作用是显示<code class="language-plaintext highlighter-rouge">Ciallo~</code>这段文本</p>

<p>那些已经准备好的各种组件也都是有<code class="language-plaintext highlighter-rouge">@Compsable</code>的</p>

<h2 id="关于-context">关于 Context</h2>

<p>我们在做很多操作的时候都要用到 Context，即上下文，常用的 Activity 就是 Context 的派生类，也就是说 Activity 是 Context 的一种</p>

<p>如果我们要显示一个 Toast，那就要传入一个 Context</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 在 Activity 中是这样的</span>
<span class="nc">Toast</span><span class="p">.</span><span class="nf">makeText</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s">"我是文本"</span><span class="p">,</span> <span class="nc">Toast</span><span class="p">.</span><span class="nc">LENGTH_SHORT</span><span class="p">).</span><span class="nf">show</span><span class="p">()</span> 

<span class="c1">// 在 Fragment 中是这样的</span>
<span class="nc">Toast</span><span class="p">.</span><span class="nf">makeText</span><span class="p">(</span><span class="nf">requireActivity</span><span class="p">(),</span> <span class="s">"我也是文本"</span><span class="p">,</span> <span class="nc">Toast</span><span class="p">.</span><span class="nc">LENGTH_SHORT</span><span class="p">).</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>在 Composable 函数里面显然不能这样写，但是聪明的谷歌工程师也给出了方法，也就是下面这样</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 先获取当前的 Context</span>
<span class="kd">val</span> <span class="py">context</span> <span class="p">=</span> <span class="nc">LocalContext</span><span class="p">.</span><span class="n">current</span> 

<span class="c1">// 然后再用</span>
<span class="nc">Toast</span><span class="p">.</span><span class="nf">makeText</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="s">"我还是文本"</span><span class="p">,</span> <span class="nc">Toast</span><span class="p">.</span><span class="nc">LENGTH_SHORT</span><span class="p">).</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>
<h2 id="remember-和-mutablestateof">remember 和 mutableStateOf</h2>

<h2 id="关于-viewmodel">关于 ViewModel</h2>

<p>可以去<a href="2025-11-24-用%20VIewModel%20来连通一切.md#大人，时代变了">这里</a>看看</p>]]></content><author><name>Yi Yue</name></author><category term="Kotlin" /><category term="安卓" /><summary type="html"><![CDATA[写爽了]]></summary></entry><entry><title type="html">细碎的玩意·其一</title><link href="http://githubblog.yiyuemeow.com/posts/%E7%BB%86%E7%A2%8E%E7%9A%84%E7%8E%A9%E6%84%8F-%E5%85%B6%E4%B8%80/" rel="alternate" type="text/html" title="细碎的玩意·其一" /><published>2025-11-18T00:00:00+00:00</published><updated>2025-11-18T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E7%BB%86%E7%A2%8E%E7%9A%84%E7%8E%A9%E6%84%8F%C2%B7%E5%85%B6%E4%B8%80</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E7%BB%86%E7%A2%8E%E7%9A%84%E7%8E%A9%E6%84%8F-%E5%85%B6%E4%B8%80/"><![CDATA[<h3 id="有关语法">有关语法</h3>

<h4 id="有关循环">有关循环</h4>

<p>在Kotlin中有十分熟悉的for-in循环，终于不和while功能重复了</p>

<p>可是Kotlin不像py那样直接用range生成range</p>

<p>比如下边这样能得到一个$0≤x≤10$的范围</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">range</span> <span class="p">=</span> <span class="mi">0</span><span class="o">..</span><span class="mi">10</span> 
</code></pre></div></div>

<p>还有这样能得到$0≤x＜10$的范围</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">range</span> <span class="p">=</span> <span class="mi">0</span> <span class="n">until</span> <span class="mi">10</span> 
</code></pre></div></div>

<p>后面加个step就可以一次想加几次就加几次</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">range</span> <span class="p">=</span> <span class="mi">0</span> <span class="n">until</span> <span class="mi">10</span> <span class="n">step</span> <span class="mi">2</span>
</code></pre></div></div>

<p>如果想倒过来就可以像下面这样得到一个$[10, 1]$的区间</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">range</span> <span class="p">=</span> <span class="mi">10</span> <span class="n">downTo</span> <span class="mi">1</span>
</code></pre></div></div>

<p>怎么说呢，挺好的，就是要适应</p>

<h4 id="有关let">有关let</h4>

<p><code class="language-plaintext highlighter-rouge">let</code>是个作用域函数……</p>

<p>一般用于给某个对象判空，如果为空就不做那些事了不然会崩，比如</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">obj</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
	<span class="nf">println</span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="nf">toString</span><span class="p">())</span>
<span class="p">}</span>
</code></pre></div></div>

<p>和其它作用域函数一样，<code class="language-plaintext highlighter-rouge">it</code>在这个大括号里边表示对象本身</p>

<h4 id="有关try">有关try</h4>

<p><code class="language-plaintext highlighter-rouge">try</code>是用来看看一段代码在运行时会不会崩掉的，如果真的崩了也不会把整个程序带走</p>

<p>它的完整结构包含<code class="language-plaintext highlighter-rouge">try</code>、<code class="language-plaintext highlighter-rouge">catch</code>和<code class="language-plaintext highlighter-rouge">finally</code></p>

<p>GPT总结得很好</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
    <span class="c1">// 可能会引发异常的代码</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">e</span><span class="p">:</span> <span class="nc">ExceptionType</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// 处理异常的代码</span>
<span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
    <span class="c1">// 可选的代码块，不管是否发生异常都会执行</span>
<span class="p">}</span>
</code></pre></div></div>

<p>一般的<code class="language-plaintext highlighter-rouge">e: Exception</code>基本代表所有类型的异常</p>

<p>可以有很多个<code class="language-plaintext highlighter-rouge">catch</code>来捕获各种各样的异常，然后做出各种各样的应对方案</p>

<h4 id="有关列表">有关列表</h4>

<p>你可能需要：<a href="/posts/Lambda%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%A4%AA%E5%A4%9A%E4%BA%86%E6%89%80%E4%BB%A5%E8%BF%98%E6%98%AF%E5%8D%95%E7%8B%AC%E6%8B%BF%E5%87%BA%E6%9D%A5%E5%90%A7/">有关Lambda表达式</a></p>

<p>kt中初始化列表似乎和别的语言不太一样？</p>

<p>比如我要一个有20个元素的列表，其值均为5，可以这么写</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">list</span> <span class="p">=</span> <span class="nc">List</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span> <span class="p">{</span><span class="mi">5</span><span class="p">}</span>
</code></pre></div></div>

<p>有点太神奇了说实话</p>

<p>对可变列表也是一样的</p>

<p>如果想要元素按一定规律变化，可以这么写</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">mutableList</span> <span class="p">=</span> <span class="nc">MutableList</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span> <span class="p">{</span> <span class="s">"Element $it"</span> <span class="p">}</span>
</code></pre></div></div>

<p>元素的值分别为<code class="language-plaintext highlighter-rouge">"Element 0"</code>， <code class="language-plaintext highlighter-rouge">"Element 1"</code>……</p>

<p>然后当然也可以</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">mutableList</span> <span class="p">=</span> <span class="nc">MutableList</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span> <span class="p">{</span> <span class="n">it</span> <span class="p">*</span> <span class="mi">3</span> <span class="p">}</span>
</code></pre></div></div>

<p>这样它就是<code class="language-plaintext highlighter-rouge">[0, 3, 6, ..., 57]</code>了</p>

<p>这就是21世纪的语言吗太强悍了</p>

<p>唯一的问题是，如果想像其他语言一样已知元素创建列表时不能像上面那样</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">233</span><span class="p">,</span> <span class="mi">555</span><span class="p">,</span> <span class="mi">114</span><span class="p">]</span> <span class="c1"># 人家py多方便啊
</span></code></pre></div></div>

<p>kt要用<code class="language-plaintext highlighter-rouge">listof</code>来创建</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">list</span> <span class="p">=</span> <span class="nf">listof</span><span class="p">(</span><span class="mi">233</span><span class="p">,</span> <span class="mi">555</span><span class="p">,</span> <span class="mi">114</span><span class="p">)</span>
</code></pre></div></div>

<p>这大抵是因为kt里{}的作用太多了罢</p>

<p>说的就是你，Lambda 表达式！</p>

<hr />
<p>2025 年 11 月 18 日……</p>

<p>孩子们，一年之后我终于回来了，直接肘赢这一坨东西</p>

<p>事实上，上面那几个<code class="language-plaintext highlighter-rouge">List</code>的初始化都省略了一个传入的参数，即元素索引</p>

<p>这是初始化不省略的样子：</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// val mutableList = MutableList(20) { "Element $it" } </span>

<span class="kd">val</span> <span class="py">mutableList</span> <span class="p">=</span> <span class="nc">MutableList</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span> <span class="p">{</span> <span class="n">index</span><span class="p">:</span> <span class="nc">Int</span> <span class="p">-&gt;</span>
    <span class="s">"Element $index"</span>
<span class="p">}</span>
</code></pre></div></div>

<p>由于这个 lambda 表达式只有一个参数，于是我们可以把参数列表全部省略，然后用<code class="language-plaintext highlighter-rouge">it</code>来指代这个唯一的参数</p>
<h4 id="字符串处理">字符串处理</h4>

<p><code class="language-plaintext highlighter-rouge">replace</code>接收两个参数，将字符串中的对应字符替换成你想要的，比如</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">result</span> <span class="p">=</span> <span class="n">text</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="nc">Regex</span><span class="p">(</span><span class="s">"[ /\\\\:*?\"&lt;&gt;|]+"</span><span class="p">),</span> <span class="s">"_"</span><span class="p">)</span>
</code></pre></div></div>

<p>方括号中的所有字符都会被替换为下划线，+代表无论几个这些字符连在一起都通通变成一个下划线</p>

<p>如果变成这样，代表这些字符连在一起大于等于两个才会被替换</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">result</span> <span class="p">=</span> <span class="n">text</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="nc">Regex</span><span class="p">(</span><span class="s">"[ /\\\\:*?\"&lt;&gt;|]{2,}"</span><span class="p">),</span> <span class="s">"_"</span><span class="p">)</span>
</code></pre></div></div>

<p>既然能调下限，那也一定能改上限</p>

<p>这种比较新的语言都是这样轮子特别多的吗</p>

<h4 id="有关时间">有关时间</h4>

<blockquote>
  <p>其实都是 Java 的类啦</p>
</blockquote>

<p>可以用Java的<code class="language-plaintext highlighter-rouge">TimeUnit</code>对时间进行方便的转换</p>

<p>获取现在时间只需要<code class="language-plaintext highlighter-rouge">System.currentTimeMillis()</code>获取现在的毫秒时间</p>

<p>通过<code class="language-plaintext highlighter-rouge">TimeUnit.原单位.to新单位(数值)</code>就可以方便地得到一个新的单位的时间辣</p>

<p>如果要处理日程之类的东西……说实话用Java的<code class="language-plaintext highlighter-rouge">Calendar</code>会比较方便</p>

<h4 id="有关-vararg">有关 vararg</h4>

<p><code class="language-plaintext highlighter-rouge">vararg</code>意为 var-arg，即可变长度参数，它的用法长下面这样</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fun</span> <span class="nf">sumNumbers</span><span class="p">(</span><span class="k">vararg</span> <span class="n">numbers</span><span class="p">:</span> <span class="nc">Int</span><span class="p">):</span> <span class="nc">Int</span> <span class="p">=</span> <span class="n">numbers</span><span class="p">.</span><span class="nf">sum</span><span class="p">()</span>

<span class="nf">sumNumbers</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="c1">// 15</span>
</code></pre></div></div>

<p>一般来讲，这个<code class="language-plaintext highlighter-rouge">vararg</code>都要放在最后一个，不然就得变成命名参数了</p>

<p>像 Dart 一样，Kotlin 也是有展开操作符的，也就是把列表里面的元素全部展开，也就是下面这样</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">numbers</span> <span class="p">=</span> <span class="nf">intArrayOf</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>

<span class="nf">sumNumbers</span><span class="p">(*</span><span class="n">n</span><span class="p">)</span>
</code></pre></div></div>

<p>为了不发生奇怪的情况，一个函数最多只能有一个<code class="language-plaintext highlighter-rouge">vararg</code>参数</p>

<p>顺带一提，在 Java 中，可变长度参数长这样：</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">int</span> <span class="nf">sunNumbers</span><span class="o">(</span><span class="kt">int</span><span class="o">...</span> <span class="n">numbers</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">return</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">stream</span><span class="o">(</span><span class="n">numbers</span><span class="o">).</span><span class="na">sum</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></div></div>

<h4 id="其它语言特性">其它语言特性</h4>

<p>kt：孩子们，我也有三引号</p>

<h3 id="有关控件">有关控件</h3>

<p>超多控件，芝士雪豹，并不深但是广</p>

<p>其实就是属性超多啦</p>

<p>如果某个属性拥有多个值，可以在不同的值之间加上<code class="language-plaintext highlighter-rouge">|</code>，比如<code class="language-plaintext highlighter-rouge">android:layout_gravity="end|bottom"</code></p>

<p>如果没有特别指定，那在xml中下面的控件会把上面的盖住</p>

<p>还有个东西大大简化了控件的使用，详见<a href="/posts/%E6%9C%89%E5%85%B3Binding/">有关Binding</a></p>

<h4 id="有关textview">有关TextView</h4>

<p><code class="language-plaintext highlighter-rouge">textStyle</code>可以决定文字是否加粗或者斜体</p>

<p><code class="language-plaintext highlighter-rouge">typeface</code>可以决定文字的类型（只有一些简单的属性</p>

<p><code class="language-plaintext highlighter-rouge">fontFamily</code>可以决定文字的字体——和上一个属性有些相似呢，不过基本什么字体都能支持</p>

<p><code class="language-plaintext highlighter-rouge">paintFlags</code>可以给文字设置<u>下划线</u>和<del>删除线</del>，但只能在代码里边赋值，为什么？</p>

<p>像这样就是给它加一条下划线</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tipTextView</span><span class="p">.</span><span class="n">paintFlags</span> <span class="p">=</span> <span class="n">android</span><span class="p">.</span><span class="n">graphics</span><span class="p">.</span><span class="nc">Paint</span><span class="p">.</span><span class="nc">UNDERLINE_TEXT_FLAG</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">STRIKE_THRU_TEXT_FLAG</code>则是添加删除线<del>可是似乎只能同时应用一个属性</del></p>

<p>我有预感这些属性在别的有文字的控件里边也可以用</p>

<p>类似语言，在不同的values文件夹里能设置它的字体颜色之类的属性，这样就能支持深色模式了</p>

<h4 id="有关edittext">有关EditText</h4>

<p><code class="language-plaintext highlighter-rouge">hint</code>是设置提示文本</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">android</span><span class="p">:</span><span class="n">background</span><span class="p">=</span><span class="s">"@android:color/transparent"</span>
</code></pre></div></div>

<p>可以让下划线滚蛋</p>

<h4 id="有关button">有关Button</h4>

<p>使用<code class="language-plaintext highlighter-rouge">MaterialButton</code>，更现代化且更易配置！</p>

<p>可以轻松设置边框</p>

<h4 id="有关imageview">有关ImageView</h4>

<p>可以用<code class="language-plaintext highlighter-rouge">scaleType</code>这个属性来控制图片的缩放方式</p>

<p>比如<code class="language-plaintext highlighter-rouge">fitXY</code>是拉伸，<code class="language-plaintext highlighter-rouge">centerCrop</code>是保持比例使图片越界填充整个<code class="language-plaintext highlighter-rouge">ImageView</code>，centerInside则不会让图片越界，只会尽可能填满</p>

<h4 id="有关searchview">有关SearchView</h4>

<p><code class="language-plaintext highlighter-rouge">iconifiedByDefault="false"</code>表示默认情况下展开搜索框</p>

<p>如果想在菜单里面加上搜索，可以添加一个这样的<code class="language-plaintext highlighter-rouge">item</code></p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;menu</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;item</span>
        <span class="na">android:id=</span><span class="s">"@+id/action_search"</span>
        <span class="na">android:icon=</span><span class="s">"@drawable/ic_search"</span>
        <span class="na">android:title=</span><span class="s">"Search"</span>
        <span class="na">android:showAsAction=</span><span class="s">"ifRoom|collapseActionView"</span>
        <span class="na">android:actionViewClass=</span><span class="s">"androidx.appcompat.widget.SearchView"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/menu&gt;</span>
</code></pre></div></div>

<p>在代码中可以用<code class="language-plaintext highlighter-rouge">setOnQueryTextListener</code>来监听搜索输入，像下面一样</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">searchView</span><span class="p">.</span><span class="nf">setOnQueryTextListener</span><span class="p">(</span><span class="kd">object</span> <span class="err">: </span><span class="nc">SearchView</span><span class="p">.</span><span class="nc">OnQueryTextListener</span> <span class="p">{</span>
    <span class="k">override</span> <span class="k">fun</span> <span class="nf">onQueryTextSubmit</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nc">String</span><span class="p">?):</span> <span class="nc">Boolean</span> <span class="p">{</span>
        <span class="c1">// 用户提交搜索时触发</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">query</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
            <span class="nf">performSearch</span><span class="p">(</span><span class="n">query</span><span class="p">)</span> <span class="c1">// 执行搜索逻辑</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="k">true</span>
    <span class="p">}</span>

    <span class="k">override</span> <span class="k">fun</span> <span class="nf">onQueryTextChange</span><span class="p">(</span><span class="n">newText</span><span class="p">:</span> <span class="nc">String</span><span class="p">?):</span> <span class="nc">Boolean</span> <span class="p">{</span>
        <span class="c1">// 用户每次输入变化时触发</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">newText</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
            <span class="nf">updateSearchResults</span><span class="p">(</span><span class="n">newText</span><span class="p">)</span> <span class="c1">// 实时更新搜索结果</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="k">true</span>
    <span class="p">}</span>
<span class="p">})</span>
</code></pre></div></div>

<p><del>GPT总结得真好是吧</del></p>

<p>如果是在菜单里面，就要在 <code class="language-plaintext highlighter-rouge">onCreateOptionsMenu</code> 里边初始化了</p>

<p>这玩意还能和 <code class="language-plaintext highlighter-rouge">RecyclerView</code> 一起用，实现有趣的效果</p>

<h4 id="有关recyclerview">有关RecyclerView</h4>

<p>需要写适配器的神奇东西</p>

<h5 id="有关adapter">有关Adapter</h5>

<h6 id="有关notifyitemchanged">有关notifyItemChanged</h6>

<p>它是<code class="language-plaintext highlighter-rouge">Adapter</code>里面的一个方法，可以更新某个项的数据</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">notifyItemChanged</span><span class="p">(</span><span class="n">adapterPosition</span><span class="p">)</span>
</code></pre></div></div>

<p>这行代码的意思是更新<strong>当前位置</strong>的项</p>

<p>执行了这行代码就会让这一项重新绑定一次<code class="language-plaintext highlighter-rouge">ViewHolder</code>，从而防止一些奇奇怪怪的bug（比如很多个项共用一个变量）</p>

<p>这样做还能获赠动画效果</p>

<h4 id="有关viewpager">有关ViewPager</h4>

<p>同样要写适配器的神奇东西，可以实现不同页面之间的滑动切换</p>

<p>现已全面升级为<code class="language-plaintext highlighter-rouge">ViewPager2</code></p>

<h5 id="有关adapter-1">有关Adapter</h5>

<p>下面就是一个<del>GPT写的</del>有关<code class="language-plaintext highlighter-rouge">Adapter</code>的示例</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">ViewPagerAdapter</span><span class="p">(</span><span class="n">activity</span><span class="p">:</span> <span class="nc">FragmentActivity</span><span class="p">)</span> <span class="p">:</span> <span class="nc">FragmentStateAdapter</span><span class="p">(</span><span class="n">activity</span><span class="p">)</span> <span class="p">{</span>

    <span class="k">private</span> <span class="kd">val</span> <span class="py">fragments</span> <span class="p">=</span> <span class="nf">listOf</span><span class="p">(</span>
        <span class="nc">HomepageFragment</span><span class="p">(),</span>
        <span class="nc">StatsFragment</span><span class="p">(),</span>
        <span class="nc">SettingsFragment</span><span class="p">()</span>
    <span class="p">)</span>

    <span class="k">override</span> <span class="k">fun</span> <span class="nf">getItemCount</span><span class="p">()</span> <span class="p">=</span> <span class="n">fragments</span><span class="p">.</span><span class="n">size</span>

    <span class="k">override</span> <span class="k">fun</span> <span class="nf">createFragment</span><span class="p">(</span><span class="n">position</span><span class="p">:</span> <span class="nc">Int</span><span class="p">):</span> <span class="nc">Fragment</span> <span class="p">=</span> <span class="n">fragments</span><span class="p">[</span><span class="n">position</span><span class="p">]</span>

<span class="p">}</span>
</code></pre></div></div>

<h3 id="有关布局">有关布局</h3>

<p>在那些并不智能的布局里（也就是除了<code class="language-plaintext highlighter-rouge">ConstraintLayout</code>）都要用一大串<code class="language-plaintext highlighter-rouge">layout</code>来决定控件的位置</p>

<p><code class="language-plaintext highlighter-rouge">layout_gravity</code>是用来决定这个控件以哪条边为基准，比如</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>android:layout_gravity="end|bottom"
</code></pre></div></div>

<p>这样能让这个控件以右下角为原点</p>

<h4 id="有关constraintlayout">有关ConstraintLayout</h4>

<p>这玩意简直是超级神器，太好使了</p>

<p>如果要使一个控件的尺寸随别的控件变化，只要把它的尺寸设为<code class="language-plaintext highlighter-rouge">0dp</code>，然后设置这个方向上对其哪个控件（的两条边）就好</p>

<h3 id="杂项">杂项</h3>

<h4 id="有关mediaplayer">有关MediaPlayer</h4>

<p>这玩意有个神奇的特性那就是即使所处的界面关闭了还会继续播放</p>

<p>所以比较方便的做法就是在界面关闭时把播放一起关了</p>

<p>如果播放操作是在ViewModel中写的，那就可以专门准备个MediaPlayer然后每次播放都重新初始化一次，界面关闭也别忘了释放资源</p>

<h4 id="有关bitmap">有关Bitmap</h4>

<p><code class="language-plaintext highlighter-rouge">Bitmap</code>是个保存了图像信息的对象</p>

<p>可以通过很多方式创建</p>

<p>比如从资源文件</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">bitmap</span> <span class="p">=</span> <span class="nc">BitmapFactory</span><span class="p">.</span><span class="nf">decodeResource</span><span class="p">(</span><span class="n">context</span><span class="p">.</span><span class="n">resources</span><span class="p">,</span> <span class="nc">R</span><span class="p">.</span><span class="n">drawable</span><span class="p">.</span><span class="n">image</span><span class="p">)</span> <span class="c1">// decode，意为解码</span>
</code></pre></div></div>

<p>从文件</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">file</span> <span class="p">=</span> <span class="nc">File</span><span class="p">(</span><span class="s">"/path/to/image.jpg"</span><span class="p">)</span>
<span class="kd">val</span> <span class="py">bitmap</span> <span class="p">=</span> <span class="nc">BitmapFactory</span><span class="p">.</span><span class="nf">decodeFile</span><span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="n">absolutePath</span><span class="p">)</span>
</code></pre></div></div>

<p>从输入流</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">inputStream</span> <span class="p">=</span> <span class="nc">FileInputStream</span><span class="p">(</span><span class="s">"image.jpg"</span><span class="p">)</span>
<span class="kd">val</span> <span class="py">bitmap</span> <span class="p">=</span> <span class="nc">BitmapFactory</span><span class="p">.</span><span class="nf">decodeStream</span><span class="p">(</span><span class="n">inputStream</span><span class="p">)</span>
</code></pre></div></div>

<p>还可以生成空白的来画画</p>

<p><code class="language-plaintext highlighter-rouge">Bitmap</code>可以用<code class="language-plaintext highlighter-rouge">compress()</code>来把图像压缩成别的格式的文件</p>

<h4 id="有关语言平时说的那个">有关语言（平时说的那个</h4>

<p>一般的语言文件夹格式是</p>

<p><code class="language-plaintext highlighter-rouge">values-zh-CN</code>这样，有language和region两部分</p>

<p>当然region省略也是可以的</p>

<p>如果是自定义语言，可以这样</p>

<p><code class="language-plaintext highlighter-rouge">values-b+zh+ME</code></p>

<h4 id="有关attachbasecontext">有关attachBaseContext</h4>

<p>这玩意是更新资源文件的一个方法，接收一个Context然后更新现在的页面</p>

<p>可以用来更新页面语言</p>

<h4 id="有关contextcompat">有关ContextCompat</h4>

<p>这玩意可以获取一个资源的示例，用法是<code class="language-plaintext highlighter-rouge">ContextCompat.get啥啥啥(context, id)</code></p>

<p>这样就能在代码中一遍应用多种不同模式下的资源</p>

<h4 id="不知道该放到哪里的东西">不知道该放到哪里的东西</h4>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">lifecycleScope</span><span class="p">.</span><span class="nf">launch</span> <span class="p">{</span>
            <span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span> <span class="p">{</span>
                <span class="nf">delay</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span>
                <span class="n">lifecycleScope</span><span class="p">.</span><span class="nf">launch</span><span class="p">(</span><span class="nc">Dispatchers</span><span class="p">.</span><span class="nc">Main</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nf">reloadFragment</span><span class="p">(</span><span class="k">this</span><span class="nd">@HomepageFragment</span><span class="p">)</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">this</code>还能这么用？！</p>

<p>好吧其实就是指定是哪个<code class="language-plaintext highlighter-rouge">this</code></p>

<h3 id="有关习惯">有关习惯</h3>

<p>一定，一定要记得初始化啊！</p>

<h3 id="特别鸣谢chatgpt">特别鸣谢：ChatGPT</h3>]]></content><author><name>Yi Yue</name></author><category term="Kotlin" /><category term="安卓" /><summary type="html"><![CDATA[这些东西都超碎超散的]]></summary></entry><entry><title type="html">无穷的级数</title><link href="http://githubblog.yiyuemeow.com/posts/%E6%97%A0%E7%A9%B7%E7%9A%84%E7%BA%A7%E6%95%B0/" rel="alternate" type="text/html" title="无穷的级数" /><published>2025-06-21T00:00:00+00:00</published><updated>2025-06-21T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E6%97%A0%E7%A9%B7%E7%9A%84%E7%BA%A7%E6%95%B0</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E6%97%A0%E7%A9%B7%E7%9A%84%E7%BA%A7%E6%95%B0/"><![CDATA[<h1 id="无穷级数">无穷级数</h1>

<p>我觉得这玩意也可以叫做项数无限的数列吧</p>

<p>如果一个级数 $\displaystyle \sum_{i=1}^{\infty} u_i$ 的部分和数列 ${ s_n }$ <strong>有极限</strong>，就是</p>

\[\lim_{n \to \infty} s_n = s\]

<p>那 $\displaystyle \sum_{i=1}^{\infty} u_i$ 就是<strong>收敛</strong>的，反之则<strong>发散</strong></p>

<h2 id="正项级数">正项级数</h2>

<p>插播一条：对 $\displaystyle \sum_{n=1}^{\infty} \frac{1}{n^p}$ ，如果 $p&gt;1$ 则收敛， $p \leq 1$ 则发散</p>

<p>每一项都是正数的级数就是<strong>正项级数</strong></p>

<p>显然对于 $\displaystyle \sum_{n=1}^{\infty} u_n$ 和 $\displaystyle \sum_{n=1}^{\infty} v_n$ 两个正项级数，如果 $u_n\leq v_n$ 恒成立，且 $\displaystyle \sum_{n=1}^{\infty} v_n$ 收敛，那 $\displaystyle \sum_{n=1}^{\infty} u_n$ 也收敛；而如果 $\displaystyle \sum_{n=1}^{\infty} u_n$ 发散，那 $\displaystyle \sum_{n=1}^{\infty} v_n$ 也发散（这叫<strong>比较审敛法</strong>）</p>

<p>比较审敛法还有极限形式，如果 $\displaystyle\lim_{n \to \infty}\frac{u_n}{v_n}=l(0 \leq l \leq +\infty)$ 且 $\displaystyle \sum_{n=1}^{\infty} v_n$ 收敛，那 $\displaystyle \sum_{n=1}^{\infty} u_n$ 也收敛（就是说 $u_n$ 是 $v_n$ 的 $l$ 倍），反之如果 $\displaystyle\lim_{n \to \infty}\frac{u_n}{v_n}=l&gt;0$ 且 $\displaystyle \sum_{n=1}^{\infty} v_n$ 发散，那 $\displaystyle \sum_{n=1}^{\infty} v_n$ 也发散</p>

<p>如果对正项级数 $\displaystyle \sum_{n=1}^{\infty} u_n$ 有</p>

\[\lim_{n\to \infty}\frac{u_{n+1}}{u_n}=\rho\]

<p>$\rho&lt;1$ 那级数收敛， $\rho&gt;1$ 那级数发散， $\rho=1$ 那就不能用这个方法（<strong>比值审敛法</strong>）</p>

<p>如果</p>

<p>\(\lim_{n\to \infty}\sqrt[n]{u_n}=\rho\)
$\rho&lt;1$ 那级数收敛， $\rho&gt;1$ 那级数发散， $\rho=1$ 那就不能用这个方法（<strong>根值审敛法</strong>）</p>

<p>如果对正项级数 $\displaystyle \sum_{n=1}^{\infty} u_n$ 有</p>

\[\lim_{n\to\infty}nu_n=l&gt;0\]

<p>那它就发散，另外如果 $p&gt;1$ 又有</p>

<p>\(\lim_{n\to\infty}n^pu_n=l~(0\leq l &lt;+\infty)\)
那它就收敛</p>

<h2 id="交错级数">交错级数</h2>

<p>交错级数就是一个正一个负的级数</p>

<p>对于交错级数  $\displaystyle \sum_{n=1}^{\infty} (-1)^{n-1}u_n$ ，如果同时满足 $u_n \geq u_{n+1}$ 和 $\displaystyle\lim_{n\to\infty}u_n=0$ ，那它就是收敛的，还有和 $s&lt;u_1$ 啥的显然易得结论</p>

<p>这个结论叫做<strong>莱布尼兹定理</strong></p>

<table>
  <tbody>
    <tr>
      <td>对于任意级数 $\displaystyle \sum_{n=1}^{\infty} u_n$ ，如果 $\displaystyle \sum_{n=1}^{\infty}</td>
      <td>u_n</td>
      <td>$ 收敛，那这个级数<strong>绝对收敛</strong>，如果 $\displaystyle \sum_{n=1}^{\infty}</td>
      <td>u_n</td>
      <td>$ 发散但 $\displaystyle \sum_{n=1}^{\infty} u_n$ 收敛，那这个级数<strong>条件收敛</strong></td>
    </tr>
  </tbody>
</table>

<h2 id="幂级数">幂级数</h2>

<p>像 $\displaystyle \sum_{n=0}^{\infty} a_nx^n = a_0+a_1x+a_2x^2+\cdots+a_nx^n+\cdots$ 这样的级数就是<strong>幂级数</strong></p>

<table>
  <tbody>
    <tr>
      <td>显然如果 $\displaystyle \sum_{n=0}^{\infty} a_nx^n$ 在 $x=x_0(x\neq0)$ 的时候收敛，那这个级数对所有 $</td>
      <td>x</td>
      <td>&lt;</td>
      <td>x_0</td>
      <td>$ 的 $x$ 都是<strong>绝对收敛</strong>的；反之如果在 $x=x_0$ 的时候发散，那这个级数对所有 $</td>
      <td>x</td>
      <td>&gt;</td>
      <td>x_0</td>
      <td>$ 的 $x$ 都是<strong>发散</strong>的</td>
    </tr>
  </tbody>
</table>

<p>通过这点，专家推断出幂级数 $\displaystyle \sum_{n=0}^{\infty} a_nx^n$ 存在一个范围 $R$ ，所有绝对值小于 $R$ 的 $x$ 都会使其<strong>绝对收敛</strong>，绝对值大于 $R$ 的 $x$ 都会使其<strong>发散</strong>，而 $x=R$ 或 $x=-R$ 时收敛和发散就不好说了</p>

<p>专家管 $R$ 叫这个级数的<strong>收敛半径</strong>， $(-R,R)$ 叫它的<strong>收敛区间</strong></p>

<p>那这个收敛半径要怎么算呢？非常简单</p>

<p>还是对 $\displaystyle \sum_{n=0}^{\infty} a_nx^n$ 这个级数，如果</p>

\[\lim_{n\to\infty} \left| \frac{a_{n+1}}{a_n} \right|=\rho\]

<p>如果 $\rho\neq0$ 或 $\rho\neq\infty$ ，那 $\displaystyle R=\frac{1}{\rho}$ ，否则 $R=+\infty(\rho=0)$ 或 $R=0(\rho=+\infty)$</p>

<p>你也可以用</p>

\[\lim_{n\to\infty} \left| \frac{a_{n+1} x^{n+1}}{a_n x^n} \right|&lt;1\]

<p>这个式子来求收敛半径（如果熟练了的话</p>

<h3 id="有关幂级数的和函数">有关幂级数的和函数</h3>

<p>专家把 $\displaystyle \sum_{n=0}^{\infty} a_nx^n$ 的和函数记作 $s(x)$ ，它有许多性质</p>

<ul>
  <li>$s(x)$ 在 $\displaystyle \sum_{n=0}^{\infty} a_nx^n$ 的收敛域 $I$ 上亦收敛</li>
  <li>$s(x)$ 在 $I$ 上<strong>可导也可积</strong></li>
</ul>

<p>积分和求导都要<strong>逐项</strong>来求</p>

<p>这是积分：</p>

\[\int_0^xs(t)dt=\int_0^x[\sum_{n=0}^{\infty}a_nt^n]dt=\sum_{n=0}^{\infty}\int_0^xa_nt^ndt=\sum_{n=0}^{\infty}\frac{a_n}{n+1}x^{n+1}\]

<p>这是求导：</p>

\[s'(x)=(\sum_{n=0}^{\infty}a_nx^n)'=\sum_{n=0}^{\infty}(a_nx^n)'=\sum_{n=0}^{\infty}na_nx^{n-1}\]

<p>这样积分和求导得到的新的幂函数的收敛半径不变</p>

<p>很多时候题目都会要求某个幂级数的和函数，这时除了要用上面的两种计算外，还要动用一些之前已经知道的<a href="/posts/%E5%B8%B8%E7%94%A8%E5%AF%BC%E6%95%B0-%E7%A7%AF%E5%88%86%E4%BB%A5%E5%8F%8A%E7%AD%89%E4%BB%B7%E6%97%A0%E7%A9%B7%E5%B0%8F/#泰勒">展开</a>，这些展开在下面一节也要大量使用</p>

<h2 id="把函数展开成幂级数">把函数展开成幂级数</h2>

<p>原理懒得看了，反正也看不懂，只需要记住那些已知的展开，就能凑出来别的了</p>

<p>但还是再写一遍吧，还是有些补充的</p>

\[\begin{align}
&amp;e^x=\sum_{n=0}^\infty \frac{1}{n!}x^n ~(-\infty&lt;x&lt;+\infty) \\
&amp;\sin x = \sum_{n=0}^\infty \frac{(-1)^n}{(2n+1)!}x^{2n+1} ~(-\infty&lt;x&lt;+\infty) \\
&amp;\frac{1}{1+x}=\sum_{n=0}^\infty(-1)^nx^n ~(-1&lt;x&lt;1) \\
&amp;\frac{1}{1-x}=\sum_{n=0}^\infty x^n ~(-1&lt;x&lt;1) \\
&amp;\ln(1+x)=\sum_{n=0}^\infty\frac{(-1)^n}{n+1}x^{n+1}=\sum_{n=1}^\infty\frac{(-1)^{n-1}}{n}x^{n} ~(-1&lt;x&lt;1) \\
&amp;\cos x = \sum_{n=0}\frac{(-1)^n}{(2n)!}x^{2n} ~(-1&lt;x&lt;1) \\
&amp;a^x=e^{x\ln a}=\sum_{n=0}^\infty \frac{(\ln a)^n}{n!}x^n ~(-\infty&lt;x&lt;+\infty) \\
&amp;\frac{1}{1+x^2}=\sum_{n=0}^\infty (-1)^n x^{2n} ~(-1&lt;x&lt;1) \\
&amp;\arctan x=\sum_{n=0}^\infty \frac{(-1)^n}{2n+1}x^{2n+1} ~(-1\leq x \leq 1)
\end{align}\]

<p>专家说反正只要记住前六个那别的都基本可以推出来了，算别的那都是凑</p>

<p>比如说专家要让你把 $\displaystyle f(x)=\frac{1}{x^2+4x+3}$ 展开成 $(x-1)$ 的幂级数，那首先就要</p>

\[\begin{align}
f(x)&amp;=\frac{1}{x^2+4x+3} = \frac{1}{(x+1)(x+3)}=\frac{1}{2(x+1)}-\frac{1}{2(x+3)} \\
&amp;=\frac{1}{4(1+\frac{x-1}{2})}-\frac{1}{8(1+\frac{x-1}{4})} \\
&amp;=\frac{1}{4}\sum_{n=0}^\infty (-1)^n (\frac{x-1}{2})^n - \frac{1}{8}\sum_{n=0}^\infty (-1)^n(\frac{x-1}{4})^n \\
&amp;=\sum_{n=0}^\infty (-1)^n (\frac{1}{2^{n+2}}-\frac{1}{2^{n+3}})(x-1)^n ~(-1&lt;x&lt;3)
\end{align}\]

<p>最后得出的范围是两个展开的范围的交集</p>

<p>用到别的展开式那也是差不多的</p>

<p>这个展开还能拿来算某些东西的近似值，不过很难算就是了</p>

<h2 id="傅里叶级数">傅里叶级数</h2>

<p>傅里叶级数就是把函数展开成三角函数组成的级数</p>

<p>大概是这样：</p>

\[\frac{a_0}{2}+\sum_{n=1}^\infty (a_n\cos nx+b_n \sin nx)\]

<p>然后这两个 $a$ 和 $b$ 的计算方法是</p>

\[\begin{align}
&amp;a_n=\frac{1}{\pi}\int_{-\pi}^{\pi}f(x)\cos nx dx ~(n=0,1,2,3,\cdots), \\
&amp;b_n = \frac{1}{\pi}\int_{-\pi}^{\pi}f(x)\sin nxdx ~(n=1,2,3,\cdots)
\end{align}\]

<p>展开直接套公式喵，上面的系数叫做<strong>傅里叶系数</strong>，那个式子就是一个周期为 $2\pi$ 的函数的<strong>傅里叶级数</strong>本尊</p>

<p>如果这个函数 $f(x)$ 在一个周期只有有限个第一类间断点和有限个极值点，那么在它的连续点上，级数收敛于 $f(x)$ ，在间断点上，级数收敛于两端极限的平均值，即 $\frac12 [f(x^-)+f(x^+)]$</p>

<p>如果 $f(x)$ 是<strong>奇函数</strong>或<strong>偶函数</strong>的话，得到的傅里叶级数也是不一样的</p>

<p>如果 $f(x)$ 是奇函数，那么 $f(x)\cos nx$ 是奇函数， $f(x)\sin nx$ 是偶函数，于是上面的式子就能变成</p>

\[\begin{align}
&amp;a_n=0, \\
&amp;b_n = \frac{2}{\pi}\int_{0}^{\pi}f(x)\sin nxdx ~(n=1,2,3,\cdots)
\end{align}\]

<p>对应的傅里叶级数叫做<strong>正弦级数</strong>，长这样</p>

\[\sum_{n=1}^\infty b_n\sin nx\]

<p>如果 $f(x)$ 是偶函数，那也有 $f(x)\cos nx$ 是偶函数， $f(x)\sin nx$ 是奇函数，得到</p>

\[\begin{align}
&amp;a_n=\frac{2}{\pi}\int_{0}^{\pi}f(x)\cos nx dx ~(n=0,1,2,3,\cdots), \\
&amp;b_n = 0
\end{align}\]

<p>得到的傅里叶级数就是<strong>余弦级数</strong></p>

\[\frac{a_0}{2}+\sum_{n=1}^\infty a_n \cos nx\]

<p>如果 $f(x)$ 的周期不是 $2\pi$ 的话，</p>]]></content><author><name>Yi Yue</name></author><category term="数学" /><category term="高数" /><summary type="html"><![CDATA[凑凑就好了]]></summary></entry><entry><title type="html">我也想成为曲线和曲面积分大佬</title><link href="http://githubblog.yiyuemeow.com/posts/%E6%88%91%E4%B9%9F%E6%83%B3%E6%88%90%E4%B8%BA%E6%9B%B2%E7%BA%BF%E5%92%8C%E6%9B%B2%E9%9D%A2%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC/" rel="alternate" type="text/html" title="我也想成为曲线和曲面积分大佬" /><published>2025-06-20T00:00:00+00:00</published><updated>2025-06-20T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E6%88%91%E4%B9%9F%E6%83%B3%E6%88%90%E4%B8%BA%E6%9B%B2%E7%BA%BF%E5%92%8C%E6%9B%B2%E9%9D%A2%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E6%88%91%E4%B9%9F%E6%83%B3%E6%88%90%E4%B8%BA%E6%9B%B2%E7%BA%BF%E5%92%8C%E6%9B%B2%E9%9D%A2%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC/"><![CDATA[<h1 id="那一天的线面弯曲起来">那一天的线面，弯曲起来</h1>

<h2 id="曲线积分">曲线积分</h2>

<p>很多时候，曲线上的每一小段质量是可以不一样的（线密度），而算整个曲线的质量就要用到曲线积分</p>

<p>出于某些非常数学的原因，曲线积分被分成了对坐标的和对面积的两类</p>

<h3 id="对弧长的">对弧长的</h3>

<p>如果有个曲线的参数方程长这样</p>

\[\left\{ \begin{align} 
x=\phi(t) \\
y=\psi(t)
 \end{align} \right.
~~~
(\alpha \leq t \leq \beta)\]

<p>在这条线上有 $f(x,y)$ ，那这条线上对应的对弧长的曲线积分写成下面这样</p>

\[\int_L f(x,y)ds = \int_{\alpha}^{\beta} f[\phi(t),\psi(t)]\sqrt{\phi'^2(t)+\psi'^2(t)}dt ~~~
(\alpha &lt; \beta)\]

<p>没有证明，因为我也不会证</p>

<p>如果曲线是闭合的， 就要在积分号上加个⚪：</p>

\[\oint_L f(x,y)ds\]

<p>对弧长的曲线积分就是长这样的，由于另一种曲线积分的形式十分明显，很容易分清二者</p>

<h3 id="对坐标的">对坐标的</h3>

<p>还是有个曲线的参数方程长这样</p>

\[\left\{ \begin{aligned} 
x=\phi(t) \\
y=\psi(t)
 \end{aligned} \right.
~~~
(\alpha \leq t \leq \beta)\]

<p>在这条线上有 $P(x,y)$ 和 $Q(x,y)$ ，又有两个点 $A$ 和 $B$ ，那这段的积分就是</p>

\[\begin{align} 
&amp;\int_L P(x,y)dx + Q(x,y)dy \\
=&amp;\int_{\alpha}^{\beta} \{ P[\phi(t),\psi(t)]\phi'(t) + Q[\phi(t),\psi(t)]\psi'(t) \} dt

\end{align}\]

<p>你学废了吗，套公式就完了</p>

<p>这类曲线积分题目都会给出两个点的坐标的，所以特别容易分清楚</p>

<h3 id="格林公式">格林公式</h3>

<p>如果一个区域 $D$ 被光滑的曲线 $L$ 围起来，又有 $P(x,y)$ 和 $Q(x,y)$ ，那么就有</p>

\[\iint\limits_D (\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y}) dxdy = \oint_L Pdx+Qdy\]

<p>$L$ 是 $D$ 边界的正向曲线，就是往这个方向走，被包围的区域都在左手边</p>

<p>需要注意的是，如果这个区域包含了未定义点，那就需要在这个未定义点周围再套一个小圈，然后对两条线之间的区域应用格林公式</p>

<h3 id="路径无关">路径无关</h3>

<p>路径无关就是说一个点到另一个点无论是怎么个走法，结果都是一样的，此事在物理的势能中亦有记载</p>

<p>对于 $\int_L Pdx+Qdy$ ，只要满足 $\displaystyle \frac{\partial P}{\partial y} = \frac{\partial Q}{\partial x}$ ，那这个曲线积分就是路径无关的</p>

<h2 id="曲面积分">曲面积分</h2>

<p>曲面积分和曲线积分是差不多的，就是多了个维度</p>

<h3 id="对面积的">对面积的</h3>

<p>如果有个光滑曲面 $\Sigma$ 由 $z=z(x,y)$ 决定，那么曲面积分就是</p>

<p>\(\boxed{
\iint\limits_{\Sigma} f(x,y,z)dS=\iint\limits_{D_{xy}}f[x,y,z(x,y)]\sqrt{1+z_x^2(x,y)+z_y^2(x,y)} dxdy}\)
只有出现 $dS$ 这样的曲面积分才是对对面积的曲面积分， $D_{xy}$ 是曲面在 $xOy$ 上的投影</p>

<h3 id="对坐标的-1">对坐标的</h3>

<p>对于一个曲面 $\Sigma$ ，它的对坐标的曲面积分是分方向的，通常题目都会给，方向不同会导致积分结果相反（一般都是外侧）</p>

<p>比如说有个</p>

\[\iint\limits_{\Sigma} R(x,y,z) dxdy\]

<p>那有</p>

<p>\(\iint\limits_{\Sigma} R(x,y,z) dxdy = \pm\iint\limits_{D_{xy}} R(x,y,z(x,y)) dxdy\)
同理亦有</p>

\[\iint\limits_{\Sigma} R(x,y,z) dxdz = \pm\iint\limits_{D_{xz}} R(x,y(x,z),z) dxdz\]

\[\iint\limits_{\Sigma} R(x,y,z) dydz = \pm\iint\limits_{D_{yz}} R(x(y,z),y,z) dydz\]

<p>所以怎么变其实是看积分变量，很多时候还要把曲面切成几部分来算</p>

<h3 id="高斯公式">高斯公式</h3>

<p>像格林公式一样，曲面积分也有相似的高斯公式（等式右边其实是两条撬棍，但是这里打不出来）</p>

\[\iiint\limits_{\Omega}(\frac{\partial P}{\partial x}+\frac{\partial Q}{\partial y}+\frac{\partial R}{\partial z})dV = \oint\limits_{\Sigma}Pdydz+Qdzdx+Rdxdy\]

<p>或者是</p>

\[\iiint\limits_{\Omega}(\frac{\partial P}{\partial x}+\frac{\partial Q}{\partial y}+\frac{\partial R}{\partial z})dV = \oint\limits_{\Sigma}(P\cos \alpha+Q\cos \beta+R\cos \gamma)dS\]

<p>$\Sigma$ 是 $\Omega$ 整个边界的曲面的<strong>外侧</strong>， $\cos \alpha$， $\cos \beta$ 和 $\cos \gamma$ 是 $\Sigma$ 在 $(x,y,z)$ 那里的<strong>法向量的方向余弦</strong></p>

<p>这两个式子都是高斯公式</p>

<p>曲面积分也有类似于路径无关的东西，但是并不考（</p>

<h2 id="斯托克斯公式">斯托克斯公式</h2>

<p>$\Gamma$ 是条分段光滑的空间有向<strong>闭曲线</strong>， $\Sigma$ 是以 $\Gamma$ <strong>为边界</strong>的分片光滑的有向曲面，然后这两玩意又符合右手规则（就是那个右手螺旋定则，拇指指着 $\Sigma$ 的法向量，而四指指向 $\Gamma$ 的方向），那就有</p>

\[\iint\limits_{\Sigma}(\frac{\partial R}{\partial y}-\frac{\partial Q}{\partial z})dydz+(\frac{\partial P}{\partial z}-\frac{\partial R}{\partial x})dzdx+(\frac{\partial Q}{\partial x}-\frac{\partial P}{\partial y})dxdy = \oint_{\Gamma} Pdx+Qdy+Rdz\]

<p>这一坨就是<strong>斯托克斯公式</strong>，将 $xyz$ 排列组合之后对另一个变量求偏导</p>

<p>记不住怎么办呢，事实上等式左边相当于</p>

\[\left | \begin {matrix} 
\boldsymbol{i} &amp; \boldsymbol{j} &amp; \boldsymbol{k} \\
\frac{\partial}{\partial x} &amp; \frac{\partial}{\partial y} &amp; \frac{\partial}{\partial z} \\
P &amp; Q &amp; R
\end {matrix} \right | = 
(\frac{\partial R}{\partial y}-\frac{\partial Q}{\partial z})\boldsymbol{i}+(\frac{\partial P}{\partial z}-\frac{\partial R}{\partial x})\boldsymbol{j}+(\frac{\partial Q}{\partial x}-\frac{\partial P}{\partial y})\boldsymbol{k}\]

<p>然后再换成 $\displaystyle(\frac{\partial R}{\partial y}-\frac{\partial Q}{\partial z})dydz+(\frac{\partial P}{\partial z}-\frac{\partial R}{\partial x})dzdx+(\frac{\partial Q}{\partial x}-\frac{\partial P}{\partial y})dxdy$ 就好了</p>]]></content><author><name>Yi Yue</name></author><category term="数学" /><category term="高数" /><summary type="html"><![CDATA[那一天的线面，弯曲起来]]></summary></entry><entry><title type="html">我能成为重积分大佬吗？</title><link href="http://githubblog.yiyuemeow.com/posts/%E6%88%91%E8%83%BD%E6%88%90%E4%B8%BA%E9%87%8D%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC%E5%90%97/" rel="alternate" type="text/html" title="我能成为重积分大佬吗？" /><published>2025-06-15T00:00:00+00:00</published><updated>2025-06-15T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E6%88%91%E8%83%BD%E6%88%90%E4%B8%BA%E9%87%8D%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC%E5%90%97%EF%BC%9F</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E6%88%91%E8%83%BD%E6%88%90%E4%B8%BA%E9%87%8D%E7%A7%AF%E5%88%86%E5%A4%A7%E4%BD%AC%E5%90%97/"><![CDATA[<h1 id="能导也能积">能导也能积</h1>

<p>重积分就是给多元函数积分啦</p>

<h2 id="二重积分">二重积分</h2>

<p>下面就是一个<strong>二重积分</strong></p>

\[\mathop{\iint}\limits_{D} f(x,y) d\sigma\]

<p>$f(x,y)$ 是<strong>被积函数</strong>， $f(x,y) d\sigma$ 是<strong>被积表达式</strong>， $d\sigma$ 是<strong>面积元素</strong>，也能写成 $dxdy$ ， $x$ 和 $y$ 是<strong>积分变量</strong>， $D$ 是<strong>积分区域</strong>，二重积分可以拿来求一个质地不均匀的片片的质量</p>

<p>有一堆很显然的性质就不列出来了</p>

<h3 id="怎么算">怎么算</h3>

<p>通常而言，都要把二重积分化成二次积分来算，比如说我有个积分长这样</p>

\[\mathop{\iint}\limits_{D} xy d\sigma\]

<p>$D$是$y=x$和$x=1$和$y=0$围成的区域，于是我们很自然得出</p>

\[\left\{ \begin{aligned} 
&amp;0 \le x \le 1,\\
&amp;0 \le y \le x
\end{aligned} \right.\]

<p>然后上面那个式子就变成</p>

\[\int_0^1 \left [\int_0^x xy dy\right ]dx\]

<p>也就是变成外层上下限是常数，内层上下限是可以含有变量的样子</p>

<p>依照现有关系，把$x$和$y$的内外层顺序调换一下也是可以的</p>

<p>还有个神奇的结论，在$a \le x \le b,c \le y \le d$的情况下，有</p>

\[\mathop{\iint}\limits_{D} f_1(x)\cdot f_2(y) dxdy=\left [ \int_a^b f_1(x)dx \right ] \cdot\left [ \int_a^b f_2(y)dy \right ]\]

<h4 id="在极坐标下">在极坐标下</h4>

<p>有的时候把直角坐标换成极坐标会舒服很多（说的就是圆）</p>

<p>事实上把直角坐标转化为极坐标的一般过程是令 $x=\rho\cos \theta,y=\rho\sin \theta,d\sigma = \boldsymbol{\rho} ~d\rho d\theta$</p>

<p>注意微分部分多了个 $\rho$ ！具体为什么这样也是由积分的定义推出来的，我懒得推了（</p>

<p>于是呢原本的积分就变成了</p>

\[\mathop{\iint}\limits_{D} f(x,y) d\sigma = \mathop{\iint}\limits_{D} f(\rho\cos \theta,\rho\sin \theta)\rho d\rho d\theta\]

<p>为了避免忘记，需要再强调一遍 $\theta$ 是角度，$\rho$ 是与原点的距离</p>

<h2 id="三重积分">三重积分</h2>

<p>其实和二重积分大差不差，只是多了个球面坐标，<del>虽然不用学</del></p>

\[\mathop{\iiint}\limits_{\Omega} f(x,y,z) dV\]

<p>这就是一个<strong>三重积分</strong>，在直角坐标系下计算的过程和二重积分是一样的，除了要多套一层</p>

<p>而柱面坐标系就是给极坐标系加了个纵轴，没什么创新</p>]]></content><author><name>Yi Yue</name></author><category term="高数" /><category term="数学" /><summary type="html"><![CDATA[有点难]]></summary></entry><entry><title type="html">这一天天的</title><link href="http://githubblog.yiyuemeow.com/posts/%E8%BF%99%E4%B8%80%E5%A4%A9%E5%A4%A9%E7%9A%84/" rel="alternate" type="text/html" title="这一天天的" /><published>2025-05-22T00:00:00+00:00</published><updated>2025-05-22T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E8%BF%99%E4%B8%80%E5%A4%A9%E5%A4%A9%E7%9A%84</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E8%BF%99%E4%B8%80%E5%A4%A9%E5%A4%A9%E7%9A%84/"><![CDATA[<h2 id="这一天天的">这一天天的</h2>

<h3 id="2025年5月22日">2025年5月22日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>今天把离散数学课本过完了！还好是在计划范围内完成的（</p>

<p>之后就是大战题目了！</p>

<p>我们整的教程网站也是有模有样了，就是可能东西稍微有些少了（</p>

<h3 id="2025年5月21日">2025年5月21日</h3>
<p><strong>§ 大吉 §</strong></p>

<p>好耶，今天是大吉！但是还没处理完图论部分，明天中午要加班了</p>

<p>感觉时间不太够了啊……</p>
<h3 id="2025年5月20日">2025年5月20日</h3>
<p><strong>§ 凶 §</strong></p>

<p>难怪今天睡不着</p>

<p>折腾了好久也算是勉强把抽象代数给过完了（估计以后还要回来继续补没上过的内容）</p>

<p>唉数学怎么这么难，畏惧了，光是群就有那么多东西</p>

<h3 id="2025年5月18日">2025年5月18日</h3>
<p><strong>§ 大吉 §</strong></p>

<p>哇居然是大吉，真的吗？！</p>

<p>可是今天发现的事情似乎也不太吉利，为什么我QQ不能在说说下面评论了？难道我动了麻花疼的蛋糕吗</p>

<p>我觉得某些水课，特指那个职业规划什么的，破事真的多，怎么还要写那么多的东西啊？真以为自己是什么东西了，明天的作业不给他面子了</p>

<p>下班下班，明天继续数学，数学完还得研究写文章和备战暑期考核了，天天连轴转也有点累啊~</p>
<h3 id="2025年5月17日">2025年5月17日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>今天雨好大，回不了宿舍怎么办</p>

<p>写完这段话，我大概要踏上旅程了呜呜呜</p>

<h3 id="2025年5月16日">2025年5月16日</h3>
<p><strong>§ 凶 §</strong></p>

<p>喜报：明天就能结束谓词逻辑了……吧？</p>

<p>但是有byd难绷讲座啊啊啊啊啊</p>

<p>今天吃了碗螺蛳粉，肚子又在烧了</p>

<p>但是还没来到抽代部分，后面还有图论……虽然图论算简单的吧</p>

<h3 id="2025年5月15日">2025年5月15日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>如果给我一个机会回到一个月前，我会选择去做离散的笔记……而不是去研究本来就考得晚的高数</p>

<p>/_ \</p>

<p>离散好难，还有一个星期多一点就考试了，可是复习进度才到命题逻辑，为什么</p>

<p>窝补药挂科啊啊啊(っ °Д °;)っ</p>

<p>但是环世界又限时原价了，好想买……拿下！</p>

<h3 id="2025年5月12日">2025年5月12日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>又好久没写点东西了，写一下（</p>

<p>不知不觉又到了期末复习时间了，啊啊离散数学求求你放过我吧</p>
<h3 id="2025年4月16日">2025年4月16日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>居然一个月没在这里留下痕迹了吗，那就写点东西吧</p>

<p>昨天刚刚结束了那折磨的服创，可是现在还在被烦人的数学压着，为什么那么那么多数学作业啊，数学怎么那么难啊！</p>
<h3 id="2025年3月13日">2025年3月13日</h3>
<p><strong>§ 中平 §</strong></p>

<p>c艹唉c艹，怎么那么烦人</p>

<p>今天写了一点东西，可以下班看母鸡卡了</p>

<h3 id="2025年3月9日">2025年3月9日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>低效学习之写作业根本写不完，给人写傻了</p>

<p>这时候就要回去摆烂了</p>

<p>明天没有早八，可以有个较为正常的睡眠时间了~~~~~~~~</p>

<h3 id="2025年3月6日">2025年3月6日</h3>
<p><strong>§ 大吉 §</strong></p>

<p>今天写写写，work work work work</p>

<p>翘了两节课，这才是生活</p>

<p>明天就是星期五了，又可以休息了</p>

<p>但是他们还要开大会，唉唉唉</p>

<h3 id="2025年3月4日">2025年3月4日</h3>
<p><strong>§ 凶 §</strong></p>

<p>好累，感觉今天什么都没干，就装了个qt</p>

<p>服创是一点没写的，写这玩意有时候还没数学有意思啊</p>

<p>这ai也是挺傻的只能说，还得调</p>

<h3 id="2025年3月1日">2025年3月1日</h3>
<p><strong>§ 大吉 §</strong></p>

<p>居然好几天没有写废话了（</p>

<p>四级过了好啊，再也不用七点不到起床了</p>

<p>数学好难，写了好久没写完</p>

<p>麦当劳还是太远了，去一次坐那么久环境不算好的公交也是折磨</p>

<p>摆烂了，毕竟周末就是拿来休息的嘛（</p>

<h3 id="2025年2月25日">2025年2月25日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>明天四级就要出成绩了啊，好慌好慌好慌</p>

<p>今天在这里摁造界面，实在是辛苦，要不明天吃个KFC吧（</p>
<h3 id="2025年2月24日">2025年2月24日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>今天宜膜拜大神！太厉害了🕊️神，太厉害了wzy</p>

<p>今天把两个基础功能下写好了，还补了一下笔记</p>

<p>继续摆摆摆</p>
<h3 id="2025年2月23日">2025年2月23日</h3>
<p><strong>§ 大凶 §</strong></p>

<p>可恶啊可恶，为什么flutter的SharedPreferences是个残次品啊</p>

<p>也就是说我还要像以前一样摁造数据库吗</p>

<p>这也太APP开发了</p>

<h3 id="2025年2月22日">2025年2月22日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>总算总算是把api的图片部分研究懂了，居然能认出来fufu，也是ai发展了</p>

<p>今天摸了好久的🐟，也不知道干了什么，只有难绷的爆红以及难绷的解决方法</p>

<p>GPT你有时候骗人不浅啊GPT</p>

<p>之后就是摁造json和界面了≡(▔﹏▔)≡</p>

<h3 id="2025年2月21日">2025年2月21日</h3>
<p><strong>§ 大凶 §</strong></p>

<p>服了今天弄个api搞了好久，还好新的库能用不然就吃瘪了</p>

<p>运势还是大凶，难怪如此折磨</p>

<h3 id="2025年2月20日">2025年2月20日</h3>
<p><strong>§ 中平 §</strong></p>

<p>显示器到了！现在可以畅享三<del>折叠</del>屏了</p>

<p>不过鸡哥的病不知道好没好……求求你不要再断电了</p>

<h3 id="2025年2月19日">2025年2月19日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>flutter好难😭只能去看一点C++来放松了</p>

<p>一想到后面还有好多章书我就感到十分的快乐口牙</p>

<p>不过显示器快到了，也许会舒服一些吧</p>

<p>离散也好难，老师别念了</p>

<h3 id="2025年2月18日">2025年2月18日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>终于也是回到正轨开始学习了，这种感觉别说还是挺舒服的</p>

<p>唯一的问题是不好翘课，唉水课变少了那我还怎么翘啊</p>

<p>今天研究了下flutter和一点点c艹，也算是有进度了</p>

<p>但是服创啊服创，这东西不压力实在没进度</p>

<h3 id="2025年2月17日">2025年2月17日</h3>
<p><strong>§ 凶 §</strong></p>

<p>开始上课了，累啊，每天跑来跑去的，有的课也实在有点折磨人</p>

<p>服创只有不到两个月的时间了，但我们的进度依旧几乎为0，哈哈O(∩_∩)O</p>

<p>有的事情实在是太慢太折磨人了，不是吗</p>

<p>但愿大伙能多上点心吧，几天什么都不说实在有点难受的</p>

<h3 id="2025年2月15日">2025年2月15日</h3>
<p><strong>§ 凶 §</strong></p>

<p>回来了，一切都回来了，再也没有地铁坐了</p>

<p>在某些新的设备加入后，卡座上的线变得更乱了呢</p>

<p>回来继续摆烂了</p>
<h3 id="2025年2月10日">2025年2月10日</h3>
<p><strong>§ 中平 §</strong></p>

<p>昨天的漫展好玩，电影好看</p>

<p>可是今天的摆烂太不好了</p>
<h3 id="2025年2月5日">2025年2月5日</h3>
<p><strong>§ 中平 §</strong></p>

<p>MC好玩</p>
<h3 id="2025年2月3日">2025年2月3日</h3>
<p><strong>§ 中吉 §</strong></p>

<p>今天复习了一下<a href="/posts/%E6%98%AF%E5%8D%8F%E7%A8%8B%E4%B8%8D%E6%98%AF%E6%90%BA%E7%A8%8B/">协程</a>，所以我要麦当劳！</p>
<h3 id="2025年2月2日">2025年2月2日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>哇又是完全摆烂的一天欸，输输输</p>

<h3 id="2025年2月1日">2025年2月1日</h3>
<p><strong>§ 小吉 §</strong></p>

<p>突然发现好久没学算法了，这好吗这不好</p>

<h3 id="2025年1月31日">2025年1月31日</h3>
<p><strong>§ 凶 §</strong></p>

<p>终于是把之前想搞的博客弄出来了~o(<em>￣︶￣</em>)o</p>

<h3 id="2024年12月29日">2024年12月29日</h3>
<p><strong>§ 中平 §</strong></p>

<p>考完线代了，向高🌳进发！</p>

<h3 id="2024年12月27日">2024年12月27日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>后天就要考线代了，慌啊，本来打算一个晚上看完速成课的，现在看来也不太可能了</p>

<p>只能牺牲明天的一点写题时间以完成复习任务了</p>

<p>修改了一些笔记，以及README.md</p>

<p>要拿一整天来复习了啊啊〒▽〒</p>
<h3 id="2024年12月25日">2024年12月25日</h3>

<p><strong>§ 凶 §</strong></p>

<p>哈西里搜尼哟🎶
卡贼诺哦哟尼🎶
糍 ki 米哈拉我🎶
padoru padoru🎶</p>

<p>今天整理了<a href="/posts/%E6%AC%A7%E6%B0%8F%E7%A9%BA%E9%97%B4-%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%E5%92%8C%E7%9B%B8%E4%BC%BC%E5%AF%B9%E8%A7%92%E5%8C%96/">一整个单元</a>的笔记，好累，可是没时间写题了</p>

<p>结束乐队居然发歌了，好事，好事</p>

<p>明天应该没有那么多破事了吧</p>
<h3 id="2024年12月24日">2024年12月24日</h3>

<p><strong>§ 小吉 §</strong></p>

<p>今晚两顾自习室签到，希望没有第三次了</p>

<p>多了一篇<a href="/posts/%E7%A7%A9%E5%8F%88%E6%98%AF%E4%BB%80%E4%B9%88%E5%A5%87%E6%80%AA%E8%AF%91%E5%90%8D/">秩</a>的笔记，虽然不会上传就是了</p>

<p>服了只能说，虽然但是我真的在自习</p>

<p>好生气好生气，我要诅咒他们连GitHub都不会用，毕业之后在楼下给我炒饭！！！</p>

<h3 id="2024年12月23日">2024年12月23日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>居然又好几天没写这东西了，但是别的笔记还是有写的</p>

<p>最基础的<a href="/posts/%E6%8A%8A%E5%AE%83%E4%BB%AC%E9%93%BE%E5%9C%A8%E4%B8%80%E8%B5%B7/">链表</a>已经基本完工了，以后也许会种树也说不定，但是我还是先搞<a href="/posts/%E6%88%91%E6%B2%A1%E6%9C%89%E5%A4%9A%E7%BB%A7%E6%89%BF-%E4%BD%86%E6%98%AF%E6%9C%89%E6%8E%A5%E5%8F%A3%E5%95%8A/">接口</a>吧</p>

<p>写完了，下班！</p>
<h3 id="2024年12月20日">2024年12月20日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天写了一点线代的笔记，但由于某些原因大概是不会被放到GitHub的</p>

<h3 id="2024年12月19日">2024年12月19日</h3>

<p><strong>§ 中平 §</strong></p>

<p>额</p>

<p>我也不知道为什么会这样，但是写笔记真的好有意思</p>

<p>今天写了个<a href="/posts/%E5%B1%85%E7%84%B6%E6%98%AFMPAndroidChart/">MP</a>的笔记，还是很快乐的</p>

<p>我宣布黑曜石已经薄纱了那个啥啥啥Typora了</p>

<p>可惜啊，GitHub拖后腿了，否则就进入LaTeX时代了</p>

<h3 id="2024年12月10日">2024年12月10日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天不想写了</p>

<p>就这样吧</p>

<p>不过可以看看最新的<a href="/posts/%E7%B1%BB%E7%9A%84%E5%90%84%E7%A7%8D%E7%A5%9E%E5%A5%87%E7%89%B9%E6%80%A7/">C艹笔记</a></p>

<p>今天小小整理了一波笔记，以及我最喜欢的内部链接</p>

<h3 id="2024年12月9日">2024年12月9日</h3>

<p><strong>§ 中平 §</strong></p>

<p>好嘛，今天是和C/C艹在一起的一天</p>

<p>可是明天就要考思政了，慌慌慌</p>

<p>真的是裸考啊</p>

<h3 id="2024年12月8日">2024年12月8日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>不是，怎么连续两天没写这玩意</p>

<p>是被绘蓝杯冲昏了头脑吗</p>

<p>太可怕了</p>

<p>要进入四级模式力</p>

<p>后天还有思政期末考，畏惧了</p>

<p>考完四级那就是数学时间辣</p>

<p>狠狠学数学，狠狠学算法</p>

<p>要去洛谷摸鱼力</p>

<h3 id="2024年12月5日">2024年12月5日</h3>

<p><strong>§ 小吉 §</strong></p>

<p>今天修了两个bug</p>

<p>然后就睡大觉吧</p>

<h3 id="2024年12月4日">2024年12月4日</h3>

<p><strong>§ 凶 §</strong></p>

<p>一部分图标支持了深色模式……然后呢</p>

<p>关于还没做，唉</p>

<p>明天还是有点时间做的</p>

<p>已经不知道做什么了，还是没时间了啊</p>

<h3 id="2024年12月3日">2024年12月3日</h3>

<p><strong>§ 凶 §</strong></p>

<p>唉又是摆烂的一天</p>

<p>今天修了bug，修了bug，修了bug</p>

<p>勉强支持了深色模式</p>

<p>然后四级一点没学，整个人困得要死</p>

<p>下班摆烂了，感觉真的没多少能改的了</p>

<p>之后把图标也一同支持深色模式吧</p>

<h3 id="2024年12月2日">2024年12月2日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>低效的一天</p>

<p>今日无事</p>

<p>只是又新增了几个bug</p>

<h3 id="2024年12月1日">2024年12月1日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>唉写了两题半就润了，骗分也没骗，贪心也没贪</p>

<p>输了，最好的情况就是拿个三等奖了</p>

<p>谁知道最后一题这么好拿分啊啊啊</p>

<p>唉就这样吧，一天三场考试，回去洗洗睡了</p>

<h3 id="2024年11月30日">2024年11月30日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>坏了今天只顾着写kt了，忘了写两道题找找手感了</p>

<p>害反正是去白嫖的，能写多少写多少吧</p>

<p>但你前四题总不能都是这个难度吧……这个难度对他们ACM的跟玩一样</p>

<p>如果前四题都是图一乐的话……那我也不好说啥了</p>

<p>但愿能拿下两百分吧</p>

<h3 id="2024年11月29日">2024年11月29日</h3>

<p><strong>§ 中吉 §</strong></p>

<p>好折磨</p>

<p>不过在GPT的帮助下也算是把一个基础的<a href="/posts/%E5%B1%85%E7%84%B6%E6%98%AFMPAndroidChart/">图表</a>搞好了</p>

<p>这一个表怎么要那么多参数要调啊</p>

<p>有的东西就不能默认关掉吗</p>

<p>还有一个表……应该不太难搞</p>

<p>好久没玩游戏了，秋促回去买点好玩的耍耍</p>

<h3 id="2024年11月28日">2024年11月28日</h3>

<p><strong>§ 小吉 §</strong></p>

<p>见鬼了今天</p>

<p>好吧是我乱改导致的</p>

<h3 id="2024年11月27日">2024年11月27日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今日之我，竟陷于作业之泥潭</p>

<p>才了却心理的长文，又应付C的烂题，再鏖战线代的计算</p>

<p>诸事不顺，一月前也无法想到如此窘迫境地</p>

<p>心烦意乱，今日开发原地踏步</p>

<p>缓存清理，消磨一时光阴</p>

<p>明日亦无闲，明日复明日，烦恼何其多</p>

<p>周四多有课，周五翘课难，周六去消遣，周日考两场</p>

<p>线代之怖，将西西艾弗阻之</p>

<p>何不感慨生活之苦？</p>

<h3 id="2024年11月26日">2024年11月26日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天我干了啥……？</p>

<p>线代没写代码没写啥英语差点没学</p>

<p>哦好像都在弄这个多语言和睡大觉</p>

<p>总之今天也算是弄好了，之后就是处理界面和文本为主了</p>

<p>居然只剩十天了</p>

<p>坏了今天的舟忘刷了，下班下班</p>

<h3 id="2024年11月25日">2024年11月25日</h3>

<p><strong>§ 大凶 §</strong></p>

<p>今天确实难受……觉没睡够，肚子不算舒服，感觉啥也没写</p>

<p>好吧一直在问GPT和研究文本</p>

<p>不对这都是我不翘课导致的</p>

<p>在课上学习效率也不高说实话</p>

<p>好困，今晚早点下班吧</p>

<p>今天早上早自习没去打勾还被记缺勤了</p>

<p>这日子是真难受啊</p>

<p>好在明天时间应该不算少</p>

<p>搞个<a href="/posts/%E7%BB%86%E7%A2%8E%E7%9A%84%E7%8E%A9%E6%84%8F-%E5%85%B6%E4%B8%80/#有关语言（平时说的那个">语言切换</a>应该没问题</p>

<h3 id="2024年11月24日">2024年11月24日</h3>

<p><strong>§ 中平 §</strong></p>

<p>Ciallo～(∠・ω&lt; )⌒☆</p>

<p>今天把所有要求的功能都做完啦！（按最低标准来说</p>

<p>接下来就是无止尽的优化了</p>

<p>今天还把那啥<a href="/posts/%E7%BB%86%E7%A2%8E%E7%9A%84%E7%8E%A9%E6%84%8F-%E5%85%B6%E4%B8%80/#有关列表">列表</a>优化了一下，然后就是继续优化和搞多语言和翻译和背景优化和设置了</p>

<p>界面还要狠狠地优化啊啊啊</p>

<p>但是今天没写题欸</p>

<p>还是输</p>

<h3 id="2024年11月23日">2024年11月23日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天把复习部分做了啊</p>

<p>明天再花半个小时就把要求的功能全部做完了</p>

<p>然后就是为所欲为的时间了ヾ(≧▽≦*)o</p>

<p>想做什么做什么可太棒了</p>

<p>虽然还要优化一大堆东西但应该没啥大问题吧</p>

<p>距离DDL还有……两个星期？！</p>

<p>从来没打过这么富裕的仗(～o￣3￣)～</p>

<h3 id="2024年11月22日">2024年11月22日</h3>

<p><strong>§ 小吉 §</strong></p>

<p>又是麦当劳的一天🍔</p>

<p>这ccf样题前两题一题签到题一题努努力也能拿到</p>

<p>两百分不就到手了（</p>

<p>但是前三题都是往届CSP的前两题啊</p>

<p>看来这四道标准算法题也就图一乐了</p>

<p>除非他们狠狠上难度</p>

<p>这下也是感受到西西艾弗岛的险恶了</p>

<p>然后今天项目是一点没做啊＞﹏＜</p>

<h3 id="2024年11月21日">2024年11月21日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天课是一节没翘……思政课写了一道模拟</p>

<p>好消息是思政课要结课了</p>

<p>坏消息是作业好多，什么线代高数心理，好烦::&gt;_&lt;::</p>

<p>今天只写了一点代码，好伤心</p>

<p>不翘课的大学生活终究是煎熬的啊……</p>

<p>打卡也好少，太失败了，下周怕是没椅子坐了</p>

<h3 id="2024年11月20日">2024年11月20日</h3>

<p><strong>§ 中平 §</strong></p>

<p>今天 真 啥都没做</p>

<p>课一节不翘导致的</p>

<p>只是在洛谷写了道水题就汗流浃背了</p>

<p>为什么，开long long会编译失败！</p>

<p>第一次见long long不如int的</p>

<p>明天还要上满课，这让我怎么写复习</p>

<p>连晚上都要占用，服了</p>

<p>😇🏳️投降喵</p>

<h3 id="2024年11月19日">2024年11月19日</h3>

<p><strong>§ 中平 §</strong></p>

<p>每天乐子真不少</p>

<p>今天见证一场抓卖笔犯大戏，可惜好景不长他们又卷土重来了</p>

<p>明天不得不写线代练习了</p>

<p>今天都在搞啥啊，什么水课都去了</p>

<p>无聊啊无聊，感觉啥都没干</p>

<p>今天把搜索的联网部分写咯，不过API有点问题</p>

<p>那也不是我能解决的啦(￣▽￣)”</p>

<p>开始摆烂！</p>

<h3 id="2024年11月18日">2024年11月18日</h3>

<p><strong>§ 凶 §</strong></p>

<p>丸辣，西西弗群里面都是大佬，准备好被薄纱了</p>

<p>有一说一有时候直觉是很对的，即使我从未研究过那一大堆控件，也能猜到里面有个<code class="language-plaintext highlighter-rouge">SearchView</code></p>

<p>明天把搜索的另一半做了，就要面对比较棘手的复习部分了</p>

<p>DDL还有不到20天了，还是……好像也不太紧张？</p>

<p>甚至还有时间去写一点算法题……虽然很拉了</p>

<p>要是半个月速通C的人都能摸到一个奖是不是说明这比赛太水了（</p>

<p>好吧其实人家看简历都只看国奖的╥﹏╥…</p>

<p>还是去阴暗地学我的高数线代吧</p>

<h3 id="2024年11月17日">2024年11月17日</h3>

<p>又是摆烂的一天</p>

<p><strong>§ 大吉 §</strong></p>

<p>今天<del>让GPT</del>把背景写了，一天一个功能还是太快了，所以还是休息一下吧（</p>

<p>但是准备去西西弗摆烂陪跑了，签到题应该……可以拿下吧</p>

<p>Lube的歌也挺好听的，大毛的文化也挺深厚</p>

<p>等下，怎么音乐播放器的拓展功能这么多</p>

<p>想必让我偷两个也没事吧</p>

<h3 id="2024年11月16日">2024年11月16日</h3>

<p>麦当劳好吃🍔</p>

<p>今天总算是把六个基础要求都完成了，可以下班啦耶！</p>

<p>今天<strong>§ 小吉 §</strong></p>

<p>宜贴贴宜考试，这可不好说啊</p>

<p>大摆特摆了，今天把统计页面和通知做了，说实话并不是特别满意</p>

<p>但是这种精益求精的东西还是之后再搞吧</p>

<p>居然已经十天了……才做了这点东西吗</p>

<p>打字慢果然是一大缺点呐</p>

<p>怎么科协一个个打字都那么快的啊啊啊QAQ</p>

<p>输了输麻了</p>

<h3 id="2024年11月15日">2024年11月15日</h3>

<p>今天日程快被占满了，好困……周五怎能如此难受</p>

<p>于是以一具尸体的形态在搓数据库</p>

<p>困死我了，笔记也没做完，报名表也没交</p>

<p>呜呜呜呜呜呜呜</p>

<p>不过基础功能已经完成4.5个了，发通知很简单的</p>

<p>看看运势吧，小吉，还不错</p>

<p>但是明天还有事，这就是人生吗</p>

<h3 id="2024年11月14日">2024年11月14日</h3>

<p>今天属实是大摆特摆了，睡到四点然后还去上了水课晚上还去上了半节心理课</p>

<p>等到科协都是八点半了呜呜呜</p>

<p>但是今天居然还是大吉，还挺好</p>

<p>可是今天代码基本没有进展，除了实现了Ciallo之外简直是无功而返</p>

<p>高数开始积了，要上强度了</p>

<p>好像除了研究Kotlin外今天啥也没干</p>

<p>哦其实在思政课上写了点东西，但也就是写了点东西</p>

<p>输！</p>

<h3 id="2024年11月13日">2024年11月13日</h3>

<p>又是和AI斗智斗勇拼拼图的一天</p>

<p>当AI给出的回答一半是错误的时候就要特别警惕了，虽然我也不知道为什么错了</p>

<p>还好有惊无险最终实现了</p>

<p>我一定要写一篇笔记记下这文件读写操作流，但一定不是今天</p>

<p>因为已经十点半了，好晚</p>

<p>其实那一大坨东西还是可以再封装一下的</p>

<p>不过总之todoList上又能打一个勾了，好耶！</p>

<p>基础功能现在还差两个！还有超过20天，从来没打过这么富裕的仗</p>

<p>但是报名表还没交欸，明天搞一下吧</p>

<p>甚至还有时间加点什么新的小功能，比如什么早就开始布局的多语言啊、可能有用的深色模式啊</p>

<p>UI还得改一改</p>

<p>哈哈小吉，周深的歌真的好听</p>

<p>好晚了，开润</p>

<h3 id="2024年11月12日">2024年11月12日</h3>

<p>经过不到一个星期的战斗，这个应用最重要的功能以及被完成超过50%了！可喜可贺可喜可贺</p>

<p>今天运势还是大吉，真是太好了</p>

<p>顺便修复了词库中没有Ciallo的bug（</p>

<p>动用自己的聪明才智解决问题真是太棒辣！</p>

<p>和ViewModel大战三百回合也是挺爽</p>

<p>不知今天吃的卤肉饭是否也出了一份力</p>

<p>同样还要感谢的还有老朋友ChatGPT，没有它我就不能这么快地找到解决方案</p>

<p>（那不就还是个搜索引擎吗</p>

<p>科协有一点不好就是不能站着写代码</p>

<p>坐着坐久了可难受了</p>

<h3 id="2024年11月11日">2024年11月11日</h3>

<p>今天双十一！我什么都没买~不买立省百分百</p>

<p>今天的运势是中平</p>

<p>今天有自己解决问题的成就感了，真不错</p>

<p>由于连接总是超时以及就算不超时也很慢，于是我决定将单词库部署至本地</p>

<p>只能说人不能粗心大意，连续犯下把Ciallo打成ciallo和把word打成words两个低级错误实在不该，也许是今天睡觉太少了吧</p>

<p>因此大规模的网络请求是不现实的，通过部署本地服务器，我可以在本地解析JSON</p>

<p>但是这神奇的东西居然还会连接中断，家人们谁懂啊</p>

<p>于是我又灵机一动发明了断点续传（</p>

<p>好啊，很好啊，一通折腾下来数据库大小变成了2.7 MB</p>

<p>虽然今天好像什么都没做，但以后数据都在本地会更方便吧</p>

<p>我可不想再超时了啊啊啊</p>

<p>明天可以狠狠用ViewModel共享数据了哈哈哈</p>

<p>下一个笔记也许是文件操作……或者是网络请求？谁知道呢</p>

<h3 id="2024年11月10日">2024年11月10日</h3>

<p>今日灵光乍现，果然离开电脑的时候时最有灵感的时候</p>

<p>欸？洛谷运势怎么是凶</p>

<p>算了不管了，虽然四级测试一塌糊涂，但是今天也是小小的测了线代，明天还要考高数</p>

<p>然后我发觉等价无穷小还没背过一遍</p>

<p>今天写了点上网的玩意，之后就得弄跳转逻辑和数据库了</p>

<p>（不过可能还要多获取点数据以实现足够多的随机啊</p>

<p>发明ViewModel的人简直是天才⑨，还是说我得感谢GPT</p>

<p>感觉基本功能实现起来没多大问题，就是可能会有点……延迟？</p>

<p>算了能跑起来再说，回去背等价无穷小了</p>

<h3 id="2024年11月9日">2024年11月9日</h3>

<p>今日运势：凶</p>

<p>周四下发通知：全班周日早上前往大礼堂当观众</p>

<p>八点半开始的讲座，竟要求八点到场，真是相当难绷</p>

<p>还好有先见之明，七点五十起床，觅得一个包子，二十分钟路程，轻松惬意漫步</p>

<p>哪知一坐不起，两个小时大咖发言，低头只见集成战略，一晃开水几壶已成</p>

<p>上午已尽，本想寻故味，谁知难绷开会集合，硬控十分钟而开会未果</p>

<p>前去三品王，浅尝深感粉质不同，好在汤还是熟悉的味道</p>

<p>归来睡觉，下午已无，代码一点没写</p>

<h3 id="2024年11月8日">2024年11月8日</h3>

<p>感觉今天也没写啥代码，全在做界面拼积木了</p>

<p>效率确实低，明天开始大概就要使用互联网了</p>

<p>坏了突然想起来今天还没做英语阅读</p>

<p>不过感觉应该暂时不太需要用到Retrofit</p>

<p>哈哈JSON我来辣(x_x)</p>

<p>又想起来高三那年每个周末回家手搓JSON做MC数据包的日子了</p>

<p>两百多个JSON谁看了谁迷糊，但是为啥我一直对科技空岛生存这种东西念念不忘呢……</p>

<p>也许是天生喜欢自动化吧（</p>

<p>所以自动化解析JSON万岁！为什么MC还没有一个可以自动生成JSON的模组</p>

<p>那个模组制作器感觉还是太臃肿了，而且修改配方啥的确实不方便</p>

<p>何时才能有像JEI一样的大一统？</p>

<p>今日洛谷：中吉</p>

<h3 id="2024年11月7日">2024年11月7日</h3>

<p>哈哈今日运势是小吉</p>

<p>但是去拍心理小视频了，害得下午都没来科协</p>

<p>拍完八人去聚餐，平均一人二十三<del>（这动不动押韵的病真得治了</del></p>

<p>还挺好吃的说实话尤其是饭口感特别好，那种圆圆的米，叫啥来着</p>

<p>哦粳米，不知道为啥感觉特别好吃</p>

<p>可是今天好像除了写了点界面和<del>废话</del>文档以外感觉什么都没做（</p>

<p>一定是空闲时间太少了，一定！</p>

<p>以及心理课呆在科协惨遭导员挨个点名</p>

<p>哈哈寄</p>

<p>可是我昨天居然忘了写懂王胜选欸，四年又四年，懂王登记成懂帝了</p>

<p>也许这就是命运使然吧</p>

<p>不过今天吃饭他们聊到就业形势相当不乐观，唉那又能怎么样呢</p>

<p>我毕业也是四年后的事了，到时候美国总统还是不是懂王都不好说</p>

<p>现在光操心那些东西有啥用，不如直接摁造代码，没准四年之后全院只有科协的人拿到offer</p>

<p>但这样好像也有点太吓人了……</p>

<p>但是术曲听着是真的上头</p>

<h3 id="2024年11月6日">2024年11月6日</h3>

<p>绘蓝杯来了，谁还管你那记事本呐</p>

<p>原来重写就是多态的体现啊……难怪是面向对象</p>

<p>今天也算是勉强理清了数据库操作……这玩意水很深，我怕我把握不住</p>

<p>昨天其实把记事本的雏形做好了来着，可现在大抵是没法做了</p>

<p>之后看来要深耕数据库了啊，顺便来一下网络通信</p>

<p>接下来是开奖时间，今天的洛谷运势是啥呢</p>

<p>中平，宜装弱忌装逼，很对啊很对</p>

<h3 id="2024年11月5日">2024年11月5日</h3>

<p>自己写就是好，完全不怕跟不上AI思路</p>

<p>也是用上SQLite了</p>

<p>ROOM对我的脑子而言还是太超模了</p>

<p>可是小视频没拍成，但凡他们有点执行力也好啊</p>

<p>明天看看能不能把撤销重做写出来吧</p>

<p>有一说一fragment操作真的没activity方便还有各种上下文</p>

<p>坏了今天的洛谷是大凶</p>

<p>溜了溜了（记于22点55分</p>

<h3 id="2024年11月4日">2024年11月4日</h3>

<p>面向AI编程果然是不明智的……</p>

<p>被创了一整天结果进展为零啊啊啊</p>

<p>之后还是自己写吧，至少知道是个啥东西</p>

<p>显然需要两张表，一张用来临时存放，每次重启都重置，一张用来永久存放</p>

<p>唉脚踏实地脚踏实地</p>

<p>明天还要去拍小视频，不知道啥时候有时间呐</p>

<p>该走了</p>

<h3 id="2024年11月3日">2024年11月3日</h3>

<p>大脑被四级创烂了唉，为什么周日还有早八，多好的一个早上</p>

<p>又是低效学习线代和抄C语言概念的一天</p>

<p>在GPT的伟大帮助下用room写东西好像……好吧今天进度约为0.5</p>

<p>你怎么能如此堕落啊啊啊抄代码都这么不勤快</p>

<p>好吧其实是看到了协程就去看了一点点（</p>

<p>这好吗这不好时间已经不多了再不干就真没时间干了</p>

<p>明天把布局什么的再改一改，然后就真得开干了……</p>

<p><del>为啥好像这一个多月来我就学会了抄GPT啊X﹏X</del></p>

<h3 id="2024年11月2日">2024年11月2日</h3>

<p>早上好！</p>

<p>今天的学习内容是高数和线代作业！</p>

<p>明天还要应付形势与政策和<del>线代考试</del>还有四级！真的是太难受了</p>

<p>所以还是睡大觉吧（</p>

<p>今天学会了程序员第一课之删库跑路</p>]]></content><author><name>name    :依月 url     :https://github.com/Yiyue345 avatar  :https://avatars.githubusercontent.com/u/118581930?s=400&amp;u=d498114041c3e20b33a61a369fb9ec707ec29e73&amp;v=4</name></author><category term="废话" /><summary type="html"><![CDATA[每一天（也可能不是）的废话]]></summary></entry><entry><title type="html">小朋友都会的图论</title><link href="http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E4%BC%9A%E7%9A%84%E5%9B%BE%E8%AE%BA/" rel="alternate" type="text/html" title="小朋友都会的图论" /><published>2025-05-22T00:00:00+00:00</published><updated>2025-05-22T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E4%BC%9A%E7%9A%84%E5%9B%BE%E8%AE%BA</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E4%BC%9A%E7%9A%84%E5%9B%BE%E8%AE%BA/"><![CDATA[<h1 id="图">图</h1>

<p>相比前面的抽代，这里总算是休闲难度了</p>

<h2 id="图的很多有关定义">图的很多有关定义</h2>

<p>我觉得吧，实在没有必要说什么是<strong>图</strong>了，计算机专业不懂图的话确实有点难办</p>

<table>
  <tbody>
    <tr>
      <td>图的<strong>结点数</strong>叫做图的<strong>阶数</strong>，阶数是几就叫几阶图；序偶是有序的，但是专家还是了发明一种无序序偶，记作 $(x,y)$ ，<strong>无序积</strong>则是两个集合中的元素分别组成的无序序偶的集合，记作 $A\&amp;B$ ，  $A\&amp;B={ (x,y)</td>
      <td>x \in A, y \in B }$</td>
    </tr>
  </tbody>
</table>

<h3 id="各种边和图">各种边和图</h3>

<p><strong>有向边</strong>，<strong>无向边</strong>都是老生常谈的东西的，一个端点连着的边叫做它的<strong>关联边</strong></p>

<p>如果一条边两头连在一个点上面，那这条边叫这个点的<strong>自环</strong>，如果两个点之间有重复的边，那这些边叫<strong>平行边</strong>或<strong>重复边</strong>，其数量叫做边的<strong>重数</strong>，有平行边的图叫<strong>多重图</strong>，没有平行边和自环的图叫<strong>简单图</strong>，如果简单图的任意两个点都有边连接，那这个图又叫<strong>完全图</strong></p>

<p><strong>无向图</strong>，<strong>有向图</strong>，<strong>无向简单图</strong>，<strong>有向简单图</strong>，<strong>无向完全图</strong>，<strong>有向完全图</strong>都是一看就懂什么意思的，<strong>混合图</strong>指的是同时有有向边和无向边的图</p>

<p>如果图 $A$ 是图 $B$ 的一部分，那 $A$ 就是 $B$ 的<strong>子图</strong>，如果 $A$ 有 $B$ 的全部结点，那 $A$ 是 $B$ 的<strong>生成子图</strong>
，还有个东西叫<strong>导出子图</strong>，就是拿一组点或者一组边，然后加上那些点之间的边或者那些边连的点，得到的子图就是导出子图了</p>

<p>一个结点连了几条边，那它的<strong>度数</strong>就是几，记作 $\deg(v)$ ，如果是有向边，还要分为<strong>入度</strong>和<strong>出度</strong>，记作 $\deg^+(v)$ 和 $\deg^-(v)$</p>

<p>度数为 $1$ 的结点叫做<strong>悬挂节点</strong>，对应的边叫做<strong>悬挂边</strong></p>

<p>显然，图的总度数是边数的两倍，在所有图中度数是奇数的点都是偶数个</p>

<p>如果你有两个分子，这两个分子虽然画出的结构式不一样，但实际上是完全相同的物质，那我们可以说这两个分子的图<strong>同构</strong> <del>（虽然但是这是我能想到最简单表示同构概念的方法了</del> ，写作 $A \cong B$</p>

<blockquote>
  <p>[!tip]
代数系统的同构也是用这个<strong>全等</strong>符号表示（不知道为什么专家没加上去</p>

  <p>所以啊，<strong>同构就是全等</strong></p>
</blockquote>

<h3 id="路在脚下">路在脚下</h3>

<p>一个点到另一个点的路径就是<strong>通路</strong>，没有相同边的叫<strong>简单通路</strong>，没有相同点的叫<strong>初级通路</strong>或者<strong>基本通路</strong></p>

<p>一个大学生应该能猜出什么是<strong>回路</strong>，回路同样有<strong>简单回路</strong>和<strong>初级回路</strong>或<strong>基本回路</strong></p>

<p>有一些非常显然的结论就不写了</p>

<p>学过语文的应该都知道一个点到另一个点是<strong>可达的</strong>是什么意思</p>

<p>如果图里面每个点都可以去到任何一个点，那这个图叫<strong>连通图</strong></p>

<p><strong>无向图</strong>里面每一块连通的部分导出的子图叫做它的<strong>连通分支</strong>，连通分支的数量叫做<strong>连通分支数</strong></p>

<p>对于有向图，如果只是把每个点连起来但不一定通，那这就是个<strong>弱连通图</strong>或者直接叫<strong>连通图</strong>，如果任何两个点之间至少有一个点能去另一个点，这就是个<strong>单向连通图</strong>，如果像无向图那样畅通无阻的话就叫<strong>强连通图</strong></p>

<p>显然一个有向图只要有一条能经过全部结点的回路就是强连通图了，如果只是通路那就是单向连通图</p>

<p>如果有向图 $G$ 的子图 $G’$ 是弱连通的，且 $G$ 的其他子图 $G’’ \supset G’$ 都不是弱连通的，那 $G’$ 就是 $G$ 的<strong>极大弱连通子图</strong>，同理也有<strong>极大单向连通子图</strong>和<strong>极大强连通子图</strong></p>

<h3 id="加加减减">加加减减</h3>

<p>对图<strong>删除边</strong>和<strong>删除结点</strong>应该都会，而<strong>收缩边</strong>指的是两个连在一起的点合二为一 <del>（唉我懒得画图了</del></p>

<h3 id="计算机如何看图">计算机如何看图</h3>

<p>图可以用图形，可以用集合，也可以用<strong>矩阵</strong></p>

<p>首先上场的是<strong>关联矩阵</strong>，记作 $\boldsymbol{M}(G)$ ，它的<strong>每列都代表一条边</strong>，<strong>每行代表一个点</strong>，值为 $1$ 表示这条边在这个点上，下面是一个关联矩阵的例子</p>

\[\boldsymbol{M}(G)=\begin{bmatrix}
2 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \\
0 &amp; 1 &amp; 1 &amp; 1 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 1 &amp; 1 &amp; 1 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 1 &amp; 1 &amp; 1 
\end{bmatrix}\]

<p>真是又臭又长呢</p>

<p>接下来登场的是 OI 选手最熟悉的<strong>邻接矩阵</strong>，记作 $\boldsymbol{A}(G)$ ，就是说一个点到另一个点有几条边连接，具体点就是<strong>行所对应的点到列所对应的点的边数</strong></p>

\[\boldsymbol{A}(G_1)=\begin{bmatrix}
1 &amp; 3 &amp; 0 &amp; 0 &amp; 0 \\ 
0 &amp; 0 &amp; 1 &amp; 0 &amp; 1 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \\
0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \\
\end{bmatrix},

\boldsymbol{A}(G_2) = \begin{bmatrix}
0 &amp; 1 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \\
0 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\
1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 1 \\
1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 0 \\
0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \\
\end{bmatrix}\]

<p>还有一位是<strong>可达矩阵</strong>，记作 $\boldsymbol{D}(G)$ ，顾名思义就是<strong>行所对应的点是否能到列所对应的点</strong></p>

\[\boldsymbol{D}(G)=\begin{bmatrix}
1 &amp; 1 &amp; 1 &amp; 1 &amp; 1 \\
1 &amp; 1 &amp; 1 &amp; 1 &amp; 1 \\
1 &amp; 1 &amp; 1 &amp; 1 &amp; 1 \\
1 &amp; 1 &amp; 1 &amp; 1 &amp; 1 \\
1 &amp; 1 &amp; 1 &amp; 1 &amp; 1 \\
\end{bmatrix}\]

<p>额这样是不是不太好（</p>

<p>算了就这样吧（</p>

<h2 id="当脚下的路有了距离">当脚下的路有了距离</h2>

<p>如果图的每条边都有了对应的长度，那这个图就是<strong>赋权图</strong>，还有个东西叫<strong>边权矩阵</strong>，记作 $\boldsymbol{B}(G)$ ，<strong>如果行代表的点能到列所代表的点，那数值就是对应的边权</strong>，否则是 $\infty$</p>

\[\boldsymbol{B}(G)=\begin{bmatrix}
0 &amp; 1 &amp; 4 &amp; \infty &amp; \infty &amp; \infty \\
1 &amp; 0 &amp; 2 &amp; 7 &amp; 5 &amp; \infty \\
4 &amp; 2 &amp; 0 &amp; \infty &amp; 1 &amp; \infty \\
\infty &amp; 7 &amp; \infty &amp; 0 &amp; 3 &amp; 2 \\
\infty &amp; 5 &amp; 1 &amp; 3 &amp; 0 &amp; 6 \\
\infty &amp; \infty &amp; \infty &amp; 2 &amp; 6 &amp; 0
\end{bmatrix}\]

<p>↑这是个无向图的边权矩阵，很容易发现它是对称矩阵</p>

<h3 id="迪杰斯特拉">迪杰斯特拉</h3>

<p><strong>Dijkstra 算法</strong>（唉这名字怎么这么怪）是拿来求一个点到图上其他点的最短路径的算法，其过程是非常的贪心啊</p>

<p>过程如下：</p>

<ul>
  <li>开两个数组，一个 $S$ 存已遍历的结点，一个 $L$ 存到各点的距离， $L$ 的所有项（除了开始那个点）都初始化为 $\infty$</li>
  <li>最开始的点距离初始化为 $0$ ，更新与其邻接的点的距离，对应<code class="language-plaintext highlighter-rouge">L[i]</code>新值为<code class="language-plaintext highlighter-rouge">min(正在遍历的点的距离 + 边权, L[i])</code>，然后把现在这个点加入 $S$</li>
  <li>之后继续遍历<strong>未遍历</strong>的点中<code class="language-plaintext highlighter-rouge">L[i]</code>最小的点，一个一个看直到所有点都到了 $S$ 里面</li>
  <li>这时 $L$ 里面的值都是最小的了</li>
</ul>

<p>代码以后再补</p>

<h2 id="欧拉你好">欧拉：你好</h2>

<p>小学生都知道什么是<strong>欧拉图</strong>，就是一个有不重复走完全部边的回路的图，也就是有<strong>欧拉回路</strong>的图，如果一个图只有<strong>欧拉通路</strong>，这个图只能叫<strong>半欧拉图</strong></p>

<p>只有无向连通图的奇度数结点为 $0$ 或 $2$ 个时，这个图才有欧拉通路</p>

<p>如果全部结点度数都是偶数，那这个图有欧拉回路</p>

<p>如果一个有向连通图每个结点的入度等于出度，那这个图也有欧拉回路</p>

<h3 id="弗罗莱">弗罗莱</h3>

<p><strong>Fleury 算法</strong>是用来求欧拉图里面的欧拉回路的，其思想要领是：从某个点开始走，走过哪条边就删掉那条边，优先走<strong>不会改变</strong>图的<strong>连通性</strong>的边。等到所有边都走完了就可以输出路径了</p>

<p>就这么简单</p>

<p>有时间可以整个代码（？</p>

<h2 id="哈密顿你好吗">哈密顿：你好吗</h2>

<p>小学生也应该知道什么是<strong>哈密顿图</strong>，就是一个有不重复走完全部点的回路的图，也就是有<strong>哈密顿回路</strong>的图，如果一个图只有<strong>哈密顿通路</strong>，这个图只能叫<strong>半哈密顿图</strong></p>

<p>这玩意比欧拉图难判断多了，怎么才能简单地拿下，专家也说不准</p>

<p>如果一个 $n$ 阶无向简单图中随便两个不相邻点的度数和 $\geq n-1$ ，那它有哈密顿通路，如果 $\geq n$ ，那它有哈密顿回路</p>

<p>如果图中每个点都有 $\deg(v) \geq \frac{2}{n}$ ，那它也有哈密顿回路</p>

<p>这玩意……应该不太会考吧（</p>

<h2 id="一分为二我不好">*一分为二：我不好</h2>

<h2 id="避免交叉真不太好">*避免交叉：真不太好</h2>]]></content><author><name>Yi Yue</name></author><category term="数学" /><category term="离散数学" /><summary type="html"><![CDATA[这是浅水区~]]></summary></entry><entry><title type="html">小朋友都可以种的树</title><link href="http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%A7%8D%E7%9A%84%E6%A0%91/" rel="alternate" type="text/html" title="小朋友都可以种的树" /><published>2025-05-22T00:00:00+00:00</published><updated>2025-05-22T00:00:00+00:00</updated><id>http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%A7%8D%E7%9A%84%E6%A0%91</id><content type="html" xml:base="http://githubblog.yiyuemeow.com/posts/%E5%B0%8F%E6%9C%8B%E5%8F%8B%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%A7%8D%E7%9A%84%E6%A0%91/"><![CDATA[<h1 id="树">树</h1>

<p>小朋友都知道没有环的连通图就是<strong>树</strong>，而多个树在一起就是<strong>森林</strong>，度数为 $1$ 的点叫<strong>叶结点</strong>，简称就是<strong>叶</strong> ( •̀ ω •́ )y</p>

<p>和赋权图一样，也有<strong>赋权树</strong>这种东西，就是树上的边多了数字</p>

<h2 id="种一棵树">种一棵树</h2>

<p>如果有一个图，它端点一个不少得到的权值最小的树叫做它的<strong>最小生成树</strong></p>

<p>专家给了两种求一个图的最小生成树的方法：<strong>避圈法</strong>和<strong>破圈法</strong></p>

<p><strong>避圈法</strong>是从最小的边开始选，如果选了会成环就不选那条，直到选到 $n-1$ 条为止，选中的边就能组成最小生成树</p>

<p><strong>破圈法</strong>是从最大的边开始删，如果选了会断开就不选那条，直到剩下 $n-1$ 条为止，剩下的边就能组成最小生成树</p>

<h2 id="有方向的树">有方向的树</h2>

<p><strong>有向树</strong>就是没有环的有向图，入度为 $0$ 的叫<strong>根节点</strong>，入度出度都为 $1$ 的叫<strong>叶节点</strong></p>

<p>如果一颗有向树只有一个根节点，那它就是<strong>根树</strong>，也是平常见到最多的树，从根到别的结点的通路长度叫做那个节点的<strong>层数</strong>，树的最大层数叫做<strong>树高</strong>，记作 $h(T)$ ，如果每层的全部结点都规定了次序，这就是个<strong>有序根树</strong>，简称<strong>有序树</strong></p>

<p><strong>父亲</strong>、<strong>儿子</strong>、<strong>兄弟</strong>、<strong>祖先</strong>、<strong>后代</strong>这些概念应该一点就通</p>

<p>根树的结点和它的全部后代导出的子图叫做<strong>根子树</strong>，也叫<strong>子树</strong></p>

<p>对于树的<strong>遍历</strong>，有三种方式，<strong>前序遍历</strong>，<strong>中序遍历</strong>和<strong>后序遍历</strong></p>

<p>这个前中后啊，指的是<strong>根</strong>与它的<strong>子树</strong>的遍历次序</p>

<p><strong>前序遍历就是先看根，再看子树；中序是先看一颗子树，再看根，再看别的子树；后序就是先看完所有子树再看根</strong></p>

<p>这些遍历都是要递归的</p>

<h2 id="二叉的树">二叉的树</h2>

<p><strong>二叉树</strong>个个都见过，懒得重复定义了</p>

<p>有个东西叫<strong>前缀码</strong>，但是这玩意咋解释呢，就是一组看开头不会混淆的字符串吧</p>

<p>二叉树每个点当然也可以有赋值，如果一棵树只有<strong>叶</strong>有赋权，那这棵树叫<strong>叶赋权树</strong>，每个叶的值乘上它的层数之和就是这棵树的<strong>权值</strong> $W(T^*)$ ，改变叶节点位置得到的权值最小的二叉树叫<strong>最优二叉树</strong>，亦称<strong>最优树</strong>或<strong>哈夫曼树</strong></p>

<p>那咋求哈夫曼树呢？先挑出最小的两个点，给它们一个父亲，让父亲的值是两者之和，之后把父亲<strong>加入到未选择的点里面</strong>，然后再在所有<strong>未选择的点中选择最小的两个结为兄弟</strong>，同时再给一个父亲，重复直到所有点都在一棵树里面。</p>

<p>由最优树生成的前缀码又称<strong>最优前缀码</strong>或<strong>哈夫曼码</strong></p>

<p>欸？树这章就这点东西吗，那为啥还要单开一章</p>]]></content><author><name>Yi Yue</name></author><category term="数学" /><category term="离散数学" /><summary type="html"><![CDATA[很简单的树，是给小朋友的，大朋友种的树……我暂时也种不了（]]></summary></entry></feed>