2020/8/26

flutter : 竟然支援 desktop 了 -- linux. gtk

ref: 跟 support web 一樣,flutter config --enable-linux-desktop
測試過,要 branch dev 才有,beta 的話 enable OK,但是不會真的 create linux folder(device)
enable 完,upgrade 後,run doctor 有 Error...
[✗] Linux toolchain - develop for Linux desktop
    ✗ clang++ is required for Linux development.
      It is likely available from your distribution (e.g.: apt install clang), or can be downloaded from https://releases.llvm.org/
    ✗ ninja is required for Linux development.
      It is likely available from your distribution (e.g.: apt install ninja-build), or can be downloaded from https://github.com/ninja-build/ninja/releases
    ✗ GTK 3.0 development libraries are required for Linux development.
      They are likely available from your distribution (e.g.: apt install libgtk-3-dev)
    ✗ The blkid development library is required for Linux development.
      It is likely available from your distribution (e.g.: apt install libblkid-dev)
就 follow instruction...
apt install clang ninja-build libgtk-3-dev libblkid-dev
然後舊真的可以 run 了...

最後要 build release 的話,就在 project 下
flutter build linux
要記得,flutter app 包含很多 library,所以要執行 release/bundle/ 下的執行檔,而不是 release 下的
目前支援 linux 跟 macos (是,windows 沒有)

更正:
ref:flutter and desktop

所以是有support windows 的,只是還在更初期階段,master branch
一樣,flutter channel master, upgradeconfig --enable-windows-desktop

之後到舊project 去 flutter create . 一下,再 flutter run -d windows 舊可以。

最後在 windows folder 下會有 visual studio 的 sln 檔。似乎可以用 visual studio 打開。
flutter doctor 可以看到有檢查 Visual Studio 有沒有安裝。
-- 我有安裝 community 版

2020/8/25

Bookmark: Android 11. Machine Learning in Android Studio with TensorFlow Lite.

最近的 Android 11 Preview.
UI 用起來沒什麼差別,結果差別在 platform 中..

這個好厲害,已經稿得這麼方便了。

新的Android Studio 已經把ML Kit 放進去了。
所以在android 中寫 ML 的 function 越來越簡單。

甚至example 都做得很無腦了,github clone 下來,用 Android Studio 開啟。
Android Studio 會自動下載需要的 SDK, NDK, plugin。
build 完,然後舊可以 run 在 手機上。

Example 已經把是用 CPU,GPU,NNAPI 的選擇都做好了。
也把inferer一張需要得時間寫出來。
同一個network 也分成 qualtize 跟 float 兩種。

分別用 Pixel 2 跟 Max Pro M1 來試。
這兩格都沒有run Android 11, 一格式 10, 一個是 9

結果...CPU 強時 (835),使用 CPU, NNAPI, 跟 GPU 差不多。
CPU 弱 (660) 時,使用 float 計算,CPU 與 GPU 相差20倍
但是 CPU 在 Qualtize 的 model 跟 GPU 在 float model 的時間還是差不多。

根據這一篇,tensorflow lite 使用 OpenCL,OpenGL ES 來存取 GPU 資源。
這一篇 delegates 說明tensorflow lite 使用 hardware 加速的部份。
NNAPI 應該最厲害,會用到所有 hardware (GPU, NPU, DSP/hexagon),但是要 Android 8.1 以上才 support
以前的 snpe (hexagon) 用在舊版本的 Android. 沒有support NNAPI 的裝置。

這個 github project : benchmark 剛好是用 GPU, NNAPI, hexgeon 來做benchmark,有詳細的 build step,run 在 android 上

2020/8/23

cmake : find_package

CMakeList.txt 中可以檢查系統有沒有安裝 XXX package,是用 find_package( )

例如,在project 一開始.. run mkdir build && cd build && cmake .. 時...
CMake Error at /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find Protobuf (missing: Protobuf_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.10/Modules/FindProtobuf.cmake:543 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/ProtoBuf.cmake:4 (find_package)
  cmake/Dependencies.cmake:43 (include)
  CMakeLists.txt:49 (include)
最後列的就有點像是 call stack..

可以出find_package( ) search 的file 和途徑。
用的是 /usr/share/cmake-3.10/Modules/FindProtobuf.cmake

這個是 cmake package 的 default module search path.
如果有自己寫的 FindMypackage.cmake 的話,也可以放在自己的目錄,然後加入 module search path:
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)

bookmark : caffe for android

在 caffe 的 CMakeList.tx 看到的。

原來有人把 caffe port 到 android. -- caffe-android-lib
還寫了 android demo app -- caffe-android-demo

4 年前的 project
caffe 當然是以 so, jni 的方式工作。
jni 的 export function 只有 loadimage 和 predict,沒有 export training 的部份 ^_^

沒有 hardware support (GPU,DSP. 甚至 ARM 的 NEON)
OpenCL 是列在 ToDo,所以也沒有。(有就好了)

Windows Manager : Use GPU -- Mate Tweak

找倒 Mate Tweak,在Windows 那一項。
Windows Manger, 有一堆可以選...
分別從.完全不用 GPU。到 完全使用 GPU..

要是多螢幕得時候,設定使用 GPU ,兒GPU的 ram 不足時,會看到模糊的現象。

2020/8/19

Bookmarks : Camera Spec . SFR ,MTF and RI

鏡頭的規格都會有這兩個數值。
  • SFR : Spatrial Frequency Response
  • MTF : Modulation Transfer Function
  • RI : Relative Illumination

ref: 其實 follow imatest 網站的 link 有一堆,每個都有詳細的說明。

很有趣,就像是音響系統的 頻率響應,用在相機上。
現在頻率變成空間上,黑白相間的條文。
條紋越密,頻率越高。

條文經過相機拍攝後,會和原始的條紋不一樣。
因為相機解析度的關係,黑白的邊緣(edge) 會模糊。
-- 有一點像是經過 low-pass filter.

一切都跟音響系統一樣...

把每個頻率做 FFT,可以得到frequency amplititude.
各個頻率的 原始與成像完的FFT 相除,就是頻率響應。
所以相機也有頻率響應...

另外,跟音響不一樣,空間有方向,所以一般用水平和垂直兩個方向的空間頻率來代表。

MTF equation 跟音響不一樣.
是用自己定義的...

還有很有趣的這個頻率響應也有 Nyquist Freq.
Nyquist Freq 就是 sampling Rate/2

為了避免aliasing,digital sampling 的有效頻率是 Sampling Rate /2
這個就是 Nyquist Freq
在進行 sample 之前,要經果 low pass filter, filter 掉大於 Nyquist 的頻率

這個相機也有 Nyquist Freq..
相機的Sampling Rate 就是 sensor pixel,所以 Nyquist Freq (Unit: Cycle/pixel) 永遠是 0.5


MTF 的圖表可以看這一篇
橫軸是頻綠,縱軸是對比。
然後要標明這是在成像的那一個位置量測的,還有,距離。

其中用到的一些縮寫
  • lp/mm : line pair per mm
  • T/S : 方向 Tangential(同心圓/子午) and Sagittal (指向圓心的輻射線/弧矢), 鏡頭的軸向與徑向 量測到的數值,所以每個參數都又兩個數值 (T 向跟 S 向)
  • Ny : Nyquist freq, 就是 sensor 的 pixel 密度。每mm 有幾個 pixel。又因為 分出 pixel high/low 的邊界需要兩個 pixel,所以freq 有些會/2
  • field : 整個成像(照片)的位置 (中心到邊邊..),單位有兩種 1. field 的比例. 2. 角度
  • Through Focus : 偏離 focus 的距離

TS,在中國的翻譯是子午/弧矢,可以看這一篇
MTF 的位置:在CCD 上,距離中心的距離,有兩種表示方式:
  • 0.7F :距離中心 0.7/2 個 CCD 對角長(Field) 的位置
  • 120 度:用 鏡頭焦距換算過,在 CCD 位置對應的角度,例如 tan(deg) = 0.7F* ccd length / focal length

Relative Illumination 比較簡單,就是暗角。
sensor releative illumination roll off and vignetting

圖表內容就各位置相對於最亮的亮度比值。
通常中心最亮,周圍比較暗。

2020/8/18

使用非gmail, yahoo. hotmail 等mail 申請,會先寄 email confirm mail,確認後,隔天就會mail 通知已經開通了。
可以下載 github 上的 script repo,可以用 pip 安裝。

在 conda 下也可以用 pip 喔,就是先用 conda install pip .....
之後舊可以在 conda env 裡用 pip install
一樣,只會 install 在 該 env 中。

兩個都做,pip install 方便使用,script repo 中有其他的 script 待會要用...
install 有 gui 的版本:
(enet)charles-chang@penguin1:~/citydata$ pip install cityscapesscripts[gui]
script repo 的 readme 有說明 script 的使用方法。

download : csDownload

在 setup.py 中可以看到 csDownload 就是 download.py
所以可用的 option 有:
-l : list available files
-r : resume download
..

$csDownload camera_trainextra.zip vehicle_trainvaltest.zip
Cityscapes username or email address: 
Cityscapes password: 
Store credentials unencrypted in '/home/charles-chang/.local/share/cityscapesscripts/credentials.json' [y/N]: y
第一次執行會問 username , password,並且存在local..,以後舊部會再問。

說要先 run preparation/createTrainIdLabelImags.py
看一下source code,data 的目錄是用 CITYSCAPES_DATASET 這個環境變數,不然就是 這個 script 的 ../../
接著source 在 目錄中找 'gtFine' 和 'gtCoarse' 目錄。
也就是說, CITYSCAPES_DATASET 要是這兩個 folder 所在目錄...
$ export CITYSCAPES_DATASET=/home/charles-chang/cityscapedata/datashame
$ python createTrainIdLabelImgs.py
Processing 28473
...
看一下CMakeList.txt,裡面的python_version 是 2,所以不必用 conda 了 (用conda, cmake 也無法正確detect python version)

CUDNN 的 detection 和 compile 一直有問題,有時候是 detection 出現 hidden warnning,follow warnning message 刪除 /usr/lib 下的 lib 後。
make 時又出現 argument number not match 的 Error
所以只好把 CMakeLists.txt 中, USE_CUDNN 設成 OFF

2020/8/17

build CMake

18.04 的 cmake 是 3.10.2
在 cuda version 大於 10.2(?) 之後,會出現 CUDA_cublas 找步道的問題。
所以要手動安裝 大於 3.14 的 cmake

那就從 source checkout 開始吧..

cmake 的 source 放在gitlab。下面剛好就是 build instruction..
目標是build 出執行檔,然後放在local (PATH 順序)

checkout 最新的 release v3.18,follow 說明,先 run bootstrap 看說明..
charles-chang@penguin1:~/githubgitlab/cmake$ ./bootstrap --help

Usage: ./bootstrap [<options>...] [-- <cmake-options>...]
Options: [defaults in brackets after descriptions]
Configuration:
  --help                  print this message
  --version               only print version information
  --verbose               display more information
  --parallel=n            bootstrap cmake in parallel, where n is
                          number of nodes [1]
  --generator=<generator> generator to use (MSYS Makefiles, Unix Makefiles,
                          or Ninja)
  --enable-ccache         Enable ccache when building cmake
  --init=FILE             load FILE as script to populate cache
  --system-libs           use all system-installed third-party libraries
                          (for use only by package maintainers)
  --no-system-libs        use all cmake-provided third-party libraries
                          (default)
  --system-curl           use system-installed curl library
  --no-system-curl        use cmake-provided curl library (default)
  --system-expat          use system-installed expat library
  --no-system-expat       use cmake-provided expat library (default)
  --system-jsoncpp        use system-installed jsoncpp library
  --no-system-jsoncpp     use cmake-provided jsoncpp library (default)
  --system-zlib           use system-installed zlib library
  --no-system-zlib        use cmake-provided zlib library (default)
  --system-bzip2          use system-installed bzip2 library
  --no-system-bzip2       use cmake-provided bzip2 library (default)
  --system-liblzma        use system-installed liblzma library
  --no-system-liblzma     use cmake-provided liblzma library (default)
  --system-nghttp2        use system-installed nghttp2 library
  --no-system-nghttp2     use cmake-provided nghttp2 library (default)
  --system-zstd           use system-installed zstd library
  --no-system-zstd        use cmake-provided zstd library (default)
  --system-libarchive     use system-installed libarchive library
  --no-system-libarchive  use cmake-provided libarchive library (default)
  --system-librhash       use system-installed librhash library
  --no-system-librhash    use cmake-provided librhash library (default)
  --system-libuv          use system-installed libuv library
  --no-system-libuv       use cmake-provided libuv library (default)

  --bootstrap-system-libuv use system-installed libuv library for bootstrap
  --bootstrap-system-jsoncpp use system-installed jsoncpp library for bootstrap
  --bootstrap-system-librhash use system-installed librhash library for bootstrap

  --qt-gui                build the Qt-based GUI (requires Qt >= 4.2)
  --no-qt-gui             do not build the Qt-based GUI (default)
  --qt-qmake=<qmake>      use <qmake> as the qmake executable to find Qt

  --sphinx-info           build Info manual with Sphinx
  --sphinx-man            build man pages with Sphinx
  --sphinx-html           build html help with Sphinx
  --sphinx-qthelp         build qch help with Sphinx
  --sphinx-build=<sb>     use <sb> as the sphinx-build executable
  --sphinx-flags=<flags>  pass <flags> to sphinx-build executable

Directory and file names:
  --prefix=PREFIX         install files in tree rooted at PREFIX
                          [/usr/local]
  --bindir=DIR            install binaries in PREFIX/DIR
                          [bin]
  --datadir=DIR           install data files in PREFIX/DIR
                          [share/cmake-3.18]
  --docdir=DIR            install documentation files in PREFIX/DIR
                          [doc/cmake-3.18]
  --mandir=DIR            install man pages files in PREFIX/DIR/manN
                          [man]
  --xdgdatadir=DIR        install XDG specific files in PREFIX/DIR
只有要改 install path 而已,所以...
$./bootstrap --prefix=/home/charles-chang/cmaketool
...
...
$ make
...
$ make install

寫一個 addcmake18path.sh:
#!/bin/bash
export CMAKE_ROOT=/home/charles-chang/cmaketool
export PATH="/home/charles-chang/cmaketool/bin:$PATH"
要用 3.18 舊先 source ..


其他

原來 Caffe 也有 cmake,source folder 有 CMakeList.txt
所以可以follow 標準..
mkdir build && cd build
cmake ..
make 

2020/8/15

Bookmarks... from pose tracking to build system

從一個 news 開始...
On-device, Real-time Body Pose Tracking with MediaPipe BlazePose 提供一個在 mobile device 上做 更 detail pose detection 的 network model.
然後他用了前一個,一樣有效的 face detection network/model : BlazeFace
這個face detection 跟一開始的 Pose tracking 都是用 google 的 MediaPipe

MediaPipe 的說明:
MediaPipe is the simplest way for researchers and developers to build world-class ML 
solutions and applications for mobile, desktop/cloud, web and IoT devices.
然後安裝MediaPipe 要用 Bezel。
Bezel 是一格 build tool,類似Ninja...

2020/8/14

systemd 看 log, 還有 service 的 echo output

ref:Ultimate Guide to Logging

systemd 啟動得 service,值行的 script,其中有 echo 的,都 echo 到 journald 裡。
所以要把 journald 打開。
/etc/systemd/journald.conf
其中,第一個 config option:
[Journal]
Storage=auto
...
可以選...
  • “none” :
    This effectively turns off journaling. Any log message received will be dropped. However, any redirection to console, syslog, or kernel log buffer would still be in effect.
  • “volatile” :
    Journal data is saved in memory and temporarily available under the /run/log/journal directory. The directory will be created if it does not exist.
  • “persistent” :
    Journal data is saved persistently on disk under the /var/log/journal directory. The directory will be created if it does not exist. If the disk volume is not accessible or writable, the files will be created under /run/log/journal.
  • “auto” :
    The storage mode is like persistent—data will be written to disk; however, if the /var/log/journal directory does not exist, it will be created under /run/log/journal.
journald 存的是壓縮檔(?),所以不能直接 cat,要用journalctl 來看..

2020/8/11

Camera 的 internal 和 external parameter /Matrix

這一篇 說得很清楚。

數學上,用來描述空間的點如何投影到 Camera 內的成像平面,用兩個 Matrix 來表示:
  • External Parameter : 把絕對空間座標轉換回以 Camera 為原點的 Camera 空間座標。
  • Internal Parameter : Camera 空間座標上的點,投影到 Camera 得成像平面
兩個 parameter 都是用 matrix 表示。

external parameter 比較普通,就是高中學的卡式座標轉換。
包含旋轉和平移。
旋轉得部份,是一個 3x3 矩陣。 -- 每一個向量都會分配到另一個旋轉後得座標系的三個座標軸上,所以是 3 x 3
平移就是 x, y ,z 各加上一個值。


internal parameter 就是投影公式。
由於已經在 camera 座標系上了,所以 Z 向就是 鏡頭指向。
文章中以標準的針孔照相機為例,為了簡化,原來經由針孔投影到鏡頭後方 (-Z 向),改到鏡頭前方,因為只是X, Y 方向相反而已。這樣比較好解釋。
而投影平面到鏡頭原點的 Z 距離,就是鏡頭的 焦距 f

所以,空間點投影到 f 距離的平面,就是簡單的 Z 座標比例。

這篇引入實際鏡頭的不完美:
  • 鏡頭光學中心偏移
  • 投影面的 X, Y 單位不一樣 (可以解釋為 CCD Sensor 在 X, Y 向排列不等距)
  • 鏡頭的X. Y 向焦距不一樣。
把這三個不完美,放入投影矩陣中。

有上面 external 和 internal 兩組parameter,舊可以用數學模型,把空間的點投影到camera 的成像平面。
空間座標 --> external matrix --> Camera 座標
Camera 座標點 --> internal matrix --> Camera 成像平面(座標)


ref:

2020/8/10

flutter web app , development with VSCode

現在好像可以在 VSCode 中開發 flutter 應用了。
(不確定是不是,因為測試的機器還是都有安裝 android-sdk 跟 android-studio)

flutter sdk 採用 git clone 方式安裝
然後 follow flutter 文件:Building a web application with Flutter..

大概就是用 flutter command 切換到 beta branch:
 flutter channel beta
 flutter upgrade
 flutter config --enable-web
然後 run flutter devices 測試看看,有沒有出現 browser...
$ flutter devices
2 connected device:

Web Server • web-server • web-javascript • Flutter Tools
Chrome     • chrome     • web-javascript • Google Chrome 81.0.4044.129
實際上,如果 VSCode 要 support 的話,要再run 一次 flutter doctor,這好像會 update VSCode 的 flutter/dart plugin 的內容。

一些文章 說,在 VSCode 的 command palette 中會出現Flutter: New Web Project
但是實際上,,新版flutter 已經把這個 command 拿掉了。

用普通的Flutter: New Project 就可以了。

因為Android, iOS, Web 的 project 和 source 都一樣呀。

只有在 debug, run 的時候,可以選擇你要在Android, iOS 還是 Web Browser 上 run



在VSCode, 下面,device 的地方,按下去,就會出現可以 run 這格 app 的 device...
-- 如果沒有出現 Web 的話,可能是因為flutter update 之後沒有 run flutter doctor,所以VSCode 對應的 plugin 沒update..



更新:

的確可以不安裝 android studio 跟 android sdk。
但是這樣只能開發 web application。

因為 flutter beta channel 開啟了 web application 功能。
所以才能這樣做。
的確,flutter docktor 會有Error。
但是沒關係
C:\Users\check>flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, 1.20.2, on Microsoft Windows [Version 10.0.19041.450], locale zh-TW)
[X] Android toolchain - develop for Android devices
    X Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, set ANDROID_SDK_ROOT to that location.
      You may also want to add it to your PATH environment variable.

[√] Chrome - develop for the web
[!] Android Studio (not installed)
[√] VS Code (version 1.48.0)
[√] Connected device (3 available)

! Doctor found issues in 2 categories.

C:\Users\check>flutter devices
3 connected devices:

Web Server (web) • web-server • web-javascript • Flutter Tools
Chrome (web)     • chrome     • web-javascript • Google Chrome 84.0.4147.125
Edge (web)       • edge       • web-javascript • Microsoft Edge 84.0.522.59
.. 我不確定 Edge 能不能用,因為dockter 其中一個check 是 chrome,所以我還是裝了。

有關flutter for web app,這一篇 好像說得比較清楚。

2020/8/9

chromebook : use external SD card in Linux(beta)


因為這個 chromebook 只有 16G,所以要用 sdcard,可惜 sdcard 突出太多。
所以去買了短的 sd 轉卡,這樣裝上去短了一點,可惜,沒有完全沒入...
這個是 macbook 用的。一個 NT 34

然後format 成 ext4,插入會自動 mount
在 setting 的file選給 app 共用。
在 linux(beta) 的 advance 中選使用 sdcard。
這樣在 Linux(Beta) 的 terminal 中,可以看到 mount 在 /mnt/chromos/removable/SD Card/

但是... default 的 owner 是 root,attribut 是 700。
所以 不管是 chromeos app 或是 linux(beta) 都沒辦法 access。
要先開啟 developement console (Ctrl-Alt and right arrow):
chmod 777 .
結果 SD Card 裏的檔案都不能執行,因為看 mount option,有 noexec。
但是在 developemen console 可以用
mount /dev/sdc1 /media/removable/SD\ Card -o remount,exec
這樣,在 developement console 中就可以執行ㄌ了
-- 但是在 Linux(Beta) 的 terminal 中還是不能執行。

bookmarks: system benchmarking tool, with source code

project page 有building guide,所以可以用在 embedded system 上。
google 一下,有一堆網站說明
sysbench 可以做...
  • fileio - File I/O test
  • cpu - CPU performance test
  • memory - Memory functions speed test
  • threads - Threads subsystem performance test
  • mutex - Mutex performance test
  • oltp - OLTP test

ubuntumate : 變更 login 畫面背景圖片

結果一堆都是直接到 wallpapaper foler 改 link..
如果要用 gui 的話,要另外安裝:
$ sudo apt install lightdm-gtk-greeter-settings
裝完開啟 LightDM GTK+ greeter: Setting

可以看到 default login background picture 是:/usr/share/backgrounds/? ...糟糕被改了。
去設成自己的就可以。

便得很醜。發現在 /etc/lightdm/ 下多了一個 lightdm-gtk-greeter.conf:
[greeter]
background = /home/charles-chang/Pictures/LenovoWallPaper.jpg

2020/8/8

chromebook : flutter dev

在 ubunutu 上安裝 flutter 時,看到 chromeos 選項。
所以 flutter 也可以在 chromebook 上開發 了。
或許說,chromebook 可以 run android studio 了。

看了一下,是在 chromebook 的Linux(Beta) 裡安裝的。

從 chromebook 開機得時候,第一次啟動 linux(beta) 時,可以看到 , linux(beta) 好像是 run 在 vm (還是 container) 裡..
chromebook 能做得事越來月多,難怪有人說 chromebook 銷售大爆發..

問題:android run 起來 loading 很重,hardware 都是輕量的 chromebook 可以 run 得起來嗎?

2020/8/4

phone NN benchmarking

竟然有這種網站:AI-Benchmark, Phone
benchmarking 論文是:
然後這一篇說,pixel 2 雖然是 snapdragon 835,但是不支援 SNPE GPU 加速?
因為 google 沒有把 qualcomm bsp 的 dsp, opencl library 包進去?!

MEMS motion sensor : IIS2DLPC. linux driver 和 使用

ST 提供兩種 driver type: iio 好像是新的..這裡只看 input (其實是因為只有 port input)

input device return 都是一個 input_event 的 structure:
struct input_event {
	struct timeval time;
	unsigned short type;
	unsigned short code;
	unsigned int value;
};
type 就定義在 linux/input.h
所以 driver 只能借用用input.h 的值:
#define INPUT_EVENT_TYPE    EV_MSC
#define INPUT_EVENT_X       MSC_SERIAL
#define INPUT_EVENT_Y       MSC_PULSELED
#define INPUT_EVENT_Z       MSC_GESTURE
#define INPUT_EVENT_TIME_MSB    MSC_SCAN
#define INPUT_EVENT_TIME_LSB    MSC_MAX
g sensor 中,report data 的 function:
static void lis2dw12_report_3axes_event(struct lis2dw12_sensor_data *sdata,
                      s32 *xyz, s64 timestamp)
{
    struct input_dev *input = sdata->input_dev;

    if (!sdata->enabled)
        return;

    input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_X, xyz[0]);
    input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_Y, xyz[1]);
    input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_Z, xyz[2]);
    input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_TIME_MSB,
            timestamp >> 32);
    input_event(input, INPUT_EVENT_TYPE, INPUT_EVENT_TIME_LSB,
            timestamp & 0xffffffff);
    input_sync(input);
}
所以 read( ) 讀進來的...就是...
ev.type = INPUT_EVENT_TYPE
ev.code = INPUT_EVENT_X
ev.value = x acceleration value
所以參考前面的reading input device 的程式,修改一下..
 const char *dev="/dev/input/event0";
  ..
  ..
       if(ev.type == INPUT_EVENT_TYPE) {
            switch(ev.code) {
                case INPUT_EVENT_X:
                    printf("X: %d\n",ev.value);
                    break;
                case INPUT_EVENT_Y:
                    printf("Y: %d\n",ev.value);
                    break;
                case INPUT_EVENT_Z:
                    printf("Z: %d\n",ev.value);
                    break;
                default:
                    printf("NOT VALID code: %d\n",ev.code);
            }
        }else{
            printf("NOT VALID TYPE: %d\n",ev.type);
        }
driver 的控制界面在sysfs 裡...enale it..
# ls /sys/class/input/event0/device/accel
enable        polling_rate  resolution    scale         scale_avail
# echo 1 > /sys/class/input/event0/device/accel/enable
執行..
# ./gmonitor 
X: -25376
Y: -14640
Z: 973072
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
X: -22448
Y: -18544
Z: 967216
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
X: -26352
Y: -17568
Z: 968192
NOT VALID code: 4
NOT VALID code: 7
NOT VALID TYPE: 0
查一下 code 4,7 和 type 0..
uapi/linux/input-event-code.h:
/*
 * Event types
 */

#define EV_SYN          0x00
...
/*
 * Misc events
 */

#define MSC_SERIAL      0x00
#define MSC_PULSELED    0x01
#define MSC_GESTURE     0x02
#define MSC_RAW         0x03
#define MSC_SCAN        0x04
#define MSC_TIMESTAMP   0x05
#define MSC_MAX         0x07
#define MSC_CNT         (MSC_MAX+1)
所以 type 是 EV_SYN,
code 是 INPUT_EVENT_TIME_MSB/LSB
type 是 __s64

對照上面的 driver function : lis2dw12_report_3axes_event
* fixed -- gsensormonitor

2020/8/3

systemd-resolved 手動設定 dns server

現在都用這個了,加上nat 的主機,使用 dnsmasq,跟這個衝突,所以一堆 nat 後面的機器,dns 都指向nat,然後 nat 的 dns 又fail..
所以常常要手動設定。

寫一下systemd-resolved 怎麼手動設 dns server 好了。

ref: 使用 systemd-resolved 之後,原來的 /etc/resolv.conf 指向自己了..
而且是由 systemd-resolved 產生,所以改/etc/resolv.conf 沒用。

要改 systemd-resolved 的 config 檔: /etc/systemd/resolv.conf

安裝完的 /etc/systemd/resolv.conf ,內容是都 comment 掉的,
所以要修改就要把 comment 拿掉,加入自己的選項。
例如:用 1.1.1.1 做 dns:
[Resolved]
DNS=1.1.1.1

改完之後,重新啟動 systemd-resolved:
$ sudo service systemd-resolved restart

要看看現在的 dns server ip
systemd-resolve --status
ref: 這一篇有清處的說明。
就是要區分 interface。dnsmasq 的 dns 服務限制在 enp0xxx。
然後給 dnsmasq 獨立的 resolv.conf ,他會依照這個 resolv.conf 的內容(mirror) dns 服務給剛剛設定的interface。
原來的 systemd-resolved 就用原來的 127.0.0.53
這樣就不衝突。

2020/8/1

upgrade to win10 and the win10 donwload link

既然有,就試試看吧。
只是位址好像換了。
下載 Windows 10

MediaCreationTool2004

竟然成功了…



就是那台被一姊救回來的舊nb.
竟然可以upgrade 到 win10..
真的太感謝了

另外,聽老闆的話換ssd真的換對了。


安裝很快,不用半小時。
但是win10好像真的負載比較重,原來win7都用得好好的,win10卻風扇狂轉。

測試一下,鍵盤貼紙

家樂福買的79塊貼紙,還蠻不錯的,只有貼有注音的部分。
很奇怪,雖然貼了以後打字也沒看,但是沒貼的時後,打字都有一種不安全感...