一波git的心得正在路上~ 2022-10-29 学习 暂无评论 ## git的一些想法和姿势 > 之前有写过git的使用方法,但是远不止那些,add commit push 直接梭哈,一旦出现冲突根本不会解决(现在也不会😅😅😅) - 基本流程 - `git checkout -b 分支名称` 创建一个新分支 - 在新分支上进行修改 - 如果remote的master**没有**变化,直接`git push origin 分支名称` 把分支上传到remote - 如果remote的master在checkout之后进行**变更**了,先checkout到master `git pull`获取到最新remote代码,在切换到本地的分支,`git rebase master` 对修改的分支进行**变基**,再push到remote,这种情况是没有修改相同文件的情况,不会出现冲突,反之,emmmm可能要手动修改选择保留哪一端代码。 - 涉及到的指令 - `git rebase branchName `把branchName作为父级仓库版本,也可以理解成,把branchName的改动拿到当前分支中来。 - `git checkout -b branchName`把当前的分支作为基本分支,并且迁出。和`git switch -c branchName`是一个意思 - `git checkout branchName` 切换分支,和`git switch branchName`是一个意思 - `git init`和`git init --bare` bare是指创建一个裸仓库,共享仓库的意思,没有.git这个文件夹,提交、切换分支等等,不会改变仓库的本地代码(直接init的话,用`git checkout 分支名` 就会改变本地的代码,所以不适用于公共仓库) - `git branch -a` 显示所有可用的分支 - `git branch -r `显示remote分支 (这个其实不准确,如果pull下来之后,remote中分支被删除,还是会显示出来) - `git remote prune origin`因为上面一个问题,这个可以更新远端仓库的信息,如果删除了,本地也会消失 - `git push --delete 分支名称` 可以删除remote的分支 - 本地代码落后,需要更新本地的其他代码 - `git stash ` 将更改暂存 - `git pull` 更新远端代码 - `git stash pop` 将暂存的代码抛出 > 这样实现更新代码,如果修改了同一个文件可能会出现冲突
Nodemcu(Esp8266)の折腾日记🤪~🤪~🤪~ 2022-08-01 学习 暂无评论 ## 写在前面 🥳🥳🥳 > 上周五从淮北回来,开发板和模块都到了,浅玩了一会儿,没学过嵌入式,这些东西太陌生了😅😅😅,而且c++也太久没碰,忘记的差不多了。 Tips(开发板相关): > - 不是所有的灯都是高电平亮,低电平灭,nodemcu板载的led就是低电平亮,高电平灭 - 引脚的分类(我知道的): - gnd 就是地线 - vcc 就是正极 - clk 可以输入时钟信号 - 引脚的模式: - 输入 INPUT 引脚可以接收电平信号 - 输出 OUTPUT 引脚输出电平信号 - 上拉 INPUT_PULLUP 不知道干啥的,好像是可以控制电阻的, - 有的模块有封装好的库,可以直接使用,有些是不需要的,比如led灯,只要给i/o引脚输入高电平就可以亮了,但是数码管是需要第三方的库,使用起来才比较“优雅” Tips(编程相关): > - setup() 初始化的时候执行的代码块 - 需要用pinMod(pin,mod)定义引脚模式,不然操作不了引脚, - loop() 循环的代码块 这里面的代码会一直循环,nodemcu硬件应该是只有单线程,实现多线程的话需要用第三方的库 ticker,b站有相关的教程 Timeline: 2022-8-1:顶多能点个灯,我终于可以控制rgb的灯了,为什么花了这么长时间,有两个原因, 1. 忘记定义引脚模式为输出模式 2. nodemcu板子上的引脚和esp8266的原始引脚是不对应的,板子上的D2应该定义GPIO4,给我睁大眼睛,看仔细。😒😒😒 接下来需要安排好引脚和模块的位置,用按钮输入信号,mqtt协议,巴法云,等。 📅:20220802 > 现在只剩下无源蜂鸣器没解决了 1. 当按钮按下的时候,数码管开始倒计时,并且向topic发送一条消息on,倒计时结束后会继续显示时间, 2. 当接收到mqtt的消息的时候也会开始倒计时,效果和开关是一样的 3. 也已经通过巴法云接入到了天猫精灵,应该也是可以直接接入米家的 ⭐代码分析⭐: MQTT: ``` c++ #include #include //********************需要修改的部分*******************// //巴法云私钥 #define ID_MQTT "****" //用户私钥,控制台获取 const char *topic = "TickDown001"; //主题名字,可在巴法云控制台自行创建,名称随意 //**************************************************// const char *mqtt_server = "bemfa.com"; //默认,MQTT服务器 const int mqtt_server_port = 9501; //默认,MQTT服务器 WiFiClient espClient; PubSubClient client(espClient); client.setServer(mqtt_server, mqtt_server_port); //设置mqtt服务器 client.setCallback(callback); // mqtt消息处理 //巴法云回调函数 void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Topic:"); Serial.println(topic); String msg = ""; for (int i = 0; i < length; i++) { msg += (char)payload[i]; } Serial.print("Msg:"); Serial.println(msg); if (msg == "on" && IsStart == false) { IsStart = true; startTick(); } else if (msg == "off") { //如果接收字符off,亮灯 } msg = ""; } //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); client.publish(topic, "倒计时正在进行中!!!"); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(ID_MQTT)) { Serial.println("connected"); Serial.print("subscribe:"); Serial.println(topic); //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } //loop函数巴法云 if (!client.connected()) { reconnect(); } client.loop(); ``` 以上是更MQTT协议相关的代码,其实很容易理解的 - 先引入必要的库 - 必要的几个参数 - 用户私钥 控制台获取 - topic主题,再控制台创建,智能家居的话可以是开关、插座、空调等等 - mqtt服务器地址和端口 - 实例化client需要传一个wifi的实例,然后`setServer()`传入服务器、端口、`setCallback()`设置回调函数 - 回调函数有三个参数,第一个是主题,第二个是返回值,第三个是值的长度,需要转换成string类型 - 订阅主题 `subscribe()`,执行多行可以订阅多个主题 - 发布消息`publish()`第一个参数是主题名,第二个是发布的内容 - `client.connected()`可以返回mqtt连接状态 - `client.loop();`这个可以理解成发送心跳包和读取服务器数据,需要一直执行的 📅:20220806 > 前几天把蜂鸣器也解决了,这里踩了一个坑(其实就是自己脑子不能转弯🥴🥴🥴) >下面是一张在网上找了一张频率对应的表  > 小学二年级学过频率的定义,一秒钟内震动的次数,比如“哆”频率是262,也就是一秒钟震动262次,1000/262=3.816794 3.8167毫秒,3816微妙震动一次,但是`delay()`方法最小单位是毫秒,所以要用这个微秒来做延迟`os_delay_us()` 其实3816是它的周期,一个周期是低电平 间隔 高电平 间隔 组成的,所以这个间隔的时间需要3816/2=1908us, 这是音调,要想出音乐还得要有拍子,比如哆的四分音符,它的for循环的次数就是 1000000/4/1908\*2=262.054507次,八分音符就是1000000/8/1908\*2=131.027254次 折腾倒计时就算结束了,下一个准备弄远程空调和远程开关 以上!
震惊!安装了Node,Npm命令却消失不见!(sln) 2021-12-01 学习 暂无评论 ## 离线安装Npm > 背景:N1的openwrt默认安装了Nodejs但是好像没有安装Npm,想要安装PM2来管理程序, 1. 查看当前的Node版本 `node -v` 2. [查看node对应Npm版本](https://nodejs.org/zh-cn/download/releases/ "查看node对应Npm版本") 3. 去Npm官网[下载](https://npm.taobao.org/mirrors/npm/ "下载")离线包, 4. 解压后找到cli的bin目录,里面有对应操作系统的安装脚本 5. 使用nodejs来安装Npm `node cli.js install npm -gf ` > cli.js 就是bin目录下的当前环境是linux,应该还有windows的, -g是全局安装 f不知道😂 6. 等代码跑完就可以使用Npm了 > ps:以上是系统中没有安装npm的解决方案,不是已经安装,无法使用的情况. > pm2常用命令: 创建项目: pm2 start <路径> --name <项目名称> 项目列表:pm2 list 停止项目 pm2 stop 删除项目 pm2 delete 监控仪表 pm2 monit
git版本控制的学习🐱👤 2021-08-30 学习 暂无评论 #git 提交相关 ## git init 初始化仓库 ## git add 添加到暂存区 有两种方式 1. `git add .`把所有更改都提交, 2. `git add <文件名1> <文件名2>`添加指定文件到暂存区 ## git commit -m `git commit -m '提交信息'`提交暂存区的更改 ## git push 把本地仓库提交到远程仓库 #git 分支 - `git branch`查看分支 - `git branch -r` 查看远端分支 - ` git checkout -b <本地分支> origin/<远程分支>` 在本地创建分支,并且指定为哪一个远程分支 - `git branch -D <本地分支>` 删除本地分支 > 删除本地分支不可恢复,其次不能删除当前分支,换言之,要切换到其他分支再删除分支 - `git checkout -b <分支名称>` 如果分支存在则切换,不存在则创建 - `git checkout <分支名称>` 切换本地分支 - `git push --set-upstream <分支名称>`在远程创建分支 > 好像还会自动上传更改,自动执行了commit,并且主分支的提交记录都在 ## 使用情景 > 本地仓库和远程仓库都已经提交,但是所修改的内容不足以构成一次提交,需要**继续修改** 基本流程 1. 本地仓库先撤回到上一个版本 2. 强制push到远端,回退到和本地相同的版本 3. 修改本地,足够一次提交后,再commit 操作 1. `git log` 查询提交历史,找到版本号 2. `git reset --soft <版本号>` 撤回到上一个版本,这里要说的是,只是撤回版本库,实际的代码是不会随着仓库的回退而回退的, 3. `git push origin master --force ` 强制的把master的版本改成当前本地仓的版本,实现回退。 4. 远端和本地都恢复到提交前的状态,修改代码后需要`add .` `commit` `push`等等操作
C# 委托和事件 2021-08-20 C# 暂无评论 ``` c# public delegate void SayHello(string content, string who);//定义委托(决定了参数类型和个数) public static event SayHello sayHelloEvent;//定义SayHello类型的事件 ``` ```c# SayHello dlgSay = say; //定义sayhelllo委托变量,并且绑定一个方法 dlgSay += say1; //给变量再增加一个方法 dlgSay("你好呀", "张三!"); //调用委托变量 这时候say和say1都会执行 SayHello dlgSay1 = delegate (string con, string name) { Console.WriteLine(name + con + "匿名函数"); }; //直接给委托变量绑定一个匿名函数 dlgSay1("nihao", "zhangsan"); SayHello dlg2 = (name, who) => { Console.WriteLine(name + who + "lambda"); };//绑定lambda表达式也可以 dlg2("你好,", "张三"); sayHelloEvent += Program_sayHelloEvent1; //注册事件 sayHelloEvent += Program_sayHelloEvent;//注册事件 //sayHelloEvent -= Program_sayHelloEvent; //注销事件 sayHelloEvent("事件", "事件1");//触发事件 ``` ```c# public static void say(string content, string who) { Console.Write($"{who}" + $"{content}"); } public static void say1(string content, string who) { Console.Write($"{who}" + $"{content}" + "say1"); } //触发事件的时候要执行的方法前提是已经次绑定了 private static void Program_sayHelloEvent1(string content, string who) { //原本应该是他先执行的(确实是先执行的)因为是异步延迟不妨碍后面的事件。 Task.Run(() => { Thread.Sleep(5000); Console.WriteLine(who + content + "我是被触发的事件 Program_sayHelloEvent1"); }); } private static void Program_sayHelloEvent(string content, string who) { Console.WriteLine(who + content + "我是被触发的事件 Program_sayHelloEvent"); } ``` tips: > 个人理解:委托(确定参数类型和个数)可以把方法给串起来,当这个委托变量被执行的时候会按照+=顺序来执行。 事件也是这么回事跟委托差不多,事件是用event修饰的委托,事件执行的时候,也是按照+=的顺序来执行方法(参数类型、个数、静态取决于委托是怎么定义的)