跳到主要內容

發表文章

目前顯示的是 2017的文章

How to Reinstall Ubuntu on Window 10

Step 1. Uninstall ubuntu Open Command Prompt (Or Window PowerShell) and type > lxrun /uninstall Type "y" to continue: y If you'd like to completely uninstall Ubuntu that including user account information, you can use /full option > lxrun /uninstall /full Step 2. Install Ubuntu Type bash on Cortana search bar and click "bash" After that, you will see the message like "This will install Ubuntu on Windows, distributed by Canonical ..."

如何設定VM的網路(Hyper V)

在我們架好VM, 灌好OS之後, 或許會想要讓VM可以聯網去更新套件, 或者是下載Python, Node JS 等等, 以下的幾個步驟設定完之後, 就可以讓VM聯網了 首先, 打開Virtual Switch Manager 接下來, 點選 Create Virtual Network 最後按OK 套用你剛剛建立的Virtual Switch到VM,

[Bot Framework] How to reply an image

There are 2 ways to achieve that goal. First one, pass image url to channel if my source url is like http://abc.com/dog.png                var reply = context.MakeMessage();                                reply.Attachments.Add(new Attachment                 {                     ContentUrl = $" http://abc.com/dog.png ",                     ContentType = "image/png",                 }); Pass base64 encoded image data                 Stream fs = File.OpenRead("C:\\dog.png");                 byte[] img = fs.ToArray();                          string ima64 = Convert.ToBase64String(img);                 var reply = context.MakeMessage();                 reply.Attachments.Add(new Attachment                 {                     ContentUrl = $"data:image/png;base64,{ima64}",                     ContentType = "image/png",                 }); Or you can add image into C

在Azure SQL上新增使用者

實務上, 當我們開放資料庫給其他人存取時, 通常不會給管理者帳密讓他們去連資料庫, 而是新增一個新User並給予適當的權限, 以下就是實作步驟 首先, 建立一個帳號用來登陸SQL Server (這個SQL語法必須對master資料庫執行) CREATE LOGIN [abotuserlogin] WITH PASSWORD ='ooo12345678' GO 替master新增使用者 CREATE USER [aauser] FOR LOGIN [abotuserlogin]  GO 針對要開放的資料庫新增使用者 在Object Explorer上右鍵你想要動的資料庫 CREATE USER [aauser] FOR LOGIN [abotuserlogin]  GO 有了使用者之後我們就可以來設定權限 基本上有兩種方法 設定Role(通常一個Role就包含數個權限) 直接調整權限 總共有底下這麼多權限可以使用 若只想要開放資料的增刪修查, 那可以增加db_datareader, db_datawrite這兩個Role EXEC sp_addrolemember 'db_datareader', [aauser]; GO EXEC sp_addrolemember 'db_datawriter', [aauser]; GO 注意: 上面給的權限只能用來處理資料, 所以如果要加Table或是砍Table的話, 會出現access denied 的喔 最後, 如果這個User用不到了, 想要刪除的話, 可以Security 下找到我們剛剛加的 abotuserlogin 還有我們剛剛新增的aauser 右鍵這些名稱, 我個就可以看到刪除選項 Ref: https://azure.microsoft.com/en-us/blog/adding-users-to-your-sql-azure-database/ https://

Azure SQL 如何輸出 table schema

假設你有一個架在Azure 雲端上的資料庫, 今天你可能想要輸出他的table schema 好在本地端建立另一個分身做測試或者是開發時,   只要打開SSMS(2016) 接著對你雲上的資料庫點擊滑鼠右鍵 然後你就會看到Generate Scripts, 此時大力地給他按下去後, 就會跳出另一個視窗要你選擇輸出的目的地, 還有想要輸出的Table 最後, 就會產生一份.SQL讓你輕鬆地在本地端建立分身了

[解決] Update-database 時遇到錯誤訊息: Cannot open server requested by the login. Client with IP address is not allowed to access the server.

簡單的描述一下遇到的狀況 Azure上面有一個我新建的Database, 當我試著使用Entity Framework Code Migration去更新資料的時候, add-migration initialModels update-database visual studio 卻拋出以下的錯誤訊息 Cannot open server 'avbotdata' requested by the login. Client with IP address '108.123.1.251' is not allowed to access the server.  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect. 原因很明顯, 我們想要存取資料庫的時候, Azure 認為發出請求的IP不在Whitelist裡面, 所以擋住了update的請求 解法其實很簡單 Step 1. 選擇你要設定的資料庫, 在搜尋列上輸入 Firewall Step 2. 輸入你要加入的IP後存檔

Visual Studio 小常識, Launch.json

如何產生Launch.js, 因為太常用了可是又怕忘記, 所以把步驟簡單的記錄下來, 才不用每次要用時都要勞駕谷哥大神 首先,  滑鼠點擊 Debug的Icon 再來,  滑鼠點擊上方的齒輪後, Launch.json就會被建立出來了

[C#]Make Cortana speak Dialog prompt

This article focuses on how to make Cortana speak PromptDialog. It's quite simple, we have to specify message spoken by Cortana in PromptOption.speak and pass PromptOption to PromptDialog.Confirm() or PropmtDialog.Choice. Prompt Choice Prompt Confirm If you don't want show option on the canvas you can empty PromptOption.options field from the code. Reference: https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-text-to-speech https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-cortana-skill https://docs.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.dialogs.promptoptionswithsynonyms-1.-ctor?view=botbuilder-3.11.0

[UWP] Display a map on Cortana Canvas through UWP voice command

This article focuses on how to get map info from bingmap service and response to Cortana via UWP Voice Command. Subscribe Azure Bing Map Service Create Bing Map Api on Azure portal. Save your QueryKey, you have to use this key to get map info later. Voice Command Background app service Create a helper class for bingmap service: Since Cortana only accept text and local image file responds from our UWP,  we have to store the online map information as a local file and pass to Cortana. Response VoiceCommandContentTile to Cortana

LINQPad 如何連接本地資料庫

前言 用過LINQPad就會知道, 它是個非常好用的工具, 無論是用來學習LINQ或是輔助我們使用LINQ開發程式, 絕對會比我們在Visual Studio中的除錯模式裡觀察變數值得變化還要來的方便 而或許在某些情況下, 我們會希望使用LINQPad時資料是來自於資料庫, 以方便我們做開發或是某方面上的除錯, 所以今天的分享就是著重在如何在LINQPad上連接資料庫 Add Connection 選擇Entity Framework (DbContext v4/v5/v6) 設定連線 Path to Custom Assembly, 選擇你之前串接Entity Framework的程式 Full type Name of Typed DbContext , 選擇程式中定義的DbContext Path to application config file , 這邊可以填你web app的Web.config來提供連接資料庫的connection string 如果一切都沒問題, 我們就會看到資料庫的Table 出現在左側嘍 接下來可以新增一個Query去查詢Db資料 新增Query var logs = UserLogs.Where( x => x.Id > 100); Console.WriteLine(x); 使用程式裡定義好的函式 假設程式中自定義了一個UserLogRepository的類別, 用來封裝所有UserLogs資料表的查詢邏輯 public class UserLogRepository { public DataContext Context { get; set; } public UserLogRepository() : this(new DataContext ()) { } public UserLogRepository(DataContext context) { this.Context = context; } public IEn

[UWP] 背景處理Cortana 的Voice Command 請求

前言 如果你希望開發一支UWP在背景處理事情, 然後將處理完的資料或狀態顯示在Cortana的Canvas上面的話, 我們會需要寫一個backgound server去處理Cortana的請求, 而基本上有以下幾個步驟 Step 1. 前置步驟 新增專案 選擇Windows Runtime Component 專案建立好之後, 我們先把Class1.cs重新命名(列如 MyVoiceCommandService.cs) 設定Package.appxmanifest 加入以下的程式碼, 然後把EntryPoint指定到剛剛建立的MyVoiceCommandService.cs 編輯VoiceCommand.xml 實作IBackgroundTask Step 2. 處理Cortana VoiceCommand的請求 取得VoiceCommandServiceConnection實體 這是用來讓我們的背景程式與Cortana溝通的介面 建立Response的內容 基本上我們可以回傳VoiceCommandUserMessage, VoiceCommandContentTile這兩種內容給Cortana User Messag 讓Cortana說話, 或是讓她秀訊息在Canvas上面 Content Tile 這個有點像是Bot Framework中的Card, 我們可以把文字跟圖片塞在Content Tile中讓Canvas顯示出來, 我們可以一次回傳多個Content Tile, 當使用者點了其中一個之後, 就會觸發開啟我們程式的事件 VoiceCommandResponse 建立VoiceCommandResponse的實體, 然後塞入剛剛建立的VoiceCommandUserMessage 或是 VoiceCommandContentTile, 最後再透過VoiceCommandServiceConnection回傳給Cortana Demo Hey Cortana, find God Father on My Library 完整程式碼 https://github.com/andy51002000/Simple-UWP

[Azure Function] 從Application Settings 中取出變數

前言 Azure Function 是微軟推出的Serverless 的雲端服務, 對於開發人員來說, 幾乎不需要耗費心力去管Server的環境設定, 只要專心寫Code然後上傳到雲端, That's All ~ 基本上一些小型的Web Api 非常適合部屬在Azure Function 上, 它可以串接我們在Github上的帳號, 然後選擇repository去部屬, 簡而言之Azure Function 好處多多, 回到正題~ 如果有些敏感資訊像是某些雲端服務的Subscription key或是資料庫的帳密, 我們不想暴露在程式中的話, 我們可以把他們寫在Application Settings裡面 當我們想在程式中取出變數時, 只要

[Bot Framework] Card 使用教學(一) ThumbnailCard

前言: 微軟的Bot Framework除了提供一般的文字回應之外, 也支援開發者們把文字圖片以及按鈕, 一同封裝在Card的物件裡, 然後再回傳給前端的Channel, 前端的使用者就能透過Card來跟我們Bot互動 在官方的API文件裡, 可以發現IMessageActivity有一個Attachments的屬性, 所以如果想要回應一個Card, 只要把Card實體塞到IMessageActivity.Attachments的集合裡面, 就能把Card回應給使用者 目前微軟Bot Framework提供了許多種Card的形式, 而我比較常用的是HeroCard, ThumbnailCard,  SignInCard. 而今天要介紹的是HeroCard, ThumbnailCard ThumbnailCard ThumbnailCard的作用是讓你顯示一張小圖搭配文字描述 基本上建立ThumbnailCard的方法如下 定義CardImage 定義CardAction 在這個CardAction裡面,  我們定義一個按鈕, 當這個按鈕被按下去的時候, 會開啟網頁 建立ThumbnailCard實體 加到IMessageActivity.Attachments裡 完整程式碼範例如下

[UWP] 實作VoiceCommand, 建立語音驅動(Voice Driven)的應用程式

前言: 微軟Window 10 的語音助理Cortana, 實現了用語音去驅動我們應用程式的情境, 開發人員可以在UWP的專案裡, 定義Voice Command, 當使用者的語音輸入符合相對應的指令,(如 Add new Movie on My Library), 程式就會被觸發, 簡單的說, 我們可以用語音把程式叫起來 , 然後讓它去做一些事情 如果想要建立一支能夠被Voice Command觸發的程式, 基本上有幾個步驟 建立一個專案 定義應用程式的Voice Command 修改App.xaml.cs 處理程式被觸發時的動作, 複寫OnLaunched和OnActivated (比如說做一個顯示使用者的電影資料的程式 ) 建立一個新專案 在專案中建立Data Model "Movie" 表示電影資訊 定義Voice Command 這邊定義兩個command showMovies, 這個動作會把程式的MainPage叫起來, 然後我們會在頁面上顯示所有電影資訊 addNewMovie, 這個動作會把語句中的電影名稱抓出來然後加到主頁面上 基本上要做到這件事, 必須要在VoiceCommand中定義PhraseList, 並且在ListFor的語句中標示出來, 列如 add {MovieName} Cortana就會根據原先定義在PhraseList中的MovieName item去解析出句子中的電影名稱, 然後傳遞給我們程式 修改App.xaml.cs 在OnLaunched 最後面呼叫InstallCommandDefinitionsFromStorageFileAsync去安裝VoiceCommand 複寫OnActivated, 我們可以從SpeechRecognitionResult這個類別中知道語意識別的結果, 或是擷取語句中的{MovieName}, 如speechRecognitionResult.SemanticInterpretation.Properties["MovieName"].FirstOrDefault(); MainPage.xaml 在MainPage.xaml 裡定義一個ListBox 然後綁

UWP 基礎頁面切換

前言 使用一個簡單的範例介紹如何切換頁面, 基本上會用到Frame的Navigate()作為頁面切換的方法, 以及實作OnNavigatedTo 處理頁面切換時的動作 假設今天我們要設計一支程式, 在主頁面(MainPage)上顯示顧客(Person)資料, 並且提供按鈕(Edit), 讓使用者按下去之後, 切換主頁面到編輯頁面(EditPage)修改資料, 使用情境如下: 情境一:使用者在主頁(MainPage)點擊Edit按鈕 情境二:使用者在編輯頁(EditPage)點擊Save按鈕 Data Model 我們首先建立一個Person的類別來表示顧客資訊 MainPage Code-Behind 我們在這邊宣告Person, 用來作UI元件的 Data Binding的目標物件 將DataContext 設為 this (作為UI元件的Data Binding的來源) 實作Edit按鈕的Click Event handler, 在這個函式內我們從Window.Current.Content取得 root frame 的實體, 然後呼叫它的 Navigate 方法去切換頁面並且把現在的Person資訊傳給EditPage 複寫(override) OnNavigatedTo 處理當頁面被切換回MainPage時, 我們要去更新Person MainPage.xaml 我們在這邊建立兩個TextBlock並且綁定Code-behind裡的Person.Name, 和Person.Id EditPage Code-Behind 這邊做的事情其實跟MainPage差不多, 宣告Person, 設定DataContext 複寫OnNavigatedTo, 拿MainPage傳過來的Person更新EditPage現在的 實作按鈕Click Event handler處理頁面切換的動作並傳遞更新後的Person給MainPage EditPage.xaml 在這個頁面供TextBox顯示MainPage傳過來的Person資訊, 以及提供按鈕Save去切換頁面, 然後將更新後的Person回傳給MainPage

[C#] Visual Studio, 如何在10分鐘內快速更改命名專案名稱

前言: 由於工作需要, 而且懶得再重寫類似的專案, 所以常常將之前寫的專案複製一份加料後, 再重新命名編譯 假設今天我有一個專案HolyUWP, 我想把它重新命名成 BestUWP 時該怎麼做? 以下是幾個簡單的的步驟 使用Visual Studio 2017 備份原來專案 更改Solution名稱 更改Assembly name, Default namespce 更改每支程式碼的Namespace 更改專案資料夾名稱 備份原來專案 由於怕改壞掉, 所以在改之前先備份 更改Solution名稱 更改sln的名稱, 這邊我改成BestUWP.sln 使用Visual Studio打開你的.sln, 右鍵點擊Solution後選擇Rename, 這邊我把它重新命名成BestUWP(跟檔案名稱一致) 必要的話可以順便修改Porject名稱 更改Assembly name, Default namespce 進入 Project > OOXX Properties    修改Assembly Name, Default namesapce 更改每支程式碼的Namespace 基本上隨便挑一支有用到預設Namesapce(HolyUWP)的程式碼來改就好了 重新命名後點擊Apply,  這個動作做完後所有用到舊Namespace的程式碼都會被改成新的 更改專案資料夾名稱 以上動作做完後, 基本上就可以把專案編譯出來測看看了~

使用UWP 設計 MVVM 軟體架構(二) 處理View頁面的轉換

前言: 上一篇文章" 使用UWP 設計 MVVM 軟體架構(一)  " , 我們以電影清單程式, 簡單地表示MVVM的架構及實作方法, 程式中View會把所有的電影資訊顯示在螢幕上, 但若現在我們想要再加一個功能, 讓使用者點擊ListBox上的Item(Movie)時, 頁面能夠導向另一個View去顯示詳細的電影資訊, 那我們該如何實作? 以下就是說明, 如何使用NavigationService來幫助我們去切換每個View元件, 基本上有幾個步驟 修改App.cs 建立ViewModel, MovieDetailViewModel 建立View, MovieDetailView 修改MovieDetailView 修改MovieListViewModel 修改MovieListView 前置作業 在開始動工之前我們先在Common的資料夾裡加入以下的類別 INavigationService.cs NavigationService.cs NavigationHelper.cs SuspensionManager.cs 修改App.xaml.cs 我們在這邊宣告NavigationService的靜態變數方便將來使用 建立MovieDetailViewModel 為了簡化範例, 基本上這個ViewModel沒什麼特別功能, 單純就是開放Movie的Model讓View做Data Binding而已 將MovieDetailViewModel的實體加到ViewModelLocator裡 建立MovieDetailView 這邊我們建立一個全新的View Page顯示電影名稱, 電影價錢 修改MovieDetailView.xaml.cs 處理頁面轉換 實作NavigationHelper.LoadState事件, 處理當頁面被載入時的動作, 讓MovieListView傳過來的Model能設定給MovieDetailViewModel 修改MovieListViewModel 加入一個新的方法, 提供ListBox 上點擊Item時的事件處理邏輯 主要是去呼叫NavigationService做頁面切換 修改

使用UWP 設計 MVVM 軟體架構(一)

前言: 什麼是MVVM? 簡單的說他是由 Model, ViewModel, 和View 所構成的軟體架構 Model, 指的是我們用來存放資料的類別, 除此之外, 商業邏輯也會被封裝在裡面, 他只負責處理跟資料有關的行為  ViewModel, 作為整個架構的中間層, 負責提供View需要的資料 View, 架構中負責呈現介面的元件 會有這個概念, 一開始是為了避免View當中存在太多的商業邏輯使得程式碼變得很難trace 或是維護, 所以我們把關於資料實體的商業邏輯還有資訊都封裝在一個類別後抽出來成為一個Model. 然而這樣的程式碼還是不夠乾淨, 因為View 和  Model 之間的相依性, 會出現當Model一改View就要跟著改得情況, 所以最後我們在View和Model之間多了一層ViewModel的類別, 負責提供或轉換適當的資料給View, 以降低View和Model之間的相依性 以下是個簡單的範例, 說明如何在UWP的專案中設計出MVVM的軟體架構 這個範例是一個顯示電影清單的程式, 基本上有幾個步驟 建立一個新專案 設計Model,  我們會有個Movie類別, 來表示電影的名稱以及價錢 設計ViewModel, 我們會有個 MovieViewModel的類別, 提供適當的 Movie 資料給View使用 設計View, 我們會簡單的加入ListBox來呈現電影清單, 以及一個Button來刪除畫面上的所有電影 第一步:建立專案 選擇C#>Windows Universal>Blank App 第二步:設計Model 首先建立Models的資料夾 之後在裡面建立一個新類別Movie 繼承並實作介面INotifyPropertyChanged, 如下 建立資料夾Data, 之後再這個資料夾裡面建立一個FakeDatabase的類別 這是一個假的資料庫用來提供電影資料給ViewModel, 實際上我們是把資料寫在外部的XML中 第三步, 建立 ViewModel 建立一個ViewModelBase的類別 用來作為所有ViewModel的基底並且繼承INotifyPropertyChanged

[For 新手] 如何使用Bootstrap 裡的 grid system 配置版面

前言: 一個網頁內容通常不會只有一個網頁元件, 所以如果我們希望呈現出來的結果符合預期, 那我們必須要學會如何排版, 有秩序地安置這些網頁元件, 這裡的教學會告訴大家如何使用Grid 來實現排版 首先, 我們來看一下範例 這個頁面可以分成三個部分, 如下圖所示 一. Welcome ,網頁的簡介 二. Game 1 的簡介與下載點 三. Game 2 的簡介與試玩按鈕 基本上如果要使用Grid , 首先, 我們需要一個 container 當作容器 <div class=" container "> ... </div> 接下來, 在container裡定義列與行 定義列的語法 :  <div class="row"> 這裡我們先把兩列定義出來 <div class=" row "> </div> <div class=" row "> </div> 再來, 定義行 定義行的語法:   <div class="col-[支援的裝置]-[大小]"> 這裡跟列比較不一樣的是, 定義行的時候可以指定要支援的裝置, 以及大小,  目前可支援的裝置有四種 xs, sm, md, lg, 如果你的網頁是要呈現在手機上的話, 可能就需選擇xs  目前支援的大小有1~12, 1 表示呈現大小是一整列的1/12的意思, 所以依此類推 12 表示一整列裡佔12/12大的行 這邊, 我們替範例在第一列增加一個行, 還有在第二列裡增加兩個等大的行, 所以原始碼就會變成 <div class=" row ">      <div class=" col-md-12 ">      </div> </div> <div class=" row ">      <di