• 关于

    人机语言如何安装

    的搜索结果

问题

【教程免费下载】机器人系统设计与制作:Python语言实现

玄学酱 2019-12-01 22:08:08 3946 浏览量 回答数 10

回答

《操作系统》课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一、 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware、Vmware palyer (free)(推荐)、Virtualbox(推荐)、VMLite、Xen、Virtuozzo、KVM(2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)(3) Linux内核源代码配置和重编(4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)(5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)(6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)(7) 使用dmesg –c查看后台的输出。可以附加的功能(8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式(9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。)(10) 动态加载和卸载新的文件系统。二、 课程设计内容(1) 安装虚拟机(2) 安装和使用Linux(3) Linux内核源代码配置和重编(4) 提取并动态加载和卸载新的文件系统三、 课程设计设备与环境设备信息:PC 虚拟机:VM11 四、 设计正文(包括分析与设计思路、各模块流程图、带注释的主要算法源码、内核编译过程以及动态模块加载过程等,如有改进或者拓展,请重点用一小节进行说明)(1) 安装虚拟机(2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)安装OpenSUSE,并下载相近版本的内核源码 初始内核版本 下载的源代码包 (3) Linux内核源代码配置和重编利用vmtools(虚拟机提供的可以在宿主机和虚拟机之间自由复制文件的工具)将内核源码包复制进虚拟机,解压到/home/a123/linux-3.12.51 *因为分配的磁盘空间比较小,所以没有按照惯例把内核源码放在/usr/src目录下(如果放在这里,会出现空间不足的情况)附:磁盘分配情况/swap(交换分区) 2.4G/(根目录) 11G/home(用户目录) 13G 解压好的内核源码文件在编译前需要稍作修改(6),并且缺乏一个config文件告诉编译器编译哪些功能。Config文件可以用make menuconfig命令生成,但是需要自己选择相应的功能,太过复杂,这里有一个简便的方法因为下载的内核源码是相近的版本,所以可以使用现有版本的config文件,该文件在/boot目录下使用cp /boot/config-3.11.6-4-desktop .config命令将此文件复制过来 注意:应当在内核所在的文件目录下使用此命令复制成功 执行 make menuconfig命令,进入选择界面,直接保存退出即可虽然新版本的Linux可以直接执行make一步完成所有的编译工作,但此次课程设计仍然采用以前的编译的方式 执行 make bzImage命令——编译压缩的内核编译完成 执行 make modules命令——编译模块 执行 make modules_install命令——安装模块 注: 在make menuconfig时我在General setup中把版本号改过 执行 make install命令——安装新内核 Reboot重启 说明内核修改安装完毕,成功(4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)VFS:虚拟文件系统,顾名思义。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。Linux的文件系统采用面向对象的方式设计,这使得Linux的文件系统非常容易扩展,我们可以非常容易将一个新的文件系统添加到Linux中。在此主要对象之一super_block位于中 代码量巨大,此为部分代码Ext4在fs文件夹下的ext4文件夹内 此处打开file.c用vim打开file.c部分代码如下 (5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)在(4)中已经提到,VFS是C语言写的一个面向对象的设计,比如我们要调用alloc_inode方法:sb->s_op->alloc_inode(sb)。这里与面向对象语言的差别是,面向对象语言里实例方法可以访问到this,这样就可以访问到自身的所有成员,但是在C里却做不到,所以需要将自身作为参数传入到函数中、图一表示了对文件写操作的调用过程 (6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)因为Linux系统对文件的操作是通过函数调用来实现的,所以在此我修改的是vfs这一层,找到fs,目录下的read_write.c并打开找到do_sync_read函数,在其返回前加入printk语句 (7) 使用dmesg –c查看后台的输出。 (8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式 (9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。) 使其在加载和卸载的时候能够printk到buffer缓冲中(10) 动态加载和卸载新的文件系统。使用insmod语句加载使用lsmod语句加载 加载成功接下来使用dmesg 查看缓冲区内容 成功接下来使用rmmod语句卸载模块 成功五、 课程设计结果及分析课程设计结果:成功分析:Linux文件系统使用了面向对象的设计方法,保证了其对用户的透明,VFS层实现了系统与文件系统的无关性,增加了系统对不同文件系统的兼容性。六、 总结与进一步改进设想总结:1.编译内核的时候,可以使用make XXX –j8这样可以开启多线程编译(我的虚拟机分配的是8核心),加快编译速度2.printk语句我写的是printk(”””DoingRead”);本意是利用printk的优先级,将其输出到用户态的控制台,结果语法错误,并没有输出到控制台改进设想:修改的文件前加上语句,实现对控制台的输出 define KERN_EMERG 0(因为缺少这个宏,导致系统并没有理解我的0是什么意思) 七、 答辩(或汇报)记录(包括问题和答案,每个人不少于3个) 显示内核版本 使用dmesg –c命令 加载新模块 八、 参考文献 鸟哥的Linux私房菜 百度百科:printk概述http://baike.baidu.com/link?url=Kv5e2xb9thGENkIvSQmjpkYb8kbKoNvEhmt2oICTmDAn0wj2YADVf8dsrzBtz2fRt0uwa_3joQ-o40wKwwL68a Linux虚拟文件系统(VFS)http://www.cnblogs.com/yuyijq/archive/2013/02/24/2923855.html LinuxEXT4文件系统分析http://wenku.baidu.com/link?url=Wi-vyrROUIJqRk4eSsuwOwRe0Sf-ydXamWNR0H2HCrN9CPHJg80lXpu0Gi_ZGT-X5yKnknl86ooHdckHhJxybmyBR2szWsPDOV0IPJ6fJXO

杨冬芳 2019-12-02 03:10:35 0 浏览量 回答数 0

问题

基础语言百问-Python

薯条酱 2019-12-01 20:12:27 56807 浏览量 回答数 30

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

转自:思否 本文作者:Michael van der Gulik 原文链接:《Why WebAssembly is a big deal》 译者:敖小剑 WebAssembly 是每个程序员都应该关注的技术。WebAssembly 会变得更流行。 WebAssembly 将取代 JavaScript。WebAssembly 将取代 HTML 和 CSS。 WebAssembly 将取代手机应用。WebAssembly 将取代桌面应用。在 10 年内,我保证每个程序员至少需要知道如何使用工具来操作 WebAssembly 并理解它是如何工作的。 你可能会说,“太离谱了!” 好吧,请继续阅读。 什么是 WebAssembly 当前形式的 WebAssembly 是 Web 浏览器的新扩展,可以运行预编译代码…快速地。在 C ++ 中编写了一些小代码,然后使用 Emscripten 编译器将该代码编译为 WebAssembly。通过一些 Javascript 粘合,就可以在 Web 浏览器中调用这一小段代码,例如,运行粒子模拟。 WebAssembly 文件,扩展名为.wasm,本身是包含可执行指令的二进制格式。要使用该文件,必须编写一个运行某些 Javascript 的 HTML 文件来获取、编译和执行 WebAssembly 文件。WebAssembly 文件在基于堆栈的虚拟机上执行,并使用共享内存与其 JavaScript 包装器进行通信。 到目前为止,这似乎并不有趣。它看起来只不过是 JavaScript 的加速器。但是,聪明的读者会对 WebAssembly 可能成为什么有所了解。 WebAssembly 将成为什么? 第一个重要发现是 WebAssembly 是一个安全的沙盒虚拟机。可以从 Internet 运行喜欢的 WebAssembly 代码,而确保它不会接管 PC 或服务器。四个主流 Web 浏览器对它的安全性非常有信心,它已经默认实现并启用了。它的真正安全性还有待观察,但安全性是 WebAssembly 的核心设计目标。 第二个重要发现是 WebAssembly 是一个通用的编译目标。它的原始编译器是一个 C 编译器,这个编译器很好地指示了 WebAssembly 虚拟机的低级和可重定向性。许多编程语言都使用 C 语言编写虚拟机,其他一些语言甚至使用 C 本身作为编译目标。 此时,有人整理了一个可以编译为 WebAssembly 的编程语言列表。这份名单将在未来很多年中继续增长。 WebAssembly 允许使用任何编程语言编写代码,然后让其他人在任何平台上安全地运行该代码,无需安装任何内容。朋友们,这是美好梦想的开始。 部署问题 我们来谈谈如何将软件提供给用户。 为新项目选择编程语言的一个重要因素是如何将项目部署到客户。您的程序员喜欢用 Haskell,Python,Visual Basic 或其他语言编写应用程序,具体取决于他们的喜好。要使用喜欢的语言,他们需要编译应用,制作一些可安装的软件包,并以某种方式将其安装在客户端的计算机上。有许多方法可以提供软件 - 包管理器,可执行安装程序或安装服务,如 Steam,Apple App Store,Google Play 或 Microsoft store。 每一个安装机制都意味着痛苦,从应用商店安装时的轻微疼痛,到管理员要求在他的 PC 上运行一些旧的 COBOL 代码时的集群头痛。 部署是一个问题。对于开发人员和系统管理员来说,部署一直是一个痛点。我们使用的编程语言与我们所针对的平台密切相关。如果大量用户在 PC 或移动设备上,我们使用 HTML 和 Javascript。如果用户是 Apple 移动设备用户,我们使用……呃…… Swift?(我实际上不知道)。如果用户在 Android 设备上,我们使用 Java 或 Kotlin。如果用户在真实计算机上并且愿意处理掉他们的部署问题,那么我们开发人员才能在我们使用的编程语言中有更多选择。 WebAssembly 有可能解决部署问题。 有了 WebAssembly,您可以使用任何编程语言编写应用,只要这些编程语言可以支持 WebAssembly,而应用可以在任何设备和任何具有现代 Web 浏览器的操作系统上运行。 硬件垄断 想购买台式机或笔记本电脑。有什么选择?好吧,有英特尔,有 AMD。多年来一直是双寡头垄断。保持这种双寡头垄断的一个原因是 x86 架构只在这两家公司之间交叉许可,而且通常预编译的代码需要 x86 或 x86-64(也就是 AMD-64)架构。还有其他因素,例如设计世界上最快的 CPU 是一件很艰难但也很昂贵的事情。 WebAssembly 是一种可让您在任何平台上运行代码的技术(之一)。如果它成为下一个风口,硬件市场将变得商品化。应用编译为 WebAssembly,就可以在任何东西上运行 - x86,ARM,RISC-V,SPARC。即便是操作系统市场也会商品化;您所需要的只是一个支持 WebAssembly 的浏览器,以便在硬件可以运行时运行最苛刻的应用程序。 编者注:Second State 研发的专为服务端优化的 WebAssembly 引擎 SSVM 已经可以运行在高通骁龙芯片上。Github 链接:https://github.com/second-sta... 云计算 但等等,还有更多。云计算成为IT经理办公室的流行词已有一段时间,WebAssembly 可以直接迎合它。 WebAssembly 在安全沙箱中执行。可以制作一个容器,它可以在服务器上接受和执行 WebAssembly 模块,而资源开销很小。对于提供的每个服务,无需在虚拟机上运行完整的操作系统。托管提供商只提供对可以上传代码的WebAssembly 容器的访问权限。它可以是一个原始容器,接收 socket 并解析自己的 HTTP 连接,也可以是一个完整的 Web 服务容器,其中 WebAssembly 模块只需要处理预解析的HTTP请求。 这还不存在。如果有人想变得富有,那么可以考虑这个想法。 编者注:目前已经有人正在实现这个想法,Byte Alliance 计划将WebAssembly 带到浏览器之外,Second State 已经发布了为服务端设计的WebAssembly 引擎开发者预览版。 不是云计算 WebAssembly 足以取代 PC 上本地安装的大多数应用程序。我们已经使用 WebGL(又名OpenGL ES 2.0)移植了游戏。我预测不久之后,受益于WebAssembly,像 LibreOffice 这样的大型应用可以直接从网站上获得,而无需安装。 在这种情况下,在本地安装应用没什么意义。本地安装的应用和 WebAssembly 应用之间几乎没有区别。WebAssembly 应用已经可以使用屏幕,键盘和鼠标进行交互。它可以在 2D 或 OpenGL 中进行图形处理,并使用硬件对视频流进行解码。可以播放和录制声音。可以访问网络摄像头。可以使用 WebSockets。可以使用 IndexedDB 存储大量数据在本地磁盘上。这些已经是 Web 浏览器中的标准功能,并且都可以使用 JavaScript 向 WebAssembly 暴露。 目前唯一困难的地方是 WebAssembly 无法访问本地文件系统。好吧,可以通过 HTML 使用文件上传对话,但这不算。最终,总会有人为此创建 API,并可能称之为 “WASI”。 “从互联网上运行应用程序!?胡说八道!“,你说。好吧,这是使用 Qt 和 WebAssembly 实现的文本编辑器 (以及更多)。 这是一个简单的例子。复杂的例子是在 WebBrowser 中运行的 Adobe Premier Pro 或 Blender。或者考虑像 Steam 游戏一样可以直接从网络上运行。这听起来像小说,但从技术上说这并非不能发生。 它会来的。 让我们裸奔! 目前,WebAssembly 在包含 HTML 和 Javascript 包装器的环境中执行。为什么不脱掉这些?有了 WebAssembly,为什么还要在浏览器中包含 HTML 渲染器和 JavaScript 引擎? 通过为所有服务提供标准化 API,这些服务通常是 Web 浏览器提供的,可以创建裸 WebAssembly。就是没有 HTML和 Javascript 包装来管理的 WebAssembly。访问的网页是 .wasm 文件,浏览器会抓取并运行该文件。浏览器为WebAssembly 模块提供画布,事件处理程序以及对浏览器提供的所有服务的访问。 这目前还不存在。如果现在使用 Web 浏览器直接访问 .wasm 文件,它会询问是否要下载它。我假设将设计所需的 API 并使其工作。 结果是 Web 可以发展。网站不再局限于 HTML,CSS 和 Javascript。可以创建全新的文档描述语言。可以发明全新的布局引擎。而且,对于像我这样的 polyglots 最相关,我们可以选择任何编程语言来实现在线服务。 可访问性 但我听到了强烈抗议!可访问性怎么样??搜索引擎怎么办? 好吧,我还没有一个好的答案。但我可以想象几种技术解决方案。 一个解决方案是我们保留内容和表现的分离。内容以标准化格式编写,例如 HTML。演示文稿由 WebAssembly 应用管理,该应用可以获取并显示内容。这允许网页设计师使用想要的任何技术进行任意演示 - 不需要 CSS,而搜索引擎和需要不同类型的可访问性的用户仍然可以访问内容。 请记住,许多 WebAssembly 应用并不是可以通过文本访问的,例如游戏和许多应用。盲人不会从图像编辑器中获得太多好处。 另一个解决方案是发明一个 API,它可以作为 WebAssembly 模块,来提供想在屏幕上呈现的 DOM,供屏幕阅读器或搜索引擎使用。基本上会有两种表示形式:一种是在图形画布上,另一种是产生结构化文本输出。 第三种解决方案是使用屏幕阅读器或搜索引擎可以使用的元数据来增强画布。执行 WebAssembly 并在画布上呈现内容,其中包含描述渲染内容的额外元数据。例如,该元数据将包括屏幕上的区域是否是菜单以及存在哪些选项,或者区域是否想要文本输入,以及屏幕上的区域的自然排序(也称为标签顺序)是什么。基本上,曾经在 HTML 中描述的内容现在被描述为具有元数据的画布区域。同样,这只是一个想法,它可能在实践中很糟糕。 可能是什么 1995年,Sun Microsystems 发布了 Java,带有 Java applets 和大量的宣传。有史以来第一次,网页可以做一些比 和 GIF 动画更有趣的事情。开发人员可以使应用完全在用户的 Web 浏览器中运行。它们没有集成到浏览器中,而是实现为繁重的插件,需要安装整个 JVM。1995年,这不是一个小的安装。applets 也需要一段时间来加载并使用大量内存。我们现在凭借大量内存,这不再是一个问题,但在 Java 生命的第一个十年里,它让体验变得令人厌烦。 applets 也不可靠。无法保证它们会运行,尤其是在用户使用 Microsoft 的实现时。他们也不安全,这是棺材里的最后一颗钉子。 以 JVM 为荣,其他语言最终演变为在 JVM 上运行。但现在,那艘船航行了。 FutureSplash / Macromedia / Adobe Flash 也是一个竞争者,但是是专有的,具有专有工具集和专有语言的专有格式。我读到他们确实在2009年开启了文件格式。最终从浏览器中删除了支持,因为它存在安全风险。 这里的结论是,如果希望您的技术存在于每个人的机器上,那么安全性就需要正视。我真诚地希望 WebAssembly 作为标准对安全问题做出很好的反应。 需要什么? WebAssembly 仍处于初期阶段。它目前能很好的运行代码,而规范版本是 1.0,二进制格式定型。目前正在开展SIMD 指令支持。通过 Web Workers 进行多线程处理也正在进行中。 工具可用,并将在未来几年不断改进。浏览器已经让你窥视 WebAssembly 文件。至少 Firefox 允许查看WebAssembly 字节码,设置断点并查看调用堆栈。我听说浏览器也有 profiling 支持。 语言支持包括一套不错的语言集合–C,C++和Rust是一流的公民。C#,Go和Lua显然有稳定的支持。Python,Scala,Ruby,Java和Typescript都有实验性支持。这可能是一个傲慢的陈述,但我真的相信任何想要在21世纪存在的语言都需要能够在 WebAssembly 上编译或运行。 在访问外部设备的 API 支持方面,我所知道的唯一可用于裸 WebAssembly 的 API 是 WASI,它允许文件和流访问等核心功能,允许 WebAssembly 在浏览器外运行。否则,任何访问外部世界的 API 都需要在浏览器中的 Javascript 中实现。除了本地机器上的文件访问,打印机访问和其他新颖的硬件访问(例如非标准蓝牙或USB设备)之外,应用所需的一切几乎都可以满足。“裸WebAssembly”并不是它成功的必要条件; 它只是一个小的优化,不需要浏览器包含对 HTML,CSS 或 Javascript 的支持。 我不确定在桌面环境中让 WebAssembly 成为一等公民需要什么。需要良好的复制和粘贴支持,拖放支持,本地化和国际化,窗口管理事件以及创建通知的功能。也许这些已经可以从网络浏览器中获得; 我经常惊讶与已经可能的事情。 引发爆炸的火花是创建允许现有应用移植的环境。如果创造了“用于 WebAssembly 的 Linux 子系统”,那么可以将大量现有的开源软件移植到 WebAssembly 上。它需要模拟一个文件系统 - 可以通过将文件系统的所有只读部分都缓存为 HTTP 请求来完成,并且所有可写部分都可以在内存中,远程存储或使用浏览器可以提供的任何文件访问。图形支持可以通过移植 X11 或 Wayland 的实现来使用 WebGL(我理解已经作为 AIGLX 存在?)。 一些 SDL 游戏已经被移植到 WebAssembly - 最着名的是官方演示。 一旦 JVM 在 WebAssembly 中运行,就可以在浏览器中运行大量的 Java 软件。同样适用于其他虚拟机和使用它们的语言。 与 Windows 软件的巨大世界一样,我没有答案。WINE 和 ReactOS 都需要底层的 x86 或 x86-64 机器,所以唯一的选择是获取源代码并移植它,或者使用 x86 模拟器。 尾声 WebAssembly 即将到来。 它来得很慢,但现在所有的部分都可以在你正在使用的浏览器上使用。现在我们等待构建用于从各种编程语言中定位 WebAssembly 的基础设施。一旦构建完成,我们将摆脱 HTML,CSS 和 Javascript 的束缚。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区

茶什i 2020-01-07 10:32:35 0 浏览量 回答数 0

回答

我们在《深入分析Java的编译原理》中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。 有了字节码,无论是哪种平台(如Windows、Linux等),只要安装了虚拟机,都可以直接运行字节码。 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合。这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Kotlin、Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。 经常使用IDE的开发者可能会发现,当我们在Intelij IDEA中,鼠标右键想要创建Java类的时候,IDE还会提示创建其他类型的文件,这就是IDE默认支持的一些可以运行在JVM上面的语言,没有提示的,可以通过插件来支持。 目前,可以直接在JVM上运行的语言有很多,今天介绍其中比较重要的九种。每种语言通过一段『HelloWorld』代码进行演示,看看不同语言的语法有何不同。 Kotlin Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。Kotlin的设计初衷就是用来生产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。 Hello World In Kotlin fun main(args: Array<String>) { println("Hello, world!") } Groovy Apache的Groovy是Java平台上设计的面向对象编程语言。它的语法风格与Java很像,Java程序员能够很快的熟练使用 Groovy,实际上,Groovy编译器是可以接受完全纯粹的Java语法格式的。 使用Groovy的一个重要特点就是使用类型推断,即能够让编译器能够在程序员没有明确说明的时候推断出变量的类型。Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也匹配Groovy的语法规则,尽管可能语义不同。 Hello World In Groovy static void main(String[] args) { println('Hello, world!'); } Scala Scala是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala经常被我们描述为多模式的编程语言,因为它混合了来自很多编程语言的元素的特征。但无论如何它本质上还是一个纯粹的面向对象语言。它相比传统编 程语言最大的优势就是提供了很好并行编程基础框架措施了。Scala代码能很好的被优化成字节码,运行起来和原生Java一样快。 Hello World In Scala object HelloWorld { def main(args: Array[String]) { System.out.println("Hello, world!"); } } Jruby JRuby是用来桥接Java与Ruby的,它是使用比Groovy更加简短的语法来编写代码,能够让每行代码执行更多的任务。就和Ruby一样,JRuby不仅仅只提供了高级的语法格式。它同样提供了纯粹的面向对象的实现,闭包等等,而且JRuby跟Ruby自身相比多了很多基于Java类库 可以调用,虽然Ruby也有很多类库,但是在数量以及广泛性上是无法跟Java标准类库相比的。 Hello World In Jruby puts 'Hello, world!' Jython Jython,是一个用Java语言写的Python解释器。Jython能够用Python语言来高效生成动态编译的Java字节码。 Hello World In Jython print "Hello, world!" Fantom Fantom是一种通用的面向对象编程语言,由Brian和Andy Frank创建,运行在Java Runtime Environment,JavaScript和.NET Common Language Runtime上。其主要设计目标是提供标准库API,以抽象出代码是否最终将在JRE或CLR上运行的问题。 Fantom是与Groovy以及JRuby差不多的一样面向对 象的编程语言,但是悲剧的是Fantom无法使用Java类库,而是使用它自己扩展的类库。 Hello World In Fantom class Hello { static Void main() { echo("Hello, world!") } } Clojure Clojure是Lisp编程语言在Java平台上的现代、函数式及动态方言。 与其他Lisp一样,Clojure视代码为数据且拥有一套Lisp宏系统。 虽然Clojure也能被直接编译成Java字节码,但是无法使用动态语言特性以及直 接调用Java类库。与其他的JVM脚本语言不一样,Clojure并不算是面向对象的。 Hello World In Clojure (defn -main [& args] (println "Hello, World!")) Rhino Rhino是一个完全以Java编写的JavaScript引擎,目前由Mozilla基金会所管理。 Rhino的特点是为JavaScript加了个壳,然后嵌入到Java中,这样能够让Java程序员直接使用。其中Rhino的JavaAdapters能够让JavaScript通过调用Java的类来实现特定的功能。 Hello World In Rhino print('Hello, world!') Ceylon Ceylon是一种面向对象,强烈静态类型的编程语言,强调不变性,由Red Hat创建。 Ceylon程序在Java虚拟机上运行,​​可以编译为JavaScript。 语言设计侧重于源代码可读性,可预测性,可扩展性,模块性和元编程性。 Hello World In Ceylon shared void run() { print("Hello, world!"); } 总结 好啦,以上就是目前主流的可以在JVM上面运行的9种语言。加上Java正好10种。如果你是一个Java开发,那么有必要掌握以上9中的一种,这样可以在一些有特殊需求的场景中有更多的选择。推荐在Groovy、Scala、Kotlin中选一个。

montos 2020-06-01 17:04:25 0 浏览量 回答数 0

问题

【教程免费下载】深入理解计算机系统(英文版第3版)

玄学酱 2019-12-01 22:08:27 3332 浏览量 回答数 1

问题

2018MySQL技术问答集锦,希望能给喜欢MySQL的同学一些帮助

技术小能手 2019-12-01 19:31:11 1856 浏览量 回答数 0

回答

在Java中,常量池的概念想必很多人都听说过。这也是面试中比较常考的题目之一。在Java有关的面试题中,一般习惯通过String的有关问题来考察面试者对于常量池的知识的理解,几道简单的String面试题难倒了无数的开发者。所以说,常量池是Java体系中一个非常重要的概念。 谈到常量池,在Java体系中,共用三种常量池。分别是字符串常量池、Class常量池和运行时常量池。 本文先来介绍一下到底什么是Class常量池。 什么是Class文件 在Java代码的编译与反编译那些事儿中我们介绍过Java的编译和反编译的概念。我们知道,计算机只认识0和1,所以程序员写的代码都需要经过编译成0和1构成的二进制格式才能够让计算机运行。 我们在《深入分析Java的编译原理》中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。 有了字节码,无论是哪种平台(如Windows、Linux等),只要安装了虚拟机,都可以直接运行字节码。 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合。这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。 Java语言中负责编译出字节码的编译器是一个命令是javac。 javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。 如,我们有以下简单的HelloWorld.java代码: public class HelloWorld { public static void main(String[] args) { String s = "Hollis"; } } 通过javac命令生成class文件: javac HelloWorld.java 生成HelloWorld.class文件:  如何使用16进制打开class文件:使用 vim test.class ,然后在交互模式下,输入:%!xxd 即可。 可以看到,上面的文件就是Class文件,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 要想能够读懂上面的字节码,需要了解Class类文件的结构,由于这不是本文的重点,这里就不展开说明了。 读者可以看到,HelloWorld.class文件中的前八个字母是cafe babe,这就是Class文件的魔数(Java中的”魔数”) 我们需要知道的是,在Class文件的4个字节的魔数后面的分别是4个字节的Class文件的版本号(第5、6个字节是次版本号,第7、8个字节是主版本号,我生成的Class文件的版本号是52,这时Java 8对应的版本。也就是说,这个版本的字节码,在JDK 1.8以下的版本中无法运行)在版本号后面的,就是Class常量池入口了。 Class常量池 Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 由于不同的Class文件中包含的常量的个数是不固定的,所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数。  当然,还有一种比较简单的查看Class文件中常量池的方法,那就是通过javap命令。对于以上的HelloWorld.class,可以通过 javap -v HelloWorld.class 查看常量池内容如下:  从上图中可以看到,反编译后的class文件常量池中共有16个常量。而Class文件中常量计数器的数值是0011,将该16进制数字转换成10进制的结果是17。 原因是与Java的语言习惯不同,常量池计数器是从0开始而不是从1开始的,常量池的个数是10进制的17,这就代表了其中有16个常量,索引值范围为1-16。 常量池中有什么 介绍完了什么是Class常量池以及如何查看常量池,那么接下来我们就要深入分析一下,Class常量池中都有哪些内容。 常量池中主要存放两大类常量:字面量(literal)和符号引用(symbolic references)。 字面量 前面说过,运行时常量池中主要保存的是字面量和符号引用,那么到底什么字面量? 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。 以上是关于计算机科学中关于字面量的解释,并不是很容易理解。说简单点,字面量就是指由字母、数字等构成的字符串或者数值。 字面量只可以右值出现,所谓右值是指等号右边的值,如:int a=123这里的a为左值,123为右值。在这个例子中123就是字面量。 int a = 123; String s = "hollis"; 上面的代码事例中,123和hollis都是字面量。 本文开头的HelloWorld代码中,Hollis就是一个字面量。 符号引用 常量池中,除了字面量以外,还有符号引用,那么到底什么是符号引用呢。 符号引用是编译原理中的概念,是相对于直接引用来说的。主要包括了以下三类常量: * 类和接口的全限定名 * 字段的名称和描述符 * 方法的名称和描述符 这也就可以印证前面的常量池中还包含一些com/hollis/HelloWorld、main、([Ljava/lang/String;)V等常量的原因了。 Class常量池有什么用 前面介绍了这么多,关于Class常量池是什么,怎么查看Class常量池以及Class常量池中保存了哪些东西。有一个关键的问题没有讲,那就是Class常量池到底有什么用。 首先,可以明确的是,Class常量池是Class文件中的资源仓库,其中保存了各种常量。而这些常量都是开发者定义出来,需要在程序的运行期使用的。 在《深入理解Java虚拟》中有这样的表述: Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这一步骤,而是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法、字段的最终内存布局信息,因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址,也就无法直接被虚拟机使用。当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。关于类的创建和动态连接的内容,在虚拟机类加载过程时再进行详细讲解。 前面这段话,看起来很绕,不是很容易理解。其实他的意思就是: Class是用来保存常量的一个媒介场所,并且是一个中间场所。在JVM真的运行时,需要把常量池中的常量加载到内存中。 至于到底哪个阶段会做这件事情,以及Class常量池中的常量会以何种方式被加载到具体什么地方,会在本系列文章的后续内容中继续阐述。欢迎关注我的博客(http://www.hollischuang.com) 和公众号(Hollis),即可第一时间获得最新内容。 另外,关于常量池中常量的存储形式,以及数据类型的表示方法本文中并未涉及,并不是说这部分知识点不重要,只是Class字节码的分析本就枯燥,作者不想在一篇文章中给读者灌输太多的理论上的内容。感兴趣的读者可以自行Google学习,如果真的有必要,我也可以单独写一篇文章再深入介绍。 参考资料 《深入理解java虚拟机》 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)

montos 2020-06-02 10:12:18 0 浏览量 回答数 0

问题

极光推送一个朋友,三四天的Rails学习之路? 报错

优选2 2020-06-04 21:19:39 3 浏览量 回答数 1

问题

极光推送一个朋友,三四天的Rails学习之路? 400 报错

爱吃鱼的程序员 2020-06-02 13:32:16 0 浏览量 回答数 1

问题

极光推送一个朋友,三四天的Rails学习之路? 400 报错

爱吃鱼的程序员 2020-05-29 19:26:23 0 浏览量 回答数 1

问题

[精品问答]Java一百问第一期

问问小秘 2019-12-01 21:51:20 791 浏览量 回答数 1

回答

首先如何购买ECS?发现有些人购买5G硬盘,我个人认为买硬盘应该购买20以上!这样以后好处理! 进入 http://www.aliyun.com/product/ecs/?spm=5176.7189909.201.2.CVdddr 点击后面后选择配置,你也可以选择镜像市场! 付款后就可以开通了!!进入控制台: 点击进入管理面板: 如果你要更换系统,要选停止服务器,再进行更换!! ------------------------- 接下来我们来挂载硬盘: (注意事项)如果你没购买数据盘,这步你就不用管了直接跳过!!) 版本的挂载方法: 下载登入服务器的软件:http://pan.baidu.com/s/1pa9PY 可以参考这个教程:http://bbs.aliyun.com/read/146157.html 先填写登入的服务器信息: [attachment=57730] 选择语言 [attachment=57731] 保存并连接 [attachment=57732] Linux硬盘挂载是比较常见的管理操作之一。默认情况下数据盘没有挂载,需要手动挂载到系统中。     具体操作是分三步:     硬盘挂载1)需要对磁盘进行格式化     硬盘挂载2)格式化后硬盘挂载到需要的挂载点       硬盘挂载3)最后还需要添加分区启动表,以便下次系统启动随机自动硬盘挂载。   硬盘挂载详细图文教程如下: 硬盘挂载1、查看数据盘在没有分区和格式化数据盘之前,使用 “ df -lh ”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看 [attachment=57733] 查看新加的硬盘是 /dev/xvdb 硬盘挂载2:将未使用的磁盘进行格式化,操作数据盘符前,请自行确认磁盘是否有使用过,如有重要数据请谨慎操作,以免导致数据丢失,带来不必要的麻烦。具体格式化命令为: mkfs.ext3 /dev/xvdb  ,即为正在格式化中。这个时候请耐心等待格式化完毕(时间较久)。 [attachment=57734] 硬盘挂载3:将格式化完的磁盘进行硬盘挂载,phpstudy 安装前,先在服务器上创建一个需要挂载的挂载点,在根目录下创建一个phpstudy目录。    默认情况下,跳转到根目录的命令为:cd ..          创建目录命令为: mkdir /phpstudy   硬盘挂载到phpstudy 目录, 硬盘挂载命令: mount /dev/xvdb  /phpstudy /  、 修改fstab,以便系统启动时自动硬盘挂载,添加分区信息使用“echo '/dev/xvdb   /phpstudy ext3    defaults    0  0' >> /etc/fstab”(不含引号)命令写入新分区信息。 [attachment=57735] 硬盘挂载4:执行:init 6 进行优雅重启服务器。 硬盘挂载5:重启服务器后,输入命令: df -lh 查看第2块磁盘是否有正常进行硬盘挂载,硬盘挂载正常的话您会看到,这样第2块盘就挂载好了。 [attachment=57736] (注意事项)如果你没购买数据盘,上面你就不用管了直接跳过!!) 接下来安装phpstudy一键包: 在线安装版: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin    #权限设置 ./phpstudy.bin     #运行安装 离线完整版: wget -c http://lamp.phpstudy.net/phpstudy-all.bin chmod +x phpstudy-all.bin       #权限设置 ./phpstudy-all.bin     #运行安装 我用的是 在线 [font=Tahoma, 'Microsoft Yahei', Simsun]安装版: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin    #权限设置 ./phpstudy.bin     #运行安装 [attachment=57737] 选择你要安装的版本:中文大家都看得懂: [attachment=57739] 出现这样的信息。。说明你安装完毕了 [attachment=57742] 这时候你可以用IP打开网站了会出现探针页面 用IP加phpMyAdmin就可以访问数据管理:默认用户和密码都是root,请自己修改 默认没有FTP 如果需要可以安装: wget -c http://lamp.phpstudy.net/phpstudy-ftpd.sh chmod +x phpstudy-ftpd.sh    #权限设置 ./phpstudy-ftpd.sh 下图说明FTP安装完毕“ [attachment=57744] 如何切换php版: 假如你先安装的apache+php5.3 想切换成nginx+php5.4 你就再走一次./phpstudy.bin 但是你会发现有一行是否安装mysql提示选不安装 这样只需要编译nginx+php5.4 从而节省时间,这样只需要几分钟即可。 使用说明: 服务进程管理:phpstudy (start|stop|restart|uninstall) 站点主机管理:phpstudy (add|del|list) ftpd用户管理:phpstudy ftp (add|del|list) 如何建站: 输入:phpstudy add 再输入你的域名就可以了。。。 [attachment=57745] 开通FTP 1:输入phpstudy ftp add 2:输入FTP用户名 3:输入密码 4:输入目录(注意是绝对目录)就是你上面添加网站的目录 [attachment=57746] del(修改)list(列出网站) 这时你网站和FTP建好了,你再建个数据库,上传你的网站源码就可以安装了!! ------------------------- phpStudy(php一键安装包)『软件简介』该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序绿色小巧简易迷你仅有35M,有专门的控制面板。总之学习PHP只需一个包。对学习PHP的新手来说,WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事。因此无论你是新手还是老手,该程序包都是一个不错的选择。全面适合 Win2000/XP/2003/win7/win8/win2008 操作系统 ,支持Apache、IIS、Nginx和LightTPD。首先我们进入Win2000/XP/2003/win7/win8/win2008 操作系统进行下载:下载地址是:下载地址解压版:http://www.phpstudy.net/phpstudy/phpStudy.zip下载地址安装版:http://www.phpstudy.net/phpstudy/phpStudy-install.zipMariaDB版下载:http://www.phpstudy.net/phpstudy/phpStudy-mariadb.zip新手强烈推荐使用phpStudy Lite,简单解压即可。phpStudy Lite下载:http://www.phpstudy.net/phpstudy/phpStudyLite.zipJspStudy(jsp环境集成包)下载:http://www.phpstudy.net/phpstudy/JspStudy.zipJspStudy(jsp环境集成包) jdk+tomcat6+tomcat7+mysql+apache下载保存到你想要的硬盘解压后双击:phpStudy2014.exe点击运行按照提示进行解压或安装:如果你没有数据盘可以选择安装或解压到C盘解压中。。点击是这事提示没有安装VC9运行库请到32位的VC9运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=558264位的VC9运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=15336VC11运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=30679不能启动 参照:http://www.phpstudy.net/a.php/184.html启动成功:选择版本:如果要IIS请安装IIS添加网站。网站的目录可以自由选择:如果有数据盘请挂载添加---管理工具--计算机管理点击磁盘管理:硬盘添加完毕了!!!如何要IIS请安装IIS:控制面板--添加和删除程序!!就可以安装完毕了 ------------------------- 占位4 ------------------------- 占位5

梦丫头 2019-12-01 23:55:46 0 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。

有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

问题

【教程免费下载】 Python数据科学实践指南

沉默术士 2019-12-01 22:07:52 1973 浏览量 回答数 2

问题

荆门开诊断证明-scc

游客5k2abgdj3m2ti 2019-12-01 22:09:00 1 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 37578 浏览量 回答数 11

问题

服务器运维系列教程(二):服务搭建---Windows篇

千鸟 2019-12-01 21:53:28 10096 浏览量 回答数 2

问题

搞懂了这几点,你就学会了Web编程

技术小菜鸟 2019-12-01 21:20:38 2373 浏览量 回答数 1

问题

用云,战江湖——《大掌门》在阿里云的武侠梦

nono20011908 2019-12-01 21:03:53 16932 浏览量 回答数 11

问题

Spark,一种快速数据分析替代方案:报错

kun坤 2020-06-06 11:49:13 0 浏览量 回答数 1

回答

Java Java核心技术·卷 I(原书第10版)| Core Java Volume 讲的很全面,书中的代码示例都很好,很适合Java入门。 但是作者不太厚道的是把现在没人用的GUI编程放在了第一卷,基本上10~13章是可以不用读的。 Java性能权威指南|Java Performance: The Definitive Guide 市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。 通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,最终使程序如虎添翼。 实战Java高并发程序设计|葛一鸣 由部分段落的行文来看,搬了官方文档。 也有一些第一人称的叙述和思考,也能看出作者也是花了一点心思的。胜在比较基础,涉及到的知识点也还很全面(讲到了流水线计算和并发模型这些边边角角的),但是由于是编著,全书整体上不够统一和深入,适合作为学习高并发的第一本工具书。 Java 8实战 对Java8的新特性讲解的十分到位,尤其是lamdba表达式和流的操作。 再者对于Java8并发处理很有独到见解。对于并行数据处理和组合式异步编程还需要更深的思考才能更加掌握。 推荐给再用java8但没有去真正了解的人看,有很多你不知道的细节、原理和类库设计者的用心良苦在里面、内容没有很难,抽出几个小时就能看完,花费的时间和收获相比,性价比很高。 Java并发编程实战 先不谈本书的内容如何,光书名就足够吸引不少目光。“并发”这个词在Java世界里往往和“高级、核心”等字眼相联系起来,就冲着这两个字,都将勾起软件工程师们埋藏在心底那种对技术的探索欲和对高级API的驾驭感。 程序员嘛,多少都有点职业病。其实Java对“并发”优化从未停止过,从5.0到7.0,几乎每个版本的新特性里,都会针对前一版本在“并发”上有所改进。这种改进包括提供更丰富的API接口、JVM底层性能优化等诸多方面。 Thinking in Java 很美味的一本书,不仅有icecreamm,sundae,sandwich,还有burrito!真是越看越饿啊~ Effective Java中文版(第3版)|Effective Java Third Edition Java 高阶书籍,小白劝退。介绍了关于Java 编程的90个经验技巧。 作者功力非常强悍,导致这本书有时知识面迁移很广。总之,非常适合有一定Java开发经验的人阅读提升。 深入理解Java虚拟机(第3版)| 周志明 浅显易懂。最重要的是开启一扇理解虚拟机的大门。 内存管理机制与Java内存模型、高效并发这三章是特别实用的。 Java虚拟机规范(Java SE 8版)|爱飞翔、周志明 整本书就觉得第二章的方法字节码执行流程,第四章的前8节和第五章能看懂一些。其他的过于细致和琐碎了。 把Java字节码讲的很清楚了,本质上Java虚拟机就是通过字节码来构建的一套体系罢了。所以字节码说的非常细致深入。 数据&大数据 数据结构与算法分析|Data Structures and Algorithm Analysis in Java 数据结构是计算机的核心,这部书以java语言为基础,详细的介绍了基本数据结构、图、以及相关的排序、最短路径、最小生成树等问题。 但是有一些高级的数据结构并没有介绍,可以通过《数据结构与算法分析——C语言描述》来增加对这方面的了解。 MySQL必知必会 《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。 书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。 数据库系统概念|Datebase System Concepts(Fifth Edition) 从大学读到现在,每次拿起都有新的收获。而且这本书还是对各个数据相关领域的概览,不仅仅是数据库本身。 高性能MySQL 对于想要了解MySQL性能提升的人来说,这是一本不可多得的书。 书中没有各种提升性能的秘籍,而是深入问题的核心,详细的解释了每种提升性能的原理,从而可以使你四两拨千斤。授之于鱼不如授之于渔,这本书做到了。 高可用MySQL 很实用的书籍,只可惜公司现有的业务和数据量还没有达到需要实践书中知识的地步。 利用Python进行数据分析|唐学韬 内容还是跟不上库的发展速度,建议结合里面讲的库的文档来看。 内容安排上我觉得还不错,作者是pandas的作者,所以对pandas的讲解和设计思路都讲得很清楚。除此以外,作者也是干过金融数据分析的,所以后面专门讲了时间序列和金融数据的分析。 HBase 看完影印版第一遍,开始以为会是大量讲API,实际上除了没有将HBase源代码,该讲的都讲了,CH8,9章留到最后看的,确实有点顿悟的感觉,接下来需要系统的看一遍Client API,然后深入代码,Come ON! Programming Hive Hive工具书,Hive高级特性。 Hadoop in Practice| Alex Holmes 感觉比action那本要强 像是cookbook类型的 整个过完以后hadoop生态圈的各种都接触到了 这本书适合当参考手册用。 Hadoop技术内幕|董西成 其实国人能写这样的书,感觉还是不错的,不过感觉很多东西不太深入,感觉在深入之前,和先有整体,带着整体做深入会更好一点, jobclient,jobtracer,tasktracer之间的关系最好能系统化 Learning Spark 很不错,core的原理部分和api用途解释得很清楚,以前看文档和代码理解不了的地方豁然开朗。 不足的地方是后几章比较弱,mllib方面没有深入讲实现原理。graphx也没有涉及 ODPS权威指南 基本上还算一本不错的入门,虽然细节方面谈的不多,底层也不够深入,但毕竟是少有的ODPS书籍,且覆盖面很全,例子也还行。 数据之巅|徐子沛 从一个新的视角(数据)切入,写美国历史,统计学的发展贯穿其中,草蛇灰线,伏脉千里,读起来波澜壮阔。 消息队列&Redis RabbitMQ实战 很多年前的书了,书中的例子现在已经不适用了,推荐官方教程。 一些基础还是适用,网上也没有太多讲rab的书籍,将就看下也行,我没用过所以…. Apache Kafka源码剖析|徐郡明 虽然还没看,但知道应该不差。我是看了作者的mybatis源码分析,再来看这本的,相信作者。 作者怎么有这么多时间,把框架研究的这么透彻,佩服,佩服。 深入理解Kafka:核心设计与实践原理|朱忠华 通俗易懂,图文并茂,用了很多图和示例讲解kafka的架构,从宏观入手,再讲到细节,比较好,值得推荐。 深入理解Kafka是市面上讲解Kafka核心原理最透彻的,全书都是挑了kafka最核心的细节在讲比如分区副本选举、分区从分配、kafka数据存储结构、时间轮、我认为是目前kafka相关书籍里最好的一本。 Kafka 认真刷了 kafka internal 那章,看了个talk,算是入了个门。 系统设计真是门艺术。 RocketMQ实战与原理解析|杨开元 对RocketMQ的脉络做了一个大概的说明吧,深入细节的东西还是需要自己看代码 Redis设计与实现|黄健宏 部分内容写得比较啰嗦,当然往好了说是对新手友好,不厌其烦地分析细节,但也让整本书变厚了,个人以为精炼语言可以减少20%的内容。 对于有心一窥redis实现原理的读者来说,本书展露了足够丰富的内容和细节,却不至于让冗长的实现代码吓跑读者——伪代码的意义在此。下一步是真正读源码了。 Redis 深度历险:核心原理与应用实践|钱文品 真心不错,数据结构原理+实际应用+单线程模型+集群(sentinel, codis, redis cluster), 分布式锁等等讲的都十分透彻。 一本书的作用不就是系统性梳理,为读者打开一扇窗,读者想了解更多,可以自己通过这扇窗去Google。这本书的一个瑕疵是最后一章吧,写的仓促了。不过瑕不掩瑜。 技术综合 TCP/IP详解 卷1:协议 读专业性书籍是一件很枯燥的事,我的建议就是把它作为一本手册,先浏览一遍,遇到问题再去详细查,高效。 Netty in Action 涉及到很多专业名词新概念看英文原版顺畅得多,第十五章 Choosing the right thread model 真是写得太好了。另外结合Ron Hitchens 写的《JAVA NIO》一起看对理解JAVA NIO和Netty还是很有帮助的 ZooKeeper 值得使用zookeeper的人员阅读, 对于zookeeper的内部机制及api进行了很详细的讲解, 后半部分深入地讲解了zookeeper中ensemble互相协作的流程, 及group等高级配置, 对zookeeper的高级应用及其它类似系统的设计都很有借鉴意义. 从Paxos到Zookeeper|倪超 分布式入门鼻祖,开始部分深入阐述cap和base理论,所有的分布式框架都是围绕这个理论的做平衡和取舍,中间 zk的原理、特性、实战也讲的非常清晰,同时讲cap理论在zk中是如何体现,更加深你对cap的理解. 深入理解Nginx(第2版)|陶辉 云里雾里的快速读了一遍,主要是读不懂,读完后的感受是设计的真好。 原本是抱着了解原理进而优化性能的想法来读的,却发现书中的内容都是讲源码,作者对源码的注释超级详细,非常适合开发者,但不适合使用者,给个五星好评是因为不想因为我这种菜鸡而埋没了高质量内容。 另外别人的代码写的真好看,即便是过程式语言程序也吊打我写的面向对象语言程序。 作者是zookeeper的活跃贡献者,而且是很资深的研究员,内容比较严谨而且较好的把握住了zk的精髓。书很薄,但是没有废话,选题是经过深思熟虑的。 深入剖析Tomcat 本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。 深入理解计算机系统 | 布莱恩特 无论是内容还是纸张印刷,都是满分。计算机学科的集大成之作。引导你如何练内功的,算是高配版本的计算机导论,目的是釜底抽薪引出来操作系统、组成原理这些专业核心的课程。帮助我们按图索骥,点亮一个一个技能树。 架构探险分布式服务框架 | 李业兵 刚看前几章的时候,心里满脑子想得都是这特么贴一整页pom文件代码上来干鸡毛,又是骗稿费的,买亏了买亏了,后来到序列化那章开始,诶?还有那么点意思啊。 到服务注册中心和服务通讯,60块钱的书钱已经赚回来了。 知识是无价的,如果能花几十块钱帮你扫了几个盲区,那就是赚了。 深入分析JavaWeb技术内幕 | 许令波 与这本书相识大概是四年前是在老家的北方图书城里,当时看到目录的感觉是真的惊艳,对当时刚入行的自己来说,这简直就是为我量身定做的扫盲科普集啊。 但是可惜的是,这本书在后来却一直没机会读上。然后经过四年的打怪升级之后,这次的阅读体验依旧很好。 其中,java编译原理、 Servlet工作原理、 Tomcat、spring和iBatis这几章的收获很大。 前端 jQuery 技术内幕| 高云 非常棒的一本书,大大降低了阅读jquery源码的难度(虽然还是非常难)。 Head First HTML与CSS(第2版) 翻了非常久的时间 断断续续 其实从头翻到尾 才发现一点都不难。 可我被自己的懒惰和畏难情绪给拖累了 简单说 我成了自己往前探索的负担。网页基础的语法基本都涵盖了 限于文本形态 知识点都没法像做题一样被反复地运用和复习到。通俗易懂 这不知算是多高的评价? 作为入门真心算不错了 如果更有耐心 在翻完 HTML 后 对 CSS 部分最好是可以迅速过一遍 找案例练习估计更好 纸上得来终觉浅 总是这样。 JavaScript高级程序设计(第3版) JavaScript最基础的书籍,要看认真,慢慢地看,累计接近1000小时吧。而且对象与继承,性能优化,HTML5 api由于没有实践或缺乏代码阅读量导致看的很糊涂,不过以后可以遇到时再翻翻,或者看更专业的书。 深入理解ES6 Zakas的又一部杰作,他的作品最优秀的地方在于只是阐述,很少评价,这在帮助我们夯实基础时十分有意义,我也喜欢这种风格。 我是中英文参照阅读的,译本后半部分有一些文字上的纰漏,但是总体来说忠实原文,水平还是相当不错,希望再版时可以修复这些文字问题。 高性能JavaScript 还是挺不错的。尤其是对初学者。总结了好多程序方面的好习惯。 不过对于老手来说,这些常识已经深入骨髓了。 深入浅出Node.js|朴灵 本书是我看到现在对Node.JS技术原理和应用实践阐述的最深入,也最全面的一本书。鉴于作者也是淘宝的一位工程师,在技术总是国外好的大环境下,没有理由不给本书五颗星。 作者秉着授人于鱼不如授人于渔的精神,细致入微的从V8虚拟机,内存管理,字符串与Buffer的应用,异步编程的思路和原理这些基础的角度来解释Node.JS是如何工作的,比起市面上众多教你如何安装node,用几个包编写一些示例来比,本书绝对让人受益匪浅。 认真看完本书,几乎可以让你从一个Node的外行进阶到专家的水平。赞! 总结 其实我觉得在我们现在这个浮躁的社会,大家闲暇时间都是刷抖音,逛淘宝,微博……他们都在一点点吞噬你的碎片时间,如果你尝试着去用碎片的时间看看书,我想时间久了你自然能体会这样的好处。 美团技术团队甚至会奖励读完一些书本的人,很多公司都有自己的小图书馆,我觉得挺好的。 文章来自:敖丙

剑曼红尘 2020-03-20 14:52:22 0 浏览量 回答数 0

问题

【教程免费下载】Unity虚拟现实开发实战

玄学酱 2019-12-01 22:07:47 1731 浏览量 回答数 1

问题

【iOS学习全家桶】190道iOS热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:23 5197 浏览量 回答数 1

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 454222 浏览量 回答数 19

回答

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Node 可能是某些人的正确选择。 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务。 Node 旨在解决什么问题? Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户端基础的增长,您希望您的 web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在 Java 中,静态变量和缓存需要在每个服务器上的 JVMs 之间共享。这就是整个 web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。 Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的 OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。 现在您有了一个能处理数万条并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 如何工作以及它被设计的如何运行。 Node 肯定不是什么 没错,Node 是一个服务器程序。但是,它肯定不 像 Apache 或 Tomcat。那些服务器是独立服务器产品,可以立即安装并部署应用程序。通过这些产品,您可以在一分钟内启动并运行一个服务器。Node 肯定不是这种产品。Apache 能添加一个 PHP 模块来允许开发人员创建动态 web 页,使用 Tomcat 的程序员能部署 JSPs 来创建动态 web 页。Node 肯定不是这种类型。 在 Node 的早期阶段(当前是 version 0.4.6),它还不是一个 “运行就绪” 的服务器程序,您还不能安装它,向其中放置文件,拥有一个功能齐全的 web 服务器。即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?没错,您没有看错。服务器端 JavaScript 是一个相对较新的概念,这个概念是大约两年前在 developerWorks 上讨论 Aptana Jaxer 产品时提到的(参见 参考资料)。尽管 Jaxer 一直没有真正流行,但这个理念本身并不是遥不可及的 — 为何不能在服务器上使用客户机上使用的编程语言? 什么使 V8?V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。它不仅限于在一个浏览器中运行。因此,Node 实际上使用 Google 编写的 V8 JavaScript 引擎并将其重建为在服务器上使用。太完美了!既然已经有一个不错的解决方案可用,为何还要创建一种新语言呢? 事件驱动编程 许多程序员接受的教育使他们认为,面向对象编程是完美的编程设计,而对其他编程方法不屑一顾。Node 使用一个所谓的事件驱动编程模型。 清单 1. 客户端上使用 jQuery 的事件驱动编程 复制代码 代码如下: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); 实际上,服务器端和客户端没有任何区别。没错,这没有按钮点击操作,也没有向文本字段键入的操作,但在一个更高的层面上,事件正在 发生。一个连接被建立 — 事件!数据通过连接接收 — 事件!数据通过连接停止 — 事件! 为什么这种设置类型对 Node 很理想?JavaScript 是一种很棒的事件驱动编程语言,因为它允许匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处编写。这样,代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有在上面架构任何内容的潜能。只需监听事件,编写一个回调函数,然后,事件驱动编程将照管好一切! 示例 Node 应用程序 最后,我们来看一些代码!让我们将讨论过的所有内容综合起来,创建我们的第一个 Node 应用程序。由于我们已经知道,Node 对于处理高流量应用程序很理想,我们就来创建一个非常简单的 web 应用程序 — 一个为实现最大速度而构建的应用程序。下面是 “老板” 交代的关于我们的样例应用程序的具体要求:创建一个随机数字生成器 RESTful API。这个应用程序应该接受一个输入:一个名为 “number” 的参数。然后,应用程序返回一个介于 0 和该参数之间的随机数字,并将生成的数字返回调用者。由于 “老板” 希望它成为一个广泛流行的应用程序,因此它应该能处理 50,000 个并发用户。我们来看看代码: 清单 2. Node 随机数字生成器 复制代码 代码如下: // these modules need to be imported in order to use them. // Node has several modules. They are like any #include // or import statement in other languages var http = require("http"); var url = require("url"); // The most important line in any Node file. This function // does the actual process of creating the server. Technically, // Node tells the underlying operating system that whenever a // connection is made, this particular callback function should be // executed. Since we're creating a web service with REST API, // we want an HTTP server, which requires the http variable // we created in the lines above. // Finally, you can see that the callback method receives a 'request' // and 'response' object automatically. This should be familiar // to any PHP or Java programmer. http.createServer(function(request, response) { // The response needs to handle all the headers, and the return codes // These types of things are handled automatically in server programs // like Apache and Tomcat, but Node requires everything to be done yourself response.writeHead(200, {"Content-Type": "text/plain"}); // Here is some unique-looking code. This is how Node retrives // parameters passed in from client requests. The url module // handles all these functions. The parse function // deconstructs the URL, and places the query key-values in the // query object. We can find the value for the "number" key // by referencing it directly - the beauty of JavaScript. var params = url.parse(request.url, true).query; var input = params.number; // These are the generic JavaScript methods that will create // our random number that gets passed back to the caller var numInput = new Number(input); var numOutput = new Number(Math.random() * numInput).toFixed(0); // Write the random number to response response.write(numOutput); // Node requires us to explicitly end this connection. This is because // Node allows you to keep a connection open and pass data back and forth, // though that advanced topic isn't discussed in this article. response.end(); // When we create the server, we have to explicitly connect the HTTP server to // a port. Standard HTTP port is 80, so we'll connect it to that one. }).listen(80); // Output a String to the console once the server starts up, letting us know everything // starts up correctly console.log("Random Number Generator Running..."); 将上面的代码放到一个名为 “random.js” 的文件中。现在,要启动这个应用程序并运行它(进而创建 HTTP 服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时它看起来的样子: 复制代码 代码如下: root@ubuntu:/home/moila/ws/mike# node random.js Random Number Generator Running... 访问应用程序 应用程序已经启动并运行。Node 正在监听任何连接,我们来测试一下。由于我们创建了一个简单的 RESTful API,我们可以使用我们的 web 浏览器来访问这个应用程序。键入以下地址(确保您完成了上面的步骤):localhost/?number=27。 您的浏览器窗口将更改到一个介于 0 到 27 之间的随机数字。单击浏览器上的 “重新载入” 按钮,将得到另一个随机数字。就是这样,这就是您的第一个 Node 应用程序! Node 对什么有好处? 到此为止,应该能够回答 “Node 是什么” 这个问题了,但您可能还不清楚什么时候应该使用它。这是一个需要提出的重要问题,因为 Node 对有一些东西有好处,但相反,对另一些东西而言,目前 Node 可能不是一个好的解决方案。您需要小心决定何时使用 Node,因为在错误的情况下使用它可能会导致一个多余编码的 LOT。 它对什么有好处? 正如您此前所看到的,Node 非常适合以下情况:您预计可能有很高的流量,而在响应客户端之前服务器端逻辑和处理所需不一定是巨大的。Node 表现出众的典型示例包括: 1.RESTful API 提供 RESTful API 的 web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它还不需要大量逻辑;它只是从一个数据库查找一些值并组合一个响应。由于响应是少量文本,入站请求时少量文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。 2.Twitter 队列 想像一下像 Twitter 这样的公司,它必须接收 tweets 并将其写入一个数据库。实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站 tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集 tweet 并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个 tweet 将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理 2000 条入站 tweets。每秒 100 万条 tweets 需要 500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能捕获尽可能多的 tweets。一个能处理 50,000 条 tweets 的 Node 机器只需要 20 个服务器。 3.映像文件服务器 一个拥有大型分布式网站的公司(比如 Facebook 或 Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个 404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和 .css 文件等静态文件所需的服务器数量。 它对什么有坏处? 当然,在某些情况下,Node 并非理想选择。下面是 Node 不擅长的领域: 1.动态创建的页 目前,Node 没有提供一种默认方法来创建动态页。例如,使用 JavaServer Pages (JSP) 技术时,可以创建一个在这样的 JSP 代码段中包含循环的 index.jsp 页。Node 不支持这类动态的、HTML 驱动的页面。同样,Node 不太适合作为 Apache 和 Tomcat 这样的网页服务器。因此,如果您想在 Node 中提供这样一个服务器端解决方案,必须自己编写整个解决方案。PHP 程序员不想在每次部署 web 应用程序时都编写一个针对 Apache 的 PHP 转换器,当目前为止,这正是 Node 要求您做的。 2. 关系数据库重型应用程序 Node 的目的是快速、异步和非阻塞。数据库并不一定分享这些目标。它们是同步和阻塞的,因为读写时对数据库的调用在结果生成之前将一直阻塞通道。因此,一个每个请求都需要大量数据库调用、大量读取、大量写入的 web 应用程序非常不适合 Node,这是因为关系数据库本身就能抵销 Node 的众多优势。(新的 NoSQL 数据库更适合 Node,不过那完全是另一个主题了。) 结束语 问题是 “什么是 Node.js?” 应该已经得到解答。阅读本文之后,您应该能通过几个清晰简洁的句子回答这个问题。如果这样,那么您已经走到了许多编码员和程序员的前面。我和许多人都谈论过 Node,但它们对 Node 究竟是什么一直很迷惑。可以理解,他们具有的是 Apache 的思维方式 — 服务器是一个应用程序,将 HTML 文件放入其中,一切就会正常运转。而 Node 是目的驱动的。它是一个软件程序,使用 JavaScript 来允许程序员轻松快速地创建快速、可伸缩的 web 服务器。Apache 是运行就绪的,而 Node 是编码就绪的。 Node 完成了它提供高度可伸缩服务器的目标。它并不分配一个 “每个连接一个线程” 模型,而是使用一个 “每个连接一个流程” 模型,只创建每个连接需要的内存。它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了 Node 的理想目标 — 编写一个高度可伸缩的解决方案变得比较容易。 与理解 Node 是 什么同样重要的是,理解它不是 什么。Node 并不是 Apache 的一个替代品,后者旨在使 PHP web 应用程序更容易伸缩。事实确实如此。在 Node 的这个初始阶段,大量程序员使用它的可能性不大,但在它能发挥作用的场景中,它的表现非常好。 将来应该期望从 Node 得到什么呢?这也许是本文引出的最重要的问题。既然您知道了它现在的作用,您应该会想知道它下一步将做什么。在接下来的一年中,我期待着 Node 提供与现有的第三方支持库更好地集成。现在,许多第三方程序员已经研发了用于 Node 的插件,包括添加文件服务器支持和 MySQL 支持。希望 Node 开始将它们集成到其核心功能中。最后,我还希望 Node 支持某种动态页面模块,这样,您就可以在 HTML 文件中执行在 PHP 和 JSP(也许是一个 NSP,一个 Node 服务器页)中所做的操作。最后,希望有一天会出现一个 “部署就绪” 的 Node 服务器,可以下载和安装,只需将您的 HTML 文件放到其中,就像使用 Apache 或 Tomcat 那样。Node 现在还处于初始阶段,但它发展得很快,可能不久就会出现在您的视野中。 答案来源于网络

养狐狸的猫 2019-12-02 02:17:03 0 浏览量 回答数 0

回答

1、对不合理权限说“NO!” 发现了吗?许多应用在下载完成后首次启动过程中,都会弹出“三板斧”——获取地理位置信息、获取手机通讯录、获取存储权限。 令人不解的是,娱乐影音类应用获取通讯录信息想做什么?教育学习类应用又为什么要获取相册信息?应用真的有与这些权限对应的使用场景吗?遇到这样的问题我们应该如何应对呢? 华为软件安全工程部的专家称:用户对不合理权限应该果断说No!如果应用权限申请遭到拒绝而无法启用,则可以怀疑该应用存在恶意行为,可以直接对其进行卸载。 2、慎用公共WiFi 在公共场所,“蹭网”已经成为一种习惯,但在早些年的央视3·15晚会上就已经演示过黑客如何利用虚假WiFi盗取晚会现场观众手机系统、品牌型号、自拍照片、邮箱帐号密码等各类隐私数据。 那么,在公共区域使用公共WiFi该注意些什么呢? (1)手机用户连接免费WiFi可先通过一些可靠的手机管家类应用进行网络安全检测,对所链接的免费WiFi进行“DNS劫持”、“ARP欺骗攻击”、“虚假钓鱼WiFi”等多项安全检测,确保接入的免费WiFi安全无风险; (2)在公共场合使用免费WiFi时,不要登录没有密码的WiFi; (3)尽量不要在公共WiFi下网购或登录网银、第三方支付平台,防止用户个人信息、重要账号、密码泄露等。 (4)不使用一些破解WiFi密码的手机工具,谨防被此类工具盗取隐私。 3、安装靠谱的安全防护类应用 选择一款知名、靠谱的安全防护类应用安装在手机上,但如果你的手机本身自带安全防护类软件,则可以不再另外下载应用。 手机拥有一款这样的软件,如同穿上了一套铠甲,好处颇多: (1)能有效拦截恶意软件的攻击; (2)能很好的保护手机隐私和网络账号的财产安全; (3)能自动识别诈骗、骚扰短信和电话,有效防止被骚扰; (4)可以限制后台自启和无故后台唤醒; (5)还能随时监控手机流量。 该类应用请尽量保持开启状态;用户需定期对手机查毒、杀毒;一旦手机发现了木马病毒,不要进行其他操作,一定第一时间对病毒进行查杀。 4、开启浏览器无痕浏览模式 在使用手机浏览器查询、阅览网页时,尽量启用“无痕浏览”,这样,浏览器便不会将访问过的任何网站添加到历史记录中,也不会记录用户曾经搜索的内容,更不会保存用户在线填写的任何表单信息,以保护个人隐私。 5、开启安全输入功能 如果您是华为手机用户,在输入密码的场景下,可以使用EMUI提供的安全输入功能。 在【手机设置-系统-语言和输入法中开启“安全输入”】即可,在这种场景下,当用户输入密码,手机会自动切换到系统提供的安全输入法。 安全输入法不会联想和记忆用户以往的输入,也不会收集用户的输入信息。在使用安全输入法的同时,系统会禁用后台截屏录屏功能,防止密码被非法截取,提升安全性。 但需要注意的是,部分应用会使用自己定制开发的输入方式,这时安全输入法可能不会生效。 6选择带有绿色应用标记的应用优先下载 在华为应用市场上,不难发现,有的应用名称后标记有一个绿色盾形标志(如下图),这类应用被称为“绿色应用”。 那么带有标记的绿色应用与普通应用之间有什么区别呢? 原来,这个绿色盾形标志是符合安卓绿色联盟应用体验标准的应用标识,这项标准涉及兼容性、稳定性、功耗、性能和安全五大方面,并在应用权限申请等与用户隐私安全相关的项目上着重发力,对应用行为进行了明确要求和严格限制。 华为应用市场率先根据安卓绿色联盟发布的最新标准——《安卓绿色联盟应用体验标准2.0》为应用打标上架进行检测,拥有这项标志,才意味着这是一款能够为用户带来放心舒心的体验、在品质和体验上都更胜一筹的“绿色应用”! 所以,我们在同类应用选择下载时,一定要认准“绿色盾形”标志,优先下载“绿色应用”。 上面的6大招式你都学会了吗?赶紧动手试试吧!这个3·15,让我们一起,手机天天安全、生活日日轻松

游客6j3ztv6vbre5k 2020-01-07 15:09:47 0 浏览量 回答数 0

回答

window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置######你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段######@吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!######@云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.######有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -######想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ######@Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.######@云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?######CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ######@云溪 : 加油######我就想用而已我有不是让人看我多厉害######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.######为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了 BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵.

kun坤 2020-06-05 13:16:50 0 浏览量 回答数 0

回答

"window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######<a href=""http://my.oschina.net/puras"" class=""referer"" target=""_blank"">@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置###### 你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段###### @吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!###### @云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.###### 有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -###### 想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ###### @Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.###### @云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?###### CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ###### @云溪 : 加油######我就想用而已~~我有不是让人看我多厉害~~######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~~~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.###### 为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了~~ BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵." ![image.png](https://ucc.alicdn.com/pic/developer-ecology/4c6836169d074e608530252736da036d.png)

python小菜菜 2020-06-02 17:32:44 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 本文讲解如何搭建一个基于OSS的移动应用数据直传服务并设置上传回调。 背景 快速搭建移动应用直传服务介绍了如何快速搭建一个基于OSS的移动应用数据直传服务。但这一方案有个问题:对于Android/iOS移动应用来说,只需要申请一次STS凭证,就能多次使用该STS凭证上传数据到OSS。这就导致应用服务器无法得知用户上传了哪些数据 ,作为该app的开发者,就没法对应用上传数据进行管理。为此OSS提供了上传回调方案。 原理介绍 上传回调的原理如下图所示: OSS在收到Android/iOS移动应用的数据(上图中步骤5)和在返回用户上传结果(上图中步骤6)之间,触发一个上传回调任务,即第上图中步骤5.5,先回调用户服务器,得到应用服务器返回的内容,然后将此内容返回给Android/iOS移动应用。详情请参见Callback API文档。 上传回调的作用 通过上传回调让用户应用服务器知道当前上传文件的基本信息。 返回的基本信息可以包含下表中一个或多个变量,返回内容的格式在Android/iOS上传时指定。 系统变量 含义 bucket 移动应用上传文件到OSS的哪个存储空间 object 移动应用上传文件到OSS后保存的文件名 etag 该上传的文件的ETag,即返回给用户的etag字段 size 上传文件的大小 mimeType 资源类型 imageInfo.height 图片高度 imageInfo.width 图片宽度 imageInfo.format 图片格式,如jpg、png等 通过上传回调设定自定义参数,达到信息传递的目的。 假如您是一个开发者,您想知道当前用户所使用的app版本、当前用户所在的操作系统版本、用户的GPS信息、用户的手机型号。您可以在Android/iOS端上传文件时,指定自定义参数,如下所示: x:version:指定APP版本 x:system:指定操作系统版本 x:gps:指定GPS信息 x:phone:指定手机型号 Android/iOS移动应用上传文件到OSS时附带上述参数,然后OSS把这些参数放到CallbackBody里发给应用服务器。这样应用服务器就能收到这些信息,达到信息传递的目的。 上传回调对应用服务器的要求 您必须部署一个可以接收POST请求的服务,这个服务必须有公网地址,如www.abc.com/callback.php,或者外网IP地址。 您必须给OSS正确的返回,返回格式必须是JSON格式,内容自定义。OSS会把应用服务器返回的内容,原封不动地返回给Android/iOS移动应用。详情请参见Callback API文档。注意 在移动应用端设置上传回调 要让OSS在接收上传请求时触发上传回调,移动应用在构造上传请求时必须把如下内容指定到上传请求里面: 要回调到哪个服务器(callbackUrl),如 http://abc.com/callback.php,这个地址必须是公网能够访问的。 上传回调给应用服务器的内容(callbackBody),可以是上述OSS返回应用服务器系统变量的一个或者多个。 假如您的用户服务器上传回调地址是http://abc.com/callback.php。您想获取手机上传的文件名称、文件的大小,并且定义了x:phone变量是指手机型号,x:system变量是指操作系统版本。 上传回调示例分以下两种: iOS指定上传回调示例:OSSPutObjectRequest * request = [OSSPutObjectRequest new]; request.bucketName = @"<bucketName>"; request.objectKey = @"<objectKey>"; request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"]; // 设置回调参数 request.callbackParam = @{ @"callbackUrl": @"http://abc.com/callback.php", @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}" }; // 设置自定义变量 request.callbackVar = @{ @"x:phone": @"iphone6s", @"x:system": @"ios9.1" }; Android指定上传回调示例:PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/octet-stream"); put.setMetadata(metadata); put.setCallbackParam(new HashMap<String, String>() { { put("callbackUrl", "http://abc.com/callback.php"); put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"); } }); put.setCallbackVars(new HashMap<String, String>() { { put("x:phone", "IPOHE6S"); put("x:system", "YunOS5.0"); } }); 应用服务器收到的回调请求 根据设定的不同URL和回调内容,应用服务器收到的回调请求会所不同,示例如下: POST /index.html HTTP/1.0 Host: 121.43.113.8 Connection: close Content-Length: 81 Content-Type: application/x-www-form-urlencoded User-Agent: ehttp-client/0.0.1 authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA== x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ== filename=test.txt&size=5&photo=iphone6s&system=ios9.1 更多内容请参见Callback API文档。 应用服务器判断回调请求是否来自OSS 如果您的回调服务器被人恶意攻击了,例如恶意回调您的应用服务器,导致应用服务器收到一些非法的请求,影响正常逻辑,此时您就需要判断回调请求是否来自OSS。 判断的方法主要是根据OSS给应用服务器返回的头部内容中 x-oss-pub-key-url和authorization这两个参数进行RSA校验。只有通过RSA校验才能说明这个请求是来自OSS。本文提供的示例程序有实现的示例供您参考。 应用服务器收到回调请求后的处理 应用服务器在校验这个请求是来自OSS后,指定回调给应用服务器的内容格式,如 filename=test.txt&size=5&photo=iphone6s&system=ios9.1 应用服务器就可以根据OSS的返回内容,解析得到自己想要的数据。得到这个数据后,应用服务器可以把数据存放起来,方便后续管理。 OSS如何处理应用服务器的返回内容 有两种情况: OSS将回调请求发送给应用服务器,但是应用服务器接收失败或者访问不通,OSS会返回给Android/iOS移动应用203的状态码,但是数据已经存放到OSS上了。 应用服务器接收到OSS的回调请求,并且正确返回了,OSS会返回给Android/iOS移动应用状态码200, 并把应用服务器返回给OSS的内容原封不动地返回给Android/iOS移动应用。 示例程序下载 示例程序只是完成了如何检查应用服务器收到的签名, 您需要自行增加对应用服务器收到回调内容的格式解析 。 Java: 下载地址:单击这里。 运行方法:解压后运行java -jar oss-callback-server-demo.jar 9000。9000是运行的端口,可以自己指定。 说明 这个jar例子在java 1.7运行通过,如果有问题可以自己依据提供的代码进行修改。这是一个maven项目。 PHP: 下载地址:单击这里 运行方法:将解压包部署到Apache环境下,因为PHP本身语言的特点,某些数据头部的获取会依赖于环境。请参考例子根据实际环境进行修改。 Python: 下载地址:单击这里。 运行方法:解压后直接运行python callback_app_server.py即可,程序自实现了一个简单的http server,运行该程序可能需要安装rsa的依赖。 Ruby版本: 下载地址:单击这里。 运行方法: ruby aliyun_oss_callback_server.rb。

2019-12-01 23:13:23 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站