發表文章

目前顯示的是 8月, 2018的文章

Arduino控制WS2812三色燈條

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 本文用到的材料為: WS2812B LED 燈條 x 1 Arduino UNO x 1 杜邦線公對公 x 3 軟體為 Arduino IDE 1.8.5 搭配 FastLED程式庫 。 安裝 FastLED 程式庫 打開Arduino 的程式庫管理工具(草稿碼 ==> 匯入程式庫 ==> 管理程式庫) 搜尋FastLED 安裝好FastLED就可以看到內建的範例程式 Arduino電路 LED燈條 5V 接 Arduion 5V LED燈條 GND 接 Arduion GND LED燈條 ID 接 Arduion Pin 5 接好電路後,筆者使用【檔案 ==> 範例 ==> FastLED ==> ColorPalette】來試試看,ColorPalette的Demo影片如下: 因為程式裡設定使用 50 顆 LED,所以此燈條沒有全部亮。 參考資料: [1] Guide for WS2812B Addressable RGB LED Strip with Arduino

Python Expressive Puzzlers 8: Does Equal

底下的Java程式會輸出什麼結果? 1 2 3 4 5 6 7 8 public class DosEquis { public static void main ( String [] args ) { char x = 'X' ; int i = 0 ; System . out . print ( true ? x : 0 ); System . out . print ( false ? i : x ); } } 輸出結果會是XX嗎?根據 JLS 15.25 的說明 ( true ? x : 0 ) 的運算結果會是char型別,而 ( false ? i : x ) 的運算結果會是int型別。所以輸出結果為 X88 。 而 Python 只有  < expression1 > if < condition > else < expression2 > 的語法,沒有 Java 的 conditional operator 的語法,於是不會有這樣子的Pitfall。 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 7: Swap

底下兩個Java Class分別會輸出什麼結果? 1 2 3 4 5 6 7 8 public class CleverSwapOne { public static void main ( String [] args ) { int x = 1984 ; int y = 2001 ; x ^= y ^= x ^= y ; System . out . println ( "x = " + x + "; y = " + y ); } } 1 2 3 4 5 6 7 8 9 10 public class CleverSwapTwo { public static void main ( String [] args ) { int x = 1984 ; int y = 2001 ; x ^= y ; y ^= x ; x ^= y ; System . out . println ( "x = " + x + "; y = " + y ); } } CleverSwapOne 會輸出 x = 0; y = 1984 ,而 CleverSwapTwo 會輸出 x = 2001; y = 1984 。為什麼會這樣子呢? 根據 JLS 15.7 的說明 :「Evaluate Left-Hand Operand First」也就是 CleverSwapOne  的執行順序如下: 1 2 3 4 5 6 7 // The actual behavior of x ^= y ^= x ^= y in Java int tmp1 = x ; // First appearance of x in the expression int tmp2 = y ; // First appearance of y int tmp3 = x ^ y ; // Compute x ^ y x = tmp3 ; // L...

「特洛伊木馬病毒程式設計--使用Python」讀後感

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 特洛伊木馬病毒程式設計--使用Python   此書在前言部分就說明, 請以學術研究的角度來看待此書 。這讓筆者想起多年前曾去參加一個資安的活動,內容是說明什麼是buffer overflow、stack overflow、SQL injection 等主題,而近幾年隨著 python 程式語言的流行,也越來越多用 python 來寫一些五花八門功能的程式。 而導讀部分也提到只要權限夠(通常用Kernel mode),用C/C++指標的功能可以存取到特定記憶體位址,進而做一些特異功能。此書透過檔案讀寫、網路功能、執行緒、鍵盤紀錄等四大程式功能來完成一個可收集 Windows User 按了哪幾個鍵盤。 而熟悉如何使用這四大功能的人,大概也不想看這本書了吧!底下列出一些參考資源給有興趣的人去研究。 1. Python File IO 2. Python Network Programming 3. Python Multithreading 4. Python Keylogger 依照這四大功能,此書從網路程式觀念開始慢慢地建立讀者的基本Socket程式觀念,接著說明如何用網路程式來傳送檔案以及通訊協定的介紹。之後,多工程式常用的執行緒上場了。然後就是最後一項功能:鍵盤紀錄(這方法限制在Windows系統上)。 OK,那麼本書的特洛伊木馬病毒程式範例到底是什麼呢?因為本書的範例是在虛擬機器上測試,而且相關的防火牆也需要關閉,也得開啟權限讓程式執行。而 這離真正的木馬程式還有一段路要走 。不過作者也提到,只要將程式修改,或是將觀念融會貫通並實作出來,就有機會越來越接近真實的木馬程式了。 BTW,書中提到一個數字:「1337」,想了解此數字代表什麼意思,請參考 這裡 ]-[3I23 或 那裡 7]-[3I23 。

Python Expressive Puzzlers 6: Multicast

底下的Java程式會輸出什麼? 1 2 3 4 5 public class Multicast { public static void main ( String [] args ) { System . out . println (( int ) ( char ) ( byte ) - 1 ); } } 結果不會是 -1。幸運的是有條簡單的規則來說明:「Sign extension is performed if the type of the original value is signed; zero extension if it is a char, regardless of the type to which it is being converted.」也就是 byte -1  === sign extension ==> char 65535 === zero extension ==> int 65535。 而 Python Built-in type 不多,筆者只試了底下兩行: print ( int ( str ( bytes (- 1 )))) print ( int ( chr ( bytes (- 1 )))) 輸出結果會是什麼呢? 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 5: The Joy of Hex

下面的程式碼會輸出什麼結果? 1 2 3 4 5 public class JoyOfHex { public static void main ( String [] args ) { System . out . println ( Long . toHexString ( 0x100000000 L + 0xcafebabe )); } } 答案當然不會是1cafebabe。這是因為  0xcafebabe  會被擴展成  0x100000000L  的 long 型別,也就是從 int 變成 long。那這會讓  0xcafebabe  變成  0xffffffff cafebabeL  ,原因是因為  0xcafebabe  的最高位元為1,當十六進制與八進制的最高位元為1時,Java會當成是負數來處理,也就是一直補1到左邊的高位元裡。而  0x100000000L + 0xcafebabe  就會變成 0x00000001 00000000L + 0xffffffff cafebabeL 運算結果為  0xcafebabe  。只要將  0xcafebabe  補上L變成  0xcafebabe L  就可以避免這個問題。  那Python呢? print ( hex ( 0x100000000L + 0x cafebabe )) 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 4: It’s Elementary

底下Java程式的執行結果是什麼? 1 2 3 4 5 public class Elementary { public static void main ( String [] args ) { System . out . println ( 12345 + 5432 l ); } } 答案是 17777 。數字1和小寫的L(l)是不一樣的。所以"Java Puzzlers"作者建議如下: 「 Always use a capital el (L) in long literals, never a lowercase el (l).」 在long literals時,請用大寫的L。 那Python呢? print ( 12345 + 5432 l ) 上述片段的Python程式碼是從VS code複製過來的,此IDE幫我們將小寫L標上不同的顏色了! 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 3: Long Division

長整數的處理在每個程式語言都不同,例如我們會預期底下的Java程式碼會輸出 1000 。 1 2 3 4 5 6 7 public class LongDivision { public static void main ( String [] args ) { final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000 ; final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 ; System . out . println ( MICROS_PER_DAY / MILLIS_PER_DAY ); } } 但是結果卻是 5 。這是為什麼呢?Java在處理整數數字時是以 int 的型態來處理的,上述的程式碼雖然有指定用 long 的型態,但是   24 * 60 * 60 * 1000 * 1000  與  24 * 60 * 60 * 1000  都是以 int 的型態來進行運算的。int的最大值為 2147483647 。其中  MICROS_PER_DAY  的結果超過 int 最大值,溢位(Overflow)了。只要將程式改成下面就可以輸出 1000 的結果了。 1 2 3 4 5 6 7 public class LongDivision { public static void main ( String [] args ) { final long MICROS_PER_DAY = 24 L * 60 * 60 * 1000 * 1000 ; final long MILLIS_PER_DAY = 24 L * 60 * 60 * 1000 ; System . out . println ( MICROS_PER_DAY / MILLIS_PER_DAY ); } } "Java Puzzlers"一書提醒讀者:「When working wit...

Python Expressive Puzzlers 2: Time for a Change

這個謎題是跟浮點數(float)有關的議題。請問底下Java程式會出現什麼結果? 1 2 3 4 5 public class Change { public static void main ( String args []) { System . out . println ( 2.00 - 1.10 ); } } 回答是0.9的話,是有問題的。筆者使用 JDK 10 來執行得到的結果為0.8999999999999999。這是為什麼呢?"Java Puzzlers"一書提到「not all decimals can be represented exactly using binary floating-point」也就是用2進位的表示方式無法精準地表示所有的十進位數字。Java可以用BigDecimal 犧牲效能來獲得精確的數值。 1 2 3 4 5 6 7 import java.math.BigDecimal ; public class Change { public static void main ( String args []) { System . out . println ( new BigDecimal ( "2.00" ). subtract ( new BigDecimal ( "1.10" ))); } } 那 Python 的結果呢? 1 print ( 2.00 - 1.10 ) 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 1: Oddity

Python Puzzlers 系列文章皆參考" Java Puzzlers: Traps, Pitfalls, and Corner Cases "一書的內容,轉到 Python 語言中並看看這些陷阱會不會發生。 謎題一:判斷奇數 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Oddity { public static boolean isOdd ( int i ) { return i % 2 == 1 ; } public static void main ( String [] args ) { for ( int i = - 3 ; i <= 3 ; i ++) System . out . println ( i + ":" + Oddity . isOdd ( i )); } } x 此書提到在 java 中,上述的程式碼有1/4的機率會不對,為什麼呢?原因是負奇數 % 2 會得到 -1。例如 -5 % 2 = -1 而 -1 == 1 不成立。那在Python中呢?請執行底下程式就知道結果了: 1 2 3 4 5 6 def isOdd (n): print ( n % 2 ) return n % 2 == 1 for i in range ( - 5 , 5 ): print (i) print (isOdd(i)) 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

VoxelSDK Calibration Wizard on Windows

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 本篇文章介紹如何在Windows平台執行 TI 的 Calibration Wizard For 3DTOF Cameras 程式。所需要的軟體如下: Visual Studio Code (筆者用1.25.1) Python-2.7.12 (筆者用AMD64/EM64T/x64) Qt 5.4 (64-bit) PCL-1.7.2 .(筆者用 PCL-1.7.2-AllInOne-win64-Debug.exe ) Voxel SDK-0.6.11-win64-msvs2017.exe 請在 Visual Stduio Code 安裝 Python extension for Visual Studio Code 。 在安裝Python、PCL、Voxel SDK的過程中請選擇將Add xxx to the system PATH for all users。 Python 的 System Path PCL 的 System Path QT Extras可以不用安裝 VoxelSDK 的 System Path 選擇 PCL資料夾 選擇QT資料夾 下載  https://github.com/3dtof/calibwizard  壓縮檔 將壓縮檔解壓縮,在 Visual Studio Code 中開始此資料夾。 開啟後會見到下圖,其中 CalibrationWizard.py 為主程式。 此時還需安裝相關的python套件,指令如下: python -m pip install --user --upgrade pip python -m pip install  --user  numpy python -m pip install  --user  matplotlib python -m pip install  --user  PySide python -m pip install  --user  pyqtgraph python -m pip i...

使用TextRank演算擷取關鍵字(Using TextRank to Extract Keywords)

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 本文所提的TextRank演算法是參考  Rada Mihalcea 與 Paul Tarau 在 2004所提出的論文"TextRank: Bringing Order into Texts",而此篇論文被引用的次數有逐年增加的趨勢: TextRank的演算法是在已經產生有權重的圖(Weighted Graph)下進行的,如下圖: 上圖裡,線上的數字(例如  自然 <==5==> 語言  為5)是計算【 自然 ,  語言 】兩個詞再語料中共同出現的次數。假設有下面一段文字: 每天|開心|,|天天|開心|。 那所有詞window size為3之間的共現次數(去除stopwords後再計算)如下表: 然後在使用底下公式不斷地迭代。 公式參數說明: d:阻尼係數,通常設定為0.85。 Out(Vj):連出去的節點(node) In(Vj):連進來的節點 WS(Vi):TextRank分數 Wij:節點之間的權重 在論文"TextRank: Bringing Order into Texts"提供了收斂曲線的圖,約20次左右的迭代就會收斂了,如此就可以找出分數比較高的關鍵字了。 參考資料: [1] TextRank — 文字探勘 — 找出關鍵字 以 八卦版標題為例

桌遊DIY:閃靈快手Geistesblitz

圖片
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 前言 閃靈快手是一套適合訓練大腦專注力與反應的桌遊,以第一代為例,遊戲的道具有卡片60張與五種物品,分別為:白鬼、綠瓶、藍書、紅椅、灰鼠。那要怎麼製作這一套遊戲呢?底下說明迷你型的閃靈快手製作方式。 準備材料 卡片60張 ==> 筆者是用【白色卡片紙】或【白色名片紙】 紙箱 ==> 用來製作物品用 紅筆、藍筆、黑筆 剪刀一把 物品製作 本例子使用的物品是: 紅圓 、 黑三 、 藍正 準備好後,用剪刀將紙箱剪出 三角形 、 正方形 、 圓形 各一份。 用 黑筆 將 三角形 上色 用 藍筆 將 正方形 上色 用 紅筆 將 圓形 上色 這樣就製作好遊戲的物品了。 卡片製作 選擇下面一個圖案,在一張白色卡片上畫好。依序將60張卡片給畫好,所有卡片盡量圖案與顏色都不一樣。 這樣子就製作好迷你型的閃靈快手囉。 學生DIY成果 有學生畫出不一樣的圖案,我超喜歡的。 課後思考: 1. 有什麼規則來設計此款遊戲? 2. 其他特殊玩法,例如卡片的圖案是國旗的時候,玩家要怎麼做? 3. 在畫卡片的圖案時,有什麼方式可以讓遊戲擴充到五項物品? 心得: 原本想打算直接用五項物品直接做起,最後決定從三項物品做起,因為卡片設計好的話,可以延伸到五項物品再到九項物品等。