File size: 10,708 Bytes
e6da2e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# note

πŸ”– **Ringkasan singkat (untuk dibaca besok)**

- Project: API deteksi fraud berbasis Flask.
- Status saat ini: semua unit & integration tests lulus (2 passed).
- Model files: `ensemble_model_enhanced.joblib` (prioritas) / `ensemble_model.joblib` / `Ensemble_model.joblib`.
- Preprocessor files: `preprocessor_enhanced.joblib` (prioritas) / `preprocessor.joblib` / `Preprocessor.joblib`.
- Config: `anscombe.json` (cari case-insensitive).
- Dependencies penting: `scikit-learn==1.6.1` (dipin), `imbalanced-learn` (untuk unpickle model), `requests` (untuk integrasi).

---

## Cara menjalankan server (cepat)

1. Pastikan dependencies terpasang:
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -m pip install -r requirements.txt

```
2. Jalankan server Flask (foreground):
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" app.py

```
Server akan tersedia di: `http://127.0.0.1:5000` (default). Tekan `Ctrl+C` untuk stop.

3. Jalankan server di background dan simpan log:
```powershell

Start-Process -FilePath "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -ArgumentList "app.py" -RedirectStandardOutput server_out.log -RedirectStandardError server_err.log -PassThru

Get-Content server_out.log -Tail 50 -Wait

```

---

## Cara menguji endpoint `/predict`

- PowerShell:
```powershell

Invoke-RestMethod -Uri http://127.0.0.1:5000/predict -Method Post -ContentType 'application/json' -Body '{"features":[200,1,0,500]}'

```
- curl:
```powershell

curl -X POST http://127.0.0.1:5000/predict -H "Content-Type: application/json" -d "{\"features\":[200,1,0,500]}"

```
- Python one-liner:
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -c "import requests; print(requests.post('http://127.0.0.1:5000/predict', json={'features':[200,1,0,500]}).json())"

```

Respons contoh:
```json

{"fraud":0, "fraud_prediction":0, "probability":0.83}

```

---

## Menguji frontend (quick smoke test)

1. Pastikan server Flask berjalan (lihat bagian "Cara menjalankan server").
2. Serving file frontend agar fetch berjalan tanpa masalah CORS dari file://, mis. jalankan dari folder `frontend`:
```powershell

cd frontend

python -m http.server 8000

# lalu buka http://localhost:8000/fraud_detection_frontend.html di browser

```
3. Periksa `API_BASE_URL` di `frontend/fraud_detection_frontend.html` β€” default saya set ke `http://localhost:5000` karena endpoint `/predict` ada di root.
4. Form akan mengirimkan payload lengkap yang mencakup field yang diharapkan preprocessor (contoh payload yang berhasil diuji):
```json

{

	"merchant_name":"Test",

	"avg_amount_per_transaction":123.45,

	"day_of_week":2,

	"amount_deviation_from_location_mean":0,

	"transaction_category":"retail",

	"customer_no_transactions":0,

	"customer_lat":null,

	"transaction_type":"online",

	"customer_place_name":null,

	"merchant_id":null,

	"location":"New York",

	"customer_job":null,

	"age":null,

	"merchant_long":null,

	"amount_per_city_pop":0,

	"customer_long":null,

	"distance_customer_merchant":0,

	"transactions_per_customer_ratio":0,

	"customer_city_population":0,

	"merchant_lat":null,

	"customer_no_payments":0,

	"customer_no_orders":0,

	"payments_per_order_ratio":0,

	"hour_of_day":12,

	"amount":123.45,

	"customer_zip_code":null,

	"mean_amount_by_location":0,

	"fraud_rate_by_location":0,

	"customer_gender":null

}

```

Hasil uji lokal (contoh): server merespons 200 dan body JSON seperti `{"fraud":0,"fraud_prediction":0,"probability":0.766...}`

---

## Menjadikan Frontend ke Aplikasi Mobile (ringkasan & langkah cepat)

Jika ingin agar frontend bisa diakses seperti aplikasi mobile, ada 2 jalur praktis yang saya rekomendasikan:

- **PWA (Progressive Web App)** β€” tercepat dan paling mudah dicoba.
	- Buat `manifest.json` (name, short_name, icons, start_url, display: standalone).
	- Tambah `sw.js` (service worker) untuk caching (app shell) dan memungkinkan akses offline terbatas.
	- Pastikan serve via HTTPS (Chrome/Edge mewajibkan HTTPS untuk installable PWA). Untuk development, pakai `ngrok http 8000` atau host sementara.
	- Pengguna bisa pilih "Add to Home screen" di browser Android/Chrome.
	- Cocok untuk prototipe dan distribusi cepat tanpa perlu build native.

- **Capacitor (WebView wrapper β†’ Android/iOS native app)** β€” bila mau jadi APK/IPA.
	- Butuh Node.js dan Android SDK (untuk Android) atau Xcode (untuk iOS).
	- Langkah ringkas:
		```powershell

		# di folder project root

		npm init -y

		npm install @capacitor/core @capacitor/cli

		npx cap init my-app com.example.myapp

		# Copy output static (letakkan file html ke folder `www/` atau build pipeline)

		npx cap add android

		npx cap copy android

		npx cap open android

		```

	- Untuk dev lokal saat backend di localhost, gunakan `ngrok` (atau host backend) supaya device nyata bisa reach API.


### Checklist penting sebelum rilis
- Pastikan backend reachable dari device (hosted / ngrok untuk testing).
- Gunakan HTTPS untuk API (Play Store & browser modern membatasi HTTP).
- Pastikan CORS/Origin sudah diatur (PWA: origin penting; WebView biasanya tidak terkena CORS sama cara).
- Otentikasi & keamanan: pakai token, jangan hard-code credentials di kode klien.
- Ukuran & performa: minimalkan asset (gambar, script) dan aktifkan caching service worker untuk PWA.
- Untuk Play Store: sign APK dengan key, perhatikan kebijakan privasi & permission.

### Contoh resource cepat (starter files)
- `manifest.json` (minimal):
```json

{

	"name": "Fraud Detection AI",

	"short_name": "FraudAI",

	"start_url": "/fraud_detection_frontend.html",

	"display": "standalone",

	"icons": [ { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" } ]

}

```
- `sw.js` (very small cache-first):
```js

const CACHE_NAME = 'fraud-ai-v1';

const ASSETS = ['/', '/fraud_detection_frontend.html', '/styles.css'];

self.addEventListener('install', e => {

	e.waitUntil(caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS)));

});

self.addEventListener('fetch', e => {

	e.respondWith(caches.match(e.request).then(r => r || fetch(e.request)));

});

```

---

## Implementasi PWA & Capacitor (yang sudah saya tambahkan)

- Sudah saya tambahkan ke repo:
	- `frontend/manifest.json`, `frontend/sw.js`, `frontend/icons/icon.svg`
	- `frontend/README_PWA.md` (cara test & catatan)
	- Perubahan pada `frontend/fraud_detection_frontend.html` (link `manifest.json`, register `sw.js`)
	- `mobile/README_CAPACITOR.md` berisi langkah awal untuk membungkus aplikasi dengan Capacitor

Jika Anda ingin saya lanjut scaffold project Capacitor (init + add android, script npm), saya bisa kerjakan β€” beri tahu saya, dan saya akan buat branch terpisah karena itu menambahkan file Node.js/platform yang besar.


---

## Menjalankan tests

- Jalankan semua tests (unit + integration):
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -m pytest -q

```
- Hanya unit tests (skip integration):
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -m pytest -q -m "not integration"

```
- Hanya integration tests:
```powershell

& "C:\Users\CINDY\AppData\Local\Programs\Python\Python310\python.exe" -m pytest -q -m integration

```

> Catatan: integration test men-start server otomatis pada port `5001`.

---

## Debugging cepat (jika error)

- Jika mendapat `Connection refused`: server tidak jalan atau port diblokir. Cek log `server_out.log` / `server_err.log` dan jalankan server di foreground untuk melihat traceback.
- Jika mendapat `500 Internal Server Error`: buka `server_err.log`, salin traceback, lalu perbaiki (bisa minta saya terjemahkan/diagnosa).

Perintah cek log:
```powershell

Get-Content server_err.log -Tail 200

```

---

## Hal lain yang sudah saya lakukan
- Menambahkan file `tests/test_integration.py` dan `scripts/run_integration_debug.py` (debug helper).
- Menambahkan `.vscode/settings.json` untuk pytest discovery.
- Membuat `pytest.ini` dengan marker `integration`.
- Membuat perubahan di `app/model.py` agar lebih fleksibel memuat model/preprocessor dan meng-handle input fitur yang berbeda panjang.

---

## Rencana selanjutnya (opsional)
- Commit & push perubahan jika Anda mau (saya bisa bantu buat pesan commit). 
- Tambahkan CI (GitHub Actions) agar tests jalan otomatis di push/PR.
- Buatkan `DEVELOPMENT_NOTES.md` yang lebih panjang (jika Anda mau dokumentasi lebih lengkap).

---

Jika mau, saya bisa langsung commit file `note.md` ini (atau buat branch & PR). Mau saya commit sekarang? βœ…

---

## Uji Stabilitas / Load testing

Kalau Anda mengalami kesulitan membuat uji stabilitas, berikut langkah praktis yang bisa dilakukan secara lokal untuk mengecek bagaimana backend `predict` berperilaku di bawah beban.

1) Jalankan server dengan server WSGI produksi
- Windows: gunakan `waitress` (sederhana dan cocok di Windows)
```powershell

python -m pip install waitress

waitress-serve --listen=0.0.0.0:5000 app:app

```
- Linux/macOS: gunakan `gunicorn`
```bash

python -m pip install gunicorn

gunicorn -w 4 -b 0.0.0.0:5000 app:app

```

2) Jalankan Locust (sudah saya siapkan file `load_tests/locustfile.py`)
```powershell

python -m pip install locust

locust -f load_tests/locustfile.py --host=http://localhost:5000

# buka http://localhost:8089 untuk mengatur jumlah users dan spawn rate

```

3) Panduan uji bertahap
- Mulai kecil: 5 users, spawn rate 1/s selama 30s. Naikkan perlahan (20 β†’ 50 β†’ 100) sambil memonitor CPU/RAM dan error rate.
- Perhatikan latency p50/p95/p99 dan request failures di Locust UI.

4) Jika Anda ingin menguji dari perangkat mobile (Capacitor) atau perangkat nyata:
- Pastikan backend dapat dijangkau dari device β€” gunakan `ngrok http 5000` untuk membuat HTTPS tunnel, lalu gunakan URL ngrok sebagai `API_BASE_URL` di frontend.

5) Interpretasi singkat
- Error rate tinggi: kemungkinan server kehabisan worker/connection atau unhandled exceptions. Cek `server_err.log`.
- Latency tinggi: periksa penggunaan CPU (model inference mungkin bottleneck). Solusi: batching, memindahkan inference ke worker terpisah, atau skalakan server (multiple instances/load balancer).

6) File & tool yang saya tambahkan
- `load_tests/locustfile.py` β€” contoh script Locust untuk POST `/predict`.

Kalau mau, saya siap bantu menjalankan uji ini bersama (saya pandu perintah di terminal Anda), atau scaffold runner otomatis di cloud (mis. k6 script + GitHub Actions) untuk uji berkelanjutan.