🚙

💨 💨 💨

×

  • Categories

  • Archives

  • Tags

  • About

Linux常用运维命令(df和free和top)笔记整理(三)

Posted on 03-11-2015 | In Linux

df

df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

  • -a或–all:包含全部的文件系统;
  • –block-size=<区块大小>:以指定的区块大小来显示区块数目;
  • -h或–human-readable:以可读性较高的方式来显示信息;
  • -H或–si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
  • -i或–inodes:显示inode的信息;
  • -k或–kilobytes:指定区块大小为1024字节;
  • -l或–local:仅显示本地端的文件系统;
  • -m或–megabytes:指定区块大小为1048576字节;
  • –no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
  • -P或–portability:使用POSIX的输出格式;
  • –sync:在取得磁盘使用信息前,先执行sync指令;
  • -t<文件系统类型>或–type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
  • -T或–print-type:显示文件系统的类型;
  • -x<文件系统类型>或–exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
  • –help:显示帮助;
  • –version:显示版本信息

. . .

Linux常用运维命令(netstat和lsof)笔记整理(二)

Posted on 03-09-2015 | In Linux

netstat

netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

  • -a或–all:显示所有连线中的Socket;
  • -A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;
  • -c或–continuous:持续列出网络状态;
  • -C或–cache:显示路由器配置的快取信息;
  • -e或–extend:显示网络其他相关信息;
  • -F或–fib:显示FIB;
  • -g或–groups:显示多重广播功能群组组员名单;
  • -h或–help:在线帮助;
  • -i或–interfaces:显示网络界面信息表单;
  • -l或–listening:显示监控中的服务器的Socket;
  • -M或–masquerade:显示伪装的网络连线;
  • -n或–numeric:直接使用ip地址,而不通过域名服务器;
  • -N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;
  • -o或–timers:显示计时器;
  • -p或–programs:显示正在使用Socket的程序识别码和程序名称;
  • -r或–route:显示Routing Table;
  • -s或–statistice:显示网络工作信息统计表;
  • -t或–tcp:显示TCP传输协议的连线状况;
  • -u或–udp:显示UDP传输协议的连线状况;
  • -v或–verbose:显示指令执行过程;
  • -V或–version:显示版本信息;
  • -w或–raw:显示RAW传输协议的连线状况;
  • -x或–unix:此参数的效果和指定”-A unix”参数相同;
  • –ip或–inet:此参数的效果和指定”-A inet”参数相同。

. . .

Linux常用运维命令(iostat)笔记整理(一)

Posted on 03-07-2015 | In Linux

在linux服务器开发过程中, 经常需要各种命令配合来查看各种状态,所以整理了一些老的笔记来备忘。

iostat

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息

  • -c 仅显示CPU统计信息.与-d选项互斥.
  • -d 仅显示磁盘统计信息.与-c选项互斥.
  • -k 以K为单位显示每秒的磁盘请求数,默认单位块.
  • -t 在输出数据时,打印搜集数据的时间.
  • -V 打印版本号和帮助信息.
  • -x 输出扩展信息.

. . .

python的struct模块

Posted on 03-02-2015 | In Misc

struct, 这玩意c/c++也有, 顾名思义, 能联想到这玩意是啥了

模块的主要作用就是对python基本类型值与

用python字符串格式表示的C struct类型间

的转化(This module performs conversions between Python values and C structs represented as Python strings.)

基本用法

import struct
import binascii
values = (1, 'abc', 2.7)
s = struct.Struct('I3sf')
packed_data = s.pack(*values)
unpacked_data = s.unpack(packed_data)

print 'Original values:', values
print 'Format string :', s.format
print 'Uses :', s.size, 'bytes'
print 'Packed Value :', binascii.hexlify(packed_data)
print 'Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data

输出为:

Original values: (1, 'abc', 2.7) 
Format string : I3sf
Uses : 12 bytes
Packed Value : 0100000061626300cdcc2c40
Unpacked Type : <type 'tuple'> Value: (1, 'abc', 2.700000047683716)

代码中,

首先定义了一个元组数据,

包含int、string、float三种数据类型,

然后定义了struct对象,并制定了format‘I3sf’,

  • I 表示int,

  • 3s表示三个字符长度的字符串,

  • f 表示 float。最后通过struct的pack和unpack进行打包和解包。通过输出结果可以发现,

value被pack之后,

转化为了一段二进制字节串,

而unpack可以把该字节串再转换回一个元组,

但是值得注意的是对于float的精度发生了改变,

这是由一些比如操作系统等客观因素所决定的。打包之后的数据所占用的字节数与C语言中的struct十分相似。定义format可以参照官方api提供的对照表:

字节序设置

另一方面,打包的后的字节顺序默认上是由操作系统的决定的,

当然struct模块也提供了自定义字节顺序的功能,

可以指定大端存储、小端存储等特定的字节顺序,

对于底层通信的字节顺序是十分重要的,

不同的字节顺序和存储方式也会导致字节大小的不同。在format字符串前面加上特定的符号即可以表示不同的字节顺序存储方式,

例如采用小端存储 s = struct.Struct(‘<I3sf’)就可以了。官方api library 也提供了相应的对照列表:

MySQL入门二之一些小注意点

Posted on 03-02-2015 | In DB

distinct关键字

distinct是应用于所有列的, 而不是某一个列

mysql> select * from test_table;
+------+------+
| one | two |
+------+------+
| 56 | 12 |
| 52 | 10 |
| 56 | 12 |
| 56 | 13 |
+------+------+
4 rows in set (0.00 sec)

mysql> select distinct one, two from test_table;
+------+------+
| one | two |
+------+------+
| 56 | 12 |
| 52 | 10 |
| 56 | 13 |
+------+------+
3 rows in set (0.00 sec)

mysql> select distinct one from test_table;
+------+
| one |
+------+
| 56 |
| 52 |
+------+
2 rows in set (0.00 sec)

. . .

MySQL入门一之增删查改与关联

Posted on 02-27-2015 | In DB

增删改查

  • INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….)

  • DELETE FROM 表名称 WHERE 列名称 = 值

  • UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

  • SELECT 列名称 FROM 表名称

关联

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

Join和Key概绍

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看 “Persons” 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

请注意,”Id_P” 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。
接下来请看 “Orders” 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

请注意,”Id_O” 列是 Orders 表中的的主键,同时,”Orders” 表中的 “Id_P” 列用于引用 “Persons” 表中的人,而无需使用他们的确切姓名。
请留意,”Id_P” 列把上面的两个表联系了起来。

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

  • JOIN(INNER JOIN): 如果左右表中都有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

注 : JOIN使用on的, 而不是where.

使用Join(INNER JOIN)

除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

使用Left Join

现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。
您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George - - - -

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

使用Right Join

现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。
您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
34764

RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

使用Full Join

现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George
34764

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 “Persons” 中的行在表 “Orders” 中没有匹配,或者如果 “Orders” 中的行在表 “Persons” 中没有匹配,这些行同样会列出。

ProtoBuf的安装与使用

Posted on 02-23-2015 | In Misc

介绍

与 JSON 相比, Protobuf 的序列化和反序列化的速度更快,而且传输的数据会先压缩,
使得传输的效率更高些 。
Protobuf , 全称 Protocol Buffer , 是 Google 公司内部的混合语言数据标准,是一种轻便
高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。 它很适合做数据
存储或 RPC 数据交换格式 。 Protobuf是可用于通信协议、数据存储等领域的语言无关、平台
无关、可扩展的序列化结构数据格式 。

安装

谷歌的东西要想在大陆安装起来总是有点那啥, 你懂的.

需要的依赖

sudo apt-get install curl

sudo apt-get install autoconf autogen

sudo apt-get install libtool

安装步骤

下载自github的代码需要首先执行 $ ./autogen.sh 生成configure文件

注意autogen.sh 需要gtest包,默认是从 googletest.googlecode.com下载,国内需要翻墙才能访问,很多人问autogen.sh运行失败,这里我补充一下

修改一下autogen.sh , 将这段:

echo "Google Test not present.  Fetching gtest-1.5.0 from the web..."
curl http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2 | tar jx
mv gtest-1.5.0 gtest

修改为:

wget https://github.com/google/googletest/archive/release-1.5.0.tar.gz
tar xzvf release-1.5.0.tar.gz
mv googletest-release-1.5.0 gtest

再执行 autogen.sh,这样就不会报错了

$ ./configure
$ make
$ make check
$ make install

默认是装在

usr/local/bin
usr/local/lib,
usr/local/include 

检查是否安装成功

protoc --version

如果安装成功,会出现版本号 如

libprotoc 2.6.1

如果有问题,会输出错误内容, 最后我安装完成,用上述命令检查版本号时出现如下问题

protoc: error while loading shared libraries: libprotocbuf.so.9: cannot open shared

错误原因

protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib不在ubuntu体系默认的LD_LIBRARY_PATH里,所以就找不到lib

解决办法 :

1 - 在 /etc/ld.so.conf.d/目录下创建文件 bprotobuf.conf文件,文件内容如下

/usr/local/lib

2 - 输入命令

sudo ldconfig

这时,再输入protoc --version就可以正常看到版本号了

使用

Writer.cpp
#include<iostream>
#include<fstream>
#include "Mymessage.pb.h"
using namespace std;
int main(){
Im::Content msg1;
msg1.set_id(101);
msg1.set_str("ggsmd");
fstream output("./log", ios::out | ios::trunc | ios::binary);
if (!msg1.SerializeToOstream(&output)) {
cerr << "Failed to write msg." << endl;
return -1;
}
return 0;
}
Reader.cpp
#include<iostream>
#include<fstream>
#include "Mymessage.pb.h"
using namespace std;
void ListMsg(const Im::Content & msg){
cout << msg.id() << endl;
cout << msg.str() << endl;
}
int main(int argc, char* argv[]){
Im::Content msg1;
fstream input("./log", ios::in | ios::binary);
if (!msg1.ParseFromIstream(&input)) {
cerr << "Failed to parse address book." << endl;
return -1;
}
ListMsg(msg1);
return 0;
}
makefile
INC=/usr/local/include
LIB=/usr/local/lib
lib=protobuf

all:Writer Reader

Writer.o:Writer.cpp
g++ -g -c Writer.cpp -I$(INC) -L$(LIB) -l$(lib)
Reader.o:Reader.cpp
g++ -g -c Reader.cpp -I$(INC) -L$(LIB) -l$(lib)

Writer:Writer.o Mymessage.pb.o
g++ -g -o Writer Writer.o Mymessage.pb.o -I$(INC) -L$(LIB) -l$(lib)
Reader:Reader.o Mymessage.pb.o
g++ -g -o Reader Reader.o Mymessage.pb.o -I$(INC) -L$(LIB) -l$(lib)
Mymessage.pb.o:Mymessage.pb.cc
g++ -g -c Mymessage.pb.cc -I$(INC) -L$(LIB) -l$(lib)

clean:Writer Reader Writer.o Reader.o Mymessage.pb.o
rm Writer Reader Writer.o Reader.o Mymessage.pb.o
Mymessage.proto
package Im; 
message Content
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
}

打印结果

执行
protoc -I=./ --cpp_out=./ Mymessage.proto
命令后,会生成 Mymessage.pb.h 和 Mymessage.pb.cc 文件。 再执行 make 命令,生成
Writer 和 Reader 文件 。 执行 ./Writer 命令后,再执行./Reader 命令,终端上输出:

b@b-VirtualBox:~/tc$ protoc -I=./ --cpp_out=./ Mymessage.proto
b@b-VirtualBox:~/tc$ ll
total 44
drwxrwxr-x 2 b b  4096  5月 19 22:43 ./
drwxr-xr-x 4 b b  4096  5月 19 22:35 ../
-rw-rw-r-- 1 b b   647  5月 19 22:36 makefile
-rw-rw-r-- 1 b b 12214  5月 19 22:43 Mymessage.pb.cc
-rw-rw-r-- 1 b b  7762  5月 19 22:43 Mymessage.pb.h
-rw-rw-r-- 1 b b   161  5月 19 22:36 Mymessage.proto
-rw-rw-r-- 1 b b   421  5月 19 22:36 Reader.cpp
-rw-rw-r-- 1 b b   340  5月 19 22:35 Writer.cpp

b@b-VirtualBox:~/tc$ make
g++ -g -c Writer.cpp -I/home/sharexu/charpter13/1302/include -L/home/sharexu/charpter13/1302/lib -lprotobuf
g++ -g -c Mymessage.pb.cc -I/home/sharexu/charpter13/1302/include -L/home/sharexu/charpter13/1302/lib -lprotobuf    
g++ -g -o Writer Writer.o Mymessage.pb.o -I/home/sharexu/charpter13/1302/include -L/home/sharexu/charpter13/1302/lib -lprotobuf
g++ -g -c Reader.cpp -I/home/sharexu/charpter13/1302/include -L/home/sharexu/charpter13/1302/lib -lprotobuf    
g++ -g -o Reader Reader.o Mymessage.pb.o -I/home/sharexu/charpter13/1302/include -L/home/sharexu/charpter13/1302/lib -lprotobuf

b@b-VirtualBox:~/tc$ ll
total 772
drwxrwxr-x 2 b b   4096  5月 19 22:43 ./
drwxr-xr-x 4 b b   4096  5月 19 22:35 ../
-rw-rw-r-- 1 b b    647  5月 19 22:36 makefile
-rw-rw-r-- 1 b b  12214  5月 19 22:43 Mymessage.pb.cc
-rw-rw-r-- 1 b b   7762  5月 19 22:43 Mymessage.pb.h
-rw-rw-r-- 1 b b 244112  5月 19 22:43 Mymessage.pb.o
-rw-rw-r-- 1 b b    161  5月 19 22:36 Mymessage.proto
-rwxrwxr-x 1 b b 188430  5月 19 22:43 Reader*
-rw-rw-r-- 1 b b    421  5月 19 22:36 Reader.cpp
-rw-rw-r-- 1 b b  57656  5月 19 22:43 Reader.o
-rwxrwxr-x 1 b b 184244  5月 19 22:43 Writer*
-rw-rw-r-- 1 b b    340  5月 19 22:35 Writer.cpp
-rw-rw-r-- 1 b b  59232  5月 19 22:43 Writer.o

b@b-VirtualBox:~/tc$ ./Writer    

b@b-VirtualBox:~/tc$ ./Reader 
101
ggsmd

C++对象模型之虚函数实例讲解

Posted on 02-21-2015 | In Misc

介绍

因为c++只规定了 虚继承/ 虚函数/ 多继承/ 的行为, 但将实现方法留给编译器作者. 所以各个平台的实现并不相同, 得出的结果也不尽相同.

经测试, vs和gcc目前比较统一的情况只有2种 :

  • 无继承+无虚函数
  • 无继承+虚函数

故本文只讨论这2种, 以及了解虚函数和虚继承的含义.

. . .

1…222324252627282930313233343536
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
287 posts
110 tags
about
GitHub Spotify
© 2013 - 2025 Mike