0%

完全没想到安装 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 这两个值。而并没有规定具体的大小。这交给编译器自由发挥了。

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

阅读全文 »

2015年11月17日 17:09:46

有一个很好的链接:Standard C 语言标准函数库速查。不在其中的自然就不是 C 标准库中的函数,不过有一点点瑕疵,这个速查的搜索功能不好用。

  1. 即便是标准库中的函数,在不同平台也是会有差异的(但标准规定的部分应该是相同的)。比如:fflushfopen
  2. 不在标准库中的函数:不同的平台使用了相似(甚至相同)的名字实现了相似的功能,所谓“相似”则必然有不同,其中的区别就是我们编码过程中的陷阱!(极端一点)可以认为只是不同平台不同实现选择了相同的名字而已。比如:snprintfaccess 并不是标准 c 标准或者 c++ 标准中规定的函数。
阅读全文 »

事情源于我想将局域网内服务器上的代码上传到互联网上的远程仓库:repo-133 -> repo-E431 -> repo-remote

  • 代码编写以及编译运行只能在 133 服务器上,此机器无法连接互联网;
  • 133 服务器可以访问我自己的笔记本 E431,毕竟我要通过 xshell 访问 133 进行开发;
  • E431 笔记本可以访问互联网,针对私有代码我一般使用开源中国作为远程仓库。

实现这个打算很容易,问题出在精益求精的摸索过程中。我在 E431 上中转时使用的是 Bitvise SSH Server,搭建方法参考 在 Windows 上搭建 Git 服务器。(我在 E431 上建立的并不是裸仓库)搭建完毕,从 repo-133 向其推送时会失败:git “fatal: no matching remote head”,当时因为有别的工作,通过将 repo-E431 检出一个无用分支规避错误。

阅读全文 »

在之前的笔记中讲过 Git 的分支操作,无论简单还是深奥,那些都是一个仓库内的事情。今天这篇笔记重点描述两个仓库之间的联系,涉及到的 git 命令有 pull、push、clone 等,难点围绕着两个概念: remote-tracking branch 和 tracing branch。

如果接触过 github,或者国内的 OSChina,那么必然用过 git clone 命令。我一般是这么用的:

  1. 先在 github 上创建一个仓库(有时候还会捎带着使用 README.md 文件);
  2. 然后使用 git clone 克隆到本地;
  3. 在本地进行文件添加、修改等操作后 commit;
  4. 在本地执行 push 推送到远程仓库(有时候还会将本地新增的 branch 也 push 上去)。
阅读全文 »

以前整理过一篇笔记 《初始化》,前两天又翻出来浏览了一下,写得很烂。限于当时的水平,并未像现在这样透彻的理解“默认构造函数”、“拷贝构造函数”、“拷贝赋值运算符”等概念,读书《C++ Primer》时看到好多种“初始化”,整理出那一篇可能只是想罗列名字、定义,让自己知道哪个是哪个罢了,却并不深刻理解中间的关联与区别。我们从头再来。

讲 C++ 的初始化,我们有好几种切入的方式:

  • 可以从日常使用的形式,从我们惯用的代码讲起,引出相关的术语;
  • 可以直接讲构造函数,构造函数是本质,初始化是呈现,理解了构造函数,也就理解了初始化;
  • 可以罗列各种初始化的表现形式,然后归纳,总结出结论。

前一篇笔记带有第三种切入方式的味道,罗列了很多“XX初始化”,却没有归纳总结,意义不大。这一篇笔记我想以前两种方式来写。

阅读全文 »

POD 类型是一个神神道道的概念,有点反人类。好在大多时候我们并不需要涉及这个概念,即便在一些场景中用到了,C++11 新增的 3 个与之有关的判断也足够了。

概念

关于这个概念,在 C++11 之前使用了很多的限定来概括出它(貌似源于《imperfect c++》)。C++11 则给出了新的定义。关于其限定,我整理了 维基百科 - pod 得到下图:

POD 类型

这个其实是用思维导图软件 Mindjet 做的,原稿下载。用思维导图来整理 pod 的概念比 markdown 更合适。

阅读全文 »

Markdown 简洁好用是毋庸置疑的。但是在使用中碰到过以下几个困惑:

  1. 第一次想在 wiz 中使用 Markdown 笔记时,查阅 为知笔记 Markdown 新手指南 发现代码的渲染效果挺好,挺喜欢的。可实际上把我在 MarkdownPad2 中写好的笔记拷贝过去时,发现代码的渲染效果和 MarkdownPad2 中一样素净,并没有语法高亮。进而发现两者关于代码的语法定义是有区别的。

  2. 不单单代码,在 为知笔记 Markdown 新手指南 中提到的好些特性我在 MarkdownPad2 中并不能使用:

    如果你是名程序员,那么可以用 ``` 把代码块包起来,渲染后可以关键字高亮

    删除线:在文字前后添加 ~~

    目录

  3. 在手机上购买 jotterpad 之后,发现代码部分的渲染效果和 MarkdownPad2 也不一样,更加的不起眼,导致最开始时我还以为 jotterpad 不识别代码语法呢。

正文

直到今天(2016年6月1号)才发现,Markdown 是存在标准之乱的。从最早的 Markdown诞生(称为传统 Markdown,Markdown Basics等),流行起来之后各种扩展,在 GitHub 上最盛行的 GitHub Flavored Markdown (GFM), 做标准的 CommonMark

其中,做标准让大家欣喜,Markdown 发布标准了(借此理解行末两空格的意义),但也遇到了 极大的困难,理解英文有困难的话可以看 Markdown的标准化之路

应用

关于三款应用:

  1. 为知笔记使用哪种标准?在其官网未找到相关说明。猜测至少是以GFM为蓝本的,甚至就是用的GFM。

  2. MarkdownPad2 可以更改“Markdown 处理器”。默认使用第一个

    Markdown 处理器

  3. jotterpad 的官网提示如下:

    JotterPad renders Markdown (CommonMark) syntax.

语法

关于语法(中文):

  1. 传统 Markdown
  2. GFM 格式说明
  3. CommonMark Spec
  4. * Markdown 书写风格指南
  5. Markdown标准语法与GitHub Flavored Markdown语法大全

选择

关于 CommonMark:虽然不读英文,想来是撕逼过的。

CommonMark,最早的名字叫 Standard Markdown,后来迫于 Markdown 原作者 John Gruber 的压力而改名。

有人觉得“无规矩不成方圆”,没有标准的话未来发展空间有限;也有同志认为正是因为没有标准,才会出现各种扩展,百花齐放。

扩展阅读:

  1. Markdown and CommonMark
  2. 互联网中的左派与右派

其实,操那么多心做什么,作为程序员,哪块用得着拿哪块,用不着的少参与。

争论并不重要,重要的是 选择使用正确的 Markdown Parser

ps 这篇备忘录整理完之后命名为《Markdown 标准之乱》,在半年以后(2016/12/15 16:40:38 )发布时改为现在的名字。内容未做任何修改,我觉得原先的标题是整理的初衷与当时的感慨,但并不切合整理后成稿的内容。况且我现在用 Markdown 基本就是在用 GFM 了,半年前的困扰和选择已然过去了。

其实很简单的:甭管是打包还是压缩,参数一般以 vf 结尾,后跟包名称;打包的情况就是从 c(打包) x(解包) t(查看) 中挑一个;有压缩的话再从 z(gzip) j(bzip2) 中挑一个。Ok, 打完收工。

  1. 如果打包的文件很多很多,造成刷屏,就需要把 v 参数去掉;
  2. 包中追加(r)、更新(u)内容,使用率一般不是很高;

阅读全文 »