nmcli dev wifi 后面可以接tab
之后就可以用nmcli connection up "name" 启动了
- 分个EXT2的分区,FAT32不行,一旦ISO文件大点,FAT32就装不下,ntfs文件系统也不行,linux内核识别不料ntfs。
- 然后把iso文件复制到EXT2分区中,并且把vmlinuz和initrd.img复制出来
- 然后用easyBCD工具创建winGrub,编写配置文件: linux (hd0,3)/vmlinuz repo=hd:/dev/sda4 initrd (hd0,3)/initrd.img
因为centos7使用的文件系统是xfs,而且win下的easybcd识别不到xfs文件系统,所以只能手动安装grub2,用grub2来引导centos7 先从GNU官网下载grub for windows ,grub-install后面接的是设备ID,得用命令wmin来得到设备ID 重启进入GRUB后,手动引导CENTOS7
insmod xfs
set root=(hd0,6)
linux16 /vmlinuz-xxxx root=/dev/mapper/centos-root
initrd16 /initramfs-xxx.img
boot
不用加16也可以
在grub中引导win7,用以下命令 insmod ntfs set root=(hd0,1) chainloader +1 boot
[root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/epel-7.repo 显示源上有没有要找的软件 yum list ntfs*
安装Flash 配置 yum 源 sudo rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm 安装flash sudo yum install flash-plugin
gconftool-2 --recursive-list /desktop/gnome
gconftool-2 --recursive-unset /apps/gnome-terminal
dircolors是一个配置ls命令的命令
eval dircolors 配置文件
/opt 主机额外安装软件所摆放的目录。默认是空的。 一般安装软件的时候,可以自己指定安装到这个目录下,便于查找和管理
ctrl + w 往回删除一个单词,光标放在最末尾 ctrl + u 删除光标以前的字符 ctrl + k 删除光标以后的字符 ctrl + a 移动光标至的字符头 ctrl + e 移动光标至的字符尾 ctrl + l 清屏
iptables -L -n 查看目前开放端口情况 果是新 装的系统,应该只有22端口开放,而且没有/etc/sysconfig/iptables文件 办法如下 1、停止并屏蔽firewalld服务
systemctl stop firewalld systemctl mask firewalld 2、安装iptables-services软件包
yum install iptables-services 3、在引导时启用iptables服务
systemctl enable iptables 4、启动iptables服务
systemctl start iptables 5、保存防火墙规则
service iptables save 或 /usr/libexec/iptables/iptables.init save
之后出现/etc/sysconfig/iptables文件
在 -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 后面追加需要开放端口的代码,比如8089: -A INPUT -p tcp -m state --state NEW -m tcp --dport 8089 -j ACCEPT
保存后重启防火墙:
systemctl restart iptables
i=1; for x in *; do mv $x $i.png; let i=i+1; done
ls|while read i;do sudo mv "$i" $(echo $i|tr -d ' ') 2>/dev/null ; done
. 重复上一次命令 N 重复命令N次 2dd 删除2行 3p 粘贴文本3次 100iprivate 写下"private private ..."100次
:s/from/to/g 替换当前行所有的from为to
:.,$s/from/to/g 对当前行到最后一行的内容进行替换。
:1,.s/from/to/g 对第一行到当前行的内容进行替换。
:%s/from/to/g 针对全局
%s/^ *// 删除所有行首的多余空格
:/\v\<\/?\w+> 先匹配左尖括号 (\<),再匹配可选的正斜杠 (\/?),再匹配一个或多个单词型字符(\w+),最后匹配分隔符 (>),从而匹配到所有html标签。\v 表示使用正则表达式的 very magic 模式.
vim默认下正则是贪婪模式,想要非贪婪,可以把*代替为\{-}
:g//d 由于 :g//d 命令没有指定命令要匹配的目标模式,因此将默认使用上一次用到的搜索目标 /\v\<\/?\w+>。
:v/href/d 可实现只保存包含 URL的所有文本行,v是反向选择
:g/^\s*$/d 删除所有空白行
0 移动到行头,^ 移动到本行第一个非BLANK的字符 $ 移动到行尾,g_ f 移动到下一个为a的字符处,t为字符前。大写FT为反方向 3fa 在当前行查找第三个出现的a dt" 删除直到"字符前的所有内容 dT" 反方向删除知道"字符后的yyyy NG 移动到第N行 gg 移动到第一行 G 移动到最后一行 w 移动到下一个单词开头 e 移动到下一个单词结尾,大写WE视空格分割单词 % 匹配括号移动,包括( { [ < ctrl+O 回到上一次编辑后保存的地方,反则ctrl+I 移动光标和命令连动 0y$ 从行头复制到行为 ye 从当前复制到下一个单词结尾 gUe 从当前大写到下一个单词结尾,u则是小写 v 在可视化里也可以使用移动光标命令选择字符窜
针对字符串 (map (+) ("foo")),光标在第一个o处 vi" → 会选择 foo. va" → 会选择 "foo". v2i) → 会选择 map (+) ("foo") v2a) → 会选择 (map (+) ("foo"))
ctrl+v 进入块级选择模式,可通过hjkl选择,之后I(注意是大写)写入东西,之后按下ESC键,所选择的区域同时生效。 J 选择之后,J把所有选择的行连接起来,行与行之间空格
选择之后,缩进
= 自动缩进
在一个只有一行且这一行只有“1”的文本中,键入如下命令:
qaYpq→ qa 开始录制 Yp 复制行. 增加1. q 停止录制. @a → 在1下面写下 2 @@ → 在2 正面写下3 现在做 100@@ 会创建新的100行,并把数据增加到 103.
:split 创建上下分屏 (:vsplit创建左右分屏)
dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。 _ (或 |) 最大化尺寸 (| 垂直分屏) + (或 -) 增加尺寸i 在当前光标处进行编辑 I 在行首插入 A 在行末插入 a 在光标后插入编辑 o 在当前行后插入一个新行 O 在当前行前插入一个新行 cw 替换从光标所在位置后到一个单词结尾的字符
- 按v,移动光标选中
- d是剪切,y是复制
- p粘贴
从系统ctrl+c的,得安shift+insert
u是撤销
普通模式下输入Shift+zz即可保存退出vim
1 :e ++enc=gb2312 2 :set noreadonly
encoding :Vim 内部编码,例如 buffer、寄存器、文本等。这个值一般用户不要设置,另外打开 Vim 之后再设置这个值也是没有意义的。大家可以将这个值看作是 Vim 程序自己的变量,如果在工作中遇到文件的编码问题,和 encoding 这个变量是万万没有关系的。
fileencoding :顾名思义了,就是文件的编码。
此外还有一个值,叫 fileencodings 是个复数。一般我们将这个值在 vimrc 中设置,Vim 打开一个文件的时候回根据 fileencodings 里面设置的顺序来猜测文件的编码。比如这样设置:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
那么有时候 Vim 猜错了,打开的文件显示乱码怎么办呢?(ps:通常 Vim 打开文件的时候乱码是因为你的 fileencodings 里面没有写某个编码,所以 Vim 没有猜对。例如从上面的设置中删掉 gb18030 ,那么打开这种编码的文件的时候你会发现 fileencoding 的值是 latin1 ,而文件的显示是乱码)
这时候你可能想到设置 fileencoding 的值,但是此时我们的文件已经打开了,你设置后会发现 Vim buffer 的状态变成了 Edited 。而文件依然显示乱码,没有变化。具体的原因后文会详细解释。
正确的做法是 以特定编码重新打开文件 ,例如在 Vim 中使用重新打开命令 :e ++enc=gb2312 ,其中 ++enc 是一个选项,可以指定使用的编码。打开后你会发现 Vim 按照你指定的形式打开了文件,但是文件变成了 readonly 状态,如果要修改,设置 :set noreadonly 就好。
使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来。例如使用以下命令,可以通过F5键将单词用花括号括起来: :map i{ea} 其中:i{将插入字符{,然后使用Esc退回到命令状态;接着用e移到单词结尾,a}增加字符},最后退至命令状态。在执行以上命令之后,光标定位在一个单词上(例如amount),按下F5键,这时字符就会变成{amount}的形式。
vim --version 系统 vimrc 文件: "$VIM/vimrc" 用户 vimrc 文件: "$HOME/.vimrc" 第二用户 vimrc 文件: "~/.vim/vimrc" 这三个配置文件,前面的会覆盖掉后面的,而 ~/.vimrc 和 ~/.vim/vimrc 都是用户配置文件。
*:reg 字符寄存器
对于网卡接受到的帧数据,系统是不会直接输出到一个文件中的,因为安全原因吧,内核1、分配/初始化/注册网络设备; 2、完成PCI设备的I/O区域的分配和映射,以及完成硬件的其它初始化工作 后,只暴露函数API给外界访问
-
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
-
写进vimrc: set nocompatible " be iMproved, required filetype off " required set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim'
call vundle#end() filetype plugin indent on
-
在VIM中运行: :PluginInstall
zr: reduces fold level throughout the buffer
zR: opens all folds
zm: increases fold level throughout the buffer
zM: folds everything all the way
za: open a fold your cursor is on
zA: open a fold your cursor is on recursively
zc: close a fold your cursor is on
zC: close a fold your cursor is on recursively
]] 跳到下一个header
[[ 跳到上一个header
]c 跳到当前header
:MarkdownPreview " 在打开 markdown 文件后,使用该命令可以打开预览窗口 :MarkdownPreviewStop " 关闭 markdown 预览窗口,并停止开启的服务进程
可选配置: markdown-preview.vim
let g:mkdp_auto_start= 1 "打开.md文件时 自动打开预览窗口
1、把配色文件放到.vim/colors下 2、vimrc : syntax enable colorscheme monokai
对颜色不满意可以自己改 背景色:将ctermbg改为256,变为纯黑色
系统自带的配色方案在以下目录 /usr/share/vim/vim74/colors/ blue.vim default.vim desert.vim evening.vim morning.vim pablo.vim README.txt shine.vim torte.vim darkblue.vim delek.vim elflord.vim koehler.vim murphy.vim peachpuff.vim ron.vim slate.vim zellner.vim
跟改配色:colorscheme xxx
目录树图
java 补全
东软 有eclipse http://mirrors.neusoft.edu.cn/
完成中继功能的节点通常称为中继系统
一个设备工作在哪一层,关键看它工作时 利用哪一层的数据头部信息。 网桥工作时,是以MAC头部来决定转发端口的, 因此显然它是数据链路层的设备。
物理层: 网卡,网线,集线器,中继器,调制解调器
数据链路层:网桥,交换机
网络层:路由器
网关工作在第四层传输层及其以上
内核如何从网卡接受数据,传统的经典过程: 1、数据到达网卡; 2、网卡产生一个中断给内核; 3、内核使用I/O指令,从网卡I/O区域中去读取数据;
我们在许多网卡驱动中,都可以在网卡的中断函数中见到这一过程。
但是,这一种方法,有一种重要的问题,就是大流量的数据来到,网卡会产生大量的中断,内核在中断上下文中,会浪费大量的资源来处理中断本身。所以,一个问 题是,“可不可以不使用中断”,这就是轮询技术,所谓NAPI技术,说来也不神秘,就是说,内核屏蔽中断,然后隔一会儿就去问网卡,“你有没有数据 啊?”……
从这个描述本身可以看到,哪果数据量少,轮询同样占用大量的不必要的CPU资源,大家各有所长吧,呵呵……
OK,另一个问题,就是从网卡的I/O区域,包括I/O寄存器或I/O内存中去读取数据,这都要CPU去读,也要占用CPU资源,“CPU从I/O区域 读,然后把它放到内存(这个内存指的是系统本身的物理内存,跟外设的内存不相干,也叫主内存)中”。于是自然地,就想到了DMA技术——让网卡直接从主内 存之间读写它们的I/O数据,CPU,这儿不干你事,自己找乐子去: 1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。 2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡; 3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断; 4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据;
——呵呵,这一个过程比传统的过程少了不少工作,因为设备直接把数据放进了主内存,不需要CPU的干预,效率是不是提高不少?
对应以上4步,来看它的具体实现: 1、分配环形DMA缓冲区 Linux内核中,用skb来描述一个缓存,所谓分配,就是建立一定数量的skb,然后把它们组织成一个双向链表;
2、建立DMA映射 内核通过调用 dma_map_single(struct device *dev,void *buffer,size_t size,enum dma_data_direction direction) 建立映射关系。 struct device *dev,描述一个设备; buffer:把哪个地址映射给设备;也就是某一个skb——要映射全部,当然是做一个双向链表的循环即可; size:缓存大小; direction:映射方向——谁传给谁:一般来说,是“双向”映射,数据在设备和内存之间双向流动;
对于PCI设备而言(网卡一般是PCI的),通过另一个包裹函数pci_map_single,这样,就把buffer交给设备了!设备可以直接从里边读/取数据。
3、这一步由硬件完成;
4、取消映射 dma_unmap_single,对PCI而言,大多调用它的包裹函数pci_unmap_single,不取消的话,缓存控制权还在设备手里,要调用它,把主动权掌握在CPU手里——因为我们已经接收到数据了,应该由CPU把数据交给上层网络栈;
当然,不取消之前,通常要读一些状态位信息,诸如此类,一般是调用 dma_sync_single_for_cpu() 让CPU在取消映射前,就可以访问DMA缓冲区中的内容。
关于DMA映射的更多内容,可以参考《Linux设备驱动程序》“内存映射和DMA”章节相关内容!
OK,有了这些知识,我们就可以来看e100的代码了,它跟上面讲的步骤基本上一样的——绕了这么多圈子,就是想绕到e100上面了,呵呵!
在e100_open函数中,调用e100_up,我们前面分析它时,略过了一个重要的东东,就是环形缓冲区的建立,这一步,是通过 e100_rx_alloc_list函数调用完成的
函数是对象,是function类型,既然是对象就有属性、方法和原型。 函数能创造对象。 函数里面有 this。
typeof Object 输出的也是"function"
function(){ } 上面诗歌匿名函数,执行不了,要匿名函数执行,要像下面那样 (function(){})
function fun(){}
1 fun.string 输出的是 ƒ toString() { [native code] } fun.string() 输出的是 "function fun(){}"
2 fun.name 属性 输出函数名
3 fun.arguments 属性 输出参数数组 引用 arguments[0] 赋值 arguments[0]="aa" arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。
console.log(typeof arguments); // 'undefined'
// arguments 对象只能在函数内使用
function test(a){
console.log(a,Object.prototype.toString.call(arguments));
console.log(arguments[0],arguments[1]);
console.log(typeof arguments[0]);
}
test(1);
/*
1 "[object Arguments]"
1 undefined
number
*/
将arguments转为数组 var args = Array.prototype.slice.call(arguments);
4 apply call this bind apply call bind都是用来改变函数体内this的指向
var func = function(arg1, arg2) {
};
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
//指定this来替换func里的this,然后从头跑完函数
//apply和call的区别是接受参数的形式不一样
//应用
console.log();只能输出一个参数,如果要输出多个参数可以
function log(){
console.log.apply(console, arguments);
};
log(1); //1
log(1,2); //1 2
//如果要给log添加前缀,可以
function log(){
var args = Array.prototype.slice.call(arguments);
args.unshift('(app)');
console.log.apply(console, args);
};
bind
var altwrite = document.write;
altwrite("hello");
这样会报错,因为此时altwrite里边的this指向了window,应该
altwrite.bind(document)("hello")
应用 在常见的单体模式中,通常我们会使用 _this , that , self 等保存 this ,这样我们可以在改变了上下文之后继续引用到它
var foo = {
bar : 1,
eventBind: function(){
var _this = this;
$('.someClass').on('click',function(event) {
/* Act on the event */
console.log(_this.bar); //1
});
}
}
也没有什么问题。当然使用 bind() 可以更加优雅的解决这个问题
var foo = {
bar : 1,
eventBind: function(){
$('.someClass').on('click',function(event) {
/* Act on the event */
console.log(this.bar); //1
}.bind(this));
}
}
apply call bind 的异同
var obj = {
x: 81,
};
var foo = {
getX: function() {
return this.x;
}
}
console.log(foo.getX.bind(obj)()); //81
console.log(foo.getX.call(obj)); //81
console.log(foo.getX.apply(obj)); //81
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的; apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文; apply 、 call 、bind 三者都可以利用后续参数传参; bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
function Test (word) {
console.log (word);
}
Test('哈哈,我是函数');
new Test('哈哈,我是对象');
//将以上的调用方式换种通俗易懂的方式
Test.call("哈哈,我是函数"); //相当于Test();
//相当于new Test();
var obj = {};
obj._proto_ = Test.prototype;
Test.call(obj);
本质的区别就是,两次调用之中的this不同。调用Test('...');的时候,里面的this是顶级对象window,返回值是undefined。调用new Test('...');的时候,它会先new一个对象,置类型为Test,之后把它作为this执行Test函数,最后再把对象返回。
按自己的话来讲,只是上下文不同。 函数既可以作为一个部分存在与世界中(widnow),也可以作为一个世界装下许多部分。
对象是一个地址,指向一片有意义的内存区域。 内存区域中有指令,指令放到cpu中可以执行。
客观世界里,所有静态的物质都是对象,空间坐标就是地址,主体通过地址取得对象的指令放到主体中即可在主体中运行。
typeof运算符可以判断表达式的类型,根据表达式返回七种结果:number,string,boolean,undefined,object,function,symbol
数组返回的是object
正是由于typeof运算符对于任何对象都统一返回object,因此我们无法知道某个对象是否是数组,或者说是对象的一个实例。instanceof运算符用来弥补这一缺点
shell vim : markdown NERDTree javacomplete2 chrome