mit6.824 lab1

快手kcode程序设计大赛初赛总结

最终分数:13622.19
仓库地址:https://github.com/ayang818/KCoder-First

为时14天的kcode初赛算是结束了(6/17 - 7/1),由于个人的时间安排关系,我差不多是从24号开始正式开始写代码的。由于分数不算很高,排名按照封榜前大概是 (30 ~ 35) / 100,估计还有一大堆没写出来的,毕竟群里900多号人,但是前10的大佬们已经基本都是2.5w+了,但是由于爬分的过程还是非常有趣的,所以还是还是打算写一篇博客来梳理一下优化的过程。

我的爬分过程:600 -> 3600 -> 5000 -> 9400 -> 11000 -> 13600

使用Jetpack的Architecture工具降低Android开发中的耦合度

简单项目示例地址——https://github.com/ayang818/AndroidRookie
写这篇文章并不是因为要转android了(从大一上的时候光速学了三天,糊弄了一下android课的作业后就再没写过了QAQ),而是最近看到一篇关于在android使用MVC,MVP,MVVM的架构方法的文章,感觉写的很好,就想来自己试一试android的几种解耦方法,触类旁通嘛~。此处也花了几个小时顺便快速学了一下android和其算是趋势的jetpack,故作此博客。

在编写Android代码的时候很容易在一个activity中就编写出耦合度特别高的代码,导致项目不利于维护。下面是几种常见的解决方案解决方案:

[优化]Java中大文件IO的优化策略

Java中的IO方式大致分为如下几种

  1. 普通IO,也叫做BIO,基于流模型的阻塞式IO,相关的类大部分都是InputStream,OutputStream,Reader,Writer下的子类。
  2. NIO,也是大家认为效率较高的IO方式之一,相关的类有 ByteBuffer,FileChannel等。
  3. mmap内存映射,这是一种将文件直接映射到内存地址的方式,是一种非常快速的IO方案,相关的类有FileChannel,MappedByteBuffer

但是在分析各种IO方式的优化策略的时,首先至少需要了解一下,使用Java进行一次磁盘读取,到底进行了那些步骤?

标准的一次文件读肯定涉及以下几个拷贝步骤

  1. 将数据从硬件读取到内核态的内核缓冲区中
  2. 将内核缓冲区的数据读取到用户态的 JVM 中

此外,底层通过 write 、read 等函数进行 IO 系统调用时,需要传入数据所在缓冲区起始地址和长度,但是由于我们使用的是 Java,Java 中的对象存在 Java 的堆中,由于 GC 的存在,对象在堆中的位置是会不断变动的,所以在用户态的 JVM 和 内核缓冲区之间,还有一个不会被 GC 所干扰的堆外内存区作为缓冲区,所以这里又多了一个拷贝步骤。

  1. 将堆外内存区的数据读取到堆中。

整体流程如下

一次标准的文件读会经过三次数据拷贝,那么一次完整的文件读写就是六次数据拷贝,这样显然效率会比较低。这将是我们可以优化的一个点。

[DevOps] 使用Azure pipeline + Github为你的应用构建CI/CD流水线

什么是 DevOps ?什么是 CI/CD 流水线?

这个问题由于网上已经有很多很好的文章了,所以我这里就不再详细写了。大家可以自行参考。
什么是DevOps?什么是 CI/CD 流水线?

我归纳一下,

  1. DevOps是敏捷开发的一种主流实现方式,相比于传统的瀑布模型,DevOps为我们快速开发应用,快速发布应用,快速部署应用提供了一种方法论。
  2. DevOps中大致有如下几个环节
    1. Version Control (版本控制)
    2. Continuous Integration(持续集成)
    3. Continuous Delivery (持续交付)
    4. Continuout Deployment(持续部署)

如何为你的应用搭建完整的 CI/CD 流水线

在这篇文章中,我们将使用 Git + Github + Docker + Azure pipeline 的组合来完成一个简单的 node 服务端应用的自动化流水线的搭建。

  1. 创建一个node应用

    1. 初始化项目

      npm init
    2. 安装typescript

      npm install -g typescript
    3. 初始化为TypeScript应用

      tsc --init
    4. 安装我们需要的 express 依赖

      npm install express @types/express
    5. 编写一个最简单的Web应用

[DevOps] 如何写一个可快速构建镜像的Dockerfile脚本

本文不针对刚接触Docker和DevOps的初学者,一些初级资料可以查阅——https://yeasy.gitbooks.io/docker_practice/introduction/what.html

在一个CI/CD工作流中,我们在本地修改代码并提交后,CI系统会自动构建我们的代码并运行单元测试来验证本次提交的可行性。而这个构建很多时候为了屏蔽平台以及环境的差异性,往往会使用Docker来构建。构建一个Docker image绕不开的话题就是Dockerfile脚本该怎么写。不同的项目事实上编写的Dockerfile遇到的痛点往往不一样。本文针对的痛点是——构建速度慢。针对这个问题,我们首先得了解一下Docker build中的cache机制。

浅析Java强大的动态Instrumention能力

前言

在前面的博客中,我写过一句话,叫做

Java世界里的一切东西都是在拼Java命令行参数

如果你使用IDEA,并且在运行 Java 代码时观察过 IDEA 帮我们拼出来的命令行参数,举个例子

D:\jdk8\jdk1.8.0_232\bin\java.exe "\"-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 201.4865.12\lib\idea_rt.jar=61840:C:\Program Files\JetBrains\IntelliJ IDEA 201.4865.12\bin\"" -Dfile.encoding=UTF-8 -classpath ( 省略一系列依赖Jar包 ) C:\Users\25959\Desktop\test\target\classes com.ayang818.test.Test

这是我运行一个很简单的程序,IDEA 帮我们拼出来的命令行参数,其中 -Dfile.encoding 和 -classpath 我们都很熟悉,一个是指定编码方式,另一个是指定 classpath 路径。但是有一个我们可能很陌生的参数,叫做 -javaagent , agent 翻译成中文是代理的意思。于是我开始了一天的探究过程。

常用的一些算法板子(持续更新)

持续更新的一些算法板子

更详细的题目或题解可以查看我的刷题仓库

序列化动态规划解题技巧

序列化动态规划解题技巧总结

序列化动态规划属于动态规划中的基础题,这类题目通常是一组序列。

这类题目一般有一种比较通用的状态转移方程
$$
dp[i][aa]=Option_1^{i-1}(dp[i-1][bb])+cast_i
$$
其实这种题目在代码上也有一些小技巧

  1. 如果使用递推时间代码,让动态规划有效状态的下表从 1 开始,把下表 0 让给一步决策都没有做的初始状态。通常这样做,可以让边界处理简单不少。
  2. 其次是主动转移和被动转移,主动转移是从一个状态去找这个这个状态可以转移到什么状态;被动转移是去找这个状态是由什么状态转移来的。

寒假开始啦! 开始进行Kugga的基础设施建设了!

寒假博客应该不怎么会更新了。我的Kugga计划也提上日程了。寒假里的一些知识记录部分会以文档的形式更新在Kugga-wiki上面,感兴趣也可以关注下。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×