2017年4月29日 星期六

gcc 昇級至 5.0 後,vmware-workstation 無法執行

某天,在將 gcc 切換至 5.0 之後,將 libtool 重新 emerge 之後,看起來都正常。
隔天,就陸續出現一些問題,vmware 也開不起來了。依據說明,將相關的程式 rebuild
revdep-rebuild --library 'libstdc++.so.6' -- --exclude gcc
也還是不行,執行 vmware 會出現 Caught signal 11 的訊息。

將 USE 加上 bundled-libs,重新 emerge app-emulation/vmware-workstation,還是不行。

在啟動後,會產生4個 log 檔,位於 /tmp/vmware-ajax 下。比對 log,在 HostDeviceInfo_FindHostCDROMs 之後,就出現 Caught signal 11 -- tid 5274 (addr 2500) 的錯誤了

 vmware-ui-5274.log
-------------------------
2017-05-01T08:53:04.773+08:00| vmui| I125: vmxFilePathStats="/opt/vmware/lib/vmware/bin/vmware-vmx-stats"
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating IDE CDROMs
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfoFindHostIDECDROMs: /proc/ide could not be explored. Unable to enumerate host IDE cdroms.
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: IDE CDROM enumerating completed
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating SCSI CDROMs
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfoCheckDevCDROM: can't stat /dev/cdrom: No such file or directory
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: SCSI CDROM enumerating completed
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating CDROMs in VSI
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: VSI CDROM enumerating completed
2017-05-01T08:53:04+08:00[+0.007]| vmui| W115: Caught signal 11 -- tid 5274 (addr 2500)
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: rip 0x2500 rsp 0x7ffe16463d38 rbp 0x1
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: rax 0x0 rbx 0x7fd4223bed28 rcx 0x55931e74b510 rdx 0x55931e74b510 rsi 0x7ffe16465a68 rdi 0x1
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125:         r8 0x55931ec96b20 r9 0x2f r10 0x30 r11 0x55931ec9bb00 r12 0x7ffe16465a68 r13 0x55931e74b510 r14 0x7fd4223bed30 r15 0x0
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: stack 7FFE16463D38 : 0x00007fd43146433a 0x0000000000000018

-------------------------------

從 log 中,可看出在 check CDROM 之後,就出現 caught signal 11 的錯誤。乾脆,狠下心來,重新安裝 OS,在只裝 xorg-server 後,可以執行 vmware。但是在設成 gnome+systemd 的設定,裝好 xfce 的環境後,就又起不來了。經過幾天的嘗試,不斷的在網路找答案,都沒辦法啟動。最後,大概判斷可能是glib 的問題。

gcc-5.0 之後,使用新的 C++11 ABI,因此,會造成一些錯誤。而在 vmware 中,會檢查 lib 的版本,判斷要使用 system 或 shipped 的 lib,有可能,在夾雜使用的情況下,就無法啟動了。

最後,決定將 gcc 降回 gcc-4.9.4,反正使用 gcc-5.0 或 gcc-4.9,對我來講,好像都沒差,雖然,使用 Gentoo Linux 樂趣之一,就是不斷的對各個 package 昇級。

在 gcc 版本降級之後,USE 的 bundled-libs 拿掉,重新 emerge app-emulation/vmware-workstation 和 app-emulation/vmware-modules
然後,重新啟動 vmware,

vmware-apploader-5274.log 中出現的錯誤訊息如下
-------------------------------
2017-05-03T12:44:44.719+08:00| appLoader| I125: Loading shipped version of libvmwareui.so.
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to load libvmwareui.so from /opt/vmware/lib/vmware/lib/libvmwareui.so/libvmwareui.so: /opt/vmware/lib/vmware/lib/libvmwareui.so/libvmwareui.so: undefined symbol: _ZN4Glib10spawn_syncERKSsRKNS_11ArrayHandleISsNS_17Container_Helpers10TypeTraitsISsEEEENS_10SpawnFlagsERKN4sigc4slotIvNSA_3nilESC_SC_SC_SC_SC_SC_EEPSsSG_Pi
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to load dependencies for /opt/vmware/lib/vmware/lib/libvmware.so/libvmware.so
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to execute vmware.

-------------------------------

後來,依據 vmware-workstation-12.5.4.5192485.ebuild 中的相依 package 列表,將相關的 package 重新 emerge,將重新 build 其中幾個關鍵的 package 之後,vmware 就可以啟動了。後來,為了以防萬一,全部重新 build。

在出問題的其間,也用了 virtualbox,碰到一個比較嚴重的問題是,透過網芳連 freebsd 的 samba server,速度奇慢,因而決定放棄 virtualbox,另外,也比較習慣 vmware。所以,只有等那時候 vmware 也可以用 gcc-5.0 之後,再將 gcc 的版本昇上去吧。

要將 gcc 版本昇級,很簡單,照做就是了。但是要降級,就沒有指引了,不時會出現這樣的錯誤,
workrave: symbol lookup error: workrave: undefined symbol: _ZN4Glib7ustringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 

就只能重新 emerge 相關的 package 了,錯一個裝一個吧。


降級 gcc-4.9.4

官方只有升級的說明,沒有降級的說明,關於降級,只有警告而已。但不論如何,為了使用 vmware-workstation,只能把 gcc 降級。就參考 gentoo gcc 升級的 wiki,開始囉。
root #emerge -av gcc:4.9.4
root #gcc-config --list-profiles
 [1] x86_64-pc-linux-gnu-4.9.4
 [2] x86_64-pc-linux-gnu-5.4.0 *
root #gcc-config 1
root #env-update && source /etc/profile 
root #gccgcc
root #emerge --ask --oneshot sys-devel/libtool
root #revdep-rebuild --library 'libstdc++\.so\.5'
root #revdep-rebuild --library 'libstdc++.so.6' -- --exclude gcc
root #emerge --ask --oneshot --verbose dev-libs/boost

rebuild 會幾乎把所有的 package 都重新裝一次,電腦速度若不快,也許會跑一整天吧,但也沒辦法啦。尤其是,新裝的系統,預設就是 gcc-5.4.0 了,非降級不可。


2017-10-06 補記

最近,裝 Chromium 一定要 gcc 5.0 以上,甚至已經做出放棄 chromium 的打算。試試運氣,再搜尋一下答案,發現在 Gentoo 的討論區,已有人解決此問題,連結如下
https://forums.gentoo.org/viewtopic-t-1063880-start-0.html

原想自己改 ebuild 檔,可是 trace 一下 git 上的 commit 紀錄,發現大約在 5 月多,就已經做了修正,甚至不需要加上 bundled-libs 的 USE flag。

將 gcc 升級後,按照步驟,全部重來一次,全部正常,真是太棒了。

2017年4月19日 星期三

MailCatcher -- 寄 mail 的測試

參考網址 https://mailcatcher.me/

在開發程式時,測試 mail 的功能是一大困擾,常常一不小心,就寄出一堆垃圾信。我自己也有過這種不光采的經驗,事後還要寫 mail 和使用者道歉。

其實,別人也會有這種困擾,某天心血來潮,用 fake smtp server 搜尋一下,找到一堆 solution,其中一個是 mailmatcher,看起來還算方便。

安裝

安裝方式很簡單,直接下指令即可,gem install mailcatcher。當然,要先安裝 ruby 的 gem 才可以。
另外,最好先安裝 sqlite3,不然在用 gem 安裝 mailcatcher 時會失敗。

執行及設定

直接 mailcatcher 即可啟動 daemon,不過,這樣在遠端無法瀏覽。帶上 ip 的參數,即mailcatcher --ip=0.0.0.0,這樣在遠端透過 http://10.161.86.38:1080/ 即可看到測試的情形。

關於 PHP 的設定,執行 which catchmail ,確定指令所在位置,然後將 path 複制到 php.ini 中的 sendmail_path,即   
sendmail_path = "/usr/bin/env /usr/local/bin/catchmail "

修改 Laravel 的 .env 如下
# mailcatcher
MAIL_DRIVER=smtp
MAIL_HOST=10.161.86.38
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

測試程式

在 routes.php 中,建立下列的 route 指令,然後瀏覽 http://10.161.86.38/mail_tst 即可看到結果。
Route::any('mail_tst', function() { 
    $user = ['email' => 'agee@gmail.com', 'name' => 'agee'];
     Mail::send('emails.reminder', ['user' => $user], 
                function ($m) use ($user) 
    {
       $m->from('hello@app.com', 'Your Application');
       $m->to($user['email'], $user['name'])->subject('Your Reminder!');
     }); 
    return 'Mail test';
});

或者純粹 PHP 程式的測試,如下
$Mheader = "From: ajax@nctu.edu.tw\nContent-Type: text/plain; charset=big5\nContent-Transfer-Encoding: 8bit";
$Mtitle = 'mail test 123';
$Memail = 'ajax@nctu.edu.tw';
$Mcontent = " If you have any questions or concerns, please email the support group at ntuceiba@ntu.edu.tw\n\n";
$flg = mail($Memail,$Mtitle,$Mcontent,$Mheader);

if ($flg) {
    echo "mail ok!";
} else {
    echo "mail failed!";
}

CentOS 的設定

CentOS 下,必須要安裝
yum install sqlite-devel openssl-devel autoconf bison automake libtool gcc-c++
yum install rubygems ruby-devel

Systemd Service / Daemon
mailcatcher.service
# mailcatcher
[Unit]
Description=MailCatcher Service
After=network.service vagrant.mount

[Service]
Type=simple
ExecStart=/usr/local/bin/mailcatcher --foreground --ip 0.0.0.0

[Install]
WantedBy=multi-user.target

2017年4月14日 星期五

在 Linux 下,透過 pdo_dblib 連接 ms sql server

在 PHP 5.x ,是透過 mssql_connect() 來連接 MSSQL Server 2000。在 PHP 7.0 之後,則可以使用 pdo_dblib 來連接 MSSQL Server 2000,並且可以在 Laravel 下使用。而使用微軟提供的 driver,則只能連接 MSSQL Server 200 之後的 SQL server。

yum install php70w-pdo_dblib

其將安裝相依的程式,如 freetds、libgcrypt、libtool-ltdl、libgpg-error、unixODBC。

<?php
echo "db test <br>\n";

$dsn = 'dblib:version=7.1;charset=UTF-8;host=10.161.80.211;dbname=course_db;'
;

try {
  $conn = new PDO($dsn, "dbuser","usrpwd");
} catch (PDOException $e) {
  echo 'Connection failed: ' . $e->getMessage()."<br>\n";
}


$sql = "select @@version as version";
$st = $conn->query($sql);

if (!$st) {

    echo "Query error: ";
    echo $conn->errorInfo();
}

$dat = $st->fetch(PDO::FETCH_ASSOC);
echo '<pre>'.print_r($dat, true).'</pre>';

?>

在 Laravel 中,將連線的 'driver'  設成 'sqlsrv' ,即可透過 dblib 來連上 ms sql server。

2017年4月7日 星期五

我的單車 (2017 年 4 月)

日本 LOUIS GARNEAU GMT 碟煞鋁合金 24 速長途旅行車 (2017 年 3 月購買)

這款車,是專為單車負重長途旅行用車,前後馬鞍袋貨架設計,可直接掛載 4 顆大馬鞍包,再多行李也裝的下!! 也許那天,會用得上吧。算是一手車,前車主只用它騎過兩次環島,平常沒有使用,車架有些許使用痕跡!! 還好,我也不是完美主義者,只是想找輛能比較輕鬆騎的車。目前車況還算正常,變速順暢,不是全新車,單車店以現況出售。

車架尺寸:470MM (適合身高 165 - 180公分)
以一萬元成交,回台北後,又花了7百多,加裝輔助煞把,騎起來比較方便。


Giant CRX1
我是在環島後,參加伙伴們辦的南橫行,在租車的店裡首次見到 CRX1,當時覺得蠻好看,蠻喜歡的,回家後,就想辦法買了一輛。對我來說,它的缺點是,前面的大盤只有兩盤,有太多路,我踩不太上去。

2017年4月1日 星期六

NAS CPU 風扇

群暉 (Synology) 的 NAS 很好用,深受大家肯定。但是它用的零件也超爛的,也同樣的頗受大家批評,每隔幾個月,就通報一次 「CPU fan 1 on xxxx has stopped working.」。換新的風扇後,幾個月後又壞了。一顆風扇賣 600 元,說貴不貴,但幾個月就壞掉,實在讓人不爽之外,還是不爽吧。

拿出主機板模組,看它風扇的貼紙是,「 EVERCOOL,EC4010M12ER,EL BEARING,DC 12V」。嗯,你想找個便宜的 CPU 風扇換上去,就解決問題了嗎? 沒這回事,請看下面的討論
https://forum.synology.com/enu/viewtopic.php?t=59568





網誌存檔