Raspberry Pi インストールからHeadless環境構築まで

やりたいこと

  • Raspberry Pi の OS をインストール
  • セキュリティ強化
  • SSHやVNCで接続できるようにする

1. Raspberry Pi OS インストール

https://www.raspberrypi.com/software/ より Download for Windows をクリックして,ダウンロード.

ダウンロードが完了したら,ファイルを実行する.

OS選択ボタンを押して,RaspberryPi OS(32-bit) を選択

次にストレージ選択ボタンを押して,インストールするSDカードを選択する

最後に,WRITEボタンを押してイメージの書き込みを開始する.

本当にSDカードに書き込んでよいのか聞かれるので, Yes.

ラズベリーパイが焼けるまで待ちます.

書き込むマシンの性能にもよりますが,おおよそ5分程度かかります.

無事に焼きあがっていれば,下記のようなダイアログが出てるので,

ディスクを取り出します.ディスクを取り出すときは,右下の

焼き上がったSDカードをラズパイに差し込みます.

ラズパイにモニターと電源を接続します.

このとき,電源は,2.5A 以上の出力のものを使うこと,

また忘れやすいのですが,ケーブルも2.5A以上の出力用の
(内部抵抗の低い)ものを使いましょう.

私は,800mA の電源を使っていたため,
Wi-Fi(消費電力多め)を使った瞬間に電源が落ち,
無駄に時間を浪費しました.(原因が分からず悩み時間でorz

起動を確認したら,Next を押します.

ロケーションの設定です.時刻や言語の設定になります.

私はUSキーボードしか使わないので,
“Use US Keyboard” にもチェックをいれました.

デフォルトで作成されるユーザアカウント名 pi のパスワードを設定します.

タスクバーの位置について聞かれますが,無視します.Nextで.

WiFiの設定です.繋げたいSSIDを選択し,パスワードを入力します.

ネットに繋がったら,ソフトウェアアップデートをするので,Nextを押します.

最後に再起動します.

2. セキュリティ強化

  • pi ユーザの削除 : デフォルトのアカウントのままだと,パスワードクラックを受けやすくなります
  • オートログインの無効化
  • root のパスワードを設定しておく

の3点を行います.

pi ユーザの削除

pi をただ削除するだけだと,ログインできなくなってしまうので,
新規にアカウントを作成します.ここでは mypi を新ユーザとします.

ターミナルを立ち上げます.

sudo adduser mypi

piと同じ権限をmypiに付与するため,まず pi に与えられた権限を確認.

groups pi

pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio,lpadmin の権限があることが確認できたので,mypiに付与します.

sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio,lpadmin mypi (←カンマで区切り,スペースは入れない

pi ユーザのホームディレクトリの中身を mypi へコピー

sudo cp -r /home/pi/* /home/mypi

最後に piユーザでログインできないようにします.
pi のアカウント有効期限を過去のものにするコマンドを使います.

sudo usermod –expiredate 1 pi

再起動して,mypi でログインし直します.

オートログインの無効化

root のパスワードの設定

sudo passwd root

3. SSHやVNCで接続できるようにする

SSHやVNCはネットワークの設定をするため,
PCとラズパイの位置付けで設定内容が変わってしまうのですが,
話をややこしくしないために,まずは同一LAN内にいるとします.

具体的には,下記のような感じです.
PCもラズパイも同じルータからIPアドレスをもらってます.

それではVNCの設定から行っていきます.
VNCは,ラズパイのGUI をLAN内から制御できる仕組みです.
リモートデスクトップとも呼ばれます.

インターフェース → VNC, SSHの有効化します.
SSH はCUIベースのリモート接続ツールです.
後ほどSSH でも接続できるようにするので,有効化しておきましょう.

デスクトップ右上のVNCサーバのアイコンをクリックして
出てくるIPアドレスをメモしておきます.

続いて,PC側に VNC クライアントをインストールします.

https://www.realvnc.com/en/connect/download/viewer/

ダウンロードが完了したら,アプリを立ち上げ,
「New Connection」を選択します.

先ほど,メモしたIPアドレスを入力します.

ダブルクリックで起動します.

ディスプレイをつながなくても,VNCだけで運用できるように,
あらかじめ画面の設定をしておきます.

PC側のモニタの解像度に合わせて,Headless Resolution の値を変更します.
設定変更後,再起動を促されるので,再起動します.

※注:上記画像では1280×720 になってますが,実際は1920×1080にしました.

再起動すると,画面がおかしなことになっていることが確認できます.

ターミナルを開き,sudo vi /boot/config.txt で設定ファイルを編集します.
17, 18行目の先頭の# を外して,以下のように書き換えます.

framebuffer_width=1920
framebuffer_height=1080

また,62 行目をコメントアウトしておきます.

この部分,ネットには,同設定ファイルの 62行目の末尾に
「,nocomposite」を追記するやり方もありますが,
それだと,HDMI接続の場合にディスプレイに映らなくなります.

万が一,VNCが繋がらなくなった場合,
ディスプレイを繋いでのレスキューができないということです.

なので,繰り返しになりますが,62行目はコメントアウトで対応しましょう.

なお,最悪,VNC/HDMI 共に繋がらなくなったら,
microSDをラズパイから抜き,PCに入れて,SDカードドライブから
config.txt をメモ帳などで修正し,再度ラズパイに入れれば,
HDMI接続できるようになります.

上記の設定ファイルの書き換えが終わったら,再起動します.
以上でVNCの設定は終わりです.

次にSSH の設定です.

SSHの接続のやり方には主に2つあり,

  • パスワード認証:id, pass を入力して一致したら認証する
  • 公開鍵認証:クライアント側で,錠前(公開鍵)と鍵(秘密鍵)を用意しておき,あらかじめ錠前をサーバーに渡しておき,その錠前に鍵を使って認証する

デフォルトは,パスワード認証になっているが,セキュリティ的に公開鍵認証に比べて弱いので,公開鍵認証へ変更する.

まずデフォルト状態のパスワード認証で接続できるか,をテストします.

Windows のPowerShell を立ち上げて,ssh mypi@192.168.1.3 と入力.

初回だけ「今までに繋げたとこじゃないけど本当に繋げますか?」と聞かれるので,yes.

パスワードを入力するとログインできることを確認.

exit でログアウトする.

続いてPowerShell内 で公開鍵・秘密鍵を生成します.
.ssh フォルダが自動生成され,その中に入っているid_rsa が秘密鍵,
id_rsa.pub が公開鍵,です.
PS C : users > ssh-keygen 
-t 
rsa 
eneratina vate rsa kev Dai r 
096 
‘Enter file in which to save the kev (c: users . ss rsa . 
Enter passphrase (empty tor no passphrase) : 
Enter. same oassohrase aaain• 
our Identifi cation has been save nn c: .ssh/id_rsa. 
our public key has been saved in c: 
he key fingerprint is: 
SHA256:- 
he key’s ranQ)tnart image is: 
[RSA 4096]—-+ 
ps C. 
rsy9LAPTOP-FZE+F4F.; “><br> <br>ssh-keygen コマンドで RSA暗号(公開鍵と秘密鍵の生成ロジック)を指定すると,デフォルトで3072bit の暗号強度となります.<br>-b 4096 と指定することで,4096bit へ変更できます.<br><br>ssh-keygen -lf id_rsa で出来あがった鍵の素性を確認できます.<br><br><img src=

ためしにデフォルト状態で生成した鍵の素性は以下の通り3072bit になってます.




出来上がった公開鍵(id_rsa.pub)をRaspberryPi へ送ります.

まず,SSHでRaspberryPi に入り,送り先のフォルダ .ssh をホームディレクトリに作ります.
Linuxは外部から公開鍵を使ったSSH接続を試みられた場合,
このフォルダ内にある公開鍵を使います.

終わったら, SCPで公開鍵を送ります.

その後,autorized_keys に追記(初めての場合は自動で新規作成されるし,公開鍵(id_rsa.pub)は削除します.

フォルダとファイルのアクセス権限を変更します(chmod).

  • authorized_keys ファイルを管理者のみ読み書きできるよう 600 に
  • .ssh フォルダは管理者のみが実行と読み書きができるよう700に

最後に,sudo vi /etc/ssh/sshd_config で,

・rootユーザでのログインの禁止

・パスワード認証ssh を無効化して,公開鍵認証sshのみ許可

を行い,SSHサービスを再起動し,

ログアウトします.

最後に,クライアント側からSSH接続できるか確認します.

明示的に 秘密鍵を指定する場合は,
ssh -i id_rsa mypi@192.168.1.3 のようにします.

以上で,Raspi にHeadless(モニターやキーボード類を準備しなくてよい)環境を構築できました.

Amazon Fire HD タブレットをサブディスプレイ化する方法

やりたいこと(やったこと)

  • 興味本位で3年前に買った Fire HD 8 タブレット
  • 今ではその「操作もっさり感」からまるで使わない
  • せめてPCのサブディスプレイとして運用したい
  • とはいえ,1280×800 と解像度的にはきつい...
  • CPU負荷率グラフとかをモニタリングはどうか

1. Fire HD と PC を接続する

Spacedesk というフリーソフトを使って,

PCの画面をローカルネットワーク経由でFireHDに飛ばして表示させます.

PC 側 の準備

https://www.spacedesk.net/ より,サーバーソフトをダウンロード.

インストール後,サーバーアプリを立ち上げます

これでPC側の準備は終わりです.

Fire HD 側の準備と接続

amazon apps アプリストア を起動

検索ボタンを押す

「spacedesk」で検索してインストール

アプリを起動します

中央右の「+」ボタンを押します

自分のPCのIPアドレスを入力します.

PCのIPアドレスが分からなければ,

PC側でコマンドプロンプトを起動して,

ipconfig と打って,IPv4アドレスの項目を参照してください.

以上で,PC側に接続されるはずです.

2. CPUモニタリングソフトの選択と起動

CPU使用率モニタとして使用するにあたり,

タスクマネージャーを使うのもよいのですが,

単一項目のグラフしか表示できません.

CPU・メモリ・ネットワーク使用量のグラフは見たいので,

フリーソフトを導入します.

候補1. KMeter

こんな感じで,各種項目の分だけアナログメータを追加できます.

また,大きさの調整もでき,Fire HD の画面サイズいっぱいに表示もOK.

ただ,惜しむらくはグラフが表示できないところ.

なので,候補2 の紹介となります

候補2. myResources 1.5.0.12

https://softaro.net/myresources/

ダウンロードに起動したら,DCMという小さいウィンドウが出てきます.

DCMはそれぞれDisk, CPU, Memory の略で,負荷率でアイコンの色が変動します.

右クリックをしてグラフを配していきます.

おススメ1. CPU, メモリ, ディスク, ネット各々個別のグラフ表示

CPU, RAM(メモリ), Disk のグラフを表示

ネットワーク(アップロード,ダウンロード)を表示

適当にサイズも調整しながら画面いっぱいに並べる.

グラフの色の変更は後述します.

おススメ2. 全部まとめてグラフ表示

ネットワークを表示.

Max lines のチェックを外して,非表示に.

Legend を押して,凡例を表示

グラフの色の変更

好みにもよりますが,寒色系を中心に設定するとクールです.

個別グラフの方はこんな↓感じになります.

まとめ

候補1. KMeter, 候補2.myResources とある中,

私は候補2で全部まとめて表示にして使うことにしました.

理由は,

  • 時系列でモニタリングできること
  • 負荷率の関連性(CPUが上がると,メモリも上がるのか)も見たい

の2点になります.

最後に余談ですが,現在の私の画面構成は5枚になりました.

悪ノリで iPhone や iPad も繋げると,夢(?) の7枚構成も可能です(笑)

物理上の置き場所という壁があるため,実現には至りませんが.

WindowsユーザのためのMacbookのUS版キーボードの設定

何がしたいのか

  • 日本語入力モードでも半角でスペースを入れたい, 句読点は「,.」を使いたい
  • HHKB US版となるべく同じキー配置にしたい
    ex. caps lock → Ctrl, 右Command → 言語切替
  • スクショを手軽に取りたい

1. Google Input mac版をインストール

半角スペース強制,句読点「,.」へ変更のために,

Google Input をインストールする.

インストール後に右上のアイコンを右クリックして,環境設定より,

句読点とスペースの設定を行う.

2. Karabiner をインストールする.

caps_lock に 左command を,

左command に print_screen(F13) を,

右command に F16 を割り当てる.

3. システム環境設定で,ショートカットの設定を行う

アップルメニュー → システム環境設定 → キーボード → ショートカット内で,

入力ソースを選択し,「前の入力ソースを選択」を右command(F16) にする.

さらに,スクリーンショットのショートカットを左command を中心に,設定していく.この辺のキーの組み合わせはお好みで.

How to deploy for Python Flask application with API / View separation / APIとViewを切り分けたPython Flaskアプリのデプロイ方法

参考記事

https://loochs.org/how-to-deploy-for-minimum-flask-application-on-apache-apache/

初めに

以下のような構成でアプリをデプロイしたいとする

APIの実装

$ cd /home/ubuntu/hoge/test
$ vim api/body.py
# api/body.py

from flask import Flask, Blueprint

api = Blueprint('api', __name__) # apiをモジュールとして定義

@api.route('/')
def index():
    return 'This is api'

上記のapiをモジュールとして読み込むためにアプリロジックを以下のようにする。

$ vim __init__.py
# __init__.py

import sys
sys.path.insert(0, '/home/ubuntu/hoge/test')

from flask import Flask
app = Flask(__name__)

from api.body import api
app.regster_blueprint(api, url_prefix='/api')

@app.route('/')
def index():
    return 'This is app route'

if __name__ = '__main__':
    app.run(host='0.0.0.0')

Apacheの設定変更

任意のurl、例えばhttp://sample.com/hoge/api でレスポンスが得られるようにしたい

$ cd /etc/apache2/sites-available/
$ sudo vim 000-default.conf
# 000-default.conf
LoadModule wsgi_module "/home/ubuntu/hoge/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so" # 補足①を参照
WSGIPythonHome "/home/ubuntu/hoge/venv"
WSGIScriptAlias /hoge /home/ubuntu/hoge/flaskapp.wsgi
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        ServerName sample.com
        DocumentRoot /var/www/html

        <Directory /home/ubuntu/hoge > # アクセス許可のためのディレクティブ設定
                Require all granted
        </Directory>

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${​​​​​APACHE_LOG_DIR}​​​​​​​​​​​​/error.log
        CustomLog ${​​​​​​​​​​​​​​​​​​​APACHE_LOG_DIR}​​​​​​​​​​​​​​​​​​​​​​​​​​/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

How to deploy for minimum Python Flask application on Apache / Apache上で最小構成のPython Flaskアプリをデプロイする方法

WSGIファイルの設定

$ cd /home/ubuntu/
$ mkdir -p hoge/test # hogeアプリのディレクトリ、各種コードはhoge/testに格納する
$ cd hoge
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install flask mod_wsgi
$ vim flaskapp.wsgi
# flaskapp.wsgi
import sys
sys.path.insert(0. '/home/ubuntu/hoge') # wsgiは絶対パスによる参照が必要
from test import app as application # 後述

Flaskアプリの実装

$ cd /home/ubuntu/hoge/test
$ vim __init__.py
# __init__.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hoge'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

Apacheの設定、.confの編集

$ cd /etc/apache2/sites-available/
$ sudo cp 000-default.conf 000-default.conf.bk # バックアップ
$ sudo vim 000-default.conf
# 000-default.conf
LoadModule wsgi_module "/home/ubuntu/hoge/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so" # 補足①を参照
WSGIPythonHome "/home/ubuntu/hoge/venv"
WSGIScriptAlias /hoge /home/ubuntu/hoge/flaskapp.wsgi
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        ServerName sample.com
        DocumentRoot /var/www/html

        <Directory /home/ubuntu/hoge > # アクセス許可のためのディレクティブ設定
                Require all granted
        </Directory>

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${​​​​​APACHE_LOG_DIR}​​​​​​​​​​​​/error.log
        CustomLog ${​​​​​​​​​​​​​​​​​​​APACHE_LOG_DIR}​​​​​​​​​​​​​​​​​​​​​​​​​​/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

補足① wsgi_module、WSGIPythonHomeの取得

以下コマンドで各種パスを取得

$ mod_wsgi module-config

Micro Maqueen with remote operation / マイクロマックイーンをリモート操作する

初めに

マイクロマックイーンをリモート操作する拡張機能を作りました。まぁまぁ使えるもののしばらく間が経ってしまうとどうやってプログラムすればいいかわからなくなってしまうので覚書として残しておきます。

プログラムの手順

  • 新規プロジェクトをmakecode上で2つ作成する。一つはreceiver(受け手)、もう一つはsender(送り手)とする。
  • まずはreceiverを開いて 「高度なブロック」->「拡張機能」を開く
  • 以下のurlを検索窓に入力すると以下のような画面が表示されるのでクリックする。
    • https://github.com/kichinosukey/super-hand-power.git
  • 以下のように「HandPower」と「Maqueen」が拡張機能として追加されている。
  • 続いて以下のようにプログラムを追加する。
初めに無線通信のグループを定義(番号はreceiver-senderと共通であればなんでも良い)し、無線で受信した番号をreceiver関数の第一引数に設定する。第二引数はreceiver内部の処理が都度終了するたびに発生する待ち時間[ms]。第三引数はモーターの回転スピードを0-255で指定可能。
  • senderも同様に拡張機能を追加したら以下のようにプログラムを追加する。
無線グループはreceiverと同じく1、sender関数の第一引数はreceiverの第二引数と同様に処理の待ち時間となる。

動作風景

Change default setting for add new users on linux / Linux上で新規ユーザー追加時のデフォルト設定を変更する

やりたいこと

  • jupyterhubでのユーザー追加時にデフォルトでnotebooksフォルダを追加したい
  • プロキシ設定をデフォルトで追加したい

新規ユーザー登録時のデフォルトフォルダの設定

$ sudo mkdir /etc/skel/notebooks # /etc/skelがスケルトンディレクトリと言い、新規ユーザーのホームディレクトリに自動的にコピーされる

プロキシ設定を追加する

$ vim /etc/skel/.bashrc

export HTTP_PROXY=[proxy]
export HTTPS_PROXY=[proxy]

補足

ちなみにユーザー追加時のデフォルト設定は以下のコマンドから確認可能

$ useradd -D # DはDefault
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

マイクロビットを使ったクリスマスアクセサリー製作編 /第38回アソビワークショップ開催報告

こんなものを使いました

どんなことをしたか

前回デザインしたアイディアに基づいてそれぞれの作品を作り始める

設計図を書く人
何やってるか教えてくれない人
音にこだわる人

何が出来たか

アイディアを実現させるための道具が揃いました。具体的にはLEDとその制御プログラムです。これを各々の色んなアイテムと合体させてオリジナルアクセサリーを作っていきます。

LEDの点滅制御、ジャンパワイヤー添え
設計図に基づいて作成しました。実は2台のマイクロビットの無線通信で実現しています。

未PR資料