-
ss服务器的配置指南
租一个服务器自己搭建梯子是科学上网方便稳定快捷的好方法。
本文主要是自己部署vpn服务端的笔记,作为备忘留存下来。安装ss服务程序
安装环境为CentOS7, 需要使用python的包管理工具pip完成对ss-server的安装。
sudo yum install m2crypto python-setuptools sudo easy_install pip sudo pip install shadowsocks
配置ss服务器
配置文件示例 :
这份配置中使用了多个端口作供ss-server使用{ "server":"your-server-ip", "local_address":"127.0.0.1", "local_port":1080, "port_password": { "32366":"shadowsocks", "32367":"shadowsocks", "32368":"shadowsocks", "32369":"shadowsocks", "52369":"shadowsocks" }, "timeout":300, "method":"aes-256-cfb", "fast_open": false }
启动脚本示例 :
直接在命令行直接输入指令也能够完成ss服务的启动和停止,使用脚本只是为了方便一些。#!/bin/bash ss_start() { ssserver -c /root/shadowsocks/shadowsocks.json -d start } ss_stop() { ssserver -c /root/shadowsocks/shadowsocks.json -d stop } # shell script main if [ "$#" -eq "0" ]; then ss_start else case "$1" in start) ss_start exit;; stop) ss_stop exit;; esac fi
增加系统启动项
可以将启动脚本加入系统启动项,这样就能够保证在每次reboot后,服务都能自动开启。 -
常用git操作备忘
对常用指令进行总结,方便以后遇到相同情况时查阅。
-
使用emacs查找替换指定目录所有文件中字符串
本文主要介绍在emacs中对一个目录中的很多文件进行字符串查找和替换操作的方法。参考了 XahLee 的教程后,在此记录做个备份。
操作步骤
进入dired模式 : 我的快捷键配置为
C-x d
, 也可以使用M-x <dired>
.
标记需要查找的文件 : 在进入dired模式后,对需要操作的文件或目录进行操作。-
m
对光标所在的文件或目录进行标记
-
u
对光标所在的文件或目录取消标记
-
U
取消所有标记
可以通过
M-x <dired-mark-files-regexp>
使用正则表达式完成批量文件增加标记。
批量查找 : 使用M-x <dired-do-query-replace-regexp>
进行查找替换。在有grep
的支持时(linux环境下或windows环境中增加了类似cygwin的程序),也可以使用<dired-do-find-regexp-and-replace>
进行文本查找替换。
查找结果 : 在查找结果中使用如下快捷键完成操作-
y
对当前记录执行替换操作
-
n
跳过当前记录
-
C-g
停止本次查找替换操作
-
!
同意本文件中的查找替换操作
-
N
跳过本文件中的查找替换操作
-
Y
同意本次所有的查找替换操作
相关技巧
如果需要批量查找(不进行替换),可以在dired模式中
M-x <dired-do-search>
进行查找,对于查找结果使用M-x tags-loop-continue
进行逐条浏览。 -
-
STL容器的迭代器失效问题
1 引言
常见的STL容器都能使用迭代器访问容器内元素,迭代器相同于一个指向容器内元素的指针,可以通过移动迭代器实现遍历容器。
但是在使用迭代器时需要考虑STL容器的失效问题;迭代器失效主要出现在对容器进行了增删操作之后,迭代器不再指向原本的元素。
这时如果再通过迭代器访问容器就有可能出现异常。2 map容器
内部数据结构 :红黑树
插入操作 :插入操作会申请新的节点空间,然后加入都红黑树中,原来的迭代器指向的内存空间都未改变,故不会出现迭代器失效。
删除操作 :删除操作只会引起被删除节点的迭代器失效。3 vector容器
内部数据结构 :数组(一段连续内存空间)
插入操作 :由于vector使用的是一段有长度限制的连续空间,插入(push_back
/insert
)操作在vector中加入新的元素时需要分情况考虑。- 当vector中元素总数仍不大于capacity,这时插入位置后的元素都被依次移动到下一个位置,所以插入位置之后的迭代器都会失效。
- 当vector中元素总数大于capacity,这个时候会重新开辟更大的内存空间,将原来的vector中的内容复制到新的vector中,回收原先vector的内存空间。由于新的vector的地址已完全改变,所以原先的所有迭代器都会失效。
删除操作 :删除(
pop_back
/erase
)操作在vector中删除元素,删除位置后的元素都被依次复制到前一个位置,所以删除位置之后的迭代器都会失效。
示例代码:4 list容器
内部数据结构 :双向环状链表
插入操作 :插入操作会申请新的节点空间,然后加入到链表中,原来的迭代器指向的内存空间都未改变,故不会出现迭代器失效。
删除操作 :删除操作只会引起被删除节点的迭代器失效。5 小结
在操作STL容器时,对容器增删(
erase
/insert
)之后应该注意接收返回值,这样可以有效避免迭代器失效的产生。
对容器进行遍历删除操作时,另一种语法技巧是在erase
接口中对迭代器进行后自增(it++),这种写法也能够保证遍历正常进行。理解这种写法需要参考运算符重载的相关知识,后自增操作会产生一个临时变量用于函数返回。 - 当vector中元素总数仍不大于capacity,这时插入位置后的元素都被依次移动到下一个位置,所以插入位置之后的迭代器都会失效。
-
关于size_t和size_type的比较
1 引言
编程中常见的表示两种大小的类型标识符有
size_t
和size_type
,这两种类型十分相似,非常容易混淆。本文对他们的使用场景进行了比较,并提供了示例代码。2
size_t
类型当需要描述某个对象的大小(size)时都应该使用
size_t
,其大小被限制为 0 到SIZE_MAX
之间。size_t
的定义在<cstddef>
中,SIZE_MAX
的定义在<climits>
中。size_t
一般会作为sizeof
运算符的返回结果,可以理解为在给定的平台中是统一的。3
size_type
类型在
STL
中定义了size_type
是与Allocator::size_tpye
相对应的。而Allocator
是模板的一个参数。size_type
可以理解为在给定容器范围内是统一的。4 二者之间的比较
这两种类型主要是为了提高代码的可移植性。一般情况来说,这两种类型是没有区别的,因为使用标准库默认的
Allocator
所对应的size_type
就是size_t
。5 示例代码
注意
size_type
在使用时需要加上容器类型限定。std::size_t n1 = sizeof(int); std::vector<int> v; std::vector<int>::size_type n2 = v.size(); std::string s; std::string::size_type n3 = s.size();
-
常见的由于语法不当引起的编译警告
1 引言
本文主要总结了笔者自己的开发中遇到的不规范的代码写法。这些代码风格可能并不会引起错误,但是会产生隐患或容易引起歧义。
这些语法缺陷可以通过合理配置编译器的编译选项检查出来,对于编译器的警告配置在前面有文章进行了简单介绍。 -
在emacs中使用GNU Global的配置指南
1 引言
本文主要针对emacs中的global的配置和使用方法做了简要介绍。global是代码标签化索引工具,能够在许多源码中快速定位函数的实现位置。我主要使用global来辅助代码跳转;还有一种用法是用来辅助代码补全,目前正在研究中。
-
GCC编译时的警告(warn)相关参数
编译阶段警告信息有助于排查代码中错误,合理配置编译警告信息能够提高开发效率。
通过了解编译警告,也能够了解到哪些代码风格是不好的,有哪些代码的书写格式是容易出现问题的,有助于让自己写出更高质量的代码。 -
Linux 系统目录结构
Linux系统的目录结构以及各个目录的作用
/bin
bin是binary的缩写,这个目录存放使用者最经常使用的命令
/boot
这里存放的是启动linux时使用的一些核心文件
/etc
这个目录用来存放系统管理所需要的配置文件和子目录
-
Linux下使用gdb的调试技巧
1 代码编译阶段
在调试C/C++代码时,在编译阶段使用
gcc/g++ -g
命令编译,将调试信息生成在目标文件中。2 开启gdb模式
- 直接进入gdb模式:
gdb
- 使用gdb模式开启一个新的进程:
gdb <appname>
- 使用指定的程序来调试core文件:
gdb <appname> <corename>
- 直接进入gdb模式:
-
终于,博客开通了
1 前言
Samson的博客开通了。
作为码农,一直想要有个博客作为学习与积累的记录。
在尝试过多种主流博客套路之后,终于选定了使用 emacs + org-mode + nikola + github pages 组合的技术方案。