首頁

2013年6月23日 星期日

**~考慮舊版相容性的**APP~設計------**!!^

**~考慮舊版*.*相容性的***APP~設計   -------  **!!^
***

**iOS每年推陳出新,不斷地冒出各式各樣**
新鮮有趣的新類別,新method,讓我們可以--
--天馬行空地發揮想像力,設計更多令人耳目--
--**一新的App。但是,世界並沒有想像中美好,
不可能每個人的iPhone都升級到最新的iOS。
因此,我們還是要考慮到這些舊版iOS--
--使用者的相容性**~!!^

**以最新推出的iOS 6為例,MKMapItem是個**
**全新的類別,提供我們更方便的地圖應用
可能。但是舊版的iOS就不支援了,因此我們在--
--設計App時,最好能夠聰明地判斷,當使用者--
--機器為iOS 6時才使用MKMapItem, 當機器為--
--舊版的iOS時則採用另外的配套方案 **&^

**判斷的方法很簡單,只要以下2行程式碼   :
**

**
Class itemClass = [MKMapItem class];
 if([itemClass respondsToSelector:@selector (openMapsWithItems:launchOptions:)])
 {
     
 }


說明:
不管使用者的機器是否為iOS 6,

都可以建立MKMapItem類別物件。
但只有iOS 6機器所建立的,才真正具有--
--執行MKMapItem所定義method的能力。
因此只有在iOS 6,以上的if敘述才會成立 **~!! ^^

****
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

*~電腦突然就~~不能開機了 ?!!**^

*


*~
電腦突然就~~不能開機了 ?!!**^

**原本前一天電腦還可以正常開機,為什麼 ?!!
今天忽然就不能開機了?~~
  一般使用者所謂的「不能開機」很籠統,
只要沒有進入到Windows裡,他們都稱 
「不能開機」,其實不能開機有很多種情況,
每種解決的方法都不一樣,一般所謂的 
「不能開機」有以下幾種情形:
  1. 「按下電源開關後,沒有反應,
也就是沒有電源」。
  2. 「一打開電腦沒有螢幕畫面,
但主機的燈有亮」。
  3. 「畫面停在黑黑、一堆英文字的
地方(BIOS POST階段)」。
  4. 「進入到Windows後,也就是已經--
--看到Windows XP的商標後,又跳開重開機」 。

  而這一篇文章要探討的是屬第三種:
畫面停在黑黑、一堆英文字的地方
(BIOS POST階段)」及第四種  ---
---「進入到Windows後,也就是已經--
--看到Windows XP的商標後,又跳開重開機
的這種不能開機  **~!

畫面停在黑黑、一堆英文字的地方
(BIOS POST階段)
  會停在BIOS POST階段,多半是硬體--
--的狀態有改變到,而最常見的狀況都是出在
「硬碟」,狀況有下列兩種:
  1. 開機裝置的順位(硬碟)沒有指定好。
一般來說,硬碟的開機順位設定不會無故跑掉,

一定有原因,大部份都是電池沒電的關係,
所以主機板沒有辦法記憶你所設定好的資料,
主機板電池的位置及長相你可以參考
msn即時通無法登入,錯誤碼80048820」;
還有一種比較嚴重的情況就是  -----
----「硬碟已經壞掉」了,所以主機板在---
--開機時沒有抓到它,才造成無法開機的情況,
這種情況的解決方法當然是換硬碟就好了  **

  2. 開機裝置有指定好,但是開機區--
--資料損壞。
   就算你開機裝置的設定正確無誤,
結果還是不能開機,就很有可能是開機區--
--資料損毀,通常開機區損毀在開機時都會-
-有「NTLDR is missing」的訊息,開機區的-
-資料也不太可能會無緣無故的就損毀,
多半是因為不正常關機木馬病毒程式或是--
--硬碟壞軌的關係,除了壞軌的情況你有--
--可能需要去更換硬碟之外,若是因為其它--
--因素而造成開機區資料損毀,你可以嘗試 
稍後下一段「修復主控台」來做修復 **~!*

進入到Windows後,也就是已經--
--看到Windows XP的商標後,又跳開重開機
  若是進入Windows後又跳掉重開機的--
--情況,最常見的是「記憶體」、 
「CPU散熱的問題」、「硬碟壞軌」及 
「開機區資料損壞」的問題,同樣的若是 
「開機區資料損壞」的情況請參考以下的 
「修復主控台」的修復教學 !!~

使用復原主控台來修復WindowsXP安裝

  我曾經在「電腦中毒了要怎麼辦?
處理流程教學總整理」的這篇文章上有提到
「復原主控台」這個東西,那時由於篇幅的
關係所以沒有辦法很詳細的介紹進入的方法,
接下來就讓我示範一下如何進入「復原主控台」。
  要進入復原主控台之前,你需要準備--
--幾個東西,「WindowsXP原始光碟」、
最高系統管理者Administrator的密碼」,
當你準備好打開主機電源,立即將
「WindowsXP原始光碟」放進光碟機中吧 !
  當你將「WindowsXP原始光碟」
放進光碟機,且有設定「光碟機」開機的話,
你應該會看到以下這個訊息 
「Press any key to boot from CD..」,
意思就是要你隨便按鍵盤上任一個按鍵,
電腦即會從光碟片上開機:             **







**等約一至兩分鐘,會來到Windows XP 的
安裝程式畫面,這時有三個選項讓你選擇
   1. 如果您要立即安裝Windows XP,
請按ENTER。
   2. 如果您要使用復原主控台來修復 
 Windows XP安裝,請按R。
   3. 如果您不想安裝 Windows XP,
請按F3。
  這時當然是請你按下「R」來使用
復原主控台   **
**















**按下「R」之後會來到以下這個畫面,這時候請不要隨便亂按 
鍵盤上的Enter鍵,請你先等約5秒鐘,如果你有注意到的話,
最下面有一行訊息是這麼寫著「如果您要選取非預設的鍵盤格式,
請現在按ENTER」,由於我們都是要選擇預設的鍵盤格式,
所以請你先什麼都不要按,直到出現下一段文字訊息  **




















**緊接下來,會要你選擇要登入哪個Windows,如果你的電腦只*
*安裝了一個Windows,當然是只有「1:C:\WINDOWS」一個選擇,*
*所以就請你按「1」,並且按下ENTER,接下來馬上就會要你*
*輸入Administrator的密碼,請輸入你的Administrator的密碼,*
**這個Administrator是當初在安裝Windows時所設定的,
所以如果你的Windows不是你自己安裝的,很有可能這個密碼是空的**
*所以可以試一下直接按ENTER,看看是否可以通過密碼的驗證***
(註:當你這個Administrator的密碼是空的時候你要注意這個帳號**
**最好要設定一個適當的密碼,才不容易被駭客入侵,
或是被木馬程式所利用)**










**進入復原主控台後,在每行可以輸入指令之前會有一個**
**命令提示字元,就好像在DOS一樣,你可以鍵入「HELP」來看一下*
*有哪些指令可以使用,之後可以按「HELP 指令」來了解到這個指令**
*要如何的使用,在這裡我們要使用到的指令有三個,「fix boot」、
fixmbr」及「chkdsk」 ,以下是這三個的使用說明:                  **

**fixboot 在系統磁碟分割上寫入新的開機磁碟分割 :               **
**

**fixmbr 修復開機磁碟分割上的主開機記錄:                                 **
**

**chkdsk 檢查磁碟並顯示狀態報告 :                                                    **
**

**這時候你可以鍵入「fixboot」,來將新的開機寫入磁碟分割,
當你一執行指令後,即會詢問你要寫入的磁碟分割是C:嗎? 
請按鍵入「y」,即代表yes   **
**


**再來我們要來重新寫入一個新的主開機記錄(MBR),
請你執行「fixmbr」這個指令,也一樣,它會停在一個詢問訊息,
「您確定要寫入一個新的MBR嗎?」,請你按「y」**
**


**最後一個我們要用的指令是「chkdsk」, 
這個指令要代一些參數一起使用,請輸入「chkdsk c: /r」**
*~注意:每一個參數都要用「空白」隔開,即會開始檢查磁碟區C,
並且並到有問題的區域時會立即做修復的動作**
**


**最後要離開「復原主控台」時,請你鍵入「exit」 **
*~!電腦即會立即的重新開機**
**執行這三個指令,在非真的壞軌的情況下,
可以挽救一些磁區損毀的問題,不保證一定可以,
但是值得一試的好方法  **~!*

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

**網頁介面開發**拖拉元素~調整排序**~!

**~*網頁介面開發**
拖拉元素~調整排序**~!

**網頁介面開發技巧是--拖拉元素調整排序**
**網頁上會顯示五個<span>方塊,
假設其排序有特定意義(例如: 出場順序,
決定先用皮卡丘之後再派妙蛙種子之類的),
使用者可用滑鼠或手指直接拖曳方塊--
--改變其排列順序,當某個方塊被拖到另一個方塊上,就對調兩個方塊的位置,
藉此自由調整所有方塊的排列順序**
****
****

**有興趣了解程式開發細節的*來看看程式裡用到的技巧:       *
**
  1. 產生五個<span>方塊的部分,採用的--
  2. -- MVVM的做法。宣告了一個viewModel函數,
  3. 透過ko.observableArray()保存資料物件陣列,
  4. <div id="dvList" data-bind="foreach: items">
  5. 將資料物件陣列的每個元素對應成一個<span>
  6. ,用<span data-bind="text: name">可將屬性
  7. 當成<span>的內容。 viewModel函數中,
  8. var self = this;的做法可視為knockout.js中
  9. 的Best Practice  **
  10. 為突顯knockout.js可即時反應資料變化的特性,
  11. 我刻意每隔0.5秒塞入一筆資料,讓我們可--
  12. --觀察到Player0到Player4逐一出現的過程。
  13. 而由於setTimeout塞入資料為非同步作業,
  14. 為了確保在全部完成後才執行下一步驟,
  15. 再次使用$.Deferred()的技巧處理同步化  ~!**
*元素拖拉部分採用的是Kendo UI Web**的Drag & 
 Drop功能。實測發現,用Kendo UI所開發的拖拉 -
-功能,不管在PC使用滑鼠操作或在行動裝置進行
手指觸控操作都很順暢,不需針對不同裝置特意
改寫,十分便捷。(但有些小眉角,例如: 有多個--
--放置目標時如何取得當時的放置目標,需要點--
--小技巧,細節可參見程式註解) ***

**至於方塊對調位置的動畫效果,則是--
--將<span>元素先轉成position: absolute,
再靠.animate({ left: 新座標 })搞定,對 jQuery來說-
-不過小菜一碟。
移動過程為了讓使用者有方塊是浮起來在空中-
-飛移的錯覺,
借用了CSS3的transform:
scale(1.1,1.1)讓<span>放大10%,此時早先介紹的HTML5/CSS3瀏覽器
支援速查工具派上用場,
查詢結果顯示要IE10, FF16才支援不加-ms-,
–moz-的寫法,Safari/Chrome則仍需要-webkit-,
所以乖乖加上-ms-, –moz-, –webkit-寫成三筆   **

**<span>對調順序的部分,用jQuery的.after()就
可以解決,但為了定址方便,我偷偷加放了 
一個空白<span class='item-pos'>,
程式碼瞬間簡化許多**

**完整程式碼如下,已內含不少註解,
但坦白說,因涉及不少進階技巧,
程式碼並不好懂,希望註解夠清楚 ~!!
**
**
排版顯示純文字
<!DOCTYPE html>

 
<html> 
<head> 
    <title>Drag to Swap Demo</title> 
    <script src="../Scripts/jquery-1.7.2.min.js"></script> 
    <script src="../Scripts/kendo/kendo.web.js"></script> 
    <script src="../Scripts/knockout-2.1.0.js"></script> 
    <link href="../Content/kendo/kendo.common.min.css" 
rel="stylesheet" type="text/css" /> 
    <link href="../Content/kendo/kendo.metro.min.css" 
rel="stylesheet" type="text/css" /> 
    <script> 
       //定義ViewModel類別 
        function viewModel() { 
          //將this另指派給self變數,之後以其代表View Model本體,
            //避免與函數中的this所指的對象混淆  
            var self = this; 
          //定義一個集合存放資料 
            self.items = ko.observableArray(); 
          //定義加入item的方法, 在items中加入具有name及score屬性的物件 
            self.addItem = function(name, score) { 
                self.items.push({ name: name, score: score }); 
          };  
        } 
 
        $(function () { 
           //建立ViewModel 
           var vm = new viewModel(); 
           //每隔0.5秒加一筆以觀察knockoutJs讓UI即時反應資料變化的效果 
            //使用jQuery.Deferred處理實現完成時機的同步 
            function job(i) { 
                var df = $.Deferred(); 
                setTimeout(function () { 
                    vm.addItem("Player" + i, i * 100); 
                    df.resolve(); 
                }, i * 500); 
                return df.promise(); 
            } 
            //建立延遲0-4秒執行的加入item作業 
            var jobs = []; 
            for (var i = 0; i < 5; i++) { 
                jobs.push(job(i)); 
            } 
            //等待所有job執行完畢,掛上Kendo UI拖拉功能 
            $.when.apply(null, jobs).then(function () { 
                var $items = $("span.item"); 
                //加上拖曳特性,hint事件回傳拖曳過程顯示的元素 
    $items.kendoDraggable({ 
                    hint: function (e) { 
                        return e.clone().addClass("drag-item"); 
                    } 
                }) 
                .each(function () { 
                    //由於kendoDropTarget事件中,
被放置對象this非亦無事件屬性可存取 
                       //故使用Closure方式將元素存入$item供drop事件存取 
                    var $item = $(this);
                    //加上放置目標特性才能接成為拖曳的目標 
                    $item.kendoDropTarget({
                        //拖曳到目標元素上方及離開
時改變CSS,提供使用者可以放置的提示
                        dragenter: function (e)
 { $item.addClass("drop-item"); },
                        dragleave: function (e)
 { $item.removeClass("drop-item"); },
                        //在目標元素上方鬆開滑鼠或 
手指離開觸控螢幕時觸發drop事件 
                           drop: function (e) { 
                            //透過以下方式取得拖曳元素及放置元素 
                                 var $drag = e.draggable.element; 
                            var $drop = $item; 
                            $drop.removeClass("drop-item"); 
                            //拖曳對象與放置目標相同時不處理 
                                 if ($drag.text() == $drop.text()) return; 
                            //顯示位置交換動畫 
                                //先將全部元素轉為絕對座標 
                            $items.each(function () { 
                                //先記下座標值,以.data()保存 
                                var $elem = $(this); 
                                $elem.data("pos", $elem.position()); 
                            }) 
                            .each(function () { 
                                //維持座標位置,但換成絕對座標 
                                      var $elem = $(this); 
                                var pos = $elem.data("pos"); 
                                $(this).css({ 
                                    position: "absolute", 
                                    top: pos.top + "px", 
                                    left: pos.left + "px" 
                                }); 
                            }); 
                            //$drag與$drop交換位置,使用animate 
                            var dragLeft = $drag.data("pos").left + "px"; 
                            var dropLeft = $drop.data("pos").left + "px"; 
                            var $moving = $drag.add($drop); 
                            $moving.addClass("move-item"); 
                            $drag.animate({ left: dropLeft }, 1000); 
                            $drop.animate({ left:
 dragLeft }, 1000, function () { 
                                $moving.removeClass("move-item"); 
                                //交換位置 
                                var $dragPos = $drag.prev(".item-pos"); 
                                $drop.prev(".item-pos").after($drag);  
                                $dragPos.after($drop); 
                                //改回相對座標 
                                $items.css
({ position: "", left: "", top: "" }); 
                            }); 
                        } 
                    }); 
                }); 
            }); 
            //將ViewModel與UI結合 
            ko.applyBindings(vm); 
        }); 
    </script> 
    <style> 
        html,body { font-size: 9pt; } 
        .item 
        { 
            font-family: Segoe UI; display: inline-block; 
            border: 1px solid gray; 
            margin-left: 5px; padding: 5px; 
            width: 80px; height: 25px; 
            background-color: #0099FF; color: white; 
            text-align: center; 
        } 
        .drag-item 
        { 
            opacity: 0.5; 
            background-color: #FF3300; 
        } 
        .move-item  
        { 
            z-index: 9; 
            -ms-transform: scale(1.1,1.1); /* IE 9 */ 
            -webkit-transform: scale(1.1,1.1); /* Safari and Chrome */ 
            -moz-transform: scale(1.1,1.1); /* Firefox */ 
        } 
        #dvList { margin-top: 20px; } 
        .drop-item 
        { 
            background-color: Purple; 
        } 
    </style> 
</head> 
<body> 
<div id="dvList" data-bind="foreach: items"> 
    <span class='item-pos'></span> 
    <span class='item'> 
        <span class='item-name' data-bind="text: name"></span> 
        (<span class='item-score' data-bind="text: score"></span>) 
    </span> 
</div> 
</body> 
</html> 

**
****
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

**EXCEL*轉Data Table的NPOI簡單範例**~**

**EXCEL*Data TableNPOI~
**簡單範例**~**
**開始改用NPOI來處理Excel檔案的讀寫輸出,
感覺上比Excel DOM、OLE DB for JET、
甚至CSV法來得穩定輕巧,而NPOI功能的齊全--
--程度更是讓我驚喜連連**


**以下為使用NPOI讀取表格EXCEL檔,
自動轉成Data Table的簡單範例:**
**
using System.Data;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
 
public class NPOIHelper
{
    public static DataTable 
ReadExcelAsTableNPOI(string fileName)
    {
        using (FileStream fs =
 new FileStream(fileName, FileMode.Open))
        {
            HSSFWorkbook wb =
 new HSSFWorkbook(fs);
            Sheet sheet = wb.GetSheetAt(0);
            DataTable table = new DataTable();
            //由第一列取標題做為欄位名稱
            Row headerRow = sheet.GetRow(0);
            int cellCount =
 headerRow.LastCellNum;
            for (int i =
 headerRow.FirstCellNum; i < cellCount; i++)
                //以欄位文字為名新增欄位,
此處全視為字串型別以求簡化
                table.Columns.Add( 
                    new DataColumn
(headerRow.GetCell(i).StringCellValue));
            
            //略過第零列(標題列),一直處理至最後一列
            for (int i =
 (sheet.FirstRowNum + 1);
 i < sheet.LastRowNum; i++)
            { 
                Row row = sheet.GetRow(i);
                if (row == null) continue;
                DataRow dataRow = table.NewRow();
                //依先前取得的欄位數逐一設定欄位內容
                for (int j =
 row.FirstCellNum; j < cellCount; j++)
                    if (row.GetCell(j) != null)
                        //如要針對不同型別做個別處理,
可善用.CellType判斷型別 
                        //再用.StringCellValue
.DateCellValue, .NumericCellValue...取值 
                        //此處只簡單轉成字串 
                        dataRow[j] =
 row.GetCell(j).ToString();
                table.Rows.Add(dataRow);
            } 
            return table;
        } 
    } 
}                                  **
**範例假設Excel第一列視為標題列,讀取各欄位值 
當成DataTable的Column名稱,建立欄位後,
逐一讀取各列的資料新增為Row,其中欄位內容一律視為字串處置**
 
**
排版顯示純文字
<%@ Page Language="C#" %>
<script type="text/C#" runat="server"> 
void Page_Load(object sender, EventArgs e)
{ 
    System.Data.DataTable t =
 NPOIHelper.ReadExcelAsTableNPOI( 
        Server.MapPath("~/App_Data/Koobe.xls"));
    GridView1.DataSource = t;
    GridView1.DataBind();
} 
 
</script> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form id="form1" runat="server"> 
    <asp:GridView ID="GridView1" runat="server"> 
    </asp:GridView> 
    </form> 
</body> 
</html>                                     **
**補充一點,因為Excel檔案中儲存的是資料的原值加格式、
***或是計算公式內容,並非套用格式及運算後的最終結果**
**故可能與Excel中看到的有點誤差。
如下例中的第一列備註就由2011/5/12變成5/12/11,
在應用時需留意  **
 
****

 
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

**WIN7系統~開機**右下角語言列突然消失~*!*只能輸入英文??! **~**

**WIN7系統~開機*
*右下角語言列突然消失~*!
*只能輸入英文 ?!**~**



**開機時要打字都只能打英文,無法切換輸入法**

*找谷哥處理一下*
網路上有二種解法:
1.
到系統目錄「C:\Windows\System32」下--
--找到ctfmon.exe檔點兩下即可!!
*藤有測試,執行ctfmon.exe後,輸入法就會出來了,
但是重開機之後還是一樣不行,得再去點ctfmon.exe。
所以這方法打槍~**

**2.
開始 - 搜尋程式及檔案 輸入 regedit
找到 HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\Run
新增 字串值  
字串值名稱 ctfmon
內容為 C:\Windows\System32\ctfmon.exe
重開機,就能正常用輸入法**

**所以,這種情況,是不需要重灌的。
但若是客戶送到缺錢的店家,應該也是重灌一途!**


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&