2021-06-20 11:17:28    125    0    0

材料

  • 牛腩1.5斤
  • 西红柿2个
  • 洋葱1个
  • 葱姜蒜
  • 调料:料酒、生抽、老抽、盐、番茄酱
  • 调味料:香叶、八角

烹饪步骤

炒牛腩

  • 牛腩解冻,切小块,在水中泡出血水
  • 锅里倒水,水中放料酒、姜片,烧开后将牛腩倒入锅中焯水,变色后将牛腩块捞出备用
  • 锅中烧油,放葱姜蒜爆香,倒入牛腩块翻炒,倒入适量料酒、老抽、生抽
  • 将炒好的牛腩放入煲锅中备用,加两片香叶、八角、姜片

title
title

炒洋葱番茄酱

  • 番茄切块,洋葱切条
  • 锅中烧油,放洋葱炒至略带金色,放入番茄翻炒,倒入少量水,放入番茄酱(可以多放些,番茄味浓比较好吃),炒至粘稠状
  • 将炒好的酱倒入煲锅中

title

番茄煲牛腩

  • 烧一壶开水,倒入煲锅中,小火煲一小时,放少许盐,大功告成,就米饭或拌面都很好吃

title
title
title

2021-06-16 03:27:41    84    0    0

烧写固件

  • 烧写固件(即Bootloader)进Flash的Bootloader区域需要使用SPI通信,可以使用另一块Arduino或者USBtinyISP作为烧录器。
  • Arduino编译工具位置:
  1. C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.33.0_x86__mdqgnx93n4wtt\hardware\tools\avr\bin
  • AVR头文件位置:
  1. C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.33.0_x86__mdqgnx93n4wtt\hardware\tools\avr\avr\include\avr
  • Bootloader程序位置,用C语言内嵌汇编编写:
  1. C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.33.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\bootloaders
  2. # ATmega328P的bootloader在atmega\ATmegaBOOT_168.c

title

  • 各目录下使用Makefile作为编译规则:
    title

  • 不同架构使用的make.exe不同,如Arduino Due的make位于:

  1. ~\Documents\ArduinoData\packages\arduino\hardware\sam\1.6.12\system\CMSIS\Examples\cmsis_example\gcc...

title

下载的三方库的位置

  • 在开发板管理器下载的三方包的位置:
  1. ~\Documents\ArduinoData\packages
  • 例如ESP8266库的头文件所在的位置:
  1. ~\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries
2021-02-22 04:33:38    90    0    0

一, 恢复到上一次commit的状态
会使上一次commit之后的所有修改丢失,谨慎使用。
git reset --hard # 将所有tracked的文件恢复到上一次commit的状态
git clean --df # 将所有未tracked的目录和文件删除

二, 清理临时文件
git clean --df # 要注意此时自己新创建的文件需要通过add命令跟踪,否则会被一起清理

三, 保存自己未commit的修改后更新代码
想更新查看代码,但自己有已经add但未commit的修改,可能会有冲突,若暂时不解决,可以通过下面命令更新代码。
git stash save “临时存储修改的代码” # 将tracked的文件修改存储到栈,否则无法更新
git pull # 此时不会出现冲突,所以可以用于日常定时更新
git stash pop # 需要合并自己的修改,解决冲突时,恢复自己的代码修改

四,查看一个文件什么时候做了什么修改
git log <文件名> # 查看哪些提交里修改了这个文件
git show # 查看当次提交做了哪些修改,--stat选项可以只查看修改了的文件名

git log –p <文件名> # 查看修改了该文件的提交中对该文件做的修改

五, 从PC向编译机同步代码,在编译机上push最终版本
PC上修改后去编译机一边编译一边修改,可以通过下面的方式:
PC端git push到isource,编译机上git pull同步。
编译机上修改后:
git add .
git commit --amend # 追加提交
git push origin HEAD:分支名 --force # 替换PC提交、但编译验证未完成的提交记录,push最终提交,但要谨慎使用—force

六, 文件换行符问题

例如:

  1. # .gitattributes
  2. * text=auto # 如果是文本文件,文件行尾自动转换
  3. *.jpg text # jpg文件标记为非文本文件,不进行任何格式的行尾转换
  4. *.txt text # txt文件标记为文本文件,并进行行尾格式化
  5. *.vcproj text eo
2021-02-13 08:00:05    105    0    0

go build

编译说明

  • Go以GOPATH作为工作目录和一套完整的工程目录规则,无需配置C的头文件路径、链接库路径等。
  • Go的编译速度非常快,Go 1.9版本后默认利用Go语言的并发特性进行函数粒度的并发编译。
  • go build命令用于编译,有无参数编译、文件列表编译、指定包编译等方法。

go build参数

  • -v 编译时显示包名
  • -p n 开启并发编译,默认情况下该值为 CPU 逻辑核数
  • -a 强制重新构建
  • -n 打印编译时会用到的所有命令,但不真正执行
  • -x 打印编译时会用到的所有命令
  • -race 开启竞态检测

编译实例

GOPATH:D:\GoPro

测试代码根目录:D:\GoPro\src\learning\gobuild

测试代码:

D:\GoPro\src\learning\gobuild\main.go:

  1. package main
  2. import "fmt"
  3. func main() {
  4. // lib.go中,同包的函数
  5. myFunc()
  6. fmt.Println("in main function")
  7. }

D:\GoPro\src\learning\gobui

2021-02-13 07:59:42    109    0    0

shell脚本相互引用变量的方法

向子shell传递变量

例:test.sh调用sub.sh,通过export,在调用sub.sh时可以获取export导出变量的拷贝,将testvar变量传给sub.sh。
test.sh:

  1. #!/bin/bash
  2. testvar=test
  3. export testvar
  4. ./sub.sh

sub.sh:

  1. #!/bin/bash
  2. echo $testvar # test

例:当子shell通过source的形式引用时,不需要export进行导出。

test.sh:

  1. #!/bin/bash
  2. testvar=test
  3. . sub.sh

sub.sh:

  1. #!/bin/bash
  2. echo $testvar # test

引用子shell的变量

例:通过source(.)将sub.sh嵌入在test.sh中执行,达到获取子shell变量sub的目的。
test.sh:

  1. #!/bin/bash
  2. . sub.sh
  3. echo $sub # testsub

sub.sh:

  1. #!/bin/bash
  2. sub=testsub

两个子shell互相引用变量

例:main.sh通过source先后嵌入a.sh和b.sh,b.sh可以使用a.sh的变量,因为source可以看做将shell脚本在该位置拷贝展开。

main.sh:

  1. #!/bin/bash
  2. . a.sh
  3. . b.sh

a.sh:

  1. #!/bin/bash
  2. a=1

b.sh:

  1. #!/bin/bash
  2. echo $a # 1
2021-02-13 07:59:35    153    0    0

docker镜像创建:

  • 拉取镜像:
  1. docker search centos
  2. docker pull centos
  • 创建后台运行的容器:
  1. docker run -itd centos /bin/bash
  • 在容器中执行操作后commit:
  1. docker ps # 查看commit-id
  2. docker exec -it <commit-id> /bin/bash # 进入容器,执行需要的操作,如果用docker attach,区别是exit时容器会退出
  3. docker commit -a "test" -m "docker commit test" b443a687d183 centos:v1 # 创建centos镜像,tag为v1
  4. docker images centos # 查看已commit的centos镜像,有镜像id
  • 使用commit的镜像创建容器:
  1. docker run -itd centos:v1 /bin/bash
  • 保存镜像文件:
  1. docker save <镜像id> > centosv1.tar
  • 在另一个服务器上加载镜像:
  1. docker load < centosv1.tar
  2. docker tag <镜像id> centosv1 # 这样导入进来的镜像是没有镜像名称和标签的,需要手动进行
2020-12-04 03:17:20    51    0    0

要再函数中改变外部指针的指向,必须将该指针的指针传入,如果只传入该指针,在函数中对指针指向修改并不会影响在外部该指针的值,和传入参数是局部变量道理相同。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "adt_def.h"
  4. Node *createStack()
  5. {
  6. Node *head = NULL;
  7. return head;
  8. }
  9. void printStack(Node * const head)
  10. {
  11. Node *stack = head;
  12. while (stack != NULL) {
  13. printf("elem = %d\n", stack->data);
  14. stack = stack->next;
  15. }
  16. }
  17. void pushStack(Node **head, ElemType e)
  18. {
  19. Node *newNode = (Node *)malloc(sizeof(Node));
  20. newNode->data = e;
  21. newNode->next = *head;
  22. *head = newNode;
  23. }
  24. int main(void)
  25. {
  26. Node *stack = createStack();
  27. pushStack(&stack, 4);
  28. pushStack(&stack, 99);
  29. pushStack(&stack, 22);
  30. printStack(stack);
  31. return 0;
  32. }
2020-12-02 08:07:26    43    0    0

netcat是什么

  • netcat是网络工具中的瑞士军刀,通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向可以在脚本中以多种方式使用它。
  • netcat所做的就是在两台电脑之间建立链接并返回两个数据流,能做的事情包括建立一个服务器、传输文件、与朋友聊天、传输流媒体或者用它作为其它协议的独立客户端。

netcat安装

  • 执行nc命令时出现Ncat:connection refused,ncat和netcat其实不是一个东西,这里nc是ncat的软链接,系统中没有安装netcat,所以先安装netcat。
  1. $ wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
  2. $ tar -xvf netcat-0.7.1.tar.gz -C /usr/local/
  3. $ cd /usr/local/netcat-0.7.1
  4. $ ./configuration
  5. $ make && make install
  6. $ vim /etc/profie
  7. export NETCAT_HOME=/usr/local/netcat-0.7.1
  8. export PATH=$PATH:$NETCAT_HOME/bin
  9. $ source /etc/profile
  10. $ which nc
  11. /usr/local/bin/nc
  12. $ nc --help
  13. GNU netcat 0.7.1, a rewrite of the famous networking tool.
  14. Basic usages:
  15. connect to somewhere: nc [options] hostname port [port] ...
  16. li
2020-11-26 08:55:56    104    0    0
2020-11-26 08:30:46    86    0    0

Dockerfile的作用

  • 用于构建镜像的文本文件,内容包含构建镜像(docker build)所需的指令和说明。
  • 上下文路径,是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build命令得知这个路径后,会将路径下的所有内容打包,因此不要将无用的文件放在上下文路径。

执行构建

  • 编写好Dockerfile后,执行该命令,将上下文路径'.'中的文件打包,制作镜像nginx:test:
  1. $ docker build -t nginx:test .

指令

FROM

  • 示例:
  1. FROM nginx
  • 定制的镜像都是基于FROM的镜像,这里的nginx就是定制需要的基础镜像。后续的操作都是基于nginx。

RUN

  • 示例:
  1. RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
  • RUN执行一个命令,有两种形式:
  1. RUN 命令
  2. RUN ["可执行文件", "参数1", "参数2"]
  • RUN echo -e "Hello\nWorld!"等价于RUN ["echo", "-e", "Hello\nWorld!"]
  • 注意:Dockerfile的指令每执行一次都会在Docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
  1. FROM centos
  2. RUN yum install wget
  3. RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
  4. RUN tar -xvf redis.tar.gz
  • 以上三次RUN会创建3层镜像,改成以下形式,只需要1层:
  1. FROM centos
  2. RUN yum install wget \
  3. && wge