- 投稿日:2021-03-15T19:15:23+09:00
Linux覚え書きシェルスクリプト
概要
Linux学習で覚えたコマンドや知識をメモする記事です。
事前知識
実行権限
実行できる権限があること
権限については、Linux覚え書きユーザ管理を参照。シェル変数と環境変数
- シェル変数 :実行しているシェルの内部でのみ有効
- 環境変数 : シェル外で引き継げる
基本コマンド
echo :文字列の出力
echo [オプション] 文字列
オプション 説明 -n 改行削除 シェル変数
変数定義
a=1 echo $a #変数の内容を参照配列
a[0]=1 a[1]=2 index=1 echo ${abc[index]}変数の一覧表示
シェル変数の一覧を表示する
set環境変数の一覧表示
envunset: 変数を削除する
unset []export :環境変数を作成する
export a export y=123read :標準入力を読み込む
read [変数名]引用符
'(シングルクォート)、"(ダブルクォート)は文字列で表現する
`(バッククォート)はコマンドが実行されるtest=date echo 'aaa $test' # aaa $test echo "aaa $test" # aaa date echo "aaa `$test`" # aaa thu mar 20YY MM引数
実行時にオプションを引数として参照する
echo $1 echo $2¥ :特殊な文字列
- 特殊な文字を文字列で表示したい場合に、直前に¥をつける
- 改行として行末に¥を追加する
source :指定ファイルを読み込んでシェル環境を設定
# bash_profileなどを更新した時 source ~/.bash_profile # シェルスクリプトで定義された変数を環境変数として取り込む source ./test.sh条件分岐 / 繰り返し
if文
if 条件式 then ... elif 条件式 else fi
演算子 説明 a == b aとbが等しければ真 a != b aとbが等しくなければ真 a -eq b aとbが等しければ真 a -ne b aとbが等しくなければ真 a -ge b aがb以上であれば真 a -le b aがb以下であれば真 a -gt b aがbより大きい時は真 a -lt b aがbより小さい時は真 case文
case 変数 in 値A) 処理1;; 値B|値3) 処理2;; *) # 条件に一致しなかった場合の処理 処理3;; esacfor文
for 変数 in 値のリスト do echo $i donewhile/until文
while 条件式 # 成立する間繰り返す do 処理 done until 条件式 # 成立しない間繰り返す do 処理 done # カウンタで回す count=1 while [$count -le 10] do count=`$count +1` doneselect文
select name in "a" "b" "c" do echo "you selected $name" done # 実行結果 # 1) a # 2) b # 3) c # $?繰り返しの制御
break : 繰り返しを終了
continue :繰り返しの先頭に戻る複数の条件
AND条件
条件A -a 条件b -a 条件C 条件a && 条件b && 条件COR条件
条件A -o 条件b -o 条件C 条件a || 条件b || 条件Cファイルの有無確認
# test コマンドを利用 if test -d path ; then... # []を利用 if [-d path]; then
演算子 説明 -f ファイル名 ファイルなら真 -d ファイル名 ディレクトリなら真 -e ファイル名 ファイルが存在すれば真 -L ファイル名 シンボリックリンクなら真 -r ファイル名 読み取り可能なファイルなら真 -w ファイル名 書き込み可能なファイルなら真 -x ファイル名 ファイルが存在して、実行権限があれば真 -s ファイル名 サイズが0より大きいなら真 サブルーチン
関数
function 関数名 { 処理 } 関数名() { 処理 } # 関数を実行(引数付き) 関数名 aa bbreturn
関数内での処理を終了する
return 変数名デバッグ
sh -x ファイル
- 投稿日:2021-03-15T18:56:54+09:00
docker-composeの.envファイルの認識場所が変わった
どうやら最近、(おそらく2021/3/5リリースのdocker desktop for windows v3.2.1から)docker-composeの.envファイルの認識場所が変わったようです。特にVSCodeでRemote - Containersを使っている人は注意が必要です。
解決策
いままで
.env
ファイルはdocker-compose
コマンドを実行したときのディレクトリ(ワーキングディレクトリ)にある必要があったのですが、今度からはdocker-compose.yml
と同じ階層に保存してください。環境
備考 OS Windows10 docker desktop for windows 3.2.1 docker-compose 1.28.5 VSCode 1.54.1 Remote - Containers v0.163.2 前提知識
.env
ファイルとはdocker-compose.yml
中でホストの環境変数を使っているときに、ホストに使いたい環境変数が設定されていない場合の回避策として使えるファイルです。.env
ファイルについて書いた過去記事あるので参考にしてください。
変更点
いままでこの
.env
ファイルはdocker-compose
コマンドを実行したときのディレクトリ(ワーキングディレクトリ)にないと認識しなかったのですが、今度からはdocker-compose.yml
と同じ階層にないと認識しなくなったようです。例えば、
docker-compose.ymlweb: image: "webapp:${TAG}".envTAG=v1.5
の2つを
dc_test/ └ test_directory/ ├ .env └ docker-compose.ymlと同じディレクトリに保存すれば、
dc_test
階層からコマンドを打ったとしても、dc_test> docker-compose -f test_directory/docker-compose.yml config web: image: webapp:v1.5
と今まで通り使えます。
VSCodeのRemote Containerで.envファイルを使っている人
VSCodeでRemote - Containersを使って、
devcontainer.json
からdockerComposeFile
の項でdocker-compose.yml
を指定し、リモートコンテナを立ち上げていて、その際プロキシを設定するためなどに.env
ファイルを使っている方も多いと思います。いままではVSCodeのルートディレクトリに
.env
ファイルを置く必要があったと思いますが、今からは.envファイルはdocker-compose.yml
と同じフォルダに置くようにしてください。
- 投稿日:2021-03-15T16:26:57+09:00
Gentoo Linuxを構築する上での用語集
目的
私はGentoo Linuxを構築する上でわからない用語だらけで苦戦しました
正直Linuxすらよくわかっていなかったです
ここに調べた用語をまとめました
今後Gentoo Linuxを構築する方に少しでもスムーズに進められるように書かせていただきます
・Gentoo Linux構築の手順 パート1
・Gentoo Linux構築の手順 パート2
・Gentoo Linux構築の手順 パート3
・Gentoo Linux構築の手順 パート4
・Gentoo Linuxを構築する上での用語集Gentoo Linux
自分に必要なシステムだけを入れることができるフレキシブルなLinux
無駄がないためとても軽いOS
パソコンを動かしたり、管理したりする最重要ソフトウェアのこと
基本的役割
ハードウェアの抽象化
リソース管理
利用効率の向上構成
カーネル
シェル
GUI
ライブラリ種類
Windows 個人用
Mac 個人用
Linux サーバ-用Linux
OSの1種
Linuxでできること
WindowsやmacOSのようにパソコンの操作ができる
CUI操作を基本としている
ファイルやフォルダの検索
インターネット検索ディストリビュージョン
いろいろなLinux の種類
Linuxの代表的なディストリビュージョン
1 Red Hat Enterprise Linux(RHEL)
2Ubuntu(ウブントゥ)
3CentOS(セントオーエス)カーネル
OSの中核
シェルとハードウェア(キーボードやマウス、CPU、ディスク)の通訳ができる唯一のソフトウェア
シェルで叩かれたコマンドでカーネルを通してハードウェアに指示をだすシェル
カーネルに直でつながっているチャットインターフェイスである
ユーザーとカーネルの仲介役
シェルで叩かれたコマンドでカーネルを通してハードウェアに指示をだすシンボリックリンク
別のファイルから本ファイルをみれるようにすること
ほぼ同じ仕組みをWinodwsでは「ショートカット」、macOS(Mac OS X/旧Mac OS)では「エイリアス」(alias)というデバイス
特定の機能・用途を持った部品や装置
ブロックデバイス
単なるファイルの読み書き以外にランダムアクセスができるデバイスのこと
HDD や SSD などのストレージデバイスがそれにあたる
ブロックデバイスは通常、直接アクセスするものではなく、そこにファイルシステムを作成し、
それをマウントすることでファイルシステム経由で使用する。マウント
コンピュータに接続した機器やメディアをコンピュータに認識させ、使える状態にすること
BIOS
パソコンの電源が入って最初に動く、主にハードウェアを制御するプログラム
セキュアブート
パソコンの電源を入れたあとに、このソフトは動かしていいかどうかチェックする機能
ここで問題があると判断されたソフトは起動しないオススメ参考書
- 投稿日:2021-03-15T14:39:49+09:00
GitHub Actions のスケジュール実行はスケジュール通りには動いてくれないようだ
はじめに
最近、GitHub Actions を使ってとある作業を自動化した際のことです。
作業はスケジュールで実行するようにしていたのですが、意図した時間ではなく多少ズレて実行されていました。(厳密な実行時間は記録していなかったので不明ですが15分以上ズレていたと思われます。)私の使用用途では1日1回ちゃんと動いてくれていれば別に何時でも問題ないようなものなので特に大勢に影響はないのですが、気になったので少し調べてみました。今日はそんな話です。
調査用CI
日付時間を出力するだけのミニマムなCIを調査用に作りました。これを使って調べてみます。
調査用CIname: CI on: # UTCなので実際は朝9時の実行を期待 schedule: - cron: "0 0 * * *" # 手動実行用の記述 workflow_dispatch: jobs: execute: runs-on: ubuntu-latest steps: - name: Print date run: | # UTC echo $(date '+%Y-%m-%d %H:%M:%S(%z)') # JST echo $(TZ=Asia/Tokyo date '+%Y-%m-%d %H:%M:%S(%z)')まず手動実行してみる
これは問題なく実行時の日付時刻が出力されていましたので結果は省略します。ここでわかったことは、時計が狂っているわけではなさそう という点ですかね。
毎日9時に実行
結果は以下のようになりました。さっそくズレました。
タイムゾーンのオフセット差の可能性を考えていましたが UTCの出力が既にcronのスケジュールから5分以上ズレていました。 下記以外にも何日か試してみましたが概ね類似の結果に落ち着いていました。タイムゾーンのオフセット差によるものではなさそうです。出力2021-03-14 00:05:56(+0000) 2021-03-14 09:05:56(+0900)10分おきに実行
スケジュールを以下のように変えてみます。本来であればきっちり10分間隔で実行されるはずです。(調査用CIのジョブはトータルでも30秒弱で完了しますので後続ジョブが詰まることはまずないはず)
この状態である程度CIを放置して実行間隔を都度確認してみます。(CIが開始してからechoが呼び出されるまでのラグは数秒程度なので無視します)
on: schedule: - cron: "*/10 * * * *"結果は以下のようになりました。
# 出力 前回からの実行間隔 1 2021-03-14 08:40:37(+0000) なし 2 2021-03-14 08:55:58(+0000) 15分21秒 3 2021-03-14 09:17:57(+0000) 21分59秒 4 2021-03-14 09:38:10(+0000) 20分13秒 5 2021-03-14 09:53:08(+0000) 14分58秒 6 2021-03-14 10:13:09(+0000) 20分01秒 7 2021-03-14 10:37:14(+0000) 24分05秒 8 2021-03-14 10:52:16(+0000) 15分02秒 9 2021-03-14 11:11:12(+0000) 18分56秒 10 2021-03-14 11:32:44(+0000) 21分32秒 11 2021-03-14 11:45:48(+0000) 13分04秒 12 2021-03-14 11:52:52(+0000) 07分04秒 13 2021-03-14 12:15:35(+0000) 22分43秒 14 2021-03-14 12:46:48(+0000) 31分13秒 15 2021-03-14 13:03:49(+0000) 17分01秒 16 2021-03-14 13:28:48(+0000) 24分59秒 17 2021-03-14 13:44:11(+0000) 15分23秒 18 2021-03-14 13:52:22(+0000) 8分11秒 19 2021-03-14 14:11:55(+0000) 19分33秒 20 2021-03-14 14:33:27(+0000) 21分32秒
前回からの実行間隔
の列に注目です。かなりバラつきました。10分間隔のはずが最大で31分差つきました。ちょっと気になるのが 7分しか間隔が空いていない ケースが発生している点です。
私見ですが、キュー自体は10分間隔でセットされているが、キューからジョブを実行までの間隔、あるいはジョブを実行してからCIに記載した動作を実行するまでの間隔が長いのではないか と推定しています。(手動実行時は時間のズレもないことも根拠のひとつです)現時点での結論
今のところどうしようもなさそうです。厳密なスケジュール実行が必要とする処理を GitHub Actions に任せるのはまだ避けた方がよいかもしれません。
ただし、今回の検証は
ubuntu-latest
のみ行っているため、別のイメージであればこの限りではない可能性も無きにしも非ずです。もし何かご存じだったり、この記事に気になる点がある方は遠慮なくコメントいただけるとうれしいです。
追記
@tenmyo さんから情報提供いただきました。ありがとうございます。
公式ドキュメントに 負荷でスケジュールイベントが遅延する場合がありますよ って注意書きがありました。うーん。
Note: Due to load, the schedule event may be delayed
追記2
自分で
date
の結果を echo しなくても、GitHub Actions 上でログから確認できるみたいです。GMTだけとはいえもっと早く気づいていれば\(^o^)/
https://docs.github.com/ja/actions/managing-workflow-runs/using-workflow-run-logsちなみにこれは前述の2番目にあたる08:50に始まるはずのワークフローのログの1行目です。結局ズレていることには変わりないですが今度からログで確認します・・・
logの1行目のみ抜粋2021-03-14T08:55:52.9347836Z ##[section]Starting: Request a runner to run this job
- 投稿日:2021-03-15T14:15:46+09:00
wget web clone 便利オプション
ただのメモです。DL時サイトに迷惑がかからないように絶対にwaitを入れましょう。
説明用に簡単にコメントを入れてあります。wget -w 3 --random-wait \ DL-wait 絶対必須 -e robots=off \ -e robots=off -t 2 \ リトライ回数の上限を指定 (0 は無制限). -nc \ 存在しているファイルをダウンロードで上書きしない -c \ 部分的にダウンロードしたファイルの続きから始める --show-progress \ どのモードでも進捗バーを表示する -T 2 \ 全てのタイムアウトを SECONDS 秒に設定す --http-user=USER \ http ユーザ名として USER を使う --http-password=PASS \ http パスワードとして PASS を使う -E \ HTML/CSS 文書は適切な拡張子で保存する -r \ 再帰ダウンロードを行う -l 2 \ 再帰時の階層の最大の深さを NUMBER に設定する (0 で無制限) -k \ HTML や CSS 中のリンクをローカルを指すように変更する -K \ リンク変換前のファイルを .orig として保存する -p \ HTML を表示するのに必要な全ての画像等も取得する -D \ ダウンロードするドメインをコンマ区切りで指定する -H \ 再帰中に別のホストもダウンロード対象にする WEB-URL-w 3 --random-waitこれは絶対に必須です。大量のアクセスはサーバに迷惑をかけてしまうので
-k,-K このオプションはお好みで使用してください。-Kオプションで.origにした元ファイルと変更後ファイルの入れ替え方法はわかりません。なので-Kはいらないかも。
下記は私が実際に使用しているときのコマンドです。BASIC認証ありの場合こうしてます。wget -w 3 --random-wait -e robots=off -t 2 -nc -c --show-progress -T 5 --http-user=USER --http-password=PASS [URL] -E -r -l 0 -p -k -H -D ドメイン1,ドメイン2オレオレ認証しているサーバの場合は
--no-check-certificate
このオプションをつけてくれと表示されました。適宜付け足してください。
no-follow 属性に関しては回避方法がよくわかりません。
robots=offでは意味がないようです。html内リンクにno-follow 属性がある場合はDLできませんでした。
- 投稿日:2021-03-15T13:45:29+09:00
CentOS で SSD を追加する。
SSDとは
HDDに代わる高速なストレージです。
連続読み込みや書き出しも速いのですが、IOPSがずば抜けて高いことが特徴です。今回使用するSSD:NVMe SSD
PCI接続のSSDです。従来のSATA接続に比べて高速です。
マウント手順
- ディスクを確認する。
- fdiskでパーティションテーブルとパーティションを作る
- xfsでフォーマットする。
- マウントの設定を行う
rootで作業してください(sudoを付ける)。また、気を付けて作業してください。最悪の場合ディスクが吹っ飛びます。
1. ディスクの確認
cd /dev ls nvme* nvme0 nvme0n1nvme0n1がディスクになりますね。
2. パーティション作成
詳しくはヘルプを参考にしてください。
fdisk /dev/nvme0n1 g n p あとはデフォルトのままで作成しました。(全ディスク容量を使うようになっているハズ)3. xfsでフォーマット
mkfs -t xfs /dev/nvme0n1p1
4. マウント
設定を/etc/fstabの末尾に追加します。
/dev/nvme0n1p1 /tmp xfs defaults 0 0再起動でもいいですが、したくない場合は以下のコマンドで今すぐマウントしましょう。(サーバは起動が遅い)
mount -aあとは、適当にベンチ取ってみて、ちゃんと性能が出ているかを確認したら終了です。
- 投稿日:2021-03-15T13:19:33+09:00
Vim Adventure攻略法 レベル3
レベル3のポイント
Vim Adventureのレベル3では
B
、x
、X
キーを入手します。X
はx
を入手すると使えるようになっています。vimのカーソル移動の流儀と一文字の削除に慣れることが学習目的です。
キー 効果 B カーソル位置より前にあるWORD(*)の先頭にカーソルを移動する x カーソル位置の一文字を削除する X カーソル位置の左となりの一文字を削除する (*) WORDとは空白で区切られる文字列のことで記号類も含めて連続した文字列を1つもの見なします。小文字の
w
、e
、b
が扱うwordも文字列なのですが、文字・数字・下線(_)を1つの連続した文字列と見なし、下線以外の記号類は連続していても別の文字列として扱う点が違います。下記の囲みを見ると違いが分かりやすいかと。
レベル3開始時点で使えるようになっているキー
下記キーボードはマップの好きな場所で
:keyboard
と入力すると表示されます。
レベル3攻略のまとめ
B
キーは周りに何も障害物もなく簡単に入手できます。赤枠赤字のセルの文字は削除したいようですが、まだX
やx
キーがないので先に進みます。
一番下の行に
x
キーが見えています。文字列が不連続で、所々、文字列の先頭や末尾に岩があるので、w
とe
を上手く使いながらx
キーのあるところまで移動します。画面右上に秒数が出ていますが、 制限時間の30秒をカウントダウンしています。
無事
x
キーを入手できて、制限時間の30秒のカウントダウンが終わると黒い帽子のキャラクターの手前のセルに戻されるので、赤枠赤字のセルの文字を削除します。全て削除が終わるとレベル1で素通りしてきた宝箱の鍵とピンクの髪のキャラが出現します。宝箱を開けて戻ってきて欲しいと言われるので宝箱に向かいます。
レベル1の宝箱の位置まで戻ると、
!
のセルでB
キーを使ってWORDS
の先頭W
まで移動し、宝箱を開けます。
宝箱を開けると中身はロウソクで、周囲が真っ暗になってしまいます。
e
キーを使って岩の障害物を越え、先ほど進んだ場所まで戻ります。
- 投稿日:2021-03-15T10:46:37+09:00
Vim-Adventure攻略法 レベル2
レベル2は
w
、e
、b
キーを入手して、前後の文字列の先頭や末尾に一気に移動できるようになることが目標です。すると、文字列の中にある岩のような障害物を越えられるようになります。また、レベル3に進むために開ける必要のある扉の鍵もあわせて入手します。続いて6行目の
from
の任意の位置でw
キーを使うと、続くthe
の先頭であるt
のセルに移動するので、e
キーと鍵を入手します。そして鍵のセルでw
キーを使って岩で囲われたエリアから出ます。
一番下の行に移動して
w
やe
キーを使って岩を避けながら行末へ移動していくとb
キーを入手できます。
続いて
.
のセルでb
キーを使用して)
まで移動し、2つめの鍵を入手。
そして一番上の行の
R
のセルまで移動して、b
キーを使用して文字列Tota
の先頭T
に移動し、そこでe
キーを使用して3つめの鍵を入手し、更にw
かe
キーを使用して岩を飛び越えます。
最後は
:)
の行でe
キーを使用して.
のセルに移動し、入手済みの3つの鍵を使って扉を開けて青い髪のキャラのセルに到着すればレベル2クリアです。
- 投稿日:2021-03-15T10:46:37+09:00
Vim Adventure攻略法 レベル2
レベル2のポイント
Vim Adventureのレベル2は
w
、e
、b
キーを入手して、前後の文字列の先頭や末尾に一気に移動できるようになることが目標です。すると、文字列の中にある岩のような障害物を越えられるようになります。また、レベル3に進むために開ける必要のある扉の鍵もあわせて入手します。
キー 効果 w カーソル位置より後にあるword(*)の先頭文字にカーソルを移動する e word(*)の末尾文字にカーソルを移動する b カーソル位置より前にあるword(*)の先頭にカーソルを移動する (*) wordとは文字・数字・下線(_)を1つの連続した文字列と見なし、下線以外の記号類は連続していても別の文字列として扱います。大文字の
W
、E
、B
が扱うWORDは空白で区切られる文字列であれば記号類も含めて連続した文字列を1つものと見なします。レベル2開始時点で使えるようになっているキー
下記キーボードはマップの好きな場所で
:keyboard
と入力すると表示されます。レベル1でキーが増えていないので、まだh
、j
、k
、l
、:
しか使えません。
レベル2攻略のまとめ
続いて6行目の
from
の任意の位置でw
キーを使うと、続くthe
の先頭であるt
のセルに移動するので、e
キーと鍵を入手します。そして鍵のセルでw
キーを使って岩で囲われたエリアから出ます。
一番下の行に移動して
w
やe
キーを使って岩を避けながら行末へ移動していくとb
キーを入手できます。
続いて
.
のセルでb
キーを使用して)
まで移動し、2つめの鍵を入手。
そして一番上の行の
R
のセルまで移動して、b
キーを使用して文字列Tota
の先頭T
に移動し、そこでe
キーを使用して3つめの鍵を入手し、更にw
かe
キーを使用して岩を飛び越えます。
最後は
:)
の行でe
キーを使用して.
のセルに移動し、入手済みの3つの鍵を使って扉を開けて青い髪のキャラのセルに到着すればレベル2クリアです。
- 投稿日:2021-03-15T10:39:50+09:00
Vim-Adventure攻略法 レベル1
レベル1では
hjkl
キーによるカーソル移動を学習するのが目的です。
マップ上のキャラはヒントを教えてくれます。宝箱にたどり着くには障害物の岩を越えなくてはならず、それには
B
コマンド、宝箱をゲットしたあとにマップに戻るにはE
コマンドが必要ですね。
マップ上で
:keyboard
と入力すると現在使用可能なキーが表示されます。まだB
コマンドやE
コマンドがないので、宝箱はまだ無理ですね。あとで取りに戻ってくることになるのでしょう。
レベル1の最後にはvim特有のカーソル移動を学習します。
普通に進んでいこうとすると階段を超えられません。ピンクの髪のキャラがヒントとして教えてくれるのですが、vimではある行の行末から次の行に
j
やk
キーで上下移動すると、元の行よりも短い行の場合はその行末に、元の行よりも長い行の場合は元の行末と同じ位置に移動します。なので、最初の階段は①の位置から
j
キーを連打していくと濃い色のセルをたどって階段をクリアします。次の階段も②の位置からk
キーを連打していくと濃い緑のセルをたどって階段に、最後の階段も同じように③の位置からk
キーを押していくと、階段に引っかからずに先へ進めます。画面右端のキャラのいるセルにたどり着くとレベル1はクリアで、レベル2のマップが展開されます。
- 投稿日:2021-03-15T10:39:50+09:00
Vim Adventure攻略法 レベル1
レベル1のポイント
Vim Adventuresのレベル1では
hjkl
キーによるカーソル移動を学習するのが目的です。
レベル1で利用可能なキー
下記キーボードはマップの好きな場所で
:keyboard
と入力すると表示されます。この時点ではh
、j
、k
、l
と:
しか使えません。
レベル1攻略のまとめ
マップ上のキャラはヒントを教えてくれます。宝箱にたどり着くには障害物の岩を越えなくてはならず、それには
B
コマンド、宝箱をゲットしたあとにマップに戻るにはE
コマンドが必要ですね。
マップ上で
:keyboard
と入力すると現在使用可能なキーが表示されます。まだB
コマンドやE
コマンドがないので、宝箱はまだ無理ですね。あとで取りに戻ってくることになるのでしょう。
レベル1の最後にはvim特有のカーソル移動を学習します。
普通に進んでいこうとすると階段を超えられません。ピンクの髪のキャラがヒントとして教えてくれるのですが、vimではある行の行末から次の行に
j
やk
キーで上下移動すると、元の行よりも短い行の場合はその行末に、元の行よりも長い行の場合は元の行末と同じ位置に移動します。なので、最初の階段は①の位置から
j
キーを連打していくと濃い色のセルをたどって階段をクリアします。次の階段も②の位置からk
キーを連打していくと濃い緑のセルをたどって階段に、最後の階段も同じように③の位置からk
キーを押していくと、階段に引っかからずに先へ進めます。画面右端のキャラのいるセルにたどり着くとレベル1はクリアで、レベル2のマップが展開されます。
- 投稿日:2021-03-15T10:39:15+09:00
Vim-Adventure攻略法
VIM Adventures
という昔のドラクエ風のマップを様々なvim
のキー操作で移動する学習ゲームの攻略法をメモに残します。vimtutor
とかよりは楽しそうですよね。
レベル3までは無料で、そこから先は有料です。レベル13まであり、$25で6ヶ月間遊べるようです。
各レベルの攻略法へのリンク
レベル1
レベル2
レベル3 (未投稿)
レベル4 (未投稿)
レベル5 (未投稿)
レベル6 (未投稿)
レベル7 (未投稿)
レベル8 (未投稿)
レベル9 (未投稿)
レベル10 (未投稿)
レベル11 (未投稿)
レベル12 (未投稿)
レベル13 (未投稿)
- 投稿日:2021-03-15T10:39:15+09:00
Vim Adventure攻略法
VIM Adventuresという昔のドラクエ風のマップを様々な
vim
のキー操作で移動するゲームの攻略法をメモに残します。vimtutor
よりも楽しくvim
のキー操作が学習できそうですね。
レベル3までは無料で、そこから先は有料です。レベル13まであり、$25で6ヶ月間遊べるようです。
各レベルの攻略法へのリンク
レベル1
レベル2
レベル3
レベル4
レベル5
レベル6 (未投稿)
レベル7 (未投稿)
レベル8 (未投稿)
レベル9 (未投稿)
レベル10 (未投稿)
レベル11 (未投稿)
レベル12 (未投稿)
レベル13 (未投稿)
- 投稿日:2021-03-15T02:22:41+09:00
Linux系@RIGOL DS-1054ZのLANキャプチャでトラブル→解決(Python2終焉に向けて)
1)Python2の動向
最近Ubuntuを20.04(Focal)にアップグレードしました。
結構躊躇していたのは利用しているアプリらの影響を気にしてなのですが、
各々なんらの対処があったり、これを機に別ソフトに乗り換える等、
些末な対応で済む物も多かったりします。問題はRIGOLのオシロスコープをLAN経由でキャプチャ出来る便利ツールでした。
”DS1054Z_screen_capture-master”と言います。
このソフトはPython2で書かれており、結構古いソフトです。
Qiitaにも紹介記事が有り、初めての時はこちらを参照させて頂きました。RIGOL DS1054Z - Qiita
https://qiita.com/nanbuwks/items/fe71d9038c914c7945f12)DS1054Z_screen_capture-masterのインストール
DS1054Z_screen_capture-masterをgit cloneする。git clone https://github.com/RoGeorge/DS1054Z_screen_capture
cd DS1054Z_screen_capture-masterREADME.mdに実行方法が書いてある。(但しUbuntu 16.04.1時代の話)
また、この内容の内、解凍操作は要らない。(元のソースを落としている為)Installation on a clean Ubuntu 16.04.1
1. Python is already installed in Ubuntu 16.04.1 desktop
2. to install pillow, open a Terminal and type:
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install python-pip
pip install pillow
3. download and unzip 'DS1054Z_screen_capture-master.zip' from https://github.com/RoGeorge/DS1054Z_screen_capture
4. connect the oscilloscope to the LAN (in this example, the oscilloscope have fix IP=192.168.1.3)
5. in the Terminal, change the directory (CD) to the path were 'OscScreenGrabLAN.py' was un-zipped
cd path_where_the_OscScreenGrabLAN.py_was_unzippedそして中身はPython2である。
Ubuntu 20.04ではpython2の殆どをインストール出来ない謎がある。
pip(2用)も以前ならsudo apt install python-pip
で、インストールできた。
今はこれも出来なかった。(そんなパッケージ無い!と言われる)
技術評論社の少し前の記事を見つけた。2019年11月29日号 FocalにおけるPython 2削除の進捗・Ubuntu Coreの拡大:Ubuntu Weekly Topics|gihyo.jp … 技術評論社
https://gihyo.jp/admin/clip/01/ubuntu-topics/201911/29どうやら、Focal(Ubuntu20.04)ではPython2すら標準では入れない方向だ。
知らなかったが、これも時代の流れ、Python3への速やかな移行の為には仕方ない事だろう。
しかし、ツールが動かないのは困る…。3)そこで「アレコレ」した自分用の記録を残す。
3-1)2→3は可能か?
python2のソースをpython3のソースにトランスレートすれば動くか?と思い、2to3を入れて-wオプションで一連の.pyを変換、しかし状況は改善しなかった。
そして失念!
動かした時のエラーメッセージを保存しなかった。
確かpip.なんちゃらが11行目が…だったような?
※後にわかるが、コード上の記述に問題があるだけで、pythonバージョン問題ではないかも知れない。
※機会を見て2to3からチャレンジしてみたい。
※今回は別の方法で対応した。3-2)python2&pip(2)を入れてpillow(Python2用)を入れたい!
README.mdでpipをいれてpillowを入れろと書いてあるなら、そうするべきだ。
そこで調べたらこのページを発見した。How to Install Python Pip on Ubuntu 20.04 | Linuxize
https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/ここの「Installing pip for Python 2」がそれで、
Pip for Python 2 is not included in the Ubuntu 20.04 repositories. We’ll be installing pip for Python 2 using the get-pip.py script.
Start by enabling the universe repository:と言われる。
sudo add-apt-repository universe
リポジトリの登録は失敗した。orz
それでもめげずに続けた。Update the packages index and install Python 2:
sudo apt update
sudo apt install python2以前Python2をインストールしているので、この作業は既にインストール済みと言われる。
だが、一応習うように行い、既に入っているメッセージも含めて確認する。Use curl to download the get-pip.py script:
curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
Once the repository is enabled, run the script as sudo user with python2 to install pip for Python 2:sudo python2 get-pip.py
いよいよ本丸pipのインストールらしい。
curlでダウンロードしてインストールする様だ。
ダウンロードして、実行する。すると…何かメッセージが出る!!
米国語によると「ここにあるのは古いからこっちから落として使ってね」らしき事が書いてある。
そのこっちとは下記のURLの事である。再びcurlする。curl https://bootstrap.pypa.io/2.7/get-pip.py --output get-pip.py
仕方がないダウンロードしてpython2で実行!!
・
・
・
・「これは古い!令和最新版(心の意訳)はここにあります!」
https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py……………………………………………ナメてんのか? ※流石に少し脱力。(汗)
めげずにDL&RUN!!やっとpipがインストールできた!
pipは改版が多いと聞いた。その為にこの様な事になるのかも知れない。
不思議な事情だが、何かの運用の為の対策なのだろう。承服する以外道なし。3-3)pillowも入れる
pipがインストール出来たのでpillowもインストール。
こちらは一発!!やった。
pipがあれば当座Python2環境も維持出るかも知れないが、新規は全てPython3で書いている。
今後はこの手の事がない事を祈るしか無い。
さて、これで動くか?環境は出来た。3-4)やはりエラー。。。
今回はエラーメッセージをしげしげと読む。(最初からそうするべきだった)def log_running_python_versions():
logging.info("Python version: " + str(sys.version) + ", " + str(sys.version_info)) # () required in Python.installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])
logging.info("Installed Python modules: " + str(installed_packages_list))…これは?
「 installed_packages = pip.get_installed_distributions()」がエラーっぽい。
調べてみると下記のページがヒットした。AttributeError: module 'pip' has no attribute 'get_installed_distributions' のエラー対応 - ベスパリブ
https://takeg.hatenadiary.jp/entry/2019/09/24/171801どうやら「インストールディストリビューション取得関数」配置替えになったらしい。
ソース中「pip.」モジュールをここしか利用していない事を確認してソースを改変。問題の箇所を前出記事の説明通り、import文の変更、それに合わせ当該箇所も変更。
変更前)import pip
↓
変更後)from pip._internal.utils.misc import get_installed_distributions変更前)installed_packages = pip.get_installed_distributions()
↓
変更後)installed_packages = get_installed_distributions()3-5)そして…
やっと動いた!!そんなお話。
撮影した画像が以下になります。
これはBLDCモータを回している時のマイコン側の出力波形です。
6ステージをカーソル読みする限り、250Hz(秒間250回転=15,000RPM)で回している時の物です。
スパイクノイズが凄いですが、5V(1:10の時10倍表記はどこで直すのだろうか…)で回しています。
モータの定格だと11.2V(12Vも許容らしいが)40Aとの事ですが、そんな激しい電力は我が家になく、仕方ないのでATX電源(PC用)を使って5V側で行いました。
モータドライバがSLA5064の為、総電力40W(∞放熱)制限により、巨大放熱板で20W以内での運用にしました。
波形の細かい線は疑似正弦波の為のPWM出力が影響している様です。
ZERO-CROSSポイント周辺でノイズが出ているので、ソフト制御の間隙が災っているかも知れません。
Raspberry PI PICOで制御してみました。その時の動画をニコニコ動画にアップしました。Raspberry PI PICO BLDC始動せよ! - ニコニコ動画
https://www.nicovideo.jp/watch/sm384145024)まとめ
このツールはオシロスコープを使用する際、非常に有用なので兎に角動かしたかった。
今回Python2用のpipが導入出来た事、pipのモジュール内での配置換え等、正しく対処できればまだ動いて感無量。
しかし実はPython2である必要はなかったのかも知れないので、次はPython3に移植する事を考えます。ここまでお付き合い頂き、ありがとうございました。
- 投稿日:2021-03-15T02:22:41+09:00
Linux系@RIGOL DS-1054ZのLANキャプチャでトラブル→解決(python2終焉に向けて)
1)python2の動向
最近Ubuntuを20.04(Focal)にアップグレードしました。
結構躊躇していたのは利用しているアプリらの影響を気にしてなのですが、
各々なんらの対処があったり、これを機に別ソフトに乗り換える等、
些末な対応で済む物も多かったりします。問題はRIGOLのオシロスコープをLAN経由でキャプチャ出来る便利ツールでした。
”DS1054Z_screen_capture-master”と言います。
このソフトはpython2で書かれており、結構古いソフトです。
Qiitaにも紹介記事が有り、初めての時はこちらを参照させて頂きました。RIGOL DS1054Z - Qiita
https://qiita.com/nanbuwks/items/fe71d9038c914c7945f12)DS1054Z_screen_capture-masterのインストール
DS1054Z_screen_capture-masterをgit cloneする。git clone https://github.com/RoGeorge/DS1054Z_screen_capture
cd DS1054Z_screen_capture-masterREADME.mdに実行方法が書いてある。(但しUbuntu 16.04.1時代の話)
また、この内容の内、解凍操作は要らない。(元のソースを落としている為)Installation on a clean Ubuntu 16.04.1
1. Python is already installed in Ubuntu 16.04.1 desktop
2. to install pillow, open a Terminal and type:
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install python-pip
pip install pillow
3. download and unzip 'DS1054Z_screen_capture-master.zip' from https://github.com/RoGeorge/DS1054Z_screen_capture
4. connect the oscilloscope to the LAN (in this example, the oscilloscope have fix IP=192.168.1.3)
5. in the Terminal, change the directory (CD) to the path were 'OscScreenGrabLAN.py' was un-zipped
cd path_where_the_OscScreenGrabLAN.py_was_unzippedそして中身はpython2である。
Ubuntu 20.04ではpython2の殆どをインストール出来ない謎がある。
pip(2用)も以前ならsudo apt install python-pip
で、インストールできた。
今はこれも出来なかった。(そんなパッケージ無い!と言われる)
技術評論社の少し前の記事を見つけた。2019年11月29日号 Focalにおけるpython 2削除の進捗・Ubuntu Coreの拡大:Ubuntu Weekly Topics|gihyo.jp … 技術評論社
https://gihyo.jp/admin/clip/01/ubuntu-topics/201911/29どうやら、Focal(Ubuntu20.04)ではpython2すら標準では入れない方向だ。
知らなかったが、これも時代の流れ、python3への速やかな移行の為には仕方ない事だろう。
しかし、ツールが動かないのは困る…。3)そこで「アレコレ」した自分用の記録を残す。
3-1)2→3は可能か?
python2のソースをpython3のソースにトランスレートすれば動くか?と思い、2to3を入れて-wオプションで一連の.pyを変換、しかし状況は改善しなかった。
そして失念!
動かした時のエラーメッセージを保存しなかった。
確かpip.なんちゃらが11行目が…だったような?
※後にわかるが、コード上の記述に問題があるだけで、pythonバージョン問題ではないかも知れない。
※機会を見て2to3からチャレンジしてみたい。
※今回は別の方法で対応した。3-2)python2&pip(2)を入れてpillow(python2用)を入れたい!
README.mdでpipをいれてpillowを入れろと書いてあるなら、そうするべきだ。
そこで調べたらこのページを発見した。How to Install Python Pip on Ubuntu 20.04 | Linuxize
https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/ここの「Installing pip for Python 2」がそれで、
Pip for Python 2 is not included in the Ubuntu 20.04 repositories. We’ll be installing pip for Python 2 using the get-pip.py script.
Start by enabling the universe repository:と書かれている。
sudo add-apt-repository universe
リポジトリの登録は失敗した。orz
既に登録済みだと言われた。つまりこのリポジトリがあってもpipは入れられないと言う事。
これはpython2の導入の為なのだろう。
続けよう。
以前python2をインストールしているので、この作業は既にインストール済みと言われる。
だが、一応習うように行い、既に入っているメッセージも含めて確認する。Update the packages index and install Python 2:
sudo apt update
sudo apt install python2予想通り、インストール済みと言われた。
Use curl to download the get-pip.py script:
curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
Once the repository is enabled, run the script as sudo user with python2 to install pip for Python 2:sudo python2 get-pip.py
いよいよ本丸pipのインストールらしい。
curlでダウンロードしてpython2を使ってインストールする様だ。
ダウンロードして、実行する。すると…何かメッセージが出る!!
アメリカ語によると「ここにあるのは古いからこっちから落として使ってね」らしき事が書いてある。
そのこっちとは下記のURLの事である。再びcurlする。curl https://bootstrap.pypa.io/2.7/get-pip.py --output get-pip.py
よし、ダウンロード完了、python2で実行!!
・
・
・
・「これは古い!令和最新版(心の意訳)はここにあります!」
https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py……………………………………………ナメてんのか? ※流石に少し脱力。(汗)
めげずにDL&RUN!!やっとpipがインストールできた!
pipは改版が多いと聞いた。その為にこの様な事になるのかも知れない。
不思議な事情だが、何かの運用の為の対策なのだろう。承服する以外道なし。3-3)pillowも入れる
pipがインストール出来たのでpillowもインストール。
こちらは一発!!やった。
pipがあれば当座python2環境も維持出るかも知れないが、新規は全てpython3で書いている。
今後はこの手の事がない事を祈るしか無い。
さて、これで動くか?環境は出来た。3-4)やはりエラー。。。
今回はエラーメッセージをしげしげと読む。(最初からそうするべきだった)def log_running_python_versions():
logging.info("Python version: " + str(sys.version) + ", " + str(sys.version_info)) # () required in Python.installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])
logging.info("Installed Python modules: " + str(installed_packages_list))…これは?
「 installed_packages = pip.get_installed_distributions()」がエラーっぽい。
調べてみると下記のページがヒットした。AttributeError: module 'pip' has no attribute 'get_installed_distributions' のエラー対応 - ベスパリブ
https://takeg.hatenadiary.jp/entry/2019/09/24/171801どうやら「インストールディストリビューション取得関数」配置替えになったらしい。
ソース中「pip.」モジュールをここしか利用していない事を確認してソースを改変。問題の箇所を前出記事の説明通り、import文の変更、それに合わせ当該箇所も変更。
変更前)import pip
↓
変更後)from pip._internal.utils.misc import get_installed_distributions変更前)installed_packages = pip.get_installed_distributions()
↓
変更後)installed_packages = get_installed_distributions()3-5)そして…
やっと動いた!!そんなお話。
撮影した画像が以下になります。
これはBLDCモータを回している時のマイコン側の出力波形です。
6ステージをカーソル読みする限り、250Hz(秒間250回転=15,000RPM)で回している時の物です。
スパイクノイズが凄いですが、5V(1:10の時10倍表記はどこで直すのだろうか…)で回しています。
モータの定格だと11.2V(12Vも許容らしいが)40Aとの事ですが、そんな激しい電力は我が家になく、仕方ないのでATX電源(PC用)を使って5V側で行いました。
モータドライバがSLA5064の為、総電力40W(∞放熱)制限により、巨大放熱板で20W以内での運用にしました。
波形の細かい線は疑似正弦波の為のPWM出力が影響している様です。
ZERO-CROSSポイント周辺でノイズが出ているので、ソフト制御の間隙が災っているかも知れません。
Raspberry PI PICOで制御してみました。その時の動画をニコニコ動画にアップしました。Raspberry PI PICO BLDC始動せよ! - ニコニコ動画
https://www.nicovideo.jp/watch/sm384145024)まとめ
このツールはオシロスコープを使用する際、非常に有用なので兎に角動かしたかった。
今回python2用のpipが導入出来た事、pipのモジュール内での配置換え等、正しく対処できればまだ動いて感無量。
しかし実はpython2である必要はなかったのかも知れないので、次はpython3に移植する事を考えます。ここまでお付き合い頂き、ありがとうございました。