2015/9/30

部落格寫作流程

部落格寫作流程

寫作原因:

  • facebook 的蒐尋機制十分落後,很難期待
  • 為自己留下學習與思考上的紀錄

流程:

  • 使用 macdown 軟體,以markdown語法編寫,再用html語法貼至 blogger平台
  • 以h3做為文章內的次標題(###)
  • 貼圖使用 flickr 以利同時發佈到不同的blog平台
    • 上傳至flickr私人目錄
    • flickr的私人權限是以照片為單位,不是以目錄為單位,為了以利後續批次作業,上傳的圖片的檔名均以blog+日期命名
    • flickr 支援外連:點選 flickr share圖示即可取得連結
    • 減少圖片的使用,部落格儘量以文字與流程為主,技術細節就直接放在 github
  • 程式碼貼至 github gist 以利同時發佈到不同的blog平台

重點:

  • 重視問題的流程
  • 儘量長話短話講重點
  • 儘量維持一定的發文頻率

技術合作:

會在 http://data-sci.info/ 出沒,所以如果有看到文章或是回應與本部落格高度相似的,不用懷疑作者就是我啦… 沒有抄襲的問題

在Windows 系統捉取網頁中文資料時會有亂碼,要如何處理?[R]

Q:在Windows 系統捉取網頁中文資料時會有亂碼,要如何處理?

A:使用 library(tmcn) 套件轉utf8


效果節錄:
未使用tmcn套件前:
[1] “\xe7摰單\x87\xae葉敹圾\xe9\xe6\x89偷\xe5 \xe5\xe9\xe5\xe5璈\xe6頧\x9f”
[2] “鈭箸腦\xe6\x96嚗\xb6晷\xe3\u0080擛亦\xb5\u0080\x8d 瞈\u0080瘣芷\xe7\x87\xe6”
使用tmcn套件與 toUTF8 函數後:
[1] “大樹阻台北淡水路 北投警冒雨排除”
[2] “曾抗議連戰赴中被美禁入境 王世堅坦然面對”

2015/9/20

[備忘]使用 Docker 中的R Jupyter,中文顯示與輸出異常??


[備忘]使用 Docker 中的R Jupyter,中文顯示與輸出異常??


問題:

使用 Docker 中的R Jupyter,中文顯示與輸出異常??

輸入中文字串正常,檢查編碼也是 UTF-8

解法:[暫解]


  • 在R中設定語系:   Sys.setlocale(category = "LC_ALL", locale = "C.UTF-8") 
  • Sys.setlocale()的效果是暫時性的,下次再開一個新的notebook時需要重新啟用

  • 經過測試,在讀入網頁時都會自動轉成 UTF-8 也都能無誤的輸出 UTF-8 資料
  • 讀入資料時,例如讀入 BIG5 編碼的 CSV 文件時,只要指定正確編碼格式也能正確讀入R中  ---ex: read.table("ubike-sampledatabig5.csv" ,header=TRUE, fileEncoding="BIG5")
  • 網路上有建議將 BIG5 文件全部轉成 UTF-8後再處理,在Linux應該只需要在讀入時指定好編碼格式即可…  因為我測試用  readLines 轉編碼會異常…
  • Docker 只是測試環境,所以不想在設定上尋求完美的解法;後續在生產環境時,會是單純的 R 搭配著 zh_TW.UTF-8 的設定

困惑點:


  • 聽說在 Linux 版本的 R 不需要擔心編碼問題 ?
若用 Sys.getlocale() 檢查只會回傳 'C' ,依網路上的文章理論上應該是不會有問題才是;但是 Jupyter 相關的討論串中也有人建議應該要加進  en_US.UTF-8 因為在部份字元排序會與 C.UTF-8 有不一致的情形發生?
  • 變數儲存中文無異常;下例: 網路上的即時新聞標題 title_css,直接以 title_css 執行,則正常顯示中文


 但是若用 print(title_css)或是 write.table()輸出文字檔,則會出現如下錯誤


經 Encoding(title_css)檢查也是 UTF-8

因為是 Docker 所啟用的ubuntu所以確認語系等相關設定為何?

發現和一般安裝 Ubuntu 的狀況不同…  

發現 Docker 中所預設的語系比一般情況下的 Ubntu 少了很多,所以若是在 R 中執行網路上建議的 Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8")會有錯誤訊息…
取而代之,我們可以使用

則將變數搭配 print() 或是相關輸出函式時就能正常顯示中文 write.table()

參考文件:







[備忘]使用 Mac Homebrew安裝最新版Sqlite後,系統預設仍是舊版Sqlite3


問題:
使用Homebrew安裝最新版Sqlite後,系統預設仍是舊版Sqlite3???

解法:
(1)因為我有安裝zsh ,所以 ~/.zshrc 的優先權大於~/.bash_profile

因為忘了這個前提,所以花了很多時間在找解法 = ="

(2)確認目前環境中,sqlite3的位置( which sqlite3)
  • source ~/.zshrc 再執行which sqlite3 :
    • /Users/帳號/anaconda/bin/sqlite3 (版號:3.8.4.1 2014-03-11) 舊版本
  • source ~/.bash_profile 再執行which sqlite3:
    • /usr/local/bin/sqlite3 (版本:3.8.11.1 2015-07-29) 新版本
(3)調整 ~/.zshrc 設定

由上一步,可以發現不同環境下 sqlite3 位置不同,自然版本也就不同,也難怪依照網路上的建議對 ~/.bash_profile 進行編輯對我無效,將 ~/.zshrc 設定檔中的環境變數調整如下,記得要把/usr/local/bin目錄 置於/Users/帳號/anaconda/bin前面:

export PATH=/usr/local/bin:/Users/帳號/anaconda/bin

(4)存檔後,重新 source ~/.zshrc 就生效了!

心得:

環境建置有時候真的是一件累人的事情…  也難怪近來 Docker 會如此火紅了

2015/9/19

[備忘] 在Blogger中插入程式碼

現在都儘量使用 markdown 語法來編寫文件,因為很容易轉換成 html 格式文件;然而在google提部的部落格平台中(blogger.com),卻無法簡單的插入程式碼…

舉例來說,在 markdown 軟體中的效果如下:


但是實際顯示變成:


看起來專業程度就差了一半…

網路有很多討論的文章都建議去修改 css 語法,但選擇 blogger.com 做為平台就是希望儘量減少這種麻煩事,專注在文章寫作上;

所以找到了 Github Gist 的解決方法,只要在 Github Gist 建立程式碼後,再到 Blogger 的編寫平台插入 Javascript 即可

例如:

 <script src="https://gist.github.com/lovelybigdata/20f71f0089eada9353c0.js"></script>



這樣看來是不是專業多了呢??

另外不知保故,依國外網友們的實測再經過我的測試 Google Blogger 若使用最新的動態檢視版面則一樣無法正常顯示 Github Gist 的程式碼…


2015/9/17

簡單好用的 web scraping R 套件 - rvest

近年來很流行網路爬蟲技術,可以自行捉取自己想要的資訊; 只要不是太複雜的網站,使用 R 底下的套件 httr 就可以捉取了;不過由於 httr 並沒有直接支援 CSS 與 xpath 選取,所以還要額外安裝其他的套件來輔助解析網頁資訊。

最近發現到 rvest 這個套件,直接支援 ccs 與 xptah 選取,安裝 rvest 後,在啟用 rvest 時也會順道加入支援 pipeline 編寫,可以有效避免恐怖的巢狀地獄…
rvest 使用如同一般網路爬蟲技術,流程如下所示:
  • 要捉的網頁真實的網址是什麼 --url = ???
  • 把網頁捉下來 --html( )
  • 解析(parse)網頁,選取所需內容(使用 CSS 或 XPATH ) --html_nodes()
  • 過濾掉其他雜質 -- 此例中我們只留下純文字就好 不留下超連結 html_text()
因為蘋果日報最近的全幅廣告真的很討人厭 > <" ,以下就以自由時報的即時總覽的第一頁進行說明 網址如下: http://news.ltn.com.tw/list/BreakingNews

首先我們可以使用 chrome 中的開發者工具 或是 Firefox 中的 Firebug 來協助我們進行選取,可以發現用以下的語法就能正確捉取我們所要的資料…
  • css 選取語法 .picword
  • xpath 選取語法 //*[@id='newslistul']/li/a
接著就幾乎等於完成了,沒錯這就是最簡單的一隻網路爬蟲 :)
此處以 css選取(html_nodes函數)舉例,並將資料存成 dataframe 格式,以利串接至資料庫中:
 
library(rvest)

 news_url="http://news.ltn.com.tw/list/BreakingNews"

title_css = html(news_url) %>% html_nodes(".picword") %>% html_text()

my_news = data.frame(title = title_css)

View(my_news)

然後你就會有2個重大的發現:
(1)網路爬蟲的入門也蠻簡單的啊~~
(2)即時新聞大部份都不是很重要~~

備註1:使用 xpath 選取
將html_nodes(".picword")以html_nodes( xpath = "//*[@id='newslistul']/li/a")取代即可

備註2: 想要取捉每篇即時新聞的網址,以利後續捉取內文的話呢??
my_news =
data.frame(
title = html(news_url) %>% html_nodes(".picword") %>% html_text()  , 
title_href = html(news_url) %>% html_nodes(".picword") %>% html_attr( "href")  ,
stringsAsFactors=FALSE)  

備註3: 套件作者 Github https://github.com/hadley/rvest