存档

作者存档

如何让 WSL 支持多个独立的 Ubuntu 实例

2022年5月11日 没有评论

在 win10/win11 系统中,微软已经支持了 WSL,用户可以先安装 sub system for Linux 组件,然后通过 Store 来下载自己感兴趣的 Linux 镜像来安装享用。

但是,这么做有一个问题就是对于同一个类型,例如 Ubuntu 20.04,就只有一个实例,对于普通用户来说,不能添加多个实例。

那为什么会有多实例的需求?很简单,场景需求不同。例如,有时候想临时折腾下某个功能,然后完事了再还原回去,也就是类似快照的功能。还比如说,针对 .Net 和 Java 设置不同的环境,各自编译各自的,互不影响,系统也简洁,有点docker的味道。

微软的答案就是使用 wsl 命令,可以轻松导出或者导入发行版的副本。

首先,可以使用 wsl –list 命令,获取到当前系统上可用的实例。
wsl –export Ubuntu ubuntu.tar // 导出 Ubuntu 实例,并保持为 ubuntu.tar 文件
wsl –import Ubuntu-java .\Ubuntu-java ubuntu.tar // 导入 ubuntu.tar 文件,生成新的实例,新名称为 Ubuntu-java,新实例的文件夹为当前目录
wsl -d Ubuntu-java //启动新的实例

当然,wsl 还有 WSL 1 和 WSL 2的区别,大家可以根据自己的偏好使用即可。

像作者“衣服自己洗”这么懒的人,怎么可能用命令行呢,不方便不说,参数什么不好记。经过一番搜索,最后锁定了 “WSL Manager”这么一个开源工具,可视化操作,还是比较爽的。

经过试用,发现使用这个工具进行导出导入操作时,时间比使用命令行的方式要长些,都快要放弃的时候,界面显示操作成功。所以大家可以结合起来使用,日常的启动停止等操作就用 GUI工具,偶尔的导出导入操作就用命令行。

有个事情需要提一句,WSL 和虚拟机之类的有冲突导致蓝屏,这个是和 Hyper-V 有关,目前来看只能二选一,无解。

分类: 工具 标签:

.Net 6 使用 Winform API

2022年4月6日 没有评论

最近的项目在计划切换到使用 .net6 来编译,虽然微软官网有提供转换工具,但是作为强迫症人群,还是选择了从0开始创建项目,在创建后,再拷贝相关代码。

很显然的,有一些函数或者命名空间在 .net6里并无法找到对应的,官方也提及,可以先试一试 Microsoft.Windows.Compatibility 这个 NuGet 包。VS2022 的右键菜单里还提供了一个很实用的功能,就是移除未使用的引用,所以大家可以放心地先引用。

如果你的项目使用了注册表,那么就需要添加 Microsoft.Win32.Registry 这个 NuGet 包。

很可惜,我的代码里使用了 System.Windows.Forms 的API去判断电源是 DC 还是 AC 模式,上述都没有很好地解决问题。

经过一番搜索,发现下面的解决方式,
1、右键卸载项目
2、编辑项目的 csproj 文件,在 PropertyGroup 节点下添加 true和true 这两个配置。
3、设置 .net6.0属性,替换为 .net6.0-windows,如果有其它的编译需求,例如 net461也可以加进去,以英文分号分割。
4、重新加载项目

当然,这么做也意味着编译后的二进制文件并不能在 Linux 平台上运行,仅仅意味着使用 .net6编译而已,不过这个对于衣服自己洗来说已经足够了,本身项目就是跑在 windows 平台上的。

分类: 日常 标签:

Windows 平台编译 Yolo

2022年3月18日 没有评论

在前面的文档中,我提及了在Firefly里编译后,但是无法成功加载权重文件来预测,只好转到 windows 平台上琢磨其使用,因为我有个机器是使用了英伟达的 2080Ti 的显卡,内心还是想验证看看速度到底有多快。

按照网上的说法,从这里把源码下载回来,然后配置 OpenCV和CUDNN。说到这个CUDNN的配置,是个麻烦事,好在以前已经安装了,这次没有做任何变动就可以了。

对于如何配置 OpenCV,可以参考我的另外一个帖子。

然后就可以正常地编译 x86和x64位的了,编译后就可以按照说明,去做预测了。确实速度非常的快,如我前文所述,毫秒级的,还是有钱好的,显卡牛批,节省时间。

在 Github 原文里,还提及了使用另外一种编译方式,就是微软推出的一种新的工具:vcpkg。

这个工具好在哪里呢,它会自动查找依赖项,并且下载了放到项目的目录里,以解决各种缺少配置的问题,看起来下载回来的那些包有点像绿色版的。下载好后,按照说明,运行命令,就可以开始编译了。

在我的2台电脑上都可以正确地编译,然后验证了下,使用和不使用GPU所消耗的时间差异很大。毫秒级的识别和十几秒的识别。

不过再重新编译就失败了,可能是我修改了什么东西出错。先不管了,不管如何,我现在有了可以编译成功的二进制的 dll 了,后面就可以共享给 C++ 和 C# 调用了。我看了下,python 调用还是怪麻烦的,就不考虑了。

在最后,给出一些当初参考的文档:

这里这里,还有这里这里

分类: AI, 日常 标签:

Firefly

2022年3月1日 没有评论

在衣服自己洗前面的文章中的,大家都有看到提及FireFly这个东西,它到底是什么呢?

其实在更久远一点,衣服自己洗用的是香蕉派,其实包括树莓派,它们都是一类性质的东西,低功耗单板电脑。

让我从官司上复制几张图片,让大家看看。

这么多年来,一直稳定地运行着,比香蕉派什么的稳定多了。

分类: 一句话, 日常 标签:

python 保存项目用到的包名生成requirements.txt

2022年2月26日 没有评论

安装:pip install pipreqs

在项目根目录下,打开控制台,输入:

pipreqs ./ –encoding=utf8

加–encoding=utf8为了避免编码错误

分类: Python, 一句话, 日常 标签:

InfluxDB 无法加载配置文件

2022年2月26日 没有评论

这几天在接触 InfluxDB 这个时序数据库,从官网上下载了windows 版本的程序,里面有个 influxdb.conf 文件,如里面的注释所述,可以修改其数据库的保存位置,但是经过修改后发现怎么都无法生效。网上都是通篇一律的复制粘贴。

后来经过反复的摸索,得出正确的步骤:
1、对于 windows 平台,配置文件里的路径必须使用双斜杠 \,看起来 influxd.exe 在解析的时候会有转义方面的影响,有点奇怪。
2、需要使用参数启动, influxd.exe -config influxdb.conf。结合网上的说法,最好是使用一个批处理文件,这样可以同时设置 set HOME=c:\influxdb,貌似有人遇到过程序在运行期间找不到环境变量的问题。

如果有同学经过上面的步骤还是有问题的话,就可能是权限的问题了。我开始自己创建的 data/meta/wal 文件夹,发现没有效果后,就干脆先用默认的配置启动,然后复制程序自动创建的文件夹。经过对比,发现文件夹的权限不完全一样。因为这个拷贝的事情先发生了,也懒得去确认这个这个是不是关键因素了。

分类: 一句话 标签: ,

安装 .Net 6

2022年2月7日 没有评论

在以前 .net core 出来的时候,我没有上车,现在MS又释放了新的 .Net 6,是时候看看具体怎么玩的了。

以前在香蕉派上都是通过 mono-complete 来安装完整的 mono 运行时的,现在就给卸载了。

首先可以通过访问 https://dotnet.microsoft.com/en-us/download/dotnet 来查看最新的版本,以及下载地址。好在MS官网提供了 arm32 的版本。

下载完成后,运行下面的命令:

创建目标文件夹

sudo mkdir /usr/local/dotnet

解压缩文件

sudo tar zxf dotnet-sdk-6.0.101-linux-arm.tar.gz -C /usr/local/dotnet

创建软链接

sudo ln -s /usr/local/dotnet/dotnet /usr/bin/dotnet

增加环境变量

sudo nano /etc/profile

export DOTNET_ROOT=/usr/local/dotnet
export PATH=$PATH:/usr/local/dotnet

验证结果

dotnet --info

是不是很简单,像 golang 的安装方式一样。

分类: 日常 标签: ,

Git commit 的提交约定

2022年1月9日 没有评论

想要使用 bamboo 自动生成 changelog 文件,检索了下发现已经有现成的方式,即大家约定 git commit message 的格式。

<type>(<scope>): <subject>// 空一行<body>// 空一行<footer>

其中,Header 是必需的,body 和 footer 可以省略。任何一个部分建议长度不要太长避免自动换行。

Header 是必需的,只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)
(1)type
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动

如果type为 feat 和 fix,则该 commit 将肯定出现在 Change log 之中。其它类型(docs、chore、style、refactor、test)可以不用放。

(2)scope
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

(3)subject
subject是 commit 目的的简短描述,不超过50个字符。以动词开头,使用第一人称现在时,比如change,而不是changed或changes;第一个字母小写;结尾不加句号(.)

Body 部分是对本次 commit 的详细描述,可以分成多行。
Footer 部分只用于两种情况。一:不兼容变动,如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。二:关闭 Issue,如果当前 commit 针对某个issue,那么可以在 Footer 部分标记关闭这个 issue 。

来源

分类: 日常 标签:

git 仓库强制切换更新

2021年12月24日 没有评论

在本地添加了各种测试代码,或者解决冲突失败的情况下,想要完全放弃本地的任何改动(包括已经提交但未推送的变动),直接从远端获取最新的代码记录,可以采用下面的命令。

简单、暴力、好用。

git fetch –all
git reset –hard origin/master
git pull

分类: 一句话, 日常 标签:

pm2

2021年11月24日 没有评论

最近无意间发现了 PM2 这个工具,它是 node的进程管理工具,可以用来简化node应用的相关任务,例如自动重启、负载均衡等,而且使用也比较简单。

在安装了 nodejs后,只需要 npm install -g pm2 来全局安装PM2即可。

常见命令:
pm2 start PATH
pm2 status
pm2 stop APP_ID

在启动的时候,有一个 -i 参数需要提下,该参数表明启动的实例,可用于负载均衡。如果是传递 0 或者 max,则表示根据机器当前CPU核数来确定实例数目。

分类: 一句话, 日常 标签: