軟體開發(軟件開發)

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

室內設計、裝潢、窗簾報價估算軟體

網智數位主要提供套裝及客製化的軟體系統解決方案,針對室內設計師、木工、裝潢業產業,量身訂做客製化的軟體,達成客製化、智慧化及網路化的商用軟體。

商用軟體-客製化設計

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

IOT 物聯網-系統開發

根據客戶實際狀況,結合雲端與載具進行客製化物聯網IOT導入與軟體開發

雲端VPS虛擬主機租用

我們的雲端VPS虛擬主機是採用雲端(虛擬化)技術所開發之全新雲端伺服器服務,可以選擇多種作業系統(Windows、Linux等),客戶可載入自訂的應用環境,執行自己所要提供的網路服務,我們的雲端服務可為您的網站提供最完美的解決方案。

ERP軟體客製化導入

ERP軟體客製化導入,室內設計、營造業、裝潢、木作工程、系統櫃工程、會計系統,全面提升公司管理營運效率。

搜尋引擎最佳化SEO

搜尋引擎最佳化(SEO)不僅能提高網站在搜尋結果的排名,更能帶來大量對我們產品或服務真正有需求的訪客。SEO 最棒的特質之一就是不像廣告一樣亂槍打鳥而導致用戶的反感,反而更能提升點閱率跟成交率喔。

服務宗旨

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

我們的成立宗旨就是要以最猛的IT技術讓這個世界更Smart,在我們貫徹我們裡想的同時,我們希望可以把我們所開發的系統帶給台灣的中小企業,除了要推薦好的東西之外,我們也希望做點改變,所以我們的第一目標就是要使用最好用的系統再加上您寶貴的創意,不僅僅可以節省你大量的荷包,還可以有一個像樣的網站。我們可以幫你做的有

企業管理
  • 策略管理
  • 目標管理
  • 行銷管理
  • 財會管理
  • ERP導入
  • 企業流程自訂
資訊管理
  • 網站架設
  • 虛擬化/雲端架設
  • 主機代管
  • 私有雲建制與導入
軟體開發
  • UML設計
  • 版本控管
  • 企業軟體開發
  • APP開發
  • 網頁設計
資訊安全
  • 網頁弱點掃描
  • 主機弱點掃描
  • 木馬檢測
  • 資安鑑識
  • 設計網路架構
  • 資安監控
行銷
  • 關鍵字SEO
  • 社群網路行銷
  • 部落格行銷
  • FaceBook 粉絲團
其他
  • 協助企業申請Google Email
好玩工具開發

講出你的創意吧!沒有甚麼是資訊辦不到的

顯示具有 .NET 標籤的文章。 顯示所有文章
顯示具有 .NET 標籤的文章。 顯示所有文章

2017年7月8日 星期六

在.Net 透過 Parallel 類別操控多任務平行作業(二)【軟體開發、軟體設計、系統開發、客製化軟體】

    這篇主要是再次講解 Parallel 類別並行作業的其他支援方法,主要是延續上一篇教學文章 3-1.透過 Parallel 類別操控多任務平行作業(一)。 

    這邊我將透過WPF專案實作一個使用 Parallel.ForEach 方法來支援的循環平行作業任務,它的概念就好比我們常在寫的 for(i=0;i<=10;i++)、或 foreach 迴圈,只是Parallel 類別是充分利用多個處理器、多個核心同時進行作業,執行速度當然效率就快很多。



步驟1:
在 Visual Studio 一樣建立一個WPF 專案

wpf

步驟2:
在 MainWindows.xmal 界面設計成如下結果
parellel

主要是使用了 3個 textbox 控制項,用於讓使用者輸入 資料夾路徑 、想建立的檔案數量、以及每個檔案的大小,再來使用一個 button 按鈕(開始執行 Parallel.Foreach 多任務運算), 來撰寫主要的 並行作業邏輯程式碼。


xaml 程式碼部分畫面
xaml2



步驟3:
在 Button.Click 事件撰寫主要程式碼


程式碼如下:

private void OnClick(object sender, RoutedEventArgs e)
{
    if (string.IsNullOrWhiteSpace(txtDir.Text))
    {
        MessageBox.Show("請輸入目標存放文件的資料夾!!");
        return;
    }


    //如果目標資料夾不存在,就建立一個新的資料夾
    if (!Directory.Exists(txtDir.Text))
    {
        Directory.CreateDirectory(txtDir.Text);
    }


    int fileNum = 0;
    if (!int.TryParse(txtFileNum.Text, out fileNum))
    {
        MessageBox.Show("請輸入檔案的數量!!"); return;
    }


    long fileSize = 0L;
    if (long.TryParse(txtSize.Text, out fileSize) == false)
    {
        MessageBox.Show("請輸入預計每個檔案的大小!!");
        return;
    }


    //記錄要產生新的檔案名稱清單
    List<string> fileNames = new List<string>();


    for (int n = 0; n < fileNum; n++)
    {
        //檔案名稱
        string _filename = "file_" + (n + 1).ToString();


        //資料夾的絕對路徑
        string _dirpath = System.IO.Path.GetFullPath(txtDir.Text);


        //新的檔案的完整路徑
        string fullPath = System.IO.Path.Combine(_dirpath, _filename);


        //加入清單
        fileNames.Add(fullPath);
    }


    txtDisplay.Clear();

    //宣告一個Random 亂書產生器,目的待會用來產生每個檔案的隨機內容
    Random rand = new Random();


    //宣告一個 Action 委派任務,來產生每個檔案與檔案內容
    Action<string> act = (file) =>
        {
            FileInfo fileInfo = new FileInfo(file);


            //如果文件已經存在,就把它刪除
            if (fileInfo.Exists)
                fileInfo.Delete();


            //開始進行隨機寫入內容
            byte[] buffer = new byte[fileSize];
            rand.NextBytes(buffer);


            using (FileStream fs = fileInfo.Create())
            {
                 BinaryWriter sw = new BinaryWriter(fs);
                 sw.Write(buffer);
                sw.Close();
                sw.Dispose();
            }


            //顯示執行結果
            string msg = string.Format("檔案{0}已經建立完成!!\n", fileInfo.Name);
             this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


        };

    //開始進行 Parallel 的循環平行任務作業
    Parallel.ForEach<string>(fileNames, act);


}




重點程式碼講解:
1.使用 Random rand = new Random();  ,來隨機產生每個檔案的內容。
2.宣告一個 Action 委派任務,來產生每個檔案與檔案內容。
Action<string> act = (file) =>
    {
        FileInfo fileInfo = new FileInfo(file);


        //如果文件已經存在,就把它刪除
        if (fileInfo.Exists)
            fileInfo.Delete();


        //開始進行隨機寫入內容
        byte[] buffer = new byte[fileSize];
        rand.NextBytes(buffer);


        using (FileStream fs = fileInfo.Create())
        {
            BinaryWriter sw = new BinaryWriter(fs);
            sw.Write(buffer);
            sw.Close();
            sw.Dispose();
        }


        //顯示執行結果
        string msg = string.Format("檔案{0}已經建立完成!!\n", fileInfo.Name);
        this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


    };

3.使用 Parallel.ForEach<string> 來開始進行 Parallel 的循環平行任務作業。



參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。







網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

在.Net 透過 Parallel 類別操控多任務平行作業(一)【軟體開發、軟體設計、系統開發、客製化軟體】

   此篇文章主要是延續之前的文章 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 透過 Parallel 類別支援的方法,撰寫非同步任務,這裡一樣我會透過簡單程式碼進行實作教學。


   在並行任務與建立一個新的執行緒過程來執行一個非同步作業的操作是非常相似地,但是在這邊的並行任務卻是可以更好地發揮多個CPU處理器或者多核心處理器的強大優勢,進而充分地利用CPU的可用資源來執行非同步作業任務,更方便地是,在 .Net 並行任務的操作過程被封裝地很好,身為程式開發人員只需要調用呼叫對應的類別與相關成員方法就可以很輕鬆地建立與執行並行任務了,至於任務是在那個CPU處理器執行,操作系統的底層會自動進行調用配置。


    在這邊我使用一個 WPF 的專案範例進行講解,來說明如何利用 .Net 的 Parallel 類別執行非同步作業。


步驟一 :
在 Visual Studio 2017 建立一個 WPF 專案,
wpf



步驟二:
在 主要的 MainWindow.xaml 畫面,用xaml 語法宣告了一下界面結果


2017-07-08_17-12-48


主要是有 提供 3 個讓使用者輸入整數值的 TextBox , 以及對應 3 個顯示執行結果的 TextBlock ,還有一個 Button (執行 Parallel 運算平行任務)的按鈕。


部分xaml 語法如下:
xaml


步驟三:
在 Button 的 Clieck 事件,進行撰寫主要的核心程式碼邏輯….
(Code)
private void OnClick(object sender, RoutedEventArgs e)
{
    int num1 = default(int);
    if (!int.TryParse(txtInput1.Text, out num1))
    {
        MessageBox.Show("輸入第一個正整數值:");
        return;
    }
    int num2 = default(int);
    if (!int.TryParse(txtInput2.Text, out num2))
    {
        MessageBox.Show("輸入第二個正整數值:");
        return;
    }
    int num3 = default(int);
    if (!int.TryParse(txtInput3.Text, out num3))
    {
        MessageBox.Show("輸入第三個正整數值:");
        return;
     }


    //宣告第一個並行作業的委派實體
    Action act1 = () =>
        {
             int sum = 0;
            for (int x = 1; x <= num1; x++)
            {
                sum += x;
            }


            //顯示執行結果
            this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run1.Text = sum.ToString()));
        };


    //宣告第二個並行作業的委派實體
    Action act2 = () =>
    {
        int sum = 0;
        for (int x = 1; x <= num2; x++)
        {
            sum += x;
        }


        //顯示執行結果
        this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run2.Text = sum.ToString()));
     };


    //宣告第三個並行作業的委派實體
    Action act3 = () =>
    {
         int sum = 0;
        for (int x = 1; x <= num3; x++)
        {
            sum += x;
        }


        //顯示執行結果
        this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run3.Text = sum.ToString()));
    };



    //使用 Parallel 類別來執行 並行任務
    Parallel.Invoke(act1, act2, act3);


}



程式碼重點講解:
1.這邊我主要用了 3 個 Action 的委派實體,分別用來進行整數的累加運算任務。
2.使用了 Dispatcher.BeginInvoke() 方法,和Windows Form 專案一樣,WPF 在平行作業模式下,也分為主UI的主執行緒,和多個任務的各別執行緒,而在任務的執行緒要改變主執行緒控管的主畫面下,必須透過 Dispatcher.BeginInvoke ,在不會發生一個 UnauthorizedAccessException 例外錯誤。
3.也是最重要的程式碼邏輯,利用 Parallel類別的 Invoke 方法呼叫,分別傳入多個委派實體,在這邊我宣告了3個 Action 委派實體,我一次傳入 Parallel.Invoke(act1,act2,act3), 這樣程式就自動進行3個平行作業任務了。





參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。





網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年7月6日 星期四

透過 Delegate 委託支援的方法,撰寫非同步任務(軟體開發、客製化軟體、系統設計)

      此篇文章主要是延續之前的文章 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 透過 Delegate 委託支援的方法,撰寫非同步任務,這裡一樣我會透過簡單程式碼進行實作教學。

       在.Net 平台的委派類型(Delegate)自身就可以很容易地使用非同步作業,因為只要是委派(Delegate)類型都一點有 BeginInvoke 以及對應的 EndInvoke() 這 2 個非同步操作方法,所以我們就可以非常容易地透過 委派實體 直接 使用非同步任務。
      在這邊我一樣使用 Windows Form 來做示範(因為比較單純可以講解程式技巧,所以不要問我為何不用 ASP.NET MVC),整個實作範例畫面為如下圖:


繪圖



步驟1 :
在 Visual Studio 新增一個 Windows Form 專案,我們準備拖拉幾個控制箱來達成 主要結果畫面,分別有
Label 控制箱 (Text = 基數)、Button 按鈕控制箱(Text = 進行計算作業 , Name = btnDelegateInvoke)、ProgressBar控制箱(用於顯示非同步作業的進度)、TextBox 文字方塊(Name = txtResult , 用於顯示執行計算結果)。


步驟 2:
在 Button 控制箱 (name = btnDelegateInvoke)的 Click 事件,撰寫主要核心代碼:
private void btnDelegateInvoke_Click(object sender, EventArgs e)
{
    int baseNum = default(int);
    if (!int.TryParse(txtBaseNum.Text, out baseNum))
    {
        MessageBox.Show("請輸入一個正整數哦!");
        return;
    }


    txtResult.Clear();

    // 顯示進度表的狀態
    IProgress<int> progressReporter = new Progress<int>((p) =>
    {
        this.progressBar1.Value = p;
    });


    //  計算階乘的委派實體
    Func<int, BigInteger> ComputeNumValueAction = (bsNum) =>
        {
            BigInteger bi = new BigInteger(1);
            for (int i = 1; i <= bsNum; i++)
            {
                bi *= i; //相乘
                // 用於計算目前進度
                double ps = Convert.ToDouble(i) / Convert.ToDouble(bsNum) * 100d;
                progressReporter.Report(Convert.ToInt32(ps));
            }
            return bi;
        };


    // 開始呼叫使用
    btnDelegateInvoke.Enabled = false;
    ComputeNumValueAction.BeginInvoke(baseNum, new AsyncCallback(FinishedCallback), ComputeNumValueAction);


}



2017-07-06_01-01-56



程式碼邏輯講解:
1.在 Progress<T> 是實現 IProgress<T> 介面,所以這裡可以透過它支援的 Report()方法來報告目前非同步的操作進度數據,該對象在進度更新後,是允許使用者直接繼續操作主畫面的,例如拖拉。

2.Func<int,BigInteger> 委派,代表自身帶有一個 int 類型的參數,而返回的值類型為 BigInteger,這邊我特別用 BigInteger 類型,因為在計算階乘的計算結果,可能數字會非常大,會超出 long 類型的最大值。

3.在開始進行使用 委派(Delegate)支援的BeginInvoke方法時,必須再使用一個 AsyncCallback 委派,該委派主要是用於綁定一個方法,在檔非同步任務完成時,可以呼叫的回調方法,並且再回調方法中,再次調用 Delegate.EndInvoke方法來捕捉計算結果。

我們直接看 AsyncCallback 綁定的 FinishedCallback 方法。

private void FinishedCallback(IAsyncResult ar)
{
     // 取出委派變數
    Func<int, BigInteger> action = (Func<int, BigInteger>)ar.AsyncState;
    // 求得計算結果
    BigInteger res = action.EndInvoke(ar);
    this.BeginInvoke(new Action(() =>
     {
        btnDelegateInvoke.Enabled = true;
        // 顯示計算結果
        txtResult.Text = string.Format("計算結果:{0}", res);
     }));
}


ddd



上述程式碼撰寫完畢後,就可以編譯執行,在 基數欄位輸入一個正整數,就可以進行非同步的計算階乘作業。



參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。 
5.在非同步作業時,如何取消非同步任務。 
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。






網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
     

2017年7月3日 星期一

在 .Net 透過 Thread 類別撰寫多執行緒多工作業【軟體開發、軟件開發、客製化軟體】

     此篇文章主要是延續上一篇 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 Thread 類別,使用 C# 來撰寫多執行緒多工作業功能。
     在 .Net 平台中 Thread 類別位於 System.Threading 命名空間中,此類別封裝了多執行緒許多方法與功能,可以讓我們快速建立新的執行緒,進而在新的執行緒執行所需要的程式碼邏輯,在我們建立一個 Thread 的實例(Instance)時,需要透過一個委派(Delegate)與新建立的 Thread 實例和一個現有的方法(Method)進行綁定,當執行緒(Thread)啟動後,就會立即執行這個綁定的方法。
     傳遞給 Thead 的建構子的委派(Delegate)有 2 種,一種是不帶任何參數的委派方法;第二種是可以帶一個 object 參數的委派方法。在我們實體化 Thread 物件後,就可以開始調用 Thread.Start()方法,來啟動執行緒(也會開始執行綁定的方法),而在執行過程隨時可以調用 Thread.Abort()方法,來強制終止執行緒的執行,不過這個 Abort()方法會引發一個 ThreadStateException 例外錯誤。

     現在我就帶一個實際範例來是示範如何 用 C# 使用 Thread 類別,建立一個執行緒作業,這邊為了簡單講解觀念,我使用最簡單的 Windows Form 專案來講解。

Step 1. 透過 Visual Studio 2017(舊版本 2015/2013/2012都行啦)新增一個 Windows Form 專案
2017-07-02_23-33-29


Step 2.在 Step 1建立的 Windos  Form 專案後,會產生一個 Form1的界面表單,打開此表單,然後從工具箱拖拉一個 ProgressBar 控制箱到 Form1 畫面,並排好版面。
step2

          Step 3. 從工具箱在拖拉一個 Button 到 Form1 的畫面,並將 name 屬性命名為 btnTread , Text 修改為【Thread 執行緒 啟動】

step3



Step 4. 在 Form1.cs 後置程式碼裡,我撰寫了一個 DoWok() 方法,裡面撰寫了一下邏輯,程式碼如下:
/// <summary>
/// 此方法將會透過委派(Delegate)指定給新的執行緒(Thread)
/// </summary>
private void DoWork()
{
  int p = 0;

  while (p < 100)
  {
    p++;
    Thread.Sleep(100);

    //更新進度表
    this.BeginInvoke(new Action(() =>
    {
       this.progressBar1.Value = p;
    }));
  }

  this.BeginInvoke(new Action(delegate ()
  {
   //再次啟用按鈕狀態
   btnTreadStart.Enabled = true;
   //重設定進度表為 0 
   progressBar1.Value = 0;
   //顯示執行緒已完成
   MessageBox.Show("執行緒已完成。", "執行緒已完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }));

}
 

step4

Step 5. 在 Form1 的 Button 按鈕,雙擊滑鼠 (button1_Click),在button1_Click 事件我撰寫了 核心的 操控 Thread 程式碼
private void button1_Click(object sender, EventArgs e)
{

  //宣告一個 Thread 類別,並將在傳入 Step 4 所宣告的 DoWord 方法
  //待會 Thead 執行時,就會立即執行 DoWord 方法
  Thread newThread = new Thread(DoWork);

  //停用按鈕
  btnTreadStart.Enabled = false;

  //啟用新的執行緒
  newThread.Start();

}

step5


Step 6. Compile 編譯執行(執行F5),就可以看到結果
step 5-1


step 5-2



程式碼補充解釋:
因為基於執行緒的安全考量和包含使用者界面完整性,一般而言,系統是限制跨執行緒去更新修改使用者界面,所以在 Step 4 的 DoWokd方法,我透過呼叫 this.BeginInvoke() 方法傳遞一個 委派,使得可以在使用者界面的主執行緒上面進行更新使用者界面的控制箱(ProgressBar1),所以可以看到進度表一直不斷更新。


透過這一篇文章希望可以說明如何利用 Thread 類別來操作多執行作業,後續我還會抽出時間講解不同的非同步多工作業方式,分成不同的文章來一一描述。



參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。 
5.在非同步作業時,如何取消非同步任務。 
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen


2017年5月26日 星期五

C#多工作業與平行處理技術講解

    在現行 CPU 都是多核心的、甚至多顆 CPU 硬體條件下,在我們開發軟體撰寫程式時,就可以好好利用多工作業、平行處理、非同步模型了,所以這次我想好好介紹一下,如何在 .Net C# 平台環境下,撰寫多執行緒平行作業與非同步 程式撰寫技巧與概念。




   
     以往軟體操作使用者,在執行比較耗時的作業時,例如需要大量運算、影像處理等,系統主要使用畫面很容易出現"卡主"、"頓頓"、"當機的感覺",這個很容易造成使用者的抱怨,認為應用程式已經當機,甚至沒有耐心地到【工作管理員】來強制將應用程式關閉,但事實上這會導致造成兩個影響層面,一是,原本應用程式要執行的功能操作,沒有徹底執行完成;二是,如果應用程式一旦被強制關閉時,有可能造成資料的遺失,例如在執行會計系統轉帳功能時,如果只轉部分資料成功、或者盤點作業更新大量庫存成本與數量時,被強制關閉,這時候的資料有可能造成遺失(當然我在開發時這類型,我會用交易處理(Transaction)進行Commit與Rollback,這是另外議題,有機會再來談),所以如果我們可以在需要執行耗時的作業時,就必須考慮使用非同步作業(多工作業、平行處理)技術來撰寫程式,當將比較耗時的作業任務放到另外一個執行緒(Thread),這樣在執行複雜耗時作業時,不會影響到主要的使用者界面(因為使用者界面是另外一個獨立的執行緒),所以使用者可以繼續點選界面、用滑鼠拖移視窗表單都可以,這樣就不會出現卡卡的、要當機的假象。

    原理解釋,當一個使用者執行一個執行檔程式(.exe)時,程序指令就會自動加載到記憶體中去執行,這個就是所謂的應用程式的實例(Instance),而在操作系統中被稱為"Process 行程(大陸用語為 進程 )",Process 與 Process 互相獨立隔離,A Process 不會影響到 B Process 的執行,而每個 Process 又可以包含多個 Thread(執行緒,大陸用語為 線程)。一個 Process 都至少包含一個 Thread (執行緒/線程),主要的 Thread 我們又稱為 Main Thread (主執行緒),當主執行緒被結束終止時,Process(行程/進程)也會跟隨之被關閉,整個應用程式就會被關閉結束。


    經過我上面的解釋,希望讀者可以比較清楚 非同步作業(多工、平行處理)的好處,但是說實在我專案經歷也不淺,跟不同程式開發人員合作也非常頻繁,真正可以把多工平行處理寫得好的真的也算少數,因為本身控制非同步的邏輯思考以及資源鎖定釋放就必須深入的進行了解各種程式技術,不過身為 .Net 開發陣營的我,已經覺得非常幸福,因為 .Net 框架已經把非同步、多工作業封裝成相關類別,程式開發人員不必花太多時間去管理執行緒的底層模型,我們只有好好地學會如何使用這些類別,就可以把多執行緒多工作業寫得很好。


那麼,我想分幾篇文章來講解如何使用 .Net C# 支援的撰寫技巧來介紹,非同步作業的實作方式



以上我會另外花時間各自寫文章來敘述與實作......





網智數位-軟體開發(軟件開發) 
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna 
黃先生 Allen



    
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

2017年3月29日 星期三

徴 .Net 程式設計師數名(軟體開發、客製化軟體、軟體設計)

     因業務的增量,網智數位目前有多個自身產品在研發、也有大型銀行專案在進行,尋求數名資深的系統分析師(尤其對行業ERP 或 銀行資產管理、處分資產財務等經驗)、程式設計師。







1.鄙公司陸續手上有多個進行中的專案,需要找可長期合作的提案人,執行程式設計的設計與開發。
 
2.包含各種領域產業的公司,有製造業、電信業、半導體業,主要開發管理系統,財會系統,或是各項作業流程系統等。
 
3.提案人需有各領域作業的知識,有相關產業經驗佳,才能開發出符合產業需求的系統
 
4.開發工具不拘,以.NET C#為佳,資料庫包括MS-SQL,MY-SL,Oracle等皆可,部分系統可能需要建置類似ERP的規模

5.因案件很多,各案件規格需要與發案方討論,並個別報價
 
6.需有獨立完成一個 WEB(ASP.NET MVC)或 Windows Desktop APP(Windows Form or WPF) 專案經驗過。


PS.如果你是厲害的SOHO族想要長期配合專案,我們也非常歡迎,目前今年快速發展,在商業軟體與工業應用軟體,在空調大廠、機電大廠、馬達承軸器、土地銀行 等產業目前領導廠商都是我們的客戶哦,因為客戶的信賴,給我們團隊不斷的前進...


網智數位科技公司在IT領域已有10年多經驗,在團隊合作下陸續完成許許多多的軟體開發承包、網路架設委外案、系統維護案,也正式跟大型軟體公司、玩具製造業、飾品製造業、知名衛浴公司、窗簾材料業、空調冷氣設備大廠、貿易公司、前進國際、大型上市成衣製造業、連鎖動物醫院、網拍零售業等正式長期合作,開發一系列的不同產業的進銷存系統、圖控軟體、監控軟體、紅外線檢測趨勢圖像報告、獎金計算系統、物流配送、客戶關係(CRM)管理系統、請假出缺勤管理系統、企業資源管理(ERP)系統、電子商務(EC)等,接下來我們將更積極努力的完成客戶的要求與完善的服務,希望如果您有軟體委外、客製,IT建置的需求、網路行銷等,我們將有一套完整的服務模式。


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen


2017年3月12日 星期日

網智數位與群環科技正式合作成為 微軟 Azure 雲端解決方案經銷商

        今年網智數位與群環科技正式簽約合作,網智數位也將正式成為雲端平台 Azure 經銷商與解決方案提供者,未來網智數位的客戶,可以透過我們採取微軟的雲端平台,而我們將可以提供良好的技術服務、更好的軟體開發品質,讓軟體使用更加便利性、跨越裝置、區域性地限制性。




下載




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

跨平台解決方案優缺點細說(軟體開發、軟件開發、客製化軟體)

       在現在智慧型裝置、平板裝置大量普偏化,從企業到個人甚至在企業內部團隊開發者的支持與合作之  下不斷推出大量新型移動應用。面對如此龐大的應用生態圈,認真規劃並調整戰略性技術決策無疑有助於確保應用的成功發布並獲得良好的市場反響。而在實際構建相關平台之前用戶界面(簡稱UI)、用戶體驗(簡稱UX)以及必要功能自然是首先需要明確的要素。而後,則應考慮如何採取適當舉措以推動開發流程。 

      
IC764638

       事實上,單純是原生抑或跨平台這一決策已經能夠帶來諸多後續影響。應用開發所選擇的首要平台及編程語言在產品對用戶的直觀性以及受眾類型方面發揮著巨大作用。例如,您的應用是否只能在Android或者iOS中的一類設備上使用?原生抑或跨平台這一決策最終取決於您的實際業務目標,且其各自都有著自己的優勢與缺點。

原生應用
原生應用採用面向特定平台的編程語言構建。在Android方面,其為Java; 在Windows上則為C#、VB .NET或者C/C++; iOS平台則為Objective-C或Swift。這些應用需要從零開始進行構建,且僅能夠在指定平台上運行。


優勢
用戶界面 (UI) – 應用的外觀以及整體使用方式能夠決定其最終成功與否。由於原生應用能夠與其創建平台無縫對接,因此用戶能夠使用其更為熟悉的界面。這有助於帶來更為積極的用戶體驗,並鼓勵用戶長期使用。
性能(UX) – 原生應用開發中往往涉及大量媒體(例如圖像、視頻或動畫)資源,因此需要進行大量交互與數據處理操作。在這方面,原生應用表現更好,因為其原生代碼能夠直接調用操作系統的獨特硬件與軟件功能,且幾乎不存在任何滯後現象。另外,使用本機代碼開發複雜應用能夠最大程度降低應用卡頓或者崩潰風險。
更佳排位–原生應用通常在用戶中口碑更佳,且能夠在應用商店中得到大力推薦。另外,原生應用也能夠憑藉著出色的性能與用戶友好型界面得到受眾的高度認同。
平台集成–原生應用往往能夠在指定平台上順暢運行,這意味著其功能可以根據用戶偏好進行自定義,並讓用戶擁有將其作為自身移動設備之上固有組成部分的感覺。


缺點
耗時– 面向多種平台開發原生應用往往更為耗時,因為同樣的代碼無法直接運行在其它平台之上,這意味著開發者需要耗費額外時間進行代碼轉換甚至重寫。
對開發技能要求更高–欲面向多種平台開發原生應用,企業需要擁有更多技能水平更高的開發者。取決於您所選定的平台類型,跨平台原生應用開發至少需要兩名開發者——其一負責進行Android版本開發,其二負責iOS版本開發。
高成本 – 開發者數量的增加意味著開發成本也將快速提升。再加上更為漫長的項目開發流程,企業可能需要將整體預算翻倍甚至再次翻倍。


跨平台
跨平台應用所使用的代碼可根據具體操作系統進行定制,而後再行發布。這種多合一式解決方案能夠讓單一應用運行在多種平台之上,因此受到廣大關注時間與成本的企業與開發者的熱烈歡迎。


優勢
節約時間–與原生應用不同,跨平台應用開發可採用單一代碼庫面向多種系統平台,從而幫助企業節約由代碼重寫及平台定制所帶來的時間消耗。
成本低廉–企業能夠有效削減開發項目的人員數量與成本水平。這種“一次編寫,隨處運行”的代碼能夠顯著提升開發效率並加快部署速度。
利潤最大化–除了節約成本外,跨平台應用還能夠同時在多種平台及用戶市場上取得影響力,最終實現利潤最大化。
螝於啟動及更新–企業可以首先啟動應用,並隨後根據需要面向多套平台同步推出更新。

缺點
性能延遲 - 跨平台應用往往無法像原生應用那樣與運行平台無縫對接。因此,此類應用通常會因代碼不能同設備硬件或軟件功能順暢協作而引發卡頓或者延遲。
以特性換通用 – 由於共享同一套代碼庫,因此跨平台應用無法完美與當前平台相集成,這意味著用戶往往不能充分利用平台內的某些功能,例如預設手勢、攝像頭甚至麥克風。

PhoneGap
PhoneGap,亦被稱為Apache Cordova,是一款高人氣開源平台,可用於創建跨平台/混合應用。其採用JS、HTML 5以及CSS 3編程語言。

優勢
編程語言熟知度高 – 由於PhoneGap採用JS、HTML 5與CSS 3等高人氣語言,因此開發者能夠輕鬆上手並開始使用。這不僅能夠減少相關培訓需求,同時也使得企業能夠更快向市場推出應用開發成果。
易在應用商店中被發現 – PhoneGap應用的安裝方式與原生應用類似,因此能夠在應用商店中獲得理想的曝光度。
插件架構– PhoneGap採用一套靈活的插件架構,能夠以模塊化方式擴展原生設備API。
無許可成本– PhoneGap是一套開源項目且可免費使用,因此企業無需承擔任何許可成本。
提供大量庫–開發者能夠輕鬆訪問並尋求各類資源庫的幫助,從而增強自有應用功能。


缺點
性能 – PhoneGap應用的性能表現常常受到批評。一旦應用架構中存在大量圖形或者復雜元素,則可能導致應用無響應甚至崩潰。
插件 – 在多數情況下,開發者必須使用特定插件以避免對其原生指定屬性產生干擾。 PhoneGap擁有一套靈活的插件友好型架構,開發者能夠根據需要選擇必要插件或者自行開發插件。然而,如果開發者無法找到適用的插件或者無法輕鬆編寫自有插件,則開發過程將遭遇嚴重延後。
缺少說明文檔– PhoneGap的用戶指南含糊不清且與用戶界面有關的指導性文件缺少部分關鍵性信息。另外,其中尚不提供可用於強化跨平台應用開發的最佳實踐信息。
內存丟失 - 由於PhoneGap缺少緩存/內存管理功能,因此經常出現內存丟失問題。


Titanium
Appcelerator Titanium是一套可用於開發桌面、原生移動以及跨平台應用的開源開發平台。目前市面上已經有超過3萬5千款利用JS、HTML 5、jQuery以及CSS 3等語言在Titanium中開發完成。


優勢
編程語言熟知度高 – Titanium採用JS、HTML 5與CSS 3等高人氣語言,因此開發者能夠輕鬆上手並開始使用。
可訪問各先進功能 – Titanium擁有獨立的API以訪問設備上的各項功能,包括攝像頭、麥克風、觸控屏幕以及GPS。這意味著用戶能夠將Titanium應用作為其設備中的固有組成部分並獲得良好的使用體驗。
即時反饋 – Titanium能夠縮短應用開發時間,允許開發者以更少代碼進行應用構建。這意味著開發者能夠快速構建應用原型設計,並根據即時反饋評估用戶與UI間的交互方式與效果。
龐大的技術社區 – Titanium/Appcelerator社區擁有超過20萬名開發者,並開放對其Open Mobile Marketplace的訪問。開發者能夠在這裡購買、出售及共享各類模塊、模板、設計元素以及面向Web服務的擴展。


缺點
複雜性更高– 應用複雜性的提升亦會引發成本增長。開發者在遭遇大量崩潰及bug等問題時往往需要投入更多時間與精力加以調試,這在無形中拉高了代碼組織與多平台支持維護的成本。
靈活性有限 – 儘管Titanium的API對代碼行數要求更低,因此能夠幫助開發者節約時間,但這種限制亦會導致應用複雜性上升的問題。另外,其還有可能引發應用中的延遲及其它持續性問題。
功能不穩定 – Appcelerator提供StoreKit模塊,旨在實現指向蘋果App Store的應用內購機制。然而這一功能非常不穩定,且有時無法正常起效。該模塊的部分功能極大影響了Titanium的免費增值定價策略。事實上,這款免費下載的軟件運行狀態極差,且根本無法實現有效的內購效果。而這種不穩定性甚至導致部分用戶徹底放棄相關應用。
工具包故障 – 可能很多開發者都有同感,即自從Titanium Studio(一套基於Eclipse的IDE)出現後,Titanium的學習成本開始大幅增加。 Titanium Studio存在諸多問題,最嚴重的就是會在構建過程中忽略部分變更。這迫使開發者必須在每次更改後進行項目清理,或者使用新項目進行完全重新啟動。


Xamarin
自2011年發布以來,這款知名框架就被廣泛應用於跨平台應用開發。通過API,Xamarin應用能夠以原生方式同iOS、Android以及Windows等設備上的攝像頭、GPS等功能進行通信。

優勢
一套代碼玩轉全部平台 – Xamarin採用C#與.NET框架相結合的方式,確保應用能夠在多平台上正常運行。這意味著開發者能夠復用大部分源代碼以加快開發流程。 Xamarin還能夠與Visual Studio及Xamarin IDE協作,開發者無需在不同開發環境間往來切換。
模擬原生 – 由Xamarin開發而成的跨平台應用在理論上可以被劃歸原生應用,因為其性能指標高度類似於針對單一平台的原生應用。另外,Xamarin應用亦可在應用商店中享受到原生應用的待遇。
原生UX – Xamarin允許用戶面向各平台定制其UI。通過使用Xamarin.Forms工具,開發者能夠構建跨平台應用並為其配備有針對性的UI組件。為了實現更理想的性能表現,開發者還可以使用Xamarin.iOS或Xamarin.Android工具開發具備原生使用體驗的高速、可靠跨平台應用。
功能 – 利用Xamarin,所有硬件兼容性問題都將不復存在。 Xamarin允許開發者訪問多種平台指定型API,並能夠接入原生庫以無縫實現多設備平台跨越,且舉帶來任何功能或者性能問題。
無需昂貴的許可成本 – 在微軟於2016年年中收購Xamarin之前,Xamarin的許可費用高達每開發者、每平台1000美元。這意味極小的開發者團隊即會給企業帶來高昂的許可成本。然而自收購之後,微軟開始免費將Xamarin提供給Visual Studio用戶,且目前亦在將其打造為真正的開源平台。

缺點
社區規模較小 – Xamarin在過去幾年中的發展速度比較穩​​定,且大多數追隨者來自微軟。由於社區規模較小,因此尋找有經驗的Xamarin開發者可能並不輕鬆。
需要更為廣泛的技能儲備 – Xamarin廣泛使用.NET開源資源及其它開源技術,因此希望使用Xamarin的朋友需要熟練掌握.NET,同時具備JS或者Objective-C等其它特定平台的專業知識。
應用體積 – Xamarin需要大量操作性軟件以實現.NET框架與平台特定操作系統間的代碼與引用鏈接,這意味著其應用的體積相對更大。

原文标题:Native vs Cross-Platform App Development: Pros and Cons of PhoneGap, Titanium, and Xamarin
原文作者:Prem Khatri、51CTO

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年2月7日 星期二

微軟可能推出 Win10雲端版系統 (軟體開發、軟體客制化、ERP 軟體)

      微軟正在開發新的Windows 10雲端版,有望成為該公司針對Chromebook發起的最新挑戰,而這款系統的最新版本已經在網上洩露。

Cfem-fyafqxp5657404

據多家媒體報導,Windows 10雲端版是一款輕系統,可能是針對微軟的ARM戰略設計的。一個 Twitter用戶在網上披露了Windows 10雲端版的ISO鏡像文件,甚至可以直接下載安裝。但業內人士推薦在虛擬機上安裝這款系統。


與之前的報導相同,Windows 10雲端版只允許用戶運行通過Windows Store購買的UWP應用,如果安裝其他應用則會顯示“不適配該系統”的提示信息。另外,系統對話框還會提醒用戶,“該版本希望保護您及您的設備,而且只能運行Windows Store應用。”

但值得注意的是,用戶可以從Windows Store下載部分Win32應用。這些Win32應用是通過微軟自己的桌面應用轉化器進駐Windows Store的,因此雖然可以通過Windows Store下載,但卻無法真正安裝在Windows 10雲端版上。

由於這只是早期版本的Windows 10雲端版,所以現在還不能完全確定微軟不允許用戶運行通過Windows Store下載的Win32應用。微軟有可能會在不遠的將來支持這項功能。

業內人士認為,Windows 10雲端版繼承了Windows RT的“遺志”,後者因為Windows Store的應用數量較少而未能取得成功。然而,從Windows Store和UWP應用的現狀來看,目前似乎與之前並無太​​大不同,很多用戶仍然非常依賴經典的Win32應用。

Windows 10雲端版可能幫助微軟與穀歌Chromebook直接競爭,通過廉價Windows 10設備提供一流的性能和順暢的用戶體驗。

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年1月22日 星期日

ERP 各種計劃階段的差異

      這一個月去一家經營40幾年的代工廠,委託我們協助分析他們現行 ERP系統,很多庫存數量都一直無法精確,當然這邊所謂的精確,不完全是軟體系統庫存數字的正確,或進行盤盈盤虧進行調整數字動作,而是他們想要一個方式可以進行一個針對各種產品品項設定一個好的庫存量控制,我就詢問他們如何定義跟衡量一個產品、零件、材料的庫存數字(安全庫存、現有庫存量),我發現真的很多企業主管、工廠倉庫管理人員、採購人員大多數針對庫存量的控管都是只有幾個原則,一、庫存量越低現金流動率越高。二、針對常用物品、通用零材料設定安全庫存數字。





    上述二大原則方向,一定正確無誤,但我會幾乎都會接著直接問客戶,那麼安全庫存您怎麼決定【數字 (QTY)】,我相信大多數都是說經驗法則,訂單銷售量、生產領料過程的用料量、耗損量等考慮因素,不過我幾乎都會根據實際情況、產業特性、企業流程各種因素給予調整建議,這也是很多客戶委託我們量身定做開發最具有價值的一環,絕對不是只有一個軟體使用,我們是整個進行流程討論,在討論過程我們會把相關產業的做法提出來,雙方共同腦力激蕩,因為客戶的流程與瓶頸客戶最知道,但往往發覺跟我們討論完,才發覺有許多創新變革的流程管理可以導入。 
    在這篇分享文,我要特別提出一些對於庫存管理的實施做法(針對加工業、代工廠,單純的買賣業就不需要如此做法),在一個比較複雜的生產過程中,每個產品會經過一連串的製程(或稱工序),而庫存量不是只有針對最終完成品(產品)來控管,必須在各個環節都需進行設定控管基準線,在針對各個工序間我們也必須認真看待每一道工序完成後移交到下一個工序之前的轉移、未轉移的數量,也成為半成品,這些在一個好的管理軟體系統,必須有個工序對應的物料編碼(跟產品編碼是有所區隔),而針對工序角度思考的庫存控管,我們在此可以稱為【流動庫存(Flow)】, 其他的庫存控管稱之為【常備庫存(Stock)】,另外再針對這2種性質的庫存觀念又可以再次各自分類為 【計劃庫存】、【調整庫存】、【偶發庫存】。

    這樣解釋或許大家很難懂,我整理一下表格
計劃庫存 調整庫存 偶發庫存
常備庫存 (1)
以生產目標的庫存控制、季節性的庫存量控管、定期維修措施應變等
(3)
所有品項的安全庫存、JIT看板方式中的加工品
(5)
因疏忽導致過度生產的庫存量、或按生產訂單如期製作,但訂單忽然取消,造成的庫存量增加。
流動庫存 (2)
就是所謂的【帳齡庫存】
(4)
在工序之前進行緩衝調整庫存量、運輸過程的庫存量等。
(6)
工序之間生產速度不一致、或者調度部順利,造成某個工序的半成品特別異常。

(1)計劃常備庫存:
       它是一種依據“生產目標”為目的的庫存控制觀念,非常適合用於按照標準量劃分的產品,維持其庫存水平的情況,以及我們常發生的季節性庫存也是屬於這種類型,因為有些產業受到季節性等因素影響,月生產量非常不平均的行業我相信也是非常多,而這些行業的工廠設備普遍來說,都不具備可以在高峰季節(旺季)有相對應的生產能力,所以我們必須在這些行業中,積極主動地在需求量較少的淡季,生產較多的產品進行庫存,來因應旺季的到來。
      在該庫存量的制定方式,主要是根據一整年的宏觀需求預測為基礎來進行,這個軟體系統就必須根據多年來的歷史訂單、或者市場調查進行預測分析。

(2)計劃流動庫存
        存貨帳齡(帳齡庫存)就是典型屬於這一類,這也是產品工程設計中,都必須提前準備的庫存量。

(3)調整常備庫存
        這就是我們一直常聽到的JIT看板方式中的加工數量控制、或者大家最知道的【安全庫存量】設定,它是一種用於應對需求方的緊急變動,或為吸收生產作業線因為供應方問題導致供應數量的瓶頸,主動安全防範的庫存量。

(4)調整流動庫存
      這類型就是在工序與工序間,在加工製造過程中用於緩衝調整加工品的數量、或者運輸過程中的庫存量,都歸於這個類型。
     以及我要而外一提,常常因為原物料供應商和工廠製造商因為在“批量”的不一致,例如生產時採用件數為單位,而供應商發貨包裝是採用貨板單位,在這種狀況下,產品到了裝滿1貨板就需要臨時保管;相反來看就是,購買原物料時採用貨板單位,而供應商發貨是採用件數單位,這樣同樣都需要等到填補批量差異的調整庫存。

(5)偶發常備庫存
       就是因疏忽導致過度生產的庫存量、或按生產訂單如期製作,但訂單忽然取消,造成的庫存量增加。

(6)偶發流動庫存
     工序之間生產速度不一致、或者調度部順利,造成某個工序的半成品特別異常。
     也因為調度的不順暢、先前作業完成之後,需要接續的工序作業無法繼續進行生產,也是屬於這類性庫存定義。

  而我特別整理上述這些庫存管理的範疇,在好的一個軟體管理系統(ERP、MRP、進銷存、POS系統、MES等),都應該在某個功能進行輔助,例如(1)計劃常備庫存和 (3)調整常備庫存,就是常看到的設定品項安全庫存量、根據訂單跑出生產計劃需求量,這個我建議可以參考我其他寫的文章,當然如果您有任何問題,也跟歡迎聯繫我們,任何問題我們都可以提出一些看法,也針對客戶產業流程特性進行專業的系統分析。



(其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870 

公司電話:02-55991310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen



2016年12月27日 星期二

長榮航空 - 指定培訓課程廠商(軟體開發、教育訓練、程式設計)


      很榮幸,12月正式被長榮航空-資訊單位 委託安排一系列程式語言教育訓練課程,進行實務上的程式開發分享、技術課堂講解。

images




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2016年12月4日 星期日

微軟- 物聯網 Internet of Things , 成功企業案例的影片(軟體開發、客製化軟體、客製化設計)

微軟在雲端、物聯網、大數據分析在企業運用方面成功案例非常多,今天看到一個微軟的好的企業運用成功案例分享影片,真的講解的非常清楚,各位可以看一看


影片介紹
https://channel9.msdn.com/Series/Rolls-Royce/Solution 



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2016年11月11日 星期五

繪圖程式-折線圖、區域圖 實作一(軟體設計、軟體開發、程式開發)

        這半年來一直不斷被客戶要求開發相關繪圖功能的程式,礙於現在很多程式開發人員,已經越來越多人只會資料庫的CRUD,對於繪圖程式撰寫掌握度不是很好,甚至基本觀念也沒有,所以大多數程式開發人員都是去找相關的Chart套件,也很少有人示範在 Windows 10 APP 如何開發相關繪圖程式功能(很抱歉目前Windows 10 似乎沒有提供相關繪圖控制箱可以直接使用,所以要真的自己寫繪圖功能),所以我這篇就來教導如何在 Windows Universal APP 開發一個 折線圖功能,折線圖在軟體應用上面常用於股票分析、統計分析、銷售分析、趨勢走向等圖表展現。

(折線圖)
r-data-exploration-and-visualization-line-plot-1


(區域圖)
886d1a27-3744-417b-a3e5-e9b9878e5760



折線圖原理其實就是在一個二維的空間(平面)中,利用多個 【X,Y】坐標點透過直線連結起來,所形成的趨勢圖形,通常 X 軸代表一個某種類別例如月份、年份、型別等,而Y軸代表某類別的實際值,例如業績、銷售量、收入、人數等。在折線圖中,X軸都呈現等量(距)的增加。
現在我們知道了簡單的折線圖原理後,在Windows 10 (UWP)平台開發上,是必須使用 Polyline 繪圖技術來進行開發,可以在界面直接選告 XAML 語法,例如底下Code:

<Polyline Stroke=“Blue” StrokThickness="3”Points=”5,10 20,30 25,40 100,120”/>

其中最重要的來自于 Points 屬性 ,5,10 =》代表一個點 [5,10] =>X=5,Y=10
但通常在開發繪圖功能時,都是動態繪圖產生,所以在這邊我也示範如何完全在背後使用程式開發一個折線圖功能,我在界面上我簡單的設計2個按鈕,分別作為繪製 折線圖跟區域圖,前端界面如下

image


//XAML Code
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="Auto"/>

        </Grid.RowDefinitions>
        <StackPanel  Grid.Row="0" Orientation="Horizontal">
            <Button Content="折線圖繪製" Click="DrawChart_1" Margin="12" Background="AliceBlue"></Button>
            <Button Content="區域圖繪製" Click="DrawChart_2" Margin="12" Background="Wheat"></Button>
        </StackPanel>
        <Grid x:Name="gdChartCanvas" Grid.Row="1" Height="auto" HorizontalAlignment="Center" VerticalAlignment="Center">

        </Grid>
</Grid>



在後端的程式碼,分別設計了 GetAllPoints()方法、與對應的 DrawChart_1 、DrawChart_2 事件方法

       /// <summary>
       /// 取得所有折線圖、區域圖的 Y值清單
       /// </summary>
       /// <param name="yValues">Y值清單</param>
       /// <param name="perWidth">X等距寬度</param>
       /// <param name="yStartValue">Y起始值</param>
       /// <returns></returns>
       private PointCollection GetAllPoints(List<double> yValues, double perWidth, double yStartValue)
       {
           PointCollection points = new PointCollection();
           double x = 0;

           foreach (double yVal in yValues)
           {
               double y;

               //判斷 Y 值是否小於 Y坐標起始值,因為畫布是從 100 開始
               if (yVal < yStartValue)
               {
                   y = 100;
               }
               else
               {
                   //可以套用自己的公式來設定Y值
                   //y = Math.Floor((500 - (yVal * 200) / 300));
                   y = yVal;
               }

               Point point = new Point(x, y);
               points.Add(point);
               x += perWidth;
           }

           return points;
       }


      /// <summary>
      /// 繪製折線圖
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void DrawChart_1(object sender, RoutedEventArgs e)
      {
          //清除畫布
          this.gdChartCanvas.Children.Clear();

          //Y值清單
          List<double> datas = new List<double> { 185, 130, 230, 140, 200, 60, 170, 150, 190, 150, 110, 220, 130, 190, 150 };

          //取得套用公式的Y轉變值
          PointCollection pointCollection = GetAllPoints(datas, 45, 100);

          Polyline polyline = new Polyline { Points = pointCollection, Stroke = new SolidColorBrush(Colors.Red) };
          this.gdChartCanvas.Children.Add(polyline);
      }




上述程式撰寫完畢後,就可以直接點選【折線圖繪製】按鈕,畫面馬上呈現折線圖,如下執行結果

image
image







網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen






2016年11月6日 星期日

Windows 10 UWP 存取 JSON 格式 - 程式實作講解(軟體開發、客製化軟體、程式設計、程式開發)

      在我們開發各種專案時,一定多少都會需要存取各種跨平台傳輸的資料,目前最普遍的傳輸格式為 XML 與 JSON , 而今天我想要深入講解在 Windows 10 Universal APP (UWP)平台下,如何讀取跟儲存 JSON 格式資料。

      images


    JSON 的全名為 Java Script Object Notation , 它是一種輕量級的資料傳輸交換格式語言,特點是容易閱讀、依字串為基礎,格式都是經過壓縮地所以在網路傳輸過程,佔用的頻寬極小,因此被廣泛地應用在跨平台、跨程式語言。
JSON 的格式在宣告一個類別/物件,是用 大括號 { };宣告一個陣列使用 中括號 [ ] ;而在大括號裡面,是使用 名稱 :值 ,下圖是官方的範例圖解釋
1356331778-696014507


例如 我在此 有個 員工類別 ,分別屬性有員工編號、姓名、職位、學歷,則對應的 JSON 格式為 
(JSON Code)
var empJsonObj = { “員工編號”:“emp001”, “姓名”: “台灣李奧納多,”“職位”: “技術總監”,"年齡”:33 } ;

接下來,就是要開始講解如何在 Windows 10 Universal APP (UWP)平台,存取 JSON 格式的支援與程式開發技巧。
在 Windows 10 UWP 平台,主要有 2 種技巧來存取 JSON 格式,第一種是使用 DataContractJsonSerializer (MSDN 介紹),透過 DataContractJsonSerializer 來對 JSON 數據進行序列化與反系列化動作 ;而第二種是使用 JsonObject 類別來自行定義 JSON 物件。這兩種方式我都會在這篇完整介紹。


1.透過 DataContractJsonSerializer 對 JSON 資料進行序列化與反序列化
      使用 DataContractJsonSerializer 類別來對 JSON 數據進行序列化與反序列化,這是最簡單的方式,所謂序列化過程就是把 實體類別物件 轉成 JSON 格式化的字串,反之 反序列化 過程,就是把 JSON 物件字串({ 名稱:值,名稱1:值1….}) 轉換成對應的 .NET 類別。

下圖,是實際程式範例
image


image



2.透過使用 JsonObject 類別來自行定義 JSON 物件
這個就讓我直接用實際程式碼來講解….
首先我先新增2個類別 ,分別為 員工類別 (Employee)和研發群組類別(RDGroup),在此我假設一個員工可以同時歸屬多於于一個研發群組以上。

底下為 員工類別程式碼:

   /// <summary>
   /// 員工類別
   /// </summary>
   public class Employee
   {
       private const string idKey = "id";
       private const string nameKey = "name";
       private const string rdKey = "rd";
       private const string ageKey = "age";
       private const string enableKey = "enable";

       public Employee()
       {
           Id = "";
           Name = "";
           RDGroups = new ObservableCollection<RDGroup>();
       }

       public Employee(string jsonString) : this()
       {
           JsonObject jsonObject = JsonObject.Parse(jsonString);
           Id = jsonObject.GetNamedString(idKey, "");
           Name = jsonObject.GetNamedString(nameKey, "");
           Age = jsonObject.GetNamedNumber(ageKey, 0);
           Enable = jsonObject.GetNamedBoolean(enableKey, false);

           foreach (IJsonValue jsonValue in jsonObject.GetNamedArray(rdKey, new JsonArray()))
           {
               if (jsonValue.ValueType == JsonValueType.Object)
               {
                   RDGroups.Add(new RDGroup(jsonValue.GetObject()));
               }
           }
       }
       public string Stringify()
       {
           JsonArray jsonArray = new JsonArray();
           foreach (RDGroup group in RDGroups)
           {
               jsonArray.Add(group.ToJsonObject());
           }

           JsonObject jsonObject = new JsonObject();
           jsonObject[idKey] = JsonValue.CreateStringValue(Id);
           jsonObject[nameKey] = JsonValue.CreateStringValue(Name);
           jsonObject[rdKey] = jsonArray;
           jsonObject[ageKey] = JsonValue.CreateNumberValue(Age);
           jsonObject[enableKey] = JsonValue.CreateBooleanValue(Enable);

           return jsonObject.Stringify();
       }

       public string Id { get; set; }
       public string Name { get; set; }
       public ObservableCollection<RDGroup> RDGroups { get; set; }
       public double Age { get; set; }
       public bool Enable { get; set; }

   }

底下為 研發群組類別(RDGroup)程式碼:

  /// <summary>
  /// 研發群組 類別,一個員工可以歸屬多個研發群組
  /// </summary>
  public class RDGroup
  {
      private const string idKey = "id";
      private const string rdKey = "rd";
      private const string nameKey = "name";

      public RDGroup()
      {
          Id = "";
          Name = "";
      }

      public RDGroup(JsonObject jsonObject)
      {
          JsonObject schoolObject = jsonObject.GetNamedObject(rdKey, null);
          if (schoolObject != null)
          {
              Id = schoolObject.GetNamedString(idKey, "");
              Name = schoolObject.GetNamedString(nameKey, "");
          }
      }

      public JsonObject ToJsonObject()
      {
          JsonObject schoolObject = new JsonObject();
          schoolObject.SetNamedValue(idKey, JsonValue.CreateStringValue(Id));
          schoolObject.SetNamedValue(nameKey, JsonValue.CreateStringValue(Name));

          JsonObject jsonObject = new JsonObject();
          jsonObject.SetNamedValue(rdKey, schoolObject);
          return jsonObject;
      }

      public string Id { get; set; }
      public string Name { get; set; }
  }



再來我設計一個前端UI界面,作為讀取與寫入 JSON 的案例實作

前端界面
image



在執行存檔時,我們將新增一個 Employee 類別,並透過 JsonObject 轉成(序列化)為 JSON 字串,儲存在設定檔。
image

而在【讀取資料】時,是透過 JsonObject 進行反序列化,將 Json String 轉回成 .Net 的 Employee 類別(Class)
image



程式執行結果畫面
存檔
image


讀取資料
image






網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen