顯示具有 json 標籤的文章。 顯示所有文章
顯示具有 json 標籤的文章。 顯示所有文章

2020年3月21日 星期六

[C] 嵌入式 Web Server + cgi-bin + JSON = thttpd + cgic + cJSON 開發筆記 @ macOS

記得七八年前,是在嵌入式平台上寫 C++ 的 CGI 練習,現在則是在試著寫 C 語言。以下幾個套件還滿夠用的,筆記一下:
而 cgic 跟 cJSON 都是很精簡的單一檔案,非常方便,建議直接看他們的 header file ,就可以很快了解其概念,其中 cJSON 適合看 README ,裡頭提到了需要面對的記憶體管理。

以下是 CMake 編譯範例:

# https://raw.githubusercontent.com/boutell/cgic/master/cgic.h
# https://raw.githubusercontent.com/boutell/cgic/master/cgic.c
set(CGIC_VERSION "cgic-2.07")

include_directories(deps/${CGIC_VERSION}/include)
add_library(cgic
        deps/${CGIC_VERSION}/src/cgic.c
)

# https://raw.githubusercontent.com/DaveGamble/cJSON/v1.7.12/cJSON.h
# https://raw.githubusercontent.com/DaveGamble/cJSON/v1.7.12/cJSON.c
set(CJSON_VERSION "cjson-1.7.12")
include_directories(deps/${CJSON_VERSION}/include)
add_library(cjson
deps/${CJSON_VERSION}/src/cJSON.c
)


如此,後續要編譯時,就可以:

add_executable(study-app.cgi
        src/study-app.c
)
target_link_libraries(study-app.cgi
        cgic
        cjson
        curl
)


相關筆記在此: changyy/thttpd-cgi-study/blob/master/src/study-app.c

2019年9月20日 星期五

jq 指令筆記 - 整理 JSON 資料,使用 select / index 過濾關鍵字

用 jq 去整理 api/json 的資料的。整個需求是:

  • API 回傳的 JSON 資料中,是一個 array 形式,裡頭的元素是 key-value pair
  • 透過 jq 把符合我需要的 資料列出
  • 檢查在某些條件上,有哪些東西,最後回歸到 comm 的工具幫忙導出結果進行比較

筆記一下 jq 項目:

$ cat /tmp/api.json | jq '.["data"]'
[
  {
    "field": "hello"
  },
  {
    "field": "world"
  }
]
$ cat /tmp/api.json | jq '.["data"] | .[] '
{
  "field": "hello"
}
{
  "field": "world"
}
$ cat /tmp/api.json | jq '.["data"] | .[] | select (.field | index("e") > 0) '
{
  "field": "hello"
}
$ cat /tmp/api.json | jq '.["data"] | .[] | select (.field | index("e") > 0) | .field '
"hello"


如此,可以結果導入檔案,如果需要比較檔案內的差異,就可以用 comm 指令來做事

2017年9月14日 星期四

[MySQL] 從 JSON 抽取資料建立虛擬欄位 @ MySQL 5.7

同事反映 query 很慢,除了改進 SQL 語法外,也小試身手,對 JSON 資料抽出來建立虛擬欄位跟索引,順便筆記一下。

CREATE TABLE `my_data` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data` text,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


這邊 data column 是 text 型態,主因是這 DB server 從 5.6 升上來的 XD 且當初讓 data 有很多彈性,不一定是 json 格式。

但,要抽取成虛擬欄位時,建議要保持 data 是 json 格式,就先整理一下資料:

mysql> UPDATE my_data SET data = '{}' WHERE data IS NULL OR data = ''

假想 data 的數值為 {"keyword":"value"},因此抽出 keyword 虛擬欄位來用:

mysql> ALTER TABLE my_data ADD keyword VARCHAR(64) AS (JSON_UNQUOTE(data->>"$. keyword"));
mysql> ALTER TABLE my_data ADD INDEX (keyword);


如此一來,可以改對 keyword 欄位查詢了,可以再加快一點,而 table 狀態更新為:

CREATE TABLE `my_data ` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data` text,
  `keyword` varchar(64) GENERATED ALWAYS AS (json_unquote(json_unquote(json_extract(`data`,'$. keyword')))) VIRTUAL,
  PRIMARY KEY (`id`),
  KEY `keyword ` (`keyword `),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2015年8月1日 星期六

使用 jq、awk、sort、uniq、tail、diff、comm 處理 JSON 大檔

跟朋友相約參加了黑客松,主要是分析 SPAM 資訊,由於官方提供的是一個很大檔案的 json format,大多操作都適用 jq 指令處理,盡量不寫 code 來分析 XD

首先,只對指定欄位取出資料:

$ cat data_set.input
[
   { "field1":"1" , "field2": "2", "field3": 3, "field4" : [1, 2, 3] } ,
   { "field1":"a" , "field2": "b", "field3": 4, "field4" : [1, 2] } ,
   ...
}


$ < data_set.file jq '.[] | .field1 +"-" + .field2 '
"1-2"
"a-b"
...


有時會碰到資料欄位是 number ,這時會出現 string and number cannot be added 的部分,可以這樣做:

$ < data_set.input jq '.[] | .field1 +"-" + (.field3 | tostring) '
"1-3"
"a-4"
...


有時想看某個欄位個數:

$ < data_set.input jq '.[] | .field1 +"-" + (.field4 | length | tostring) '
"1-3"
"a-2"
...


接著偷懶用 awk 整理資料:

$ < data_set.file jq '.[] | .field1 +"-" + .field2 ' | awk -F'"' '{print $2}'
1-2
a-b
...


有時需要判斷數值大小後,來決定是否輸出:

$ < data_set.file awk -F'-' '{ if($2 > 10) { print $1 }}'

輸出後,可以透過 sort 跟 uniq 整理一下:

$ < data_set.file awk -F'-' '{ if($2 > 10) { print $1 }}' | sort | uniq

有時搭配 uniq -c 計算屬性後,再用 sort -n 來排序:

$ < data_set.file awk -F'-' '{ if($2 > 10) { print $1 }}' | sort | uniq -c | sort -n

這時,輸出的結果就有指定屬性從小排到大的特性,如果第 1234 個 line 開始是你要的資料,可以搭配 tail 指令取出:

$ < data_set.file awk -F'-' '{ if($2 > 10) { print $1 }}' | sort | uniq -c | sort -n | tail -n +1234

甚至,取出後再搭配 awk 把前置數字去除,只要重要結果即可:

$ < data_set.file awk -F'-' '{ if($2 > 10) { print $1 }}' | sort | uniq -c | sort -n | tail -n +1234 | awk -F ' ' '{print $2}'

最後,如果有 lookup_pattern 跟 check_data 想要比對,記得都要把兩者做 sort,就可以用 diff 跟 comm 兩個指令:

$ sort lookup_pattern > lookup_pattern.sorted
$ sort check_data > check_data.sorted


這時想要檢查沒有落在 lookup_pattern.sorted 的清單或個數:

$ diff lookup_pattern.sorted check_data.sorted | grep "<"
$ diff lookup_pattern.sorted check_data.sorted | grep -c "<"


那如果想看有 match 到的清單:

$ comm -1 -2 lookup_pattern.sorted check_data.sorted

如此一來就類似作為清單比對的動作。若比較的條件太多時,只好寫寫 python 啦:

#!/usr/bin/python
#
# input.log、p1.log、p2.log 都是以 line 為單位的資料
#

in_data = open('input.log').read().split("\n")

pattern_data1 = open('p1.log').read().split("\n")
pattern_data2 = open('p2.log').read().split("\n")

lookup1 = {}
for i in pattern_data1:
        lookup1[i] = ''

lookup2 = {}
for i in pattern_data2:
        lookup2[i] = ''

for i in in_data:
    if i in lookup1:
         print " data in lookup1"
    elif i in lookup2:
         print " data in lookup2 && not in lookup1"

2015年5月19日 星期二

透過 jq, sed, grep 從 wikipedia api 取出台灣地區鄉鎮市區列表 @ Ubuntu 14.04

靈光一想,想到撈一下台灣各地區,看到了這個:wiki 中華民國臺灣地區鄉鎮市區列表

http://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E8%87%BA%E7%81%A3%E5%9C%B0%E5%8D%80%E9%84%89%E9%8E%AE%E5%B8%82%E5%8D%80%E5%88%97%E8%A1%A8

接著想抓個鄉鎮對應表,就想起 wiki api:

http://zh.wikipedia.org/w/api.php?action=query&titles=%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E8%87%BA%E7%81%A3%E5%9C%B0%E5%8D%80%E9%84%89%E9%8E%AE%E5%B8%82%E5%8D%80%E5%88%97%E8%A1%A8&prop=revisions&rvprop=content&format=json

接著,再搭配 jq、sed、grep 縮一下資料量:

$ curl 'http://zh.wikipedia.org/w/api.php?action=query&titles=%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E8%87%BA%E7%81%A3%E5%9C%B0%E5%8D%80%E9%84%89%E9%8E%AE%E5%B8%82%E5%8D%80%E5%88%97%E8%A1%A8&prop=revisions&rvprop=content&format=json' | jq  '.query.pages[].revisions[0]|to_entries[0].value' | sed 's/\\n/\n/g' | grep -P '<small>(.*)</small> \[\[(.*)\]\]' -o | sed 's/<small>\(.*\)<\/small> \[\[\(.*\)\]\]/\1\t\2/g' | sed 's/\(.*\)\t\(.*\)|\(.*\)/\1\t\3/g'

成果:

基隆市 仁愛區
基隆市 中正區
基隆市 信義區
基隆市 中山區
基隆市 安樂區
基隆市 暖暖區
基隆市 七堵區
臺北市 中正區
臺北市 大同區
臺北市 中山區
臺北市 松山區
臺北市 大安區
臺北市 萬華區
臺北市 信義區
臺北市 士林區
臺北市 北投區
臺北市 內湖區
臺北市 南港區
臺北市 文山區
新北市 板橋區
新北市 新莊區
新北市 中和區
新北市 永和區
新北市 土城區
新北市 樹林區
新北市 三峽區
新北市 鶯歌區
新北市 三重區
新北市 蘆洲區
新北市 五股區
新北市 泰山區
新北市 林口區
新北市 淡水區
新北市 金山區
新北市 八里區
新北市 萬里區
新北市 石門區
新北市 三芝區
新北市 瑞芳區
新北市 汐止區
新北市 平溪區
新北市 貢寮區
新北市 雙溪區
新北市 深坑區
新北市 石碇區
新北市 新店區
新北市 坪林區
新北市 烏來區
桃園市 桃園區
桃園市 中壢區
桃園市 平鎮區
桃園市 八德區
桃園市 楊梅區
桃園市 蘆竹區
桃園市 大溪區
桃園市 龍潭區
桃園市 龜山區
桃園市 大園區
桃園市 觀音區
桃園市 新屋區
桃園市 復興區
新竹市 東區
新竹市 北區
新竹市 香山區
新竹縣 竹北市
新竹縣 竹東鎮
新竹縣 新埔鎮
新竹縣 關西鎮
新竹縣 湖口鄉
新竹縣 新豐鄉
新竹縣 峨眉鄉
新竹縣 寶山鄉
新竹縣 北埔鄉
新竹縣 芎林鄉
新竹縣 橫山鄉
新竹縣 尖石鄉
新竹縣 五峰鄉
宜蘭縣 宜蘭市
宜蘭縣 頭城鎮
宜蘭縣 礁溪鄉
宜蘭縣 壯圍鄉
宜蘭縣 員山鄉
宜蘭縣 羅東鎮
宜蘭縣 蘇澳鎮
宜蘭縣 五結鄉
宜蘭縣 三星鄉
宜蘭縣 冬山鄉
宜蘭縣 大同鄉
宜蘭縣 南澳鄉
苗栗縣 苗栗市
苗栗縣 造橋鄉
苗栗縣 西湖鄉
苗栗縣 頭屋鄉
苗栗縣 公館鄉
苗栗縣 銅鑼鄉
苗栗縣 三義鄉
苗栗縣 大湖鄉
苗栗縣 獅潭鄉
苗栗縣 卓蘭鎮
苗栗縣 竹南鎮
苗栗縣 頭份鎮
苗栗縣 三灣鄉
苗栗縣 南庄鄉
苗栗縣 後龍鎮
苗栗縣 通霄鎮
苗栗縣 苑裡鎮
苗栗縣 泰安鄉
臺中市 中區
臺中市 東區
臺中市 南區
臺中市 西區
臺中市 北區
臺中市 北屯區
臺中市 西屯區
臺中市 南屯區
臺中市 太平區
臺中市 大里區
臺中市 霧峰區
臺中市 烏日區
臺中市 豐原區
臺中市 后里區
臺中市 石岡區
臺中市 東勢區
臺中市 和平區
臺中市 新社區
臺中市 潭子區
臺中市 大雅區
臺中市 神岡區
臺中市 大肚區
臺中市 沙鹿區
臺中市 龍井區
臺中市 梧棲區
臺中市 清水區
臺中市 大甲區
臺中市 外埔區
臺中市 大安區
彰化縣 彰化市
彰化縣 員林鎮
彰化縣 和美鎮
彰化縣 鹿港鎮
彰化縣 溪湖鎮
彰化縣 二林鎮
彰化縣 田中鎮
彰化縣 北斗鎮
彰化縣 花壇鄉
彰化縣 芬園鄉
彰化縣 大村鄉
彰化縣 永靖鄉
彰化縣 伸港鄉
彰化縣 線西鄉
彰化縣 福興鄉
彰化縣 秀水鄉
彰化縣 埔心鄉
彰化縣 埔鹽鄉
彰化縣 大城鄉
彰化縣 芳苑鄉
彰化縣 竹塘鄉
彰化縣 社頭鄉
彰化縣 二水鄉
彰化縣 田尾鄉
彰化縣 埤頭鄉
彰化縣 溪州鄉
南投縣 南投市
南投縣 埔里鎮
南投縣 草屯鎮
南投縣 竹山鎮
南投縣 集集鎮
南投縣 名間鄉
南投縣 鹿谷鄉
南投縣 中寮鄉
南投縣 魚池鄉
南投縣 國姓鄉
南投縣 水-{里}-鄉
南投縣 信義鄉
南投縣 仁愛鄉
雲林縣 斗六市
雲林縣 斗南鎮
雲林縣 林內鄉
雲林縣 古坑鄉
雲林縣 大埤鄉
雲林縣 莿桐鄉
雲林縣 虎尾鎮
雲林縣 西螺鎮
雲林縣 土庫鎮
雲林縣 褒忠鄉
雲林縣 二崙鄉
雲林縣 崙背鄉
雲林縣 麥寮鄉
雲林縣 臺西鄉
雲林縣 東勢鄉
雲林縣 北港鎮
雲林縣 元長鄉
雲林縣 四湖鄉
雲林縣 口湖鄉
雲林縣 水林鄉
嘉義市 東區
嘉義市 西區
嘉義縣 太保市
嘉義縣 朴子市
嘉義縣 布袋鎮
嘉義縣 大林鎮
嘉義縣 民雄鄉
嘉義縣 溪口鄉
嘉義縣 新港鄉
嘉義縣 六腳鄉
嘉義縣 東石鄉
嘉義縣 義竹鄉
嘉義縣 鹿草鄉
嘉義縣 水上鄉
嘉義縣 中埔鄉
嘉義縣 竹崎鄉
嘉義縣 梅山鄉
嘉義縣 番路鄉
嘉義縣 大埔鄉
嘉義縣 阿里山鄉
臺南市 中西區
臺南市 東區
臺南市 南區
臺南市 北區
臺南市 安平區
臺南市 安南區
臺南市 永康區
臺南市 歸仁區
臺南市 新化區
臺南市 左鎮區
臺南市 玉井區
臺南市 楠西區
臺南市 南化區
臺南市 仁德區
臺南市 關廟區
臺南市 龍崎區
臺南市 官田區
臺南市 麻豆區
臺南市 佳里區
臺南市 西港區
臺南市 七股區
臺南市 將軍區
臺南市 學甲區
臺南市 北門區
臺南市 新營區
臺南市 後壁區
臺南市 白河區
臺南市 東山區
臺南市 六甲區
臺南市 下營區
臺南市 柳營區
臺南市 鹽水區
臺南市 善化區
臺南市 大內區
臺南市 山上區
臺南市 新市區
臺南市 安定區
高雄市 楠梓區
高雄市 左營區
高雄市 鼓山區
高雄市 三民區
高雄市 鹽埕區
高雄市 前金區
高雄市 新興區
高雄市 苓雅區
高雄市 前鎮區
高雄市 旗津區
高雄市 小港區
高雄市 鳳山區
高雄市 大寮區
高雄市 鳥松區
高雄市 林園區
高雄市 仁武區
高雄市 大樹區
高雄市 大社區
高雄市 岡山區
高雄市 路竹區
高雄市 橋頭區
高雄市 梓官區
高雄市 彌陀區
高雄市 永安區
高雄市 燕巢區
高雄市 田寮區
高雄市 阿蓮區
高雄市 茄萣區
高雄市 湖內區
高雄市 旗山區
高雄市 美濃區
高雄市 內門區
高雄市 杉林區
高雄市 甲仙區
高雄市 六龜區
高雄市 茂林區
高雄市 桃源區
高雄市 那瑪夏區
屏東縣 屏東市
屏東縣 潮州鎮
屏東縣 東港鎮
屏東縣 恆春鎮
屏東縣 萬丹鄉
屏東縣 崁頂鄉
屏東縣 新園鄉
屏東縣 林邊鄉
屏東縣 南州鄉
屏東縣 琉球鄉
屏東縣 枋寮鄉
屏東縣 枋山鄉
屏東縣 車城鄉
屏東縣 滿州鄉
屏東縣 高樹鄉
屏東縣 九如鄉
屏東縣 鹽埔鄉
屏東縣 里港鄉
屏東縣 內埔鄉
屏東縣 竹田鄉
屏東縣 長治鄉
屏東縣 麟洛鄉
屏東縣 萬巒鄉
屏東縣 新埤鄉
屏東縣 佳冬鄉
屏東縣 霧台鄉
屏東縣 泰武鄉
屏東縣 瑪家鄉
屏東縣 來義鄉
屏東縣 春日鄉
屏東縣 獅子鄉
屏東縣 牡丹鄉
屏東縣 三地門鄉
澎湖縣 馬公市
澎湖縣 湖西鄉
澎湖縣 白沙鄉
澎湖縣 西嶼鄉
澎湖縣 望安鄉
澎湖縣 七美鄉
花蓮縣 花蓮市
花蓮縣 鳳林鎮
花蓮縣 玉里鎮
花蓮縣 新城鄉
花蓮縣 吉安鄉
花蓮縣 壽豐鄉
花蓮縣 光復鄉
花蓮縣 豐濱鄉
花蓮縣 瑞穗鄉
花蓮縣 富里鄉
花蓮縣 秀林鄉
花蓮縣 萬榮鄉
花蓮縣 卓溪鄉
臺東縣 臺東市
臺東縣 成功鎮
臺東縣 關山鎮
臺東縣 長濱鄉
臺東縣 池上鄉
臺東縣 東河鄉
臺東縣 鹿野鄉
臺東縣 卑南鄉
臺東縣 大武鄉
臺東縣 綠島鄉
臺東縣 太麻里鄉
臺東縣 海端鄉
臺東縣 延平鄉
臺東縣 金峰鄉
臺東縣 達仁鄉
臺東縣 蘭嶼鄉
金門縣 金城鎮
金門縣 金湖鎮
金門縣 金沙鎮
金門縣 金寧鄉
金門縣 烈嶼鄉
金門縣 烏坵鄉
連江縣 南竿鄉
連江縣 北竿鄉
連江縣 莒光鄉
連江縣 東引鄉

2015年1月21日 星期三

[C++] JSON Library - jsoncpp @ Ubuntu 14.04, Mac OS X 10.10.1

JSON Format 現今已經是一個非常常見的溝通管道,最近常在 Ubuntu server 上練習 C++,偶爾沒網路時也會想用 Mac OS X 進行,因此,著重在如何輕鬆管理 C++ JSON Library 的用法,找了一下,大概就是 jsoncpp 啦

在 Ubuntu 14.04:

$ sudo apt-get install libjsoncpp-dev
$ g++ -I/usr/include/jsoncpp/ main.cpp -ljsoncpp


在 Mac OS X 10.10.1 搭配 MacPorts 管理:

$ sudo port install jsoncpp
$ g++ -std=c++11 -I/opt/local/include/ -L/opt/local/lib main.cpp -ljsoncpp


由於都可以透過系統常見的管理工具安裝,即可省去下載 source code 編譯等管理成本。簡易範例:

$ vim example.cpp
#include <iostream>       // std::cout
#include <string>         // std::string
#include <json/json.h>

int main() {
        std::string raw = "{\"key\":\"value\",\"我\":\"是誰\",\"array\":[\"a\",\"b\",123]}";
        Json::Reader reader;
        Json::Value value;
        std::cout << "Input: " << raw << std::endl;
        if (reader.parse(raw, value)) {
                std::cout << "parsing: " << value ;//<< std::endl;
                std::cout << "get: " << value["我"] ;//<< std::endl;
                std::string data = value["key"].asString();//toStyledString();
                std::cout << "string: [" << data << "]" << std::endl;

                // with -std=c++11
                std::cout << "---" << std::endl;
                for (auto it : value) {
                        std::cout << "elm: " << it ;//<< std::endl;
                        if (it.isArray()) {
                                for (auto it2 : it)
                                        std::cout << "array data: " << it2 ;//<< std::endl;
                        }
                }        
        }
        return 0;
}
$ g++ -I/opt/local/include/ -L/opt/local/lib main.cpp -ljsoncpp
$ ./a.out
Input: {"key":"value","我":"是誰","array":["a","b",123]}
parsing:
{
"array" : [ "a", "b", 123 ],
"key" : "value",
"我" : "是誰"
}
get: "是誰"
string: [value]
---
elm: [ "a", "b", 123 ]
array data: "a"
array data: "b"
array data: 123
elm: "value"
elm: "是誰"

2014年9月11日 星期四

iOS 開發筆記 - 透過 iTunesConnect RSS 處理 App Customer Reviews 資料

以 Facebook 而言,可以輕易得知 App ID 為 284882215,而 iTunesConnect 有提供 RSS 方式查詢 Customer Reviews:

https://itunes.apple.com/us/rss/customerreviews/id=284882215/sortBy=mostRecent/xml

其中,上述有三個主要可變動的參數:country(us), app id (284882215), format(xml)

最近比較愛 json 的:

https://itunes.apple.com/us/rss/customerreviews/id=284882215/sortBy=mostRecent/json

想要台灣區評價:

https://itunes.apple.com/tw/rss/customerreviews/id=284882215/sortBy=mostRecent/json

問題應該就是 country 到底有哪些,可以用既定資料每個都抓一遍啦。

對於格式有興趣的可以用得到可讀性較佳的資料格式:

$ curl https://itunes.apple.com/tw/rss/customerreviews/id=284882215/sortBy=mostRecent/json | python -mjson.tool

若仔細看的話,還可以看到 User ID 、追蹤到 User 對其他款 app 評價等,此外,也有 first page 跟 last page 存取方式:

https://itunes.apple.com/tw/rss/customerreviews/page=1/id=284882215/sortby=mostrecent/json
https://itunes.apple.com/tw/rss/customerreviews/page=10/id=284882215/sortby=mostrecent/json

最大頁數只有到 10 而已(CustomerReviews RSS page depth is limited to 10)

至於要用 json 還是 xml 好?目前的心得是... json 會缺少 user comment updated 資訊,而 xml 卻也會碰到 format error 的情況 Orz 只能...看著辦了 XD


以 PHP 處理為例:

$ cat test.php
<?php
$app_id = '284882215';
$country_list = array( 'tw', 'us');
$format = 'xml';
$page_list = array(1,2,3,4,5,6,7,8,9,10);
foreach( $country_list as $country ) {
        foreach( $page_list as $page ) {
                $url = "https://itunes.apple.com/$country/rss/customerreviews/id=$app_id/page=$page/$format";
                if ($format == 'json') {
                        $raw = json_decode(@file_get_contents($url), true);
                        //print_r($raw);
                        for ($i=1, $cnt=count($raw['feed']['entry']) ; $i<$cnt ; ++$i) {
                                print_r(array(
                                        'user_id' => $raw['feed']['entry'][$i]['id']['label'],
                                        'user_name' => $raw['feed']['entry'][$i]['author']['name']['label'],
                                        'user_uri' => $raw['feed']['entry'][$i]['author']['uri']['label'],
                                        'title' => $raw['feed']['entry'][$i]['title']['label'],
                                        'content' => $raw['feed']['entry'][$i]['content']['label'],
                                        'version' => $raw['feed']['entry'][$i]['im:version']['label'],
                                        'rating' => $raw['feed']['entry'][$i]['im:rating']['label'],
                                ));
                        }
                } else {
                        $raw = simplexml_load_string(@file_get_contents($url));
                        //print_r($raw);
                        for($i=1, $cnt = count($raw->entry); $i<$cnt ; ++$i) {
                                //print_r($raw->entry[$i]);
                                $imAttrs = $raw->entry[$i]->children('im', true);
                                //print_r($imAttrs);
                                print_r(array(
                                        'date' => (string)$raw->entry[$i]->updated,
                                        'user_id' => (string)$raw->entry[$i]->id,
                                        'user_name' => (string)$raw->entry[$i]->author->name,
                                        'user_uri' => (string)$raw->entry[$i]->author->uri,
                                        'title' => (string)$raw->entry[$i]->title,
                                        'content' => (string)$raw->entry[$i]->content[0],
                                        'version' => (string)$imAttrs->version,
                                        'rate' => (string)$imAttrs->rating,
                                ));
                        }
                }
                exit;
        }
}

$ php test.php
Array
(
    [date] => 2014-09-10T09:10:00-07:00
    [user_id] => ###########
    [user_name] => ###########
    [user_uri] => https://itunes.apple.com/tw/reviews/id###########
    [title] => 有Bug請改善
    [content] => 點朋友的動態跑不出來!!
    [version] => 14.0
    [rating] => 1
)
Array
(
    [date] => 2014-09-10T09:03:00-07:00
    [user_id] => ###########
    [user_name] => ###########
    [user_uri] => https://itunes.apple.com/tw/reviews/id###########
    [title] => 一直自動關掉
    [content] => 用一用會一直自動跳掉,很頻繁,很煩。
    [version] => 14.0
    [rating] => 1

)

2014年8月28日 星期四

[Python] Google App Engines 發送 POST 與 JSON-RPC

初始資料:

url = 'http://server/cgi'
data = {
"arg1" : "val1",
"arg2" : "val2"
}


發送 POST:

import urllib
from google.appengine.api import urlfetch
post_data = urllib.urlencode(data)
response = urlfetch.fetch(url=url,payload=post_data,method=urlfetch.POST,headers={'Content-Type': 'application/x-www-form-urlencoded'})


發送 JSONRPC:

import urllib2
headers = {
"Content-Type": "application/json"
}
post_data = json.dumps(data)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req).read()

2014年5月16日 星期五

[PHP] 簡易的 Web Service Unit Test: HTML validator、JSON Format @ Ubuntu 14.04

把 web service 移到 AWS 上後,想到時時刻刻都人工測試感到很 Orz 於是想了一些簡易 Unit Test 方式:
  • 檢驗網頁是否可讀取正常 (strlen)
  • 檢驗網頁 HTML 格式 (tidy 或 xmllint)
  • 檢驗網頁上的 link 個數 (preg_match_all)
  • 檢驗 JSON 格式 (json_decode && json_last_error)
剩下的就...再看看 XD

其他筆記:changyy / web-service-unit-test / phpunit / web-service-unit-test.php