2020年5月24日 星期日

pthread 實作練習 (1) - pthread_create, pthread_exit, pthread_self

相分食有賰, 相搶食無份
在上次的「user mode pthread 實作 - simple_thread」已經知道如何實作 user mode thread 的觀念, 這次進一步來完成「CS170: Project 2 - User Mode Thread Library (20% of project score)」要求的 3 個函式:
  1. int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
  2. void pthread_exit(void *value_ptr);
  3. pthread_t pthread_self(void);
自己嘗試了一下, 比我想像的還要難一些。

這篇文章說明 pthread_create(), pthread_exit() 我自己實作的過程, pthread_self() 感覺好像不難, 但也沒那麼單純。

[pthread_t pthread_self(void)]

pthread_self 把 pthread_t 當成 thread id 回傳, 這就造成我只能把 pthread_t 定義成一個數字, 雖然也可以把 pthread_t 定義成 struct, 但在這邊就不好處理了。

原本我把 pthread_t 定義為 struct, 只好改為

typedef unsigned long long pthread_t;

struct ThreadData
{
  my_x32_jmp_buf jmp_buf_;
};
typedef std::pair ThreadPair;

另外準備 ThreadPair 當做管理 thread 的資料結構。

pthread_t pthread_self(void)
{
  return thread_vec[current_index].first;
}

pthread_self() 就這麼簡單。當目前的 thread 執行時, 傳回目前的 ThreadPair 資料結構。所以 current_index 指向正確的資料結構是很重要的, 計算錯誤就指到別的 thread 了。

[void pthread_exit(void *value_ptr)]

pthread_create 相對簡單一些, pthread_exit 就有點難倒我。

在「user mode pthread 實作 - simple_thread」我是用 while(1) 測試一個 thread, 但如果這個 thread 正常結束了, 應該要怎麼辦呢? 應該要正常離開吧。

但什麼才是正常離開呢?

schedule 不會再去把這個 thread 選出來執行, 否則這個 thread 永遠都會被執行, 但是由於 function 已經結束, 再選出來執行的時候, 只會亂跑, cpu 跳到不正確的地方 (因為已經沒有正常的程式碼了), 最後會造成整個 process segmentation fault。

另外一個問題是, 如果這個 thread 沒有呼叫 pthread_exit(), 我們希望可以作到在 thread 結束時, 會去呼叫 pthread_exit(), 覺得是不可能的任務嗎?

simple_thread.cpp
206 int func3_ret = 33;
207 void *func3(void *arg)
208 {
209   {
210     printf("331 ");
211     printf("332 ");
212     printf("333 ");
213     printf("334 ");
214     printf("335 ");
215     printf("\n");
216   }
217   return &func3_ret;
218 }

在這個 func3 thread 結束之後, 要讓他呼叫 pthread_exit(), 而 pthread_exit 會做一些事情, 將 func3 這個 thread 移除, 之後就不會再選 func3 來執行。

這樣應該會覺得已經很難了, 不過作業還不只這樣, 作業希望可以把 func3_ret 的值傳給 pthread_exit(void *value_ptr), 這樣在 pthread_exit(void *value_ptr) 印出 value_ptr 時, 會得到 33, list 1 的結果。

list 1
331 332 333 334 335
thread exit: 0x81d5074, retval: 33, current_index: 2

有點不可思議是嗎?

結果又是我自己把他想得太難了, 在看完「CS170: Project 3 - Thread Synchronization (20% of project score)」Implementation 之後, 原來有個這麼簡單的方式, 我恍然大悟。

先說明我自己那麼胡亂的想法。

怎麼在 func3 之後呼叫 pthread_exit(), 操作 stack, 在 stack 的 return address 把 pthread_exit 位址存入之後即可, 不算太難, 但如果要把 &func3_ret 傳給 pthread_exit 的參數呢? 有點難, 我先 push 一個 function push_arg, 再次 push pthread_exit, 讓 pthread_exit 可以取得 push_arg 的參數也就是 &func3_ret, 看起來很厲害, 聽不懂沒關係, 因為完全是多此一舉。

漂亮的解法是, 只要用一個 wrapper function 包住這個 thread function 即可, 文字說明可能不清楚, show me the code。

simple_thread.cpp
215   void wrap_routine(void *(*start_routine) (void *), void *arg)
216   {
217     void *ptr;
218     if (start_routine)
219     {
220       printf("arg: %p\n", arg);
221       ptr = start_routine(arg);
222     }
223     pthread_exit(ptr);
224   }

236     thread_pair.second.jmp_buf_[0].eip = (intptr_t)wrap_routine;

251     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)arg;
252     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);
253
254     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)start_routine;
255     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);
256
257     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)0; // simulate push return address
258     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);

simple_thread.cpp L215 用了一個 wrap_routine 包住要執行的 thread function start_routine, 最後再呼叫 pthread_exit() 即可。

而 jmp_buf 的 eip 則是把 wrap_routine 填入即可。

而 wrap_routine 的 2 個參數: start_routine, arg, 就從 stack push 進去, simple_thread.cpp L251 ~ 257 的部份。

如此一來, 就算你的 thread funcion 沒呼叫 pthread_exit, wrap_routine 也會幫你呼叫, 也可以取得 start_routine 的 return value, 實在妙以。

這樣就順利解決 pthread_exit 取得 thread function return value 的問題, 再來由於這個 thread 已經結束, 那 pthread_exit 還要做什麼呢? 我是讓 pthread_exit 去挑下一個 thread function 來執行, 並在相關的資料結構標記目前的 thread 已經結束, 之後就不會挑這個 thread 來執行。

但是這邊有個討厭的難題, 由於存取到 global variable, 這個 global variable 在 signal handler 也會使用, 所以要注意到同步的問題, 我目前沒有處理。Todo

做這些是為了之後的 pthread_join 做準備。

[int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg)]

這裡有一個我之前忽略的問題, 沒有讓 main thread 繼續執行下去, 得補上這段。另外, 如果 main thread 結束, 所有的 thread 也要跟著結束。

list 2. pthread_create
235   int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
236   {
237     static int init_main_thread = 0;
238     static DS::ThreadPair main_thread_pair;
239
240 #if 1
241     sigset_t sigs;
242     sigemptyset(&sigs);
243     sigaddset(&sigs, SIGRTMIN);
244     sigprocmask(SIG_SETMASK, &sigs, 0);
245 #endif
246
247     if (0 == init_main_thread)
248     { 
249       main_thread_pair.first = 1; // fixed to 1
250       thread_vec.push_back(main_thread_pair);
251       init_main_thread = 1;
252     }
253
254     ThreadPair thread_pair;
255     *thread = gen_tid();
256     thread_pair.first = *thread;
257
260     thread_pair.second.jmp_buf_[0].eip = (intptr_t)wrap_routine;
262     
263     auto stack_addr = thread_malloc_stack(BUF_SIZE);
264     if (stack_addr == 0)
265       return -1;
266     
267     printf("xx sizeof(intptr_t): %u\n", sizeof(intptr_t));
268 
269     thread_pair.second.jmp_buf_[0].esp = ((intptr_t)stack_addr + BUF_SIZE - sizeof(intptr_t)); // current stack - 4 or 8
270   
271     printf("stack_addr + BUF_SIZE: %p\n", (char *)stack_addr+BUF_SIZE);
274 
275     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)arg;
276     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);
277     
278     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)start_routine;
279     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);
280 
281     *(intptr_t*)thread_pair.second.jmp_buf_[0].esp = (intptr_t)0; // simulate push return address
282     thread_pair.second.jmp_buf_[0].esp -= sizeof(intptr_t);
299 
300     thread_vec.push_back(thread_pair);
301     cur_thread = thread_vec.end() - 1;
302     current_index = thread_vec.size() - 1;
303     
304     auto &m_thread_pair = thread_vec[0];
305     if (my_setjmp(m_thread_pair.second.jmp_buf_) == 0)
306     {
307       my_longjmp(DS::thread_vec[DS::current_index].second.jmp_buf_, 1);
308     }
309     else
310     {
311       printf("m th\n");
312     }
313     return 0;
314   }

list 2. L304 ~ 312, 就是在保存 main thread jmp_buf, list 2. L247 ~ 252 把 main thread 的資料結構加入 thread_vec, tid 固定在 1, 所以呼叫一次 pthread_create, 會產生 2 個 thread 資料結構, 一個是該 function, 另外一個是 main thread。

所以 signal handler 要保證在之後才能發動, 要不然 main thread 的 jmp_buf 沒設定, 就無法回到 main thread 了。我沒有處理此狀況, 不難, 先 block 該 signal 即可, setjmp 之後在 unblock。

其他就是在設定 jmp_buf 的 eip, esp, 和之前一樣。

source code:
https://github.com/descent/simple_thread/tree/master/cpp



thread 的上限:
cat /proc/sys/kernel/threads-max 
我的系統是 39319

2020年5月14日 星期四

[日本自助行 6/8] ] 20190912 名古屋 - 高山 - 名古屋

日期: 20190912 (4) (6/8)
地點: 名古屋 - 高山 - 名古屋

本篇文章提到的時間均為日本時間, 沒寫單位的金額為日圓。

我不會日文, 英文也不好: 文章中有關問路或是其他問人的資訊, 都是用很克難的方式完成 (簡單英文、簡單日文、比手畫腳)。

[高山站]

7:00 就起床, 在我的旅程中, 算是少有的早起行程, 這是刻意為之的行為, 從名古屋車站到高山, 需要 2 個多小時的車程, 算是蠻遠的距離, 所以我才會這麼早起床。

今天的早餐在 first cabin 吃, 在 first cabin 用完早餐之後, first cabin 的早餐不算豐富, 其實我想要買早餐到電車上吃, 可以在省下一點時間, 不過不知道為什麼定到有早餐的版本, 也不能浪費, 還是在這邊吃, 應該是我第一次在日本自助旅行的旅館內吃早餐。



簡單的麵包、蛋糕、飲料機的果汁、咖啡 ... 不趕時間的話坐在這邊用餐還蠻愜意, 舒服的座位、明亮的燈光, 真是放鬆。



阿 ... 不能太放鬆了, 用完餐後, 便急忙趕往名古屋車站, 看看有沒較早的班次可以搭乘。



今天的行程是飛驒 (音發陀) 高山, 要搭乘 jr hida 前往。我想要用購票機購票, 搭乘 hida 特急前往高山。hida 就是飛驒 (ひだ) 的日文念法。

fig 1 特急ひだ - 指定息車票
昨天已經練習過要怎麼在購票機買票, 今天很快速的就買到票, 選擇的是指定席, 因為怕沒座位要站 2 個多小時, 我還是買了指定席, 後來發現其實自由席還蠻多空位的。

購買的時間是 08:43, 10:56 抵達高山。和我之前研究的票券不同, 我以為會有 3 張票, 乘車券、指定席、特急券, 結果只有一張車票。和臺鐵一樣阿, 害我緊張的。不知道要怎樣的買法才會有三張票券。

這台列車的名字是 - 特急 ひだ (飛騨), 很難得的日文漢字只有一個平假名的對應, 應該算是蠻好記的。由於「特急ひだ」穿梭於山谷之間, 所以沿路上的風景非常優美, 是一趟很優美的旅程。

我的票券是指定席, 自由席是在 9, 10 車之後。廁所燈亮的話表示有人, 列車蠻晃的, 上廁所時請小心。

網路上有人討論要坐在哪一邊, 因為途中有一邊會是峭壁, 就看不到美景, 但其實沒必要特別選, 左右 2 邊有各自不同的風景, 由於我搭乘時有很多空位, 我是來來回回的在左右 2 邊換座位。至於我自己的座位是 5A, 如 fig 5。

寬廣的河面、茂密的樹林就這樣交錯穿梭來回眼前, 能做出在環繞群山峽谷的鐵路, 真是太棒了, 這是在台灣沒能享受的鐵道之旅, 5830 值得。

從名古屋到高山, 沿途停靠岐阜 (09:04)、美濃田太 (09:25)、下呂 (10:16)、高山。短短的四個停靠站卻要花 2 小時再多一點, 距離真的遠吧!

fig 5 我的座位, 5A, 完整窗景, 明亮, 太陽光照射強烈

在 8D, 8A, 5D, 5A 的座位, 不會被窗戶檔到風景, 整片偌大的窗戶可以遠眺車外風光, 若是不幸在其他位置, 被窗戶檔到, 可能真的煞風景。



從名古屋往岐阜的座位是和前進方向相反的, 我那時候很納悶, 日本人應該不會做出如此奇怪的決定, 果然到岐阜之後, 這時候車輛的前進方向就和座位一致了, 真是特別的體驗。

台灣的鐵路似乎沒有這樣的軌道, 都是同一方向。







抵達高山站之後, 在車站附近觀察一下地形, 了解一下左鄰右舍, 看到了「濃飛バス」, 這是我下次要去合掌村時要搭乘的交通工具。

[濃飛バス]



從這裡到合掌村單程要 50 分鐘, 我到高山時已經 11:00 左右, 如果來回在耗上 100 分鐘, 實在吃不消, 整天都在搭車, 應該安排在高山住一晚的, 但是這樣我就無法去搭乘磁浮列車了。

下次再去合掌村吧, 先來探探怎麼購票。往合掌村的車比較特別, 某些時段是指定席, 也就是一定要劃位, 沒位置就只能等等看其他非指定席的班次了, 類似台灣的和欣客運。

fig 2 飛驒の里優惠套票
在 youtube 有看到 klook 一日的合掌村/高山行程, 但我還是想要自己搭乘這些交通工具, 喜歡自己掌控時間, 最後沒有參加這種行程。

先把回名古屋的「濃飛バス」票券買好, 本來想買 17:30 回程的, 無奈已經客滿, 只好買 18:00 的班次 (fig 3), 事後也證明真的太晚。

搭乘巴士最主要是為了省錢, JR 特急實在不便宜, 但若不買指定席, 價格不會差巴士太多, 但 2 小時的車程我實在不想賭, 再說搭乘巴士也是另外的體驗, 也不錯。

再來我另外安排了「飛驒の里」這個景點, 說實話, 我沒有什麼把握可以抵達, 和站務人員溝通了老半天還是不懂怎麼買到「飛驒の里」的票券, 還好有個會說中文的售票員, 我才搞懂整個流程。

是這樣的, 到「飛驒の里」有優惠票券, 含「飛驒の里」的門票, 但只能在高山 - 飛驒の里 - 高山這 3 個地方下車, 搭乘的是高山的一般公車。

我也才知道原來「飛驒の里」是需要門票的, 票券樣式如 fig 2。

搞定好票券, 可以到一旁的公車處等公車了, 在 1 號月台等待即可。

沒多久, 公車來了, 大約十多分鐘之後, 就抵達「飛驒の里」, 遠遠就看到合掌屋的建築, 好興奮。

公車站牌下車處有間紀念品店家, 我稍微看了一下, 蠻大一間, 在「飛驒の里」結束之後, 再過來看看。

[飛驒の里]



這個景點算是合掌村的替代品, 因為沒去合掌村, 所以來這邊看看合掌屋。飛驒の里算是合掌村博物館, 介紹著合掌屋的一切, 也有幾棟合掌屋可以參觀, 也可以進入內部看看合掌屋裡頭是長什麼樣子。

如果有去合掌村, 應該是不用特地來「飛驒の里」。進入「飛驒の里」之後, 迎面而來一大片的水面, 所有的合掌屋就環繞著這個湖面而築, 我沿著湖面旁的步道, 慢慢地往合掌屋散步而去。

高山果然高, 氣溫真的有點低, 我拿出了 gore-tex 外套換上, 在大阪、名古屋這幾天, 天候非常炎熱, gore-tex 外套完全沒派上用場, 總算在高山上用到。

這裡的步道會有指標指示往那會去到什麼地方, 要全部繞完也得花上不少時間, 我並沒有將所有的地點都看完, 但也知道合掌屋有哪些特色, 長的是什麼樣子, 裡頭有哪些擺設。







[岐阜縣高山市 - 古い町並 - 高山三町老街]
從「濃飛バス」下車後, 徒步走來「古い町並」, 大約十分鐘左右, 經過一座橋之後, 就來到古色古香的街道, 這是令所有旅人喜愛的街道, 木造房屋、舊式建築, 營造出回到過去之感。



一般旅遊資訊都會說高山三町老街這是類似京都的老街風景, 有小京都之稱, 不過幾天前才剛去過京都, 對京都也沒有什麼具體認識, 體會不出來和京都的關聯, 但我很喜歡這邊的街景, 和「川越」相比, 我個人偏愛這裡。

有打聽到要來這裡吃飛驒牛壽司, 而且要有排隊的心裡準備, 我這人一向不因美食而排隊, 今天不知道怎麼了, 竟然也跟著排起來。

沒有特定尋找這間店家, 胡亂的在「古い町並」亂晃, 突然看到有個排隊人潮, 應該就是你了吧! 看看隊伍長度, 還不算太長, 我趕緊去瞧瞧是不是那間店, 確認之後, 無誤, 就是你! 趕緊排在隊伍最後方, 這時大約是 14:00, 我可還沒吃午餐, 就把飛驒牛壽司當午餐吧! 等拿到飛驒牛壽司之後, 已經是 14:22, 大約花了 20 分鐘的排隊時間。

店家用了很方便的菜單, 就 4 樣, A, B, C, X, 有照片、價錢, 就看顧客喜歡那道菜色, 方便外國旅客點餐。

買了 2 份, C 和 X, 總共 2000, 換算回台幣, 好像也蠻貴的 (對不起, 是我薪水太少), 總共 5 個壽司, 因為有 2 份, 所以我有 2 片仙貝, 比起飛驒牛壽司, 仙貝就不怎麼樣, 當作填飽肚子用的好了, 解決掉他們只花了 5 分鐘, 真的美味阿! 好想再去排一次。

這算是我的午餐, 所以就給他花下去了, 牛肉像是融化一般在我舌中化開, 完全沒有有腥味, 和壽司米巧妙的融合在一起, 好吃歸好吃, 但我沒有吃飽, 再去找其他的美食來吃。



這區就是單純踩街、買紀念品、吃美食, 看你腳力到那, 就逛到那、吃到那, 由於我時間很多, 便繞了非常大的一圈, 吃了不少東西, 但這邊不像黑店 ... 黑門市場, 以下是美食費用。
  • 飛驒牛壽司: 2000
  • 飛驒牛乳冰淇淋: 260
  • 飛驒牛米漢堡: 350
  • 飛驒牛肉串: 800
還不到黑門市場那碗 4000 海膽動飯。

這邊也像京都一樣, 有人力手拉車, 不過坐的人好像比較少, 也許是這裡是平地, 比較好走。好幾條街道都是這種日本風格的房子, 台灣其實也有這種不輸人的磚瓦建築, 可惜沒有被好好保存下來, 幾乎都要去很鄉下的地方才能看到很完整的紅磚瓦古厝, 要是現在還是日本人統治, 這些古厝應該會被好好保存下來吧! 也會成為具有觀光價值的景點, 不像現在, 看到的幾乎都是破碎、沒人居住的殘璧斷垣。

而台灣廟宇建築大多保存很完整, 而且數量也很多, 城市中、山林中, 通通有廟宇的蹤跡。

回到「古い町並」, 這邊也有出租單車, 不過費用蠻貴的, 真想帶著我的「小黃」來這邊騎車, 「小黃」面對如此平坦的道路, 綽綽有餘。



街上有很多販售紀念品的店家, 隨便一間都可以逛很久, 我購買了有飛騨字眼的產品, 其實我根本不知道那是什麼東西, 胡亂買了一堆。



17:00 我就回到「濃飛バス」, 真的是逛累了, 還有一小時才發車, 我便坐在巴士中心的椅子上休息, 今天早起, 加上走了一堆路, 也應該氣力用盡, 準備一些食物當晚餐, 預備在巴士上吃。

[搭巴士回名古屋]

fig 3 高山 - 名古屋 的巴士車票 - 3100, 座位 7D
等了一小時之後, 往名古屋車站的巴士終於來了, 排隊依序上車。司機在乘客上車時會收走票券, 所以得記住自己的座位, 要不然票收走就不知道自己坐哪裡了。

中途有停在休息站, 好像可以讓乘客下車社廁所買東西的樣子, 聽不懂日文, 我也不敢隨意下車, 回不到名古屋車站那就麻煩了。

20:30 回到名古屋車站, 比 JR 特級慢 20 分鐘左右, 但可以接受, 畢竟票價也便宜不少。

到 bic camera 逛了一下書籍, 而 21:00 就關店了, 還沒來得及仔細逛就關門了, 往旅館回去吧, 沿路買了泡麵, 回旅館泡, 來看看日本的泡麵是不是很厲害。

不過說實在這碗泡麵實在讓我失望, 份量很少, 裡頭的配料也很少, 幾乎只有一包粉而已, 吃起來也不怎麼樣, 價格卻不便宜, 還是自己從台灣帶比較省錢, 也好吃多了。

也許是我挑到了地雷的版本, 不過我也不是愛吃泡麵一族, 這次的嘗試算是嘗鮮, 之後還是吃一般的熱食好了, 畢竟附近有吉野家, 實在沒必要吃泡麵的。

2020年5月7日 星期四

t50反一, 富邦 vix etf

https://www.twse.com.tw/zh/ETF/fund/0050

元大台灣50反1公開說明書 - 164 頁, 若你沒有耐心看完它, 還是不要輕易就購買這個金融商品, 它可能和你想的不一樣。

「t50反一」有個簡稱 - 元大台灣50反1 (00632R), 然而, 正式名稱更是重要 - 元大台灣50單日反向1倍證券投資信託基金

以下為部份資料

證券交易稅千分之一
交易手續費費率同上市證券,由證券商訂定,但不得超過千分之一點四二五
管理費1%
保管費0.04%

從上方表格只會看到管理費、保管費 1% + 0.04% = 1.04%, 可能會讓你誤以為 1.04% 是所有費用, 但其實不是這樣, 金融商品的陷阱挖的比你想的還深。

內扣費用可從查「基金各項費用比率 (月、季、年)」查詢, 不要管什麼保管費、手續費、經理費, 因為可能有很多你根本不知道的費用要扣, 所以一律稱為「內扣費用」。

fig 1 2019 年全年內扣費用 1.2%

fig 1 就是從基金各項費用比率 (月、季、年)查詢的結果, 1.2% 的內扣費用, 這才是真的被扣的費用, 而且每年都會有些差異, 這是每天都會被扣掉的費用。

1.2% 算高還是低呢? 沒比較沒有傷害, 來看看 Vanguard vti 的內扣費用。

Asset class
Domestic Stock - General
Category
Large Blend
VTI.IV
Expense ratio
as of 04/28/2020

0.03%
CUSIP
922908769
ETF advisor
Vanguard Equity Index Group

Expense ratio as of 04/28/2020 0.03%, 這 2 個數字應該不難看出, 1.2% 到底是高還是低。

一般人聽到這個名字的 etf, 以為是「臺灣50指數」跌, 這隻 etf 就會上漲; 「臺灣50指數」漲, 這隻 etf 就會跌, 不過你確定是這樣嗎? 有自己算算看嗎? 你是看名字就買金融商品投資人嗎?

我們來模擬操作一下。

臺灣50指數從 100 漲 5 點 105 (第一天), 再跌 5 點回到 100 (第二天)。
對應的漲跌幅度是 5%, -4.76%

「0050」對應的操作應該也是 5%, -4.76%
從 105 -> 100.002

「元大台灣50反1」對應的操作則應該是 -5%, +4.76%
從 95 -> 99.5238

臺灣50指數從 100, 105 回到 100 時, 元大台灣50反1 從 100 回到 99.5238。

臺灣50指數100 +5 -5
臺灣50指數漲跌幅度5/100 = 5% -5/105 = -4.76%
0050 (元大台灣卓越50基金)+5% -4.76%
100 105 100.002
元大台灣50反1-5% +4.76%
100 95 99.5238

在來看另外一個例子:
臺灣50指數從 100 跌 5 點 95 (第一天), 再漲 5 點回到 100 (第二天)。
對應的漲跌幅度是 -5%, 5.26%

「0050」對應的操作應該也是 -5%, 5.26%
從 95 -> 99.99985

「元大台灣50反1」對應的操作則應該是 5%, -5.26%
從 105 -> 99.47385

臺灣50指數從 100, 95 回到 100 時, 元大台灣50反1 從 100 回到 99.47385。

台股指數100 -5 +5
臺灣50指數漲跌幅度-5/100 = -5% 5/95 = 5.26%
0050 (元大台灣卓越50基金)-5% 5.26%
100 95 99.99985
元大台灣50反15% -5.26%
100 105 99.47385

有沒發現, 第二天指數回到 100, 但「元大台灣50反1」都小於 100 一點, 永遠都是在虧損的狀態, 並不是「臺灣50指數」漲, 這隻 etf 就會跌, 而是就算 「臺灣50指數」平盤, 「元大台灣50反1」也會跌。

這還沒有把 1.2% 的內扣費用, 期貨交易的成本扣掉, 再扣除的話, 100 * 1.2% = 1.2, 99.47385-1.2=98.27385, 不到 99, 100 就少了快 2 元。

臺灣50指數」跌, 「元大台灣50反1」就會漲的前提是「單日」。

正式名稱 -「元大台灣50單日反向1倍證券投資信託基金」元大已經跟你說了。

所以應該持有一天就賣掉嗎? 我不確定, 但我不會買這種金融商品, 陷阱太多, 我光是要了解到這樣, 就已經花了不少力氣。

基本上這是要能準確預測股市下跌的時機才能購買的, 但如果我有這能力, 還需要靠「元大台灣50單日反向1倍證券投資信託基金」嗎? 隨便買都發大財了。

正是因為我沒有預測股市上漲或是下跌的本事, 才用綠角的策略, 指數投資、買進持有, 不預測股市上漲或是下跌。

富邦 vix etf 也是類似的道理, 千萬不要用字面上的名字來解釋操作的方式, 還是參考公開說明書或去打聽更清楚的相關資訊比較好。

ref:
https://www.yuantaetfs.com/#/LevEtfGuide/Index

2020年5月1日 星期五

台灣小調 VS 南都之夜



1:30 開始演唱這首「台灣小調」, 國語版本的聽起來很奇怪。

南都之夜則是台語的版本。聽了幾個版本, 個人偏愛蔡幸娟+劉福助/鄭進一的南都之夜。



日文原曲 - りんごの唄 並木路子 昭和うた


ref:
歌頌同個地方,為何《台灣小調》被盛讚、《美麗島》卻遭禁?不為人知的60年前秘辛

2020年4月25日 星期六

volks dd 2b 延遲再延遲出貨

2018年DD受注限定企画「NieR:Automata × Dollfie Dream」1次お届け日決定のお知らせ

寄出日期 (由於 covid-19 疫情, 已經完全沒按照這個規劃了)

本來應該在 201919 寄出, 因為之前的台風因素, 改為 2020/05/13 之前要付清。這是第一次延遲。

2018年DD受注限定企画「NieR:Automata × Dollfie Dream(R)」をご予約頂いたお客様へ


この度はボークスホビー天国ウェブにてご予約を頂き、誠にありがとうございました。

2019年10月~11月のお届けを予定しておりましたが、2019年9月上旬に発生いたしました台風15号により、
生産部門の一部に甚大な被害を受けたため、やむを得ず3回に分けてのお届けとさせていただくことになりました。

ボークスニュースVol.85や一部の広告等で告知しておりました予定から変更となり、発売を楽しみにお待ちいただいておりますお客様に、
ご迷惑をおかけ致しますこと深くお詫び申し上げます。

Lottery entry history / Pre-Order Project purchase history

Receipt DateEntry/Receipt NumberItem NameTotal Entry ValueResultPayment StatusPayment Deadline
2020/03/11XXDollfie Dream Dynamite 2B / YoRHa No.2 Type BYYWon LotteryUnpaid2020/05/13 00:00
而當 2020/4/23 我要完成付款的時候, 看到 fig 2 畫面, 嚇了一跳, 還沒到補款期限阿, 為什麼不能付款了。

除了 email 給 volks 之外, 還查到以下資料:
2018年DD限定订购企划「NieR:Automata × Dollfie Dream」2次到货以及支付相关事宜的通知

【 现居住于海外的用户】
原本我们预计于4月11日(星期六)开始依次为各位顾客发送您所预约的商品。
但是,伴随着近期COVID-19感染规模的不断扩大,受此影响,我们不得已暂停了日本境外的订货以及支付服务,与此同时 ,您所预约的商品的到货时间也将不得已延期。 

我是第三梯次的, 連付款也被延期了, 之後會再通知付款。

根據以下連接:
ボークス オンラインストア:海外からのご注文再開のお知らせ(4/24更新)

2020/5/1 恢復海外寄送, 有可能會用 dhl。

這篇可以查詢相關資訊:
https://dollfie.ec.volks.co.jp/topics_detail.html?info_id=74

fig 1 DD 2b 補款連結畫面
fig 2 進入補款結之後的畫面, 無法付款

20200501 volks 又開始外匯寄送

我再次試了一下付款, 這次就可以正常付款了。

而 Payment Status 也改成 paid, 全部費用: 89740 + 10800 = 100540。

Receipt DateEntry/Receipt NumberItem NameTotal Entry ValueResultPayment StatusPayment Deadline
2020/03/11AADollfie Dream Dynamite 2B / YoRHa No.2 Type BBBWon Lotterypaid2020/05/13 00:00

付款之後, volks 會 email 到註冊的 email, 我看了一下都沒收到, 原來被歸類到垃圾郵件去了, 好在有發現。不然還要詢問 volks 是怎麼回事。

搞定付款之後, 再來就等 volks 寄出, 我是第三梯次, 不知道什麼時候會寄出?

根據以下連結, 第三梯次預計 20200516 出貨, 真是望穿秋水。

2018年DD受注限定企画「NieR:Automata × Dollfie Dream」3次お届け日決定のお知らせ

■ 対象者
2018年12月1日(土)~12月2日(日)にご予約された方
■ 対象商品
● DDdy 2B(ヨルハ二号B型)
● DD 9S(ヨルハ九号S型)
■ お届け日程
● ご自宅発送のお客様:
商品のお届けは2020年5月16日(土)より順次発送を開始いたします。
お待たせして申し訳ございませんが、今しばらくお時間をいただけますよう、よろしくお願いいたします。

2020年4月16日 星期四

20190911 (3) 名古屋 mandrake

日期: 20190911 (3) (5/8)

在離開 volks 名古屋之後, 還有一些時間, 參考這篇「【玩具探險隊】日本動漫三大聖地 - 「名古屋」大須地區玩具店完整攻略!」, 我來到附近的大須觀音商店街, 這裡有販售動漫週邊的地方, 前往 mandrake, 尋找 dd 娃物。

從 volks 名古屋走到 mandrake 只有一小段, 並不會很遠, 大約 10 分鐘左右即可到達。我從地下鉄鶴舞線到「上前津駅」下車到 volks 名古屋, 再走路到 mandrake。

[名古屋 mandrake]

看了 google map 之後, 「名古屋 mandrake」不算難找, 小小迷路一下就找到了, fig 1 就是 名古屋 mandrake, 獨立的一棟樓房。

mandrake 是有名的中古動漫週邊店家, 不過我只想看娃物, 看了樓層簡介之後得知在在 4 樓, 我飛快奔向 4 樓, 但是到了 3 樓之後, 卻怎麼也找不到通往 4 樓的階梯, 奇怪, 後來詢問櫃台人員之後才知道怎麼走到 4 樓。

fig 1 名古屋 mandrake
入門迎來的就是一大堆的二手娃, 價錢當然都不便宜, 我滿足的一一望去, 有 sd 娃, dd 娃, 不過沒有特別喜愛的, 我對這些娃娃也不熟悉, 所以我不知道這樣的二手價錢到底划不划算。

但能夠這樣看過去已經讓我很開心了, 在這徘徊來回了許久, 仔細的觀望這些娃, 自從接觸 bjd 之後, 來日本我總是會安排一小段時間到娃店逛逛。

fig 2 很多娃頭
另外也有 azone 的娃, 種類也是非常多, 3 分到 6 分都有, 琳瑯滿目, 目前還沒有 azone 的娃, 到是買了不少 azone 出的 3 分娃衣, 不過娃衣大小並不那麼適合 DD 就是, 勉強可穿, 但整體造型可能沒那麼適合。

另外還有整排櫃子的娃衣, 有很多是 volks 的娃衣, volks webstore 的娃衣很多都絕版了, 看到一些喜歡的也只能純欣賞。

我仔細的一袋一袋翻找, 希望可以看到一些喜歡的絕版娃衣, 可惜沒看到任何喜歡的。售價算是合理, 沒有比原價高的離譜。

雖然沒有買任何東西, 但這樣看過一輪, 也讓我過足癮了。台灣的娃店在二手娃和 volks 的二手衣都非常匱乏, 所以要看這些東西, 還是只能跑日本。

之後在櫃台角落發現個紙箱, 裡頭都是娃頭 (fig 2), 是有上妝的, 價錢也不貴, 大約在 3000 ~ 8000 日圓不等, 可惜也沒看到喜歡的, 最後什麼都沒買就這樣離開 4 樓了, 好像有點遺憾的感覺。

這次不管在 volks show room 或是 mandrake, 都沒看到什麼喜歡的娃物, 花費比預期的少。

大約在四樓待了一小時, 離開時已經 15:30。





滿足的看完了娃物之後, 可以到別的樓層晃晃, 看了一些公仔、機器人模型、另外還有一些 cosplay 服裝, 有火影鳴人的外套、美少女戰士的水手服 ...

公仔、機器人模型很容易就可以在動漫街上的店家看到, 琳瑯滿目, 來日本一次看的飽, 也不用擔心買到盜版的。



另外還有一些機器人的模型, 無敵鐵金剛、五獅聖戰士之類的, 我輩之中有不少熱愛這些小時候的卡通機器人。

小時候我也有的, 但都不知道到到哪裡去了? 完成動漫巡禮之後, 滿足的離開這裡, 往大須觀音商店街走過去, 該去旅館 checkin 了。

2020年4月11日 星期六

淘寶貨運清關時間 - 遇到最久的一次

這次運氣不好, 2020/3/27 清關, 2020/4/9 出關, 花了 14 天。

詢問一些網友, 比我慢發台灣的都收到了。害我一直很擔心收不到。也因為「海外包裹實名制4/16正式上路,易利委EZ WAY註冊、報關委任教學,海外網購族必學!」所以用了 ea way app 來實名, 但還是沒有比較早出關。在實名制 app EZWAY 我有看到包裹真的是 2020/3/27 進來的, 但我不知道是不是海運。

fig 1 20200410 收到
很有可能是這個原因: [抱怨] 空運被發成海運,已多人受害

黑名單
小伙伴集運、平安集運、公主集運、一路發集運、女神集運、台達通集運、集運便國際集運、淘集便、ABC國際集運、蜜淘集運、貓貓集運、優騏集運、手拉手集運、韋博集運、蘋果集運、上海東龍、謚誠、友誼、神速、雲翔、上海登航、捷瑞

另外這次在集貨時還遇到一個小插曲, 網購包裹還沒送到已「被簽收」。

20191114 淘寶的貨運通知物品已經簽收, 但我問集貨商, 「韵达貨運」根本沒來, 並告知我是運送員自己簽收的, 我很疑惑, 後來找到這篇「網購包裹還沒到已「被簽收」 賣家:運單號出錯」。

原來真的有這樣的行為, 不怪送貨員, 1111 包裹量太大了, 辛苦他們。而 20191115 集貨商真的就收到了。

ref: