2021年5月9日 星期日

[韓劇] 認識的妻子

前幾天想說好久沒用愛奇藝,上去逛了一下,想說看一下「消失的情人節」,結果幾分鐘被朋友提醒可以去 NETFLIX 看高畫質 XD 就這樣又遠離了愛奇藝。倒是在 NETFLIX 看完後,又被推薦服務推坑「認識的妻子」,主因是去年底看過韓劇「Start-Up」,內裡的另一位反派恰好也在這齣戲裡演出。

這是一部 2018 年初的韓劇。這故事跟那時很夯的穿越劇有點關係,但真正吸引到我的,卻是第一集描述雙薪家庭養小孩的困境,真的養了小孩更有感的,感受到劇情安排的那種生活壓力。

不知是不是年紀過 35 的關係,對於大叔熟女演的戲都特別有興趣看完 XD 就這樣花個一天追了 12 集,完食!隨後逛了一下男女主角的 IG ,才發現現實的靜態的照片反而吸引不了我,看來還是劇情關係,讓人喜歡笑起來古靈精怪的女主角,且我不太愛學生時代的裝扮,反而是 OL 時期的精明搭配特有的笑容令人印象深刻。

此時會觀看這齣戲也滿有緣分的,像是幾天前聽股癌 Podcast 回憶起在軍中看了 about time ,讓我回想起對時間的印象,像是電影裡提到小孩出生後,就不適合回到過去,避免改變到未來的小孩狀態。接著恰逢表弟的第一個小孩來到世上,為了體貼老婆,包括月子中心住滿30天、放棄親餵等規劃,著實已把生活的目標跟品質都規劃好也定位好,以及另一位年收稅率達 20% 級距的網路名人在哀哀叫初乳擠得多痛苦和 20% 後就沒了眾多社會福利,政府這稅務規劃到底是助生還阻生 XD

總總點滴,都讓人好好回憶著家庭、小孩、婆媳、雙薪、工作的天秤究竟要怎樣平衡著,就這樣一口氣就看完了這戲!

2021年4月22日 星期四

[PHP] 下載 Maxmind GeoIP Legacy Databases 和 ngx_http_geoip_module 相關處理 @ macOS 11.2, PHP 7.3.24

由於 Maxmind 在推 GeoIP2 ,不開放 .dat 的 GeoIP DB 了,以前下載位置:

  • http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  • http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
現在官方都說要改用 GeoLite2 DB ,其格式:
  • GeoIP2 Binary (.mmdb)
  • GeoIP2 CSV 
目前先偷懶不處理 nginx ,因為 nginx 採用 GeoIP Legacy Databases。

有找到一個網站 https://www.miyuru.lk/geoiplegacy,從中下載:
連續動作:

% php -v
WARNING: PHP is not recommended
PHP is included in macOS for compatibility with legacy software.
Future versions of macOS will not include PHP.
PHP 7.3.24-(to be removed in future macOS) (cli) (built: Dec 21 2020 21:33:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies

% php composer.phar require geoip/geoip:~1.16

% wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind4.dat.gz
% gunzip -d maxmind4.dat.gz

% cat test-ip-via-geoip.php
<?php
require 'vendor/autoload.php';
$gi = geoip_open("maxmind4.dat",GEOIP_STANDARD);
$country = geoip_country_code_by_addr($gi, $argv[1]);
echo "lookup [".$argv[1]."], result: [$country]\n";

% php test-ip-via-geoip.php 8.8.8.8
lookup [8.8.8.8], result: [US]

% nslookup tw.yahoo.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
tw.yahoo.com canonical name = atsv2-fp-shed.wg1.b.yahoo.com.
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.201
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.202

% php test-ip-via-geoip.php 180.222.102.202
lookup [180.222.102.202], result: [IN]

% curl ipinfo.io/180.222.102.202
{
  "ip": "180.222.102.202",
  "hostname": "media-router-fp74.prod.media.vip.tp2.yahoo.com",
  "city": "Taoyuan City",
  "region": "Taiwan",
  "country": "TW",
  "loc": "24.9937,121.2970",
  "org": "AS24506 YAHOO! TAIWAN",
  "timezone": "Asia/Taipei",
  "readme": "https://ipinfo.io/missingauth"
}

% nslookup facebook.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: facebook.com
Address: 31.13.87.36

% curl ipinfo.io/31.13.87.36
{
  "ip": "31.13.87.36",
  "hostname": "edge-star-mini-shv-01-tpe1.facebook.com",
  "city": "Hong Kong",
  "region": "Central and Western",
  "country": "HK",
  "loc": "22.2783,114.1747",
  "org": "AS32934 Facebook, Inc.",
  "timezone": "Asia/Hong_Kong",
  "readme": "https://ipinfo.io/missingauth"
}

% nslookup www.gov.tw
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: www.gov.tw
Address: 223.200.155.55

% php test-ip-via-geoip.php 223.200.155.55
lookup [223.200.155.55], result: [TW]

% curl ipinfo.io/223.200.155.55
{
  "ip": "223.200.155.55",
  "hostname": "223-200-155-55.hinet-ip.hinet.net",
  "city": "Hualien City",
  "region": "Taiwan",
  "country": "TW",
  "loc": "23.9769,121.6044",
  "org": "AS4782 Data Communication Business Group",
  "timezone": "Asia/Taipei",
  "readme": "https://ipinfo.io/missingauth"
}

2021年4月9日 星期五

[PHP] 透過 Maxmind GeoIP DB 統計用戶資訊 @ macOS 11.2, PHP 7.3.24

真是超級久沒用 maxmind.com 的 GeoIP DB 了,一時之間還以為沒有免費使用的方式,追了一下是要註冊帳號才能下載,而 maxmind 也有提供自動化每天更新 GeoIP DB 的機制。

在此對一份類似 Access Logs 做分析,將其轉成 CSV 格式來分析,其中 CSV 裡頭有 id 跟 remote_ip 兩個欄位,將 remote_ip 分析完後直接歸類屬於哪個 country_code,程式碼很簡單:

% php -v

WARNING: PHP is not recommended
PHP is included in macOS for compatibility with legacy software.
Future versions of macOS will not include PHP.
PHP 7.3.24-(to be removed in future macOS) (cli) (built: Dec 21 2020 21:33:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies

% cat composer.json
{
  "require": {
    "geoip2/geoip2": "~2.0"
  }
}

% php composer.phar install
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 4 installs, 0 updates, 0 removals
- Locking composer/ca-bundle (1.2.9)
- Locking geoip2/geoip2 (v2.11.0)
- Locking maxmind-db/reader (v1.10.0)
- Locking maxmind/web-service-common (v0.8.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals
- Installing composer/ca-bundle (1.2.9): Extracting archive
- Installing maxmind/web-service-common (v0.8.1): Extracting archive
- Installing maxmind-db/reader (v1.10.0): Extracting archive
- Installing geoip2/geoip2 (v2.11.0): Extracting archive
2 package suggestions were added by new dependencies, use `composer suggest` to see details.

Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

% cat job.php
<?php

require 'vendor/autoload.php';

// https://github.com/maxmind/GeoIP2-php
use GeoIp2\Database\Reader;
$reader = new Reader('GeoLite2-City.mmdb');

// https://www.php.net/manual/en/function.fgetcsv.php
$row = 1;
$header_row = NULL;
$header = array();
$country_group = array(); 
$lookup = array();

$tracking_time_cost_per_run = microtime(true);
echo "[".date("Y-m-d H:i:s")."]\tinit\n";
if (($handle = fopen("access_log.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 10240, ",")) !== FALSE) {
if (is_null($header_row)) {
$header_row = $data;
foreach($header_row as $index => $name) {
$header[$name] = $index;
}
continue;
}
$remote_ip = $data[ $header['remote_ip'] ];
$data_id = $data[ $header['id'] ];

try {
$record = $reader->city($remote_ip);
} catch (Exception $e) {
continue;
}
if (!is_null($record) && property_exists($record, 'country') && !is_null($record->country) && isset($record->country->isoCode)) {
if (!isset($country_group[$record->country->isoCode]))
$country_group[$record->country->isoCode] = array();
$hash_key = $remote_ip.'-'.$record->country->isoCode;
if (!isset($lookup[$hash_key])) {
$lookup[$hash_key] = 1;
array_push($country_group[$record->country->isoCode], $data_id);
}
}
++$row;
if ($row % 100000 == 0) {
echo "[".date("Y-m-d H:i:s")."]\t".number_format($row).", time cost: ".(microtime(true) - $tracking_time_cost_per_run)."\n";
$tracking_time_cost_per_run = microtime(true);
file_put_contents('/tmp/lookup-result.json', json_encode($country_group));
}
}
fclose($handle);

echo "[".date("Y-m-d H:i:s")."]\t".number_format($row)."\n";
echo "Total #: $row\n";
print_r($header);
file_put_contents('lookup-result.json', json_encode($country_group));
}

產出:
% time php job.php
[2021-04-09 21:03:51] init
[2021-04-09 21:05:18] 100,000, time cost: 86.867056131363
[2021-04-09 21:06:41] 200,000, time cost: 83.395349025726 
...

% jq '' /tmp/lookup-result.json | head -n10

{
  "TW": [
    "1",
    "68",
    "101",
    "121",
    "147",
    "193",
    "236",
    "259", 
... 

就把一堆 record id 擺在某個 country_code 下面,每 85秒處理完 10萬筆資料。

2021年3月14日 星期日

[動漫] 排球少年!!

 

 來源:WIKI

前幾天晚上想測試一下愛奇藝 CDN 不在台灣後,影響有多大時(實際上愛奇藝沒了台灣這邊的CDN後,速度真的受到不小影響,一直緩衝,幾乎不可用)當下就交叉比對了 NETFLIX ,就挑了 排球少年 這動畫。共有四季,就這樣一週多一點,都用 1.5倍速 完食!

老實說,我並沒有很喜歡這畫風,論運動的話,大家更愛看帥哥眾多的網球少年。會一直看下去的主因是自己國高中也打了六年排球,在班際排球賽上,我也常常負責舉球手這個位置,原因沒有別的,因為排球風氣還不盛行,湊起六人後,隊友大多都是打籃球的,跳得高但基本動作較不熟,就非常適合當主攻手,由相對球齡長的我,角色就是幫忙托球給予攻擊機會。當初國一會選擇排球也滿有趣的,因為國小自己點太多技能在躲避球,幾乎沒在打籃球,一進入國中後對大家一窩蜂衝籃球沒有太大興趣,就挑了排球社。還記得第一天社團活動時,跑去遠一點的撿球,就...故意高吊遠傳兩三個排球場距離,球卻不偏不倚的砸中排球社高中學姊,不認識的學姊還很好心的騙我說眼鏡是自己壞的 XD 當下很蠢以為真的是自己壞,事後想起真是人太好!(後來...好像被詛咒一樣,每當自己把球往高空拋超高時,很容易打中別人的頭 Orz 高中時期又一次打到自己的高中好友)

記得自己國高中垂直跳60cm左右,周邊一票人都 80cm 或是身高 175cm 以上,最扯的是有一位 170cm 卻可以垂直跳 94cm 的學長,所以,對於排球少年的故事很有共鳴的!舉凡跳發、飄浮球都打過,我自己應該是主要用飄浮球發球的。甚至大一體育課也可以靠發球吃香得個幾分 XD

這動畫對我來說,滿多球員內心戲,例如為何打排球、為何不想努力衝刺一番、為何不想認輸、為何想偷懶等等的,滿好玩的,有些心境跟當年自己玩排球有像,甚至上了大學後,短暫加入系隊幾個月有感。像是看到別人身體條件很優,就開始想偷懶,自己找理由畫地自限。

真的想起了很多青春歲月,雖然沒有像故事裡不斷去追逐競賽,但打排球的時間,卻填滿了我國高中至少三四年眾多的下課活動,幾乎每天下課等車前,都會玩個30分以上。可惜上大學後,心態越來越疲憊?無動力,就真的很快退出系隊,幾乎沒在打了。

最後,對於這齣動畫共鳴滿滿,但也難抵擋後面稍微膩的慢步調 XD 像是第三季 10 集動畫就只有一場比賽,卻佔了一季啊。有機會再來看看漫畫了,有興趣想看看排球少年動畫的,可以在 愛奇藝瘋動畫(僅第四季)NETFLIX 逛逛囉!

2021年3月4日 星期四

[開箱] EZCast Beam V3 ,順便與 EZCast Beam J2 體積比較

 EZCast Beam V3

最近想找個伴手禮送人,想著想著就想起投影機很適合給家裡有小孩的人。挑了偏中低價位的投影機,至少有 720P 的輸出效果。剛好手中也有台 EZCast Beam J2 就拿來比較一下大小。

EZCast Beam V3

EZCast Beam V3

比完才發現 EZCast Beam J2 真的是袖珍版的微投影機 XD

這台 EZCast Beam V3 的服務項目:

  • HDMI 輸入 (投影機最基本需求)
  • USB 輸入
    • 支援 iPhone/iPad 透過有線完成 Airplay Mirror 投放
    • 支援 Android 透過有線完成 Chromecast Mirror 
    • 支援從隨身碟讀取資料來播放,如影片/照片/音樂
  • 無線輸入
    • 由於支援2.4G/5G 無線網路連線,有無線投放功能,如 DLNA / Miracast / Google Home Mirror / Airplay ,甚至官網還有提到 Youtube app 也可以搜尋到此裝置來投放
送人著重在體驗,力求極速上手,個人比較看重 USB 輸入,讓手機內容投放出去,方便第一!

更多資訊可以到官網 EZCast Beam V3 或是 EZCast網站購物 或是官方直營的 EZCast蝦皮商店 逛逛。