首页 文章 精选 留言 我的

精选列表

搜索[React Native],共8625篇文章
优秀的个人博客,低调大师

云原生(cloud native)是什么,怎么理解

很多人都会问“到底什么是云原生”,对此,CNCF 官方大使、阿里云容器平台高级技术专家张磊曾经做过精彩的解释。 实际上,云原生是一条最佳路径或者最佳实践。更详细的说,云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。 因此,云原生其实是一套指导进行软件架构设计的思想。按照这样的思想而设计出来的软件:首先,天然就“生在云上,长在云上”;其次,能够最大化地发挥云的能力,使得我们开发的软件和“云”能够天然地集成在一起,发挥出“云”的最大价值。 所以,云原生最大的价值和愿景,就是认为未来的软件,会从诞生起就生长在云上,并且遵循一种新的软件开发、发布和运维模式,从而使得软件能够最大化地发挥云的能力。说到了这里,你也可以思考一下为什么容器技术具有革命性? 其实,容器技术和集装箱技术的革命性非常类似,即:容器技术使得应用具有了一种“自包含”的定义方式。所以,这样的应用才能以敏捷的、以可扩展可复制的方式发布在云上,发挥出云的能力。这也就是容器技术对云发挥出的革命性影响所在,所以说,容器技术正是云原生技术的核心底盘。 云原生的技术范畴 云原生的技术范畴包括了以下几个方面: 第一部分是云应用定义与开发流程。这包括应用定义与镜像制作、配置 CI/CD、消息和 Streaming 以及数据库等。 第二部分是云应用的编排与管理流程。这也是 Kubernetes 比较关注的一部分,包括了应用编排与调度、服务发现治理、远程调用、API 网关以及 Service Mesh。 第三部分是监控与可观测性。这部分所强调的是云上应用如何进行监控、日志收集、Tracing 以及在云上如何实现破坏性测试,也就是混沌工程的概念。 第四部分就是云原生的底层技术,比如容器运行时、云原生存储技术、云原生网络技术等。 第五部分是云原生工具集,在前面的这些核心技术点之上,还有很多配套的生态或者周边的工具需要使用,比如流程自动化与配置管理、容器镜像仓库、云原生安全技术以及云端密码管理等。 最后则是 Serverless。Serverless 是一种 PaaS 的特殊形态,它定义了一种更为“极端抽象”的应用编写方式,包含了 FaaS 和 BaaS 这样的概念。而无论是 FaaS 还是 BaaS,其最为典型的特点就是按实际使用计费(Pay as you go),因此 Serverless 计费也是重要的知识和概念。 MBaaS(Mobile Backend as a Service),简称 BaaS FaaS(Function as a Service) 总的来说,云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。除了容器、Kubernetes、Service Mesh等当前比较有代表性的技术,很多企业也在边缘计算方面开展了很多工作 基础设施向云演进的意义 其实,传统的应用所依赖的基础设施正在经历一个向云演进的过程,在此过程中,为我们提供了两个非常重要的优点。 第一个优点是基础设施的一致性和可靠性。同样一个镜像,无论是在美国打开,在中国打开,还是在印度打开都是一样的。并且其中的 OS 环境对于应用而言都是一致的。而对于应用而言,它就不需要关心容器跑在哪里,这就是基础设施一致性非常重要的一个特征。 第二个优点即这样的镜像本身就是自包含的,其包含了应用运行所需要的所有依赖,因此也可以漂移到云上的任何一个位置。 此外,云原生的基础设施还提供了简单、可预测的部署和运维能力。由于现在有了镜像,应用还是自描述的,通过镜像运行起来的整个容器其实可以像 Kubernetes 的 Operator 技术一样将其做成自运维的,所以整个应用本身都是自包含的行为,使得其能够迁移到云上任何一个位置。这也使得整个流程的自动化变得非常容易。 应用本身也可以更好地扩容,从 1 个实例变成 100 个实例,进而变成 1 万个实例。最后,我们可以通过不可变的基础设施来快速部署周围的管控系统和支撑组件。因为,这些组件本身也是容器化的,是符合不可变基础设施理论的组件。这些就是不可变基础设施为用户带来的最大优点。 本文转载自https://mp.weixin.qq.com/s/lbXH0Zk89A9Sf-yy8oveDA

优秀的个人博客,低调大师

Android Native禁止使用系统私有库详解

系统私有库指的是,存放在android系统/system/lib/和/vendor/lib下面,但是Android NDK中没有公开API的lib库。 从Android N开始(SDK >= 24),通过dlopen打开系统私有库,或者lib库中依赖系统私有库,都会产生异常,甚至可能导致app崩溃。具体可以阅读官方文档说明。 这个变更会有怎样的影响呢? 曾经的美好 在以前,在ndk层面,我们是可以使用一些hack的手段得到系统的私有api的。 比如,你想使用虚拟机中的一些内部符号,在N以下版本,你可以这么搞 void *handle = dlopen("libart.so", RTLD_NOW); void *originFunc = dlsym(handle, "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE"); 这样你就能得到art::Thread::DumpJavaStack的函数指针,然后愉快地调用它了。 晴天霹雳 但是到了N以后, void *handle = dlopen("libart.so", RTLD_NOW); // 没问题,返回了handle指针。 void *originFunc = dlsym(handle, "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE"); // 失败!得到的originFunc为空! 这就很奇怪了,我们能够得到handle指针,就说明libart.so是找到了。但是为什么libart.so中却没有找到art::Thread::DumpJavaStack的符号呢? 看一下内存映射表,我们发现了一个有趣的东西 7de5d4d000-7de5d4e000 r-xp 00000000 fe:00 774 /system/fake-libs64/libart.so 7de5d4e000-7de5d4f000 r--p 00000000 fe:00 774 /system/fake-libs64/libart.so 7de5d4f000-7de5d50000 rw-p 00001000 fe:00 774 /system/fake-libs64/libart.so ... ... 7de6a04000-7de6feb000 r-xp 00000000 fe:00 1414 /system/lib64/libart.so 7de6feb000-7de6ffa000 r--p 005e6000 fe:00 1414 /system/lib64/libart.so 7de6ffa000-7de6ffd000 rw-p 005f5000 fe:00 1414 /system/lib64/libart.so 难怪,我们知道dlopen参数为libart.so的话,系统会先找到/system/fake-libs64/libart.so,而不是/system/lib64/libart.so。 而/system/fake-libs64/libart.so又是什么鬼?从名字上看,就知道他是个假的libart。在系统源码文件art/libart_fake/README.md中,我们找到了对他的解释, A fake libart made to satisfy some misbehaving apps that will attempt to link against libart.so. 这就是为了以防你们这些图谋不轨(misbehaving)的APP们做一些奇怪的事而专门设的套啊! 只要你自己的lib库依赖了libart.so或者试图打开libart.so,在linker查找libart.so时,因为fake-libs路径被设置在了查找路径表的靠前处,就会先找到/system/fake-libs64/libart.so,而不是真正的/system/lib64/libart.so。 设置fake-libs代码: @ frameworks/base/core/java/android/app/LoadedApk.java public static void makePaths(...) { ... // Add fake libs into the library search path if we target prior to N. if (aInfo.targetSdkVersion <= 23) { outLibPaths.add("/system/fake-libs" + (VMRuntime.is64BitAbi(aInfo.primaryCpuAbi) ? "64" : "")); } ... } 而这个/system/fake-libs64/libart.so的内容基本上的空的(art/libart_fake/fake.cc),所以在它里面当然什么符号都找不到啦~ 霸王硬上弓 既然如此,那我们在dlopen中直接指定lib的绝对路径总行了吧?像这样: void *handle = dlopen("/system/lib64/libart.so", RTLD_NOW); 可是很遗憾,它报了一个错: 01-11 13:16:10.413 19869-19869/com.patch.demo E/linker: library "/system/lib64/libart.so" ("/system/lib64/libart.so") needed or dlopened by "/data/app/com.patch.demo-1/lib/arm64/libbcpatch.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/data/app/com.patch.demo-1/lib/arm64:/system/fake-libs64:/data/app/com.patch.demo-1/base.apk!/lib/arm64-v8a", permitted_paths="/data:/mnt/expand:/data/data/com.patch.demo"] 也就是说,你被允许访问的路径(包含ld_library_paths、default_library_paths、permitted_paths)只有 /data/app/com.patch.demo-1/lib/arm64 /system/fake-libs64 /data/app/com.patch.demo-1/base.apk!/lib/arm64-v8a /data /mnt/expand /data/data/com.patch.demo 所以,试图访问/system/lib64/下的libart.so当然是不行的啦。 真是魔高一尺道高一丈啊。 至此,我们算是知道了Google封杀在ndk中访问系统私有库的方法。本质是在linker中加入一系列校验机制来做限制。linker作为最基础的lib库链接器,所有链接行为都会被限制住。 缓兵之计 不过,在Android N,你可以指定APP的sdk为API级别23或更低。那么,对于以下灰名单中的lib,仍然可以正常使用: // TODO(dimitry): The grey-list is a workaround for http://b/26394120 --- // gradually remove libraries from this list until it is gone. static bool is_greylisted(const char* name, const soinfo* needed_by) { static const char* const kLibraryGreyList[] = { "libandroid_runtime.so", "libbinder.so", "libcrypto.so", "libcutils.so", "libexpat.so", "libgui.so", "libmedia.so", "libnativehelper.so", "libskia.so", "libssl.so", "libstagefright.so", "libsqlite.so", "libui.so", "libutils.so", "libvorbisidec.so", nullptr }; 这样的话,每次使用dlopen或者链接以上lib都会打印出一个警告,然后仍然正常执行原有功能。 同时Google也声明了,在将来的版本会将这些lib的支持也一并移除。因此,这只是提供了一个让你尽快在代码中去除相关依赖的过渡期。 可见,不久的将来就无法愉快地使用系统的非公开符号了。 突出重围 那我们真的就没办法了吗? 也不是绝对的,Android限制的只是dlopen这个途径,而我们访问内存是随心所欲的:) 方法就是,通过内存映射表找到libart.so的真实起始位置: 7de6a04000-7de6feb000 r-xp 00000000 fe:00 1414 /system/lib64/libart.so 7de6feb000-7de6ffa000 r--p 005e6000 fe:00 1414 /system/lib64/libart.so 7de6ffa000-7de6ffd000 rw-p 005f5000 fe:00 1414 /system/lib64/libart.so 然后在加载地址起始位置手动解析libart.so的elf格式,提取出所需符号的位置信息。相当于你自己实现linker原本的查找逻辑。 当然,这种遍历内存解析elf的实现是比较复杂的。因此,这一次Google算是封死了一大波底层hack的手段。 不过,网上仍然有很多绕过这个限制的方式,大家有兴趣的可以自己发掘一下。 也可以来这里与我们共同讨论技术

优秀的个人博客,低调大师

native程序异常crash 定位解决方案

Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下。 该目录需要ROOT权限才能够访问。所以为了访问该路径,手机必须先ROOT破解。jni或者java 代码崩溃的信息都被记录。该目录下会有九个tombstones_0(1-9),生成的崩溃信息会循环写入 该文件中,测试之前可以讲所有的文件删除,就可以得到唯一的一个崩溃日志。生成的文件 记录了详细的堆栈信息。 为了拷贝到电脑上,需要通过adb shell进入手机终端,然后su,获取root权限,接着 拷贝文件到sdcard上,退出adb shell,之后,通过adb pull /sdcard/tombstone_00 E: 拷贝到E盘 该文件详细记录了代码崩溃时候的具体信息,包括了崩溃的堆栈,如果能够获取到该信息,就可以通知堆栈了解崩溃点的信息,但是一般情况下,我们看不到该文件。 当我们发现/data目录为空的情况下,实际上表示我们没有root访问权限,(root是最高级的访问权限,而不是启动的时候的访问文件的权限,这个权限需要对android手机进行权限进行破解) 注意 查看tombstons文件,发现很多情况下,没有提供源码错误的函数名称和源码的错误行号,可以通过ndk-stack.exe 程序对崩溃日志再次定位 $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump tombstons 例子 D:\Development\Android\android-ndk-r10b\ndk-stack.exe–sym armeabi-v7a –dump E:\docs\tombston_01 > E:/detail.txt 附录: 不同的手机遇到空指针的时候,处理的方式是不一样的,小米手机直接闪退,而华为平板依然能够直接运行,跳过崩溃的错误,说明测试多种机型的重要性。 参考 http://cmzx3444.iteye.com/blog/1463035 本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1408644,如需转载请自行联系原作者

优秀的个人博客,低调大师

AI Native 组织转型:岗位,不再以“人为单位”

三年前,一个电商运营的一天是这样的:早上看数据,上午写文案,中午排推送,下午盯竞品,晚上写周报,运气不好加班到十点。招聘 JD 上五项职责,对应一个人,一份工资,一个工号,清清楚楚。今天她九点半到工位,发现活儿都被干完了。数据是系统跑的,异常自动归因;文案大模型一晚上出了十版,等她挑;推送已经按人群策略排好;竞品动态是一个爬虫加一个摘要模型盯的;连周报都在飞书里自己长了出来。留给她的,是”哪版文案更对味””这个异常要不要上报”这类判断——以及,出了问题她签字负责。她的工作变轻了。但她比谁都清楚这不是什么好消息:五项职责被拆走了四项半,剩下这半项,还算不算一个岗位?公司还愿不愿意为它保留一个完整的编制?这道题现在摆在几百万白领面前。过去一年多,互联网行业的”优化”一轮接一轮,公告里”AI 提效”取代”寒冬”成了新的高频词;同一家公司,往往这边在优化,那边挂着百万年薪的 AI 岗位急招。更耐人寻味的是接下来这两条消息。据媒体统计,全球大厂以”AI 替代人力”为由裁员的规模预计达到 23 万人;而 Gartner 在 2026 年初预测:到 2027 年,因 AI 裁掉客服的公司里,会有一半重新把人招回来。裁员还在进行,回撤已经被预告。两条消息放在一起,像是行业提前写好了自己的检讨书——大多数公司其实没想明白,AI 动的根本不是人力成本,也不是某几个具体的岗位,而是岗位这个东西本身:那个”一个人负责一摊事”的、我们默认了一百年的组织基本单位。要看明白这件事,得先回答一个更基础的问题:岗位,当初是怎么来的?

优秀的个人博客,低调大师

Kubernetes and Cloud Native Meetup (北京站)资料下载

一站式开发者服务,海量学习资源0元起,尽在开发者分会场 毫无疑问,Kubernetes 已经成为容器领域当之无愧的事实标准。除了 Google、Microsoft 等技术巨擘们在容器领域里多年的博弈外,国内的 BAT、滴滴、蚂蚁、今日头条等技术大厂,也都已将容器和 Kubernetes 列入未来的战略重心,无数中小型企业也正走在容器化的道路上。 Kubernetes 项目将会成为企业服务器端技术栈中标准的一环,并连同它所推崇的容器化理念,成为广大后端技术人员和开发者的一门必修课。 活动出品人 易立阿里云资深技术专家 何征宇(梁纥)蚂蚁金服研究员 张磊阿里巴巴高级技术专家,CNCF 官方大使,Kubernetes 项目维护者 最全的活动资料哦,快快领取 直播视频全程链接:https://yq.aliyun.com/live/878 分享一:使用Kub

优秀的个人博客,低调大师

利用Wrap Shell Script定位Android Native内存泄漏

前提条件 Android版本为8.0以上 环境配置 cd到/src/main目录下,新建shell目录,同时shell目录下配置与libs目录下相同平台的目录,如下app下的层级结构,可看到shell/lib下具有与libs下相同的平台目录结构 ── AndroidManifest.xml ├── java ├── libs │ ├── arm64-v8a │ └── armeabi-v7a ├── main.iml ├── res └── shell └── lib ├── arm64-v8a └── armeabi-v7a 分别在shell/lib/目录下建立一个wrap.sh脚本文件,编辑wrap.sh文件并写入如下内容 #!/system/bin/sh LIBC_DEBUG_MALLOC

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册