說明:整理delegate一路上的演變。
2016年6月26日 星期日
2016年5月12日 星期四
[Programming/Modbus] little-endian與big-endian
endian在CS裡指的是記憶體位址的排列,不同的CPU有不同的endian,電腦常用的Intel x86是little-endian設計,而big-endian設計的有Modbus PLC,與HP、IBM、MOTOROLA 68K系列CPU,究竟差在哪?
65534以1個word表示為0xFFFE,而記憶體是由左而右存放,
放到little-endian的記憶體會是
最低byte存放記憶體最前面,反序排列。
而放到big-endian的記憶體會是
最高byte存放記憶體最前面,依序排列,較適合人讀。
參考資料:
https://en.wikipedia.org/wiki/Endianness
65534以1個word表示為0xFFFE,而記憶體是由左而右存放,
放到little-endian的記憶體會是
| FE | FF |
而放到big-endian的記憶體會是
| FF | FE |
參考資料:
https://en.wikipedia.org/wiki/Endianness
2016年5月11日 星期三
[WebDAV] 如何設定WebDAV的基本驗證(Basic Auth)功能(Server與Client)
說明:
WebDAV (Web-Based Distributed Authoring and Versioning)可透過網路磁碟機將Server上檔案整合進本機磁碟,若要設定WebDAV的基本驗證(Basic Authentication),Server該如何設定? Client又該如何連接呢?
作法:
● Server(以Windows Server 2012 R2為例):
1. 安裝WebDAV與基本驗證:
開啟[伺服器管理員] -> 點選新增角色及功能 -> 直到[伺服器角色]tab -> 點開[網頁伺服器] ->
◎ 點開[一般HTTP功能] -> 勾選[WebDAV發行] ->
◎ 再點開[安全性] -> 勾選[基本驗證] -> 安裝。
2. 建立使用者帳戶:
開啟 [電腦管理] -> 點開[系統工具] -> 點開[本機使用者和群組] -> [使用者]上右鍵 -> 新使用者 -> 輸入使用者名稱與密碼。
3. IIS站台新增應用程式與設定:
開啟 [IIS管理員] -> 在站台下新增[應用程式] -> 輸入[別名]與對應實體資料夾 -> 點選剛新增的應用程式 ->
◎ 右側雙擊[WebDAV編寫規則] -> 右鍵[新增編寫規則] -> 在[指定的使用者]輸入新增的使用者名稱,其餘依需求設定 ->
◎ 右側雙擊[驗證] -> 啟用[基本驗證] -> 停用其他驗證方式。
至此,Server已設定完成。
● Client(以Windows 7為例):
1. 打開[服務] (控制台\所有控制台項目\系統管理工具) -> 啟動[WebClient]。
2. 打開登錄檔 (開始 -> 搜尋視窗打regedit) -> [BasicAuthLevel]改為2 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel),表啟用SSL與非SSL的基本驗證 -> reboot。
3. 右鍵[電腦] -> 點選[連線網路磁碟機] -> 在資料夾輸入http://IP或domain name/應用程式名稱
-> 彈出登入視窗 -> 輸入使用者名稱與密碼 -> 送出即可。
參考資料:
https://advancedhomeserver.com/making-a-pc-a-secure-webdav-server/
https://technet.microsoft.com/en-us/library/cc772009(v=ws.10).aspx
https://technet.microsoft.com/zh-tw/library/cc770642.aspx
http://blog.pulipuli.info/2014/07/windows-7owncloudwebdav-map-owncloud.html
WebDAV (Web-Based Distributed Authoring and Versioning)可透過網路磁碟機將Server上檔案整合進本機磁碟,若要設定WebDAV的基本驗證(Basic Authentication),Server該如何設定? Client又該如何連接呢?
作法:
● Server(以Windows Server 2012 R2為例):
1. 安裝WebDAV與基本驗證:
開啟[伺服器管理員] -> 點選新增角色及功能 -> 直到[伺服器角色]tab -> 點開[網頁伺服器] ->
◎ 點開[一般HTTP功能] -> 勾選[WebDAV發行] ->
◎ 再點開[安全性] -> 勾選[基本驗證] -> 安裝。
2. 建立使用者帳戶:
開啟 [電腦管理] -> 點開[系統工具] -> 點開[本機使用者和群組] -> [使用者]上右鍵 -> 新使用者 -> 輸入使用者名稱與密碼。
3. IIS站台新增應用程式與設定:
開啟 [IIS管理員] -> 在站台下新增[應用程式] -> 輸入[別名]與對應實體資料夾 -> 點選剛新增的應用程式 ->
◎ 右側雙擊[WebDAV編寫規則] -> 右鍵[新增編寫規則] -> 在[指定的使用者]輸入新增的使用者名稱,其餘依需求設定 ->
◎ 右側雙擊[驗證] -> 啟用[基本驗證] -> 停用其他驗證方式。
至此,Server已設定完成。
● Client(以Windows 7為例):
1. 打開[服務] (控制台\所有控制台項目\系統管理工具) -> 啟動[WebClient]。
2. 打開登錄檔 (開始 -> 搜尋視窗打regedit) -> [BasicAuthLevel]改為2 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel),表啟用SSL與非SSL的基本驗證 -> reboot。
3. 右鍵[電腦] -> 點選[連線網路磁碟機] -> 在資料夾輸入http://IP或domain name/應用程式名稱
-> 彈出登入視窗 -> 輸入使用者名稱與密碼 -> 送出即可。
參考資料:
https://advancedhomeserver.com/making-a-pc-a-secure-webdav-server/
https://technet.microsoft.com/en-us/library/cc772009(v=ws.10).aspx
https://technet.microsoft.com/zh-tw/library/cc770642.aspx
http://blog.pulipuli.info/2014/07/windows-7owncloudwebdav-map-owncloud.html
2016年5月1日 星期日
[.NET] WPF使用BackgroundWorker實現非同步作業
說明:BackgroundWorker是.NET framewrok 2.0時就有的控制項,方便用於UI thread外,另開thread背景執行耗時的作業,如下載網路上的資料等。
用法:
using System.ComponentModel;
//declare BackgroundWorker object in Field
private readonly BackgroundWorker worker = new BackgroundWorker();
//subscribe events & assign property
public MainWindow()
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
}
//下載button
private void btnDownload_Click(object sender, RoutedEventArgs e)
{
if (!worker.IsBusy)
{
//trigger DoWork event
worker.RunWorkerAsync();
}
else
{
MessageBox.Show("背景下載作業執行中,請稍候!");
return;
}
}
//取消下載button
private void btnCancelDownload_Click(object sender, RoutedEventArgs e)
{
worker.CancelAsync();
}
#region event handler method
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//背景耗時作業
Download(sender as BackgroundWorker);
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
e.Result = "Download Completed";
}
}
//DoWork結束後觸發 屬UI Thread
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//從DoWorkEventArgs object取得傳遞引數e
//label binding
this.lblDownloadProgress.Content = (e.Cancelled) ? "Canceled" : e.Result.ToString();
}
//屬UI Thread
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//label binding
this.lblDownloadProgress.Content = e.UserState.ToString();
//progressbar binding
this.pbDownload.Value = e.ProgressPercentage;
}
#endregion
private void Download(BackgroundWorker worker)
{
for (int i = 0; i < data.Length; i++)
{
if (worker.CancellationPending)
{
return;
}
else
{
//觸發ProgressChanged event
worker.ReportProgress(i * 100 / data.Length, string.Format("{0} files download", i));
}
Thread.Sleep(100);
}
}
參考資料:
http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker
https://msdn.microsoft.com/zh-tw/library/cc221403(VS.95).aspx
https://dotblogs.com.tw/billchung/2009/05/29/8592
用法:
using System.ComponentModel;
//declare BackgroundWorker object in Field
private readonly BackgroundWorker worker = new BackgroundWorker();
//subscribe events & assign property
public MainWindow()
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
}
//下載button
private void btnDownload_Click(object sender, RoutedEventArgs e)
{
if (!worker.IsBusy)
{
//trigger DoWork event
worker.RunWorkerAsync();
}
else
{
MessageBox.Show("背景下載作業執行中,請稍候!");
return;
}
}
//取消下載button
private void btnCancelDownload_Click(object sender, RoutedEventArgs e)
{
worker.CancelAsync();
}
#region event handler method
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//背景耗時作業
Download(sender as BackgroundWorker);
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
e.Result = "Download Completed";
}
}
//DoWork結束後觸發 屬UI Thread
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//從DoWorkEventArgs object取得傳遞引數e
//label binding
this.lblDownloadProgress.Content = (e.Cancelled) ? "Canceled" : e.Result.ToString();
}
//屬UI Thread
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//label binding
this.lblDownloadProgress.Content = e.UserState.ToString();
//progressbar binding
this.pbDownload.Value = e.ProgressPercentage;
}
#endregion
private void Download(BackgroundWorker worker)
{
for (int i = 0; i < data.Length; i++)
{
if (worker.CancellationPending)
{
return;
}
else
{
//觸發ProgressChanged event
worker.ReportProgress(i * 100 / data.Length, string.Format("{0} files download", i));
}
Thread.Sleep(100);
}
}
參考資料:
http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker
https://msdn.microsoft.com/zh-tw/library/cc221403(VS.95).aspx
https://dotblogs.com.tw/billchung/2009/05/29/8592
2016年4月19日 星期二
[Visual Studio] 使用Visual Studio 2015從程式碼逆向工程產出類別圖(class diagram)
說明:
從Visual Studio 2010後,可從架構總管(architecture explorer),提供從程式碼逆向產出類別圖,但VS 2015拿掉了架構總管,那該怎麼產出類別圖?
作法:
使用類別檢視(VS -> 檢視 -> 類別檢視)。
切換至類別檢視,點開你的專案,會列出專案全部namespce,
再點開namespace,會列出包含的class,在cs檔上右鍵,選擇類別圖檢視,
VS就會新增ClassDiagram1.cd,上面就有該class的圖,
再將其他class拖曳至ClassDiagram1.cd,即可產出想要的類別圖。
參考資料:
https://blogs.msdn.microsoft.com/visualstudioalm/2014/10/24/upcoming-changes-in-visual-studio-architecture-and-design-tools/
從Visual Studio 2010後,可從架構總管(architecture explorer),提供從程式碼逆向產出類別圖,但VS 2015拿掉了架構總管,那該怎麼產出類別圖?
作法:
使用類別檢視(VS -> 檢視 -> 類別檢視)。
切換至類別檢視,點開你的專案,會列出專案全部namespce,
再點開namespace,會列出包含的class,在cs檔上右鍵,選擇類別圖檢視,
VS就會新增ClassDiagram1.cd,上面就有該class的圖,
再將其他class拖曳至ClassDiagram1.cd,即可產出想要的類別圖。
參考資料:
https://blogs.msdn.microsoft.com/visualstudioalm/2014/10/24/upcoming-changes-in-visual-studio-architecture-and-design-tools/
2016年2月22日 星期一
[.NET/WPF] 屬性'Content'設定了一次以上。
說明:
編輯WPF的xaml,使用GroupBox編輯控制項出現該錯誤。
原因:
GroupBox內只能有一個element,因此無論Panel或Grid都只能放一個,可以在Panel或Grid內放入子element即可。例:
<GroupBox>
<StackPanel>
<UniformGrid></UniformGrid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
</Grid>
</StackPanel>
</GroupBox>
參考資料:
http://stackoverflow.com/questions/1356036/groupbox-in-wpf-can-only-contain-one-element
編輯WPF的xaml,使用GroupBox編輯控制項出現該錯誤。
原因:
GroupBox內只能有一個element,因此無論Panel或Grid都只能放一個,可以在Panel或Grid內放入子element即可。例:
<GroupBox>
<StackPanel>
<UniformGrid></UniformGrid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
</Grid>
</StackPanel>
</GroupBox>
參考資料:
http://stackoverflow.com/questions/1356036/groupbox-in-wpf-can-only-contain-one-element
2016年2月16日 星期二
[Visual Studio] 如何自動同步程式發行版本與最小必要版本? (強制更新發行程式) / minimum required version auto-increment in the clickonce deployment
說明:
使用clickonce發行程式安裝檔,想強制更新client程式,需指定最小必要版本,因發行版本可自動遞增,如何讓最小必要版本同步發行版本? 讓client程式可自動更新。
做法:
1. 方案總管中的專案圖示 -> 右鍵 -> 卸載專案
2. 一樣專案圖示 -> 右鍵 -> 編輯xxx.csproj
3. 在<Project>與</Project>的tag中插入以下設定:
4. 儲存並關閉csproj -> 發行後檢視部署資訊清單(xxx.application) -> 檢視minimum required version是否有值且正確。
參考資料:
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment
使用clickonce發行程式安裝檔,想強制更新client程式,需指定最小必要版本,因發行版本可自動遞增,如何讓最小必要版本同步發行版本? 讓client程式可自動更新。
做法:
1. 方案總管中的專案圖示 -> 右鍵 -> 卸載專案
2. 一樣專案圖示 -> 右鍵 -> 編輯xxx.csproj
3. 在<Project>與</Project>的tag中插入以下設定:
<Target Name="AutoSetMinimumRequiredVersion" BeforeTargets="GenerateDeploymentManifest">
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="MinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="_DeploymentBuiltMinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
</Target>
設定是將ApplicationVersion(如: 1.0.0.%2a)與ApplicationRevision(修訂號,如: 2)合併成最終發行版號,寫入最小必要版本,再寫入部署資訊清單內的最小必要版本屬性。4. 儲存並關閉csproj -> 發行後檢視部署資訊清單(xxx.application) -> 檢視minimum required version是否有值且正確。
參考資料:
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment
訂閱:
文章 (Atom)


