2023年2月4日 星期六

用winrar解簡體中文壓縮檔產出成亂碼目錄、檔案名稱!? 如何解決?

 從中國的網站那裡抓下來一些文件壓縮檔,直接在繁體中文作業系統中的winrar 解開,會變成亂碼目錄,結果是看得「霧沙沙」,如何是好 ?

「呃...是要灌一個簡體中文版的windows嗎?」 厚,毋免安爾厚工啦~~~

 拿到簡體命名檔的zip檔時,先別直接解開,先用winRAR來開啟,確定目部檔名是否正確
(即,在該zip檔 mouse right click menu中選「WinRAR-->以WinRA開啟」)
(這還算好的,有的是直接出現幾何符號的,覺得根本是加密過的?)
這時,請在winrar的「選項-->名稱編碼」裡,選取「936 簡體中文GBK」


然後....winrar裡的目錄名稱就正確了



這樣,直接把這個正確名稱的的目錄拖出來,就可以解出正確的目錄了

TIP:
 如果有一堆簡中檔名的zip檔要解的話,不用一直重複上面的動作,直接在winrar裡的「.. 」(回上層目錄),開啟檢視其他要解開的zip檔,這樣就不必一直切換「名稱編碼」,檢視得到正確的檔案目錄名稱便可直接拖出到目的資料夾裡,比較省事

(如果你要用keil開發的話,還是路徑裡不要有中文字元才不會出現打不開project的現象)

一起加油吧


2023年1月12日 星期四

for ROS2 同一個 package 即要有cpp的node,又想加入python node,如何定義這樣的package?

 聰明的你一定是那句:「摻在一起做成撒尿牛丸啊,笨蛋」,沒錯,這次我們就是要混在一起做成撒尿牛丸package ,
放心,這需求不是今天才出現的,有時網路上找到的lib是cpp或是python ,而又不想各別定義成不同的package,就會需要樣的應用了( 當然你也可以用ctypes來解決 python call c's dll/so ,
只是既然可以用ros2的 topic機制就直接用它比較省事)
參考這兩位大德的解說文: Create a ROS2 package for Both Python and Cpp Nodes 
 
摘要一兩個重點,以供日後回來快速查閱
一.在create package時,請先以「ros2 pkg create  想要的套件名稱  --build-type ament_cmake」指定是要以cpp 為主的package 建置方式,因為日後python要用的setup.py會用不到,重心會放在CMakeLists.txt及pacakge .

假設路徑圖如下:
-------------------------------
my_cpp_py_pkg/
# --> package info, configuration, and compilation
├── CMakeLists.txt
├── package.xml
# --> Python stuff
├── my_cpp_py_pkg
│ ├── __init__.py
│ └── module_to_import.py
├── scripts
│ └── py_node.py
# --> Cpp stuff
├── include
│ └── my_cpp_py_pkg
│ └── cpp_header.hpp
└── src
└── cpp_node.cpp
-------------------------------
CMakeLists.txt方面 
要安裝python node的路徑,就是直接寫做
-----------------
install(PROGRAMS
scripts/py_node.py 
DESTINATION lib/${PROJECT_NAME}
)
-----------------------------
二.「#!/usr/bin/env python3」 -- python node方面,以往是不必在python node的最前面加上做編輯器指定,現在用這種混搭方式就要在py檔的第一行做編輯器指定
三 python node裡要import的話,就上面的路徑而言,是
「from  my_cpp_py_pkg. module_to_import import blablalba」
(不必在CMakeLists.txt裡指定,非常方便)

其他細節就請自己慢慢看上述兩篇引用的網誌了 
(應該沒有IT像我這樣在下班後還在玩ROS的吧....)

2023年1月8日 星期日

ROS2 colcon build遇到的問題 (distro:foxy on ubuntu 20.04)

Q1.錯誤訊息「undefined reference to `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::Imu_<std::allocator<void> > >()' collect2: error: ld returned 1 exit status」

sol:請檢查 CMakeLists.txt 的ament_target_dependencies 及 c_cpp_properties.json includePath 及  package.xml 的 depend  ,套件/路徑有沒有加入(以上述的訊息,是「sensor_msgs」套件定義漏了)

Q2.錯誤訊息「python3.8/site-packages/setuptools/dist.py:717: UserWarning: Usage of dash-separated 'script-dir' will not be supported in future versions. Please use the underscore name 'script_dir' instead 」

sol:除了要「pip install setuptools==58.2.0」把setuptools降級之外,也要把package裡的「setup.cfg」
的「script-dir」及「install-scripts」改為「script_dst」「install_script」

Q3.For python: 執行node時找不到自己定義的模組(明明colcon build都沒錯!!)

sol:請在setup.py的「data_files」裡加上「('lib/' + package_name, [package_name+'/SimpleOneTrailerSystem.py']),」

如:
---------------------
data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        ('lib/' + package_name, [package_name+'/DC_Motor.py']),
    ],
--------
參考這裡

其他的錯誤,日後遇到再回來update了

2022年12月23日 星期五

for ubuntu :把script安裝到開機後的工作,如同service一樣

 參考本文 
這次我們是把昨天做好的wireguard vpn 介面啟動安裝到開機程序裡
文件: /usr/local/bin/start_wg_vpn.sh  ,權限設定為744
-----------------------------------------------
#!/bin/bash
wg-quick up wg0   <--看你昨天設定好的config檔叫什麼
-----------------------------------------------
文件 /etc/systemd/system/start_wg_vpn.service 權限設定為664
----------------------------
[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/start_wg_vpn.sh
[Install]
WantedBy=default.target
------------------------------
設定好文件及其權限後,還要裝入systemctl
-----
$ sudo systemctl daemon-reload
$ sudo systemctl enable start_wg_vpn.service
-----
重開機後,檢查網路有沒有起來,就john了

2022年12月22日 星期四

ubuntu 安裝wireguard client 時遇到的問題

 wireguard透過wg-easy的docker化安裝,一切變得方便多了
參考這則影音,一下子就裝好了.

不過,在ubuntu client安裝時就有那麼點小麻煩了
(我們已經先用「apt install wireguard」安裝了)

以root身份(指令 sudo -i )  在/etc/wireguard裡設定好了myWG.conf後(就是從剛才wg-easy自架的vpn server網頁加好的client定義下載的conf檔copy出來貼就好,別緊張),退駕回到正常的身份後

執行「sudo wg-quick up myWG」以啟動網路wg介面,出現以下訊息:

----------------------------

[#] ip link add myWG type wireguard

[#] wg setconf myWG /dev/fd/63

[#] ip -4 address add 10.8.0.3/24 dev myWG

[#] ip link set mtu 1420 up dev myWG

[#] resolvconf -a myWG -m 0 -x

/usr/bin/wg-quick: line 32: resolvconf: command not found

[#] ip link delete dev myWG  <--網路介面被移除!!

----------------------------

這時候只要再一行指令「sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf」就可以解決這個問題了

參考出處在此

一起加油吧


2022年11月18日 星期五

在hyper-V修改了硬碟大小後,怎麼去調整ubuntu的作業系統磁碟空間

 在你把vm (ubuntu)關機,調整硬碟大小之後(如下圖步驟),空間不夠的問題就這樣完成了嗎?



不,還沒完:因為作業的是OS partition,所以有點不一樣,不能只用「Disks」或是gparted來作業

,以「Disks」而言,會「on-line shrinkig not supported (udisks-error-quark,0 )」錯誤

事實上這跟我們之前在用virtualbox的ubuntu調整partition的動作很像,參考以下步驟:

1.一樣,是去terminal,用「sudo -i」切換成root 角色

2.用「fdisk -l」(是list 的小寫L,不是數字1)查出你要調整的disk number

---舉例,以下只看「/dev/sda多少」那裡,其他的別看----

Device      Start       End   Sectors  Size Type

/dev/sda1  227328 125827071 125599744 12.9G Linux filesystem   <--我們要調整大小的硬碟

/dev/sda14   2048     10239      8192    4M BIOS boot

/dev/sda15  10240    227327    217088  106M EFI System

----
3.用「parted」去作業(GUI application就是差那麼一點點....)
然後就跟我們之前那篇resize vdisk的作法一樣
----
user@server:~# parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart
Partition number? 1  <--要調整的partition number「/dev/sda1」
End? [26.8GB]?   <--這地方要自己輸入,不能只按enter,
因為parted 是不知道你有多少空間可以用 
(在上一個指令「fdisk -l」裡「Disk /dev/sda: 30.25 GiB」就是我們可用(用步驟1改的vdi大小)的大小,
所以請在此填入32.25G)
(parted) quit
Information: You may need to update /etc/fstab.
-----
4.用「pvresize /dev/sda1」comfirm動作
(或許不用,因為它出現了錯誤訊息 
Failed to find physical volume "/dev/sda1".
  0 physical volume(s) resized or updated / 0 physical volume(s) not resized )
5.回去gparted看一下,硬碟空間就已經被調整了(也就是不因online狀態而無法調整了)
如果不滿意,再拉一拉,改改大小,apply 一下,就完成了

當然WSL2不是不好,只是我習慣在xwindow的desktop下做其他事(像是接一些設備啦、他機連入啦....)
所以還是不免加上了hyper-V vm了

   一起加油吧



2022年11月10日 星期四

好工具介紹:封鎖 ctrl + 空白鍵 以解決輸入法切換的小工具

 最近剛買台新筆電,也灌了win11,可是最麻煩的中文輸入法遇到ctrl + space就切換的問題

我真的找了很多地方試了很多方法都沒解,甚至連改registry key這事都做了,還是一樣

(沒辦法,新筆電很容易按錯鍵)

好在這問題一堆人問,也有熱心人士開發出這樣tweak工具--PowerToys ,參考這裡的設定




當然這軟體你也看出來他真的是包山包海了,有需要您再慢慢試了

至少解決我這手殘一族的中打打到一半出現「不知所云」的現象了 

請享用




2022年9月6日 星期二

For python--一直keyboard.Events() get key卻出現「Can't connect to display ...... : b'Maximum number of clients reached」問題

最近在試python的key board event ( in ubuntu) ,code如下
---------------------------
...
...
    while(True):
        with keyboard.Events() as events:    
            try:
                # Block at most 0.1 second
                event = events.get(0.1)
                if event is None:
                    if axnCode=="STOP"  or  axnCode=="":
                        continue
                    lastStopCount+=1
                    if lastStopCount>=2 :
                        lastStopCount=0
                        axnCode="STOP"
                else:
                    print('Received event {}'.format(event))
                    if(event.key==keyboard.Key.esc):
                        break
                    lastStopCount=0
                    if(event.key==keyboard.Key.left ):
                        axnCode="LEFT"    
                    if(event.key==keyboard.Key.right ):
                        axnCode="RIGHT"                        
                    if(event.key==keyboard.Key.down ):
                        axnCode="DOWN"                                            
                    if(event.key==keyboard.Key.up ):
                        axnCode="UP"                                                                            
            except:
                print("unknown exception")
---------------------------
鍵盤動作(上下左右)訊息是很正常地捕捉到,閒置也正常反應出來,
真的是「get key取碼 一時爽,一直get key一直爽」
不過....
剛開始跑是沒問題,不過....幾秒後卻出現這樣的錯誤訊息
--------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "/home/....../.local/lib/python3.10/site-packages/pynput/_util/__init__.py", line 210, in run
    self._run()
  File "/home/....../.local/lib/python3.10/site-packages/pynput/keyboard/_xorg.py", line 545, in _run
    super(Listener, self)._run()
  File "/home/....../.local/lib/python3.10/site-packages/pynput/_util/xorg.py", line 383, in _run
    self._display_record = Xlib.display.Display()
  File "/home/....../.local/lib/python3.10/site-packages/Xlib/display.py", line 80, in __init__
    self.display = _BaseDisplay(display)
  File "/home/....../.local/lib/python3.10/site-packages/Xlib/display.py", line 62, in __init__
    display.Display.__init__(*(self, ) + args, **keys)
  File "/home/....../.local/lib/python3.10/site-packages/Xlib/protocol/display.py", line 129, in __init__
    raise error.DisplayConnectionError(self.display_name, r.reason)
Xlib.error.DisplayConnectionError: Can't connect to display ":10.0": b'Maximum number of clients reached'
---------------------------------
真的是想不通,明明只是read key,跟Display有什麼關係啊...
是有關係,畢竟pynput是要連接到xwin(xserver), 才能接收事件.所以會有connect問題
這時,才萬別想去改「/etc/X11/xorg.conf」.問題不在那裡
(而且ubuntu 22.04 預設是沒有xorg.conf,想要用 Xorg -configure產生Xorg.conf很多程序要做....我放棄了,但也好在沒產出 & 修改xorg.conf,不然又被誤導,走不少冤枉路了)
「所以,要改用別的python module來read key 嗎?」
「不用,只要一個小小的步驟就解決了」
------Before----
    while(True):
        with keyboard.Events() as events:    
            try:
                ...
                ...
            except:
               ....
-----After---
   with keyboard.Events() as events:    
        while(True):
             try:
                 ...
                 ...
             except:
               ....
-----------------------------
是的,就這麼簡單,如同c#對於using(.....)資源總是放在迴圈外,
python的「with」也請儘量放在while/for 外面,否則資源來不及回收就又open新的,那一定會入不敷出的

2022年8月31日 星期三

For ubuntu 怎麼安裝gstream rtsp server?

  你應該知道用git clone的方式把git respostitory 複製到你的local來make & build

但面對gst-rtsp-server這個project 就沒看到configure檔,更別說make & make install了
事實上只是要多個步驟「git checkout 1.13.91」之後你便會看到「autogen.sh」這東西,接著就是照之前安裝的過程
詳細可以參考這篇 can't build gst-rtsp-server  裡面的answer那部分 (已親測 OK) 
 安裝後,請cd 到gst-rtsp-server/examples裡試用test-launch,
如:要使用usb camera來做stream的資料源
------------server--------------------------------
./test-launch "v4l2src device=/dev/video1 ! video/x-raw,format=YUY2,width=640,height=480 ! videoconvert ! x264enc ! rtph264pay name=pay0 pt=96"
---------------client------
gst-launch-1.0 playbin uri=rtsp://server所在的ip:8554/test
(別忘了server要開port --指令「 sudo ufw allow 8554 」)

基本上這樣就會出現stream player了
如果是 client (gst-launch)出現「"Missing element: H.264 (High 4:2:2 Profile) decoder"」錯誤的話
請安裝plug in 如
「sudo apt-get install gstreamer1.0-libav」
這樣基本上的 gst rtsp server & client就大功告成了,

只是.....辛苦了半天,跟螺絲兔(ROS2)的image message比起來,還是稍微慢了點(我指的是server & client nodes 在不同台的情況下),只是image view node要常常注意網路狀態,必時要重新訂閱topic就是了.
ROS2的USB camera 入門應用請參考這篇 ros2_v4l2_camera  
只是你要先會ROS2的基本功,別怕,學會了你就.....還是你自己就是了更上一層樓了





2022年7月27日 星期三

for Ubuntu 22.04 desktop : /dev/ttyUSB 找不到!? 明明設備有反應啊

 最近剛安裝了ubuntu22.04 x64 Desktop
找了一個舊的設備來試io,官網上是說它會出現在/dev/ttyUSB0

剛插入usb port也是有反應...只是一下子又沒反應了....應該是衝到了

這時要用這個指令「lsbus」來看看插拔前後出現了什麼差別了

---插入usb 設備前---
john@ros2:~$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
---插入usb設備有反應的那一刻---
john@ros2:~$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge    <--差別在這
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
-------
這時,修改「/usr/lib/udev/rules.d/85-brltty.rules」,把這個address的設定comment掉
----用ctrl+W找「10c4:ea60」,把「ENV{PRODUCT}=="10c4/ea60/*...."這行開頭加個# ---























----存檔之後,別忘了重開機-----
之後,你再用「ls -l /dev | grep ttyUSB」就可以看到/dev/ttyUSB0 ,設備可以用了