博客 (208)

在 Windows 11 电脑为例,通过无线网络连接 Wifi 网络,该网络是由多台路由器通过 AP 的方式连接,查看电脑连接的是哪台路由器,首先打开设置 - 网络和 Internet

image.png

点击属性,可以看到当前连接的网络频带和网络通道

image.png

图中可见,当前使用 149 信道连接网络。

打开 Vistumbler,点击 Scan APs,可以看到附近所有的 Wifi 信号

image.png

图中红框标出的是使用了相同 SSD 和密码的 AP 路由器,其中,我的电脑连接的是 149 信道对应的路由器,根据 MAC 地址、生产厂商等信息就可以判断是哪一台路由器了。

xoyozo 3 年前
4,853

官方并没有“蓝牙钥匙”一说,平时讨论的蔚来蓝牙钥匙一般指:

1、智能钥匙(即物理钥匙)

2、蔚来 App 中的“蓝牙解锁启动”功能

本文指后者。


如果未开启“蓝牙解锁启动”,那么在 App 中解锁车门时,必须勾选“同时启动车辆”,否则是无法挂档的。

开启后,手机在车内即可将车开走。

所以在开启的情况下使用 App 解锁时,勾与不勾“同时启动车辆”效果是一样的。


ET7 开启蓝牙解锁启动后,手机靠近车辆会自动解锁(门把手需要按一下才能展开),EC6 必须打开 App 解锁车门。

那是不是说,如果手机丢了,ET7 也丢了?


微信图片_20220612101953.jpg微信图片_20220612101958.jpg


App 5.3.6 | Aspen 3.1.2 | 2022年5月

xoyozo 3 年前
5,895

HTML:

<script id="tb_content" type="text/plain">{{content}}</script>

JS:

var app = new Vue({
    el: "#app",
    data: {
        content: 'abc',
        ue: {},
    }, mounted: function () {
        this.ue = UE.getEditor('tb_content');
    }, methods: {
        fn_save: function () {
            console.log(this.ue.getContent())
        }
    }
});


xoyozo 3 年前
1,478

您需要将 IWebHostEnvironment 注入到类中才能访问属性值 ApplicationBasePath:阅读有关依赖关系注入的信息。成功注入依赖项后,wwwroot 路径应该可供您使用。例如:

private readonly IWebHostEnvironment _appEnvironment;

public ProductsController(IWebHostEnvironment appEnvironment)
{
   _appEnvironment = appEnvironment;
}

用法:

 [HttpGet]
 public IEnumerable<string> Get()
 {
    FolderScanner scanner = new FolderScanner(_appEnvironment.WebRootPath);
    return scanner.scan();
 }

编辑:在 ASP.NET 的更高版本中,IHostingEnvironment 已被替换为 IWebHostEnvironment

O
转自 Oluwafemi 3 年前
3,477

自 2023 年 4 月起,Windows 11 已经重新支持显示“秒”,无需第三方工具来实现,点击查看详情

ElevenClock 下载地址:GitHub,开源软件放心使用

效果:

image.png

* 该软件不会影响右下角的显示桌面和系统通知功能。


v3.3 设置方法:


√ 在主屏幕上时钟区显示本程序的时钟样式

    ElevenClock 不直接修改任务栏上的时钟区域,而是将时钟覆盖在系统时钟区域的上方。

√ 不要在辅助监视器上显示时钟

    此项按实际需求勾选

√ 时间与日期设置 - Set a custom date and time format (for advanced users only)

    填写以下内容并 Apply

    %H:%M:%S

    %Y/%#m/%#d %a

    如果不想显示星期,把 %a 去掉即可。

√ 使用自定义字体大小

    因分辨率缩放设置不同可能导致显示的字体大小与系统时钟不同,会导致覆盖面过大或过小,从而使系统托盘中的其它图标显示不完整。所以应选择一个与系统时间差不多的字体大小。当显示“周序号”时 ElevenClock 时钟区域可能会远宽于系统时钟区域,可以设置系统时钟显示“星期”(方法见文末)。


v3.2 设置方法:

√ 在主屏幕上时钟区显示本程序的时钟样式

    ElevenClock 不直接修改任务栏上的时钟区域,而是将时钟覆盖在系统时钟区域的上方。

√ 不要在辅助监视器上显示时钟

    此项按实际需求勾选

√ 显示秒数

    这是我们的最终目的。

√ 使用自定义字体大小

    因分辨率缩放设置不同可能导致显示的字体大小与系统时钟不同,会导致覆盖面过大或过小,从而使系统托盘中的其它图标显示不完整。所以应选择一个与系统时间差不多的字体大小。当显示“周序号”时 ElevenClock 时钟区域可能会远宽于系统时钟区域,可以设置系统时钟显示“星期”(方法见文末)。


如何显示系统时间“星期”:

打开“更改日期和时间”,在“日期”选项卡的“短日期”中添加“ddd”。

image.png

xoyozo 3 年前
5,419
  1. 项目 - 属性 - 生成 - 输出 - 文档文件,勾选“生成包含 API 文档的文件。”,“XML 文档文件路径”可留空。

    image.png

  2. 在配置方法 AddSwaggerGen 中添加以下两行

    var xmlFilename = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));

参:Swashbuckle 和 ASP.NET Core 入门 | Microsoft Docs

xoyozo 3 年前
2,577

Regex.Escape(String) 方法:

通过替换为转义码来转义最小的字符集(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。 这将指示正则表达式引擎按原义解释这些字符而不是解释为元字符。

示例:

string str = @"123\c\d\e";
string r1 = @"\d";
string r2 = Regex.Escape(r1);

return Json(new
{
    m1 = Regex.Matches(str, r1).Select(c => c.Value),
    m2 = Regex.Matches(str, r2).Select(c => c.Value)
});

结果:

{
    "m1":[
        "1",
        "2",
        "3"
    ],
    "m2":[
        "\\d"
    ]
}

一般地,我们使用通配符 a*c 在字符串 abcd 中查找:

string s = @"abcd";
string w = @"a*c";
string r = Regex.Escape(w).Replace(@"\*", @".*?").Replace(@"\?", @".?");
return Content(Regex.Match(s, r).Value);

结果:

abc

同理,使用通配符 \d*\f 在字符串 \a\b\c\d\e\f 中查找:

string s = @"\a\b\c\d\e\f";
string w = @"\d*\f";
string r = Regex.Escape(w).Replace(@"\*", @".*?").Replace(@"\?", @".?");
return Content(Regex.Match(s, r).Value);

结果:

\d\e\f


xoyozo 3 年前
1,978

测试在长度为 403 的字符串中查找,特意匹配最后几个字符:

string a = "";
for (int i = 0; i < 100; i++) { a += "aBcD"; }
a += "xYz";
string b = "xyz"; // 特意匹配最后几个字符

Stopwatch sw1 = Stopwatch.StartNew();
bool? r1 = null; 
for (int i = 0; i < 10000; i++) { r1 = a.IndexOf(b) >= 0; }
sw1.Stop();

Stopwatch sw2 = Stopwatch.StartNew();
bool? r2 = null; 
for (int i = 0; i < 10000; i++) { r2 = a.Contains(b); }
sw2.Stop();

Stopwatch sw3 = Stopwatch.StartNew();
bool? r3 = null; 
for (int i = 0; i < 10000; i++) { r3 = a.ToUpper().Contains(b.ToUpper()); }
sw3.Stop();

Stopwatch sw4 = Stopwatch.StartNew();
bool? r4 = null; 
for (int i = 0; i < 10000; i++) { r4 = a.ToLower().Contains(b.ToLower()); }
sw4.Stop();

Stopwatch sw5 = Stopwatch.StartNew();
bool? r5 = null; 
for (int i = 0; i < 10000; i++) { r5 = a.Contains(b, StringComparison.OrdinalIgnoreCase); }
sw5.Stop();

Stopwatch sw6 = Stopwatch.StartNew();
bool? r6 = null; 
for (int i = 0; i < 10000; i++) { r6 = a.Contains(b, StringComparison.CurrentCultureIgnoreCase); }
sw6.Stop();

Stopwatch sw7 = Stopwatch.StartNew();
bool? r7 = null; 
for (int i = 0; i < 10000; i++) { r7 = Regex.IsMatch(a, b); }
sw7.Stop();

Stopwatch sw8 = Stopwatch.StartNew();
bool? r8 = null; 
for (int i = 0; i < 10000; i++) { r8 = Regex.IsMatch(a, b, RegexOptions.IgnoreCase); }
sw8.Stop();

return Json(new
{
    IndexOf_________________ = sw1.Elapsed + " " + r1,
    Contains________________ = sw2.Elapsed + " " + r2,
    ToUpper_________________ = sw3.Elapsed + " " + r3,
    ToLower_________________ = sw4.Elapsed + " " + r4,
    OrdinalIgnoreCase_______ = sw5.Elapsed + " " + r5,
    CurrentCultureIgnoreCase = sw6.Elapsed + " " + r6,
    IsMatch_________________ = sw7.Elapsed + " " + r7,
    IsMatchIgnoreCase_______ = sw8.Elapsed + " " + r8,
});

结果参考:

{
"indexOf_________________": "00:00:00.1455812 False",
"contains________________": "00:00:00.0003791 False",
"toUpper_________________": "00:00:00.0038182 True",
"toLower_________________": "00:00:00.0026113 True",
"ordinalIgnoreCase_______": "00:00:00.0096550 True",
"currentCultureIgnoreCase": "00:00:00.1596517 True",
"isMatch_________________": "00:00:00.0053627 False",
"isMatchIgnoreCase_______": "00:00:00.0084132 True"
}


xoyozo 3 年前
1,604

前提:

  • 监控摄像头有推流功能

  • 抖音有直播权限(粉丝数超过 1000)

  • 一个已备案的域名


流媒体服务器抖音直播流程.png

名词解释:

推流地址:由阿里云生成的接收摄像头视频流推送的地址。

播流地址:由阿里云生成可用于终端播放的视频流地址。


各环节功能解释:

摄像头:负责采集视频信息,并推送到阿里云。

阿里云视频直播服务:接收视频推流并分发到用户端(收费)。

OBS 软件:负责将视频流转化为可供直播伴侣调用的视频源。

直播伴侣:将视频源分发到短视频终端用户。


第一步:配置阿里云视频直播服务

1.1 在阿里云控制台中开通视频直播,在域名管理中添加域名。

image.png

这里需要添加两个域名,一个是推流域名,一个是播流域名。顾名思义,“推流”指从摄像头将流推送到阿里云,“播流”是用户播放视频流。

以添加域名推流域名“rtmp.xoyozo.net”和播流域名“live.xoyozo.net”为例:

image.png

然后按列表中的 CNAME 地址对域名作解析即可。

解析生效后,点击任意一个域名进行配置,将推流域名和播流域名相互绑定。成功后,可以在推流域名中的播流信息中看到播流域名,在播流域名的推流信息中也能看到推流域名。

1.2 生成推流地址/播流地址

在工具箱中点击地址生成器。

image.png

选择推流域名和播流域名,AppName 和 StreamName 任意填写,生成成功后获取以下地址:

image.png

注:鉴权串是按照鉴权规则生成的串,默认有效期 30 分钟,超出时间即中断推流。可以在域名管理中修改该值,或直接关闭 URL 鉴权。


第二步:在摄像机控制面板中配置推流域名

该步骤因摄像机的品牌和型号不同而有所差异。本文以 IP CAMERA 为例。

首先使用 IP 搜索工具在局域网上搜索摄像机,找到摄像机的 IP 地址。

image.png

在浏览器上打开,输入用户名和密码进入管理面板。

image.png

在“参数设置”-“网络设置”- RTMP Publish 中,将推流地址填入到“预定网址”中,点击“应用”。

image.png

刷新后查看“直播状态”和“直播网址”是否已生效。

若配置成功,可将播流地址在视频播放器中打开观看,或直接在 iPhone 或安卓手机中打开播流地址。


第三步:使用 OBS Studio 将直播流信号转换为虚拟摄像头信号

因抖音直播伴侣无法使用播流地址作为视频源进行直播输出,故使用 OBS 将播流信号转化为虚拟的本机摄像头信号源供直播伴侣调用。

下载安装 OBS Studio,添加一个“场景”:

image.png

然后添加一个“媒体源”:

image.png

去掉“本地文件”前面的勾,将播流地址填到“输入”框中:

image.png

确定后即可预览到直播内容:

image.png

拖动视频区域可调整输出范围。

点击“启动虚拟摄像机”。

提示:OBS 创建的虚拟摄像机默认会从物理麦克风和桌面系统音频拾音,请按需在“混音器”中配置。


第四步:OBS 使用 VLC 视频源(此步可略过)

若 OBS 直接添加媒体源不稳定,可以使用 VLC 视频源。

下载安装 VLC 播放器

在 OBS Studio 中添加来源,选择“VLC 视频源”:

image.png

点击“播放列表”右侧的“+”,选择“添加路径 /URL”:

image.png

填写播流地址并确定。


第五步:配置抖音直播伴侣使用 OBS 的虚拟摄像机信号源

下载安装抖音直播伴侣,在任意场景中添加素材,选择“摄像头”:

image.png

摄像头选择“OBS Virtual Camera”:

image.png

点击“开始直播”:

image.png


下一步:如何配置视频号/微博直播的推流直播监控摄像头画面

xoyozo 3 年前
7,491

打开文件 Startup.cs,找到:

app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TodoApi v1"));

将这两行移出 if 外。

xoyozo 3 年前
3,785