Task to do

读样例代码+看课程其他讲解样例视频

作业思路: 把aw04中的product来源换成batch任务写入的数据库

aw04的数据结构可能需要重构 如product

More: Faster!——Parallel!

Read Example Code

Service——batch流程工作流程用到的基本服务

ItemReader,ItemProcessor,ItemWriter是模板,有类型参数可供自定义,可以通过重载自定义前后预处理的流程

JsonFilerReader

  • ObjectMapper:json和Plain Old Java Object互相转换

  • JsonNode: json的数据被组织成树状,树的节点,样例中实现的ItemReader类型参数是JsonNode

Read more »

BigAI

邮件: liwujun@nju.edu.cn

主页: https://cs.nju.edu.cn/lwj

大数据机器学习 机器学习算法:存储、计算、通信

  • 哈希学习
    • 哈希函数很关键 哈希值应当保留样本是否相似的特征
    • 实际应用: 行人重识别,自动问答,视频查重
  • 并行与分布式随机学习
    • 单机器:并行;多机器:分布式
    • 交互协同的开销有时比计算开销更大,是加速的代价
    • 分布式机器学习:数据不出本地(保护隐私等原因),实现可信机器学习
  • 大数据机器学习平台LIBBLE
    • 机器学习的底层数据平台

应用:

智慧医疗

ICS - 基础研究和系统工程中心

http://cs.nju.edu.cn/ics

判断程序的正误?如何根据行为习惯进行推断?高效的多心(并发)问题?

Read more »

作业项目地址

Question:

REST

官方文档

课程对应样例讲解:spring-projects/spring-hateoas-examples

REST目标之一是解决接口不规范的问题;ResponseEntity RESTful架构下返回的标准的数据接口,可以被网页解析,并且传入http状态代码。

annotation类型与get/post等http方法对应

配合open-api:规定程序接口

DTO

Read more »

虚拟机环境准备

账户设置:采用虚拟机原有设置 没有新建账号

环境变量设置

1
2
3
4
5
6
7
8
sudo vi ~/.bash_profile

PATH=$PATH:$HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java #需要查询本地Java安装地址 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java //需要查询本地Java安装地址

export HADOOP_HOME=/home/hadoop/hadoop_installs/hadoop-2.7.7
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:.

下载安装ssh 确认启动

(由于和另一个实验环境冲突,尝试了修改,暂时未测试)

Hadoop配置

Apache Hadoop官方文档

账户配置和基础指令指导

填写配置文件

Read more »

gcr.io 镜像因为网络原因拉取失败

尝试换源失败,总是提示验证失败,于是打算直接用代理从原网站下载

虚拟机使用宿主机的梯子环境

vitualbox上没有装梯子,尝试使用宿主机的梯子环境。vitualbox上的网络连接方式是 网络地址转换(NAT)

在终端用

1
ip route show

查看虚拟机所占用的ip地址,选择default的记录下来。

在虚拟机设置中找到Network-NeworkProxy 选择manual

所有proxy的ip都填写刚刚记录的ip,端口就查看电脑本机梯子上的端口填入(我的梯子软件界面自带了该信息,如果没有可以通过查看梯子软件进程占用的端口来确定)

在浏览器中访问google/youtube,成功即可

Read more »

谷歌

投递

同样是偶然在公众号看到。第一次用国内邮箱发送邮件被退回;但改用谷歌邮箱以后依旧没成功,最后请人内推。谷歌是滚动制,投递越早越好,然而正好与考试周冲突,可能投递完了只收到上海base的面试邮件。

面试用的自然语言(中英语)和计算机语言都可以在问卷中自选。

一面

  • 给定开心数的定义:各个位上数字的平方之和计算得到新的数,一直计算下去如果能得到1就是开心数,如果进入循环,即有计算得出的数重复出现,则不是。判断一个数是否是开心数。

  • 追问:(我使用的是Java,并且用哈希表来解决)

    • 为什么要使用hashset?

    • hashset插入和查询的复杂度

    • 哈希表底层原理?

  • (有点答不上来于是换了进阶算法) 给定一个10^6以内的数,返回有多少个小于给定数的开心数?

    • 类似NP问题的思路(?) 被提示:有些数字进行一次各个位数字平方和就可以得到1,有些需要两次,即第一次先得到到1只有一步开心数计算的数字,以此倒退。

微软提前批

投递时间

12月底偶然发现公众号更新了提前批相关信息,苦于当时在考试,在跨年夜当天晚上投递了,在1月3号投递ddl当天收到了意向征集的表格。

一面

Read more »

Intro

Reactor最早是在这篇论文中提出的 作为Java课程拓展阅读的笔记,主要分析老师给的参考实现和论文中介绍的组件的对应关系。

一张解释了各个组件之间关系的图:

image-20211211134127551

InitiationDispatcher (以下简称ID)是事实上监听事件的组件,其中使用NIO的实现方式,因为实际上一个Reactor中ID尽可能的使用单线程的方式实现,如果轻易阻塞会极大影响效率。同时具有一张用于分发的EventHandler表,在事件注册的时候进行初始化。SynchronouseEventDemultiplexer是用于通知ID的组件。

EvenHandler和Handle实际上实现了“Dispatch”(分发)的功能,事件注册时需要在ID中注册。

在看懂Reactor的代码之前,需要理解网络通信,以及了解NIO的实现机制。

Reactor Basic

image-20211211135057739

可以理解为Reactor统一处理请求,再将请求根据具体的任务分发到具体的acceptor,交给对应的处理函数执行(demultiplexing)代码对应single文件夹,其中包括了基础的组件。

Read more »

环境配置问题

如果出现 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 的问题(在mysql 8.0及以上的版本 应该是com.mysql.cj.jdbc.Driver)有可能是没有安装connection j的依赖,最好先借助mysql installer检查mysql的安装包。

查到的解决方案大多针对有maven等管理工具的大型软件,对vscode下临时建立的小项目不直接适用。

安装后有一个jar包,移动到classpath以后依旧报错,在YouTube上找到一位印度小哥制作的新手教程 把jar包移动到java project中即可。

image-20211209203900546

依赖和包的使用

需要java.sql.*

可以参考Mysql官方文档菜鸟教程

Statement: 用于像数据库发送指令 其中execute可以用于执行无返回结果和有返回结果的sql语句,但是executeQuery只能用于有返回结果的(如select)

ResultSet:用于接收结果,游标可以通过该对象使用

Read more »

1115 内推投简历
1117 hr联系约19号面试

1119一面

操作系统

  • 进程线程
  • 平常用线程编程过吗 举个例子?
  • 刚刚提到互斥 怎么保证线程互不干扰?
  • 死锁
  • 提到银行家算法就说一下具体实现

数据结构

  • 怎么用两个队列实现一个栈?
  • 排序有了解吗
  • 说一个印象深刻的排序算法?(讲了快排)
  • 快排既然有比较差的情况 怎么改进?
  • 平均复杂度是nlogn 是怎么算出来的?
  • 还有什么印象深刻的数据结构?
  • (讲到树) 既然刚刚提到交换左右子树的题就写一下吧
  • 一道算法题 交换左右子树 (一边写一边解释了思路 没有跑)

计网

  • 基本的TCP UDP介绍一下?
  • 刚刚提到TCP有保证稳定链接的机制 提到拥塞控制 详细说一下过程?(快恢复还是啥忘记名字了 面试官提示了一下)
  • 拥塞控制中怎么知道网络的拥塞程度的呢(前面关于阈值和ccwindow名字想不起来了)
  • 可以具体再说说吗(说到收到冗余3次和超时两种情况 会对应不同的处理方式

介绍一个课外项目

说了南小包 问了如何处理一些错误情况 异常 比如用户支付失败

Read more »

阅读JVM Internals的笔记

JVM System Threads

用户运行的main函数并不是java中最初始的线程,java开始运行的时候就对应着机器中的一个线程,可以称之为Java Thread,当java中其他的线程(non-deamon)的都结束以后,Java Thread才会终止,可以认为是java本身一个代表

在main运行之外,还有一些java system thread来在幕后支撑main函数运行,比如:

  • VM thread 等到JVM到达safe point,例如“stop-the-world”垃圾回收,线程的栈dump,线程暂停和biased locking revocation(有偏向的锁的撤回?)
  • Periodc task thread 阶段性任务;一些计时事件
  • GC Thread 垃圾回收
  • Compiler thread 在运行时将字节码转成原本的代码的线程
  • Signal dispatcher thread处理发送给JVM线程的信号并调用对应的JVM方法

对于每一个thread来说,有一些必要的组件:

  • PC 程序计数器 其中native线程的PC是不确定的
  • Stack 栈 每一个被调用的方法都有一个对应的frame被放入栈中,遵循LIFO原则 其中栈空间除了push和pop是不被直接管理支配的,并且frame中的一些结构可能被分配到堆上,因此这些object所占用的空间未必连续
  • Native Stack 为native方法准备的 和C stack一样 因为Java Native Invocation用C语言的连接模型(linkage model)实现
  • Stack Restrictions 大小可以固定或者灵活,超出范围是栈溢出,没有多余空间可分配是OutOfMemoryError
  • Frame 对每一次方法调用都会配备的相关信息,在抛出异常或者方法返回的时候被pop出栈
    • Local Variable Array 一些基本数据类型,对象只保存引用,返回地址,this指针
    • OperandStack 作用类似于CPU中的general-purpose reg(通用寄存器)因为对变量操纵频繁 因此local variable array和operand stack数据交换也很频繁(具体看ClassFile里字节码的写法)
  • Dynamic Linking 与c在编译中确定方法汇编和所在文件位置不同 在java当中方法编译后的链接是在运行时动态完成的 在类被确定并加载,调用静态方法或者动态方法的时候,symbolic reference从一个逻辑上的指针经由lazy resolution被解析,被替换成直接的引用,如果直接引用中涉及到的类没有被解析,那么就会去加载这个类。每个直接引用以相对于运行时变量或者方法存储的相对位置(offset)被储存

Shared Between Thread

Heap

Object和Array数据结构都是存放在堆中的,因为frame并不是为空间大小会变化的数据结构设计的。并且不像简单的数据类型和引用,堆中的对象并不会随着方法返回而被销毁。

Read more »