2017年4月8日 星期六

設計模式學習紀錄 - 複用、擴展性、易維護


目前正在攻讀程杰老師的大話設計模式  ,實在非常推薦假日閒暇之餘研讀(若覺得自己寫的程式又臭又長又難維護,這本書真心推薦必買阿...便宜又大碗 ),並依照書本範例所了解的內容做些筆記紀錄 ,若有觀念錯誤的地方也麻煩各位前輩指點,小弟感激不盡!



舉例情境 :  老闆要求使用VB.NET設計一個簡單的WinForm計算機程式

以我過去大學中所應付作業的方式,我會選擇使用IF...ELSE Statement以及所有的操作介面邏輯以及運算邏輯全部寫在同一個Class內,這部分沒有問題,程式也能正常運作,但是工作後我才了解到程式沒有寫完的一天(就算寫完了也要進行維護,就算維護性尚可但也難保老闆會追加新功能,若追加新功能時能夠確保不影響到程式正常運作嗎?)
如果我照著我以前傳統式的方式寫程式我會有加不完的班、修不完的Bug、以及睡不了的覺......。

看書之後以目前腦袋所能理解的範圍歸納出,在設計時需要考慮到
  • 擴展性是否良好?  (若老闆要求加上其他功能,舉例: 開根號的計算 、則因只需要增加某些功能而必須將整個類別重新編譯一次)
  • 是否容易維護 ?  (若系統功能越多、越複雜、則系統就會變得不易維護)
  • 是否能複用(重複使用)? (若老闆需要你設計WebForm的計算機程式、程式是否又要重寫一次)
若依我以前的做法全部寫在同一個Class內,擴展性差、不易維護、無法複用
那要如何達到易維護、擴展性佳且能夠複用呢?

  • 複用:  將業務邏輯以及介面邏輯明確的切開,並提取業務邏輯成為一個獨立類別(當WinForm移植到WebForm上,只需要將介面邏輯重新設計,提取出的業務邏輯也能夠直接套用在WebForm上 (屬於同一個.NET Framework下) 這樣就達到了複用的效果了 )。
  • 易維護、擴展性佳 : 目前已將業務邏輯切開成為一個獨立類別,所有的演算邏輯皆使用該類別的某一個方法,但若是需要增加新的功能,勢必需要將新的演算邏輯加入類別方法內、再加入新的演算邏輯時,無法保證修改時不影響到其他功能(緊耦合)、所以需要將這個獨立類別再進行細分(鬆耦合)若往後有新增加的功能時只要針對該演算邏輯設計,不會影響到其他已設計好的演算邏輯,進而達到容易擴展以及方便維護的功能)。
簡易計算機程式UML類別圖:















設計前先思考有哪一些共用的方法或是屬性,並將他們提取(分離)出來
以簡單的四則運算例子來說
每種運算都有包含兩種屬性,例如
加法 : 加數被加數
減法 : 減數被減數
乘法 : 乘數被乘數
以此類推,會發現可以用兩個變數儲存,再利用物件導向的繼承特性
子類別能夠存取父類別的非Private(Public、Protected修飾子)屬性方法
好處在於可以重複使用(reuse)父類別內的屬性而不必在每一個子類別重新宣告,
但每一種四則運算子類別的演算方法的實作方式都是不同的(加法、減法、乘法、除法),也因為繼承的關係,能夠存取父類別內的方法,但要如何在每個類別內使用同一個運算方法名稱但內部實作的方式不同呢?,此時就能將父類別的方法加上Overridable修飾子 ,當子類別繼承時,就能夠將父類別內的方法進行改寫,實作自身類別的運算方法。


下列為按照書本內教學,並且自身練習時的Code

簡易四則運算父類別

Public Class Operation
    '''     
    ''' 簡易四則運算父類別
    '''     
    ''' 
    ''' 
    Public Class Operation
        
        Public NumberA As Double = 0
        Public NumberB As Double = 0

        ''' 
        ''' 在衍生類別內改寫此方法
        ''' 
        ''' 
        ''' 
        Public Overridable Function GetResult() As Double

        End Function

    End Class


簡易四則運算子類別


    ''' 
    ''' 加法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationAdd
        Inherits Operation

        ''' 
        ''' 改寫GetResult方法
        ''' 
        ''' 
        ''' 
        Public Overrides Function GetResult() As Double
            Return NumberA + NumberB
        End Function


    End Class

    ''' 
    ''' 減法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationSub
        Inherits Operation

        ''' 
        ''' 改寫GetResult方法
        ''' 
        ''' 
        ''' 
        Public Overrides Function GetResult() As Double
            Return NumberA - NumberB
        End Function
    End Class

    ''' 
    ''' 乘法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationMul
        Inherits Operation

        Public Overrides Function GetResult() As Double
            Return NumberA * NumberB

        End Function
    End Class

    ''' 
    ''' 除法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationDiv
        Inherits Operation

        Public Overrides Function GetResult() As Double
            Return NumberA / NumberB
        End Function
    End Class






















2015年11月18日 星期三

Cisco 上傳IOS筆記

1.打開超級終端機(連結檔案內包含Catalyst 3750 SERIES的IOS檔案)Image 3

 

Image 5

Image 6

Image 7

Image 8

Image 9

Image 10

終端機必須與設備的BAUD RATE必須一樣(預設Switch 是9600)

Image 2

 

在輸入switch:後輸入

flash_init

copy xmodem: flash:c2950-i6q4l2-mz.121-14.EA1a.bin

之後會出現CCCC的字樣

點選Transfer –>Send file –>選擇IOS位置 -> Protocol : 選擇xmodem

預設9600會很慢,可以將Buad rate更改到115200

方法請參照:http://chenerich.blogspot.tw/2010/04/catalyst-3750-ios-recovery.html

Image 11

Image 13

 

 

假設之前IOS把BAUD RATE改成115200

上傳IOS成功之後,設備的BAUD還是115200

可以用

  • 暫時將Baud rate改回9600的方法是

    switch#configure terminal
    switch(config)#line con 0
    switch(config-line)#speed 9600
    switch(config-line)#end

  • 永久設定BAUD Rate

先將Switch斷電,按下switch上的mode鍵

等數秒之後放開,在輸入flash_init

在輸入set BAUD 9600

在輸入flash_init 就會進行套用

從開機就會生效了

2015年11月15日 星期日

[路由協定]RIP路由協定

協定簡介

  • Routing Information Protocol就是RIP
  • 使用Distance Vector路由演算法
  • 有三種版本RIPv1RIPv2以及RIPng(主要針對IPv6)
  • 選擇最佳路由的標準(Metric)是由Hop Count(經過的設備數目)
  • 所有的路由器設備每隔30秒會互相傳送路由資訊的更新
  • 一條網路路徑最多只能允許經過15個路由器設備
  • 支援Load Balancing功能
RIPv1路由協定屬於Classful路由協定,所以RIPv1路由協定無法支援VLSM(Variable-Length Subnet Mask)RIPv1路由協定不會傳送子網路遮罩,RIPv1是使用廣播的方式(發給周圍的路由器)傳送路由資訊的更新

RIPv2路由協定屬於Classless的路由協定,支援VLSM,所以RIPv2路由協定會在更新路由資訊時傳送子網路遮罩,RIPv2路由協定則使用群播(Multicast)的方式來傳送,其所使用的群播位址是224.0.0.9。

兩種版本的路由協定不管對方Router有無啟動RIP路由協定,都會發出RIP封包,有啟動就進行路由資訊的更新,沒有則丟棄封包。



  RIPv1 RIPv2
路由類型 Classful Classless
支援VLSM
傳送子網路遮罩
傳送路由更新資訊的方式 廣播 群播
     


2015年11月1日 星期日

[Hadoop] 使用Hive Web Interface

對於一些使用CLI介面,不太習慣的人

可以嘗試使用HWI(Hive Web Interfave縮寫)去做查詢,分析的動作

Hadoop版本:2.2.0
HIVE版本:0.13.0


HIVE主程式:apache-hive-0.13.0-bin.tar.gz
(以下apache-hive-0.13.0-src以你的版本檔案名稱為準)


1.
lib裡面沒有hive-hwi-0.13.0.war檔案,所以要下載apache-hive-0.13.0-src.tar.gz,解壓縮後, 將apache-hive-0.13.0-src/hwi/web內的所有檔案進行壓縮,壓縮格式選擇 .war,壓縮好之後丟入apache-hive-0.13.0/lib 內

壓縮war格式的指令:jar -cvf hive-hwi-0.13.0.war ./*
(指令意思:將目前目錄底下所有檔案進行war壓縮,檔案名稱為hive-hwi-0.13.0.war,顯示詳細資訊)

2.安裝Apache Ant,並將該資料夾位置設定成環境變數(Ant資料夾我放置再/opt下)
修改vi /etc/profile

增加環境變數
export ANT_HOME=/opt/ant
export ANT_LIB=/opt/ant/lib
export PATH=$PATH:/opt/ant/bin

執行 ant -v 驗證,使否正常安裝

jar 命令參數:
                           -c   建立war壓縮檔
                           -v   顯示詳細過程
                           -f   指定 JAR文件名,通常这个参数是必须的
                           -M  不產生所有項目的文件(MANIFEST〕,此參數會忽略 -m參數
                           -0   數字,參數意思是指打包,不壓縮

3.修改Hive內的hive-site.xml


4.在主程式內的lib確定有以下5個函式庫,
  • ant.jar
  • ant-launcher.jar
  • jasper-compiler-5.5.23.jar.zip
  • jasper-runtime-5.5.23.jar
  • tools.jar (此為你JDK內lib目錄底下的tools.jar,如果沒有新增進來出現錯誤)








最後下指令 hive --service hwi啟動HWI介面


再瀏覽器輸入http://192.168.2.150:9999/hwi/index.jsp


參考網站:http://cyxinda.blog.163.com/blog/static/36596186201451115050438/


2015年5月23日 星期六

「解決方法」使用USB安裝ubuntu過程出現Fail to copy file from CD-ROM

出現錯誤訊息Fail to copy file from CD-ROM

按下ALT+F2進入到文字介面
輸入mkdir /cdrom
輸入mount -t vfat /dev/sdb /cdrom  

/devsdb是你的USB裝置 而CDROM是我們要掛載上去的裝置

之後ALT+F1回到圖形介面繼續安裝!

2015年4月23日 星期四

[Raspberry Pi 2 ModelB] 無線網路常常斷線解決方法

無線網卡: EDIMax 的 EW-7811Un。
 

1.檢查網路配置(/etc/network/interfaces)

以下是我的配置

將 eth0 有關的部分註解起來,如果沒有之後無法正常從其他裝置 ping、ssh 到 Raspberry Pi,因此將 eth0 隱藏後就可以正常執行了。

2.為了要使raspberry pi  不要進入省電或自動將無線網路關掉

/etc/network/interfaces

加上一行
wireless-power off

修改   /etc/kbd/config 
將 BLANK_TIME= 改為 BLANK_TIME=0 
和 POWERDOWN_TIME=  改為  POWERDOWN_TIME=0

 

3.putty ssh 連線閒置不斷線設定

在 Connection
Seconds between keppalives 打 5 (每5秒送1個封包)
並在底下有一個 Enable TCP keepalives ..... ,打勾它就好

2014年6月13日 星期五

[Linux]SSH無法連線的幾個原因

確認IP為真實IP或是已經將分享器Port轉向你之後
如果還不能登入有以下幾點可能性

1.檢查防火牆有無關閉=>(ufw disable)    

2.檢查網路是否正常能夠對外連線 ping 8.8.8.8

3.檢查/etc/hosts.allow 和/etc/hosts.deny內的設定是否有IP被拒絕連線


.....
待整理