首页
关于
留言
接口
搜索
首页
登录
登录
搜索
KAKA 梦很美
累计撰写
47
篇文章
累计收到
0
条评论
首页
栏目
首页
登录
页面
首页
关于
留言
接口
自定义幻灯片
2019-3-23
Mac Navicate Premium.app 已经损坏, 无法打开
MAC 安装好应用软件后有时会出现 “Navicate Premium” is demaged and cant't be opened.You should move it to the Trash 。意思是 “Navicate Premium” 这个应用已经损坏了,让我扔到垃圾箱里,难道是我没下载完整?其实不然。 解决方案 首先打开终端,执行 sudo bash 这时会提示你输入你的账户密码, 输入完后就切换到了 root 用户,然后执行 xattr -cr /Applications/Navicat\ Premium.app/ 重新打开应用就可以啦。 /Applications/Navicat\ Premium.app/ 是应用安装后的路径 Mac</code> 应用安装后一般都在 <code>/Applications/ 下有 ***.app 文件,也就是应用的入口文件。 Navicat\ Premium.app 是应用名, 假如是其他应用也是这种情况, 解决方案是应用的,修改应用名即可。
2019年-3月-23日
139 阅读
0 评论
操作系统
2019-2-22
网络编程-协议和网络应用程序设计模式
聊聊什么是协议? 从应用程序角度出发,协议可以理解为 “规则”,是数据传输和数据解释的规则。 举个例子, A、B 双方欲传输文件。规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方; 第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK; 第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。 由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。 这种仅在A、B之间被遵守的协议称之为原始协议。当此协议被更多的人采用,不断的增加、改进、维护、完善。最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。最早的FTP协议就是由此衍生而来。 TCP协议注重数据传输。HTTP协议着重于数据解释。 典型协议 TCP传输控制协议 (Transmission Control Protocol) 是一种 面向连接 的、可靠的 、基于 字节流 的传输层通信协议。 UDP用户数据报协议 (User Datagram Protocol) 是OSI参考模型中一种 无连接 传输层协议,提供 面向事务 、简单、不可靠信息 传送服务。 HTTP超文本传输协议 (Hyper Text Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。 FTP文件传输协议 (File Transfer Protocol) IP协议 是 因特网互联协议(Internet Protocol) ICMP协议 是 Internet控制报文协议(Internet Control Message Protocol) 它是 TCP/IP协议 族的一个 子协议 ,用于在 IP主机、路由器之间传递控制消息。 IGMP协议 是 Internet 组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在 主机 和 组播路由器 之间。 ARP协议 是 正向地址解析协议(Address Resolution Protocol),通过已知的IP,寻找对应主机的MAC地址。 RARP 是 反向地址转换协议,通过 MAC地址 确定 IP地址。 网络应用程序设计模式 C/S 模式 客户机 client / 服务器 server (需要在通讯两端各自部署客户机和服务器来完成数据通信。) 优点 : 协议选用灵活 (自定义协议, 协议由服务端和客户端商定即可) 缓存数据 (数据可缓存到本地, 如App应用 可缓存到手机) 缺点 : 对用户安全构成威胁 (需要将客户端安插到用户主机上) 开发工作量大, 调试困难 (需要客户端和服务端的开发人员, 且调试时候也是如此) B/S 模式 浏览器 browser / 服务器 server (只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输) 优点 : 开发工作量小, 调试方便 (只需开发服务器端即可, 且调试时候只需要PC端浏览器即可) 跨平台 (采用浏览器显示数据, 所以不受平台限制) 缺点 : 使用第三方浏览器, 网络应用受限制 缓存数据不尽人意 (由于客户端没有放到对方主机上, 从而传输数据量受到限制) 采用标准HTTP协议进行通信 (必须与浏览器一样, 协议选择不灵活)
2019年-2月-22日
155 阅读
0 评论
基础原理
2019-1-29
Linux 安装 oh my zsh
oh my zsh 是个美观你系统的 shell 界面工具。系统自带的看着难受,特别是用 git 时候,文件变动都是同一种颜色... 1.安装 zsh 包 yum -y install zsh 2.切换默认 shell 为 zsh chsh -s /bin/zsh 3.重启服务器让修改的配置生效 4.安装 oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 或 sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" 5.查看 oh my zsh 主题 ls ~/.oh-my-zsh/themes 查看 oh my zsh 主题效果图 6.修改 oh my zsh 主题 vim ~/.zshrc 可以看到默认的主题是 ZSH_THEME="robbyrussell" 改成自己喜欢的即可。 工具非常好用,还有强大的命令补全哦!
2019年-1月-29日
145 阅读
0 评论
操作系统
2019-1-19
Linux 配置多个 SSH-Key
为了安全性,个人的 GitHub 和公司的 GitLab 需要配置不同的 SSH-Key。 1.切换到系统的 ssh 目录 cd ~/.ssh 2.为个人的 GitHub 生成 SSH-Key(若还没有) ssh-keygen -t rsa -C "your_mail@example.com" -f github_rsa 然后,前往 GitHub 添加 SSH公钥。 3.为公司的 GitLab 生成 SSH-Key(若还没有) ssh-keygen -t rsa -C "your_mail@company.com" -f company_rsa 然后,前往 GitLab 添加 SSH公钥。 4.添加配置文件(若还没有) touch config 5.为配置文件 config 添加如下内容 # github.com Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/github_rsa # gitlab.company.com Host gitlab.company.com HostName gitlab.company.com PreferredAuthentications publickey IdentityFile ~/.ssh/company_rsa 6.测试 ssh -T git@github.com 输出 : Hi YK-Unit! You've successfully authenticated, but GitHub does not provide shell access. 以上表示成功连接到了个人的 GitHub。 然后可以用同样方式测试公司的 GitLab。
2019年-1月-19日
144 阅读
0 评论
操作系统
2018-6-22
Mac 命令行解压 RAR文件
Mac 中命令行解压 RAR 文件相对比较简单,防止忘记,以此记录。 安装 brew install unrar 解压 unrar x 我是解压文件.rar
2018年-6月-22日
134 阅读
0 评论
操作系统
2018-5-27
深入理解串行、并行、并发的区别
理解并发、并行的例子 先举例子来理解这2个概念的区别。 老师让两个同学去办公室谈话。如果这两同学(进程)是并列跨过办公室门(CPU)的,那么就是并行。如果同学A先进同学B后进入(或者先B后A),或者两人并列同时进入,但是在办公室外的路人甲(用户)看来,同学A和同学B同时都在办公室内,这是并发。 其实这个例子不合理,因为真正的并行是多核CPU下的概念,但上面这个简单的例子非常有助于理解。 如果举例要精确一点,那么大概是这样的:进办公室有两个门(两CPU),如果两同学分别从不同的门进入,不管先后性,两者互相独立,那么是并行;如果两同学不管以什么方式进入,在路人甲看来,他两同时都在办公室内,就是并发。 我不信到现在还不理解并发和并行。 并发和并行的理论性解释 为什么操作系统上可以同时运行多个程序而用户感觉不出来? 这是因为无论是单CPU还是多CPU,操作系统都营造出了可以同时运行多个程序的 假象。实际的过程操作系统对进程的调度以及CPU的快速上下文切换实现的:每个进程执行一会就先停下来,然后CPU切换到下个被操作系统调度到的进程上使之运行。因为切换的很快,使得用户认为操作系统一直在服务自己的程序。 再来解释并发就容易理解多了。 并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象。并发描述的是多进程同时运行的现象。但实际上,对于单核心CPU来说,同一时刻只能运行一个进程。所以,这里的"同时运行"表示的不是真的同一时刻有多个进程运行的现象,这是并行的概念,而是提供一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占CPU的,而是执行一会停一会。 所以,并发和并行的区别就很明显了。它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。 实际上,当程序中写下多进程或多线程代码时,这意味着的是并发而不是并行。并发是因为多进程/多线程都是需要去完成的任务,不并行是因为并行与否由操作系统的调度器决定,可能会让多个进程/线程被调度到同一个CPU核心上。只不过调度算法会尽量让不同进程/线程使用不同的CPU核心,所以在实际使用中几乎总是会并行,但却不能以100%的角度去保证会并行。也就是说,并行与否程序员无法控制,只能让操作系统决定。 再次注明,并发是一种现象,之所以能有这种现象的存在,和CPU的多少无关,而是和进程调度以及上下文切换有关的。 理解了概念,再来深入扩展下。 串行、并行和并发 任务描述 任务是将左边的一堆柴全部搬到右边烧掉,每个任务包括三个过程:取柴,运柴,放柴烧火。 这三个过程分别对应一个函数: func get { geting } func carry { carrying } func unload { unloading } 串行模式 串行表示所有任务都一一按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这整个三个步骤,才能进行下一个步骤。 和稍后所解释的并行相对比,串行是一次只能取得一个任务,并执行这个任务。 假设这堆柴需要运送4次才能运完,那么当写下的代码类似于下面这种时,那么就是串行非并发的模式: for (i = 0; i < 4; i++) { get() carry() unload() } 或者,将三个过程的代码全部集中到一个函数中也是如此: func task { geting carrying unloading } for (i = 0; i < 4; i++) { task() } 这两种都是串行的代码模式。画图描述: 并行模式 并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。 正如前面所举的两同学进办公室的例子,串行的方式下,必须1个同学进入后第二个同学才进入,队列长度为2,而并行方式下可以同时进入,队列长度减半了。 并行的效率从代码层次上强依赖于多进程/多线程代码,从硬件角度上则依赖于多核CPU。 对于单进程/单线程,由于只有一个进程/线程在执行,所以尽管同时执行所取得的多个任务,但实际上这个进程/线程是不断的在多任务之间切换,一会执行一下这个,一会执行一下那个,就像是一个人在不同地方之间来回奔波。所以,单进程/线程的并行,效率比串行更低。 对于多进程/多线程,各进程/线程都可以执行各自所取得的任务,这是真正的并行。 但是,还需要考虑硬件层次上CPU核心数,如果只有单核CPU,那么在硬件角度上这单核CPU一次也只能执行一个任务,上面多进程/多线程的并行也并非真正意义上的并行。只有多核CPU,并且多进程/多线程并行,才是真正意义上的并行。 如下图,是多进程/多线程(2个工作者)的并行: 并发模式 并发表示多个任务同时都要执行的现象,更详细的概念前面已经说面的够具体了。 其实,很多场景下都会使用并发的概念。比如同时500个http请求涌向了web服务器,比如有时候说并发数是1000等。 有时候也将并发当成任务,比如500并发数意味着500个任务,表示的是在一个特定的时间段内(约定俗成的大家认为是1秒)可以完成500个任务。这500个任务可以是单进程/单线程方式处理的,这时表示的是并发不并行的模式(coroutine就是典型的并发不并行),即先执行完一个任务后才执行另一个任务,也可以是多进程/多线程方式处理的,这时表示的是并发且并行模式。 要解决大并发问题,通常是将大任务分解成多个小任务。很典型的一个例子是处理客户端的请求任务,这个大任务里面包含了监听并建立客户端的连接、处理客户端的请求、响应客户端。但基本上所有这类程序,都将这3部分任务分开了:在执行任何一个小任务的时候,都可以通过一些手段使得可以执行其它小任务,比如在处理请求的时候,可以继续保持监听状态。 由于操作系统对进程的调度是随机的,所以切分成多个小任务后,可能会从任一小任务处执行。这可能会出现一些现象: 可能出现一个小任务执行了多次,还没开始下个任务的情况。这时一般会采用队列或类似的数据结构来存放各个小任务的成果。比如负责监听的进程已经执行了多次,建立了多个连接,但是还没有调度到处理请求的进程去处理任何一个请求。 可能出现还没准备好第一步就执行第二步的可能。这时,一般采用多路复用或异步的方式,比如只有准备好产生了事件通知才执行某个任务。比如还没有和任何一个客户端建立连接时,就去执行了处理请求的进程。 可以多进程/多线程的方式并行执行这些小任务。也可以单进程/单线程执行这些小任务,这时很可能要配合多路复用才能达到较高的效率 看图非常容易理解: 上图中将一个任务中的三个步骤取柴、运柴、卸柴划分成了独立的小任务,有取柴的老鼠,有运柴的老鼠,有卸柴烧火的老鼠。 如果上图中所有的老鼠都是同一只,那么是串行并发的,如果是不同的多只老鼠,那么是并行并发的。 总 结 串行: 一次只能取得一个任务并执行这一个任务 并行: 可以同时通过多进程/多线程的方式取得多个任务,并以多进程或多线程的方式同时执行这些任务 注意点: 如果是单进程/单线程的并行,那么效率比串行更差 如果只有单核cpu,多进程并行并没有提高效率 从任务队列上看,由于同时从队列中取得多个任务并执行,相当于将一个长任务队列变成了短队列 并发: 是一种现象, 同时运行多个程序或多个任务需要被处理的现象。这些任务可能是并行执行的,也可能是串行执行的,和CPU核心数无关,是 操作系统进程调度和CPU上下文切换达到的结果。 解决大并发的一个思路是将大任务分解成多个小任务: 可能要使用一些数据结构来避免切分成多个小任务带来的问题 可以多进程/多线程并行的方式去执行这些小任务达到高效率 或者以单进程/单线程配合多路复用执行这些小任务来达到高效率
2018年-5月-27日
148 阅读
0 评论
基础原理
2018-2-17
带你理解二、八、十、十六进制转换之图解篇
所谓 进制转换, 就是将一种进制的数字转换为另一种进制的数字。数字的表示形式虽然改变了,但是数字的值并没有变。 下面我带大家理解它们各自之间的转换, 我们先看看关系结构图 根据图文我们可以知道有如下转换方式, 接下来将重点讲解它们是如何转换的。 二、八、十六进制 可转换为 十进制 十进制 可转换为 二、八、十六进制 二进制 可转换为 八、十六进制 八进制 可转换为 十六进制 进制转换算法(Convert) 在数字后面加上不同的字母来表示不同的进位制, 例如:(101011)B=(53)O=(43)D=(2B)H 。 B(Binary)表示二进制 O(Octal)表示八进制 D(Decimal)或不加表示十进制 H(Hexadecimal)表示十六进制 (一) 二、八、十六进制 转换为 十进制 二进制 转换为 十进制 二进制数从低位到高位(即从右往左)计算, 第0位的权值是2的0次方, 第1位的权值是2的1次方, 第2位的权值是2的2次方, 依次递增下去, 把最后的结果相加的值就是十进制的值了。 例如 将二进制的(101011)B转换为十进制 的步骤如下: 第0位 1 x 2^0 = 1 第1位 1 x 2^1 = 2 第2位 0 x 2^2 = 0 第3位 1 x 2^3 = 8 第4位 0 x 2^4 = 0 第5位 1 x 2^5 = 32 然后把结果值相加, 1+2+0+8+0+32=43, 即(101011)B=(43)D 八进制 转换为 十进制 八进制数从低位到高位(即从右往左)计算, 第0位的权值是8的0次方, 第1位的权值是8的1次方, 第2位的权值是8的2次方, 依次递增下去, 把最后的结果相加的值就是十进制的值了。 八进制就是逢8进1, 八进制数采用 0~7这八数来表达一个数。 例如 将八进制的(53)O转换为十进制 的步骤如下: 第0位 3 x 8^0 = 3 第1位 5 x 8^1 = 40 然后把结果值相加, 3+40=43, 即(53)O=(43)D 十六进制 转换为 十进制 十六进制数从低位到高位(即从右往左)计算, 第0位的权值是16的0次方, 第1位的权值是16的1次方, 第2位的权值是16的2次方, 依次递增下去, 把最后的结果相加的值就是十进制的值了。 十六进制就是逢16进1,十六进制的16个数为0123456789ABCDEF。 例如 将十六进制的(2B)H转换为十进制 的步骤如下: 第0位 B x 16^0 = 11 第1位 2 x 16^1 = 32 然后把结果值相加, 11+32=43,即(2B)H=(43)D (二) 十进制 转换为 二、八、十六进制 十进制 转换为 二进制 除2取余法, 即每次将整数部分除以2, 余数为该位权上的数, 而商继续除以2, 余数又为上一个位权上的数, 这个步骤一直持续下去, 直到商为0为止, 最后读数时候, 从最后一个余数读起, 一直到最前面的一个余数。 例如 将十进制的(43)D转换为二进制 的步骤如下: 将商43除以2, 商21余数为1 将商21除以2, 商10余数为1 将商10除以2, 商5余数为0 将商5除以2, 商2余数为1 将商2除以2, 商1余数为0 将商1除以2, 商0余数为1 读数, 因为最后一位是经过多次除以2才得到的, 因此它是最高位, 读数字从最后的余数向前读, 101011, 即(43)D=(101011)B 十进制 转换为 八进制 (方法一) 除8取余法, 即每次将整数部分除以8, 余数为该位权上的数, 而商继续除以8, 余数又为上一个位权上的数, 这个步骤一直持续下去, 直到商为0为止, 最后读数时候, 从最后一个余数起, 一直到最前面的一个余数。 例如 将十进制的(796)D转换为八进制 的步骤如下: 将商796除以8, 商99余数为4 将商99除以8, 商12余数为3 将商12除以8, 商1余数为4 将商1除以8, 商0余数为1 读数, 因为最后一位是经过多次除以8才得到的, 因此它是最高位, 读数字从最后的余数向前读, 1434, 即(796)D=(1434)O (方法二) 使用间接法, 先将十进制转换成二进制,然后将二进制又转换成八进制。 十进制 转换为 十六进制 (方法一) 除16取余法, 即每次将整数部分除以16, 余数为该位权上的数, 而商继续除以16, 余数又为上一个位权上的数, 这个步骤一直持续下去, 直到商为0为止, 最后读数时候, 从最后一个余数起, 一直到最前面的一个余数。 例如 将十进制的(796)D转换为十六进制 的步骤如下: 将商796除以16, 商49余数为12, 对应十六进制的C 将商49除以16, 商3余数为1 将商3除以16, 商0余数为3 读数, 因为最后一位是经过多次除以16才得到的, 因此它是最高位, 读数字从最后的余数向前读, 31C, 即(796)D=(31C)H (方法二) 使用间接法,先将十进制转换成二进制,然后将二进制又转换成十六进制。 (三) 二进制 转换为 八、十六进制 二进制 转换为 八进制 取三合一法, 即从二进制的小数点为分界点, 向左(向右)每三位取成一位, 接着将这三位二进制按权相加, 然后按顺序进行排列, 小数点的位置不变, 得到的数字就是我们所求的八进制数。如果向左(向右)取三位后, 取到最高(最低)位时候, 如果无法凑足三位, 可以在小数点最左边(最右边), 即整数的最高位(最低位)添0, 凑足三位。 例如 将二进制的(11010111.0100111)B转换为八进制 的步骤如下: 小数点前111 = 7 010 = 2 11补全为011, 011 = 3 小数点后010 = 2 011 = 3 1补全为100, 100 = 4 读数, 读数从高位到低位, 即(11010111.0100111)B=(327.234)O 二进制与八进制编码对应表: 二进制 八进制 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 八进制 转换为 二进制 取一分三法, 即将一位八进制数分解成三位二进制数, 用三位二进制按权相加去凑这位八进制数, 小数点位置照旧。 例如 将八进制的(327)O转换为二进制 的步骤如下: 3 = 011 2 = 010 7 = 111 读数, 读数从高位到低位, 011010111, 即(327)O=(11010111)B 二进制 转换为 十六进制 取四合一法, 即从二进制的小数点为分界点, 向左(向右)每四位取成一位, 接着将这四位二进制按权相加, 然后按顺序进行排列, 小数点的位置不变, 得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后, 取到最高(最低)位时候, 如果无法凑足四位, 可以在小数点最左边(最右边), 即整数的最高位(最低位)添0, 凑足四位。 例如 将二进制的(11010111)B转换为十六进制 的步骤如下: 0111 = 7 1101 = D 读数, 读数从高位到低位, 即(11010111)B=(D7)H 十六进制 转换为 二进制 取一分四, 即将一位十六进制数分解成四位二进制数, 用四位二进制按权相加去凑这位十六进制数, 小数点位置照旧。 例如 将十六进制的(D7)H转换为二进制 的步骤如下: D = 1101 7 = 0111 读数, 读数从高位到低位, 即(D7)H=(11010111)B (四) 八进制 转换为 十六进制 八进制 转换为 十六进制 将八进制转换为二进制, 然后再将二进制转换为十六进制, 小数点位置不变。 例如 将八进制的(327)O转换为十六进制 的步骤如下: 3 = 011 2 = 010 7 = 111 0111 = 7 1101 = D 读数, 读数从高位到低位, D7, 即(327)O=(D7)H 十六进制 转换为 八进制 将十六进制转换为二进制, 然后再将二进制转换为八进制, 小数点位置不变。 例如 将十六进制的(D7)H转换为八进制 的步骤如下: 7 = 0111 D = 1101 0111 = 7 010 = 2 011 = 3 读数, 读数从高位到低位, 327, 即(D7)H=(327)O 扩展阅读 一. 包含小数的进制换算: (ABC.8C)H=10x16^2+11x16^1+12x16^0+8x16^-1+12x16^-2 =2560+176+12+0.5+0.046875 =(2748.546875)D 二. 负次幂的计算: 2^-5=2^(0-5)=2^0/2^5=1/2^5 同底数幂相除, 底数不变; 指数相减, 相反 三. 我们需要了解一个数学关系, 即23=8,24=16, 而八进制和十六进制是用这关系衍生而来的, 即用三位二进制表示一位八进制, 用四位二进制表示一位十六进制数。接着, 记住4个数字8、4、2、1(23=8、22=4、21=2、20=1) 参考文献(References) 二进制、八进制、十进制、十六进制之间转换 二进制如何转换成八进制
2018年-2月-17日
231 阅读
0 评论
操作系统
3
4
5