2024/5/10

memo : ssh-copy-id

mlinux 用ssh-copy-id,windows 的話,就把 .ssh/id_rsa.pub 裡面的資料加到 server 的 .ssh/authorized_keys 就可以。

C:\User\<user-name>\.ssh

2024/5/7

enable ims serice

ims 是 4G 網路提供Voice Call 的服務 (VoLTE)。
所以要在連接4G 基地站時,做Voice 的撥/接,就要啟動 ims 服務。

這個是quectel 的命令.

MBN 好像是profile之類的 config 檔。
會針對不同營運商調整,而一般,最普通,未調整的就是 ROW_Generic_3GPP.
所以這個可以連所有營運商(?)

列出目前所有mbn檔
at+qmbncfg="list"
+QMBNCFG: "List",0,1,1,"ROW_Generic_3GPP",0x0501081F,201901141
+QMBNCFG: "List",1,0,0,"VoLTE-ATT",0x0501033C,201810121
+QMBNCFG: "List",2,0,0,"hVoLTE-Verizon",0x05010140,201811131
+QMBNCFG: "List",3,0,0,"Commercial-Sprint",0x05010205,201904021
每個 list 內容是:
  • index
  • selected
  • activate
  • name
  • version
  • release date
上面的example 代表select ROW_Generic_3GPP,而且也是active.

要select 用: AT+QMBNCFG="Select","ROW_Generic_3GPP"

要deactivate 用: AT+QMBNCFG="Deactivate" 就可以

QMBNCFG 用來確認有沒有activated profile.

然後是 ims 服務.
at+qcfg="ims"
+QCFG: "ims",0,0

OK
第一個數字是configuration:
  • 0: 由 MBN file 決定
  • 1: 啟動ims
  • 2: 不啟動ims
第二個數字代表VoLTE狀態
  • 0: VoLTE is disabled
  • 1: VoLTE is enabled
設定 ims 可以用:
at+qcfg="ims",0
ok
設定完後,要重新啟動:
at+cfun=1,1
OK
之後狀態才會生效。

AT+COPS 與基地站相關的操作

列出所有的基地站
at+cops=?
+COPS: 
(1,"Chunghwa Telecom","Chunghwa","46692",7),
(2,"Chunghwa Telecom","Chunghwa","46692",2),
(1,"TWN APT","APT","46612",7),
(3,"TWN APT","APT","46605",7),
(3,"TW Mobile","TWM","46697",2),
(3,"T Star","T Star","46689",7),
(3,"TW Mobile","TWM","46697",7),
(3,"T Star","T Star","46689",2),
(1,"Far EasTone","FET","46601",2),
(3,"TWN APT","APT","46605",2),
(1,"Far EasTone","FET","46601",7),
,(0-4),(0-2)
回答的每一行的每一個item是:
(stat,long alphanumeric,short alphanumeric,numeric,AcT)
stat:
  • 0: 未知
  • 1: 可用
  • 2: 目前使用中
  • 3: 禁用
long/short aplhanumeric 就是 operator的名稱,全名和縮寫。
Act 就是基地站的技術
  • 0 GSM
  • 1 GSM Compact
  • 2 UTRAN
  • 3 GSM w/EGPRS
  • 4 UTRAN w/HSDPA
  • 5 UTRAN w/HSUPA
  • 6 UTRAN w/HSDPA and HSUPA
  • 7 E-UTRAN
所以上面的list 可以看出...目前用的是 Chunghwa, UTRAN (就是3G)

設定自動選擇基地站 at+cops=0:
at+cops=0
ok

CTZE: "+32",0,"2024/05/07,02:26:11"

+CTZE: "+32",0,"2024/05/07,02:42:37"
設玩好像重新開機,然後問目前的基地站是:
AT+COPS?
+COPS: 0,2,"46692",7

OK

手動選擇基地站要用at+cops=1:
at+cops=1,2,"46692",2
OK

+CTZE: "+32",0,"2024/05/07,02:54:36"
好像也會重開機?
1 代表 手動,後面的 2 是 format 用 numberic, 所以後面用 "46692" 也就是 Chunghwa Telecom 的 numberic 代表號,最後是基地站的技術 7 - E-UTRAN也就是 LTE.

2024/5/2

VoLTE and IMS

ref: 以前Voice 跟 Data走的路不一樣。
Voice 是 switch - 就是像以前接線生依樣,把兩端用專用的線接起來。
Data 是 IP - 就是切割成一小塊一小塊,在網路中送到對手上。
所以當 Voice時,Data就停止了。因為要切到專用線路。

後來,Voice也想改用Data那樣,切成一小塊,在網路中傳。
所以在Data 的服務中就規劃了 IMS (IP Multimedia Subsystem),負責傳這些小塊的語音資料。

這個服務就叫VoLTE,需要經過 IMS 傳送資料。

在電信系統中,IMS了傳送語音封包,還負責以前語音的一些功能,例如DTMF,SMS。
IMS 提供的服務:
  • VoLTE over IMS
  • SMS over IMS
  • Emergency call over IMS
  • DTMF over IMS
  • SRVCC over IMS (負責舊的交換機系統溝通)

2024/4/30

Docker : container access host network

就是用 "--add-host="host.docker.internal:host-gateway",docker 會再container 的dns中加入 host.docker.internal 到 host ip
測試可以用:
docker container run --rm \
  --add-host="host.docker.internal:host-gateway" \
  debian:stable-slim \
  bash -c "apt-get update && apt-get install -y iputils-ping && ping -c 3 host.docker.internal"

2024/4/26

text-generation-webui error , character 'None'

有時候開啟chat 頁面會沒反應,一開始的 hello 訊息也沒出來。
console 的 error 是:
ERROR    Could not find the character "None" inside characters/. No character has been loaded.
  ...
  ...
File "/home/charles-chang/text-generation-webui/modules/chat.py", line 673, in load_character
    raise ValueError
查source 是在 parameter tab 的 chat tab 的Character option 中,沒有選任何一個(Assistant, Example),所以是None
選了之後就好了。


download model

大多需要 lfs,所以 apt install git-lfs 之後,就可以用了。
需要license 的好像還是只能手動。

msys2. SDL2 Hello

ref: 安裝需要的 package:
pacman -S git mingw-w64-x86_64-toolchain mingw64/mingw-w64-x86_64-SDL2 mingw64/mingw-w64-x86_64-SDL2_mixer mingw64/mingw-w64-x86_64-SDL2_image mingw64/mingw-w64-x86_64-SDL2_ttf mingw64/mingw-w64-x86_64-SDL2_net mingw64/mingw-w64-x86_64-cmake make
測試:
$ sdl2-config --cflags --libs
-IC:/msys64/ucrt64/include/SDL2 -Dmain=SDL_main
-LC:/msys64/ucrt64/lib -lmingw32 -mwindows -lSDL2main -lSDL2
用上面ref 的 example:
#include &;t;stdio.h>
#include <SDL2/SDL.h>

const int WIDTH = 800, HEIGHT = 600;

int main(int argc, char *argv[]) {
  SDL_Window *window;
  SDL_Renderer *renderer;
  if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
    printf("SDL_Init failed: %s\n", SDL_GetError());
    return 1;
  }

  window = SDL_CreateWindow("Hello, World!",
                                        SDL_WINDOWPOS_UNDEFINED,
                                        SDL_WINDOWPOS_UNDEFINED,
                                        WIDTH, HEIGHT,
                                        SDL_WINDOW_ALLOW_HIGHDPI);
  if(window == NULL) {
    printf("Could not create window: %s\n", SDL_GetError());
    return 1;
  }
  
  renderer = SDL_CreateRenderer(window, -1, 0);
  SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
  SDL_RenderClear(renderer);

  SDL_RenderPresent(renderer);
  
  SDL_Event event;
  while(1) {
    if(SDL_PollEvent(&event)) {
      if(event.type == SDL_QUIT) {
        break;
      }
    }
  }

  SDL_DestroyWindow(window);

  SDL_Quit();
  return 0;
}
build:
$ gcc -o testsdl testsdl.c `sdl2-config --cflags --libs`