軟體開發(軟件開發)

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

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

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

商用軟體-客製化設計

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

IOT 物聯網-系統開發

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

雲端VPS虛擬主機租用

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

ERP軟體客製化導入

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

搜尋引擎最佳化SEO

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

服務宗旨

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

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

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

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

顯示具有 IT 標籤的文章。 顯示所有文章
顯示具有 IT 標籤的文章。 顯示所有文章

2016年9月22日 星期四

系統分割 - 無法刪除 使用 diskpart 指令 (軟體開發、軟件開發、程式開發)

 今天 Allen 我在整理公司機房的機器設備,也把多年專案開發的系統要做備份,順道買了一個行動硬碟 4 T的容量,但在 MAC Pro 先進行格式化後,再插入回 Windows 作業系統環境後,使用磁碟管理發現該顆硬碟最前面出現200MB的EFI磁碟分割,而磁碟管理圖形界面無法進行刪除該多餘磁碟分割,雖然才 200 M,但就覺得浪費了空間,所以忽然想到使用 DiskPart 指令,以下就是簡單的指令操作步驟教學… 
diskpart-list-volume

我們要如何刪除多餘的EFI磁碟分割呢?

此時選擇[開始] -> [執行], 執行"cmd"出現終端機視窗

此時輸入 diskpart 指令並按[Enter]鍵

DISKPART> list disk

磁碟###   狀態         大小        可用     Dyn  Gpt
--------      ----------   -------     -------   ---    ---
磁碟 0       連線         1000 GB   0 B
磁碟 1       沒有媒體   0 B         0 B
磁碟 2       沒有媒體   0 B         0 B
磁碟 3       連線         37 GB     37 GB   *


DISKPART> select disk 3

磁碟 3 是所選擇的磁碟。

DISKPART> list partition

磁碟分割 ###   類型                大小         位移
----------------   ----------------  -------       -------

磁碟分割 1        系統                200 MB    20 KB

DISKPART> clean

DiskPart 成功地清理了磁碟。

DISKPART> exit

最後再使用 clean 指令清除磁碟時務必確定選擇的磁碟是否正確。




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

2016年8月18日 星期四

Windows Server 2016 七大 Hyper-V 功能 (網智數位﹣軟體開發﹣程式開發)

      雖然目前雲端技術正在不斷流行、成熟化,可是事實上仍有大量工作負載需求是企業內部必須依靠虛擬伺服器作為服務載體。
images
所以下面我整理了其中的各項windows server 2016 hypber-v 全新功能或者經過突破改進的特性功能:
1.分立設備配置(又稱DDA)。
使用者用戶在PC當中中接入部分PCIe設備,並将其直接交付虚拟机使用。这项性能强化机制允许各虛擬主機直接存取 PCI 設備,即绕过虚拟化堆栈。与该功能相关的两大关键性PCI设备类型包括GPU与NVMe SSD控制器。
2.主機資源保護:
常常有时候,虛擬機器之前就是會為了自身顺畅运行而拒绝彼此共享資源服務。而在這個時候有一個新功能的支持下,各虛擬機器將只能夠使用自身被分配到的資源分配額度。如果某套虚拟机被发现擅自占用大量资源,则其资源配额会进行下调以防止其影响其它虛擬機器的效能。

3.
虛擬網絡適配器(Adapter)的記憶體“熱”變更:
這些功能允許大家隨意添加或者移除適配器(僅適用於Gen 2 虛擬機),而无需进行关闭以及重启。另外,大家也可以随意对尚未启用的动态内存进行调整(同时适用于Gen 1與第2代虛擬機)。

4.嵌套虛擬化:
大家在子虛擬機器内运行Hyper-V,從而可以其作為主機伺服器來進行使用。如此一来,大家将能够在一套Hyper-V服務器之上運行的Hyper-V Server,從而進行開發、測試与教育訓練工作——不過目前還很難想象是否其可用於真的生產環境中(Online)。
生產型虛擬機檢查點:与快照功能非常類似,上代版本中的检查点能夠為虛擬機器的當前狀態保存了快照(SnapShot),從而用於開發/測試復原。不過這些“標準”的檢查點并未使用陰影複製服務(又簡稱VSS),因為它并不適合用來作為實際生產環境下的備份(Backup)的用途。新的線上型檢查點完美整合了VSS,因此完全能夠適應線上作業環境的實際需求。 


5.PowerShell Direct: 允許管理者在遠程方式管理運行在視窗10或者在Windows Server 2016之上的虛擬機器。大家可经由VMBus利用PowerShell命令进行操控,而无需亲手对主机或者虚拟机进行网络配置或者远程管理设置。这项新功能相信会受到PowerShell脚本語法愛用者粉絲的支持。

6.虛擬TPM与屏蔽虛擬機
受信平台模組(簡稱TPM)允许大家利用微軟(Microsoft)的 BitLocker 技術,來進行加密動作,其具體方式與使用物理TPM保護實體磁碟槽一樣。屏蔽虛擬機同樣是利用虛擬TPM由BitLocker(或者其它加密工具)實現加密。

所以在這2種情況下虛擬機器能够利用TPM預防惡意有心人士對設備的不當存取訪問。


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

2016年8月11日 星期四

虛擬主機架設維護

      今天受委託協助處理舊客戶的網頁設計、虛擬主機架設,該客戶是委託我們開發量身定做的設備清單管理軟體,但網頁一直是另外委託其他網頁設計公司處理,無意中在軟體開發會議中,提到內部系統移轉到雲端的解決方案跟價格評估,忽然其他同仁提到公司網頁也要轉移(因為原本委託其他公司的費用一年竟然高達台幣3萬元,只是簡單的網頁),所以開完會後,回到公司了解客戶的網頁程式語言與資料庫,原來客戶委託的網頁設計公司使用了很早的 ASP 語法寫的網頁(不是 ASP.NET)而且還使用了已經快找不到的早期元件(Component),而主機代管公司不是網頁設計的廠商,該主機廠商為了能運作,只好把一直保留一台 Server ,作業系統是老舊的 Windows Server 2003,而安裝的獨立主機,為了滿足老舊的網頁程式語法。
image


     而我為了幫客戶減少不必要的年費用支出,真的只是一個公司外部網頁跟小功能程式,我迅速改寫了裡面語法,重新的架設到一台 Windows Server 2012 主機,資料庫也改寫,這樣只要簡單再轉移到虛擬主機,一年費用減少超過一半再多,客戶只要用三分之一的預算就可以了,有時候真的幫客戶解決不該花的預算,投入真正的核心系統,也是我們網智數位對客戶的態度與用心。

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

2016年8月4日 星期四

2016年6月份最新資料庫流行排名

看統計圖表與去年同期來相比較,明顯的是 Elasticsearch 和 Teradata 的分數增加,而SAP Adaptive Server 與 Solr 的分數略有所下降。

以下圖表是最新的 2016年6月份前20名排行榜:

13133528_5912

 

上面統計數字的排名主要根據 5個因素來進行統計:Google以及Bing搜索引擎的關鍵字搜索數量、Google Trends的搜索數量、Indeed網站中的職位搜索量、LinkedIn中提到關鍵字的個人資料數以及Stackoverflow上相關的問題和關注者數量。

 

 

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

伺服器被攻擊後的處理措施

     安全總是相對的,再安全的服務器也有可能遭受到攻擊。作為一個安全運維人員,要把握的原則是:盡量做好系統安全防護,修復所有已知的危險行為,同時,在系統遭受攻擊後能夠迅速有效地處理攻擊行為,最大限度地降低攻擊對系統產生的影響。

hacker_internet_web_attack-100033459-medium


一、處理服務器遭受攻擊的一般思路
系統遭受攻擊並不可怕,可怕的是面對攻擊束手無策,下面就詳細介紹下在服務器遭受攻擊後的一般處理思路。
1.必須馬上切斷網絡
所有的攻擊都來自於網絡,因此,在得知系統正遭受黑客的攻擊後,首先要做的就是斷開服務器的網絡連接,這樣除了能切斷攻擊源之外,也能保護服務器所在網絡的其他主機。
2.開始試著查找攻擊源
可以通過分析系統日誌或登錄日誌文件,查看可疑信息,同時也要查看系統都打開了哪些端口,運行哪些進程,並通過這些進程分析哪些是可疑的程序。這個過程要根據經驗和綜合判斷能力進行追查和分析。下面的章節會詳細介紹這個過程的處理思路。
3.進行分析入侵原因和途徑
既然系統遭到入侵,那麼原因是多方面的,可能是系統漏洞,也可能是程序漏洞,一定要查清楚是哪個原因導致的,並且還要查清楚遭到攻擊的途徑,找到攻擊源,因為只有知道了遭受攻擊的原因和途徑,才能刪除攻擊源同時進行漏洞的修復。
4.一定必須備份用戶數據
在服務器遭受攻擊後,需要立刻備份服務器上的用戶數據,同時也要查看這些數據中是否隱藏著攻擊源。如果攻擊源在用戶數據中,一定要徹底刪除,然後將用戶數據備份到一個安全的地方。
5.重新安裝系統
永遠不要認為自己能徹底清除攻擊源,因為沒有人能比黑客更了解攻擊程序,在服務器遭到攻擊後,最安全也最簡單的方法就是重新安裝系統,因為大部分攻擊程序都會依附在系統文件或者內核中,所以重新安裝系統才能徹底清除攻擊源。
6.修復程序或系統漏洞
在發現系統漏洞或者應用程序漏洞後,首先要做的就是修復系統漏洞或者更改程序bug,因為只有將程序的漏洞修復完畢才能正式在服務器上運行。
7.恢復數據和連接網絡
將備份的數據重新復製到新安裝的服務器上,然後開啟服務,最後將服務器開啟網絡連接,對外提供服務。
二、檢查並鎖定可疑用戶
當發現服務器遭受攻擊後,首先要切斷網絡連接,但是在有些情況下,比如無法馬上切斷網絡連接時,就必須登錄系統查看是否有可疑用戶,如果有可疑用戶登錄了系統,那麼需要馬上將這個用戶鎖定,然後中斷此用戶的遠程連接。
1.登錄系統查看可疑用戶
通過root用戶登錄,然後執行“w”命令即可列出所有登錄過系統的用戶,如下圖所示。

wKioL1ei-aqgJ0VUAAB84CpIZOQ223

通過這個輸出可以檢查是否有可疑或者不熟悉的用戶登錄,同時還可以根據用戶名以及用戶登錄的源地址和它們正在運行的進程來判斷他們是否為非法用戶。
2.鎖定可疑用戶
一旦發現可疑用戶,就要馬上將其鎖定,例如上面執行“w”命令後發現nobody用戶應該是個可疑用戶(因為nobody默認情況下是沒有登錄權限的),於是首先鎖定此用戶,執行如下操作:
[root@server ~]# passwd -l nobody
鎖定之後,有可能此用戶還處於登錄狀態,於是還要將此用戶踢下線,根據上面“w”命令的輸出,即可獲得此用戶登錄進行的pid值,操作如下:
[root@server ~]# ps -ef"grep @pts/3
531 6051 6049 0 19:23 ? 00:00:00 sshd: nobody@pts/3
[root@server ~]# kill -9 6051
這樣就將可疑用戶nobody從線上踢下去了。如果此用戶再次試圖登錄它已經無法登錄了。
3.通過last命令查看用戶登錄事件
last命令記錄著所有用戶登錄系統的日誌,可以用來查找非授權用戶的登錄事件,而last命令的輸出結果來源於/var/log/wtmp文件,稍有經驗的入侵者都會刪掉/var/ log/wtmp以清除自己行踪,但是還是會露出蛛絲馬跡在此文件中的。
三、查看系統日誌
查看系統日誌是查找攻擊源最好的方法,可查的系統日誌有/var/log/messages、/var/log/secure等,這兩個日誌文件可以記錄軟件的運行狀態以及遠程用戶的登錄狀態,還可以查看每個用戶目錄下的.bash_history文件,特別是/root目錄下的.bash_history文件,這個文件中記錄著用戶執行的所有歷史命令。
四、檢查並關閉系統可疑進程
檢查可疑進程的命令很多,例如ps、top等,但是有時候只知道進程的名稱無法得知路徑,此時可以通過如下命令查看:
首先通過pidof命令可以查找正在運行的進程PID,例如要查找sshd進程的PID,執行如下命令:
1 2 [root@server ~]# pidof sshd 13276 12942 4284
然後進入內存目錄,查看對應PID目錄下exe文件的信息:
1 2 [root@server ~]# ls -al /proc/13276/exe lrwxrwxrwx 1 root root 0 Oct 4 22:09 /proc/13276/exe -> /usr/sbin/sshd
這樣就找到了進程對應的完整執行路徑。如果還有查看文件的句柄,可以查看如下目錄:
[root@server ~]# ls -al /proc/13276/fd
通過這種方式基本可以找到任何進程的完整執行信息,此外還有很多類似的命令可以幫助系統運維人員查找可疑進程。例如,可以通過指定端口或者tcp、udp協議找到進程PID,進而找到相關進程:
1 2 3 4 5 6 7 8 9 [root@server ~]# fuser -n tcp 111 111/tcp: 1579 [root@server ~]# fuser -n tcp 25 25/tcp: 2037 [root@server ~]# ps -ef|grep 2037 root 2037 1 0 Sep23 ? 00:00:05 /usr/libexec/postfix/master postfix 2046 2037 0 Sep23 ? 00:00:01 qmgr -l -t fifo -u postfix 9612 2037 0 20: 34 ? 00:00:00 pickup -l -t fifo -u root 14927 12944 0 21:11 pts/1 00:00:00 grep 2037
在有些時候,攻擊者的程序隱藏很深,例如rootkits後門程序,在這種情況下ps、top、netstat等命令也可能已經被替換,如果再通過系統自身的命令去檢查可疑進程就變得毫不可信,此時,就需要藉助於第三方工具來檢查系統可疑程序,例如前面介紹過的chkrootkit、RKHunter等工具,通過這些工具可以很方便的發現系統被替換或篡改的程序。
五、檢查文件系統的完好性
檢查文件屬性是否發生變化是驗證文件系統完好性最簡單、最直接的方法,例如可以檢查被入侵服務器上/bin/ls文件的大小是否與正常系統上此文件的大小相同,以驗證文件是否被替換,但是這種方法比較低級。此時可以藉助於Linux下rpm這個工具來完成驗證,操作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@server ~]# rpm -Va ....L... c /etc/pam.d/system-auth S.5..... c /etc/security/limits.conf S.5....T c /etc/sysctl.conf S.5....T /etc/sgml/docbook-simple.cat S.5....T c /etc/login.defs S.5..... c /etc/openldap/ldap.conf S.5....T c /etc/sudoers ..5....T c /usr/lib64 /security/classpath.security ....L... c /etc/pam.d/system-auth S.5..... c /etc/security/limits.conf S.5..... c /etc/ldap.conf S.5....T c /etc/ssh/sshd_config
對於輸出中每個標記的含義介紹如下:
S 表示文件長度發生了變化
M 表示文件的訪問權限或文件類型發生了變化
5 表示MD5校驗和發生了變化
D 表示設備節點的屬性發生了變化
L 表示文件的符號鏈接發生了變化
U 表示文件/子目錄/設備節點的owner發生了變化
G 表示文件/子目錄/設備節點的group發生了變化
T 表示文件最後一次的修改時間發生了變化
如果在輸出結果中有“M”標記出現,那麼對應的文件可能已經遭到篡改或替換,此時可以通過卸載這個rpm包重新安裝來清除受攻擊的文件。
不過這個命令有個局限性,那就是只能檢查通過rpm包方式安裝的所有文件,對於通過非rpm包方式安裝的文件就無能為力了。同時,如果rpm工具也遭到替換,就不能通過這個方法了,此時可以從正常的系統上複製一個rpm工具進行檢測。
對文件系統的檢查也可以通過chkrootkit、RKHunter這兩個工具來完成,關於chkrootkit、RKHunter工具的使用,下次將展開介紹。

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口: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月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

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年4月16日 星期三

.NET LINQ 查詢太陽花水果

下午我在開發公司的產品系統,遇到一些 LINQ Lamba 動態查詢的需求(這個議題,我擇天會寫一篇專文介紹),所以先介紹一下LINQ Query,作為.NET程式設計師(不論是寫C#或VB)都應該知道LINQ查詢語言,而它也是我開發.NET數年最愛的技術之一,因為它的各種內部演算法都已由微軟實作好,通常我都會用 Lambd Expression 或 LINQ Query,如以下語法:
我們先建立 水果清單 …
有 香蕉、蘋果、芒果、香瓜、太陽花(今年台灣的名產)
   1: //建立水果清單



   2:            List<Fruit> Fruits = new List<Fruit>() 



   3:            { new Fruit { Id = 1, Name = "香蕉", Desc = "香蕉" }



   4:            , new Fruit { Id = 2, Name = "蘋果", Desc = "蘋果" }



   5:            , new Fruit { Id = 3, Name = "芒果", Desc = "芒果" }



   6:            , new Fruit { Id = 4, Name = "香瓜", Desc = "香瓜"}



   7:            , new Fruit { Id = 5, Name = "太陽花", Desc = "太陽花,是香蕉的一種^^"}



   8:            };




如果我想找出水果名有 “果”字的,我會用以下兩種方式

第一種 Lamba Expression


   1: //第一種 Lamba Expression



   2: var fruitResult1 = Fruits.Where(t => t.Name.Contains("果"));



第二種,LINQ Query (類似 SQL Style)

   1: //第二種,LINQ Query (類似 SQL Style)



   2:      var fruitResult2 = (from f in Fruits



   3:                          where f.Name.Contains("果")



   4:                          select f);




我們把結果列印至營幕


   1: //找出水果名有 “果”字的,我會用以下兩種方式



   2:           //第一種 Lamba Expression



   3:           var fruitResult1 = Fruits.Where(t => t.Name.Contains("果"));



   4:  



   5:           //Print search result to screen



   6:           Console.WriteLine("第一種 Lamba Expression");



   7:           foreach (Fruit fruit in fruitResult1)



   8:               Console.WriteLine(fruit.Name);



   9:  



  10:           //第二種,LINQ Query (類似 SQL Style)



  11:           var fruitResult2 = (from f in Fruits



  12:                               where f.Name.Contains("果")



  13:                               select f);



  14:  



  15:           Console.WriteLine();



  16:  



  17:           //Print search result to screen



  18:           Console.WriteLine("第二種,LINQ Query (類似 SQL Style)");



  19:           foreach (Fruit fruit in fruitResult2)



  20:               Console.WriteLine(fruit.Name);



  21:  



  22:           //Wait press any key



  23:           Console.ReadLine();




image


這樣很快的得到我們要的正確結果。


那麼如果有找出太陽花水果呢?


…..各位知道如何寫這段查詢語法吧?




   1: var fruitResult3 = Fruits.Where(t => t.Desc.Contains("太陽花"));



   2:           Console.WriteLine(" 查詢結果。。。今天程式寫累了。。");



   3:           foreach (Fruit fruit in fruitResult3)



   4:               Console.WriteLine(fruit.Name);



image