sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
. . .
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
. . .
linux常用文本处理的命令的使用率很高, 所以整理了一些之前的笔记,用markdown来记录备忘。
首先抛出问题, 带着问题来学记忆知识更有动力:
如何通过一条命令取得eth0的IP4地址 :
ifconfig eth0 | grep -w 'inet' | awk '{print $2}' | awk -F: '{print $2}' |
如何通过一条命令替换当前路径下所有文件中的所有“xxx”为“yyy“ :
ls -alF | grep '^-' | awk '{print $NF}' | xargs sed -i 's/xxx/yyy/g' |
如何通过一条命令杀掉占用端口34600的进程 :
sudo lsof -i:34600 | grep -v 'PID' | awk '{print $2}' | xargs kill -9 |
这些命令它们分别具体是什么意思呢?为何能达到上述效果?
. . .
近来要用Unity打包到安卓上玩, 需要安装AndroidSDK.
安装教程基本上按照这篇文章A就可以, 遇到不明白的可以拿这篇B对照着看, 以A为准, 但是有几个点要注意 :
jdk别装太高版本, 装个jdk-8u161的32位的即可, 别装64位, 也别装高版本的jdk10的64位, 不然 android sdk set up tool 不认识, sdk manager 也会闪退
jdk的环境变量很容易设置错, 比如环境变量JAVA_HOME
应该填jdk的安装路径即 : JAVA_HOME=C:/Program Files/Java/jdk1.8.0_11
而不是JAVA_HOME=C:/Program Files/Java
, 填后者的话, sdk manager 会闪退
为了确保不必要的麻烦最好这样环境变量设置成类似如下 :
JAVA_HOME=C:/Program Files/Java/jdk1.8.0_11 |
打安卓包的时候, 如果报file not found debug.keystore
或 Unable to get debug signature key
的错, 用管理员权限重新打开Unity即可.
近来要用Unity打包到安卓上玩, Unity那边需要用到服务器中用C++写的库,
对比了 P/Invoke 和 C++/CLI 两种方式, 都不够省心省力, 决定使用 Swig来撸.
教程基本上按照这篇文章就可以, 文章写得非常详尽,
但文中关于设置 swiglib.i 自定义生成工具的命令行的时候,
他文中的下面一段要注意 :
在常规中选择命令行并且写入:
echo on
$(SolutionDir)/../../thirdpart/swigwin-3.0.12/swig.exe -c++ -csharp -outdir “$(SolutionDir)/../../../UnityProj/UnityCppLearn/Assets/SwigTools/Interface” “%(FullPath)”
echo off
应改成 :
我们在自己填的时候要记得改成自己项目中的路径, 以及把上面这段命令中的中文引号改成英文引号.
索引是帮助mysql获取数据的数据结构。最常见的索引是
不同的引擎对于索引有不同的支持:
Mermory默认的索引是Hash索引。
所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,
排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,
但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点.
Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。
由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。
Hash 索引无法被用来避免数据的排序操作。
由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
Hash 索引不能利用部分索引键查询。
对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
Hash 索引在任何时候都不能避免表扫描。
前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下
Innodb和MyISAM默认的索引是Btree索引;
至于Btree索引,它是以B+树为存储结构实现的。
但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。
在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:
所以我们经常会说MyISAM中数据文件和索引文件是分开的。
因此MyISAM的索引方式也称为非聚集,
至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。
因此当我们根据Btree索引去搜索的时候,若key存在,在data域找到其地址,然后根据地址去表中查找数据记录。
至于Innodb它跟上面又有很大不同,它的叶子节点存储的并不是表的地址,而是数据
我们可以看到这里并没有将地址放入叶子节点,而是直接放入了对应的数据,
这也就是我们平常说到的,Innodb的索引文件就是数据文件,
那么对于Innodb的辅助索引结构跟主索引也相差很多,如图:
我们可以发现,这里叶子节点存储的是主键的信息,
所以我们在利用辅助索引的时候,检索到主键信息,
然后再通过主键去主索引中定位表中的数据,这就可以说明Innodb中主键之所以不宜用过长的字段,由于所有的辅助索引都包含主索引,
所以很容易让辅助索引变得庞大。
我们还可以发现:在Innodb中尽量使用自增的主键,
这样每次增加数据时只需要在后面添加即可,
非单调的主键在插入时会需要维持B+tree特性而进行分裂调整,十分低效。
Btree是按照从左到右的顺序来建立搜索树的。
比如索引是(name,age,sex),
会先检查name字段,如果name字段相同再去检查后两个字段。
所以当传进来的是后两个字段的数据(age,sex),
因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。
所以传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。
利用最左前缀:
Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。
比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a, b, c, d)索引,那么后面的d索引是完全没有用到,当换成了(a, b, d, c)就可以用到。
不能过度索引:
在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。
尽量扩展索引而不要新建索引
最适合的索引的列是出现在where子句中的列或连接子句中指定的列。
不同值较少的列不必要建立索引(性别)。
数据索引的正确是(正确答案A, D)
A、一个表只能有一个聚族索引,多个非聚族索引
B、字符串模糊查询不适合索引
C、哈希 索引有利于查询字段用于大小范围的比较查询
D、多余的索引字段会降低性能
Select A,B from Table1 where A between 60 and 100 order by B
,下面哪些优化sql性能(正确答案B)
A、字段A 建立hash索引,字段 B不建立索引
B、字段 A 建立btree索引,字段 B不建立索引
C、字段A 不建立 索引,字段 B建立btree索引
在gcc编译的时候,记得附加 -lpthread参数, 否则会出现 undefined reference to ‘pthread_create’ 的错误.
(因为在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。)
#include <stdio.h> |
[cnwuwil@centos c-lab]$ ./test
ProcessA: 802 step1
ProcessB: 803 step1
ProcessB: 803 step2
ProcessB: 803 step3
ProcessA: 802 thread 3077555904 step2
ProcessA: 802 thread 3077555904 step3
ProcessA: 802 thread 3077553008 step2
ProcessA: 802 thread 3077553008 step3
follow-fork-mode | detach-on-fork | 说明 |
---|---|---|
parent | on | 只调试主进程(GDB默认) |
child | on | 只调试子进程 |
parent | off | 同时调试两个进程,GDB跟主进程,子进程block在fork位置 |
child | off | 同时调试两个进程,GDB跟子进程,主进程block在fork位置 |
. . .
平时工作学习必须要使用Windows,在SSH远程连接软件里Putty算是用得比较顺手的,而且很小巧。
但是每次输入密码很麻烦,还容易输错,OpenSSH可以利用密钥来自动登陆,如此一来方便了不少。配置过程分为三步:
1、生成公钥和私钥
先要下载一个叫puttygen的软件(下载见附件),在Windows端生成公钥和私钥。
点击Generate开始生成
在生成过程中用鼠标在进度条下面的空白处乱晃几下,产生随机性:
生成完毕,将私钥保存起来:
然后将公钥全选复制。
2、远程主机配置
我这里使用的是CentOS6.4,已经安装了OpenSSH,如果远程主机没有安装的,先要安装。
先连接上远程主机,然后输入命令
mkdir .ssh
chmod 700 .ssh
vim ~/.ssh/authorized_keys
按“i”键进入编辑模式(用过vi/vim的都应该知道吧),然后点鼠标右键将刚才复制的公钥粘贴进去,然后按“Esc”,输入wq<Enter>保存。
安全起见,设置验证文件为只读:
chmod 400 ~/.ssh/authorized_keys
3、Putty端配置
先到Connection-Data项设置自己的登陆用户名,如图(我的是root):
再点SSH项下面的Auth,添加第一步保存的私钥
然后很重要的是要回去Session项里保存!!!不然下次又得重新添加一遍
然后再双击Default Settings里保存的任务,就直接登陆进去了:
是不是很棒~
最后再优化一下显示设置(转过来的):
PuTTY 是一款小巧的开源 Telnet/SSH 客户端,但是它不提供设置的导入导出工具,PuTTY 将设置都保存在注册表中,所以要备份主要就是要备份注册表里的资料。
下面是备份步骤,实质上就是导出相应的注册表键值:
如果你想恢复配置信息,只需要双击保存的这个文件,导入注册表信息即可。
说明:注册表PuTTY下的Sessions中保存设置连接的项目和设定值,SshHostKeys保存设置过的Remote Host Public Key。
很多远程主机当你一段时间没有输入, 他就会把你踢下线, 所以需要 KeepAlive 功能,
如果填写 0 , 就表示不需要 KeepAlive 功能,
填写大于 0 的数, 比如 4, 就意味着每 4 秒就会发送一个空包到远程主机来 KeepAlive .
所以建议填写8秒左右的数.
sudo vi /etc/ssh/sshd_config
取消注释 : #AuthorizedKeysFile .ssh/authorized_keys
禁止密码登录 : 修改yes->no : PasswordAuthentication no
然后重启ssh : sudo service sshd restart
server refused our key 是非常容易遇到的错误
.ssh 以及其父文件夹(root为/root,普通用户为Home目录)都应该设置为只有该用户可写(比如700)。
且 设置 authorized_keys 的权限为 400
chmod 700 .ssh
chmod 400 ~/.ssh/authorized_keys
以下为原因:
ssh服务器的key方式登录对权限要求严格。
同时要求.ssh目录其他用户不可写,一旦其他用户可写(如770), 就无法使用key登录, 表现为:Permission denied (publickey).
密钥文件不能通过SElinux认证,解决方法如下:
# restorecon -R -v /home #root用户为/root
我遇到的就是这种情况,找了好久还找到是这个原因,因为是新装的虚拟机,SElinux还没关闭。
这篇博文详细得说明了原因:http://www.toxingwang.com/linux-unix/linux-basic/846.html
正确配置方法如下:
/etc/ssh/sshd_config
1、找到 #StrictModes yes 改成 StrictModes no (去掉注释后改成 no)
2、找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes (去掉注释)
3、找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys (去掉注释)
4、保存 5、/etc/rc.d/init.d/sshd reload 重新加载