【ラズパイ】Raspberry PiをWebサーバー化する

やり方

Apache + PHP
Setting up an Apache Web Server on a Raspberry Pi – Raspberry Pi Documentation

NGINX + PHP
Setting up an NGINX web server on a Raspberry Pi – Raspberry Pi Documentation

以上。

やってみた

NGINXの方をやってみる。理由は、Apacheだとド定番すぎるから。まあ何でもいいんだけど。

$ sudo apt update
$ sudo apt install nginx
$ sudo /etc/init.d/nginx start

NGINXのインストールと起動は書いてある通りにできた。さすがラズパイ公式。メインPCの方でブラウザにラズパイのIPを打ってアクセスするとNGINXのスタートページが表示された。

このHTMLファイルは/var/www/htmlフォルダにあるそうで、nanoエディタでいじってみようとおもったけど、書き込み禁止になってる。

takeshi@takeshipi:/var/www/html $ ls -al
total 12
drwxr-xr-x 2 root root 4096 Sep  8 21:53 .
drwxr-xr-x 3 root root 4096 Sep  8 21:53 ..
-rw-r--r-- 1 root root  612 Sep  8 21:53 index.nginx-debian.html

所有者がrootになっているので乗っ取る。Apacheのインストール方法説明の中にはこのやり方が載ってた。なんでNGINXの方は載せへんねん。

$ sudo chown takeshi: index.nginx-debian.html

無事編集できるようになった。

これはマズイ。HTML初心者ということがバレる。HEADタグ内に以下を記入。

<meta http-equiv="content-type" charset="utf-8">

よし。

PHPを試す

$ sudo apt install php-fpm
$ cd /etc/nginx
$ sudo nano sites-enabled/default
(設定ファイルを編集~)
$ sudo /etc/init.d/nginx reload

これでPHP7のインストールと有効化が設定された。

$ cd /var/www/html
$ sudo mv index.nginx-debian.html index.php

先ほどのスタートページのファイル名を変更し、適当な場所にPHPのコードを埋め込む。

<p>The time is <?php echo date('Y-m-d H:i:s'); ?>.</p>

赤線の部分がPHPで動的に変わる部分。

おわり

後はルーターのポートフォワーディングを設定すればWebサーバー公開。しばらくはやらないけど。多分。

【ラズパイ】初期セキュリティについて

基本的にはSSH接続でRaspberryPiを運用するときの、最初にすべきセキュリティ設定をメモしておく。

前提としてインストール時に「pi」ユーザーのパスワードは「raspberry」と違うものを設定し、OSのアップデートは済ませているものとする。

以下、手順。

  • rootにパスワードを設定する
  • 新しいユーザーを作成し、「pi」ユーザーを消去
  • SSHの設定(rootログイン禁止、ポート変更、公開鍵認証等)

以前に書いたVPSサーバーの初期設定とも大体一致している。

rootにパスワードを設定する

RaspberryPiのrootにはパスワードが設定されていない、とネットでよく見るけど実際のところpiユーザーからsuコマンドを打ってもパスワード無し、piユーザーのパスワード共に通らずrootにはなれなかった。よく分からないけど別にパスワードを設定するのは手間ではないのでやっておく。

$ sudo passwd root

設定したいパスワードを入力すると、次からはsuコマンドでrootユーザーになれる。

新しいユーザーを作成し、「pi」ユーザーを消去

これはいくつか手順を踏む。

  • newuser(新しいユーザー)作成
  • newuserに権限付与
  • (任意)piユーザー内のファイルをごっそり新規ユーザーにコピー
  • piユーザーの自動ログインを無効化&newuserを自動ログインさせる
  • (任意)newuserで実際にパスワードログイン
  • 新規ユーザーがパスワード無しでsudoコマンドを実行できるようにする
  • メインPCで秘密鍵と公開鍵を作成
  • RaspberryPi側に.sshディレクトリ作成
  • 公開鍵をRaspberryPiに転送
  • 公開鍵をauthorized_keysに書き込み
  • パーミッション設定
  • newuserで公開鍵認証ログイン
  • piユーザーを削除

newuser(新しいユーザー)作成

$ sudo adduser newuser

名前を変える場合はnewuserの部分を変える。

コマンドを打つと、「newuser用のパスワード」「パスワード確認」を求められた後、「Full Name[]」というようなものがしばらく聞かれるが、特に入力する必要は無い。最後にYと入力してEnterを押せば作成完了。

newuserに権限付与

$ sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio newuser

要はpiユーザーが所属するグループ全部に、newuserも含めてやる。piグループにも含めるのはやりすぎ感があるが、まあ一応。piユーザーが所属するグループは以下のコマンドで確認できる。

$ groups pi

それぞれのグループの役割はここを参照。

(任意)piユーザー内のファイルをごっそり新規ユーザーにコピー

$ sudo cp -r /home/pi/* /home/newuser

cpコマンドはコピーコマンドで、Linux操作の超基本。-rはサブディレクトリも含めて全部コピー。/home/pi/*はpiユーザーのホームディレクトリにあるもの全部をコピー元とし、/home/newuserでそのコピー先を指定。

正直piユーザーで特に何もしていないならコピーする必要は無いと思う。自分で作った必要なファイルは自分で退避させる。

piユーザーの自動ログインを無効化&newuserを自動ログインさせる

$ sudo nano /etc/lightdm/lightdm.conf

126行目にあるautologin-user=piをコメントアウトする。その後

$ sudo nano /etc/systemd/system/autologin@.service

として、28行目の--autologin pi--autorogin newuserとする。

また、ブートをデスクトップのままにしているとどうしてもpiユーザーがログインしてしまう。ブート後CLIモードで立ち上げるように設定する。

$ sudo raspi-config

3 Boot OptionsB1 Desktop / CLIB1 Consoleを選ぶ。

こうすると、RaspberryPiにHDMIケーブルをつないで立ち上げてもCLIしか表示されなくなる。その場合、startxコマンドを打てばGUIが立ち上がる。(未検証)

(任意)newuserで実際にパスワードログイン

できるかどうかの確認。

新規ユーザーがパスワード無しでsudoコマンドを実行できるようにする

$ sudo visudo

最後にnewuser ALL=(ALL) NOPASSWD: ALLの一文を加えて保存終了をする。

メインPCで秘密鍵と公開鍵を作成

これはRaspberryPi上ではなく、通常使うPC上で行う。Windowsの場合、コンソールはコマンドプロンプトかPowerShellで。Macは知らん。

$ ssh-keygen -t rsa

作成した鍵の保存場所、パスフレーズ入力、再確認を求められる。終われば、指定した保存場所にid_rsaid_rsa.pubがそれぞれ作成されているはず。

以前に作ったことがあればそれを再利用することが可能。

RaspberryPi側に.sshディレクトリを作成

再度RaspberryPiにnewuserでログインして、以下を打つ。

$ mkdir ~/.ssh

ログイン直後なら~/は無くても可。~/はそのユーザーのホームディレクトリを指す。

公開鍵をRaspberryPiに転送

今度メインPC上に戻って、コンソールから以下を打つ。

$ scp .ssh/id_rsa.pub newuser@(RaspberryPiのIP):/home/newuser/.ssh

ログインパスワードを求められるので入力するとid_rsa.pubが転送される。

scpコマンドはセキュアな(つまり暗号化された)cpコマンドで、通常はネットワーク越しの転送に使う。メインPCからRaspberryPiへ、またはその逆のときに使えばよい。

公開鍵をauthorized_keysに書き込み

再再度RaspberryPiにnewuserでログインして以下を打つ。

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

これで、勝手にauthorized_keysというファイルが作成されて、id_rsa.pubの中身がコピーされる。

パーミッション設定

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

これをしないと公開鍵認証が動かない。

newuserで公開鍵認証ログイン

一旦RaspberryPiからログアウトし、メインPCのコンソールから以下を打つ。

$ ssh newuser@(RaspberryPiのIP)

ログインコマンドとしては同じだが、パスワードは聞かれない。秘密鍵にパスフレーズを設定していたらそっちを聞かれる。

piユーザーの削除

$ sudo userdel -r pi

確認コマンドは以下。

$ id -a pi
id: ‘pi’: no such user 

SSHの設定(rootログイン禁止、ポート変更、パスワード認証禁止等)

基本的には/etc/ssh/sshd_configというファイルを編集することになる。このファイルを開くコマンドは以下。

$ sudo nano /etc/ssh/sshd_config

これ以降は、上記のファイルを編集するということを前提にして説明していく。ちなみに行頭に#が付いてる行で、#の直後がスペースじゃないものはデフォルト値。

rootログイン禁止

#PermitRootLogin prohibit-password
↓
PermitRootLogin no

公開鍵を設定していないrootで、パスワードログインを禁止していたらそりゃできないでしょってことなんだけど、一応noとして完全禁止にする。

ポート変更

#Port 22
↓
Port (任意の数字)

任意と言っても、いろいろ予約されているポート番号があるので、49152 ~ 65535の間から選ぶようにする。

22番ポートというのはSSH用のポートとしてあまりにも有名だからハッキングを受けやすく、ほとんどの場合は変更するということになっている。でも結局自宅で運用するならルーターの設定をしっかりしておけばいいんだけど、まあ一応。

パスワードログインの無効化

#PasswordAuthentication yes
↓
PasswordAuthentication no

パスワードログインを有効にしているとでたらめにパスワードを入れられてひょっとしたら破られるかもしれないから。これは公開鍵でログインできることを確認してからでないとログインできなくなる。(その場合はモニターをつないで直接ログインするようにすれば何とかなるかも)

その他の設定

せっかくなので他の項目も知りたいという人は「sshd_config 解説」とかでググってください。最初は必要そうな項目について書こうかと思ったけど、結局初期値のままで良かったり、ユーザーが自分しかいないのであれば必要ない設定項目ばっかりだった。

SSHの再起動

$ sudo /etc/init.d/ssh restart

一旦ログアウトがてらにRaspberryPi自体を再起動して、再度ログイン。メインPCから

$ ssh newuser@(RaspberryPiのIP) -p (ポート番号)

とすればログインできるはず。

終了

お疲れさまでした。ちなみにルーターの設定(ポートフォワーディング)をしていない限りは外部からは入ってこれないはずなので、ここまで設定しなくてもいいんだけどね。

参考

初心者向!Raspberry Pi 最低限のセキュリティ設定【所要時間 30分】 – Qiita
ラズパイ入手したらまずやること、デフォルトユーザーとSSHログイン認証を変更する (1/3) – MONOist(モノイスト)
ラズパイでやらなければいけない4つのセキュリティ対策! – Qiita
Raspberry Pi Webサーバー セキュリティ設定 | アラコキからの Raspberry Pi 電子工作
ラズパイ4でpiユーザのIDを変更する方法 | rs-techdev
[Raspberry Pi] ラズパイ & Remmina on LinuxでRDP接続してリモートデスクトップさせてみる方法
Raspberry Pi3のLAN外からのSSH接続設定方法 – Qiita
Raspberry Piに外部ネットワークからアクセスできる様にして携帯でペットを遠隔監視する方法 – Qiita
セキュアなSSHサーバの設定 – Qiita
RaspberryPi 3 デフォルトユーザpiの変更 | そう備忘録
Raspberry PiのCLI/GUIログインの切り替え – ysdyt.net for tech memo

TCPフォワーディングについて
sshポートフォワーディングの使い方 – Qiita
SSHポートフォワーディング(トンネリング)とは: 小粋空間
【改訂版】SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】 | ITログ
sshポートフォワーディングで詰まったら確認すること – Qiita
いますぐ実践! Linuxシステム管理 / Vol.102

Agentフォワーディングについて
ssh agent forwardingを行うサーバー側の要点の備忘録 – Qiita
ssh-agentを利用して、安全にSSH認証を行う – Qiita
ssh agent forwarding · JoeMPhilips

ゲートウェイポートについて
異なるprivateネットワーク内の端末をsshで繋ぐ – Qiita

【ラズパイ】Raspberry PiとAndroidをつなぐ

スマホのテザリング機能を使ってRaspberryPiをスマホにつなげて、SSH接続とリモートデスクトップ接続を目指す。

前提としてすでに家のWifiなどに繋がっていて、今回新たにAndroidとの接続設定をする状況を想定する。

概要

テザリングでスマホとRaspberryPiがつながれば同じLANネットワークに繋がっているようなものなので、IP特定して、固定化して、後はPCと同じようにして繋げばいいだけ。SSH、RDP、VNC等のAndroid用アプリもそろっているのでそれを使えばPCと同じことができるよって話。

iPhoneは持っていないので知りません。大体同じ?

スマホのテザリングをONにし、RaspberryPiをつなぐ

スマホのテザリングON。やり方はスマホによって違うのでおググりください。

RaspberryPiの設定もデスクトップのタスクバーからWifi設定をONにしてスマホのテザリングに繋ぎに行くだけ。ヘッドレス(モニター無し)の場合はこの作業は不要(というかできない)。

Wifiの優先度設定

家のWifiとスマホのテザリングといったように複数のWifiに接続すると、何を優先するのかが不明になったりするので、ちゃんとコントロールできるようにする。スマホのテザリングに接続後、RaspberryPiのターミナルから

$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

と打ち、以下のようにpriorityを追加し保存する。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

(家のwifi)
network={
        ssid="XXXXXXXX"
        psk="xxxxxxx"
        key_mgmt=WPA-PSK
        priority=0
}

(スマホのテザリング)
network={
        ssid="YYYYYYYY"
        psk="yyyyyyyy"
        key_mgmt=WPA-PSK
        priority=1
}

ヘッドレスでやっている場合は「スマホのテザリング」が丸々抜けているはずなので、抜けている部分を全部手動で入力する。

ssidはその通りSSID、pskはパスワードになっている。priorityの項目を自分で追記。数字が大きい方が優先されるので、スマホのSSIDを優先度高にしておけば、普段は家のWifiにつなぐけど、スマホのテザリングをONにしているときはスマホに繋ぎに行く、というような挙動になる。

RaspberryPiのIP固定化

次に、スマホにつないだ時もIPを固定されるようにする。

テザリングで繋がっている今はスマホがルーター代わりになっており、スマホ自身のIPを確認する必要がある。GoogleストアからTermux(ターミナルエミュレーター)をインストールして

$ ifconfig wlan0

と打てば、どこかにinet 192.168.43.xxxと表示されていると思う。これがスマホの(無線LANデバイスが持つ)IPアドレス。43は別の数字になっているかもしれない。

次に、RaspberryPiのターミナルから

$ sudo nano /etc/dhcpcd.conf

と打ち、以下を追記する。ssid XXXXXXXXはPCのSSIDを想定していて、すでに記述されているものとする。

interface wlan0
ssid XXXXXXXX
static ip_address=192.168.1.xxx/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

(以下を追記)
ssid YYYYYYYY
static ip_address=192.168.43.yyy/24
static routers=192.168.43.xxx
static domain_name_servers=192.168.43.xxx

yyyは自分で決める。AndoroidテザリングのDHCPサーバー機能(簡単に言えば、IPの自動割り振り機能)のアドレス範囲は設定変更不可らしい。何か別の機器とIPが衝突したときは南無ということで。

dhcpcd.confが更新されたら自動的にネットワーク接続も更新するみたい。確認のためにRaspberryPiのターミナル上でifconfig wlan0と打って設定した通りの表示になったらOK。

SSH接続

AndroidのSSHクライアントをインストールして、PCの時と同じようにログインすればよい。自分はこれを使っている。

リモートデスクトップ:RDPで接続

前回の記事からの流れで、RaspberryPiにxrdpを入れている人は、スマホにRDPクライアントを入れるだけでOK。新しい接続先の設定時に「固定したRaspberryPiのIP」「ユーザー名(初期設定のままならpiユーザー)」「ログインパスワード」を入れればよい。Googleストアで「rdp」と検索すればRDPクライアントソフトが色々出てくるけど、ダウンロード数の多さと評価の高さでMicrosoftのやつでいいんじゃないですか?

リモートデスクトップ:RaspberryPiのVNC有効化して、VNC Viewerで接続

xrdpを入れればいいだけなんだけど、一応別の方法として紹介。

RaspberryPiの設定からVNCをEnableにしておく。SSHの有効/無効のすぐ下にある。

後はこれをインストールして、接続先を追加する。設定項目としては「固定したRaspberryPiのIP」「接続先を識別するための名前(ユーザー名とは別)」「ユーザー名(初期設定のままならpiユーザー)」「ログインパスワード」を然るべき場所に入れる。

接続

お疲れ様でした。

追記:wpa_supplicant.confに記述するパスワードの暗号化

記事中に示した書き方だと、パスワードが平文のままなので、暗号化しておく。

$ wpa_passphrase "XXXXXXXX"

XXXXXXXXはSSID名。ダブルクォーテーション必要。上のコマンドを打つと

# reading passphrase from stdin

と表示されるので、そのままWifiに接続するためのパスワードを打つ。stdinは標準入力のことで、ここではコンソール画面のことを指す。

パスワードを打つと

network={
        ssid="XXXXXXXX"
        #psk="xxxxxxxx"
        psk=(いかにも暗号化されたような文字列)
}

と表示されるが、これは表示されるだけで設定まではしてくれないので、psk=(いかにも暗号化されたような文字列)の部分を手動でwpa_supplicant.confにコピペする。

>>の意味が分かる人は、rootユーザーに昇格してから

# wpa_passphrase "testing" >> /etc/wpa_supplicant/wpa_supplicant.conf

と打てば、パスワードを入力したときに自動でwpa_supplicant.confに追記してくれるので、後は適当にwpa_supplicant.confを開いて中身を整形する。

【ゼロから始める】Raspberry Piの立ち上げ~遠隔操作まで

立ち上げ方は2通りある。

  • モニターやマウス・キーボードをつないでセットアップし、遠隔操作までできるようになってからモニター等を外す。(簡単)
  • 最初からモニター・マウス・キーボード無しで男らしくセットアップしてしまう。(中級)

どちらもSDカードにOSを書き込むまでは同じ。前者はその後画面の指示に従いセットアップ。後者は「SSH許可、Wifi設定書き込み」「メインPCからネットワーク上のRaspberryPiを探す」「SSH接続」という段取りを踏む。リモートデスクトップ接続までいけばメインPC上でRaspberryPiのデスクトップ画面を開くことができ、モニターがあっても無くてもどっちでもよくなる。

購入

Raspberry Pi本体は、CPUとかメモリが取り付け済みのちっちゃいマザーボードと言った感じで、それだけだと「まじかよ」とつぶやきたくなるぐらいむき出し。以下の付属品が付いたスターターキットとか売ってるけど、恩恵があるのはぶっちゃけ電源のみ。

  • 電源(必要。5V3Aのコンセント直取り。まあ探せば買える。スマホ充電ケーブルだとアンペア数が足りないかも)
  • ケース(数あるケースの中から自分で選んで個性を出すべき。というかどうせ後から買い替えたくなる)
  • microSDカード(大容量のものがゴミみたいな値段で売られてる。OSがプリインストール済みとか無駄に高いから自分でやるべき。OSアップデートが一時的に容量食うので、余裕をもった容量を選ぶ)
  • HDMIケーブル(家に1本ぐらいあるでしょ)

そのほか、モニター・マウス・キーボードが「必要だったら」揃える。

microSDにOS書き込み

メインPC上でMicroUSBにOS(Raspbian)を書き込んでおく。モニター有りか無しかで書き込み方法が変わる。どちらもRaspberry Pi Downloads – Software for the Raspberry PiからDLできる。

(モニター有り・簡単・標準)上記リンクから「Raspberry Pi Imager for ****」というリンクを辿れば、SDカードのフォーマットとOSの書き込みを同時にやってくれるソフトが手に入る。楽ちん。

(モニター無し)上記リンクから「Raspberry Pi OS (previously called Raspbian)」というリンクを辿り、「Raspberry Pi OS (32-bit) with desktop and recommended software」または「同おすすめソフト無し版」のどちらかのzipファイルをダウンロードする。中からイメージファイルが出てくるので、イメージ書き込みソフト(balenaEtcher、Win32DiskImager、Upswift imgFlasherのどれか)を使ってSDカードに書き込む。
イメージ書き込み後、microSDのトップに「ssh(拡張子無し)」という名前の中身のないファイルを作成し、「wpa_supplicant.conf」という名前のファイルを、以下の中身で作成しておく。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID名"
    psk="暗号化キー"
}

これでRaspberryPiが勝手にWifiに繋ぎにいってくれる。SSHも許可しているので、メインPCからリモートでログインして残りの各種設定をする。

電源供給

モニター有りの場合は電源供給前にHDMIケーブルでモニターをつないでおくこと。モニター無しの場合SDカードアクセスランプが落ち着いたらOSが読み込まれたことになるので、その後で接続を試みるようにする。

設定

(モニター有り)パスワード決めろとか、言語とかタイムゾーンは何だとか、簡単なことを聞かれるので適当に設定。決めたパスワードはPiというユーザーのもの。Linuxサーバー的な話をするとrootユーザー以外にはPiというユーザーしか存在しない。

(モニター無し)まずRaspberryPiにどのIPが振られたのかを確認しないといけない。これはメインPCから総当たりでIPを探す方法と、ルーターの中を覗いてRaspberryPiに振られているIPを見つける方法がある。これはRaspberryPiが繋がっているWifiによる。ルーターが覗けるならそっちの方が早い。ホスト名が表示されるなら見つけるのは簡単だけど、もし表示されなくてもRaspberryPiのMacアドレスは「B8-27-EB-xx-xx-xx」か「DC-A6-32-xx-xx-xx」なので、それを手掛かりに特定する。もしルーターを覗くことが無理なら総当たりで探していくしかない。と言ってもそんな大変なものではなく、nmapというツールを使えば自動で総当たりpingを飛ばしてくれる。ダウンロード・使い方はここの「nmap command」を読めば分かる。
IPが分かったら、メインPCからコンソールを立ち上げ「ssh pi@(見つけたIP)」などと打ちSSH接続を行う。初期パスワードは「raspberry」。ログインできたら

$ sudo raspi-config

と打ち、設定画面を立ち上げる。各種設定はここが参考になる。パスワードは絶対に変えておく。

IP固定化

モニター有りの場合も、ここからはターミナルを立ち上げてコマンドラインで操作していくことになる。

DHCPサーバーのアドレス範囲

通常、Wifiに繋ぎにいったらルーターが勝手にLAN内IPを振ってくれる(DHCPサーバー機能)けど、その割り振り用IPには範囲が必ず設定されている。その範囲外で固定すれば他の機器が邪魔することはないってこと。結局ここでルーターを覗くことになるけど、覗けない環境の場合でも自動割り振りの範囲を無視してIPを固定化することはできる。ただIPが他の機器とぶつかっても知らんけどね。
ルーターを覗けばどこかにIPアドレスプールとかDHCPプールとかいう設定があるはず。それを確認する。もし変更できる権限があるのであれば、プール範囲を狭めてRaspberryPi用にIPを確保してもいいかもしれない。

IP固定化作業(RaspberryPi内)

モニター有りの場合はターミナルを立ち上げ、モニター無しの人はそのままSSH接続で、以下のコマンドを打つ。

$ sudo nano /etc/dhcpcd.conf

「nano」というRaspberryPi付属のテキストエディタが立ち上がるので、以下の内容を最後に追加してCtrl + Sでセーブ、Ctrl + Xでnanoを終了する。

interface wlan0
static ip_address=192.168.aaa.aaa/24
static routers=192.168.bbb.bbb
static domain_name_servers=192.168.bbb.bbb

192.168.aaa.aaaはRaspberryPiに割り当てたいIP、192.168.bbb.bbbはルーターのIP。

OSアップデート

以下のコマンドを打つ。モニターがある場合は「RaspberryPiの設定」からアップデートしても同じ。結構な時間がかかる。終わったら一応再起動。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

メインPCからリモートデスクトップを試みる

RaspberryPiにrdpを入れる

RDP(Remote Desktop Protocol)を入れるためにxrdpというソフトをインストールする。昔はVNCが必要だったけど今は要らないらしい。そこまで詳しくないのでよく分からない。

$ sudo apt-get -y install xrdp

Windows標準のリモートデスクトップからアクセスを試みる

自分はWindowsしか知らないのと、Windows環境しかないので、Macの場合はまた今度。「リモートデスクトップ接続」というものを立ち上げ、オプションを表示。

コンピューターにさっき決めたIP、ユーザー名はpi。

画面タブでちょうどいいサイズを選んでおけば勝手にデスクトップサイズを合わせてくれる。

接続!

キター!

今後同じようにメインPCからリモートデスクトップ接続、またはSSH接続をすればモニター・キーボード・マウス無しでRaspberryPiを操作できる。

ちなみにリモートデスクトップからはシャットダウンボタンを押してもシャットダウンしないので、ターミナルを立ち上げて以下のコマンドを打つ。

$ sudo shutdown -h now

するとシャットダウンが始まり、リモートデスクトップの接続が切れるので、ランプが落ち着いてから電源を抜く。

セキュリティについて

セキュリティは別記事にまとめるとして、それまでは基本的にはRaspberryPiの電源を切るようにしておくこと。動かなければ乗っ取りもクソもない。

参考

RaspberryPi Raspbian ヘッドレスインストール(Buster編) – Qiita
Installing operating system images – Raspberry Pi Documentation
Setting up a Raspberry Pi headless – Raspberry Pi Documentation
IP Address – Raspberry Pi Documentation
Raspberry Pi 4 のMACアドレスの範囲が変わったぞ – Qiita

【Java】調べて得た雑な知見

調べる前「え、Java?プログラミング言語の一種でしょ?JRE?JDK?SE?なにそれ?」

今「EEのJDK > SEのJDK > JRE」「個人開発者がJDKと言えばSEのJDK」「JDKをインストールすればJavaの開発ができる」「Javaで書かれたプログラムを動かすためだけならJREを入れればよい」「タダじゃないらしい」←どういうこと!?

Java

プログラミング言語の一種。Java語。

「どんなマシンでも動く!」で有名。実際はOSごとに仮想マシン(virtual machine、VM)が作られて、Javaのプログラムはその仮想マシン上で動く。JavaのVMなのでJVM。

JRE

Javaの実行環境。

OSは仮想マシンを作らないといけないが、どうやって?→JREをインストールすれば作れる(OSが勝手に作ってくれる)!

でも実行環境(誰かが作ったアプリをダウンロード等して自分のPCで実行する)を提供するだけで、開発(自分でコードを書き、コンパイルしてアプリを作る)ことはできない。

Javaバージョン9以降、JREのみの配布はされていない。数年前に「MinecraftのためにJRE入れたことあるよ」みたいな人はおそらくJavaバージョン8のJREの可能性あり。

JDK(SE)

Javaの開発環境。

開発するけどテストできない、なんてことはあり得ないので、JDKをインストールしたらJREも付いてくる。

SEは「Standard Edition」の略。普通の開発用のAPIが提供される。

JDK(EE)

Javaの開発環境。SEの上位版。

サーバー向けの機能を付けた拡張版。SEを拡張しているので、SEでできることはEEでもできる。

JREのEE版とかSE版とかあるのかないのかは気になるけど、もし仮にJREだけでは配布されないということなら、JDK(SE)をインストールしたらSE版のJREが、JDK(EE)をインストールしたらEE版のJREがインストールされる、ということなのかな?よく分からん。

8とか11とかのバージョン

Java SE – Downloadsによると2020年5月現在のSEの最新バージョンは14。

基本的に半年に一回メジャーバージョンアップをするらしく、半年ごとにバージョンが1つずつ上がっていく。

でも半年ごとにバージョンアップしてたら整合性チェックとか大変だから長期保証バージョンもある。それが8と11。

でもタダじゃない。

どういうこと?Javaって有償なの?

ここから少し話が深くなる。

Javaはサン・マイクロシステムズという会社によって開発されたんだけど、サン社はOracleという会社に買収されて、今ではOracleがJDKを提供している。

そのOracleが提供するJDKには2種類あって、OracleJDKと(Oracle)OpenJDKがある。

OracleJDKは商用で使わなければ無償、商用で使うならライセンス契約が必要とのこと。半年ごとのバージョンアップがあって今はバージョン14(サポートは半年で終了)だけど、バージョン11は8年のサポート付き。問い合わせると返事が返ってくるし、セキュリティアップデートもある。
ちなみにバージョン7やバージョン8も有償提供してきた分に関しては今もサポートがある。7は22年7月まで、8は25年3月まで。

OpenJDKは無償だけど、半年でアップデート。同じ会社が提供しているから、バージョンもOracleJDKと同じ14。でもこっちは11は長期サポート無し。セキュリティアップデートも無し。

以下の図が分かりやすい。

出典:JDKの新しいリリース・モデル、および提供ライセンスについて

白いところは今まで無償で提供していた部分、青いところはこれから無償で提供していく部分、赤いところは有償サポートで提供する部分。

  • 青 ・・・ OpenJDK
  • 赤 ・・・ OracleJDK

とみれば分かりやすいかな?

Oracleにしてみれば「半年でメジャーアップデートすることにしたよ。これまで通り無償だよ。だからこれからはみんなも半年ごとにJavaをアップデートしてね。最新バージョンしかセキュリティアップデートしないよ。でも有償のサポートを受けながら使っていきたい人やバージョンを変えたくない人がいることも知ってる。だからバージョン11の長期有償サポート制度、作っといたよ。最新バージョンでも有償サポート登録してくれた人はちゃんとサポートするよ。また今までの7とか8の有償サポート受けてた人もしばらくはサポート打ち切らないよ。」ってこと。

結局、ちょっと勉強したいという程度ならOpenJDK、商用には使いませんというのであればOracleJDKでも可?なのかな?

ちなみにJDKは他の会社が出しているものもあるけど、もうこれ以上は触れない。気になる人は自分で探して。

まとめ

「EEのJDK > SEのJDK > JRE」
「個人開発者がJDKと言えばSEのJDK」
「JDKをインストールすればJavaの開発ができる」
「Javaで書かれたプログラムを動かすためだけならJREを入れればよい」
「半年に一回アップデートせよ」

ちなみにこの記事書いた後にちょっと使う用事があったので、OracleJDK14入れました。特にややこしいことは言ってこず、普通にインストールできたので、ちゃんと気を付けておかないと本番で使ったら大変なことになりそう・・・

参考

Java JREとJDKの違いと関係性は!?環境変数設定と確認までの手順解説!!Javaマスターへの道 | Javaマスターへの道
Java SEとJDK、JRE、JVMの違いに関する解説 | Java入門
Java – Wikipedia
JDKの新しいリリース・モデル、および提供ライセンスについて
Java有償化とは?無償で利用できない?いや、できます。 | 30代後半、未経験からwebプログラマーに転職(実体験)
第1回:「Java」は昔も今もオープンです – 株式会社システムエグゼ
個人開発ユーザーのJAVA有償化への対応方法をまとめてみる – ジャズとエンジニア

【Git】GitHubから既存プロジェクトをダウンロード

毎回忘れるからメモ。

概要

  • コマンドプロンプト等を立ち上げ、適当なフォルダ(D:\work等)に移動。
  • git clone (ダウンロード用URLを貼り付け)でそのフォルダの配下に新フォルダを作成しその中にダウンロードする。

ダウンロード用URLの場所

ここ。

補足

git cloneで引っ張ってくると、そのプロジェクトの全ての履歴もコピーしてくる。

参考

Git – Git リポジトリの取得

【Boxstertar】GitHub Gistの使い方

Boxstarterとかあんまり関係ないけど、一応Boxstarterを使う時に使えると便利なので、そういう流れで書く。

アカウント作成

そんなに難しくないはず。自分はGitHubのアカウントがあったので、アクセスしたときにGitHubのアカウントでログインした。

やること

コードを書いて置いとく。非公開でもいいし、公開してもいい。

これがGist作成画面。「Gistを書く」的なリンクを探すとここに来るはず。もしくはこのリンクから飛ぶ。

  • Gist description… Gistの説明文。どういうコードなのかの説明を入れると良い。
  • Filename including extension… このコードを保存するときのファイル名。拡張子を付けて書く。
  • 書いたら「Create secret gist」または「Create public gist」をクリック。

はい完了。

作った後は

  • Editボタン 中身を編集できる。
  • Deleteボタン 作ったファイルを削除できる。
  • Rawボタン 生のtxtファイルを表示する(Boxstarterで使う)

こんな感じ。

「All Gists」をクリックすれば他の人が書いたコードが見える。Boxstarterに限らずありとあらゆるコードが公開されている。検索をかけて他の人のBoxstarterスクリプトを見ると色々発見がある。

「Boxstarter」で検索をするとよく分からないコードが出てくるので、「cinst」とか「Set-WindowsExplorerOptions」とかで検索すると、それが書かれているコード(=Boxstarter用である可能性が高い)がヒットする。

まとめ

パッとコードを書いてサッとシェアする。それがGitHub Gist。

【Boxstarter】スクリプトの育て方

WindowsのセットアップをBoxstarterで自動化した後、という前提での話。何それ?っていう人はこちら

Boxstarterのスクリプトの内容は大きく分けて「Windowsの設定」と「各ソフトのインストール」に分かれる。今回は「各ソフトのインストール」をどうやって増やしていくか、を見ていく。

そんなに難しくない。

概要

  • ここでインストールできるソフトを探す
  • PowerShellでcinstコマンドを使ってインストールしてみる
  • 良さそうだったらBoxstarterのスクリプトに追記

前回も書いたけど、BoxstarterはChocolateyというソフトを使ってインストールしている。だからChocolateyでインストールできるソフトを探せばよい、ということになる。

詳細

0 前提

Boxstarterを使った時点でChocolateyはインストールされているはず。確認の仕方は、PowerShellを立ち上げてchocoコマンドを打つと何か出てくる。

PS C:\WINDOWS\system32> choco
Chocolatey v0.10.15
Please run 'choco -?' or 'choco <command> -?' for help menu.

1 インストールできるソフトを探す

Chocolatey Software | Packagesで探す。試しに解凍ソフトの大御所「WinRAR」でも入れてみる。

検索ボックスにwinrarと入れてEnter。

コマンドをチェック

このコマンドからchoco install winrarというコマンドでインストールできるよ、ということが分かる。cinst winrarと打っても同じ。

参考
chocolatey 基本情報まとめ – Qiita

2 PowerShellで入れてみる

PowerShellを立ち上げてcinst winrarと打ってEnter。

PS C:\WINDOWS\system32> cinst winrar
Chocolatey v0.10.15
Installing the following packages:
winrar
By installing you accept licenses for the packages.
Progress: Downloading winrar 5.90.0.20200401... 100%

winrar v5.90.0.20200401 [Approved]
winrar package files install completed. Performing other installation steps.
The package winrar wants to run 'chocolateyInstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider:
choco feature enable -n allowGlobalConfirmation
Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint):

なんか色々出てくるけど、ただのインストール確認なのでyと打ちEnter。画面に[Approved]と出てれば尚良し。この手順を省略したければ、最初の段階でcinst winrar -yというオプションを付ければ省略できる。

画面を見てるとWinRARをダウンロードしてインストールしてるのが分かる。作業が終わるとちゃんとスタートメニューに追加されてるし、Windowsの設定画面からアンインストールもできるようになってる。

ちなみにPowerShell上からWinRARをアンインストールしようと思ったらcuninst winrarでできる。

3 良さそうだったらBoxstarterのスクリプトに追記する

ちゃんと目的のソフトだったりバージョンだったりしたら問題ないということなので、Boxstarterのスクリプトに追記しておく。

まとめ

こういう風にちょっとずつ、自分の必要に応じて必要なソフトをcinstコマンドでインストールして、大丈夫そうならBoxstarterのスクリプトに追記すると、自分用の自動セットアップが組めるという訳。ほとんどはただインストールするだけだけど。

これらの流れはほとんどChocolateyの使い方なので、そっち方面で調べていくと色々分かっていくかも。

【ゼロから始める】Windowsのセットアップ自動化 with Boxstarter

先日surface Pro 4を修理に出して、完全に交換されて戻ってきたのでまっさらな状態。

で、これを機に以前から知っていた「Boxstarterで初期セットアップの自動化」というのにチャレンジしてみた。

結論から言うと、「専門的な知識無しで導入可。自動でやってくれる部分は多いが、自分のやってほしいことを全部やってくれるわけじゃない。でもやっておけばめっちゃ楽。」という感じ。やればハマる。

概要

Boxstarterがほとんどやってくれる。おおまかな手順としては

  • インストールしてもらうソフト、設定してもらうWindowsの設定を書いたスクリプトを準備(1度作れば後は追記のみ)
  • PowerShellかコマンドスクリプトを立ち上げて、Boxstarterをインストール(どうも公式からzipファイルを落としても、インストーラーが入っているわけでもなく、batファイルを実行せよってだけだから、結局は自分でコマンド打つ方が早い(後述))
  • 作っておいたスクリプトを読み込ませる

以上。あとは自動でやりきれなかった部分を手動でやるだけ。Officeの有効化とか。

詳細

1 スクリプトの準備

まずはスクリプトの準備。普通のテキストファイルでOK。自分はネット上で保存している(後述)。

以下は自分の非常にシンプルなスクリプト。

Set-WindowsExplorerOptions -EnableShowHiddenFilesFoldersDrives -EnableShowProtectedOSFiles -EnableShowFileExtensions
Enable-RemoteDesktop
Disable-GameBarTips

cinst GoogleChrome
cinst sublimetext3
cinst androidstudio
cinst avastfreeantivirus
  • 1行目 「隠しファイル・フォルダを表示する」+「OSのシステムファイルを表示する」+「拡張子を表示する」を同時に設定
  • 2行目 リモートデスクトップを有効にする
  • 3行目 ゲームに関するヒントを無効にする(Windows10が「これはゲームか」と思ったソフトを立ち上げると「録画できますよ」とか言ってくるやつ)
  • 4行目以降 各ソフトのインストール

どんなソフトがどんなコマンドでインストールできるのかはChocolatey Software | Packagesで探す。

>choco install ソフト名という部分が有効なコマンド。choco installcinstは同じ意味なので、このサイトで見つかればそのソフトはスクリプトに追記できるということ。逆に見つからなければ手動で入れないといけない。

  • どんなソフトがインストールできるのか探してみれば分かるかもしれないけど、ほとんどはプログラマーとかエンジニアが喜びそうなものばかり。
  • 最初はあれこれ欲張らず、ブラウザとアンチウィルスソフトぐらいでいいと思う。後から「cinstコマンドでインストールできるかどうか自分でやってみて確認→できたらスクリプトに追記」とすればよい。これを「スクリプトを育てる」と言う(今決めた)。スクリプトの育て方は別記事にまとめているのでそちらを参照。
  • スクリプトをネット上に保存する手段としてBoxstarter公式でも紹介されているのが、GitHub Gist。コードを書いて保存する、ただそれだけのサイト。ここから他の人が書いたコードが探せる。このサイトの使い方は別記事にまとめているのでそちらを参照。

2 Boxstarterインストール

管理者としてPowerShellを立ち上げる。方法は調べたら出てくるはず。簡単に言うと「Windowsのスタートボタンを右クリックすると出てくるメニューの中にある」。

立ち上げたら以下のコマンドをコピペしてEnter。

Set-ExecutionPolicy RemoteSigned

然る後に、以下のコマンドをコピペしてEnter。

. { iwr -useb https://boxstarter.org/bootstrapper.ps1 } | iex; Get-Boxstarter -Force
  • 1つ目のコマンドは「ローカルに保存された.ps1ファイル全ておよび外部から取得した署名付き.ps1ファイルの実行を許可する」という設定。デフォルトではRestrictedに設定されていて、このままでは外部はおろかローカルに保存されたps1ファイルすら実行できない。Unrestrictedに設定してもいいかもしれない(Unrestrictedはすべての.ps1ファイルを実行するけど、外部から取得したものについては一応実行してよいかどうかの確認がある)。-Scope Processというオプションを付けると、今実行しているPowerShellのウィンドウのみの適用となって、ウィンドウを閉じるとExecutionPolicyの設定は元に戻る。
  • 2つ目のコマンドはBoxstarterのインストールコマンド。おそらくネットから.ps1ファイルを取得してそのままよしなに実行せよ、ということ。詳しいことは不明。

3 作っておいたスクリプトを実行

Boxstarterのインストールが終わったら、以下のコマンドを実行。

Install-BoxstarterPackage -PackageName (スクリプトのパス、またはGistに保存したスクリプトのRawファイルのURLを貼り付け) -DisableReboots

スクリプトはローカル保存のやつでもいいけど、新品のPCにファイルを移すって意外と面倒なのでネットから取ってくるようにしている訳で、取ってくるファイルは生のtxtファイルが良い。これが簡単にできるのがGitHub Gist。そういうこと。

Gistに保存したスクリプトのRawファイルというのは、

ここをクリックすると出る。そのURLをコピペ。

まとめ

一度スクリプトを作っておけば、新PC上でやることはPowerShellで3つのコマンドを打つだけ。簡単すぎる。

ちなみにこの後手動でやった設定はこちら。

  • 自宅PCとの共有設定
  • PC起動時に立ち上がるソフトの確認
  • Officeのインストール&ライセンス認証

これを自動化しようと思うと手間がかかりそうだから、別に手動でいい。

参考

自動化を愛するWindows使いへ Boxstarterのすすめ | re-imagine
https://torumakabe.github.io/post/intro_boxstarter/
Boxstarter で快適なセットアップを – Qiita
https://qiita.com/mihochannel/items/b7d2bfd8ecc5abaf84a5
Boxstarter · GitHub
https://gist.github.com/ikkou/11243137
PCセットアップを自動化しよう!Boxstarter | cloud.config Tech Blog
https://tech-blog.cloud-config.jp/2019-12-20-pcsetup-automation-boxstarter/
Boxstarter
https://boxstarter.org/Learn/WebLauncher
Boxstarter Windowsの設定に関するコマンド
https://boxstarter.org/WinConfig
Boxstarter で快適なセットアップを – Qiita
https://qiita.com/mihochannel/items/b7d2bfd8ecc5abaf84a5

【AndroidApp】アプリタイトルの文字色の変更について

こいつの文字色の変更の仕方を調べてたんだけど、どうも出てくるのはややこしいのばかり。

でもスーパー簡単な方法を発見した。

以下res/values/styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- タイトル文字列の色 -->
        <item name="titleTextColor">#000000</item>
    </style>

</resources>

以上。