2022年5月7日 星期六

Crypto Metal VISA Cards 與 Spotify Premium Family Plan

圖:Crypto.com 官網截圖 @ 2022-05-07

申請幾個月了,一直偷懶沒寫來筆記 XD 當初在 2021 年底觀望了 Crypto 信用卡,想說來了解這個行業,算了一下風險來試試看吧!

接著則是使用 Spotify - Premium Family Plan 再辦理優惠 cc 看了一下網路上常簡介的方式,共有兩種:

  1. 透過新加坡 VPN,接著將到 Spotify 官網切換國家地區至新加坡,並且使用 Crypto.com Metal VISA Card 來支付
  2. 先綁定一張台灣的信用卡支付(或是體驗方案)Premium Family 方案,接著再設法換信用卡到 Metal VISA Card

因為我本身早就有在用 Spotify 付費了,直接升級到 Premium Family Plan ,Spotify 佛心地說,等到下次支付週期才收 Premium Family Plan 費用。這時的我,就是使用 Spotify 台灣,便利的邀請家人加入方案。

下一刻,則是要更換 Metal VISA CARD,其實輸入卡號綁定都會顯示失敗 XD 最後忘記是不是把網址改成 hk 去綁定才搞定的,還是我也自行換成新加坡地區?比較特別的是我一直維持在 Spotify Taiwan,但經歷過第一次 Crypto Metal VISA Card 支付後,Spotify 顯示的國家地區就真的被切換到新加坡了。

當 Spotify 顯示的國家變成新加坡時,不方便的地方有兩個:

  • 那些初次使用 Spotify 的人,通常習慣聽台灣相關的歌曲的,這時只能在慢慢 "養" 一下帳號,像是聽聽 "前 50 名 - 臺灣" 來練練資料庫,而原先已經用一陣子的,推論就不太會有什麼感覺
  • 當管理者想要添加對方加入到 Spotify Premium Family Plan 時,就必須要求對方國家更改到新加坡才行

至於刷 Metal VISA Card 的部分,約莫一小時內,會看到以 Crypto.com 的平台幣 CRO 回饋進帳,我的習慣就是立馬再轉成 USDC (甚至在匯入到 Metal VISA CARD 的 GSD 儲值)。

由於 Crypto - Metal VISA Card 是 Debit Card 機制,是必須裡頭有錢才可以刷的。這時就得看自己打算怎樣規劃,因為 Crypto.com 有提供新戶初次匯款的優惠(30天內免手續費),我是規劃了一筆 USDC 鎖幣,可以有小額的利息費,做一些應用調整(若匯差轉換的損失等),現況純粹拿來研究小東西,不會是我的主力刷卡用途。

有興趣的需要多多了解一下未來要付卡費時,想走的流程。例如用其他信用卡在 Crypto.com 刷虛擬幣 (被收信用卡國外手續費+Crypto.com 平台手續費) -> 用虛擬幣轉法幣 GSD (Crypto.com 交易手續費) -> 完成 Metal VISA Card 儲值。而大部分好像是推薦匯款到 USDC 指定帳戶,可能是最優惠的路線。

目前是 2022-05-07 ,順勢聊一下 Crypto.com 的平台幣 CRO 的價格變化:


從圖大概可以了解,從 2021-11-23 至今 2022-05-07 已經打折再打折 XD 而我是在 2022 年三月去使用的。因為辦 Metal VISA Card 需要質押對應數量的 CRO 平台幣,等於把一筆錢押在裡頭的。這筆錢若用 Spotify Premium Family Plan 來支付的話,大概兩年可以回收的,所以風險低不少(當然,莫忘 Crypto.com 修改福利又是另一個風險)。此外,最近 FED 已宣佈不少資訊(升息、QE退場縮表),通常 2017 年經歷過幣圈的都會很抖,不知平台幣的變化會多少,例如近一個月 CRO 從 0.45 跌到 0.27 了,快打對折了 XD 只能說穩穩有 Spotify Premium Family Plan 回饋,其實就不太擔心(?)


此外,這幾天 Crypto.com 頻頻動作,像發了數封 EDM 邀請大戶們不要賣幣以及提信用卡優惠(?),說真的也是穩定幣價的不二法門。相信之後還得面對正式的縮表,以及以太坊2.0升級 XD 

圖:2022-05-06 EDM

圖:2022-05-03 EDM

當初我看到他的商業模式小試身手:
  • 質押CRO享受信用卡回饋
  • 質押CRO等同有穩定自家幣價
最後證明,事實上波動仍是很大的 XD 此外,有高手是採用放空 CRO 平台幣的方式來故意讓 CRO 變成穩定幣,這就得各自評估風險了

最後再聊一下關於 "鎖幣賺利息",目前最長是三個月為一期。而年利率有 6% 不等,有興趣可以用穩定幣 USDC / USDT 體驗看看。而這個 % 變化主要還是來自於虛擬幣交易市場的供需問題,當前景大好時,很多人會借錢買幣(當沖?),這時借貸活動踴躍時,這個利息 % 就會變高,據說 2021 極為活躍時,可以來到年利率 15% 以上的水準(有的交易所為了吸引人,就是提高這%數,這時也得擔心該交易所穩不穩,會不會倒),因此鎖幣賺利息的來源,也是市場供需的。

圖:Crypto app 內的鎖幣賺利息 USDC 的年利率


2022年3月3日 星期四

[開箱] TOTO TCF6601T 更換控制器面板 - TCM1485-3R#M (操作IC)

TOTO TCF6601T - 控制IC - TCM1485-3R#M

室友很愛乾淨,常常會清理 TOTO 溫水洗淨便座 ,我忘了是哪次開始?可能面板不小心沖到水,導致按鈕部分失效,原先等幾天就可以正常,殊不知這次就活不過來了 XD 我連免治馬桶該怎樣從馬桶拆下來都不知道,就這一次為了處理才學會。

一開始看看 mobile01 討論區在講怎樣拆東西,接著發現控制器那邊極難拆,就又偷懶。過了幾天想說還是認真一下,就幾乎會破壞殼的方式拆除。卡榫處已經不美麗了。上一次在拆背板時,其實已經有把便座倒過來,且發現有黃色的水滴了下來,很怪異。這次拆掉控制器就清楚了,那邊早就潮濕損壞,黃色的污漬是電路板導致的。

拆的方式也不難,沒有對應的工具就是要暴力破壞,用一隻一字工具暴力解。反正便座也用了很多年,拆壞就真的換掉了。

隨後查了一下型號,發現 TOTO 官網有在賣 控制IC,一個也才賣 900元而已,想說就可以嘗試一下自行更換。電話詢問官網上的台北門市時,請問是否可以有貨可當場買,講到最後好像沒那麼想幫訂貨,直接推說去問官網客服。接著,就留言寫信給客服後,客服回說找附近的門市訂購,如此就兩三天過去。這次換找一下新北門市,沒想到開頭也是去問客服,一整個陷入迴圈是妮。我大概能體會,畢竟幫訂貨是沒法賺到什麼吧 :P 最後敲定先付款才能訂貨,緊接著就是先匯款過去,約一個禮拜後就收到領貨通知了,而人與人的互動還是當面來得好,閒聊了一下沒啥人在訂零件的 XD 還提醒拆的時候要小心,果真該交給專業人才對。

流水帳:





2022年2月28日 星期一

[開箱] Google Pixel Buds A-Series

心癢了買了一個新藍牙耳機 XD 一開始是看到 Google TW 在蝦皮的特價活動,隨手查了一下,原價 3290 元,在非 Google 官方的賣場大型網購平台可以 2500 左右購得(有些低方還低到 2200左右),就買啦!原本就一直想買一款當備品。

大概去年被朋友推坑買了 魔浪mifo O7 藍牙耳機,用起來都還滿方便的,特別是體積小這件事,很隨身攜帶。唯一的困擾是個人不小心按久按耳機會觸動 Siri (像是拿下來跟人對話,不小心就久按到),然後在 Siri 模式下,最常就是播打電話出去!雖然一年不會觸動個 3~5 次,但啟動還是很擾人。

這次體驗 Google Pixel Buds A-Series + iOS 手機,整體上無法把 Google 耳機的強項整合一起(Google Now) ,倒反而讓我覺得很不錯,整體上就是無線耳機+按一下暫停/播放等模式,也不怕喚起 Siri ... XD 此外,購買之前就看到一些評價說容易聽到環境音(有點像先天故意設計?),我反而滿愛這種像耳掛式耳機的感受,因為我最常聽 Podcast 等類,不需要極安靜環境,反而最怕跟環境完全隔離。

只能說,此時的我,對大家給他的負評價都剛好很能接受(甚至變成我喜愛的點),若真的要說缺點的話,大概是 iOS 搭配使用 Google Pixel Buds A-Series 時,不能靠觸碰耳機調整聲音大小,查手冊才發現是要靠音控控制。

2022年2月15日 星期二

[PHP] 使用 Built-in web server 和 Router Script 開發嵌入式產品的網頁介面

話說幾年前也寫過一篇筆記 [PHP] 使用 PHP built-in web server 及 PHP CodeIgniter framework 。現在則是使用的場景不同了,在筆記一下使用的情境。

不少嵌入式產品的 UI 是採用 Web 實作的,近幾年則是趨向於 App UI 。然而開發 embedded linux 產品時,其 Web UI 也是打包到 embedded linux 裡頭,這時要開發測時,就滿不方便。若只是單純改改裡頭 js code 則可以免強靠 Browser 做 JS Inject 來達成。

目前協助擴展嵌入式產品的 Web UI 維護團隊,過去曾嘗試把裡頭的 Web UI 使用 Vue.js 跟 webpack 打包機制,弄出個 webpack 自起 Web Server 並透過 devServer.proxy 把 CGI request 導向到實體 device ip。目前因為沒有啟用 Vue.js 所以也沒啟用 webpack 等機制,暫時就先用簡單的 PHP 內置Web Server 機制

$ php -S localhost:8000 -t PATH_DOCUMENT_ROOT

然而,在 fw build code 流程中,可能會有多處檔案搬移的設計,以 Web 來說,大概可以硬搞成 /js/main.js 其實擺在 /tmp/path1/js 中,而 /css/main.css 擺在 /tmp/path2/css 等等,這時就要靠 使用路由(Router)脚本 來處理

$ cat routing.php
<?php

$URL_PATH = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

if (!strncmp($URL_PATH, '/js/', 4)) {
$file_path = '/tmp/path1/js' . $URL_PATH;
if (file_exists($file_path)) {
echo file_get_contents($file_path);
return true;
}
}

if (!strncmp($URL_PATH, '/css/', 4)) {
$file_path = '/tmp/path2/css' . $URL_PATH;
if (file_exists($file_path)) {
echo file_get_contents($file_path);
return true;
}
}
return false;

使用:

$ php -S localhost:8000 -t /tmp routing.php

如此,若有一包 fw code 時,可透過 routing 機制指定某些檔案要從哪裡取得(例如需要 patch 的檔案等),因而避開 build code 後才能測試,便方便許多。另外,還須多補寫一下 /cgi-bin/ 的部分,在把 request 改發到對應的裝置上,如此在面對不需改動 CGI 問題時,可以輕鬆測試 Web UI。

另外,該 routing.php 也可以很結構化:

$ cat routing.php
<?php

function log_info($message) {
$stderr = fopen('php://stderr', 'w');
fprintf($stderr, '=> '.$message."\n");
fclose($stderr);
}
function tree_files( $input_file ) {
if (!file_exists($input_file))
return array();

if (is_dir($input_file)) {
$output = array();
if ($handle = opendir($input_file)) {
while (false !== ($file = readdir($handle))) {
if ($file == '.' || $file == '..')
continue;
$path = $input_file . '/' . $file;
if (!file_exists($path))
continue;
if (is_dir($path)) {
$sub_output = tree_files( $path );
foreach($sub_output as $f) {
array_push($output, $f);
}
} else {
array_push($output, $path);
}
}
closedir($handle);
}
return $output;
}
return array( $input_file );
}
$request_handler = array(
'routing' => array(
'file' => array(
'/index.html' => '/tmp/study/haha.html',
'/world.html' => '/tmp/study/hello/',
),
'dir' => array(
'/js/' => '/tmp/study',
'/css/' => '/tmp/study',
),
),
'content_type' => array(
'html' => 'text/html',
'htm' => 'text/html',
'css' => 'text/css',
'js' => 'text/javascript',
'svg' => 'image/svg+xml',
),
);

$URL_PATH = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path_parts = pathinfo($URL_PATH);

log_info('routing-init, URL_PATH:['.$URL_PATH.'], REQUEST_URI:['.$_SERVER['REQUEST_URI'].']');
log_info('in routing-file mode');
foreach($request_handler['routing']['file'] as $pattern => $target ) {
if (!strncmp($URL_PATH, $pattern, strlen($pattern))) {
log_info('in routing-file mode: match pattern: ['.$pattern.'], target: ['.$target.']');
$path = is_dir($target) ? $target . $URL_PATH : $target;
if (file_exists($path)) {
$path_parts = pathinfo($URL_PATH);
$content_type = isset($request_handler['content_type'][$path_parts['extension']]) ? $request_handler['content_type'][$path_parts['extension']]: mime_content_type($path);

header('Content-Type: ' . $content_type);
$size = filesize($path);
header('Content-Length: '.$size);
echo file_get_contents($path);
log_info('routing-file, response: content-type:['.$content_type.'], content-length:['.$size.'], path:['.$path.']');
return true;
}
}
}
log_info('in routing-dir mode');
foreach($request_handler['routing']['dir'] as $pattern => $target ) {
if (!strncmp($URL_PATH, $pattern, strlen($pattern))) {
log_info('in routing-dir mode: match pattern: ['.$pattern.'], target: ['.$target.']');
$path = $target.$URL_PATH;
if (file_exists($path)) {
$path_parts = pathinfo($URL_PATH);
$content_type = isset($request_handler['content_type'][$path_parts['extension']]) ? $request_handler['content_type'][$path_parts['extension']]: mime_content_type($path);

header('Content-Type: ' . $content_type);
$size = filesize($path);
header('Content-Length: '.$size);
echo file_get_contents($path);
log_info('routing-dir, response: content-type:['.$content_type.'], content-length:['.$size.'], path:['.$path.']');
return true;
}
}
}

return false;

如此一來,在 /tmp/study 又建立一個檔案結構:

% tree /tmp/study 
/tmp/study
├── css
│   └── main.css
├── haha.html
├── hello
│   └── world.html
└── js
    └── main.js

3 directories, 4 files

使用 php -S localhost:8000 routing.php 時,就會一些目錄切換的對應機制。

2022年2月9日 星期三

[開箱] UVC Video Capture Card / 視頻采集卡 / 影像擷取卡 - HAGiBiS


繼上次買了不到500元的 UVC Video Capture Card 測試 小米4K 電視棒,這次換價格高一點的 Hagibis 海備思 Type-C 影像擷取卡,他多了 Type-C 跟 USB-A 轉接頭,使用上應當會方便不少。看了下核心的硬體規格,都是輸出最高是 1080p 30Hz 的影像格式。

實際測試 Chromecast 2018 版,使用 VLC 或 QuickTime Player 的確也正常可以取得,雖然我覺得這件事應該算異常?三年前試過圓剛 4500 元左右(現在跌到不用1500元)等級的影像擷取盒,則是會阻擋下來:Chromecast 與 AVerMedia ExtremeCap UVC BU110


看來小廠的 UVC Video Capture Card 可能在 DRM 放行?!此例用 NETFLIX 當作例子。雖說用 Browser 看 NETFLIX 本來也有類似螢幕錄影的機制,這時只能感謝 macOS / Safari 在 DRM 這塊做得很出色,連截圖都是黑壓壓的。

由於工作上要處理很多帶有 HDMI 的設備,未來就靠這 UVC 影像擷取卡來幫忙省螢幕,還可以搭配 Python OpenCV 做影像處理,像是自動化設備測試、影像分析服務等等。