跳到主要內容

發表文章

目前顯示的是 11月, 2019的文章

[ASP.NET] 網站架構MVC是什麼?

近十年網站設計領域最火的架構就是MVC模式,MVC是什麼? 其實MVC是一種軟體架構模式,把程式分成三個部分來分別開發、聯繫。最早是在西元1978年的阿公時代被提出的,近代被發現很適用於網站運作的模式,所以被拿來用在網站開發。 網路上有許多MVC的介紹,所以這裡話不多說,就直接介紹重點觀念就好~ V iew (視圖) - 介面設計人員進行圖形介面設計。 C ontroller (控制器)- 負責轉發請求,對請求進行處理。 M odel (模型) - 程式設計師編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。 簡單來說,可以想像成我們的程式從外(與外界溝通)到內(對內的資料處理)分別是: View→Control→Model 外界要與我們程式溝通一般來說是透過View這個介面來進行,而View會將外界的操作經過轉換整理,透過Controller提供的功能接口進行後續動作,若Controller的動作需要存取資料庫的資料,則會透過Model所提供的介面,進行資料存取。 OK,這樣就是一個基本的MVC架構的觀念了,接下來針對ASP.NET來說明MVC在實際source code是怎麼運作的: 以Visual Studio 2017建立一個ASP.NET Core的專案,可以看見專案預設會建好View、Controller、Model的資料夾,很直觀的,在view資料夾下就是放置網頁的檔案,controller下的檔案就是提供各種的API function供網頁端進行叫用,而Model下的就是Database的欄位對應的定義,提供讓controller進行資料庫存取用。 下面舉例在實際運作時會是什麼情況: 1. 透過瀏覽器(EX. Chrome、IE)開啟網站首頁(Home): 流覽器(client)透過網址(http url)連到網站(server),網站解析網址後發現是一個網頁,而後將網頁(html、javascript、jquery、css)回傳給流覽器(client),流覽器再將網頁檔案顯示在client端的視窗上。 2. 網頁上需要顯示網站資料: 在流覽器將網頁檔案顯示在client端的視窗上後,遇到要取得網站資料的情況時,流覽器發送http request給網

[Python] 用 Python + tkinter 建立第一個Windows應用程式

在Windows環境下要用Python開發帶有UI的應用程式,最快的方式就是使用Python內建的UI程式庫 - Tkinter。(關於Tkinter的相關背景知識可以在google搜尋"wiki Tkinter") 以下直上程式碼範例來看如何建一個Python + Tkinter的程式吧! (本範例程式是在Python3.7.3環境中執行) 在程序最初先建立一個application class,然後在main的一開始產生application物件: # coding=UTF-8 import tkinter import socket #for sockets import sys #for exit import os class Application(tkinter.Frame): # Application构造函数,master为窗口的父控件 def __init__(self, master=None): # 初始化Application的Frame部分 tkinter.Frame.__init__(self, master) # 显示窗口,并使用grid布局 self.grid() # 创建控件 self.createWidgets() self.master.protocol("WM_DELETE_WINDOW", self.on_closing) def createWidgets(self): def on_closing(self): app.master.destroy() app = Application() app.master.title("WaferCheckApp") app.master.geometry('800x600') app.master.protocol("WM_DELETE_WINDOW", on_closing) app.mainloop() app.mainloop() 就進入主循環裡,程序會執行a

[ASP.NET] 簡介ASP.NET 的進化史

在網站開發的領域,ASP.NET絕對是站有一席之地。Terry在這些年承接的網站開發的案子中,大多數的大公司都是接受甚至是指定要以ASP.NET進行開發的。 本篇簡單介紹一下ASP.NET的發展演進的過程和一些基本的觀念: ASP.NET 是自 2002 年一月推出的一套網頁開發框架,早期只有 ASP.NET Web Form 架構,直到 2009 年推出以 MVC 為主的開發框架 ( ASP.NET MVC 1.0 ),後續微軟在 2014推出ASP.NET 5 (新一代從頭開始打造的 ASP.NET 核心功能) ,2016 推出 ASP.NET Core (基於 ASP.NET 5 的更名),直到現在。 版本種類: 目前已推出的 ASP.NET 版本 ASP.NET 1.0 ( 2002-1-16 ) ASP.NET 1.1 ASP.NET 2.0 ASP.NET 3.5 ASP.NET 4.0 ASP.NET 4.5 ASP.NET 4.6 ASP.NET 4.7 ASP.NET 4.8 ( 2019-4-18 ) 目前已推出的 ASP.NET MVC 版本 ASP.NET MVC 1.0 ( 2009-3-13 ) ASP.NET MVC 2.0 ASP.NET MVC 3.0 ASP.NET MVC 4.0 ASP.NET MVC 5.2  ( 2014-12-25 ) 目前已推出的 ASP.NET Core 版本 2014/05/12 ASP.NET 5  2014/07/06 ASP.NET 5 Alpha2 2014/08/17 ASP.NET 5 Alpha3 2014/10/07 ASP.NET 5 Alpha4 2014/11/12 ASP.NET 5 Beta1 2015/01/14 ASP.NET 5 Beta2 2015/03/13 ASP.NET 5 Beta3 2015/05/01 ASP.NET 5 Beta4 2015/06/30 ASP.NET 5 Beta5 2015/07/27 ASP.NET 5 Beta6 2015/09/02 ASP.NET 5 Beta7 2015/10/15 ASP.NET 5 Beta8 2015/11/1

[ASP.NET] 部署ASP.NET到Server主機上

部署 ASP.NET 到自有的實體 Server 此處紀錄實際部署 ASP.NET 到自有的實體 Server 的案例,不同的軟體系統和開發的軟體版本可能會有操作上的差異。因此以下以案例的方式描述,請參考並搭配實際情況進行安裝。 案例一 開發環境 作業系統: Win 7 開發軟體; Visual Studio 2013 / ASP .NET MVC 4 / SQL Server Data Tools Server 環境 作業系統: Win 7 安裝套件: .NET framework 4.5 設定流程 1.       安装 WIN7 的 IIS 功能 IIS 預設是沒有開啟的,要手動安裝 IIS : 「控制台 -> 程式集 -> 程式和功能 -> 開啟或關閉 Windows 功能」 將 [Internet Information Service] 選項打勾, 並到 [World Wide Web 服務 ] 項目下確認所有項目打勾 。 測試在瀏覽器網址輸入 http://127.0.0.1(localhost) 成功應該會看見 IIS 歡迎畫面,這是你的主機首頁 現在你的電腦已經是個網頁伺服器, 而 預設 網頁存放的目錄是 C:\Inetpub\wwwroot ,接下來要試著將子己開發的 ASP .NET MVC 4 專案透過 IIS 部署到網站上。 2.       將 ASP .NET MVC 4 專案打包發佈 在你的專案右鍵 à [Publish] 在“配置文件”阶段,选择新建配置文件 在“连接”阶段,“发布方法”下拉列表中选择“文件系统”选项,“目标位置”根据自己的需求选择一个本地路径: 在“设置”阶段, " 配置”选择“ Release" 。 最后,在“预览”阶段点击“发布”。 此時你的 ASP .NET MVC 4 專案已經打包至你所設定的目標位置。 3.       透過 IIS 管理介面建立網站 點 windows START 輸入 IIS ,開啟主控台 點選左方欄位的 [ 站台 ] ,點選

[Python] 將運作過程的debug message紀錄到log file的功能

軟體在運作過程難免會遇到一些非預期的狀況讓程式掛點或是種種的不正常行為,這時候往往案發現場不能保留,很多的線索都在重新啟動軟體後消失了。若軟體的行為是要與其他軟體進行交互的,那就更難找出問題了。 所以把軟體運作過程中重要的階段記錄下來是很重要的事,一方面自己軟體的bug可以很快找到觸發的點,另一方面若是別人的軟體造成我們的軟體掛點,log也可以幫助我們提出證據來澄清,不讓別人冤枉我們。 1. 新增一個save log的function: def saveLog(self, data): currentDirectory = os.getcwd() print(currentDirectory) filePath = '%s\\Log.txt' % (currentDirectory) try: if os.path.exists(filePath): fileSize = os.path.getsize(filePath) print(fileSize) if fileSize > 50000000:#50MB os.remove(filePath) else: print('Log file does not exists') except: print("Error while deleting Log file ", filePath) return try: file = open(filePath, 'a+') file.write('%s\n' % (data)) file.close() except IOError: print('Delete Log error!!&#

[Python] 管理多個執行緒(thread)的運作與結束

在開發應用程式中,幾乎所有的專案都會用到thread,不同的程式語言有不同˙的叫用方法,但都大同小異。Thread的使用上最重要的不是在產生一個thread,而是如何結束一個thread,或是如何結束好幾個threads,以下介紹在Python中如何叫用並管理一或多個thread: 一般來說,create thread如下: def job(): while 1: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣可以開始一個thread執行job()中的動作,但若job中的迴圈是如上範例的無限迴圈,必須要加上能讓其退出的機制: stopped = 0 def job(): global stopped while stopped == 0: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣在主程序先將stopped設成1,再調用 thread.join() 就可以將thread完整關閉並釋放記憶體空間。 多執行續的處理: 基於這樣的方式,下面是進化版本,創建一個thread專用的class,並同時處理多個thread的執行與結束: class EventHandleThread (threading.Thread): def __init__(self, fun, name): threading.Thread.__init__(self) self.name = name self.fun = fun self.stopped = [0] def run(self): self.fun(self.name, self.stopped) print ("Exiting "

[Python] 解決UI更新速度太慢,影響執行速度的快速解法 !!

有用過Python開發UI的人應該都知道,Python的UI更新速度很慢,不是一般的慢,是超級慢。慢到時麼程度呢?大概就是你如果寫一個for迴圈更新比如20個Entry元件的文字顯示,會在UI上清楚的看到20個元件依序被刷新的畫面,20個更新完大概要1到2秒吧。 這樣的速度在有些需要即時反映且更新頻繁的案子上就會被客戶打槍了,因此有一個小方法雖然不能改變Python在UI上的更新速度,但至少可以不讓UI更新速度影響工作的進行 (UI它慢就慢,但我程序還是一樣照跑照跳)。 解法就是: 產生一個thread專門負責UI介面上的更新 我們在程式運作一開始,就先產生兩個thread,一個負責程序的進行,一個負責UI的更新。 來看source code: class EventHandleThread (threading.Thread):     def __init__(self, fun, name):         threading.Thread.__init__(self)         self.name = name         self.fun = fun         self.stopped = [0]     def run(self):         self.fun(self.name, self.stopped)         print ("Exiting " + self.name)     def stop(self):         self.stopped[0] = 1 #用來傳遞內容的Queue and Lock m_queueLock = threading.Lock() m_workQueue = queue.Queue(30) #UI thread的運作function def UiHandleLoop(self, name, stopped):         global m_queueLock , m_workQueue          print ('UiHandleLoop - Start')         while stopped[0] == 0:             m_queueLock

[Python] 自己製作文字設定檔config file,動態調整程式設定

在軟體開發中,通常不會知道實際使用行為有那些與原先預期不一樣的情況,這時如果還要針對特定的不同需求改程式是很吃力不討好的事情。所以我們常常會需要能夠動態調整一些設定,以應付不同的使用情況。 下面以Python提一個簡單的方法來動態調整程式設定: 建立一個function,在程式初始化時呼叫: EX: def initialSetting():         try:             currentDirectory = os.getcwd()             filePath = '%s\\ ToolSet.cfg ' % (currentDirectory)             file = open(filePath, 'r')             for line in file.readlines():                 if line.find("Value1") == 0:                     str1 = int(line[7:-1])                 elif line.find(" Value2 ") == 0:                      str2  = int(line[7:-1])                 elif line.find(" Value3 ") == 0:                      str3  = int(line[7:-1])             file.close()         except IOError:             print('Config file error!!') 此function會在對應路徑下讀取 ToolSet.cfg 檔案,一次一行的讀取字串進行判斷,ToolSet.cfg就是文字檔,內容如下: EX: Value1=hello world Value2 =test content Value3 =have a nice day 如此就會得到str1 = he