vim常用快捷键使用指南

自己在工作中经常使用的vim快捷键 快捷键 描述 0 跳至行首,不管有无缩进,就是跳到第0个字符 (常用) $ 跳至行尾 (常用) gg 跳至文首 (常用) G 调至文尾 (常用) dd 删除光标所在行 (常用) n+[Enter] n 为数字。光标向下移动 n 行(常用) :1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) dw 删除一个字(word) yy 复制一行 p 粘贴 /pattern 向后搜索字符串pattern n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个) N 上一个匹配(同上) :w 将缓冲区写入文件,即保存修改 :wq 保存修改并退出 :x 保存修改并退出 :q 退出,如果对缓冲区进行过修改,则会提示 :q! 强制退出,放弃修改 :set nu 显示行号 :set nonu 与 set nu 相反,为取消行号! i 从目前光标所在处输入 [Esc] 退出编辑模式,回到一般模式中(常用) u 复原前一个动作。(常用) [Ctrl]+r 重做上一个动作。(常用)

十二月 22, 2020 · nobject

计算机网络 - tcp协议

定义 TCP提供一种面向连接的、可靠的字节流服务。所谓面向连接,即应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完毕后,必须释放已经建立的连接。这个过程可以通俗的比喻成通话过程,在通话之前,必须先拨通号码,对方也必须接听,之后才可以通话。 所谓可靠的服务,即表示TCP连接传送的数据可以做到无差错,不丢失,不重复等。 握手 TCP的传输需要先建立连接,整个建立连接的过程一般称为三次握手 为什么是三次,不是两次,甚至更多 建立连接的过程是要保证双方可通信。比如邀请女神约会,我们都得先确定可以去,女神也得确定我可以去,不然谁先到约会地点就谁尴尬,容易被放鸽子。 我 –> 明天晚上可以一起看电影么? –> 女神 女神 –> 可以啊 –> 我 如果两次握手是这样的,第一,女神这边确认是可以收到消息的了,我这边是确认可以发送消息的了。但女神那侧也并不确认自己是发送成功了,那怎么判断能发送成功,只能通过我这方再次发送通知过去才可以。 我 –> 收到啦,一言为定 –> 女神 当进行了第三次握手的时候,我们双方才能确定,前两次的话是生效了,三次握手的目标就是使双方心里都有底,确保双方最基本的发送与接收功能正常。女神可以确认自己的收发能力都OK,我也确认了自己的收发能力OK,才能最基本上的保证不被放鸽子,双方心里都有底。 为什么不是更多? 因为三次握手是确保双方通信条件都OK的最基本的方式,如果更多次,当然也可以,但是,会增加网络的消耗,4次,甚至5次…N(N>5)次,也只能确保前N-1是正常的,也不能确保之后通信就是完全正常,所以3次是最好的握手判断。 三次握手的过程 TCP 报文 源端口与目的端口,各占2字节,16位 序号,4个字节,0~$$2^32$$ -1。起始序号在连接建立时设置,首部中的序号是指本报文段所发送的数据的第一个字节的序号。 例如,一个报文段第一个字节序号是301,最后一个字节序号是400,则下一个报文段的数据序号就得401. 确认序号,4个字节,期望收到对方下一个段文段的第一个字节的序号。 例如,收到了对方发来的报文段,序号字段是501,数据长度是200字节,则期望收到对方下一个数据序号为701,此时,就将发送给对方的确认序号设置成701. 首部长度,4位。首部长度最小为20个字节,但因为包含选项(不定长),但最大长度只能是60个字节。因为该值长度为4位,4位最大值表示15,也代表整个首部最长为60字节,选项长度最大为40字节 保留位,6位,为今后所用,目前应置为0 紧急URG(URGent)当URG = 1时,表明紧急指针字段有效,与紧急指针字段配合使用,代表该报文段中有紧急数据,需加急处理 确认ACK(ACKnowledgment)当ACK = 1时确认号字段有有效,ACK = 0时,确认号无效,在连接建立后,所有传送的报文段都必须置ACK = 1 推送PSH(PuSH)两应用程序进行交互式通信时使用,当PSH = 1时,接收方应尽快的交付接收应用进程,不用等缓存满了再向上交付。该操作很少使用 复位RST (ReSeT) 当RST = 1时,表明TCP连接中出现严重差错(如主机崩溃),必须释放连接,然后再重新建立连接。RST = 1还用来拒绝非法报文段或拒绝打开一个连接 同步SYN(SYNchronization)在连接建立时用来同步序号。SYN = 1而ACK = 0时,说明这是一个连接请求报文段。对方若同意建立连接,则应在响应报文中设置SYN = 1 ,ACK = 1. 终止FIN (FINis)用来释放一个连接,当FIN = 1时,表明报文段的发送方数据已发送完毕,并要求释放连接 窗口 2字节,用于告诉对方,允许对方发送的数据量大小,自己的缓存空间还可接收多少数据量。 校验和 2字节,检验首部与数据 紧急指针 2字节。URG = 1时配合使用,本报文中紧急数据的末尾在报文中的位置 选项 最长40字节 挥手 为什么是4次,不是3次,甚至更少 4次挥手过程 如何实现可靠性

八月 21, 2020 · nobject

计算机网络系列 - 笔记

此系列用于记录计算机网络相关的知识要点 一来,复习巩固这一块的知识,防止每次用到相关知识却各种的查找资料。 二来,加强这一块的学习,自己之前也有很多不懂的地方,需要记录与学习 目前分以下下节整理 物理层 数据链接层 传输层 3.1 传输层 - TCP 3.2 传输层 - UDP 网络层 应用层 常用协议 DHCP 常用协议 ICMP 常用协议 ARP DNS

八月 15, 2020 · nobject

Leetcode 26 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “"。 示例 1: 1 2 输入: flower","flow","flight"] 输出: "fl" 示例 2: 1 2 3 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母 a-z 。 解题思路: leetcode官方提供了不少解决方案. 主要解决方案有: 横向扫描法, 纵向扫描法,分治法, 二分查找法, 字典树. 个人觉得纵向扫描法是最容易想到的,而且效率也不错. 纵向扫描法: 纵向扫描时即依次遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func longestCommonPrefix(strs []string) string { strsLen := len(strs) if strsLen == 0 { return "" } for i := 0; i < len(strs[0]); i++ { for j := 1; j < strsLen; j++ { if i == len(strs[j]) || strs[0][i] !...

七月 29, 2020 · nobject

Leetcode 350 两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 1 2 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 1 2 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。 我们可以不考虑输出结果的顺序。 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办? 解题思路【哈希法】: 将其中一个数组转换成哈希Map的类型,key为数组的值,value为数组中该数出现的次数。 循环遍历另一个数组,通过Map中是否有该值来判断,如果有相同的值,则记录该值,同时将Map对应key的value值减1. 时间复杂度:O(max(n,m)) 空间复杂度:O(min(n,m)) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func intersect(nums1 []int, nums2 []int) []int { m := map[int]int{} ret := []int{} for _, v := range nums1 { m[v]++ } for _, v := range nums2 { if m[v] !...

七月 28, 2020 · nobject

Leetcode 26 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 1 2 3 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 1 2 3 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: 1 2 3 4 5 6 7 // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); } 思路:...

七月 27, 2020 · nobject

golang channel

channel是golang中重要的组成部分。也是协程通信间通信的方式 channel常见理论面试题 channel 什么情况下会出现panic 试图往已close的channel继续发送 试图关闭已关闭的channel 试图关闭一个nil的channel 向为nil的channel发送数据会怎样 给定一个 nil channel c: <-c 从 c 接收将永远阻塞 c <- v 发送值到 c 会永远阻塞 channel close后读的问题 关闭后继续读数据,已在缓冲区内的可以读取到数据,而后得到的是零值(对于int,就是0)。 我们可以通过for循环遍历channel,来获取到已经写入的值 1 2 3 for _, v := range channel{ } 对于可能获取到零值,我们可以使用断言判断,ok为false代表channel已关闭后读取的 1 value, ok := <- channel 也可以在close channel之后有意将channel 置为 nil, 如此再使用,并不会读取到零值 对于不带缓冲的ch,和带缓冲的一样,channel close掉之后并不影响读,只影响写入 channel底层源码剖析 go的运行时源码在runtime/chan.go文件下,可以在该文件下查看具体的数据结构,send(channel <-),receive(-> channel),close channel等操作 数据结构 1 2 3 4 5 6 7 8 9 10 11 12 type hchan struct { qcount uint // total data in the queue 代表 chan 中已经接收但还没被取走的元素的个数。内建函数 len 可以返回这个字段的值。 dataqsiz uint // size of the circular queue 循环队列的大小 buf unsafe....

七月 25, 2020 · nobject

linux 常用命令

Tab 键:自动补全命令或文件名; 2. Ctrl + C:强制退出当前进程或程序,中断正在运行的命令; Ctrl + Z:挂起当前进程或程序,将其放到后台执行; Ctrl + D:退出 shell 终端; Ctrl + L:清屏,与 clear 命令相同; Ctrl + A:将光标移动至命令行的开头; Ctrl + E:将光标移动至命令行的结尾; Ctrl + U:删除已输入的命令行,回到光标所在行的开头; Ctrl + K:删除光标所在位置到行末的所有字符; Ctrl + W:删除光标所在位置的前一个单词; Ctrl + R:搜索之前执行过的命令; !!:调出上一次执行的命令。 Ctrl + Y:粘贴最后一次删除的内容 Alt + B:将光标向后移动一个单词 Alt + F:将光标向前移动一个单词 Ctrl + B:将光标向后移动一个字符 Ctrl + F:将光标向前移动一个字符 !command:调出上一次以command为首的命令。

四月 12, 2018 · nobject