網頁

2016年12月30日 星期五

UNIX入門課程1051_ex9

http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-1051.html

作業九: figure out the average for each user(awk programming)
與作業七相同, 但改用 awk 來作. input 的 data 中的 name 可能會重複出現.
$ cat ex9-k1
klim 10 20 milk 199 joe 20
# klim is appeared again!
oak 100 red 200 10 klim 30
joe 199  marry 20 julie 2000  #joe joe
$ ./ex9.awk < ex9-k1
klim = 20.00
milk = 199.00
oak = 100.00
red = 105.00
joe = 109.50
marry = 20.00
julie = 2000.00
$

解答:
#!/usr/bin/awk -f
BEGIN {
}
{
  sub(/#.*/,"")
  if ( $0 != "" ) {
    for (i=1; i<=NF; i++) {
      if ( $i ~ /[a-z]/ ) {  # $1 is name
        name=$i
      }
      else {                 # $1 is number
        array[name]=array[name]+$i
        num_count[name]=num_count[name]+1
      }
    } #for i END
  } #if END
}
END {
for (i in array)
  printf("%s = %.2f\n",i, array[i]/num_count[i])
}
執行結果:


 

2016年12月23日 星期五

UNIX入門課程1051_ex8

http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-1051.html

作業八: figure out the average and the max three (awk programming)
跟作業六一樣, 但改用 awk 來寫.
請全用 awk 來寫, 不要混用 sh 或 sed.
請寫成一個 script file, 並設定成可執行.
input 的 data 內可能有 comment.

$ cat k1
10 20 30 #this is a comment
8 7
# this is also a comment
2
$ ./ex8.awk k1
the max three are: 30 20 10
the average is   : 12.83
$

解答:

#!/usr/bin/awk -f
BEGIN {
}
{
  sub(/#.*/ , "")
  if ( $0 != "" ) {
    for (i=1; i<=NF; i++) {
      num[count]=$i
      sum+=$i
      count++
    } #for END
  } #if END
}
 
END {
  asort(num) #sort num[] array
  printf("the max three are: %d %d %d\n",num[count],num[count-1],num[count-2])
  printf("the average is   : %.2f\n",sum/count)
} 

注意:程式中asort函數在GNU awk 3.1才有提供


執行結果:



2016年12月16日 星期五

UNIX入門課程1051_ex7

http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-1051.html

作業七: figure out the average for each user(sh programming)
$ cat ex7-k1
klim 10 20 30 milk 199 
oak 100 red 200 10
joe 199 20 marry 20 julie 2000
$ ./ex7.sh < ex7-k1
klim = 20.00
milk = 199.00
oak = 100.00
red = 105.00
joe = 109.50
marry = 20.00
julie = 2000.00
$

解答:

#!/bin/bash
function AVERAGE () {
  avg=$(echo "scale=2; $2/$3" | bc)
  echo "$1 = $avg"
}
function DATA () {
  #if [[ $1 != [0-9]*  &&  -n $1 ]]; then
  if [[ $1 =~ [a-z]+  &&  -n $1 ]]; then
    #echo "name:$1"
    name[index]=$1
    let index+=3
    sum=0
    count=0
  else
    let sum=sum+$1
    if [ ! -z $1 ]; then
      let count++
    fi
      name[index-2]=$sum
      name[index-1]=$count
  fi 
}
index=1
while read line
do
  if [ "$line" != "" ]; then
    set $(echo $line)
    field=$#    #*** $# is field count
    for ((i=1; i<=field; i++))
    do
      #echo "data:$1"
      DATA $1
      shift
    done
  fi
done #while END
for ((i=1; i<=index-3; i=i+3))
do
  #echo "Name:${name[$i]}  sum=${name[i+1]}  count=${name[i+2]}"
  AVERAGE ${name[$i]} ${name[i+1]} ${name[i+2]}
done

執行結果:




2016年12月6日 星期二

UNIX入門課程1051_ex6

http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-1051.html

作業六: figure out the average and the max three (sh programming)
寫一個 sh 的 program, 算出所有數字的平均及最大的三個數
數字從檔案讀入(若有給檔名的話), 或是從 keyboard 讀入(即 stdin, 若沒給檔名的話).
平均數要算到小數第二位.
若數字的個數小於三個, 則補 0.

$ cat k1
10 20 30
8 7
2
$ ./ex6.sh k1
the max three are: 30 20 10
the average is   : 12.83
$ cat k2
888 2
30
11 222
$ ./ex6.sh k1 k2
the max three are: 888 222 30
the average is   : 111.81
$ ./ex6.sh
1 2 3
4
5 6
the max three are: 6 5 4
the average is   : 3.50
$


解答:
#!/bin/bash
#calc average function
function AVERAGE () {
    avg=$(echo "scale=2; $1/$2" | bc )
    #echo "the average is   : $avg"
}
#bubble sort function
function SORT() {
    for ((i=0; i<count; i++))
    do
        for ((j=i; j<count; j++))
        do
            if [ ${data[j]} -gt ${data[i]} ]; then
                let temp=data[j]
                let data[j]=data[i]
                let data[i]=temp
            fi
        done
    done
}

if [ -z $1 ]; then  #manual input
  while read line
  do
    if [ "$line" != "" ]; then
      #set $(echo $line | tr : ' ')
      set $(echo $line)
      field=$#
      for ((i=1; i<=field; i++))
      do
        data[count]=$1
        let sum+=$1
        let count+=1
        shift
      done
    else
      break
    fi
  done<&0  
else  #file(s) input
  total_file=$#
  for ((i=1; i<=$total_file; i++)) #file name put in f[] array
  do
    f[i]=$1
    shift
  done
  for ((j=1; j<=$total_file; j++))
  do
    exec<"${f[j]}"
    while read line
    do
      set $(echo $line)
      field=$#
      for ((i=1; i<=field; i++))
      do
        data[count]=$1
        let sum+=$1
        let count+=1
        shift
      done
    done
  done #for END
fi
SORT #Run Bubble sort function
echo "the max three are: ${data[0]} ${data[1]} ${data[2]}"
AVERAGE $sum $count #Run calc average function
echo "the average is   : $avg"
執行結果:


 

2016年11月25日 星期五

UNIX入門課程1051_ex5

http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-1051.html

作業五: shell programming(for, if)
寫一個 shell 程式, 把參數中最大的數印出來.
For example:
$ ./ex5.sh
./ex5.sh numbers
$ ./ex5.sh 8 -1 9
9
./ex5.sh 8 -1 9 11 3 4
11
$


解答:

#!/bin/bash
max=0     #set default Max value
field=$#  #total arg 
  for ((i=1; i<=field; i++))
  do
    if [ $1 -gt $max ]; then
      max=$1
    fi
    shift
  done
echo $max


執行結果:


 

2016年10月29日 星期六

Ubuntu MATE XRDP 設定

首先,用apt-get 指令下載並安裝xrdp server套件: Server

1. 輸入: apt-get install xrdp 或是到 Ubuntu 軟體中心搜尋 xrdp 並執行安裝:

ubuntu_softwarecent_xrdp.jpg

2. 編輯 /etc/xrdp/xrdp.ini 檔案,在檔案最後加上下面的敘述
name=Active Local Login
lib=libvnc.so
username=
password=ask
ip=127.0.0.1
port=5900

ubuntu_mate-xrdp.jpg
3. 重啟xrdp server server xrdp restart Client端 如果沒問題就到client端設定RDP的連線:
 這裡我設定顯示螢幕是1280x720,色彩深度可以用低一點24bit,畢竟並不是用來做繪圖功
能,填上帳號密碼即可。
osx_rdp_client.jpg
我在OSX的電腦利用RDP來執行遠端 Ubuntu mate 的連線就完成了。

osx_rdp_client-2.jpg

您可以參考:
Debian 8 XRDP 設定
ubuntu XDMCP 設定

 

2016年6月11日 星期六

VMware Ubuntu 與OSX 共享資料夾

利用 VMware 將 Linux 裝好後最重要的就是資料間的共享,要達到這目的有很多方法,像是安裝Samba,或是利用SSH,最簡單的就是用VMware 的Sharing 功能了。設定的步驟如下:
Linux版本為:lubuntu 16.04
VMWare版本為:VMware Fusion 8.0

一. OSX 端設定 (1).首先點選 VMware Settings 功能,然後會出現視窗,按下Sharing vmware_shar-1.jpg (2).選擇將要分享的資料夾,並將 Enable Shared Folder 打勾,當然分享的目錄也要勾起來。vmware_shar-2.jpg 二.執行 Ubuntu 後,點選 Virtual Machine,然後選擇 Reinstall VMware Tools (通常VMware安裝後
 是不會安裝VMware Tools的)。
vmware_tool_install-1.jpg

(3). 接著會掛載一個 WMware Tools 的檔案在桌面。

vmware_tool_install-2.jpg
(4). 用滑鼠點選執行 WMware Tools ,將壓縮檔解壓縮後放在自己的家目錄。vmware_tool_install-3.jpg
(5). 打開終端機,家目錄下會有一個 vmware-tools-distrib 的目錄,執行 vmware-install.pl 接著會出現一些提問,就按下Enter 用內定值即可。vmware_tool_install-4.jpg

(6). 結束後打開檔案管理員,到 /mnt/hgfs 目錄下應該就可以看到 步驟(2) 所分享的資料夾,如此一來OSX與Linux的檔案共享就方便多了。
vmware_tool_install-5.jpg
你可以參考:
1. Virtual Box 設定分享資料夾


ubuntu XDMCP 設定

今天來試一下 Mac OSX 透過 XDMCP 協定與 ubuntu 連線

1.Server端設定 (使用環境: Ubuntu-16.04):

先到 cd /etc/lightdm 目錄下,增加一個檔案 lightdm.conf,內容是:
[SeatDefaults] 
xserver-allow-tcp=true
greeter-show-remote-login=true
[XDMCPServer] enabled=true port=177

Ubuntu 16.04 預設安裝的桌面環境是 lightdm ,設定也是上網查了才知道的。lightdm.jpg

重新啟動 lightdm #service lightdm restart 檢查port 177 是否打開
#netstat -tupln | grep 177
  lightdm_check.jpg

2. Client端: 執行OSX的X11 應用程式,輸入
Xnest -query 192.168.171.132 -geometry 800x600 :1
或是:
Xephyr -query 192.168.171.132 -screen 800x600 :1

  X11_Xnest.jpg

遠端 lubuntu 的桌面就會顯示在 OSX的桌面上:

x11_xnest-1.jpg

輸入帳號密碼後就可以透過 XDMCP 協定來進行遠端控制了。

x11_xnest-2.jpg

您可以參考這兩篇: