2021-01-31

《Effective Java》笔记

2. 创建和销毁对象

1. 静态工厂方法替代构造器

优点:

  1. 名称清晰
  2. 每次调用不必new对象
  3. 可以返回原返回类型任意子类型对象
  4. 返回的对象可以随着调用而发生改变
  5. 返回的对象所属的类,在编写该静态工厂方法的类时可以不存在
    缺点:
  6. private 构造器导致,就不能有子类,子类构造器会默认访问父类构造器

2. 多个构造器参数时可以使用构建器(建造者模式 Builder)

印象比较深刻的是:之前写安卓用到了OkHttp,使用的OkHttp是用Kotlin写的,其中实例化对象用的就是这个建造者模式,当时以为是Kotlin链式调用的某种语法特性,后来才知道是设计模式

主要用于多参数时,避免重叠构造器和避免无参构造器创建对象依次set参数过程中JavaBean可能处于的不一致状态

3. 私有化构造器或者枚举类型强化Singleton属性

Singleton常见实现方法:

  1. final修饰的公有静态成员
  2. 静态工厂
  3. 单元素Enum

通过放射调用私有构造器,可以修改构造器,创建第二个实例时抛出异常
序列化时除了实现 Serializable接口,还需要提供readResolve,防止反序列化创建新的实例

4. 私有构造器强化不可实例化

5. 优先考虑依赖注入来引用资源

SOLID 原则中的 D 依赖反转原则 (Dependency Inversion Principle),依赖注入是该原则的一种实现方式
创建一个新的实例时,就将该资源传到构造器中

6. 避免创建不必要的对象

  1. 不使用 new String() 方式创建String实例,使用 String s ="hello"; 方式,同一台虚拟机的代码,字符串字面常量相同,该对象就会被重用
  2. 复用创建成本较高的实例:正则Pattern实例
  3. 优先使用基本类型,自动装箱一定程度降低性能
    注意!在提倡保护性拷贝时,重用对象付出代价远大于创建重复对象

7. 清除过期的对象引用

  1. 栈pop时应将pop的对象设置为null
  2. 避免缓存内存泄漏的一种方式:WeakHashMap,除了WeakHashMap的键之外,如果没有存在对某个键的引用,会被自动删除
  3. 监听器和其他回调造成的内存泄漏:只保留他们的弱引用,例如保存成WeakHashMap的键

8.避免使用终结方法和清除方法

终结方法 (finalizer) 和 清除方法(cleaner JDK9) 都不可预测且会造成性能损失
注重时间的任务不应该使用这两种方法来完成
不应该依赖这两种方法来更新重要的持久状态(比如:释放共享资源,可能还没开始释放资源,系统就垮掉了)
TODO p25 终结方法攻击(finalizer attack)
TODO 合理用途:

  1. 安全网,忘记close
  2. 回收对象的本地对等体(native peer)

9. try-with-resources 优先于try-finalyy

实现了AutoCloseable 接口

  1. 优雅
  2. 避免底层物理设备异常导致第一个异常被第二个异常抹除,增加排错成本

3. 对于所有对象都通用的方法

10. 覆盖Equals时请注意遵守通用约定

不用覆盖的情况(满足其一即可)

  1. 类的每个实例本质都唯一
  2. 类无需提供逻辑相等功能
  3. 父类的equals方法足够满足使用
  4. 类是私有或者默认权限或确定不会调用到equals

覆盖equals的通用规范

  1. 自反性 非null值,x.equals(x) 为true 子类和父类不同的equals方法,相互equals会违反自反性
  2. 对称性 非null值,x.equals(y) 等于 y.equals(x)
  3. 传递性 非null值,x.equals(y) 为ture 且 y.equals(z) 为true -> x.equals(z)为true 子类相较于父类增加了一些用于equals的属性,但是子类还使用父类equals,违反传递性
  4. 一致性 非null值,值未修改,多次调用equals 结果应一致
  5. x非null值,x.equals(null) 返回 false

子类与父类 自反性和传递性的对立:无法再拓张可实例化的类的同时,既增加新的值组件,同时又保留equals约定

IDEA 默认子类equals写法就是:使用getClass() 比较对象,然后调用父类equals最后对比子类拓展的属性

Stream 初始化Set:

 private static final Set<Point> unitCircle = Stream.of(   new Point(1, 0),   new Point(0, 1),   new Point(-1, 0),   new Point(0, -1) ).collect(Collectors.toCollection(HashSet::new));

辨析:instanceof getClass()==

  • instanceof 这个对象是否为这个类或其子类的实例
  • getClass()== 运行时期对象的类

使用复合优于继承:提供私有Point域以及共有视图(view)方法

JDK反例:public class Timestamp extends java.util.Date,在同一个集合中使用或者其他方式混合使用,可能有不正确的行为

instanceof 第一个操作符为null 那么返回的一定为false,使用instanceof可以省略null判断

一致性,不要使equals方法依赖于不可靠的资源,JDK反例:URL equals

高质量equals诀窍

  1. == 检查是否为这个对象的引用
  2. instanceof 检查是否为正确类型(同时也可以排除掉null)
  3. 转换为正确的类型
  4. 检查每个关键域
    • 基本类型: ==
    • 浮点数:Float.compare(float,float) Double.compare(double,double) 使用Float.equals或Double.equals 自动装箱减低性能
    • 数组域:Arrays.equals
    • 合法null:Objects.equals(Object,Object) 避免抛出空指针异常
    • 顺序上按照:最有可能不一致或开销最小的域

注意点:

  1. 覆盖equals时总要覆盖hashCode
  2. 不要过度寻找等价关系,比如考虑别名形式
  3. 不要把equals参数定义为非Object 这样是重载而非重写

11. 覆盖equals时总要覆盖hashCode

  1. 同个对象多次调用hashCode返回同一个值
  2. equals(Object) 相等 hashCode返回整数也相等
  3. equals(Object) 不相等 hashCode 有可能相等

Object的hashCode方法为native方法:public native int hashCode();
hashCode注释提到:hashCode返回的是由对象存储地址转化得到的值

 As much as is reasonably practical, the hashCode method defined by class {@code Object} does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java&trade; programming language.)

如果没有覆盖hashCode导致两个相同实例具有不同散列码,HashMap有一项优化,可以将每个项相关联的散列码缓存起来,如果散列码不匹配,不会校验对象相等性
好的散列函数倾向于"为不相等的对象产生不相等的散列码",每个对象都被映射到同一个散列桶中,会实其退化为链表

简单解决方法:

  1. 定义 int result ,初试化为对象第一个关键域散列码
  2. 对每个关键域f完成这些步骤,得到散列码c
    • 计算f散列值:基本类型 包装类.hashCode(f);对象引用递归调用hashCode,或者为域计算一个范式,范式调用hashCode;null返回0;数组中没有重要元素用常数代替,都很重要用Arrays.hashCode(f)
    • 累加:result = 31* result + c;
  3. 返回 result

使用31原因:

  1. 31为奇素数,避免乘以偶数导致的乘法移除信息丢失
  2. 乘以31可以用移位和减法代替 31*i == (i<<5) -1
计算机在进行数值运算的时候,是通过补码表示每个数值的正数原反补相同;负数反码符号位不变,其它位都取反;负数的补码在反码的基础上加1Java 三种位运算(补码)<< 左移:丢弃最高位,0补最低位>> 右移:符号位不变,左边填充符号位>>> 无符号右移:忽略了符号位,左边填充0

Objects类:public static int hash(Object... values) 便捷,但是相对速度慢一些:可变参数引发数组创建,基本类型需要拆箱装箱
不可变类用使用private 变量 缓存hash值, 延迟初始化(lazily initialize)

构造器为:PhoneNumber(short areaCode, short prefix, short lineNum) ,必须强转 (short)1
直接传入整数,否者报错,没有int类型构造器

注意:

  1. 不要通过排除关键域来提高性能,反而可能导致实例被映射在极少数散列码上
  2. 不要对hashCode返回值做具体规定,可能影响其在未来的改进

12. 始终要覆盖toString

Object实现:类名称@散列码无符号十六进制表示
toString 返回对象中包含的所有值得关注的信息

可以在文档中指定返回的格式,并配套静态工厂或者构造器,便于相互转换,JDK例子:BigInteger、BigDecimal、包装类
静态工具类和大多数枚举类编写toString意义不大

13. 谨慎地覆盖clone

记得实现Cloneable接口(空的interface),否者抛出异常:java.lang.CloneNotSupportedException
Object中的clone方法:protected native Object clone() throws CloneNotSupportedException;

TODO p46
实现Cloneable接口的类是为了提供一个功能适当复杂的公有clone方法,它无需调用构造器就可以创建对象
不变类永远都不应该提供clone方法

Clone方法就是另一个构造器;必须保证它不会伤害到原始对象,并确保正确地创建被克隆对象中的约束条件

  1. 递归调用clone拷贝内部信息
  2. 如果域含有对象数组,要注意递归或迭代深拷贝

如果域是final修饰,clone是禁止给final域赋值,Cloneable架构于引用可变对象的final域的正常用法是不相兼容的

线程安全:Object类 clone 没有同步

实现了Cloneable接口的类

  1. 都应该覆盖clone方法,且是共有方法,返回类型为本身
  2. 调用super.clone()
  3. 修正域(深拷贝)

拷贝对象更好的方法是提供拷贝构造器和拷贝工厂

最佳实践:用clone复制数组

14. 考虑实现Comparable接口

Comparable接口:public int compareTo(T o);
将这个对象与指定对象比较,大于、等于、小于指定对象返回负整数、零和正整数,类型不匹配抛出RuntimeException:ClassCastException

通用约定

  1. sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  2. 可传递:(x.compareTo(y) > 0) && (y.compareTo(z) > 0) -> (x.compareTo(z) > 0)
  3. (x.compareTo(y) == 0) 所有的z满足:sgn(x.compareTo(z) == 0) == sgn(y.compareTo(z))
    建议:(x.compareTo(y) == 0) -> x.equals(y)

依赖比较关系的类有:TreeSet TreeMap Collections Arrays

与equals相同:无法在用新的值组件拓展课实例化的类时,同时保持compareTo约定,除非放弃面向对象抽象优势;可以通过组合方式实现Comparable接口的类增加值组件(提供"视图" view方法)

  BigDecimal d1 = new BigDecimal("1.0");  BigDecimal d2 = new BigDecimal("1.00");  System.out.println(d1.equals(d2)); // false  System.out.println(d1.compareTo(d2)); // 0  Set<BigDecimal> bigDecimals = new HashSet<>();  // equals 比较  bigDecimals.add(d1);  bigDecimals.add(d2);  System.out.println(bigDecimals); // [1.0, 1.00]   Set<BigDecimal> treeSets = new TreeSet<>();  // compareTo 比较  treeSets.add(d1);  treeSets.add(d2);  System.out.println(treeSets); // [1.0]

注意Double和Float 使用compare比较而非 < >
Java7 提供了包装类的静态compare方法,建议在compareTo中使用

从关键域开始逐步比较所有域,某个域产生非零结果立即返回

Java 8 提供了Comparator接口,简洁,但是要付出性能成本

 private static final Comparator<PhoneNumber> COMPARATOR =   comparingInt((PhoneNumber pn) -> pn.areaCode)     .thenComparingInt((PhoneNumber pn) -> pn.prefix)     .thenComparingInt((PhoneNumber pn) -> pn.lineNum); @Override public int compareTo(PhoneNumber pn) {  return COMPARATOR.compare(this, pn); }

参考资料

GitHub effective-java-3e-source-code
Effective Java - 豆瓣
java中instanceof和getClass()的作用
Initializing HashSet at the Time of Construction
Java Object.hashCode()源码分析
通俗易懂的 Java 位操作运算讲解
Java 位运算(移位、位与、或、异或、非)









原文转载:http://www.shaoqun.com/a/521241.html

跨境电商:https://www.ikjzd.com/

photobucket:https://www.ikjzd.com/w/132

刘军:https://www.ikjzd.com/w/1835


2.创建和销毁对象1.静态工厂方法替代构造器优点:名称清晰每次调用不必new对象可以返回原返回类型任意子类型对象返回的对象可以随着调用而发生改变返回的对象所属的类,在编写该静态工厂方法的类时可以不存在缺点:private构造器导致,就不能有子类,子类构造器会默认访问父类构造器2.多个构造器参数时可以使用构建器(建造者模式Builder)印象比较深刻的是:之前写安卓用到了OkHttp,使用的OkHt
eprice:eprice
noon:noon
5年亚马逊生涯,大神分享CPC压箱底技能让你细细品!:5年亚马逊生涯,大神分享CPC压箱底技能让你细细品!
亚马逊卖家违规ASIN创建账号被封 / Wish官方回应2000美元开店注册金难退回:亚马逊卖家违规ASIN创建账号被封 / Wish官方回应2000美元开店注册金难退回
中东站成为亚马逊"新宠",2019电商蓝海新机遇:中东站成为亚马逊"新宠",2019电商蓝海新机遇

5年老码农,update语句误用一个双引号,生产数据全变0了

一、前言

最近经常碰到开发误删除误更新数据,这不,他们又给我找了个麻烦,我们来看下整个过程,把我坑得够惨。2021Java面试宝典

二、过程

由于开发需要在生产环节中修复数据,需要执行120条SQL语句,需要将数据进行更新,于是开发连上了生产数据库,首先执行了第一条SQL

update tablename set source_name = "bj1062-北京市朝阳区常营北辰福第" where source_name =  "-北京市朝阳区常营北辰福第"

我们仔细看了下,这个SQL,的确没有什么问题,where条件也是正常的,大意就是将这个地址的前面加字符串bj1062,是真的没有错误么?是的没有错误。开发执行完成后,结果的确是符合预期。

然后开发执行了剩下的SQL,都是和上面的SQL一样,将地址进行更新。执行完成后,开发懵逼了,发现source_name都变成了0,开发赶紧给我打电话说:

涛哥,我执行了update,where条件都是对的,set的值也是对的,但是set后的字段全部都变成了0,你赶紧帮我看看,看看能不能恢复数据。

我赶紧登上服务器,查看了这段时间的binlog,发现了大量的update tablename set source_name=0的语句,利用binlog2sql进行了解析,项目地址:

binlog2sql github.com/danfengcao/…

 

 

赶紧和开发确定了操作的时间点,生成flashback的SQL,进行了数据恢复,同时保留现场证据。

然后对开发执行的SQL进行了check,发现了几条很诡异的SQL

这几条SQL的引号位置跑到了where 字段名字后面,简化后的SQL变成了:

update tbl_name set str_col="xxx" = "yyy"

那么这个SQL在MySQL他是如何进行语义转化的呢?

可能是下面这样的么?

update tbl_name set (str_col="xxx" )= "yyy"

这样就语法错误了,那么只会是下面这样的形式,

update tbl_name set str_col=("xxx" = "yyy")

select "xxx" = "yyy" 

的值是0,所以

update tbl_name set str_col="xxx" = "yyy"

等价于

update tbl_name set str_col=0

所以就导致了source_name字段全部更新成了0.

我们再研究下select形式这种语句会怎么样。

mysql [localhost] {msandbox} (test) > select id,str_col from tbl_name where str_col="xxx" = "yyy";+----+---------+| id | str_col |+----+---------+| 1 | aaa  || 2 | aaa  || 3 | aaa  || 4 | aaa  |+----+---------+

我们发现,这个SQL将str_col='aaa'的记录也查找出来了,为什么呢?

mysql [localhost] {msandbox} (test) > warningsShow warnings enabled.mysql [localhost] {msandbox} (test) > explain extended select id,str_col from tbl_name where str_col="xxx" = "yyy"\G*************************** 1. row ***************************   id: 1 select_type: SIMPLE  table: tbl_name   type: indexpossible_keys: NULL   key: idx_str  key_len: 33   ref: NULL   rows: 4  filtered: 100.00  Extra: Using where; Using index1 row in set, 1 warning (0.00 sec)Note (Code 1003): /* select#1 */ select `test`.`tbl_name`.`id` AS `id`,`test`.`tbl_name`.`str_col` AS `str_col` from `test`.`tbl_name` where ((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy')

这里他把where条件转化成了

((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy')

这个条件的首先判断str_col 和'xxx'是否相等,如果相等,那么里面括号的值为1,如果不相等,就是0

然后0或者1再和和'yyy'进行判断,由于等号一边是int,另外一边是字符串,两边都转化为float进行比较,这就是MySQL中隐式转换导致的查询结果出现错误。'yyy'转化为浮点型为0,0和0比较恒等于1

mysql [localhost] {msandbox} (test) > select 'yyy'+0.0;+-----------+| 'yyy'+0.0 |+-----------+|   0 |+-----------+1 row in set, 1 warning (0.00 sec)mysql [localhost] {msandbox} (test) > select 0=0;+-----+| 0=0 |+-----+| 1 |+-----+1 row in set (0.00 sec)

这样导致结果恒成立,也就是select语句等价于以下SQL

select id,str_col from tbl_name where 1=1;

将查询出所有的记录。

三、小结

在写SQL的过程中,一定要小心引号的位置是否正确,有时候引号位置错误,SQL依然是正常的,但是却会导致执行结果全部错误。在执行前必须在测试环境执行测试,结合IDE的语法高亮发现相应的问题。2021Java面试宝典












原文转载:http://www.shaoqun.com/a/521240.html

跨境电商:https://www.ikjzd.com/

tineye:https://www.ikjzd.com/w/448

智邦:https://www.ikjzd.com/w/2376


一、前言最近经常碰到开发误删除误更新数据,这不,他们又给我找了个麻烦,我们来看下整个过程,把我坑得够惨。2021Java面试宝典二、过程由于开发需要在生产环节中修复数据,需要执行120条SQL语句,需要将数据进行更新,于是开发连上了生产数据库,首先执行了第一条SQLupdatetablenamesetsource_name="bj1062-北京市朝阳区常营北辰福第"wheres
打折网:打折网
捷汇:捷汇
口述:我的婚姻遭遇冷暴力(2/2):口述:我的婚姻遭遇冷暴力(2/2)
韩蓬:一站式、全自动化亚马逊广告投放和优化解决方案:韩蓬:一站式、全自动化亚马逊广告投放和优化解决方案
世界杯捞金大法:世界杯捞金大法

抖音数据采集教程,unidbg Ollvm 字符串加密解析

抖音数据采集教程,unidbg Ollvm 字符串加密解析

短视频、直播数据实时采集接口,请查看文档: TiToData


免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负。


原理: 利用 unicorn 的 mem hook 在内存加载完 so 后,dump 出纯净的数据。
有两种方法:

核心方法

  • 方法1: 利用 getBackend() 来复刻 Unicorn 的内存 hook 方法。
  • 方法2: 利用 traceCode() 来 trace 指定内存段, hook 内存数据。

注意,getBackend 是用 Unicorn 来驱动的, 所以只能用在 dbg 的 unicorn 引擎上
getBackend 为例

emulator.getBackend().hook_add_new(new WriteHook() { @Override public void hook(Backend backend, long address, int size, long value, Object user) {  System.out.println(Long.toHexString(address) + "----" + size + "----" + value);  byte[] bytes = long2Bytes(value, size);  modifyMap.put(address, bytes); }}, 0, Long.MAX_VALUE, null);

Java
_ 复制_
这样就可以 hook 在指定时刻hook内存数据了。

衍生

当然可以加以封装一个 GUI 这样就可以鼠标点点就可以完成工作了












原文转载:http://www.shaoqun.com/a/521235.html

跨境电商:https://www.ikjzd.com/

文化衫事件:https://www.ikjzd.com/w/1932

heap:https://www.ikjzd.com/w/2012


抖音数据采集教程,unidbgOllvm字符串加密解析短视频、直播数据实时采集接口,请查看文档:TiToData免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负。原理:利用unicorn的memhook在内存加载完so后,dump出纯净的数据。有两种方法:核心方法方法1:利用getBackend()来复刻Unicorn的内存hook方法。方法2:利用traceCode()来tra
promoted:promoted
woot:woot
MercadoLibre:MercadoLibre
亚马逊或重新定义供应链,构建供应链平台!:亚马逊或重新定义供应链,构建供应链平台!
Lazada 327大促临近 平台发布活动报名指南:Lazada 327大促临近 平台发布活动报名指南

水花隔空“连线”!汤普森神预言库里中三分:赛后采访萌神欢乐多_第三节

原标题:水花隔空"连线"!汤普森神预言库里中三分:赛后采访萌神欢乐多

北京时间1月31日,NBA常规赛勇士对决活塞。只打了29分钟,库里17投11中,三分球8中6,拿到了28分7助攻5篮板。这一战汤普森客串解说,第三节两人还上演了一次隔空另类连线,让人想念水花兄弟联手的日子。赛后,汤普森也采访了库里,相当欢乐。

第三节还剩8分14秒,勇士发动反击。格林抢下篮板之后,送出精准长传,库里快下到前场,接球之后,直接出手,根本不等对手落位。

看到库里出手,球还在空中飞行,汤普森就已经忍不住说道,"斯蒂芬这球进了。"此时,另一位解说搭话,"你以前看过。"汤普森大笑说道,"我看过很多次了。"

确实这样的场景,汤普森再熟悉不过了。两人都是这个联盟顶级的射手,现在球迷还在回忆两人在场上互相谦让投三分的搞笑画面。

然而,汤普森因为跟腱撕裂重伤,本赛季再度报销。两人上一次一起出现在场上已经是2019年6月14日跟猛龙的总决赛第五场对决。

没有了汤普森在身边,库里需要独挑大梁,这一战,他第三节单节拿到了15分。带队一波流带走了比赛。这样的大胜,或许会让库里回忆起当年跟汤普森联手的岁月,那时候三节打卡是常规操作。

值得一提的是,赛后,汤普森采访了库里,两人大笑不停,太欢乐。汤普森问库里,"你还要多久能打破雷-阿伦的三分纪录。"库里大笑表示,"你是解说员,你更清楚。"此后两人还互相调侃了老爹,库里笑言自己的老爹更厉害,汤普森"气"得摔麦走人。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/389652.html

跨境电商:https://www.ikjzd.com/

worldfirst:https://www.ikjzd.com/w/289

aeo:https://www.ikjzd.com/w/2356


原标题:水花隔空"连线"!汤普森神预言库里中三分:赛后采访萌神欢乐多北京时间1月31日,NBA常规赛勇士对决活塞。只打了29分钟,库里17投11中,三分球8中6,拿到了28分7助攻5篮板。这一战汤普森客串解说,第三节两人还上演了一次隔空另类连线,让人想念水花兄弟联手的日子。赛后,汤普森也采访了库里,相当欢乐。第三节还剩8分14秒,勇士发动反击。格林抢下篮板之后,送出精准长传,库里快下到前场,接球之
虚拟信用卡:虚拟信用卡
锦桥纺织网:锦桥纺织网
R标:R标
稳住!有了Amazon Business全套产品合规解决方案,还怕产品不通关?:稳住!有了Amazon Business全套产品合规解决方案,还怕产品不通关?
海外仓来全年销售高峰,哪些产品值得超50%备货WE?:海外仓来全年销售高峰,哪些产品值得超50%备货WE?

少赛一场3分领跑!英超争冠大乱斗成曼城独舞,联赛冠军稳了?_比赛

原标题:少赛一场3分领跑!英超争冠大乱斗成曼城独舞,联赛冠军稳了?

北京时间1月31日,英超第21轮联赛已经结束了5场比赛,其中有几场焦点之战让人关注,埃弗顿0-2输给纽卡斯尔、曼城1-0谢菲联队、阿森纳0-0战平曼联队,这三场比赛里,关系着争冠集团的三支队伍,最终曼城独领风骚,拿到三分,而埃弗顿跟曼联都输了,联赛争冠形势越来越明朗了。

英超本赛季的争冠形势十分胶着,此前堪称争冠大乱斗,从1第一名到第10名的队伍,积分差距也就两场比赛的胜负而已,而做过榜首的队伍一度有9支队伍。然而随着联赛的逐渐深入,如今愈发的开始变成曼城独舞的地步了,整个联赛争冠形势,被曼城拿捏得死死的,其他球队几乎难有翻身希望了。

本轮联赛曼城1-0击败谢菲联,球队是豪取12连胜了,而作为曼城争冠对手的曼联,则在客场跟阿森纳0-0战平,由此本轮比赛后,曼联已经落后曼城3分了,而曼城还少赛一场,只要拿到补赛三分,曼城将以6分领跑,以曼城当下的状态,曼联难以逆袭。

卫冕冠军利物浦当下是拿到了37分,落后曼城达到了7分,这样的积分差距让利物浦的卫冕形势十分糟糕,本赛季的利物浦是多灾多难,球员不断被确诊,然后主力球员阿利松、范迪克又先后受伤,利物浦就没凑齐过一套最强阵容。

其他坐过联赛榜首的队伍,如今都已经逐渐跟曼城拉开差距:莱斯特城、热刺、埃弗顿、切尔西、阿森纳,这些球队曾经都在曼城身前,然而他们都是一个相同的点,那就是高开低走,随着赛季深入状态越来越糟糕,反观曼城的是低开高走,球队的状态越来越好,大有无人可挡的趋势。

曼城能有今天的状态,必须得表扬瓜迪奥拉,他越来越讲究成绩,而不是他那一套传控了,毕竟比赛踢得漂亮,没有胜利啥都不是。如今的曼城,比赛也踢得丑陋了,但能够拿分,拿到各项赛事12连胜,就是最好的回馈了。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/389642.html

跨境电商:https://www.ikjzd.com/

声网:https://www.ikjzd.com/w/2176

海豚村:https://www.ikjzd.com/w/1779


原标题:少赛一场3分领跑!英超争冠大乱斗成曼城独舞,联赛冠军稳了?北京时间1月31日,英超第21轮联赛已经结束了5场比赛,其中有几场焦点之战让人关注,埃弗顿0-2输给纽卡斯尔、曼城1-0谢菲联队、阿森纳0-0战平曼联队,这三场比赛里,关系着争冠集团的三支队伍,最终曼城独领风骚,拿到三分,而埃弗顿跟曼联都输了,联赛争冠形势越来越明朗了。英超本赛季的争冠形势十分胶着,此前堪称争冠大乱斗,从1第一名到第
环球易购:环球易购
xinong:xinong
沃尔玛将推出"沃尔玛+"服务 或对标亚马逊Prime:沃尔玛将推出"沃尔玛+"服务 或对标亚马逊Prime
Lazada商家百科第三期:入驻、运营、物流三大模块答疑:Lazada商家百科第三期:入驻、运营、物流三大模块答疑
连连支付内部系统升级,或对Shopee卖家造成一定影响!:连连支付内部系统升级,或对Shopee卖家造成一定影响!

火箭消息:赛前伤情出炉,东契奇有不满?火箭球迷:来找塞帅_卢卡

原标题:火箭消息:赛前伤情出炉,东契奇有不满?火箭球迷:来找塞帅

目前火箭已经能打出4连胜的战绩,接下来他们将在北京时间1月31日对阵英格拉姆和威廉姆森率领下的鹈鹕,火箭也将有机会将赛季连胜扩大到5场。

在这场比赛之前,两队的伤病状况也有所更新,火箭方面仅有丹特-埃克萨姆因为右小腿拉伤无法出战,鹈鹕方面像朗佐-鲍尔因右脚踝扭伤被列入出战成疑的行列,老将射手JJ雷迪克上场比赛已经缺席,不过球队表示雷迪克还很健康,只是他能否出战还是未知数。

在即将到来的这场比赛,作为火箭内线防守悍将的PJ塔克就谈及对阵前状元秀锡安-威廉姆森的这个挑战:

"PJ塔克说道,他以前从未防守过像锡安-威廉姆森这样的球员,如果扎克-兰多夫也拥有这样的运动天赋,那或许就是威廉姆森。"

最后需要谈及的是,由于有消息曝出独行侠当家新星卢卡-东契奇似乎已经对球队有所不满,甚至在比赛中出现与队友争吵的镜头,所以火箭球迷也在猜测卢卡-东契奇是否有加盟这支火箭的可能性:

在火箭球迷基地账号所发布的这张图中,球迷提及了卢卡-东契奇离开独行侠并且加盟火箭与前独行侠助教,也就是现任火箭主教练斯蒂芬-塞拉斯再次联手。

这确实会是非常有趣的想法,毕竟卢卡-东契奇曾在斯蒂芬-塞拉斯的帮助下有出色的进攻端表现,而且考虑到火箭确实也需要这样一名超级新星球员的率领下前进,如果火箭有与独行侠推动涉及卢卡-东契奇的交易,这毫无疑问会是非常舒服的一件事。

目前情况是独行侠方面并没有曝出任何关于卢卡-东契奇想要离队的传闻,毕竟只是稍微的对球队不满或是与队友发生挣扎并不意味着就会做出离队的决定。当然,火箭球迷也会期待这件事的发生。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/389643.html

跨境电商:https://www.ikjzd.com/

feedly:https://www.ikjzd.com/w/754

贝贝特卖:https://www.ikjzd.com/w/1321


原标题:火箭消息:赛前伤情出炉,东契奇有不满?火箭球迷:来找塞帅目前火箭已经能打出4连胜的战绩,接下来他们将在北京时间1月31日对阵英格拉姆和威廉姆森率领下的鹈鹕,火箭也将有机会将赛季连胜扩大到5场。在这场比赛之前,两队的伤病状况也有所更新,火箭方面仅有丹特-埃克萨姆因为右小腿拉伤无法出战,鹈鹕方面像朗佐-鲍尔因右脚踝扭伤被列入出战成疑的行列,老将射手JJ雷迪克上场比赛已经缺席,不过球队表示雷迪克
抢注商标:抢注商标
淘粉吧返利:淘粉吧返利
打造完美亚马逊产品listing转化率关键一环是什么?:打造完美亚马逊产品listing转化率关键一环是什么?
用CPC广告,快速打造Best Seller:用CPC广告,快速打造Best Seller
2020年做外贸,这些靠谱的建议你一定要知道!:2020年做外贸,这些靠谱的建议你一定要知道!

Kafka 如果丢了消息,怎么处理的?

Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。

Broker

Broker丢失消息是由于Kafka本身的原因造成的,kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中。消息的刷盘过程,为了提高性能,减少刷盘次数,kafka采用了批量刷盘的做法。即,按照一定的消息量,和时间间隔进行刷盘。这种机制也是由于linux操作系统决定的。将数据存储到linux操作系统种,会先存储到页缓存(Page cache)中,按照时间或者其他条件进行刷盘(从page cache到file),或者通过fsync命令强制刷盘。数据在page cache中时,如果系统挂掉,数据会丢失。

Broker在linux服务器上高速读写以及同步到Replica

上图简述了broker写数据以及同步的一个过程。broker写数据只写到PageCache中,而pageCache位于内存。这部分数据在断电后是会丢失的。pageCache的数据通过linux的flusher程序进行刷盘。刷盘触发条件有三:

  • 主动调用sync或fsync函数
  • 可用内存低于阀值
  • dirty data时间达到阀值。dirty是pagecache的一个标识位,当有数据写入到pageCache时,pagecache被标注为dirty,数据刷盘以后,dirty标志清除。

Broker配置刷盘机制,是通过调用fsync函数接管了刷盘动作。从单个Broker来看,pageCache的数据会丢失。

Kafka没有提供同步刷盘的方式。同步刷盘在RocketMQ中有实现,实现原理是将异步刷盘的流程进行阻塞,等待响应,类似ajax的callback或者是java的future。下面是一段rocketmq的源码。

GroupCommitRequest request = new GroupCommitRequest(result.getWroteOffset() + result.getWroteBytes());service.putRequest(request);boolean flushOK = request.waitForFlush(this.defaultMessageStore.getMessageStoreConfig().getSyncFlushTimeout()); // 刷盘

也就是说,理论上,要完全让kafka保证单个broker不丢失消息是做不到的,只能通过调整刷盘机制的参数缓解该情况。比如,减少刷盘间隔,减少刷盘数据量大小。时间越短,性能越差,可靠性越好(尽可能可靠)。这是一个选择题。

为了解决该问题,kafka通过producer和broker协同处理单个broker丢失参数的情况。一旦producer发现broker消息丢失,即可自动进行retry。除非retry次数超过阀值(可配置),消息才会丢失。此时需要生产者客户端手动处理该情况。那么producer是如何检测到数据丢失的呢?是通过ack机制,类似于http的三次握手的方式。

The number of acknowledgments the producer requires the leader to have received before considering a request complete. This controls the durability of records that are sent. The following settings are allowed: acks=0 If set to zero then the producer will not wait for any acknowledgment from the server at all. The record will be immediately added to the socket buffer and considered sent. No guarantee can be made that the server has received the record in this case, and the retries configuration will not take effect (as the client won't generally know of any failures). The offset given back for each record will always be set to -1. acks=1 This will mean the leader will write the record to its local log but will respond without awaiting full acknowledgement from all followers. In this case should the leader fail immediately after acknowledging the record but before the followers have replicated it then the record will be lost. acks=allThis means the leader will wait for the full set of in-sync replicas to acknowledge the record. This guarantees that the record will not be lost as long as at least one in-sync replica remains alive. This is the strongest available guarantee. This is equivalent to the acks=-1 setting.

  • acks=-1,leader broker收到消息后,挂起,等待所有ISR列表中的follower返回结果后,再返回ack。-1等效与all。这种配置下,只有leader写入数据到pagecache是不会返回ack的,还需要所有的ISR返回"成功"才会触发ack。如果此时断电,producer可以知道消息没有被发送成功,将会重新发送。如果在follower收到数据以后,成功返回ack,leader断电,数据将存在于原来的follower中。在重新选举以后,新的leader会持有该部分数据。数据从leader同步到follower,需要2步:

    1. 数据从pageCache被刷盘到disk。因为只有disk中的数据才能被同步到replica。
    2. 数据同步到replica,并且replica成功将数据写入PageCache。在producer得到ack后,哪怕是所有机器都停电,数据也至少会存在于leader的磁盘内。
  • 上面第三点提到了ISR的列表的follower,需要配合另一个参数才能更好的保证ack的有效性。ISR是Broker维护的一个"可靠的follower列表",in-sync Replica列表,broker的配置包含一个参数:min.insync.replicas。该参数表示ISR中最少的副本数。如果不设置该值,ISR中的follower列表可能为空。此时相当于acks=1。

    如上图中:

    • acks=0,总耗时f(t) = f(1)。
    • acks=1,总耗时f(t) = f(1) + f(2)。
    • acks=-1,总耗时f(t) = f(1) + max( f(A) , f(B) ) + f(2)。

    性能依次递减,可靠性依次升高。

    Producer

    Producer丢失消息,发生在生产者客户端。

    为了提升效率,减少IO,producer在发送数据时可以将多个请求进行合并后发送。被合并的请求咋发送一线缓存在本地buffer中。缓存的方式和前文提到的刷盘类似,producer可以将请求打包成"块"或者按照时间间隔,将buffer中的数据发出。通过buffer我们可以将生产者改造为异步的方式,而这可以提升我们的发送效率。

    但是,buffer中的数据就是危险的。在正常情况下,客户端的异步调用可以通过callback来处理消息发送失败或者超时的情况,但是,一旦producer被非法的停止了,那么buffer中的数据将丢失,broker将无法收到该部分数据。又或者,当Producer客户端内存不够时,如果采取的策略是丢弃消息(另一种策略是block阻塞),消息也会被丢失。抑或,消息产生(异步产生)过快,导致挂起线程过多,内存不足,导致程序崩溃,消息丢失。

    producer

    根据上图,可以想到几个解决的思路:

    • 异步发送消息改为同步发送消。或者service产生消息时,使用阻塞的线程池,并且线程数有一定上限。整体思路是控制消息产生速度。
    • 扩大Buffer的容量配置。这种方式可以缓解该情况的出现,但不能杜绝。
    • service不直接将消息发送到buffer(内存),而是将消息写到本地的磁盘中(数据库或者文件),由另一个(或少量)生产线程进行消息发送。相当于是在buffer和service之间又加了一层空间更加富裕的缓冲层。

    Consumer

    Consumer消费消息有下面几个步骤:

    1. 接收消息
    2. 处理消息
    3. 反馈"处理完毕"(commited)

    Consumer的消费方式主要分为两种:

    • 自动提交offset,Automatic Offset Committing
    • 手动提交offset,Manual Offset Control

    Consumer自动提交的机制是根据一定的时间间隔,将收到的消息进行commit。commit过程和消费消息的过程是异步的。也就是说,可能存在消费过程未成功(比如抛出异常),commit消息已经提交了。此时消息就丢失了。

    Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "test");// 自动提交开关props.put("enable.auto.commit", "true");// 自动提交的时间间隔,此处是1sprops.put("auto.commit.interval.ms", "1000");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Arrays.asList("foo", "bar"));while (true) {  // 调用poll后,1000ms后,消息状态会被改为 committed ConsumerRecords<String, String> records = consumer.poll(100); for (ConsumerRecord<String, String> record : records) insertIntoDB(record); // 将消息入库,时间可能会超过1000ms}

    上面的示例是自动提交的例子。如果此时,insertIntoDB(record)发生异常,消息将会出现丢失。接下来是手动提交的例子:

    Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "test");// 关闭自动提交,改为手动提交props.put("enable.auto.commit", "false");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Arrays.asList("foo", "bar"));final int minBatchSize = 200;List<ConsumerRecord<String, String>> buffer = new ArrayList<>();while (true) {  // 调用poll后,不会进行auto commit ConsumerRecords<String, String> records = consumer.poll(100); for (ConsumerRecord<String, String> record : records) { buffer.add(record); } if (buffer.size() >= minBatchSize) { insertIntoDb(buffer);    // 所有消息消费完毕以后,才进行commit操作 consumer.commitSync(); buffer.clear(); }}

    将提交类型改为手动以后,可以保证消息"至少被消费一次"(at least once)。但此时可能出现重复消费的情况,重复消费不属于本篇讨论范围。

    上面两个例子,是直接使用Consumer的High level API,客户端对于offset等控制是透明的。也可以采用Low level API的方式,手动控制offset,也可以保证消息不丢,不过会更加复杂。

     try {  while(running) {   ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);   for (TopicPartition partition : records.partitions()) {    List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);    for (ConsumerRecord<String, String> record : partitionRecords) {     System.out.println(record.offset() + ": " + record.value());    }    long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();    // 精确控制offset    consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));   }  } } finally { consumer.close(); }

    来源:https://blog.dogchao.cn/?p=305

    近期热文推荐:

    1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    4.吊打 Tomcat ,Undertow 性能很炸!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!









    原文转载:http://www.shaoqun.com/a/521215.html

    跨境电商:https://www.ikjzd.com/

    heap:https://www.ikjzd.com/w/2012

    欧苏丹:https://www.ikjzd.com/w/1756


    Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。BrokerBroker丢失消息是由于Kafka本身的原因造成的,kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中。消息的刷盘过程,为了提高性能,减少刷盘次数,kafka采用了批量刷盘的做法。即,按照一定的消息量,和时间间隔进行刷盘。这种机制也是由于linux操作系统决定的。将数据存
    zen cart:zen cart
    淘粉8:淘粉8
    EarData:EarData
    现在入驻shopee还来得及吗?这家企业告诉你!:现在入驻shopee还来得及吗?这家企业告诉你!
    ​干货:亚马逊卖家账号二审最全通关宝典!:​干货:亚马逊卖家账号二审最全通关宝典!

    欧洲3大消费新趋势,卖家速看!

    2020年,欧洲消费者消费习惯与喜好都发生了一定的变化,把控了消费者的消费心理,卖家才能对症下药呀。

     

    消费者关注卖家品牌营销活动

     

    欧洲消费者越来越关注品牌,将品牌与时代背景结合。疫情期间,品牌营销活动应当结合疫情的相关情况展开。

     

    GlobalWebIndex的数据显示,到2020年5月,欧洲将近三分之二(64%)的互联网用户表示,品牌应该开展与疫情相关的广告宣传活动。相反,品牌如果不采取行动采取之相反的宣传活动,就会很容易失去消费者的认可。

     图1.png

    调查的国家中,意大利、爱尔兰、西班牙、波兰、英国、罗马尼亚5个国家都有超过60%的消费者同意该说法,其中意大利高达77%的人这样认为。所以品牌营销宣传活动需结合当下疫情状况。

     

    社会责任与信誉成为消费者衡量卖家的重要标准

     

    Insider Intelligence负责西欧业务的首席市场分析师Karin von Abrams表示,2021年,将会有更多的消费者关注零售商的道德信誉消费者认为公司的道德责任行为应是一项长期承诺。

     图2.png

    Havas Media和ODEC今年4月对西班牙进行的调查显示,88%的成年人希望公司和品牌在封锁结束后,为那些就业或经济状况受到疫情影响的人积极提供免费的产品或推迟付款。超过80%的受访者表示,企业和品牌应该向公共组织和机构捐赠资金或产品,制作积极的广告活动和信息,并增加有助于消费恢复的广告活动和信息。

     

    目前,许多零售商已经开始承担这一义务。毕马威(KPMG)和远距离电子商务(FEVAD)于2020年11月对法国进行调查的调查显示,55%的接受调查的零售商表示这些新的消费者行为对其未来构成了固有风险81%接受调查的零售商表示,承担企业社会责任是当务之急。

     

    "可持续"成为消费者的关注焦点

     

    McKinesy&Company机构的一份对2000多名英、德消费者的调查报告显示,有2/3的调查者认为疫情封锁对气候变化的影响非常重要,有88%表示应该重视污染问题,关注可持续发展。

     

    目前,大量的欧洲消费者开始向"绿色"购买行为转变。据悉,有57%的受访者表示改变了消费行为以保护环境;有65%的受访者计划购买更多高质量、耐用的产品;57%的受访者愿意修理产品以延长使用时间,另外有71%的受访者表示减少丢弃时尚产品。

     

    除此之外,欧洲消费者开始更多的关注二手市场。据悉,约有50%的千禧一代期望通过二手平台购买更多商品。

     

    3大趋势,卖家们可以多多注意,争取抓住欧洲消费者的心和他们的钱包呀。





    原文转载:http://www.shaoqun.com/a/521217.html

    跨境电商:https://www.ikjzd.com/

    hemingway:https://www.ikjzd.com/w/2344

    拍拍网服装:https://www.ikjzd.com/w/2205


    2020年,欧洲消费者消费习惯与喜好都发生了一定的变化,把控了消费者的消费心理,卖家才能对症下药呀。消费者关注卖家品牌营销活动欧洲消费者越来越关注品牌,将品牌与时代背景结合。疫情期间,品牌营销活动应当结合疫情的相关情况展开。GlobalWebIndex的数据显示,到2020年5月,欧洲将近三分之二(64%)的互联网用户表示,品牌应该开展与疫情相关的广告宣传活动。相反,品牌如果不采取行动或采取与之相
    墩煌网:墩煌网
    执御:执御
    最新消息,Facebook Stories广告开始对全球广告商开放:最新消息,Facebook Stories广告开始对全球广告商开放
    贸易环境动荡不安,跨境电商该如何发展?:贸易环境动荡不安,跨境电商该如何发展?
    产品被亚马逊误判为杀虫剂,如何快速申请解禁?:产品被亚马逊误判为杀虫剂,如何快速申请解禁?

    别等老了才补钙,年轻人也该早重视

    核心提示:很多人觉得,补钙是老年人的事情,和年轻人没有关系。事实上,如果30岁以后再补钙,效率将大打折扣。

    很多人觉得,补钙是老年人的事情,和年轻人没有关系。事实上,如果30岁以后再补钙,效率将大打折扣。

    据统计,全中国有 96.6% 的人钙摄入不足,平均摄入量不足 400 毫克,低于中国营养学会推荐钙摄入量的一半。也就是说,有相当多的人需要额外补钙。若是在年轻时不注意补钙,老了更容易骨质疏松!

    严重的骨质疏松会怎样?轻微碰撞、打个喷嚏都可能闪到腰!

    所以,别再以为补钙是老年人的事情,年轻时就应该引起重视。那么日常生活中要如何做才能轻松补钙呢?除了使用钙剂补充以外,我们还可以试试多吃以下几种食物:

    1.奶制品

    奶制品可帮助快速补钙。比如牛奶,号称"天然钙片"。膳食指南推荐我们每天喝 300 克牛奶或者摄入相当量的奶制品,差不多就能满足 1/3 的钙需求。

    有的人可能对乳糖不耐受,则可选择无乳糖牛奶、酸奶或者奶酪。从奶制品的钙含量来看,奶酪最高,酸奶次之,第三是牛奶。虽然奶酪钙含量最高,但不可多吃哦!因为奶酪的热量也很高。

    2.深绿色蔬菜

    别小瞧深绿色蔬菜的钙含量,这可是"大户人家"。而且,它们不仅钙含量高,还有丰富的维生素K,这也是骨钙素合成过程中必需的。

    深绿色蔬菜中钙含量"高材生"分别有:芥菜、乌塌菜、小油菜、芥蓝

    推荐每天摄入一斤左右(300 ~ 500 克)的蔬菜 ,其中深色蔬菜占一半。但是,菠菜、苋菜里含有比较多的草酸,会影响钙的吸收,记得焯水再吃。

    3.豆制品


    有一些豆制品不仅可以补钙,还能提供优质蛋白。比如豆腐干、千张、南豆腐、北豆腐等。

    只要正常饮食并做到以上3点,每天的钙量基本就能满足了。但除了补钙,还应该考虑一些影响钙吸收的因素,比如多晒太阳、补充维生素D等。

    对于孕晚期、哺乳期、青少年和老年人等,钙量的需求更大,更应该引起重视。


    原文转载:http://health.shaoqun.com/a/148980.html

    跨境电商:https://www.ikjzd.com/

    邮政电话:https://www.ikjzd.com/w/202

    e票联:https://www.ikjzd.com/w/1452


    核心提示:很多人觉得,补钙是老年人的事情,和年轻人没有关系。事实上,如果30岁以后再补钙,效率将大打折扣。 很多人觉得,补钙是老年人的事情,和年轻人没有关系。事实上,如果30岁以后再补钙,效率将大打折扣。据统计,全中国有96.6%的人钙摄入不足,平均摄入量不足400毫克,低于中国营养学会推荐钙摄入量的一半。也就是说,有相当多的人需要额外补钙。若是在年轻时不注意补钙,老了更容易骨质疏松!严重的骨质疏
    联动优势电子商务:联动优势电子商务
    acca是什么:acca是什么
    三大策略搞定亚马逊YouTube站外引流:三大策略搞定亚马逊YouTube站外引流
    亚马逊CPC广告监控表:亚马逊CPC广告监控表
    美将28家中国实体列入出口管制"实体清单",商务部回应!:美将28家中国实体列入出口管制"实体清单",商务部回应!

    2021-01-30

    传纸条、打有线电话,金矿事故救援为啥还用原始通讯方式?|矿井|矿工|矿难

      来源:中国科普博览

      山东栖霞笏山金矿爆炸事故,牵动着全国人民的心!截至26日最新消息显示,已有11人成功升井,10人确认遇难,仍有一人处于失联状态,搜救仍在进行,事故原因也在调查中。

      1月17日,救援团队打通了一个钻孔,通过纸条与被困人员取得联系,了解到被困矿工们的具体状况。而后的一段时间中,都是靠着薄薄的纸条联系着地面与井下,直到后来才传入了有线电话与井内建立了稳定的联系。

      山东笏山金矿事故幸存者张某,在事故救援期间,是他写了两张纸条向井上救援人员传递消息。  山东笏山金矿事故幸存者张某,在事故救援期间,是他写了两张纸条向井上救援人员传递消息。

      在通信手段如此多样化的今天,为什么我们还要靠最原始的介质——纸条、电话线和井下被困人员保持通讯?往下送一部手机不可以吗?

    栖霞金矿爆炸事故救援时间线,来源:央广网栖霞金矿爆炸事故救援时间线,来源:央广网

      矿井下通讯方式多样,但事故发生时都容易崩

      其实矿用通讯手段有很多,大致分为依靠实体传输通道的有线与依靠无线信号的无线两种通讯方式。

      通过有线通讯的方式主要有两种,漏泄通信和感应通信均可满足人在井下的通信需求。

      漏泄通信是通过漏泄电缆传输信号。其中用到的漏泄电缆内部金属线并没有完全被屏蔽,而是在电缆上开有漏泄槽,在电缆内部传输的一部分信号能通过漏泄槽的孔漏泄到外部,提供给移动的接收机以达到通信目的。

      而感应通信则主要是依靠矿道内金属导管(矿井内的金属导轨或传输管道等)实现。

     漏泄线缆示意图,来源:维基百科 漏泄线缆示意图,来源:维基百科

      通过以上两种方式,现代矿井工作能够实现即时、快速的通信。但是这个两种方式仍然有其短板。漏泄通信的漏泄槽之间相隔较远,因此很依赖于信号接受体本身的移动,换句话说,需要依靠携带接收机的矿工们。

      另一方面,两者的实现都是基于实体的传输线,一旦发生事故,本身铺设的传输线遭到严重损坏时,日常井下工作联络网也会遭到破坏。

      事实上,还有一种叫做透地通信的矿井应急通信,会将长达百米的天线埋入地下实现通讯。矿井事故中,天线容易被损坏,所以在严重事故中这些依靠原来矿井传输通道的通信方法可能根本不可行。

      依靠实体传输通道的有线易被破坏,那换成无线通讯呢?

      其实,大多数主要基于无线的通信手段,比如移动通信等,在矿井作业中也变得越来越普遍。但是在事故矿井内,通信空间受损,会导致无线信号的质量大大下降,或是彻底失效。此外,大功率的电信号也有可能导致矿井内易燃物爆炸。因此,包括手机和卫星在内的无线通信也不能成为有效的矿井应急通信手段。

      这也是为什么在灾情较为严重的矿井事故中,用的都是看起来十分"愚笨"的通信方式,例如敲击传声、传纸条和送入有线电话等,而这些方法,也被证明是最可靠的。

      古老媒介上的生命重托

      1963年,西德莱格德镇的若干名被困矿工就是通过钢索传声这一方式最终获救。被困矿工们仅依靠一瓶茶和有限的食物,在地下坚持了两周,从而缔造了"莱格德奇迹"。

    莱格德矿难救援写实画以及逃生舱实物照片,来源:维基百科莱格德矿难救援写实画以及逃生舱实物照片,来源:维基百科

      栖霞矿难发生后,爆炸导致矿井通道被严重破坏,救援队伍无法确定被困人员的具体位置,更不知道被困人员的具体伤亡情况,只能先尝试尽快钻通通往被困人员身处区域的钻孔。幸运的是,1月17日下午,3号钻孔成功贯穿到五中段,并收到了井下传来的敲击声。

     1月25日,救援人员在事故现场作业。 1月25日,救援人员在事故现场作业。

      正是这些敲击声,在事发后第一次向救援队伍传递了井下仍有幸存人员的信号。之后,通过狭窄的钻孔用绳索和管道将补给品送入地下,同时通过绳索带出的纸条确定被困矿工的大概情况,再送入有线电话与内部建立稳定的联系。

      在地下矿灾的极端环境下,实物为媒介的传输和有线通信是最稳定省时的通信手段,正是这些平平无奇的通信手段为被困人员的成功生还提供了可能。

    1月24日,一名被困矿工成功升井。1月24日,一名被困矿工成功升井。

      极端环境下的通讯挑战

      其实不仅是地下,地表和地外的许多极端环境都在考验人类的通信能力。

      在远离城市的山区,3G、4G网络减弱,但2G信号的存在感却得以增强。登山队在7500米以上的珠穆朗玛峰甚至也可以接收到基站的2G信号,所以仅仅是去珠峰旅游的话,大可不必担心你的手机会瘫痪。但是如果继续向山顶无基站覆盖的地域深入,就只能寻求卫星的帮助了。

      虽然卫星在矿井下帮不了什么忙,但是处于无遮挡的地表,即使是无人区,也可以使用卫星电话。顾名思义,卫星电话是直接使用卫星作为中转的电话通信方式。当然它的缺点也很明显,一是成本高昂,一般只会用来支持登山或科考等活动;二是因为传输的目标是地外的卫星,信号很容易受到大气,甚至是太阳活动的影响。当下卫星电话除了登山和科考中得到应用,也成为了远洋船只与陆地之间重要的通讯手段。

    货架上的卫星电话(左)和印尼海啸救灾中应用卫星电话进行联络的场景(右)货架上的卫星电话(左)和印尼海啸救灾中应用卫星电话进行联络的场景(右)

      离开陆地,深入海洋。在深海中,因为发射的无线电信号会受到水质、洋流、水下动植物、障碍物等的影响,无线通信的效率会变得非常低。除此之外,海水对光传输的巨大衰减作用也致使光通信不可用。所以在深海,海底光纤和水声通信成为了目前最被广泛使用的水下通信方式。

      想必大家对海底光缆并不陌生,但是海底光缆的主要作用是沟通被海洋分隔开的两块儿陆地。而水声探测则可以支持深海探测器等水下作业的机器与人类进行沟通。因为考虑到海水压力和海水腐蚀的影响,水下通信设备也往往拥有严苛的制造标准。

    铺设在海底的光缆网铺设在海底的光缆网

      我们再走远一点,如果漂泊于浩瀚无垠的太空中,此时唯一可用的通信方式只剩无线电波了,因为只有电磁波可以在太空的真空环境中传播。当然光也属于电磁波,但是因为直线传输的特点,光信号会被各种天体所阻挡,因此似乎只有无线电波可以担此大任。

      不论是高耸的世界屋脊、遥远的外太空,还是未知的地下和海洋,都与我们的日常生活遥不可及。但是应用于这些极端环境的各类通信方式却支持了人类探索这些区域,从而使人类在恶劣的环境下依然生存得游刃有余。

      从古老的实体传声,到现代化的光电通信,人类通信方式的发展支撑着我们走得更远、看得更广,但是无论身处什么样极端环境,人类通信最初的意义都是保持联系,构建联结。有的时候看似强大的通信却不敌一张纸条,再多样化的手段可能到头来都汇集成一句话:

      因为相连,所以拥有希望!

    原文转载:http://tech.shaoqun.com/a/317680.html

    跨境电商:https://www.ikjzd.com/

    垂直电商:https://www.ikjzd.com/w/1450

    邮乐购物商城:https://www.ikjzd.com/w/1776


    来源:中国科普博览  山东栖霞笏山金矿爆炸事故,牵动着全国人民的心!截至26日最新消息显示,已有11人成功升井,10人确认遇难,仍有一人处于失联状态,搜救仍在进行,事故原因也在调查中。  1月17日,救援团队打通了一个钻孔,通过纸条与被困人员取得联系,了解到被困矿工们的具体状况。而后的一段时间中,都是靠着薄薄的纸条联系着地面与井下,直到后来才传入了有线电话与井内建立了稳定的联系。  山东笏山金矿事
    logo免费制作:logo免费制作
    海拍客:海拍客
    亚马逊9.9美元包邮能在半年赚300万?:亚马逊9.9美元包邮能在半年赚300万?
    法国8大本土电商平台,法国本地电商平台有这些!:法国8大本土电商平台,法国本地电商平台有这些!
    海关总署:关于公布2018年商品归类行政裁定的公告!:海关总署:关于公布2018年商品归类行政裁定的公告!

    辽粤大战谁更强?名嘴断定广东占优 做好2点可击败辽宁_本赛季

    原标题:辽粤大战谁更强?名嘴断定广东占优 做好2点可击败辽宁

    北京时间2月3日,CBA将迎来一场重头戏,辽宁与广东的榜首大战。这一战也被外界看成是CBA总决赛的预演。那么,辽粤本赛季第一次交锋,究竟谁更强呢?或者说,谁更有胜算呢?近日,广东媒体人张健就表示,广东队其实更占优势,做好两点可击败辽宁。

    尽管在上赛季总决赛输给广东队,不过,辽宁队本赛季的战绩却非常出众。即便是有西蒙斯这一小插曲,可单外援作战的他们还是稳坐积分榜第一的位置。截止到目前,他们取得了31胜3负的战绩,傲视全联盟。

    而广东队虽然在揭幕战遭到25分惨败,不过,在随后他们便迅速调整。没了易建联以后,广东队打得更为整体了。经过大半个赛季的适应后,广东队已经逐渐适应了没有易建联的节奏。本赛季至今,他们取得了30胜3负的战绩,只落后辽宁队一个胜负场。

    那么,对于辽粤这一战焦点大战,外界又怎么看的呢?广东媒体人张健就表示,这肯定是一场强强对话的比赛,不过,在纸面实力上,广东队还是占优的。在他看来,广东队在锋线的优势还是比较明显的,后卫线上,广东队也能与辽宁队打成平手。唯一的劣势是内线,曾繁日和苏伟组合,进攻能力不如韩德君与朱荣振。

    另外,他也表示了,其实广东队只需要做到2点,其实击败辽宁队可能性应该是比较大的。首先,广东队的篮板球一定要保护好,尽可能的多抢篮板球,争取更多的进攻机会。其次,广东队的三分球一定要投开,只有外线投开了,才能震慑住对手,也给内线缓解压力。返回搜狐,查看更多

    责任编辑:

    原文转载:http://sport.shaoqun.com/a/389624.html

    跨境电商:https://www.ikjzd.com/

    俄罗斯灰色清关:https://www.ikjzd.com/w/1409

    terapeak:https://www.ikjzd.com/w/556


    原标题:辽粤大战谁更强?名嘴断定广东占优做好2点可击败辽宁北京时间2月3日,CBA将迎来一场重头戏,辽宁与广东的榜首大战。这一战也被外界看成是CBA总决赛的预演。那么,辽粤本赛季第一次交锋,究竟谁更强呢?或者说,谁更有胜算呢?近日,广东媒体人张健就表示,广东队其实更占优势,做好两点可击败辽宁。尽管在上赛季总决赛输给广东队,不过,辽宁队本赛季的战绩却非常出众。即便是有西蒙斯这一小插曲,可单外援作战的
    auction:auction
    启明星软件:启明星软件
    运营为王?详解亚马逊店铺顶级运营思维:运营为王?详解亚马逊店铺顶级运营思维
    2016亚马逊欧洲/美国站点展望和布局:2016亚马逊欧洲/美国站点展望和布局
    亚马逊中国成为被执行人 执行标的23420:亚马逊中国成为被执行人 执行标的23420

    Soul网关使用感受

    阶段性 Soul网关使用感受

    通过一段时间的Soul网关的接触,总结了一些我认为Soul网关存在的优势

    使用上

    • 使用界面化的方式实现的属性配置,极大的降低了网关的使用难度,相比Springcloud gateway使用容易很多
    • 插件化的配置,使得稍有基础的开发人员很容易集成与网关相关的基础组件。同时可以自定义一些组件,接入到当前的Soul网关插件中
    • 对于SpringBoot的使用,所有现有插件以starter方式提供,
    • 在插件属性的配置上,将以往各种限流熔断组件配置文件或注解的方式替换为界面配置的方式,简单易用。而且实现了零代码侵入性。仅仅需要在客户端增加接口注解而已
    • 通过开闭原则等规范,使得各个插件或规则的卸载达到统一
    • 灵活多样的数据同步方式,针对不同的场景使用不同的数据同步

    技术上

    • 各种设计模式的使用,包括责任链模式,观察者模式,模板方法模式,策略模式,简单工厂模式,门面模式等等各种设计模式的融合运用,让人感受到网关的设计之精妙
    • 各种插件的集成流程上,遵循了统一的原则,为开发者自定义其他插件提供了范本。也为我们自己写代码注重代码规范提供了参考
    • 使用了响应式编程,提升了性能的同时,也紧跟着技术发展趋势。
    • 完善的分层架构,针对不同的使用方面,区分了不同的层面,且一个模块只干一件事情。充分体现了单一职责原则。
    • 对于语言新特性框架新特性的使用,例如ObjectProvider等功能的使用
    • 对于功能模块配置的划分以及精确,区分选择器和规则元数据等对不同的变化执行不同的操作。且实现了增量和全量同步,充分的考虑了性能要求和功能要求
    • 对一些其他优秀中间件和开源框架特性的综合运用,例如泛化调用,SPI,异步编程,

    目前存在的问题

    • 文档的版本和全面性有待提高
    • 目前关于高可用高并发相关方面的案例还不够多

    期望

    • 希望后续能在工作中对Soul网关进行综合运用
    • 能多使用soul集成的插件使用,前期学习中对很多插件缺乏了解,导致只能简单分析下流程

    欢迎搜索关注本人与朋友共同开发的微信面经小程序【大厂面试助手】和公众号【微瞰技术】,以及总结的分类面试题https://github.com/zhendiao/JavaInterview

    file
    file









    原文转载:http://www.shaoqun.com/a/521167.html

    跨境电商:https://www.ikjzd.com/

    慧聪商务网:https://www.ikjzd.com/w/1836

    识货:https://www.ikjzd.com/w/1745


    阶段性Soul网关使用感受通过一段时间的Soul网关的接触,总结了一些我认为Soul网关存在的优势使用上使用界面化的方式实现的属性配置,极大的降低了网关的使用难度,相比Springcloudgateway使用容易很多插件化的配置,使得稍有基础的开发人员很容易集成与网关相关的基础组件。同时可以自定义一些组件,接入到当前的Soul网关插件中对于SpringBoot的使用,所有现有插件以starter方
    蜜芽:蜜芽
    e邮包:e邮包
    口述:女上司捏住我七寸让我不能自拔上司工作女人:口述:女上司捏住我七寸让我不能自拔上司工作女人
    外贸课堂:国际贸易中的信用证谈判技巧!:外贸课堂:国际贸易中的信用证谈判技巧!
    亚马逊新品上架当天刷168直评,令人窒息的操作!:亚马逊新品上架当天刷168直评,令人窒息的操作!

    2021-01-29

    4连胜!沃尔再喷哈登:球队是我的 奥迪发声太扎心 伍德:我该进全明星_迪波

    原标题:4连胜!沃尔再喷哈登:球队是我的 奥迪发声太扎心 伍德:我该进全明星

    104-101,或许很多球迷都不会想到,哈登走后的火箭,会一口气迎来四连胜。连续战胜活塞、独行侠、奇才后,北京时间1月29日上午,他们又战胜了缺少努尔基奇和麦科勒姆的开拓者。

    首节比赛,火箭曾经大比分落后,但是伍德第二节拿下14分,火箭走上正轨,并一举拿下对手。

    突如其来的4连胜,让火箭全队上下充满了信心,比赛结束后,16中6拿下20分5篮板6助攻的沃尔相当兴奋,他在接受采访时表示,基本上来说,火箭是他的球队,这相当于宣誓了主权。

    同时,沃尔也称,他最喜欢的火箭的特点就是大家为了彼此打球,而在赛季初:"我们那时候有不想在这的人!"

    这至少是沃尔第四次在比赛结束后接受采访时隔空开怼哈登了。

    本场比赛12投8中拿到22分12篮板1抢断1盖帽的伍德没有纠缠这一话题,伍德的眼光放在了奥运会上,对于美国篮协考虑让他出战奥运会的消息,伍德表示:"我感激这样的机会,这对我来说意义重大。"

    赛季至今,伍德场均23.4分10.9篮板,数据有着明显的提升,伍德认为,自己应当进入今年的全明星正赛:"我认为自己是西部最好的大个子之一,我理应得到那些投票。"

    奥拉迪波本场出战37分钟,23中11,其中三分10中2,罚球1中1,得到25分7篮板5助攻1抢断1盖帽。

    赛后接受采访时,奥拉迪波谈到了自己的过往,神情落寞,奥拉迪波说:"纵览我的职业生涯,感觉人们都在不断抛弃我,但这就是生活的一部分,我只能接受。"

    从魔术到雷霆,从步行者到火箭,奥拉迪波每一次都以相对的失败者的身份离开之前的球队,本赛季的剩余时间,奥拉迪波需要证明的,不只是能力,还有今夏拿到顶薪的潜力。返回搜狐,查看更多

    责任编辑:

    原文转载:http://sport.shaoqun.com/a/389618.html

    跨境电商:https://www.ikjzd.com/

    打折网:https://www.ikjzd.com/w/74

    铭宣:https://www.ikjzd.com/w/1551.html


    原标题:4连胜!沃尔再喷哈登:球队是我的奥迪发声太扎心伍德:我该进全明星104-101,或许很多球迷都不会想到,哈登走后的火箭,会一口气迎来四连胜。连续战胜活塞、独行侠、奇才后,北京时间1月29日上午,他们又战胜了缺少努尔基奇和麦科勒姆的开拓者。首节比赛,火箭曾经大比分落后,但是伍德第二节拿下14分,火箭走上正轨,并一举拿下对手。突如其来的4连胜,让火箭全队上下充满了信心,比赛结束后,16中6拿下
    terapeak:terapeak
    塔图:塔图
    提高转化率点击率的小秘诀:亚马逊定价有妙招!:提高转化率点击率的小秘诀:亚马逊定价有妙招!
    从6个方向寻找做好运营和产品的思路!:从6个方向寻找做好运营和产品的思路!
    从0开始,理工男在亚马逊收获数百万女性粉丝,日出2万单!:从0开始,理工男在亚马逊收获数百万女性粉丝,日出2万单!

    161-109!CBA超级惨案诞生:广东9连胜,被迫提前练兵,7人上双_比赛

    原标题:161-109!CBA超级惨案诞生:广东9连胜,被迫提前练兵,7人上双

    北京时间1月29日11点,CBA常规赛,广东队161-109大胜同曦。此役悬念半场就结束,下半场,广东队也被迫练兵。此役,广东队7人得分上双。马尚33分、威姆斯20分、周鹏20分、赵睿20分。

    广东队是卫冕冠军,战绩29胜4负,高居第2;同曦赛前排名倒数第2,战绩7胜28负。此前,广东队拿到8连胜,而同曦上一场惨败北控。此役,同曦核心西热力江轮休,这就是很明确的信号,同曦此役放弃抵抗了。

    第一节,摩尔特里命中三分球,10-10,同曦开场顶住了。广东队随后连得11分,21-10,比分拉开。刘育辰打成2+1,同曦追到21-25。马尚抢断反击得分,35-21,广东队优势明显。刘育辰2罚全中,29-38,同曦追到个位数。首节,广东领先同曦8分,43-35。

    第二节,广东队完成不可思议的表演,赵睿三分球命中,64-38,广东队领先26分。马尚飙进三分球,84-52,分差32分。最终,广东队半场拿下98分,98-66领先。广东队单节55分,半场98分,都是CBA史上第一。

    第三节,广东队明显放水了,没有认真打,因为优势太大了,比赛毫无悬念。胡明轩2罚1中,110-78,分差32分。三节比赛,129-90,广东队领先39分。

    第四节,比赛完全是垃圾时间,最终,广东队轻松大胜。

    对于广东队来说,这是十分轻松的胜利,他们也留下了尴尬,现在,太多CBA球队面对广东队,第一时间想的不是拼,而是放弃。此前四川队是如此,如今的同曦也是如此。对于CBA联赛来说,这是一种伤害,没有打,比赛就失去了悬念。

    广东队也明白,因此,看到同曦放弃,并且比赛分差太大,广东队也"放弃"了,不然,广东队一场比赛若拿200分,虽然自己能够载入史册,却会让CBA沦为笑话。

    随着赛季深入,面对广东队,恐怕放弃抵抗的球队会越来越多。返回搜狐,查看更多

    责任编辑:

    原文转载:http://sport.shaoqun.com/a/389617.html

    跨境电商:https://www.ikjzd.com/

    优1宝贝:https://www.ikjzd.com/w/1507

    002315焦点科技:https://www.ikjzd.com/w/1831


    原标题:161-109!CBA超级惨案诞生:广东9连胜,被迫提前练兵,7人上双北京时间1月29日11点,CBA常规赛,广东队161-109大胜同曦。此役悬念半场就结束,下半场,广东队也被迫练兵。此役,广东队7人得分上双。马尚33分、威姆斯20分、周鹏20分、赵睿20分。广东队是卫冕冠军,战绩29胜4负,高居第2;同曦赛前排名倒数第2,战绩7胜28负。此前,广东队拿到8连胜,而同曦上一场惨败北控。此
    跨国采购网:跨国采购网
    blackbird:blackbird
    大量卖家无法创建入库计划,原因是系统故障还是另有其他?:大量卖家无法创建入库计划,原因是系统故障还是另有其他?
    亚马逊排名规则,亚马逊运营技巧到底有哪些?:亚马逊排名规则,亚马逊运营技巧到底有哪些?
    男友毫无情调我献身陌生男 口述:男友毫无情调我献身陌生男 口述