Help
RSS
API
Feed
Maltego
Contact
Domain > blog.sworld.club
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2026-01-06
104.21.8.56
(
ClassC
)
Port 443
HTTP/1.1 200 OKDate: Tue, 06 Jan 2026 14:17:04 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveAccess-Control-Allow-Origin: *Cache-Control: public, max-age0, must-revalidatecf-cache-status: DYNAMICreferrer-policy: strict-origin-when-cross-originx-content-type-options: nosniffVary: accept-encodingReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sMGFUt46E7INd6k1mXSIlNh89kZgTlnSQIpMWHkij9kovZsAEW1%2FlU8znr9J1yNfiWESggA5eGHje28TO0a20df9y3qd7UOkTi%2BSPafHM}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareSpeculation-Rules: /cdn-cgi/speculationCF-RAY: 9b9bd63b8ac8dabf-PDXalt-svc: h3:443; ma86400 !doctype html>html langzh>head>meta charsetutf-8>meta nameviewport contentwidthdevice-width, initial-scale1, maximum-scale1>meta>title>Sworld/title>link relmanifest href/manifest.json>meta nameapplication-name contentSworld的博客>meta namemsapplication-TileImage content/img/favicon.svg>meta nameapple-mobile-web-app-capable contentyes>meta nameapple-mobile-web-app-title contentSworld的博客>meta nameapple-mobile-web-app-status-bar-style contentdefault>meta namedescription contentSworld的个人博客>meta propertyog:type contentwebsite>meta propertyog:title contentSworld>meta propertyog:url contenthttp://blog.sworld.club/>meta propertyog:site_name contentSworld>meta propertyog:description contentSworld的个人博客>meta propertyog:locale contentzh_CN>meta propertyog:image contenthttp://blog.sworld.club/img/og_image.png>meta propertyarticle:author contentSworld>meta propertytwitter:card contentsummary>meta propertytwitter:image:src contenthttp://blog.sworld.club/img/og_image.png>script typeapplication/ld+json>{@context:https://schema.org,@type:BlogPosting,mainEntityOfPage:{@type:WebPage,@id:http://blog.sworld.club},headline:Sworld,image:http://blog.sworld.club/img/og_image.png,author:{@type:Person,name:Sworld},publisher:{@type:Organization,name:Sworld,logo:{@type:ImageObject,url:http://blog.sworld.club/img/logo.svg}},description:Sworld的个人博客}/script>link relicon href/img/favicon.svg>link relstylesheet hrefhttps://use.fontawesome.com/releases/v6.0.0/css/all.css>link data-pjax relstylesheet hrefhttps://cdn.jsdelivr.net/npm/highlight.js@11.7.0/styles/atom-one-light.css>link relstylesheet hrefhttps://fonts.googleapis.com/css2?familyUbuntu:wght@400;600&familySource+Code+Pro>link data-pjax relstylesheet href/css/default.css>style>body>.footer,body>.navbar,body>.section{opacity:0}/style>!--!-->!--!-->!--!-->!--!-->link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/cookieconsent@3.1.1/build/cookieconsent.min.css>link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/lightgallery@1.10.0/dist/css/lightgallery.min.css>link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/justifiedGallery@3.8.1/dist/css/justifiedGallery.min.css>!--!-->!--!-->!--!-->style>.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#3273dc;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px}/style>script srchttps://cdn.jsdelivr.net/npm/pace-js@1.2.4/pace.min.js type5e24c909843b07102e52c578-text/javascript>/script>!--!-->!--!-->!-- hexo injector head_end start -->script type5e24c909843b07102e52c578-text/javascript> (function () { function switchTab() { if (!location.hash) { return; } const id # + CSS.escape(location.hash.substring(1)); const $tabMenu document.querySelector(`.tabs ahref${id}`); if (!$tabMenu) { return; } const $tabMenuContainer $tabMenu.parentElement.parentElement; Array.from($tabMenuContainer.children).forEach($menu > $menu.classList.remove(is-active)); Array.from($tabMenuContainer.querySelectorAll(a)) .map($menu > document.getElementById($menu.getAttribute(href).substring(1))) .forEach($content > $content.classList.add(is-hidden)); if ($tabMenu) { $tabMenu.parentElement.classList.add(is-active); } const $activeTab document.querySelector(id); if ($activeTab) { $activeTab.classList.remove(is-hidden); } } switchTab(); window.addEventListener(hashchange, switchTab, false); })(); /script>!-- hexo injector head_end end -->meta namegenerator contentHexo 7.3.0>/head>body classis-2-column>nav classnavbar navbar-main>div classcontainer navbar-container>div classnavbar-brand justify-content-center>a classnavbar-item navbar-logo href/>img src/img/logo.svg altSworld height28>/a>/div>div classnavbar-menu>div classnavbar-start>a classnavbar-item is-active href/>主页/a>a classnavbar-item href/archives>存档/a>a classnavbar-item href/tags>标签/a>a classnavbar-item href/about>关于我/a>/div>div classnavbar-end>a classnavbar-item target_blank relnoopener titleView Source on GitHub hrefhttps://github.com/mcthesw/mcthesw.github.io>i classfab fa-github>/i>/a>a classnavbar-item search title搜索 hrefjavascript:;>i classfas fa-search>/i>/a>/div>/div>/div>/nav>section classsection>div classcontainer>div classcolumns>div classcolumn order-2 column-main is-8-tablet is-8-desktop is-8-widescreen>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2025-10-18T07:38:43.000Z title10/18/2025, 7:38:43 AM>2025-10-18/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.208Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>3 分钟读完 (大约481个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2025/10/ca8f2d0d/>解决GithubCopilot补全冲突/a>/p>div classcontent>p>近期在使用Github Copilot时,发现在面对 NES(Next Edit Suggestions) 补全时,按下Tab键经常会出现空格,而非跳转到目标位置,经过一番排查,发现这是因为VSCode的Tab键绑定冲突导致的,本文记录下解决方法。/p>h2 id错误表现>a href#错误表现 classheaderlink title错误表现>/a>错误表现/h2>p>在使用Github Copilot进行代码补全时,按下Tab键并没有跳转到补全建议的位置,而是插入了空格,导致无法顺利接受补全建议,如下图:/p>p>img src/2025/10/ca8f2d0d/example1.png alt产生提示>br>img src/2025/10/ca8f2d0d/example2.png alt出现空格>/p>h2 id调试思路>a href#调试思路 classheaderlink title调试思路>/a>调试思路/h2>p>首先我们启动VSCode的键盘快捷键调试功能,按下code>Ctrl + Shift + P/code>搜索code>shortcut troubleshooting/code>,打开快捷键调试面板。/p>p>img src/2025/10/ca8f2d0d/check1.png alt打开快捷键调试面板>/p>p>发现类似下方的信息:/p>p>img src/2025/10/ca8f2d0d/check2.png alt调试信息>/p>figure classhighlight plaintext>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>/pre>/td>td classcode>pre>span classline>2025-10-18 15:58:06.749 info 窗口 KeybindingService: / Received keydown event - modifiers: , code: Tab, keyCode: 9, key: Tab/span>br>span classline>2025-10-18 15:58:06.749 info 窗口 KeybindingService: | Converted keydown event - modifiers: , code: Tab, keyCode: 2 ('Tab')/span>br>span classline>2025-10-18 15:58:06.749 info 窗口 KeybindingService: | Resolving Tab/span>br>span classline>2025-10-18 15:58:06.749 info 窗口 KeybindingService: \ From 14 keybinding entries, matched tabout, when: editorTextFocus && !editorHasMultipleSelections && !inSnippetMode && !inlineSuggestionVisible && !suggestWidgetVisible, source: user extension albert.TabOut./span>br>span classline>2025-10-18 15:58:06.749 info 窗口 KeybindingService: + Invoking command tabout./span>br>/pre>/td>/tr>/table>/figure>p>显然,Tab键被code>TabOut/code>插件占用了。/p>h2 id解决方法>a href#解决方法 classheaderlink title解决方法>/a>解决方法/h2>p>此时我们可以使用code>Ctrl + K Ctrl + S/code>打开键盘快捷键设置,搜索code>"Tab"/code>,找到code>TabOut: Tab Out/code>,点击右侧的垃圾桶图标删除该快捷键绑定。/p>p>不过也有更好的办法,就是为 code>TabOut/code>插件设置一个条件,使其在Github Copilot补全建议出现时不生效。我们可以将其code>when/code>条件末尾追加code>!inlineEditIsVisible/code>条件,最终得到该条件code>editorTextFocus && !editorHasMultipleSelections && !inSnippetMode && !inlineSuggestionVisible && !suggestWidgetVisible && !inlineEditIsVisible/code> (编辑后按回车保存)。/p>p>现在,就能够正常补全了:/p>p>img src/2025/10/ca8f2d0d/example3.png alt出现补全,可以使用>/p>p>img src/2025/10/ca8f2d0d/example4.png alt日志正常>/p>p>结束后重新按下code>Ctrl + Shift + P/code>搜索code>shortcut troubleshooting/code>以关闭快捷键调试面板。/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2025-03-23T13:34:54.000Z title3/23/2025, 1:34:54 PM>2025-03-23/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.207Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>10 分钟读完 (大约1452个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2025/03/a7485831/>实现egui窗体隐藏和重新展示/a>/p>div classcontent>p>近期在使用 code>egui/code> 时遇到一个问题,我想要将窗体隐藏起来,再通过托盘图标唤出,本来以为如此简单的需求应当非常简单,结果我发现 code>egui/code> 官方的框架 code>eframe/code> 对这个功能的支持并不好,在 GitHub 上长期有着相关讨论,例如a target_blank relnoopener hrefhttps://github.com/emilk/egui/issues/5229#issuecomment-2740135925>这个Issue/a>。/p>p>本文中,我将首先复现 code>eframe/code> 的问题,然后介绍一个通过 code>egui_glow/code> 与 code>egui_winit/code> 实现的解决方案,提供一个尚且能用的示例。/p>h2 id复现问题>a href#复现问题 classheaderlink title复现问题>/a>复现问题/h2>h3 id前置依赖>a href#前置依赖 classheaderlink title前置依赖>/a>前置依赖/h3>p>以下是我的 code>Cargo.toml/code> 文件:/p>figure classhighlight toml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classsection>package/span>/span>br>span classline>span classattr>name/span> span classstring>"test_egui"/span>/span>br>span classline>span classattr>version/span> span classstring>"0.1.0"/span>/span>br>span classline>span classattr>edition/span> span classstring>"2024"/span>/span>br>span classline>/span>br>span classline>span classsection>dependencies/span>/span>br>span classline>span classattr>egui/span> span classstring>"0.31.1"/span>/span>br>span classline>span classattr>eframe/span> span classstring>"0.31.1"/span>/span>br>span classline>span classattr>tokio/span> { version span classstring>"1.44.1"/span>, features span classstring>"full"/span> }/span>br>/pre>/td>/tr>/table>/figure>h3 id问题复现>a href#问题复现 classheaderlink title问题复现>/a>问题复现/h3>p>为了简化问题,我将上述问题抽象成这样一个模型:strong>编写一个rust程序,后台线程控制它定时出现或消失/strong>。/p>p>为了实现这个功能,我们很容易就会写出这样的代码:/p>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>span classline>33/span>br>span classline>34/span>br>span classline>35/span>br>span classline>36/span>br>span classline>37/span>br>span classline>38/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>struct/span> span classtitle class_>MyApp/span> {}/span>br>span classline>/span>br>span classline>span classkeyword>impl/span> span classtitle class_>eframe/span>::App span classkeyword>for/span> span classtitle class_>MyApp/span> {/span>br>span classline> span classkeyword>fn/span> span classtitle function_>update/span>(&span classkeyword>mut/span> span classkeyword>self/span>, ctx: &egui::Context, _frame: &span classkeyword>mut/span> eframe::Frame) {/span>br>span classline> egui::CentralPanel::span classtitle function_ invoke__>default/span>().span classtitle function_ invoke__>show/span>(ctx, |ui| {/span>br>span classline> ui.span classtitle function_ invoke__>horizontal/span>(|ui| {/span>br>span classline> ui.span classtitle function_ invoke__>label/span>(span classstring>"Hello, world!"/span>);/span>br>span classline> });/span>br>span classline> });/span>br>span classline> }/span>br>span classline>}/span>br>span classline>/span>br>span classline>span classkeyword>fn/span> span classtitle function_>main/span>() span classpunctuation>->/span> span classtype>Result/span><(), span classtype>Box/span><span classkeyword>dyn/span> std::error::Error>> {/span>br>span classline> span classkeyword>let/span> span classvariable>rt/span> tokio::runtime::Runtime::span classtitle function_ invoke__>new/span>()?;/span>br>span classline> span classkeyword>let/span> span classvariable>_guard/span> rt.span classtitle function_ invoke__>enter/span>();/span>br>span classline>/span>br>span classline> eframe::span classtitle function_ invoke__>run_native/span>(/span>br>span classline> span classstring>"Egui Test App"/span>,/span>br>span classline> span classbuilt_in>Default/span>::span classtitle function_ invoke__>default/span>(),/span>br>span classline> span classtype>Box/span>::span classtitle function_ invoke__>new/span>(|_cc| {/span>br>span classline> span classkeyword>let/span> span classvariable>ctx/span> _cc.egui_ctx.span classtitle function_ invoke__>clone/span>();/span>br>span classline> rt.span classtitle function_ invoke__>spawn/span>(span classkeyword>async/span> span classkeyword>move/span> {/span>br>span classline> span classkeyword>loop/span> {/span>br>span classline> span classbuilt_in>println!/span>(span classstring>"Running background task..."/span>);/span>br>span classline> ctx.span classtitle function_ invoke__>send_viewport_cmd/span>(egui::ViewportCommand::span classtitle function_ invoke__>Visible/span>(span classliteral>false/span>));/span>br>span classline> ctx.span classtitle function_ invoke__>request_repaint/span>();/span>br>span classline> tokio::time::span classtitle function_ invoke__>sleep/span>(tokio::time::Duration::span classtitle function_ invoke__>from_secs/span>(span classnumber>1/span>)).span classkeyword>await/span>;/span>br>span classline> ctx.span classtitle function_ invoke__>send_viewport_cmd/span>(egui::ViewportCommand::span classtitle function_ invoke__>Visible/span>(span classliteral>true/span>));/span>br>span classline> ctx.span classtitle function_ invoke__>request_repaint/span>();/span>br>span classline> tokio::time::span classtitle function_ invoke__>sleep/span>(tokio::time::Duration::span classtitle function_ invoke__>from_secs/span>(span classnumber>1/span>)).span classkeyword>await/span>;/span>br>span classline> }/span>br>span classline> });/span>br>span classline> span classtitle function_ invoke__>Ok/span>(span classtype>Box/span>::span classtitle function_ invoke__>new/span>(MyApp {}))/span>br>span classline> }),/span>br>span classline> )?;/span>br>span classline>/span>br>span classline> span classtitle function_ invoke__>Ok/span>(())/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>然而很遗憾,这个代码并不能正常工作。我们可以看到,窗体在后台线程中是可以被隐藏的,但是调用 code>ctx.send_viewport_cmd(egui::ViewportCommand::Visible(true));/code> 却没有任何效果,通过打印出来的日志可以看出,循环是正常执行的,但是窗体并没有重新展示出来。br>这是因为 code>eframe/code> 在窗体隐藏时不会去处理这些事件,从 GitHub 的相关讨论来看,目前这是一个没有被解决的问题,因此,我们需要暂时不使用 code>eframe/code>,而是使用 code>egui/code> 的底层库 code>egui_glow/code> 和 code>egui_winit/code> 来实现这个功能。/p>h2 id解决方案>a href#解决方案 classheaderlink title解决方案>/a>解决方案/h2>p>如果我们能够自己处理 code>winit/code> 的事件循环,那么就可以轻松定制有关窗体的行为了,我找到了官方的一个示例:a target_blank relnoopener hrefhttps://github.com/emilk/egui/blob/master/crates/egui_glow/examples/pure_glow.rs>Prue-glow/a>。/p>h3 id更新依赖>a href#更新依赖 classheaderlink title更新依赖>/a>更新依赖/h3>p>既然我们不再使用 code>eframe/code> 了,那么我们需要参照上方链接把 code>Cargo.toml/code> 中的依赖更新为:/p>figure classhighlight toml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>/pre>/td>td classcode>pre>span classline>span classsection>dependencies/span>/span>br>span classline>span classattr>egui/span> span classstring>"0.31.1"/span>/span>br>span classline>span classattr>egui-winit/span> span classstring>"0.31.1"/span>/span>br>span classline>span classattr>winit/span> span classstring>"0.30.9"/span>/span>br>span classline>span classattr>glow/span> span classstring>"0.16.0"/span>/span>br>span classline>span classattr>egui_glow/span> {version span classstring>"0.31.1"/span>, features span classstring>"winit"/span>}/span>br>span classline>span classattr>glutin/span> span classstring>"0.32.2"/span>/span>br>span classline>span classattr>glutin-winit/span> span classstring>"0.5.0"/span>/span>br>span classline>/span>br>span classline>span classattr>tokio/span> { version span classstring>"1.44.1"/span>, features span classstring>"full"/span> }/span>br>span classline>span classattr>log/span> span classstring>"0.4.26"/span>/span>br>/pre>/td>/tr>/table>/figure>h3 id改造后的main>a href#改造后的main classheaderlink title改造后的main>/a>改造后的code>main/code>/h3>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>span classline>33/span>br>span classline>34/span>br>span classline>35/span>br>span classline>36/span>br>span classline>37/span>br>span classline>38/span>br>span classline>39/span>br>span classline>40/span>br>span classline>41/span>br>span classline>42/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>fn/span> span classtitle function_>main/span>() span classpunctuation>->/span> span classtype>Result/span><(), span classtype>Box/span><span classkeyword>dyn/span> std::error::Error>> {/span>br>span classline> span classkeyword>let/span> span classvariable>event_loop/span> winit::event_loop::EventLoop::<event::UserEvent>::span classtitle function_ invoke__>with_user_event/span>()/span>br>span classline> .span classtitle function_ invoke__>build/span>()/span>br>span classline> .span classtitle function_ invoke__>unwrap/span>();/span>br>span classline> span classkeyword>let/span> span classvariable>proxy/span> event_loop.span classtitle function_ invoke__>create_proxy/span>();/span>br>span classline>/span>br>span classline> span classkeyword>let/span> span classvariable>rt/span> tokio::runtime::Runtime::span classtitle function_ invoke__>new/span>()?;/span>br>span classline> span classkeyword>let/span> span classvariable>_guard/span> rt.span classtitle function_ invoke__>enter/span>();/span>br>span classline> span classkeyword>let/span> span classvariable>proxy_clone/span> proxy.span classtitle function_ invoke__>clone/span>(); span classcomment>// !NOTICE: clone the proxy for the background task/span>/span>br>span classline>/span>br>span classline> rt.span classtitle function_ invoke__>spawn/span>(span classkeyword>async/span> span classkeyword>move/span> {/span>br>span classline> span classkeyword>loop/span> {/span>br>span classline> span classbuilt_in>println!/span>(span classstring>"Running background task..."/span>);/span>br>span classline> proxy_clone/span>br>span classline> .span classtitle function_ invoke__>send_event/span>(event::UserEvent::HideWindow)/span>br>span classline> .span classtitle function_ invoke__>unwrap/span>();/span>br>span classline> proxy_clone/span>br>span classline> .span classtitle function_ invoke__>send_event/span>(event::UserEvent::span classtitle function_ invoke__>Redraw/span>(Duration::ZERO))/span>br>span classline> .span classtitle function_ invoke__>unwrap/span>();/span>br>span classline> tokio::time::span classtitle function_ invoke__>sleep/span>(tokio::time::Duration::span classtitle function_ invoke__>from_secs/span>(span classnumber>1/span>)).span classkeyword>await/span>;/span>br>span classline> proxy_clone/span>br>span classline> .span classtitle function_ invoke__>send_event/span>(event::UserEvent::ShowWindow)/span>br>span classline> .span classtitle function_ invoke__>unwrap/span>();/span>br>span classline> proxy_clone/span>br>span classline> .span classtitle function_ invoke__>send_event/span>(event::UserEvent::span classtitle function_ invoke__>Redraw/span>(Duration::ZERO))/span>br>span classline> .span classtitle function_ invoke__>unwrap/span>();/span>br>span classline> tokio::time::span classtitle function_ invoke__>sleep/span>(tokio::time::Duration::span classtitle function_ invoke__>from_secs/span>(span classnumber>1/span>)).span classkeyword>await/span>;/span>br>span classline> }/span>br>span classline> });/span>br>span classline>/span>br>span classline> span classkeyword>let/span> span classkeyword>mut /span>span classvariable>app/span> app::GlowApp::span classtitle function_ invoke__>new/span>(/span>br>span classline> proxy,/span>br>span classline> span classtype>Box/span>::span classtitle function_ invoke__>new/span>(|egui_ctx| {/span>br>span classline> egui::CentralPanel::span classtitle function_ invoke__>default/span>().span classtitle function_ invoke__>show/span>(egui_ctx, |ui| {/span>br>span classline> ui.span classtitle function_ invoke__>heading/span>(span classstring>"Hello World!"/span>);/span>br>span classline> });/span>br>span classline> }),/span>br>span classline> );/span>br>span classline> event_loop.span classtitle function_ invoke__>run_app/span>(&span classkeyword>mut/span> app).span classtitle function_ invoke__>expect/span>(span classstring>"failed to run app"/span>);/span>br>span classline>/span>br>span classline> span classtitle function_ invoke__>Ok/span>(())/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>这是我改造之后的code>main/code> 函数,主要的变化在于我们使用 code>winit/code> 的事件循环来处理窗体的行为。我们在后台线程通过 code>EventLoopProxy<UserEvent>/code> 中发送 code>UserEvent/code> 来控制窗体的显示和隐藏。/p>h3 id事件处理>a href#事件处理 classheaderlink title事件处理>/a>事件处理/h3>p>同理,我们需要实现 code>ApplicationHandler<UserEvent>/code>,这里才是接受并处理 code>UserEvent/code> 的地方。如果你需要管理应用的一些状态,可以直接在 code>GlowApp/code> 结构体中添加相关字段(如我注释掉的 code>AppState/code>),并且在 code>user_event/code> 中处理与更新,这里我只建议进行简单的数据显示等操作,计算的部分还是放在后台比较好,否则会影响到UI的流畅度。另外,你也可能会需要更新 code>update_ui/code> 以接受 code>AppState/code>。/p>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>span classline>33/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>pub/span> span classkeyword>struct/span> span classtitle class_>GlowApp/span> {/span>br>span classline> proxy: winit::event_loop::EventLoopProxy<UserEvent>,/span>br>span classline> gl_window: span classtype>Option/span><GlutinWindowContext>,/span>br>span classline> gl: span classtype>Option/span><Arc<glow::Context>>,/span>br>span classline> egui_glow: span classtype>Option/span><egui_glow::EguiGlow>,/span>br>span classline> repaint_delay: std::time::Duration,/span>br>span classline> clear_color: span classtype>f32/span>; span classnumber>3/span>,/span>br>span classline> window_hidden: span classtype>bool/span>,/span>br>span classline> update_ui: span classtype>Box/span><span classkeyword>dyn/span> span classtitle function_ invoke__>Fn/span>(&egui::Context) + span classbuilt_in>Send/span> + span classbuilt_in>Sync/span> + span classsymbol>'static/span>>,/span>br>span classline> span classcomment>// state: AppState,/span>/span>br>span classline>}/span>br>span classline>/span>br>span classline>span classkeyword>impl/span> span classtitle class_>winit/span>::application::ApplicationHandler<UserEvent> span classkeyword>for/span> span classtitle class_>GlowApp/span> {/span>br>span classline> span classcomment>// ... skip other methods/span>/span>br>span classline> span classkeyword>fn/span> span classtitle function_>user_event/span>(&span classkeyword>mut/span> span classkeyword>self/span>, _event_loop: &winit::event_loop::ActiveEventLoop, event: UserEvent) {/span>br>span classline> span classkeyword>match/span> event {/span>br>span classline> UserEvent::span classtitle function_ invoke__>Redraw/span>(delay) > span classkeyword>self/span>.repaint_delay delay,/span>br>span classline> UserEvent::ShowWindow > {/span>br>span classline> span classkeyword>self/span>.window_hidden span classliteral>false/span>;/span>br>span classline> span classkeyword>if/span> span classkeyword>let/span> span classvariable>Some/span>(span classkeyword>ref/span> gl_window) span classkeyword>self/span>.gl_window {/span>br>span classline> gl_window.span classtitle function_ invoke__>window/span>().span classtitle function_ invoke__>set_visible/span>(span classliteral>true/span>);/span>br>span classline> gl_window.span classtitle function_ invoke__>window/span>().span classtitle function_ invoke__>request_redraw/span>();/span>br>span classline> }/span>br>span classline> }/span>br>span classline> UserEvent::HideWindow > {/span>br>span classline> span classkeyword>self/span>.window_hidden span classliteral>true/span>;/span>br>span classline> span classkeyword>if/span> span classkeyword>let/span> span classvariable>Some/span>(span classkeyword>ref/span> gl_window) span classkeyword>self/span>.gl_window {/span>br>span classline> gl_window.span classtitle function_ invoke__>window/span>().span classtitle function_ invoke__>set_visible/span>(span classliteral>false/span>);/span>br>span classline> }/span>br>span classline> }/span>br>span classline> }/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>h3 id总结>a href#总结 classheaderlink title总结>/a>总结/h3>p>至此,程序窗体就会定时隐藏和重新展示了,若想要实现角标的事件处理功能,可以参考a target_blank relnoopener hrefhttps://docs.rs/tray-icon/latest/tray_icon/#note-for-winit-or-tao-users>这个示例/a>来把 tray 事件添加到我们的事件中,再在 code>user_event/code> 中处理。/p>h3 id完整代码>a href#完整代码 classheaderlink title完整代码>/a>完整代码/h3>p>为什么我不在上方直接呈现出所有代码呢?当然是因为太长了……我认为对于实现简单的需求来说,了解上面的部分就可以很快地上手修改了,把我的(或者官方的)案例复制走即可。当然,我这份代码有许多小问题,不适合直接用于生产环境,请仔细检查后再使用。/p>ul>li>a target_blank relnoopener hrefhttps://github.com/mcthesw/egui-glow-winit-simple-example/tree/cb51c9316140bf4c91468c90429942b93a7c5ad0>复现问题部分代码/a>/li>li>a target_blank relnoopener hrefhttps://github.com/mcthesw/egui-glow-winit-simple-example/tree/main>问题解决代码/a>/li>/ul>p>另外,我也正在尝试构建一个 egui 桌面应用的模版,欢迎关注我的 GitHub 主页:a target_blank relnoopener hrefhttps://github.com/mcthesw>mcthesw/a>,如果成功,我会在这里更新相关信息。/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2025-03-22T08:18:03.000Z title3/22/2025, 8:18:03 AM>2025-03-22/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.206Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>9 分钟读完 (大约1295个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2025/03/e57e33c6/>在Win上编译Rust程序到MacOS和Linux/a>/p>div classcontent>p>我之前写过一篇文章介绍如何在Windows下编译适用于Linux的Rust程序,不过Rust原生的配置方法并不算简单,今天我想介绍一个更简单的方法来编译Rust程序到MacOS和Linux。同理,也可以在这些平台上编译到Windows。/p>h2 idCross-rs>a href#Cross-rs classheaderlink titleCross-rs>/a>Cross-rs/h2>p>a target_blank relnoopener hrefhttps://github.com/cross-rs/cross>Cross-rs/a>是一个Rust的交叉编译工具,在依赖不复杂的情况下,几乎能够一条指令就将Rust程序编译到其他平台。它的原理是使用Docker来运行交叉编译的工具链,因此需要机子上有Docker或Podman。em>这个库也支持测试,这不是本文章关注的内容,因此只在这提一下。/em>/p>h3 id安装>a href#安装 classheaderlink title安装>/a>安装/h3>p>值得注意的是,由于这个项目依赖Docker,所以在编译时需要保持网络畅通,Docker Hub的镜像下载速度可能会很慢,建议使用你能快速访问的镜像源。/p>p>在确保 Rust 工具链、Docker 或 Podman 已经安装的情况下,使用以下命令安装 cross:/p>figure classhighlight bash>table>tr>td classgutter>pre>span classline>1/span>br>/pre>/td>td classcode>pre>span classline>cargo install cross --git https://github.com/cross-rs/cross/span>br>/pre>/td>/tr>/table>/figure>h3 id基本用法>a href#基本用法 classheaderlink title基本用法>/a>基本用法/h3>p>对于简单的项目,安装完成后就可以直接使用 cross 来编译了:/p>figure classhighlight bash>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>/pre>/td>td classcode>pre>span classline>span classcomment># 编译到目标架构是x86_64的Linux/span>/span>br>span classline>cross build --target x86_64-unknown-linux-gnu --release/span>br>span classline>span classcomment># 编译到目标架构是aarch64的Linux/span>/span>br>span classline>cross build --target aarch64-unknown-linux-gnu --release/span>br>/pre>/td>/tr>/table>/figure>p>这里以我以前练手写的一个a target_blank relnoopener hrefhttps://github.com/mcthesw/Socks5-TCP-Demo>Socks5代理/a>软件为例,编译结果如下:/p>figure classhighlight bash>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>/pre>/td>td classcode>pre>span classline>cross build --target x86_64-unknown-linux-gnu --release/span>br>span classline>/span>br>span classline>span classcomment># info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'/span>/span>br>span classline>span classcomment># info: latest update on 2025-03-18, rust version 1.85.1 (4eb161250 2025-03-15)/span>/span>br>span classline>span classcomment># info: downloading component 'cargo'/span>/span>br>span classline>span classcomment># ....../span>/span>br>span classline>span classcomment># info: checking for self-update/span>/span>br>span classline>span classcomment># info: downloading component 'rust-src'/span>/span>br>span classline>span classcomment># info: installing component 'rust-src'/span>/span>br>span classline>/span>br>span classline>span classcomment># Unable to find image 'ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main' locally/span>/span>br>span classline>span classcomment># main: Pulling from cross-rs/x86_64-unknown-linux-gnu/span>/span>br>span classline>span classcomment># d9802f032d67: Pull complete/span>/span>br>span classline>span classcomment># ....../span>/span>br>span classline>span classcomment># b4f2b8f6bece: Pull complete/span>/span>br>span classline>span classcomment># Digest: sha256:e01aa4c146da3834f49ead052f7f9b9cff95e3dd576f909c87cea473bba84e1b/span>/span>br>span classline>span classcomment># Status: Downloaded newer image for ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main/span>/span>br>span classline>/span>br>span classline>span classcomment># Compiling libc v0.2.159/span>/span>br>span classline>span classcomment># ....../span>/span>br>span classline>span classcomment># Compiling tokio-byteorder v0.3.0/span>/span>br>span classline>span classcomment># Compiling socks5_tcp v0.1.0 (/mnt/d/socks5_tcp)/span>/span>br>span classline>span classcomment># Finished `release` profile optimized target(s) in 58.03s/span>/span>br>span classline>/span>br>/pre>/td>/tr>/table>/figure>p>可见,基本上分为以下几个阶段:/p>ol>li>安装目标平台的工具链/li>li>下载用于编译的Docker镜像/li>li>编译程序/li>/ol>p>然后我们就得到了一个在Linux上运行的可执行文件,位于code>target/x86_64-unknown-linux-gnu/release/socks5_tcp/code>。然而,在面对复杂的项目时,可能会需要处理外部依赖;而编译到MacOS或MSVC目标时,需要处理一些额外的配置,请看下方章节。/p>h2 id处理外部依赖>a href#处理外部依赖 classheaderlink title处理外部依赖>/a>处理外部依赖/h2>p>为了对编译过程做一些定制,我们需要在项目根目录下创建一个code>Cross.toml/code>文件,内容如下:/p>figure classhighlight toml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>/pre>/td>td classcode>pre>span classline>span classcomment># 此处格式为 `target.<target-triple>`,可以存在多个不同目标的配置/span>/span>br>span classline>span classsection>target.aarch64-unknown-linux-gnu/span>/span>br>span classline>span classcomment># pre-build 可以在编译前执行一些命令,常用于安装依赖/span>/span>br>span classline>span classattr>pre-build/span> /span>br>span classline> span classstring>"apt-get update"/span>,/span>br>span classline> span classstring>"apt-get install -y libssl-dev"/span>,/span>br>span classline>/span>br>span classline>span classcomment># 也可以用 image 来指定一个Docker镜像/span>/span>br>span classline>span classattr>image/span> span classstring>"test-image"/span>/span>br>span classline>span classcomment># 指定一些环境变量/span>/span>br>span classline>span classattr>env.aaa/span> span classstring>"bbb"/span>/span>br>/pre>/td>/tr>/table>/figure>p>基本上配置方法就是如上,如果需要进一步定制,请参考a target_blank relnoopener hrefhttps://github.com/cross-rs/cross/blob/main/docs/config_file.md>官方文档/a>。/p>h2 id编译到MacOS>a href#编译到MacOS classheaderlink title编译到MacOS>/a>编译到MacOS/h2>p>由于许可原因,code>cross-rs/code>团队无法为我们提供预编译好的镜像,也不被允许分发Apple的SDK,所以我们需要自己以合法方式获取到SDK,进而编译一个镜像。下方我以code>aarch64-apple-darwin/code>为例,其他平台类似。/p>h3 id编译镜像>a href#编译镜像 classheaderlink title编译镜像>/a>编译镜像/h3>p>我们需要克隆code>cross-rs/code>的代码,并更新子模块,完成配置后构建镜像:/p>figure classhighlight bash>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>/pre>/td>td classcode>pre>span classline>span classcomment># Setup cross toolchains/span>/span>br>span classline>git span classbuilt_in>clone/span> https://github.com/cross-rs/cross/span>br>span classline>span classbuilt_in>cd/span> cross/span>br>span classline>git submodule update --init --remote/span>br>span classline>cargo xtask configure-crosstool/span>br>span classline>/span>br>span classline>span classcomment># Build docker images/span>/span>br>span classline>cargo build-docker-image aarch64-apple-darwin-cross --build-arg span classstring>'MACOS_SDK_URLhttps://github.com/joseluisq/macosx-sdks/releases/download/12.3/MacOSX12.3.sdk.tar.xz'/span> --tag span classbuilt_in>local/span>/span>br>span classline>/span>br>span classline>span classcomment># Compile our application/span>/span>br>span classline>cross build --target aarch64-apple-darwin --release/span>br>/pre>/td>/tr>/table>/figure>p>构建对SDK版本要求如下:/p>ul>li>i686-apple-darwin: SDK <= 10.13/li>li>x86_64-apple-darwin: SDK <= 13.0 or SDK <= 12.4/li>li>aarch64-apple-darwin: SDK >= 10.16 and (SDK <= 13.0 or SDK <= 12.4)/li>/ul>h3 id配置-Cross-tomml>a href#配置-Cross-tomml classheaderlink title配置 Cross.tomml>/a>配置 code>Cross.tomml/code>/h3>p>构建完毕后,就很简单了,我们只需要在项目根目录下创建一个code>Cross.toml/code>文件,指定对应目标使用我们的本地镜像,内容如下:/p>figure classhighlight toml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>/pre>/td>td classcode>pre>span classline>span classcomment># Reference: https://github.com/cross-rs/cross-toolchains/span>/span>br>span classline>span classsection>target.aarch64-apple-darwin/span>/span>br>span classline>span classattr>image/span> span classstring>"ghcr.io/cross-rs/aarch64-apple-darwin-cross:local"/span>/span>br>/pre>/td>/tr>/table>/figure>p>后续的编译就和Linux一样了,不再赘述。/p>h2 id编译到Windows>a href#编译到Windows classheaderlink title编译到Windows>/a>编译到Windows/h2>p>MSVC或许是Windows下最优的目标,然而为了方便起见,我还是选择了GNU工具链。我们可以使用code>x86_64-pc-windows-gnu/code>或code>i686-pc-windows-gnu/code>作为目标,编译方法和Linux类似:/p>figure classhighlight bash>table>tr>td classgutter>pre>span classline>1/span>br>/pre>/td>td classcode>pre>span classline>cross build --target x86_64-pc-windows-gnu --release/span>br>/pre>/td>/tr>/table>/figure>p>这样我们就能够在Linux或MacOS上编译出Windows下的可执行文件了,不需要配置MSVC。如果你非常想要MSVC的编译结果,请自行阅读a target_blank relnoopener hrefhttps://github.com/cross-rs/cross-toolchains>官方仓库/a>的README和Issue吧。/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2024-12-29T13:07:50.000Z title12/29/2024, 1:07:50 PM>2024-12-29/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.216Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>1 分钟读完 (大约183个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2024/12/7368f4eb/>解决Tauri2无法拖拽/a>/p>div classcontent>p>近期将我的a target_blank relnoopener hrefhttps://github.com/mcthesw/game-save-manager>游戏存档管理器/a>迁移到Tauri2出现点问题,想起来以前V1的时候也遇到过这个问题,故记录下来。/p>p>具体问题就是在前端一个可拖拽组件没有办法被拖动,处理方式很简单,直接修改code>src-tauri/tauri.conf.json/code>文件,将code>dragDropEnabled/code>设为code>false/code>,作为参考,请看:/p>figure classhighlight json>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>span classline>33/span>br>span classline>34/span>br>span classline>35/span>br>span classline>36/span>br>span classline>37/span>br>span classline>38/span>br>/pre>/td>td classcode>pre>span classline>span classpunctuation>{/span>/span>br>span classline> span classattr>"$schema"/span>span classpunctuation>:/span> span classstring>"../node_modules/@tauri-apps/cli/config.schema.json"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"productName"/span>span classpunctuation>:/span> span classstring>"game-save-manager"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"identifier"/span>span classpunctuation>:/span> span classstring>"com.game-save-manager"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"build"/span>span classpunctuation>:/span> span classpunctuation>{/span>/span>br>span classline> span classattr>"frontendDist"/span>span classpunctuation>:/span> span classstring>"../dist"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"devUrl"/span>span classpunctuation>:/span> span classstring>"http://localhost:3000"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"beforeDevCommand"/span>span classpunctuation>:/span> span classstring>"pnpm web:dev"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"beforeBuildCommand"/span>span classpunctuation>:/span> span classstring>"pnpm web:generate"/span>/span>br>span classline> span classpunctuation>}/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"app"/span>span classpunctuation>:/span> span classpunctuation>{/span>/span>br>span classline> span classattr>"windows"/span>span classpunctuation>:/span> span classpunctuation>/span>/span>br>span classline> span classpunctuation>{/span>/span>br>span classline> span classattr>"title"/span>span classpunctuation>:/span> span classstring>"Game Save Manager"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"width"/span>span classpunctuation>:/span> span classnumber>1280/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"height"/span>span classpunctuation>:/span> span classnumber>720/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"resizable"/span>span classpunctuation>:/span> span classliteral>span classkeyword>true/span>/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"fullscreen"/span>span classpunctuation>:/span> span classliteral>span classkeyword>false/span>/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"dragDropEnabled"/span>span classpunctuation>:/span> span classliteral>span classkeyword>false/span>/span>/span>br>span classline> span classpunctuation>}/span>/span>br>span classline> span classpunctuation>/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"security"/span>span classpunctuation>:/span> span classpunctuation>{/span>/span>br>span classline> span classattr>"csp"/span>span classpunctuation>:/span> span classliteral>span classkeyword>null/span>/span>/span>br>span classline> span classpunctuation>}/span>/span>br>span classline> span classpunctuation>}/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"bundle"/span>span classpunctuation>:/span> span classpunctuation>{/span>/span>br>span classline> span classattr>"active"/span>span classpunctuation>:/span> span classliteral>span classkeyword>true/span>/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"targets"/span>span classpunctuation>:/span> span classstring>"all"/span>span classpunctuation>,/span>/span>br>span classline> span classattr>"icon"/span>span classpunctuation>:/span> span classpunctuation>/span>/span>br>span classline> span classstring>"icons/32x32.png"/span>span classpunctuation>,/span>/span>br>span classline> span classstring>"icons/128x128.png"/span>span classpunctuation>,/span>/span>br>span classline> span classstring>"icons/a href/cdn-cgi/l/email-protection class__cf_email__ data-cfemail3504070d4d04070d75074d1b455b52>email protected/a>"/span>span classpunctuation>,/span>/span>br>span classline> span classstring>"icons/icon.icns"/span>span classpunctuation>,/span>/span>br>span classline> span classstring>"icons/icon.ico"/span>/span>br>span classline> span classpunctuation>/span>/span>br>span classline> span classpunctuation>}/span>/span>br>span classline>span classpunctuation>}/span>/span>br>span classline>/span>br>/pre>/td>/tr>/table>/figure>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2024-09-26T08:24:23.000Z title9/26/2024, 8:24:23 AM>2024-09-26/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.202Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>3 分钟读完 (大约476个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2024/09/185a27cb/>Avalonia采用AOT编译后无法运行解决办法/a>/p>div classcontent>p>近日在制作Avalonia程序过程中,发现调试时很正常,发布后却无法运行,感觉很奇怪,我的发布配置有以下两条:/p>figure classhighlight xml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>/pre>/td>td classcode>pre>span classline>span classtag><span classname>PublishTrimmed/span>>/span>Truespan classtag></span classname>PublishTrimmed/span>>/span>/span>br>span classline>span classtag><span classname>PublishAot/span> span classattr>Condition/span>span classstring>"'$(Configuration)' ! 'Debug'"/span>>/span>truespan classtag></span classname>PublishAot/span>>/span>/span>br>/pre>/td>/tr>/table>/figure>p>第一条启用了裁剪,第二条启用了AOT编译(但是在开发时没开启,因为预览窗口不支持AOT)/p>p>经过一番排查,发现这两个都有问题:/p>ol>li>反射对AOT不友好,我的code>ViewLocator.cs/code>使用了反射来创建对象/li>li>有的库对剪裁支持不好,因此要对其关闭剪裁/li>/ol>h2 id解决方案>a href#解决方案 classheaderlink title解决方案>/a>解决方案/h2>h3 id问题1-消除反射>a href#问题1-消除反射 classheaderlink title问题1: 消除反射>/a>问题1: 消除反射/h3>p>原代码使用反射创建对象:/p>figure classhighlight csharp>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>public/span> Control? Build(span classbuilt_in>object/span>? param)/span>br>span classline>{/span>br>span classline> span classkeyword>if/span> (param ! span classliteral>null/span> && param span classkeyword>is/span> ViewModelBase)/span>br>span classline> {/span>br>span classline> span classkeyword>var/span> viewModelType param.GetType();/span>br>span classline> span classkeyword>if/span> (_viewModelViewMappings.TryGetValue(viewModelType, span classkeyword>out/span> span classkeyword>var/span> viewType))/span>br>span classline> {/span>br>span classline> span classkeyword>return/span> (Control)Activator.CreateInstance(viewType)!; span classcomment>// 这里使用了反射/span>/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> span classkeyword>new/span> TextBlock { Text span classstring>"Not Found: "/span> + viewModelType.FullName };/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> span classliteral>null/span>;/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>修改后使用工厂方法:/p>figure classhighlight csharp>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>public/span> Control? Build(span classbuilt_in>object/span>? param)/span>br>span classline>{/span>br>span classline> span classkeyword>if/span> (param ! span classliteral>null/span> && param span classkeyword>is/span> ViewModelBase)/span>br>span classline> {/span>br>span classline> span classkeyword>var/span> viewModelType param.GetType();/span>br>span classline> span classkeyword>if/span> (_viewModelViewMappings.TryGetValue(viewModelType, span classkeyword>out/span> span classkeyword>var/span> viewFactory))/span>br>span classline> {/span>br>span classline> span classkeyword>return/span> viewFactory(); span classcomment>// 使用了工厂方法/span>/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> span classkeyword>new/span> TextBlock { Text span classstring>"Not Found: "/span> + viewModelType.FullName };/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> span classliteral>null/span>;/span>br>span classline>}/span>br>span classline>/span>br>/pre>/td>/tr>/table>/figure>p>这样就可以消除反射了/p>h3 id问题2-关闭特定库的剪裁>a href#问题2-关闭特定库的剪裁 classheaderlink title问题2: 关闭特定库的剪裁>/a>问题2: 关闭特定库的剪裁/h3>p>发布时我注意到很多这样的剪裁警告/p>figure classhighlight text>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>/pre>/td>td classcode>pre>span classline>2>Assembly 'Serilog' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries/span>br>span classline>2>Assembly 'ReactiveUI' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries/span>br>span classline>2>Assembly 'SukiUI' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries/span>br>span classline>2>Assembly 'Avalonia.Controls.DataGrid' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries/span>br>span classline>2>Assembly 'Avalonia.Controls.DataGrid' produced AOT analysis warnings./span>br>/pre>/td>/tr>/table>/figure>p>因此我修改项目的sln文件,增加以下片段,通过外部的xml文件来限制剪裁/p>figure classhighlight xml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>/pre>/td>td classcode>pre>span classline>span classtag><span classname>ItemGroup/span>>/span>/span>br>span classline> span classtag><span classname>TrimmerRootDescriptor/span> span classattr>Include/span>span classstring>"TrimmerRoots.xml"/span> />/span>/span>br>span classline>span classtag></span classname>ItemGroup/span>>/span>/span>br>/pre>/td>/tr>/table>/figure>p>下面是code>TrimmerRoots.xml/code>的内容/p>figure classhighlight xml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classmeta><?xml versionspan classstring>"1.0"/span> encodingspan classstring>"utf-8"/span> ?>/span>/span>br>span classline>span classtag><span classname>linker/span>>/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"Serilog"/span> />/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"Serilog.Sinks.Console"/span> />/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"Serilog.Sinks.File"/span> />/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"ReactiveUI"/span> />/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"SukiUI"/span> />/span>/span>br>span classline> span classtag><span classname>assembly/span> span classattr>fullname/span>span classstring>"Serilog.Sinks.File"/span> />/span>/span>br>span classline>span classtag></span classname>linker/span>>/span>/span>br>/pre>/td>/tr>/table>/figure>p>我将所有报警告的项目都加入了进去,虽然后面的编译依旧有新的警告,但是程序可以正常运行了。至此,所有问题解决。/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2024-09-25T16:12:30.000Z title9/25/2024, 4:12:30 PM>2024-09-26/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.202Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>1 分钟读完 (大约159个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2024/09/79759d31/>Avalonia Unable to resolve property or method of name 'xxx' on type 'XamlX.TypeSystem.XamlPseudoType'解决办法/a>/p>div classcontent>p>近期我在使用Avalonia编写桌面程序时,用到了ItemRepeater组件,写出来大概是这样/p>figure classhighlight xml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>/pre>/td>td classcode>pre>span classline>span classtag><span classname>UserControl/span> span classattr>xmlns/span>span classstring>"https://github.com/avaloniaui"/span>/span>/span>br>span classline>span classtag> span classattr>xmlns:x/span>span classstring>"http://schemas.microsoft.com/winfx/2006/xaml"/span>/span>/span>br>span classline>span classtag> span classattr>xmlns:d/span>span classstring>"http://schemas.microsoft.com/expression/blend/2008"/span>/span>/span>br>span classline>span classtag> span classattr>xmlns:mc/span>span classstring>"http://schemas.openxmlformats.org/markup-compatibility/2006"/span>/span>/span>br>span classline>span classtag> span classattr>mc:Ignorable/span>span classstring>"d"/span> span classattr>d:DesignWidth/span>span classstring>"800"/span> span classattr>d:DesignHeight/span>span classstring>"450"/span>/span>/span>br>span classline>span classtag> span classattr>xmlns:vm/span>span classstring>"clr-namespace:CooingOwl.ViewModels"/span>/span>/span>br>span classline>span classtag> span classattr>xmlns:suki/span>span classstring>"clr-namespace:SukiUI.Controls;assemblySukiUI"/span>/span>/span>br>span classline>span classtag> span classattr>x:DataType/span>span classstring>"vm:ExploreViewModel"/span>/span>/span>br>span classline>span classtag> span classattr>x:Class/span>span classstring>"CooingOwl.Views.ExploreView"/span>>/span>/span>br>span classline>/span>br>span classline> span classtag><span classname>ScrollViewer/span> span classattr>HorizontalScrollBarVisibility/span>span classstring>"Auto"/span>>/span>/span>br>span classline> span classtag><span classname>ItemsRepeater/span> span classattr>ItemsSource/span>span classstring>"{Binding B}"/span> span classattr>Margin/span>span classstring>"16"/span>>/span>/span>br>span classline> span classtag><span classname>ItemsRepeater.Layout/span>>/span>/span>br>span classline> span classtag><span classname>StackLayout/span> span classattr>Spacing/span>span classstring>"20"/span>/span>/span>br>span classline>span classtag> span classattr>Orientation/span>span classstring>"Vertical"/span> />/span>/span>br>span classline> span classtag></span classname>ItemsRepeater.Layout/span>>/span>/span>br>span classline> span classtag><span classname>ItemsRepeater.ItemTemplate/span>>/span>/span>br>span classline> span classtag><span classname>DataTemplate/span>>/span>/span>br>span classline> span classtag><span classname>suki:GlassCard/span>>/span>/span>br>span classline> span classtag><span classname>StackPanel/span> span classattr>Orientation/span>span classstring>"Vertical"/span>>/span>/span>br>span classline> span classtag><span classname>TextBlock/span> span classattr>Text/span>span classstring>"{Binding Name}"/span>/>/span>/span>br>span classline> span classtag><span classname>TextBlock/span> span classattr>Margin/span>span classstring>"4 0"/span> span classattr>FontWeight/span>span classstring>"Bold"/span>/span>/span>br>span classline>span classtag> span classattr>Text/span>span classstring>"{Binding Id}"/span>/>/span>/span>br>span classline> span classtag></span classname>StackPanel/span>>/span>/span>br>span classline> span classtag></span classname>suki:GlassCard/span>>/span>/span>br>span classline> span classtag></span classname>DataTemplate/span>>/span>/span>br>span classline> span classtag></span classname>ItemsRepeater.ItemTemplate/span>>/span>/span>br>span classline> span classtag></span classname>ItemsRepeater/span>>/span>/span>br>span classline> span classtag></span classname>ScrollViewer/span>>/span>/span>br>span classline>/span>br>span classline>span classtag></span classname>UserControl/span>>/span>/span>br>span classline>/span>br>/pre>/td>/tr>/table>/figure>p>其中code><TextBlock Text"{Binding Name}"/>/code>和code>Text"{Binding Id}"/>/code>产生了报错code>AVLN2000 Unable to resolve property or method of name 'Id' on type 'XamlX.TypeSystem.XamlPseudoType'./code>,查看类型code>ExploreViewModel/code>,定义大概如下/p>figure classhighlight csharp>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>public/span> span classkeyword>class/span> span classtitle>ExploreViewModel/span> : span classtitle>ViewModelBase/span>/span>br>span classline>{/span>br>span classline> span classkeyword>public/span> A B { span classkeyword>get/span>; span classkeyword>set/span>; } span classkeyword>new/span> A { ... };/span>br>span classline>}/span>br>span classline>/span>br>span classline>span classkeyword>public/span> span classkeyword>class/span> span classtitle>A/span>{/span>br>span classline> span classbuilt_in>int/span> Id,/span>br>span classline> span classbuilt_in>string/span> Name/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>造成该问题的原因是我需要使用的属性B是一个原始的数组,这里应该使用code>ObservableCollection/code>因此解决方案是做出如下修改/p>figure classhighlight csharp>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>public/span> span classkeyword>class/span> span classtitle>ExploreViewModel/span> : span classtitle>ViewModelBase/span>/span>br>span classline>{/span>br>span classline> span classkeyword>public/span> ObservableCollection<Assistant> Assistants { span classkeyword>get/span>; span classkeyword>set/span>; } span classkeyword>new/span> (span classkeyword>new/span> List<Assistant>{...});/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>至此能够成功编译运行/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2024-09-12T03:15:19.000Z title9/12/2024, 3:15:19 AM>2024-09-12/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.206Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>2 分钟读完 (大约270个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2024/09/6a5cbb2e/>Scoop意外卸载的处理办法/a>/p>div classcontent>p>这几天发现电脑上的a target_blank relnoopener hrefhttps://scoop.sh/>Scoop/a>莫名其妙消失了,我觉得可能是UniGetUI的问题,总之我的Scoop被卸载了,使用Scoop安装的软件的环境变量也失效了,这导致我写代码的相关环境无法使用。br>在重新安装Scoop后,环境变量没有恢复,而我发现路径code>C:\Users\用户名\scoop/code>没有丢失,那么说明软件文件和持久化数据应该没有丢失,寻找一些资料后,我在a target_blank relnoopener hrefhttps://github.com/ScoopInstaller/Scoop/issues/4241>一篇Github Issue/a>中找到了解决办法,如果你遇到了相同的问题,可以尝试按照以下步骤解决:/p>figure classhighlight pwsh>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>/pre>/td>td classcode>pre>span classline>span classbuilt_in>cd/span> C:\Users\用户名\scoop\apps/span>br>span classline>scoop reset */span>br>/pre>/td>/tr>/table>/figure>p>我在重新安装Scoop并且进行了该操作后,成功恢复了大多数软件对应的环境,除了一些我已经打开的一些软件没有恢复,不过后面也可以手动code>scoop reset 软件名/code>来单独进行恢复/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2024-09-04T05:50:05.000Z title9/4/2024, 5:50:05 AM>2024-09-04/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.202Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>4 分钟读完 (大约582个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2024/09/2a91406b/>Nuxt.js content使用项目组件报错/a>/p>div classcontent>h2 id问题描述>a href#问题描述 classheaderlink title问题描述>/a>问题描述/h2>p>最近使用 Nuxt.js 的 a target_blank relnoopener hrefhttps://nuxt.com/modules/content>Content 模块/a>时,发现其支持项目中写好的 Vue 组件,相关文档可以参考 a target_blank relnoopener hrefhttps://content.nuxt.com/usage/markdown#vue-components>这里/a>br>我在页面中尝试添加如下组件,该组件位于code>~/components/XXX/VideoArea.vue/code>/p>figure classhighlight plaintext>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>span classline>25/span>br>span classline>26/span>br>span classline>27/span>br>span classline>28/span>br>span classline>29/span>br>span classline>30/span>br>span classline>31/span>br>span classline>32/span>br>span classline>33/span>br>span classline>34/span>br>span classline>35/span>br>span classline>36/span>br>span classline>37/span>br>/pre>/td>td classcode>pre>span classline><script setup lang"ts">/span>br>span classline>import ArtPlayer from "artplayer"/span>br>span classline>/span>br>span classline>const art_ref ref<HTMLInputElement | null>(null)/span>br>span classline>const art_instance ref<Artplayer | null>(null);/span>br>span classline>/span>br>span classline>const props defineProps<{ url: string }>()/span>br>span classline>/span>br>span classline>onMounted(() > {/span>br>span classline> if (!art_ref.value) return/span>br>span classline> // 文档参考: https://artplayer.org/document/start/option.html/span>br>span classline> art_instance.value new ArtPlayer({/span>br>span classline> // 指定播放器的容器元素/span>br>span classline> container: art_ref.value,/span>br>span classline> // 设置视频的 URL/span>br>span classline> url: props.url,/span>br>span classline> // 启用自动迷你模式/span>br>span classline> autoMini: true,/span>br>span classline> // 启用自动调整大小/span>br>span classline> autoSize: true,/span>br>span classline> // 启用全屏模式/span>br>span classline> fullscreen: true,/span>br>span classline> // 使用服务器端渲染/span>br>span classline> // useSSR: true,/span>br>span classline> // 启用快进功能/span>br>span classline> fastForward: true,/span>br>span classline> // 锁定播放器界面/span>br>span classline> lock: true/span>br>span classline> })/span>br>span classline>})/span>br>span classline></script>/span>br>span classline>/span>br>span classline><template>/span>br>span classline> <div ref"art_ref" class"h-96 mr-auto">/span>br>span classline> <slot></slot>/span>br>span classline> </div>/span>br>span classline></template>/span>br>/pre>/td>/tr>/table>/figure>p>对应 Content/p>figure classhighlight plaintext>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>/pre>/td>td classcode>pre>span classline>---/span>br>span classline>title: '标题'/span>br>span classline>description: '简述'/span>br>span classline>---/span>br>span classline>::xxx-video-area{url"视频链接"}/span>br>span classline>视频描述/span>br>span classline>::/span>br>/pre>/td>/tr>/table>/figure>p>发现启动后报错 code>If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement./code>,后来发现可能是没有设定全局组件,文档中有提到:/p>blockquote>p>Components that are used in Markdown has to be marked as global in your Nuxt app if you don’t use the components/content/ directory, visit Nuxt 3 docs to learn more about it.br>如果在Nuxt应用中使用的组件未放置在components/content/目录下,则需将其标记为全局组件。/p>/blockquote>p>对比一下,我的组件在code>~/components/XXX//code>下,而不是在code>~/components/content//code>下,因此无法访问到该组件。/p>h3 id解决方案>a href#解决方案 classheaderlink title解决方案>/a>解决方案/h3>h3 id方案一:将组件移动到-components-content-目录下>a href#方案一:将组件移动到-components-content-目录下 classheaderlink title方案一:将组件移动到~/components/content/目录下>/a>方案一:将组件移动到code>~/components/content//code>目录下/h3>p>假设你的组件仅用于内容页面,可以将其移动到code>~/components/content//code>目录下,这样 Nuxt Content 模块会自动识别并加载这些组件。/p>h3 id方案二:将组件名称改为VideoArea-global-vue>a href#方案二:将组件名称改为VideoArea-global-vue classheaderlink title方案二:将组件名称改为VideoArea.global.vue>/a>方案二:将组件名称改为code>VideoArea.global.vue/code>/h3>p>参考a target_blank relnoopener hrefhttps://nuxt.com/docs/guide/directory-structure/components#dynamic-components>官方文档/a>,我们修改文件后缀名也可以达到全局化的效果/p>h3 id方案三:将所有组件默认设为全局>a href#方案三:将所有组件默认设为全局 classheaderlink title方案三:将所有组件默认设为全局>/a>方案三:将所有组件默认设为全局/h3>p>在code>nuxt.config.ts/code>中,我们需要增加组件选项,设为全局即可/p>figure classhighlight ts>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>export/span> span classkeyword>default/span> span classtitle function_>defineNuxtConfig/span>({/span>br>span classline> span classattr>compatibilityDate/span>: span classstring>'2024-04-03'/span>,/span>br>span classline> span classattr>devtools/span>: { span classattr>enabled/span>: span classliteral>true/span> },/span>br>span classline> span classattr>css/span>: span classstring>'~/assets/css/main.css'/span>,/span>br>span classline>/span>br>span classline> span classattr>postcss/span>: {/span>br>span classline> span classattr>plugins/span>: {/span>br>span classline> span classattr>tailwindcss/span>: {},/span>br>span classline> span classattr>autoprefixer/span>: {},/span>br>span classline> },/span>br>span classline> },/span>br>span classline>/span>br>span classline> span classattr>modules/span>: span classstring>'@nuxt/content'/span>,/span>br>span classline>/span>br>span classline> span classcomment>// 为了适配 Nuxt content 必须全局注册/span>/span>br>span classline> span classcomment>// 注意下面这块,上面的如果你和我不同不需要改动/span>/span>br>span classline> span classattr>components/span>: {/span>br>span classline> span classattr>global/span>: span classliteral>true/span>,/span>br>span classline> span classattr>dirs/span>: span classstring>'~/components'/span>/span>br>span classline> },/span>br>span classline>})/span>br>/pre>/td>/tr>/table>/figure>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2022-11-25T15:47:54.000Z title11/25/2022, 3:47:54 PM>2022-11-25/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.206Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>2 分钟读完 (大约277个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2022/11/ca23820f/>在Win下编译适用于Linux的Rust程序/a>/p>div classcontent>p>最近在尝试在 Windows11 下编译 Linux 可用的程序时遇到了不少问题,我这里总结一个简单的编译方法供大家参考(不过现在都有WSL了,是不是直接在上面编译更好?)/p>h1 id具体方法>a href#具体方法 classheaderlink title具体方法>/a>具体方法/h1>h2 id安装工具链>a href#安装工具链 classheaderlink title安装工具链>/a>安装工具链/h2>p>code>rustup target add x86_64-unknown-linux-musl/code> 使用 musl 进行静态连接工具链br>你可以使用code>rustup target list/code>指令来检查自己是否装好了工具链br>img src/2022/11/ca23820f/1.jpg alt检查工具链>/p>h2 id修改-Cargo-配置>a href#修改-Cargo-配置 classheaderlink title修改 Cargo 配置>/a>修改 Cargo 配置/h2>p>在 ~/.cargo/config.toml (如果没有请自己创建) 内加上/p>figure classhighlight toml>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>/pre>/td>td classcode>pre>span classline>span classsection>target.x86_64-unknown-linux-musl/span>/span>br>span classline>span classattr>linker/span> span classstring>"rust-lld"/span>/span>br>/pre>/td>/tr>/table>/figure>p>img src/2022/11/ca23820f/2.jpg altCargo配置>/p>h2 id进行编译和测试>a href#进行编译和测试 classheaderlink title进行编译和测试>/a>进行编译和测试/h2>p>使用code>cargo build --targetx86_64-unknown-linux-musl/code>就可以进行编译你的项目了,或者也可以用code>cargo build --target x86_64-unknown-linux-musl --release/code>来构建 release 模式的br>img src/2022/11/ca23820f/3.jpg alt进行编译>br>可见,很快就编译好了,下面我使用 WSL2 运行该程序测试正确性,代码如下(虽然这个不重要)br>img src/2022/11/ca23820f/4.jpg alt程序代码>br>运行结果如下br>img src/2022/11/ca23820f/5.jpg alt运行结果>br>可见,一切顺利,结束!/p>/div>/article>/div>div classcard>article classcard-content article rolearticle>div classarticle-meta is-size-7 is-uppercase level is-mobile>div classlevel-left>span classlevel-item>time dateTime2022-11-16T22:25:34.000Z title11/16/2022, 10:25:34 PM>2022-11-17/time>发表/span>span classlevel-item>time dateTime2025-10-18T08:07:00.203Z title10/18/2025, 8:07:00 AM>2025-10-18/time>更新/span>span classlevel-item>5 分钟读完 (大约823个字)/span>/div>/div>p classtitle is-3 is-size-4-mobile>a classlink-muted href/2022/11/f1689981/>Rust萌新之路-变量、函数和判断/a>/p>div classcontent>h1 id我推荐的布局介绍>a href#我推荐的布局介绍 classheaderlink title我推荐的布局介绍>/a>我推荐的布局介绍/h1>p>我推荐使用 Vscode 再安装 Rust-Analyzer 插件进行刷题,记得在开刷之前先执行 code>rustlings lsp/code> 来启用语法提示,下面给大家看看各个布局窗口的作用br>img src/2022/11/f1689981/1.png alt在命令行运行rustlings指令>br>1号区域是终端,我在里面启动了 code>rustlings watch/code> 来检查进度,2号区域是各个题目(所有的题目都在 exercises 文件夹内),3号区域就是代码编辑框了,这样简简单单就可以开始了/p>h1 idIntro-和-Variables>a href#Intro-和-Variables classheaderlink titleIntro 和 Variables>/a>Intro 和 Variables/h1>p>Intro 部分其实没什么好看的,主要是教你如何使用 Rustlings ,在终端中提示通过编译后,你把注释中的 code>// I AM NOT DONE/code> 删掉就可以了/p>p>Variables 里面的东西也比较简单,主要就是考变量的初始化语法、未初始化不能使用、如何创建可变变量、重新申明变量、常量必须指明类型这些,基本上没有什么问题,就不赘述了。/p>h1 idFunctions-和-If>a href#Functions-和-If classheaderlink titleFunctions 和 If>/a>Functions 和 If/h1>p>Functions 内的内容也比较基础,主要考察了函数的创建、参数的定义和传入、返回值的定义方式、通过去掉分号来返回一个值br>很轻松就能解决这一块,我也认为这一块不会出现什么问题,也不多讲了。/p>p>If 的第一题体现了我很喜欢的一点,就是 Rust 中的 if 语句是有返回值的,同样可以用去掉分号来表示返回,整体也可以作为函数的返回值,因此这题我的答案是这样的/p>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>pub/span> span classkeyword>fn/span> span classtitle function_>bigger/span>(a: span classtype>i32/span>, b: span classtype>i32/span>) span classpunctuation>->/span> span classtype>i32/span> {/span>br>span classline> span classkeyword>if/span> a>b {/span>br>span classline> a/span>br>span classline> }span classkeyword>else/span> {/span>br>span classline> b/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>第二题也类似,答案如下/p>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>pub/span> span classkeyword>fn/span> span classtitle function_>foo_if_fizz/span>(fizzish: &span classtype>str/span>) span classpunctuation>->/span> &span classtype>str/span> {/span>br>span classline> span classkeyword>if/span> fizzish span classstring>"fizz"/span> {/span>br>span classline> span classstring>"foo"/span>/span>br>span classline> } span classkeyword>else/span> span classkeyword>if/span> fizzish span classstring>"fuzz"/span> {/span>br>span classline> span classstring>"bar"/span>/span>br>span classline> }span classkeyword>else/span> {/span>br>span classline> span classstring>"baz"/span>/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>不过这里其实有一个比较有意思的地方,返回值是一个code>&str/code>,新手可能会忘记为什么这里不需要标注生命周期,请让我来解释一下,这是因为这个函数满足了strong>生命周期省略规则/strong>,我认为这里满足的是“如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数”,所以我觉得函数签名应该等价于 code>pub fn foo_if_fizz<'a>(fizzish: &'a str) -> &'a str/code> ,不过考虑到字符串字面量的生命周期是 code>'static/code> ,我认为这里也可以是 code>pub fn foo_if_fizz(fizzish: &str) -> &'static str/code>,具体是什么样希望能有大神指出。/p>h1 idQuiz1>a href#Quiz1 classheaderlink titleQuiz1>/a>Quiz1/h1>p>终于到了第一个小测验了,这也会是第一篇的最后一题,这是关于上面的 Variables、Functions 和 If 的测验。br>对于写完前面的你应该算是简简单单/p>figure classhighlight rust>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>fn/span> span classtitle function_>calculate_price_of_apples/span>(num:span classtype>i32/span>)span classpunctuation>->/span>span classtype>i32/span>{/span>br>span classline> span classkeyword>if/span> num>span classnumber>40/span>{/span>br>span classline> num/span>br>span classline> }span classkeyword>else/span>{/span>br>span classline> num*span classnumber>2/span>/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>本章到此就结束了/p>h1 id有用的其他参考>a href#有用的其他参考 classheaderlink title有用的其他参考>/a>有用的其他参考/h1>ul>li>a target_blank relnoopener hrefhttps://github.com/mcthesw/my-rustlings-solution>我在 v4.4.0 版本的解答仓库/a>/li>li>a target_blank relnoopener hrefhttps://github.com/alexxroche/rustlings-idiomatic-solutions>rustlings-idiomatic-solution/a>/li>li>a target_blank relnoopener hrefhttps://rustwiki.org/>Rust 文档网 - Rust 官方文档中文教程 (rustwiki.org)/a>/li>li>a hrefhttps://blog.sworld.club/>本文的首发地址(我的博客)/a>/li>/ul>/div>/article>/div>nav classpagination rolenavigation aria-labelpagination>div classpagination-previous is-invisible is-hidden-mobile>a href/page/0/>上一页/a>/div>div classpagination-next>a href/page/2/>下一页/a>/div>ul classpagination-list is-hidden-mobile>li>a classpagination-link is-current href/>1/a>/li>li>a classpagination-link href/page/2/>2/a>/li>/ul>/nav>/div>div classcolumn column-left is-4-tablet is-4-desktop is-4-widescreen order-1>div classcard widget data-typeprofile>div classcard-content>nav classlevel>div classlevel-item has-text-centered flex-shrink-1>div>figure classimage is-128x128 mx-auto mb-2>img classavatar is-rounded srchttps://avatars.githubusercontent.com/u/61224072 altSworld>/figure>p classtitle is-size-4 is-block styleline-height:inherit;>Sworld/p>p classis-size-6 is-block>The only way to do great work is to love what you do./p>p classis-size-6 is-flex justify-content-center>i classfas fa-map-marker-alt mr-1>/i>span>China/span>/p>/div>/div>/nav>nav classlevel is-mobile>div classlevel-item has-text-centered is-marginless>div>p classheading>文章/p>a href/archives/>p classtitle>12/p>/a>/div>/div>div classlevel-item has-text-centered is-marginless>div>p classheading>分类/p>a href/categories/>p classtitle>0/p>/a>/div>/div>div classlevel-item has-text-centered is-marginless>div>p classheading>标签/p>a href/tags/>p classtitle>16/p>/a>/div>/div>/nav>div classlevel>a classlevel-item button is-primary is-rounded hrefhttps://github.com/mcthesw target_blank relme noopener>关注我/a>/div>div classlevel is-mobile is-multiline>a classlevel-item button is-transparent is-marginless target_blank relme noopener titleGithub hrefhttps://github.com/mcthesw>i classfab fa-github>/i>/a>a classlevel-item button is-transparent is-marginless target_blank relme noopener titleBilibili hrefhttps://space.bilibili.com/4087637>i classfab fa-youtube>/i>/a>/div>/div>/div>div classcard widget data-typetags>div classcard-content>div classmenu>h3 classmenu-label>标签/h3>div classfield is-grouped is-grouped-multiline>div classcontrol>a classtags has-addons href/tags/Avalonia/>span classtag>Avalonia/span>span classtag>2/span>/a>/div>div classcontrol>a classtags has-addons href/tags/CSharp/>span classtag>CSharp/span>span classtag>2/span>/a>/div>div classcontrol>a classtags has-addons href/tags/Copilot/>span classtag>Copilot/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/GUI/>span classtag>GUI/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/Nuxt-js/>span classtag>Nuxt.js/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/Rust/>span classtag>Rust/span>span classtag>6/span>/a>/div>div classcontrol>a classtags has-addons href/tags/Scoop/>span classtag>Scoop/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/Tauri/>span classtag>Tauri/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/VSCode/>span classtag>VSCode/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/XAML/>span classtag>XAML/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/egui/>span classtag>egui/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/>span classtag>交叉编译/span>span classtag>2/span>/a>/div>div classcontrol>a classtags has-addons href/tags/%E5%89%8D%E7%AB%AF/>span classtag>前端/span>span classtag>1/span>/a>/div>div classcontrol>a classtags has-addons href/tags/%E5%AD%A6%E4%B9%A0/>span classtag>学习/span>span classtag>3/span>/a>/div>div classcontrol>a classtags has-addons href/tags/%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80/>span classtag>语言基础/span>span classtag>2/span>/a>/div>div classcontrol>a classtags has-addons href/tags/%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3/>span classtag>错误解决/span>span classtag>2/span>/a>/div>/div>/div>/div>/div>!--!-->div classcard widget data-typerecent-posts>div classcard-content>h3 classmenu-label>最新文章/h3>article classmedia>div classmedia-content>p classdate>time dateTime2025-10-18T07:38:43.000Z>2025-10-18/time>/p>p classtitle>a href/2025/10/ca8f2d0d/>解决GithubCopilot补全冲突/a>/p>/div>/article>article classmedia>div classmedia-content>p classdate>time dateTime2025-03-23T13:34:54.000Z>2025-03-23/time>/p>p classtitle>a href/2025/03/a7485831/>实现egui窗体隐藏和重新展示/a>/p>/div>/article>article classmedia>div classmedia-content>p classdate>time dateTime2025-03-22T08:18:03.000Z>2025-03-22/time>/p>p classtitle>a href/2025/03/e57e33c6/>在Win上编译Rust程序到MacOS和Linux/a>/p>/div>/article>article classmedia>div classmedia-content>p classdate>time dateTime2024-12-29T13:07:50.000Z>2024-12-29/time>/p>p classtitle>a href/2024/12/7368f4eb/>解决Tauri2无法拖拽/a>/p>/div>/article>article classmedia>div classmedia-content>p classdate>time dateTime2024-09-26T08:24:23.000Z>2024-09-26/time>/p>p classtitle>a href/2024/09/185a27cb/>Avalonia采用AOT编译后无法运行解决办法/a>/p>/div>/article>/div>/div>div classcard widget data-typearchives>div classcard-content>div classmenu>h3 classmenu-label>归档/h3>ul classmenu-list>li>a classlevel is-mobile href/archives/2025/10/>span classlevel-start>span classlevel-item>十月 2025/span>/span>span classlevel-end>span classlevel-item tag>1/span>/span>/a>/li>li>a classlevel is-mobile href/archives/2025/03/>span classlevel-start>span classlevel-item>三月 2025/span>/span>span classlevel-end>span classlevel-item tag>2/span>/span>/a>/li>li>a classlevel is-mobile href/archives/2024/12/>span classlevel-start>span classlevel-item>十二月 2024/span>/span>span classlevel-end>span classlevel-item tag>1/span>/span>/a>/li>li>a classlevel is-mobile href/archives/2024/09/>span classlevel-start>span classlevel-item>九月 2024/span>/span>span classlevel-end>span classlevel-item tag>4/span>/span>/a>/li>li>a classlevel is-mobile href/archives/2022/11/>span classlevel-start>span classlevel-item>十一月 2022/span>/span>span classlevel-end>span classlevel-item tag>3/span>/span>/a>/li>li>a classlevel is-mobile href/archives/2022/06/>span classlevel-start>span classlevel-item>六月 2022/span>/span>span classlevel-end>span classlevel-item tag>1/span>/span>/a>/li>/ul>/div>/div>/div>/div>!--!-->/div>/div>/section>footer classfooter>div classcontainer>div classlevel>div classlevel-start>a classfooter-logo is-block mb-2 href/>img src/img/logo.svg altSworld height28>/a>p classis-size-7>span>© 2025 Sworld/span> Powered by a hrefhttps://hexo.io/ target_blank relnoopener>Hexo/a> & a hrefhttps://github.com/ppoffice/hexo-theme-icarus target_blank relnoopener>Icarus/a>/p>/div>div classlevel-end>div classfield has-addons>p classcontrol>a classbutton is-transparent is-large target_blank relnoopener titleView Source on GitHub hrefhttps://github.com/mcthesw/mcthesw.github.io>i classfab fa-github>/i>/a>/p>/div>/div>/div>/div>/footer>script data-cfasyncfalse src/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js>/script>script srchttps://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js type5e24c909843b07102e52c578-text/javascript>/script>script srchttps://cdn.jsdelivr.net/npm/moment@2.22.2/min/moment-with-locales.min.js type5e24c909843b07102e52c578-text/javascript>/script>script srchttps://cdn.jsdelivr.net/npm/clipboard@2.0.4/dist/clipboard.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script type5e24c909843b07102e52c578-text/javascript>moment.locale(zh-cn);/script>script type5e24c909843b07102e52c578-text/javascript>var IcarusThemeSettings { article: { highlight: { clipboard: true, fold: unfolded } } };/script>script data-pjax src/js/column.js type5e24c909843b07102e52c578-text/javascript>/script>script src/js/animation.js type5e24c909843b07102e52c578-text/javascript>/script>a idback-to-top title回到顶端 hrefjavascript:;>i classfas fa-chevron-up>/i>/a>script data-pjax src/js/back_to_top.js defer type5e24c909843b07102e52c578-text/javascript>/script>!--!-->!--!-->!--!-->script srchttps://cdn.jsdelivr.net/npm/cookieconsent@3.1.1/build/cookieconsent.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script type5e24c909843b07102e52c578-text/javascript>window.addEventListener(load, () > { window.cookieconsent.initialise({ type: info, theme: edgeless, static: false, position: bottom-left, content: { message: 此网站使用Cookie来改善您的体验。, dismiss: 知道了!, allow: 允许使用Cookie, deny: 拒绝, link: 了解更多, policy: Cookie政策, href: https://www.cookiesandyou.com/, }, palette: { popup: { background: #edeff5, text: #838391 }, button: { background: #4b81e8 }, }, }); });/script>script srchttps://cdn.jsdelivr.net/npm/lightgallery@1.10.0/dist/js/lightgallery.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script srchttps://cdn.jsdelivr.net/npm/justifiedGallery@3.8.1/dist/js/jquery.justifiedGallery.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script type5e24c909843b07102e52c578-text/javascript>window.addEventListener(load, () > { if (typeof $.fn.lightGallery function) { $(.article).lightGallery({ selector: .gallery-item }); } if (typeof $.fn.justifiedGallery function) { if ($(.justified-gallery > p > .gallery-item).length) { $(.justified-gallery > p > .gallery-item).unwrap(); } $(.justified-gallery).justifiedGallery(); } });/script>!--!-->!--!-->link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.css>script srchttps://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script srchttps://cdn.jsdelivr.net/npm/katex@0.15.1/dist/contrib/auto-render.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script srchttps://cdn.jsdelivr.net/npm/katex@0.15.1/dist/contrib/mhchem.min.js defer type5e24c909843b07102e52c578-text/javascript>/script>script type5e24c909843b07102e52c578-text/javascript>window.addEventListener(load, function() { document.querySelectorAll(rolearticle > .content).forEach(function(element) { renderMathInElement(element); }); });/script>!--!-->!--!-->!--!-->script data-pjax src/js/main.js defer type5e24c909843b07102e52c578-text/javascript>/script>div classsearchbox>div classsearchbox-container>div classsearchbox-header>div classsearchbox-input-container>input classsearchbox-input typetext placeholder想要查找什么...>/div>a classsearchbox-close hrefjavascript:;>×/a>/div>div classsearchbox-body>/div>/div>/div>script data-pjax src/js/insight.js defer type5e24c909843b07102e52c578-text/javascript>/script>script data-pjax type5e24c909843b07102e52c578-text/javascript>document.addEventListener(DOMContentLoaded, function () { loadInsight({contentUrl:/content.json}, {hint:想要查找什么...,untitled:(无标题),posts:文章,pages:页面,categories:分类,tags:标签}); });/script>!-- Cloudflare Pages Analytics -->script defer srchttps://static.cloudflareinsights.com/beacon.min.js data-cf-beacon{token: 809e9a362773486584008e42e47f42d3} type5e24c909843b07102e52c578-text/javascript>/script>!-- Cloudflare Pages Analytics -->script src/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js data-cf-settings5e24c909843b07102e52c578-|49 defer>/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]