热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Devoxx法国2012天3

2012年法国Devoxx的最后一天!醒来并不容易,我必须喝一杯咖啡才能使我前进(而且我从不这样做)。GregTruty的移

2012年法国Devoxx的最后一天! 醒来并不容易,我必须喝一杯咖啡才能使我前进(而且我从不这样做)。

我没有对此做笔记,因为我的计算机重新启动了🙃

移动正在成为企业的战略:它开始等同于CRM,门户和其他资产。
在开发方面,移动开发类似于传统开发。 但是,有几个区别:开发周期非常短(几周),因为上市时间非常快,硬件制造商发布的频率更高,导致市场非常分散,我们回到了客户端服务器体系结构。

  • 本机应用程序需要企业中一套全新的技能。 碎片化强制针对特定平台并忘记其他平台。 其他要求也不断提高(安全性,可伸缩性,企业体系结构中的集成...)。
  • 另一种方法是采用标准的网络路线。 实际上,熟悉就在这里,有关此主题的经验已经可以得到。 不幸的是,我们无法利用平台的本机功能。
  • 两全其美的方式是混合方法,其工具来自Apache Cordova(以前称为PhoneGap)。 在这种情况下,唯一的缺点是性能比本地应用程序慢(有时,至少)。
  • 最后,如果我们可以写一个通用的API然后编译到每个平台以生成本机应用程序怎么办? 这是跨平台的编程模型。 我们在这里从压模机及其同类中获得帮助。

IBM最近收购了Worklight,这是一个可以解决所有先前策略的框架,还可以处理安全性,SSO和集成等问题。 Worklight提供了一个IDE,一个服务器,运行时组件和一个基于Web的控制台来监视移动应用程序和基础结构。

这个家伙还不错,有一些有趣的信息,但是早上9点的销售热闹使我感到遗憾的是没有以后再上床睡觉。

Patrick Chanezon在“艺术家”中开发者的肖像

这个故事是关于为顶级公司工作的JavaEE开发人员George的。 无论如何,经过3年的工作,AZERTY项目才投入生产:GUI不好,IT主管很高兴,用户讨厌它。 乔治很高兴,他热爱复杂性,没有人了解系统的工作原理,救了他。 乔治被提升为项目经理,然后是项目总监。 有一天,当乔治参加OSS会议时,他听到了新的名词:Hibernate,敏捷等等。 但是,他不再学习那些新技术,而是不再学习高尔夫球和编码。 由于他现在有了预算,因此他将敏捷教练带入了自己的公司:它自然地失败了。 最终,他成为IT总监....用户拒绝了他的新项目AZERTY 3.0,并且用户在背后使用了Google Apps。 他的老板现在要求使用iPhone和Android应用程序。 他无法编写代码,最终被解雇。

乔治学会打高尔夫球时发生了什么? 最近两年,每15年发生一次范式转换:

  • 在60年代,有大型机(服务器端)
  • 在80年代,它是客户端-服务器架构
  • 在90年代,网络再次将所有内容都放到了服务器端
  • 2010年是Cloud,HTML5和移动设备; 感觉就像我们再次把东西放回客户手中

标准分析师将Cloud划分为Saas,PaaS和IaaS作为金字塔。 对于开发人员来说,PaaS是最重要的,这与操作系统类似。 现在的趋势是服务开发。 有趣的是,尽管平台变得更加工业化,但软件开发已朝着Craft.io发展。

从历史上讲,Cloud开始于满足其自身需求(例如Google,Amazon等)的消费者网站。 如今,IaaS成为主流,但您仍然需要构建和维护自己的软件基础架构。 例如,去年亚马逊失败时,有3家创业公司幸免于难,这些创业公司都是自己构建平台的。
软件开发过程即将改变。 企业对消费者的应用正变得越来越像高级定制,每天都有新的应用出现。 某些应用程序的预期寿命甚至很短(例如Devoxx France应用程序)。 因此,必须并行缩短开发周期,从而缩短敏捷性。 通过切断基础架构,云使我们变得更加敏捷。

云基础架构的主要风险是供应商锁定。 Cloud Foundry通过提供开放源代码产品解决了该问题。 例如,AppFog使用Cloud Foundry并添加了PHP。 同样,您可以创建自己的私有云以将其托管在自己的基础架构上。

有两件事需要学习:

  • 软件正变得时尚,设计规则
  • 使用最好的工具完成手头的任务
  • 学习,学习,学习!

总之,乔治买了一部iPhone,每天写一点代码,阅读编程书,再次感到高兴! 此外,他不再打高尔夫球。 其余的取决于你...

哇,男人和会议都很不错。 如果您错过了主题演讲,请尽快在Parleys上查看。

尼尔·福特(Neal Ford)对法国的抽象干扰

作为开发人员,我们考虑抽象,因为如果没有抽象,我们将不得不处理0和1,而我们什么也做不了。 但是,通过使用抽象,我们有时会忘记它们只是抽象,而倾向于将它们视为真实的东西。

让我们看一个简单的文档。 您如何确保巧克力蛋糕食谱可以保存数百年? 将其放在Word文档中? 可能不是...获得文本格式会更好,但是会引发编码问题。 如果您是政府机构,赌注会更高。 目标不是保存文档,而是信息。

例如,emacs磁带仍然可用,但是没有什么可读取的。

[省略了其他有趣的示例,因为我输入的速度不够快,整个过程都是基于图片的]

  • 第一课,不要把抽象误认为是真实的东西
  • 第2课,了解您平时的抽象水平
  • 第3课,一旦内部化,就很难切断抽象
  • 第4课,抽象既是墙壁又是监狱
  • 第5课,不要说出暴露底层细节的事物
  • 第6课,好的API不仅是高级的还是低级的,它们都同时存在
  • 第7课,概括80%的案例,并摆脱其余的案例
  • 第8课,不要被抽象所吸引

Dietzler定律:使用诸如Acces(或否定上下文工具)之类的工具,用户想要的东西中有80%非常简单,难以实现10%,而最后10%则无法实现,因为您必须超越抽象,并且无法完成。

任何工具(例如Maven)都具有临界点。 因为一旦您超越了这一点,那将永远不再是美好的。 这时,您必须进行剪切和运行,但是这会很困难,因为您将被抽象所囚禁。

哇! 我错过了第一天的Neal会议,当时我对此感到后悔。 现在,我更加后悔。 先前的主题演讲将标准提高了很多,尼尔(Neal)以鲜艳的色彩通过了它。 任何想要进行真实表演(具有启动内容)的人都应该参加Neal的会议。 此外,你甚至可以得到他妻子的巧克力蛋糕食谱🙂

Kotlin(Dmitry Jemerov)

新语言似乎每时每刻都在蓬勃发展,但是去年,企业(红帽的锡兰,JetBrains的Kotlin和Google的Dart)宣布了这种新语言。 这是我与Kotlin成立之初非常接近的人进行演讲的机会。

JetBrain的座右铭是快乐地发展。 除IntelliJ的IDEA外,还有其他产品(TeamCity,PHPStorm等)。 Kotlin是:静态类型,在JVM,OSS上运行,由JetBrains在社区的帮助下开发。 为什么选择Kotlin? 因为IntelliJ的IDEA是基于Java的,尽管它不是最合适的,但其他语言也不是更好。
目标包括:

  • 全面的Java互操作性
  • 编译和运行时与Java一样快
  • 比Java更简洁,但可以防止更多错误(例如NPE)
  • 简单(无博士学位)

可以在不同的领域找到性能:没有自动装箱,在生成的代码中没有恒定的运行时开销以及较低的编译时间。 Kotlin很容易学习; libray开发者和“标准”开发人员(例如Scala)之间没有区别。 它侧重于从其他语言中获得的最佳实践。 这没有开创性的功能,只有常识。

[遵循一堆代码段]
最初,它看起来像Scala一样, fun替换def :有类似Scala的构造函数,vals和vars,traits,逆序类型/名称声明(由双冒号分隔)

扩展函数看起来足够好:您不仅可以扩展类型,还可以扩展函数而无需费心继承整个九码。 同样,在Kotlin中,函数是一等公民(总之,您会使用类型推断获得闭包)。 有趣的是,默认情况下it是函数文字的第一个参数(例如Groovy)。

Kotlin的一个有趣功能是使用dollar符号引用Strings中的变量,以便在运行时替换变量。

运算符重载的形式是有限的:只有一部分运算符可用于重载,因为这需要通过专门定义的函数来完成。 例如,要重载- ,您需要ovveride minus函数。

为了管理可空性,Kotlin允许使用? 操作员仅允许安全呼叫(再次针对Groovy)。 例如,如果该列表是下面的代码片断返回列表大小 0 null :

f.listFiles()?.size()?:0

问号将返回类型标记为可为空,否则,则不可为空,编译器会抱怨; 它使核心更加简洁,并为处理null值提供了安全网。

Kotlin还提供模式匹配(例如在Scala中,语法非常相似)。 Kotlin是Groovy构建器的改进,它是类型安全的:例如,HTML构建器在编译时检查有效性!

更多功能包括:

  • 内联函数
  • 一流的委托使委托更容易,无需编写任何代码,由编译器负责
  • 模块化是语言的一部分
  • 申报地点差异[???]
  • 还有更多的东西[这使我无休止,向后兼容会发生什么]

这不是一个有趣的演讲,但演讲者中缺少一些激情。 从其他语言中获取什么有用的策略是一种非常有趣的策略。 至少,您可以立即获得许多优点。 但是,我看到一个大问题,JetBrains如何计划在达到临界质量时确保向后兼容。 演讲者的回答是:

JetBrains打算允许编译器扩展。

让您想到的食物(直接来自演讲者):如果JetBrains知道正在开发Ceylon,则可能不会启动该项目。

发现JavaFX

好的,考虑到IBM的售前谈话,我有点受虐狂,但是我对GUI确实很感兴趣,也许JavaFX的下一版本是合适的(考虑到Flex的命运)。

演讲开始时,发言人要求消除对JavaFX的所有误解( 好主意 )。 JavaFX是Swing,SWT和HTML5的补充。 在Android和iOS上,它有效! JavaFX生态系统的最后一个补充是JavaFX场景构建器。

JavaFX的目标是实现:

  • 客户端API
  • 模块化架构(用于移动和嵌入式)
  • Java中UI的迁移解决方案(自Swing以来已有10年以上)
  • 先进的开发工具
  • 跨平台解决方案(跨操作系统和硬件类型)

JavaFX 1.0收到了开发人员的不好反馈,他们不想学习新的脚本语言。 当前版本是JavaFX,自2011年起可在Windows上使用(Mac OS和Linux即将完成GA)。 在工具方面,提供了NetBeans 7.1、7.2和Scene Builder。 社区已经照顾了Eclipse中的一些集成插件,而JetBrains已联系以将JavaFX开发集成到IntelliJ IDEA中。

当前实现的目标包括:包含在OpenJDK中(通过OpenJFX)和JDK的通用许可证。 对于后者,请注意JavaFX将成为JDK 8的JavaSE的一部分。Oracle的政策是将JSR提交给JCP进行标准化。

使用JavaFX,您可以使用所需的工具,从所有Java功能(泛型,注释等)中受益,甚至可以使用在JVM上运行的首选语言。 在JavaFX 2中,FXML标记语言可用于UI定义(就像Flex中的MXML一样)。 或者,您仍然可以通过编程方式对UI进行编码。 FXML可以与脚本语言(例如Javascript和Groovy)结合在一起。

在图形方面,体系结构(Prism)使得可以利用最佳的硬件加速。 新的窗口工具包称为Glass。 它的使用使访问高级功能(缓冲等)成为可能。 支持的媒体格式包括VP6,H.264,MP3和AAC(非常类似于支持HTML5媒体格式)。 此外,JavaFX嵌入了WebKit渲染引擎,因此可以在Java应用程序中解释HTML和Javascript。 Java和WebKit部件之间可以进行双向通信。 使用WebKit,您可以免费获得多平台测试。

通过将JavaFX与现有用户界面无缝集成,可以将Swing和SWT逐步迁移到JavaFX。 Swing / SWT的最大区别是使用CSS设置JavaFX组件样式的能力,因此您可以在Web和JavaFX上重用相同的样式表。 附带说明一下,OpenJFX周围已经有一个社区。 其他贡献包括Eclipse和OSGi插件,DataFX(数据源访问),ScalaFX和GroovyFX,框架(已经!)和JFXtras(其他UI控件和扩展)。

上周,宣布了JavaFX Scene Builder版本。 它是GUI的可视化开发工具; 支持拖放。 与NetBeans集成是开箱即用的,但是可以与其他IDE一起使用(因为它是独立工具)。 它完全用JavaFX开发,可用于Mac OS X和Windows。

路线图如下:

  • 2012年底,JavaFX 2.0.1与JDK 7捆绑在一起
  • 2012年第一季度,适用于Windows的JavaFX 2.1 GA(Linux测试版)
  • 2012年中,针对所有操作系统的GA
  • 2013年中,JDK 8中包含JavaFX 3.0

[对话以3层演示结尾,以JavaFX开发的带有CSS的GUI和Scene Builder演示了拖放操作。

单声道扬声器,我不得不打架睡觉。 从更积极的角度来看,这不是销售活动,但有一些有趣的信息。 演讲者还介绍了使用硬件加速计运行JavaFX的iPad。

Charles Fry用Guava进行Java缓存

该会话是关于缓存的内部工作的。 Guava是低级Java库的OSS。 包com.google.common.cache包含simpel缓存。

当发生缓存未命中时, LoadingCache自动加载条目,而不会发生Cache 。 委托CacheLoader接口知道如何加载条目。

内部并发处理与ConcurrentHashMap非常相似。 如果在加载期间发生异常,则必须捕获运行时异常并重新抛出检查的IOException 。 对于短暂的键,构建器上的流畅的weakKeys()方法允许使用弱引用。 契约中,为了允许垃圾收集器收集缓存的值,使用了softKeys()方法(但是存在性能问题,不鼓励使用此方法)。

  • 为了允许逐出缓存,可以将缓存生成器设置为最大大小; 条目将以近似图像LRU的顺序逐出(逐出在写操作中)。
  • 或者,如果逐出策略基于权重,则使用Weighter接口指定权重计算,并在构建缓存加载器时进行传递。 在这种情况下,驱逐是完全相同的。
  • 另一种策略是空闲时间,它是通过构建器上的expireAfterAccess()方法实现的
  • 最后,通过构建器上的expireAfterWrite()方法提供了expireAfterWrite()逐出策略

下一步是能够分析缓存:只需使用recordStats()方法即可。 CacheStats由缓存对象上的stats()方法返回,并允许查询。 分析了缓存后,现在可以调整配置:您必须创建一个包含键值对的字符串,并将其传递给构建器。

Guava还提供围绕缓存的事件侦听器模型。 构建器允许通过removalListener进行侦听器注册,该removalListenerRemovalListener实例为参数。 当然,通过注册多个对象,您可以拥有多个侦听器。 每当条目被收回(无论使用哪种策略)时,都会调用侦听器。 默认情况下,侦听器被同步调用:如果它们是重量级的,建议将它们设为异步(或将它们包装在RemovalListener.asynchronous )。

番石榴还提供了两种不同的刷新缓存的方法:

  • 通过在缓存上调用reload()方法来手动刷新,该方法可以异步实现
  • 通过在构建器上调用refreshAfterWrite()方法来自动刷新

应实现异步刷新以避免阻塞用户线程。 只需使用Java的FutureTask ...

有时,缓存加载器同时加载一组条目比一次加载一组条目效率更高。 这是通过重写CacheLoader.loadAll()LoadingCache.getAll() 。 后者不会阻止对同一密钥的多个请求。

到目前为止,缓存是由缓存加载器提供的。 但是,我们如何处理特定的用例来手动填充缓存? 只需使用ifPresent()来查询是否存在键,然后使用put()来将条目放入缓存中,就可以ifPresent()完成此操作。

为了实现非加载缓存,我们根本不需要CacheLoader 。 调用CacheBuilder.build() ,您将获得一个这样的缓存。 为了禁用缓存,当前的规范方法是将maximumSize设置为0。这可以在运行时通过CacheBuilderSpec类完成。

可以使用Cache.asMap()在类似地图上迭代缓存。 所有ConcurrentMap写入操作均已实现,但不建议使用它们(改用CacheLoaderFuture )。 请注意,两个get()方法具有相似的签名,但它们是不同的( Map.get()实际上是“如果存在则获取”)。

未来的工作包括:

  • AsyncLoadingCacheget(K)上返回Future
  • 一个CacheBuilder.withBackingCache()提供缓存分层(例如L1 + L2)
  • 性能优化

一个很好的谈话。 纳夫说。 不过,对于Java缓存API(JSR)中缺乏Guava团队的知识感到有些失望。

Java开发人员的.Net,灵感来自Cyrille Martraire和Rui Carvalho

这个话题是关于什么是.Net以及Java缺少什么?

对于Java开发人员来说,.Net就像死亡的皮肤。 从更理性的角度来看,首先让我们记住,Sun和Microsoft首先是邻居。

  1. Sun创建了一个名为Java的一流工具,并考虑将其放入Mosaic中(那些是applet)
  2. 微软以自己的替代产品ActiveX做出了回应。 除此之外,它还添加了ActiveX服务器页面(ASP)以动态生成HTML页面
  3. Sun回答了JavaEE平台的问题。
  4. 对Sun的成功感到失望的是,Microsoft依次交付了.Net。

值得注意的是,Sun花费了很长时间才发布Java5。.Net框架与2.0版中的Java功能相匹配,并且很快超越了它们。 .Net原理完全相同; 只有一些编码标准有所不同。 .Net从一开始就是多语种(C =,Iron Ruby,Iron Python,F =,...)。 为了引诱C ++程序员,Microsoft提供了低级API。

C =中的某些功能确实比Java中更好(或更准确地说,已经可用):

  • 通过yield关键字,我们可以避免在返回此类结果时创建临时集合
  • 范围通过in关键字提供
  • 函数是一等公民,并且可以使用内联函数(lambda,然后猜测运算符 )。 而且,lambdas参数是静态类型的。 因此我们可以创建流畅的API
  • C#提供匿名对象,而Java使我们创建新类型,尽管我们只需要在一个地方
  • LINQ是类似于SQL的DSL
  • 使用C#4,动态特性使开发人员可以使用特殊的可扩展类型(不是动态代理) [我承认,除了不需要时无需创建数据结构的好处之外,我还不了解所有这些信息]
  • Razor是HTML和C#之间的混合语法

在可移植方面,Apache Mono项目使开发人员可以在Linux和Mac OS X上进行编程和部署。但是,为了最大程度地实现脱钩,请不要忘记使用专有产品(例如SQL Server)。 尽管.Net被视为专制的,但存在替代社区,例如Alt.Net。

作为结论,以下是一些消息:

  • 不要忘记Java不是JVM,在保持环境的同时寻找其他语言
  • 语言只是发展的一小部分。 开发人员共享更多(模式,GUI,xDD等)

得益于两位演讲者(真正令人愉快的团队合作,伙计们)之间精心安排的舌头交流,您可以清楚地看到通过缩小差距带来的好处。

这是Devoxx Fr 2012的结尾。明年,大家见,谢谢大家在这里度过的所有美好时光。

翻译自: https://blog.frankel.ch/devoxx-fr-2012/3/




推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
author-avatar
徐涛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有