Tuesday, March 8, 2016

[Lesson and learned] Sql Server restore database

 Microsoft Sql Server    Database Deploy





▌Background


這次在系統過版時,因為Database Table schema改變的相當多,在正式環境的資料並無重大隱私資料和個人資料(如密碼)已經加密的情況下; 決定將Production的Database先停止服務後,以備份Production→還原至測試環境→更新資料庫→還原至Production
的方式進行。

先說明各DB Server的環境 …
Production : Sql Server 20008 R2 Enterprise
Test : Sql Server 2012 SP1 Enterprise

備份Production→還原至測試環境 這一段是沒有問題的, 可是在還原至Production就失敗了。
原因是因為新版本的DB備份檔(.bak)是無法還原至舊版本的Sql Server!

所以在建立Solution時,也需要透過Secondary research了解一下限制,避免踩雷 L


▌Solve the problem


有兩種方式可以取代 backup & restore的方式。
另外節錄自StackFlow-Ohad Schneider 提供的觀念:

·         Backup / Restore - will not work when the target is an earlier MS SQL version.
·         Copy Database - will not work when the target is SQL Server Express: "The destination server cannot be a SQL Server 2005 or later Express instance."



▋Copy Database Wizard 複製資料庫精靈




 使用複製資料庫時,需要開啟一個UNC資料夾讓來源及目的端做資料傳輸。


▋Generate Scripts 產生指令碼

 

產生指令碼可以直接輸出Schema, 但是複製資料還是要透過「匯出資料」。

 


▌Reference



Saturday, March 5, 2016

[Notes] 2016 創新管理研討會暨新春團拜 會後心得

(From  unglobalcompact.org)



今天很高興參加了PMI TW主辦的創新管理研討會暨新春團拜活動; 整體感覺研討會變得相當活潑!

除了下午有平行分場的設計,中午用餐前也穿插了一小時的Team Building活動,讓各組員能夠快速破冰,也在用餐時大家可以非常熱絡的互相交流各領域的知識和經驗;讓學員可更融入整個研討會, 是個非常成功的嘗試。


至於今天的議題,稍微記錄一下重點~

▋顛覆傳統的創新思維與商機洞察 (莊立民博士)

1.  趨勢:
過往企業築高牆的優勢已不再是保證。

2.  破壞式創新、跳躍式創新。
3.  共享經濟的模式。
5.  如何培養創新能力:
修練、圖像力、故事力、洞察力。
6.  設計思考。


▋巴黎氣候協議後掌握低碳創新的商機 (黃正忠總經理)

全球暖化、碳排放。


3.  企業需精準計算碳價格。
4.  化石原料轉化為石化原料,化石燃料經濟已陸續撤資。

▋World Café : 組織與團隊的創新

以下是和各小組Brain Storming後的一些想法。

1.  Voice of customers
2.  尋求外部專家的建立
3.  公司建立創新文化,藉由創新競賽或設立KPI鼓勵創新。
4.  Cartoon、Movies

5.  設立創新小組

Friday, March 4, 2016

Best birthday gift on 2016 !





下午經過了四個小時的奮戰,當電腦上出現 Congratulations! 時, 緊張的心情終於一掃而空囉! 終於通過了欠了兩年的考試。

回想今年一月毅然決然將考試訂在生日前一周,將這張證照當作自己的生日禮物,還真是大膽!

果然給自己更多壓力才會更加努力啦!

這幾周辛苦的備試,平常上班及假日帶小孩出去玩,所以只能抽空看一點看一點;  
這一周熬夜的衝刺,也讓我這個已經不年輕的老人非常吃不消 lol

考完試之後,終於放下心中的大石頭。
而且終於終於我可以開始看別的書了!! 


Anyway, I made a birthday wish and I got it, thaz the BEST BIRTHDAY GIFT :)


Sunday, February 21, 2016

[MVC] 多國語系開發 - 以Routing rule設定

 MVC
▌目的


l  實作一Website,由Routing rule(路由規則) 判斷目前網頁之語系。
l  顯示之語系規則順序如下:
(1)     Cookie
(2)     URL (Routing rule)
(3)     Browser default localization setting


由Routing rule控制語系的好處在於 … 使用者可任意切換各種語系來做觀看,而不必去更動瀏覽器的設定。

▋延伸閱讀


▌環境

l   Windows 7 Enterprise
l   Visual Studio 2013 update 5
l   MVC 5



▌實作


▋Routing Rule

因為本文章的首要目標是以Routing rule判斷使用者瀏覽的語系,所以第一件事情是更新預設的Routing rule.

routes.MapRoute(
       name: "Default", // Route name
       url: "{lang}/{controller}/{action}/{id}", // URL with parameters
       defaults: new { lang = "Default", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
       namespaces :  new[] { "JB.Sample.MultiLangWeb.Website.Controllers" }
);


 
▋UI

以下圖之UI 為範例。



l   _Layout.cshtml

<div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("首頁", "Index", "Home")</li>
                    <li>@Html.ActionLink("關於", "About", "Home")</li>
                    <li>@Html.ActionLink("連絡方式", "Contact", "Home")</li>

                    @if (ViewBag.Lang == "ZH")
                    {
                        <li>
                            <a href="~/CN" onclick="Redirect('CN')">簡體中文</a>
                        </li>
                        <li>
                            <a href="~/EN" onclick="Redirect('EN')">英文</a>
                        </li>
                    }
                    else if (ViewBag.Lang == "EN")
                    {
                        <li>
                            <a href="~/ZH" onclick="Redirect('ZH')">Traditional Chinese</a>
                        </li>
                        <li>
                            <a href="~/CN" onclick="Redirect('CN')">Simplified Chinese</a>
                        </li>
                    }
                    else if (ViewBag.Lang == "CN")
                    {
                        <li>
                            <a href="~/ZH" onclick="Redirect('ZH')">繁体中文</a>
                        </li>
                        <li>
                            <a href="~/EN" onclick="Redirect('EN')">英文</a>
                        </li>
                    }
                </ul>
</div>

當點選語言時,Post back 設定Cookie並做轉址。
所以需要在後端Controller加上一Http Post method 並加上Ajax.


▋Controller : Http Post Method

[HttpPost]
 public HttpResponseMessage SetLocaleCookie(string locale)
 {
            try
            {
                HttpCookie cultureCookie = Request.Cookies["_culture"];
                if (cultureCookie != null)
                {
                    cultureCookie.Value = locale;
                }
                else
                {
                    cultureCookie = new HttpCookie("_culture");
                    cultureCookie.HttpOnly = true;
                    cultureCookie.Value = locale;
                    //cultureCookie.Expires = DateTime.Now.AddMonths(2);
                }

                Response.Cookies.Add(cultureCookie);
            }
            catch (Exception ex)
            {
            }

            return new HttpResponseMessage(HttpStatusCode.OK);
}


▋Javascript

function Redirect(locale) {

    var postUrl = "Default/Home/SetLocaleCookie";

    $.ajax({
        url: postUrl,
        type: "POST",
        data: JSON.stringify({ locale }),
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        //timeout: 10000,
        success: function (data, status) {
        },
        error: function (jqXHR, textStatus, err) {
        }
    });
}


到目前為止,我們已經可以讓使用者自由的設定網站的語系Cookie。
下一步,我們要在網站首頁 (例如本例的本機開發網址  http://localhost:2609/ ) 判斷要導向到哪個語系的網址。


▋Home Controller  


由以上程式碼可知道本例支援的語系為:
ü   繁中:http://localhost:2609/ZH
ü   簡中:http://localhost:2609/CN
ü   簡中:http://localhost:2609/EN

判斷邏輯(順序):
(1)     Cookie
(2)     URL (Routing rule)
(3)     Browser default localization setting


public class HomeController : Controller
{
     public ActionResult Index()
     {
            string lang = HttpContext.Request.RequestContext.RouteData.Values["lang"].ToString();
            ViewBag.Lang = lang;


            //判斷是否須轉址 (以使用者的瀏覽器語言設定為主)
            if (lang.Equals("Default"))
            {
                string redirectUri = getRedirectUri(lang);
                if (!string.IsNullOrEmpty(redirectUri))
                {
                    return Redirect(redirectUri);
                }
            }
            return View();
     }

private string getRedirectUri(string locale)
{
            string redirectUri = string.Empty;

            HttpCookie cultureCookie = Request.Cookies["_culture"];

            //若已設定Cookie則以Cookie為主
            if (cultureCookie != null)  //已設定Culture Cookie,則以Cookie為主
            {
                locale = cultureCookie.Value;
            }
            //若未設定Cookie且未指定網頁語系,則以瀏覽器預設語系為主
            else if (string.IsNullOrEmpty(locale) || locale.Equals("Default"))
            {
                //取得用戶端語言喜好設定(已排序的字串陣列)
                var userLanguages = Request.UserLanguages;

                if (userLanguages.Length > 0)
                {
                    try
                    {
                        string userLang = userLanguages[0];
                        switch (userLang.ToLower())
                        {
                            case "en-us":
                                locale = "EN";
                                break;
                            case "zh-cn":
                                locale = "CN";
                                break;
                            case "zh-tw":
                            default:
                                locale = "ZH";
                                break;
                        }
                    }
                    catch (CultureNotFoundException ex)
                    {
                        //Do something
                    }
                }
            }
            else //已指定網頁語系
            {
                //Do nothing
            }


            //Redirect
            try
            {

                switch (locale.ToUpper())
                {
                    case "EN":
                        redirectUri = "/EN";
                        break;
                    case "CN":
                        redirectUri = "/CN";
                        break;
                    case "ZH":
                    default:
                        redirectUri = "/ZH";
                        break;
                }

                return redirectUri;

            }
            catch (Exception)
            {
                throw;
            }

     }
}


▌測試
















▌Reference