Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: 資訊學習

使用 VCS 時程式中不應該出現的東西

Posted on 2017 年 10 月 3 日2021 年 3 月 12 日 By 日落 在〈使用 VCS 時程式中不應該出現的東西〉中尚無留言

這件事情應該要從 FreeBSD 6 左右的 make build world && make install world 開始說起。每次 build world 以後,新版的 tool chain 設定檔可能都會有小部份的更新,可能是多幾個功能可以設定,或是把一些舊的功能拔掉,這時 install world 時為了擔心使用者改過的 config 檔直接被覆蓋掉,都會先做一次 diff 讓使用者確定設定檔更新以後不後搞垮系統。但有半數以上的 diff,均為 config 中開發人員的註解,像是「2005/xx/xx 最後更新」之類的,單單處理這類的 diff 就可以耗掉數十分鐘。

現在大家在寫程式時,應該都有習慣將 source code 放進 version control system (VCS) 中,方便做版本管理以及除錯。VCS 除了能夠協助開發者幫不同的修改留下記錄以外,也支援版本之間的比較、建立補丁 (patch) 等功能,讓開發者可以專心在功能的開發上。

既然 VCS 已經協助開發者記錄了這麼多東西,那有哪些是開發者已經不需要寫在 source code 裡面的呢?

  • 日期:大多數的 VCS 在開發者 commit 時就會記錄日期,開發者有修改時不必特別在程式中註解修改日期,只要 commit 時將 commit message 寫好讓其他人看得到、搜尋的到即可。
  • 作者:每個開發人員在 VCS 都會被視為不同的 commitor,所以哪個 commit 是誰送、甚至哪一行是誰修改的都有記錄。把修改原因寫清楚比較重要。
  • 註解掉不使用的程式碼:因為 VCS 會保留從古到今所有的程式碼異動,所以大可不用擔心程式碼刪除以後無法還原,若發現某一段程式已經不再使用了,就放心的把他刪掉吧,萬一誤砍了還是可以透過 VCS 復原回來。(如果 VCS 做不到這個功能就換一個吧 XD)
  • 與專案無關的 binary:大多數 icons、font、design files 都會與專案的版本一起演進,放進 VCS 是應該的。但與專案週期不同、或為一次性用途的 binary 檔案,如週年慶的活動圖片設計、影片等,就不適合放進 VCS,若真的有版本管理需要,應該另外開一個 repository。
  • symbolic link:恩 …. 有事嗎?
Tags:生活雜記, 資訊學習

各家手機的 I/O 性能測試

Posted on 2017 年 9 月 26 日2021 年 3 月 12 日 By 日落 在〈各家手機的 I/O 性能測試〉中尚無留言

以前一直以為是自己買的 MicroSD 卡不夠強,所以讀取、寫入都很慢,經過幾個朋友一起測試以後,才知道其實瓶頸根本不是在記憶卡,而是手機內建的硬體支援有些原本就很低。

以下的結果均是使用 A1 SD Bench 測試以後的結果,先來貼一下我自己正在使用的 Sony 系列測試。

Sony

Sony Xperia XZ:SD 卡的寫入速度只有 30 MB/s,不是你的 SD 卡不夠好

Sony Xperia Z5:原來之前更慘
Sony Xperia Z5P

HTC

HTC M8
HTC 10
HTC U11

Samsung

我這邊只有一個朋友是用 Samsung,所以只有一個測試結果。

Samsung Galaxy S7 Edge

所以從上面的幾個廠牌看起來,HTC 是把硬體規格衝到最高的,Sony 感覺就是在 cost down,吃相實在不是很好看。

歡迎網友將自己的測試結果截圖傳給我,我再來依照廠牌和型號幫大家建立列表。

Tags:分享, 資訊學習

使用 datastax/php-driver 對 Cassandra 做 query 需要留意的地方

Posted on 2017 年 9 月 12 日2021 年 3 月 12 日 By 日落 在〈使用 datastax/php-driver 對 Cassandra 做 query 需要留意的地方〉中尚無留言

最近在研究如何把 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),
    ],
]);
Tags:Cassandra, PHP, 資訊學習

用 Apache Bench (ab) 可能無法模擬高負載的網站實際情況

Posted on 2017 年 9 月 5 日2021 年 3 月 12 日 By 日落 在〈用 Apache Bench (ab) 可能無法模擬高負載的網站實際情況〉中尚無留言

看到一篇「Why Apache Benchmark Is Not Enough」,這邊提到 Apache Benchmark (以下簡稱 ab) 由於都固定戳同一個 URL,這個情況下有很大的機會讓 HTTP server 或是 DB 用到相同的資並 cache 起來。

這樣子其實 ab 計算出來的 request per second 等數據,就失去了參考價值。

若要模擬真實的情境,像是「使用者看到圖片以後點擊連結開啟令一個網頁」,可以考慮使用 Apache jMeter 來建立不同的網頁 request 流程、隨意點擊,讓測試時更像真人在瀏覽網頁。

Tags:網路架站, 資訊學習

使用 Linux rsyslog 儲存 ASUS Wifi 分享器的 log

Posted on 2017 年 9 月 4 日2021 年 3 月 12 日 By 日落 在〈使用 Linux rsyslog 儲存 ASUS Wifi 分享器的 log〉中尚無留言

因為一些原因,需要保留極度完整的 log,所以研究怎麼把 Wifi AP (router) 的記錄全部倒進 linux  的 rsyslog。

先修改 /etc/rsyslog.conf 裡面的幾個項目:

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

把「ModLoad」、「UDPServerRun」、「InputTCPServerRun」的註解拿掉,這樣 rsyslog 就會使用 TCP 和 UDP listen port 514。當然在啟動之前要記得先去把防火強的設定弄好。

接下來重新啟動 rsyslog:

$ sudo service rsyslog

啟動完成沒有看到什麼錯誤訊息,表示已經開始運作了。接著「tail -f /var/log/syslog」應該就會看到 remote server 的資料。


但不同機器的訊息方在相同的檔案上實在很難追蹤,所以再多做一個設定,將不同機器傳過來的資料分開存放在不同的檔案。這類的設定檔會放在「/etc/rsyslog.d」,眼尖的話應該已經注意到 ufw、postfix 等服務已經有建立自己的設定了,我們參考著做即可。

假設今天 Wifi AP 的 IP 是「192.168.0.1」,而負責存放所有 log 的 loghost IP 為「192.168.0.101」,設定可以這樣寫:

if $fromhost-ip startswith '192.168.0.1' then /var/log/wifi.log
& ~

這樣 rsyslog 只要遇到從 192.168.0.1 傳過來的資料,就一律丟到「/var/log/wifi.log」。

我自己的 log 比較複雜一些,除了把防火牆以外,還有 kernel 的 log 分開成二個不同的檔案:

if $fromhost-ip startswith '192.168.0.1' and not ($msg contains 'DROP IN') then /var/log/ac3100.log
& ~

if $fromhost-ip startswith '192.168.0.1' and ($msg contains 'DROP IN') then /var/log/ac3100-fw.log
& ~


網路上大部分的資料,都是教別人怎麼把 log 往別台機器丟,只有比較少一部份是處理別台機器的 log,這邊留下一些參考文件:

  • 認識與分析登錄檔 – vbird
  • Filter Conditions — rsyslog 8.29.0 documentation
  • rsyslog: log message from remote host to specific file
  • rsyslog: log message from remote host to specific file – Ask Ubuntu
Tags:Linux, SA, 資訊學習

文章分頁

上一頁 1 ... 5 6 7 ... 53 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.