飞桨常规赛:点击反欺诈预测 – 4月第8名方案

该方案针对飞桨点击反欺诈预测赛题,处理约50万点击数据。预处理含样本打乱,连续特征归一化、离散特征嵌入(处理高基数特征);构建双层双向GRU模型,含嵌入层、全连接层等;用Adam优化器,batch_size50,动态调学习率,最高得分88.992分,还做了模型对比与优化展望。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

飞桨常规赛:点击反欺诈预测 - 4月第8名方案 - 创想鸟

飞桨常规赛:点击反欺诈预测 – 4月第8名方案

作者:@LYX-夜光

1 比赛介绍

  广告欺诈是数字营销需要面临的重要挑战之一,点击会欺诈浪费广告主大量金钱,同时对点击数据会产生误导作用。本次比赛提供了约50万次点击数据。
  特别注意: 该数据是模拟生成,对某些特征含义进行了隐藏,并进行了脱敏处理。请预测用户的点击行为是否为正常点击,还是作弊行为。点击欺诈预测适用于各种信息流广告投放,banner广告投放,以及百度网盟平台,帮助商家鉴别点击欺诈,锁定精准真实用户。
  赛题链接:点击反欺诈预测

2 思路介绍

2.1 数据预处理

  1. 样本分析: 点击反欺诈预测是一个二分类问题,对于分类问题,首先需要统计数据集正反例样本的占比,假如正例样本占比太大,可能会使模型更倾向于预测出正例的结果。因此,对于样本不平衡的数据集,一般采用上采样或下采样等方法。由于本赛题的数据集样本比较平均,因此不需要对数据集进行平衡处理。
  2. 样本打乱: 将数据集中样本打乱,这样是为了防止模型在训练时记住了样本的某种顺序特性,以免影响模型的泛化能力。将打乱后的数据集的前90%作为训练集、后10%作为验证集。
  3. 特征分析: 观察数据集特征,除“sid”(样本id)、“label”(分类结果)之外,数据集特征共有18个,其中“dev_height“,”dev_ppi“,”dev_width”,“timestamp”是连续特征,其余都是离散特征。连续特征与离散特征的区别是,前者存在特征值的某种大小关系,后者只存在特征值是否相等的关系。常见的连续特征处理方法有归一化、标准化等;离散特征的处理方法有独热编码(one-hot)、嵌入(embedding)等。考虑到“dev_xxx”等特征的不同取值较少,同时直观感觉这些特征的大小关系与是否欺诈的关联性不大,因此将“dev_xxx”等特征作为离散值处理。
  4. 特征处理: 将连续特征归一化(value−min)/(max−min)(value−min)/(max−min);对离散特征采用embedding,首先进行独热编码,即将离散特征值映射为0到n-1的整数,n为每个特征值的不同取值数。由于“android_id”、“package”、“fea_hash”、“fea1_hash”等特征的【不同取值的个数较多(如某特征在50W数据中有30W+的不同取值)】且【存在较多的相同取值计数小的样本(设某特征存在特征值”value1″、”value2″、…,对相同取值为”value1″、”value2″、…等样本统计样本数,数据集中存在有较多样本数少的样本)】,因此将这些相同特征值的样本数小于等于15的特征值转换为同一个值,这种处理一方面可以减少嵌入参数、缩短训练时间,另一方面减少相同特征值的样本数太少所带来的偶然性。
  数据预处理部分代码如下:

# 特征处理方式,1:嵌入,2:归一化class DealType(Enum):    EMB = 1    NORM = 2    EMB_FILTER = 3# None为舍弃特征FEATURE_PATTERN = {    # 'sid': None,    'android_id': DealType.EMB_FILTER,    'media_id': DealType.EMB,    'apptype': DealType.EMB,    'package': DealType.EMB_FILTER,    'version': DealType.EMB,    'ntt': DealType.EMB,    'carrier': DealType.EMB,    'os': DealType.EMB,    'osv': DealType.EMB,    'dev_height': DealType.EMB,    'dev_ppi': DealType.EMB,    'dev_width': DealType.EMB,    'lan': DealType.EMB,    'location': DealType.EMB,    'fea_hash': DealType.EMB_FILTER,    'fea1_hash': DealType.EMB_FILTER,    'cus_type': DealType.EMB,    'timestamp': DealType.NORM,}FEATURE_PATTERN_NEW = FEATURE_PATTERN.copy()FEATURE_PATTERN_NEW.update({    'android_id': DealType.EMB,    'package': DealType.EMB,    'fea_hash': DealType.EMB,    'fea1_hash': DealType.EMB})FEATURE_LIST = [feat for feat in FEATURE_PATTERN_NEW if FEATURE_PATTERN_NEW[feat]]# 训练集,验证集比例TRAIN_RATIO = 0.9VAL_RATIO = 0.1# 转换大离散特征for feat in FEATURE_PATTERN:    if FEATURE_PATTERN[feat] == DealType.EMB_FILTER:        trainPoint = int(len(trainData[feat]) * TRAIN_RATIO)        trainValue = trainData[feat][:trainPoint]        valueDict = {value: str(value) for value in set(trainValue) if value is not np.nan}        data = trainData.iloc[:trainPoint].groupby(feat)[feat].count()        removeValue = -1        data[data <= 15] = removeValue        valueDict.update(data.loc[data == removeValue].to_dict())        trainData[feat] = trainData[feat].map(valueDict)        trainData[feat] = trainData[feat].replace({np.nan: removeValue})        testData[feat] = testData[feat].map(valueDict)        testData[feat] = testData[feat].replace({np.nan: removeValue})

       

2.2 模型构建

飞桨常规赛:点击反欺诈预测 - 4月第8名方案 - 创想鸟
           图1 神经网络模型

  如图1,模型说明如下:
  1. 嵌入层: 对离散特征采用嵌入(embedding),embedding的输出维度一般设为k⌊size4⌋(k≤16)k⌊4size⌋(k≤16),sizesize为某特征的不同取值数量,在这里取k=1k=1。
  2. 隐藏全连接层: 对每个连续特征和已嵌入的离散特征分别构造全连接,将全连接的输出设为同一维度nn,这是为了后面可直接采用GRU网络,这里设n=1n=1。该步骤相当于特征重建,即重新构建了与原始输入数据同一维度的特征。
  3. GRU层: 考虑到特征之间存在某种关联,如有些特征同属于用户特征、有些同属于媒体特征。由于LSTM或GRU能够很好地记忆特征间关联的信息,并且GRU在很多方面比LSTM更优,同时GRU比LSTM少一个门,在运算时能节省时间,因此采用GRU。这里采用双层双向GRU,采用双向是认为特征之间前后都有关联,而不仅仅是后面的特征与前面的特征有关联,设hidden_size=18,与特征个数相同。
  4. 输出全连接层: 采用两层全连接层,最后激活函数使用softmax。
       

  组网代码:

class ConNet(paddle.nn.Layer):    def __init__(self, sizeDict: dict):        super().__init__()        # 存储每个特征的隐藏层        self.hidden_layers_list = nn.LayerList([])        # 统计隐藏层输出结点        out_features = 1        for feat in FEATURE_LIST:            if FEATURE_PATTERN_NEW[feat] == DealType.EMB:                embedding_dim = int(np.power(sizeDict[feat], 0.25))                hidden_layer = nn.LayerList([nn.Embedding(num_embeddings=sizeDict[feat], embedding_dim=embedding_dim),                                             nn.Linear(in_features=embedding_dim, out_features=out_features)])            else:                hidden_layer = nn.LayerList([nn.Linear(in_features=1, out_features=out_features)])            self.hidden_layers_list.append(hidden_layer)        feature_size, hidden_size = len(FEATURE_LIST), len(FEATURE_LIST)        self.gru = nn.GRU(input_size=out_features, hidden_size=hidden_size, time_major=True, num_layers=2, direction="bidirect", dropout=0.2)        out_layer1_in_features, out_layer1_out_features = feature_size+hidden_size*4, hidden_size        self.out_layer1 = nn.Linear(in_features=out_layer1_in_features, out_features=out_layer1_out_features)        self.out_layer2 = nn.Linear(in_features=out_layer1_out_features, out_features=2)        self.softmax = nn.Softmax()    def forward(self, X):        layerList = []        for x, hidden_layers in zip(X, self.hidden_layers_list):            for hidden_layer in hidden_layers:                x = hidden_layer(x)            # 将[batch_size, 1, out_features] 转为 [batch_size, out_features]            layerList.append(tensor.flatten(x, start_axis=1))        # 在0维扩展维度        X = tensor.stack(layerList, 0)  # [time_step, batch_size, vector_size]        # 送入GRU,将每个batch的输出拼成向量        out, hc = self.gru(X)        out = out[:, :, -1].transpose((1, 0)).unsqueeze(0)        # 合并        y = tensor.concat(list(out)+list(hc), axis=1)        # 把特征放入用于输出层的网络        y = self.out_layer1(y)        y = self.out_layer2(y)        y = self.softmax(y)        # 返回分类结果        return y

       

2.3 训练调参

  1. batch_size: 设为50,不确定设为多大最合适,尽量保证能整除训练集数量
  2. 优化器: 选择Adam,确保能够快速收敛
  3. 学习率lr: 先设为0.001,训练大概30个左右epoch后,选择验证集损失(val loss)最小的模型参数,再将学习率设为0.0005,再进行训练,看情况再依次递减学习率训练
       

3 模型结果和对比分析

3.1 模型结果

  采用以上的思路,模型的预测结果分数大部分时候有88.9分以上,最高能达到88.992分
       

3.2 模型对比

  1. 特征选取对比: 刚开始没有选取所有特征,因为考虑到”android_id“等特征的不同取值数量太大,不适合用于嵌入,”os“特征取值只有两个取值,而且两个取值只有首字母大小写的区别,因此舍弃了几个特征。后面通过逐个增加特征对比,发现利用所有特征的效果最好。
  2. 特征处理对比: 将“dev_xxx”等特征用【归一化】和【嵌入】作对比,发现后者【嵌入】效果较好;将“fea1_hash”特征【直接嵌入】和【特征处理:将相同取值的样本数小于等于15转化为相同值】作对比,发现后者【特征处理】效果更好;比较【特征处理:将相同取值的样本数小于等于k转化为相同值】,k取5或10时,不如k=15,k取20与15差不多;将“timestamp”特征拆分为“day”、“hour”、“minute”,再进行嵌入,效果比”timestamp”直接使用归一化差。
  3. 嵌入维度对比: 将【embedding输出维度统一为同一值(如统一输出为4,8,16,32等)】与【embedding输出维度k⌊size4⌋(k≤16),k=1k⌊4size⌋(k≤16),k=1】作对比,发现后者优于前者;将kk取值为1和2做对比,发现k=1k=1效果较好。
  4. 隐藏全连接层对比: 将隐藏全连接输出维度取1和2作对比,发现取1时较好。
  5. GRU层对比: 加上GRU层明显比仅使用全连接层效果好,hidden_size采用8或32时,比采用16或18效果较差。使用双层GRU比单层效果好,三层与双层效果差不多。
  6. 输出全连接层对比: 使用两层全连接层比一层效果好。
  7. 优化器对比: 测试了SGD、Momentum、Adam、Adadelta等优化器,发现Adam明显优于其他优化器。
  注意: 以上对比如有出入的地方,可能是因为实验做得不充分,另一方面可能由于权值初始化是随机的,无法做出比较准确的对比。

4 总结与展望

4.1 总结

  本文思路和代码参考了baseline,从一开始的86.36分,再一步步调优直到88.99分,期间遇到了很多困难,主要在调参和对比方面,随机初始权值也给模型对比带来了困难。本文的模型在训练时,有时候在epoch较大时会出现loss为nan的问题,至今也不知道为什么,应该不是学习率太大造成的;训练时有时候也没法达到88.9分,这可能是随机初始权值的问题,也可能是模型本身的问题。总之,该模型还是存在着不足。

4.2 展望

  本文思路还有几个可以优化的点:
  1. 特征工程: 可以构造新的特征,或者用其他方法对特征缺失值进行填充;
  2. 模型构建: 如给GRU加入注意力机制,修改模型以及对应的输出等;
  3. 训练调参: 测试batch_size等参数。

  最后,要感谢百度飞桨给我们免费提供算力,在AI Studio中运行项目可以同时运行3个,只要网页不关闭可以一直运行下去,在我模型调参时节约了很多时间。而且,飞桨深度学习框架用起来也很方便,能很快上手,用其他学习框架实现的代码能够很容易地用飞桨框架迁移。
  总之,飞桨很不错,值得大家体验。

附录

执行数据预处理命令:run initData.py

In [28]

run initData.py

       

新训练集创建完成!新测试集创建完成!=================构建特征字典=================特征[android_id]嵌入完毕,value共13个特征[media_id]嵌入完毕,value共292个特征[apptype]嵌入完毕,value共89个特征[package]嵌入完毕,value共364个特征[version]嵌入完毕,value共23个特征[ntt]嵌入完毕,value共8个特征[carrier]嵌入完毕,value共5个特征[os]嵌入完毕,value共2个特征[osv]嵌入完毕,value共165个特征[dev_height]嵌入完毕,value共864个特征[dev_ppi]嵌入完毕,value共105个特征[dev_width]嵌入完毕,value共382个特征[lan]嵌入完毕,value共25个特征[location]嵌入完毕,value共332个特征[fea_hash]嵌入完毕,value共60个特征[fea1_hash]嵌入完毕,value共627个特征[cus_type]嵌入完毕,value共58个特征[timestamp]统计最大最小值完毕=================字典构建完毕=================

       

执行训练命令:run train.py

温馨提示:训练时间需要较久,用CPU每轮约300s-400s,最优模型参数已存储,想直接推理结果可跳过此步,若要训练需要取消如下命令的注释。

In [29]

# run train.py

   

执行推理命令:run test.py

温馨提示:执行该命令前必须先执行run initData.py

In [30]

run test.py

       

mode: pred - batch: 100/3000mode: pred - batch: 200/3000mode: pred - batch: 300/3000mode: pred - batch: 400/3000mode: pred - batch: 500/3000mode: pred - batch: 600/3000mode: pred - batch: 700/3000mode: pred - batch: 800/3000mode: pred - batch: 900/3000mode: pred - batch: 1000/3000mode: pred - batch: 1100/3000mode: pred - batch: 1200/3000mode: pred - batch: 1300/3000mode: pred - batch: 1400/3000mode: pred - batch: 1500/3000mode: pred - batch: 1600/3000mode: pred - batch: 1700/3000mode: pred - batch: 1800/3000mode: pred - batch: 1900/3000mode: pred - batch: 2000/3000mode: pred - batch: 2100/3000mode: pred - batch: 2200/3000mode: pred - batch: 2300/3000mode: pred - batch: 2400/3000mode: pred - batch: 2500/3000mode: pred - batch: 2600/3000mode: pred - batch: 2700/3000mode: pred - batch: 2800/3000mode: pred - batch: 2900/3000mode: pred - batch: 3000/3000结果文件保存至: ./results/results_0.0005_06.csv

       

以上就是飞桨常规赛:点击反欺诈预测 – 4月第8名方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/45844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网友晚上被困五台山遇狐狸引路? 本人:因好奇跟狐狸走了10分钟 惊喜地发现到了终点附近
上一篇 2025年11月7日 15:10:16
下一篇 2025年11月7日 15:13:19

相关推荐

  • GPU 使用率低下的成因分析与排查解决指南

    GPU使用率低不等于显卡未工作,可能是任务流程中存在等待或瓶颈。先检查驱动是否更新、电源模式是否设为高性能、显卡连接与散热是否正常;再分析是否存在CPU预处理慢、存储速度低或频繁I/O导致GPU等待;最后优化应用设置,如提升画质、关闭垂直同步、减少后台占用。问题多出在流程瓶颈而非显卡性能不足。 GP…

    2026年9月22日
    100
  • 荣耀官宣!谢霆锋成荣耀Mgaic8系列代言人

    今日,荣耀正式宣布谢霆锋担任“未来科技体验官”,并曝光其手持荣耀magic8 pro的宣传画面。 据知名数码博主@数码闲聊站透露,该机型将采用一块6.71英寸的1.5K等深四曲面屏幕,集成3D人脸识别与3D超声波指纹解锁功能,带来更安全便捷的交互体验。续航方面,新机内置高达7200mAh的青海湖电池…

    2026年9月22日
    000
  • Java项目中利用.class文件:Classpath配置与接口实现

    在Java项目中引用并实现来自.class文件的接口是常见的需求,尤其当仅提供编译后的字节码文件时。本文将深入讲解Java Classpath的核心概念及其重要性,并提供在命令行环境下配置Classpath的详细步骤和示例,确保编译器和JVM能够正确找到并加载所需的.class文件,从而顺利完成接口…

    2026年9月22日
    700
  • 抖音没有播放量是不是被限流了?怎么知道自己被限流了

    在如今的短视频生态中,抖音以其强大的社交传播力和多样化的内容形式,吸引了众多创作者和用户。然而,一些创作者发现自己的作品播放量持续低迷,甚至毫无增长,不禁怀疑是否遭遇了平台限流。本文将围绕这一问题展开分析,并提供实用建议。 一、抖音限流的原因解析 1. 算法机制优化 抖音的推荐系统以用户兴趣为导向,…

    2026年9月22日
    000
  • safari浏览器怎么阻止网站访问剪贴板_safari浏览器阻止网站访问剪贴板方法

    可通过关闭网站剪贴板权限、启用无痕浏览、禁用JavaScript或使用内容拦截扩展来阻止Safari网站访问剪贴板,保护隐私安全。 如果您在使用 Safari 浏览器时发现某些网站尝试自动读取或写入剪贴板内容,可能会导致隐私泄露或意外粘贴敏感信息。为防止此类行为,您可以采取以下措施限制网站对剪贴板的…

    2026年9月22日
    1800
  • 移动端显卡性能释放对比:满血版RTX 4080 Laptop vs. 残血版

    移动端RTX 4080显卡的“满血版”与“残血版”核心区别在于功耗(TGP)释放,满血版可达175W,性能更强;残血版则被限制在百瓦以下,性能大幅缩水,选购时需关注具体功耗参数以避免被型号误导。 关于移动端显卡的“满血版”和“残血版”RTX 4080 Laptop对比,关键在于厂商对功耗(TGP)和…

    2026年9月22日
    300
  • Linux进程调度学习!

    进程调度决定了哪个进程将被执行以及执行的时间,操作系统通过合理的进程调度实现资源的最大化利用。 在单片机上,常见的方式是系统初始化后进入 while(1){} 循环。当然,单片机也可以运行类似 FreeRTOS 的系统,从而实现进程切换。 在带有操作系统的 CPU 上运行的逻辑是允许多个进程(实际上…

    2026年9月22日
    000
  • ​​VSCode高手才知道的骚操作!学会这些技巧开发快人一步​​

    掌握VSCode效率核心在于命令面板、自定义快捷键、多光标编辑、代码片段与扩展生态;通过减少鼠标依赖、实现快速跳转与自动化操作,构建专属高效开发环境,让注意力聚焦于代码思维而非工具操作。 VSCode里那些让你效率翻倍的“骚操作”,本质上是将开发流程中的重复性、高频操作进行极致的简化与自动化。它不是…

    2026年9月22日
    300
  • 夸克浏览器为什么会自动跳转到其他应用_夸克浏览器自动跳转应用原因

    1、检查链接是否含唤起协议,如intent://或weixin://;2、关闭夸克浏览器“智能打开App”功能;3、重置系统默认应用设置,确保夸克优先处理链接;4、更新或重装夸克浏览器以修复潜在问题。 如果您在使用夸克浏览器时发现页面点击后自动跳转到其他应用程序,这可能是由于浏览器与系统之间的协议调…

    2026年9月22日
    200
  • 工信部批复:eSIM 手机业务全网开通,暂不支持线上方式

    10 月 14 日消息,据 c114 通讯网报道,中国电信、中国联通与中国移动已于今日正式获得批准,可开展 esim 手机运营服务的商用试验。 根据三大运营商公布的相关信息,eSIM 手机服务将覆盖全国 31 个省、自治区及直辖市,并正式进入市场销售阶段。 需要注意的是,在此次商用试验阶段,暂不支持…

    2026年9月22日
    000
  • CanvaPro中AI生成图片如何导出为PDF?快速保存图像的方法

    在Canva Pro中导出AI生成图片为PDF,需先将图片添加至设计,点击“分享”→“下载”→选择“PDF标准”或“PDF打印”即可。2. PDF标准适用于在线分享,文件小、加载快;PDF打印适用于高质量印刷,支持300 DPI和CMYK色彩模式,确保色彩准确与细节清晰。3. 为保证AI图片导出质量…

    2026年9月22日
    200
  • Laravel 文件上传:解决数据库存储物理路径而非可访问 URL 的问题

    本教程旨在解决 laravel 文件上传后,数据库中存储文件物理路径而非可访问 url 的常见问题。通过分析 move() 方法的返回值,并引入 url() 辅助函数,我们将演示如何正确地将文件移动到指定目录,同时确保数据库记录的是可供前端访问的图片资源链接,从而避免图片无法正常显示。 在 Lara…

    2026年9月22日
    100
  • windows怎么更改计算机工作组_Windows计算机工作组修改方法

    首先通过系统属性修改工作组名称,右键“此电脑”选择属性,进入高级系统设置的计算机名选项卡进行更改并重启;其次可用管理员命令提示符执行wmic命令批量配置,输入指定命令后重启生效;最后专业版用户可通过组策略编辑器,在启动脚本中添加指令实现自动加入工作组。 如果您需要将Windows计算机加入或更改到特…

    2026年9月22日
    000
  • 机械键盘轴体深度手感分析:线性轴、段落轴与提前段落轴

    机械键盘手感取决于轴体类型,主流分为线性轴、段落轴和提前段落轴。线性轴直上直下顺滑连贯,代表如Cherry MX Red,适合游戏与快速输入;段落轴中程有明显阻力峰,提供清晰反馈,如Cherry MX Blue,适合文字工作;提前段落轴起步阻力大随后变轻,如TTC Gold Pink,防误触且节奏独…

    2026年9月22日
    000
  • 实现Java双向路径搜索的正确方法

    本文旨在帮助开发者理解并正确实现Java中的双向路径搜索算法。通过分析常见的实现错误,我们将提供一种清晰、可行的解决方案,并详细解释如何构建完整的路径,克服单向搜索树的局限性,从而实现从起点到终点的完整路径搜索。 双向路径搜索是一种优化路径搜索效率的策略,它同时从起点和终点开始搜索,并在中间相遇。然…

    2026年9月22日
    900
  • 抖音达人橱窗账号怎么起号的?抖音橱窗在哪里

    越来越多的达人纷纷入驻,希望通过橱窗账号实现变现。如何起号、运营,才能在众多达人中脱颖而出,成为爆款呢?本文将从以下几个方面为您解析抖音达人橱窗账号起号攻略。 一、关键词选择与定位 1. 关键词选择 关键词是抖音达人橱窗账号的核心,它决定了你的内容方向和受众群体。以下是一些建议: (1)关注热点:紧…

    2026年9月22日
    100
  • VSCode设置Markdown写作环境(实用技巧,排版美化指南)

    要在vscode里打造舒服又高效的markdown写作环境,答案是通过安装核心扩展并进行个性化配置来实现;需安装markdown all in one、markdown preview enhanced、prettier和paste image等扩展,结合settings.json中的编辑器设置、自…

    2026年9月22日
    100
  • 如何用Filmora制作高质量AI视频?简易AI视频剪辑的实用指南

    如何用Filmora制作高质量AI视频?简易AI视频剪辑的实用指南如何用Filmora制作高质量AI视频?简易AI视频剪辑的实用指南如何用Filmora制作高质量AI视频?简易AI视频剪辑的实用指南如何用Filmora制作高质量AI视频?简易AI视频剪辑的实用指南

    Filmora的AI功能通过AI Copilot脚本生成、AI文本转视频、AI语音、图像生成、智能抠像及音频优化等工具,显著提升视频制作效率与专业度,尤其在视觉处理、听觉优化和创意辅助方面表现突出;关键在于将AI作为辅助起点,避免过度依赖,结合人工精修,才能实现高质量AI视频创作。 ☞☞☞AI 智能…

    2026年9月22日 用户投稿
    400
  • 好用的终端复用神器-Tmux

    好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux

    前言 许久之前就听说过tmux,但是一直没上手,直到最近需要一直在linux下完成一些任务,我才切实感受到了tmux的优点:任意分屏、保存工作 就单单这两点,就足够实用了。分屏,曾今还十分痴迷i3wm和dwm这样的窗口管理工具,尤其是dwm的操作逻辑,大大提升linux工作效率。其他详情可以查看阮一…

    2026年9月22日 用户投稿
    100
  • 星纪魅族万志强回应魅族22影像升级:10月还会有OTA

    10月13日,星纪魅族集团中国区cmo万志强就用户对魅族22手机影像表现的积极评价作出回应。他表示,本月还将推送新一轮ota更新,届时魅族22的影像性能有望再次提升。 魅族22 据CNMO消息,有用户反馈称:尽管魅族22在发布时拍照能力并非顶尖,但通过数月的系统优化,其影像水准已达到主流旗舰机型80…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信