跳至主要內容

不需螢幕設定 Raspberry Pi

· 2 分鐘閱讀

本指南說明如何在不需要螢幕的情況下設定 Raspberry Pi。

  • 需要可連接網路線進行有線連線的 Raspberry Pi 裝置。
  • 需要一台電腦來操作 Raspberry Pi。

安裝 Raspberry Pi Imager,選擇 OS。選擇要寫入的 micro SD 卡,然後點擊 WRITE。

Raspberry Pi Imager

設定

啟用 SSH

啟用 SSH 可讓您遠端操作 Raspberry Pi。

重新插入 micro SD 卡,並在根目錄中直接建立一個名為 ssh 的文字檔案,不需要副檔名。

Raspberry Pi enable SSH

啟用 VNC

開啟 config.txt,取消以下幾行的註解並儲存:

framebuffer_width=1280
framebuffer_height=720

Raspberry Pi enable VNC

開機

將 micro SD 卡插入 Raspberry Pi,連接電源並開機。

透過 SSH 連線

使用主機名稱 raspberrypi、使用者名稱 pi、密碼 raspberry 進行連線。

Raspberry Pi connect SSH

更新套件

sudo apt update
sudo apt upgrade -y

啟用 VNC

sudo raspi-config

Raspberry Pi config

選擇 3 Interface Options,然後選 P3 VNC,再選 YES。按 Finish 關閉。

透過 VNC 連線

Raspberry Pi VNC viewer

使用與 SSH 相同的使用者名稱和密碼。

Raspberry Pi VNC connected

啟用 Wi-Fi

透過 VNC 啟用 Wi-Fi 後,就不再需要有線連線,只需電源即可操作 Raspberry Pi。

透過 rbenv 安裝的 Ruby 在 Webrick 上 CGI 無法運作的解決方法

· 1 分鐘閱讀

在瀏覽器中執行 CGI 時,發生以下錯誤: /usr/bin/env: 'ruby': No such file or directory

#!/usr/bin/env ruby

# ...

原因

$PATH 未設定。

#!/usr/bin/env bash

echo -ne "Content-type: text/html\n\n"
echo $PATH

執行後會顯示:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

這表示包含 Ruby 的目錄不在其中。

解決方法

使用 :CGIPathEnv 設定 Ruby 路徑。

srv = WEBrick::HTTPServer.new({
:DocumentRoot => "./site/",
:Port => 8080,
:CGIPathEnv => ENV["PATH"]
})

如何建立 gem

· 1 分鐘閱讀

建立模板

bundle gem <GEM Name> -t
cd <GEM Name>

編輯 Gemspec

  1. 開啟 <GEM Name>.gemspec
  2. 編輯 spec.summaryspec.descriptionspec.homepage
  3. 將首頁 URL 寫入 spec.metadata["allowed_push_host"]
  4. 將 Gem 的頁面寫入 spec.homepage
  5. 將儲存庫 URL 寫入 spec.metadata["source_code_uri"]
  6. changelog.md 的 URL 寫入 spec.metadata["changelog_uri"]

至少需要設定上述內容。

推送到 GitHub 並安裝

git init
git add .
git commit -m First Commit
git remote add origin [email protected]:<username>/<GEM Name>.git
git push -u origin master

安裝

gem install specific_instal
gem specific_install -l "git://github.com/<username>/<GEM Name>.git"

Gemfile

gem "<GEM Name>", github: "<username>/<GEM Name>.git", branch: :main

TIV

· 3 分鐘閱讀

這篇備忘錄記錄了 TIV。

資訊

TIV 是一個簡單的命令行影像查看器,它允許你在終端中直接預覽影像,無需打開圖形界面應用程式。它通常與 fzf 和其他命令行工具結合使用,以提高工作效率。

安裝 TIV

TIV 是一個用 Go 語言編寫的工具,你可以從其 GitHub 儲存庫編譯安裝,或者使用預編譯的二進制文件。

從源碼安裝 (需要 Go 環境)

  1. 安裝 Go:如果你還沒有安裝 Go,請參考 Go 官方網站 進行安裝。

  2. 克隆 TIV 儲存庫

    git clone https://github.com/ngryman/tiv.git
    cd tiv
  3. 編譯並安裝

    go install .

    這會將 tiv 可執行文件安裝到你的 $GOPATH/bin 目錄中。請確保該目錄已添加到你的 $PATH 環境變量中。

使用預編譯的二進制文件 (推薦)

你可以在 TIV 的 GitHub Releases 頁面 下載適用於你系統的預編譯二進制文件。

  1. 下載:選擇最新版本,下載對應你操作系統的壓縮包。

  2. 解壓縮:將下載的文件解壓縮到你喜歡的位置。

  3. 移動到 PATH:將解壓縮後的可執行文件(例如 tiv)移動到你的 $PATH 中的任何目錄(例如 /usr/local/bin)。

    sudo mv tiv /usr/local/bin/

使用 TIV

TIV 的基本用法是直接在命令行中指定影像文件路徑:

tiv image.jpg

它會嘗試在你的終端中渲染影像。效果會根據你的終端類型和配置有所不同。

結合 fzf 使用

TIV 與 fzf(一個模糊查找器)結合使用時非常強大,可以快速預覽多個影像:

find . -type f -name "*.png" -o -name "*.jpg" | fzf --preview 'tiv {}'

這個命令會:

  1. 使用 find 查找當前目錄下的所有 .png.jpg 文件。
  2. 將這些文件列表傳給 fzf
  3. fzf 會顯示一個可搜索的列表,並在預覽窗口中實時顯示選定文件的 TIV 預覽。

注意事項

  • 終端支援:TIV 的渲染效果很大程度上取決於你的終端模擬器是否支持 256 色或真彩色。某些終端可能無法正確顯示影像。
  • 影像大小:由於終端字符的限制,顯示的影像解析度會降低。TIV 主要用於快速預覽,而不是高質量查看。
  • 性能:對於非常大的影像文件,渲染可能會比較慢。

總結

TIV 是一個實用的命令行工具,它為那些喜歡在終端中工作的人提供了一種快速預覽影像的方式。結合 fzf 等工具,它可以極大地提升你的命令行工作流程效率。

GCD 程式

· 2 分鐘閱讀

這篇筆記記錄了 GCD(最大公約數)的 C 語言程式。

什麼是 GCD?

資訊

GCD(Greatest Common Divisor),中文稱為最大公約數,是指兩個或多個整數共有的約數中最大的一個。

例如,24 和 36 的公約數有 1、2、3、4、6、12,其中最大的公約數是 12。

歐幾里得演算法 (Euclidean Algorithm)

計算 GCD 最常見且有效的方法是歐幾里得演算法。其原理基於以下定理:

$$ \gcd(a, b) = \gcd(b, a \bmod b) $$

當 $b = 0$ 時,$\gcd(a, 0) = a$。

C 語言程式碼實現

遞迴版本:

// gcd.c
int gcd(int a, int b){
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}

非遞迴版本:

// gcd_iterative.c
int gcd_iterative(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}

測試程式

#include <stdio.h>

// 遞迴版本的 GCD 函數
int gcd(int a, int b){
return !b ? a : gcd(b, a % b);
}

// 非遞迴版本的 GCD 函數
int gcd_iterative(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}


int main(void){
printf("GCD(24, 36) = %d
", gcd(24, 36)); // 輸出 12
printf("GCD_iterative(24, 36) = %d
", gcd_iterative(24, 36)); // 輸出 12
printf("GCD(48, 18) = %d
", gcd(48, 18)); // 輸出 6
printf("GCD_iterative(48, 18) = %d
", gcd_iterative(48, 18)); // 輸出 6
return 0;
}

總結

GCD 是數論中的一個基本概念,歐幾里得演算法提供了一種高效的計算方法。無論是遞迴還是非遞迴實現,其核心思想都是利用模運算將問題規模不斷縮小,直到其中一個數變為零。

安裝 ImageMagick

· 2 分鐘閱讀

這篇筆記記錄了在 Ubuntu 上安裝 ImageMagick 的方法。

資訊

ImageMagick 是一個開源的軟體套件,用於創建、編輯、組合或轉換點陣圖影像。它支持多種影像格式,包括 PNG、JPEG、GIF、TIFF 和 PDF。

安裝步驟

1. 更新套件列表

在安裝任何新軟體之前,最好先更新系統的套件列表:

sudo apt update
sudo apt upgrade

2. 安裝 ImageMagick

直接使用 apt 命令安裝 ImageMagick:

sudo apt install imagemagick

這會安裝 ImageMagick 的核心工具和庫。如果你還需要開發庫,可以安裝 imagemagick-dev

sudo apt install imagemagick-dev

3. 驗證安裝

安裝完成後,你可以通過檢查 ImageMagick 的版本來驗證是否成功:

convert --version

magick --version

你應該會看到類似以下的輸出:

Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: DPC HDRI OpenMP
Delegates (built-in): bzlib djvu fftw fontconfig freetype gslib heic jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png raw rsvg tiff webp wmf x xml zlib

4. 基本使用範例

將 JPEG 影像轉換為 PNG 格式:

convert input.jpg output.png

調整影像大小:

convert input.jpg -resize 50% output_resized.jpg

添加文字到影像:

convert input.jpg -gravity South -pointsize 36 -fill white -annotate 0 'Hello, ImageMagick!' output_text.jpg

常見問題和故障排除

  • 權限問題:如果你在執行 ImageMagick 命令時遇到權限錯誤,請確保你對輸入和輸出文件有讀寫權限。
  • 文件格式不支持:如果轉換失敗,可能是因為缺少某些文件格式的支援。檢查 convert --version 的輸出中的 "Delegates" 部分,看看是否包含了你需要的格式。如果沒有,可能需要安裝額外的庫(例如 libjpeg-dev, libpng-dev)。
  • Policy 問題:在某些情況下,ImageMagick 的預設安全策略可能會限制某些操作,例如處理 PDF 文件。這通常可以通過編輯 /etc/ImageMagick-6/policy.xml 文件來解決,但請謹慎操作。

總結

ImageMagick 是一個功能強大的影像處理工具,通過上述步驟可以輕鬆地在 Ubuntu 上安裝和使用它。它提供了豐富的命令行工具,可以滿足各種影像處理需求。

使用高斯濾波器進行降噪(Python / Scipy)

· 1 分鐘閱讀

以 1[Hz] 的正弦波作為訊號範例。 在訊號上疊加由均值為 0、標準差為 0.5 的常態分布隨機數所產生的雜訊。

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter1d

t = np.arange(1000) / 100
s = np.sin(2*np.pi*t)
noise = np.random.normal(0, 0.5, size=len(t))
x = s + noise

plt.plot(t, x, label="+noise")
plt.plot(t, s, label="signal")
plt.legend(loc=1)
plt.show()

pyplot

套用標準差為 5 的高斯濾波器。 標準差越大,結果越平滑,但與原始訊號的偏差也越大。

y = gaussian_filter1d(x, 5)
plt.plot(t, y, label="filtered")
plt.plot(t, s, label="signal")
plt.legend(loc=1)
plt.show()

pyplot

安裝與設定 Pyenv

· 2 分鐘閱讀
  1. 複製 Pyenv 複製 Pyenv 的儲存庫。 建議的目錄為 ~/.pyenv

git clone https://github.com/pyenv/pyenv ~/.pyenv


0. 編譯 Bash 擴充功能以提升速度
可以編譯 Bash 擴充功能來提升效能。
即使編譯失敗,仍可正常運作。

```sh
cd ~/.pyenv && src/configure && make -C src
  1. 設定(bash) 路徑及其他設定。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile echo 'eval "$(pyenv init --path)"' >> ~/.profile export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)" echo -e 'if shopt -q login_shell; then'
'\n export PYENV_ROOT="$HOME/.pyenv"'
'\n export PATH="$PYENV_ROOT/bin:$PATH"'
'\n eval "$(pyenv init --path)"'
'\nfi' >> /.bashrc echo -e 'if [ -z "$BASH_VERSION" ]; then'
'\n export PYENV_ROOT="$HOME/.pyenv"'
'\n export PATH="$PYENV_ROOT/bin:$PATH"'
'\n eval "$(pyenv init --path)"'
'\nfi' >>
/.profile


# 安裝 Python 環境

## 安裝相依套件
```sh
sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblemgma-dev -y

查看可安裝的環境

pyenv install -l

安裝

編譯需要一些時間,請耐心等候。

CONFIGURE_OPTS= "--enable-shared" pyenv install 3.9.5

確認版本

pyenv versions

切換版本

pyenv global 3.9.5