2023年3月30日 星期四

For mac 如何製作開機碟並進入「 Startup Manager」

你或許會說很簡單啊~用distk util就可以了
(是啦,chatGPT也是這樣說啦) 

可是單純在一般操作下用disk util會無法restore的.
真正的restore的動作是要在startup manager mode下用disk util才能做的.
 這時就算是你真的用Ctrl+R或是option或是T長按....都是不行的 
原來是這個startup manager進入畫面機制是隨著版本有差的
相信很多人跟我一樣踢到鐵板,好心的帥哥美女幫我們整理在這裡了
如果你是 Apple Silicon Mac 的話,是要用電源鍵長按密技才能完成「奧義啟動」
------------------------------------------------------

Apple Silicon Mac Startup Key Combinations

It is simple for Apple Silicon Mac users to remember the startup key combination because you just need to press the power button or Touch ID.

You can press the power button or Touch ID and release it until the startup options show up on the screen.

What can you do in the Mac startup window? The following tools or options are available:

  • macOS Recovery.
  • System Restore Mac.
  • Install or reinstall macOS.
  • Safari.
  • Disk Utility Mac.
  • Startup Security Utility.
  • Terminal.
  • Startup Disk.
  • -----------------
  • 以上,祝開機大吉
  •   P.S. chatGPT不錯用啦,只是你一定要去驗證監督就是了 (不然公司請它就夠了咩)

同場加映:
如何把Ventura安裝到外接式USB碟上去:
首先,我的USB是2T的,所以切成250G給安裝區Mac OS Extended (Journaled)格式
(假設此區名為UsbBoot)
其他的要設為APFS格式
(假設此區名為UsbMain)
他們的partition type都是GUID Partition Map格式
之後到app store下載ventura,用以下的指令安裝到你的「安裝磁區」
然後在console用以下指令"把安裝程式"置於之前的250G安裝區  ( /Volumns/UsbBoot )
----------------------------------------------
sudo /Applications/Install\ macOS\ Ventura.app/Contents/Resources/createinstallmedia --volume /Volumes/UsbBoot --nointeraction
---------------------------------------------
順利完成後UsbBoot會存放安裝Ventura所需要的工具
然後重開機,長接電源鈕進入start Manager,選擇install ventura
再選擇欲安裝到的目的碟(剛才的UsbMain)
之後就是安裝的事了




2023年2月26日 星期日

在mac之下的vs2022,點擊「*.xib」檔,卻不見xcode開啟設計介面,即便開啟,也無法看到其他相關檔案(如*.h檔)

 如果你要用純粹的xamarin.ios架構設計,而不用xamarin.form架構的話

你應該會覺得在設計介面時(如UIViewController),是非常麻煩的事
終究還是要回到mac裡去作業
這不要緊,最麻煩的事,還有些靈異現象--
「明明昨天設計LaunchScreen還好好的,一點LaunchScreen.storyboard
就會啟動xocde的設計畫面,而且左側會把整個c#的xamarin.ios project目錄結構都列出來
而今天才剛加入一個新的ViewController,點了.xib,卻美釘美當」.....
如圖..
------


------
如果你硬在xcode裡開那個xib檔,左側的navigator project view會不出現整個project
只會出現那個xib檔
----


------
嗯,這很奇怪,在加入這個新的UIViewController之前真的都好好的...
「可是,你有沒有看到,好像多出來一個兩奇奇怪怪的東西.....」
「對耶,那個目錄跟它的外層都有多一個View1.cs」
「拿掉看看,反正死馬當活馬醫了」
「來人啊,把那兩個View1.cs都給我拖進.....乖乖桶回收桶去」
說也奇怪(不是奇怪,是我不了解xcode,畢竟它對我而言,真的只是姑不而將才用的畫面設計工具)
刪了這兩個檔案後,再雙點擊xib檔,就又正常了
------


-------

每幾年ios改版,對app的權限就又會再設限了些.於是我就要再回來改它拯救它
好像終極戰士(praditor)系列一樣,三天兩頭就要回來打怪一次....



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新的,那一定會入不敷出的