开发者拒绝写技术博客的常见理由



常有人跟我讨论我在blog上发布过的博文,有时候他们还希望我来撰写某些文章。在讨论的过程中,我几乎总是会问为什么你自己不开一个博客,或者为其他人的博客做些贡献呢?当我在引导他们为技术类的主题写一些博文时,极少有人对此感兴趣。

我的母亲总是告诉我(以及她的学生们)每个人都有自己的故事。她说,写作可能是一种你不曾想到过的非常有益处的行为,直到你写的东西获得了其他人的喜爱和赞同。就像软件开发者为他们的用户开发软件一样,作家为他们的读者而写作。从来都没有什么论断说技术人员无法成为激励他人学习并乐于同他人分享知识的优秀作者。

我写这篇博文的目的就是想鼓励广大的技术人员去享受写作、高效的写作,并能够从中得到乐趣。我将翻出一些我曾经最常见到的关于为什么技术人员不愿意写博客的理由。

blog

“我不认为我是某方面的专家。对于任何一个我能想到的主题,我都不是权威。”

我首先想到的是这个理由,因为它将是我最需要去驳斥的观点。如果从这篇博文里你没有得到任何收获的话,那就记住这句话:你并不需要成为某方面的专家才能去写相关的文章。

翻翻我的博客你就能找到很多这样的例子。我自认为自己是某个方面,或者某两个方面的专家,但我在过去5年中写了超过450篇博文,我肯定不会只写我最在行的那一两个主题。写下你懂得的东西,要成为权威你就不能害怕去多做些研究。这方面有一个很好的例子就是我的一篇标题为“Kerberos for haters”的博文。我几乎没有任何有关Kerberos方面的经验。事实上,甚至在我的RHCA(RedHat系统部署工程师)认证考试中我都无法正确配置好它!但是,我对此做了相当多的研究,并开始慢慢理解了这一大坨东西是如何联系起来的。还有许多人都对Kerberos感到困惑,于是我决定将我所掌握的有关Kerberos方面的知识串接起来写成一篇博文。这篇博文引来了许多正面和负面的回复,很明显我发布的博文对一些读者起到了帮助作用,启发了一些人同时也得罪了一些人。

接下来看看下一个常遇到的理由:如果我写的东西里面有些地方是错误的怎么办?在整个互联网面前犯错,这使我看起来就像是个傻瓜。这种事我早就经历过,都已经有些厌倦了。做个不恰当的假设,每个作者都至少会犯一次错。读者们会指出你的错误(有些读者会很含蓄的指出,而有些读者不会这样),下面就是你的责任了,要么更正你的大作要么说服你的读者是他们错了。我自己也曾经发表过含有错误的博文,而且我对于时不时的要去检查这些错误显得有些懒惰。就像我中学时的新闻学老师一直教导我的:对于一个错误,最重要的部分是你要如何去更正它,并从中汲取教训。总之,你一定会犯些错误的。只要你尽心尽力的对此做研究,并尽量减少错误,及时对错误做出回应,我想读者是不会怪您的。

说到错误,这里还有一个常见的理由:我技术还不错,但我的拼写和语法很糟糕,我根本不擅长写作。这个问题很容易解决,如果你是那种什么事情都靠自己解决的人,那就拿起这本由Strunk和White合著的《The Elements of Style | 风格的要素》吧。网上有这本书的PDF版,或者你也可以借一本来读。无论你属于哪种情况,这本书详尽的描述了应该如何适当的加标点符号、如何组织句子和段落,以及如何正确地引用你的论点来源(对于写研究性的文章来说相当受用)。也许你并不想拿起一本如此枯燥的参考书来读,如果是这样的话,看看你身边有没有擅长写作的人。在大公司里你常常能在市场部或者公司的通讯录里找到一些愿意读你的文章并帮你做批注的伙计(谢谢你Garrett!,感谢你曾经为我修订过文章)。在 Fiverr(著名的5美元服务区,这是一个在线的信息平台,特色之处在于其收集那些价值5美元的事情,用户可以发布、接受或者分享这些信息)上我甚至找到了一些愿意以5美元的价格为我修订文章的人。

下面我们将看看这第二常见的理由:我不知道该写给谁看。如果我写的东西太简单了,那些真正的技术大牛们会不会觉得我就是个小白?如果我写的东西超级复杂,大多数人都接受不了又怎么办?

这些我都经历过。大多数称职的Linux系统管理员都知道该如何添加和删除iptable规则,他们会觉得这是相当简单的任务。但是你知道吗,在我写过的超过450篇的博文里,这篇《deleting a single iptable rule》的访问量每个月都是排名前5!我每个月的点击量里有11%都来自这篇博文。人们要么通过这篇博文学到了一些知识,要么是他们忘记了该如何删除一条iptable规则,想通过这篇博文做快速的参考。不管如何,这篇博文对于许多人来说都是很有价值的,尽管在我看来这个主题相当的简单。反过来说,我曾经发疯写过一个完整的关于云主机冗余配置的how-to类文档,结合了LVS、glusterfs、MySQL on DRBD、memcached、haproxy以及Idirectord等各种技术。我觉得对于某些读者来说这个文档会很有价值,但肯定会搞晕绝大部分读者。事实证明我又错了,这篇博文长期占据我博客的前10名受欢迎的文章之一,通过这篇博文我收到的回复、email和IRC比其他的文章都要多。这再次证明,本是一篇我认为最没有用处的文章反倒成为了一个“话匣子”。

最后,让我们总结一下,如果你对于写作感到力不从心或者觉得气馁的话,记住下面这些忠告:

● 写你感兴趣的东西,不必在意你是否是专家。

● 不要害怕失败

● 多多回复你的读者

● 就算你觉得没人会看你写的东西,也要坚持写下去。

● 始终确保你的文章就代表着你的声音——这也是为什么写作是如此特别和吸引人的地方

关于作者:

本文作者是Major Hayden。他是一名Linux工程师,工作方向是大规模OpenStack部署以及Rackspace云服务自动化管理。Major乐于撰写有关Linux系统管理以及安全性方面主题的文章。他常常在Rackspace的官方博客以及他的个人blog上发表文章。

英文原文:Major Hayden 编译:伯乐在线— 陈舸

转自:http://www.chinaz.com/news/2012/0503/249300.shtml

Linux架设Subversion(SVN)

Linux架设Subversion(SVN)

一、下载需要安装的软件

wget http://subversion.tigris.org/downloads/subversion-1.6.1.tar.gz
wget http://subversion.tigris.org/downloads/subversion-deps-1.6.1.tar.gz

二、新建一个用户:svnroot

三、编译安装httpd (root用户操作):

//解压apache2安装包
tar xvzf httpd-2.2.2.tar.gz
//进入解压后的目录
cd httpd-2.2.2
//配置apache安装,前两个参数是必须要加的,你还可以根据您的需要添加其他的参数。
//后面的参数制定你要把apache安装哪里
./configure --enable-dav --enable-so --prefix=/usr/local/apache2/
make
//安装
make install
cd /usr/local/apache2/bin
//启动apache服务
./apachectl start
//打开浏览器http://localhost/如果有测试页”It works!”出现则证明已经安装成功。

四、安装svn

tar xvzf Subversion-1.6.17.tar.gz
cd Subversion-1.6.17
./configure --with-apxs=/usr/local/apache2/bin/apxs --prefix=/usr/local/subversion --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2 --with-ssl --enable-maintainer-mode --enable-dav --enable-so
make
make install
在make的时候,.configure之后,进行make,出现如下问题
/usr/bin/ld: cannot find -lexpat
collect2: ld returned 1 exit status
make: *** [subversion/svn/svn] Error 1
应该是缺少-lexpat库文件。 解决方法:
yum install expat expat-devel
安装了之后,svn的make就过了
#创建库文件所在的目录(svnroot用户进行下面的操作)
mkdir /home/svnroot/repository
//创建仓库"test"
/usr/local/subversion/bin/svnadmin create /home/svnroot/repository/test
//查看svn是否安装成功
/usr/local/subversion/bin/svnadmin --version
//不让其他人有该目录的权限
chmod 700 /home/svnroot/repository
//(svnroot用户操作结束)

五、修改Apache配置文件

  vi /usr/local/apache2/conf/httpd.conf

找到下列语句,如果没有则自行添加

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

#在后面添加
DAV svn
#svn父目录
SVNParentPath /home/svnroot/repository/
#权限配置文件
AuthzSVNAccessFile /home/svnroot/repository/authz.conf
#连接类型设置
AuthType Basic
#连接框提示
AuthName "Subversion.zoneyump"
#用户配置文件
AuthUserFile /home/svnroot/repository/authfile
#采用何种认证
Require valid-user

六、重启apache

/usr/local/apache2/bin/apachectl restart
打开浏览器访问http://localhost/svn/test/,如果有东西显示就说明成功。

七、权限管理

#增加用户
htpasswd -c /home/svnroot/repository/authfile 用户名
#第一次设置用户时使用-c表示新建一个用户文件。回车后输入用户密码,完成对用户的增加
htpasswd /home/svnroot/repository/authfile 用户名(加入新的用户,就不用-c了)
#权限分配
vi /home/svnroot/repository/authz.conf

[groups]
admin=useradmin
#这里定义了一个用户组
devteamcs = useradmin,user1,user2
#对所有的项目,所有的用户都有读权限,admin用户有读写权限

- [/]
- @admin = rw
- *=r
`
#对test项目
[test:/]
@devteamcs = rw
  //注意:在编辑authz.conf文件时,所有行都必须要顶头写,不能有缩行出现,否则会报错:”"Access denied: ‘user1′ “”。

八、修改配置文件

在/usr/local/apache2/conf/httpd.conf文件中配置,找到文件中的这两行:

User daemon
Group daemon 将daemon改为svnroot,组也做相应更改,让apache进程以svnroot的身份运行  改完后是这个样子
User svnroot
Group svn
  //重启apache
/usr/local/apache2/bin/apachectl restart

    访问http://localhost/svn/test提示输入用户名密码,输入创建的用户名和密码登录进去看到“Revision 0: /”之类的就表示成功啦!至此apache+svn配置完成。

java 泛型 E/T/K/V/N 代表的意义

java 泛型 E/T/K/V/N 代表的意义

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • K - Key(键)
  • N - Number(数值类型)
  • T - Type(Java 类)
  • V - Value(值)
  • S,U,V etc. - 2nd, 3rd, 4th types

cmd批处理常用符号详解

cmd批处理常用符号详解

1、@
一般在它之后紧跟一条命令或一条语句,则此命令或语句本身在执行的时候不会显示在屏幕上。请把下面的代码保存为test.cmd文件,然后运行,比较一下两条echo语句在屏幕上的输出差异:
echo a
@pause
@echo b
@pause
执行结果如下:
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续...
b
请按任意键继续...

2、%、%%
百分号用在不同的场合,有不同的含义:
① 当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%、%str%。把以下代码保存为批处理文件,运行后观察屏幕显示结果:
@echo off
set str=abc
echo 变量 str 的值是: %str%
pause
在屏幕上将显示这样的结果:
变量 str 的值是: abc
按任意键继续...
另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如%0、%1,其中,%0为脚本本身的名称,%1至%9为第二至九个参数...最多支持%0~%9,%10以后就是变量引用了,即%15为%1的值接上5。
请看演示代码:
@echo off
if defined str goto next
set str=
set /p str=请把文件拉到本窗口后回车:
call "%~0" %str%
pause
exit
:next
cls
echo 本批处理文件完整路径为:"%~0"
echo 拖到本窗口的文件完整路径为:"%~1"
goto :eof
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
例如:在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;如果保存为批处理文件,则此语句将略有改变:
@echo off
set /a num=4%%2
echo 4除以2的余数为 %num%
pause
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。例如:
@echo off
echo 一个百分号:%%
echo 两个百分号:%%%%
echo 三个百分号:%%%%%%
pause3、:、::
① 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
② 在 set 语句中:和~同时使用时,: 起到截取字符串的功能。假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;和=同时使用时,起到替换字符串的功能。假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;
4、~
① 用在 set 语句中,和:同时使用时,起到截取字符串的功能,请参考上一条的解释;
② 用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
③ 用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。

5、>、>>
一般而言,>表示用新内容覆盖原文件内容,>>表示向原文件追加内容,此时,它们以重定向符号的身份出现;如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位;

6、|
一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr "b",表示把echo abcd的执行结果,作为findstr "b" 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr "b" test.txt 具有同样的效果;

7、^
一般而言,^以转义字符的身份出现。因为在 cmd环境中,有些字符具备特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo >、echo | ……之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^,因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理;

8、&
一般而言,&表示两条命令或语句同时执行的意思。如 echo a&echo b,将在屏幕上同时显示a和b字符。当几条语句含义近似或作用相同且没有先后的顺序之别时,启用&符号连接这些语句将会增加程序的可读性;

9、&&、||
这是一对含义截然相反的命令符,&&表示如果它之前的语句成功执行,将执行它之后的语句,而||则表示如果它之前的语句执行失败,将执行它之后的语句;在某些场合,它们能替代 if……else…… 语句;例如:
@echo off
md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
pause
效果等同于如下代码:
@echo off
md test
if "%errorlevel%"=="0" (echo 成功创建文件夹test) else echo 创建文件夹test失败
pause

10、()
小括号对经常出现在for语句和if语句中,还有一些特定场合;在for和if语句中属于语句格式的要求,例如:
① for %%i in (语句1) do (语句2):在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、& &、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写;例如:
@echo off
for %%i in (a b c) do echo %%i&echo --------
pause
也可以改写为:
@echo off
for %%i in (a b c) do (
echo %%i
&echo --------
)
pause
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:
@echo off
if exist test.txt echo 当前目录下有test.txt
pause
@echo off
if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
pause
@echo off
if exist test.txt (echo 当前目录下有test.txt) else (
echo 当前目录下没有test.txt
pause
cls
echo 即将创建test.txt文件
cd.>test.txt&&echo 成功创建test.txt
)
pause
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:
@echo off
(
echo 第一行
echo 第二行
echo 第三行
)>test.txt
start test.txt
如果不使用括号对的话,则需要使用如下代码:
@echo off
echo 第一行>test.txt
echo 第二行>>test.txt
echo 第三行>>test.txt
start test.txt

11、+、-、、/
在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-3
4/5。需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)

12、equ、neq、lss、leq、gtr、geq
这几个命令符是if语句中常用到的数值比较符号,取自英文的关键字母,具体的含义为:
命令符号 含义 英文解释
EQU 等于 equal
NEQ 不等于 not equal
LSS 少于 less than
LEQ 少于或等于 less than or equal
GTR 大于 greater than
GEQ 大于或等于 greater than or equal

如何通过 apache VirtualHost 来设置多个虚拟主机

如何通过 apache VirtualHost 来设置多个虚拟主机(在本地 通过 apache VirtualHost 来设置虚拟主机

转载自 fc_lamp
最终编辑 fc_lamp

(多个域名指向同一个IP)

在开始之前,我们看看这个资料:

Apache 虚拟主机说明:
虚拟主机和分为两种:
1: 基与(ip)的虚拟主机
基于IP的虚拟主机使用链接的IP地址来决定相应的虚拟主机。
你就需要为每个主机设定一个独立的IP地址。

2:基与(域名)的虚拟主机
根据客户端提交的HTTP头中的关于主机名的部分决定的。
很多虚拟主机可以享用同一个IP地址。
具体使用:
你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址。
也就是添加(主机记录)。
然后配置你httpd 另其辨识不同的主机名就可以了。
基于域名的虚拟主机也可以缓解IP地址不足的问题。
基于域名的虚拟主机使用的模块。(core)
相关配置语法:
DocumentRoot
NameVirtualHost
ServerAlias
ServerName
ServerPath
VirtualHost
为了使用基于域名的虚拟主机,你必须指定服务器IP地址(和可能的端口)来使主机接受请求。
1、以用NameVirtualHost指令来进行配置。 如果服务器上所有的IP地址都会用到, 你可以用*作为NameVirtualHost的参数。
请注意,在NameVirtualHost指令中指明了IP地址并不会使服务器侦听那个IP地址。 这里设定的IP地址必须对应服务器上的一个网络接口。
2、下一步就是为你建立的每个主机设定<VirtualHost>配置块。
•VirtualHost>的参数与NameVirtualHost指令的参数是一样的 (比如说,一个IP地址,或是*代表的所有地址)。
•每个<VirtualHost>定义块中,至少都会有一个ServerName指令来指定伺服哪个主机和一个DocumentRoot指令来说明这个主机的内容存在于文件系统的什么地方。

以此来区别不同的虚拟主机。
什么情况不能用:
SSL protocol 决定了基于域名的虚拟主机无法成为SSL安全服务器。
操作系统和网络设备实现的带宽管理技术无法在主机共享一个IP的情况下区别它们。

以上信息来至:http://bbs.51cto.com/thread-23274-1-1.html

 

看了以上资料后,我们再来实现一下:首先这里由于我们只是在本地测试,所以我们的IP与域名的映射做法与提供商的不一样。

如果你的是WIN 操作系统,可这样做:

1 首先打开HOSTS文件:(你可以在 C:\WINDOWS\system32\drivers\etc 这个目录下找到它)

进行这样编辑:

127.0.0.1          www.one.com
127.0.0.1          www.two.com

这样做的原因在于:Windows系统会先检查自己的Hosts文件中是否有这个网络域名映射关系。如果有,则调用这个IP地址映射,如果没有,再向已知的DNS服务器提出域名解析。也就是说hosts文件实际上可以看成是一个本机的DNS系统,它可以负责把域名解释成IP地址,它的优先权比DNS服务器要高。

让具体你可以参考这篇文章《域名访问提示,域名纠错系统等问题如何解决》

2 在打开apache的config文件:一般情况下你可以在apache的安装目录(conf/)里找到 httpd.conf文件进行设置,也可能是在 conf/extra/httpd-vhosts.conf 文件里

然后进行这样编辑:

#这里默认是80端口

NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
DocumentRoot "这里是你的网站根目录"
ServerName www.one.com
</VirtualHost>
<VirtualHost 127.0.0.1>
DocumentRoot "这里是你的网站根目录"
ServerName  www.two.com
</VirtualHost>

 

然后:重启apache 就OK了