2018/4/27

opencv build error stdlib.h

cmake: fixing gcc6.x c++/stdlib.h include issue

cmake/OpenCVUtils.cmake
@@ -122,7 +122,11 @@ function(ocv_include_directories)

        OR (OPENCV_EXTRA_MODULES_PATH AND "${__abs_dir}" MATCHES "^${OPENCV_EXTRA_MODULES_PATH}"))
       list(APPEND __add_before "${dir}")
     else()
-      include_directories(AFTER SYSTEM "${dir}")
+      if (gcc_compiler_version VERSION_LESS "6.0.0")
+        include_directories(AFTER SYSTEM "${dir}")
+      else()
+        include_directories(AFTER "${dir}")
+      endif()
     endif()
   endforeach()
   include_directories(BEFORE ${__add_before})
去 https://github.com/opencv/opencv.git checkout, blame 找到 fix commit:
~/github/opencv$ git show 21d9412c93
commit 21d9412c93d0fea7c087c2cca3b232b9f8ab9d69
Author: Alexander Alekhin 
Date:   Mon Oct 3 19:38:19 2016 +0300

    cmake: fix for GCC 6.x

diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake
index aafda61ab..89a0bd578 100644
--- a/cmake/OpenCVPCHSupport.cmake
+++ b/cmake/OpenCVPCHSupport.cmake
@@ -14,12 +14,7 @@
 
 IF(CMAKE_COMPILER_IS_GNUCXX)
 
-    EXEC_PROGRAM(
-        ${CMAKE_CXX_COMPILER}
-        ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
-        OUTPUT_VARIABLE gcc_compiler_version)
-    #MESSAGE("GCC Version: ${gcc_compiler_version}")
-    IF(gcc_compiler_version VERSION_GREATER "4.2.-1" AND gcc_compiler_version VERSION_LESS "6.0.0")
+    IF(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.2.0")
         SET(PCHSupport_FOUND TRUE)
     ENDIF()
 
diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake
index 8d7c98b3e..82d82262a 100644
--- a/cmake/OpenCVUtils.cmake
+++ b/cmake/OpenCVUtils.cmake
@@ -121,6 +121,9 @@ function(ocv_include_directories)
         OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}"
         OR (OPENCV_EXTRA_MODULES_PATH AND "${__abs_dir}" MATCHES "^${OPENCV_EXTRA_MODULES_PATH}"))
       list(APPEND __add_before "${dir}")
+    elseif(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0" AND
+           dir MATCHES "/usr/include$")
+      # workaround for GCC 6.x bug
     else()
       include_directories(AFTER SYSTEM "${dir}")
     endif()
@@ -142,6 +145,10 @@ endfunction()
 function(ocv_target_include_directories target)
   _ocv_fix_target(target)
   set(__params "")
+  if(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0" AND
+      ";${ARGN};" MATCHES "/usr/include;")
+    return() # workaround for GCC 6.x bug
+  endif()
   foreach(dir ${ARGN})
     get_filename_component(__abs_dir "${dir}" ABSOLUTE)
     if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}"


2018/4/20

Wifi http storage server

大概就是用 raspberry 做一個會將 usb 儲存裝置透過 http server export 出來的 image。
另外要是 Wifi ap mode。

開機後,插上 usb 儲存裝置後。
手機或是NB 連上這個 wifi ap 後,就可以用 browser 開啟 usb 裝置的根目錄。

所以需求是:
  • Wifi AP Mode
  • USB auto mount
  • http server

USB auto mount
apt-get install usbmount
然後,用 stretch 的話,要改一下..
USB Auto mount - Raspbian Stretch Lite [Solved]
就是去改 /lib/systemd/system/systemd-udevd.service:
MountFlags=shared   #private
還要注意中文檔名問題,要再 mount 時加上 option charset=utf8
usbmount utf support
修改 /etc/usbmount/usbmount.conf:
FS_MOUNTOPTIONS="-fstype=vfat,iocharset=utf8"
指定 mount vfat 時要用 這個 option。
重開機,就可以了。

Wifi ap

ref:setting up raspberry pi as a wifi access point

因為沒有要做 interface gateway,只是單純的要把 usb driver 經由 nginx export 出來,
所以只要做前面的部份:
  • set wlan0 as static ip
  • set dnsmasq , give wlan0 a ip range
  • set wlan0 as access point
要設定 wlan0 用 static ip 好像有兩種作法,這個 是另一種 (disable dhcpcd, 用 network/interface 設定)
這裡用的是,利用 dhcpcd 指定 wlan0 ip-address。
修改 /etc/dhcpcd.conf,把下面加到檔案最後..
interface wlan0
    static ip_address=172.16.130.1/24
和 改 network/interface 不一樣的是,這樣改完後,restart dhcpcd,用 ifconfig 看,wlan0 一樣沒 ip。

修改 /etc/dnsmasq.conf,一樣,加入這兩行
interface=wlan0      
  dhcp-range=172.16.130.2,172.16.130.4,255.255.255.0,24h

hostapd 則是要新增 /etc/hostapd/hostapd.conf 這個file..
interface=wlan0
driver=nl80211
ssid=NameOfNetwork
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=AardvarkBadgerHedgehog
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
然後修改 /etc/default/hostapd,叫他用這個 conf
DAEMON_CONF="/etc/hostapd/hostapd.conf"

nginx

就參考上一篇

2018/4/12

http file server - python , node.js and nginx (static page)

原來所有的 http server 都有這種 list directory 跟 file GET/POST 功能。
所以沒有一個類似Windows 上的 HTTP File Server 這種 package (因為就是 http server)。

用 Apache 或 Nginx 都可以作到。
但是如果只是要測試 run 一下,可以用 Python 的 SimpleHTTPServer 或是 node.js 的 htttp-server


Python 的 SimpleHTTPServer 很簡單。
就是在要 export 的 folder root..
python -m SimpleHTTPServer 8123
這樣就會在 port 8123 上提供 http 服務。

用 node.js 的 http-server 的話,也一樣。
sudo npm install http-server -g
安裝。
然後到要 export 的 folder 下..
http-server -p 8123
就會在 port 8123 提供 http 服務。


實際使用上 node.js 的 http server 比較好,錯誤比較少。python 的 SimpleHTTPServer 問題較多。

最完整的應該是用 nginx,就是安裝 nginx ,然後修改 site-available/default:
server {
   listen 8123 default_server;
   
   root /home/myname;
   autoindex on;
   charset utf-8;
   ...
這樣就可以了,會在 port 8123 上提供 /home/myname 的 file listing 服務。
* charset 這個 option 是指定使用 utf-8 encoding,避免中文檔名產生亂碼。