軟體開發(軟件開發)

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

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

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

商用軟體-客製化設計

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

IOT 物聯網-系統開發

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

雲端VPS虛擬主機租用

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

ERP軟體客製化導入

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

搜尋引擎最佳化SEO

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

服務宗旨

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

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

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

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

顯示具有 資訊系統 標籤的文章。 顯示所有文章
顯示具有 資訊系統 標籤的文章。 顯示所有文章

2016年7月14日 星期四

陽明大學-全球健康協會-RWD網頁設計委託案

         screencapture-file-Users-Chris-Desktop-themes-cpts_8_ec-index-html-1468421565753

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

2016年5月31日 星期二

好的管理軟體絕對可以協作企業與店家提升管理績效

        網智數位-軟體開發團隊,累積了超過10年開發中小企業的管理軟體(軟件)委外案,有超過 8 成比例都是完全從無到有,量身訂做去了解客戶的營運流程、現行文件(例如 Excel、Word、PDF)、紙上紙本,大量收集後,跟業主不斷的溝通了解,並給出適當的系統開發建議,目的就是協助客戶從繁雜的作業流程、人工作賬、紙上作業、傳真文件等,開發客戶合適的管理軟體。
image
     
       上圖就是新竹與台南某廠商客戶,因為長期以來被大量客戶的文件測試報告、檢驗報告,各種客戶所該維護的專案、委託案、以及該專案需派工的檢驗人員、檢驗統計數字、是否需要複查等各種作業模式所困擾,以往光單單人工作業、紙本查詢可能就需要花上人力成本超過5~10天,而現在經過 網智數位-軟體開發團隊,進入分析與建議並開發該作業模式的管理系統軟體(軟件),該軟體可以協助客戶,進行企業的客戶管理(CRM)、以及迅速通知那些專案目前有發生需要追蹤、系統跑出各種統計圖表、歷年的專案報告匯出和匯入,案子的各式圖片管理等,迅速達到委託我們開發軟體的客戶管理績效,所以好的軟體管理系統是可以迅速提升企業的效率與效益。


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




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

2016年5月18日 星期三

機械手臂 - 軟體開發(軟件開發)

          近來公司在中南部陸續成功洽談了幾個關於 Arduino、嵌入式工業的軟體開發合作案,幾乎都是針對生產線透過 機械手臂 的運用,來協助生產線更有效率、以及以往人工的耗時的作業模式,現階段越來越多客戶、廠商透過電腦、嵌入式系統、Arduino、樹莓機開發輔助系統….而我公司團隊也有許多非常有經驗工程師、顧問協助企業完成客製需求。







      
      下面影片為我團隊的顧問,在南港展覽館的機械手臂展示影片,如果您有任何嵌入式系統、機械手臂、Arduino的合作需求、開發需求,非常歡迎與 網智數位-軟體開發團隊,進一步聯繫…




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

2016年5月9日 星期一

十條可以提升效率的jQuery程式準則

       jQuery是開源軟體,使用MIT授權條款授權。[5] jQuery的語法設計使得許多操作變得容易,如操作文件(document)、選擇文件物件模型(DOM)元素、建立動畫效果、處理事件、以及開發Ajax程式。jQuery也提供了給開發人員在其上建立外掛模組的能力。這使開發人員可以對底層互動與動畫、高階效果和高階主題化的元件進行抽象化。模組化的方式使jQuery函式庫能夠建立功能強大的動態網頁以及網路應用程式
下載
微軟諾基亞已宣布在他們的平台上繫結jQuery。[6]微軟最初在Visual Studio中整合了jQuery[7]以便在微軟自己的ASP.NET AJAX框架和ASP.NET MVC Framework中使用,而諾基亞則在他的Web執行時元件開發平台中整合了jQuery[8]MediaWiki自從1.16版本後也開始使用jQuery[9]
jQuery 1.3版以後,引入全新的層疊樣式表(CSS)選擇器引擎Sizzle。[10] 同時不再提供Packed版本,因為解壓縮的消耗的時間,遠大於所節省的下載時間,且不利於除錯,且已有Google AJAX Libraries API等公開站台提供jQuery的js的參照服務,故Packed版本原本的優點已蕩然無存。
JQuery 是繼prototype之後又一個優秀的Javascript庫,而 jQuery 它是輕量級的js庫,它兼容CSS3,還兼容各種瀏覽器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及後續版本將不再支持IE6/7 /8瀏覽器。 jQuery使用者可以更方便地進行處理HTML(標准通用標記語言下的一個應用)、events、實現動畫效果,並且方便地為網站提供AJAX交互。 jQuery還有一個比較大的優勢是,它的文檔說明很全,而且各種應用也說得很詳細,同時還有許多成熟的插件可供選擇。 jQuery能夠使用戶的html頁面保持代碼和html內容分離,也就是說,不用再在html裡面插入一堆js來調用命令了,只需要定義id即可。
以下十項jQuery範例可以有效幫助大家的Web設計項目順利實現效率提升。
(一)檢測 IE 瀏覽器(Browser)

在進行CSS設計時,IE瀏覽器對開發者及設計師而言無疑是個麻煩。儘管IE6的黑暗時代已經過去,IE瀏覽器家族的人氣亦在不斷下滑,但我們仍然有必要對其進行檢測。當然,以下片段亦可用於檢測其它瀏覽器。

640
(二)平滑滾動至頁面頂部
以下是jQuery最為常見的一種實現效果:點擊一條鏈接以平滑滾動至頁面頂部。雖然沒什麼新鮮感可言,但每位開發者幾乎都用得上。

640
(三)保持始終處於頂部
以下程式碼例子是用來允許某一元素始終處於頁面頂部。可以想的到,其非常適合處理導航功能表、工具欄或者其它重要訊息。

640-2

(四)替換 HTML Element  標籤 Tag
jQuery能夠非常輕鬆地實現html標籤替換,而這也將為我們帶來更多新的可能。
640-3


(五)檢測屏幕寬度
現在移動設備的人氣幾乎已經超過了傳統電腦設備,因此對小型屏幕的尺寸進行檢測就變得非常重要。幸運的是,我們可以利用jQuery輕鬆實現這項功能。




640-4
(六)自動修復損壞圖片
如果大家的站點非常龐大而且已經上線數年,那麼其中或多或少會出現圖片損壞的情況。這項功能可以檢測損壞圖片並根據我們的選擇加以替換。
640-5


(七)檢測複製、貼上與剪下的鍵盤操作
利用jQuery,大家可以非常輕鬆地檢測到選定元素的複製、貼上與剪下的鍵盤操作。
640-6


(八)自動為外部超鏈結增加 Target=“blank” 的屬性
在鏈接至外部站點時,大家可能希望使用target="blank"屬性以確保在新的選項卡中打開頁面。問題在於,target="blank"屬性並未經過W3C認證。 jQuery能夠幫上大忙:以下片段能夠檢測當前鏈接是否指向外部,如果是則自動為其添加target="blank"屬性。
640-7


(九)懸停時淡入/淡出
又是另一項“經典”效果,大家可以利用以下片段隨時加以運用。
640-7



(十)停用文字框/密碼輸入中的空格



無論是電子郵件、用戶名還是密碼,很多常見字段都不需要使用空格。以下代碼能夠輕鬆禁用選定輸入內容中的全部空格。
640-8

參考原文網址:http://www.catswhocode.com/blog/10-jquery-snippets-for-efficient-web-development
 


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

2016年4月27日 星期三

優秀聰明的程式設計師必備的 5 種條件

       作為一個軟體開發人員在任何專案開發的系統架構與設計上起著非常關鍵的作用,而目前當前的現代化架構的開發趨勢下是需要更聰明、更有智慧的開發人員,這些開發人員具備了各種務實的技術能力。
下載
那麼究竟我們該如何定義這些聰明、有智慧的程式開發者呢?可以歸納有這樣 5 個主要關鍵因素:

1.有良好的專注力以及依目標為導向

      開始反思和規劃你的職業生涯。對你的程式碼,你比較也應該要實施如下:
保持模組化——個性化,專業化——這兩個方面都需要好好考慮,並且你的待辦事項需要定期整理。
保持清潔並遵守規則——我們需要遵循程式編碼規則以及自己制定的規則習慣,並且保持目標的乾淨和可衡量。
保持鬆耦合——不要將很多目標耦合到一起——保持簡單和靈活才能獨立地變化。
保持可衡量——保持目標基於SLA,並且每兩週/每月/每季度/每年衡量,越頻繁越好。

2.積極地推廣和行銷你的想法(Idea)

        這是最被忽略的一方面,也是最困難的一部分。你的想法需要告知他人才能被執行,而要實現這些目標,首要的是你必須將你的想法推廣和行銷給他人。
講故事是一個眾所周知的用一種每個人都可以理解的方法傳達思想的手段。
SapientNitro重新定義Storytelling到Storyscaping,這是一種新的講故事的方式,它連接了體驗(用於市場營銷)。這也可以用於普通的講故事中。

3.時時刻刻地提高工作效率

        不斷努力的思維過程以便於想出新的、好的可以改進的做事方式。一個簡單的例子就是——通過檢測早期問題,Jmeter腳本來做單位級別的性能測試和降低質量成本。
與團隊分享你的知識(博客或網絡會議的形式)。這有助於提高整個團隊的工作效率,也有機會得到別人的反饋。

4.通過學習跟上時代的腳步


通過閱讀來自於領先的高科技公司的博客(Netflix Tech Blog,Oracle OTN,AWS Blogs,IBM Emerging Tech Blog,DZone,TechGig,TechCrunch)
瀏覽高科技公司的開發者網站(如Facebook for Developers,Twitter Developers,Amazon AWS)
在問答網站提出問題(如Quora,Stackoverflow)
在MOOC網站(Coursera,Udemy等)或YouTube頻道學習
最後,通過以下關鍵技術人物/公司在社交媒體上的渠道(Twitter,LinkedIn等)。

5.必須維持好健康的頭腦、身體和心靈


這是最重要的一點,因為它能保持一個人的精氣神,確保我們有樂觀和健康的心態來應對任何挑戰,想出創新方法來做事情。
總而言之,這 5 個關鍵技能因素絕對可以協助我們在當前動態以及快速變化的資訊科技的技術中獲得更多的成功。

參考文章:5 Skills a Software Developer Should Have to Be a Smart Developer




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

2016年4月14日 星期四

Android 實作教學 - 隨機驗證碼(軟體開發)

一、問題描述
熟悉web開發中高手們都知道為了防止惡意破解、惡意提交、刷票等我們在提交表單資料時,都會使用隨機驗證碼功能。在Android應用中我們同樣需要這一功能,該如何實現呢,下面我們就自定義一個隨機驗證碼View控件實現這一需求,並且具備通用性,需要的時候在界面中直接加入這個View組件即可。

下載
二、案例介紹
案例運行效果
案例所涉及組件
1、CheckView 自定義的驗證碼控件,主要重寫onDraw方法實現圖形繪製
2、Config:用於對驗證碼控件參數的配置,像畫點點數、劃線數、背景顏色的設置
3、CheckUtil:驗證碼相關工具類,實現例如隨機的點坐標、隨機線段起始和結束點坐標、驗證碼校驗等功能
4、MainActivity:測試應用
三、功能實現
1、撰寫 Config 組件
/*** 功能:用於對驗證碼控件參數的配置
* */public class Config
{ // 驗證碼更新時間 public static final int PTEDE_TIME = 1200;
  // 點數設置 public static final int POINT_NUM = 100;
  // 線段數設置 public static final int LINE_NUM = 2;
  //設置背景顏色 public static final int COLOR=Color.BLUE; //隨機數據長度 public static int TEXT_LENGTH=4;
  //設置驗證碼字體大小 public static int TEXT_SIZE=30;
  }

2、CheckUtil組件
/*** 功能:驗證碼相關工具類
* */public class CheckUtil
{ /** * 產生隨機數字 * @return
*/ public static int [] getCheckNum()
{ int [] tempCheckNum = new int[Config.TEXT_LENGTH];
   for(int i = 0; i < Config.TEXT_LENGTH; i++)
{ tempCheckNum[i] = (int) (Math.random() * 10);
   }
  return tempCheckNum; }
/**
* 隨機產生劃線的起始點坐標和結束點坐標
* @param height 傳入CheckView的高度值
* @param width 傳入CheckView的寬度值
* @return 起始點坐標和結束點坐標
*/ public static int[] getLine(int height, int width)
{ int [] tempCheckNum = {0,0,0,0};
  for(int i = 0; i < 4; i+=2)
{ tempCheckNum[i] = (int) (Math.random() * width); tempCheckNum[i + 1] = (int) (Math.random() * height); }
return tempCheckNum; }
/**
* 隨機產生點的圓心點坐標
* @param height 傳入CheckView的高度值
* @param width 傳入CheckView的寬度值
* @return
*/ public static int[] getPoint(int height, int width)
{ int [] tempCheckNum = {0,0,0,0}; tempCheckNum[0] = (int) (Math.random() * width); tempCheckNum[1] = (int) (Math.random() * height ); return tempCheckNum; }
/**
* 驗證是否正確
* @param userCheck 用戶輸入的驗證碼
* @param checkNum 驗證控件產生的隨機數
* @return
*/ public static boolean checkNum(String userCheck, int[] checkNum){ if(userCheck.length() != 4 )
{
      return false; } String checkString = "";
  for (int i = 0; i < 4; i++)
{ checkString += checkNum[i]; }
  if(userCheck.equals(checkString))
{ return true; }
  else { return false; }
}
/**
* 計算驗證碼的繪製y點位置
* @param height 傳入CheckView的高度值
* @return
*/ public static int getPositon(int height)
{ int tempPositoin = (int) (Math.random() * height);
   if(tempPositoin < 20){ tempPositoin += 20; }
  return tempPositoin; }
}

3、自定義驗證碼控件CheckView
public class CheckView extends View
{

  Context mContext;
int [] CheckNum = null;
Paint mTempPaint = new Paint();
 
// 驗證碼
public CheckView(Context context, AttributeSet attrs)
{
super(context, attrs);
mContext = context; mTempPaint.setAntiAlias​​(true);
mTempPaint.setTextSize(Config.TEXT_SIZE);
mTempPaint.setStrokeWidth(3);
}

public void onDraw(Canvas canvas)
{
canvas.drawColor(Config.COLOR);
final int height = getHeight();

//獲得CheckView控件的高度
final int width = getWidth();
//獲得CheckView控件的寬度
int dx = 40;
for(int i = 0; i < 4; i ++)
{
//繪製驗證控件上的文本
canvas.drawText("" + CheckNum[i], dx, CheckUtil.getPositon(height), mTempPaint);
dx += width/ 5;
}

int [] line;

for(int i = 0; i < Config.LINE_NUM; i ++)
{
//劃線
line = CheckUtil.getLine(height, width);
canvas.drawLine(line[0], line[1], line[2], line[3], mTempPaint); }
 
// 繪製小圓點 int [] point; for(int i = 0; i < Config.POINT_NUM; i ++)
{
//畫點
point=CheckUtil.getPoint(height, width);
canvas.drawCircle(point[0], point[1], 1, mTempPaint);
}
}

public void setCheckNum(int [] chenckNum)
{
//設置驗證碼
CheckNum = chenckNum;
}
public int[] getCheckNum()
{
    //獲得驗證碼
    return CheckNum;
}
public void invaliChenkNum()
{
 
invalidate(); }
}


4、編寫MainActivity測試代碼
public class MainActivity extends Activity implements View.OnClickListener
{
private CheckAction mCheckView ;
private TextView mShowPassViwe;
private EditText mEditPass;
private Button mSubmit;
private Button mRef;

// 驗證碼:
private int [] checkNum =null;

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
    initView(); initCheckNum();
}

public void initView()
{
mCheckView = (CheckView) findViewById(R.id.checkView);
mShowPassViwe = (TextView) findViewById(R.id.checkpass);
mEditPass = (EditText) findViewById(R.id.checkTest);
mSubmit = (Button) findViewById(R.id.submit);
mRef = (Button) findViewById(R.id.ref);
mSubmit.setOnClickListener(this);
mRef.setOnClickListener(this);
}

// 初始化驗證碼並且刷新界面
public void initCheckNum()
{
checkNum = CheckUtil.getCheckNum();
mCheckView.setCheckNum(checkNum);
mCheckView.invaliChenkNum();
}

public void onClick(View v)
{

switch (v.getId())
{
    case R.id.submit:
    String erInput = mEditPass.getText().toString();
if(CheckUtil.checkNum(userInput, checkNum))
{
setPassString("通過");
Toast.makeText(this, "通過", 1200 ).show();
}
else
{
setPassString("未通過");
Toast.makeText(this, "未通過", 1200).show();
}
break;
case R.id.ref: initCheckNum();
break;
default: break;
}

}

public void setPassString(String passString)
{
mShowPassViwe.setText(passString);
}

}


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

2016年4月12日 星期二

.NET C# 7 語法 新特性 快速預覽 (軟體開發)

目前最新的 Visual Studio 15 發表的預覽版中,我們可以看出來,微軟決定為眾多的 .NET C# 開發人員,而新增了下列的 C# 7 語法新功能特色 。

元組值類型
.NET 提供了一個元組(Tuple)類型,但具體在 C# 中使用時卻存在著各種各樣的問題。由於元組類型是一個引用類型(Reference),而也因此在一些對於性能相當敏感的程式碼行中,開發者很可能會避免因使用它而造成 GC(Garbage Collection) 的開銷成本。同時,元組類型是不可變的,雖然這使跨線程( Thread) 共享變得更安全,但也意味著每次進行變更都必須分配一個新的對象。
下載

為了應對這一問題,C# 7 將提供一個值類型(Value)的元組。這是一個可變類型,對那些重視性能的程式碼來說,這種方式將更為高效。同時,作為值類型,它在每次進行分配時都會生成一個拷貝,因此幾乎沒有產生多線程(Multi-Thread) 問題的風險。
程式開發人員現在可以透過下列語法創建一個元組:
var result = (6, 20);
你也可以選擇對元組中的值進行命名,這一點並不是必須的,只是讓程式碼具有更好的可讀性。
var result = (count: 6 sum: 20);

你可能會想,“很棒的特性,但我自己也能寫得出來”。但下一個特性才是重頭戲。
多返回值,在類C風格的語言中,要在一個函數中返回兩個值始終是一件麻煩事。你只能選擇將結果封裝成某種結構,或是使用輸出參數。與許多函數式編程語言一樣,C#選擇了第一種方式為你提供這一特性:
(int, int) Tally (IEnumerable<int> list)

可以看到,在這裡使用泛用的元組有一個基本問題:我們將無從得知每個字段的作用。因此,C#選擇通過一個編譯器花招對結果進行命名:
(int Count, int Sum) Tally (IEnumerable<int> list)

我們在此需要強調一點:C#並沒有生成一個新的匿名類型,你所獲得的仍舊是一個元組,但編譯器將假設它的屬性為 Count 和 Sum,而不是 Item1 和 Item2。所以,以下程式碼行的作用都是等價的:

var result = Tally (list);
Console.WriteLine (result.Item1);
Console.WriteLine (result.Count);

請注意一點,我們現在還不具備多賦值語法,如果這種語法最終實現,那麼它的用法可能是這樣的:
(count, sum) = Tally (list);

除了提供簡單的功能性函數之外,多返回值的實用性還體現在非同步的程式碼的編寫上,因為在 async 函數中是不允許使用 out 參數的。
模式匹配:改進的 Switch 語法塊
VB 與函數式程序員對於 C# 抱怨得最多的一點就是 C# 中的 switch 語句功能十分有限。 VB 開發者希望能夠進行範圍匹配,而習慣了F#或 Haskell 的開發者則希望能夠使用分解式的模式匹配。 C#打算同時提供這兩種特性。

在對類型進行模式匹配時,你可以創建一個變量以保存轉型的結果。舉例來說,在對一個 System.Object 使用 switch 語句時,你可以編寫以下程式碼:
case int x:
如果該對像是數值類型,則變量x將得以賦值。否則的話,程序將按從上至下的順序檢查下一個 case 語句塊。如果你想更具體地進行匹配,還可以使用範圍檢查:
case int x when x > 0:
case int y:
在這個示例中,如果該對像是正整數,則x程式碼塊將被執行。如果對像是 0 或負整數,而y程式碼塊將被執行。
如果需要檢查 null 值,則只需使用以下語法:
case null;

模式匹配:分解
目前為止,我們僅僅展示了某種對 VB 中已有的特性所做的增量式改進,而模式匹配真正的強大之處在於分解,它可以將某個對象完全拆開,考慮一下以下語法:
if (person is Professor ​​{Subject is var s, FirstName is "Scott"})
這段程式碼完成了兩件事:
它創建了一個本地變量s,將其賦值為((Professor) person) .Subject。
它執行了一次相等性檢查 ((Professor) person) .FirstName == "Scott"。
如果將其用C# 6 程式碼改寫則是這樣:

var temp = person as Professor;
if (temp != null && temp.F​​irstName == "Scott")
{
    var s = temp.Subject

在最終發布中,我們預計能夠同時看到對 switch 語句塊的這兩種改進。
引用返回對於大數據結構進行引用傳遞比起值傳遞要快得多,因為後者需要對整個結構進行拷貝。與之類似,返回一個大數據結構的引用一樣能夠提升速度。
在類似於C這樣的語言中,可以通過指針返回某個結構的引用。這種方式會帶來一個常見的問題,即指針所指向的內存可能會因為某種原因而已經被回收了。
C#通過使用引用的方式迴避這一問題,引用本身是一個附加了規則的指針。最重要的一條規則是,你不能夠返回某個本地變量的引用。如果你嘗試這樣做,那麼該變量所引用的棧信息在函數返回時就已經變得不可訪問了。

在微軟的展示程式碼中,它所返回的引用指向一個數組中的某個結構。由於它實質上是指向數組中某個元素的指針,因此隨後可以對數組本身進行修改。舉例來說:

var x = ref FirstElement (myArray)
x = 5; //MyArray[0] now equals 5

這一語法的用例是對性能高度敏感的程式碼,在大多數應用中都無需使用這一特性。
二進製字面值(Binary Literals)
此次發布還引入了一個小特性,即二進製字面值。這一語法只是一個簡單的前綴而已,例如 5 可以表示為“0b0101”。這一特性的主要用例是設置基於 flag 的枚舉,以及創建位掩碼(bitmask),以用於與C風格語言的互操作。
本地函數
本地函數是指在另一個函數中所定義的函數。第一眼看來,本地函數似乎只是比匿名函數稍好的一種語法。但它實際上還存在幾個優點:
首先,你無需為其分配一個委託以保存該函數。這不僅減少了內存壓力,同時還允許編譯器對該函數進行內聯操作。
其次,在創建閉包時,也無需為其分配一個對象,因為它能夠直接訪問本地變量。這一點同樣能夠改善性能,因為它也減少了 GC 的壓力。
按照第二條規則推算,你將無法創建一個指向本地函數的委託。這一點對於程式碼的組織其實是一個優點,因為你無需創建獨立的函數,並且將現有函數的狀態作為顯式的參數進行傳遞。
部分類的改進
最後演示的特性是一種處理部分類的新方式。在過去,部分類的應用是基於程式碼生成優先的概念而出現的。所生成的會程式碼將包含一系列部分方法,開發者可以選擇實現這些方法,以調整類的行為。
通過新的“replace”語法,開發者就多了一種新選擇,能夠以最直接的方式編寫程式碼,隨後再引入程式碼生成器,並重寫這些方法。以下將通過一個簡單的示例表現開發者的程式碼編寫方式:
public string FirstName {get; set;}
簡單又清晰,但完全不符合 XAML 風格應用的寫法。因此,程式碼生成器將生成如下程式碼:
private string m_FirstName;
static readonly PropertyChangedEventArgs s_FirstName_EventArgs =new PropertyChangedEventArgs ("FirstName")
 
replace public string FirstName {
    get {
        return m_FirstName;
    }
    set {
        if (m_FirstName == value)
            return;
    m_FirstName = value;
    PropertyChanged?.Invoke (this, m_FirstName_EventArg);
}

通過“replace”關鍵字,所生成的程式碼將直接替換手寫的程式碼,添加所缺失的功能。在這個示例中,我們甚至還能夠處理一些開發者經常會忽略的麻煩的部分,例如對 EventArgs 對象進行緩存。
雖然這個官方示例僅用於屬性變更通知,但這一技術還可用於各種“面向切面編程(AOP)”的場景,例如在程式碼中的日誌記錄、安全檢查、參數校驗以及其他各種繁瑣的樣板式程式碼。

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

2016年4月10日 星期日

將 JSON, XML, CSV 格式文件導入 MySQL 【軟體開發】

      讓我們從外部資料(Data)導入(import)資料庫是在資料庫程式開發應用中一個很常見的場景,其實這就是在資料庫的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是說,我們將特定結構(structure)或者格式(format)的資料數據導入某個目的地(比如資料庫,在這裡我們討論與示範的資料庫類型為 MySQL )。
   640
這篇文章我們要討論的內容,是如何方​​便地將多種格式(JSON, Text, XML, CSV)的數據導入MySQL資料庫裡。
1. 將Text文件(包括CSV文​​件)導入MySQL
這裡我們的討論是基於一個假定,Text file和CSV file是有著比較規範的格式的(properly formatted),比如說每行的每個數據域(field)之間是由一個共同的分隔符(比如tab : \t)分隔的。
那麼首先,你需要根據你的資料的格式(有哪些域),來設計好資料庫的對應的表 (的Schema)。
舉個例子,要處理的Text文件或者CSV文件是以\t作為分隔符的,每行有id, name, balance這麼三個數據域,那麼首先我們需要在資料庫中新增這個表(TABLE):
CREATE TABLE sometable(id INT, name VARCHAR(255), balance DECIMAL(8,4));
在我們新增成功以後就可以導入了。操作方式很簡單:
LOAD DATA LOCAL INFILE '你的文件路徑(如~/file.csv)' INTO TABLE sometable FIELDS TERMINATED BY '\t' [ENCLOSED BY '"'(可選)] LINES TERMINATED BY '\n' (id, name , balance)
這裡要注意的是,我們需要開啟local-infile這個MySQL的配置參數,才能夠成功導入。究其原因,從MySQL的Manual中可以看到這麼一段話:
LOCAL works only if your server and your client both have been configured to permit it. For example, if mysqld was started with --local-infile=0, LOCAL does not work. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.
這是MySQL出於安全考慮的默認配置。因此,我們需要在配置文件my.cnf中(以Debian發行版的Linux, 如Ubuntu為例, 即是在/etc/my.cnf中),確保:
local-infile=1
抑或是在命令行啟動MySQL時加上--local-infile這一項:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我們也可以使用MySQL的一個官方導入程序 mysqlimport,這個程序本質上就是為LOAD DATA FILE提供了一個命令行的interface,很容易理解,我們這裡就不再詳述。
2. 將XML文件導入MySQL
這件事的完成方式,與我們的XML的形式有著很大的關係。
舉個例子說,當你的XML數據文件有著很非常規範的格式,比如:
<?xml version="1.0"?>
  <row>
    <field name="id">1</field>
    <field name="name">Free</field>
    <field name="balance">2333.3333</field>
   </row>
  <row>
    <field name="id">2</field>
    <field name="name">Niki</field>
    <field name="balance">1289.2333</field>
  </row>
或者
<row column1="value1" column2="value2" .../>
我們就可以很方便使用LOAD XML來導入,這裡可以參見MySQL的官方手冊--LOAD XML Syntax。
然而我們可能有另外一些需求,比如說,我們可能會想要將XML文件的域映射到不同名字的列(TABLE COLUMN)之中。這裡要注意,MySQL v5.0.7以後,MySQL的Stored Procedure中不能再運行LOAD XML INFILE 或者LOAD DATA INFILE。所以轉換的程序(procedure)的編寫方式與在此之前有所不同。這裡,我們需要使用 Load_File()和ExtractValue()這兩個函數。
以下是一個示例XML文件和程序:
文件:
<?xml version="1.0"?>
<some_list>
  <someone id="1" fname="Rob" lname="Gravelle"/>
  <someone id="2" fname="Al" lname="Bundy"/>
  <someone id="3" fname="Little" lname="Richard"/>
</some_list>
程序:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))
BEGIN
    declare xml_content text;
    declare v_row_index int unsigned default 0;
    declare v_row_count int unsigned;
    declare v_xpath_row varchar(255);
 
    set xml_content = load_file(path);
 
    -- calculate the number of ro​​w elements.
    set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
    
    -- loop through all the row elements
    while v_row_index < v_row_count do
        set v_row_index = v_row_index + 1;
        set v_xpath_row = concat(node​​, '[', v_row_index, ']/@*');
        insert into applicants values​​ (
            extractValue(xml_content, concat(v_xpath_row, '[1]')),
            extractValue(xml_content, concat(v_xpath_row, '[2]')),
            extractValue(xml_content, concat(v_xpath_row, '[3]'))
        );
    end while;
END
在MySQL中,使用它進行導入:
call import_some_xml('你的XML文件路徑', '/some_list/someone');
程序相當的直白,只要了解一下MySQL的腳本編寫即可。
這裡提一下DELIMITER $$。我們知道MySQL的命令分隔符默認為分號,然而腳本中很顯然是有分號的,但是我們並不希望立即執行,所以我們需要臨時更改分隔符。
3. 將JSON文件導入MySQL
如何將JSON文件導入MySQL中,是一個很有趣的話題。 JSON是一種現在相當常用的文件結構,所以掌握它的導入具有比較廣泛的意義。
很多時候,我們處理的JSON數據是以如下形式出現的:
{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}
而並不是規整的[{},{},{},{}](一些NoSQL數據庫的Export)。
這樣的形勢對於載入有一個好處:因為每一行是一個JSON Object,所以我們便可以按行處理此文件,而不需要因為JSON的嚴格結構將整個文件(比如一個許多G的.json文件)全部載入。
方式一 使用common-schema
common-schema是一個應用很廣泛的MySQL的框架,它有著很豐富的功能和詳細的文檔。我們可以使用它的JSON解析的功能。 (它還具有JSON轉換成XML等等方便的功能)
具體說來,將common-schema導入之後,使用它的extract_json_value函數即可。源碼中:
create function extract_json_value(
    json_text text charset utf8,
    xpath text charset utf8
) returns text charset utf8
該函數接受兩個參數,一個是json_text,表示json文件的內容,另一個是xpath,表示數據的結構(這裡可以類比XML文件的處理)。很多讀者應該知道,XPath是用來對XML中的元素進行定位的,這裡也可以作一樣的理解。
以本段開始的幾行JSON為例,這裡common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
關於event_data,我們需要先理解LOAD DATA INFILE是一個event,不同的event type對應不同的event data。這部分知識可以參看Event Data for Specific Event Types
如果感興趣,可以參看其源碼。參看一個受到廣泛使用的項目的源碼,對於自身成長是很有益的。
當然了,我們也可以像之前處理XML文件導入一樣,自己編寫程序。這里便不再給出實例程序,有興趣的讀者可以自行編寫或者跟筆者交流。
方式二 使用mysqljsonimport
這是Anders Karlsson的一個完成度很高的作品。這一份程序由C寫成。它依賴於一個JSON Parser,Jansson。他們都有著比較好的維護和文檔,所以使用上體驗很好。
mysqljsonimport的下載在SourceForge上。具體使用參照其文檔即可。
為了方便不熟悉源碼安裝的朋友,筆者在這裡提一下安裝流程和注意事項。
安裝命令順序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz
$ tar xvfz mysqljsonimport-1.6.tar.gz
$ cd mysqljsonimport-1.6
$ ./configure –-with-mysql=/xxx/mysql
$ make
$ make check
$ sudo make install
--with-mysql這一步不是必要的,只要你安裝的mysql的路徑是系統的默認路徑。很關鍵的,而且很容易被不熟悉的朋友忽略的是,這一個C程序要成功編譯和運行,是需要MySQL的C API的,所以需要安裝的依賴,除了jansson,還有libmysqlclient-dev。
jansson的安裝就是簡單的源碼安裝,libmysqlclient-dev則可以使用包管理工具(比如ubuntu中使用apt-get即可;編譯和安裝前,建議先sudo apt-get update以避免不必要的麻煩)。
導入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
還有一個parser,作者是Kazuho,感興趣的讀者可以參看一下,他的相關博文是mysql_json - a MySQL UDF for parsing JSON ,github項目是mysql_json。
4. 使用MySQL workbench
Workbench這個工具對於許多不熟悉SQL語言或者命令行的朋友還是很方便和友好的。利用它,可以方便地導入和導出CSV和JSON文件。
具體操作圖例參見MySQL官方手冊即可:Table Data Export and Import Wizard,這裡不再贅述。

總結
本文介紹了將不同格式(JSON, Text, XML, CSV)的文件導入MySQL數據庫的一些詳細手段,並進行了一些分析,目的在於幫助讀者掃除一些導入的障礙,理清一些概念。之所以沒有討論導出,是因為導出是一個MySQL到外的操作,是以MySQL本身為轉移的,只要參考MySQL本身的機理即可。
真正對於大量數據的導入導出,需要思考的問題會很多(比如說在導入時,如何考慮Sharding),這需要另開一篇討論了。

來源:goo.gl/ttDJkh



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

2016年3月30日 星期三

微軟收購 Xamarin 了,未來透過 Visual Studio 開發 Android & IOS APP

       微軟剛​​剛收購了一家熱門初創企業 Xamarin,這家初創企業主要幫助開發者編寫應用並將開發者編寫的作品投放到任何智能手機或操作系統之中。
      下載
       對微軟而言,收購Xamarin 有著重要的意義,因為在最近幾年中,微軟一直努力將更多的應用引入自己的Windows Store 應用市場之中——這也是微軟大力推行Windows 10 系統的重要舉措之一。
諸如 JetBlue 和 Coca-Cola Bottling 之類的客戶都使用 Xamarin 來節省大量的時間和金錢。開發者也不需要學雜費時間來為 iPhone、Android 或其它的任何系統重新編寫相同的應用,這些應用一旦編寫完成之後,往往都具有更大的生產效率。
微軟在將更多的 iPhone 和 Android 應用引入 Windows 10 方面面臨著較大的挑戰,為了解決這些問題,微軟已經大力投資技術,以此幫助開發者更加無縫地將他們的應用引入 Windows 之中。
Xamarin-Microsoft-1
Xamarin 當然非常支持微軟的這些舉措,同時也能夠讓微軟支持的大量開發者更加容易地利用他們的 .​​NET 和 C# 標準編寫程序代碼,並將他們的應用引入諸如 Android 和 iPhone 等平台之中。
微軟與 Xamarin 的歷史較為久遠,但雙方之間的關係曾經也飄忽不定:雙方曾經是長期的合作夥伴,與聯合客戶合作,並幫助他們打造應用,同時也給這些應用提供支撐。但是,曾有一段時間,微軟被認為是 Xamarin 業務的秘密投資方,因而早在 2014 年就有過一段傳聞,宣稱這一併購交易即將進行。
針對這一交易,微軟雲業務主管斯科特·古斯瑞(Scott Guthrie)表示,“通過今天宣布這一收購交易,我們將進一步推動這一工作,以便讓我們世界級的開發者工具和服務更好地進行深度整合,從而為開發者帶來無縫的移動應用開發體驗。”
2015 年底,Xamarin 與甲骨文簽署了一份協議,以此將開發者引入甲骨文云業務(Oracle Cloud)之中,而甲骨文云業務與微軟的 Azure 雲平台之間存在競爭關係。 Xamarin 與甲骨文的這份協議,或許是刺激微軟最終採取措施並完全收購 Xamarin 的重要原因。
從 Xamarin 的角度來看,該公司是一個非常成功的初創型企業,宣稱在全球擁有 1.5 萬家客戶。最近,BI 還將 Xamarin 定義為秘密運行互聯網的 9 家初創型企業之一。
與此同時,微軟在吸引開發者以便為全新的 Windows 10 操作系統打造應用方面也一直存在困難。通過收購 Xamarin,微軟如今也能夠為客戶提供全新且更加便捷的方式,從而更好地為 Windows 編寫應用,並通過微軟的 Azure 雲業務來支持這些應用。總而言之,對微軟而且,這一交易是一個非常重要的舉措。
另外,Xamarin 也提供所謂的測試雲產品,這一產品能夠讓開發者查看應用在各種設備的運行表現——包括在 Android、iPhone 和 BlackBerry 等設備上。如今,所有的這些業務都將整合到微軟的業務之中,這樣或將更能夠引開發者。
對微軟而言,最終的一大目標就是打造更大規模和更具吸引力的雲產品。隨著微軟與亞馬遜都在爭著吸引更多的客戶,因此,從這個角度而言,收購 Xamarin 對微軟將起著重要作用。另外,此次交易還將對 Windows 10 的應用戰略起到巨大的支撐作用。由此看來,收購 Xamarin 的確是微軟的一個明智抉擇。
來源:goo.gl/KUWbEQ1

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

2016年3月28日 星期一

新技術、新科技、ERP的重要性將是更重要

        我們現在會不斷的定期常聽到關於最新的技術方面,尤其到現在幾乎都在談雲端計算,公司在實施 IT 功能部署時,可以不需購買硬體設備、只需要使用雲端系統,儘管我們面臨著很多的喧嘩與騷動,大多數 IT 企業仍然將他們大多數的時間和金錢花費在更現實的應用開發上,ERP系統就是最大的開發成果之一。雲端技術的支持者特別提出了一個看似更加令人信服的理由,那就是大型的系統,就像ERP正在面臨著滅亡,正在被雲應用程序所替代,因為雲應用程序可以快速部署和集成。當你發現他需要昂貴的升級和持續性的維護時,你可能會想,ERP在這一點上是否仍然重要。





        思考為何要導入ERP的“關鍵因素”
在考慮任何重大的IT投資時,關鍵的因素就是要非常明白它可以解決哪些企業與業務流程問題,對於ERP來說,“為什麼”,通常歸結為幾個關鍵領域的組合:處理日益複雜的企業流程,對於集中和整合企業資料,進而幫助制定決策,從“燃燒”的平台過渡,緩和順從性或法律方面的問題。 ERP實施中最合法的“原因”應該是整合資料,以便更好的製定決策。而其他的擔憂是合法性問題,在雲計算和商品應用的時代,集中的,一體化的基本業務應用是一個關鍵項目,它可以使ERP保持相關性和高價值。

規模的問題
部分ERP問題的答案是貴公司的規模和復雜性。幾十年來的主要ERP使用者都一直在推動著中型和小型業務市場的發展,按照市場的規模對他們的主流包裝按比例縮小版本。而像微軟這樣的公司在這個空間內已經很好的完成,更大和更複雜的系統(我正在審視的是SAP和Oracle)一直不太成功。
記得曾經有一個相當明顯的“臨界點”,其中一家公司的規模和復雜性推動其進入到SAP或Oracle的懷抱,這一條線已模糊不清,因為中間層的應用者都提高了他們的能力,像Salesforce這樣的雲服務提供商都已經合法進入到曾經是內部軟體的專屬領域。假設,ERP的關鍵資產是一個綜合性的平台,它提高您的決策,如果您的公司在沒有ERP的情況下,有正確的數據來支持其決策的進程,那麼我們就沒有必要投入巨大的投資,除非其他的辦法都已經用盡。

進行大檢查
雖然新安裝的一個主要的ERP系統的原因已經減少,但是這一點上,建議CIO們放棄現有的ERP安裝是一種目光短淺的行為。在許多的ERP部署中,初始部署工作的困難是,在進行部署時,已經付出了巨大的代價,因此我們不能為了取得一點點的提高而在很大程度上忽略了ERP。在進行初始部署時,只要我們執行了“大檢查”,就應該採用ERP,放棄ERP是一種完全錯誤的做法,因為額外的改進提高相比而言是非常廉價的。努力優化和普遍有效的ERP安裝可能會收穫未使用的數據,並能支持更有效的決策和分析。如果我必須確定的話,我猜大多數企業使用的ERP的功能少於30%,基本上是把大部分的投資都擱置不用了。

是什麼徹底變了嗎?
記得從ERP的鼎盛時期以來,在技術方面都有很多重大變化,這些變化影響到了決策的製定決策過程,決定是否要安裝一個新的ERP,或進行主要增強,比如添加一個新的核心模塊。儘管人們進行了​​大肆的炒作,我們可以相信考慮放棄現有的ERP,並建議尋找那些可以用最少的投資來提高報告,分析和資料採集的領域,這是不成熟的觀點。畢竟,ERP的集成應用程序和資料的核心承諾仍然是一項雲計算解決方案的資產,一些新興技術還不能複制。


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


2016年3月11日 星期五

印刷行業、飾品業 軟體解決方案

          昨天有個客戶聯繫我,該客戶是個傳統的印刷業,因為在製程上面以及原物料、人力管控一直處於混亂,也用過其他知名的ERP、套裝管理軟體系統,但始終無法很好適用該公司的內部作業流程,因此聯繫我,想深入了解合作的可能性。
SNAGHTML954cd62
           我才思考過,我們曾經開發一個印刷、飾品業的ERP系統,因此特別約了時間 Demo 以前的解決方案,但我相信該行業一定很多要客製化,這也是 網智數位-軟體開發 團隊的優勢,可以從無到有,從各部門分析作業流程跟客製化軟體。
          好的軟體,不論是管理上、成本管控上、人力資源上,我相信一定都是長期的投資,


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

2015年11月28日 星期六

Entity Framework 實戰 - 多對多自我關聯 Many to Many , Self Referencing 模型實作 (二)

此篇文是 Entity Framework 實戰 - 多對多自我關聯 Many to Many , Self Referencing 模型實作 (一)的續篇 , 當我們把基本模型 Product Class 建立好後,我們開始實作一個繼承 DbContext 的子類別,在這邊你可以把 DbContext 當做是資料庫的層次意義角度來看待
新增一個Class 名為 ProductContext.cs
image
然後按【新增】按鈕,並在 ProductContext 宣示繼承 DbContext 類別,如以下程式碼
  1: using System;
  2: using System.Collections.Generic;
  3: using System.Data.Entity;
  4: using System.Linq;
  5: using System.Text;
  6: using System.Threading.Tasks;
  7: 
  8: namespace EF6_ManyToManyAndSelf
  9: {
 10:     public class ProductContext : DbContext
 11:     {
 12: 
 13:     }
 14: }

接著加入 DbSet<Product> 的宣告,用於表示 存放著 Product Table(Class)的集合清單
public DbSet<Product> Products;
然後為了完成透過 Product 本身的 Class 來完成 多對多自身關聯,需要 override OnModelCreating Method , 程式碼如下

   1:   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   2:          {
   3:              base.OnModelCreating(modelBuilder);
   4:   
   5:              modelBuilder.Entity<Product>()
   6:                          .HasMany(p => p.RelatedProducts)
   7:                          .WithMany(p => p.AboveProducts)
   8:                          .Map(m =>
   9:                                    {
  10:                                        m.MapLeftKey("ProductID");
  11:                                        m.MapRightKey("RelatedProductID");
  12:                                        m.ToTable("RelatedProduct");
  13:                                    }
  14:                          );
  15:          }

到這邊基本上已經完成 EntityFramework 的宣告….

然後讓我們在前端界面使用我們實作好的 ProductContext ,來看看如何使用….程式碼如下


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Threading.Tasks;
   6:   
   7:  namespace EF6_ManyToManyAndSelf
   8:  {
   9:      class Program
  10:      {
  11:          static void Main(string[] args)
  12:          {
  13:              using (var context = new ProductContext())
  14:              {
  15:                  var product1 = new Product { ProductName = "美容業零售管理系統", Price = 59888M };
  16:                  var product2 = new Product { ProductName = "窗簾業ERP系統", Price = 3500000M };
  17:                  var product3 = new Product { ProductName = "玩具製造業ERP系統", Price = 6700000M };
  18:                  product2.RelatedProducts.Add(product3);
  19:                  product1.RelatedProducts.Add(product2);
  20:                  context.Products.Add(product1);
  21:                  context.SaveChanges();
  22:              }
  23:              using (var context = new ProductContext())
  24:              {
  25:                  var product2 = context.Products.First(p => p.ProductName == "窗簾業ERP系統");
  26:                  Console.WriteLine("Product: {0} ... {1}", product2.ProductName, product2.Price.ToString("C"));
  27:                  Console.WriteLine("Related Products");
  28:                  foreach (var prod in product2.RelatedProducts)
  29:                  {
  30:                      Console.WriteLine("\t{0} ... {1}", prod.ProductName, prod.Price.ToString("C"));
  31:                  }
  32:                  foreach (var prod in product2.AboveProducts)
  33:                  {
  34:                      Console.WriteLine("\t{0} ... {1}", prod.ProductName, prod.Price.ToString("C"));
  35:                  }
  36:              }
  37:   
  38:              Console.ReadKey();
  39:          }
  40:      }
  41:  }


 
 



執行結果為


image





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

Entity Framework 實戰 - 多對多自我關聯 Many to Many , Self Referencing 模型實作 (一)

在我們軟體開發過程中,我們會遇到一種特殊模型實體關係,例如一個線上商品系統,會有產品資料表(Product Table),以及記錄產品的【相關產品】和該產品本身可以被關聯的上層【相關產品】,感覺很繞口,下圖我截取一個 ER-D 示例圖:
image
上圖ERD 關聯存在所謂的多對多關係 (Many to Many)而且又是自我關聯(自身關聯,Self Referencing),本身的主要邏輯是 RelatedProduct 這個Table,擔任一個用來記錄多對多關聯記錄的中繼Table,RelatedProduct Table包含了2個欄位(ProductID、RelatedProductID),2個欄位都是參考(Referencing)到 Product Table的 ProductID 主鍵值 ( Primary Key ),透過這樣的技巧可以表達一個產品可以關聯多個相關產品,反之也可以表達一個產品可以被多少產品有所關聯….
但現在我要教大家實作一個只需要在 Entity Framework 建立一個 Product Model (POCO),然後透過一些程式寫法技巧,來達成 這種商業資料模型  - 》 多對多自我關聯 Many to Many , Self Referencing 。
首先讓我們用 Visual Studio 開發工具來先新增一個程式專案,在此我程式專案命名為 EF6_ManyToManyAndSelf,然後按確定。
image
接下來,我們需要透過 NuGet來安裝 EntityFramework ,
image
image
在上圖執行安裝按鈕後,後續 NuGet 就會開始安裝 EntityFramewok , 目前 Allen 裝的版本為 6.1.3 穩定版,安裝過程可能會等候一點點時間,裝完後,你會發現專案的參考對了2個參考項目
image
確定沒問題後,接下來我們來新增一個 Product Class ,用來代表 Product table 的對應,完整程式碼如下:
image
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.ComponentModel.DataAnnotations;
   4:  using System.ComponentModel.DataAnnotations.Schema;
   5:  using System.Linq;
   6:  using System.Text;
   7:  using System.Threading.Tasks;
   8:   
   9:  namespace EF6_ManyToManyAndSelf
  10:  {
  11:      [Table("Product", Schema = "dbo")]
  12:      public class Product
  13:      {
  14:          public Product()
  15:          {
  16:              RelatedProducts = new HashSet<Product>();
  17:              AboveProducts = new HashSet<Product>();
  18:          }
  19:   
  20:          [Key]
  21:          [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  22:          public int ProductID { get; set; }
  23:   
  24:          public string ProductName { get; set; }
  25:   
  26:          public decimal Price { get; set; }
  27:   
  28:          /// <summary>
  29:          /// 記錄此產品的多個相關的產品
  30:          /// </summary>
  31:          public virtual ICollection<Product> RelatedProducts { get; set; }
  32:   
  33:          /// <summary>
  34:          /// 記錄此產品被那些上層產品標示為相關的產品
  35:          /// </summary>
  36:          public virtual ICollection<Product> AboveProducts { get; set; }
  37:   
  38:      }
  39:  }
 

    實作到這邊已經把基本的 EntityFramework 安裝進來,也把產品模型寫成一個POCO Class ,後續是更進階的 程式技巧已經背後運作解釋,請繼續參閱我撰寫  Entity Framework 實戰 - 多對多自我關聯 Many to Many , Self Referencing 模型實作 (二) 的介紹。



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

2015年11月18日 星期三

WPF – VisualBrush 劃刷 功能介紹


      在開發公司套裝軟體產品時,在 Windows平台 下公司團隊幾乎都採用 Windows Form 或 WPF兩個技術,今年的專案因為某些原因幾乎全部開始全部採用 WPF技術,當然研發過程也面臨了不同的技術適應期,但隨著專案的開發過程,團隊漸漸越來越喜愛WPF技術,因為不論在繪圖界面呈現,開發速度的產能,效益比逐漸明顯出來,尤其是在 XAML 語法的特性,明顯界面與程式邏輯分離的架構,程式相對乾淨了許多,今年下半年公司也因為某些因素,投入繪圖技術的研究,在WPF的支援下,許多客戶的要求都可以快速的開發因應…
      而今天我也想要分享WPF一個繪圖呈現的一個利器- VisualBrush 畫刷 功能,VisualBrush主要特性是可以複製現有視窗特定的控制箱、元素、容器等區塊的外觀,也就是可以快取下來,好像一面鏡子,然後可以在其他地方顯示,實作方式事實上非常簡單,這邊我就帶大家來看一個範例…
   
  1: <Window x:Class="VisualBrush.MainWindow"
  2:         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3:         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4:         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5:         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6:         xmlns:local="clr-namespace:VisualBrush"
  7:         mc:Ignorable="d"
  8:         Title="MainWindow" Height="600" Width="800">
  9:     <Grid>
 10:         <Grid.ColumnDefinitions>
 11:             <ColumnDefinition>
 12:             </ColumnDefinition>
 13:             <ColumnDefinition >
 14:             </ColumnDefinition>
 15:         </Grid.ColumnDefinitions>
 16:         <Grid.RowDefinitions>
 17:             <RowDefinition></RowDefinition>
 18:             <RowDefinition></RowDefinition>
 19:         </Grid.RowDefinitions>
 20:         <Button x:Name="btn1" Grid.Column="0" >網智數位-軟體開發 , WPF - VisualBrush </Button>
 21:         <Rectangle  Grid.Column="1"  >
 22:             <Rectangle.Fill>
 23:                 <VisualBrush Visual="{Binding ElementName=btn1}"></VisualBrush>
 24:             </Rectangle.Fill>
 25:         </Rectangle>
 26: 
 27:         <!--<Button x:Name="btn2" Grid.Row="1" Grid.Column="0" Background="Red">網智數位-軟體開發 , WPF - VisualBrush</Button>-->
 28:         <Image Source="gril.png" x:Name="img1" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Stretch="Fill"></Image>
 29:         <Rectangle  Grid.Column="1" Grid.Row="1" >
 30:             <Rectangle.Fill>
 31:                 <VisualBrush Visual="{Binding ElementName=img1}"></VisualBrush>
 32:             </Rectangle.Fill>
 33:         </Rectangle>
 34:     </Grid>
 35: </Window>
 
重點在我用黃色標示起來的程式碼,很簡單透過 Binding 機制,我分別將2個矩形 Rectangle 的內容區域,放入 VisualBrush ,而各分別繫結至為 Button的外觀 和 Image 圖片的外觀,之後這2個 Rectangle矩形就好像2面鏡子分別對應Button跟Image… 
執行結果如下
image_thumb[11] 
 
網智數位-軟體開發 

2015年11月16日 星期一

BOM表管理與設定﹣輔料是否需輸入BOM

    「BOM表」管理 ﹣ 輔料

      上星期公司在跟一個客戶討論產品生產過程與BOM的輸入建置中,輔導客戶如何有效管理 BOM表,剛好這個客戶因為製造過程中,需要用到許多塗料、螺絲等耗材,所以詢問我是否該將「輔料」列如資訊系統作控管呢??額外一提,事實上很公司都一直以為只有製造業系統才需要導入 BOM表管理,事實上我們也幫助幾家貿易商的管理系統,開發導入簡易的BOM表管理,根據BOM表去靈活計算產品的配件、零件成本計算,來有效進行報價管理。






          (何謂BOM呢?BOM英文為(Bill of Material),中文為物料清單,是電腦用來可以識別的產品結構數據文件,也是ERP的主導文件。 BOM使系統識別產品結構,也是聯繫與溝通企業各項業務的紐帶, ERP系統中的BOM的種類主要包括5類:縮排式BOM、匯總的BOM、反查用BOM、成本BOM、計劃BOM。)

          事實上輔料都是作為構成產品的零部件,但卻很少人真正去思考是否跟產品的物料一樣列入BOM表做管理,我們知道輔料它是生產的工序中必備的材料之一,具體來說,輔料是用於切割油、電子管、塗料等,或是以固定工作為目的,用完后就馬上丟棄的耗材等,輔料很明顯的特徵就是它伴隨生產過程同時會逐漸消耗、減少的物料,因為會隨著耗損,補充材物料庫存量,所以在根據訂單下達產品的生產數量時,輔料它事實上也是跟產品、零件、原物料一樣是可以透過MRP物料需求計劃,進行需求量參與計算的...,建議可以參考我之前寫的文章介紹(MRPⅡ/ERP能力需求計劃 、MPS主生產計畫)。

          但在談輔料時,常常許多客戶又會跟另外一個名詞搞混,這個名詞就是"資源"(Resource),"資源"在 MRP系統 與 ERP系統是指生產所需的物料中除了原材物料、訊息以外的其他物料,例如:機械設備、機器操作員、模具、設備工具、電、空氣、等等都是歸屬於資源,因為通常在計算物料需求(MRP)時,都被當做無限庫存來處理使用,但是我們注意觀察一些輔料的材料,例如塗料是附著於產品表明,作為產品的一部份,還有只要我們實際觀察噴塗工序後,我們就會明白,一定量的塗料會隨著部份飛沫或毛邊被丟棄,我們都把這些消耗品成為「輔料」。

          若以庫存管理的角度來看,輔料是屬於 ABC分析法的C類數量,但從它經常平均消耗的特性來考量,以及輔料的單價一般偏低,所以是適合用於「訂購點管理」,綜合以上所述,即使大多數企業、工廠就算沒把輔料列入 BOM表作管理,也沒有感到太多不便的原因。此外,很多時候大宗物料的物品,我們也可以歸為「輔料」來管理,例如小型的螺絲釘,雖然一般來說都被列入「零件」項目,但在實際組裝過程中,即使規定只有20個螺絲需要,實際上使用20~25個也都很普偏,而且螺絲在各種產品可能都通用下,把它採用「輔料」角度來處理事實上是合理可以接受的。


網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

(作者其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] - 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)
ERP思維突破:啟動企業智能革命,引領未來行銷新浪潮
AI時代的ERP:釋放企業潛能的新革命
貿易公司需要導入BOM表嗎?



網智數位-開發團隊

一直突破開發技術、累積各種產業知識,而且在出版業、室內設計裝潢業、製造業、機電顧問、貿易、地板、窗簾、窗材、拉門、布料業的商業管理軟體投入有特別的領域知識、也在圖控軟體(圖控軟件)、機械手臂、 Android APP 、iPhone APP、3D列印 開發一直突破再創新,我們也堅持相信好的軟體可以協助企業,不管在管理營運角度、商品創新、決策分析等都絕對是不可缺少的關鍵因素,如果客戶您有任何軟體開發、程式開發委外需求,請聯繫我們讓我們協助您一起討論如何開發一個好的軟體來協助您。


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

2015年10月28日 星期三

窗簾/窗材軟體 & 專案開發


窗簾/窗材軟體 & 專案開發
          「網智數位」很開心可以正式與經營40年企業的窗簾、窗材裝飾行業領域的領行者(新瑞和窗飾),簽訂合約進行企業內部管理系統的軟體開發與分析,在整個合作過程,我真的看到一個企業二代的用心在企業經營管理流程改善的用心,用心到讓我整個對談言語中,真的非常的驚訝,不論是在製作技術、廠商合作模式、行銷新概念思維等,讓我感覺傳統產業不同的經營方式與對資訊科技、網路行銷有完全不一樣的切入點,也思考如何真正的利用資訊科技技術來管理、突破新的發展契機點。








          接下來我們也會用多年的分析經驗、程式開發、流程知識,跟我們最關心的客戶作很緊密的溝通、修正、開發出一個完全客製化的 窗簾/材管理系統 &窗簾/材管理軟體 …..

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