2020年11月20日 星期五

[動漫] 出租女友 / 租借女友 / 彼女、お借りします / 女朋友,借我一下

出租女友

夏天研究 bilibili 時,逛了一下排行榜而認識了這齣動畫,接著就在 巴哈姆特動畫瘋 二倍速看完了第一季動畫,然後跑去看了線上漫畫追到 165 話(每週二出刊),也趁雙11 Bookwalker 特價時,買了七本單行本紀念一下。

wiki 簡介,作者發想的點子是來自於中國春節返鄉時,網路上在那邊哈拉租個男朋友/女朋友回家過年的話題,當然,動畫加了很多青少年幻想色色元素 XD 但撐過後這片段後,後面反而可以享受劇情,著重男主角在認識自己,認識自己的心意究竟為何。我看完第一季動畫後,第一個想起的是很久以前的動漫 古靈精怪/橙路 (作者2020年10月病逝),就主角與阿圓和阿光的故事。最近看新聞說第二季動畫也決定開拍了,之後有空再來看吧!

老實說,年紀大了強迫自己看些年輕的東西也是一種醒腦的方式,像是回想起自己,看到一些有才華的人,想要多接近多了解、攀談時,最後發現彼此距離非常遙遠,才驚醒先天上本來就是不同空間的人事物,強求不來,還是回歸充實自己才是最重要的事,一切就是緣分(無緣)啊。

此外,看這動漫最大的收穫是認識日本樂團 the peggies !! 心煩的時候、無聊的時候聽一下 センチメートル 回想起歌詞意境心情也輕快許多(影片可開字幕看翻譯)


有興趣可以瀏覽 Spotify 別人整理好的 playlist:

2020年11月18日 星期三

使用 Bookwalker 電子書漫畫閱讀經驗

鬼滅之刃文宣

可能之前接觸太多鬼滅之刃的東西,被一堆廣告亂襲擊中,也順勢認識了一間銷售電子書的網站:BookWalker 台灣漫讀,而雙11有6折優惠活動,且新用戶第一次購買又可以享受79折,就這樣定價一本 55元的電子書漫畫,就只要25元左右,實在便宜,就買了 19 集(推論還有2集沒上架,在東立出版社的線上書城 11/16 才剛上鬼滅之刃第20集電子書漫畫

就這樣,雙11我只買了電子書漫畫 XD 幾百元而已。

這次買了19本,再看他一次 XD 第一次觀看時,覺得漫畫畫得很急似的,每個出場都很快,殊不知第二次來看,反而覺得都恰到好處,大概就知道全部才21集吧,這時就覺得人設規劃得很不錯,人物故事講得剛剛好,又是另一種體會。但說真的,我覺得動畫是讓這部漫畫封神的主要原因,那個 ufotable 製作的太出神入化 XD 而研究後其實很多漫畫也都是這樣,都透過動畫才達成另一個知名度高峰。

提一下 BookWalker 的情況,其實台灣也有很多電子書商店,他們不一定會做實體閱讀器,但至少都會提供 app ,以此達到購買後有地方可以閱讀。這次我也稍微研究了一下 BookWalker ,是一間高層都是日本人經營的公司:

大概看了一下發展,就覺得是還滿專注動漫畫的公司,其中粉絲團可以看到一直有在推出漫畫上架,所以就體驗一下囉!唯一感到不便的是一次買整套漫畫,要在 PC 或 App 瀏覽時,少了以漫畫為單位的顯示列表,目前都是以單行本為單位,若買了兩三部漫畫時,一頁只顯示 15 本的書籍單位時,就會被洗版 XDD

目前最常用 PC 閱讀,其 PC 閱讀環境是純瀏覽器,直接在網站看。至於 ios/android 都有對應的 app ,可能只有 iPad 是比較好的閱讀環境,畢竟尺寸還是很重要的 XD

[韓劇] 返回18歲 / 18 again / 18 어게인

圖片來源:wiki - 重回18歲

前陣子登入愛奇藝回顧一下方案(雙11方案),就被這韓劇吸引,當然,就是被女主角 金荷娜 吸引啦,看了幾齣她演的韓劇,印象深刻,像是某些情境會使出招牌的咬唇 (誤) 不過在返回18歲裡頭很少,我只有印象中看到一次。

後來發現以前公司的女同事也在看,當然,看法就不一樣,就是看帥哥男主角 XD 我一開始有點難適應那誇張燦爛的笑容 XDD

回過頭來,這齣戲是著重在親情戲的,剛好很適合我的年紀,提醒自已對小孩要多包容、多把握一起相處的時機。對年過35的來說,看的很有滋味,且愛情戲也不重,恰到好處,十分完美。

後來還在 NETFLIX 觀看了美國 2009 年的熱門電影 17 again (回到17歲),是返回18歲改編的來源。最後也研究了一下這部戲劇是不是很紅,好像是普通,平均收視 2.7%,因為同時段有 Penthouse 收視率可以衝破 10% ,也有青春紀錄等隨便也都 4% 收視率的。可能 TA 群不同吧,恰好給中年人回顧一下對家庭的時間投資。

2020年11月17日 星期二

[書] 彼得原理

幾個月前趁著 kobo 特價活動時,買了數本電子書,其中一本就是彼得原理。

這本書一開始閱讀時,對我而言像是八卦書,把自己已經在職場上看過的人事物統整起來,比較像複習,大概看完七成時都還是差不多的心得。

舉例來說,以前加入過五千人規模的公司,裡頭的文化氣息步調緩慢,再加上非營利的經營路線,考績跟年終影響沒那麼明顯,例如很努力可以得到 2個月年終獎金,而過的混混的可以拿到 1.5 年終,再加上彼此的薪資水準都是法定,範圍差距很小。

通常都是年紀大的比較懂文化,再加上年資高的月薪自然又被新鮮人高,這樣算年終下來,懂生活的老前輩不見得會輸給衝勁十足的新鮮人,就像彼得原理提到的人物一樣 XD 下一刻呢?有衝勁的年輕人習得文化後,要嘛一起享受生活,要嘛就離開此處。算是個劣幣驅除良幣的現象。

再來一個案例,我也曾碰過握有權力的前輩,本身也有才華,卻因為做事有自己偏好,很多苦勞都會刻意避開,實在聰明。有時都會覺得真是可惜,若那些苦勞都扛下來後,肯定會長出美好的果實的。再說一個案例,那就是老闆愛將模式下,會替愛將規劃一些政治圈,包括產生一些並非適合公司現狀的階級制度等等,這個叫做很得老闆愛 XD 

回過頭來,有人的地方就有政治,我覺得 彼得原理 可以提醒如何審視週遭人的現狀,為何有人明明很聰明,為何做事的成效不佳,在沒有利害關係下,可以當作很有趣的現象觀察。當然,有工作前後關係時,就會是個痛苦 XD 而書裡最後提到的章節,也等於讓讀者在審核自己的身心狀態,因此,假設這本書的養分有 100 分的話,我大概只需要其中的 20-30 分而已,比較好玩的是在教導如何避免不適任的現象,像是讓不適任的員工去做他們適任的工作內容,甚至避開衝突,只是對外商企業來說,除非有老闆愛,不然砍人是比較常見的解法 XD 

2020年11月6日 星期五

[Linux] 使用 uClibc-ng 製作 x86_64 開發測試環境,以編譯 curl / libcurl 為例 @ Ubuntu 20.04

由於硬體要限縮資源,這時會把常見的 glibc 換成 uclibc 節省空間,而過程包括要建置 toolchain 等等。由於部分程式在 embedded linux 運作不如預期,大家擔心可能是 uclibc 產生的問題,就出現在 x86_64 運行 uclibc 作檢驗的念頭

實作上也是要建置 x86_64 的 toolchain 出來,此例就用 curl / libcurl 為例。此篇工作記錄參考 编译工具链制作-x86_64-linux-uclibc 文章,建議先拜讀這篇,裡頭編譯參數的項目都有說明,佛心啊。此處筆記是設法把開發環境都用最新環境,包括:

  • Ubuntu 20.04.1 LTS server
  • uClibc-ng-1.0.36
  • binutils-2.35
  • gcc-9.3.0 
  • mpfr-4.1.0
  • mpc-1.2.1 
  • gmp-6.1.2
  • linux-2.6.39

而後面編譯 curl 採用以下資源:

  • tiny-curl-7.72.0
  • zlib-1.2.11
  • openssl-1.1.1h 

採用 gcc-9.3.0 的主因是 ubuntu 20.04 預設 apt install gcc 就是 9.3 版。以下連續動作:

$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.gz
$ wget https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
$ wget https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2
$ wget https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
$ wget https://ftp.gnu.org/gnu/mpfr/mpfr-4.1.0.tar.gz
$ wget http://ftp.ntu.edu.tw/linux/kernel/v2.6/linux-2.6.39.tar.gz
$ wget https://downloads.uclibc-ng.org/releases/1.0.36/uClibc-ng-1.0.36.tar.gz

並全在 user 家目錄解壓縮,解壓縮後把 open source 包都移到 resource 目錄中保存:

[email protected]:~$ tree -L 1 
.
├── binutils-2.35
├── gcc-9.3.0
├── gmp-6.1.2
├── linux-2.6.39
├── mpc-1.2.1
├── mpfr-4.1.0
├── resource
└── uClibc-ng-1.0.36

安裝一些工具:

$ sudo apt install make cmake gcc g++ libncurses-dev libncurses5-dev
$ gcc -v
...
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
$ g++ -v
...
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
$ make -v
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
$ cmake --version
cmake version 3.16.3

建置環境變數,預計都安裝在家目錄的 tarball 裡,此例就是 /home/user/tarball:

$ cat ~/uclibc-init.sh 
export ARCH=x86
export TARGET=x86_64-linux-uclibc
export PREFIX=/home/user/tarball
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH

 

$ source ~/uclibc-init.sh
$ mkdir -p $TARGET_PREFIX

編譯 binutils 環境:

$ cd binutils-2.35 && mkdir -p $TARGET && cd $TARGET
$ ../configure \
--prefix=$PREFIX \
--with-lib-path=$PREFIX/lib:$PREFIX/lib64 \
--disable-multilib \
--disable-werror \
--disable-nls \
--enable-gold \
--target=$TARGET
$ make && make install

 

$ x86_64-linux-uclibc-ld --verbose | grep SEARCH
SEARCH_DIR("/home/user/tarball/x86_64-linux-uclibc/lib64"); SEARCH_DIR("/home/user/tarball/lib"); SEARCH_DIR("/home/user/tarball/lib64"); SEARCH_DIR("/home/user/tarball/x86_64-linux-uclibc/lib");

這邊增加 --enable-gold 用於 gcc-9.3 的編譯時會踩到的需求,通常就是缺一些 header files 就是要找找看躲在 binutils, uclibc 等等

安置 linux header files:

$ linux-2.6.39/
$ make ARCH=$ARCH INSTALL_HDR_PATH=$TARGET_PREFIX headers_install

編譯跨平台 gcc 工具:

$ cd gcc-9.3.0/
$ ln -s ../mpc-1.2.1/ mpc
$ ln -s ../mpfr-4.1.0/ mpfr
$ ln -s ../gmp-6.1.2/ gmp
$ mkdir -p $TARGET && cd $TARGET
$ ../configure \
--prefix=$PREFIX \
--with-sysroot=$PREFIX \
--with-local-prefix=$PREFIX \
--with-native-system-header-dir=/$TARGET/include \
--enable-languages=c,c++ \
--enable-linker-build-id \
--disable-multilib \
--disable-werror \
--without-headers \
--with-newlib \
--disable-shared \
--disable-nls \
--target=$TARGET
$ make all-gcc
$ make install-gcc

安置 uclibc 相關檔案們(startfiles/headers):

$ cd uClibc-ng-1.0.36
$ make menuconfig
Target Architecture
    --> x86_64
Target Architecture Features and Options
--> [*] Enable full C99 math library support  
--> [*] Enable C99 Floating-point environment
--> Linux kernel header location (/home/user/tarball/x86_64-linux-uclibc/include)
General Library Settings
--> [*] Dynamic linker stand-alone mode support
--> Thread support (Native POSIX Threading (NPTL))
--> [*] utmpx based support for tracking login/logouts to/from the system
--> [*]   utmp support (XPG2 compat, SVr4 compat) 
--> [*] Enable SuSv3 LEGACY functions
--> [*] Enable SuSv3 LEGACY macros
--> [*] Enable SuSv4 or obsolescent functions
Advanced Library Settings
--> [*] Enable SVr4 deprecated functions
Networking Support
--> [*] IP version 6 support
--> [*]   Use netlink to query interfaces 
--> [*]     Support the AI_ADDRCONFIG flag
--> [*] DNS resolver functions
String and Stdio Support
--> [*] Wide Charater Support
Big and Tall
--> [*] Support the wordexp() interface
Libray Installation Options
--> uClibc runtime library directory(/home/user/tarball/x86_64-linux-uclibc)
--> uClibc development envirment directory(/home/user/tarball/x86_64-linux-uclibc)
Development/debugging options
--> Cross-compiling toolchain prefix (x86_64-linux-uclibc-)
--> (-D__NR_setns -D__NR_syncfs) Extra CFLAGS
$ make startfiles
$ PREFIX="" make install_startfiles
$ PREFIX="" make install_headers

其中我開啟了不少項目都是後邊在編譯 gcc-9.3 和 curl 會用到的項目,像是缺 ifaddrs.h 而開啟 Support the AI_ADDRCONFIG flag 又相依要開啟 Use netlink to query interfaces 選項等等。過程常見的都是編譯期間缺 header files 而反覆在 uclibc 開啟資源,可以把缺的 header files 在 uclibc 中靠 find 或 grep 搜尋

繼續編譯跨平台 libgcc:

$ cd ~/gcc-9.3.0/$TARGET
$ make all-target-libgcc
$ make install-target-libgcc

編譯和安裝 uclibc :

$ cd ~/uClibc-ng-1.0.36/
$ make
$ PREFIX="" make install

最後一次 gcc 編譯:

$ cd ~/gcc-9.3.0/$TARGET
$ ../configure \
--prefix=$PREFIX \
--with-sysroot=/ \
--with-local-prefix=$PREFIX \
--with-native-system-header-dir=$TARGET_PREFIX/include \
--enable-languages=c,c++ \
--enable-linker-build-id \
--disable-libsanitizer \
--disable-multilib \
--disable-werror \
--disable-nls \
--target=$TARGET
$ make all
$ make install

如此,就可以有基本的環境運行了,例如編譯 main.c:

$ cat main.c 
#include <stdio.h>
int main(int argc, char *argv[]) {
        printf("Hello\n");
        return 0;
}
$ x86_64-linux-uclibc-gcc main.c 
$ ./a.out 
-bash: ./a.out: No such file or directory
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64-uClibc.so.0, BuildID[sha1]=c243334b7550adf7ef5342019c444d6762da738b, not stripped

 

$ ~/tarball/x86_64-linux-uclibc/lib/ld64-uClibc-1.0.36.so --library-path /home/user/tarball/x86_64-linux-uclibc/lib/:/home/user/tarball/x86_64-linux-uclibc/lib64:/home/user/tarball/lib ./a.out
Hello

緊接著編譯 curl 來用,因為他相依 openssl, libssh2, zlib ,所以過程要先把這些函示庫都編好:

$ wget https://zlib.net/zlib-1.2.11.tar.gz
$ tar -xvf zlib-1.2.11.tar.gz && cd ~/zlib-1.2.11
$ CC=x86_64-linux-uclibc-gcc  CXX=x86_64-linux-uclibc-g++  ./configure --prefix=$PREFIX
$ make && make install  

 

$ wget https://www.libssh2.org/download/libssh2-1.9.0.tar.gz
$ tar -xvf libssh2-1.9.0.tar.gz && cd libssh2-1.9.0
$ CC=x86_64-linux-uclibc-gcc  CXX=x86_64-linux-uclibc-g++  ./configure --prefix=$PREFIX --host x86_64-linux-uclibc
$ make && make install

 

$ wget https://www.openssl.org/source/openssl-1.1.1h.tar.gz
$ tar -xvf openssl-1.1.1h.tar.gz && cd ~/openssl-1.1.1h
$ CC=x86_64-linux-uclibc-gcc  CXX=x86_64-linux-uclibc-g++ ./config --prefix=$PREFIX -latomic no-threads no-shared no-rc5  enable-camellia  enable-mdc2 no-tests no-fuzz-libfuzzer no-fuzz-afl zlib
$ make && make install

 

$ wget https://curl.haxx.se/tiny/tiny-curl-7.72.0.tar.gz
$ tar -xvf tiny-curl-7.72.0.tar.gz && cd tiny-curl-7.72.0
$ mkdir build && cd build
$ CC=x86_64-linux-uclibc-gcc CXX=x86_64-linux-uclibc-gc++ cmake .. -DCMAKE_PREFIX_PATH=~/tarball -DCMAKE_INSTALL_PREFIX=~/tarball
$ make && make install

 

$ /home/user/tarball/bin/curl
-bash: /home/user/tarball/bin/curl: No such file or directory
$ ~/tarball/x86_64-linux-uclibc/lib/ld64-uClibc-1.0.36.so --library-path /home/user/tarball/x86_64-linux-uclibc/lib/:/home/user/tarball/x86_64-linux-uclibc/lib64:/home/user/tarball/lib  /home/user/tarball/bin/curl --version
curl 7.72.0 (Linux) libcurl/7.72.0 OpenSSL/1.1.1h zlib/1.2.11 libssh2/1.9.0
Release-Date: 2020-08-27
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS HTTPS-proxy IPv6 Largefile libz NTLM SSL UnixSockets

收工!