不积小流,无以成江海

海纳百川,有容乃大

对于linux的学习会是一个很漫长、很有趣的过程。对于 Linux 命令的学习、日积月累,推荐 竹子-每日一个linux命令工具参考篇

首先,你要知道哪些命令大概什么功能,能完成什么操作(这个重在积累,如果不知道只能 Google 之了),简单入门推荐 最常用的20条命令。然后,关于命令的具体用法可以 Google 之,也可以使用 --help man 等帮助。

阅读全文 »

Linux 查看系统信息:查看内核版本,查看发行版本。

一、查看内核版本(2种方法):

查看 /proc/version

1
2
3
vimer@debian8light:~$ cat /proc/version 
Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29)
vimer@debian8light:~$
阅读全文 »

2016/4/11 9:33:05 昨天晚上重装了系统,将CentOS 6 换成了Debian 8。以下记录在Debian 上的配置修改、安装用具等操作。

2016/8/1 14:32:28 大概在两个月前,我又重新将 Debian 8 的系统还原回了 Bandwagon 官方推荐的 CentOS 6,因为翻墙是刚需,当时不单单需要 ShadowSocks,还需要 OpenVPN(使用 Google 的 Music Play 上传音乐用,生活在墙内,/(ㄒoㄒ)/~~)。另外,服务器毕竟是入门级配置,实际操作不太流畅。更换 CentOS 6 之后只配了 SS 服务器,再也没折腾过。

为什么换 Debian?

虽然在网上参考了很多,尤其是 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS? - 袁昊洋 的回答,作为服务器第一优选 RHEL/CentOS。我为什么还非得要更换成 Debian 系统呢?其实只是喜欢,也因为是个人的机器,目前除了科学上网就是熟悉系统、练习开发,折腾坏了宕机都是没有影响的,写这篇备忘录也是为了重装系统时更轻松快捷。

阅读全文 »

2016/5/27 13:13:10

gcc 版本:

1
2
3
4
5
6
7
cts@SuSe-CTS2:~> gcc --version
gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
cts@SuSe-CTS2:~> man gcc
...(略)
阅读全文 »

在 Linux 终端下用 Vim 编辑程序时,不能按 Ctrl + S!

对于大多数终端,可以用 Ctrl + S 禁用“回显”,然后用Ctrl + Q 启用“回显”。引用来源

打印了一份《Vim基本操作思维导图.pdf》,放在桌子上,用到的时候随时查看。其中有不足之处,例如,关于替换的操作让我困惑了好几次,后来在网上重新搜索 Vim查找替换及正则表达式的使用 之后,才明白过来 g 参数并非全局,而是整行。

所以,系统性的学习还是很有必要的。参考 Vim命令合集,其中也有瑕疵,多看评论。在实践中慢慢掌握才是王道,再如何花费时间去查阅,随手敲敲命令看看效果都是浪费时间,刻意地进行反复练习,效果有,但是意义呢?

阅读全文 »

2015年12月7日 16:55:34

说说 CString 的几个函数。

  • CString 对象在内存中用一个计数器来维持可用缓冲区的大小。
  • 另外,CString 内,GetLength() 获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个 int 变量内的。
阅读全文 »

MSDN 对这个函数描述。Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdlib.h>

<!-- more -->

int main( void )
{
char tokenstring[] = "15 12 14...";
char s[81];
char c;
int i;
float fp;

// Input various data from tokenstring:
// max 80 character string plus NULL terminator
sscanf_s( tokenstring, "%s", s, _countof(s) );
sscanf_s( tokenstring, "%c", &c, sizeof(char) );
sscanf_s( tokenstring, "%d", &i );
sscanf_s( tokenstring, "%f", &fp );

// Output the data read
printf_s( "String = %s\n", s );
printf_s( "Character = %c\n", c );
printf_s( "Integer: = %d\n", i );
printf_s( "Real: = %f\n", fp );
}

sscanf_s 取值的时候,需要在每个取值后面指定取值的最大大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>

int _tmain()
{
TCHAR str[] = _T("CSFS dfdfd");
TCHAR szBuff[100] = {0};
TCHAR szBuff2[100] = {0};
_stscanf_s(str, _T("%s%s"), szBuff, _countof(szBuff), szBuff2, _countof(szBuff2));
_tprintf(_T("%s\n%s\n"), szBuff, szBuff2);

return 0;
}

2015年10月29日 10:15:57

问题描述

在做 mfc 项目的时候需要获取当前目录,当时直接调用了 GetCurrentDirectory() 使用。当时在 VS2010 中有三个项目,目录结构如下:

TrayOnly项目的目录结构

阅读全文 »

完全没想到安装 mysql 会消耗掉将近一天的时间。从上午十一点,没吃饭没睡觉一直折腾到下午四点半,网上已经有了很详细的安装指导,却依旧卡在某个问题上两三个小时。文中会详细叙述。

我们可以在不同的平台以“不同的姿势”搭建 mysql 环境。

Debian 安装 MySQL

通过 官方指导手册 的章节标题我们就能感受到“姿势”的多种多样了。因为我使用的 Debian8,其官方软件库中 mysql-server-5.5,所以在此贴的链接也是 5.5 版本的。

  • Installing MySQL from Source

如果你有管理员权限,很明显使用 Debian 原生的 apt-get 包管理器进行安装是最方便的。我也是敲入以下命令直接装的:

1
2
apt-get update
apt-get install mysql-client-5.5 mysql-server-5.5

关于 mysql-server 和 mysql-client 的区别:

来一段引用或者 链接

打算使用 windows 上的 Navicat 访问、管理数据库的。但是在虚拟机使用 NAT 模式前提下,windows 主机无法访问安装在 Debian 虚拟机中的 mysql 数据库。从网上查找资料了解到,修改为“Bridge”模式可以让宿主机、虚拟机彼此访问,但是涉及笔记本双网卡、气象局网络环境等,还要了解虚拟机三种网络模式,不想背离初衷(上午十点我只是打算写段访问数据库的 C++11 代码)太远,所以选择放弃!以后碰到了,再回来接续这些技能。

在 Debian8Light 上卸载 mysql-server-5.5,保留了 mysql-client-5.5。

Windows7 安装 MySQL

windows 下是“姿势”多多。既然是在 windos 上安装,就使用最新的 5.7 版本了。

使用 MySQL Installer 安装包安装很简单,需要花费精力的是“尽可能的安装最小集,只安装那些你需要的”。对于这次的使用场景来说,我是练习写 C++ 代码用,而且已经有了 Navicat 工具。所以,我只需要安装 MySQL Server 和开发时所用的 Connector,其他的任何 GUI 工具和 Java、Python 连接器我都不需要。

MySQL 自定义安装

剔除那些根本就不会用到的功能花费了一些时间,除此之外,整个安装过程很顺利,装完之后连接成功直接使用。

在好奇心和心理洁癖的驱使下,我尝试搭建了 解压版 MySQL。就是在这个过程中遇到了意外,花费了两个小时才解决。

解压版本重点在于配置,根据网上的示范(5.5版本、5.6版本)搭建完毕,可是启动服务时老是失败,报错“本地计算机上的mysql服务启动后停止,……”。我当时脑袋也是不清醒,下意识地以为是配置文件的问题,或者是一台电脑安装两个实例带来的冲突。配置文件,我是把安装版的 my.ini 稍作修改直接拿过来用的,担心漏掉了某条配置没有改,造成冲突。可是校对之后仍没能解决问题;然后将安装版本卸载之后,还是出现这个错误,才反应过来直接 Google 这句错误信息。网上搜到的信息不多,但很有效。

这是一个在 5.7.7 版本之后才有的现象,新的版本需要 Initializing the Data Directory。如果英文水平不高,可以直接参考 MySQL 5.7.9 ZIP 免安装版本配置过程

而现在 2016/7/16 18:56:44 ,我要开始码代码了。

配置文件

在 windows 上安装 msi 版本后,查看在其 /Data/ 目录下的 my.ini 配置文件。

整个配置文件分为两部分: Client Section 和 Server Section。强调 mysql 和 mysqld 是不同的两个功能,尤其是用 mysql、mysqladmin等客户端工具连接数据库时(默认)使用 Client Section 区域的 port,mysqld 启动数据库服务时监听 Server Section 区域的 port 指定的端口。仔细阅读配置文件中的注释!

权限管理

很很重要的一部分!但目前没有深入了解的必要,参考 MySQL 数据库赋予用户权限操作表 只学习以下几点:

  • 查看权限:查看自己的权限,查看其他用户的权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    mysql> show grants for dba;
    1141 - There is no such grant defined for user 'dba' on host '%'
    mysql> show grants for dba@localhost;
    +---------------------------------------------------------------------------+
    | Grants for dba@localhost |
    +---------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'dba'@'localhost' |
    | GRANT ALL PRIVILEGES ON `testdb`.* TO 'dba'@'localhost' WITH GRANT OPTION |
    +---------------------------------------------------------------------------+
    2 rows in set

    mysql> show grants for developer;
    1141 - There is no such grant defined for user 'developer' on host '%'
    mysql> show grants for developer@'192.168.195.%';
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Grants for developer@192.168.195.% |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'developer'@'192.168.195.%' |
    | GRANT CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE ON `testdb`.* TO 'developer'@'192.168.195.%' |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------+
    2 rows in set

    mysql> show grants for common_user;
    +-------------------------------------------------------------------------+
    | Grants for common_user@% |
    +-------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'common_user'@'%' |
    | GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'common_user'@'%' |
    +-------------------------------------------------------------------------+
    2 rows in set

    mysql>
  • GRANT语句的主要用途是来给帐户授权的,但也可用来建立新帐户并同时授权。

    创建 testdb 数据库,在其基础上创建 common_user developer dba 用户并授权

    1
    GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'common_user'@'%' IDENTIFIED BY 'common_user';

参考 MySQL之权限管理 了解更多的,记得去官网哦。

jack@’localhost’ 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。

WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。

编写代码

MySQL Connector/C++ Developer Guide

在 C++ 中使用 MySQL 数据库,包含上述方法在内一共有 3 种:

  1. 使用 Connector/C++,库文件命名 (lib)mysqlcppconn.xx
  2. 使用 Connector/ODBC
  3. 使用 Connector/C,库文件命名 libmysql.xx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
文件夹 PATH 列表
卷序列号为 CC94-9350
C:.
├─Connector.C++ 1.1
│ ├─include
│ │ └─cppconn
│ └─lib
│ └─opt
├─Connector.ODBC 5.3
└─MySQL Connector.C 6.1
├─bin
├─include
│ └─mysql
│ └─psi
└─lib
├─vs10
├─vs11
└─vs12

2016年1月12日 18:14:37

本节转自 bool BOOL 和 _Bool辨析

布尔类型

BOOL 类型在头文件 <windef.h> 中定义为 typedef int BOOL;在头文件 <wtypes.h> 中定义为 typedef long BOOL

BOOL 类型,即 int 类型的长度视实际环境来定,一般可认为是 4 个字节。

BOOL 是微软定义的表达布尔逻辑的类型。与 C++ 中的 bool 类型不同是,它是一个三值逻辑:TRUE、FALSE 和 ERROR。当返回值为大于 0 的整数时为 TRUE,返回值为 0 时为 FALSE,返回值为 -1 时为 ERROR。

bool 类型在 C++ 中以关键字的形式被支持,表示布尔类型,其对应变量的值只有真(true)和假(false)两种值。bool 在 C++ 里占用 1 字节。

_Bool 是 C99 标准中定义的一个新关键字,以提供布尔类型。C2008 草案中只规定了 _Bool 类型的大小至少应能够存放 0 和 1 这两个值。而并没有规定具体的大小。这交给编译器自由发挥了。

以上,足够读者区别彼此的使用场景了。

阅读全文 »
0%