🚙

💨 💨 💨

×

  • Categories

  • Archives

  • Tags

  • About

linux常用文本处理命令笔记整理之sed

Posted on 10-23-2015 | In Linux

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

. . .

linux常用文本处理命令笔记整理之grep和awk

Posted on 10-21-2015 | In Linux

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

这些命令它们分别具体是什么意思呢?为何能达到上述效果?

. . .

安装AndroidSDK的一些坑与注意点

Posted on 09-13-2015 | In Misc

近来要用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
    JRE_HOME=C:/Program Files/Java/jre8
    Path=%JAVA_HOME%;C:...
  • 打安卓包的时候, 如果报file not found debug.keystore 或 Unable to get debug signature key的错, 用管理员权限重新打开Unity即可.

Unity中C#调用C++写的DLL之Swig篇

Posted on 09-13-2015 | In Misc

近来要用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

应改成 :

我们在自己填的时候要记得改成自己项目中的路径, 以及把上面这段命令中的中文引号改成英文引号.

hash索引btree索引聚簇索引非聚簇索引

Posted on 09-12-2015 | In DB

索引概要

索引是帮助mysql获取数据的数据结构。最常见的索引是

  • Btree索引
  • Hash索引

不同的引擎对于索引有不同的支持:

  • Innodb和MyISAM默认的索引是Btree索引;
  • Mermory默认的索引是Hash索引。

Hash索引

Mermory默认的索引是Hash索引。

所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,

排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,
但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点.

Hash索引的缺点

  • 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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下

Btree索引

Innodb和MyISAM默认的索引是Btree索引;
至于Btree索引,它是以B+树为存储结构实现的。
但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。

btree索引在MyISAM中的实现

在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:

所以我们经常会说MyISAM中数据文件和索引文件是分开的。
因此MyISAM的索引方式也称为非聚集,
至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。

因此当我们根据Btree索引去搜索的时候,若key存在,在data域找到其地址,然后根据地址去表中查找数据记录。

btree索引在Innodb中的实现

至于Innodb它跟上面又有很大不同,它的叶子节点存储的并不是表的地址,而是数据

我们可以看到这里并没有将地址放入叶子节点,而是直接放入了对应的数据,

这也就是我们平常说到的,Innodb的索引文件就是数据文件,

那么对于Innodb的辅助索引结构跟主索引也相差很多,如图:

我们可以发现,这里叶子节点存储的是主键的信息,

所以我们在利用辅助索引的时候,检索到主键信息,

然后再通过主键去主索引中定位表中的数据,这就可以说明Innodb中主键之所以不宜用过长的字段,由于所有的辅助索引都包含主索引,

所以很容易让辅助索引变得庞大。

我们还可以发现:在Innodb中尽量使用自增的主键,

这样每次增加数据时只需要在后面添加即可,

非单调的主键在插入时会需要维持B+tree特性而进行分裂调整,十分低效。

Btree索引中的最左匹配原则:

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子句中的列或连接子句中指定的列。

  • 不同值较少的列不必要建立索引(性别)。

练习题

  1. 数据索引的正确是(正确答案A, D)

    A、一个表只能有一个聚族索引,多个非聚族索引
    B、字符串模糊查询不适合索引
    C、哈希 索引有利于查询字段用于大小范围的比较查询
    D、多余的索引字段会降低性能

  2. 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索引

GDB多进程多线程调试实战

Posted on 08-31-2015 | In Linux

GDB多进程/多线程调试实战例子

在gcc编译的时候,记得附加 -lpthread参数, 否则会出现 undefined reference to ‘pthread_create’ 的错误.
(因为在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。)

例程

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void processA();
void processB();
void *processAworker(void *arg);

int main(int argc, const char *argv[])
{
int pid;

pid = fork();

if (pid != 0)
processA();
else
processB();

return 0;
}

void processA()
{
pid_t pid = getpid();
char prefix[] = "ProcessA: ";
char tprefix[] = "thread ";
int tstatus;
pthread_t pt;

printf("%s%lu %s\n", prefix, pid, "step1");

tstatus = pthread_create(&pt, NULL, processAworker, NULL);
if (tstatus != 0)
{
printf("ProcessA: Can not create new thread.");
}

processAworker(NULL);
sleep(1);
}

void *processAworker(void *arg)
{
pid_t pid = getpid();
pthread_t tid = pthread_self();
char prefix[] = "ProcessA: ";
char tprefix[] = "thread ";

printf("%s%lu %s%lu %s\n", prefix, pid, tprefix, tid, "step2");
printf("%s%lu %s%lu %s\n", prefix, pid, tprefix, tid, "step3");

return NULL;
}

void processB()
{
pid_t pid = getpid();
char prefix[] = "ProcessB: ";
printf("%s%lu %s\n", prefix, pid, "step1");
printf("%s%lu %s\n", prefix, pid, "step2");
printf("%s%lu %s\n", prefix, pid, "step3");
}

输出

[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

GDB多进程调试命令

  • set follow-fork-mode [parent|child] set detach-on-fork [on|off]
follow-fork-mode detach-on-fork 说明
parent on 只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,GDB跟主进程,子进程block在fork位置
child off 同时调试两个进程,GDB跟子进程,主进程block在fork位置
  • 查询正在调试的进程:info inferiors
  • 切换调试的进程: inferior +inferior number
  • catch fork命令可以捕获进程的创建
  • attach + pid , 可以附到一个正在运行的进程上进行调试

. . .

Putty配置

Posted on 08-23-2015 | In Misc

平时工作学习必须要使用Windows,在SSH远程连接软件里Putty算是用得比较顺手的,而且很小巧。

113555117.png


但是每次输入密码很麻烦,还容易输错,OpenSSH可以利用密钥来自动登陆,如此一来方便了不少。配置过程分为三步:

1、生成公钥和私钥

先要下载一个叫puttygen的软件(下载见附件),在Windows端生成公钥和私钥。

点击Generate开始生成

113555442.png

在生成过程中用鼠标在进度条下面的空白处乱晃几下,产生随机性:

113555424.png

生成完毕,将私钥保存起来:

131658317.png

然后将公钥全选复制。

131248930.png


2、远程主机配置

我这里使用的是CentOS6.4,已经安装了OpenSSH,如果远程主机没有安装的,先要安装。

先连接上远程主机,然后输入命令

mkdir .ssh
chmod 700 .ssh
vim ~/.ssh/authorized_keys

按“i”键进入编辑模式(用过vi/vim的都应该知道吧),然后点鼠标右键将刚才复制的公钥粘贴进去,然后按“Esc”,输入wq<Enter>保存。

131401631.png

安全起见,设置验证文件为只读:


chmod 400 ~/.ssh/authorized_keys


3、Putty端配置


先到Connection-Data项设置自己的登陆用户名,如图(我的是root):

131535572.png


再点SSH项下面的Auth,添加第一步保存的私钥

131534643.png


然后很重要的是要回去Session项里保存!!!不然下次又得重新添加一遍

132022649.png


然后再双击Default Settings里保存的任务,就直接登陆进去了:

wKiom1MP7Wfh2XdgAABhqqyu7f4525.png

是不是很棒~


最后再优化一下显示设置(转过来的):

字体大小设置
Window->Appearance->Font settings—>Change按钮设置(我的设置为12)
字体颜色设置
Window->Colours->Default Foreground->Modify设置(我喜欢绿色设置:R:0 G:255 B:64)
此外在默认的黑色背景下 蓝色看不太清楚,可以把Window->Colours->ANSI Blue 更改一下设置(我设置为R:255 G:0 B:128)
全屏/退出全屏的快捷键设置
Window->Behaviour最下面有个Full screen on Alt-Enter 勾上就可以了。

putty配置导出的方法

PuTTY 是一款小巧的开源 Telnet/SSH 客户端,但是它不提供设置的导入导出工具,PuTTY 将设置都保存在注册表中,所以要备份主要就是要备份注册表里的资料。

下面是备份步骤,实质上就是导出相应的注册表键值:

  1. 开始->运行(Win+R)->regedit
  2. 找到 HKEY_CURRENT_USER\Software\SimonTatham
  3. 在 SimonTatham 这个节点上点击右键,选择导出,保存。

如果你想恢复配置信息,只需要双击保存的这个文件,导入注册表信息即可。

说明:注册表PuTTY下的Sessions中保存设置连接的项目和设定值,SshHostKeys保存设置过的Remote Host Public Key。

KeepAlive

很多远程主机当你一段时间没有输入, 他就会把你踢下线, 所以需要 KeepAlive 功能,

KeepAlive

如果填写 0 , 就表示不需要 KeepAlive 功能,
填写大于 0 的数, 比如 4, 就意味着每 4 秒就会发送一个空包到远程主机来 KeepAlive .
所以建议填写8秒左右的数.

SSH 证书登陆配置

sudo vi /etc/ssh/sshd_config

取消注释 : #AuthorizedKeysFile .ssh/authorized_keys
禁止密码登录 : 修改yes->no : PasswordAuthentication no

然后重启ssh : sudo service sshd restart

Putty server refused our key的三种原因和解决方法

server refused our key 是非常容易遇到的错误

1、.ssh文件夹权限错或authorized_keys权限错

.ssh 以及其父文件夹(root为/root,普通用户为Home目录)都应该设置为只有该用户可写(比如700)。
且 设置 authorized_keys 的权限为 400

chmod 700 .ssh
chmod 400 ~/.ssh/authorized_keys

以下为原因:
ssh服务器的key方式登录对权限要求严格。

  • 对于客户端: 私钥必须为600权限或者更严格权限(400), 一旦其他用户可读, 私钥就不起作用(如640), 表现为系统认为不存在私钥
  • 对于服务器端: 要求必须公钥其他用户不可写, 一旦其他用户可写(如660), 就无法用key登录, 表现为:Permission denied (publickey).

同时要求.ssh目录其他用户不可写,一旦其他用户可写(如770), 就无法使用key登录, 表现为:Permission denied (publickey).

2、SElinux导致

密钥文件不能通过SElinux认证,解决方法如下:

# restorecon -R -v /home #root用户为/root

我遇到的就是这种情况,找了好久还找到是这个原因,因为是新装的虚拟机,SElinux还没关闭。
这篇博文详细得说明了原因:http://www.toxingwang.com/linux-unix/linux-basic/846.html

3、sshd配置不正确

正确配置方法如下:
/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 重新加载

Linux 常用SIG信号及其键值

Posted on 08-04-2015 | In Linux
  • 01 SIGHUP 挂起(hangup)
  • 02 SIGINT 中断,当用户从键盘按^c键或^break键时
  • 03 SIGQUIT 退出,当用户从键盘按quit键时
  • 04 SIGILL 非法指令
  • 05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行
  • 06 SIGIOT IOT指令
  • 07 SIGEMT EMT指令
  • 08 SIGFPE 浮点运算溢出
  • 09 SIGKILL 杀死、终止进程
  • 10 SIGBUS 总线错误
  • 11 SIGSEGV 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置
  • 12 SIGSYS 系统调用中参数错,如系统调用号非法
  • 13 SIGPIPE 向某个非读管道中写入数据
  • 14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号
  • 15 SIGTERM 软件终止(software termination)
  • 16 SIGUSR1 用户自定义信号1
  • 17 SIGUSR2 用户自定义信号2
  • 18 SIGCLD 某个子进程死
  • 19 SIGPWR 电源故障
1…19202122232425262728293031323334353637
Mike

Mike

🚙 🚗 💨 💨 If you want to create a blog like this, just follow my open-source project, "hexo-theme-neo", click the GitHub button below and check it out ^_^ . It is recommended to use Chrome, Safari, or Edge to read this blog since this blog was developed on Edge (Chromium kernel version) and tested on Safari.

11 categories
291 posts
111 tags
about
GitHub Spotify
© 2013 - 2025 Mike