2021年7月19日 星期一

救主為我們做了什麼?



達林·鄔克司會長,總會會長團第一諮理,在2021年4月總會大會的演講中,提起多年前的一個回憶。藉著這個回憶,他教導了「祂為我做了什麼?」。聽過這個演講,並再次研讀這篇演講,我獲得進一步的心得,並想起我自己的一個回憶。


多年前,有一位50多歲的弟兄,受洗2年多,不太積極,許久才會出席一次安息日聚會。有一個安息日,我注意到他來參加聚會,藉機和他談話,並引用摩爾門經第一章的故事,期許他說:「恭禧你!你就像你們家的李海,準備好帶領家人要進入主的應許地,獲得主的美好祝福。」他的回答令我錯愕!「李海是誰?主能給我什麼祝福?我都靠自己賺錢!」


我加入教會已經28年了,一直在教會中和弟兄姊妹們一起學習。我感謝許多努力學習的弟兄姊妹們分享他們的美好見證和熱心服務的榜樣。然而,對於同樣進入了主的羊圈,而卻沒有努力學習福音的弟兄姊妹們,我為他們感到憂心和婉惜。


例如上述的那一位弟兄,後來車禍過世,留下妻子和正值青少年時期的三個孩子。他們都沒有加入教會,也沒有在教會或家中學習到福音。從他自己不知道「李海是誰?」「救主能給我什麼祝福?」,我們可以得知他也不曾在家中學習復興的福音及教導福音。


雖然在經濟上不虞匱乏,他的家人在他過世之後,分崩離析。每次他的遺霜遇到我的時候,總是向我抱怨她的孩子們的懶惰和叛離,她認定自己是個苦命人。我知道教會中有些弟兄姊妹們曾來施助她的家人,但是他們只是期朌環境改變,或得到更多資源,而自己卻不學習和改變。


達林·鄔克司會長,總會會長團第一諮理,在2021年4月總會大會中回憶起多年前,一位已經在教會中許久不活躍的姊妹,應邀出席一場支聯會的晚間大會。但她表示她想不出任何她應該回來的理由。當時的達林·鄔克司長老鼓勵她,說:「想到救主為我們所做的一切,你難道不覺得有很多理由要回到教會來崇拜和事奉祂嗎?」她回答讓達林·鄔克司長老很驚訝:「祂為我做了什麼?」


「祂為我做了什麼?」是每一個人都要終身學習,而且需要努力回應,來獲得祝福的。我希望弟兄姊妹們「自己」好好地重新閱讀,或收看這篇演講。然後我們可以在這群組中藉著討論來分享。

達林·鄔克司會長,教導了救主為我們所做的四項最重要的事。大家可以從他的演講詞中得知,我在此暫時不提。而我覺得救主每天都活在我的生活中,祂賜給我的,就像傾盆大雨一樣,從天而降。我的日記來不及記下每一項,但我多少都記一二件,希望我的家族後代可以從我的日記中看到「救主為我做了什麼?」


Christ is Risen 區塊 99-109 拼寫完成了


 

2021年7月16日 星期五

學測及指試題分句程式(備份)

 學測及指試題分句程式(備份)

var app=SpreadsheetApp;

var ss=app.getActiveSpreadsheet();

var shCode=ss.getSheetByName('考題編碼');

var shGSAT=ss.getSheetByName('學測');

var shASTS=ss.getSheetByName('指考');

var shGSentence=ss.getSheetByName('學測分句');

var shASentence=ss.getSheetByName('指考分句');

const YEAR_COLUMN=2;  // 年度, 110,109...

const CAT_COLUMN=3;   // 考試類別,學測或指考

const QN1_COLUMN=4;   // 試題編號1, 題組的開始題號

const QN2_COLUMN=5;   // 試題編號2, 題組的結束題號

const QTYPE_COLUMN=6; // 題型 V,C,M,R,T

const QUESTION_COLUMN=7;  // 試題

const ANSWER_COLUMN=8;    // 答案

var numRows=shGSAT.getDataRange().getLastRow()-1; // 學測的資料列總數,扣除標題列

var rowG=1;  // 學測輸入的列指標標

var rowGS=1; // 學測分句輸出的列指標


function onOpen() {

  // Get the Ui Object.

  var ui=SpreadsheetApp.getUi();


  // Create and add a named menue and its items to the menu bar.

  ui.createMenu('試題分句')

    .addItem('學測分句','extractSentenceGSAT')

    .addItem('指考分句','extractSentenceASTS')

    .addToUi();

}

function extractSentenceGSAT(){


  // 學測題分句

/**

  var rows=shGSentence.getLastRow();

  var cols=shGSentence.getLastColumn();

  shGSentence.getRange(2,1,rows-1,cols).clear(); 

 */


  rowGS=1; // 學測分句輸出的列指標,第一列是標題,輸出時從第二列開始

  

  // 對於「學測」所有的試題

  for (rowG=2;rowG<=26;rowG++) // 測試時使用定值;正式用 numRows

  {

    // 對於每一列的試題,取出題型


    var qType=shGSAT.getRange(rowG,QTYPE_COLUMN).getValue(); // 題型


    switch (qType) { // 根據不同題型的資料結構來演算

      case 'V':

        qTypeV_(rowG);

        break;

      case 'C':

        qTypeC_(rowG);

        break;

      case 'M':

        qTypeM_(rowG);

        break;

      case 'R':

        qTypeR_(rowG);

        break;

      case 'T':

        qTypeT_(rowG);

        break;                

      default:

        Logger.log("QType Error!");

        break;

    }

  }

}

function qTypeV_(rowG){

    var year=shGSAT.getRange(rowG,YEAR_COLUMN).getValue(); // 年度

    var cat=shGSAT.getRange(rowG,CAT_COLUMN).getValue(); // 考試類別

    var qn1=shGSAT.getRange(rowG,QN1_COLUMN).getValue(); // 試題編號1

  //  var qn2=shGSAT.getRange(rowG,QN2_COLUMN).getValue(); // 試題編號2

    var qType=shGSAT.getRange(rowG,QTYPE_COLUMN).getValue(); // 題型

    var strQuestion=shGSAT.getRange(rowG,QUESTION_COLUMN).getValue(); // 試題

    var strLen=strQuestion.length; // 字串的長度


    //+ 處理一列的句子群,

    var i=0; // 字串的指標

    var qn2=0; 

    // 分句寫出,直到遇到選項群

    while ((strQuestion[i]!="(")&&(i<=strLen-1)){ 

      var strSentence="";


      // 發現句子結束時,寫出句子

      while ((matchSentence_(strQuestion,i)==0)&&

        (strQuestion[i]!="(")&&(i<=strLen-1)){

        //* 處理一個句子

        strSentence+=strQuestion[i];

        i++;

      }

      if (matchSentence_(strQuestion,i)>0)

      {

        rowGS++;

        qn2++; // 每一筆學測題從1起算

        shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

        shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

        shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

        shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

        shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

        strSentence+=strQuestion[i];

        if (matchSentence_(strQuestion,i)==2){

          strSentence+=strQuestion[i+1];

          i+=2;

        } else {

          i++;

        }

      

        shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);


        if (strQuestion[i]==" ") {

          i++; // bypass 空白

        }

      }

    }


    //+ 處理選項群


    strSentence=strQuestion[i];

    i++;  

    while (i<=strLen-1){

      strSentence+=strQuestion[i];

      i++;

    }

    rowGS++;

    qn2++;

    shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

    shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

    shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

    shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

    shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

    shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);


}

function matchSentence_(strQuestion,i) {

  if (strQuestion.substr(i-1,4)=='i.e.') { // 特殊情況的 . 非句點

    return 0;

  }

  if (strQuestion.substr(i-3,4)=='i.e.') { // 特殊情況的 . 非句點

    return 0;

  }

  if (strQuestion.substr(i-1,4)=='B.C.') { // 特殊情況的 . 非句點

    return 0;

  }

  if (strQuestion.substr(i-3,4)=='B.C.') { // 特殊情況的 . 非句點

    return 0;

  }

  if ((strQuestion[i]==".")||(strQuestion[i]=="?")||(strQuestion[i]=="!")) {

    if ((strQuestion[i+1]=='"')||(strQuestion[i+1]=='”')) {

      return 2; // 句尾為兩個符號;即為 .", 或 ?", 或 !" 

    }else {

      return 1; // 句尾為單一符號;即為., 或 ?, 或 !

    }

  } else {

    return 0; // 以上皆非;即非句尾。

  }

}

function qTypeC_(rowG){

    var year=shGSAT.getRange(rowG,YEAR_COLUMN).getValue(); // 年度

    var cat=shGSAT.getRange(rowG,CAT_COLUMN).getValue(); // 考試類別

    var qn1=shGSAT.getRange(rowG,QN1_COLUMN).getValue(); // 試題編號1

    // var qn2=shGSAT.getRange(rowG,QN2_COLUMN).getValue(); // 試題編號2

    var qType=shGSAT.getRange(rowG,QTYPE_COLUMN).getValue(); // 題型

    var strQuestion=shGSAT.getRange(rowG,QUESTION_COLUMN).getValue(); // 試題

    var strLen=strQuestion.length; // 字串的長度


    //+ 處理一列的句子群,

    var i=0; // 字串的指標

    var qn2=0; 

    // 分句寫出,直到遇到選項群

    // matchCItem_ 遇到選項時,會傳回 8 或 7,否則會傳回 0

      while ((matchCItem_(strQuestion,i)==0)&&(i<=strLen-1)){ 

      var strSentence="";


      // 發現句子結束時,寫出句子

      // matchSentence_ 遇到句點、問號、或驚歎號時,會傳回 2 或 1,否則會傳回 0

      while ((matchSentence_(strQuestion,i)==0)&&

        (matchCItem_(strQuestion,i)==0)&&(i<=strLen-1)){

        //* 處理一個句子

        strSentence+=strQuestion[i];

        i++;

      }

      if (matchSentence_(strQuestion,i)>0) // 發現句子結束

      {

        rowGS++;

        qn2++;

        shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

        shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

        shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

        shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

        shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

        strSentence+=strQuestion[i];

        if (matchSentence_(strQuestion,i)==2){ // .", 或 ?", 或 !"

          strSentence+=strQuestion[i+1];

          i+=2;

        } else {

          i++;             

        }

      

        shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);


        if (strQuestion[i]==" ") {

          i++; // bypass 空白

        }

      }

    }


    //+ 處理選項群    

    while (i<=strLen-1){

      // matchCItem_ 遇到選項時,會傳回 8 或 7,否則會傳回 0

      if (matchCItem_(strQuestion,i)>0){

        strSentence=strQuestion.substr(i,matchCItem_(strQuestion,i));

        i+=matchCItem_(strQuestion,i);

      }

      // 處理一個選項,連接後續字元,直到遇到下一個選項,或字串結束

      while ((matchCItem_(strQuestion,i)==0)&&(i<=strLen-1)){

        strSentence+=strQuestion[i];

        i++;

      }

      // 新增一筆到學測分句試算表的下一列

      rowGS++;

      qn2++;

      shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

      shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

      shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

      shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

      shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

      shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);        

    }

}

function matchCItem_(strQuestion,i){

  if (i>(strQuestion.length-9)){

    return 0;

  }

  if ((strQuestion[i]>='0' && strQuestion[i]<='9') && 

      (strQuestion[i+1]>='0' && strQuestion[i+1]<='9') &&

      (strQuestion.substr(i+2,6)==". (A) ")){

    return 8; // 兩位數字加 ". (A) " 共八位

  }

  if ((strQuestion[i]>='0' && strQuestion[i]<='9') && 

      (strQuestion.substr(i+1,6)==". (A) ")){

    return 7; // 一位數字加 ". (A) " 共七位

  }

  return 0; 

}

function qTypeM_(rowG){

    var year=shGSAT.getRange(rowG,YEAR_COLUMN).getValue(); // 年度

    var cat=shGSAT.getRange(rowG,CAT_COLUMN).getValue(); // 考試類別

    var qn1=shGSAT.getRange(rowG,QN1_COLUMN).getValue(); // 試題編號1

    //  var qn2=shGSAT.getRange(rowG,QN2_COLUMN).getValue(); // 試題編號2

    var qType=shGSAT.getRange(rowG,QTYPE_COLUMN).getValue(); // 題型

    var strQuestion=shGSAT.getRange(rowG,QUESTION_COLUMN).getValue(); // 試題

    var strLen=strQuestion.length; // 字串的長度


    //+ 處理一列的句子群,

    var i=0; // 字串的指標

    var qn2=0; 

    // 分句寫出,直到遇到選項群

    while ((strQuestion.substr(i,3)!="(A)")&&(i<=strLen-1)){ 

      var strSentence="";


      // 發現句子結束時,寫出句子

      while ((matchSentence_(strQuestion,i)==0)&&

        (strQuestion[i]!="(")&&(i<=strLen-1)){

        //* 處理一個句子

        strSentence+=strQuestion[i];

        i++;

      }

      if (matchSentence_(strQuestion,i)>0)

      {

        rowGS++;

        qn2++; // 每一筆學測題從1起算

        shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

        shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

        shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

        shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

        shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

        strSentence+=strQuestion[i];

        if (matchSentence_(strQuestion,i)==2){

          strSentence+=strQuestion[i+1];

          i+=2;

        } else {

          i++;

        }

      

        shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);


        if (strQuestion[i]==" ") {

          i++; // bypass 空白

        }

      }

    }


    //+ 處理選項群


    strSentence=strQuestion[i];

    i++;  

    while (i<=strLen-1){

      strSentence+=strQuestion[i];

      i++;

    }

    rowGS++;

    qn2++;

    shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

    shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

    shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

    shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

    shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

    shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);

}

function qTypeR_(rowG){

    var year=shGSAT.getRange(rowG,YEAR_COLUMN).getValue(); // 年度

    var cat=shGSAT.getRange(rowG,CAT_COLUMN).getValue(); // 考試類別

    var qn1=shGSAT.getRange(rowG,QN1_COLUMN).getValue(); // 試題編號1

    // var qn2=shGSAT.getRange(rowG,QN2_COLUMN).getValue(); // 試題編號2

    var qType=shGSAT.getRange(rowG,QTYPE_COLUMN).getValue(); // 題型

    var strQuestion=shGSAT.getRange(rowG,QUESTION_COLUMN).getValue(); // 試題

    var strLen=strQuestion.length; // 字串的長度


    //+ 處理一列的句子群,

    var i=0; // 字串的指標

    var qn2=0; 

    // 分句寫出,直到遇到選項群

    // matchRItem_ 遇到選項時,會傳回 4 或 3,否則會傳回 0

      while ((matchRItem_(strQuestion,i)==0)&&(i<=strLen-1)){ 

      var strSentence="";


      // 發現句子結束時,寫出句子

      // matchSentence_ 遇到句點、問號、或驚歎號時,會傳回 2 或 1,否則會傳回 0

      while ((matchSentence_(strQuestion,i)==0)&&

        (matchRItem_(strQuestion,i)==0)&&(i<=strLen-1)){

        //* 處理一個句子

        strSentence+=strQuestion[i];

        i++;

      }

      if (matchSentence_(strQuestion,i)>0) // 發現句子結束

      {

        rowGS++;

        qn2++;

        shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

        shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

        shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

        shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

        shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

        strSentence+=strQuestion[i];

        if (matchSentence_(strQuestion,i)==2){ // .", 或 ?", 或 !"

          strSentence+=strQuestion[i+1];

          i+=2;

        } else {

          i++;             

        }

      

        shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);


        if (strQuestion[i]==" ") {

          i++; // bypass 空白

        }

      }

    }


    //+ 處理選項群    

    while (i<=strLen-1){

      // matchCItem_ 遇到選項時,會傳回 4 或 3,否則會傳回 0

      if (matchRItem_(strQuestion,i)>0){

        strSentence=strQuestion.substr(i,matchRItem_(strQuestion,i));

        i+=matchRItem_(strQuestion,i);

      }

      // 處理一個選項,連接後續字元,直到遇到下一個選項,或字串結束

      while ((matchRItem_(strQuestion,i)==0)&&(i<=strLen-1)){

        strSentence+=strQuestion[i];

        i++;

      }

      // 新增一筆到學測分句試算表的下一列

      rowGS++;

      qn2++;

      shGSentence.getRange(rowGS,YEAR_COLUMN).setValue(year);

      shGSentence.getRange(rowGS,CAT_COLUMN).setValue(cat);

      shGSentence.getRange(rowGS,QN1_COLUMN).setValue(qn1);

      shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

      shGSentence.getRange(rowGS,QTYPE_COLUMN).setValue(qType);

      shGSentence.getRange(rowGS,QUESTION_COLUMN).setValue(strSentence);        

    }  

}

function matchRItem_(strQuestion,i){

  // 確保第 i-1 字非連續數字,避免句尾的 2010. 被視為選項的開始

  if ((strQuestion[i-1]<'0' || strQuestion[i-1]>'9')&& 

      (strQuestion[i]>='0' && strQuestion[i]<='9') && 

      (strQuestion[i+1]>='0' && strQuestion[i+1]<='9') &&

      (strQuestion.substr(i+2,2)==". ")){

      return 4; // 兩位數字加 ". " 共四位

    

  }

  // 確保第 i-1 字非連續數字,避免句尾的 2010. 被視為選項的開始

  if ((strQuestion[i-1]<'0' || strQuestion[i-1]>'9')&&

      (strQuestion[i]>='0' && strQuestion[i]<='9') && 

      (strQuestion.substr(i+1,2)==". ")){

    return 3; // 一位數字加 ". " 共三位 

  }

  return 0; 

}

function qTypeT_(rowG){

  rowGS++;

  qn2=1;

  var inputRow=shGSAT.getRange(rowG,1,1,8).getValues();

  shGSentence.getRange(rowGS,1,1,8).setValues(inputRow);

  shGSentence.getRange(rowGS,QN2_COLUMN).setValue(qn2);

}

function extractSentenceASTS(){}





2021年7月3日 星期六

Christ is Risen 區塊 63-71 拼寫完成了

 


語意和語法分析圖


63Central to that faith is trusting His will and timetable—how and when He will bless you with the miraculous help you desire.

63這種信心的核心就是信賴祂的旨意和時間表,信賴祂會照祂的方式和時間,使你蒙受你所渴望的奇蹟與協助。