Posts

[SQL Server] Availability Group 無法正常運作復原筆記 (連案例測試)

Image
案例分析:
前幾天公司一台SQL Server突然掛點導致大停工,筆記一下這一次的經驗及研究。
SQL Server軟體部分由兩台Replicas及一個Share File Witness所組成,硬體部分兩組Replicas分別位於兩台完全沒有關連的伺服器上。

用Ping確認兩台伺服器生存情況,發現Secondary Replica沒有回應,到伺服器房間發現Secondary Replica硬體發生故障連呼吸燈都沒了,可是好奇Secondary Replica當掉為什麼整個服務會死,進入Primary Replica看看情況。

在Primary Replica中:
AlwaysOn Dashboard已經沒有回應,並且錯誤,如下:
在Object Explorer中,AlwaysOn的目錄發現Availiability Groups狀態為Resolving。Primary Replicas同樣顯示為Resolving,如下。


再進入Windows的FailOver Cluster manager,發現整個node的選項都不見了,只剩下Cluster Events可以讀取,打開來看,發現Cluster整個掛了背脊涼涼的,並且出現去不到File Share Witness的情況。


解決流程: 由於Cluster已經沒有功能已經有壯士斷臂的決心,以儘快救回服務為前題。在Primary的伺服器上進入Services,把Cluster Service Disable掉。然後進去Failover Cluster manager,嘗試 Force Cluster start without a Quorum,成功之後在Quorum Configuration中出現"Cluster is running in ForceQuorum state. brabrabra.." 資料庫還是不能連接。按照此篇文章的設定,手動設定node weight,全國最大的線上資料庫上線啦。重新測試AG設計: 事情發生後我在測試環境模擬了各種情況,結果如下:

總結: 這次經驗令我重新review了AG的技術,得出了以下的結論: AlwaysOn技術真的是AlwaysOn? 前題是Quorum Voting機制要設計好,這篇例子正正就是公司所發生的事。Windows Server Failover Cl…

[Raspberry Pi] Raspberry Pi 溫濕度監測

Image
前言:
前年跟朋友一起入手了一隻Raspberry Pi 2 Model B, 其中一隻拿來當了備份用的NAS(不要期望當真的NAS, 因為存取很慢), 另外一隻閒置了一年變成上一年的to-do side project,最後也來得及在2017最後一天拖延症康復了所以完成了這個project。把難搞到事記筆記一下。

需求:
任何地方打開網頁就可以隨時監控家裡溫濕度變化。

硬體準備:
1. 1張灌好作業系統的16GB micro sd card。 我使用的是Raspbian with Desktop
2. 溫濕度監測器,我使用的是用Arduino弄好的DHT11 Sensor。使用它的原因主要是超便宜,溫度感測是還可以,濕度的話...用來看Delta還是可以啦。
3. 把DHTsensor插到正確的腳位上,如圖


安裝:
我是參考Jeffery大大的文章.
先開啟SSH。Raspbian雖然有圖型化介面,但是Model B跑起來實在太慢了,用SSH進入好太太太(回音)太太太多了。開啟教學在這裡。利用SSH進入設備。安裝python。根據Jeffery大大文中所說安裝PIGPIO library。sudo pigpiod 起動daemon。測試一下剛剛接的sensor是否正確,進入到PIGPIO目錄下,sudo python跑一下dht11.py,有回傳數值代表可以了。去ubidots註冊一個帳號,使用它的原因是少量sensor是免費的而且介面好用。然後建立一個Data Resource,在Resource中建立Temperature跟Humidity兩項參數。並且取得它們的API Key。API Key是用來上傳資料到ubidots用的。詳細建立的方法在這裡。取得API Key以後,回到SSH介面,因為沒有豪華的Visual Studio,所以我是用sudo nano dht11.py開啟檔案,根據Jeffery大大的修改方式把它修改成可以上傳到ubidots的方式。重點是API Key不要填錯。修改完以後執行sudo python dht11.py &,如果沒有出現錯誤的話,在ubidots頁面大概會開始看到數據了,大概像這樣,你沒看錯,濕度真的是很不準...
最後,設定Raspberry pi起動時自動開啟pigpiod 和 dhy11.py我是使用rc.loca…

[ASP.NET] 使用Entity Framework Code First 筆記

Image
前言:
前陣前幫公司開發專案打算使用Code First建立資料庫遇到了不少問題,現在終於有點時間在公司好好再摸魚認真研究一下,順便記錄起來。關於如何在專案中使用Code First Entity Framework很多神人已經有詳細的教學,我是看Kevin大的這篇還有軟體主廚大的這篇 ,很快已經可以弄出來。


建立資料庫之前最好先設定資料庫名稱,可以在web.config中修改。
第一次使用Code first database先要在 "Package Manager Console" 輸入enable-migrations,如果不止一個DbContext的話要加入參數 –ContextTypeName 指定Db才能繼續進行。建立好Model以後可以輸入add-migration把model加入到pending model,然後輸入update-database -Verbose (Verbose參數令Console直接看到產生出來的SQL)。建立資料庫後如要修改Model也沒有問題,可以在修改後重覆上面步驟更新資料庫,流程如下:

update-database -Verbose 可以把整個資料庫重構,這在測試環境當然是沒有問題,可是當在production環境就不行了。上面大大的文章提到可以使用update-database -Script -Verbose自動產生跟資料庫上面diff版本SQL交給DBA去更新,可是怎樣找出跟production環境的diff呢? 我自己是直接改Context檔案裡面的:base("name=Connectionstringname"),然後再輸入一次update-database -script -Verbose就可以得到跟production環境的diff SQL了。 總結: 之前的專案因為有兩個測試環境和production環境,在資料庫結構不停修改的那段時間同步不同環境簡直是場災難,使用自動產生的diff SQL至少可以減少錯誤,而且可以keep track每次修改的History,是個不錯的工具;另外CodeFirst這種開發方式剛開始的時候是有些不習慣,會因為設計不好經常出現錯誤,不過由於資料結構都變成strongly type,在開發上比較不會出現datatype錯誤的問題。
有錯…

[tensorflow] 在 Ubuntu 16.04 LTS中安裝tensorflow

Image
2018年快樂! 新的一年身為程序猿當然要學學現在最夯的深度學習技術, 不然很快就被新鮮的肝淘汰了.

選擇Tensorflow試水溫的原因, 主要是Tensorflow的社群在2017年最活躍, 感覺有問題問現場觀眾也比較容易啊.

在Ubuntu 16.04 LTS安裝Tensorflow遇到的問題:


基本上安裝Tensorflow只要跟著官方教學安裝就好, 我使用的是native pip, 不使用GPU, 所以要先安裝python dev.
然後pip install tensorflow, 看到successfully. 好像很簡單吧, 打開python, 輸入import tensorflow as tf, 果然出狀況了, 出現'tensorflow is not defined'的錯誤.
所以再看看教學, 把Optional的部分也裝一下, 再出現錯誤, 這次是 'tensorflow-1.4.1-cp27-none-linux_x86_64.whl is not a supported wheel on this platform.'有想過不如giveup去打PS4好了.
爬文以後發現原來要把教學的 sudo pip install --upgrade xxxx 改成 sudo python2.7 -m pip install --upgrade  https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.1-cp27-none-linux_x86_64.whl   # Python 2.7, 簡單來說就是在pip前面加上 python<version> -m 然後就順利安裝了, 出現 'Successfully installed backports.weakref-1.0.post1 bleach-1.5.0 enum34-1.1.6 funcsigs-1.0.2 futures-3.2.0 html5lib-0.9999999 markdown-2.6.11 mock-2.0.0 numpy-1.13.3 pbr-3.1.1 protobuf-3.5.1 setuptools-38.4.0 six-1.11.0 tensorflow…

[ASP.NET] 如何把檔案上傳到WEB API?

Image
研究背景:

最近協助朋友研究在公司網站建立新功能,讓客戶可以直接上傳檔案到公司的內部伺服器。

系統架構如下圖,檔案最後會放在公司內部的Web API Servr。而Web API接收上傳檔案的API是使用HTML的FormData格式


問題: 網路上大部分教學是利用jquery ajax把檔案直接上傳到Web API上,可是公司Web API是內部使用的伺服器,所以只能透過Web Server存取。解決方案: 以下是其中一種試過可行的做法。
Web Server部分Web API接收上傳檔案的API是使用HTML的FormData格式,所以當Web Server接收到Browser的上傳後需要把檔案轉成multipart/form-data的http Request,然後發送到後端的Web API去。產生的方法至少有兩種自己寫HTTP Request Message
post Upload上传文件中multipart/form-data 做的那些事
使用套件 RESTSharp
 Git
我們所使用的是REST Sharp。先讀取來自Browser的Request,然後把檔案變成multipart/form-data,再產生Http Request上傳到Web API。

namespace/*project name*/.Controllers { publicclass FilesController : Controller { // GET: Filespublicstring Upload() { List<string> filesList = new List<string>(); try { foreach(string file in Request.Files) { var fileContent = Request.Files[file]; if (fileContent != null & fileContent.ContentLength > 0) …

[雜] ThinkPad X200 上安裝Ubuntu版本經驗

Image
陪了我8年的ThinkPad X200自上一年開始使用Ubuntu 14.04 + SSD 加持後簡直是重振雄風,除了一些硬件問題 (螢幕變暗反應變慢,CPU不夠強不能看4K影片,沒有獨顯Scrolling不要太快) 外基本上還是順順的。聖誕節的時候手癢直接升級Ubuntu 16.04,結果問題就出來了...杯具。

我的ThinkPadX200規格:

CPU:Intel® Core™2 Duo Processor P8800記憶體:8GB硬碟:128GB SSD (品牌都忘了,反正是撿便宜)

在我這種老筆電跑Ubuntu16.04暫時發現了以下問題:

畫面太華麗: 16.04有很多Transparent的特效,每次秀出來都卡死了,就是用了 GNOME Tweak Tool and Unity Tweak Tool 把過場畫面關掉效果也不會回到14.04那種順暢感
GNOME Tweak Tool and Unity Tweak Tool 安裝方法CPU資源:P8800 速度本身不高,用Top查詢發現有些比較耗CPU的系統程序經常在跑,導致CPU溫度稍為高。我猜如果用在今天的筆電應該沒有太大問題,但是老筆電對於CPU就是斤斤計較。用Chrome異常慢:我也不知道是啥問題。 所以最後昨天我實在忍不下去了,還是重灌回14.04,再看看情況再上來報告。 暫時使用14.04是很順暢的,雖然畫面比較老舊。

01/03/2017更新:暫時來說沒有任何問題,而且連裡面的Win7 VM也順了很多
*不要問我身為堐踢狗為什麼不換筆電......

[ASP.NET MVC] 利用OAuth2為網站進行使用者認證的簡單實作

Image
前言:
公司最近打算使用由政府提供的市民登入平台,原因是利用這個平台登入的帳號具有等同自然人的法律效力,其他廠商不用老遠跑來公司簽約可以直接網路上搞定。政府使用的技術是OAuth2認證機制,所以小弟必需被逼研究熟悉整個流程再把公司的系統整合進去。

老實說,Oauth2一開始還真的看得我一頭霧水(霧煞煞),因為OAuth2跟傳統UserName Password的認證方式很不一樣,而且OAuth2在網站上及APP上的實現方法也不同,再加上網路上的圖文說明也很複雜。最後找到神人「鴨七」大大整理出三百多頁的PPT[1]及他在網站上的詳細介紹[2],來回看了幾次終於比較明白整套理論,以下說明是精簡版本,全部概念以網站架構為中心,未必完全適用於APP及Winform:

為什麼要OAuth2?
政府用的是OAuth2小弟又有什麼辦法呢我個人的看法是使用OAuth2的網站必須先向提供OAuth2的服務提供者進行登記,再加上對用戶的認證以後,就相當於有兩層的保護。再加上網站從頭到尾沒有碰過你的使用者帳號跟密碼,減少被盜取的可能,當然trust機制還是會有很多漏洞,例如User亂授權,不過已經是社交層面了。


OAuth2常用角色

Client: 通常是指你自己開發的系統。 Authorization Server: 處理認證、發出access Token的伺服器。Resource Server:保持資源的伺服器,在facebook的例子就是你的個人資料。Resource Owner: 就是人,或者User。 User Agent: 用戶代理,通常指的是Browser。OAuth2常用術語 Client ID and Client secret:
由於使用OAuth2的Client網站要先向Authorzation Endpoint(OAuth2提供者)進行登記,說明用途及Redirect URL,登記完之後Client ID就像OAuth2提供者發給你網站的身份證字號,通常為亂數, 而srcret就是公開金鑰。
Redirect URL:
由於當完成OAuth2程序後轉回Client網站的動作是由OAuth2提供者直接執行,以防止CSRF (Cross-site request forgery)攻擊。所以必須向Authorization Server登記URL。
AccessToken:
要讀取R…