学習用クラウドサービス ~ katacoda ~

■ はじめに

Linux系のWebセミナーを参加した際に、
学習用クラウドサービス「katacoda (カタコダ)」
について、扱ってたので、メモしておく

目次

【1】katacoda (カタコダ)
 1)使用上の注意
 2)詳細(その他参考サイト)
【2】メモ(個人的な感想など)

【1】katacoda (カタコダ)

* 学習用クラウドサービス
* 学習用として Linux (CentOS/Ubuntuなど) 構築しブラウザから操作できる
* 無料
 (ただし、Github/LinkedIn/Twitter/Google又はMailでの登録が必要)

https://www.katacoda.com/

1)使用上の注意

* 英語のみ(日本語のローカライゼーションはなし)
* いくつかの使用制限がある(何でもできる訳ではない)
* あくまで学習用なので、時間制限があり、しばらくすると消えてしまう
 => サーバのインスタンス継続不可
 => 時間がたつと以下のエラーが出た
~~~~~~
The environment has expired.

Please refresh to get a new environment.
~~~~~~

2)詳細(その他参考サイト)

* 以下のサイトなどを参照

https://budougumi0617.github.io/2018/06/10/katacoda-introduction/
https://engineer-ninaritai.com/katacoda-docker/

【2】メモ(個人的な感想など)

* めちゃめちゃお手軽にできる
* 学習コンテンツ公開とかもできるらしい (以下のサイト参照)

https://qiita.com/comefigo/items/53574476a2c9bec77a4c

【Shell】シェル ~ 基本編・引数あれこれ ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/07/09/115553

などで、シェルを使う機会があり、引数を使って
もう少しきれいに書けるので、メモ。

目次

【1】引数を取得する
 例1:引数を変数に設定
【2】引数チェック
 例1:引数が3つない場合エラーにする
【3】引数を配列として取得する
 例1:引数を配列として取得し、出力する
 例2:引数の一部を配列として取得し、出力する
 補足1:shift コマンド
 補足2:配列
 補足3:$@ と $* の違い
【4】引数により処理を変える

【1】引数を取得する

* $1~$9 で取得できる
* 10以降は、${10}, ${11}, ... (${X}で癖をつけておいたほうが良さそう)

例1:引数を変数に設定

sample.sh

#!/bin/bash

VAL1="${1}"
VAL2="${2}"
VAL3="${3}"

echo "Result [${1}, ${2}, ${3}]"

出力結果例

$ ./sample.sh hello world Mike
Result [hello, world, Mike]

 【2】引数チェック

例1:引数が3つない場合エラーにする

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "ERROR MESSAGE"
  exit 1
fi

【3】引数を配列として取得する

* 「@」で取得する
* 引数の一部を変数、以降を配列として取得するには、shift を使う

例1:引数を配列として取得し、出力する

sample.sh

#!/bin/bash

VALS="$@"

for val in ${VALS[@]};
do
  echo "Result ${val}"
done

出力結果例

$ ./sample.sh hello world Mike
Result hello
Result world
Result Mike

例2:引数の一部を配列として取得し、出力する

sample.sh

#!/bin/bash

VAL1=${1}
VAL2=${2}
shift 2
VALS=("$@")

echo "VAL1 = ${VAL1}"
echo "VAL2 = ${VAL2}"

for val in ${VALS[@]};
do
  echo "Result ${val}"
done

出力結果例

$ ./sample.sh hello world Mike Tom Sam
VAL1 = hello
VAL2 = world
Result Mike
Result Tom
Result Sam

補足1:shift コマンド

* 引数をずらしたい場合に使用する

構文

# 引数をNつずらす
shift N

参考文献
https://xtech.nikkei.com/it/article/COLUMN/20060227/230882/

補足2:配列

* 以下のサイトなどを参照のこと。

https://www.atmarkit.co.jp/ait/articles/1905/22/news004.html

補足3:$@ と $* の違い

* ほぼ同じだが、以下の違いがある(これでハマってうまく動かなかった)
 + "$*" : "a  b  c" に展開される
 + "$@":"a"  "b"  "c"  と別々の文字列に展開される

https://se.cite.ehime-u.ac.jp/~aman/memo/bash/shell_prog1.html

【4】引数により処理を変える

* CASE 文を使うと奇麗に書ける

例1:Hello world

#!/bin/bash

ENV="$1"

case "${ENV}" in
  prod)
    echo "Hello!"
    ;;
  stage)
    echo "Good morning!!"
    ;;
  dev | *)
    echo "Good bye so long..."
    ;;
esac

参考文献

https://hi-yamamoto.hatenablog.com/entry/2014/09/29/153935
https://maku77.github.io/linux/startup/command-line-params.html

関連記事

シェル ~入門編~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
シェル ~ 基本構文編 ~
https://dk521123.hatenablog.com/entry/2015/02/20/001600
シェルスクリプトあれこれ
https://dk521123.hatenablog.com/entry/2018/03/03/210642
Github Actions ~ 外部シェルスクリプト実行 ~
https://dk521123.hatenablog.com/entry/2024/01/19/003044

【Python】オフライン環境下で pip install するには

■ はじめに

https://dk521123.hatenablog.com/entry/2021/07/08/161406
https://dk521123.hatenablog.com/entry/2021/07/09/115553

で 外部ネットワーク が繋がらない状態で、
個別で pip install とした際に、依存するパッケージを先に
入れておかなくてはならない。

そのため、インストール順番を間違えた場合、
エラーになってしまうが、調べていたら、
オフライン環境下での pip install があったのでメモしておく

 これがあれば、依存パッケージを適切に配置しておけば
インストール側は、1回のコマンド実行でよく、
依存パッケージを意識する必要がなくなる。

目次

【1】オフライン環境下での pip install
 1)--no-index
 2)-f, --find-links <url>
【2】pip download(追加)
【3】インストール手順例
 1)対象モジュールをダウンロードする
 2)対象モジュールを任意ディレクトリに置く
 3)pip install (--no-index / --find-links) でインストールする
【3’】インストール手順例(Old)
 1)対象モジュールをダウンロードする
 2)対象モジュールを任意ディレクトリに置く
 3)pip install (--no-index / --find-links) でインストールする
【4】おまけ:EMRのブートストラップアクションでの適用

【1】オフライン環境下での pip install

pip install --no-index --find-links=[ローカルディレクトリ先] [パッケージ名]

https://pip.pypa.io/en/stable/cli/pip_install/

1)--no-index

https://kurozumi.github.io/pip/reference/pip_wheel.html#no-index

Ignore package index (only looking at --find-links URLs instead).

パッケージインデックスを無視する
(代わりに--find-linksのURLだけを見る)

https://kurozumi.github.io/pip/reference/pip_wheel.html#find-links

If a url or path to an html file,
 then parse for links to archives.
もし、URL又はHTMLファイルを指定した場合
その際は、アーカイブするためにリンクをパースする

If a local path or file:// url that's a directory,
 then look for archives in the directory listing.
もし、ローカルパス又はfile://<ディレクトリ> を指定した場合
その際は、ディレクトリリスト内でアーカイブを探す

【2】pip download(追加)

* パッケージのダウンロード
 => これで依存関係のライブラリも落としてこれる!

https://pip.pypa.io/en/stable/cli/pip_download/

構文

pip download -d <dir> <package>

# こっちの方がDependencyを調べなくていいからいい!
pip download -d <dir> --no-binary :all: <package>

コマンド例1

$ pip download -d ./src -r requirements.txt
...
$ cd ~/src
$ ls
boto3-1.34.51-py3-none-any.whl     python_dateutil-2.8.2-py2.py3-none-any.whl  urllib3-2.0.7-py3-none-any.whl
botocore-1.34.51-py3-none-any.whl  s3transfer-0.10.0-py3-none-any.whl
jmespath-1.0.1-py3-none-any.whl    six-1.16.0-py2.py3-none-any.whl

requirements.txt

boto3
python-dateutil
urllib3
botocore
s3transfer
jmespath

コマンド例2

$ pip download -d src --no-binary :all: boto3

【3】インストール手順例

1)対象モジュールをダウンロードする
2)対象モジュールを任意ディレクトリに置く
3)pip install (--no-index / --find-links) でインストールする

開発環境

* OS : Ubuntu
* Python : v3.6.13

1)対象モジュールをダウンロードする




2)対象モジュールを任意ディレクトリに置く

格納例

~/local_modules
 + boto3-1.17.109.tar.gz
 + python-dateutil-2.8.1.tar.gz
 + urllib3-1.26.6.tar.gz
 + botocore-1.20.109.tar.gz
 + s3transfer-0.4.2.tar.gz
 + jmespath-0.10.0.tar.gz
pip install --no-index --find-links=local_modules boto3

参考文献
https://qiita.com/analytics-hiro/items/2565adbb2c900e6738cd
https://kazuhira-r.hatenablog.com/entry/2021/05/17/003204

【3’】インストール手順例(Old)

1)対象モジュールをダウンロードする
2)対象モジュールを任意ディレクトリに置く
3)pip install (--no-index / --find-links) でインストールする

開発環境

* OS : Windwos10
* Python : v3.6.13

1)対象モジュールをダウンロードする

対象モジュールおよび依存パッケージを含めて
モジュール(tar.gz形式 又は whl形式)をダウンロードしておく
 => 今回は、tar.gz形式

boto3パッケージ

[1] boto3
 => 今回の場合、「boto3-1.17.109.tar.gz」

https://pypi.org/project/boto3/

boto3に必要な依存パッケージ

[2] python-dateutil
 => 今回の場合、「python-dateutil-2.8.1.tar.gz」

https://pypi.org/project/python-dateutil/

[3] urllib3
 => 今回の場合、「urllib3-1.26.6.tar.gz」

https://pypi.org/project/urllib3/

[4] botocore
 => 今回の場合、「botocore-1.20.109.tar.gz」

https://pypi.org/project/botocore/

[5] s3transfer
 => 今回の場合、「s3transfer-0.4.2.tar.gz」

https://pypi.org/project/s3transfer/

[6] jmespath
 => 今回の場合、「jmespath-0.10.0.tar.gz」

https://pypi.org/project/jmespath/

2)対象モジュールを任意ディレクトリに置く

依存パッケージも含めて、任意ディレクトリ内に
tar.gz形式 又は whl形式のモジュールファイルを置く
 => 今回は、tar.gz形式

格納例

C:\tmp\pip_local\local_modules
 + boto3-1.17.109.tar.gz
 + python-dateutil-2.8.1.tar.gz
 + urllib3-1.26.6.tar.gz
 + botocore-1.20.109.tar.gz
 + s3transfer-0.4.2.tar.gz
 + jmespath-0.10.0.tar.gz
cd C:\tmp\pip_local

pip install --no-index --find-links=local_modules boto3

【4】おまけ:EMRのブートストラップアクションでの適用

https://dk521123.hatenablog.com/entry/2021/07/09/115553

での「install_boto3.sh (外部ネットワークに繋がる場合)」を
外部ネットワークに繋がらないように書き変えてみる

サンプル:install_boto3.sh (外部ネットワークに繋がらない場合)

#!/bin/bash

INSTALL_MODULE_NAME="boto3"
DIR_NAME="local_modules"

# ディレクトリごとDownload する
aws s3 cp s3://your-bucket-name/xxx/${DIR_NAME} ./${DIR_NAME} --recursive

# pip install
sudo pip-3.6 install --no-index --find-links=${DIR_NAME} ${INSTALL_MODULE_NAME}

参考文献

https://gammasoft.jp/blog/pip-install-from-local-archives-by-manually/

関連記事

パッケージ管理 ~ pip / wheel, egg ~
https://dk521123.hatenablog.com/entry/2019/11/09/001342
pip に関するあれこれ
https://dk521123.hatenablog.com/entry/2021/07/02/000000
仮想環境 ~ pyenv / virtualenv / venv / pipenv ~
https://dk521123.hatenablog.com/entry/2020/02/11/141852
egg / wheel ファイルを作成する
https://dk521123.hatenablog.com/entry/2020/02/09/234350
パッケージ配布 ~ setup.pyによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/19/000000
パッケージ配布 ~ pyproject.tomlによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/28/000000
pip install wheelファイル で Read time out が発生する
https://dk521123.hatenablog.com/entry/2021/07/08/161406
Amazon EMR ~ EMR内部 から SES で Email を送る ~
https://dk521123.hatenablog.com/entry/2021/07/09/115553