網頁

2018年3月26日 星期一

LISP Programming 1062_ex3

http://erdos.csie.ncnu.edu.tw/~klim/scheme/lisp-1062.html

exercise 3: linear recursive and linear iterative
Refer to exercise 1.11 but the formula is changed to
  f(n) = n if n < 3
  f(n) = 2*f(n-1) + f(n-2) + f(n-3) if n ≥ 3 and n is even
  f(n) = 2*f(n-1) - f(n-2) + f(n-3) if n ≥ 3 and n is odd
Note that you have to write two procedures. One is written
in recursive way and another in linear iterative way.

解答:
;f by means of a recursive process
(define (f-res n)
    (if (< n 3)
        n  ; n<3 , f(n)=n
        (if (odd? n)
            (+ (- (* 2 (f-res (- n 1))) 
               (f-res (- n 2))) 
            (f-res (- n 3))) ; n is odd
            
            (+ (+ (* 2 (f-res (- n 1))) 
               (f-res (- n 2))) 
            (f-res (- n 3)))))) ; n is even
(define (f n)
    (f-res n))

執行結果:
 
 

2018年3月22日 星期四

無法連接iCloud解決方法


這幾天Mac開機後會出現"無法連接iCloud"訊息(如上圖)並導引到系統偏好設定去輸入密碼,解決的方式如下:

1. 開啟系統偏好,點選iCloud。

2. 點選 帳號詳細資訊

3. 點選 安全性,然後下面有開啟雙重驗證,點選後要求輸入電話號碼,之後會傳驗證碼簡訊到手機,將驗證碼輸入即可。

參考資料:
Apple Support



2018年3月21日 星期三

Ubuntu 16.04 R語言安裝

唸數學系的兒子這學期有修R語言,雖然系上有在上學期末短暫的教導用VirtualBox安裝Ubuntu,不過對於初接觸Linux的人來說還是太生疏了。R語言是統計分析的利器,目前是開源可以安裝在Windows,Linux,MacOSX等作業系統,這邊我用Linux 的Ubuntu 16.04 來講解R語言安裝方式及IDE的安裝方式。

1. 安裝R:
安裝R語言可以在Ubuntu環境下使用終端機下:
$ sudo apt-get install r-base
來安裝是最簡便的,安裝完成後在終端機輸入R即可執行。
如果需要IDE整合環境就必須安裝RStudio



2.安裝R Studio:
先到官網下載安裝包:
https://www.rstudio.com/products/rstudio/download/#download

Ubuntu 對應的檔案是 RStudio 1.1.442 - Ubuntu 12.04-15.10/Debian 8 (64-bit) 這個壓縮檔。
下載後解壓縮:
$tar -zxvf rstudio-1.0.136-amd64-debian.tar.gz


接著cd rstudio-1.0.136/bin 目錄下執行 ./rstudio
會出現下面的訊息:
rstudio: error while loading shared libraries: libgstreamer-0.10.so.0: cannot open shared object file: No such file or directory


原因是缺少libgstreamer-0.10.so.0libgstapp-0.10.so.0

可用apt-file命令來尋找缺少的檔案
Ubuntu內定是沒有安裝apt-file的,所以要先安裝
$sudo apt-get install apt-file
$sudo apt-file update


接著用 apt-file 尋找 libgstreamer-0.10.so.0 所對應的文件
$apt-file search libgstreamer-0.10.so.0
libgstreamer0.10-0: /usr/lib/x86_64-linux-gnu/libgstreamer-0.10.so.0 
libgstreamer0.10-0: /usr/lib/x86_64-linux-gnu/libgstreamer-0.10.so.0.30.0
用apt-get來安裝尋找到的對應檔 installlibgstreamer0.10-0
sudo apt-get install libgstreamer0.10-0


缺少libgstapp-0.10.so.0的方法同上
$apt-file search libgstapp-0.10.so.0
libgstreamer-plugins-base0.10-0: /usr/lib/x86_64-linux-gnu/libgstapp-0.10.so.0
libgstreamer-plugins-base0.10-0: /usr/lib/x86_64-linux-gnu/libgstapp-0.10.so.0.25.0

接著執行 ./rstudio 就可以有IDE整合環境了。 (如下圖)
以前學習R語言是沒有這環境的,為了提升開發效率才發展了這套工具,現在學生真的是蠻幸福的。





2018年3月18日 星期日

春天的尾巴

新竹市東南街239巷沿著汀甫圳這一段的櫻花這幾年櫻花開得茂盛,只要盛開的時候總會吸引很多人前來拍照打卡,因此現在便成了著名的景點,又有人稱作櫻花巷。
粉嫩的景緻讓人不得不陶醉其中。


櫻花巷。富士櫻

Kodak Portra 800++ 濾鏡

Kodak Portra 800++ 濾鏡

Kodak Portra 800++ 濾鏡


LISP Programming 1062_ex2

exercise 2: improving the good-enough?
Refer to exercise 1.7

解答:
;exercise 2: improving the good-enough?
(define (average x y)
    (/ (+ x y) 2))
(define (improve guess x)
    (average guess (/ x guess))
)
(define (good-enough? old-guess new-guess)
    ;(> 0.01 (/ (abs (- new-guess old-guess)) old-guess))
    (< (/ (abs (- new-guess old-guess)) old-guess) 0.01)
)
(define (sqrt-iter guess x)
    (if (good-enough? guess (improve guess x))  ;調用新的good-enough?
        (improve guess x)
        (sqrt-iter (improve guess x) x)
    )
)
(define (sqrt x)
    (sqrt-iter 1.0 x))


執行結果:

2018年3月12日 星期一

LISP Programming 1062_ex1

exercise 1: figure out the sum of squares of the minimum two arguments
Write a procedure named 'sum-of-square-min-two' which accepts three  
arguments and will figure out the sum of squares of the minimum two
arguments. 
$ scheme48
> ,load ex1-sum-square-min-two.scm
> 
> (sum-of-square-min-two 1 2 3)
5
> (sum-of-square-min-two 1 2 -3)
10
> (sum-of-square-min-two 2 2 2)
8
> ,exit
$

解答:
;figure out the sum of squares of the minimum two arguments 
(define (square x)
      (* x x))
(define (min-two-square a b c)
    (if (<= a b)
        (if (<= b c)
            (list (square a) (square b))
            (list (square a) (square c)))
        (if (<= a c )
            (list (square b) (square a))
            (list (square b) (square c)))))
(define (sum-data x y)
    (+ x y))
(define (sum-of-square-min-two a b c)
    (apply sum-data (min-two-square a b c)))


執行結果:
 

認識Scheme

   兒子大二下學期程式設計選了一門"LISP程式設計",這門課選用的語言是 Scheme,
是 LISP 的其中一個方言,應該對大多數人都蠻陌生的吧,因為它的確不是業界主流的程式
語言。老實說,我比較希望他能選一些Python或是Java的課程,畢竟將來是要靠這些"吃飯"的。

   剛剛有提到Scheme是LISP的方言,是1975年誕生於MIT人工智慧實驗室的一門程式語言。
那Scheme是一個怎麼樣的程式語言呢?
簡單來說Scheme是一種函數語言程式,意思是說,盡量把所有的函數都想成/寫成數學上的函數。
如果說Python 裡所有東西都是物件;那Scheme裡所有東西都是函數。

   約耳談軟體在2005年曾發表過一篇《The Perils of JavaSchools(爪哇學校的危害)》,
就談到不少 Java 不適合作為「First Programming Language」的問題,如果 Java 不適合
初學者,那有什麼更好的語言適合教學嗎?Joel Spolsky 的建議是 Scheme,這個主要用於
人工智慧領域的古老程式語言,Scheme 當時是 MIT 等多所名校 Computer Science 系所
的必修課程。而他們所使用的教材就是這本「SICP」。
(註:MIT 之所以從 SICP 轉換到現在的Python課程編制(2008),是因為他們重新規劃了學習
的主軸。)

  「SICP」是 Structure and Interpretation of Computer Programs 的簡稱,又稱為
魔法書。是當年 MIT 赫赫有名的 6.001,是 EECS 的入門課,而這本書也影響了後續許多 CS 
的教材,甚至影響了很多以寫程式為工作或是以此為興趣的人,MIT電腦科學課程用這本書
當教材足足用了30年。

   相較於C/C++,Python 等等這些主流的語言,教材的資源也相當多,而台灣坊間Scheme 的
資源卻是少之又少,教授上課所用的Scheme 教材是SICP線上英文版,我找來找去發現對岸
的相關簡體書還蠻多的,就買了一本來看看。

為什麼這本書對於「CS 入門」來說具有革命性的意義? 主要有下面兩點:
.只專注一件事:計算的本質
.使用 Scheme 當作主要的語言

   通常,Computer Science 相關的入門課程,可能會花上很多時間在熟悉某個「程式語言」
上面,而不是去了解程式本身;又或者是有了大量的類比,來介紹電腦是個怎麼樣的東西;
但是 SICP 只專注一件事,那就是計算的本質這件事。

程式語言專家、大評論家王垠說:
    編程不過是一門失傳的藝術的別名,這門藝術的名字叫做"思考"。 —— 王垠

   兒子在剛上大學的時候我再三叮嚀他一定要把 C語言學好,因為 C語言學好了再學其他語言就
會非常容易好上手,學習不同語言其實就是換個思考方式來實作;
但如果以為學好C 就一定能學好Scheme嗎? 看看書中的內容比我想像中還要難尤其是遞迴
(Recursion),我們常說"換了屁股就換了腦袋",面對Scheme真的要換個思考(腦袋)方式才
能寫出優雅的程式。

既然這樣就好好的修這門課,試著用不同的思考方式來解決問題吧。
 
L. Peter Deutsch程式設計師說過一段經典名句:
"To iterate is human, to recurse, divine."
有人翻成: 
"遞迴(recurse)只應天上有, 凡人該當用迴圈(iterate)"



2018年3月11日 星期日

Ubuntu 忘記密碼的重置

有時候太多密碼是有可能忘記的,前幾天要使用一台安裝 Ubuntu 的筆電 ,由於太久沒有使用了竟然忘了登入密碼,如果Ubuntu忘記密碼無法登入怎麼辦?  下面是我的方法可以參考。

1. 首先用 LiveCD 開機,選擇 Try Ubuntu MATE

 2. 開啟終端機,輸入 lsblk,看看目前磁碟的分割磁區有哪些,在這例子主要分割是 sda1


3. 接著輸入 sudo mount /dev/sda1 /mnt,將 sda1 掛載到 /mnt 目錄
然後輸入 sudo chroot /mnt,這時提示符號會成為 #
然後輸入 passed root ,更改 root 密碼
如果使用者密碼也需要更改就 passwd user-name







4. 輸入 sudo umount /mnt ,將 /mnt 目錄卸載,重新開機即可。