2013年7月14日 星期日

[筆記]學徒模式

[應用]

程式設計、吉他、慢跑

[先導]

學徒,基本上指的是一種工作態度。相信總有更好、更聰明、更有效率的方式可以處理正在做的事。
學徒期,指的是尋求能夠迫使自己學習更好、更聰明、更有效率的方法的過程。
模式,是指對特定情境下某個問題一再出現解決方案的描述。

[大綱]

  1. 倒空杯子
  2. 走在漫漫長路
  3. 正確的自我認知
  4. 終身學習
  5. 安排自我課程

倒空杯子

工藝由淺入深所需較大面向的心態與注意事項。
你的第一個語言、繫上白帶、釋放你的熱情、具體技能、顯露你的無知、正視你的無知、深水區、回到舒適區。

走在漫漫長路

理解學習是一輩子的事以及需要知道自己身在何處,見樹又見林。
漫漫長路、工藝先於藝術、持續的動力、培養你的熱情、量身繪製地圖、使用你的頭銜、堅守初衷、不同的路道。

正確的自我認知

說明站在巨人的肩膀上以及找尋能夠前往新世界的伙伴的重要性與幫助。
成為菜鳥、尋找個人導師、志趣相同的伙伴、密切交往、打掃地面。

終身學習

學習的實際技巧與注意事項,建立個人學習的正向循環與回饋。
拓展你的頻寬、練習練習再練習、拋棄式玩具、使用原始碼、邊工作邊反省、記錄個人所學、分享個人所學、建立回饋迴路、從失敗中學習。

安排自我課程

有效率地追求某個世界(領域)的知識與紀錄知識歷程。
閱讀清單、持續閱讀、研讀經典、深入探索、熟悉使用工具。


[心得]

基本上可以適用於大部分學習的狀況。以學習吉他為例,你的第一個語言可替換成你的第一首伴奏,只知道幾個簡單的和弦和節奏的情況下所能處理的伴奏。

整本書大致上就是在闡述學習一項工藝時所會碰上的狀況、心態、情境和如何處理相對應的問題,適合在學習的漫漫長路上回頭檢閱自己所身處的階段和煩惱。

[好句]

  • 不知而不知自身無知,愚者-避他
    不知而知自身無知,惑者-教他
    知而不知自身所知,寐者-醒他
    知而之自身所知,覺者-從他

    《The Life of Captain Sir Richard F. Burton》書中引用的阿拉伯諺語  
  • 在一個劇烈變化的時代,學習者才能繼承未來,博學的人會發現他們擁有生活再不復存在世界的能力。

    Eric Hoffer,《Reflection on the Human Condition》
  • 你不應該與特定的技術白頭到老,應該尋求廣泛而足夠的基礎知識與經驗,讓你能夠針對任何特殊的狀況挑選合適的解決方案。

    Dave Thomas and Andy Hunt,《The Pragmatic Programmer》, p.xviii
  • 擁有知識並不等同於擁有技術與應用知識開發軟體程式所需的實作能力,這就是所謂的工藝。

    Pete McBreen,《軟體工藝》
  • 如果你能夠發現自己缺乏的東西並加以處理,你將能夠向前邁進。穩固的學徒期所需的基礎之一就是正確的自我認知。能夠清楚的知道自己的能力、需要立即擁有的技術以及你長期興趣的目標。

    Dave H. Hoover and Adewale Oshineye,《Apprenticeship Patterns》, 莊弘祥譯《學徒模式》p.34
  • 如果放縱自己,我們會在等待某些消遣或其他事情結束才真正開始工作;只有那些渴望知識,即使處於逆境仍然持續追求理想的人能夠達成目標,根本沒有什麼有利的狀況。

    C.S. Lewis,《Learning In War Time》
  • 學習模式、慣例與最佳實作最好的方式就是閱讀開放原始碼程式,看看其他人怎麼做,這是保持自己不落伍的好方法而且免費。

    Chris Wanstrath在2008年Ruby Hoedown中的keynote

2013年7月13日 星期六

[筆記]精準明確思考術

[前導]

輻射思維BFS
集中思維DFS

[流程]

  1. 利用BFS找目標,然後具體化(5W1H)
  2. 利用BFS對目標找「可經由觀察得到」的不合格現狀(問號),然後具體化
  3. 對不合格現狀找可能會造成的影響,進而評估問題的嚴重性
  4. 利用DFS追因(追源),至少找5層,注意先入為主
  5. 利用BFS對源頭找解決策略(Brain Storming)
  6. 針對解決策略做評估(設定評分準則)

羽球相關整理

[擊球方式]
  • 正手
  • 反手
[球的路線]
  • 直線
  • 對角線
  • 中線
[球的落點]
  • 前、中、後場;目的在於增加對手移位範圍
[球的類型]
  • 平球-正手拍、反手拍(用拇指壓)
  • 高遠球(手伸直,在最高點打)、配合右腳踏出的動作、打完後球拍盡量保持在戰備狀態
  • 挑球(用手臂轉)、像畫弧形一樣,把球打往前往上
  • 切球
  • 發球-重心由後往前,球可以拿高一點
  • 打到網前:切球(站後場)、短球(站前場)
  • 打到後場:高遠球、挑球
[練習]
  1. 雨刷動作(手腕)
  2. 基本米字步法(左腳為主軸,右腳動作),以右腳為爆發力起點,左腳踏,打出去的時候盡量讓右腳出去。往後場可用並步。
[注意]
  • 七分瞻前三分顧後:短球滯空時間短,長球滯空時間長
  • 打完每一球,提醒自己,腳步要回到中間

2013年4月2日 星期二

[筆記]證據有多好

證據是溝通者明白表示的資訊,用以支持或證明事實聲稱的可信度。

主要的類型有8個:

  1. 直覺
  2. 個人經驗
  3. 證詞
  4. 訴諸權威
  5. 個人觀察 (帶有偏差)
  6. 案例 (戲劇性)
  7. 研究調查 (設計不良)
  8. 類比


[風險]

1.直覺


  • 屬於私人性質,其他人無法判斷其可信度而且大多依賴無意識的資訊處理過程,忽視相關證據,反應強烈的偏見。
  • 我們必須非常小心注意只由直覺支持的聲稱。
  • 但是,直覺有可能是從其他類型的證據而來,如相關的廣泛個人經驗和經歷。例如,經驗豐富的機師


2.個人經驗

  • 個人經驗在記憶中鮮明生動,經常使用它們當證據來支持某種信念。
  • 單一個人經驗或個人經驗的累積不足以給出具代表性的經驗樣本,但它們確實是其中一個可能發生的樣本。
  • 個人經驗往往令我們犯下「輕率概化*」謬誤(Hasty Generalization)
  • 個人證詞:引用特定個人的話,根據他們的個人經驗,說某個概念或產品是好是壞,或者異常事件已經發生
  • 證詞具有說服力的原因,在於它們來自於活生生的人且有鮮明生動的印象。這和抽象的統計數字與圖表形成強烈對比。
  • 特別留意個人利益遺漏資訊的問題

*輕率概化的謬誤:只根據群體中少數成員的經驗,就對整個大群體作成結論。

3.訴諸權威

  • 權威,意指對某一主題的瞭解,被視為比大部分人多的專家。亦稱為達人或專家。
  • 當溝通者訴諸權威時,代表他們相信這些專家能夠獲得一些事實資料並有足夠能力對所取得的事實資料作出合理結論。


4.個人觀察

  • 眼見為憑,個人觀察通常是一種寶貴的證據,可作為科學研究的基礎。但要注意觀察者會有選擇性注意的問題存在。
  • 只靠單一觀察者的觀察會有風險,應該再尋找其他觀察者的佐證。
  • 此證據的強度和觀察證實人數成正比,與從親眼觀察到報告所見所聞之間的時間長度成反比。


5.案例

又稱case examples。

  • 詳細描述某事件,和強調研究大量具代表性樣本的研究調查大異其趣。
  • 案例生動活潑、細節描述相當引人注意,很容易在腦海中型成具體形象。
  • 要注意的地方在於,因為敘述鮮明生動,很容意撥動聽眾情緒上的反應,意即,戲劇性的案例目的在激起我們的情緒,讓我們分心,不去找相關性更高的其他研究證據。
  • 它們跟個人經驗一樣,證明了重要的可能狀況,並讓抽象的統計數字展現人性的一面。


6.研究報告

研究調查通常是指由受過科學研究訓練的人,以系統化的方法蒐集各種觀察。
科學方法有以下三個特點

(1)可公開檢驗

例如某研究人員提出一種新的方法A,如果其他研究人員重複相同的實驗,
並且利用A得到相同結果。

(2)控制因素

將外來因素的影響降到最低

(3)語言精確

科學方法的語言總是求其精準和前後一致。

對於研究報告應該注意的問題有

  • 研究報告的品質差異很大
  • 研究報告經常相互牴觸
  • 研究報告並沒有證明結論。頂多只是支持結論
  • 溝通者引用研究報告可能扭曲或簡化研究結論
  • 研究「事實」會隨著時間而改變,尤其是和人有關的聲稱
  • 研究報告的人為干預比重不一


ex. 經濟學界一顆不大不小的炸彈

7.類比


  • 一個論述如果是以兩件事情之間廣為人知的類似性,作為推論其中一件是相對未知特性的結論,稱之類比式論述(argument by analogy)
  • 要評估類比的品質,必須注意
    • 兩件事拿來比較時,類似處和差異處有哪些
    • 類似處和差異處對討論議題的相關性,意即會不會造成影響
    • 第二個方式是製造替代類比
  • 類比品質的強度跟相關的類似性多寡成正比;和相關的差異性多寡成反比,若找不到相關的差異性,且找到好證據支持相關的類似性,則類比強度值得參考。
  • 最好把類比想成從弱到強都有,但即使是最好的類比,也只具暗示的性質。

2013年4月1日 星期一

[筆記]問對問題,找答案:批判性思考的智慧學


第一章至第六章

接受講者給你的素材,並將之組合成有意義的整體結構。

使用的批判性問題

  1. 議題和結論是甚麼?
  2. 理由是甚麼?
  3. 哪些字詞或措辭曖昧不明?
  4. 有哪些價值觀衝突和假設?
  5. 描述性假設是甚麼?

第七章至第十三章

評估整體論述架構有多好,可接受度有多高

使用的批判性問題

  1. 推理有無謬誤?
  2. 證據有多好?
  3. 是不是有對立成因?
  4. 統計數字可信嗎?
  5. 有哪些重要資訊遭遺漏?
  6. 是否另有合理的結論?

[議題]

  • 描述性議題-希望獲得描述這個世界過去、現在、將來是什麼樣子的答案
  • 指示性議題-希望得到指引方向的答案(和我們應該怎麼作有關)

[結論]

  • 結論是指講者希望你接納的訊息
  • 例證、統計數字、定義、背景資訊、證據不算是結論

[理由]

  • 理由是指一些信念、證據、譬喻、類比,以及其它的陳述,用以支持結論
  • 許多理由是證據的陳述。
  • 證據類型:1.直覺2.個人經驗3.證詞4.訴諸權威5.個人觀察6.案例7.研究調查8.類比

[曖昧不明的字詞]
曖昧不明是指字詞或措辭有多種可能的意義存在

[假設]
假設是指

  1. 隱型或未明述(大部分狀況中)
  2. 視為理所當然
  3. 對結論的確定有影響
  4. 可能似是而非

  • 假設是推理結構中的重要無形連結,也是緊緊維繫整個論述的黏著劑。
  • 價值觀假設、描述性假設。

[價值觀假設]

  • 指示性論述中影響力很大的假設。
  • 每個人的心裡自有一套價值觀優先順序或偏好

資訊流整理筆記


資料收集→[思考、整理歸納]→表達

[資料收集]

1.來源

2.工具
Evernote
Google搜尋

3.英文
     3.a工具
          TEDTalks
          VOALearningEnglish
          看影片學英語

     3.b方法

4.記憶
與已知事物作適當連結

[思考]

1.學習
2.方法
     2.a邏輯(logic)
     2.b數學(math)
          統計

[整理歸納]

1.學習
佐藤可士和的超整理術

2.方法
3.作筆記

[表達]

1.簡報(presentation)
2.溝通

資訊流圖示

2013年3月28日 星期四

WEKA 筆記

WEKA, Waikato Environment for Knowledge Analysis的簡稱
是一個可用來做資料探勘的好用工具
下載點 (版本3.6/2013/03/28)

[基本使用]

安裝完後主要有四種模式可以運用,點擊工具列的Applications就可看到

  • Explorer
  • Experimenter
  • KnowledgeFlow
  • SimpleVLI
我主要是使用Explorer,基本使用方式直接參考Ref
主要支援的檔案格式為ARFF,亦可使用CSV

Ref.

[在你的Java程式使用Weka]



訓練資料(Train Data)生成方式有兩種

1. 讀檔
2. 程式內自己產生
主要會用到下面的類別
weka.core.Attribute
weka.core.FastVector
weka.core.Instance
weka.core.Instances

建立訓練模型

主要會用到下面的類別
weka.classifiers.Classifier
weka.classifiers.Evaluation

Ref 2和3有範例可以參考

Ref.

php-java bridge 筆記

為了在php使用weka的函式庫

最近用了一個方便的東西:PHP/Java Bridge

它的運作原理暫時還不是很了解

先筆記一下要怎麼安裝和使用

[安裝]

下載點(版本:6.2.1/2013/03/28)

下載後是一個壓縮檔,裡面有兩個檔案,documentation和JavaBridge.war(WAR file format)

建立一個資料夾JavaBridge(自己命名),將JavaBridge.war丟進去

打開cmd,cd至JavaBridge

java -classpath JavaBridge.war TestInstallation

執行完後出現兩個資料夾:ext, java
                        兩個檔案:RESULT.html, test.php

ext內有四個jar檔:JavaBridge.jar, php-script.jar, php-servlet.jar,script-api.jar

java內有一個Java.inc

滿身大汗戰戰兢兢地弄到這步後,怎麼知道成功了沒?

讓我們把焦點移至test.php

這個php檔案裡面已經有幫寫好的測試,它大致上要做的是先列出phpinfo

然後呼叫java.lang.System.getProperties()列出環境資訊

所以假設http://localhost:8080/JavaBridge/test.php有先列出phpinfo後再列出java 環境資訊大概就是成功了。

不過Ref 1中的第5點有提到 
Copy JavaBridge.jar and php-script.jar to your J2SE/Java SE ext directory ({JAVA_HOME}/jre/lib/ext).
不曉得是否為必須動作

Ref:
1. http://www.developer.com/java/other/php-with-java-using-php-java-bridge-tutorial.html
2. http://blog.wabow.com/archives/62
3. http://www.fkblog.org/blog562

[使用外部jar檔]

Ref 2中有提到
開發者似乎在version 6.0時已經將java_require( )給拿掉
所以6.0後的版本,利用java_require(weka.jar)這樣的方式會出現warning
參考Ref 1中的一個解法


  1. package your code to jar, and copy it to java.ext.dirs which you can found in JavaBridge.log
  2. copy the related class libraries to java.ext.dirs
  3. restart the service of JavaBridge
意思就是將weka.jar丟到jre的ext資料夾內然後重新啟動JavaBridge服務


Ref:
1. http://stackoverflow.com/questions/5389689/working-with-php-java-bridge
2. PHP/Java Bridge FAQ

[使用方式]

在php檔中宣告java的Instance
$s = new Java("java.lang.String", "我在php中運行java");
echo $s;


第一個參數填入欲使用類別,就像import一樣
第二個參數以後填入的是此類別Constructor的參數,
若是Constructor有一個以上的參數,目前測試的結果是依序填下去就可以


$fvNominalVal = new Java("weka.core.FastVector",2);
$fvNominalVal->addElement("yes");
$fvNominalVal->addElement("no");
//Constructor have two parameters
$Identity = new Java("weka.core.Attribute","Identity", $fvNominalVal); 

使用函式的方法要照php的方式來用
原本在java使用函式為 fvNominalVal.addElement("yes");
要改成  $fvNominalVal->addElement("yes");

將Java的Instance轉換為相對應的php value
Ref 1中提到
Use java_values() to convert a Java object into an equivalent PHP value

若要做反向的動作
Use java_closure() to convert a PHP object into an equivalent Java object.

Ref:
1. PHP/Java Bridge API

2013年3月1日 星期五

chrome bowserAction

chrome.browserAction.onClicked.addListener(function(tabs.Tab tab) {...});

Fired when a browser action icon is clicked. This event will not fire if the browser action has a popup.

假如browser action有開啟popup.html,此事件就不會被觸發!!

所以假設我一定要有popup.html,
我就不能用chrome.browserAction.onClicked的方式注入content script
而要在manifest.json定義


{
  "name": "My extension",
  ...
  "content_scripts": [
    {
      "matches": ["http://www.google.com/*"],
      "css": ["mystyles.css"],
      "js": ["jquery.js", "myscript.js"]
    }
  ],
  ...
}


Ref:
1. http://developer.chrome.com/extensions/browserAction.html
2. http://studio.zeuik.com/?p=850#sthash.cWrFaEEC.25PMSXkS.dpbs

2013年1月27日 星期日

[Q1-3]EQ_COUNT

[SOURCE]
名題精選百則_題1.3

[INPUT]
two number set f[ ] and g[ ] which are sorted in increment order
ex. 
f =1,3,5,7,9  
g =1,5,6,8,10
lengthF= number of elements in f
lengthG= number of element in g

[OUTPUT]
f[j]=g[i] means "equal" , count totally "equal" value number
ex.
g[0]=f[0]=1
g[1]=f[2]=5

therefore, totally "equal" value number is 2

[THINK]
f, g都是已經排序好的數列
借用Q1-2的想法,f[idxF]==g[idxG]表示f[idxF], g[idxG]之前的數不用拿來做比較
分成3種情況
Case 1: f[idxF]==g[idxG]
Case 2: f[idxF]>g[idxG]
Case 3: f[idxF]<g[idxG]

Case 1就是我們想要的, count加1, f[ ]和g[ ]的idx都往後移

Case 2表示現在f[idxF]較大, 所以我們將g[ ]的idx往後移

Case 3表示現在g[idxG]較大, 所以我們將f[ ]的idx往後移

[SCv1]


//idxG is index of g
//idxF is index of f
    while(idxG< lengthG && idxF< lengthF){
      if(f[idxF]==g[idxG]){
        sum++;
        idxG++;
        idxF++;
      }             
      else if(f[idxF]>g[idxG]){
        idxG++;
      }
      else{   
        idxF++;
      }
    }


2013年1月13日 星期日

[Q1-2]GT_COUNT

[SOURCE]
名題精選百則_題1.2

[INPUT]
two number set f[ ] and g[ ] which are sorted in increment order
ex. 
f =1,3,5,7,9  
g =1,4,5,8,10
lengthF= number of elements in f
lengthG= number of element in g
    
[OUTPUT]
f[j]>g[i] means "greater" , count totally "greater"
ex. 
g[0]→3,5,7,9→"greater" count is 4
g[1]→5,7,9→"greater" count is 3
g[2]→7,9→"greater" count is 2
g[3]→9→"greater" count is 1
g[4]→none→"greater" count is 0

therefore, totally "greater" is 4+3+2+1+0=10

[THINK]
f, g都是已經排序好的數列
所以當 f[j]>g[i] 時表示f[j]之後的數也都會大於g[i]
"greater"個數為 lengthF-j
當 f[j]<=g[i] 時,往f[j]的下一個元素 f [j+1]比較

[SCv1]
//i is index of g
//j is index of f
//sum is the result    
    for(i=0;i<lengthG;i++){
      for(j=idx;j<lengthF;j++){
        if(f[j]>g[i]){
          tmpL=lengthF-j;
          idx=j;
          break;
        }        
      }
      if(j==lengthF)
        break;
      else
        sum=sum+tmpL;
    }

[SCv2]
//i is index of g
//j is index of f
//sum is the result    
    while(i< lengthG && j< lengthF){
      if(f[j]>g[i]){
        sum+=(lengthF-j);
        i++;
      }             
      else
        j++;
    }


2013年1月12日 星期六

抽象類別Abstract Class

[概念]
pic 1:polymorphism

每位超級英雄有自己的穿衣風格,蜘蛛人簡單地穿上紅藍蜘蛛衣,
蝙蝠俠回家換上蝙蝠裝,鋼鐵人拿出箱子,換上鋼鐵裝備,

//Base Class
public class SuperHero{
  public void power(){
    System.out.println("superhuman strength");
  }
  public void vest(){
    //each hero has their own style
  }
}

//Sub Class
public class Spiderman extends SuperHero{
  public void power(){
    System.out.println("spin a web");
  }
  public void vest(){
    System.out.println("simply change his equipment");
  }
}

public class Batman extends SuperHero{
  public void power(){
    System.out.println("shadow his body");
  }
  public void vest(){
    System.out.println("go cave and put on his equipment");
  }
}

public class Ironman extends SuperHero{
  public void power(){
    System.out.println("energy repulsors");
  }
  public void vest(){
    System.out.println("take out his box and put on his equipment");
  }
}

SuperHero這個Base Class並不需要特別實作vest(),
只需要交給個別的Sub Class去實作自己的vest(),
在這情況下,定義了所謂的抽象方法(Abstract Method),意即不特別去實作方法的內容,
一個類別中若包含抽象方法,則可稱為抽象類別(Abstract Class),
需要注意的是,不能生成抽象類別的物件,但可以宣告抽象類別的變數


//Base Class
public abstract class SuperHero{
  public void power(){
    System.out.println("superhuman strength");
  }
  public abstract void vest(); //abstract method
}

//Sub Class
public class Spiderman extends SuperHero{
  public void power(){
    System.out.println("spin a web");
  }
  public void vest(){
    System.out.println("simply change his equipment");
  }
}

public class Batman extends SuperHero{
  public void power(){
    System.out.println("shadow his body");
  }
  public void vest(){
    System.out.println("go cave and put on his equipment");
  }
}

public class Ironman extends SuperHero{
  public void power(){
    System.out.println("energy repulsors");
  }
  public void vest(){
    System.out.println("take out his box and put on his equipment");
  }
}

public class Test{
  public static void main(String[] args){
    SuperHero sh1 = new Spiderman();
    SuperHero sh2 = new Batman();
    SuperHero sh3 = new Ironman();

    sh1.vest(); //"simply change his equipment"
    sh2.vest(); //"go cave and put on his equipment"
    sh3.vest(); //"take out his box and put on his equipment"
  }
}


[細節]

[延伸]

[參考]
1. 良葛格學習筆記

如有錯誤,請不吝指教

多型Polymorphism

[概念]
多型作用於Instance Method上,不作用在Class Method、Class Variable和Instance Variable上

目的是為了在執行時期讓Sub Class的物件動態地選擇合適的method

pic 1: polymorphism

//Base Class
public class SuperHero{
  power(){
    System.out.println("superhuman strength");
  }
  fortune(){
    System.out.println("fortune type");
  }
}

//Sub Class
public class Spiderman extends SuperHero{
  power(){
    System.out.println("spin a web");
  }
}

public class Test{
  public static void main(String[] args){
    SuperHero sh = new Spiderman();
    sh.power();    //"spin a web"
    sh.fortune();  //"fortune type"
  }
}

變數sh宣告為SuperHero型態(稱為型式型態),但實際型態卻為Spiderman

sh.power( )會執行實際型態的method,也就是
power(){
    System.out.println("spin a web");
}


[細節]

[延伸]
抽象類別Abstract Class
介面Interface


[參考]
1. O'Reilly技術短文 OO

如有錯誤,請不吝指教

繼承Inheritance

[概念]
物件導向重要的概念之一

Sub Class繼承Base Class

//Base Class
public class Human{
  height
  weight
  
  walk(); 
  eat();  
}

//Sub Class
public class Ken extends Human{
  code();
  playguitar();
}

一般來說,Instance Variable、Instance Method、Class Variable、Class Method都會被繼承


[細節]
public, protected, private, package的影響

Base Class和Sub Class的Instance Variable名稱相同時會發生甚麼事

Method Overriding

[延伸]
多型Polymorphism
抽象類別Abstract Class
介面Interface

[參考]
1. O'Reilly技術短文 OO
2. 良葛格學習筆記

如有錯誤,請不吝指教

2013年1月11日 星期五

[Q1-1] Longest Plateau

[SOURCE]
名題精選百則_題1.1

[INPUT]
number set which is sorted in increment order
ex. 1,2,2,3,3,3,4,5,5,6

[OUTPUT]
find the longest plateau
ex. 3,3,3

[THINK]

[SCv1]
    //arr is sorted array
    //maxL is result length
    //maxN is result element
    int i=0,tmpL=0,tmpN=0;
    int maxL=0,maxN=0;

    for(i=0;i<10;i++){
      if(i==0){
        tmpL=1;
        tmpN=arr[i];
      }
      else{ 
        if(arr[i]==arr[i-1]){
          tmpL++;
        }
        else{
          if(tmpL>maxL){
            maxL=tmpL;
            maxN=arr[i-1];
            tmpL=1;
          }
          else{
            tmpL=1;
            tmpN=arr[i];     
          }     
        }
      }
    }

[SCv2]