如何写一本技术类的书

来介绍一下《Puppet权威指南》写作过程。做很多事情都需要一个流程,想必大家这里身有体会,譬如一个好的运维体系,基础化、模块化、平台化、自动化和数据挖掘等,少一环节都有可能会影响产品的快速发展。写书也一样,所以这里我差了一个环节,在宣传书的同时分享写书过程与过程中的收益,希望通过介绍整个过程,能让更多朋友为业界提供更多思路与创新技术。

开篇

本文目录结构


如何萌生写书想法

回忆了一下,首先从来没想要写书,只是偶然的机会而已。在2001年左右,上高中时很喜Photoshop和3Dmax,在那时我就已经会安装Windows 98操作系统,在班级中公认的是一个计算机高手。另外,我也经常买《电脑报》、《网友世界》和《黑客X档案》杂志,通过XCAN来扫描远程服务器开放端口,并根据扫描后端口确认是否有漏洞,这些对于那时的我会带来很多的成就感与自豪感,记忆中曾多次一条命令就可以让网吧远程的系统蓝屏,但有一次在网上遇到了牛人,他能随意改我的QQ密码,盗取我的163账号,查IP地址能定位到我的家门牌号,那一刻我觉得自己弱爆了,后来经常与他交流学习经验,那时我最不喜欢学习编程语言,而他说你要做为一个优秀的黑客就要去学习编程语言和网络协议,也是那时他让我第一次知道TCP/IP协议的三卷书,通过与他交流与指导,我开始自学C编程语言,学了才知道C语言并没有想象中那么难。

后来上了大学,操作系统中学了Linux,了解他历史的都应该知道玩Linux才是真正的黑客,所以那时去电脑市场买了一个Redhat6.0版本的系统盘来安装,安装后不知道怎么用,在网上查资料时知道了www.chinaunx.net (简称CU),那年是2006年,因为我的CU ID(研究僧)注册时间就是2006年。从CU学到了很多东西,譬如记忆深刻的《门户网站运维abc》、《Shell能力测试》和《Shell基础20篇》等都是很好的学习资料, 还有一篇文章来描述如何学习Linux,大概中心是要想学好Linux;

  • 多看书;
  • 多实践;
  • 多总结沉淀;
  • 遇到问题自己查找资料解决,解决不了再寻求帮助;
  • 如果学习的知识点都掌握了,多去帮助他人解决问题,其实帮助他人也是自己学习的一个过程。

所以,在CU经常找别人问的问题,看是否能解决,如果解决不了再去网上找解决思路与过程,那时也是因为这原因,我写了很多文档,由于看了Shell编程13问的文章,忽然觉得我的文档总结可以写成一本书的形式与别的朋友进行分享,经过对文档总结提炼与打磨,最终在2008年写出了第一版本,不过现在已经找不到最初的版本了,在电脑里找到了2010年最后变更时间的书,无意间人生的第一本书就这样的写完了。

2008年在北京工作后,一天在QQ忽然有人问我,看你CU比较活跃是否可以可以来我们这里帮讲一些网络的课程,我抱着试试看的态度应邀去了华章的编辑社,去了才知道这是有名的机械工业出版社,我很喜欢买他们书。到了后是一位美女来接我,交谈中我说我写过书,美女说是否可以发我看看,几天后我提交了一份书的原本发给编辑社,美女帮我指定了出版策划(杨福川),第一次与福川见面时在中关村的麦当劳,感觉一见如故与技术人交谈很开心,他看过我给的文档后,给了我很多出书的建议,说对于刚出茅庐的我书的内容还是很好的,但对于出版来说要走的路还要很多,不过也鼓励我,希望有机会能合作出一本书。就这样几年过去了,应该是2012年系统架构师大会,再次遇见福川,福川问是否有兴趣来写书,我说OK没问题,正好由于内部部门产品变动,我负责的系统没有运营工具,我对Puppet进行研究并在线上应用。那时Puppet知道人并不是很多,所以一拍即合开始写人生的第二本书《Puppet权威指南》。

写书的流程

下定决心后写书并不复杂,以下为写书流程:
1)寻找一个靠谱出版社,因为他会有渠道帮你做后续推广;
2)确认写书的标题与大纲,其中大纲很重要,有一个目标才好量化时间与写作进度。写作大纲中一般还包含选题思路、读者对象、内容简介、市场分析、卖点分析、作者简介和营销建议这7项;
3)签约合同,合同是双方利益保障,对于出书者来说写完出版社不出版,可以通过合同来约束。当然,反过来没按照预定写出来,还是要陪违约金的(这也是签约后动力之一)。除此之外,还要确认付款方式,两种:

  • 方式1:一次性买断书的版权,即一次打完所有歀。
  • 方式2:是按出版发行量计费,根据书的售卖情况打款(注:我签约的这种)
    大家可以自己来确定付款方式(写书并不挣钱,但是收益还是有很多的,一会会介绍)。
    4)合同确认后,策划会分配一个编辑给作者。我的编辑(孙海亮)海亮给我的感觉三个词形容,积极、专业和耐心。编辑会把控整体的进度、写作风格、语句是否通顺、是否能很好的读者学习了解书中的专业知识内容,然后就是定期发文稿给编辑;
    5)最终出版社收到完整的书稿(齐、清、定)后会制定编辑加工计划,并以书的形式打印出来各章,确认排版与最终效果是否一致,前后有三次校对过程;
    6)最后确定封面,出版与推广;
    7)根据约定出版社付稿酬。

Read More

如何欺骗History命令不记住你的执行记录

如何让history不记住你的执行记录,我们来看一下流程。

  1. 通过history 命令查看命令列表

  2. 执行uptime ,然后通过history 查看记录

  3. 通过history 可以查看到刚执行的uptime记录,下面让history 不记录执行的命令,如何操作呢。通过 ls命令前边加空格再次执行。

  4. 再次查看history记录,!!没有看到刚执行过的ls命令记录(欺骗成功)。

  5. 如果执行的命令前边加空格,默认history命令是不会记录历史的,如何才能让history命令记录加空格的命令呢? 我们可以修改系统的HISTONTROL环境变量来实现,详细看以下。

默认值

1
2
3
4
HISTONTROL=ignoreboth 
改为
HISTCONTROL=ignoredups
再次执行空格加命令

Shell回收站

以下两个脚本分来自当年整理并发表在chinaunix.net的论坛贴。这里补充一下为什么Linux没有回收站功能 !
来自《UNIX编程艺术》一书可以寻找到答案:

因为UNINX/Linux设计之初主要用于更专业的场景,从设计哲学上 ”就像你拿一把枪向自己开枪也是可以的“,因为他是为更专业人使用的一个系统。

《UNIX编程艺术》

2008年版本

以下是自己上学时写的,代码很简单,但是功能都是实现了,第一次在这发帖没什么写的就上学时写的这拿出来晒晒。
以前用shell写过一个rm但是并没有恢复功能,前一阵cu论坛上有个网友说能不能增加一个功能就是把删除的文件的原路径记录到一个文件中,所以我又写了这个rm增加了恢复功能,同时也能看到删除文件的原来路径。

rm功能:

  • rm -r
  • rm -f
  • rm -rf
  • rm -i
  • rm –help

以上功能和平时用的rm命令功能基本一样,”rm -l”是新增加的功能,它会把所有删除的文件显示一个列表,前边有行号你想恢复哪个文件只要按相应的行号就行,并按y确认。

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/bin/bash
#-----------------------------------------------------------------
# filename:
# author: wds
# begin:2008.1.27
# end:2008.2.1
# version: v.2
# script address: http://blog.chinaunix.net/u1/40306/index.html
#-----------------------------------------------------------------
from1=$1
from2=$2
garbage=$HOME/.garbage
mvlog=$garbage/mv.log
if [ ! -e $garbage ]
then
mkdir -p $garbage
chmod 777 $garbage
fi
function rand
{
a=(0 1 2 3 4 5 6 7 8 9 a b c d e A B C D E F )
for ((i=0;i<7;i++));do
echo -n ${a[$RANDOM % ${#a[*]}]}
done
}
random=$(rand)
function rm1
{
if [ -d "$from1" ]
then
echo "rm: cannot remove '$from1/' : Is a directory"
else
echo "`pwd`/:$from1:$random:`date`" >> $mvlog
mv "$from1" "$garbage/$from1:$random"
fi
}
function more
{
for file in *
do
echo "`pwd`/:$file:$random:`date`" >> $mvlog
mv $file "$garbage/$file:$random"
done 2> /dev/null
}
function rmi
{
if [ ! -d "$from2" ]
then
echo -n "rm:remove regular empty file '$from2'?" ; read answer;
if [ "$answer" = 'y' -o "$answer" = 'Y' ]
then
echo "`pwd`/:$from2:$random:`date`" >> $mvlog
mv "$from2" "$garbage/$from2:$random"
fi
else
echo "rm: cannot remove directory '$from2': Is a directory"
fi

}
function rmf
{
if [ ! -d "$from2" ]
then
echo "`pwd`/:$from2:$random:`date`" >> $mvlog
mv "$from2" "$garbage/$from2:$random"
else
echo "rm: cannot remove directory '$from2': Is a directory"
fi
}
function rmr
{
if [ -e "$from2" ]
then
result=$(echo $from2 | sed 's/\///g')
echo "`pwd`/:$result:$random:`date`" >> $mvlog
mv "$result" "$garbage/$result:$random"
fi
}
function rml
{
while :
do
clear
line=$(cat -n $mvlog | awk -F : '{print $1,"FileName:"$2, "Time:"$4}')
linecount=$(cat $mvlog | wc -l)
echo -e "$line\c"
echo
echo
echo "Please input number you want revent(line count:$linecount)--exit(e)"
read answer
if [ "$answer" = e -o "$answer" = E ]
then
break
else
(
echo "please input y(sure:)"
read answer1
if [ "$answer1" = y -o "$answer" = Y ]
then
address=$(sed -n "$answer""p" $mvlog | awk -F : '{print $1}')
filename=$(sed -n "$answer""p" $mvlog | awk -F : '{print $2}')
filerand=$(sed -n "$answer""p" $mvlog | awk -F : '{print $3}')
fullname=$address$filename
if [ -e "$fullname" ]
then
echo "The file exist!"
sleep 1
else
old="$garbage/$filename:$filerand"
new="$address$filename"
mv "$old" "$new"
delline=$( cat $mvlog | sed "$answer""d" | sort -o $mvlog)
echo "update ok!!!"
sleep 1
fi
fi
)
fi
done
}
function help
{
echo "
-i) If you wants delete some file , this function is confirm you want,the same as old rm.
-f) If you wants delete some directory ,you can use this function ,the same as old rm.
-r) If you wants delete some directory of file ,this function can use , the same as old rm.
-l) This is new function,is you wants resume some file or directory you can use this function,
first this function can list some file in you garbage , these have some number ,if you
wants resume 1,you can input 1 and then input y to confirm.
If you want add some function or some new idear please contact me...
author:wds
email:7717060@sina.com

"
}
case "$1"
in
[a-z]) : ;;
[0-9]) : ;;
[A-Z]) : ;;
?) more ;;
*) :;;
esac
if [ "$#" -eq 0 ]
then
echo -n "rm: missing operand
Try 'rm --help' for more informaction.
"
fi
if [ "$#" -eq 1 ]
then
case "$from1"
in
-i) echo "Try 'rm --help' for more informaction."; break ;;
-f) echo "Try 'rm --help' for more informaction."; break ;;
-r) echo "Try 'rm --help' for more informaction."; break ;;

-l) rml ;;
--help) help;;
*) rm1;;
esac
fi

if [ "$#" -eq 2 ]
then
case "$from1"
in
-i) rmi ;;
-f) rmf ;;
-r) rmr ;;
-l) rml ;;
-rf) rmr ;;
--help) help ;;
esac
fi
if [ "$#" -gt 2 ]
then
for file in $*
do
mv $file "$home/"
done 2> /dev/null
fi

Read More