穿透内网访问你的树莓派

前几天入手了一个树莓派3,然而不幸的是家中的网没有公网IP,直接访问肯定是没戏了,这时候突然想到了打洞这个词,我想ssh打洞肯定是可以的。

经过一番搜索,答案找到了,实现非常简单,步骤如下。

1.原料

实现内网穿透,你首先需要一台在公网的vps,哪个国家的都无所谓。

2.VPS配置

vps开启SSHD的GatewayPorts选项,开启方式如下:

vim /etc/ssh/sshd_config
# 找到GatewayPorts选项,将其变为yes

GatewayPorts yes
# 重启sshd服务
service sshd restart

3.树莓派配置

假设VPS的IP为1.1.1.1,远程转发的端口号为11111(端口号最好高于1024,否则需要使用root权限),远程服务器的ssh端口为22,登陆用户为username;
继续假设本地路由器需要转发的端口为22,路由器的在LAN中的IP地址为192.168.1.1。

当我们确认好了各个数字的意义后,就可以开始替换下面的命令了。 (更多…)

Redis主从模式下从库过期的key仍然能够被读到的解决方案

Redis主从模式下,当对一个key设定过期时间,到期之后从库依然能够读取到数据。这个问题困扰了我很久,相信很多人都遇到过这种问题了。(前提是你不去读主库,并且redis版本在3.2以下)。

经过一番搜寻,发现很多人遇到的问题和我一样。

主Redis

setex test 20 1
+OK
get test
$1
1
ttl test
:18

从Redis

get test
$1
1
ttl test
:7

以上都没问题,然而过几秒再看从Redis

ttl test
:-1
get test
$1
1

test这个key已经过期了,然而还是可以获取到test的值。

在使用Redis做锁的时候,如果直接取读从库的值,这就有大问题了。 (更多…)

mongodb 常用命令

最近业务可能会用到mongodb,因此将mongodb的一些特性和常用命令整理一下。

mongodb是一种非关系型数据库中最像关系数据库的,但我用mongodb仍然只把它当做KV存储,其他的关系一概不做,对于关系,还是让MySQL去做吧!关于mongo集群的搭建已经有运维帮我搭建好了,我就直接用了,但是在用之前,了解mongo集群的搭建十分有必要。

关于Mongos,Mongod

Mongos:起着路由的作用,根据分片key找到数据所存放的分片位置

Mongod:数据存放的位置

关于索引

索引在任何数据库都起着至关重要的作用,没有索引的数据只能是一堆杂乱无章的集合,在mongo的集合中,可以创建索引,创建索引的命令是ensureIndex (更多…)

js保存用户自定义的样式重新载入会闪烁的解决方案

在制作一个页面的时候,有需要前台js保存用户自定义的样式的需求,但是保存之后,重新刷新页面,会显示原来的样式,然后再变更为现在的自定义的样式。

这是一个有闪烁的例子,点击打开

保存样式之后,再重新强制刷新几次,可以看到页面在载入的时候会出现闪烁的情况。强迫症患者表示这不能接受,页面这么小的情况都闪烁的这么厉害,这页面大了,加载速度慢了,自定义样式还得等着加载完成之后才能显示,就失去了自定义的意义了。

上面的闪烁是可以理解的,css渲染完成之后,js给body增加了一个class,浏览器又会重新渲染,因此会出现短暂的闪烁

那么在渲染到head的时候,此时再用js给head标签里面增加css呢?这样不就在body出现之前就完成了css的渲染吗?果然,这样的方法是可行的

这是一个没有闪烁的例子,点击打开

至此,问题解决。也许更多的原因我还需要去看看浏览器渲染页面相关的文章。

mysql中的alter操作详解

在使用mysql的客户端之后,手动输入语句的机会减少太多,比如mysql的alter语句竟然想不起来怎么用了,于是重新学习一下。

alter是用来修改表结构的语句。既然是修改,那么可分为增加,修改,删除这几种。大致的操作如下

ALTER TABLE 表名称 操作(ADD|DROP|CHANGE|RENAME) 操作内容

列操作相关

1.增加列

ALTER TABLE table_name ADD new_column_name VARCHAR(255) NOT NULL

2.删除列

ALTER TABLE table_name DROP a_column

3.修改列

ALTER TABLE table_name CHANGE old_column new_column VARCHAR(255) NOT NULL

索引操作相关

alter不仅仅是对表中的列进行操作,还可以对索引进行操作,比如增加、删除、修改索引

4.添加主键索引

ALTER TABLE table_name ADD PRIMARY KEY(column)

5.添加唯一索引

ALTER TABLE table_name ADD UNIQUE(column)

6.添加普通索引

ALTER TABLE table_name ADD INDEX index_name(column)

7.添加全文索引

ALTER TABLE table_name ADD FULLTEXT(column)

8.添加多列索引

ALTER TABLE table_name ADD INDEX(column1,column2,column3)

awk分析nginx日志中的网页响应时间

nginx日志可以十分方便的看到每一个请求的响应速度,通常我会用awk去分析这些请求耗时。通常nginx的log配置是这样的

log_format access_comment '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" $http_x_forwarded_for '
 '$upstream_response_time $request_time';

我们记录的日志类似于这样

127.0.0.1 - - [15/Feb/2017:10:30:19 +0800] "POST /get" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" 111.111.111.111, 10.0.0.0 0.007 0.007

响应时间是最后一个。

awk的工作原理是读出一行数据,然后根据指定的分隔符对行进行分割,放到序号变量里面,默认是按照空格分割,比如$1是127.0.0.1,$2是-…

然而按照空格分割的话,这里有一个不确定的因素,就是http_user_agent,这个里面的空格是不确定的,因此没有一个固定的序号变量来保存响应时间。

不急,awk提供了一个非常好的内置变量NF,NF保存了当前分割出来的字段总数,那么最后一个则是$(NF),这样我们就能得到日志里面的响应时间。

命令如下

$ tail -f /data/logs/nginx/access.log | awk '{print $(NF)}'

实际应用中路径需要你记录nginx日志的路径。

同样我们还可以分析最近请求的平均耗时,使用NR,NR是已经读取的行数

tail -f /data/logs/nginx/access.log | awk 'BEGIN{FS=" ";count=0} {count+=$(NF); print (count/NR),"\t",$(NF)}'

awk的详细用法可以查看:http://imhuchao.com/606.html

安装datastax php-driver for cassandra 的悲惨经历

由于业务可能要使用cassandra,需要安装一个php的扩展,安装过程可谓是曲折

首先直接pecl安装

pecl install cassandra

然而告诉我

checking for supported DataStax C/C++ driver version... gawk: cmd. line:1: fatal: cannot open file `/include/cassandra.h' for reading (No such file or directory)

呵呵呵呵呵呵呵,还得首先安装cpp的driver。

行吧,先安装cpp-driver,按照官网给出的步骤

git clone https://github.com/datastax/cpp-driver.git
mkdir cpp-driver/build
cd cpp-driver/build
cmake ..
make

结果就是缺少libuv啊,缺少cmake啊,其中的过程就比较曲折了,等我都把依赖工具安装完成之后,开心的编译,然而…

/home/huchao/Downloads/cpp-driver/src/timestamp_generator.cpp: In function ‘CassTimestampGen* cass_timestamp_gen_monotonic_new_with_settings(int64_t, int64_t)’:
/home/huchao/Downloads/cpp-driver/src/timestamp_generator.cpp:38: error: declaration of C function ‘CassTimestampGen* cass_timestamp_gen_monotonic_new_with_settings(int64_t, int64_t)’ conflicts with
/home/huchao/Downloads/cpp-driver/include/cassandra.h:9529: error: previous declaration ‘CassTimestampGen* cass_timestamp_gen_monotonic_new_with_settings(cass_int64_t, cass_int64_t)’ here
make[2]: *** [CMakeFiles/cpp-driver.dir/src/timestamp_generator.cpp.o] Error 1
make[1]: *** [CMakeFiles/cpp-driver.dir/all] Error 2

还能说啥

。。。

之后再检查一下环境

官网centos5/6/7都是可以的,本地centos6.5

官网gcc4.1.2+,本地4.4.7,这应该也没问题吧,想着还是和官网一样的环境吧,编译一个gcc4.1.2。

然后另一个痛苦的过程来了,结果又是出错。这个,真没办法了,就上网找找看有没有和我一样的问题,结果真找到了

原文地址:http://blog.csdn.net/firefoxbug/article/details/7519565

原文摘抄如下

源码下载:ftp://ftp.gnu.org/gnu/gcc/gcc-4.1.2/

解包:tar -xvf gcc-4.1.2.tar.bz2

进入目录:cd gcc-4.1.2

 

# ./configure –prefix=/usr/local/gcc-4.1.2&& make
 

接着就出现错误

WARNING: `makeinfo' is missing on your system. You should only need it if
you modified a `.texi' or `.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make' (AIX,
DU, IRIX). You might want to install the `Texinfo' package or
the `GNU make' package. Grab either from any GNU archive site.
make[3]: *** [fastjar.info] 错误 1
make[3]:正在离开目录 `/home/ssm/gcc-obj/fastjar'
make[2]: *** [all] 错误 2
make[2]:正在离开目录 `/home/ssm/gcc-obj/fastjar'
make[1]: *** [all-fastjar] 错误 2
make[1]:正在离开目录 `/home/ssm/gcc-obj'
make: *** [all] 错误 2
这里有一个文章 http://blog.csdn.NET/galois_godel/article/details/6750331

下面是摘要:

(主要原因是GCC的版本过高)

1:全英文的这部分说的是你的系统中缺少相应版本的makeinfo软件。

因为gcc4.1以上的版本需要makeinfo的版本为4.2或更高。
所以输入命令行:
makeinfo –version           想查看makeinfo的版本。结果得到了以下信息:
The program ‘makeinfo’ is currently not installed. You can install it by typing:
yum install texinfo
按照提示输入命令,问题得到解决。

2:本机使用的Texinfo是4.11版本,

出现此错误的原因也在于configure文件中texinfo对该版本不支持,可以在解压gcc4.1.1文件夹中的configure文件里找到

以下语句

# For an installed makeinfo, we require it to be from texinfo 4.2 or
# higher, else we use the “missing” dummy.
if ${MAKEINFO} –version \
| egrep ‘texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|[5-9])’ >/dev/null 2>&1; then
:
else
MAKEINFO=”$MISSING makeinfo”
fi
;;

其中4\.[2-9]|[5-9]表示的是支持4.2-4.9之间的几个版本,所以需要自己添加4\.[1-9][0-9]*,以支持4.11版本。即把’texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|[5-9])’编辑成’texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|4\.[1-9][0-9]*|[5-9])’后保存,编译通过。

安装:make install
这时候先查看gcc版本

#gcc -v

发现还是4.6版本的,于是就卸载4.6版本

#rpm -e gcc-c++
#rpm -e gcc 

然后建立链接

# ln -s /usr/local/gcc-4.1.2/bin/gcc /usr/bin/gcc2
# ln -s /usr/local/gcc-4.1.2/bin/g++ /usr/bin/g++2

 

TCP/IP协议中的backlog分析

TCP/IP协议卷一中是有说明设置backlog这个值的,这值是做什么的呢?

大家都知道TCP建立连接时是要进行三次握手连接的,但是否三次握手完成了,服务端就进行处理了(accept)呢,如果没有处理就变成什么情况,假如没有及时accept的话,后续客户端就连接不上或连接失败。这样就谈不上吞吐量了。想必大家也认为TCP不是那么设计的。

backlog其实是一个连接队列,以下是backlog队列大小公式。
backlog队列总和 = 未完成三次握手队列+已经完成三次握手队列 (更多…)

bash学习笔记(一):变量,函数,控制流程

这是我学习bash的一个笔记。记录一下,或许能够帮助那些踩到坑的同学

变量部分

变量定义

和其他类C语言一样,bash拥有变量,定义:

a="hello" #注意,等号两边不能有空格 比如 a = "hello"这是错误的,这是我踩到的第一个坑

变量使用

变量使用需要在定义的变量名之前加上$

echo $a #将会在屏幕上打印 hello

特殊变量后面再说,现在仅仅是最基础的,能够让自己写出一个完整的脚本就行。

(更多…)