2024年4月6日 星期六

[leetcode] [eazy] Q1002

public class Q1002 {
public static void main(String[] args) {
String[] words = {"bella","label","roller"};
commonChars(words);
}
public static List<String> commonChars(String[] words) {
List<String>ans = new ArrayList<>();
int[] count = new int[26];
Arrays.fill(count, Integer.MAX_VALUE);
for(String str: words){
int []cnt = new int[26];
str.chars().forEach(c->++cnt[c-'a']);
for(int i= 0; i<26; i++){
count[i] = Math.min(cnt[i], count[i]);
}
}
for(char c='a'; c<='z';c++){
while(count[c-'a']-->0){
ans.add("" + c);
}
}
return ans;
}
}

1 Arrays.fill方法沒用過, 可以用來產生空陣列


2 統計文出現次數可以用int[]count = new int[26]]


3 str.chars().forEach(c->++cnt[c-'a'])

可以用來把cnt陣列中出現的文母次數做一個統計


4 for(char c=='a';c<='z';c++){

while(count[c-'a']-->0){

ans.add(""+c);

}

}

能將陣列中出現的字母, 在轉換放進List答案中


eazy這麼難...

 

2024年3月22日 星期五

在分支上測試時遇到dev已經更新太多

 在分支上測試時遇到dev已經更新太多

可能會導致專案已經跑不起來

不得不在分支上會需要dev更新的部分


本來預計就直接把分支併回dev做測試

而今天學到一個方法

就是在分支上pull

將dev pull近來

這樣就能解決dev已經更新很多的問題

2024年2月24日 星期六

網關 gateway

namespace: 用於區分環境, 例如 開發環境, 測試環境, 生產環境

group: 用於區分項目, 例如xuecheng-plus項目, xuecheng2.0項目

關於網關的存在,是為了解決目前遇到的問題

解決綁定絕對路徑綁死同一機台問題


如上圖為絕對路徑,在微服務架構下, 可能一個服務有多台(多實例),他服務對接並不適合綁定某一機台,應讓不同的實例都能處理此請求才是
如上圖在中間增設網關,這樣在前端的代碼中只需要指定每個接口的相對路徑, 
在前端代碼的一個固定的地方在接口地址前統一加網關的地址,每個請求統一到網關,由網關將請求轉發到具體的微服務。

有了網關就可以對請求進行路由,路由到具體的微服務,減少外界對接微服務的成本,比如:400電話,路由的試可以根據請求路徑進行路由、根據host地址進行路由等, 當微服務有多個實例時可以通過負載均衡算法進行路由
同時,這個結構也解決前端需要寫死API-URL的問題, 由網關來解決對應URL問題即可



以spring cloud gateway結構 流程如下:
1、微服務啟動,將自己注冊到Nacos,Nacos記錄了各微服務實例的地址。
2、網關從Nacos讀取服務列表,包括服務名稱、服務地址等。
3、請求到達網關,網關將請求路由到具體的微服務。








2024年2月8日 星期四

LeetCode策略

目前順序:

數組-> 鏈表-> 哈希表->字符串->棧與隊列->樹->回溯->貪心->動態規劃->圖論->高級數據結構

參考: https://github.com/youngyangyang04/leetcode-master/blob/master/README.md


規劃: 

1 刷1題

2 隔天再刷同一題, 並寫當題的bigO, 將答案和思路貼到專案中

3 完成第二種解法

4 重寫第二種解法, 寫第二種bigO, 並將答案和思路貼到專案中, 並在excel表紀錄

excel表紀錄參考: https://www.youtube.com/watch?v=NdWYxz3izH4&t=5s


每周寫篇日誌做些調整

2024年1月15日 星期一

2024新年新目標

工程師目前, 大約是四年半
想說立一些今年要達成的目標, 來給自己完成

長久的目標
1 進入外企寫程式
2 英文母語化
3 成為程式資深開發者
4 減肥or使身材更優, 體力更好, 睡眠正常, 頭髮長回來, 美顏
5 年薪突破140, 資產突破300

以往目標或許太遠或是太抽象, 就開始散漫過開心生活去, 天天玩那種
稍微讓目標具體點

我希望今年能完成
1 兩個月做一個專案 包含redis, Elasticsearch, kafka
2 leetcode 一個月 easy 8題 medium 4題
3 一周健身3次, 跑步3次
4 擦皮膚保養品
5 每天10:00洗澡, 11:30準備睡覺, 早上6:30起床
6 平日5天讀英文?!

大概是說關於devops, 上雲相關明年再來專注弄, 今年開始練code, 部分技術
設計模式是真的頗容易忘, 現在有點不知道怎辦, 想說弄幾個專案起來後面再看看
畢竟code刷不過, 面試後面連談的機會都沒有
那, 每次寫完一題, 就寫一點點的解題思路作筆記, 讓自己日後複習能快點

看起來6:30起床, 運動到7:00, 洗澡到7:20, 讀英文到8:20的話, 兩年就會很有進步
他目前的實力並不足以支持他的野心

2023年12月10日 星期日

JSR-303 Bean Validation

 在以往Bean Validation通常會在service的function寫上好長一段判斷如下


//合法性校驗
  if (StringUtils.isBlank(dto.getName())) {
   throw new XueChengPlusException("課程名稱為空");
  }

  if (StringUtils.isBlank(dto.getMt())) {
   throw new XueChengPlusException("課程分類為空");
  }

  if (StringUtils.isBlank(dto.getSt())) {
   throw new XueChengPlusException("課程分類為空");
  }

  if (StringUtils.isBlank(dto.getGrade())) {
   throw new XueChengPlusException("課程等級為空");
  }

然而當欄位多起來的時候,code看起來就會變得冗長

且如果不同的function都要來一段這個,這些也有許多重複的程式碼其實也有改進空間

而在JavaEE6規範中就定義了參數校驗的規範

它就是JSR-303,它定義了Bean Validation,即對bean屬性進行校驗

SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底層使用Hibernate Validator,Hibernate Validator是Bean Validation 的參考實現。

所以,我們準備在Controller層使用spring-boot-starter-validation完成對請求參數的基本合法性進行校驗。

以下的組合是可以讓不同的controller使用不同組的校驗文字
我們在專案中的exception包定出GlobalExceptionHandler和ValidationGroups



GlobalExceptionHandler

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ExceptionHandler(XueChengPlusException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(XueChengPlusException e) {
        log.error("【系統異常】{}",e.getErrMessage(),e);
        return new RestErrorResponse(e.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e) {

        log.error("【系統異常】{}",e.getMessage(),e);

        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse methodArgumentNotValidException(MethodArgumentNotValidException e) {

        BindingResult bindingResult = e.getBindingResult();
        List msgList = new ArrayList<>();
        bindingResult.getFieldErrors().stream().forEach(item->{
            msgList.add(item.getDefaultMessage());
        });
        String msg = StringUtils.join(msgList, ",");
        log.error("【系統異常】{}",msg);
        return new RestErrorResponse(msg);

    }
}


ValidationGroups

public class ValidationGroups {
    public interface Insert{};
    public interface Update{};
    public interface Delete{};
}

目前將ValidationGroups分成新增, 更新, 刪除三個類別

在bean上設置的檢核訊息如下


@Data
@ApiModel(value="AddCourseDto", description="新增課程基本信息")
public class AddCourseDto {

 @NotEmpty(groups = {ValidationGroups.Insert.class},message = "新增課程名稱不能為空")
 @NotEmpty(groups = {ValidationGroups.Update.class},message = "修改課程名稱不能為空")
 @ApiModelProperty(value = "課程名稱", required = true)
 private String name;
 ...
 }

然後使用上, 我們在controller就可以這樣寫, 比方說我們此類為新增 就使用Insert @Validated({ValidationGroups.Insert.class})


    @ApiOperation("新增課程基礎信息")
    @PostMapping("/course")
    public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Insert.class}) AddCourseDto addCourseDto){
        //獲取到用戶所屬機構id
        Long companyId = 1232141425L;
        return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
    }

2023年12月1日 星期五

202312 思考人生方向日誌

轉軟體工程師 是201805

至今5年7個月, 工作約4年3個月

其中有

5個月進修android 5個月進修托福 1個月資料結構

5個月是工作轉換期(差不多轉換6次)

大致上被搞兩次, 一次加班太重, 兩次任務結束沒事做, 兩次被薪水更高機會挖走

真是超級波折, 以至於說, 忙著面試, 忙著適應 也是花了不少時間

以目前年薪來說102 勉勉強強及格, 也是算進了外商只是是駐點


本來練完英文, 想直接走國外工作

但是面試下來, 真正能開高的公司考的演算法考題及系統設計 高流量系統問答

這部分我還是有欠缺

還好在國泰時有機會讓我進修一下redis分布式鎖, 算是開啟了高併發的門

只是說還沒那麼熟練, 也還沒把學到的整理成系統就是, 打算等過幾個專案再來整理優良範例


今年過35了, 五子都沒半個影, 而面對現實的我, 其實壓力很大,

因為不小心還是把前女友留在身邊, 畢竟真的很愛她,

只是說如果要有小孩(後代)的話, 要另外找對象生了,


可能像別人就直接分手找下一個, 只是我捨不得

但是隨之而來, 在已有女友的情況下, 要再找一個女友

條件將會變得相當苛刻

並且可預期女生會需要我經濟上滿足她

每月若是3萬, 那除上0.05, 就是本金要600萬的年利率才足夠養小三

大概~是這樣想

然而, 工作這麼久, 其實有點疲乏, 白天上班有點累

也還是100公斤左右的體重, 是說體力比以前差不少

樣貌也是不太良好,

說實在, 真的壓力很大


還好債卷ETF有小賺, 算是站好了好買點

如果能賺個40萬出來, 對於我目前的困境幫助不少


看一下工作可能還是要找外商高流量工作好點

進修上安排, 可能平日都要有code練習(刷題)

就是說需要有make thing easier的安排


昨天看到說如果慾望足夠大, 方向也會變得相對紀律起來

如果已經得到滿足相對來說會比較躺(這部分要小心)


預計是說 目前先+1天運動

變成一, 三, 六 運動

二, 日刷題 六開局寫專案

四約人吃飯, 五六日玩電腦

上週六量97.5公斤, 希望體重78, 差不多一個月瘦3.3就行, 差不多一星期一公斤

先以目前的安排看看能不能維持一個月, 等後面再慢慢把其他安排加進來






2026半年度目標

 1 每個月看看能不能都做專案, 一年12專案 2 刷題每周4題 3 跑個人scrum, 並組讀書會 4規律讀英文ex每天早上8:30-9:30 5規律運動7:35-8:30 6減肥97->85 這是今年年初的目標, 有刷一點題, 但是差不多三月初AI大爆發, 不得不開始接...