發表文章

目前顯示的是 3月, 2018的文章

以樂透為例,用Python統計馬可夫矩陣

圖片
答案是矩陣裡的每個元素都是 1/49 (下一期開出某個號碼的機率),完畢。 寫這篇的目的並不是真的想要得到"明牌",只是找個題目練習一下 Python 與馬可夫模型;另一方面,樂透是大家都感興趣的題目,希望這樣應該比較容易理解,並不是真的可以算出明牌,如果有執迷不悟的,本文最後會說明為什麼。 馬可夫鏈 是機率問題中很常使用的模型,近年來因為大數據盛行,每個領域需要網路爬蟲收集大量資料 (分析關鍵字), 自然語言處理 (NLP) 於是成為很熱門的領域,而 Markov model 是 使用統計方法處理自然語言時常用的方法,google 也是 使用 Markov model 來為每個網頁做 ranking。基本原理是,把每個網站當作節點,然後把連入與連出的連結當作是每個節點的連線,那抵達某個特定節點的機率就代表該頁面 (page) 的知名度;越容易抵達某個網頁代表被很多網頁參考,也就是該網頁知名度越高。 簡單來說,馬可夫模型主要就是從這個狀態到下一個狀態給定機率 P,而目前狀態到所有下一個狀態的機率總和一定為1。馬可夫矩陣可以用下圖表示: 上圖用大樂透來說明的話,本文要來練習的題目,目標是 統計出 106 年度每個號碼跟下期號碼之間的機率 ,i, j 都是 49,例如: P 25,49 代表本期開 25 號而下一期開 49 號的機率,而 P 25,1 P 25,2 ... P 25,49 加總起來會是 1。 再說一次,機率理論值其實都是 1/49,這邊只是練習馬可夫模型與 Python ,因為樣本數太小,人很容易會覺得每期的號碼之間有關連,但是純粹只是機率問題。當統計的期數越多,其實會發現機率會越接近 1/49,本文只是幫助理解/說明與練習。 首先從網路上找到 106 年開獎的資料,內容如下,把內容存成 csv 檔案。Index 代表每一期開獎的號碼,Drop是落球順序,Seq是排序後的開獎順序,Special是特別號。 Index,Month,Day,Weekday,Drop1,Drop2,Drop3,Drop4,Drop5,Drop6,Seq1,Seq2,Seq3,Seq4,Seq5,Seq6,Special 1,1,3,二,18,41,47,49,22,42,18,22,41,42,47,49,45...

將 Jenkins Job 的歷史結果整理出視覺化的 Daily Report mail (三)

圖片
為了寄出統整 Jenkins 上游 Job 的 daily report mail, 第一篇 說明了 Jenkins Daily Report Job 的設定, 第二篇 說明了如何用 Python script 統計 Job result 以及產生視覺化的圖表。本篇說明如何用 jelly script 產生 html 格式的 mail,email 裡面除了顯示第二篇文章中產生的視覺畫圖表之外,也會包含前一天每個小時的 Job 結果,如下圖: Email-exit Plugin 會預設 jelly script 的位置在 $JENKINS_HOME/email-templates 目錄底下,但是安裝完畢時並沒有這個目錄,也就是說要自己在 Jenkins 安裝目錄下新建一個 email-templates 的 folder,然後把 jelly scripts 放在這個 folder 之下,以我們的例子來說就是 load-monitor-dailyreport.jelly 詳細說明可以參考 Email-ext plugin 的網頁。 這裡可以找到一些 email-ext 提供的 jelly script 的範例 ,建議要快速上手,可以 copy 一個來改,ex: html.jelly 。這個 html.jelly script 預設會包含 change set, maven, junit 等相關的內容,但是因為我們的上游 Job 都是自訂的,因此需要自己修改 script 內容,後文只說明與 daily report 有關的部分。 Jelly Script 的架構如下,後續說明主要都是 BODY 裡面的內容。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?jelly escape-by-default='true'?> <!DOCTYPE html [ <!ENTITY nbsp "&#38;#38;nbsp&#59;"> ]> <j:jelly xmlns:j= "jelly:core" xmlns:st= "jelly:stapler" x...

Python datetime 相關的使用方法

這會是一篇持續更新的文章,會把 datetime 相關的學習記錄下來。 from datetime import datetime, date, timedelta date.today() datetime.today() datetime.now().strftime("%Y-%m-%d %H:%M:%S") datetime.now().date() datetime.today() - timedelta(days=1) datetime.combine(date.today(), datetime.strptime(str_some_time, '%H:%M').time()) if (abs(datetime.today() - some_time) <= timedelta(minutes=10)):     print ("less than 10 minutes")

將 Jenkins Job 的歷史結果整理出視覺化的 Daily Report mail (二)

圖片
前一篇文章 說明了 Daily Report 的 Jenkins Job 設定,接下來本篇會說明如何實作 daily_report.py 這個 script 會生成像這樣的 PNG 圖表: 首先要安裝 Pandas 及 matplotlib ,我們會使用 Pandas 來讀取 csv 檔案並使用相關便捷的功能來簡化/加速資料分析的步驟,並使用 matplotlib 來產生視覺化的 PNG 圖檔。 python -m pip install Pandas python -m pip install matplotlib script 相關的 module import 如下: 1 2 3 4 5 6 import os , time , sys , re import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates from datetime import datetime, date, timedelta 我們在 Jenkins Job 內設定預設讀取 config\daily_report_demo.prop,當作 Job 參數。 config\daily_report_demo.prop 的內容如下: MY_JOB_NAME=daily_report_demo DAILY_REPORT_MAIL_TO=my_account@gmail.com MY_JOB_NAME 是指定上游 Jenkins Job 的 Job name,意思就是這個 Daily Report 是統整 daily_report_demo 這個 Job 的建置結果。所以接下來: 讀取 WORKSPACE 環境變數,這個環境變數是 Jenkins 設定的,用來取得 Jenkins job 的自訂工作區位置,以我們之前的設定為例,工作區是在 D:\workshop 讀取 MY_JOB_NAME 環境變數 1 2 3 4 5 6 7 8 9 10 11 12 13 if __name__ == '__ma...

將 Jenkins Job 的歷史結果整理出視覺化的 Daily Report mail (一)

圖片
當初在處理這個問題的時候,大部分都是參考國外的網站,使用 Jenkins 內建功能送 email 的文章很多,但是 像是要自訂 mail 內容,蒐集統整不同 Job 的狀態以及包含視覺化報表 的部分倒是很少看到,所以就做個紀錄與分享,一方面也是拋轉引玉,歡迎交流。 這裡的做法受限於 "Free-Style" 形式的 Jenkins Job,所以過程會比較繁瑣;但是換句話說,如果只想用 "Free-Style" 形式來創建 Jenkins Job,可以從這篇文章得到一些靈感。 這個主題為了盡量寫得詳細點,會分成三個部分: Jenkins Daily Report Job 的相關設定。( 本篇 ) 使用 Python/Pandas/matplotlib 做資料分析及處理 。 說明使用 jelly script 來客製化郵件內容 。 最後目標是每天自動送出視覺化統計 Jenkins Job 歷史狀態的 email,如下圖。 首先,本篇會說明以下主題: 設定 Jenkins 郵件相關 (gmail) SMTP 設定 需要安裝的 Jenkins Plugin 新增/設定一個 Jenkins "Daily Report" Job 這個系列 沒有 說明的部分如下: (我想這些在網路上應該都很容易可以找到相關資料) 安裝 Jenkins 設定 slave node,並在 slave node 上執行 Jenkins Job 設定 Jenkins 郵件相關 SMTP 設定 讓 Jenkins 寄出郵件需要設定 SMTP server,這邊以使用 gmail SMTP為範例。 Jenkins mail 設定在 "管理 Jenkins" => "設定系統"   http://localhost:8080/configure 詳細設定如下圖,設定完成可以勾選"寄測試信",先試試看設定是否正確。 如果看到 "電子郵件成功寄出"就代表設定正確了。 已知目前 google 認為 Jenkins Plugin登入SMTP的方式安全性較低,使用者必須要自行 "啟用安全性較低的應...