發表文章

目前顯示的是有「程式實作」標籤的文章

ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML 下載

圖片
這是使用 ASP.NET Core 2 來讀取 CWB 的開放資料的 XML 檔,並讓 Client 端下載方式 註冊CWB會員 CWB OpenData 平台(以下稱CWBODP)取用資料必須先註冊會員→ 這裡註冊 然後,登入OpenData平台→ 這裡登入 選擇 『資料選擇說明』頁面 ,在下方可以找到『取得授權碼』,這個頁面下有使用教學 要取得資料代碼可以從 『資料清單』頁面 取得需要的代碼 有了上述資訊後,就可以著手開始做 .NET Core 2 的取用程式了。 CWODP取用 XML 檔案的 URI: http://opendata.cwb.gov.tw/opendataapi?dataid= {資料代碼} &authorizationkey= {授權碼} .NET Core 2 使用 HttpClient 有以下幾種: 一般 HttpClient 方式 直接使用 HttpClientFactory 具名式 Client 型別式 Client 產生式 Client 一般 HttpClient 方式 FileController.cs using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using System.Net.Http; namespace CWBReader.Controllers {     [Route("[controller]")]     public class FileController : Controller     {         [Route("")]         public async Task<string> DownloadFile()         {             using (var client = new HttpClient())             {                 string url = "http://opendata.cwb.gov.tw/opendataapi?dataid=F-C0032-0

C# 存取 Sybase 資料庫

圖片
要讓 dotNet 程式存取 Sybase 資料庫,首先,你必須取得 Sybase PC Client 的幾個DLL檔案: Sybase.Data.AseClient.dll sybdrvado11.dll sybdrvssl.dll 如果是開發者,可能需要先安裝 PC Client <<這裡下載>> ,安裝完後再到 Visual Studio的專案下,把 Sybase.Data.AseClient.dll 加入參考 當要執行時,記得把 sybdrvado11.dll、sybdrvssl.dll 一並複製到執行路徑下(Sybase.Data.AseClient.dll 會自動在編譯時加入到路徑下所以不用特別拷貝) 使用時要引用: using Sybase.Data.AseClient; 程式流程部分 : 1、建立連線 → 2、建立SQL命令 → 3、建立傳遞參數(如果需要) → 4、傳遞參數值(如果有建立傳遞參數) → 5、執行命令 → 6、取得查詢資料 連線資料庫 //連線資料庫 AseConnection aseCon; aseCon = new AseConnection ( "DataSource= ServerIPorName ;Port= 5000 ;Database= Windstone ;UID= sa ;PWD= adminPassw0rd " ); aseCon.Open(); SQL指令準備有兩種處理方式 : 一次性執行或是重複執行。 //一次執行的方式 string employeeNo = "052419" ; DateTime inDate = new DateTime (2016,5,1); AseCommand GetEmplName = new AseCommand ( "SELECT empl_name FROM employee WHERE empl_no = '" + employeeNo + "' and job_date > '" + inDate.toString( "yyyy/MM/dd"

C# INI Profile Read and Write Class

圖片
C# dotNet 程式對INI的設定檔存取,因為 微軟考量到 INI 存取的多程序存取無法達到同步問題,故從 dotNet 取消對 INI 檔案的支援,但是實際上卻還是有許多地方需要用到它。 所以,將它提出製作成一個 Class,方便以後用到: using System; using System.Text; using System.Runtime.InteropServices; using System.IO; namespace Profile.Interop {     class IniFile     {         public string FileName { get ; set ; }         public IniFile()         {             //在預設情況下,會使用執行檔案名稱做為INI的檔案名稱(與執行檔案相同位置)             string path = System.Diagnostics. Process .GetCurrentProcess().MainModule.FileName;             string filename = Path .GetFileNameWithoutExtension(path) + ".ini" ;             string dir = AppDomain .CurrentDomain.BaseDirectory;             FileName = Path .Combine(dir, filename);         }         public IniFile( string fileName)         {             //使用者指定             FileName = fileName;         }         [ DllImport ( "kernel32" )]         private static extern long WritePrivateProfileString( string section,          

C# 免裝Excel 就可以讀取 EXCEL 檔案 - ExcelDataReader (C# Read xls/xlsx/csv without excel using ExcelDataReader)

圖片
在幫公司開發程式的過程中,常常免不了要接收使用者或是客戶上傳的資料檔案, 通常我們程式設計師在解析檔案使用XML、CSV、TXT之類的檔案很好用,但對於使用者來說卻不是很友善的介面,通常會用統計資料的,也決不會是WORD,很多時候都是使用EXCEL或是CALC做出來的檔案。 在台灣大部分都是使用EXCEL做出來的統計檔案占絕大多數,因此處理這些EXCEL檔案便是家常便飯之事了。 而EXCEL產出的檔案,以附檔名類型上來說大致分為 .XLS 或是 .XLSX 這兩類。XLS檔案屬於BIFF格式檔案,它是一種二進位格式(Binary)檔案;XLSX則是比較新的檔案,屬於XML架構的檔案,一般又稱為 OpenXML,因此在處理與解讀上有所不同。 通常要處理 BIFF 檔案或是 OpenXML 檔案都需要有相當的格式研究能力,對於一般設計師來說都不是簡單的事,更不像TXT、CSV、XML這麼容易。 dotNet Framework 處理 EXCEL 當然自有一套方式,不管是LINQ、或是使用 Microsoft.Office.Interop.Excel 或是以 Microsoft.Jet.OLEDB.4.0 資料庫方式操作都避免不了一件事,就是 執行讀取檔案的電腦必須安裝 EXCEL ,但大家都知道 EXCEL本身不是免費的軟體,收費也很高,如果要在使用者端能夠執行,勢必在使用者端要裝上不少授權,光是費用都很驚人,也不是一般的小公司能夠負擔的。 ExcelDataReader - 這是一套在GitHub 上的 OpenSource 套件,它提供了強大的 Reader 功能,重點是免費,與強大的可攜性,它號稱是 Lightweight and fast library written in C# for reading Microsoft Excel files。 基本的讀取不是問題,處理檔案有它就很夠用了。 首先你可以到專案下的 NuGet 去取得套件: 總共有兩個套件要安裝:ExcelDataReader 和 ExcelDataReader.DataSet 要注意的是3.0.0以前的版本只有 ExcelDataReader,沒有 ExcelDataReader.DataSet,這個 DataSet 套件是從 3.0.0後分開的,

C# 取得 Windows 內所有程序視窗名稱、類別、指標

圖片
Get windows process handle / title name / class name 這篇其實是用來輔助 powerbuilder 寫的,因為大多數的第三方軟體都習慣會透過 FindWindow 這個API來確認己方程式是否已經啟動。 但是通常會不清楚自己開發工具開發的視窗會是哪種 Class Name ,所以利用下面簡單方式把電腦內所有程序的 handle / title name / class name 全部列出來查個清楚。 由於呼叫了 C 元件(COM API)所以需要多使用下面幾種 引用 using System.Runtime.InteropServices; using System.Text; using System.Collections; 程式的部分我將使用一個多行的 TextBox 把資訊列出來: namespace EnumWindows20 {     public partial class Form1 : Form     {         //Define Unmanaged API         public delegate bool EnumedWindow ( IntPtr handleWindow, ArrayList handles);         [ DllImport ( "user32.dll" , CharSet = CharSet.Auto, SetLastError = true)]         [return: MarshalAs(UnmanagedType.Bool)]         public static extern bool EnumWindows ( EnumedWindow lpEnumFunc, ArrayList lParam);         [ DllImport ( "user32.dll" , SetLastError = true, CharSet = CharSet.Auto)]         public static extern int GetClassName ( IntPtr hWnd, StringBuilder lpCl

使用arduino設計EBD展示燈

圖片
其實這個構想很久了, 指是要先處理單線電力供電問題,再處理高低壓控制,以及演示計算問題。 我再這之前有作出一個簡易的 EBD 煞車燈, 但是,看久了還是希望有點變化,可是又不希望買市面上的燈條來組合: 一來是我希望展示燈有有延遲啟動效果,市面上燈條做不到。 二來是希望展示的方式可以依照自己喜好組合,市面上燈條也難辦到。 所以只好動起 Arduino 歪腦筋,看看能不能塞進去第三煞車燈了。 先勾勒出電路圖 不算太難,只是線路有點多而已,由於要塞到第三煞車燈裡面所以要進量縮小 因此比較多零件的驅動電晶體使用了SMD的N通道MOSFET - P3055LDG來製作。 原則上Arduino NANO 是5V 驅動與電力提供, 控制 TLC5940NT 一路都是5V 但是要轉到控制12V的LED燈板就需要用到偶合電路比較安全, 因此這裡選用了簡單形式的 LTV847 光耦合IC來串接, 這樣就可以隔離12V電力,避免逆流回Arduino 或TLC5940NT導致燒毀問題。 Arduino NANO TLC5940NT LTV847 P3055LDG 程式的部分改天再分享上來

Xamarin : Android 取得媒體儲存裝置 retrieve emulated or removable storage path

圖片
這是一個很觀念的問題,其實android對於儲存位置的概念跟Windows是不一樣的。 我們所知的 Windows 的儲存媒體,通常都會是以『磁碟機』(Device)概念呈現的,每個 Device 都會被賦予一個『磁碟機代號』(Device Letter),像是 『C:\』『 D:\』 等等。 但是除了 Windows 以外的世界,基本上會是用『路徑』來呈現,由其 Android 的 Dalvik 系統本身就是 java 的支線,所以儲存空間會像是 『/Storage/dev0』『/Storage/dev1』之類的呈現法。 瞭解了以上的概念之後,再來瞭解 Android 對於儲存空間的認定。 一般我們在看儲存位置的時候,直覺上會把手機的儲存空間分為『內建』『內部』『外部』『擴充』等等的用法,因為 Android 有分為內建記憶空間和一個可以擴充的 SD 卡(或是TF卡)。 而我們程式在開發時相關文件都會去 Google 找類似 Internal 或是 External 類的單字搜尋,但實際上找到的文件範例基本上都會牛頭不對馬嘴,最大的原因應該會出在 Android 開發團隊對於這種一般人認定的常規式用法式有很大出入的。 Android 對於內建記憶空間和擴充的SD卡認定如下: Emulated - 內部記憶空間,用的單字是『仿真』,而不是 Internal (內部),是因為 Android 真正內部記憶體指的是ROM,也就是作業系統OS存在的地方,而ROM本身不能經常寫入,因為有寫入壽命限制,但是作為一個作業系統難免會有許多設定或變更或紀錄,那這樣要存在哪裡呢?事實上, Android 手機真正可以讀寫的內建空間其實也是一個 SD 卡,指是手機製造商會在手機裡面直接燒上SD的儲存晶片作為內建儲存空間,凡是OS以外的程式APP或是紀錄都會存在此處,所以把這種內建 SD 記憶體稱為『仿真記憶體』。 Removable - 擴充的記憶體(SD卡或TF卡),這被稱為『可移除式』媒體,名字簡而易瞭,代表這記憶體可以被移除或是安插。 External - 而這個『外部』的意思就是泛指除了 OS 的 ROM 之外的都會稱為 External,所以上面兩個『Emulated』、『Removable』都算在 External 下面。而 Ext

Xamarin : Android : FilePicker 檔案瀏覽

圖片
其實這是用來搞懂 這一篇  Browse Files - Xamarin 範例則來自 GitHub 的 mgmclemore 收集的  A collection of Xamarin.Android sample projects 由於 android 瀏覽檔案時沒有像 Windows 一般有『現成』的檔案瀏覽介面(SHELL)可以使用,所以就非常麻煩的必須自己去作出像檔案瀏覽器一樣的介面。 而且 Xamarin 開發的介面中也沒有可以直接使用的元件,所以這完全必須依賴外部套件才有辦法作出來。 這個套件引用了 Xamarin.Android.Support.v4 這個套件,所以必須先到NuGet去下載這個套件到專案內。

Xamarin : Android : Vibrate 使用裝置震動

圖片
在 Xamarin 下開發 Android 裝置需要振動程式碼如下 void button_vibrator_Click(object sender , EventArgs ea) {     // 建立振動服務     var vibrator = (Vibrator)GetSystemService(Android.Content.Context.VibratorService);     int iDuration = 500; // 500毫秒,振動持續時間       // 執行     vibrator.Vibrate(iDuration); } 這個 Vibrator 需要引用 using Android.OS; 這個服務屬於非同步機制,發出震動後不會等待振動時間完畢,而會繼續執行程式。 另外,還需要賦予適當的使用權限,可以在 專案屬性 調整 或是到 AndroidManifest.xml 裡增加 <uses-permission android:name="android.permission.VIBRATE" /> 建議使用專案屬性調整會比較安全,比較不會打錯字

Xamarin : Android : playback a tone 發出警告聲(簡單聲音)

在 Xamarin 下開發 Android 讓裝置發出 警告聲音 或是 提示聲音 void button_beep_Click(object sender , EventArgs ea) {     int iVolume = 100; // 0 ~ 100 音量,但不是裝置實際音量,而是產生音波的音量     int iDuration = 500; // 500毫秒,聲音持續時間     // 建立執行物件     var tonGen = new ToneGenerator(Android.Media.Stream.Music, iVolume);     //播放聲音     //tonGen.StartTone(Android.Media.Tone.CdmaAlertAutoredialLite,1000);     //tonGen.StartTone(Android.Media.Tone.CdmaAlertCallGuard, 200);     //tonGen.StartTone(Android.Media.Tone.CdmaAlertIncallLite, iDuration );     //tonGen.StartTone(Android.Media.Tone.CdmaAlertNetworkLite, iDuration );     tonGen.StartTone(Android.Media.Tone.PropBeep, iDuration ); } Android.Media.Tone 底下列舉不少基本 DTMF 的音調,可以自行選擇測試 這個元件比較適合播放訊息聲音(比較簡單的音調)。 如果要播放音樂建議使用 AudioTrack 物件。 注意這個播放是屬於非同步的,而且會以最後一次呼叫StartTone的聲音為主,如果同時播放多個聲音檔,則只會聽到最後一個聲音。

Xamarin : Android : Lock Screen(View) Orientation 禁止螢幕(畫面)旋轉

在 Xamarin 開發 Android 的時候如果要禁止畫面旋轉 要在 Activity 的程式碼使用下面方式(黃色部分)宣告 [Activity(Label = "ZxingTest", MainLauncher = true, Icon = "@drawable/icon" , ScreenOrientation =Android.Content.PM.ScreenOrientation.Portrait) ] Android.Content.PM.ScreenOrientation 裡面有些列舉屬性,像是: Android.Content.PM.ScreenOrientation.Portrait (豎屏;直向畫面) Android.Content.PM.ScreenOrientation.Landscape (橫屏;橫向畫面) 而大部分網路上說修改 AndroidManifest.xml 裡面更改 <activity> 屬性增加 android:screenOrientation="portrait"等這類方式都是  Android Studio 的開發方式 不是 Ms Visual Studio 的開發方式,所以特別紀錄一下。 為什麼要禁止螢幕旋轉: 除了特定版面排版特性之外, 當每次旋轉螢幕時 Activity 和 View都會被重載 (Reload/Redraw) ,此時畫面上所有物件都會被 摧毀並釋放記憶體空間,由於這個特性,在畫面上的資料如果沒被儲存就會消失的一乾二淨。 當然可以利用 OnSaveInstanceState 和 OnRestoreInstanceState 事件覆寫來處理資料儲存和還原,但是如果不想做太複雜,就直接設定禁止畫面旋轉就可以了。

Xamarin : Android : Using ZXing.Net.Mobile Scan Barcode 掃描讀取條碼/QR碼

圖片
網路上大部份文章在講 Xamarin 開發都用上了 CPL類型的專案, 對於純粹使用 Android 專案使用者要理解真是有點不方便, 這裡是記錄了在 Xamarin 下的 Android 專案如何開發一個讀取 條碼或是 QR碼的功能 個功能是基於 ZXing.Net.Mobile 套件開發的,可以自行把這個套件應用你的專案中 1、假設你經開啟了一個 Android blank Project (空白專案) 2、使用 NuGet 管理員去新增 ZXing.Net.Mobile 套件,並把它安裝到專案中 3、然後到你要呼叫使用 ZXing 操作的 Activity 去新增引用(在這案例裡我是放在 MainActivity.cs 內) using ZXing; using ZXing.Mobile; 4、在顯示畫面(Main.axml)上設計兩個 TextView 和一個 Button,用來啟動掃描和接收掃描的結果 5、然後就是把操作 ZXing 的程式碼加入,在這案例中,我只簡單全部做在 MainActivity 的 OnCreate 內,實際應用上你可以依照需要放置。 using Android.App; using Android.Widget; using Android.OS; using ZXing; using ZXing.Mobile; namespace ZxingTest {     [Activity(Label = "ZxingTest", MainLauncher = true, Icon = "@drawable/icon")]     public class MainActivity : Activity     {         //建立操作物件指標         private TextView _barcodeFormat, _barcodeData;         protected override void OnCreate(Bundle bundle)         {             base.OnCreate(bundle);             // 設定顯示畫

C# AES encrypt/decrypt and Base64 encode/decode

圖片
範例檔案: 這裡下載 純執行檔: 這裡下載 有興趣研究 AES 加解密 與 Base64 編解碼 的可以研究一下 因為用到了AES 元件,所以只適用 .NET 3.5 以上 畫面如下: 為什麼 AES 和 BASE64 寫在一起? 因為 AES 加密後的內容是 ASCII 碼,很多是無法以明文顯示的,因此會再編碼成BASE64以便傳遞或攜帶。反過來說,接收到AES的密碼通常會以BASE64編成居多,所以必須解碼後再進行AES解密環原本文。 Base64編碼: 要引用  using System; //將文字內容(明文)轉成base64文字(編碼) tbB64_2.Text = Convert.ToBase64String(Encoding.Default.GetBytes(tbB64_1.Text)); Base64解碼: 要引用  using System; //將base64編碼文字轉回明文(解碼) tbB64_1.Text = Encoding.Default.GetString(Convert.FromBase64String(tbB64_2.Text)); AES加密: 要引用  using System.Security.Cryptography; static byte[] EncryptionByAES(string plainText, byte[] key, byte[] IV) {   byte[] encrypted;   //檢查參數   if (plainText == null || plainText.Length <= 0)      throw new ArgumentNullException("沒有要加密的文字");   if (key == null || key.Length <= 0)      throw new ArgumentNullException("沒有提供金鑰");   if (IV == null || IV.Length <= 0)       throw new ArgumentNullException("沒有提供IV");   //這裡使用Ae

C# 設定TcpClient連線時的TimeOut

我在設計一個測試主機是否存活的連線方式,通常除了Ping的方式之外,另外一種就是模擬telnet的連線方式,當伺服器的ICMP被關閉時,或是防火牆未開啟ICMP的通道時,Ping Host 就無法成功,但是通常伺服器都會開啟定服務埠來提供外部的服務,例如 Http(80)、DNS(43)、FTP(21)、RDP(3389)、HTTPS(443)、other Http(8080)、1433(SQL)等等。 此時可以透過基本的 Socket Connection 來確定該服務可以連線,基本上若是不存可以連線的埠,則 Connect 會發生拒絕連線的 Exception,但是在透過防火牆後的連線,有可能連拒絕連線的訊息都不會回應,導致 Connection被 Hang住,故在設計 Scoket Connect 時要有 Timeout 的設計,最好可以自己決定 Timeout 時間,但是 Socket 或 TcpClient 都沒有 Connect 的 Timeout 可以去設定,因此我們使用了 BeginConnect 非同步連線 + ManualResetEvent 等待中斷的事件來處理。 using System.Net.NetworkInformation; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace Test {     class tcptool     {         //可以取得的回覆訊息         public string ReplyMessage;               private static bool IsConnectionSuccessful = false;         private static Exception socketexception;         private static ManualResetEvent TimeoutEvent = new ManualResetEvent(false);         public bool connectHost(string sHost, int port ,