首页 文章 精选 留言 我的

精选列表

搜索[最权威安装],共10000篇文章
优秀的个人博客,低调大师

Stack Overflow 火的一段代码竟然有 Bug...

某天,我忙中偷闲去Stack Overflow上赚声望值。 于是,我看到了下面这个问题:怎样将字节数输出成人类可读的格式?也就是说,怎样将123,456,789字节输出成123.5MB? 隐含的条件是,结果字符串应当在1~999.9的范围内,后面跟一个适当的表示单位的后缀。 这个问题已经有一个答案了,代码是用循环写的。基本思路很简单:尝试所有尺度,从最大的EB(10^18字节)开始直到最小的B(1字节),然后选择小于字节数的第一个尺度。用伪代码来表示的话大致如下: suffixes = [ "EB", "PB", "TB", "GB", "MB", "kB", "B" ] magnitudes = [ 1018, 1015, 1012, 109, 106, 103, 100 ] i = 0 while (i < magnitudes.length && magnitudes[i] > byteCount) i++ printf("%.1f %s", byteCount / magnitudes[i], suffixes[i]) 通常,如果一个问题已经有了正确答案,并且有人赞过,别的回答就很难赶超了。不过这个答案有一些问题,所以我依然有机会超过它。至少,循环还有很大的清理空间。 1、这只是一个代数问题! 然后我就想到,kB、MB、GB……等后缀只不过是1000的幂(或者在IEC标准下是1024的幂),也就是说不需要使用循环,完全可以使用对数来计算正确的后缀。 根据这个想法,我写出了下面的答案: public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } 当然,这段代码并不是太好理解,而且log和pow的组合的效率也不高。但我没有使用循环,而且没有任何分支,看起来很干净。 这段代码的数学原理很简单。字节数表示为byteCount = 1000^s,其中s表示尺度。(对于二进制记法则使用1024为底。)求解s可得s = log_1000(byteCount)。 API并没有提供log_1000,但我们可以用自然对数表示为s = log(byteCount) / log(1000)。然后对s向下取整(强制转换为int),这样对于大于1MB但不足1GB的都可以用MB来表示。 此时如果s=1,尺度就是kB,如果s=2,尺度就是MB,以此类推。然后将byteCount除以1000^s,并找出正确的后缀。 接下来,我就等着社区的反馈了。我并不知道这段代码后来成了被复制粘贴最多的代码。 2、对于贡献的研究 到了2018年,一位名叫Sebastian Baltes的博士生在《Empirical Software Engineering》杂志上发表了一篇论文,题为《Usage and Attribution of Stack Overflow Code Snippets in GitHub Projects》。 该论文的主旨可以概括成一点:人们是否在遵守Stack Overflow的CC BY-SA 3.0授权?也就是说,当人们从Stack Overflow上复制粘贴时,会怎么注明来源? 作为分析的一部分,他们从Stack Overflow的数据转出中提取了代码片段,并与公开的GitHub代码库中的代码进行匹配。论文摘要如是说: We present results of a large-scale empirical study analyzing the usage and attribution of non-trivial Java code snippets from SO answers in public GitHub (GH) projects. (本文对于在公开的GitHub项目中使用来自Stack Overflow上有价值的代码片段的情况以及来源注明情况进行了大规模的经验分析,并给出了结果。)(剧透:绝大多数人并不会注明来源。) 论文中有这样一张表格: id为3758880的答案正是我八年前贴出的答案。此时该答案已经被阅读了几十万次,拥有上千个赞。 在GitHub上随便搜索一下就能找到数千个humanReadableByteCount函数: 你可以用下面的命令看看自己有没有无意中用到: $ git grep humanReadableByteCount 3、问题 你肯定在想:这段代码有什么问题: 再来看一次: public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } 在EB(10^18)之后是ZB(10^21)。是不是因为kMGTPE字符串的越界问题? 并不是。long的最大值为2^63-1,大约是9.2x10^18,所以long绝对不会超过EB。 是不是SI和二进制的混合问题?不是。前一个版本的确有这个问题,不过很快就修复了。 是不是因为exp为0会导致charAt(exp-1)出错?也不是。第一个if语句已经处理了该情况。exp值至少为1。 是不是一些奇怪的舍入问题?对了…… 4、许多9 这段代码在1MB之前都非常正确。但当输入为999,999时,它(在SI模式下)会给出“1000.0 kB”。尽管999,999与1,000x1000^1的距离比与999.9x1000^1的距离更小,但根据问题的定义,有效数字部分的1,000是不正确的。正确结果应为"1.0 MB"。 据我所知,原帖下的所有22个答案(包括一个使用Apache Commons和Android库的答案)都有这个问题(或至少是类似的问题)。 那么怎样修复呢?首先,我们注意到指数(exp)应该在字节数接近1x1,000^2(1MB)时,将返回结果从k改成M,而不是在字节数接近999.9x1000^1(999.9k)时。这个点上的字节数为999,950。类似地,在超过999,950,000时应该从M改成G,以此类推。 为了实现这一点,我们应该计算该阈值,并当bytes大于阈值时增加exp的结果。(对于二进制的情况,由于阈值不再是整数,因此需要使用ceil进行向上取整)。 if (bytes >= Math.ceil(Math.pow(unit, exp) * (unit - 0.05)))exp++; 5、更多的9 但是,当输入为999,949,999,999,999,999时,结果为1000.0 PB,而正确的结果为999.9 PB。从数学上来看这段代码是正确的,那么问题除在何处? 此时我们已经达到了double类型的精度上限。 关于浮点数运算 根据IEEE 754的浮点数表示方法,接近0的数字非常稠密,而很大的数字非常稀疏。实际上,超过一半的值位于-1和1之间,而且像Long.MAX_VALUE如此大的数字对于双精度来说没有任何意义。用代码来表示就是 double a = Double.MAX_VALUE; double b = a - Long.MAX_VALUE; System.err.println(a == b); // prints true 有两个计算是有问题的: String.format参数中的触发 对exp的结果加一时的阈值 当然,改成BigDecimal就行了,但这有什么意思呢?而且改成BigDecimal代码也会变得更乱,因为标准API没有BigDecimal的对数函数。 缩小中间值 对于第一个问题,我们可以将bytes值缩小到精度更好的范围,并相应地调整exp。由于最终结果总要取整的,所以丢弃最低位有效数字也无所谓。 if (exp > 4) { bytes /= unit; exp--; } 调整最低有效比特 对于第二个问题,我们需要关心最低有效比特(999,949,99...9和999,950,00...0等不同幂次的值),所以需要使用不同的方法解决。 首先注意到,阈值有12种不同的情况(每个模式下有六种),只有其中一种有问题。有问题的结果的十六进制表示的末尾为D00。如果出现这种情况,只需要调整至正确的值即可。 long th = (long) Math.ceil(Math.pow(unit, exp) * (unit - 0.05)); if (exp < 6 && bytes >= th - ((th & 0xFFF) == 0xD00 ? 51 : 0)) exp++; 由于需要依赖于浮点数结果中的特定比特模式,所以需要使用strictfp来保证它在任何硬件上都能运行正确。 6、负输入 尽管还不清楚什么情况下会用到负的字节数,但由于Java并没有无符号的long,所以最好处理复数。现在,-10,000会产生-10000 B。 引入absBytes变量: long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); 表达式如此复杂,是因为-Long.MIN_VLAUE == LONG.MIN_VALUE。以后有关exp的计算你都要使用absBytes来代替bytes。 7、最终版本 下面是最终版本的代码: // From: https://programming.guide/worlds-most-copied-so-snippet.html public static strictfp String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); if (absBytes < unit) return bytes + " B"; int exp = (int) (Math.log(absBytes) / Math.log(unit)); long th = (long) Math.ceil(Math.pow(unit, exp) * (unit - 0.05)); if (exp < 6 && absBytes >= th - ((th & 0xFFF) == 0xD00 ? 51 : 0)) exp++; String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); if (exp > 4) { bytes /= unit; exp -= 1; } return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } 这个答案最初只是为了避免循环和过多的分支的。讽刺的是,考虑到各种边界情况后,这段代码比原答案还难懂了。我肯定不会在产品中使用这段代码。 总结 Stack Overflow上的代码就算有几千个赞也可能有问题。 要测试所有边界情况,特别是对于从Stack Overflow上复制粘贴的代码。 浮点数运算很难。 复制代码时一定要注明来源。别人可以据此提醒你重要的事情。 原文链接:https://programming.guide/worlds-most-copied-so-snippet.html<br> 作者:Andreas Lundblad<br> 译者:弯月,责编:欧阳姝黎<br> 出品:CSDN(ID:CSDNnews) 近期热文推荐: 1.1,000+ 道 Java面试题及答案整理(2021最新版) 2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香! 3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具! 4.Spring Cloud 2020.0.0 正式发布,全新颠覆性版本! 5.《Java开发手册(嵩山版)》最新发布,速速下载! 觉得不错,别忘了随手点赞+转发哦!

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

数据分析容易被忽略的10个错误

本文总结了数据分析的几个阶段中最常犯的10个错误,以及规避的方法,收藏起来,分析不翻车! 一、数据采集阶段 1、数据失真 数据是可能骗人的,比如店铺、电影的评分,可能被人为操控;比如某公司发布的行业分析报告,也具有很大的主观性。 基于错误的数据,做出的分析结论是无益甚至是有害的。所以在采集数据时,我们先要考证数据的来源及可信度,还要关注不符合常理的数据变化,对数据采集方法进行调整。 2、幸存者偏差 就算数据是真实的,也不能轻信。 举个有名的例子,二战时英军发现,从战场飞回来的战机,机身上的弹孔比引擎和油箱上的要多的多,根据这个数据,我们很容易得出要加强机身的防护的建议。但事实的真相却是,那些引擎和油箱上中弹的飞机已经回不来了,我们更应加强引擎和油箱的防护,这就是常说的“幸存者偏差”。 造成幸存者偏差的原因,其实是取样出现了偏差,在数据采集时,我们要避免主观臆断,推演各类可能性,科学取样。 二、数据处理阶段 1、原始数据没有备份 很多新手在拿到原始数据后,喜欢在原始数据基础上把异常值剔除,再备份再做数据处理。但时常到后面发现删除的值其实并非异常值或者仍然有价值,这时候想找回值就麻烦了。所以,当我们拿到原始数据后,第一件事就是要做好备份。 2、不重视数据清洗 拿到数据后,大量繁琐的数据清洗工作常常让数据分析师们感到烦恼,很多人会图省事略过一些步骤,但这常常会造成返工,拖延了项目进度。 干净的数据源是我们一切分析工作的基础,我们需要重视数据清洗。当然了,为了提高数据处理效率,我们可以采用专业的数据分析工具。就拿我在用的FineBI来说,极大简化了数据处理流程,仅需拖拽就能完成数据的清洗、转化、抽取、合并、计算等功能,我们不需要花大量时间在数据处理上,可以把精力聚焦在业务分析上。 三、数据分析阶段 1、过度追求技巧 熟练使用各种数据分析工具如Excel、SQL、FineBI、Python,以及各类经典的分析方法,是每个数据分析大神的基本功,但这并不意味着,好的数据分析,就一定要用到各种高级的工具和方法。 很多数据分析新人会去搜罗各种最新的分析方法和思路,套用在项目中,以证明自己的工作能力。但真正优秀的数据分析,依靠的是不断深入地探索,以及严谨的逻辑链条。再好的工具和方法,都是为人服务的,合适的就是最好的。 2、过度依赖套路 我们不能过度追求技巧,但必要的方法论储备是要有的。在数据分析行业,并不存在“一招鲜,吃遍天”。 我们在刚开始学习数据分析时,会学习各种解题套路,但真正实操时,其实并不存在通用的套路。不同的行业、不同的业务,不同的阶段,哪怕用的是同一种分析方法,结论都应有所区别。比如to C和to B行业的客户运营就是不一样的,比如互联网初创公司可能追求用户增长,步入成熟期后追求利润率提高。 这里并不是鼓励大家盲目追求技术,而是我们要在日常工作中多学习积累分析思路和方法,丰富自己的武器库,将来胜任更多的应用场景。 3、相关性≠因果性 在分析时,我们常常将不同指标的数据进行关联分析,找出问题的原因。但这样往往会犯一个错误,就是错把相关当成因果。 我们通过统计,发现常吃海参的人比不吃海参的人智商要高一些,但这背后其实是因为吃海参的人普遍比较富裕,因而受教育水平高,测出的智商高,我们不能说为了提高智商赶紧去吃海参。 为了避免这一错误,我们在对数据间的相关性进行逻辑推演时,应时刻带着批判性思维,考虑各种中介变量。 4、由结果推原因 错误的数据,披上科学的外衣,是很危险的事。如果我们在开始分析前,就已经在心里预设了一个结论,带着结论找原因,射箭画靶,那做出的分析可能毫无价值甚至可能带来极大的损失 数据分析的优势,在于尊重客观数据而并非人的主观臆断。所以,我们在进行数据分析前,应摒弃主观臆想和经验主义,相信常识和客观数据,分析时还要多次检查逻辑的严谨性。 四、分析报告阶段 1、误导性图表 业内都说字不如表、表不如图,但比不用图表更可怕的,是用误导性图表。比如下面这两张图,光看左边会明显感知到数据在飞速增长,而看到右边才能得知真正的增长速度。 我认为,报告还是应当追求真实,不逃避问题、不美化缺陷,也是分析师的职责所在。 2、结论脱离业务实际 很多人在汇报结论时,只是简单把数据分析结果说了一通,得出一些模拟两可或者大家都知道的废话,并没有联系到业务实际,也并不具备可行性,这样的报告参考价值很低。 业务决策不光是业务人员的事,数据分析人员往往能从客观的角度提出独特的见解。我建议大家多和业务人员交流,至少要熟悉各个业务环节,了解提出数据分析需求的原因,最终得出的结论要有针对性,给出具体可落地的实质建议。 分享一下这个分析工具,回个“数据分析”就能拿得!

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

线程数多少合理?

爱生活,爱编码,微信搜一搜【架构技术专栏】关注这个喜欢分享的地方。 本文 架构技术专栏 已收录,有各种视频、资料以及技术文章。 一、什么时候应该使用多线程? 今天看到一个问题,突然有感而发,想聊下这个话题。 不知道大家有没有想过这个问题,就是什么时候我该使用多线程呢?使用多线程就一定会提升系统性能吗? 1、其实是否应该使用多线程在很大程度上取决于应用程序的类型。 计算密集型(如纯数学运算) 的, 并受CPU 功能的制约, 则只有多CPU(或者多个内核) 机器能够从更多的线程中受益, 单CPU下, 多线程不会带来任何性能上的提升, 反而有可能由于线程切换等额外开销而导致性能下降 IO密集型的,当我的应用必须等待缓慢的资源(如网络连接或者数据库连接上返回数据)时,那么多线程会让系统的CPU充分的利用起来,当一个线程阻塞挂起时,另一个线程可以继续使用CPU资源。 其实,就是多线程不会增加CPU的处理能,而是能够更加充分地利用CPU资源。 由于同一进程的多个线程是共享同一片内存资源的,在带来方便的同时也必然会增加其复杂性,如何保证多线程访问数据的一致性问题等。而多线程属于编程中容易翻车的地方。并且多线程编程问题的测试定位也是比较难的。总体来说,好的多线程是写出来,将多线程问题寄希望于测试中发现, 无疑是极度不可靠的。SO,努力的学习吧。 Java API 与多线程息息相关的的几大关键字:volatile、synchronized、 wait、 notify. 理解了这几个关键字,就可以编写多线程的代码了。 二、什么时候需要加锁? 在多线程场合下,最重要的就是保障数据的一致性问题,而保障数据一致性问题,就需要借助于锁了。 其实我们在多线程的场景下应该搞清楚一个问题,就是到底什么需要保护?并不是所有的的数据都需要加锁保护,只有那些涉及到被多线程访问的共享的数据才需要加锁保护。 锁的本质其实就是确保在同一时刻,只有一个线程在访问共享数据,那么此时该共享数据就能得到有效的保护。 举例说明下,比如我们想构造一个多线程下安全的单向链表: <img src="/Users/luqiang/Downloads/公众号图片/链表插入新图.jpg" alt="链表插入新图" style="zoom:50%;" /> 假如现在有两个线程在操作这个链表,一个写线程插入一个新元素7,另一个读线程遍历链表数据,如果不使用任何锁,那就有可能出现下面的执行顺序: 步骤 写线程 读线程 0 修改链表元素2的next指针指向7这个元素 ... ... 1 ... ... 遍历链表,到7的时候发现next 为null,遍历结束 2 修改元素7的next 指针指向3 ... ... 通过上面的例子我们可以明显看到在多线程下操作这个链表,有可能会导致读线程读到的数据不完整,只有从链表头部到元素7的位置的数据。由此可见,不加入任何保护措施的多线程保护,势必会导致数据的混乱。为了避免数据一致性问题,我们就需要将操作该队列的代码放入同步块内(锁的对象也就是这个链表实例),来确保同一时刻只有一个线程可以访问该链表。 如何加锁? 这里简单的说下,一般我们都是使用synchronized(如果没有特殊需求建议直接使用这个关键字,jdk新版本它真的很快),记住synchronized 锁的就是对象头。 简单的说下,主要有下面几种用法: synchronized 放在方法上,锁的是当前synchronized 方法的对象实例 synchronized在static 方法上,锁的是synchronized 方法的class 类对象,注意这里class 其实也是一个对象。 synchronized(this)在代码块中,锁的是代码块括号内的对象,这里this指的就是调用这个方法的类实例对象 三、 多线程中易犯的错误 1、锁范围过大 共享资源访问完成后, 后续的代码没有放在synchronized同步代码块之外。 会导致当前线程长期无效的占用该锁, 而其它争用该锁的线程只能等待, 最终导致性能受到极大影响。 public void test() { synchronized(lock){ ... ... //正在访问共享资源 ... ... //做其它耗时操作,但这些耗时操作与共享资源无关 } } 面对上面这种写法,会导致此线程长期占有此锁,从而导致其他线程只能等待,下面来讨论下解决方法: 1)单CPU场景下,将不需要同步的耗时操作拿到同步块外面,有的情况可以提升性能,有的却不行。 CPU密集型的代码 ,不存在磁盘IO/网络IO等低CPU消耗的代码。 这种情况下, CPU 99%都在执行代码。 因此缩小同步块也不会带来任何性能上的提升, 同时缩小同步块也不会带来性能上的下降。 IO密集型的代码,在执行不消耗CPU的代码时,其实CPU属于空闲状态的。如果此时让CPU工作起来就可以带来整体上性能的提升。所以在这种情况下,就可以将不需要同步的耗时操作移到同步块外面了。 2)多CPU场景下,将耗时的CPU操作拿到同步块外面,总是可以提升性能的 CPU密集型的代码,不存在IO操作等不消耗CPU的代码片段。因为当前是多CPU,其他CPU也可能是空闲的。所以在缩小同步块的时候,也会让其他线程尽快的执行这段代码从而带来性能上的提升。 IO密集型的代码,因为当前PCU都是空闲的状态,所以将耗时的操作放在同步块外面,一定会带来整体上的性能提升。 当然,不管怎么样,缩小锁的同步范围对于系统来说都是百利而无一害的,因此上面的代码应该改为: public void test() { synchronized(lock){ ... ... //正在访问共享资源 } ... ... //做其它耗时操作,但这些耗时操作与共享资源无关 } 综上所述,一个重点,就是只将访问共享资源的代码放在同步块内,保证快进快出。 2、死锁的问题 死锁要知道的: 死锁,简单地说就是两个线程或多个线程在同时等待被对方持有的锁导致的,死锁会导致线程无法继续执行并被永久挂起。 如果线程发生了死锁,那我们就能从线程堆栈中明显的看到”Found one Java-level deadlock“,并且线程栈还会给出死锁的分析结果。 死锁这种问题如果发生在关键系统上就可能会导致系统瘫痪,如果想要快速恢复系统,临时唯一的方法就是保留线程栈先重启,然后再尽快的恢复。 死锁这种问题有时候测试是很难被立即发现的,很多时候在测试时能否及时发现这类问题,就全看你的运气和你准备的测试用例了。 避免死锁这类问题,唯一的办法就是改代码。但一个可靠的系统是设计出来的,而不是通过改BUG改出来的,当出现这种问题的时候就需要从系统设计角度去分析了。 有人会认为死锁会导致CPU 100%,其实对也不对。 要看使用的什么类型的锁了,比如synchronized导致的死锁,那就不会导致CPU100%,只会挂起线程。但如果是自旋锁这种才可能会消耗CPU。 3、共用一把锁的问题 就是多个共享变量会共用一把锁,特别是在方法级别上使用synchronized,从而人为导致的锁竞争。 上例子,下面是新手容易犯的错误: 1 public class MyTest 2 { 3 Object shared; 4 synchronized void fun1() {...} //访问共享变量shared 5 synchronized void fun2() {...} //访问共享变量shared 6 synchronized void fun3() {...} //不访问共享变量shared 7 synchronized void fun4() {...} //不访问共享变量shared 8 synchronized void fun5() {...} //不访问共享变量shared 9 } 上面的代码每一个方法都被加了synchronized ,明显违背了保护什么锁什么的原则。 三、线程数我们一般设多少比较合理呢? 其实大家都知道,在大多数场合下多线程都是可以提高系统的性能和吞吐量,但一个系统到底多少个线程才是合理的? 总的来说,线程数量太多太少其实都不太好,多了会因为线程频繁切换导致开销增大,有时候反而降低了系统性能。少了又会导致CPU资源不能充分的利用起来,性能没有达到瓶颈。 所以,系统到底使用多少线程合适,是要看系统的线程是否能充分的利用了CPU。其实实际情况,是很多时候不消耗CPU,如:磁盘IO、网络IO等。 磁盘IO、网络IO相比CPU的速度,那简直是相当的慢的,在执行IO的这段时间里CPU其实是空闲的。如果这时其他线程能把这空闲的CPU利用上,就可以达到提示系统性能和吞吐的目的。 其实上面我们也提到过,也就是两种计算特性: CPU密集型: 因为每个CPU都是高计算负载的情况,如果设置过多的线程反而会产生不必要的上下文切换。所以,一般线程我们会设置 CPU 核数 + 1就可以了,为啥要加1 呢,即使当计算(CPU)密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保 CPU 的时钟周期不会被浪费,其实就是个备份。 IO密集型:因为大量的IO操作,会导致CPU处于空闲状态,所以这时我们可以多设置些线程。 所以, 线程数 = CPU 核心数 * (1+ IO 耗时/CPU 耗时) 就可以了,希望能给你点启发。 爱生活,爱编码,微信搜一搜【架构技术专栏】关注这个喜欢分享的地方。 本文 架构技术专栏 已收录,有各种视频、资料以及技术文章。

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

哀悼日网站全站变灰代码,简单的还是ng这种方式...

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 一般在清明节,全国哀悼日,大地震的日子,以及一些影响力很大的伟人逝世或纪念日的时候,身为站长的我们都会让自己的网站的全部网页变成灰色(黑白色),以表示我们对逝者的悼念。 那么今天就说说,通过几行简单的代码,来实现这个功能。 第一种:修改CSS文件 我们可以在网页的CSS文件中添加以下的CSS代码,来实现网页黑白色,也就是网站变灰。 代码 html { filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); -webkit-filter: grayscale(100%); } 第二种:在网页的标签内加入以下代码 如果你不想改动CSS文件,你可以通过在网页头部中的标签内部加入内联CSS代码的形式实现网站网页变灰。 代码 <style type="text/css"> html { filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); -webkit-filter: grayscale(100%);} </style> 第三种:修改标签加入内联样式 如里上面的两种方式都不喜欢,可以通过修改标签,以加入内联样式的方法,达到网页变灰的效果 代码 <html style="filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); -webkit-filter: grayscale(100%);"> 第四种:作者本人用的CSS代码 代码: body *{ -webkit-filter: grayscale(100%); /* webkit */ -moz-filter: grayscale(100%); /*firefox*/ -ms-filter: grayscale(100%); /*ie9*/ -o-filter: grayscale(100%); /*opera*/ filter: grayscale(100%); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); filter:gray; /*ie9- */ } 第五中:通过nginx使网站变灰 在Nginx负载均衡服务器上,利用sub_filter指令在输出的HTML中增加一行。 就可以实现在IE及IE内核浏览器下,所有网站变灰色。步骤如下: 1、重新编译Nginx,增加http_sub_module模块: --with-http_sub_module 2、在nginx.conf配置文件的http {...}大括号内增加以下两行: sub_filter '</head>' '<style type="text/css">html{filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);}</style>'; sub_filter_once on; 3、保存后,重新加载配置文件: /usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload 这样,整个页面就都变灰色了。 PS:以上几种方法,都是通过CSS的滤镜来控制页面的显示而已,唯一不同的就CSS代码调用的方式。各位,喜欢哪种就自己挖去吧! 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-04-07本文作者:互联网架构师 本文来自:“互联网架构师 微信公众号”,了解相关信息可以关注“互联网架构师”

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

2020,关注企业级云原生实践落地的大会来了!

过去的 2019 年,云原生关注度依然居高不下,更多开发者热衷使用云原生技术,更多企业开始探索云原生架构转型落地。尽管云原生技术已经被广泛接受,其在企业技术栈的落地仍然面临挑战。 在与各行业头部企业深度合作和交流中,我们发现国内云原生实践已累积了诸多宝贵经验。云原生技术带来的资源成本降低、研发运维效率提升等巨大价值,已经驱动企业主动迎接这些挑战。可以预见通过云原生上云最大化使用云的能力,高效的社会分工,使企业聚焦于自身业务发展,将成为企业的共识。 2020,站在一个全新十年的节点上,我们期望在以开放创新为支撑的云原生领域发声,邀请来自国内外 IT 公司的一线云原生技术专家们,碰撞思想、共话实践。全方位洞悉云原生技术趋势,分享企业云原生落地实践痛点及经验,共同探索中国企业的云原生化转型的新路径。 2020 年 2 月 29 日,阿里云主办

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

Python 爬取张国荣火的 8 首歌,60000 评论看完泪奔!

今天是4月1日。 每年的这一天, 一部分人搜索枯肠想尽办法整蛊, 一部分人感怀四月该很好,倘若你还在。 甚至有人,用AI的方式来还原你。 但那终究不是你啊。 你走了16年了,那些当年在课桌前趁老师不注意偷偷听你歌的少年们,或许早已为人夫为人妇。 即便如此,每年却有很多人在这人间四月天里,借着你给世界留下的不绝回音,去思念你、去给你留言,即便明明知道,永远也不会收到回复。 今天,CSDN选择以科技的方式,来纪念哥哥。 我们爬取了你在网易云音乐上,评论最多的八首歌曲。 它们依次是:《沉默是金》《春夏秋冬》《倩女幽魂》《当爱已成往事》《我》《风继续吹》《玻璃之情》《风再起时》。 总共64540条的评论中,出现最多的是“生日快乐”、“哥哥”、“加油”、“你若尚在场”、“新年快乐”和“哥哥,生日快乐”。 词云图里很少有“4月1日”、“愚人节”的字眼,这并不是今天去给你评论的人少,而是今天这个日子,实在不适合对你说“快乐”。 来,先给大家看看评论的代码。 # coding:utf-8 import json import time import requests from fake_useragent import UserAgent import random import multiprocessing import sys #reload(sys) #sys.setdefaultencoding('utf-8') ua = UserAgent(verify_ssl=False) song_list = [{'186453':'春夏秋冬'},{'188204':'沉默是金'},{'188175':'倩女幽魂'},{'188489':'风继续吹'},{'187374':'我'},{'186760':'风雨起时'}] headers = { 'Origin':'https://music.163.com', 'Referer': 'https://music.163.com/song?id=26620756', 'Host': 'music.163.com', 'User-Agent': ua.random } def get_comments(page,ite): # 获取评论信息 # """ for key, values in ite.items(): song_id = key song_name = values ip_list = [IP列表] url = 'http://music.163.com/api/v1/resource/comments/R_SO_4_'+ song_id +'?limit=20&offset=' + str(page) proxies = get_random_ip(ip_list) try: response = requests.get(url=url, headers=headers,proxies=proxies) except Exception as e: print (page) print (ite) return 0 result = json.loads(response.text) items = result['comments'] for item in items: # 用户名 user_name = item['user']['nickname'].replace(',', ',') # 用户ID user_id = str(item['user']['userId']) print(user_id) # 评论内容 comment = item['content'].strip().replace('', '').replace(',', ',') # 评论ID comment_id = str(item['commentId']) # 评论点赞数 praise = str(item['likedCount']) # 评论时间 date = time.localtime(int(str(item['time'])[:10])) date = time.strftime("%Y-%m-%d %H:%M:%S", date) 八首歌的歌词代码: import requests from bs4 import BeautifulSoup import re import json import time import random import os headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3355.4 Safari/537.36', 'Referer': 'http://music.163.com', 'Host': 'music.163.com' } # 获取页面源码 def GetHtml(url): try: res = requests.get(url=url, headers=headers) except: return None return res.text # 提取歌手歌词信息 def GetSongsInfo(url): print('[INFO]:Getting Songs Info...') html = GetHtml(url) soup = BeautifulSoup(html, 'lxml') links = soup.find('ul', class_='f-hide').find_all('a') if len(links) < 1: print('[Warning]:_GetSongsInfonot find...') Info = {'ID': [], 'NAME': []} for link in links: SongID = link.get('href').split('=')[-1] SongName = link.get_text() Info['ID'].append(SongID) Info['NAME'].append(SongName) # print(Info) return Info def GetLyrics(SongID): print('[INFO]:Getting %s lyric...' % SongID) ApiUrl = 'http://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1'.format(SongID) html = GetHtml(ApiUrl) html_json = json.loads(html) temp = html_json['lrc']['lyric'] rule = re.compile(r'[.*]') lyric = re.sub(rule, '', temp).strip() print(lyric) return lyric def main(): SingerId = input('Enter the Singer ID:') url = 'http://music.163.com/artist?id={}'.format(SingerId) # url = "http://music.163.com/artist?id=6457" Info = GetSongsInfo(url) IDs = Info['ID'] i = 0 for ID in IDs: lyric = GetLyrics(ID) SaveLyrics(Info['NAME'][i], lyric) i += 1 time.sleep(random.random() * 3) # print('[INFO]:All Done...') def SaveLyrics(SongName, lyric): print('[INFO]: Start to Save {}...'.format(SongName)) if not os.path.isdir('./results'): os.makedirs('./results') with open('./results/{}.txt'.format(SongName), 'w', encoding='utf-8') as f: f.write(lyric) 《沉默是金》 是错永不对 真永是真 任你怎说安守我本份 始终相信 沉默是金 这首歌是你亲自谱曲的。 当时,“谭张争霸”(1986-1989年,谭咏麟和张国荣为争夺乐坛地位,而在音乐上展开了全面竞争角逐)已经进入白热化。 你讨厌争来争去,于是借歌明志,推出了《沉默是金》。 你说,“任你怎说安守我本份,始终相信,沉默是金。” 清者自清,你的沉默,愈加彰显纯真本色。 《春夏秋冬》 秋天该很好 你若尚在场 秋风即使带凉 亦漂亮 深秋中的你填密我梦想 就像落叶飞 轻敲我窗 每到你生日时、每到新年时、每到你离开世界的那天时,你的歌下面就会有大量评论涌来。 你是4月1日走的,但是喜欢你的人,总是3月30日、31日甚至更早,就来你的音乐下面评论。 多少人希望你复活,甚至有人在重庆看到一位和你眉眼很像的出租者司机,都忍不住拍下。 你眼神中的澄澈和犹豫,事隔经年,还是那么让人无法忘记。 《倩女幽魂》 红尘里 美梦有几多方向 找痴痴梦幻中心爱 路随人茫茫 《倩女幽魂》里,你是羞涩怯弱的书生,走夜路时要点三盏灯笼,但却为了担心阳光把小倩的魂魄照散,死死地用肩膀扛着门板。 小倩走了,宁采臣的心也跟着死了。 哥哥走了,别人再演宁采臣,总感觉除却巫山不是云。 《当爱已成往事》 为何你不懂 只要有爱就有痛 有一天你会知道 人生没有我并不会不同 《霸王别姬》里,你演程蝶衣。 演得那么妩媚,以至于有人断言你是童子功出身。 其实,你只不过是重病还坚持训练而已。 你说“不疯魔,不成活”,所以你知道段小楼娶妻后,会嫉妒会难过会发狂。 戏里戏外,你都爱过,你说“只要有爱就有痛”,但却更像是唱给自己听。 你这样的纯粹和“认死理”,总是让粉丝很心疼你...... 《我》 孤独的沙漠里 一样盛放的赤裸裸 多么高兴 在琉璃屋中快乐生活 对世界说 甚么是光明和磊落 我就是我 是颜色不一样的烟火 多少人用你唱的那句“我就是我,是颜色不一样的烟火”来鼓励自己活出自我。 但最后你却已烟火一样的方式,离开了人世间。 几年前,梁朝伟在纪念你的演唱会上,拨通你的电话。 电话里,留言声依旧,“你好,我是leslie,有事请留言。” 梁朝伟沉默了,许久之后,淡淡说句:“宝荣啊,不如我们从头来过。” 《风继续吹》 风继续吹不忍远离 心里亦有泪不愿流泪望着你 过去多少快乐记忆 何妨与你一起去追 这是你的成名曲,所以你似乎很中意它。 每每参加演唱会,都要唱一唱。 最后一次唱起时,不知怎的竟然哭了,台下观众也跟着你哭。 因为这首歌,是你翻身的见证啊。 你在歌坛摸爬滚打那么多年,一直寂寂无声,是这首歌才没有让你被埋没。 《玻璃之情》 不信眼泪 能令失落的你爱下去 难收的覆水 将感情漫漫荡开去 如果你太累 及时地道别没有罪 你曾说,每次唱歌前,都要给这首歌编一个故事,唱的时候,脑海中浮现出故事的画面,而这种画面感,让你唱得很投入。 为什么你的歌经久不息,就是因为你不仅对人重情,对歌也重情。 《风再起时》 我回头再往某年 像失色照片乍现眼前 这个茫然困惑少年 愿一生以歌 投入每天永不变 1989年,已经见过了娱乐圈太多浮沉的你,突然宣布告别乐坛。 你见过喧嚣,但你却不属于喧嚣。 策划告别演唱会之前,你和音乐人陈少琪、黎小田商量。 陈少琪说,“你不是有一首成名曲叫《风继续吹》么?不如歌名就叫《风再起时》,就是希望只要一起风的时候,歌迷就会想起你的这首歌。” 边上的黎小田,花了十五分钟就在随手找来的白纸上,谱好了曲子。 很快,陈少琪也把词填好了。 有人说,这首歌里的歌词,就是为你量身定做的:“我回头再往某年,像失色照片乍现眼前,这个茫然困惑少年,愿一生以歌,投入每天永不变”。 愿一生以歌,投入每天永不变...... 不知道现在的你,还唱歌吗?还演戏吗? 你知不知道,今天很多人都在想你。 谢谢你,留给我们这么多歌曲和电影。 愿你在另外一个世界,永远没有忧郁和伤心。 以上。

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

详细版本|UI2Code智能生成Flutter代码——机器生成代码

作者: 闲鱼技术-上叶,余晏 背景 在《UI2CODE--整体设计》篇中,我们提到UI2Code工程的整体流程。前步图片分析之后,我们可以得到对应的DSL布局描述。利用DSL的资讯,结合IntelliJ Plugin介面工具,面向使用者提供生成对应Flutter代码。 本篇主要介绍我们如何处理DSL的资讯,想法上即是Flutter的翻译机。总体概念如下: 输入的DSL是什么? DSL做为一种描述语言,抽象表示为了解决某一类任务而专门设计的计算机语言。在此我们的DSL代表图像识别和布局识别侧的输出,为一JSON格式。 这些资讯主要描述了这个图层(Layer)的范围(Frame)、是什么样子的类型(Type)、是什么样子的样式(Styles)、含有哪些数据(Value)等等。图层集(Layers)栏位则代表了这张视觉稿的所有图层。

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

2018年自然语言处理值得关注的研究、论文和代码

2018年对于自然语言处理(NPL)是很有意义的一年,见证了许多新的研究方向和尖端成果。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他总结了2018年 NLP 的重要进展,包括增强学习、情感分析和深度学习等领域。点击文章中的链接,可获得每一项研究的详细信息、论文或者代码。 综合领域 Facebook 研究员们发明了一种机器翻译的新方法,只需要使用单一语言语料库,这对于缺乏资料的语言非常有用。 Young 和同事更新了他们近期发表的论文《基于深度学习的自然语言处理的最新趋势》,增加了 NLP 文献中最新的 SQuAD 结果。 Bloomberg 研究员 Yi Yang 发表了 RNN 卷积筛选建模的最新论文及代码,称体现了语言中的长期依存性和组合性。 百度发布了 Deep Voice 3,是一项基于注意、完全卷积的文字语音转换神经系统,比目前的循环系统在神经语音合成方面快几个量级。 Pair2vec 是一种学习文字嵌入对的新方法,能体现隐含关系的背景知识。 百度发布了名为同声翻译与预测及可控延迟(STACL)的机器翻译算法,能够同时进行多个翻译。在同声传译时,这项技术不需要等发言者暂停发言,而可以预测发言者的下一个词语。 Deep INFOMAX 是一种学习无监督表征的方法,将输入和高层特征矢量之间的共同信息最大化。 蒙特利尔大学的 AI 研究团队 MILA 发表了多个超赞的研究成果,记录了自然语言生成(NLG)任务中 GAN 的限制。 聊天机器人是 NLP 的一个重要研究领域,创业公司 lang.ai 如何使用无监督 AI 来解决打造聊天机器人的重要挑战之一:理解用户到底想要什么。 这个模型提供了一种新方法进行文字生成,可以实现更强的解读性和控制性。 谷歌 AI 发表了论文,探索语言建模的极限。 亚马逊研究员提出了一种语言建模方法,这种新的训练策略的重要性在于,在现实中,要获得大量的训练数据来建立一种新能力经常是不现实的。 **增强学习**许多研究员认为增强学习是机器学习的最前端。 我们来看看这个领域内,2018年都有哪些重大进展。 David Ha 的“世界模型”,目标是研究个体能否在其自身的梦境中学习,需要利用增强学习来学习一项规则,依靠世界模型中抽取的特征来解决制定的任务。 OpenAI 开发了一个类似人类的机器人手,通过增强学习算法获得操纵物体的灵活性。 DeepMind 在《自然》杂志发布了一篇论文,讨论虚拟环境中,人工个体的网格表征怎样通过矢量导航找到解决。 TextWorld 是以文字游戏为灵感的学习环境,用于训练增强学习代理。 Google研究员开发了一项名为 MnasNet 的技术,是一种自动化神经网络架构搜索方法,用于通过增强学习设计移动化机器学习模型。 OpenAI Five 利用增强学习,能在复杂游戏 Dota 2 中打败业余水准的人类选手。 DeepMind 开发了名为 PopArt 的技术,利用增强学习在多任务环境中具有高精确度。 三星的 CozNet 是一种增强学习算法,在两项知名的NPL比赛中展现了顶尖表现。 Arel 使用对抗奖励学习来讲故事,解决故事评估维度的局限。 Metacar 是为无人驾驶汽车而设计的增强学习环境,在以 Tensorflow.js 打造的浏览器上使用。 OpenAI 发布的 Gym Retro 平台提供 1000多个游戏,进行增强学习研究。 情感分析机器学习系统需要更深的理解能力,才能与人类在情感层面互动。 这篇新论文提出了“层级化CVAE用于精准的仇恨言论分类”,能够理解40多个群体和13中不同类别的仇恨言论。 这篇论文讨论如何使用简单的支持向量机变量获得最佳结果,并指出模型方面需要注意的几点。目前大部分情感分析都是基于神经方法,研究时需要注意模型和特征的选择。 这篇论文定量分析了推特表情肤色修改器的使用效果。 这篇论文讨论如何使用深度卷积神经网络检测讽刺。另外,这项新研究使用眼动追踪、NLP和深度学习算法检测讽刺。 研究员开发了一项成为“情感聊天机器”的方法,这个聊天机器人不仅能给出符合事实与逻辑的答案,还能在聊天中加入悲伤、厌烦等情绪。 Lei Zhang 等研究员发表了一篇论文,综合概括了深度学习方法如何用于情感分析。 这个双向异步框架可以在聊天中生成有意义的情感回复。 这项研究使用计算机视觉方法,研究语境中的情感识别。 这篇在2018 NAACL 大会上发表的论文,提出了一种方法可以使用简单的递归神经网络模拟情感流。 深度学习 DeepMind 与哈佛大学教师 Wouter Kool 合作发表了论文,研究人类如何使用大脑来做决定,以及这些研究结果能如何启发人工智能的研究。 这篇论文引入了“群组归一化”的概念,可以有效替代批归一化,被认为是深度学习的一项重要技术。 Sperichal CNN 是一种打造卷积神经网络的新方法。 BAIR 发布了一篇文章,讨论目前循环神经网络和前馈神经网络在解决各种问题时的优缺点。 Facebook 的 AI 研究小组开发了一项新技术,能将 AI 模型运行效率提升16%。这能提高 AI 模型的训练速度,并简化模型的量化和运行。 这篇《自然》杂志论文,介绍了一种可以预测地震后余震位置的深度学习方法。 DeepMind 研究员开发了一种新方法,利用神经算数逻辑单元(NALU)改善神经网络,追踪时间、用数字图片运行算数、数图片中的物体个数等等。 DARTS 是一种架构搜索算法,可以设计高性能的图像分类卷积架构。 这篇论文《实证验证序列建模中的通用卷积网络和神经网络》,讨论了序列建模中 CNN 和 RNN 的区别。 图形神经网络如何帮助推断潜在关系结构、模拟多代理和物理动态。 谷歌 AI 研究团队发布了一篇论文,提出了一种改进版的 RNN,能够提高自动数据解读的精确度。 Distill 发布了新研究,可以在一个数据源的语境下分析另一个数据。- 如果没有任何数据、也没有任何人类知识工程,有可能习得精准的认知模型吗?这项研究会告诉你答案。 这篇论文详细描述了针对深度神经网络的批归一化研究。 这篇论文回顾了神经网络中,如何更好地进行批训练。 这篇论文讨论如何正确评估深度半监督学习算法。 本文由阿里云云栖社区组织翻译。文章原标题《NLP Highlights of 2018》,译者:炫,审校:袁虎。文章简译,更为详细的内容,请查看原文。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

WebStorm

WebStorm

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

用户登录
用户注册