koh’s blog

Sys Admin who loves automation

zsh(bash)からxonshに乗り換えたい

ここ数年は手元の端末ではzshを使用していたが、最近xonshを試しています。

基本的な情報は下記。ざっくり言うとpython製のシェルです。

xon.sh

現状はxonshrcを育てたりしている最中なのですが、これまでzsh(bash)でできていたことをxonshでやろうとした際の設定をいくつかメモしておきます。

*動作環境

koh@Kohs-MacBook-Pro-M1 ~ $ sw_vers
ProductName:    macOS
ProductVersion: 11.2.1
BuildVersion:   20D74
koh@Kohs-MacBook-Pro-M1 ~ $ xonsh --version
xonsh/0.9.26
koh@Kohs-MacBook-Pro-M1 ~ $ python --version
Python 3.9.1
koh@Kohs-MacBook-Pro-M1 ~ $

直前のコマンドの戻り値 $?

$?の代わりに_.rtnでとれます。

koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ $ echo $?
$?
koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ $ print(_.rtn)
1
koh@Kohs-MacBook-Pro-M1 ~ $

ちなみにzshだと setopt print_exit_valueを設定すると戻り値が0以外の時に表示してくれますが、xonshだと xontrib load prompt_ret_codeするとプロンプトに表示してくれます。こちらの方が見やすい

koh@Kohs-MacBook-Pro-M1 ~ $ xontrib load prompt_ret_code
koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ [1]$ true
koh@Kohs-MacBook-Pro-M1 ~ $

直前のコマンドの最後の引数 $_

zsh(bash)だと $_でとれたんですがxonshだととれないようです。

koh@Kohs-MacBook-Pro-M1 ~ $ echo aa bb
aa bb
koh@Kohs-MacBook-Pro-M1 ~ $ echo $_
$_
koh@Kohs-MacBook-Pro-M1 ~ $

!$は使えるようなのでこちらで代用します。
bashismというxontribが必要です。

koh@Kohs-MacBook-Pro-M1 ~ $ xontrib load bashisms
koh@Kohs-MacBook-Pro-M1 ~ $ echo aa bb
aa bb
koh@Kohs-MacBook-Pro-M1 ~ $ echo !$
bb
koh@Kohs-MacBook-Pro-M1 ~ $

sshのホスト名補完

xonshはデフォルトだと補完してくれないのでbash-completionを使用します。
bash-completionをインストールして$BASH_COMPLETIONSを適宜修正します。

brew install bash-completion2 #macの場合
$BASH_COMPLETIONS=('/opt/homebrew/share/bash-completion/bash_completion')

f:id:koh-sh:20210221231154p:plain

まとめ

bashからの乗り換え用の情報は公式がまとめていました。

xon.sh

あとはzshselect-word-styleに相当する設定を探してるのですが今のところ見つからない。
("/"などを区切り文字として認識してくれるやつ)

使っていくうちにまた何か見つけたら追記する予定。

2020年を雑に振り返る

2020年をざっくり振り返っていく。
去年のはこちら.

koh-sh.hatenablog.com

エンジニア関連

プログラミング

今年の最初は結構AtCoderを真面目にやっていたが5月くらいからあまりやらなくなってしまった。
プログラミング自体は楽しいけれどコンテストで毎回問題を解ききれず、もやっとした状態で週末を終えてしまうのであまりやらなくなってしまった。(単に自分の実力不足)
コンテストは参加しなくなったけど代わりにLeetCode learnを無料枠の範囲で取り組んだり、下記の書籍や動画等でアルゴリズム/データ構造などCSの基礎的な部分を改めて勉強できた気がする。

leetcode.com

読んだ本

github.com

今年買った本は16冊。
特に今年の前半くらいまでは競プロに取り組んでたので数学周りやアルゴリズム等の本が多かった。

  • 数学ガールの秘密ノートシリーズ
  • CircleCI実践入門──CI/CDがもたらす開発速度と品質の両立
  • SOFT SKILLS ソフトウェア開発者の人生マニュアル

あたりが特に面白かった。

動画

koh-sh.hatenablog.com

オンラインでハーバード大学のCSの授業が公開されていたので受講した。
プラスしてpythonJavaScriptのコースも見た。

online-learning.harvard.edu

生活

とりあえずリモートワークって感じでした。2月末くらいからほぼ一年間。
基本的にはひたすら自宅に引きこもり、仕事かゲームって感じの一年だった。
運動不足対策はリングフィットと12月からはFit Boxing 2を交互にやっている。
禁煙も去年から続いてるので自分偉い。(678日経過)

主な買ったもの

Macbook Pro M1

年末に新しいMacbookを購入。新OS(Big Sur)も相まって色々と動かないものもあるが概ね調子がいい。

Raspberry Pi 4

去年に続きラズパイを増設したついでにSSDも追加してそれなりに上等なおもちゃになった気がする。
4 core, 8 GB mem, 256GB SSDが15000円もかからないのはだいぶ嬉しい。

koh-sh.hatenablog.com

koh-sh.hatenablog.com

ゲーム

おうち時間なのでゲームも結構買った。
今年購入したソフトは9本。一ヶ月半に1本ペース。多い。

あたりが面白かったかなと。
特にOCTOPATH TRAVELERは現在進行形で冬休みを溶かしている。

まとめ

基本的にはコロナの影響もあり引きこもって勉強するかゲームするかな一年だった。
ただインプットが増えた分アウトプットが減ったのでせめて月一くらいでブログ書くようにしたい。
来年はどうなるかまだわからないけど、この状態が続くようであればもう少し自宅の作業環境を整えたいなと思う。

ラズパイにUSBメモリ型SSDを生やす

最近USBメモリ型のSSDが発売されたらしいのでそれを使ってラズパイを起動してみました。

pc.watch.impress.co.jp

使用したSSDはこちら。

www.amazon.co.jp

やってる事自体は何番煎じだって感じですが自身の備忘として。

やること

現在SDカードで動いているRaspberry Pi 4 Model B (8GB)を使用して、SSDにOSインストールしてUSBブートする。(クリーンインストール)

bootloaderのアップデート

2020-08-10バージョンからUSBブートがStableになっているのでbootloaderのバージョンをあげます。

github.com

手順は下記の記事を参考にさせていただきました。

dpcblog.hatenablog.com

作業前のOSの状態です。

[pi@raspi4b01] ~
% uname -a                                                                       2020-12-05 14:52:56
Linux raspi4b01 5.4.51-v7l+ #1327 SMP Thu Jul 23 11:04:39 BST 2020 armv7l GNU/Linux
[pi@raspi4b01] ~
[pi@raspi4b01] ~
% vcgencmd bootloader_version                                                    2020-12-05 14:59:57
Apr 16 2020 18:11:26
version a5e1b95f320810c69441557c5f5f0a7f2460dfb8 (release)
timestamp 1587057086
[pi@raspi4b01] ~
%

apt full-upgrade

sudo apt update
sudo apt full-upgrade

critical -> stableに書き換え

[pi@raspi4b01] ~
% cat /etc/default/rpi-eeprom-update                                             2020-12-05 14:59:13
FIRMWARE_RELEASE_STATUS="critical"
[pi@raspi4b01] ~
% sudo vi $_                                                                     2020-12-05 14:59:37
[pi@raspi4b01] ~
% cat $_                                                                         2020-12-05 14:59:54
FIRMWARE_RELEASE_STATUS="stable"
[pi@raspi4b01] ~
%

アップデート

[pi@raspi4b01] ~
% sudo rpi-eeprom-update -d -a                                                   2020-12-05 15:00:23
BCM2711 detected
VL805 firmware in bootloader EEPROM
*** INSTALLING EEPROM UPDATES ***
BOOTLOADER: update available
CURRENT: Thu 16 Apr 2020 05:11:26 PM UTC (1587057086)
 LATEST: Thu 03 Sep 2020 12:11:43 PM UTC (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/stable
VL805: up-to-date
CURRENT: 000137ad
 LATEST: 000137ad
BOOTFS /boot
EEPROM updates pending. Please reboot to apply the update.
[pi@raspi4b01] ~
%

再起動して確認(2020-09-03バージョンになっている)

[pi@raspi4b01] ~
% vcgencmd bootloader_version                                                    2020-12-05 15:02:36
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103
update-time 0
capabilities 0x00000000
[pi@raspi4b01] ~
%

SSDにイメージ書き込み

SSDにOSイメージを書き込みます。
64bit版を使用したかったので下記からダウンロードします。

downloads.raspberrypi.org

あとはRaspberry Pi Imagerを使用してイメージを書き込みます。
choose OSでUse customからダウンロードしたイメージを選択すればOKです。

ref: koh-sh.hatenablog.com

SSHの有効化とk8sを使用する予定のある人はcgroupの有効化をこのタイミングでしておきましょう。

SSHの有効化

[koh@kohs-MBP] ~
% touch /Volumes/boot/ssh
[koh@kohs-MBP] ~

cgroupの有効化
末尾に cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1追記

[koh@kohs-MBP] /Volumes/boot
% cat cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=8f4dbd00-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
[koh@kohs-MBP] /Volumes/boot
% vi cmdline.txt
[koh@kohs-MBP] /Volumes/boot
% cat $_
console=serial0,115200 console=tty1 root=PARTUUID=8f4dbd00-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1
[koh@kohs-MBP] /Volumes/boot
%

起動

あとはSDカードを取り外し、SSDを差し込んだ上で起動すればSSDから立ち上がるはずです。

fdiskで確認

pi@raspberrypi:~ $ sudo fdisk -l /dev/sda
Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Disk model: SSD-PUT/N
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0x994faf48

Device     Boot  Start       End   Sectors   Size Id Type
/dev/sda1         8192    532479    524288   256M  c W95 FAT32 (LBA)
/dev/sda2       532480 500118191 499585712 238.2G 83 Linux
pi@raspberrypi:~ $
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux
pi@raspberrypi:~ $

とりあえずのddで速度確認

pi@raspberrypi:~ $ dd if=/dev/zero of=/tmp/test bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.5981 s, 234 MB/s
pi@raspberrypi:~ $

見た目

ケースから外すのがめんどくさかったので見にくいですがこんな感じです。

f:id:koh-sh:20201206151123p:plain

f:id:koh-sh:20201206151723p:plain

まとめ

ほとんど詰まることなくスムーズにSSDからブートできました。
今後暇を見つけてディスクいじめていきたい。

ハーバードのCSの授業を受けてみた(cs50)

オンラインでハーバード大学の各種授業を受けることができます。

online-learning.harvard.edu

その中でも初心者向けのComputer Scienceの授業が無料だったので受けてみました。
授業を受けると言っても動画が公開されているのでそれを自分のペースで見てすすめるといった独学用のコンテンツです。

online-learning.harvard.edu

概要

動画について

  • 大学での授業を撮影したもの
  • 一回の授業は約2時間弱
  • 全編英語だが英語字幕もつけられる

動画そのものもYoutubeで閲覧できます。

youtu.be

授業の内容について

  • Week 0 Scratch 😺
  • Week 1 C
  • Week 2 Arrays
  • Week 3 Algorithms
  • Week 4 Memory
  • Week 5 Data Structures
  • Week 6 Python 🐍
  • Week 7 SQL
  • Week 8 Information

最初に導入からScratchでのプログラム作成
1-5週はC言語でデータ構造/アルゴリズム/メモリなど基礎的なCSの内容
6-7週はPythonSQLをそれぞれ紹介
最後は総まとめとプライバシー/セキュリティ周りを少し

といった流れです。

週毎にメインの動画(2h弱)とサブの動画が数本、プログラムの課題が数問出されます。
ブラウザベースのIDE(要GitHubアカウント)が用意されているので自前での環境構築は必要ないです

感想

基本的には初学者、初めてプログラミング等をする人を対象にしている授業なのでかなり基礎的でした。
ただし私の場合CSを体系的に学習した経験がないため、しばしば知らなかった内容もあり勉強になりました。特にアルゴリズムやメモリ周り。
授業そのものについても、視覚的な説明やライブコーディング等もありとてもわかり易かったです。生徒からの質問もかなり頻繁にあり楽しそうだなと。
他にもゲーム開発やweb開発、機械学習等のコースもあるので違うものも受けてみようと思います。

online-learning.harvard.edu

夏休みなのでラズパイ増設した

f:id:koh-sh:20200805180007p:plain

夏休みなので去年に引き続きラズパイを購入しました。

koh-sh.hatenablog.com

今年は奮発してRaspberry Pi 4 Model Bのメモリ8GBです。
セットアップは基本的にラズパイ3B+のときと変わらないですが変わった部分だけ備忘録がてら。

準備するものの差分

ラズパイ3B+のときとの主な違いとしては

  • 電源がUSB type C
  • micro HDMI

くらいでした。
あとはパーツの配置が微妙に変わってるのでケース類は注意が必要かもです。

Raspberry Pi Imager

去年まではイメージを落としてきてSDカードにddコマンドで書き込んでいましたが、今年の3月にRaspberry Pi Imagerというツールが公式からリリースされていました。

www.raspberrypi.org

使用するOSと書き込むディスクを選択すればダウンロードから自動でやってくれます。
完了したらそのままディスクを取り外せる状態になりますが、SSHの有効化をしたかったためディスクを再接続して下記実施

[koh@kohs-MBP] ~
% touch /Volumes/boot/ssh
[koh@kohs-MBP] ~

[koh@kohs-MBP] ~
% diskutil list #ディスク名確認
...(省略)...
/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *32.0 GB    disk3
   1:             Windows_FAT_32 boot                    268.4 MB   disk3s1
   2:                      Linux                         1.6 GB     disk3s2

[koh@kohs-MBP] ~
% sudo diskutil eject /dev/rdisk3
Disk /dev/rdisk3 ejected
[koh@kohs-MBP] ~

swap無効化

今回はメモリが8GBで余裕があるため、SDカードの保護のためにもswapを無効化します。

pi@raspi4b01:~ $ sudo swapoff --all
pi@raspi4b01:~ $ sudo apt-get purge -y --auto-remove dphys-swapfile
pi@raspi4b01:~ $ sudo rm -rf /var/swap
pi@raspi4b01:~ $ free
              total        used        free      shared  buff/cache   available
Mem:        8064964       49576     7845216        8608      170172     7773388
Swap:             0           0           0

Wi-Fi有効化

ラズパイ3B+のときには実施してないがラズパイ4bだとWifi接続時に下記出力があり、

pi@raspi4b01:~ $ sudo dhcpcd wlan0
SIOCDELRT: No such process
SIOCDELRT: No such process
wlan0: connected to Access Point `'
SIOCDELRT: No such process
SIOCDELRT: No such process
dhcpcd_prestartinterface: wlan0: Operation not possible due to RF-kill

調べたところrfkillコマンドでWi-Fi, Bluetoothの設定ができるので許可する。
(ラズパイ4bでデフォルトが無効になったっぽい?)

pi@raspi4b01:~ $ rfkill list
0: phy0: Wireless LAN
    Soft blocked: yes
    Hard blocked: no
1: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no
pi@raspi4b01:~ $

pi@raspi4b01:~ $ sudo rfkill unblock wlan
pi@raspi4b01:~ $ rfkill list
0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
1: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no
pi@raspi4b01:~ $

その他

他の作業についてはほぼラズパイ3B+のときと同じです。
AnsibleのPlaybookを残してあったので少し修正しつつ実行して終わりです。
とりあえずmackerelのインストールまでは実施しました。

koh-sh.hatenablog.com

まとめ

基本的にはスムーズに進みました。(Wi-Fiのところで少し詰まったくらい)
電源は試しに2.4Aで供給していますがとりあえず動かす分には問題なさそう。
温度も問題ないので負荷をかけたときにどうなるか見つつ遊びたい。
メモリ8GBは嬉しい。

参考

https://mseeeen.msen.jp/install-raspberry-pi-os-with-raspberry-pi-imager/
https://typewriter.hatenablog.jp/entry/2018/05/22/223053

今更ながらPythonの型ヒントを試す

Pythonは基本的に動的型付けなのでコードを書いているときに明示的に型を記載することはないのですが、やはり他人の書いたコードを読むときや自分の過去のコードを読むときには型が書いてあると嬉しいですね。
ということで今更ですがPythonの型ヒントを試していきます。
※Python3.8.0で確認しています。3.6前後で文法が異なる部分が多いのでお気をつけください。

型ヒント(Type Hints)とは

typing — Support for type hints — Python 3.8.4rc1 documentation

Pythonの実行時には何も影響を与えないが、専用のツールやIDEと組み合わせることで型のチェックを行うことができます。

def f(num: int) -> int:
    return num ** 2

上記の場合受け取る変数num がint, 関数が返却する値がintであることを示しています。

型の指定方法

mypyのドキュメントにあるチートシートがわかりやすいのでおすすめです。

https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html

型の指定方法について下記にいくつか簡単な例を記載します。

変数

下記の2通りで型を指定できます

a: int
a = 5

b: str = 'this is str'

関数

受け取る変数についてはコロン(:)のあとに型を記載、矢印(->)のあとに返却する値の型を指定します。

def f(num: int) -> int:
    return num ** 2

エイリアス

複雑な型を指定する際や配列や辞書の中身の要素の型を指定する際には型エイリアスを使用します。

d: Dict[str, int] = {'aa': 2, 'bb': 5}

MyList = List[str]
l: MyList = ['aaa', 'bbb', 'ccc']

型チェック方法

先に記載したとおりにツールやIDEで型のチェックをする必要がありますがその方法をいくつか紹介します。

Mypy

型チェック用のCLIツールです。

https://mypy.readthedocs.io/en/latest/index.html

pipでインストール可能です

pip install mypy

引数に対象のPythonスクリプトを指定することで実行できます

[koh@kohs-MBP]
% cat main.py
b: int
b = 'aaa'

print(b)
[koh@kohs-MBP]
% mypy main.py
main.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")
Found 1 error in 1 file (checked 1 source file)
[koh@kohs-MBP]
%

Pylance

Visual Studio Codeのextentionの一つです。 (7/4時点ではpreview版)

marketplace.visualstudio.com

VS Code にてインストールしたあとに、
Extention Settings -> Type Checking Modeをbasic or strictに設定
で有効になります。

f:id:koh-sh:20200704221446p:plain

おまけ

過去に書いたPythonスクリプトに型チェックを導入してみました。

github.com

AnsibleのDynamic Inventory用のシンプルなスクリプトですが、設定できる箇所に型ヒントを記載し、GitHub Actionsでcommitごとに型チェックを実施するようにもしました。

まとめ

やっぱり明示的に型が記載してあるとコードの読みやすさ理解しやすさが違う気がしますね。