钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

什么是Git

根据官方网站上的介绍: Git是免费开源的分布式版本控制系统.

什么是版本控制

首先来看这个场景:

张三和李四还有王五要共同完成一份报表, 他们决定分工合作, 一人填写一部分, 然后用QQ发送给对方.

三天以后, 文件夹里躺着十几个同名文件, 王五忍不下去了, 决定改变这个现状, 他决定给文件加上命名规范, 于是文件夹里的文件变成了这个样子:

文件名 解析
财务报表_王五_Part1_20211026.xlsx 王五在2021年10月26日对第一部分进行了修改
财务报表_张三_Part10_20210926.xlsx 张三在2021年9月26日对第十部分进行了修改
财务报表_李四_Part3_20211016.xlsx 李四在2021年10月16日对第三部分进行了修改

一大堆同名文件总算是可以区分了, 这就是一种简陋的手动的版本控制, 可是这样还是不太方便, 我们需要自动化的版本控制.

Git的诞生

Git最初是Linus为了管理Linux的源码而编写的, 最初的代码管理是手动进行的, 后来BitKeeper决定为Linux社区开放免费授权, 但是Linux社区的大佬们岂能受这商业公司的约束, 他们开始对其进行逆向工作. 合作自然是告吹了, Linus决定自行开发自动化版本控制系统, 以十天的时间编写出Git第一个版本.

开始使用Git

本着按需学习的原则, 此处直接介绍如何与Github配合使用.

Git环境的配置

Git的安装

此处仅介绍Windows平台下Git的安装.

从官网下载安装程序即可, 一路Next就可以了.

安装完了应该能在程序列表里看到 Git Bash.

配置Git环境

首先是用户名和邮箱, 因为Git是分布式的版本管理系统, 所以机器需要知道 “来者何人”.

1
2
3
git config --global user.name  "自己的用户名"

git config --global user.email "自己的邮箱"

以下是示例:

1
2
3
git config --global user.name  "JiaFeiMiao"

git config --global user.email "JiaFei@jiafeimiao.onmicrosoft.com"

注意命令中的 --global 参数, 该参数表示对配置的修改是全局的, 也就是说, 本机上的所有Git仓库都会使用这个配置, 当然, 也可以对仓库进行单独的设置.

接下来我们需要检查配置是否成功, 可以使用以下命令

1
git config -l

以下是本机上显示的内容 (部分信息用*代替)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
core.editor="C:\Users\Admin\AppData\Local\Programs\Microsoft VS Code\Code.exe" --wait
push.default=simple
user.name=***
user.email=***

至此, Git环境就配置好了, 可以愉快的使用Git了.

Git的使用

创建Git仓库

运行下列命令就能在当前目录建立一个Git仓库了:

1
git init

将文件添加到仓库

1
2
3
git add A.txt
git add A.txt B.txt
git add .

第一条命令是将A.txt添加到仓库, 第二条命令是将A.txtB.txt添加到仓库, 第三条命令是将目录下所有文件添加到仓库.

这里说添加可能不太准确, git add的作用更像是帮助文件进行注册, 从而将其做出的修改纳入下一次提交.

将文件提交到仓库

1
2
git commit
git commit -m "消息"

两条命令都能实现提交, 区别是带-m参数会附上提交的说明, 此处强烈建议不要使用第一条命令, 每次提交都应该有对应的说明.

与Github配合

配置私钥和公钥

相关教程网上有一大把, 内容大同小异, 此处随便取了一个, 这是教程

下面简单讲一下背后的东西.

首先讲一下什么是SSH, 简单来说, SSH就是远程连接过程中的保安, 它能为远程连接提供安全性.

那么什么是私钥和公钥呢? 这是非对称加密中的一组概念.

非对称加密中需要两个密钥: 一个称为公钥, 用于加密明文; 一个称为私钥, 用于解密密文. 用于加密的公钥不能用于解密, 所以被称为非对称加密.

从远处仓库克隆到本地

在文件目录运行以下指令:

1
git clone SSH地址

SSH地址的获取方法: 点击Github仓库中的Code, 然后点击SSH

例如:

1
git clone git@github.com:**/**.git

链接远程仓库

此处假设你经有本地Git仓库了, 如果你没有本地Git仓库, 请看上文.

采用以下命令添加远程仓库.

1
git remote add origin SSH地址

origin是Git默认的远程仓库名称, 你可以修改这个名称.

将修改同步到远程仓库

采用以下命令

1
git push 远程仓库名称 本地仓库名称

请务必注意仓库名称不能填错, 由于之前默认的master有奴隶制糟粕残余的嫌疑, 现在Github等平台默认主分支名称换成了main, push前请确认仓库名称.

确认方法:

在文件目录下打开Git Bash, (右键, 点击Git Bash Here)

1
Admin@LAPTOP-**** MINGW64 /**/**** (master)

括号中的即为要确认的仓库名称, 此处为master.

注意:

push前应该提交修改, 也就是说完整的命令应该是下面的形式(命令的参数均省略):

1
2
3
git add
git commit
git push

将修改同步到本地分支

采用以下命令

1
git pull 远程仓库名称 本地仓库名称

首先上代码:

打印div的几种写法

法一: 替换当前页面

1
2
3
4
5
6
7
function PrintDiv(ID){
var needPrint = document.getElementById(ID).innerHTML;
var old = document.body.innerHTML;
document.body.innerHTML=needPrint;
window.print();
document.body.innerHTML=old;
}

此法能很好的保留样式, 但是在Blazor中存在一个问题: 调用以后页面中所有的按钮都会失效.

问题的产生应该与Blazor框架的底层机制有关, 在此不深究.

法二: 在新页面中打印

此法需要注意一点: 如果需要保留样式, 需要将CSS引用一并写入新页面, 需要等待页面加载完成后才能开始打印, 否则打印结果不带样式.

等待页面加载完成在 Firefox 和 Chrome 中的写法不一样, 具体请看代码.

什么是Blazor

MSDN1中的定义十分贴切, 此处照搬过来:

Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架:

使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI。

共享使用 .NET 编写的服务器端和客户端应用逻辑。

将 UI 呈现为 HTML 和 CSS,以支持众多浏览器,其中包括移动浏览器。

与新式托管平台(如 Docker)集成。

不严谨地说, Blazor就是用C#部分代替JavaScript来写前端.

阅读全文 »

题面

https://www.luogu.com.cn/problem/P1953

基本思路

很显然就是一个字符串处理的模拟题, 说到字符串, 就想到美国人的算法, 就想到今年下半年, 正则表达式 是一个常用工具, 而 C++ 11 中引入了对正则表达式的支持(在 <regex> 中), 我们可以用正则表达式进行匹配与替换.

原生字符串

这是 C++11 中引入的语法糖, 格式为 R"(A_String)" , A_String 的字面值会被原封不动的保存, 这样我们的正则表达式中就不用每次都用 \\ 来转义了.

regex的使用

出门右拐 CppReference:

https://zh.cppreference.com/w/cpp/header/regex

网络上也有很多介绍, 在此就不赘述了.

注意:

smatchstr() 函数, 参数为 0 时返回的是匹配的整个串.

阅读全文 »

核心部分-Coliru

Coliru是一个支持自定义命令行的在线编译器.

值得一提的是官方FAQ中给的示例代码还是http请求, 使用前应该替换成https.

语法高亮-ace.js

参考资料: 利用ace.js编写一个JavaScript编辑器(带智能补全)

需要指出的是文章存在一些问题

1
2
3
4
5
6
var text = document.getElementById('editor').innerText; 
/*存在只能获取可见部分的问题, 实际上ace.js提供了直接获取代码的方法, 无需处理行号
例: var code = editor.getSession().getValue();
*/
var ctext = "<script>"+text.replace(/\d\n/g, "")+'<\/script>';
//正则只能匹配一位数字, 应该改成/\d{1,}\n/g

传送门

在线运行C++代码

Coliru_Run_Code_Online
Powered by Coliru online compiler

Input:

Output:

入门

环境

classpath

classpath 是 JVM 用到的一个环境变量, 用来指示 JVM 到何处去搜索 class

在 Windows 系统中, 不同目录间用 ; 分隔, 带空格的目录使用 "" 包裹

例:

1
.;C:\work\project1\bin;C:\shared;"D:\jiafeimiao\project1\bin"

需要注意的是当前目录使用 . 代表, JVM 的按照 classpath 中的路径顺序查找, 如果在某个路径下找到了对应的 class 文件就不再继续搜索, 如果所有路径都没找到, 即报错.

阅读全文 »

char到底占几个字节?

两个 (65536个码位, 0 ~ 65535)

这个Unicode它保真吗?

2020-03-10 发布的 Unicode 13.0.0 包含 143,859 个字符.[1]

来做一道简单的比较大小: 143859 和 65536

那么 char 使用的 Unicode 保真吗?

答案是保真的, 接下来简单介绍一下 Unicode 相关知识

阅读全文 »

WAV格式解析

Waveform Audio File Format(WAVE, 或者是经常看到的扩展名WAV), 是巨硬与IBM共同开发的存储音频流的编码格式, 属于资源交换文件格式(Resource Interchange File Format, RIFF)的一种应用.

下面简要介绍一下RIFF文件, RIFF文件由一个简单的表头 (header) 跟随着多个 “chunks” 组成, 详见Wikipedia页面.

接下来介绍WAV文件, 以下仅介绍最简单的形式, 不包含扩展信息.

阅读全文 »

题面

在Animal类和其子类Dog类中均定义了一个名为age的整形变量, 则按照多态原理, 下列程序中访问的是Dog类中的age变量.

1
2
Animal a=new Dog();
System.out.println(a.age);

解析

属性的继承

Java方法重写是子类重写父类同名的方法, 子类方法覆盖了父类的方法. 而对于属性, 子类不会覆盖父类同名的属性.

如果子类没有定义属性, 子类会继承最近父类的属性.

如果创建子类对象后, 父类和子类对象都会保存一份自己的属性, 子类对象引用向上转型为父类对象引用, 父类对象引用调用的是子类重写的方法, 调用的属性仍然是父类的属性.

阅读全文 »