w1100n
This site is best viewed in Google Chrome
wiloon, 9/21/2017 15:43

  TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法。这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagle 算法。禁止Nagle后应用程序向内核递交的每个数据包都会立即发送出去。但是禁止Nagle,网络传输仍然受到TCP确认延迟机制的影响。   CORK意思是塞子,TCP中的CORK意思是将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,一定时间后,内核仍然没有组合成一个MTU时也必须发送现有的数据。然而,TCP_CORK的实现可能并不像你想象的那么完美,CORK并不会将连接完全塞住。内核其实并不知道应用层到底什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,因此内核会给出一个时间限制,在该时间内没有拼接成一个大包(努力接近MTU)的话,内核就会无条件发送。也就是说若应用层程序发送小包数据的间隔不够短时,TCP_CORK就没有一点作用,反而失去了数据的实时性(每个小包数据都会延时一定时间再发送,这个时间超过了内核的时间限制)。   Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。 Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法,由Ford Aerospace And Communications Corporation Congestion Control in IP/TCPinternetworks(IETF RFC 896)(1984)定义,最初是用于缓冲Ford的私有TCP/IP网络拥塞情况,不过被广泛传播开来。 Nagle的文档定义了一种他称之为小封包问题的解决方法。当某个应用程序每次只产生一字节的数据,就会导致网络由于这样的小封包而过载(该情况通 常被称为“发送端SB窗口并发症”),从而产生该问题。一个源自键盘的单一字符-1字节的数据-可能导致一个41字节的封包被传送,该封包包含了1字节的 有用数据和40字节的头部数据。这种4000%过载的情况,在像APRANET这样只有很轻负载的网络中是可以接受的,但在像Ford这样的负载很重的网 络中,可能强制重传,导致封包丢失,并且通过过度拥挤交换节点和网关降低了传播速度。更进一步,当连接被丢弃时,吞吐量可能被降低。 虽然Nagle算法用于解决Ford网络内产生的问题,但同样的问题也出现在APRANet。通过网络,Nagling被广泛实现,包括 internet,并且产生了巨大的效用-虽然某些时候在高交互性环境如一些C/S情况下不希望进行该处理。在这种情况下,可以通过 TCP_NODELAY套接字选项关闭Nagling。 注:Nagle虽然解决了小封包问题,但也导致了较高的不可预测的延迟,同时降低了吞吐量。 TCP_CORK TCP链接的过程中,默认开启Nagle算法,进行小包发送的优化。优化网络传输,兼顾网络延时和网络拥塞。这个时候可以置位TCP_NODELAY关闭Nagle算法,有数据包的话直接发送保证网络时效性。在进行大量数据发送的时候可以置位TCP_CORK关闭Nagle算法保证网络利用性。尽可能的进行数据的组包,以最大mtu传输,如果发送的数据包大小过小则如果在0.6~0.8S范围内都没能组装成一个MTU时,直接发送。如果发送的数据包大小足够间隔在0.45内时,每次组装一个MTU进行发送。如果间隔大于0.4~0.8S则,每过来一个数据包就直接发送。 实测打开 TCP_CORK 选项会使响应出现 1 至 2 秒的延迟。比上面说的要长一些。 TCP_NODELAY 如果发送方持续地发送小批量的数据, 并且接收方不一定会立即发送响应数据, 那么Nagle … Continue reading

wiloon, 9/19/2017 16:21

http://www.cnblogs.com/zsy/p/5812676.html 在c#、java等高级语言中,经常会用到枚举类型来表示状态等。在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手。 1、枚举类型定义 从百度百科查询解释如下:http://baike.baidu.com/link?url=Lrq57-YIZJ35grERvdg2kh7lfGfxvvLCVsNBMAqjBUOQX3CJUYnJp-9oZ2-rf3JGMqL3e4RbnSRQWs_5nmaI6K 枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 枚举可以根据Integer、Long、Short或Byte中的任意一种数据类型来创建一种新型变量。这种变量能设置为已经定义的一组之中的一个,有效地防止用户提供无效值。该变量可使代码更加清晰,因为它可以描述特定的值。 从上面知道:是一组命名的常数,常量值可以是连续的,也可以是断续的。比较正规的理解如下: 在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素。此时,可将这些数据集合定义为枚举类型。因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的集合为: { Sun,Mon,Tue,Wed,Thu,Fri,Sat} 该集合可定义为描述星期的枚举类型,该枚举类型共有七个元素,因而用枚举类型定义的枚举变量只能取集合中的某一元素值。由于枚举类型是导出数据类型,因此,必须先定义枚举类型,然后再用枚举类型定义枚举型变量。 2、枚举类型注意事项 使用枚举类型要从以下方面考虑: 1、枚举概念:查看《1、枚举类型定义》 2、枚举成员:用于声明新的枚举类型。是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。 3、枚举成员默认值:在枚举类型中声明的第一个枚举成员它的默值为零。 4、枚举成员显示赋值:允许多个枚举成员有相同的值。没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1。 5、枚举类型与基础类型的转换 3、GOLANG枚举类型实现 3.1 枚举类型实现 查看2.4,可根据iota特性进行枚举类型的定义: image 测试输出如下: 7_T9%2}S6%SBW187F[]HAOW 枚举类型使用步骤: 声明枚举类型 定义枚举变量 使用枚举变量 注意:从golang枚举类型定义来看,变量enum也可以为99等其他int类型。从这个方面来看,golang定义的枚举类型比较广泛。如下图: image 3.2 iota的优势 从3.1来看golang的枚举类型实现也是比较简单的,利用iota的递增规则进行编程。 iota的使用规则,详情查看《golang 使用 iota》。 3.3 如何使用多个iota 3.1中定义的枚举类型对应的值Success=1、Failed=2、DuplicateEvent=3、DuplicateCommand=4,是按照iota递增规则进行的,加入要试下Success=1、Failed=2、DuplicateEvent=0、DuplicateCommand=1,可行吗?答案是完全行的通的,修订枚举定义格式: … Continue reading

wiloon, 9/11/2017 13:01

http://www.jianshu.com/p/e45cea3e1723 runtime 调度器是个非常有用的东西,关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行 NumCPU:返回当前系统的 CPU 核数量 GOMAXPROCS:设置最大的可同时使用的 CPU 核数 Goexit:退出当前 goroutine(但是defer语句会照常执行) NumGoroutine:返回正在执行和排队的任务总数 GOOS:目标操作系统 NumCPU package main import ( “fmt” “runtime” ) func main() { fmt.Println(“cpus:”, runtime.NumCPU()) fmt.Println(“goroot:”, runtime.GOROOT()) fmt.Println(“archive:”, runtime.GOOS) } 运行结果: GOMAXPROCS Golang 默认所有任务都运行在一个 … Continue reading

wiloon, 9/10/2017 15:31

“`shell git init git add . git commit -m “Initial commit” #访问 GitHub, 创建一个新仓库 git remote add origin https://github.com/superRaytin/alipay-app-ui.git #git push origin master git push -u origin master -f http://leonshi.com/2016/02/01/add-existing-project-to-github/ http://blog.csdn.net/shiren1118/article/details/7761203

wiloon, 9/8/2017 22:49

https://www.linuxserver.io/2017/04/28/how-to-setup-vfio-gpu-passthrough-using-ovmf-and-kvm-on-arch-linux/ https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF https://github.com/IronicBadger/arch-vfio-ovmf https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Plain_QEMU_without_libvirt

wiloon, 9/8/2017 16:28

https://github.com/google/protobuf-gradle-plugin

wiloon, 9/8/2017 10:03

http://tonybai.com/2017/06/08/first-glimpse-of-dep/ https://github.com/golang/dep http://tonybai.com/2017/06/08/first-glimpse-of-dep/

wiloon, 9/7/2017 12:25

https://grpc.io/docs/quickstart/go.html#prerequisites http://www.blogjava.net/killme2008/archive/2010/01/20/310206.html

wiloon, 9/6/2017 10:34

https://my.oschina.net/jackieyeah/blog/524556 https://stackoverflow.com/questions/7875002/setting-debug-configuration-for-mavenjettyeclipse

wiloon, 9/5/2017 13:13

http://favccxx.blog.51cto.com/2890523/1635938 OAuth与SSO、REST有哪些区别与联系 2015-04-20 10:31:10 标签:SSO REST OAuth OAuth2.0 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://favccxx.blog.51cto.com/2890523/1635938 谈到OAuth,很多人自然而然的就会想起SSO,还有些人会想起REST。其实,OAuth与SSO和REST并没有太深的关系,它们分别有其不同的适用场景。接下来,我们就看看它们之间的区别与联系是什么? OAuth与SSO的区别? OAuth是一种授权协议,只是为用户资源的授权提供了一个安全的、开放而又简易的标准。OAuth 2.0为客户端开发者开发Web应用,桌面端应用程序,移动应用及客厅设备提供特定的授权流程。 SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 通俗的讲,OAuth是为解决不同公司的不同产品实现登陆的一种简便授权方案,通常这些授权服务都是由大客户网站提供的,如QQ,新浪微博,人人网等。而使用这些服务的客户可能是大客户网站,也可能是小客户网站。使用OAuth授权的好处是,在为用户提供某些服务时,可减少或避免因用户懒于注册而导致的用户流失问题。 SSO通常处理的是一个公司的不同应用间的访问登陆问题。如企业应用有很多业务子系统,只需登陆一个系统,就可以实现不同子系统间的跳转,而避免了登陆操作。 OAuth与SSO的应用场景不同,虽然可以使用OAuth实现SSO,但并不建议这么做。不过,如果SSO和OAuth结合起来的话,理论上是可以打通各个公司的各个不同应用间的登陆问题,但现实往往是残酷的。 OAuth与REST的关系? 谈到REST的安全性问题时,很多人容易联想到使用OAuth来解决这个难题。其实,REST与OAuth有着天壤之别。 OAuth为网站(系统)用户授权第三方应用(网站、系统)访问自己在网站(系统)中的隐私数据提供的一种规范。 REST初期理念是“每个不同的子资源都有一个绝对唯一且不重复的URI地址”。它仅仅是一个URI资源而已,而且是无状态的,因此REST并不适合做需要授权的应用。恰恰相反的是,在使用OAuth授权时,通常会使用REST API来完成授权操作。

wiloon, 9/2/2017 9:18

https://linux.cn/article-8590-1.html 在本篇中,我们会解释 cron 和 anacron,并向你展示如何在 Linux 中设置 anacron。我们也会比较这两个工具。 要在一个给定时间或者稍后安排一个任务,你可以使用 at 或者 batch 命令,要使命令能够重复运行,你可以使用 cron 以及 anacron 工具。 cron – 是一个用于运行计划任务如系统备份、更新等的守护进程。它适合在那些 24X7 不间断运行的机器如服务器上运行的计划任务。 命令/脚本被写在 cron 任务脚本中,它是在 crontab 文件中被安排的。系统默认的 crontab 文件是 /etc/crontab,但是每个用户也可以创建自己的 crontab 文件来在特定时间运行用户定义的命令。 要创建一份个人 crontab 文件,只要输入: $ crontab -e 如何在 Linux … Continue reading

wiloon, 9/1/2017 13:13

inux文件分割与合并:split & cat Linux下文件分割可以通过split命令来实现,而用cat进行文件合并。而分割可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现,非常简单。 在Linux下用split进行文件分割: 模式一:指定分割后文件行数 对与txt文本文件,可以通过指定分割后文件的行数来进行文件分割。 命令: split -l 300 large_file.txt new_file_prefix 模式二:指定分割后文件大小 对于可执行文件等二进制文件,则不能通过文件行数来进行文件分割,此时我们可以指定分割大小来分隔文件。 命令: split -b 10m large_file.bin new_file_prefix 对二进制文件我们同样也可以按文件大小来分隔。 在Linux下用cat进行文件合并: 命令: cat small_files* > large_file Linx文件分割命令英文释义: -, read standard input. Mandatory arguments to long options are mandatory … Continue reading

wiloon, 9/1/2017 13:12

http://blog.csdn.net/shenlanzifa/article/details/44016537 我们知道lseek()系统调用可以改变文件的偏移量,但如果程序调用使得文件偏移量跨越了文件结尾,然后再执行I/O操作,将会发生什么情况? read()调用将会返回0,表示文件结尾。令人惊讶的是,write()函数可以在文件结尾后的任意位置写入数据。在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。从原来的文件结尾到新写入数据间的这段空间被成为文件空洞。调用write后文件结尾的位置已经发生变化。 在Linux系统之中,文件结束符EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1),至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。 文件空洞占用任何磁盘空间,直到后续某个时点,在文件空洞中写入了数据,文件系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能要比其占用的磁盘存储总量要大(有时大出许多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。这种情况并不常见,但也需要了解。 下面看一个例子:(转自http://blog.csdn.NET/wangxiaoqin00007/article/details/6617801) ls -l file 查看文件逻辑大小 du -c file 查看文件实际占用的存储块多少 od -c file 查看文件存储的内容 空洞文件就是有空洞的文件,在日常的常识中,我们使用的文件存放在硬盘分区上的时候,有多大的内容就会占用多大的空间,比如这个文本文件里面写有1000个asc字符,那么就会占用磁盘上1000B的存储空间,为了便于管理文件,文件系统都是按块大小来分配给文件的,假如这个文件系统一个块是4096的话,那么这个文件就会占用一个块的,无论实际的内容是1B还是4000B.如果我们有一个4MB的文件,那么它会在分区中占用:4MB/4096B=1000个块. 现在我们先做一个实际的无空洞文件来看看: #dd if=/dev/urandom of=testfile1 bs=4096 count=1000 这个命令会从/dev/urandom文件复制1000个块,每块大小4096,到testfile1文件去. 好了,我们已经有了testfile1这么一个4M的文件了,里面填充了一些随机的内容,你可以more一下. 然后用ls -l查看这个文件的大小是4096000,用du -h testfile1来查看的话,文件占用的磁盘大小是4M,两者是一样的. 下来是我们的重点,空洞文件,假如我们有一个文件,它有4M的大小,但是它里边很大一部分都是没有存放数据的,这样可不可以呢?试一下: #dd if=/dev/urandom of=testfile2 bs=4096 seek=999 count=1 这个命令跟前一个命令相似,不同的是,它其实复制了1个块的内容,前面的999个块都跳过了. 我们ls … Continue reading

wiloon, 9/1/2017 13:11

https://linux.cn/article-8024-1.html#3_5958 在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何 Linux 命令行编辑器 去打开这些文件。那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空文件内容的方法。 注意:在我们进一步深入了解这些方法之前,请记住: 由于在 Linux 中一切皆文件,你需要时刻注意,确保你将要清空的文件不是重要的用户文件或者系统文件。清空重要的系统文件或者配置文件可能会引发严重的应用失败或者系统错误。 前面已经说道,下面的这些方法都是从命令行中达到清空文件的目的。 提示:在下面的示例中,我们将使用名为 access.log 的文件来作为示例样本。 通过重定向到 Null 来清空文件内容 清空或者让一个文件成为空白的最简单方式,是像下面那样,通过 shell 重定向 null (不存在的事物)到该文件: > access.log Empty Large File Using Null Redirect in Linux 在 Linux 下使用 Null 重定向来清空大文件 使用 ‘true’ … Continue reading

wiloon, 8/30/2017 22:34

https://www.raspberrypi.org/forums/viewtopic.php?t=81657 apt-get install openvpn easy-rsa dnsmasq

wiloon, 8/30/2017 8:19

http://blog.csdn.net/u011582658/article/details/38045311 1.pwgen pwgen生成的密码易于记忆且相当安全。从技术上来说,容易记忆的密码不会比随机生成的密码更加安全。但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外。使用易于记忆的密码的好处就是你不会把这些密码写下来或者存到电脑上的某个地方,这样做,本来就是不安全的。 安装pwgen,在终端窗口输入: view plain copy sudo apt-get install pwgen 不带任何参数运行pwgen,将会输出满屏幕的密码。你可以从中选择一个作为自己的密码然后清除屏幕。采用这种方式生成密码,即使恰好有人在背后,他也不知道你选择的到底是哪一个。 运行pwgen,在终端输入: view plain copy pwgen 选好密码之后,在终端输入clear清除终端窗口内容。 如果你确定背后没有人,可以使用“-1”来告知pwgen只产生一个密码。 view plain copy pwgen -1 如果想生成一个完全随机的密码,使用“-s”参数。 view plain copy pwgen -1 -s 在密码中使用特殊字符(感叹号,逗号,引号,加号,减号,冒号等)可以提高密码的安全等级。使用“-y”参数使生成的密码中至少包括一个特殊字符。 view plain copy pwgen -1 -s -y 更多有趣的参数: … Continue reading

wiloon, 8/15/2017 12:28

http://blog.csdn.net/gengshenghong/article/details/7027186 参考手册: http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。 更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。 Summary: Intel编译器提供了自动向量化的功能,能对程序进行一些自动的向量化优化。 (1)什么是向量化 所谓的向量化,简单理解,就是使用高级的向量化SIMD指令(如SSE、SSE2等)优化程序,属于数据并行的范畴。 更多理解,参考: http://blog.csdn.net/gengshenghong/article/details/6953942 http://blog.csdn.net/gengshenghong/article/details/7007100 等。 (2)如何对代码进行向量化? 知道了向量化的目标是生成SIMD指令,那么很显然,要对代码进行向量化,第一是依靠编译器来生成这些指令;第二是使用汇编或Intrinsics函数。Intel编译器中,利用其自动向量分析器(auto-vectorizer)对代码进行分析并生成SIMD指令。另外,也会提供一些pragmas等方式使得用户能更好的处理代码来帮助编译器进行向量化。 编译器的自动向量化,简单理解,就是编译器对代码进行一些处理从而生成SIMD指令,一个最常见的可以进行向量化的例子就是for循环,这里简单的理解一下,如下代码片段: #define N 4*10 float a[N], b[N], c[N]; for(int i = 0;i < N; i ++) { a[i] = b[i] + c[i]; } 对于上面的代码,假设float类型是4byte,即32bit。如果使用“传统”的指令,这个for循环至少需要经过40次浮点加法运算。那么,如果使用SSE指令(128bit暂存器),那么一条指令能同事计算4个float,所以,上面的for循环可以只适用10次浮点加法运算就完成了。 说明:这里只是简单说明一下向量化和SSE等指令集之间的关系,关于SIMD、SSE等的细节参考相关内容(比如,SSE指令要求内存对齐等,后面向量化也会涉及到这一点) … Continue reading

next page
辽ICP备14012896