《大人學選擇:成熟大人的獨立思考術》筆記與心得

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

如同此書前言所說:「選擇是一件很難的事!」所以我們需要一些客觀的判斷方法,例如底下節錄書中的十個原則:
  1. 那一個選項可以讓未來的機會增加。
  2. 不要因為害怕、恐懼、或困難而做出抉擇。
  3. 不要在憤怒或不平的時候做出決定。
  4. 預想最壞的情況會怎麼樣,並預做準備。
  5. 計算成本,尤其是機會成本。
  6. 難以決定時,嘗試把狀況推到極端。
  7. 還是很難選擇時,逼自己做些小實驗。
  8. 無論如何,不要盲從與跟風。
  9. 有機會,多學習別人的選擇邏輯。
  10. 選錯沒關係,要有軸轉或停損的勇氣。
此書總共有六個章節,從第一章「職涯發展的選擇」到第五章「人生伴侶的選擇」以及第六章「總結」,而本文只會紀錄前兩章的心得與筆記。

職涯發展的選擇
問及這個問題時:「您期待從目前的職場上獲得什麼樣的報酬?」
很多人的第一個答案通常是「$$$」(這非常務實啊!)
但回答此問題之後,請再自問:「N年後,你想靠什麼賺錢?!」
「以錢滾錢嗎?」 ==> 就算這樣,也得想出一個可行的長期策略啊!

「一個理想的職涯選擇,有兩件事很重要:一是槓桿,二是彈性。槓桿讓你每一分的投入,能獲得一分以上的回報,至於彈性,則強調每個選擇都該讓你的路越來越寬廣,而非越來越狹窄 。」最關鍵的也最簡單的一句話就是:「選擇的關鍵,不在你現在年薪多少,而是自問10年之後,你想靠什麼賺錢!」

跳脫職涯困境的五種方法:
  1. 迷惘的時候,就做些小實驗。
  2. 除非很篤定,否則別念太多書。
  3. 實在不喜歡,絕對不要硬撐。
  4. 不確定是否喜歡時,請多試一會兒。
  5. 人生就像衣服,訂做的才貼身。

上班也好,創業也罷,獨立存活才是關鍵!
工作的本質其實非常單純,就是:「透過幫助他人,換取生活所需,彰顯自我價值。」
此書作者在這一小節裡預估未來職場上會出現幾種趨勢以及建議我們訓練自己成為以下四種角色之一:「投資者」、「企業主」、「自雇者」、「專業明星」。

此章接下來的幾個小節,作者說明自己對底下幾點的看法:
  1. 工作上的責任歸屬。
  2. 遇到空降而來的新主管,有什麼選擇。
  3. 對工作厭倦時,離職外還有什麼選擇。
  4. 壯遊是職場卡關時的好選擇嗎?
  5. 轉職是為了追尋理想,還是為了逃避?
  6. 何時才是正確的轉職時機。
  7. 在轉職與創業時,如何獲得父母的支持。
針對作者的上述七點看法,筆者沒有做紀錄是因為筆者本身不是工作的新鮮人,所以就快速瀏覽過去,就不會特別地想做紀錄。

人生態度的選擇
常有人說:「態度決定高度。」若您是贊同這一說法的人,請您也看看這篇文章:職場輕鬆談-【態度決定高度,格局決定結局,做自己喜歡做的事,並不等於做正確的事】。此文章說明了有時候態度不能帶你往更高處發展。切記、切記、切記。

讓自己容易快樂的五個生活態度:
  1. 選擇那個讓你更自由的選擇。
  2. 訓練自己不依賴他人。
  3. 對別人好,但不要預期回報。
  4. 預設最壞的狀況,不過度樂觀。
  5. 從哪裡跌倒,就從哪裡爬起來。
筆者覺得第一點:「選擇那個讓你更自由的選擇。」是關鍵,也特別重要。人生的路要越來越寬廣,自由度也要越來越高,於是在選擇上,不應該為了短期的利益而犧牲掉長期的自由度。例如跟健康有關的事物時,千萬要慎思。想當個爆肝工程師是各自的自由,若因為健康出現了狀況,而無法享受到自己所收割的果實時,您會有何感想呢?而第二點到第四點,筆者認為是風險管理的問題。而第五點就是「從失敗中學習,累積失敗的經驗,以確保下次出現同樣的問題時,可以從容應對。」

第二章接下來的幾個小節,對底下幾點,作者提出自己看法與一些小故事:
  1. 讓我頓悟人生的兩個祕密。
  2. 順勢而為與去人多的地方。
  3. 順勢而為不去人多處的思考點。
  4. 該怎麼選擇人生的分岐道路。
  5. 如何處理「可惜」的心態。
  6. 建立個人思維模型。
  7. 獨立思考,從懷疑開始。
  8. 看新聞的必備態度。
不論您的人生態度是「宿命論」還是「因果論」,很多時候,自己想要什麼東西、做什麼事,自己要慢慢探究出來,而不是「盲從」或是因為傳統習慣而「堅持己見」。書中舉了一則預言故事:「上帝派天使來拯救的故事」來說明。總之,人生態度要積極與有彈性:「目標要堅守,手段要靈活。」

除了態度之外,還要培養出自己的一套思維模式,此思維模式必須是「批判性思考」。而什麼是「批判性思考」,可參考底下影片:

最後,筆者非常贊同作者的這句話:「新聞不是不能看,而是要用腦看!
為什麼呢?
這就請讀者自己找出答案囉。

麥昆智能小車試玩 (Meet Maqueen micro:bit Robot Platform)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

感謝雲造中心提供筆者這台智能小車。包裝盒如下圖:

內容物如下:
 

組裝方式可參考宇宙機器人麥昆小車教學文。不過因為實在太容易了解,筆者就直接組裝囉,真的很快就組好了,組好的圖如下:

組好後,當然要來玩玩程式部分囉。首先開始MakeCode編輯器:https://makecode.microbit.org/#editor,並增加Maqueen擴展:https://github.com/jhlucky/maqueen



寫了個簡易避障程式:


測試影片:

麥昆小車不只容易組裝而已,積木程式也好設計。此外,因為馬達的電源是獨立,這樣在燒錄程式時,車子才不會亂跑啊!!!

參考資料:
https://wiki.dfrobot.com/micro:Maqueen_for_micro:bit_SKU:ROB0148-E(ROB0148)

用Python開發micro:bit應用程式(Developing micro:bit applications with Python)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此篇文章將介紹如何用Python程式語言來開發micro:bit的應用程式。所需要的材料就是一片micro:bit以及底下線上或離線版的開發環境之一。

線上開發環境(Online Python)
使用瀏覽器開啟線上版開發環境(Online Python Editor):https://python.microbit.org/v/1.1。開啟來的畫面如下圖:


離線版開發環境(Offline Python)
這裡會使用Mu Code Editor來開發micro:bit的應用程式。此外讀者也可以考慮使用陳會安老師所開發的Micro:bit Python編輯器中文離線版

Mu Code Editor的畫面如下:


Micro:bit Python編輯器中文離線版的程式碼編輯畫面如下:

Micro:bit Python編輯器中文離線版的模擬器畫面如下:


筆者就使用兩顆按鈕做個小動畫的練習。
按下按鈕A時,小球往左跑。
按下按鈕B時,小球往又跑。
兩顆按鈕都沒按時,畫面出現愛心。

看一下測試影片囉:


參考資料:

APCS:C與C++的開發工具 Code::Blocks 的使用

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

因為現行的APCS檢測環境系統是使用Code::Blocks當作C/C++的開發工具,而Code::Blocks是有Windows版本的,安裝部分可參考「[C/C++] Code::Blocks 輕巧的整合式開發環境」,也可參考由CHAWTeam所提供的教學影片。

下載頁面在此http://www.codeblocks.org/downloads/26若不知道要下載哪個版本時,請下載 codeblocks-17.12mingw-setup.exe 這個版本。


寫程式難免都會遇到要對程式除錯的時候。此時,像Code::Blocks這類的整合開發工具(IDE)都
會提供除錯的功能。針對如何使用Code::Blocks來除錯,可以參考詳細教學文章「HOW TO USE THE CODE::BLOCKS DEBUGGER WITH C PROGRAMMING」。或是底下兩個影片:




Python 程式設計開發環境介紹

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python語言本身是直譯式的,也就是使用直譯器(interpreter)將Python程式碼轉換成機器碼(Machine Code),轉換過程可以參考這篇文章:Python 的底層架構。有了Python Interpreter就可以來寫程式了,而Python Interpreter可從官網下載 https://www.python.org/downloads/。但這樣子的方式不好除錯,所以就有了整合開發工具的出現,例如SpyderPyCharmIDLEJupyterVisual Studio Code等。底下就介紹筆者用過的一些開發環境。

IDLE
這個是從https://www.python.org/downloads/下載後,安裝好就會有的內建軟體。使用方式可參考底下影片。或是這篇教學文章:「利用IDLE簡易開發環境」。



Anaconda
Anaconda是一套Python Data Science的懶人包平台,包含很多的package,例如SpyderJupyterVisual Studio Code都可以從Anaconda安裝並執行。安裝方式可參考「Anaconda介紹與安裝教學」或是「Anaconda安裝

Visual Studio Code
Visual Studio Code是微軟開發的開源(Open Source)專案,本身是個編輯器,採外掛的方式來支援多種程式語言,Python程式語言也是其中之一。安裝部分可參考「Python in Visual Studio Code」或「Python Journey (2) - VS Code 基本使用技巧」。也可參考底下影片


線上Python IDE
若不想安裝一堆軟體在自己的電腦上,可考慮線上版的開發環境,此部分可參考紀老師程式教學網的「建構Python的開發環境」與「repl.it 雲端開發環境影音簡介」、Python 環境 — repl.it寫程式用的雲端 IDE等文章。

APCS 檢測系統環境導覽

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本篇文章是根據APCS官網檢測系統環境(https://apcs.csie.ntnu.edu.tw/index.php/info/environment/)來建立環境。建立好後,登入畫面如下:

看起來有提供範例程式,以及相關程式語言的開發環境,而根據官網的說明,會提供底下軟體:

那筆者就來實際測試看看囉。首先略過不是關注的重點:OS和Desktop。

Editors
點選桌面的Leafpad圖示,並開啟 P3.cpp 檔案。


開啟LXTerminal,並執行Vim。

看來 Editor 是沒問題的。

Languages
下圖適用指令的方式列出C、C++、Java、Python語言版本。

這也沒問題。

IDE
IDE是軟體開發者常用的工具,用IDE才有機會方便除錯,先試試支援最多程式語言的Eclipse,版本為 https://www.eclipse.org/downloads/packages/release/oxygen/3。預設是Java語言。

筆者從Create New Project找看看有沒有除了Java以外的C、C++、Python專案。

發現沒有支援Java語言之外的C、C++、Python專案。要如何使用Eclipse 來做Java除錯,可參考這篇:eclipse-執行-debug-除錯模式

再來是支援C、C++的Code::Blocks

Code::Blocks的除錯方式可觀看這部影片。或是這篇教學文章:CodeBlock除錯


最後是Python語言用的IDLE。

IDLE的除錯方式可參考這篇:如何使用IDLE進行除錯

結言:
要考APCS的人,一定要先知道考場提供了那些軟硬體,以免上考場時,不知道怎麼操作,那就尷尬啦!

將樹莓派當成Wifi路由器(Raspberry Pi Become a Wifi Router)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本文介紹如何將樹莓派變成一個Wifi路由器。

步驟一:Install the router software
sudo apt-get install isc-dhcp-server


上圖是顯示DHCP server啟動失敗,不會影響後續的安裝與設定。

安裝 HostAPD
wget https://github.com/jenssegers/RTL8188-hostapd/archive/v1.1.tar.gz
tar -zxvf v1.1.tar.gz
cd RTL8188-hostapd-1.1/hostapd
sudo make
sudo make install

步驟二:Configure the ISC-DHCP-Server
執行底下指令來修改 ISC-DHCP Server的設定檔,當然可以使用其他的文字編輯器來操作:
sudo nano /etc/dhcp/dhcpd.conf

註解底下兩行:
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

取消此行的註解:
#authoritative;



將下面的設定值複製到/etc/dhcp/dhcpd.conf 檔案的結尾。
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.100 192.168.10.200;
option broadcast-address 192.168.10.255;
option routers 192.168.10.1;
default-lease-time 600;
max-lease-time 7200;
option domain-name "local-network";
option domain-name-servers 8.8.8.8, 8.8.4.4;
}



修改/etc/default/isc-dhcp-server
sudo nano /etc/default/isc-dhcp-server

更新 INTERFACES=""INTERFACES="wlan0"


關閉WLAN
sudo ifdown wlan0

設定DHCP Server
sudo nano /etc/network/interfaces

此檔案的內容如下:
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.10.1
netmask 255.255.255.0
#auto wlan0
#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
up iptables-restore < /etc/iptables.ipv4.nat



設定 HostAPD
sudo nano /etc/hostapd/hostapd.conf

修改ssid與password
Change the parameter “ssid=wifi” to the SSID wifi name you want
and the parameter “wpa_passphrase=YourPassPhrase” to your own password.


啟動 NAT功能
開啟設定檔:
sudo nano /etc/sysctl.conf

將下面這一行加到檔案的結尾處:
net.ipv4.ip_forward=1



將ip forward的功能啟用:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

啟動無線網路:
sudo ifup wlan0

設定ethernet (eth0) 與wireless card (wlan0) 之間的 port 轉換:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

啟動無線路由器:
sudo service isc-dhcp-server start
sudo service hostapd start



開機自動啟動Wifi Router:
sudo update-rc.d hostapd enable
sudo update-rc.d isc-dhcp-server enable
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

若出現「update-rc.d: error: no runlevel symlinks to modify, aborting!」時請執行底下指令
sudo ln -s /etc/init.d/hostapd /etc/rc2.d/S02hostapd
sudo update-rc.d hostapd enable
sudo update-rc.d isc-dhcp-server enable
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

註:可使用底下指令來還原網路設定。
up iptables-restore < /etc/iptables.ipv4.nat



此時即可執行 sudo reboot 來重開 Raspberry Pi做測試。

讀書筆記:深入淺出設計模式 (HEAD FIRST DESIGN PATTERNS)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此文為筆者在閱讀【深入淺出設計模式(Head First Design Patterns) 」一書所作的筆記。

設計模式種類:
策略模式(Strategy Pattern):定義演算法家族,個別封裝起來,讓它們之間可以交互替換,此模式讓演算法的變動,不會影響到使用演算法的程式。

觀察者模式(Observer Pattern)出版者 + 訂閱者 = 觀察者模式。『觀察者模式』定義了物件之間的一對多關係,如此一來,當一個物件改變狀態,其他相依者都會收到通知並自動被更新。

裝飾者模式(Decorator Pattern)動態地將責任加諸於物件上。若要擴充功能,裝飾者提供了比繼承更有彈性的選擇。

工廠方法模式(Factory Method Pattern)定義了一個建立物件的介面,但由次類別決定要實體化的類別為何者。工廠方法讓類別把實體化的動作,交由次類別進行。

抽象工廠模式(Abstract Factory Pattern)提供了一個介面,建立相關或相依物件之家族,而不需要明確指定具象類別。

獨體模式(Singleton Pattern)確保一個類別只有一個實體,並給它一個存取的全域點(global point)。

命令模式(Command Pattern)將「請求」封裝成物件,以便使用不同的請求、佇列、或者日誌,參數化其他物件。命令模式也支援可復原的作業。

轉接器模式(Adapter Pattern)將一個類別的介面,轉換成另一個介面以供客戶使用。轉接器讓原本介面不相容的類別可以合作無間。

表象模式(Facade Pattern)提供了一個統一的介面,用來存取次系統中的一群介面。表象定義了一個較高層次的介面,讓次系統更容易使用。

樣板方法模式(Template Method Pattern)將一個演算法的骨架定義在一個方法中,而演算法本身會用到的一些方法,則是定義在次類別中。樣板方法讓次類別在不改變演算法架構的情況下,重新定義演算法中的某些步驟。


設計守則:
    一、找出程式中可能需要更動之處,把它們獨立出來,不要和那些不需要更動的程式碼混在一起。把會變動的部分取出並『封裝』起來,好讓其他部分不會受到影響。
『把會變動的部分取出並封裝起來,以便以後可以輕易地擴充此部分,而不影響不需要更動的其他部分。」

    二、寫程式是針對介面而寫,而不是針對實踐方式而寫。

    三、多用合成,少用繼承。

    四、設計時,盡量讓需要互動的物件之間關係鬆綁。

    五、類別應該開放,以便擴充;應該關閉,禁止修改。雖然似乎有點矛盾,但是的確有一些技術可以允許程式碼,在不直接修改的情況下進行擴充。小心地選擇哪些部分以後可能需要被擴充。到處採用開放關閉守則,是一種浪費也沒必要,而且會導致程式碼變得複雜且難以讀取。

    六、依賴抽象類別,不要依賴具象類別。

    七、認識極少化守則「只和你的密友談話」。

    八、好萊塢守則「別呼叫(打電話給)我們,我們會呼叫(打電話給)你。」

在樹莓派上開發微型的作業系統(MiniOS for Raspberry Pi)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

筆者所使用的作業系統:Lubuntu 18.10

環境建立
安裝 Cross Compiler
For Raspberry Pi 2:
sudo apt install gcc-arm-none-eabi

For Raspberry Pi 3:
sudo apt install gcc-aarch64-linux-gnu build-essential

安裝模擬器
sudo apt install qemu-system-arm

第一個程式例子「Hello Uart」
需要分別建立底下的檔案:

  • The kernel entry point「boot.S 」
  • The C code「kernel.c」
  • Tying the pieces together「linker.ld」
  • A special file that contains shell commands「Makefile」


底下就以RPI2與RPI3來當作例子吧。

1. Say "Hello" to RPI2 UART
https://jsandler18.github.io/ 裡,有針對這四個檔案做說明:


若不使用Makefile與make來編譯與執行時,需用底下指令來編譯
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -c boot.S -o boot.o
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -std=gnu99 -c kernel.c -o kernel.o -O2 -Wall -Wextra
arm-none-eabi-gcc -T linker.ld -o myos.elf -ffreestanding -O2 -nostdlib boot.o kernel.o

以及底下指令來執行
qemu-system-arm -m 256 -M raspi2 -serial stdio -kernel myos.elf

而在kernel.c的程式碼中有用到memory mapped IO 的觀念,這部份可參考此網頁的說明 https://jsandler18.github.io/extra/peripheral.html

於是筆者將程式修改成會輸出中文字,如下圖:

讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI2/tree/master/helloUart


2. Say "Hello" to RPI3 UART
樹莓派3需要底下幾個檔案:

  • start.S(等於前述RPI2的boot.S)。
  • main.c、gpio.h、uart.c、uart.h(等於將前述RPI2的kernel.c模組化)。
  • link.ld(等於前述RPI2的linker.ld)。
  • Makefile。


讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI3/tree/master/01helloUart1

入門的資訊就介紹到這兒,若想深入了解本文其他部份以及其他主題(如Processor initialization、Framebuffer、Interrupts、Processes等)請自行參考相關資料[1][2][3]。下圖就是Framebuffer的例子。(註:由GIMP可以輸出給framebuffer 用的 header file。)