>"Do not judge, so that you may not be judged. For with the judgement you make you will be judged, and the measure you give will be the measure you get." (MATTHEW 7:1-2) #é®åä¸ç æç §ä½å®¶é©å¯ç说æ³ï¼è¿ä¸ªä¸çåå¨ä¸¤ç§é»è¾ï¼ä¸ç§æ¯é»è¾ï¼å¦å¤ä¸ç§æ¯ä¸å½é»è¾ãä¸å½ç±äºâç¹è²âï¼è·ä¸çæ¯ä¸åçãå¨ç½ç»ä¸ï¼ä¹æ¯å¦æ¤ï¼ä¸ççç½ç»åä¸å½çç½ç»æå¾å¤§ä¸åï¼ä¸ç¨å¤è¯´ï¼çå®åºè¯¥ä½ä¼å°äºãé£ä¹ï¼æè¿éçæ é¢æ¯âé®åä¸çâï¼å°±å½ç¶ä¸å æ¬ä¸å½äºã å·²ç»ç¨Tornadoå¯ä»¥å¨èªå·±çè®¡ç®æºä¸åå¸ç½ç«äºï¼ä¹å°±æ¯è½å¤å¨èªå·±è®¡ç®æºçæµè§å¨å°åæ ä¸è¾å ¥`http://localhost:8000`ï¼æ¾ç¤ºé£ä¸ªHelloï¼è¿ä» ä» æ¯åèªå·±é®åäºã妿è¦åä¸çé®åï¼å°±éè¦æè¿ä¸ªé£ä¸ªç¨åºæ¾å°è¿æ¥å°äºèç½çæå¡å¨ä¸ã å¨ç½ä¸ï¼æå¾å¤æä¾æå¡å¨ç§èµæå¡çå ¬å¸ï¼å¯ä»¥è´ä¹°èæç©ºé´ãVPSï¼ç°å¨æ¯è¾æ¶é«¦çå°±æ¯è´ä¹°äºæå¡ä¸»æºçï¼å½ç¶ï¼æé±çå°±èªå·±ä¹°æå¡å¨ç¡¬ä»¶è®¾å¤ï¼ç¶åèªå·±å»ºç«æºæ¿äºãæè¿éæ¼ç¤ºç»è¯¸ä½çï¼ä¸æ¯ä¸é¢è¿äºï¼æ¯æç §ç©·äººçæè·¯æ¥è§£å³é®é¢ã Googleæ¯ä¼å¤§çï¼è°è¦ä¸è®¤åï¼æå°±è·è°æ¥ãé¤äºå ä¸ºå®æ¯ä¸ä¸ªå¥½çæç´¢å¼æä¹å¤ï¼è¿å 为å®ç»ææä¾äºå è´¹çGAEãä»ä¹æ¯GAEï¼GAEå°±æ¯Google App Engineï¼ç»´åºç¾ç§ä¸è¿æ ·è¯´çï¼ >Google App Engineæ¯ä¸ä¸ªå¼åãæç®¡ç½ç»åºç¨ç¨åºçå¹³å°ï¼ä½¿ç¨Google管ççæ°æ®ä¸å¿ãå®å¨2008å¹´4æåå¸äºç¬¬ä¸ä¸ªbetaçæ¬ã >Google App Engine使ç¨äºäºè®¡ç®ææ¯ãå®è·¨è¶å¤ä¸ªæå¡å¨åæ°æ®ä¸å¿æ¥èæååºç¨ç¨åºã[1] å ¶ä»åºäºäºçå¹³å°è¿æAmazon Web Serviceså微软çAzureæå¡å¹³å°çã >Google App Engineå¨ç¨æ·ä½¿ç¨ä¸å®çèµæºæ¶æ¯å è´¹çãæ¯ä»é¢å¤çè´¹ç¨å¯ä»¥è·å¾åºç¨ç¨åºæéçæ´å¤çåå¨ç©ºé´ãå¸¦å®½ææ¯CPUè´è½½ã ç宿³¨æäºï¼ä¸é¢é£è¯±äººçâå è´¹âï¼å°½ç®¡ææéå¶ï¼ä½æ¯ï¼å·²ç»è¶³å¤ä¸è¬ç¨æ·ä½¿ç¨äºï¼ä¸é¢æ¯å è´¹å 容ï¼ççæ¯ä¸æ¯è¶³å¤æ ·æ ¨äºåã |é¡¹ç® | é é¢| |-----|-------| |æ¯å¤©çEmailæ°é | 100å°| |æ¯å¤©çè¾å ¥æ°æ® | æ é| |æ¯å¤©çè¾åºæ°æ® | 1 GB| |æ¯å¤©å¯ä½¿ç¨CPU | 28å°æ¶| |æ¯å¤©è°ç¨Datastore APIæ¬¡æ° | 50000次| |æ°æ®åå¨ | 1 GB| |æ¯å¤©è°ç¨URLFetch APIæ¬¡æ° | 657000次| å¦æä½ åä¸ä¸ªç½ç«ï¼è¶ è¿äºä¸é¢çå è´¹é é¢ï¼è¯´æä½ çç½ç«å·²ç»ä¸å°äºãä¹è½å¤æ£é±æè æ¾é£é©æèµäºãä¸å½çäºèç½ä¸ï¼å°æªè§å°å¦æ¤æ ·æ ¨çï¼è½ç¶ä¹æèªå¹èªæçå ¬å¸ã 请ç宿³¨æï¼è¿ä¸ªæå¡åªè½å¨ä¸çèå´å 使ç¨ï¼ç±äºä½ ç¥éåä¸ç¥éçåå ï¼å¨ä¸å½ä¸è½ä½¿ç¨ãå½ç¶ï¼è¦ç«å¿åä¸ä¸ªä¼ç§ç¨åºåçï¼ä¸å®è¦è½å¤è¿å ¥ä¸çèå´ã **欲è¿å ¥ä¸çï¼å¿ ç§å¦ä¸ç½** å¦åï¼ä»å¤©è¿ä¸è®²çå®å°±æ æ³å¦ä¹ ã ##宿¹ç½ç« å¨è¿å ¥å¦ä¹ ä¹åï¼è¯·çå®ç»å½GAE宿¹ç½ç«æµè§ï¼https://cloud.google.com/appengine/docs?hl=zh-cn ç®åGAEæ¯æä½¿ç¨çè¯è¨æï¼Java,Python,PHP,Go æå¨è¿éå½ç¶æ¯ä½¿ç¨pythonäºãè½ç¶ï¼æä¹å欢PHPã 妿çå®èªå·±æè½åé è¯»ææ¡£ï¼ç´æ¥å¨è¯¥ç½ç«ä¸é 读ï¼å°±è½å¤å¦ä¼å¦ä½ä½¿ç¨GAEäºï¼ä¸å¿ çæä¸é¢çå°å¦ãæè®¤ä¸ºGAEç½ç«ä¸è®²çå¾å¥½äºãä¸è¿ï¼å°±æ¯æä¸ç¹ä¸è¶³ï¼ç¼ºå°è¶£å³æ§ã妿è¦äº«åè¡æ¯çä¸è¥¿ï¼å°±çæç课ç¨å¦ã ##注å å¨ä¸é¢çGAE宿¹ææ¡£ä¸ï¼çå°ä¸é¢å¾çä¸ç`Try it now`æé®ï¼ç¹å®ï¼è¿å ¥ä¸ä¸ä¸ªçé¢ã  è¿å ¥çæ°é¡µé¢ä¸ï¼å¼å¤´æè¿æ ·ä¸æ®µã >Try Google App Engine Now >Creating an App Engine app is easy, and it's free to start. Upload your app and share it with users right away, at no charge and with no commitment required. çä¸é¢çå¾  é¦å ç»èªå·±çç½ç«åä¸ä¸ªååï¼å½ç¶è¿ä¸ªåå以åè¿å¯ä»¥ä¿®æ¹å¢ã ç¶åï¼å¨åç§è¯è¨ä¸éæ©ä¸ç§ï¼ä¸å®è¦épythonï¼éå«çä¸è·ä½ ç©äºã é好ä¹åï¼çç¬¬ä¸æ¥ï¼å¦ä¸å¾ãå ¶å®æ¯ä¸ä¸ªä¾åç½¢äºãä¸è¿ï¼ä¸æ¯ç¨tornadoæ¡æ¶çã  ##ä¸è½½SDK ä¸è½½SDKï¼çæä½ç³»ç»ï¼ä¸åçæä½ç³»ç»æä¸åçä¸è½½å®è£ æ¹æ³ãå¦ä¸ä¸¤å¾æç¤ºä¸ï¼é½è¯´æäºå®è£ æµç¨ã   æçæä½ç³»ç»æ¯ubuntuï¼å°±éæ©æç §ä¸é¢é£å¼ å¾çæ¹å¼å®è£ ãç¹å«æéï¼ä¸å®è¦è®©ä½ çè®¡ç®æºç¨VPNç§å¦ä¸ç½ï¼æè½å®ç°ä¸é¢çå®è£ æµç¨ã 仿°æå¼ä¸ä¸ªshell, æç §ä¸é¢è¦æ±ï¼è¾å ¥`curl https://sdk.cloud.google.com/ | bash`ï¼å©ä¸çäºæ å°±æ¯æ ¹æ®shellä¸æç¤ºçä¿¡æ¯åä¸è¿è¡äºãå®è¦è¯¢é®æ¯å¦éè¦å¸®å©çæ¶åï¼å°±è¾å ¥yï¼ç¶åéæ©è¯è¨ï¼2ï¼æ¯python and phpï¼ä¹å°±æ¯æç §è¿ç§æ¹æ³å®è£ çSDKæ¯pythonåphp两è é½å¯ä»¥ä½¿ç¨çï¼ï¼è¿è¦è¾å ¥ä¸ä¸ªæ¾ç½®SDKæä»¶çç®å½åç§°ãä¹åï¼ç³»ç»å°±èªå¨å°google-cloud-sdkä¸çå¾å¤ä¸è¥¿ï¼æ¾å°æå®ç®å½ä¸äºãå¨å®è£ è¿ç¨ä¸ï¼è¿ä¼è¯¢é®å·¥ä½ç¯å¢ï¼ä¸ä¿®æ¹ç¨èªå¨è®¾ç½®çï¼ç®åå°å车å³å¯ã 妿ç½ç»å·®ç¹ï¼éè¦çå¾ ä¸æ®µæ¶é´ãæç»å¨ä½ æå®çç®å½ä¸ä¼æä¸ä¸ªgoogle-cloud-sdkç®å½ï¼æè¦å®è£ çå å®¹å ¨å¨éé¢äºã è¿å¯ä»¥å°ï¼https://cloud.google.com/appengine/downloads?hl=zh-cn ä¸è½½ï¼è¿ä¸ªé¡µé¢ä¹æå®è£ 帮å©ãå®è£ æ¹æ³å¯ä»¥æ¯ï¼ 1. å°ä¸è½½çæä»¶è§£åï¼å¹¶åå¨å°æ¬å°è®¡ç®æºä¸çæä¸ªç®å½å ï¼æ¯å¦æå¨åé¢å®è£ çæ¶åï¼å°±ä¸ªæ¾ç½®google-cloud-sdkçç®å½å½å为GAEPythonï¼è¿éæè¯´çç®å½ï¼å°±è·åé¢çæè½ä¸æ ·ã 2. 设置æ¬ç¨æ·çå·¥ä½ç¯å¢ï¼å°±æ¯è¦å¨å½åç¨æ·ä¸»ç®å½ä¸ç.bashrcä¸è®¾ç½®è·¯å¾ãæ¹æ³æ¯ï¼ç¨æ·ä¸»ç®å½ä¸ç.bashrcæä»¶ï¼æçlinuxæ¯.profileæä»¶ï¼ï¼ç¨vimæå¼è¯¥æä»¶ï¼å¹¶è¿å ¥ç¼è¾æ¨¡å¼ï¼å¨æä»¶æåå å ¥PATH设置ï¼åèæ ¼å¼`export PATH="$PATH:your path1/:your path2/ ..."`ï¼ç¶åä¿åï¼å¹¶éåºè¯¥shellï¼ååéçæï¼æ¬æ·»å çåéåªå¯¹å½åç¨æ·ææã è¿æ ·ä¸¤ç§æ¹å¼æè ¾ï¼å°±æå®äºSDK å¨ä¸å¾ä¸ï¼å®æ¹ç»çå®è£ æµç¨ä¸ï¼æ¥ä¸æ¥å°±æ¯è¦ç¨ä¸ä¸ªè´¦å·ç»å½googleäºãå ³éåé¢å®è£ æ¶ä½¿ç¨çshellï¼ç¶åæ°æå¼ä¸ä¸ªï¼è¾å ¥å½ä»¤`gcloud auth login`ï¼ä¼æå¼æµè§å¨ï¼åºç°ä¸å¾  æä¹ä¸ç¨å«çè´¦å·ï¼å°±ç´æ¥ç¨âèé½âé£ä¸ªè´¦å·ï¼ç¹å»ä¹ï¼è¿å ¥ä¸ä¸ªææçé¢ï¼ä¹ä¸ç¨æä¹ä»ç»çï¼è¦æ³ç¨ï¼å°±å¾ç¹å»ç½é¡µæä¸é¢çâæ¥åâï¼å¦åå«ç¨ãç½ç«é½æ¯è¿ä¹å¿½æ 人çãæä¸æªå¾äºï¼çå®é¤äºè¦ç§å¦ä¸ç½ï¼è¿éä¸ä¼æé®é¢çå§ãç¶åçå°ä¸é¢ççé¢ï¼å°±æåäºã  å¨è¿ä¸ªé¡µé¢ä¸ï¼å¯ä»¥äºè§£å¾å¤å ³äºgoogleäºå¹³å°çå 容以åæä½æ¹æ³ã å 为æä»¥åå·²ç»å»ºç«äºä¸ä¸é¡¹ç®ï¼æä»¥ï¼æç¹å»è¿ä¸ªé¡µé¢ä¸âè½¬è³æçæ§å¶å°âä¹åï¼ä¼ååºæå·²ç»åå¨ç项ç®åç§°ãå½ç¶ï¼å¨è¿éå¯ä»¥æ°å»ºé¡¹ç®ã ä¸è¿ï¼è¿éæä¸æç½®ãå åå°èªå·±çè®¡ç®æºä¸ãå·²ç»å°gdkå好äºã ##卿¬å°å»ºç«é¡¹ç® å¨èªå·±çè®¡ç®æºä¸ï¼ä»»ä½è®¤ä¸ºåéçå°æ¹ï¼å»ºç«ä¸ä¸ªç®å½ï¼è¿ä¸ªç®å½å°±æ¯ä½ è¦åå¸å°GAEä¸ç项ç®åç§°ï¼ä¾å¦æçæä½ï¼ qw@qw-Latitude-E4300:~/Documents$ mkdir mypy ææ¯å¨è¿é建ç«äºä¸ä¸ªå忝mypyçç®å½ï¼ä¹å°±æå³çæè¦åå¸ç项ç®åç§°æ¯mypyï¼ç¶åï¼è¦ætornadoçä¸è¥¿æ¾è¿è¿ä¸ªç®å½ãå°±æ¯è¿ä¹åï¼ å 建ç«ä¸ä¸ªç®å½ï¼å«åtornado_source qw@qw-Latitude-E4300:~/Documents$ cd tornado_source qw@qw-Latitude-E4300:~/Documents/tornado_source$ git clone https://github.com/facebook/tornado.git æ£å éå° 'tornado'... remote: Counting objects: 13952, done. remote: Total 13952 (delta 0), reused 0 (delta 0) æ¥æ¶å¯¹è±¡ä¸: 100% (13952/13952), 7.41 MiB | 107.00 KiB/s, done. å¤ç delta ä¸: 100% (8877/8877), done. æ£æ¥è¿æ¥... 宿ã ç¶åå°tornado_sourceä¸çtornadoç®å½ï¼ç§»å¨å°mypyéé¢å»ã æ¥ä¸æ¥å¨mypyç®å½é颿°å»ºä¸ä¸ªæä»¶ï¼åç§°å¿ é¡»æ¯ï¼app.yamlï¼è¯¥æä»¶çå 容æ¯ï¼ application: mypy version: 1 runtime: python27 api_version: 1 threadsafe: no handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: .* script: main.py å ³äºyamlï¼è¿éä¹å¼ç¨[ç»´åºç¾ç§çå 容](http://zh.wikipedia.org/wiki/YAML)ï¼è¡¥å ä¸ä¸ï¼ >YAMLï¼IPA: /ËjæmÉl/ï¼å°¾é³ç±»ä¼¼cameléªé©¼ï¼æ¯ä¸ä¸ªå¯è¯»æ§é«ï¼ç¨æ¥è¡¨è¾¾èµæåºåçæ ¼å¼ãYAMLåèäºå ¶ä»å¤ç§è¯è¨ï¼å æ¬ï¼XMLãCè¯è¨ãPythonãPerl以åçµåé®ä»¶æ ¼å¼RFC2822ãClark Evanså¨2001年馿¬¡å表äºè¿ç§è¯è¨[1] ï¼å¦å¤Ingy döt Netä¸Oren Ben-Kiki乿¯è¿è¯è¨çå ±å设计è ãç®åå·²ç»ææ°ç§ç¼ç¨è¯è¨æèæ¬è¯è¨æ¯æ´ï¼æè 说解æï¼è¿ç§è¯è¨ã >YAMLæ¯"YAML Ain't a Markup Language"ï¼YAML䏿¯ä¸ç§ç½®æ è¯è¨ï¼çéå缩åãå¨å¼åçè¿ç§è¯è¨æ¶ï¼YAML çææå ¶å®æ¯ï¼"Yet Another Markup Language"ï¼ä»æ¯ä¸ç§ç½®æ è¯è¨ï¼ï¼ä½ä¸ºäºå¼ºè°è¿ç§è¯è¨ä»¥æ°æ®å为ä¸å¿ï¼è䏿¯ä»¥ç½®æ è¯è¨ä¸ºéç¹ï¼èç¨è¿çè¯éæ°å½åã YAMLç宿¹ç½ç«ï¼www.yaml.org ##ç¼åmain.py æ¬æ¥æ ¹æ®æä»¥åçç»éªï¼å°è¿éå°±å¯ä»¥è¿è¡`dev_appserver.py mypy`äºã坿¯åç°é误äºï¼è¯´æ²¡ææ¾å°sqlite3模åãä¸ç¥é为ä»ä¹ï¼pythonå级ä¹åï¼è¿ä¸ªæ¨¡å没æè£ ä¸ï¼æ¬æ¥è¿ä¸ªæ¨¡åæ¯æ ååºçãçå®å¦æå¨æä½è¿ç¨ä¸ï¼ä¹éå°ç±»ä¼¼æ åµãè§£å³æ¹æ³å°±æ¯å°è¯¥æ¨¡åç宿¹ç½ç«ä¸è½½æºç ï¼ç¶åå®è£ ï¼ä¸è¬æµç¨æ¯ï¼ tar -zxvf ***.gz cd *** #è¿å ¥è§£å缩åå¾å°çç®å½ ./configure #妿ä¸ä½¿ç¨é»è®¤çï¼å¯ä»¥æå®ç®å½ï¼--prefix=**/**/ make make install #è¥æéä¸è¶³ï¼å¯ä»¥åé¢å sudoï¼å¾å°ä¸´æ¶rootæéã ç¶åï¼è¿ä¸ªå¾éè¦ï¼åå°pythonæºç ä¸setup.pyæä»¶ä¸è¯¥æ¨¡åçè·¯å¾ä»æ°è®¾ç½®ï¼è®¾ç½®ä¸ºè¯¥æ¨¡å被å®è£ çè·¯å¾ãä¸è¬æ åµå¯è½æ¯è¿éçæ¨¡åè·¯å¾éäºã æ¥ä¸æ¥å°±ä»æ°å®è£ python æå®sqlite3模åï¼åå°è¯ï¼æåå°å«æmypy项ç®çï¼/home/qw/Documents/mypyï¼å³åå°/home/qw/Documentsï¼ï¼ dev_appserver.py mypy ç»ææ¾ç¤ºï¼ ...... google.appengine.tools.devappserver2.wsgi_server.BindError: Unable to bind localhost:8080 åæ¥ï¼æç§å¦ä¸ç½ï¼ç¨çæ¯8080端å£ï¼å·²ç»è¢«å ç¨äºï¼google.appengine乿ç®ç¨è¿ä¸ªç«¯å£ãé£å¥½ï¼å 为æ¯å¨æ¬å°ï¼å°±ä¸ç¨ç§å¦äºï¼å°ç§å¦ä¸ç½ç«¯å£åäºï¼åè¯è¯ã qw@qw-Latitude-E4300:~/Documents$ dev_appserver.py mypy INFO 2014-10-07 13:57:14,275 devappserver2.py:733] Skipping SDK update check. WARNING 2014-10-07 13:57:14,279 api_server.py:383] Could not initialize images API; you are likely missing the Python "PIL" module. INFO 2014-10-07 13:57:14,283 api_server.py:171] Starting API server at: http://localhost:40433 INFO 2014-10-07 13:57:14,295 dispatcher.py:186] Starting module "default" running at: http://localhost:8080 INFO 2014-10-07 13:57:14,298 admin_server.py:117] Starting admin server at: http://localhost:8000 /usr/local/lib/python2.7/site-packages/setuptools-2.2-py2.7.egg/pkg_resources.py:991: UserWarning: /home/qw/.python-eggs is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable). çä¸å¾ï¼å¦æå¨URLè¾å ¥`http://localhost:8000`ï¼æå¼çæ¯æ¬å°App Engine  è¿ä¸ªå°±æ¯æ¬å°çserverã 妿å¨URLè¾å ¥`http://localhost:8080`ï¼ç½é¡µç©ºç½ï¼ä»ä¹æç¤ºæ²¡æãè¿å°±å¯¹äºï¼å 为æè¿æ²¡æç¼åé£ä¸ªæéè¦çæä»¶ï¼å°±æ¯app.yamléé¢è®¾å®çmain.py **ç¹å«æéçå®ï¼æå¨ä¸é¢æä½çæ¶åï¼åºç°äºè¦åï¼ä½æ¯å½æ¶æ²¡æå¼èµ·æç注æãäºæ¯å°±ç¼åmain.pyæä»¶ãç»æï¼è¿è¡`http://localhost:8080`ï¼ä¸æåãèä¸åè¯ææ æ³æ¾å°tornado.wsgi模åã** æ¬è®²ææ¬å¿µäºã