因為想要邀請我大學同學開設程式交易的讀書會,所以我這陣子自己也在做功課,其中一項作業就是研究網友開發的股價擷取API。 Python 對我來說並不陌生,我工作上還滿常讀 Python 的 code 的,之前也有「玩」過 CodeAcademy 的 Python 課程;但是要我在自己電腦上開發 Python ,坦白說,我還真的沒有嘗試過。
今天的第一天日記,記錄兩個我部署上述的 grs 遇到的問題,第一是怎麼安裝「常用」的 module,第二是怎麼安裝網友寫好的 module。以下環境部分都是針對 mac ,非 mac 的朋友抱歉了。
安裝「常用」的 module
easy_install
是 Python 的套件管理系統,而 mac 不但有內建 python
, easy_install
也內建了。如果擔心要使用的套件要求的 Python 版本超過系統內建的版本,可以打
python --version
先確定一下。
現在把焦點轉回到 grs 上面。依照它的 README 要求,使用者要有下面三個套件
- python-dateutil==1.5
- ujson
- urllib3
所以我們馬上就會遇到一個問題,就是下載好了之後怎麼安裝,或者有沒有給懶人用的快速安裝方式呢?
有的。就是用 easy_install
。所以要做的事情很簡單,就是依序執行
sudo easy_install ujson
sudo easy_install urllib3
sudo easy_install python-dateutil
別忘了我們要做的事情是「安裝」,所以要記得加上 sudo
;執行後系統會要求你輸入密碼,如果短時間內一直 sudo,則不用一直輸入。
安裝外部的模組 (設定模組路徑)
熟悉 Python 的朋友應該都知道 Python 程式的開頭跟 C++ 很像,起手式就是要 import
一些要用的套件。萬一要用的模組是強者你同學寫的,或者從 GitHub 上下載下來的,那要怎麼把這個模組的路徑加到 Python 的搜尋路徑裡面呢?如果只是暫時性的使用,可以透過 sys.path
指令來「暫時」加進去路徑裡面。如果你是用 python
的互動模式來寫程式,那就只在這次的 session 內有效喲。
一次性設定法
import sys # 引用 sys 模組
sys.path.append('/path/to/the/module/')
這樣就可以了。在互動模式下,你也可以印出目前的路徑清單,檢查一下有路徑有沒有設定成功。
print sys.path
永久安裝
當然一次性安裝不是長久之計,也如同我上面所講的,比較適合在互動模式下使用。那麼怎麼做永久的「安裝」呢?這時候就要看網友寫的模組裡面有沒有 setup.py
了。以這次的 grs 為例,從下載到安裝的完整步驟是:
git clone git@github.com:toomore/grs.git
先用 ssh 或者 https clone
下來。
cd grs
python setup.py
這樣就完成啦!簡單吧!
剛才學弟問我,他不小心砍了機器上面的.ssh
資料夾,怎麼辦?
這是新手滿常犯的錯誤,也就是第一次用(S)FTP連上機器太興奮,就把隱藏資料夾也一起都砍了。大部分的東西其實砍了也無所謂,機器會再自動長出來;但也有的東西,例如 .bashrc
,砍了也是很麻煩的。 .ssh
我覺得應該也是會自己長回來,不過它的性質跟其他的內建資料夾有點不一樣:它不能動用 root 複製其他使用者的資料夾備份過來就好,因為 .ssh
下面的東西是獨一而二的。說了這麼多,其實重建 .ssh
只要三個步驟。
mkdir ~/.ssh
首先當然就是建立資料夾囉
chmod 700 ~/.ssh
給 owner全部的權力,包含執行!
ssh-keygen
接著就是重新產生 key pair。系統會問你一些問題,都按 enter 略過即可。
以上,這樣就完成了。
簡介
訓練目標
以1D為切入點,了解 EEMD 之基本原理,並以 Matlab 語言實作之。
Matlab
完成這份訓練講義之後,預期學習者將會應用到或者學到如何
- 創造並使用
function
- 找出資料向量中的極值
- 使用
interp1
內插出平滑的資料曲線 - 打造 EMD 引擎
- 將 white noise 加入資料之中
- 完成 EEMD 函數
習題
尋找極值函數 findExtrema
在這題當中,我們要學會寫出一個傳入資料向量 data
,可以回傳資料中極值的 值 以及 位置 的函數。以下將分為四個小題進行。
學會如何自定函數
試找尋資料,學習如何創造一個自定函數,或查詢 Matlab 內建教學
doc function
或參考以下範例:
function y = numAdd(a, b)
y = a + b;
尋找最大值
試寫一個函數 findMax.m
,輸入任意長度向量 data
可傳回兩組輸出:
- 最大值所在的位置
max_ind
- 最大值的值
max_val
提示: 函數的第一行可能長成這個樣子:
function [max_ind, max_val] = findMax(data)
% coding here
請注意,一串資料可以有多個 local maxima。此題要求的是找出所有的 local maxima,而非僅是資料中的最大值,否則用內建函數 max()
即可達成。
尋找最小值
承上題,找出「所有」最小值 min_val
及其分別之所在位置 min_ind
。
提示: 試想,是不是將上一題的傳入資料由 data
改為 -data
就可以達成目標了?
尋找所有極值
綜合前面三題所學,請完成一個可以找出所有極值,並分別回傳最大最小值的值與位置的函數 findExtrema.m
function [max_ind, max_val, min_ind, min_val] = findExtrema(data)
% coding here
注意: data(1)
與 data(end)
是否也須考慮為「極值」?如果是,其原因為何?
內插曲線
下面這兩題,我們將會利用前一大題所得到的資料,以及 Matlab 內建的 interp1
函數,得到 EMD 所需要的「趨勢」曲線。
使用離散資料內插曲線
利用 interp1
,將 max_ind
和 max_val
內插成一條長度和取樣率皆與 data
相同之「連續」曲線 max_trend
。
利用 interp1
,將 min_ind
和 min_val
內插成一條長度和取樣率皆與 data
相同之「連續」曲線 min_trend
。
注意: max_trend
或min_trend
的頭尾,都要和 end
一樣(可以想成是 boundary conditions),否則會有些區域沒有定義。
求得「平均」曲線
將上小題的兩條曲線做點對點平均,得到 avg_trend
。
打造 EMD 引擎
參考 paper 上的演算法,以及上面所練習的技巧與成品,應該已經可以完成 EMD 的引擎。其界面如下:
function modes = emd(data, nmode)
% coding here
其中 nmode
是所要求的模態數量。請注意,如果原本的 data
長度是 的話,則得到的輸出資料 modes
的大小會是 。
打造 EEMD 引擎
如果前面的 emd.m
已經驗證完成,那麼接下來就是讓它進化成 EEMD 的時候了。比起 EMD , EEMD 多了下面兩項特色
- 外加了額外的 white noise 進去
- 先跑出 N 組各別使用不同的 white noise 所解出來的結果,再一起取平均。
下面我們只拆成兩小題練習,不足之處請直接參閱 paper。
加入 white noise
假定使用者指定一個特定的 white noise 強度 wn_std
,我們有兩種方式可以將等效強度的 white noise Wn
加到 data
裡面去,第一種是:
其中 指 data
, 是求標準差的函數;或者第二種方法
試問:兩種方法何種較優?較劣者,有什麼致命的缺點?
請利用 Matlab 內建的 randn()
完成此題。
完成 EEMD 架構
參考 paper 上的演算法,以及上面所練習的技巧與成品,終於我們可以完成 EEMD 的全面架構。完成品的輸入資料除了 data
以及nmode
之外,還多了指定 ensemble 數量的 nens
與 white noise 的標準化強度 wn_std
。其界面如下:
function modes = eemd(data, nmode, nens, wn_std)
% coding here
常見問題
連 LINK 的條件是什麼?
假設你站在 A 點,欲連 B 點,這需要滿足下列條件
- A 點落在感應範圍內
- 持有 B 點的 portal key
- A 與 B 點都處於八隻腳插滿的狀態
- A 與 B 點之間沒有任何 link 通過,無論藍或綠
A 與 B 都不在現有的 CF 內,無論藍或綠
最後一點有時候會誤判,因為手機上的畫面是有點斜斜的透視的,是否有跨過link其實有時候看起來並不準。真正最準確的判斷依據是官方的網頁版地圖,就連地球的曲線都可以正確地表現出來XD
建 CF 的條件是什麼?
假設有 A 、 B 、 C 三個塔,A與B、B與C已連線,且 A 塔站在你感應範圍內,則你必須持有 C 塔的 Portal Key,且A與C符合前一項的條件。
如果要蓋多重三角形,例如 完全屬於 ,則你必須要先完成 ,再完成 ; 反之如果先完成外面的三角形,裡面的三角形會因為違反 link 不能在 CF 內的規則而無法完成 。實際上完成 與 後,你會發現 的顏色較深。
連 LINK 和建 CF 的獎勵和距離、面積有關嗎?
完全無關。
建 link 成功: 313 AP
建 CF 成功: 1250 AP (實際上會顯示 1563 AP ,因為完成 CF 一定是伴隨著完成 link)
有一個說法說,在已經相連的四邊形裡面拉一條對角線,會「只有」 2813 AP,也就是不足 1563 AP 的兩倍,其實這個觀念是有點錯誤的。實際上完成一個四邊形內的對角線,你得到了兩倍 1250 AP 的量,外加一條 link 的 313 AP 獎勵,所以其實並沒有「打折」喔。
要怎麼申請 Portal ?
會問這個問題的通常是新加入的 iOS 玩家,不過很可惜地,目前 iOS 版尚未開放申請新 Portal。
如果是 Android 的玩家可以參考這篇:
衝Seer 成就?!教你第一次上傳portal 就上手
敵軍的塔可以 HACK 嗎?
當然可以摸(hack)!雖然會被電,不過通常不會損失太多 XM,我覺得是無所謂。此外 HAKC 敵軍的塔可以得到 100 AP;如果 hack 中立或者友軍的塔是沒有 AP 獎勵的。
為什麼「八塔」很稀有?
因為一定要八隻腳都是 L8 才能建造出 L8 的塔,而且每個玩家一人都只能放一隻八腳,所以「八塔」通常會出現在很多人經過的要道上,或者是當地玩家特地召集 L8 以上的玩家一起去蓋的。
為什麼大家都說遊戲從升到 L8 之後才開始?
因為遊戲裡面有分等級的道具都是 L1 到 L8 共分八級,而要升到 L8 以上才能使用 L8 的道具,也就是說要玩到 L8 才能放 L8 的腳、使用 L8 的武器,所以玩到 L8 之後,才算是開始進行完整的遊戲。
要怎麼 recharge ? recharge 有意義嗎?
recharge 可以在下列兩種情況下進行:
- 塔落在感應範圍內
- 持有該塔的 Portal Key
其中第二點相當重要,因為這意味著,你人不需要到現場,也可以持續維護塔的(腳的)能量,否則依照遊戲的設定, resonator 每過一天就會減損 15%的能量,那7天過後塔就會自動變回中立了。使用 Portal Key 通常有兩種實用的用途:第一是可以養偏遠地區的塔,這種地方的塔很少人經過,不太會有人去攻打,但是你自己也很少會去;使用遠端的 recharge ,可以一直讓塔保持能量,可以取得連續持有塔的天數的成就 。第二個理由同樣是用在維護偏遠地方的塔,但是目的是在維持重要的 link 和 CF。
為什麼有的塔的腳分佈情況不太一樣?
腳出現的位置,其與塔中心的距離,恰好會等於你放置腳的時候跟塔中心的距離。所以專業的玩家放腳的時候,都會走到讓塔剛好切到自己的感應範圍的邊界的地方。
無法累積AP?無法升級?
請務必到 DEVICE
去做SMS簡訊認證。此外用 iPhone 有JB 的人請尋找補丁,否則 Ingress 本身會擋 JB。
小技巧
攻擊要打腳
打敵人的塔的時候,要看的不是塔本身有沒有落在感應範圍,而是它的腳要離你越近越好。尤其是使用 Ultra Strike,因為有效攻擊半徑很小,所一定要接近塔腳。
回收低炮換 XM
當你玩超過 L4 以後,你會發現L1或者L2的炮根本就是廢物。可以先 RECHARGE 把 XM 耗光賺AP,然後把 L1 和 L2 的炮全部回收賺XM。
把腳放在刁鑽的位置
一個塔的八隻腳,都是在地圖上有對應真實位置的。把高級的腳落在離道路較遠的地方,甚至是投影在建築物內部的地方,會讓敵人非常難打到腳;就算打的到攻擊效率也很低。
沒事多充電,多充電沒事
如果你在公車、捷運(高架)、國道客運等高速移動的交通工具上,但是沿途又沒有塔可以hack的話,可以翻開你的 Portal Key 們,看到有能量沒滿的,就按 RECHARGE
把八隻腳都充滿。如果是對你有重要戰略意義的,或者 owner 是你自己的,可以優先充。在高速移動的時候 XM 補充的速度遠比你想像中還要快
冷技巧
長按 HACK 鍵
按住 Portal 頁面的 HACK
可以叫出一個叫做 glyph 的小遊戲,依照 Portal 的等級不同,出現3到5個圖案,然後你要重現這五個圖案。基本上不用追求三個都背起來,其實很努力記起來一個就好,因為只要答對一個,就可以得到 bonus。
請注意,啟動 Glyph 的條件等同於 hack ,也就是如果還在 CD 的話是不能玩 Glyph 的。
如果不小心 HACK
按太久啟動 glyph 的話,可以按右下角的 BYPASS
,會自動跳回普通的 hack 模式。
長按 FIRE 鍵
大家應該都知道在地圖上長按然後往上滑可以啟動 FIRE
選項,不過你可能不知道,長按 FIRE
鍵可以產生額外的攻擊百分比。按住之後會出現同心圓,在圓最小的時候手放掉之後,會開始攻擊。最大可以得到額外 20% 的攻擊量。
善用膠囊
膠囊( capsule)屬於 RARE
等級,不過實際上不難打到,我開始玩兩週就打到了三個。把key放到 capsule 裡面,就可以再打新key了。不過請注意到,即使把東西放在 capsule 裡面,總數還是不能超過2000。
Ingress vs. 世界迷霧
Game | 世界迷霧 | Ingress |
---|---|---|
平台 | 目前僅限 iOS | Android 與 iOS |
定位方式 | 僅限 GPS | GPS 與 wifi 定位 |
網路 | 離線亦可記錄軌跡 | 需保持網路連線 |
陣營 | 無 | Resistance 與 Enlightment |
遊戲模式 | 僅單人 | 多人 |
之前就有想過要用解析解求一個均勻的圓球的質量投影,但是推半天沒推出來,只好先用MATLAB做出一個3D的volume,再用 sum(V,3)
來求投影質量。我知道這樣超白癡的,而且要是球稍微大一點,電腦就記憶體不足當掉給你看了。
剛才突然... 就夢到正確的解析解做法了......
原理
已知圓球球面的公式是\
其中 為一常數,是球面的半徑。
現在我們將其推廣,把球面推廣成球體,則參數 要滿足
其中
所以要快速求出一個球體的質量投影,只要移項還有乘以2就好了,得到:
不過記得要把超出 support 的地方手動設為零,不然可是會出現 complex 的。請直接參考下面的實作程式碼。
MATLAB 實作
function Z = sphere_proj(DIA)
RAD = DIA/2; % radius
x = linspace(-RAD, RAD, DIA);
[X, Y] = meshgrid(x, x);
R = sqrt( X.^2 + Y.^2);
Z = 2 * sqrt( RAD^2 - R.^2 );
Z( R > RAD) = 0;
我們group的博後說 Wen Jiang 的 jspr 每次用一陣子都會出error,他只好把linux系統砍掉重裝 @@,我叫他拜託不要再這麼做了!
遇到這個問題,可能會在 terminal 上面看到的錯誤訊息如下:
Traceback (most recent call last):
File "/home/alanfan101/cryoem/x86_64/EMAN2/lib/EMAN2db.py", line 1289, in put
self.bdb.put(key,val,txn=txn)
DBPageNotFoundError: (-30985, 'DB_PAGE_NOTFOUND: Requested page not found')
********** Warning: problem writing ▒U
micrographsq. to importMicrograph.py .
Retrying (0/10)
********** Warning: problem writing ▒U
micrographsq. to importMicrograph.py .
或者
Traceback (most recent call last):
File "/home/alanfan101/cryoem/x86_64/EMAN2/lib/EMAN2db.py", line 1289, in put
self.bdb.put(key,val,txn=txn)
DBPageNotFoundError: (-30985, 'DB_PAGE_NOTFOUND: Requested page not found')
********** Warning: problem writing ▒U
micrographsq. to importMicrograph.py . Retrying
(9/10)
NOT Writing notes, ppid=-1
解法很簡單
rm -rf ~/EMAN2DB
就這樣。雖然如此可能會把記憶在EMAN2裡面的參數消掉,但是這總比把整個Linux系統打掉重來簡單吧?
jspr 是美國普渡大學的 Wen Jiang 教授團隊所開發的單顆粒重組( single particle reonstruction)軟體包,一直以來我同事都是在Windows 上面開 Virtual box ,跑該團隊所提供的 ova 檔案裡面的 linux系統。但是跑顆粒重組本身是很耗能的事情,在虛擬機器上跑效能一定不會太好,所以我今天幫我同事在原生的 linux 系統上弄了一樣的環境給他用。原本以為一切順利,但是最後他要跑最重要的 reconstruction 的步驟的時候,在 terminal 出現了這樣的錯誤:
File "/home/alanfan101/cryoem/x86_64/jiang/jspr.py", line 1417, in createBTSession
import libtorrent
ImportError: libboost_system.so.1.53.0: cannot open shared object file: No such file or
directory
查了一下,發現這個libtorrent
在軟體解壓縮後的目錄中的cryoem/x86_64/lib64
和cryoem/x86_64/lib
都有,如果使用ldd
去查詢,會發現:
[user@linux lib]# ldd libtorrent-rasterbar.so
linux-vdso.so.1 => (0x00007fffd51ff000)
libboost_system.so.1.54.0 => not found
librt.so.1 => /lib64/librt.so.1 (0x00007f25a579d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f25a5580000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f25a527a000)
libm.so.6 => /lib64/libm.so.6 (0x00007f25a4ff5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f25a4c61000)
/lib64/ld-linux-x86-64.so.2 (0x0000003044c00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f25a4a4b000)
嗯,沒錯就是少了這個libboost_system.so.1.54.0
。但是 Wen Jiang 的團隊號稱這個 jspr 軟體包,是自給自足,什麼都有啊。於是我去找了他們提供的 ova 映像檔,去查裡面那個可以動的版本,到底是去哪裡找libboost_system.so.1.54.0
的。一查,發現居然就在cryoem/x86_6x/lib
下面,原來,應該只是忘記在自己的 .bashrc
下面 source 他們提供的bashrc設定而已,虛驚一場!
- 選一個有執行力、可靠的伴郎很重要,簡單來說就是一個會辦活動的人XD
- 事前先決定好一個
#hashtag
並且讓大家都知道 - 但是無論如何還是要找一個幫大家拍照的攝影師XD
整理一下四月在工作上遇到的一些開發瓶頸,以及其解法。大部分都是跟linux或者c++有關。
GSL篇
GSL,也就是 GNU Scientific Librarary 是一個號稱可以取代 Numerical Recipe 的科學計算函示庫。
安裝篇
如果是在國網上,不可能取得 sudo 安裝在 /usr/local/lib/
,所以要另外找地方放,例如自己開一個 ~/local/
。安裝步驟如下
./configure --prefix ~/local/
make
make install
安裝後
附加新的 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/local/lib/
compile的時候要加上的flag
-lgsl -lgslcblas -lm
MPI 篇
重新載入 .bashrc
以前都以為改完 .bashrc
之後要重登才會生效(其實確實也是如此),不過其實有偷吃步,可以直接執行
. ~/.bashrc
就可以重新載入了
LINUX 主機管理篇
我們實驗室自己的機器,不知道為什麼從半年前開始就無法 sudo ,系統說 /etc/sudoers
這個檔案壞掉了。麻煩就麻煩在,因為 sudo 壞掉了,所以要修一定要用 root;但是為了安全因素,我們的機器根本沒有啟用 root ,最後發現可以在開機的時候按住 shift 進入 GRUB menu,然後有 root 模式可以用。講起來好像很容易,不過我們的主機實體是託管在中研院地下三樓的機房裡面,所以還是特地去了三次,才把問題解決。
進到了 root 模式之後,按照系統的錯誤訊息,照理來說執行 chmod 0440 sudoers
就好,結果系統又說 file system read-only,靠夭,這是什麼巫術?
mount -o remount,rw /
不要問我這是怎麼辦到的,總之就是 magic!
remount好之後,再跑 chmod 0440 /etc/sudoers
即可
另外筆記一下,我發現被限制用 ssh 登入的帳號,也就是只能先用一般帳號登入再su過去的帳號,不能用 screen。
釋放swap
先查詢swap所在地點
swapon -s
假設查出來是 /dev/sda5/
,接下來先執行
sync
然後執行
swapoff /dev/sda5/; swapoff /dev/sda5/
大功告成!可以跑top
檢查一下是否已經釋放成功。
剛才在FB上看到這篇文章,我簡單摘錄一下它的開頭,各位朋友如果有興趣可以把它點開來詳閱:
對不起我不學經濟 不學法律 不學政治 不學社會社工 不是商管人才
我只能用做IC來比喻:小馬以總分"689"這麼優異的成績推甄上ICS組
並且選擇了類比IC的實驗室IC設計是這樣的
你在電腦上設計的電路,也就是你設計的晶片
必須要透過"下線"的流程,把設計圖送交晶圓廠代工
經過幾個月之後,晶圓廠會把製造好的晶片還給你
你拿到你設計的東西之後,再用實驗室的儀器進行量測
晶片製造是很貴滴,所以大家能夠使用的資源有限
.....全文
--from Development Tu 臉書
很多人看了這篇應該都大笑,但是老實說我看了笑不出來,因為我有類似的經驗。
碩二下的時候,雖然那時候已經發了paper,但是實驗驗證一直沒有著落,每個禮拜的 meeting都灰頭土臉,因為實驗又 fail了。老師要我找出原因,到底是模擬失真,還是製程沒做好,或者是光路沒架好?偏振態沒有調好?奈米手不靈敏?
大家看了這篇文章之後,應該也都知道失敗並不可恥,重點是要找出原因,讓後進者得以繼續延續研究的薪火。老實說到現在我還是不知道當時失敗的原因。這麼說來真的很可恥XD,我一直到剛才看完這篇文章才開始反省orz
一直沒找出原因,我就這樣每個禮拜重複一樣的過程,周一跑模擬,周二去中研院做device,晚上回新竹就開始進實驗室量,一直量到禮拜天,fail,然後又像鬼打牆般重複一樣的事情。
我看完這篇文章我覺得很慚愧。雖然我不是ICS組的,但是我確確實實跟文章中的小馬一樣,每次失敗之後,不思失敗的原因,卻一直把餅畫得更大,要我的指導教授相信我,這次不但不會失敗,而且消光比會更好,甚至不用奈米眼,用far-field都看得到!逆境使人堅強,作為一個研究生就像一個不倒翁一樣,越挫越勇。
後來,我畢業了,否則我可能到現在都還在對我的指導教授開空頭支票,然後後面的學弟妹為了阻止我霸佔實驗室資源,可能就只好到台北來靜坐在中研院物理所大廳......
然後多年之後我看到這篇文章,覺得背脊發涼。