<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dragon Father&#39;s Blog</title>
    <link>https://blog.fokia.eu.org/</link>
    <description>Recent content on Dragon Father&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 27 Sep 2024 15:22:02 +0800</lastBuildDate><atom:link href="https://blog.fokia.eu.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
    <title>IPv6</title>
    <link>https://blog.fokia.eu.org/posts/ipv6/</link>
    <pubDate>Fri, 27 Sep 2024 15:22:02 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/ipv6/</guid>
    <description>
        &lt;h1 id=&#34;使用-incus-和-openwrt-实现-ipv6-自动配置及网络转发&#34;&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8-incus-%e5%92%8c-openwrt-%e5%ae%9e%e7%8e%b0-ipv6-%e8%87%aa%e5%8a%a8%e9%85%8d%e7%bd%ae%e5%8f%8a%e7%bd%91%e7%bb%9c%e8%bd%ac%e5%8f%91&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    使用 Incus 和 OpenWrt 实现 IPv6 自动配置及网络转发
&lt;/h1&gt;
&lt;p&gt;本文总结了在 Incus（原 LXD）环境中配置 OpenWrt 容器，并通过系统配置实现 IPv6 自动化配置及网络转发的过程。通过配置网络接口和调整防火墙规则，能够实现 IPv6 的正常使用。&lt;/p&gt;
&lt;p&gt;来自ChatGPT润色，不明白为何所有AI都要删除我这个原话，应该是口语化以及不确定。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;混合systemd-networkd配置openwrt0网卡，添加默认路由，额外配置接受RA，sysctl应该被systemd-networkd屏蔽了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;事实上sysctl设置的参数，确实没用。在网上看到了相关说法。&lt;/p&gt;
&lt;h2 id=&#34;一openwrt-容器配置&#34;&gt;
    &lt;a href=&#34;#%e4%b8%80openwrt-%e5%ae%b9%e5%99%a8%e9%85%8d%e7%bd%ae&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    一、OpenWrt 容器配置
&lt;/h2&gt;
&lt;p&gt;首先，OpenWrt 容器通过 Incus 配置好网络接口。以下是容器的部分配置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;architecture&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;x86_64&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;config&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;boot.autostart&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;security.privileged&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;devices&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;eth0&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;nictype&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;physical&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;parent&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;eth0&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;nic&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;eth1&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;network&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;openwrt0&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;nic&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;ppp&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;path&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/dev/ppp&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unix-char&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;profiles&lt;/span&gt;:
- &lt;span style=&#34;color:#ae81ff&#34;&gt;default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键点&#34;&gt;
    &lt;a href=&#34;#%e5%85%b3%e9%94%ae%e7%82%b9&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    关键点：
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;eth0 接口&lt;/strong&gt; 连接到宿主机的物理网络。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;eth1 接口&lt;/strong&gt; 连接到虚拟网络 &lt;code&gt;openwrt0&lt;/code&gt;，用于内部网络通信。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二openwrt-网络配置&#34;&gt;
    &lt;a href=&#34;#%e4%ba%8copenwrt-%e7%bd%91%e7%bb%9c%e9%85%8d%e7%bd%ae&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    二、OpenWrt 网络配置
&lt;/h2&gt;
&lt;p&gt;在 OpenWrt 容器中，设置了 IPv6 的 DHCPv6 和路由通告服务，使得局域网中的设备能够自动配置 IPv6 地址。关键配置如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;config interface &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;lan&amp;#39;&lt;/span&gt;
    option proto &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;static&amp;#39;&lt;/span&gt;
    option device &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eth1&amp;#39;&lt;/span&gt;
    option ipaddr &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;10.209.47.254&amp;#39;&lt;/span&gt;
    option netmask &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;255.255.255.0&amp;#39;&lt;/span&gt;
    option ip6assign &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;64&amp;#39;&lt;/span&gt;
    option dhcpv6 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;server&amp;#39;&lt;/span&gt;
    option ra &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;server&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键点-1&#34;&gt;
    &lt;a href=&#34;#%e5%85%b3%e9%94%ae%e7%82%b9-1&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    关键点：
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4 地址&lt;/strong&gt; 设置为 &lt;code&gt;10.209.47.254&lt;/code&gt;，用于内部网络管理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6 地址&lt;/strong&gt; 通过 &lt;code&gt;ip6assign&lt;/code&gt; 和 DHCPv6 服务自动分配，确保局域网设备可以通过 SLAAC 获取 IPv6 地址。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三宿主机网络配置&#34;&gt;
    &lt;a href=&#34;#%e4%b8%89%e5%ae%bf%e4%b8%bb%e6%9c%ba%e7%bd%91%e7%bb%9c%e9%85%8d%e7%bd%ae&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    三、宿主机网络配置
&lt;/h2&gt;
&lt;p&gt;宿主机通过 &lt;code&gt;systemd-networkd&lt;/code&gt; 管理虚拟网卡 &lt;code&gt;openwrt0&lt;/code&gt;，并接受来自 OpenWrt 容器的路由通告。以下是相关的 &lt;code&gt;systemd-networkd&lt;/code&gt; 配置文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Match]&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;openwrt0&lt;/span&gt;

&lt;span style=&#34;color:#66d9ef&#34;&gt;[Network]&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;Gateway&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;10.209.47.254&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;Address&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;10.209.47.1/24&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;IPv6AcceptRA&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;yes&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;IPv6Forwarding&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键点-2&#34;&gt;
    &lt;a href=&#34;#%e5%85%b3%e9%94%ae%e7%82%b9-2&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    关键点：
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv6AcceptRA&lt;/strong&gt;：启用该选项确保宿主机接受来自 OpenWrt 的路由通告，自动获取 IPv6 地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6Forwarding&lt;/strong&gt;：开启 IPv6 转发，允许网络中的设备通过宿主机的 IPv6 地址进行通信。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;四手动启动-eth1-接口并添加防火墙规则&#34;&gt;
    &lt;a href=&#34;#%e5%9b%9b%e6%89%8b%e5%8a%a8%e5%90%af%e5%8a%a8-eth1-%e6%8e%a5%e5%8f%a3%e5%b9%b6%e6%b7%bb%e5%8a%a0%e9%98%b2%e7%81%ab%e5%a2%99%e8%a7%84%e5%88%99&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    四、手动启动 eth1 接口并添加防火墙规则
&lt;/h2&gt;
&lt;p&gt;为了确保每次启动时 &lt;code&gt;eth1&lt;/code&gt; 网络接口正常工作，并设置合适的防火墙规则，创建了一个 &lt;code&gt;systemd&lt;/code&gt; 服务文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Unit&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
Description&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Add default route and up eth1 after LXD startup
After&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;incus.service

&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Service&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
Type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;oneshot
ExecStart&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;sh -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ip link set eth1 up &amp;amp;&amp;amp; ip6tables -A FORWARD -j ACCEPT&amp;#39;&lt;/span&gt;

&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Install&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
WantedBy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键点-3&#34;&gt;
    &lt;a href=&#34;#%e5%85%b3%e9%94%ae%e7%82%b9-3&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    关键点：
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;eth1 接口&lt;/strong&gt; 在 Incus 启动后自动启用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防火墙规则&lt;/strong&gt; 设置为接受所有 IPv6 转发流量，确保网络之间的通信正常。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;总结&#34;&gt;
    &lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    总结
&lt;/h2&gt;
&lt;p&gt;通过合理配置 OpenWrt 容器和宿主机的网络接口，以及添加必要的防火墙规则，可以有效实现 IPv6 的自动配置和网络转发功能。这一方案适用于需要在虚拟化环境中构建复杂网络拓扑的场景。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>仙剑-林月如</title>
    <link>https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/</link>
    <pubDate>Fri, 15 Dec 2023 10:55:41 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/</guid>
    <description>
        &lt;p&gt;起因是昨天晚上也就是2023年12月14日，在B站看到了有up主在直播速通仙剑1。之前看到这种我基本不点进去，在直播间外看一会就会划过去，偶有点进去也看不了多久。&lt;br&gt;
上次仙剑直播还是仙剑七发售前那会，一名叫作游戏动力的up主在直播仙剑系列。好像也是冬天。不同于速通，他会念剧情，还带配音，和猫躺在一个被窝，看着手机直播还是很舒服的。&lt;/p&gt;
&lt;p&gt;可昨天不知为何多看了会，可能是在折腾树莓派，也可能是看到有意思的点了，和直播间的观众互动了下。直到，钻进被窝。看到了锁妖塔。看到了林月如为了救李逍遥、赵灵儿而被落下的巨石砸到。弥留之际告诉李逍遥，她娘想要见他。在李逍遥说出，我很累，下次吧。之后淡然说到好吧，转身离去那一刹那。瞬间破防了，让我感觉十分的难受。十五年前游玩的记忆随着后面李逍遥回忆与林月如的画面一起涌现出来。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/1.jpg&#34; 
    alt=&#34;1&#34; 
     
    width=2340 
    height=&#34;1080&#34;  /&gt;&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/2.jpg&#34; 
    alt=&#34;2&#34; 
     
    width=2340 
    height=&#34;1080&#34;  /&gt;&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/3.jpg&#34; 
    alt=&#34;3&#34; 
     
    width=2340 
    height=&#34;1080&#34;  /&gt;&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/4.jpg&#34; 
    alt=&#34;4&#34; 
     
    width=2340 
    height=&#34;1080&#34;  /&gt;&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%99%E5%89%91%E4%B8%8E%E6%9E%97%E6%9C%88%E5%A6%82/5.jpg&#34; 
    alt=&#34;5&#34; 
     
    width=2340 
    height=&#34;1080&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;我退出直播间，又开始搜索隐藏结局。虽然我知道这是众多游戏玩家的一次幻想。不过在看过众多动画，评论后，逐渐也更加明了起来。月如没死，可在仙1这个阶段也不能算活着，后来圣姑应该用傀儡虫维持了月如的生命，这在仙1剧情中确实有体现。仙2后面也说有最终用魔界神器确实复活了月如。总之官方给了大家一个可选的美好结局。&lt;/p&gt;
&lt;p&gt;看了些相关的视频片段和大家的讨论后，有一个观点第一次出现在视野里。那就是“十里坡剑神”，是一位网友在某个真人扮演假设的仙剑视频下评论的。&lt;br&gt;
先说视频内容，这个视频用真人演绎了在玩仙剑不同阶段，对林月如态度的变化，与我本人此刻脑海中的想法如出一辙。确实在5年级左右玩耍的时候，我注重的是剧情的推进，对怪物的消灭。林月如的离去固然让我失望，可注意力马上又会沉浸在后面的剧情中。甚至后面二刷，在得知月如会被剧情杀之后，会给他换上廉价的装备。&lt;br&gt;
直到现在，up主说出了，经验还不够，要与月如继续杀怪。才感觉这也是个不错的办法。&lt;/p&gt;
&lt;p&gt;评论中的十里坡剑神，更引发了我的遐想。我不知道后面的路，我只是在十里坡打蜜蜂刷怪，成为一代剑神。这样就不会有后面离别的痛苦了。
今天看了下相关话题，来源于台湾一位老哥，后来在知乎上引发讨论，到底能不能半年内在十里坡升到71级，达成十里坡剑神。一名大学生亲自达成了这个成就获得了官方十里坡剑神的奖杯，并顺带达成赵灵儿十里坡武神的成就。&lt;/p&gt;
&lt;p&gt;一个出品时间1995年比我年纪都要大的游戏，总是会在有些时刻带给我触动。我还记得第一个网名，叫做酒剑仙。仙剑对我的影响可能比我想象的还要大。&lt;br&gt;
曾经很长一段时间内我想的应该就是成为李逍遥那样的人，行侠仗义。甚至现在回想起来，我小时候的一些品格，可能也来自于此。随着年龄的增长，在社会中的摸爬滚打，这颗行侠的初心，敦厚的品质沾染上了许多灰尘。19年晚上，在北京城中村我看到喝醉的骑手在我面前摔倒，我没扶，我甚至还拦住了阿收。我怕生事。后来21年回到焦作，在楼下我看到跌倒的老人我也没扶，虽然有一段举例。虽然上面这些情况有人立刻施以援手，我可以用这些作为借口。可每当我回忆起往事的时候，每当我在一些情境下重新体验到孩童时期美好的，优良的潜移默化的浕染时。我总会想起这些事情，后悔与鄙视我自己。&lt;/p&gt;
&lt;p&gt;关于爱情，我亦有些心得。林月如最后一个要求是让李逍遥陪她去见母亲，逍遥不应，于是转身离去。大众上的理解就是去了另一个世界，逍遥没有答应就活了下来。我却想过有没有一种可能只是单纯的和月如见了她娘，最后两人双双回来呢，像鬼吹灯电影里的彼岸花那样。游戏中没有这样的如果，事实就是这样遗憾。“我累了，等下次吧”，就这样再也没能与月如相见。我想在实际生活中，也尽量不要让另一半失望，有些事情没有一起做可能真会成为一辈子的遗憾。&lt;/p&gt;
&lt;p&gt;这一上午，没干什么事，偶然有些想法记记，看来，来到老家工作还是不错的，符合我本人想法。&lt;/p&gt;
&lt;p&gt;最后，牢骚太盛防肠断，风物长宜放眼量。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Bridge</title>
    <link>https://blog.fokia.eu.org/posts/bridge/</link>
    <pubDate>Fri, 08 Dec 2023 08:56:24 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/bridge/</guid>
    <description>
        &lt;p&gt;bridge，中文经常翻译为桥接。&lt;br&gt;
中文论坛上多出现在家庭网络，桥接光猫，使用路由器拨号，提升网络性能，获取公网IP。&lt;br&gt;
到底什么是桥接？&lt;br&gt;
看下wiki：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;桥接器（英语：network bridge），又称网桥，一种网络设备，负责网络桥接（network bridging）。桥接器将网络的多个网段在数据链路层（OSI模型第2层）连接起来（即桥接）。&lt;br&gt;
桥接器有别于路由器。路由器允许多网络之间的独立通信，但又保持区隔，而桥接器则是将两个独立的网络连接起来，就如同单一网络。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在Linux上，经过对docker、qemu等容器虚拟化软件的操作。&lt;br&gt;
个人得出如下粗浅理解：&lt;br&gt;
桥接就是将被桥接的网卡视为一根网线，在二层连接目的网络。这就可以理解为什么要把被桥接接口的IP信息去掉，桥接的接口才能使用。&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brctl addbr br0
ip link set br0 up
ip addr add 192.168.31.92/24 dev br0
ip addr del 192.168.31.92/24 dev enp1s0
brctl addif br0 enp1s0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;暂时就这么多~&lt;/p&gt;
&lt;p&gt;附上ChatGPT的肯定，蚌&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;内容中提到的桥接的概念和原理是正确的。桥接器是一种网络设备，用于在数据链路层将多个网段连接起来，并将它们看作一个单一的网络。与路由器不同，桥接器在网络层之下工作，不会对网络进行分割，而是将不同网段的网络连接在一起。&lt;br&gt;
在Linux上，通过使用工具如brctl和ip命令，可以创建和配置桥接设备。桥接设备可以将多个物理或虚拟的网络接口（如网卡或虚拟机网络接口）连接起来，形成一个共享的网络。&lt;br&gt;
在给出的示例中，使用了brctl和ip命令来创建一个名为br0的桥接设备，并将物理接口enp1s0添加到该桥接设备中。通过这样的配置，通过br0设备发送和接收的数据包将在桥接设备上进行转发，从而实现不同网络接口之间的通信。&lt;br&gt;
总体而言，给出的内容对桥接的概念和在Linux上的配置进行了正确的解释。参考链接也提供了进一步了解桥接的相关信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参考链接:&lt;br&gt;
&lt;a href=&#34;https://mp.weixin.qq.com/s?__biz=MzkxNTU4NjQ3MA==&amp;amp;mid=2247483738&amp;amp;idx=1&amp;amp;sn=9151e28f3d2d8f3f7c6d5d0fc233e162&amp;amp;chksm=c15dad93f62a24853a5c3e269cd63812909fad90b1742eac56d429cbb48ca85fea008202d3a9&amp;amp;cur_album_id=3142867024373612546&amp;amp;scene=189#wechat_redirect&#34;&gt;Linux 网络设备 - Bridge &amp;amp; Veth Pair&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%A9%8B%E6%8E%A5%E5%99%A8&#34;&gt;桥接器&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>KVM鼠标</title>
    <link>https://blog.fokia.eu.org/posts/kvm%E9%BC%A0%E6%A0%87/</link>
    <pubDate>Mon, 26 Jun 2023 11:11:21 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/kvm%E9%BC%A0%E6%A0%87/</guid>
    <description>
        &lt;p&gt;2023年12月15日更新&lt;/p&gt;
&lt;p&gt;其实服务端装好libvirt还有qemu-kvm（好像叫这个名字），相关依赖。客户端使用virt-manager连接上，直接使用模板新建虚拟机应该配置的就可以。之前那个虚拟机开始好像是手动写的配置文件或者命令。再加上用的久了，windows~很正常。什么时候真出问题的话，再说。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;kvm启动的win10虚拟机，突然鼠标不管用了。&lt;br&gt;
也不能说突然，在拔掉鼠标再插进去后，不管用了。&lt;br&gt;
重定向usb设备，也不行。&lt;br&gt;
并且重定向usb设备，主机也不能用了。&lt;br&gt;
对着ChatGPT一顿描述，最终给了一行配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;input type=&amp;quot;tablet&amp;quot; bus=&amp;quot;usb&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;反正雷柏的滚轮也不行了。换上给局长买的双飞燕。&lt;br&gt;
OK了，兄弟们。美滋滋～&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2023年06月27日 更新&lt;/p&gt;
&lt;p&gt;剪贴板共享一直不能用，来来回回驱动、guest-agetnt-tools、重启折腾了几十次。&lt;br&gt;
看见任务栏里的向日葵图标陷入了沉思。&lt;br&gt;
突然想起来之前向日葵的显卡影响过远程。但是具体哪块功能忘记了。&lt;br&gt;
禁用！你妈的。
剪贴板共享可以了。焯！&lt;br&gt;
傻B，向日葵&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Office工程师</title>
    <link>https://blog.fokia.eu.org/posts/office%E5%B7%A5%E7%A8%8B%E5%B8%88/</link>
    <pubDate>Mon, 26 Jun 2023 10:42:47 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/office%E5%B7%A5%E7%A8%8B%E5%B8%88/</guid>
    <description>
        &lt;h2 id=&#34;excel&#34;&gt;
    &lt;a href=&#34;#excel&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    EXCEL
&lt;/h2&gt;
&lt;p&gt;不是WPS我不用！&lt;br&gt;
他妈的。&lt;br&gt;
1个被引用的表格，称之为A，一个引用了A中数据的表格称之为B。&lt;br&gt;
每次打开B的时候，都会提示：&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/office%E5%B7%A5%E7%A8%8B%E5%B8%88/refexcel.png&#34; 
    alt=&#34;&#34; 
     
    width=1279 
    height=&#34;716&#34;  /&gt;&lt;br&gt;
让我感觉引用的A中数据发生了变化，实则不然。&lt;br&gt;
更新或不更新都OK。&lt;br&gt;
我去，WPS~&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>鹤岗选调生985艺术家B友</title>
    <link>https://blog.fokia.eu.org/posts/%E5%85%AC%E5%8A%A1%E5%91%98/%E9%B9%A4%E5%B2%97%E9%80%89%E8%B0%83%E7%94%9F985%E8%89%BA%E6%9C%AF%E5%AE%B6b%E5%8F%8B/</link>
    <pubDate>Sat, 20 May 2023 23:01:45 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E5%85%AC%E5%8A%A1%E5%91%98/%E9%B9%A4%E5%B2%97%E9%80%89%E8%B0%83%E7%94%9F985%E8%89%BA%E6%9C%AF%E5%AE%B6b%E5%8F%8B/</guid>
    <description>
        &lt;style&gt;
.aspect-ratio {
        position: relative;
        width: 100%;
        height: 0;
        padding-bottom: 75%;
}

.aspect-ratio iframe {
        position: absolute;
        width: 100%;
        height: 100%;
        left: 0;
        top: 0;
}
&lt;/style&gt;


&lt;div align=center class=&#34;aspect-ratio&#34;&gt;
        &lt;iframe src=&#34;https://player.bilibili.com/player.html?aid=356259953&amp;&amp;page=1&amp;as_wide=1&amp;high_quality=1&amp;danmaku=0&#34; 
                scrolling=&#34;no&#34; 
                border=&#34;0&#34; 
                frameborder=&#34;no&#34; 
                framespacing=&#34;0&#34; 
                allowfullscreen=&#34;true&#34;&gt; 
        &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;看B站峰哥视频有感。&lt;/p&gt;
&lt;p&gt;有时候也想当个公务员，对比老师不用考虑职称。&lt;/p&gt;
&lt;p&gt;像x老师这么大年纪了还要跑到新疆支教，为的就是在退休前升到高级职称。&lt;/p&gt;
&lt;p&gt;像我连个教资都没考下来，准确的说是一门也没过。垃中垃中垃。&lt;/p&gt;
&lt;p&gt;八嘎！&lt;/p&gt;
&lt;p&gt;艺术家b友看的很明白，村民看的也明白，村长说的也不错。&lt;/p&gt;
&lt;p&gt;以后村里没人就没人了，反正已经是这样了，大家都往城市里挤。&lt;/p&gt;
&lt;p&gt;不然盖的房子卖给谁，配套的资源谁来享受？&lt;/p&gt;
&lt;p&gt;村里的教育、医疗、娱乐也确实远远跟不上，这是正常趋势。&lt;/p&gt;
&lt;p&gt;在当前环境下，能让村里的老人过的舒服点，吃穿不愁，感觉&lt;del&gt;幸福感高&lt;/del&gt;比以前幸福。这样就不错了。&lt;/p&gt;
&lt;p&gt;以后的事留着以后再说吧。&lt;/p&gt;
&lt;p&gt;啥事都赖美国。&lt;/p&gt;
&lt;p&gt;参考链接:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.iyu.icu/posts/shortcode_bilibili/&#34;&gt;hugo 内嵌B站视频&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>傻b WindowsExplorer</title>
    <link>https://blog.fokia.eu.org/posts/sbwindows/</link>
    <pubDate>Wed, 17 May 2023 11:37:35 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/sbwindows/</guid>
    <description>
        &lt;p&gt;为了让大家愉快地通过ftp上传大文件，我搭建了vsftpd。&lt;/p&gt;
&lt;p&gt;为了省事更愉快，我让大家直接通过Windows资源管理器来连接ftp服务上传文件。&lt;/p&gt;
&lt;p&gt;于是，喜闻乐见的编码问题。&lt;/p&gt;
&lt;p&gt;Windows放以前应该一律GBK，不管是GB2312还是GB18000，都无所谓，反正都是GBK编码。&lt;/p&gt;
&lt;p&gt;不负责任的讲，在最近的版本中开始尝试utf-8。但是他的utf-8实现还有问题，至少在ftp这个情景模式下。&lt;/p&gt;
&lt;p&gt;先把utf-8编码的文件名，gbk一下。连接vsftp服务时，询问vsftp是否支持utf-8。&lt;/p&gt;
&lt;p&gt;vsftp返回肯定回答。&lt;/p&gt;
&lt;p&gt;于是傻b windows就重新把gbk后的文件名又utf8了，接着上传了一个不完整的文件名。&lt;/p&gt;
&lt;p&gt;抓包可证。&lt;/p&gt;
&lt;p&gt;于是愤而修改代码。让vsftp告诉WindowsExplorer不使用utf-8模式。就GBK吧。&lt;/p&gt;
&lt;p&gt;这样好歹客户端看起来正常，在服务端再做个简单转换，就行。麻烦无所谓，至少能恢复过来。&lt;/p&gt;
&lt;p&gt;中间也查询了其他解决方案，convmvfs，还有专利呢！&lt;/p&gt;
&lt;p&gt;随便试了下没按照预计的方式运行就搁置了。&lt;/p&gt;
&lt;p&gt;懒～&lt;/p&gt;
&lt;p&gt;vsftpd 源码修改记录，只要过编译，达到Always GBK的目的。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/sbwindows/diff1.png&#34; 
    alt=&#34;diff1&#34; 
     
    width=905 
    height=&#34;943&#34;  /&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/sbwindows/diff2.png&#34; 
    alt=&#34;diff2&#34; 
     
    width=999 
    height=&#34;623&#34;  /&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Uwsgi与nginx</title>
    <link>https://blog.fokia.eu.org/posts/uwsgi%E4%B8%8Enginx/</link>
    <pubDate>Thu, 06 Apr 2023 22:43:15 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/uwsgi%E4%B8%8Enginx/</guid>
    <description>
        &lt;p&gt;使用uwsgi部署Django程序。监听unix socket。&lt;br&gt;
之所以这样用，是因为不受端口数量限制，同时本人也有一点强迫症，不喜欢开很多端口。&lt;/p&gt;
&lt;p&gt;但是nginx的配置中，设置HTTP请求头无法转发过来。狠狠地chatgpt了一下，没用。&lt;br&gt;
还得Google大法。&lt;/p&gt;
&lt;p&gt;最终应该是nginx代理的是unix socket，所以proxy_set_header不管用。&lt;/p&gt;
&lt;p&gt;得通过uwsgi设置&amp;quot;HTTP_&amp;ldquo;为前缀的请求头。&lt;/p&gt;
&lt;p&gt;但是我看请求头里有个REMOTE_ADDR好像就是我需要的客户端公网IP地址，又切换手机流量做了几次测试，好像也正常。&lt;/p&gt;
&lt;p&gt;探究了下REMOTE_ADDR与X-Real-IP与X-Forwarded-For的区别，感觉还是不太准确。&lt;/p&gt;
&lt;p&gt;直到晚上，发现/etc/nginx/uwsgi_params文件里的内容。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uwsgi_param  REMOTE_ADDR        $remote_addr;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;确实跟我废了半天力气手动设置的X-Real-IP一模一样，尬住了。&lt;/p&gt;
&lt;p&gt;记录下来吧~&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>zsh与fd</title>
    <link>https://blog.fokia.eu.org/posts/zsh%E4%B8%8Efd/</link>
    <pubDate>Tue, 21 Mar 2023 21:22:40 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/zsh%E4%B8%8Efd/</guid>
    <description>
        &lt;p&gt;如何在以.开头的文件夹中查找某个文件&lt;br&gt;
主要适用于一些安装到HOME目录中的可执行文件。&lt;/p&gt;
&lt;p&gt;直接使用fd命令，只能一个个添加命令。&lt;br&gt;
配合zsh global命令？或者说模式，轻松秒杀&lt;br&gt;
fd pattern .*/&lt;/p&gt;
&lt;p&gt;如果想搜索当前目录下所有内容&lt;br&gt;
fd . . 也可以缩写为 fd
但是如果要搜索指定目录下符合扩展的文件 fd . -e ext dir&lt;br&gt;
例如 fd . -e html layouts&lt;br&gt;
直接 fd -e html layouts 是无法查找出文件的&lt;br&gt;
再增加一个fd grep 小技巧&lt;br&gt;
fd . -e scss . -x grep -l rem {}&lt;br&gt;
输出匹配grep 结果的文件名&lt;/p&gt;
&lt;p&gt;以下内容来自ChatGPT&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;zsh 的 glob 命令是一种用于文件名扩展的强大工具。它使得在 shell 中进行文件名匹配变得更加灵活和高效。Glob 允许你使用通配符来匹配文件或目录名，以便执行操作。&lt;/p&gt;
&lt;p&gt;下面是一些常见的 glob 通配符：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;*：匹配任意字符 0 次或多次。&lt;/li&gt;
&lt;li&gt;?：匹配任意单个字符。&lt;/li&gt;
&lt;li&gt;[abc]：匹配字符 a、b 或 c。&lt;/li&gt;
&lt;li&gt;[a-z]：匹配任何小写字母。&lt;/li&gt;
&lt;li&gt;[!abc]：匹配除了字符 a、b、c 以外的任何字符。&lt;/li&gt;
&lt;li&gt;{pattern1,pattern2,pattern3}：匹配模式 1 或模式 2 或模式 3。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是一些 glob 命令的示例：&lt;/p&gt;
&lt;p&gt;列出当前目录下所有的 .txt 文件&lt;br&gt;
ls *.txt&lt;/p&gt;
&lt;p&gt;列出当前目录下所有以 a、b 或 c 开头的文件&lt;br&gt;
ls [abc]*&lt;/p&gt;
&lt;p&gt;列出当前目录下所有以 a、b 或 c 开头且以 .txt 结尾的文件&lt;br&gt;
ls [abc]*.txt&lt;/p&gt;
&lt;p&gt;列出当前目录下所有以字母 a 或 b 开头的文件夹&lt;br&gt;
ls -d [ab]*/&lt;/p&gt;
&lt;p&gt;列出当前目录下所有以数字开头的文件夹&lt;br&gt;
ls -d [0-9]*/&lt;/p&gt;
&lt;p&gt;列出当前目录下所有以字母 a 或 b 开头的文件夹和以数字开头的文件夹&lt;br&gt;
ls -d [ab0-9]*/&lt;/p&gt;
&lt;p&gt;列出当前目录下所有 .txt 文件和 .md 文件&lt;br&gt;
ls *.{txt,md}&lt;/p&gt;
&lt;p&gt;除了上述示例中的命令，还有很多其他的 glob 命令可用于文件名扩展，如 **、^、() 和 $ 等等。总的来说，glob 是一个非常有用的工具，可以帮助你更高效地管理文件和目录。&lt;/p&gt;
&lt;/blockquote&gt;

    </description>
    </item>
    
    <item>
    <title>Git中submodule与gitignore</title>
    <link>https://blog.fokia.eu.org/posts/git%E4%B8%ADsubmodule%E4%B8%8Egitignore/</link>
    <pubDate>Mon, 26 Dec 2022 19:49:39 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/git%E4%B8%ADsubmodule%E4%B8%8Egitignore/</guid>
    <description>
        &lt;p&gt;hugo中主题用的都是submodule。&lt;/p&gt;
&lt;p&gt;对于强迫症来说，submodule中发生变化后，主项目目录也就是hugo项目中，会有一直有提示，但是主项目里还奈何不了。&lt;/p&gt;
&lt;p&gt;可以这样理解，submodule与git主项目其实是两回事。&lt;/p&gt;
&lt;p&gt;所以如果想ignore，子项目中某个文件。必须在子模块目录中更新.gitignore文件。&lt;/p&gt;
&lt;p&gt;可能会存在.gitignore不生效的问题，原因在于此文件存在于git的缓存目录中。执行&lt;code&gt;git rm -rf --cached .&lt;/code&gt; 然后再&lt;code&gt;git add .&lt;/code&gt;即可将工作目录中匹配.gitignore规则的文件排除之外。&lt;/p&gt;
&lt;p&gt;说的就是主题目录中，每次hugo server出现的貌似叫asserts/jsconfig.json的文件。&lt;/p&gt;
&lt;p&gt;解决方法，fork第三方主题。更新.gitignore。&lt;/p&gt;
&lt;p&gt;删除submodule,再重新添加fork后的主题。&lt;/p&gt;
&lt;p&gt;移除submodule&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git submodule deinit xxx
rm .git/submodule/xxx
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;没有截图，凭印象记录，:)&lt;/p&gt;
&lt;p&gt;核心思想，rm cached, .git fork。&lt;/p&gt;
&lt;p&gt;dddd&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>烦</title>
    <link>https://blog.fokia.eu.org/posts/fj/%E7%83%A6/</link>
    <pubDate>Mon, 26 Dec 2022 16:03:18 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/fj/%E7%83%A6/</guid>
    <description>
        &lt;p&gt;烦，干啥都烦……&lt;/p&gt;
&lt;p&gt;烦的根源来自于懒，懒的根源源自哪里？&lt;/p&gt;
&lt;p&gt;烦咳嗽，烦屁事，烦静不下心。&lt;/p&gt;
&lt;p&gt;烦hugo这傻屌目录信息，生成这傻屌文件。&lt;/p&gt;
&lt;p&gt;烦clash没个好用的开源客户端，配置又不够简单。&lt;/p&gt;
&lt;p&gt;烦自己的线路三天两头出问题，焯。&lt;/p&gt;
&lt;p&gt;还烦啥？&lt;/p&gt;
&lt;p&gt;快递不能按时发，&lt;/p&gt;
&lt;p&gt;折腾的东西不靠谱，&lt;/p&gt;
&lt;p&gt;痛苦……&lt;/p&gt;
&lt;p&gt;还是懒:(, 上次迁移的虚拟机镜像也不知道放哪了，哈&lt;/p&gt;
&lt;p&gt;2023年04月12日更新，现在已经不知道烦什么了&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>梁莉</title>
    <link>https://blog.fokia.eu.org/posts/sb/</link>
    <pubDate>Sun, 27 Nov 2022 22:58:20 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/sb/</guid>
    <description>
        &lt;p&gt;梁莉&lt;/p&gt;
&lt;p&gt;15737116223&lt;/p&gt;
&lt;p&gt;410104196605013029&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/sb/sbll.png&#34; 
    alt=&#34;sbll&#34; 
     
    width=887 
    height=&#34;1920&#34;  /&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Vim正则</title>
    <link>https://blog.fokia.eu.org/posts/vim%E6%AD%A3%E5%88%99/</link>
    <pubDate>Thu, 12 May 2022 18:10:51 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/vim%E6%AD%A3%E5%88%99/</guid>
    <description>
        &lt;p&gt;或 &lt;code&gt;\|&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/vim%E6%AD%A3%E5%88%99/vimor.png&#34; 
    alt=&#34;vimor&#34; 
     
    width=640 
    height=&#34;425&#34;  /&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Sqlmap 验证漏洞</title>
    <link>https://blog.fokia.eu.org/posts/sqlmap-%E9%AA%8C%E8%AF%81%E6%BC%8F%E6%B4%9E/</link>
    <pubDate>Fri, 08 Apr 2022 10:28:21 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/sqlmap-%E9%AA%8C%E8%AF%81%E6%BC%8F%E6%B4%9E/</guid>
    <description>
        &lt;p&gt;sqlmap 验证漏洞&lt;br&gt;
每当对一个战点进行注入扫描后，会在用户目录.sqlmap/output/${sitename}中生成几个文件，分别是 log 日志信息，session.sqlite 会话信息，target.txt 目标信息里面的内容是最新一次的检测参数。&lt;br&gt;
重点在于第二个文件，里面存储的是注入点相关信息，这样在跑出结果后，使用相关payload 就不用每次再跑一次漏洞点。效率比较高。&lt;br&gt;
但是对验证漏洞的时候就不那么友好了，加上 &amp;ndash;is-dba 输出的迷惑信息。在漏洞不再存在后输出 False，让人感觉漏洞依然存在。十分迷惑。&lt;br&gt;
针对验证漏洞的场景可以加上 &amp;ndash;flush-session 参数，删除会话缓存，更准确的检测漏洞修复情况。&lt;br&gt;
类似的，sqlmap 还会缓存数据，但是数据库中的数据同样也在变化。可以使用参数 &amp;ndash;fresh-quries 来随时获取最新结果。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>从VirtualBox到WMware</title>
    <link>https://blog.fokia.eu.org/posts/%E4%BB%8Evirtualbox%E5%88%B0wmware/</link>
    <pubDate>Wed, 30 Mar 2022 22:19:10 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E4%BB%8Evirtualbox%E5%88%B0wmware/</guid>
    <description>
        &lt;p&gt;上岸准备系列:)&lt;/p&gt;
&lt;h2 id=&#34;迁移&#34;&gt;
    &lt;a href=&#34;#%e8%bf%81%e7%a7%bb&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    迁移
&lt;/h2&gt;
&lt;p&gt;迁移公司电脑上的VirtualBox虚拟机Archlinux至在公司捡的破烂主力机VMware中。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一个问题&lt;br&gt;
导出格式记得选开放式虚拟化标准1.0。&lt;br&gt;
开始选了2.0，结果VMware不支持。网上说甚至这个标准还是VMware推出的。&lt;em&gt;666&lt;/em&gt;&lt;br&gt;
OVA更好只用导出一个文件，OVF应该是多个文件（没用这个模式测试）&lt;br&gt;
为了更快的移动虚拟机镜像文件，采用U盘物理拷贝。&lt;/li&gt;
&lt;li&gt;第二个问题&lt;br&gt;
U盘空闲容量12G左右，虚拟机镜像17G。&lt;br&gt;
&lt;code&gt;split -C 10G Arch.ova&lt;/code&gt;&lt;br&gt;
将镜像文件按照10G的尺寸分离为两个二禁制文件。xxa，xxb。&lt;br&gt;
依次拷贝至主机。&lt;br&gt;
&lt;code&gt;cat xxa xxb &amp;gt; Arch.ova&lt;/code&gt;&lt;br&gt;
合并导入。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;-分区扩容&#34;&gt;
    &lt;a href=&#34;#-%e5%88%86%e5%8c%ba%e6%89%a9%e5%ae%b9&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    / 分区扩容
&lt;/h2&gt;
&lt;p&gt;根分区空间又不够了。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VMware界面增加磁盘镜像容量。&lt;/li&gt;
&lt;li&gt;parted 交互式扩容
由于/分区位于磁盘镜像最后一个分区，推荐安装系统的时候采用此布局，方便后续扩容。&lt;br&gt;
&lt;code&gt;resizepart NUM END&lt;/code&gt;&lt;br&gt;
NUM 磁盘分区号，END结束位置。磁盘信息可以看到结尾位置。&lt;/li&gt;
&lt;li&gt;扩容文件系统
btrfs文件系统
&lt;code&gt;btrfs filesystem resize max /&lt;/code&gt;&lt;br&gt;
扩容完成，以上操作均在挂载其他live镜像下操作完成，挂载/分区时直接操作有警告，但未尝试能否直接进行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;vmware增强功能&#34;&gt;
    &lt;a href=&#34;#vmware%e5%a2%9e%e5%bc%ba%e5%8a%9f%e8%83%bd&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    VMware增强功能
&lt;/h2&gt;
&lt;p&gt;高分辨率显示，剪贴板共享，文件拖放支持。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装open-vm-tools并开启服务
systemctl start vmtoolsd.service&lt;br&gt;
systemctl enable vmtoolsd.service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sudo pacman -S gtkmm3&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相关驱动&lt;br&gt;
&lt;code&gt;sudo pacman -S xf86-input-vmmouse xf86-video-vmware&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;附&#34;&gt;
    &lt;a href=&#34;#%e9%99%84&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    附
&lt;/h2&gt;
&lt;p&gt;秘钥相关问题，无脑更新keyring&lt;br&gt;
&lt;code&gt;sudo pacman -S archlinux-keyring&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;来张图，表示又浪费了快1个小时
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E4%BB%8Evirtualbox%E5%88%B0wmware/arch_20220330230739.png&#34; 
    alt=&#34;screenfetch&#34; 
     
    width=2420 
    height=&#34;1282&#34;  /&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>最后再骑你一次</title>
    <link>https://blog.fokia.eu.org/posts/%E6%9C%80%E5%90%8E%E5%86%8D%E9%AA%91%E4%BD%A0%E4%B8%80%E6%AC%A1/</link>
    <pubDate>Sat, 26 Mar 2022 19:22:44 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E6%9C%80%E5%90%8E%E5%86%8D%E9%AA%91%E4%BD%A0%E4%B8%80%E6%AC%A1/</guid>
    <description>
        &lt;p&gt;在两天前的晚上。也就是西历二〇二二年三月二十四日。&lt;br&gt;
举桑搬到了杭州，开始新的奋斗。&lt;br&gt;
不只不觉和他在这个出租屋又度过了半个大学时光。&lt;br&gt;
我在郑州又成了一个人，与以往不同的是，多了只猫。&lt;br&gt;
但是感觉好像更加孤独了，总是感觉孤独，哈哈。&lt;br&gt;
中午睡觉的时候，猫最后一次骑到了他的身上，可能猫也能感觉到他要离开吧。&lt;br&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E6%9C%80%E5%90%8E%E5%86%8D%E9%AA%91%E4%BD%A0%E4%B8%80%E6%AC%A1/cat1.jpg&#34; 
    alt=&#34;cat1&#34; 
     
    width=4000 
    height=&#34;3000&#34;  /&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E6%9C%80%E5%90%8E%E5%86%8D%E9%AA%91%E4%BD%A0%E4%B8%80%E6%AC%A1/cat2.jpg&#34; 
    alt=&#34;cat1&#34; 
     
    width=4000 
    height=&#34;3000&#34;  /&gt;
&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E6%9C%80%E5%90%8E%E5%86%8D%E9%AA%91%E4%BD%A0%E4%B8%80%E6%AC%A1/cat3.jpg&#34; 
    alt=&#34;cat1&#34; 
     
    width=4000 
    height=&#34;3000&#34;  /&gt;
我也要走了，必须走了，待的够久了。&lt;br&gt;
焯！&lt;br&gt;
&lt;a href=&#34;https://imgtu.com/i/qwaLWj&#34;&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://s1.ax1x.com/2022/03/27/qwaLWj.jpg&#34; 
    alt=&#34;qwaLWj.jpg&#34; 
     /&gt;&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>国庆又到来啦</title>
    <link>https://blog.fokia.eu.org/posts/%E6%96%B0%E7%9A%84%E7%AF%87%E7%AB%A0/</link>
    <pubDate>Fri, 01 Oct 2021 00:52:58 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E6%96%B0%E7%9A%84%E7%AF%87%E7%AB%A0/</guid>
    <description>
        &lt;p&gt;八嘎
markdown&lt;/p&gt;
&lt;p&gt;看你怎么渲染&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;射箭&lt;/li&gt;
&lt;li&gt;唱歌&lt;/li&gt;
&lt;li&gt;喝酒&lt;/li&gt;
&lt;li&gt;钓鱼&lt;/li&gt;
&lt;li&gt;做饭&lt;/li&gt;
&lt;li&gt;撸猫&lt;/li&gt;
&lt;/ul&gt;

    </description>
    </item>
    
    <item>
    <title>优雅的断开 ssh</title>
    <link>https://blog.fokia.eu.org/posts/%E4%BC%98%E9%9B%85%E7%9A%84%E6%96%AD%E5%BC%80-ssh/</link>
    <pubDate>Mon, 07 Jan 2019 16:57:49 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E4%BC%98%E9%9B%85%E7%9A%84%E6%96%AD%E5%BC%80-ssh/</guid>
    <description>
        &lt;p&gt;linux 上用的最多的远程工具一定是 ssh 莫属了，平时怎么断开呢？&lt;/p&gt;
&lt;p&gt;Ctrl + D&lt;/p&gt;
&lt;p&gt;一般情况下还可以~&lt;/p&gt;
&lt;p&gt;假如碰到种种问题，ssh 没有响应了呢，按什么都不好使。一般只能粗暴的退出终端，还要再点一下确认关闭，很是麻烦，以及 ugly ：）&lt;/p&gt;
&lt;p&gt;正确做法&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果发现没用，先按下回车，一下不行两下，再重复上面步骤&lt;br&gt;
优雅又通用，无论是在什么情况下，都可以轻松退出。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>core &amp; ks</title>
    <link>https://blog.fokia.eu.org/posts/core-ks/</link>
    <pubDate>Tue, 11 Dec 2018 10:48:09 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/core-ks/</guid>
    <description>
        &lt;h2 id=&#34;行行重行行&#34;&gt;
    &lt;a href=&#34;#%e8%a1%8c%e8%a1%8c%e9%87%8d%e8%a1%8c%e8%a1%8c&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    行行重行行
&lt;/h2&gt;
&lt;p&gt;行行重行行，与君生别离1。&lt;/p&gt;
&lt;p&gt;相去万余里，各在天一涯2；&lt;/p&gt;
&lt;p&gt;道路阻且长，会面安可知3？&lt;/p&gt;
&lt;p&gt;胡马依北风，越鸟巢南枝4。&lt;/p&gt;
&lt;p&gt;相去日已远，衣带日已缓5；&lt;/p&gt;
&lt;p&gt;浮云蔽白日，游子不顾反6。&lt;/p&gt;
&lt;p&gt;思君令人老，岁月忽已晚7。&lt;/p&gt;
&lt;p&gt;弃捐勿复道，努力加餐饭8！&lt;/p&gt;
&lt;p&gt;before&lt;/p&gt;
&lt;p&gt;青青河畔草&lt;/p&gt;
&lt;p&gt;青青河畔草，郁郁园中柳9。&lt;/p&gt;
&lt;p&gt;盈盈楼上女，皎皎当窗牖10。&lt;/p&gt;
&lt;p&gt;娥娥红粉妆11，纤纤出素手。&lt;/p&gt;
&lt;p&gt;昔为倡家女，今为荡子妇12。&lt;/p&gt;
&lt;p&gt;荡子行不归，空床难独守。&lt;/p&gt;
&lt;p&gt;after&lt;/p&gt;
&lt;p&gt;青青陵上柏&lt;br&gt;
青青陵上柏，磊磊涧中石13。&lt;br&gt;
人生天地间，忽如远行客14。&lt;br&gt;
斗酒相娱乐，聊厚不为薄15。&lt;br&gt;
驱车策驽马，游戏宛与洛16。&lt;br&gt;
洛中何郁郁，冠带自相索17。&lt;br&gt;
长衢罗夹巷，王侯多第宅18。&lt;br&gt;
两宫遥相望，双阙百余尺19。&lt;br&gt;
极宴娱心意，戚戚何所迫20。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
今日良宴会  
今日良宴会，欢乐难具陈21。  
弹筝奋逸响，新声妙入神22。  
令德唱高言，识曲听其真23。  
齐心同所愿，含意俱未申24。  
人生寄一世，奄忽若飙尘25。  
何不策高足，先据要路津26。  
无为守穷贱，轗轲长苦辛27。

* * *

西北有高楼  
西北有高楼，上与浮云齐。  
交疏结绮窗，阿阁三重阶28。  
上有弦歌声，音响一何悲29！  
谁能为此曲，无乃杞梁妻30。  
清商随风发，中曲正徘徊31。  
一弹再三叹，慷慨有余哀32。  
不惜歌者苦，但伤知音稀33。  
愿为双鸿鹄34，奋翅起高飞。

![newbee](/home/archie/Pictures/kn-icon.png)

&lt;/code&gt;&lt;/pre&gt;
    </description>
    </item>
    
    <item>
    <title>新的生活</title>
    <link>https://blog.fokia.eu.org/posts/%E6%96%B0%E7%9A%84%E7%94%9F%E6%B4%BB/</link>
    <pubDate>Tue, 24 Jul 2018 00:07:58 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E6%96%B0%E7%9A%84%E7%94%9F%E6%B4%BB/</guid>
    <description>
        &lt;p&gt;更新&lt;br&gt;
Wed 23 Mar 19:39:05 CST 2022&lt;br&gt;
&lt;strong&gt;考试指定上岸&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;😅😅😅😅😅&lt;/p&gt;
&lt;p&gt;更新
2022年11月28日&lt;br&gt;
&lt;strong&gt;确实上岸了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;😂😂😂😂😂&lt;/p&gt;
&lt;p&gt;现在已是 7.24 日 0:10 了 。这样算来，来到北京已经三日有余，我运气很好，碰到了两个很年轻的房东，他们都是程序员，&lt;del&gt;非常厉害&lt;/del&gt;的程序员(&lt;strong&gt;社畜罢了&lt;/strong&gt;)。&lt;/p&gt;
&lt;p&gt;期间我去看了望京，看了后海，逛了胡同，以及在昨天做了一碗面条，炒了第一个菜。&lt;/p&gt;
&lt;p&gt;我时常说对别人讲努力奋斗，也时常说成年人的生活里没有容易两个字，目前看来，我的想法还算正确。因为只有做好了被生活毒打的充分准备，才能更加游刃有余的面对生活。&lt;/p&gt;
&lt;p&gt;我喜欢北京，我喜欢接受挑战，我喜欢荒野求生，只是有时候也贪图安逸的生活，需要注意。&lt;/p&gt;
&lt;p&gt;明天就要入职上班了，内心有些许的激动，但更多的是平静。&lt;/p&gt;
&lt;p&gt;这确实是新的生活了，定一个小目标，努力奋斗，争取转正，学到更多东西！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E6%96%B0%E7%9A%84%E7%94%9F%E6%B4%BB/hardwork.jpg&#34; 
    alt=&#34;😅&#34; 
     
    width=720 
    height=&#34;800&#34;  /&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>开始使用Pipenv吧</title>
    <link>https://blog.fokia.eu.org/posts/%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8pipenv%E5%90%A7/</link>
    <pubDate>Mon, 09 Jul 2018 00:05:07 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8pipenv%E5%90%A7/</guid>
    <description>
        &lt;p&gt;Python 写起来很快也很舒服，但是有一个非常致命的问题，也可能就是这个便捷带来的问题，那就是各版本库升级非常快，并且之后的版本不一定兼容上一代版本。&lt;/p&gt;
&lt;p&gt;除了Python2 于 Python3 之间主体差别外，第三方库的问题更让人头疼。最最让人难受的是，如果你用的 Linux 系统，很多 Python
软件包你除了可以使用 Pip
安装外，还可以使用自带的包管理器来安装，并且当自带的包管理器在升级处理依赖的时候，只会检测到已经存在文件，不能自动处理，从而导致升级安装失败，非常难受。&lt;/p&gt;
&lt;p&gt;之前也有许多虚拟环境管理器，比如 Virtualenv
等，不过之前用的也少，也没太多痛点。碰到几次上边的问题后才痛下决心要尽可能的使用虚拟环境，系统库里要尽可能少的装包。&lt;/p&gt;
&lt;p&gt;网上看了下，现在大家都比较推荐 Pipenv ，这个库的作者和 Requests 库的作者是同一个人，不用多想，文档里一定会有 – Pipenv
最适合人类使用的依赖管理库……&lt;/p&gt;
&lt;p&gt;按照我个人理解，Pipenv 故名思意，除了具有虚拟环境管理的功能外还有 Pip包管理的功能，相当于两者合二为一了。&lt;/p&gt;
&lt;p&gt;先说安装，包管理器或者 pip 都可以，还是用 Pip 吧 ：）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip install pipenv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;创建虚拟环境&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipenv --python 3.6&lt;/code&gt; 创建指定的 Python 环境，也可以通过 &lt;code&gt;pipenv--two / three&lt;/code&gt;来创建出自己系统上已经安装的 Python 虚拟环境。&lt;/p&gt;
&lt;p&gt;还可以通过 &lt;code&gt;pipenv install&lt;/code&gt;来隐式的创建，Python 环境会是你系统默认环境，同时如果你这个目录里如果有 Pipfile
（一个以安装库的描述文件）文件的话，他会默认来安装上所有的库，非常方便。&lt;/p&gt;
&lt;p&gt;再说删除，对应项目目录下执行&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipenv --rm&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;也可以通过执行&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipenv --venv&lt;/code&gt; 查看虚拟环境的位置&lt;/p&gt;
&lt;p&gt;或是&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipenv --where&lt;/code&gt; 查看对应项目目录的信息&lt;/p&gt;
&lt;p&gt;通过&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipenv shell&lt;/code&gt; 可以进入虚拟环境子 shell ，exit便可以退出，异常方便。&lt;/p&gt;
&lt;p&gt;至于 Pipfile.lock 从官方文档来看，是一个对版本库的依赖描述，可能是我最近操作系统看多了，总觉的是一把锁……&lt;/p&gt;
&lt;p&gt;里面是一些库的信息，包括软件版本 hash 等等。&lt;/p&gt;
&lt;p&gt;只是一些最基本的使用，具体还要看官方文档&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.pipenv.org/&#34;&gt;Pipenv: Python Dev Workflow for Humans&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Git 穿梭时间来 commit</title>
    <link>https://blog.fokia.eu.org/posts/git-%E7%A9%BF%E6%A2%AD%E6%97%B6%E9%97%B4%E6%9D%A5-commit/</link>
    <pubDate>Tue, 24 Apr 2018 08:57:46 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/git-%E7%A9%BF%E6%A2%AD%E6%97%B6%E9%97%B4%E6%9D%A5-commit/</guid>
    <description>
        &lt;p&gt;最近还是在写（抄）操作系统内核。&lt;/p&gt;
&lt;p&gt;定下了一天一绿的计划，然而人的精力毕竟是有限的。&lt;/p&gt;
&lt;p&gt;忙碌的运动会两天终归是没有什么产出。&lt;/p&gt;
&lt;p&gt;看着中间的两个灰块，我不禁陷入了沉思。&lt;/p&gt;
&lt;p&gt;一定有什么办法，可以穿越回过去！&lt;/p&gt;
&lt;p&gt;其实 commit 本身就带有一个时间戳 –date 选项。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit --date=&amp;quot;Thu Apr 21 21:04:08 2018 +0800&amp;quot;  -am &#39;test commit --date&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上命令设置提交时间为 Thu Apr 21 21:04:08 2018 +0800。提交成功，产生以下效果&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[master f8696d2] test commit --date
Date: Sat Apr 21 21:04:08 2018 +0800
1 file changed, 1 deletion(-)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;+0800 意思是东八区，本地 push 完成后，查看 github 成功生效。&lt;/p&gt;
&lt;p&gt;也可以通过设置环境遍量&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GIT_COMMITTER_DATE、GIT_AUTHOR_DATE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的值 来修改提交日期。&lt;/p&gt;
&lt;p&gt;其实没什么意思，仅作纪录。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;[Making Git Commits in the Past](&lt;a href=&#34;https://leewc.com/articles/making-past-git-&#34;&gt;https://leewc.com/articles/making-past-git-&lt;/a&gt;
commits/)&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>xrdp 与 i3wm</title>
    <link>https://blog.fokia.eu.org/posts/xrdp-%E4%B8%8E-i3wm/</link>
    <pubDate>Tue, 17 Apr 2018 14:39:40 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/xrdp-%E4%B8%8E-i3wm/</guid>
    <description>
        &lt;p&gt;一直都在探寻一个好用的 linux 远程桌面工具，期间用过vnc，那时候桌面环境用的是kde，有时候会出现远程和本机只能使用一个的尴尬现象。&lt;/p&gt;
&lt;p&gt;现在实验室换了 deepin，体验还可以。不过这篇文章仅针对 Archlinux 上的 i3wm。&lt;/p&gt;
&lt;p&gt;因为截至目前，deepin 桌面的 xrdp 配置好像还有些问题，等什么时候好了再说吧。&lt;/p&gt;
&lt;p&gt;只说 i3wm， 因为今天发现 xrdp 配置 i3wm 非常容易。&lt;/p&gt;
&lt;p&gt;参考Archlinux wiki&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Add allowed_users=anybody to /etc/X11/Xwrapper.config to allow anybody to start X

Edit ~/.xinitrc or /etc/X11/xinit/xinitrc to launch your DE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上两步执行完毕后，基本就很好用了，但是如果你用来 compton 合成管理器，便会发现 i3wm 的边框，包括你透明化的终端背景，一片火红。&lt;/p&gt;
&lt;p&gt;把 compton 关掉后显示便回复正常，当然透明特效也没了。没了合成管理器，可能还会出现屏幕撕裂。这只能期待 xrdp 上游开发者来解决。&lt;/p&gt;
&lt;p&gt;github 上已经有人提了 &lt;a href=&#34;https://github.com/neutrinolabs/xrdp/issues/1090&#34;&gt;issue&lt;/a&gt;，
并且提供了一个小的脚本。根据 X 程序显示位置来判断是否使用 compton，还是比较好用的。&lt;/p&gt;
&lt;p&gt;暂时关闭 compton 便可以愉快的使用 i3wm 了，效率很高，xrdp 也很方便。&lt;/p&gt;
&lt;p&gt;至于进阶使用，留待以后。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>gdb warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64</title>
    <link>https://blog.fokia.eu.org/posts/gdb-warning-selected-architecture-i386-is-not-compatible-with-reported-target-architecture-i386x86-64/</link>
    <pubDate>Sun, 15 Apr 2018 21:10:03 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/gdb-warning-selected-architecture-i386-is-not-compatible-with-reported-target-architecture-i386x86-64/</guid>
    <description>
        &lt;pre&gt;&lt;code&gt;warning: Selected architecture i386 is not compatible with reported target
architecture i386:x86-64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么这个标题这么长，因为这个警告就这么长。&lt;/p&gt;
&lt;p&gt;还是在折腾操作系统，今天到了用 gdb 配合 qemu 来调试内核，就碰到了这个问题。&lt;/p&gt;
&lt;p&gt;虽然显示的是警告，但是下面的错误和这个警告有莫大的关系。&lt;/p&gt;
&lt;p&gt;想起之前看到的，软件里出现警告便是已经说明程序没有按照预期执行了，一个严谨的程序员理当消除一切异常。&lt;/p&gt;
&lt;p&gt;言归正传&lt;/p&gt;
&lt;p&gt;此警告下接着会出现如下错误&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remote &#39;g&#39; packet reply is too long (expected 312 bytes, got 536 bytes):
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后边跟着一串16进制字符。&lt;/p&gt;
&lt;p&gt;操作系统与 gdb、qemu 皆为64位。&lt;/p&gt;
&lt;p&gt;根据警告字面意思来理解，是所选择的 i386 架构与以声明的 x86-64 架构不兼容，刚会用 gdb 面对这个问题着实有些懵，不知道是 gdb 的问题还是
qemu 的问题。网上讨论也有些纷杂，众说纷纭，莫衷一是。&lt;/p&gt;
&lt;p&gt;先说解决措施，通过设置一条 gdb 指令来显示的指出所调试架构，便可以解决从问题。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set arch i386:x86-64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实还是不太明白，只是倾向于 qemu 的一些问题，因为网上还有些解决措施是通过 hack qemu来解决的。&lt;/p&gt;
&lt;p&gt;值得一提的是，gdb 中直接输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set arch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;他会给你提示有效的参数值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Requires an argument. Valid arguments are i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, i386:nacl, i386:x86-64:nacl, i386:x64-32:nacl, auto.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考链接:&lt;/p&gt;
&lt;p&gt;[Remote ‘g’ packet reply is too long&lt;br&gt;
Ask Question](&lt;a href=&#34;https://stackoverflow.com/questions/8662468/remote-g-packet-&#34;&gt;https://stackoverflow.com/questions/8662468/remote-g-packet-&lt;/a&gt;
reply-is-too-
long?utm_medium=organic&amp;amp;utm_source=google_rich_qa&amp;amp;utm_campaign=google_rich_qa)&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>内联汇编实例</title>
    <link>https://blog.fokia.eu.org/posts/%E5%86%85%E8%81%94%E6%B1%87%E7%BC%96%E5%AE%9E%E4%BE%8B/</link>
    <pubDate>Sat, 14 Apr 2018 14:09:44 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E5%86%85%E8%81%94%E6%B1%87%E7%BC%96%E5%AE%9E%E4%BE%8B/</guid>
    <description>
        &lt;p&gt;最近在跟着网上教程写内核，很累很疲惫，但也学到了许多。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;且夫水之积也不厚 则其负大舟也无力
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;忽然想到这句话，很有道理，水平所限，好的教程是绝对写不出来的。仅以此篇作为记录之用。&lt;/p&gt;
&lt;h3 id=&#34;代码实例&#34;&gt;
    &lt;a href=&#34;#%e4%bb%a3%e7%a0%81%e5%ae%9e%e4%be%8b&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    代码实例
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;common.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#75715e&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * %1代表输入，%0代表输出，输出要加&amp;#34;=&amp;#34;号，a和dN代表寄存器约束
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * 行与行直接：分隔开
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * 最后一项代表 clobered register 即变动过的寄存器，需要GCC将其恢复原样
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;
    
    &lt;span style=&#34;color:#75715e&#34;&gt;//端口写一个字节
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;inline&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;outb&lt;/span&gt;(uint16_t port, uint8_t value)
    
    {
    
     &lt;span style=&#34;color:#66d9ef&#34;&gt;asm&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;volatile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;outb %1, %0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dN&amp;#34;&lt;/span&gt; (port), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt; (value));
    
    }
    
    &lt;span style=&#34;color:#75715e&#34;&gt;//端口读一个字节
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;inline&lt;/span&gt; uint8_t &lt;span style=&#34;color:#a6e22e&#34;&gt;inb&lt;/span&gt;(uint16_t port)
    
    {
    
     uint8_t ret;
    
     &lt;span style=&#34;color:#66d9ef&#34;&gt;asm&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;volatile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inb %1, %0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;=a&amp;#34;&lt;/span&gt; (ret) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dN&amp;#34;&lt;/span&gt; (port));
    
     &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ret;
    
    }
    
    &lt;span style=&#34;color:#75715e&#34;&gt;//端口读入一个字
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;inline&lt;/span&gt; uint16_t &lt;span style=&#34;color:#a6e22e&#34;&gt;inw&lt;/span&gt;(uint16_t port)
    
    {
    
     uint16_t ret;
    
     &lt;span style=&#34;color:#66d9ef&#34;&gt;asm&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;volatile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inw %1, %0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;=a&amp;#34;&lt;/span&gt; (ret) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dN&amp;#34;&lt;/span&gt; (port));
    
     &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ret;
    
    }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;inline-关键字&#34;&gt;
    &lt;a href=&#34;#inline-%e5%85%b3%e9%94%ae%e5%ad%97&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    inline 关键字
&lt;/h3&gt;
&lt;p&gt;其作用相当于宏定义，这么说不够严谨但很直观。&lt;/p&gt;
&lt;p&gt;要比宏定义高级的多。用来修饰函数，可以在编译时直接把函数嵌入调用的主体，节省重新开栈、返回的开销。&lt;/p&gt;
&lt;p&gt;当然你也可以通过宏定义一个函数，但是实在是想不到这样的用意在哪里，在我看来完全可以给函数起一个足够清晰的名称来省略这一步。&lt;/p&gt;
&lt;p&gt;而 inline 所修饰的函数，调用起来和常规函数并没有什么区别，而且效率更高，因为 inline 所修饰的函数，也可以被编译器进行类型检查。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/index.html&#34;&gt;Linux 中 x86
的内联汇编&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jianshu.com/p/1782e14a0766&#34;&gt;GCC内联汇编基础&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://huxiongwei.spaces.eepw.com.cn/articles/article/item/85841&#34;&gt;C语言里面的内联函数（inline）与宏定义（#define）探讨&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>修复 xfce icon theme 显示</title>
    <link>https://blog.fokia.eu.org/posts/%E4%BF%AE%E5%A4%8D-xfce-icon-theme-%E6%98%BE%E7%A4%BA/</link>
    <pubDate>Sun, 18 Mar 2018 15:23:56 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E4%BF%AE%E5%A4%8D-xfce-icon-theme-%E6%98%BE%E7%A4%BA/</guid>
    <description>
        &lt;p&gt;xfce 是一个轻量级的桌面，初始配置简约而简约。&lt;/p&gt;
&lt;p&gt;确实不怎么好看，需要折腾一番&lt;/p&gt;
&lt;p&gt;可折腾来折腾去，容易出现问题，比如icon theme无论怎么选择，都是那一套图标，并且很多图标不能显示出来，这该算是最大的问题了。&lt;/p&gt;
&lt;p&gt;网上查了些资料，没说出所以然，但还是找到了解决办法。&lt;/p&gt;
&lt;p&gt;重装 librsvg，立马解决。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo pacman -S librsvg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一条命令即可。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>树</title>
    <link>https://blog.fokia.eu.org/posts/%E6%A0%91/</link>
    <pubDate>Wed, 28 Feb 2018 23:26:29 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E6%A0%91/</guid>
    <description>
        &lt;p&gt;有句话叫“种下一棵树最好的时候是十年前，其次是现在”&lt;/p&gt;
&lt;p&gt;深以为然，下面就来说树&lt;/p&gt;
&lt;p&gt;从二叉树开始&lt;/p&gt;
&lt;h2 id=&#34;五种基本形态&#34;&gt;
    &lt;a href=&#34;#%e4%ba%94%e7%a7%8d%e5%9f%ba%e6%9c%ac%e5%bd%a2%e6%80%81&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    五种基本形态
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;null 没有任何元素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;0 只有一个根节点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只有根节点和左节点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只有根节点和右节点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;根节点和左右节点&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;特殊的二叉树&#34;&gt;
    &lt;a href=&#34;#%e7%89%b9%e6%ae%8a%e7%9a%84%e4%ba%8c%e5%8f%89%e6%a0%91&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    特殊的二叉树：
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;斜二叉树 只有左子树或只有右子树的二叉树皆为斜二叉树&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;满二叉树 除最后一层节点无任何子节点外，每一层所有节点都有两个子节点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完全二叉树 有n个结点的二叉树，对树中结点按从上之下，从左至右的顺序进行编号，编号为i(1&amp;lt;=i&amp;lt;=n)结点与满二叉树中编号为i结点在二叉树中位置相同&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二叉树的性质&#34;&gt;
    &lt;a href=&#34;#%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e6%80%a7%e8%b4%a8&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    二叉树的性质
&lt;/h2&gt;
&lt;p&gt;节点的度 节点所拥有的子节点的个数&lt;/p&gt;
&lt;p&gt;树的度 树中各节点的度的最大值，所以二叉树的度都为2&lt;/p&gt;
&lt;p&gt;节点的层数 规定根节点的层数为1，其余节点层数顺序递增&lt;/p&gt;
&lt;p&gt;树的深度 树中所有节点的最大层数&lt;/p&gt;
&lt;p&gt;在二叉树的第i层上最多有2^(i-1)个节点 （i&amp;gt;=1)&lt;/p&gt;
&lt;p&gt;二叉树中如果深度为k，那么最多有2^k-1个节点 (k&amp;gt;=1)&lt;/p&gt;
&lt;p&gt;对任何非空二叉树T，若N0表示度数为0的结点，N2表示度数为2的节点，则有N0=N2+1&lt;/p&gt;
&lt;p&gt;具有n个节点的完全二叉树的深度为Log2N+1&lt;/p&gt;
&lt;h2 id=&#34;基本操作&#34;&gt;
    &lt;a href=&#34;#%e5%9f%ba%e6%9c%ac%e6%93%8d%e4%bd%9c&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    基本操作
&lt;/h2&gt;
&lt;h3 id=&#34;遍历&#34;&gt;
    &lt;a href=&#34;#%e9%81%8d%e5%8e%86&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    遍历
&lt;/h3&gt;
&lt;p&gt;前序遍历 根 =&amp;gt; 左 =&amp;gt; 右&lt;/p&gt;
&lt;p&gt;中序遍历 左 =&amp;gt; 根 =&amp;gt; 右&lt;/p&gt;
&lt;p&gt;后序遍历 左 =&amp;gt; 右 =&amp;gt; 根&lt;/p&gt;
&lt;h3 id=&#34;插入&#34;&gt;
    &lt;a href=&#34;#%e6%8f%92%e5%85%a5&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    插入
&lt;/h3&gt;
&lt;h3 id=&#34;删除&#34;&gt;
    &lt;a href=&#34;#%e5%88%a0%e9%99%a4&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    删除
&lt;/h3&gt;
&lt;h2 id=&#34;二叉树的存储结构&#34;&gt;
    &lt;a href=&#34;#%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e5%ad%98%e5%82%a8%e7%bb%93%e6%9e%84&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    二叉树的存储结构
&lt;/h2&gt;
&lt;h3 id=&#34;顺序存储结构&#34;&gt;
    &lt;a href=&#34;#%e9%a1%ba%e5%ba%8f%e5%ad%98%e5%82%a8%e7%bb%93%e6%9e%84&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    顺序存储结构
&lt;/h3&gt;
&lt;p&gt;堆&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>QQ空间定时留言</title>
    <link>https://blog.fokia.eu.org/posts/qq%E7%A9%BA%E9%97%B4%E5%AE%9A%E6%97%B6%E7%95%99%E8%A8%80/</link>
    <pubDate>Sat, 17 Feb 2018 10:55:06 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/qq%E7%A9%BA%E9%97%B4%E5%AE%9A%E6%97%B6%E7%95%99%E8%A8%80/</guid>
    <description>
        &lt;p&gt;为什么要做这样的事？就是闲的蛋疼。&lt;/p&gt;
&lt;p&gt;思路很简单，空间留言抓包，利用Python的requests库自定义评论内容发包即可实现评论。配合Linux crontab定时任务即可实现定时评论。&lt;/p&gt;
&lt;p&gt;用手机上的Packet
Capture抓qq空间网页版留言动作的数据包，这个工具主要好用在可以分应用抓包，另外同过自建vpn的方式实现免Root抓包也是他的一大特色。虽然Root权限对于搞基的大部分人来说都不算什么。&lt;/p&gt;
&lt;p&gt;除此之外，通过安装证书的方式可以解密https数据包。不过安卓7.0以上的版本，对系统证书和用户证书的区分更严格了，导致在抓https的数据包时，会一直弹出警告窗口。暂不影响使用，按下不表，网上也有一些途径。&lt;/p&gt;
&lt;p&gt;把第一步抓到的包用wireshark打开，进一步分析。&lt;/p&gt;
&lt;p&gt;典型的POST方法，其中有两个url参数。分别为g_tk和qzonetoken。以及一个url编码的表单数据，一目了然。&lt;/p&gt;
&lt;p&gt;重点便可放在构造请求url上。js一塌糊涂所以选择上网上找前人的经验。很幸运&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hashes = 5381
for letter in cookie[&#39;p_skey&#39;]:
    hashes += (hashes &amp;lt;&amp;lt; 5) + ord(letter)
g_tk = hashes &amp;amp; 0x7fffffff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;g_tk是通过登录成功后的cookie来算的。而qzonetoken可以从登录成功的网页源码中可以直接找到。&lt;/p&gt;
&lt;p&gt;重点又到了登录上来。而登录过程的js加密更为复杂，网上现有的qqlib库也有很长一段时间没有更新了，最后选择Selenium模拟登录。&lt;/p&gt;
&lt;p&gt;网上大多教程是Selenium配合Phantomjs，实际使用过程中发现selenium放弃了对Phantomjs的支持，遂选择Chrome进行开发调试，最后部署至服务器时添加headless
Options即可。&lt;/p&gt;
&lt;p&gt;由于选择的是移动版QQ空间，所以连UA也一并模拟了。实际上看来并不需要，电脑版的浏览器也可以直接打开移动版页面。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;options = webdriver.ChromeOptions()
#设置中文
options.add_argument(&#39;lang=zh_CN.UTF-8&#39;)
#自定义ua
useragent = &#39;Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4 Prime Build/NJH47F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.78 Mobile Safari/537.36url)&#39;
options.add_argument(useragent)
#配置headless chrome
options.add_argument(&#39;headless&#39;)
#配置options
driver = webdriver.Chrome(chrome_options=options)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;剩下便简单了，找到文本框输入账号密码，回车登录即可。&lt;/p&gt;
&lt;p&gt;需要注意的是，频繁的登录会触发划动验证码，这也是我放置在服务器上的脚本执行失败报以下错误的原因。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Traceback (most recent call last):
File &amp;quot;/home/ali/qzone/newhello.py&amp;quot;, line 90, in &amp;lt;module&amp;gt;
cookies, g_tk, qzonetoken = login()
File &amp;quot;/home/ali/qzone/newhello.py&amp;quot;, line 46, in login
for letter in cookie[&#39;p_skey&#39;]:
KeyError: &#39;p_skey&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初步解决措施是把登录成功后的Cookie以及根据Cookie得到的g_tk和qzonetoken存入一个元组中，同过json模块将其保存至硬盘。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;result = (cookie, g_tk, qzonetoken)
with open(&#39;data.json&#39;, &#39;w&#39;) as f:
json.dump(result, f)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在下次运行时，将其再次导入至程序中。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try:
    with open(&#39;data.json&#39;, &#39;r&#39;) as f:
        data = json.load(f)
    cookies = data[0]
    g_tk = data[1]
    qzonetoken = data[2]
except IOError:
    cookies, g_tk, qzonetoken = login()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;事实上程序也是这么工作的。可毕竟人算不如天算，由于服务器ip对于常用的本地登录ip不同，所以也是很大几率会触发异常登录，弹出划动验证窗口。&lt;/p&gt;
&lt;p&gt;本想直接做到底，顺带着把划动验证码给解决了，可是对Selenium还不太熟悉，加上对前端知识也不是太熟，导致难度略大。&lt;/p&gt;
&lt;p&gt;最后灵机一动，通过ssh 代理的方式，来实现服务器ip代理访问QQ空间，相当于人肉解决验证问题。应该能顶一段时间。&lt;/p&gt;
&lt;p&gt;不试不知道，又发现一个问题，可能是我多次触发验证又未解决，我在多次验证成功后，登录依然不能成功，故又尝试登录了QQ空间电脑版网页，之后再次访问移动端登录成功。&lt;/p&gt;
&lt;p&gt;看来选择的移动端网页并不是百利而无一害。&lt;/p&gt;
&lt;p&gt;滑动验证码留着以后解决。&lt;/p&gt;
&lt;p&gt;定时任务很简单。需要注意的是我使用的是virtualenv，需要首先加载虚拟指定环境，另外crontab里的路径皆为绝对路径。&lt;/p&gt;
&lt;p&gt;00 00 __ * /home/ali/qzone/py3/bin/python /home/ali/qzone/newhello.py &amp;raquo;
/home/ali/qzlog.txt 2&amp;gt;&amp;amp;1&lt;/p&gt;
&lt;p&gt;最后完整代码附上&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/jiefangjun/a680b8d9c932911247d91730323500ce&#34;&gt;https://gist.github.com/jiefangjun/a680b8d9c932911247d91730323500ce&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://selenium-python.readthedocs.io/index.html&#34;&gt;Selenium文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/27604277&#34;&gt;用python爬取qq好友十万条说说并简单进行数据分析&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>yy-MM-dd与yy-mm-dd</title>
    <link>https://blog.fokia.eu.org/posts/yy-mm-dd%E4%B8%8Eyy-mm-dd/</link>
    <pubDate>Tue, 05 Dec 2017 17:49:25 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/yy-mm-dd%E4%B8%8Eyy-mm-dd/</guid>
    <description>
        &lt;p&gt;今天在写一道Java题目时要求格式化时间，老师示例代码时yy-MM-dd,我在想为什么不是mm。&lt;br&gt;
接下来，自己写的时候，特意换了下mm，结果输出的是分钟数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zhihu.com/question/23730083&#34;&gt;相关链接&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;yyyy-MM-dd HH:mm:ss 年-月-日
时:分:秒大写是为了区分“月”与“分”顺便说下HH为什么大写，是为了区分12小时制与24小时制。小写的h是12小时制，大写的H是24小时制。书写格式和语言规定有关，上述写法是Windows系统中的我们常见的写法，包括日期设置于办公软件在内。在其他语言中有类似的但使用符号或格式不同的写法。有的时候我们会看到这样的格式：yyyy-
M-d
H:m:smm与m等，它们的区别为是否有前导零：H,m,s表示非零开始，HH,mm,ss表示从零开始。比如凌晨1点2分，HH:mm显示为01:02，H:m显示为1:2。以2014年1月1日凌晨1点1分1秒（当天是星期三）为例子介绍一下其他的：yyyy/yyy/yy/y
显示为 2014/2014/14/4（3个y与4个y是一样的，为了便于理解多写成4个y）MMMM/MMM/MM/M 显示为
一月/一月/01/1（4个M显示全称，3个M显示缩写，不过中文显示是一样的，英文就是January和Jan）dddd/ddd/dd/d 显示为
星期三/周三(有的语言显示为“三”)/01/1（在英文中同M一样，4个d是全称，3个是简称；dddd/ddd表示星期几，dd/d表示几号）HH/H/hh/h
显示为 01/1/01 AM/1 AM剩下的mm/m/ss/s只是前导零的问题了。yyyy/M/d/dddd H:mm:ss 就是
2014年1月1日星期三 1:01:01&lt;/p&gt;
&lt;/blockquote&gt;

    </description>
    </item>
    
    <item>
    <title>记一次在docker中配置nginx</title>
    <link>https://blog.fokia.eu.org/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%9C%A8docker%E4%B8%AD%E9%85%8D%E7%BD%AEnginx/</link>
    <pubDate>Fri, 10 Nov 2017 13:10:43 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%9C%A8docker%E4%B8%AD%E9%85%8D%E7%BD%AEnginx/</guid>
    <description>
        &lt;p&gt;为什么要配nginx？本意其实是想在vps上搭建一个静态http文件服务，能够多线程下载vps上离线的美剧。&lt;/p&gt;
&lt;p&gt;为什么要用docker呢？ 原因在于即使你对docker略懂皮毛，你也能深刻的体会到用docker部署应用的方便与优雅，当然水平越高就越优雅。&lt;/p&gt;
&lt;p&gt;像我这种拉拉官方镜像的菜鸡，最能深刻体会到的是docker的干净。一个容器就是一个应用，删除了就干干净净。比起在各个发行版里用各种包管理器所安装的软件，管理起来要统一的多！&lt;/p&gt;
&lt;p&gt;闲话少叙，进入正题。&lt;/p&gt;
&lt;p&gt;首先拉取nginx镜像，如果没有特殊需求，直接选官方就行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker pull nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意这一步，国内机器需要换下源，不然会比较慢，我在vps上做的所以没涉及到换源。&lt;/p&gt;
&lt;p&gt;接着运行就好了。。就是这么快捷&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -p 80:80 --name nginx -v $PWD:/usr/share/nginx/html -d nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;–name nginx 指的是容器名称 ，这里叫做nginx，自己可以随意命名。&lt;/p&gt;
&lt;p&gt;-p 80:80 意思是把宿主机的80端口映射在容器的80端口上。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-v $PWD:/usr/share/nginx/html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步的目的是把当前目录挂载在容器的/usr/share/nginx/html下，这是nginx的默认目录，这一步执行后，把应用部署在宿主机当前目录即相当于把应用部署在nginx里了。&lt;/p&gt;
&lt;p&gt;容器部署完成后，访问你的ip,如果看到nginx欢迎界面，即说明部署完成。&lt;/p&gt;
&lt;p&gt;若只能看到一个403界面，这是最令人头疼的地方。&lt;/p&gt;
&lt;p&gt;这是由于主机的selinux和容器的selinux是互相隔离的，所以容器无法直接访问宿主机的目录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chcon -Rt svirt_sandbox_file_t $PWD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行这一步后，容器获得访问宿主机当前目录的权限，nginx即可愉快的跑起来。&lt;/p&gt;
&lt;p&gt;最后http文件服务器很简单。&lt;/p&gt;
&lt;p&gt;在nginx的配置文件中，server下的location字段，加上一下三行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启容器访问主机，即可看到一个简陋的http文件服务器，当前目录里的文件已经列在其中。&lt;/p&gt;
&lt;p&gt;相关链接&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.runoob.com/docker/docker-install-nginx.html&#34;&gt;Docker 安装 Nginx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://gdocker.com/386/docker-100/&#34;&gt;在DOCKER中访问主机目录时拒绝权限&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>在Archlinux上查看core dump</title>
    <link>https://blog.fokia.eu.org/posts/%E5%9C%A8archlinux%E4%B8%8A%E6%9F%A5%E7%9C%8Bcore-dump/</link>
    <pubDate>Mon, 23 Oct 2017 23:59:55 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E5%9C%A8archlinux%E4%B8%8A%E6%9F%A5%E7%9C%8Bcore-dump/</guid>
    <description>
        &lt;p&gt;今天在linux上写算法作业，矩阵连乘的最优解，看了很长一段时间了，勉强写的出来了，但还是有点不清晰，不得不承认是一只菜鸡。&lt;/p&gt;
&lt;p&gt;这不是重点。之前在写的算法题用的都是纯c，一是开始只会用gcc编译，而是对c++没怎么接触过，有些望而生畏，包括c也是，能不用指针，就不用指针。&lt;/p&gt;
&lt;p&gt;今天实在是受不了了，眼看着printf，scanf又臭又长，cout，cin又短又快，咬牙上吧，查了下资料，用g++编译链接即可，也是很方便。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;g++ source.c -o executable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译成功，运行报 segmention fault(core dump)&lt;/p&gt;
&lt;p&gt;core dump 也叫核心转储，是在程序崩溃时产生的内存进程信息。&lt;/p&gt;
&lt;p&gt;按道理应该在程序运行目录产生，ls-al 并未查看到，继续google&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ulimit -a 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看， core file size 属性是否为0，若为0的话，代表系统默认不会产生core dump文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ulimit -c unlimited
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以设置 core file size 为无限。&lt;/p&gt;
&lt;p&gt;一番操作下来，依然没有core dump 踪迹。&lt;/p&gt;
&lt;p&gt;祭出神器Archwiki。&lt;/p&gt;
&lt;p&gt;不出所料。&lt;/p&gt;
&lt;p&gt;Examining a core dump&lt;/p&gt;
&lt;p&gt;Use coredumpctl to find the corresponding dump:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;coredumpctl list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You need to uniquely identify the relevant dump. This is possible by
specifying a PID, name of the executable, path to the executable or a
journalctl predicate (see coredumpctl(1) and journalctl(1) for details). To
see details of the core dumps:&lt;/p&gt;
&lt;p&gt;match 可以是 pid 也可以是可执行程序名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;coredumpctl info match
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pay attention to “Signal” row, that helps to identify crash cause. For deeper
analysis you can examine the backtrace using gdb:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;coredumpctl gdb match
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When gdb is started, use the bt command to print the backtrace:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) bt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一套组合下来，错误一目了然，发生在一个递归函数里，重复的使用了一块内存。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Core_dump&#34;&gt;Archwiki相关链接&lt;/a&gt;&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>systemd初探</title>
    <link>https://blog.fokia.eu.org/posts/systemd%E5%88%9D%E6%8E%A2/</link>
    <pubDate>Thu, 05 Oct 2017 21:48:31 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/systemd%E5%88%9D%E6%8E%A2/</guid>
    <description>
        &lt;p&gt;国庆在家，整天就是玩电脑，越玩越觉得有意思。这两天直在看《Linux就是这个范儿》加上前面看的差不多看完了。理解多少不知道，不过这本书确实写的很有意思。&lt;/p&gt;
&lt;p&gt;昨天萌生了一个想法，把家里的那台老电脑24小时开机，当做服务器来用。本来想在路由上配个ddns，网上看了下，之前用的花生壳现在都实名了。并且说实在的花生壳之前用着也并不怎么好用。&lt;/p&gt;
&lt;p&gt;想了想家里的宽带是公网ip，直接在路由上配置了端口映射好了。不过虽说是公网ip可不代表人家给的是静态ip，还是上游dhcp服务分配到的动态ip，于是写了个python脚本，执行后每5分钟爬取一下公网ip。ip变动后发邮件通知。&lt;/p&gt;
&lt;p&gt;代码很简单，也可能是太蠢，就不贴了。&lt;/p&gt;
&lt;p&gt;写完之后跑了下，美滋滋。&lt;/p&gt;
&lt;p&gt;下午出门买了点菜，晚上吃的排骨，真好吃，额，跑题了。。&lt;/p&gt;
&lt;p&gt;吃饱了饭还是不知足，想着把这个脚本做成服务，开机自启动。网上看了下，大部分还是init或者Upstart作为服务管理时的做法。&lt;/p&gt;
&lt;p&gt;可从我开始用Arch的时候，Arch都已经采用了systemd了，况且刚装的lubuntu用的也是systemd，ubuntu17.04应该也是采用systemd了，虽然网上对systemd的争论很多，不过本人觉得还是很好用的，规范了很多东西。&lt;/p&gt;
&lt;p&gt;《Linux就是这个范儿》里面有一小章，章节名叫配置乱生根，linux用的时间久了确实深有体会。Unix文化里的kiss原则带来的影响也是有好有坏的，个人觉得这种服务管理程序还是规范点好，毕竟是内核初始化后运行的第一个程序。&lt;/p&gt;
&lt;p&gt;一般情况下所安装软件提供的service在/usr/lib/systemd/system下，lubuntu在/lib/systemd/system下。开机自启的服务单元其实就是在/etc/systemd/system下创建的同名软连接。&lt;/p&gt;
&lt;p&gt;一个单元配置文件可以描述如下内容之一：系统服务（.service）、挂载点（.mount）、sockets（.sockets）
、系统设备（.device）、交换分区（.swap）、文件路径（.path）、启动目标（.target）、由 systemd
管理的计时器（.timer）。详情参阅 systemd.unit(5) 。&lt;/p&gt;
&lt;p&gt;闲话不多说，直接动手写第一个服务单元。&lt;/p&gt;
&lt;p&gt;cd /lib/systemd/system&lt;/p&gt;
&lt;p&gt;vim ip.service&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Get wanIp daemon
After=network.target
Requires=pppd-dns.service

[Service]
Type=simple
ExecStart=/home/tql/Python/WanIp/bin/python /home/tql/Python/WanIp/ip.py

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里注意一点，ExecStart里要写绝对路径，对于python来说，pip所安装的包，直接执行命令不一定能找到。我用虚拟环境打包了整个脚本。&lt;/p&gt;
&lt;p&gt;接着&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start ip.service 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启服务 。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status ip.service 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看服务运行正常。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable ip.service 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在/etc/systemd/system/下创建软链，开机自启。&lt;/p&gt;
&lt;p&gt;按说到这一步就好了，可世上还真没什么事是容易的。重启机器后，查看服务总是运行失败，报的错误像是网络错误。于是正如上面服务所写，我又是After=network.target，
又是Requires=pppd-dns.service，事实证明，这些其实是没什么用处的。&lt;/p&gt;
&lt;p&gt;后来想起来之前看的一篇文章，systemd是并行启动。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Systemd 的并发启动原理&lt;br&gt;
在 Systemd 中，所有的服务都并发启动，比如 Avahi、D-Bus、livirtd、X11、HAL 可以同时启动。乍一看，这似乎有点儿问题，比如
Avahi 需要 syslog 的服务，Avahi 和 syslog 同时启动，假设 Avahi 的启动比较快，所以 syslog 还没有准备好，可是
Avahi 又需要记录日志，这岂不是会出现问题？&lt;/p&gt;
&lt;p&gt;Systemd 的开发人员仔细研究了服务之间相互依赖的本质问题，发现所谓依赖可以分为三个具体的类型，而每一个类型实际上都可以通过相应的技术解除依赖关系。&lt;/p&gt;
&lt;p&gt;并发启动原理之一：解决 socket 依赖&lt;/p&gt;
&lt;p&gt;绝大多数的服务依赖是套接字依赖。比如服务 A 通过一个套接字端口 S1 提供自己的服务，其他的服务如果需要服务 A，则需要连接 S1。因此如果服务 A
尚未启动，S1 就不存在，其他的服务就会得到启动错误。所以传统地，人们需要先启动服务 A，等待它进入就绪状态，再启动其他需要它的服务。Systemd
认为，只要我们预先把 S1 建立好，那么其他所有的服务就可以同时启动而无需等待服务 A 来创建 S1 了。如果服务 A 尚未启动，那么其他进程向 S1
发送的服务请求实际上会被 Linux 操作系统缓存，其他进程会在这个请求的地方等待。一旦服务 A
启动就绪，就可以立即处理缓存的请求，一切都开始正常运行。&lt;/p&gt;
&lt;p&gt;那么服务如何使用由 init 进程创建的套接字呢？&lt;/p&gt;
&lt;p&gt;Linux 操作系统有一个特性，当进程调用 fork 或者 exec 创建子进程之后，所有在父进程中被打开的文件句柄 (file descriptor)
都被子进程所继承。套接字也是一种文件句柄，进程 A 可以创建一个套接字，此后当进程 A 调用 exec 启动一个新的子进程时，只要确保该套接字的
close_on_exec
标志位被清空，那么新的子进程就可以继承这个套接字。子进程看到的套接字和父进程创建的套接字是同一个系统套接字，就仿佛这个套接字是子进程自己创建的一样，没有任何区别。&lt;/p&gt;
&lt;p&gt;这个特性以前被一个叫做 inetd 的系统服务所利用。Inetd 进程会负责监控一些常用套接字端口，比如 Telnet，当该端口有连接请求时，inetd
才启动 telnetd 进程，并把有连接的套接字传递给新的 telnetd 进程进行处理。这样，当系统没有 telnet 客户端连接时，就不需要启动
telnetd 进程。Inetd
可以代理很多的网络服务，这样就可以节约很多的系统负载和内存资源，只有当有真正的连接请求时才启动相应服务，并把套接字传递给相应的服务进程。&lt;/p&gt;
&lt;p&gt;和 inetd 类似，systemd 是所有其他进程的父进程，它可以先建立所有需要的套接字，然后在调用 exec
的时候将该套接字传递给新的服务进程，而新进程直接使用该套接字进行服务即可。&lt;/p&gt;
&lt;p&gt;并发启动原理之二：解决 D-Bus 依赖&lt;/p&gt;
&lt;p&gt;D-Bus 是 desktop-bus
的简称，是一个低延迟、低开销、高可用性的进程间通信机制。它越来越多地用于应用程序之间通信，也用于应用程序和操作系统内核之间的通信。很多现代的服务进程都使用D-
Bus 取代套接字作为进程间通信机制，对外提供服务。比如简化 Linux 网络配置的 NetworkManager 服务就使用 D-Bus
和其他的应用程序或者服务进行交互：邮件客户端软件 evolution 可以通过 D-Bus 从 NetworkManager
服务获取网络状态的改变，以便做出相应的处理。&lt;/p&gt;
&lt;p&gt;D-Bus 支持所谓”bus activation”功能。如果服务 A 需要使用服务 B 的 D-Bus 服务，而服务 B 并没有运行，则 D-Bus
可以在服务 A 请求服务 B 的 D-Bus 时自动启动服务 B。而服务 A 发出的请求会被 D-Bus 缓存，服务 A 会等待服务 B
启动就绪。利用这个特性，依赖 D-Bus 的服务就可以实现并行启动。&lt;/p&gt;
&lt;p&gt;并发启动原理之三：解决文件系统依赖&lt;/p&gt;
&lt;p&gt;系统启动过程中，文件系统相关的活动是最耗时的，比如挂载文件系统，对文件系统进行磁盘检查（fsck），磁盘配额检查等都是非常耗时的操作。在等待这些工作完成的同时，系统处于空闲状态。那些想使用文件系统的服务似乎必须等待文件系统初始化完成才可以启动。但是
systemd 发现这种依赖也是可以避免的。&lt;/p&gt;
&lt;p&gt;Systemd 参考了 autofs 的设计思路，使得依赖文件系统的服务和文件系统本身初始化两者可以并发工作。autofs
可以监测到某个文件系统挂载点真正被访问到的时候才触发挂载操作，这是通过内核 automounter 模块的支持而实现的。比如一个
open()系统调用作用在”/misc/cd/file1”的时候，/misc/cd 尚未执行挂载操作，此时 open()调用被挂起等待，Linux
内核通知 autofs，autofs 执行挂载。这时候，控制权返回给 open()系统调用，并正常打开文件。&lt;/p&gt;
&lt;p&gt;Systemd 集成了 autofs 的实现，对于系统中的挂载点，比如/home，当系统启动的时候，systemd
为其创建一个临时的自动挂载点。在这个时刻/home
真正的挂载设备尚未启动好，真正的挂载操作还没有执行，文件系统检测也还没有完成。可是那些依赖该目录的进程已经可以并发启动，他们的 open()操作被内建在
systemd 中的 autofs 捕获，将该 open()调用挂起（可中断睡眠状态）。然后等待真正的挂载操作完成，文件系统检测也完成后，systemd
将该自动挂载点替换为真正的挂载点，并让 open()调用返回。由此，实现了那些依赖于文件系统的服务和文件系统本身同时并发启动。&lt;/p&gt;
&lt;p&gt;当然对于”/“根目录的依赖实际上一定还是要串行执行，因为 systemd 自己也存放在/之下，必须等待系统根目录挂载检查好。&lt;br&gt;
不过对于类似/home 等挂载点，这种并发可以提高系统的启动速度，尤其是当/home 是远程的 NFS
节点，或者是加密盘等，需要耗费较长的时间才可以准备就绪的情况下，因为并发启动，这段时间内，系统并不是完全无事可做，而是可以利用这段空余时间做更多的启动进程的事情，总的来说就缩短了系统启动时间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;总之，对于我的python脚本里所发起的网络服务来说，不是立即执行的，他会被内核缓存知道真正的网络通常后，才能发出，所以这就要求我的脚本有容错能力或者超时设置，按照此思路改了代码后，果然顺畅执行。&lt;/p&gt;
&lt;p&gt;最后附上一些相关资料链接，包括服务单元格式，以及systemd更多的资料。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html&#34;&gt;浅析 Linux 初始化 init 系统，第 3 部分:
Systemd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[Systemd 入门教程：实战篇](&lt;a href=&#34;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-&#34;&gt;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-&lt;/a&gt;
part-two.html)&lt;/p&gt;
&lt;p&gt;[Systemd 入门教程：命令篇](&lt;a href=&#34;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-&#34;&gt;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-&lt;/a&gt;
commands.html)&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Unix 文化哲学</title>
    <link>https://blog.fokia.eu.org/posts/unix-%E6%96%87%E5%8C%96%E5%93%B2%E5%AD%A6/</link>
    <pubDate>Mon, 02 Oct 2017 23:39:56 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/unix-%E6%96%87%E5%8C%96%E5%93%B2%E5%AD%A6/</guid>
    <description>
        &lt;p&gt;《Linux就是这个范儿》读书笔记&lt;/p&gt;
&lt;p&gt;Rob Pike，最伟大的C语言大师之一，在Notes on Programming in C中则从编程的角度对Unix文化进行了阐释，这也反应了一些侧面:&lt;/p&gt;
&lt;p&gt;原则1：你无法判定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方，所以别急于胡乱地找地方改代码，除非你已经证明那儿就是瓶颈所在。&lt;/p&gt;
&lt;p&gt;原则2：估量，在你没对代码进行估量，特别是没找到最耗时的那部分之前，别去优化速度。&lt;/p&gt;
&lt;p&gt;原则3：花哨的算法在n很小时通常很慢，而n通常很小。花哨算法的常数复杂度很大。除非你确定n很大，否则不要用花哨算法。即使n很大，也要优先考虑原则2。&lt;/p&gt;
&lt;p&gt;原则4：花哨的算法比简单的算法更容易出bug、更难实现。尽量使用简单的算法配合简单的数据结构。&lt;/p&gt;
&lt;p&gt;原则5：数据压倒一切。如果已经选择了正确的数据结构并把一切都组织的井井有条，正确的算法也就不言自明。 &lt;strong&gt;编程的核心是数据结构，而不是算法。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原则6：没有原则6。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>给濒死的老电脑装上lubuntu</title>
    <link>https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/</link>
    <pubDate>Sat, 30 Sep 2017 23:39:13 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/</guid>
    <description>
        &lt;p&gt;国庆回家，父母都给我说家中的老上网本越来越卡了，视频都看不动。打开看了下，虽然内存占用还不到一半，但是分辨率大点的视频也确实没办法看，试了几个软件优酷还没打开就把自己卡死了。potplayer、qq影音，不是声音画面不同步就是卡的不能行。&lt;br&gt;
看了下进程，跑着360安全卫士，还有360杀毒，全关了之后还好点。不过也好不到那里去，问了下父母也没有特别依赖的windows平台的软件，索性直接换个轻量的linux算了，免得再中各种卫士。&lt;/p&gt;
&lt;p&gt;网上查了下，看中了lubuntu。一是有过ubuntu使用经验，操作还算熟悉。二十怕装了arch长时间又不更新，自己给自己找麻烦。&lt;/p&gt;
&lt;p&gt;直接&lt;a href=&#34;http://lubuntu.net/&#34;&gt;官网&lt;/a&gt;下载32位iso镜像，dd命令制作启动盘即可。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/image0001.png&#34; 
    alt=&#34;lubuntu&#34; 
     
    width=626 
    height=&#34;107&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;官网简介看着很令人满意，有必要说下这个制作启动盘过程。&lt;/p&gt;
&lt;p&gt;插上u盘，先执行lsbsk，查看下u盘设备名。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/image0002.png&#34; 
    alt=&#34;lubuntu&#34; 
     
    width=629 
    height=&#34;270&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;接着取消挂载u盘。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/image0003.png&#34; 
    alt=&#34;lubuntu&#34; 
     
    width=617 
    height=&#34;287&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;有人会在这一步格式化u盘为fat，其实是没有必要的。一是u盘大部分本都是fat格式的。二是dd可以直接读取磁盘的扇区(sector)而不理会文件系统(来源于鸟哥的linux私房菜)。&lt;/p&gt;
&lt;p&gt;然后便是传说中的dd命令。其实dd本身只是个备份工具，但因为他能直接读取磁盘扇区生成制定额虚拟块设备文件，所以成为了一个制作启动盘的好工具。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/image0004.png&#34; 
    alt=&#34;lubuntu&#34; 
     
    width=1095 
    height=&#34;559&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;分步解析，if和of比较容易理解，输入和输出文件。bs指的是块大小，每次传输的单位大小。根据u盘速度可以酌情调整。status=progress顾名思义用来显示操作进度，默认的dd是没有进度提示的。sync用于强制被改变的内容立刻写入磁盘，更新超块信息。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在Linux/Unix系统中，在文件或数据处理过程中一般先放到内存缓冲区中，等到适当的时候再写入磁盘，以提高系统的运行效率。sync命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。用户通常不需执行sync命令，系统会自动执行update或bdflush操作，将缓冲区的数据写
入磁盘。只有在update或bdflush无法执行或用户需要非正常关机时，才需手动执行sync命令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实说到底只用if，of两个参数即可制作启动盘。保险起见还是用sync同步下，当启动盘引导失败的时候也可以加上sync选项，确保成功。当然，如果你镜像下载的都有问题，那再怎么加sync也是不行的，网络环境不好的情况下，推荐下载完成后校验一下。&lt;/p&gt;
&lt;p&gt;至于dd其他高阶操作，很少用到，故按下不表。启动盘制作好后，任务便完成了一大半了。&lt;/p&gt;
&lt;p&gt;先是备份资料，接着关机重启，u盘启动，图形界面安装，一路进入系统。装了些必要软件，看下系统信息，内存占用低的吓人。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E7%BB%99%E6%BF%92%E6%AD%BB%E7%9A%84%E8%80%81%E7%94%B5%E8%84%91%E8%A3%85%E4%B8%8Alubuntu/image0005.png&#34; 
    alt=&#34;lubuntu&#34; 
     
    width=694 
    height=&#34;348&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;网页浏览器用的火狐，听音乐用网易，看视频用mplayer。一边听歌一边刷网页还很流畅，至于那个高分辨率的视频，虽然比在win下好了些，但声音画面还是有些不同步。不过已经很满意了。&lt;/p&gt;
&lt;p&gt;检测了下系统占用，中度使用内存不怎么上1G，看来之前的内存确实白换了2333，短板在Atom
cpu，1.6GHZ的主频不知道怎么表达。总之新生了，又为linux桌面份额贡献了一部分。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>用python处理未正确url解码的文件名</title>
    <link>https://blog.fokia.eu.org/posts/%E7%94%A8python%E5%A4%84%E7%90%86%E6%9C%AA%E6%AD%A3%E7%A1%AEurl%E8%A7%A3%E7%A0%81%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D/</link>
    <pubDate>Sat, 30 Sep 2017 00:29:46 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E7%94%A8python%E5%A4%84%E7%90%86%E6%9C%AA%E6%AD%A3%E7%A1%AEurl%E8%A7%A3%E7%A0%81%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D/</guid>
    <description>
        &lt;p&gt;最近在追美剧shameless，用aria2从百度云下载的视频，无论名称是否包含中文都未正确解码，深度影院更新前的侧边文件目录看起来还好。更新后的侧边目录实在是太糟糕了，大量相似的文件名看的眼睛都花了。&lt;br&gt;
看了一下应该是未正确解码url试着在线url解码了下，果然如此。接着就好办了，查了下python相关api，都说人生苦短，我用python，果然很简单。&lt;br&gt;
用urllib库，一行代码即实现了url解码。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;    urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unquote(name)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;os库里的重命名代码亦是一行，这样这个程序就很简单了，从系统目录获得所有文件名称集合，遍历这个集合，对其中的每一个文件进行url解码重命名即可。&lt;/p&gt;
&lt;p&gt;很好，很方便。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/python3&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; urllib.parse
    &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; sys
    
    names &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getcwd())
    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; names:
        os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rename(name, urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unquote(name))
    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;重命名成功。&amp;#34;&lt;/span&gt;)
    
    &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;目录为: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getcwd()))&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

    </description>
    </item>
    
    <item>
    <title>浅谈iptables</title>
    <link>https://blog.fokia.eu.org/posts/%E6%B5%85%E8%B0%88iptables/</link>
    <pubDate>Wed, 27 Sep 2017 23:29:16 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/%E6%B5%85%E8%B0%88iptables/</guid>
    <description>
        &lt;p&gt;iptables是netfilter项目的一部分，也常代指内核级防火墙。&lt;/p&gt;
&lt;p&gt;基本概念&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中，并且按照不同的目的被组织成 表
的集合。表 由一组预先定义的 链 组成，链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作（称为
目标），如果谓词为真，该动作会被执行。也就是说条件匹配。iptables 是用户工具，允许用户使用 链 和 规则。很多新手面对复杂的 linux IP
路由时总是感到气馁，但是，实际上最常用的一些应用案例（NAT 或者基本的网络防火墙）并不是很复杂。&lt;/p&gt;
&lt;p&gt;理解 iptables 如何工作的关键是这张图。图中在上面的小写字母代表 表，在下面的大写字母代表 链。从任何网络端口 进来的每一个 IP
数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables
对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式，相反，iptabales
对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables
采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的，因此在图中表现为从顶端进入，到
停止，而另一些数据包是由本地进程生成的，因此在图中表现为从  发出，一直向下穿过该流程图。一份关于该流程图如何工作的详细解释请参考这里。&lt;/p&gt;
&lt;p&gt;在大多数使用情况下都不会用到 raw，mangle 和 security 表。下图简要描述了网络数据包通过 iptables 的过程：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; 
    src=&#34;https://blog.fokia.eu.org/posts/%E6%B5%85%E8%B0%88iptables/iptables.png&#34; 
    alt=&#34;iptables&#34; 
     
    width=604 
    height=&#34;537&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;以上资料来源于ArchLinux iptables wiki，通过这张图，可以初步理解iptables
共组原理，但在配置的时候，出去具体的语法规则不谈，还是容易让人模糊。&lt;/p&gt;
&lt;p&gt;个人理解，配置iptables之前，首先理解，数据是从一条条链流入的，无论是外部进入的数据，还是本机进程发起的数据，都是通过链，也可以说是规则来传播的。&lt;/p&gt;
&lt;p&gt;然而，当我们配置iptables的时候，面向的是具体的表，表可以看做链或规则的集合，什么样的表里通过是么样的链一般情况下是确定的，只有这样，才可做到一目了然，有的放矢。比如filter表，用来做过滤，所以直接操作的链，便是input，
forward， output。而用来做网络地址转换的nat表，可以处理各条链。&lt;/p&gt;
&lt;p&gt;我们可以根据自己的需求来自定义链，通过加入各表已有链中生效。&lt;br&gt;
比如当本机搭建了透明代理时，如何使本机通过该代理上网？&lt;/p&gt;
&lt;p&gt;根据上图，本机所发出的数据包，必走output链，以及postrouting链路，具体配置的时候，只能配置在output链。强行配置在postrouting链会出错。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;x_tables: ip_tables: REDIRECT target: used from hooks POSTROUTING, but only
usable from PREROUTING/OUTPUT&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样看来重定向功能是不允许配置在postrouting链路中。&lt;/p&gt;
&lt;p&gt;根据上边那张图，很容易可以想到，如果我们这台机器充当路由的角色时，规则就应该配置在nat表的prerouting链中，很容易即可实现透明代理功能。&lt;/p&gt;

    </description>
    </item>
    
    <item>
    <title>Hello World!</title>
    <link>https://blog.fokia.eu.org/posts/hello-world/</link>
    <pubDate>Tue, 26 Sep 2017 13:35:21 +0800</pubDate>
    
    <guid>https://blog.fokia.eu.org/posts/hello-world/</guid>
    <description>
        &lt;p&gt;咳咳，第一篇狗屁博客，很久以前就想写博客，或许很久以前就写过博客，如果之前那些狗屁文字能算作博客的话……那这样说来，这还算不上博客。&lt;/p&gt;
&lt;p&gt;总之写这个东西，有两个目的，一是练习打字，二是记录笔记。毕竟看的东西越多，忘掉的东西越多。就这些吧。&lt;/p&gt;

    </description>
    </item>
    
  </channel>
</rss>
