星期五, 10月 30, 2015

編碼轉換


這次遇到西歐語系編碼,系統無法正確儲存,只好寫個小工具來轉換編碼了。

先將檔案內容讀出來,GetEncoding(字碼頁)

string text = System.IO.File.ReadAllText(this.textBox1.Text, System.Text.Encoding.GetEncoding(1252));


然後另存檔案

System.IO.File.WriteAllText(this.textBox1.Text.Replace(".edi", "") + "_Unicode.edi", text);

再用記事本打開檔案就可以看到 WEIß 

大功告成

編碼參考連結:

星期四, 10月 22, 2015

小孩遊戲床

這組小孩遊戲床的使用真方便,收起來後也有輪子方便帶著走,侄子都還沒出生,家裡越來越多他的用品了。

星期四, 9月 24, 2015

P2V Vhdx 磁碟縮小

要將實體機轉成 Hyper-V 的虛擬機器,首先先用到 Disk2vhd 這個工具進行轉換成虛擬磁碟 vhdx

https://technet.microsoft.com/zh-tw/sysinternals/ee656415.aspx


轉換後在 Hyper-V 開啟後發現硬碟空間配置,其實只需要 C 槽就好,D 槽完全都是空的



於是就先把 D 槽整個刪除,清出空間來,可是即便是這樣也無法將未分配的空間刪除



這時候就要使用到 Hyper-V 的功能編輯磁碟

選擇該虛擬磁碟後進行壓縮的動作
再將其掛載起來看看
已經成功的從1 TB 收到 100GB 了,也打之前的刪除磁區清掉

星期二, 7月 14, 2015

DHL Shipment Validation by C#

公司要導入跟物流的自動交互,如此就可以自動從 ERP 將資料傳到物流的系統,順便直接產生出提單 Label 直接可以貼在箱上。

DHL 提供的範例為 Java 的,只好問 Google 看看大家的經驗了,

經過好幾天的看文件,找範例,問廠商,總算可以順利的印出 Label 了。

string requestText//導入 XML 資料
WebRequest requestRate = HttpWebRequest.Create("https://xmlpitest-ea.dhl.com/XMLShippingServlet");//DHL 的測試環境
requestRate.ContentType = "application/x-www-form-urlencoded";
requestRate.Method = "POST";

using (var stream = requestRate.GetRequestStream())
{
var arrBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(requestText);
stream.Write(arrBytes, 0, arrBytes.Length);

stream.Close();

}



WebResponse responseRate = requestRate.GetResponse();

var respStream = responseRate.GetResponseStream();

var reader = new StreamReader(respStream, System.Text.Encoding.ASCII);

string strResponse = reader.ReadToEnd();

respStream.Close();



XmlDocument xdoc = new XmlDocument();

xdoc.LoadXml(strResponse);



            XmlNodeList list = xdoc.GetElementsByTagName("OutputImage");



if (list.Count > 0)

{

//EPL2 直接傳給印表機進行列印

byte[] bytes = Convert.FromBase64String(list[0].InnerText.ToString());

IntPtr pUnmanagedBytes = new IntPtr(0);

int nLength = bytes.Length;

pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);

Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);

RawPrinterHelper.SendBytesToPrinter("DHL_Label", pUnmanagedBytes, nLength);

Marshal.FreeCoTaskMem(pUnmanagedBytes);

}

這邊會用到一個 Microsoft 網站只有找到 VB.Net 的,但網路上有人已經改成 C# 的 Class

public class RawPrinterHelper
  {
    // Structure and API declarions:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class DOCINFOA
    {
      [MarshalAs(UnmanagedType.LPStr)]
      public string pDocName;
      [MarshalAs(UnmanagedType.LPStr)]
      public string pOutputFile;
      [MarshalAs(UnmanagedType.LPStr)]
      public string pDataType;
    }
    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

    [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool ClosePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

    [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool StartPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool EndPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

    // SendBytesToPrinter()
    // When the function is given a printer name and an unmanaged array
    // of bytes, the function sends those bytes to the print queue.
    // Returns true on success, false on failure.
    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
      Int32 dwError = 0, dwWritten = 0;
      IntPtr hPrinter = new IntPtr(0);
      DOCINFOA di = new DOCINFOA();
      bool bSuccess = false; // Assume failure unless you specifically succeed.

      di.pDocName = "My C#.NET RAW Document";
      di.pDataType = "RAW";

      // Open the printer.
      if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
      {
        // Start a document.
        if (StartDocPrinter(hPrinter, 1, di))
        {
          // Start a page.
          if (StartPagePrinter(hPrinter))
          {
            // Write your bytes.
            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
            EndPagePrinter(hPrinter);
          }
          EndDocPrinter(hPrinter);
        }
        ClosePrinter(hPrinter);
      }
      // If you did not succeed, GetLastError may give more information
      // about why not.
      if (bSuccess == false)
      {
        dwError = Marshal.GetLastWin32Error();
      }
      return bSuccess;
    }
    public static bool SendMemoryToPrinter(string szPrinterName, MemoryStream ms)
    {
      BinaryReader br = new BinaryReader(ms);
      Byte[] bytes = new Byte[ms.Length];
      bool bSuccess = false;
      IntPtr pUnmanagedBytes = new IntPtr(0);
      int nLength;

      nLength = Convert.ToInt32(ms.Length);
      bytes = br.ReadBytes(nLength);
      pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
      Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
      bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
      Marshal.FreeCoTaskMem(pUnmanagedBytes);
      return bSuccess;
    }
    public static bool SendFileToPrinter(string szPrinterName, string szFileName)
    {
      // Open the file.
      FileStream fs = new FileStream(szFileName, FileMode.Open);
      // Create a BinaryReader on the file.
      BinaryReader br = new BinaryReader(fs);
      // Dim an array of bytes big enough to hold the file's contents.
      Byte[] bytes = new Byte[fs.Length];
      bool bSuccess = false;
      // Your unmanaged pointer.
      IntPtr pUnmanagedBytes = new IntPtr(0);
      int nLength;

      nLength = Convert.ToInt32(fs.Length);
      // Read the contents of the file into the array.
      bytes = br.ReadBytes(nLength);
      // Allocate some unmanaged memory for those bytes.
      pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
      // Copy the managed byte array into the unmanaged array.
      Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
      // Send the unmanaged bytes to the printer.
      bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
      // Free the unmanaged memory that you allocated earlier.
      Marshal.FreeCoTaskMem(pUnmanagedBytes);
      return bSuccess;
    }
    public static bool SendStringToPrinter(string szPrinterName, string szString)
    {
      IntPtr pBytes;
      Int32 dwCount;
      // How many characters are in the string?
      dwCount = szString.Length;
      // Assume that the printer is expecting ANSI text, and then convert
      // the string to ANSI text.
      pBytes = Marshal.StringToCoTaskMemAnsi(szString);
      // Send the converted ANSI string to the printer.
      SendBytesToPrinter(szPrinterName, pBytes, dwCount);
      Marshal.FreeCoTaskMem(pBytes);
      return true;
    }
  }

星期三, 1月 07, 2015

這次訂票的經驗告訴我

訂票系統真的很複雜,很難寫,

光是一個網站的編碼都無法整合了

難怪我會看到亂碼~~~~機車哩,浪費我很多時間,只搶到給我媽跟阿姨們的,自己只能等加場了。

一直重新整理,一天三千次以上也不厭倦呀~~~~


星期四, 12月 25, 2014

小米手環入手囉

等了好久,總算等到台灣開賣了,當然要趁聖誕節買一個來玩玩看囉!!






















戴在手上其實很輕,沒有什麼感覺,可能要小心的就是不小心擠壓到彈飛出去吧XD

星期五, 12月 05, 2014

SQL Server 刪除特定連線

最近發現以前別人寫的 Web Service 在資料庫連線控制沒有寫好,連線用完了也不關閉,造成IIS 的 Application Pool 連線數過多,

因為是特定的主機,當然只能 Kill 特定的 spid

只好先抓出那台主機所有 spid 來進行刪除的動作


DECLARE @spid int, @SQLstr nvarchar(128)
DECLARE spids_cr CURSOR FOR
SELECT p.spid FROM sys.sysprocesses P JOIN sys.sysdatabases D ON (D.dbid = P.dbid) JOIN sys.sysusers U ON (P.uid = U.uid) WHERE hostname != '' AND hostname = @hostname AND [P].[program_name]='.Net SqlClient Data Provider                                                                                                    ' 
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr
參考:http://www.stev.org/post/2011/03/01/MS-SQL-Kill-connections-by-host.aspx http://sharedderrick.blogspot.tw/2008/01/kill-all-connection.html

星期三, 8月 06, 2014

效能監控與發送警示郵件

有一天公司的 SQL Server 記憶體竟然使用到 64G,整個服務根本就是掛掉了,

想要查詢正在執行什麼語句都沒辦法,只好把服務重啟了,

正常來講,我們的記憶體使用量連 32G 都不到的,為了預防這種情況發生,

只好開始找尋監控的方式,

這裡寫到
http://stackoverflow.com/questions/6189927/sql-memory-viewing-actual-memory-used-and-memory-available

可以直接抓出 SQL Server 使用的記憶體大小

SELECT object_name, counter_name, cntr_value AS 'Total Server Memory (KB)'
FROM sys.dm_os_performance_counters 
WHERE counter_name = 'Total Server Memory (KB)'
不過看起來好像有點不準,於是繼續尋找其他方法,

政廷提供了這個網址,使用效能監視器
http://www.dotblogs.com.tw/jamesfu/archive/2012/12/07/perfmon.aspx

搭配他我找到了這個效能監視器加上工作排程器
http://www.dotblogs.com.tw/kirkchen/archive/2012/11/24/use-performance-monitor-to-monitor-server-and-send-alert-email.aspx

所以最後使用就使用效能監視器紀錄使用狀況,當超過設定值的時候就發送郵件通知

星期一, 7月 28, 2014

換馬桶進水器

昨天一早就被老媽叫醒,說廁所的馬桶水箱在漏水,

我第一件事情就是先關掉馬桶的進水管, 打開水箱觀察一下是什麼問題,

馬上就發現原因了,原來是浮水球桿子斷了,本來想用膠帶黏一下好了,

沒想到根本不夠力,只好換掉了,

去特力屋買了進水器跟浮球組回家來換,其實構造很簡單,只是馬桶下方不好使力而已,

大約 20 分鐘就換好了。


看看說明,是不是很簡單呀,上次換這個請水電來,花了一千二呢。



星期五, 7月 18, 2014

Team Foundation Server 還原別人的簽出

使用 TFS 最怕遇到的就是程式被別人簽出了,而簽出的人又不在或是離職了,系統設定為只能單一簽出的時候就很麻煩了,最簡單的方式就是還原該使用者的簽出,

1. 當然要有 VS 2010 或是 VS 2012

2. 安裝 Microsoft Visual Studio Team Foudation Server 2010(2012) Power Tools

3. 在原始檔控制總管中隨便找一個檔案或文件夾按右鍵點選 "尋找 " ->"Find Status"

4. 進行 ckecked out 檔案的搜尋

5. 在找出的檔案按右鍵 "Undo",就可以還原別人的簽出了。