几个浏览器的使用体验

前段时间,由于对 Chrome 即将成为 IE 和一些隐私方面的担忧。也顺便想尝试一下其他的浏览器,于是稍微换了一些。当然,现在又回到了 Chrome。简单记录一下。 Brave 浏览器,基于 Chromium 网页浏览器由 Mozilla 项目的联合创始人、JavaScript 的创造者布蘭登·艾克宣布。宣称阻止网站跟踪器和移除侵入式网络广告。确实可以拦截部分广告,另外有一个特色的挖矿钱包功能,就是你可以选择接受通知,看广告,然后获取虚拟货币。界面也很漂亮。但是这个东西。速度嘛,感觉也没有宣称的那么快。毕竟。道理上说不通啊。你都8倍了。Google 的开发者是水瓶不行么。。另外,这个玩意对于国内网站不够友好。国内的电商网站,比如淘宝,京东,等,基本上默认情况下,打开全屏幕空白。。因为认为是广告。 Firefox 浏览器,火狐浏览器,基本上算是最后一个有点名气的非 Chromium 内核的浏览器了。其实我觉得还不错,我比较喜欢内置的画中画功能。另外,速度上,我感觉也不差。但是Firefox 的 收藏夹功能真的是。。乱。最大的问题就是因为内核的原因。核心工作用的几个网站都用不了。因为开发网站的同学不兼容。不得不放弃。手机上也可以。 Edge 浏览器,微软基于 Chromium 的浏览器,界面风格我还挺喜欢,首页的广告默认存在,可以通过安装其他tab插件来解决屏蔽,支持 Chrome 扩展,但是注意,功能很不完善,很多同步功能都是废的。设置里面很多时间,你选了其他选项,根本看不到变化,刷新一下,发现好像生效了。有个特色的Collection功能。如果专门查个什么资料,还是有点用,但是可以通过新建一个收藏夹的文件夹来基本替代。手机版内置去广告插件,还不错。Mac 和 iOS 的一些联动基本没有,比如你想吧手机上的发给电脑,只能通过 Airdrop 了。不能直接发送。和 Chrome 不同。还需要完善,可以跟进。多等几个版本看看。 Safari 浏览器,其实挺简洁的,就是没啥进步,和公司不少网站也是不兼容的。插件也基本用不了,这点非常蛋疼,还要安装 App,阅读列表功能非常喜欢。可以同步。 除了 Safari,其他几个浏览器的手机上也是有阅读列表这个功能的,但是很奇怪,大家都不支持同步,只在手机上保存。估计觉得可以通过收藏夹替代。另外,不少浏览器对于手机和PC/Mac的收藏夹是默认分开的,叫做移动设备书签。这个真的是。有点难用。 除了 Edge 的手机 App 还是很好用的,其他的几个浏览器手机上的体验都很奇怪,比如最基本的 Tab 页新增。最好的还是 Safari。 综上所属,目前依然 Chrome。新时代的 IE。

2020-03-07 · 1 min · bystander

2019 年终总结

2019 年很快过去了,以前有大把时间的时候没有感觉,而现在,时光如流水,怎么也抓不住。2019年,心情复杂。 失去的一年 这一年,爷爷生病离世,改变了很多事情。人生很短,一定要珍惜当下,珍惜眼前人。很多东西都可以通过各种方式重新获得。但是,生病,亲人,这些总是无能为力。今年体检,查出来中老年常见的血脂高。当然目前只高一点点,2019年,工作太忙。锻炼的很少。2020年,一定要坚持锻炼。 给父母也申请了体检,查下来没有什么大问题,心里放下很多,然后该买的保险,也给父母和自己都买了一些。虽然保额不算太高,但是也是有个保障。 对 XX 失去期待,基本上放弃了想要改变的想法,眼看着一些人被浪费,效率被无限拉低,还是多从自己做起,一屋不扫,何以扫天下。 得到的一年 2019年也是得到的一年,看了10多本书,心理学和经济学,还有一些小说,学习了一些新的技术, Golang,分布式事务,也成为 Seata 的 Committer,另外也对外做了一次500人场的Service Mesh 技术分享,之后又分享了几次。 这一年,在杭州买了房,定了居。买了Air Pods 2,买了 Surge Mac,拿到了公司5年陈的戒指,顺便买了一个手链,买了很多家居用品,自己处理家里的大大小小的事情,自己在家做饭,吃火锅。 这一年,也去湖北参加了同学的婚礼,在武大促膝长谈,跟朋友们在家里吃了饭,也去青海团建,吃了让人念念不忘的炕锅羊肉。 年末的时候,买了开言英语的年费会员,目前坚持了一个多月了。刚开始很简单,有了一点信心。2020年继续努力。 职业上有了晋升,当然也只是title变更,不过是资本家的把戏,不过5年,也算给自己一个交代。 寻求改变的一年 这一年,尝试体验了一些新的产品,比如彻底放弃了余额宝,转为银行的产品。比如开始熟练微信支付。 这一年,工作上,试图寻求突破,但很多事情并非能以人的意志为转移,并没有很好的达到自己的期望,作为公司层面可以理解,谁又能成为不可或缺的人。但是从个人角度来看。一旦没有上升空间,做的事情也没有比较大的价值,处在修修补补,到处支持,到处迁移的情况下,俗称搬砖,精力被无限的消耗,这样下去,核心竞争力没了,加班加不过新人,迟早成为马老板眼里的老白兔,这时候,就应该考虑是不是需要有新的机会和挑战,主动做出改变。2020年,多想一些,做点改变。 生活上,经历了一些改变,也迎接一些改变,变化总是存在的。如果一切可预知,那么人生岂不是也毫无意义。2020年,多锻炼身体,一周两次不能少,也出去走走。 2020 年 2020年,多做一些高价值的事情,能够坚持读一些英文的paper,探索一些新的非工作上的领域,最重要的,坚持读书不能少。

2020-01-08 · 1 min · bystander

《非暴力沟通》笔记

最近读完了《非暴力沟通》这本书,看完之后,整体感觉还好,感觉核心就下面这四点 1.清楚地表达观察结果 区分感受和观察,表达的时候,一定要表达清楚,不要只表达感受,即使你批评一个人,也要说清楚,你看到了什么事情,让你觉得你应该批评他,而不是一开口就是你不对,你错了。 要不带评论的冷静观察。 2.表达感受 在表达完你的观察之后,要表达感受,这个主要是为了自己,让你能观察到自己的感受,让你知道什么时候,你是什么感受,是否是正向的。如何处理,注意,“我觉得”,“我想”,这个词带有评判色彩,当你说这个的时候,请重新组织语言。 3.说出哪些需要导致那样的感受 说出,哪个行为,或者哪个操作让你感受这样。比如是不是冒犯了你这样。 4.具体的请求 最后,提出具体的请求,你希望对方怎么做,才能让你好受,达到你的期望。请求的时候要具体,不能是抽象的。比如,你做的更好一点,这种对方无法决策怎么做,应该尽量具体,也避免双方理解有误。 这里注意要区分请求和命令,如果你说出的请求,别人拒绝会要承担后果,那多半是命令,而不是请求。

2019-10-27 · 1 min · bystander

Principle Note

最近在读一本书,《原则》,有一些感触比较深的点,分享下。这本书前半部分介绍作者在桥水的工作历程,建议直接忽略。从第二部分看起来即可。 1. 独立思考 (1)你想要什么; (2)事实是什么; (3)面对事实,你如何实现自己的愿望 知道自己想要什么,知道现实是什么,然后找办法实现,可以求助别人,如果还是实现不了,建议认清楚这种鸿沟。 2. 以可信度加权的方式做决定 作者认为一个人除了自信以外,要认识到自己的弱点,做决定的时候要配合更加可信的人,以可信度加权的方式做决定。比如你去看医生,医生说你并很重,建议你住院,而你觉得自己身体并无碍,这时候你会怎么做,你当然是更相信医生才对,因为医生在这一领域更专业,如果你自己在医学上的可信度为1,那么医生就是90,所以。 也就是说要经常好奇为什么其他聪明的人对事情的认识与我不同,来促使自己既从自己的视角看问题,也从别人的视角看问题。以看到很多维度,如果只从自己的视角看问题,是看不到这么多的。要懂得了如何对不同人的观点进行加权,从而选择最好的观点, 那如何定义“可信”,作者认为这样的人有两个特征:曾反复地在相关领域成功找到答案(至少成功过三次,拥有过硬履历);在被问责的情况下能对自己的观点做出很好的解释。” 这个点说的非常好,告诉我们什么时候,如果做正确的决定。如果你评估对方在这方面是这个新手,那多数情况下你更应该相信自己。 3. 做到头脑极度开放 影响合理决策的两个最大的障碍是你的自我意识和思维盲点。这两个障碍让你难以客观地看到你和你所处环境的真相,难以通过最大限度地利用他人的帮助来做出最佳决策。 自我意识指的是,要有效行事,你就绝不能允许“想要自己正确”的需求压倒“找出真相”的需求。让心里那个想要维护自己所谓尊严和正确的小人退下去,而且要保持谦逊和心胸开阔,以便你能动用自己的最佳思维,而如果你对自己掌握的知识和擅长的事情过于自豪,你学到的东西就会变少,决策质量就会变低,也将难以充分发挥自己的潜力 思维盲点指的则是,一个人的能力有限,不要过于自信,起码评估在哪些方面自己比较好,但是在自己的短板上,依靠擅长者的帮助。 作者还举了个例子,一个有高度创造性和目标导向性的人擅长设想新主意,但可能会低估日常生活细节的价值,而后者也很重要。他也许过度投入地追求长期目标,因而鄙视那些关注日常生活细节的人。类似地,一个任务导向的人善于处理细节,但可能会低估创造性的价值,甚至可能会为了效率而压制创造性。这两个人也许能组成一个好团队,但也有可能难以充分利用各自的优势,因为不同的思维方式让他们难以看到对方思维的价值。” 在日常工作中,这两个人最好能先把自己的本职做好,比如leader,要有大局观,但是不能空想。要有合理的把控,员工如果在信息掌握不足的情况下,首先做好细节上的事情,也要积极了解做这样的意义和在全局的用处。 4. 合理选择 这里面,我觉得久一点,最好的选择是好处多于坏处的选择,不是毫无坏处的选择。看看有些人,发现一点问题就反对某件事,而不合理权衡所有的优缺点。这样的人通常不善于决策。 这个告诉我们,没有银弹,一旦有人提出一个能解决一切问题的方案,请警惕。推广到工作和生活中,就是没有完美的答案,一定会有一些妥协,但可以选择好处远远大于坏处的,并评估坏处是否可以接受。 5. 团队合作 主持开会,要支持开会目的,开会对象,切忌胡乱跑题,绝不展开无关话题,保持高效,要允许反对意见,并充分讨论,而不是主管给结论,然后提出反对意见,并不理会,正确的应该是,会上充分讨论,会下严格执行,一旦决策,就不应该再有不同意见。否则决策多半是失败的。要么实行不下去。要么是其他的。 6. 不要担心个人形象 不要为自身形象担心,只需关心能不能实现你的目标。也就是说不要有所谓的偶像包袱,觉得自己应该什么都自己搞定,要比别人更厉害。遇到别人更了解的,积极求援,目标是把任务完成,而不要纠结于个人形象。 同时你不擅长的领域请教擅长的其他人,这也是一个你无论如何都应该培养的出色技能,这将帮助你建立起安全护栏,避免自己做错事。 找到、接受,并学会如何应对你的弱点,则可以更好的进步。 7. 失败则反思 虽然很不喜欢如何成功类似的文章,但是作者这句话说的还是比较在理的:成功的关键在于,既知道如何努力追求很多东西,也知道如何正确地失败。“正确地失败”是指,能够在经历痛苦的失败的过程中吸取重要的教训 不管是个人的失败,还是某些项目或者工作目标上的失败,一定要反思。而不能让部分的成功掩盖。 另外,不要把成功的装饰误认为成功本身。有追求成就的方向感是很重要的。有的人痴迷于一双1200元的鞋或一辆时髦的汽车,这样的人很少会感到快乐,因为他们不知道自己真正想要的是什么,因而也不知道什么能满足他们 这些都只是成功的装饰,并非成功本身。。 8. 汇总 作者在书中说了很多,我个人印象比较深刻的就是这么几点。总结下来,也提醒自己多多注意,能够有所提高。

2019-09-29 · 1 min · bystander

分析代码调用关系的利器-Flow

今天推荐一个不错的软件.是idea 的插件.名字是Flow, 官方称:A better way to understand your Java applications,原理就是通过 java-agent 修改字节码,配置了拦截器,然后真实地跑一个测试用例,或者启动一下项目,就会生成一个真实的调用关系.官方地址:http://findtheflow.io/ 之前阅读源代码,对于抽象类,或者接口,静态阅读代码不太容易确定具体的调用类,因此阅读有一定的阻碍,当然 debug 也行..但是这个可以通过跑用例,或者简单的测试用例,理清调用关系,非常不错. 可以对代码结构有一个整体关系 安装 安装比较简单:https://plugins.jetbrains.com/plugin/8362?pr=idea 直接安装idea 这个插件,然后重新启动 idea, 安装完成后的效果. 使用 使用更简单,直接点击上图中的按钮,开始跑一下,即可,如果启动成功.控制台会有显示. 然后,会在本地开启7575的端口,来显示结果. 效果 注意,在结果页里,可以和 idea 源码交互,对着方法点右键,可以直接定位到 idea 代码中的源代码,非常方便. 其他 其他,就是 可以在配置里设置根据哪些类,这样一些工具类啥的可以直接忽略了. 使用了一下,还是不错的.但是这个有个问题,如果你的项目自定义了 classloader/ 或者使用了自定义的容易,这个由于没有 mvn 的 jar 包,可能会报错,类找不到.暂时没有好的办法.但是阅读开源代码基本没有问题了.

2017-04-08 · 1 min · bystander

jdk8_cannot_access_class_file

之前有个项目用 jdk6跑运行正常,用 jdk8跑的时候,会报java cannot access ....class file ...as class file not found though it exists. 虽然可以通过加上报错的类到依赖里解决.但是一直没想明白,为啥 jdk6下没报错. 最近再次遇到,于是想一次性搞清楚.搜了一下,看 so 上有这么个说法.大意就是以前,如果 A 依赖 B,B 实现了 C 接口,编译的时候, 用 jdk8编译的时候, C 必须在 classpath 中, http://stackoverflow.com/questions/40255718/compiling-with-jdk-1-8-java-cannot-access-class-file-class-file-not-found 给出了一个 bug 连接,但是这里跟我们的问题有差异,不过这个点提醒了我.于是我搜索了一下 jdk8的relase note http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html 注意观看这一段: Area: Tools / javac Synopsis Interfaces need to be present when compiling against their implementations 好了.也就是说还是乖乖加依赖.但是清楚了原因了

2017-03-31 · 1 min · bystander

oom介绍

oom 之前知道, 但是并不是很了解,最近遇到了由 oom 引发的问题,所以学习记录一下. OOM-killer:Out-of-Memory (OOM) Killer是一种保护机制,用于当内存严重不足时,为了系统的继续运转,内核迫不得已挑选一个进程,将其杀死,以释放内存,缓解内存不足的问题。 可以看出这种方式对进程的保护是有限的,不能完全的保护进程的运行。 如何知道是否发生了 oom 两种方法,第一种,查看 /var/log/messages,会有类似 Out of memory: Kill process 9682 (mysqld) score 9 or sacrifice child Killed process 9682, UID 27, (mysqld) total-vm:47388kB, anon-rss:3744kB, file-rss:80kB httpd invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 httpd cpuset=/ mems_allowed=0 Pid: 8911, comm: httpd Not tainted 2.6.32-279.1.1.el6.i686 #1 这样的标识,说明发生了 oom,关键就是 kill process, 所以可以这样 sudo cat /var/log/messages | grep -i"killed process" 另一种是通过dmesg来查看 dmesg | egrep -i 'killed process' 这个命令查看的 oom 的时间里是时间戳的形式,如果你的 dmesg 没有-T这个时间的选项,那么就需要通过 date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc ` seconds" 来转换成可读的时间了. oom 的原理 其中涉及到有三个相关文件: /proc/$PID/oom_adj /proc/$PID/oom_score /proc/$PID/oom_score_adj 其中 oom_score 表示最终的分数,该分数越大,越可能被 Killer 杀掉。 而 oom_adj 是调整分数的,可以设置为负值,会对 oom_score减分。 从Linux 2.6.36开始都安装了/proc/$PID/oom_score_adj,此后将替换掉/proc/$PID/oom_adj。即使当前是对/proc/$PID/oom_adj进行的设置,在内核内部进行变换后的值也是针对/proc/$PID/oom_score_adj设置的。可以参见feature-removal-schedule这里 171行. 通过 cat /proc/$PID/oom_score 可以查看进程的得分 打分算法在这里 https://github.com/torvalds/linux/blob/master/mm/oom_kill.c 从上面的 oom_kill.c 代码里可以看到 oom_badness() 给每个进程打分,根据 points 的高低来决定杀哪个进程,这个 points 可以根据 adj 调节,root 权限的进程通常被认为很重要,不应该被轻易杀掉,所以打分的时候可以得到 3% 的优惠(adj -= 30; 分数越低越不容易被杀掉)。我们可以在用户空间通过操作每个进程的 oom_adj 内核参数来决定哪些进程不这么容易被 OOM killer 选中杀掉。比如,如果不想 MySQL 进程被轻易杀掉的话可以找到 MySQL 运行的进程号后,调整 oom_score_adj 为 -15(注意 points 越小越不容易被杀):范围是从-1000 到 1000,参考这里 ...

2017-02-03 · 2 min · bystander

graylog日记管理平台使用的那些坑

前言 最近使用 graylog在部署日志平台的时候,踩到很多"坑",记录一下 日志采集(nxlog) 1.客户端不要做太多的正则计算 graylog 最早推荐的 nxlog 采集客户端,现在貌似有了 beats 的采集方式,不过我没了解,nxlog 采集的话,需要配置Snippets,就是定义输入,输出,处理器的地方,这个地方, Input 模块是在客户端计算的.所以,一定不要进行太多的正则计算.否则会严重影响客户端的 cpu 资源.降低应用程序的性能. 2.开多行一定要慎重 graylog 可以通过配置 <Extension multiline> Module xm_multiline HeaderLine /^\d{0,2}\/\d{0,2}\/\d{0,4}/ EndLine /^\d{0,2}\/\d{0,2}\/\d{0,4}/ </Extension> <Input pcc-esolutions-log> Module im_file File "*.log" SavePos TRUE InputType multiline </Input> 来实现对于类似错误栈这样的信息,将多行采集成一行,但是一定要注意.如果这个正则写错了,或者其他原因,导致,未能正确匹配.会导致 nxlog 客户端占用内存暴涨.原因是为了实现多行采集,会再客户端内存中保存日志内容,直到匹配到行尾.如果未能正确匹配.会一直保存.导致内存泄露. 这时候一般伴随着nxlog 的客户端日志中开始打印: 2016-12-05 18:36:47 ERROR oversized string, limit is 1048576 bytes 这样的信息.表示单条日志超过了1m 最终有一定几率影响客户端应用,被 oom 所杀.不要问我怎么知道的… 3 日志就是太大怎么办. 貌似没办法..只能在 Input 配置中. Exec if $raw_event $raw_event = substr($raw_event, 0, 1040000); 执行类似的来限制,没有尝试过,参考这里:日志大小超长配置 服务端处理(graylog) 1.服务端性能不好的情况下也不要做大量正则 日志处理这部分主要是说 graylog 自身的处理,graylog 是 cpu 密集型的,在收到了 nxlog 经过少量计算的日志后, graylog 其实还提供了 extrator 的功能来解析字段,当时我因为部署了很多应用的日志采集,为了生成一个统一的索引字段,我在extrator写了一个正则,对于所有的消息,根据这个正则找到一个字段,来作为 key(保存成 no), 可能一个流水号,这样我就可以根据 no:xxx 来查询所有相关的日志了. 结果这个正则写了以后, graylog 处理性能急剧下降.开始大量积压消息.无法发送给后端的 es 来做处理.在 graylog 的管理页面,能明显看到 in 是几千, out 是几百..很快 node 节点就废了. 参考:Very slow process message 如果是确定不是 graylog 的问题, output 还是慢,可以尝试修改输出的并发量来解决,改改 graylog 配置中的output_batch_size值. 2.journal如果太多,可能导致graylog 状态 dead 由于我前面的问题,导致 journal 中保存了太多的日志,这样会导致两个问题,1,启动的时候会尝试吧这些日志全部加载 graylog 服务端的内存中.这时候,如果应用内存不够,直接会启动不了报java 的 oom, 2016-12-04T12:25:36.543+02:00 ERROR [ServiceManager] Service JournalReader [FAILED] has failed in the RUNNING state. java.lang.OutOfMemoryError: Java heap space at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57) at java.nio.ByteBuffer.allocate(ByteBuffer.java:331) at kafka.log.FileMessageSet$$anon$1.makeNext(FileMessageSet.scala:188) 或者会报一个数组越界的错误.能解决的办法就是删.. 还有就是临时加大 graylog的 jvm 内存设置. ...

2016-12-10 · 1 min · bystander

graylog中的字段解析

关于字段解析 一旦 graylog 用在了一个分布式系统上,那么采集的日志格式多种多样,涉及到通过 rules.drl来解析具体的字段.之前的同学的方案是用drools 来完成的.通过一个统一的界面,来给用户生成一些正则规则这种.然后自己写了个转换器转成 Drools 的文件.更新到 graylog 的服务器上.然后重启gralog 应用完成. 实际上, graylog 2之后的版本提供了rules和 pipeline ,这种不需要重启应用,完成这个解析的动作.但是.注意.这个不完善.所以只支持一些简单的语法,无法实现原有的完全转换.所以放弃. 在此过程中.这个rules 有一个比较强大的功能,自动解析 key value 对.需要添加,但是,需要你的日志文件格式里的 key value有空格, 也就是要求必须是 key=value 这样,不能紧挨着逗号这样的..比如你的打印日志是 key=value,key2=value2.那么久无法解析了..这个暂时没看到比较好的办法.估计要改代码.如果你恰好符合.那最好了.

2016-10-30 · 1 min · bystander

javOSize:新一代java分析工具

介绍 最近看到这么个工具-javOSize .官网地址,去官网看了下.发现介绍很有意思,叫做 the missing sugar for your Java cup.(你的咖啡杯中缺少的那颗糖).于是感受一下这颗糖到底甜不甜 安装 安装非常简单,从这里下载,其实完成之后就是一个jar包.非常简单,不用配置啥的. 简单使用 使用方法就是从先附加到一个java进程上,在linux,上我直接执行 ps aux|grep java 就能看到了.不废话,得到java进程的pid之后,运行 java -jar javosize-1.0.9.jar pid pid就是pid的号了. 然后会看到如下图的界面,表示已经附加成功了.先看看都有啥.执行ls.看到有这么几个命令.我比较单纯,刚开始以为是可执行文件.结果丢人了.看了下官方文档,才知道是目录.进入对应的目录.然后执行ls就能看到对应的信息了.ls简直不能再万能..改目录支持的所有命令通过在对应的目录执行help来查看.个人尝试觉得好的功能有. 动态修改类 进入CLASSES目录,然后通过执行 ls|grep xxx 来找到需要修改的类,然后通过vi 就可以直接编辑.编辑完成后,直接保存就会动态替换.文档里说是支持jdk1.7以上,对1.6的支持估计是不行的.没有测试. 无须重启开启jmx 直接挂载之后,执行cd REPOSITORY 然后执行就好了. exec START_JMX_SERVER 6666 拦截任意代码 可以动态添加类似Spring中的aop方法.用于打印一些调用日志,排查线上问题.进入INTERCEPTOR目录.然后通过如下的方法给某个类的某个方法添加拦截器. create TickServlet begin mypackage.Hello doGet System.out.println("Servlet invoked"); 检测内存泄漏 进入 REPOSITORY 目录,执行 exec TOP_FAT_STATIC_VARIABLES 5 com.apache.*会取出某个包下面占用大小最大的5个类.会很方便找到. 自动检测性能问题 PROBLEMS 目录专业解决这种问题.进入目录后.执行ls命令.会看到这样的场景 Concurrency Deadlocked: false Memory High GC (>2%): false 这里目前只检测了死锁和频繁GC.已经很有用了.至于效果还有待观察. 无需重启开启GC 日志 和开启jmx一样,进入JMX目录后,执行 exec java.lang:type=Memory.setVerbose(true); 就开启了. 更多文档 官方文档

2015-07-04 · 1 min · bystander