2009-03-31 22:43

REPLACE INTO 和 INSERT INTO 的區别[MySQL]

REPLACE 與INSERT 在 Syntax 及功能上都很類似
在插入資料遇到 PRIMARY KEY 或 UNIQUE KEY 碰撞時
REPLACE 會將原本的資料刪除再執行新增的動作

這裡特別要注意的是會將資料刪除
並不只是使用複寫方式去處理的

利用 REPLACE for SELECT 來處理資料真的很方便
不必擔心資料碰撞的問題
但請記得 REPLACE 的特性
有時候事情不是想像中那麼快樂的

REPLACE Syntax:
  1. REPLACE [LOW_PRIORITY | DELAYED] 
  2.    [INTO] tbl_name [(col_name,...)] 
  3.    {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 
  4.  
  5. -- 或: 
  6.  
  7. REPLACE [LOW_PRIORITY | DELAYED] 
  8.    [INTO] tbl_name 
  9.    SET col_name={expr | DEFAULT}, ... 
  10.  
  11. -- 或: 
  12.  
  13. REPLACE [LOW_PRIORITY | DELAYED] 
  14.    [INTO] tbl_name [(col_name,...)] 
  15.    SELECT ... 


參考來源:
MySQL Replace INTO的使用
MySQL 5.0 REPLACE Syntax
2009-03-31 21:24

將查詢結果更新至資料表 UPDATE for SELECT [MySQL]

今天又學到一個 MySQL 新方法,原本就在找利用 SELECT 的結果 UPDATE 至資料表的方法,最後終於在 MySQL 官網中的回應裡找到了
  1. UPDATE 
  2.    `t1` AS A, 
  3.    (SELECT `b1`, COUNT(*) AS `total` FROM `t2` GROUP BY `c1`) AS B 
  4. SET A.`a2`=B.`total` 
  5. WHERE A.`a1`=B.`a1` 


MySQL5.0: UPDATE Syntax
2009-03-29 08:09

iGoogle 小工具製作心得

iGoogle 小工具主要是以 XML 為主體,再加上 HTML、CSS 及 JavaScript 所組成的,基本上只要會後面三種語言,要開發 iGoogle 小工具是非常快樂的一件事。

在這裡我只做一些的教學及心得分享,詳細的規範及 API 說明,請察看官方網站 Google 小工具 API 開發人員指南,開發指南裡面寫的很清楚,還有很多的範例可以參考。

心得建議:
  • 開發時建議 XML 的檔名不要太正式,iGoogle 的平台會 cache XML,造成檢視上會出現不一致情況,等到要發佈時再取一個正式的檔名,避免不必要的問題發生。
  • 如果要使用 session 和 cookie 做登入驗證的話,最好使用 <iframe> 去處理,會比較容易達成且安全問題也比較少。
  • 在 ModulePrefs 中的 category 屬性也記得加上去,在官方的開發人員指南中並沒有說明,共有:
    • politics
    • tools
    • funandgames
    • lifestyle
    • finance
    • communication
    • 等...。

  • 多利用[便條簿]做測試可以減少不少時間。
  • 測試時最好在 iGoogle 上另開一個[分頁],免得自己原本常用的小工具被打亂。
  • 在測試的[分頁]中最好加上[開發人員小工具]這個小工具去管理 cache 問題。

小工具範例:
  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <Module> 
  3.  <ModulePrefs 
  4.    title="單位換算" 
  5.    description="更方便的介面處理單位制度上的換算" 
  6.    directory_title="單位換算" 
  7.    author="Jax" 
  8.    author_email="weskerjax+feed@gmail.com" 
  9.    thumbnail= 
  10.      "http://weskerjax.googlepages.com/unit_converter_thumbnail.png" 
  11.    screenshot= 
  12.      "http://weskerjax.googlepages.com/unit_converter_screenshot.png" 
  13.    title_url="http://jax-work-archive.blogspot.com/" 
  14.    category="tools" 
  15.    height="300"> 
  16.    <Locale lang="zh-tw" country="TW"/> 
  17.    <Require feature="tabs"/> 
  18.    <Require feature="dynamic-height"/> 
  19.  </ModulePrefs> 
  20.  <UserPref 
  21.   name="type" 
  22.   display_name="預設開啟的頁籤" 
  23.   default_value="長度" 
  24.   datatype="enum"> 
  25.    <EnumValue value="長度"/> 
  26.    <EnumValue value="重量"/> 
  27.    <EnumValue value="面積"/> 
  28.    <EnumValue value="體積"/> 
  29.  </UserPref> 
  30.  <Content type="html"> 
  31.  <![CDATA[ 
  32. <style type="text/css"> 
  33. .JContent table{ 
  34.    margin-top:5px; 
  35.    width:100%; 
  36. } 
  37. .JContent th{ 
  38.    background-color:#99CCFF; 
  39.    padding-top:5px; 
  40. } 
  41. .JContent label{ 
  42.    text-align:center; 
  43.    padding:3px; 
  44.    display:block; 
  45.    font-size:12px; 
  46. } 
  47. .JContent label input{ 
  48.    display:block; 
  49.    text-align:left; 
  50.    line-height:1.1em; 
  51.    font-size:11px; 
  52.    width:95%; 
  53. } 
  54. </style> 
  55. <script type="text/javascript"> 
  56. var prefs = new _IG_Prefs(__MODULE_ID__); 
  57. function set_event__MODULE_ID__(tabId){ 
  58.    var inputs=_gel(tabId).getElementsByTagName('input'); 
  59.    for (var i=0, j=inputs.length; i<j; i++){ 
  60.        el=inputs[i]; 
  61.        /*設定 onkeyup 時處理單位換算*/ 
  62.        el.onkeyup=function(){ 
  63.            this.value=this.value.match(/[0-9]+[\.]?[0-9]*/); 
  64.            var rate=this.getAttribute('rate'); 
  65.            var value=parseFloat(this.value)/parseFloat(rate); 
  66.  
  67.            var table=this; 
  68.            while(table.tagName!="TABLE"){table=table.parentNode;} 
  69.  
  70.            var inputs=table.getElementsByTagName('input'); 
  71.            for (var i=0, j=inputs.length; i<j; i++){ 
  72.                chg=inputs[i]; 
  73.                r=chg.getAttribute('rate'); 
  74.                if(r==rate){continue;} 
  75.  
  76.                if(this.value){chg.value=value*parseFloat(r);} 
  77.                else{chg.value='';} 
  78.            }; 
  79.        }; 
  80.        /*設定 onfocus 選取所有文字*/ 
  81.        el.onfocus=function(){this.select()}; 
  82.    }; 
  83.    /*讓小工具能夠自行調整大小*/ 
  84.    _IG_AdjustIFrameHeight(); 
  85. } 
  86. function init() { 
  87.    /*建立頁籤並選定預選頁籤*/ 
  88.    var tabs = new _IG_Tabs(__MODULE_ID__,prefs.getString("type")); 
  89.    tabs.addTab("長度","J_length",set_event__MODULE_ID__); 
  90.    tabs.addTab("重量","J_weight",set_event__MODULE_ID__); 
  91.    tabs.addTab("面積","J_area",set_event__MODULE_ID__); 
  92.    tabs.addTab("體積","J_volume",set_event__MODULE_ID__); 
  93. } 
  94. _IG_RegisterOnloadHandler(init);/*載入時呼叫的事件處理常式*/ 
  95. </script> 
  96. <div class="JContent" id="J_length"> 
  97.  <table border="1" cellspacing="0" cellpadding="0"> 
  98.    <tr> 
  99.      <td><label>公尺<input rate="1" type="text" /></label></td> 
  100.      <td><label>公里<input rate="0.001" type="text" /></label></td> 
  101.      <td><label>海里<input rate="0.00053996" type="text" /></label></td> 
  102.    <tr> 
  103.      <td><label>英吋<input rate="39.370" type="text" /></label></td> 
  104.      <td><label>英呎<input rate="3.2808" type="text" /></label></td> 
  105.      <td><label>英碼<input rate="1.0936" type="text" /></label></td> 
  106.    </tr> 
  107.      <td><label>台尺<input rate="3.3003" type="text" /></label></td> 
  108.      <td><label>市里<input rate="2e-3" type="text" /></label></td> 
  109.      <td><label>市引<input rate="0.03" type="text" /></label></td> 
  110.    </tr> 
  111.  </table> 
  112. </div> 
  113. <div class="JContent" id="J_weight"> 
  114.  <table border="1" cellspacing="0" cellpadding="0"> 
  115.    <tr> 
  116.      <td><label>公斤<input rate="1" type="text" /></label></td> 
  117.      <td><label>公克<input rate="1e+3" type="text" /></label></td> 
  118.      <td><label>公噸<input rate="1e-3" type="text" /></label></td> 
  119.    </tr> 
  120.    <tr> 
  121.      <td><label>英磅<input rate="2.2046" type="text" /></label></td> 
  122.      <td><label>盎司<input rate="35.273" type="text" /></label></td> 
  123.      <td><label>英噸<input rate="9.8421e-4" type="text" /></label></td> 
  124.    </tr> 
  125.    <tr> 
  126.      <td><label>美噸<input rate="0.0011023" type="text" /></label></td> 
  127.      <td><label>格令<input rate="15432" type="text" /></label></td> 
  128.      <td><label>克拉<input rate="5000" type="text" /></label></td> 
  129.    </tr> 
  130.    <tr> 
  131.      <td><label>台斤<input rate="1.6667" type="text" /></label></td> 
  132.      <td><label>台兩<input rate="26.667" type="text" /></label></td> 
  133.      <td><label>市擔<input rate="0.02" type="text" /></label></td> 
  134.    </tr> 
  135.  </table> 
  136. </div> 
  137. <div class="JContent" id="J_area"> 
  138.  <table border="1" cellspacing="0" cellpadding="0"> 
  139.    <tr> 
  140.      <td><label>公畝<input rate="100.00" type="text" /></label></td> 
  141.      <td><label>公頃<input rate="1" type="text" /></label></td> 
  142.      <td><label>平方公里<input rate="0.01" type="text" /></label></td> 
  143.    </tr> 
  144.    <tr> 
  145.      <td><label>平方英寸<input rate="155e+5" type="text" /></label></td> 
  146.      <td><label>平方英尺<input rate="107640" type="text" /></label></td> 
  147.      <td><label>平方碼<input rate="11960" type="text" /></label></td> 
  148.    </tr> 
  149.    <tr> 
  150.      <td><label>英畝<input rate="2.4711" type="text" /></label></td> 
  151.      <td><label>平方英里<input rate="0.003861" type="text" /></label></td> 
  152.      <td> </td> 
  153.    </tr> 
  154.  </table> 
  155. </div> 
  156. <div class="JContent" id="J_volume"> 
  157.  <table border="1" cellspacing="0" cellpadding="0"> 
  158.    <tr> 
  159.      <td><label>立方公尺<input rate="1" type="text" /></label></td> 
  160.      <td><label>公升<input rate="1e+3" type="text" /></label></td> 
  161.      <td><label>毫升<input rate="1e+6" type="text" /></label></td> 
  162.    </tr> 
  163.    <tr> 
  164.      <td><label>英國加侖<input rate="219.97" type="text" /></label></td> 
  165.      <td><label>液體加侖<input rate="264.17" type="text" /></label></td> 
  166.      <td><label>固體加侖<input rate="227.02" type="text" /></label></td> 
  167.    </tr> 
  168.  </table> 
  169. </div> 
  170.  ]]> 
  171.  </Content> 
  172. </Module> 


範例預覽:

範例原始檔:unit_converter.xml


第一個開發的小工具:
2009-03-27 12:41

[PHP] 利用表單傳遞多維陣列

有時候在表單傳遞上會需要具有結構性的變數傳遞,在後端的資料處理上會比較方便,不會在變數名稱上的處理花時間,PHP 有提供可以處理多維陣列的傳遞方式,在多維陣列處理上必須要有 inedx 名稱,如果只要傳遞一維無序陣列就不用設定 inedx 名稱,只需要將 name="data[]"就可以了。 表單的命名方式:
  1. <form action="" method="post"> 
  2. <ul> 
  3. <li> 
  4.  <input type="checkbox" name="data[0][is]" value="1" /> 
  5.  <input type="text" name="data[0][value]" value="1" /> 
  6.  <select name="data[0][unit]"> 
  7.    <option value="km">公里</option> 
  8.    <option value="m">公尺</option> 
  9.    <option value="cm">公分</option> 
  10.  </select> 
  11. </li> 
  12. <li> 
  13.  <input type="checkbox" name="data[1][is]" value="1" /> 
  14.  <input type="text" name="data[1][value]" value="1" /> 
  15.  <select name="data[1][unit]"> 
  16.    <option value="km">公里</option> 
  17.    <option value="m">公尺</option> 
  18.    <option value="cm">公分</option> 
  19.  </select> 
  20. </li> 
  21. <li> 
  22.  <input type="checkbox" name="data[2][is]" value="1" /> 
  23.  <input type="text" name="data[2][value]" value="1" /> 
  24.  <select name="data[2][unit]"> 
  25.    <option value="km">公里</option> 
  26.    <option value="m">公尺</option> 
  27.    <option value="cm">公分</option> 
  28.  </select> 
  29. </li> 
  30. </ul> 
  31.  <input type="submit" /> 
  32. </form> 
PHP 的接收格式:
  1. <?php 
  2. print_r($_POST['data']); 
  3. /* 
  4. Array 
  5. ( 
  6.  [0] => Array 
  7.  ( 
  8.    [is] => 1 
  9.    [value] => 1 
  10.    [unit] => km 
  11.  ) 
  12.  
  13.  [1] => Array 
  14.  ( 
  15.    [is] => 1 
  16.    [value] => 1 
  17.    [unit] => m 
  18.  ) 
  19.  
  20.  [2] => Array 
  21.  ( 
  22.    [is] => 1 
  23.    [value] => 1 
  24.    [unit] => cm 
  25.  ) 
  26.  
  27. ) 
  28. */ 
  29. ?> 
2009-03-26 22:29

Excel 圖片隨著單元儲存格排序

Excel 真的是一個很好用的文書工具,這幾天為了圖片排序的問題,扒了不少文章,順便做一下心得紀錄。

Excel 插入圖片
選擇從檔案插入圖片。

Excel 插入圖片
選擇需要的圖片全部插入。

Excel 選取全部的圖片
按下[Ctrl]鍵+滑鼠選取全部的圖片。

Excel 設定圖片格式
設定圖片格式。

Excel 圖片大小設定
在[大小]的頁籤中,建議先將圖片縮小到預定大小的 3/2,在拖移時會比較方便操作。
如果要將圖片填滿整個單元儲存格,建議將[鎖定長寬比]取消。

Excel 圖片隨著單元儲存格排序
在[摘要資訊]的頁籤中決定圖片的定位方式,建議選擇第一項[大小位置隨儲存格而變],因為儲存格必須完全包含整張圖片,如果超過單一範圍的儲存格都會讓排序失效,所以建議將圖片填滿整個儲存格,並且隨儲存格變動,避免圖片超過儲存格的意外。

Excel 設定列高

Excel 設定列高
先將[列高]及[欄寬]調整到所需要的大小。

Excel 滑鼠拖移及縮放鎖定
按下[Alt]鍵+滑鼠拖移圖片至儲存格。
[Alt]鍵具有格線鎖定的功能,會將滑鼠拖移及縮放鎖定在格線上,可以精確的將圖片填滿整個儲存格。

Excel 選擇排序範圍
選擇需要排序的範圍。

Excel 選擇排序方式
選擇排序方式。

Excel 圖片隨著單元儲存格排序
呈現的結果。
2009-03-19 10:26

動態調整 PHP 最大記憶體上限(memory_limit)

在使用 php 寫 script 去做排程時
這類的 script 執行次數通常不會很多
可是卻會使用大量的 memory
雖然一個好的程式不應該如此肥胖
但為了開發上的效率和整體結構
就允許這小小的肥胖吧!

雖然可以在 php.ini 中設定 memory_limit 的值
但這並不是一個很好的方法
因為在 php.ini 中屬於全域設定
這代表每一支 script 都可以使用這麼大 memory
再開發時沒注意到的話
這只會讓胖胖的程式愈來愈多
這不是一件好事

所以呢?(廢話這麼多)
在程式中動態調整所需的 memory 會是比較好的作法
只要在程式一剛開始的地方做設定就好了
這樣也不用為了少數幾支肥胖的程式去調整 php.ini
  1. <?php 
  2. ini_set("memory_limit","2048M"); 
  3. //....... 
  4. ?> 
2009-03-19 01:25

[Shell] 利用 tar 作資料備份

一般在 console 使用 tar 做備份壓縮時,都會習慣使用相對路徑做壓縮,在解壓縮時也比較方便,可是再寫 Shell 做 crontab 排程時,也想要使用相對路徑做壓縮的話,必須用一些方法,下面的 script 還加上過濾檔案的機制,可以排除一些隱藏檔或特定目錄的備份。

  1. #!/bin/bash 
  2. # Program : 備份指定目錄 
  3. # History : 2009/03/19 
  4. # Author : Jax 
  5. # E-mail : weskerjax@gmail.com 
  6. # Website : http://jax-work-archive.blogspot.com/ 
  7.  
  8. PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  9. export PATH 
  10.  
  11. # 排除不需要備份的檔案類型 
  12. EXCLUDE="" 
  13. FILTER=( 
  14. "*.bak"           # 排除副檔名為 .bak 的檔案 
  15. ".*"              # 排除所有隱藏檔 
  16. "/CVS/"           # 排除所有目錄為 CVS 的目錄 
  17. "Smarty/cache"    # 排除路徑為 Smarty/cache 的目錄 
  18. "Smarty/tpl_c"    # 排除路徑為 Smarty/tpl_c 的目錄 
  19. ) 
  20. for i in "${FILTER[@]}" ; do 
  21.    EXCLUDE="$EXCLUDE --exclude=$i" 
  22. done 
  23.  
  24. # 時間參數 
  25. DATE=$(date +%Y%m%d) 
  26.  
  27. # 配份目錄 
  28. TARGET_DIR="/home/web" 
  29.  
  30. # 備份檔名路徑目錄 
  31. ZIP_FILE="/home/backup/backup_$DATE.tar.bz2" 
  32.  
  33. # 執行壓縮指令 
  34. tar -jcf $ZIP_FILE $EXCLUDE -C $TARGET_DIR $(ls $TARGET_DIR) 
  35.  
  36. exit 0; 


原始檔:server_backup.sh
2009-03-04 21:52

製作 sitemap 的心得

最近在為網站製作 sitemap 產生器,花了半小時去看 sitemaps.org - 通訊協定,這跟 Google 網站管理員工具的定義是一樣的,基本上 sitemap 的格式是很簡單的,詳細說明請察看官方文件。

網路上有很多 sitemap 產生器,但產生出來的結果不如期望,為了做出更好的 sitemap 清單,我就自己作網站的 sitemap 產生器。


需要注意的小細節:
  1. sitemap 索引與 sitemap 中 url 引入的 xsd 是不一樣的
  2. 注意檔案大小 10MB 及筆數的上限 50,000 筆 URL。
  3. 檔案如果很大最好用 gzip 壓縮,壓縮率會有 10 倍以上的落差。
  4. 一定要用驗證器確認格式是否正確,在壓縮前請先確認格式,驗證器無法解析 gzip
  5. 一份 sitemap 中的 priority 值不能全部一樣,Google 會出現 warning。
  6. 如果檔案已經封存不會變動,在 changefreq 的值最好設定為 never ,這樣會得到較好的文件索引。


Sitemap:
  1. <?xml version='1.0' encoding='UTF-8'?> 
  2. <urlset  
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9" 
  5.    url="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" 
  6.    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
  7. > 
  8.   <url> 
  9.      <loc>http://www.example.com/</loc> 
  10.      <lastmod>2005-01-01</lastmod> 
  11.      <changefreq>monthly</changefreq> 
  12.      <priority>0.8</priority> 
  13.   </url> 
  14.   <url> 
  15.      <loc>http://www.example.com/catalog?item=12&desc=v_hawaii</loc> 
  16.      <lastmod>2005-01-01</lastmod> 
  17.      <changefreq>monthly</changefreq> 
  18.      <priority>0.8</priority> 
  19.   </url> 
  20.   <url> 
  21.      <loc>http://www.example.com/catalog?item=83&desc=v_usa</loc> 
  22.      <lastmod>2005-01-01</lastmod> 
  23.      <changefreq>monthly</changefreq> 
  24.      <priority>0.8</priority> 
  25.   </url> 
  26. </urlset> 


Sitemap 索引檔:
  1. <?xml version='1.0' encoding='UTF-8'?> 
  2. <sitemapindex  
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9" 
  5.    url="http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd" 
  6.    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
  7. > 
  8.   <sitemap> 
  9.      <loc>http://www.example.com/sitemap1.xml.gz</loc> 
  10.      <lastmod>2004-10-01T18:23:17+00:00</lastmod> 
  11.   </sitemap> 
  12.   <sitemap> 
  13.      <loc>http://www.example.com/sitemap2.xml.gz</loc> 
  14.      <lastmod>2005-01-01</lastmod> 
  15.   </sitemap> 
  16. </sitemapindex> 


Sitemap 驗證器:
Google Sitemap(s) Validator


參考文章:
Peter的部落格: Google Sitemaps 教學
網站登錄與提交sitemap(Yahoo!) @ 神鵰蝦