0%

大学期间我觉得我学的最差的有两门课,一门是数据库,还有一门是高数。现在回想起来数据库主要是当时因为根本就没有实践,几乎都没动手操作过,所以感觉极其陌生,现在来补一补。这次主要是从原理出发,对几乎每个数据库都有的内容进行简单的模拟。

数据结构

首先,数据库的数据载体是什么呢?很自然想到了文本文档,既然只是简单了解下原理,那完全够用了。也就是说,你要往数据库里写数据,其实就是写文件;而要从数据库里读取数据,就是从文件中读取内容,相当好理解。

其次需要解决的一个问题是,怎么从数据库查询指定的数据呢?为了方便,我们可以指定数据库的每一条数据长度是1000字节,这样如果你要查id是5的数据,直接把文本的4000-5000字节的部分读出来就好了。那如果是指定的内容而不是id呢,那也简单,把文件从头到尾读一遍,找到要查询的数据即可!emmmm这个方法虽然简单暴力,但是效率有点太低了,不能忍,于是就用到了一种叫B树的数据。

B树理解起来也很简单,首先是一种很基础的数据结构,二叉搜索树,这个搜索只需要log(n)就能找到你想要的数据。但是如果直接使用二叉搜索树,层数会比较多,不是非常适合,于是就有了它的变种——B树。二叉树每个节点只能放一个节点,B树则可以放多个,而且如果父节点有n个值,那么就有n+1个子节点,所以能够在使用极少的层数的前提下存放非常多的节点。当然其实现在的数据库也不是直接使用的B树(至少InnoDB不是),而是用了更加改进的版本——B+树。

阅读全文 »

很久以前我刚接触Python的时候,因为要运行一个软件,然后那个软件需要依赖某个库,我当时其实已经有那个库了,但是因为比较新,所以那个软件无法使用。然后网上说有几种方法:

  • 换台新电脑
  • 使用虚拟机,但是很多环境都需要重新配置,不考虑
  • 使用docker,当时我用的是这个解决的,但是数据传来传去的不太方便,其他倒是还好。
  • 使用Python自带的虚拟环境
    • virtualenv——一个很好用的第三方包,直接pip install virtualenv即可。
    • venv——python3自带的一个脚本,但是在ubuntu/debian上需要用apt install python3-venv安装后才可以使用

今天好好运行了一下Python的这个虚拟环境,感觉还挺方便的,期间也遇到了一些错误和如何解决它,在此记录下。

阅读全文 »

第一次真正接触到Base64编码是在大二下的时候,当时似乎是在搞一道题目的时候接触到的,但是只是说了这个编码是Base64,直接上网找了一个在线编码解码器就收工了。

接下来也陆陆续续看到过不少Base64编码的例子,直到上了研一,有一个在线的CTF的小测试,思路是先用Base64解码然后做题。当时我就很好奇,为什么他们一眼就能看出这是Base64编码的呢,但是当时也没有深究,今天想起来了就打算好好研究一下这个编码。

阅读全文 »

以前一直以为,回车就是换行,但是今天因为在使用WSL的时候突然想通了两者的区别,所以写篇简短的博客记录下。

为了区别,我们平时说的回车键,在下面统一使用Enter键代替。且下面的内容只是默认的情况下,完全可以根据软件或者配置一些设置修改。

首先从简单的开始,换行顾名思义,还是很好理解的,就是从一行到另外一行的切换,它的英文是”Line Feed”,简写做LF,其中的feed有”移动”之意。

难以理解的是回车,它的英文是”Carriage Return”,简写为CR。妈耶这个词从字面上是真的难以跟计算机扯上关系….以下的内容引自维基百科:

最早,在打字机上的打字位置是固定的,归位兼换行的扳手用于将承载装纸滚筒的机架(carriage)移到最右边,以便令印字位置对准一行的开头,同时顺便转动滚筒,换至下一行。后来,当打字机的滚筒不再横向移动,改由承载印字头的字车(印字头carriage)移回到本行的起始位置。

从上面的描述可以得出一个结论,回车仅仅是回到一行的起始,所以如果继续输入会覆盖掉原来的内容。

所以如果要写一篇文档,当写到一行的最后的时候,肯定是需要先回车,让光标回到一行的开始,然后再进行换行,这两个操作合二为一,就是现在键盘上的Enter键的作用。

阅读全文 »

之前大一学C语言的时候有点迷迷糊糊,加之时间久了,就遗忘的差不多了,最近项目要写一个Socket的程序,而且需要在windows下写,顺手记录一下之前我不太会的和我自己忘记掉的。

环境配置

环境方面可以选择IDE,著名的VS和后起之秀CLion都是很棒的选择,也可以自己配置vscode。

编辑器

编辑器其实都OK,用记事本什么的都行,我选的是sublime text3

编译器

其实编译器应该是最主要的一块了,也是windows下面的比较恶心的一块,它不像Ubuntu一样自带gcc编译器,需要自行安装。

如果只是想快捷省事,其实可以选择VC++,但是我因为以前socket是一直在linux上写并且编译执行的,所以这次想在windows下装个gcc的移植版。这里比较推荐的是MinGW,一款windows下面的gcc的移植版。安装完成之后再把二进制文件写入系统的环境变量中,在命令行中输入gcc --version ,看到有输出就可以了。

阅读全文 »

近期写了一个关于android ble(低功耗蓝牙)的APP,这里写篇文章记录下。

参考资料

  1. google官方的demo
  2. Android BLE蓝牙通信库
  3. 青草_离离的博客

基础知识

  • BLE是Bluetooth low energy的意思,属于蓝牙低功耗协议,Android4.3以上及苹果手机等现在都支持蓝牙BLE,而且不得不承认苹果手机支持得更好。
  • 在我们的这个APP中,我们的手机作为中心设备,而手环等蓝牙设备作为周边设备。
  • BLE技术是基于GATT进行通信的,GATT是一种属性传输协议,简单的讲可以认为是一种属性传输的应用层协议。所以理解它非常重要,GATT下面有很多服务(service),每个服务都有自己的UUID;同时每个服务都有一个或者多个特征(characteristic),同样每个特征都具有对应的UUID。每个特征都有对应的value(一般写APP要获取的就是特征下面的value值)和几个descriptor(descriptor是用来对这个value进行描述)
  • 我以我的小米手环2为例,详细说明下这段。可以这么理解,小米手环2本身是一个GATT(注意,仅仅是为了便于表达,这么说其实是错的),我们假设它包含三个service,刚好对应它的三个功能:分别是提供设备信息的service、提供步数的service、检测心率的service。设备信息的service中,会包含一个或者多个characteristic,这些characteristic中的value值就相对应于手环的厂商信息、硬件信息等;心率Service则包括心率characteristic等,而心率characteristic中的value就是真正的心率的数据,而descriptor则是对该value的描述说明,比如value的单位啊,描述啊,权限啊等。
  • 了解了上面的两段问题就不大了。
阅读全文 »

基础知识

根域

其实就是一个点,我们访问的所有网站,其实最后都是需要以点结尾,如www.baidu.com. 但是如果你真去那么访问的话,是访问不了的。猜测大概是浏览器做了优化。

根域服务器

13个ip地址,分别对应字母.root-servers.net,其中字母从a到m,正好13个。

一个无关紧要的误解 利用技术可以做到这13个IP地址对应全球800+的服务器,但是其实理解成全世界只有13台根域名服务器也无伤大雅

顶级域

顶级域(Top-level Domain,TLD)也叫一级域,包括通用的.com.net 等以及有国家性质的.cn.jp 等,这些域,都会有自己的域名服务器,这些域名服务器通称权威域名服务器。你可能会见过一个特殊的顶级域名arpa,以及一个特殊二级域名in-addr ,而且它们俩总是配套出现,这个涉及到后面的反向解析。

二级域

处于顶级域名之下的域。二级域名是域名的倒数第二个部分,例如在域名example.com中,二级域名是example

多级域名说明

1
2
3
4
5
www.   zhihu.  com     .
三级域 二级域 顶级域 根域

www. zhihu. com. cn .
四级域 三级域 二级域 顶级域 根域

Zone的概念

DNS的一颗子树就可以是一个区域(zone)。而区域传送的意思是,主服务器把自己的数据通过区域传送的方式给辅DNS服务器。

阅读全文 »

深度优先遍历

树的基本操作,肯定要熟练掌握的。以下的三种遍历,其实就是通过中间的树的值什么时候遍历来命名的。左子树永远优先右子树遍历。而且以下三种遍历都是属于深度优先遍历(Depth First Search),但是一般都是用的先序遍历。

inorder输出

就是中序遍历:

  • 先遍历左边的
  • 然后遍历中间的
  • 最后遍历右边的子树

python实现:

1
2
3
4
5
def helper(self, root, res):
if root:
self.helper(root.left, res)
res.append(root.val)
self.helper(root.right, res)

java实现:

1
2
3
4
5
6
7
private void inOrder(TreeNode root) {
if (root != null) {
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
}
阅读全文 »

https://kiwivm.64clouds.com/main-exec.php?mode=blacklistcheck ←检测有没有被GFW墙

这里我首先假设你已经能够连上你的VPS了,不管是Xshell还是直接在搬瓦工的Root Shell上操作。

第0篇:mac、win、android配置

第1篇:ipad、iphone配置

第2篇:利用ipv6进行配置

0.电脑/Android配置:

首先是参考网址

第一个:http://www.huizhanzhang.com/2017/05/bandwagon-one-key-shadowsocks.html

第二个:https://www.banwagongzw.com/7.html [推荐]

在开始之前,我强烈建议你运行一下这条指令 yum -y update,大概会花上两三分钟,省的以后出现一堆奇怪的问题。

直接一键完成:yum install -y wget && wget --no-check-certificate -O shadowsocks-libev.sh https://raw.githubusercontent.com/uxh/shadowsocks_bash/master/shadowsocks-libev.sh && bash shadowsocks-libev.sh
一键完成截图.png

阅读全文 »

最近虚拟机用的比较多,遇到了一些比较烦心的问题,所以记录下。

虚拟机上网

一般来说,虚拟机装好之后可以直接上网,也不需要多管什么,但是总会遇到一些问题:

  • 宿主机重启之后,虚拟机就无法上网了,为什么?
  • 如何为我的虚拟机配置指定ip?
  • 如何让我的虚拟机访问局域网内的其他主机?

下面来介绍一下虚拟机上网的几种方法以及简单的原理。

阅读全文 »