facebook廣告





123

2016年9月16日 星期五

instanceof-判斷物件繼承關係的小指令

JAVA有個判斷用繼承關係方法instanceof 如下
public isParent(Object object){
     if(object instanceof ArrayList){
          //object!你老爸是ArrayList啦!

     } else{
          //object!你老爸不是ArrayList,別亂認老爸!!!!

     }
}
以下是備份別人的
以下是抄來的
Java提供了instanceof作為判別類別間繼承關係之用,如果要判定的物件為該類別或該類別的子類別則傳回true,否則傳回false。需特別注意的是,物件與類別間要有繼承關係,否則會有compile error,如錯誤狀況1、2。
在Java裡有個特別規定,就是任何陣列都繼承Object,所以類別陣列將繼承Object和Object[],一般型別陣列則會繼承Object,但是一般型別不是物件,所以一般型別陣列不會繼承Object[]。
範例程式:
class myBase1 { }
class myBase2 extends myBase1 { }

public class myInstanceof extends myBase2 {
  public static void main(String[] args) {
    myBase1 b1 = new myBase1();
    myBase2 b2 = new myBase2();
    myInstanceof i1 = new myInstanceof();

    if (i1 instanceof myBase1) {
      System.out.println("i1是myBase1的後代");
    }
    else {
      System.out.println("i1不是myBase1的後代");
    }

    if (b1 instanceof myInstanceof) {
      System.out.println("b1是myInstanceof的後代");
    }
    else {
      System.out.println("b1不是myInstanceof的後代");
    }

    if (null instanceof myBase1) {
      System.out.println("null是myBase1的後代");
    }
    else {
      System.out.println("null不是myBase1的後代");
    }

    myBase2[] b2array = new myBase2[10];

    if (b2array instanceof Object) {
      System.out.println("b2array是Object的後代");
    }
    else {
      System.out.println("b2array不是Object的後代");
    }

    if (b2array instanceof Object[]) {
      System.out.println("b2array是Object[]的後代");
    }
    else {
      System.out.println("b2array不是Object[]的後代");
    }

    int[] i = new int[10];
    if (i instanceof Object) {
      System.out.println("i是Object的後代");
    }
    else {
      System.out.println("i不是Object的後代");
    }

    /*
    //錯誤狀況1
    if (i instanceof Object[]) {
      System.out.println("i是Object[]的後代");
    }
    else {
      System.out.println("i不是Object[]的後代");
    }

    //錯誤狀況2
    Long lng = new Long(10);
    if (lng instanceof String) {
      System.out.println("lng是String的後代");
    }
    else {
      System.out.println("lng不是String的後代");
    }
    */
  }
}
執行結果:
i1是myBase1的後代
b1不是myInstanceof的後代
null不是myBase1的後代
b2array是Object的後代
b2array是Object[]的後代
i是Object的後代
錯誤狀況1:
"myInstanceof.java": Error #: 365 : cannot compare int[] with java.lang.Object[]
錯誤狀況2:
"myInstanceof.java": Error #: 365 : cannot compare java.lang.Long with java.lang.String

理解Activityの不得不說的Context

在開發Android的過程中,總是能遇見Context類或者它的實例。Context類的實例經常被用來提供“應用程序”的引用。例如下面的代碼片段,Toast類的第一個參數接受一個Context對象:

[java]
@Override 
    protected Dialog onCreateDialog(int id) { 
        switch (id) { 
        case 0:              Builder builder = new AlertDialog.Builder(this);              builder.setIcon(R.drawable.ic_launcher);              builder.setTitle("This is a dialog with some simple text...");              builder.setPositiveButton("OK",                      new DialogInterface.OnClickListener() {                          public void onClick(DialogInterface dialog,                                 int whichButton) {                             Toast.makeText(getBaseContext(), "OK clicked! ",                                      Toast.LENGTH_SHORT).show();                          }                     });              builder.setNegativeButton("Cancel",                      new DialogInterface.OnClickListener() {                          public void onClick(DialogInterface dialog,                                 int whichButton) {                             Toast.makeText(getBaseContext(), " Cancel clicked!",                                      Toast.LENGTH_SHORT).show();                          }                     });              builder.setMultiChoiceItems(items, itemsChecked,                      new DialogInterface.OnMultiChoiceClickListener() {                         public void onClick(DialogInterface dialog, int which,                                  boolean isChecked) {                              Toast.makeText (                                     getBaseContext(),                                     items[which]                                             + (isChecked ? " checked!"                                                     : " unchecked!"),                                      Toast.LENGTH_SHORT).show();                          }                     });              return builder.create();          }          return null;      }  @ Override    protected Dialog onCreateDialog(int id) {         switch (id) {        case 0:









































            Builder builder = new AlertDialog.Builder(this);
            builder.setIcon(R.drawable.ic_launcher);
            builder.setTitle("This is a dialog with some simple text...");
            builder.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                            Toast.makeText(getBaseContext(), "OK clicked!",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
            builder.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                            Toast.makeText(getBaseContext(), "Cancel clicked!",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
            builder.setMultiChoiceItems(items, itemsChecked,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog, int which,
                                boolean isChecked) {
                            Toast.makeText(
                                    getBaseContext(),
                                    items[which]
                                            + (isChecked ? " checked!"
                                                    : " unchecked!"),
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
            return builder.create();
        }
        return null;
    }
    然而,Toast類並沒有直接用在Activity中,它被用在了AlertDialog類中。所以,這裡需要通過getBaseContext()方法獲取一個Context類的實例。
    在Activity中動態地創建一個視圖的時候也會遇見Context。例如,如果想通過硬編碼動態地創建一個TextView:

[java]
TextView tv = new TextView(this); 
TextView tv = new TextView(this); TextView的構造器接受一個Context對象,因為Activity類是Context類的子類,所以可以用this關鍵字來代替這個Conext對象。

提示:
    使用this動態地創建視圖,例如TextView、Button,存在一個潛在的風險——內存洩漏。所以,盡可能地使用getApplicationContext()方法替代this。


正規表示式 Regular Expression

正規表示式說明及範例比對不成立之字串
/a/含字母 “a” 的字串,例如 “ab”, “bac”, “cba”“xyz”
/a./含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac”(若要比對.,請使用 \.)“a”, “ba”
/^xy/以 “xy” 開始的字串,例如 “xyz”, “xyab”(若要比對 ^,請使用 \^)“axy”, “bxy”
/xy$/以 “xy” 結尾的字串,例如 “axy”, “abxy”以 “xy” 結尾的字串,例如 “axy”, “abxy” (若要比對 $,請使用 \$)“xya”, “xyb”
[13579]包含 “1” 或 “3” 或 “5” 或 “7” 或 “9” 的字串,例如:”a3b”, “1xy”“y2k”
[0-9]含數字之字串不含數字之字串
[a-z0-9]含數字或小寫字母之字串不含數字及小寫字母之字串
[a-zA-Z0-9]含數字或字母之字串不含數字及字母之字串
b[aeiou]t“bat”, “bet”, “bit”, “bot”, “but”“bxt”, “bzt”
[^0-9]不含數字之字串(若要比對 ^,請使用 \^)含數字之字串
[^aeiouAEIOU]不含母音之字串(若要比對 ^,請使用 \^)含母音之字串
[^\^]不含 “^” 之字串,例如 “xyz”, “abc”“xy^”, “a^bc”
.
正規表示式的特定字元說明等效的正規表示式
\d數字[0-9]
\D非數字[^0-9]
\w數字、字母、底線[a-zA-Z0-9_]
\W非 \w[^a-zA-Z0-9_]
\s空白字元[ \r\t\n\f]
\S非空白字元[^ \r\t\n\f]
.
正規表示式說明
/a?/零或一個 a(若要比對? 字元,請使用 \?)
/a+/一或多個 a(若要比對+ 字元,請使用 \+)
/a*/零或多個 a(若要比對* 字元,請使用 \*)
/a{4}/四個 a
/a{5,10}/五至十個 a
/a{5,}/至少五個 a
/a{,3}/至多三個 a
/a.{5}b/a 和 b中間夾五個(非換行)字元
.
字元說明簡單範例
\避開特殊字元/A\*/ 可用於比對 “A*”,其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 “\”
^比對輸入列的啟始位置/^A/ 可比對 “Abcd” 中的 “A”,但不可比對 “aAb”
$比對輸入列的結束位置/A$/ 可比對 “bcdA” 中的 “A”,但不可比對 “aAb”
*比對前一個字元零次或更多次/bo*/ 可比對 “Good boook” 中的 “booo”,亦可比對 “Good bk” 中的 “b”
+比對前一個字元一次或更多次,等效於 {1,}/a+/ 可比對 “caaandy” 中的 “aaa”,但不可比對 “cndy”
?比對前一個字元零次或一次/e?l/ 可比對 “angel” 中的 “el”,也可以比對 “angle” 中的 “l”
.比對任何一個字元(但換行符號不算)/.n/ 可比對 “nay, an apple is on the tree” 中的 “an” 和 “on”,但不可比對 “nay”
(x)比對 x 並將符合的部分存入一個變數/(a*) and (b*)/ 可比對 “aaa and bb” 中的 “aaa” 和 “bb”,並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。
xy比對 x 或 y/a*b*/g 可比對 “aaa and bb” 中的 “aaa” 和 “bb”
{n}比對前一個字元 n 次,n 為一個正整數/a{3}/ 可比對 “lllaaalaa” 其中的 “aaa”,但不可比對 “aa”
{n,}比對前一個字元至少 n 次,n 為一個正整數/a{3,}/ 可比對 “aa aaa aaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa”
{n,m}比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數/a{3,4}/ 可比對 “aa aaa aaaa aaaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa” 及 “aaaaa”
[xyz]比對中括弧內的任一個字元/[ecm]/ 可比對 “welcome” 中的 “e” 或 “c” 或 “m”
[^xyz]比對不在中括弧內出現的任一個字元/[^ecm]/ 可比對 “welcome” 中的 “w”、”l”、”o”,可見出其與 [xyz] 功能相反。(同時請注意 /^/ 與 [^] 之間功能的不同。)
[\b]比對退位字元(Backspace character)可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別
\b比對英文字的邊界,例如空格例如 /\bn\w/ 可以比對 “noonday” 中的 ‘no’ ;
/\wy\b/ 可比對 “possibly yesterday.” 中的 ‘ly’
\B比對非「英文字的邊界」例如, /\w\Bn/ 可以比對 “noonday” 中的 ‘on’ ,
另外 /y\B\w/ 可以比對 “possibly yesterday.” 中的 ‘ye’
\cX比對控制字元(Control character),其中 X 是一個控制字元/\cM/ 可以比對 一個字串中的 control-M
\d比對任一個數字,等效於 [0-9]/[\d]/ 可比對 由 “0” 至 “9” 的任一數字 但其餘如字母等就不可比對
\D比對任一個非數字,等效於 [^0-9]/[\D]/ 可比對 “w” “a”… 但不可比對如 “7” “1” 等數字
\f比對 form-feed若是在文字中有發生 “換頁” 的行為 則可以比對成功
\n比對換行符號若是在文字中有發生 “換行” 的行為 則可以比對成功
\r比對 carriage return
\s比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]/\s\w*/ 可比對 “A b” 中的 “b”
\S比對任一個非空白字元,等效於 [^ \f\n\r\t\v]/\S/\w* 可比對 “A b” 中的 “A”
\t比對定位字元(Tab)
\v比對垂直定位字元(Vertical tab)
\w比對數字字母字元(Alphanumerical characters)或底線字母(”_”),等效於 [A-Za-z0-9_]/\w/ 可比對 “.A _!9” 中的 “A”、”_”、”9″。
\W比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]/\W/ 可比對 “.A _!9” 中的 “.”、” “、”!”,可見其功能與 /\w/ 恰好相反。
\ooctal比對八進位,其中octal是八進位數目/\oocetal123/ 可比對 與 八進位的ASCII中 “123” 所相對應的字元值。
\xhex比對十六進位,其中hex是十六進位數目/\xhex38/ 可比對 與 16進位的ASCII中 “38” 所相對應的字元。

Ruby 和 Python 比較

網路上找到一些比較 Python 和 Ruby 的文章
引用:http://monkey-oyster.blogspot.tw/2015/02/ruby-python.html

關於ruby語言 與Rails框架

關於ruby語言 與Rails框架

Ruby,是一個語法簡捷,弱型別且以物件導向為理念的跨平台動態式直譯程式語言,在1995年由日本人松本行弘(Yukihiro Matsumoto)所發行。

松本行弘有感於Perl的強大,但是語法卻不夠漂亮,於是便在Perl概念之上,加入物件導向概念,在1995年正式釋出。
Ruby提供簡潔的語法、完整的物件導向能力,並內建正規表達式(Regular Expression)引擎,在處理文字上有相當優異的表現。
另外像是異常處理機制、自動垃圾收集和可攜性等特性,都是Ruby廣受好評的原因。

Ruby語言可在多種平台上執行,Windows,Mac,Linux皆有可執行環境。並且還發展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的Ruby語言替代品。

Ruby的命名:
    Ruby設計之初部份參考自Perl,因為Perl的發音與6月的誕生石pearl(珍珠)相同,Ruby選擇以7月的誕生石ruby(紅寶石)命名。

Ruby相較之下比其他類似的程式語言(如Perl或Python)年輕,又因為Ruby是日本人發明的,所以早期的非日文資料和程式庫都比較貧乏,這也是對Ruby發展早期關於可參考資料太少最多的批評。

約於2000年,Ruby開始進入美國,英文的資料開始發展。

2004年,RoR框架誕生,Ruby才更加廣為人知,Ruby並於2006年為TIOBE獲選為年度程式語言。

RoR是David Heinemeier Hansson(常被簡稱為DHH)在2004年為了Basecamp專案而開發的架構,後來在2005年12月釋出第一版。

Rails的成功,除了讓DHH被《Wired》雜誌封為地球上最炙手可熱的駭客,重要的是RoR在開發理念上充份發揮Web 2.0的精神,像是內建Prototype[現已更換為jQuery],使得開發人員可以輕鬆開發Ajax,提供使用者豐富的展示層。

由於RoR在開發速度上的優勢,讓使用者為中心、服務為導向的理念得以充分落實。 

Rails的設計原則包括「不做重複的事」(Don't Repeat Yourself)和「慣例優於設定」(Convention Over Configuration)

最新的Rails版本是4.0.0,於2013年6月25日公開。

關於軟體專案的敏捷開發 ( Agile Development)

敏捷開發是一種以人為核心、迭代、循序漸進的開發方法。

在敏捷開發中,軟體項目的構建被切分成多個子項目(模組),各個子項目都具備可擴充和獨立運作的特徵。

換言之,就是把一個大項目分為多個相互聯繫,但也可獨立運行的小項目,並分別完成,在此過程中軟體則仍一直處於可使用的狀態。

為何需敏捷開發?!

說穿了,就是成本問題。開發Delay幾乎是所有軟體專案的家常便飯。如何將開發時間控制在預算時間內,這是所有專案經理最大的挑戰!

RoR框架相當適於敏捷開發專案的應用。

從設計理念上來看RoR,它的特色之一是約定優於配置(Convention Over Configuration),RoR為類別、方法、資料表和欄位,以及專案的目錄結構都採取固定的命名約定,透過這種方法,推斷資料表名稱、物件識別字和主鍵(Primay key)、外部鍵(Foreign Key)等名稱。

不管是開發還是維護工作,只要依循這個法則,程式碼都能保持簡單、輕巧。

另外一個鮮明的特色是DRY(Don't Repeat Yourself),強調開發過程中降低重複性的工作,舉例而言,在RoR的MVC架構中,View可以透過Helper、Partial等方式做到DRY。

RoR是依MVC(Model-View-Controller,資料模型-視圖-控制器)的Model2結構所開發。

MVC架構的觀念始於70年代,目的在減少商業邏輯和表現層之間的耦合,藉由MVC架構,透過Controller控制,可讓表現層獨立存在於View當中,並透過Model處理資料的輸出、入,達到資料、表現層和商務邏輯分離的目的。

Model2則是針對網站架構無狀態(stateless)的情況所作的修正,讓MVC貼近網站實際的運作模式。

RoR的 MVC架構導入了Action Pack,優化了Controller和View之間的整合,Active Record的ORM更是讓開發人員減輕不少工作量。

由於RoR有嚴格的MVC撰寫規範。可維護性高。預設 escape,所有內部含html字元的資料,若未宣告都會被轉譯,有效防止SQL injection。

在Rails中,所有的資料庫的操作都可透過腳本和遷移來完成,Rails中的遷移也是最被稱道的一項功能,當不同的開發者同時在修改一個資料庫,或者您需升級現有的環境下的資料庫,無痛遷移就顯示出它的強大威力。

Rails的高生產力之源:
http://rubygems.org 是 Ruby 社群全新的 RubyGems 官方網站,它也是 RubyGems 套件管理工具預設的搜尋站點。
RubyGems 則是 Ruby 的套件管理工具。它提供了一個標準格式來發佈 Ruby 程式和函式庫,以及提供方便的工具來安裝這些套件。
由於有這個齊全的官方軟體資料庫,更加提升Ruby 與RoR的高生產力。

現在使用Ruby on Rails的知名網站有:

    Twitter 
    Basecamp
    GitHub
    Groupon

    國內:

    techbang.com T客邦
    inside.com.tw 硬塞
    icook.tw 愛料理

Rails的缺點:
Rails雖然是一個非常具有高生產力的開發框架,然而從2.0、3.0到4.0的改版之間,很多程式碼的語法(Syntax)都不斷變動,容易讓初學者混淆,造成學習門檻的提高,這也是Rails較為人所詬病的問題之一。


與其他語言的比較:
php: 
   入門容易,效能運作較佳。
   php佈署成本較低。
   對網站的開發工作而言,PHP已經累積許多資源,例如網頁伺服器的優化、程式的快取機制、與各種資料庫的介接和優化、元件的使用等,這些都是PHP領先RoR之處。 
   RoR的DRM實作則優於php。
   PHP是專為網頁開發而生的動態語言。但個人眼中,與php相較Ruby有一項優點是php無法企及,就是與系統的綁定。在檔案權限的處理甚或OS api的呼叫尤為便利。

 java:
     java本身是一種強型別的靜態編譯語言。在學習的門檻上已較其他動態語言上為高。
    而Java在使用各種框架開發時,需要透過XML作許多設定,像是使用Hibernate設定ORM(Object Relation Mapping)需要使用,而負責前端的JSF也有XML需要設定。
    當Spring要指定ORM和前端架構,又必須設定一次XML檔。光是要了解和使用這些設定就必須花上許多時間,網站開發原本應該關注的應用程式邏輯和創意反而遲遲無法展開。
    雖然這些Framework,在架構設計上的確漂亮而且深具彈性,只是對於網站開發而言,仍過於複雜。 漫長的開發時間與成本也一直是java的罩門。

.net:
    佔全世界百分之70的web伺服器都是linux系統,所以不能跑.net
    .NET作為一個“通用框架”有點過於龐大,對於Web開發來說不夠靈活。
    C#對比Java來說優雅了很多,不過對比起Ruby還遠遠不夠。
    Windows作為伺服器實在不太給力。
    ASP.NET的部署成本高於RoR。

引用:http://diyland.biz/?opt=detail&topic=16&id=19601