聊聊 Kotlin 代理的“缺陷”与应对

App渗透测试职业进阶:从工具使用到安全架构的成长路径 移动应用安全测试是网络安全领域的关键分支,其核心在于通过模拟攻击来发现和修复应用漏洞,保障数据与业务安全。从技术原理层面看,它涉及对Android/iOS系统机制、网络通信协议、加密算法及代码逻辑的深度分析。掌握Frida、Burp Suite等动态调试与抓包工具,理解OWASP Mobile Top 10漏洞成因,是构建测试能力的工程实践基础。随着技术演进,测试人员需从自动化脚本执行,进阶至逆向工程、协议分析及安全架构设计,以应对混合开发、IoT等复杂场景。本内容聚焦App渗透测试人员的职业发展,系统拆解 阅读详情

Kotlin 代理是面试中经常被问到的问题,比如介绍一下代理的实现原理以及在使用中的一些注意事项等,本文将带你梳理这些问题,让你从更高维度上认识“代理”

Kotlin 有很多让人津津乐道的语法,“代理”就是经常被提及的一个。Kotlin 在语言级别通过 by 关键字支持了代理模式的实现。代理模式是最常用的设计模式之一,它是使用“组合”替代“继承”的最佳实践。下面取自 Wiki 中关于代理模式的例子:

class Rectangle(val width: Int, val height: Int) {
    fun area() = width * height
}

class Window(val bounds: Rectangle) {
    // Delegation
    fun area() = bounds.area()
}

这是一个代理模式的典型场景:Window 将 area() 的具体实现委托给了 Retangle 类型对象 bounds,Rectangle 与 Window 是代理与接收的关系。如果我们使用 Kotlin 的 by 关键字实现同样逻辑,代码变成下面这样:

interface ClosedShape {
    fun area(): Int
}

class Rectangle(val width: Int, val height: Int) : ClosedShape {
    override fun area() = width * height
}

class Window(private val bounds: ClosedShape) : ClosedShape by bounds

Kotlin 的 by 关键字只能基于接口进行代理,所以我们需要抽象出 Window 和 Rectangle 的共同接口 ClosedShape,通过 by 关键字, Window 将 area() 委托给 bounds 来实现, Window 内部中省掉了直接调用 bounds 的代码。这个例子比较简单,优势体现的不明显,试想随着接口方法的增多,by 可以帮我们减少大量的模板代码。

虽然 by 关键字为我们带来了方便,但是它的一些机制也受到不少开发者诟病,甚至连 Kotlin 首席设计师 Andrey Breslav 都曾公开表示不喜欢这个功能。Kotlin 接口代理被诟病的问题主要有两个:

  • 代理中无法访问 this
  • 代理无法运行时替换

缺陷1:代理中无法访问 “this”

代理与继承的一个重要区别在于,继承关系中父类可以通过 this 访问运行时的真正实例;而代理关系中代理无法通过 this 直接访问接收方对象(例子中的 Window),但有时我们确实需要获取接收方的状态参与计算,在 Java 中的常见做法是接收方在创建代理时注入自身实例。而 Kotlin 的 by 关键字需要在接收方实例化之前创建好代理,因此无法为代理注入 this 对象。

上面的例子中,假设 width 和 height 是 Window 维护的状态而非 Rectangle,我们在 Rectangle 的 area() 中依赖它们来进行计算,此时该如何解决呢?一个可行的做法是在 Window 的 init 中注入向 Rectangle 注入所需的状态。这里需要注意两点,

  • 第一,直接注入 width 和 height 是不行的,假设 Window 的 size 会变化,所以 Rectangle 需要在计算 area 时始终获取最新的数值,
  • 第二,注入 Window 实例作为 “this”,通过 this 获取最新的 widht 和 height?这也是不妥的,Rectangle 依赖 Window 类型,会降低 Rectangle 的可复用性。

兼顾上述两点后,更合理的做法是为 Rectangle 定义一个可以获取 width/height 的函数类型,然后由 Wiindow 注入这个回调,代码如下:

interface ClosedShape {
    fun area(): Int
}

class Rectangle : ClosedShape {
    lateinit var size: () -> Pair<Int, Int>
    override fun area() = size().let { it.first * it.second }
}

class Window(private val bounds: Rectangle) : ClosedShape by bounds {
    private var width: Int = TODO()
    private var height: Int = TODO()
   
    init {
        bounds.size = { width to height }
    }
}

也许有人会提议为 area() 增加参数,动态传入 width 和 height,但是这增加了 Window 的调用方的负担,违背面向对象中封装性的设计原则。

缺陷2:无法运行时替换代理

不少人希望代理模式中的代理能够根据需要动态替换,实现类似策略模式的效果。但这在目前 Kotlin 代理中是无法实现的。不少 Kotlin 的初学者曾经误认为通过 var 替换代理实例,比如下面代码中,我们将 Window 的参数 bounds 的声明从 val 改为 var

class Window(private var bounds: ClosedShape) : ClosedShape by bounds

但是经编译后的代码实际是下面这样,代理存储在 bounds 之外的另一个 final 成员 ``$$delegate_0` 中。

public final class Window implements ClosedShape {
   private ClosedShape bounds;
   // $FF: synthetic field
   private final ClosedShape $$delegate_0;

   public Window(@NotNull ClosedShape bounds) {
      Intrinsics.checkNotNullParameter(bounds, "bounds");
      super();
      this.$$delegate_0 = bounds;
      this.bounds = bounds;
   }

   public int area() {
      return this.$$delegate_0.area();
   }
}

即使我们在运行时为 bounds 赋值新的对象,代理中的实例也不会发生变化。 假设有这样的场景, Window 的形状在运行时会发生变化,相应地我们需要计算 area 的代理由 Rectangle 变为 Oval,此时该如何解决呢? 一个不难想到的思路是:增加代理的“代理”,实现代理实例的可替换:

class Proxy(var target: ClosedShape) : ClosedShape {
    override fun area() = target.area()
}

class Rectangle : ClosedShape {
    lateinit var size: () -> Pair<Int, Int>
    override fun area() = size().let { it.first * it.second }
}

class Oval : ClosedShape {
    lateinit var size: () -> Pair<Int, Int>
    override fun area() = size().let { Pi * it.first / 2 * it.second / 2 }
}

class Window(private val bounds: Proxy) : ClosedShape by bounds {
    private var width: Int = TODO()
    private var height: Int = TODO()

    private val rectangle by lazy {
        Rectangle().apply { size = { width to height } }
    }
    private val oval by lazy {
        Oval().apply { size = { width to height } }
    }

    fun changeShape(mode: Shape) {
        when (mode) {
            Rectangle -> bounds.target = rectangle
            Oval -> bounds.target = oval
        }
    }
}

上面代码中,我们定义了一个 Proxy 作为 Window 的代理,而真正被调用到的对象是 Proxy的 target,它可以在运行时根据需要做出变化。

但这也带来一个问题,如果接口中的方法很多,Proxy 中会出现大量的 target 的转发代码,增加我们的工作量。此时我们可以使用动态代理对其优化:

class Proxy(var target: ClosedShape?)  {
    fun create() : ClosedShape {
        return newProxyInstance(
            ClosedShape::class.java.getClassLoader(), arrayOf<Class<*>>(ClosedShape::class.java), object : InvocationHandler {
                override fun invoke(proxy: Any?, method: Method, args: Array<out Any>?) = method.invoke(target, args)
            }
        ) as ClosedShape
    }
}

class Window(private val bounds: Proxy) : ClosedShape by bounds.create() {
   
    //...省略
    
}

上面代码中,Proxy 的 create() 返回一个动态代理对象,帮节省了原本需要手动实现的转发代码。

对比其他解决方案

通过上面分析我们知道,使用 by 关键字创建的代理需要在接收方(例子中的 Window)实例化之前确定,并且在编译后存储在一个不可见的 final 成员上,这使得接收方缺少对代理的直接控制的能力,比如无法在 Window 内创建代理,也无法在运行时替换代理。而对比 Kotlin 之外的其他同类解决方案中,你会发现接收方的控制力明显要强得多:

  • Lombook (Kotlin 出现前常用的语法糖工具)提供了 @Delegate 注解,它可以帮助我们将接收方的成员声明为代理,无需再通过构造函数传入,接收方可以在自行创建代理的同时方便地做一些注入工作;
  • Guava(Google 提供的 JDK 增强库)也提供了实现代理模式的 ForwardingObject,它允许我们在接收方内部通过重写 protected abstract Object delegate(); 返回最新的代理对象,实现代理的可替换。

因此,我们可以简单下一个结论:Kotlin 代理之所以被人诟病,其根本原因在于相对于其他同类方案,接收方缺少对代理的直接控制的能力。目前有不少开发者提了相关 Issue,也许可以期待 Kotlin 在未来的版本中出现更合理的解决方案。在此之前,我们只能通过本文介绍一些 Workaround 进行应对。需要注意本文讲的代理仅仅指接口代理,相比之下,属性代理的设计合理得多,不存在上述这些问题。

APP开发实战:从崩溃、卡顿到抓包逆向,系统化解决常见问题 在移动应用开发中,稳定性与性能是决定用户体验的核心。理解应用崩溃、内存泄漏、界面卡顿等问题的底层原理,是构建高质量应用的基础。这些问题的有效解决,不仅能提升应用的技术价值,确保其流畅稳定运行,还能直接增强用户粘性,覆盖电商、社交、内容消费等多种高频应用场景。本文聚焦工程实践,深入探讨如何利用抓包工具进行网络问题诊断,以及通过代码混淆等技术应对逆向风险,提供从问题定位到系统性防御的完整解决方案,帮助开发者跨越从‘能用’到‘好用’的鸿沟。 阅读详情

相关推荐

从移动端App逆向到服务端渗透:一次完整攻防实战推演

在应用安全领域,移动端App与服务端API的交互构成了一个关键的攻击面。其核心原理在于,客户端代码运行在用户可控的环境中,攻击者可通过逆向工程获取隐藏的业务逻辑、加密算法和通信参数。这种信息泄露的技术价值在于,它能将客户端的逻辑缺陷转化为对服务端信任机制的突破点,从而绕过身份验证、发起未授权访问。典型的应用场景包括:通过静态分析发现硬编码密钥,利用动态抓包破解通信协议,进而伪造合法请求入侵Web后台。本文通过一个实战案例,详细拆解了如何利用App逆向发现的Token生成漏洞,结合Web后台文件上传缺陷和系统

lizaochengwen的专栏 372

面试题:聊聊 Kotlin 代理的“缺陷”以及如何应对

Kotlin 代理是面试中经常被问到的问题,比如介绍一下代理的实现原理以及在使用中的一些注意事项等,本文将带你梳理这些问题,让你从更高的维度上认识“代理” Kotlin 有很多让人津津乐道的语法,“代理”就是经常被提及的一个。Kotlin 在语言级别通过 by 关键字支持了代理模式的实现。代理模式是最常用的设计模式之一,它是使用“组合”替代“继承”的最佳实践。下面取自 Wiki 中关于代理模式的例子: class Rectangle(val width: Int, val height: Int) {.

移动端开发干货分享 654

Kotlin相关面试题

目录 一.请简述下什么是kotlin?它有什么特性? 二.Kotlin 中注解 @JvmOverloads 的作用? 三.Kotlin中的MutableList与List有什么区别? 四.kotlin实现单例的几种方式? 五. kotlin中关键字data的理解?相对于普通的类有哪些特点? 六.什么是委托属性?简单说一下应用场景? 七.kotlin中with、run、apply、let函数的区别?一般用于什么场景? 八.kotlin中Unit的应用以及和Java中void的区别? 九.Ko

龚礼鹏的博客 2万+

一切皆是映射:詳解 Kotlin Map 集合類

map's size var mp = mapOf(1 to "aone", 2 to "two", 3 to "three") println(mp.size) // 3 get key value println(mp[2]) // two for iterator for ((k, v) in mp) { println("$k->$v") } ...

AI天才研究院 9357

机械臂TCP标定实战:从四点法到六点法的精度跃迁

本文详细解析机械臂TCP标定技术,从基础的四点法到高精度的六点法实现精度跃迁。通过工具坐标系与基坐标系的转换原理,结合实战案例展示六点法如何将装配合格率提升至99.5%,并分享环境控制、操作技巧等提升标定精度的关键要素。

weixin_29038345的博客 898

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1067

深入剖析原理!阿里面试100%会问到的JVM,顺利通过阿里Android岗面试

热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能。本篇重点讲解热修复热修复的原理,各大热修复框架的比较,以及自身产品中热修复功能的实践。 一、什么是热修复? 正常开发流程 热修复开发流程 热修复优势 我以为是HR一面,结果是技术,没想到啊,没想到! 1、描述Activity的生命周期。 2、描述一个Activity启动另外一个Activity的生命周期 3、Activity标签可以配置什么 4、IntentFilter里面的标签可以干嘛

Sunbuyi的博客 849

5分钟搞懂异构图注意力网络(HAN):从元路径到节点聚合的全流程解析

本文深入解析异构图注意力网络(HAN)的核心原理与实战应用,从元路径设计到多级注意力实现的全流程。HAN通过节点级和语义级双重注意力机制,有效处理包含多种节点和边类型的异构图数据,在电商推荐、学术网络分析等场景展现卓越性能。文章提供DGL实现代码和调参技巧,帮助开发者快速掌握这一强大工具。

weixin_29056701的博客 312

kotlin 实战之面向对象特性全方位总结,面试官6个灵魂拷问

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

2401_84121998的博客 811

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

DPABI安装教程

DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-优快云博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl..

qq_42356925的博客 1万+

Kotlin集合中的元素组合

我不是普通的StackOverflow用户,既不是贡献者,也不是提出问题。 但是,我最近偶然发现了一个问题 ,试图提供帮助...并失败了。 有人指出我的答案是错误的-感谢所有这样做的人。 我认为失败是学习新事物的好时机! 在这篇文章中,我想详细介绍我进一步研究后学到的知识:有几种方法可以将Kotlin stdlib中现有集合中的元素进行组合。 与下一个结合 第一组合功能是将一个...

dlz00001的博客 533

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 508

Kotlin的各种骚气语法

这种操作称为柯里化,其原理就是一个方法调用后又返回了一个方法,然后调用这个返回值后又返回了一个方法,也属于高阶函数。返回了 ()->方法 , 而这个方法的签名是 ()->Unit , 连续调用了三次后获取到最后的Unit返回值。但其实这种是重写的操作符,分别是重写了setter和getter,类似于list[0]=1这样。注意看这两个示例方法的返回值,login2 比 login1的返回值短的多,但其实他们是一样的。于是我们可以通过import并设置别名,这样就可以区分开来了。

lt的博客 1502

CRMEB开源电商系统 /api/products SQL注入漏洞复现(CVE-2024-36837)

2024年6月,CRMEB开源电商系统发布了新补丁,修复了一处SQL注入漏洞(CVE-2024-36837)。经分析,该漏洞可以通过请求api的路径接口来进行SQL注入,进而可能导致敏感信息泄露,该注入可暴露后台web绝对路径,深入利用可获取服务器权限,该漏洞无前置条件且利用简单,建议受影响的用户尽快修复漏洞。

0xSec 2883

C#与大数据分析:如何通过上位机进行设备故障诊断与预测

设备故障诊断是通过对设备的运行状态数据进行分析,识别和确认故障的类型和位置。而设备故障预测则是通过对设备的历史数据和运行状态进行分析,预测设备何时可能出现故障,从而进行预防性维护。数据采集:通过各种传感器、PLC、嵌入式设备等采集设备运行数据,如温度、压力、振动、转速、功率等。数据预处理:对采集到的数据进行清洗、去噪、缺失值处理、标准化等操作,以确保数据质量。特征工程:从原始数据中提取出有助于故障诊断和预测的特征,例如统计特征、时域特征、频域特征等。数据分析与建模。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1061

kotlin使用springboot问题汇总记录【更新中】

kotlin+spring整合问题,逐步添加中

GhostSugar 2357

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

kotlin是一门糟糕的编程语言

kotlin 混合集成

CopyCat 2453

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Kotlin之‘by‘关键字的威力与应用

'by'关键字是Kotlin中实现委托模式的核心工具,它用于委托模式的实现。可以用于接口、属性、自定义委托、Lazy、Observable等。它支持延迟初始化、属性监视、线程安全等特性,同时允许自定义属性委托。这个机制使代码更清晰、模块化,并提供了灵活性和可维护性。

烨之魅儿的专栏 1028

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Kotlin 对委托模式的理解(by关键字的用法)

在Kotlin中,委托模式和代理模式还是有些许不同之处的,代理模式是类似于Retrofit这种库中Retrofit.create的Proxy.newProxyInstance这种写法,分为动态代理和静态代理。而Kotlin还提供了一种简便的代理方法,叫做“委托模式”。 Kotlin中 by关键字 主要有两个用法:一个是委托类,一个是委托属性。

qq_40731846的博客 988

Kotlin 扩展函数的局限与注意点总结

一、扩展方式对扩展函数的影响 Kotlin是一种静态类型语言,我们创建的每个对象不仅具有运行时,还具有编译时类型,开发人员必须明确指定(在Kotlin中可以判断)。在使用扩展函数时,要清楚地了解静态调用和动态调用之间的区别。 1.静态与动态调度 public class Base { public void payfoo() { System.out.printl...

且听真言 1218

代理模式实现方式及优缺点对比

代理模式实现方式及优缺点对比 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理,另外,本文也对这几种代理模式的优缺点进行了对比。 代理,顾名思义,即代替被请求者来处理相关事务。代理对象一般会全权代理被请求者的全部只能,客户访问代理对象就像在访问被请求者一样,虽然代理对象最终还是可能会访问被请求者,但是其可以在请求之前或者请求之后进行一些额外的工作,或者说客户的请求不合法,直接拒绝客户的请求。如下图所示为代理模式的一

weixin_43829047的博客 1887

Kotlin-代理属性(by)

Kotlin-代理属性(by)

转载和创作优秀的博客 773

Kotlin中的代理理解与应用

在 Kotlin 编程的领域中,存在着一个被称为代理(Delegates)的隐藏宝藏。那么什么是Kotlin中的代理?如何实现呢?Kotlin 赋予了我们创建自定义代理的能力,可以根据我们的愿望塑造属性行为println(person.name) // 名字被转化了:JOHN FLK在这段代码片段中,打造了一个名为 UpperCaseDelegate 的代理。这个代理为分配的值添加了大写形式,无论是在检索还是设置属性时。

金戈鐡馬 428

吐槽kotlin之垃圾设计

本文重点在于吐槽垃圾设计,全是缺点,不说优点。

weixin_43328357的博客 927

Kotlin -by 详解

Kotlin 中 by 关键字用来简化实现代理 (委托) 模式,不仅可以类代理,还可以代理类属性, 监听属性变化,下面我们来介绍by的几种主要使用场景: 类的代理 class 属性延迟加载 lazy 可观察属性 Delegates.observable ( 扩展 Delegates.vetoable ) 自定义监听属性变化 ReadWriteProperty 属性非空强校验 Delegates...

wzgiceman 2万+
上一篇: Handler 相关知识,面试必问
下一篇: 解密Kotlin 1.6.20 新功能 Context Receivers
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值