最近は
こちらで記事を書いています。
zsh(bash)からxonshに乗り換えたい
ここ数年は手元の端末ではzshを使用していたが、最近xonshを試しています。
約2年の時を経てxonshに再チャレンジしようとしてる。特に理由はないんだけど。 https://t.co/Uybrmq6HEs
— Koh (@koh_sh) February 16, 2021
基本的な情報は下記。ざっくり言うとpython製のシェルです。
現状は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')
まとめ
bashからの乗り換え用の情報は公式がまとめていました。
あとはzshのselect-word-style
に相当する設定を探してるのですが今のところ見つからない。
("/"などを区切り文字として認識してくれるやつ)
使っていくうちにまた何か見つけたら追記する予定。
2020年を雑に振り返る
2020年をざっくり振り返っていく。
去年のはこちら.
エンジニア関連
プログラミング
今年の最初は結構AtCoderを真面目にやっていたが5月くらいからあまりやらなくなってしまった。
プログラミング自体は楽しいけれどコンテストで毎回問題を解ききれず、もやっとした状態で週末を終えてしまうのであまりやらなくなってしまった。(単に自分の実力不足)
コンテストは参加しなくなったけど代わりにLeetCode learnを無料枠の範囲で取り組んだり、下記の書籍や動画等でアルゴリズム/データ構造などCSの基礎的な部分を改めて勉強できた気がする。
読んだ本
今年買った本は16冊。
特に今年の前半くらいまでは競プロに取り組んでたので数学周りやアルゴリズム等の本が多かった。
- 数学ガールの秘密ノートシリーズ
- CircleCI実践入門──CI/CDがもたらす開発速度と品質の両立
- SOFT SKILLS ソフトウェア開発者の人生マニュアル
あたりが特に面白かった。
動画
オンラインでハーバード大学のCSの授業が公開されていたので受講した。
プラスしてpythonとJavaScriptのコースも見た。
生活
とりあえずリモートワークって感じでした。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円もかからないのはだいぶ嬉しい。
ゲーム
おうち時間なのでゲームも結構買った。
今年購入したソフトは9本。一ヶ月半に1本ペース。多い。
- ペルソナ5 スクランブル ザ ファントム ストライカーズ
- 天穂のサクナヒメ
- OCTOPATH TRAVELER
あたりが面白かったかなと。
特にOCTOPATH TRAVELERは現在進行形で冬休みを溶かしている。
まとめ
基本的にはコロナの影響もあり引きこもって勉強するかゲームするかな一年だった。
ただインプットが増えた分アウトプットが減ったのでせめて月一くらいでブログ書くようにしたい。
来年はどうなるかまだわからないけど、この状態が続くようであればもう少し自宅の作業環境を整えたいなと思う。
ラズパイにUSBメモリ型SSDを生やす
最近USBメモリ型のSSDが発売されたらしいのでそれを使ってラズパイを起動してみました。
使用したSSDはこちら。
やってる事自体は何番煎じだって感じですが自身の備忘として。
やること
現在SDカードで動いているRaspberry Pi 4 Model B (8GB)を使用して、SSDにOSインストールしてUSBブートする。(クリーンインストール)
bootloaderのアップデート
2020-08-10バージョンからUSBブートがStableになっているのでbootloaderのバージョンをあげます。
手順は下記の記事を参考にさせていただきました。
作業前の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版を使用したかったので下記からダウンロードします。
あとはRaspberry Pi Imagerを使用してイメージを書き込みます。
choose OSでUse customからダウンロードしたイメージを選択すればOKです。
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:~ $
見た目
ケースから外すのがめんどくさかったので見にくいですがこんな感じです。
まとめ
ほとんど詰まることなくスムーズにSSDからブートできました。
今後暇を見つけてディスクいじめていきたい。
ハーバードのCSの授業を受けてみた(cs50)
オンラインでハーバード大学の各種授業を受けることができます。
その中でも初心者向けのComputer Scienceの授業が無料だったので受けてみました。
授業を受けると言っても動画が公開されているのでそれを自分のペースで見てすすめるといった独学用のコンテンツです。
概要
動画について
- 大学での授業を撮影したもの
- 一回の授業は約2時間弱
- 全編英語だが英語字幕もつけられる
動画そのものもYoutubeで閲覧できます。
授業の内容について
- 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週はPythonとSQLをそれぞれ紹介
最後は総まとめとプライバシー/セキュリティ周りを少し
といった流れです。
週毎にメインの動画(2h弱)とサブの動画が数本、プログラムの課題が数問出されます。
ブラウザベースのIDE(要GitHubアカウント)が用意されているので自前での環境構築は必要ないです
感想
基本的には初学者、初めてプログラミング等をする人を対象にしている授業なのでかなり基礎的でした。
ただし私の場合CSを体系的に学習した経験がないため、しばしば知らなかった内容もあり勉強になりました。特にアルゴリズムやメモリ周り。
授業そのものについても、視覚的な説明やライブコーディング等もありとてもわかり易かったです。生徒からの質問もかなり頻繁にあり楽しそうだなと。
他にもゲーム開発やweb開発、機械学習等のコースもあるので違うものも受けてみようと思います。
夏休みなのでラズパイ増設した
夏休みなので去年に引き続きラズパイを購入しました。
今年は奮発してRaspberry Pi 4 Model Bのメモリ8GBです。
セットアップは基本的にラズパイ3B+のときと変わらないですが変わった部分だけ備忘録がてら。
準備するものの差分
ラズパイ3B+のときとの主な違いとしては
- 電源がUSB type C
- micro HDMI
くらいでした。
あとはパーツの配置が微妙に変わってるのでケース類は注意が必要かもです。
Raspberry Pi Imager
去年まではイメージを落としてきてSDカードにddコマンドで書き込んでいましたが、今年の3月にRaspberry Pi Imagerというツールが公式からリリースされていました。
使用する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のインストールまでは実施しました。
まとめ
基本的にはスムーズに進みました。(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版)
VS Code にてインストールしたあとに、
Extention Settings -> Type Checking Modeをbasic or strictに設定
で有効になります。
おまけ
過去に書いたPythonのスクリプトに型チェックを導入してみました。
AnsibleのDynamic Inventory用のシンプルなスクリプトですが、設定できる箇所に型ヒントを記載し、GitHub Actionsでcommitごとに型チェックを実施するようにもしました。
まとめ
やっぱり明示的に型が記載してあるとコードの読みやすさ理解しやすさが違う気がしますね。