Smeagol's blog

Category: linux (page 1 of 2)

linux下的一些操作及配置

vim随手记

在普通模式下输入 gg=G 可以格式化文本,html也可以。“=”是缩进的意思,gg是回到文件顶部,G是到文件底部。
同理可得,ggVG为全选文件。

如果windows下ctrl+v是粘贴,要修改vim73/mswin.vim文件,去掉map <C-V>

多行注释的方法:

esc
0 跳到行首
ctrl+v 可视块模式
jjj 下移3行
I 进入插入模式
//
esc

我在vim里同时装了supertab和snipmate,在git上的snipmate已经解决了和supertab的冲突,就是按tab键时优先调用snipmate补全,然后是supertab。但是我现在想让snipmate绑定到其他热键上,比如空格键(个人习惯)。这样的话,supertab也会跟随snipmate被绑定到空格键上。修改方法:打开plus/snipmate.vim文件,找到TriggerSnippet函数,注释掉如下几行:

if exists(‘SuperTabKey’)

call feedkeys(SuperTabKey)

return ”

endif

然后还要将下面那行的 return “\<tab>” 改为 return “\<space>”

==========================分割线 一下为2011.10.24添加=============================

一般用cc来删除一行并进入“插入模式”,今天发现用S也可以,s也可以用来取代我经常使用xi来删除和插入。

gf这个命令相当神奇,用来打开光标下的文件,自动连接过去了,比如我们平时写html的时候,页面上引用了一些css和js文件,用这个命令可以直接打开它们。

此外还有让缓存区和系统剪切板互通的方法,就是用”+x或”+p后者从系统剪切板粘贴过来,前者剪切到系统剪切板。同理可以引申出很多新的用法,如将整行剪切“”+dd”,“vlll”+x”等等大家可以自己想哈。

#,*这两个键用于高亮当前光标所在单词。用来查找非常的方便。

^x^f 自动完成要输入的文件名,在html调用同目录或子目录的js和css文件很有用处。

^d,^t在插入状态下的缩进和不缩进,等同于普通模式的==。

关于gvim中使用zencoding的方法

这个东西郁闷了我很久,要记下来。

安装方法:只要把下载的压缩包解压到vimfile下就可以了(我是在windows中的)。

使用方法:打开gvim,按i键进入“插入”模式,输入html:5,然后这里很关键,官方说的快捷键是“<C-Y>,”,就是按ctrl+y 再按“,”(逗号键),但是他没说是不是一起按下去的。我一起按下去没效果。后来才发现,原来是要先ctrl+y一起按,编辑器的右下角会出来一个^y的字样,在这个字样消失前,按“,”就可以了。= =!!

用squid 2.7简单配置网页加速服务器(透明反向代理)

参考资料:
squid权威指南 (这里是2.5版的squid ,虽然是老版本的,但是是中文的,而且写的很好,对于概念的理解很有好处,不过一些配置方法已经了老了,不适用于现在的2.7稳定版了。)

squid配置案例 (这是官方的一些配置资料,是最新版的。但是全是英文的,英文好的朋友可以是直接看这里文档,里面都是一些配置实例。)

下面主要讲一下用squid 2.7 stable 版做透明反向代理,官方称Website Accelerator,这里有一些概念的问题,大家可以查看上面给出的squid权威指南。当squid用做透明反向代理的时候,占用的是服务器的80端口,而真正的web服务器会绑定在127.0.0.1:80 上。这里我用的是apache。之后讲到如何配置它。所以当客户端(浏览器)访问服务器时,先经过squid的缓存,然后再访问web服务器的。当然,如果squid和web服务器不在同一台服务器上,那么上面的127.0.0.1要改成web服务器的ip,而squid只做代理和缓存用。对于客户端来说,访问web服务器时和没有squid的效果是一样的,所以这里的squid是透明的,顾名思义。

具体配置方法:

操作系统:ubuntu server 10.04

安装squid很简单:

sudo apt-get install squid

找到squid的配置文件/etc/squid/squid.conf,大多数的配置都将在这个文件里。
我们先要打开代理端口,找到配置http_port 的地方(注释),插入如下配置:

http_port 192.168.0.252:80 accel defaultsite=127.0.0.1 vhost

192.168.0.252:80要改成你的本机ip
accel  告诉 squid 以web服务器的模式来接收发送过来的请求。
defaultsite=127.0.0.1 告诉squid 如果请求的域名不在代理之列,将发送127.0.0.1作为host header给真正的web服务器。127.0.0.1可改为其他的。如果web服务器上有很多的虚拟主机,那么vhost是被需要的。

接下来我们要告诉squid,哪里可以找到真正的web服务器。找到cache_peer的部分,插入如下配置:

cache_peer 127.0.0.1 parent 80 0 no-query originserver name=a

上面的127.0.0.1要改成真正的web服务器的ip,我这里用的是同一台服务器,所以这里是127.0.0.1 。name=a 这里a是名字,可以自己取,标志这命令的名称用,之后会有访问控制,要用到这里的名字。

下面我们定义访问控制,使上面的这些命令正常的工作。

acl to_localhost dst 127.0.0.1

acl是规则,to_localhost是规则名称,dst为目标地址,127.0.0.1你懂的。
大意为:以127.0.0.1为目标的请求。

再找到配置http_access的地方,插入:

http_access allow to_localhost

意思是允许to_localhost的http访问。

最后找到cache_peer_access的地方,插入如下配置:
cache_peer_access a allow to_localhost
cache_peer_access a deny all
这里的a,就是上面的定义的name=a 。意为:允许to_localhost访问被定义为a的缓存点(cache_peer),to_localhost就是上面的定义的目标为127.0.0.1的请求。经过这样定义,http访问被允许,缓存点(cache_peer)也被允许。

我们可以用同样的方式来定义源地址:
acl localnet src 192.168.0.0/16
http_access allow localnet
这样定义的话只有本地局域网内的机器可以访问squid。
默认的squid.conf已经有很多定义在里面的了,all表示所有地址,src表示源地址。
大家可以根据自己想要的来定义规则。

经过以上配置之后,http请求将经过squid缓存,再访问web服务器。下面讲下apache的配置。这里是以ubuntu为例,其他linux只要找到配置文

件的相应的位置既可:
找到/etc/apache2/ports.conf文件,将:
Listen 80 改为 Listen 127.0.0.1:80
这样apache就只监听回环地址的80端口了,不会和本机ip的80端口冲突。

调试squid的配置,可以不用重启squid,用下面命令:
squid -k parse (查看配置文件语法是否有误)
squid -k reconfigure (重新载入配置文件,即时生效)

好了,配置方法到这里就结束了,大家有什么问题可以在评论里留言。小弟才疏学浅,难免有表达不清的地方,还请大家指正。

debian 5 安装配置snmp 来监控

debian 5 装 snmp 很简单:

apt-get install snmpd 就可以了。

配置:
找到/etc/snmp/snmpd.conf 这个文件,然后找到

#com2sec paranoid  default         public

这行并且注释掉

再下面这行的注释去掉,并且用自己的字符替换掉****,默认是public :

com2sec readonly  default          *****

这里如果要用指定的ip来做监控的话,要把default改成指定的ip如:

com2sec readonly  0.0.0.0          *****

多个ip的,可以这样指定:

com2sec readonly  127.0.0.1          *****
com2sec readonly  192.168.1.10          *****

删除/etc/default/snmpd中,127.0.0.1   ,位于:

SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1′

然后重启snmpd

/etc/init.d/snmpd restart

.vimrc 文件,别人的,号称最强。(收藏之)


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Maintainer: amix the lucky stiff
" http://amix.dk - amix@amix.dk
"
" Version: 3.6 - 25/08/10 14:40:30
"
" Blog_post:
" http://amix.dk/blog/post/19486#The-ultimate-vim-configuration-vimrc
" Syntax_highlighted:
" http://amix.dk/vim/vimrc.html
" Raw_version:
" http://amix.dk/vim/vimrc.txt
"
" How_to_Install_on_Unix:
" $ mkdir ~/.vim_runtime
" $ svn co svn://orangoo.com/vim ~/.vim_runtime
" $ cat ~/.vim_runtime/install.sh
" $ sh ~/.vim_runtime/install.sh
" can be `mac`, `linux` or `windows`
"
" How_to_Upgrade:
" $ svn update ~/.vim_runtime
"
" Sections:
" -> General
" -> VIM user interface
" -> Colors and Fonts
" -> Files and backups
" -> Text, tab and indent related
" -> Visual mode related
" -> Command mode related
" -> Moving around, tabs and buffers
" -> Statusline
" -> Parenthesis/bracket expanding
" -> General Abbrevs
" -> Editing mappings
"
" -> Cope
" -> Minibuffer plugin
" -> Omni complete functions
" -> Python section
" -> JavaScript section
"
"
" Plugins_Included:
" > minibufexpl.vim - http://www.vim.org/scripts/script.php?script_id=159
" Makes it easy to get an overview of buffers:
" info -> :e ~/.vim_runtime/plugin/minibufexpl.vim
"
" > bufexplorer - http://www.vim.org/scripts/script.php?script_id=42
" Makes it easy to switch between buffers:
" info -> :help bufExplorer
"
" > yankring.vim - http://www.vim.org/scripts/script.php?script_id=1234
" Emacs's killring, useful when using the clipboard:
" info -> :help yankring
"
" > surround.vim - http://www.vim.org/scripts/script.php?script_id=1697
" Makes it easy to work with surrounding text:
" info -> :help surround
"
" > snipMate.vim - http://www.vim.org/scripts/script.php?script_id=2540
" Snippets for many languages (similar to TextMate's):
" info -> :help snipMate
"
" > mru.vim - http://www.vim.org/scripts/script.php?script_id=521
" Plugin to manage Most Recently Used (MRU) files:
" info -> :e ~/.vim_runtime/plugin/mru.vim
"
" > Command-T - http://www.vim.org/scripts/script.php?script_id=3025
" Command-T plug-in provides an extremely fast, intuitive mechanism for opening filesa:
" info -> :help CommandT
" screencast and web-help -> http://amix.dk/blog/post/19501
"
"
" Revisions:
" > 3.6: Added lots of stuff (colors, Command-T, Vim 7.3 persistent undo etc.)
" > 3.5: Paste mode is now shown in status line if you are in paste mode
" > 3.4: Added mru.vim
" > 3.3: Added syntax highlighting for Mako mako.vim
" > 3.2: Turned on python_highlight_all for better syntax
" highlighting for Python
" > 3.1: Added revisions ;) and bufexplorer.vim
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sets how many lines of history VIM has to remember
set history=700

" Enable filetype plugin
filetype plugin on
filetype indent on

" Set to auto read when a file is changed from the outside
set autoread

" With a map leader it's possible to do extra key combinations
" like w saves the current file
let mapleader = ","
let g:mapleader = ","

" Fast saving
nmap w :w!

" Fast editing of the .vimrc
map e :e! ~/.vim_runtime/vimrc

" When vimrc is edited, reload it
autocmd! bufwritepost vimrc source ~/.vim_runtime/vimrc

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => VIM user interface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Set 7 lines to the curors - when moving vertical..
set so=7

set wildmenu "Turn on WiLd menu

set ruler "Always show current position

set cmdheight=2 "The commandbar height

set hid "Change buffer - without saving

" Set backspace config
set backspace=eol,start,indent
set whichwrap+=<,>,h,l

set ignorecase "Ignore case when searching
set smartcase

set hlsearch "Highlight search things

set incsearch "Make search act like search in modern browsers
set nolazyredraw "Don't redraw while executing macros

set magic "Set magic on, for regular expressions

set showmatch "Show matching bracets when text indicator is over them
set mat=2 "How many tenths of a second to blink

" No sound on errors
set noerrorbells
set novisualbell
set t_vb=
set tm=500

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax enable "Enable syntax hl

" Set font according to system
if MySys() == "mac"
set gfn=Menlo:h14
set shell=/bin/bash
elseif MySys() == "windows"
set gfn=Bitstream\ Vera\ Sans\ Mono:h10
elseif MySys() == "linux"
set gfn=Monospace\ 10
set shell=/bin/bash
endif

if has("gui_running")
set guioptions-=T
set t_Co=256
set background=dark
colorscheme peaksea
set nonu
else
colorscheme zellner
set background=dark

set nonu
endif

set encoding=utf8
try
lang en_US
catch
endtry

set ffs=unix,dos,mac "Default file types

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Files, backups and undo
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git anyway...
set nobackup
set nowb
set noswapfile

"Persistent undo
try
if MySys() == "windows"
set undodir=C:\Windows\Temp
else
set undodir=~/.vim_runtime/undodir
endif

set undofile
catch
endtry

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set expandtab
set shiftwidth=4
set tabstop=4
set smarttab

set lbr
set tw=500

set ai "Auto indent
set si "Smart indet
set wrap "Wrap lines

""""""""""""""""""""""""""""""
" => Visual mode related
""""""""""""""""""""""""""""""
" Really useful!
" In visual mode when you press * or # to search for the current selection
vnoremap * :call VisualSearch('f')
vnoremap # :call VisualSearch('b')

" When you press gv you vimgrep after the selected text
vnoremap gv :call VisualSearch('gv')
map g :vimgrep // **/*.

function! CmdLine(str)
exe "menu Foo.Bar :" . a:str
emenu Foo.Bar
unmenu Foo
endfunction

" From an idea by Michael Naumann
function! VisualSearch(direction) range
let l:saved_reg = @"
execute "normal! vgvy"

let l:pattern = escape(@", '\\/.*$^~[]')
let l:pattern = substitute(l:pattern, "\n$", "", "")

if a:direction == 'b'
execute "normal ?" . l:pattern . "^M"
elseif a:direction == 'gv'
call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.')
elseif a:direction == 'f'
execute "normal /" . l:pattern . "^M"
endif

let @/ = l:pattern
let @" = l:saved_reg
endfunction

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Command mode related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Smart mappings on the command line
cno $h e ~/
cno $d e ~/Desktop/
cno $j e ./
cno $c e eCurrentFileDir("e")

" $q is super useful when browsing on the command line
cno $q eDeleteTillSlash()

" Bash like keys for the command line
cnoremap
cnoremap
cnoremap

cnoremap
cnoremap

" Useful on some European keyboards
map ½ $
imap ½ $
vmap ½ $
cmap ½ $

func! Cwd()
let cwd = getcwd()
return "e " . cwd
endfunc

func! DeleteTillSlash()
let g:cmd = getcmdline()
if MySys() == "linux" || MySys() == "mac"
let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*", "\\1", "")
else
let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\]\\).*", "\\1", "")
endif
if g:cmd == g:cmd_edited
if MySys() == "linux" || MySys() == "mac"
let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*/", "\\1", "")
else
let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\\]\\).*\[\\\\\]", "\\1", "")
endif
endif
return g:cmd_edited
endfunc

func! CurrentFileDir(cmd)
return a:cmd . " " . expand("%:p:h") . "/"
endfunc

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Moving around, tabs and buffers
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Map space to / (search) and c-space to ? (backgwards search)
map /
map ?
map :noh

" Smart way to move btw. windows
map j
map k
map h
map l

" Close the current buffer
map bd :Bclose

" Close all the buffers
map ba :1,300 bd!

" Use the arrows to something usefull
map :bn
map :bp

" Tab configuration
map tn :tabnew
map te :tabedit
map tc :tabclose
map tm :tabmove

" When pressing cd switch to the directory of the open buffer
map cd :cd %:p:h

command! Bclose call BufcloseCloseIt()
function! BufcloseCloseIt()
let l:currentBufNum = bufnr("%")
let l:alternateBufNum = bufnr("#")

if buflisted(l:alternateBufNum)
buffer #
else
bnext
endif

if bufnr("%") == l:currentBufNum
new
endif

if buflisted(l:currentBufNum)
execute("bdelete! ".l:currentBufNum)
endif
endfunction

" Specify the behavior when switching between buffers
try
set switchbuf=usetab
set stal=2
catch
endtry

""""""""""""""""""""""""""""""
" => Statusline
""""""""""""""""""""""""""""""
" Always hide the statusline
set laststatus=2

" Format the statusline
set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{CurDir()}%h\ \ \ Line:\ %l/%L:%c

function! CurDir()
let curdir = substitute(getcwd(), '/Users/amir/', "~/", "g")
return curdir
endfunction

function! HasPaste()
if &paste
return 'PASTE MODE '
else
return ''
endif
endfunction

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1 `>a)`
vnoremap $2 `>a]`
vnoremap $3 `>a}`
vnoremap $$ `>a"`
vnoremap $q `>a'`
vnoremap $e `>a"`

" Map auto complete of (, ", ', [
inoremap $1 ()i
inoremap $2 []i
inoremap $3 {}i
inoremap $4 {o}O
inoremap $q ''i
inoremap $e ""i
inoremap $t <>i

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Abbrevs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
iab xdate =strftime("%d/%m/%y %H:%M:%S")

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map 0 ^

"Move a line of text using ALT+[jk] or Comamnd+[jk] on mac
nmap mz:m+`z
nmap mz:m-2`z
vmap :m'>+`mzgv`yo`z
vmap :m'<-2`>my`

if MySys() == "mac"
nmap
nmap
vmap
vmap
endif

"Delete trailing white space, useful for Python ;)
func! DeleteTrailingWS()
exe "normal mz"
%s/\s\+$//ge
exe "normal `z"
endfunc
autocmd BufWrite *.py :call DeleteTrailingWS()

set guitablabel=%t

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Cope
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Do :help cope if you are unsure what cope is. It's super useful!
map cc :botright cope
map n :cn
map p :cp

""""""""""""""""""""""""""""""
" => bufExplorer plugin
""""""""""""""""""""""""""""""
let g:bufExplorerDefaultHelp=0
let g:bufExplorerShowRelativePath=1
map o :BufExplorer

""""""""""""""""""""""""""""""
" => Minibuffer plugin
""""""""""""""""""""""""""""""
let g:miniBufExplModSelTarget = 1
let g:miniBufExplorerMoreThanOne = 2
let g:miniBufExplModSelTarget = 0
let g:miniBufExplUseSingleClick = 1
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplVSplit = 25
let g:miniBufExplSplitBelow=1

let g:bufExplorerSortBy = "name"

autocmd BufRead,BufNew :call UMiniBufExplorer

map u :TMiniBufExplorer

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Omni complete functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd FileType css set omnifunc=csscomplete#CompleteCSS

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Pressing ,ss will toggle and untoggle spell checking
map ss :setlocal spell!

"Shortcuts using
map sn ]s
map sp [s
map sa zg
map s? z=

""""""""""""""""""""""""""""""
" => Python section
""""""""""""""""""""""""""""""
let python_highlight_all = 1
au FileType python syn keyword pythonDecorator True None False self

au BufNewFile,BufRead *.jinja set syntax=htmljinja
au BufNewFile,BufRead *.mako set ft=mako

au FileType python inoremap $r return
au FileType python inoremap $i import
au FileType python inoremap $p print
au FileType python inoremap $f #--- PH ----------------------------------------------FP2xi
au FileType python map 1 /class
au FileType python map 2 /def
au FileType python map C ?class
au FileType python map D ?def

""""""""""""""""""""""""""""""
" => JavaScript section
"""""""""""""""""""""""""""""""
au FileType javascript call JavaScriptFold()
au FileType javascript setl fen
au FileType javascript setl nocindent

au FileType javascript imap AJS.log();hi
au FileType javascript imap alert();hi

au FileType javascript inoremap $r return
au FileType javascript inoremap $f //--- PH ----------------------------------------------FP2xi

function! JavaScriptFold()
setl foldmethod=syntax
setl foldlevelstart=1
syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend

function! FoldText()
return substitute(getline(v:foldstart), '{.*', '{...}', '')
endfunction
setl foldtext=FoldText()
endfunction

""""""""""""""""""""""""""""""
" => MRU plugin
""""""""""""""""""""""""""""""
let MRU_Max_Entries = 400
map f :MRU

""""""""""""""""""""""""""""""
" => Command-T
""""""""""""""""""""""""""""""
let g:CommandTMaxHeight = 15
set wildignore+=*.o,*.obj,.git,*.pyc
noremap j :CommandT
noremap y :CommandTFlush

""""""""""""""""""""""""""""""
" => Vim grep
""""""""""""""""""""""""""""""
let Grep_Skip_Dirs = 'RCS CVS SCCS .svn generated'
set grepprg=/bin/grep\ -nH

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remove the Windows ^M - when the encodings gets messed up
noremap m mmHmt:%s///ge'tzt'm

"Quickly open a buffer for scripbble
map q :e ~/buffer
au BufRead,BufNewFile ~/buffer iab xh1 ===========================================

map pp :setlocal paste!

map bb :cd ..

ubuntu 10.04下装fcitx显示乱码方块,网上很多文章都没用。

是的,今天在网上找了一大堆文章,都是同一篇都不能解决问题,都是把gbk格式的config文件转换成utf-8的文件,但是这样转换以后,fcitx就打不开了,会显示error: invalid configure group name  .    所以不能把他转换掉,只要用gedit 打开config文件,然后把中文字体那行的*号,改成系统里有的就可以了。我装过AR PL UMing CN 所以我填这个。你可以在firefox里看有那些字体可用,编辑-》首选项了。

Facebook后台技术探秘

转载自——Facebook后台技术探秘.

今天我们一起来了解Facebook背后的软件,看看作为当今世界上访问量最大的网站之一,Facebook是如何保证5亿用户的系统一直稳定可靠的运行。

Facebook的扩展性挑战

在我们讨论细节之前,这里有一些Facebook已经做的软件规模:

  • Facebook有570000000000每月页面浏览量 (据Google Ad Planner)
  • Facebook的照片量比其他所有图片网站加起来还多(包括Flickr等网站)
  • 每个月超过30亿张照片被上传
  • Facebook的系统服务每秒处理120万张照片,这不包括CDN服务中处理的照片
  • 每月超过25亿条的内容 (状态更新,评论等)被共享
  • Facebook有超过30,000服务器(这个数字是去年的)


Facebook扩展所依赖的软件

Facebook是在某些程度上说仍然是LAMP的站点,但它比普通的LAMP大得多,以纳入其他元素和很多服务,并修改现行的做法。

例如:

  • Facebook仍使用PHP,但它已经为它建立一个编译器,以便它可以分为本地代码打开了Web服务器,从而提高性能。
  • Facebook使用Linux,但他特别为网络吞吐量做了优化。
  • Facebook使用MySQL,但主要是作为一个Key-value的持久性存储,Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。

还有是自编写的系统,如Haystack,一个高度可扩展的对象存储,用来存储Facebook的照片。还有Scribe,一个日志系统,可以运行在Facebook的巨大规模上的日志系统。

现在我们介绍一下全球最大的社会网络网站的所使用的软件吧。

Memcached

memcached的是现在互联网最有名的软件之一了。 这是一个分布式内存缓存系统,用来作为Web服务器和MySQL服务器之间的缓存层(因为数据库访问比较慢)。 多年以来,Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。

Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。

HipHop for PHP

PHP作为一种脚本语言,和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C++代码,然后再进行编译,可以获得更好的性能。 因为Facebook严重依赖PHP,这使得其可以让Web服务器运行的更有效率。

一个工程师小团队在Facebook(一开始只有三人)花了18个月时间开发HipHop,现在已经是可用状态。

Haystack

Haystack是Facebook的高性能照片存储/检索系统(严格来说,是一个对象存储,因此它并不一定要存储照片)。 它有许多工作要做;有超过20亿张上传的照片,并且每一个被保存在四个不同的分辨率,因此有超过800亿张照片。

它不仅是对能够处理的上亿的照片,运行表现也是至关重要的。 正如我们前面提到的,Facebook的服务约120万张照片每秒 ,这个数字不包括CDN上的。 这是一个惊人的数字。关于Facebook的图片存储请参考51CTO之前的报道《Facebook图片存储架构技术全解析》。

BigPipe

BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页,以获取最佳性能。

例如,在聊天窗口是分开的,新闻Feed也是分开的,等等。 这些pagelets可以在一个页面表现的时候同时使用,这是该页面表现的时候获取进来的。即使某些工程的一部分关闭或中端,用户也可以获得一部分网页。

Cassandra

Cassandra是一个不会单点失败的分布式存储系统。 这是为NoSQL运动的一个重要组成部分,并已公开的源代码(它甚至成为一个Apache项目)。Facebook在搜索功能中使用它。

除了Facebook,还有一些人也用它,例如Digg的。 不过最近Twitter放弃了Cassandra。关于Cassandra的更多介绍可以参考51CTO的专题《奔向自由?Cassandra数据库应用指南》。

Scribe

Scribe是一个灵活的日志系统,Facebook在他的内部大量使用。 它的能够处理在Facebook的大规模日志记录,并自动处理新的日志记录类别,Facebook有数百个日志类别(categories)。

Hadoop and Hive

Hadoop的是一个开源的map-reduce实现,使得它可以在进行大数据上进行运算。 Facebook的使用这个进行数据分析(而我们都知道,Facebook已经大量的数据)。 Hive就是发源于Facebook,使得对于Hadoop使用的SQL查询成为可能,从而是其更容易对非程序员使用。

Hadoop和Hive是开源的(Apache项目),有为数众多的追随者,例如雅虎和Twitter。

Thrift

Facebook使用的几种不同的语言和不同的services。 PHP是最终用于前端,Erlang是用于聊天,Java和C ++也使用于多种场所,也许还有其他语言。Thrift是一个内部开发的跨语言的框架,联系语言,使他们可以在一起合作,从而使他们之间可以交互。 这使得Facebook可以更容易为继续保持其跨语言的发展。

Facebook已经让Thrift开源。更多的语言支持已被添加到Thrift。

Varnish

Varnish是一个HTTP加速器,可以作为一个负载平衡器,并缓存的内容,然后可以以闪电般的速度送达。

Facebook使用的arnish来处理照片和个人资料图片,处理每天数十亿的要求。 和其他的东西一样,Varnish是开源的。

保持Facebook 顺畅运行的其他东西

我们已经提到的软件,组成了Facebook的系统,并帮助运行在大规模上。 但是,处理这么大的系统是一个复杂的任务,因此我们将列出一些其他的东西,他们保持了Facebook的平稳运行。

渐进发布和暗启动

Facebook有一个他们所谓的守门人制度(Gatekeeper),允许他们可以给不同的用户运行两套不同的系统。 这让Facebook渐进的发布新的功能,A / B测试,只为Facebook雇员发布等的某些特性。

Gatekeeper也可以让Facebook实现“暗启动”,这是在用户使用一些功能之前,就激活某些功能(因为用户没有察觉,所以称之为暗启动)。 这将作为一个现实世界的压力测试,在正式启动前,帮助揭露一些功能障碍和其他问题。 暗启动通常是在正式启动前两个星期。

Profiling的直播系统

Facebook的仔细监控其系统,有趣的是它也负责监察每一个PHP函数在生产环境的性能。 检测各个PHP的环境的配置运行情况。使用开源工具,XHProf 。

渐进的利用关闭功能来提升性能

如果Facebook运行时出现性能问题,有一个办法,就是逐步禁用不太重要的功能,以增强Facebook的大量核心功能表现。

我们没有提及的事情

我们没有提到硬件相关的事情,但这也是提高可伸缩性的重要一环。例如,就像其他大型站点,Facebook利用CDN来处理静态内容。 Facebook还有一个the huge data center,可以帮助他扩展更多的服务。

Facebook的开源情节

不仅是Facebook使用(和帮助),如Linux,Memcached的,MySQL和Hadoop的开源软件,以及许多其他情况下,也贡献许多了其内部开发的软件。

Facebook亦开源了Tornado,一个高性能的网络服务器框架,由FriendFeed团队开发。关于开放源码软件清单,可以在 Facebook’s Open Source page.找到。

debian5装flashplayer

今天这个折腾的比较久,要记一下。
debian 5 lenny 安装 flashplayer的插件
浏览器是iceweasel,官方下载的tar包。解压以后只有一个文件libflashplayer.so。
要新建一个目录
mkdir ~/.mozilla/plugins
然后把这个文件放这个目录下。

引用 [转]windos下putty远程登陆linux

 引用

黎明傲子[转]windos下putty远程登陆linux

windows登陆远程Linux主机的一种途径putty-详细安装使用过程

作者:gliethttp

如果你打算在windows下访问另外一台装有Linux的机子,那么推荐使用putty
SSH提供两种级别的安全验证: 一是基于口令的安全验证。只要用户知道自己账号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证用户正在连接的服务器就是用户想连接的服务器。可能会有别的服务器在冒充真正的服务器,这存在着潜在的威胁。二是基于密匙的安全验证。需要依靠密匙,也就是用户必须为自己创建一对公匙/密钥对,并把公用密匙放在需要访问的服务器上。如果需要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求使用用户的密匙进行
安全验证。服务器收到请求之后,先在服务器上用户的主目录下找到该用户的公用密匙,然后把它和用户发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询”之后就可以用用户的私人密匙解密再把它发送给服务器。

一、通过方式一:口令认证登陆
1、打开putty.exe
   1)、Session –> Host Name (填写服务器地址或者域名,如:192.168.0.250s)
   如果远程主机存在提示如下:
   login as: root
  
root@192.168.0.250’s password:
   正确输入密码后即可正常登陆远程Linux主机
(注意:
     远程Linux主机的/etc/ssh/sshd_config配置文件
     PasswordAuthentication 必须为 yes
     修改后/etc/init.d/sshd reload #加载修改后的配置文件并生效
   )
二、通过方式二:密匙认证登陆
方案一:使用puttygen.exe生成的密匙
1、用puttygen.exe生成一对密匙
   1)、打开puttygen.exe,直接点击Generate,鼠标在Key区空白的位置频繁的晃动
       加快随机数的产生,这样几秒钟就可以生成我们需要的密匙
   2)、点击Save public key->id_rsa.pub(保存密匙)
       因为puttygen.exe生成的格式和Linux系统使用的key格式不同,需要对生成的数据作些简单的修改:
       比如源数据:
       —- BEGIN SSH2 PUBLIC KEY —-
       Comment: “rsa-key-gliethttp”
       AAAAB3NzaC1yc2EAAAABJQAAAIEAg2Nx1dBZBypLXY1S78plfmPmwlQj1Ckuoz8o
       4vAWjJfOy3i6t2+o7aZMbGN+yUbQY5ScyJu3bK7Wg3ZxXP6qps14J2CAXbdrT9VH
       2AA3FIOgbLHii7Bwmjkr5+hVYp7Vazm7cPsGpKnmCWihqX7rkQdY7xq3mOCJI3ry
       Nnfkrh0=
       —- END SSH2 PUBLIC KEY —-
       修改成:(我使用的Linux主机名为gliethttp)  
       ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAg2Nx1dBZBypLXY1S78plfmPmwlQj1Ckuoz8o4vAWjJfOy3i6t2+
      o7aZMbGN+yUbQY5ScyJu3bK7Wg3ZxXP6qps14J2CAXbdrT9VH2AA3FIOgbLHii7Bwmjkr5+hVYp7Vazm7cPsGpK
       nmCWihqX7rkQdY7xq3mOCJI3ryNnfkrh0=
root@gliethttp
      (注意:修改后的数据不能有回车换行)
   3)、将生成的id_rsa.pub拷贝到远程主机gliethttp的/root/.ssh上
       重命名为authorized_keys
       [root@gliethttp root]#cd .ssh
       [root@gliethttp .sh]#mv id_rsa.pub authorized_keys
       这样sshd服务程序当接收到远程客户端的连接申请时会自动匹配.ssh/authorized_keys文件中的密匙
   4)、点击Save private key->id_rsa.ppk(保存私钥)
       如果安全级别不是很苛刻,可以不设置Key passphrase
2、打开putty.exe
   1)、Session –> Host Name (填写服务器地址或者域名)
   2)、Connection –> SSH –> Auth (点Browse选择刚生成的id_rsa.ppk)
   3)、open
   成功打开后出现如下提示:
   login as: root
   Authenticating with public key “imported-openssh-key”
方案二:使用Linux主机生成的密匙
1、生成密匙
   [root@gliethttp .ssh]#ssh-keygen -t rsa
   Generating public/private rsa key pair.
   Enter file in which to save the key (/root/.ssh/id_rsa):
   Enter passphrase (empty for no passphrase):
   Enter same passphrase again:
   Your identification has been saved in /root/.ssh/id_rsa.
   Your public key has been saved in /root/.ssh/id_rsa.pub.
   The key fingerprint is:
   e4:9a:47:a7:b4:8a:0b:98:07:b8:70:de:6b:16:2c:0c
root@gliethttp
2、将/root/.ssh/id_rsa.pub改名为/root/.ssh/authorized_keys
   [root@gliethttp .ssh]#mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
3、将私钥id_rsa拷贝到远程客户端
   1)、如果远程客户端是linux,拷贝到远程客户端/root/.ssh/即可
   2)、putty作为远程客户端在
       putty不能识别直接从服务器拷贝来的私钥,需要使用puttygen.exe进行格式转换
      (1)、打开puttygen.exe –> Conversions –> Import Key
      (2)、选择拷贝过来的私钥文件id_rsa
      (3)、Save private key->id_rsa.ppk(保存私钥)
4、打开putty.exe
   1)、Session –> Host Name (填写服务器地址或者域名)
   2)、Connection –> SSH –> Auth (点Browse选择刚生成的id_rsa.ppk)
   3)、open
   成功打开后出现如下提示:
   login as: root
   Authenticating with public key “imported-openssh-key”
  
   —————————————————————
   如果我们只希望有私钥的远程客户机才能通过ssh登陆本主机,那么
   远程Linux主机的/etc/ssh/sshd_config配置文件
   PasswordAuthentication 改为 no
   修改后/etc/init.d/sshd reload #加载修改后的配置文件并生效
   这样其他远程客户端如果没有私钥,那么这些用户连输入密码的机会都没有,就会被本主机直接断开
   ***************************************************************
   注意:
   如果putty.exe不能登陆远程主机,请查看如下几个选项是否符合:
   1)、远程主机的防火墙是否关闭,通过如下指令关闭防火墙:
       [root@gliethttp root]#/etc/init.d/ip
tables stop
   2)、远程主机是否启动sshd,通过如下指令启动:
       [root@gliet
http root]#/etc/init.d/sshd start
   ***************************************************************
  
   putty.exe和puttygen.exe工具下载地址:
  
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

 

开始桌面的体验

     昨天又心血来潮玩弄起linux来,听说有个文泉驿正黑的字体不错,于是就装来看看。和平常一样,我apt-get install ttf-wqy-zenhei,却发现cn99的源已经不能用了,没办法去官方找吧。现在用的是杭州的一个双线的源。装好后发现,ati显卡驱动的控制面板已经正常显示中文了,原先的中文都是方块。其实官方的wiki里有很多好的文章,都是一些常见的问题,只要仔细阅读就能解决很多的问题。接下来装个mp3播放器,apt-get install audacious,然后下载一首歌曲来测试一下。不能播放?。audacious的首选项里有个音频,把里面“当前的输出插件”选择alsa,声音出来了。可播放列表里中文还是乱码的。还是首选项里面-》播放列表-》元数据,“使用自动编码检测器”选“chinese”,备用字符编码填“GBK”,这样中文也能正常显示了。接下来打算下载部电影来看,apt-get install mplayer w64codecs,编码器和播放器一起装上。下载了部rmvb电影测试,一切正常。qq原来已经装了的,现在基本上和windows差不多了。就缺一个office。

Olderposts

Copyright © 2017 Smeagol's blog

Theme by Anders NorenUp ↑