代码大全(Code Complete)第二版读书笔记

通过阅读此书,理清了很多概念,学习到不少最佳实践。作者指出的很多问题,我都有切实的亲身经历,不仅如此,作者还提供了解决这些问题的方法,对于很多程序员来说,都是非常宝贵的,可以少走很多弯路。

我认为如果初学者来看这本书,因为编程经验比较少,可能体会不是太深。最好还是有些经验了再看,相当于作者已经帮你把你经常遇到的问题给总结罗列好了。

本书的目的:

如何编写高质量的代码,如何构建高质量的软件,如何成为一个优秀的程序员
为什么要写这本手册:在软件工程界,人们都清楚地认识到,应该把软件开发中行之有效的实践知识归纳、编撰成一本开发手册。

什么是构建:

建设的过程,也就是创建事物过程中动手的那些部分。
编码有一种“把已经存在的设计机械化地翻译成计算机语言”的意味。

第一部分 打好基础

第一章 欢迎进入软件构建的世界

“构建”是指建设的过程。就是创建事物过程中动手的那些部分。

1.1 什么是软件构建

软件开发过程中包含很多的活动:
定义问题
需求分析
规划建设
软件架构
详细设计
编码与调试
单元测试
集成测试
集成
系统测试
保障维护

“编码”有一种“把已经存在的设计机械化的翻译成计算机语言”的意味。而构建并不都是这么机械化的,需要客观的创造力和判断力。
本书大致包含规划建设、软件架构、详细设计、编码与调试、单元测试、集成测试和集成等活动。

1.2 软件构建为何如此重要

构建活动是软件开发的主要组成部分。
构建活动是软件开发中的核心活动。
把主要精力集中于构建活动,可以大大提高程序员的生产率。
构建活动的产物——源代码——往往是对软件的唯一精准描述。
构建活动是唯一一项确保会完成的工作。

第2章 用隐喻来更充分的理解软件开发

2.1 隐喻的重要性
2.2 如何使用软件隐喻
对于编程来说,最大的挑战还是将问题概念化。
2.3 常见的软件隐喻

1.3 如何阅读本书
第20章 软件质量概述

20.1 软件质量的特性
软件同时拥有外在的和内在的质量特性。
外在特性指的是该产品的用户所能感受到的部分,包括以下内容:
正确性
可用性
效率
可靠性
完整性
适应性
精准性
健壮性
内在特性包括以下内容:
可维护性
灵活性
可移植性
可重用性
可读性
可测试性
可理解性
20.2 改善软件质量的技术
改善软件质量的一种强有力的方法,就是根据前面章节所提到的各种内在特性和外在特性,明确定义出软件质量的目标。
将测试作为质量评估和质量改善的首要方法,这样的想法将使得测试不堪重负。
非正式技术复查,正式技术复查,外部审查
在开发过程中:
对变更进行控制
结果的量化
制作原型
程序员有很高的成就激励:他们会向明确的目标进发,但必须有人告诉他们目标是什么。不同目标之间是有冲突的,并且软件通常都不可能在所有方面都做得很好,这也符合我们的预期。
20.3 不同质量保障技术的相对效能
检查比测试的效率高,成本低很多。
质量保障技术推荐:
对所有需求、系统关键部分的设计以及架构进行正式检查
建模或者创建原型
代码阅读或者检查
执行测试
20.4 什么时候进行质量保证工作
在项目的早起阶段就开始强调质量保证工作,并且将其贯彻到项目的余下部分中。
20.5 软件质量的普遍原理
改善质量以降低开发成本
哪些花费时间不多不少的程序员编写的程序错误最多,而那些花费时间较多或较少的程序员编写的程序所含错误要明显少得多。

第21章 协同构建

21.1 协同开发实践概要
”协同构建“包括结对编程、正式检查、非正式技术复查和文档阅读等。协同构建是其他质量保证技术的补充,首要目的就是改善软件的质量。
Karl Wiegers指出:由人进行的复查能够发现不明显的错误信息、不恰当的注释、硬编码的变量值,以及重复出现的需要进行统一的代码模式,这些是测试发现不了的。
21.2 结对编程
什么是结对编程
成功运用结对编程的关键
结对编程的好处
21.3 正式检查
非常详细的介绍了如何进行正式检查,应该组织多少人员,每个人员的角色,会议的准备,开会时间,如何开会等等
21.4 其他类型的协同开发实践
走查,一种非常不值得推荐的检查方式。
还有代码阅读,公开演示等…

第22章 开发者测试

测试包括单元测试,组件测试,集成测试,回归测试,系统测试
黑盒测试指的是测试者无法了解测试对象内部工作机制的测试。
白盒测试指的是测试者清楚待测试对象内部工作机制的测试。
22.1 开发者测试在软件质量中的角色
对于任何软件质量规划来说,测试都是一个重要的组成部分,并且在许多情况下它是唯一的组成部分。
22.2 开发者测试的推荐方法
测试先行还是测试后行根据情况而定。应该先写测试用例
开发者测试的局限性:

  • 开发者测试倾向于”干净测试“,即开发人员往往去做一些检查代码能否正常工作的测试(干净测试,clean tests),而不是做所有可能让代码失效的测试(肮脏测试 dirty tests)。
  • 开发者测试对覆盖率有过于乐观的估计。
  • 开发者测试往往会忽略一些更复杂的测试覆盖率类型。
    22.3 测试技巧锦囊
  • 不完整的测试
    集中注意力挑选出那些能告诉你不同答案的测试用例,而不选出一堆总是告诉你相同答案的测试用例。
  • 机构化的基础测试
    需要测试程序中的每条语句至少一次。
    22.4 典型错误
    绝大多数错误往往与少数几个具有严重缺陷的子程序有关。
    错误的分类…
    大多数错误的影响相当有限
    许多错误发生在构建的范畴之外
    大多数的构建期错误是编程人员的失误造成的
    让你惊奇的是,笔误(拼写错误)是一个常见的问题根源
    错误理解设计这条会经常出现
    大多数错误都很容易修正
    测试本身的错误
    22.5 测试支持工具
    22.6 改善测试过程
    22.7 保留测试记录
第23章 调试

调试是确定错误根本原因并纠正此错误的过程。同测试不同,后者是检查错误的过程。
遇到的绝大多数问题都是一些微小的疏忽和拼写错误,这些很容易通过阅读源代码或在调试器中单步跟踪来发现。

调式概念

介绍了一些效率低下的调试方法。

寻找缺陷

科学的调试方法
寻找缺陷的一些小建议

修正缺陷

调试过程中最让人头疼的部分是寻找缺陷。修正缺陷则是较为简单的部分。正式因为它太过简单才让人们经常对它掉以轻心。调查发现程序员第一次对缺陷进行修正的时候,有超过50%的几率出错。下面给出一些如何减少出错几率的建议。

调试中的心里因素

调试是一种要求程序员花费大量脑力的工作。就算是已经看到了一个缺陷,你的自负还是会让你觉得自己的代码完美无缺。
接下来作者指出了几种心里因素并提供了一些改善的方式。

调试工具——明显的和不那么明显的
第24章 重构
软件演化的类型
重构简介

定义:在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解并便于修改。
有时,代码在维护过程中质量会降低,而有时代码在最初诞生的时候就先天不良,则就意味着程序需要重构。
重构的理由:

  • 代码重复
  • 冗长的子程序
  • 循环过长或嵌套过深
特定的重构

数据级的重构
语句级的重构
子程序级的重构
类实现的重构
类接口的重构
系统级的重构

安全的重构

如果使用不当,重构给你带来的麻烦会比它所带来的好处还多。下面一些简短的建议能够让你避免错误的使用重构。

重构策略

讲了在什么时候进行重构。

第25章 代码调整策略
性能概述

有时候需要考虑到底是应该更关注性能还是代码的质量,可读性和可维护行。

代码调整简介

介绍代码调整的几个误区和何时调整代码。
“行数越少程序就越快”的教条是错误的。

蜜糖和哥斯拉

常见的低效率之源。

性能测量

通过测试找出最耗性能的代码。

反复调整
代码调整方法总结
第26章 代码调整技术
逻辑

短路与及等价转换等一大堆可以优化的点。

循环

将判断外提,合并等

数据变换

尽可能使用整形而不是浮点数。
数据维度尽可能少。

表达式

使用代数恒等式,举个例子:
如果要判断sqrt(x) < sqrt(y),可以使用x<y来判断,这样可以节省90%以上的时间。

子程序

短小,定义明确的子程序能够代替多处单独执行相同操作的代码,因而能够节省空间。这些子程序也使得优化更为简单,因为重构某子程序的代码就可以惠及各处。

用低级语言重写代码
变得越多,事情反而越没变

第6部分 系统考虑

第27章 程序规模对构建的影响

如果你习惯于开发小项目,那么你的第一个中大型项目有可能严重失控。如果你习惯于开发大型项目,那么你所用的方法可能对小项目来说太正规了。

交流和规模

交流路径的条数大致正比于人数的平方。当项目中的程序员的数量超过50名,其潜在的交流路径就至少有1200条。
改善交流效率的常用方法是采用正式的文档。

项目规模的范围
项目规模对错误的影响

项目的规模也会影响错误的类型。
随着项目规模的扩大,错误的密度也就越来越大。

项目规模对生产率的影响

项目越大,生产率越低,人均代码行数越少。

项目规模对开发活动的影响

随着项目规模越来越大,构建所占的工作量成线性增加,而其他活动的工作量增长将超过线性。比如:交流,计划,管理,需求分析等等

第28章 管理构建
鼓励良好的编程实践
配置管理

配置管理的另一种说法是“变更控制”,其中的技术包括评估所提交的更改,追踪更改,保留系统在不同时间点的各历史版本。比如使用git或svn进行代码管理。

评估构建进度表

评估项目的规模和完成项目所需的工作量是软件项目管理中最具挑战性的方面之一。
评估的方法。
如果你落后了该怎么办?

  • 不要指望着自己能赶得上进度
  • 扩充团队
  • 缩减项目范围
    以上的几种方案都是我在实际的项目发现我的领导运用过的。
    度量
    从一种简单的度量数据开始,比如缺陷数量、工作月数、总费用以及代码总行数据开始。
    把程序员当人看
    不同程序员之间的生产效率有差异。
    不同团队之间的生产效率也有差异。
    最好的工作环境比最差的工作环境中的生产效率高出近1倍。
    管理你的管理者
    如何用有效的方式管理你的管理者。
    第29章 集成
    将一些独立的软件组件组合为一个完整系统。
    集成方式的重要性
    从周到的集成中,你能预期获得某些下列的益处。
    集成频率——阶段式集成还是增量集成
    什么是增量集成
    增量集成的益处:
  • 易于定位错误
  • 及早在项目里取得系统级的成果
  • 改善对进度的监控
  • 增量集成的策略
  • 自顶向下集成:
    首先编写并集成位于层次体系顶部的类。
  • 自底向上集成:
    首先编写并集成位于层次体系底部的类。

  • 不要像教条一样遵循前面提到的任何过程,它更多的是启发。
    Daily Build与冒烟测试
    Daily Build就是把整个项目每天打一个完整的包。如果项目的大小没有超过Microsoft Window 2000,那么就可以做到。
  • 冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续的正式测试工作。冒烟测试的执行者是版本编译人员。
  • 回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
    第30章 编程工具
    设计工具
    目前的设计工具主要就是那些能”能创建设计图表”的图形化工具。
    源代码工具
    介绍了通常IDE所具有的功能。
可执行工具
工具导向的环境
打造你自己的编程工具
工具幻境

第7部分 软件工艺

第31章 布局与风格
基本原则
布局技术
布局风格
控制结构的布局
单条语句的布局
注释的布局
子程序的布局
类的布局
第32章 自说明代码
外部文档
编程风格作文档
注释或不注释
高效注释之关键
注释技术
IEEE标准
第33章 个人性格
个人性格是否和本书话题无关
聪明与谦虚
求知欲
诚实
交流与合作
创造力和纪律
懒惰
不如你想象中那样起作用的性格因素
习惯
第34章 软件工艺话题
征服复杂性
精选开发过程
首先为人写程序,其次才是为机器
深入一门语言去编程,不浮与表面
借助规范集中注意力
基于问题域编程
当心落石
迭代,反反复复,一次又一次
汝当分离软件与信仰
第35章 何处有更多信息
关于软件构建的信息
构建之外的话题
期刊
软件开发者的阅读计划
参加专业组织

Nginx代理配置

上文介绍了Nginx的安装,下边介绍使用Nginx代理网站。
我是申请的阿里云免费证书,同时域名也在阿里云买的,所以中间省去了很多麻烦。

按照阿里云上的说明,一步一步的安装配置好久可以了。通过页面访问,比如 https://www.youdomain.com ,然后看到 Welcome to nginx! ,就说明配置成功了。

中间有一个坑,就是现在阿里云的服务器默认很多端口都是关闭的,必须去控制台的安全组里面打开相应的端口,这次是https,才可以访问。

转发配置如下,注意下边配置参数做相应的修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443;
server_name www.hohode.com;
ssl on;
# root html;
# index index.html index.htm;
ssl_certificate cert/5614507086590401.pem;
ssl_certificate_key cert/561407086590401.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8083;
# root html;
# index index.html index.htm;
}
}

配置上传文件的大小

1
client_max_body_size 1g;

参考 Nginx配置上传文件的大小

nginx将多个不同域名转发到不同端口

只在nginx的配置文件里面加了2个upstream,和2个server,其它的一行没动。重启nginx。

这里的ip用127.0.0.1代理,2个域名分别用 百度 和 谷歌 代替。

这里例如www.baidu.cn baidu.cn ,空格分开表示两个访问地址都能控制。

百度谷歌两个项目页面分别在8081和8082两个tomcat下。

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

upstream baidu{
server 127.0.0.1:8081;
}

upstream google {
server 127.0.0.1:8082;
}

server {
listen 80;
server_name www.baidu.cn baidu.cn;
location / {
proxy_pass http://baidu;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

server {
listen 80;
server_name www.google.cn google.cn;
location / {
proxy_pass http://google;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

}

Nginx的安装

Nginx是一款非常著名的HTTP和反向代理服务器,广泛被应用在互联网应用之中,本文将简要介绍其安装的过程。

本例在Centos6.5上执行。

1 预先执行 参考

1
2
3
4
yum install -y gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

这四个需要安装的原因分别是:

nginx是C语言开发,建议在linux上运行。安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc。

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

2 下载安装文件

一般下载的是源代码文件包,需要自行进行编译和安装。

1
wget  http://nginx.org/download/nginx-1.13.8.tar.gz

3 解压缩文件,并进行编译安装

tar -xvf nginx-1.13.8.tar.gz
cd nginx-1.13.8     ## 进入源代码目录
./configure        ## 编译源代码
#如果需要使用https,使用如下命令
./configure --with-http_ssl_module

4 执行make命令

1
make

5 执行make install命令来完成安装

1
make install

6 修改端口
/usr/local/nginx/conf /nginx.conf配置文件中的默认端口为80,可以根据需要设定。
7 Nginx的启动和关闭

确保系统的 80 端口没被其他程序占用,执行命令:

1
/usr/local/nginx/sbin/nginx

检查是否启动成功:

1
netstat -ano|grep 80  ## 有结果输入说明启动成功

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。

Nginx的重启

1
/usr/local/nginx/sbin/nginx –s reload

8 Nginx主要的配置选项

配置文件所在的路径: /usr/local/nginx/conf
大家可以编辑自己需要的参数,比如配置进程、连接以及虚拟主机等诸多信息。

From: http://blog.csdn.net/blueheart20/article/details/49886369

中国历代纪年

名号 姓名 年号 使用年数 元年干支 改元月份 公元纪年
清[爱新觉罗氏]
(1616年-1911年)
太祖 爱新觉罗努尔哈赤 天命 11 丙辰 正月 1616年
太宗 爱新觉罗皇太极 天聪 10 丁卯 正月 1627年
崇德 8 丙子 四月 1636年
世宗 爱新觉罗福临 顺治 18 甲申 正月 1644年
圣宗 爱新觉罗玄烨 康熙 61 壬寅 正月 1662年
世宗 爱新觉罗胤禛 雍正 13 癸卯 正月 1723年
高宗 爱新觉罗弘历 乾隆 60 丙辰 正月 1736年
仁宗 爱新觉罗颙琰 嘉庆 25 丙辰 正月 1796年
宣宗 爱新觉罗旻宁 道光 30 辛巳 正月 1821年
文宗 爱新觉罗奕苎 咸丰 11 辛亥 正月 1851年
穆宗 爱新觉罗载淳 同治 13 壬戌 正月 1862年
德宗 爱新觉罗载湉 光绪 34 乙亥 正月 1875年
爱新觉罗溥仪 宣统 3 己酉 正月 1909年
中华民国
(1912年-1949年)
臨時大總統 孫文 民国 (1) 辛亥 十一月 1912年
袁世凱 (1) 壬子 正月 1912年
大總統 袁世凱 (3) 癸丑 九月 1913年
黎元洪 (1) 丙辰 五月 1916年
馮国璋 (1) 丁巳 五月 1917年
徐世昌 (4) 戊午 九月 1918年
非常大總統 孫文 (4) 壬戌 五月 1921年
主席 汪兆銘 (1) 乙丑 五月 1925年
陸海軍大元帥 張作霖 (1) 丁卯 五月 1927年
主席 蔣中正 (3) 戊辰 八月 1928年
林森 (12) 辛未 十一月 1931年
蔣中正 (5) 癸未 七月 1943年
總統 蔣中正 (1) 戊子 四月 1948年
代總統 李宗仁 (1) 戊子 十二月 1949年
中华人民共和国
1949年-
主席 毛澤東 公元 (10) 己丑 八月 1949年
刘少奇 (9) 己亥 三月 1959年
代主席 董必武 (7) 戊申 九月 1968年
委员长 朱德 (1) 甲寅 十二月 1975年
宋庆龄 (2) 丙辰 六月 1976年
叶剑英 (5) 戊午 正月 1978年
主席 李先念 (5) 癸亥 五月 1983年
杨尚昆 (5) 戊辰 二月 1988年
江泽民 (10) 癸酉 三月 1993年
胡锦涛 (10) 癸未 二月 2003年
習近平 (10) 癸巳 二月 2013年

Mysql批量导入文本

参考http://blog.csdn.net/u014082714/article/details/53173975

先创建好表data。

1
load data local infile "~/Desktop/data.txt" into table data fields terminated by '|';

terminated by后边的’|’,说明字段是用|进行分割的。
下边是要导入的部分数据:

1
2
3
4
id 		      | name
113972451813201 | xujiayin
113972451813202 | mahuateng
113972451813103 | jackMa

前几导入的时候没有成功,最后发现是id的长度8设置的太小,改为32就足够了,接下来导入一次成功。

Hexo一些配置

1.在设置Search url后,需要使用hexo generate重新生成文章,这样再使用Search的时,google的搜索框中才不会显示http://yoursite.com。
2.图片放在public/css/images/下,使用/css/images/at.png的方式进行链接。
3.更换banner图片
图片的位置为:public/css/images/banner.jpg,可以替换为你自己想要的图片。
4.添加菜单
在themes/landscape/_config.yml文件中添加菜单
5.Google Analytics
http://www.codeblocq.com/2015/12/Add-Google-Analytics-to-your-hexo-blog/
6.如何在静态博客hexo中只显示摘要信息
只要加入一个 more 占位符在文章正文里面即可:

1
2
3
4
5
这里是简介

<!-- more -->

这里是正文

7.修改文章的box-shadow属性
在themes/landscape/source/css/_extend.styl文件的$block那里
8.修改blockquote的样式,样式在_partial/article.styl中

参考 https://www.jianshu.com/p/b96fd206571a

iPhone短信转发

From: http://rpsh.net/archives/iphone-with-two-sim-cards/

iphone

发现还是有蛮多人有两个手机号,但由于 iPhone 只支持单卡,需要同时携带两部手机才能不错过两个卡的短信、电话。

于是我祭出了目前我所采用的 iPhone 双卡双待方案,瞬间折服他们,从此出门只需带一部 iPhone 手机,两张卡的短信、电话都可以完美无缝接收。

准备工作:
1、两部 iPhone。(快翻箱倒柜找出你那部已经吃灰N年的 iPhone 4S)我们称这部 iPhone 4S 为 A,而你每天在使用的新 iPhone 称为B
2、在 A 手机插入电话卡a,在 B手机插入电话卡b。
3、两部 iPhone 均启用 iMessage,iCloud 登陆为同一个 Apple ID

操作方法如下:

一、将手机A收到的短信自动转发到手机B

在手机A进入 「设置 – 信息 – 信息转发」,选中B手机后边的开启按钮,然后输入此时在B手机上显示的验证码。

这样以后A手机收到卡a的所有短信都可以通过 iMessage 自动转发到B手机上,无论是朋友间的 iMessage 信息,还是来自 106 号段的各种验证码短信都可以。此功能免费

iPhone短信转发

如果你需要在B手机上发短信时候,以卡a的号发送,还需如下设置
「设置 – 信息 – 发送与接收 – 开始新对话时使用」,勾上卡号a
message-2

如果你在手机A上没有找到 「信息转发」项目,你需要先在手机B 「设置 – 信息 – 发送与接收 – 可通过 iMessage 与您联络的方式」勾上卡号a

二、将手机A的所有电话转移到手机B接听

在手机A进入 「设置 – 电话 – 呼叫转移」,开启「呼叫转移」,设置将「全部通话」「转移到」卡号b。

这样所有拨打到手机A的通话,都可以自动转移到手机B。此功能同样免费

iphone 电话呼叫转移

使用 iPhone 里这个呼叫转移是免费的,但是接听是否收费,取决于你的卡a、卡b接听是否免费。我这里情况是 卡a、卡b 接听均免费,所以,对我来说这个呼叫转移过程是全免费的。

如果你需要在B手机上主动拨打电话时,将主叫号码显示为卡a,根据苹果官方文档的介绍,GSM制式的可以设置,而 CDMA 不行(我们这些悲剧的电信用户 ?

通过上面两步,已经可以实现出门只需携带手机B,手机A就放在家里继续吃灰,默默担当一个转发器的角色。 ?

另外需要注意的有
1、手机A一旦没电关机,你的手机B就与它失联了,我目前的做法是使用了一款智能插座,将手机A的充电器插在智能插座上,设置每天晚上自动开启充电,白天自动断电。(选晚上是因为在家,充电时一旦发生状况,可以进行处理。不一直插着充电亦是担心长时间过量充电,对电池不好,而且可能引发事故)

2、iPhone 4S 直接插电信 4G 卡没有信号处于无服务状态,我是使用了 GPP 卡贴 让 iPhone 4S 用上了 4G 卡(由于 iPhone 4S 的硬件限制,只能搜到3G信号)

Kibana Visualize Aggregation时无法选择_souce中字段

Elasticsearch版本为5.6.1
可以使用如下mapping方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /index2
{
"mappings": {
"log" : {
"properties" : {
"timestamp":{
"format":"strict_date_optional_time||epoch_millis",
"type":"date"
},
"hostname": {
"type": "keyword",
"ignore_above": 1024
},
"pct" : {
"type":"float"
}
}
}
}
}

注意上述代码中hostname是如何定义的。
将Kibana的index Patterns中相关index删除后重新创建index。
然后再在Kibana visualize Aggregation时就可以选择_souce中字段了,比如上边的hostname。