日常碎碎念 2021.5.15

距离上一次上来写文章已经过去了接近3个月了。上一次还是过年期间呢!时间过的真的好快啊。在这段时间,其实还是发生了不少变化的。最显著的变化还是:

  1. 从MateBook换到到了M1 Macbook Air
  2. 雅思第一把拿到6分的成绩
  3. 顺利拿到鹅厂和蚂蚁的实习offer

接下来就一点点的慢慢讲讲吧,虽然不一定有人看。

1.从MateBook换到到了M1 Macbook Air

去年Apple发布了基于ARM架构的M1芯片,那时我其实还不是特别心动,感觉新的Mac电脑距离我还是有挺远距离的,MateBook足以满足我日常工作学习的需求。当不幸的是,2月份MateBook宕掉了,日常的数据存放在了移动硬盘上还好。部分生产环境的代码还是放在了内置的硬盘当中,不幸遗失。虽然最后通过重刷系统得以恢复正常,但为了安全,我决定还是更换电脑。当时我的需求主要是便携,另外当时我的移动设备有iPhone和iPad了,由此更加增加了我购入MacBook的欲望。

我选择的配置是16+256的Air。之所以选择这个配置,主要是考虑到当时matebook无法升级内存导致天天内存溢出的窘境。而256则是因为512的价格太贵了,增加的1500元成本已经允许我购买一个三星T7 1T的移动硬盘了(之后也证明确实是明智的选择)。

由于过年放假的因素,我的Macbook实际到达时间是3月初,用到现在大概已经有2个月了。无风扇设计的Air是真的非常的棒,无论是静音设计还是便携性,都是行业领先的水准。而低功耗和新架构,也满足我的前端开发的性能需求。说实话,Air在运行大型前端项目的时候,还是会稍稍发热的,但远远不会像我的上一台笔记本以上,热的跟平底锅一样。各个方面都令我非常的满意,如果你也是一位前端开发者,并且也正好需要更换笔记本。那么基于M系列的Macbook绝对是非常值得考虑的,并且由于第三季度就会换代,在5月13日的今天,我会建议你等M2的发布。相比在那个时间点下,软件层面的适配会更加完善,而硬件层面的性能示范也一定会做的更好。

2.雅思第一把拿到6分

没想到自己有一天也要去考雅思,准备出国读研究生。2021年真的是非常不可思议,4月份的第一战,也狠狠的把我拍到在了地面上,口语稀烂,阅读听力稀烂,最终也只考到了6分,实在是没脸见人了😂。不过由于是第一次其实也是情有可原的啦,6月中再战吧,希望到时候我能追到6.5分。

3.三本菜🐔拿到大厂offer

其实我自己根本没想到自己能够在5月份收获两家梦寐以求的大厂offer的。腾讯和阿里都陆陆续续拿到了暑期实习的offer。真的是超级开心啊。四月底等待的时候都快抑郁了。拿到offer后真的是好兴奋,感觉自己过去三年熬的这么多个项目,终于没有白费。也感谢鹅厂和阿里不会有学历歧视,让我走到最后一面拿到offer。反倒是网易有道、京东、字节直接就进人才库了,真的是狗。

未来的展望

开心了快一周了,需要静下心来学习了,5月底的软考需要认真准备了,继续加油,准备软考和6月的六级。7-9月认真实习,10月雅思冲6.5分就是我对未来的大致计划了。努力努力,希望总会来的,冲冲冲!

[油猴脚本] V2EX 自动切换深色模式

起因

V 站从去年年中就好像开放深色模式了,但是切换样式一直都需要手动去切换,个人感觉有点麻烦。最近入手了 12,发现 iOS 的根据日出日落时间自动切换浅色深色模式的功能很好用,但是电脑端(Windows平台)不使用额外的软件不能实现自动切换样式,所以萌生了基于日出日落时间来自动切换 V 站样式模式的想法。

简介

目前脚本是基于定位获取当前设备的坐标,基于坐标计算出当地当日的日出日落时间,自动切换浅色与深色模式。 (日出后日落前就是一直保持浅色模式,日落后日出前就是一直保持深色模式)

脚本链接

https://greasyfork.org/zh-CN/scripts/421557-v2ex-autodarkmode

使用方法

第一次使用时,将会弹出询问❓是否允许获取定位📍,选择”允许”,并勾选✔”不再询问”即可完成初始设定。
之后的使用中,将默默运行在后台,没有任何的提示。

联系我

Email: gz7gugu@qq.com
Blog: https://www.7gugu.com
(由于把脚本放在了 GreasyFork,您也可以直接在 GreasyFork 上面私信我,看到就会回复)

Powered by 7gugu

[笔记]小程序JS 变量的生命周期探究

序言

今天闲逛”小程序开发社区”,无意中看到有一个同行贴出了以下的一段代码。

https://developers.weixin.qq.com/s/mqa4fHme7ZnX

从A页面当中跳转到B页面,点击按钮后,再返回上一页就不能触发按钮对应的事件了。

探究代码

第一次渲染

第一次渲染成功时,用户点击setData测试,按钮能正常触发事件(按钮内容变成setData成功),点击”点击另外打开当前页面”按钮之后,跳转到新的页面。

跳转到第二个页面

此时nodeid发生变化,证实跳转到了新的页面。此时点击左上角的返回按钮后,原来的setData按钮无法触发事件。

分析输出

从代码中我们很容易就能分析出,第一次渲染成功时,that和this指向的页面nodeid应该是acf9ce91,当我们跳转到第二个页面时,此时的that和this就变成了bd622626。

此时神奇的事情就发生了,当我们点击返回按钮回到上一个页面,我们就能看到that的输出值依然是 bd622626 ,但this的输出值就变回了 acf9ce91.

返回第一个页面

由此我的一个想法是,跳转页面只会初始化一个新的页面实例,而不是重新运行这个JS文件.

证明想法

辅助代码

为了证明跳转页面后不是重新运行这个JS文件的想法,我在Page构造器的外部增加了如下的代码.

但我重新渲染页面时,console页面成功输出了2

证明第一次渲染时,小程序是运行过这个JS文件的。但当我们点击跳转到新的页面时,2没有继续出现,此时我认为小程序在新的页面当中,小程序是没有运行过这个JS文件的。

查阅文档

小程序为了实现对视图层标签的管控,开发了一套内置的框架”Exparser框架”。在该框架当中,页面的渲染是基于Exparser框架提供的Page和Component构造器的注入的数据的。

文档链接:https://developers.weixin.qq.com/ebook?action=get_post_info&token=935589521&volumn=1&lang=zh_CN&book=miniprogram&docid=0000aac998c9b09b00863377251c0a

暂时性结论

按照我的个人理解,启动的时候,小程序就已经提前把页面的模板注册好了。如果后面再次访问该页面时,仅仅是会基于页面模板创建出新的页面实例。也就是只有Page()构造器里面定义的data,在同一个页面下,实例与实例之间是独立的,但是Page外部定义的变量是共用的

后续

如果未来有能力的话,希望可以反编译一下小程序的基础库,从源码正向来理解小程序页面渲染的流程。

引用

  1. 教程|《小程序开发指南》
  2. 同一page页面重复打开时,页面js里声明的变量会互相污染?

你好,2021

四级更迭,时光流转,又一个按下了快进键的365天。告别2020年,感谢遇见你2021,还请多多指教。

过去的2020年,经历了新冠病毒的侵袭,经历了全民隔离,网课教学。2020年的上半年是黑白的,感觉时间都被暂停了。但多亏大家的努力,让2020年的下半年逐渐重返前进的轨道之上,希望2021年,能够牛转乾坤,为美好的生活继续努力。

2020年,我第一次参加了微信小程序全国高校大赛,取得了华南赛区三等奖。但这个奖不会是我的终点,它会继续激励我,向着更高的目标继续进发,希望能够在未来取得更好的成绩。从年初的0.0.1版的GCU课表+,一直迭代到今天的1.8.1版本,一年来我对这个小程序进行了上百次的更新,现在回头看真的是成就感满满,即学习到了开发方面的知识,交到了更多的好友,也帮自己争得了一个奖项,希望明年能够继续进步。

2021年,一个新的开始,一页新的篇章,下面是我短期(1-2月)的一个目标。

  1. GCU课表+ 功能增强
  2. 自制LL(1)文法的编译器
  3. 学会用Coco2dx制作小游戏
  4. 用库乐队做一个 trap beat
  5. 雅思考到6.5

希望一切都能如约而至,也祝福大家心想事成,学业进步,身体健康。

[NodeJS]非抢占式多级反馈队列调度算法

前序

《操作系统》课程最近布置了一个大作业,要求我们每人实现一个非抢占式多级反馈队列调度算法的模拟程序,作为期末考核的一部分。(u1s1,真的是爽到,老师开心,我们也写的开心!)

实现代码

//Powered By 7gugu
//每一级队列的可运行时间
let timeSlice = [1, 2, 3];
//准备运行的队列
let preRunQueue = [];
//3级运行队列
let runQueue = [
  [],
  [],
  []
];
//准备运行的程序[开始时间, 运行时间]
let progs = [
  [0, 8],
  [1, 4],
  [5, 1],
  [3, 7],
  [4, 2]
];
for (let i = 0; i < progs.length; i++) {
  let prog = {};
  prog.id = "P" + i;
  prog.startTime = progs[i][0];
  prog.runTime = progs[i][1];
  prog.priority = 0; //设置最高优先级
  preRunQueue.push(prog); //把待运行的程序导入运行序列
}
//总运行时间
let totalTime = 0;
while (true) {
  //如果待运行队列中仍然有程序 & 程序已到达开始时间
  if (preRunQueue.length > 0) {
    let prog = preRunQueue[0];
    if (prog.startTime <= totalTime) {
      preRunQueue.shift(); //直接弹出队头的元素
      runQueue[0].push(prog); //把程序加入0级运行队列中
      console.log(prog.id + "开始运行,开始时间为:" + totalTime);
    }
  }
  for (let i = 0; i < runQueue.length; i++) {
    //如果各级队列还有程序的话,就继续运行
    if (runQueue[i].length > 0) {
      let prog = runQueue[i].shift(); //获取各级队列中第一个程序
      if (prog.runTime > timeSlice[i]) {
        //程序运行时间比时间片大
        totalTime = totalTime + timeSlice[i]; //总运行时间累加
        prog.runTime = prog.runTime - timeSlice[i]; //减去每一次运行的时间
        if (i != runQueue.length - 1) {
          //如果未处于最低优先级,则把程序放在下一个优先级队列中
          runQueue[i + 1].push(prog);
        } else {
          //如果处于最低优先级,则把程序放回最低优先级中运行
          runQueue[i].push(prog);
        }
      } else {
        //程序运行时间比时间片小
        totalTime = totalTime + prog.runTime;
        console.log(prog.id + "运行完成,目前时间为:" + totalTime);
      }
      break;
    }
  }
} 

运行结果

仓库地址

参考资料

计算机操作系统(第四版) 西安电子科技出版社

[小程序]PPG式心率测量模块

最近有空把之前想做的心率测量进行了开发和研究,最终选择了运动手环上面普遍采用的PPG式心率测量,载体则继续使用之前开发的”活力健身房”小程序。

什么是PPG式心率测量?

PPG是通过光电手段在活体组织中检测血液容积变化的一种无创检测方法。

测量的原理是啥?

原理:血液会吸收光纤,心跳时血液流量会规律性变化,进而产生规律性变化,进而产生规律性的光信号。

Demo视频

小程序码

使用方法

  1. 扫描小程序码
  2. 点击”我”
  3. 点击进入”心率测量”模块
  4. 阅读使用注意事项,点击下一步
  5. 开始测量,当剩余时间倒数至零时,即会生成测试结果

引用

  1. https://www.richtek.com/Design%20Support/Technical%20Document/AN057?sc_lang=zh-CN
  2. https://blog.csdn.net/QQ576494799/article/details/105024692/

ES6中的箭头函数()=>与function的区别

  1. 写法不同
  2. this指向不同
  3. 构造函数
  4. 变量提升

1.写法不同

//function
function x(a, b){
  return a + b;
}
//箭头函数
const x = (a, b)=>{
  return a + b;
}

2.this指向不同

使用function定义的函数,this的指向随着调用环境的变化而变化的,而箭头函数中的this指向是固定不变的,一直指向的是定义函数的环境。

function x(a, b){
  console.log(this);
}
const obj = ()=>{
  test: 7gugu,
}
x(); //Window
obj.test(); //obj { test: 7gugu }

使用function定义的函数中this指向是随着调用环境的变化而变化的

//使用箭头函数定义函数 
var foo = () => { console.log(this) };
var obj = { aa:foo };
foo(); //Window
obj.aa(); //Window

明显使用箭头函数的时候,this的指向是没有发生变化的。

3.构造函数

//使用function方法定义构造函数 
function Person(name, age){     
  this.name = name;   
  this.age = age; 
} 
var lenhart =  new Person(lenhart, 25);
console.log(lenhart); //{name: 'lenhart', age: 25}
//尝试使用箭头函数 
var Person = (name, age) =>{     
  this.name = name;   
  this.age = age; 
}; 
var lenhart = new Person('lenhart', 25); //Uncaught TypeError: Person is not a constructor

function是可以定义构造函数的,而箭头函数是不行的。

4.变量提升

由于js的内存机制,function的级别最高,而用箭头函数定义函数的时候,需要var(let const定义的时候更不必说)关键词,而var所定义的变量不能得到变量提升,故箭头函数一定要定义于调用之前!

foo(); //123
function foo(){     
  console.log('123');
}  
arrowFn(); //Uncaught TypeError: arrowFn is not a function 
var arrowFn = () => {     
  console.log('456'); 
};

转载自:https://blog.csdn.net/github_38851471/article/details/79446722

Vue Production环境中Proxy无效的解决思路&方法

问题

最近上线Vue项目到服务器,上传之后就出现了,代理404的问题。Dev环境中的代理是工作正常的,这点让我很疑惑,但这恰巧是我的一个误解,下面是这次的解决思路。

解决思路

一开始,我以为vue.config.js中的,devServer中的proxy是在路由(Router)层面做的数据转发,所以在这上面花了一些时间进行研究。后续通过查阅官方文档发现,devServer配置的是一个nodejs的测试服务器参数,而不是路由参数后,恍然大悟。(这就是我的误解所在)

解决这个proxy的方向,应该是关注于配置自身的HTTP服务器的代理上面,如果是Nginx,就要配置Nginx的路由转发;我这里用的是Apache作为我的HTTP服务器,所以应该配置的是对应的代理参数。

配置步骤

HTTP服务器部分

1.打开Apache的httpd.conf,开启以下两个proxy拓展,保存

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so 

2.在https.conf中配置监听接口,保存

3.打开httpd-vhost.conf如下图配置即可

4.此时HTTP服务器部分就配置完成了,此时仅需重启Apache服务器即可生效。

Vue部分

因为是使用了History模式的路由,所以为了正确路由到相关的页面,还需要配置相关的PathRewrite才能正确路由。

1.在vue生成生产环境文件的文件夹中,添加.htaccess文件(我使用的是默认参数,所以就在dist文件夹中)

2.配置以下参数即可。(参数参考官方文档进行配置)

3.至此Vue部分配置完成,重新访问404的问题就消除了。

参考文献

  1. vue项目使用history模式打包应该注意的地方
  2. 前端用vue 上传项目,apache服务器 成功中转接口代理
  3. Apache的ProxyPass简单使用
  4. vue项目上线apache反向代理配置跨域
  5. apache proxy作用——ProxyRequests

Vue import不识别 Unexpected Token (xx:xx)

Bug出现

最近在给工作室打工的时候,Vue做了个静态路由懒加载。

然后编译的时候死活不认这个import,截图如下,完全没有解决的思路。

解决思路

  1. 同事编译莫得问题,遂排除是代码问题
  2. 清除node_module,重新npm install,无效,排除是Node的问题
  3. 因为其他位置的import工作正常,遂排除babel未启用
  4. 最后通过下载安装”syntac-dynamic-import”,在配置后,问题解决