over 2 years ago

因為想要邀請我大學同學開設程式交易的讀書會,所以我這陣子自己也在做功課,其中一項作業就是研究網友開發的股價擷取API。 Python 對我來說並不陌生,我工作上還滿常讀 Python 的 code 的,之前也有「玩」過 CodeAcademy 的 Python 課程;但是要我在自己電腦上開發 Python ,坦白說,我還真的沒有嘗試過。

今天的第一天日記,記錄兩個我部署上述的 grs 遇到的問題,第一是怎麼安裝「常用」的 module,第二是怎麼安裝網友寫好的 module。以下環境部分都是針對 mac ,非 mac 的朋友抱歉了。

安裝「常用」的 module

easy_install 是 Python 的套件管理系統,而 mac 不但有內建 pythoneasy_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

這樣就完成啦!簡單吧!

 
over 2 years ago

剛才學弟問我,他不小心砍了機器上面的.ssh資料夾,怎麼辦?
這是新手滿常犯的錯誤,也就是第一次用(S)FTP連上機器太興奮,就把隱藏資料夾也一起都砍了。大部分的東西其實砍了也無所謂,機器會再自動長出來;但也有的東西,例如 .bashrc,砍了也是很麻煩的。 .ssh 我覺得應該也是會自己長回來,不過它的性質跟其他的內建資料夾有點不一樣:它不能動用 root 複製其他使用者的資料夾備份過來就好,因為 .ssh 下面的東西是獨一而二的。說了這麼多,其實重建 .ssh只要三個步驟。

mkdir ~/.ssh

首先當然就是建立資料夾囉

chmod 700 ~/.ssh

給 owner全部的權力,包含執行!

ssh-keygen

接著就是重新產生 key pair。系統會問你一些問題,都按 enter 略過即可。

以上,這樣就完成了。

 
almost 3 years ago

簡介

訓練目標

以1D為切入點,了解 EEMD 之基本原理,並以 Matlab 語言實作之。

Matlab

完成這份訓練講義之後,預期學習者將會應用到或者學到如何

  • 創造並使用 function
  • 找出資料向量中的極值
  • 使用 interp1 內插出平滑的資料曲線
  • 打造 EMD 引擎
  • 將 white noise 加入資料之中
  • 完成 EEMD 函數

習題

尋找極值函數 findExtrema

在這題當中,我們要學會寫出一個傳入資料向量 data,可以回傳資料中極值的 以及 位置 的函數。以下將分為四個小題進行。

學會如何自定函數

試找尋資料,學習如何創造一個自定函數,或查詢 Matlab 內建教學

doc function

或參考以下範例:

numAdd.m
function y = numAdd(a, b)
y = a + b;

尋找最大值

試寫一個函數 findMax.m,輸入任意長度向量 data 可傳回兩組輸出:

  • 最大值所在的位置 max_ind
  • 最大值的值 max_val

提示: 函數的第一行可能長成這個樣子:

findMax.m
function [max_ind, max_val] = findMax(data)
% coding here

請注意,一串資料可以有多個 local maxima。此題要求的是找出所有的 local maxima,而非僅是資料中的最大值,否則用內建函數 max() 即可達成。

尋找最小值

承上題,找出「所有」最小值 min_val 及其分別之所在位置 min_ind

提示: 試想,是不是將上一題的傳入資料由 data 改為 -data 就可以達成目標了?

尋找所有極值

綜合前面三題所學,請完成一個可以找出所有極值,並分別回傳最大最小值的值與位置的函數 findExtrema.m

findExtrema.m
function [max_ind, max_val, min_ind, min_val] = findExtrema(data)
% coding here

注意: data(1)data(end) 是否也須考慮為「極值」?如果是,其原因為何?

內插曲線

下面這兩題,我們將會利用前一大題所得到的資料,以及 Matlab 內建的 interp1函數,得到 EMD 所需要的「趨勢」曲線。

使用離散資料內插曲線

利用 interp1,將 max_indmax_val內插成一條長度和取樣率皆與 data 相同之「連續」曲線 max_trend
利用 interp1,將 min_indmin_val內插成一條長度和取樣率皆與 data 相同之「連續」曲線 min_trend

注意: max_trendmin_trend的頭尾,都要和 end 一樣(可以想成是 boundary conditions),否則會有些區域沒有定義。

求得「平均」曲線

將上小題的兩條曲線做點對點平均,得到 avg_trend

打造 EMD 引擎

參考 paper 上的演算法,以及上面所練習的技巧與成品,應該已經可以完成 EMD 的引擎。其界面如下:

emd.m
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。其界面如下:

eemd.m
function modes = eemd(data, nmode, nens, wn_std)
% coding here
 
about 3 years ago

常見問題

連 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
遊戲模式 僅單人 多人
 
over 3 years ago

之前就有想過要用解析解求一個均勻的圓球的質量投影,但是推半天沒推出來,只好先用MATLAB做出一個3D的volume,再用 sum(V,3)來求投影質量。我知道這樣超白癡的,而且要是球稍微大一點,電腦就記憶體不足當掉給你看了。

剛才突然... 就夢到正確的解析解做法了......

原理

已知圓球球面的公式是\

其中 為一常數,是球面的半徑。

現在我們將其推廣,把球面推廣成球體,則參數 要滿足

其中

所以要快速求出一個球體的質量投影,只要移項還有乘以2就好了,得到:

不過記得要把超出 support 的地方手動設為零,不然可是會出現 complex 的。請直接參考下面的實作程式碼。

MATLAB 實作

sphere_proj.m
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;
 
over 3 years ago

我們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系統打掉重來簡單吧?

 
over 3 years ago

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/lib64cryoem/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設定而已,虛驚一場!

 
over 3 years ago
  1. 選一個有執行力、可靠的伴郎很重要,簡單來說就是一個會辦活動的人XD
  2. 事前先決定好一個 #hashtag 並且讓大家都知道
  3. 但是無論如何還是要找一個幫大家拍照的攝影師XD
 
over 3 years ago

整理一下四月在工作上遇到的一些開發瓶頸,以及其解法。大部分都是跟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檢查一下是否已經釋放成功。

 
over 3 years ago

剛才在FB上看到這篇文章,我簡單摘錄一下它的開頭,各位朋友如果有興趣可以把它點開來詳閱:

對不起我不學經濟 不學法律 不學政治 不學社會社工 不是商管人才
我只能用做IC來比喻:

小馬以總分"689"這麼優異的成績推甄上ICS組
並且選擇了類比IC的實驗室

IC設計是這樣的
你在電腦上設計的電路,也就是你設計的晶片
必須要透過"下線"的流程,把設計圖送交晶圓廠代工
經過幾個月之後,晶圓廠會把製造好的晶片還給你
你拿到你設計的東西之後,再用實驗室的儀器進行量測
晶片製造是很貴滴,所以大家能夠使用的資源有限
.....全文
--from Development Tu 臉書

很多人看了這篇應該都大笑,但是老實說我看了笑不出來,因為我有類似的經驗。

碩二下的時候,雖然那時候已經發了paper,但是實驗驗證一直沒有著落,每個禮拜的 meeting都灰頭土臉,因為實驗又 fail了。老師要我找出原因,到底是模擬失真,還是製程沒做好,或者是光路沒架好?偏振態沒有調好?奈米手不靈敏?

大家看了這篇文章之後,應該也都知道失敗並不可恥,重點是要找出原因,讓後進者得以繼續延續研究的薪火。老實說到現在我還是不知道當時失敗的原因。這麼說來真的很可恥XD,我一直到剛才看完這篇文章才開始反省orz

一直沒找出原因,我就這樣每個禮拜重複一樣的過程,周一跑模擬,周二去中研院做device,晚上回新竹就開始進實驗室量,一直量到禮拜天,fail,然後又像鬼打牆般重複一樣的事情。

我看完這篇文章我覺得很慚愧。雖然我不是ICS組的,但是我確確實實跟文章中的小馬一樣,每次失敗之後,不思失敗的原因,卻一直把餅畫得更大,要我的指導教授相信我,這次不但不會失敗,而且消光比會更好,甚至不用奈米眼,用far-field都看得到!逆境使人堅強,作為一個研究生就像一個不倒翁一樣,越挫越勇。

後來,我畢業了,否則我可能到現在都還在對我的指導教授開空頭支票,然後後面的學弟妹為了阻止我霸佔實驗室資源,可能就只好到台北來靜坐在中研院物理所大廳......

然後多年之後我看到這篇文章,覺得背脊發涼。