---
# System prepended metadata

title: 實習小記

---

Benjamin_Tsai@amat.com

# 實習小記
TODO: 
1.  加入"此物料不在資料庫中"提示
2.  處理進Airlock的台車掃描功能(10月第2~3周slow)
4.  刪除拆PO動作及限制(?)

## 241125


## 241121
0. buttom switch
1. add slot search
2. take photo
3. add photo

## 241114
[Saving/loading images](https://en.ids-imaging.com/manuals/ids-peak/ids-peak-user-manual/2.13.0/en/program-save-images.html)

## 241028
[Opening a camera (API)](https://www.1stvision.com/cameras/IDS/IDS-manuals/en/program-open-camera.html)

## 240926
```
UPDATE [MaterialManagement].[dbo].Staging_Material
SET [B_NB_CN] = cover
FROM (
    SELECT st.[RFIDTAGID]
          ,st.[LOCATION]
	      ,th.[Location] as th_Location
	      ,st.[B_NB_CN]
	      ,SUBSTRING(th.[Location], 3, 1) as cover
    FROM [MaterialManagement].[dbo].Staging_Material as st
    LEFT JOIN [Hadoop2TMCApps].[dbo].[LTS_transaction_history] as th ON st.RFIDTAGID = th.RFIDTagID
    WHERE st.[B_NB_CN] IS NULL
) AS subquery
WHERE [MaterialManagement].[dbo].Staging_Material.[RFIDTAGID] = subquery.[RFIDTAGID]
```

## 240925
[SIPOC模型法](https://derjeng-lin.medium.com/%E8%AB%87-sipoc%E6%A8%A1%E5%9E%8B%E6%B3%95-%E6%96%BC%E7%94%A2%E5%93%81%E9%96%8B%E7%99%BC%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90%E7%9A%84%E9%81%8B%E7%94%A8-%E4%BB%A5%E6%95%99%E8%82%B2%E9%81%8A%E6%88%B2%E8%A8%AD%E8%A8%88%E7%82%BA%E4%BE%8B-fcec719288a5)
Source, Input, Process, Output, Customer

Report
* 車次車種數量直方圖
* 單一PO占比skid直方圖
* 所有CartPO#直條圖
* 容積率UT各車種點陣分布圖
* NeedByDate分布圖

做完Daily Report之後可以做一個Double check比對所有是否一致
## 240906
#### Task:
加速拆PO:
1. 減少資料庫動作(查詢)
2. 加快app拖曳動作

測試拆PO時間(看看費時最長的是哪裡)
加入EnsureVisible()


## 240905
#### Study:
```
// 確保選中的節點在可見範圍內
treeView1.SelectedNode.EnsureVisible();
```
The I/O operation has been aborted because of either a thread exit or an application request
System.Net.Sockets.SocketException(995)
1. 過多的連線：如果您的應用程式同時執行大量的網路請求或連線，可能會導致系統無法處理所有的請求，從而引發錯誤。您可以嘗試限制同時進行的連線數量，或者使用非同步方式處理網路操作，以避免阻塞UI線程。
2. 網路問題：這個錯誤可能也是由於網路連接不穩定或斷線引起的。您可以確保您的網路連接是穩定的，並且在進行網路操作之前檢查連接狀態。
3. 异常处理：當出現這個錯誤時，您可以使用try-catch語句捕獲SocketException並進行適當的處理。例如，您可以顯示一個錯誤訊息給使用者，或者重新嘗試網路操作。

## 240902
#### 工作紀錄:
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 偵測網頁上傳成功的success訊息
wait = WebDriverWait(driver, 10)
# 使用CSS Selector定位成功訊息元素
success_message = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.success-message'))).text
print(success_message)
```

## 240828
#### 工作紀錄:
* 8/10 and HU# < 41200000000000820000和Missing Container的資料Location=Assy', Container='-'
* 測過AutoRelease的Container Lookup時間已經抓很緊了(網頁搜尋很慢)，可能沒辦法減少等待時間
* mms_mm新增Need_By_Date，以及可以一次查詢多個OPS(中間加逗號就可以了)

#### Observation:
* Release台車跑很慢
* 確定的視窗會干擾作業

#### Problem
資料庫有Airlock但是LTS沒有
```
41200000000000825835
T2_STG_Cart_117
AirLock
T2_STG_Cart_117
Assembly
2024-08-22 23:14:39.360
2088
```


## 240827
* Observation:
人員會先把Cart-NBC一個一個綁上Kit Audit(清空+綁到Kit Audit)

* Problem:
拆PO會有重複資料出現
* Problem:
出現第一次更新沒有抓到資料，第二次更新就有資料的情況

* Solved: Unable to find 'C:\\Users\\e193088\\OneDrive - Applied Materials\\Code\\ca.crt' when adding binary and data files.
```
pyinstaller --add-data 'ca.crt;seleniumwire' --add-data 'ca.key;seleniumwire' --onefile 'AutoToolSet.py'
```


## 240820
* 發現問題: 有可能有些確定都上傳成功的物料在LTS上卻沒有上傳
->做完Daily Report之後可以做一個Double check

## 240819

* 發現問題: 進到Missing Container中的物料很多 -> 很多舊資料都跑到Missing Container了
FinishUnloading()中邏輯判斷沒有加上Belong_Request_Name，所以會把舊資料丟到Missing Container中
->已經更新邏輯了，需要小心查看是否會影響到原本Unloading作業
->實際測試41200000000000824010(大料)看起來是沒問題
* 發現問題:更新邏輯----ex.41200000000000797380
現在很比較少用，看不出來問題在哪

New Think: **十倍成長思維**-你無法藉由自己過去的思考方式來發揮十倍成長，需要抓出**兩成關鍵要務**和其他八成無足輕重的事，並且改變80%現行做法為新方法。
-> 有沒有可能讓一台RFID完全吃掉所有Kit Audit的量呢?讓工作效率變成10倍。
優點:減少人員x工作時間、減少RFID reader作業互相影響

要如何達成呢?
* Observation 1 ---- Capibility
分析Kit Audit目前的量、是否有可能完全只用一台就吃掉所有物料
* Observation 2 ---- 解決RFID難題:誤刷和無法感應
在做Kit Audit的人旁邊測試是否真的使用RFID的誤刷、無法感應比例有多少
* Observation 3 
跟著現在所有流程跑一次，了解所有動作、需要的人員安排、分出兩成關鍵要務和八成可以利用自動化軟體替代的部分。



## 240815
觀察:
* 現在主要用來點料的是最外排的第一台電腦
    * Think: 可能是因為腹地空間大，也方便放到台車上
* 有些物料過長，需要兩台台車頭尾連在一起
* 每天需要放的台車很多(需要實際數據)，圍著Staging成一圈，不能一次放一台後送進去?
* Assembly裡面也有很多空掉的台車閒置
* 現在所有的RFID機器都被閒置Q^Q
* 垃圾(拆下來的包裝)很有可能會跟SKID混在一起堆放
* 點料的動作很多種，有些需要拆掉包裝後包起來放
* 電腦耗電率高

*? 有沒有可能讓SKID跟台車的連結更多，更方便點料上車?*

    安排車車的單子:(人員每天手抄)
    PO        OPS    Cart
    12345    0100    001
             0200    025
             0300    025
             0400    025
    12222    0200    245
    ...      ...     ...

## 240814
Staging SMPPS
Think:
* RFID硬體要怎麼優化方便使用
* 現在預想/設計的動線是最佳的嗎?是否貼近實際需求?要如何優化?
    * 混PO需要被監測
    * 刷完物料需要去找台車，這樣是對的嗎?
    * 最後使用視覺化來呈現動線、分布等
* 現在實際使用率

----------------------------------------------
Dashboard 統計資料
    派車PO/skid統計
    台車利用率
Finance
    ~~串接資料(.py)~~
Docker
派車更新出錯會發信件的機制

## 240731
完成sheet3的Ranking

## 240729
Error Message Record(Web)完成[testversion]
等Tony確認過後再上到正式版

## 240723
派車限制(H) =>改好了!但選多筆物料時有點奇怪，等Tony回來討論一下
readMS小改版 ver9.3
``` cmd
python -m PyInstaller -F --add-data "data/QtrConverter.xlsx;data" 9_read_MS.py
```

## 240722
W/H 手動更新exe檔

## 240708
7/5 MSreader
7/8 LTS update test start


## 240702
* 修正派車系統急件問題
``` js
// ReferenceError: Invalid left-hand side expression in postfix operation
sessionStorage.emergencyCount = parseInt(sessionStorage.emergencyCount)++;
```
js不能寫++只能寫+1
* 解決Chromedriver關不掉的問題
driver.quit()要加在最後面

## 240701
* 確認0.1.6版本執行順利
* 增加MessageBox錯誤訊息的Tag
* 調整Aging_report auto download的關閉方式
* 解決單次更新內可能會重複Insert更新前不再資料庫中的物料問題
* 解決Staging遇到的object disposed problem
* LTS Auto_update網頁查詢測試連接

## 240628
* 複製現有的DB格式變成新的testdb
``` sql
USE [MaterialManagement]
GO

SELECT * into TransactionHistory_testdb
  FROM [dbo].[Transaction_History]
  where 1 = 0;

GO
```
複製資料表的結構和資料到testdb，用一個假的where來避免複製資料
* 釋出0.1.6解決多PO問題
* 發現單次更新內可能會重複Insert更新前不再資料庫中的物料

## 240627
* 研究[ArgumentOutOfRangeException](https://learn.microsoft.com/zh-tw/dotnet/api/system.argumentoutofrangeexception?view=net-8.0")
    可能的問題:
    1. 您正在使用空字串或 String.Empty 。
    2. 您正在根據該字串內子字串的位置操作字串，而且無法判斷是否確實找到子字串。
    3. 您已嘗試擷取超出目前字串範圍的子字串。
```
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'index')
   at System.Windows.Forms.TreeNodeCollection.get_Item(Int32 index)
```
* 加入每個動作對Transaction Date的更變
* 確認交接手冊

## 240611
* 釋出SMPPS0611最新版，加入AutoToolSet.py的exe
* 更新Container List 資料庫
* 解決ContainderInfo中抓取資料不同Belong_Request_Name的問題

## 240604
* SMPPS version0.1.4 release
    更動:
    * origine/master push
    * 增加Step2的OPS顯示
* readMS version 8 release -> 等待確認 -> 已確認
* 增加log檔案
    

## 240527
* 確認Material Management功能正常
* LTS update

## 240520
* 看code
* 異常處理in手冊

## 240516
* 跟LTS對談方法
* 更新網頁
* 確認是否可以撈3~5月的車次清單，裏面有急件“E” 的記錄

## 240513
[Query mode](https://andyludeveloper.medium.com/%E7%8E%A9-django-part-6-%E6%9F%A5%E8%A9%A2%E8%B3%87%E6%96%99-query-model-af542ed8eb5e)


## 240509
今天開始決定反著紀...往下拉太長了
Task: 
* 更改查詢系統的資料庫參照(所有有HU Number的物料都要找的到)
* 確定所有的物料查到的Location都是30分鐘內最新的->跟LTS對談
* 新增單筆物料Transaction History的串接Modal
* 幫忙查看Transaction History更改後遺失的資料及原因
TODO 建立一個新的地圖頁面


## 240321 
today's task
了解網頁相關知識，以及完成快到期的線上必修課程
~~1. Restful API~~
~~2. status code~~
~~3. json response~~
~~4. ONBOARDING HR course~~
~~5. DEMO understanding~~

### Restful API
Representational State Transfer (REST) 是一種軟體架構，它對 API 的運作方式施加了條件。

RESTful API由三部份組成
nouns: 固定的URL
verb:
* get 讀取
* post 新增
* put 更新
* delete 移除
content types: 內容格式

RESTful API在發送request時，固定Route只改變METHOD(verb)，也可以固定API請求規則。

[這個網站解釋的特別清楚~](https://hackmd.io/@monkenWu/Sk9Q5VoV4/https%3A%2F%2Fhackmd.io%2F%40gen6UjQISdy0QDN62cYPYQ%2FH1yxwXyNN?type=book)

### status code
2xx = Success（成功）
3xx = Redirect（重定向）
4xx = User error（客戶端錯誤）
5xx = Server error（伺服器端錯誤）

### Json request
JavaScript Object Notation (JSON)
JSON 物件基本上就是 JavaScript 物件，而陣列也可以是有效的 JSON 物件

順便複習了一下HTML



### ONBOARDING HR course
Applied's main customer
The U.S. -- intel
South Korea -- samsung
Japan -- Fujitsu
Taiwan -- tsmc
Applied 學習資源:
[AUG-Linkind learning](https://amat.sabacloud.com/Saba/Web_spf/NA3P1PRD0037/app/shared;spf-url=pages%2Fpagelistview%2Fpgcnt000000000041382)



### Source
https://aws.amazon.com/tw/what-is/restful-api/

https://developer.mozilla.org/zh-TW/docs/Learn/JavaScript/Objects/JSON

https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods

## 240325
task
~~1. 開晨會~~
~~2. Brief intro~~
~~3. 去staging接電線/組裝RFID機器~~

## 240326
~~1. 去staging 測試RFID 機器~~
~~2. 寫派車系統自動更新程式Loop + timer~~

### timer
利用固定1hr去掉執行時間
```
while true
    start_time = time.time()
    ...
    time.sleep(60*60-(time.time() - start_time))

```

## 240328
~~1. simba, MMS, Data Management使用者介面了解~~
2. bootstrap

熟悉Django和Bootstrap的連結
https://www.w3schools.com/django/django_update_model.php

## 240401
~~1. 確認臺車編號~~
~~已和Cage詢問，下午確認~~
0402已確認，送出列印(前1~99號前面沒有補0)
~~2. 安裝RFID讀取程式~~
~~3. 製作感應棒標籤，改寫編號~~
已嘗試改寫1~6
4.  Material Management介面構想
MMS沒有權限


## 240408
軟體上線週
無限Debug
* 下載版本管理
* 使用者切換->軟體要放在公用
* 驅動程式安裝
* 材料準備
* 實際運作時會需要的功能增加
    * 暫停感應、感應範圍改善
    * 錯誤刪除
    * 感應速率調整
    * 字體放大

這些錯誤其實應該要在測試之前就完成Debug，流程要真的走好多次才行，測試非常重要
雖然待在Staging走來走去很累，但是真的在現場才可以發覺哪些需求，以及發現問題所在（例如上傳錯誤、電腦共用會到處亂跑等）

之後如果需要安裝較大的軟體的話可能要尋找其他方式，只用線上上傳下載真的好慢...

## 240416
MMS web 新增頁面Materail Management的部分
Processing Logic:
1. urls.py 新增 urlpatterns
```
url(r'^test/$', views.testOutput, name='test'),
```
2. view.py 增加function 呼叫html
``` py
def testOutput(req):
    transactionHistory = TransactionHistory.objects.using('material')
    # var = class in models.py中的物件('material'為setting中dataset的access way')
    stmaResult = list(transactionHistory.filter(RFIDTAGID=fixedHU).values())
    # stmaResult == staging material result
    return render(req, 'material_management.html')
```
3. 新增html檔案
4. js渲染資料


*btw*
完成code git管理: 
先在Sam電腦中建一個repo後共享
```
$ git config --global http.sslBackend schannel
$ git clone https://amjpn-my.sharepoint.com/:f:/g/personal/sam_tu_amat_com/...
```
但是用我的terminal run server error
要注意更換環境時的套件管理

## 240418
需要Sam確認環境套件版本
[Django 模型與資料庫](https://ithelp.ithome.com.tw/articles/10212427)

## 240422
HTML + CSS
格式排版頭好痛ＱＱ
[bootstrap排版](https://bootstrap5.hexschool.com/docs/5.0/forms/layout/)
g(x/y)-(1~5) x y軸的間隔1~5(小到大)
利用div切出row and col
```html
<div class="row g-3">
  <div class="col">
    <input type="text" class="form-control" placeholder="First name" aria-label="First name">
  </div>
  <div class="col">
    <input type="text" class="form-control" placeholder="Last name" aria-label="Last name">
  </div>
</div>
```
前端資料用form傳入查詢資料
[form with django](https://ithelp.ithome.com.tw/articles/10304458?sc=pt)
```
chat GPT 示範
```

Q()
依次查詢多樣query的時候可以使用Q()
```python
q_objects = Q()
if query1: q_objects &= Q('query1'=query1)
if query2: q_objects &= Q('query2'=query2)
if query3: q_objects &= Q('query3'=query3)
results = StagingMaterial.objects.filter(q_objects).value("column")
```
!注意:
在Q中和filter中的條件等列式，**不可以加入空格**
```
return HttpResponse(Part_No)
```
不知道為甚麼抓不出POST進去的變數(頁面空白)
https://prod.liveshare.vsengsaas.visualstudio.com/join?1DB51157F1684AFB96E59F570EBFA53BCAA6

## 240423
[render & redirect](https://ithelp.ithome.com.tw/articles/10236351)


## 240429
* ~~解決Auto download LTS的問題，成功安裝在Edward電腦上~~
* 增加Material Management功能細節
* 明天要詢問使用著需做更進一步修改
* ~~資安線上課程due on 5/6~~
[Create a Data Table in Bootstrap 5](https://www.youtube.com/watch?v=EKSPK_Zk9X8)

Quanty, user col
WSB query
transaction history for each HU No

link
Large Part, Transaction History
``` html
<!DOCTYPE html>
<html>
<head>
  <style>
    /* 隱藏modal，初始狀態下不顯示 */
    .modal {
      display: none;
      position: fixed;
      z-index: 1;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      overflow: auto;
      background-color: rgba(0,0,0,0.4);
    }

    /* modal內容區域 */
    .modal-content {
      background-color: #fefefe;
      margin: 15% auto;
      padding: 20px;
      border: 1px solid #888;
      width: 80%;
    }

    /* modal關閉按鈕 */
    .close {
      color: #aaa;
      float: right;
      font-size: 28px;
      font-weight: bold;
    }

    .close:hover,
    .close:focus {
      color: black;
      text-decoration: none;
      cursor: pointer;
    }
  </style>
</head>
<body>

<table border="1">
  <tr>
    <td onclick="openModal()">點擊打開 Modal</td>
  </tr>
</table>

<!-- modal -->
<div id="myModal" class="modal">
  <!-- modal內容 -->
  <div class="modal-content">
    <!-- modal關閉按鈕 -->
    <span class="close" onclick="closeModal()">&times;</span>
    <p>這是modal的內容。</p>
  </div>
</div>

<script>
  // 取得modal元素
  var modal = document.getElementById("myModal");

  // 取得關閉modal的<span>元素（關閉按鈕）
  var span = document.getElementsByClassName("close")[0];

  // 點擊表格單元格打開modal
  function openModal() {
    modal.style.display = "block";
  }

  // 點擊關閉按鈕關閉modal
  function closeModal() {
    modal.style.display = "none";
  }

  // 點擊modal外的區域關閉modal
  window.onclick = function(event) {
    if (event.target == modal) {
      modal.style.display = "none";
    }
  }
</script>

</body>
</html>
```

## 240502
檢查網頁Transaction History之錯誤原因
->參照之DB錯誤
***在設計資料庫欄位時要注意使用者目的!***
因為想要Review容積使用率，因此在儲存Data時需要也將size及使用車種之size都記錄起來。
若資料(SKID)之後可能會被覆蓋掉，也需要更小心資料的儲存方式，將需要的資料留下來。

## 240507
跟網頁modal取資料奮戰中
Query OR => |= Q()
Query AND &= Q("a"=A)
```python
def my_view(request):
    results = [...]
    combined_query = Q()
    for result in results:
        result_id = result['id']
        combined_query |= Q(id=result_id)
    history_entries = History.objects.filter(combined_query)


```

偵測使用者事件觸發
```javascript
const myButton = document.getElementById('myButton');
myButton.addEventListener('click', function(event) {
    event.preventDefault();
    // send ajax to django
    $.ajax({
        type: 'POST',
        url: '/my_django_view/',
        data: { event: 'pointer_event_data' },
        success: function(response) {
            //success
        },
        error: function(error) {
            //error
        }
    });
});
```