20210315のLinuxに関する記事は15件です。

Linux覚え書きシェルスクリプト

概要

Linux学習で覚えたコマンドや知識をメモする記事です。

事前知識

実行権限

実行できる権限があること
権限については、Linux覚え書きユーザ管理を参照。

シェル変数と環境変数

  • シェル変数 :実行しているシェルの内部でのみ有効
  • 環境変数 : シェル外で引き継げる

基本コマンド

echo :文字列の出力

echo [オプション] 文字列
オプション 説明
-n 改行削除

シェル変数

変数定義

a=1
echo $a #変数の内容を参照

配列

a[0]=1
a[1]=2
index=1
echo ${abc[index]}

変数の一覧表示

シェル変数の一覧を表示する

set

環境変数の一覧表示

env

unset: 変数を削除する

unset []

export :環境変数を作成する

export a
export y=123

read :標準入力を読み込む

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;;
esac

for文

for 変数 in 値のリスト
do
   echo $i
done

while/until文

while 条件式 # 成立する間繰り返す
do
   処理
done

until 条件式 # 成立しない間繰り返す
do
   処理
done

# カウンタで回す
count=1
while [$count -le 10]
do
   count=`$count +1`
done

select文

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 && 条件C

OR条件

条件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 bb

return

関数内での処理を終了する

return 変数名

デバッグ

sh -x ファイル
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
web:
  image: "webapp:${TAG}"
.env
TAG=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と同じフォルダに置くようにしてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

パソコンの電源が入って最初に動く、主にハードウェアを制御するプログラム

セキュアブート

パソコンの電源を入れたあとに、このソフトは動かしていいかどうかチェックする機能
ここで問題があると判断されたソフトは起動しない

オススメ参考書

日経Linux 2021年 3 月号

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHub Actions のスケジュール実行はスケジュール通りには動いてくれないようだ

はじめに

最近、GitHub Actions を使ってとある作業を自動化した際のことです。
作業はスケジュールで実行するようにしていたのですが、意図した時間ではなく多少ズレて実行されていました。(厳密な実行時間は記録していなかったので不明ですが15分以上ズレていたと思われます。)

私の使用用途では1日1回ちゃんと動いてくれていれば別に何時でも問題ないようなものなので特に大勢に影響はないのですが、気になったので少し調べてみました。今日はそんな話です。

調査用CI

日付時間を出力するだけのミニマムなCIを調査用に作りました。これを使って調べてみます。

調査用CI
name: 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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できませんでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS で SSD を追加する。

SSDとは

HDDに代わる高速なストレージです。
連続読み込みや書き出しも速いのですが、IOPSがずば抜けて高いことが特徴です。

今回使用するSSD:NVMe SSD

PCI接続のSSDです。従来のSATA接続に比べて高速です。

マウント手順

  1. ディスクを確認する。
  2. fdiskでパーティションテーブルとパーティションを作る
  3. xfsでフォーマットする。
  4. マウントの設定を行う

rootで作業してください(sudoを付ける)。また、気を付けて作業してください。最悪の場合ディスクが吹っ飛びます。

1. ディスクの確認

cd /dev
ls nvme*
nvme0 nvme0n1

nvme0n1がディスクになりますね。

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

あとは、適当にベンチ取ってみて、ちゃんと性能が出ているかを確認したら終了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim Adventure攻略法 レベル3

レベル3のポイント

Vim Adventureのレベル3ではBxXキーを入手します。Xxを入手すると使えるようになっています。vimのカーソル移動の流儀と一文字の削除に慣れることが学習目的です。

キー 効果
B カーソル位置より前にあるWORD(*)の先頭にカーソルを移動する
x カーソル位置の一文字を削除する
X カーソル位置の左となりの一文字を削除する

(*) WORDとは空白で区切られる文字列のことで記号類も含めて連続した文字列を1つもの見なします。小文字のwebが扱うwordも文字列なのですが、文字・数字・下線(_)を1つの連続した文字列と見なし、下線以外の記号類は連続していても別の文字列として扱う点が違います。下記の囲みを見ると違いが分かりやすいかと。
image.png

レベル3開始時点で使えるようになっているキー

下記キーボードはマップの好きな場所で:keyboardと入力すると表示されます。
image.png

レベル3攻略のまとめ

Bキーは周りに何も障害物もなく簡単に入手できます。赤枠赤字のセルの文字は削除したいようですが、まだXxキーがないので先に進みます。
image.png

一番下の行にxキーが見えています。文字列が不連続で、所々、文字列の先頭や末尾に岩があるので、weを上手く使いながらxキーのあるところまで移動します。画面右上に秒数が出ていますが、 制限時間の30秒をカウントダウンしています。
image.png

無事xキーを入手できて、制限時間の30秒のカウントダウンが終わると黒い帽子のキャラクターの手前のセルに戻されるので、赤枠赤字のセルの文字を削除します。全て削除が終わるとレベル1で素通りしてきた宝箱の鍵とピンクの髪のキャラが出現します。宝箱を開けて戻ってきて欲しいと言われるので宝箱に向かいます。
image.png

レベル1の宝箱の位置まで戻ると、!のセルでBキーを使ってWORDSの先頭Wまで移動し、宝箱を開けます。
image.png

宝箱を開けると中身はロウソクで、周囲が真っ暗になってしまいます。eキーを使って岩の障害物を越え、先ほど進んだ場所まで戻ります。
image.png

元来た場所まで戻ると青い髪のキャラがいるので、そのセルに到着するとレベル3がクリアです。
image.png

目次へ
レベル2へ
レベル4へ(未投稿)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim-Adventure攻略法 レベル2

レベル2はwebキーを入手して、前後の文字列の先頭や末尾に一気に移動できるようになることが目標です。すると、文字列の中にある岩のような障害物を越えられるようになります。また、レベル3に進むために開ける必要のある扉の鍵もあわせて入手します。

まずはwキーを入手します。
image.png

続いて6行目のfromの任意の位置でwキーを使うと、続くtheの先頭であるtのセルに移動するので、eキーと鍵を入手します。そして鍵のセルでwキーを使って岩で囲われたエリアから出ます。
image.png

一番下の行に移動してweキーを使って岩を避けながら行末へ移動していくとbキーを入手できます。
image.png

続いて .のセルでbキーを使用して)まで移動し、2つめの鍵を入手。
image.png

そして一番上の行のRのセルまで移動して、bキーを使用して文字列Totaの先頭Tに移動し、そこでeキーを使用して3つめの鍵を入手し、更にweキーを使用して岩を飛び越えます。
image.png

最後は:)の行でeキーを使用して.のセルに移動し、入手済みの3つの鍵を使って扉を開けて青い髪のキャラのセルに到着すればレベル2クリアです。
image.png

目次へ
レベル1へ
レベル3へ (未投稿)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim Adventure攻略法 レベル2

レベル2のポイント

Vim Adventureのレベル2はwebキーを入手して、前後の文字列の先頭や末尾に一気に移動できるようになることが目標です。すると、文字列の中にある岩のような障害物を越えられるようになります。また、レベル3に進むために開ける必要のある扉の鍵もあわせて入手します。

キー 効果
w カーソル位置より後にあるword(*)の先頭文字にカーソルを移動する
e word(*)の末尾文字にカーソルを移動する
b カーソル位置より前にあるword(*)の先頭にカーソルを移動する

(*) wordとは文字・数字・下線(_)を1つの連続した文字列と見なし、下線以外の記号類は連続していても別の文字列として扱います。大文字のWEBが扱うWORDは空白で区切られる文字列であれば記号類も含めて連続した文字列を1つものと見なします。

下記の囲みを見ると違いが分かりやすいかと。
image.png

レベル2開始時点で使えるようになっているキー

下記キーボードはマップの好きな場所で:keyboardと入力すると表示されます。レベル1でキーが増えていないので、まだhjkl:しか使えません。
image.png

レベル2攻略のまとめ

まずはwキーを入手します。
image.png

続いて6行目のfromの任意の位置でwキーを使うと、続くtheの先頭であるtのセルに移動するので、eキーと鍵を入手します。そして鍵のセルでwキーを使って岩で囲われたエリアから出ます。
image.png

一番下の行に移動してweキーを使って岩を避けながら行末へ移動していくとbキーを入手できます。
image.png

続いて .のセルでbキーを使用して)まで移動し、2つめの鍵を入手。
image.png

そして一番上の行のRのセルまで移動して、bキーを使用して文字列Totaの先頭Tに移動し、そこでeキーを使用して3つめの鍵を入手し、更にweキーを使用して岩を飛び越えます。
image.png

最後は:)の行でeキーを使用して.のセルに移動し、入手済みの3つの鍵を使って扉を開けて青い髪のキャラのセルに到着すればレベル2クリアです。
image.png

目次へ
レベル1へ
レベル3へ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim-Adventure攻略法 レベル1

レベル1ではhjklキーによるカーソル移動を学習するのが目的です。
image.png

マップ上のキャラはヒントを教えてくれます。宝箱にたどり着くには障害物の岩を越えなくてはならず、それにはBコマンド、宝箱をゲットしたあとにマップに戻るにはEコマンドが必要ですね。
image.png

マップ上で:keyboardと入力すると現在使用可能なキーが表示されます。まだBコマンドやEコマンドがないので、宝箱はまだ無理ですね。あとで取りに戻ってくることになるのでしょう。
image.png

レベル1の最後にはvim特有のカーソル移動を学習します。

普通に進んでいこうとすると階段を超えられません。ピンクの髪のキャラがヒントとして教えてくれるのですが、vimではある行の行末から次の行にjkキーで上下移動すると、元の行よりも短い行の場合はその行末に、元の行よりも長い行の場合は元の行末と同じ位置に移動します。

なので、最初の階段は①の位置からjキーを連打していくと濃い色のセルをたどって階段をクリアします。次の階段も②の位置からkキーを連打していくと濃い緑のセルをたどって階段に、最後の階段も同じように③の位置からkキーを押していくと、階段に引っかからずに先へ進めます。

image.png

画面右端のキャラのいるセルにたどり着くとレベル1はクリアで、レベル2のマップが展開されます。

目次へ
レベル2へ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim Adventure攻略法 レベル1

レベル1のポイント

Vim Adventuresのレベル1ではhjklキーによるカーソル移動を学習するのが目的です。
image.png

レベル1で利用可能なキー

下記キーボードはマップの好きな場所で:keyboardと入力すると表示されます。この時点ではhjkl:しか使えません。
image.png

レベル1攻略のまとめ

マップ上のキャラはヒントを教えてくれます。宝箱にたどり着くには障害物の岩を越えなくてはならず、それにはBコマンド、宝箱をゲットしたあとにマップに戻るにはEコマンドが必要ですね。
image.png

マップ上で:keyboardと入力すると現在使用可能なキーが表示されます。まだBコマンドやEコマンドがないので、宝箱はまだ無理ですね。あとで取りに戻ってくることになるのでしょう。
image.png

レベル1の最後にはvim特有のカーソル移動を学習します。

普通に進んでいこうとすると階段を超えられません。ピンクの髪のキャラがヒントとして教えてくれるのですが、vimではある行の行末から次の行にjkキーで上下移動すると、元の行よりも短い行の場合はその行末に、元の行よりも長い行の場合は元の行末と同じ位置に移動します。

なので、最初の階段は①の位置からjキーを連打していくと濃い色のセルをたどって階段をクリアします。次の階段も②の位置からkキーを連打していくと濃い緑のセルをたどって階段に、最後の階段も同じように③の位置からkキーを押していくと、階段に引っかからずに先へ進めます。

image.png

画面右端のキャラのいるセルにたどり着くとレベル1はクリアで、レベル2のマップが展開されます。

目次へ
レベル2へ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim-Adventure攻略法

VIM Adventuresという昔のドラクエ風のマップを様々なvimのキー操作で移動する学習ゲームの攻略法をメモに残します。vimtutorとかよりは楽しそうですよね。
image.png

レベル3までは無料で、そこから先は有料です。レベル13まであり、$25で6ヶ月間遊べるようです。
image.png

各レベルの攻略法へのリンク

レベル1
レベル2
レベル3 (未投稿)
レベル4 (未投稿)
レベル5 (未投稿)
レベル6 (未投稿)
レベル7 (未投稿)
レベル8 (未投稿)
レベル9 (未投稿)
レベル10 (未投稿)
レベル11 (未投稿)
レベル12 (未投稿)
レベル13 (未投稿)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vim Adventure攻略法

VIM Adventuresという昔のドラクエ風のマップを様々なvimのキー操作で移動するゲームの攻略法をメモに残します。vimtutorよりも楽しくvimのキー操作が学習できそうですね。
image.png

レベル3までは無料で、そこから先は有料です。レベル13まであり、$25で6ヶ月間遊べるようです。
image.png

各レベルの攻略法へのリンク

レベル1
レベル2
レベル3
レベル4
レベル5
レベル6 (未投稿)
レベル7 (未投稿)
レベル8 (未投稿)
レベル9 (未投稿)
レベル10 (未投稿)
レベル11 (未投稿)
レベル12 (未投稿)
レベル13 (未投稿)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/fe71d9038c914c7945f1

2)DS1054Z_screen_capture-masterのインストール
DS1054Z_screen_capture-masterをgit cloneする。

 git clone https://github.com/RoGeorge/DS1054Z_screen_capture
 cd DS1054Z_screen_capture-master

README.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)そして…
やっと動いた!!そんなお話。
撮影した画像が以下になります。
DS1104Z_DS1ZA173218621_2021-03-14_15.38.59.png
これは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/sm38414502

4)まとめ
このツールはオシロスコープを使用する際、非常に有用なので兎に角動かしたかった。
今回Python2用のpipが導入出来た事、pipのモジュール内での配置換え等、正しく対処できればまだ動いて感無量。
しかし実はPython2である必要はなかったのかも知れないので、次はPython3に移植する事を考えます。

ここまでお付き合い頂き、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/fe71d9038c914c7945f1

2)DS1054Z_screen_capture-masterのインストール
DS1054Z_screen_capture-masterをgit cloneする。

 git clone https://github.com/RoGeorge/DS1054Z_screen_capture
 cd DS1054Z_screen_capture-master

README.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)そして…
やっと動いた!!そんなお話。
撮影した画像が以下になります。
DS1104Z_DS1ZA173218621_2021-03-14_15.38.59.png
これは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/sm38414502

4)まとめ
このツールはオシロスコープを使用する際、非常に有用なので兎に角動かしたかった。
今回python2用のpipが導入出来た事、pipのモジュール内での配置換え等、正しく対処できればまだ動いて感無量。
しかし実はpython2である必要はなかったのかも知れないので、次はpython3に移植する事を考えます。

ここまでお付き合い頂き、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む