1.matlab curvelet变换像去噪【详细解析 参考源码】
2.Kotlin差异化分析,let,run,with,apply及also
3.如何打开后缀为.LET文件,有没有什么工具之类!影视源码缓存功能!谢谢
4.javaä¸JSPåServletçåºå«ï¼
5.hdl_graph_slam|后端优化|hdl_graph_slam_nodelet.cpp|源码解读(四)
6.七爪源码:JavaScript 中的 var、let 和 const 有什么区别?
matlab curvelet变换像去噪【详细解析 参考源码】
简介
引入曲线let变换的背景及目标
详细阐述曲线let变换的提出背景与研究进展,当前状态概述
深入分析第一代曲线let变换,解释其原理与特性
具体介绍曲线let变换实现步骤,包含关键算法与操作细节
探讨第二代曲线let变换,比较与第一代的差异与改进
解释连续曲线let变换的概念与应用,包括其数学描述
论述离散曲线let变换,探讨其在图像处理中的具体实现
源代码
提供曲线let变换相关代码,包括算法实现与调用示例
参考图
展示曲线let变换在图像去噪中的效果示例,包含前后对比图
Kotlin差异化分析,let,run,with,apply及also
作用域函数是Kotlin中一种重要的特性,包括let、run、with、apply以及also,这五个函数在执行方式上有相似之处,但各自存在差异。掌握这些函数的不同之处,有助于在不同场景下更好地运用它们。面相程序源码本文将介绍:
Kotlin的作用域函数
在Kotlin标准库中,存在一些函数,其唯一目的就是在对象的上下文中执行代码块。当对一个对象调用此类函数并传入一个lambda表达式时,会形成一个临时作用域。在这个作用域内,可以访问该对象,而无需使用其名称。这些函数被称为作用域函数。
作用域函数的主要目的是为了方便对对象进行访问和操作,例如进行空检查、修改属性或直接返回值等。以下是对作用域函数的详细说明。
2.1 let
let函数是参数化类型T的扩展函数,在let块内可以使用it来指代该对象。返回值为let块的最后一行或指定的return表达式。
以Book对象为例,假设其包含name和price属性,如下:
在这个案例中,我们对Book对象使用let作用域函数,并在函数块的最后添加了字符串代码,打印出对象。可以看到,最后控制台输出的结果为字符串“This book is 《计算机网络》”。这是由于let函数的特性导致的,因为在Kotlin中,如果let块中的最后一条语句是非赋值语句,则默认情况下它是iapp源码gps返回语句。
如果将let块中最后一条语句修改为赋值语句,会发生什么变化?
将Book对象的name值进行赋值操作,打印对象,但最后控制台的输出结果为“kotlin.Unit”。这是因为let函数块的最后一句是赋值语句,print将其当作一个函数看待。
这是let角色设定的第一点:1️⃣
关于let的第二点:2️⃣
要对非空对象执行操作,可以使用安全调用操作符?.并调用let在lambda表达式中执行操作。如下案例:
设置name为一个可空字符串,利用name?.let进行空判断,只有当name不为空时,逻辑才能进入let函数块中。在这里,我们可能还看不出来let空判断的优势,但当有大量name属性需要编写时,就能发现let的快速和简洁。
关于这一点,官方教程给出了一个案例,直接使用:
目的是获取数组列表中长度大于3的值。因为必须打印结果,所以将结果存储在一个单独的变量中,然后打印它。但使用“let”操作符,可以将代码修改为:
使用let后,可以直接对数组列表中长度大于3的值进行打印,去掉了变量赋值这一步。
另外,let函数还存在一个特点。驾照网页源码
关于这一点,let的第四点:4️⃣
let是通过使用“It”关键字来引用对象的上下文,因此,这个“It”可以被重命名为一个可读的lambda参数,如下将it重命名为book:
2.2 run
run函数以“this”作为上下文对象,调用方式与let一致。
关于run的第一点:1️⃣当lambda表达式中同时包含对象初始化和返回值的计算时,run更适合。
这句话的意思是,如果不使用run函数,相同功能下的代码会怎样?来看一看:
输出结果还是一样的,但run函数所带来的代码简洁程度已经显而易见。
除此之外,让我们来看看run函数的其他优点:
通过查看源码,了解到run函数存在两种声明方式,
1、与let一样,run是作为T的扩展函数;
2、第二个run的声明方式则不同,它不是扩展函数,并且块中也没有输入值,因此,它不是用于传递对象并更改属性的类型,而是可以使你在需要表达式的地方就可以执行一个语句。
如下利用run函数块执行方法,而不是作为一个扩展函数:
2.3 with
with属于非扩展函数,直接输入一个对象receiver,当输入receiver后,源码翻译中文便可以更改receiver的属性,同时,它也与run做着同样的事情。
提供一个案例说明:
以上面为例,with(T)类型传入了一个参数book,则可以在with的代码块中访问book的name和price属性,并做更改。
with使用的是非null的对象,当函数块中不需要返回值时,可以使用with。
2.4 apply
apply是T的扩展函数,与run函数有些相似,它将对象的上下文引用为“this”而不是“it”,并提供空安全检查。不同的是,apply不接受函数块中的返回值,返回的是自己的T类型对象。
前面看到的let、with和run函数返回的值都是R。但是,apply和下面查看的also返回T。例如,在let中,没有在函数块中返回的值,最终会成为Unit类型,但在apply中,最后返回对象本身(T)时,它成为Book类型。
apply函数主要用于初始化或更改对象,因为它用于在不使用对象的函数的情况下返回自身。
2.5 also
also是T的扩展函数,返回值与apply一致,直接返回T。also函数的用法类似于let函数,将对象的上下文引用为“it”而不是“this”以及提供空安全检查方面。
因为T作为block函数的输入,可以使用also来访问属性。所以,在不使用或不改变对象属性的情况下也使用also。
3.1 let & run
3.2 with & run
with和run其实做的是同一种事情,对上下文对象都称之为“this”,但他们又存在着不同,我们来看看案例。
先使用with函数:
我们创建了一个可空对象book,利用with函数对book对象的属性进行了修改。代码很直观,那么我们接着将with替换为run,代码更改为:
首先run函数的调用省略了this引用,在外层就进行了空安全检查,只有非空时才能进入函数块内对book进行操作。
3.3 apply & let
何时应该使用apply、with、let、also和run?总结
以上便是Kotlin作用域函数的作用以及使用场景。在Android实际开发中,5种函数的使用频率非常高。在使用过程中发现,当代码逻辑较少时,作用域函数能带来代码的简洁性和可读性,但逻辑复杂时,使用不同的函数,多次叠加会降低可读性。这就要我们区分它们各自的特点,以便在适合且复杂的场景下去使用它们。
最后,我整理了一些Kotlin Android相关的学习文档和面试题,希望能帮助大家学习提升。如有需要参考的,可以直接私信“1”找我参考。
如何打开后缀为.LET文件,有没有什么工具之类!!谢谢
一些罕见后缀名的文件,%是人家加密的文件类型。
所以,你根本无法打开,即使打开,也无意义。
就比如说我用VB编写了一个小软件,你可以打开我编译的程序,但是,我把未编译前的文件发给你,比如说VBP,VBW,你除了用专用的软件打开,别无它法。。如果你用其它工具都可以打开,那我的程序源码你都可以编辑了。
javaä¸JSPåServletçåºå«ï¼
ä¸. Servletæ¯ä»ä¹?
客æ·æº/æå¡å¨è®¡ç®çåå±ãJavaæä¾äºä¸æ´å¥å®¢æ·æº/æå¡å¨è§£å³æ¹æ¡ï¼å¨è¿ä¸ªæ¹æ¡ä¸ï¼ç¨åºå¯ä»¥èªå¨å°ä¸è½½å°å®¢æ·ç«¯å¹¶æ§è¡ï¼è¿å°±æ¯appletãä½æ¯å®ä» ä» æ¯é®é¢çä¸åãé®é¢çå¦ä¸åå°±æ¯Servletã
servletå¯ä»¥è¢«è®¤ä¸ºæ¯æå¡å¨ç«¯çappletãservlet被Webæå¡å¨å è½½åæ§è¡ï¼å°±å¦åapplet被æµè§å¨å è½½åæ§è¡ä¸æ ·ãservletä»å®¢æ·ç«¯(éè¿Webæå¡å¨)æ¥æ¶è¯·æ±ï¼æ§è¡æç§ä½ä¸ï¼ç¶åè¿åç»æã使ç¨servletçåºæ¬æµç¨å¦ä¸ï¼
·客æ·ç«¯éè¿HTTPæåºè¯·æ±.
·Webæå¡å¨æ¥æ¶è¯¥è¯·æ±å¹¶å°å ¶åç»servletãå¦æè¿ä¸ªservletå°æªè¢«å è½½ï¼Webæå¡å¨å°æå®å è½½å°Javaèææºå¹¶ä¸æ§è¡å®ã
·servletå°æ¥æ¶è¯¥HTTP请æ±å¹¶æ§è¡æç§å¤çã
·servletå°åWebæå¡å¨è¿ååºçã
·Webæå¡å¨å°ä»servletæ¶å°çåºçåéç»å®¢æ·ç«¯ã
ç±äºservletæ¯å¨æå¡å¨ä¸æ§è¡ï¼é常ä¸appletç¸å ³çå®å ¨æ§çé®é¢å¹¶ä¸éå®ç°ãè¦æ³¨æçæ¯Webæµè§å¨å¹¶ä¸ç´æ¥åservletéä¿¡ï¼servletæ¯ç±Webæå¡å¨å è½½åæ§è¡çã
èservletæ¯ç¨Javaç¼åçï¼æ以å®ä»¬ä¸å¼å§å°±æ¯å¹³å°æ å ³çãè¿æ ·ï¼Javaç¼åä¸æ¬¡å°±å¯ä»¥å¨ä»»ä½å¹³å°è¿è¡(write once,run anywhere)çæ¿è¯ºå°±åæ ·å¯ä»¥å¨æå¡å¨ä¸å®ç°äºãservletè¿æä¸äºCGIèæ¬æä¸å ·å¤çç¬ç¹ä¼ç¹ï¼ (æ¬äººå¯¹CGI并ä¸æ¯ååäºè§£ï¼æ以è¿äºç¹ç¹ä¸è½å®å ¨çä½ä¼å°ï¼è¿ä¹æ¯æèªè®ºåçè´´åï¼è¯·è§è° )
servletæ¯æä¹ çãservletåªéWebæå¡å¨å è½½ä¸æ¬¡ï¼èä¸å¯ä»¥å¨ä¸å请æ±ä¹é´ä¿ææå¡(ä¾å¦ä¸æ¬¡æ°æ®åºè¿æ¥)ãä¸ä¹ç¸åï¼CGIèæ¬æ¯çæçãç¬æçãæ¯ä¸æ¬¡å¯¹CGIèæ¬ç请æ±ï¼é½ä¼ä½¿Webæå¡å¨å 载并æ§è¡è¯¥èæ¬ãä¸æ¦è¿ä¸ªCGIèæ¬è¿è¡ç»æï¼å®å°±ä¼è¢«ä»å åä¸æ¸ é¤ï¼ç¶åå°ç»æè¿åå°å®¢æ·ç«¯ãCGIèæ¬çæ¯ä¸æ¬¡ä½¿ç¨ï¼é½ä¼é æç¨åºåå§åè¿ç¨(ä¾å¦è¿æ¥æ°æ®åº)çéå¤æ§è¡ã
servletæ¯ä¸å¹³å°æ å ³çãå¦åæè¿°ï¼servletæ¯ç¨Javaç¼åçï¼å®èªç¶ä¹ç»§æ¿äºJavaçå¹³å°æ å ³æ§ã
servletæ¯å¯æ©å±çãç±äºservletæ¯ç¨Javaç¼åçï¼å®å°±å ·å¤äºJavaæè½å¸¦æ¥çææä¼ç¹ãJavaæ¯å¥å£®çãé¢å对象çç¼ç¨è¯è¨ï¼å®å¾å®¹ææ©å±ä»¥éåºä½ çéæ±ãservletèªç¶ä¹å ·å¤äºè¿äºç¹å¾ã
servletæ¯å®å ¨çãä»å¤çè°ç¨ä¸ä¸ªservletçæä¸æ¹æ³å°±æ¯éè¿Webæå¡å¨ãè¿æä¾äºé«æ°´å¹³çå®å ¨æ§ä¿éï¼å°¤å ¶æ¯å¨ä½ çWebæå¡å¨æé²ç«å¢ä¿æ¤çæ¶åã
ãã setvletå¯ä»¥å¨å¤ç§å¤æ ·ç客æ·æºä¸ä½¿ç¨ãç±äºservletæ¯ç¨Javaç¼åçï¼æä»¥ä½ å¯ä»¥å¾æ¹ä¾¿å°å¨HTMLä¸ä½¿ç¨å®ä»¬ï¼å°±åä½ ä½¿ç¨appletä¸æ ·ã
é£ä¹ï¼Servletæ¯ææ ·æ§è¡çï¼ææ ·æ¥åä¸ä¸ªServlet,å®çåºæ¬æ¶ææ¯æä¹æ ·çï¼
è¿äºé®é¢ï¼å°å¨åé¢é¨åç»äºä»ç»ã
äº.JSPä¸Servlet
ç°å¨å·²ç»å¯¹Servletæäºå¤§æ¦çäºè§£ï¼ç°å¨æ们就æ¥è¯´è¯´JSPåServletçå ³ç³»ã
JSPæ¯ä¸ç§èæ¬è¯è¨ï¼å è£ äºJava Servletç³»ç»ççé¢ï¼ç®åäºJavaåServletç使ç¨é¾åº¦ï¼åæ¶éè¿æ©å±JSPæ ç¾(TAG)æä¾äºç½é¡µå¨ææ§è¡çè½åã尽管å¦æ¤ï¼JSPä»æ²¡æè¶ åºJavaåServletçèå´ï¼ä¸ä» JSP页é¢ä¸å¯ä»¥ç´æ¥åJava代ç ï¼èä¸JSPæ¯å 被è¯æServletä¹åæå®é è¿è¡çãJSPå¨æå¡å¨ä¸æ§è¡ï¼å¹¶å°æ§è¡ç»æè¾åºå°å®¢æ·ç«¯æµè§å¨ï¼æ们å¯ä»¥è¯´åºæ¬ä¸ä¸æµè§å¨æ å ³ãå®æ¯ä¸JavaScriptä¸åçï¼JavaScriptæ¯å¨å®¢æ·ç«¯çèæ¬è¯è¨ï¼å¨å®¢æ·ç«¯æ§è¡ï¼ä¸æå¡å¨æ å ³ã é£ä¹JSPæ¯ä»ä¹ï¼å°±æ¯Servlet.
JSPä¸Servletä¹é´ç主è¦å·®å¼å¨äºï¼JSPæä¾äºä¸å¥ç®åçæ ç¾ï¼åHTMLèåçæ¯è¾å¥½ï¼å¯ä»¥ä½¿ä¸äºè§£Servletç人å¯ä»¥ååºå¨æç½é¡µæ¥ã对äºJavaè¯è¨ä¸çæç人(æ¯å¦åæ),ä¼è§å¾JSPå¼åæ¯è¾æ¹ä¾¿ãJSPä¿®æ¹åå¯ä»¥ç«å³çå°ç»æï¼ä¸éè¦æå·¥ç¼è¯ï¼JSPå¼æä¼æ¥åè¿äºå·¥ä½ï¼èServelt缺éè¦ç¼è¯ï¼éæ°å¯å¨Servletå¼æçä¸ç³»åå¨ä½ãä½æ¯å¨JSPä¸ï¼HTMLä¸ç¨åºä»£ç æ··æå¨ä¸èµ·ï¼èServletå´ä¸æ¯è¿æ ·ãä¹è®¸å¤§å®¶æ¯è¾æ··ä¹±äºï¼é£ä¹Servletåæ¯ä»ä¹ï¼ä¸é¢æ们对JSPçè¿è¡æ¥åä¸ä¸ªç®åçä»ç»ï¼åè¯å¤§å®¶ææ ·æ¥æ§è¡ä¸ä¸ªJSPæ件ï¼
å½Webæå¡å¨(æServletå¼æ,åºç¨æå¡å¨)æ¯æJSPå¼ææ¶ï¼JSPå¼æä¼ç §çJSPçè¯æ³ï¼å°JSPæ件转æ¢æServlet代ç æºæ件ï¼æ¥çServletä¼è¢«ç¼è¯æJavaå¯æ§è¡åèç (bytecode)ï¼å¹¶ä»¥ä¸è¬çServletæ¹å¼è½½å ¥æ§è¡
JSPè¯æ³ç®åï¼å¯ä»¥æ¹ä¾¿çåµå ¥HTMLä¹ä¸ï¼å¾å®¹æå å ¥å¨æçé¨åï¼æ¹ä¾¿çè¾åºHTMLãå¨Servletä¸è¾åºHTML缺éè¦è°ç¨ç¹å®çæ¹æ³ï¼å¯¹äºå¼å·ä¹ç±»çå符ä¹è¦åç¹æ®çå¤çï¼å å¨å¤æçHTML页é¢ä¸ä½ä¸ºå¨æé¨åï¼æ¯èµ·JSPæ¥è¯´æ¯æ¯è¾å°é¾çã
é¤å»äºè½¬æ¢åç¼è¯é¶æ®µï¼JSPåServletä¹é´çåºå«å®å¨æ¯ä¸å¤§ã
JSPå¼æé常æ¶æå¨Servletå¼æä¹ä¸ï¼æ¬èº«å°±æ¯ä¸ä¸ªServletï¼æJSPæ件转è¯æServletæºä»£ç ï¼åè°ç¨Javaç¼è¯å¨ï¼ç¼è¯æServletãè¿ä¹æ¯JSPå¨ç¬¬ä¸æ¬¡è°ç¨æ¶é度æ¯è¾æ ¢çåå ï¼å¨ç¬¬ä¸æ¬¡ç¼è¯ä¹åï¼JSPä¸Servleté度ç¸å.ä¸é¢æ们æ¥çç为ä»ä¹ä»ä»¬å¨ç¬¬ä¸æ¬¡ç¼è¯ååç¼è¯çé度ç¸åï¼
å¨æ´ä¸ªè¿è¡è¿ç¨ä¸ï¼JSPå¼æä¼æ£æ¥ç¼è¯å¥½çJSP(以Servletå½¢å¼åå¨)æ¯å¦æ¯åå§çJSPæ件è¿æ°ï¼å¦ææ¯ï¼JSPå¼æä¸ä¼ç¼è¯;å¦æä¸æ¯ï¼è¡¨ç¤ºJSPæ件æ¯è¾æ°ï¼å°±ä¼éæ°æ§è¡è½¬è¯ä¸ç¼è¯çè¿ç¨ã
为äºæ个深å»çäºè§£ï¼æ们çä¸ä¸JSPçè¿è¡åå¼åç¯å¢:
æµè§å¨ï¼å¸¸è§çæµè§å¨æIEåNetscape两ç§ã
æ°æ®åºï¼å¸¸ç¨çæ°æ®åºæOracle,SQL Server,Informix,DB2,Sybase,Access,MySQLçã
æä½ç³»ç»ï¼å¸¸è§çæWindows,Linux,以ååç§Unixç³»ç»ã
Webæå¡å¨ï¼å¸¸è§çæIIS,Apache,Netscape Enterprise Serverçã
JSPå¼æï¼ä¸è¬JSPå¼æé½ä»¥Servletå¼æ为åºç¡ï¼å¹¶ä»¥Servletçå½¢å¼åºç°ãåæ¶ï¼å¨åç§å è´¹ååä¸å¼æçå®ç°ä¸ï¼Servletå¼æåJspå¼æé常ä¹æ¯ä¸èµ·åºç°ï¼æ们æ为Servlet/JSPå¼æï¼æä»æç§æ为JSPå¼æã
JSPå¼ææ¯å¯ä»¥æä¾JSPåServletè¿è¡æ¯æå¹¶å¯¹å ¶çåå¨æè¿è¡ç®¡ççç³»ç»çº§å®ä½ã
å¨JSP页é¢ç¬¬ä¸æ¬¡è¢«è¯·æ±æ¶ï¼JSPå¼æä¼å°JSPåå§æ件转æ¢æServletæºä»£ç ï¼ç¶åè°ç¨Javaç¼è¯å¨ï¼ç¼è¯æServlet,并å¨Servletå¼æä¸æ§è¡ãå½å次æ请æ±çæ¶åï¼JSPå¼æä¼è§å·®å¼ç¼è¯å¥½çJSPæ¯å¦æ¯åæ¥çJSPåå§æ件è¦æ°ï¼å¦ææ¯,è¿è¡Servletï¼å¦æä¸æ¯ï¼è¡¨ç¤ºæ件已ç»æ´æ°çäºï¼å°±ä¼ä»æ°æ§è¡è½¬æ¢åç¼è¯çè¿ç¨ã
说å°è¿éï¼ä¹åºæ¬æJSPåServletçå ³ç³»è¯´æ¸ æ¥äºï¼ä»æçæè§ä¸çç¨JSPå°±å¯ä»¥äºï¼ç®ååæ¹ä¾¿ï¼åå¯ä»¥åBean å¾å¥½çå ¼å®¹ä½¿ç¨ï¼åè½åå¾å¼ºå¤§ï¼ä¸ºä»ä¹ååºç°äºServlet,å®åæä»ä¹ç¨ï¼ä½åµå®çç¼ååç¸å¯¹å¤æã为äºæé®é¢è¯´å¾æ´æ¸ æ¥ä¸ç¹ï¼ææ³å¨è¿é说ä¸ä¸åå²ï¼é¡ºä¾¿å讲ä¸ä¸ä¸ºä»ä¹è¿è¦ç¨Servletï¼Servletç好å¤æ¯ä»ä¹ã
åå²ç®è¿°ï¼ï¼æèªæ论åæå èï¼æ¹åï¼
ç®åç说ï¼SUNé¦å åå±åºSERVLETï¼å ¶åè½æ¯è¾å¼ºå²ï¼ä½ç³»è®¾è®¡ä¹å¾å è¿ï¼åªæ¯ï¼å®è¾åºHTMLè¯å¥è¿æ¯éç¨äºèçCGIæ¹å¼ï¼æ¯ä¸å¥ä¸å¥è¾åºï¼æ以ï¼ç¼ååä¿®æ¹HTMLé常ä¸æ¹ä¾¿ã
åæ¥SUNæ¨åºäºç±»ä¼¼äºASPçé¶åµåçJSPï¼æ¯Servletåå±ç产ç©ï¼ï¼æJSP TAGé¶åµå°HTMLè¯å¥ä¸ï¼è¿æ ·ï¼å°±å¤§å¤§ç®ååæ¹ä¾¿äºç½é¡µç设计åä¿®æ¹ãæ°åçç½ç»è¯è¨å¦ASPï¼PHPï¼JSPé½æ¯é¶åµåçSCRIPTè¯è¨ã
ä»ç½ç»ä¸å±ç»æçè§åº¦çï¼ä¸ä¸ªç½ç»é¡¹ç®æå°åä¸å±ï¼data layer,business layer, presentation layerãå½ç¶ä¹å¯ä»¥æ´å¤æãSERVLETç¨æ¥åbusiness layeræ¯å¾å¼ºå¤§çï¼ä½æ¯å¯¹äºåpresentation layerå°±å¾ä¸æ¹ä¾¿ãJSPå主è¦æ¯ä¸ºäºæ¹ä¾¿åpresentation layerè设计çãå½ç¶ä¹å¯ä»¥åbusiness layerãåæ¯äºASPï¼PHPï¼CGIçæåï¼ç»å¸¸ä¼ä¸èªè§çæpresentation layeråbusiness layeræ··å¨ä¸èµ·ãææ°æ®åºå¤çä¿¡æ¯æ¾å°JSPä¸ï¼å ¶å®ï¼å®åºè¯¥æ¾å¨business layerä¸ã
æ ¹æ®SUNèªå·±çæ¨èï¼JSPä¸åºè¯¥ä» ä» åæ¾ä¸presentation layeræå ³çå 容ï¼ä¹å°±æ¯è¯´ï¼åªæ¾è¾åºHTMLç½é¡µçé¨ä»½ãèææçæ°æ®è®¡ç®ï¼æ°æ®åæï¼æ°æ®åºèç»å¤çï¼ç»ç»æ¯å±äºbusiness layerï¼åºè¯¥æ¾å¨JAVA BEANSä¸ãéè¿JSPè°ç¨JAVA BEANSï¼å®ç°ä¸¤å±çæ´åã
å®é ä¸ï¼å¾®è½¯æ¨åºçDNAææ¯ï¼ç®å说ï¼å°±æ¯ASP+COM/DCOMææ¯ãä¸JSP+BEANSå®å ¨ç±»ä¼¼ï¼ææçpresentation layerç±ASPå®æï¼ææçbusiness layerç±COM/DCOMå®æãéè¿è°ç¨ï¼å®ç°æ´åãç°å¨å¾®è½¯æ¨åºç.NETä¹æ¯éè¿è¿ä¸ªç念ï¼ææçpresentation layerç±ASP.NETå®æï¼business layerç±C#æVB.NETæVC.NETæ¥å®æã
为ä»ä¹è¦éç¨è¿äºç»ä»¶ææ¯å¢ï¼å 为å纯çASP/JSPè¯è¨æ¯é常ä½æçæ§è¡çï¼å¦æåºç°å¤§éç¨æ·ç¹å»ï¼çº¯SCRIPTè¯è¨å¾å¿«å°±å°è¾¾äºä»çåè½ä¸éï¼èç»ä»¶ææ¯å°±è½å¤§å¹ 度æé«åè½ä¸éï¼å å¿«æ§è¡é度ã
å¦å¤ä¸æ¹é¢ï¼çº¯SCRIPTè¯è¨å°presentation layeråbusiness layeræ··å¨ä¸èµ·ï¼é æä¿®æ¹ä¸æ¹ä¾¿ï¼å¹¶ä¸ä»£ç ä¸è½éå¤å©ç¨ãå¦ææ³ä¿®æ¹ä¸ä¸ªå°æ¹ï¼ç»å¸¸ä¼çµæ¶å°åå 页CODEï¼éç¨ç»ä»¶ææ¯å°±åªæ¹ç»ä»¶å°±å¯ä»¥äºã
综ä¸æè¿°ï¼SERVLETæ¯ä¸ä¸ªæ©æçä¸å®åç产åï¼åbusiness layerå¾å¥½ï¼åpresentation layerå°±å¾ä¸å¥½ï¼å¹¶ä¸ä¸¤å±æ··æï¼æ¾å¾ååæ··ä¹±ã
æ以ï¼æ¨åºJSP+BAENï¼ç¨JSPåpresentation layer,ç¨BAENåbusiness layerãSUNèªå·±çææä¹æ¯å°æ¥ç¨JSPæ¿ä»£SERVLETã
çäºä¸é¢çåè¿°ï¼å¤§å®¶å¯è½å¯¹JSPä¸Servletå ±åæäºæ¯è¾å¥½ç认è¯ãå¯ä»¥çå°JSPåBeanç»ååççå®ç¨æ§ï¼å¼ºå¤§ç表ç°åè½ï¼æç¨æ§é½æ¯Servletæä¸è½åçãé£ä¹æ¯ä¸æ¯Servlet就被å代äºï¼ä¸æ¯ï¼å¨ä»¥åçåå±ä¸ï¼å®è¿æ¯æç巨大çä½ç¨çãä¸é¢åªä¸è¿æ¯å°äºé®é¢çä¸æ¹é¢ï¼ä¸é¢æ们æ¥ççServletæ¬èº«çç¹ç¹ã
ç±äºå®æ¯ç±javaæ¥åçï¼æ以ç¸å ³çç¹ç¹æ们就ä¸è¯´äºï¼ä¸æå·²ç»æäºè¯¦ç»çä»ç»ï¼æ们æ¥ççå ¶ä»çï¼
Servletæ¯ç¨äºå¼åæå¡å¨ç«¯åºç¨ç¨åºçä¸ç§ç¼ç¨æ¨¡åï¼å¦æåªæ¯ä¸ä¸ªæ®éçjavaåºç¨ï¼å¯ä»¥ä¸ä½¿ç¨servletæ¥ç¼åï¼ä½æ¯å¦ææ³è¦æä¾åºäºwebçæå¡è½åï¼é£ä¹å°±å¿ é¡»æç §è¿ç§æ¨¡åæ¥ç¼åï¼èä¸servletä¹å¿ é¡»å 许å¨ç¬¦åservletè§èçjava web server or app serverä¹ä¸ï¼å¦åæ æ³è¿è¡ãé¤éä½ èªå·±å®ç°ä¸ä¸ªweb server,ä½æ¯å ¶å¤æ度æ¯æ¯è¾é«çï¼ç¹å«æ¯å¨ä¼ä¸çº§åºç¨ä¸ï¼å¯¹ç³»ç»ç稳å®æ§åå¥å£®æ§é½è¦æ±æ¯è¾é«ï¼æ以servletç模åå®é ä¸æ¯ç®åäºç¼å稳å¥çæå¡å¨ç«¯çåºç¨å¼åè¿ç¨ãServlet å¯ä»¥ä½ä¸ºæä¾webæå¡è½åçä¸ä¸ªæ¥å ¥æ¹å¼
ç°å¨ä¹è®¸å¯ä»¥ç解äºä»ä¹æ¯Servletä»ä¹æ¯JSPï¼å®ä»¬ä¹é´çå ³ç³»æ¯ææ ·çã
hdl_graph_slam|后端优化|hdl_graph_slam_nodelet.cpp|源码解读(四)
hdl_graph_slam源码解读(八):后端优化后端概率图构建核心:hdl_graph_slam_nodelet.cpp
整体介绍 这是整个系统建图的核心,综合所有信息进行优化。所有的信息都会发送到这个节点并加入概率图中。 包含信息 1)前端里程计传入的位姿和点云 2)gps信息 3)Imu信息 4)平面拟合的参数信息 处理信息步骤 1)在对应的callback函数中接收信息,并放入相应的队列 2)根据时间戳对队列中的信息进行顺序处理,加入概率图 其他内容 1)执行图优化,这是一个定时执行的函数,闭环检测也在这个函数里 2)生成全局地图并定时发送,即把所有关键帧拼一起,得到全局点云地图,然后在一个定时函数里发送到rviz上去 3)在rviz中显示顶点和边,如果运行程序,会看到rviz中把概率图可视化了 关键帧同步与优化 cloud_callback cloud_callback(const nav_msgs::OdometryConstPtr& odom_msg,const sensor_msgs::PointCloud2::ConstPtr& cloud_msg) 该函数主要是odom信息与cloud信息的同步,同步之后检查关键帧是否更新。 关键帧判断:这里主要看关键帧设置的这两个阈值keyframe_delta_trans、keyframe_delta_angle 变成关键帧的要求就是:/hdl_graph_slam/include/hdl_graph_slam/keyframe_updater.hpp 优化函数 optimization_timer_callback(const ros::TimerEvent& event) 函数功能:将所有的位姿放在posegraph中开始优化 loop detection 函数:主要就是将当前帧和历史帧遍历,寻找loop。 闭环匹配与信息矩阵计算 匹配与闭环检测 潜在闭环完成匹配(matching 函数) 不同loop的信息矩阵计算(hdl_graph_slam/information_matrix_calculator.cpp) gps对应的信息矩阵 hdl_graph_slam/graph_slam.cpp 添加地面约束 使用add_se3_plane_edge函数的代码 执行图优化 优化函数optimization_timer_callback 执行图优化,闭环检测检测闭环并加到了概率图中,优化前 生成简化版关键帧,KeyFrameSnapshot用于地图拼接 生成地图并定时发送 生成地图:简化版关键帧拼接 定时发送:src/hdl_graph_slam_nodelet.cpp文件中 系统性能与扩展性 hdl_graph_slam性能问题在于帧间匹配和闭环检测精度不足,系统代码设计好,模块化强,易于扩展多传感器数据融合。 总结 hdl_graph_slam后端优化是关键,涉及大量信息融合与概率图构建。系统设计清晰,扩展性强,但在性能上需改进。七爪源码:JavaScript 中的 var、let 和 const 有什么区别?
在 JavaScript 中,var、let 和 const 用于声明变量,但它们之间存在一些关键的区别。
首先,var 变量的作用域是全局的,意味着在整个窗口中都可以访问到由 var 定义的变量,即使在函数外部声明。在函数内部声明的 var 变量则仅在该函数内可用。
其次,let 通过引入改进解决了 var 的问题。它不允许重新声明同一变量,从而减少了潜在的编程错误。let 定义的变量仅在包含它们的块内可用,确保了变量的作用域更为明确。
再者,let 的值可以更新,但不能重新声明。这为开发者提供了更严格的作用域控制,同时也使得变量在声明后不易被意外改变。通过使用 let,可以避免在不同的作用域中定义相同变量的情况。
相比之下,const 定义的变量保持不变的值,既不能更新也不能重新声明。这使得 const 变量在声明时必须初始化,并确保了变量的值在声明后保持不变。const 变量同样具有块级作用域,仅在其声明的块内可用。
此外,const 不仅可以声明变量,还可以用于声明对象。在这种情况下,const 对象本身不可更新,但其属性可以更新,这为对象提供了一种安全且灵活的引用方式。
最后,值得一提的是,var 和 let 在不初始化的情况下声明变量是允许的,而 const 必须在声明时初始化。这反映了 const 对于值安全性的更高要求。
综上所述,var、let 和 const 在 JavaScript 中提供了不同的变量声明方式,每种方式都有其独特的优势和限制。选择正确的声明方式可以帮助开发者编写更安全、更易于维护的代码。