2017年7月5日 星期三

Windows更新後開機卡在黑畫面轉圈圈

前言:不久前做了Windows 10的重大更新,更新完就發現開不了機,一直卡在黑畫面轉圈圈,上網查了很多相關方法都失敗,最後只能重灌。原本以為是更新未完成,又強制重開機造成更新失敗,但重灌完並確認更新完成,隔天重開機發現又卡在同樣情況,表示應該不是重灌不完全造成。詳細發生原因不能確定,但歸納出一些解決方法。

解決:
1. 首先,若想要進入系統,除了網路上所說盡量把一些外接裝置(ex. USB滑鼠)都拔掉再開機之外,還可以試著將系統硬碟之外的硬碟都拔除,這個方法尤其適合將系統裝在SSD硬碟的人。

2. 進入系統後,在設定->電源與睡眠->其他電源設定->選擇按下電源按鈕時的行,先按"變更目前無法使用的設定",再將開啟快速啟動(建議選項)關閉

2016年6月26日 星期日

Synology NAS在雙路由器下的port forwarding設定方法

    在安裝好NAS之後,若要使用像是Synology在手持裝置上提供的DS file,可能需要對路由器做port forwarding設定。如果今天我們的NAS是經過兩個路由器連接後才進入網際網路,那就要對兩個路由器都設定port forwarding。
    我的網路連接狀況如下(圖1)

圖1

    首先我們要先弄清楚我們機器的IP。在DSM 6.0.1下,NAS的IP可以在控制台->網路->網路
介面->區域網路->IP位址
下找到(圖2)

圖2

這個位址(192.168.0.101)就是Router 1分配給NAS的位址。若我們打開電腦上控制台->網路和網際網路->網路和共用中心->變更介面卡設定->乙太網路->狀態->詳細資料->IPv4位址,我們可以看到我們電腦的位址(圖3)

圖3

可以看到這個位址(192.168.0.100)和NAS的位址只差了1號,這是因為router在分配位址時習慣相差1號。
    接下來我們要知道Router 1的位址,這可以在Router 1的管理頁面找到。我們可以在NAS上的控制台->網路->一般->一般->預設閘道器(gateway)(圖4)或是電腦上的控制台->網路和網際網路->網路和共用中心->變更介面卡設定->乙太網路->狀態->詳細資料->IPv4 預設閘道(圖5)看到

 圖4

圖5

我們在瀏覽器上輸入這個位址(192.168.0.1)即可登入Router 1的管理頁面(圖6)

圖6

這個畫面每家路由器都不太一樣,我是以TP-LINK為例。在狀態->網際網路(WAN)找到IP位址以及預設閘道(圖7),IP位址(192.168.1.111)就是Router 2給Router 1分配的位址,預設閘道(192.168.1.1)即為我們登入Router 2管理畫面的位址。

圖7

在瀏覽器輸入預設閘道位址(192.168.1.1),進入Router 2的管理畫面。可以在IP位址找到網際網路的IP位址(圖8)

圖8

現在我們可以知道我們網路整體的位址狀況了(圖9)

圖9

port forwarding的目的就是讓路由器看到特定port的封包時,可以按照設定的方式轉送給特定的區域網路IP。我們進入Router 1的管理畫面,並進入通訊埠導向(圖10)

圖10

點選新增,照圖11的方式進行設定

圖11

IP位址的部分填上要導向的IP位址,因為Router 1要導向NAS,因此填入NAS的IP(192.168.0.101)。服務通訊埠和內部通訊埠兩個選項,在有些路由器中稱為通訊埠開始以及通訊埠結束,就填上服務的port編號,以Synology的DS file為例,是5000。兩個都填一樣就可以了。通訊協定是TCP。這些在Synology的說明網站可以找到(https://www.synology.com/zh-tw/knowledgebase/DSM/tutorial/General/What_network_ports_are_used_by_Synology_services)。
接下來在Router 2的管理畫面,一樣找到類似port forwarding的選項(圖12)

圖12

點Add,照圖13的方式進行設定

圖13

這個路由器多了可以輸入服務名稱的功能,不過應該不是很重要就是了。因為Router 2要轉送封包給Router 1,因此IP位址輸入Router 1的位址(192.168.1.111),External Port Start和External Port End和剛才的服務通訊埠和內部通訊埠意思相同,填入5000,這樣設定就完成了。
    現在我們可以在DS file中輸入我們的網際網路IP位址,以及NAS的帳號和密碼(圖14
)。這樣當我們的Router 2接收到port為5000的封包時,就會自動轉送到Router 1,Router 1接著會再將封包送到我們的NAS中。

圖14

[2016/6/29]更新: 固定IP設定
    我們的路由器為了方便多台電腦使用,通常是設定DHCP,也就是浮動IP。這樣的設定可以讓電腦在接上網路線後,自動偵測使用的IP位址,而不用再多做設定。我們可以在圖7中看到,Router 1的IP顯示為浮動IP。這樣的設定有個嚴重的缺點,就是這個位址可能會變換。假如哪天Router 1的IP變成了192.168.1.150,那麼Router 2的封包將會轉送到原來的192.168.1.111位址,而這不是我們想要的結果。第一種解決方法就是,當Router 1的位址改變時,就到Router 2更改轉送的設定,將所有的位址都改成新位址。這當然是個很爛的方法,因此更好的方法應該是使用固定IP。如圖15,到Router 1的網路設定,將連線類型從浮動IP改為固定IP。接下來輸入你想要的IP位址,這個位址可以參考Router 2的設定資訊(圖16),在範圍內的位址都可以使用,例如我選擇192.168.1.150。接下來在Router 2的設定轉送的封包到這個位置(192.168.1.150)就完成了(圖17)。

圖15

圖16

圖17






2016年4月10日 星期日

ERB Transforms

\begin{figure}
\begin{center}
\epsfig{file=Figures/hearing.ps, width=4in} \end{center} \vspace{-0.25in}
\end{figure}

人內耳中的basilar membrane(基底膜)有許多的聽覺神經,而這些神經對於不同頻率的聲波各有其敏感度。因此,根據研究,德國科學家巴克豪森(Barkhausen)透過實驗,將聲波區分為24個關鍵頻帶(Critical Bands),並稱之為巴克刻度(Bark scale)。人耳對於相鄰頻帶會有相同距離的感覺。我們知道,人耳對於聲波能量強度的感受大致是對數變化的,但實際上,這個感受可能比單純的對數還要更複雜,因此才會有科學家進一步去研究這種更精緻的對應關係。這種對應是根據主觀實驗得來的,因此不同人的感受會有些微差距。關鍵頻帶之所以稱為'頻帶',就是因為它並不是一個數值,而是一個範圍,同一個範圍內的頻率大致上感受都會差不多。

Bark scale critical bands
NumberCenter Frequency (Hz)Cut-off Frequency (Hz)Bandwidth (Hz)
20
16010080
2150200100
3250300100
4350400100
5450510110
6570630120
7700770140
8840920150
910001080160
1011701270190
1113701480210
1216001720240
1318502000280
1421502320320
1525002700380
1629003150450
1734003700550
1840004400700
1948005300900
20580064001100
21700077001300
22850095001800
2310500120002500
2413500155003500
參考: https://en.wikipedia.org/wiki/Bark_scale
其中,center frequency表示每個頻帶的中間值,也就是說,若想只用一個頻率值代表一個頻帶的話,就是用center frequency。cut-off frequency就是頻帶的最大和最小值。bandwidth是頻寬,表示一個頻帶的寬度(最大值-最小值)。

Bark scale只定義了24種頻率的對應方式,但是到底要如何對每個頻率f都找到一個對應的Bark scale值呢?研究人員開始試著找出一些數學式來近似這種對應,而ERB(Equivalent Rectangular Bandwidth)就是其中的一種對應方式。


\mathrm{ERB}(f) = 6.23 \cdot f^2 + 93.39 \cdot f + 28.52

ERB scale指的是有幾個ERB在給定的頻率f以下


\mathrm{ERBS}(f) = 21.4 \cdot log_{10}(1 + 0.00437 \cdot f)

2016年3月27日 星期日

使用python解minimization問題

使用scipy的函數scipy.optimize.fmin_l_bfgs_b

官方說明
http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fmin_l_bfgs_b.html

簡易使用法
http://stackoverflow.com/questions/8672005/correct-usage-of-fmin-l-bfgs-b-for-fitting-model-parameters

python multiprocessing卡住解決辦法

使用python開多個process平行運算時,可能要將最終結果放入某個list、dictionary或queue之類的回傳至主程式,這時候有機會出現子程序無法結束(terminate)的問題,不知道這是否和官方文件所說的問題一樣
https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues
總之,若出現這種問題,不妨將所使用的list、dictionary或是queue改成manager版本的,用法上差不多,儘量使用class的界面來操作的話問題會比較少(例如不能使用ls=ls+[...],應該使用正常的ls.append(...)),因為manager是專門用來處理multiprocessing的module,大致上可以解決這些問題。

關於thread的簡易用法
http://puremonkey2010.blogspot.tw/2012/05/python-python.html

2016年3月16日 星期三

工作站安裝Caffe

這次安裝是在實驗室的工作站上,除了環境設定和自己電腦稍有不同外,權限也較低,所以不能隨便想裝什麼就裝什麼。

首先是為什麼現在會突然想到工作站上安裝,原因是因為我自己寫了一個layer,因此要重新編譯caffe,所以才想說順便裝一下以前在工作站上沒裝成功的pycaffe。

筆記一下要如何自己寫一個layer:基本上只要在自己的layer.cpp最後加上
INSTANTIATE_CLASS(xxxLayer);
REGISTER_LAYER_CLASS(xxx);
即可,當然還要有自己的header檔,看是要自己新增一個,還是加到原本就有的裡面。

接下來是如何在工作站上安裝pycaffe。由於工作站無法自己安裝新的python module,但幸好python可以整個安裝成自己的,所以我下載了anaconda2 python,安裝完即可使用。當然還是要記得將build/CMakeCache.txt中python的路徑設定為新裝的anaconda的位置,不然他還是會找到系統原始的python。完成後,原本以為照著之前的做法,
cd build/
cmake ..
make all
就好了,結果卻發現工作站的OpenCV library有問題,不知道是版本問題還是什麼,總之這個library我一定也沒有權限可以修改,想要編譯自己的版本來安裝又太麻煩了,因此我想說能不能跳過OpenCV,因為需要使用OpenCV的檔案其實只是附加功能,而且我根本就沒有使用到這個功能。但這個cmake的設定似乎就是要嘛你根本沒裝OpenCV,他也不幫你裝相關功能,要嘛就他自己找到OpenCV就一定會安裝,就是沒有可以自己關掉的選項,最後只好放棄使用cmake,使用原始的makefile版本。基本上也不會太難,將Makefile.config.example改成Makefile.config,並且使用裡面的ANACONDA_HOME以及相關的python路徑即可,#註解記得該取消的要取消乾淨。接下來手動使用
make lib
make tools
make py
即可,example不需要編譯。
若出現缺少python module的問題,執行
cd python
for req in $(cat requirements.txt); do pip install $req; done
將相關python module安裝好即可。這裡我發現其實leveldb是沒有安裝成功的,因此若要使用pycaffe,應該使用lmdb或是hdf5。

更新:
後來發現雖然pytest是成功的,但是shell的caffe卻不能用,而且不知道為什麼,cmake所找到的python library一直是系統的,推測可能因此有些相關的library發生衝突。總之目前還是回到原始沒有pycaffe的狀態,之後有空再研究。

有關cmake的find_package()到底會找哪些資料夾,這篇網站有介紹
https://cmake.org/Wiki/CMake:How_To_Find_Libraries#How_package_finding_works