2018年9月30日 星期日

AKKA.net 心得 (1)


今天從研討會上認識了Akka.net這個框架。它主要是用來做分散式運算的。除了可以在本機上做之外,透過它的套件,就可以跨主機。
由於它都被人家拿來當一個研討會的項目來說明,所以就藉此來認識一下。
以下是進行它的Bootcamp教學時,所記錄的一些心得。
它的BootCamp教學就放在GitHub上,所以透過以下的網址就可以一步步學習。
https://github.com/petabridge/akka-bootcamp

Unit1

1.1

  1. 在Akka的世界裡,最主要的角色是Actor。
  2. Actor用來傳遞訊息
  3. Actor透過Prop來產生
  4. 所有的Actor都屬於ActorSystem
  5. ActorSytem在一個Application只能有一個
  6. 在Akka內很少有用new的,幾乎都是透過工廠方法產生的。
在unit1的練習中,它產生了兩個Actor,一個是ConsoleReader,一個是ConsoleWriter。它先在ConsoleReader的OnReceive方法中,要求要讀取Console,因此當OnReceive方法被呼叫時,其實就會有一個緒卡在讀取Console這裡,直到有人輸入字後才會再往下走。
因此程式一開始,就對ConsoleReader呼叫 Tell("start"),其實這邊打什麼字都無所謂,只是為了要觸發OnReceive方法,開始監控Console的輸入。
而ConsoleReader除了接收輸入外,還要對輸入進行判斷,印到Console上,所以在對ConsoleReader初始化時,還注入了ConsoleWriter,用來將結果印到Console上。
相對ConsoleReader,ConsoleWriter的任務就較簡單,就是將輸入的參數寫到Console上即可。

1.2

在這個單元中,我們將傳輸的訊息重新定義。
定義的方式從原本的字串變成以下兩種

  1. 類別
  2. 常數字串

之前都是直接用字串傳送,接收者將object轉型成字串,判斷字串再做決定。
我們定義了訊息的類別,因此就不再傳字串╡而是傳訊息物件。
在訊息的物件上,我們將訊息先分

  • 成功訊息
  • 失敗訊息
然後再失敗訊息再透過繼承產生特定的錯誤類別。
在判斷時,就直接透過 is 來決定是不是錯誤訊息,再做進一步分類。

1.3

這個單元主要介紹Actor的產生方式,並且透過將Validator邏輯從現有程式的移出來重構程式碼。
Actor產生方式透過Prop這個類別,它有三種產生Actor的方式
  1. Prop.Create(typeof(xxx)) 最不建議使用
  2. Prop.Create<xxx>(); 建議使用,針對沒有建構子的Actor
  3. Prop.Create(()=>new xxx());建議使用,尤其在建構子有輸入參數的時候
建立好之後,我們還要將它設定給ActorSystem,納入管理。給ActorSystem的方式透過
ActorSystem.Actof(xxx,"xxxName");
其中名字可填可不填,但是建議要填寫。因為Debug的時候會很有用處。

1.4

這個單元說明Actor在ActorSystem中的關係。
簡單說,它是一個樹。所以在樹中的結點都是一個Actor。
每一個Actor都被它上層的Actor接管。
所謂接管是指在本Actor出錯時,例外會上拋至上一層Actor。
由上一層Actor來下指示決定要如何處理例外。
上層處理例外時,可以做出以下幾個決定
  1. Restart:重啟子Actor,這是預設的決定
  2. Stop:停止子Actor
  3. Escalate:停止自己,並且讓自己的上一層決定
  4. Resume:無視錯誤,當做沒發生
決定了以上的處理方式時,還可以決定要處理的對像範圍,由以下兩種
  1. One-For-One:只針發出問題的Actor
  2. All-For-One:針對發出問題的Actor及他的所有sibling
要設計這種結構的目的在於將防止錯誤的發散

1.5

這個單元介紹如何以搜尋的方式,取得特定的Actor。以下是注意的事項

  1. 找到的Actor可能不只一個
  2. 找尋的時候,可能與當下的位置有關係 (相對位置而不是絕對位置)
  3. 一般不建議使用,除非是動態行為或是為了在程式發佈後,避免大幅度的修改。
  4. 有些時候,為了要將Actor傳給特定物件,可能會層層傳遞,此時也可以透過搜尋的方式 Decoupling

1.6

Actor的生命週期有以下五種
Starting ->Receiving -> Stopping -> Terminating -> Restarting

  • Starting:被ActorSystem啟用後
  • Receiving:可以開始接收訊息
  • Stopping:資料被清除,可能有兩種原因 Terminating 或是 Restarting
有四個方法會在這些狀態改變時被呼叫,分別是
  1. PreStart:在Receiving前被呼叫,此時適合做Actor的initialize的行為
  2. PreRestart:在Actor被Parent重啟前呼叫,此時可以儲存當下的資料,做為後續錯誤修復時使用
  3. PostStop:在Tememnated及ReStart時會呼叫
  4. PostRestart:在Restart前會進行呼叫,且呼叫後,會接著呼叫PostStop

2018年9月29日 星期六

MuseScore 操作說明

最近使用MuseScore幫小孩子轉譜,其實應該讓小孩子自己轉。不過要做的事那邊多,小孩子又不是要唸音樂班,那就幫忙一下囉。
以下記錄幾個操作的心得。

使用鍵盤左右鍵進行區域選取

  1. 選擇要開始選取的元素,如第一個音符
  2. 按住Shift,按鍵盤的左或右即可擴大選取範圍

使用滑鼠進行區域選取

  1. 按住Shift鍵
  2. 直接滑鼠左鍵按著框選要選取的區域

快速加入斷音符號

  1. 選取要加入的斷音的音符。
  2. 使用滑鼠點選斷音符號兩次就可以將選擇的音符都加上斷音符號
2018年9月27日 星期四

改價值觀-難,順水推舟-易


今天在回想參加團隊的組成,發現它有一些可取之處,因此做為記錄。
希望自己在帶家中的小朋友時,也能以相同的作法。

  1. 讓小孩自己產生動機,而不是由大人催促。
    我自己也發現,很多時候我們要求小孩子做的事,我們自己覺得很重要,可能小孩子根不以為然。
    我想這個是正常的,小孩子和我們的價值觀不太相同。
    因此,與其改變他們的價值觀,那還不如以他們的價值觀出發去改變我們的作法。
    如:小孩子作業總是寫錯,自己寫完不檢查,總是要大人檢查後才改。
    小孩子的內心應該是覺得寫錯"沒關係",反正又大人改,而且寫錯再改就好了,又不會怎樣。
    所以,我們應該讓這件事變的"有關係"。小孩應該有一些事對他們是有所謂的。如上網、打電動、禮物之類的。因此我們可以從這邊去設計。
    如:作業有錯要扣上網的時間,可以錯一題,超過就每一題扣10分鐘。當然全對也可以給類似的獎勵,如可以抵消下次錯二題扣的時間。
    所以重點是,要讓他們有感覺,可能不是要先讓他們有和我們的價值觀,而是先看他們的價值觀才那,用他們的價值觀來設。
當然,這樣的說法並不是指小孩的價值觀不重要。只是這個年紀的小孩,知道是一回事,要彰顯自己的想法又是另一回事。為了表達自我,或許其他事情就不是那麼重要了。
2018年9月19日 星期三

手機與小孩

最近發生了很多事,跟小孩和手機有關係。
很早以前,為了開始和小孩的鐵路走透透行動,將家裡一支沒有在用的零元手機加上易付卡,在進行這個活動的時候給小孩用。
當初只是純粹給小孩子記錄走路的行程使用。
後來沒有再走了,手機也沒有再用。

小孩後來練琴的關係,有時候要錄音,就將手機又拿出來給小朋友錄音用。
並且也幫他申請了一個臉書帳號,申請臉書帳號的原因,是因為想要將家裡的人弄一個社團,從小開始記錄大大小小的事。

最近突然發現,這支手機突然不見。直到有一天,發現小孩自己鎖在房間裡面,叫人沒有人應。我拿了鑰匙打開門之後,不見的手機竟然在床尾放著,還充著電呢。小孩在做什麼,竟然躺在床上睡覺。我把他叫醒之後,問他手機為什麼在床邊,他竟然也不知道為什麼。小孩平常也沒有說謊的習慣,應該也沒有和我們說謊的理由。
小孩子平常也糊理糊塗的,所以他這樣說,我覺得還蠻有可能的。

這隻手機出現後,過了幾天後,在某個星期日晚上又不見了。
我問了睡覺的兒子,兒子說是在放盒子裡,但我從盒子裡又找不到。
結果隔天早上,竟然真的在盒子裡出現了。
我覺得是小孩子晚上偷偷拿來用,早上又放回去了。
2018年9月14日 星期五

NetCheat wit CCAPI PS3 BLAS50770 [鋼單創鬥者 2]

開啟選單看目前GP
搜尋以下範圍 10000000-138D0000
參考數值 120C9E94

道具

到商品櫃台查一個道具的數量,然後一個一個賣並搜尋道具數量
搜尋以下範圍 12000000-13800000
參考數值 120CAAFF

2018年9月11日 星期二

小孩粗心 得過且過



最近小孩不約而同都被老師說學習成效不好。
歸究原因,小孩學習時並沒有認真的學習好。
這樣的小孩,常常說他都知道,只是記錯了,所以每次都在老師一公佈解答就說他都會只是記錯了。
但很多考試,其實考的就是記憶而已,記錯了就是錯了。像是Teacher也有印像,也會拼,Student也有印像也會拼,但就是不知道那個是老師那個是學生。
這樣的學習,有時候運氣好矇到了,下次再考出一樣的,也只是碰運氣而已。
雖然知道小孩子有這樣的毛病,可是一時之間也不知道要如何改善。
如果要求小孩自己多訂正幾遍,不知道是不是有幫助…

親子天下裡面提到,針對孩子的粗心,要分三段來解析。

  1. 題目解讀錯誤
    就是題目沒仔細看,答題沒有符合題目的需要。
    平常可以訓練對題目重要部分畫線,增加注意力
  2. 判斷錯誤
    這個就是不熟,用了不符合的公式進行答題。
    平常多練習題目或是畫出來理解
  3. 書寫錯誤
    這個就是筆誤了。
    平常多練習將字寫乾淨、整齊

在中山國小資優班的發文中也提到幾個方法
  1. 小孩對把3寫成8莫不在意,覺得自己本來就會,只是不小心錯了。我們要跟讓他知道一般題目都很簡單,所以我們要比別人好,就是只能比別人更小心。
  2. 若小孩子自我要求高,容易緊張。那麼大人就不要在考前耳提面命,或是露出太高期待。
  3. 小孩對事物缺乏刺激,所以在大腦形成的影像不夠清晰。所以大人要透過比對來加強印像
  4. 粗心可能是概念模糊,不是會了寫錯,而是似懂非懂。這時候要多多追問孩子背後犯錯的原因,找出問題。
  5. 粗心和個人習慣有關,因此讓小孩整理自己的衣櫃,安排自己的學習進度。
  6. 粗心的孩子寫作業不認真,所以大人應該讓小孩自己檢查並改正錯誤,才有助孩子改變粗心的習慣。
  7. 將作業時間改成作業量,也就是說將練習1小時,改成練習全對10題
其他地方收集的方法
  1. 寫作業要自己檢查,檢查方法是做一題就檢查一題,對了再做下一題。
  2. 若孩子是作業前半好,後半不好,就要注意是只作業疲勞。有這種情況最好要休息一下,不要怕定下來的心又散掉了。
  3. 使用錯題本,將錯的項目都寫下來。
2018年9月10日 星期一

NetCheat wit CCAPI PS3 BLJM61188 [女神騎士團炎]


升級能力值
在過關後的升級設定,記下目前的EtherChip的可使用量
搜尋 01000000 ~ 02000000
使用 1byte
參考位置 0108E829

我是透過,用掉一個EtherChip,再取消用掉,讓數字一直在 1,2,1,2這樣,反覆搜尋到的。

PS3 BLJS10264 [美夢俱樂部] 常見問題說明

在其他網頁上看到的一些攻略,好像都沒有介紹很基本的名詞介紹。
我把一些我遇到的問題及解法列出來。

進入ETS的方法

攻略上常說要進入ETS,ETS要怎麼進入:
簡單的話,就是要把女孩子灌醉,灌醉的方式我試起來就是點4500的酒給她喝。
然後,就再送她一個小禮物(不確定是不是必要條件件。
接下來就什麼也不做,慢慢等,她就會喝著喝著,然後主動和你講一次話。
接著就會整個喝到頭上冒煙。
如果在這個時候,自己再開始喝酒,喝到系統判定可以進入ETS時,就自己會進去了。

以上方法供大家參考。

2018年9月9日 星期日

NetCheat wit CCAPI PS3 BLJS10264 [美夢俱樂部]

所持金

記錄所持金的數量
搜尋記憶體 01000000-02000000
長度 4bytes
參考位置 01CD3E90
                 01D695B0

Note:所持金的位置有兩個,一個是在宿舍顯示的金額,一個是在俱樂部顯示的金額。
兩個都要改

NetCheat wit CCAPI PS3 BLUS31386 [仙境傳說奧德賽ACE]

Zeny

記錄目前Zeny
搜尋 4A000000 ~ 4B000000
長度 2bytes
參考位置 4A281E34


NetCheat with CCAPI PS3 BLES01184 [龍士傳說3]


PS3 BLES01184 [龍士傳說3] 

隊伍內SP值調整

進入到技能頁面,記下SP值
00A00000 ~ 00B00000 搜尋SP值
搜尋的單位使用 2Bytes 即可

金錢

記錄目前金錢
00A00000 ~ 00B00000 搜尋SP值
搜尋的單位使用 4Bytes 即可

道具

記錄特定道具的數量
00A00000 ~ 00B00000 搜尋道具數量
搜尋的單位使用 1Bytes 即可
2018年9月8日 星期六

從日本地震反思溫室效應


最近從新聞上知道日本剛歷經一個颱風的侵襲不久,
緊接著北海道又發生一場大地震。
與此同時,在台灣的我們也對連日的豪大雨感到 「怎麼會這樣」。

吃飯時和朋友討論,以前知道溫室效應造成氣溫升高,冰山熔化、海平面上升。
但是,溫室效應與地震會有關係嗎?
朋友想想,好像沒有什麼明確的說法。
不過仔細想想,我們現在對於地震,只能做到記錄,根本連預測都做不到。所以要說地震和有什麼關聯,應該很難。頂多只能透過長時間的記錄,得到「年平均溫度與地震發生頻率」這樣的資料吧。

心裡這樣想的時候,又覺得這樣的判斷沒有什麼用。因為地震發生的頻率與地震發生的強度都要列入考慮。而地震其實又代表整個板塊的堆擠,只用局部區的年平均溫度又覺得有失公正。感覺上應該是「全球年平均溫度 VS 全球地震強度」。
不知道有沒有這樣的資料就是了。

上網查看相關資料時,的確是有人提到是有關係的,但是在文末也是還待科學驗證中。雖然科技一直進度,但這個世界還是有太多的未知。不曉得在人工智慧急速發展的現在,是否可以靠著這項技術幫忙解開這世界更多的奧秘。

孩子心 海底針

孩子心 海底針

今天在看老師和孩子的對話情形,在下課之後,和老師聊了一下。
我跟老師說,老師在課堂上遇到的情況和我在家裡蠻像的。
我們都試著想了解孩子的問題在那裡,幫助他渡過難關。
但是,孩子不曉得是個性使然,還是其他的原因,總是不太能夠清楚的表達目前所遇到的問題。
我看到老師以問答題的方式問不出結果後,改用選擇題的方式問,但就算是選擇題,孩子給出的答案也是不大肯定。
或許是這裡面都沒有一個完全符合他內心的標準答案。

回到家後,我試著和孩子在重新回想一下當時的狀況,我依然想試著知道他的問題在那裡。
後來,還原整件事情是這樣的:
孩子在上課的過程中,一直以為自己是對的,所以老師問他為什麼會錯,他也一直很用的想,但總是想不懂為什麼自己會錯。
因為,他就覺得自己是對的。
所以就落入了,老師以為孩子知道自己有錯,但是不知道這個錯誤是怎麼造成的,所以一直在花時間想。
而孩子的腦子裡就一直在想,自己就是對的,到底是那裡有錯呢?
結果兩邊就串不起來,以致於老師在詢問錯誤的原因時,孩子就想來想去,就不知道是那裡有錯。
就算給選擇題,也是怎麼答都不對。

我跟孩子說,你若覺得是對的,就跟老師說你覺得沒錯。
這樣老師知道原來你不曉得自己有錯,這樣對話才會接得下去。

雖然我覺得不是每次都是這種情況,但還是很高興可以多認識孩子一點。
2018年9月7日 星期五

橋接模式 (Bridge)


最近拿起『深入淺出 設計模式』這本書,想看一下它對於拜訪者模式是如何說明的。結果打開目錄看時,發現這個模式被它分到第十四章-附錄。我當下好奇的看了一下,在附錄中是有那些模式,自己是不是知道,結果第一個看到的模式就是 橋接模式。

深入淺出的書印像中是屬於淺顯易懂系列的,但是我看它的橋接模式的說明真是讓我有「每一個字拆開來都知道意思,但合起來變成句子完全不知道再說些什麼」。

因此,這一篇就是要來說明我看了多本書後,對於橋接模式的心得。

使用時機

當透過繼承實作基底類別的方法時,有一個以上的原因會促使你產生新的類別完成此方法。這就代表有可能可以使用橋接模式來處理這個問題。

舉例

我們是一個小七家電部門,要為小七電視寫一個遙控器的類別,用來將小七電視換台。我們已知小七電視的遙控方式是紅外線的。
由以上的需求,我們很快的完成一個類別

public class RemoteControl
{
 public void SetChannel(int channel)
 {
  //...
 }
}
因為電視賣的太好了,要做一個以Wifi連線的版本。因此我們建立了一個基底抽像類別RemoteControlBase,內有一個抽像方法SetChannel,以及另外兩個類別做為紅外線遙控及Wifi遙控。

public abstract class RemoteControlBase
{
  public abstract void SetChannel(int channel);
}

public class InfraedRemoteControl : RemoteControlBase
{
  public override void SetChannel(int channel)
  {
    //..
  }
}

public class WifiRemoteControl : RemoteControlBase
{
  public override void SetChannel(int channel)
  {
   //..
  }
}
到這邊統計一下,目前有一個抽像類別及兩個實作它的類別。總共用了三個類別。目前會造成我們增加類別的原因只有通訊的方式改變這個理由。也就是若再來一個藍芽通訊的話,就再新增一個BluetoothRemoteControl的類別即可。目前為止,若世界總是想像的這麼美好,就沒有橋接模式出場的必要。接下來,我們就加一些場景,讓橋接模式可以因應而生。



由於小七電視賣太好了,本公司開始接代工,所以目前的遙控器除了要能遙控小七電視外,還要能遙控小八和小九電視。但是小八和小九電視在做換台動作時,有其他的前置作業需要處理。因此我們必須為小八和小九電視的換台方法寫不同的版本。所以,將小七、小八、小九及紅外線、Wifi一起考慮進去,我們想像會有以下 3 x 2 =6個類別,此類別分別是

SevenInfraedRemoteControl (小七 且 紅外線)

EightInfraedRemoteControl (小八 且 紅外線)

NineInfraedRemoteControl (小九 且 紅外線)

SevenWifiRemoteControl (小七 且 無線)

EightWifiRemoteControl (小八 且 無線)

NineWifiRemoteControl (小九 且 無線)



我們可以發現,若電視這樣大賣下去,你的分紅又沒有增加的話,你應該是希望這條產品線早早收掉,不然再來一個小十、小十一或是再來一個藍芽控制之類的。我們的類別都會爆增。

這邊的問題就在於我們在轉台這個方法內,由一個以上的原因會促使它改變。你有沒有覺得這段話很眼熟。沒錯,這就是前面提到的橋接模式的使用時機。

觀察一下目前的設計,轉台方法會受到通訊方式及電視廠牌兩個類型改變。因此它改變的原因會超過一個。

我們在這邊的作法是讓通訊方式或是電視廠牌其中一個帶來的改變從轉台的方法內消失。這邊說的消失,並不是讓程式碼移掉,而是讓他們做相同的事。看以下的例子,在SetChannel方法中,在呼叫Api.SetChannel(轉台)前,兩個類別做的事情是不一樣的,因為前面說到了不同的廠牌需要不同的前置處理。

public class SevenInfraedRemoteControl : RemoteControlBase
{
  public override void SetChannel(int channel)
  {
    Api.A();
    Api.B();
    Api.SetChannel(channel);
  }
}

public class EightInfraedRemoteControl : RemoteControlBase
{
  public override void SetChannel(int channel)
  {
    Api.B();
    Api.C();
    Api.SetChannel(channel);
  }
}
要把他們變成一樣的意思就是讓它們呼一樣的Code。先做一次修改

  public class SevenInfraedRemoteControl : RemoteControlBase
  {
    private void PreProcess()
    {
      Api.A();
      Api.B();
    }

    public override void SetChannel(int channel)
    {
      PreProcess();
      Api.SetChannel(channel);
    }
  }

  public class EightInfraedRemoteControl : RemoteControlBase
  {
    private void PreProcess()
    {
      Api.A();
      Api.B();
    }

    public override void SetChannel(int channel)
    {
      PreProcess();
      Api.SetChannel(channel);
    }
  }
這邊我們已經把SetChannel中,不一樣的地方,改成呼方法PrePrcoess,所以現在在SetChannel內看起來是一樣的了。不過,因為PrePrcoess的內容畢竟還是不同。我們現在要將PreProcess的方法內容從這兩個類別中移掉,這樣兩個類別就會長得一樣,長得一樣的話,我們就可以用一個類別就好。

以下新增了一個TvBrandBase的抽像類別,內有一個PreProcess的方法。我們讓剛剛的兩個類別內,都有一個TvBrandBase (mBrand)。因此我們可以將之前兩個類別內的PreProcess方法都拿掉,都改呼 TvBrandBase的PreProcess方法就好。

  public abstract class TvBrandBase
  {
    public abstract void PreProcess();
  }

  public class SevenInfraedRemoteControl : RemoteControlBase
  {
    TvBrandBase mBrand;

    public override void SetChannel(int channel)
    {
      mBrand.PreProcess();
      Api.SetChannel(channel);
    }
  }

  public class EightInfraedRemoteControl : RemoteControlBase
  {

    TvBrandBase mBrand;

    public override void SetChannel(int channel)
    {
      mBrand.PreProcess();
      Api.SetChannel(channel);
    }
  }
到這邊發現 SevenInfraedRemoteControl  及 EightInfraedRemoteControl 已經長得一樣。因此將這兩個類別再合起來重新變回一個InfraedRemoteControl類別,並針對小七和小八不同的 PrePrcoess方法改用SevenTvBrandBase 及EightTvBrandBase 兩個來放置。

  public abstract class TvBrandBase
  {
    public abstract void PreProcess();
  }

  public class InfraedRemoteControl : RemoteControlBase
  {
    TvBrandBase mBrand;

    public override void SetChannel(int channel)
    {
      mBrand.PreProcess();
      Api.SetChannel(channel);
    }
  }

  public class SevenTvBrandBase : TvBrandBase
  {
    public override void PreProcess()
    {
      Api.A();
      Api.B();
    }
  }

  public class EightTvBrandBase : TvBrandBase
  {
    public override void PreProcess()
    {
      Api.B();
      Api.C();
    }
  }

現在回過頭來看我們的設計。針對轉台這個方法,已知需要一個前置處理方法,然後再呼叫轉台。遇到有不同的前置處理方法,我們就去繼承TvBrandBase然後實作PreProcess方法。遇到有不同的通訊方法,就繼承RemoteControlBase,實作SetChannel方法。

我們透過在原本的RemoteControlBase類別內,引入另一個類別TvBrandBase來做到拆分SetChannel方法內的細節,這就是橋椄模式。
2018年9月6日 星期四

不同階段做不同事


朋友和自己的小孩剛好參加了同一個活動。

有一天遇到這個朋友,
他問我:你有問你的小孩覺得這個活動有沒有什麼感覺?
我說:沒有,我只問他活動的內容是什麼。
他說他的小孩回去後一直跟他說這個活動好無聊,一點都不好玩。
當天的活動,朋友是有在場的。他老實告訴我,確實很無聊不好玩。不過,小孩子要是這樣說,那你要怎麼樣回答他呢?
我的朋友很有智慧,他反問他的小朋友(國小五年級):
你覺得你參加這個活動是來玩的,還是來學東西的?
你今天參加這個活動後,是為了要帶領比你還要小的小朋友。
他們可能很多事都不知道,他們可能會問你很多問題。
你今天如果沒有參加過這個活動,你知道要怎麼樣回答他們的問題嗎?

小孩子的心念一轉,懂得大人在說些什麼,也就不在說這個活動不好玩、很無聊了。
因為他知道他們不是去玩的。

大人照顧小孩的過程中,可能自己忽略了小孩也是會成長的。我們應該要適時的改變自己的視角,換一個角度認識小孩。
惟有我們自己先從行為上認可他們的成長,才能在適當的時機幫助他們自己做出改變。