2018年9月5日 星期三

建立 ESXi 的安裝 USB 磁碟

首先,依照官方說明,建立步驟如下

-----------------------------------------------------
mkfs.vfat -F 32 -n USB /dev/sde1

syslinux /dev/sde1
cat /usr/share/syslinux/mbr.bin > /dev/sde

mount /dev/sde1 /mnt/usbdisk
mount -o loop VMware-VMvisor-Installer-5.5.update.3b-201512001-3248547.x86_64.iso /mnt/cdrom

cp -r /mnt/cdrom/* /mnt/usbdisk
mv /mnt/usbdisk/isolinux.cfg /mnt/usbdisk/syslinux.cfg

vi /mnt/usbdisk/syslinux.cfg
change the line APPEND -c boot.cfg to APPEND -c boot.cfg -p 1
umount /mnt/usbdisk
-----------------------------------------------------

很不幸的,開機後,出現 "Failed to load COM32 file menu.c32" 的錯誤訊息。依照網路找到的說明,再從自己的電腦系統中,copy 一些檔案過去,如下
-----------------------------------------------------
cp /usr/share/syslinux/libcom32.c32 /mnt/usbdisk/
cp /usr/share/syslinux/mboot.c32 /mnt/usbdisk/
cp /usr/share/syslinux/menu.c32 /mnt/usbdisk/
cp /usr/share/syslinux/libutil.c32 /mnt/usbdisk/
-----------------------------------------------------

開機後,可以看到選單,但是出現無法載入的錯誤。

在網路上找到,有人把 syslinux 降到舊版本,就成功了。所以將自己電腦的 syslinux 降到 3.86,還是不成功。

最後放棄,照 Youtube 找到的教學,改用 Universal USB Installer,選擇 "Try Unlisted Linux ISO",一次就成功。終於看到正常開機後的畫面了,接下來,就不用在座位和機房間跑來跑去,可以坐在位子上做接下來的工作,這就是使用 VM 的好處啊。


2018年9月4日 星期二

避免使用 Vue.js 的 DOM Templates

參考 Why You Should Avoid Vue.js DOM Templates

最近才開始學習使用 Vue,剛看到這篇文章,不懂它在說什麼,只知道在 Html 的 table 中,會將非 table 的內容,上移到 table 上方。在學習了 component 之後,終於理解它在說什麼了。

在 component 中,有幾種方式定義 template。最方便的,應該是使用 backtick (`) 來定義多行字串,不過,IE 10 不支援。我們無法強制要求使用者完全不用 IE 10,也不想辛苦的用 Javascript 的 string,因此只能選擇使用 x-template 或 DOM template。

其實,DOM template 也不是好選擇,因為在 IE 10 是不正常的,最後,只剩 x-template。關於不用 DOM template 的原因,一些測試和說明如下。

測試程式碼,如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue.js Template Test</title>
</head>
<body>
<div id="app">
    <template-test1></template-test1>
    <template-test2></template-test2>
</div>

<script type="text/javascript" src="vue_2.5.16.js"></script>

<script type="text/x-template" id="template-test1">
    <div>
        <h3>使用 x-template</h3>
        <table border="1">
            <component-test-sub
                    v-for="ri in 5"
                    v-bind:key="ri"
                    v-bind:ri="ri"
            />
        </table>
    </div>
</script>

<script>
    Vue.component('template-test1', {
        template: '#template-test1'
    });
</script>

<!-- Template 在瀏覽器應該不會顯示,但在 IE 10 會顯示 <h3> 的 title -->
<template id="template-test2">
    <div>
        <h3>使用 DOM template</h3>
        <table border="1">
            <tr is="component-test-sub"
                v-for="ri in 5"
                v-bind:key="ri"
                v-bind:ri="ri"
            ></tr>
        </table>
    </div>
</template>

<script>
    Vue.component('template-test2', {
        template: '#template-test2'
    });
</script>

<script type="text/x-template" id="test-sub-template">
    <tr>
        <td>Row {{ ri }}</td>
    </tr>
</script>

<script type="text/javascript">
    Vue.component('componentTestSub', {
        template: '#test-sub-template',
        props: {
            ri: Number  // row index
        }
    });

    new Vue({
        el: '#app'
    });
</script>
</body>
</html>



說明

使用 x-template,其 childNodes 只有一個,就是其中的全部內容。而使用 DOM template 時,瀏覽器會解析其內容,建立 DOM tree。

因此,使用 DOM template 時,在 <table></table> 中,不能直接使用 <component-test-sub />,也不允許 self closing。

2018年9月1日 星期六

使用 distcc 進行遠端編譯

在舊筆電上安裝 Gentoo,要更新 package 時,真是一段漫長的等待。身邊就擺著效能超強的桌機或伺服器,卻幫不上忙。若能把 compile 的任務丟給遠端的效能強大的電腦,在筆電上更新 package 將上一件多棒的事啊。這個想法確實可行,而且,看來已是很成熟的作法了,只是我到現在才知道。因為要請長假,把塵封的筆電拿出來,已有一年沒更新,連 make.profile 都已改變。若要更新,必然是要花個幾天幾夜才能完成,只好確定能開機,連回伺服器,就等回來上班後再處理了。

首先的要求是 gcc 的版本要一致,Gentoo 的穩定版是 gcc 7.3.0,而筆電還是 gcc  4.9.4。在 emerge --sync 同步 portage 後,大約 13:30 開始更新 gcc,約 15:30 完成,花了 2 個鐘頭的時間。

安裝和服務設定

安裝,很簡單
# emerge -av sys-devel/distcc

服務設定,修改 /etc/systemd/system/distccd.service.d/00gentoo.conf
Environment="ALLOWED_SERVERS=10.161.80.1/20"

雖然叫 ALLOWED_SERVERS,但也指 client 端,照做就對了。然後啟動服務
# systemctl daemon-reload
# systemctl start distccd

只是暫時使用,所以沒有 enable 此服務。

測試

# cat main.c
--------------------------------------------
#include <stdio.h>

int main() {
    printf("Hello distcc!\n");
    return 0;
}
--------------------------------------------
# /usr/bin/distcc-config --set-hosts 10.161.81.162
# export DISTCC_VERBOSE=1
# distcc gcc -c main.c -o main.o
# gcc main.o -o main
# ./main
Hello distcc!

筆電的安裝

年久失修,只好按照 "To bootstrap" 的說明來做。
USE='-*' PYTHON_TARGETS="python2_7" emerge --nodeps sys-devel/distcc

export PATH="/usr/lib/distcc/bin:${PATH}"
/usr/bin/distcc-config --set-hosts 10.161.81.162

使用 pump mode,速度會加快很多,
/usr/bin/distcc-config --set-hosts "10.161.81.162/20,cpp,lzo"

鈄線後面的數字 (即 '/20'),是可以接受的最大 job 數,預設是 4。跑 distccd 的 server 是雙 CPU,各 8 core,共 32 thread,平時沒在用,就設到 20 job,給它盡情的操吧。

修改 /etc/portage/make.conf,其中 j 的選項為 total (local + remote) CPU cores,l 的選項為  local CPU cores。
FEATURES="distcc distcc-pump"
MAKEOPTS="-j20 -l2"

升級 gcc,一次要跳過中間的版本,不曉得會怎樣。不管了,玩玩看,不成功的話,頂多從頭裝起。
# gcc-config --list-profiles
 [1] x86_64-pc-linux-gnu-4.9.4 *
 [2] x86_64-pc-linux-gnu-5.4.0
 [3] x86_64-pc-linux-gnu-7.3.0

# gcc-config 3
# source /etc/profile

# emerge --ask --oneshot --usepkg=n sys-devel/libtool sys-apps/sandbox

接下來,就只好慢慢的,一個一個 package 依次升級了。

emerge 失敗的問題

有時,會發生像下面錯誤訊息而安裝失敗,例如 kde-frameworks/kpty,將 distcc 取消就成功了。
fatal error: sys/filio.h: No such file or directory
 #include <sys/filio.h>

所以,碰到 emerge 失敗時,就試著將 distcc 取消,也許問題就解決了。

最後,實在太慢了,而且,太多的失敗與錯誤,乾脆拔硬碟,用 PC 來更新。原來折騰了一個週末,都搞不定,裝到 PC 上更新,一天就跑完了。

也許,原來的版本太舊了,隔了一年多才更新,有很多 package 都是被 mask 掉的。使用 distcc 時,發生很多衝突的狀況,都直接用 --nodeps 的選項來裝,造成程式潛伏的問題。

結尾

我現在的筆電是 ThinkPad X201,原本有點動心想再買一台 X230,但是一年都用不上,實在沒必要多花這一萬元啊。雖然,沒有完全使用 distcc 的作法,來完成更新。但 distcc 可以在往後更新用上,這筆電也能再用上好幾年,即使是在上面跑 Gentoo。


網誌存檔