PWA 起步于 Google,因此 Android 比 iOS 平台相比对其支持更加完善。 在 Samsung Internet 中,有一个称为 ambient badging 的功能。...当用户在主屏幕上安装 PWA 时,它会自动创建一个轻量级的 Android 应用程序包装器,因此该应用程序实际上出现在应用程序列表中,并且是真正的一等公民。...PWA 的核心是 Service Worker. 这是浏览器和服务器之间的代理层。 所有浏览器请求都通过它。...浏览器会认为它与网络资源一起工作,但实际上它被拦截了,而是从本地离线存储中检索结果。 开发人员可以在 isServiceWorkersReady 中检查不同浏览器的就绪情况。...在 iOS 11.3(2018 年 3 月 30 日)中,Apple 默默地添加了对 渐进式 Web 应用程序(PWA) 理念背后的一组基本新技术的支持。
摘要 在Android开发过程中,我们经常使用工作者线程,如AsyncTask和线程池。...在Android中,我们或多或少使用了工作者线程,比如Thread,AsyncTask,HandlerThread,甚至是自己创建的线程池,使用工作者线程我们可以将耗时的操作从主线程中移走。...然而在Android系统中为什么存在工作者线程呢,常用的工作者线程有哪些不易察觉的问题呢,关于工作者线程有哪些优化的方面呢,本文将一一解答这些问题。...工作者线程的存在原因 因为Android的UI单线程模型,所有的UI相关的操作都需要在主线程(UI线程)执行 Android中各大组件的生命周期回调都是位于主线程中,使得主线程的职责更重 如果不使用工作者线程为主线程分担耗时的任务...对于优先级很低的线程,可以设置THREAD_PRIORITY_LOWEST 其他特殊需求,视业务应用具体的优先级 总结 在Android中工作者线程如此普遍,然而潜在的问题也不可避免,建议在开发者使用工作者线程时
举例而言,获得 2018 年图灵奖的三位资深学者中,两位早已投身业界,其中 Geoffrey Hinton 在谷歌,Yann LeCun 在 Facebook。...此外,2010 年一所大学中投身业界的教授被引率平均仅有 4%,而 2018 年这一比例上升到了 20%左右。...而在加拿大的大学样本中,多伦多大学流失了最多的 AI 教授,包括 6 位终身教授和 3 位助理教授。 ? 图 3. 流失终身或预备终身 AI 教授数量排名前 15 的北美大学。...除了科技公司之外,摩根士丹利、美国运通和摩根大通等金融行业的大公司也在挖 AI 教授。还值得注意的一点是,在投身业界的 221 位投身业界的教授中,大约 45%的人去了上市公司。 ?...分析表明,高质量的大学教育对 AI 创业者而言非常重要。AI 教授在提供相关教育过程中扮演了举足轻重的角色。 接下来,研究人员继续探讨 AI 教授的流失对创业的影响。
注:本文需要有一定的 PWA 基础 1. 什么是 PWA?...我们的做法如下图所示: 构建的时候,把整个项目用到的资源输出到一个 list 中,然后 inline 到 sw.js 里面 当 sw install 时,就会把这个 list 的资源全部请求并进行缓存...替代离线包 PWA 与离线包本质上是一样的,都是离线缓存 正好,我们 PC 客户端的离线包系统年久失修,在这个契机下,我们启动了使用 PWA 替换离线包的方案!...我们把上述功能集成到了一个 webpack 插件当中,在构建的时候就自动输出 sw.js 并把相关内容注入到 html 文件中,该插件正准备开源哈~ 5. 未来 未来对于 PWA 还能做些什么?...关注 PWA 回到最开始,PWA 是一项令人兴奋的技术,但是浏览器兼容有限,因此期待并关注 PWA 技术的发展是很有必要的! 当然,能推动就更好了!比如推动我们的 X5 内核尽快支持新特性。
将 Angular Service Worker 想象为安装在最终用户的 Web 浏览器中的前向缓存(Forward Cache)或内容交付网络 (CDN) 边缘。...Service Worker 响应 Angular 应用程序对本地缓存中的资源或数据的请求,而无需等待网络。 与任何缓存一样,Service Worker 缓存具有内容过期和更新方式的规则。...在任何给定时间,Service Worker 可能在其缓存中拥有多个版本的应用程序,并且可能同时为它们提供服务。...例如,一个 index.html 文件可能有一个引用 bundle.js 的 标记,它可能会尝试从该脚本中调用函数 startApp()。...一个 JS 包可能会引用许多惰性块,并且惰性块的文件名对于应用程序的特定构建是唯一的。 如果正在运行的版本 X 的应用程序尝试加载延迟块,但服务器已经更新到版本 X + 1,则延迟加载操作将失败。
最近看了一篇文章:Tracking Down “Invisible” OOM Kills in Kubernetes,其讲述的是由于内存不足导致Pod中的进程被killed,但Pod并没有重启,也没有任何日志或...kernel: oom_reaper: reaped process 18661 (helm), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB 在上述文章中,...大意就是只有Pod中的PID 1被OOM kill时才会出现OOMKilled状态,并重启容器,此时我们可以清除地看到OOM信息。...但在出现问题的场景中,被kill的并不是PID 1,这就导致容器或kubernetes无法记录相关信息,且不会重启容器。这种情况下只能通过查看系统日志才能发现相关信息。...出现"被隐藏的OOM"的原因可能是Pod中单独启动了多个独立的进程(进程间无父子关系),在我的场景中就是单独启动了一个脚本进程,当内存不足的时候会导致kill脚本进程。
内存区域的详细信息列表 查看进程相关信息 以数字命名的文件夹中存储着进程的相关信息。...,包括: cmdline 用于开始进程的命令 cwd 当前进程工作目录的一个符号链接 environ 可用进程环境变量的列表 exe 正在进程中运行的程序链接 fd/ 这个目录包含了进程打开的文件描述符...mem 进程在内存中的内容 status 进程的状态信息 statm 进程的内存使用信息 limits 进程的软限制,硬限制等信息 maps 进程的内存区域映射信息 stack 当前进程的内核调用栈信息...这里我们可以查看/proc/pid下的limits中的文件描述符限制数量: sed -n "/open/p" limits Max open files 1024...每一项的具体内容含义,以及在实际中的应用,本文不做过多阐述,后面的文章将会继续介绍。/proc/pid下的内容对于问题的定位也十分地有帮助,本文只有简单举例,更多的使用也会在后续文章中不断应用。
然而要么是因为玩的太久忘记了,要么是没有想到,很多游记对于这部分信息的记录寥寥。其实这部分信息的记录并不复杂,正好有朋友问我,因此就专门写篇文章把自己的一些经验分享一下。...接下来会按照的旅行的不同阶段详细介绍一下其中的一些。 ? ? 出行准备 攻略游记查看 出行前往往都需要花费大量的精力来做准备,尤其是自由行的时候。...不过可以用下面的链接直接访问:https://m.ctrip.com/webapp/you/comment/list/XXX-flight.html;将链接中的XXX更换为你打算乘坐的航班号,就可以看到相关航班的点评信息了...出行过程 在出行的过程中主要就是衣食住行相关的问题了。导航的话基本主要用百度地图,大部分时候还是比较靠谱可信的。...有人会选择整理一下照片,有人会写个游记;我更多的会以攻略的角度为主来写。写游记既是对旅行的一次回顾,又可以通过文字加图片记录下更多的旅行信息,方便后来人了解。
String是不可变的吗?是的!真想变?也行~ 我们都知道,String是不可变对象,即一旦创建,那么就不能改变它的状态。对此,我们来分析一波。...String的内部构造 小心翼翼进入String的内部,我们可以看到它是一个final类,那么没人能继承它,很好,很丁克。...然后直接看向它的灵魂,一个char数组,也是final,于是我们知道它怎么不可变了。...除非new一个新的String。...通过反射真的可以改变 2、直接改动value会导致其它相同值的String对象也被改变(所以可以猜测底层实际上用的同一份数据?)
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...Java和C++的一个不同点是, 在Java中不可能直接操作对象本身,所有的对象都由一个引用指向,必须通过这个引用才能访问对象本身,包括获取成员变量的值,改变对象的成员变量,调用对象的方法等。...其实,Java中的引用和C++中的指针在概念上是相似的,他们都是存放的对象在内存中的地址值,只是在Java中,引用丧失了部分灵活性,比如Java中的引用不能像C++中的指针那样进行加减运算。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。那么在这几个成员中, value比较特殊,因为他是一个引用变量,而不是真正的对象。
在 @Import 注解的属性中可以设置需要引入的类名,例如 @AutoConfigurationPackage 注解上的 @Import(AutoConfigurationPackages.Registrar.class...的实例,要等到 @Configuration 注解中相关的业务全部都处理完了才会调用; 如果该类实现了 ImportBeanDefinitionRegistrar 接口,Spring 容器就会实例化该类...@AutoConfigurationPackage 将当前配置类所在包保存在BasePackages的Bean中。供Spring内部使用 ?...@Import表示要导入的一个或多个@Configuration类 我们来看下value方法源码中的注释: Configuration,ImportSelector,ImportBeanDefinitionRegistrar...ArtisanSelector返回的类的全限定类名,即为导入到容器中的组件全类名 ---- @Import 实现了ImportBeanDefinitionRegistrar接口的组件 【ImportBeanDefinitionRegistrar
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...内存结构如下图所示: [图片] Java和C++的一个不同点是, 在Java中不可能直接操作对象本身,所有的对象都由一个引用指向,必须通过这个引用才能访问对象本身,包括获取成员变量的值,改变对象的成员变量...其实,Java中的引用和C++中的指针在概念上是相似的,他们都是存放的对象在内存中的地址值,只是在Java中,引用丧失了部分灵活性,比如Java中的引用不能像C++中的指针那样进行加减运算。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。那么在这几个成员中, value比较特殊,因为他是一个引用变量,而不是真正的对象。
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。...其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变。 String 真的 "不可变 " 吗? 来看下面这个例子。...关于 substring 在 JDK 各个版本的差异可以看这篇文章《注意:字符串substring方法在jkd6,7,8中的差异》,也可以去看 substring 的各个版本的源码。...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?
一、发现问题 下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。...四、解决方案 1.重启了6台中问题比较严重的5台机器,先恢复业务。保留一台现场,用来分析问题。 2.查看当前的tomcat线程pid 3.查看该pid下线程对应的系统占用情况。...java线程栈 sudo -u tomcat jstack -l 384>/1.txt 7.查询5中对应的线程情况,发现都是gc线程导致的 8.dump java堆数据 sudo -u tomcat...即我们代码中对该对象的处理方式是错误的,定位到问题。...五、代码分析 我们代码中有一块是这样写的 这是加解密的功能,每次运行加解密都会new一个BouncyCastleProvider对象,放倒Cipher.getInstance()方法中。
React Dev Tools 在开发原生js的时候,我们经常使用浏览器自带的开发者工具,它足以帮助我们查看和调试js中变量的各种信息,但是对于react框架来说,因为它是采用动态渲染生成的代码结构,...useHooks Hooks是 React 中的新增功能,可让我们在不编写类的情况下使用状态和其他 React 的功能。...Storybook 让我们能够轻松地将技术文档包含在我们的设计系统中,从而使开发组件变得更加简化。...Formik 表单处理是网页开发经常会遇到的问题,而Formik是一个可以在React中构建表单的组件。...ESLint ESLint是一个静态分析工具,它可以非常快速地定位发现项目代码中的问题,并且可以自动修复大部分问题。它采用语法感知技术,不会在修改的时候引入其它的错误。
什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。...当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。...Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。 还是看代码比较直观。...先看不可变对象 不可变对象的例子 先说明一点is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。...可变类型传递的是引用,不可变类型传递的是内容。
具有相同值的不可变对象在Python中始终具有相同的哈希值....第二个:异常处理中的return def some_func(): try: return from_try finally: return from_finally...Output: >>> some_func() from_finally 说明: 当在 "try...finally" 语句的 try 中执行 return, break 或 continue 后...当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的....对象销毁的顺序是造成所有不同之处的原因.
Python中所有类型的值都是对象,这些对象分为可变对象与不可变对象两种: 不可变类型 float、int、str、tuple、bool、frozenset、bytes tuple自身不可变,但可能包含可变元素...在Python中,不可变对象,浅拷贝和深拷贝结果一样,都返回原对象: import copy t1 = (1, 2, 3) t2 = copy.copy(t1) t3 = copy.deepcopy...(t1 is t2) # True print(t1 is t3) # True print(id(t1), id(t2), id(t3)) # 输出相同值 对于可变对象,则会产生新对象,只是若原对象中存在可变属性.../字段,则浅拷贝产生的对象的属性/字段引用原对象的属性/字段,深拷贝产生的对象和原对象则完全独立: l1 = [1, 2, 3] l2 = l1.copy() print(l1 is l2) # False...,这里name属性的地址一样 p3.id.name = "p3" print(p1.id.name) # 还是p2 Python中可使用以下几种方式进行浅拷贝: 使用copy模块的copy方法
具有相同值的不可变对象在Python中始终具有相同的哈希值....第二个:异常处理中的return def some_func(): try: return from_try finally: ...return from_finally Output: >>> some_func() from_finally 说明: 当在 “try…finally” 语句的 try 中执行 return...当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的....对象销毁的顺序是造成所有不同之处的原因.
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 ? 可以看出 String 类是 final 类型的,String 不能被继承。...Java中的String真的是不可变吗? 所以说,这里的字符串并不是可变,只是变更了字符串引用。...关于 substring 在 JDK 各个版本的差异可以看这篇文章《注意:字符串substring方法在jkd6,7,8中的差异》,也可以去看 substring 的各个版本的源码。...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。 ?...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?
领取专属 10元无门槛券
手把手带您无忧上云