---
# System prepended metadata

title: xarefit

---

# xarefit
**這幾年都以python工作 以下回答皆以python為基礎進行**
1. 如何寫一個循環，然後把它轉換成遞迴函數？
這部分以費波那契數列回答，將設計好的函數迴圈執行後呼叫函數即可

```pyhton =
def fib(n):
    global count
    count += 1 #計算總共遞迴了幾次
    if n ==1 or n==2:
        return 1
    return fib(n-1)+fib(n-2)
count = 0
print(fib(10))
print(count)
```
2. 如何找出 slow query？ MySQL 如何進行效能分析？

slow query
```
以Mysql來說 可以從my.ini做參數配置(儲存當 SQL 語句執行時間超過2秒時, 便會將SQL語句儲存)
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/mysql_slow.log
long_query_time = 2
以上配置完後可在mysql_slow.log中查詢相關資訊
```
效能分析
```
可以使用mysqldumpslow工具搜尋慢mysql_slow.log中的SQL語句。
也可以用explain檢視SQL語句的相關情況
或是可以使用Query Profiler(MySQL自帶的一種query診斷分析工具)
```
3. 索引的優缺點? 
```
1.建立適合select或經常使用的索引可以極大提升資料的檢索速度
2.索引並不是越多越好，索引固然可以提高相應select的效率，但其會耗費物理空間，同時也降低了insert及update的效率，因為insert或update時有可能會重建索引
當索引列有大量資料重複時，SQL查詢可能不會去利用索引

```
4. 什麼是 Deadlock？ (用程式碼表示)。 
*Deadlock的部分我自己沒有遇過或是解決過(只能說瞭解大概狀況跟原理)，都是透過書或是網路上的文章學習*

兩個或多個以上線程執行中，因爭奪資源而造成互相等待的狀況，
```python=
import threading,time

class myThread(threading.Thread):
    def doA(self):
        lockA.acquire()
        print (self.name, " getlockA " ,time.ctime())
        time.sleep( 3 )
        lockB.acquire()
        print (self.name, ' getlockB ' ,time.ctime())
        lockB.release()
        lockA.release()

    def doB(self):
        lockB.acquire()
        print (self.name, " getlockB " ,time.ctime())
        time.sleep( 3 )
        lockA.acquire()
        print (self.name, ' getlockA ' ,time.ctime())
        lockA.release()
        lockB.release()
    def run(self):
        self.doA()
        self.doB()

if  __name__ == " __main__ " :

    lockA = threading.Lock()
    lockB = threading.Lock()
    threads = []
    for i in range(5 ):
        threads.append(myThread())
    for t in threads:
        t.start()
    for t in threads:
        t.join()
```
5. 寫一段有 memory leak 的示例程式 (用程式碼表示)。
* python是有garbage collection機制的，理論上不會leak*
以下程序應會持續占用記憶體
```pyhton=
def leak(a=[]):
 a.append(time.time())
 return a
```

> 註: pmap -x [pid]檢視程序佔用的堆記憶體大小
6. 查詢列表中的第一個非重複整數 (用程式表示)
```=python
def get_one(list_test):
    seen = set()
    for e in list_test:
        if e in seen:
            continue
        seen.add(e)
        if len(seen) == 1:
            return e
k = get_one([1,2,2,3,3,4,5,6])
print(k)
```
7. 寫一個簡單的垃圾回收系統。

python 引用計數機制
```
每個對象維護一個ob_ref字段，用來記錄該對象當前被引用的次數，每當新的引用指向該對象時，它的引用計數ob_ref加1，每當該對象的引用失效時計數ob_ref減1，一旦對象的引用計數為0，該對象立即被回收，對象佔用的內存空間將被釋放。
```
8. 如何設計 REST API ？
```
1.決定API的http動詞(POST,GET較常用,PUT DELETE PATCH HEAD)
2.決定端點 URI
3.HTTP回傳狀態碼(之前有接觸過自己設計回傳狀態的案件，但其結果並不方便，仍應使用適當的HTTP狀態碼)
4.HTTP Header(自己都是使用一般常見設定)
5.HTTP Body(個人都是以JSON格式為主)
```