Flyertutor


  • 首页

  • 归档

  • 分类

  • 标签

C 笔记一

发表于 2017-01-02 | 分类于 C

define

define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。
所谓预处理是指在进行编译之前所作的工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

不带参数的宏:

1
2
3
#define LENGTH 10

int arr[LENGTH] = {0}; // 表示定义了一个长度为 10 的整形数组

在预处理阶段,会把 LENGTH 替换成 10,所以 10 后面不能有 ;。

带参数的宏:
C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#define MAX(a, b) (a > b ? a : b)

int main()
{
int x, y, max;
printf("input two numbers: ");
scanf("%d%d", &x, &y);
max = MAX(x, y); // 这里在预处理完之后替换为 max = (x > y ? x : y);
printf("max=%d\n", max);
return 0;
}

阅读全文 »

C 指针

发表于 2017-01-01 | 分类于 C

下面介绍几个指针中比较容易混淆的概念。

函数指针

本身是指针,比较的特殊,其指向函数的入口。
C 语言在编译的时候,会对每一个函数在内存中分配一个入口地址,该入口地址就是函数指针所指向的地址。

定义 类型 (*p)()

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

// 交换值
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}

int main(void)
{
void (*p)() = NULL;
p = getMax; // 函数名表示函数的指针
int a = 1, b = 2;
printf("src:%d - %d\n", a, b);
(*p)(&a, &b); // 这种写法比较容易区别
// p(&a, &b); // 也可以这样写
printf("res:%d - %d\n", a, b);
return 0;
}

阅读全文 »

PHP 使用 Memcache

发表于 2016-12-29 | 分类于 PHP

Memcache是什么?
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。

它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached管理这些HashTable,简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

为什么会有 Memcache 和 Memcached 两种名称?
其实 Memcache 是这个项目的名称,而memcached 是它服务器端的程序的名称,一个是项目名称,一个实现的软件名称。使用过程中你可以用项目名称,也可以直接使用软件名称。
Memcache 简单而强大,它的简单设计促进快速部署,易于开发,解决了大数据缓存面临的许多问题。

Memcache 的主要特点:

  • 基于C/S 架构 协议简单
  • 基于libevent的事件处理
  • 自主内存存储处理
  • 基于客户端的 Memcached 分布式

安装服务端 Memcached

服务端软件 Memcached,官网下载源码 下载。
具体安装方式如下:

1
2
3
4
5
6
7
8
9
10
11
# 源码编译安装
wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && sudo make install

# Ubuntu
apt-get install memcached

# Centos
yum install memcached

阅读全文 »

PHP 魔术方法介绍

发表于 2016-12-28 | 分类于 PHP

魔术方法介绍

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。具体查看 官方手册
那么有哪些魔术方法呢?

  1. __construct()
  2. __destruct()
  3. __call()
  4. __callStatic()
  5. __get()
  6. __set()
  7. __isset()
  8. __unset()
  9. __sleep()
  10. __wakeup()
  11. __toString()
  12. __invoke()
  13. __set_state()
  14. __clone()
  15. __debugInfo()
阅读全文 »

熟练使用 PDO 操作 MySQL

发表于 2016-12-27 | 分类于 PHP

摘自 PHP 文档

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。

PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。

PDO 支持的数据库驱动可以在 此处 进行查看。

下来我使用 MySQL 来演示 PDO 的使用:

准备一张 InnoDB 引擎的 chapter 表,填充一些测试数据,引擎的选择主要是我们后面要演示事务。表结构如下:

1
2
3
4
5
6
CREATE TABLE `chapter` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

阅读全文 »

PHP反射实际应用

发表于 2016-12-27 | 分类于 PHP

上一节 主要系统讲了反射的用法,虽然讲解了用法,但是没有对其在项目中的实际使用做讲解,不学以致用,不如不学。
在好多框架底层实现上面使用了反射,所以要理解和分析框架底层源码的话,必须掌握反射,不然的话理解十分的困难。

下面我们讲下反射在实际开发中的应用。

  • 自动生成文档
  • 实现 MVC 架构
  • 实现单元测试
  • 配合 DI 容器解决依赖
  • …
阅读全文 »

PHP反射

发表于 2016-12-25 | 分类于 PHP

反射介绍

PHP 反射机制,对类、接口、函数、方法和扩展进行反向工程的能力。
分析类,接口,函数和方法的内部结构,方法和函数的参数,以及类的属性和方法。

反射中常用的几个类:

  • ReflectionClass 解析类
  • ReflectionProperty 类的属性的相关信息
  • ReflectionMethod 类方法的有关信息
  • ReflectionParameter 取回了函数或方法参数的相关信息
  • ReflectionFunction 一个函数的相关信息

分析类:

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
class Student
{
public $id;

public $name;

const MAX_AGE = 200;

public static $likes = [];

public function __construct($id, $name = 'li')
{
$this->id = $id;
$this->name = $name;
}

public function study()
{
echo 'learning...';
}

private function _foo()
{
echo 'foo';
}

protected function bar($to, $from = 'zh')
{
echo 'bar';
}
}

阅读全文 »

Laravel + Vue 开发单页应用

发表于 2016-12-23 | 分类于 Laravel

开发环境:
Homestead + Laravel5.3 + vue2 + vue-resource1 + vue-router2 + vuex2

源码放在 github 上面,源码地址

环境安装就不做介绍了,由于 5.3 自带 vue2 和 vue-resource,但是需要安装 vue-route 和 vuex。
在 package.json 中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
"devDependencies": {
"bootstrap-sass": "^3.3.7",
"extract-text-webpack-plugin": "^2.0.0-beta.4",
"gulp": "^3.9.1",
"jquery": "^3.1.0",
"laravel-elixir": "^6.0.0-9",
"laravel-elixir-vue-2": "^0.2.0",
"laravel-elixir-webpack-official": "^1.0.2",
"lodash": "^4.16.2",
"vue": "^2.0.1",
"vue-resource": "^1.0.3",
// 添加
"vue-router": "^2.0.1",
"vuex": "^2.0.0"
}
...

执行 npm install 安装

介绍下开发的需求,主要有三个页面:

  1. 首页展示推荐新闻
  2. 新闻列表
  3. 新闻详情
阅读全文 »

MySQL 慢查询设置和分析工具

发表于 2016-12-23

测试使用 MySQL 版本为 5.7.13

MySQL 配置

首先可以通过命令查看是否开启慢查询日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SHOW VARIABLES LIKE 'slow_query%';
+---------------------+-----------------------------------+
| Variable_name | Value |
|---------------------+-----------------------------------|
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow.log |
+---------------------+-----------------------------------+
2 rows in set
Time: 0.005s

mysql> SHOW VARIABLES LIKE 'long_query_time%';
+-----------------+---------+
| Variable_name | Value |
|-----------------+---------|
| long_query_time | 1 |
+-----------------+---------+
1 row in set
Time: 0.004s

slow_query_log 表示是否开启慢查询日志,ON 为开启,OFF 为关闭,如果为关闭可以开启。
slow_query_log_file 表示慢查询日志记录文件
long_query_time 表示超过多长时间为慢查询,是一个边界值,单位为秒

阅读全文 »

C & Socket

发表于 2016-12-22 | 分类于 C

说明开发运行环境:OS X Yosemite 10.10.4
其他平台没有做测试,如果在其他 Linux 平台的话,可以使用 man 检查对应函数所需要的头文件,引入即可,不然的话,会出现编译错误。

Client

操作步骤:

  1. 创建一个 socket 实例,使用 socket 函数创建
  2. 使用 IP 地址链接服务器,使用 connect 函数
  3. 向服务器发送数据,使用 write,从服务器接收数据,使用 read

开发的时候主要需要引入 socket.h 这个头文件,一般头文件存放在 /usr/include/sys/ 这个目录中,首先检查下这个文件是否存在,不然的话在开发中会出现错误。

socket 支持 TCP 和 UDP 协议,在使用 socket 函数创建的时候,可以指定协议。

在绑定地址的时候,需要将字符串转换为网络地址,这就需要用到 inet_addr 函数,引入头文件 arpa/inet.h。

下面我们将写个示例展示下 Client 端的开发步骤

阅读全文 »
1…456…8
Flyertutor

Flyertutor

一个PHP爱好者

78 日志
9 分类
16 标签
GitHub
© 2018 Flyertutor
由 Hexo 强力驱动
主题 - NexT.Gemini