首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

我国5G正在快速发展,5G现阶段发展情况及未来四年发展规划

目前,我国已建成5G基站超过115万个,占全球70%以上,是全球规模最大、技术最先进的5G独立组网网络,全国所有地级市城区、超过97%的县城城区和40%的乡镇镇区实现5G网络覆盖;5G终端用户达到4.5亿户,占全球80%以上。 在5G基站方面,要求到2025年实现每万人拥有5G基站26个,目前我国每万人拥有5G基站数为5个。如此算下来,到2025年,中国5G基站数将达到360多万个。未来4年,中国还将建设至少244.5万个以上的5G基站,预计每年新增60万个5G基站。 目前,全国5G应用创新的案例已超过1万个,覆盖22个国民经济重要行业,工业制造、采矿、港口等垂直行业应用场景加速规模落地,已由最初的生产辅助类业务为主向设备控制、质量管控等核心业务拓展,是当前5G应用方案较为成熟的领域。 教育、医疗、信息消费等领域5G应用加速发展。教育领域,全国多所高校进行积极探索,涌现出一批5G空中课堂、5G虚拟实验室、5G云考场、5G智慧校园等典型应用和标杆项目,为开展5G在智慧教育中的试点应用积累了经验。 医疗领域,全国已有超过600个三甲医院开展5G+急诊急救、远程诊断、健康管理等应用,切实提升了人民群众的幸福感、获得感、安全感。 信息消费领域,AR导游、4K/8K直播、沉浸式教学等5G应用,在游戏娱乐、赛事直播、居住服务等领域大幅提升消费体验。 下一步,工信部将联合相关部委及地方政府重点推进15个行业的5G应用,打造深度融合新生态,实现重点领域5G应用深度和广度双突破,构建技术产业和标准体系双支柱,逐步形成5G应用“扬帆远航”的发展局面。 在总体规模上,要求到2025年,信息通信行业收入达到4.3万亿元,累计增长10%;在信息通信基础设施累计投资达3.7万亿元。 在基础设施方面,要求到2025年,每万人拥有5G基站26个,10G-PON 及以上端口数达1200万个。工业互联网标识解析公共服务节点数达150个,移动网络 IPv6 流量占比达70%,国际互联网出入口带宽达48太比特每秒。 在绿色节能方面,要求到2025年,新建大型和超大型数据中心运行电能利用效率小于1.3。 在应用普及方面,要求到2025年,通信网络终端连接数达45亿个,增幅7%;5G 用户普及率达56%,千兆宽带用户数达6000万户,增加56%;工业互联网标识注册量达500亿个,增加40%;5G 虚拟专网数达5000个,增加44%。 在创新发展方面,要求到2025年,基础电信企业研发投入占收入比例4.5%。 在普惠共享方面,要求到2025年,行政村5G通达率达80%,电信用户综合满意指数大于82,互联网信息服务投诉处理及时率大于90。 针对以上指标,可以总结出多方面规律。运营商收入每年增长10%,支出却每年增长8%,这对运营商未来发展提出了很大挑战,亟需新业务支撑。二是5G基站每年大约需要增长60万。三是运营商将加大固网的投资力度。 虽然目前为止5G普及度和覆盖情况还不错,大多数地方的5G速度和信号还是有待提高,但相信随着技术的不断提高和发展,它将会迎来爆发式的增长!

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

☕【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理

FST的概念和定义 FST序列化全称是Fast Serialization Tool,它是对Java序列化的替换实现。既然前文中提到Java序列化的两点严重不足,在FST中得到了较大的改善,FST的特征如下: JDK提供的序列化提升了10倍,体积也减少3-4倍多 支持堆外Maps,和堆外Maps的持久化 支持序列化为JSON FST序列化的使用 FST的使用有两种方式,一种是快捷方式,另一种需要使用ObjectOutput和ObjectInput。 直接使用FSTConfiguration提供的序列化和反序列化接口 public static void serialSample() { FSTConfiguration conf = FSTConfiguration.createAndroidDefaultConfiguration(); User object = new User(); object.setName("huaijin"); object.setAge(30); System.out.println("serialization, " + object); byte[] bytes = conf.asByteArray(object); User newObject = (User) conf.asObject(bytes); System.out.println("deSerialization, " + newObject); } FSTConfiguration也提供了注册对象的Class接口,如果不注册,默认会将对象的Class Name写入。这个提供了易用高效的API方式,不使用ByteArrayOutputStreams而直接得到byte[]。 使用ObjectOutput和ObjectInput,能更细腻控制序列化的写入写出: static FSTConfiguration conf = FSTConfiguration.createAndroidDefaultConfiguration(); static void writeObject(OutputStream outputStream, User user) throws IOException { FSTObjectOutput out = conf.getObjectOutput(outputStream); out.writeObject(user); out.close(); } static FstObject readObject(InputStream inputStream) throws Exception { FSTObjectInput input = conf.getObjectInput(inputStream); User fstObject = (User) input.readObject(User.class); input.close(); return fstObject; } FST在Dubbo中的应用 Dubbo中对FstObjectInput和FstObjectOutput重新包装解决了序列化和反序列化空指针的问题。 并且构造了FstFactory工厂类,使用工厂模式生成FstObjectInput和FstObjectOutput。其中同时使用单例模式,控制整个应用中FstConfiguration是单例,并且在初始化时将需要序列化的对象全部注册到FstConfiguration。 对外提供了同一的序列化接口FstSerialization,提供serialize和deserialize能力。 FST序列化/反序列化 FST序列化存储格式 基本上所有以Byte形式存储的序列化对象都是类似的存储结构,不管class文件、so文件、dex文件都是类似,这方面没有什么创新的格式,最多是在字段内容上做了一些压缩优化,包括我们最常使用的utf-8编码都是这个做法。 FST的序列化存储和一般的字节格式化存储方案也没有标新立异的地方,比如下面这个FTS的序列化字节文件 00000001: 0001 0f63 6f6d 2e66 7374 2e46 5354 4265 00000010: 616e f701 fc05 7630 7374 7200 格式: Header|类名长度|类名String|字段1类型(1Byte) | [长度] | 内容|字段2类型(1Byte) | [长度] | 内容|… 0000:字节数组类型:00标识OBJECT 0001:类名编码,00标识UTF编码,01表示ASCII编码 0002:Length of class name (1Byte) = 15 0003~0011:Class name string (15Byte) 0012:Integer类型标识 0xf7 0013:Integer的值=1 0014:String类型标识 0xfc 0015:String的长度=5 0016~001a:String的值"v0str" 001b~001c:END 从上面可以看到Integer类型序列化后只占用了一个字节(值等于1),并不像在内存中占用4Byte,所以可以看出是根据一定规则做了压缩,具体代码看FSTObjectInput#instantiateSpecialTag中对不同类型的读取,FSTObjectInput也定义不同类型对应的枚举值: public class FSTObjectOutput implements ObjectOutput { private static final FSTLogger LOGGER = FSTLogger.getLogger(FSTObjectOutput.class); public static Object NULL_PLACEHOLDER = new Object() { public String toString() { return "NULL_PLACEHOLDER"; }}; public static final byte SPECIAL_COMPATIBILITY_OBJECT_TAG = -19; // see issue 52 public static final byte ONE_OF = -18; public static final byte BIG_BOOLEAN_FALSE = -17; public static final byte BIG_BOOLEAN_TRUE = -16; public static final byte BIG_LONG = -10; public static final byte BIG_INT = -9; public static final byte DIRECT_ARRAY_OBJECT = -8; public static final byte HANDLE = -7; public static final byte ENUM = -6; public static final byte ARRAY = -5; public static final byte STRING = -4; public static final byte TYPED = -3; // var class == object written class public static final byte DIRECT_OBJECT = -2; public static final byte NULL = -1; public static final byte OBJECT = 0; protected FSTEncoder codec; ... } FST序列化和反序列化原理 对Object进行Byte序列化,相当于做了持久化的存储,在反序列的时候,如果Bean的定义发生了改变,那么反序列化器就要做兼容的解决方案,我们知道对于JDK的序列化和反序列,serialVersionUID对版本控制起了很重要的作用。FST对这个问题的解决方案是通过@Version注解进行排序。 在进行反序列操作的时候,FST会先反射或者对象Class的所有成员,并对这些成员进行了排序,这个排序对兼容起了关键作用,也就是@Version的原理。在FSTClazzInfo中定义了一个defFieldComparator比较器,用于对Bean的所有Field进行排序: public final class FSTClazzInfo { public static final Comparator<FSTFieldInfo> defFieldComparator = new Comparator<FSTFieldInfo>() { @Override public int compare(FSTFieldInfo o1, FSTFieldInfo o2) { int res = 0; if ( o1.getVersion() != o2.getVersion() ) { return o1.getVersion() < o2.getVersion() ? -1 : 1; } // order: version, boolean, primitives, conditionals, object references if (o1.getType() == boolean.class && o2.getType() != boolean.class) { return -1; } if (o1.getType() != boolean.class && o2.getType() == boolean.class) { return 1; } if (o1.isConditional() && !o2.isConditional()) { res = 1; } else if (!o1.isConditional() && o2.isConditional()) { res = -1; } else if (o1.isPrimitive() && !o2.isPrimitive()) { res = -1; } else if (!o1.isPrimitive() && o2.isPrimitive()) res = 1; // if (res == 0) // 64 bit / 32 bit issues // res = (int) (o1.getMemOffset() - o2.getMemOffset()); if (res == 0) res = o1.getType().getSimpleName().compareTo(o2.getType().getSimpleName()); if (res == 0) res = o1.getName().compareTo(o2.getName()); if (res == 0) { return o1.getField().getDeclaringClass().getName().compareTo(o2.getField().getDeclaringClass().getName()); } return res; } }; ... } 从代码实现上可以看到,比较的优先级是Field的Version大小,然后是Field类型,所以总的来说Version越大排序越靠后,至于为什么要排序,看下FSTObjectInput#instantiateAndReadNoSer方法 public class FSTObjectInput implements ObjectInput { protected Object instantiateAndReadNoSer(Class c, FSTClazzInfo clzSerInfo, FSTClazzInfo.FSTFieldInfo referencee, int readPos) throws Exception { Object newObj; newObj = clzSerInfo.newInstance(getCodec().isMapBased()); ... } else { FSTClazzInfo.FSTFieldInfo[] fieldInfo = clzSerInfo.getFieldInfo(); readObjectFields(referencee, clzSerInfo, fieldInfo, newObj,0,0); } return newObj; } protected void readObjectFields(FSTClazzInfo.FSTFieldInfo referencee, FSTClazzInfo serializationInfo, FSTClazzInfo.FSTFieldInfo[] fieldInfo, Object newObj, int startIndex, int version) throws Exception { if ( getCodec().isMapBased() ) { readFieldsMapBased(referencee, serializationInfo, newObj); if ( version >= 0 && newObj instanceof Unknown == false) getCodec().readObjectEnd(); return; } if ( version < 0 ) version = 0; int booleanMask = 0; int boolcount = 8; final int length = fieldInfo.length; int conditional = 0; for (int i = startIndex; i < length; i++) { // 注意这里的循环 try { FSTClazzInfo.FSTFieldInfo subInfo = fieldInfo[i]; if (subInfo.getVersion() > version ) { // 需要进入下一个版本的迭代 int nextVersion = getCodec().readVersionTag(); // 对象流的下一个版本 if ( nextVersion == 0 ) // old object read { oldVersionRead(newObj); return; } if ( nextVersion != subInfo.getVersion() ) { // 同一个Field的版本不允许变,并且版本变更和流的版本保持同步 throw new RuntimeException("read version tag "+nextVersion+" fieldInfo has "+subInfo.getVersion()); } readObjectFields(referencee,serializationInfo,fieldInfo,newObj,i,nextVersion); // 开始下一个Version的递归 return; } if (subInfo.isPrimitive()) { ... } else { if ( subInfo.isConditional() ) { ... } // object 把读出来的值保存到FSTFieldInfo中 Object subObject = readObjectWithHeader(subInfo); subInfo.setObjectValue(newObj, subObject); } ... 从这段代码的逻辑基本就可以知道FST的序列化和反序列化兼容的原理了,注意里面的循环,正是按照排序后的Filed进行循环,而每个FSTFieldInfo都记录自己在对象流中的位置、类型等详细信息: 序列化: 按照Version对Bean的所有Field进行排序(不包括static和transient修饰的member),没有@Version注解的Field默认version=0;如果version相同,按照version, boolean, primitives, conditionals, object references排序 按照排序的Field把Bean的Field逐个写到输出流 @Version的版本只能加不能减小,如果相等的话,有可能因为默认的排序规则,导致流中的Filed顺序和内存中的FSTFieldInfo[]数组的顺序不一致,而注入错误 反序列化: 反序列化按照对象流的格式进行解析,对象流中保存的Field顺序和内存中的FSTFieldInfo顺序保持一致 相同版本的Field在对象流中存在,在内存Bean中缺失:可能抛异常(会有后向兼容问题) 对象流中包含内存Bean中没有的高版本Field:正常(老版本兼容新) 相同版本的Field在对象流中缺失,在内存Bean中存在:抛出异常 相同的Field在对象流和内存Bean中的版本不一致:抛出异常 内存Bean增加了不高于最大版本的Field:抛出异常 所以从上面的代码逻辑就可以分析出这个使用规则:@Version的使用原则就是,每新增一个Field,就对应的加上@Version注解,并且把version的值设置为当前版本的最大值加一,不允许删除Field 另外再看一下@Version注解的注释:明确说明了用于后向兼容 package org.nustaq.serialization.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) /** * support for adding fields without breaking compatibility to old streams. * For each release of your app increment the version value. No Version annotation means version=0. * Note that each added field needs to be annotated. * * e.g. * * class MyClass implements Serializable { * * // fields on initial release 1.0 * int x; * String y; * * // fields added with release 1.5 * @Version(1) String added; * @Version(1) String alsoAdded; * * // fields added with release 2.0 * @Version(2) String addedv2; * @Version(2) String alsoAddedv2; * * } * * If an old class is read, new fields will be set to default values. You can register a VersionConflictListener * at FSTObjectInput in order to fill in defaults for new fields. * * Notes/Limits: * - Removing fields will break backward compatibility. You can only Add new fields. * - Can slow down serialization over time (if many versions) * - does not work for Externalizable or Classes which make use of JDK-special features such as readObject/writeObject * (AKA does not work if fst has to fall back to 'compatible mode' for an object). * - in case you use custom serializers, your custom serializer has to handle versioning * */ public @interface Version { byte value(); } public class FSTBean implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = -2708653783151699375L; private Integer v0int private String v0str; } 准备序列化和反序列化方法 public class FSTSerial { private static void serialize(FstSerializer fst, String fileName) { try { FSTBean fstBean = new FSTBean(); fstBean.setV0int(1); fstBean.setV0str("v0str"); byte[] v1 = fst.serialize(fstBean); FileOutputStream fos = new FileOutputStream(new File("byte.bin")); fos.write(v1, 0, v1.length); fos.close(); } catch (Exception e) { e.printStackTrace(); } } private static void deserilize(FstSerializer fst, String fileName) { try { FileInputStream fis = new FileInputStream(new File("byte.bin")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[256]; int length = 0; while ((length = fis.read(buf)) > 0) { baos.write(buf, 0, length); } fis.close(); buf = baos.toByteArray(); FSTBean deserial = fst.deserialize(buf, FSTBean.class); System.out.println(deserial); System.out.println(deserial); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { FstSerializer fst = new FstSerializer(); serialize(fst, "byte.bin"); deserilize(fst, "byte.bin"); } } 参考资料 https://github.com/RuedigerMoeller/fast-serialization

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

鸿蒙开发快速入门之:Hi3861 开发板(4)

最激动入门级选手的心的时刻来了,本示例将演示如何编写简单业务,输出“Hello World”。 修改源码 bugfix和新增业务两种情况,涉及源码修改。下面以新增业务举例,向开发者介绍如何进行源码修改。 确定目录结构。 开发者编写业务时,务必先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。 例如:在app下新增业务my_first_app,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下: . └── applications └── sample └── wifi-iot └── app │── my_first_app │ │── hello_world.c │ └── BUILD.gn └── BUILD.gn 编写业务代码。 在hello_world.c中新建业务入口函数HelloWorld,并实现业务逻辑。并在代码最下方,使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中) #include "ohos_init.h" #include "ohos_types.h" void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } SYS_RUN(HelloWorld); 编写用于将业务构建成静态库的BUILD.gn文件。 如步骤1所述,BUILD.gn文件由三部分内容(目标、源文件、头文件路径)构成,需由开发者完成填写。以my_first_app为例,需要创建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,并完如下配置。 static_library("myapp") { sources = [ "hello_world.c" ] include_dirs = [ "//utils/native/liteos/include" ] } static_library中指定业务模块的编译结果,为静态库文件libmyapp.a,开发者根据实际情况完成填写。 sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//"则表示绝对路径(此处为代码根路径),若不包含"//"则表示相对路径。 include_dirs中指定source所需要依赖的.h文件路径。 编写模块BUILD.gn文件,指定需参与构建的特性模块。 配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目标模块参与编译。features字段指定业务模块的路径和目标,以my_first_app举例,features字段配置如下。 import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "my_first_app:myapp", ] } my_first_app是相对路径,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。 myapp是目标,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。 调测验证 目前调试验证的方法有两种,分别为通过printf打印日志、通过asm文件定位panic问题,开发者可以根据具体业务情况选择。 由于本示例业务简单,采用printf打印日志的调试方式即可。下面开始介绍这两种调试手段的使用方法。 printf打印 代码中增加printf维测,信息会直接打印到串口上。开发者可在业务关键路径或业务异常位置增加日志打印,如下所示。 void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } 根据asm文件进行问题定位 系统异常退出时,会在串口上打印异常退出原因调用栈信息,如下文所示。通过解析异常栈信息可以定位异常位置。 =======KERNEL PANIC======= **********************Call Stack********************* Call Stack 0 -- 4860d8 addr:f784c Call Stack 1 -- 47b2b2 addr:f788c Call Stack 2 -- 3e562c addr:f789c Call Stack 3 -- 4101de addr:f78ac Call Stack 4 -- 3e5f32 addr:f78cc Call Stack 5 -- 3f78c0 addr:f78ec Call Stack 6 -- 3f5e24 addr:f78fc ********************Call Stack end******************* 为解析上述调用栈信息,需要使用到Hi3861_wifiiot_app.asm文件,该文件记录了代码中函数在Flash上的符号地址以及反汇编信息。asm文件会随版本大包一同构建输出,存放在./out/wifiiot/路径下。 将调用栈CallStack信息保存到txt文档中,以便于编辑。(可选) 打开asm文件,并搜索CallStack中的地址,列出对应的函数名 信息。通常只需找出前几个栈信息对应的函数,就可明确异常代码方向。 Call Stack 0 -- 4860d8 addr:f784c -- WadRecvCB Call Stack 1 -- 47b2b2 addr:f788c -- wal_sdp_process_rx_data Call Stack 2 -- 3e562c addr:f789c Call Stack 3 -- 4101de addr:f78ac Call Stack 4 -- 3e5f32 addr:f78cc Call Stack 5 -- 3f78c0 addr:f78ec Call Stack 6 -- 3f5e24 addr:f78fc 根据以上调用栈信息,可以定位WadRecvCB函数中出现了异常。 完成代码排查及修改。 运行结果 示例代码编译、烧录、运行、调测后,会显示如下结果: ready to OS start FileSystem mount ok. wifi init success! [DEMO] Hello world.

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

第90届中国电子展聚焦行业新热点,拉动产业链上下游快速发展

10月25到27日,第90届中国电子展&上海亚洲电子展&IC China 2017也将在上海新国际博览中心拉开帷幕。 10月23日下午,第90届中国电子展&上海亚洲电子展&IC China 2017三展联动的新闻发布会在上海卓美亚喜马拉雅酒店举行。 而在10月25到27日,第90届中国电子展&上海亚洲电子展&IC China 2017也将在上海新国际博览中心拉开帷幕。展会以“信息化带动工业化,电子技术促进产业升级”为主题,聚焦行业前沿技术与创新产品,力争为国内外企业打造一流的交流和合作平台。 核心展区亮点多多,纵览未来行业大势 1.新型电子元器件成为新时代主体 随着下游消费电子产品日益向轻薄化、智能化方向发展,电子元器件也正在进入以新型电子 元器件为主体的新时代。电子元器件由原来只为适应整机的小型化及新工艺要求为主的改进,变成以满足数字技术、微电子技术发展所提出的特性要求为主,而且是成套满足的产业化发展阶段。 新型电子元器件具有高频化、片式化、微型化、薄型化、低功耗、响应速率快、高分辨率、高精度、高功率、模块化等特征,相配套的制作工艺精密化、流程自动化,生产环境也要求越来越高。 我国作为电子元器件的生产和消耗大国,电子元件的产量已占全球的近39%以上。国内厂商始终跟进发展潮流,不断提高自身的技术能力和产品质量,追赶国际先进企业,努力缩短差距,以便更好的满足国内市场对于电子元器件的需求。 在本届展会的综合元器件展区,有来自我国四面八方的厂商参展,诸如中航光电、瑞士雷莫、贵州航天电器、上海洲日、深圳通茂、珩星电子、四川永星、福建火炬、陕西华星、上海克拉、幸亚(苏州)电子、宁波福特、彩智电子、山东迪一、上海佑风电子、广东科信电子、无锡东海、惠州玛尼微、江苏捷捷、启东吉莱等。元器件展区作为中国电子展的传统优势展区,历经多年的努力,已经成为中国电子元器件产品的重要交流平台。 2.摩尔定律濒临极限,但电子信息产业仍将持续进展 英特尔的创始人之一戈登·摩尔曾经做过这样一个预言:每两年微处理器的晶体管数量都将加倍——意味着芯片的处理能力也加倍,这就是半导体行业中最著名的“摩尔定律”,这种指数级的增长,促使上世纪70年代的大型家庭计算机转化成80、90年代更先进的机器,然后又孕育出了高速度的互联网、智能手机和现在的车联网、智能冰箱和智能温控器等。 但是从2000-2005年间,摩尔定律的间隔开始逐渐放缓到两三年,最近更是演变为每隔四年倍增一次,因此,业界正逐渐走向硅芯片的性能极限,但这就意味着电子信息产业走到了尽头吗?不,与以往首先改善芯片、软件随后跟上的发展趋势不同,以后半导体行业的发展将首先看软件,然后反过来看要支持软件和应用的运行需要什么处理能力的芯片来支持,由于新的计算设备变得越来越移动化,新的芯片中,可能会有新的一代的传感器、电源管理电路和其他的硅设备。而量子计算、DNA数据存储、神经形态计算等一系列新技术将继续推行业发展。 本届展会,紫光集团,紫光同芯、北京同方微电子,锐迪科微电子、展讯、长江存储、联发科、天津飞腾、华大半导体、龙芯中科、大唐电信、昂宝电子、高云半导体、中微半导体、analogix、瑞能半导体、迪思科、北方华创、江苏长电、京瓷、宁波江丰、中芯国际、华宏宏力、华润微电子等一大批国内优秀的IC厂商云集,将携带多款创新方案亮相。 3.产业应用热点发生转移,汽车电子成热点 如今,电子信息产业的应用热点已从最初的计算机、通信扩展至物联网硬件产品、汽车电子等领域,尤其是智能网联汽车的迅速发展,为对传感器、MCU(微控制单元)、激光设备、红外设备、雷达设备、GPS等行业带来新的发展机遇。 随着汽车电子所需传感器种类、数量的不断增加,厂商必须不断研制出新型、高精度、高可靠性、低成本和智能化的传感器;随着汽车电子占整车比重不断提高,MCU在汽车领域的应用将超过家电和通讯领域使用的数量,成为世界上最大的MCU应用领域;随着车辆需要精确感知周围状态并对环境形成反馈,激光、红外、雷达等处理装置越发先进;随着车联网需要对大量数据进行传输和交换,数据总线技术应用日益普及。 当前,众多国内外知名半导体厂商均重点推出了旗下智能汽车系列的芯片产品;众多通信厂商则致力于针对联网汽车研发高速率、低延迟的先进通讯技术;传统车企则和科技巨头们强强联手争相抢夺无人驾驶制高点……可以想象,在未来,汽车就是一步跑在轮子上的“超级智能手机”。 在本届展会的智能车联网展区,英特尔、百度、德州仪器、英伟达、科大讯飞、大唐恩智浦、上海先进等国际知名半导体厂商和国内外知名汽车厂商都会有极具吸引力的解决方案呈现。相关专家还会与您共同探讨产业发展模式和方向。或许您能在其中找到解决车联网,特别是国内相关市场需求和难题的钥匙。 4.智能制造成电子信息产业新蓝海 自2008年金融危机之后,世界经济的重心从互联网、金融等虚拟产业重新转移回实体制造业。在全球制造业都在发展时遭遇瓶颈(资产可用度不高、数据透明度差、工业信息安全问题、生产灵活性差以及持续上升的人工成本等等)之时,美国提出了“工业互联网”,日本提出工业复兴计划,德国提出了“工业4.0”,中国提出了“中国制造2025”。这些计划的核心就是利用以物联网为代表的新兴技术来对原有的制造业进行改造升级。 新一代信息技术与制造业的深度融合,将促进制造模式、生产组织方式和产业形态的深刻变革,这也是电子信息产业的一片新蓝海。目前,美、德等着力推进智能制造的发达国家,均有一批电子信息领域的优秀跨国企业提供技术和服务支撑,比如GE的Predix工业互联网操作系统,西门子的MindSphere物联网操作系统…欧美这些企业已经在信息技术与制造业融合上走在世界的前列,抢占了技术和标准的制高。 但我国也不甘落后, 2016年12月,工信部发布了国家《智能制造“十三五”发展规划》, 《规划》提出,到2020年,明显增强智能制造发展基础和支撑能力,传统制造业重点领域基本实现数字化制造。到2025年,智能制造支撑体系基本建立,重点产业初步实现智能转型。 在本届展会的智能制造设备展区,北京北方华创、北京京运通科、北京中科信、四十五所、中微半导体、沈阳拓荆、沈阳芯源微、大连佳峰、浙江晶盛机电、深圳捷佳伟创、青岛赛瑞达、北京京仪、北京七星华创,以及常州同惠、罗德与施瓦茨(RS)、长盛仪器、普源等厂商都将展示工业创新解决方案。 电子信息行业的半壁江山都被搬来,多场买家活动不容错过! 除了综合元器件、仪器仪表、智能制造设备、集成电路、智能网联汽车领域的百余家企业外,创维、华为,中国电信,上海移远通信,海尔,上海欧孚通信技术有限公司将带来物联网和智慧家庭方面的信息;英飞凌、罗姆、华虹宏力和vicor等将在功率半导体方面为您献上多款套餐。更好玩的是,本次展会还设有年轻人的乐园——电子竞技专区,届时,三星,创维,冠捷、云呦等厂商将会给您带来劲爆的游戏体验。 对展商来说,光来参展却没有点儿实质收获怎么能行?若能在洞察行业趋势的同时促成几桩交易,岂不美哉?此次展会不但是电子信息产业发展的风向标,还为国内外企业打造了一流的交流和合作平台。 展会期间将举办由大型企业的技术人员以及有采购决策权的工程师参与的专场采购推介活动,促进参展企业展示推荐自己产品增加销售机会。展会定向邀约包括三星电子采购中心、富士通集团、上海航天电器、苏州松下半导体、天马微电子、南京熊猫、昆山富士康、仁宝电子等近50家采购商手持“30亿”采购意向到现场与参展商沟通采购。 同时,组委会携手采购平台柠檬豆举办《2017家电智能化技术与发展论坛》,将邀请美的、海信、TCL家用电器、惠而浦、美菱、晶弘、康佳、创维、锐驰、方太、四季沐歌等整机采购企业,汇集大量智能方案需求和新技术。论坛现场将集中展示行业领先新品、技术应用,并促成供需企业现场精准对接,可以极大地促进供需企业的高效沟通和家电行业智能化创新的发展。 更新知识储备,多场专题研讨会同期进行 展、会结合,是中国电子展的传统特色。在本届展会上举办的多场高峰论坛和专题研讨会,为与会听众提供了拓宽眼界、更新知识储备的良机。展会期间将举行“第十五届中国国际半导高峰论坛”“2017第十五届中国(上海)汽车电子暨智能网联汽车核心技术峰会”、“2017中国电子元件与材料技术发展高峰论坛”、“2017中国上海嵌入式系统安全论坛”、“NB-IoT技术应用创新融合论坛”、“第二届(上海)电源半导体技术论坛”和“2017年半导体设备与核心部件制造商对话会”。 原文发布时间: 2017-10-23 21:29 本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。

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

【读书笔记《Android游戏编程之从零开始》】9.游戏开发基础(如何快速的进入 Android 游戏开发)

1.不可盲目看API文档 很多人在接触学习一门新的平台语言时,总喜欢先去探究一番API文档。先不说成效如何,至少编者认为这种方式不适合大部分人来效仿,主要原因在于 API 领域广泛,牵涉到的知识点太多,而对于刚刚接触平台开发语言的大部分人来说,遗忘速度远远大于记忆!这种做法是大量消耗精力、小量吸取知识的方法,只会事倍功半。2.前人栽树,后人乘凉 对于初学者来说,任何想要学习与掌握的知识点,之前都会有高人总结过;所以建议大家每学习一个知识点,都尽可能的先动手去网上搜索和学习别人总结出来的相关知识点的文章,毕竟前任总结的知识会让你减少学习的弯路。最后再根据每个知识点去详细翻阅相关的 API 文档,有针对性、有目的性的去看 API 文档才会是事半功倍。3.好记性不如烂笔头 这句谚语,几乎无人不知无人不晓,但是总被许多初学者抛在脑后。在学习的时候,总是看代码多,而动手练习代码少!身为一个程序员都应该很清楚,代码如果不多动手敲它,它永远不会自己跑进脑中,所以多动手才是成功的关键。4.养成自学的习惯 学习新的知识如果总是抱着依赖和期望别人手把手教授,那就不太现实了。因为没有任何一个人能时时刻刻的陪在身边给予帮助,但是使用 Baidu 和 Google 可以做到!它们拥有着最全的资源库,使用它们可以查找到最强的技术,不过,它们永远都只在那里等待你去使用它们,如果你不动手去搜索,那么对于你来说它们毫无用处。5.利用小项目实战进步快 在学习游戏开发时,一定要多做小项目,比如今天学会了一个新的知识点,那么首先就要尽可能发散思维,多思考这个知识点会应用到什么类型的游戏中,并在游戏中起到什么样的作用等等。然后拿出时间一定要去写一个小项目联系新知识点。 写小项目有两点好处:一是巩固新知识点;二是通过小项目发现知识点实际应用到游戏中会出现的问题,有些问题不亲自动手编写是根本无法发现的。6.进步来源于问题 好程序不是写出来的,是改出来的!这句话没有人能反驳,因为谁写代码都不可能是一遍成功,不用修改不用完善的。 学习中遇到问题时,不应该烦躁而是应该庆幸,因为解决掉问题就意味着进步。千万不要出到问题不假思索就去请教他人,这样解决掉的问题没有任何意义。 当然不推荐大家遇到问题一定就铁下心的自己去几天几夜的钻研,应该自我把握问题的难易度,如果问题确实超出自己能力的,那么请教他人反而对自己更有帮助,有效率,前提是自己考虑过如何解决此问题。 其实,游戏开发的学习过程应该是一个拼图的过程.首先要分模块来学习,积累了一定的模块知识后,再通过这些模块就可以拼出各种类型\各种风格的游戏。 在游戏开发中,一般很少使用系统提供的组件进行开发,其主要原因在于游戏的多样性.比如一款"连连看"游戏,它就可以有N种玩法、N种场景、N种风格、N种元素.所以,如果还期望从系统中找到对应组件的话,结果会令人失望,不是系统不想提供,而是它永远无法知道将要制作的游戏类型、风格等等。总结一句话: 开发一款游戏,请用自己的双手为这款游戏创建专属它的组件!换言之,就是要自己去实现游戏中的组件,不要再一味的幻想系统能为你带来什么。系统只提供“一支笔”、“一张画布”,仅此而已。至于能创造出多么精彩的游戏世界,那完全取决于游戏开发者。 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4134758.html,如需转载请自行联系原作者

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

一个快速找到Spring框架是在哪里找到XML配置文件并解析Beans定义的小技巧

We can define bean configuration in xml and then can get instantiated bean instance with help of all kinds of containers for example ClassPathXmlApplicationContext as displayed below: The content of Beans.xml: <?xml version="1.0" encoding="UTF-8"?> <!-- http://stackoverflow.com/questions/18802982/no-declaration-can-be-found-for-element-contextannotation-config --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="helloWorld" class="main.java.com.sap.HelloWorld"> <property name="message" value="sss"/> <property name="testMin" value="2"/> <property name="phone" value="1"/> </bean> </beans> Where can we set breakpoint to start? No hint. Here is a tip: we can make the Beans.xml invalid by deliberately changing te tag bean to beana, and relaunch application. Now exception is raised as expected: Click the hyperlink XmlBeanDefinitionReader.java:399, The line 399 where exception is raised will be automatically located. The core logic to load xml file is just near the exception raise position: line 391. So we can set breakpoint in line 391 now: Change the tag from beana back to bean, and start application via debug mode. The code below is the core logic of Bean configuration file parse in Spring framework. The logic consists of two main steps: parse XML as a dom structure in memory ( line 391 ) extract bean information contained in dom structure and generate BeanDefinition structure ( line 392 ) from screenshot below we can find out the xml is parsed via SAX parser: My “helloWorld” bean is parsed here: 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

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

18、 Python快速开发分布式搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

【http://www.bdyss.cn】 【http://www.swpan.cn】 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/envpython #-*-coding:utf8-*- fromscrapy.cmdlineimportexecute#导入执行scrapy命令方法 importsys importos sys.path.append(os.path.join(os.getcwd()))#给Python解释器,添加模块新路径,将main.py文件所在目录添加到Python解释器 execute(['scrapy','crawl','pach','--nolog'])#执行scrapy命令 爬虫文件 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest importurllib.response fromlxmlimportetree importre classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com'] start_urls=['http://blog.jobbole.com/all-posts/'] defparse(self,response): pass xpath表达式 1、 2、 3、 基本使用 allowed_domains设置爬虫起始域名start_urls设置爬虫起始url地址parse(response)默认爬虫回调函数,response返回的是爬虫获取到的html信息对象,里面封装了一些关于htnl信息的方法和属性 responsehtml信息对象下的方法和属性response.url获取抓取的rulresponse.body获取网页内容response.body_as_unicode()获取网站内容unicode编码xpath()方法,用xpath表达式过滤节点extract()方法,获取过滤后的数据,返回列表 #-*-coding:utf-8-*- importscrapy classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com'] start_urls=['http://blog.jobbole.com/all-posts/'] defparse(self,response): leir=response.xpath('//a[@class="archive-title"]/text()').extract()#获取指定标题 leir2=response.xpath('//a[@class="archive-title"]/@href').extract()#获取指定url print(response.url)#获取抓取的rul print(response.body)#获取网页内容 print(response.body_as_unicode())#获取网站内容unicode编码 foriinleir: print(i) foriinleir2: print(i) 【转载自:http://www.lqkweb.com】

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册