2020年4月27日 星期一

關於 Virtual function 的成員存取控制

關於 Virtual function 的成員存取控制

前言

  最近使用 Qt 的時候發現到 Virtual function 在繼承後可以與基底類別的存取區域不一樣,這才發現到我對 Virtual function 的觀念有問題,在此把學習的過程做個紀錄。

內容

  我原本認為的 Virtaul function 如下
class CA
{
public:
  CA(){}
  virtual void Call(){
    printf("CA::Call()\n");
  }
};
//
class CB:public CA
{
public:
  CB(){}
  virtual void Call(){
    printf("CB::Call()\n");
  }
};
//
CB b;
b.Call();//CB::Call()

範例中的 CB::Call() 與 CA::Call() 的存取區域都必需是"public",但這個觀念其是錯的! CB::Call() 的存取區域可以自己定義所屬的存取區域,如下範例
class CA
{
public:
  CA(){}
  virtual void Call(){
    printf("CA::Call()\n");
  }
};
//
class CB:public CA
{
public:
  CB(){}
private:
  virtual void Call(){
    printf("CB::Call()\n");
  }
};
//
CB b;
b.Call();//Compile error!
CA* pA = (CA*)&b;
pA->Call();//CA::Call();

在範例中這次把 CB::Call() 改成"private",所以"b.Call()"會變成 Compile error ,但由於 CA::Call() 依舊是"public",所以透過轉型還是可以喚起 CA::Call() 。

2020年4月20日 星期一

在 Raspberry Pi 4 上安裝 Ubuntu

在 Raspberry Pi 4 上安裝 Ubuntu

前言

  Raspberry Pi 4 的官方作業系統為 Raspbian ,用了一陣子沒什麼問題,但發現他遽然是 32 位元,而且官方不提供 64 位元,實在無法理解官方的行為,因為 Raspberry Pi 4 的 CPU 是 64 位元,為什麼不提供 64 位元版本的 Raspbian ,但官方的 Ubuntu 卻提供 64 位元,所以我決定放棄使用 Raspbian ,改用 Ubuntu ,由於安裝的過程有些特別,在此做個紀錄。

內容

  首先到官方下載 Ubuntu Server 的官方映像檔,如下圖
下載 Ubuntu Server 的映像檔

這裡下載的是 Ubuntu 18 ,單純只是認為 18 比較穩定,要安裝 Ubuntu 19 也是可以的。
利用 balenaEtcher 燒錄到記憶卡後,先別急著放到 Raspberry Pi 4 上,先瀏覽記憶卡上面的檔案,如下圖
修改 usercfg.txt

在記憶卡裡會有個 usercfg.txt ,在裡面增加以下內容在最後
dtparam=audio=on

這個內容的目的是要開啟音效卡,如果不做這個步驟的話,安裝完後會發現沒聲音。

  接著,把記憶卡放入 Raspberry Pi 4  後開機,帳號/密碼為ubuntu/ubuntu,第一次登入會要求改密碼。由於環境的關係我需要設定無線網路來連線,如果是直接接網路線的話以下步驟可以省略。新增  /etc/netplan/wireless.yaml ,內容如下
network:
  version: 2
  wifis:
    wlan0:
      dhcp4: yes
      dhcp6: no
      access-points:
        "<your network ESSID>":
          password: "<your wifi password>"


要注意的是縮排的空白與冒號之後如果有內容一定要用空白隔開,紅字的部分是要設定無線網路的 SSID 與密碼,設定完候用以下命令啟動無線網路
sudo netplan apply

  在網路備妥後執行以下命令進行更新
sudo apt update
sudo apt full-upgrade

更新完後透過以下命令安裝桌面
sudo apt install ubuntu-desktop

這個安裝大概要一個小時,安裝完後如果有透過  /etc/netplan/wireless.yaml 來設定無線網路的話,請執行以下命令
sudo rm /etc/netplan/wireless.yaml

執行命令移除該檔,如果不移除的話,Ubuntu 的無線網路會抓不到。

  最後,重開機後就可以進入 Ubuntu 了。

參考資料

[ Edge ] 設定 Raspberry Pi 4 中的 Ubuntu Server 19.10 無線網路

2020年4月13日 星期一

在 Linux 上安裝 VNC Server

在 Linux 上安裝 VNC Server

前言

  最近發現同時使用 Raspberry Pi 4 與 PC 在同一個螢幕的時候會發生一些問題,但又希望兩者可以同時使用,所以想透過 VNC 服務來控制 Raspberry Pi 4 ,透過安裝 VNC Server 可以解決這個問題,在此把學習的過程做個紀錄。

內容

  在我的螢幕 Viewsonic VX2433wm 如果同時有兩個輸入的話,一個顯示會是 HDMI PC 模式,另一個會被強制轉成 HDMI AV模式,HDMI PC 模式就如同字面上的意思是給 PC ,另一個 HDMI AV 是給電視用的,雖然可以透過螢幕功能鍵強制調回來,但每次切換到 HDMI AV 模式的輸入都要再透過螢幕功能鍵調一次,如果不調整,畫面會被切邊。

  這個問題是螢幕的預設行為沒辦法透過軟體來修改,所以我想到用 VNC 的方式來解決,在 Raspberry Pi 4 上安裝 VNC Server 可以透過以下命令
sudo apt-get install tightvncserver

安裝完後可以透過以下命令來啟動
vncserver

第一次啟動時會要求設定連線密碼,可以依據喜好設定連線密碼, view-only 密碼可以不用設定。設定完後服務就啟動了,可以透過喜好的 VNC client 端來進行連線,預設的 Port 是 5901。

  雖然 VNC 可以解決切換螢幕的問題,但還是要"手動"來開啟服務,如果能開機就自動開啟服務的話就可以完全不切換螢幕來操控 Raspberry Pi 4 ,如何設定開機就啟動呢?新增以下位址新增檔案
/etc/init.d/tightvncserver

檔案的內容如下
#!/bin/bash
### BEGIN INIT INFO
# Provides:          tightvncserver
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: vnc server
# Description:
### END INIT INFO

export USER='pi'

eval cd ~$USER

# Check the state of the command - this'll either be start or stop 
case "$1" in
  start)
    # if it's start, then start vncserver using the details below
    su $USER -c '/usr/bin/vncserver :1 -geometry 800x600 -depth 16 -pixelformat rgb565'
    echo "Starting vncserver for $USER "
    ;;
  stop)
    # if it's stop, then just kill the process
    pkill Xtightvnc
    echo "vncserver stopped"
    ;;
  *)
    echo "Usage: /etc/init.d/tightvncserver {start|stop}"
    exit 1
    ;;
esac
exit 0

內容中的 USER 是指作業系統的使用者,請依據狀況修改, geometry 的參數可設定解析度。
接著透過以下命令修改該檔權限
sudo chmod 755 /etc/init.d/tightvncserver

接著透過以下命令設定開機時啟動
sudo update-rc.d tightvncserver defaults


參考資料

[ Raspberry Pi台灣樹莓派 ] [基礎] 以 VNC 和 Raspberry Pi 連線

2020年4月6日 星期一

解決 Raspberry Pi 4 音源孔沒有聲音輸出的問題

解決 Raspberry Pi 4 音源孔沒有聲音輸出的問題

前言

  最近購入 Raspberry Pi 4b ,裝了官方的作業系統( Raspbian )後開機一切都很正常,但發現音源孔沒有聲音輸出,在此把解決的過程做個紀錄。

內容

   Raspberry Pi 4b 有兩種影像輸出的方式一是透過 DSI ,二則是 HDMI ,我選擇使用 HDMI 輸出,但發現音源孔沒有聲音輸出,本以為是買到瑕疵品,但把螢幕的喇叭打開會聽到聲音,就知道原來聲音輸出被 HDMI 搶走了。

  如何從 HDMI 音源輸出轉到音源孔輸出,可以在 [ www.youtube.com ] Fixing sound on Raspberry Pi 裡找到答案,首先透過以下命令安裝 alsa-utils 、 mpg321 與 lame
sudo apt-get install alsa-utils mpg321 lame

如果下載的是含有建議軟體的 Raspbian 的話這個步驟可以省略,接著透過以下命令將聲音轉由音源孔輸出
sudo modprobe snd bcm2835
sudo amixer cset numid=3 1

這樣就可以將聲音由音源孔輸出。

參考資料

[ www.youtube.com ] Fixing sound on Raspberry Pi