在IT行业中,SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议,它允许用户在不安全的网络环境中安全地传输文件。SFTP是SSH(Secure Shell)的一部分,提供了加密的网络通信,确保数据在传输过程中的安全性。本实例源码是基于Java实现的SFTP客户端,用于连接到支持SFTP的服务器并执行文件操作,如上传、下载和管理文件。 Java作为一种广泛使用的编程语言,拥有丰富的库和工具支持各种网络通信,包括SFTP。在Java中实现SFTP功能,通常会使用JSch库,这是一个Java实现的SSH2库,提供了解析、建立和维护SSH2连接的能力,包括SFTP子系统。 以下是一些关键的Java SFTP知识点: 1. **JSch库**:JSch是Java中实现SFTP的主要库,它允许开发者创建SSH连接,进行身份验证,并通过SFTP通道执行文件操作。安装JSch库后,可以导入其对应的jar文件到项目中,例如`jsch-0.1.55.jar`。 2. **连接SFTP服务器**:使用JSch,首先需要创建一个`JSch`对象,然后通过`Session`类建立到SFTP服务器的连接。这通常涉及设置主机名、端口、用户名和密码(或私钥)。 3. **身份验证**:JSch支持多种身份验证方式,包括密码认证、公钥认证(RSA/DSA/ECDSA等)。密码认证直接提供用户名和密码,而公钥认证则需要提供私钥文件路径和对应密码(如果设置了密码保护)。 4. **建立SFTP会话**:成功连接后,需要通过`Session`对象的`openChannel("sftp")`方法开启一个SFTP会话。这个会话对象代表了一个SFTP通道,可以进行文件操作。 5. **文件操作**:SFTP会话对象是一个`ChannelSftp`实例,提供了丰富的API进行文件操作,如`cd`改变目录,`ls`列出目录,`put`上传文件,`get`下载文件,`rm`删除文件,`mkdir`创建目录,`chmod`改变文件权限等。 6. **错误处理与资源关闭**:在进行SFTP操作时,需要注意异常处理,确保在网络问题、权限错误或其他异常情况下能正确关闭连接。同时,使用完`ChannelSftp`和`Session`对象后,应调用`disconnect()`方法断开连接。 7. **代码示例**:在提供的源码中,很可能包含了建立连接、身份验证、打开SFTP通道、进行文件操作和关闭连接的完整流程。通过阅读和学习这些源码,你可以更深入地理解如何在Java中实现SFTP功能。 8. **应用领域**:Java实现的SFTP客户端适用于各种需要安全传输文件的场景,比如自动化部署、日志备份、数据同步等。由于Java的跨平台特性,这样的解决方案可以在Windows、Linux、Mac等多个操作系统上运行。 基于Java的SFTP代码实例可以帮助开发者更好地理解和运用SFTP协议,通过JSch库实现安全的文件传输功能。通过学习和实践这些源码,你可以提升自己的Java网络编程技能,为你的项目添加可靠的数据传输功能。
2025-07-09 18:56:19 61KB Java
1
**简单循环神经网络(Simple RNN)** 循环神经网络(Recurrent Neural Networks,RNNs)是一种人工神经网络,特别适合处理序列数据,如文本、时间序列等。在这个项目中,我们关注的是一个名为 "simple-rnn" 的简单实现,它是用 C++ 编写的,适用于 kylpenfound.com 上的博客文章。通过这个实现,我们可以了解 RNN 的基本工作原理以及如何在实际编程中应用它们。 **RNN 的核心概念** 1. **序列数据处理**:不同于传统的前馈神经网络(Feedforward Neural Networks),RNN 允许信息在时间步之间传递,从而能够捕获序列数据中的长期依赖关系。 2. **隐藏状态**:每个时间步,RNN 会有一个隐藏状态(Hidden State),它不仅取决于当前输入,还取决于上一时间步的隐藏状态。这使得 RNN 能够记住之前的上下文信息。 3. **循环计算**:RNN 的计算是循环进行的,对于每个时间步,都会对输入和隐藏状态执行相同的权重矩阵运算。 4. **门控机制**:虽然标准 RNN 在处理长序列时容易出现梯度消失或爆炸问题,但有改进的变种,如长短期记忆网络(LSTM)和门控循环单元(GRU),通过门控机制解决了这些问题。不过,本项目仅涉及基本的 RNN 模型。 **C++ 实现** 在 C++ 中实现 RNN 需要对矩阵操作、梯度计算和反向传播算法有深入理解。文件列表 "simple-rnn-master" 提示这是一个源代码仓库,可能包含了以下部分: 1. **模型定义**:包含 RNN 的架构,如隐藏层的大小、激活函数(通常为 tanh 或 sigmoid)等。 2. **前向传播**:实现从输入序列到输出序列的计算过程,包括对输入和隐藏状态的线性变换和非线性激活。 3. **反向传播**:计算损失函数关于权重的梯度,用于更新权重。 4. **优化器**:如随机梯度下降(SGD)、动量SGD或者更高级的优化算法如Adam。 5. **训练与预测**:数据预处理、训练过程的迭代、模型保存和加载功能。 **在 kylpenfound.com 博客中的应用** 博客文章可能会介绍以下内容: - RNN 的理论基础 - C++ 实现的细节和代码解析 - 如何将 RNN 应用于文本生成或序列标注任务 - 如何准备训练数据和评估模型性能 - 可能还会讨论实际运行中的挑战和解决方案 通过这个项目,读者不仅可以学习到 RNN 的基本概念,还能掌握 C++ 编程实现深度学习模型的方法。这对于想要深入理解 RNN 工作原理和实践应用的开发者来说是非常有价值的资源。
2025-07-09 17:58:13 6KB
1
在STMicroelectronics(意法半导体)的开发环境中,STVD(ST Visual Develop)是一个常用的集成开发环境,用于编写和调试基于STM8系列微控制器的程序。在这个特定的项目中,我们利用STM8S003这款8位微控制器来生成正弦波。STM8S003是STM8系列中的一个成员,它具有丰富的外设集和低功耗特性,适用于各种嵌入式应用,包括模拟信号的生成。 正弦波的生成主要依赖于PWM(脉宽调制)技术,尤其是SPWM(Sine Pulse Width Modulation),这是一种用矩形脉冲波的宽度来模拟正弦波形的技术。在STM8S003中,我们将使用定时器1的三个通道——通道1、2和3来实现这一功能。定时器1是STM8S003中一个可配置的定时器,它提供了多个输出比较模式,可以用来生成SPWM信号。 我们需要配置定时器1的工作模式,使其能够周期性地重载计数器值,形成基本的PWM周期。然后,我们将设置每个通道的比较值,这些值将决定每个PWM周期内高电平的时间比例,从而控制输出的SPWM波形的幅度。通过调整这些比较值,我们可以改变生成的正弦波频率和幅值。 在STM8S003中,定时器1的每个通道都可以独立配置为PWM输出。为了生成正弦波,我们需要预先计算一系列代表正弦函数的离散值,并将它们映射到比较寄存器。这通常需要一个合适的算法或查找表来实现,确保在有限的内存和处理能力下,得到尽可能精确的正弦波形。 值得注意的是,定时器1的通道1、2、3的输出端口在实际应用中需要外接滤波电路。这是因为SPWM信号本身就是一系列快速切换的矩形波,直接应用可能引入高频噪声。在这里,使用了105电容进行滤波,这是一个常见的电容值,可以有效地滤除高频成分,平滑输出信号,使得最终得到的近似正弦波形更加稳定。 在编程过程中,我们还需要考虑STM8S003的中断机制,以便在定时器溢出或者比较匹配时进行必要的处理,例如更新比较值或触发新的PWM周期。此外,正确设置微控制器的时钟源和预分频器也是至关重要的,它们决定了定时器的工作频率,从而影响到SPWM信号的频率。 通过STVD环境和STM8S003单片机,我们可以实现SPWM技术生成正弦波的功能。这个过程中涉及到寄存器配置、中断处理、数学计算以及硬件接口的设计。对于初学者来说,理解这些知识点并将其应用于实践,不仅可以提升嵌入式系统的编程技能,还能深入理解数字信号处理的基本原理。在STVD项目文件"STM8S_SPWM"中,应该包含了实现这一功能的具体代码和配置,可供学习和参考。
2025-07-09 16:20:50 82KB STM8S003 SPWM
1
:“新浪微博爬虫,用python爬取新浪微博数据” :“此项目是关于如何使用Python编程语言构建一个爬虫,以抓取并分析新浪微博上的数据。爬虫技术在大数据时代对于获取社交媒体信息、进行网络数据分析具有重要意义。通过这个项目,你可以学习到如何利用Python的requests库进行HTTP请求,BeautifulSoup库解析HTML或XML文档,以及可能涉及到的反爬策略处理,如设置headers、使用代理、处理验证码等。” 【正文】: 在Python中,构建微博爬虫是一项常见的任务,它可以帮助我们收集大量的社交媒体数据,用于研究用户行为、热门话题分析、市场趋势预测等。以下是一些关于如何实现这个过程的关键知识点: 1. **Python基础知识**:你需要熟悉Python的基本语法和数据结构,如列表、字典等,这些是编写爬虫的基础。 2. **HTTP协议**:理解HTTP(超文本传输协议)的基本原理,包括GET和POST请求,以及请求头(headers)的概念,这些将用于与服务器交互获取数据。 3. **requests库**:Python中的requests库是进行网络请求的常用工具,可以方便地发送GET和POST请求,处理响应,并支持设置headers、cookies等。 4. **BeautifulSoup库**:解析网页HTML内容时,BeautifulSoup库非常实用。它可以解析HTML和XML文档,通过选择器找到特定元素,提取所需数据。 5. **网络爬虫设计**:设计爬虫的流程通常包括解析URL,发送请求,接收响应,解析HTML,提取数据,存储数据。你需要学会如何编写递归或循环来遍历分页或动态加载的内容。 6. **数据存储**:爬取的数据通常会保存为CSV、JSON或数据库格式,如SQLite,便于后续分析。Pandas库在处理和清洗数据方面非常强大。 7. **反爬策略**:微博通常会有一些防止爬虫的措施,比如IP限制、User-Agent检测、验证码等。你需要学习如何设置动态User-Agent,使用代理IP池,以及处理验证码的方法。 8. **异常处理**:在编写爬虫时,需要考虑到可能出现的各种异常情况,如网络连接错误、请求超时、解析错误等,通过try-except语句进行异常处理,保证程序的健壮性。 9. **Scrapy框架**:如果你计划构建更复杂的爬虫项目,可以考虑使用Scrapy框架,它提供了完整的爬虫项目管理、中间件、调度器等功能,让爬虫开发更加高效。 10. **法律法规**:在进行网络爬虫时,一定要遵守相关法律法规,尊重网站的Robots协议,不要过度抓取,避免对网站服务器造成过大压力。 以上就是构建“新浪微博爬虫,用python爬取新浪微博数据”项目中涉及的主要知识点。通过实践这些技术,你不仅可以提升编程技能,还能深入了解网络爬虫的工作原理,为数据分析和研究提供强大的数据支持。
2025-07-08 23:04:32 106KB
1
在图像处理领域,TIFF(Tagged Image File Format)是一种广泛使用的位图图像格式,尤其在扫描仪和桌面出版应用中。它支持多种压缩方法和色彩模式,使其能存储大量图像数据。BMP(Bitmap)则是Windows操作系统中最基础的位图格式,简单易用但文件体积较大。本项目涉及的知识点主要是利用libtiff库读取TIFF图像,并将其转换为BMP格式。 libtiff是一个开源库,专门用于读写TIFF文件。它提供了丰富的API,可以处理各种TIFF特性,如多层、多页、不同颜色模式等。在VC6环境下使用C++编程,首先需要包含libtiff库的头文件,然后调用相应的函数来完成图像的读取和写入。 1. **libtiff库的使用**: - ` TIFFOpen()` 函数用于打开一个TIFF文件,返回一个TIFF句柄,供后续操作使用。 - ` TIFFReadScanline()` 或 `TIFFReadRGBAImage()` 用于读取图像的行数据,前者适用于单色或RGB图像,后者适用于RGBA格式。 - ` TIFFClose()` 在完成操作后关闭TIFF文件。 2. **TIFF图像信息的获取**: - `TIFFGetField()` 可以获取TIFF文件的各种元数据,如宽度、高度、位深度、压缩方式等。 - `TIFFNumberOfPages()` 对于多页TIFF,可以获取总页数。 3. **BMP格式的理解**: - BMP文件结构包括文件头、DIB头(Device Independent Bitmap)和像素数据。 - BMP是未压缩的格式,文件大小与图像分辨率和颜色深度直接相关。 - BMP文件的像素数据存储顺序是从下到上,从左到右。 4. **生成BMP文件**: - 创建BMP文件头和DIB头,设置正确的宽度、高度、位深度等信息。 - 然后,根据TIFF图像数据生成BMP的像素数据。可能需要进行颜色空间转换,例如从CMYK转为RGB。 - 使用文件I/O函数将BMP头和像素数据写入文件。 5. **C++编程注意事项**: - VC6环境下编译时,确保链接了libtiff库,如libtiff.lib和zlib.lib(如果TIFF文件使用了ZLib压缩)。 - 处理大图像时要注意内存管理,避免一次性加载整个图像到内存中。 - 考虑错误处理,如文件不存在、读写错误等,通过异常处理或返回值来报告问题。 这个项目提供了一个实例,展示了如何在C++环境中使用libtiff库进行图像格式转换。这对于开发者来说是一个很好的学习资源,可以加深对图像处理和文件格式理解,同时提升库的使用技能。通过分析和实践这个项目,可以进一步掌握图像处理的基本步骤和libtiff库的使用技巧。
2025-07-08 17:36:14 1.87MB tiff
1
RASPA(Reaxff-Simulated Annealing for Particle Systems)是一款高级的分子模拟软件,专为多孔材料的吸附性质研究而设计。这款软件工具集合了强大的脚本功能,可以进行并行计算以高效地生成等温线,并且支持高通量模拟,极大地提升了研究的效率和准确性。在多孔材料领域,理解和预测吸附行为对于优化催化剂性能、气体存储以及分离过程至关重要。 在给定的压缩包"zeo+.zip"中,我们可能找到与RASPA相关的脚本和配置文件,如"ahao5",这可能是一个用户自定义的脚本或者工作流程文件,用于驱动RASPA执行特定的模拟任务。"ahao5"可能包含了设置输入参数、选择力场、定义计算步骤、控制并行计算规模以及数据后处理等一系列指令。用户通常会根据自己的研究需求调整这些参数,以模拟不同的操作条件或材料特性。 RASPA的主要特点包括: 1. **多尺度模拟**:RASPA支持分子动力学和蒙特卡洛模拟,可以在原子和团簇尺度上研究多孔材料的结构和性能。 2. **并行计算**:利用并行计算能力,RASPA可以快速生成大量数据,尤其适合进行大规模的高通量筛选,以探索材料性能的空间。 3. **吸附等温线**:通过模拟,RASPA可以计算出不同温度和压力下的吸附等温线,这对于理解吸附机理和优化实际应用至关重要。 4. **力场**:RASPA内置了多种力场,能够描述不同类型的分子相互作用,适应多种材料系统。 5. **高通量模拟**:对于材料库中的大量候选材料,RASPA可以快速评估其吸附性能,从而筛选出最优的材料。 6. **灵活性**:用户可以通过编写和定制脚本来控制模拟的每个细节,实现高度定制化的研究。 7. **数据可视化和分析**:RASPA还提供了数据处理和可视化功能,帮助研究人员解读和展示模拟结果。 8. **兼容性**:RASPA可以与其他软件工具(如Zeo++和Gams)集成,用于前后期处理,例如孔道结构分析和热力学计算。 "ahao5"文件的使用可能涉及到以下几个步骤: 1. **配置文件**:用户需要先解读和理解"ahao5"中的设置,如模拟时间、步长、初始温度、压力范围等。 2. **力场选择**:根据材料类型,选择合适的力场以准确描述分子间的相互作用。 3. **并行设置**:调整并行计算参数,如进程数量和分配策略,以充分利用计算资源。 4. **运行模拟**:通过RASPA命令行或图形用户界面启动"ahao5"脚本进行模拟。 5. **结果分析**:模拟完成后,提取吸附等温线、孔隙结构信息等关键数据,进行后续的数据分析和可视化。 "zeo+.zip"提供的RASPA脚本工具集是多孔材料研究的有力工具,它使得科学家和工程师能够深入理解吸附过程,为新材料的设计和优化提供理论支持。通过熟练掌握和应用这些工具,可以极大地推动科研进展,提高研究效率。
2025-07-08 17:15:45 20KB
1
多重网格法是一种高效的数值解法,广泛应用于求解各种偏微分方程。在润滑理论中,特别是针对弹流润滑膜厚度的准确计算,多重网格法展现出了其独特的优势。弹流润滑(Elastohydrodynamic Lubrication,EHL)是一种在高负荷和高滚动速度条件下出现的润滑状态,其中润滑膜能够承载相当大的载荷,而润滑膜的厚度是影响其性能的关键因素之一。 传统的数值计算方法在求解弹流润滑问题时,往往会遇到计算精度和计算效率难以兼顾的问题。多重网格法通过结合不同层次的网格,在保证计算精度的同时,显著提高了计算效率。在本文中,多重网格法被用于求解稳态等温线接触下的弹性流体动力润滑问题,给出了在不同工况下的数值解,并分析了Reynolds方程楔形项使用不同差分格式时,随着网格层数增加,数值解的变化趋势。 Reynolds方程是描述弹流润滑中润滑膜压力分布的基础方程,而其楔形项与润滑膜的形状密切相关,对计算结果的准确性有着重要影响。对于楔形项,文章分别采用了两点差分和三点差分两种差分格式,并研究了这些差分格式对计算结果的影响。结果显示,在常见工况下,无论是采用两点还是三点差分,随着网格层数的增加,最小膜厚、中心膜厚、第二压力峰值及其位置都会趋于稳定。 文章还提出了经验公式,用于准确计算中心膜厚与最小膜厚。当网格层数较少时,通过将两点差分和三点差分得到的膜厚值代入经验公式,就能获得与更高网格层数情况下计算结果非常接近的膜厚值。这为计算弹流润滑膜厚度提供了一种有效而快速的方法。 从历史发展来看,弹流润滑理论的研究始于20世纪60年代,Dowson和Higginson对线接触弹流润滑问题的研究,以及70年代Hamrock和Dowson对点接触弹流问题的研究,为弹流润滑理论奠定了基础。弹流润滑理论研究的是一个复杂的非线性系统,需要联合求解Reynolds方程、弹性变形方程、载荷平衡方程、黏度方程和密度方程等多个方程。这些方程的非线性特征给数值求解带来了困难。为应对这些困难,学者们提出了一系列的数值计算方法。 多重网格法就是应对这种复杂非线性问题的有效工具之一。它通过构建不同层次的网格,将复杂问题分解成多个子问题,在较粗的网格上获得初步解,再逐步细化网格进行修正,直到达到所需精度。这种方法能够有效减少计算量,缩短计算时间,对于解决大规模计算问题尤为有效。 在弹流润滑的工程应用中,准确计算润滑膜厚度对机械零件的设计与维护有着重要意义。润滑膜厚度不仅影响摩擦学特性,也关系到设备的能耗和寿命。因此,研究者和工程师们一直在寻求更为精确和高效的计算方法,而多重网格法正好满足了这种需求。通过研究者们的不断探索和实践,多重网格法在弹流润滑膜厚度计算中取得了显著的应用效果,为相关领域的深入研究和实际应用提供了强有力的理论支撑和技术支持。
2025-07-08 14:57:22 569KB 多重网格法 弹流润滑
1
标题中的“中国毛笔字样本”是指一组包含中国书法风格的毛笔字图像,这些图像通常具有独特的艺术价值和文化内涵。在OCR(Optical Character Recognition,光学字符识别)技术中,这类样本被用于训练和测试算法,以便让计算机能够识别和转化手写文字为可编辑的电子文本。OCR技术在现代社会有着广泛的应用,如银行支票自动读取、文档数字化等。 OpenCV(开源计算机视觉库)是一个跨平台的计算机视觉和机器学习软件库,它提供了丰富的图像处理和计算机视觉功能。在这个场景下,OpenCV可以用来处理毛笔字图像,通过图像预处理、特征提取、分类器训练等一系列步骤,实现对毛笔字的自动识别。 描述中提到这些样本已经转换为jpg格式,这意味着它们是以Joint Photographic Experts Group(JPEG)的压缩标准存储的,这是一种常见的图像文件格式,适合于存储具有复杂色彩的图片,且文件大小相对较小,便于在网络上传输和存储。 标签“毛笔字”表明了这些样本的主要内容,毛笔字是中国传统书法的一种,以其独特的笔画、结构和韵律著称。在OCR任务中,毛笔字的识别比印刷体更为复杂,因为其形状多变、连笔常见,这对OCR算法提出了更高的要求。 从压缩包子文件的文件名称“012920180135.zitie114”来看,这可能是一个特定日期(2018年1月29日1时35分)创建或更新的文件,编号“zitie114”可能是样本集中的第114个文件,这样的命名方式方便管理和追踪数据集中的各个样本。 在使用这些毛笔字样本进行OCR开发时,首先需要进行数据预处理,包括灰度化、二值化、去噪等步骤,以减少图像中的干扰因素。接着,可以采用OpenCV的特征提取方法,如SIFT(Scale-Invariant Feature Transform)或HOG(Histogram of Oriented Gradients)来抽取关键信息。然后,利用机器学习算法(如支持向量机SVM、深度学习的卷积神经网络CNN)训练模型,使其能够识别不同形态的毛笔字。通过测试集验证模型的性能,不断调整优化,提高OCR系统的准确率和鲁棒性。 这个数据集为中国毛笔字的OCR研究提供了宝贵的资源,对于了解和提升OCR技术在处理非标准字体,尤其是传统文化元素方面的能力具有重要意义。
2025-07-08 14:41:48 292.48MB
1
用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测用pytorch复现的ssd进行物体检测
2025-07-08 10:07:00 103KB pytorch pytorch
1
在JavaScript开发中,有时我们需要模拟`userAgent`字符串,特别是在测试环境中,为了确保代码在不同浏览器或设备上表现一致。`userAgent`是浏览器发送到服务器的一个头信息,包含了浏览器类型、版本、操作系统等信息。在本文中,我们将深入探讨如何在`window.navigator`对象中模拟`userAgent`,以及这一操作的重要性。 了解`window.navigator`对象是JavaScript中的一个全局对象,它提供了关于用户浏览器的信息。这个对象包含了多种属性,如`navigator.userAgent`,用于获取浏览器的`userAgent`字符串。通常,我们不能直接修改`navigator.userAgent`,因为它是一个只读属性,但可以通过某些方法来模拟这个值。 一种常见的模拟`userAgent`的方法是使用`Object.defineProperty`。这是一个用于定义新属性或者修改现有属性的方法。下面是一个示例: ```javascript Object.defineProperty(navigator, 'userAgent', { get: function () { return 'Your custom userAgent string'; } }); ``` 在这个例子中,我们覆盖了`navigator.userAgent`的getter方法,使其返回自定义的`userAgent`字符串。这样,当代码尝试读取`navigator.userAgent`时,将返回我们设定的值,而不是实际浏览器的`userAgent`。 模拟`userAgent`在以下几种情况特别有用: 1. **跨浏览器测试**:在不同浏览器环境测试代码时,可以通过模拟`userAgent`来验证代码对不同浏览器的兼容性。 2. **Puppeteer或Jest等测试框架**:这些工具允许在Node.js环境中运行JavaScript,它们不提供真实的`navigator`对象。通过模拟`userAgent`,我们可以创建更接近真实浏览器环境的测试场景。 3. **屏蔽浏览器检测**:某些网站可能会基于`userAgent`进行浏览器检测并提供特定的功能或样式。模拟`userAgent`可以帮助我们分析这些网站的行为。 然而,需要注意的是,模拟`userAgent`仅在特定的代码运行环境中有效。例如,在服务器端环境中,`navigator`对象并不存在,因此这种方法不会起作用。同时,由于`userAgent`是浏览器行为的一部分,篡改它可能会影响某些依赖`userAgent`的库或服务的工作。 模拟`userAgent`是一种强大的工具,可以用于测试和调试目的,尤其是在处理浏览器兼容性和模拟不同设备环境时。但也要谨慎使用,避免对正常功能造成干扰。如果你想要了解更多关于这方面的知识,可以参考"Mocking-userAgent-with-JavaScript.pdf"这份文档,其中应该会有更详细的技术实现和案例分析。
2025-07-07 17:35:39 55KB HTML Javascript mocking
1