智能助手网
标签聚合 方案

/tag/方案

linux.do · 2026-04-18 23:02:59+08:00 · tech

Azure的公共IP只允许创建静态IP,静态IP又不在azure for student的额度上,然后扣你余额。 Azure学生包 创建机器默认静态IP 改为动态IP可避免扣费 开发调优 默认配置下来就是静态ip,两台机器一年下来 这100刀基本上就搭进去了 已经创建的虚拟机无法从静态改为动态,只能删机重建 创建时ip要选择基本层,然后才能选择动态ip,不重启应该不会变 [image] 我创建时SKU只有标准,也就改不了动态IP。 好在我之前建了一个有公共IP的虚拟机,又建了一个虚拟网络。我把新老虚拟机都搭载到了虚拟网络上,用老虚拟机访问新虚拟机,同区域间的流量传输不收费。 :新虚拟机如果选择密钥认证,密钥要放在老虚拟上。 只不过这样虚拟机似乎访问不了网络,所以我让老虚拟机做NAT,转发新虚拟机的流量。 首先把老虚拟机的入站端口打开,让新虚拟机的流量能进入老虚拟机。 两台机器都要搭载到一个虚拟网络,但子网不能相同。设定两台机器在子网的静态IP,假设老机器是10.0.0.5,新机器是10.0.1.7。 老虚拟机的网络接口打开“启用 IP 转发”。为新虚拟机建立资源“路由表”,绑定新机器的子网,下一个跃点类型设为VirtualAppliance,下一个IP跃点设为老机器子网IP,即10.0.0.5。 老机器确认出口网卡 ip -br addr 一般是eth0。 老机器启用内核转发 echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-azure-nat.conf sudo sysctl --system 配置NAT规则 sudo iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE sudo iptables -A FORWARD -s 10.0.1.0/24 -o eth0 -j ACCEPT sudo iptables -A FORWARD -d 10.0.1.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i eth0 -j ACCEPT 持久化规则 sudo apt update sudo apt install -y iptables-persistent sudo netfilter-persistent save 然后新机器就可以正常上网了。最后在老机器配置反向代理,就可以通过老机器访问新机器的服务了。 这套方案要确保老机器正常运行,否则两个机器一起down,特别是内存,azure for student免费的机器只有1G内存,最好提前添加交换区。 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-18 19:49:25+08:00 · tech

报错如下: ERROR conda.core.link:_execute(1031): An error occurred while installing package 'defaults::anaconda_powershell_prompt-1.1.0-haa95532_1'. 排查了好一会,尝试各种方案。 最后发现原因: Conda安装程序与系统中的Autorun项发生了冲突。 解决方案: 删除windows 注册表中 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun。如果怕删除引起别的问题,可以直接做一个backup,将其重命名为\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun_Backup,可以找回。 参考 github.com/conda/conda Miniconda install fails: post-link script failed (defaults::anaconda_powershell_prompt-1.1.0-haa95532_0) 已打开 09:12PM - 27 Nov 24 UTC 已关闭 06:52PM - 28 Nov 24 UTC ipiriyan2002 type::bug locked ### Checklist - [x] I added a descriptive title - [x] I searched open reports a … nd couldn't find a duplicate ### What happened? I have been using Anaconda for a long time but wanted to change to miniconda to save space and given that I know what packages I want. However when I try to install miniconda latest version, I encounter the following issue. I then tried older versions and they threw the same issue, including reinstalling Anaconda. `Platform: Windows 11` ```powershell Output folder: C:\Users\ipiri\miniconda3\Lib Extract: _nsis.py Extract: _system_path.py Output folder: C:\Users\ipiri\miniconda3\conda-meta Extract: history Output folder: C:\Users\ipiri\miniconda3 Extract: _conda.exe Extract: pre_uninstall.bat Output folder: C:\Users\ipiri\miniconda3 Output folder: C:\Users\ipiri\miniconda3\pkgs Extract: urls Extract: urls.txt Extract: post_install.bat Output folder: C:\Users\ipiri\miniconda3\pkgs\cache Extract: 3e39a7aa.json Extract: 4ea078d6.json Extract: 59ba4880.json Extract: 5ca77eed.json Extract: 920c960f.json Extract: c4a505b4.json Output folder: C:\Users\ipiri\miniconda3\pkgs Output folder: C:\Users\ipiri\miniconda3\pkgs\anaconda-anon-usage-0.4.4-py312hfc23b7f_100\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\anaconda_powershell_prompt-1.1.0-haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\anaconda_prompt-1.1.0-haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\archspec-0.2.3-pyhd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\boltons-23.0.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\brotli-python-1.0.9-py312hd77b12b_8\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\bzip2-1.0.8-h2bbff1b_6\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\ca-certificates-2024.9.24-haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\certifi-2024.8.30-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\cffi-1.17.1-py312h827c3e9_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\charset-normalizer-3.3.2-pyhd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\colorama-0.4.6-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\conda-24.9.2-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\conda-content-trust-0.2.0-py312haa95532_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\conda-libmamba-solver-24.9.0-pyhd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\conda-package-handling-2.3.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\conda-package-streaming-0.10.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\cryptography-43.0.0-py312h89fc84f_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\distro-1.9.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\expat-2.6.3-h5da7b33_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\fmt-9.1.0-h6d14046_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\frozendict-2.4.2-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\idna-3.7-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\jsonpatch-1.33-py312haa95532_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\jsonpointer-2.1-pyhd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libarchive-3.7.4-h9243413_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libcurl-8.9.1-h0416ee5_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libffi-3.4.4-hd77b12b_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libiconv-1.16-h2bbff1b_3\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libmamba-1.5.8-h99b1521_3\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libmambapy-1.5.8-py312h77c03ed_3\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libsolv-0.7.24-h23ce68f_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libssh2-1.11.0-h291bd65_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\libxml2-2.13.1-h24da03e_2\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\lz4-c-1.9.4-h2bbff1b_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\menuinst-2.1.2-py312h5da7b33_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\openssl-3.0.15-h827c3e9_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\packaging-24.1-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pcre2-10.42-h0ff8eda_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pip-24.2-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\platformdirs-3.10.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pluggy-1.0.0-py312haa95532_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pybind11-abi-5-hd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pycosat-0.6.6-py312h2bbff1b_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pycparser-2.21-pyhd3eb1b0_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\pysocks-1.7.1-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\python-3.12.7-h14ffc60_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\reproc-14.2.4-hd77b12b_2\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\reproc-cpp-14.2.4-hd77b12b_2\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\requests-2.32.3-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\ruamel.yaml-0.18.6-py312h827c3e9_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\ruamel.yaml.clib-0.2.8-py312h827c3e9_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\setuptools-75.1.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\sqlite-3.45.3-h2bbff1b_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\tk-8.6.14-h0416ee5_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\tqdm-4.66.5-py312hfc267ef_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\truststore-0.8.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\tzdata-2024b-h04d1e81_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\urllib3-2.2.3-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\vc-14.40-h2eaa2aa_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\vs2015_runtime-14.40.33807-h98bb1dd_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\wheel-0.44.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\win_inet_pton-1.1.0-py312haa95532_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\xz-5.4.6-h8cc25b3_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\yaml-cpp-0.8.0-hd77b12b_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\zlib-1.2.13-h8cc25b3_1\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\zstandard-0.23.0-py312h4fc1ca9_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs\zstd-1.5.6-h8880b57_0\info Extract: repodata_record.json Output folder: C:\Users\ipiri\miniconda3\pkgs Extract: python-3.12.7-h14ffc60_0.conda Extract: anaconda_powershell_prompt-1.1.0-haa95532_0.conda Extract: anaconda_prompt-1.1.0-haa95532_0.conda Extract: ca-certificates-2024.9.24-haa95532_0.conda Extract: pybind11-abi-5-hd3eb1b0_0.conda Extract: tzdata-2024b-h04d1e81_0.conda Extract: vs2015_runtime-14.40.33807-h98bb1dd_1.conda Extract: vc-14.40-h2eaa2aa_1.conda Extract: bzip2-1.0.8-h2bbff1b_6.conda Extract: expat-2.6.3-h5da7b33_0.conda Extract: fmt-9.1.0-h6d14046_1.conda Extract: libffi-3.4.4-hd77b12b_1.conda Extract: libiconv-1.16-h2bbff1b_3.conda Extract: lz4-c-1.9.4-h2bbff1b_1.conda Extract: openssl-3.0.15-h827c3e9_0.conda Extract: reproc-14.2.4-hd77b12b_2.conda Extract: sqlite-3.45.3-h2bbff1b_0.conda Extract: xz-5.4.6-h8cc25b3_1.conda Extract: yaml-cpp-0.8.0-hd77b12b_1.conda Extract: zlib-1.2.13-h8cc25b3_1.conda Extract: libssh2-1.11.0-h291bd65_0.conda Extract: libxml2-2.13.1-h24da03e_2.conda Extract: pcre2-10.42-h0ff8eda_1.conda Extract: reproc-cpp-14.2.4-hd77b12b_2.conda Extract: tk-8.6.14-h0416ee5_0.conda Extract: zstd-1.5.6-h8880b57_0.conda Extract: libarchive-3.7.4-h9243413_0.conda Extract: libcurl-8.9.1-h0416ee5_0.conda Extract: libsolv-0.7.24-h23ce68f_1.conda Extract: libmamba-1.5.8-h99b1521_3.conda Extract: menuinst-2.1.2-py312h5da7b33_0.conda Extract: anaconda-anon-usage-0.4.4-py312hfc23b7f_100.conda Extract: archspec-0.2.3-pyhd3eb1b0_0.conda Extract: boltons-23.0.0-py312haa95532_0.conda Extract: brotli-python-1.0.9-py312hd77b12b_8.conda Extract: certifi-2024.8.30-py312haa95532_0.conda Extract: charset-normalizer-3.3.2-pyhd3eb1b0_0.conda Extract: colorama-0.4.6-py312haa95532_0.conda Extract: distro-1.9.0-py312haa95532_0.conda Extract: frozendict-2.4.2-py312haa95532_0.conda Extract: idna-3.7-py312haa95532_0.conda Extract: libmambapy-1.5.8-py312h77c03ed_3.conda Extract: packaging-24.1-py312haa95532_0.conda Extract: platformdirs-3.10.0-py312haa95532_0.conda Extract: pluggy-1.0.0-py312haa95532_1.conda Extract: pycosat-0.6.6-py312h2bbff1b_1.conda Extract: ruamel.yaml.clib-0.2.8-py312h827c3e9_0.conda Extract: setuptools-75.1.0-py312haa95532_0.conda Extract: truststore-0.8.0-py312haa95532_0.conda Extract: wheel-0.44.0-py312haa95532_0.conda Extract: win_inet_pton-1.1.0-py312haa95532_0.conda Extract: pip-24.2-py312haa95532_0.conda Extract: pysocks-1.7.1-py312haa95532_0.conda Extract: ruamel.yaml-0.18.6-py312h827c3e9_0.conda Extract: tqdm-4.66.5-py312hfc267ef_0.conda Extract: urllib3-2.2.3-py312haa95532_0.conda Extract: requests-2.32.3-py312haa95532_0.conda Extract: conda-libmamba-solver-24.9.0-pyhd3eb1b0_0.conda Extract: jsonpointer-2.1-pyhd3eb1b0_0.conda Extract: jsonpatch-1.33-py312haa95532_1.conda Extract: pycparser-2.21-pyhd3eb1b0_0.conda Extract: cffi-1.17.1-py312h827c3e9_0.conda Extract: cryptography-43.0.0-py312h89fc84f_0.conda Extract: zstandard-0.23.0-py312h4fc1ca9_0.conda Extract: conda-content-trust-0.2.0-py312haa95532_1.conda Extract: conda-package-streaming-0.10.0-py312haa95532_0.conda Extract: conda-package-handling-2.3.0-py312haa95532_0.conda Extract: conda-24.9.2-py312haa95532_0.conda Setting up the base environment ... Output folder: C:\Users\ipiri\miniconda3\pkgs Extract: env.txt Output folder: C:\Users\ipiri\miniconda3\conda-meta Extract: history Installing packages for base, creating shortcuts if necessary... Downloading and Extracting Packages: ...working... done ## Package Plan ## environment location: C:\Users\ipiri\miniconda3 added / updated specs: - defaults/noarch::archspec==0.2.3=pyhd3eb1b0_0[md5=13d01ee2d343d8539bb47055a6c0b5b2] - defaults/noarch::charset-normalizer==3.3.2=pyhd3eb1b0_0[md5=c6fea3691e85cf7f568b0618ec29fc4f] - defaults/noarch::conda-libmamba-solver==24.9.0=pyhd3eb1b0_0[md5=251a69a5bf578ef59fdf8255c7c25c5d] - defaults/noarch::jsonpointer==2.1=pyhd3eb1b0_0[md5=298ff809e733cb04366e4e629c65aa8d] - defaults/noarch::pybind11-abi==5=hd3eb1b0_0[md5=7f0df6639fdf60ccd3045ee6faedd32f] - defaults/noarch::pycparser==2.21=pyhd3eb1b0_0[md5=135a72ff2a31150a3a3ff0b1edd41ca9] - defaults/noarch::tzdata==2024b=h04d1e81_0[md5=9be694715c6a65f9631bb1b242125e9d] - defaults/win-64::anaconda-anon-usage==0.4.4=py312hfc23b7f_100[md5=7e01b4a1128bbbd94e4eacbf59129c05] - defaults/win-64::anaconda_powershell_prompt==1.1.0=haa95532_0[md5=19ef6ba2f17caca6afeae240c8193979] - defaults/win-64::anaconda_prompt==1.1.0=haa95532_0[md5=f12980dc18dd04d5d50492c7c0f1d1a2] - defaults/win-64::boltons==23.0.0=py312haa95532_0[md5=df8555106ebda0bfb7e873a2899e1e50] - defaults/win-64::brotli-python==1.0.9=py312hd77b12b_8[md5=59ff3db1abed10f8b7705c41f5199573] - defaults/win-64::bzip2==1.0.8=h2bbff1b_6[md5=33e784123d565c38e68945f07b461282] - defaults/win-64::ca-certificates==2024.9.24=haa95532_0[md5=0f84ebf6fe438cbc6997723860ca3de2] - defaults/win-64::certifi==2024.8.30=py312haa95532_0[md5=46d3270437bbd000f59be32b1a0ccdce] - defaults/win-64::cffi==1.17.1=py312h827c3e9_0[md5=fcef370fa986fc1ee293f82af8323339] - defaults/win-64::colorama==0.4.6=py312haa95532_0[md5=161baa1308cf84c4817497287afb709a] - defaults/win-64::conda-content-trust==0.2.0=py312haa95532_1[md5=bc574c11d09ba512434a514d58983ca2] - defaults/win-64::conda-package-handling==2.3.0=py312haa95532_0[md5=b7469f81600402fa325961ae0d3733fe] - defaults/win-64::conda-package-streaming==0.10.0=py312haa95532_0[md5=3cfb78d748555927a5409ed2789d9a23] - defaults/win-64::conda==24.9.2=py312haa95532_0[md5=ccdc4f2f59f9ffb74ac9d4ee496a197d] - defaults/win-64::cryptography==43.0.0=py312h89fc84f_0[md5=04b527bde7c449b0fec5258341e8f8a6] - defaults/win-64::distro==1.9.0=py312haa95532_0[md5=87a1545b00f0734f53e48dc7d7a392e5] - defaults/win-64::expat==2.6.3=h5da7b33_0[md5=0b0d607bdcafa9afa17671242a6deb29] - defaults/win-64::fmt==9.1.0=h6d14046_1[md5=5a94a4f71da5367e14c2b97c93e4f740] - defaults/win-64::frozendict==2.4.2=py312haa95532_0[md5=9e30e114fcb045c7ca538f37950d5120] - defaults/win-64::idna==3.7=py312haa95532_0[md5=114efaad1ed61e1d00e3bbad0aac7d86] - defaults/win-64::jsonpatch==1.33=py312haa95532_1[md5=d9a81ef12b44301b9e0d417f38328b2d] - defaults/win-64::libarchive==3.7.4=h9243413_0[md5=2a85c6e7c1405399517969eb4b90af50] - defaults/win-64::libcurl==8.9.1=h0416ee5_0[md5=a49c47137a05a65e052b919d055d2ae6] - defaults/win-64::libffi==3.4.4=hd77b12b_1[md5=9807b377e11739ae3e920e10e607e460] - defaults/win-64::libiconv==1.16=h2bbff1b_3[md5=1564a57e99efb880d46002dc825d07c1] - defaults/win-64::libmamba==1.5.8=h99b1521_3[md5=5ffe11c1560df366e0afeeffa38c263f] - defaults/win-64::libmambapy==1.5.8=py312h77c03ed_3[md5=614a90d5dd2e999c930727ae27de5d02] - defaults/win-64::libsolv==0.7.24=h23ce68f_1[md5=2207fb6b716b04b4f638d31ebba91e79] - defaults/win-64::libssh2==1.11.0=h291bd65_0[md5=bf8ec4289229332b845dba7b65180de7] - defaults/win-64::libxml2==2.13.1=h24da03e_2[md5=4e98cb73c3e0af7357bfe9aa2bf9fb0a] - defaults/win-64::lz4-c==1.9.4=h2bbff1b_1[md5=723e3ccd4ef7c58ddbfeebe69abff662] - defaults/win-64::menuinst==2.1.2=py312h5da7b33_0[md5=8366733ef4636f427bdeb740d16f4a02] - defaults/win-64::openssl==3.0.15=h827c3e9_0[md5=7781aef6d9439002465f12df75789757] - defaults/win-64::packaging==24.1=py312haa95532_0[md5=b5ecc0a9c2cc5a1e44f9dd4598c4df50] - defaults/win-64::pcre2==10.42=h0ff8eda_1[md5=c09acf9bd80c5a76f5315108b9a34ad5] - defaults/win-64::pip==24.2=py312haa95532_0[md5=cdc7bc1beec1fca9232399b7ce5c579a] - defaults/win-64::platformdirs==3.10.0=py312haa95532_0[md5=21714abfa08e1d6e0435b9768ead622a] - defaults/win-64::pluggy==1.0.0=py312haa95532_1[md5=a035f6bc79b4bd1fd4d7b99effa5b643] - defaults/win-64::pycosat==0.6.6=py312h2bbff1b_1[md5=5ed12cec6117aca1f17e2492b16bf983] - defaults/win-64::pysocks==1.7.1=py312haa95532_0[md5=e5f7b8790925322357ee89cc7ae5bb1c] - defaults/win-64::python==3.12.7=h14ffc60_0[md5=e8862f1d033a406f14be503fac585883] - defaults/win-64::reproc-cpp==14.2.4=hd77b12b_2[md5=34c1b673ec90d3c79cfb1677505ae5c8] - defaults/win-64::reproc==14.2.4=hd77b12b_2[md5=0145436bf5111660b686d3ad7f1b4235] - defaults/win-64::requests==2.32.3=py312haa95532_0[md5=ec7f939e52a6bd6501164b7b11f07fb5] - defaults/win-64::ruamel.yaml.clib==0.2.8=py312h827c3e9_0[md5=a4c0471292bd589a1d8da0e5adbd45e4] - defaults/win-64::ruamel.yaml==0.18.6=py312h827c3e9_0[md5=023be647f9a82f66db5fa1388e67e1fb] - defaults/win-64::setuptools==75.1.0=py312haa95532_0[md5=295271832b0e5fb9788db7993748e392] - defaults/win-64::sqlite==3.45.3=h2bbff1b_0[md5=c5b3b929349655302bf811c45571da6d] - defaults/win-64::tk==8.6.14=h0416ee5_0[md5=da75707c571825eb2ad0eb806710b16b] - defaults/win-64::tqdm==4.66.5=py312hfc267ef_0[md5=61b53ea176ef121a7c4785c3af45b50e] - defaults/win-64::truststore==0.8.0=py312haa95532_0[md5=cd11980b22b5d9d958033a7df07c0617] - defaults/win-64::urllib3==2.2.3=py312haa95532_0[md5=6e9a6165835ea53e6fb604eaa9a67e36] - defaults/win-64::vc==14.40=h2eaa2aa_1[md5=17cff96ab79812e3d26cd65fa5e70088] - defaults/win-64::vs2015_runtime==14.40.33807=h98bb1dd_1[md5=eb3566bfee017cb6cf82bd7c41441586] - defaults/win-64::wheel==0.44.0=py312haa95532_0[md5=e0d4ff7c1b53527d54a4b5c4c3256d8c] - defaults/win-64::win_inet_pton==1.1.0=py312haa95532_0[md5=3ba2805fbd7809df9a5628c068b9d873] - defaults/win-64::xz==5.4.6=h8cc25b3_1[md5=cd89b06b0e59712386f00a41fb2dec32] - defaults/win-64::yaml-cpp==0.8.0=hd77b12b_1[md5=f90bd3c9e348fc821d2699721773225f] - defaults/win-64::zlib==1.2.13=h8cc25b3_1[md5=1f7ea85632611b25599e4cddf5b51d7d] - defaults/win-64::zstandard==0.23.0=py312h4fc1ca9_0[md5=a8b8fcf057573fae512a355daabc3031] - defaults/win-64::zstd==1.5.6=h8880b57_0[md5=0ca0f609c72a6ae9a27985be56b6c351] The following NEW packages will be INSTALLED: anaconda-anon-usa~ pkgs/main/win-64::anaconda-anon-usage-0.4.4-py312hfc23b7f_100 anaconda_powershe~ pkgs/main/win-64::anaconda_powershell_prompt-1.1.0-haa95532_0 anaconda_prompt pkgs/main/win-64::anaconda_prompt-1.1.0-haa95532_0 archspec pkgs/main/noarch::archspec-0.2.3-pyhd3eb1b0_0 boltons pkgs/main/win-64::boltons-23.0.0-py312haa95532_0 brotli-python pkgs/main/win-64::brotli-python-1.0.9-py312hd77b12b_8 bzip2 pkgs/main/win-64::bzip2-1.0.8-h2bbff1b_6 ca-certificates pkgs/main/win-64::ca-certificates-2024.9.24-haa95532_0 certifi pkgs/main/win-64::certifi-2024.8.30-py312haa95532_0 cffi pkgs/main/win-64::cffi-1.17.1-py312h827c3e9_0 charset-normalizer pkgs/main/noarch::charset-normalizer-3.3.2-pyhd3eb1b0_0 colorama pkgs/main/win-64::colorama-0.4.6-py312haa95532_0 conda pkgs/main/win-64::conda-24.9.2-py312haa95532_0 conda-content-tru~ pkgs/main/win-64::conda-content-trust-0.2.0-py312haa95532_1 conda-libmamba-so~ pkgs/main/noarch::conda-libmamba-solver-24.9.0-pyhd3eb1b0_0 conda-package-han~ pkgs/main/win-64::conda-package-handling-2.3.0-py312haa95532_0 conda-package-str~ pkgs/main/win-64::conda-package-streaming-0.10.0-py312haa95532_0 cryptography pkgs/main/win-64::cryptography-43.0.0-py312h89fc84f_0 distro pkgs/main/win-64::distro-1.9.0-py312haa95532_0 expat pkgs/main/win-64::expat-2.6.3-h5da7b33_0 fmt pkgs/main/win-64::fmt-9.1.0-h6d14046_1 frozendict pkgs/main/win-64::frozendict-2.4.2-py312haa95532_0 idna pkgs/main/win-64::idna-3.7-py312haa95532_0 jsonpatch pkgs/main/win-64::jsonpatch-1.33-py312haa95532_1 jsonpointer pkgs/main/noarch::jsonpointer-2.1-pyhd3eb1b0_0 libarchive pkgs/main/win-64::libarchive-3.7.4-h9243413_0 libcurl pkgs/main/win-64::libcurl-8.9.1-h0416ee5_0 libffi pkgs/main/win-64::libffi-3.4.4-hd77b12b_1 libiconv pkgs/main/win-64::libiconv-1.16-h2bbff1b_3 libmamba pkgs/main/win-64::libmamba-1.5.8-h99b1521_3 libmambapy pkgs/main/win-64::libmambapy-1.5.8-py312h77c03ed_3 libsolv pkgs/main/win-64::libsolv-0.7.24-h23ce68f_1 libssh2 pkgs/main/win-64::libssh2-1.11.0-h291bd65_0 libxml2 pkgs/main/win-64::libxml2-2.13.1-h24da03e_2 lz4-c pkgs/main/win-64::lz4-c-1.9.4-h2bbff1b_1 menuinst pkgs/main/win-64::menuinst-2.1.2-py312h5da7b33_0 openssl pkgs/main/win-64::openssl-3.0.15-h827c3e9_0 packaging pkgs/main/win-64::packaging-24.1-py312haa95532_0 pcre2 pkgs/main/win-64::pcre2-10.42-h0ff8eda_1 pip pkgs/main/win-64::pip-24.2-py312haa95532_0 platformdirs pkgs/main/win-64::platformdirs-3.10.0-py312haa95532_0 pluggy pkgs/main/win-64::pluggy-1.0.0-py312haa95532_1 pybind11-abi pkgs/main/noarch::pybind11-abi-5-hd3eb1b0_0 pycosat pkgs/main/win-64::pycosat-0.6.6-py312h2bbff1b_1 pycparser pkgs/main/noarch::pycparser-2.21-pyhd3eb1b0_0 pysocks pkgs/main/win-64::pysocks-1.7.1-py312haa95532_0 python pkgs/main/win-64::python-3.12.7-h14ffc60_0 reproc pkgs/main/win-64::reproc-14.2.4-hd77b12b_2 reproc-cpp pkgs/main/win-64::reproc-cpp-14.2.4-hd77b12b_2 requests pkgs/main/win-64::requests-2.32.3-py312haa95532_0 ruamel.yaml pkgs/main/win-64::ruamel.yaml-0.18.6-py312h827c3e9_0 ruamel.yaml.clib pkgs/main/win-64::ruamel.yaml.clib-0.2.8-py312h827c3e9_0 setuptools pkgs/main/win-64::setuptools-75.1.0-py312haa95532_0 sqlite pkgs/main/win-64::sqlite-3.45.3-h2bbff1b_0 tk pkgs/main/win-64::tk-8.6.14-h0416ee5_0 tqdm pkgs/main/win-64::tqdm-4.66.5-py312hfc267ef_0 truststore pkgs/main/win-64::truststore-0.8.0-py312haa95532_0 tzdata pkgs/main/noarch::tzdata-2024b-h04d1e81_0 urllib3 pkgs/main/win-64::urllib3-2.2.3-py312haa95532_0 vc pkgs/main/win-64::vc-14.40-h2eaa2aa_1 vs2015_runtime pkgs/main/win-64::vs2015_runtime-14.40.33807-h98bb1dd_1 wheel pkgs/main/win-64::wheel-0.44.0-py312haa95532_0 win_inet_pton pkgs/main/win-64::win_inet_pton-1.1.0-py312haa95532_0 xz pkgs/main/win-64::xz-5.4.6-h8cc25b3_1 yaml-cpp pkgs/main/win-64::yaml-cpp-0.8.0-hd77b12b_1 zlib pkgs/main/win-64::zlib-1.2.13-h8cc25b3_1 zstandard pkgs/main/win-64::zstandard-0.23.0-py312h4fc1ca9_0 zstd pkgs/main/win-64::zstd-1.5.6-h8880b57_0 Downloading and Extracting Packages: ...working... done Preparing transaction: ...working... done Executing transaction: ...working... done ERROR conda.core.link:_execute(950): An error occurred while installing package 'defaults::anaconda_powershell_prompt-1.1.0-haa95532_0'. Rolling back transaction: ...working... done LinkError: post-link script failed for package defaults::anaconda_powershell_prompt-1.1.0-haa95532_0 location of failed script: C:\Users\ipiri\miniconda3\Scripts\.anaconda_powershell_prompt-post-link.bat ==> script messages <== <None> ==> script output <== stdout: stderr: The system cannot find the file specified. The system cannot find the file specified. return code: 1 () ::error:: Failed to link extracted packages to C:\Users\ipiri\miniconda3! ``` I aborted the install and the miniconda3 folder does not have the core folders bin, scripts and others. ### Conda Info ```shell ``` ### Conda Config ```shell ``` ### Conda list ```shell ``` ### Additional Context _No response_ 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-18 17:46:34+08:00 · tech

最近半年一直在折腾一个项目——用 AI 自动生成短视频。起因是身边做小生意的朋友总问我能不能帮忙剪视频发抖音,我想这事儿应该能自动化,就开始做了。 分享一下技术方案和踩过的坑,希望对有类似想法的朋友有参考价值。 整体架构 用户上传素材 + 输入文案 ↓ TTS 语音合成(MiniMax / 火山引擎) ↓ 根据语音时长自动分配素材时间轴 ↓ 云端渲染(转场、字幕、BGM) ↓ 成品视频 后端 FastAPI + MySQL,前端 Vue 3,视频渲染走云端 API,手机端用 Capacitor 套了个壳。一个人全栈,没有团队。 几个有意思的技术点 1. TTS 选型 试了一圈,最后主力用 MiniMax speech-2.8-hd,中文多音字准确率目前最好。火山引擎作为补充,主要是剪映生态的独有音色(奶气萌娃、广告解说这种)。Azure 的中文效果一般,Fish Audio 没深入测。 踩坑:TTS 返回的音频时长和文字长度不是线性关系,语气词、停顿都会影响。批量生成时如果对时长有严格要求,需要做重试机制。 2. 素材自动分配 这块逻辑最复杂。用户上传 N 个素材(视频+图片混合),系统要自动决定每个素材展示多久、从视频的哪个位置截取。 几个关键决策: 视频从中间 70% 区域截取(跳过开头 20% 和结尾 10%),因为大部分手机拍的视频开头都是晃动的 图片展示时长根据总时长动态计算,保证每张都出现,最少 1 秒/张 批量生成时用发牌算法分配素材,保证每条视频的封面帧不同 3. 批量生成去重 做矩阵号的核心需求是"一组素材生成几十条不重复的视频"。去重策略: AI 扩写多组文案时分配不同的切入角度(预定义了 30 个角度) 每条视频的素材起始偏移不同 视频截取位置随机化 第一个 clip 强制用不同素材保证封面不同 4. 浮点精度问题 这个坑最隐蔽。视频时间轴用浮点数计算,多个 clip 拼接时 accumulated 会漂移,导致素材重叠或出现缝隙。解决方案是每次用 round 后的值更新 accumulated: cs = round(clip_start, 1) ce = round(clip_end, 1) accumulated += (ce - cs) # 不是 accumulated += clip_dur 5. 实时语音输入 加了个语音输入功能,用户对着手机说文案直接转文字。技术上是浏览器 AudioContext 采集 PCM → WebSocket 传到后端 → 转发到阿里云 paraformer-realtime-v2。 踩坑:中间结果和最终结果的拼接如果处理不好会闪烁,最后用了"快照 + 增量"的方案解决。 技术栈汇总 层 技术 前端 Vue 3 + Vite + Capacitor 后端 Python 3.13 + FastAPI + SQLAlchemy 数据库 MySQL 8 存储 阿里云 OSS + CDN AI 文案 通义千问 TTS 火山引擎 语音识别 阿里云 paraformer-realtime-v2 目前自己和几个朋友在用,做餐饮和服装的,反馈还行。有兴趣的可以体验一下: https://zj.xinghepay.com ,Android 也有 APK https://media.xinghepay.com/xinghe/app/xhzj.apk 技术上有什么想聊的欢迎评论区交流,特别是视频处理和 TTS 这块,踩的坑比较多,能聊的也多 6 个帖子 - 5 位参与者 阅读完整话题

linux.do · 2026-04-18 13:53:38+08:00 · tech

我发现最新Claude code已无法直接在Android termux用npm安装来直接使用,会有报错,肯定是Termux环境的兼容问题,毕竟不是标准的Linux。如何解决: 1.非proot方案(推荐) #!/data/data/com.termux/files/usr/bin/bash set -euo pipefail readonly SCRIPT_NAME="$(basename "$0")" readonly PREFIX_DIR="${PREFIX:-/data/data/com.termux/files/usr}" readonly STATE_DIR="${CLAUDE_CODE_HOME:-$HOME/.claude-code-termux}" readonly NODE_DIR="$STATE_DIR/node" readonly WRAPPER_BIN_DIR="$STATE_DIR/bin" readonly PATCH_DIR="$STATE_DIR/patches" readonly GLOBAL_PREFIX_DIR="$STATE_DIR/npm-global" readonly GLOBAL_BIN_DIR="$GLOBAL_PREFIX_DIR/bin" readonly NPM_CACHE_DIR="$STATE_DIR/npm-cache" readonly TMP_ROOT_DIR="${TMPDIR:-$PREFIX_DIR/tmp}" readonly GLIBC_LDSO="$PREFIX_DIR/glibc/lib/ld-linux-aarch64.so.1" readonly GLIBC_RUNNER_BIN="$PREFIX_DIR/bin/grun" readonly GLIBC_MARKER="$STATE_DIR/.glibc-arch" readonly HOST_CLAUDE_PATH="$PREFIX_DIR/bin/claude" readonly BACKUP_DIR="$STATE_DIR/backups" readonly CLAUDE_PACKAGE_NAME="@anthropic-ai/claude-code" readonly CLAUDE_PACKAGE_VERSION="${CLAUDE_CODE_VERSION:-latest}" readonly NODE_VERSION="${CLAUDE_CODE_NODE_VERSION:-22.22.0}" readonly NODE_TARBALL="node-v${NODE_VERSION}-linux-arm64.tar.xz" readonly NODE_URL="https://nodejs.org/dist/v${NODE_VERSION}/${NODE_TARBALL}" readonly COMPAT_PATCH_PATH="$PATCH_DIR/claude-glibc-compat.js" readonly CLAUDE_EXE_PATH="$GLOBAL_PREFIX_DIR/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe" readonly HOST_WRAPPER_MARKER="# claude-code-termux-nonproot-wrapper" readonly C_BOLD_BLUE="\033[1;34m" readonly C_BOLD_GREEN="\033[1;32m" readonly C_BOLD_YELLOW="\033[1;33m" readonly C_BOLD_RED="\033[1;31m" readonly C_RESET="\033[0m" info() { printf '%b[INFO]%b %s\n' "$C_BOLD_BLUE" "$C_RESET" "$*" } success() { printf '%b[ OK ]%b %s\n' "$C_BOLD_GREEN" "$C_RESET" "$*" } warn() { printf '%b[WARN]%b %s\n' "$C_BOLD_YELLOW" "$C_RESET" "$*" >&2 } die() { printf '%b[ERR ]%b %s\n' "$C_BOLD_RED" "$C_RESET" "$*" >&2 exit 1 } usage() { cat <<EOF Usage: bash $SCRIPT_NAME What it does: 1. Installs Termux dependencies needed for a glibc-based Node runtime. 2. Installs glibc-runner through pacman (no proot distro). 3. Downloads official Node.js ${NODE_VERSION} linux-arm64. 4. Wraps node/npm with ld.so so they run on Termux. 5. Installs ${CLAUDE_PACKAGE_NAME} and exposes it as: $HOST_CLAUDE_PATH Environment overrides: CLAUDE_CODE_HOME install state dir, default: $STATE_DIR CLAUDE_CODE_VERSION npm package version/tag, default: $CLAUDE_PACKAGE_VERSION CLAUDE_CODE_NODE_VERSION Node.js linux-arm64 version, default: $NODE_VERSION Notes: - This follows the non-proot glibc-wrapper approach used by openclaw-android. - Only aarch64 Termux is supported. - Existing $HOST_CLAUDE_PATH will be backed up if it is not already managed. EOF } command_exists() { command -v "$1" >/dev/null 2>&1 } require_termux() { [ -d "$PREFIX_DIR" ] || die "This script must run in Termux." command_exists pkg || die "pkg not found. This script must run in Termux." } ensure_tmp_root() { mkdir -p "$TMP_ROOT_DIR" } ensure_state_dirs() { mkdir -p "$STATE_DIR" "$WRAPPER_BIN_DIR" "$PATCH_DIR" "$GLOBAL_PREFIX_DIR" \ "$GLOBAL_BIN_DIR" "$NPM_CACHE_DIR" "$BACKUP_DIR" } ensure_termux_package() { local package_name="$1" if dpkg -s "$package_name" >/dev/null 2>&1; then success "Termux package already installed: $package_name" return 0 fi info "Installing Termux package: $package_name" pkg install -y "$package_name" success "Installed Termux package: $package_name" } ensure_glibc_runner() { local arch local pacman_conf local siglevel_patched=0 arch="$(uname -m)" [ "$arch" = "aarch64" ] || die "glibc mode only supports aarch64, got: $arch" if [ -f "$GLIBC_MARKER" ] && [ -x "$GLIBC_LDSO" ]; then success "glibc-runner already available" return 0 fi ensure_termux_package "pacman" pacman_conf="$PREFIX_DIR/etc/pacman.conf" info "Initializing pacman for glibc-runner" if [ -f "$pacman_conf" ] && ! grep -q '^SigLevel = Never' "$pacman_conf"; then cp "$pacman_conf" "${pacman_conf}.bak" sed -i 's/^SigLevel\s*=.*/SigLevel = Never/' "$pacman_conf" siglevel_patched=1 warn "Applied temporary pacman SigLevel workaround" fi pacman-key --init 2>/dev/null || true pacman-key --populate 2>/dev/null || true info "Installing glibc-runner" if ! pacman -Sy glibc-runner --noconfirm --assume-installed bash,patchelf,resolv-conf; then if [ "$siglevel_patched" -eq 1 ] && [ -f "${pacman_conf}.bak" ]; then mv "${pacman_conf}.bak" "$pacman_conf" fi die "Failed to install glibc-runner" fi if [ "$siglevel_patched" -eq 1 ] && [ -f "${pacman_conf}.bak" ]; then mv "${pacman_conf}.bak" "$pacman_conf" success "Restored pacman SigLevel" fi [ -x "$GLIBC_LDSO" ] || die "glibc dynamic linker not found at $GLIBC_LDSO" touch "$GLIBC_MARKER" success "glibc-runner is ready" } write_compat_patch() { info "Writing Node compatibility patch" cat >"$COMPAT_PATCH_PATH" <<'EOF' 'use strict'; const childProcess = require('child_process'); const dns = require('dns'); const fs = require('fs'); const os = require('os'); const path = require('path'); const prefix = process.env.PREFIX || '/data/data/com.termux/files/usr'; const home = process.env.HOME || '/data/data/com.termux/files/home'; const wrapperPath = process.env._CLAUDE_WRAPPER_PATH || path.join(home, '.claude-code-termux', 'bin', 'node'); const termuxExec = path.join(prefix, 'lib', 'libtermux-exec-ld-preload.so'); const termuxShell = path.join(prefix, 'bin', 'sh'); try { if (fs.existsSync(wrapperPath)) { Object.defineProperty(process, 'execPath', { value: wrapperPath, writable: true, configurable: true, }); } } catch {} if (process.env._CLAUDE_ORIG_LD_PRELOAD) { process.env.LD_PRELOAD = process.env._CLAUDE_ORIG_LD_PRELOAD; delete process.env._CLAUDE_ORIG_LD_PRELOAD; } else if (!process.env.LD_PRELOAD) { try { if (fs.existsSync(termuxExec)) { process.env.LD_PRELOAD = termuxExec; } } catch {} } const originalCpus = os.cpus; os.cpus = function cpus() { try { const result = originalCpus.call(os); if (Array.isArray(result) && result.length > 0) { return result; } } catch {} return [{ model: 'unknown', speed: 0, times: { user: 0, nice: 0, sys: 0, idle: 0, irq: 0 }, }]; }; const originalNetworkInterfaces = os.networkInterfaces; os.networkInterfaces = function networkInterfaces() { try { return originalNetworkInterfaces.call(os); } catch { return { lo: [{ address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: true, cidr: '127.0.0.1/8', }], }; } }; if (!fs.existsSync('/bin/sh') && fs.existsSync(termuxShell)) { const originalExec = childProcess.exec; const originalExecSync = childProcess.execSync; childProcess.exec = function exec(command, options, callback) { if (typeof options === 'function') { callback = options; options = {}; } options = options || {}; if (!options.shell) { options.shell = termuxShell; } return originalExec.call(childProcess, command, options, callback); }; childProcess.execSync = function execSync(command, options) { options = options || {}; if (!options.shell) { options.shell = termuxShell; } return originalExecSync.call(childProcess, command, options); }; } try { let dnsServers = ['8.8.8.8', '8.8.4.4']; try { const resolvConf = fs.readFileSync(path.join(prefix, 'etc', 'resolv.conf'), 'utf8'); const matches = resolvConf.match(/^nameserver\s+(.+)$/gm); if (matches && matches.length > 0) { dnsServers = matches.map((line) => line.replace(/^nameserver\s+/, '').trim()); } } catch {} try { dns.setServers(dnsServers); } catch {} const originalLookup = dns.lookup; const originalLookupPromise = dns.promises.lookup; dns.lookup = function lookup(hostname, options, callback) { if (typeof options === 'function') { callback = options; options = {}; } const originalOptions = options; const opts = typeof options === 'number' ? { family: options } : (options || {}); const wantAll = opts.all === true; const family = opts.family || 0; const resolveWith = (fam, done) => { const resolver = fam === 6 ? dns.resolve6 : dns.resolve4; resolver(hostname, done); }; const tryResolve = (fam) => { resolveWith(fam, (error, addresses) => { if (!error && Array.isArray(addresses) && addresses.length > 0) { const resolvedFamily = fam === 6 ? 6 : 4; if (wantAll) { callback(null, addresses.map((address) => ({ address, family: resolvedFamily, }))); return; } callback(null, addresses[0], resolvedFamily); return; } if (family === 0 && fam === 4) { tryResolve(6); return; } originalLookup.call(dns, hostname, originalOptions, callback); }); }; tryResolve(family === 6 ? 6 : 4); }; dns.promises.lookup = async function lookup(hostname, options) { const opts = typeof options === 'number' ? { family: options } : (options || {}); const wantAll = opts.all === true; const family = opts.family || 0; const resolveWith = family === 6 ? dns.promises.resolve6 : dns.promises.resolve4; try { const addresses = await resolveWith(hostname); if (addresses.length > 0) { const resolvedFamily = family === 6 ? 6 : 4; if (wantAll) { return addresses.map((address) => ({ address, family: resolvedFamily, })); } return { address: addresses[0], family: resolvedFamily, }; } } catch {} if (family === 0) { try { const addresses = await dns.promises.resolve6(hostname); if (addresses.length > 0) { if (wantAll) { return addresses.map((address) => ({ address, family: 6 })); } return { address: addresses[0], family: 6, }; } } catch {} } return originalLookupPromise.call(dns.promises, hostname, options); }; } catch {} EOF success "Compatibility patch written to $COMPAT_PATCH_PATH" } write_node_wrappers() { local node_bin_path local node_real_path node_bin_path="$NODE_DIR/bin/node" node_real_path="$NODE_DIR/bin/node.real" if [ -f "$node_real_path" ]; then : elif [ -f "$node_bin_path" ]; then mv "$node_bin_path" "$node_real_path" else die "Node binary missing at $node_bin_path" fi info "Writing node/npm wrappers" cat >"$WRAPPER_BIN_DIR/node" <<EOF #!$PREFIX_DIR/bin/bash [ -n "\${LD_PRELOAD:-}" ] && export _CLAUDE_ORIG_LD_PRELOAD="\$LD_PRELOAD" unset LD_PRELOAD export _CLAUDE_WRAPPER_PATH="$WRAPPER_BIN_DIR/node" export TMPDIR="\${TMPDIR:-$TMP_ROOT_DIR}" _CLAUDE_COMPAT="$COMPAT_PATCH_PATH" if [ -f "\$_CLAUDE_COMPAT" ]; then case "\${NODE_OPTIONS:-}" in *"\$_CLAUDE_COMPAT"*) ;; *) export NODE_OPTIONS="\${NODE_OPTIONS:+\$NODE_OPTIONS }-r \$_CLAUDE_COMPAT" ;; esac fi exec "$GLIBC_LDSO" --library-path "$PREFIX_DIR/glibc/lib" "$NODE_DIR/bin/node.real" "\$@" EOF cat >"$WRAPPER_BIN_DIR/npm" <<EOF #!$PREFIX_DIR/bin/bash export PATH="$WRAPPER_BIN_DIR:$NODE_DIR/bin:\$PATH" export TMPDIR="\${TMPDIR:-$TMP_ROOT_DIR}" export NPM_CONFIG_PREFIX="$GLOBAL_PREFIX_DIR" export npm_config_prefix="$GLOBAL_PREFIX_DIR" export NPM_CONFIG_CACHE="$NPM_CACHE_DIR" export npm_config_cache="$NPM_CACHE_DIR" export NPM_CONFIG_SCRIPT_SHELL="$PREFIX_DIR/bin/sh" export npm_config_script_shell="$PREFIX_DIR/bin/sh" exec "$WRAPPER_BIN_DIR/node" "$NODE_DIR/lib/node_modules/npm/bin/npm-cli.js" "\$@" EOF cat >"$WRAPPER_BIN_DIR/npx" <<EOF #!$PREFIX_DIR/bin/bash export PATH="$WRAPPER_BIN_DIR:$NODE_DIR/bin:\$PATH" export TMPDIR="\${TMPDIR:-$TMP_ROOT_DIR}" export NPM_CONFIG_PREFIX="$GLOBAL_PREFIX_DIR" export npm_config_prefix="$GLOBAL_PREFIX_DIR" export NPM_CONFIG_CACHE="$NPM_CACHE_DIR" export npm_config_cache="$NPM_CACHE_DIR" export NPM_CONFIG_SCRIPT_SHELL="$PREFIX_DIR/bin/sh" export npm_config_script_shell="$PREFIX_DIR/bin/sh" exec "$WRAPPER_BIN_DIR/node" "$NODE_DIR/lib/node_modules/npm/bin/npx-cli.js" "\$@" EOF chmod 755 "$WRAPPER_BIN_DIR/node" "$WRAPPER_BIN_DIR/npm" "$WRAPPER_BIN_DIR/npx" success "node/npm wrappers are ready" } install_node_runtime() { local installed_version local tmp_dir local extract_dir local fresh_dir ensure_termux_package "curl" ensure_termux_package "xz-utils" if [ -x "$WRAPPER_BIN_DIR/node" ]; then installed_version="$("$WRAPPER_BIN_DIR/node" --version 2>/dev/null | sed 's/^v//')" if [ "$installed_version" = "$NODE_VERSION" ]; then success "Node.js already installed: v$installed_version" write_compat_patch write_node_wrappers return 0 fi fi info "Downloading official Node.js ${NODE_VERSION} linux-arm64" tmp_dir="$(mktemp -d "$TMP_ROOT_DIR/claude-node.XXXXXX")" curl -fL --max-time 300 "$NODE_URL" -o "$tmp_dir/$NODE_TARBALL" success "Downloaded $NODE_TARBALL" extract_dir="$tmp_dir/extract" fresh_dir="$tmp_dir/node-fresh" mkdir -p "$extract_dir" "$fresh_dir" tar -xJf "$tmp_dir/$NODE_TARBALL" -C "$extract_dir" mv "$extract_dir"/node-v"${NODE_VERSION}"-linux-arm64/* "$fresh_dir"/ rm -rf "$NODE_DIR" mkdir -p "$(dirname "$NODE_DIR")" mv "$fresh_dir" "$NODE_DIR" write_compat_patch write_node_wrappers rm -rf "$tmp_dir" success "Node.js runtime installed in $NODE_DIR" } install_claude_package() { local package_spec package_spec="$CLAUDE_PACKAGE_NAME" if [ "$CLAUDE_PACKAGE_VERSION" != "latest" ]; then package_spec="${CLAUDE_PACKAGE_NAME}@${CLAUDE_PACKAGE_VERSION}" fi info "Installing $package_spec" PATH="$WRAPPER_BIN_DIR:$GLOBAL_BIN_DIR:$PATH" "$WRAPPER_BIN_DIR/npm" install -g "$package_spec" [ -e "$GLOBAL_BIN_DIR/claude" ] || die "npm install completed, but $GLOBAL_BIN_DIR/claude was not created" [ -x "$CLAUDE_EXE_PATH" ] || die "Claude native binary missing at $CLAUDE_EXE_PATH" success "Claude Code is installed under $GLOBAL_PREFIX_DIR" } backup_existing_launcher() { local backup_path if [ ! -e "$HOST_CLAUDE_PATH" ]; then return 0 fi if grep -Fq "$HOST_WRAPPER_MARKER" "$HOST_CLAUDE_PATH" 2>/dev/null; then success "Managed host launcher already present" return 0 fi backup_path="$BACKUP_DIR/claude.host-backup.$(date +%Y%m%d_%H%M%S)" cp "$HOST_CLAUDE_PATH" "$backup_path" success "Backed up existing launcher to $backup_path" } install_host_wrapper() { local tmp_wrapper tmp_wrapper="$(mktemp "$TMP_ROOT_DIR/claude-wrapper.XXXXXX")" cat >"$tmp_wrapper" <<EOF #!$PREFIX_DIR/bin/bash $HOST_WRAPPER_MARKER export PATH="$WRAPPER_BIN_DIR:$GLOBAL_BIN_DIR:\$PATH" export TMPDIR="\${TMPDIR:-$TMP_ROOT_DIR}" exec "$GLIBC_RUNNER_BIN" -t "$CLAUDE_EXE_PATH" "\$@" EOF chmod 755 "$tmp_wrapper" cp "$tmp_wrapper" "$HOST_CLAUDE_PATH" chmod 755 "$HOST_CLAUDE_PATH" rm -f "$tmp_wrapper" success "Installed host launcher: $HOST_CLAUDE_PATH" } verify_install() { info "Verifying Node wrapper" "$WRAPPER_BIN_DIR/node" --version info "Verifying npm wrapper" "$WRAPPER_BIN_DIR/npm" --version info "Verifying Claude Code launcher" "$HOST_CLAUDE_PATH" --version success "Non-proot Claude Code setup completed" } main() { if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage exit 0 fi require_termux ensure_tmp_root ensure_state_dirs ensure_glibc_runner install_node_runtime install_claude_package backup_existing_launcher install_host_wrapper verify_install cat <<EOF Run Claude Code with: claude Current configuration: state dir: $STATE_DIR node version: $NODE_VERSION package version: $CLAUDE_PACKAGE_VERSION launcher: $HOST_CLAUDE_PATH EOF } main "$@" 2.proot方案 (会卡顿 卡就对了 卡了就等待) #!/data/data/com.termux/files/usr/bin/bash set -euo pipefail readonly SCRIPT_NAME="$(basename "$0")" readonly DISTRO_NAME="${CLAUDE_CODE_DISTRO:-debian}" readonly CLAUDE_PACKAGE_NAME="@anthropic-ai/claude-code" readonly CLAUDE_PACKAGE_VERSION="${CLAUDE_CODE_VERSION:-latest}" readonly PREFIX_DIR="${PREFIX:-/data/data/com.termux/files/usr}" readonly HOST_CLAUDE_PATH="$PREFIX_DIR/bin/claude" readonly PROOT_ROOT_DIR="$PREFIX_DIR/var/lib/proot-distro/installed-rootfs" readonly BACKUP_DIR="$HOME/.codex/tmp" readonly WRAPPER_MARKER="# claude-code-termux-wrapper" readonly C_BOLD_BLUE="\033[1;34m" readonly C_BOLD_GREEN="\033[1;32m" readonly C_BOLD_YELLOW="\033[1;33m" readonly C_BOLD_RED="\033[1;31m" readonly C_RESET="\033[0m" info() { printf '%b[INFO]%b %s\n' "$C_BOLD_BLUE" "$C_RESET" "$*" } success() { printf '%b[ OK ]%b %s\n' "$C_BOLD_GREEN" "$C_RESET" "$*" } warn() { printf '%b[WARN]%b %s\n' "$C_BOLD_YELLOW" "$C_RESET" "$*" >&2 } die() { printf '%b[ERR ]%b %s\n' "$C_BOLD_RED" "$C_RESET" "$*" >&2 exit 1 } usage() { cat <<EOF Usage: bash $SCRIPT_NAME What it does: 1. Installs proot-distro in Termux if needed. 2. Installs Debian userspace if needed. 3. Installs nodejs + npm inside Debian. 4. Installs ${CLAUDE_PACKAGE_NAME} inside Debian. 5. Replaces Termux's claude launcher with a wrapper that forwards into Debian. Environment overrides: CLAUDE_CODE_DISTRO proot distro alias, default: ${DISTRO_NAME} CLAUDE_CODE_VERSION npm package version/tag, default: ${CLAUDE_PACKAGE_VERSION} Notes: - Official Claude Code npm binaries do not support Termux's android-arm64 host. - This script uses Debian in proot as the supported Linux runtime. EOF } command_exists() { command -v "$1" >/dev/null 2>&1 } require_termux() { [ -d "$PREFIX_DIR" ] || die "This script must run in Termux." command_exists pkg || die "pkg not found. This script must run in Termux." } ensure_termux_package() { local package_name="$1" if dpkg -s "$package_name" >/dev/null 2>&1; then success "Termux package already installed: $package_name" return 0 fi info "Installing Termux package: $package_name" pkg install -y "$package_name" success "Installed Termux package: $package_name" } ensure_distro() { if [ -d "$PROOT_ROOT_DIR/$DISTRO_NAME" ]; then success "proot distro already installed: $DISTRO_NAME" return 0 fi info "Installing proot distro: $DISTRO_NAME" proot-distro install "$DISTRO_NAME" success "Installed proot distro: $DISTRO_NAME" } run_in_distro() { local command_text="$1" proot-distro login "$DISTRO_NAME" -- bash -lc "$command_text" } ensure_distro_packages() { info "Updating apt metadata inside $DISTRO_NAME" run_in_distro "env DEBIAN_FRONTEND=noninteractive apt-get update" info "Installing nodejs and npm inside $DISTRO_NAME" run_in_distro "env DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs npm" success "nodejs and npm are ready inside $DISTRO_NAME" } install_claude_in_distro() { local package_spec="$CLAUDE_PACKAGE_NAME" if [ "$CLAUDE_PACKAGE_VERSION" != "latest" ]; then package_spec="${CLAUDE_PACKAGE_NAME}@${CLAUDE_PACKAGE_VERSION}" fi info "Installing ${package_spec} inside $DISTRO_NAME" run_in_distro "npm install -g ${package_spec@Q}" success "Claude Code is installed inside $DISTRO_NAME" } backup_existing_launcher() { local backup_path mkdir -p "$BACKUP_DIR" if [ ! -e "$HOST_CLAUDE_PATH" ]; then return 0 fi if grep -Fq "$WRAPPER_MARKER" "$HOST_CLAUDE_PATH" 2>/dev/null; then success "Managed Termux launcher already present" return 0 fi backup_path="$BACKUP_DIR/claude.host-backup.$(date +%Y%m%d_%H%M%S)" cp "$HOST_CLAUDE_PATH" "$backup_path" success "Backed up existing launcher to $backup_path" } install_host_wrapper() { local tmp_wrapper tmp_wrapper="$(mktemp "${TMPDIR:-/tmp}/claude-wrapper.XXXXXX")" cat >"$tmp_wrapper" <<EOF #!/data/data/com.termux/files/usr/bin/sh $WRAPPER_MARKER work_dir=\$PWD if [ ! -d "\$work_dir" ]; then work_dir=/root fi exec proot-distro login --shared-tmp --work-dir "\$work_dir" $DISTRO_NAME -- /usr/local/bin/claude "\$@" EOF chmod 755 "$tmp_wrapper" cp "$tmp_wrapper" "$HOST_CLAUDE_PATH" chmod 755 "$HOST_CLAUDE_PATH" rm -f "$tmp_wrapper" success "Installed Termux launcher: $HOST_CLAUDE_PATH" } verify_install() { info "Verifying Claude inside $DISTRO_NAME" run_in_distro "claude --version" info "Verifying Termux launcher" "$HOST_CLAUDE_PATH" --version success "Claude Code setup completed" } main() { if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage exit 0 fi require_termux ensure_termux_package "proot-distro" ensure_distro ensure_distro_packages install_claude_in_distro backup_existing_launcher install_host_wrapper verify_install cat <<EOF Run Claude Code with: claude Current configuration: distro: $DISTRO_NAME host launcher: $HOST_CLAUDE_PATH EOF } main "$@" 非proot方案参考 GitHub - AidanPark/openclaw-android: Run OpenClaw on Android with a single command — no proot, no Linux · GitHub 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-17 23:42:47+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 几个月前在linuxdo开源了 拼豆AI应用,得到不少支持,现在有空就大升级,让佬友更加愉快的拼豆拼起来! 【开源】佬友玩拼豆吗,AI拼豆那种,我搞出来给佬友愉快的拼起来哈 开发调优 项目灵感 我基于开源项目: GitHub - Zippland/perler-beads: 拼豆底稿生成器 (Perler Beads Generator) , 我加上AI优化了项目,AI辅助优化图片功能,写了一个专门生成拼豆图纸的网站。 经过大量测试,我觉得已经可以达到 一键生成拼豆图纸了! 展示案例 核心就是: ai制作图纸 ,关键就是颜色尽可能少,颗粒尽可能少,各种各样图纸风格都兼容,同时表… 开源地址: 拼豆web程序: github.com GitHub - liangdabiao/perler-beads-ai: 因为市面上的拼豆软件差强人意 ,所以我基于开源项目:Zippland/perler-beads ,... 因为市面上的拼豆软件差强人意 ,所以我基于开源项目:Zippland/perler-beads , 我加上AI优化了项目,AI辅助优化图片功能,写了一个专门生成拼豆图纸的网站。 经过大量测试,我觉得已经可以达到 一键生成拼豆图纸了! 拼豆小程序: github.com GitHub - liangdabiao/perlerBeadsApplet: 一款基于 Taro + Vue3... 一款基于 Taro + Vue3 开发的拼豆像素画创作小程序,支持像素画编辑、作品管理、图片导入,图纸导出等功能。 项目是基于和二开 开源程序: github.com/noir017/perlerBeadsApplet 一键部署到 Cloudflare Pages 本项目采用 Next.js 静态导出 + Cloudflare Pages Function 架构,所有重计算(图像像素化、颜色映射)都在浏览器端完成,服务端仅有一个轻量 API(AI优化),部署简单、免费额度完全够用。这次方案是 全免费,服务器免费,ai api免费,域名免费,0费用搭建拼豆应用,多好: cloudflare命令一键部署命令参考: npm run pages:dev npm run build npm run pages:deploy 小程序: 一款基于 Taro + Vue3 开发的拼豆像素画创作小程序,支持像素画编辑、作品管理、图片导入,图纸导出等功能。 项目是基于和二开 开源程序: GitHub - noir017/perlerBeadsApplet: 拼豆像素画编辑器小程序 · GitHub ,增加很多功能和修改,适合本系统的小程序。 展示效果: 我已经实际部署在cloudflare了,佬也可以试试: https://pindou.348349.xyz/ 感谢佬的支持,开源不容易: github.com GitHub - liangdabiao/perler-beads-ai: 因为市面上的拼豆软件差强人意 ,所以我基于开源项目:Zippland/perler-beads ,... 因为市面上的拼豆软件差强人意 ,所以我基于开源项目:Zippland/perler-beads , 我加上AI优化了项目,AI辅助优化图片功能,写了一个专门生成拼豆图纸的网站。 经过大量测试,我觉得已经可以达到 一键生成拼豆图纸了! 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-17 21:35:29+08:00 · tech

开发调优 > 开发调优, Lv1 背景 小白是前一个月刚入站的小萌新,刚毕业快满一年,从事的工作方向也是机器人控制这一块,在某些时候也需要用到AI coding辅助我进行开发思路,去年最开始尝试的是trae,那时候的trae反馈一般,后来基本上还是古法开发,一边问AI,利用AI提供的思路结合自己的经验去进行开发 随着后面的Cursor等软件的盛行,基本上用的是Cursor这个软件,但是这个软件的Pro+花费还是有点太贵了,有些肉疼,不是因为这个套餐,是因为这个cursor给的额度属实是有点低,配合这个IDE,用着属实不习惯。 接着就是claude盛行,再到后面的codex等等,后来发现更适合我的还是像vscode和cli这种形式, 目前尝试的方案 之前尝试用了别人的中转站,但是结合在L站看佬们发的一些经验贴,发现之前的某鱼的中转站实在拉跨,模型估计也是套壳 后面考虑直冲claude的账号,用了一个月,plus,观感确实不孬,使用体感也还行,后面还用了codex,性价比也不错 求教,想咨询各位佬目前针对coding以及hermes Agent这种的API所选择的方案是什么 目前尝试的方案 今天尝试了两位佬分享的注册机使用以及古法手搓GPT账号的教程,估计是因为自己IP不稳定的原因,古法注册GPT的后面还是弹出手机号的验证,试了很多次无望,结合自己的一些困惑,因此有了这篇求教贴 之前也尝试使用了GLM以及minimax的套餐,用minmax的套餐来进行openclaw等智能体的API,但是实际上质量确实堪忧,回答质量这一块,GLM的套餐已经是抢不到的状态了 之前打算用佬们的公益站来着,比如冰佬等等,但也不好意思白嫖,所以也没用哈哈哈 疑问点 求教点 佬们目前选择的方案是什么,针对AI coding这一块自己搭建还是选择了什么方案,选择的方案有什么需要注意的地方捏 像Hermes Agent,Astrbot等框架,佬们的评价是什么,是否有必要搭建一个属于自己的智能体助手,与此对应的API key如何拥有性价比的方案去选择搭建呢 萌新第一次发帖,发帖之前已经严肃阅读社区准则,请佬们多多指教 12 个帖子 - 7 位参与者 阅读完整话题

linux.do · 2026-04-17 14:05:47+08:00 · tech

一、业务场景概述 本次方案围绕 集团型多子系统统一登录 场景展开。企业内部存在多个独立业务系统,包括商城( mall.xxx.com )、运营后台( admin.xxx.com )、数据平台( data.xxx.com )、供应商系统( supplier.xxx.com ),各系统均独立部署、独立域名,天然存在跨域问题;同时每个系统使用独立的 Redis 实例,存储相互隔离、无法共享,构成跨 Redis 集群 / 实例的技术难点。在此基础上,业务要求实现 一处登录、全系统免登,一处退出、全系统失效 的统一身份认证能力,是典型融合 SSO 单点登录、跨域访问、跨 Redis 存储的综合技术场景。 二、整体核心思路 针对跨域、跨 Redis、统一登录三大核心诉求,整体设计思路可概括为: 统一认证中心 + Token 中心化存储 + 跨域安全传递 + 各业务系统远程校验 Token 。通过剥离各系统的登录逻辑,集中建设统一认证服务,解决身份一致性问题;通过中心化存储解决跨 Redis 无法共享会话的问题;通过标准化 Token 传递实现跨域互通,最终达成全域单点登录与登出。 三、架构角色定义 SSO 认证中心 作为唯一登录入口与身份权威源,独立部署,负责账号密码校验、Token 生成与销毁、登录状态管理、全局登出控制。 各业务系统 商城、运营后台、数据平台等只负责业务鉴权,不承载登录逻辑,统一跳转至 SSO 完成认证。 公共 Redis 集群 专门用于存储全局 Token 与用户会话信息,作为跨 Redis 场景下的统一会话存储层。 四、详细流程设计 (一)统一登录流程 用户访问任意业务系统,鉴权拦截器检测未登录,自动重定向至 SSO 认证中心,并携带当前系统回调地址。 用户在 SSO 页面完成账号密码校验,认证通过。 SSO 生成全局唯一 Token(支持 UUID 随机串或 JWT 格式)。 将 Token 与对应用户信息、过期时间存入公共 Redis,形成全局会话。 SSO 通过根域名 Cookie、重定向传参或前端跨域通信等方式,将 Token 安全传递至目标业务系统。 业务系统获取 Token 后,通过调用 SSO 校验接口或直接访问公共 Redis 完成合法性验证。 验证通过,业务系统建立本地轻量级会话,用户完成无感登录。 (二)跨域处理方案 根据域名结构可采用两种方式: 若各系统为同一主域名下的子域名,可将 Cookie 的 domain 设置为根域名,实现 Token 跨子域名共享。 若为完全独立根域名,则采用 URL 重定向携带 Token + 后端回调校验的模式,或使用前端 postMessage 实现安全跨域传递。 (三)跨 Redis 问题解决方案 针对各系统独立 Redis、无法共享存储的问题,提供两种成熟方案: 公共 Redis 方案(推荐) 所有系统不再使用自身业务 Redis 存储登录会话; 统一使用 SSO 专用公共 Redis 存储全局 Token 与会话; 各业务系统仅需开通访问权限即可读取校验,彻底解决跨 Redis、跨实例、跨集群问题。 JWT 无状态方案 不依赖任何共享 Redis,SSO 签发自包含 JWT 令牌; 各系统使用公钥本地验签,无需中心化存储; 缺点是主动登出与强制踢线需额外维护黑名单 Redis,适合对共享存储严格受限的场景。 五、主流技术路线对比 路线 1:基于公共 Redis 的 Session 共享模式 核心:SSO 登录后写入公共 Redis,各系统统一读取; 优点:实现简单、支持实时登出、强制下线、会话管理可控; 适用场景:集团内部系统、多子域名、架构可控的企业级项目。 路线 2:基于 JWT 的无状态认证模式 核心:完全脱离共享存储,使用签名令牌完成认证; 优点:极致跨服务、跨 Redis、跨机房,扩展性极强; 缺点:登出逻辑复杂,需配合黑名单机制; 适用场景:微服务体系复杂、无法使用共享 Redis、多云部署场景。 文章至此结束!散会!!! 广大友友有什么更好的技术方案,可以多多分享 2 个帖子 - 2 位参与者 阅读完整话题