經過幾間不同的公司,三節獎金和禮品也都不盡相同,想了想還是電影票比較實在。
電影票過期補差價還是可以繼續使用,如果沒在看電影,票券轉賣也比較容易。
但是收到米袋就有點 ….
軟體開發、伺服器和生活瑣事
經過幾間不同的公司,三節獎金和禮品也都不盡相同,想了想還是電影票比較實在。
電影票過期補差價還是可以繼續使用,如果沒在看電影,票券轉賣也比較容易。
但是收到米袋就有點 ….
以前一直以為是自己買的 MicroSD 卡不夠強,所以讀取、寫入都很慢,經過幾個朋友一起測試以後,才知道其實瓶頸根本不是在記憶卡,而是手機內建的硬體支援有些原本就很低。
以下的結果均是使用 A1 SD Bench 測試以後的結果,先來貼一下我自己正在使用的 Sony 系列測試。
我這邊只有一個朋友是用 Samsung,所以只有一個測試結果。
所以從上面的幾個廠牌看起來,HTC 是把硬體規格衝到最高的,Sony 感覺就是在 cost down,吃相實在不是很好看。
歡迎網友將自己的測試結果截圖傳給我,我再來依照廠牌和型號幫大家建立列表。
最近在研究如何把 log 塞到 Cassandra 中,使用的 Datastax 的 php-driver 輕鬆很多,但還是有一些需要留意的地方,免得莫名其妙鬼打牆。
這邊先假設我要記錄一個使用者上傳檔案的記錄,包含 ID、檔案名稱、檔案大小以及上傳日期,建立了一個 table:
CREATE TABLE hermes_log.file (
id uuid,
name text,
size decimal,
create_time timestamp,
PRIMARY KEY (id, name, size, create_time)
)
這個時候使用 PHP 塞資料進入,直接建立 CQL 且不使用 prepare/binding,可以成功執行 insertion:
<?php
$cluster = Cassandra::cluster()->build();
$session = $cluster->connect();
$cql = "
insert into hermes_log.file
(
id,
name,
size,
create_time
) values (
uuid(),
'gavatar.jpg',
123.4,
'2017-01-01 10:30:45.678'
)
";
$session->execute($cql);
cqlsh 看一下資料格式:
cqlsh:zero_test> select name, size, create_time from file;
name | size | create_time
-------------+-------+---------------------------------
gavatar.jpg | 123.4 | 2017-01-01 02:30:45.678000+0000
(1 rows)
除了日期會自動轉為 UTC+00:00 以外其他都沒什麼太大的問題。
接下來把 PHP 改為 prepare/bind 格式:
$cql = "
insert into hermes_log.file
(
id,
name,
size,
create_time
) values (
uuid(),
?,
?,
?
)
";
$session->execute($cql, [
'gavatar.jpg',
123.4,
'2017-01-01 10:30:45.678'
]);
執行的時候你會看到錯誤訊:「Uncaught CassandraExceptionInvalidQueryException: Invalid amount of bind variables in your.php」,意思是找不到可以 binding 的資料。仔細去翻文件才會注意到 binding 的資料,不是直接放進 array 就好,而是要放在 key「arguments」底下,所以至卻的寫法應該是:
$session->execute($cql, [
'arguments' => [
'gavatar.jpg',
123.4,
'2017-01-01 10:30:45.678'
],
]);
再次執行後,錯誤訊息不一樣了「Uncaught CassandraExceptionInvalidQueryException: Expected 8 or 0 byte long for date (23) ….」,看起來 create_time 這邊沒辦法使用字串來代表新增日期。
如果你有注意到 Cassandra 是使用 Java 實作的,應該不難理解 PHP 和 Java 的資料型態差異很大,因此 DataStax 的 php-driver library 為了讓資料傳遞時不會發生問題,寫了不少 adapter 來解決資料型態的相容問題,像是 CassandraTimestamp、CassandraDecimal 等,這些類別可以在文件中的 Cassandra namespace 中找到。
所以按照規格改好以後,應該會是下面這樣:
$createTime = microtime(true);
list($sec, $ms) = explode('.', $createTime);
$sec = intval($sec);
$ms = intval(($createTime - $sec) * 1000000); // 毫秒取六位數
$session->execute($cql, [
'arguments' => [
'gavatar.jpg',
new CassandraDecimal(strval(123.4)),
new CassandraTimestamp($sec, $ms),
],
]);
先講一下故障情況:
總之,整體服務讓我感到蠻貼心的。
看到一篇「Why Apache Benchmark Is Not Enough」,這邊提到 Apache Benchmark (以下簡稱 ab) 由於都固定戳同一個 URL,這個情況下有很大的機會讓 HTTP server 或是 DB 用到相同的資並 cache 起來。
這樣子其實 ab 計算出來的 request per second 等數據,就失去了參考價值。
若要模擬真實的情境,像是「使用者看到圖片以後點擊連結開啟令一個網頁」,可以考慮使用 Apache jMeter 來建立不同的網頁 request 流程、隨意點擊,讓測試時更像真人在瀏覽網頁。