Wednesday, August 31, 2016

Jekyll 一些問題解法

用github架Jekyll 一些問題解法

當一開始使用


的時候,可能會遇到一些問題(其實是我遇到的啦)

jekyll serve not found

這是一個很好處理的問題,因爲你的~/.gem/ruby/{version}/bin資料夾沒有在$PATH路徑下。加上去就可解決了。

缺少bundler

大概的error如上。處理方式很簡單,就是安裝bundler。



這樣就解決了。
如果還有以下錯誤:
resolver.rb:356:in `block in verify_gemfile_dependencies_are_found!': Could not find gem 'jekyll-sitemap' in any of the gem sources listed in your Gemfile or available on this machine. (Bundler::GemNotFound)
則多下一行指令:
$ bundle install --path vendor/bundle

invalid date ...YAML..

跑jekyll serve的時候可能會有噴出一堆如下的錯誤。


處理方法稍微麻煩一點。找到repo底下的_config.yml檔案,在約第五行
...
...
...exclude:[......,"vendor"...]
的exclude中加入vendor。

一些asset link出錯

我自己在架的時候他的一些bootstrap的css和js檔案link不到,原因是它要link的連結在
assets/themes/bootstrap-3下,但其原本目錄並沒有這個子目錄,所以在assets/themes下建立bootstrap-3,並將原本的bootstrap移到底下。



Wednesday, August 24, 2016

HackNTU2016小小心得

HackNTU2016小小心得

其實我本身已經去過去年(2015)的HackNTU了,所以這篇文章會稍微比較這兩年。HackNTU為台灣規模最大的hackthon,但其核心價值已經逐漸遠離黑客松的"合作"、"效率"、"有用"、"有趣"的精神了。hackNTU逐漸變成一種比賽,創業比賽。我個人認為有好有壞。好處讓hacker可以更有商業頭腦,除了設計搞怪小東西外,還可以走進市場,同時,由於評審來自商業界,有種吸引創投的fu。壞處當然就是過度商業化得黑客松已經變成創業松,一堆人拿早就跑很久的專案進來投,失去了黑客松該有的短期高效合作模式,另外過度傾向賺錢,偏離了其實這是一個技術性活動,一些不好的事情就這樣發生了:"簡報松"、"不會coding只做簡報拿獎"、"SetTimeout"。這樣失去了hacker們自我實現與實做的目標了。

今年由於受到COSCUP的撞期影響,人數大減3~4成,加上去年的風評不佳(評審問了『你怎麼賺錢』、『你怎麼make money』、『你的business model是什麼』)造成在社群間不好的名聲流傳。不過今年其實沒這個問題,評審都問一些本質與技術,這是一個好現象。可能因為人數大減的原因,使得今年食物較少(食物也是黑客松的精華阿),肥宅我的心得試吃不飽。

今年贊助廠商變多,變得多元,不過兩排排了一排攤位,大投影牆還播著廣告,害我以為我來到世貿之類的地方了XD。

Tuesday, August 16, 2016

[tools]GNU 開發工具:nm

[tools]GNU 開發工具:nm

nm

nm這東西是來列出object files(binary file)的符號(symbol),包括列出地址(address)、類型、名稱。
以下我打了一個範例。


接下來是對其編譯出來的a.out下nm指令的結果。



第一列為地址,第二列為類型,第三列為名稱。類型部份可以man一下nm。以下是擷取自man nm。


這個工具可以幫助我們了解object file的資料layout,函式定義等,對於無source code只有object files的開發者來說十分方便(有source code可用compiler的參數來分析)。

nm可以幫助我們分析undefined reference狀況與data的分區(bss,text,data)。

相關連結:1.http://www.wuzesheng.com/?p=1595
                 2.http://sp1.wikidot.com/elfobjfile
                 3.http://enginechang.logdown.com/posts/248172-linker-loader-library
            4.https://github.com/torvalds/linux/blob/9256d5a308c95a50c6e85d682492ae1f86a70f9b/arch/powerpc/boot/elf.h

用Compiler Explorer學習C/C++的效能與實做

用Compiler Explorer學習C/C++的效能與實做

今天我發現一個網站:compiler explorer,這個網站可以將C和C++即時編譯為組語,而且寒可以選AT&T語法的nasm和INTEL語法的nasm,對於底層學習很有幫助。

支援

這個網站支援ARM、MIPS、X86、AVR等指令集的compiler,支援度甚廣,且網頁本身也開源(使用node.js),連結:https://github.com/mattgodbolt/gcc-explorer

操作畫面


Friday, August 5, 2016

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+

關於library

其中TMRh20大大做的這個還可支援linux(Raspberry pi),支援度較廣。不過本篇文章選用maniacbug大大的library。

mega2560連接nRF24L01

以下是nRF24L01 模組的照片與pinout。

從左上開始,右下結束。
                           
1.GND2.VDD(3.6V以下)
3.CE4.CSN
5.SCLK6.MOSI
7.MISO8.IRQ


Mega2560部份,我們不需要接IRQ,因為library沒有實做,讀者有興趣可以修改library中關於nRF24L01一個名叫config的暫存器,將mask中斷的部份歸零。

Mega2560的部份需要其上頭內建的SPI BUS,才能使用這個函式庫(TMRh20的library有提供Software SPI應用)。以下是Mega2560的SPI接腳對應。



SCK要接nRF24L01的SCLK,MOSI接MOSI,MISO接MISO,CE和CSN可自行定義腳位。

程式碼部份直接利用官往提供的example來做測試。
http://maniacbug.github.io/RF24/GettingStarted_8pde-example.html
原始碼中RF24物件建構子這行
RF24 radio(9,10);
9表示CE接腳,10表示CSN接腳。

程式運行時可以開啟Serial port monitor來觀察其運作,其中他在radio.printDetails();部份印出的細節可以多留意,尤其是收發兩端的address,在TX_ADDR那項兩邊要不同。接下來就可開心的看著她發送了。

連不上的一些解法

地址錯誤

兩邊的地址要可對到,一邊RX_ADDR要為另一邊TX_ADDR,這樣才可收到。

雜訊

有些nRF24L01模組的電源供應沒有電容濾波,可以自行用電容跨接GND和VCC兩端,建議選擇10uF到50uF的電容,另外模組的GND要和Ardunio的GND共地(從Ardunio直接拉GND是好選擇)。

傳輸速率過快

example預設為2Mbps,可自行降為1Mbps,有機會收到較佳的訊號。

Sunday, July 31, 2016

PWM產生方式

PWM簡述

PWM為Pulse Width Modulation的縮寫,對於只有high和low的數位訊號來說,如何用high,low比率調整出類似類比訊號為PWM的用處,另外大多數馬達也透過PWM來驅動轉速,LED由於只吃固定電壓,所以常用PWM來調整亮度。
duty cycle(占空比)為整個high時間除以週期時間(D = DT/T)。

PWM產生方式

PWM主要又三種方式產生:硬體內建PWM模組、中斷產生、迴圈。

硬體內建PWM模組

MCU內常內建PWM模組,以PIC系列為例,有CCP(Capture/Compare/PWM)模組、Output Compare模組和PWM模組。透過設定timer和暫存去達成PWM輸出。以下以dsPIC30F4013的Output Compare做示範。




由於每個MCU的PWM實際細節都不一樣,所以讀者請自行閱讀datasheet來應用硬體內建的PWM。
dsPIC30F系列的Output Compare PWM模組要應用時須將OCxCON 暫存器中的OCM設為'110'或'111'。設定順序為:
1.設定PRy(Period register)表示PWM的週期。
2.再來設定OCxRS暫存器表示duty cycle。
3.設定OCM。
4.設定timer,並開啟timer。

PWM 週期 = [(PRy+1)]*Tcy*(TMRx presclaer value)。 (Tcy為振盪器頻率*PLL/4)
PWM 頻率為週期倒數。
詳細設定在http://ww1.microchip.com/downloads/en/DeviceDoc/70157C.pdf中有詳細描述。

中斷產生PWM

利用Timer中斷來切換PWM進入duty cycle,有兩種方法。

一、用一個或兩個timer,先輸出high,計算PWM在high所需時間,設定好Timer 週期(中斷條件),當Timer發生中斷,將輸出切為low,並在計算PWM在low所需時間,同樣設定好Timer週期,當Timer發生中斷回到一開始重頭來過。也可用兩個Timer一個設為high所需時間,一個為period,當high的timer 中斷發生,關閉其中斷與timer,並將輸出設為low,等待period 的Timer發生中斷,在開啟high 的timer中斷。

二、用一個timer中斷,當其中斷將counter加一,一旦couner的值大於duty cycle則切為low,當counter的值大於period則歸零。以下為範例(使用PIC18F452)。


此方法缺點為PWM頻率難以調整,不過對於本身PWM模組缺乏或過少之MCU,此法十分有效。

迴圈產生PWM

以迴圈直接產生PWM,可以用一個counter當作現在情況,當迴圈執行次數超過duty cycle的值時,調整high low,這方法十分簡單,但如果要有準確的頻率需要將程式編成組語計算其所需時間,並用NOP指令挑整週期。這方法會佔走整個CPU,十分無效率,但其可以結合輪詢等固定時間需要執行的功能,對於低階,簡單的系統有其應用空間。


Sunday, May 8, 2016

[筆記] libpqxx - prepare statements

prepare語法是現今SQL主要防止SQL injection的方法(另一種是字串處理),prepare語法主要是限定SQL query語句中的變數,以防資料庫其他資料遭受破壞等。postgresSQL也有prepare語法。請見:http://www.postgresql.org/docs/9.1/static/sql-prepare.html

而libpqxx中也有prepare method。這個prepare框架一旦被定義後,它會存活於connetion物件存活期間(連線期間)。底下是範例,其中prepare_name爲使用者自定(case sensitive),之後會用到。

再來是傳遞變數進入prepare的框架。

其中傳變數方法還有其他寫法,請見:http://stackoverflow.com/questions/31833322/how-to-prepare-statements-and-bind-parameters-in-postgresql-for-c

prepare方法有時會降低效率,其他細節都在官方paper中。

精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...