# 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格式為主)
```