1.前10大开源开发工具
2.Spring容器之refresh方法源码分析
3.软件开发工具都有哪些(软件工程工具有哪些)
4.一种好用、容器容器易上手的迁移迁移小程序IDE
5.量化投资之工具篇:Backtrader从入门到精通(3)Cerebro代码详解
6.如何用 Flutter 实现混合开发?闲鱼公开源代码实例
前10大开源开发工具
Visual Studio Code 是一款强大的开源源代码编辑器,适用于 Windows、工具macOS 和 Linux。源码它内置了对多种语言,容器容器如 JavaScript、迁移迁移帝国cms采集源码TypeScript、工具Node.js 的源码支持,并提供了丰富的容器容器扩展生态系统,适用于其他语言,迁移迁移如 C++、工具C#、源码Java、容器容器Python、迁移迁移PHP、工具Go。其轻量级的设计和功能的丰富性使其在我们的前名中位居榜首。由于其在功能、用户体验和扩展方面的卓越表现,以及团队定期发布的更新,VS Code 成为了最佳编辑器之一,值得一试。
Budibase 是一款开源低代码平台,为构建内部工具和自定义业务应用程序提供了一切所需,如仪表板、管理面板、审批应用程序、客户门户等。它允许用户在几分钟内将数据和流程转变为强大的内部工具。Budibase 在竞争中脱颖而出的原因包括用户可以在自己的基础设施上自行托管应用程序,创建内部和外部工具,以及自动化任务,如电子邮件通知、触发 webhook、发送报告等。此外,Budibase 导出的单页应用程序提供了更好的用户体验。
Vercel 是一款面向前端开发人员的部署和协作平台,为他们提供了构建高性能网站和应用程序的综合工具。Vercel 使开发人员能够托管可即时部署和自动扩展的网站和 Web 服务,无需任何配置。其愉快的用户体验、高性能和 UI 设计是 Vercel 在前名中的原因之一。此外,它在 Github 上拥有最大和发展最快的社区之一,活跃和热情的论坛为用户提供了支持。
Oh My Zsh 是一个开源的、社区驱动的框架,用于管理 Zsh 配置。它捆绑了超过 个插件,简化了软件开发人员的工作。Oh My Zsh 为命令行使用人员提供了更丰富的流通比例公式源码体验,并定期更新和发布开源开发工具的新功能。用户可以访问社区贡献的主题,以获取最新功能和改进。
GitLab 是一个集成的软件开发平台,旨在简化 DevOps 生命周期。它提供了从版本控制到服务台、设计管理、机密管理和时间跟踪的一系列工具。GitLab 的强大之处在于它在包管理方面的功能,允许团队轻松打包依赖项、管理容器和构建工件。此外,GitLab 的私有、容器和包注册表功能开箱即用,与 GitLab 的源代码管理和 CI/CD 管道无缝协作。这使得 GitLab 成为开源开发者世界中的重要平台。
Supabase 是一个开源的 Firebase 替代品,为开发者提供了一个“一套开源工具,组合在一起以构建无缝的开发人员体验”。它包含许多功能,如身份验证、存储和即将发布的功能。Supabase 的闭源竞争对手 Firebase 的 API 调用费用使许多开发者转向 Supabase,因为它提供了更经济的解决方案。
PostHog 是一款企业级产品分析平台,提供了不同的工具,旨在帮助企业更好地了解产品成功的关键因素。PostHog 提供了会话记录、热图和功能标志等功能,这些功能在产品分析领域是独一无二的。PostHog 的社区和团队反应迅速,乐于助人,为用户提供支持和帮助。
Snyk 是一款开发者优先的安全平台,旨在安全地构建云原生应用程序,并鼓励开发人员在开发过程中修复开源漏洞。Snyk 的优势在于其自动化的安全漏洞修复功能和对软件组合分析的简化,使开发过程更加高效和安全。
Prisma 是一个开源的下一代 ORM,提供了一个全面的解决方案,包括 Prisma Client、Prisma Migrate 和 Prisma Studio。Prisma 提供了一个将数据库转化为 REST/GraphQL API 的 ORM,为前端和后端开发提供了类型安全的 API。它采用的 SDL 优先方法使构建过程更加直观和高效。
Storybook 是一款 UI 开发工具,通过隔离组件简化了开发过程。它允许开发人员专注于单个组件的开发,而无需启动复杂的开发堆栈、输入特定数据或在应用程序中导航。Storybook 与各种流行的武汉到苏州源码前端框架(如 React、Vue 和 Svelte)集成,并提供了丰富的社区支持。它还支持组件的可视化展示,使开发人员更深入地了解可用组件,减少了重复工作。
Spring容器之refresh方法源码分析
Spring容器的核心接口BeanFactory与ApplicationContext之间的关系是继承,ApplicationContext扩展了BeanFactory的功能,提供了初始化环境、参数、后处理器、事件处理以及单例bean初始化等更全面的服务,其中refresh方法是Spring应用启动的入口点,负责整个上下文的准备工作。 让我们深入分析AbstractApplicationContext#refresh方法在启动过程中的具体操作:准备刷新阶段: 包括系统属性和环境变量的检查和准备。
获取新的BeanFactory: 初始化并解析XML配置文件。
customizeBeanFactory: 个性化BeanFactory设置,如覆盖定义、处理循环依赖等。
loadBeanDefinitions: 通过解析XML文件,创建BeanDefinition对象并注入到容器中。
填充BeanFactory功能: 设置classLoader、表达式语言处理器,增强Aware接口处理,添加AspectJ支持和默认系统环境bean等。
激活BeanFactory后处理器: 分为BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,分别进行BeanDefinition注册和BeanFactory增强。
注册BeanPostProcessors: 拦截Bean创建的后处理器,按优先级注册。
初始化其他组件: 包括MessageSource、ApplicationEventMulticaster和监听器。
初始化非惰性单例: 预先实例化这些对象。
刷新完成: 通知生命周期处理器并触发ContextRefreshedEvent。
以上是refresh方法在Spring应用启动流程中的关键步骤。以上内容仅为个人理解,如需更多信息,可参考CSDN博客链接。软件开发工具都有哪些(软件工程工具有哪些)
软件开发涉及多种工具,以下是一些常见的软件开发工具:1.集成开发环境(IntegratedDevelopmentEnvironment,IDE):IDE是一种集成了编码、调试、构建和部署等功能的开发工具。常见的IDE包括Eclipse、VisualStudio、IntelliJIDEA等,它们提供了代码编辑器、调试器、编译器和构建工具等功能。
2.文本编辑器:文本编辑器是开发人员常用的工具之一,用于编辑源代码文件。一些流行的文本编辑器包括SublimeText、Atom、主力与散户源码VisualStudioCode等。它们提供了语法高亮、代码补全、代码导航等功能,方便开发人员编写和编辑代码。
3.版本控制工具:版本控制工具用于管理和追踪软件开发过程中的代码变更。最常用的版本控制工具是Git,它允许开发人员协同工作、跟踪代码修改、合并代码等。其他版本控制工具包括SVN和Mercurial等。
4.调试工具:调试工具用于帮助开发人员在开发过程中识别和修复软件中的错误和问题。常见的调试工具有调试器(如GDB和Xcode调试器)和日志分析工具(如Logcat和ELKStack)等。
5.自动化构建工具:自动化构建工具用于自动化软件构建过程,包括编译、打包、部署等。一些常见的自动化构建工具有ApacheMaven、ApacheAnt、Gradle和Make等。
6.测试工具:测试工具用于验证软件的功能和性能,以确保其质量和稳定性。常见的测试工具包括单元测试框架(如JUnit和pytest)、集成测试工具(如Selenium和JUnit)和性能测试工具(如ApacheJMeter和Gatling)等。
7.虚拟化和容器化工具:虚拟化和容器化工具用于创建和管理虚拟环境和容器,以支持应用程序的部署和管理。一些流行的虚拟化和容器化工具包括Docker、Kubernetes和VirtualBox等。
8.项目管理工具:项目管理工具用于协调和组织软件开发项目,包括任务分配、进度跟踪、问题追踪等。常见的项目管理工具有Jira、Trello和Asana等。
除了上述列举的工具,还有很多其他的软件开发工具可供选择,具体选择取决于开发需求、编程语言和个人偏好等因素。
以上内容是由猪八戒网精心整理,希望对您有所帮助。
一种好用、易上手的小程序IDE
在数字时代的编程新宠:IDE的力量 在这个数字世界里,编程不再仅仅是概念,而是推动创新的引擎。集成开发环境(IDE),作为程序员的得力伙伴,正在重塑我们的开发流程。IDE集成了众多强大功能,从文本编辑的优雅呈现到部署流程的无缝衔接,一切只为提升开发效率。 IDE:一站式开发解决方案 IDE,python 选股源码全称集成开发环境,是编程的得力助手。无论是小型项目还是大型Web应用,它就像一个全能工具箱,内含文本编辑器、语法高亮、定制界面、编译器、版本控制、调试器和自动化构建部署等,几乎涵盖了开发者的所有需求。 为什么选择IDE? IDE的价值在于其高效和便捷。它能智能地将代码转化为机器语言,大大节省时间。更重要的是,IDE提供丰富的编程语言选项,让你可以根据项目需求自由选择,真正做到即开即用。 微信小程序的开发新选择 虽然微信小程序官方工具并未明确标注为IDE,但优质的第三方工具如FinClip的FIDE(FinClip Integrated Development Environment)弥补了这一空白。FIDE界面简洁,上手门槛低,专为微信小程序开发者打造,提供了强大的调试和开发功能。 FIDE的魅力与实用功能 FIDE具有实时预览、真机模拟、代码导入、版本管理等特性。它支持二维码登录,预览设置自定义,还内置官方插件管理,让开发者轻松开发。更重要的是,FIDE支持跨平台兼容性检查,轻松迁移代码,甚至能将小程序转化为App,进一步拓展用户触达。 定制与扩展:FIDE的未来FinClip的FIDE不仅是工具,更是一份可定制的开发方案。他们计划开放源码,企业可以借此实现定制化,从Logo到UI设计,打造出更贴近品牌形象的小程序开发工具。此外,FinClip的容器技术使得小程序在各种设备上都能流畅运行,而后台管理系统则提供了统一的运维保障。
结语 在这个快速发展的数字时代,IDE就像一座桥梁,连接开发者与无限可能。FIDE的出现,让小程序开发变得更简单、更专业。对于寻求高效开发体验的你,FIDE无疑是一个值得尝试的利器,开启你的编程新旅程吧!量化投资之工具篇:Backtrader从入门到精通(3)Cerebro代码详解
在深入理解backtrader的工具使用中,Cerebro作为核心控制器,其代码详解至关重要。它负责整个系统的协调和管理,虽然看似复杂,但实质上是将任务分发给其他组件如策略、数据源和分析器。让我们通过源代码解析来逐步揭示其工作原理。
首先,Cerebro的初始化主要设置公共属性,并接受一系列参数,这些参数在元类中统一处理,通过**kwargs传递。初始化过程中,实际上并未做太多工作,而是为后续操作准备了基础结构。
数据源的添加是通过cerebro.adddata方法,它可以处理普通数据和resample/replay数据,这个过程涉及对数据源的筛选和处理后加入到Cerebro的datas列表中。
策略的添加同样简单,只是将策略类及参数存储在strats容器中,策略会在run时实例化。
Cerebro的run函数是整个流程的驱动器,它根据传入的参数,按照时间驱动数据运行,同时协调策略、分析器和观察者等组件协同工作。run函数的代码复杂,但关键在于它如何管理和调度各个组件。
最后,Cerebro通过plot方法实现可视化输出,其自身并不直接进行绘图,而是调用plotter模块来完成。
总的来说,虽然Cerebro的代码看起来复杂,但实际上它的作用是连接各个组件,提供一个框架让策略和数据处理得以高效执行。理解Cerebro的工作原理后,后续理解其他部件如data feeds的运作就更为顺畅了。下文我们将转向数据类的解析,进一步探讨数据的管理与驱动机制。
如何用 Flutter 实现混合开发?闲鱼公开源代码实例
阿里妹导读:具有一定规模的 App 通常有一套成熟通用的基础库,尤其是阿里系 App,一般需要依赖很多体系内的基础库。那么使用 Flutter 重新从头开发 App 的成本和风险都较高。所以在 Native App 进行渐进式迁移是 Flutter 技术在现有 Native App 进行应用的稳健型方式。
今天我们来看看,闲鱼团队如何在这个实践过程中沉淀出一套独具特色的混合技术方案。
现状及思考
闲鱼目前采用的混合方案是共享同一个引擎的方案。这个方案基于这样一个事实:任何时候我们最多只能看到一个页面,当然有些特定的场景你可以看到多个 ViewController ,但是这些特殊场景我们这里不讨论。
我们可以这样简单去理解这个方案:我们把共享的 Flutter View 当成一个画布,然后用一个 Native 的容器作为逻辑的页面。每次在打开一个容器的时候我们通过通信机制通知 Flutter View 绘制成当前的逻辑页面,然后将 Flutter View 放到当前容器里面。
这个方案无法支持同时存在多个平级逻辑页面的情况,因为你在页面切换的时候必须从栈顶去操作,无法再保持状态的同时进行平级切换。举个例子:有两个页面A,B,当前B在栈顶。切换到A需要把B从栈顶 Pop 出去,此时B的状态丢失,如果想切回B,我们只能重新打开B之前页面的状态无法维持住。
如在 pop 的过程当中,可能会把 Flutter 官方的 Dialog 进行误杀。而且基于栈的操作我们依赖对 Flutter 框架的一个属性修改,这让这个方案具有了侵入性的特点。
新一代混合技术方案 FlutterBoost
重构计划
在闲鱼推进 Flutter 化过程当中,更加复杂的页面场景逐渐暴露了老方案的局限性和一些问题。所以我们启动了代号 FlutterBoost(向C++ Boost库致敬)的新混合技术方案。这次新的混合方案我们的主要目标有:
跟老方案类似,新的方案还是采用共享引擎的模式实现。主要思路是由 Native 容器 Container 通过消息驱动 Flutter 页面容器 Container,从而达到 Native Container与 Flutter Container 的同步目的。我们希望做到 Flutter 渲染的内容是由 Naitve 容器去驱动的。
简单的理解,我们想做到把 Flutter 容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。在 Native 侧我们只需要关心如果初始化容器,然后设置容器对应的页面标志即可。
主要概念
Native 层概念
Dart 层概念
关于页面的理解
在 Native 和 Flutter 表示页面的对象和概念是不一致的。在 Native,我们对于页面的概念一般是 ViewController,Activity。而对于 Flutter 我们对于页面的概念是 Widget。我们希望可统一页面的概念,或者说弱化抽象掉 Flutter 本身的 Widget 对应的页面概念。换句话说,当一个 Native 的页面容器存在的时候, FlutteBoost 保证一定会有一个 Widget 作为容器的内容。所以我们在理解和进行路由操作的时候都应该以 Native 的容器为准, Flutter Widget 依赖于 Native 页面容器的状态。
那么在 FlutterBoost 的概念里说到页面的时候,我们指的是 Native 容器和它所附属的 Widget。所有页面路由操作,打开或者关闭页面,实际上都是对 Native 页面容器的直接操作。无论路由请求来自何方,最终都会转发给 Native 去实现路由操作。这也是接入 FlutterBoost 的时候需要实现 Platform 协议的原因。
另一方面,我们无法控制业务代码通过 Flutter 本身的 Navigator 去 push 新的 Widget。对于业务不通过 FlutterBoost 而直接使用 Navigator 操作 Widget 的情况,包括 Dialog 这种非全屏 Widget,我们建议是业务自己负责管理其状态。这种类型 Widget 不属于 FlutterBoost 所定义的页面概念。
理解这里的页面概念,对于理解和使用 FlutterBoost 至关重要。
与老方案主要差别
前面我们提到老方案在 Dart 层维护单个 Navigator 栈结构用于 Widget 的切换。而新的方案则是在 Dart 侧引入了 Container 的概念,不再用栈的结构去维护现有的页面,而是通过扁平化 key-value 映射的形式去维护当前所有的页面,每个页面拥有一个唯一的 id。这种结构很自然的支持了页面的查找和切换,不再受制于栈顶操作的问题,之前的一些由于 pop 导致的问题迎刃而解。也不需要依赖修改 Flutter 源码的形式去进行页面栈操作,去掉了实现的侵入性。
实际上我们引入的 Container 就是 Navigator 的,也就是说一个 Native 的容器对应了一个 Navigator。那这是如何做到的呢?
多 Navigator 的实现
Flutter 在底层提供了让你自定义 Navigator 的接口,我们自己实现了一个管理多个 Navigator 的对象。当前最多只会有一个可见的 Flutter Navigator,这个 Navigator 所包含的页面也就是我们当前可见容器所对应的页面。
Native 容器与 Flutter 容器(Navigator)是一一对应的,生命周期也是同步的。当一个 Native 容器被创建的时候,Flutter 的一个容器也被创建,它们通过相同的 id 关联起来。当 Native 的容器被销毁的时候,Flutter 的容器也被销毁。Flutter 容器的状态是跟随 Native 容器,这也就是我们说的 Native 驱动。由 Manager 统一管理切换当前在屏幕上展示的容器。
我们用一个简单的例子描述一个新页面创建的过程:
这就是一个新页面创建的主要逻辑,销毁和进入后台等操作也类似有 Native 容器事件去进行驱动。
官方提出的混合方案
基本原理
Flutter 技术链主要由 C++ 实现的 Flutter Engine 和 Dart 实现的 Framework 组成(其配套的编译和构建工具我们这里不参与讨论)。Flutter Engine 负责线程管理,Dart VM 状态管理和 Dart 代码加载等工作。而 Dart 代码所实现的 Framework 则是业务接触到的主要 API,诸如 Widget 等概念就是在 Dart 层面 Framework 内容。
一个进程里面最多只会初始化一个 Dart VM。然而一个进程可以有多个 Flutter Engine,多个 Engine 实例共享同一个 Dart VM。
我们来看具体实现,在 iOS 上面每初始化一个 FlutterViewController 就会有一个引擎随之初始化,也就意味着会有新的线程(理论上线程可以复用)去跑 Dart 代码。Android 类似的 Activity 也会有类似的效果。如果你启动多个引擎实例,注意此时Dart VM 依然是共享的,只是不同 Engine 实例加载的代码跑在各自独立的 Isolate。
官方建议
引擎深度共享
在混合方案方面,我们跟 Google 讨论了可能的一些方案。Flutter 官方给出的建议是从长期来看,我们应该支持在同一个引擎支持多窗口绘制的能力,至少在逻辑上做到 FlutterViewController 是共享同一个引擎的资源的。换句话说,我们希望所有绘制窗口共享同一个主 Isolate。
但官方给出的长期建议目前来说没有很好的支持。
多引擎模式
我们在混合方案中解决的主要问题是如何去处理交替出现的 Flutter 和 Native 页面。Google 工程师给出了一个 Keep It Simple 的方案:对于连续的 Flutter 页面(Widget)只需要在当前 FlutterViewController 打开即可,对于间隔的 Flutter 页面我们初始化新的引擎。
例如,我们进行下面一组导航操作:
我们只需要在 Flutter Page1 和 Flutter Page3 创建不同的 Flutter 实例即可。
这个方案的好处就是简单易懂,逻辑清晰,但是也有潜在的问题。如果一个 Native 页面一个 Flutter 页面一直交替进行的话,Flutter Engine 的数量会线性增加,而 Flutter Engine 本身是一个比较重的对象。
多引擎模式的问题
因此,综合多方面考虑,我们没有采用多引擎混合方案。
总结
目前 FlutterBoost 已经在生产环境支撑着在闲鱼客户端中所有的基于 Flutter 开发业务,为更加负复杂的混合场景提供了支持,稳定为亿级用户提供服务。
我们在项目启动之初就希望 FlutterBoost 能够解决 Native App 混合模式接入 Flutter 这个通用问题。所以我们把它做成了一个可复用的 Flutter 插件,希望吸引更多感兴趣的朋友参与到 Flutter 社区的建设。在有限篇幅中,我们分享了闲鱼在 Flutter 混合技术方案中积累的经验和代码。欢迎兴趣的同学能够积极与我们一起交流学习。
扩展补充
在两个 Flutter 页面进行切换的时候,因为我们只有一个 Flutter View 所以需要对上一个页面进行截图保存,如果 Flutter 页面多截图会占用大量内存。这里我们采用文件内存二级缓存策略,在内存中最多只保存 2-3 个截图,其余的写入文件按需加载。这样我们可以在保证用户体验的同时在内存方面也保持一个较为稳定的水平。
页面渲染性能方面,Flutter 的 AOT 优势展露无遗。在页面快速切换的时候,Flutter 能够很灵敏的响应页面的切换,在逻辑上创造出一种 Flutter 多个页面的感觉。
项目开始的时候我们基于闲鱼目前使用的 Flutter 版本进行开发,而后进行了 Release 1.0 兼容升级测试目前没有发现问题。
只要是集成了 Flutter 的项目都可以用官方依赖的方式非常方便的以插件形式引入 FlutterBoost,只需要对工程进行少量代码接入即可完成接入。详细接入文档,请参阅 GitHub 主页官方项目文档。
Nocalhost 一款开源的基于 IDE 的云原生应用开发工具
Nocalhost,一款开源的基于IDE的云原生应用开发工具,允许开发者直接在Kubernetes集群中构建、测试和调试应用。
其提供VS Code和JetBrains等IDE插件,即使在集群内开发和调试,也能保持与本地开发一致的体验。利用即时文件同步功能,开发者无需重建映像或重启容器,即可即时同步代码更改。
Nocalhost由单个二进制CLI和IDE插件组成,无需服务器端组件,通过KubeConfig直接与Kubernetes集群通信,如同kubectl。
采用Nocalhost进行Kubernetes应用开发,可高效实现云原生应用构建。
集群内开发的优势包括即时文件同步,免去重建映像和重启容器的繁琐过程,实现高效协同开发。
Nocalhost兼容多种Kubernetes发行版,已通过实战验证。
欲了解更多信息,可访问官方网站和GitHub地址。关注公众号“莫扎特读源码”,获取最新开源项目及优秀项目架构设计实践。
Docker源码安装附内网镜像安装演示
系统版本要求源码包下载
官网下载地址(download.docker.com/lin...)
我这里已docker-...tgz该版本做演示
1.下载源码包文件到本地
2.通过远程连接工具(xShell、SecureCRT等将源码包文件上载到服务器自定义目录)
3.解压文件
4.配置docker为service服务
5.添加可执行权限
注:如遇到启动不成功可通过状态查询、/var/log/messages/运行日志或直接使用dockerd命令查看错误信息,如还解决不了建议服务器重启一下在运行docker启动命令
6.配置镜像加速
7.检查安装版本内网下载镜像
注:使用docker pull拉取镜像的时候需要网络,但是项目部署一般都是在内网。内网访问不了外网,所以需要在外网环境下把需要的镜像拉取下来打包,然后拷贝到内网,载入到内网的docker
1.在外网机器上拉取mysql镜像,可以看到外网的docker已经拉取了镜像。
2.将镜像打包成tar压缩包
3.将打包好的mysql镜像包通过远程工具下载到本地
4.拷贝到内网linux服务器并载入docker
docker基础命令使用(扩展)下载镜像:(hub.docker.com/search/官网镜像地址)
docker pull [IMAGE_NAME]:[TAG] #命令格式
docker pull mysql:8.0 #下载mysql8.0镜像(不指定默认下载最新版本)
查看当前镜像版本
docker -v #查看当前安装版本
docker version #查看版本信息
docker info #查看系统信息
docker images #查看当前镜像
docker search 镜像名 #搜索镜像
镜像、容器删除
docker rm 容器ID
docker rm 容器名字
docker rmi 镜像ID
docker rmi 镜像名
docker rmi -f 镜像ID #强制删除
创建网络及数据卷
docker volume create +数据卷名称
docker volume list #查看当前数据卷信息
docker network create -d bridge +网络名称
docker network ls #查看当前网络
docker inspect containername +id #查看容器的hash值
启动、关闭容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) #关闭所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) #开启所有容器
杂
docker inspect 容器ID (使用该命令重点关注容器ip) #查看容器/镜像元数据
docker exec #在运行的容器中执行命令
docker exec -it 容器ID /bin/bash #以交互模式开启伪终端
2024-12-23 00:00496人浏览
2024-12-22 23:202034人浏览
2024-12-22 22:391889人浏览
2024-12-22 22:352137人浏览
2024-12-22 22:052603人浏览
2024-12-22 21:30974人浏览
台灣「黃金男雙」李洋、王齊麟完成金牌二連霸,寫下奧運史上新紀錄,成為首次以相同組合連2屆獲得冠軍的羽球男雙。不過,回顧整個過程相當不容易,麟洋配在金牌戰面對世界第1的中國組合,雖然首局先拿下,但第2局
1.亚马逊的各种链接类型你了解吗?跟着跨境小可爱来解密吧2.有什么不花钱的推广方式吗?3.CPA广告联盟推广常用的网址以及辅助工具亚马逊的各种链接类型你了解吗?跟着跨境小可爱来解密吧 亚马逊链接类
1.Applicationä¸ç Context å Activity ä¸çContextåºå«2.另一个角度理解Android Context3.åå¦Androidå