2024年7月4日 星期四

侑城一家第一次吃飯

今天被侑城夫婦邀請吃飯, 他們還約了區裡的弟兄姊妹來

算是年輕人的一區

大約三個感想

1 其中一位弟兄分享大學時母親過世後, 後來因為參加聚會, 學校生活才慢慢走上正常的道路, 我的感受是, 其實這個弟兄有個broken heart, 那時候接觸信仰, 的確部份轉移了他對於母親過世的悲傷思維, 反而使他後面能正常過生活

2 其中一個弟兄有老婆, 有兩個小孩, 看起來很平平淡淡, 但是我以為是一級戰場, 會過得很辛苦, 但是他看起來的確不是特別操勞或花力氣, 平靜而有力量, 我是覺得, 連我上班都很操, 這個人有個家還有小孩, 能運作的樣貌, 能像這個樣子, 他可能成功的運作是值得學習, 或者他有些不同的價值觀

3 回家路上想到羅得&他妻子的畫面, 他就漸漸搬移帳篷, 搬到所多瑪, 然後習慣各種罪惡而不覺得有什麼特別, 而我也很像這個樣子, 我住在林森北旁邊, 時常看到這些, 也融入這些, 難道偏要等到神審判告知來到, 然後接受一切不能回頭的結局嗎? 這是跟我有準備想要買房子有關, 如果生活圈都是這些, 或是就是過這些生活, 假設真有終局, 我的結局也會因我的決定而定, 若是早知道能避開這些, 羅得當初應該搬回去和亞伯拉罕一起住

小結

神用了一些你不知道的方式保全or save那些人, 那些你所認為的不working, 有些方面是有在working, 也或著以你不知道的方式working

兩個角度解讀自己認為神沒有幫我預備

1 當初在的就是在年長區, 要結婚很難working, 其實就應該換區

2 如果30歲結婚, 相對來說有些事情還沒學習, 直接結婚會人生爆炸

2024年6月26日 星期三

事務優化及一種事務失效的改正

內容來自學成在線的媒資管理事務優化

目前的邏輯是方法uploadFile中包含兩個動作

1 將文件上傳到minio

2 將文件信息存儲到資料庫

原本是整個方法上加@transactional

但是1的這部分, 你並不能保證上傳的時間會有多長

以至於說整個方法如果綁transactional會導致占用資料庫資源

現在有個想法, 打算只在2的步驟上加入transactional

然後在2的程式碼中加入會報錯的程式碼, 看看是否會回滾



部分程式碼



  //將文件上傳到minio
  boolean result = addMediaFilesToMinIO(localFilePath, mimeType, bucket_files, objectName);
  if(!result)XueChengPlusException.cast("上傳文件失敗");
  //文件大小
  uploadFileParamsDto.setFileSize(file.length());
  //將文件信息存儲到數據庫
  MediaFiles mediaFiles = addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);
  if(mediaFiles==null)XueChengPlusException.cast("上傳後保存文件信息失敗");

方法片段



@Transactional
 public MediaFiles addMediaFilesToDb(Long companyId, String fileMd5, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName) {
  //從數據庫查詢文件
  MediaFiles mediaFiles = mediaFilesMapper.selectById(fileMd5);
  if (mediaFiles == null) {
   mediaFiles = new MediaFiles();
   //拷貝基本信息
   BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);
   mediaFiles.setId(fileMd5);
   mediaFiles.setFileId(fileMd5);
   mediaFiles.setCompanyId(companyId);
   mediaFiles.setUrl("/" + bucket + "/" + objectName);
   mediaFiles.setBucket(bucket);
   mediaFiles.setFilePath(objectName);
   mediaFiles.setCreateDate(LocalDateTime.now());
   mediaFiles.setAuditStatus("002003");
   mediaFiles.setStatus("1");
   //保存文件信息到文件表
   int insert = mediaFilesMapper.insert(mediaFiles);
   int a=1/0;
   if (insert <=0) {
    log.error("保存文件信息到數據庫失敗,{}", mediaFiles.toString());
    XueChengPlusException.cast("保存文件信息失敗");
   }
   log.debug("保存文件信息到數據庫成功,{}", mediaFiles.toString());

  }
  return mediaFiles;

 }

這時發現雖然會報錯誤, 但是事務沒有回滾, 事務失效




簡單敘述目前狀況

就是controller調用service時, 第一層是調代理對象的方法

但是方法中再調用其他方法, 則會是原對象方法, 如下圖

這裡有個技巧, 可以在方法調service中的方法前加上this.用debug斷點去看this就會發現並非proxy

而這不滿足事務的兩個要求

1 需要是代理對象調方法

2 在調的方法上加@Transactional註解

因為要求沒滿足, 事務沒法生效

課程提供一個解法

就是將當前類再注入進來, 使其變成代理對象

步驟

1 注入本service作為代理對象


@Autowired
MediaFileService currentProxy;

2 將需要事務管理的方法提成接口


public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);

3 調用代理對象call方法


//寫入文件表
MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);



2024年6月7日 星期五

課程了解

尚品甄選

有包含架Harbor操作


udemy上搜尋large scale system可以找到kubernetes架構的專案教學


感覺可以看一下

黑馬頭條

裡面有spring cloud elasticSearch redis docker kafka


瑞吉外賣

有示範數據庫讀寫分離 linux安裝教學


閃聚支付

有示範分庫分表Sharding-JDBC 對交易服務進行分庫分表 分片鍵 插入數據根據商戶id決定要入哪個庫 短信驗證使用騰訊雲 上傳資質證件使用七牛雲


蒼窮外賣

有用到websocket

2024年6月6日 星期四

換工作想法20240607-17

這次換工作, 還是想換到能用redis開發大流量的地方

畢竟有學習過, 稍微再進修一下讓自己能面試上

大約目標就是 關於高併發問題都能回答

然後在用個幾天把面試問題準備一下, 準備去面試

希望這個過程三周能走完XX

看看能不能一天進修14hr, 目前英文停課中


------

[心得] 2024各公司面試心得 - 看板 Soft_Job - 批踢踢實業坊 (ptt.cc)

查了一下似乎還是先刷200題好點

幾家還有興趣的公司


考java考卷

Kafka Redis 高併發 DB問題

B+ tree JVM(這部分可能要放掉?!)

搜尋系統設計題目, 看考古題

2024年5月24日 星期五

2024新年新目標檢討

1 進入外企寫程式(這部分有點修正, 但是先拚英文)

2 英文母語化(確定拚雅思, 也報名補習班)
3 成為程式資深開發者(應該會在11月後再開始拚)
4 減肥or使身材更優, 體力更好, 睡眠正常, 頭髮長回來, 美顏(只減4公斤, 不過生髮水跟保養皮膚都有買)
5 年薪突破140, 資產突破300(非今年目標)

我希望今年能完成
1 兩個月做一個專案 包含redis, Elasticsearch, kafka(未達成)
2 leetcode 一個月 easy 8題 medium 4題(部分達成)
3 一周健身3次, 跑步3次(2, 2 其實就目前來說有點緊繃)
4 擦皮膚保養品(O)
5 每天10:00洗澡, 11:30準備睡覺, 早上6:30起床(改為9:00洗澡, 11:00左右睡覺, 9:00後減少喝水)
6 平日5天讀英文?!(未達成...變成未來式)

他目前的實力並不足以支持他的野心
----------------------------------------------------------
以下為目前修改過版本
目前算是開放博弈開發也接受, 不過, 真實下一家, 會等全部準備完再決定
會這樣考量主要是目前工作還算穩定, 但是面對年紀漸漸大起來
還是把些英文的底打好, 讓以後能夠有更多選擇
因為年紀因素, 今年終極目標就是英文再上一個level
而技術相關, 放到明年

1 3個月考一次雅思考試通過6分, 再三個月考過7分
2 找到合適交往對象
3 保養皮膚, 頭髮長回來, 睡眠正常
4 2個月後減8公斤, 回教室上課(1周減1公斤), 開始1天1題

如果說在今年的11月前, 還沒找到合適的
有可能就變工作優先其它再說了


2024年4月11日 星期四

[leetcode] [KMP] KMP

ABCDABD...

ABCDABF...

簡單的說, 傳統解兩字串匹配部分

可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位

然後不匹配再後移

然而

如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位

隱藏的思維是, 當已知匹配的, 就已知完全不能匹配的部分, 而這部分應該合理的跳過


而當它既是前墜又是後墜的時候, 可能前面就都相同可以跳過

直接開始比開始不同的地方


後贅數組定義, 是整個kmp算法根基

dp[i]: the max length k s.t. s[0:k-1] = s[i-k+1:i]

[x x x] x [x x i]


中心思想, 是得到一個next數組 類似[-1, -1, 0, 1]

當該數位置對應的數字找不到匹配時, 可往前跳向下標位置再進行比對

(網路上有不同解法有跳往下標, 或是前一個下標, 會反應在j的初始值-1或是0)

public static boolean repeatedSubstringPattern(String s) {

if(s.equals(""))return false;

int len = s.length();
int[] temp = new int[len];
int[] next=getNext(temp,s, len);
// 比對表最後一欄位置不為-1 且 長度能被最大重複組除盡
if (next[len-1] != -1 && len % (len - (next[len-1]+1)) == 0) {
return true;
}

return false;
}

public static int[] getNext(int[]next, String s, int len){
// 1 初始化賦予-1
next[0] = -1;
int j = -1;
char[] chars = s.toCharArray();

for(int i = 1; i<len; i++){
// 2 前後綴不相等時, 往前跳到指定位置再進行下迴圈(比對)
while(j>=0&&chars[i]!=chars[j+1]){
j = next[j];
}
// 3 前後綴相等, j++, 並將值放到next表中
if(chars[i]==chars[j+1]){
j++;
}
next[i]=j;
}
return next;
}

參考: https://www.youtube.com/watch?v=t6xa2p6fFS8&t=918s

侑城一家第一次吃飯

今天被侑城夫婦邀請吃飯, 他們還約了區裡的弟兄姊妹來 算是年輕人的一區 大約三個感想 1 其中一位弟兄分享大學時母親過世後, 後來因為參加聚會, 學校生活才慢慢走上正常的道路, 我的感受是, 其實這個弟兄有個broken heart, 那時候接觸信仰, 的確部份轉移了他對於母親過...