nasuf

nasuf 查看完整档案

上海编辑  |  填写毕业院校  |  填写所在公司/组织 pocketcontributor.github.io 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

nasuf 赞了文章 · 9月8日

硬气起来了,肝完这2340页大厂面试题,我觉得自己生活可期

2020年5月份全新版互联网大厂面试题

共分类 65份 PDF,累计 2340页!前端,后端资料我全占!

全新版互联网大厂面试题题库非常全面

包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

下面是资料缩略图:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

java部分面试资料

Java 大厂面试题 133 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Java 算法 大厂面试题 50 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

多线程 大厂面试题 75道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

JVM 大厂面试题 20 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Spring全家桶面试题

Spring 大厂面试题 20 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

SpringBoot 大厂面试题 22 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

SpringCloud 大厂面试题 70 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

SpringMvc 大厂面试题 35 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

MyBatis 大厂面试题 40 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

分布式部分面试资料

Kafka 大厂面试题 50 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

ZooKeeper 大厂面试题 36 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Dubbo 大厂面试题 58 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Nginx 大厂面试题 18 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Linux 大厂面试题 70 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Memcached 大厂面试题 23 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

MongoDB 大厂面试题 24 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

MySQL 大厂面试题 140 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

RabbitMQ 大厂面试题 23 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Tomcat 大厂面试题 16 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

并发编程大厂面试题 140 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

Python 大厂面试题 292 道:

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

最后的话

这份 包含了 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!都是作者手动整理的出来的,有什么做的欠缺的地方还希望多多包含,我会持续更新更多更好的资料。

2020年5月全新版互联网大厂面试题,分类65份PDF,累计2340页

相应的文章已经整理形成文档,git扫码获取资料看这里

查看原文

赞 19 收藏 15 评论 7

nasuf 关注了专栏 · 3月4日

Java 生态系统

关注Java 生态系统相关技术

关注 1299

nasuf 关注了用户 · 3月4日

mercyblitz @mercyblitz

小马哥,Java 劝退师,《Spring Boot 编程思想》作者,Apache 和 Spring Cloud 等知名开源架构成员,点击查看详情。(交流QQ群:719291662

最新发布:
Spring Boot 2.0深度实践之核心技术篇
Java 微服务实践系列课堂
「一入 Java 深似海 」系列课程

关注 2799

nasuf 发布了文章 · 3月2日

深入理解Java虚拟机(第三版)笔记(一) Java内存区域与内存溢出异常

第一章 Java内存区域与内存溢出异常

1.1 运行时数据区域

线程共享数据区线程私有数据区
方法区、堆虚拟机栈、本地方法栈、程序计数器

1.1.1 程序计数器

通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器完成。

如果线程执行的是Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,计数器值则应为空(Undefined)

此内存区域是唯一一个没有在《Java虚拟机规范》中规定任何OutOfMemoryError情况的区域。

1.1.2 Java虚拟机栈

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机栈都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。

局部变量表:存放了编译期可知的各种基本数据类型(boolean, byte, char, short, int, float, long, doble)、对象引用(reference类型,并不等同于对象本身)和returnAddress类型(指向了一条字节码指令的地址)。这些数据类型在局部变量表中的存储空间在编译期间完成分配,并以局部变量槽(Slot)来表示,其中64位长度的long和double会占用两个变量槽,其余数据类型只占用一个(虚拟机具体使用多大的内存空间来实现一个变量槽,由虚拟机自行决定)。

异常:StackOverflowError和OutOfMemoryError.

1.1.3 本地方法栈

与虚拟机栈类似,为虚拟机使用到的Native方法服务。

异常:StackOverflowError和OutOfMemoryError.

HotSpot虚拟机不支持栈的动态扩展,所以除非在创建线程申请内存时就因无法获得足够的内存而出现OutOfMemoryError异常,否则在线程运行时是不会因为扩展而导致内存溢出的,只会因为栈容量无法容纳新的栈帧而导致StackOverflowError异常。可通过-Xss参数见着栈内存容量。

1.1.4 Java堆

几乎所有的对象都在堆上分配,但是由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手段已经导致一些变化的发生。新生代、老年代、永久代、Eden、Survivor等基于“经典分代”来设计的HotSpot虚拟机,也在发生一些变化,不采用分代设计的新垃圾收集器。

通过参数-Xms-Xmx设置对的最小值和最大值,两者设置一样可避免堆自动扩展;通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常的时候Dump出当前的内存堆转存快照一遍进行事后分析。

异常:OutOfMemoryError.

1.1.5 方法区

方法区存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。与Java堆一样,不需要连续的内存和可以选择固定大小或者可扩展外,甚至还可以选择不实现垃圾收集。实现垃圾收集也主要是针对常量池的回收和对类型的卸载。

异常:OutOfMemoryError.

1.1.6 运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法 、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

异常:OutOfMemoryError.

1.1.7 直接内存

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。在JDK1.4中新加入了NIO类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java对中的DirectByteBuffer对象作为这块内存的引用进行操作,避免了在Java堆和Native堆中来回复制数据,提高性能。

直接内存的容量大小可通过-XX:MaxDirectMemorySize参数来指定,如果不指定,则默认与Java堆最大值(由-Xmx指定)一直。

1.2 HotSpot虚拟机对象探秘

1.2.1 对象的创建

  • 类加载检查

当Java虚拟机遇到一条字节码new指令时,先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查该符号引用代表的类是否已被加载、解析和初始化过。如果没有,先执行相应的类加载过程。

  • 内存分配

对象所需内存在类加载检查完成之后便可完全确定。其中有两种内存分配方式:1)指针碰撞(Bump The Pointer) :如果堆内存规整,将放在使用过的内存和空闲内存中间的指针向空闲内存侧移动对象大小的距离。2)空闲列表(Free List):如果堆内存并不规整,虚拟机需要维护一个列表,记录哪些内存块可用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。

针对并发情况下的内存分配有两种解决方案:一是对分配内存空间的动作进行同步处理(CAS配上失败重试保证原子性);二是把内存分配的动作按照线程划分在不同空间中进行,即每个线程在Java堆中与预先分配本地线程分配缓冲(Thread Local Allocation Buffer, TLAB),内存分配首先在本地缓冲区中进行,本地缓冲区用完后,分配新的缓冲区时才需要同步锁定。虚拟机可以通过-XX:+/-UseTLAB来决定是否使用TLAB.

然后虚拟机还需要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码和GC分代年龄等信息。

最后执行对象的构造函数,即Class文件中的<init>()方法。

1.2.2 对象的内存布局

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)

  • 对象头

    HotSpot虚拟机对象的对象头部分包括两类信息。

    • 用于存储对象自身运行时数据如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位虚拟机(未开启压缩指针)中分别为32个比特和64个比特,官方成为“Mark Word”,其被设计成有着动态定义的数据结构。在各个状态下对象的存储内容如下:

      存储内容标志位状态
      对象哈希码、对象分代年龄01未锁定
      指向锁记录的指针00轻量级锁定
      指向重量级锁的指针10膨胀(重量级锁定)
      空,不需要记录信息11GC标记
      偏向线程ID、偏向时间戳、对象分代年龄01可偏向
    • 类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。此外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据。
  • 实例数据

    该部分是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的还是在子类中定义的字段。该部分存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义的顺序的影响。HotSpot虚拟机默认分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers,OOPs),从以上默认分配策略中可以看到,相同宽度的字段总是被分配到一起存放,在此前提条件下,在父类中定义的变量会出现在子类之前。如果HotSpot虚拟机的-XX:CompactFields参数值为true(默认为true),那子类中较窄的变量也允许插入父类变量的空隙之中。

  • 对齐填充

    该部分并不是必然存在的,没有特别的含义,仅仅起着占位符的作用。HotSpot虚拟机要求任何对象的大小都必须是8字节的整数倍,而对象头部分已经被精心设计成8字节的倍数(1倍或2倍),所以如果对象实例数据部分没有对齐的话,需要通过对齐填充来补全。

1.2.3 对象的访问定位

Java程序会通过上的reference数据来操作堆上的对象,具体访问方式由虚拟机实现而定,主流方式有句柄直接指针量中:

  • 句柄

    Java堆中划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息。

  • 直接指针

    reference中存储的直接是对象地址。HotSpot虚拟机主要使用直接指针来访问对象。

查看原文

赞 0 收藏 0 评论 0

nasuf 提出了问题 · 2019-07-03

Angular6 @HostListener如何作用在子组件上

项目中引入了一个第三方组件ngx-treeview. 我们想在组件tree-viewul上加入scroll事件监听。
类似下面的组件:

<div class='outer'>
    <tree-view>...</tree-view>
</div>

想通过@HostListener加入监听事件

import { Directive, HostListener } from '@angular/core';

@Directive({selector: '[scroller]'})
export class ScrollerDirective {

  @HostListener('scroll') onScroll() {
    console.log('scrolling...');
  }

}

如下修改:

<div class='outer' scroller>
    <tree-view>...</tree-view>
</div>

或者

<div class='outer'>
    <tree-view scroler>...</tree-view>
</div>

但是这两种方式都无法触发scroll事件.请问应该如何实现这个功能呢?
谢谢。

关注 2 回答 1

nasuf 赞了文章 · 2019-02-08

前端小报 - 201901 月刊

订阅 / 投稿:https://github.com/txd-team/monthly
本期小编:x-cold (尹挚)

新闻快报

重磅消息:Github 宣布私有仓库免费,同期还上线了星标话题 (topics) 的功能

2019 年伊始,GitHub 正式宣布开放无限制创建私有存储库,并开始提供统一的企业版 GitHub 服务,微软正在开始加速 toB 企业服务的布局。开发者们一片叫好声,可谓年度最佳的程序员福利了。

软件技术 B2B 公司 Idera.inc 收购 Travis CI

Travis CI 将结合 Idera 公司其本身的数据库 / 开发者 / 测试等工具发挥更大的商业优势。不过使用免费版的社区同学也不用紧张,Travis CI 依然保证对开源软件免费的策略,并且其开源证书不会修改 (MIT),更多可以参考详细的官方公告

需要额外提醒的是, Travis-CI 对 Github 私有仓库依然没有提供免费的服务。

ES2019 即将到来,新特性快速一览

image.png

越来越多的项目开始迁移到 TypeScript

MemSQL Studio 的 3W+ 行前端源代码从 Flow 迁移到 TypeScript,主要目的是加强类型的控制,避免动态/弱类型造成运行时的各种问题。官方总结了一篇文章,介绍了他们为什么要迁移到 TypeScript,以及迁移过程的记录。

Fackbook 开源的测试框架 Jest 通过几番的讨论终于从 JavaScript 迁移到使用 TypeScript 构建整个项目了,详细的过程可以查看关联的 Pull Request

1 月 25 日,Yarn 官方团队在 GitHub issue 中宣布将对 Yarn 进行重大更改,主要包括:将代码库从 Flow 移植到 TypeScript,不再支持 Node 4 和 Node 6,并为 Yarn 新增了一些功能等,这个更改项目代号为 Berry,目的是增强 Yarn 优势,弥补弱势。(本条消息来自 InfoQ)

Midway v1.0 社区

Midway 是一款基于 Egg 和 TypeScript 的 Web 开发框架,由来自淘宝的 MidwayJS 团队开发。用户可以使用丰富的装饰器快速开发,并且引入了 IoC 的概念,统一管理依赖和统一初始化,是一款面向未来的全栈开发方案。

JavaScript 成为 2018 年最受欢迎的编程语言

随着前端领域的迅猛发展,JavaScript 语言已经延伸到更丰富的使用场景中,HackerRank 在社区发起了 2018 年度的开发者调查,其中就包含了编程语言和框架。调查结果显示:JavaScript 在 2018 年度荣获最受欢迎的编程语言。

简要讯息

Github Trending

洞察 Github 近期 Hot Fresh Repository

flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档,帮助开发者快速上手 Flutter 内部测试中,1.0 正式版将于 2月 20日 发布。

Trilium Notes 是一款知识库构建工具,支持无限层级扩展,文档可以挂载到多个节点上,采用所见即所得的编辑方式。体验上个人感觉有点像桌面版本的语雀。

国服第一切图仔 chokcoco 整理的各种 CSS 技巧,帮助学习 CSS 和寻找灵感,以分类的形式,展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法。[](https://github.com/chokcoco/C...

一款高颜值的流媒体资源音乐🎵播放器,支持网络上所有免费的流媒体资源。

一款“带给我惊喜”的 vscode 插件,提供给给编辑器实时预览页面的能力,可以将 vscode 打造成更强大的集成开发环境 (IDE) 了。

1548992494875-b282cb53-c06d-40f1-ae4c-d142837e5377.gif

精品学习

TypScript 学习指导

TypeScript 最近可谓如火如,它是 JavaScript 的超集,其最大的特点就是支持了类型系统。其火爆的中最核心的推动力无非是前端工程规模的增长,覆盖端 (服务端 node / deno、移动端等)的扩展,学习和使用 TypeScript 能够让我们更轻松地应付一些复杂的开发场景。

「墨者修齐」数据可视化周刊

精选文章推荐,可视化入门与进阶权威网站、论文、工具介绍,工程与设计实践分享,2019 年起每周一更新。

Development 技术播客列表

涵盖了开发相关的方方面面,包括编程语言、AI、Devops、Web 开发等丰富的课程体系。

Flutter-learning

Flutter-learning 整理了 Flutter 相关学习资料,包括 Flutter安装和配置,Flutter开发遇到的难题,Flutter示例代码和模板,Flutter项目实战,Dart语言学习示例代码。

工具推荐

一款可以随手验证你的想法的桌面应用程序,输入 JS 代码片段既可预览执行结果,支持最新的 ES 特性。(PS: 也可以用来当做代码片段备忘录)

在线生成 image maps 的可视化工具,如果你想要绘制简单的局部可交互地图、编写邮件时希望添加链接到图片指定区块上,不妨通过 image maps 这项古老悠久的技术来实现,image-map 是一款在线进行可视化编辑,生成对应的 map / area 代码的工具。

mjml 是一种用于创建响应式的邮件的标记语言,通过编写语义化的标签,会自动帮助你转换成标准的 html 的代码,并且使用了 table 进行布局,非常适合编写富文本邮件。如果有这方面的需求,不妨进一步试试桌面版的 mjml-app 吧。

支持 windows,linux,macos 三端的命令行工具,集成的SSH客户端和连接管理器,可定制化程度非常高。

其他

最近在 Reddit 看到的前端 vs 后端的一些对比图,“很是真实”,献上给大家。

各位客官猪年大吉呀🌺🌺🌺,祝福新一年里猪事顺利!!! 另外 2020 年毕业的同学别忘了准备阿里巴巴春季实习生招聘哈,需要内推的同学也可以提前发送附件简历到我的邮箱。

附录

查看原文

赞 24 收藏 15 评论 0

nasuf 赞了文章 · 2019-02-08

前端小报 - 201901 月刊

订阅 / 投稿:https://github.com/txd-team/monthly
本期小编:x-cold (尹挚)

新闻快报

重磅消息:Github 宣布私有仓库免费,同期还上线了星标话题 (topics) 的功能

2019 年伊始,GitHub 正式宣布开放无限制创建私有存储库,并开始提供统一的企业版 GitHub 服务,微软正在开始加速 toB 企业服务的布局。开发者们一片叫好声,可谓年度最佳的程序员福利了。

软件技术 B2B 公司 Idera.inc 收购 Travis CI

Travis CI 将结合 Idera 公司其本身的数据库 / 开发者 / 测试等工具发挥更大的商业优势。不过使用免费版的社区同学也不用紧张,Travis CI 依然保证对开源软件免费的策略,并且其开源证书不会修改 (MIT),更多可以参考详细的官方公告

需要额外提醒的是, Travis-CI 对 Github 私有仓库依然没有提供免费的服务。

ES2019 即将到来,新特性快速一览

image.png

越来越多的项目开始迁移到 TypeScript

MemSQL Studio 的 3W+ 行前端源代码从 Flow 迁移到 TypeScript,主要目的是加强类型的控制,避免动态/弱类型造成运行时的各种问题。官方总结了一篇文章,介绍了他们为什么要迁移到 TypeScript,以及迁移过程的记录。

Fackbook 开源的测试框架 Jest 通过几番的讨论终于从 JavaScript 迁移到使用 TypeScript 构建整个项目了,详细的过程可以查看关联的 Pull Request

1 月 25 日,Yarn 官方团队在 GitHub issue 中宣布将对 Yarn 进行重大更改,主要包括:将代码库从 Flow 移植到 TypeScript,不再支持 Node 4 和 Node 6,并为 Yarn 新增了一些功能等,这个更改项目代号为 Berry,目的是增强 Yarn 优势,弥补弱势。(本条消息来自 InfoQ)

Midway v1.0 社区

Midway 是一款基于 Egg 和 TypeScript 的 Web 开发框架,由来自淘宝的 MidwayJS 团队开发。用户可以使用丰富的装饰器快速开发,并且引入了 IoC 的概念,统一管理依赖和统一初始化,是一款面向未来的全栈开发方案。

JavaScript 成为 2018 年最受欢迎的编程语言

随着前端领域的迅猛发展,JavaScript 语言已经延伸到更丰富的使用场景中,HackerRank 在社区发起了 2018 年度的开发者调查,其中就包含了编程语言和框架。调查结果显示:JavaScript 在 2018 年度荣获最受欢迎的编程语言。

简要讯息

Github Trending

洞察 Github 近期 Hot Fresh Repository

flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档,帮助开发者快速上手 Flutter 内部测试中,1.0 正式版将于 2月 20日 发布。

Trilium Notes 是一款知识库构建工具,支持无限层级扩展,文档可以挂载到多个节点上,采用所见即所得的编辑方式。体验上个人感觉有点像桌面版本的语雀。

国服第一切图仔 chokcoco 整理的各种 CSS 技巧,帮助学习 CSS 和寻找灵感,以分类的形式,展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法。[](https://github.com/chokcoco/C...

一款高颜值的流媒体资源音乐🎵播放器,支持网络上所有免费的流媒体资源。

一款“带给我惊喜”的 vscode 插件,提供给给编辑器实时预览页面的能力,可以将 vscode 打造成更强大的集成开发环境 (IDE) 了。

1548992494875-b282cb53-c06d-40f1-ae4c-d142837e5377.gif

精品学习

TypScript 学习指导

TypeScript 最近可谓如火如,它是 JavaScript 的超集,其最大的特点就是支持了类型系统。其火爆的中最核心的推动力无非是前端工程规模的增长,覆盖端 (服务端 node / deno、移动端等)的扩展,学习和使用 TypeScript 能够让我们更轻松地应付一些复杂的开发场景。

「墨者修齐」数据可视化周刊

精选文章推荐,可视化入门与进阶权威网站、论文、工具介绍,工程与设计实践分享,2019 年起每周一更新。

Development 技术播客列表

涵盖了开发相关的方方面面,包括编程语言、AI、Devops、Web 开发等丰富的课程体系。

Flutter-learning

Flutter-learning 整理了 Flutter 相关学习资料,包括 Flutter安装和配置,Flutter开发遇到的难题,Flutter示例代码和模板,Flutter项目实战,Dart语言学习示例代码。

工具推荐

一款可以随手验证你的想法的桌面应用程序,输入 JS 代码片段既可预览执行结果,支持最新的 ES 特性。(PS: 也可以用来当做代码片段备忘录)

在线生成 image maps 的可视化工具,如果你想要绘制简单的局部可交互地图、编写邮件时希望添加链接到图片指定区块上,不妨通过 image maps 这项古老悠久的技术来实现,image-map 是一款在线进行可视化编辑,生成对应的 map / area 代码的工具。

mjml 是一种用于创建响应式的邮件的标记语言,通过编写语义化的标签,会自动帮助你转换成标准的 html 的代码,并且使用了 table 进行布局,非常适合编写富文本邮件。如果有这方面的需求,不妨进一步试试桌面版的 mjml-app 吧。

支持 windows,linux,macos 三端的命令行工具,集成的SSH客户端和连接管理器,可定制化程度非常高。

其他

最近在 Reddit 看到的前端 vs 后端的一些对比图,“很是真实”,献上给大家。

各位客官猪年大吉呀🌺🌺🌺,祝福新一年里猪事顺利!!! 另外 2020 年毕业的同学别忘了准备阿里巴巴春季实习生招聘哈,需要内推的同学也可以提前发送附件简历到我的邮箱。

附录

查看原文

赞 24 收藏 15 评论 0

nasuf 赞了文章 · 2019-02-08

前端小报 - 201901 月刊

订阅 / 投稿:https://github.com/txd-team/monthly
本期小编:x-cold (尹挚)

新闻快报

重磅消息:Github 宣布私有仓库免费,同期还上线了星标话题 (topics) 的功能

2019 年伊始,GitHub 正式宣布开放无限制创建私有存储库,并开始提供统一的企业版 GitHub 服务,微软正在开始加速 toB 企业服务的布局。开发者们一片叫好声,可谓年度最佳的程序员福利了。

软件技术 B2B 公司 Idera.inc 收购 Travis CI

Travis CI 将结合 Idera 公司其本身的数据库 / 开发者 / 测试等工具发挥更大的商业优势。不过使用免费版的社区同学也不用紧张,Travis CI 依然保证对开源软件免费的策略,并且其开源证书不会修改 (MIT),更多可以参考详细的官方公告

需要额外提醒的是, Travis-CI 对 Github 私有仓库依然没有提供免费的服务。

ES2019 即将到来,新特性快速一览

image.png

越来越多的项目开始迁移到 TypeScript

MemSQL Studio 的 3W+ 行前端源代码从 Flow 迁移到 TypeScript,主要目的是加强类型的控制,避免动态/弱类型造成运行时的各种问题。官方总结了一篇文章,介绍了他们为什么要迁移到 TypeScript,以及迁移过程的记录。

Fackbook 开源的测试框架 Jest 通过几番的讨论终于从 JavaScript 迁移到使用 TypeScript 构建整个项目了,详细的过程可以查看关联的 Pull Request

1 月 25 日,Yarn 官方团队在 GitHub issue 中宣布将对 Yarn 进行重大更改,主要包括:将代码库从 Flow 移植到 TypeScript,不再支持 Node 4 和 Node 6,并为 Yarn 新增了一些功能等,这个更改项目代号为 Berry,目的是增强 Yarn 优势,弥补弱势。(本条消息来自 InfoQ)

Midway v1.0 社区

Midway 是一款基于 Egg 和 TypeScript 的 Web 开发框架,由来自淘宝的 MidwayJS 团队开发。用户可以使用丰富的装饰器快速开发,并且引入了 IoC 的概念,统一管理依赖和统一初始化,是一款面向未来的全栈开发方案。

JavaScript 成为 2018 年最受欢迎的编程语言

随着前端领域的迅猛发展,JavaScript 语言已经延伸到更丰富的使用场景中,HackerRank 在社区发起了 2018 年度的开发者调查,其中就包含了编程语言和框架。调查结果显示:JavaScript 在 2018 年度荣获最受欢迎的编程语言。

简要讯息

Github Trending

洞察 Github 近期 Hot Fresh Repository

flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档,帮助开发者快速上手 Flutter 内部测试中,1.0 正式版将于 2月 20日 发布。

Trilium Notes 是一款知识库构建工具,支持无限层级扩展,文档可以挂载到多个节点上,采用所见即所得的编辑方式。体验上个人感觉有点像桌面版本的语雀。

国服第一切图仔 chokcoco 整理的各种 CSS 技巧,帮助学习 CSS 和寻找灵感,以分类的形式,展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法。[](https://github.com/chokcoco/C...

一款高颜值的流媒体资源音乐🎵播放器,支持网络上所有免费的流媒体资源。

一款“带给我惊喜”的 vscode 插件,提供给给编辑器实时预览页面的能力,可以将 vscode 打造成更强大的集成开发环境 (IDE) 了。

1548992494875-b282cb53-c06d-40f1-ae4c-d142837e5377.gif

精品学习

TypScript 学习指导

TypeScript 最近可谓如火如,它是 JavaScript 的超集,其最大的特点就是支持了类型系统。其火爆的中最核心的推动力无非是前端工程规模的增长,覆盖端 (服务端 node / deno、移动端等)的扩展,学习和使用 TypeScript 能够让我们更轻松地应付一些复杂的开发场景。

「墨者修齐」数据可视化周刊

精选文章推荐,可视化入门与进阶权威网站、论文、工具介绍,工程与设计实践分享,2019 年起每周一更新。

Development 技术播客列表

涵盖了开发相关的方方面面,包括编程语言、AI、Devops、Web 开发等丰富的课程体系。

Flutter-learning

Flutter-learning 整理了 Flutter 相关学习资料,包括 Flutter安装和配置,Flutter开发遇到的难题,Flutter示例代码和模板,Flutter项目实战,Dart语言学习示例代码。

工具推荐

一款可以随手验证你的想法的桌面应用程序,输入 JS 代码片段既可预览执行结果,支持最新的 ES 特性。(PS: 也可以用来当做代码片段备忘录)

在线生成 image maps 的可视化工具,如果你想要绘制简单的局部可交互地图、编写邮件时希望添加链接到图片指定区块上,不妨通过 image maps 这项古老悠久的技术来实现,image-map 是一款在线进行可视化编辑,生成对应的 map / area 代码的工具。

mjml 是一种用于创建响应式的邮件的标记语言,通过编写语义化的标签,会自动帮助你转换成标准的 html 的代码,并且使用了 table 进行布局,非常适合编写富文本邮件。如果有这方面的需求,不妨进一步试试桌面版的 mjml-app 吧。

支持 windows,linux,macos 三端的命令行工具,集成的SSH客户端和连接管理器,可定制化程度非常高。

其他

最近在 Reddit 看到的前端 vs 后端的一些对比图,“很是真实”,献上给大家。

各位客官猪年大吉呀🌺🌺🌺,祝福新一年里猪事顺利!!! 另外 2020 年毕业的同学别忘了准备阿里巴巴春季实习生招聘哈,需要内推的同学也可以提前发送附件简历到我的邮箱。

附录

查看原文

赞 24 收藏 15 评论 0

nasuf 收藏了文章 · 2019-02-02

设计一个分布式RPC框架

0 前言

提前先祝大家春节快乐!好了,先简单聊聊。

我从事的是大数据开发相关的工作,主要负责的是大数据计算这块的内容。最近Hive集群跑任务总是会出现Thrift连接HS2相关问题,研究了解了下内部原理,突然来了兴趣,就想着自己也实现一个RPC框架,这样可以让自己在设计与实现RPC框架过程中,也能从中了解和解决一些问题,进而让自己能够更好的发展(哈哈,会不会说我有些剑走偏锋?不去解决问题,居然研究RPC。别急,这类问题已经解决了,后续我也会发文章详述的)。

1 RPC流水线工程?

RPC框架原理图

原理图上我已经标出来流程序号,我们来走一遍:

  • ① Client以本地调用的方式调用服务
  • ② Client Stub接收到调用后,把服务调用相关信息组装成需要网络传输的消息体,并找到服务地址(host:port),对消息进行编码后交给Connector进行发送
  • ③ Connector通过网络通道发送消息给Acceptor
  • ④ Acceptor接收到消息后交给Server Stub
  • ⑤ Server Stub对消息进行解码,并根据解码的结果通过反射调用本地服务
  • ⑥ Server执行本地服务并返回结果给Server Stub
  • ⑦ Server Stub对返回结果组装打包并编码后交给Acceptor进行发送
  • ⑧ Acceptor通过网络通道发送消息给Connector
  • ⑨ Connector接收到消息后交给Client Stub,Client Stub接收到消息并进行解码后转交给Client
  • ⑩ Client获取到服务调用的最终结果

由此可见,主要需要RPC负责的是2~9这些步骤,也就是说,RPC主要职责就是把这些步骤封装起来,对用户透明,让用户像调用本地服务一样去使用。

2 为RPC做个技术选型

  • 序列化/反序列化

    首先排除Java的ObjectInputStream和ObjectOutputStream,因为不仅需要保证需要序列化或反序列化的类实现Serializable接口,还要保证JDK版本一致,公司应用So Many,使用的语言也众多,这显然是不可行的,考虑再三,决定采用Objesess。

  • 通信技术

    同样我们首先排除Java的原生IO,因为进行消息读取的时候需要进行大量控制,如此晦涩难用,正好近段时间也一直在接触Netty相关技术,就不再纠结,直接命中Netty。

  • 高并发技术

    远程调用技术一定会是多线程的,只有这样才能满足多个并发的处理请求。这个可以采用JDK提供的Executor。

  • 服务注册与发现

    Zookeeper。当Server启动后,自动注册服务信息(包括host,port,还有nettyPort)到ZK中;当Client启动后,自动订阅获取需要远程调用的服务信息列表到本地缓存中。

  • 负载均衡

    分布式系统都离不开负载均衡算法,好的负载均衡算法可以充分利用好不同服务器的计算资源,提高系统的并发量和运算能力。

  • 非侵入式

    借助于Spring框架

RPC架构图如下:
zns架构图

3 让RPC梦想成真

由架构图,我们知道RPC是C/S结构的。

3.1 先来一个单机版

单机版的话比较简单,不需要考虑负载均衡(也就没有zookeeper),会简单很多,但是只能用于本地测试使用。而RPC整体的思想是:为客户端创建服务代理类,然后构建客户端和服务端的通信通道以便于传输数据,服务端的话,就需要在接收到数据后,通过反射机制调用本地服务获取结果,继续通过通信通道返回给客户端,直到客户端获取到数据,这就是一次完整的RPC调用。

3.1.1 创建服务代理

可以采用JDK原生的Proxy.newProxyInstance和InvocationHandler创建一个代理类。详细细节网上博客众多,就不展开介绍了。当然,也可以采用CGLIB字节码技术实现。

create-proxy

3.1.2 构建通信通道 & 消息的发送与接收

客户端通过Socket和服务端建立通信通道,保持连接。可以通过构建好的Socket获取ObjectInputStreamObjectOutputStream。但是有一点需要注意,如果Client端先获取ObjectOutputStream,那么服务端只能先获取ObjectInputStream,不然就会出现死锁一直无法通信的。

3.1.3 反射调用本地服务

服务端根据请求各项信息,获取Method,在Service实例上反向调用该方法。

reflection-invoke

3.2 再来一个分布式版本

我们先从顶层架构来进行设计实现,也就是技术选型后的RPC架构图。主要涉及了借助于,Zookeeper实现的服务注册于发现。

3.2.1 服务注册与发现

当Server端启动后,自动将当前Server所提供的所有带有@ZnsService注解的Service Impl注册到Zookeeper中,在Zookeeper中存储数据结构为 ip:httpPort:acceptorPort

service-provider

push-service-manager

当Client端启动后,根据扫描到的带有@ZnsClient注解的Service Interface从Zookeeper中拉去Service提供者信息并缓存到本地,同时在Zookeeper上添加这些服务的监听事件,一旦有节点发生变动(上线/下线),就会立即更新本地缓存。

pull-service-manager

3.2.2 服务调用的负载均衡

Client拉取到服务信息列表后,每个Service服务都对应一个地址list,所以针对连哪个server去调用服务,就需要设计一个负载均衡路由算法。当然,负载均衡算法的好坏,会关系到服务器计算资源、并发量和运算能力。不过,目前开发的RPC框架zns中只内置了Random算法,后续会继续补充完善。

load-balance-strategy

3.2.3 网络通道

  • Acceptor

当Server端启动后,将同时启动一个Acceptor长连接线程,用于接收外部服务调用请求。内部包含了编解码以及反射调用本地服务机制。

Acceptor

Acceptor-work

  • Connector

当Client端发起一个远程服务调用时,ZnsRequestManager将会启动一个ConnectorAcceptor进行连接,同时会保存通道信息ChannelHolder到内部,直到请求完成,再进行通道信息销毁。

Connector

Connector-work

3.2.4 请求池管理

为了保证一定的请求并发,所以对服务调用请求进行了池化管理,这样可以等到消息返回再进行处理,不需要阻塞等待。

request-pool

3.2.5 响应结果异步回调

当Client端接收到远程服务调用返回的结果时,直接通知请求池进行处理,No care anything!

async-callback

4. 总结

本次纯属是在解决Thrift连接HS2问题时,突然来了兴趣,就构思了几天RPC大概架构设计情况,便开始每天晚上疯狂敲代码实现。我把这个RPC框架命名为zns,现在已经完成了1.0-SNAPSHOT版本,可以正常使用了。在开发过程中,也遇到了一些平时忽略的小问题,还有些是工作工程中没有遇到或者遗漏的地方。因为是初期,所以会存在一些bug,如果你感兴趣的话,欢迎提PR和ISSUE,当然也欢迎把代码clone到本地研究学习。虽然就目前来看,想要做成一个真正稳定可投产使用的RPC框架还有短距离,但是我会坚持继续下去,毕竟RPC真的涉及到了很多点,只有真正开始做了,才能切身体会和感受到。Ya hoh!终于成功实现了v1.0,嘿嘿……

源码地址

  • zns源码地址
  • zns源码简单介绍:

    znszns-api, zns-common, zns-client, zns-server四个核心模块组成。zns-service-api, zns-service-consumer, zns-service-provider三个模块是对zns进行测试使用的案例。

查看原文

nasuf 关注了用户 · 2019-02-02

buildupchao @luwangmeilun

因为自知而敬畏,因为敬畏而谦逊。

关注 639

认证与成就

  • 获得 40 次点赞
  • 获得 89 枚徽章 获得 7 枚金徽章, 获得 30 枚银徽章, 获得 52 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-12-30
个人主页被 956 人浏览