<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>程序猜想</title>
  
  <subtitle>瞎写的程序员</subtitle>
  <link href="https://2tu.github.io/atom.xml" rel="self"/>
  
  <link href="https://2tu.github.io/"/>
  <updated>2026-01-15T12:42:41.739Z</updated>
  <id>https://2tu.github.io/</id>
  
  <author>
    <name>2Tu</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Manjaro怎么把安装的程序放到Applications</title>
    <link href="https://2tu.github.io/2026/01/15/how-to-search-application-on-manjaro/"/>
    <id>https://2tu.github.io/2026/01/15/how-to-search-application-on-manjaro/</id>
    <published>2026-01-15T12:26:37.000Z</published>
    <updated>2026-01-15T12:42:41.739Z</updated>
    
    <content type="html"><![CDATA[<p>自己下载安装的程序在Manjaro的Applications搜索不到，每次从opt目录点进去打开太麻烦了。解决需要手动创建一个 .desktop 快捷方式文件</p><ol><li>创建桌面入口文件<br>  在终端中使用编辑器（如 nano）在用户应用目录中创建一个新文件：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.local/share/applications/软件名.desktop</span><br></pre></td></tr></table></figure></li><li>编写文件内容<br>将以下模板复制并粘贴到文件中，根据实际情况修改路径：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[Desktop Entry]</span><br><span class="line">Version=1.0</span><br><span class="line">Name=你的应用名称 (e.g., IntelliJ IDEA)</span><br><span class="line">Comment=你的应用描述 (e.g., Powerful IDE)</span><br><span class="line">Exec=/opt/your-app-name/bin/your-executable-file %U  # 替换成你的实际路径</span><br><span class="line">Icon=/opt/your-app-name/icon.png # 替换成你的图标路径 (可选)</span><br><span class="line">Terminal=false</span><br><span class="line">Type=Application</span><br><span class="line">Categories=Development;IDE; # 替换成适合你应用的分类</span><br></pre></td></tr></table></figure></li></ol><p>关键字段说明：<br>Name: 搜索栏中显示的名称。<br>Exec: 程序启动文件的绝对路径。 %U 支持一次性打开多个文件或链接。<br>Icon: 图标文件的路径（通常在 /opt 目录下可以找到 .png 或 .svg 文件）。<br>Terminal: 如果程序需要打开终端运行，设为 true；普通图形界面程序设为 false。</p><ol start="3"><li>设置可执行<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x ~/.local/share/applications/软件名.desktop</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;自己下载安装的程序在Manjaro的Applications搜索不到，每次从opt目录点进去打开太麻烦了。解决需要手动创建一个 .desktop 快捷方式文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建桌面入口文件&lt;br&gt;  在终端中使用编辑器（如 nano）在用户应用目录中创建一个新</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="Manjaro" scheme="https://2tu.github.io/tags/Manjaro/"/>
    
  </entry>
  
  <entry>
    <title>manjaro安装lxml报错解决</title>
    <link href="https://2tu.github.io/2026/01/13/how-to-install-lxml-on-manjaro/"/>
    <id>https://2tu.github.io/2026/01/13/how-to-install-lxml-on-manjaro/</id>
    <published>2026-01-13T08:27:27.000Z</published>
    <updated>2026-01-15T12:42:41.738Z</updated>
    
    <content type="html"><![CDATA[<p>OS: Manjaro xfc<br>Python: 3.13.11<br>lxml: 4.9.7<br>通过requirements.txt文件安装报错<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br></pre></td><td class="code"><pre><span class="line">[output] Collecting lxml==4.9.4</span><br><span class="line">[output]   Using cached lxml-4.9.4.tar.gz (3.6 MB)</span><br><span class="line">[output]   Installing build dependencies: started</span><br><span class="line">[output]   Installing build dependencies: finished with status 'done'</span><br><span class="line">[output]   Getting requirements to build wheel: started</span><br><span class="line">[output]   Getting requirements to build wheel: finished with status 'done'</span><br><span class="line">[output]   Preparing metadata (pyproject.toml): started</span><br><span class="line">[output]   Preparing metadata (pyproject.toml): finished with status 'done'</span><br><span class="line">[output] Collecting openpyxl==2.5.12</span><br><span class="line">[output]   Using cached openpyxl-2.5.12-py2.py3-none-any.whl</span><br><span class="line">[output] Collecting requests==2.31.0</span><br><span class="line">[output]   Using cached requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)</span><br><span class="line">[output] Collecting jdcal (from openpyxl==2.5.12)</span><br><span class="line">[output]   Using cached jdcal-1.4.1-py2.py3-none-any.whl.metadata (5.0 kB)</span><br><span class="line">[output] Collecting et_xmlfile (from openpyxl==2.5.12)</span><br><span class="line">[output]   Using cached et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)</span><br><span class="line">[output] Collecting charset-normalizer&lt;4,&gt;=2 (from requests==2.31.0)</span><br><span class="line">[output]   Using cached charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (37 kB)</span><br><span class="line">[output] Collecting idna&lt;4,&gt;=2.5 (from requests==2.31.0)</span><br><span class="line">[output]   Using cached idna-3.11-py3-none-any.whl.metadata (8.4 kB)</span><br><span class="line">[output] Collecting urllib3&lt;3,&gt;=1.21.1 (from requests==2.31.0)</span><br><span class="line">[output]   Using cached urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB)</span><br><span class="line">[output] Collecting certifi&gt;=2017.4.17 (from requests==2.31.0)</span><br><span class="line">[output]   Using cached certifi-2026.1.4-py3-none-any.whl.metadata (2.5 kB)</span><br><span class="line">[output] Using cached requests-2.31.0-py3-none-any.whl (62 kB)</span><br><span class="line">[output] Using cached certifi-2026.1.4-py3-none-any.whl (152 kB)</span><br><span class="line">[output] Using cached charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (153 kB)</span><br><span class="line">[output] Using cached idna-3.11-py3-none-any.whl (71 kB)</span><br><span class="line">[output] Using cached urllib3-2.6.3-py3-none-any.whl (131 kB)</span><br><span class="line">[output] Using cached et_xmlfile-2.0.0-py3-none-any.whl (18 kB)</span><br><span class="line">[output] Using cached jdcal-1.4.1-py2.py3-none-any.whl (9.5 kB)</span><br><span class="line">[output] Building wheels for collected packages: lxml</span><br><span class="line">[output]   Building wheel for lxml (pyproject.toml): started</span><br><span class="line">[output]   Building wheel for lxml (pyproject.toml): finished with status 'error'</span><br><span class="line">[output] Failed to build lxml</span><br><span class="line"> [error]   error: subprocess-exited-with-error</span><br><span class="line"> [error]   </span><br><span class="line"> [error]   × Building wheel for lxml (pyproject.toml) did not run successfully.</span><br><span class="line"> [error]   │ exit code: 1</span><br><span class="line"> [error]   ╰─&gt; [425 lines of output]</span><br><span class="line"> [error]       &lt;string&gt;:67: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&lt;81.</span><br><span class="line"> [error]       /tmp/pip-build-env-2w5tteta/overlay/lib/python3.13/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated.</span><br><span class="line"> [error]       !!</span><br><span class="line"> [error]       </span><br><span class="line"> [error]               ********************************************************************************</span><br><span class="line"> [error]               Please consider removing the following classifiers in favor of a SPDX license expression:</span><br><span class="line"> [error]       </span><br><span class="line"> [error]               License :: OSI Approved :: BSD License</span><br><span class="line"> [error]       </span><br><span class="line"> [error]               See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.</span><br><span class="line"> [error]               ********************************************************************************</span><br><span class="line"> [error]       </span><br><span class="line"> [error]       !!</span><br><span class="line"> [error]         self._finalize_license_expression()</span><br><span class="line"> [error]       Building lxml version 4.9.4.</span><br><span class="line"> [error]       Building without Cython.</span><br><span class="line"> [error]       Building against libxml2 2.15.1 and libxslt 1.1.45</span><br><span class="line"> [error]       running bdist_wheel</span><br><span class="line"> [error]       running build</span><br><span class="line"> [error]       running build_py</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/usedoctest.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/sax.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/pyclasslookup.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/doctestcompare.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/cssselect.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/builder.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/_elementpath.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/__init__.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/ElementInclude.py -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/__init__.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/usedoctest.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/soupparser.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/html5parser.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/formfill.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/diff.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/defs.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/clean.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/builder.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/_setmixin.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/_html5builder.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/_diffcommand.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/__init__.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       copying src/lxml/html/ElementSoup.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/html</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/isoschematron</span><br><span class="line"> [error]       copying src/lxml/isoschematron/__init__.py -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron</span><br><span class="line"> [error]       copying src/lxml/etree.h -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/etree_api.h -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/lxml.etree.h -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/lxml.etree_api.h -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/objectify.pyx -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/etree.pyx -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xsltext.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xslt.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xpath.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xmlschema.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xmlid.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xmlerror.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/xinclude.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/serializer.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/schematron.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/saxparser.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/relaxng.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/readonlytree.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/public-api.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/proxy.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/parsertarget.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/parser.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/objectpath.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/nsclasses.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/iterparse.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/extensions.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/dtd.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/docloader.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/debug.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/cleanup.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/classlookup.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/apihelpers.pxi -&gt; build/lib.linux-x86_64-cpython-313/lxml</span><br><span class="line"> [error]       copying src/lxml/includes/xslt.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/xpath.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/xmlschema.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/xmlparser.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/xmlerror.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/xinclude.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/uri.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/tree.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/schematron.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/relaxng.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/htmlparser.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/etreepublic.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/dtdvalid.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/config.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/c14n.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/__init__.pxd -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/lxml-version.h -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       copying src/lxml/includes/etree_defs.h -&gt; build/lib.linux-x86_64-cpython-313/lxml/includes</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/rng</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/rng/iso-schematron.rng -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/rng</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl</span><br><span class="line"> [error]       creating build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt -&gt; build/lib.linux-x86_64-cpython-313/lxml/isoschematron/resources/xsl/iso-schematron-xslt1</span><br><span class="line"> [error]       running build_ext</span><br><span class="line"> [error]       building 'lxml.etree' extension</span><br><span class="line"> [error]       creating build/temp.linux-x86_64-cpython-313/src/lxml</span><br><span class="line"> [error]       gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -ffile-prefix-map=/build/python/src=/usr/src/debug/python -flto=auto -ffat-lto-objects -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -ffile-prefix-map=/build/python/src=/usr/src/debug/python -flto=auto -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -ffile-prefix-map=/build/python/src=/usr/src/debug/python -flto=auto -fPIC -DCYTHON_CLINE_IN_TRACEBACK=0 -I/usr/include/libxml2 -Isrc -Isrc/lxml/includes -I/home/project/test/.venv/include -I/usr/include/python3.13 -c src/lxml/etree.c -o build/temp.linux-x86_64-cpython-313/src/lxml/etree.o -w</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_init_assertions_enabled’:</span><br><span class="line"> [error]       src/lxml/etree.c:5988:39: error: implicit declaration of function ‘_PyInterpreterState_GetConfig’; did you mean ‘PyInterpreterState_GetID’? [-Wimplicit-function-declaration]</span><br><span class="line"> [error]        5988 |     __pyx_assertions_enabled_flag = ! _PyInterpreterState_GetConfig(__Pyx_PyThreadState_Current-&gt;interp)-&gt;optimization_level;</span><br><span class="line"> [error]             |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]             |                                       PyInterpreterState_GetID</span><br><span class="line"> [error]       src/lxml/etree.c:5988:105: error: invalid type argument of ‘-&gt;’ (have ‘int’)</span><br><span class="line"> [error]        5988 |     __pyx_assertions_enabled_flag = ! _PyInterpreterState_GetConfig(__Pyx_PyThreadState_Current-&gt;interp)-&gt;optimization_level;</span><br><span class="line"> [error]             |                                                                                                         ^~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree_fixThreadDictNamesForDtd’:</span><br><span class="line"> [error]       src/lxml/etree.c:19193:49: error: passing argument 1 of ‘__pyx_f_4lxml_5etree__fixThreadDictPtr’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       19193 |         __pyx_f_4lxml_5etree__fixThreadDictPtr((&amp;__pyx_v_c_attribute-&gt;defaultValue), __pyx_v_c_src_dict, __pyx_v_c_dict);</span><br><span class="line"> [error]             |                                                ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]             |                                                 |</span><br><span class="line"> [error]             |                                                 xmlChar ** &#123;aka unsigned char **&#125;</span><br><span class="line"> [error]       src/lxml/etree.c:18536:82: note: expected ‘const xmlChar **’ &#123;aka ‘const unsigned char **’&#125; but argument is of type ‘xmlChar **’ &#123;aka ‘unsigned char **’&#125;</span><br><span class="line"> [error]       18536 | static CYTHON_INLINE void __pyx_f_4lxml_5etree__fixThreadDictPtr(const xmlChar **__pyx_v_c_ptr, xmlDict *__pyx_v_c_src_dict, xmlDict *__pyx_v_c_dict) &#123;</span><br><span class="line"> [error]             |                                                                  ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree_14_ParserContext_prepare’:</span><br><span class="line"> [error]       src/lxml/etree.c:113221:38: error: assignment to ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; from incompatible pointer type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125; [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       113221 |   __pyx_v_self-&gt;_c_ctxt-&gt;sax-&gt;serror = __pyx_f_4lxml_5etree__receiveParserError;</span><br><span class="line"> [error]              |                                      ^</span><br><span class="line"> [error]       src/lxml/etree.c:7472:13: note: ‘__pyx_f_4lxml_5etree__receiveParserError’ declared here</span><br><span class="line"> [error]        7472 | static void __pyx_f_4lxml_5etree__receiveParserError(void *, xmlError *); /*proto*/</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       In file included from /usr/include/libxml2/libxml/valid.h:19,</span><br><span class="line"> [error]                        from /usr/include/libxml2/libxml/parser.h:24,</span><br><span class="line"> [error]                        from /usr/include/libxml2/libxml/tree.h:20,</span><br><span class="line"> [error]                        from src/lxml/includes/etree_defs.h:189,</span><br><span class="line"> [error]                        from src/lxml/etree.c:864:</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree_11_BaseParser__registerHtmlErrorHandler’:</span><br><span class="line"> [error]       src/lxml/etree.c:117709:25: error: assignment to ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; from incompatible pointer type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125; [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       117709 |     __pyx_v_sax-&gt;serror = __pyx_f_4lxml_5etree__receiveParserError;</span><br><span class="line"> [error]              |                         ^</span><br><span class="line"> [error]       src/lxml/etree.c:113855:13: note: ‘__pyx_f_4lxml_5etree__receiveParserError’ declared here</span><br><span class="line"> [error]       113855 | static void __pyx_f_4lxml_5etree__receiveParserError(void *__pyx_v_c_context, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]              |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_11TreeBuilder_4data’:</span><br><span class="line"> [error]       src/lxml/etree.c:137976:66: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxData’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       137976 |   __pyx_t_1 = __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxData(((struct __pyx_obj_4lxml_5etree__SaxParserTarget *)__pyx_v_self), __pyx_v_data); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(3, 834, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                                 ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                  |</span><br><span class="line"> [error]              |                                                                  struct __pyx_obj_4lxml_5etree__SaxParserTarget *</span><br><span class="line"> [error]       src/lxml/etree.c:137352:105: note: expected ‘struct __pyx_obj_4lxml_5etree_TreeBuilder *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__SaxParserTarget *’</span><br><span class="line"> [error]       137352 | static int __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxData(struct __pyx_obj_4lxml_5etree_TreeBuilder *__pyx_v_self, PyObject *__pyx_v_data) &#123;</span><br><span class="line"> [error]              |                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_11TreeBuilder_6start’:</span><br><span class="line"> [error]       src/lxml/etree.c:138137:67: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxStart’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       138137 |   __pyx_t_3 = __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxStart(((struct __pyx_obj_4lxml_5etree__SaxParserTarget *)__pyx_v_self), __pyx_v_tag, __pyx_v_attrs, __pyx_v_nsmap); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 843, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                                  ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                   |</span><br><span class="line"> [error]              |                                                                   struct __pyx_obj_4lxml_5etree__SaxParserTarget *</span><br><span class="line"> [error]       src/lxml/etree.c:136951:112: note: expected ‘struct __pyx_obj_4lxml_5etree_TreeBuilder *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__SaxParserTarget *’</span><br><span class="line"> [error]       136951 | static PyObject *__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxStart(struct __pyx_obj_4lxml_5etree_TreeBuilder *__pyx_v_self, PyObject *__pyx_v_tag, PyObject *__pyx_v_attrib, PyObject *__pyx_v_nsmap) &#123;</span><br><span class="line"> [error]              |                                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_11TreeBuilder_8end’:</span><br><span class="line"> [error]       src/lxml/etree.c:138208:65: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxEnd’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       138208 |   __pyx_t_1 = __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxEnd(((struct __pyx_obj_4lxml_5etree__SaxParserTarget *)__pyx_v_self), __pyx_v_tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 850, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                                ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                 |</span><br><span class="line"> [error]              |                                                                 struct __pyx_obj_4lxml_5etree__SaxParserTarget *</span><br><span class="line"> [error]       src/lxml/etree.c:137251:110: note: expected ‘struct __pyx_obj_4lxml_5etree_TreeBuilder *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__SaxParserTarget *’</span><br><span class="line"> [error]       137251 | static PyObject *__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxEnd(struct __pyx_obj_4lxml_5etree_TreeBuilder *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_tag) &#123;</span><br><span class="line"> [error]              |                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_11TreeBuilder_10pi’:</span><br><span class="line"> [error]       src/lxml/etree.c:138409:64: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxPi’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       138409 |   __pyx_t_1 = __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxPi(((struct __pyx_obj_4lxml_5etree__SaxParserTarget *)__pyx_v_self), __pyx_v_target, __pyx_v_data); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 861, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                               ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                |</span><br><span class="line"> [error]              |                                                                struct __pyx_obj_4lxml_5etree__SaxParserTarget *</span><br><span class="line"> [error]       src/lxml/etree.c:137401:109: note: expected ‘struct __pyx_obj_4lxml_5etree_TreeBuilder *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__SaxParserTarget *’</span><br><span class="line"> [error]       137401 | static PyObject *__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxPi(struct __pyx_obj_4lxml_5etree_TreeBuilder *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_data) &#123;</span><br><span class="line"> [error]              |                                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_11TreeBuilder_12comment’:</span><br><span class="line"> [error]       src/lxml/etree.c:138472:69: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxComment’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       138472 |   __pyx_t_1 = __pyx_f_4lxml_5etree_11TreeBuilder__handleSaxComment(((struct __pyx_obj_4lxml_5etree__SaxParserTarget *)__pyx_v_self), __pyx_v_comment); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 869, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                                    ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                     |</span><br><span class="line"> [error]              |                                                                     struct __pyx_obj_4lxml_5etree__SaxParserTarget *</span><br><span class="line"> [error]       src/lxml/etree.c:137607:114: note: expected ‘struct __pyx_obj_4lxml_5etree_TreeBuilder *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__SaxParserTarget *’</span><br><span class="line"> [error]       137607 | static PyObject *__pyx_f_4lxml_5etree_11TreeBuilder__handleSaxComment(struct __pyx_obj_4lxml_5etree_TreeBuilder *__pyx_v_self, PyObject *__pyx_v_comment) &#123;</span><br><span class="line"> [error]              |                                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree_12_BaseContext__set_xpath_context’:</span><br><span class="line"> [error]       src/lxml/etree.c:181971:28: error: assignment to ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; from incompatible pointer type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125; [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       181971 |   __pyx_v_xpathCtxt-&gt;error = __pyx_f_4lxml_5etree__receiveXPathError;</span><br><span class="line"> [error]              |                            ^</span><br><span class="line"> [error]       src/lxml/etree.c:7546:13: note: ‘__pyx_f_4lxml_5etree__receiveXPathError’ declared here</span><br><span class="line"> [error]        7546 | static void __pyx_f_4lxml_5etree__receiveXPathError(void *, xmlError *); /*proto*/</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_4XSLT_18__call__’:</span><br><span class="line"> [error]       src/lxml/etree.c:203486:73: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_12_XSLTContext__copy’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       203486 |     __pyx_t_1 = ((PyObject *)__pyx_f_4lxml_5etree_12_XSLTContext__copy(((struct __pyx_obj_4lxml_5etree__BaseContext *)__pyx_v_self-&gt;_context))); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 550, __pyx_L9_error)</span><br><span class="line"> [error]              |                                                                        ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                         |</span><br><span class="line"> [error]              |                                                                         struct __pyx_obj_4lxml_5etree__BaseContext *</span><br><span class="line"> [error]       src/lxml/etree.c:201169:138: note: expected ‘struct __pyx_obj_4lxml_5etree__XSLTContext *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__BaseContext *’</span><br><span class="line"> [error]       201169 | static struct __pyx_obj_4lxml_5etree__BaseContext *__pyx_f_4lxml_5etree_12_XSLTContext__copy(struct __pyx_obj_4lxml_5etree__XSLTContext *__pyx_v_self) &#123;</span><br><span class="line"> [error]              |                                                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree__copyXSLT’:</span><br><span class="line"> [error]       src/lxml/etree.c:205311:71: error: passing argument 1 of ‘__pyx_f_4lxml_5etree_12_XSLTContext__copy’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       205311 |   __pyx_t_1 = ((PyObject *)__pyx_f_4lxml_5etree_12_XSLTContext__copy(((struct __pyx_obj_4lxml_5etree__BaseContext *)__pyx_v_stylesheet-&gt;_context))); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 691, __pyx_L1_error)</span><br><span class="line"> [error]              |                                                                      ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                       |</span><br><span class="line"> [error]              |                                                                       struct __pyx_obj_4lxml_5etree__BaseContext *</span><br><span class="line"> [error]       src/lxml/etree.c:201169:138: note: expected ‘struct __pyx_obj_4lxml_5etree__XSLTContext *’ but argument is of type ‘struct __pyx_obj_4lxml_5etree__BaseContext *’</span><br><span class="line"> [error]       201169 | static struct __pyx_obj_4lxml_5etree__BaseContext *__pyx_f_4lxml_5etree_12_XSLTContext__copy(struct __pyx_obj_4lxml_5etree__XSLTContext *__pyx_v_self) &#123;</span><br><span class="line"> [error]              |                                                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_7RelaxNG_2__init__’:</span><br><span class="line"> [error]       src/lxml/etree.c:219245:60: error: passing argument 2 of ‘xmlRelaxNGSetParserStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       219245 |   xmlRelaxNGSetParserStructuredErrors(__pyx_v_parser_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_self-&gt;__pyx_base._error_log));</span><br><span class="line"> [error]              |                                                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                            |</span><br><span class="line"> [error]              |                                                            void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       In file included from src/lxml/etree.c:905:</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/relaxng.h:154:65: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         154 |                                          xmlStructuredErrorFunc serror,</span><br><span class="line"> [error]             |                                          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_7RelaxNG_6__call__’:</span><br><span class="line"> [error]       src/lxml/etree.c:219663:60: error: passing argument 2 of ‘xmlRelaxNGSetValidStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       219663 |     xmlRelaxNGSetValidStructuredErrors(__pyx_v_valid_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_self-&gt;__pyx_base._error_log));</span><br><span class="line"> [error]              |                                                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                            |</span><br><span class="line"> [error]              |                                                            void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/relaxng.h:189:66: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         189 |                                           xmlStructuredErrorFunc serror, void *ctx);</span><br><span class="line"> [error]             |                                           ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_9XMLSchema_2__init__’:</span><br><span class="line"> [error]       src/lxml/etree.c:220552:59: error: passing argument 2 of ‘xmlSchemaSetParserStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       220552 |   xmlSchemaSetParserStructuredErrors(__pyx_v_parser_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_self-&gt;__pyx_base._error_log));</span><br><span class="line"> [error]              |                                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                           |</span><br><span class="line"> [error]              |                                                           void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       In file included from src/lxml/etree.c:906:</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlschemas.h:151:65: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         151 |                                          xmlStructuredErrorFunc serror,</span><br><span class="line"> [error]             |                                          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_9XMLSchema_6__call__’:</span><br><span class="line"> [error]       src/lxml/etree.c:221095:59: error: passing argument 2 of ‘xmlSchemaSetValidStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       221095 |     xmlSchemaSetValidStructuredErrors(__pyx_v_valid_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_self-&gt;__pyx_base._error_log));</span><br><span class="line"> [error]              |                                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                           |</span><br><span class="line"> [error]              |                                                           void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlschemas.h:184:65: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         184 |                                          xmlStructuredErrorFunc serror,</span><br><span class="line"> [error]             |                                          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_f_4lxml_5etree_30_ParserSchemaValidationContext_connect’:</span><br><span class="line"> [error]       src/lxml/etree.c:221860:66: error: passing argument 2 of ‘xmlSchemaSetValidStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       221860 |     xmlSchemaSetValidStructuredErrors(__pyx_v_self-&gt;_valid_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_error_log));</span><br><span class="line"> [error]              |                                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                                  |</span><br><span class="line"> [error]              |                                                                  void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlschemas.h:184:65: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         184 |                                          xmlStructuredErrorFunc serror,</span><br><span class="line"> [error]             |                                          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pf_4lxml_5etree_10Schematron_6__call__’:</span><br><span class="line"> [error]       src/lxml/etree.c:223037:63: error: passing argument 2 of ‘xmlSchematronSetValidStructuredErrors’ from incompatible pointer type [-Wincompatible-pointer-types]</span><br><span class="line"> [error]       223037 |     xmlSchematronSetValidStructuredErrors(__pyx_v_valid_ctxt, __pyx_f_4lxml_5etree__receiveError, ((void *)__pyx_v_self-&gt;__pyx_base._error_log));</span><br><span class="line"> [error]              |                                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |                                                               |</span><br><span class="line"> [error]              |                                                               void (*)(void *, xmlError *) &#123;aka void (*)(void *, struct _xmlError *)&#125;</span><br><span class="line"> [error]       In file included from src/lxml/etree.c:907:</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/schematron.h:114:66: note: expected ‘xmlStructuredErrorFunc’ &#123;aka ‘void (*)(void *, const struct _xmlError *)’&#125; but argument is of type ‘void (*)(void *, xmlError *)’ &#123;aka ‘void (*)(void *, struct _xmlError *)’&#125;</span><br><span class="line"> [error]         114 |                                           xmlStructuredErrorFunc serror,</span><br><span class="line"> [error]             |                                           ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:49484:13: note: ‘__pyx_f_4lxml_5etree__receiveError’ declared here</span><br><span class="line"> [error]       49484 | static void __pyx_f_4lxml_5etree__receiveError(void *__pyx_v_c_log_handler, xmlError *__pyx_v_error) &#123;</span><br><span class="line"> [error]             |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xmlerror.h:953:16: note: ‘xmlStructuredErrorFunc’ declared here</span><br><span class="line"> [error]         953 | typedef void (*xmlStructuredErrorFunc) (void *userData, const xmlError *error);</span><br><span class="line"> [error]             |                ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__pyx_pymod_exec_etree’:</span><br><span class="line"> [error]       src/lxml/etree.c:6652:38: error: implicit declaration of function ‘_PyDict_SetItem_KnownHash’; did you mean ‘_PyDict_GetItem_KnownHash’? [-Wimplicit-function-declaration]</span><br><span class="line"> [error]        6652 |     (likely(PyDict_CheckExact(ns)) ? _PyDict_SetItem_KnownHash(ns, name, value, ((PyASCIIObject *) name)-&gt;hash) : PyObject_SetItem(ns, name, value))</span><br><span class="line"> [error]             |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:255376:7: note: in expansion of macro ‘__Pyx_SetNameInClass’</span><br><span class="line"> [error]       255376 |   if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_getitem, __pyx_t_9) &lt; 0) __PYX_ERR(0, 97, __pyx_L1_error)</span><br><span class="line"> [error]              |       ^~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyUnicode_Join’:</span><br><span class="line"> [error]       src/lxml/etree.c:264446:13: error: implicit declaration of function ‘_PyUnicode_FastCopyCharacters’; did you mean ‘PyUnicode_CopyCharacters’? [-Wimplicit-function-declaration]</span><br><span class="line"> [error]       264446 |             _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength);</span><br><span class="line"> [error]              |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |             PyUnicode_CopyCharacters</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyIter_Next2’:</span><br><span class="line"> [error]       src/lxml/etree.c:265182:35: error: ‘_PyObject_NextNotImplemented’ undeclared (first use in this function); did you mean ‘PyObject_HashNotImplemented’?</span><br><span class="line"> [error]       265182 |         if (unlikely(iternext == &amp;_PyObject_NextNotImplemented))</span><br><span class="line"> [error]              |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:1096:43: note: in definition of macro ‘unlikely’</span><br><span class="line"> [error]        1096 |   #define unlikely(x) __builtin_expect(!!(x), 0)</span><br><span class="line"> [error]             |                                           ^</span><br><span class="line"> [error]       src/lxml/etree.c:265182:35: note: each undeclared identifier is reported only once for each function it appears in</span><br><span class="line"> [error]       265182 |         if (unlikely(iternext == &amp;_PyObject_NextNotImplemented))</span><br><span class="line"> [error]              |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c:1096:43: note: in definition of macro ‘unlikely’</span><br><span class="line"> [error]        1096 |   #define unlikely(x) __builtin_expect(!!(x), 0)</span><br><span class="line"> [error]             |                                           ^</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyGen_Send’:</span><br><span class="line"> [error]       src/lxml/etree.c:265973:13: error: implicit declaration of function ‘_PyGen_SetStopIterationValue’; did you mean ‘__Pyx_PyGen__FetchStopIterationValue’? [-Wimplicit-function-declaration]</span><br><span class="line"> [error]       265973 |             _PyGen_SetStopIterationValue(result);</span><br><span class="line"> [error]              |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]              |             __Pyx_PyGen__FetchStopIterationValue</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_Coroutine_AwaitableIterError’:</span><br><span class="line"> [error]       src/lxml/etree.c:267806:5: error: implicit declaration of function ‘_PyErr_FormatFromCause’ [-Wimplicit-function-declaration]</span><br><span class="line"> [error]       267806 |     _PyErr_FormatFromCause(</span><br><span class="line"> [error]              |     ^~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_set_iter_next’:</span><br><span class="line"> [error]       src/lxml/etree.c:268071:19: error: implicit declaration of function ‘_PySet_NextEntry’ [-Wimplicit-function-declaration]</span><br><span class="line"> [error]       268071 |         int ret = _PySet_NextEntry(iter_obj, ppos, value, &amp;hash);</span><br><span class="line"> [error]              |                   ^~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_int’:</span><br><span class="line"> [error]       src/lxml/etree.c:269066:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       269066 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       In file included from /usr/include/python3.13/longobject.h:107,</span><br><span class="line"> [error]                        from /usr/include/python3.13/Python.h:82,</span><br><span class="line"> [error]                        from src/lxml/etree.c:96:</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_size_t’:</span><br><span class="line"> [error]       src/lxml/etree.c:269375:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       269375 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_unsigned_int’:</span><br><span class="line"> [error]       src/lxml/etree.c:269571:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       269571 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_signed__char’:</span><br><span class="line"> [error]       src/lxml/etree.c:269767:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       269767 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_unsigned_short’:</span><br><span class="line"> [error]       src/lxml/etree.c:270001:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       270001 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_xmlChar’:</span><br><span class="line"> [error]       src/lxml/etree.c:270235:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       270235 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       src/lxml/etree.c: In function ‘__Pyx_PyInt_As_long’:</span><br><span class="line"> [error]       src/lxml/etree.c:270438:27: error: too few arguments to function ‘_PyLong_AsByteArray’; expected 6, have 5</span><br><span class="line"> [error]       270438 |                 int ret = _PyLong_AsByteArray((PyLongObject *)v,</span><br><span class="line"> [error]              |                           ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       /usr/include/python3.13/cpython/longobject.h:111:17: note: declared here</span><br><span class="line"> [error]         111 | PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,</span><br><span class="line"> [error]             |                 ^~~~~~~~~~~~~~~~~~~</span><br><span class="line"> [error]       Compile failed: command '/usr/bin/gcc' failed with exit code 1</span><br><span class="line"> [error]       creating tmp</span><br><span class="line"> [error]       cc -I/usr/include/libxml2 -I/usr/include/libxml2 -c /tmp/xmlXPathInithkbvx1aj.c -o tmp/xmlXPathInithkbvx1aj.o</span><br><span class="line"> [error]       /tmp/xmlXPathInithkbvx1aj.c: In function ‘main’:</span><br><span class="line"> [error]       /tmp/xmlXPathInithkbvx1aj.c:3:5: warning: ‘xmlXPathInit’ is deprecated: See https://gnome.pages.gitlab.gnome.org/libxml2/html/deprecated.html [-Wdeprecated-declarations]</span><br><span class="line"> [error]           3 |     xmlXPathInit();</span><br><span class="line"> [error]             |     ^~~~~~~~~~~~</span><br><span class="line"> [error]       In file included from /tmp/xmlXPathInithkbvx1aj.c:1:</span><br><span class="line"> [error]       /usr/include/libxml2/libxml/xpath.h:561:21: note: declared here</span><br><span class="line"> [error]         561 |                     xmlXPathInit                (void);</span><br><span class="line"> [error]             |                     ^~~~~~~~~~~~</span><br><span class="line"> [error]       cc tmp/xmlXPathInithkbvx1aj.o -lxml2 -o a.out</span><br><span class="line"> [error]       error: command '/usr/bin/gcc' failed with exit code 1</span><br><span class="line"> [error]       [end of output]</span><br><span class="line"> [error]   </span><br><span class="line"> [error]   note: This error originates from a subprocess, and is likely not a problem with pip.</span><br><span class="line"> [error]   ERROR: Failed building wheel for lxml</span><br><span class="line"> [error] </span><br><span class="line"> [error] [notice] A new release of pip is available: 24.3.1 -&gt; 25.3</span><br><span class="line"> [error] [notice] To update, run: python -m pip install --upgrade pip</span><br><span class="line"> [error] ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (lxml)</span><br><span class="line">  [exit] 1</span><br></pre></td></tr></table></figure><br>解决，通过pcman安装<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S python-lxml</span><br></pre></td></tr></table></figure><br>安装后，最新版本大于我的4.9.7，然后把requirements.txt中lxml的版本修改为&gt;=4.9.7即可</p><p>安装过程种报timeout，添加国内源<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 -m pip install "lxml&gt;=4.9.4" -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120 --retries 10 --no-cache-dir</span><br></pre></td></tr></table></figure></p><p>安装成功</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;OS: Manjaro xfc&lt;br&gt;Python: 3.13.11&lt;br&gt;lxml: 4.9.7&lt;br&gt;通过requirements.txt文件安装报错&lt;br&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gu</summary>
      
    
    
    
    <category term="Python" scheme="https://2tu.github.io/categories/Python/"/>
    
    
    <category term="lxml" scheme="https://2tu.github.io/tags/lxml/"/>
    
  </entry>
  
  <entry>
    <title>Free Markets Are Intrinsic to Humans(自由市场是人类本性)</title>
    <link href="https://2tu.github.io/2025/12/31/Free-Markets-Are-Intrinsic-to-Humans/"/>
    <id>https://2tu.github.io/2025/12/31/Free-Markets-Are-Intrinsic-to-Humans/</id>
    <published>2025-12-31T03:41:10.000Z</published>
    <updated>2026-01-15T12:42:41.706Z</updated>
    
    <content type="html"><![CDATA[<p>我们通过信用与债务体系实现跨基因合作</p><h3 id="自由市场是人类与生俱来的属性"><a href="#自由市场是人类与生俱来的属性" class="headerlink" title="自由市场是人类与生俱来的属性"></a>自由市场是人类与生俱来的属性</h3><p>纳瓦尔：整体而言，资本主义（即自由市场）内在于人类物种。资本主义并非我们的发明，甚至不是我们的发现——它存在于我们每一次的交换行为中。</p><p>当你我交流信息时，我希望从你那里获得信息反馈。我给你信息，你也给我信息。若信息交换不畅，你自然会转向他人。这种交换意识与信用债务的追踪机制，正是我们作为社会化柔性动物与生俱来的本能。</p><p>人类是动物界中唯一能跨基因边界合作的物种。多数动物甚至不存在合作行为，即使存在，也仅限于共同进化、血脉相连的族群内部，因利益共享而协作。</p><p>人类则不同。我可以与你们合作——你们中一位是塞尔维亚裔，另一位是波斯裔，而我是印度裔。我们基本没有血缘联系，却依然能协作。</p><p>是什么让我们实现合作？正是我们记录债务与信用的能力：谁付出了多少劳动？谁贡献了多少价值？这就是自由市场资本主义的全部内涵。</p><p>因此我深信，这是人类物种的内在属性。我们将为所有人创造愈来愈多的财富与丰足。</p><p>人人皆可富足，人人皆可“退休”，人人皆可成功。这仅是教育与意愿的问题——你必须心向往之。若无意于此，选择退出这场游戏也无妨。</p><p>但请不要贬低那些积极参与游戏的人。正是这场游戏让你夜晚安卧温床，头顶有檐遮风挡雨，超市货架充盈，口袋里的iPhone嗡鸣不息。</p><p>对人类而言，这是一场值得以伦理、理性、道德与社会责任感投入的美好游戏。它将继续让我们日益富足，直到为所有渴望者创造巨量财富。</p><h3 id="索取者过多而创造者不足，社会必将走向崩溃"><a href="#索取者过多而创造者不足，社会必将走向崩溃" class="headerlink" title="索取者过多而创造者不足，社会必将走向崩溃"></a>索取者过多而创造者不足，社会必将走向崩溃</h3><p>尼维：不仅有个体暗中鄙视财富，某些国家、团体或政党也公开蔑视财富，至少表面如此。</p><p>纳瓦尔：没错。这些国家、政党与团体最终都陷入了地位的零和游戏。在摧毁财富创造的过程中，他们将所有人拖拽至同一低水平线。</p><p>这正是美国因”美国梦”而深受移民欢迎的原因——任何人都可以来到这里，从贫穷起步，通过辛勤工作赚钱致富，或至少获得基本生活保障。</p><p>显然，财富的定义因人而异。发达国家公民可能认为”必须赚够数百万美元才算圆满”，而对刚入境的第三世界贫困移民而言（我幼时也是来美的贫困移民），财富的标准可能低得多——或许仅仅是”余生不必从事不愿做的体力劳动”。</p><p>但那些蔑视财富创造的团体，终将把整个群体拉低至同一水平。当索取者过多而创造者不足时，社会便会分崩离析，最终沦为委内瑞拉般的共产主义国家——人们忙于索取、分配与再分配，导致民众街头饿殍遍野，每年因饥饿消瘦数公斤。</p><p>不妨将此想象为寄生生物过多的有机体：少量寄生或能维持健康，但我们需要大量共生体（如细胞中线粒体助我们呼吸耗氧），这些共生伙伴是维持生命不可或缺的财富创造者。但若体内充满纯粹寄生的蠕虫、病毒或细菌，机体必将死亡。任何有机体只能承受少量寄生，当寄生要素失控，毁灭便接踵而至。</p><p>再次强调，我探讨的是符合道德的财富创造——而非垄断、裙带资本主义或环境代价误判等行为。我指的是自由意志与自由市场，是人类间自愿进行、不对他人产生过度影响的小规模交换。</p><p>我认为，若社会或群体不尊重这种财富创造模式，终将陷入毁灭与黑暗的深渊</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我们通过信用与债务体系实现跨基因合作&lt;/p&gt;
&lt;h3 id=&quot;自由市场是人类与生俱来的属性&quot;&gt;&lt;a href=&quot;#自由市场是人类与生俱来的属性&quot; class=&quot;headerlink&quot; title=&quot;自由市场是人类与生俱来的属性&quot;&gt;&lt;/a&gt;自由市场是人类与生俱来的属性&lt;/h3</summary>
      
    
    
    
    <category term="Rich" scheme="https://2tu.github.io/categories/Rich/"/>
    
    
    <category term="How to Get Rich" scheme="https://2tu.github.io/tags/How-to-Get-Rich/"/>
    
    <category term="Naval" scheme="https://2tu.github.io/tags/Naval/"/>
    
  </entry>
  
  <entry>
    <title>install-BCM4331-driver-on-manjaro</title>
    <link href="https://2tu.github.io/2025/12/31/install-BCM4331-driver-on-manjaro/"/>
    <id>https://2tu.github.io/2025/12/31/install-BCM4331-driver-on-manjaro/</id>
    <published>2025-12-31T00:59:56.000Z</published>
    <updated>2026-01-15T12:42:41.741Z</updated>
    
    <content type="html"><![CDATA[<h3 id="现象"><a href="#现象" class="headerlink" title="现象"></a>现象</h3><p>2012款MacBook Pro安装Manjaro xfce后使用无线网卡无法上网</p><h3 id="查看网卡型号"><a href="#查看网卡型号" class="headerlink" title="查看网卡型号"></a>查看网卡型号</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">lspci -nnk | grep -iA3 'network'</span><br><span class="line">02:00.0 Network controller [0280]: Broadcom Inc. and subsidiaries BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)</span><br><span class="line">Subsystem: Apple Inc. AirPort Extreme [106b:00f5]</span><br><span class="line">Kernel driver in use: bcma-pci-bridge</span><br><span class="line">Kernel modules: bcma</span><br></pre></td></tr></table></figure><h3 id="安装网卡驱动"><a href="#安装网卡驱动" class="headerlink" title="安装网卡驱动"></a>安装网卡驱动</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yay -S noconfirm b43-firmware</span><br></pre></td></tr></table></figure><h3 id="重启"><a href="#重启" class="headerlink" title="重启"></a>重启</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo reboot</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;现象&quot;&gt;&lt;a href=&quot;#现象&quot; class=&quot;headerlink&quot; title=&quot;现象&quot;&gt;&lt;/a&gt;现象&lt;/h3&gt;&lt;p&gt;2012款MacBook Pro安装Manjaro xfce后使用无线网卡无法上网&lt;/p&gt;
&lt;h3 id=&quot;查看网卡型号&quot;&gt;&lt;a href=</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="manjaro" scheme="https://2tu.github.io/tags/manjaro/"/>
    
    <category term="BCM4331" scheme="https://2tu.github.io/tags/BCM4331/"/>
    
    <category term="Mac" scheme="https://2tu.github.io/tags/Mac/"/>
    
  </entry>
  
  <entry>
    <title>Make Abundance for the World(为世界创造富足)</title>
    <link href="https://2tu.github.io/2025/12/30/Make-Abundance-for-the-World/"/>
    <id>https://2tu.github.io/2025/12/30/Make-Abundance-for-the-World/</id>
    <published>2025-12-30T12:38:52.000Z</published>
    <updated>2026-01-15T12:42:41.709Z</updated>
    
    <content type="html"><![CDATA[<p>创造财富并非从他人处掠夺资源</p><h3 id="符合道德规范的财富创造能为世界带来富足"><a href="#符合道德规范的财富创造能为世界带来富足" class="headerlink" title="符合道德规范的财富创造能为世界带来富足"></a>符合道德规范的财富创造能为世界带来富足</h3><p>纳瓦尔：有一种观念，认为赚钱是邪恶的。这种观念根植于”金钱是万恶之源”的说法。人们认为银行家窃取我们的钱财。这在某种程度上是事实——世界上很多地方确实持续存在大量掠夺行为。</p><p>从某种意义上看，世界历史就是创造者与索取者之间的掠食关系史。有些人外出创造、建设、为此辛勤付出；</p><p>而另一些人则带着刀剑枪支、苛捐杂税、裙带资本主义或共产主义等各类手段进行掠夺。</p><p>即使在自然界，寄生生物的数量也远超过非寄生生物。你体内就存在大量以你为生的寄生体，其中较优者是互利共生——它们会给予回报，但多数只是索取。这正是任何复杂系统构建的天然模式。</p><p>我所关注的是真正的财富创造。这无关攫取金钱，也非从他人处掠夺资源，而是创造富足。</p><p>显然，工作岗位数量并非固定不变，财富总量也非恒定值。若非如此，我们现在仍会围坐在洞穴里，盘算如何分配柴火和偶尔猎获的死鹿。</p><p>事实上，人类文明中的绝大多数财富——甚至全部财富——都是被创造出来的。它们源于人类的智慧、技术的革新、生产力的提升以及辛勤的劳动。那种将财富视为掠夺产物的观念，正是那些追求地位者所鼓吹的可怕零和游戏。</p><h3 id="人人皆可富足"><a href="#人人皆可富足" class="headerlink" title="人人皆可富足"></a>人人皆可富足</h3><p>但现实是每个人都能获得富足。我们观察发达国家现状即可印证：如今每个人的生活水准，几乎都超越了200年前的最高水平。</p><p>200年前，没有人拥有抗生素、汽车、电力或iPhone。所有这些发明都使我们这个物种变得更加富足。如今我宁愿成为发达国家的穷人，也不愿做路易十四时代法国的富人；我宁愿成为今日的普通人，也不愿成为昔日的贵族——这正是财富创造带来的转变。</p><p>技术的引擎是科学，而科学的应用旨在创造富足。因此我认为从根本上说，每个人都能获得富足。</p><p>请思考这个思想实验：假设每个人都具备优秀软硬件工程师的知识储备，能够建造机器人、计算机、桥梁并进行编程。如果全人类都掌握这些技能，你认为20年后社会将呈现出什么面貌？</p><p>我的推测是：我们将建造能够完成所有工作的机器人、机器、软件和硬件系统。人类将生活在大规模富足之中。从基本需求层面看，我们实质上都将进入”退休”状态——没有人需要为生存必需品工作。我们将拥有机器人护士、自动化医院、自动驾驶汽车、全自动化农场和清洁能源。</p><p>届时，我们将通过技术突破获得所需的一切。若仍有人选择工作，那将是他们表达创造力的方式——工作源于内心的贡献渴望，源于建设与设计的本能驱动。</p><h3 id="资本主义并非罪恶"><a href="#资本主义并非罪恶" class="headerlink" title="资本主义并非罪恶"></a>资本主义并非罪恶</h3><p>我不认为资本主义是邪恶的。资本主义本质是好的，只是常被劫持：被外部性定价不当，腐败垄断所劫持</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;创造财富并非从他人处掠夺资源&lt;/p&gt;
&lt;h3 id=&quot;符合道德规范的财富创造能为世界带来富足&quot;&gt;&lt;a href=&quot;#符合道德规范的财富创造能为世界带来富足&quot; class=&quot;headerlink&quot; title=&quot;符合道德规范的财富创造能为世界带来富足&quot;&gt;&lt;/a&gt;符合道德规范的</summary>
      
    
    
    
    <category term="Rich" scheme="https://2tu.github.io/categories/Rich/"/>
    
    
    <category term="How to Get Rich" scheme="https://2tu.github.io/tags/How-to-Get-Rich/"/>
    
    <category term="Naval" scheme="https://2tu.github.io/tags/Naval/"/>
    
  </entry>
  
  <entry>
    <title>在manjaro下使用Chrome科学上网</title>
    <link href="https://2tu.github.io/2025/12/27/access-google-on-manjaro-chrome/"/>
    <id>https://2tu.github.io/2025/12/27/access-google-on-manjaro-chrome/</id>
    <published>2025-12-27T13:23:04.000Z</published>
    <updated>2026-01-15T12:42:41.712Z</updated>
    
    <content type="html"><![CDATA[<p>安装完Manjaro之后迫不及待安装上clash-verge、Chrome，然后发现自带的Firefox可以科学上网，Chrome访问不上<br>原因是这个版本的Chrome中不支持代理设置，需要手动设置<br>将Clash Verge的代理端口设置给Chrome就可以了<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd ~/.config</span><br><span class="line">vi chrome-configs.flag # 插入内容</span><br><span class="line">-proxy-server=127.0.0.1:port # 替换成你clash代理的端口，保存 重启chrome就可以了</span><br></pre></td></tr></table></figure><br>以上方法亲测可用，还有同学说可以如下设置的，没有尝试<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/google/chrome/chrome --proxy-server="[http://127.0.0.1:7890](http://127.0.0.1:7890/)"</span><br></pre></td></tr></table></figure></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;安装完Manjaro之后迫不及待安装上clash-verge、Chrome，然后发现自带的Firefox可以科学上网，Chrome访问不上&lt;br&gt;原因是这个版本的Chrome中不支持代理设置，需要手动设置&lt;br&gt;将Clash Verge的代理端口设置给Chrome就可以了&lt;</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="Manjaro" scheme="https://2tu.github.io/tags/Manjaro/"/>
    
  </entry>
  
  <entry>
    <title>Seek-Wealth-Not-Money-or-Status（去寻找财富，而非金钱和地位）</title>
    <link href="https://2tu.github.io/2025/06/26/Seek-Wealth-Not-Money-or-Status/"/>
    <id>https://2tu.github.io/2025/06/26/Seek-Wealth-Not-Money-or-Status/</id>
    <published>2025-06-26T21:04:17.000Z</published>
    <updated>2026-01-15T12:42:41.709Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Seek-Wealth-Not-Money-or-Status"><a href="#Seek-Wealth-Not-Money-or-Status" class="headerlink" title="Seek Wealth, Not Money or Status"></a>Seek Wealth, Not Money or Status</h2><p>去寻找财富，而非金钱和地位<br>Wealth is assets that earn while you sleep<br>财富是资产，资产在你你睡觉时也能一直为你赚钱</p><h3 id="Naval-is-a-prolific-tech-investor-and-founder-of-AngelList"><a href="#Naval-is-a-prolific-tech-investor-and-founder-of-AngelList" class="headerlink" title="Naval is a prolific tech investor and founder of AngelList"></a>Naval is a prolific tech investor and founder of AngelList</h3><p>财富是资产，资产在你你睡觉时也能一直为你赚钱</p><p><strong>Nivi:</strong> You probably know Naval from his <a href="https://twitter.com/naval" target="_blank" rel="noopener">Twitter</a> account.<br><strong>Nivi:</strong> 你可能通过Naval的<a href="https://twitter.com/naval" target="_blank" rel="noopener">Twitter</a>账号认识他。  </p><p>We’re going to talk about his tweetstorm, “<a href="https://twitter.com/naval/status/1002103360646823936" target="_blank" rel="noopener">How To Get Rich (without getting lucky)</a>.” We’ll go through most of the tweets in detail, give Naval a chance to expand on them and generally riff on the topic. He’ll probably throw in ideas he hasn’t published before.<br>我们将会讨论他的推文“<a href="https://twitter.com/naval/status/1002103360646823936" target="_blank" rel="noopener">How To Get Rich (without getting lucky)</a>”如何致富（不靠运气）。我们将通过详细讨论大部分推文，让Naval有机会进一步阐述概括这个主题。他也有可能抛出新的想法。</p><p>Naval’s the co-founder of <a href="http://angel.co/" target="_blank" rel="noopener">AngelList</a> and Epinions. He’s also a prolific tech investor in companies like Twitter, Uber and many more.<br>Naval是<a href="http://angel.co/" target="_blank" rel="noopener">AngelList</a>和Epinions的联合创始人。他是一名丰富的科技投资人，投资过Twitter、Uber等公司。</p><p><a href="http://twitter.com/nivi" target="_blank" rel="noopener">I’m</a> the co-founder of AngelList with Naval. And I co-authored the <a href="http://venturehacks.com/" target="_blank" rel="noopener">Venture Hacks</a> blog with him back in the day.<br><a href="http://twitter.com/nivi" target="_blank" rel="noopener">我</a>和Naval共同创立了AngelList。也曾经一起撰写过<a href="http://venturehacks.com/" target="_blank" rel="noopener">Venture Hacks</a>博客。</p><p><strong>Naval:</strong> The “How to Get Rich” tweetstorm definitely hit a nerve and went viral. A lot of people say it was helpful and reached across aisles.<br>Naval:“How to Get Rich”（如何致富）这篇推文显然戳中了很多人的痛点，并迅速走红。很多人说它非常有帮助，而且打破了圈层，引发了不同群体的共鸣。</p><p>People outside of the tech industry—people in all walks of life—want to know how to solve their money problems. Everyone vaguely knows they want to be wealthy, but they don’t have a good set of principles to do it by.<br>不只是科技圈的人，几乎各行各业的人都想知道怎么解决财务上的困扰。大家都知道自己想变有钱，但很多人其实并没有一套靠谱的方法或原则去实现它。</p><h3 id="Wealth-is-assets-that-earn-while-you-sleep"><a href="#Wealth-is-assets-that-earn-while-you-sleep" class="headerlink" title="Wealth is assets that earn while you sleep"></a>Wealth is assets that earn while you sleep</h3><p>财富是资产，资产在你睡觉时也能一直为你赚钱</p><p><strong>Nivi:</strong> What’s the difference between wealth, money and status?<br><strong>Nivi:</strong> 财富、金钱、地位有什么不同？</p><p><strong>Naval:</strong> Wealth is the thing you want. Wealth is assets that earn while you sleep; it’s the factory of robots cranking out things. Wealth is the computer program running at night that’s serving other customers. Wealth is money in the bank that is reinvested into other assets and businesses.<br><strong>Naval:</strong> 财富是你想要的。财富是资产，资产在你睡觉时也能一直为你赚钱；它可以是工厂里的机器人为你生产东西。也可以是晚上也能一直服务客户的电脑程序。财富是银行里的钱，可以再投资到其他资产或生意当中。</p><p>A house can be a form of wealth, because you can rent it out; although that’s a less productive use of land than running a commercial enterprise.<br>房子也可以是一种财富，因为你可以将它出租出去。尽管这与经营企业比，是一种生产力较低的一种利用土地的方式。</p><p>My definition of wealth is oriented toward businesses and assets that can earn while you sleep.<br>我对财富的定义是在你睡觉时能为你赚钱的企业和资产。</p><h3 id="Wealth-buys-your-freedom"><a href="#Wealth-buys-your-freedom" class="headerlink" title="Wealth buys your freedom"></a>Wealth buys your freedom</h3><p>财富买来的是自由</p><p>You want wealth because it buys you freedom—so you don’t have to wear a tie like a collar around your neck; so you don’t have to wake up at 7:00 a.m. to rush to work and sit in commute traffic; so you don’t have to waste your life grinding productive hours away into a soulless job that doesn’t fulfill you.<br>你想要财富，是因为财富能为你买来自由——让你不必每天戴着像狗链一样的领带，不必早上七点起床赶去上班、堵在通勤的车流中，不必把自己最有生产力的人生时光，浪费在一份毫无灵魂、不带来任何满足感的工作上。</p><p>The purpose of wealth is freedom; it’s nothing more than that. It’s not to buy fur coats, or to drive Ferraris, or to sail yachts, or to jet around the world in a Gulf Stream. That stuff gets really boring and stupid, really fast. It’s about being your own sovereign individual.<br>财富的真正目的就是自由，仅此而已。它不是为了买貂皮大衣、法拉利、游艇，也不是为了坐湾流私人飞机环球旅行。那些东西很快就会变得无聊甚至愚蠢。真正重要的是：成为一个完全自主、独立的人。</p><p>You’re not going to get that unless you really want it. The entire world wants it, and the entire world is working hard at it.<br>但你必须真正渴望这种自由，你才可能得到它。全世界的人都想要这种自由，也都在努力争取。</p><p>It is competitive to some extent. It’s a positive sum game—but there are competitive elements to it, because there’s a finite amount of resources right now in society. To get the resources to do what you want, you have to stand out.<br>在某种程度上，这是一场竞争。虽然它是一个正和游戏，但仍然有竞争的部分，因为当前社会的资源是有限的。如果你想获得资源、去实现你想做的事，你就必须脱颖而出。</p><h3 id="Money-is-how-we-transfer-wealth"><a href="#Money-is-how-we-transfer-wealth" class="headerlink" title="Money is how we transfer wealth"></a>Money is how we transfer wealth</h3><p>金钱是如何交换财富的具现</p><p>Money is how we transfer wealth. Money is social credits; it’s the ability to have credits and debits of other people’s time.<br>金钱是社会信用。它代表你拥有他人时间借贷的能力。</p><p>If I do my job right and create value for society, society says, “Oh, thank you. We owe you something in the future for the work that you did. Here’s a little IOU. Let’s call that money.”<br>如果我做好了我的工作并对社会产生了价值，社会会说，“谢谢你！我们欠你一点什么，以后会补偿你过去做的这些事。给你一张欠条，我们把它叫做‘钱’。”</p><p>That money gets debased because people steal the IOUs; the government prints extra IOUs; and people renege on their IOUs. But money tries to be a reliable IOU from society that you are owed something for something you did in the past.<br>这种钱会被稀释，因为有人偷走了这些欠条；政府印了更多的欠条；也有人赖账不还。但钱本质上是在努力成为一个可靠的社会欠条，是社会对你过去行为的回报。</p><p>We transfer these IOUs around; money is how we transfer wealth.<br>我们在人与人之间交换这些欠条；金钱就是我们如何交换财富的具现。</p><h3 id="Status-is-your-rank-in-the-social-hierarchy"><a href="#Status-is-your-rank-in-the-social-hierarchy" class="headerlink" title="Status is your rank in the social hierarchy"></a>Status is your rank in the social hierarchy</h3><p>地位是你在社会体系中的排名</p><p>There are fundamentally two huge games in life that people play. One is the money game. Money is not going to solve all of your problems; but it’s going to solve all of your money problems. I think people know that. They realize that, so they want to make money.<br>从根本上说，人们在生活中玩着两种巨大的游戏。一个是金钱游戏。金钱并不能解决你所有的问题；但它却能解决你所有需要钱的问题。我认为人们知道这一点。他们意识到了这一点，所以他们想赚钱。</p><p>At the same time, deep down many people believe they can’t make it; so they don’t want any wealth creation to happen. They virtue signal by attacking the whole enterprise, saying, “Well, making money is evil. You shouldn’t do it.”<br>与此同时，许多人内心深处认为自己赚不到钱，所以他们不希望财富创造发生。他们通过攻击整个行业来发出道德信号，说：”赚钱是邪恶的。你不应该这么做”。</p><p>But they’re actually playing the other game, which is the status game. They’re trying to be high status in the eyes of others by saying, “Well, I don’t need money. We don’t want money.”<br>但实际上，他们在玩另一种游戏，即地位游戏。他们试图通过说 “我不需要钱” ，“我也不想要赚钱 ”来提高自己在别人心目中的地位。</p><p>Status is your ranking in the social hierarchy.<br>地位是你在社会体系中的排名。</p><p>Wealth is not a zero-sum game. Everybody in the world can have a house. Because you have a house doesn’t take away from my ability to have a house. If anything, the more houses that are built, the easier it becomes to build houses, the more we know about building houses, and the more people can have houses.<br>财富不是零和游戏。世界上每个人都可以有房子。你有房子并不会剥夺我有房子的能力。相反，房子建得越多，建房就越容易，我们对建房的了解就越多，就有越多的人可以拥有房子。</p><p>Wealth is a very positive-sum game. We create things together. We’re starting this endeavor to create a piece of art that explains what we’re doing. At the end of it, something brand new will be created. It’s a positive-sum game.<br>财富是一个正和的游戏。我们共同创造财富。我们正在努力创造一件艺术品，来解释我们正在做的事情。最后，我们会创造出全新的东西。这是一个正和游戏。</p><h3 id="Status-is-a-very-old-game"><a href="#Status-is-a-very-old-game" class="headerlink" title="Status is a very old game"></a>Status is a very old game</h3><p>地位是一个非常古老的游戏</p><p>Status, on the other hand, is a zero-sum game. It’s a very old game. We’ve been playing it since monkey tribes. It’s hierarchical. Who’s number one? Who’s number two? Who’s number three? And for number three to move to number two, number two has to move out of that slot. So, status is a zero-sum game.<br>另一方面，地位是一种零和游戏。这是一种非常古老的游戏。从猴群时代开始，我们就一直在玩。它是等级制的：谁是第一？谁是第二？谁是第三？而要从第三升到第二，第二就必须让出那个位置。所以，地位是一种零和游戏。</p><p>Politics is an example of a status game. Even sports is an example of a status game. To be the winner, there must be a loser. Fundamentally, I don’t like status games. They play an important role in our society, so we can figure out who’s in charge. But you play them because they’re a necessary evil.<br>政治就是一种地位游戏的例子。甚至体育比赛也是一种地位游戏。要有赢家，就必须有输家。我本质上不喜欢这种地位游戏。它们在社会中确实扮演着重要角色——帮助我们弄清谁是领导者。但你之所以参与，是因为它们是一种“必要的恶”。</p><p>On an evolutionary basis—if you go back thousands of years—status is a much better predictor of survival than wealth. You couldn’t have wealth before the farming age because you couldn’t store things. Hunter-gatherers carried everything on their backs.<br>从进化的角度来看——如果你回顾几千年前——地位比财富更能预测一个人的生存能力。在农业出现之前，人们是无法拥有财富的，因为他们无法储存东西。狩猎采集者把一切都背在身上生活。</p><p>Hunter-gatherers lived in entirely status-based societies. Farmers started going to wealth-based societies. The modern industrial economies are much more heavily wealth-based societies.<br>狩猎采集者生活在完全基于地位的社会中。而农耕者开始向基于财富的社会转变。现代工业经济体则更多是基于财富的社会。</p><h3 id="People-creating-wealth-will-always-be-attacked-by-people-playing-status-games"><a href="#People-creating-wealth-will-always-be-attacked-by-people-playing-status-games" class="headerlink" title="People creating wealth will always be attacked by people playing status games"></a>People creating wealth will always be attacked by people playing status games</h3><p>创造财富的人，总会受到玩地位游戏的人的攻击</p><p>There’s always a subtle competition going on between status and wealth. For example, when journalists attack rich people or the tech industry, they’re really bidding for status. They’re saying, “No, the people are more important. And I, the journalist, represent the people, and therefore I am more important.”<br>地位和财富之间，总存在着一种微妙的竞争。比如，当记者抨击富人或科技行业时，其实是在争夺地位。他们是在表达：“人民才是最重要的，而我，作为记者，是人民的代表，所以我更重要。”</p><p>The problem is, to win at a status game you have to put somebody else down. That’s why you should avoid status games in your life—because they make you into an angry combative person. You’re always fighting to put other people down and elevate yourself and the people you like.<br>问题在于：想要在地位游戏中获胜，就必须贬低别人。这也是为什么你应该避免参与地位游戏——因为它会让你变得愤怒、好斗。你会不停地打压他人、抬高自己或你所支持的人。</p><p>Status games are always going to exist; there’s no way around it. Realize that most of the time when you’re trying to create wealth, you’re getting attacked by someone else and they’re trying to look like a goody-two shoes. They’re trying to up their own status at your expense.<br>地位游戏永远都会存在，这是无法避免的。你需要明白，大多数时候，当你试图创造财富时，攻击你的人，其实是在假装正义。他们想让自己看起来像是“正人君子”，但本质上是在踩着你来提高自己的地位。</p><p>They’re playing a different game. And it’s a worse game. It’s a zero-sum game, instead of a positive-sum game.<br>他们玩的是另一种游戏——一种更糟糕的游戏。地位游戏是零和游戏，而财富游戏则是正和游戏。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;Seek-Wealth-Not-Money-or-Status&quot;&gt;&lt;a href=&quot;#Seek-Wealth-Not-Money-or-Status&quot; class=&quot;headerlink&quot; title=&quot;Seek Wealth, Not Money or Stat</summary>
      
    
    
    
    <category term="Rich" scheme="https://2tu.github.io/categories/Rich/"/>
    
    
    <category term="How to Get Rich" scheme="https://2tu.github.io/tags/How-to-Get-Rich/"/>
    
    <category term="Naval" scheme="https://2tu.github.io/tags/Naval/"/>
    
  </entry>
  
  <entry>
    <title>如何排查解决Communications link failure</title>
    <link href="https://2tu.github.io/2025/02/14/how-to-resolve-communications-link-failure/"/>
    <id>https://2tu.github.io/2025/02/14/how-to-resolve-communications-link-failure/</id>
    <published>2025-02-14T08:43:11.000Z</published>
    <updated>2026-01-15T12:42:41.739Z</updated>
    
    <content type="html"><![CDATA[<ul><li>项目启动运行几小时后数据库连接异常，重启正常使用</li><li>偶发数据库连接异常，重启正常使用</li><li>偶发事物数据丢失</li></ul><p>怎么办，网上搜索，druid issue搜索，一会儿让改一下这个参数，一会儿改一下那个参数。各种改了重启，观察。然后报错依然复现存在。没想到我们也有资格成为调参工程师。</p><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><ul><li>MySQL：8.0.32</li><li>Druid: 1.1.24</li><li>Driver：mysql-connector 8.0.27</li></ul><h3 id="错误异常"><a href="#错误异常" class="headerlink" title="错误异常"></a>错误异常</h3><p>通常错误有以下几种<br><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">Caused by: java.net.SocketException: Connection reset</span><br><span class="line"></span><br><span class="line">Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure</span><br><span class="line">The last packet successfully received <span class="keyword">from</span> the server was <span class="number">1</span>,<span class="number">254</span>,<span class="number">739</span> milliseconds ago. The last packet sent successfully to the server was <span class="number">1</span>,<span class="number">254</span>,<span class="number">740</span> millisecond ago.s ago.</span><br><span class="line"></span><br><span class="line">Caused by: java.sql.SQLException: connection disabled</span><br><span class="line">at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:<span class="number">1169</span>)</span><br><span class="line"></span><br><span class="line">org.springframework.jdbc.UncategorizedSQLException:</span><br><span class="line">### Error querying database. Cause: java.sql.SQLException: connection disabled</span><br><span class="line"></span><br><span class="line">Cause: java.sql.SQLException: connection disabled</span><br><span class="line">; uncategorized SQLException <span class="keyword">for</span> SQL []; SQL state [<span class="literal">null</span>]; error code [<span class="number">0</span>]; connection disabled; nested exception <span class="keyword">is</span> java.sql.SQLException: connection disabled</span><br><span class="line"></span><br><span class="line"><span class="number">2025</span><span class="number">-02</span><span class="number">-11</span> <span class="number">04</span>:<span class="number">46</span>:<span class="number">31.300</span> ERROR <span class="number">1</span> --- [http-nio<span class="number">-8080</span>-exec<span class="number">-7</span>] [c.a.druid.pool.DruidPooledStatement :<span class="number">368</span>] : CommunicationsException, druid version <span class="number">1.1</span><span class="number">.24</span>, jdbcUrl : jdbc:mysql:<span class="comment">//host:3306/db?useUnicode=true&amp;characterEncoding=UTF8&amp;zroDateTimeBehavior=convertToNull&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;maxReconnects=10&amp;useSSL=false&amp;connectTimeout=10000&amp;socketTimeout=120000, testWhileIle true, idle millis 6403958, minIdle 5, poolingCount 2, timeBetweenEvictionRunsMillis 60000, lastValidIdleMillis 6403958, driver com.mysql.cj.jdbc.Driver, exeptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter</span></span><br><span class="line"><span class="number">2025</span><span class="number">-02</span><span class="number">-11</span> <span class="number">04</span>:<span class="number">46</span>:<span class="number">31.302</span> ERROR <span class="number">1</span> --- [http-nio<span class="number">-8080</span>-exec<span class="number">-7</span>] [com.alibaba.druid.util.JdbcUtils :<span class="number">96</span>] : close connection error</span><br><span class="line"></span><br><span class="line">java.sql.SQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.</span><br></pre></td></tr></table></figure></p><h3 id="排查步骤"><a href="#排查步骤" class="headerlink" title="排查步骤"></a>排查步骤</h3><p>以上所有的错误都是指向连接异常。需要我们抽丝剥茧。杀人是个罪恶的行径，查出真相是我的责任。</p><ul><li><p>网络问题<br>作为程序员首先想到的不是程序有问题出，而是环境有问题。是否有防火墙杀死应用到数据库的连接</p></li><li><p>数据库超时时间设置问题<br>查看数据库设置超时时间是否和druid配置不匹配<br>查看数据库设置</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> <span class="keyword">variables</span> <span class="keyword">like</span> <span class="string">'%timeout%'</span>;</span><br></pre></td></tr></table></figure></li></ul><p><img src="/2025/02/14/how-to-resolve-communications-link-failure/mysql_timeout.jpeg" alt="MySQL timeout"><br>其中wait_timeout和interactive_timeout是设置MySQL在连接不操作多少秒后断开连接。<br>如：客户端连接到MySQL超过8小时没有任何操作，则MySQL将主动断开连接。其中wait_timeout为非交互的连接，我们应用程序连接使用的就是这个。<br>如果wait_timeout过小和druid配置连接检查间隔时间不合理，则有可能出现d以为该连接没关闭，但是MySQL已经主动关闭连接，导致连接异常的问题。但是这种情况较少，因为我们校验连接通常都是多少秒校验一次。<br>另外MySQL参数中也有事务时间，应用程序有长事务，导致超过MySQL设置事务时间，会导致事务不成功  </p><p>另外我们可以通过查询MySQL的连接来等待判断时间<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> * <span class="keyword">from</span> information_schema.processlist <span class="keyword">where</span> db = <span class="string">'mydb'</span></span><br></pre></td></tr></table></figure><br><img src="/2025/02/14/how-to-resolve-communications-link-failure/mysql_processlist.jpeg" alt="MySQL processlist"></p><ul><li>druid配置不合理<br>外部原因排查完后，就只剩下排查自己问题了。不对，也可以是druid提示不明显。<br>我们通常将连接池托管给三方库，我们只需要按其提供建议配置就好。druid就是其中一种。各版本配置有些许变化，<figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">shardingsphere:</span></span><br><span class="line"><span class="attr">props:</span></span><br><span class="line"><span class="attr">sql-show:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">query-with-cipher-column:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">datasource:</span></span><br><span class="line"><span class="attr">names:</span> <span class="string">salve,master</span></span><br><span class="line"><span class="attr">master:</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">com.alibaba.druid.pool.DruidDataSource</span></span><br><span class="line"><span class="attr">driverClassName:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line"><span class="attr">url:</span> <span class="string">jdbc:mysql://$&#123;db.host&#125;:$&#123;db.port&#125;/$&#123;db.database&#125;?useUnicode=true&amp;characterEncoding=UTF8&amp;zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;maxReconnects=10&amp;useSSL=false&amp;connectTimeout=10000&amp;socketTimeout=60000</span></span><br><span class="line"><span class="attr">username:</span> <span class="string">$&#123;db.username&#125;</span></span><br><span class="line"><span class="attr">password:</span> <span class="string">$&#123;db.password&#125;</span></span><br><span class="line"><span class="attr">maxActive:</span> <span class="string">$&#123;db.maxActive:100&#125;</span></span><br><span class="line"><span class="attr">minIdle:</span> <span class="string">$&#123;db.minIdle:5&#125;</span></span><br><span class="line"><span class="attr">initialSize:</span> <span class="string">$&#123;db.minIdle:5&#125;</span></span><br><span class="line"><span class="attr">minEvictableIdleTimeMillis:</span> <span class="string">$&#123;db.minEvictableIdleTimeMillis:180000&#125;</span></span><br><span class="line"><span class="attr">maxEvictableIdleTimeMillis:</span> <span class="string">$&#123;db.maxEvictableIdleTimeMillis:300000&#125;</span></span><br><span class="line"><span class="attr">maxWait:</span> <span class="string">$&#123;db.maxWait:10000&#125;</span></span><br><span class="line"><span class="attr">maxWaitThreadCount:</span> <span class="string">$&#123;db.maxWaitThreadCount:1000&#125;</span></span><br><span class="line"><span class="attr">testOnBorrow:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">testOnReturn:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">testWhileIdle:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">keepAlive:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">timeBetweenEvictionRunsMillis:</span> <span class="number">20000</span></span><br><span class="line"><span class="attr">validationQueryTimeout:</span> <span class="number">10</span></span><br><span class="line"><span class="attr">validationQuery:</span> <span class="string">SELECT</span> <span class="number">1</span></span><br><span class="line"><span class="comment">## TRANSACTION_READ_COMMITTED</span></span><br><span class="line"><span class="attr">default-transaction-isolation:</span> <span class="number">2</span></span><br></pre></td></tr></table></figure></li></ul><p>加入配置druid.mysql.usePingMethod=false<br>在检查有效连接的时候才不会使用ping而使用validationQuery sql来检查<br>另外可以查看<a href="https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8" target="_blank" rel="noopener">DruidDataSource配置属性列表</a></p><ul><li>事务未正确关闭<br>在排除了非程序问题，非配置问题后，还没有找到原因。就要想是不是druid的源码问题，还是MySQL源码问题。或者可能是自己程序哪里有问题。在看了一阵druid的源码和issue后发现有跟程序未正确结束事务（commit or rollback），会导致这个事务持有数据库连接无法正常归还到连接池，从而导致连接池中可用连接变少。<br>我的问题就是这个，修改后，解决了这个连接异常问题<br><a href="https://github.com/alibaba/druid/issues/5889" target="_blank" rel="noopener">issue</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;项目启动运行几小时后数据库连接异常，重启正常使用&lt;/li&gt;
&lt;li&gt;偶发数据库连接异常，重启正常使用&lt;/li&gt;
&lt;li&gt;偶发事物数据丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;怎么办，网上搜索，druid issue搜索，一会儿让改一下这个参数，一会儿改一下那个参数。各种</summary>
      
    
    
    
    <category term="Data" scheme="https://2tu.github.io/categories/Data/"/>
    
    
    <category term="MySQL" scheme="https://2tu.github.io/tags/MySQL/"/>
    
    <category term="druid" scheme="https://2tu.github.io/tags/druid/"/>
    
    <category term="CJCommunicationsException" scheme="https://2tu.github.io/tags/CJCommunicationsException/"/>
    
  </entry>
  
  <entry>
    <title>MySQL MGR是什么？</title>
    <link href="https://2tu.github.io/2024/05/29/what-is-group-replication-in-mysql/"/>
    <id>https://2tu.github.io/2024/05/29/what-is-group-replication-in-mysql/</id>
    <published>2024-05-29T12:57:05.000Z</published>
    <updated>2026-01-15T12:42:41.753Z</updated>
    
    <content type="html"><![CDATA[<h4 id="术语"><a href="#术语" class="headerlink" title="术语"></a>术语</h4><ul><li>MGR：MySQL Group Replication，即MySQL组复制</li><li>RPO：Recovery Point Objective恢复点目标</li><li>RTO：Recovery Time Objective恢复时间目标</li></ul><h4 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h4><p>公司核心应用A为公司核心应用，对数据库RPO、RTO都有较高要求。一次数据库主库磁盘expender背板坏了，影响磁盘IO通道，数据库层面出现大面积超时和错误。由于机器未完全坏掉，数据库可以连接，SQL可以执行，导致主从未能自动切换，手动切换时准备脚本，校验数据同步等问题耗时过长，导致公司业务出现重大损失。(原有方案为MHA高可用，半同步复制)<br>由此改为MGR集群技术方案，以期降低主从切换时效，降低损失。</p><h4 id="MGR"><a href="#MGR" class="headerlink" title="MGR"></a>MGR</h4><p>MGR高可用方案中的RPO、RTO<br>RPO：架构模型保障了数据一致性，无需人为干预和检测<br>RTO：因其本身RPO的自动保障，无数据差异，准备耗时短，</p><p>MGR具备以下几个特点：</p><p>基于shared-nothing模式，所有节点都有一份完整数据，发生故障时可以直接切换。<br>MGR提供了数据一致性保障，默认是最终一致性，可根据业务特征需要自行调整一致性级别。<br>支持在线添加、删除节点，节点管理更方便。<br>支持故障自动检测及自动切换，发生故障时能自动切换到新的主节点，再配合MySQL Router中间件，应用层无需干预或调整。<br>支持单节点、多节点写入两种模式，可根据架构或业务需要选择哪种方案，不过强烈建议选用单主模式。</p><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><p><a href="https://dev.mysql.com/doc/refman/8.4/en/group-replication.html" target="_blank" rel="noopener">https://dev.mysql.com/doc/refman/8.4/en/group-replication.html</a></p><p><a href="https://greatsql.cn/blog-10-9.html" target="_blank" rel="noopener">https://greatsql.cn/blog-10-9.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h4 id=&quot;术语&quot;&gt;&lt;a href=&quot;#术语&quot; class=&quot;headerlink&quot; title=&quot;术语&quot;&gt;&lt;/a&gt;术语&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;MGR：MySQL Group Replication，即MySQL组复制&lt;/li&gt;
&lt;li&gt;RPO：Recovery Poin</summary>
      
    
    
    
    <category term="Data" scheme="https://2tu.github.io/categories/Data/"/>
    
    
    <category term="MGR" scheme="https://2tu.github.io/tags/MGR/"/>
    
  </entry>
  
  <entry>
    <title>如何预估MySQL表空间占用大小</title>
    <link href="https://2tu.github.io/2024/05/29/how-to-estimate-size-of-table-in-mysql/"/>
    <id>https://2tu.github.io/2024/05/29/how-to-estimate-size-of-table-in-mysql/</id>
    <published>2024-05-29T12:37:39.000Z</published>
    <updated>2026-01-15T12:42:41.737Z</updated>
    
    <content type="html"><![CDATA[<p>我们经常需要知道表空间大小，在修改表结构的时候需要知道表空间大小以预估影响时间；在设计表的时候需要预估表的数据量，预估磁盘空间等。</p><h4 id="查看已存在的表空间大小"><a href="#查看已存在的表空间大小" class="headerlink" title="查看已存在的表空间大小"></a>查看已存在的表空间大小</h4><p>MySQL中information_schema有记录<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">concat</span>(<span class="keyword">round</span>(<span class="keyword">sum</span>((data_length+index_length)/<span class="number">1024</span>/<span class="number">1024</span>),<span class="number">2</span>),<span class="string">'MB'</span> <span class="keyword">as</span> <span class="keyword">data</span></span><br><span class="line"><span class="keyword">FROM</span> information_schema.tables</span><br><span class="line"><span class="keyword">WHERE</span> table_schema=<span class="string">'mydb'</span> <span class="keyword">and</span> table_name=<span class="string">'mytable'</span>;</span><br></pre></td></tr></table></figure></p><h4 id="新建表空间大小测算"><a href="#新建表空间大小测算" class="headerlink" title="新建表空间大小测算"></a>新建表空间大小测算</h4><p>从上面可以看到表空间大小由数据大小+索引大小两部分组成<br>下面通过一个例子来实际测算一下<br>DDL<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; desc City;</span><br><span class="line">+<span class="comment">-------------+----------+------+-----+---------+----------------+</span></span><br><span class="line">| Field       | Type     | Null | Key | Default | Extra          |</span><br><span class="line">+<span class="comment">-------------+----------+------+-----+---------+----------------+</span></span><br><span class="line">| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |</span><br><span class="line">| Name        | char(35) | NO   |     |         |                |</span><br><span class="line">| CountryCode | char(3)  | NO   | MUL |         |                |</span><br><span class="line">| District    | char(20) | NO   |     |         |                |</span><br><span class="line">| Population  | int(11)  | NO   |     | 0       |                |</span><br><span class="line">+<span class="comment">-------------+----------+------+-----+---------+----------------+</span></span><br></pre></td></tr></table></figure></p><ul><li><p>数据大小测算<br>根据表结构中字段大小来测算<br>66 bytes per row of data（4+35+3+20+4）</p></li><li><p>索引大小测算<br>4 bytes per row for the primary key<br>7 bytes per row for country code index</p><ul><li>3 bytes for the country</li><li>4 bytes for Clustered Key attached to the country code</li></ul></li></ul><p>这不考虑BTREE或表空间碎片的内务管理<br>对于一百万行，这将是77000000字节（73.43 MB）</p><p>参考<br><a href="https://dba.stackexchange.com/questions/46069/how-to-estimate-predict-data-size-and-index-size-of-a-table-in-mysql" target="_blank" rel="noopener">How to estimate/predict data size and index size of a table in MySQL</a></p><p>更详细的还需要看<a href="https://dev.mysql.com/blog-archive/innodb-tablespace-space-management/" target="_blank" rel="noopener">InnoDB : Tablespace Space Management</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我们经常需要知道表空间大小，在修改表结构的时候需要知道表空间大小以预估影响时间；在设计表的时候需要预估表的数据量，预估磁盘空间等。&lt;/p&gt;
&lt;h4 id=&quot;查看已存在的表空间大小&quot;&gt;&lt;a href=&quot;#查看已存在的表空间大小&quot; class=&quot;headerlink&quot; titl</summary>
      
    
    
    
    <category term="Data" scheme="https://2tu.github.io/categories/Data/"/>
    
    
  </entry>
  
  <entry>
    <title>自定义ShardingSphere的JSON加解密器</title>
    <link href="https://2tu.github.io/2024/05/28/shardingsphere-encrypt-json/"/>
    <id>https://2tu.github.io/2024/05/28/shardingsphere-encrypt-json/</id>
    <published>2024-05-28T13:32:54.000Z</published>
    <updated>2026-01-15T12:42:41.742Z</updated>
    
    <content type="html"><![CDATA[<p>基于数据安全的目的，需要对敏感数据进行加密存储。其中有整个字段是敏感内容的数据，也有部分灵活内容存储为JSON，JSON中的部分path为敏感内容。<br>针对这部分内容，需要对JSON指定path加解密，以避免对整个JSON加解密造成存储空间、应用缓存资源浪费。</p><h4 id="ShardingSphere整体架构"><a href="#ShardingSphere整体架构" class="headerlink" title="ShardingSphere整体架构"></a>ShardingSphere整体架构</h4><p><img src="/2024/05/28/shardingsphere-encrypt-json/architecture.png" alt></p><h4 id="加密规则"><a href="#加密规则" class="headerlink" title="加密规则"></a>加密规则</h4><p>加密配置主要分为四部分：数据源配置，加密算法配置，加密表配置以及查询属性配置，其详情如下图所示：<br><img src="/2024/05/28/shardingsphere-encrypt-json/rule.png" alt><br>JSON加解密器实现在加密配置-&gt;用户自定义处</p><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><h5 id="加密器类型配置"><a href="#加密器类型配置" class="headerlink" title="加密器类型配置"></a>加密器类型配置</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">spring:</span><br><span class="line">  shardingsphere:</span><br><span class="line">    rules:</span><br><span class="line">      encrypt:</span><br><span class="line">      encryptors:</span><br><span class="line">          json_encryptor:</span><br><span class="line">            type: json</span><br></pre></td></tr></table></figure><h5 id="加密字段配置"><a href="#加密字段配置" class="headerlink" title="加密字段配置"></a>加密字段配置</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">spring:</span><br><span class="line">  shardingsphere:</span><br><span class="line">    rules:</span><br><span class="line">      encrypt:</span><br><span class="line">      tables:</span><br><span class="line">          t_user:</span><br><span class="line">            columns:</span><br><span class="line">              info:</span><br><span class="line">                plainColumn: info</span><br><span class="line">                cipherColumn: info_cipher</span><br><span class="line">                encryptorName: json_encryptor</span><br></pre></td></tr></table></figure><h5 id="JSON-path加密配置"><a href="#JSON-path加密配置" class="headerlink" title="JSON path加密配置"></a>JSON path加密配置</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">spring:</span><br><span class="line">  shardingsphere:</span><br><span class="line">    rules:</span><br><span class="line">      encrypt:</span><br><span class="line">      encryptors:</span><br><span class="line">          json_encryptor:</span><br><span class="line">            props:</span><br><span class="line">              column0_path: bankCard <span class="comment">&lt;!-- &#123;唯一名字&#125;_path=需要加密的json路径   --&gt;</span></span><br><span class="line">              column0_path_encryptor: bankCard <span class="comment">&lt;!-- &#123;唯一名字&#125;_path_encryptor=加密类型 --&gt;</span></span><br></pre></td></tr></table></figure><h4 id="自定义加密"><a href="#自定义加密" class="headerlink" title="自定义加密"></a>自定义加密</h4><p>接下来就是自定义ShardingSphere加密部分<br>可以查看ShardingSphere官网，<a href="https://shardingsphere.apache.org/document/1.3.0/cn/reference/encrypt/#encryptalgorithm" target="_blank" rel="noopener">EncryptAlgorithm</a><br>继承EncryptAlgorithm</p><ul><li>重写getType为json（加密器类型配置处使用）</li><li>重写setProps（JSON path加密配置会从此处拿到）</li><li>重写encrypt、decrypt，在遇到加密字段配置中的SQL时，触发改写SQL，可以根据props中配置的json path自定义加密。</li></ul><p>实现SPI<br>在代码的resources路径下创建META-INF\services\org.apache.shardingsphere.spi.encrypt.ShardingEncryptor<br>文件内容为自定义加密类的全路径，如：com.company.shardingsphere.encrypt.JSONEncryptor</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;基于数据安全的目的，需要对敏感数据进行加密存储。其中有整个字段是敏感内容的数据，也有部分灵活内容存储为JSON，JSON中的部分path为敏感内容。&lt;br&gt;针对这部分内容，需要对JSON指定path加解密，以避免对整个JSON加解密造成存储空间、应用缓存资源浪费。&lt;/p&gt;
</summary>
      
    
    
    
    <category term="Data" scheme="https://2tu.github.io/categories/Data/"/>
    
    
    <category term="ShardingSphere" scheme="https://2tu.github.io/tags/ShardingSphere/"/>
    
  </entry>
  
  <entry>
    <title>MySQL中的float、double的精度是如何丢失的？</title>
    <link href="https://2tu.github.io/2024/05/14/problems-with-float-in-mysql/"/>
    <id>https://2tu.github.io/2024/05/14/problems-with-float-in-mysql/</id>
    <published>2024-05-14T06:04:31.000Z</published>
    <updated>2026-01-15T12:42:41.742Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>朋友在设计表的时候很疑惑小数的时候到底该用Float、Double还是Decimal，什么情况下使用？<br>我们总听说Float、Double会丢失精度，如果是金钱则使用Decimal。但是在业务场景里面，我们期望的是程序是可靠的，所有数据都是准确的。那是不是意味着所有的字段都要用Decimal,那Float、Double还有什么用？<br>所以我们需要理解到精度到底是怎么丢失的，什么情况下丢失，什么情况下不丢失？才能得出Float、Double在怎样情况下是可靠的，才能在需要使用的时候判断出该使用什么数据类型。</p><h3 id="Float为什么会丢失？"><a href="#Float为什么会丢失？" class="headerlink" title="Float为什么会丢失？"></a>Float为什么会丢失？</h3><p>Float、Double存储的是近似值。为什么是近似值，先看看各数据类型空间占用情况</p><table><thead><tr><th>类型名称</th><th>说明</th><th>存储需求</th></tr></thead><tbody><tr><td>Float</td><td>单精度浮点数</td><td>4字节</td></tr><tr><td>Double</td><td>双精度浮点数</td><td>8字节</td></tr><tr><td>Decimal</td><td>压缩的“严格”定点数</td><td>Decimal(M,D)，如果M&gt;D，为M+2否则为D+2字节</td></tr></tbody></table><p>存储Float、Double时采用将数据转换为二进制进行存储。<br>存储格式为<br><img src="/2024/05/14/problems-with-float-in-mysql/storage-format.png" alt></p><p>比如8.25用二进制表示可表示为1000.01，转成指数的形式1.00001*2^3,在计算机中<br><img src="/2024/05/14/problems-with-float-in-mysql/binary-format.png" alt></p><p>这其中小数的二进制计算方式与整数不同，需要使用小数部分<em>2取整数，直到为0<br>例如0.32的二进制计算方式如下<br>0.32</em>2 = 0.64 0<br>0.64<em>2 = 1.28 1<br>0.28</em>2 = 0.56 0<br>0.56<em>2 = 1.12 1<br>0.12</em>2 = 0.24 0<br>0.24<em>2 = 0.48 0<br>0.48</em>2 = 0.96 0<br>0.96<em>2 = 1.92 1<br>0.92</em>2 = 1.84 1<br>0.84<em>2 = 1.68 1<br>0.68</em>2 = 1.36 1<br>0.36*2 = 0.72 0<br>…</p><p>对于这样整除不尽或者超过32位的情况，就一定会丢失精度，或者四舍五入后得到的近似值<br>针对float情况，至少我们可以得出结论：<br>1.如果一个float型数据转成二进制后的第32位之后都是0，那么数据是准的<br>2.如果一个float型数据转成二进制后的第32位之后不全为0，则数据就会存在误差</p><h4 id="重新说明float-M-D-两个参数的意义"><a href="#重新说明float-M-D-两个参数的意义" class="headerlink" title="重新说明float(M, D)两个参数的意义"></a>重新说明float(M, D)两个参数的意义</h4><p>这两个参数表示一共能存M位，其中小数点后占D位。比如float(3,1)表示一共3位，其中小数点后1位数字。这里会有两个误区</p><p>数据的精度总是能精确到D位，也就是数据的不精确一定出现在小数点后<br>数据存储的时候只能存储到D位小数</p><ul><li><p>第一个误区，如果对于float4字节的存储空间连整数的存储不下的时候，连整数都有误差的，更何况小数，所以存储空间大小决定存储精度，和D值无关。来看这样一个例子</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; create table f2 (f1 float(15,2));</span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line">mysql&gt; insert into f2 values (123456789.39);</span><br><span class="line">Query OK, 1 row affected (0.00 sec)</span><br><span class="line">mysql&gt; select * from f2;</span><br><span class="line">+<span class="comment">--------------+</span></span><br><span class="line">| f1           |</span><br><span class="line">+<span class="comment">--------------+</span></span><br><span class="line">| 123456792.00 |</span><br><span class="line">+<span class="comment">--------------+</span></span><br><span class="line">1 row in <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br></pre></td></tr></table></figure><p>最后你会发现，连整数都不准了，小数被完全抹去了。</p></li><li><p>第二个误区，对于存储而言，是和D无关的一个参数。因为浮点型数据最终都要被转成二进制进行存储。并且对于float，这个二进制只能有32位0和1的组合。看下面的例子：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; select * from f;</span><br><span class="line">+<span class="comment">-----------+</span></span><br><span class="line">| f1        |</span><br><span class="line">+<span class="comment">-----------+</span></span><br><span class="line">| 131072.31 |</span><br><span class="line">+<span class="comment">-----------+</span></span><br><span class="line">1 row in <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br><span class="line">mysql&gt; <span class="keyword">alter</span> <span class="keyword">table</span> f <span class="keyword">modify</span> f1 <span class="built_in">float</span>(<span class="number">10</span>,<span class="number">4</span>);</span><br><span class="line">Query OK, 0 rows affected (0.02 sec)</span><br><span class="line">Records: 0  Duplicates: 0  Warnings: 0</span><br><span class="line">mysql&gt; select * from f;</span><br><span class="line">+<span class="comment">-------------+</span></span><br><span class="line">| f1          |</span><br><span class="line">+<span class="comment">-------------+</span></span><br><span class="line">| 131072.3125 |</span><br><span class="line">+<span class="comment">-------------+</span></span><br><span class="line">1 row in <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br></pre></td></tr></table></figure><p>可以看到，修改一下显示宽度D，这个时候可以看到MySQL真正存储的数字是131072.3125</p></li></ul><h4 id="怎么样才能存储一个准确的数据"><a href="#怎么样才能存储一个准确的数据" class="headerlink" title="怎么样才能存储一个准确的数据"></a>怎么样才能存储一个准确的数据</h4><p>如果采用float或者double类型的话，数据有时候完全准确的，有时候是不准确的，怎么才能存储一个准确的数字，完全看你需要存什么样的数据，假如存储一个8.25这样的数字，那永远都是准确的。但是如果存储0.9这样的数字，则永远存不准确。</p><p>所以如果一个实数在MySQL中存储准确的话，会出现以下三种情况</p><ul><li>数据真的准确，数据能在有限的存储空间里完全存储起来</li><li>数据存储被截断，但是通过四舍五入依然能够将数据显示准确</li><li>数据存储被截断，通过四舍五入不能将数字正确显示</li></ul><h4 id="关于decimal类型"><a href="#关于decimal类型" class="headerlink" title="关于decimal类型"></a>关于decimal类型</h4><p>通过前面的分析，了解了float和double类型的区别和误差来源。但是decimal类型是MySQL官方唯一指定能精确存储的类型，也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型，如果猜想decimal类型的存储格式的话，那么一下两种可以保持数据的准确性</p><ul><li>继续扩大存储空间，比double更大一个级别，比如128位甚至更多</li><li>通过字符串化或者其他的方式特殊存储起来</li></ul><p>这两种方式都能实现decimal精确存储，但是由于MySQL指定decimal类型最大长度为65.在我们能测试的范围内，decimal并没有出现误差。</p><h4 id="如何选择float，double，decimal"><a href="#如何选择float，double，decimal" class="headerlink" title="如何选择float，double，decimal"></a>如何选择float，double，decimal</h4><p>结论总是放在最后，根据上面的分析：可以得出以下结论</p><ol><li><p>如果你要表示的浮点型数据转成二进制之后能被32位float存储，或者可以容忍截断，则使用float，这个范围大概为要精确保存6位数字左右的浮点型数据 比如10分制的店铺积分可以用float存储，小商品零售价格(1000块之内)</p></li><li><p>如果你要表示的浮点型数据转成二进制之后能被64位double存储，或者可以容忍截断，这个范围大致要精确到保存13位数字左右的浮点型数据 比如汽车价格,几千万的工程造价</p></li><li><p>相比double，已经满足我们大部分浮点型数据的存储精度要求，如果还要精益求精，则使用decimal定点型存储 比如一些科学数据，精度要求很高的金钱</p></li></ol><h3 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h3><p>理论上的东西永远比不上实践，应用场景大于一切理论。选择float或者double或者decimal有时候也要看场景，比如我们可以用double存储一个小商铺的季度营业额（几千万），单独用double存储的时候没有问题，当多个季度，多个年份算总3年内的营业额是，就会出现问题，再也算不出一个准确的答案。所以，如果考虑情况没那么有把握的情况下，推荐使用decimal，最后，也可以通过其他手段避开这些问题，比如存储商品价格可以使用 乘以100的形式存储，展示价格的时候再除以100</p><p><a href="https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html" target="_blank" rel="noopener">B.3.4.8 Problems with Floating-Point Values</a><br><a href="https://cloud.tencent.com/developer/article/1866266" target="_blank" rel="noopener">谈谈MySQL如何选择float, double, decimal</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;朋友在设计表的时候很疑惑小数的时候到底该用Float、Double还是Decimal，什么情况下使用？&lt;br&gt;我们总听说Float、Doub</summary>
      
    
    
    
    <category term="Data" scheme="https://2tu.github.io/categories/Data/"/>
    
    
    <category term="MySQL" scheme="https://2tu.github.io/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>手机资费套餐</title>
    <link href="https://2tu.github.io/2024/05/10/mobile-tariff-package/"/>
    <id>https://2tu.github.io/2024/05/10/mobile-tariff-package/</id>
    <published>2024-05-10T02:10:46.000Z</published>
    <updated>2026-01-15T12:42:41.741Z</updated>
    
    <content type="html"><![CDATA[<p>想找一个全网最低的资费套餐，网上也有0月租的，但是没有验证。<br>从<a href="https://yhssglxt.miit.gov.cn/web/enterpriseInformation" target="_blank" rel="noopener">工信部</a>查询出44个运营商官网拿到资费信息筛选出6元及以下的套餐如下</p><table><thead><tr><th style="text-align:left">运营商</th><th style="text-align:left">月租/资费</th><th style="text-align:left">套餐名称</th><th style="text-align:left">套餐详情</th><th style="text-align:left">套餐URL</th></tr></thead><tbody><tr><td style="text-align:left">阿里通信</td><td style="text-align:left">6</td><td style="text-align:left">亲心6元套餐</td><td style="text-align:left">60分钟国内语音<br>国内接听免费<br>国内语音0.15元/分钟<br>国内流量2元/日/随心用<br>当日有效<br>国内短信0.1元/条<br>赠送来电显示</td><td style="text-align:left"><a href="https://aliqin.aliyuncs.com/#/prod" target="_blank" rel="noopener">https://aliqin.aliyuncs.com/#/prod</a></td></tr><tr><td style="text-align:left">日日顺通信</td><td style="text-align:left">5</td><td style="text-align:left">顺意套餐</td><td style="text-align:left">①、国内语音拨打资费：0.15元/分钟；<br>②、国内流量：0.2元/M；<br>③、国内点到点短信：0.1元/条；<br>④、来电显示5元/月；</td><td style="text-align:left"><a href="https://rrstel.com/businessHall/localpage/zifeizone.jsp" target="_blank" rel="noopener">https://rrstel.com/businessHall/localpage/zifeizone.jsp</a></td></tr><tr><td style="text-align:left">丰信移动</td><td style="text-align:left">6</td><td style="text-align:left">丰信6元A卡</td><td style="text-align:left">1.月租6元/月，赠送来电显示，赠送60分钟国内语音<br>2.国内语音：0.15元/分钟<br>3.国内流量：1元包500M/日<br>4.国内短/彩信：0.1元/条。</td><td style="text-align:left"><a href="http://www.phtion.com/account/index" target="_blank" rel="noopener">http://www.phtion.com/account/index</a></td></tr><tr><td style="text-align:left">蓝猫移动</td><td style="text-align:left">3.9</td><td style="text-align:left">蓝猫标准流量卡</td><td style="text-align:left"></td><td style="text-align:left"><a href="https://www.lanmaomobile.com/?list_8/232.html" target="_blank" rel="noopener">https://www.lanmaomobile.com/?list_8/232.html</a></td></tr><tr><td style="text-align:left">朗玛移动</td><td style="text-align:left">6</td><td style="text-align:left">小象阳光卡6元</td><td style="text-align:left">语音：0分钟<br>流量：0GB<br>流量：0.1元/1M<br>短信：0.1元/条<br>语音：0.15元/分钟</td><td style="text-align:left"><a href="https://www.langma.cn/langma-jx" target="_blank" rel="noopener">https://www.langma.cn/langma-jx</a></td></tr><tr><td style="text-align:left">天音移动</td><td style="text-align:left">6</td><td style="text-align:left">天音卡-联通版</td><td style="text-align:left">打电话0.15元/分钟<br>上网流量0.2元/M<br>短信0.1元/条<br>彩信0.3元/条<br>来电显示月租5元</td><td style="text-align:left"><a href="https://rrstel.com/businessHall/localpage/zifeizone.jsp" target="_blank" rel="noopener">https://rrstel.com/businessHall/localpage/zifeizone.jsp</a></td></tr><tr><td style="text-align:left">普泰移动</td><td style="text-align:left">6</td><td style="text-align:left">普泰惠享卡</td><td style="text-align:left"></td><td style="text-align:left"><a href="https://rrstel.com/businessHall/localpage/zifeizone.jsp" target="_blank" rel="noopener">https://rrstel.com/businessHall/localpage/zifeizone.jsp</a></td></tr><tr><td style="text-align:left">苏宁互联</td><td style="text-align:left">5</td><td style="text-align:left">至简套餐</td><td style="text-align:left"></td><td style="text-align:left"><a href="https://rrstel.com/businessHall/localpage/zifeizone.jsp" target="_blank" rel="noopener">https://rrstel.com/businessHall/localpage/zifeizone.jsp</a></td></tr><tr><td style="text-align:left">电信</td><td style="text-align:left">5</td><td style="text-align:left">无忧卡</td><td style="text-align:left">适用范围：全部公众用户<br>有效期限：2025年11月30日<br>销售渠道：线下及线上渠道<br>可售范围：全国可售，但受各省销售安排所限<br>合约要求：不限制</td><td style="text-align:left"><a href="https://www.189.cn/cq/zfzq/#tList_4" target="_blank" rel="noopener">https://www.189.cn/cq/zfzq/#tList_4</a></td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;想找一个全网最低的资费套餐，网上也有0月租的，但是没有验证。&lt;br&gt;从&lt;a href=&quot;https://yhssglxt.miit.gov.cn/web/enterpriseInformation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;工信部&lt;/a</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="资费套餐" scheme="https://2tu.github.io/tags/%E8%B5%84%E8%B4%B9%E5%A5%97%E9%A4%90/"/>
    
  </entry>
  
  <entry>
    <title>SPI机制</title>
    <link href="https://2tu.github.io/2024/04/08/what-is-spi/"/>
    <id>https://2tu.github.io/2024/04/08/what-is-spi/</id>
    <published>2024-04-08T12:38:27.000Z</published>
    <updated>2026-01-15T12:42:41.753Z</updated>
    
    <content type="html"><![CDATA[<p>SPI（Service Provider Interface），是JDK内置的一种 服务提供发现机制，可以用来启用框架扩展和替换组件，主要是被框架的开发人员使用，比如java.sql.Driver接口，其他不同厂商可以针对同一接口做出不同的实现，MySQL和PostgreSQL都有不同的实现提供给用户，而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外，在模块化设计中这个机制尤其重要，其核心思想就是 <strong>解耦</strong>。<br>SPI整体机制图如下：<br><img src="/2024/04/08/what-is-spi/spi.jpg" alt="SPI"></p><p>服务提供方提供了接口实现后，需要在classpath下的META-INF/services/目录下创建以服务接口命名的文件，文件内容为接口的实现类名。<br>其他程序使用服务时，会通过查找这个jar的META-INF/services/中文件，获取实现类名，进行加载实例化，该服务就可以使用了。JDK中查找服务实现的类为java.util.ServiceLoader。</p><h4 id="应用-JDBC"><a href="#应用-JDBC" class="headerlink" title="应用-JDBC"></a>应用-JDBC</h4><h5 id="JDBC接口定义"><a href="#JDBC接口定义" class="headerlink" title="JDBC接口定义"></a>JDBC接口定义</h5><p>在java中定义了接口java.sql.Driver，并没有实现，具体实现由不通厂商实现。</p><h5 id="MySQL实现"><a href="#MySQL实现" class="headerlink" title="MySQL实现"></a>MySQL实现</h5><p>MySQL的jar包（mysql-connector-java-8.0.30.jar）中，META-INF/services目录下有文件名java.sql.Driver的内容为com.mysql.cj.jdbc.Driver<br><img src="/2024/04/08/what-is-spi/spi-services.png" alt="SPI META-INF/services"></p><h5 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Connection conn = DriverManager.getConnection(url,username,password);</span><br></pre></td></tr></table></figure><h5 id="SPI如何实现"><a href="#SPI如何实现" class="headerlink" title="SPI如何实现"></a>SPI如何实现</h5><p>在使用的时候并没有指定使用哪个Driver来连接，那如何使用上MySQL的驱动的呢？这就是我们SPI在起作用。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> java.sql;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DriverManager</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        loadInitialDrivers();</span><br><span class="line">        println(<span class="string">"JDBC DriverManager initialized"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">loadInitialDrivers</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        String drivers;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            drivers = AccessController.doPrivileged(<span class="keyword">new</span> PrivilegedAction&lt;String&gt;() &#123;</span><br><span class="line">                <span class="function"><span class="keyword">public</span> String <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                    <span class="keyword">return</span> System.getProperty(<span class="string">"jdbc.drivers"</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception ex) &#123;</span><br><span class="line">            drivers = <span class="keyword">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">       </span><br><span class="line">        AccessController.doPrivileged(<span class="keyword">new</span> PrivilegedAction&lt;Void&gt;() &#123;</span><br><span class="line">            <span class="function"><span class="keyword">public</span> Void <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">                ServiceLoader&lt;Driver&gt; loadedDrivers = ServiceLoader.load(Driver<span class="class">.<span class="keyword">class</span>)</span>;</span><br><span class="line">                Iterator&lt;Driver&gt; driversIterator = loadedDrivers.iterator();</span><br><span class="line"></span><br><span class="line">                <span class="keyword">try</span>&#123;</span><br><span class="line">                    <span class="keyword">while</span>(driversIterator.hasNext()) &#123;</span><br><span class="line">                        driversIterator.next();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">catch</span>(Throwable t) &#123;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        println(<span class="string">"DriverManager.initialize: jdbc.drivers = "</span> + drivers);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (drivers == <span class="keyword">null</span> || drivers.equals(<span class="string">""</span>)) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        String[] driversList = drivers.split(<span class="string">":"</span>);</span><br><span class="line">        println(<span class="string">"number of Drivers:"</span> + driversList.length);</span><br><span class="line">        <span class="keyword">for</span> (String aDriver : driversList) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                println(<span class="string">"DriverManager.Initialize: loading "</span> + aDriver);</span><br><span class="line">                Class.forName(aDriver, <span class="keyword">true</span>,</span><br><span class="line">                        ClassLoader.getSystemClassLoader());</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception ex) &#123;</span><br><span class="line">                println(<span class="string">"DriverManager.Initialize: load failed: "</span> + ex);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><br>其中<br>ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);<br>Iterator<Driver> driversIterator = loadedDrivers.iterator();<br>负责查找classpath下及jar包中META-INF/services目录下java.sql.Driver文件中的内容获取具体实现。</Driver></Driver></p><h3 id="SPI机制的缺陷"><a href="#SPI机制的缺陷" class="headerlink" title="SPI机制的缺陷"></a>SPI机制的缺陷</h3><p>通过上面的解析，可以发现，我们使用SPI机制的缺陷：</p><ul><li>不能按需加载，需要遍历所有的实现，并实例化，然后在循环中才能找到我们需要的实现。如果不想用某些实现类，或者某些类实例化很耗时，它也被载入并实例化了，这就造成了浪费。</li><li>获取某个实现类的方式不够灵活，只能通过 Iterator 形式获取，不能根据某个参数来获取对应的实现类。</li><li>多个并发多线程使用 ServiceLoader 类的实例是不安全的.</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;SPI（Service Provider Interface），是JDK内置的一种 服务提供发现机制，可以用来启用框架扩展和替换组件，主要是被框架的开发人员使用，比如java.sql.Driver接口，其他不同厂商可以针对同一接口做出不同的实现，MySQL和PostgreS</summary>
      
    
    
    
    <category term="Java" scheme="https://2tu.github.io/categories/Java/"/>
    
    
    <category term="SPI" scheme="https://2tu.github.io/tags/SPI/"/>
    
  </entry>
  
  <entry>
    <title>如何生成requirements.txt</title>
    <link href="https://2tu.github.io/2024/03/27/how-to-gen-requirements-with-python/"/>
    <id>https://2tu.github.io/2024/03/27/how-to-gen-requirements-with-python/</id>
    <published>2024-03-27T11:32:46.000Z</published>
    <updated>2026-01-15T12:42:41.738Z</updated>
    
    <content type="html"><![CDATA[<p>写了一个简单的python项目，希望生成一个requirements.txt文件方便在Github或其他地方运行安装依赖。<br>作为新手我首先是一个一个从import里面去找到写到文件中的，结果发现居然会报错。<br>后面找到一个工具pipreqs可以自动识别出项目中用到的所有依赖生成requirements.txt文件</p><h3 id="How"><a href="#How" class="headerlink" title="How"></a>How</h3><h4 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h4><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip <span class="keyword">install</span> pipreqs</span><br></pre></td></tr></table></figure><h4 id="Usage"><a href="#Usage" class="headerlink" title="Usage"></a>Usage</h4><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ pipreqs /home/<span class="keyword">project</span>/location</span><br><span class="line">Successfully saved requirements <span class="keyword">file</span> in /home/<span class="keyword">project</span>/location/requirements.txt</span><br></pre></td></tr></table></figure><p>生成requirements.txt内容如<br><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wheel==<span class="number">0.23</span><span class="number">.0</span></span><br><span class="line">Yarg==<span class="number">0.1</span><span class="number">.9</span></span><br><span class="line">docopt==<span class="number">0.6</span><span class="number">.2</span></span><br></pre></td></tr></table></figure></p><p>更详细的参数用法参照<a href="https://github.com/bndr/pipreqs?tab=readme-ov-file#usage" target="_blank" rel="noopener">pipreqs Usage</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;写了一个简单的python项目，希望生成一个requirements.txt文件方便在Github或其他地方运行安装依赖。&lt;br&gt;作为新手我首先是一个一个从import里面去找到写到文件中的，结果发现居然会报错。&lt;br&gt;后面找到一个工具pipreqs可以自动识别出项目中用到</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="python" scheme="https://2tu.github.io/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>Java类文件在JVM运行的生命周期</title>
    <link href="https://2tu.github.io/2024/02/27/the-class-file-lifecycle-of-jvm/"/>
    <id>https://2tu.github.io/2024/02/27/the-class-file-lifecycle-of-jvm/</id>
    <published>2024-02-27T11:30:08.000Z</published>
    <updated>2026-01-15T12:42:41.744Z</updated>
    
    <content type="html"><![CDATA[<h4 id="java-Class文件结构"><a href="#java-Class文件结构" class="headerlink" title="java Class文件结构"></a>java Class文件结构</h4><p>Java .class 文件是 Java 编程语言的关键组件，遵循精确且定义的结构。 这种结构不仅对于 Java 虚拟机 (JVM) 正确加载和执行字节码至关重要，而且还提供了有关编译后的 Java 代码的大量信息。 下面，我们深入研究类文件结构的基本元素，详细说明每个组件及其在整体架构中的重要性。</p><h5 id="class文件格式"><a href="#class文件格式" class="headerlink" title="class文件格式"></a>class文件格式</h5><p>类文件由单个 ClassFile 结构组成。 该结构由 JVM 规范定义并遵循特定格式，其中包括以下主要部分：</p><ul><li>Magic Number魔数：固定值 (0xCAFEBABE)。 此唯一标识符验证该文件是否是 JVM 可读的有效类文件。</li><li>Version Information版本号：major_version、minor_version，java版本号</li><li>Constant Pool常量池</li><li>Access Flags访问标识</li><li>This Class, Super Class,and Interfaces类索引、父类索引与接口索引集合</li><li>Fields字段集合</li><li>Methods方法表集合</li><li>Attributes属性表集合</li></ul><p>以上信息如何查看？<br><figure class="highlight prolog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">javap [options] classes...</span><br></pre></td></tr></table></figure></p><p>JVM需要使用上述信息来正确加载、验证和执行</p><p>其是常量池，它是一个集中的字典，经常被类文件中的其他部分引用，突出了它在整个架构中的重要性。</p><h4 id="Class文件在JVM中的生命周期"><a href="#Class文件在JVM中的生命周期" class="headerlink" title="Class文件在JVM中的生命周期"></a>Class文件在JVM中的生命周期</h4><p><img src="/2024/02/27/the-class-file-lifecycle-of-jvm/class-file-lifecycle-in-jvm.png" alt="The Class file Lifecycle of a Java Application"></p><h5 id="1-Loading加载"><a href="#1-Loading加载" class="headerlink" title="1. Loading加载"></a>1. Loading加载</h5><p>类加载过程执行以下三个功能：<br>从clas文件创建二进制数据流<br>根据内部数据结构解析二进制数据<br>创建 java.lang.Class 的实例<br>完成此操作后，类实例就可以进行链接了。</p><h5 id="2-Linking链接"><a href="#2-Linking链接" class="headerlink" title="2. Linking链接"></a>2. Linking链接</h5><h6 id="2-1-Verification验证"><a href="#2-1-Verification验证" class="headerlink" title="2.1 Verification验证"></a>2.1 Verification验证</h6><p>此步骤可确保安全性和完整性。JVM验证class文件的正确性，文件格式验证、语法是否有效、是否符合Java语言规范。</p><h6 id="2-2-Preparation准备"><a href="#2-2-Preparation准备" class="headerlink" title="2.2 Preparation准备"></a>2.2 Preparation准备</h6><p>在准备过程中，JVM 会为类静态变量分配内存，并将其初始化为默认值。</p><h6 id="2-3-Resolution解析"><a href="#2-3-Resolution解析" class="headerlink" title="2.3 Resolution解析"></a>2.3 Resolution解析</h6><p>解析阶段包括将类文件中的符号引用解析为直接引用。这就是 JVM 常量池发挥关键作用的地方。主要针对类或接口、字段、类方法、方法类型等。</p><h5 id="3-Initializes初始化"><a href="#3-Initializes初始化" class="headerlink" title="3. Initializes初始化"></a>3. Initializes初始化</h5><p>执行静态块： 这一阶段涉及执行静态初始化程序和静态块。JVM 会初始化静态字段，并按照它们在类文件中出现的顺序执行任何静态初始化块。<br>设置最终值： 为类的最终变量分配值，这些值在类的生命周期内不可更改。</p><h5 id="4-Usage使用"><a href="#4-Usage使用" class="headerlink" title="4. Usage使用"></a>4. Usage使用</h5><p>实例化： JVM 根据应用程序的需要创建类的实例。<br>执行： 根据运行程序的要求调用和执行方法，访问字段。JVM 会将字节码解释或即时编译为机器代码以便执行。</p><h5 id="5-Unloading卸载"><a href="#5-Unloading卸载" class="headerlink" title="5. Unloading卸载"></a>5. Unloading卸载</h5><p>垃圾回收： 当一个类不再需要，也没有对其实例的实时引用时，它就可以被卸载。JVM 的垃圾回收器会回收分配给类的内存。</p><p><a href="https://medium.com/@AlexanderObregon/the-anatomy-of-a-java-virtual-machine-class-file-e3773d23f3e3" target="_blank" rel="noopener">The Anatomy of a Java Virtual Machine Class File</a><br><a href="https://www.cesarsotovalero.net/blog/how-the-jvm-executes-java-code.html" target="_blank" rel="noopener">The Execution Lifecycle of a Java Application</a><br><a href="https://docs.oracle.com/en/java/javase/11/tools/javap.html" target="_blank" rel="noopener">javap</a><br><a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html" target="_blank" rel="noopener">Chapter 4. The class File Format</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h4 id=&quot;java-Class文件结构&quot;&gt;&lt;a href=&quot;#java-Class文件结构&quot; class=&quot;headerlink&quot; title=&quot;java Class文件结构&quot;&gt;&lt;/a&gt;java Class文件结构&lt;/h4&gt;&lt;p&gt;Java .class 文件是 Java 编</summary>
      
    
    
    
    <category term="Java" scheme="https://2tu.github.io/categories/Java/"/>
    
    
    <category term="Interview" scheme="https://2tu.github.io/tags/Interview/"/>
    
    <category term="JVM" scheme="https://2tu.github.io/tags/JVM/"/>
    
  </entry>
  
  <entry>
    <title>Makefile如何使用</title>
    <link href="https://2tu.github.io/2024/02/06/What-is-Makefile/"/>
    <id>https://2tu.github.io/2024/02/06/What-is-Makefile/</id>
    <published>2024-02-06T11:54:21.000Z</published>
    <updated>2026-01-15T12:42:41.710Z</updated>
    
    <content type="html"><![CDATA[<p>工程化编译项目时，Java用Maven\Gradle，前端用npm，C/C++用Make<br>使用Make命令编译C/C++时，是通过Make工具实现。推荐使用<a href="https://www.mingw-w64.org/downloads/#w64devkit" target="_blank" rel="noopener">w64devkit</a><br>w64devkit支持Linux命令</p><ul><li>根据更改的源文件，自动确定需要更新哪些文件。它还自动确定更新文件的正确顺序，以防一个非源文件依赖于另一个非来源文件。<br>因此，如果您更改一些源文件，然后运行Make，则不需要重新编译所有程序。它只更新那些直接或间接依赖于您更改的源文件的非源文件。<br>如何确定依赖的呢，来源与我们在Makefile中指定的dependencies</li><li>Make不限于任何特定的语言。所有能在命令行运行的编程语言都能处理（Java\Golang\Python…）。另外基于文件的改变然后更新另外的文件也可以。</li></ul><p>Makefile中的一条规则告诉Make如何执行一系列命令，以便从源文件构建目标文件。它还指定了目标文件的依赖项列表。此列表应包括用作规则中命令输入的所有文件（无论是源文件还是其他目标文件）。</p><figure class="highlight erlang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">target:   dependencies ...</span><br><span class="line">          commands</span><br><span class="line">          ...</span><br></pre></td></tr></table></figure><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">hello</span>: <span class="selector-tag">hello</span><span class="selector-class">.o</span></span><br><span class="line"><span class="selector-tag">g</span>++ <span class="selector-tag">-o</span> <span class="selector-tag">hello</span> <span class="selector-tag">hello</span><span class="selector-class">.o</span></span><br><span class="line"><span class="selector-tag">hello</span><span class="selector-class">.o</span>: <span class="selector-tag">hello</span><span class="selector-class">.cpp</span></span><br><span class="line"><span class="selector-tag">g</span>++ <span class="selector-tag">-c</span> <span class="selector-tag">hello</span><span class="selector-class">.cpp</span></span><br></pre></td></tr></table></figure><h4 id="更新机制"><a href="#更新机制" class="headerlink" title="更新机制"></a>更新机制</h4><p>运行Make时，可以指定要更新的特定目标；否则，Make会更新makefile中列出的第一个目标。当然，必须首先更新生成这些目标所需的任何其他目标文件作为输入。<br>Make使用makefile来确定哪些目标文件应该更新，然后确定哪些文件实际上需要更新。如果目标文件比其所有依赖项都新，那么它已经是最新的，不需要重新生成。其他目标文件确实需要更新，但顺序正确：每个目标文件都必须重新生成，然后才能用于重新生成其他目标。</p><h4 id="Makefile文件命名"><a href="#Makefile文件命名" class="headerlink" title="Makefile文件命名"></a>Makefile文件命名</h4><p>Make自动查找makefile文件，顺序为GNUmakefile&gt;makefile&gt;Makefile<br>GUNmakefile:不建议使用，只能支持GUN make<br>makefile:所有版本都能识别<br>Makefile:推荐，最常用</p><p>运行make时没有找到上述文件会报错，但可以手动指定文件名<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">make</span> -<span class="keyword">f</span> <span class="symbol">&lt;filename&gt;</span></span><br><span class="line"><span class="keyword">make</span> --<span class="keyword">file</span>=<span class="symbol">&lt;filename&gt;</span></span><br></pre></td></tr></table></figure></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;工程化编译项目时，Java用Maven&#92;Gradle，前端用npm，C/C++用Make&lt;br&gt;使用Make命令编译C/C++时，是通过Make工具实现。推荐使用&lt;a href=&quot;https://www.mingw-w64.org/downloads/#w64devkit&quot;</summary>
      
    
    
    
    <category term="C/C++" scheme="https://2tu.github.io/categories/C-C/"/>
    
    
    <category term="Makefile" scheme="https://2tu.github.io/tags/Makefile/"/>
    
  </entry>
  
  <entry>
    <title>香港卡全攻略</title>
    <link href="https://2tu.github.io/2023/11/19/bankcard-hongkong/"/>
    <id>https://2tu.github.io/2023/11/19/bankcard-hongkong/</id>
    <published>2023-11-19T04:55:15.000Z</published>
    <updated>2026-01-15T12:42:41.712Z</updated>
    
    <content type="html"><![CDATA[<h3 id="为什么要办香港卡？"><a href="#为什么要办香港卡？" class="headerlink" title="为什么要办香港卡？"></a>为什么要办香港卡？</h3><p>保险？参与港美股？参与加密货币？OpenAI付费？公司股票不转回？对于我来说，听着牛逼想要但又不是必须的理由。最后决定办理是因为觉得港股券商入金有奖励，家人可以顺便去玩一圈。</p><h3 id="选择哪个银行？"><a href="#选择哪个银行？" class="headerlink" title="选择哪个银行？"></a>选择哪个银行？</h3><p>有那么多银行，我们可以办哪些，哪些又比较好呢？<br>从发币行角度考虑</p><ul><li>香港上海汇丰银行</li><li>渣打银行（香港）</li><li>中国银行（香港）<br>三家银行都是在全球开展业务。从网上的信息来看汇丰和中国银行很好办，渣打不太好办。<br>另外虚拟银行众安银行、天星银行、蚂蚁银行等，没有考虑和办理就不列了。</li></ul><table><thead><tr><th></th><th>香港上海汇丰银行</th><th>中国银行</th></tr></thead><tbody><tr><td>总部</td><td>伦敦</td><td>中国</td></tr><tr><td>办理难度</td><td>容易</td><td>容易</td></tr><tr><td>转汇费用</td><td>据说同名内地香港互转不要手续费</td><td>同名内地香港互转不要手续费</td></tr></tbody></table><p>听说汇丰和中国银行从内地卡转入香港卡不要手续费。我办了汇丰之后就飘了不想再办就出去玩了。回来内地后去汇丰银行办理内地卡，没想到她直接告诉我只接待Premier客户，有存款要求不然有管理费。</p><h3 id="怎么办理？"><a href="#怎么办理？" class="headerlink" title="怎么办理？"></a>怎么办理？</h3><p>两种方式</p><ul><li><p>直接到营业网点线下排队办理</p><p>  如果人多去晚了可能无法办理，或者预约的人数多也可能被拒绝</p></li><li><p>网上预约，再到网点办理</p><p>  网上预约后无需再早去现场排队拿号，直接告诉接待人员，然后就给你安排了</p></li></ul><a id="more"></a><h4 id="怎么预约"><a href="#怎么预约" class="headerlink" title="怎么预约"></a>怎么预约</h4><h5 id="汇丰银行"><a href="#汇丰银行" class="headerlink" title="汇丰银行"></a>汇丰银行</h5><p>多久开始提前预约？<br>公众号上写提前2个工作日，预约后，会有香港电话打过来问你是哪天要去，去哪个分行，她登记后会将信息转至分行<br>分行的人会再次打电话给你，确认上门时间</p><ol><li>关注微信公众号汇丰香港，微信号：hsbc-hongkong</li><li><p>预约开户<br>点击“预约开户”按钮<br><img src="/2023/11/19/bankcard-hongkong/hsbc-app-open1.jpg" alt="预约开户"><br>进入页面后，填写相关信息<br><img src="/2023/11/19/bankcard-hongkong/hsbc-app-open-form.jpg" alt="预约会面"><br>联络电话，填写你内地的，要改成+86<br>产品及服务，选择汇丰ONE<br>选择会面日期，香港银行周一到周五营业时间为上午9点到下午4点，周六营业时间为上午9点到下午1点，我是周六去的<br>选择会面地区，我选择的网红网点<strong>葵芳分行</strong>，新界-》葵涌及荃湾</p></li><li><p>银行登记<br>提交完后，第二天晚上17:59银行电话我<br>询问我具体办理日期和时间<br>确认我们选择的区域的分行，或者你也可以讲自己想要的分行<br>告知开户时需要提供的资料<br>分行同事会再电话告知需要提供的资料</p></li><li><p>分行电话<br>隔天18：:01分行电话，<br>告知几点<br>带上身份证、港澳通行证、过关小票</p></li></ol><h5 id="中国银行"><a href="#中国银行" class="headerlink" title="中国银行"></a>中国银行</h5><p>可以提前7个工作日预约，不能约当天，工作日包含周六<br>中国银行预约时，公众号里面只能选择还能预约的分行，不会打电话给你确认，所以公众号预约成什么地方就是什么地方</p><ol><li>关注微信公众号中银香港微服务，微信号：BOCHK_Banking</li><li>预约开户<br>点击”银行服务”-》“我要预约”按钮<br><img src="/2023/11/19/bankcard-hongkong/boc-app-open1.jpg" alt="预约开户"><br>进入页面后，点击“预约开户”<br><img src="/2023/11/19/bankcard-hongkong/boc-app-form1.jpg" alt="预约开户"><br><img src="/2023/11/19/bankcard-hongkong/boc-app-form2.jpg" alt="预约开户"><br><img src="/2023/11/19/bankcard-hongkong/boc-app-form3.jpg" alt="预约开户"></li></ol><h4 id="资料"><a href="#资料" class="headerlink" title="资料"></a>资料</h4><p>总结一下要带哪些资料</p><ul><li>身份证</li><li>港澳通行证（有效期不低于3个月）</li><li>过关小票</li><li>地址证明（不一定需要，看客户经理）</li><li>收入来源（不一定需要，看客户经理）</li><li>存款（不一定需要，看客户经理）<br>我在葵芳分行只要了身份证、港澳通行证、过关小票</li></ul>]]></content>
    
    
    <summary type="html">&lt;h3 id=&quot;为什么要办香港卡？&quot;&gt;&lt;a href=&quot;#为什么要办香港卡？&quot; class=&quot;headerlink&quot; title=&quot;为什么要办香港卡？&quot;&gt;&lt;/a&gt;为什么要办香港卡？&lt;/h3&gt;&lt;p&gt;保险？参与港美股？参与加密货币？OpenAI付费？公司股票不转回？对于我来说，听着牛逼想要但又不是必须的理由。最后决定办理是因为觉得港股券商入金有奖励，家人可以顺便去玩一圈。&lt;/p&gt;
&lt;h3 id=&quot;选择哪个银行？&quot;&gt;&lt;a href=&quot;#选择哪个银行？&quot; class=&quot;headerlink&quot; title=&quot;选择哪个银行？&quot;&gt;&lt;/a&gt;选择哪个银行？&lt;/h3&gt;&lt;p&gt;有那么多银行，我们可以办哪些，哪些又比较好呢？&lt;br&gt;从发币行角度考虑&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;香港上海汇丰银行&lt;/li&gt;
&lt;li&gt;渣打银行（香港）&lt;/li&gt;
&lt;li&gt;中国银行（香港）&lt;br&gt;三家银行都是在全球开展业务。从网上的信息来看汇丰和中国银行很好办，渣打不太好办。&lt;br&gt;另外虚拟银行众安银行、天星银行、蚂蚁银行等，没有考虑和办理就不列了。&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;香港上海汇丰银行&lt;/th&gt;
&lt;th&gt;中国银行&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;总部&lt;/td&gt;
&lt;td&gt;伦敦&lt;/td&gt;
&lt;td&gt;中国&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;办理难度&lt;/td&gt;
&lt;td&gt;容易&lt;/td&gt;
&lt;td&gt;容易&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;转汇费用&lt;/td&gt;
&lt;td&gt;据说同名内地香港互转不要手续费&lt;/td&gt;
&lt;td&gt;同名内地香港互转不要手续费&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;听说汇丰和中国银行从内地卡转入香港卡不要手续费。我办了汇丰之后就飘了不想再办就出去玩了。回来内地后去汇丰银行办理内地卡，没想到她直接告诉我只接待Premier客户，有存款要求不然有管理费。&lt;/p&gt;
&lt;h3 id=&quot;怎么办理？&quot;&gt;&lt;a href=&quot;#怎么办理？&quot; class=&quot;headerlink&quot; title=&quot;怎么办理？&quot;&gt;&lt;/a&gt;怎么办理？&lt;/h3&gt;&lt;p&gt;两种方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;直接到营业网点线下排队办理&lt;/p&gt;
&lt;p&gt;  如果人多去晚了可能无法办理，或者预约的人数多也可能被拒绝&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;网上预约，再到网点办理&lt;/p&gt;
&lt;p&gt;  网上预约后无需再早去现场排队拿号，直接告诉接待人员，然后就给你安排了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="香港卡" scheme="https://2tu.github.io/tags/%E9%A6%99%E6%B8%AF%E5%8D%A1/"/>
    
  </entry>
  
  <entry>
    <title>C++编译器有哪些</title>
    <link href="https://2tu.github.io/2023/10/21/cpp-compiler/"/>
    <id>https://2tu.github.io/2023/10/21/cpp-compiler/</id>
    <published>2023-10-21T01:57:53.000Z</published>
    <updated>2026-01-15T12:42:41.726Z</updated>
    
    <content type="html"><![CDATA[<p>没想到C++环境搭建都这么麻烦，编译器有很多种。</p><ul><li><a href="https://code.visualstudio.com/docs/cpp/config-msvc" target="_blank" rel="noopener">MSVC</a></li><li><a href="https://github.com/skeeto/w64devkit" target="_blank" rel="noopener">w64devkit</a></li><li>Clang</li></ul><p>没有研究是觉得有些复杂。</p><p>在编译时会将我们include，#define等合并成一个文件。那如何看到这个编译的中间文件呢？<br>在Visual Studio中设置<br><img src="/2023/10/21/cpp-compiler/preprocess-to-a-file.png" alt="Preprocess to a File"></p><p>代码<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello World!"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"><span class="built_in">std</span>::<span class="built_in">cin</span>.<span class="built_in">get</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>Ctrl + F7编译后，可以从Debug目录下看到FileName.i文件中已经包含了include的 iostream代码</p><p><strong>注意：Visual Studio和Visual Studio Code是不同的工具</strong></p><p>下一个看看C++如何建立link，为什么C++中不像java一样需要导入包，就可以link，然后引用呢？如果有两个同名的函数，那link的时候会报错吗？</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;没想到C++环境搭建都这么麻烦，编译器有很多种。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/cpp/config-msvc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MSVC&lt;/a</summary>
      
    
    
    
    <category term="C/C++" scheme="https://2tu.github.io/categories/C-C/"/>
    
    
    <category term="Compiler" scheme="https://2tu.github.io/tags/Compiler/"/>
    
  </entry>
  
  <entry>
    <title>netlink</title>
    <link href="https://2tu.github.io/2023/10/07/netlink/"/>
    <id>https://2tu.github.io/2023/10/07/netlink/</id>
    <published>2023-10-07T10:07:29.000Z</published>
    <updated>2026-01-15T12:42:41.741Z</updated>
    
    <content type="html"><![CDATA[<p>什么是Netlink通信机制</p><p>Netlink是linux提供的用于内核和用户态进程之间的通信方式。</p><p>但是注意虽然Netlink主要用于用户空间和内核空间的通信，但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式，一般不用Netlink。除非需要用到Netlink的广播特性时。</p><p>那么Netlink有什么优势呢？</p><p>一般来说用户空间和内核空间的通信方式有三种：/proc、ioctl、Netlink。而前两种都是单向的，但是Netlink可以实现双工通信。</p><p>Netlink协议基于BSD socket和AF_NETLINK地址簇(address family)，使用32位的端口号寻址(以前称作PID)，每个Netlink协议(或称作总线，man手册中则称之为netlink family)，通常与一个或一组内核服务/组件相关联，如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。</p><p>netlink具有以下特点：</p><ul><li>支持全双工、异步通信(当然同步也支持)</li><li>用户空间可使用标准的BSD socket接口(但netlink并没有屏蔽掉协议包的构造与解析过程，推荐使用libnl等第三方库)</li><li>在内核空间使用专用的内核API接口</li><li>支持多播(因此支持“总线”式通信，可实现消息订阅)</li><li>在内核端可用于进程上下文与中断上下文</li></ul><p>没有Linux和C的基础是真看不懂这是啥玩意儿…</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;什么是Netlink通信机制&lt;/p&gt;
&lt;p&gt;Netlink是linux提供的用于内核和用户态进程之间的通信方式。&lt;/p&gt;
&lt;p&gt;但是注意虽然Netlink主要用于用户空间和内核空间的通信，但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式，一般不用Netlin</summary>
      
    
    
    
    <category term="Other" scheme="https://2tu.github.io/categories/Other/"/>
    
    
    <category term="Linux" scheme="https://2tu.github.io/tags/Linux/"/>
    
  </entry>
  
</feed>
