Normal view

There are new articles available, click to refresh the page.
Today — 8 July 2025Main stream

俄国前交长被普京解职当天身亡

8 July 2025 at 17:17
德正
2025-07-08T08:59:18.886Z
斯塔罗沃伊特同普京总统在勘察克里米亚大桥的修建(2016)

(德国之声中文网)周一(7月7日),俄罗斯前交通部长、53岁的斯塔罗沃伊特(Roman Starovoit)于莫斯科近郊被发现在车内身亡,遗体上有枪伤,身旁放着一把枪。就在他被发现死亡几个小时前,克里姆林宫宣布他被俄国总统普京解除部长职务,但未解释原因。

俄国政府已组成调查小组,初步认定斯塔罗沃伊特最有可能的死因是自杀,尚未说明他何时死亡。美联社引述俄媒RTVI报导指,国家杜马防卫委员会主席卡尔塔波洛夫(Andrey Kartapolov)称斯塔罗沃伊特被发现时已死亡“一阵子了”。

斯塔罗沃伊特2024年5月获任命交通部长,此前担任库尔斯克(Kursk)州长将近5年。他上任交长之际,乌克兰无人机频繁袭击俄国,导致俄国各机场大乱,经常暂停与取消航班。

卷入涉及近200亿卢布的贪污案

此外,据路透社引述俄国运输业的消息人士说法,斯塔罗沃伊特是否适任交长一职,过去几个月来备受质疑,因为他卷入一起涉及近200亿卢布的贪污丑闻。

2022年,一笔应该用于强化边境的工程款疑似遭挪用,此事被视为导致俄国边境防线脆弱、未能在2024年8月守住乌军对库尔斯克突袭的原因之一,当时数百俄罗斯士兵被俘,库尔斯克部分地区遭乌克兰占领,让俄国政府蒙羞。

今年4月,斯塔罗沃伊特过去的副手、后来接任库尔斯克州长的斯米尔诺夫(Alexei Smirnov)已因侵占公款被起诉。

俄国最近的贪污腐败调查不只这起案件。 7日,俄军前副总参谋长阿尔斯拉诺夫(Khalil Arslanov)遭判17年徒刑,他跟前俄国防长绍伊古(Sergei Shoigu)关系密切。绍伊古过去的副手伊万诺夫(Timur Ivanov)也因侵占公款、洗钱等罪名,上周遭判刑13年。绍伊古则在这场对军方高层的清洗之中生存下来,现在转任于俄国国安会。

(德新社、路透社)

DW中文有Instagram!欢迎搜寻dw.chinese,看更多深入浅出的图文与影音报道。

© 2025年德国之声版权声明:本文所有内容受到著作权法保护,如无德国之声特别授权,不得擅自使用。任何不当行为都将导致追偿,并受到刑事追究。



主打「氛围感」的小众玩具:沃尔沃 EX30 Cross Country

By: 芥末
8 July 2025 at 17:19


之前有个朋友打算买辆新车,让我推荐推荐。

我问她,你这辆车买来做什么,最看重哪一点?

她说,「日常代步,氛围感」。

懂了,你值得拥有一辆奔驰 C 级。

她承认确实很想要,但是觉得拍蓝牌和保养什么的很麻烦,也担心老小区不好停车什么的。

我说问题都不大,蹭几次就熟练了,其他的麻烦销售帮你搞定得了。不过,确实可以去看看 Mini 和 Smart,氛围感也不错。

但没想到的是,她周末逛了一圈汽车城,回来和我说,「沃尔沃好像有个 EX30,好像还挺好看的诶」。

▲沃尔沃 EX30 标准版

在打开小红书紧急做了一波功课之后,我才回应道「没想到你还挺会选的诶,这车在欧洲卖的很火,不过好像之前说要出一个 Cross Country 的特别版,感觉你会更喜欢那个造型,要不再等等看?」

虽然 EX30 在国内市场没什么声量,但是在欧洲市场卖的很好,有一段时间甚至代替了 XC40 成为了 XC60 之后最受欢迎的沃尔沃车型。

EX30 这辆车,最大的特点就是好看,精致耐看的外观和简约又不失质感的内饰让编辑部的同事一度把它称为「去年北京车展最好看的车」。

这次即将发布的 Cross Country 版本,则在 EX30 原有的基础上带来了更多实用性和氛围感。

新车在外观上基本延续了沃尔沃 EX30 的外观设计,前脸依旧是雷神之锤大灯和封闭式格栅的设计,但是颜色调整为了深灰色,表面也增加了类似木纹的线条。侧面的轮眉则换装了黑色的防蹭轮眉以及黑色轮毂和全地形轮胎,尾部也与前脸一样把中部区域改成深灰色饰板。

新的 EX30 Cross Country 对车辆的悬架进行了调整,整车高度增加了 18mm,离地间隙为 190mm,宽度增加了 12mm,整体尺寸为 4233 / 1850 / 1573mm,轴距 2650mm。

车顶处新增的行李架毫无疑问是新车的视觉核心,可以在上面安置帐篷、自行车、皮划艇之类的户外用品,此外新车还可以装备官方车顶帐篷、官方小煮锅、官方单车架等拓展件。

新版本的内饰倒是没什么变化,还是采用了 12.3 英寸的竖置中控屏以及平直台面和冷淡风座椅的设计,并且和 EX30 一样移除了副仪表台,带来了一个低矮的、配有隔板的下沉空间。

动力方面,新版本车型仅保留了最大功率分别为 115kW 和 200kW 的前后双电机四驱版本,最大扭矩 543Nm,百公里加速 3.7 秒,搭配 64kWh 的三元锂电池组,WLTC 续航里程为 530km。

只是在国内,紧凑级豪华车本身的市场分量就不大,头部品牌如 Smart 精灵 #3 从年初到现在也不过卖了 1094 辆,沃尔沃这样的二线豪华就更难有什么机会了。

▲Smart 精灵 #3

但总有像我朋友这样家庭条件不错,更看重外观内饰,对价格也不敏感的人会对它感兴趣,市场上能多点小众车,也不错。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 | 原文链接 · 查看评论 · 新浪微博


[北京、30K+] 热门 Starup 外企、AI 浏览器公司招浏览器开发工程师

8 July 2025 at 14:40
aa2360399kk: 公司简介
我们是一家总部在新加坡的外企,我们正在开发一款融合 AI 功能的创新浏览器产品,基于 Chromium 内核进行深度定制和二次开发,致力于为用户提供更智能、更便捷的网络浏览体验。

岗位职责
负责基于 Chromium 内核的浏览器核心功能开发和优化
参与 AI 功能模块的架构设计和技术实现
进行 Chromium 源码的定制化修改和功能扩展
优化浏览器性能,提升用户体验
与产品团队协作,快速响应产品需求迭代
参与技术方案设计和代码 review

任职要求
必备技能:

5 年以上前端或客户端开发经验
具备 Chromium/Chrome 浏览器内核开发经验,熟悉其架构和工作原理
精通 C++编程,熟悉多进程/多线程编程
熟悉 Web 标准( HTML5 、CSS3 、JavaScript )和浏览器工作机制
熟悉 CEF ( Chromium Embedded Framework )或类似框架
有跨平台开发经验( Windows/macOS/Linux )

加分项:

有浏览器产品开发经验或参与过开源浏览器项目
了解 WebAssembly 、WebRTC 等前沿 Web 技术
有 Electron 或其他桌面应用开发经验
熟悉网络协议和安全相关知识
有移动端开发经验( Android/iOS )

个人素质:

具备良好的问题分析和解决能力
热爱技术,关注行业发展趋势
具备良好的团队协作和沟通能力
学习能力强,能快速适应新技术

薪酬:30K+ 15 薪;优秀者详谈;
联系方式:wx:MTM4MTEwMTA3MzI= 邮箱: 2384039099@qq.com

请教各位大佬, win10 下映射网络驱动器盘符用完了该怎么办?

8 July 2025 at 14:36
dingli900201:

请教各位大佬,win10 下映射网络驱动器盘符用完了该怎么办?

RT 除了安装的物理硬盘之外,剩下的盘符全部被映射网络驱动器用完了,还想要新增有什么办法么? 不想以文件夹形式存在,因为看不到剩余容量,很不直观。

🧱搬瓦工🧱: LA DC1 三网优化来袭🚀🚀🚀,$36.36/年,限时发售

By: ivmm
8 July 2025 at 14:18
ivmm:

💻 套餐配置:BIGGERBOX-PRO

  • 📍 地域: 洛杉矶 DC1
  • 🚀 配置: 1 核 · AMD EPYC · 1G 内存 · 20G SSD (RAID-10)
  • 📶 流量: 1000GB/月 · 峰值带宽:2.5Gbps
    • IP:IPv4+ IPv6/64 ,终于有 V6 了
  • 🌐 线路: 中国直连优化 · 电信 CN2GIA, 联通 AS9929/CN2, 中国移动 CMIN2
  • 💰 价格: 限时优惠价 $36.36/年
  • 🔗 购买链接: http://mypath.my.id/ladc1
  • 🎟 优惠码: BWHCGLUKKB

🎟立即购买

🛡️ 可靠保障

  • 30 天无条件退款
  • 国内优化保障,低延迟直连体验

还可加$9.32 升级至NODESEEK-MEGABOX-PRO

🎟立即购买

从 iPhone 换到三星 S25U,目前使用 3 天,太舒服了

By: yuhanz
8 July 2025 at 14:09
yuhanz:

从 iPhone 13PM 换到 Samsung S25 Ultra ,总共花费约 ¥ 5800 (含 2 年 Care+)

  • 中移动现有客户购机价 $8298 ,加两年 Samsung Care+ $998 ,一共 $9296
  • iPhone13 PM 给爱回收,回收价格 ¥ 2700 (只能说 Apple 真保值..)

iPhone 13PM 流畅度依然很高,但对我来说痛点主要有:

  1. 摄像头落伍,尤其长焦,但 iPhone 16 P/PM 也没有实质改进
  2. iOS 对一些小场景下的 LLM 应用不太流畅,比如:App 里的划词/划段落翻译;比如我有一些特定的 Prompts Templates ,需要在 App 中临时填写一些 Slots ,等 LLM 返回,并解析/抽取返回的结果
  3. iPhone 13PM 很重很重.. Specs 240g ,我的实机 251g ,带套 300g
  4. iPhone 13PM 屏幕亮度有点落伍了,在户外阳光下看不清

预期中 Android 的缺点:

  1. iCloud 全家桶没了,但平时反正也买了 Google One ,只是需要搬运一下数据;
  2. 视频拍摄弱,Android 没有通用的 Live Photo ,无法在社交媒体分享 Live Photo ;
  3. 钱包弱,包括不像 Apple Pay 兼容性那么好,不支持交通卡快捷支付,不支持国内交通卡,世界范围的支持也远不如 Apple Pay (比如西瓜卡,这个挺麻烦)
  4. 没有 FaceID 了,它还是比指纹方便一些

收获的 Android / Samsung OneUI 的优点:

  1. 痛点 1/2/4 完美解决,Android 强项,尤其 S25U 配合抗反射膜,户外阳光下跟室内的观感差不多
  2. S25U 重量 220g ,配合 Care+ 可以裸奔,至少没有压手的感觉了
  3. 分屏 + SPen ,在 App 中使用 LLM 非常方便了
  4. One UI + Good Lock 折腾下来,原本不像 iOS 的一些配置可以折腾得跟 iOS 习惯一致(比如 Keyboard 布局),其余不少功能都比 iOS 舒服,比如 充电会提示剩余时间、闹钟、截图、App 分享、文件管理... 都是大家都知道的优点了

预期外的缺点:

  1. 有些 App (比如某银行)布局兼容性不行,这个是之前没想到的,毕竟 OneUI 也不算很小众...
  2. 有些 App 在 Google Play 里没有,比如盒马,不过目前都可以通过微信小程序解决
  3. Garmin Connect 中国区和海外的数据是完全隔离的.. 不过可以手动搬运数据

总结:

  • 还是一次很开心的换机,估计能用两三年了

模型在测试集上的准确率卡在 95%上不去,能想的办法都试过了就是不行,都 3 天了,求各位大佬帮我看下有没有优化的方案!跪谢!

By: moxiaowei
8 July 2025 at 14:00
moxiaowei:

使用 SVHN 的数据集进行模型的训练,但是整个模型在训练集上的准确率是一直在上升的,但是到了测试集上就一直卡在 95%,都 3 天了,求各位大佬帮我看下有没有优化的方案!跪谢!

import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributed.checkpoint import load_state_dict
from torch.hub import load_state_dict_from_url
from torch.nn.modules.loss import _Loss
from torch.optim import Optimizer
from torch.utils.data import Dataset, random_split, DataLoader
import torchvision
from torchvision.transforms import transforms
import torchvision.models as m
import matplotlib.pyplot as plt
import random
import gc  # 用于垃圾回收
from torchinfo import summary
import numpy as np
import random

import gc

# 设置随机数种子
SEED = 420
random.seed(SEED)
np.random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

# 设置使用 gpu 还是 cpu 进行训练
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定义训练的论述
epochs = 100
lr = 0.0001

# 定义数据集需要的参数
batchSize = 64

# 加载训练集需要的数据转换器
trainT = transforms.Compose([
    transforms.RandomCrop(28),
    transforms.RandomRotation(degrees=[-15, 15]),
    transforms.ToTensor(),
    transforms.Normalize(mean = [0.4377, 0.4438, 0.4728], std = [0.1980, 0.2010, 0.1970])
])

# 加载测试集需要的数据转换器
testT = transforms.Compose([
    transforms.CenterCrop(28),
    transforms.ToTensor(),
    transforms.Normalize(mean = [0.4377, 0.4438, 0.4728], std = [0.1980, 0.2010, 0.1970])
])

# 加载训练集数据
svhn_train = torchvision.datasets.SVHN(root='C:\\FashionMNIST'
                                       , split="train"
                                       , download=True
                                       , transform=trainT
                                       )
# 加载测试集数据
svhn_test = torchvision.datasets.SVHN(root='C:\\FashionMNIST'
                                      , split="test"
                                      , download=True
                                      , transform=testT
                                      )

# 定义神经网络,因为我们的图片的尺寸和样本数量都不是很大,所以选择从 ResNet18 和 Vgg16 中抽取层来构建网络
resnet18_ = m.resnet18()


class MyResNet(nn.Module):  # 这个是基于 ResNet18 构建的网络
    def __init__(self):
        super(MyResNet, self).__init__()
        self.block1 = nn.Sequential(
            nn.Conv2d(3, 64, 3, 1, 1),
            resnet18_.bn1,
            resnet18_.relu
        )

        self.block2 = resnet18_.layer2  # 连权重都会复用过来,在 resnet18_ = m.resnet18() 这儿就已经初始化好了权重数据!
        self.block3 = resnet18_.layer3
        self.block4 = resnet18_.layer4 # 从 Resnet18 中哪 layer 新增到自己的模型中
        self.avgpool = resnet18_.avgpool

        self.fc = nn.Linear(512, 10, True)

    def forward(self, x):
        x = self.block1(x)
        x = self.block2(x)
        x = self.block3(x)
        x = self.block4(x) # 这儿新增一条处理代码
        x = self.avgpool(x)
        x = x.view(-1, 512)
        return self.fc(x)


vgg16_ = m.vgg16()


class MyVgg(nn.Module):  # 这个是基于 Vgg16 构建的网络
    def __init__(self):
        super(MyVgg, self).__init__()

        self.features = nn.Sequential(
            *vgg16_.features[0:9],
            # 使用*是 将 .features[0:9]提取出来的层,全部取出来,一个个放到当前的 Sequential 中,而不是组成一个 Sequential 放到当前的 Sequential 中!
            nn.Conv2d(128, 128, 3, 1, 1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2, padding=0, dilation=1, ceil_mode=False)
        )
        self.avgpool = vgg16_.avgpool

        self.fc = nn.Sequential(
            nn.Linear(6272, 4096, True),
            *vgg16_.classifier[1:6],
            nn.Linear(4096, 10, True)
        )

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = x.view(-1, 6272)
        x = self.fc(x)
        return x


# summary(MyVgg(), input_size=(10, 3, 28, 28)) # 一定要,实例化跑一下,看看有没有问题!


class earlyStopping():

    def __init__(self, patience=5, tol=0.0005):
        # 当连续 patience=5 次,本轮次的迭代的损失与历史最小的损失的差值大于 0.0005 这个阈值,就会停止训练
        self.patience = patience
        self.tol = tol
        self.counter = 0  # 计数器
        self.lowest_loss = None  # 记录历史最小损失
        self.early_stop = False  # 需要返回是否需要提前停止

    def __call__(self, val_loss):  # val_loss 是记录测试集或训练集上一次 epoch 的损失
        if self.lowest_loss is None:
            self.lowest_loss = val_loss
        elif self.lowest_loss - val_loss > self.tol:
            self.lowest_loss = val_loss
            self.counter = 0
        elif self.lowest_loss - val_loss < self.tol:
            self.counter += 1
            print('Notice: Early stopping counter {} of {}'.format(self.counter, self.patience))

        if self.counter >= self.patience:
            print('Notice: Early stopping counter Active')
            self.early_stop = True
        return self.early_stop


# 定义训练函数
def fit(net: nn.Module, lossFunc: _Loss, op: Optimizer, trainData: DataLoader, testData: DataLoader, epochs: int):
    transLost = []  # 用于收集每轮训练和测试的结果,用于后面画图表使用
    trainCorrect = []
    testLost = []
    testCorrect = []
    trainedSampleNum = 0

    # 初始化 earlystopping 类
    early_stopping = earlyStopping(patience=15, tol=0.00000005)
    # 初始化测试集的历史最高准确率
    test_highest_correct = None
    test_lowest_loss = None

    # 获取到整个训练集中的样本数量
    trainTotalNum = trainData.dataset.__len__()
    # 获取到整个测试集中的样本数量
    testTotalNum = testData.dataset.__len__()

    for epoch in range(epochs):
        net.train()
        train_loss = 0
        train_correct = 0
        for batch_index, (data, target) in enumerate(trainData):
            data = data.to(device, non_blocking=True)
            target = target.to(device, non_blocking=True).view(data.shape[0])  # 确保标签是 1 维的结构
            trainRes = net(data)  # 经过学习,这儿每个样本会输出 10 个特征结果对应的数据(如果模型中有 softmax ,就是概率),可以用于后续计算准确率
            loss = lossFunc(trainRes, target)
            op.zero_grad()  # 清空优化器上的梯度
            loss.backward()
            op.step()
            # 开始计算准确数,并累加
            yhat = torch.max(trainRes, 1)[1]  # 从 trainRes 一个矩阵中,取出每个样本的最大值和最大值所在的索引,得到[1,2,1,4]这种类型的结果
            correct_num = torch.sum(
                yhat == target)  # yhat 、target 都是一维张量,使用 == 会挨个对比张量中的元素是否相等,最终得到[False, True, Flase]这样的数据,然后使用 torch.sum 就可以得到一个数字,因为 True 为 1 ,False 为 0 。
            train_correct += correct_num  # 将准备数累加
            # 计算损失,并累加
            train_loss += loss.item()  # 这儿需要得到所有样本的损失的和
            trainedSampleNum += data.shape[0]
            # print("本批次训练损失为:", loss.item() / data.shape[0])
            if (batch_index + 1) % 125 == 0:
                # 现在进行到了哪个 epoch 、总共要训练多少个样本、已经训练了多少个样本、已训练的样本的百分比
                print("Epoch{}:{} / {} = ({:.0f}%)".format(
                    epoch + 1,
                    trainedSampleNum,
                    epochs * len(trainData) * batchSize,
                    100 * trainedSampleNum / (epochs * len(trainData) * batchSize)
                ))

        print("-------------------------------")
        avg_correct = (float(train_correct) / trainTotalNum) * 100
        # print("本轮训练平均准确率:", avg_correct)
        trainCorrect.append(avg_correct)
        avg_loss = (float(train_loss) / trainTotalNum) * 100
        # print("本轮训练平均损失率:", avg_loss)
        transLost.append(avg_loss)

        del data, target, train_loss, train_correct
        gc.collect()
        torch.cuda.empty_cache()

        # 一轮训练结束,就使用测试集进行测试
        net.eval()
        test_loss = 0
        test_correct = 0
        for batch_index, (test_data, test_target) in enumerate(testData):
            with torch.no_grad():
                test_data = test_data.to(device, non_blocking=True)
                test_target = test_target.to(device, non_blocking=True).view(test_data.shape[0])  # 确保标签是 1 维的结构
                testRes = net(test_data)
                loss = lossFunc(testRes, test_target)
                # 计算损失,并累加
                test_loss += loss.item()
                # 计算准备数,并累加
                yhat = torch.max(testRes, 1)[1]  # 从 trainRes 一个矩阵中,取出每个样本的最大值和最大值所在的索引,得到[1,2,1,4]这种类型的结果
                correct_num = torch.sum(
                    yhat == test_target)  # yhat 、target 都是一维张量,使用 == 会挨个对比张量中的元素是否相等,最终得到[False, True, Flase]这样的数据,然后使用 torch.sum 就可以得到一个数字,因为 True 为 1 ,False 为 0 。
                test_correct += correct_num  # 将准备数累加

        avg_test_correct = (float(test_correct) / testTotalNum) * 100
        # print("本轮测试平均准确率:", avg_test_correct)
        testCorrect.append(avg_test_correct)
        avg_test_loss = (float(test_loss) / testTotalNum) * 100
        # print("本轮测试平均损失率:", avg_test_loss)
        testLost.append(avg_test_loss)

        print("本轮训练平均准确率:{}, 本轮训练平均损失率: {}, 本轮测试平均准确率:{}, 本轮测试平均损失率:{}".format(
            avg_correct, avg_loss, avg_test_correct, avg_test_loss))

        del test_data, test_target, test_loss, test_correct
        gc.collect()
        torch.cuda.empty_cache()

        # 如果测试集损失出现新低或者准确率出现新高,就保存在模型的权重,防止中途断电等原因需要从头再来
        if test_highest_correct is None:
            test_highest_correct = avg_test_correct
        if test_highest_correct < avg_test_correct:
            test_highest_correct = avg_test_correct
            torch.save(net.state_dict(), './v6/model-' + str(epoch + 1) + '.pth')
            print("model saved")

        # 最好在测试集上使用提前停止,如果使用训练集无法预测过拟合这种情况
        early_stop = early_stopping(avg_test_loss)  # 这儿使用提前停止!
        if early_stop:
            break
    print("mission completed")
    return transLost, trainCorrect, testLost, testCorrect


model = MyResNet().to(device)
# model.load_state_dict(torch.load("./v4/model-49.pth"))
loss_func = nn.CrossEntropyLoss(reduction='sum')  # 因为我们在训练函数中,在计算损失的时候是计算的每个样本的损失的和,所以这儿需要使用 reduction='sum'
opt = optim.RMSprop(model.parameters(), lr=lr, weight_decay=0.00005, momentum=0.0001)

train_data = DataLoader(svhn_train, batch_size=batchSize, shuffle=True, drop_last=False, pin_memory=True)
test_data = DataLoader(svhn_test, batch_size=batchSize, shuffle=False, drop_last=False, pin_memory=True)

# 开始训练
transLost, trainCorrect, testLost, testCorrect = fit(model, loss_func, opt, train_data, test_data, epochs)

# 训练结果可视化
plt.plot(transLost, label='train loss')
plt.plot(testLost, label='test loss')
plt.plot(trainCorrect, label='train correcct')
plt.plot(testCorrect, label='test correcct')
plt.xlabel('Epoch')
plt.ylabel('CrossEntropy Loss')
plt.title('Training Loss')
plt.legend()
plt.grid(True)
plt.show()

全屋 WIFI 组网,求推荐软路由+AC+POE 一体机或分体方案

By: seaguest
8 July 2025 at 13:50
seaguest:

弱电箱( 400x300x110 )有四根超六类网线接到客厅以及三个房间,打算用 AP 面板组全屋 WIFI ,计划买 1000M 宽带,希望设备能跑满带宽无压力。

需求

  • 全屋 AP 面板组网,单 SSID 无缝漫游,访客 WiFi 隔离(多 VLAN 或密码区分)
  • 软路由科学上网
  • 弱电箱空间有限,希望设备尽量整合(软路由+AC+POE )

目前考虑

一体机

  • 爱快 A50 (性能一般)
  • 倍控 N5105 (散热差,似乎问题挺多)

分体方案

  • J4125/N100 软路由 + 小型 POE 交换机(如 TP-Link 带 AC 管理)

问题

  1. 哪一个方案更好,有没有其他更好的方案呢?
  2. 访客隔离(同一个 ssid ,不同密码进入不同的 vlan ,访客不能科学上网)是否需要特定 AP ?

Metis UI:下一代 React 组件库,重新定义前端开发体验

By: Minimx
8 July 2025 at 13:50
Minimx:

Metis UI:下一代 React 组件库,重新定义前端开发体验

在快速发展的前端生态中,开发者们一直在寻找既能提高开发效率,又能保证代码质量和用户体验的解决方案。今天,我们很兴奋地向大家介绍 Metis UI —— 一个基于 Tailwind CSS 构建,继承 Ant Design 交互逻辑的现代 React 组件库。

为什么选择 Metis UI ?

在众多组件库中,Metis UI 独树一帜,它不是简单的重复造轮子,而是在继承优秀设计理念的基础上,带来了全新的开发体验:

继承经典,超越传统

Metis UI 基于 Ant Design 久经考验的组件逻辑构建,确保了交互模式的一致性和可靠性。同时,我们抛弃了传统的 CSS-in-JS 方案,全面拥抱 Tailwind CSS ,为开发者带来了前所未有的样式自由度。

极致的开发体验

import { Button, Input, Form } from 'metis-ui';

// 简洁的 API ,强大的功能
<Button 
 type="primary" 
 className="hover:scale-105 transition-transform"
>
  自定义样式,轻而易举
</Button>

无需学习复杂的主题配置,直接使用 Tailwind 类名即可实现个性化定制。

技术亮点

1. 完美的 TypeScript 支持

interface ButtonProps {
 type?: 'primary' | 'default' | 'dashed';
 size?: 'small' | 'middle' | 'large';
 loading?: boolean;
 ...
}

每个组件都提供完整的类型定义,让你的开发过程更加安全和高效。

2. Tailwind CSS 深度集成

<Button className="bg-gradient-to-r from-blue-500 to-purple-600 hover:from-blue-600 hover:to-purple-700">
 渐变按钮
</Button>

利用 Tailwind 的强大功能,轻松实现复杂的样式效果。

3. 文档驱动开发

  • 📝 详细的 API 文档
  • 🎮 可交互的代码示例
  • 🌐 多语言支持
  • 📱 移动端友好的浏览体验

快速开始

安装

# npm
npm install metis-ui

# pnpm (推荐)
pnpm add metis-ui

# yarn
yarn add metis-ui

配置

向你的入口 CSS 文件添加一个 @plugin 以导入 Metis UI 。

@import 'tailwindcss';

@source './node_modules/metis-ui/es';
@plugin 'metis-ui/plugin';

开始使用

import { Alert } from 'metis-ui';

const App = () => (
  <div className="h-screen w-screen">
    <Alert type="info" banner message="Hello" description="Welcome to metis-ui" />
  </div>
);

export default App;

主题定制

Metis UI 只针对颜色进行主题定制,默认提供了两套主题:lightdark。您还可以创建自己的自定义主题或修改内置主题。

您可以在 CSS 文件中的 @plugin "metis-ui/plugin" 后添加括号来管理主题,详细介绍

Metis Plus - 企业中后台系统模板

我们提供了一套开箱即用的企业中后台系统模板,基于 Reactreact-routerTypeScriptViteTailwindCSSZustandfaker-jsMSW 等技术栈构建。它内置了开箱即用的数据流、国际化、菜单、模拟数据、权限管理、主题切换等功能,助力企业快速搭建高质量的中后台应用。

├── .husky                     # Husky 钩子配置目录
├── public                     # 公共静态资源目录
├── src                        # 源码目录
│   ├── apis                   # 服务端接口请求相关
│   ├── assets                 # 静态资源(图片、SVG 等)
│   ├── components             # 通用组件
│   ├── hooks                  # 自定义 hooks
│   ├── layouts                # 页面布局组件
│   ├── locale                 # 国际化资源
│   ├── mocks                  # Mock 数据与服务
│   ├── pages                  # 页面组件
│   ├── store                  # Zustand 状态管理
│   ├── types                  # TypeScript 类型定义
│   ├── utils                  # 工具函数与工具类
│   ├── loading.tsx            # 全局 Loading 组件
│   ├── main.tsx               # 应用入口文件
│   ├── routes.tsx             # 路由和菜单配置
│   └── vite-env.d.ts          # Vite 环境类型声明
├── .env                       # 环境变量配置文件
├── .lintstagedrc              # lint-staged 配置文件
├── .prettierignore            # Prettier 忽略文件配置
├── .prettierrc                # Prettier 代码格式化配置
├── commitlint.config.js       # 提交规范校验配置
├── eslint.config.js           # ESLint 代码规范配置
├── index.html                 # 项目入口 HTML
├── package.json               # 项目依赖与脚本配置
├── tailwind.css               # TailwindCSS 全局样式入口
├── tsconfig.app.json          # TS 应用配置
├── tsconfig.json              # TS 根配置
├── tsconfig.node.json         # TS Node 配

官方资源

tips: 网站匀部属在 Github Pages, 访问可能需要梯子

职场碎碎念

8 July 2025 at 13:37
xiaohanliang:

工作 6 年了, 有点自己的职场碎碎念, 随便写写走过的弯路

我的背景, 英国水硕(就是那个因为排名太高成为一个梗的), 4 年互联网, 2 年量化, 现量化边缘业务组

我的性格, ENFJ/ENFP 性格比较跳, 说难听点就是组里的刺头

TL;DR

  1. [情绪类]不要太敏感, 放下情绪, 不要在乎面子, 其实也没人在乎你感受, 老板只关心任务做的怎样, 合作方反馈, 其他的他也不想听, 大部分人也没啥兴趣看
  2. [学习与成长]专注 A 类(重要不紧急)任务, 理解永远最重要, 日常大部分做的事其实都不一定有用, 也不是一定要做, 理解任务才能成长 -> 有足够成长才能变得 "更值钱", 不要被 C/D(主要是指一些杂活)任务消耗太多精力

情绪类 Topic

一个情绪波动比较大的人, 总是会被日常一些别人的行为影响到情绪. 情绪乱了很多事情就不好做了 - 原本定好的完成进度会被影响 - 原本能沉下心写明白的算法写的漏洞百出 - 原本能好好说的话现在也无法好好表达了

我感觉性格是我最大的问题, 总觉得别人说一些话是在攻击我, 太敏感了, 我知道这是刻在我骨子里的有些东西就是很难改, 理由总有千万个什么早年经历原生家庭之类的, 现实情况是你不改那因为情绪化产生的各种问题就会一直折磨你. A 导致 B 你不改 A 那么 B 就会一直出现, 纵使你有千万个理由

因为敏感产生的并发症太多了, 总觉得别人攻击自己, 恶意揣测, 看不起自己给自己摆谱, 十分需要别人的肯定, 说到底本质还是因为对自己不够自信, 因为心底里并不真觉得自己能行, 所以容易会把所有事情都歪曲解读, 好像一个承重柱不稳的房子就很容易摇摇晃晃一样. 如果你是马云有那么多钱你还会很在意别人的看法吗?

有一次我真的绷不住了, 我跟我老板说他那样骂我我真的受不了, 我就骂了回去, 我老板给我看了他的平级在另一个人更多的大群里骂他的记录, 我没话了, 的确人不是一定要忍气吞声, 如果你真的所有事情都能做好那你确实没必要忍耐, 但在我们成长为有话语权的人之前, 忍耐一手也是不可或缺的, 一个小白的怒火是没有人会在意的.

逼着自己去做吧, 可能一开始会比较难受, 也许后面适应了就会好一点, 说着容易实际做起来就会阻碍重重. own 一个大项目的时候就需要做一个老妈子的角色, 方方面面都要安排明白, 成员可以找一万个理由 delay 不好意思但我不能, 出问题那就是骂你. 当完孙子回头还是要问其他人你现在是否遇到什么问题不理解的, 需要我帮忙的. 记得很清楚当时被老板骂的时候, 骂完我说: 你骂好了我现在来改. 我也觉得这很难受但, 我感觉这就是成长不可或缺的一个环节, 承载最大的压力与责任, 否则最多当好一个 IC

处理完一天的任务脑子已经一片混沌的时候, 有时候真的很难再集中精力告诉自己区分 A/B/C 类任务, 再识别出自己因为情绪问题导致的不理智行为, 这也是我要克服的, 道理大家都懂, 真落地的时候又有多少人能克服了自己性格上的问题, 做不到我也不怪自己无能, 每个周每个月能进步一点我也会觉得自己变得更厉害了

学习与成长 Topic

我不知道你们有没有观察过或者想过, 自己一个 Q, 一个周好像没做出来啥可圈可点的好玩意儿, 但是每天又忙的焦头烂额, 说到底还是 C(紧急不重要) D(不紧急不重要) 的事做太多了. 可圈可点的好玩意儿是 A 类任务, 需要一些较长周期的建设, 一些学习理解后做的出来.

每天周围会刷新一些 CD 类任务出来进你的栈, 按照直觉那就 LIFO, 谁找我我就处理谁: 好的我看下我看看之类的, CD 的刷新可能比你消耗的速度还要更快, 最后一整天都在看看都在 debug

  • 这种日子持续 5 天, 那么一周 A 任务都没啥太大推进, 周报不好写了
  • 持续两三个月那么一个 Q 都没啥推进, 季度总结不好写了
  • 持续一两年你简历都没法写了, 你会发现自己度过了痛苦的几年但成长几乎为 0

我们都知道这样不好, 但现实是日常生活就是频繁刷 CD 任务出来, 这是铁一般的事实, A 类任务就是几乎不会刷出来, 尽管我们都知道 A 通关了能爆好东西, 那怎样减少 CD, 给我们腾出更多精力专心刷 A 这是一个要处理的棘手问题. 我的体感是, 建立一个完善的值班制度, 对应方向有(至少一个)负责的人, 最重要的是: 你得明白为什么你的生活里会如此频繁的刷垃圾任务出来. 你直接把刷怪笼打掉不就好了么?

理解, 理解问题吧, 找个本子找个笔, 记录最临近 100 个垃圾任务, 想想是不是我系统设计不到位打个补丁哪怕是塞个 if else 进去呢? 是不是我可以做个脚本让他们自己去修呢? 方法很多, 善于利用的聪明人就会给自己腾出更多精力. 我有时候真觉得不思考问题的本质 (这个词已经给说的有点臭了但还真的有效) 只会让自己愈发繁忙焦头烂额, 越焦头烂额越是没脑力去思考, 进步就会越慢, 有时候我逼自己慢下来, 不要着急回复, 不要着急处理, 不要着急键盘敲的噼里啪啦响, 实践几周后我发现真的有不少任务我想明白了, 似乎就没必要做了.

看来我们的问题还是思考的不够多, 而心急着手处理的太快. 最后业务说不明白成长为 0 即使跳槽也会发现自己好像啥也说不明白, 自然也没有 A 薪资的底气. 于是对内无法晋升, 向外就算跳槽也 A 不了太多薪资.

最后总结一下

我不想让自己变成爹味很明显的说教, 我说的只是针对我自己性格我的感受, 而且我就算说了做了顿悟一般的思考我也不一定能做到. 总结一下也就两句话:

  1. 没有人在乎你的感受, 大家只在乎做完没有反响如何
  2. 看到问题表象不要着急处理, 思考下 Context, 记录 100 个 case 想想为啥, 比敲键盘要远快的多

Vue3 编写的最佳实践是怎样的?

8 July 2025 at 13:34
yesterdaysun:

最近刚用上 Vue3, 我在写 Vue3 的时候总感觉代码非常的散, 稍微复杂的页面里, 就是一堆的 const ref, computed, 更不用说一堆的 xxxLoading, xxxVisible, showXXX, hideXXX, 感觉写 Vue2 的时候也没这么乱过, 如果说要提取所谓 Composiable 组件, 感觉又是一堆的 useXXX, 导出一堆的 xxx,xxx 好像也没好到哪里去, 是我写的姿势不对吗? 这方面的最佳实践到底是什么, 有没有哪个开源项目让我参考参考?

分享个常见机房 Ping 监控网站

8 July 2025 at 13:27
songtianlun:

https://smokeping.frytea.com

挑选机器时可参考一下,比如目前版瓦工正在发售的 BIGGERBOX 所在的 洛杉矶 DC1 机房监控:

https://smokeping.frytea.com/smokeping/?target=BandwagonHost.USCA_1

目前监控了数二百余机房,监控结果可作为网络稳定性的参考,需要更多可留言。

❌
❌