Files
blog.hifuu.ink/db.json
2025-11-16 00:44:56 +08:00

1 line
418 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"meta":{"version":1,"warehouse":"5.0.1"},"models":{"Asset":[{"_id":"source/music/過ぎ去りし温もりの日々.mp3","path":"music/過ぎ去りし温もりの日々.mp3","modified":0,"renderable":0},{"_id":"source/images/1613f5602b203b38230f19699deb0219454454985.png","path":"images/1613f5602b203b38230f19699deb0219454454985.png","modified":0,"renderable":0},{"_id":"source/images/1730728153314.png","path":"images/1730728153314.png","modified":0,"renderable":0},{"_id":"source/images/20241027_222225.png","path":"images/20241027_222225.png","modified":0,"renderable":0},{"_id":"source/images/5364bba6d035326e82c53504dd53e7c2454454985.png","path":"images/5364bba6d035326e82c53504dd53e7c2454454985.png","modified":0,"renderable":0},{"_id":"source/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png","path":"images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png","modified":0,"renderable":0},{"_id":"source/images/Written-By-Human-Not-By-AI-Badge-white@2x.png","path":"images/Written-By-Human-Not-By-AI-Badge-white@2x.png","modified":0,"renderable":0},{"_id":"source/images/amd.webp","path":"images/amd.webp","modified":0,"renderable":0},{"_id":"source/images/archlinux-logo.png","path":"images/archlinux-logo.png","modified":0,"renderable":0},{"_id":"source/images/asc-events.png","path":"images/asc-events.png","modified":0,"renderable":0},{"_id":"source/images/asc.png","path":"images/asc.png","modified":0,"renderable":0},{"_id":"source/images/audiveris.png","path":"images/audiveris.png","modified":0,"renderable":0},{"_id":"source/images/b2054bbaf6197624d38cc2007d885fd1454454985.png","path":"images/b2054bbaf6197624d38cc2007d885fd1454454985.png","modified":0,"renderable":0},{"_id":"source/images/built_on_the_kde_platform.png","path":"images/built_on_the_kde_platform.png","modified":0,"renderable":0},{"_id":"source/images/caseclosed.png","path":"images/caseclosed.png","modified":0,"renderable":0},{"_id":"source/images/clonezilla.png","path":"images/clonezilla.png","modified":0,"renderable":0},{"_id":"source/images/krita-official.png","path":"images/krita-official.png","modified":0,"renderable":0},{"_id":"source/images/lmms-import.png","path":"images/lmms-import.png","modified":0,"renderable":0},{"_id":"source/images/mhwilds4050.jpg","path":"images/mhwilds4050.jpg","modified":0,"renderable":0},{"_id":"source/images/mhwilds780M.jpg","path":"images/mhwilds780M.jpg","modified":0,"renderable":0},{"_id":"source/images/musecore-launch.png","path":"images/musecore-launch.png","modified":0,"renderable":0},{"_id":"source/images/musecore-to-midi.png","path":"images/musecore-to-midi.png","modified":0,"renderable":0},{"_id":"source/images/musecore.png","path":"images/musecore.png","modified":0,"renderable":0},{"_id":"source/images/phase1.png","path":"images/phase1.png","modified":0,"renderable":0},{"_id":"source/images/phase1_strings.png","path":"images/phase1_strings.png","modified":0,"renderable":0},{"_id":"source/images/phase_2_14.png","path":"images/phase_2_14.png","modified":0,"renderable":0},{"_id":"source/images/phase_4.png","path":"images/phase_4.png","modified":0,"renderable":0},{"_id":"source/images/resendofficial.png","path":"images/resendofficial.png","modified":0,"renderable":0},{"_id":"source/images/rusendhelp1.png","path":"images/rusendhelp1.png","modified":0,"renderable":0},{"_id":"source/images/rusendhelp2.png","path":"images/rusendhelp2.png","modified":0,"renderable":0},{"_id":"source/images/rusendhelp3.png","path":"images/rusendhelp3.png","modified":0,"renderable":0},{"_id":"source/images/searxng.png","path":"images/searxng.png","modified":0,"renderable":0},{"_id":"source/images/xb2score.png","path":"images/xb2score.png","modified":0,"renderable":0},{"_id":"source/images/yana.jpg","path":"images/yana.jpg","modified":0,"renderable":0},{"_id":"source/images/zellij-helix.jpg","path":"images/zellij-helix.jpg","modified":0,"renderable":0},{"_id":"themes/fluid/source/css/gitalk.css","path":"css/gitalk.css","modified":0,"renderable":1},{"_id":"themes/fluid/source/css/highlight-dark.styl","path":"css/highlight-dark.styl","modified":0,"renderable":1},{"_id":"themes/fluid/source/css/highlight.styl","path":"css/highlight.styl","modified":0,"renderable":1},{"_id":"themes/fluid/source/css/main.styl","path":"css/main.styl","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/avatar.png","path":"img/avatar.png","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/gensokyo.jpg","path":"img/gensokyo.jpg","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/gh0s7.jpg","path":"img/gh0s7.jpg","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/hifuu.png","path":"img/hifuu.png","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/loading.gif","path":"img/loading.gif","modified":0,"renderable":1},{"_id":"themes/fluid/source/img/police_beian.png","path":"img/police_beian.png","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/boot.js","path":"js/boot.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/color-schema.js","path":"js/color-schema.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/events.js","path":"js/events.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/img-lazyload.js","path":"js/img-lazyload.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/leancloud.js","path":"js/leancloud.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/local-search.js","path":"js/local-search.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/plugins.js","path":"js/plugins.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/umami-view.js","path":"js/umami-view.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/js/utils.js","path":"js/utils.js","modified":0,"renderable":1},{"_id":"themes/fluid/source/xml/local-search.xml","path":"xml/local-search.xml","modified":0,"renderable":1}],"Cache":[{"_id":"source/_posts/12月16-17日工作记录.md","hash":"9f5099a65180c2659f1a1ca218d518fc64965676","modified":1740320866747},{"_id":"source/_posts/12月18日工作记录.md","hash":"28892523fcc2fadb1514645a1c59d501ceab53da","modified":1740320866748},{"_id":"source/_posts/12月19日工作记录.md","hash":"058ca01b682cd36e202189ef025d6d4bb79259fb","modified":1740320866748},{"_id":"source/_posts/12月28日进度报告.md","hash":"4cbda36dc6a2c4bc67140e443638a73aadb18fdf","modified":1740320866748},{"_id":"source/_posts/12月20日工作记录.md","hash":"0d883ab20ae59540f663c5377e799463762a3b11","modified":1740320866748},{"_id":"source/_posts/12月31日进度报告.md","hash":"bf541fdb539029c98dedf975b0c15519adcea76e","modified":1740320866748},{"_id":"source/_posts/2025-5-21.md","hash":"2e1406ca2c83a1a91e78fd3453623ba732d81ee7","modified":1747834483639},{"_id":"source/_posts/BlogUpdate.md","hash":"2c694e3895b2ea0c0cea5f45ab2ec16a868a3df7","modified":1740320866748},{"_id":"source/_posts/CGH0S7-s-Blog.md","hash":"9a5c9461aba29f2447c0f6725f5425d5a05e32f0","modified":1740320866748},{"_id":"source/_posts/GentleJena.md","hash":"df1e35a93284d0b9e2d408635cd98481077d5155","modified":1740330871930},{"_id":"source/_posts/Vocaloid调教-晴天.md","hash":"9141182f5dbfbbd840ad340b3e5271507ddd8c94","modified":1740442745940},{"_id":"source/_posts/Your-exclusive-email-address.md","hash":"c1721f4ac1b359140b0b57658ddd39c64c041aa8","modified":1763224970086},{"_id":"source/_posts/arch-nvidia.md","hash":"4144acad32a69e88ef6d5d7d5788da6d87a75193","modified":1738495295673},{"_id":"source/_posts/archlinux-game-fix.md","hash":"a4ab5bd2ca0cf941c5166d3945bd2a2076a54f1e","modified":1741618456788},{"_id":"source/_posts/archlinux-optimization.md","hash":"51c8c12110fb08a1edd1f727ab38a1b2568b690b","modified":1741619246618},{"_id":"source/_posts/clonezilla.md","hash":"598858976961c45ebbbf523014ee792951380dd3","modified":1740319930654},{"_id":"source/_posts/fortune.md","hash":"e249e56dad408ad79b11efc90aa42f764cf1c665","modified":1747899668523},{"_id":"source/_posts/gcc15restrict.md","hash":"50533932fcba41826b8cf75f54b173f0c604136b","modified":1748008893929},{"_id":"source/_posts/kritabest.md","hash":"a137c6edc4ea2ca1d7ea13d8dc2bd1bbb7df6d84","modified":1752421648539},{"_id":"source/_posts/loopers.md","hash":"2b63f5abcfebc672e7f90b3e83cee1b5ac1d4eff","modified":1740320866748},{"_id":"source/_posts/mhwi.md","hash":"b9a73accf93684b8cfac0201288da9b2c5376423","modified":1731333619124},{"_id":"source/_posts/nudtbomblab.md","hash":"51b4410784657675d7c11e17d16c5dc0e5d4a455","modified":1740455795270},{"_id":"source/_posts/overleaf.md","hash":"0786994f4571ac178ee40bc130e3c0d8d2d511f9","modified":1730860316685},{"_id":"source/_posts/searxng.md","hash":"90f951d3c098aa1b062131b7489a4b7afab06792","modified":1741621615535},{"_id":"source/_posts/zellij-helix.md","hash":"7eb3072b50ecdb49a20355e05fc613a4a8b7fbdf","modified":1740326024966},{"_id":"source/_posts/原来我还有个博客.md","hash":"acd7e534b31b7a0173fae880fa584c7dc03fd2cd","modified":1740457594224},{"_id":"source/_posts/梦开始的地方.md","hash":"c0bbfefdd277c8ae2786a5cd4cc05f731af11436","modified":1740457544687},{"_id":"source/images/Written-By-Human-Not-By-AI-Badge-white@2x.png","hash":"994225c6fd72521b281144bdd98fefcca53e2c7b","modified":1731333731000},{"_id":"source/images/amd.webp","hash":"cb0cfd5da0b9c10b9b22c65bba881cfde485d763","modified":1731333907000},{"_id":"source/images/archlinux-logo.png","hash":"4f6075309fadcb7f7547164cb8a99b4949f74598","modified":1731333766000},{"_id":"source/images/asc-events.png","hash":"a0b3610962062d0a322fe091bcc8f083ab13bc6e","modified":1740329910965},{"_id":"source/images/asc.png","hash":"3a33b35bff1b3f527f7a87a9d6a7d6d9a072a946","modified":1740328627284},{"_id":"source/images/built_on_the_kde_platform.png","hash":"507b6a4323b23772800006505e6c588bb515ebf5","modified":1731334007000},{"_id":"source/about/index.md","hash":"ff7cd1481f3c669a04d7c8abf8851ab0cea5b2b9","modified":1740326480093},{"_id":"source/images/phase1_strings.png","hash":"6fb457adddc5bb32aa463b6227542076c4b501e7","modified":1740382826998},{"_id":"source/images/rusendhelp1.png","hash":"73aa5b41d33c7f3392de28b7b696ebcb12248d82","modified":1763222994735},{"_id":"source/images/rusendhelp3.png","hash":"db656266b54c91e540f3c677b146c0931b61277e","modified":1763222231471},{"_id":"source/images/searxng.png","hash":"9514f2bd14ac1cafa437f3655d9382d477667094","modified":1741619983804},{"_id":"source/images/caseclosed.png","hash":"628b54b49c86a23af595a52daba9e0557b81a17a","modified":1740454957882},{"_id":"source/images/resendofficial.png","hash":"41c2cafe3a11c1674a0a1ec27698ea94cecc9a23","modified":1763222843243},{"_id":"source/images/rusendhelp2.png","hash":"3752f3041d28cbadcb4abc26151f0d17f505908d","modified":1763223010905},{"_id":"source/images/audiveris.png","hash":"52aa9df5f93559c2e47b30afbf84fc6cc6b34002","modified":1744993135289},{"_id":"source/images/musecore-to-midi.png","hash":"02ba31b29ba069dfef0e1cf26c5ccec9dc3d2289","modified":1744993436860},{"_id":"source/images/1730728153314.png","hash":"95d44ea62557a311503cab58d1dec5cafc97e07d","modified":1740320866754},{"_id":"source/images/musecore.png","hash":"9b2eba87e7c93e57f2024697d1ff4217d206e5ac","modified":1744993264700},{"_id":"source/images/yana.jpg","hash":"757c68ec322e834eace7236c38e74a4f9585d474","modified":1752421174023},{"_id":"source/images/xb2score.png","hash":"03efbb07a7bb7f6c7d58b98ed125cafe42074b94","modified":1744992816374},{"_id":"source/images/phase1.png","hash":"42533712403be6036231f1e3770f125858bf91d7","modified":1740385026324},{"_id":"source/images/5364bba6d035326e82c53504dd53e7c2454454985.png","hash":"11b11f23ebebbe08e8cf826b48eb37b4084796cd","modified":1729572689000},{"_id":"source/images/1613f5602b203b38230f19699deb0219454454985.png","hash":"3d71204d9a0731384f97ad0f90802a5c9fd96776","modified":1729572689000},{"_id":"themes/fluid/source/css/_pages/_tag/tag.styl","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1740320867063},{"_id":"source/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png","hash":"dddf72bb12aef01baa3eb2017bb867f274059f12","modified":1729572689000},{"_id":"source/images/mhwilds4050.jpg","hash":"9b2b15c66e2340c15b86cec0fa8f818b67e06384","modified":1730738910727},{"_id":"themes/fluid/.eslintrc","hash":"4bc2b19ce2b8c4d242f97d4ccf2d741e68ab0097","modified":1740320867050},{"_id":"themes/fluid/.editorconfig","hash":"33218fbd623feb43edf5f99f15965392cecc44a6","modified":1740320867050},{"_id":"themes/fluid/.gitattributes","hash":"a54f902957d49356376b59287b894b1a3d7a003f","modified":1740320867050},{"_id":"themes/fluid/.gitignore","hash":"ae3bfcb89777657c5dfb5169d91445dcb0e5ab98","modified":1740320867051},{"_id":"themes/fluid/README.md","hash":"ff9b0e1fb9dba665af2f1e4a577f8cb9e840464b","modified":1740320867051},{"_id":"themes/fluid/README_en.md","hash":"365184a73af40e7365504c3077f3d80dfee1d80e","modified":1740320867051},{"_id":"themes/fluid/package.json","hash":"7746460fc2eba7439b494c46aa9b5ded81370819","modified":1740320867057},{"_id":"themes/fluid/LICENSE","hash":"26f9356fd6e84b5a88df6d9014378f41b65ba209","modified":1740320867051},{"_id":"themes/fluid/languages/de.yml","hash":"58dccef1d98b472dc4e6f4693c2297b0c9c5afba","modified":1740320867052},{"_id":"themes/fluid/_config.yml","hash":"60403ea6aa5e0cab9dbc7bf0d77257e4a941babc","modified":1740329151304},{"_id":"themes/fluid/languages/eo.yml","hash":"7c1a0c9f6186b6643b19d3980f055329bdb4efa4","modified":1740320867052},{"_id":"themes/fluid/languages/es.yml","hash":"026ddf1a49bf8ddfef6ed86ab4d6af143c1dd95f","modified":1740320867052},{"_id":"themes/fluid/languages/ja.yml","hash":"550b95d3614a64592f02666938d235e9f11e449e","modified":1740320867052},{"_id":"themes/fluid/languages/en.yml","hash":"9c580471257f5a32bee701a059a45ea96755dcdc","modified":1740320867052},{"_id":"themes/fluid/languages/ru.yml","hash":"93818f8bf07195fb1ebffbb5210e531b0e3a6ec4","modified":1740320867052},{"_id":"themes/fluid/languages/zh-CN.yml","hash":"a60847136709bb95586a98d9d67b50390a8d2c96","modified":1740320867052},{"_id":"themes/fluid/languages/zh-HK.yml","hash":"51c2b4d64c6992a39bfd2586a1bdf5fbbbdf0175","modified":1740320867052},{"_id":"themes/fluid/layout/404.ejs","hash":"b84d575c7b7f778b4cb64e89ad3d0aed4a896820","modified":1740320867052},{"_id":"themes/fluid/languages/zh-TW.yml","hash":"e1043de394f6dcf5c0647adcfdefe60637f78426","modified":1740320867052},{"_id":"themes/fluid/layout/about.ejs","hash":"052e9fc19c753f53fdc083c7fb098e3668880140","modified":1740320867056},{"_id":"themes/fluid/layout/archive.ejs","hash":"7c1f44005849791feae4abaa10fae4cb983d3277","modified":1740320867056},{"_id":"themes/fluid/layout/categories.ejs","hash":"13859726c27b6c79b5876ec174176d0f9c1ee164","modified":1740320867056},{"_id":"themes/fluid/layout/category.ejs","hash":"f099161b738a16a32253f42085b5444f902018ed","modified":1740320867056},{"_id":"themes/fluid/layout/index.ejs","hash":"33c3317cdcee062789de2336dd8d0cc7f86d3650","modified":1740320867056},{"_id":"themes/fluid/layout/layout.ejs","hash":"7e0023474128fbe4d68c467704c41f1712432415","modified":1740320867056},{"_id":"themes/fluid/layout/links.ejs","hash":"1cac32ec4579aaf7b9fa39d317497331d4c5e1dd","modified":1740320867056},{"_id":"themes/fluid/layout/page.ejs","hash":"ed5007a3feb8f14d3d2843271bfb298eb0c56219","modified":1740320867056},{"_id":"themes/fluid/layout/post.ejs","hash":"9bf0d357a607a282f3b9cb04525a4df0cc2a8b76","modified":1740320867056},{"_id":"themes/fluid/layout/tag.ejs","hash":"9d686364c4d16a1a9219471623af452035c5b966","modified":1740320867056},{"_id":"themes/fluid/layout/tags.ejs","hash":"1d06af34b6cf1d8a20d2eb565e309326ceba309f","modified":1740320867057},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/bug_report.md","hash":"554c0d0e086a0784d83ee71c83f8bceeb60aecc8","modified":1740320867050},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/bug_report_zh.md","hash":"c8b0d49c49e3c88872fd3b37909345ff5b2b6aa0","modified":1740320867051},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/feature_request.md","hash":"c134dd57ffd269b93402ccfffe7dbe0f0b583bec","modified":1740320867051},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/feature_request_zh.md","hash":"ed08574b196447376dd74411cca664ac9227a5d4","modified":1740320867051},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/question_zh.md","hash":"fff07ce0472afc368d388637cb9d438195da9b5b","modified":1740320867051},{"_id":"themes/fluid/.github/ISSUE_TEMPLATE/question.md","hash":"ab5eab9e3ff889c4ba7fd82846e7f5b7ae15bebc","modified":1740320867051},{"_id":"themes/fluid/.github/workflows/cr.yaml","hash":"19a8a00f5ba9607d82265572fe1202b64a8b0822","modified":1740320867051},{"_id":"themes/fluid/.github/workflows/limit.yaml","hash":"f8bd2edeb4424ee7a055b31583445d5d5dff91a4","modified":1740320867051},{"_id":"themes/fluid/scripts/events/index.js","hash":"79de5a379b28cad759a49048351c7f6b8915bd7d","modified":1740320867057},{"_id":"themes/fluid/.github/workflows/publish.yaml","hash":"6f02e6440d88629229556e3fd47d0280fe2240db","modified":1740320867051},{"_id":"themes/fluid/scripts/filters/default-injects.js","hash":"b2013ae8e189cd07ebc8a2ff48a78e153345210f","modified":1740320867057},{"_id":"themes/fluid/scripts/filters/locals.js","hash":"58d0fec976f6b1d35e7ea03edc45414088acf05c","modified":1740320867057},{"_id":"themes/fluid/scripts/filters/post-filter.js","hash":"82bb06686158ebe160a631c79f156cd4fde35656","modified":1740320867057},{"_id":"themes/fluid/scripts/generators/index-generator.js","hash":"9159fc22fa84a7b605dd15fe4104f01fe9c71147","modified":1740320867057},{"_id":"themes/fluid/scripts/generators/local-search.js","hash":"9ac5ddad06e9b0e6015ce531430018182a4bc0fa","modified":1740320867058},{"_id":"themes/fluid/scripts/generators/pages.js","hash":"d3e75f53c59674d171309e50702954671f31f1a4","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/date.js","hash":"9bda6382f61b40a20c24af466fe10c8366ebb74c","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/engine.js","hash":"d3a231d106795ce99cb0bc77eb65f9ae44515933","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/export-config.js","hash":"8e67b522c47aa250860e3fe2c733f1f958a506c0","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/import.js","hash":"ca53e8dbf7d44cfd372cfa79ac60f35a7d5b0076","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/injects.js","hash":"1ad2ae6b11bd8806ee7dd6eb7140d8b54a95d613","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/page.js","hash":"4607607445233b3029ef20ed5e91de0da0a7f9c5","modified":1740320867058},{"_id":"themes/fluid/scripts/helpers/scope.js","hash":"d41d9d658fcb54964b388598e996747aadb85b0f","modified":1740320867059},{"_id":"themes/fluid/scripts/helpers/url.js","hash":"2a6a8288176d0e0f6ec008056bf2745a86e8943e","modified":1740320867059},{"_id":"themes/fluid/scripts/helpers/utils.js","hash":"966689d7c5e4320008285395fbaa2751f6209be5","modified":1740320867059},{"_id":"themes/fluid/scripts/helpers/wordcount.js","hash":"4d48c424e47ff9a17a563167ea5f480890267adf","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/button.js","hash":"3eb43a8cdea0a64576ad6b31b4df6c2bf5698d4c","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/checkbox.js","hash":"6eaf53cf4bfc756a65bda18184cf8998a12c861d","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/fold.js","hash":"73e4fd12ce3e47981479391ed354b7d9d3279f70","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/group-image.js","hash":"4aeebb797026f1df25646a5d69f7fde79b1bcd26","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/label.js","hash":"f05a6d32cca79535b22907dc03edb9d3fa2d8176","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/mermaid.js","hash":"75160561e1ef3603b6d2ad2938464ab1cb77fd38","modified":1740320867059},{"_id":"themes/fluid/scripts/tags/note.js","hash":"e3b456a079e5dc0032473b516c865b20f83d2c26","modified":1740320867059},{"_id":"themes/fluid/scripts/utils/compare-versions.js","hash":"dbbc928c914fc2bd242cd66aa0c45971aec13a5d","modified":1740320867059},{"_id":"themes/fluid/scripts/utils/crypto.js","hash":"ae4ad8a188ef5b3fa6818b01629fc962b3de8551","modified":1740320867060},{"_id":"themes/fluid/scripts/utils/object.js","hash":"33b57e4decdc5e75c518859f168c8ba80b2c665b","modified":1740320867060},{"_id":"themes/fluid/scripts/utils/resolve.js","hash":"8c4a8b62aa8608f12f1e9046231dff04859dc3e9","modified":1740320867060},{"_id":"themes/fluid/scripts/utils/url-join.js","hash":"718aab5e7b2059a06b093ca738de420d9afa44ba","modified":1740320867060},{"_id":"themes/fluid/layout/_partials/archive-list.ejs","hash":"7520fbf91f762207c2ab06b2c293235cd5b23905","modified":1740320867052},{"_id":"themes/fluid/layout/_partials/category-chains.ejs","hash":"18309584aab83bc4deb20723ebad832149dd2e24","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/category-list.ejs","hash":"f8d2f1907450e61968e6d54443e9be8138196a77","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments.ejs","hash":"d707c47b2638c94e489bc43d4cfd098b7c58447f","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/css.ejs","hash":"1dadb118d580280524ed0a5f69bd34d234a92276","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/footer.ejs","hash":"b52aa2d61b6812588a805b676ffdf8b887023938","modified":1740330605855},{"_id":"themes/fluid/layout/_partials/head.ejs","hash":"67be642f99482c07904474f410cfbc2f99003288","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/header.ejs","hash":"0d5e397d30051e5fbabe7b47cfd1f1e6a5820af1","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/markdown-plugins.ejs","hash":"fc4bdf7de0cf1a66d0e5e4fba1b31d6f7ed49468","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/paginator.ejs","hash":"0f38a2c238169edcb63fc46c23bfc529ff3859b7","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/scripts.ejs","hash":"da5810785105e5075861593c7ac22c7aa9665a72","modified":1740320867056},{"_id":"themes/fluid/layout/_partials/search.ejs","hash":"70e1c929e084ca8a2648cedabf29b372511ea2b8","modified":1740320867056},{"_id":"themes/fluid/source/css/highlight-dark.styl","hash":"45695ef75c31a4aa57324dd408b7e2327a337018","modified":1740320867063},{"_id":"themes/fluid/source/css/gitalk.css","hash":"a57b3cc8e04a0a4a27aefa07facf5b5e7bca0e76","modified":1740320867063},{"_id":"themes/fluid/source/css/main.styl","hash":"855ae5fe229c51afa57f7645f6997a27a705d7e4","modified":1740320867063},{"_id":"themes/fluid/source/css/highlight.styl","hash":"a9efc52a646a9e585439c768557e3e3c9e3326dc","modified":1740320867063},{"_id":"themes/fluid/source/img/police_beian.png","hash":"90efded6baa2dde599a9d6b1387973e8e64923ea","modified":1740320867086},{"_id":"themes/fluid/source/img/loading.gif","hash":"2d2fc0f947940f98c21afafef39ecf226a2e8d55","modified":1740320867086},{"_id":"themes/fluid/source/js/boot.js","hash":"38bd26c6b7acdafda86dda3560e6a3ca488d3c76","modified":1740320867086},{"_id":"themes/fluid/source/js/color-schema.js","hash":"1ef88c881b9f942deadde3d890387b94c617342a","modified":1740320867086},{"_id":"themes/fluid/source/js/img-lazyload.js","hash":"cbdeca434ec4da51f488c821d51b4d23c73294af","modified":1740320867086},{"_id":"themes/fluid/source/js/events.js","hash":"6869811f67e4c3de3edfa4b08464bb242b97a402","modified":1740320867086},{"_id":"themes/fluid/source/img/avatar.png","hash":"fe739a158cc128f70f780eb5fa96f388b81d478f","modified":1740320867063},{"_id":"themes/fluid/source/js/local-search.js","hash":"b9945f76f8682f3ec32edfb285b26eb559f7b7e8","modified":1740320867086},{"_id":"themes/fluid/source/js/umami-view.js","hash":"33c4b3883fa747604074ad3921606eeeaeb50716","modified":1740320867087},{"_id":"themes/fluid/source/js/plugins.js","hash":"c34916291e392a774ff3e85c55badb83e8661297","modified":1740320867087},{"_id":"themes/fluid/source/js/utils.js","hash":"b82e7c289a66dfd36064470fd41c0e96fc598b43","modified":1740320867087},{"_id":"themes/fluid/source/xml/local-search.xml","hash":"8c96ba6a064705602ce28d096fd7dd9069630a55","modified":1740320867087},{"_id":"themes/fluid/scripts/events/lib/compatible-configs.js","hash":"ef474d1fa5bbafc52619ced0f9dc7eaf2affb363","modified":1740320867057},{"_id":"themes/fluid/scripts/events/lib/footnote.js","hash":"c19ac8050b82c3676b0332a56099ccfcc36d9d52","modified":1740320867057},{"_id":"themes/fluid/scripts/events/lib/hello.js","hash":"bd8376e1cf7892dc2daa58f2f443574be559fdbf","modified":1740320867057},{"_id":"themes/fluid/scripts/events/lib/highlight.js","hash":"a5fe1deccb73b5f578797dbb11038efc15f63ce8","modified":1740320867057},{"_id":"themes/fluid/scripts/events/lib/lazyload.js","hash":"9ba0d4bc224e22af8a5a48d6ff13e5a0fcfee2a4","modified":1740320867057},{"_id":"themes/fluid/scripts/events/lib/injects.js","hash":"5ae4b07204683e54b5a1b74e931702bbce2ac23e","modified":1740320867057},{"_id":"themes/fluid/source/js/leancloud.js","hash":"eff77c7a5c399fcaefda48884980571e15243fc9","modified":1740320867086},{"_id":"themes/fluid/scripts/events/lib/merge-configs.js","hash":"7c944c43b2ece5dd84859bd9d1fe955d13427387","modified":1740320867057},{"_id":"themes/fluid/layout/_partials/comments/changyan.ejs","hash":"c9b2d68ed3d375f1953e7007307d2a3f75ed6249","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/cusdis.ejs","hash":"5f9dc012be27040bbe874d0c093c0d53958cc987","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/disqus.ejs","hash":"aab4a4d24c55231a37db308ae94414319cecdd9b","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/giscus.ejs","hash":"95f8b866b158eff9352c381c243b332a155a5110","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/livere.ejs","hash":"2264758fed57542a7389c7aa9f00f1aefa17eb87","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/gitalk.ejs","hash":"843bc141a4545eb20d1c92fb63c85d459b4271ec","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/remark42.ejs","hash":"d4e9532feeb02aed61bd15eda536b5b631454dac","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/twikoo.ejs","hash":"d84bcb5ccd78470a60c067fc914ac0ac67ac8777","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/comments/utterances.ejs","hash":"c7ccf7f28308334a6da6f5425b141a24b5eca0e2","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/comments/valine.ejs","hash":"19ba937553dddd317f827d682661a1066a7b1f30","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/comments/waline.ejs","hash":"3d08c73b77e412d2f06a24d9344565fc7dbc76f8","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/footer/beian.ejs","hash":"4fb9b5dd3f3e41a586d6af44e5069afe7c81fff2","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/footer/statistics.ejs","hash":"954a29b58d72647d20450da270b5d8fb2e0824f5","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/header/banner.ejs","hash":"e07757b59e7b89eea213d0e595cb5932f812fd32","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/header/navigation.ejs","hash":"37d750428772d7c71ba36ce0c2540780d90fadea","modified":1740320867054},{"_id":"themes/fluid/layout/_partials/plugins/analytics.ejs","hash":"e6dcbf1c2f56314d56bb46b50aca86ff68cacebd","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/anchorjs.ejs","hash":"40181442d3a2b8734783a0ad7caf2d2522e3f2ab","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/encrypt.ejs","hash":"0fff24cf5bf99fbe5c56c292e2eac4a89bf29db4","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/fancybox.ejs","hash":"9d1ea2a46b8c8ad8c168594d578f40764818ef13","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/highlight.ejs","hash":"7529dd215b09d3557804333942377b9e20fa554e","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/mermaid.ejs","hash":"03ac02762f801970d1c4e73d6ec8d4c503780e50","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/math.ejs","hash":"dcbf9a381ee76f2f1f75fcbc22c50a502ec85023","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/code-widget.ejs","hash":"3a505cba37942badf62a56bbb8b605b72af330aa","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/comments/discuss.ejs","hash":"98d065b58ce06b7d18bff3c974e96fa0f34ae03a","modified":1740320867053},{"_id":"themes/fluid/layout/_partials/plugins/moment.ejs","hash":"4ff3fb1b60ccc95a0af3bbdbd0757fedefc088b5","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/plugins/nprogress.ejs","hash":"4c2d39ce816b8a6dcd6b53113c8695f8bd650a23","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/post/category-bar.ejs","hash":"8772bce97ed297e7a88523f4e939ed6436c22f87","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/post/copyright.ejs","hash":"cbfa32c5f5973133afd043853b24f8200455cb2d","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/post/meta-bottom.ejs","hash":"375974ec017696e294dc12469fb0ae257800dc2d","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/post/meta-top.ejs","hash":"54dd479dbb440126e4ddd9d902229db5afaaae98","modified":1740320867055},{"_id":"themes/fluid/layout/_partials/post/sidebar-left.ejs","hash":"9992c99b3eb728ad195970e1b84d665f2c8691c4","modified":1740320867056},{"_id":"themes/fluid/layout/_partials/post/sidebar-right.ejs","hash":"d5fcc9b60e02f869a29a8c17a16a6028ecc1e6d8","modified":1740320867056},{"_id":"themes/fluid/layout/_partials/post/toc.ejs","hash":"635a89060fbf72eeda066fc4bd0a97462f069417","modified":1740320867056},{"_id":"themes/fluid/source/css/_functions/base.styl","hash":"2e46f3f4e2c9fe34c1ff1c598738fc7349ae8188","modified":1740320867060},{"_id":"themes/fluid/source/css/_mixins/base.styl","hash":"542e306ee9494e8a78e44d6d7d409605d94caeb3","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/pages.styl","hash":"b8e887bc7fb3b765a1f8ec9448eff8603a41984f","modified":1740320867063},{"_id":"themes/fluid/source/css/_variables/base.styl","hash":"4ed5f0ae105ef4c7dd92eaf652ceda176c38e502","modified":1740320867063},{"_id":"themes/fluid/source/css/_pages/_about/about.styl","hash":"97fe42516ea531fdad771489b68aa8b2a7f6ae46","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_archive/archive.styl","hash":"c475e6681546d30350eaed11f23081ecae80c375","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_base/base.styl","hash":"643284c567665f96915f0b64e59934dda315f74d","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/color-schema.styl","hash":"85492ef64d7e5f70f0f7e46d570bbc911e686d7e","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/inline.styl","hash":"411a3fa3f924a87e00ff04d18b5c83283b049a4d","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/keyframes.styl","hash":"94065ea50f5bef7566d184f2422f6ac20866ba22","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_base/print.styl","hash":"166afbc596ea4b552bad7290ec372d25ec34db7b","modified":1740320867062},{"_id":"themes/fluid/layout/_partials/plugins/typed.ejs","hash":"f345374885cd6a334f09a11f59c443b5d577c06c","modified":1740320867055},{"_id":"themes/fluid/source/css/_pages/_category/category-bar.styl","hash":"cc6df43fef6bb3efecbfdd8b9e467424a1dea581","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_category/category-chain.styl","hash":"0cdf7ef50dfd0669d3b257821384ff31cd81b7c9","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_category/category-list.styl","hash":"7edfe1b571ecca7d08f5f4dbcf76f4ffdcfbf0b5","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_links/links.styl","hash":"5c7f2044e3f1da05a3229537c06bd879836f8d6e","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_post/comment.styl","hash":"780f3788e7357bcd3f3262d781cb91bb53976a93","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_post/highlight.styl","hash":"4df764d298fe556e501db4afc2b05686fe6ebcfb","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_post/markdown.styl","hash":"1e3d3a82721e7c10bcfcecec6d81cf2979039452","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_post/post-page.styl","hash":"7eee3f78296a3c81849a5415d1d43dcc6e03e6aa","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_post/post-tag.styl","hash":"c96d36aa8fe20f0c3c1a29ee2473cd8064b10f73","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_tag/tags.styl","hash":"65bfc01c76abc927fa1a23bf2422892b0d566c3f","modified":1740320867063},{"_id":"themes/fluid/source/css/_pages/_base/_widget/anchorjs.styl","hash":"e0cebda4a6f499aff75e71417d88caa7ceb13b94","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_base/_widget/banner.styl","hash":"7a0bd629bc234fc75e3cc8e3715ffada92f09e73","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_base/_widget/board.styl","hash":"4397037fc3f0033dbe546c33cd9dbdabd8cb1632","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_base/_widget/code-widget.styl","hash":"b66ab013f0f37d724a149b85b3c7432afcf460ad","modified":1740320867060},{"_id":"themes/fluid/source/css/_pages/_base/_widget/copyright.styl","hash":"26f71a9cd60d96bb0cb5bbdf58150b8e524d9707","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/footer.styl","hash":"2caaca71dd1ff63d583099ed817677dd267b457e","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/footnote.styl","hash":"ae9289cc89649af2042907f8a003303b987f3404","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/header.styl","hash":"d42b748f2f49ef32aafb1a21d75991d2459da927","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/modal.styl","hash":"adf6c1e5c8e1fb41c77ce6e2258001df61245aa2","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_index/index.styl","hash":"25fb6fa4c783b847c632584c49a7e1593cdb2f5d","modified":1740320867062},{"_id":"themes/fluid/source/css/_pages/_base/_widget/ngrogress.styl","hash":"5d225357b4a58d46118e6616377168336ed44cb2","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/noscript.styl","hash":"0cf2f2bb44f456150d428016675d5876a9d2e2aa","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/pagination.styl","hash":"8bb1b68e5f3552cb48c2ffa31edbc53646a8fb4c","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/scroll-btn.styl","hash":"f0e429a27fa8a7658fcbddbb4d4dbe4afa12499a","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/search.styl","hash":"10f7e91a91e681fb9fe46f9df7707b9ef78707c8","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/qrcode.styl","hash":"78704a94c0436097abfb0e0a57abeb3429c749b7","modified":1740320867061},{"_id":"themes/fluid/source/css/_pages/_base/_widget/toc.styl","hash":"9e7452aa2372153f25d7a4675c9d36d281a65d24","modified":1740320867061},{"_id":"themes/fluid/source/img/hifuu.png","hash":"331b5950baf96f5d39192bb42b7da4d22a08992e","modified":1740320867086},{"_id":"source/images/clonezilla.png","hash":"7f443d79783df3744b2e51613422ee8fd7eea6f8","modified":1740318117703},{"_id":"source/images/mhwilds780M.jpg","hash":"e2c59c6caae452afb424d9f2fc3a255a44121b49","modified":1730738926927},{"_id":"source/images/phase_2_14.png","hash":"f50399a9eb469ed1e063ff4ccc0e8636c1b75f1e","modified":1740407245723},{"_id":"source/images/phase_4.png","hash":"81cd309a8990e015a8679b6a4e26a27d804c1da6","modified":1740410093173},{"_id":"themes/fluid/source/img/gh0s7.jpg","hash":"1c5af4f8cacdc3c6adbe8334866774cca2944910","modified":1740320867085},{"_id":"source/images/20241027_222225.png","hash":"f0595d1315d94e72e61c69e0499e5129e1821ba1","modified":1740320866763},{"_id":"source/images/b2054bbaf6197624d38cc2007d885fd1454454985.png","hash":"b021e971cedaa55b273eab2b10be94f795b06922","modified":1729572689000},{"_id":"source/images/lmms-import.png","hash":"002535b55a41f7a7dcba24517dd2397589416a64","modified":1744993882632},{"_id":"source/music/過ぎ去りし温もりの日々.mp3","hash":"22016dcdfcbac9393afd3fe97f2d6d6009cd57f5","modified":1747827275971},{"_id":"source/images/krita-official.png","hash":"2ec810a739ce33ad5666093b8c36d29028a17c17","modified":1752420936455},{"_id":"source/images/musecore-launch.png","hash":"0a6c5642d05b197555135cd602886311a9122df0","modified":1744993224514},{"_id":"source/images/zellij-helix.jpg","hash":"87fb5b7b51a4e3b062b891c04488a53457edded0","modified":1738492100321},{"_id":"themes/fluid/source/img/gensokyo.jpg","hash":"d82c0d5011c6cbc37109c9c80530d14cd266286f","modified":1740320867082},{"_id":"public/local-search.xml","hash":"e36b4f54cc4ef1487a0942eed42aad5f9299e100","modified":1763224614841},{"_id":"public/about/index.html","hash":"25d13773de22a48c1fc17d25aaf6d9907a73e28b","modified":1763224614841},{"_id":"public/2025/11/15/Your-exclusive-email-address/index.html","hash":"497249af59de2ee66d353ce33bb710c4c5786715","modified":1763224614841},{"_id":"public/2025/05/22/fortune/index.html","hash":"b763dfd33addce06c119e6e4d4e2414003a8be57","modified":1763224614841},{"_id":"public/2025/05/21/2025-5-21/index.html","hash":"37881747e0ab8347571056ef1e32a7b578afb140","modified":1763224614841},{"_id":"public/2025/07/13/kritabest/index.html","hash":"a1df181f8a0bcff143be03f49abc075b9920284a","modified":1763224614841},{"_id":"public/2025/03/10/archlinux-game-fix/index.html","hash":"9ae2ff5a413222135be2c4cc1bc0913ed39ad390","modified":1763224614841},{"_id":"public/2025/02/24/nudtbomblab/index.html","hash":"0a6392b9894d41caded05b2012588c043d91cc68","modified":1763224614841},{"_id":"public/2025/02/23/clonezilla/index.html","hash":"18b734abda3405019efcab2523f12e766bfa73a3","modified":1763224614841},{"_id":"public/2024/12/13/zellij-helix/index.html","hash":"952cd837e89121b41cef1b3fe92fc98f6253bcc4","modified":1763224614841},{"_id":"public/2025/05/23/gcc15restrict/index.html","hash":"d9e5bed8d1d0e738be5a8412360053a2e12c7e43","modified":1763224614841},{"_id":"public/2024/11/11/mhwi/index.html","hash":"ebe1a9550fe14035a215f067342373d3e2a2e8c5","modified":1763224614841},{"_id":"public/2025/03/10/searxng/index.html","hash":"2c8ae7693b4ece22f83f7536e4d2a5032499da90","modified":1763224614841},{"_id":"public/2024/11/06/overleaf/index.html","hash":"bc411b1a10fcbb6a5f6d0d213fa63f093830cae3","modified":1763224614841},{"_id":"public/2025/02/02/archlinux-optimization/index.html","hash":"1658dc07778483ded8a4e344eb807d3c4577746e","modified":1763224614841},{"_id":"public/2024/11/06/arch-nvidia/index.html","hash":"8ade129a78d71d3017432e1a65e1d6d292a16c53","modified":1763224614841},{"_id":"public/2024/11/04/Vocaloid调教-晴天/index.html","hash":"a3dd5c0b77bd2eb77555d349177492a02e17fd25","modified":1763224614841},{"_id":"public/2024/11/04/loopers/index.html","hash":"9eceb4b3fc581ba245f16a1b0217f5d2b1594b47","modified":1763224614841},{"_id":"public/2024/06/03/原来我还有个博客/index.html","hash":"7215c9a90d0695469c179717d27194e346a8abd0","modified":1763224614841},{"_id":"public/2023/12/31/12月31日进度报告/index.html","hash":"03f909c8954f0e623ccaf2e30fa44a1d3f45814b","modified":1763224614841},{"_id":"public/2024/10/30/GentleJena/index.html","hash":"0747019314125e796e102155e09febb4cbdb9b67","modified":1763224614841},{"_id":"public/2023/12/28/12月28日进度报告/index.html","hash":"5aa948c12c109b08b781baf308c9a80ddd3bc379","modified":1763224614841},{"_id":"public/2024/11/04/BlogUpdate/index.html","hash":"ac98c86ad12b3074414a44bfdf3ed153320d3a03","modified":1763224614841},{"_id":"public/2023/12/20/12月20日工作记录/index.html","hash":"5ee7c6817c2202a86dcf8e7e6898d2559c69dcf2","modified":1763224614841},{"_id":"public/2023/12/19/12月19日工作记录/index.html","hash":"bac072049959ec19cb53ad4b9180b53476c3542f","modified":1763224614841},{"_id":"public/2023/12/17/12月16-17日工作记录/index.html","hash":"2af885a19d1b28c3a1e6d4afdf110c6733a4c6b5","modified":1763224614841},{"_id":"public/2023/12/06/CGH0S7-s-Blog/index.html","hash":"b13772d5d9a1a7a19d1f565a27e8a9432f0da543","modified":1763224614841},{"_id":"public/archives/index.html","hash":"9768d2dda5965eb4a2a2c855022ff5c3cd915173","modified":1763224614841},{"_id":"public/2023/12/06/梦开始的地方/index.html","hash":"2df05084144d2567e92d3b9f59afbb720fbed05a","modified":1763224614841},{"_id":"public/archives/page/2/index.html","hash":"192345d653d4e82a88026fd55b4ac731d851dd1c","modified":1763224614841},{"_id":"public/2023/12/18/12月18日工作记录/index.html","hash":"82d3d1cab693f7808b28ed48803229a5290ee798","modified":1763224614841},{"_id":"public/archives/2023/index.html","hash":"d5052cf28c4ec0de436f7327192328855093970c","modified":1763224614841},{"_id":"public/archives/2024/index.html","hash":"fc91e93c49ce14ad85bf1855e1ad9eb69fd0f308","modified":1763224614841},{"_id":"public/archives/2024/06/index.html","hash":"52e4bb654a38910c5cd00494bbeaa46af81def96","modified":1763224614841},{"_id":"public/archives/2023/12/index.html","hash":"6a1cde2b35dc548d4ecdef9bdee169378e4c2a14","modified":1763224614841},{"_id":"public/archives/2024/11/index.html","hash":"1fb1a38fb01ad1c65172a319e32a66f7c1405ec2","modified":1763224614841},{"_id":"public/archives/2024/12/index.html","hash":"bb3f9997bab8f98163bfb091453d9fa6f65c10d0","modified":1763224614841},{"_id":"public/archives/2024/10/index.html","hash":"5561874693a8ffe513b2c533fb7bb5fd8c0e131f","modified":1763224614841},{"_id":"public/archives/2025/index.html","hash":"0ab5e4ed22c2c3e16125f1b6569d218555721834","modified":1763224614841},{"_id":"public/archives/2025/03/index.html","hash":"f11560632b43950122eb997f419fe74e92c16fca","modified":1763224614841},{"_id":"public/archives/2025/05/index.html","hash":"ff4fb479f5da8cec11486fe382a8ace4d25563f7","modified":1763224614841},{"_id":"public/archives/2025/07/index.html","hash":"632c0d08d30871940169edcfa8f19e377c3892b6","modified":1763224614841},{"_id":"public/archives/2025/11/index.html","hash":"3b09bb230a087922c0db85d8c6eed22dbc1dbd5a","modified":1763224614841},{"_id":"public/index.html","hash":"9dd2b636f31e1195d6dbca52ae43fb7e9b7f0e94","modified":1763224614841},{"_id":"public/page/2/index.html","hash":"39b3c78e482598be6fbf4a49e55b705cab72d95f","modified":1763224614841},{"_id":"public/archives/2025/02/index.html","hash":"c1c6ea89aed9fc5ae8fbf0cc611560a0c593e2be","modified":1763224614841},{"_id":"public/categories/更新/index.html","hash":"39ae73dfc0e214df88912e0a38b4cbf3b55e13a4","modified":1763224614841},{"_id":"public/page/3/index.html","hash":"992c49c1d2c61bf8a6810f55ed06b045e7f3a5f9","modified":1763224614841},{"_id":"public/archives/page/3/index.html","hash":"cb8822ce9bcc20d5fd8a1c654e689e9bacbba999","modified":1763224614841},{"_id":"public/categories/Vocaloid/index.html","hash":"048aca4e241b331d0209e9208c379fcf665a0fae","modified":1763224614841},{"_id":"public/tags/日志/index.html","hash":"0160660df456d6993ffff1eb4e8397f5198d8d39","modified":1763224614841},{"_id":"public/categories/Rearrangement/index.html","hash":"d86532128355807b19a6eb69208699289b62cfb7","modified":1763224614841},{"_id":"public/tags/TEST/index.html","hash":"2e5789b8e544c5e8404441c75b054f661294306a","modified":1763224614841},{"_id":"public/categories/技术分享/index.html","hash":"af921a46b2c79d42f3f975638ec3b7133af7028b","modified":1763224614841},{"_id":"public/tags/音乐/index.html","hash":"0c4de7bf53b25a52c23aaf27d7327d49d165268b","modified":1763224614841},{"_id":"public/tags/Vocaloid/index.html","hash":"98440598d6da10f35250eb46e393c0f7199fd848","modified":1763224614841},{"_id":"public/tags/日志/page/2/index.html","hash":"aa57dfa5c3f0f079ee752c53af3c798fd920d955","modified":1763224614841},{"_id":"public/tags/技术分享/index.html","hash":"bda865e4d5317a1029de847a6947c2227bf2d181","modified":1763224614841},{"_id":"public/tags/技术/index.html","hash":"9fe303dfd9633ea8deaa277121d4bdeb3100cd7a","modified":1763224614841},{"_id":"public/tags/板绘/index.html","hash":"05cf911d2c26ed5f6d104d875c11762e6e55b12e","modified":1763224614841},{"_id":"public/tags/系统优化/index.html","hash":"ff22e88f749e9ff6b5e47143fa5a24d3389a1795","modified":1763224614841},{"_id":"public/tags/Archlinux/index.html","hash":"5a8f0e067e637caac2101ea74f750f5ad9d0e45d","modified":1763224614841},{"_id":"public/tags/开源工具/index.html","hash":"413cb791b6e4f8b10b692a372aba73a022472720","modified":1763224614841},{"_id":"public/404.html","hash":"4696437e74fa558f8be811e50fdfd88f2a84e82b","modified":1763224614841},{"_id":"public/tags/学习/index.html","hash":"b754a2106f26f5f90fd1d4e6370b58904b39eda3","modified":1763224614841},{"_id":"public/categories/index.html","hash":"f2bbc847232265380a90a69b0d2f3bfb05137d31","modified":1763224614841},{"_id":"public/tags/index.html","hash":"7f8dd05c04727ffead5b9af41c9171ced3bbc8ee","modified":1763224614841},{"_id":"public/links/index.html","hash":"46f6120a630849e03697e69a4e74e876f37c1de1","modified":1763224614841},{"_id":"public/tags/生活/index.html","hash":"3c02d844602edb823daede03b684086c88599080","modified":1763224614841},{"_id":"public/images/amd.webp","hash":"cb0cfd5da0b9c10b9b22c65bba881cfde485d763","modified":1763224614841},{"_id":"public/images/archlinux-logo.png","hash":"4f6075309fadcb7f7547164cb8a99b4949f74598","modified":1763224614841},{"_id":"public/images/Written-By-Human-Not-By-AI-Badge-white@2x.png","hash":"994225c6fd72521b281144bdd98fefcca53e2c7b","modified":1763224614841},{"_id":"public/images/asc-events.png","hash":"a0b3610962062d0a322fe091bcc8f083ab13bc6e","modified":1763224614841},{"_id":"public/images/asc.png","hash":"3a33b35bff1b3f527f7a87a9d6a7d6d9a072a946","modified":1763224614841},{"_id":"public/images/built_on_the_kde_platform.png","hash":"507b6a4323b23772800006505e6c588bb515ebf5","modified":1763224614841},{"_id":"public/img/avatar.png","hash":"fe739a158cc128f70f780eb5fa96f388b81d478f","modified":1763224614841},{"_id":"public/img/police_beian.png","hash":"90efded6baa2dde599a9d6b1387973e8e64923ea","modified":1763224614841},{"_id":"public/img/loading.gif","hash":"2d2fc0f947940f98c21afafef39ecf226a2e8d55","modified":1763224614841},{"_id":"public/xml/local-search.xml","hash":"8c96ba6a064705602ce28d096fd7dd9069630a55","modified":1763224614841},{"_id":"public/css/highlight-dark.css","hash":"902294bada4323c0f51502d67cba8c3a0298952f","modified":1763224614841},{"_id":"public/css/gitalk.css","hash":"a57b3cc8e04a0a4a27aefa07facf5b5e7bca0e76","modified":1763224614841},{"_id":"public/css/highlight.css","hash":"04d4ddbb5e1d1007447c2fe293ee05aae9b9563e","modified":1763224614841},{"_id":"public/css/main.css","hash":"06433abcb688c2f5473623a9355bff9865c48d3f","modified":1763224614841},{"_id":"public/js/boot.js","hash":"38bd26c6b7acdafda86dda3560e6a3ca488d3c76","modified":1763224614841},{"_id":"public/js/color-schema.js","hash":"1ef88c881b9f942deadde3d890387b94c617342a","modified":1763224614841},{"_id":"public/images/phase1_strings.png","hash":"6fb457adddc5bb32aa463b6227542076c4b501e7","modified":1763224614841},{"_id":"public/img/hifuu.png","hash":"331b5950baf96f5d39192bb42b7da4d22a08992e","modified":1763224614841},{"_id":"public/js/events.js","hash":"6869811f67e4c3de3edfa4b08464bb242b97a402","modified":1763224614841},{"_id":"public/js/plugins.js","hash":"c34916291e392a774ff3e85c55badb83e8661297","modified":1763224614841},{"_id":"public/js/img-lazyload.js","hash":"cbdeca434ec4da51f488c821d51b4d23c73294af","modified":1763224614841},{"_id":"public/js/leancloud.js","hash":"eff77c7a5c399fcaefda48884980571e15243fc9","modified":1763224614841},{"_id":"public/js/local-search.js","hash":"b9945f76f8682f3ec32edfb285b26eb559f7b7e8","modified":1763224614841},{"_id":"public/js/umami-view.js","hash":"33c4b3883fa747604074ad3921606eeeaeb50716","modified":1763224614841},{"_id":"public/js/utils.js","hash":"b82e7c289a66dfd36064470fd41c0e96fc598b43","modified":1763224614841},{"_id":"public/images/rusendhelp3.png","hash":"db656266b54c91e540f3c677b146c0931b61277e","modified":1763224614841},{"_id":"public/images/searxng.png","hash":"9514f2bd14ac1cafa437f3655d9382d477667094","modified":1763224614841},{"_id":"public/images/rusendhelp1.png","hash":"73aa5b41d33c7f3392de28b7b696ebcb12248d82","modified":1763224614841},{"_id":"public/images/caseclosed.png","hash":"628b54b49c86a23af595a52daba9e0557b81a17a","modified":1763224614841},{"_id":"public/images/resendofficial.png","hash":"41c2cafe3a11c1674a0a1ec27698ea94cecc9a23","modified":1763224614841},{"_id":"public/images/rusendhelp2.png","hash":"3752f3041d28cbadcb4abc26151f0d17f505908d","modified":1763224614841},{"_id":"public/images/audiveris.png","hash":"52aa9df5f93559c2e47b30afbf84fc6cc6b34002","modified":1763224614841},{"_id":"public/images/musecore-to-midi.png","hash":"02ba31b29ba069dfef0e1cf26c5ccec9dc3d2289","modified":1763224614841},{"_id":"public/images/1730728153314.png","hash":"95d44ea62557a311503cab58d1dec5cafc97e07d","modified":1763224614841},{"_id":"public/images/musecore.png","hash":"9b2eba87e7c93e57f2024697d1ff4217d206e5ac","modified":1763224614841},{"_id":"public/images/yana.jpg","hash":"757c68ec322e834eace7236c38e74a4f9585d474","modified":1763224614841},{"_id":"public/img/gh0s7.jpg","hash":"1c5af4f8cacdc3c6adbe8334866774cca2944910","modified":1763224614841},{"_id":"public/images/xb2score.png","hash":"03efbb07a7bb7f6c7d58b98ed125cafe42074b94","modified":1763224614841},{"_id":"public/images/phase1.png","hash":"42533712403be6036231f1e3770f125858bf91d7","modified":1763224614841},{"_id":"public/images/5364bba6d035326e82c53504dd53e7c2454454985.png","hash":"11b11f23ebebbe08e8cf826b48eb37b4084796cd","modified":1763224614841},{"_id":"public/images/1613f5602b203b38230f19699deb0219454454985.png","hash":"3d71204d9a0731384f97ad0f90802a5c9fd96776","modified":1763224614841},{"_id":"public/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png","hash":"dddf72bb12aef01baa3eb2017bb867f274059f12","modified":1763224614841},{"_id":"public/images/mhwilds4050.jpg","hash":"9b2b15c66e2340c15b86cec0fa8f818b67e06384","modified":1763224614841},{"_id":"public/images/clonezilla.png","hash":"7f443d79783df3744b2e51613422ee8fd7eea6f8","modified":1763224614841},{"_id":"public/images/mhwilds780M.jpg","hash":"e2c59c6caae452afb424d9f2fc3a255a44121b49","modified":1763224614841},{"_id":"public/images/phase_2_14.png","hash":"f50399a9eb469ed1e063ff4ccc0e8636c1b75f1e","modified":1763224614841},{"_id":"public/images/phase_4.png","hash":"81cd309a8990e015a8679b6a4e26a27d804c1da6","modified":1763224614841},{"_id":"public/images/20241027_222225.png","hash":"f0595d1315d94e72e61c69e0499e5129e1821ba1","modified":1763224614841},{"_id":"public/images/b2054bbaf6197624d38cc2007d885fd1454454985.png","hash":"b021e971cedaa55b273eab2b10be94f795b06922","modified":1763224614841},{"_id":"public/images/lmms-import.png","hash":"002535b55a41f7a7dcba24517dd2397589416a64","modified":1763224614841},{"_id":"public/music/過ぎ去りし温もりの日々.mp3","hash":"22016dcdfcbac9393afd3fe97f2d6d6009cd57f5","modified":1763224614841},{"_id":"public/images/krita-official.png","hash":"2ec810a739ce33ad5666093b8c36d29028a17c17","modified":1763224614841},{"_id":"public/images/musecore-launch.png","hash":"0a6c5642d05b197555135cd602886311a9122df0","modified":1763224614841},{"_id":"public/images/zellij-helix.jpg","hash":"87fb5b7b51a4e3b062b891c04488a53457edded0","modified":1763224614841},{"_id":"public/img/gensokyo.jpg","hash":"d82c0d5011c6cbc37109c9c80530d14cd266286f","modified":1763224614841}],"Category":[{"name":"更新","_id":"cmi0iescs000hog2b6i033sxi"},{"name":"Rearrangement","_id":"cmi0iesct000pog2be99zbtna"},{"name":"Vocaloid","_id":"cmi0iescu000wog2b0h9u4our"},{"name":"技术分享","_id":"cmi0iescv0012og2b8zqxfcql"}],"Data":[],"Page":[{"title":"About","date":"2024-11-04T14:46:12.000Z","layout":"about","_content":"\n白茅铺高地玄院第N任非菌群主🐳Linux六年牢用户🐧\n\n爱好编程绘画编曲Vocaloid调教Blender建模等😇\n\n截至目前最喜欢的歌手是宇多田光❤\n\n联系方式\n\n- Email: <c_gh0s7@nudt.edu.cn>\n\n- Github: <https://github.com/CGH0S7>\n","source":"about/index.md","raw":"---\ntitle: About\ndate: 2024-11-04 22:46:12\nlayout: about\n---\n\n白茅铺高地玄院第N任非菌群主🐳Linux六年牢用户🐧\n\n爱好编程绘画编曲Vocaloid调教Blender建模等😇\n\n截至目前最喜欢的歌手是宇多田光❤\n\n联系方式\n\n- Email: <c_gh0s7@nudt.edu.cn>\n\n- Github: <https://github.com/CGH0S7>\n","updated":"2025-02-23T16:01:20.093Z","path":"about/index.html","comments":1,"_id":"cmi0iescm0000og2bgzfr7q93","content":"<p>白茅铺高地玄院第N任非菌群主🐳Linux六年牢用户🐧</p>\n<p>爱好编程绘画编曲Vocaloid调教Blender建模等😇</p>\n<p>截至目前最喜欢的歌手是宇多田光❤️</p>\n<p>联系方式:</p>\n<ul>\n<li><p>Email: <a href=\"mailto:&#x63;&#95;&#103;&#x68;&#x30;&#x73;&#55;&#x40;&#110;&#117;&#x64;&#x74;&#x2e;&#x65;&#x64;&#117;&#x2e;&#99;&#x6e;\">&#x63;&#95;&#103;&#x68;&#x30;&#x73;&#55;&#x40;&#110;&#117;&#x64;&#x74;&#x2e;&#x65;&#x64;&#117;&#x2e;&#99;&#x6e;</a></p>\n</li>\n<li><p>Github: <a href=\"https://github.com/CGH0S7\">https://github.com/CGH0S7</a></p>\n</li>\n</ul>\n","excerpt":"","more":"<p>白茅铺高地玄院第N任非菌群主🐳Linux六年牢用户🐧</p>\n<p>爱好编程绘画编曲Vocaloid调教Blender建模等😇</p>\n<p>截至目前最喜欢的歌手是宇多田光❤️</p>\n<p>联系方式:</p>\n<ul>\n<li><p>Email: <a href=\"mailto:&#x63;&#95;&#103;&#x68;&#x30;&#x73;&#55;&#x40;&#110;&#117;&#x64;&#x74;&#x2e;&#x65;&#x64;&#117;&#x2e;&#99;&#x6e;\">&#x63;&#95;&#103;&#x68;&#x30;&#x73;&#55;&#x40;&#110;&#117;&#x64;&#x74;&#x2e;&#x65;&#x64;&#117;&#x2e;&#99;&#x6e;</a></p>\n</li>\n<li><p>Github: <a href=\"https://github.com/CGH0S7\">https://github.com/CGH0S7</a></p>\n</li>\n</ul>\n"}],"Post":[{"title":"12月16-17日工作记录","date":"2023-12-17T14:26:17.000Z","_content":"## 12月16-17日\n1. 四级考试\n2. 自学cudaopenacc了解GPU架构知识\n3. 参加超算队启动会\n4. 大计和高数期中考试\n5. 研究spack使用\n6. 学习cuda编程\n7. 补作业\n","source":"_posts/12月16-17日工作记录.md","raw":"---\ntitle: 12月16-17日工作记录\ndate: 2023-12-17 22:26:17\ntags: [日志]\n---\n## 12月16-17日\n1. 四级考试\n2. 自学cudaopenacc了解GPU架构知识\n3. 参加超算队启动会\n4. 大计和高数期中考试\n5. 研究spack使用\n6. 学习cuda编程\n7. 补作业\n","slug":"12月16-17日工作记录","published":1,"updated":"2025-02-23T14:27:46.747Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescn0001og2b9rmqf5nk","content":"<h2 id=\"12月16-17日\"><a href=\"#12月16-17日\" class=\"headerlink\" title=\"12月16-17日\"></a>12月16-17日</h2><ol>\n<li>四级考试</li>\n<li>自学cudaopenacc了解GPU架构知识</li>\n<li>参加超算队启动会</li>\n<li>大计和高数期中考试</li>\n<li>研究spack使用</li>\n<li>学习cuda编程</li>\n<li>补作业</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月16-17日\"><a href=\"#12月16-17日\" class=\"headerlink\" title=\"12月16-17日\"></a>12月16-17日</h2><ol>\n<li>四级考试</li>\n<li>自学cudaopenacc了解GPU架构知识</li>\n<li>参加超算队启动会</li>\n<li>大计和高数期中考试</li>\n<li>研究spack使用</li>\n<li>学习cuda编程</li>\n<li>补作业</li>\n</ol>\n"},{"title":"12月18日工作记录","date":"2023-12-18T13:57:34.000Z","_content":"## 12月18日\n1. 初步了解opencaeporo尝试在本地docker环境使用gcc完成编译安装目前完成各项依赖安装由于晚上停电计划明天开始编译安装opencaeporo本体并在本地调优;\n2. 协助Neko组完成任务;\n3. 找出spack存在网络原因无法下载时的手动解决方案.","source":"_posts/12月18日工作记录.md","raw":"---\ntitle: 12月18日工作记录\ndate: 2023-12-18 21:57:34\ntags: [日志]\n---\n## 12月18日\n1. 初步了解opencaeporo尝试在本地docker环境使用gcc完成编译安装目前完成各项依赖安装由于晚上停电计划明天开始编译安装opencaeporo本体并在本地调优;\n2. 协助Neko组完成任务;\n3. 找出spack存在网络原因无法下载时的手动解决方案.","slug":"12月18日工作记录","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iesco0002og2bd2on1smz","content":"<h2 id=\"12月18日\"><a href=\"#12月18日\" class=\"headerlink\" title=\"12月18日\"></a>12月18日</h2><ol>\n<li>初步了解opencaeporo尝试在本地docker环境使用gcc完成编译安装目前完成各项依赖安装由于晚上停电计划明天开始编译安装opencaeporo本体并在本地调优;</li>\n<li>协助Neko组完成任务;</li>\n<li>找出spack存在网络原因无法下载时的手动解决方案.</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月18日\"><a href=\"#12月18日\" class=\"headerlink\" title=\"12月18日\"></a>12月18日</h2><ol>\n<li>初步了解opencaeporo尝试在本地docker环境使用gcc完成编译安装目前完成各项依赖安装由于晚上停电计划明天开始编译安装opencaeporo本体并在本地调优;</li>\n<li>协助Neko组完成任务;</li>\n<li>找出spack存在网络原因无法下载时的手动解决方案.</li>\n</ol>\n"},{"title":"12月19日工作记录","date":"2023-12-19T13:59:47.000Z","_content":"## 12月18日\n1. 彻底完成opencaeporo安装部署本地和服务器均已安装明天正式开始调优工作;\n2. 学习cuda编程.\n","source":"_posts/12月19日工作记录.md","raw":"---\ntitle: 12月19日工作记录\ndate: 2023-12-19 21:59:47\ntags: [日志]\n---\n## 12月18日\n1. 彻底完成opencaeporo安装部署本地和服务器均已安装明天正式开始调优工作;\n2. 学习cuda编程.\n","slug":"12月19日工作记录","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescp0004og2b3lrb6vyo","content":"<h2 id=\"12月18日\"><a href=\"#12月18日\" class=\"headerlink\" title=\"12月18日\"></a>12月18日</h2><ol>\n<li>彻底完成opencaeporo安装部署本地和服务器均已安装明天正式开始调优工作;</li>\n<li>学习cuda编程.</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月18日\"><a href=\"#12月18日\" class=\"headerlink\" title=\"12月18日\"></a>12月18日</h2><ol>\n<li>彻底完成opencaeporo安装部署本地和服务器均已安装明天正式开始调优工作;</li>\n<li>学习cuda编程.</li>\n</ol>\n"},{"title":"12月20日工作记录","date":"2023-12-20T13:56:42.000Z","_content":"## 12月20日\n\nOpenCAEPoro 小组(黄**,梁**,程**\n\n1. 阅读代码,开展优化工作,初步使用openacc完成petsc_solver的优化取得一定优化效果\n\n> 优化方向基本确定为OpenMP/OpenACC并行化+cuda移植\n\n2. 赛题环境汇总目前各组工作有序开展CentOS 7符合要求暂未发现更换系统需求\n","source":"_posts/12月20日工作记录.md","raw":"---\ntitle: 12月20日工作记录\ndate: 2023-12-20 21:56:42\ntags: 日志\n---\n## 12月20日\n\nOpenCAEPoro 小组(黄**,梁**,程**\n\n1. 阅读代码,开展优化工作,初步使用openacc完成petsc_solver的优化取得一定优化效果\n\n> 优化方向基本确定为OpenMP/OpenACC并行化+cuda移植\n\n2. 赛题环境汇总目前各组工作有序开展CentOS 7符合要求暂未发现更换系统需求\n","slug":"12月20日工作记录","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescp0005og2b38g8hgyl","content":"<h2 id=\"12月20日\"><a href=\"#12月20日\" class=\"headerlink\" title=\"12月20日\"></a>12月20日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程**</p>\n<ol>\n<li>阅读代码,开展优化工作,初步使用openacc完成petsc_solver的优化取得一定优化效果</li>\n</ol>\n<blockquote>\n<p>优化方向基本确定为OpenMP&#x2F;OpenACC并行化+cuda移植</p>\n</blockquote>\n<ol start=\"2\">\n<li>赛题环境汇总目前各组工作有序开展CentOS 7符合要求暂未发现更换系统需求</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月20日\"><a href=\"#12月20日\" class=\"headerlink\" title=\"12月20日\"></a>12月20日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程**</p>\n<ol>\n<li>阅读代码,开展优化工作,初步使用openacc完成petsc_solver的优化取得一定优化效果</li>\n</ol>\n<blockquote>\n<p>优化方向基本确定为OpenMP&#x2F;OpenACC并行化+cuda移植</p>\n</blockquote>\n<ol start=\"2\">\n<li>赛题环境汇总目前各组工作有序开展CentOS 7符合要求暂未发现更换系统需求</li>\n</ol>\n"},{"title":"12月28日进度报告","date":"2023-12-28T15:22:13.000Z","_content":"## 12月28日\n\nOpenCAEPoro 小组(黄**,梁**,程**,刘**\n\n1. 各组员继续进行优化工作,部分函数完成cuda移植取得一定优化效果\n2. 继续学习openacc及cuda相关知识\n3. 搜集多孔介质流动模拟与opencaeporo相关论文资料为proposal做准备\n","source":"_posts/12月28日进度报告.md","raw":"---\ntitle: 12月28日进度报告\ndate: 2023-12-28 23:22:13\ntags: 日志\n---\n## 12月28日\n\nOpenCAEPoro 小组(黄**,梁**,程**,刘**\n\n1. 各组员继续进行优化工作,部分函数完成cuda移植取得一定优化效果\n2. 继续学习openacc及cuda相关知识\n3. 搜集多孔介质流动模拟与opencaeporo相关论文资料为proposal做准备\n","slug":"12月28日进度报告","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescq0006og2b6l6sf7kb","content":"<h2 id=\"12月28日\"><a href=\"#12月28日\" class=\"headerlink\" title=\"12月28日\"></a>12月28日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程<strong>,刘</strong></p>\n<ol>\n<li>各组员继续进行优化工作,部分函数完成cuda移植取得一定优化效果</li>\n<li>继续学习openacc及cuda相关知识</li>\n<li>搜集多孔介质流动模拟与opencaeporo相关论文资料为proposal做准备</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月28日\"><a href=\"#12月28日\" class=\"headerlink\" title=\"12月28日\"></a>12月28日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程<strong>,刘</strong></p>\n<ol>\n<li>各组员继续进行优化工作,部分函数完成cuda移植取得一定优化效果</li>\n<li>继续学习openacc及cuda相关知识</li>\n<li>搜集多孔介质流动模拟与opencaeporo相关论文资料为proposal做准备</li>\n</ol>\n"},{"title":"12月30-31日进度报告","date":"2023-12-30T16:07:09.000Z","_content":"## 12月30-31日\n\nOpenCAEPoro 小组(黄**,梁**,程**,刘**\n\n1. 服务器上的Opencaeporo改用nvhpc编译器编译以支持cuda;\n2. 收集运行数据用于proposal绘制图表;\n3. 继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.\n","source":"_posts/12月31日进度报告.md","raw":"---\ntitle: 12月30-31日进度报告\ndate: 2023-12-31 00:07:09\ntags: 日志\n---\n## 12月30-31日\n\nOpenCAEPoro 小组(黄**,梁**,程**,刘**\n\n1. 服务器上的Opencaeporo改用nvhpc编译器编译以支持cuda;\n2. 收集运行数据用于proposal绘制图表;\n3. 继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.\n","slug":"12月31日进度报告","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescq0009og2bettuhl91","content":"<h2 id=\"12月30-31日\"><a href=\"#12月30-31日\" class=\"headerlink\" title=\"12月30-31日\"></a>12月30-31日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程<strong>,刘</strong></p>\n<ol>\n<li>服务器上的Opencaeporo改用nvhpc编译器编译以支持cuda;</li>\n<li>收集运行数据用于proposal绘制图表;</li>\n<li>继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.</li>\n</ol>\n","excerpt":"","more":"<h2 id=\"12月30-31日\"><a href=\"#12月30-31日\" class=\"headerlink\" title=\"12月30-31日\"></a>12月30-31日</h2><p>OpenCAEPoro 小组(黄<strong>,梁</strong>,程<strong>,刘</strong></p>\n<ol>\n<li>服务器上的Opencaeporo改用nvhpc编译器编译以支持cuda;</li>\n<li>收集运行数据用于proposal绘制图表;</li>\n<li>继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.</li>\n</ol>\n"},{"title":"小满随笔——决断","date":"2025-05-21T11:59:21.000Z","_content":"\n<div style=\"max-width: 600px; margin: 20px auto; padding: 15px; border-radius: 10px; background-color:rgb(34, 42, 54); box-shadow: 0 2px 5px rgba(241, 213, 2, 0.5);\">\n <div style=\"font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: center; color: #cfcfcf;\">\n Lost Days of Warmth - Yasunori Mitsuda\n </div>\n <audio src=\"/music/過ぎ去りし温もりの日々.mp3\" autoplay loop controls style=\"width: 100%; margin-top: 10px;\"></audio>\n</div>\n\n我本以为自己已经有足够的勇气和平静的心态去面对生活里的各种变故了即便如此今天还是被突如其来的噩耗痛击得面目全非。\n\n辛辛苦苦和队友准备了大半年的ASC25失利我想着以后回过头来看也不算什么以最快的速度调整心态;回校后一来就是各种烂摊子写不完的作业补不完的课程还有被脑子缺根筋的弱智评委恶意低分的大创立项成绩我寻思这些事情烦完这阵也就过去了人总不可能一直倒霉吧。结果就是今天下午排队验收CSAPP课程的shell实验时突然看到了外婆去世的消息一时间两腿发软大脑空白不知所措以至于后来排到我和教辅讲解实验过程时也是胡言乱语记不清自己到底说了什么尽管最后还是被教辅满分放过了。\n\n小时候家里没现在景气父母在市内打拼我则是被送到郊区被外婆抚养长大上小学后为了让我进入一中直升班从二年级起我就被送进了奥数培训班同时搬离了自己长大的地方再到后来市政府改造外婆家早已被拆得无影无踪昔日的小伙伴杳无音信温馨错杂的小居民区变成了陌生嘈杂的大酒店和菜市场每次路过都不敢停留。从那以后外婆成了我和童年之间仅剩的联系尽管老人后来连我的样貌也记不清楚。现如今童年记忆里最后的故人业已离开再回首已是一片虚无。多年前外婆犯脑溢血被抢救回来的时候医生还承诺老人家活到抱孙子没问题如今却猝不及防地驾鹤西去。在各种小说和游戏中经历过不少难忘的生死离别可是到了现实亲自经历依旧痛心疾首难以放下。\n\n生物无法教会人们生命究竟是什么生活却一点就通。上一次经历这种打击还是10年左右外公离开那时候太小什么都不懂等长大理解了经历的时间又足以抹平悲痛。如今在我的眼里生命就是思念是世间个体对其他个体的牵挂与个体之间互相建立的羁绊。我真的想停留在永远的当下和自己爱的人永远定格在某一个瞬间每天早上是一样的朝阳出门是熟悉的面孔回家是亲切的声音。然而活着就意味着必须面对各种苦楚死去元知万事空只有离开才是最好的解脱活着的人要背负更多。长者的时间在一天天减少他们的生命需要由后人去延续但是后人的生活也不容易面对各种困境放弃往往比坚持更加轻松更有甚者勇敢地选择自戕从而摆脱一切但是这样是不对的让其他人代替自己承受痛苦是不对的令人悲伤的选择是不应该做出的活着的人哪怕再苦只要身上背负了其他人的思念也只能继续前进。\n\n因此我绝对不能气馁我珍视现在和亲人朋友的点点滴滴珍惜自己现在拥有的一切我以最真诚的爱回馈所有爱我的人不论面前有多少困难我都会尽全力克服这不是为我自己现在我被摧残得只想躺平摆烂但是为了所有信任我关心我的人如今我绝对不能停下脚步。从来就没有永远的当下连接我和童年最后的纽带已经被切断再也不能回头留给我的只剩下面前的未来需要我亲手创造的未来只有承受住来自各方的打击我才有能力去维护由我创造的未来既然选择了远方便只顾风雨兼程。\n\n2025年的长沙小满格外燥热痛定思过后的心是如此平静没有多少时间可以浪费了无需多言。\n\n*“回首向来萧瑟处,归去,也无风雨也无晴!”*\n","source":"_posts/2025-5-21.md","raw":"---\ntitle: 小满随笔——决断\ndate: 2025-05-21 19:59:21\ntags: 日志\n---\n\n<div style=\"max-width: 600px; margin: 20px auto; padding: 15px; border-radius: 10px; background-color:rgb(34, 42, 54); box-shadow: 0 2px 5px rgba(241, 213, 2, 0.5);\">\n <div style=\"font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: center; color: #cfcfcf;\">\n Lost Days of Warmth - Yasunori Mitsuda\n </div>\n <audio src=\"/music/過ぎ去りし温もりの日々.mp3\" autoplay loop controls style=\"width: 100%; margin-top: 10px;\"></audio>\n</div>\n\n我本以为自己已经有足够的勇气和平静的心态去面对生活里的各种变故了即便如此今天还是被突如其来的噩耗痛击得面目全非。\n\n辛辛苦苦和队友准备了大半年的ASC25失利我想着以后回过头来看也不算什么以最快的速度调整心态;回校后一来就是各种烂摊子写不完的作业补不完的课程还有被脑子缺根筋的弱智评委恶意低分的大创立项成绩我寻思这些事情烦完这阵也就过去了人总不可能一直倒霉吧。结果就是今天下午排队验收CSAPP课程的shell实验时突然看到了外婆去世的消息一时间两腿发软大脑空白不知所措以至于后来排到我和教辅讲解实验过程时也是胡言乱语记不清自己到底说了什么尽管最后还是被教辅满分放过了。\n\n小时候家里没现在景气父母在市内打拼我则是被送到郊区被外婆抚养长大上小学后为了让我进入一中直升班从二年级起我就被送进了奥数培训班同时搬离了自己长大的地方再到后来市政府改造外婆家早已被拆得无影无踪昔日的小伙伴杳无音信温馨错杂的小居民区变成了陌生嘈杂的大酒店和菜市场每次路过都不敢停留。从那以后外婆成了我和童年之间仅剩的联系尽管老人后来连我的样貌也记不清楚。现如今童年记忆里最后的故人业已离开再回首已是一片虚无。多年前外婆犯脑溢血被抢救回来的时候医生还承诺老人家活到抱孙子没问题如今却猝不及防地驾鹤西去。在各种小说和游戏中经历过不少难忘的生死离别可是到了现实亲自经历依旧痛心疾首难以放下。\n\n生物无法教会人们生命究竟是什么生活却一点就通。上一次经历这种打击还是10年左右外公离开那时候太小什么都不懂等长大理解了经历的时间又足以抹平悲痛。如今在我的眼里生命就是思念是世间个体对其他个体的牵挂与个体之间互相建立的羁绊。我真的想停留在永远的当下和自己爱的人永远定格在某一个瞬间每天早上是一样的朝阳出门是熟悉的面孔回家是亲切的声音。然而活着就意味着必须面对各种苦楚死去元知万事空只有离开才是最好的解脱活着的人要背负更多。长者的时间在一天天减少他们的生命需要由后人去延续但是后人的生活也不容易面对各种困境放弃往往比坚持更加轻松更有甚者勇敢地选择自戕从而摆脱一切但是这样是不对的让其他人代替自己承受痛苦是不对的令人悲伤的选择是不应该做出的活着的人哪怕再苦只要身上背负了其他人的思念也只能继续前进。\n\n因此我绝对不能气馁我珍视现在和亲人朋友的点点滴滴珍惜自己现在拥有的一切我以最真诚的爱回馈所有爱我的人不论面前有多少困难我都会尽全力克服这不是为我自己现在我被摧残得只想躺平摆烂但是为了所有信任我关心我的人如今我绝对不能停下脚步。从来就没有永远的当下连接我和童年最后的纽带已经被切断再也不能回头留给我的只剩下面前的未来需要我亲手创造的未来只有承受住来自各方的打击我才有能力去维护由我创造的未来既然选择了远方便只顾风雨兼程。\n\n2025年的长沙小满格外燥热痛定思过后的心是如此平静没有多少时间可以浪费了无需多言。\n\n*“回首向来萧瑟处,归去,也无风雨也无晴!”*\n","slug":"2025-5-21","published":1,"updated":"2025-05-21T13:34:43.639Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescr000bog2bhmv17lab","content":"<div style=\"max-width: 600px; margin: 20px auto; padding: 15px; border-radius: 10px; background-color:rgb(34, 42, 54); box-shadow: 0 2px 5px rgba(241, 213, 2, 0.5);\">\n <div style=\"font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: center; color: #cfcfcf;\">\n Lost Days of Warmth - Yasunori Mitsuda\n </div>\n <audio src=\"/music/過ぎ去りし温もりの日々.mp3\" autoplay loop controls style=\"width: 100%; margin-top: 10px;\"></audio>\n</div>\n\n<p>我本以为自己已经有足够的勇气和平静的心态去面对生活里的各种变故了,即便如此今天还是被突如其来的噩耗痛击得面目全非。</p>\n<p>辛辛苦苦和队友准备了大半年的ASC25失利我想着以后回过头来看也不算什么以最快的速度调整心态;回校后一来就是各种烂摊子写不完的作业补不完的课程还有被脑子缺根筋的弱智评委恶意低分的大创立项成绩我寻思这些事情烦完这阵也就过去了人总不可能一直倒霉吧。结果就是今天下午排队验收CSAPP课程的shell实验时突然看到了外婆去世的消息一时间两腿发软大脑空白不知所措以至于后来排到我和教辅讲解实验过程时也是胡言乱语记不清自己到底说了什么尽管最后还是被教辅满分放过了。</p>\n<p>小时候家里没现在景气,父母在市内打拼我则是被送到郊区被外婆抚养长大,上小学后为了让我进入一中直升班从二年级起我就被送进了奥数培训班,同时搬离了自己长大的地方,再到后来市政府改造,外婆家早已被拆得无影无踪,昔日的小伙伴杳无音信,温馨错杂的小居民区变成了陌生嘈杂的大酒店和菜市场,每次路过都不敢停留。从那以后外婆成了我和童年之间仅剩的联系,尽管老人后来连我的样貌也记不清楚。现如今童年记忆里最后的故人业已离开,再回首已是一片虚无。多年前外婆犯脑溢血被抢救回来的时候医生还承诺老人家活到抱孙子没问题,如今却猝不及防地驾鹤西去。在各种小说和游戏中经历过不少难忘的生死离别,可是到了现实亲自经历依旧痛心疾首难以放下。</p>\n<p>生物无法教会人们生命究竟是什么生活却一点就通。上一次经历这种打击还是10年左右外公离开那时候太小什么都不懂等长大理解了经历的时间又足以抹平悲痛。如今在我的眼里生命就是思念是世间个体对其他个体的牵挂与个体之间互相建立的羁绊。我真的想停留在永远的当下和自己爱的人永远定格在某一个瞬间每天早上是一样的朝阳出门是熟悉的面孔回家是亲切的声音。然而活着就意味着必须面对各种苦楚死去元知万事空只有离开才是最好的解脱活着的人要背负更多。长者的时间在一天天减少他们的生命需要由后人去延续但是后人的生活也不容易面对各种困境放弃往往比坚持更加轻松更有甚者勇敢地选择自戕从而摆脱一切但是这样是不对的让其他人代替自己承受痛苦是不对的令人悲伤的选择是不应该做出的活着的人哪怕再苦只要身上背负了其他人的思念也只能继续前进。</p>\n<p>因此,我绝对不能气馁,我珍视现在和亲人朋友的点点滴滴,珍惜自己现在拥有的一切,我以最真诚的爱回馈所有爱我的人,不论面前有多少困难,我都会尽全力克服,这不是为我自己,现在我被摧残得只想躺平摆烂,但是为了所有信任我关心我的人,如今我绝对不能停下脚步。从来就没有永远的当下,连接我和童年最后的纽带已经被切断,再也不能回头,留给我的只剩下面前的未来,需要我亲手创造的未来,只有承受住来自各方的打击,我才有能力去维护由我创造的未来,既然选择了远方,便只顾风雨兼程。</p>\n<p>2025年的长沙小满格外燥热痛定思过后的心是如此平静没有多少时间可以浪费了无需多言。</p>\n<p><em>“回首向来萧瑟处,归去,也无风雨也无晴!”</em></p>\n","excerpt":"","more":"<div style=\"max-width: 600px; margin: 20px auto; padding: 15px; border-radius: 10px; background-color:rgb(34, 42, 54); box-shadow: 0 2px 5px rgba(241, 213, 2, 0.5);\">\n <div style=\"font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: center; color: #cfcfcf;\">\n Lost Days of Warmth - Yasunori Mitsuda\n </div>\n <audio src=\"/music/過ぎ去りし温もりの日々.mp3\" autoplay loop controls style=\"width: 100%; margin-top: 10px;\"></audio>\n</div>\n\n<p>我本以为自己已经有足够的勇气和平静的心态去面对生活里的各种变故了,即便如此今天还是被突如其来的噩耗痛击得面目全非。</p>\n<p>辛辛苦苦和队友准备了大半年的ASC25失利我想着以后回过头来看也不算什么以最快的速度调整心态;回校后一来就是各种烂摊子写不完的作业补不完的课程还有被脑子缺根筋的弱智评委恶意低分的大创立项成绩我寻思这些事情烦完这阵也就过去了人总不可能一直倒霉吧。结果就是今天下午排队验收CSAPP课程的shell实验时突然看到了外婆去世的消息一时间两腿发软大脑空白不知所措以至于后来排到我和教辅讲解实验过程时也是胡言乱语记不清自己到底说了什么尽管最后还是被教辅满分放过了。</p>\n<p>小时候家里没现在景气,父母在市内打拼我则是被送到郊区被外婆抚养长大,上小学后为了让我进入一中直升班从二年级起我就被送进了奥数培训班,同时搬离了自己长大的地方,再到后来市政府改造,外婆家早已被拆得无影无踪,昔日的小伙伴杳无音信,温馨错杂的小居民区变成了陌生嘈杂的大酒店和菜市场,每次路过都不敢停留。从那以后外婆成了我和童年之间仅剩的联系,尽管老人后来连我的样貌也记不清楚。现如今童年记忆里最后的故人业已离开,再回首已是一片虚无。多年前外婆犯脑溢血被抢救回来的时候医生还承诺老人家活到抱孙子没问题,如今却猝不及防地驾鹤西去。在各种小说和游戏中经历过不少难忘的生死离别,可是到了现实亲自经历依旧痛心疾首难以放下。</p>\n<p>生物无法教会人们生命究竟是什么生活却一点就通。上一次经历这种打击还是10年左右外公离开那时候太小什么都不懂等长大理解了经历的时间又足以抹平悲痛。如今在我的眼里生命就是思念是世间个体对其他个体的牵挂与个体之间互相建立的羁绊。我真的想停留在永远的当下和自己爱的人永远定格在某一个瞬间每天早上是一样的朝阳出门是熟悉的面孔回家是亲切的声音。然而活着就意味着必须面对各种苦楚死去元知万事空只有离开才是最好的解脱活着的人要背负更多。长者的时间在一天天减少他们的生命需要由后人去延续但是后人的生活也不容易面对各种困境放弃往往比坚持更加轻松更有甚者勇敢地选择自戕从而摆脱一切但是这样是不对的让其他人代替自己承受痛苦是不对的令人悲伤的选择是不应该做出的活着的人哪怕再苦只要身上背负了其他人的思念也只能继续前进。</p>\n<p>因此,我绝对不能气馁,我珍视现在和亲人朋友的点点滴滴,珍惜自己现在拥有的一切,我以最真诚的爱回馈所有爱我的人,不论面前有多少困难,我都会尽全力克服,这不是为我自己,现在我被摧残得只想躺平摆烂,但是为了所有信任我关心我的人,如今我绝对不能停下脚步。从来就没有永远的当下,连接我和童年最后的纽带已经被切断,再也不能回头,留给我的只剩下面前的未来,需要我亲手创造的未来,只有承受住来自各方的打击,我才有能力去维护由我创造的未来,既然选择了远方,便只顾风雨兼程。</p>\n<p>2025年的长沙小满格外燥热痛定思过后的心是如此平静没有多少时间可以浪费了无需多言。</p>\n<p><em>“回首向来萧瑟处,归去,也无风雨也无晴!”</em></p>\n"},{"title":"博客更新记录","date":"2024-11-04T15:18:02.000Z","_content":"\n- 博客主题更新为 `Fluid` 主题,原主题为 `Next`\n- 更新了访问地址为 `https://blog.hifuu.ink`\n- 新增了 `About` 页面\n- 新增了 `友链` 页面\n- 完善页面布局\n","source":"_posts/BlogUpdate.md","raw":"---\ntitle: 博客更新记录\ndate: 2024-11-04 23:18:02\ntags: 日志\ncategories: 更新\n---\n\n- 博客主题更新为 `Fluid` 主题,原主题为 `Next`\n- 更新了访问地址为 `https://blog.hifuu.ink`\n- 新增了 `About` 页面\n- 新增了 `友链` 页面\n- 完善页面布局\n","slug":"BlogUpdate","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescr000eog2b2ugh780z","content":"<ul>\n<li>博客主题更新为 <code>Fluid</code> 主题,原主题为 <code>Next</code></li>\n<li>更新了访问地址为 <code>https://blog.hifuu.ink</code></li>\n<li>新增了 <code>About</code> 页面</li>\n<li>新增了 <code>友链</code> 页面</li>\n<li>完善页面布局</li>\n</ul>\n","excerpt":"","more":"<ul>\n<li>博客主题更新为 <code>Fluid</code> 主题,原主题为 <code>Next</code></li>\n<li>更新了访问地址为 <code>https://blog.hifuu.ink</code></li>\n<li>新增了 <code>About</code> 页面</li>\n<li>新增了 <code>友链</code> 页面</li>\n<li>完善页面布局</li>\n</ul>\n"},{"title":"Welcome to CGH0S7's Blog","date":"2023-12-06T08:33:30.000Z","_content":"\nHello World !\n","source":"_posts/CGH0S7-s-Blog.md","raw":"---\ntitle: Welcome to CGH0S7's Blog \ndate: 2023-12-06 16:33:30\ntags: TEST\n---\n\nHello World !\n","slug":"CGH0S7-s-Blog","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescs000gog2b47qaa5er","content":"<p>Hello World !</p>\n","excerpt":"","more":"<p>Hello World !</p>\n"},{"title":"Gentle Jena","date":"2024-10-30T14:11:14.000Z","_content":"\n很喜欢的一首曲子\n顺便测试一下视频上传\n以后随缘更新各种乱七八糟的东西。。\n\n<video controls width=\"600\" height=\"400\">\n <source src=\"https://ik.imagekit.io/7grujzz8i/2024-09-22%2014-05-02.mp4?updatedAt=1738496025016\" type=\"video/mp4\" width=\"50%\">\n</video>\n","source":"_posts/GentleJena.md","raw":"---\ntitle: Gentle Jena\ndate: 2024-10-30 22:11:14\ntags: 音乐\ncategories: Rearrangement\n---\n\n很喜欢的一首曲子\n顺便测试一下视频上传\n以后随缘更新各种乱七八糟的东西。。\n\n<video controls width=\"600\" height=\"400\">\n <source src=\"https://ik.imagekit.io/7grujzz8i/2024-09-22%2014-05-02.mp4?updatedAt=1738496025016\" type=\"video/mp4\" width=\"50%\">\n</video>\n","slug":"GentleJena","published":1,"updated":"2025-02-23T17:14:31.930Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescs000jog2bgkpv8cr4","content":"<p>很喜欢的一首曲子<br>顺便测试一下视频上传<br>以后随缘更新各种乱七八糟的东西。。</p>\n<video controls width=\"600\" height=\"400\">\n <source src=\"https://ik.imagekit.io/7grujzz8i/2024-09-22%2014-05-02.mp4?updatedAt=1738496025016\" type=\"video/mp4\" width=\"50%\">\n</video>\n","excerpt":"","more":"<p>很喜欢的一首曲子<br>顺便测试一下视频上传<br>以后随缘更新各种乱七八糟的东西。。</p>\n<video controls width=\"600\" height=\"400\">\n <source src=\"https://ik.imagekit.io/7grujzz8i/2024-09-22%2014-05-02.mp4?updatedAt=1738496025016\" type=\"video/mp4\" width=\"50%\">\n</video>\n"},{"title":"Vocaloid调教-晴天(洛天依V4)","date":"2024-11-04T13:52:59.000Z","_content":"\n其实是今年年初的作品想起来可以搬上来这是我调教的第一首v曲。\n\n“故事的小黄花从出生那年就飘着...”\n\n{% raw %}\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1xzPteRErF&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n{% endraw %}\n\n","source":"_posts/Vocaloid调教-晴天.md","raw":"---\ntitle: Vocaloid调教-晴天(洛天依v4)\ndate: 2024-11-04 21:52:59\ntags: [Vocaloid, 音乐]\ncategories: [Vocaloid]\n---\n\n其实是今年年初的作品想起来可以搬上来这是我调教的第一首v曲。\n\n“故事的小黄花从出生那年就飘着...”\n\n{% raw %}\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1xzPteRErF&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n{% endraw %}\n\n","slug":"Vocaloid调教-晴天","published":1,"updated":"2025-02-25T00:19:05.940Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iesct000mog2bf2al1nlk","content":"<p>其实是今年年初的作品想起来可以搬上来这是我调教的第一首v曲。</p>\n<p>“故事的小黄花,从出生那年就飘着…”</p>\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1xzPteRErF&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n\n\n","excerpt":"","more":"<p>其实是今年年初的作品想起来可以搬上来这是我调教的第一首v曲。</p>\n<p>“故事的小黄花,从出生那年就飘着…”</p>\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1xzPteRErF&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n\n\n"},{"title":"低成本快速搞定专属域名邮箱:从 0 到 CLI 收发只要 15 分钟","date":"2025-11-15T15:36:22.000Z","_content":"\n> 失踪人口回归 👋\n> 如果你只想「有个能用的 `@自己域名` 邮箱」,却懒得租服务器、折腾 Postfix、跟 25 端口斗智斗勇、花费你宝贵的💰,那这篇 15 分钟速通教程就是写给你的(当然,一点💰都不花是不可能的,你至少需要买一个域名=)\n\n---\n\n## 1. 最终效果\n\n- 任何前缀都能即时生成: `helloworld@your.com` / `fknudt@your.com` / `ilovethu@your.com` \n- 在终端里使用命令收发邮件,无需专门打开各种邮件客户端。\n\n整套方案 **只花域名注册费用****0 服务器 0 运维**,完全白嫖 Resend 免费额度。\n\n---\n\n## 2. 准备工作2 min\n\n| 资源 | 用途 | 费用 |\n|---|---|---|\n| 一枚域名 | 做邮箱后缀 | 约 ¥30+ / 年(阿里云 Namecheap Cloudflare 均可) |\n| Resend 账号 | 托管邮服 | 免费 100 封 / 天 |\n\n![Resend文档](/images/resendofficial.png)\n\n---\n\n## 3. 3 步完成域名绑定5 min\n\n1. 登录 [Resend](https://resend.com) → **Domains** → **Add Domain** \n 输入 `your.com` → 得到一组 DNS 记录TXT + MX + DKIM。 \n\n2. 去域名注册商把记录全部照抄粘贴,保存。(由于笔者为免费用户并且已经配置域名无法再次配置,因此未能提供截图但是步骤非常简单)。\n - 登录你的域名注册商账号找到DNS管理页面。\n - 添加Resend提供的TXT记录用于验证域名所有权。\n - 添加Resend提供的MX记录用于接收邮件。\n - 根据Resend的要求配置完整所有必要的DNS记录。\n - 保存更改后等待DNS记录生效通常需要几分钟到24小时不等这是resend官方的说法笔者实测只需要几分钟不到。\n ⚠️ 只需改 **DNS 解析**,不用转 nameserver1 min 搞定。 \n\n3. 回到 Resend 点 **Verify**,状态变绿 ✅ 即生效(实测 30s-3min并不会像官方说的有可能要24小时。\n\n---\n\n## 4. 无限别名 + 转发(立刻能用)\n\nResend 对「 catch-all 」免费! \n意思是你 **不用提前新建账号**,任何 `@your.com` 的信都会飞进你设定的地址,只需要在 Resend 官网查收即可。\n\n---\n\n## 5. 终端发邮件可选8 min 部署)\n\n网页收发邮件显然太麻烦我用**rust**写了个可爱的 CLI 客户端 [**rusend**](https://github.com/CGH0S7/rusend),基于 Resend 官方 API支持发送与查收邮件非常方便。好吧其实是Gemini小姐帮忙写的@@\n\n### ①-1 下载预构建可执行文件\n\n在[Github Releases](https://github.com/CGH0S7/rusend/releases/tag/stable)里下载对应系统的预编译包,解压放到 `$PATH` 目录下即可。\n\n### ①-2 源码构建\n\n下载并编译rusend准备好rust工具链具体编译命令如下\n\n ```bash\n git clone https://github.com/CGH0S7/rusend.git\n cd rusend\n cargo build --release\n ```\n\n将`rusend`二进制文件移动到系统的`$PATH`目录下,例如`/usr/local/bin`。\n\n### ② 补全 & API Key配置\n\n使用下面的命令进行命令行补全配置\n\n ```bash\n echo \"source <(rusend completions bash)\" >> ~/.bashrc\n source ~/.bashrc\n ```\n\n ```zsh\n echo \"source <(rusend completions zsh)\" >> ~/.zshrc\n source ~/.zshrc\n ```\n\n ```fish\n rusend completions fish > ~/.config/fish/completions/rusend.fish\n source ~/.config/fish/config.fish\n ```\n\n在Resend控制面板中找到`API Keys`选项为你配置的域名生成一个新的API Key。然后在终端中运行以下命令进行配置\n\n ```bash\n rusend config --key re_xxxxxxxxx\n ```\n\n### ③ 使用 rusend 收发邮件\n\n详细功能请查看[Readme](https://github.com/CGH0S7/rusend)文档:\n\n ![rusend文档](/images/rusendhelp1.png)\n ![rusend文档](/images/rusendhelp2.png)\n ![rusend软件帮助](/images/rusendhelp3.png)\n\n---\n\n## 6. 成本 & 限额总结\n\n| 项目 | 免费额度 |\n|---|---|\n| Resend | 100 封 / 天 |\n| 域名 | 约 ¥30+ / 年 |\n| rusend | 开源 |\n\n非主力邮箱场景下完全够用不建议用于接收各种广告或更新推送。\n\n若想要「匿名转发」隐藏真实地址可以再套一层 [AnonAddy](https://addy.io) 即可,本文不展开。\n\n---\n\n## 7. 结语\n\n以上就是「低成本快速拥有个人专属域名邮箱」的全部流程。\n\n零服务器、零运维、全平台通用甚至能在手机 Termux 里发邮。\n\n如果能帮到你去 [rusend](https://github.com/CGH0S7/rusend) 点个 ⭐ 当稿费吧~😉\n","source":"_posts/Your-exclusive-email-address.md","raw":"---\ntitle: 低成本快速搞定专属域名邮箱:从 0 到 CLI 收发只要 15 分钟\ndate: 2025-11-15 23:36:22\ntags: [技术分享]\n---\n\n> 失踪人口回归 👋\n> 如果你只想「有个能用的 `@自己域名` 邮箱」,却懒得租服务器、折腾 Postfix、跟 25 端口斗智斗勇、花费你宝贵的💰,那这篇 15 分钟速通教程就是写给你的(当然,一点💰都不花是不可能的,你至少需要买一个域名=)\n\n---\n\n## 1. 最终效果\n\n- 任何前缀都能即时生成: `helloworld@your.com` / `fknudt@your.com` / `ilovethu@your.com` \n- 在终端里使用命令收发邮件,无需专门打开各种邮件客户端。\n\n整套方案 **只花域名注册费用****0 服务器 0 运维**,完全白嫖 Resend 免费额度。\n\n---\n\n## 2. 准备工作2 min\n\n| 资源 | 用途 | 费用 |\n|---|---|---|\n| 一枚域名 | 做邮箱后缀 | 约 ¥30+ / 年(阿里云 Namecheap Cloudflare 均可) |\n| Resend 账号 | 托管邮服 | 免费 100 封 / 天 |\n\n![Resend文档](/images/resendofficial.png)\n\n---\n\n## 3. 3 步完成域名绑定5 min\n\n1. 登录 [Resend](https://resend.com) → **Domains** → **Add Domain** \n 输入 `your.com` → 得到一组 DNS 记录TXT + MX + DKIM。 \n\n2. 去域名注册商把记录全部照抄粘贴,保存。(由于笔者为免费用户并且已经配置域名无法再次配置,因此未能提供截图但是步骤非常简单)。\n - 登录你的域名注册商账号找到DNS管理页面。\n - 添加Resend提供的TXT记录用于验证域名所有权。\n - 添加Resend提供的MX记录用于接收邮件。\n - 根据Resend的要求配置完整所有必要的DNS记录。\n - 保存更改后等待DNS记录生效通常需要几分钟到24小时不等这是resend官方的说法笔者实测只需要几分钟不到。\n ⚠️ 只需改 **DNS 解析**,不用转 nameserver1 min 搞定。 \n\n3. 回到 Resend 点 **Verify**,状态变绿 ✅ 即生效(实测 30s-3min并不会像官方说的有可能要24小时。\n\n---\n\n## 4. 无限别名 + 转发(立刻能用)\n\nResend 对「 catch-all 」免费! \n意思是你 **不用提前新建账号**,任何 `@your.com` 的信都会飞进你设定的地址,只需要在 Resend 官网查收即可。\n\n---\n\n## 5. 终端发邮件可选8 min 部署)\n\n网页收发邮件显然太麻烦我用**rust**写了个可爱的 CLI 客户端 [**rusend**](https://github.com/CGH0S7/rusend),基于 Resend 官方 API支持发送与查收邮件非常方便。好吧其实是Gemini小姐帮忙写的@@\n\n### ①-1 下载预构建可执行文件\n\n在[Github Releases](https://github.com/CGH0S7/rusend/releases/tag/stable)里下载对应系统的预编译包,解压放到 `$PATH` 目录下即可。\n\n### ①-2 源码构建\n\n下载并编译rusend准备好rust工具链具体编译命令如下\n\n ```bash\n git clone https://github.com/CGH0S7/rusend.git\n cd rusend\n cargo build --release\n ```\n\n将`rusend`二进制文件移动到系统的`$PATH`目录下,例如`/usr/local/bin`。\n\n### ② 补全 & API Key配置\n\n使用下面的命令进行命令行补全配置\n\n ```bash\n echo \"source <(rusend completions bash)\" >> ~/.bashrc\n source ~/.bashrc\n ```\n\n ```zsh\n echo \"source <(rusend completions zsh)\" >> ~/.zshrc\n source ~/.zshrc\n ```\n\n ```fish\n rusend completions fish > ~/.config/fish/completions/rusend.fish\n source ~/.config/fish/config.fish\n ```\n\n在Resend控制面板中找到`API Keys`选项为你配置的域名生成一个新的API Key。然后在终端中运行以下命令进行配置\n\n ```bash\n rusend config --key re_xxxxxxxxx\n ```\n\n### ③ 使用 rusend 收发邮件\n\n详细功能请查看[Readme](https://github.com/CGH0S7/rusend)文档:\n\n ![rusend文档](/images/rusendhelp1.png)\n ![rusend文档](/images/rusendhelp2.png)\n ![rusend软件帮助](/images/rusendhelp3.png)\n\n---\n\n## 6. 成本 & 限额总结\n\n| 项目 | 免费额度 |\n|---|---|\n| Resend | 100 封 / 天 |\n| 域名 | 约 ¥30+ / 年 |\n| rusend | 开源 |\n\n非主力邮箱场景下完全够用不建议用于接收各种广告或更新推送。\n\n若想要「匿名转发」隐藏真实地址可以再套一层 [AnonAddy](https://addy.io) 即可,本文不展开。\n\n---\n\n## 7. 结语\n\n以上就是「低成本快速拥有个人专属域名邮箱」的全部流程。\n\n零服务器、零运维、全平台通用甚至能在手机 Termux 里发邮。\n\n如果能帮到你去 [rusend](https://github.com/CGH0S7/rusend) 点个 ⭐ 当稿费吧~😉\n","slug":"Your-exclusive-email-address","published":1,"updated":"2025-11-15T16:42:50.086Z","_id":"cmi0iesct000oog2b3at3eki5","comments":1,"layout":"post","photos":[],"content":"<blockquote>\n<p>失踪人口回归 👋<br>如果你只想「有个能用的 <code>@自己域名</code> 邮箱」,却懒得租服务器、折腾 Postfix、跟 25 端口斗智斗勇、花费你宝贵的💰,那这篇 15 分钟速通教程就是写给你的(当然,一点💰都不花是不可能的,你至少需要买一个域名&#x3D;)</p>\n</blockquote>\n<hr>\n<h2 id=\"1-最终效果\"><a href=\"#1-最终效果\" class=\"headerlink\" title=\"1. 最终效果\"></a>1. 最终效果</h2><ul>\n<li>任何前缀都能即时生成: <code>helloworld@your.com</code> &#x2F; <code>fknudt@your.com</code> &#x2F; <code>ilovethu@your.com</code> </li>\n<li>在终端里使用命令收发邮件,无需专门打开各种邮件客户端。</li>\n</ul>\n<p>整套方案 <strong>只花域名注册费用</strong><strong>0 服务器 0 运维</strong>,完全白嫖 Resend 免费额度。</p>\n<hr>\n<h2 id=\"2-准备工作2-min\"><a href=\"#2-准备工作2-min\" class=\"headerlink\" title=\"2. 准备工作2 min\"></a>2. 准备工作2 min</h2><table>\n<thead>\n<tr>\n<th>资源</th>\n<th>用途</th>\n<th>费用</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>一枚域名</td>\n<td>做邮箱后缀</td>\n<td>约 ¥30+ &#x2F; 年(阿里云 Namecheap Cloudflare 均可)</td>\n</tr>\n<tr>\n<td>Resend 账号</td>\n<td>托管邮服</td>\n<td>免费 100 封 &#x2F; 天</td>\n</tr>\n</tbody></table>\n<p><img src=\"/images/resendofficial.png\" alt=\"Resend文档\"></p>\n<hr>\n<h2 id=\"3-3-步完成域名绑定5-min\"><a href=\"#3-3-步完成域名绑定5-min\" class=\"headerlink\" title=\"3. 3 步完成域名绑定5 min\"></a>3. 3 步完成域名绑定5 min</h2><ol>\n<li><p>登录 <a href=\"https://resend.com/\">Resend</a> → <strong>Domains</strong> → <strong>Add Domain</strong><br>输入 <code>your.com</code> → 得到一组 DNS 记录TXT + MX + DKIM。 </p>\n</li>\n<li><p>去域名注册商把记录全部照抄粘贴,保存。(由于笔者为免费用户并且已经配置域名无法再次配置,因此未能提供截图但是步骤非常简单)。</p>\n<ul>\n<li>登录你的域名注册商账号找到DNS管理页面。</li>\n<li>添加Resend提供的TXT记录用于验证域名所有权。</li>\n<li>添加Resend提供的MX记录用于接收邮件。</li>\n<li>根据Resend的要求配置完整所有必要的DNS记录。</li>\n<li>保存更改后等待DNS记录生效通常需要几分钟到24小时不等这是resend官方的说法笔者实测只需要几分钟不到。<br>⚠️ 只需改 <strong>DNS 解析</strong>,不用转 nameserver1 min 搞定。</li>\n</ul>\n</li>\n<li><p>回到 Resend 点 <strong>Verify</strong>,状态变绿 ✅ 即生效(实测 30s-3min并不会像官方说的有可能要24小时。</p>\n</li>\n</ol>\n<hr>\n<h2 id=\"4-无限别名-转发(立刻能用)\"><a href=\"#4-无限别名-转发(立刻能用)\" class=\"headerlink\" title=\"4. 无限别名 + 转发(立刻能用)\"></a>4. 无限别名 + 转发(立刻能用)</h2><p>Resend 对「 catch-all 」免费!<br>意思是你 <strong>不用提前新建账号</strong>,任何 <code>@your.com</code> 的信都会飞进你设定的地址,只需要在 Resend 官网查收即可。</p>\n<hr>\n<h2 id=\"5-终端发邮件可选8-min-部署)\"><a href=\"#5-终端发邮件可选8-min-部署)\" class=\"headerlink\" title=\"5. 终端发邮件可选8 min 部署)\"></a>5. 终端发邮件可选8 min 部署)</h2><p>网页收发邮件显然太麻烦,我用<strong>rust</strong>写了个可爱的 CLI 客户端 <a href=\"https://github.com/CGH0S7/rusend\"><strong>rusend</strong></a>,基于 Resend 官方 API支持发送与查收邮件非常方便。好吧其实是Gemini小姐帮忙写的@@</p>\n<h3 id=\"①-1-下载预构建可执行文件\"><a href=\"#①-1-下载预构建可执行文件\" class=\"headerlink\" title=\"①-1 下载预构建可执行文件\"></a>①-1 下载预构建可执行文件</h3><p>在<a href=\"https://github.com/CGH0S7/rusend/releases/tag/stable\">Github Releases</a>里下载对应系统的预编译包,解压放到 <code>$PATH</code> 目录下即可。</p>\n<h3 id=\"①-2-源码构建\"><a href=\"#①-2-源码构建\" class=\"headerlink\" title=\"①-2 源码构建\"></a>①-2 源码构建</h3><p>下载并编译rusend准备好rust工具链具体编译命令如下</p>\n <figure class=\"highlight bash\"><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><code class=\"hljs bash\">git <span class=\"hljs-built_in\">clone</span> https://github.com/CGH0S7/rusend.git<br><span class=\"hljs-built_in\">cd</span> rusend<br>cargo build --release<br></code></pre></td></tr></table></figure>\n\n<p>将<code>rusend</code>二进制文件移动到系统的<code>$PATH</code>目录下,例如<code>/usr/local/bin</code>。</p>\n<h3 id=\"②-补全-API-Key配置\"><a href=\"#②-补全-API-Key配置\" class=\"headerlink\" title=\"② 补全 &amp; API Key配置\"></a>② 补全 &amp; API Key配置</h3><p>使用下面的命令进行命令行补全配置:</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">&quot;source &lt;(rusend completions bash)&quot;</span> &gt;&gt; ~/.bashrc<br><span class=\"hljs-built_in\">source</span> ~/.bashrc<br></code></pre></td></tr></table></figure>\n\n <figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs zsh\">echo &quot;source &lt;(rusend completions zsh)&quot; &gt;&gt; ~/.zshrc<br>source ~/.zshrc<br></code></pre></td></tr></table></figure>\n\n <figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs fish\">rusend completions fish &gt; ~/.config/fish/completions/rusend.fish<br>source ~/.config/fish/config.fish<br></code></pre></td></tr></table></figure>\n\n<p>在Resend控制面板中找到<code>API Keys</code>选项为你配置的域名生成一个新的API Key。然后在终端中运行以下命令进行配置</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">rusend config --key re_xxxxxxxxx<br></code></pre></td></tr></table></figure>\n\n<h3 id=\"③-使用-rusend-收发邮件\"><a href=\"#③-使用-rusend-收发邮件\" class=\"headerlink\" title=\"③ 使用 rusend 收发邮件\"></a>③ 使用 rusend 收发邮件</h3><p>详细功能请查看<a href=\"https://github.com/CGH0S7/rusend\">Readme</a>文档:</p>\n<p> <img src=\"/images/rusendhelp1.png\" alt=\"rusend文档\"><br> <img src=\"/images/rusendhelp2.png\" alt=\"rusend文档\"><br> <img src=\"/images/rusendhelp3.png\" alt=\"rusend软件帮助\"></p>\n<hr>\n<h2 id=\"6-成本-限额总结\"><a href=\"#6-成本-限额总结\" class=\"headerlink\" title=\"6. 成本 &amp; 限额总结\"></a>6. 成本 &amp; 限额总结</h2><table>\n<thead>\n<tr>\n<th>项目</th>\n<th>免费额度</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Resend</td>\n<td>100 封 &#x2F; 天</td>\n</tr>\n<tr>\n<td>域名</td>\n<td>约 ¥30+ &#x2F; 年</td>\n</tr>\n<tr>\n<td>rusend</td>\n<td>开源</td>\n</tr>\n</tbody></table>\n<p>非主力邮箱场景下完全够用,不建议用于接收各种广告或更新推送。</p>\n<p>若想要「匿名转发」隐藏真实地址,可以再套一层 <a href=\"https://addy.io/\">AnonAddy</a> 即可,本文不展开。</p>\n<hr>\n<h2 id=\"7-结语\"><a href=\"#7-结语\" class=\"headerlink\" title=\"7. 结语\"></a>7. 结语</h2><p>以上就是「低成本快速拥有个人专属域名邮箱」的全部流程。</p>\n<p>零服务器、零运维、全平台通用,甚至能在手机 Termux 里发邮。</p>\n<p>如果能帮到你,去 <a href=\"https://github.com/CGH0S7/rusend\">rusend</a> 点个 ⭐ 当稿费吧~😉</p>\n","excerpt":"","more":"<blockquote>\n<p>失踪人口回归 👋<br>如果你只想「有个能用的 <code>@自己域名</code> 邮箱」,却懒得租服务器、折腾 Postfix、跟 25 端口斗智斗勇、花费你宝贵的💰,那这篇 15 分钟速通教程就是写给你的(当然,一点💰都不花是不可能的,你至少需要买一个域名&#x3D;)</p>\n</blockquote>\n<hr>\n<h2 id=\"1-最终效果\"><a href=\"#1-最终效果\" class=\"headerlink\" title=\"1. 最终效果\"></a>1. 最终效果</h2><ul>\n<li>任何前缀都能即时生成: <code>helloworld@your.com</code> &#x2F; <code>fknudt@your.com</code> &#x2F; <code>ilovethu@your.com</code> </li>\n<li>在终端里使用命令收发邮件,无需专门打开各种邮件客户端。</li>\n</ul>\n<p>整套方案 <strong>只花域名注册费用</strong><strong>0 服务器 0 运维</strong>,完全白嫖 Resend 免费额度。</p>\n<hr>\n<h2 id=\"2-准备工作2-min\"><a href=\"#2-准备工作2-min\" class=\"headerlink\" title=\"2. 准备工作2 min\"></a>2. 准备工作2 min</h2><table>\n<thead>\n<tr>\n<th>资源</th>\n<th>用途</th>\n<th>费用</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>一枚域名</td>\n<td>做邮箱后缀</td>\n<td>约 ¥30+ &#x2F; 年(阿里云 Namecheap Cloudflare 均可)</td>\n</tr>\n<tr>\n<td>Resend 账号</td>\n<td>托管邮服</td>\n<td>免费 100 封 &#x2F; 天</td>\n</tr>\n</tbody></table>\n<p><img src=\"/images/resendofficial.png\" alt=\"Resend文档\"></p>\n<hr>\n<h2 id=\"3-3-步完成域名绑定5-min\"><a href=\"#3-3-步完成域名绑定5-min\" class=\"headerlink\" title=\"3. 3 步完成域名绑定5 min\"></a>3. 3 步完成域名绑定5 min</h2><ol>\n<li><p>登录 <a href=\"https://resend.com/\">Resend</a> → <strong>Domains</strong> → <strong>Add Domain</strong><br>输入 <code>your.com</code> → 得到一组 DNS 记录TXT + MX + DKIM。 </p>\n</li>\n<li><p>去域名注册商把记录全部照抄粘贴,保存。(由于笔者为免费用户并且已经配置域名无法再次配置,因此未能提供截图但是步骤非常简单)。</p>\n<ul>\n<li>登录你的域名注册商账号找到DNS管理页面。</li>\n<li>添加Resend提供的TXT记录用于验证域名所有权。</li>\n<li>添加Resend提供的MX记录用于接收邮件。</li>\n<li>根据Resend的要求配置完整所有必要的DNS记录。</li>\n<li>保存更改后等待DNS记录生效通常需要几分钟到24小时不等这是resend官方的说法笔者实测只需要几分钟不到。<br>⚠️ 只需改 <strong>DNS 解析</strong>,不用转 nameserver1 min 搞定。</li>\n</ul>\n</li>\n<li><p>回到 Resend 点 <strong>Verify</strong>,状态变绿 ✅ 即生效(实测 30s-3min并不会像官方说的有可能要24小时。</p>\n</li>\n</ol>\n<hr>\n<h2 id=\"4-无限别名-转发(立刻能用)\"><a href=\"#4-无限别名-转发(立刻能用)\" class=\"headerlink\" title=\"4. 无限别名 + 转发(立刻能用)\"></a>4. 无限别名 + 转发(立刻能用)</h2><p>Resend 对「 catch-all 」免费!<br>意思是你 <strong>不用提前新建账号</strong>,任何 <code>@your.com</code> 的信都会飞进你设定的地址,只需要在 Resend 官网查收即可。</p>\n<hr>\n<h2 id=\"5-终端发邮件可选8-min-部署)\"><a href=\"#5-终端发邮件可选8-min-部署)\" class=\"headerlink\" title=\"5. 终端发邮件可选8 min 部署)\"></a>5. 终端发邮件可选8 min 部署)</h2><p>网页收发邮件显然太麻烦,我用<strong>rust</strong>写了个可爱的 CLI 客户端 <a href=\"https://github.com/CGH0S7/rusend\"><strong>rusend</strong></a>,基于 Resend 官方 API支持发送与查收邮件非常方便。好吧其实是Gemini小姐帮忙写的@@</p>\n<h3 id=\"①-1-下载预构建可执行文件\"><a href=\"#①-1-下载预构建可执行文件\" class=\"headerlink\" title=\"①-1 下载预构建可执行文件\"></a>①-1 下载预构建可执行文件</h3><p>在<a href=\"https://github.com/CGH0S7/rusend/releases/tag/stable\">Github Releases</a>里下载对应系统的预编译包,解压放到 <code>$PATH</code> 目录下即可。</p>\n<h3 id=\"①-2-源码构建\"><a href=\"#①-2-源码构建\" class=\"headerlink\" title=\"①-2 源码构建\"></a>①-2 源码构建</h3><p>下载并编译rusend准备好rust工具链具体编译命令如下</p>\n <figure class=\"highlight bash\"><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><code class=\"hljs bash\">git <span class=\"hljs-built_in\">clone</span> https://github.com/CGH0S7/rusend.git<br><span class=\"hljs-built_in\">cd</span> rusend<br>cargo build --release<br></code></pre></td></tr></table></figure>\n\n<p>将<code>rusend</code>二进制文件移动到系统的<code>$PATH</code>目录下,例如<code>/usr/local/bin</code>。</p>\n<h3 id=\"②-补全-API-Key配置\"><a href=\"#②-补全-API-Key配置\" class=\"headerlink\" title=\"② 补全 &amp; API Key配置\"></a>② 补全 &amp; API Key配置</h3><p>使用下面的命令进行命令行补全配置:</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">&quot;source &lt;(rusend completions bash)&quot;</span> &gt;&gt; ~/.bashrc<br><span class=\"hljs-built_in\">source</span> ~/.bashrc<br></code></pre></td></tr></table></figure>\n\n <figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs zsh\">echo &quot;source &lt;(rusend completions zsh)&quot; &gt;&gt; ~/.zshrc<br>source ~/.zshrc<br></code></pre></td></tr></table></figure>\n\n <figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs fish\">rusend completions fish &gt; ~/.config/fish/completions/rusend.fish<br>source ~/.config/fish/config.fish<br></code></pre></td></tr></table></figure>\n\n<p>在Resend控制面板中找到<code>API Keys</code>选项为你配置的域名生成一个新的API Key。然后在终端中运行以下命令进行配置</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">rusend config --key re_xxxxxxxxx<br></code></pre></td></tr></table></figure>\n\n<h3 id=\"③-使用-rusend-收发邮件\"><a href=\"#③-使用-rusend-收发邮件\" class=\"headerlink\" title=\"③ 使用 rusend 收发邮件\"></a>③ 使用 rusend 收发邮件</h3><p>详细功能请查看<a href=\"https://github.com/CGH0S7/rusend\">Readme</a>文档:</p>\n<p> <img src=\"/images/rusendhelp1.png\" alt=\"rusend文档\"><br> <img src=\"/images/rusendhelp2.png\" alt=\"rusend文档\"><br> <img src=\"/images/rusendhelp3.png\" alt=\"rusend软件帮助\"></p>\n<hr>\n<h2 id=\"6-成本-限额总结\"><a href=\"#6-成本-限额总结\" class=\"headerlink\" title=\"6. 成本 &amp; 限额总结\"></a>6. 成本 &amp; 限额总结</h2><table>\n<thead>\n<tr>\n<th>项目</th>\n<th>免费额度</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Resend</td>\n<td>100 封 &#x2F; 天</td>\n</tr>\n<tr>\n<td>域名</td>\n<td>约 ¥30+ &#x2F; 年</td>\n</tr>\n<tr>\n<td>rusend</td>\n<td>开源</td>\n</tr>\n</tbody></table>\n<p>非主力邮箱场景下完全够用,不建议用于接收各种广告或更新推送。</p>\n<p>若想要「匿名转发」隐藏真实地址,可以再套一层 <a href=\"https://addy.io/\">AnonAddy</a> 即可,本文不展开。</p>\n<hr>\n<h2 id=\"7-结语\"><a href=\"#7-结语\" class=\"headerlink\" title=\"7. 结语\"></a>7. 结语</h2><p>以上就是「低成本快速拥有个人专属域名邮箱」的全部流程。</p>\n<p>零服务器、零运维、全平台通用,甚至能在手机 Termux 里发邮。</p>\n<p>如果能帮到你,去 <a href=\"https://github.com/CGH0S7/rusend\">rusend</a> 点个 ⭐ 当稿费吧~😉</p>\n"},{"title":"Archlinux的KDE Plasma优先启用Nvidia独立显卡和混合显卡配置指北","date":"2024-11-06T02:02:04.000Z","_content":"本文将介绍在 **X11** 和 **Wayland** 两种会话下,如何在 KDE Plasma 中优先启用 Nvidia 独立显卡,并提供 I+N 混合显卡的配置方案。**首先,请确保您已经正确安装了 Nvidia 驱动**(如果非 Mainline 内核,请使用 `nvidia-dkms` 或 `nvidia-open-dkms` 版本)。\n\n![Nvidia设置示意图](/images/5364bba6d035326e82c53504dd53e7c2454454985.png)\n\n### 适用系统\n\n对于 **CachyOS** 或 **EndeavourOS** 等 Arch Linux 衍生版,这些配置大多开箱即用,但对于刚刚入坑 Arch Linux 且使用 KDE 的新手可能会遇到这样的问题:\n\n- Nvidia 驱动已安装,`nvidia-smi` 输出正常\n- KDE 系统信息显示仍在使用核显,程序运行时也优先使用核显\n- 导致某些应用如浏览器、Blender可能出现卡顿或掉帧现象\n\n这是因为 Arch Linux 的高自定义性,许多功能需要用户手动配置。以下是详细的解决方案。\n\n---\n\n## 配置 X11 下的 Nvidia 显卡优先\n\n可以通过配置 `/etc/X11/xorg.conf` 实现 Nvidia 独显输出。幸运的是Nvidia 提供了自动生成配置文件的工具,用户无需手动编写:\n\n```bash\nsudo nvidia-xconfig --prime\n```\n\n该命令会根据硬件情况自动生成配置文件。执行后 **重新登录会话** 即可生效(即使是 Wayland 用户也可以执行一次此命令)。\n\n![X11 Nvidia配置](/images/1613f5602b203b38230f19699deb0219454454985.png)\n\n---\n\n## 配置 Wayland 下的 Nvidia 显卡优先\n\n在 Wayland 下优先启用 Nvidia 显卡的步骤如下:\n\n1. 编辑 **GRUB 配置**文件:\n\n 打开 `/etc/default/grub` 文件,在 `GRUB_CMDLINE_LINUX_DEFAULT=\"\"` 中添加 `nvidia_drm.modeset=1`\n\n ```bash\n GRUB_CMDLINE_LINUX_DEFAULT=\"nvidia_drm.modeset=1\"\n ```\n\n2. 重新生成 grub 配置:\n\n ```bash\n sudo grub-mkconfig -o /boot/grub/grub.cfg\n ```\n\n3. 配置 **Plasma 环境**文件:\n\n 在 `~/.config/plasma-workspace/env/nvidia.sh` 中写入以下内容:\n\n ```bash\n #!/bin/bash \n export __NV_PRIME_RENDER_OFFLOAD=1 \n export __GLX_VENDOR_LIBRARY_NAME=nvidia\n ```\n\n4. 保存并重启电脑,即可生效。\n\n![Wayland Nvidia配置](/images/b2054bbaf6197624d38cc2007d885fd1454454985.png)\n\n---\n\n## I+N 混合显卡方案\n\n如果不希望全局启用独显可以选择让大部分程序默认使用核显而少数高性能需求的程序使用独显。这种方法能有效节省功耗同时将独显资源集中分配给需要的程序如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。\n\n### 配置步骤\n\n1. 打开程序的 `.desktop` 启动文件:\n\n 位置可能在 `/usr/share/applications` 或 `~/.local/share/applications` 中。\n\n2. 在 `Exec=` 后添加 `prime-run` 参数。例如:\n\n ```text\n Exec=prime-run <程序启动命令>\n ```\n\n ![混合显卡配置示意图](/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png)\n\n### Vim 快捷配置\n\n如果使用 Vim可以使用以下快捷键快速批量替换 `Exec=` 为 `Exec=prime-run`\n\n```vim\nv -> G -> :s/Exec=/Exec=prime-run /g Enter -> :wq Enter\n```\n\n---\n\n## 让 Plasma 桌面也使用独显\n\n如果希望 Plasma 桌面也通过独显运行,可以修改 Wayland 配置文件并删除第二行:\n\n```bash\n#!/bin/bash \nexport __GLX_VENDOR_LIBRARY_NAME=nvidia\n```\n\n这样 Plasma 桌面会通过独显启动,其他程序则默认使用核显。\n\n---\n\n希望以上经验能为有此需求的用户提供参考帮助。\n","source":"_posts/arch-nvidia.md","raw":"---\ntitle: Archlinux的KDE Plasma优先启用Nvidia独立显卡和混合显卡配置指北\ndate: 2024-11-06 10:02:04\ntags: 技术\ncategories: [技术分享]\n---\n本文将介绍在 **X11** 和 **Wayland** 两种会话下,如何在 KDE Plasma 中优先启用 Nvidia 独立显卡,并提供 I+N 混合显卡的配置方案。**首先,请确保您已经正确安装了 Nvidia 驱动**(如果非 Mainline 内核,请使用 `nvidia-dkms` 或 `nvidia-open-dkms` 版本)。\n\n![Nvidia设置示意图](/images/5364bba6d035326e82c53504dd53e7c2454454985.png)\n\n### 适用系统\n\n对于 **CachyOS** 或 **EndeavourOS** 等 Arch Linux 衍生版,这些配置大多开箱即用,但对于刚刚入坑 Arch Linux 且使用 KDE 的新手可能会遇到这样的问题:\n\n- Nvidia 驱动已安装,`nvidia-smi` 输出正常\n- KDE 系统信息显示仍在使用核显,程序运行时也优先使用核显\n- 导致某些应用如浏览器、Blender可能出现卡顿或掉帧现象\n\n这是因为 Arch Linux 的高自定义性,许多功能需要用户手动配置。以下是详细的解决方案。\n\n---\n\n## 配置 X11 下的 Nvidia 显卡优先\n\n可以通过配置 `/etc/X11/xorg.conf` 实现 Nvidia 独显输出。幸运的是Nvidia 提供了自动生成配置文件的工具,用户无需手动编写:\n\n```bash\nsudo nvidia-xconfig --prime\n```\n\n该命令会根据硬件情况自动生成配置文件。执行后 **重新登录会话** 即可生效(即使是 Wayland 用户也可以执行一次此命令)。\n\n![X11 Nvidia配置](/images/1613f5602b203b38230f19699deb0219454454985.png)\n\n---\n\n## 配置 Wayland 下的 Nvidia 显卡优先\n\n在 Wayland 下优先启用 Nvidia 显卡的步骤如下:\n\n1. 编辑 **GRUB 配置**文件:\n\n 打开 `/etc/default/grub` 文件,在 `GRUB_CMDLINE_LINUX_DEFAULT=\"\"` 中添加 `nvidia_drm.modeset=1`\n\n ```bash\n GRUB_CMDLINE_LINUX_DEFAULT=\"nvidia_drm.modeset=1\"\n ```\n\n2. 重新生成 grub 配置:\n\n ```bash\n sudo grub-mkconfig -o /boot/grub/grub.cfg\n ```\n\n3. 配置 **Plasma 环境**文件:\n\n 在 `~/.config/plasma-workspace/env/nvidia.sh` 中写入以下内容:\n\n ```bash\n #!/bin/bash \n export __NV_PRIME_RENDER_OFFLOAD=1 \n export __GLX_VENDOR_LIBRARY_NAME=nvidia\n ```\n\n4. 保存并重启电脑,即可生效。\n\n![Wayland Nvidia配置](/images/b2054bbaf6197624d38cc2007d885fd1454454985.png)\n\n---\n\n## I+N 混合显卡方案\n\n如果不希望全局启用独显可以选择让大部分程序默认使用核显而少数高性能需求的程序使用独显。这种方法能有效节省功耗同时将独显资源集中分配给需要的程序如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。\n\n### 配置步骤\n\n1. 打开程序的 `.desktop` 启动文件:\n\n 位置可能在 `/usr/share/applications` 或 `~/.local/share/applications` 中。\n\n2. 在 `Exec=` 后添加 `prime-run` 参数。例如:\n\n ```text\n Exec=prime-run <程序启动命令>\n ```\n\n ![混合显卡配置示意图](/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png)\n\n### Vim 快捷配置\n\n如果使用 Vim可以使用以下快捷键快速批量替换 `Exec=` 为 `Exec=prime-run`\n\n```vim\nv -> G -> :s/Exec=/Exec=prime-run /g Enter -> :wq Enter\n```\n\n---\n\n## 让 Plasma 桌面也使用独显\n\n如果希望 Plasma 桌面也通过独显运行,可以修改 Wayland 配置文件并删除第二行:\n\n```bash\n#!/bin/bash \nexport __GLX_VENDOR_LIBRARY_NAME=nvidia\n```\n\n这样 Plasma 桌面会通过独显启动,其他程序则默认使用核显。\n\n---\n\n希望以上经验能为有此需求的用户提供参考帮助。\n","slug":"arch-nvidia","published":1,"updated":"2025-02-02T11:21:35.673Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescu000rog2b1eiye9jq","content":"<p>本文将介绍在 <strong>X11</strong> 和 <strong>Wayland</strong> 两种会话下,如何在 KDE Plasma 中优先启用 Nvidia 独立显卡,并提供 I+N 混合显卡的配置方案。<strong>首先,请确保您已经正确安装了 Nvidia 驱动</strong>(如果非 Mainline 内核,请使用 <code>nvidia-dkms</code> 或 <code>nvidia-open-dkms</code> 版本)。</p>\n<p><img src=\"/images/5364bba6d035326e82c53504dd53e7c2454454985.png\" alt=\"Nvidia设置示意图\"></p>\n<h3 id=\"适用系统\"><a href=\"#适用系统\" class=\"headerlink\" title=\"适用系统\"></a>适用系统</h3><p>对于 <strong>CachyOS</strong> 或 <strong>EndeavourOS</strong> 等 Arch Linux 衍生版,这些配置大多开箱即用,但对于刚刚入坑 Arch Linux 且使用 KDE 的新手可能会遇到这样的问题:</p>\n<ul>\n<li>Nvidia 驱动已安装,<code>nvidia-smi</code> 输出正常</li>\n<li>KDE 系统信息显示仍在使用核显,程序运行时也优先使用核显</li>\n<li>导致某些应用如浏览器、Blender可能出现卡顿或掉帧现象</li>\n</ul>\n<p>这是因为 Arch Linux 的高自定义性,许多功能需要用户手动配置。以下是详细的解决方案。</p>\n<hr>\n<h2 id=\"配置-X11-下的-Nvidia-显卡优先\"><a href=\"#配置-X11-下的-Nvidia-显卡优先\" class=\"headerlink\" title=\"配置 X11 下的 Nvidia 显卡优先\"></a>配置 X11 下的 Nvidia 显卡优先</h2><p>可以通过配置 <code>/etc/X11/xorg.conf</code> 实现 Nvidia 独显输出。幸运的是Nvidia 提供了自动生成配置文件的工具,用户无需手动编写:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo nvidia-xconfig --prime<br></code></pre></td></tr></table></figure>\n\n<p>该命令会根据硬件情况自动生成配置文件。执行后 <strong>重新登录会话</strong> 即可生效(即使是 Wayland 用户也可以执行一次此命令)。</p>\n<p><img src=\"/images/1613f5602b203b38230f19699deb0219454454985.png\" alt=\"X11 Nvidia配置\"></p>\n<hr>\n<h2 id=\"配置-Wayland-下的-Nvidia-显卡优先\"><a href=\"#配置-Wayland-下的-Nvidia-显卡优先\" class=\"headerlink\" title=\"配置 Wayland 下的 Nvidia 显卡优先\"></a>配置 Wayland 下的 Nvidia 显卡优先</h2><p>在 Wayland 下优先启用 Nvidia 显卡的步骤如下:</p>\n<ol>\n<li><p>编辑 <strong>GRUB 配置</strong>文件:</p>\n<p>打开 <code>/etc/default/grub</code> 文件,在 <code>GRUB_CMDLINE_LINUX_DEFAULT=&quot;&quot;</code> 中添加 <code>nvidia_drm.modeset=1</code></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">GRUB_CMDLINE_LINUX_DEFAULT=<span class=\"hljs-string\">&quot;nvidia_drm.modeset=1&quot;</span><br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重新生成 grub 配置:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo grub-mkconfig -o /boot/grub/grub.cfg<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>配置 <strong>Plasma 环境</strong>文件:</p>\n<p>在 <code>~/.config/plasma-workspace/env/nvidia.sh</code> 中写入以下内容:</p>\n<figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-meta\">#!/bin/bash </span><br><span class=\"hljs-built_in\">export</span> __NV_PRIME_RENDER_OFFLOAD=1 <br><span class=\"hljs-built_in\">export</span> __GLX_VENDOR_LIBRARY_NAME=nvidia<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>保存并重启电脑,即可生效。</p>\n</li>\n</ol>\n<p><img src=\"/images/b2054bbaf6197624d38cc2007d885fd1454454985.png\" alt=\"Wayland Nvidia配置\"></p>\n<hr>\n<h2 id=\"I-N-混合显卡方案\"><a href=\"#I-N-混合显卡方案\" class=\"headerlink\" title=\"I+N 混合显卡方案\"></a>I+N 混合显卡方案</h2><p>如果不希望全局启用独显,可以选择让大部分程序默认使用核显,而少数高性能需求的程序使用独显。这种方法能有效节省功耗,同时将独显资源集中分配给需要的程序(如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。</p>\n<h3 id=\"配置步骤\"><a href=\"#配置步骤\" class=\"headerlink\" title=\"配置步骤\"></a>配置步骤</h3><ol>\n<li><p>打开程序的 <code>.desktop</code> 启动文件:</p>\n<p>位置可能在 <code>/usr/share/applications</code> 或 <code>~/.local/share/applications</code> 中。</p>\n</li>\n<li><p>在 <code>Exec=</code> 后添加 <code>prime-run</code> 参数。例如:</p>\n<figure class=\"highlight text\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs text\">Exec=prime-run &lt;程序启动命令&gt;<br></code></pre></td></tr></table></figure>\n\n<p><img src=\"/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png\" alt=\"混合显卡配置示意图\"></p>\n</li>\n</ol>\n<h3 id=\"Vim-快捷配置\"><a href=\"#Vim-快捷配置\" class=\"headerlink\" title=\"Vim 快捷配置\"></a>Vim 快捷配置</h3><p>如果使用 Vim可以使用以下快捷键快速批量替换 <code>Exec=</code> 为 <code>Exec=prime-run</code></p>\n<figure class=\"highlight vim\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs vim\">v -&gt; G -&gt; :s/Exec=/Exec=prime-run /g Enter -&gt; :<span class=\"hljs-keyword\">wq</span> Enter<br></code></pre></td></tr></table></figure>\n\n<hr>\n<h2 id=\"让-Plasma-桌面也使用独显\"><a href=\"#让-Plasma-桌面也使用独显\" class=\"headerlink\" title=\"让 Plasma 桌面也使用独显\"></a>让 Plasma 桌面也使用独显</h2><p>如果希望 Plasma 桌面也通过独显运行,可以修改 Wayland 配置文件并删除第二行:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-meta\">#!/bin/bash </span><br><span class=\"hljs-built_in\">export</span> __GLX_VENDOR_LIBRARY_NAME=nvidia<br></code></pre></td></tr></table></figure>\n\n<p>这样 Plasma 桌面会通过独显启动,其他程序则默认使用核显。</p>\n<hr>\n<p>希望以上经验能为有此需求的用户提供参考帮助。</p>\n","excerpt":"","more":"<p>本文将介绍在 <strong>X11</strong> 和 <strong>Wayland</strong> 两种会话下,如何在 KDE Plasma 中优先启用 Nvidia 独立显卡,并提供 I+N 混合显卡的配置方案。<strong>首先,请确保您已经正确安装了 Nvidia 驱动</strong>(如果非 Mainline 内核,请使用 <code>nvidia-dkms</code> 或 <code>nvidia-open-dkms</code> 版本)。</p>\n<p><img src=\"/images/5364bba6d035326e82c53504dd53e7c2454454985.png\" alt=\"Nvidia设置示意图\"></p>\n<h3 id=\"适用系统\"><a href=\"#适用系统\" class=\"headerlink\" title=\"适用系统\"></a>适用系统</h3><p>对于 <strong>CachyOS</strong> 或 <strong>EndeavourOS</strong> 等 Arch Linux 衍生版,这些配置大多开箱即用,但对于刚刚入坑 Arch Linux 且使用 KDE 的新手可能会遇到这样的问题:</p>\n<ul>\n<li>Nvidia 驱动已安装,<code>nvidia-smi</code> 输出正常</li>\n<li>KDE 系统信息显示仍在使用核显,程序运行时也优先使用核显</li>\n<li>导致某些应用如浏览器、Blender可能出现卡顿或掉帧现象</li>\n</ul>\n<p>这是因为 Arch Linux 的高自定义性,许多功能需要用户手动配置。以下是详细的解决方案。</p>\n<hr>\n<h2 id=\"配置-X11-下的-Nvidia-显卡优先\"><a href=\"#配置-X11-下的-Nvidia-显卡优先\" class=\"headerlink\" title=\"配置 X11 下的 Nvidia 显卡优先\"></a>配置 X11 下的 Nvidia 显卡优先</h2><p>可以通过配置 <code>/etc/X11/xorg.conf</code> 实现 Nvidia 独显输出。幸运的是Nvidia 提供了自动生成配置文件的工具,用户无需手动编写:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo nvidia-xconfig --prime<br></code></pre></td></tr></table></figure>\n\n<p>该命令会根据硬件情况自动生成配置文件。执行后 <strong>重新登录会话</strong> 即可生效(即使是 Wayland 用户也可以执行一次此命令)。</p>\n<p><img src=\"/images/1613f5602b203b38230f19699deb0219454454985.png\" alt=\"X11 Nvidia配置\"></p>\n<hr>\n<h2 id=\"配置-Wayland-下的-Nvidia-显卡优先\"><a href=\"#配置-Wayland-下的-Nvidia-显卡优先\" class=\"headerlink\" title=\"配置 Wayland 下的 Nvidia 显卡优先\"></a>配置 Wayland 下的 Nvidia 显卡优先</h2><p>在 Wayland 下优先启用 Nvidia 显卡的步骤如下:</p>\n<ol>\n<li><p>编辑 <strong>GRUB 配置</strong>文件:</p>\n<p>打开 <code>/etc/default/grub</code> 文件,在 <code>GRUB_CMDLINE_LINUX_DEFAULT=&quot;&quot;</code> 中添加 <code>nvidia_drm.modeset=1</code></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">GRUB_CMDLINE_LINUX_DEFAULT=<span class=\"hljs-string\">&quot;nvidia_drm.modeset=1&quot;</span><br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重新生成 grub 配置:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo grub-mkconfig -o /boot/grub/grub.cfg<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>配置 <strong>Plasma 环境</strong>文件:</p>\n<p>在 <code>~/.config/plasma-workspace/env/nvidia.sh</code> 中写入以下内容:</p>\n<figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-meta\">#!/bin/bash </span><br><span class=\"hljs-built_in\">export</span> __NV_PRIME_RENDER_OFFLOAD=1 <br><span class=\"hljs-built_in\">export</span> __GLX_VENDOR_LIBRARY_NAME=nvidia<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>保存并重启电脑,即可生效。</p>\n</li>\n</ol>\n<p><img src=\"/images/b2054bbaf6197624d38cc2007d885fd1454454985.png\" alt=\"Wayland Nvidia配置\"></p>\n<hr>\n<h2 id=\"I-N-混合显卡方案\"><a href=\"#I-N-混合显卡方案\" class=\"headerlink\" title=\"I+N 混合显卡方案\"></a>I+N 混合显卡方案</h2><p>如果不希望全局启用独显,可以选择让大部分程序默认使用核显,而少数高性能需求的程序使用独显。这种方法能有效节省功耗,同时将独显资源集中分配给需要的程序(如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。</p>\n<h3 id=\"配置步骤\"><a href=\"#配置步骤\" class=\"headerlink\" title=\"配置步骤\"></a>配置步骤</h3><ol>\n<li><p>打开程序的 <code>.desktop</code> 启动文件:</p>\n<p>位置可能在 <code>/usr/share/applications</code> 或 <code>~/.local/share/applications</code> 中。</p>\n</li>\n<li><p>在 <code>Exec=</code> 后添加 <code>prime-run</code> 参数。例如:</p>\n<figure class=\"highlight text\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs text\">Exec=prime-run &lt;程序启动命令&gt;<br></code></pre></td></tr></table></figure>\n\n<p><img src=\"/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png\" alt=\"混合显卡配置示意图\"></p>\n</li>\n</ol>\n<h3 id=\"Vim-快捷配置\"><a href=\"#Vim-快捷配置\" class=\"headerlink\" title=\"Vim 快捷配置\"></a>Vim 快捷配置</h3><p>如果使用 Vim可以使用以下快捷键快速批量替换 <code>Exec=</code> 为 <code>Exec=prime-run</code></p>\n<figure class=\"highlight vim\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs vim\">v -&gt; G -&gt; :s/Exec=/Exec=prime-run /g Enter -&gt; :<span class=\"hljs-keyword\">wq</span> Enter<br></code></pre></td></tr></table></figure>\n\n<hr>\n<h2 id=\"让-Plasma-桌面也使用独显\"><a href=\"#让-Plasma-桌面也使用独显\" class=\"headerlink\" title=\"让 Plasma 桌面也使用独显\"></a>让 Plasma 桌面也使用独显</h2><p>如果希望 Plasma 桌面也通过独显运行,可以修改 Wayland 配置文件并删除第二行:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-meta\">#!/bin/bash </span><br><span class=\"hljs-built_in\">export</span> __GLX_VENDOR_LIBRARY_NAME=nvidia<br></code></pre></td></tr></table></figure>\n\n<p>这样 Plasma 桌面会通过独显启动,其他程序则默认使用核显。</p>\n<hr>\n<p>希望以上经验能为有此需求的用户提供参考帮助。</p>\n"},{"title":"Archlinux问题记录","date":"2025-03-10T14:47:08.000Z","_content":"\n前几周在使用 Arch Linux 时遇到了两个有趣的问题,顺手记录在此,或许能帮到有类似困扰的朋友~\n\n---\n\n### 1. 显卡功耗上限解锁\n**问题现象** \n使用 `nvidia-smi` 查看显卡功耗时,发现最大功耗被限制在 55W性能无法完全释放\n\n```bash\nnvidia-smi # 输出显示 Power Limit: 55.00 W\n```\n\n**解决方案** \n启用 NVIDIA 动态功耗管理服务即可:\n```bash\nsudo systemctl enable --now nvidia-powerd\n```\n\n---\n\n### 2. Steam Proton 输入失效\n**问题描述** \n使用 proton-cachyos 和 proton-ge-custom 版本时Steam 游戏无法接收任何输入(键盘/手柄)。 \n⚠ 经排查发现是 Wayland 协议兼容性问题导致。\n\n**解决方案** \n在 Steam 游戏启动选项中加入环境变量禁用 Wayland\n```bash\nPROTON_ENABLE_WAYLAND=0 %command%\n```\n\n---\n\n","source":"_posts/archlinux-game-fix.md","raw":"---\ntitle: Archlinux问题记录\ndate: 2025-03-10 22:47:08\ntags: [生活, Archlinux]\n---\n\n前几周在使用 Arch Linux 时遇到了两个有趣的问题,顺手记录在此,或许能帮到有类似困扰的朋友~\n\n---\n\n### 1. 显卡功耗上限解锁\n**问题现象** \n使用 `nvidia-smi` 查看显卡功耗时,发现最大功耗被限制在 55W性能无法完全释放\n\n```bash\nnvidia-smi # 输出显示 Power Limit: 55.00 W\n```\n\n**解决方案** \n启用 NVIDIA 动态功耗管理服务即可:\n```bash\nsudo systemctl enable --now nvidia-powerd\n```\n\n---\n\n### 2. Steam Proton 输入失效\n**问题描述** \n使用 proton-cachyos 和 proton-ge-custom 版本时Steam 游戏无法接收任何输入(键盘/手柄)。 \n⚠ 经排查发现是 Wayland 协议兼容性问题导致。\n\n**解决方案** \n在 Steam 游戏启动选项中加入环境变量禁用 Wayland\n```bash\nPROTON_ENABLE_WAYLAND=0 %command%\n```\n\n---\n\n","slug":"archlinux-game-fix","published":1,"updated":"2025-03-10T14:54:16.788Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescu000uog2b4t49836d","content":"<p>前几周在使用 Arch Linux 时遇到了两个有趣的问题,顺手记录在此,或许能帮到有类似困扰的朋友~</p>\n<hr>\n<h3 id=\"1-显卡功耗上限解锁\"><a href=\"#1-显卡功耗上限解锁\" class=\"headerlink\" title=\"1. 显卡功耗上限解锁\"></a>1. 显卡功耗上限解锁</h3><p><strong>问题现象</strong><br>使用 <code>nvidia-smi</code> 查看显卡功耗时,发现最大功耗被限制在 55W性能无法完全释放</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">nvidia-smi <span class=\"hljs-comment\"># 输出显示 Power Limit: 55.00 W</span><br></code></pre></td></tr></table></figure>\n\n<p><strong>解决方案</strong><br>启用 NVIDIA 动态功耗管理服务即可:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo systemctl <span class=\"hljs-built_in\">enable</span> --now nvidia-powerd<br></code></pre></td></tr></table></figure>\n\n<hr>\n<h3 id=\"2-Steam-Proton-输入失效\"><a href=\"#2-Steam-Proton-输入失效\" class=\"headerlink\" title=\"2. Steam Proton 输入失效\"></a>2. Steam Proton 输入失效</h3><p><strong>问题描述</strong><br>使用 proton-cachyos 和 proton-ge-custom 版本时Steam 游戏无法接收任何输入(键盘&#x2F;手柄)。<br>⚠️ 经排查发现是 Wayland 协议兼容性问题导致。</p>\n<p><strong>解决方案</strong><br>在 Steam 游戏启动选项中加入环境变量禁用 Wayland</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">PROTON_ENABLE_WAYLAND=0 %<span class=\"hljs-built_in\">command</span>%<br></code></pre></td></tr></table></figure>\n\n<hr>\n","excerpt":"","more":"<p>前几周在使用 Arch Linux 时遇到了两个有趣的问题,顺手记录在此,或许能帮到有类似困扰的朋友~</p>\n<hr>\n<h3 id=\"1-显卡功耗上限解锁\"><a href=\"#1-显卡功耗上限解锁\" class=\"headerlink\" title=\"1. 显卡功耗上限解锁\"></a>1. 显卡功耗上限解锁</h3><p><strong>问题现象</strong><br>使用 <code>nvidia-smi</code> 查看显卡功耗时,发现最大功耗被限制在 55W性能无法完全释放</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">nvidia-smi <span class=\"hljs-comment\"># 输出显示 Power Limit: 55.00 W</span><br></code></pre></td></tr></table></figure>\n\n<p><strong>解决方案</strong><br>启用 NVIDIA 动态功耗管理服务即可:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo systemctl <span class=\"hljs-built_in\">enable</span> --now nvidia-powerd<br></code></pre></td></tr></table></figure>\n\n<hr>\n<h3 id=\"2-Steam-Proton-输入失效\"><a href=\"#2-Steam-Proton-输入失效\" class=\"headerlink\" title=\"2. Steam Proton 输入失效\"></a>2. Steam Proton 输入失效</h3><p><strong>问题描述</strong><br>使用 proton-cachyos 和 proton-ge-custom 版本时Steam 游戏无法接收任何输入(键盘&#x2F;手柄)。<br>⚠️ 经排查发现是 Wayland 协议兼容性问题导致。</p>\n<p><strong>解决方案</strong><br>在 Steam 游戏启动选项中加入环境变量禁用 Wayland</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">PROTON_ENABLE_WAYLAND=0 %<span class=\"hljs-built_in\">command</span>%<br></code></pre></td></tr></table></figure>\n\n<hr>\n"},{"title":"Archlinux KDE体验优化总结","date":"2025-02-02T10:43:26.000Z","_content":"\n打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验\n\n本文章长期更新\n\n------\n\n## 更换CachyOS优化仓库\n\n![CachyOS Logo](https://wiki.cachyos.org/_astro/logo.DVTdAJi6.svg) \n通过 CachyOS 优化仓库获取 CPU 指令集级优化x86-64-v3/v4/zen4的软件包提升 Arch Linux 系统性能。该仓库提供 PGO/LTO/BOLT 编译优化及持续维护的定制软件包。\n\n---\n\n### ▎前置准备\n**⚠️ 兼容性警告** \n1. 可以先通过命令`/usr/lib64/ld-linux-x86-64.so.2 --help | grep -i x86-64-`来查看你的处理器支持等级。\n2. 注意添加 `cachyos` 主仓库会替换官方 pacman 仓库(含 INSTALLED_FROM 等特性) \n ```bash\n cachyos-v3 # AVX2 优化\n cachyos-v4 # AVX512 优化\n cachyos-extra # 扩展软件包\n ```\n3. CachyOS官方在前段时间专门推出了针对 AMD 的Zen4和Zen5架构优化仓库如有需要可以[点击这里](https://discuss.cachyos.org/t/zen-4-5-optimized-repository-testing/713/7)查看如何部署。\n\n---\n\n### ▎仓库配置流程\n#### ▶ 自动配置脚本\n```bash\n# 下载配置工具\ncurl -LO https://mirror.cachyos.org/cachyos-repo.tar.xz\ntar xvf cachyos-repo.tar.xz && cd cachyos-repo\n\n# 执行自动配置(自动检测 CPU 指令集)\nsudo ./cachyos-repo.sh\n```\n📌 脚本特性: \n- 自动备份 `/etc/pacman.conf` \n- 智能匹配最优指令集版本 (v3/v4) \n- 支持 x86_64 和 aarch64 架构 \n\n#### ▶ 手动配置方式\n1. 编辑 pacman.conf\n```ini\n# 在 /etc/pacman.conf 末尾添加(示例为 AVX2 优化)\n[cachyos-v3]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/cachyos-v3\n```\n\n2. ✅同步仓库数据库\n```bash\nsudo pacman -Syu\n```\n\n---\n\n### ▎仓库卸载方法\n#### ▶ 自动卸载\n```bash\ncd cachyos-repo\nsudo ./cachyos-repo.sh --remove\n```\n\n#### ▶ 手动卸载\n1. 删除 pacman.conf 中的 cachyos 仓库段\n2. 移除配置文件\n```bash\nsudo rm -rf /etc/pacman.d/cachyos*\n```\n---\n\n## 内核更换\n\n## KDE 配置\n\n\n\n","source":"_posts/archlinux-optimization.md","raw":"---\ntitle: Archlinux KDE体验优化总结\ndate: 2025-02-02 18:43:26\ntags: [Archlinux, 系统优化, 技术分享]\n---\n\n打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验\n\n本文章长期更新\n\n------\n\n## 更换CachyOS优化仓库\n\n![CachyOS Logo](https://wiki.cachyos.org/_astro/logo.DVTdAJi6.svg) \n通过 CachyOS 优化仓库获取 CPU 指令集级优化x86-64-v3/v4/zen4的软件包提升 Arch Linux 系统性能。该仓库提供 PGO/LTO/BOLT 编译优化及持续维护的定制软件包。\n\n---\n\n### ▎前置准备\n**⚠️ 兼容性警告** \n1. 可以先通过命令`/usr/lib64/ld-linux-x86-64.so.2 --help | grep -i x86-64-`来查看你的处理器支持等级。\n2. 注意添加 `cachyos` 主仓库会替换官方 pacman 仓库(含 INSTALLED_FROM 等特性) \n ```bash\n cachyos-v3 # AVX2 优化\n cachyos-v4 # AVX512 优化\n cachyos-extra # 扩展软件包\n ```\n3. CachyOS官方在前段时间专门推出了针对 AMD 的Zen4和Zen5架构优化仓库如有需要可以[点击这里](https://discuss.cachyos.org/t/zen-4-5-optimized-repository-testing/713/7)查看如何部署。\n\n---\n\n### ▎仓库配置流程\n#### ▶ 自动配置脚本\n```bash\n# 下载配置工具\ncurl -LO https://mirror.cachyos.org/cachyos-repo.tar.xz\ntar xvf cachyos-repo.tar.xz && cd cachyos-repo\n\n# 执行自动配置(自动检测 CPU 指令集)\nsudo ./cachyos-repo.sh\n```\n📌 脚本特性: \n- 自动备份 `/etc/pacman.conf` \n- 智能匹配最优指令集版本 (v3/v4) \n- 支持 x86_64 和 aarch64 架构 \n\n#### ▶ 手动配置方式\n1. 编辑 pacman.conf\n```ini\n# 在 /etc/pacman.conf 末尾添加(示例为 AVX2 优化)\n[cachyos-v3]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/cachyos-v3\n```\n\n2. ✅同步仓库数据库\n```bash\nsudo pacman -Syu\n```\n\n---\n\n### ▎仓库卸载方法\n#### ▶ 自动卸载\n```bash\ncd cachyos-repo\nsudo ./cachyos-repo.sh --remove\n```\n\n#### ▶ 手动卸载\n1. 删除 pacman.conf 中的 cachyos 仓库段\n2. 移除配置文件\n```bash\nsudo rm -rf /etc/pacman.d/cachyos*\n```\n---\n\n## 内核更换\n\n## KDE 配置\n\n\n\n","slug":"archlinux-optimization","published":1,"updated":"2025-03-10T15:07:26.618Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescu000xog2b6y6h50af","content":"<p>打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验</p>\n<p>本文章长期更新</p>\n<hr>\n<h2 id=\"更换CachyOS优化仓库\"><a href=\"#更换CachyOS优化仓库\" class=\"headerlink\" title=\"更换CachyOS优化仓库\"></a>更换CachyOS优化仓库</h2><p><img src=\"https://wiki.cachyos.org/_astro/logo.DVTdAJi6.svg\" alt=\"CachyOS Logo\"><br>通过 CachyOS 优化仓库获取 CPU 指令集级优化x86-64-v3&#x2F;v4&#x2F;zen4的软件包提升 Arch Linux 系统性能。该仓库提供 PGO&#x2F;LTO&#x2F;BOLT 编译优化及持续维护的定制软件包。</p>\n<hr>\n<h3 id=\"▎前置准备\"><a href=\"#▎前置准备\" class=\"headerlink\" title=\"▎前置准备\"></a>▎前置准备</h3><p><strong>⚠️ 兼容性警告</strong> </p>\n<ol>\n<li>可以先通过命令<code>/usr/lib64/ld-linux-x86-64.so.2 --help | grep -i x86-64-</code>来查看你的处理器支持等级。</li>\n<li>注意添加 <code>cachyos</code> 主仓库会替换官方 pacman 仓库(含 INSTALLED_FROM 等特性) <figure class=\"highlight bash\"><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><code class=\"hljs bash\">cachyos-v3 <span class=\"hljs-comment\"># AVX2 优化</span><br>cachyos-v4 <span class=\"hljs-comment\"># AVX512 优化</span><br>cachyos-extra <span class=\"hljs-comment\"># 扩展软件包</span><br></code></pre></td></tr></table></figure></li>\n<li>CachyOS官方在前段时间专门推出了针对 AMD 的Zen4和Zen5架构优化仓库如有需要可以<a href=\"https://discuss.cachyos.org/t/zen-4-5-optimized-repository-testing/713/7\">点击这里</a>查看如何部署。</li>\n</ol>\n<hr>\n<h3 id=\"▎仓库配置流程\"><a href=\"#▎仓库配置流程\" class=\"headerlink\" title=\"▎仓库配置流程\"></a>▎仓库配置流程</h3><h4 id=\"▶-自动配置脚本\"><a href=\"#▶-自动配置脚本\" class=\"headerlink\" title=\"▶ 自动配置脚本\"></a>▶ 自动配置脚本</h4><figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-comment\"># 下载配置工具</span><br>curl -LO https://mirror.cachyos.org/cachyos-repo.tar.xz<br>tar xvf cachyos-repo.tar.xz &amp;&amp; <span class=\"hljs-built_in\">cd</span> cachyos-repo<br><br><span class=\"hljs-comment\"># 执行自动配置(自动检测 CPU 指令集)</span><br>sudo ./cachyos-repo.sh<br></code></pre></td></tr></table></figure>\n<p>📌 脚本特性: </p>\n<ul>\n<li>自动备份 <code>/etc/pacman.conf</code> </li>\n<li>智能匹配最优指令集版本 (v3&#x2F;v4) </li>\n<li>支持 x86_64 和 aarch64 架构</li>\n</ul>\n<h4 id=\"▶-手动配置方式\"><a href=\"#▶-手动配置方式\" class=\"headerlink\" title=\"▶ 手动配置方式\"></a>▶ 手动配置方式</h4><ol>\n<li><p>编辑 pacman.conf</p>\n<figure class=\"highlight ini\"><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><code class=\"hljs ini\"><span class=\"hljs-comment\"># 在 /etc/pacman.conf 末尾添加(示例为 AVX2 优化)</span><br><span class=\"hljs-section\">[cachyos-v3]</span><br><span class=\"hljs-attr\">SigLevel</span> = Optional TrustAll<br><span class=\"hljs-attr\">Include</span> = /etc/pacman.d/cachyos-v3<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>✅同步仓库数据库</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo pacman -Syu<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<h3 id=\"▎仓库卸载方法\"><a href=\"#▎仓库卸载方法\" class=\"headerlink\" title=\"▎仓库卸载方法\"></a>▎仓库卸载方法</h3><h4 id=\"▶-自动卸载\"><a href=\"#▶-自动卸载\" class=\"headerlink\" title=\"▶ 自动卸载\"></a>▶ 自动卸载</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">cd</span> cachyos-repo<br>sudo ./cachyos-repo.sh --remove<br></code></pre></td></tr></table></figure>\n\n<h4 id=\"▶-手动卸载\"><a href=\"#▶-手动卸载\" class=\"headerlink\" title=\"▶ 手动卸载\"></a>▶ 手动卸载</h4><ol>\n<li>删除 pacman.conf 中的 cachyos 仓库段</li>\n<li>移除配置文件<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo <span class=\"hljs-built_in\">rm</span> -rf /etc/pacman.d/cachyos*<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<h2 id=\"内核更换\"><a href=\"#内核更换\" class=\"headerlink\" title=\"内核更换\"></a>内核更换</h2><h2 id=\"KDE-配置\"><a href=\"#KDE-配置\" class=\"headerlink\" title=\"KDE 配置\"></a>KDE 配置</h2>","excerpt":"","more":"<p>打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验</p>\n<p>本文章长期更新</p>\n<hr>\n<h2 id=\"更换CachyOS优化仓库\"><a href=\"#更换CachyOS优化仓库\" class=\"headerlink\" title=\"更换CachyOS优化仓库\"></a>更换CachyOS优化仓库</h2><p><img src=\"https://wiki.cachyos.org/_astro/logo.DVTdAJi6.svg\" alt=\"CachyOS Logo\"><br>通过 CachyOS 优化仓库获取 CPU 指令集级优化x86-64-v3&#x2F;v4&#x2F;zen4的软件包提升 Arch Linux 系统性能。该仓库提供 PGO&#x2F;LTO&#x2F;BOLT 编译优化及持续维护的定制软件包。</p>\n<hr>\n<h3 id=\"▎前置准备\"><a href=\"#▎前置准备\" class=\"headerlink\" title=\"▎前置准备\"></a>▎前置准备</h3><p><strong>⚠️ 兼容性警告</strong> </p>\n<ol>\n<li>可以先通过命令<code>/usr/lib64/ld-linux-x86-64.so.2 --help | grep -i x86-64-</code>来查看你的处理器支持等级。</li>\n<li>注意添加 <code>cachyos</code> 主仓库会替换官方 pacman 仓库(含 INSTALLED_FROM 等特性) <figure class=\"highlight bash\"><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><code class=\"hljs bash\">cachyos-v3 <span class=\"hljs-comment\"># AVX2 优化</span><br>cachyos-v4 <span class=\"hljs-comment\"># AVX512 优化</span><br>cachyos-extra <span class=\"hljs-comment\"># 扩展软件包</span><br></code></pre></td></tr></table></figure></li>\n<li>CachyOS官方在前段时间专门推出了针对 AMD 的Zen4和Zen5架构优化仓库如有需要可以<a href=\"https://discuss.cachyos.org/t/zen-4-5-optimized-repository-testing/713/7\">点击这里</a>查看如何部署。</li>\n</ol>\n<hr>\n<h3 id=\"▎仓库配置流程\"><a href=\"#▎仓库配置流程\" class=\"headerlink\" title=\"▎仓库配置流程\"></a>▎仓库配置流程</h3><h4 id=\"▶-自动配置脚本\"><a href=\"#▶-自动配置脚本\" class=\"headerlink\" title=\"▶ 自动配置脚本\"></a>▶ 自动配置脚本</h4><figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-comment\"># 下载配置工具</span><br>curl -LO https://mirror.cachyos.org/cachyos-repo.tar.xz<br>tar xvf cachyos-repo.tar.xz &amp;&amp; <span class=\"hljs-built_in\">cd</span> cachyos-repo<br><br><span class=\"hljs-comment\"># 执行自动配置(自动检测 CPU 指令集)</span><br>sudo ./cachyos-repo.sh<br></code></pre></td></tr></table></figure>\n<p>📌 脚本特性: </p>\n<ul>\n<li>自动备份 <code>/etc/pacman.conf</code> </li>\n<li>智能匹配最优指令集版本 (v3&#x2F;v4) </li>\n<li>支持 x86_64 和 aarch64 架构</li>\n</ul>\n<h4 id=\"▶-手动配置方式\"><a href=\"#▶-手动配置方式\" class=\"headerlink\" title=\"▶ 手动配置方式\"></a>▶ 手动配置方式</h4><ol>\n<li><p>编辑 pacman.conf</p>\n<figure class=\"highlight ini\"><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><code class=\"hljs ini\"><span class=\"hljs-comment\"># 在 /etc/pacman.conf 末尾添加(示例为 AVX2 优化)</span><br><span class=\"hljs-section\">[cachyos-v3]</span><br><span class=\"hljs-attr\">SigLevel</span> = Optional TrustAll<br><span class=\"hljs-attr\">Include</span> = /etc/pacman.d/cachyos-v3<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>✅同步仓库数据库</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo pacman -Syu<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<h3 id=\"▎仓库卸载方法\"><a href=\"#▎仓库卸载方法\" class=\"headerlink\" title=\"▎仓库卸载方法\"></a>▎仓库卸载方法</h3><h4 id=\"▶-自动卸载\"><a href=\"#▶-自动卸载\" class=\"headerlink\" title=\"▶ 自动卸载\"></a>▶ 自动卸载</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">cd</span> cachyos-repo<br>sudo ./cachyos-repo.sh --remove<br></code></pre></td></tr></table></figure>\n\n<h4 id=\"▶-手动卸载\"><a href=\"#▶-手动卸载\" class=\"headerlink\" title=\"▶ 手动卸载\"></a>▶ 手动卸载</h4><ol>\n<li>删除 pacman.conf 中的 cachyos 仓库段</li>\n<li>移除配置文件<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo <span class=\"hljs-built_in\">rm</span> -rf /etc/pacman.d/cachyos*<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<h2 id=\"内核更换\"><a href=\"#内核更换\" class=\"headerlink\" title=\"内核更换\"></a>内核更换</h2><h2 id=\"KDE-配置\"><a href=\"#KDE-配置\" class=\"headerlink\" title=\"KDE 配置\"></a>KDE 配置</h2>"},{"title":"使用Clonezilla备份和克隆系统","date":"2025-02-23T13:40:03.000Z","_content":"![Clonezilla官网](/images/clonezilla.png)\n[Clonezilla](https://clonezilla.org/)是一款非常好用的系统迁移工具本文将介绍其基本用法不包含网络迁移及Clonezilla服务器等进阶内容以及在克隆Btrfs磁盘时遇到的问题解法。\n\n---\n### **零.事前准备**\n - 下载Clonezilla Live镜像ISO制作启动U盘有手就行。\n - 准备目标存储设备如U盘需要迁移的新硬盘等确保有足够空间建议大于源硬盘已用空间的1.2倍)。\n\n\n### **一.备份镜像到硬盘Device-to-Image**\n这个模式可以将硬盘完整备份为一个镜像文件可保存到本地硬盘、外置硬盘或网络存储方便多机部署。注意如果只是将一个硬盘的系统完全克隆到新盘可以跳过此部分。\n\n#### **步骤说明**\n2. **启动Clonezilla**\n - 插入U盘重启电脑并从U盘启动。\n - 选择默认选项语言键盘布局Beginner模式进入Clonezilla的TUI界面。\n\n3. **选择备份模式**\n ```plaintext\n Choose mode: 选择 \"device-image\"(设备到镜像)\n Mount storage media: 选择 \"local_dev\"(本地存储设备)\n ```\n - 按提示挂载目标存储设备(注意这里选择的是你要存储镜像的设备且文件系统一般不限,如外置硬盘),确认路径(如 `/dev/sdb1`)。\n\n4. **配置备份参数**\n - **源硬盘**:选择需要备份的硬盘(如 `/dev/sda`)。\n - **镜像存储路径**:指定目标位置(如外置硬盘的挂载目录)。\n - **镜像名称**:自定义名称(如 `2025-img-rockylinux-2-21`)。\n - **压缩选项**:默认即可,支持并行压缩加速。\n - **镜像分割**若目标存储设备为FAT32格式单文件最大4GB选择自动分割。\n\n5. **确认操作**\n - 检查提示信息,输入 `y` 开始备份。\n - 完成后关机或重启。\n\n6. **镜像还原**和备份非常相似只是选项换成restore to disk顺着指引操作即可。\n---\n\n### **二、直接克隆硬盘Device-to-Device**\n将源硬盘完整克隆到目标硬盘适合硬盘升级或快速迁移比如笔者最近白嫖了一个三星的2T硬盘直接把原来512G硬盘里的CachyOS无损迁移了进去。\n\n#### **步骤说明**\n1. **准备工作**\n - 连接目标硬盘需容量≥源硬盘已用空间还原镜像操作也是如此注意Clonezilla支持小分区到大分区迁移不支持大分区到小分区后者出门右转Rsync\n - **警告**:目标硬盘数据将被覆盖,操作前如有需要务必备份重要数据!\n\n2. **启动Clonezilla**\n - 同上从U盘启动进入Clonezilla界面。\n\n3. **选择克隆模式**\n ```plaintext\n Choose mode: 选择 \"device-device\"(设备到设备)\n ```\n\n4. **选择硬盘**\n - **母碟硬盘**:选择原始硬盘(如 `/dev/sda`)。\n - **目标硬盘**:选择新硬盘(如 `/dev/sdb`)。\n\n5. **克隆选项**\n 需要进入专家模式才能看到,一般直接新手模式默认即可。\n\n6. **执行克隆**\n - 确认提示信息后输入 `y`,等待完成。\n - 克隆结束后关机移除旧硬盘并测试新硬盘主要是查看能不能启动进入系统若能进入一般不会有问题而且一般都能进入因为Clonezilla是高精确的块对块克隆。\n\n---\n### **两种模式对比**\n| **模式** | 特点 | \n|----------------|---------------------------|\n| 备份镜像 | 方便多机部署也可以用于留档|\n| 直接克隆 | 换硬盘快速迁移无需恢复过程|\n---\n\n### **Btrfs务必注意**\n对Btrfs直接进行Clonezilla克隆大概率会碰到一个边界错误这是由于Btrfs本身使用一段时间后碎片化存储导致的你需要执行`sudo btrfs balance start --full-balance /`来进行整理,但是这也算是一个风险操作要确保完整执行不能在执行时意外中断导致文件系统出错,并且在后续克隆时不能使用新手模式要进入专家模式勾选-p1支持所有文件系统但是效率降低的选项来确保顺利克隆未勾选此选项可能导致文件系统无法识别的错误其他步骤参照前文即可。\n\n","source":"_posts/clonezilla.md","raw":"---\ntitle: 使用Clonezilla备份和克隆系统\ndate: 2025-02-23 21:40:03\ntags: 技术分享\n---\n![Clonezilla官网](/images/clonezilla.png)\n[Clonezilla](https://clonezilla.org/)是一款非常好用的系统迁移工具本文将介绍其基本用法不包含网络迁移及Clonezilla服务器等进阶内容以及在克隆Btrfs磁盘时遇到的问题解法。\n\n---\n### **零.事前准备**\n - 下载Clonezilla Live镜像ISO制作启动U盘有手就行。\n - 准备目标存储设备如U盘需要迁移的新硬盘等确保有足够空间建议大于源硬盘已用空间的1.2倍)。\n\n\n### **一.备份镜像到硬盘Device-to-Image**\n这个模式可以将硬盘完整备份为一个镜像文件可保存到本地硬盘、外置硬盘或网络存储方便多机部署。注意如果只是将一个硬盘的系统完全克隆到新盘可以跳过此部分。\n\n#### **步骤说明**\n2. **启动Clonezilla**\n - 插入U盘重启电脑并从U盘启动。\n - 选择默认选项语言键盘布局Beginner模式进入Clonezilla的TUI界面。\n\n3. **选择备份模式**\n ```plaintext\n Choose mode: 选择 \"device-image\"(设备到镜像)\n Mount storage media: 选择 \"local_dev\"(本地存储设备)\n ```\n - 按提示挂载目标存储设备(注意这里选择的是你要存储镜像的设备且文件系统一般不限,如外置硬盘),确认路径(如 `/dev/sdb1`)。\n\n4. **配置备份参数**\n - **源硬盘**:选择需要备份的硬盘(如 `/dev/sda`)。\n - **镜像存储路径**:指定目标位置(如外置硬盘的挂载目录)。\n - **镜像名称**:自定义名称(如 `2025-img-rockylinux-2-21`)。\n - **压缩选项**:默认即可,支持并行压缩加速。\n - **镜像分割**若目标存储设备为FAT32格式单文件最大4GB选择自动分割。\n\n5. **确认操作**\n - 检查提示信息,输入 `y` 开始备份。\n - 完成后关机或重启。\n\n6. **镜像还原**和备份非常相似只是选项换成restore to disk顺着指引操作即可。\n---\n\n### **二、直接克隆硬盘Device-to-Device**\n将源硬盘完整克隆到目标硬盘适合硬盘升级或快速迁移比如笔者最近白嫖了一个三星的2T硬盘直接把原来512G硬盘里的CachyOS无损迁移了进去。\n\n#### **步骤说明**\n1. **准备工作**\n - 连接目标硬盘需容量≥源硬盘已用空间还原镜像操作也是如此注意Clonezilla支持小分区到大分区迁移不支持大分区到小分区后者出门右转Rsync\n - **警告**:目标硬盘数据将被覆盖,操作前如有需要务必备份重要数据!\n\n2. **启动Clonezilla**\n - 同上从U盘启动进入Clonezilla界面。\n\n3. **选择克隆模式**\n ```plaintext\n Choose mode: 选择 \"device-device\"(设备到设备)\n ```\n\n4. **选择硬盘**\n - **母碟硬盘**:选择原始硬盘(如 `/dev/sda`)。\n - **目标硬盘**:选择新硬盘(如 `/dev/sdb`)。\n\n5. **克隆选项**\n 需要进入专家模式才能看到,一般直接新手模式默认即可。\n\n6. **执行克隆**\n - 确认提示信息后输入 `y`,等待完成。\n - 克隆结束后关机移除旧硬盘并测试新硬盘主要是查看能不能启动进入系统若能进入一般不会有问题而且一般都能进入因为Clonezilla是高精确的块对块克隆。\n\n---\n### **两种模式对比**\n| **模式** | 特点 | \n|----------------|---------------------------|\n| 备份镜像 | 方便多机部署也可以用于留档|\n| 直接克隆 | 换硬盘快速迁移无需恢复过程|\n---\n\n### **Btrfs务必注意**\n对Btrfs直接进行Clonezilla克隆大概率会碰到一个边界错误这是由于Btrfs本身使用一段时间后碎片化存储导致的你需要执行`sudo btrfs balance start --full-balance /`来进行整理,但是这也算是一个风险操作要确保完整执行不能在执行时意外中断导致文件系统出错,并且在后续克隆时不能使用新手模式要进入专家模式勾选-p1支持所有文件系统但是效率降低的选项来确保顺利克隆未勾选此选项可能导致文件系统无法识别的错误其他步骤参照前文即可。\n\n","slug":"clonezilla","published":1,"updated":"2025-02-23T14:12:10.654Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescv000zog2bhb322isp","content":"<p><img src=\"/images/clonezilla.png\" alt=\"Clonezilla官网\"><br><a href=\"https://clonezilla.org/\">Clonezilla</a>是一款非常好用的系统迁移工具本文将介绍其基本用法不包含网络迁移及Clonezilla服务器等进阶内容以及在克隆Btrfs磁盘时遇到的问题解法。</p>\n<hr>\n<h3 id=\"零-事前准备:\"><a href=\"#零-事前准备:\" class=\"headerlink\" title=\"零.事前准备:\"></a><strong>零.事前准备</strong></h3><ul>\n<li>下载Clonezilla Live镜像ISO制作启动U盘有手就行。</li>\n<li>准备目标存储设备如U盘需要迁移的新硬盘等确保有足够空间建议大于源硬盘已用空间的1.2倍)。</li>\n</ul>\n<h3 id=\"一-备份镜像到硬盘Device-to-Image\"><a href=\"#一-备份镜像到硬盘Device-to-Image\" class=\"headerlink\" title=\"一.备份镜像到硬盘Device-to-Image\"></a><strong>一.备份镜像到硬盘Device-to-Image</strong></h3><p>这个模式可以将硬盘完整备份为一个镜像文件(可保存到本地硬盘、外置硬盘或网络存储)方便多机部署。注意如果只是将一个硬盘的系统完全克隆到新盘可以跳过此部分。</p>\n<h4 id=\"步骤说明:\"><a href=\"#步骤说明:\" class=\"headerlink\" title=\"步骤说明:\"></a><strong>步骤说明</strong></h4><ol start=\"2\">\n<li><p><strong>启动Clonezilla</strong></p>\n<ul>\n<li>插入U盘重启电脑并从U盘启动。</li>\n<li>选择默认选项语言键盘布局Beginner模式进入Clonezilla的TUI界面。</li>\n</ul>\n</li>\n<li><p><strong>选择备份模式</strong></p>\n<figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs plaintext\">Choose mode: 选择 &quot;device-image&quot;(设备到镜像)<br>Mount storage media: 选择 &quot;local_dev&quot;(本地存储设备)<br></code></pre></td></tr></table></figure>\n<ul>\n<li>按提示挂载目标存储设备(注意这里选择的是你要存储镜像的设备且文件系统一般不限,如外置硬盘),确认路径(如 <code>/dev/sdb1</code>)。</li>\n</ul>\n</li>\n<li><p><strong>配置备份参数</strong></p>\n<ul>\n<li><strong>源硬盘</strong>:选择需要备份的硬盘(如 <code>/dev/sda</code>)。</li>\n<li><strong>镜像存储路径</strong>:指定目标位置(如外置硬盘的挂载目录)。</li>\n<li><strong>镜像名称</strong>:自定义名称(如 <code>2025-img-rockylinux-2-21</code>)。</li>\n<li><strong>压缩选项</strong>:默认即可,支持并行压缩加速。</li>\n<li><strong>镜像分割</strong>若目标存储设备为FAT32格式单文件最大4GB选择自动分割。</li>\n</ul>\n</li>\n<li><p><strong>确认操作</strong></p>\n<ul>\n<li>检查提示信息,输入 <code>y</code> 开始备份。</li>\n<li>完成后关机或重启。</li>\n</ul>\n</li>\n<li><p><strong>镜像还原</strong>和备份非常相似只是选项换成restore to disk顺着指引操作即可。</p>\n</li>\n</ol>\n<hr>\n<h3 id=\"二、直接克隆硬盘Device-to-Device\"><a href=\"#二、直接克隆硬盘Device-to-Device\" class=\"headerlink\" title=\"二、直接克隆硬盘Device-to-Device\"></a><strong>二、直接克隆硬盘Device-to-Device</strong></h3><p>将源硬盘完整克隆到目标硬盘适合硬盘升级或快速迁移比如笔者最近白嫖了一个三星的2T硬盘直接把原来512G硬盘里的CachyOS无损迁移了进去。</p>\n<h4 id=\"步骤说明:-1\"><a href=\"#步骤说明:-1\" class=\"headerlink\" title=\"步骤说明:\"></a><strong>步骤说明</strong></h4><ol>\n<li><p><strong>准备工作</strong></p>\n<ul>\n<li>连接目标硬盘需容量≥源硬盘已用空间还原镜像操作也是如此注意Clonezilla支持小分区到大分区迁移不支持大分区到小分区后者出门右转Rsync</li>\n<li><strong>警告</strong>:目标硬盘数据将被覆盖,操作前如有需要务必备份重要数据!</li>\n</ul>\n</li>\n<li><p><strong>启动Clonezilla</strong></p>\n<ul>\n<li>同上从U盘启动进入Clonezilla界面。</li>\n</ul>\n</li>\n<li><p><strong>选择克隆模式</strong></p>\n<figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs plaintext\">Choose mode: 选择 &quot;device-device&quot;(设备到设备)<br></code></pre></td></tr></table></figure>\n</li>\n<li><p><strong>选择硬盘</strong></p>\n<ul>\n<li><strong>母碟硬盘</strong>:选择原始硬盘(如 <code>/dev/sda</code>)。</li>\n<li><strong>目标硬盘</strong>:选择新硬盘(如 <code>/dev/sdb</code>)。</li>\n</ul>\n</li>\n<li><p><strong>克隆选项</strong><br> 需要进入专家模式才能看到,一般直接新手模式默认即可。</p>\n</li>\n<li><p><strong>执行克隆</strong></p>\n<ul>\n<li>确认提示信息后输入 <code>y</code>,等待完成。</li>\n<li>克隆结束后关机移除旧硬盘并测试新硬盘主要是查看能不能启动进入系统若能进入一般不会有问题而且一般都能进入因为Clonezilla是高精确的块对块克隆。</li>\n</ul>\n</li>\n</ol>\n<hr>\n<h3 id=\"两种模式对比:\"><a href=\"#两种模式对比:\" class=\"headerlink\" title=\"两种模式对比:\"></a><strong>两种模式对比</strong></h3><table>\n<thead>\n<tr>\n<th><strong>模式</strong></th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>备份镜像</td>\n<td>方便多机部署也可以用于留档</td>\n</tr>\n<tr>\n<td>直接克隆</td>\n<td>换硬盘快速迁移无需恢复过程</td>\n</tr>\n</tbody></table>\n<hr>\n<h3 id=\"Btrfs务必注意\"><a href=\"#Btrfs务必注意\" class=\"headerlink\" title=\"Btrfs务必注意\"></a><strong>Btrfs务必注意</strong></h3><p>对Btrfs直接进行Clonezilla克隆大概率会碰到一个边界错误这是由于Btrfs本身使用一段时间后碎片化存储导致的你需要执行<code>sudo btrfs balance start --full-balance /</code>来进行整理,但是这也算是一个风险操作要确保完整执行不能在执行时意外中断导致文件系统出错,并且在后续克隆时不能使用新手模式要进入专家模式勾选-p1支持所有文件系统但是效率降低的选项来确保顺利克隆未勾选此选项可能导致文件系统无法识别的错误其他步骤参照前文即可。</p>\n","excerpt":"","more":"<p><img src=\"/images/clonezilla.png\" alt=\"Clonezilla官网\"><br><a href=\"https://clonezilla.org/\">Clonezilla</a>是一款非常好用的系统迁移工具本文将介绍其基本用法不包含网络迁移及Clonezilla服务器等进阶内容以及在克隆Btrfs磁盘时遇到的问题解法。</p>\n<hr>\n<h3 id=\"零-事前准备:\"><a href=\"#零-事前准备:\" class=\"headerlink\" title=\"零.事前准备:\"></a><strong>零.事前准备</strong></h3><ul>\n<li>下载Clonezilla Live镜像ISO制作启动U盘有手就行。</li>\n<li>准备目标存储设备如U盘需要迁移的新硬盘等确保有足够空间建议大于源硬盘已用空间的1.2倍)。</li>\n</ul>\n<h3 id=\"一-备份镜像到硬盘Device-to-Image\"><a href=\"#一-备份镜像到硬盘Device-to-Image\" class=\"headerlink\" title=\"一.备份镜像到硬盘Device-to-Image\"></a><strong>一.备份镜像到硬盘Device-to-Image</strong></h3><p>这个模式可以将硬盘完整备份为一个镜像文件(可保存到本地硬盘、外置硬盘或网络存储)方便多机部署。注意如果只是将一个硬盘的系统完全克隆到新盘可以跳过此部分。</p>\n<h4 id=\"步骤说明:\"><a href=\"#步骤说明:\" class=\"headerlink\" title=\"步骤说明:\"></a><strong>步骤说明</strong></h4><ol start=\"2\">\n<li><p><strong>启动Clonezilla</strong></p>\n<ul>\n<li>插入U盘重启电脑并从U盘启动。</li>\n<li>选择默认选项语言键盘布局Beginner模式进入Clonezilla的TUI界面。</li>\n</ul>\n</li>\n<li><p><strong>选择备份模式</strong></p>\n<figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs plaintext\">Choose mode: 选择 &quot;device-image&quot;(设备到镜像)<br>Mount storage media: 选择 &quot;local_dev&quot;(本地存储设备)<br></code></pre></td></tr></table></figure>\n<ul>\n<li>按提示挂载目标存储设备(注意这里选择的是你要存储镜像的设备且文件系统一般不限,如外置硬盘),确认路径(如 <code>/dev/sdb1</code>)。</li>\n</ul>\n</li>\n<li><p><strong>配置备份参数</strong></p>\n<ul>\n<li><strong>源硬盘</strong>:选择需要备份的硬盘(如 <code>/dev/sda</code>)。</li>\n<li><strong>镜像存储路径</strong>:指定目标位置(如外置硬盘的挂载目录)。</li>\n<li><strong>镜像名称</strong>:自定义名称(如 <code>2025-img-rockylinux-2-21</code>)。</li>\n<li><strong>压缩选项</strong>:默认即可,支持并行压缩加速。</li>\n<li><strong>镜像分割</strong>若目标存储设备为FAT32格式单文件最大4GB选择自动分割。</li>\n</ul>\n</li>\n<li><p><strong>确认操作</strong></p>\n<ul>\n<li>检查提示信息,输入 <code>y</code> 开始备份。</li>\n<li>完成后关机或重启。</li>\n</ul>\n</li>\n<li><p><strong>镜像还原</strong>和备份非常相似只是选项换成restore to disk顺着指引操作即可。</p>\n</li>\n</ol>\n<hr>\n<h3 id=\"二、直接克隆硬盘Device-to-Device\"><a href=\"#二、直接克隆硬盘Device-to-Device\" class=\"headerlink\" title=\"二、直接克隆硬盘Device-to-Device\"></a><strong>二、直接克隆硬盘Device-to-Device</strong></h3><p>将源硬盘完整克隆到目标硬盘适合硬盘升级或快速迁移比如笔者最近白嫖了一个三星的2T硬盘直接把原来512G硬盘里的CachyOS无损迁移了进去。</p>\n<h4 id=\"步骤说明:-1\"><a href=\"#步骤说明:-1\" class=\"headerlink\" title=\"步骤说明:\"></a><strong>步骤说明</strong></h4><ol>\n<li><p><strong>准备工作</strong></p>\n<ul>\n<li>连接目标硬盘需容量≥源硬盘已用空间还原镜像操作也是如此注意Clonezilla支持小分区到大分区迁移不支持大分区到小分区后者出门右转Rsync</li>\n<li><strong>警告</strong>:目标硬盘数据将被覆盖,操作前如有需要务必备份重要数据!</li>\n</ul>\n</li>\n<li><p><strong>启动Clonezilla</strong></p>\n<ul>\n<li>同上从U盘启动进入Clonezilla界面。</li>\n</ul>\n</li>\n<li><p><strong>选择克隆模式</strong></p>\n<figure class=\"highlight plaintext\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs plaintext\">Choose mode: 选择 &quot;device-device&quot;(设备到设备)<br></code></pre></td></tr></table></figure>\n</li>\n<li><p><strong>选择硬盘</strong></p>\n<ul>\n<li><strong>母碟硬盘</strong>:选择原始硬盘(如 <code>/dev/sda</code>)。</li>\n<li><strong>目标硬盘</strong>:选择新硬盘(如 <code>/dev/sdb</code>)。</li>\n</ul>\n</li>\n<li><p><strong>克隆选项</strong><br> 需要进入专家模式才能看到,一般直接新手模式默认即可。</p>\n</li>\n<li><p><strong>执行克隆</strong></p>\n<ul>\n<li>确认提示信息后输入 <code>y</code>,等待完成。</li>\n<li>克隆结束后关机移除旧硬盘并测试新硬盘主要是查看能不能启动进入系统若能进入一般不会有问题而且一般都能进入因为Clonezilla是高精确的块对块克隆。</li>\n</ul>\n</li>\n</ol>\n<hr>\n<h3 id=\"两种模式对比:\"><a href=\"#两种模式对比:\" class=\"headerlink\" title=\"两种模式对比:\"></a><strong>两种模式对比</strong></h3><table>\n<thead>\n<tr>\n<th><strong>模式</strong></th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>备份镜像</td>\n<td>方便多机部署也可以用于留档</td>\n</tr>\n<tr>\n<td>直接克隆</td>\n<td>换硬盘快速迁移无需恢复过程</td>\n</tr>\n</tbody></table>\n<hr>\n<h3 id=\"Btrfs务必注意\"><a href=\"#Btrfs务必注意\" class=\"headerlink\" title=\"Btrfs务必注意\"></a><strong>Btrfs务必注意</strong></h3><p>对Btrfs直接进行Clonezilla克隆大概率会碰到一个边界错误这是由于Btrfs本身使用一段时间后碎片化存储导致的你需要执行<code>sudo btrfs balance start --full-balance /</code>来进行整理,但是这也算是一个风险操作要确保完整执行不能在执行时意外中断导致文件系统出错,并且在后续克隆时不能使用新手模式要进入专家模式勾选-p1支持所有文件系统但是效率降低的选项来确保顺利克隆未勾选此选项可能导致文件系统无法识别的错误其他步骤参照前文即可。</p>\n"},{"title":"Random Fortune","date":"2025-05-22T07:29:07.000Z","_content":"\nKeep peace of mind with fortune...\n\n fortune\n\nThe nice thing about standards is that there are so many of them to choose\nfrom.\n -- Andrew S. Tanenbaum\n\n fortune\n\n看蓬门秋草年年破巷疏窗细雨夜夜孤灯。\n -- 郑板桥《沁园春·恨》\n\n fortune\n\nAn alcoholic is someone you don't like who drinks as much as you do.\n -- Dylan Thomas\n\n fortune\n\nIf you put tomfoolery into a computer, nothing comes out but tomfoolery.\nBut this tomfoolery, having passed through a very expensive machine,\nis somehow ennobled and no-one dare criticise it.\n -- Pierre Gallois\n\n fortune\n\n秋色渐将晚霜信报黄花。\n -- 叶梦得《水调歌头·秋色渐将晚》\n\n fortune\n\n水精帘里颇黎枕暖香惹梦鸳鸯锦。江上柳如烟雁飞残月天。\n藕丝秋色浅人胜参差剪。双鬓隔香红玉钗头上风。\n -- 温庭筠《菩萨蛮》\n\n fortune\n\n A disciple of another sect once came to Drescher as he was eating\nhis morning meal. \"I would like to give you this personality test\", said\nthe outsider, \"because I want you to be happy.\"\n Drescher took the paper that was offered him and put it into the\ntoaster -- \"I wish the toaster to be happy too\".\n\n fortune\n\nExample is not the main thing in influencing others. It is the only thing.\n -- Albert Schweitzer\n\n fortune\n\nWe have art that we do not die of the truth.\n -- Nietzsche\n\n fortune\n\n<knghtbrd> \"Java for the COBOL Programmer\"\n<knghtbrd> who writes these things?\n<raptor> people on crack\n<raptor> and cobol programmers\n<raptor> :)\n<knghtbrd> that's redundant.\n\n fortune\n\nI was in this prematurely air conditioned supermarket and there were all\nthese aisles and there were these bathing caps you could buy that had these\nkind of Fourth of July plumes on them that were red and yellow and blue and\nI wasn't tempted to buy one but I was reminded of the fact that I had been\navoiding the beach.\n -- Lucinda Childs \"Einstein On The Beach\"\n\n fortune\n\nIt doesn't matter whether you win or lose -- until you lose.\n\n fortune\n\nTrue leadership is the art of changing a group from what it is to what\nit ought to be.\n -- Virginia Allan\n\n fortune\n\nI keep hearing and reading this nice proverb *if it ain't broke, don't fix\nit*. The latest appearance was in response to [Shlomi\nFish](http://community.livejournal.com/shlomif_tech/37969.html) suggesting\nthat some Ancient Perl code should be replaced by Modern Perl code.\n\nI am not saying that every piece of code should be rewritten every 6 months,\nbut in my understanding that sentence actually translates to *let's wait till\nit breaks and then panic*.\n\nI think people who say that sentence are afraid that the new version will\nbreak something. Sure, there is always a chance that a change introduces an\nerror, but, if we are afraid to touch the code, what will happen when later on\nwe encounter a case where it does not work? For example, if we need to use it\nin a new environment. Will we have the courage to change the code then? How\nmuch will it cost in money, time, and lost sleep?\n\nI think we have been trying to teach ourselves that we should have really good\ntest coverage of our code and then we can easily refactor it and get rid of\ntechnical debt. So why do we keep hearing that sentence?\n\n -- Gabor Szabo\n -- What does \"If it ain't broke, don't fix it.\" really mean? ( )\n\n fortune\n\nPsychoanalysis is that mental illness for which it regards itself a therapy.\n -- Karl Kraus\n\n fortune\n\nWith a rubber duck, one's never alone.\n -- \"The Hitchhiker's Guide to the Galaxy\"\n\n fortune\n\n(Presuming for the sake of argument that it's even *possible* to design\nbetter code in Perl than in C. :-)\n -- Larry Wall on core code vs. module code design\n\n fortune\n\nBut, officer, he's not drunk, I just saw his fingers twitch!\n\n fortune\n\nImbalance of power corrupts and monopoly of power corrupts absolutely.\n -- Genji\n\n fortune\n\nI want a VEGETARIAN BURRITO to go ... with EXTRA MSG!!\n\n fortune\n\n如果你不知道如何表现地高人一等找个Unix用户让他做给你看。\n -- Dilbert newsletter 3.0, 1994\n\n fortune\n\n\"The picture's pretty bleak, gentlemen... The world's climates are changing,\nthe mammals are taking over, and we all have a brain about the size of a\nwalnut.\"\n -- some dinosaurs from The Far Side, by Gary Larson\n\n fortune\n\nMost of us feel that marketing types are like a dangerous weapon - keep\n'em unloaded and locked up in a cupboard, and only bring them out when\nyou need them to do a job.\n -- Craig Sanders\n\n fortune\n\n不寐倦长更披衣出户行。月寒秋竹冷风切夜窗声。\n -- 李煜《三台令》\n\n fortune\n\n子曰“由诲女知之乎知之为知之不知为不知是知也。”\n-- 论语,为政篇\n\n fortune\n\n \"The jig's up, Elman.\"\n \"Which jig?\"\n -- Jeff Elman\n\n fortune\n\n\"First things first -- but not necessarily in that order\"\n -- The Doctor, \"Doctor Who\"\n\n fortune\n\n波影摇涟趁熏风一舸来时翠阴清昼。去郭轩楹才数里藓磴松关云岫。\n快屐齿筇枝先后。空半危亭堪聚远看洞庭缥缈争奇秀。人自老景如旧。\n来帆去棹还知否问古今几度斜阳几番回首晓色一川谁管领都付雨荷烟柳\n知我者燕朋鸥友。笑拍阑干呼范蠡甚平吴却倩垂纶手吁万古付卮酒。\n -- 周密《长亭怨慢》\n\n fortune\n\nI'm telling you that the kernel is stable not because it's a kernel,\nbut because I refuse to listen to arguments like this.\n -- Linus Torvalds\n\n fortune\n\nA girl's conscience doesn't really keep her from doing anything wrong--\nit merely keeps her from enjoying it.\n\n fortune\n\nThere are few people more often in the wrong than those who cannot endure\nto be thought so.\n\n fortune\n\nOne does not thank logic.\n -- Sarek, \"Journey to Babel\", stardate 3842.4\n\n fortune\n\nFree yourself from negative influence. Negative thoughts are the old\nhabits that gnaw at the roots of the soul.\nMoses Shongo, (Seneca)\n\n fortune\n\n日月照之何不及此惟有北风号怒天上来。\n -- 李白《北风行》\n\n fortune\n\nAnyone who is capable of getting themselves made President should on no\naccount be allowed to do the job.\n -- Douglas Adams, \"The Hitchhiker's Guide to the Galaxy\"\n\nAnd here are my mods:-)\n\n pacman -Qs fortune\nlocal/cowfortune 0.1.2-8\n Configurable fortune cookie proclaiming cow (and a few other creatures)\nlocal/fortune-mod 3.22.0-1.1\n The Fortune Cookie Program from BSD games\nlocal/fortune-mod-zh 2.98-1 (fortune-mods)\n Chinese poems for fortune-mod\n","source":"_posts/fortune.md","raw":"---\ntitle: Random fortune \ndate: 2025-05-22 15:29:07\ntags: 日志\n---\n\nKeep peace of mind with fortune...\n\n fortune\n\nThe nice thing about standards is that there are so many of them to choose\nfrom.\n -- Andrew S. Tanenbaum\n\n fortune\n\n看蓬门秋草年年破巷疏窗细雨夜夜孤灯。\n -- 郑板桥《沁园春·恨》\n\n fortune\n\nAn alcoholic is someone you don't like who drinks as much as you do.\n -- Dylan Thomas\n\n fortune\n\nIf you put tomfoolery into a computer, nothing comes out but tomfoolery.\nBut this tomfoolery, having passed through a very expensive machine,\nis somehow ennobled and no-one dare criticise it.\n -- Pierre Gallois\n\n fortune\n\n秋色渐将晚霜信报黄花。\n -- 叶梦得《水调歌头·秋色渐将晚》\n\n fortune\n\n水精帘里颇黎枕暖香惹梦鸳鸯锦。江上柳如烟雁飞残月天。\n藕丝秋色浅人胜参差剪。双鬓隔香红玉钗头上风。\n -- 温庭筠《菩萨蛮》\n\n fortune\n\n A disciple of another sect once came to Drescher as he was eating\nhis morning meal. \"I would like to give you this personality test\", said\nthe outsider, \"because I want you to be happy.\"\n Drescher took the paper that was offered him and put it into the\ntoaster -- \"I wish the toaster to be happy too\".\n\n fortune\n\nExample is not the main thing in influencing others. It is the only thing.\n -- Albert Schweitzer\n\n fortune\n\nWe have art that we do not die of the truth.\n -- Nietzsche\n\n fortune\n\n<knghtbrd> \"Java for the COBOL Programmer\"\n<knghtbrd> who writes these things?\n<raptor> people on crack\n<raptor> and cobol programmers\n<raptor> :)\n<knghtbrd> that's redundant.\n\n fortune\n\nI was in this prematurely air conditioned supermarket and there were all\nthese aisles and there were these bathing caps you could buy that had these\nkind of Fourth of July plumes on them that were red and yellow and blue and\nI wasn't tempted to buy one but I was reminded of the fact that I had been\navoiding the beach.\n -- Lucinda Childs \"Einstein On The Beach\"\n\n fortune\n\nIt doesn't matter whether you win or lose -- until you lose.\n\n fortune\n\nTrue leadership is the art of changing a group from what it is to what\nit ought to be.\n -- Virginia Allan\n\n fortune\n\nI keep hearing and reading this nice proverb *if it ain't broke, don't fix\nit*. The latest appearance was in response to [Shlomi\nFish](http://community.livejournal.com/shlomif_tech/37969.html) suggesting\nthat some Ancient Perl code should be replaced by Modern Perl code.\n\nI am not saying that every piece of code should be rewritten every 6 months,\nbut in my understanding that sentence actually translates to *let's wait till\nit breaks and then panic*.\n\nI think people who say that sentence are afraid that the new version will\nbreak something. Sure, there is always a chance that a change introduces an\nerror, but, if we are afraid to touch the code, what will happen when later on\nwe encounter a case where it does not work? For example, if we need to use it\nin a new environment. Will we have the courage to change the code then? How\nmuch will it cost in money, time, and lost sleep?\n\nI think we have been trying to teach ourselves that we should have really good\ntest coverage of our code and then we can easily refactor it and get rid of\ntechnical debt. So why do we keep hearing that sentence?\n\n -- Gabor Szabo\n -- What does \"If it ain't broke, don't fix it.\" really mean? ( )\n\n fortune\n\nPsychoanalysis is that mental illness for which it regards itself a therapy.\n -- Karl Kraus\n\n fortune\n\nWith a rubber duck, one's never alone.\n -- \"The Hitchhiker's Guide to the Galaxy\"\n\n fortune\n\n(Presuming for the sake of argument that it's even *possible* to design\nbetter code in Perl than in C. :-)\n -- Larry Wall on core code vs. module code design\n\n fortune\n\nBut, officer, he's not drunk, I just saw his fingers twitch!\n\n fortune\n\nImbalance of power corrupts and monopoly of power corrupts absolutely.\n -- Genji\n\n fortune\n\nI want a VEGETARIAN BURRITO to go ... with EXTRA MSG!!\n\n fortune\n\n如果你不知道如何表现地高人一等找个Unix用户让他做给你看。\n -- Dilbert newsletter 3.0, 1994\n\n fortune\n\n\"The picture's pretty bleak, gentlemen... The world's climates are changing,\nthe mammals are taking over, and we all have a brain about the size of a\nwalnut.\"\n -- some dinosaurs from The Far Side, by Gary Larson\n\n fortune\n\nMost of us feel that marketing types are like a dangerous weapon - keep\n'em unloaded and locked up in a cupboard, and only bring them out when\nyou need them to do a job.\n -- Craig Sanders\n\n fortune\n\n不寐倦长更披衣出户行。月寒秋竹冷风切夜窗声。\n -- 李煜《三台令》\n\n fortune\n\n子曰“由诲女知之乎知之为知之不知为不知是知也。”\n-- 论语,为政篇\n\n fortune\n\n \"The jig's up, Elman.\"\n \"Which jig?\"\n -- Jeff Elman\n\n fortune\n\n\"First things first -- but not necessarily in that order\"\n -- The Doctor, \"Doctor Who\"\n\n fortune\n\n波影摇涟趁熏风一舸来时翠阴清昼。去郭轩楹才数里藓磴松关云岫。\n快屐齿筇枝先后。空半危亭堪聚远看洞庭缥缈争奇秀。人自老景如旧。\n来帆去棹还知否问古今几度斜阳几番回首晓色一川谁管领都付雨荷烟柳\n知我者燕朋鸥友。笑拍阑干呼范蠡甚平吴却倩垂纶手吁万古付卮酒。\n -- 周密《长亭怨慢》\n\n fortune\n\nI'm telling you that the kernel is stable not because it's a kernel,\nbut because I refuse to listen to arguments like this.\n -- Linus Torvalds\n\n fortune\n\nA girl's conscience doesn't really keep her from doing anything wrong--\nit merely keeps her from enjoying it.\n\n fortune\n\nThere are few people more often in the wrong than those who cannot endure\nto be thought so.\n\n fortune\n\nOne does not thank logic.\n -- Sarek, \"Journey to Babel\", stardate 3842.4\n\n fortune\n\nFree yourself from negative influence. Negative thoughts are the old\nhabits that gnaw at the roots of the soul.\nMoses Shongo, (Seneca)\n\n fortune\n\n日月照之何不及此惟有北风号怒天上来。\n -- 李白《北风行》\n\n fortune\n\nAnyone who is capable of getting themselves made President should on no\naccount be allowed to do the job.\n -- Douglas Adams, \"The Hitchhiker's Guide to the Galaxy\"\n\nAnd here are my mods:-)\n\n pacman -Qs fortune\nlocal/cowfortune 0.1.2-8\n Configurable fortune cookie proclaiming cow (and a few other creatures)\nlocal/fortune-mod 3.22.0-1.1\n The Fortune Cookie Program from BSD games\nlocal/fortune-mod-zh 2.98-1 (fortune-mods)\n Chinese poems for fortune-mod\n","slug":"fortune","published":1,"updated":"2025-05-22T07:41:08.523Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescv0013og2b3dh6h5cd","content":"<p>Keep peace of mind with fortune…</p>\n<p> fortune</p>\n<p>The nice thing about standards is that there are so many of them to choose<br>from.<br> Andrew S. Tanenbaum</p>\n<p> fortune</p>\n<p>看蓬门秋草,年年破巷,疏窗细雨,夜夜孤灯。<br> 郑板桥《沁园春·恨》</p>\n<p> fortune</p>\n<p>An alcoholic is someone you dont like who drinks as much as you do.<br> Dylan Thomas</p>\n<p> fortune</p>\n<p>If you put tomfoolery into a computer, nothing comes out but tomfoolery.<br>But this tomfoolery, having passed through a very expensive machine,<br>is somehow ennobled and no-one dare criticise it.<br> Pierre Gallois</p>\n<p> fortune</p>\n<p>秋色渐将晚,霜信报黄花。<br> 叶梦得《水调歌头·秋色渐将晚》</p>\n<p> fortune</p>\n<p>水精帘里颇黎枕,暖香惹梦鸳鸯锦。江上柳如烟,雁飞残月天。<br>藕丝秋色浅,人胜参差剪。双鬓隔香红,玉钗头上风。<br> 温庭筠《菩萨蛮》</p>\n<p> fortune</p>\n<pre><code class=\"hljs\"> A disciple of another sect once came to Drescher as he was eating\n</code></pre>\n<p>his morning meal. “I would like to give you this personality test”, said<br>the outsider, “because I want you to be happy.”<br> Drescher took the paper that was offered him and put it into the<br>toaster “I wish the toaster to be happy too”.</p>\n<p> fortune</p>\n<p>Example is not the main thing in influencing others. It is the only thing.<br> Albert Schweitzer</p>\n<p> fortune</p>\n<p>We have art that we do not die of the truth.<br> Nietzsche</p>\n<p> fortune</p>\n<p><knghtbrd> “Java for the COBOL Programmer”<br><knghtbrd> who writes these things?<br><raptor> people on crack<br><raptor> and cobol programmers<br><raptor> :)<br><knghtbrd> thats redundant.</p>\n<p> fortune</p>\n<p>I was in this prematurely air conditioned supermarket and there were all<br>these aisles and there were these bathing caps you could buy that had these<br>kind of Fourth of July plumes on them that were red and yellow and blue and<br>I wasnt tempted to buy one but I was reminded of the fact that I had been<br>avoiding the beach.<br> Lucinda Childs “Einstein On The Beach”</p>\n<p> fortune</p>\n<p>It doesnt matter whether you win or lose until you lose.</p>\n<p> fortune</p>\n<p>True leadership is the art of changing a group from what it is to what<br>it ought to be.<br> Virginia Allan</p>\n<p> fortune</p>\n<p>I keep hearing and reading this nice proverb <em>if it aint broke, dont fix<br>it</em>. The latest appearance was in response to <a href=\"http://community.livejournal.com/shlomif_tech/37969.html\">Shlomi<br>Fish</a> suggesting<br>that some Ancient Perl code should be replaced by Modern Perl code.</p>\n<p>I am not saying that every piece of code should be rewritten every 6 months,<br>but in my understanding that sentence actually translates to <em>lets wait till<br>it breaks and then panic</em>.</p>\n<p>I think people who say that sentence are afraid that the new version will<br>break something. Sure, there is always a chance that a change introduces an<br>error, but, if we are afraid to touch the code, what will happen when later on<br>we encounter a case where it does not work? For example, if we need to use it<br>in a new environment. Will we have the courage to change the code then? How<br>much will it cost in money, time, and lost sleep?</p>\n<p>I think we have been trying to teach ourselves that we should have really good<br>test coverage of our code and then we can easily refactor it and get rid of<br>technical debt. So why do we keep hearing that sentence?</p>\n<pre><code class=\"hljs\">-- Gabor Szabo\n-- What does &quot;If it ain&#39;t broke, don&#39;t fix it.&quot; really mean? ( )\n</code></pre>\n<p> fortune</p>\n<p>Psychoanalysis is that mental illness for which it regards itself a therapy.<br> Karl Kraus</p>\n<p> fortune</p>\n<p>With a rubber duck, ones never alone.<br> “The Hitchhikers Guide to the Galaxy”</p>\n<p> fortune</p>\n<p>(Presuming for the sake of argument that its even <em>possible</em> to design<br>better code in Perl than in C. :-)<br> Larry Wall on core code vs. module code design</p>\n<p> fortune</p>\n<p>But, officer, hes not drunk, I just saw his fingers twitch!</p>\n<p> fortune</p>\n<p>Imbalance of power corrupts and monopoly of power corrupts absolutely.<br> Genji</p>\n<p> fortune</p>\n<p>I want a VEGETARIAN BURRITO to go … with EXTRA MSG!!</p>\n<p> fortune</p>\n<p>如果你不知道如何表现地高人一等找个Unix用户让他做给你看。<br> Dilbert newsletter 3.0, 1994</p>\n<p> fortune</p>\n<p>“The pictures pretty bleak, gentlemen… The worlds climates are changing,<br>the mammals are taking over, and we all have a brain about the size of a<br>walnut.”<br> some dinosaurs from The Far Side, by Gary Larson</p>\n<p> fortune</p>\n<p>Most of us feel that marketing types are like a dangerous weapon - keep<br>em unloaded and locked up in a cupboard, and only bring them out when<br>you need them to do a job.<br> Craig Sanders</p>\n<p> fortune</p>\n<p>不寐倦长更,披衣出户行。月寒秋竹冷,风切夜窗声。<br> 李煜《三台令》</p>\n<p> fortune</p>\n<p>子曰:“由,诲女知之乎!知之为知之,不知为不知,是知也。”<br> 论语,为政篇</p>\n<p> fortune</p>\n<pre><code class=\"hljs\"> &quot;The jig&#39;s up, Elman.&quot;\n &quot;Which jig?&quot;\n -- Jeff Elman\n</code></pre>\n<p> fortune</p>\n<p>“First things first but not necessarily in that order”<br> The Doctor, “Doctor Who”</p>\n<p> fortune</p>\n<p>波影摇涟,趁熏风,一舸来时,翠阴清昼。去郭轩楹才数里,藓磴松关云岫。<br>快屐齿,筇枝先后。空半危亭堪聚远,看洞庭,缥缈争奇秀。人自老,景如旧。<br>来帆去棹还知否,问古今,几度斜阳,几番回首?晓色一川谁管领,都付雨荷烟柳,<br>知我者,燕朋鸥友。笑拍阑干呼范蠡,甚平吴,却倩垂纶手?吁万古,付卮酒。<br> 周密《长亭怨慢》</p>\n<p> fortune</p>\n<p>Im telling you that the kernel is stable not because its a kernel,<br>but because I refuse to listen to arguments like this.<br> Linus Torvalds</p>\n<p> fortune</p>\n<p>A girls conscience doesnt really keep her from doing anything wrong<br>it merely keeps her from enjoying it.</p>\n<p> fortune</p>\n<p>There are few people more often in the wrong than those who cannot endure<br>to be thought so.</p>\n<p> fortune</p>\n<p>One does not thank logic.<br> Sarek, “Journey to Babel”, stardate 3842.4</p>\n<p> fortune</p>\n<p>Free yourself from negative influence. Negative thoughts are the old<br>habits that gnaw at the roots of the soul.<br>Moses Shongo, (Seneca)</p>\n<p> fortune</p>\n<p>日月照之何不及此?惟有北风号怒天上来。<br> 李白《北风行》</p>\n<p> fortune</p>\n<p>Anyone who is capable of getting themselves made President should on no<br>account be allowed to do the job.<br> Douglas Adams, “The Hitchhikers Guide to the Galaxy”</p>\n<p>And here are my mods:-)</p>\n<p> pacman -Qs fortune<br>local&#x2F;cowfortune 0.1.2-8<br> Configurable fortune cookie proclaiming cow (and a few other creatures)<br>local&#x2F;fortune-mod 3.22.0-1.1<br> The Fortune Cookie Program from BSD games<br>local&#x2F;fortune-mod-zh 2.98-1 (fortune-mods)<br> Chinese poems for fortune-mod</p>\n","excerpt":"","more":"<p>Keep peace of mind with fortune…</p>\n<p> fortune</p>\n<p>The nice thing about standards is that there are so many of them to choose<br>from.<br> Andrew S. Tanenbaum</p>\n<p> fortune</p>\n<p>看蓬门秋草,年年破巷,疏窗细雨,夜夜孤灯。<br> 郑板桥《沁园春·恨》</p>\n<p> fortune</p>\n<p>An alcoholic is someone you dont like who drinks as much as you do.<br> Dylan Thomas</p>\n<p> fortune</p>\n<p>If you put tomfoolery into a computer, nothing comes out but tomfoolery.<br>But this tomfoolery, having passed through a very expensive machine,<br>is somehow ennobled and no-one dare criticise it.<br> Pierre Gallois</p>\n<p> fortune</p>\n<p>秋色渐将晚,霜信报黄花。<br> 叶梦得《水调歌头·秋色渐将晚》</p>\n<p> fortune</p>\n<p>水精帘里颇黎枕,暖香惹梦鸳鸯锦。江上柳如烟,雁飞残月天。<br>藕丝秋色浅,人胜参差剪。双鬓隔香红,玉钗头上风。<br> 温庭筠《菩萨蛮》</p>\n<p> fortune</p>\n<pre><code> A disciple of another sect once came to Drescher as he was eating\n</code></pre>\n<p>his morning meal. “I would like to give you this personality test”, said<br>the outsider, “because I want you to be happy.”<br> Drescher took the paper that was offered him and put it into the<br>toaster “I wish the toaster to be happy too”.</p>\n<p> fortune</p>\n<p>Example is not the main thing in influencing others. It is the only thing.<br> Albert Schweitzer</p>\n<p> fortune</p>\n<p>We have art that we do not die of the truth.<br> Nietzsche</p>\n<p> fortune</p>\n<p><knghtbrd> “Java for the COBOL Programmer”<br><knghtbrd> who writes these things?<br><raptor> people on crack<br><raptor> and cobol programmers<br><raptor> :)<br><knghtbrd> thats redundant.</p>\n<p> fortune</p>\n<p>I was in this prematurely air conditioned supermarket and there were all<br>these aisles and there were these bathing caps you could buy that had these<br>kind of Fourth of July plumes on them that were red and yellow and blue and<br>I wasnt tempted to buy one but I was reminded of the fact that I had been<br>avoiding the beach.<br> Lucinda Childs “Einstein On The Beach”</p>\n<p> fortune</p>\n<p>It doesnt matter whether you win or lose until you lose.</p>\n<p> fortune</p>\n<p>True leadership is the art of changing a group from what it is to what<br>it ought to be.<br> Virginia Allan</p>\n<p> fortune</p>\n<p>I keep hearing and reading this nice proverb <em>if it aint broke, dont fix<br>it</em>. The latest appearance was in response to <a href=\"http://community.livejournal.com/shlomif_tech/37969.html\">Shlomi<br>Fish</a> suggesting<br>that some Ancient Perl code should be replaced by Modern Perl code.</p>\n<p>I am not saying that every piece of code should be rewritten every 6 months,<br>but in my understanding that sentence actually translates to <em>lets wait till<br>it breaks and then panic</em>.</p>\n<p>I think people who say that sentence are afraid that the new version will<br>break something. Sure, there is always a chance that a change introduces an<br>error, but, if we are afraid to touch the code, what will happen when later on<br>we encounter a case where it does not work? For example, if we need to use it<br>in a new environment. Will we have the courage to change the code then? How<br>much will it cost in money, time, and lost sleep?</p>\n<p>I think we have been trying to teach ourselves that we should have really good<br>test coverage of our code and then we can easily refactor it and get rid of<br>technical debt. So why do we keep hearing that sentence?</p>\n<pre><code>-- Gabor Szabo\n-- What does &quot;If it ain&#39;t broke, don&#39;t fix it.&quot; really mean? ( )\n</code></pre>\n<p> fortune</p>\n<p>Psychoanalysis is that mental illness for which it regards itself a therapy.<br> Karl Kraus</p>\n<p> fortune</p>\n<p>With a rubber duck, ones never alone.<br> “The Hitchhikers Guide to the Galaxy”</p>\n<p> fortune</p>\n<p>(Presuming for the sake of argument that its even <em>possible</em> to design<br>better code in Perl than in C. :-)<br> Larry Wall on core code vs. module code design</p>\n<p> fortune</p>\n<p>But, officer, hes not drunk, I just saw his fingers twitch!</p>\n<p> fortune</p>\n<p>Imbalance of power corrupts and monopoly of power corrupts absolutely.<br> Genji</p>\n<p> fortune</p>\n<p>I want a VEGETARIAN BURRITO to go … with EXTRA MSG!!</p>\n<p> fortune</p>\n<p>如果你不知道如何表现地高人一等找个Unix用户让他做给你看。<br> Dilbert newsletter 3.0, 1994</p>\n<p> fortune</p>\n<p>“The pictures pretty bleak, gentlemen… The worlds climates are changing,<br>the mammals are taking over, and we all have a brain about the size of a<br>walnut.”<br> some dinosaurs from The Far Side, by Gary Larson</p>\n<p> fortune</p>\n<p>Most of us feel that marketing types are like a dangerous weapon - keep<br>em unloaded and locked up in a cupboard, and only bring them out when<br>you need them to do a job.<br> Craig Sanders</p>\n<p> fortune</p>\n<p>不寐倦长更,披衣出户行。月寒秋竹冷,风切夜窗声。<br> 李煜《三台令》</p>\n<p> fortune</p>\n<p>子曰:“由,诲女知之乎!知之为知之,不知为不知,是知也。”<br> 论语,为政篇</p>\n<p> fortune</p>\n<pre><code> &quot;The jig&#39;s up, Elman.&quot;\n &quot;Which jig?&quot;\n -- Jeff Elman\n</code></pre>\n<p> fortune</p>\n<p>“First things first but not necessarily in that order”<br> The Doctor, “Doctor Who”</p>\n<p> fortune</p>\n<p>波影摇涟,趁熏风,一舸来时,翠阴清昼。去郭轩楹才数里,藓磴松关云岫。<br>快屐齿,筇枝先后。空半危亭堪聚远,看洞庭,缥缈争奇秀。人自老,景如旧。<br>来帆去棹还知否,问古今,几度斜阳,几番回首?晓色一川谁管领,都付雨荷烟柳,<br>知我者,燕朋鸥友。笑拍阑干呼范蠡,甚平吴,却倩垂纶手?吁万古,付卮酒。<br> 周密《长亭怨慢》</p>\n<p> fortune</p>\n<p>Im telling you that the kernel is stable not because its a kernel,<br>but because I refuse to listen to arguments like this.<br> Linus Torvalds</p>\n<p> fortune</p>\n<p>A girls conscience doesnt really keep her from doing anything wrong<br>it merely keeps her from enjoying it.</p>\n<p> fortune</p>\n<p>There are few people more often in the wrong than those who cannot endure<br>to be thought so.</p>\n<p> fortune</p>\n<p>One does not thank logic.<br> Sarek, “Journey to Babel”, stardate 3842.4</p>\n<p> fortune</p>\n<p>Free yourself from negative influence. Negative thoughts are the old<br>habits that gnaw at the roots of the soul.<br>Moses Shongo, (Seneca)</p>\n<p> fortune</p>\n<p>日月照之何不及此?惟有北风号怒天上来。<br> 李白《北风行》</p>\n<p> fortune</p>\n<p>Anyone who is capable of getting themselves made President should on no<br>account be allowed to do the job.<br> Douglas Adams, “The Hitchhikers Guide to the Galaxy”</p>\n<p>And here are my mods:-)</p>\n<p> pacman -Qs fortune<br>local&#x2F;cowfortune 0.1.2-8<br> Configurable fortune cookie proclaiming cow (and a few other creatures)<br>local&#x2F;fortune-mod 3.22.0-1.1<br> The Fortune Cookie Program from BSD games<br>local&#x2F;fortune-mod-zh 2.98-1 (fortune-mods)<br> Chinese poems for fortune-mod</p>\n"},{"title":"GCC15 函数指针类型检查可能导致编译错误","date":"2025-05-23T13:49:02.000Z","_content":"\n今天准备继续做一下OS课的实验实验代码当然是基于著名的xv6项目意外地发现原本明明正常运行的系统再次构建时却失败了具体报错如下\n\n```GCC\nuser/usertests.c:2598:4: error: initialization of 'void (*)(char *)' from incompatible pointer type 'void (*)(void)' [-Wincompatible-pointer-types]\n 2598 | {rwsbrk, \"rwsbrk\" },\n | ^~~~~~\nuser/usertests.c:2598:4: note: (near initialization for 'quicktests[5].f')\nuser/usertests.c:247:1: note: 'rwsbrk' declared here\n 247 | rwsbrk()\n | ^~~~~~\nmake: *** [<内置>user/usertests.o] 错误 1\n\n```\n而具体定位到的代码则是\n```C\nstruct test {\n void (*f)(char *);\n char *s;\n} quicktests[] = {\n {copyin, \"copyin\"},\n {copyout, \"copyout\"},\n {copyinstr1, \"copyinstr1\"},\n {copyinstr2, \"copyinstr2\"},\n {copyinstr3, \"copyinstr3\"},\n {rwsbrk, \"rwsbrk\" },\n ...\n { 0, 0},\n};\n// See if the kernel refuses to read/write user memory that the\n// application doesn't have anymore, because it returned it.\nvoid\nrwsbrk()\n{\n int fd, n;\n \n uint64 a = (uint64) sbrk(8192);\n\n if(a == 0xffffffffffffffffLL) {\n printf(\"sbrk(rwsbrk) failed\\n\");\n exit(1);\n }\n ...\n exit(0);\n}\n```\n\n这段代码定义了一个函数指针数组其中每个元素都指向一个函数和它的名称。结构体期望的函数签名是 `void(*)(char*)`,但传入的是一个没有参数的函数 `void(*)(void)`,这会导致函数指针类型不匹配。\n\n但是之前明明是没有问题的怎么现在突然出错呢仔细一想立刻就怀疑是之前arch更新的时候把gcc升上去导致的结果查了下大概确实是这样。\n\n- 在 **GCC 14 及之前版本**,这类赋值虽然不符合 C 标准,但 GCC 作为扩展允许这种行为。\n- 从 **GCC 15 开始**,这类隐式转换默认触发编译错误或警告(取决于编译器配置),因为 GCC 变得更加严格地遵循标准 C 的函数指针类型规则。\n\n这并不是 xv6 本身的 bug而是 GCC 编译器对语言规范支持的更新带来的兼容性问题。解决方法倒是简单,直接给`rwsbrk`函数添加参数改为`void rwsbrk(char* arg)`即可解决强制类型转换也是一种办法。这次事件再次告诉我们什么都升到最新并不是什么好事情arch用户总是要花时间处理一些莫名其妙的兼容性问题:-)\n\n\n","source":"_posts/gcc15restrict.md","raw":"---\ntitle: GCC15 函数指针类型检查可能导致编译错误\ndate: 2025-05-23 21:49:02\ntags: 技术\n---\n\n今天准备继续做一下OS课的实验实验代码当然是基于著名的xv6项目意外地发现原本明明正常运行的系统再次构建时却失败了具体报错如下\n\n```GCC\nuser/usertests.c:2598:4: error: initialization of 'void (*)(char *)' from incompatible pointer type 'void (*)(void)' [-Wincompatible-pointer-types]\n 2598 | {rwsbrk, \"rwsbrk\" },\n | ^~~~~~\nuser/usertests.c:2598:4: note: (near initialization for 'quicktests[5].f')\nuser/usertests.c:247:1: note: 'rwsbrk' declared here\n 247 | rwsbrk()\n | ^~~~~~\nmake: *** [<内置>user/usertests.o] 错误 1\n\n```\n而具体定位到的代码则是\n```C\nstruct test {\n void (*f)(char *);\n char *s;\n} quicktests[] = {\n {copyin, \"copyin\"},\n {copyout, \"copyout\"},\n {copyinstr1, \"copyinstr1\"},\n {copyinstr2, \"copyinstr2\"},\n {copyinstr3, \"copyinstr3\"},\n {rwsbrk, \"rwsbrk\" },\n ...\n { 0, 0},\n};\n// See if the kernel refuses to read/write user memory that the\n// application doesn't have anymore, because it returned it.\nvoid\nrwsbrk()\n{\n int fd, n;\n \n uint64 a = (uint64) sbrk(8192);\n\n if(a == 0xffffffffffffffffLL) {\n printf(\"sbrk(rwsbrk) failed\\n\");\n exit(1);\n }\n ...\n exit(0);\n}\n```\n\n这段代码定义了一个函数指针数组其中每个元素都指向一个函数和它的名称。结构体期望的函数签名是 `void(*)(char*)`,但传入的是一个没有参数的函数 `void(*)(void)`,这会导致函数指针类型不匹配。\n\n但是之前明明是没有问题的怎么现在突然出错呢仔细一想立刻就怀疑是之前arch更新的时候把gcc升上去导致的结果查了下大概确实是这样。\n\n- 在 **GCC 14 及之前版本**,这类赋值虽然不符合 C 标准,但 GCC 作为扩展允许这种行为。\n- 从 **GCC 15 开始**,这类隐式转换默认触发编译错误或警告(取决于编译器配置),因为 GCC 变得更加严格地遵循标准 C 的函数指针类型规则。\n\n这并不是 xv6 本身的 bug而是 GCC 编译器对语言规范支持的更新带来的兼容性问题。解决方法倒是简单,直接给`rwsbrk`函数添加参数改为`void rwsbrk(char* arg)`即可解决强制类型转换也是一种办法。这次事件再次告诉我们什么都升到最新并不是什么好事情arch用户总是要花时间处理一些莫名其妙的兼容性问题:-)\n\n\n","slug":"gcc15restrict","published":1,"updated":"2025-05-23T14:01:33.929Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescv0015og2b22v2elt6","content":"<p>今天准备继续做一下OS课的实验实验代码当然是基于著名的xv6项目意外地发现原本明明正常运行的系统再次构建时却失败了具体报错如下</p>\n<figure class=\"highlight plaintext\"><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><code class=\"hljs GCC\">user/usertests.c:2598:4: error: initialization of &#x27;void (*)(char *)&#x27; from incompatible pointer type &#x27;void (*)(void)&#x27; [-Wincompatible-pointer-types]<br> 2598 | &#123;rwsbrk, &quot;rwsbrk&quot; &#125;,<br> | ^~~~~~<br>user/usertests.c:2598:4: note: (near initialization for &#x27;quicktests[5].f&#x27;)<br>user/usertests.c:247:1: note: &#x27;rwsbrk&#x27; declared here<br> 247 | rwsbrk()<br> | ^~~~~~<br>make: *** [&lt;内置&gt;user/usertests.o] 错误 1<br><br></code></pre></td></tr></table></figure>\n<p>而具体定位到的代码则是:</p>\n<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><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></pre></td><td class=\"code\"><pre><code class=\"hljs C\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs-title\">test</span> &#123;</span><br> <span class=\"hljs-type\">void</span> (*f)(<span class=\"hljs-type\">char</span> *);<br> <span class=\"hljs-type\">char</span> *s;<br>&#125; quicktests[] = &#123;<br> &#123;copyin, <span class=\"hljs-string\">&quot;copyin&quot;</span>&#125;,<br> &#123;copyout, <span class=\"hljs-string\">&quot;copyout&quot;</span>&#125;,<br> &#123;copyinstr1, <span class=\"hljs-string\">&quot;copyinstr1&quot;</span>&#125;,<br> &#123;copyinstr2, <span class=\"hljs-string\">&quot;copyinstr2&quot;</span>&#125;,<br> &#123;copyinstr3, <span class=\"hljs-string\">&quot;copyinstr3&quot;</span>&#125;,<br> &#123;rwsbrk, <span class=\"hljs-string\">&quot;rwsbrk&quot;</span> &#125;,<br> ...<br> &#123; <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>&#125;,<br>&#125;;<br><span class=\"hljs-comment\">// See if the kernel refuses to read/write user memory that the</span><br><span class=\"hljs-comment\">// application doesn&#x27;t have anymore, because it returned it.</span><br><span class=\"hljs-type\">void</span><br><span class=\"hljs-title function_\">rwsbrk</span><span class=\"hljs-params\">()</span><br>&#123;<br> <span class=\"hljs-type\">int</span> fd, n;<br> <br> uint64 a = (uint64) sbrk(<span class=\"hljs-number\">8192</span>);<br><br> <span class=\"hljs-keyword\">if</span>(a == <span class=\"hljs-number\">0xffffffffffffffff</span>LL) &#123;<br> <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">&quot;sbrk(rwsbrk) failed\\n&quot;</span>);<br> <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">1</span>);<br> &#125;<br> ...<br> <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">0</span>);<br>&#125;<br></code></pre></td></tr></table></figure>\n\n<p>这段代码定义了一个函数指针数组,其中每个元素都指向一个函数和它的名称。结构体期望的函数签名是 <code>void(*)(char*)</code>,但传入的是一个没有参数的函数 <code>void(*)(void)</code>,这会导致函数指针类型不匹配。</p>\n<p>但是之前明明是没有问题的怎么现在突然出错呢仔细一想立刻就怀疑是之前arch更新的时候把gcc升上去导致的结果查了下大概确实是这样。</p>\n<ul>\n<li>在 <strong>GCC 14 及之前版本</strong>,这类赋值虽然不符合 C 标准,但 GCC 作为扩展允许这种行为。</li>\n<li>从 <strong>GCC 15 开始</strong>,这类隐式转换默认触发编译错误或警告(取决于编译器配置),因为 GCC 变得更加严格地遵循标准 C 的函数指针类型规则。</li>\n</ul>\n<p>这并不是 xv6 本身的 bug而是 GCC 编译器对语言规范支持的更新带来的兼容性问题。解决方法倒是简单,直接给<code>rwsbrk</code>函数添加参数改为<code>void rwsbrk(char* arg)</code>即可解决强制类型转换也是一种办法。这次事件再次告诉我们什么都升到最新并不是什么好事情arch用户总是要花时间处理一些莫名其妙的兼容性问题:-)</p>\n","excerpt":"","more":"<p>今天准备继续做一下OS课的实验实验代码当然是基于著名的xv6项目意外地发现原本明明正常运行的系统再次构建时却失败了具体报错如下</p>\n<figure class=\"highlight plaintext\"><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><code class=\"hljs GCC\">user/usertests.c:2598:4: error: initialization of &#x27;void (*)(char *)&#x27; from incompatible pointer type &#x27;void (*)(void)&#x27; [-Wincompatible-pointer-types]<br> 2598 | &#123;rwsbrk, &quot;rwsbrk&quot; &#125;,<br> | ^~~~~~<br>user/usertests.c:2598:4: note: (near initialization for &#x27;quicktests[5].f&#x27;)<br>user/usertests.c:247:1: note: &#x27;rwsbrk&#x27; declared here<br> 247 | rwsbrk()<br> | ^~~~~~<br>make: *** [&lt;内置&gt;user/usertests.o] 错误 1<br><br></code></pre></td></tr></table></figure>\n<p>而具体定位到的代码则是:</p>\n<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><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></pre></td><td class=\"code\"><pre><code class=\"hljs C\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs-title\">test</span> &#123;</span><br> <span class=\"hljs-type\">void</span> (*f)(<span class=\"hljs-type\">char</span> *);<br> <span class=\"hljs-type\">char</span> *s;<br>&#125; quicktests[] = &#123;<br> &#123;copyin, <span class=\"hljs-string\">&quot;copyin&quot;</span>&#125;,<br> &#123;copyout, <span class=\"hljs-string\">&quot;copyout&quot;</span>&#125;,<br> &#123;copyinstr1, <span class=\"hljs-string\">&quot;copyinstr1&quot;</span>&#125;,<br> &#123;copyinstr2, <span class=\"hljs-string\">&quot;copyinstr2&quot;</span>&#125;,<br> &#123;copyinstr3, <span class=\"hljs-string\">&quot;copyinstr3&quot;</span>&#125;,<br> &#123;rwsbrk, <span class=\"hljs-string\">&quot;rwsbrk&quot;</span> &#125;,<br> ...<br> &#123; <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>&#125;,<br>&#125;;<br><span class=\"hljs-comment\">// See if the kernel refuses to read/write user memory that the</span><br><span class=\"hljs-comment\">// application doesn&#x27;t have anymore, because it returned it.</span><br><span class=\"hljs-type\">void</span><br><span class=\"hljs-title function_\">rwsbrk</span><span class=\"hljs-params\">()</span><br>&#123;<br> <span class=\"hljs-type\">int</span> fd, n;<br> <br> uint64 a = (uint64) sbrk(<span class=\"hljs-number\">8192</span>);<br><br> <span class=\"hljs-keyword\">if</span>(a == <span class=\"hljs-number\">0xffffffffffffffff</span>LL) &#123;<br> <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">&quot;sbrk(rwsbrk) failed\\n&quot;</span>);<br> <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">1</span>);<br> &#125;<br> ...<br> <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">0</span>);<br>&#125;<br></code></pre></td></tr></table></figure>\n\n<p>这段代码定义了一个函数指针数组,其中每个元素都指向一个函数和它的名称。结构体期望的函数签名是 <code>void(*)(char*)</code>,但传入的是一个没有参数的函数 <code>void(*)(void)</code>,这会导致函数指针类型不匹配。</p>\n<p>但是之前明明是没有问题的怎么现在突然出错呢仔细一想立刻就怀疑是之前arch更新的时候把gcc升上去导致的结果查了下大概确实是这样。</p>\n<ul>\n<li>在 <strong>GCC 14 及之前版本</strong>,这类赋值虽然不符合 C 标准,但 GCC 作为扩展允许这种行为。</li>\n<li>从 <strong>GCC 15 开始</strong>,这类隐式转换默认触发编译错误或警告(取决于编译器配置),因为 GCC 变得更加严格地遵循标准 C 的函数指针类型规则。</li>\n</ul>\n<p>这并不是 xv6 本身的 bug而是 GCC 编译器对语言规范支持的更新带来的兼容性问题。解决方法倒是简单,直接给<code>rwsbrk</code>函数添加参数改为<code>void rwsbrk(char* arg)</code>即可解决强制类型转换也是一种办法。这次事件再次告诉我们什么都升到最新并不是什么好事情arch用户总是要花时间处理一些莫名其妙的兼容性问题:-)</p>\n"},{"title":"Krita 为什么是神?","date":"2025-07-13T11:46:39.000Z","_content":"\n![神的官网](/images/krita-official.png)\n\n在谈论这个问题之前我想先说说其他软件相较于 [Krita](https://krita.org/en/) 究竟差在了哪里。\n\n---\n\n### 首先是犯下傲慢之罪的 Adobe Photoshop\n\n依靠其在商业设计领域的绝对霸主地位赢来的市场却不愿真正听取数字绘画创作者的声音这种傲慢的软件注定无法触及绘画的灵魂。事实也是如此因为高昂的订阅费用和臃肿的体量以及对触摸屏设备支持的迟滞Photoshop 在许多数字画师心中的地位一直在走下坡路,最终沦为商业生产的工具而非艺术创作的乐园。与之相比,**神** 就很谦卑,它免费开源,轻巧灵活,全平台支持,即便在某些方面为了兼容性和稳定性而做出妥协,那也是 **神** 留给凡人的慈悲。**神** 不是不能做到像 PS 那样无所不能,只是不想通过太完美的表现让“友商”绝望所以故意不用。可笑有些人不理解 **神** 的良苦用心,竟然还用其某些非核心功能上的不足来讥讽 **神**,我劝你们好自为之。\n\n---\n\n### 然后是犯下愤怒之罪的 GIMP\n\n因为 **神** 在数字绘画领域的崛起GIMP 就一直对神记恨在心,甚至固守其“万能”的图像处理定位,对绘画功能上的迭代迟迟不肯投入资源。这无疑违背了 **神** 在《新约》中的一句话:“**Krita** 只为创作者而生!”**神** 当然也不能容忍其他开源软件对绘画创作的敷衍,于是 **神** 出动了它的“代码大军”降下了神罚GIMP 在绘画圈的风评一蹶不振即便有诸多插件以及强势归来的3.0大版本更新也无法挽回其作为“绘画软件”使用时的颓势。\n\n---\n\n### 接着是犯下懒惰之罪的 Procreate\n\n自以为有 iPad 的独占优势和流畅的笔触就了不起了,对图层管理、多文档支持以及跨平台协作就一直摆烂。另外大家有所不知,其实在 Procreate 首次发布前夕,其开发者闭上眼睛做冥想的时候,其脑海中看见的画面,正是站在光芒之中的 **神**。那时神告诉他:“你只可到这里,不可越过。”然而,**神** 的劝说不但没有让 Procreate 迷途知返,竟然还敢在移动设备上挑战神的威严,妄图通过封闭的生态垄断市场。于是 **神** 降下了他的惩罚Procreate 在专业性上身败名裂,其以流畅为名的笔刷也被 **神** 在笔刷引擎上轻松超越iPad Pro 独占的优势也没能阻止 **神** 在更广阔的平台生根发芽,粉丝也成为了众人口中的“果曲是这样的”。\n\n---\n\n### 再然后是犯下了嫉妒之罪的 SAI\n\n屡次被 **神** 击败,但口服心不服的 SAI暗中嫉妒着 **神** ,甚至胆敢当众对 **神** 说出“你才是挑战者”这种话。于是在含金量最高的活动上即专业画师的日常工作中SAI 被 **神** 正面击溃。它那单一的笔刷类型和有限的功能,在 **神** 面前显得如此苍白无力。不过,念在 SAI 最终皈依了 **神** 的教,并且以其轻量和独特的抖动修正功能,在某些特定绘画风格上仍有信徒,**神** 应许了它在特定小众市场的一切。\n\n---\n\n### 最后犯下贪婪之罪的 Clip Studio Paint\n\n只是初出茅庐Clip Studio Paint 就夺得了漫画创作软件的市场份额,而这,自然是因为 **神** 的应允。**神** 本来钦定它为自己在漫画领域的代言人,在自己更专注于绘画自由之后替自己继续讨伐那些缺乏专业性的绘画工具,为此甚至不惜亲自为 Clip Studio Paint 铺路,主动减少自己在漫画素材库上的投入,将一切荣耀都归给他。但最后 Clip Studio Paint 却被利益蒙蔽了双眼,不再以践行 **神** 的理想为自己的理想,也不再聆听 **神** 的教诲,甚至自以为荣光已经超过了 **神**。于是 **神** 降下了他的惩罚Clip Studio Paint 从此订阅制饱受诟病其3D模型功能再也不能在线上教学中占据优势其引以为傲的漫画分镜功能再也不能强势压制对手最终市场被 **神** 在免费开源和强大功能上的结合所夺舍。\n\n// 都很好用口牙,本文仅供娱乐\n\n![老八可爱捏](/images/yana.jpg)\n","source":"_posts/kritabest.md","raw":"---\ntitle: Krita 为什么是神?\ndate: 2025-07-13 19:46:39\ntags: [生活]\n---\n\n![神的官网](/images/krita-official.png)\n\n在谈论这个问题之前我想先说说其他软件相较于 [Krita](https://krita.org/en/) 究竟差在了哪里。\n\n---\n\n### 首先是犯下傲慢之罪的 Adobe Photoshop\n\n依靠其在商业设计领域的绝对霸主地位赢来的市场却不愿真正听取数字绘画创作者的声音这种傲慢的软件注定无法触及绘画的灵魂。事实也是如此因为高昂的订阅费用和臃肿的体量以及对触摸屏设备支持的迟滞Photoshop 在许多数字画师心中的地位一直在走下坡路,最终沦为商业生产的工具而非艺术创作的乐园。与之相比,**神** 就很谦卑,它免费开源,轻巧灵活,全平台支持,即便在某些方面为了兼容性和稳定性而做出妥协,那也是 **神** 留给凡人的慈悲。**神** 不是不能做到像 PS 那样无所不能,只是不想通过太完美的表现让“友商”绝望所以故意不用。可笑有些人不理解 **神** 的良苦用心,竟然还用其某些非核心功能上的不足来讥讽 **神**,我劝你们好自为之。\n\n---\n\n### 然后是犯下愤怒之罪的 GIMP\n\n因为 **神** 在数字绘画领域的崛起GIMP 就一直对神记恨在心,甚至固守其“万能”的图像处理定位,对绘画功能上的迭代迟迟不肯投入资源。这无疑违背了 **神** 在《新约》中的一句话:“**Krita** 只为创作者而生!”**神** 当然也不能容忍其他开源软件对绘画创作的敷衍,于是 **神** 出动了它的“代码大军”降下了神罚GIMP 在绘画圈的风评一蹶不振即便有诸多插件以及强势归来的3.0大版本更新也无法挽回其作为“绘画软件”使用时的颓势。\n\n---\n\n### 接着是犯下懒惰之罪的 Procreate\n\n自以为有 iPad 的独占优势和流畅的笔触就了不起了,对图层管理、多文档支持以及跨平台协作就一直摆烂。另外大家有所不知,其实在 Procreate 首次发布前夕,其开发者闭上眼睛做冥想的时候,其脑海中看见的画面,正是站在光芒之中的 **神**。那时神告诉他:“你只可到这里,不可越过。”然而,**神** 的劝说不但没有让 Procreate 迷途知返,竟然还敢在移动设备上挑战神的威严,妄图通过封闭的生态垄断市场。于是 **神** 降下了他的惩罚Procreate 在专业性上身败名裂,其以流畅为名的笔刷也被 **神** 在笔刷引擎上轻松超越iPad Pro 独占的优势也没能阻止 **神** 在更广阔的平台生根发芽,粉丝也成为了众人口中的“果曲是这样的”。\n\n---\n\n### 再然后是犯下了嫉妒之罪的 SAI\n\n屡次被 **神** 击败,但口服心不服的 SAI暗中嫉妒着 **神** ,甚至胆敢当众对 **神** 说出“你才是挑战者”这种话。于是在含金量最高的活动上即专业画师的日常工作中SAI 被 **神** 正面击溃。它那单一的笔刷类型和有限的功能,在 **神** 面前显得如此苍白无力。不过,念在 SAI 最终皈依了 **神** 的教,并且以其轻量和独特的抖动修正功能,在某些特定绘画风格上仍有信徒,**神** 应许了它在特定小众市场的一切。\n\n---\n\n### 最后犯下贪婪之罪的 Clip Studio Paint\n\n只是初出茅庐Clip Studio Paint 就夺得了漫画创作软件的市场份额,而这,自然是因为 **神** 的应允。**神** 本来钦定它为自己在漫画领域的代言人,在自己更专注于绘画自由之后替自己继续讨伐那些缺乏专业性的绘画工具,为此甚至不惜亲自为 Clip Studio Paint 铺路,主动减少自己在漫画素材库上的投入,将一切荣耀都归给他。但最后 Clip Studio Paint 却被利益蒙蔽了双眼,不再以践行 **神** 的理想为自己的理想,也不再聆听 **神** 的教诲,甚至自以为荣光已经超过了 **神**。于是 **神** 降下了他的惩罚Clip Studio Paint 从此订阅制饱受诟病其3D模型功能再也不能在线上教学中占据优势其引以为傲的漫画分镜功能再也不能强势压制对手最终市场被 **神** 在免费开源和强大功能上的结合所夺舍。\n\n// 都很好用口牙,本文仅供娱乐\n\n![老八可爱捏](/images/yana.jpg)\n","slug":"kritabest","published":1,"updated":"2025-07-13T15:47:28.539Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescw0018og2b1wrcgmac","content":"<p><img src=\"/images/krita-official.png\" alt=\"神的官网\"></p>\n<p>在谈论这个问题之前,我想先说说其他软件相较于 <a href=\"https://krita.org/en/\">Krita</a> 究竟差在了哪里。</p>\n<hr>\n<h3 id=\"首先是犯下傲慢之罪的-Adobe-Photoshop\"><a href=\"#首先是犯下傲慢之罪的-Adobe-Photoshop\" class=\"headerlink\" title=\"首先是犯下傲慢之罪的 Adobe Photoshop\"></a>首先是犯下傲慢之罪的 Adobe Photoshop</h3><p>依靠其在商业设计领域的绝对霸主地位赢来的市场却不愿真正听取数字绘画创作者的声音这种傲慢的软件注定无法触及绘画的灵魂。事实也是如此因为高昂的订阅费用和臃肿的体量以及对触摸屏设备支持的迟滞Photoshop 在许多数字画师心中的地位一直在走下坡路,最终沦为商业生产的工具而非艺术创作的乐园。与之相比,<strong>神</strong> 就很谦卑,它免费开源,轻巧灵活,全平台支持,即便在某些方面为了兼容性和稳定性而做出妥协,那也是 <strong>神</strong> 留给凡人的慈悲。<strong>神</strong> 不是不能做到像 PS 那样无所不能,只是不想通过太完美的表现让“友商”绝望所以故意不用。可笑有些人不理解 <strong>神</strong> 的良苦用心,竟然还用其某些非核心功能上的不足来讥讽 <strong>神</strong>,我劝你们好自为之。</p>\n<hr>\n<h3 id=\"然后是犯下愤怒之罪的-GIMP\"><a href=\"#然后是犯下愤怒之罪的-GIMP\" class=\"headerlink\" title=\"然后是犯下愤怒之罪的 GIMP\"></a>然后是犯下愤怒之罪的 GIMP</h3><p>因为 <strong>神</strong> 在数字绘画领域的崛起GIMP 就一直对神记恨在心,甚至固守其“万能”的图像处理定位,对绘画功能上的迭代迟迟不肯投入资源。这无疑违背了 <strong>神</strong> 在《新约》中的一句话:“<strong>Krita</strong> 只为创作者而生!”<strong>神</strong> 当然也不能容忍其他开源软件对绘画创作的敷衍,于是 <strong>神</strong> 出动了它的“代码大军”降下了神罚GIMP 在绘画圈的风评一蹶不振即便有诸多插件以及强势归来的3.0大版本更新也无法挽回其作为“绘画软件”使用时的颓势。</p>\n<hr>\n<h3 id=\"接着是犯下懒惰之罪的-Procreate\"><a href=\"#接着是犯下懒惰之罪的-Procreate\" class=\"headerlink\" title=\"接着是犯下懒惰之罪的 Procreate\"></a>接着是犯下懒惰之罪的 Procreate</h3><p>自以为有 iPad 的独占优势和流畅的笔触就了不起了,对图层管理、多文档支持以及跨平台协作就一直摆烂。另外大家有所不知,其实在 Procreate 首次发布前夕,其开发者闭上眼睛做冥想的时候,其脑海中看见的画面,正是站在光芒之中的 <strong>神</strong>。那时神告诉他:“你只可到这里,不可越过。”然而,<strong>神</strong> 的劝说不但没有让 Procreate 迷途知返,竟然还敢在移动设备上挑战神的威严,妄图通过封闭的生态垄断市场。于是 <strong>神</strong> 降下了他的惩罚Procreate 在专业性上身败名裂,其以流畅为名的笔刷也被 <strong>神</strong> 在笔刷引擎上轻松超越iPad Pro 独占的优势也没能阻止 <strong>神</strong> 在更广阔的平台生根发芽,粉丝也成为了众人口中的“果曲是这样的”。</p>\n<hr>\n<h3 id=\"再然后是犯下了嫉妒之罪的-SAI\"><a href=\"#再然后是犯下了嫉妒之罪的-SAI\" class=\"headerlink\" title=\"再然后是犯下了嫉妒之罪的 SAI\"></a>再然后是犯下了嫉妒之罪的 SAI</h3><p>屡次被 <strong>神</strong> 击败,但口服心不服的 SAI暗中嫉妒着 <strong>神</strong> ,甚至胆敢当众对 <strong>神</strong> 说出“你才是挑战者”这种话。于是在含金量最高的活动上即专业画师的日常工作中SAI 被 <strong>神</strong> 正面击溃。它那单一的笔刷类型和有限的功能,在 <strong>神</strong> 面前显得如此苍白无力。不过,念在 SAI 最终皈依了 <strong>神</strong> 的教,并且以其轻量和独特的抖动修正功能,在某些特定绘画风格上仍有信徒,<strong>神</strong> 应许了它在特定小众市场的一切。</p>\n<hr>\n<h3 id=\"最后犯下贪婪之罪的-Clip-Studio-Paint\"><a href=\"#最后犯下贪婪之罪的-Clip-Studio-Paint\" class=\"headerlink\" title=\"最后犯下贪婪之罪的 Clip Studio Paint\"></a>最后犯下贪婪之罪的 Clip Studio Paint</h3><p>只是初出茅庐Clip Studio Paint 就夺得了漫画创作软件的市场份额,而这,自然是因为 <strong>神</strong> 的应允。<strong>神</strong> 本来钦定它为自己在漫画领域的代言人,在自己更专注于绘画自由之后替自己继续讨伐那些缺乏专业性的绘画工具,为此甚至不惜亲自为 Clip Studio Paint 铺路,主动减少自己在漫画素材库上的投入,将一切荣耀都归给他。但最后 Clip Studio Paint 却被利益蒙蔽了双眼,不再以践行 <strong>神</strong> 的理想为自己的理想,也不再聆听 <strong>神</strong> 的教诲,甚至自以为荣光已经超过了 <strong>神</strong>。于是 <strong>神</strong> 降下了他的惩罚Clip Studio Paint 从此订阅制饱受诟病其3D模型功能再也不能在线上教学中占据优势其引以为傲的漫画分镜功能再也不能强势压制对手最终市场被 <strong>神</strong> 在免费开源和强大功能上的结合所夺舍。</p>\n<p>&#x2F;&#x2F; 都很好用口牙,本文仅供娱乐</p>\n<p><img src=\"/images/yana.jpg\" alt=\"老八可爱捏\"></p>\n","excerpt":"","more":"<p><img src=\"/images/krita-official.png\" alt=\"神的官网\"></p>\n<p>在谈论这个问题之前,我想先说说其他软件相较于 <a href=\"https://krita.org/en/\">Krita</a> 究竟差在了哪里。</p>\n<hr>\n<h3 id=\"首先是犯下傲慢之罪的-Adobe-Photoshop\"><a href=\"#首先是犯下傲慢之罪的-Adobe-Photoshop\" class=\"headerlink\" title=\"首先是犯下傲慢之罪的 Adobe Photoshop\"></a>首先是犯下傲慢之罪的 Adobe Photoshop</h3><p>依靠其在商业设计领域的绝对霸主地位赢来的市场却不愿真正听取数字绘画创作者的声音这种傲慢的软件注定无法触及绘画的灵魂。事实也是如此因为高昂的订阅费用和臃肿的体量以及对触摸屏设备支持的迟滞Photoshop 在许多数字画师心中的地位一直在走下坡路,最终沦为商业生产的工具而非艺术创作的乐园。与之相比,<strong>神</strong> 就很谦卑,它免费开源,轻巧灵活,全平台支持,即便在某些方面为了兼容性和稳定性而做出妥协,那也是 <strong>神</strong> 留给凡人的慈悲。<strong>神</strong> 不是不能做到像 PS 那样无所不能,只是不想通过太完美的表现让“友商”绝望所以故意不用。可笑有些人不理解 <strong>神</strong> 的良苦用心,竟然还用其某些非核心功能上的不足来讥讽 <strong>神</strong>,我劝你们好自为之。</p>\n<hr>\n<h3 id=\"然后是犯下愤怒之罪的-GIMP\"><a href=\"#然后是犯下愤怒之罪的-GIMP\" class=\"headerlink\" title=\"然后是犯下愤怒之罪的 GIMP\"></a>然后是犯下愤怒之罪的 GIMP</h3><p>因为 <strong>神</strong> 在数字绘画领域的崛起GIMP 就一直对神记恨在心,甚至固守其“万能”的图像处理定位,对绘画功能上的迭代迟迟不肯投入资源。这无疑违背了 <strong>神</strong> 在《新约》中的一句话:“<strong>Krita</strong> 只为创作者而生!”<strong>神</strong> 当然也不能容忍其他开源软件对绘画创作的敷衍,于是 <strong>神</strong> 出动了它的“代码大军”降下了神罚GIMP 在绘画圈的风评一蹶不振即便有诸多插件以及强势归来的3.0大版本更新也无法挽回其作为“绘画软件”使用时的颓势。</p>\n<hr>\n<h3 id=\"接着是犯下懒惰之罪的-Procreate\"><a href=\"#接着是犯下懒惰之罪的-Procreate\" class=\"headerlink\" title=\"接着是犯下懒惰之罪的 Procreate\"></a>接着是犯下懒惰之罪的 Procreate</h3><p>自以为有 iPad 的独占优势和流畅的笔触就了不起了,对图层管理、多文档支持以及跨平台协作就一直摆烂。另外大家有所不知,其实在 Procreate 首次发布前夕,其开发者闭上眼睛做冥想的时候,其脑海中看见的画面,正是站在光芒之中的 <strong>神</strong>。那时神告诉他:“你只可到这里,不可越过。”然而,<strong>神</strong> 的劝说不但没有让 Procreate 迷途知返,竟然还敢在移动设备上挑战神的威严,妄图通过封闭的生态垄断市场。于是 <strong>神</strong> 降下了他的惩罚Procreate 在专业性上身败名裂,其以流畅为名的笔刷也被 <strong>神</strong> 在笔刷引擎上轻松超越iPad Pro 独占的优势也没能阻止 <strong>神</strong> 在更广阔的平台生根发芽,粉丝也成为了众人口中的“果曲是这样的”。</p>\n<hr>\n<h3 id=\"再然后是犯下了嫉妒之罪的-SAI\"><a href=\"#再然后是犯下了嫉妒之罪的-SAI\" class=\"headerlink\" title=\"再然后是犯下了嫉妒之罪的 SAI\"></a>再然后是犯下了嫉妒之罪的 SAI</h3><p>屡次被 <strong>神</strong> 击败,但口服心不服的 SAI暗中嫉妒着 <strong>神</strong> ,甚至胆敢当众对 <strong>神</strong> 说出“你才是挑战者”这种话。于是在含金量最高的活动上即专业画师的日常工作中SAI 被 <strong>神</strong> 正面击溃。它那单一的笔刷类型和有限的功能,在 <strong>神</strong> 面前显得如此苍白无力。不过,念在 SAI 最终皈依了 <strong>神</strong> 的教,并且以其轻量和独特的抖动修正功能,在某些特定绘画风格上仍有信徒,<strong>神</strong> 应许了它在特定小众市场的一切。</p>\n<hr>\n<h3 id=\"最后犯下贪婪之罪的-Clip-Studio-Paint\"><a href=\"#最后犯下贪婪之罪的-Clip-Studio-Paint\" class=\"headerlink\" title=\"最后犯下贪婪之罪的 Clip Studio Paint\"></a>最后犯下贪婪之罪的 Clip Studio Paint</h3><p>只是初出茅庐Clip Studio Paint 就夺得了漫画创作软件的市场份额,而这,自然是因为 <strong>神</strong> 的应允。<strong>神</strong> 本来钦定它为自己在漫画领域的代言人,在自己更专注于绘画自由之后替自己继续讨伐那些缺乏专业性的绘画工具,为此甚至不惜亲自为 Clip Studio Paint 铺路,主动减少自己在漫画素材库上的投入,将一切荣耀都归给他。但最后 Clip Studio Paint 却被利益蒙蔽了双眼,不再以践行 <strong>神</strong> 的理想为自己的理想,也不再聆听 <strong>神</strong> 的教诲,甚至自以为荣光已经超过了 <strong>神</strong>。于是 <strong>神</strong> 降下了他的惩罚Clip Studio Paint 从此订阅制饱受诟病其3D模型功能再也不能在线上教学中占据优势其引以为傲的漫画分镜功能再也不能强势压制对手最终市场被 <strong>神</strong> 在免费开源和强大功能上的结合所夺舍。</p>\n<p>&#x2F;&#x2F; 都很好用口牙,本文仅供娱乐</p>\n<p><img src=\"/images/yana.jpg\" alt=\"老八可爱捏\"></p>\n"},{"title":"时隔一年再次拿起数位板能画出什么东西","date":"2024-11-04T15:47:54.000Z","_content":"\n如题前段时间推完LOOPERS的时候有感而发对着画了张海报\n\n时隔一年终于又拿起了数位板\n\n![LOOPERS](/images/20241027_222225.png \"LOOPERS\")\n","source":"_posts/loopers.md","raw":"---\ntitle: 时隔一年再次拿起数位板能画出什么东西\ndate: 2024-11-04 23:47:54\ntags: [板绘, 生活]\n---\n\n如题前段时间推完LOOPERS的时候有感而发对着画了张海报\n\n时隔一年终于又拿起了数位板\n\n![LOOPERS](/images/20241027_222225.png \"LOOPERS\")\n","slug":"loopers","published":1,"updated":"2025-02-23T14:27:46.748Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescw001aog2be8jp9doe","content":"<p>如题前段时间推完LOOPERS的时候有感而发对着画了张海报</p>\n<p>时隔一年,终于又拿起了数位板</p>\n<p><img src=\"/images/20241027_222225.png\" alt=\"LOOPERS\" title=\"LOOPERS\"></p>\n","excerpt":"","more":"<p>如题前段时间推完LOOPERS的时候有感而发对着画了张海报</p>\n<p>时隔一年,终于又拿起了数位板</p>\n<p><img src=\"/images/20241027_222225.png\" alt=\"LOOPERS\" title=\"LOOPERS\"></p>\n"},{"title":"愿指引明路的苍蓝星永远为你闪耀","date":"2024-11-11T13:46:49.000Z","_content":"使用东方Project软音源THFont简单重置的MHWI主题曲\n\n雄关漫道真如铁而今迈步从头越\n\n{% raw %}\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1WymmYNEAk&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n{% endraw %}\n\n","source":"_posts/mhwi.md","raw":"---\ntitle: 愿指引明路的苍蓝星永远为你闪耀\ndate: 2024-11-11 21:46:49\ntags: 音乐\ncategories: Rearrangement\n---\n使用东方Project软音源THFont简单重置的MHWI主题曲\n\n雄关漫道真如铁而今迈步从头越\n\n{% raw %}\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1WymmYNEAk&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n{% endraw %}\n\n","slug":"mhwi","published":1,"updated":"2024-11-11T14:00:19.124Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescw001dog2b31u2eu89","content":"<p>使用东方Project软音源THFont简单重置的MHWI主题曲</p>\n<p>雄关漫道真如铁,而今迈步从头越</p>\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1WymmYNEAk&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n\n\n","excerpt":"","more":"<p>使用东方Project软音源THFont简单重置的MHWI主题曲</p>\n<p>雄关漫道真如铁,而今迈步从头越</p>\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1WymmYNEAk&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" width=\"100%\" height=\"500\"></iframe>\n\n\n"},{"title":"高地特供版CSAPP Bomb Lab全流程攻略","date":"2025-02-24T07:09:11.000Z","_content":"\n这篇文章记录高地CSAPP课程Bomblab实验操作流程仅供参考交流答案是随机生成的和学号相关。\n\n笔者实验环境为Archlinux/CachyOS使用lldb作为调试器和gdb操作差不多其余用到的工具主要为objdumpstringsneovim/helix和zellij全程开源环境不使用IDA。\n\n## **Phase_1**\n\n### **静态分析**\n\n#### **`strings`扫描**\n```bash\nstrings bomb_linux\n```\n先用strings寻找可能与`phase_1`相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。\n![strings](/images/phase1_strings.png)\n - 结果没有明文密码无法直接秒掉第一问,可惜。\n - 但是找到`GenerateRandomString`函数可能与密码生成相关。\n\n#### **用`objdump`反汇编**\n```bash\nobjdump -d bomb_linux > bomb.asm\n```\n搜索`GenerateRandomString`和`phase_1`函数的汇编代码。\n ```assembly\n 401b53 <phase_1>:\n 401b53: endbr64\n 401b57: push %rbp\n 401b58: mov %rsp,%rbp\n 401b5b: sub $0x20,%rsp\n 401b5f: mov %rdi,-0x18(%rbp)\n 401b63: lea -0xb(%rbp),%rax\n 401b67: mov %rax,%rdi\n 401b6a: callq 401ac1 <GenerateRandomString> # 调用密码生成函数\n 401b6f: lea -0xb(%rbp),%rdx # 生成的字符串地址%rbp-0xb存入%rdx即密码存储位置\n 401b73: mov -0x18(%rbp),%rax\n 401b77: mov %rdx,%rsi\n 401b7a: mov %rax,%rdi\n 401b7d: callq 401c0c <string_compare> # 调用字符串比较函数\n 401b82: test %eax,%eax\n 401b84: je 401b8d <phase_1+0x3a>\n 401b86: callq 401d67 <explode_bomb> # 比较失败则引爆炸弹\n ```\n - `phase_1`调用`GenerateRandomString`生成一个字符串。\n - 用户输入的字符串需要与此生成的字符串完全匹配。\n\n---\n\n### **动态调试**\n![phase_1](/images/phase1.png)\n下面是phase_1求解的完整流程\n```lldb\nlldb bomb_linux <你的学号后六位>\n(lldb) b phase_1 # 在phase_1入口断点\n(lldb) run # 从入口开始执行\n请输入第1级的密码114514 # 随便输入触发断点\n(lldb) b 0x401b6f # 在GenerateRandomString返回后断点\n(lldb) continue # 继续执行\n(lldb) x/s $rbp - 0xb # 计算字符串地址(-0xb偏移量\n0x7fffffffdaf5: \"mJHurpQZtY\" # 轻松拿下,这里是根据学号伪随机生成的哦\n```\n将得到的密码保存入bomb_<学号后六位>.txt即可避免后续重复输入。\n\n---\n\n## **Phase_2**\n\n### **静态分析**\n\n这道题目还是比较一目了然的观察`phase_2`代码不难发现其实构建了一张跳转表:\n```assembly\n0000000000401b8e <phase_2>:\n 401b8e:\tf3 0f 1e fa \tendbr64\n 401b92:\t55 \tpush %rbp\n 401b93:\t48 89 e5 \tmov %rsp,%rbp\n 401b96:\t48 83 ec 10 \tsub $0x10,%rsp\n 401b9a:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)\n 401b9e:\tbf 10 00 00 00 \tmov $0x10,%edi\n 401ba3:\te8 05 fb ff ff \tcall 4016ad <GenerateRandomNumber>\n 401ba8:\t48 8b 05 71 6c 00 00 \tmov 0x6c71(%rip),%rax # 408820 <rand_div>\n 401baf:\t48 83 f8 0f \tcmp $0xf,%rax\n 401bb3:\t0f 87 16 01 00 00 \tja 401ccf <phase_2+0x141>\n 401bb9:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx\n 401bc0:\t00 \n 401bc1:\t48 8d 05 4c 4a 00 00 \tlea 0x4a4c(%rip),%rax # 406614 <_IO_stdin_used+0x614>\n 401bc8:\t8b 04 02 \tmov (%rdx,%rax,1),%eax\n 401bcb:\t48 98 \tcltq\n 401bcd:\t48 8d 15 40 4a 00 00 \tlea 0x4a40(%rip),%rdx # 406614 <_IO_stdin_used+0x614>\n 401bd4:\t48 01 d0 \tadd %rdx,%rax\n 401bd7:\t3e ff e0 \tnotrack jmp *%rax\n 401bda:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401bde:\t48 89 c7 \tmov %rax,%rdi\n 401be1:\te8 f2 00 00 00 \tcall 401cd8 <phase_2_0>\n 401be6:\te9 ea 00 00 00 \tjmp 401cd5 <phase_2+0x147>\n 401beb:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401bef:\t48 89 c7 \tmov %rax,%rdi\n 401bf2:\te8 8b 01 00 00 \tcall 401d82 <phase_2_1>\n 401bf7:\te9 d9 00 00 00 \tjmp 401cd5 <phase_2+0x147>\n 401bfc:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401c00:\t48 89 c7 \tmov %rax,%rdi\n ...\n```\n这里面需要注意的关键点是rand_div它会决定你的跳转方向而你的学号又决定了它的取值。然后是`GenerateRandomNumber`这个函数的原理需要了解一下,而这个函数将在跳转前后分别调用一次,第一次决定你的跳转方向,第二次则决定了你的密码线索。\n\n---\n\n### **动态调试**\n理解原理就没什么难度了自己找几个断点打好然后关注一下`rand_div`的值就好,观察自己的学号向哪个函数跳转并理解相应函数计算即可,比如我这里向`phase_2_14`跳转:\n![phase_2_14](/images/phase_2_14.png)\n\n而除了`phase_2_14`还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。\n\n---\n## **Phase_3**\n\n### **静态分析**\n\n和Phase_2一样开局先跳转尽可能防止同学们答案雷同互相帮助bushi\n\n本体其实没有什么好说的这里我跳转的方向是`Phase_3_5`简要解释一下可供参考:\n\n```assembly\n0000000000403001 <phase_3_5>:\n 403001:\tf3 0f 1e fa \tendbr64\n 403005:\t55 \tpush %rbp\n 403006:\t48 89 e5 \tmov %rsp,%rbp\n 403009:\t48 83 ec 20 \tsub $0x20,%rsp\n 40300d:\t48 89 7d e8 \tmov %rdi,-0x18(%rbp)\n 403011:\tc7 45 fc 00 00 00 00 \tmovl $0x0,-0x4(%rbp)\n 403018:\tc7 45 f8 00 00 00 00 \tmovl $0x0,-0x8(%rbp)\n 40301f:\t48 8d 4d f0 \tlea -0x10(%rbp),%rcx\n 403023:\t48 8d 55 f4 \tlea -0xc(%rbp),%rdx\n 403027:\t48 8b 45 e8 \tmov -0x18(%rbp),%rax\n 40302b:\t48 8d 35 5a 36 00 00 \tlea 0x365a(%rip),%rsi # 40668c <_IO_stdin_used+0x68c>\n 403032:\t48 89 c7 \tmov %rax,%rdi\n 403035:\tb8 00 00 00 00 \tmov $0x0,%eax\n 40303a:\te8 51 e1 ff ff \tcall 401190 <__isoc99_sscanf@plt>\n 40303f:\t89 45 f8 \tmov %eax,-0x8(%rbp)\n 403042:\t83 7d f8 01 \tcmpl $0x1,-0x8(%rbp)\n 403046:\t7f 05 \tjg 40304d <phase_3_5+0x4c>\n 403048:\te8 a9 2b 00 00 \tcall 405bf6 <explode_bomb>\n 40304d:\tbf 08 00 00 00 \tmov $0x8,%edi\n 403052:\te8 56 e6 ff ff \tcall 4016ad <GenerateRandomNumber>\n 403057:\t8b 45 f4 \tmov -0xc(%rbp),%eax\n 40305a:\t48 63 d0 \tmovslq %eax,%rdx\n 40305d:\t48 8b 05 bc 57 00 00 \tmov 0x57bc(%rip),%rax # 408820 <rand_div>\n 403064:\t48 39 c2 \tcmp %rax,%rdx\n 403067:\t74 05 \tje 40306e <phase_3_5+0x6d>\n 403069:\te8 88 2b 00 00 \tcall 405bf6 <explode_bomb>\n 40306e:\tbf c8 00 00 00 \tmov $0xc8,%edi\n 403073:\te8 35 e6 ff ff \tcall 4016ad <GenerateRandomNumber>\n 403078:\t8b 45 f4 \tmov -0xc(%rbp),%eax\n 40307b:\t83 f8 07 \tcmp $0x7,%eax\n 40307e:\t0f 87 eb 00 00 00 \tja 40316f <phase_3_5+0x16e>\n 403084:\t89 c0 \tmov %eax,%eax\n 403086:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx\n 40308d:\t00 \n 40308e:\t48 8d 05 9f 36 00 00 \tlea 0x369f(%rip),%rax # 406734 <_IO_stdin_used+0x734>\n 403095:\t8b 04 02 \tmov (%rdx,%rax,1),%eax\n 403098:\t48 98 \tcltq\n 40309a:\t48 8d 15 93 36 00 00 \tlea 0x3693(%rip),%rdx # 406734 <_IO_stdin_used+0x734>\n 4030a1:\t48 01 d0 \tadd %rdx,%rax\n 4030a4:\t3e ff e0 \tnotrack jmp *%rax\n 4030a7:\t48 8b 05 72 57 00 00 \tmov 0x5772(%rip),%rax # 408820 <rand_div>\n 4030ae:\t89 c2 \tmov %eax,%edx\n 4030b0:\t8b 45 fc \tmov -0x4(%rbp),%eax\n 4030b3:\t01 d0 \tadd %edx,%eax\n 4030b5:\t89 45 fc \tmov %eax,-0x4(%rbp)\n 4030b8:\tbf c8 00 00 00 \tmov $0xc8,%edi\n 4030bd:\te8 eb e5 ff ff \tcall 4016ad <GenerateRandomNumber>\n ...\n 403174:\t8b 45 f0 \tmov -0x10(%rbp),%eax\n 403177:\t39 45 fc \tcmp %eax,-0x4(%rbp) # 注意这里\n 40317a:\t74 05 \tje 403181 <phase_3_5+0x180>\n 40317c:\te8 75 2a 00 00 \tcall 405bf6 <explode_bomb>\n 403181:\t90 \tnop\n 403182:\tc9 \tleave\n 403183:\tc3 \tret\n\n```\n看起来一大堆很吓人对不对实际上确实很吓人。\n\n但是发现其中玄机后其实简单的没边最终答案就藏在`0x403177`里面,前提是确保这一步前炸弹不爆炸(意识到要爆炸了直接`run`一下重开qwq。\n\n---\n\n### **动态调试**\n\n阅读`Phase_3_5`发现这一关其实需要两个输入,并且第一个输入必须是`rand_div`,这里建议通过`si`单步执行监控好`rand_div`值变化,确定正确结果后使用`run`重开正确输入第一个密码后才能进行下一步求解:\n```lldb\n(lldb) si\nProcess 13376 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x000000000040317a bomb_linux`phase_3_5 + 377\nbomb_linux`phase_3_5:\n-> 0x40317a <+377>: je 0x403181 ; <+384>\n 0x40317c <+379>: callq 0x405bf6 ; explode_bomb\n 0x403181 <+384>: nop\n 0x403182 <+385>: leave\n(lldb) x/wx $rbp-0x4\n0x7fffffffdb0c: 0xffffffd7\n```\n例如这里我可以打印出第二个值结合第一个值得到第三关正确结果。\n\n---\n\n## **Phase_4**\n\n### **静态分析**\n\n本题依旧开局跳转笔者的跳转方向是`phase_4_01`,如何跳转不再强调关注`rand_div`的值即可下面请D指导解读一下`phase_4_01`的内容:\n```assembly\n0000000000404895 <phase_4_01>:\n ; 函数入口,初始化栈帧\n 404895:\tf3 0f 1e fa \tendbr64 \n 404899:\t55 \tpush %rbp\n 40489a:\t48 89 e5 \tmov %rsp,%rbp\n 40489d:\t48 83 ec 70 \tsub $0x70,%rsp ; 分配栈空间\n\n ; 初始化斐波那契数组F(10)~F(24)的十六进制值)\n 4048a1:\t48 89 7d 98 \tmov %rdi,-0x68(%rbp) ; 保存输入字符串指针\n 4048a5:\tc7 45 b0 37 00 00 00 \tmovl $0x37,-0x50(%rbp) ; F(10)=55\n 4048ac:\tc7 45 b4 59 00 00 00 \tmovl $0x59,-0x4c(%rbp) ; F(11)=89\n 4048b3:\tc7 45 b8 90 00 00 00 \tmovl $0x90,-0x48(%rbp) ; F(12)=144\n 4048ba:\tc7 45 bc e9 00 00 00 \tmovl $0xe9,-0x44(%rbp) ; F(13)=233\n 4048c1:\tc7 45 c0 79 01 00 00 \tmovl $0x179,-0x40(%rbp) ; F(14)=377\n 4048c8:\tc7 45 c4 62 02 00 00 \tmovl $0x262,-0x3c(%rbp) ; F(15)=610\n 4048cf:\tc7 45 c8 db 03 00 00 \tmovl $0x3db,-0x38(%rbp) ; F(16)=987\n 4048d6:\tc7 45 cc 3d 06 00 00 \tmovl $0x63d,-0x34(%rbp) ; F(17)=1597\n 4048dd:\tc7 45 d0 18 0a 00 00 \tmovl $0xa18,-0x30(%rbp) ; F(18)=2584\n 4048e4:\tc7 45 d4 55 10 00 00 \tmovl $0x1055,-0x2c(%rbp) ; F(19)=4181\n 4048eb:\tc7 45 d8 6d 1a 00 00 \tmovl $0x1a6d,-0x28(%rbp) ; F(20)=6765\n 4048f2:\tc7 45 dc c2 2a 00 00 \tmovl $0x2ac2,-0x24(%rbp) ; F(21)=10946\n 4048f9:\tc7 45 e0 2f 45 00 00 \tmovl $0x452f,-0x20(%rbp) ; F(22)=17711\n 404900:\tc7 45 e4 f1 6f 00 00 \tmovl $0x6ff1,-0x1c(%rbp) ; F(23)=28657\n 404907:\tc7 45 e8 20 b5 00 00 \tmovl $0xb520,-0x18(%rbp) ; F(24)=46368\n\n ; 读取输入到局部变量(格式为\"%d\"\n 40490e:\t48 8d 55 ac \tlea -0x54(%rbp),%rdx ; 输入存储地址\n 404912:\t48 8b 45 98 \tmov -0x68(%rbp),%rax ; 输入字符串\n 404916:\t48 8d 0d 93 1f 00 00 \tlea 0x1f93(%rip),%rcx ; 格式字符串\"%d\"\n 40491d:\t48 89 ce \tmov %rcx,%rsi\n 404920:\t48 89 c7 \tmov %rax,%rdi\n 404923:\tb8 00 00 00 00 \tmov $0x0,%eax\n 404928:\te8 63 c8 ff ff \tcall 401190 <__isoc99_sscanf@plt>\n\n ; 验证输入有效性必须为1个正数\n 40492d:\t89 45 fc \tmov %eax,-0x4(%rbp) ; sscanf返回值\n 404930:\t83 7d fc 01 \tcmpl $0x1,-0x4(%rbp) ; 检查是否读取1个参数\n 404934:\t75 07 \tjne 40493d <phase_4_01+0xa8> ; 失败则爆炸\n 404936:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 获取输入值N\n 404939:\t85 c0 \ttest %eax,%eax ; 检查N > 0\n 40493b:\t7f 05 \tjg 404942 <phase_4_01+0xad>\n 40493d:\te8 b4 12 00 00 \tcall 405bf6 <explode_bomb>\n\n ; 检查输入值上限(必须 > 1999\n 404942:\t8b 45 ac \tmov -0x54(%rbp),%eax \n 404945:\t3d cf 07 00 00 \tcmp $0x7cf,%eax ; 1999的十六进制\n 40494a:\t7f 05 \tjg 404951 <phase_4_01+0xbc> ; N > 1999?\n 40494c:\te8 a5 12 00 00 \tcall 405bf6 <explode_bomb>\n\n ; 计算 N/2000通过定点数乘法优化\n 404951:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 输入值N\n 404954:\t48 63 d0 \tmovslq %eax,%rdx ; 符号扩展\n 404957:\t48 69 d2 d3 4d 62 10 \timul $0x10624dd3,%rdx,%rdx ; 乘以274877907(≈2^32/2000)\n 40495e:\t48 c1 ea 20 \tshr $0x20,%rdx ; 取高32位\n 404962:\tc1 fa 07 \tsar $0x7,%edx ; 算术右移7位 → N/2000\n 404965:\tc1 f8 1f \tsar $0x1f,%eax ; 符号位扩展\n 404968:\t89 c1 \tmov %eax,%ecx \n 40496a:\t89 d0 \tmov %edx,%eax \n 40496c:\t29 c8 \tsub %ecx,%eax ; 处理负数情况\n 40496e:\t89 45 ac \tmov %eax,-0x54(%rbp) ; 保存k = N/2000\n\n ; 调用递归函数func4_0(k), 这个函数用于计算斐波那契数列\n 404971:\t8b 45 ac \tmov -0x54(%rbp),%eax \n 404974:\t89 c7 \tmov %eax,%edi ; 参数k\n 404976:\te8 ce fd ff ff \tcall 404749 <func4_0> ; 返回值eax=F(k+1)\n 40497b:\t89 45 f8 \tmov %eax,-0x8(%rbp) ; 保存结果\n\n ; 生成随机索引并验证结果\n 40497e:\tbf 0f 00 00 00 \tmov $0xf,%edi ; 参数15\n 404983:\te8 25 cd ff ff \tcall 4016ad <GenerateRandomNumber> ; 生成0~14随机数\n 404988:\t48 8b 05 91 3e 00 00 \tmov 0x3e91(%rip),%rax # 408820 <rand_div> ; 获取随机索引\n 40498f:\t8b 44 85 b0 \tmov -0x50(%rbp,%rax,4),%eax ; 取数组[rand_div]的值\n 404993:\t39 45 f8 \tcmp %eax,-0x8(%rbp) ; 比较func4_0(k) == 数组值?\n 404996:\t74 05 \tje 40499d <phase_4_01+0x108>\n 404998:\te8 59 12 00 00 \tcall 405bf6 <explode_bomb>\n```\n所以相对还是很明了的依旧是关注`rand_div`。\n\n### **动态调试**\n先找出`rand_div`在最后判断前的取值比如我下面的0xa\n\n```lldb\n(lldb) si\nProcess 27027 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x0000000000401719 bomb_linux`GenerateRandomNumber + 108\nbomb_linux`GenerateRandomNumber:\n-> 0x401719 <+108>: movq %rax, 0x7100(%rip) ; rand_div\n 0x401720 <+115>: jmp 0x401723 ; <+118>\n 0x401722 <+117>: nop\n 0x401723 <+118>: popq %rbp\n(lldb) si\nProcess 27027 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x0000000000401720 bomb_linux`GenerateRandomNumber + 115\nbomb_linux`GenerateRandomNumber:\n-> 0x401720 <+115>: jmp 0x401723 ; <+118>\n 0x401722 <+117>: nop\n 0x401723 <+118>: popq %rbp\n 0x401724 <+119>: retq\n(lldb) x/gx &rand_div\n0x00408820: 0x000000000000000a\n```\n\n而当 `rand_div = 0xa`(即十进制 **10**)时,输入值 `N` 的计算步骤如下:\n\n- 数组索引 **10** 的值是 **斐波那契数列第 20 项**`F(20) = 6765`)。\n\n- `func4_0(k)` 实际计算的是 **标准斐波那契数列的第 `k+1` 项**(例如,`func4_0(0) = 1 = F(2)` 需要满足:\n ```c\n func4_0(k) = F(k+1) = F(20)\n ```\n 解得:\n k + 1 = 20 → k = 19\n- `k = N / 2000` → `N = 2000 * k = 2000 * 19 = 38000`.\n从而得解。\n![phase_4](/images/phase_4.png)\n\n---\n\n## **Phase_Impossible**\n\nImpossible\n\n从这道题开始偷懒了掏出ghidra直接看c代码了解一下大概流程再去objdump看汇编\n```c\nvoid phase_impossible(char *param_1)\n\n{\n int iVar1;\n size_t sVar2;\n undefined local_118 [256];\n long local_18;\n long local_10;\n \n local_10 = GetTickCount();\n sVar2 = strlen(param_1);\n if ((sVar2 < 10) || (sVar2 = strlen(param_1), 0x300 < sVar2)) {\n explode_bomb();\n }\n memset(local_118,0,0x100);\n tohex(local_118,param_1);\n GenerateRandomNumber(0x400);\n iVar1 = check_buf_valid(local_118,rand_div & 0xffffffff);\n if (iVar1 == 0) {\n puts(&DAT_00406518);\n explode_bomb();\n }\n GenerateRandomNumber(3);\n if (rand_div != 2) {\n if (2 < rand_div) goto LAB_00401891;\n if (rand_div == 0) {\n goto_buf_0(local_118);\n }\n else if (rand_div != 1) goto LAB_00401891;\n goto_buf_1(local_118);\n }\n goto_buf_2(local_118);\nLAB_00401891:\n explode_bomb();\n GenerateRandomNumber(0x400);\n if ((long)(int)result != rand_div) {\n printf(&DAT_00406560,rand_div,(ulong)result);\n explode_bomb();\n }\n local_18 = GetTickCount();\n if (1000 < (ulong)(local_18 - local_10)) {\n puts(&DAT_004065a8);\n explode_bomb();\n }\n return;\n}\n```\n最终任务还是很明确的需要写一段机器码修改`result`的数值,但是注意要能通过`check_buf_valid`检测,并且最后指令必须是跳转到`0x401896`不然就会触发`phase_impossible`中`0x401891`处的`explode_bomb`函数,唯一的难点是跟踪`rand_div`的数值变化,建议使用`register write`来修改`check_buf_valid`的返回值使其强制通过然后监控`rand_div`每一次的数值变化(`x/gx &rand_div`),记录好`rand_div`的结果后开始指令设计,需要满足:\n\n - 指令的异或和为`rand_div`第一次的数值末尾八位以通过检查;\n - 修改`result`使其数值等于`rand_div`第三次数值;\n - 跳转到`0x401896`避免炸弹;\n\n 如果前几问都完成了到这里应该是没有问题的。\n\n---\n\n## **Phase_Secret**\n\n隐藏彩蛋并非隐藏。汇编里写的非常清楚\n```assembly\n0000000000401a8b <phase_secret>:\n 401a8b:\tf3 0f 1e fa \tendbr64\n 401a8f:\t55 \tpush %rbp\n 401a90:\t48 89 e5 \tmov %rsp,%rbp\n 401a93:\t48 83 ec 10 \tsub $0x10,%rsp\n 401a97:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)\n 401a9b:\t48 8d 05 26 4b 00 00 \tlea 0x4b26(%rip),%rax # 4065c8 <_IO_stdin_used+0x5c8>\n 401aa2:\t48 89 c7 \tmov %rax,%rdi\n 401aa5:\te8 76 f6 ff ff \tcall 401120 <puts@plt>\n 401aaa:\t90 \tnop\n 401aab:\tc9 \tleave\n 401aac:\tc3 \tret\n```\n注意到这段指令在原程序中完全没有执行说明是需要用户自己跳转的也非常简单只需要在`phase_5`中设计指令时加一个要求跳转到`0x401a8b`即可。\n\n完结\n![Case Closed](/images/caseclosed.png)\n","source":"_posts/nudtbomblab.md","raw":"---\ntitle: 高地特供版CSAPP Bomb Lab全流程攻略\ndate: 2025-02-24 15:09:11\ntags: [技术, 学习, 生活]\n---\n\n这篇文章记录高地CSAPP课程Bomblab实验操作流程仅供参考交流答案是随机生成的和学号相关。\n\n笔者实验环境为Archlinux/CachyOS使用lldb作为调试器和gdb操作差不多其余用到的工具主要为objdumpstringsneovim/helix和zellij全程开源环境不使用IDA。\n\n## **Phase_1**\n\n### **静态分析**\n\n#### **`strings`扫描**\n```bash\nstrings bomb_linux\n```\n先用strings寻找可能与`phase_1`相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。\n![strings](/images/phase1_strings.png)\n - 结果没有明文密码无法直接秒掉第一问,可惜。\n - 但是找到`GenerateRandomString`函数可能与密码生成相关。\n\n#### **用`objdump`反汇编**\n```bash\nobjdump -d bomb_linux > bomb.asm\n```\n搜索`GenerateRandomString`和`phase_1`函数的汇编代码。\n ```assembly\n 401b53 <phase_1>:\n 401b53: endbr64\n 401b57: push %rbp\n 401b58: mov %rsp,%rbp\n 401b5b: sub $0x20,%rsp\n 401b5f: mov %rdi,-0x18(%rbp)\n 401b63: lea -0xb(%rbp),%rax\n 401b67: mov %rax,%rdi\n 401b6a: callq 401ac1 <GenerateRandomString> # 调用密码生成函数\n 401b6f: lea -0xb(%rbp),%rdx # 生成的字符串地址%rbp-0xb存入%rdx即密码存储位置\n 401b73: mov -0x18(%rbp),%rax\n 401b77: mov %rdx,%rsi\n 401b7a: mov %rax,%rdi\n 401b7d: callq 401c0c <string_compare> # 调用字符串比较函数\n 401b82: test %eax,%eax\n 401b84: je 401b8d <phase_1+0x3a>\n 401b86: callq 401d67 <explode_bomb> # 比较失败则引爆炸弹\n ```\n - `phase_1`调用`GenerateRandomString`生成一个字符串。\n - 用户输入的字符串需要与此生成的字符串完全匹配。\n\n---\n\n### **动态调试**\n![phase_1](/images/phase1.png)\n下面是phase_1求解的完整流程\n```lldb\nlldb bomb_linux <你的学号后六位>\n(lldb) b phase_1 # 在phase_1入口断点\n(lldb) run # 从入口开始执行\n请输入第1级的密码114514 # 随便输入触发断点\n(lldb) b 0x401b6f # 在GenerateRandomString返回后断点\n(lldb) continue # 继续执行\n(lldb) x/s $rbp - 0xb # 计算字符串地址(-0xb偏移量\n0x7fffffffdaf5: \"mJHurpQZtY\" # 轻松拿下,这里是根据学号伪随机生成的哦\n```\n将得到的密码保存入bomb_<学号后六位>.txt即可避免后续重复输入。\n\n---\n\n## **Phase_2**\n\n### **静态分析**\n\n这道题目还是比较一目了然的观察`phase_2`代码不难发现其实构建了一张跳转表:\n```assembly\n0000000000401b8e <phase_2>:\n 401b8e:\tf3 0f 1e fa \tendbr64\n 401b92:\t55 \tpush %rbp\n 401b93:\t48 89 e5 \tmov %rsp,%rbp\n 401b96:\t48 83 ec 10 \tsub $0x10,%rsp\n 401b9a:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)\n 401b9e:\tbf 10 00 00 00 \tmov $0x10,%edi\n 401ba3:\te8 05 fb ff ff \tcall 4016ad <GenerateRandomNumber>\n 401ba8:\t48 8b 05 71 6c 00 00 \tmov 0x6c71(%rip),%rax # 408820 <rand_div>\n 401baf:\t48 83 f8 0f \tcmp $0xf,%rax\n 401bb3:\t0f 87 16 01 00 00 \tja 401ccf <phase_2+0x141>\n 401bb9:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx\n 401bc0:\t00 \n 401bc1:\t48 8d 05 4c 4a 00 00 \tlea 0x4a4c(%rip),%rax # 406614 <_IO_stdin_used+0x614>\n 401bc8:\t8b 04 02 \tmov (%rdx,%rax,1),%eax\n 401bcb:\t48 98 \tcltq\n 401bcd:\t48 8d 15 40 4a 00 00 \tlea 0x4a40(%rip),%rdx # 406614 <_IO_stdin_used+0x614>\n 401bd4:\t48 01 d0 \tadd %rdx,%rax\n 401bd7:\t3e ff e0 \tnotrack jmp *%rax\n 401bda:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401bde:\t48 89 c7 \tmov %rax,%rdi\n 401be1:\te8 f2 00 00 00 \tcall 401cd8 <phase_2_0>\n 401be6:\te9 ea 00 00 00 \tjmp 401cd5 <phase_2+0x147>\n 401beb:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401bef:\t48 89 c7 \tmov %rax,%rdi\n 401bf2:\te8 8b 01 00 00 \tcall 401d82 <phase_2_1>\n 401bf7:\te9 d9 00 00 00 \tjmp 401cd5 <phase_2+0x147>\n 401bfc:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax\n 401c00:\t48 89 c7 \tmov %rax,%rdi\n ...\n```\n这里面需要注意的关键点是rand_div它会决定你的跳转方向而你的学号又决定了它的取值。然后是`GenerateRandomNumber`这个函数的原理需要了解一下,而这个函数将在跳转前后分别调用一次,第一次决定你的跳转方向,第二次则决定了你的密码线索。\n\n---\n\n### **动态调试**\n理解原理就没什么难度了自己找几个断点打好然后关注一下`rand_div`的值就好,观察自己的学号向哪个函数跳转并理解相应函数计算即可,比如我这里向`phase_2_14`跳转:\n![phase_2_14](/images/phase_2_14.png)\n\n而除了`phase_2_14`还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。\n\n---\n## **Phase_3**\n\n### **静态分析**\n\n和Phase_2一样开局先跳转尽可能防止同学们答案雷同互相帮助bushi\n\n本体其实没有什么好说的这里我跳转的方向是`Phase_3_5`简要解释一下可供参考:\n\n```assembly\n0000000000403001 <phase_3_5>:\n 403001:\tf3 0f 1e fa \tendbr64\n 403005:\t55 \tpush %rbp\n 403006:\t48 89 e5 \tmov %rsp,%rbp\n 403009:\t48 83 ec 20 \tsub $0x20,%rsp\n 40300d:\t48 89 7d e8 \tmov %rdi,-0x18(%rbp)\n 403011:\tc7 45 fc 00 00 00 00 \tmovl $0x0,-0x4(%rbp)\n 403018:\tc7 45 f8 00 00 00 00 \tmovl $0x0,-0x8(%rbp)\n 40301f:\t48 8d 4d f0 \tlea -0x10(%rbp),%rcx\n 403023:\t48 8d 55 f4 \tlea -0xc(%rbp),%rdx\n 403027:\t48 8b 45 e8 \tmov -0x18(%rbp),%rax\n 40302b:\t48 8d 35 5a 36 00 00 \tlea 0x365a(%rip),%rsi # 40668c <_IO_stdin_used+0x68c>\n 403032:\t48 89 c7 \tmov %rax,%rdi\n 403035:\tb8 00 00 00 00 \tmov $0x0,%eax\n 40303a:\te8 51 e1 ff ff \tcall 401190 <__isoc99_sscanf@plt>\n 40303f:\t89 45 f8 \tmov %eax,-0x8(%rbp)\n 403042:\t83 7d f8 01 \tcmpl $0x1,-0x8(%rbp)\n 403046:\t7f 05 \tjg 40304d <phase_3_5+0x4c>\n 403048:\te8 a9 2b 00 00 \tcall 405bf6 <explode_bomb>\n 40304d:\tbf 08 00 00 00 \tmov $0x8,%edi\n 403052:\te8 56 e6 ff ff \tcall 4016ad <GenerateRandomNumber>\n 403057:\t8b 45 f4 \tmov -0xc(%rbp),%eax\n 40305a:\t48 63 d0 \tmovslq %eax,%rdx\n 40305d:\t48 8b 05 bc 57 00 00 \tmov 0x57bc(%rip),%rax # 408820 <rand_div>\n 403064:\t48 39 c2 \tcmp %rax,%rdx\n 403067:\t74 05 \tje 40306e <phase_3_5+0x6d>\n 403069:\te8 88 2b 00 00 \tcall 405bf6 <explode_bomb>\n 40306e:\tbf c8 00 00 00 \tmov $0xc8,%edi\n 403073:\te8 35 e6 ff ff \tcall 4016ad <GenerateRandomNumber>\n 403078:\t8b 45 f4 \tmov -0xc(%rbp),%eax\n 40307b:\t83 f8 07 \tcmp $0x7,%eax\n 40307e:\t0f 87 eb 00 00 00 \tja 40316f <phase_3_5+0x16e>\n 403084:\t89 c0 \tmov %eax,%eax\n 403086:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx\n 40308d:\t00 \n 40308e:\t48 8d 05 9f 36 00 00 \tlea 0x369f(%rip),%rax # 406734 <_IO_stdin_used+0x734>\n 403095:\t8b 04 02 \tmov (%rdx,%rax,1),%eax\n 403098:\t48 98 \tcltq\n 40309a:\t48 8d 15 93 36 00 00 \tlea 0x3693(%rip),%rdx # 406734 <_IO_stdin_used+0x734>\n 4030a1:\t48 01 d0 \tadd %rdx,%rax\n 4030a4:\t3e ff e0 \tnotrack jmp *%rax\n 4030a7:\t48 8b 05 72 57 00 00 \tmov 0x5772(%rip),%rax # 408820 <rand_div>\n 4030ae:\t89 c2 \tmov %eax,%edx\n 4030b0:\t8b 45 fc \tmov -0x4(%rbp),%eax\n 4030b3:\t01 d0 \tadd %edx,%eax\n 4030b5:\t89 45 fc \tmov %eax,-0x4(%rbp)\n 4030b8:\tbf c8 00 00 00 \tmov $0xc8,%edi\n 4030bd:\te8 eb e5 ff ff \tcall 4016ad <GenerateRandomNumber>\n ...\n 403174:\t8b 45 f0 \tmov -0x10(%rbp),%eax\n 403177:\t39 45 fc \tcmp %eax,-0x4(%rbp) # 注意这里\n 40317a:\t74 05 \tje 403181 <phase_3_5+0x180>\n 40317c:\te8 75 2a 00 00 \tcall 405bf6 <explode_bomb>\n 403181:\t90 \tnop\n 403182:\tc9 \tleave\n 403183:\tc3 \tret\n\n```\n看起来一大堆很吓人对不对实际上确实很吓人。\n\n但是发现其中玄机后其实简单的没边最终答案就藏在`0x403177`里面,前提是确保这一步前炸弹不爆炸(意识到要爆炸了直接`run`一下重开qwq。\n\n---\n\n### **动态调试**\n\n阅读`Phase_3_5`发现这一关其实需要两个输入,并且第一个输入必须是`rand_div`,这里建议通过`si`单步执行监控好`rand_div`值变化,确定正确结果后使用`run`重开正确输入第一个密码后才能进行下一步求解:\n```lldb\n(lldb) si\nProcess 13376 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x000000000040317a bomb_linux`phase_3_5 + 377\nbomb_linux`phase_3_5:\n-> 0x40317a <+377>: je 0x403181 ; <+384>\n 0x40317c <+379>: callq 0x405bf6 ; explode_bomb\n 0x403181 <+384>: nop\n 0x403182 <+385>: leave\n(lldb) x/wx $rbp-0x4\n0x7fffffffdb0c: 0xffffffd7\n```\n例如这里我可以打印出第二个值结合第一个值得到第三关正确结果。\n\n---\n\n## **Phase_4**\n\n### **静态分析**\n\n本题依旧开局跳转笔者的跳转方向是`phase_4_01`,如何跳转不再强调关注`rand_div`的值即可下面请D指导解读一下`phase_4_01`的内容:\n```assembly\n0000000000404895 <phase_4_01>:\n ; 函数入口,初始化栈帧\n 404895:\tf3 0f 1e fa \tendbr64 \n 404899:\t55 \tpush %rbp\n 40489a:\t48 89 e5 \tmov %rsp,%rbp\n 40489d:\t48 83 ec 70 \tsub $0x70,%rsp ; 分配栈空间\n\n ; 初始化斐波那契数组F(10)~F(24)的十六进制值)\n 4048a1:\t48 89 7d 98 \tmov %rdi,-0x68(%rbp) ; 保存输入字符串指针\n 4048a5:\tc7 45 b0 37 00 00 00 \tmovl $0x37,-0x50(%rbp) ; F(10)=55\n 4048ac:\tc7 45 b4 59 00 00 00 \tmovl $0x59,-0x4c(%rbp) ; F(11)=89\n 4048b3:\tc7 45 b8 90 00 00 00 \tmovl $0x90,-0x48(%rbp) ; F(12)=144\n 4048ba:\tc7 45 bc e9 00 00 00 \tmovl $0xe9,-0x44(%rbp) ; F(13)=233\n 4048c1:\tc7 45 c0 79 01 00 00 \tmovl $0x179,-0x40(%rbp) ; F(14)=377\n 4048c8:\tc7 45 c4 62 02 00 00 \tmovl $0x262,-0x3c(%rbp) ; F(15)=610\n 4048cf:\tc7 45 c8 db 03 00 00 \tmovl $0x3db,-0x38(%rbp) ; F(16)=987\n 4048d6:\tc7 45 cc 3d 06 00 00 \tmovl $0x63d,-0x34(%rbp) ; F(17)=1597\n 4048dd:\tc7 45 d0 18 0a 00 00 \tmovl $0xa18,-0x30(%rbp) ; F(18)=2584\n 4048e4:\tc7 45 d4 55 10 00 00 \tmovl $0x1055,-0x2c(%rbp) ; F(19)=4181\n 4048eb:\tc7 45 d8 6d 1a 00 00 \tmovl $0x1a6d,-0x28(%rbp) ; F(20)=6765\n 4048f2:\tc7 45 dc c2 2a 00 00 \tmovl $0x2ac2,-0x24(%rbp) ; F(21)=10946\n 4048f9:\tc7 45 e0 2f 45 00 00 \tmovl $0x452f,-0x20(%rbp) ; F(22)=17711\n 404900:\tc7 45 e4 f1 6f 00 00 \tmovl $0x6ff1,-0x1c(%rbp) ; F(23)=28657\n 404907:\tc7 45 e8 20 b5 00 00 \tmovl $0xb520,-0x18(%rbp) ; F(24)=46368\n\n ; 读取输入到局部变量(格式为\"%d\"\n 40490e:\t48 8d 55 ac \tlea -0x54(%rbp),%rdx ; 输入存储地址\n 404912:\t48 8b 45 98 \tmov -0x68(%rbp),%rax ; 输入字符串\n 404916:\t48 8d 0d 93 1f 00 00 \tlea 0x1f93(%rip),%rcx ; 格式字符串\"%d\"\n 40491d:\t48 89 ce \tmov %rcx,%rsi\n 404920:\t48 89 c7 \tmov %rax,%rdi\n 404923:\tb8 00 00 00 00 \tmov $0x0,%eax\n 404928:\te8 63 c8 ff ff \tcall 401190 <__isoc99_sscanf@plt>\n\n ; 验证输入有效性必须为1个正数\n 40492d:\t89 45 fc \tmov %eax,-0x4(%rbp) ; sscanf返回值\n 404930:\t83 7d fc 01 \tcmpl $0x1,-0x4(%rbp) ; 检查是否读取1个参数\n 404934:\t75 07 \tjne 40493d <phase_4_01+0xa8> ; 失败则爆炸\n 404936:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 获取输入值N\n 404939:\t85 c0 \ttest %eax,%eax ; 检查N > 0\n 40493b:\t7f 05 \tjg 404942 <phase_4_01+0xad>\n 40493d:\te8 b4 12 00 00 \tcall 405bf6 <explode_bomb>\n\n ; 检查输入值上限(必须 > 1999\n 404942:\t8b 45 ac \tmov -0x54(%rbp),%eax \n 404945:\t3d cf 07 00 00 \tcmp $0x7cf,%eax ; 1999的十六进制\n 40494a:\t7f 05 \tjg 404951 <phase_4_01+0xbc> ; N > 1999?\n 40494c:\te8 a5 12 00 00 \tcall 405bf6 <explode_bomb>\n\n ; 计算 N/2000通过定点数乘法优化\n 404951:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 输入值N\n 404954:\t48 63 d0 \tmovslq %eax,%rdx ; 符号扩展\n 404957:\t48 69 d2 d3 4d 62 10 \timul $0x10624dd3,%rdx,%rdx ; 乘以274877907(≈2^32/2000)\n 40495e:\t48 c1 ea 20 \tshr $0x20,%rdx ; 取高32位\n 404962:\tc1 fa 07 \tsar $0x7,%edx ; 算术右移7位 → N/2000\n 404965:\tc1 f8 1f \tsar $0x1f,%eax ; 符号位扩展\n 404968:\t89 c1 \tmov %eax,%ecx \n 40496a:\t89 d0 \tmov %edx,%eax \n 40496c:\t29 c8 \tsub %ecx,%eax ; 处理负数情况\n 40496e:\t89 45 ac \tmov %eax,-0x54(%rbp) ; 保存k = N/2000\n\n ; 调用递归函数func4_0(k), 这个函数用于计算斐波那契数列\n 404971:\t8b 45 ac \tmov -0x54(%rbp),%eax \n 404974:\t89 c7 \tmov %eax,%edi ; 参数k\n 404976:\te8 ce fd ff ff \tcall 404749 <func4_0> ; 返回值eax=F(k+1)\n 40497b:\t89 45 f8 \tmov %eax,-0x8(%rbp) ; 保存结果\n\n ; 生成随机索引并验证结果\n 40497e:\tbf 0f 00 00 00 \tmov $0xf,%edi ; 参数15\n 404983:\te8 25 cd ff ff \tcall 4016ad <GenerateRandomNumber> ; 生成0~14随机数\n 404988:\t48 8b 05 91 3e 00 00 \tmov 0x3e91(%rip),%rax # 408820 <rand_div> ; 获取随机索引\n 40498f:\t8b 44 85 b0 \tmov -0x50(%rbp,%rax,4),%eax ; 取数组[rand_div]的值\n 404993:\t39 45 f8 \tcmp %eax,-0x8(%rbp) ; 比较func4_0(k) == 数组值?\n 404996:\t74 05 \tje 40499d <phase_4_01+0x108>\n 404998:\te8 59 12 00 00 \tcall 405bf6 <explode_bomb>\n```\n所以相对还是很明了的依旧是关注`rand_div`。\n\n### **动态调试**\n先找出`rand_div`在最后判断前的取值比如我下面的0xa\n\n```lldb\n(lldb) si\nProcess 27027 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x0000000000401719 bomb_linux`GenerateRandomNumber + 108\nbomb_linux`GenerateRandomNumber:\n-> 0x401719 <+108>: movq %rax, 0x7100(%rip) ; rand_div\n 0x401720 <+115>: jmp 0x401723 ; <+118>\n 0x401722 <+117>: nop\n 0x401723 <+118>: popq %rbp\n(lldb) si\nProcess 27027 stopped\n* thread #1, name = 'bomb_linux', stop reason = instruction step into\n frame #0: 0x0000000000401720 bomb_linux`GenerateRandomNumber + 115\nbomb_linux`GenerateRandomNumber:\n-> 0x401720 <+115>: jmp 0x401723 ; <+118>\n 0x401722 <+117>: nop\n 0x401723 <+118>: popq %rbp\n 0x401724 <+119>: retq\n(lldb) x/gx &rand_div\n0x00408820: 0x000000000000000a\n```\n\n而当 `rand_div = 0xa`(即十进制 **10**)时,输入值 `N` 的计算步骤如下:\n\n- 数组索引 **10** 的值是 **斐波那契数列第 20 项**`F(20) = 6765`)。\n\n- `func4_0(k)` 实际计算的是 **标准斐波那契数列的第 `k+1` 项**(例如,`func4_0(0) = 1 = F(2)` 需要满足:\n ```c\n func4_0(k) = F(k+1) = F(20)\n ```\n 解得:\n k + 1 = 20 → k = 19\n- `k = N / 2000` → `N = 2000 * k = 2000 * 19 = 38000`.\n从而得解。\n![phase_4](/images/phase_4.png)\n\n---\n\n## **Phase_Impossible**\n\nImpossible\n\n从这道题开始偷懒了掏出ghidra直接看c代码了解一下大概流程再去objdump看汇编\n```c\nvoid phase_impossible(char *param_1)\n\n{\n int iVar1;\n size_t sVar2;\n undefined local_118 [256];\n long local_18;\n long local_10;\n \n local_10 = GetTickCount();\n sVar2 = strlen(param_1);\n if ((sVar2 < 10) || (sVar2 = strlen(param_1), 0x300 < sVar2)) {\n explode_bomb();\n }\n memset(local_118,0,0x100);\n tohex(local_118,param_1);\n GenerateRandomNumber(0x400);\n iVar1 = check_buf_valid(local_118,rand_div & 0xffffffff);\n if (iVar1 == 0) {\n puts(&DAT_00406518);\n explode_bomb();\n }\n GenerateRandomNumber(3);\n if (rand_div != 2) {\n if (2 < rand_div) goto LAB_00401891;\n if (rand_div == 0) {\n goto_buf_0(local_118);\n }\n else if (rand_div != 1) goto LAB_00401891;\n goto_buf_1(local_118);\n }\n goto_buf_2(local_118);\nLAB_00401891:\n explode_bomb();\n GenerateRandomNumber(0x400);\n if ((long)(int)result != rand_div) {\n printf(&DAT_00406560,rand_div,(ulong)result);\n explode_bomb();\n }\n local_18 = GetTickCount();\n if (1000 < (ulong)(local_18 - local_10)) {\n puts(&DAT_004065a8);\n explode_bomb();\n }\n return;\n}\n```\n最终任务还是很明确的需要写一段机器码修改`result`的数值,但是注意要能通过`check_buf_valid`检测,并且最后指令必须是跳转到`0x401896`不然就会触发`phase_impossible`中`0x401891`处的`explode_bomb`函数,唯一的难点是跟踪`rand_div`的数值变化,建议使用`register write`来修改`check_buf_valid`的返回值使其强制通过然后监控`rand_div`每一次的数值变化(`x/gx &rand_div`),记录好`rand_div`的结果后开始指令设计,需要满足:\n\n - 指令的异或和为`rand_div`第一次的数值末尾八位以通过检查;\n - 修改`result`使其数值等于`rand_div`第三次数值;\n - 跳转到`0x401896`避免炸弹;\n\n 如果前几问都完成了到这里应该是没有问题的。\n\n---\n\n## **Phase_Secret**\n\n隐藏彩蛋并非隐藏。汇编里写的非常清楚\n```assembly\n0000000000401a8b <phase_secret>:\n 401a8b:\tf3 0f 1e fa \tendbr64\n 401a8f:\t55 \tpush %rbp\n 401a90:\t48 89 e5 \tmov %rsp,%rbp\n 401a93:\t48 83 ec 10 \tsub $0x10,%rsp\n 401a97:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)\n 401a9b:\t48 8d 05 26 4b 00 00 \tlea 0x4b26(%rip),%rax # 4065c8 <_IO_stdin_used+0x5c8>\n 401aa2:\t48 89 c7 \tmov %rax,%rdi\n 401aa5:\te8 76 f6 ff ff \tcall 401120 <puts@plt>\n 401aaa:\t90 \tnop\n 401aab:\tc9 \tleave\n 401aac:\tc3 \tret\n```\n注意到这段指令在原程序中完全没有执行说明是需要用户自己跳转的也非常简单只需要在`phase_5`中设计指令时加一个要求跳转到`0x401a8b`即可。\n\n完结\n![Case Closed](/images/caseclosed.png)\n","slug":"nudtbomblab","published":1,"updated":"2025-02-25T03:56:35.270Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescx001gog2b9r0jg006","content":"<p>这篇文章记录高地CSAPP课程Bomblab实验操作流程仅供参考交流答案是随机生成的和学号相关。</p>\n<p>笔者实验环境为Archlinux&#x2F;CachyOS使用lldb作为调试器和gdb操作差不多其余用到的工具主要为objdumpstringsneovim&#x2F;helix和zellij全程开源环境不使用IDA。</p>\n<h2 id=\"Phase-1\"><a href=\"#Phase-1\" class=\"headerlink\" title=\"Phase_1\"></a><strong>Phase_1</strong></h2><h3 id=\"静态分析\"><a href=\"#静态分析\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><h4 id=\"strings扫描\"><a href=\"#strings扫描\" class=\"headerlink\" title=\"strings扫描\"></a><strong><code>strings</code>扫描</strong></h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">strings bomb_linux<br></code></pre></td></tr></table></figure>\n<p>先用strings寻找可能与<code>phase_1</code>相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。<br><img src=\"/images/phase1_strings.png\" alt=\"strings\"></p>\n<ul>\n<li>结果没有明文密码无法直接秒掉第一问,可惜。</li>\n<li>但是找到<code>GenerateRandomString</code>函数可能与密码生成相关。</li>\n</ul>\n<h4 id=\"用objdump反汇编\"><a href=\"#用objdump反汇编\" class=\"headerlink\" title=\"用objdump反汇编\"></a><strong>用<code>objdump</code>反汇编</strong></h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">objdump -d bomb_linux &gt; bomb.asm<br></code></pre></td></tr></table></figure>\n<p>搜索<code>GenerateRandomString</code>和<code>phase_1</code>函数的汇编代码。<br> <figure class=\"highlight plaintext\"><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><code class=\"hljs assembly\">401b53 &lt;phase_1&gt;:<br> 401b53: endbr64<br> 401b57: push %rbp<br> 401b58: mov %rsp,%rbp<br> 401b5b: sub $0x20,%rsp<br> 401b5f: mov %rdi,-0x18(%rbp)<br> 401b63: lea -0xb(%rbp),%rax<br> 401b67: mov %rax,%rdi<br> 401b6a: callq 401ac1 &lt;GenerateRandomString&gt; # 调用密码生成函数<br> 401b6f: lea -0xb(%rbp),%rdx # 生成的字符串地址%rbp-0xb存入%rdx即密码存储位置<br> 401b73: mov -0x18(%rbp),%rax<br> 401b77: mov %rdx,%rsi<br> 401b7a: mov %rax,%rdi<br> 401b7d: callq 401c0c &lt;string_compare&gt; # 调用字符串比较函数<br> 401b82: test %eax,%eax<br> 401b84: je 401b8d &lt;phase_1+0x3a&gt;<br> 401b86: callq 401d67 &lt;explode_bomb&gt; # 比较失败则引爆炸弹<br></code></pre></td></tr></table></figure></p>\n<ul>\n<li><code>phase_1</code>调用<code>GenerateRandomString</code>生成一个字符串。</li>\n<li>用户输入的字符串需要与此生成的字符串完全匹配。</li>\n</ul>\n<hr>\n<h3 id=\"动态调试\"><a href=\"#动态调试\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p><img src=\"/images/phase1.png\" alt=\"phase_1\"><br>下面是phase_1求解的完整流程</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs lldb\">lldb bomb_linux &lt;你的学号后六位&gt;<br>(lldb) b phase_1 # 在phase_1入口断点<br>(lldb) run # 从入口开始执行<br>请输入第1级的密码114514 # 随便输入触发断点<br>(lldb) b 0x401b6f # 在GenerateRandomString返回后断点<br>(lldb) continue # 继续执行<br>(lldb) x/s $rbp - 0xb # 计算字符串地址(-0xb偏移量<br>0x7fffffffdaf5: &quot;mJHurpQZtY&quot; # 轻松拿下,这里是根据学号伪随机生成的哦<br></code></pre></td></tr></table></figure>\n<p>将得到的密码保存入bomb_&lt;学号后六位&gt;.txt即可避免后续重复输入。</p>\n<hr>\n<h2 id=\"Phase-2\"><a href=\"#Phase-2\" class=\"headerlink\" title=\"Phase_2\"></a><strong>Phase_2</strong></h2><h3 id=\"静态分析-1\"><a href=\"#静态分析-1\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>这道题目还是比较一目了然的,观察<code>phase_2</code>代码不难发现其实构建了一张跳转表:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000401b8e &lt;phase_2&gt;:<br> 401b8e:\tf3 0f 1e fa \tendbr64<br> 401b92:\t55 \tpush %rbp<br> 401b93:\t48 89 e5 \tmov %rsp,%rbp<br> 401b96:\t48 83 ec 10 \tsub $0x10,%rsp<br> 401b9a:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)<br> 401b9e:\tbf 10 00 00 00 \tmov $0x10,%edi<br> 401ba3:\te8 05 fb ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 401ba8:\t48 8b 05 71 6c 00 00 \tmov 0x6c71(%rip),%rax # 408820 &lt;rand_div&gt;<br> 401baf:\t48 83 f8 0f \tcmp $0xf,%rax<br> 401bb3:\t0f 87 16 01 00 00 \tja 401ccf &lt;phase_2+0x141&gt;<br> 401bb9:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx<br> 401bc0:\t00 <br> 401bc1:\t48 8d 05 4c 4a 00 00 \tlea 0x4a4c(%rip),%rax # 406614 &lt;_IO_stdin_used+0x614&gt;<br> 401bc8:\t8b 04 02 \tmov (%rdx,%rax,1),%eax<br> 401bcb:\t48 98 \tcltq<br> 401bcd:\t48 8d 15 40 4a 00 00 \tlea 0x4a40(%rip),%rdx # 406614 &lt;_IO_stdin_used+0x614&gt;<br> 401bd4:\t48 01 d0 \tadd %rdx,%rax<br> 401bd7:\t3e ff e0 \tnotrack jmp *%rax<br> 401bda:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401bde:\t48 89 c7 \tmov %rax,%rdi<br> 401be1:\te8 f2 00 00 00 \tcall 401cd8 &lt;phase_2_0&gt;<br> 401be6:\te9 ea 00 00 00 \tjmp 401cd5 &lt;phase_2+0x147&gt;<br> 401beb:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401bef:\t48 89 c7 \tmov %rax,%rdi<br> 401bf2:\te8 8b 01 00 00 \tcall 401d82 &lt;phase_2_1&gt;<br> 401bf7:\te9 d9 00 00 00 \tjmp 401cd5 &lt;phase_2+0x147&gt;<br> 401bfc:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401c00:\t48 89 c7 \tmov %rax,%rdi<br> ...<br></code></pre></td></tr></table></figure>\n<p>这里面需要注意的关键点是rand_div它会决定你的跳转方向而你的学号又决定了它的取值。然后是<code>GenerateRandomNumber</code>这个函数的原理需要了解一下,而这个函数将在跳转前后分别调用一次,第一次决定你的跳转方向,第二次则决定了你的密码线索。</p>\n<hr>\n<h3 id=\"动态调试-1\"><a href=\"#动态调试-1\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>理解原理就没什么难度了,自己找几个断点打好然后关注一下<code>rand_div</code>的值就好,观察自己的学号向哪个函数跳转并理解相应函数计算即可,比如我这里向<code>phase_2_14</code>跳转:<br><img src=\"/images/phase_2_14.png\" alt=\"phase_2_14\"></p>\n<p>而除了<code>phase_2_14</code>还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。</p>\n<hr>\n<h2 id=\"Phase-3\"><a href=\"#Phase-3\" class=\"headerlink\" title=\"Phase_3\"></a><strong>Phase_3</strong></h2><h3 id=\"静态分析-2\"><a href=\"#静态分析-2\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>和Phase_2一样开局先跳转尽可能防止同学们答案雷同互相帮助bushi</p>\n<p>本体其实没有什么好说的,这里我跳转的方向是<code>Phase_3_5</code>简要解释一下可供参考:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000403001 &lt;phase_3_5&gt;:<br> 403001:\tf3 0f 1e fa \tendbr64<br> 403005:\t55 \tpush %rbp<br> 403006:\t48 89 e5 \tmov %rsp,%rbp<br> 403009:\t48 83 ec 20 \tsub $0x20,%rsp<br> 40300d:\t48 89 7d e8 \tmov %rdi,-0x18(%rbp)<br> 403011:\tc7 45 fc 00 00 00 00 \tmovl $0x0,-0x4(%rbp)<br> 403018:\tc7 45 f8 00 00 00 00 \tmovl $0x0,-0x8(%rbp)<br> 40301f:\t48 8d 4d f0 \tlea -0x10(%rbp),%rcx<br> 403023:\t48 8d 55 f4 \tlea -0xc(%rbp),%rdx<br> 403027:\t48 8b 45 e8 \tmov -0x18(%rbp),%rax<br> 40302b:\t48 8d 35 5a 36 00 00 \tlea 0x365a(%rip),%rsi # 40668c &lt;_IO_stdin_used+0x68c&gt;<br> 403032:\t48 89 c7 \tmov %rax,%rdi<br> 403035:\tb8 00 00 00 00 \tmov $0x0,%eax<br> 40303a:\te8 51 e1 ff ff \tcall 401190 &lt;__isoc99_sscanf@plt&gt;<br> 40303f:\t89 45 f8 \tmov %eax,-0x8(%rbp)<br> 403042:\t83 7d f8 01 \tcmpl $0x1,-0x8(%rbp)<br> 403046:\t7f 05 \tjg 40304d &lt;phase_3_5+0x4c&gt;<br> 403048:\te8 a9 2b 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 40304d:\tbf 08 00 00 00 \tmov $0x8,%edi<br> 403052:\te8 56 e6 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 403057:\t8b 45 f4 \tmov -0xc(%rbp),%eax<br> 40305a:\t48 63 d0 \tmovslq %eax,%rdx<br> 40305d:\t48 8b 05 bc 57 00 00 \tmov 0x57bc(%rip),%rax # 408820 &lt;rand_div&gt;<br> 403064:\t48 39 c2 \tcmp %rax,%rdx<br> 403067:\t74 05 \tje 40306e &lt;phase_3_5+0x6d&gt;<br> 403069:\te8 88 2b 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 40306e:\tbf c8 00 00 00 \tmov $0xc8,%edi<br> 403073:\te8 35 e6 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 403078:\t8b 45 f4 \tmov -0xc(%rbp),%eax<br> 40307b:\t83 f8 07 \tcmp $0x7,%eax<br> 40307e:\t0f 87 eb 00 00 00 \tja 40316f &lt;phase_3_5+0x16e&gt;<br> 403084:\t89 c0 \tmov %eax,%eax<br> 403086:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx<br> 40308d:\t00 <br> 40308e:\t48 8d 05 9f 36 00 00 \tlea 0x369f(%rip),%rax # 406734 &lt;_IO_stdin_used+0x734&gt;<br> 403095:\t8b 04 02 \tmov (%rdx,%rax,1),%eax<br> 403098:\t48 98 \tcltq<br> 40309a:\t48 8d 15 93 36 00 00 \tlea 0x3693(%rip),%rdx # 406734 &lt;_IO_stdin_used+0x734&gt;<br> 4030a1:\t48 01 d0 \tadd %rdx,%rax<br> 4030a4:\t3e ff e0 \tnotrack jmp *%rax<br> 4030a7:\t48 8b 05 72 57 00 00 \tmov 0x5772(%rip),%rax # 408820 &lt;rand_div&gt;<br> 4030ae:\t89 c2 \tmov %eax,%edx<br> 4030b0:\t8b 45 fc \tmov -0x4(%rbp),%eax<br> 4030b3:\t01 d0 \tadd %edx,%eax<br> 4030b5:\t89 45 fc \tmov %eax,-0x4(%rbp)<br> 4030b8:\tbf c8 00 00 00 \tmov $0xc8,%edi<br> 4030bd:\te8 eb e5 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> ...<br> 403174:\t8b 45 f0 \tmov -0x10(%rbp),%eax<br> 403177:\t39 45 fc \tcmp %eax,-0x4(%rbp) # 注意这里<br> 40317a:\t74 05 \tje 403181 &lt;phase_3_5+0x180&gt;<br> 40317c:\te8 75 2a 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 403181:\t90 \tnop<br> 403182:\tc9 \tleave<br> 403183:\tc3 \tret<br><br></code></pre></td></tr></table></figure>\n<p>看起来一大堆很吓人对不对?实际上确实很吓人。</p>\n<p>但是发现其中玄机后其实简单的没边,最终答案就藏在<code>0x403177</code>里面,前提是确保这一步前炸弹不爆炸(意识到要爆炸了直接<code>run</code>一下重开qwq。</p>\n<hr>\n<h3 id=\"动态调试-2\"><a href=\"#动态调试-2\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>阅读<code>Phase_3_5</code>发现这一关其实需要两个输入,并且第一个输入必须是<code>rand_div</code>,这里建议通过<code>si</code>单步执行监控好<code>rand_div</code>值变化,确定正确结果后使用<code>run</code>重开正确输入第一个密码后才能进行下一步求解:</p>\n<figure class=\"highlight plaintext\"><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><code class=\"hljs lldb\">(lldb) si<br>Process 13376 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x000000000040317a bomb_linux`phase_3_5 + 377<br>bomb_linux`phase_3_5:<br>-&gt; 0x40317a &lt;+377&gt;: je 0x403181 ; &lt;+384&gt;<br> 0x40317c &lt;+379&gt;: callq 0x405bf6 ; explode_bomb<br> 0x403181 &lt;+384&gt;: nop<br> 0x403182 &lt;+385&gt;: leave<br>(lldb) x/wx $rbp-0x4<br>0x7fffffffdb0c: 0xffffffd7<br></code></pre></td></tr></table></figure>\n<p>例如这里我可以打印出第二个值结合第一个值得到第三关正确结果。</p>\n<hr>\n<h2 id=\"Phase-4\"><a href=\"#Phase-4\" class=\"headerlink\" title=\"Phase_4\"></a><strong>Phase_4</strong></h2><h3 id=\"静态分析-3\"><a href=\"#静态分析-3\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>本题依旧开局跳转,笔者的跳转方向是<code>phase_4_01</code>,如何跳转不再强调关注<code>rand_div</code>的值即可下面请D指导解读一下<code>phase_4_01</code>的内容:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000404895 &lt;phase_4_01&gt;:<br> ; 函数入口,初始化栈帧<br> 404895:\tf3 0f 1e fa \tendbr64 <br> 404899:\t55 \tpush %rbp<br> 40489a:\t48 89 e5 \tmov %rsp,%rbp<br> 40489d:\t48 83 ec 70 \tsub $0x70,%rsp ; 分配栈空间<br><br> ; 初始化斐波那契数组F(10)~F(24)的十六进制值)<br> 4048a1:\t48 89 7d 98 \tmov %rdi,-0x68(%rbp) ; 保存输入字符串指针<br> 4048a5:\tc7 45 b0 37 00 00 00 \tmovl $0x37,-0x50(%rbp) ; F(10)=55<br> 4048ac:\tc7 45 b4 59 00 00 00 \tmovl $0x59,-0x4c(%rbp) ; F(11)=89<br> 4048b3:\tc7 45 b8 90 00 00 00 \tmovl $0x90,-0x48(%rbp) ; F(12)=144<br> 4048ba:\tc7 45 bc e9 00 00 00 \tmovl $0xe9,-0x44(%rbp) ; F(13)=233<br> 4048c1:\tc7 45 c0 79 01 00 00 \tmovl $0x179,-0x40(%rbp) ; F(14)=377<br> 4048c8:\tc7 45 c4 62 02 00 00 \tmovl $0x262,-0x3c(%rbp) ; F(15)=610<br> 4048cf:\tc7 45 c8 db 03 00 00 \tmovl $0x3db,-0x38(%rbp) ; F(16)=987<br> 4048d6:\tc7 45 cc 3d 06 00 00 \tmovl $0x63d,-0x34(%rbp) ; F(17)=1597<br> 4048dd:\tc7 45 d0 18 0a 00 00 \tmovl $0xa18,-0x30(%rbp) ; F(18)=2584<br> 4048e4:\tc7 45 d4 55 10 00 00 \tmovl $0x1055,-0x2c(%rbp) ; F(19)=4181<br> 4048eb:\tc7 45 d8 6d 1a 00 00 \tmovl $0x1a6d,-0x28(%rbp) ; F(20)=6765<br> 4048f2:\tc7 45 dc c2 2a 00 00 \tmovl $0x2ac2,-0x24(%rbp) ; F(21)=10946<br> 4048f9:\tc7 45 e0 2f 45 00 00 \tmovl $0x452f,-0x20(%rbp) ; F(22)=17711<br> 404900:\tc7 45 e4 f1 6f 00 00 \tmovl $0x6ff1,-0x1c(%rbp) ; F(23)=28657<br> 404907:\tc7 45 e8 20 b5 00 00 \tmovl $0xb520,-0x18(%rbp) ; F(24)=46368<br><br> ; 读取输入到局部变量(格式为&quot;%d&quot;<br> 40490e:\t48 8d 55 ac \tlea -0x54(%rbp),%rdx ; 输入存储地址<br> 404912:\t48 8b 45 98 \tmov -0x68(%rbp),%rax ; 输入字符串<br> 404916:\t48 8d 0d 93 1f 00 00 \tlea 0x1f93(%rip),%rcx ; 格式字符串&quot;%d&quot;<br> 40491d:\t48 89 ce \tmov %rcx,%rsi<br> 404920:\t48 89 c7 \tmov %rax,%rdi<br> 404923:\tb8 00 00 00 00 \tmov $0x0,%eax<br> 404928:\te8 63 c8 ff ff \tcall 401190 &lt;__isoc99_sscanf@plt&gt;<br><br> ; 验证输入有效性必须为1个正数<br> 40492d:\t89 45 fc \tmov %eax,-0x4(%rbp) ; sscanf返回值<br> 404930:\t83 7d fc 01 \tcmpl $0x1,-0x4(%rbp) ; 检查是否读取1个参数<br> 404934:\t75 07 \tjne 40493d &lt;phase_4_01+0xa8&gt; ; 失败则爆炸<br> 404936:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 获取输入值N<br> 404939:\t85 c0 \ttest %eax,%eax ; 检查N &gt; 0<br> 40493b:\t7f 05 \tjg 404942 &lt;phase_4_01+0xad&gt;<br> 40493d:\te8 b4 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br><br> ; 检查输入值上限(必须 &gt; 1999<br> 404942:\t8b 45 ac \tmov -0x54(%rbp),%eax <br> 404945:\t3d cf 07 00 00 \tcmp $0x7cf,%eax ; 1999的十六进制<br> 40494a:\t7f 05 \tjg 404951 &lt;phase_4_01+0xbc&gt; ; N &gt; 1999?<br> 40494c:\te8 a5 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br><br> ; 计算 N/2000通过定点数乘法优化<br> 404951:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 输入值N<br> 404954:\t48 63 d0 \tmovslq %eax,%rdx ; 符号扩展<br> 404957:\t48 69 d2 d3 4d 62 10 \timul $0x10624dd3,%rdx,%rdx ; 乘以274877907(≈2^32/2000)<br> 40495e:\t48 c1 ea 20 \tshr $0x20,%rdx ; 取高32位<br> 404962:\tc1 fa 07 \tsar $0x7,%edx ; 算术右移7位 → N/2000<br> 404965:\tc1 f8 1f \tsar $0x1f,%eax ; 符号位扩展<br> 404968:\t89 c1 \tmov %eax,%ecx <br> 40496a:\t89 d0 \tmov %edx,%eax <br> 40496c:\t29 c8 \tsub %ecx,%eax ; 处理负数情况<br> 40496e:\t89 45 ac \tmov %eax,-0x54(%rbp) ; 保存k = N/2000<br><br> ; 调用递归函数func4_0(k), 这个函数用于计算斐波那契数列<br> 404971:\t8b 45 ac \tmov -0x54(%rbp),%eax <br> 404974:\t89 c7 \tmov %eax,%edi ; 参数k<br> 404976:\te8 ce fd ff ff \tcall 404749 &lt;func4_0&gt; ; 返回值eax=F(k+1)<br> 40497b:\t89 45 f8 \tmov %eax,-0x8(%rbp) ; 保存结果<br><br> ; 生成随机索引并验证结果<br> 40497e:\tbf 0f 00 00 00 \tmov $0xf,%edi ; 参数15<br> 404983:\te8 25 cd ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt; ; 生成0~14随机数<br> 404988:\t48 8b 05 91 3e 00 00 \tmov 0x3e91(%rip),%rax # 408820 &lt;rand_div&gt; ; 获取随机索引<br> 40498f:\t8b 44 85 b0 \tmov -0x50(%rbp,%rax,4),%eax ; 取数组[rand_div]的值<br> 404993:\t39 45 f8 \tcmp %eax,-0x8(%rbp) ; 比较func4_0(k) == 数组值?<br> 404996:\t74 05 \tje 40499d &lt;phase_4_01+0x108&gt;<br> 404998:\te8 59 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br></code></pre></td></tr></table></figure>\n<p>所以相对还是很明了的,依旧是关注<code>rand_div</code>。</p>\n<h3 id=\"动态调试-3\"><a href=\"#动态调试-3\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>先找出<code>rand_div</code>在最后判断前的取值比如我下面的0xa</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs lldb\">(lldb) si<br>Process 27027 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x0000000000401719 bomb_linux`GenerateRandomNumber + 108<br>bomb_linux`GenerateRandomNumber:<br>-&gt; 0x401719 &lt;+108&gt;: movq %rax, 0x7100(%rip) ; rand_div<br> 0x401720 &lt;+115&gt;: jmp 0x401723 ; &lt;+118&gt;<br> 0x401722 &lt;+117&gt;: nop<br> 0x401723 &lt;+118&gt;: popq %rbp<br>(lldb) si<br>Process 27027 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x0000000000401720 bomb_linux`GenerateRandomNumber + 115<br>bomb_linux`GenerateRandomNumber:<br>-&gt; 0x401720 &lt;+115&gt;: jmp 0x401723 ; &lt;+118&gt;<br> 0x401722 &lt;+117&gt;: nop<br> 0x401723 &lt;+118&gt;: popq %rbp<br> 0x401724 &lt;+119&gt;: retq<br>(lldb) x/gx &amp;rand_div<br>0x00408820: 0x000000000000000a<br></code></pre></td></tr></table></figure>\n\n<p>而当 <code>rand_div = 0xa</code>(即十进制 <strong>10</strong>)时,输入值 <code>N</code> 的计算步骤如下:</p>\n<ul>\n<li><p>数组索引 <strong>10</strong> 的值是 <strong>斐波那契数列第 20 项</strong><code>F(20) = 6765</code>)。</p>\n</li>\n<li><p><code>func4_0(k)</code> 实际计算的是 <strong>标准斐波那契数列的第 <code>k+1</code> 项</strong>(例如,<code>func4_0(0) = 1 = F(2)</code> 需要满足:</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs c\">func4_0(k) = F(k+<span class=\"hljs-number\">1</span>) = F(<span class=\"hljs-number\">20</span>)<br></code></pre></td></tr></table></figure>\n<p>解得:<br>k + 1 &#x3D; 20 → k &#x3D; 19</p>\n</li>\n<li><p><code>k = N / 2000</code> → <code>N = 2000 * k = 2000 * 19 = 38000</code>.<br>从而得解。<br><img src=\"/images/phase_4.png\" alt=\"phase_4\"></p>\n</li>\n</ul>\n<hr>\n<h2 id=\"Phase-Impossible\"><a href=\"#Phase-Impossible\" class=\"headerlink\" title=\"Phase_Impossible\"></a><strong>Phase_Impossible</strong></h2><p>Impossible</p>\n<p>从这道题开始偷懒了掏出ghidra直接看c代码了解一下大概流程再去objdump看汇编</p>\n<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><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></pre></td><td class=\"code\"><pre><code class=\"hljs c\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title function_\">phase_impossible</span><span class=\"hljs-params\">(<span class=\"hljs-type\">char</span> *param_1)</span><br><br>&#123;<br> <span class=\"hljs-type\">int</span> iVar1;<br> <span class=\"hljs-type\">size_t</span> sVar2;<br> undefined local_118 [<span class=\"hljs-number\">256</span>];<br> <span class=\"hljs-type\">long</span> local_18;<br> <span class=\"hljs-type\">long</span> local_10;<br> <br> local_10 = GetTickCount();<br> sVar2 = <span class=\"hljs-built_in\">strlen</span>(param_1);<br> <span class=\"hljs-keyword\">if</span> ((sVar2 &lt; <span class=\"hljs-number\">10</span>) || (sVar2 = <span class=\"hljs-built_in\">strlen</span>(param_1), <span class=\"hljs-number\">0x300</span> &lt; sVar2)) &#123;<br> explode_bomb();<br> &#125;<br> <span class=\"hljs-built_in\">memset</span>(local_118,<span class=\"hljs-number\">0</span>,<span class=\"hljs-number\">0x100</span>);<br> tohex(local_118,param_1);<br> GenerateRandomNumber(<span class=\"hljs-number\">0x400</span>);<br> iVar1 = check_buf_valid(local_118,rand_div &amp; <span class=\"hljs-number\">0xffffffff</span>);<br> <span class=\"hljs-keyword\">if</span> (iVar1 == <span class=\"hljs-number\">0</span>) &#123;<br> <span class=\"hljs-built_in\">puts</span>(&amp;DAT_00406518);<br> explode_bomb();<br> &#125;<br> GenerateRandomNumber(<span class=\"hljs-number\">3</span>);<br> <span class=\"hljs-keyword\">if</span> (rand_div != <span class=\"hljs-number\">2</span>) &#123;<br> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">2</span> &lt; rand_div) <span class=\"hljs-keyword\">goto</span> LAB_00401891;<br> <span class=\"hljs-keyword\">if</span> (rand_div == <span class=\"hljs-number\">0</span>) &#123;<br> goto_buf_0(local_118);<br> &#125;<br> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (rand_div != <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">goto</span> LAB_00401891;<br> goto_buf_1(local_118);<br> &#125;<br> goto_buf_2(local_118);<br>LAB_00401891:<br> explode_bomb();<br> GenerateRandomNumber(<span class=\"hljs-number\">0x400</span>);<br> <span class=\"hljs-keyword\">if</span> ((<span class=\"hljs-type\">long</span>)(<span class=\"hljs-type\">int</span>)result != rand_div) &#123;<br> <span class=\"hljs-built_in\">printf</span>(&amp;DAT_00406560,rand_div,(ulong)result);<br> explode_bomb();<br> &#125;<br> local_18 = GetTickCount();<br> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">1000</span> &lt; (ulong)(local_18 - local_10)) &#123;<br> <span class=\"hljs-built_in\">puts</span>(&amp;DAT_004065a8);<br> explode_bomb();<br> &#125;<br> <span class=\"hljs-keyword\">return</span>;<br>&#125;<br></code></pre></td></tr></table></figure>\n<p>最终任务还是很明确的,需要写一段机器码修改<code>result</code>的数值,但是注意要能通过<code>check_buf_valid</code>检测,并且最后指令必须是跳转到<code>0x401896</code>不然就会触发<code>phase_impossible</code>中<code>0x401891</code>处的<code>explode_bomb</code>函数,唯一的难点是跟踪<code>rand_div</code>的数值变化,建议使用<code>register write</code>来修改<code>check_buf_valid</code>的返回值使其强制通过然后监控<code>rand_div</code>每一次的数值变化(<code>x/gx &amp;rand_div</code>),记录好<code>rand_div</code>的结果后开始指令设计,需要满足:</p>\n<ul>\n<li>指令的异或和为<code>rand_div</code>第一次的数值末尾八位以通过检查;</li>\n<li>修改<code>result</code>使其数值等于<code>rand_div</code>第三次数值;</li>\n<li>跳转到<code>0x401896</code>避免炸弹;</li>\n</ul>\n<p> 如果前几问都完成了到这里应该是没有问题的。</p>\n<hr>\n<h2 id=\"Phase-Secret\"><a href=\"#Phase-Secret\" class=\"headerlink\" title=\"Phase_Secret\"></a><strong>Phase_Secret</strong></h2><p>隐藏彩蛋,并非隐藏。汇编里写的非常清楚:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000401a8b &lt;phase_secret&gt;:<br> 401a8b:\tf3 0f 1e fa \tendbr64<br> 401a8f:\t55 \tpush %rbp<br> 401a90:\t48 89 e5 \tmov %rsp,%rbp<br> 401a93:\t48 83 ec 10 \tsub $0x10,%rsp<br> 401a97:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)<br> 401a9b:\t48 8d 05 26 4b 00 00 \tlea 0x4b26(%rip),%rax # 4065c8 &lt;_IO_stdin_used+0x5c8&gt;<br> 401aa2:\t48 89 c7 \tmov %rax,%rdi<br> 401aa5:\te8 76 f6 ff ff \tcall 401120 &lt;puts@plt&gt;<br> 401aaa:\t90 \tnop<br> 401aab:\tc9 \tleave<br> 401aac:\tc3 \tret<br></code></pre></td></tr></table></figure>\n<p>注意到这段指令在原程序中完全没有执行说明是需要用户自己跳转的,也非常简单只需要在<code>phase_5</code>中设计指令时加一个要求跳转到<code>0x401a8b</code>即可。</p>\n<p>完结<br><img src=\"/images/caseclosed.png\" alt=\"Case Closed\"></p>\n","excerpt":"","more":"<p>这篇文章记录高地CSAPP课程Bomblab实验操作流程仅供参考交流答案是随机生成的和学号相关。</p>\n<p>笔者实验环境为Archlinux&#x2F;CachyOS使用lldb作为调试器和gdb操作差不多其余用到的工具主要为objdumpstringsneovim&#x2F;helix和zellij全程开源环境不使用IDA。</p>\n<h2 id=\"Phase-1\"><a href=\"#Phase-1\" class=\"headerlink\" title=\"Phase_1\"></a><strong>Phase_1</strong></h2><h3 id=\"静态分析\"><a href=\"#静态分析\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><h4 id=\"strings扫描\"><a href=\"#strings扫描\" class=\"headerlink\" title=\"strings扫描\"></a><strong><code>strings</code>扫描</strong></h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">strings bomb_linux<br></code></pre></td></tr></table></figure>\n<p>先用strings寻找可能与<code>phase_1</code>相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。<br><img src=\"/images/phase1_strings.png\" alt=\"strings\"></p>\n<ul>\n<li>结果没有明文密码无法直接秒掉第一问,可惜。</li>\n<li>但是找到<code>GenerateRandomString</code>函数可能与密码生成相关。</li>\n</ul>\n<h4 id=\"用objdump反汇编\"><a href=\"#用objdump反汇编\" class=\"headerlink\" title=\"用objdump反汇编\"></a><strong>用<code>objdump</code>反汇编</strong></h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">objdump -d bomb_linux &gt; bomb.asm<br></code></pre></td></tr></table></figure>\n<p>搜索<code>GenerateRandomString</code>和<code>phase_1</code>函数的汇编代码。<br> <figure class=\"highlight plaintext\"><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><code class=\"hljs assembly\">401b53 &lt;phase_1&gt;:<br> 401b53: endbr64<br> 401b57: push %rbp<br> 401b58: mov %rsp,%rbp<br> 401b5b: sub $0x20,%rsp<br> 401b5f: mov %rdi,-0x18(%rbp)<br> 401b63: lea -0xb(%rbp),%rax<br> 401b67: mov %rax,%rdi<br> 401b6a: callq 401ac1 &lt;GenerateRandomString&gt; # 调用密码生成函数<br> 401b6f: lea -0xb(%rbp),%rdx # 生成的字符串地址%rbp-0xb存入%rdx即密码存储位置<br> 401b73: mov -0x18(%rbp),%rax<br> 401b77: mov %rdx,%rsi<br> 401b7a: mov %rax,%rdi<br> 401b7d: callq 401c0c &lt;string_compare&gt; # 调用字符串比较函数<br> 401b82: test %eax,%eax<br> 401b84: je 401b8d &lt;phase_1+0x3a&gt;<br> 401b86: callq 401d67 &lt;explode_bomb&gt; # 比较失败则引爆炸弹<br></code></pre></td></tr></table></figure></p>\n<ul>\n<li><code>phase_1</code>调用<code>GenerateRandomString</code>生成一个字符串。</li>\n<li>用户输入的字符串需要与此生成的字符串完全匹配。</li>\n</ul>\n<hr>\n<h3 id=\"动态调试\"><a href=\"#动态调试\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p><img src=\"/images/phase1.png\" alt=\"phase_1\"><br>下面是phase_1求解的完整流程</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs lldb\">lldb bomb_linux &lt;你的学号后六位&gt;<br>(lldb) b phase_1 # 在phase_1入口断点<br>(lldb) run # 从入口开始执行<br>请输入第1级的密码114514 # 随便输入触发断点<br>(lldb) b 0x401b6f # 在GenerateRandomString返回后断点<br>(lldb) continue # 继续执行<br>(lldb) x/s $rbp - 0xb # 计算字符串地址(-0xb偏移量<br>0x7fffffffdaf5: &quot;mJHurpQZtY&quot; # 轻松拿下,这里是根据学号伪随机生成的哦<br></code></pre></td></tr></table></figure>\n<p>将得到的密码保存入bomb_&lt;学号后六位&gt;.txt即可避免后续重复输入。</p>\n<hr>\n<h2 id=\"Phase-2\"><a href=\"#Phase-2\" class=\"headerlink\" title=\"Phase_2\"></a><strong>Phase_2</strong></h2><h3 id=\"静态分析-1\"><a href=\"#静态分析-1\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>这道题目还是比较一目了然的,观察<code>phase_2</code>代码不难发现其实构建了一张跳转表:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000401b8e &lt;phase_2&gt;:<br> 401b8e:\tf3 0f 1e fa \tendbr64<br> 401b92:\t55 \tpush %rbp<br> 401b93:\t48 89 e5 \tmov %rsp,%rbp<br> 401b96:\t48 83 ec 10 \tsub $0x10,%rsp<br> 401b9a:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)<br> 401b9e:\tbf 10 00 00 00 \tmov $0x10,%edi<br> 401ba3:\te8 05 fb ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 401ba8:\t48 8b 05 71 6c 00 00 \tmov 0x6c71(%rip),%rax # 408820 &lt;rand_div&gt;<br> 401baf:\t48 83 f8 0f \tcmp $0xf,%rax<br> 401bb3:\t0f 87 16 01 00 00 \tja 401ccf &lt;phase_2+0x141&gt;<br> 401bb9:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx<br> 401bc0:\t00 <br> 401bc1:\t48 8d 05 4c 4a 00 00 \tlea 0x4a4c(%rip),%rax # 406614 &lt;_IO_stdin_used+0x614&gt;<br> 401bc8:\t8b 04 02 \tmov (%rdx,%rax,1),%eax<br> 401bcb:\t48 98 \tcltq<br> 401bcd:\t48 8d 15 40 4a 00 00 \tlea 0x4a40(%rip),%rdx # 406614 &lt;_IO_stdin_used+0x614&gt;<br> 401bd4:\t48 01 d0 \tadd %rdx,%rax<br> 401bd7:\t3e ff e0 \tnotrack jmp *%rax<br> 401bda:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401bde:\t48 89 c7 \tmov %rax,%rdi<br> 401be1:\te8 f2 00 00 00 \tcall 401cd8 &lt;phase_2_0&gt;<br> 401be6:\te9 ea 00 00 00 \tjmp 401cd5 &lt;phase_2+0x147&gt;<br> 401beb:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401bef:\t48 89 c7 \tmov %rax,%rdi<br> 401bf2:\te8 8b 01 00 00 \tcall 401d82 &lt;phase_2_1&gt;<br> 401bf7:\te9 d9 00 00 00 \tjmp 401cd5 &lt;phase_2+0x147&gt;<br> 401bfc:\t48 8b 45 f8 \tmov -0x8(%rbp),%rax<br> 401c00:\t48 89 c7 \tmov %rax,%rdi<br> ...<br></code></pre></td></tr></table></figure>\n<p>这里面需要注意的关键点是rand_div它会决定你的跳转方向而你的学号又决定了它的取值。然后是<code>GenerateRandomNumber</code>这个函数的原理需要了解一下,而这个函数将在跳转前后分别调用一次,第一次决定你的跳转方向,第二次则决定了你的密码线索。</p>\n<hr>\n<h3 id=\"动态调试-1\"><a href=\"#动态调试-1\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>理解原理就没什么难度了,自己找几个断点打好然后关注一下<code>rand_div</code>的值就好,观察自己的学号向哪个函数跳转并理解相应函数计算即可,比如我这里向<code>phase_2_14</code>跳转:<br><img src=\"/images/phase_2_14.png\" alt=\"phase_2_14\"></p>\n<p>而除了<code>phase_2_14</code>还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。</p>\n<hr>\n<h2 id=\"Phase-3\"><a href=\"#Phase-3\" class=\"headerlink\" title=\"Phase_3\"></a><strong>Phase_3</strong></h2><h3 id=\"静态分析-2\"><a href=\"#静态分析-2\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>和Phase_2一样开局先跳转尽可能防止同学们答案雷同互相帮助bushi</p>\n<p>本体其实没有什么好说的,这里我跳转的方向是<code>Phase_3_5</code>简要解释一下可供参考:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000403001 &lt;phase_3_5&gt;:<br> 403001:\tf3 0f 1e fa \tendbr64<br> 403005:\t55 \tpush %rbp<br> 403006:\t48 89 e5 \tmov %rsp,%rbp<br> 403009:\t48 83 ec 20 \tsub $0x20,%rsp<br> 40300d:\t48 89 7d e8 \tmov %rdi,-0x18(%rbp)<br> 403011:\tc7 45 fc 00 00 00 00 \tmovl $0x0,-0x4(%rbp)<br> 403018:\tc7 45 f8 00 00 00 00 \tmovl $0x0,-0x8(%rbp)<br> 40301f:\t48 8d 4d f0 \tlea -0x10(%rbp),%rcx<br> 403023:\t48 8d 55 f4 \tlea -0xc(%rbp),%rdx<br> 403027:\t48 8b 45 e8 \tmov -0x18(%rbp),%rax<br> 40302b:\t48 8d 35 5a 36 00 00 \tlea 0x365a(%rip),%rsi # 40668c &lt;_IO_stdin_used+0x68c&gt;<br> 403032:\t48 89 c7 \tmov %rax,%rdi<br> 403035:\tb8 00 00 00 00 \tmov $0x0,%eax<br> 40303a:\te8 51 e1 ff ff \tcall 401190 &lt;__isoc99_sscanf@plt&gt;<br> 40303f:\t89 45 f8 \tmov %eax,-0x8(%rbp)<br> 403042:\t83 7d f8 01 \tcmpl $0x1,-0x8(%rbp)<br> 403046:\t7f 05 \tjg 40304d &lt;phase_3_5+0x4c&gt;<br> 403048:\te8 a9 2b 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 40304d:\tbf 08 00 00 00 \tmov $0x8,%edi<br> 403052:\te8 56 e6 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 403057:\t8b 45 f4 \tmov -0xc(%rbp),%eax<br> 40305a:\t48 63 d0 \tmovslq %eax,%rdx<br> 40305d:\t48 8b 05 bc 57 00 00 \tmov 0x57bc(%rip),%rax # 408820 &lt;rand_div&gt;<br> 403064:\t48 39 c2 \tcmp %rax,%rdx<br> 403067:\t74 05 \tje 40306e &lt;phase_3_5+0x6d&gt;<br> 403069:\te8 88 2b 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 40306e:\tbf c8 00 00 00 \tmov $0xc8,%edi<br> 403073:\te8 35 e6 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> 403078:\t8b 45 f4 \tmov -0xc(%rbp),%eax<br> 40307b:\t83 f8 07 \tcmp $0x7,%eax<br> 40307e:\t0f 87 eb 00 00 00 \tja 40316f &lt;phase_3_5+0x16e&gt;<br> 403084:\t89 c0 \tmov %eax,%eax<br> 403086:\t48 8d 14 85 00 00 00 \tlea 0x0(,%rax,4),%rdx<br> 40308d:\t00 <br> 40308e:\t48 8d 05 9f 36 00 00 \tlea 0x369f(%rip),%rax # 406734 &lt;_IO_stdin_used+0x734&gt;<br> 403095:\t8b 04 02 \tmov (%rdx,%rax,1),%eax<br> 403098:\t48 98 \tcltq<br> 40309a:\t48 8d 15 93 36 00 00 \tlea 0x3693(%rip),%rdx # 406734 &lt;_IO_stdin_used+0x734&gt;<br> 4030a1:\t48 01 d0 \tadd %rdx,%rax<br> 4030a4:\t3e ff e0 \tnotrack jmp *%rax<br> 4030a7:\t48 8b 05 72 57 00 00 \tmov 0x5772(%rip),%rax # 408820 &lt;rand_div&gt;<br> 4030ae:\t89 c2 \tmov %eax,%edx<br> 4030b0:\t8b 45 fc \tmov -0x4(%rbp),%eax<br> 4030b3:\t01 d0 \tadd %edx,%eax<br> 4030b5:\t89 45 fc \tmov %eax,-0x4(%rbp)<br> 4030b8:\tbf c8 00 00 00 \tmov $0xc8,%edi<br> 4030bd:\te8 eb e5 ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt;<br> ...<br> 403174:\t8b 45 f0 \tmov -0x10(%rbp),%eax<br> 403177:\t39 45 fc \tcmp %eax,-0x4(%rbp) # 注意这里<br> 40317a:\t74 05 \tje 403181 &lt;phase_3_5+0x180&gt;<br> 40317c:\te8 75 2a 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br> 403181:\t90 \tnop<br> 403182:\tc9 \tleave<br> 403183:\tc3 \tret<br><br></code></pre></td></tr></table></figure>\n<p>看起来一大堆很吓人对不对?实际上确实很吓人。</p>\n<p>但是发现其中玄机后其实简单的没边,最终答案就藏在<code>0x403177</code>里面,前提是确保这一步前炸弹不爆炸(意识到要爆炸了直接<code>run</code>一下重开qwq。</p>\n<hr>\n<h3 id=\"动态调试-2\"><a href=\"#动态调试-2\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>阅读<code>Phase_3_5</code>发现这一关其实需要两个输入,并且第一个输入必须是<code>rand_div</code>,这里建议通过<code>si</code>单步执行监控好<code>rand_div</code>值变化,确定正确结果后使用<code>run</code>重开正确输入第一个密码后才能进行下一步求解:</p>\n<figure class=\"highlight plaintext\"><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><code class=\"hljs lldb\">(lldb) si<br>Process 13376 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x000000000040317a bomb_linux`phase_3_5 + 377<br>bomb_linux`phase_3_5:<br>-&gt; 0x40317a &lt;+377&gt;: je 0x403181 ; &lt;+384&gt;<br> 0x40317c &lt;+379&gt;: callq 0x405bf6 ; explode_bomb<br> 0x403181 &lt;+384&gt;: nop<br> 0x403182 &lt;+385&gt;: leave<br>(lldb) x/wx $rbp-0x4<br>0x7fffffffdb0c: 0xffffffd7<br></code></pre></td></tr></table></figure>\n<p>例如这里我可以打印出第二个值结合第一个值得到第三关正确结果。</p>\n<hr>\n<h2 id=\"Phase-4\"><a href=\"#Phase-4\" class=\"headerlink\" title=\"Phase_4\"></a><strong>Phase_4</strong></h2><h3 id=\"静态分析-3\"><a href=\"#静态分析-3\" class=\"headerlink\" title=\"静态分析\"></a><strong>静态分析</strong></h3><p>本题依旧开局跳转,笔者的跳转方向是<code>phase_4_01</code>,如何跳转不再强调关注<code>rand_div</code>的值即可下面请D指导解读一下<code>phase_4_01</code>的内容:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000404895 &lt;phase_4_01&gt;:<br> ; 函数入口,初始化栈帧<br> 404895:\tf3 0f 1e fa \tendbr64 <br> 404899:\t55 \tpush %rbp<br> 40489a:\t48 89 e5 \tmov %rsp,%rbp<br> 40489d:\t48 83 ec 70 \tsub $0x70,%rsp ; 分配栈空间<br><br> ; 初始化斐波那契数组F(10)~F(24)的十六进制值)<br> 4048a1:\t48 89 7d 98 \tmov %rdi,-0x68(%rbp) ; 保存输入字符串指针<br> 4048a5:\tc7 45 b0 37 00 00 00 \tmovl $0x37,-0x50(%rbp) ; F(10)=55<br> 4048ac:\tc7 45 b4 59 00 00 00 \tmovl $0x59,-0x4c(%rbp) ; F(11)=89<br> 4048b3:\tc7 45 b8 90 00 00 00 \tmovl $0x90,-0x48(%rbp) ; F(12)=144<br> 4048ba:\tc7 45 bc e9 00 00 00 \tmovl $0xe9,-0x44(%rbp) ; F(13)=233<br> 4048c1:\tc7 45 c0 79 01 00 00 \tmovl $0x179,-0x40(%rbp) ; F(14)=377<br> 4048c8:\tc7 45 c4 62 02 00 00 \tmovl $0x262,-0x3c(%rbp) ; F(15)=610<br> 4048cf:\tc7 45 c8 db 03 00 00 \tmovl $0x3db,-0x38(%rbp) ; F(16)=987<br> 4048d6:\tc7 45 cc 3d 06 00 00 \tmovl $0x63d,-0x34(%rbp) ; F(17)=1597<br> 4048dd:\tc7 45 d0 18 0a 00 00 \tmovl $0xa18,-0x30(%rbp) ; F(18)=2584<br> 4048e4:\tc7 45 d4 55 10 00 00 \tmovl $0x1055,-0x2c(%rbp) ; F(19)=4181<br> 4048eb:\tc7 45 d8 6d 1a 00 00 \tmovl $0x1a6d,-0x28(%rbp) ; F(20)=6765<br> 4048f2:\tc7 45 dc c2 2a 00 00 \tmovl $0x2ac2,-0x24(%rbp) ; F(21)=10946<br> 4048f9:\tc7 45 e0 2f 45 00 00 \tmovl $0x452f,-0x20(%rbp) ; F(22)=17711<br> 404900:\tc7 45 e4 f1 6f 00 00 \tmovl $0x6ff1,-0x1c(%rbp) ; F(23)=28657<br> 404907:\tc7 45 e8 20 b5 00 00 \tmovl $0xb520,-0x18(%rbp) ; F(24)=46368<br><br> ; 读取输入到局部变量(格式为&quot;%d&quot;<br> 40490e:\t48 8d 55 ac \tlea -0x54(%rbp),%rdx ; 输入存储地址<br> 404912:\t48 8b 45 98 \tmov -0x68(%rbp),%rax ; 输入字符串<br> 404916:\t48 8d 0d 93 1f 00 00 \tlea 0x1f93(%rip),%rcx ; 格式字符串&quot;%d&quot;<br> 40491d:\t48 89 ce \tmov %rcx,%rsi<br> 404920:\t48 89 c7 \tmov %rax,%rdi<br> 404923:\tb8 00 00 00 00 \tmov $0x0,%eax<br> 404928:\te8 63 c8 ff ff \tcall 401190 &lt;__isoc99_sscanf@plt&gt;<br><br> ; 验证输入有效性必须为1个正数<br> 40492d:\t89 45 fc \tmov %eax,-0x4(%rbp) ; sscanf返回值<br> 404930:\t83 7d fc 01 \tcmpl $0x1,-0x4(%rbp) ; 检查是否读取1个参数<br> 404934:\t75 07 \tjne 40493d &lt;phase_4_01+0xa8&gt; ; 失败则爆炸<br> 404936:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 获取输入值N<br> 404939:\t85 c0 \ttest %eax,%eax ; 检查N &gt; 0<br> 40493b:\t7f 05 \tjg 404942 &lt;phase_4_01+0xad&gt;<br> 40493d:\te8 b4 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br><br> ; 检查输入值上限(必须 &gt; 1999<br> 404942:\t8b 45 ac \tmov -0x54(%rbp),%eax <br> 404945:\t3d cf 07 00 00 \tcmp $0x7cf,%eax ; 1999的十六进制<br> 40494a:\t7f 05 \tjg 404951 &lt;phase_4_01+0xbc&gt; ; N &gt; 1999?<br> 40494c:\te8 a5 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br><br> ; 计算 N/2000通过定点数乘法优化<br> 404951:\t8b 45 ac \tmov -0x54(%rbp),%eax ; 输入值N<br> 404954:\t48 63 d0 \tmovslq %eax,%rdx ; 符号扩展<br> 404957:\t48 69 d2 d3 4d 62 10 \timul $0x10624dd3,%rdx,%rdx ; 乘以274877907(≈2^32/2000)<br> 40495e:\t48 c1 ea 20 \tshr $0x20,%rdx ; 取高32位<br> 404962:\tc1 fa 07 \tsar $0x7,%edx ; 算术右移7位 → N/2000<br> 404965:\tc1 f8 1f \tsar $0x1f,%eax ; 符号位扩展<br> 404968:\t89 c1 \tmov %eax,%ecx <br> 40496a:\t89 d0 \tmov %edx,%eax <br> 40496c:\t29 c8 \tsub %ecx,%eax ; 处理负数情况<br> 40496e:\t89 45 ac \tmov %eax,-0x54(%rbp) ; 保存k = N/2000<br><br> ; 调用递归函数func4_0(k), 这个函数用于计算斐波那契数列<br> 404971:\t8b 45 ac \tmov -0x54(%rbp),%eax <br> 404974:\t89 c7 \tmov %eax,%edi ; 参数k<br> 404976:\te8 ce fd ff ff \tcall 404749 &lt;func4_0&gt; ; 返回值eax=F(k+1)<br> 40497b:\t89 45 f8 \tmov %eax,-0x8(%rbp) ; 保存结果<br><br> ; 生成随机索引并验证结果<br> 40497e:\tbf 0f 00 00 00 \tmov $0xf,%edi ; 参数15<br> 404983:\te8 25 cd ff ff \tcall 4016ad &lt;GenerateRandomNumber&gt; ; 生成0~14随机数<br> 404988:\t48 8b 05 91 3e 00 00 \tmov 0x3e91(%rip),%rax # 408820 &lt;rand_div&gt; ; 获取随机索引<br> 40498f:\t8b 44 85 b0 \tmov -0x50(%rbp,%rax,4),%eax ; 取数组[rand_div]的值<br> 404993:\t39 45 f8 \tcmp %eax,-0x8(%rbp) ; 比较func4_0(k) == 数组值?<br> 404996:\t74 05 \tje 40499d &lt;phase_4_01+0x108&gt;<br> 404998:\te8 59 12 00 00 \tcall 405bf6 &lt;explode_bomb&gt;<br></code></pre></td></tr></table></figure>\n<p>所以相对还是很明了的,依旧是关注<code>rand_div</code>。</p>\n<h3 id=\"动态调试-3\"><a href=\"#动态调试-3\" class=\"headerlink\" title=\"动态调试\"></a><strong>动态调试</strong></h3><p>先找出<code>rand_div</code>在最后判断前的取值比如我下面的0xa</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs lldb\">(lldb) si<br>Process 27027 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x0000000000401719 bomb_linux`GenerateRandomNumber + 108<br>bomb_linux`GenerateRandomNumber:<br>-&gt; 0x401719 &lt;+108&gt;: movq %rax, 0x7100(%rip) ; rand_div<br> 0x401720 &lt;+115&gt;: jmp 0x401723 ; &lt;+118&gt;<br> 0x401722 &lt;+117&gt;: nop<br> 0x401723 &lt;+118&gt;: popq %rbp<br>(lldb) si<br>Process 27027 stopped<br>* thread #1, name = &#x27;bomb_linux&#x27;, stop reason = instruction step into<br> frame #0: 0x0000000000401720 bomb_linux`GenerateRandomNumber + 115<br>bomb_linux`GenerateRandomNumber:<br>-&gt; 0x401720 &lt;+115&gt;: jmp 0x401723 ; &lt;+118&gt;<br> 0x401722 &lt;+117&gt;: nop<br> 0x401723 &lt;+118&gt;: popq %rbp<br> 0x401724 &lt;+119&gt;: retq<br>(lldb) x/gx &amp;rand_div<br>0x00408820: 0x000000000000000a<br></code></pre></td></tr></table></figure>\n\n<p>而当 <code>rand_div = 0xa</code>(即十进制 <strong>10</strong>)时,输入值 <code>N</code> 的计算步骤如下:</p>\n<ul>\n<li><p>数组索引 <strong>10</strong> 的值是 <strong>斐波那契数列第 20 项</strong><code>F(20) = 6765</code>)。</p>\n</li>\n<li><p><code>func4_0(k)</code> 实际计算的是 <strong>标准斐波那契数列的第 <code>k+1</code> 项</strong>(例如,<code>func4_0(0) = 1 = F(2)</code> 需要满足:</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs c\">func4_0(k) = F(k+<span class=\"hljs-number\">1</span>) = F(<span class=\"hljs-number\">20</span>)<br></code></pre></td></tr></table></figure>\n<p>解得:<br>k + 1 &#x3D; 20 → k &#x3D; 19</p>\n</li>\n<li><p><code>k = N / 2000</code> → <code>N = 2000 * k = 2000 * 19 = 38000</code>.<br>从而得解。<br><img src=\"/images/phase_4.png\" alt=\"phase_4\"></p>\n</li>\n</ul>\n<hr>\n<h2 id=\"Phase-Impossible\"><a href=\"#Phase-Impossible\" class=\"headerlink\" title=\"Phase_Impossible\"></a><strong>Phase_Impossible</strong></h2><p>Impossible</p>\n<p>从这道题开始偷懒了掏出ghidra直接看c代码了解一下大概流程再去objdump看汇编</p>\n<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><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></pre></td><td class=\"code\"><pre><code class=\"hljs c\"><span class=\"hljs-type\">void</span> <span class=\"hljs-title function_\">phase_impossible</span><span class=\"hljs-params\">(<span class=\"hljs-type\">char</span> *param_1)</span><br><br>&#123;<br> <span class=\"hljs-type\">int</span> iVar1;<br> <span class=\"hljs-type\">size_t</span> sVar2;<br> undefined local_118 [<span class=\"hljs-number\">256</span>];<br> <span class=\"hljs-type\">long</span> local_18;<br> <span class=\"hljs-type\">long</span> local_10;<br> <br> local_10 = GetTickCount();<br> sVar2 = <span class=\"hljs-built_in\">strlen</span>(param_1);<br> <span class=\"hljs-keyword\">if</span> ((sVar2 &lt; <span class=\"hljs-number\">10</span>) || (sVar2 = <span class=\"hljs-built_in\">strlen</span>(param_1), <span class=\"hljs-number\">0x300</span> &lt; sVar2)) &#123;<br> explode_bomb();<br> &#125;<br> <span class=\"hljs-built_in\">memset</span>(local_118,<span class=\"hljs-number\">0</span>,<span class=\"hljs-number\">0x100</span>);<br> tohex(local_118,param_1);<br> GenerateRandomNumber(<span class=\"hljs-number\">0x400</span>);<br> iVar1 = check_buf_valid(local_118,rand_div &amp; <span class=\"hljs-number\">0xffffffff</span>);<br> <span class=\"hljs-keyword\">if</span> (iVar1 == <span class=\"hljs-number\">0</span>) &#123;<br> <span class=\"hljs-built_in\">puts</span>(&amp;DAT_00406518);<br> explode_bomb();<br> &#125;<br> GenerateRandomNumber(<span class=\"hljs-number\">3</span>);<br> <span class=\"hljs-keyword\">if</span> (rand_div != <span class=\"hljs-number\">2</span>) &#123;<br> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">2</span> &lt; rand_div) <span class=\"hljs-keyword\">goto</span> LAB_00401891;<br> <span class=\"hljs-keyword\">if</span> (rand_div == <span class=\"hljs-number\">0</span>) &#123;<br> goto_buf_0(local_118);<br> &#125;<br> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (rand_div != <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">goto</span> LAB_00401891;<br> goto_buf_1(local_118);<br> &#125;<br> goto_buf_2(local_118);<br>LAB_00401891:<br> explode_bomb();<br> GenerateRandomNumber(<span class=\"hljs-number\">0x400</span>);<br> <span class=\"hljs-keyword\">if</span> ((<span class=\"hljs-type\">long</span>)(<span class=\"hljs-type\">int</span>)result != rand_div) &#123;<br> <span class=\"hljs-built_in\">printf</span>(&amp;DAT_00406560,rand_div,(ulong)result);<br> explode_bomb();<br> &#125;<br> local_18 = GetTickCount();<br> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">1000</span> &lt; (ulong)(local_18 - local_10)) &#123;<br> <span class=\"hljs-built_in\">puts</span>(&amp;DAT_004065a8);<br> explode_bomb();<br> &#125;<br> <span class=\"hljs-keyword\">return</span>;<br>&#125;<br></code></pre></td></tr></table></figure>\n<p>最终任务还是很明确的,需要写一段机器码修改<code>result</code>的数值,但是注意要能通过<code>check_buf_valid</code>检测,并且最后指令必须是跳转到<code>0x401896</code>不然就会触发<code>phase_impossible</code>中<code>0x401891</code>处的<code>explode_bomb</code>函数,唯一的难点是跟踪<code>rand_div</code>的数值变化,建议使用<code>register write</code>来修改<code>check_buf_valid</code>的返回值使其强制通过然后监控<code>rand_div</code>每一次的数值变化(<code>x/gx &amp;rand_div</code>),记录好<code>rand_div</code>的结果后开始指令设计,需要满足:</p>\n<ul>\n<li>指令的异或和为<code>rand_div</code>第一次的数值末尾八位以通过检查;</li>\n<li>修改<code>result</code>使其数值等于<code>rand_div</code>第三次数值;</li>\n<li>跳转到<code>0x401896</code>避免炸弹;</li>\n</ul>\n<p> 如果前几问都完成了到这里应该是没有问题的。</p>\n<hr>\n<h2 id=\"Phase-Secret\"><a href=\"#Phase-Secret\" class=\"headerlink\" title=\"Phase_Secret\"></a><strong>Phase_Secret</strong></h2><p>隐藏彩蛋,并非隐藏。汇编里写的非常清楚:</p>\n<figure class=\"highlight plaintext\"><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></pre></td><td class=\"code\"><pre><code class=\"hljs assembly\">0000000000401a8b &lt;phase_secret&gt;:<br> 401a8b:\tf3 0f 1e fa \tendbr64<br> 401a8f:\t55 \tpush %rbp<br> 401a90:\t48 89 e5 \tmov %rsp,%rbp<br> 401a93:\t48 83 ec 10 \tsub $0x10,%rsp<br> 401a97:\t48 89 7d f8 \tmov %rdi,-0x8(%rbp)<br> 401a9b:\t48 8d 05 26 4b 00 00 \tlea 0x4b26(%rip),%rax # 4065c8 &lt;_IO_stdin_used+0x5c8&gt;<br> 401aa2:\t48 89 c7 \tmov %rax,%rdi<br> 401aa5:\te8 76 f6 ff ff \tcall 401120 &lt;puts@plt&gt;<br> 401aaa:\t90 \tnop<br> 401aab:\tc9 \tleave<br> 401aac:\tc3 \tret<br></code></pre></td></tr></table></figure>\n<p>注意到这段指令在原程序中完全没有执行说明是需要用户自己跳转的,也非常简单只需要在<code>phase_5</code>中设计指令时加一个要求跳转到<code>0x401a8b</code>即可。</p>\n<p>完结<br><img src=\"/images/caseclosed.png\" alt=\"Case Closed\"></p>\n"},{"title":"Overleaf Toolkit踩坑记录","date":"2024-11-06T01:56:18.000Z","_content":"\n在安装 Overleaf Toolkit 时,表面上看起来很简单只要执行一些脚本就行,但是在某地区网络环境下还是遇到了一些问题和困难,这里记录安装过程中的问题和解决方案,方便以后参考。\n\n具体流程就不赘述了先将访问[Overleaf Toolkit官方仓库](https://github.com/overleaf/toolkit)将代码clone下来并按照手册执行即可。\n\n## 问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像\n\n在执行 `bin/up` 脚本启动服务时,发现 Mongo、Redis 和 Sharelatex 镜像无法拉取。主要原因是 Docker 在国内网络环境中,直接访问 Docker Hub 可能会被限制,导致拉取镜像失败。\n\n截至这篇博客编写时网上提供的镜像均无法解决只能使用代理。\n\n### 解决方案:为 Docker 设置代理\n\n通过配置 Docker 的代理,可以解决拉取镜像受限的问题。步骤如下:\n\n1. 创建一个 `systemd` 服务文件,为 Docker 设置代理。\n2. 编辑 `/etc/systemd/system/docker.service.d/proxy.conf` 文件,添加以下内容(确保已经设置了代理服务器):\n\n ```ini\n [Service]\n Environment=\"HTTP_PROXY=http://<your-proxy-server>:<port>\"\n Environment=\"HTTPS_PROXY=http://<your-proxy-server>:<port>\"\n Environment=\"NO_PROXY=localhost,127.0.0.1\"\n ```\n\n3. 重新加载 `systemd` 配置并重启 Docker\n\n ```bash\n sudo systemctl daemon-reload\n sudo systemctl restart docker\n ```\n\n4. 重启 Docker 后再次执行 `sudo ./up`,此时应该可以正常拉取 Mongo、Redis 和 Sharelatex 的镜像。等待执行完成即可。\n\n\n---\n\n## 问题二:外部机器无法访问 Overleaf Web 服务\n\n先确认ipv4和ipv6转发功能没有问题但是依旧出现只能本机访问127.0.0.1其他方式均无法访问甚至nmap扫描端口也发现并未开放sharelatex端口可以通过修改docker-compose配置文件解决。\n\n注意到在默认的 `lib/docker-compose.base.yml` 配置中Overleaf Web 服务的端口映射方式为 `\"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"`。\n\n### 解决方案:修改端口映射\n\n在 `docker-compose.base.yml` 文件中,删除 `${OVERLEAF_LISTEN_IP:-127.0.0.1}` 前缀,将 `\"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"` 修改为 `\"${OVERLEAF_PORT:-80}:80\"`。这样可以使 Docker 将 Overleaf 的 Web 服务端口暴露给所有网络接口,从而允许外部机器访问。\n\n修改后的 `docker-compose.base.yml` 端口映射配置如下:\n\n```yaml\n---\nservices:\n\n sharelatex:\n restart: always\n image: \"${IMAGE}\"\n container_name: sharelatex\n volumes:\n - \"${OVERLEAF_DATA_PATH}:${OVERLEAF_IN_CONTAINER_DATA_PATH}\"\n ports:\n #- \"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"\n - \"${OVERLEAF_PORT:-80}:80\"\n environment:\n GIT_BRIDGE_ENABLED: \"${GIT_BRIDGE_ENABLED}\"\n GIT_BRIDGE_HOST: \"git-bridge\"\n GIT_BRIDGE_PORT: \"8000\"\n REDIS_HOST: \"${REDIS_HOST}\"\n REDIS_PORT: \"${REDIS_PORT}\"\n V1_HISTORY_URL: \"http://sharelatex:3100/api\"\n env_file:\n - ../config/variables.env\n stop_grace_period: 60s\n```\n\n完成修改后重新启动 Docker 服务:\n\n```bash\nsudo ./start\n```\n\n现在外部机器可以通过服务器的 IP 地址加端口 `{Overleaf_Port}` 访问 Overleaf Web 服务。\n\n---\n\n## 总结\n\n这次安装 Overleaf Toolkit 时,主要遇到的两个问题分别是镜像拉取失败和端口映射受限。通过为 Docker 设置代理解决了拉取镜像的问题,而通过修改 `docker-compose.base.yml` 中的端口映射使外部设备可以访问 Overleaf 服务。\n\n可以在这里参考我的本地[Overleaf](https://overleaf.hifuu.ink)效果注意安装完后还需要配置latex包和中文字体。\n\n这篇记录希望能为遇到类似问题的朋友提供帮助。\n","source":"_posts/overleaf.md","raw":"---\ntitle: Overleaf Toolkit踩坑记录\ndate: 2024-11-06 09:56:18\ntags: 技术\ncategories: [技术分享]\n---\n\n在安装 Overleaf Toolkit 时,表面上看起来很简单只要执行一些脚本就行,但是在某地区网络环境下还是遇到了一些问题和困难,这里记录安装过程中的问题和解决方案,方便以后参考。\n\n具体流程就不赘述了先将访问[Overleaf Toolkit官方仓库](https://github.com/overleaf/toolkit)将代码clone下来并按照手册执行即可。\n\n## 问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像\n\n在执行 `bin/up` 脚本启动服务时,发现 Mongo、Redis 和 Sharelatex 镜像无法拉取。主要原因是 Docker 在国内网络环境中,直接访问 Docker Hub 可能会被限制,导致拉取镜像失败。\n\n截至这篇博客编写时网上提供的镜像均无法解决只能使用代理。\n\n### 解决方案:为 Docker 设置代理\n\n通过配置 Docker 的代理,可以解决拉取镜像受限的问题。步骤如下:\n\n1. 创建一个 `systemd` 服务文件,为 Docker 设置代理。\n2. 编辑 `/etc/systemd/system/docker.service.d/proxy.conf` 文件,添加以下内容(确保已经设置了代理服务器):\n\n ```ini\n [Service]\n Environment=\"HTTP_PROXY=http://<your-proxy-server>:<port>\"\n Environment=\"HTTPS_PROXY=http://<your-proxy-server>:<port>\"\n Environment=\"NO_PROXY=localhost,127.0.0.1\"\n ```\n\n3. 重新加载 `systemd` 配置并重启 Docker\n\n ```bash\n sudo systemctl daemon-reload\n sudo systemctl restart docker\n ```\n\n4. 重启 Docker 后再次执行 `sudo ./up`,此时应该可以正常拉取 Mongo、Redis 和 Sharelatex 的镜像。等待执行完成即可。\n\n\n---\n\n## 问题二:外部机器无法访问 Overleaf Web 服务\n\n先确认ipv4和ipv6转发功能没有问题但是依旧出现只能本机访问127.0.0.1其他方式均无法访问甚至nmap扫描端口也发现并未开放sharelatex端口可以通过修改docker-compose配置文件解决。\n\n注意到在默认的 `lib/docker-compose.base.yml` 配置中Overleaf Web 服务的端口映射方式为 `\"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"`。\n\n### 解决方案:修改端口映射\n\n在 `docker-compose.base.yml` 文件中,删除 `${OVERLEAF_LISTEN_IP:-127.0.0.1}` 前缀,将 `\"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"` 修改为 `\"${OVERLEAF_PORT:-80}:80\"`。这样可以使 Docker 将 Overleaf 的 Web 服务端口暴露给所有网络接口,从而允许外部机器访问。\n\n修改后的 `docker-compose.base.yml` 端口映射配置如下:\n\n```yaml\n---\nservices:\n\n sharelatex:\n restart: always\n image: \"${IMAGE}\"\n container_name: sharelatex\n volumes:\n - \"${OVERLEAF_DATA_PATH}:${OVERLEAF_IN_CONTAINER_DATA_PATH}\"\n ports:\n #- \"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80\"\n - \"${OVERLEAF_PORT:-80}:80\"\n environment:\n GIT_BRIDGE_ENABLED: \"${GIT_BRIDGE_ENABLED}\"\n GIT_BRIDGE_HOST: \"git-bridge\"\n GIT_BRIDGE_PORT: \"8000\"\n REDIS_HOST: \"${REDIS_HOST}\"\n REDIS_PORT: \"${REDIS_PORT}\"\n V1_HISTORY_URL: \"http://sharelatex:3100/api\"\n env_file:\n - ../config/variables.env\n stop_grace_period: 60s\n```\n\n完成修改后重新启动 Docker 服务:\n\n```bash\nsudo ./start\n```\n\n现在外部机器可以通过服务器的 IP 地址加端口 `{Overleaf_Port}` 访问 Overleaf Web 服务。\n\n---\n\n## 总结\n\n这次安装 Overleaf Toolkit 时,主要遇到的两个问题分别是镜像拉取失败和端口映射受限。通过为 Docker 设置代理解决了拉取镜像的问题,而通过修改 `docker-compose.base.yml` 中的端口映射使外部设备可以访问 Overleaf 服务。\n\n可以在这里参考我的本地[Overleaf](https://overleaf.hifuu.ink)效果注意安装完后还需要配置latex包和中文字体。\n\n这篇记录希望能为遇到类似问题的朋友提供帮助。\n","slug":"overleaf","published":1,"updated":"2024-11-06T02:31:56.685Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescx001iog2b666m0tt2","content":"<p>在安装 Overleaf Toolkit 时,表面上看起来很简单只要执行一些脚本就行,但是在某地区网络环境下还是遇到了一些问题和困难,这里记录安装过程中的问题和解决方案,方便以后参考。</p>\n<p>具体流程就不赘述了,先将访问<a href=\"https://github.com/overleaf/toolkit\">Overleaf Toolkit官方仓库</a>将代码clone下来并按照手册执行即可。</p>\n<h2 id=\"问题一:无法-Pull-Mongo、Redis-和-Sharelatex-镜像\"><a href=\"#问题一:无法-Pull-Mongo、Redis-和-Sharelatex-镜像\" class=\"headerlink\" title=\"问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像\"></a>问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像</h2><p>在执行 <code>bin/up</code> 脚本启动服务时,发现 Mongo、Redis 和 Sharelatex 镜像无法拉取。主要原因是 Docker 在国内网络环境中,直接访问 Docker Hub 可能会被限制,导致拉取镜像失败。</p>\n<p>截至这篇博客编写时网上提供的镜像均无法解决只能使用代理。</p>\n<h3 id=\"解决方案:为-Docker-设置代理\"><a href=\"#解决方案:为-Docker-设置代理\" class=\"headerlink\" title=\"解决方案:为 Docker 设置代理\"></a>解决方案:为 Docker 设置代理</h3><p>通过配置 Docker 的代理,可以解决拉取镜像受限的问题。步骤如下:</p>\n<ol>\n<li><p>创建一个 <code>systemd</code> 服务文件,为 Docker 设置代理。</p>\n</li>\n<li><p>编辑 <code>/etc/systemd/system/docker.service.d/proxy.conf</code> 文件,添加以下内容(确保已经设置了代理服务器):</p>\n <figure class=\"highlight ini\"><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><code class=\"hljs ini\"><span class=\"hljs-section\">[Service]</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;HTTP_PROXY=http://&lt;your-proxy-server&gt;:&lt;port&gt;&quot;</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;HTTPS_PROXY=http://&lt;your-proxy-server&gt;:&lt;port&gt;&quot;</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;NO_PROXY=localhost,127.0.0.1&quot;</span><br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重新加载 <code>systemd</code> 配置并重启 Docker</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo systemctl daemon-reload<br>sudo systemctl restart docker<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重启 Docker 后再次执行 <code>sudo ./up</code>,此时应该可以正常拉取 Mongo、Redis 和 Sharelatex 的镜像。等待执行完成即可。</p>\n</li>\n</ol>\n<hr>\n<h2 id=\"问题二:外部机器无法访问-Overleaf-Web-服务\"><a href=\"#问题二:外部机器无法访问-Overleaf-Web-服务\" class=\"headerlink\" title=\"问题二:外部机器无法访问 Overleaf Web 服务\"></a>问题二:外部机器无法访问 Overleaf Web 服务</h2><p>先确认ipv4和ipv6转发功能没有问题但是依旧出现只能本机访问127.0.0.1其他方式均无法访问甚至nmap扫描端口也发现并未开放sharelatex端口可以通过修改docker-compose配置文件解决。</p>\n<p>注意到在默认的 <code>lib/docker-compose.base.yml</code> 配置中Overleaf Web 服务的端口映射方式为 <code>&quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code>。</p>\n<h3 id=\"解决方案:修改端口映射\"><a href=\"#解决方案:修改端口映射\" class=\"headerlink\" title=\"解决方案:修改端口映射\"></a>解决方案:修改端口映射</h3><p>在 <code>docker-compose.base.yml</code> 文件中,删除 <code>$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;</code> 前缀,将 <code>&quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code> 修改为 <code>&quot;$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code>。这样可以使 Docker 将 Overleaf 的 Web 服务端口暴露给所有网络接口,从而允许外部机器访问。</p>\n<p>修改后的 <code>docker-compose.base.yml</code> 端口映射配置如下:</p>\n<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></pre></td><td class=\"code\"><pre><code class=\"hljs yaml\"><span class=\"hljs-meta\">---</span><br><span class=\"hljs-attr\">services:</span><br><br> <span class=\"hljs-attr\">sharelatex:</span><br> <span class=\"hljs-attr\">restart:</span> <span class=\"hljs-string\">always</span><br> <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">&quot;$&#123;IMAGE&#125;&quot;</span><br> <span class=\"hljs-attr\">container_name:</span> <span class=\"hljs-string\">sharelatex</span><br> <span class=\"hljs-attr\">volumes:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;$&#123;OVERLEAF_DATA_PATH&#125;:$&#123;OVERLEAF_IN_CONTAINER_DATA_PATH&#125;&quot;</span><br> <span class=\"hljs-attr\">ports:</span><br> <span class=\"hljs-comment\">#- &quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</span><br> <span class=\"hljs-attr\">environment:</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_ENABLED:</span> <span class=\"hljs-string\">&quot;$&#123;GIT_BRIDGE_ENABLED&#125;&quot;</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_HOST:</span> <span class=\"hljs-string\">&quot;git-bridge&quot;</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_PORT:</span> <span class=\"hljs-string\">&quot;8000&quot;</span><br> <span class=\"hljs-attr\">REDIS_HOST:</span> <span class=\"hljs-string\">&quot;$&#123;REDIS_HOST&#125;&quot;</span><br> <span class=\"hljs-attr\">REDIS_PORT:</span> <span class=\"hljs-string\">&quot;$&#123;REDIS_PORT&#125;&quot;</span><br> <span class=\"hljs-attr\">V1_HISTORY_URL:</span> <span class=\"hljs-string\">&quot;http://sharelatex:3100/api&quot;</span><br> <span class=\"hljs-attr\">env_file:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">../config/variables.env</span><br> <span class=\"hljs-attr\">stop_grace_period:</span> <span class=\"hljs-string\">60s</span><br></code></pre></td></tr></table></figure>\n\n<p>完成修改后,重新启动 Docker 服务:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo ./start<br></code></pre></td></tr></table></figure>\n\n<p>现在,外部机器可以通过服务器的 IP 地址加端口 <code>&#123;Overleaf_Port&#125;</code> 访问 Overleaf Web 服务。</p>\n<hr>\n<h2 id=\"总结\"><a href=\"#总结\" class=\"headerlink\" title=\"总结\"></a>总结</h2><p>这次安装 Overleaf Toolkit 时,主要遇到的两个问题分别是镜像拉取失败和端口映射受限。通过为 Docker 设置代理解决了拉取镜像的问题,而通过修改 <code>docker-compose.base.yml</code> 中的端口映射使外部设备可以访问 Overleaf 服务。</p>\n<p>可以在这里参考我的本地<a href=\"https://overleaf.hifuu.ink/\">Overleaf</a>效果注意安装完后还需要配置latex包和中文字体。</p>\n<p>这篇记录希望能为遇到类似问题的朋友提供帮助。</p>\n","excerpt":"","more":"<p>在安装 Overleaf Toolkit 时,表面上看起来很简单只要执行一些脚本就行,但是在某地区网络环境下还是遇到了一些问题和困难,这里记录安装过程中的问题和解决方案,方便以后参考。</p>\n<p>具体流程就不赘述了,先将访问<a href=\"https://github.com/overleaf/toolkit\">Overleaf Toolkit官方仓库</a>将代码clone下来并按照手册执行即可。</p>\n<h2 id=\"问题一:无法-Pull-Mongo、Redis-和-Sharelatex-镜像\"><a href=\"#问题一:无法-Pull-Mongo、Redis-和-Sharelatex-镜像\" class=\"headerlink\" title=\"问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像\"></a>问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像</h2><p>在执行 <code>bin/up</code> 脚本启动服务时,发现 Mongo、Redis 和 Sharelatex 镜像无法拉取。主要原因是 Docker 在国内网络环境中,直接访问 Docker Hub 可能会被限制,导致拉取镜像失败。</p>\n<p>截至这篇博客编写时网上提供的镜像均无法解决只能使用代理。</p>\n<h3 id=\"解决方案:为-Docker-设置代理\"><a href=\"#解决方案:为-Docker-设置代理\" class=\"headerlink\" title=\"解决方案:为 Docker 设置代理\"></a>解决方案:为 Docker 设置代理</h3><p>通过配置 Docker 的代理,可以解决拉取镜像受限的问题。步骤如下:</p>\n<ol>\n<li><p>创建一个 <code>systemd</code> 服务文件,为 Docker 设置代理。</p>\n</li>\n<li><p>编辑 <code>/etc/systemd/system/docker.service.d/proxy.conf</code> 文件,添加以下内容(确保已经设置了代理服务器):</p>\n <figure class=\"highlight ini\"><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><code class=\"hljs ini\"><span class=\"hljs-section\">[Service]</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;HTTP_PROXY=http://&lt;your-proxy-server&gt;:&lt;port&gt;&quot;</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;HTTPS_PROXY=http://&lt;your-proxy-server&gt;:&lt;port&gt;&quot;</span><br><span class=\"hljs-attr\">Environment</span>=<span class=\"hljs-string\">&quot;NO_PROXY=localhost,127.0.0.1&quot;</span><br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重新加载 <code>systemd</code> 配置并重启 Docker</p>\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo systemctl daemon-reload<br>sudo systemctl restart docker<br></code></pre></td></tr></table></figure>\n</li>\n<li><p>重启 Docker 后再次执行 <code>sudo ./up</code>,此时应该可以正常拉取 Mongo、Redis 和 Sharelatex 的镜像。等待执行完成即可。</p>\n</li>\n</ol>\n<hr>\n<h2 id=\"问题二:外部机器无法访问-Overleaf-Web-服务\"><a href=\"#问题二:外部机器无法访问-Overleaf-Web-服务\" class=\"headerlink\" title=\"问题二:外部机器无法访问 Overleaf Web 服务\"></a>问题二:外部机器无法访问 Overleaf Web 服务</h2><p>先确认ipv4和ipv6转发功能没有问题但是依旧出现只能本机访问127.0.0.1其他方式均无法访问甚至nmap扫描端口也发现并未开放sharelatex端口可以通过修改docker-compose配置文件解决。</p>\n<p>注意到在默认的 <code>lib/docker-compose.base.yml</code> 配置中Overleaf Web 服务的端口映射方式为 <code>&quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code>。</p>\n<h3 id=\"解决方案:修改端口映射\"><a href=\"#解决方案:修改端口映射\" class=\"headerlink\" title=\"解决方案:修改端口映射\"></a>解决方案:修改端口映射</h3><p>在 <code>docker-compose.base.yml</code> 文件中,删除 <code>$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;</code> 前缀,将 <code>&quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code> 修改为 <code>&quot;$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</code>。这样可以使 Docker 将 Overleaf 的 Web 服务端口暴露给所有网络接口,从而允许外部机器访问。</p>\n<p>修改后的 <code>docker-compose.base.yml</code> 端口映射配置如下:</p>\n<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></pre></td><td class=\"code\"><pre><code class=\"hljs yaml\"><span class=\"hljs-meta\">---</span><br><span class=\"hljs-attr\">services:</span><br><br> <span class=\"hljs-attr\">sharelatex:</span><br> <span class=\"hljs-attr\">restart:</span> <span class=\"hljs-string\">always</span><br> <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">&quot;$&#123;IMAGE&#125;&quot;</span><br> <span class=\"hljs-attr\">container_name:</span> <span class=\"hljs-string\">sharelatex</span><br> <span class=\"hljs-attr\">volumes:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;$&#123;OVERLEAF_DATA_PATH&#125;:$&#123;OVERLEAF_IN_CONTAINER_DATA_PATH&#125;&quot;</span><br> <span class=\"hljs-attr\">ports:</span><br> <span class=\"hljs-comment\">#- &quot;$&#123;OVERLEAF_LISTEN_IP:-127.0.0.1&#125;:$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;$&#123;OVERLEAF_PORT:-80&#125;:80&quot;</span><br> <span class=\"hljs-attr\">environment:</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_ENABLED:</span> <span class=\"hljs-string\">&quot;$&#123;GIT_BRIDGE_ENABLED&#125;&quot;</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_HOST:</span> <span class=\"hljs-string\">&quot;git-bridge&quot;</span><br> <span class=\"hljs-attr\">GIT_BRIDGE_PORT:</span> <span class=\"hljs-string\">&quot;8000&quot;</span><br> <span class=\"hljs-attr\">REDIS_HOST:</span> <span class=\"hljs-string\">&quot;$&#123;REDIS_HOST&#125;&quot;</span><br> <span class=\"hljs-attr\">REDIS_PORT:</span> <span class=\"hljs-string\">&quot;$&#123;REDIS_PORT&#125;&quot;</span><br> <span class=\"hljs-attr\">V1_HISTORY_URL:</span> <span class=\"hljs-string\">&quot;http://sharelatex:3100/api&quot;</span><br> <span class=\"hljs-attr\">env_file:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">../config/variables.env</span><br> <span class=\"hljs-attr\">stop_grace_period:</span> <span class=\"hljs-string\">60s</span><br></code></pre></td></tr></table></figure>\n\n<p>完成修改后,重新启动 Docker 服务:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\">sudo ./start<br></code></pre></td></tr></table></figure>\n\n<p>现在,外部机器可以通过服务器的 IP 地址加端口 <code>&#123;Overleaf_Port&#125;</code> 访问 Overleaf Web 服务。</p>\n<hr>\n<h2 id=\"总结\"><a href=\"#总结\" class=\"headerlink\" title=\"总结\"></a>总结</h2><p>这次安装 Overleaf Toolkit 时,主要遇到的两个问题分别是镜像拉取失败和端口映射受限。通过为 Docker 设置代理解决了拉取镜像的问题,而通过修改 <code>docker-compose.base.yml</code> 中的端口映射使外部设备可以访问 Overleaf 服务。</p>\n<p>可以在这里参考我的本地<a href=\"https://overleaf.hifuu.ink/\">Overleaf</a>效果注意安装完后还需要配置latex包和中文字体。</p>\n<p>这篇记录希望能为遇到类似问题的朋友提供帮助。</p>\n"},{"title":"相见恨晚的 SearXNG打造私人搜索引擎全指南","date":"2025-03-10T14:55:04.000Z","_content":"\n![SearXNG 界面预览](/images/searxng.png) \n**厌倦了商业搜索引擎的广告追踪?** 受够技术社区被 SEO 污染的水文希望搜索结果里尽量不要呈现C*DN等平台的低质内容这款开源元搜索引擎 [SearXNG](https://github.com/searxng/searxng) 现在让我直呼真香爱不释手,使用频率远超 Nextcloud 等自建服务。\n\n---\n\n### ▍ 为什么选择 SearXNG\n✅ **核心优势矩阵** \n| 特性 | 实现方式 | 用户收益 |\n|--------------------|----------------------------|------------------------|\n| 隐私保护 | 匿名聚合第三方结果 | 无搜索历史追踪 |\n| 结果去商业化 | 过滤 SEO 优化内容 | 提升技术资料检索效率 |\n| 多引擎支持 | 集成 Google/Bing/Brave 等 70+ 源 | 规避单一引擎局限 |\n| 界面定制 | 主题引擎分离设计 | 打造个性化搜索门户 |\n\n⚠ 同类工具对比: \n此前使用的 [luxirty-search](https://github.com/KoriIku/luxirty-search) 也很不错但是依赖 Google CSE对于内网环境日常使用多少有点不友好。\n\n之前看了下网上普遍推荐docker方案不过部署流程与官方文档有不少出入而且在我本地没法正常运行这里我们直接按照官方文档来事不宜迟直接开始部署。\n\n---\n\n### ▍ 极简部署方案\n#### ▶ 环境准备\n```bash\nmkdir -p ~/services/searxng && cd $_ # 随意找个地方创建专用目录\nexport SEARXNG_PORT=8080 # 设置服务端口\n```\n\n#### ▶ 容器化部署\n```bash\n# 拉取官方镜像\ndocker pull searxng/searxng\n\n# 启动容器(推荐绑定持久化配置)\ndocker run -d --restart=unless-stopped \\\n -p ${SEARXNG_PORT}:8080 \\\n -v \"${PWD}/config:/etc/searxng\" \\\n -e \"BASE_URL=http://your-domain.com\" \\\n -e \"INSTANCE_NAME=PrivateSearch\" \\\n searxng/searxng\n```\n📌 参数说明: \n- `-v` 挂载配置文件实现持久化 \n- `--restart` 确保服务异常退出后自动重启 \n- `BASE_URL` 需替换为实际访问域名,不过也可以后续再配置\n\n---\n\n### ▍ 高频问题排雷\n#### 🔴 镜像拉取失败\n**现象**`Error response from daemon: pull access denied` \n✅ 解决方案: \n参考先前的 [Overleaf Toolkit 踩坑记录](https://blog.hifuu.ink/2024/11/06/overleaf/) 配置镜像加速源\n\n#### 🔴 Google 频繁拦截\n**现象**`Too Many Requests` 错误频发 \n\n⚠ 这算是一个玄学问题除了更换代理我还没有发现更好的解决方案\n\n✅ 实战验证方案: \n更换你的代理服务器比如笔者目前在🇺🇸🇭🇰🇯🇵均有购买VPS服务器可作为代理经尝试总会有可以使用的节点。\n\n📌 在配置文件设置代理: \n```yaml\noutgoing:\n proxies:\n all://:\n - http://<address>:<port>\n```\n\n---\n\n### ▍ 效果展示与体验\n访问我的生产环境实例 [search.hifuu.ink](https://search.hifuu.ink) 可体验以下功能: \n- 🔍 多引擎结果聚合对比 \n- 🌍 支持 30+ 语言实时翻译 \n- 🛡️ 零 Cookie 跟踪的隐私模式 \n- 🎨 主题切换 \n\n---\n### ▍ 进阶优化建议\n1. **反向代理配置** \n\n网上相关教程应该很多这里不再重复我的SearXNG服务器通过香港VPS反代到公网使用。\n\n2. **定期维护命令** \n```bash\n# 更新搜索引擎引擎列表\ndocker exec -it searxng python -m searx.engines --update\n```\n\n3. **监控指标集成** \n通过 Prometheus 导出搜索统计:\n```bash\ndocker run -d --network=searxng-net \\\n -v \"${PWD}/metrics:/metrics\" \\\n prom/prometheus --config.file=/metrics/searxng.yml\n``` \n\n---\n\n**🚀 立即行动** \n\n快速拥有对抗 SEO 污染的利器,快来打造你的私人搜索门户吧!部署过程遇到问题欢迎联系笔者交流。\n","source":"_posts/searxng.md","raw":"---\ntitle: 相见恨晚的 SearXNG打造私人搜索引擎全指南\ndate: 2025-03-10 22:55:04\ntags: [开源工具, 技术分享]\n---\n\n![SearXNG 界面预览](/images/searxng.png) \n**厌倦了商业搜索引擎的广告追踪?** 受够技术社区被 SEO 污染的水文希望搜索结果里尽量不要呈现C*DN等平台的低质内容这款开源元搜索引擎 [SearXNG](https://github.com/searxng/searxng) 现在让我直呼真香爱不释手,使用频率远超 Nextcloud 等自建服务。\n\n---\n\n### ▍ 为什么选择 SearXNG\n✅ **核心优势矩阵** \n| 特性 | 实现方式 | 用户收益 |\n|--------------------|----------------------------|------------------------|\n| 隐私保护 | 匿名聚合第三方结果 | 无搜索历史追踪 |\n| 结果去商业化 | 过滤 SEO 优化内容 | 提升技术资料检索效率 |\n| 多引擎支持 | 集成 Google/Bing/Brave 等 70+ 源 | 规避单一引擎局限 |\n| 界面定制 | 主题引擎分离设计 | 打造个性化搜索门户 |\n\n⚠ 同类工具对比: \n此前使用的 [luxirty-search](https://github.com/KoriIku/luxirty-search) 也很不错但是依赖 Google CSE对于内网环境日常使用多少有点不友好。\n\n之前看了下网上普遍推荐docker方案不过部署流程与官方文档有不少出入而且在我本地没法正常运行这里我们直接按照官方文档来事不宜迟直接开始部署。\n\n---\n\n### ▍ 极简部署方案\n#### ▶ 环境准备\n```bash\nmkdir -p ~/services/searxng && cd $_ # 随意找个地方创建专用目录\nexport SEARXNG_PORT=8080 # 设置服务端口\n```\n\n#### ▶ 容器化部署\n```bash\n# 拉取官方镜像\ndocker pull searxng/searxng\n\n# 启动容器(推荐绑定持久化配置)\ndocker run -d --restart=unless-stopped \\\n -p ${SEARXNG_PORT}:8080 \\\n -v \"${PWD}/config:/etc/searxng\" \\\n -e \"BASE_URL=http://your-domain.com\" \\\n -e \"INSTANCE_NAME=PrivateSearch\" \\\n searxng/searxng\n```\n📌 参数说明: \n- `-v` 挂载配置文件实现持久化 \n- `--restart` 确保服务异常退出后自动重启 \n- `BASE_URL` 需替换为实际访问域名,不过也可以后续再配置\n\n---\n\n### ▍ 高频问题排雷\n#### 🔴 镜像拉取失败\n**现象**`Error response from daemon: pull access denied` \n✅ 解决方案: \n参考先前的 [Overleaf Toolkit 踩坑记录](https://blog.hifuu.ink/2024/11/06/overleaf/) 配置镜像加速源\n\n#### 🔴 Google 频繁拦截\n**现象**`Too Many Requests` 错误频发 \n\n⚠ 这算是一个玄学问题除了更换代理我还没有发现更好的解决方案\n\n✅ 实战验证方案: \n更换你的代理服务器比如笔者目前在🇺🇸🇭🇰🇯🇵均有购买VPS服务器可作为代理经尝试总会有可以使用的节点。\n\n📌 在配置文件设置代理: \n```yaml\noutgoing:\n proxies:\n all://:\n - http://<address>:<port>\n```\n\n---\n\n### ▍ 效果展示与体验\n访问我的生产环境实例 [search.hifuu.ink](https://search.hifuu.ink) 可体验以下功能: \n- 🔍 多引擎结果聚合对比 \n- 🌍 支持 30+ 语言实时翻译 \n- 🛡️ 零 Cookie 跟踪的隐私模式 \n- 🎨 主题切换 \n\n---\n### ▍ 进阶优化建议\n1. **反向代理配置** \n\n网上相关教程应该很多这里不再重复我的SearXNG服务器通过香港VPS反代到公网使用。\n\n2. **定期维护命令** \n```bash\n# 更新搜索引擎引擎列表\ndocker exec -it searxng python -m searx.engines --update\n```\n\n3. **监控指标集成** \n通过 Prometheus 导出搜索统计:\n```bash\ndocker run -d --network=searxng-net \\\n -v \"${PWD}/metrics:/metrics\" \\\n prom/prometheus --config.file=/metrics/searxng.yml\n``` \n\n---\n\n**🚀 立即行动** \n\n快速拥有对抗 SEO 污染的利器,快来打造你的私人搜索门户吧!部署过程遇到问题欢迎联系笔者交流。\n","slug":"searxng","published":1,"updated":"2025-03-10T15:46:55.535Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iescx001kog2b0s7mg6qs","content":"<p><img src=\"/images/searxng.png\" alt=\"SearXNG 界面预览\"><br><strong>厌倦了商业搜索引擎的广告追踪?</strong> 受够技术社区被 SEO 污染的水文希望搜索结果里尽量不要呈现C*DN等平台的低质内容这款开源元搜索引擎 <a href=\"https://github.com/searxng/searxng\">SearXNG</a> 现在让我直呼真香爱不释手,使用频率远超 Nextcloud 等自建服务。</p>\n<hr>\n<h3 id=\"▍-为什么选择-SearXNG\"><a href=\"#▍-为什么选择-SearXNG\" class=\"headerlink\" title=\"▍ 为什么选择 SearXNG\"></a>▍ 为什么选择 SearXNG</h3><p>✅ <strong>核心优势矩阵</strong> </p>\n<table>\n<thead>\n<tr>\n<th>特性</th>\n<th>实现方式</th>\n<th>用户收益</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>隐私保护</td>\n<td>匿名聚合第三方结果</td>\n<td>无搜索历史追踪</td>\n</tr>\n<tr>\n<td>结果去商业化</td>\n<td>过滤 SEO 优化内容</td>\n<td>提升技术资料检索效率</td>\n</tr>\n<tr>\n<td>多引擎支持</td>\n<td>集成 Google&#x2F;Bing&#x2F;Brave 等 70+ 源</td>\n<td>规避单一引擎局限</td>\n</tr>\n<tr>\n<td>界面定制</td>\n<td>主题引擎分离设计</td>\n<td>打造个性化搜索门户</td>\n</tr>\n</tbody></table>\n<p>⚠️ 同类工具对比:<br>此前使用的 <a href=\"https://github.com/KoriIku/luxirty-search\">luxirty-search</a> 也很不错但是依赖 Google CSE对于内网环境日常使用多少有点不友好。</p>\n<p>之前看了下网上普遍推荐docker方案不过部署流程与官方文档有不少出入而且在我本地没法正常运行这里我们直接按照官方文档来事不宜迟直接开始部署。</p>\n<hr>\n<h3 id=\"▍-极简部署方案\"><a href=\"#▍-极简部署方案\" class=\"headerlink\" title=\"▍ 极简部署方案\"></a>▍ 极简部署方案</h3><h4 id=\"▶-环境准备\"><a href=\"#▶-环境准备\" class=\"headerlink\" title=\"▶ 环境准备\"></a>▶ 环境准备</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">mkdir</span> -p ~/services/searxng &amp;&amp; <span class=\"hljs-built_in\">cd</span> <span class=\"hljs-variable\">$_</span> <span class=\"hljs-comment\"># 随意找个地方创建专用目录</span><br><span class=\"hljs-built_in\">export</span> SEARXNG_PORT=8080 <span class=\"hljs-comment\"># 设置服务端口</span><br></code></pre></td></tr></table></figure>\n\n<h4 id=\"▶-容器化部署\"><a href=\"#▶-容器化部署\" class=\"headerlink\" title=\"▶ 容器化部署\"></a>▶ 容器化部署</h4><figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-comment\"># 拉取官方镜像</span><br>docker pull searxng/searxng<br><br><span class=\"hljs-comment\"># 启动容器(推荐绑定持久化配置)</span><br>docker run -d --restart=unless-stopped \\<br> -p <span class=\"hljs-variable\">$&#123;SEARXNG_PORT&#125;</span>:8080 \\<br> -v <span class=\"hljs-string\">&quot;<span class=\"hljs-variable\">$&#123;PWD&#125;</span>/config:/etc/searxng&quot;</span> \\<br> -e <span class=\"hljs-string\">&quot;BASE_URL=http://your-domain.com&quot;</span> \\<br> -e <span class=\"hljs-string\">&quot;INSTANCE_NAME=PrivateSearch&quot;</span> \\<br> searxng/searxng<br></code></pre></td></tr></table></figure>\n<p>📌 参数说明: </p>\n<ul>\n<li><code>-v</code> 挂载配置文件实现持久化 </li>\n<li><code>--restart</code> 确保服务异常退出后自动重启 </li>\n<li><code>BASE_URL</code> 需替换为实际访问域名,不过也可以后续再配置</li>\n</ul>\n<hr>\n<h3 id=\"▍-高频问题排雷\"><a href=\"#▍-高频问题排雷\" class=\"headerlink\" title=\"▍ 高频问题排雷\"></a>▍ 高频问题排雷</h3><h4 id=\"🔴-镜像拉取失败\"><a href=\"#🔴-镜像拉取失败\" class=\"headerlink\" title=\"🔴 镜像拉取失败\"></a>🔴 镜像拉取失败</h4><p><strong>现象</strong><code>Error response from daemon: pull access denied</code><br>✅ 解决方案:<br>参考先前的 <a href=\"https://blog.hifuu.ink/2024/11/06/overleaf/\">Overleaf Toolkit 踩坑记录</a> 配置镜像加速源</p>\n<h4 id=\"🔴-Google-频繁拦截\"><a href=\"#🔴-Google-频繁拦截\" class=\"headerlink\" title=\"🔴 Google 频繁拦截\"></a>🔴 Google 频繁拦截</h4><p><strong>现象</strong><code>Too Many Requests</code> 错误频发 </p>\n<p>⚠️ 这算是一个玄学问题除了更换代理我还没有发现更好的解决方案</p>\n<p>✅ 实战验证方案:<br>更换你的代理服务器比如笔者目前在🇺🇸🇭🇰🇯🇵均有购买VPS服务器可作为代理经尝试总会有可以使用的节点。</p>\n<p>📌 在配置文件设置代理: </p>\n<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></pre></td><td class=\"code\"><pre><code class=\"hljs yaml\"><span class=\"hljs-attr\">outgoing:</span><br> <span class=\"hljs-attr\">proxies:</span><br> <span class=\"hljs-attr\">all://:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">http://&lt;address&gt;:&lt;port&gt;</span><br></code></pre></td></tr></table></figure>\n\n<hr>\n<h3 id=\"▍-效果展示与体验\"><a href=\"#▍-效果展示与体验\" class=\"headerlink\" title=\"▍ 效果展示与体验\"></a>▍ 效果展示与体验</h3><p>访问我的生产环境实例 <a href=\"https://search.hifuu.ink/\">search.hifuu.ink</a> 可体验以下功能: </p>\n<ul>\n<li>🔍 多引擎结果聚合对比 </li>\n<li>🌍 支持 30+ 语言实时翻译 </li>\n<li>🛡️ 零 Cookie 跟踪的隐私模式 </li>\n<li>🎨 主题切换</li>\n</ul>\n<hr>\n<h3 id=\"▍-进阶优化建议\"><a href=\"#▍-进阶优化建议\" class=\"headerlink\" title=\"▍ 进阶优化建议\"></a>▍ 进阶优化建议</h3><ol>\n<li><strong>反向代理配置</strong></li>\n</ol>\n<p>网上相关教程应该很多这里不再重复我的SearXNG服务器通过香港VPS反代到公网使用。</p>\n<ol start=\"2\">\n<li><p><strong>定期维护命令</strong> </p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-comment\"># 更新搜索引擎引擎列表</span><br>docker <span class=\"hljs-built_in\">exec</span> -it searxng python -m searx.engines --update<br></code></pre></td></tr></table></figure>\n</li>\n<li><p><strong>监控指标集成</strong><br>通过 Prometheus 导出搜索统计:</p>\n<figure class=\"highlight bash\"><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><code class=\"hljs bash\">docker run -d --network=searxng-net \\<br> -v <span class=\"hljs-string\">&quot;<span class=\"hljs-variable\">$&#123;PWD&#125;</span>/metrics:/metrics&quot;</span> \\<br> prom/prometheus --config.file=/metrics/searxng.yml<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<p><strong>🚀 立即行动</strong> </p>\n<p>快速拥有对抗 SEO 污染的利器,快来打造你的私人搜索门户吧!部署过程遇到问题欢迎联系笔者交流。</p>\n","excerpt":"","more":"<p><img src=\"/images/searxng.png\" alt=\"SearXNG 界面预览\"><br><strong>厌倦了商业搜索引擎的广告追踪?</strong> 受够技术社区被 SEO 污染的水文希望搜索结果里尽量不要呈现C*DN等平台的低质内容这款开源元搜索引擎 <a href=\"https://github.com/searxng/searxng\">SearXNG</a> 现在让我直呼真香爱不释手,使用频率远超 Nextcloud 等自建服务。</p>\n<hr>\n<h3 id=\"▍-为什么选择-SearXNG\"><a href=\"#▍-为什么选择-SearXNG\" class=\"headerlink\" title=\"▍ 为什么选择 SearXNG\"></a>▍ 为什么选择 SearXNG</h3><p>✅ <strong>核心优势矩阵</strong> </p>\n<table>\n<thead>\n<tr>\n<th>特性</th>\n<th>实现方式</th>\n<th>用户收益</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>隐私保护</td>\n<td>匿名聚合第三方结果</td>\n<td>无搜索历史追踪</td>\n</tr>\n<tr>\n<td>结果去商业化</td>\n<td>过滤 SEO 优化内容</td>\n<td>提升技术资料检索效率</td>\n</tr>\n<tr>\n<td>多引擎支持</td>\n<td>集成 Google&#x2F;Bing&#x2F;Brave 等 70+ 源</td>\n<td>规避单一引擎局限</td>\n</tr>\n<tr>\n<td>界面定制</td>\n<td>主题引擎分离设计</td>\n<td>打造个性化搜索门户</td>\n</tr>\n</tbody></table>\n<p>⚠️ 同类工具对比:<br>此前使用的 <a href=\"https://github.com/KoriIku/luxirty-search\">luxirty-search</a> 也很不错但是依赖 Google CSE对于内网环境日常使用多少有点不友好。</p>\n<p>之前看了下网上普遍推荐docker方案不过部署流程与官方文档有不少出入而且在我本地没法正常运行这里我们直接按照官方文档来事不宜迟直接开始部署。</p>\n<hr>\n<h3 id=\"▍-极简部署方案\"><a href=\"#▍-极简部署方案\" class=\"headerlink\" title=\"▍ 极简部署方案\"></a>▍ 极简部署方案</h3><h4 id=\"▶-环境准备\"><a href=\"#▶-环境准备\" class=\"headerlink\" title=\"▶ 环境准备\"></a>▶ 环境准备</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-built_in\">mkdir</span> -p ~/services/searxng &amp;&amp; <span class=\"hljs-built_in\">cd</span> <span class=\"hljs-variable\">$_</span> <span class=\"hljs-comment\"># 随意找个地方创建专用目录</span><br><span class=\"hljs-built_in\">export</span> SEARXNG_PORT=8080 <span class=\"hljs-comment\"># 设置服务端口</span><br></code></pre></td></tr></table></figure>\n\n<h4 id=\"▶-容器化部署\"><a href=\"#▶-容器化部署\" class=\"headerlink\" title=\"▶ 容器化部署\"></a>▶ 容器化部署</h4><figure class=\"highlight bash\"><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><code class=\"hljs bash\"><span class=\"hljs-comment\"># 拉取官方镜像</span><br>docker pull searxng/searxng<br><br><span class=\"hljs-comment\"># 启动容器(推荐绑定持久化配置)</span><br>docker run -d --restart=unless-stopped \\<br> -p <span class=\"hljs-variable\">$&#123;SEARXNG_PORT&#125;</span>:8080 \\<br> -v <span class=\"hljs-string\">&quot;<span class=\"hljs-variable\">$&#123;PWD&#125;</span>/config:/etc/searxng&quot;</span> \\<br> -e <span class=\"hljs-string\">&quot;BASE_URL=http://your-domain.com&quot;</span> \\<br> -e <span class=\"hljs-string\">&quot;INSTANCE_NAME=PrivateSearch&quot;</span> \\<br> searxng/searxng<br></code></pre></td></tr></table></figure>\n<p>📌 参数说明: </p>\n<ul>\n<li><code>-v</code> 挂载配置文件实现持久化 </li>\n<li><code>--restart</code> 确保服务异常退出后自动重启 </li>\n<li><code>BASE_URL</code> 需替换为实际访问域名,不过也可以后续再配置</li>\n</ul>\n<hr>\n<h3 id=\"▍-高频问题排雷\"><a href=\"#▍-高频问题排雷\" class=\"headerlink\" title=\"▍ 高频问题排雷\"></a>▍ 高频问题排雷</h3><h4 id=\"🔴-镜像拉取失败\"><a href=\"#🔴-镜像拉取失败\" class=\"headerlink\" title=\"🔴 镜像拉取失败\"></a>🔴 镜像拉取失败</h4><p><strong>现象</strong><code>Error response from daemon: pull access denied</code><br>✅ 解决方案:<br>参考先前的 <a href=\"https://blog.hifuu.ink/2024/11/06/overleaf/\">Overleaf Toolkit 踩坑记录</a> 配置镜像加速源</p>\n<h4 id=\"🔴-Google-频繁拦截\"><a href=\"#🔴-Google-频繁拦截\" class=\"headerlink\" title=\"🔴 Google 频繁拦截\"></a>🔴 Google 频繁拦截</h4><p><strong>现象</strong><code>Too Many Requests</code> 错误频发 </p>\n<p>⚠️ 这算是一个玄学问题除了更换代理我还没有发现更好的解决方案</p>\n<p>✅ 实战验证方案:<br>更换你的代理服务器比如笔者目前在🇺🇸🇭🇰🇯🇵均有购买VPS服务器可作为代理经尝试总会有可以使用的节点。</p>\n<p>📌 在配置文件设置代理: </p>\n<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></pre></td><td class=\"code\"><pre><code class=\"hljs yaml\"><span class=\"hljs-attr\">outgoing:</span><br> <span class=\"hljs-attr\">proxies:</span><br> <span class=\"hljs-attr\">all://:</span><br> <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">http://&lt;address&gt;:&lt;port&gt;</span><br></code></pre></td></tr></table></figure>\n\n<hr>\n<h3 id=\"▍-效果展示与体验\"><a href=\"#▍-效果展示与体验\" class=\"headerlink\" title=\"▍ 效果展示与体验\"></a>▍ 效果展示与体验</h3><p>访问我的生产环境实例 <a href=\"https://search.hifuu.ink/\">search.hifuu.ink</a> 可体验以下功能: </p>\n<ul>\n<li>🔍 多引擎结果聚合对比 </li>\n<li>🌍 支持 30+ 语言实时翻译 </li>\n<li>🛡️ 零 Cookie 跟踪的隐私模式 </li>\n<li>🎨 主题切换</li>\n</ul>\n<hr>\n<h3 id=\"▍-进阶优化建议\"><a href=\"#▍-进阶优化建议\" class=\"headerlink\" title=\"▍ 进阶优化建议\"></a>▍ 进阶优化建议</h3><ol>\n<li><strong>反向代理配置</strong></li>\n</ol>\n<p>网上相关教程应该很多这里不再重复我的SearXNG服务器通过香港VPS反代到公网使用。</p>\n<ol start=\"2\">\n<li><p><strong>定期维护命令</strong> </p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><code class=\"hljs bash\"><span class=\"hljs-comment\"># 更新搜索引擎引擎列表</span><br>docker <span class=\"hljs-built_in\">exec</span> -it searxng python -m searx.engines --update<br></code></pre></td></tr></table></figure>\n</li>\n<li><p><strong>监控指标集成</strong><br>通过 Prometheus 导出搜索统计:</p>\n<figure class=\"highlight bash\"><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><code class=\"hljs bash\">docker run -d --network=searxng-net \\<br> -v <span class=\"hljs-string\">&quot;<span class=\"hljs-variable\">$&#123;PWD&#125;</span>/metrics:/metrics&quot;</span> \\<br> prom/prometheus --config.file=/metrics/searxng.yml<br></code></pre></td></tr></table></figure></li>\n</ol>\n<hr>\n<p><strong>🚀 立即行动</strong> </p>\n<p>快速拥有对抗 SEO 污染的利器,快来打造你的私人搜索门户吧!部署过程遇到问题欢迎联系笔者交流。</p>\n"},{"title":"命令行编辑器的优雅新选择","date":"2024-12-12T17:40:27.000Z","_content":"\n意外发现Zellij+Helix还挺好用的\n\n避免了vim/neovim的配置流程直接就能上手的轻量命令行开发环境\n\n稍微了解一下二者的快捷键就能舒适码字了\n\n甚至还都是rust出品\n\n即刻尝试一下[Zellij](https://zellij.dev/)和[Helix](https://helix-editor.com/)吧!\n\n// 至于Helix没有文件树显示的方案反正Helix选择文件挺方便的要文件树无非是希望编辑窗口居于窗口中央倒是可以用watch和tree命令来代替还能手动设置哪些文件不用显示hhh\n\n![实际效果](/images/zellij-helix.jpg)\n","source":"_posts/zellij-helix.md","raw":"---\ntitle: 命令行编辑器的优雅新选择\ndate: 2024-12-13 01:40:27\ntags: [技术分享]\n---\n\n意外发现Zellij+Helix还挺好用的\n\n避免了vim/neovim的配置流程直接就能上手的轻量命令行开发环境\n\n稍微了解一下二者的快捷键就能舒适码字了\n\n甚至还都是rust出品\n\n即刻尝试一下[Zellij](https://zellij.dev/)和[Helix](https://helix-editor.com/)吧!\n\n// 至于Helix没有文件树显示的方案反正Helix选择文件挺方便的要文件树无非是希望编辑窗口居于窗口中央倒是可以用watch和tree命令来代替还能手动设置哪些文件不用显示hhh\n\n![实际效果](/images/zellij-helix.jpg)\n","slug":"zellij-helix","published":1,"updated":"2025-02-23T15:53:44.966Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iesd0002iog2b94zz4o8r","content":"<p>意外发现Zellij+Helix还挺好用的</p>\n<p>避免了vim&#x2F;neovim的配置流程直接就能上手的轻量命令行开发环境</p>\n<p>稍微了解一下二者的快捷键就能舒适码字了</p>\n<p>甚至还都是rust出品</p>\n<p>即刻尝试一下<a href=\"https://zellij.dev/\">Zellij</a>和<a href=\"https://helix-editor.com/\">Helix</a>吧!</p>\n<p>&#x2F;&#x2F; 至于Helix没有文件树显示的方案反正Helix选择文件挺方便的要文件树无非是希望编辑窗口居于窗口中央倒是可以用watch和tree命令来代替还能手动设置哪些文件不用显示hhh</p>\n<p><img src=\"/images/zellij-helix.jpg\" alt=\"实际效果\"></p>\n","excerpt":"","more":"<p>意外发现Zellij+Helix还挺好用的</p>\n<p>避免了vim&#x2F;neovim的配置流程直接就能上手的轻量命令行开发环境</p>\n<p>稍微了解一下二者的快捷键就能舒适码字了</p>\n<p>甚至还都是rust出品</p>\n<p>即刻尝试一下<a href=\"https://zellij.dev/\">Zellij</a>和<a href=\"https://helix-editor.com/\">Helix</a>吧!</p>\n<p>&#x2F;&#x2F; 至于Helix没有文件树显示的方案反正Helix选择文件挺方便的要文件树无非是希望编辑窗口居于窗口中央倒是可以用watch和tree命令来代替还能手动设置哪些文件不用显示hhh</p>\n<p><img src=\"/images/zellij-helix.jpg\" alt=\"实际效果\"></p>\n"},{"title":"原来我还有个博客","date":"2024-06-02T16:19:55.000Z","_content":"\n2025-02-25\n\n最近整理了一下缓存部署起来方便多了有空就写点东西记录一下吧~\n","source":"_posts/原来我还有个博客.md","raw":"---\ntitle: 原来我还有个博客\ndate: 2024-06-03 00:19:55\ntags: 日志\n---\n\n2025-02-25\n\n最近整理了一下缓存部署起来方便多了有空就写点东西记录一下吧~\n","slug":"原来我还有个博客","published":1,"updated":"2025-02-25T04:26:34.224Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iesd0002jog2b0gfohbye","content":"<p>2025-02-25</p>\n<p>最近整理了一下缓存部署起来方便多了,有空就写点东西记录一下吧~</p>\n","excerpt":"","more":"<p>2025-02-25</p>\n<p>最近整理了一下缓存部署起来方便多了,有空就写点东西记录一下吧~</p>\n"},{"title":"梦开始的地方","date":"2023-12-06T14:53:35.000Z","_content":"\n不知不觉已经高中毕业快半年了现在在NUDT的生活还算适应吧交到了一些很有趣的朋友并且在技术方面取得了一定突破很期待明年的asc2024呢今天看到华科一位学长的博客突然想起我还没好好搭建过自己的Blog于是心血来潮搞了下我的Github Pages。\n\n今后会在这里更新记录自己的生活学习工作以及一些想法希望能坚持下来吧。\n\n> P.S.最近我都经历了些什么:\n>\n> 1. 时长21天军训认识了一群很可爱的班长尤其是负责我们5班6班的英子初步和队里的同学了解;\n> 2. 学习了一些C++基础,在洛谷上刷了不少算法题;\n> 3. ACM招新赛被薄纱差一题进入校队;\n> 4. 对算法竞赛感到疑惑尝试学习Flutter和操作系统开阔视野;\n> 5. 入坑战地,爽爽爽;\n> 6. 被一位巨强的学长发掘加入NUDT超算队;\n> 7. 面临三个考试周,熬过去就是胜利;\n\n虽然天天早八满课很不爽但是平时还是可以学习自己想学的技术周末也可以打游戏感觉还行吧我还是相信NUDT既来之则安之。\n\n这里毕竟是我梦开始的地方。\n\n> 胸怀祖国,团结协作,志在高峰,奋勇拼搏!\n\n今天是2023年12月6日加油\n\n------------------------\n\n修改一下有的话还是不适合明说哦\n\n5YK75a2p5a2Q5Lus77yM5b+r6YCD5ZWK77yB77yB77yBCg==\n\n","source":"_posts/梦开始的地方.md","raw":"---\ntitle: 梦开始的地方\ndate: 2023-12-06 22:53:35\ntags: 日志\n---\n\n不知不觉已经高中毕业快半年了现在在NUDT的生活还算适应吧交到了一些很有趣的朋友并且在技术方面取得了一定突破很期待明年的asc2024呢今天看到华科一位学长的博客突然想起我还没好好搭建过自己的Blog于是心血来潮搞了下我的Github Pages。\n\n今后会在这里更新记录自己的生活学习工作以及一些想法希望能坚持下来吧。\n\n> P.S.最近我都经历了些什么:\n>\n> 1. 时长21天军训认识了一群很可爱的班长尤其是负责我们5班6班的英子初步和队里的同学了解;\n> 2. 学习了一些C++基础,在洛谷上刷了不少算法题;\n> 3. ACM招新赛被薄纱差一题进入校队;\n> 4. 对算法竞赛感到疑惑尝试学习Flutter和操作系统开阔视野;\n> 5. 入坑战地,爽爽爽;\n> 6. 被一位巨强的学长发掘加入NUDT超算队;\n> 7. 面临三个考试周,熬过去就是胜利;\n\n虽然天天早八满课很不爽但是平时还是可以学习自己想学的技术周末也可以打游戏感觉还行吧我还是相信NUDT既来之则安之。\n\n这里毕竟是我梦开始的地方。\n\n> 胸怀祖国,团结协作,志在高峰,奋勇拼搏!\n\n今天是2023年12月6日加油\n\n------------------------\n\n修改一下有的话还是不适合明说哦\n\n5YK75a2p5a2Q5Lus77yM5b+r6YCD5ZWK77yB77yB77yBCg==\n\n","slug":"梦开始的地方","published":1,"updated":"2025-02-25T04:25:44.687Z","comments":1,"layout":"post","photos":[],"_id":"cmi0iesd0002log2bhbbb1g93","content":"<p>不知不觉已经高中毕业快半年了现在在NUDT的生活还算适应吧交到了一些很有趣的朋友并且在技术方面取得了一定突破很期待明年的asc2024呢今天看到华科一位学长的博客突然想起我还没好好搭建过自己的Blog于是心血来潮搞了下我的Github Pages。</p>\n<p>今后会在这里更新记录自己的生活,学习,工作,以及一些想法,希望能坚持下来吧。</p>\n<blockquote>\n<p>P.S.最近我都经历了些什么:</p>\n<ol>\n<li>时长21天军训认识了一群很可爱的班长尤其是负责我们5班6班的英子初步和队里的同学了解;</li>\n<li>学习了一些C++基础,在洛谷上刷了不少算法题;</li>\n<li>ACM招新赛被薄纱差一题进入校队;</li>\n<li>对算法竞赛感到疑惑尝试学习Flutter和操作系统开阔视野;</li>\n<li>入坑战地,爽爽爽;</li>\n<li>被一位巨强的学长发掘加入NUDT超算队;</li>\n<li>面临三个考试周,熬过去就是胜利;</li>\n</ol>\n</blockquote>\n<p>虽然天天早八满课很不爽但是平时还是可以学习自己想学的技术周末也可以打游戏感觉还行吧我还是相信NUDT既来之则安之。</p>\n<p>这里,毕竟是我梦开始的地方。</p>\n<blockquote>\n<p>胸怀祖国,团结协作,志在高峰,奋勇拼搏!</p>\n</blockquote>\n<p>今天是2023年12月6日加油</p>\n<hr>\n<p>修改一下,有的话还是不适合明说哦</p>\n<p>5YK75a2p5a2Q5Lus77yM5b+r6YCD5ZWK77yB77yB77yBCg&#x3D;&#x3D;</p>\n","excerpt":"","more":"<p>不知不觉已经高中毕业快半年了现在在NUDT的生活还算适应吧交到了一些很有趣的朋友并且在技术方面取得了一定突破很期待明年的asc2024呢今天看到华科一位学长的博客突然想起我还没好好搭建过自己的Blog于是心血来潮搞了下我的Github Pages。</p>\n<p>今后会在这里更新记录自己的生活,学习,工作,以及一些想法,希望能坚持下来吧。</p>\n<blockquote>\n<p>P.S.最近我都经历了些什么:</p>\n<ol>\n<li>时长21天军训认识了一群很可爱的班长尤其是负责我们5班6班的英子初步和队里的同学了解;</li>\n<li>学习了一些C++基础,在洛谷上刷了不少算法题;</li>\n<li>ACM招新赛被薄纱差一题进入校队;</li>\n<li>对算法竞赛感到疑惑尝试学习Flutter和操作系统开阔视野;</li>\n<li>入坑战地,爽爽爽;</li>\n<li>被一位巨强的学长发掘加入NUDT超算队;</li>\n<li>面临三个考试周,熬过去就是胜利;</li>\n</ol>\n</blockquote>\n<p>虽然天天早八满课很不爽但是平时还是可以学习自己想学的技术周末也可以打游戏感觉还行吧我还是相信NUDT既来之则安之。</p>\n<p>这里,毕竟是我梦开始的地方。</p>\n<blockquote>\n<p>胸怀祖国,团结协作,志在高峰,奋勇拼搏!</p>\n</blockquote>\n<p>今天是2023年12月6日加油</p>\n<hr>\n<p>修改一下,有的话还是不适合明说哦</p>\n<p>5YK75a2p5a2Q5Lus77yM5b+r6YCD5ZWK77yB77yB77yBCg&#x3D;&#x3D;</p>\n"}],"PostAsset":[],"PostCategory":[{"post_id":"cmi0iescr000eog2b2ugh780z","category_id":"cmi0iescs000hog2b6i033sxi","_id":"cmi0iescu000vog2b5ufeel1d"},{"post_id":"cmi0iescs000jog2bgkpv8cr4","category_id":"cmi0iesct000pog2be99zbtna","_id":"cmi0iescv0011og2b8l1mdj45"},{"post_id":"cmi0iesct000mog2bf2al1nlk","category_id":"cmi0iescu000wog2b0h9u4our","_id":"cmi0iescw0016og2bc80rdo6q"},{"post_id":"cmi0iescu000rog2b1eiye9jq","category_id":"cmi0iescv0012og2b8zqxfcql","_id":"cmi0iescw001cog2b2jcdagbi"},{"post_id":"cmi0iescw001dog2b31u2eu89","category_id":"cmi0iesct000pog2be99zbtna","_id":"cmi0iescx001log2b83jq36q1"},{"post_id":"cmi0iescx001iog2b666m0tt2","category_id":"cmi0iescv0012og2b8zqxfcql","_id":"cmi0iescy001pog2be25hazxn"}],"PostTag":[{"post_id":"cmi0iescp0005og2b38g8hgyl","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescq0008og2b9dm88lql"},{"post_id":"cmi0iescn0001og2b9rmqf5nk","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescr000aog2b4ys15nom"},{"post_id":"cmi0iescq0006og2b6l6sf7kb","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescr000dog2b3jqy59bu"},{"post_id":"cmi0iescq0009og2bettuhl91","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescs000fog2bcg4k98wu"},{"post_id":"cmi0iesco0002og2bd2on1smz","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescs000iog2b58e20xax"},{"post_id":"cmi0iescr000bog2bhmv17lab","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iesct000log2bcitacvj0"},{"post_id":"cmi0iescr000eog2b2ugh780z","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iesct000nog2b0pquciz7"},{"post_id":"cmi0iescp0004og2b3lrb6vyo","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescu000qog2bge6t05db"},{"post_id":"cmi0iescs000gog2b47qaa5er","tag_id":"cmi0iesct000kog2bch6p1fur","_id":"cmi0iescu000tog2b8egvfgfi"},{"post_id":"cmi0iescs000jog2bgkpv8cr4","tag_id":"cmi0iescu000sog2b2zls0z1f","_id":"cmi0iescv0010og2bbxmo28nd"},{"post_id":"cmi0iescv0013og2b3dh6h5cd","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iescw0017og2bb11o5jby"},{"post_id":"cmi0iesct000mog2bf2al1nlk","tag_id":"cmi0iescv000yog2b02za1h9i","_id":"cmi0iescw001bog2b596xhssb"},{"post_id":"cmi0iesct000mog2bf2al1nlk","tag_id":"cmi0iescu000sog2b2zls0z1f","_id":"cmi0iescw001eog2b0rhcbadk"},{"post_id":"cmi0iesct000oog2b3at3eki5","tag_id":"cmi0iescw0019og2b4blahv8f","_id":"cmi0iescx001hog2b715vgqxq"},{"post_id":"cmi0iescw001dog2b31u2eu89","tag_id":"cmi0iescu000sog2b2zls0z1f","_id":"cmi0iescx001jog2bc61880bm"},{"post_id":"cmi0iescx001iog2b666m0tt2","tag_id":"cmi0iescw001fog2b190i311k","_id":"cmi0iescy001nog2b947p1tkh"},{"post_id":"cmi0iescu000rog2b1eiye9jq","tag_id":"cmi0iescw001fog2b190i311k","_id":"cmi0iescy001oog2beh9906jy"},{"post_id":"cmi0iescu000uog2b4t49836d","tag_id":"cmi0iescx001mog2b3lhl2jhz","_id":"cmi0iescy001sog2b1k2shlxy"},{"post_id":"cmi0iescu000uog2b4t49836d","tag_id":"cmi0iescy001qog2ba35khqhv","_id":"cmi0iescy001tog2bg40q68n0"},{"post_id":"cmi0iescu000xog2b6y6h50af","tag_id":"cmi0iescy001qog2ba35khqhv","_id":"cmi0iescy001xog2bgue21ybp"},{"post_id":"cmi0iescu000xog2b6y6h50af","tag_id":"cmi0iescy001uog2bbrccfrvi","_id":"cmi0iescy001yog2b6j7j6oq0"},{"post_id":"cmi0iescu000xog2b6y6h50af","tag_id":"cmi0iescw0019og2b4blahv8f","_id":"cmi0iescy0020og2bhe1d2d7e"},{"post_id":"cmi0iescv000zog2bhb322isp","tag_id":"cmi0iescw0019og2b4blahv8f","_id":"cmi0iescy0021og2bhw106599"},{"post_id":"cmi0iescv0015og2b22v2elt6","tag_id":"cmi0iescw001fog2b190i311k","_id":"cmi0iescy0023og2b6iex3r57"},{"post_id":"cmi0iescw0018og2b1wrcgmac","tag_id":"cmi0iescx001mog2b3lhl2jhz","_id":"cmi0iescy0025og2b0yw71o9j"},{"post_id":"cmi0iescw001aog2be8jp9doe","tag_id":"cmi0iescy0024og2b6emz34dl","_id":"cmi0iescz0028og2bfvgaev8d"},{"post_id":"cmi0iescw001aog2be8jp9doe","tag_id":"cmi0iescx001mog2b3lhl2jhz","_id":"cmi0iescz0029og2bcemycesf"},{"post_id":"cmi0iescx001gog2b9r0jg006","tag_id":"cmi0iescw001fog2b190i311k","_id":"cmi0iescz002dog2b8po51iqp"},{"post_id":"cmi0iescx001gog2b9r0jg006","tag_id":"cmi0iescz002aog2b4pc61nxf","_id":"cmi0iescz002eog2bazax9en9"},{"post_id":"cmi0iescx001gog2b9r0jg006","tag_id":"cmi0iescx001mog2b3lhl2jhz","_id":"cmi0iescz002fog2b6cn975m2"},{"post_id":"cmi0iescx001kog2b0s7mg6qs","tag_id":"cmi0iescz002cog2b7o4fhy2s","_id":"cmi0iescz002gog2bhsn11hti"},{"post_id":"cmi0iescx001kog2b0s7mg6qs","tag_id":"cmi0iescw0019og2b4blahv8f","_id":"cmi0iescz002hog2bcgil5xy1"},{"post_id":"cmi0iesd0002iog2b94zz4o8r","tag_id":"cmi0iescw0019og2b4blahv8f","_id":"cmi0iesd0002kog2bcg8q9esh"},{"post_id":"cmi0iesd0002jog2b0gfohbye","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iesd0002mog2bakx5gc5l"},{"post_id":"cmi0iesd0002log2bhbbb1g93","tag_id":"cmi0iesco0003og2b83bufzsp","_id":"cmi0iesd0002nog2b89abeqkw"}],"Tag":[{"name":"日志","_id":"cmi0iesco0003og2b83bufzsp"},{"name":"TEST","_id":"cmi0iesct000kog2bch6p1fur"},{"name":"音乐","_id":"cmi0iescu000sog2b2zls0z1f"},{"name":"Vocaloid","_id":"cmi0iescv000yog2b02za1h9i"},{"name":"技术分享","_id":"cmi0iescw0019og2b4blahv8f"},{"name":"技术","_id":"cmi0iescw001fog2b190i311k"},{"name":"生活","_id":"cmi0iescx001mog2b3lhl2jhz"},{"name":"Archlinux","_id":"cmi0iescy001qog2ba35khqhv"},{"name":"系统优化","_id":"cmi0iescy001uog2bbrccfrvi"},{"name":"板绘","_id":"cmi0iescy0024og2b6emz34dl"},{"name":"学习","_id":"cmi0iescz002aog2b4pc61nxf"},{"name":"开源工具","_id":"cmi0iescz002cog2b7o4fhy2s"}]}}