<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Council of Elrond</title><link>https://songkou.github.io/</link><description>Recent content on Council of Elrond</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 11 Jul 2026 07:00:00 +0800</lastBuildDate><atom:link href="https://songkou.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>How_Linux_Sends_and_Receives_Network_Packets</title><link>https://songkou.github.io/posts/how_linux_sends_and_receives_network_packets/</link><pubDate>Sat, 11 Jul 2026 07:00:00 +0800</pubDate><guid>https://songkou.github.io/posts/how_linux_sends_and_receives_network_packets/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Study notes rewritten in my own words&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="network-models"&gt;Network models&lt;/h2&gt;
&lt;p&gt;To let all kinds of devices talk to each other over a network, the ISO defined
the &lt;strong&gt;OSI reference model&lt;/strong&gt; with 7 layers. Each layer has a single job:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application&lt;/strong&gt; – provides a uniform interface to programs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presentation&lt;/strong&gt; – converts data into a format another system understands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session&lt;/strong&gt; – establishes, manages and terminates sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transport&lt;/strong&gt; – end-to-end data transfer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt; – routing, forwarding, fragmentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data link&lt;/strong&gt; – framing, error detection, MAC addressing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Physical&lt;/strong&gt; – transmits frames over the physical medium&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OSI is mostly a &lt;em&gt;conceptual&lt;/em&gt; model — it never shipped a concrete implementation.
What we actually use is the simpler &lt;strong&gt;TCP/IP model&lt;/strong&gt; with 4 layers, and the Linux
stack is built to match it:&lt;/p&gt;</description></item><item><title>Smart Way to do Regex</title><link>https://songkou.github.io/posts/smart_way_do_regex/</link><pubDate>Fri, 06 Oct 2023 23:23:10 +0800</pubDate><guid>https://songkou.github.io/posts/smart_way_do_regex/</guid><description>&lt;p&gt;Below is a sample code that I found to get complex regex pattern instead of write it manually
good example to make smaller parts first the combine to a very complex pattern.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# convert the {name} test to rules in predefined format in macros&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;regex_expand&lt;/span&gt;(macros, pattern, guarded &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; pos &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; size:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern[pos]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ch &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; ch &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(ch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern&lt;span style="color:#f92672"&gt;.&lt;/span&gt;find(&lt;span style="color:#e6db74"&gt;&amp;#39;}&amp;#39;&lt;/span&gt;, pos)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; p2 &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(ch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p2 &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern[pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:p2]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; name &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:p3])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; name[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isdigit():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:p3])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; name) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; name):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;invalid pattern name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; name &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; macros:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;} is undefined&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; guarded:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(&lt;span style="color:#e6db74"&gt;&amp;#39;(?:&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; macros[name] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(macros[name])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(output)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# given a set of rules, create rules dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;regex_build&lt;/span&gt;(code, macros &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, capture &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; macros &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; k, v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; macros&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[k] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line_num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#f92672"&gt;in&lt;/span&gt; code&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line_num &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;not&lt;/span&gt; line) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;find(&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; pos &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: not a valid rule&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;line_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; head &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line[:pos]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line[pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;not&lt;/span&gt; head):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: empty rule name&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;line_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; head[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isdigit():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid rule name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, head))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; head) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; head):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid rule name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, head))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; regex_expand(defined, body, guarded &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; capture)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, str(e)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;compile(pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid pattern &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, pattern))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; capture:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[head] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[head] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;(?P&amp;lt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(head, pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; defined
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# define a set of rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rules &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; protocol = http|https
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login_name = [^:@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login_pass = [^@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login_name}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;(:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login_pass}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; host = [^:/@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; port = \d+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; optional_port = (?:[:]&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{port}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; path = /[^\r\n\t ]*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; url = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{protocol}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;://(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;[@])?&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{host}{optional_port}{path}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# convert above rules to dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; regex_build(rules, capture &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print dictionary info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; k, v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; m&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(k, &lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, v)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# use final rule &amp;#34;url&amp;#34; to regex a text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; m[&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;(pattern, &lt;span style="color:#e6db74"&gt;&amp;#39;https://name:pass@www.test.com:8080/abcdefg&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print the complete list of matches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#39;matched: &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;s&lt;span style="color:#f92672"&gt;.&lt;/span&gt;group(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print the matched items based on rule defined names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; name &lt;span style="color:#f92672"&gt;in&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;login_name&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;login_pass&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;host&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;port&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#39;subgroup:&amp;#39;&lt;/span&gt;, name, &lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, s&lt;span style="color:#f92672"&gt;.&lt;/span&gt;group(name))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;</description></item><item><title>Load_Balancing</title><link>https://songkou.github.io/posts/load_balancing/</link><pubDate>Sun, 20 Aug 2023 21:29:04 +0800</pubDate><guid>https://songkou.github.io/posts/load_balancing/</guid><description>&lt;h3 id="loadbalancing"&gt;LoadBalancing&lt;/h3&gt;
&lt;p&gt;Load balancing (Server Load Balance) means to balance and distribute the load (work tasks) to multiple operating units for execution, so that the entire system can complete the task together.&lt;/p&gt;
&lt;p&gt;Load balancing provides a cheap and effective method to expand the bandwidth of network devices and servers, increase throughput, enhance network data processing capabilities, and improve network flexibility and availability. According to the different implementation purposes of load balancing, load balancing can be divided into two types. One is task sharing, in which a large amount of concurrent access or data traffic is shared among multiple devices for separate processing, and each device completes a relatively complete request response process; the other is collaborative computing, which shares a heavy-load computing task. Perform parallel processing on multiple devices. After each device completes processing, the results are summarized and calculated.&lt;/p&gt;</description></item><item><title>CDN_Cache_Cluster_communication</title><link>https://songkou.github.io/posts/cdn_cache_cluster_communication/</link><pubDate>Mon, 16 May 2022 12:29:04 +0800</pubDate><guid>https://songkou.github.io/posts/cdn_cache_cluster_communication/</guid><description>&lt;h3 id="cache-cluster-communication"&gt;Cache Cluster Communication&lt;/h3&gt;
&lt;p&gt;The main goal of collaborative interaction within the Cache server cluster is to establish a good communication channel between each server node, communicate in a timely manner about the content cache on the server, and provide users with a good service experience through collaboration between servers in the cluster.&lt;/p&gt;
&lt;p&gt;Communication between Cache server clusters can be divided into two categories: loose coupling and tight coupling. Among them, loosely coupled Cache communication protocols based on network messages include: ICP, HTCP, Cache Digest, Cache Pre-filling, etc. Tightly coupled Cache communication protocols managed by specific data structures are represented by CARP. Below is just a brief introduction to these communication protocols, focusing on their working principles, advantages and disadvantages.&lt;/p&gt;</description></item><item><title>Low_Latency_Network_Architecture</title><link>https://songkou.github.io/posts/low_latency_network_architecture/</link><pubDate>Thu, 10 Mar 2022 20:04:01 +0800</pubDate><guid>https://songkou.github.io/posts/low_latency_network_architecture/</guid><description>&lt;h2 id="exchange-trading-system"&gt;exchange trading system&lt;/h2&gt;
&lt;h4 id="general-description-of-exchange-trading-system-architecture"&gt;General Description of Exchange trading system architecture&lt;/h4&gt;
&lt;p&gt;Business flow:&lt;/p&gt;
&lt;p&gt;Below is a very simple example of all the key components of a exchange trading system. Legacy system commonly run o a centralized server to process multiple tasks, and network is holding marketdata, order routing system, Clearing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://songkou.github.io/posts/low_latency_network_architecture/Low_Latency_System.png" alt="Business Flow"&gt;&lt;/p&gt;
&lt;p&gt;The lower latency the trading system is, the higher amount of orders it can handle.
To me, in terms of the HFT firms, the most important thing is the lower the latency is, the higher chance you get the information and make the deal, which can make you a better advantage vs other trading firms.&lt;/p&gt;</description></item><item><title>CDN_Notes</title><link>https://songkou.github.io/posts/cdn_notes/</link><pubDate>Sat, 08 Jan 2022 02:36:13 +0800</pubDate><guid>https://songkou.github.io/posts/cdn_notes/</guid><description>&lt;h1 id="content-delivery-network"&gt;Content Delivery Network&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Below is all my personal understandings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="full-name-content-delivery-network-or-content-ddistribute-network"&gt;Full Name :Content Delivery Network or Content Ddistribute Network&lt;/h3&gt;
&lt;p&gt;Basically, CDN solution solves a common issue: There will always be a bottleneck on the internet, due to different service providers, or geo locations, etc. Which impact the network performance. On the other hand, Latency control is one of the most important indicators nowadays.
With CDN, You can deliver a more reliable and stable network by putting certain Servers in certain places in the internet, and building a intelligent network on top of the internet.
CND can redirect customer reuquests to the fastest server(maybe not the closest), based on network throughput, response time, latency, loadbalancing status, physical distance(main factor that impact latency).&lt;/p&gt;</description></item><item><title>Git_cheat_sheet</title><link>https://songkou.github.io/posts/git_cheat_sheet/</link><pubDate>Sat, 25 Dec 2021 01:31:18 +0800</pubDate><guid>https://songkou.github.io/posts/git_cheat_sheet/</guid><description>&lt;h2 id="git-cheat-sheet"&gt;Git cheat sheet&lt;/h2&gt;
&lt;h3 id="configure"&gt;Configure&lt;/h3&gt;
&lt;p&gt;Configure system/global level of current repository username, email&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &amp;quot;Jerry Mouse&amp;quot; 
git config --global user.email &amp;quot;jerry@yiibai.com&amp;quot;`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;List git configs&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --list 
git config -l`
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="initialize"&gt;initialize&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="modify-commit"&gt;Modify commit&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git add a.html 
git commit -m &amp;quot;提交文件a.html&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git revert&lt;/code&gt;- is about making a new commit that reverts the changes made by other commits.&lt;code&gt;git reset&lt;/code&gt; is about updating your branch, moving the tip in order to add or remove commits from the branch. This operation changes the commit history. it can also be used to restore the index, overlapping with git restore.&lt;code&gt;git-restore&lt;/code&gt; is about restoring files in the working tree from either the index or another commit. This command does not update your branch. The command can also be used to restore files in the index from another commit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Revert will reverse the changes from a commitment and is used mostly to undo faulty commits. This means that you can revert specific commits without affecting others. Revert works by making a new commit with the changes removed. You can revert any past commit. This can be the last commit, &lt;code&gt;$ git revert HEAD&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Python_One_line</title><link>https://songkou.github.io/posts/python_one_line/</link><pubDate>Mon, 22 Nov 2021 22:08:48 +0800</pubDate><guid>https://songkou.github.io/posts/python_one_line/</guid><description>&lt;h2 id="tricks-to-write-python-in-one-line"&gt;Tricks to write Python in one line&lt;/h2&gt;
&lt;h3 id="get-dict-output-value"&gt;Get dict output value&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dict_test = {&amp;#34;A&amp;#34;: 100, &amp;#34;B&amp;#34;: 99, &amp;#34;C&amp;#34;: 33, &amp;#34;D&amp;#34;: 120}

output = [(key, value) for key, value in dict_test.items() if value &amp;gt;= 100]

print(f&amp;#34;the output is ：{output}&amp;#34;)

the output is ：[(&amp;#39;A&amp;#39;, 100), (&amp;#39;D&amp;#39;, 120)]

type(output)
list
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="filter-words-that-is-more-than-3-characters-in-a-sentence"&gt;Filter words that is more than 3 characters in a sentence&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;text = &amp;#39;&amp;#39;&amp;#39;Outside, the moon is shedding its cold light on the cold snow,\nand the white-bearded fir-trees round Camp Villa1 are casting a blue shadow across the white ground, \nwhile the Rev2&amp;#39;&amp;#39;&amp;#39;
output = [[x for x in line.split() if len(x) &amp;lt; 3] for line in text.split(&amp;#34;\n&amp;#34;)]
print(f&amp;#34;the output is：{output}&amp;#34;)

the output is：[[&amp;#39;is&amp;#39;, &amp;#39;on&amp;#39;], [&amp;#39;a&amp;#39;], []]

#logic is: 1st,split the text to a list, separater is &amp;#34;\n&amp;#34;(new line),
#2nd, for each line, split by space, which becomes a list again. 
#3rd, for each word in 2nd list, if the length of the word is less than 3(less than 3 characters) 
#put 3rd result in to a list. then for each line you get a list, combine it to a matrix
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="remove-spaces-beforeafter-the-text"&gt;Remove spaces before/after the text&lt;/h3&gt;
&lt;p&gt;I modified log file to make a simple demo.&lt;/p&gt;</description></item><item><title>Python_Regex</title><link>https://songkou.github.io/posts/python_regex/</link><pubDate>Tue, 12 Oct 2021 20:59:46 +0800</pubDate><guid>https://songkou.github.io/posts/python_regex/</guid><description>&lt;h2 id="some-advanced-usage-on-regex"&gt;Some Advanced usage on regex&lt;/h2&gt;
&lt;h3 id="get-float-number"&gt;get float number:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import re
target = &amp;#39;total growth is : 8%-8.5%&amp;#39;
rate = re.findall(&amp;#39;(\d+(?:\.\d+)?)&amp;#39;, target)
print(rate)
[&amp;#39;8&amp;#39;, &amp;#39;8.5&amp;#39;]
#\d is any int, + is one to many
#(?:...)
#A non-capturing group allows you to apply quantifiers to part of your regex but does not capture/assign an ID.
#so it means: find int or, if int follows a &amp;#34;.&amp;#34; and any int afterwards, combine the int with &amp;#34;.int&amp;#34;
#For example, repeating 1-3 digits and a period 3 times can be done like #this: /(?:\d{1,3}\.){3}\d{1,3}/
#above regex can match string like : 219.254.232.123 or 232.212.222.3434 (can only go until 232.212.222.343), 
#can not match 232.2122.222.3434 or 232.212.22a.3434

#`(\d+(?:\.\d+)?)` is a group, so result will be put in a list. 

#if you just want to match any int or .xxx or xxxx.xxx,just use

rate = re.findall(&amp;#39;(\d+(\.\d+)?)&amp;#39;, target)
print(rate)
[(&amp;#39;8&amp;#39;, &amp;#39;&amp;#39;), (&amp;#39;8.5&amp;#39;, &amp;#39;.5&amp;#39;)]
#which will return a list to you

#if you just want to find a float, use below: 

target = &amp;#39;total growth is : 8%-8.5% or 9.546%&amp;#39;
rate = re.findall(&amp;#39;(\d+\.\d+)&amp;#39;, target)
print(rate)
[&amp;#39;8.5&amp;#39;, &amp;#39;9.546&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="a-bit-deeper"&gt;A bit deeper:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;A(?=B)&lt;/code&gt; ：Match &lt;strong&gt;String A&lt;/strong&gt; &lt;em&gt;ends&lt;/em&gt; with &lt;strong&gt;String B&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Mysql_frequently_used_commands</title><link>https://songkou.github.io/posts/mysql_frequently_used_commands/</link><pubDate>Wed, 22 Sep 2021 10:39:22 +0800</pubDate><guid>https://songkou.github.io/posts/mysql_frequently_used_commands/</guid><description>&lt;p&gt;###Note for frequently used sql commands, just in case forget when long time don&amp;rsquo;t use it&lt;/p&gt;
&lt;p&gt;let&amp;rsquo;s say you want a below table:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;name_of column&lt;/th&gt;
					&lt;th&gt;type&lt;/th&gt;
					&lt;th&gt;length&lt;/th&gt;
					&lt;th&gt;can empty&lt;/th&gt;
					&lt;th&gt;master key&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;id&lt;/td&gt;
					&lt;td&gt;int&lt;/td&gt;
					&lt;td&gt;12&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;topic&lt;/td&gt;
					&lt;td&gt;varchar&lt;/td&gt;
					&lt;td&gt;255&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;content&lt;/td&gt;
					&lt;td&gt;longtext&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;tag&lt;/td&gt;
					&lt;td&gt;varchar&lt;/td&gt;
					&lt;td&gt;255&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;insert_time&lt;/td&gt;
					&lt;td&gt;datetime&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;yes&lt;/td&gt;
					&lt;td&gt;no&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;to create above table:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE IF NOT EXISTS `mq_info` ( 
 `id` INT(12) UNSIGNED AUTO_INCREMENT COMMENT &amp;#39;auto increase id&amp;#39;,
 `topic` VARCHAR ( 255 ) NOT NULL COMMENT &amp;#39;topic name&amp;#39;, 
 `content` longtext NOT NULL COMMENT &amp;#39;content&amp;#39;, 
 `tag` VARCHAR ( 255 ) COMMENT &amp;#39;tag of this Message Queue&amp;#39;, 
 PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Query all data in table:&lt;/p&gt;</description></item><item><title>Mysql_installation</title><link>https://songkou.github.io/posts/mysql_installation/</link><pubDate>Sun, 07 Feb 2021 18:33:58 +0800</pubDate><guid>https://songkou.github.io/posts/mysql_installation/</guid><description>&lt;p&gt;The general view of the difference between mysql and marinaDB can refer to this link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.panoply.io/a-comparative-vmariadb-vs-mysql"&gt;https://blog.panoply.io/a-comparative-vmariadb-vs-mysql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And I quote some here:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MySQL:&lt;/strong&gt; MySQL is an open-source relational database management system (RDBMS). Just like all other relational databases, MySQL uses tables, constraints, triggers, roles, stored procedures and views as the core components that you work with. A table consists of rows, and each row contains a same set of columns. MySQL uses primary keys to uniquely identify each row (a.k.a record) in a table, and foreign keys to assure the referential integrity between two related tables.&lt;/p&gt;</description></item><item><title>Python_mysql</title><link>https://songkou.github.io/posts/python_mysql/</link><pubDate>Sun, 07 Feb 2021 13:21:07 +0800</pubDate><guid>https://songkou.github.io/posts/python_mysql/</guid><description>&lt;h1 id="python-query-mysql"&gt;Python Query mysql&lt;/h1&gt;
&lt;p&gt;To use Python to query mysql DB. There are two popular modules are used:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pymysql&lt;/li&gt;
&lt;li&gt;sqlalchemy ( need to install mysqlconnector in my scenario) &lt;code&gt;pip install mysql-connector-python&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="pymysql"&gt;pymysql:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ekoudb = pymysql.connect(host=&amp;#39;10.10.80.127&amp;#39;, 
 port=3306, 
 user=&amp;#39;ekou&amp;#39;, 
 password=&amp;#39;abcd12334&amp;#39;, 
 database=&amp;#39;ekoutest&amp;#39;) 
 
 #get cursor 
cursor = ekoudb.cursor()

def insert_a_item(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34; 
 Insert items &amp;#34;&amp;#34;&amp;#34; 
 try: 
 cursor.execute(SqlLang) 
 ekoudb.commit() 
 except Exception as e: 
 print(&amp;#39;Insert data fail&amp;#39;) 
 print(e) 
 ekoudb.rollback() 
 # release resource 
 cursor.close() 
 ekoudb.close() 
#insert_a_item(SQL_INSERT_A_ITEM)
SQL_INSERT_MANY_ITEMS = &amp;#34;INSERT INTO bird_table (origin, hostname,descr,ver,protocol,neighboraddr,neighboras,status,sinceday,sincetime) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)&amp;#34;

MULTIENTRY = [[&amp;#34;update&amp;#34;,&amp;#34;host1&amp;#34;,&amp;#34;descr1&amp;#34;,&amp;#34;ipv6&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;2123123&amp;#34;,&amp;#34;231233&amp;#34;,&amp;#34;Idle&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;16:50:07&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host2&amp;#34;,&amp;#34;descr2&amp;#34;,&amp;#34;ipv6&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;ipv6_addr1&amp;#34;,&amp;#34;65300&amp;#34;,&amp;#34;Idle&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;16:50:07&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host3&amp;#34;,&amp;#34;descr3&amp;#34;,&amp;#34;ipv4&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;10.10.1.1&amp;#34;,&amp;#34;65002&amp;#34;,&amp;#34;Established&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;15:50:13&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host4&amp;#34;,&amp;#34;descr4&amp;#34;,&amp;#34;ipv4&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;10.10.1.3&amp;#34;,&amp;#34;65003&amp;#34;,&amp;#34;Established&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;15:50:13&amp;#34;]]

def insert_items(MANYTIMESFORMAT,SqlLang): 
 try: 
 cursor.executemany(MANYTIMESFORMAT, SqlLang) 
 ekoudb.commit() 
 except Exception as e: 
 print(&amp;#34;Insert_error&amp;#34;) 
 ekoudb.rollback() 
 # release resource 
 cursor.close() 
 ekoudb.close()

def query(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34;query&amp;#34;&amp;#34;&amp;#34; 
 # query all data 
 cursor.execute(SqlLang) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 print(&amp;#39;| origin | hostname | descr | ver | protocol | \ 
 neighboraddr | neighboras | status | sinceday | sincetime |&amp;#39;) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 # matrix data 
 rows = cursor.fetchall() 
 for row in rows: 
 origin = row[0] 
 hostname = row[1] 
 descr = row[2] 
 ver = row[3] 
 protocol = row[4] 
 neighboraddr = str(row[5]) 
 neighboras = str(row[6]) 
 status = row[7] 
 sinceday = str(row[7]) 
 sincetime = str(row[9]) 
 
# print(&amp;#39;| &amp;#39; + origin.rjust(2) + &amp;#39;|&amp;#39;.rjust(7) + hostname.rjust(2) + &amp;#39;|&amp;#39;.rjust(10) + descr.rjust(2) + &amp;#39;|&amp;#39;.rjust(26) + ver.rjust(2) + &amp;#39;|&amp;#39;.rjust(5) + protocol.rjust(2) + &amp;#39;|&amp;#39;.rjust(9) + neighboraddr.rjust(2) + + &amp;#39;|&amp;#39;.rjust(25) + neighboras.rjust(2) + &amp;#39;|&amp;#39;.rjust(11) + status.rjust(2) + &amp;#39;|&amp;#39;.rjust(12) + sinceday.rjust(2) + &amp;#39;|&amp;#39;.rjust(11) + sincetime.rjust(2)) 
# print(&amp;#39;| &amp;#39; + origin.rjust(2) + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + hostname + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39;+ descr + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + ver + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + protocol + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+neighboras + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+neighboraddr + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+status + &amp;#39;\t|&amp;#39;+ &amp;#39;\t&amp;#39; + sinceday + &amp;#39;\t|&amp;#39;+ &amp;#39;\t&amp;#39; +sincetime + &amp;#39;\t|&amp;#39;) 
 print(&amp;#39;|&amp;#39; + format(origin,&amp;#34;&amp;lt;8&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(hostname,&amp;#34;&amp;lt;10&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(descr,&amp;#34;&amp;lt;26&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(ver,&amp;#34;&amp;lt;5&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(protocol,&amp;#34;&amp;lt;9&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(neighboraddr,&amp;#34;&amp;lt;25&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(neighboras,&amp;#34;&amp;lt;11&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(status,&amp;#34;&amp;lt;12&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(sinceday,&amp;#34;&amp;lt;11&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(sincetime,&amp;#34;&amp;lt;10&amp;#34;) + &amp;#34;|&amp;#34; ) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 # release resource 
 cursor.close() 
 ekoudb.close()
 


SQL_UPDATE = &amp;#34;UPDATE bird_table SET hostname=&amp;#39;%s&amp;#39;,status=&amp;#39;%s&amp;#39; WHERE descr=&amp;#39;%s&amp;#39;&amp;#34; 
 
def update(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34; 
 update 
 :return: &amp;#34;&amp;#34;&amp;#34; sql_update = SqlLang % (&amp;#39;hostname3&amp;#39;, &amp;#39;connect&amp;#39;, &amp;#39;descr_1&amp;#39;) 
 try: 
 cursor.execute(sql_update) 
 ekoudb.commit() 
 except Exception as e: 
 ekoudb.rollback() 
 print(&amp;#39;error when update data&amp;#39;) 
 print(e) 
 # release resource 
 cursor.close() 
 ekoudb.close() 
 
update(SQL_UPDATE)
SQL_DELETE = &amp;#34;DELETE FROM bird_table WHERE descr=&amp;#39;%s&amp;#39;&amp;#34; 
 
def delete(SqlLang,delete_string): 
 &amp;#34;&amp;#34;&amp;#34; 
 delete record 
 :return: &amp;#34;&amp;#34;&amp;#34; try: 
 # delete sql 
 sql_del = SqlLang % (delete_string) 
 cursor.execute(sql_del) 
 ekoudb.commit() 
 except Exception as e: 
 # rollback when error 
 ekoudb.rollback() 
 print(e) 
 # release resource 
 cursor.close() 
 ekoudb.close() 
 
delete(SQL_DELETE,&amp;#39;23123213213&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sqlalchemy"&gt;sqlalchemy:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;engine = create_engine(&amp;#34;mysql+mysqlconnector://ekou:PASSWORD@10.10.80.127:3306/ekoutest?charset=utf8mb4&amp;#34;)

metadata = MetaData(engine) 
 
Session = sessionmaker() # create a customized session 
Session.configure(bind=engine) # link to this session 
session = Session()
users_table = Table(&amp;#39;bird_table&amp;#39;, metadata, autoload=True)

result=users_table.select(and_(users_table.c.descr == &amp;#34;descr&amp;#34;, users_table.c.neighboraddr == &amp;#34;NEIGHBOR_ADDR&amp;#34;)).execute() 
for item in result.fetchall(): 
 print (item)

&amp;#39;&amp;#39;&amp;#39; 
create table 
&amp;#39;&amp;#39;&amp;#39; 
users_table = Table(&amp;#39;users&amp;#39;, 
 metadata, 
 Column(&amp;#39;id&amp;#39;, Integer, primary_key=True), 
 Column(&amp;#39;name&amp;#39;, String(40)), 
 Column(&amp;#39;email&amp;#39;, String(120))) 
if not users_table.exists(): 
 users_table.create() 
 
&amp;#39;&amp;#39;&amp;#39; 
load table 
&amp;#39;&amp;#39;&amp;#39; 
users_table = Table(&amp;#39;users&amp;#39;, metadata, autoload=True) 
 
&amp;#39;&amp;#39;&amp;#39; 
insert 
&amp;#39;&amp;#39;&amp;#39; 
users_table.insert().execute(name=&amp;#34;sss&amp;#34;, email=&amp;#34;eee@eee.com&amp;#34;) 
users_table.insert().execute(name=&amp;#34;ttt&amp;#34;, email=&amp;#34;tt@eee.com&amp;#34;) 
&amp;#39;&amp;#39;&amp;#39; 
update 
&amp;#39;&amp;#39;&amp;#39; 
users_table.update(users_table.c.name == &amp;#34;ttt&amp;#34;).execute(name=&amp;#34;ddd&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="conclusion"&gt;conclusion:&lt;/h3&gt;
&lt;p&gt;for easier get on hand, pymsql would be good enough to use. but for advanced, need to use sqlalchemy.&lt;/p&gt;</description></item><item><title>Linux_name_space</title><link>https://songkou.github.io/posts/linux_name_space/</link><pubDate>Fri, 01 Jan 2021 14:52:01 +0800</pubDate><guid>https://songkou.github.io/posts/linux_name_space/</guid><description>&lt;h1 id="linux-namespace"&gt;Linux NameSpace&lt;/h1&gt;
&lt;p&gt;Docker denpends on Linux NameSpace, Thus this is a brief explaination on linux name space.&lt;/p&gt;
&lt;p&gt;We can use unshare command to manipulate/playaround with linux name spaces.&lt;/p&gt;
&lt;h2 id="how-to-check-what-kind-of-linux-namespace-is-supported"&gt;How to check what kind of linux namespace is supported&lt;/h2&gt;
&lt;p&gt;We can use “man unshare” to check what kind of linux namespace is supported. There are 8 types of name spaces:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; mount namespace
 Mounting and unmounting filesystems will not affect the rest of the system (CLONE_NEWNS flag), except for filesystems which are explicitly marked as shared (with mount --make-shared; see /proc/self/mountinfo or
 findmnt -o+PROPAGATION for the shared flags).

 unshare automatically sets propagation to private in the new mount namespace to make sure that the new namespace is really unshared. This feature is possible to disable by option --propagation unchanged. Note
 that private is the kernel default.

 UTS namespace
 Setting hostname or domainname will not affect the rest of the system. (CLONE_NEWUTS flag)

 IPC namespace
 The process will have an independent namespace for System V message queues, semaphore sets and shared memory segments. (CLONE_NEWIPC flag)

 network namespace
 The process will have independent IPv4 and IPv6 stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc. (CLONE_NEWNET flag)

 pid namespace
 Children will have a distinct set of PID to process mappings from their parent. (CLONE_NEWPID flag)

 user namespace
 The process will have a distinct set of UIDs, GIDs and capabilities. (CLONE_NEWUSER flag)

 See clone(2) for the exact semantics of the flags.
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;Mount（mnt） isolate mounting space&lt;/li&gt;
&lt;li&gt;Process ID (pid) isolate process ID.&lt;/li&gt;
&lt;li&gt;Network (net) isolate network , port ID, etc&lt;/li&gt;
&lt;li&gt;Interprocess Communication (ipc) isolate System V IPC &amp;amp; POSIX message queues&lt;/li&gt;
&lt;li&gt;UTS Namespace(uts) Isolate hostname and domain name&lt;/li&gt;
&lt;li&gt;User Namespace (user) isolate user group and users.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Additionally, Linux 4.6 and 5.6 introduced cgroups and time two types. in total it’s 8.&lt;/p&gt;</description></item><item><title>squid_setup</title><link>https://songkou.github.io/posts/squid_setup/</link><pubDate>Thu, 18 Jun 2020 23:15:45 +0800</pubDate><guid>https://songkou.github.io/posts/squid_setup/</guid><description>&lt;pre&gt;&lt;code&gt;1. yum -y update

2. yum install openssl

3. yum install squid

4. vim /etc/squid/squid.conf

5. tail -f /var/log/squid/access.log

6. systemctl start squid

7. systemctl status squid

8. ss -nlp | grep squid | grep 3128

dns_nameservers 8.8.8.8 8.8.4.4
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>