第十六篇 - ELK 安裝筆記

這份其實是學校作業(逃)。雖然說是作業,但也還算有分享的價值,就在此整理出來。因為主力機 MBA 的儲存空間快炸了,所以我在 AWS 上開了一台 t2.medium 的機器來跑 Spark 以及 ELK Stack。在課堂中, ELK 是以下載 binary zip 包的方式設定,因為小弟習慣用 APT 套件管理程式,所以裝 ELK 相關設定方式也和 binary zip 不太一樣。

安裝過程主要參考數位海的這篇,還有上課簡報。數位海這篇超詳細的,可以交互對照一下。

<!--more-->

安裝 Java 8

sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
sudo apt-get -y install oracle-java8-installer

安裝 ElasticSearch

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
sudo apt-get update
sudo apt-get -y install elasticsearch

到這邊裝完,然後編輯 ElasticSearch 設定檔:

sudo vi /etc/elasticsearch/elasticsearch.yml

把 network.host 改成 0.0.0.0,讓外網也可以存取。

註:之後還會搭上 nginx 的 reverse proxy,並裝上前端 kibana,這裡為了安全性也可以不要改。

重啟 elasticsearch 的服務:

sudo service elasticsearch restart

讓它開機時自動啟動(Optional)

sudo update-rc.d elasticsearch defaults 95 10

ElasticSearch binary 檔的位置在 /usr/share/elasticserach/bin

安裝 head plugin:

sudo /usr/share/elasticserach/bin/plugin install mobz/elasticsearch-head

把 iptable 打開

sudo iptables -A INPUT -m tcp -p tcp --dport 9200 -j ACCEPT
sudo iptables -A INPUT -m udp -p udp --dport 9200 -j ACCEPT

記得在 EC2 打開 9200 port,這時候開啟瀏覽器,進到

http://YOUR_IP_ADDRESS:9200/_plugin/head

就有一個簡單的圖形界面啦。

安裝 Kibana

echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.4.x.list
sudo apt-get update
sudo apt-get -y install kibana

到這裡裝完,然後編輯 kibana 的設定檔:

sudo vi /opt/kibana/config/kibana.yml

把 server.host 從 0.0.0.0 改成 localhost,因為稍後會裝 nginx 來做我們的反向代理:

server.host: "localhost"

加入開機啟動,然後啟動服務:

sudo update-rc.d kibana defaults 96 9
sudo service kibana start

安裝 nginx 啥的

sudo apt-get install nginx apache2-utils

建立一個 kibanaadmin 的認證使用者(名稱可換)

sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

編輯 nginx 設定檔

sudo vi /etc/nginx/sites-available/default

換成下面這個

server {
    listen 80;

    server_name example.com;

    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

example.com 的地方,看你要換成 Instance 的 IP 或是 domain name 都可以。EC2 可以換成 public dns name。

重啟 nginx

sudo service nginx restart

安裝 Logstash

echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
sudo apt-get update
sudo apt-get install logstash

中間數位海插了一段設定 SSL 的,因為我沒有要用就跳過這部分。

Logstash 安裝完的 binary 會在 /opt/logstash/bin

設定 Logstash

sudo vim /etc/logstash/conf.d/02-twitter.conf

填入以下內容

input {
    twitter {
        consumer_key => ""
        consumer_secret => ""
        oauth_token => ""
        oauth_token_secret => ""
        keywords => ["beauty"]
        languages => ["en"]
        full_tweet => true
    }

}
output {
    elasticsearch {
        index => "twitter"
    }
}

oauth 的 key 就填自己申請的,keywords 填自己要的,然後存檔離開。

接下來跑

sudo service logstash configtest

看一下設定檔有沒有寫錯, 然後重啟 logstash 服務,並加入開機自啟動(Optional)

sudo service logstash restart
sudo update-rc.d logstash defaults 96 9

原則上這時候登入 kibana 或是在 head 儀表板就可以看到記錄數一直增多了 :p

匯出資料

我用了 elasticsearch-dump 套件,記得先裝好 node v1.0 以上版本。

npm install elasticdump -g # 安裝

elasticdump --input=http://localhost:9200/twitter --output=twitter.json # 一鍵匯出

上傳

之前 Github 推了 LFS(Large File Storage),json 雖然純文字檔很好壓縮,但無論怎麽壓還是有點難推進到 100 MB ,也就是 Github 支援的最大容量,以內。勢必就要來用下 git-lfs 了。

匯出的資料格式

搜尋的關鍵字是 beauty,你知道 twitter 上最多這種圖帳了,多訂閱幾個總是使人心情愉悅 #)

{
  "_index": "twitter", // 灌入到 elasticsaerch 裡的資料表
  "_type": "logs",
  "_id": "AVPCY9McFvHLlvNymVV9", // elasticearch 產生的 id
  "_score": 1,
  "_source": {
    "created_at": "Tue Mar 29 12:40:34 +0000 2016", // 建立於
    "id": 714794377491587100, // twitter  tweets id
    "id_str": "714794377491587072",
    "text": "Regina King On The 'Fascinating' Beauty Of Black Women's Hair https://t.co/0838uXkQ1e @HannahOliver152",
    "source": "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.it</a>",
    "truncated": false,
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": null,
    "in_reply_to_user_id_str": null,
    "in_reply_to_screen_name": null,
    "user": { // twitter user 的資料
      "id": 2558258431, // user id
      "id_str": "2558258431",
      "name": "Hannah Oliver", //名字
      "screen_name": "HannahOliver152", //帳號名
      "location": null,
      "url": "http://www.wordpress.com",
      "description": "Our life always expresses the result of our dominant thoughts.",
      "protected": false,
      "verified": false,
      "followers_count": 31,
      "friends_count": 11,
      "listed_count": 6,
      "favourites_count": 0,
      "statuses_count": 17481,
      "created_at": "Tue Jun 10 05:18:02 +0000 2014",
      "utc_offset": null,
      "time_zone": null,
      "geo_enabled": false,
      "lang": "en",
      "contributors_enabled": false,
      "is_translator": false,
      "profile_background_color": "C0DEED",
      "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
      "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
      "profile_background_tile": false,
      "profile_link_color": "0084B4",
      "profile_sidebar_border_color": "C0DEED",
      "profile_sidebar_fill_color": "DDEEF6",
      "profile_text_color": "333333",
      "profile_use_background_image": true,
      "profile_image_url": "http://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg",
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg",
      "profile_banner_url": "https://pbs.twimg.com/profile_banners/2558258431/1402377722",
      "default_profile": true,
      "default_profile_image": false,
      "following": null,
      "follow_request_sent": null,
      "notifications": null
    },
    "geo": null,
    "coordinates": null,
    "place": null,
    "contributors": null,
    "is_quote_status": false,
    "retweet_count": 0,
    "favorite_count": 0,
    "entities": {
      "hashtags": [],
      "urls": [
        {
          "url": "https://t.co/0838uXkQ1e",
          "expanded_url": "http://dlvr.it/Kw7QcG",
          "display_url": "dlvr.it/Kw7QcG",
          "indices": [
            62,
            85
          ]
        }
      ],
      "user_mentions": [
        {
          "screen_name": "HannahOliver152",
          "name": "Hannah Oliver",
          "id": 2558258431,
          "id_str": "2558258431",
          "indices": [
            86,
            102
          ]
        }
      ],
      "symbols": []
    },
    "favorited": false,
    "retweeted": false,
    "possibly_sensitive": false,
    "filter_level": "low",
    "lang": "en",
    "timestamp_ms": "1459255234488",
    "@version": "1",
    "@timestamp": "2016-03-29T12:40:34.000Z"
  },
  "fields": {
    "@timestamp": [
      1459255234000
    ]
  }
}

(完)

Read on

第十五篇 - 使用 AWS CodeDeploy 跑起你的 WordPress - 官方教學筆記

為何要部屬 WordPress?就因為他是 CodeDeploy Tutorial 的第一個範例。AWS Documention 有個特點,就是到處 Reference 來 Reference 去,你很難在單一流程完整跑完所有的任務,非得要搭著其它份文件一起對照。筆者英文也沒那麼好,看著看著就會漏東漏西,文件又滿滿的都是字,沒有圖片可以參考,真令人崩潰。

CodeDeploy 是 AWS 眾多部屬方案中,看起來比較單純的一種。寫好 Setup 程式的 Shell Script,再聲明好 appspec.yml,定義每個 deploy life cycle 不同的階段要跑的動作,用 AWS CLI Tool 把 repo 打包上傳到 S3,再到 CodeDeploy console 定義應用程式部屬規則、後臺發起一個 deployment(一個部屬行動),CodeDeploy Service 便會把你的 code 部屬到你設定的 Deployment Group,依照 Group 設定的機器不同,你可以在同一個機器部屬很多個 Application,或是同一個 Application 部屬到很多台機器,端看設定,啦。

當然,AWS 系列就是啥都可以用 CLI 跑,只要開好對應權限的 role 並拿到 Access ID 和 Secret Key,我們也可以交由第三方 CI 服務,比如說 CodeShip,來幫我們完成「打包程式碼並上傳 S3」、「發起部屬行動」這種的工作。

以下便大致記錄一下本日折騰的感想與流程。

Read on

第十四篇 - 從 Hackpad 搬家到 Quip

你知道,Hackpad 自從被 Dropbox 買走之後就沒增加新功能了,從 15 年四月收到信說要幾周後開源,也是過了很久的八月才完成(雖然也沒有很久啦)。當然技術公司的整並進去必定要做一堆的交接、磨合、修改成能開源的版本;不過十二月時又有 Dropbox 關掉 Mailbox 的前車之鑑,一路看下來我們還是多做幾個備份好 :p

Quip 的好就不用多說了,由 Facebook 前 CTO Bret Taylor 創立,最近才在 15 年十月拿到 30M 的 B 輪投資金,結合 React Native C++ Binding 強大技術力的 Desktop Client,近幾個月來也持續在 UI、功能上優化,前途真是一片光明啊(?)。

把 Hackpad 轉移到 Quip 確實是個不錯的決定(鋪陳這麼久就為了這句 XD),加上 Quip 也非常 Nice 的提供此功能:

Well, 早在 14 年吶。雖然 Dropbox Paper(前 Hackpad)也有提供導入功能,不過竟然還需要寫信到客服信箱,告知要匯入的 workspace 之後才能匯入。產品已經變你們家的,竟然還沒有無痛一鍵匯入是哪招啦 XDD。於是我的 Quip 搬家行動是勢在必行了,以下就略述這個從 hackpad 搬家到 quip 的過程。

Read on

第十三篇 - 弄了一個統一發票查詢的 gem

感覺很久沒發文章了。

因為正在準備大重構敝司的程式碼,最近這兩天,就把八個多月前寫的一個「統一發票兌獎」的 gem 給重構了一番,順便找一下手感。

其實無非就是加些 class,修一些 bug,補些測試,還是來這邊記錄一下,畢竟也半年多沒更新了 XD

Uniform Invoice Lottery(Github)

安裝

一如往常在 Gemfile 加上

gem 'uniform_invoice_lottery'

然後跑 bundle

使用範例

require 'uniform_invoice_lottery'
prize = UniformInvoiceLottery.check '82930261', time: Time.new(2015, 7, 26)
prize = UniformInvoiceLottery.check '82930261', year: 2015, month: 7 day: 26

puts prize.amount # => "10000000"

puts prize.title  # => "特別獎"

大概這樣,資料是從財政部這抓的。不過我的 css selector 過了八個月又大修了一番,希望別再無效了 :p

第十二篇 - 台科課程匯入小幫手

台科課程匯入小幫手

屁話

這幾天串了 118 的學生資訊系統、 Colorgy 的 API 整合了 Table,做出了無痛匯入課程的小工具,算是開了 Colorgy 第三方 App 的第一槍 =w=(自以為)

直接從學生資訊系統匯入課程這功能, NTU Sweety CourseNTHU CourseNCTU+ 都有類似的實作,112/113 的版本似乎直接串學校,就不知道是官方還非官方了XD。當然一提到校園模擬選課就必須拜一下碼頭,CrossLink

找回一個玩樂心態來弄這個小玩意,沒啥特別計劃,時機到累積完就做出來了 Q_Q,感謝捏神支援。

照慣例把玩具放在 Heroku,說到他們最近政策也滿妙的,之前一直寄信說每天只能開機十八小時,現在過了 8/16 了也都照常使用,41J 也沒碰上過啥問題,還沒付過 heroku 錢欸 XD,It's the future.

Gihub: https://github.com/Yukaii/SchoolAgent

Repo 原始英文超中二的 XDDD,不忍直視,請不要去翻 commit 穴穴尼
一些介面
Read on

第十篇 - 綜合外電施旖婕(41J)

以下轉自我的 Github

蘋果日報即時新聞監看,簡稱 Apple Watch

這是幹嘛的?

不知大家有沒有聽過「施旖婕」這響叮噹的名號,總之就是蘋果日報專發腥羶色新聞的專用作者名,不管了就是我老婆。詳細可以 follow 八卦版系列文

於是就寫了一份可以監看蘋果日報即時新聞的 Rails 服務,目前在上面可以看到每天蘋果日報上,記者施旖婕所 PO 的綜合外電,感受世界各地滿滿的惡意(X)。

目前部署在 heroku,因為是,定時用 UptimeRobot 戳一下讓它自動跑 task 即可。

Todos

  • 前端
  • 統計圖表(等資料量至少累積一個月吧 XD)
  • Administration(爽度問題)
  • 串 Facebook Message API,讓你隨時感受 1J 的愛
  • 自動 PO 粉絲專頁-綜合外電施旖婕 已完成
  • 熱門度(自動更新蘋果上面的熱門度,加上自己站上的)

等等,好像還挺多的。

好玩嘛

第九篇 - 使用 iTunes Match

曾經有一陣子很熱衷「試聽」音樂,iTunes Library 不知不覺就長到了 90GB。iTunes 實在方便,乾淨的專輯封面總攬,這樣選歌差不多也就夠了。但自從換了有 SSD 的電腦,90GB 的音樂對於硬碟空間也是太奢侈了。

以前的玩法

複製到 Nas 中,區網掛載。

方便性還可以接受,畢竟 Library 都還看到自己的所有歌,只是受限于區網設備,有時候硬碟掛載失敗,或是花很久時間載入,在外網或是手機端也無法使用。

iTunes Match

年費 NT$ 690,以現有的音樂資料庫(不管你是不是試聽版來著)去核對 iTunes 的資料庫,如果他們商店有就記錄起來,如果找不到,就將歌曲上傳至 iCloud,每一個登入 iTunes 帳號的裝置,手機平板或其他台電腦都可以即時串流,也可以透過 iCloud 下載至裝置,好處自然不計多說,Android 暫時無解,限制最多只能存放 25000 首歌。偷偷說,一年不小心試聽三張專輯就回本啦......

算算我也放了一半多了(一萬兩千多首),之後的增加速度就會小很多了吧,哈哈。

第八篇 - 讓免費 Heroku App 不會自動關機

免費的 Heroku 開的 App 只要過半小時,就會自動關機。雖然啟動很快,不過體驗就差了。

一般的做法是安裝 newrelic 監控,每隔一段時間交流一下,就可維持開機狀態。不過本 ghost 部落格一直設定不起來 newrelic 的 node 套件,只好找了個替代品 UptimeRobot 來使用。免費的方案可以 monitor 五十個站台,最短 interval 為五分鐘,夠用了。

表現倒是不錯,設定每十五分鐘左右自動 ping 個,就和一般網站一樣啦,皆大歡喜 XD。

第七篇 - 寫一封 html 的 email

Prerequite

一些簡單的 html/css 知識

流程

Email 裏 css 有些東西沒法用,所以需要測試在每一個 client 的效果。

完整的支援表請見此

我的需求簡單的滿版就能搞定了,參考了問一的建議,儘量用 border / padding 來推,並沒有花很久的時間。

先在 <head> 寫完 <style> ,呈現大致的成果:

Read on