軟體開發(軟件開發)

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

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

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

商用軟體-客製化設計

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

IOT 物聯網-系統開發

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

雲端VPS虛擬主機租用

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

ERP軟體客製化導入

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

搜尋引擎最佳化SEO

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

服務宗旨

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

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

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

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

顯示具有 教學 標籤的文章。 顯示所有文章
顯示具有 教學 標籤的文章。 顯示所有文章

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

2015年12月25日 星期五

【Excel - 樞紐分析】二維轉一維技巧

        當我們在做資料分析時,我相信最多人常用的還是…Excel ,今天我想花一點時間寫篇教學文件,介紹如何透過 Excel 的樞紐分析表和樞紐分析圖精靈來將二維的分析表轉換成一維的資料…. 
        在這邊我是根據Excel 2013版本為例,首先我們必須先把樞紐分析表和樞紐分析圖精靈 工具圖示新增到工具列區,首先我們先到 Excel –> 檔案 

圖-1
image
滑鼠點選【選項】 
圖-2
image
點選Excel選項 –> 自訂功能區,在【由此選擇命令】下列選項,選擇為【不在功能區的命令】 
圖-3
image
在【不在功能區的命令】的所有功能選項,尋找【樞紐分析表和樞紐分析圖精靈】選項,然後在右邊的【自訂功能區】下列選項展開【資料】選項,如上圖…

接著點選下面的【新增群組】,並更名為 【樞紐分析表與圖精靈】,如下圖 
圖-4
image

再將 圖-3 步驟,所選取的【樞紐分析表和樞紐分析圖精靈】選項,加入(新增)到【樞紐分析表與圖精靈】選項,如下圖 

圖-5
image

最後執行【確定】按鈕,就可以看到在【資料】區域有出現【樞紐分析表和樞紐分析圖精靈】圖示 
圖-6
image
經過上述步驟1~6,我們把Excel隱藏的樞紐精靈顯示出來了,再來完成我們的任務,二維轉一維資料….
在這邊我用一個客戶從2011年到2015年的全國主要經銷商的營業額為為案例 
圖-7
image
有了二維表格後,我們開始進行轉成一維資料表格….
執行【樞紐分析表和樞紐分析圖精靈】圖示 
圖-8
image

圖-9
image

圖-10
image
選取 Excel 表格範圍 A1:F8

圖-11
image

圖-12
image


圖-13
image


圖-14,精靈完成結果
image


最後一個步驟哦,也是最神奇的事情,就是我們滑鼠點選 G12 儲存格,Excel 就會自動幫我們轉成原始一維資料表格
image


我們在分別將【列】、【爛】、【值】更名為【縣市】、【年度】、【營業額】
image
經過這樣神奇的樞紐分析圖表精靈,就完成我們的二維轉成一維資料表格式..


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

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 模型實作 (二) 的介紹。



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

2014年7月28日 星期一

VMware P2V 將實體機器轉成虛擬機器(實體轉虛擬)

在最近幾年來對資訊產業來說『雲端』這一詞可以說是最熱門的話題,不論是什麼都要和『雲端』扯上關係,像是雲OS、辦公室軟體、雲端掃毒軟體、雲儲存、雲端電視、雲端遊戲等,好像現在的服務都一定要加上『雲端』,且現在媒體總是報導著雲端雲端!! 導致越來越多人想一窺雲端的面貌,也越來越多企業緊追雲的蹤跡,無不希望飛上雲端。

延伸閱讀:

當然我們的客戶也不例外,最近一個客戶砸了重金買了軟硬體,為了也是希望他們的系統能夠上雲端,但上雲端之前,系統的虛擬化是一個很重要的一步,如何順利的將公司現有的實體機器,轉換成虛擬主機,Chris將這幾年所遇到的問題、評估與注意事項,用筆記的方式分享給大家,有P2V需求或有興趣的朋友請看下去。

P2V簡介:
實體到虛擬,即 Physical to Virtual 簡稱 P2V。是從實體機複製操作系統、應用程式或者數據到虛擬機的技術。

P2V工具:
VMware vCenter Converter, 免費(後續之內容以此VMware vCenter Converter來做介紹)

軟體:VMware vCenter Converter
使用目的:實體主機虛擬化成虛擬機器檔案

P2V的準備評估事項:
  1. 待轉的機器是否為支援的OS版本
  2. 與AP人員討論check list,有什麼機制去證明機器是轉換完畢的。
  3. 有些特殊卡片、接頭的,VMware無法支援的,可能需要討論是否有變通方法。
  4. 對雲端管理者而言,需討論轉入機器所需要的Port,防火牆與掃毒的機制(如何證明機器不會影響到環境內其他虛擬機)。
  5. 高效能吃資源建議專用
  6. DB鎖license例如sybase
P2V流程中的注意事項:
  1. 均須有最高權限帳號去執行P2V作業。
  2. 從原本IBM & HP 或他牌機器P2V時,若原本有裝原廠的Agent,轉完後建議把這些Agent移除。
  3. 轉完後均須安裝VMware Tools。
  4. VMware vCenter Converter 轉換時,建議用同網段去作,否則常常會因Delay,會有不明錯誤失敗。
  5. 若實體機有分系統槽與資料槽(storage),建議可以只先轉系統槽,資料槽可以用其他方式COPY過去,會使P2V速度加快。
  6. 轉換Windows時,因常有莫名因素,Converter部屬待轉機器時,會遇到無法遠端安裝Converter Agent的狀況,此時手動在待轉機器上安裝Converter Agent即可。
  7. 轉換Linux時,因Converter是用Helper iso去開起虛擬機,並且用SSH的方式去Copy整個資料,所以需要配置一個暫時用的IP。
P2V完成之注意事項
  1. 當轉換完畢後,需要注意IP網段的衝突,轉換Linux時更需注意。
  2. AP的驗證與測試,依照Check list逐一驗證。
  3. 是否有一些不必要的安裝程式可以刪除,例如一些Server原廠的Agent。(windows)一些隱藏的驅動程式(網卡)需要刪除,以免IP咬住。
支援版本(沒有出現在以下之OS,代表不支援)

Windows

Linux

最後VMware vCenter Converter的使用方式其實很簡單,這邊就不再額外截圖教學了,最重要的是上述所說的方法,如果該注意的地方都有注意,基本上轉換成功的機率就很大,不過實際上每個人的環境都不一樣,所遇到的問題也會不同,無法一一列出注意事項,如果有甚麼漏掉,或是有遇到甚麼奇怪的問題,都歡迎大家來討論。

2014年6月28日 星期六

使用Dual Stack同時擁有IPv4與IPv6 速度變慢(IPv6 Fallback)的解決方法

可能很多人沒有關注或發現,其實早在幾年前 IPv4 的位置就已經配發完了,也就是說未來我們架設的網站或Services,會逐漸面臨到如何與IPv6網路共存的問題,而最近遇到了一些客戶已經未雨綢繆地籌備IPv4到IPv6的過渡方法。

目前IPv4到IPv6的過渡方法有下列三種
  1. Dual Stack(IPv4/IPv6雙堆疊)
  2. Tunneling(隧道)
  3. NAT-PT(轉換)
而我們其中一個客戶選擇使用第一種Dual Stack(IPv4/IPv6雙堆疊)的方式來做轉換,使用這種方式算是相當的簡單,只要電腦或是網路上的路由器同時支援IPv4和IPv6即可,對於公司行號內部來說轉換相當容易,只需將網路節點換成支援Dual Stack的裝置即可,每個裝置同時擁有IPv4和IPv6位址,2種網路同時並存在公司內部,卻又不相互干擾。不過當我們的客戶使用 Dual Stack 上線沒有多久,他們的使用者卻抱怨上Facebook變的很慢很慢(迷之聲..上班可以玩臉書嗎? XDDD),一開始用戶懷疑是DNS解析以及同時擁有IPv4與IPv6 是不是有回覆的優先順序的問題,這邊我說明一下,DNS Server 會依用戶詢問的記錄(Domain name record)回覆,當某個Domain name record只有IPv4位址,就只回覆IPv4位址當某個Domain name record只有IPv6位址,就只回覆IPv6位址如果某個Domain name record有IPv4及IP6位址,則IPv4、及IPv6位址都回覆,所以沒有先後順序問題。

後來請用戶的網管人員調閱Firewall Log發現IPv6的連線都被Deny掉了,原來用戶的網管人員沒有設定IPv6的Firewall Policy,但用戶為什麼還是可以連到Facebook呢?原因是現在新的OS,一般都會先嘗試連線IPv6位址,而如果該Domain name record  的IPv6連線有問題,或是該Domain name record設定有問題,會造成OS繼續嘗試IPv6位址,大約在經過21秒後才改嘗試該Domain name record的IPv4位址,所以使用者雖然可以連上Facebook但很緩慢,這就是IPv6 Fallback現象。

所以要解決這個問題有兩種解決方法,第一個解決方法比較簡單,就是請網管人員開通Firewall Policy,第二種就是設定OS可透過下面教學,來控制OS本身IPv4、IPv6路由的優先順序,來避開這個問題。

Windows 設定方式

Windows: (::ffff:0:0即是指IPv4),此指令輸入後是永久生效,不必每次都重新設定。

C:\>netsh interface ipv6 show prefixpolicies
正在查詢使用中的狀態...

優先順序    標籤   首碼
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
        20      3  ::/96
        10      4  ::ffff:0:0/96
         5      5  2001::/32


C:\>netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 100 4
確定。


C:\>netsh interface ipv6 show prefixpolicies
正在查詢使用中的狀態...

優先順序    標籤   首碼
----------  -----  --------------------------------
       100      4  ::ffff:0:0/96
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
        20      3  ::/96
         5      5  2001::/32

C:\>

Linux 設定方式

Linux: (::ffff:0:0即是指IPv4),以下對/etc/gai.conf檔加入即可。
最後在做一個重開機。

~]# cat /etc/gai.conf
# Label
# Add another rule to the RFC 3484 label table. See section 2.1 in
# RFC 3484.
# The default is:
label ::1/128 0
label ::/0 1
label 2002::/16 2
label ::/96 3
label ::ffff:0:0/96 4
label fec0::/10 5
label fc00::/7 6

#
# Precedence
# Add another rule the to RFC 3484 precedence table. See section 2.1
# and 10.3 in RFC 3484.
# The default is:
precedence ::1/128 50
precedence ::/0 40
precedence 2002::/16 30
precedence ::/96 20
#precedence ::ffff:0:0/96 10
#
# For sites which prefer IPv4 connections change the last line to
precedence ::ffff:0:0/96 100
~]# shutdown -r now

2014年6月2日 星期一

[教學]如何突破郵件伺服器的附件大小限制

我想大家有寄過E-Mail的人,應該或多或少有遇過附件檔案過大,寄不出去的問題,有些因公司的政策或許附件大小沒有限制的很嚴格,但像之前Chris的公司因頻寬的關係,附件大小限制在5MB以下,如果附件檔案在10幾mb以內或許還可以用壓縮的方式,看有沒有辦法壓縮到5MB以下,若壓縮還是超過限制,就得要切割檔案了。

延伸閱讀:

現在雲端服務越來越普及了,所延伸出來的功能也越來越強,越來越貼心了,像是中華電信推出的雲端資料櫃,就與Microsoft Outlook 郵件增益集做整合了,當您未來使用Outlook撰寫郵件時,可以輕鬆快速夾帶存在雲端資料櫃的檔案、突破郵件軟體的附件大小限制囉!

使用教學

Step 1:在同步資料櫃的左側功能區-應用程式下載,點選Outlook 郵件增益集下載
Step 2:將軟體先下載至電腦上,可點選開啟檔案執行安裝,或至下載軟體的儲存位置執行安裝。
軟體安裝
Step 3:至剛剛下載軟體的儲存位置,點按安裝Outlook 郵件增益集
Step 4:系統會訊問是否要安裝此軟體,請按 「執行」
Step 5:點選「安裝」、「下一步」進行安裝
Step 6:確認要安裝軟體的位置,這裡使用軟體預設的位置
Step 7:再來點選 「下一步」 等待完成軟體安裝即可.

如何使用「雲端資料櫃 Microsoft Outlook 」 郵件增益集

一、撰寫郵件完成後,點選「插入檔案」
二、輸入中華電信會員帳號、密碼進行登入
三、選擇雲端資料櫃中欲分享的資料夾或檔案 (註)
四、等待附加檔案完成,即可發送郵件囉~

1. 分享資料夾可同時多選擇資料夾與檔案,但不能選擇根目錄(同步資料櫃) 
2. 確定送出後,資料夾分享連結將出現在郵件本文中,同時該資料夾會設定為公開
   (連結可供所有人進行檢視及下載等功能) 資料夾設定方式請參考此篇說明[2]
現在就趕快來試看看 Outlook 郵件增益集的功能吧!