網頁

2021年1月30日 星期六

Automator:依檔案清單大量找檔案並拷貝

將程式流程製作成Automator,就不用在終端機下指令,對一班使用這來說會比較簡單。





1.於程式庫中選 工具程式 -> 執行AppleScript

on run {input, parameters}
    set theDialogText to "選擇 list 檔案"
    display dialog theDialogText
    --> Result: {button returned:"OK"}
    return input
end run

2.於程式庫中選 檔案和檔案夾 -> 要求Finder項目
類型選擇"檔案"






3.於程式庫中選 工具程式 -> 執行AppleScript

 on run {input, parameters}
    set theDialogText to "選擇 pic 目錄"
    display dialog theDialogText
    --> Result: {button returned:"OK"}
    return input
end run

4.於程式庫中選 檔案和檔案夾 -> 要求Finder項目
類型選擇"檔案夾"


5.於程式庫中選 工具程式 ->執行Shell工序指令
傳遞輸入選擇"作為引數使用",就是剛剛選擇檔案和目錄傳遞到此當輸入


執行畫面:



接著會執行script,然後將找到的檔案copy到桌面。

2021年1月29日 星期五

Python:依檔案清單大量找檔案並拷貝

有一個檔案清單紀錄要找尋在 dir 目錄下的檔案,並將找到的檔案拷貝到桌面 tmp目錄下,
找尋的目錄dir,目錄下有多層目錄共38006個檔案(沒有順序)。

方法1】:
讀取檔案清單,依清單第一筆資料遞迴搜尋目錄檔名是否符合,然後清單第二筆再遞迴搜尋目錄檔名是否符合 . . . 直到清單最後一筆。
程式碼:https://ideone.com/NSdqT4

圖示範例:


所花費時間 (約3.05s):
 

方法2 】
讀取檔案清單存放在Dictionary,遞迴目錄的每一檔案名稱是否是 dict 的 key 值。
程式碼:https://ideone.com/eN5xXP

圖示範例:

 
所花費時間 (約0.75s):






由此看來遍歷目錄的檔案然後判斷是否在Dict 中的 key值(Hash Map)是比每一筆資料都要去遍歷目錄樹一次效率要好得多,當清單的數量多的時候差異會更大。

程式碼 :
import os, re, shutil, sys, time
if len(sys.argv) == 1 or len(sys.argv) == 2:
    lst_file = 'list2.txt' #欲搜尋檔案清單
    search_dir = "./dir"   #搜尋目錄
else:
    lst_file = sys.argv[1]
    search_dir = sys.argv[2]
start = time.time()
tag_dir = os.path.expandvars('$HOME') + "/Desktop/tmp/" #目標目錄
dict = {} #建立Hach map
with open(lst_file) as f:
    for line in f.readlines():
        line = line[:-1]
        dict[line] = 0
num_files = 0 #計算檔案數量變數
if not os.path.isdir(tag_dir): #測試目標目錄存在否
    os.mkdir(tag_dir)
#遞迴目錄樹
for dirPath, dirNames, fileNames in os.walk(search_dir):
    for f in fileNames:
        num_files += 1
        basename = os.path.splitext(f)[0]
        if basename in dict: #如果檔名與hash key相同
            print "finded >>", os.path.join(dirPath, f)
            old = os.path.join(dirPath, f)
            new = tag_dir + f
            shutil.copy(old, new) #複製檔案到目標目錄
print "Total search files:", num_files
end = time.time()
print "Elapsed time:", end - start


2021年1月25日 星期一

OSX 終端機發送 e-mail 方式

OSX 本身已經安裝了Postfix Mail Server,只要稍加設定就可以使用,下面就介紹設定的步驟:

1. 備份原有的 Postfix configuration
$ sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

2. 設定 Postfix mail server
$ sudo sh -c "cat >> /etc/postfix/main.cf" <<EOF
relayhost = smtp.gmail.com:587
smtp_sasl_mechanism_filter = plain
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom
EOF


3. 設定 gmail SASL 認證
$ EMAIL="youremail@gmail.com"
$ PASSWORD="password123"

$ sudo sh -c "cat >> /etc/postfix/sasl_passwd" <<EOF
smtp.gmail.com:587 $EMAIL:$PASSWORD
EOF


4. 產生 hash database
sudo postmap /etc/postfix/sasl_passwd

5. 更改 Postfix hash database and password files 權限
sudo chown root: /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db


6. Restart the Postfix mail server
sudo launchctl stop org.postfix.master
sudo launchctl start org.postfix.master


7. 更改 gmail "低安全性應用程式存取權"


測試一下:
echo "Hello World" | mail -s "Test email" name@mail

此時 gmail 信箱應該就有一封上面發出的信了。

如果要夾帶附件

語法:uuencode [實際檔案] [信件中的檔名] | mail -s '標題' email

uuencode filename infilename | mail -s "Hello" name@mail


2021年1月24日 星期日

依檔案清單大量找檔案並拷貝

有一個檔案清單紀錄要找尋在 dir 目錄下的檔案,並將找到的檔案拷貝到桌面 tmp目錄下,
找尋的目錄dir,目錄下有多層目錄共38006個檔案(沒有順序)。

方法1:使用 shell script 管線導向來實現
程式碼:https://ideone.com/e.js/E0W01z
所需時間:1.085s

方法2:遞迴目錄下的每一檔案並製成HASH索引,讀取檔案清單,依清單比對HASH
程式碼:https://ideone.com/HDhrp6
所需時間:1.298s


方法3:讀取檔案清單1,然後遞迴目錄下的檔案比對,檔案清單2,遞迴目錄下的檔案比對...
程式碼:https://ideone.com/1a2BWb
所需時間:6.588s


方法4:讀取檔案清單製成HASH索引,然後遞迴目錄下的每一檔案比對HASH。
程式碼:https://ideone.com/hbZekq
所需時間:1.261s

   

由上可知效率上來說:方法1 > 方法4 > 方法2 > 方法3

利用 bash command 和管線(pipe line) 可以快速達到這個結果,如果只是想查看搜尋結果可以這樣:
find 目錄 | grep -F -f 欲搜尋的檔案list


2021年1月7日 星期四

R:ETF風險評估

       根據道富環球投資管理公司(State Street Global Advisors)的最新數據,2020年流入美國ETF的資金突破5,000億美元大關,較2017年創下的新高紀錄高出400億美元。
      既然ETF受到廣大投資人喜愛,連股神巴菲特都喜歡投資ETF,

那眾多ETF種類包含不同產業別,報酬不同風險也不同,如果能在投資前了解一下報酬風險可以作為投資前的參考。
     這篇就針對標普500(代號:SPY),費城半導體(代號:SOXX),羅素2000(代號:IWM),運輸類(代號:IYT),太陽能(代號:TAN)來做一下範例。

程式碼如下:
library(quantmod)
library(PerformanceAnalytics)
d_from <- "2020-03-01"
symb <- c("SPY","SOXX","IWM","IYT","TAN")
getSymbols(symb, src="yahoo", from=d_from)
SPY2 <- dailyReturn(Ad(SPY))
SOX2 <- dailyReturn(Ad(SOXX))
IWM2 <- dailyReturn(Ad(IWM))
IYT2 <- dailyReturn(Ad(IYT))
TAN2 <- dailyReturn(Ad(TAN))

m1 <- merge(SPY2, SOX2, IWM2, IYT2, TAN2, all = F)
colnames(m1) <- c("標普500","費城半導體","羅素2000","運輸類","太陽能")
col <- c("red", "blue", "coral", "darkgreen", "brown")
chart.RiskReturnScatter(m1, Rf=0.03/12,
                        colorset = col,
                        main = "Trailing 9-Month Performance")

其中 Rf=.03/12 是 無風險利率/期待的報酬率,是以美國降息前的標準來評估,評估期間從2020/03/01 ~ 2021/01/ 06

輸出如下:


風險回報圖表在相同的 Y階層落點在 X越右邊風險越高

再來計算一下以 216交易日的回報率:

table.AnnualizedReturns(m1, scale = 216, Rf = 0.01/216)

我們可以看到風險最高的太陽能產業,報酬率也最高,在這段期間有211%的報酬率。
標普500 約23%報酬率,費城半導體表現也不錯有75%。

太陽能產業會有這樣的表現我想跟美國總統當選人拜登(Joe Biden)把應對氣候變化視為施政重點,上任後將積極推行各項ESG政策,進一步帶動ESG 類ETF的投資需求。


2021年1月3日 星期日

R:股價相關性分析

我們常常會覺得到底某幾間公司的股價漲跌之間有沒有關聯,如果有個工具可以來做關聯性的分析或是資料呈現會方便許多,正所謂雞蛋不要放在同一籃子裡。

利用PerformanceAnalytics套件裡面的chart.Correlation可以來做不同公司股價的關聯性分析。
下面我舉AAPL(蘋果公司),MSFT(微軟),AMZN(亞馬遜),GOOG(Google),FB(Facebook),TSM(美台積電)這6家公司來當例子,時間的範圍是從2018/1/1~2020/12/31,將每日的收盤價整合至dataframe,使用chart.Correlation來繪制圖表。

程式碼如下:
library(quantmod)
d_from <- "2018-01-01"
getSymbols(c("AAPL","MSFT","AMZN","GOOG","FB","TSM"), from=d_from)
Data <- cbind(Cl(AAPL),Cl(MSFT),Cl(AMZN),Cl(GOOG),Cl(FB),Cl(TSM))
chart.Correlation(Data,histogram = TRUE)

 

輸出的結果:

圖例說明:
對角線是變量本身的分布

對角線的左下方,給出了兩個屬性的散點圖,可以看到左下角(AAPL與TSM)具有很高的線性相關性。

對角線的右上方,數字表示連個屬性的相關性值,星號表示顯著程度(星星越多表明越顯著),可以看到AAPL與MSFT與AMZN與TSM都具有很大的程度的關聯。