<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>张三太爷</title>
	<atom:link href="https://www.somedoc.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.somedoc.net</link>
	<description>看前面，黑洞洞</description>
	<lastBuildDate>Tue, 13 Oct 2026 13:43:29 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.somedoc.net/wp-content/uploads/2016/12/cropped-dandycheung-1-32x32.jpg</url>
	<title>张三太爷</title>
	<link>https://www.somedoc.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>GitHub Desktop 团队，也是草台班子</title>
		<link>https://www.somedoc.net/2026/10/13/github-desktop-%e5%9b%a2%e9%98%9f%ef%bc%8c%e4%b9%9f%e6%98%af%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90/</link>
					<comments>https://www.somedoc.net/2026/10/13/github-desktop-%e5%9b%a2%e9%98%9f%ef%bc%8c%e4%b9%9f%e6%98%af%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 13:43:18 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[问题解决]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6720</guid>

					<description><![CDATA[在电脑里看到的最讨厌的事情之一就是有的程序/组件的重复。Ch <a href="https://www.somedoc.net/2026/10/13/github-desktop-%e5%9b%a2%e9%98%9f%ef%bc%8c%e4%b9%9f%e6%98%af%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">在电脑里看到的最讨厌的事情之一就是有的程序/组件的重复。Chromium 的 CEF 最垃圾，但是惹不起啊，只能忍受，但是别的东东，有时候还是要抗争一下。</p>



<p class="wp-block-paragraph">例如 git。好些个工具都自己带这个玩意儿，但又有好些个总是要检查系统里有没有现成的。既然这样，给你们合二为一不好吗？于是，俺就把 GitHub Desktop 自带的 git 放到了环境变量里。</p>



<p class="wp-block-paragraph">好日子没过几天，某次突然发现在命令行里找不到 git 了。再一看，GitHub Desktop 升级了，它的安装路径下，有一个入口可执行程序，与之平级会有不止一个 <code>app-x.y.x</code> 的目录（很显然，x.y.z 是版本号），每个目录下都是一份完整的对应版本。一般来说，会总是保留最近的两个版本，大概是为了出了问题好回退。这样交替更迭几回，那么死守着旧版本的环境变量总归会失效，需要手动去系统设置里修改一下路径，把版本号改到最新的一版。烦。</p>



<p class="wp-block-paragraph">于是请 WorkBuddy 来帮忙，让它写个批处理（本人一般不会动用 PowerShell 这种重器）。使用它这两天优惠着的 Space-Bunny 模型，好家伙，批处理里面的坑把它折腾的死去活来，整整迭代了九轮，才算出来个能用的，看了下大小，接近 20KB，是我这辈子产出的个头最大的批处理文件了。</p>



<p class="wp-block-paragraph">思路特简单，就是在 app-x.y.z 平级创建一个名为 app-latest 的 Junction（这个单词把老夫搞住了，不知道怎么翻译，之前以为是软链接，但 AI 说不是），如果在命令行里找不到 git 了，就把批处理执行一下，没有这个 Junction 则创建之，有则更新之，而系统环境变量里永远是 latest 不需要改。</p>



<p class="wp-block-paragraph">事情就是这么巧。昨天刚刚把批处理搞定，app-latest 创建好，也指向了最新的 app-3.6.6 目录，GitHub Desktop 工作正常。今天，就在刚刚，把窗口切换到 GitHub Desktop 时，突然弹框报错，说 git 找不到了。拿脚趾头想都知道跟俺昨天的移花接木小手术有关。那个弹框是源源不断的，鼠标点击永远点不完。这个时候要上手速，Alt-F4 连续按，症状消失。到安装目录里查看，果然 app-3.6.7 赫然在目。但这个时候，你如果运行安装目录里的入口程序，则没有任何效果，光标转一两秒后没有任何情况发生。但是，如果双进入到任一版本的目录中，再执行其中的可执行文件，GitHub Desktop 就会正常运行起来。</p>



<p class="wp-block-paragraph">其实昨天写批处理的时候，跟 AI 已经就这个 Junction 的名字讨论过一番了，当时它害怕的是，GitHub Desktop 的升级程序会根据 app- 前缀来过滤出所有匹配的子目录，除去它自己标明为最新版的那个的话，其余的都会一概删除，而这里面一定会包括有 app-latest。老夫当时的逻辑是，app-latest 指向的不管是哪个版本，对于升级器来说一定是指向了一个旧版本，它删就删了。出于洁癖，命名依然定为 app-latest。但今天的铁定事实证明，入口程序也会被 app-latest 影响：因为当俺把 app-latest 的首字母改掉以后，入口程序就也可以加载到正确的最新版本而成功运行起来了。</p>



<p class="wp-block-paragraph">看来还得退避一舍，把批处理里的 app-latest 改成别的名字，就叫 ghd-latest 吧。</p>



<p class="wp-block-paragraph">尽管问题因咱而起，但正如题目所说，开发团队实在是也相当粗疏，app- 的前缀之后，好歹也该检查一下版本格式的。为了表彰 WorkBuddy 虽然资质一般但毕竟勤勤恳恳，把它生成的批处理附录于此。</p>



<pre class="crayon-plain-tag">@echo off
rem ===========================================================================
rem  GitHub Desktop - ghd-latest directory-link maintainer (pure batch)
rem
rem  Usage:
rem    ghd-app-latest.bat                create/update the link as needed
rem    ghd-app-latest.bat -CheckOnly     report only, change nothing
rem    ghd-app-latest.bat latest         use a different link name
rem    ghd-app-latest.bat -Debug         extra tracing while diagnosing
rem
rem  Exit code: 0 ok | 2 install not found | 3 refused | 4 link failed | 1 error
rem
rem  NOTE: keep this file pure ASCII with NO byte order mark.
rem        A BOM-less UTF-8 batch is read by cmd.exe byte by byte, and CJK
rem        text gets chopped into fragments that are then parsed as commands
rem        (it produced errors like "'URTGT' is not recognized"). All prompts
rem        here are ASCII on purpose, so the file works under any code page.
rem
rem  ---------------------------------------------------------------------------
rem  Implementation notes (all native cmd, no PowerShell):
rem    find install : reg query on uninstall keys, else %LOCALAPPDATA%
rem    match names  : pure string substitution, no findstr and no regex. A
rem                   caret-anchored /c:"^app-&#91;0-9]$" never matches inside cmd,
rem                   whatever findstr really receives is not what it looks like.
rem    pick version : split on dots, compare segment by segment numerically.
rem                   Never sort / compare as string - that puts 3.6.10 before
rem                   3.6.9. Also never take the first entry of dir /o-n:
rem                   that is time-ordered and our own ghd-latest sorts first.
rem    read target  : fsutil reparsepoint query, parse the "Substitute Name"
rem                   line. Do NOT use "Print Name" - for a junction its
rem                   length is always 0.
rem    create link  : mklink /J (directory junction). No mklink /D fallback:
rem                   /D needs admin or developer mode, so it fails anyway.
rem    delete link  : rmdir, never with the recursive switch.
rem  ---------------------------------------------------------------------------
setlocal EnableExtensions EnableDelayedExpansion

rem ===========================================================================
rem  Parse arguments
rem ===========================================================================
rem The default link name is "ghd-latest", NOT "app-latest". Squirrel removes
rem stale version directories with a loose test for names CONTAINING "app-",
rem and its recursive delete does not recognise reparse points. A link named
rem app-latest therefore gets destroyed on the next GitHub Desktop update,
rem and the delete follows the junction into the real version directory and
rem removes files from it. That was observed happening on this machine.
rem "ghd-latest" contains no "app-" and stays outside that sweep entirely.
set "LINKNAME=ghd-latest"
set "CHECKONLY=0"
set "DEBUG=0"

:ParseArgs
if "%~1"=="" goto AfterArgs
if /i "%~1"=="-CheckOnly" (set "CHECKONLY=1" &amp; shift &amp; goto ParseArgs)
if /i "%~1"=="/CheckOnly" (set "CHECKONLY=1" &amp; shift &amp; goto ParseArgs)
if /i "%~1"=="-Debug" (set "DEBUG=1" &amp; shift &amp; goto ParseArgs)
if /i "%~1"=="/Debug" (set "DEBUG=1" &amp; shift &amp; goto ParseArgs)
set "LINKNAME=%~1"
shift
goto ParseArgs
:AfterArgs
if "%DEBUG%"=="1" echo (debug mode on)

set "RC=0"
set "E_NOFIND=2"
set "E_REFUSE=3"
set "E_LINKFAIL=4"

echo.
echo GitHub Desktop - ghd-latest link maintainer
echo --------------------------------------------
echo   Link name: %LINKNAME%

rem ===========================================================================
rem  Guard: the link name must not look like a version directory
rem
rem  Done with substitution, not findstr. A caret-anchored regex on a cmd
rem  command line is unreliable (see the note at :ConsiderDir), and a guard
rem  that silently never fires is worse than no guard at all.
rem  Rule: reject if the name starts with "app-" followed by a digit.
rem
rem  Written as a subroutine that returns E_GUARD=1 when it must refuse, so
rem  that no goto ever appears inside a nested if/for block.
rem ===========================================================================
set "E_GUARD=0"
call :CheckGuard
if "%E_GUARD%"=="1" (
    echo    x Link name "%LINKNAME%" clashes with the app-VERSION naming rule.
    echo      Refusing to run. Pick another name, e.g. ghd-app-latest.bat latest
    set "RC=%E_REFUSE%"
    goto Finish
)

rem ===========================================================================
rem  1. Locate the install root
rem ===========================================================================
echo.
echo &#91; Locate install ]

set "ROOT="
for /f "tokens=2,*" %%A in ('reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /v InstallLocation 2^>nul ^| findstr /i /c:"REG_SZ"') do (
    if exist "%%~B\GitHubDesktop.exe" set "ROOT=%%~B"
)
if not defined ROOT if exist "%LOCALAPPDATA%\GitHubDesktop\GitHubDesktop.exe" set "ROOT=%LOCALAPPDATA%\GitHubDesktop"

if not defined ROOT (
    echo    x GitHub Desktop install directory not found.
    echo      Checked: HKCU uninstall InstallLocation and %%LOCALAPPDATA%%\GitHubDesktop
    set "RC=%E_NOFIND%"
    goto Finish
)
echo    + Install root: %ROOT%

rem ===========================================================================
rem  2. Enumerate version directories
rem ===========================================================================
echo.
echo &#91; Version directories ]

set "CAND="
for /f "delims=" %%D in ('dir /b /ad "%ROOT%" 2^>nul') do call :ConsiderDir "%%D"

if not defined CAND (
    echo    x No complete and usable app-VERSION directory found.
    set "RC=%E_NOFIND%"
    goto Finish
)

rem ===========================================================================
rem  3. Pick the highest version (numeric, segment by segment)
rem ===========================================================================
echo.
set "BEST="
for %%D in (%CAND%) do call :PickBest "%%D"

if not defined BEST (
    echo    x Cannot determine the effective version.
    set "RC=%E_NOFIND%"
    goto Finish
)
echo    + Effective version: !BEST!

rem ===========================================================================
rem  4. Inspect the existing link
rem ===========================================================================
echo.
echo &#91; Link state ]
set "LINK=%ROOT%\!LINKNAME!"

if exist "%LINK%\" (
    call :ReadTarget
    if defined CURTGT (
        echo    !LINKNAME! points to: !CURTGT!
        if /i "!CURTGT!"=="%ROOT%\!BEST!" (
            echo.
            echo &#91; Result ]
            echo    Already up to date. Nothing to do.
            set "RC=0"
            goto Finish
        )
        echo    * !LINKNAME! points to an older directory, repointing it to !BEST! ...
    ) else (
        rem Target unreadable: if it is a link, it is broken (rebuild it);
        rem if dir cannot even list it, it is a real directory (refuse).
        dir /a:l "%LINK%" >nul 2>&amp;1
        if errorlevel 1 (
            echo    x "%LINKNAME%" exists but is NOT a link, it is a real directory.
            echo      Refusing to delete it. Please inspect it manually.
            set "RC=%E_REFUSE%"
            goto Finish
        )
        echo    * Found a broken link, no readable target, rebuilding.
    )
) else (
    echo    !LINKNAME! does not exist yet.
    echo    Creating it to point to !BEST! ...
)

if "%CHECKONLY%"=="1" (
    echo.
    echo &#91; Result ]
    echo    CheckOnly mode, nothing was changed.
    echo    It should point to: %ROOT%\!BEST!
    set "RC=0"
    goto Finish
)

rem ===========================================================================
rem  5. Risk warning
rem ===========================================================================
rem WARN=1 when the chosen link name contains app-, which puts the link
rem inside Squirrel's stale-version sweep. That is not theoretical: a link
rem named app-latest was destroyed by a real GitHub Desktop update, and the
rem recursive delete followed the junction and emptied the old version
rem directory it pointed at. The default ghd-latest avoids it entirely.
rem
rem When the chosen name IS out of range, also check whether a leftover link
rem from the old default is still sitting there, and say so.
set "WARN=0"
call :ContainsAppDash
if "%WARN%"=="1" (
    echo.
    echo &#91; Risk warning ]
    echo    * Squirrel removes old versions with a loose "name contains app-"
    echo    * test, not an exact app-DIGIT match, so "%LINKNAME%" is in range.
    echo    * A GitHub Desktop update can delete this link, and the recursive
    echo    * delete does not recognise reparse points, so it follows the link
    echo    * into the real version directory and removes files from it.
    echo      Observed happening with the previous name "app-latest".
    echo      Workaround: ghd-app-latest.bat latest
)

rem leftover check: the old default name is dangerous, flag it if still present
if not "%LINKNAME%"=="app-latest" (
    if exist "%ROOT%\app-latest\" (
        echo.
        echo &#91; Leftover warning ]
        echo    * %ROOT%\app-latest still exists.
        echo    * It is inside the Squirrel sweep and its target directory may
        echo    * already have been emptied. Delete it, you will not need it.
    )
)

rem ===========================================================================
rem  6. Rebuild the link
rem ===========================================================================
echo.
echo &#91; Update link ]

if exist "%LINK%\" (
    rem rmdir removes the link entry itself.
    rem Never add the recursive switch: it would empty the real target.
    rmdir "%LINK%" >nul 2>&amp;1
    if exist "%LINK%\" (
        echo    x Failed to remove the old link, permission denied?
        set "RC=%E_LINKFAIL%"
        goto Finish
    )
    echo    Old link removed, target directory untouched.
    if not exist "%ROOT%\!BEST!\GitHubDesktop.exe" (
        echo    x Target vanished during the operation, aborting.
        set "RC=%E_NOFIND%"
        goto Finish
    )
)

echo    Creating directory junction with mklink /J ...
rem No mklink /D fallback: it needs admin or developer mode, so on a normal
rem user session it always fails. A junction is enough for a local NTFS dir.
mklink /J "%LINK%" "%ROOT%\!BEST!" >nul 2>&amp;1
if not errorlevel 1 goto Verify

echo    x mklink /J failed, check free disk space and permissions.
set "RC=%E_LINKFAIL%"
goto Finish

:Verify
call :ReadTarget
if not defined CURTGT (
    echo    x Cannot read the target after creating the link.
    set "RC=%E_LINKFAIL%"
    goto Finish
)
if /i not "%CURTGT%"=="%ROOT%\!BEST!" (
    echo    x Verification failed, actual target: %CURTGT%
    set "RC=%E_LINKFAIL%"
    goto Finish
)
if not exist "%LINK%\GitHubDesktop.exe" (
    echo    x GitHubDesktop.exe is not reachable through the link.
    set "RC=%E_LINKFAIL%"
    goto Finish
)

echo.
echo &#91; Result ]
echo    + Path : %LINK%
echo    + Target: !CURTGT!
echo    + Verified: GitHubDesktop.exe is reachable through the link
set "RC=0"
goto Finish

rem ===========================================================================
rem  Finish: single exit point, pause only when double-clicked
rem ===========================================================================
:Finish
echo.
if "%RC%"=="0"   echo &#91;OK] Done, the link points at the effective version.
if "%RC%"=="1"   echo &#91;ERR] Script error, see the details above.
if "%RC%"=="2"   echo &#91;ERR] GitHub Desktop install not found, nothing changed.
if "%RC%"=="3"   echo &#91;ERR] Refused on safety grounds, see the reason above.
if "%RC%"=="4"   echo &#91;ERR] Link creation failed, see the reason above.
rem CMDCMDLINE holds this file name when double-clicked, and does not when
rem invoked from an existing prompt - that is how we tell the two apart.
echo %CMDCMDLINE% | find /i "%~nx0" >nul &amp;&amp; pause
endlocal &amp; exit /b %RC%

rem ===========================================================================
rem  :ContainsAppDash -- set WARN=1 when LINKNAME contains "app-"
rem ===========================================================================
:ContainsAppDash
set "WARN=0"
set "WCOPY=!LINKNAME!"
set "WFOUND="
:ContainsLoop
if "!WCOPY!"=="" goto ContainsDone
if not defined WFOUND (
    if "!WCOPY:~0,4!"=="app-" set "WFOUND=1"
)
set "WCOPY=!WCOPY:~1!"
goto ContainsLoop
:ContainsDone
if defined WFOUND set "WARN=1"
exit /b 0

rem ===========================================================================
rem  :CheckGuard -- set E_GUARD=1 when LINKNAME looks like app-&lt;digit>...
rem ===========================================================================
:CheckGuard
set "E_GUARD=0"
set "GHEAD=!LINKNAME:~0,4!"
if not "!GHEAD!"=="app-" exit /b 0
set "GTAIL=!LINKNAME:~4!"
if "!GTAIL!"=="" exit /b 0
rem the character right after app- must be a digit
set "GONE=!GTAIL:~0,1!"
if "!GONE!"=="0" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="1" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="2" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="3" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="4" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="5" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="6" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="7" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="8" set "E_GUARD=1" &amp; exit /b 0
if "!GONE!"=="9" set "E_GUARD=1" &amp; exit /b 0
exit /b 0

rem ===========================================================================
rem  :ConsiderDir "&lt;dirname>" -- keep it in CAND if it is a usable version dir
rem
rem  This is a subroutine on purpose. It used to be a label INSIDE the
rem  "for /f ... do ( ... )" block, with "goto SkipD" as the skip path. That
rem  is the classic batch trap: goto into a block label leaves the parser in
rem  the wrong context, so the block's closing ")" is reported as
rem  ") was unexpected at this time.". A goto that jumps OUT of a block is
rem  fine; jumping INTO one is not. Using "call" keeps every goto outside.
rem
rem  Same reason it does not use setlocal: it must append to the caller's
rem  CAND list.
rem
rem  NOTE: the argument is held in DNAME, never in CD. "%CD%" is a cmd dynamic
rem  variable that expands to the current working directory.
rem
rem  The name test uses string substitution, NOT findstr and NOT a regex.
rem  Debug output proved that inside cmd a double quoted "/c:^app-&#91;0-9]&#91;0-9.]*$"
rem  never matches, whatever findstr receives is not what we think it gets
rem  (caret and dollar are cmd metacharacters on that command line).
rem  Substitution has no such ambiguity:
rem      1. must start with app-
rem      2. strip app-, the remainder must not be empty
rem      3. the remainder must consist only of digits and dots
rem  Verified to accept exactly the same set as the old regex on real data,
rem  plus it additionally rejects mixed case like APP-1.2.
rem ===========================================================================
:ConsiderDir
set "DNAME=%~1"

rem --- name test by substitution, see the note above ---
rem must begin with app-
if "!DNAME:~0,4!" neq "app-" exit /b 0
rem strip the app- prefix, the remainder must not be empty
set "TAIL=!DNAME:~4!"
if "!TAIL!"=="" exit /b 0
rem delete every digit and dot; whatever survives must be empty.
rem Written out longhand instead of a "for %%d in (...)" loop: this routine is
rem reached through CALL, and loop-variable expansion inside a called
rem subroutine is one of the places where it is easy to get the wrong value.
set "REST=!TAIL!"
set "REST=!REST:0=!"
set "REST=!REST:1=!"
set "REST=!REST:2=!"
set "REST=!REST:3=!"
set "REST=!REST:4=!"
set "REST=!REST:5=!"
set "REST=!REST:6=!"
set "REST=!REST:7=!"
set "REST=!REST:8=!"
set "REST=!REST:9=!"
set "REST=!REST:.=!"
if not "!REST!"=="" exit /b 0

if not exist "!ROOT!\!DNAME!\GitHubDesktop.exe" exit /b 0
if exist "!ROOT!\!DNAME!\.dead" exit /b 0
if exist "!ROOT!\!DNAME!\.not-finished" exit /b 0
set "CAND=!CAND! !DNAME!"
echo     !DNAME!
exit /b 0

rem ===========================================================================
rem  :ReadTarget -- read the reparse point target of %LINK% into CURTGT
rem
rem  fsutil prints:
rem      Substitute Name:       \??\C:\path\to\app-3.6.6
rem  tokens=2,* skips the two words "Substitute" and "Name:", so %%B is the
rem  path. The "Print Name" line is unusable, its length is 0 for junctions.
rem  Do NOT use setlocal here, CURTGT could not reach the caller.
rem ===========================================================================
:ReadTarget
set "CURTGT="
set "SUB="
for /f "tokens=2,*" %%A in ('fsutil reparsepoint query "%LINK%" 2^>nul ^| findstr /i /c:"Substitute Name:"') do set "SUB=%%B"
if not defined SUB exit /b 0
rem strip the \??\ reparse prefix to get a normal drive path.
rem Delayed expansion is required here: with "%SUB:...=%" the percent form is
rem expanded while the line is read, so it would pick up the value from the
rem PREVIOUS call rather than the one just assigned on the line above.
set "CURTGT=!SUB:\??\=!"
rem %%~fP makes it absolute and drops the trailing backslash, so that the
rem caller can compare it with plain string equality
if defined CURTGT for %%P in ("!CURTGT!") do set "CURTGT=%%~fP"
exit /b 0

rem ===========================================================================
rem  :PickBest "&lt;dirname>" -- compare version numbers, replace BEST if larger
rem
rem  CALL is used to reuse code, so every routine works on global variables and
rem  must NOT use setlocal (values would not travel back to the caller).
rem  Comparison uses set /a and deliberately no zero padding, because set /a
rem  reads a leading zero as octal and fails on 08.
rem
rem  NOTE: the candidate is held in DNAME, never in CD - "%CD%" is a cmd
rem  dynamic variable holding the current working directory.
rem ===========================================================================
:PickBest
set "DNAME=%~1"
rem String substitution in the delayed-expansion family uses "!" at BOTH ends:
rem   !VAR:find=replace!
rem Writing "%" at the end (as this used to: !DNAME:app-=%) makes cmd treat
rem the trailing "%" as the start of a percent expansion, the substitution
rem never happens, and CV ends up holding the literal text "DNAME:app-=".
rem The debug output showed exactly that, which is why every version compared
rem equal and the first candidate always won.
set "CV=!DNAME:app-=!"

if not defined BEST (
    set "BEST=!DNAME!"
    goto PBEnd
)

rem split the current BEST version into B1..B4
rem Each variable is assigned from its own explicit token index. An earlier
rem version used "if not defined B1 set "B1=%%x"" and relied on the token
rem variables rotating as the for loop iterated; that mixes parse-time
rem (%%x) expansion with run-time ("if not defined") state and is fragile
rem inside a CALLed routine.
rem NOTE: every option of "for /f" must live inside ONE quoted string. Writing
rem for /f "tokens=1" delims=. %%x splits it into two parts and cmd reports
rem "delims was unexpected at this time."
set "BV=!BEST:app-=!"
set "B1=0" &amp; set "B2=0" &amp; set "B3=0" &amp; set "B4=0"
for /f "tokens=1 delims=." %%x in ("!BV!") do set "B1=%%x"
for /f "tokens=2 delims=." %%x in ("!BV!") do set "B2=%%x"
for /f "tokens=3 delims=." %%x in ("!BV!") do set "B3=%%x"
for /f "tokens=4 delims=." %%x in ("!BV!") do set "B4=%%x"

rem split the candidate version into C1..C4
set "C1=0" &amp; set "C2=0" &amp; set "C3=0" &amp; set "C4=0"
for /f "tokens=1 delims=." %%x in ("!CV!") do set "C1=%%x"
for /f "tokens=2 delims=." %%x in ("!CV!") do set "C2=%%x"
for /f "tokens=3 delims=." %%x in ("!CV!") do set "C3=%%x"
for /f "tokens=4 delims=." %%x in ("!CV!") do set "C4=%%x"

rem Segment by segment compare. Written flat on purpose: a chain of nested
rem if-blocks with goto in between is easy to break, and jumping into or
rem across block labels is exactly what caused ") was unexpected at this
rem time." earlier. Here every goto stays at the top level of the routine.
call :Seg !C1! !B1!
if "!CMP!"=="LT" goto PBEnd
if "!CMP!"=="GT" goto PBSet

call :Seg !C2! !B2!
if "!CMP!"=="LT" goto PBEnd
if "!CMP!"=="GT" goto PBSet

call :Seg !C3! !B3!
if "!CMP!"=="LT" goto PBEnd
if "!CMP!"=="GT" goto PBSet

call :Seg !C4! !B4!
if "!CMP!"=="GT" goto PBSet

rem All four segments are equal: keep the earlier one. Two directories with
rem the same version would be abnormal, and not overwriting is the safer
rem choice.
goto PBEnd

:PBSet
set "BEST=!DNAME!"
:PBEnd
exit /b 0

rem ===========================================================================
rem  :Seg &lt;A> &lt;B> -- numeric compare, result in CMP: GT / LT / EQ
rem
rem  The operands arrive as command line arguments. "%~1" is the correct way
rem  to read them: the tilde modifier belongs to the percent family only, so
rem  "!~1!" expands to nothing at all. That silently made both operands 0,
rem  every comparison returned EQ, and BEST stayed on the first candidate
rem  (it picked app-3.6.5 over app-3.6.6).
rem ===========================================================================
:Seg
set "SBA=%~1"
set "SBB=%~2"
if "!SBA!"=="" set "SBA=0"
if "!SBB!"=="" set "SBB=0"
rem "set /a X=X+0" normalises any stray leading zero, which set /a would
rem otherwise read as octal.
set /a "SBA=SBA+0" 2>nul
set /a "SBB=SBB+0" 2>nul
if !SBA! GTR !SBB! (set "CMP=GT") else if !SBA! LSS !SBB! (set "CMP=LT") else (set "CMP=EQ")
exit /b 0</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/10/13/github-desktop-%e5%9b%a2%e9%98%9f%ef%bc%8c%e4%b9%9f%e6%98%af%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>得偿所望之记事本</title>
		<link>https://www.somedoc.net/2026/10/09/%e5%be%97%e5%81%bf%e6%89%80%e6%9c%9b%e4%b9%8b%e8%ae%b0%e4%ba%8b%e6%9c%ac/</link>
					<comments>https://www.somedoc.net/2026/10/09/%e5%be%97%e5%81%bf%e6%89%80%e6%9c%9b%e4%b9%8b%e8%ae%b0%e4%ba%8b%e6%9c%ac/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Fri, 09 Oct 2026 05:00:20 +0000</pubDate>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[生活]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6715</guid>

					<description><![CDATA[使用 Windows 工作多年，每天输入文本，使用过的文本编 <a href="https://www.somedoc.net/2026/10/09/%e5%be%97%e5%81%bf%e6%89%80%e6%9c%9b%e4%b9%8b%e8%ae%b0%e4%ba%8b%e6%9c%ac/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">使用 Windows 工作多年，每天输入文本，使用过的文本编辑的工具真的可以说是五花八门不计其数，但你要问起来，在感觉上最顺手的是哪个，可能诸位会意想不到：记事本。</p>



<p class="wp-block-paragraph">DOS 年代实在太过久远，单行编辑的窘境只残留在某些上古传说里，亲身体会的场景，也就命令提示符下差可比拟。你就是把 DOS 自带的 Edit 从头数落到脚，人家也是个全须全尾的全屏编辑器。以 Borland 公司倡导的 Turbo Vision 字符界面框架没有走几步，Windows 时代（尤其是 Windows 95）就呼啸而至了。</p>



<p class="wp-block-paragraph">记事本成了最便捷的录入工具——但是，也最是恨铁不成钢。见得越频繁，怨得越频繁。三大痛点：</p>



<ul class="wp-block-list">
<li>没有语法高亮；</li>



<li>打开大文件时容易白屏挂死在那儿；</li>



<li>字体不是默认等宽。</li>
</ul>



<p class="wp-block-paragraph">为了免遭这些缺点的困扰，又不知尝试过多少编辑器。有 EditPlus、UltraEdit，还有什么 Notepad++、Notepad2/3/4（这么些个版本后缀，但并不是同一个软件），再有什么 Sublime Text 等等。它们往往在上述痛点的某一个或者某几个方面都触达到了优秀的地步，但又往往会带来其它难以忍受的局面：</p>



<ul class="wp-block-list">
<li>收费，需要破解才能用，或者即使不用破解也凑合能用，但是一打开就有一个烦人提示框要先关闭，标题上故意恶心添加上“未注册版本”的字样；</li>



<li>太丑；这方面 Notepad++ 是典型，我一看它那个标签页，隔夜饭就快要哕出来，后面竟然还有什么民族主义的怪异东西裹入；</li>



<li>太大、笨重；例如 UltraEdit，启动的时候拖泥带水，看见界面显示全乎感觉就要好久；</li>



<li>对中文在内的各种非英语语言支持不好，有的甚至会出现按下回退键只能删除半个汉字的情况（近年来此状况已经有很大好转）；</li>
</ul>



<p class="wp-block-paragraph">十多年前，俺就曾想自己写一个文本编辑的小工具，对标就是系统的记事本，在保留它几乎所有我喜欢的优点的前提下把开头列出的几个问题顺便满足那么一下子。当时起了个头，项目名称为 danedit，意即“Dandy Editor”，然后，就没有然后了。谁让移动时代到来了呢？:)</p>



<p class="wp-block-paragraph">前几天把 TWL（三太爷的一个小型 Windows 开发类库）与时俱进之后，这个念头又涌了上来。这些年，文本编辑器是用 AkelPad 凑合着，这已经是能找到最折中趁手的了，但我觉得仍然不够轻盈。不得不说，AI，给我智慧给我胆，越是艰险越向前。</p>



<p class="wp-block-paragraph">就这样，一时冲动开启了新的项目，名字朴实无华：TextEdit。做了一天之后，突然回想到了 danedit，于是让 AI 检查一下那里面还有没有值得提取的内容，AI 说：</p>



<figure class="wp-block-image size-full"><a href="https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103.png" class="highslide-image" onclick="return hs.expand(this);"><img fetchpriority="high" decoding="async" width="972" height="865" src="https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103.png" alt="" class="wp-image-6716" srcset="https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103.png 972w, https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103-300x267.png 300w, https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103-768x683.png 768w, https://www.somedoc.net/wp-content/uploads/2026/10/DanEdit-之与往事干杯-屏幕截图-2026-10-07-133103-562x500.png 562w" sizes="(max-width: 972px) 100vw, 972px" /></a></figure>



<p class="wp-block-paragraph">老夫从善如流，Shift+Delete 一按，与往事干杯。</p>



<p class="wp-block-paragraph">昨天一天，在搞 TextEdit 的暗黑模式。别看系统发展到今天，看上去已经很完善的样子了似的，但对于 TextEdit 这种专门选择了从系统基础的 SDK API 开发的程序，在 Win32 这个层面上，微软并没有开放稳定的接口用于切换主题模式。但即使从三太爷本人的使用体验来说，暗黑模式也是个无法忽视的基本需求了。AI 一开始无计可施，说难度很大，老夫只好亲自出马，翻找前人遗珍，终有所获。完成之后迫不及待找三五好友帮着试用，除了某些安全怪咖凛然拒绝运行这一可执行文件外，其他选手还算配合。</p>



<p class="wp-block-paragraph">截至半夜，已经收来两个 bug：1. 有些对话框界面里的文字显示会被截断；2. 有时候编辑区会花屏。前者经过俺追问验证，果然是显示器 DPI 惹的祸，而后者虽然概率低，但却严重性高。最终排查的结果是，AI 写代码时忽略了 TWL 的一个原则性的 C++ 对象生命周期的管理方案，导致构造时采用了错误的方式。于是连忙于今早进行 bug 修复。</p>



<p class="wp-block-paragraph">到现在，TextEdit 的大概特点如下：</p>



<ul class="wp-block-list">
<li>单文档界面，支持常见编辑操作；</li>



<li>内置了若干种常见编程语言的高亮规则；</li>



<li>默认强制等宽字体，且一个中文严格等宽两个 ASCII 字符（字体暂不支持自定义）；</li>



<li>支持比较快速地打开体积比较大的文件（100 MB 左右的 JSON 文件大概 1 秒多的样子）；</li>



<li>支持暗黑模式（可强制指定，或者跟随系统）；</li>



<li>理论上能后向兼容至 Windows XP 64 位（32 位的后向兼容可达 Windows 95/NT4，但当前未构建测试）；</li>



<li>单可执行文件，体积 714 KB（1.0.0.93）。</li>
</ul>



<p class="wp-block-paragraph">图标是 WorkBuddy 为它制作的。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://www.somedoc.net/wp-content/uploads/2026/10/得偿所望.jpg" class="highslide-image" onclick="return hs.expand(this);"><img decoding="async" width="600" height="329" src="https://www.somedoc.net/wp-content/uploads/2026/10/得偿所望.jpg" alt="" class="wp-image-6717" srcset="https://www.somedoc.net/wp-content/uploads/2026/10/得偿所望.jpg 600w, https://www.somedoc.net/wp-content/uploads/2026/10/得偿所望-300x165.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /></a></figure>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/10/09/%e5%be%97%e5%81%bf%e6%89%80%e6%9c%9b%e4%b9%8b%e8%ae%b0%e4%ba%8b%e6%9c%ac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TWL 整葺二三事</title>
		<link>https://www.somedoc.net/2026/10/01/twl-%e6%95%b4%e8%91%ba%e4%ba%8c%e4%b8%89%e4%ba%8b/</link>
					<comments>https://www.somedoc.net/2026/10/01/twl-%e6%95%b4%e8%91%ba%e4%ba%8c%e4%b8%89%e4%ba%8b/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 12:25:28 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[技术]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6708</guid>

					<description><![CDATA[花有重开日，人无再少年。可任谁也没想到，二十年后，TWL 还 <a href="https://www.somedoc.net/2026/10/01/twl-%e6%95%b4%e8%91%ba%e4%ba%8c%e4%b8%89%e4%ba%8b/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">花有重开日，人无再少年。可任谁也没想到，二十年后，TWL 还能借助最新的技术进展，在 AI 的帮助下完善、增强。</p>



<p class="wp-block-paragraph">先是把 64 位支持的缺陷（当时还不太急迫，所以只是个缺点；而现在显然就是缺陷了）补上，又把之前一些零星散落在各个测试工程里的有用的控件（如 TreeList）、组件（如 Caption Button、Menu Pin）、功能函数（如 Docking 能力、msimg32 软实现等）、代码片段做了一些整合，融入到 TWL 的整体中来。</p>



<p class="wp-block-paragraph">当基本上告一段落时，三太爷又想尝试一下看能否把一个现成的 SDK 或者 MFC 程序迁移到 TWL 上来，以便观察整体的难度，以及考察 TWL 本身的完整性和适应性。思来想去，选了一个奇怪的目标：Windows 系统中期里的画笔程序。</p>



<p class="wp-block-paragraph">先是到 GitHub 上找到了之前微软泄漏出来的源代码树：</p>



<ul class="wp-block-list">
<li>Windows NT 4：<a href="https://github.com/ZoloZiak/WinNT4">https://github.com/ZoloZiak/WinNT4</a>（貌似仅内核部分）；</li>



<li>Windows 2000：<a href="https://github.com/gameprive/win2k">https://github.com/gameprive/win2k</a>；</li>



<li>Windows XP：<a href="https://github.com/ufwt/windows-XP-SP1">https://github.com/ufwt/windows-XP-SP1</a>；</li>



<li>Windows Server 2003：<a href="https://github.com/selfrender/Windows-Server-2003">https://github.com/selfrender/Windows-Server-2003</a>。</li>
</ul>



<p class="wp-block-paragraph">Windows NT 4 的代码里没有画笔的部分，显然是上传的人没有完整上传（因为根据之前的印象，应用层的很多代码在那次的泄露内容中是有的）。既然如此，那就到 Windows 2000 里去找，GitHub 的项目内查找做得快如闪电，一击命中，位置在 <code>private/windows/shell/accesory/mspaint</code> 下，同时为了证实，也去 Windows XP 的那个仓库里看了一眼，也有，<code>XPSP1/NT/shell/osshell/accesory/mspaint</code>。</p>



<p class="wp-block-paragraph">都取下来，出于好奇还比较了一下，发现相差无几。让反重力出个迁移至 TWL 的方案，它的结论有模有样，建议为了不至于对整个项目的代码大肆翻腾，除了把缺的一些边角自动补齐外，建议做一个 MFC 到 TWL 的“垫层”来对接画笔现有代码和 TWL。甚有工程思维，准了。</p>



<p class="wp-block-paragraph">原以为它语气笃定、轻描淡写就出来的方案会很容易，实在没想到它吭哧憋肚出来的第一个可以运行的版本用时竟然在小时这个量级上。跑起来的时候我觉得这一定就是 TWL 的版本了，更没成想反重力说的是：现在咱们把第一阶段要补的都补齐了，下一个阶段计划把 OLE 服务器的特性去除掉，然后再对接 TWL 怎么样？还能怎么样，当然是你说怎样就怎样了。剥离 OLE 特性好像用时不多，接下来就是老夫在体验 AI 这么长的时间里遇到的第一个比较漫长的单一任务了：它来来回回调整一个叫 <code>twlmfc.h</code> 的头文件，直至最终构建出 TWL 版的画笔程序来，耗时六个半小时。其后又花了大概略逊但接近的时间，把我体验过程中发现的共计十个 bug 修复了。TWL 版的画笔初步落成。</p>



<p class="wp-block-paragraph">整个过程中没有提出 TWL 需要调整的建议，而耗时较长的主要原因在于，TWL 没有对 MFC 里非常重头的文档-视图结构进行支持。总的来说，结果还不错。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">刚刚在 GitHub 的搜索结果里多翻了几页，还有几个仓库：</p>



<ul class="wp-block-list">
<li><a href="https://github.com/Hengle/windows_nt_3_5_source_code">https://github.com/Hengle/windows_nt_3_5_source_code</a>；</li>



<li><a href="https://github.com/lianthony/NT4.0">https://github.com/lianthony/NT4.0</a>（较前文另一链接的内容更多）；</li>



<li><a href="https://github.com/tongzx/nt5src">https://github.com/tongzx/nt5src</a>；</li>



<li><a href="https://github.com/Hengle/windows_2000_source_code">https://github.com/Hengle/windows_2000_source_code</a>。</li>
</ul>



<p class="wp-block-paragraph">也许跟更上面的一样，聊做备份。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/10/01/twl-%e6%95%b4%e8%91%ba%e4%ba%8c%e4%b8%89%e4%ba%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bambook 桌面版工具筹备中</title>
		<link>https://www.somedoc.net/2026/09/13/bambook-%e6%a1%8c%e9%9d%a2%e7%89%88%e5%b7%a5%e5%85%b7%e7%ad%b9%e5%a4%87%e4%b8%ad/</link>
					<comments>https://www.somedoc.net/2026/09/13/bambook-%e6%a1%8c%e9%9d%a2%e7%89%88%e5%b7%a5%e5%85%b7%e7%ad%b9%e5%a4%87%e4%b8%ad/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Sun, 13 Sep 2026 14:44:46 +0000</pubDate>
				<category><![CDATA[备忘录]]></category>
		<category><![CDATA[技术]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6703</guid>

					<description><![CDATA[老规矩，肯定是先收集资料。 找到一个现成的项目，很老很老了（ <a href="https://www.somedoc.net/2026/09/13/bambook-%e6%a1%8c%e9%9d%a2%e7%89%88%e5%b7%a5%e5%85%b7%e7%ad%b9%e5%a4%87%e4%b8%ad/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">老规矩，肯定是先收集资料。</p>



<p class="wp-block-paragraph">找到一个现成的项目，很老很老了（当然 Bambook 本来就很老很老了）：<a href="https://github.com/zhanzushun/Bambook-Factory">https://github.com/zhanzushun/Bambook-Factory</a>。</p>



<p class="wp-block-paragraph">另一个看着也有关，先列到这儿：<a href="https://github.com/quake/BambookPlugin">https://github.com/quake/BambookPlugin</a>。这里的 bambook-sdk 看上去是官方的，就是不知道版本是不是最后更新的。</p>



<p class="wp-block-paragraph">还查出来当年盛大的一个技术人员（似乎就是 SDK 团队的？）的一篇文章：《<a href="https://zbw25.wordpress.com/2010/11/11/%e5%bc%80%e5%8f%91%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f-%e7%99%bd%e6%8b%bfbambook/" data-type="link" data-id="https://zbw25.wordpress.com/2010/11/11/%e5%bc%80%e5%8f%91%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f-%e7%99%bd%e6%8b%bfbambook/">开发应用程序 白拿 Bambook</a>》。</p>



<p class="wp-block-paragraph">SDK 的下载就得到互联网历史博物馆里翻腾了<a href="https://web.archive.org/web/20140904082059/http://bbsdk.sdo.com/download_sdk.do">https://web.archive.org/web/20140904082059/http://bbsdk.sdo.com/download_sdk.do</a>。只可惜，有链接，没有文件了，例如 C++ 的最终版本真实链接是 <a href="http://static.bbsdk.sdo.com/sdk_src/BBSDK_0.9.7.0_CPP.zip">http://static.bbsdk.sdo.com/sdk_src/BBSDK_0.9.7.0_CPP.zip</a>，这顶多知道个文件名。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/09/13/bambook-%e6%a1%8c%e9%9d%a2%e7%89%88%e5%b7%a5%e5%85%b7%e7%ad%b9%e5%a4%87%e4%b8%ad/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>锦书 SD968 的征程（四）</title>
		<link>https://www.somedoc.net/2026/09/12/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e5%9b%9b%ef%bc%89/</link>
					<comments>https://www.somedoc.net/2026/09/12/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e5%9b%9b%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 14:12:41 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6701</guid>

					<description><![CDATA[两三天没干什么其他正经事，全跟它死磕了。还好，结果不错。基本 <a href="https://www.somedoc.net/2026/09/12/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e5%9b%9b%ef%bc%89/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">两三天没干什么其他正经事，全跟它死磕了。还好，结果不错。基本上以下目标全部达到（主要原因是线上服务早已关停，留着没有任何意义）：</p>



<ul class="wp-block-list">
<li>移除之前的登录用户信息；</li>



<li>清除掉所有发现的需要在线使用的功能入口（登录、更新、分享、推荐、天气等等）以及大部分弹框提示（如果不是全部的话）；</li>



<li>文案精校，对大部分交互过程中的中文文案进行了校对和大量格式修正，甚至包括深藏于启动画面和锁屏画面中的提示语；把无用的一些其它语言的资源进行了彻底清理；</li>



<li>功能缺陷的修复，例如进入已读完的类别后，方便快速地切换回书架；</li>



<li>内核缺陷的修复，例如在某些高版本 Windows 系统上会发生 USB 连接后无法建立 adb 连接；</li>



<li>恢复可以 <code>adb install</code> 命令直接安装 app 的能力；</li>
</ul>



<p class="wp-block-paragraph">在以上工作完成后，又特意制作了干净的可供后续作为原始刷机源的映像备用。</p>



<p class="wp-block-paragraph">原本还计划装个浏览器的，后来考虑到系统是 Android 2.2，而且硬件平台又是 MIPS，架构实在太老旧，遂打消此念。</p>



<p class="wp-block-paragraph">那下一步做什么呢？倒是可以考虑把桌面端工具做一下，可以方便地管理书架/书籍。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/09/12/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e5%9b%9b%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>锦书 SD968 的征程（三）</title>
		<link>https://www.somedoc.net/2026/09/09/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89/</link>
					<comments>https://www.somedoc.net/2026/09/09/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 10:33:40 +0000</pubDate>
				<category><![CDATA[硬件]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6698</guid>

					<description><![CDATA[大概都不会想到，又过了好几年，这个系列还能续上。第一篇的链接 <a href="https://www.somedoc.net/2026/09/09/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">大概都不会想到，又过了好几年，这个系列还能续上。第一篇的链接在<a href="https://www.somedoc.net/2021/05/17/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%80%ef%bc%89/" data-type="link" data-id="https://www.somedoc.net/2021/05/17/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%80%ef%bc%89/">这儿</a>，第二篇的在<a href="https://www.somedoc.net/2021/05/17/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89/">这儿</a>；中间其实还有几篇番外，<a href="https://www.somedoc.net/2022/11/16/%e9%94%a6%e4%b9%a6-sd968-%e4%b8%8a%e6%9d%a5%e4%ba%86%e4%b8%aa%e5%b9%b4%e8%bd%bb%e4%ba%ba/" data-type="link" data-id="https://www.somedoc.net/2022/11/16/%e9%94%a6%e4%b9%a6-sd968-%e4%b8%8a%e6%9d%a5%e4%ba%86%e4%b8%aa%e5%b9%b4%e8%bd%bb%e4%ba%ba/">《2022 年了，我决定搭一个 Android 2.2 的开发环境》</a>、<a href="https://www.somedoc.net/2022/11/16/%e9%94%a6%e4%b9%a6-sd968-%e4%b8%8a%e6%9d%a5%e4%ba%86%e4%b8%aa%e5%b9%b4%e8%bd%bb%e4%ba%ba/" data-type="link" data-id="https://www.somedoc.net/2022/11/16/%e9%94%a6%e4%b9%a6-sd968-%e4%b8%8a%e6%9d%a5%e4%ba%86%e4%b8%aa%e5%b9%b4%e8%bd%bb%e4%ba%ba/">《锦书 SD968 上来了个年轻人》</a>、<a href="https://www.somedoc.net/2023/09/03/%e6%89%93%e9%80%a0%e5%bc%80%e5%8f%91-android-2-2-%e5%ba%94%e7%94%a8%e7%9a%84%e4%be%bf%e6%90%ba%e7%8e%af%e5%a2%83%ef%bc%88%e4%b8%80%ef%bc%89/" data-type="link" data-id="https://www.somedoc.net/2023/09/03/%e6%89%93%e9%80%a0%e5%bc%80%e5%8f%91-android-2-2-%e5%ba%94%e7%94%a8%e7%9a%84%e4%be%bf%e6%90%ba%e7%8e%af%e5%a2%83%ef%bc%88%e4%b8%80%ef%bc%89/">《打造开发 Android 2.2 应用的便携环境（一）》</a>以及<a href="https://www.somedoc.net/2023/09/04/%e6%89%93%e9%80%a0%e5%bc%80%e5%8f%91-android-2-2-%e5%ba%94%e7%94%a8%e7%9a%84%e4%be%bf%e6%90%ba%e7%8e%af%e5%a2%83%ef%bc%88%e4%ba%8c%ef%bc%89/" data-type="link" data-id="https://www.somedoc.net/2023/09/04/%e6%89%93%e9%80%a0%e5%bc%80%e5%8f%91-android-2-2-%e5%ba%94%e7%94%a8%e7%9a%84%e4%be%bf%e6%90%ba%e7%8e%af%e5%a2%83%ef%bc%88%e4%ba%8c%ef%bc%89/">《打造开发 Android 2.2 应用的便携环境（二）》</a>。</p>



<p class="wp-block-paragraph">在搭建好基本开发环境和写完第一个 demo 程序成功运行之后，便陷入了无尽的沉寂。说实话，Kindle 都懒得开机，更何况它。要想把它整治出俗，那可是相当大的一番工程。</p>



<p class="wp-block-paragraph">这些日子又看到了在角落里吃灰的它，联想到这些天来 AI 已经在日常的工作学习中占据越来越大的比重，觉得也许 AI 能让它换发一下生机。</p>



<p class="wp-block-paragraph">第一件事是让 AI 看看能不能精简一下系统。结论比较明确，原版系统本身就没太多额外的应用，精简的空间很小。第二件事则是让 AI 再看看能不能把已经无法使用的各种需要原厂商服务器的在线功能的入口都屏蔽掉，回答是可以。就在要让 AI 发力开始有成效的工作之时，魔幻来了，它突然不能通过 ADB 访问了，哈哈哈哈哈！</p>



<p class="wp-block-paragraph">感觉就像是自己骤然迸发了求生欲，现象就是插入电脑，设备管理器显示正常，驱动也没问题，但就是连不上！截止发稿时，尚未恢复！接下来俺将尝试各种方法来拯救/折磨它，钦此。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/09/09/%e9%94%a6%e4%b9%a6-sd968-%e7%9a%84%e5%be%81%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>爷青回之小确幸</title>
		<link>https://www.somedoc.net/2026/09/03/%e7%88%b7%e9%9d%92%e5%9b%9e%e4%b9%8b%e5%b0%8f%e7%a1%ae%e5%b9%b8/</link>
					<comments>https://www.somedoc.net/2026/09/03/%e7%88%b7%e9%9d%92%e5%9b%9e%e4%b9%8b%e5%b0%8f%e7%a1%ae%e5%b9%b8/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Thu, 03 Sep 2026 03:01:27 +0000</pubDate>
				<category><![CDATA[生活]]></category>
		<category><![CDATA[软件]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6692</guid>

					<description><![CDATA[用 AI 有些日子了，今年来每每感叹它的日新月异，功能强劲。 <a href="https://www.somedoc.net/2026/09/03/%e7%88%b7%e9%9d%92%e5%9b%9e%e4%b9%8b%e5%b0%8f%e7%a1%ae%e5%b9%b8/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">用 AI 有些日子了，今年来每每感叹它的日新月异，功能强劲。昨天突然想起个上学时的小事，当时的意难平又被勾引了起来，心想如果问一下 AI 会不会有答案出现呢。之前肯定是问过搜索引擎的，但没有能够解决。</p>



<p class="wp-block-paragraph">那还是在上个世纪的九十年代，在学校一进大门的行政楼里，某个系的机房。花钱买的机时到点后走得匆忙，一张心头好的 3.5 吋软磁盘落在了驱动器里，待到想起来再去找，已然不见踪影。</p>



<p class="wp-block-paragraph">磁盘里是一款软件，清楚地记得我在标签上还写着名字，叫“VP2”，它可以放音乐文件，声音很好听。尽管是 DOS 下的软件按，可它的界面是图形化的，而且是那种漫游形态的。简单点说，就是软件的界面其实比屏幕还要大，就像游戏里面的地图。它的界面宽度是做成和屏幕宽度一致的，因此只能上下漫游，从上到下它的界面做的很像当年高端大气上档次的组合音响，尤其是分频示波的小窗口更是令人印象深刻。类似的效果要到更往后，Winamp，以及更后一点的千千静听才再次能有所超越。</p>



<p class="wp-block-paragraph">就这样，我失去了我钟爱的一张软盘，里面放着我钟爱的一款软件。几十年过去，虽然并非经常，但绝对不止一次想起它。终于在昨晚，向 AI 发出了协助请求。由于时间过于久远，AI 并没有给出非常确切的回答，但它给出了一个最佳推测，“Virtual Player”。实不相瞒，这两个单词也正是我之前一直认为应该是的名字，很可惜每次用它进一步搜索都无功而返。</p>



<p class="wp-block-paragraph">可偏偏就是这次，有了结果。首先是找到一个 YouTube 上的视频，确认了长相，在这里：<a href="https://www.youtube.com/watch?v=JDYNi3t_dYI">Visual Player 2.0, DOS MOD player, Big Psyco mode</a>。然后又在另一处找到了下载链接，在这里（需要注册）：<a href="https://vetusware.com/download/Visual%20Player%202.0/?id=9422">Download Visual Player 2.0 by Luis Crespo | VETUSWARE.COM &#8211; the biggest free abandonware collection in the universe</a>。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://www.somedoc.net/wp-content/uploads/2026/09/image.png" class="highslide-image" onclick="return hs.expand(this);"><img decoding="async" width="640" height="810" src="https://www.somedoc.net/wp-content/uploads/2026/09/image.png" alt="" class="wp-image-6694" srcset="https://www.somedoc.net/wp-content/uploads/2026/09/image.png 640w, https://www.somedoc.net/wp-content/uploads/2026/09/image-237x300.png 237w, https://www.somedoc.net/wp-content/uploads/2026/09/image-395x500.png 395w" sizes="(max-width: 640px) 100vw, 640px" /></a></figure>
</div>


<p class="wp-block-paragraph">尽管那充满颗粒感的界面已经远远不能够跟现在的图形系统相比较，但在得到这个结果的瞬间，老夫是欣喜的。然后开始自我怀疑，为什么以前没有找到？倒回头去看视频的时候，发现也仅仅是两年前才发布上去的。而且在 Reddit 上<a href="https://www.reddit.com/r/dosgaming/comments/13b6qsq/looking_for_old_doswin_31_music_player_and_file/">有一个 3 年前的提问</a>，相当怀疑提问者跟我要找的是同一款软件。从这个帖子的回复里，才发现一个更古早的视频链接，里面已经有 VP2 的界面，但<a href="https://www.youtube.com/watch?v=2ws-I8XvD04">那个视频</a>的曝光度几近于无。</p>



<p class="wp-block-paragraph">除了软件名字以外，还回想起了它所支持的音乐文件的格式，MOD。我在给 AI 提问时仅能模糊地说大概是“MIDI”。从相关信息上看，MOD 似乎要优于 MIDI，而且需要 SoundBlaster 也就是曾经辉煌一时的“声霸卡”的支持，并非我之前印象里的 PC 喇叭（当然我怀疑它可能也优化了对 PC 喇叭的输出质量，仅怀疑，未验证）。这个对特殊硬件的某种依赖或者优化，也可能在某种程度上解释了当年我为什么会去一个其它院系的、一般我都不太会去的机房去上机。</p>



<p class="wp-block-paragraph">在要关闭标签页的时候，看到前一个视频的视频主写的介绍里有这么一句话：I&#8217;ve been looking so long for this software! 可见吾道不孤，令人感慨唏嘘。</p>



<p class="wp-block-paragraph">三十多年了，此番终结。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/09/03/%e7%88%b7%e9%9d%92%e5%9b%9e%e4%b9%8b%e5%b0%8f%e7%a1%ae%e5%b9%b8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>探个头</title>
		<link>https://www.somedoc.net/2026/08/14/%e6%8e%a2%e4%b8%aa%e5%a4%b4/</link>
					<comments>https://www.somedoc.net/2026/08/14/%e6%8e%a2%e4%b8%aa%e5%a4%b4/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 12:07:58 +0000</pubDate>
				<category><![CDATA[生活]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6689</guid>

					<description><![CDATA[时间过得太快，一晃一个月就要过去了，简直是无感。 前几天出了 <a href="https://www.somedoc.net/2026/08/14/%e6%8e%a2%e4%b8%aa%e5%a4%b4/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">时间过得太快，一晃一个月就要过去了，简直是无感。</p>



<p class="wp-block-paragraph">前几天出了一趟门，换一个地方无所事事，倒是每天有面吃。这个幸福虽说对健康无益，可毕竟实在是对胃口，或者说口味。</p>



<p class="wp-block-paragraph">这么荒废的十天一过，今天又是驱使 AI 的一天。每每令人或开心，或恨铁不成钢，不过总体下来，它还是比一两个活人程序员更靠谱，也更勤快的。</p>



<p class="wp-block-paragraph">上午兜妈说她的电脑打不开了，老汉过去盘查一通下来，换了个电源适配器，好了。把换下来的电源适配器继续排查，发现竟然是电源线坏了（应该里面有地方短路了），这种情况实在少见，所以不由得上来记一笔。过些时再找个三眼电源线来，就可以原地复活了。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/08/14/%e6%8e%a2%e4%b8%aa%e5%a4%b4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>草台班子新证据</title>
		<link>https://www.somedoc.net/2026/07/16/%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90%e6%96%b0%e8%af%81%e6%8d%ae/</link>
					<comments>https://www.somedoc.net/2026/07/16/%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90%e6%96%b0%e8%af%81%e6%8d%ae/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 10:35:04 +0000</pubDate>
				<category><![CDATA[软件]]></category>
		<category><![CDATA[问题解决]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6682</guid>

					<description><![CDATA[前两年的时候，想了解一下各个国产厂商的系统里，主题包是怎么个 <a href="https://www.somedoc.net/2026/07/16/%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90%e6%96%b0%e8%af%81%e6%8d%ae/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前两年的时候，想了解一下各个国产厂商的系统里，主题包是怎么个结构，就到网上找了它们各家的主题制作工具安装了一下，好像华为的叫 Theme Studio，OPPO 的叫 Theme Editor（全称是 HeyTapThemeEditor）。</p>



<p class="wp-block-paragraph">前两天的时候，Windows 突然报系统盘空间吃紧，也许是跟最近颇为安装了几个 AI 工具有关，要知道现在的这些 AI 工具大部分都是把 Electron 作为核心技术栈来使用，打出来的包安装之后随随便便就得一两个 GB，空间消耗吓人。于是找来磁盘占用分析工具帮助分析，看哪些可以卸载掉。</p>



<p class="wp-block-paragraph">当然了，HeyTapThemeEditor 就在清退之列。到系统设置里卸载它，可是每次执行过程刚刚开始，它就会报一个错，说“HeyTapThemeEditor 正在运行”，而且也不能够自动关闭，卸载无法完成。</p>



<p class="wp-block-paragraph">无论是拿进程管理工具查看，还是拿窗口遍历工具查看，都没有发现其它与 HeyTapThemeEditor 相关的处于运行状态的进程。只好怀疑它很愚蠢地把它自己当成了问题所在。由于它的报错信息里清晰地包含了“HeyTapThemeEditor”字样，而含有“HeyTapThemeEditor”字样的窗口被俺第一时间认为是它的检测目标，于是请 AI 临时手搓了个脚本，遍历所有窗口，把标题里含有的“HeyTapThemeEditor”去掉。去掉是成功了，但是错误没有消除，依然不能卸载。</p>



<p class="wp-block-paragraph">只好再次仔细检查卸载程序的进程树。<code>Uninstall HeyTapThemeEditor.exe</code> 是安装路径下首先被执行起来的，它会在系统的临时目录里创建一个名为 <code>Un_A.exe</code> 的可执行程序然后将之启动，若半途退出卸载过程，则临时目录里的内容也被清除。看上去很标准的手法，也没什么问题。</p>



<p class="wp-block-paragraph">不过等等，似乎不大对。通常说来，临时目录里的卸载程序启动的时候，安装目录里的内容就不该再有保持活着（执行中）的了，因为要为删除操作创造条件。而当前的状况是，安装目录下的 Uninstall 似乎把 Un_A 加载起来之后一直在等待中，会不会就是这样产生了互相锁死的问题？</p>



<p class="wp-block-paragraph">于是在报错之际，将临时目录里的 Un_A 复制了一份备用，然后把报错的卸载过程退出。再直接去运行复制出的那个 Un_A，果然，卸载得以顺利完成（见下图）。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://www.somedoc.net/wp-content/uploads/2026/07/屏幕截图-2026-07-14-002832.png" class="highslide-image" onclick="return hs.expand(this);"><img loading="lazy" decoding="async" width="499" height="360" src="https://www.somedoc.net/wp-content/uploads/2026/07/屏幕截图-2026-07-14-002832.png" alt="" class="wp-image-6685" srcset="https://www.somedoc.net/wp-content/uploads/2026/07/屏幕截图-2026-07-14-002832.png 499w, https://www.somedoc.net/wp-content/uploads/2026/07/屏幕截图-2026-07-14-002832-300x216.png 300w" sizes="auto, (max-width: 499px) 100vw, 499px" /></a></figure>
</div>


<p class="wp-block-paragraph">此问题在 OPPO 官网提供的最新版的主题设计器中仍然存在。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/07/16/%e8%8d%89%e5%8f%b0%e7%8f%ad%e5%ad%90%e6%96%b0%e8%af%81%e6%8d%ae/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>为了忘不却的纪念</title>
		<link>https://www.somedoc.net/2026/06/21/%e4%b8%ba%e4%ba%86%e5%bf%98%e4%b8%8d%e5%8d%b4%e7%9a%84%e7%ba%aa%e5%bf%b5/</link>
					<comments>https://www.somedoc.net/2026/06/21/%e4%b8%ba%e4%ba%86%e5%bf%98%e4%b8%8d%e5%8d%b4%e7%9a%84%e7%ba%aa%e5%bf%b5/#respond</comments>
		
		<dc:creator><![CDATA[张三太爷]]></dc:creator>
		<pubDate>Sat, 20 Jun 2026 17:23:00 +0000</pubDate>
				<category><![CDATA[生活]]></category>
		<guid isPermaLink="false">https://www.somedoc.net/?p=6679</guid>

					<description><![CDATA[不得不承认，最近似乎有点忙昏了头。在各大厂商的 AI 变得越 <a href="https://www.somedoc.net/2026/06/21/%e4%b8%ba%e4%ba%86%e5%bf%98%e4%b8%8d%e5%8d%b4%e7%9a%84%e7%ba%aa%e5%bf%b5/" class="more-link">[&#8230;]</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">不得不承认，最近似乎有点忙昏了头。在各大厂商的 AI 变得越来越智能的今天，这段时间里，竟然又重拾到了编程的快乐。也许主要是因为这个原因，直到今天才愕然发现，俺的连续更新了这么多年的博客，破天荒地中断了一个多月，阿弥陀佛，罪过罪过。</p>



<p class="wp-block-paragraph">今年是个特殊的年份。兜哥寒窗苦读（是不是真的“苦”，含苦量究竟如何，那当然自当别论），总算告一段落。进考场，出考场，经过众人瞩目的漫长四天，等结果中。“希望本就是无所谓有，也无所谓无的”，俺想。除这一重外，三太爷还正式可以使用“年过半百”这个称号了呢，可以说是往日觊觎已久，今时花落吾家。</p>



<p class="wp-block-paragraph">今天是个特殊的日子。二十多年前，也是端午后的第二天，当时尚且年轻的三太爷急冲冲地赶回老家，去见慈母的最后一面。承受着巨大的疼痛，她老人家神智已经昏迷，饮食、言语均已失能，皮包着骨，似乎惟余粗重的呼吸。木然的三太爷在亲友近邻的催促中出门找最近的大夫，返回家中时母亲已然离去；木然的三太爷又在亲友近邻的催促中到镇上的邮局去打长途电话，把这个消息同步给二哥。电话两头，兄弟相互沉默，继而抽泣。她在世时给我转述她的母亲（也就是我的姥姥）说她的话：自从你嫁给人家张家，没过过一天好日子。子欲养而亲不待。这是种痛，然后当时的痛，并不是它。这种痛，要随着岁月，慢慢显现、慢慢积厚、慢慢迸裂，还要你不能像当时一般表现——或者说发泄——出来。</p>



<p class="wp-block-paragraph">今天是个特殊的日子，父亲节。对于老夫，“这节日更就是无所谓有，也无所谓无的”。但昨晚发生了个小插曲，所以需要记一笔。兜哥约了同学一起看电影，电影看完回家，拎过来一只袋子，说是父亲节礼物。看了一眼，都是文化衫，数量还不少，高达三件。一件是星战题材，一件是唐老鸭，还有一件，嗐，瞅我这记性，没记住。兜哥说，他猜测我最喜欢的应该是星战那件，而唐老鸭无能暴怒的那件，则是他觉得跟我在某些时刻的形象非常匹配。至于最后一件，对不住，还是没想起来，只能记得颜色实在是太亮的色，俺穿着它的时候应该不多。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.somedoc.net/2026/06/21/%e4%b8%ba%e4%ba%86%e5%bf%98%e4%b8%8d%e5%8d%b4%e7%9a%84%e7%ba%aa%e5%bf%b5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
