Skip to content

202401

INFO

不知道能不能等到新年到来

不幸与幸运,还在目前公司等待新年的到来 20240102

0102

  • 937
  • 我以为回南京或者连云港老家能够安心学习,大错特错,上海才是你好好学习的最佳地点和时间,心无旁骛,冲刺最后一个月

0103

  • 938

  • 看了掘金 N 多个年度总结,90%都是被裁/离职,感觉靠技术生存下去越来越难,要准备副业,很感谢目前所在的公司给予的良好工作环境和氛围,没有裁我,也没欠薪,十分感谢公司

  • 带宽怎么计算?

  • 响应时间里 TP50/TP90/TP99 分别代表什么?

  • TP50 - 50%的请求的响应时间低于这个值。也就是响应时间的中位数。

  • TP90 - 90%的请求的响应时间低于这个值。表示只有 10%的请求响应时间超过了这个值。

  • TP99 - 99%的请求的响应时间低于这个值。表示只有 1%的请求响应时间超过了这个值。

所以这三个指标从整体上反映了一个服务的响应时间分布情况。TP50 表示中位数,TP90 和 TP99 关注响应时间的尾部分布。一个服务的目标是使这三个指标的值都尽可能低,表示响应时间集中且尾部延迟较低。

0104

  • 939,很感谢公司,养活了我这么近,快三年了,又是心存感激的一天
  • leetcode 刷题进度不如意,需要加快进度,也不能一棵树吊死,每天刷不同类型的题目。看到一位大佬,每天上班一天能刷 10 道题,太厉害了,真心佩服
  • Node.js 应用 RSS 内存是指啥? Resident Set Size,它表示程序运行时主要占用的物理内存大小,Node.js 应用占用内存大小过大可能表示有内存泄漏或其他问题。常见的原因包括: 1.全局变量或缓存未及时释放 2.闭包导致无法释放变量 3.事件监听器未及时移除 4.大对象频繁分配而不释放,通过以下方法分析和优化 Node.js 应用的 RSS 内存: 1.使用内存 profiler 工具分析内存使用情况,找到问题代码 2.避免全局变量污染,使用完即释放 3.使用流操作处理大文件,避免大对象分配
  • jemalloc 是什么? jemalloc 是一种高效的内存分配器(memory allocator),主要用于优化程序的内存管理和性能。 jemalloc 的全称是 jvm malloc,它是 Facebook 开发的一个开源 C/C++库,后来被集成到了许多知名的开源项目中,如 FreeBSD、Firefox 和 Facebook 的 HHVM。

0105

  • 940
  • 继续积累面试题, 插入排序和搜索旋转排序数组
js
function insertSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let j = i;
    while (j > 0 && arr[j - 1] > arr[j]) {
      swap(arr, j - 1, j);
      j--;
    }
  }
  return arr;
}
function swap(arr, i, j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}
insertSort([222, 333, 1, 2, 3333, 4, 6, 77]);
// 输入:nums = [4,5,6,7,0,1,2], target = 0
// 输出:4
function trans(nums, target) {
  let l = 0,
    r = nums.length - 1;
  while (l <= r) {
    let mid = l + Math.floor((r - l) / 2);
    if (nums[mid] == target) return mid;
    // 左右分段
    if (nums[l] <= nums[mid]) {
      if (target >= nums[l] && target < nums[mid]) {
        r = mid - 1;
      } else {
        l = mid + 1;
      }
    } else {
      if (target > nums[mid] && target <= nums[r]) {
        l = mid + 1;
      } else {
        r = mid - 1;
      }
    }
  }
  return -1;
}

0106

  • 941
  • 继续积累面试题,天天写,其实也没啥用处,只是让自己大脑运转起来
js
/**
 * 1.螺旋矩阵
 * 2.岛屿数量
 * 3.三数之和
 * 4.接雨水
 * 5.最长递增子序列
 * 6.useRequest
 */
// 螺旋矩阵
// 入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出:[1,2,3,6,9,8,7,4,5]
function matrix(nums) {
  if (!nnums.length) return [];
  // 上 右 下 左
  let res = [];
  let up = 0;
  let down = nums.length - 1;
  let left = 0;
  let right = nums[0].length - 1;
  while (true) {
    // 往右
    for (let i = left; i <= right; i++) {
      res.push(nums[up][i]);
    }
    if (++up > down) break;
    // 往下
    for (let i = up; i <= down; i++) {
      res.push(nums[i][right]);
    }
    if (--right < left) break;
    // 往左
    for (let i = right; i >= left; i--) {
      res.push(nums[down][i]);
    }
    if (up > --down) break;
    // 往上
    for (let i = down; i >= up; i--) {
      res.push(nums[i][left]);
    }
    if (right < ++left) break;
  }
  return res;
}

// 岛屿数量
// 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
// 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
// 此外,你可以假设该网格的四条边均被水包围。
/**
 * @param {character[][]} grid
 * @return {number}
 */
var numIslands = function (grid) {
  let isValid = (grid, r, c) => {
    return grid.length > r && grid[0].length > c && r >= 0 && c >= 0;
  };
  let dfs = (grid, r, c) => {
    if (!isValid(grid, r, c) || grid[r][c] != "1") return "0";
    grid[r][c] = "2";
    dfs(grid, r - 1, c);
    dfs(grid, r + 1, c);
    dfs(grid, r, c - 1);
    dfs(grid, r, c + 1);
  };
  let count = 0;
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      if (grid[i][j] == "1") {
        count = count + 1;
        dfs(grid, i, j);
      }
    }
  }
  return count;
};

0107

  • 942
  • 不同路径和最小路径总结

0108

  • 943,倒计时 120 天
  • 刷题俩个心路历程:1.不断塑造内心的强大 2.需要时不时的往后总结经验,沉淀一下。还有一点,不是为了面试而面试,需要有自己的思考和总结
  • 内心有点迷乱,需要学的东西太多,同时还不专注,一天只要做好一件事就行
  • Blob、File、ArrayBuffer、TypedArray、DataView 究竟应该如何应用

0109

  • 944,倒计时 119 天,感谢公司养活我
  • mysql 一点都不熟,要命了!
  • 最长重复子数组/最长公共子序列/最长递增子序列/最长连续递增子序列,WTF
js
//

egg 项目中的 sevices 和 controller

  • app/controller/xx: 用于解析用户的输入,处理后返回相应的结果。控制器需要做的就是处理数据和响应请求返回数据
  • app/service/xx: Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层,我们换一种理解方式,Service 层就是用于数据库的查询,我们尽量将粒度细化,这样以便多个 Controller 共同调用同一个 Service。
  • app/middleware/xx: 用于编写中间件,中间件的概念就是在路由配置里设置了中间件的路由,每次请求命中后,都要过一层中间件

0110

OSS 的全称是 Object Storage Service,即对象存储服务。它是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。用户可以通过简单的 REST 接口,在任何时间、任何地点上传和下载数据,也可以通过 WEB 页面对数据进行管理。

  • https 配置,腾讯云的域名+ssl 证书部署到阿里云 ESC 上
sh
server {
    #SSL 默认访问端口号为 443
    listen 443 ssl;
    #请填写绑定证书的域名
    server_name  www.bythewayer.com;
    #请填写证书文件的相对路径或绝对路径
    ssl_certificate bythewayer.com_bundle.crt;
    #请填写私钥文件的相对路径或绝对路径
    ssl_certificate_key bythewayer.com.key;
    ssl_session_timeout 10m;
    #ssl_session_cache shared:SSL:1m;
    #ssl_ciphers HIGH:!aNULL:!MD5;
    #请按照以下协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    location / {
          root /www/web/next;
          index  index.html index.htm;
          gzip on;
          # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
          gzip_min_length 1k;
          # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
          gzip_comp_level 2;
          # 进行压缩的文件类型。javascript有多种形式,后面的图片压缩不需要的可以自行删除
          gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
          # 是否在http header中添加Vary: Accept-Encoding,建议开启
          gzip_vary on;
          # 设置压缩所需要的缓冲区大小
          gzip_buffers 4 16k;
          try_files $uri $uri/ /index.html;
     }
}

0111

  • 946
  • 今天给自己揽了一个活,团队分享 SSR 降级,半个小时以内,时间还是比较充裕的,就讲讲这块的降级方案和策略是啥,好久没有做分享了,紧张激动,这两天抽空写一写 PPT

0112

  • 947

  • 来公司的第 N 次换位置,未来仍是一片迷茫,不知道是自己飘了还是咋的,内心总有一种不好的心态,不能脚踏实地,老是胡思乱想,不过有一点,很感谢公司收留我,虽然自己很迷茫,没了公司 我啥也不是

  • 今天继续默写手写 js,三数之和和字符串相乘

js
// 字符串相乘
function multiply(a, b) {
  let len = a.length + b.length;
  let res = new Array(len).fill(0);
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < b.length; j++) {
      let p1 = i + j;
      let p2 = p1 + 1;
      let sum = +a[i] * +b[j] + res[p2];
      res[p2] = sum % 10;
      res[p1] = Math.floor(sum / 10) + res[p1];
    }
  }
  while (res[0] == 0) {
    res.shift();
  }
  return res.join("");
}
multiply("11", "11");

// 三数之和
function treeSum() {}

0113

  • 948
  • 不能停止前进的脚步,周末是加油的最佳时机,不负时光
  • 记账系统练练手
js

0114

  • 949,上海洗牙真贵,花费 800 大洋,下次不洗了,太贵了

0115

  • 950,又是颓废的一天,不能这样堕落下去
  • 在命令行中可以通过打印 process.env 来查看所有环境变量:
js
node -e 'console.log(process.env)'
  • flex:1 是什么意思?
Details

flex:1 代表一个弹性布局属性,它包含 flex-grow, flex-shrink 和 flex-basis 三个属性的缩写。

  • flex-grow: 定义项目的放大比例,默认 0,即如果存在剩余空间也不放大
  • flex-shrink:定义项目的收缩比例,默认 1,即如果空间不足,该项目将缩小
  • flex-basis: 定义在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

flex:1 分别代表是 flex-grow:1;flex-shrink:1;flex-basis:0%; 它使项目既可以缩小,也可以放大。当空间不足时会缩小,当空间有剩余时会放大,放大比例为 1。 这样能让元素动态填充可用空间,是非常通用的弹性布局属性。

  • OSI 七层网络模型?
Details

OSI(Open Systems Interconncection,开放系统互联)网络分层,从上到下依次是:

  • 7.应用层(Application) // Http/ssl
  • 6.表示层(Presentation)
  • 5.会话层(Session)
  • 4.传输层(Transport) // tcp/udp
  • 3.网络层(Network) -- 路由器
  • 2.数据链路层(Data Link) -- 交换机
  • 1.物理层(Physical) -- 网卡、集线器(Hub)

0116

js
function generate(n) {
  let dp = [];
  for (let i = 0; i < n; i++) {
    dp = new Array(i + 1).fill(1);
    for (let j = 1; j < i; j++) {
      dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    }
  }
  return dp;
}

0117

js
function longestPand(s) {
  if (s.length < 2) return s;
  let len = s.length;
  let dp = new Array(len).fill().map(() => new Array(len).fill(false));
  let maxLen = 1;
  let begin = 0;
  // 从下往上 从左到右
  for (let i = len - 1; i >= 0; i--) {
    for (let j = i; j < len; j++) {
      if (s[j] == s[i]) {
        if (j - i <= 1) {
          dp[i][j] = true;
        } else if (dp[i + 1][j - 1]) {
          dp[i][j] = true;
        }
      }
      if (dp[i][j] && j - i + 1 > maxLen) {
        maxLen = j - i + 1;
        begin = i;
      }
    }
  }
  return s.substring(begin, begin + maxLen);
}
longestPand("dcabac");

0118

  • 953,午睡真的太难了,动不动就被吵醒,得主动出击了
  • 回文序列 leetcode 算法集合

0119

  • 954,还有 20 天过年,974,在这里暗无天日,看不到光明和未来。每天都在挣扎,左边是排斥现在的工作,右边是出去不知道能否找到同样薪资的公司,每天都在两者徘徊。最主要的原因还是在工作上没有价值归属感,比上一份工作带来的归属感很低,so?未来在哪里?

    我给出的方案就是: 工作之余,发挥自己的 passion,坚决不浪费时间,即使因业务裁员让自己有能力胜任下一份工作

  • 分享的文章还没写完?写不下去了
  • 箭头函数的 this 指向哪⾥?

    箭头函数没有自己的 this,箭头函数会捕获其在创建时它所在的词法作用域(即外部函数或全局作用域)的 this 值。

0120

  • 955,结婚的照片今天终于敲定了,洗几张给爸妈做纪念
  • 老家今年开始续家谱了,买纸买笔

0121

  • 956, 人活着到底意义是什么,搞不懂,搞不明白

0122

  • 957,做最好的准备,做最坏的打算,说到底,一个是准备足够多的现金流,另一个就是要有与之对应的技术。
  • 没有任何靠山,而且技术没有非常厉害,几乎没有晋升的可能性,有时也好,如果强制被裁,肯定先裁员我这种。是福不是祸,是祸躲不过
  • 无服务器:server-less: 又称无服务器函数、无服务器计算 (例如 AWS Lambda)或云函数(例如 Google.Firebase Cloud Functions),多年来一直在云计算领域占据一席之地。虽然无服务器并不是真正的不需要(远程)底层服务器,但开发者已经不必管理服务器及其相关任务(例如基础设施按需扩展)。相反,用户只需要将单一功能部署为无服务器函数,其他所有运维工作均由云服务商承担。来自2023 年前端 Web 发展趋势

以下是根据本文中介绍的趋势,我们给出的一些可以为 2024 年做准备的建议:

  • 尝试使用 Ark UI、Open Props 和 Shadcn UI 等新的样式解决方案并熟悉它们。

  • 学习如何将 GitHub Copilot 等人工智能工具集成到日常开发工作流程中。

  • 如果还没有,请开始学习 SSR/SSG 框架。可以考虑从 Astro 或 Next.js 开始。

  • 探索使用 Xata 和 Supabase 等 BaaS 平台构建全栈应用程序。(第一次听说)

  • 在你参与的每个项目中都使自己成为无障碍性的倡导者。

  • 成为 VS Code 专家,学习可提高工作效率的插件。

  • 开始学习 TypeScript。它很可能会在开发领域存在一段时间。

0123

  • 958,正式超过第一家公司的任职时间,201407-201702 = 31 个月,喜马是 202106-202401,整个 2022/2023 年在喜马度过,很感谢公司收留我,苏宁 201711-202106=36+7 = 43 个月,明年这时候如果还在喜马就超过第三家公司呆的时间,一跃成为毕业至今呆的时间最长的公司。

0124

  • 959

0125

0126

  • 961
  • 查询当前端口号所在的进程,lsof -i:7001
  • 这两天心态有点失衡加上身体有点劳累,老是上火,稍微让自己休息下
  • 今天下午报修了防盗门,声音小多了,突然感觉重生了,人能做的已经做到极致了,接下来就看自己的造化了
  • k8s CPU limit 和 throttling 的迷思

0127/28

  • 963,周六周日日常躺平
  • 从来没有为一次分享做过这么长时间的准备,下一次,如果有下一次,记得不要往前冲,没有人在往前冲。
  • 周四做完分享,晚上要开始把之前遗漏的算法题补充,年前完成 250 目标,时间还是来得及

0129

  • 964
  • 手写虚拟 dom
js
function render(node, parent) {
  const mount = el ? (el) => parent.appendChild(el) : (el) => el;
  if (typeof node == "string") {
    return mount(document.createTextNode(node));
  } else {
    let vNode = mount(document.createElement(node.tag));
    // props
    Object.keys(node.props).forEach((key) => {
      let val = node.props[key];
      vNode.setAttribute(key, val);
    });
    // child
    if (node.children && node.children.length) {
      node.children.forEach((child) => {
        document.appendChild(render(child, parent));
      });
    }
    return vNode;
  }
}
Details

目前的 vue 是通过 webpack 或者 vite 等工具先将*.vue 文件编译成一个 js 文件,js 文件中主要的就是 render 函数。然后执行 render 函数生成虚拟 DOM,再调用浏览器的 DOM API 根据虚拟 DOM 生成真实 DOM 挂载到浏览器上。

vue文件渲染到浏览器真实DOM

010/31