原先在CodePen上面用Vue.js練習做了 翻牌配對記憶遊戲、撲克牌記憶遊戲。
後來再用Vue CLI做一個TypeScript版本的Vue專案,把兩個遊戲都放在這個網站裡。
網站寫好後把整個內容部署到有免錢額度的FireBase,這樣就有一個算是Demo小作品的地方了。
在FireBase上的網站:Web
FireBase除了有置放靜態網頁的Hosting功能外,還有Database、Storage、Functions等等等等服務。
目前這個小遊戲網站會用到的就是Database的功能了,用來記錄每次遊戲結束後花費的時間,還有呈現遊戲紀錄。
Database有分兩種,Cloud Firestore和Realtime Database。
這次用的是Cloud Firestore,Firestore的資料格式就像json一樣
//你的資料庫
{
"Schema1":{
"Schema1_Table1":[
{
"columnA": "value",
"columnB": "value"
}...
],
"Schema1_Table2":[]
},
"Schema2":{
"Schema2_Table1":[],
"Schema2_Table2":[]
}
}
這比Cloud Datastore好懂很多,以前用Cloud Datastore時,雖然有操作過資料,但其實規則還是很難搞懂。
把資料路徑下所有vtt檔案類型轉換成srt檔, srt檔案內移除原vtt檔內第1,2行
shell name: copyAndChangname.sh
#!/bin/sh
FILE=$1
files=''
copyFileAndRename(){
sFILE=$1
if [[ -e "$sFILE" ]]; then
if [[ -f "$sFILE" ]]; then
substr=$(echo $sFILE | cut -d"." -f 1-2)
sed '1,2d' "$sFILE" > "$substr"".srt"
fi
fi
}
if [[ -e "$FILE" ]]; then
if [[ -d "$FILE" ]]; then
cd "$FILE"
files=(*)
for file in "${files[@]}"; do
if [[ $file == *"vtt"* ]]; then
copyFileAndRename "$file"
fi
done
fi
fi
run copyAndChangname.sh "target path"
進入程式後先判斷傳入的路徑是否是folder,
if [[ -e "$FILE" ]]; then
if [[ -d "$FILE" ]]; then
.....
如果是的話切換到傳入的目標路徑,
取得該folder中所有檔案files=(*)
判斷檔案檔名是否包含「vtt」,是的話進入function copyFileAndRename
copyFileAndRename 要放在程式中需要被呼叫之前的位置,不然會command not found
進入copyFileAndRename後,先依檔名判斷是否是檔案,先用$(echo $sFILE | cut -d"." -f 1-2)
取主檔名字串
然後用sed '1,2d' "$sFILE"
讀取檔案內容,並移除檔案內頭兩行,接著> "$substr"".srt"
把內容寫到名稱為主檔名字串.srt
的檔案中
取出Java資料傳輸物件中,每個欄位和註解
Java物件檔案內容
public class ValueBean {
/**
* fieldA 的註解
*/
private String filedA;
// fieldB 的註解
private BigDecimal fieldB;
//getter & setter.....
把ValueBean.java檔案拖拉到灰色上傳區塊後,取出欄位名稱及加上註解後顯示在「欄位內容」區塊
想像一支手機製作完成時要進行產品檢查,手機放在輸送帶上運送,在檢查線上每個檢查站口的責任就是檢查一個項目,有該站口可以處理的情況時,就進行補強,若問題太多就丟出去重新做。
這邊用檢查電話號碼來套用責任鏈模式。題目是從Exercism.io: Phone Number in Java來的。
依據上述的規則,設置了DigitChecker
、StartWithOneChecker
、ValidCharacterChecker
三個檢查器,當作檢查鏈上的三個站口。
上面三個class都繼承了ResultChecker
/**
* 檢查器抽象父類別
*/
abstract class ResultChecker {
protected ResultChecker nextChecker;
public ResultChecker(ResultChecker nextChecker) {
this.nextChecker = nextChecker;
}
/**
* 繼承此類別的檢查器需實做此method,若該類別中存在ResultChecker,
* 則發動該checker的doCheck
*/
abstract public String doCheck(String resultString);
}
使用 Java 8 的 Predicate,可以先針對特定class設定過濾條件,在stream().filter()
時,把Predicate放在filter()
中。
而BiFunction, Function是在建立method時,直接依條件把傳入的List參數篩選好再回傳出去。
使用的方式是對BiFunction/Function 用 .apply(arg....)
把要過濾的list 傳入。
[Books]
Title | PublishDate | Author | Tags |
---|---|---|---|
BookA | 20150101 | Apple Bee | Art, Comics |
BookB | 20160101 | Apple Bee | Comics |
BookC | 20151001 | Cake Door | Law |
BookD | 20150601 | Egg Frog | History |
BookE | 20161001 | Goose Horse | Art, Education |
BookF | 20141001 | Ibis Jellyfish | Art, Business |