2016年6月8日 星期三

使用 Azure 寄信方案 - SendGrid: Marketing & Transactional Email Service

SendGridDashboard

上週出了個大包,原先採用 AWS SES 寄信時,因為綜合原因導致 bounce rate 上升,接著就被停權使用 AWS SES 服務了!這件事說小事也可以,說嚴重很嚴重,單就看你的服務營運跟面對的心態。我把它當很嚴重的事來處理 Orz 包含盡可能跟 AWS 業務互動,再來沒打通 AWS SES 服務前,就趕緊找找替代方案了!

除了用自家的 mail server 寄信撐外,就來找找其他家服務了,於是乎 Azure 就出現了、SendGrid 也出現了!

使用 SendGrid 真的還滿方便的,除了可以查詢寄了哪些信外,什麼都沒做還能提供使用者開信紀錄!真是太便利了。

只是談錢就傷感情了 XD
使用 Sendgrid 一個月發送 40k 封信,要價 9.95 歐元;假設一個月送 40k 封信,若每封 500kb,採用 AWS SES 則是 20GB 流量/month + 1333 封信/day ,總價不到3美金。

2016年4月25日 星期一

[PHP] Use iTunesConnect API to Add iOS App External Test User

其實,已經有 TestFlight 很方便了,但基於一些練習,就稍微仿別人做過的流程練習一下,原理不難:

  1. 使用 cURL + cookie 完成登入 iTunesConnect
  2. 切換至 App 頁面資訊,查看有多少 Test User
  3. 添加 Test User
  4. 刪除 Test User
如此而已 :P 於是乎,用 https://github.com/changyy/codeigniter-library-ios-test-user 紀錄一下。

2016年4月21日 星期四

[SQL] 計算資料比數所佔的比例 @ MySQL 5.6

這個需求好像滿常見的?例如有一張表記錄著許多操作的流水帳,例如:

CREATE TABLE `play_action` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`play_result` INT (10) NOT NULL
)


想要以天為單位:

SELECT DATE_FORMAT(timestamp, "%Y-%m-%d %a") AS d, play_result, count(*) FROM play_action GROUP BY d, play_result

就能得知一天當中,所有操作結果的次數,那如果是比例呢?只好要先 SUM 加總一下 XD 最後在 JOIN 一下即可。此例就用暫存表來處理,其中暫存表不予許同一個 SQL 內有多次存取,所以只好多開一張暫存表來處理,連續動作:

Step 1: 建立一張暫時表,以天為單位,根據播放後的狀態,依序是播放次數、播放日期、播放結果,其中播放結果 0 是正常的

CREATE TEMPORARY TABLE `play` (
`play_count` INT (10) NOT NULL,
`play_date` VARCHAR(32) NOT NULL,
`play_result` INT (10) NOT NULL,
UNIQUE KEY `play_date` (`play_date`, `play_result`)
);


Step 2: 從 play_action 撈資料來填補,此時可以用條件式挑選想要的資料,此例是 4 月之後的資料

INSERT INTO `play` (play_result, play_date, play_count) SELECT play_result, DATE_FORMAT(timestamp, "%Y-%m-%d %a") AS d, count(*) as c FROM play_action WHERE timestamp >= '2016-04-01 00:00:00' GROUP BY play_result, d ORDER BY d ON DUPLICATE KEY UPDATE play_count=VALUES(play_count);

Step 3: 建立另一張暫存表,單純以天記錄總播放次數

CREATE TEMPORARY TABLE `play_sum` (
`play_count` INT (10) NOT NULL,
`play_date` VARCHAR(32) NOT NULL,
UNIQUE KEY `play_date` (`play_date`)
);

INSERT INTO `play_sum` (play_date, play_count) SELECT play_date, SUM(play_count) AS play_total FROM play GROUP BY play_date;


Step 4: 簡易運算,輸出為日期、播放成功次數的比例,總播放次數

SELECT play.play_date, play.play_result, play.play_count / play_sum.play_count * 100, play_sum.play_count AS play_total FROM play, play_sum WHERE play.play_date = play_sum.play_date;

+----------------+-------------+---------------------------------------------+------------+
| play_date      | play_result | play.play_count / play_sum.play_count * 100 | play_total |
+----------------+-------------+---------------------------------------------+------------+
| 2016-04-01 Fri |           0 |                                     54.9398 |        687 |
| 2016-04-02 Sat |           0 |                                     68.9445 |        972 |
| 2016-04-03 Sun |           0 |                                     75.6607 |       1748 |
| 2016-04-04 Mon |           0 |                                     71.3967 |       1112 |
| 2016-04-05 Tue |           0 |                                     70.2852 |        886 |
| 2016-04-06 Wed |           0 |                                     49.8085 |        880 |
| 2016-04-07 Thu |           0 |                                     53.2239 |        596 |
+----------------+-------------+---------------------------------------------+------------+

2016年4月20日 星期三

試用 Microsoft Azure Machine Learning / studio.azureml.net 服務

azureml01

參加了 DevDays Asia 2016 活動,這次本來就看重於 Azure Machine learning 項目,雖然已經多少知道了,但看到講者或是導覽,只需將資料轉成 csv 以及在介面上拖拉一下就完成,還是滿驚豔的 :P
  • http://interopevents.com/taipei2016#taipei2016-speakers
  • https://www.microsoft.com/taiwan/events/devdays/agenda.htm
簡言之,使用者只需要將資料轉成 csv 格式(這邊其實是最多 know-how 的),接著完全用 http://studio.azureml.net/ 介面上傳資料、分割資料、挑選要用的演算法,在拉幾下,收工!

整個過程甚至可以方便地觀看 input 資料、觀看 traning 的結果,甚至在穿接成 web service api 來用都可以。這完全把資料分析中的:資料情境分析、資料科學家、資料工程師的工作,其中後兩者的工作都做完八九成了!

為何說資料情境分析還沒呢?當情境定義完後,而資料的前置處理才是最最重要的一塊,這幾乎還是無人能取代的,若真的說要有,大概就是用 AI 或是 try-and-error 把各種排列組合都自動化處理完,這樣也不是不可以啦 :P

筆記一下流程(建議直接上 studio.azureml.net 看導覽):

azureml02

azureml03

接著,隨意打一些關鍵字,可以找尋到測資:

azureml04

資料有了,接著就是分群,請用 split 關鍵字,依照填寫的比例,把一群拿去 train:

azureml05

再來,就是要 train 了,可以挑選目標欄位:

azureml06

azureml07

接著,用 two class 關鍵字,可以找到一批免錢的演算法 XD

azureml08

最後,再用 score 關鍵字,可以安排後續的動作:

azureml09

azureml10

再按個 Run 就會跑,跑完就可以看資料囉:

azureml11

azureml12

azureml14

azureml15

你以為就這樣而已嗎?其實還可以在串成 Web service api ... 這段就請直接看完導覽就知道了,在此單純文字紀錄上述流程。

2016年4月4日 星期一

透過 Git Submodule 和 CMake 使用 GoogleTest

大概兩年前有練習一下 [CPP] Unit Test for C++ Usage via Google Test,連假來複習一下,著重在 CMakefile 的使用:

$ cd /path/project
$ git submodule add https://github.com/google/googletest/tree/master/googletest 3rdParty/googletest

$ vim CMakeLists.txt
...

add_subdirectory(3rdParty/googletest)
add_executable(your_unit_test
your_unit_test.cpp
)
add_dependencies(your_unit_test gtest)
include_directories(${gtest_SOURCE_DIR}/include)
target_link_libraries(your_unit_test
gtest
)