<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小惡魔 - 電腦技術 - 生活日記 - 美食介紹 - AppleBOY &#187; python</title>
	<atom:link href="http://blog.wu-boy.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wu-boy.com</link>
	<description>介紹一堆美食日記，生活日記，電腦筆記</description>
	<lastBuildDate>Tue, 27 Jul 2010 14:04:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Python] OSSF::自由軟體鑄造場 Python network programming -進階</title>
		<link>http://blog.wu-boy.com/2009/05/04/1272/</link>
		<comments>http://blog.wu-boy.com/2009/05/04/1272/#comments</comments>
		<pubDate>Mon, 04 May 2009 13:58:49 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[OSSF]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=1272</guid>
		<description><![CDATA[今天跑來聽 OSSF::自由軟體鑄造場 舉辦的 Python network programming -進階 課程，紀錄上課的心得，以及講師提到的一堆重點整理，分享給大家，收穫實在是太多了，本身在南部能聽到的課程就很少，一看到有開課程，就非常開心報名參加，講師對於上課準備的講義也很用心，學習到平常看書學不到的經驗跟實作。
<span class="readmore"><a href="http://blog.wu-boy.com/2009/05/04/1272/" title="[Python] OSSF::自由軟體鑄造場 Python network programming -進階" target="_blank">...詳全文（共5068字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天跑來聽 <a href="http://www.openfoundry.org/">OSSF::自由軟體鑄造場</a> 舉辦的 <a href="http://whoswho.openfoundry.org/workshop/details/22.html">Python network programming -進階</a> 課程，紀錄上課的心得，以及講師提到的一堆重點整理，分享給大家，收穫實在是太多了，本身在南部能聽到的課程就很少，一看到有開課程，就非常開心報名參加，講師對於上課準備的講義也很用心，學習到平常看書學不到的經驗跟實作。</p>
<p><strong>1. 字串處理函式</strong></p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1"># 字串轉換小寫</span><br />
<span class="kw3">string</span>.<span class="me1">lower</span><br />
<span class="co1"># 字串轉換大寫</span><br />
<span class="kw3">string</span>.<span class="me1">upper</span><br />
<span class="co1"># 切割字串</span><br />
<span class="kw3">string</span>.<span class="me1">split</span><br />
<span class="co1"># 合併字串</span><br />
<span class="kw3">string</span>.<span class="me1">join</span><br />
<span class="co1"># 找尋字串</span><br />
<span class="kw3">string</span>.<span class="me1">find</span></div></div>
<p><span id="more-1272"></span><br />
底下來一個範例：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">import</span> <span class="kw3">string</span><br />
<span class="co1"># 切割字串</span><br />
<span class="kw1">print</span> <span class="kw2">str</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="kw2">str</span>.<span class="me1">lower</span><span class="br0">&#40;</span><span class="kw2">str</span>.<span class="me1">upper</span><span class="br0">&#40;</span><span class="st0">&quot;hi appleboy&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="co1"># 合併 array</span><br />
<span class="kw1">print</span> <span class="kw2">str</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>,<span class="kw2">str</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;hi appleboy&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="co1"># 找尋字串</span><br />
<span class="kw1">print</span> <span class="kw2">str</span>.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;hi appleboy&quot;</span>, <span class="st0">&quot;apple&quot;</span><span class="br0">&#41;</span><br />
<span class="co1">#</span><br />
<span class="co1"># 字串替換 template</span><br />
s = <span class="kw3">string</span>.<span class="me1">Template</span><span class="br0">&#40;</span><span class="st0">&quot;$who likes $what&quot;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> s.<span class="me1">substitute</span><span class="br0">&#40;</span>who=<span class="st0">'appleboy'</span>, what=<span class="st0">'eat apple'</span><span class="br0">&#41;</span></div></div>
<p><strong>2. 日期處理</strong></p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">import</span> <span class="kw3">time</span><br />
<span class="kw1">from</span> <span class="kw3">datetime</span> <span class="kw1">import</span> date<br />
<span class="kw1">from</span> <span class="kw3">datetime</span> <span class="kw1">import</span> <span class="kw3">datetime</span><br />
<span class="co1"># 時間</span><br />
d = date<span class="br0">&#40;</span><span class="nu0">2005</span>, <span class="nu0">7</span>, <span class="nu0">14</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> d.<span class="me1">isoformat</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> date.<span class="me1">today</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">isoformat</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> d - date.<span class="me1">today</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div></div>
<p>這裡講師有提到說，在 import module 的時候，希望有用到的 module 在 import 進來就可以了，這樣可以增進效能，也可以避免不需要的 load，在很多 MVC 裡面，大部分很多套件都會預先載入，可是我們在寫程式真的有用到嗎，講師提到 java，當我們想要 System.output 輸出，載入的 module 就很多，造成系統讀取速度降低阿。</p>
<p><strong>3. Random 亂數處理</strong><br />
可以參考官方網站文件：<a href="http://docs.python.org/library/random.html">http://docs.python.org/library/random.html</a></p>
<p><strong>4. bsddb — Interface to Berkeley DB library</strong> <a href="http://docs.python.org/library/bsddb.html">教學網站</a><br />
bsddb module 提供一個 interface 介面來連接 Berkeley DB，使用者可以隨意新增 ash、btree 或 record，可以利用 <a href="http://docs.python.org/library/marshal.html#marshal.dumps">pickle.dumps()</a> 或者 <a href="http://docs.python.org/library/pickle.html#pickle.dumps">marshal.dumps()</a> 儲存。<br />
python 預設沒有安裝這個 module，底下可以利用 FreeBSD ports 安裝</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># Python bindings to the Berkeley DB library</span><br />
<span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>ports<span class="sy0">/</span>databases<span class="sy0">/</span>py-bsddb; <span class="kw2">make</span> <span class="kw2">install</span> clean</div></div>
<p>給一個範例：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">import</span> <span class="kw3">bsddb</span><br />
db = <span class="kw3">bsddb</span>.<span class="me1">btopen</span><span class="br0">&#40;</span><span class="st0">'/tmp/spam.db'</span>, <span class="st0">'c'</span><span class="br0">&#41;</span><br />
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>: <br />
&nbsp; &nbsp; db<span class="br0">&#91;</span><span class="st0">'%d'</span><span class="sy0">%</span>i<span class="br0">&#93;</span> = <span class="st0">'%d'</span><span class="sy0">%</span> <span class="br0">&#40;</span>i<span class="sy0">*</span>i<span class="br0">&#41;</span><br />
<span class="co1"># 印出第四筆資料</span><br />
<span class="kw1">print</span> db<span class="br0">&#91;</span><span class="st0">'3'</span><span class="br0">&#93;</span><br />
<span class="co1"># 印出所有 key 值</span><br />
<span class="kw1">print</span> db.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="co1"># 輸出 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']</span><br />
<span class="co1"># for 迴圈把 key &amp; value 列出來</span><br />
<span class="kw1">for</span> k, v <span class="kw1">in</span> db.<span class="me1">iteritems</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> k, v</div></div>
<p><strong>5. Regular Expression</strong><br />
直接舉例，分別取出 IP Address 四個欄位數字</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">import</span> <span class="kw3">re</span><br />
phonePattern = <span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span>r<span class="st0">'^(<span class="es0">\d</span>{1,3})<span class="es0">\.</span>(<span class="es0">\d</span>{1,3})<span class="es0">\.</span>(<span class="es0">\d</span>{1,3})<span class="es0">\.</span>(<span class="es0">\d</span>{1,3})$'</span><span class="br0">&#41;</span><br />
a = phonePattern.<span class="me1">search</span><span class="br0">&#40;</span><span class="st0">'140.123.107.249'</span><span class="br0">&#41;</span>.<span class="me1">groups</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">for</span> v <span class="kw1">in</span> a:<br />
&nbsp; &nbsp; <span class="kw1">print</span> v</div></div>
<p>投影片資料：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sy0">*</span> ^ matches the beginning of a string.<br />
&nbsp; &nbsp; <span class="sy0">*</span> $ matches the end of a string.<br />
&nbsp; &nbsp; <span class="sy0">*</span> \b matches a word boundary.<br />
&nbsp; &nbsp; <span class="sy0">*</span> \d matches any numeric digit.<br />
&nbsp; &nbsp; <span class="sy0">*</span> \D matches any non-numeric character.<br />
&nbsp; &nbsp; <span class="sy0">*</span> x? matches an optional x character <br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">in</span> other words, it matches an x zero or one <span class="kw3">times</span><span class="br0">&#41;</span>.<br />
&nbsp; &nbsp; <span class="sy0">*</span> x<span class="sy0">*</span> matches x zero or <span class="kw2">more</span> times.<br />
&nbsp; &nbsp; <span class="sy0">*</span> x+ matches x one or <span class="kw2">more</span> times.<br />
&nbsp; &nbsp; <span class="sy0">*</span> x<span class="br0">&#123;</span>n,m<span class="br0">&#125;</span> matches an x character at least n <span class="kw3">times</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp;but not <span class="kw2">more</span> than m times.<br />
&nbsp; &nbsp; <span class="sy0">*</span> <span class="br0">&#40;</span>a<span class="sy0">|</span>b<span class="sy0">|</span>c<span class="br0">&#41;</span> matches either a or b or c.<br />
&nbsp; &nbsp; <span class="sy0">*</span> <span class="br0">&#40;</span>x<span class="br0">&#41;</span> <span class="kw1">in</span> general is a remembered group. <br />
&nbsp; &nbsp; &nbsp; &nbsp;You can get the value of what matched by using the <br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">groups</span><span class="br0">&#40;</span><span class="br0">&#41;</span> method of the object returned by re.search.</div></div>
<p>如果您在單一程式大量重複利用 regular expression，那可以用 re.compile(pattern[, flags]) object 來讓程式更有效率，學習 Regular Expression 好處很多，可以幫助您解決字串處理，擷取您想要的字串，底下推薦一些網站給大家：</p>
<ul>
<li><a href="http://phi.sinica.edu.tw/aspac/reports/94/94019/ch2.html">組成 Regular Expression 的元素</a></li>
<li><a href="http://www.gskinner.com/RegExr/">RegExr: Online Regular Expression Testing Tool</a></li>
</ul>
<p>6. <strong>zlib(gzip) &#038; bz2</strong><br />
基本的壓縮介紹，<a href="http://docs.python.org/library/gzip.html?highlight=gzip#module-gzip">gzip</a> 速度優於 <a href="http://docs.python.org/library/bz2.html?highlight=bz2#one-shot-de-compression">bz2</a>，適合用於壓縮檔案在網路傳輸方面，那 bz2 適合用在系統備份部份，可以把檔案壓縮更小，其實用的地方不太一樣，各有優缺點，那 apache2 就有提供 <a href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">mod_deflate</a> 增進傳輸效能，大量的 request 如果經過 mod_deflate 壓縮，可以大大減少網路傳輸流量。</p>
<p>最後當然就是介紹 python 怎麼寫抓取網頁 tag 部份，以及 Unicode 中文編碼的一些介紹，相當不錯，老師給的範例，等於是提供一隻小型的程式，可以當作指令來用，也有寫 help 用法：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">def</span> <span class="kw2">help</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Usage: %s [Option] [Location]&quot;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">basename</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Option: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-h&quot;</span>,<span class="st0">&quot;--help&quot;</span>,<span class="st0">&quot;show this usage message.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-v&quot;</span>,<span class="st0">&quot;--version&quot;</span>,<span class="st0">&quot;print version number.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-c&quot;</span>,<span class="st0">&quot;--csv&quot;</span>,<span class="st0">&quot;print result in csv.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Location: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> allpart.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%-12s&quot;</span><span class="sy0">%</span>x<span class="br0">&#41;</span></div></div>
<p>這隻程式包含了整個 python 寫程式的基本功能，看完這個 code 可以大上把老師這次上課跟上一堂課程整合在一起，包含 thread、class…等，那底下是老師寫的範例，抓取各地溫度，輸出成 csv 檔案，以及 unicode 的處理：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">#!/usr/bin/env python</span><br />
<span class="co1">#</span><br />
<span class="co1"># &nbsp; Copyleft, No Right Reserved.</span><br />
<span class="co1">#</span><br />
<span class="co1"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kevinwatt 2006/04/25</span><br />
<span class="co1">#</span><br />
<span class="kw1">import</span> <span class="kw3">urllib</span><br />
<span class="kw1">import</span> <span class="kw3">os</span>,<span class="kw3">sys</span>,<span class="kw3">re</span>,<span class="kw3">string</span><br />
<span class="kw1">import</span> <span class="kw3">time</span><br />
<span class="kw1">import</span> <span class="kw3">threading</span><br />
version=<span class="st0">&quot;cwb.py version 0426&quot;</span><br />
TIMEOUT=<span class="nu0">1.0</span><span class="sy0">*</span><span class="nu0">10</span> <span class="co1"># timeout for the operation in seconds</span><br />
MAX_THREADS=<span class="nu0">4</span> <span class="co1"># max thread.</span><br />
<br />
Taipei=<span class="br0">&#91;</span><span class="st0">'Keelung'</span>,<span class="st0">'Taipei'</span>,<span class="st0">'Yangmingshan'</span>,<span class="st0">'Taoyuan'</span>,<span class="st0">'Sinwu'</span>,<span class="st0">'Hsinchu'</span>,<span class="st0">'Guanwu'</span>,<span class="st0">'Sanyi'</span>,<span class="st0">'Jhunan'</span><span class="br0">&#93;</span><br />
Tainan=<span class="br0">&#91;</span><span class="st0">'Tainan'</span>,<span class="st0">'Kaohsiung'</span>,<span class="st0">'Jiasian'</span>,<span class="st0">'Sandimen'</span>,<span class="st0">'Hengchun'</span><span class="br0">&#93;</span><br />
Yilan=<span class="br0">&#91;</span><span class="st0">'Yilan'</span>,<span class="st0">'Su-ao'</span>,<span class="st0">'Taipingshan'</span>,<span class="st0">'Hualien'</span>,<span class="st0">'Yuli'</span>,<span class="st0">'Chenggong'</span>,<span class="st0">'Taitung'</span>,<span class="st0">'Dawu'</span>,<span class="st0">'Lanyu'</span><span class="br0">&#93;</span><br />
Taichung=<span class="br0">&#91;</span><span class="st0">'Taichung'</span>,<span class="st0">'Wuci'</span>,<span class="st0">'Lishan'</span>,<span class="st0">'Yuanlin'</span>,<span class="st0">'Lugang'</span>,<span class="st0">'Sun-Moon-Lake'</span>,<span class="st0">'Lushan'</span>,<span class="st0">'Hehuan-Mountain'</span>,<span class="st0">'Huwei'</span>,<span class="st0">'Caoling'</span>,<span class="st0">'Chiayi'</span>,<span class="st0">'Alishan'</span>,<span class="st0">'Yushan'</span><span class="br0">&#93;</span><br />
Penghu=<span class="br0">&#91;</span><span class="st0">'Penghu'</span>,<span class="st0">'Kinmen'</span>,<span class="st0">'Matsu'</span><span class="br0">&#93;</span><br />
allpart=<span class="br0">&#123;</span><span class="st0">'Taipei'</span>: Taipei, <span class="st0">'Taichung'</span>:Taichung, <span class="st0">'Tainan'</span>:Tainan, <span class="st0">'Yilan'</span>:Yilan, <span class="st0">'Penghu'</span>:Penghu<span class="br0">&#125;</span><br />
listtitle=<span class="br0">&#91;</span><span class="st0">'zone'</span>,<span class="st0">'datetime'</span>,<span class="st0">'rep'</span>,<span class="st0">'temp'</span>,<span class="st0">'direct'</span>,<span class="st0">'ane'</span>,<span class="st0">'max_ane'</span>,<span class="st0">'km'</span>,<span class="st0">'humidity'</span>,<span class="st0">'hPa'</span>,<span class="st0">'Rmm'</span>,<span class="st0">'uvi'</span><span class="br0">&#93;</span><br />
<br />
<span class="kw1">class</span> cwb<span class="br0">&#40;</span><span class="kw3">threading</span>.<span class="me1">Thread</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&quot;Get weather information from www.cwb.gov.tw&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,zonename<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">threading</span>.<span class="me1">Thread</span>.<span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">zonename</span>=zonename<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">reg</span>=<span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span><span class="st0">'&lt;([^&gt;]|<span class="es0">\n</span>)*&gt;|&lt;br&gt;|&lt;BR&gt;|&amp;nbsp;|&amp;nbsp'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">retab</span>=<span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span><span class="st0">'tabletype1-2'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">reconvspace</span>=<span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span><span class="st0">'&amp;nbsp;|&amp;nbsp'</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> run<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">contents</span> = <span class="kw2">self</span>.<span class="me1">getinfo</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> urlcontent<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span><span class="st0">&quot;http://www.cwb.gov.tw/pda/observe/&quot;</span>+<span class="kw2">self</span>.<span class="me1">zonename</span>+<span class="st0">&quot;.htm&quot;</span>,proxies=<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = <span class="st0">&quot;Connection false&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> b<br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> getinfo<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; b=<span class="kw2">unicode</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">urlcontent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">&quot;cp950&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">list</span>=<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; firsttarget=<span class="st0">&quot;tabletype1-1&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b=b<span class="br0">&#91;</span>b.<span class="me1">find</span><span class="br0">&#40;</span>firsttarget<span class="br0">&#41;</span>+<span class="kw2">len</span><span class="br0">&#40;</span>firsttarget<span class="br0">&#41;</span>+<span class="nu0">2</span>:<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b=b<span class="br0">&#91;</span>:b.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">'&lt;/table&gt;'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b=<span class="kw3">re</span>.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>+&quot;</span>, <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>, <span class="kw2">self</span>.<span class="me1">reconvspace</span>.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">&quot; &quot;</span>,<span class="kw2">self</span>.<span class="me1">reg</span>.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>,<span class="kw2">self</span>.<span class="me1">retab</span>.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\&gt;</span>--&quot;</span>,b<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; conlist=<span class="kw3">string</span>.<span class="me1">split</span><span class="br0">&#40;</span>b,<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; info=<span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> conlist:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> x<span class="br0">&#91;</span><span class="nu0">0</span>:<span class="nu0">2</span><span class="br0">&#93;</span>==<span class="st0">'--'</span> <span class="kw1">and</span> info<span class="sy0">&lt;</span><span class="nu0">2</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; info+=<span class="nu0">1</span> <span class="co1"># list[1] is data time.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">list</span>.<span class="me1">append</span><span class="br0">&#40;</span>x<span class="br0">&#91;</span><span class="nu0">4</span>:<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> x<span class="br0">&#91;</span><span class="nu0">0</span>:<span class="nu0">2</span><span class="br0">&#93;</span>==<span class="st0">'--'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">list</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="kw3">re</span>.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">'<span class="es0">\s</span>+'</span>,<span class="st0">''</span>, x<span class="br0">&#91;</span><span class="nu0">4</span>:<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">list</span><br />
<br />
<span class="kw1">def</span> <span class="kw2">help</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Usage: %s [Option] [Location]&quot;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">basename</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Option: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-h&quot;</span>,<span class="st0">&quot;--help&quot;</span>,<span class="st0">&quot;show this usage message.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-v&quot;</span>,<span class="st0">&quot;--version&quot;</span>,<span class="st0">&quot;print version number.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%2s, %-25s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="st0">&quot;-c&quot;</span>,<span class="st0">&quot;--csv&quot;</span>,<span class="st0">&quot;print result in csv.&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Location: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> allpart.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\t</span>%-12s&quot;</span><span class="sy0">%</span>x<span class="br0">&#41;</span><br />
<br />
<span class="kw1">def</span> count_active<span class="br0">&#40;</span>tail<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&quot;&quot;&quot; returns the number of Getter threads that are alive &quot;&quot;&quot;</span><br />
&nbsp; &nbsp; num_active = <span class="nu0">0</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> g <span class="kw1">in</span> tail:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> g.<span class="me1">isAlive</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num_active += <span class="nu0">1</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> num_active<br />
<br />
<span class="kw1">def</span> listprint<span class="br0">&#40;</span><span class="kw2">list</span>,style<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> style==<span class="st0">&quot;c&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; i=<span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">list</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw2">list</span><span class="br0">&#41;</span>==i <span class="kw1">and</span> i==<span class="nu0">12</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">'&quot;%s&quot;'</span> <span class="sy0">%</span> x<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw2">list</span><span class="br0">&#41;</span>==i <span class="kw1">and</span> i<span class="sy0">&lt;</span><span class="nu0">12</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">'&quot;%s&quot;,&quot;&quot;'</span> <span class="sy0">%</span> x<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">'&quot;%s&quot;,'</span> <span class="sy0">%</span> x<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i+=<span class="nu0">1</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">list</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;%-8s&quot;</span> <span class="sy0">%</span> x<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><br />
<br />
<span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> == <span class="nu0">1</span>:<br />
&nbsp; &nbsp; <span class="kw2">help</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="co1"># common exit code for syntax error</span><br />
<span class="kw1">else</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span>:<span class="br0">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; arglist=<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span>:<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; getargv=arglist<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> allpart.<span class="me1">has_key</span><span class="br0">&#40;</span>getargv<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location=allpart<span class="br0">&#91;</span>getargv<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> allpart.<span class="me1">has_key</span><span class="br0">&#40;</span>arglist<span class="br0">&#91;</span><span class="kw2">len</span><span class="br0">&#40;</span>arglist<span class="br0">&#41;</span>-<span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location=allpart<span class="br0">&#91;</span>arglist<span class="br0">&#91;</span><span class="kw2">len</span><span class="br0">&#40;</span>arglist<span class="br0">&#41;</span>-<span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> arglist<span class="br0">&#91;</span><span class="nu0">0</span>:<span class="br0">&#93;</span> <span class="kw1">in</span> <span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">'--help'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span><span class="st0">'-h'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span><span class="st0">'--usage'</span><span class="br0">&#93;</span>, <span class="br0">&#91;</span><span class="st0">'-?'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> arglist<span class="br0">&#91;</span><span class="nu0">0</span>:<span class="br0">&#93;</span> <span class="kw1">in</span> <span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">'-v'</span><span class="br0">&#93;</span>,<span class="br0">&#91;</span><span class="st0">'--version'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> version<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> arglist<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="kw1">in</span> <span class="br0">&#40;</span><span class="st0">'-c'</span>,<span class="st0">'--csv'</span><span class="br0">&#41;</span> <span class="kw1">and</span> <span class="kw2">len</span><span class="br0">&#40;</span>arglist<span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style=<span class="st0">&quot;c&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style=<span class="st0">&quot;nor&quot;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; tail=<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>: &nbsp; &nbsp;<span class="co1"># get location</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">len</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Error: Could not find location&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> zone <span class="kw1">in</span> location:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> count_active<span class="br0">&#40;</span>tail<span class="br0">&#41;</span> <span class="sy0">&gt;</span>= MAX_THREADS:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print &quot;too many active, others wait here.&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">time</span>.<span class="me1">sleep</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g=cwb<span class="br0">&#40;</span>zone<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tail.<span class="me1">append</span><span class="br0">&#40;</span>g<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="co1"># execute cwb.run()</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print &quot;there are&quot;,threading.activeCount()-1,&quot;connecton thread started&quot; </span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; listprint<span class="br0">&#40;</span>listtitle,style<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> waterlist <span class="kw1">in</span> tail:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; waterlist.<span class="me1">join</span><span class="br0">&#40;</span>TIMEOUT<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># print waterlist.getName()+&quot;:&quot;,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listprint<span class="br0">&#40;</span>waterlist.<span class="me1">contents</span>,style<span class="br0">&#41;</span></div></div>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2009/04/27/1225/" title="[Django] Web Framework- Django -初階學習心得">[Django] Web Framework- Django -初階學習心得 (4)</a></li><li><a href="http://blog.wu-boy.com/2009/04/14/1158/" title="[高雄] Python 入門 &#8211; Python tutorial">[高雄] Python 入門 &#8211; Python tutorial (4)</a></li><li><a href="http://blog.wu-boy.com/2009/03/07/940/" title=" Google App Engine SDK：python 基本教學安裝"> Google App Engine SDK：python 基本教學安裝 (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2009/05/04/1272/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Django] Web Framework- Django -初階學習心得</title>
		<link>http://blog.wu-boy.com/2009/04/27/1225/</link>
		<comments>http://blog.wu-boy.com/2009/04/27/1225/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 02:50:00 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=1225</guid>
		<description><![CDATA[首先感謝 酷學園團隊、Who&#8217;s Who 工作坊、自由軟體鑄造場 舉辦的一系列南部的 python、Django 活動，今天的活動主題是：Web Framework- Django -初階 (講者：陳建玎)，簡介了為什麼需要 MVC 架構寫法，MVC 的重要性，以及 Django 的優點，還蠻豐富的課程，其實重點都是在如何使用 MVC 加速開發 Web 網站，以及在 Team Work 裡的重要性，目前在開發 Web Framework 都是利用 PHP 一套 Frame Work：Codeigniter，在台灣已經有中文網站：CodeIgniter 繁體中文，自己接手了 CodeIgniter 計畫翻譯中文文件，還有開發 forum 中文討論區，還在規劃中，自己也才摸 CodeIgniter 一個多禮拜，底下有一張上課的投影片，介紹三種 Frame Work 的 Model、Views、Controller
<span class="readmore"><a href="http://blog.wu-boy.com/2009/04/27/1225/" title="[Django] Web Framework- Django -初階學習心得" target="_blank">...詳全文（共5365字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a title="django-logo-negative_1236046419 (by appleboy46)" href="http://www.flickr.com/photos/appleboy/3475465970/"><img title="django-logo-negative_1236046419 (by appleboy46)" src="http://farm4.static.flickr.com/3595/3475465970_7044242629.jpg" alt="django-logo-negative_1236046419 (by appleboy46)" width="198" height="90" /></a><br />
首先感謝 <a href="http://phorum.study-area.org/index.php">酷學園團隊</a>、<a href="http://whoswho.openfoundry.org">Who&#8217;s Who 工作坊</a>、<a href="http://www.openfoundry.org" target="_blank">自由軟體鑄造場</a> 舉辦的一系列南部的 <a href="http://www.python.org/">python</a>、<a href="http://www.djangoproject.com/" target="_blank">Django</a> 活動，今天的活動主題是：<a href="http://whoswho.openfoundry.org/workshop/details/21.html">Web Framework- Django -初階 (講者：陳建玎)</a>，簡介了為什麼需要 MVC 架構寫法，MVC 的重要性，以及 Django 的優點，還蠻豐富的課程，其實重點都是在如何使用 MVC 加速開發 Web 網站，以及在 Team Work 裡的重要性，目前在開發 Web Framework 都是利用 PHP 一套 Frame Work：<a href="http://codeigniter.com/">Codeigniter</a>，在台灣已經有中文網站：<a href="http://www.codeigniter.com.tw/">CodeIgniter 繁體中文</a>，自己接手了 CodeIgniter 計畫翻譯中文文件，還有開發 <a href="http://www.codeigniter.com.tw/forums">forum 中文討論區</a>，還在規劃中，自己也才摸 CodeIgniter 一個多禮拜，底下有一張上課的投影片，介紹三種 Frame Work 的 Model、Views、Controller<br />
<a title="django (by appleboy46)" href="http://www.flickr.com/photos/appleboy/3474957475/"><img title="django (by appleboy46)" src="http://farm4.static.flickr.com/3343/3474957475_2a379b69ff.jpg" alt="django (by appleboy46)" width="500" height="371" /></a><br />
<span id="more-1225"></span><br />
<a title="django_01 (by appleboy46)" href="http://www.flickr.com/photos/appleboy/3475934172/"><img title="django_01 (by appleboy46)" src="http://farm4.static.flickr.com/3597/3475934172_a7747dd79b.jpg" alt="django_01 (by appleboy46)" width="500" height="296" /></a><br />
上面兩張投影片把 <a href="http://www.djangoproject.com/" target="_blank">Django</a> MVC 的精華都講出來了，Model 在 Frame Work 裡面就是跟 database 互相溝通，View 部份就是設計基本的 html 架構，把簡單的 while、for 的語法寫到 Template 裡面。使用者 Browser 對伺服器要求 Request，Django 就會針對 url 呼叫 urls.py，urls.py 裡面就寫著相對應的結構，如下：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">from</span> django.<span class="me1">conf</span>.<span class="me1">urls</span>.<span class="me1">defaults</span> <span class="kw1">import</span> <span class="sy0">*</span><br />
<br />
<span class="co1"># Uncomment the next two lines to enable the admin:</span><br />
<span class="kw1">from</span> django.<span class="me1">contrib</span> <span class="kw1">import</span> admin<br />
admin.<span class="me1">autodiscover</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
urlpatterns = patterns<span class="br0">&#40;</span><span class="st0">''</span>,<br />
&nbsp; &nbsp; <span class="co1"># Example:</span><br />
&nbsp; &nbsp; <span class="co1"># (r'^mysite/', include('mysite.foo.urls')),</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Uncomment the admin/doc line below and add 'django.contrib.admindocs'</span><br />
&nbsp; &nbsp; <span class="co1"># to INSTALLED_APPS to enable admin documentation:</span><br />
&nbsp; &nbsp; <span class="co1"># (r'^admin/doc/', include('django.contrib.admindocs.urls')),</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Uncomment the next line to enable the admin:</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>r<span class="st0">'^admin/(.*)'</span>, admin.<span class="kw3">site</span>.<span class="me1">root</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; <span class="co1"># (r'^admin/', include('django.contrib.admin.urls')),</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>r<span class="st0">'news/'</span>, <span class="st0">'mysite.hellowordapp.startpage'</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; <span class="br0">&#40;</span>r<span class="st0">'^$'</span>, <span class="st0">'mysite.hellowordapp.startpage'</span><span class="br0">&#41;</span>,<br />
<span class="br0">&#41;</span></div></div>
<p>urls.py 裡面會寫基本的 <a href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">Regular Expression</a> 對應到 project 檔案，基本的 <a href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">Regular Expression</a> 要會一點，不管是哪一套 MVC，都需要用到 Regular Expression，在 <a href="http://codeigniter.com/">Codeigniter PHP Framework</a> 架構裡面對應的是 application/config/routes.php 的 <a href="http://codeigniter.com/user_guide/general/routing.html" target="_blank">URI Routing</a>，接下來就是  View(COntroller)，最後就是 model 呼叫了，其實最主要就是達到程式與樣板的分離，以及 database 跟 controller 的分開，對於程式人員跟美工人員相互合作，這個方式是最好的。</p>
<p>底下來快速介紹如何實作出線上新聞發佈系統，上課老師是把環境建立在 Windows 底下，不過我發現底下很多學員都是 run 在 Linux 底下，而我自己是弄在 FreeBSD 系統上面,其實做法都差不多，ubuntu 用 apt-get 方式，Fedora 是用 yum，FreeBSD 是用 ports 的方式，不管熟悉哪一種都可以輕鬆上手，run 在 Windows 上面也蠻方便的，一切都是看個人習慣了。</p>
<p>首先 FreeBSD ports 安裝:</p>
<p>課程上的很充實，需要投影片或者是範例的，都可以到 <a href="http://whoswho.openfoundry.org/workshop/details/21.html">Web Framework- Django -初階 (講者：陳建玎)</a> 上面觀看或者是下載,另外也有 <a href="http://of.openfoundry.org/projects/442/kwiki">wiki</a>，大家上課的筆記都可以寫在上面喔。</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># 目前版本 py25-django-1.0.2</span><br />
<span class="co0"># maintainer lwhsu@FreeBSD.org</span><br />
<span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>ports<span class="sy0">/</span>www<span class="sy0">/</span>py-django<br />
<span class="co0"># make showconfig</span><br />
<span class="kw2">make</span> <span class="kw2">install</span> clean</div></div>
<p>FreeBSD 會依序幫您裝好相關套件，MySQL、SQLite3、POSTGRESQL、MOD_PYTHON3(Install Apache2 with mod_python3)，這些是 ports 的 config 選單是可以自由選擇。</p>
<p>接下來介紹快速使用 Django 開發一個新聞系統，介紹如何使用 Django 強大後台，上課過程老師是教大家先建立 model 再使用 manager syncdb tool 建立 database 資料表，那我來寫反向教學，先建立資料表，在利用 inspectdb tool 產生 model 資訊，自己通常都是用 MySQL 先建立好該有的資料表，這樣會比較方便。</p>
<p>1. 建立專案</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># 在任何目錄底下都可以使用這個指令</span><br />
django-admin.py startproject mysite</div></div>
<p>底下會出現幾個檔案：settings.py、urls.py、manage.py，大概介紹一下這三個檔案的用途，settings.py 用來設定系統參數，如：連接資料庫類型，帳號，密碼，urls.py 用來處理網址列導向，需要基本正規語言知識，manage.py 管理整個 Django 專案工具，可以鍵入 python manage.py help 來查看如何使用。</p>
<p>2. 建立 app<br />
#<br />
# 在 mysite(剛剛建立的專案)底下新增 app 名稱<br />
python manage.py startapp news</p>
<p>3. 設定資料庫類型帳號密碼</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">#</span><br />
<span class="co1"># 打開 settings.py</span><br />
<span class="co1">#</span><br />
DATABASE_ENGINE = <span class="st0">'mysql'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.</span><br />
DATABASE_NAME = <span class="st0">'django'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Or path to database file if using sqlite3.</span><br />
DATABASE_USER = <span class="st0">'django'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Not used with sqlite3.</span><br />
DATABASE_PASSWORD = <span class="st0">'xxxx'</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Not used with sqlite3.</span><br />
DATABASE_HOST = <span class="st0">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Set to empty string for localhost. Not used with sqlite3.</span><br />
DATABASE_PORT = <span class="st0">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Set to empty string for default. Not used with sqlite3.</span></div></div>
<p>4. 建立資料表</p>
<div class="codecolorer-container sql " style="overflow:auto;white-space:nowrap;width:580px"><div class="sql codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="kw1">IF</span> <span class="kw1">NOT</span> <span class="kw1">EXISTS</span> <span class="st0">`project_news`</span> <span class="br0">&#40;</span><br />
&nbsp; <span class="st0">`news_id`</span> mediumint<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`user_id`</span> mediumint<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`group_id`</span> mediumint<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`categories_id`</span> int<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`news_name`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`news_desc`</span> text <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`news_top`</span> tinyint<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`news_add_time`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`news_edit_time`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`news_id`</span><span class="br0">&#41;</span><br />
<span class="br0">&#41;</span> ENGINE<span class="sy0">=</span>MyISAM &nbsp;<span class="kw1">DEFAULT</span> CHARSET<span class="sy0">=</span>utf8;<br />
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="kw1">IF</span> <span class="kw1">NOT</span> <span class="kw1">EXISTS</span> <span class="st0">`project_news_categories`</span> <span class="br0">&#40;</span><br />
&nbsp; <span class="st0">`categories_id`</span> mediumint<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`categories_name`</span> varchar<span class="br0">&#40;</span><span class="nu0">64</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`add_time`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="st0">`edit_time`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span><br />
&nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`categories_id`</span><span class="br0">&#41;</span><br />
<span class="br0">&#41;</span> ENGINE<span class="sy0">=</span>MyISAM &nbsp;<span class="kw1">DEFAULT</span> CHARSET<span class="sy0">=</span>utf8;</div></div>
<p>5. 利用 Django tool 產生系統帳號認證相關資料表</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># 會依照 settings.py 裡面的 INSTALLED_APPS 設定產生相關資料表喔</span><br />
python manage.py syncdb</div></div>
<p>另外反向作法：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># 可以產生全部在 database 裡面的 table 資料表，選取該對應您要的資料即可</span><br />
python manage.py inspectdb</div></div>
<p>6. 開啟 admin 管理介面：設定 urls.py<br />
<a href="http://www.flickr.com/photos/appleboy/3478713850/" title="Django_2 (by appleboy46)"><img src="http://farm4.static.flickr.com/3555/3478713850_800c92f6c6.jpg" title="Django_2 (by appleboy46)" alt="Django_2 (by appleboy46)" width="500" height="267" /></a><br />
上面英文部份都寫得很清楚了，如果要打開 admin 功能必須要 unmark 掉哪幾行。</p>
<p>7. 新增 admin.py 到 app 資料夾裡頭，檔案內容：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">from</span> mysite.<span class="me1">news2</span>.<span class="me1">models</span> <span class="kw1">import</span> ProjectNews, ProjectNewsCategories<br />
<span class="kw1">from</span> django.<span class="me1">contrib</span> <span class="kw1">import</span> admin<br />
admin.<span class="kw3">site</span>.<span class="me1">register</span><span class="br0">&#40;</span>ProjectNews<span class="br0">&#41;</span><br />
admin.<span class="kw3">site</span>.<span class="me1">register</span><span class="br0">&#40;</span>ProjectNewsCategories<span class="br0">&#41;</span></div></div>
<p>修改 settings.py</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace">INSTALLED_APPS = <span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">'django.contrib.auth'</span>,<br />
&nbsp; &nbsp; <span class="st0">'django.contrib.contenttypes'</span>,<br />
&nbsp; &nbsp; <span class="st0">'django.contrib.sessions'</span>,<br />
&nbsp; &nbsp; <span class="st0">'django.contrib.sites'</span>,<br />
&nbsp; &nbsp; <span class="st0">'django.contrib.admin'</span>,<br />
&nbsp; &nbsp; <span class="st0">'mysite.news'</span>,<br />
<span class="br0">&#41;</span></div></div>
<p>8. 啟動伺服器，內建 python manage tool 就可以辦到了</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace">python manage.<span class="me1">py</span> runserver 0.0.0.0:<span class="nu0">8000</span></div></div>
<p>9. 打開瀏覽器：http://localhost:8000 或者是您的 ip 跟 domain 都可以上去</p>
<p>登入畫面：<br />
<a href="http://www.flickr.com/photos/appleboy/3478773086/" title="Django_3 (by appleboy46)"><img src="http://farm4.static.flickr.com/3539/3478773086_3dab7acc19.jpg" title="Django_3 (by appleboy46)" alt="Django_3 (by appleboy46)" width="336" height="193" /></a><br />
系統首頁：<br />
<a href="http://www.flickr.com/photos/appleboy/3478773166/" title="Site administration - Django site admin_1240799902399 (by appleboy46)"><img src="http://farm4.static.flickr.com/3621/3478773166_028341e484.jpg" title="Site administration - Django site admin_1240799902399 (by appleboy46)" alt="Site administration - Django site admin_1240799902399 (by appleboy46)" width="500" height="199" /></a><br />
管理新聞畫面：<br />
<a href="http://www.flickr.com/photos/appleboy/3478773262/" title="Select project news to change - Django site admin_1240799942489 (by appleboy46)"><img src="http://farm4.static.flickr.com/3591/3478773262_6d0297ba76.jpg" title="Select project news to change - Django site admin_1240799942489 (by appleboy46)" alt="Select project news to change - Django site admin_1240799942489 (by appleboy46)" width="500" height="280" /></a><br />
新增新聞畫面：<br />
<a href="http://www.flickr.com/photos/appleboy/3478773332/" title="Change project news - Django site admin_1240799962251 (by appleboy46)"><img src="http://farm4.static.flickr.com/3394/3478773332_bfc9db0b1c.jpg" title="Change project news - Django site admin_1240799962251 (by appleboy46)" alt="Change project news - Django site admin_1240799962251 (by appleboy46)" width="500" height="270" /></a></p>
<p>10. 修改新聞系統 ForeignKey</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">from</span> django.<span class="me1">db</span> <span class="kw1">import</span> models<br />
<br />
<span class="co1"># Create your models here.</span><br />
<br />
<span class="kw1">class</span> ProjectNews<span class="br0">&#40;</span>models.<span class="me1">Model</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; news_id = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span>primary_key=<span class="kw2">True</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; user_id = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; group_id = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="co1">#categories_id = models.IntegerField()</span><br />
&nbsp; &nbsp; categories = models.<span class="me1">ForeignKey</span><span class="br0">&#40;</span><span class="st0">&quot;ProjectNewsCategories&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; news_name = models.<span class="me1">CharField</span><span class="br0">&#40;</span>max_length=<span class="nu0">1020</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; news_desc = models.<span class="me1">TextField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; news_top = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; news_add_time = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; news_edit_time = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">class</span> Meta:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db_table = u<span class="st0">'project_news'</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__unicode__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>.<span class="me1">news_name</span><br />
<br />
<br />
<span class="kw1">class</span> ProjectNewsCategories<span class="br0">&#40;</span>models.<span class="me1">Model</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; categories_id = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span>primary_key=<span class="kw2">True</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; categories_name = models.<span class="me1">CharField</span><span class="br0">&#40;</span>max_length=<span class="nu0">256</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; add_time = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; edit_time = models.<span class="me1">IntegerField</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">class</span> Meta:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db_table = u<span class="st0">'project_news_categories'</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__unicode__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>.<span class="me1">categories_name</span></div></div>
<p>因為這檔案內容是依據 manage.py inspectdb 所產生的，系統並非知道我們所有 table 的關聯性，所以必須設定改掉部份關聯性，可以參考官方網站的教學 <a href="http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey">ForeignKey</a>，介紹就到此了，後面有 template 的教學，不過就比較容易一點，就靠大家去摸索了，課程還蠻豐富的，認真玩，可以學到很多東西。</p>
<p>可以去下載課程講義喔：<a href="http://whoswho.openfoundry.org/workshop/details/21.html">Web Framework- Django -初階 (講者：陳建玎)</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2009/03/07/940/" title=" Google App Engine SDK：python 基本教學安裝"> Google App Engine SDK：python 基本教學安裝 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/07/07/2276/" title="ProFTPD UseEncoding 繁體中文亂碼解決 Localization">ProFTPD UseEncoding 繁體中文亂碼解決 Localization (0)</a></li><li><a href="http://blog.wu-boy.com/2010/06/23/2240/" title="[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9">[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/26/2087/" title="Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)">Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros">[Vim] 想套用 *.php syntax 顏色於 *.ros (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/11/2041/" title="[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項">[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/01/08/1950/" title="[FreeBSD] Fanout and Fanterm Tool to run commands on multiple machines">[FreeBSD] Fanout and Fanterm Tool to run commands on multiple machines (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/29/1918/" title="[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)">[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/12/1901/" title="[UNIX] Vim 命令圖解說明">[UNIX] Vim 命令圖解說明 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/10/1894/" title="[FreeBSD] freebsd kernel: fxp0: link state changed to DOWN / UP">[FreeBSD] freebsd kernel: fxp0: link state changed to DOWN / UP (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2009/04/27/1225/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[高雄] Python 入門 &#8211; Python tutorial</title>
		<link>http://blog.wu-boy.com/2009/04/14/1158/</link>
		<comments>http://blog.wu-boy.com/2009/04/14/1158/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 14:46:39 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=1158</guid>
		<description><![CDATA[在現今 Google 的大多數服務都是利用 Python 程式撰寫，例如：Google App Engine，之前買下的 Youtube 影音網站，就是因為 Youtube 是用 Python 的程式撰寫起來的一個 Web 2.0 網站，在上禮拜去參加了 工作坊 所開的一門入門的課程 Python 入門 &#8211; Python tutorial &#8211; 第一梯 (講者：黃宇新)，這課程是給要學習 Python 的基本入門，講師 黃宇新 教的真的很棒，把 Python 的精神都講的非常好，自己感覺跟 Perl 的功能差沒多少，可是兩種語言在比較方面各有優缺點，聽完最大的感想歸納為兩點，那就是 Python 產生線上文件相當方便，還有非常的快速模組化，每個 Python 程式都是一個獨立模組，在其他 Python 程式裡面都以利用 import 方式來交互使用，個人認為在 系統管理、網路管理、網路傳輸程式、網頁程式開發 上面會有相當大的幫助。
<span class="readmore"><a href="http://blog.wu-boy.com/2009/04/14/1158/" title="[高雄] Python 入門 &#8211; Python tutorial" target="_blank">...詳全文（共1273字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在現今 <a href="http://www.google.com">Google</a> 的大多數服務都是利用 <a href="http://www.python.org/">Python</a> 程式撰寫，例如：<a href="http://code.google.com/intl/zh-TW/appengine/">Google App Engine</a>，之前買下的 Youtube 影音網站，就是因為 Youtube 是用 Python 的程式撰寫起來的一個 Web 2.0 網站，在上禮拜去參加了 <a href="http://whoswho.openfoundry.org/">工作坊</a> 所開的一門入門的課程 <a href="http://whoswho.openfoundry.org/workshop/details/18.html">Python 入門 &#8211; Python tutorial &#8211; 第一梯 (講者：黃宇新)</a>，這課程是給要學習 Python 的基本入門，講師 黃宇新 教的真的很棒，把 Python 的精神都講的非常好，自己感覺跟 Perl 的功能差沒多少，可是兩種語言在比較方面各有優缺點，聽完最大的感想歸納為兩點，那就是 <span style="color: #ff0000;">Python 產生線上文件相當方</span>便，還有非常的<span style="color: #ff0000;">快速模組化</span>，每個 Python 程式都是一個獨立模組，在其他 Python 程式裡面都以利用 import 方式來交互使用，個人認為在 系統管理、網路管理、網路傳輸程式、網頁程式開發 上面會有相當大的幫助。</p>
<p>Python 還有一個優點就是程式可閱讀性，在每個程式都必須有良好的撰寫習慣，那就是要善用 tab 鍵來排版，不然程式就是會錯誤，底下一個 Python 的例子，九九乘法表：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">#!/usr/local/bin/python</span><br />
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">10</span><span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">10</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;%d*%d=%s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>i,j,i<span class="sy0">*</span>j<span class="br0">&#41;</span>,<br />
&nbsp; <span class="kw1">print</span> <span class="st0">&quot;&quot;</span></div></div>
<p><span id="more-1158"></span><br />
程式的可閱讀性，可以讓程式設計師依照這個規範來撰寫程式，將來程式控管，或者是交接給其他人，那一定相當方便，至少不會在找 if for 這些迴圈的括號，產生困擾。</p>
<p>程式說明撰寫：這部份我覺得 Python 做的非常好，比如說一個 Python 定義了幾個 function，那只要在程式的特定地方寫上註解，就可以利用 help 下去查了喔，請看底下例子：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">#!/usr/local/bin/python</span><br />
<span class="kw1">def</span> fib<span class="br0">&#40;</span>n<span class="br0">&#41;</span>: <br />
&nbsp; <span class="st0">&quot;Print a Fibonacci series up to n&quot;</span><br />
&nbsp; a, b = <span class="nu0">0</span>, <span class="nu0">1</span><br />
&nbsp; <span class="kw1">while</span> b <span class="sy0">&lt;</span> n:<br />
&nbsp; &nbsp; <span class="kw1">print</span> b,<br />
&nbsp; &nbsp; a, b = b, a+b<br />
<span class="kw1">def</span> <span class="kw3">test</span><span class="br0">&#40;</span>n<span class="br0">&#41;</span>:<br />
&nbsp; <span class="st0">&quot;for range print&quot;</span><br />
&nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>,n<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> i<br />
<span class="kw1">def</span> module_99<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:<br />
&nbsp; <span class="st0">&quot;9*9&quot;</span><br />
&nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">10</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1</span>,n<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;%d*%d=%s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>i,j,i<span class="sy0">*</span>j<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;&quot;</span><br />
<span class="kw1">def</span> fib2<span class="br0">&#40;</span>n<span class="br0">&#41;</span>: <span class="co1"># return Fibonacci series up to n</span><br />
&nbsp; <span class="st0">&quot;Return a list containing the Fibonacci series up to n&quot;</span><br />
&nbsp; result = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; a, b = <span class="nu0">0</span>, <span class="nu0">1</span><br />
&nbsp; <span class="kw1">while</span> b <span class="sy0">&lt;</span> n:<br />
&nbsp; &nbsp; &nbsp; result.<span class="me1">append</span><span class="br0">&#40;</span>b<span class="br0">&#41;</span> &nbsp; &nbsp;<span class="co1"># see below</span><br />
&nbsp; &nbsp; &nbsp; a, b = b, a+b<br />
&nbsp; <span class="kw1">return</span> result</div></div>
<p>上面看到 &#8220;註解&#8221; 這部份，就是可以利用 Python 的 command line help 指令可以查詢說明，撰寫說明很快，很方便，寫出來跟 man 差不多<br />
<a href="http://www.flickr.com/photos/appleboy/3441952396/" title="Python (by appleboy46)"><img src="http://farm4.static.flickr.com/3356/3441952396_287e9cafb8.jpg" title="Python (by appleboy46)" alt="Python (by appleboy46)" width="500" height="390" /></a><br />
<a href="http://www.flickr.com/photos/appleboy/3441282041/" title="Python2 (by appleboy46)"><img src="http://farm4.static.flickr.com/3638/3441282041_086e611dc8.jpg" title="Python2 (by appleboy46)" alt="Python2 (by appleboy46)" width="479" height="500" /></a></p>
<p>PS: 如果要有中文註解請參考這篇：<a href="http://www.python.org/dev/peps/pep-0263/">http://www.python.org/dev/peps/pep-0263/</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2009/05/04/1272/" title="[Python] OSSF::自由軟體鑄造場 Python network programming -進階">[Python] OSSF::自由軟體鑄造場 Python network programming -進階 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/04/27/1225/" title="[Django] Web Framework- Django -初階學習心得">[Django] Web Framework- Django -初階學習心得 (4)</a></li><li><a href="http://blog.wu-boy.com/2009/03/07/940/" title=" Google App Engine SDK：python 基本教學安裝"> Google App Engine SDK：python 基本教學安裝 (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2009/04/14/1158/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Google App Engine SDK：python 基本教學安裝</title>
		<link>http://blog.wu-boy.com/2009/03/07/940/</link>
		<comments>http://blog.wu-boy.com/2009/03/07/940/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 04:41:30 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=940</guid>
		<description><![CDATA[Google App Engine 利用 python 程式語言所組成，可以利用 Google 背後的技術來開發您的 Web application，後端就交給 Google 的強大雲端運算能力，前端就可以利用 SDK 來開發您的 Web 介面，後端儲存可以用 Google Bigtable 及 GFS 的儲存方式，那現在就不多說了，花了一點時間把環境建立起來，遇到一些問題，現在來筆記一下，目前我在 FreeBSD 7.1 Release 來當作 Google App Engine 開發平台，在安裝方面有遇到一些小問題，底下來看看：
<span class="readmore"><a href="http://blog.wu-boy.com/2009/03/07/940/" title="Google App Engine SDK：python 基本教學安裝" target="_blank">...詳全文（共2211字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code.google.com/appengine/images/appengine-silver-120x30.gif" alt="Powered by Google App Engine" /><br />
<a href="http://code.google.com/appengine/">Google App Engine</a> 利用 python 程式語言所組成，可以利用 <a href="http://www.google.com.tw/">Google</a> 背後的技術來開發您的 Web application，後端就交給 Google 的強大雲端運算能力，前端就可以利用 <a href="http://code.google.com/appengine/downloads.html">SDK</a> 來開發您的 Web 介面，後端儲存可以用 <a href="http://www.google.com.tw/">Google</a> <a href="http://labs.google.com/papers/bigtable.html" target="_blank">Bigtable</a> 及 <a href="http://labs.google.com/papers/gfs.html" target="_blank">GFS</a> 的儲存方式，那現在就不多說了，花了一點時間把環境建立起來，遇到一些問題，現在來筆記一下，目前我在<a href="http://www.tw.freebsd.org/"> FreeBSD</a> 7.1 Release 來當作 <a href="http://code.google.com/appengine/">Google App Engine</a> 開發平台，在安裝方面有遇到一些小問題，底下來看看：</p>
<p>在 FreeBSD 安裝方法還蠻簡單的，首先把 python 環境弄好</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># cd /usr/ports/lang/python25/</span><br />
<span class="co0"># make install clean</span></div></div>
<p>底下這張圖就是安裝好的結果：<br />
<a title="GAE (by appleboy46)" href="http://www.flickr.com/photos/appleboy/3333900131/"><img title="GAE (by appleboy46)" src="http://farm4.static.flickr.com/3556/3333900131_dd95bd7d35.jpg" alt="GAE (by appleboy46)" width="500" height="151" /></a><br />
<span id="more-940"></span><br />
安裝好之後就是下載開發環境 SDK <a href="http://code.google.com/appengine/downloads.html">Downloads</a>，目前支援 Mac OS、Linux、Windows 都可以安裝：</p>
<p>當然我就選擇 Linux 的 zip 檔案，下載好解壓縮就可以了，接下來介紹怎麼使用，其實網路上說明文件都寫的還蠻詳細的，解壓縮產生一個資料夾 google_appengine，裡面兩個檔案是大家都會用到的：</p>
<ul >
<li><a href="http://code.google.com/appengine/docs/python/tools/devserver.html">dev_appserver.py</a>：這個檔案用來編譯您寫的 Web application</li>
<li><a href="http://code.google.com/appengine/docs/python/tools/uploadinganapp.html">appcfg.py</a>：用來上傳您寫好的檔案到 App Engine 系統</li>
</ul>
<p>再來寫測試檔案，測試看看喔，寫一個 <a href="http://code.google.com/appengine/docs/python/gettingstarted/helloworld.html">Hello, World!</a> 來看看</p>
<p>先建立一個 hello 的資料夾</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># mkdir hello</span></div></div>
<p>裡面放入兩個檔案，分別是：hello.py 跟 app.yaml，hello.py 就是您的程式檔案，app.yaml 就是網站設定檔，檔案內容分別如下：</p>
<p>hello.py：</p>
<div class="codecolorer-container python " style="overflow:auto;white-space:nowrap;width:580px"><div class="python codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">print</span> <span class="st0">'Content-Type: text/plain'</span><br />
<span class="kw1">print</span> <span class="st0">''</span><br />
<span class="kw1">print</span> <span class="st0">'Hello, world!'</span></div></div>
<p>app.yaml：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">application: hello<br />
version: <span class="nu0">1</span><br />
runtime: python<br />
api_version: <span class="nu0">1</span><br />
<br />
handlers:<br />
- url: <span class="sy0">/</span>.<span class="sy0">*</span><br />
script: hello.py</div></div>
<p>接下來開始編譯：利用 dev_appserver.py 這隻 python 程式編譯</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">google_appengine<span class="sy0">/</span>dev_appserver.py hello</div></div>
<p>這樣預設編譯 8080 port，這樣就可以利用 http://localhost:8080 來看到網站，不過底下會出現一些問題：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">WARNING &nbsp;<span class="nu0">2009</span>-03-07 03:09:<span class="nu0">14</span>,<span class="nu0">371</span> dev_appserver.py<span class="br0">&#93;</span> <br />
Could not initialize images API; you are likely missing the Python <span class="st0">&quot;PIL&quot;</span> module. ImportError: No module named _imaging</div></div>
<p>這個問題，就是沒有安裝 pytho 的 imaging 這隻 ports，我是參考了 <a href="http://blog.e-shell.org/35">FreeBSD ports and Python versions</a>，找到答案的，所以解決方式如下</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># cd /usr/ports/graphics/py-imaging</span><br />
<span class="co0"># make install clean</span></div></div>
<p>再來就是為甚麼只能在本機端觀看網頁，只要不是用 127.0.0.1 跟 localhost 就不能看，我想要用 domain name 下去看阿，所以只要加上參數就可以了</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">google_appengine<span class="sy0">/</span>dev_appserver.py <span class="re5">--address</span>=0.0.0.0 <span class="re5">--port</span>=<span class="nu0">9999</span> hello</div></div>
<p>這樣就可以利用 host name 下去看了，也可以把預設 8080 port 改成 9999，另外一個問題：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">WARNING &nbsp;<span class="nu0">2009</span>-03-07 04:<span class="nu0">27</span>:<span class="nu0">36</span>,<span class="nu0">197</span> datastore_file_stub.py<span class="br0">&#93;</span> <br />
Could not <span class="kw2">read</span> datastore data from <span class="sy0">/</span>tmp<span class="sy0">/</span>dev_appserver.datastore</div></div>
<p>這問題其實很簡單，這只是提供一個 warning 的訊息，不會造成系統不能啟動，因為如果您是寫 hello 這隻程式，根本不需要用到 data store 自然就會提醒出這個訊息，如果該檔案沒有存在也會出現這個訊息，不過系統會在啟動自動建立，所以也不用擔心，然而如果您 compiler demo 檔案，就是 guest book 這個資料夾</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">google_appengine<span class="sy0">/</span>dev_appserver.py <span class="re5">--address</span>=0.0.0.0 <span class="re5">--port</span>=<span class="nu0">9999</span> google_appengine<span class="sy0">/</span>demos<span class="sy0">/</span>guestbook</div></div>
<p>系統因為剛開始找不到 dev_appserver.datastore 這個檔案，所以會有 warning 訊息，然後也會自動建立該檔案，等您下次從新啟動，這個 warning 訊息就會消失了，可以參考此 <a href="http://markmail.org/message/7woseyiwv5vlbkty#query:Could%20not%20read%20data%20store%20data+page:1+mid:7woseyiwv5vlbkty+state:results">文章</a>，您也可以利用 &#8211;datastore_path=/usr/home/hello/datastore 來改變存 data store 的地方。</p>
<p>參考文章：<br />
<a href="http://blog.ericsk.org/">ericsk</a> 大大文章：<br />
<a title="Google App Engine" href="http://blog.ericsk.org/archives/884">Google App Engine</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros">[Vim] 想套用 *.php syntax 顏色於 *.ros (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/11/2041/" title="[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項">[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/29/1918/" title="[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)">[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/12/1901/" title="[UNIX] Vim 命令圖解說明">[UNIX] Vim 命令圖解說明 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/06/11/1386/" title="[網站] 好站連結 (三)">[網站] 好站連結 (三) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/04/27/1225/" title="[Django] Web Framework- Django -初階學習心得">[Django] Web Framework- Django -初階學習心得 (4)</a></li><li><a href="http://blog.wu-boy.com/2009/03/10/958/" title="Linux or FreeBSD screen 指令介紹使用">Linux or FreeBSD screen 指令介紹使用 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/03/09/948/" title="mydumper 取代 mysqldump 效能">mydumper 取代 mysqldump 效能 (1)</a></li><li><a href="http://blog.wu-boy.com/2009/02/24/834/" title="如何在 console 端使用 Tail (View) Multiple Files on UNIX / Linux Console">如何在 console 端使用 Tail (View) Multiple Files on UNIX / Linux Console (3)</a></li><li><a href="http://blog.wu-boy.com/2009/02/23/829/" title="[FreeBSD] 利用 portmaster 升級 PHP 5.26 -> 5.28">[FreeBSD] 利用 portmaster 升級 PHP 5.26 -> 5.28 (2)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2009/03/07/940/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
