nikkie-ftnextの日記

イベントレポートや読書メモを発信

エラーが送出されたらそれをハンドルしてから終了するシェルスクリプトの書き方を理解しました(set -e, trap, exit)

はじめに

やらなくても良いことならやらない1、nikkieです。

今回は直近で知った、シェルスクリプト関連のアウトプットです。

目次

まとめ(バックアップしておく気付き)

  • exitはどこで実行されても(関数の中でも)、その行でシェルスクリプトを終了
  • set -etrapで、コマンドでエラーが送出されたとき、エラーハンドラを実行してからスクリプトを終了できる

今回のサンプルシェルスクリプト(開始状態)

#!/usr/bin/env bash

echo "かがみの孤城、みんな見て!"

echo "こころちゃんかわいい"

スクリプト名はexample.sh
実行権限を付けてから実行します。

$ ./example.sh
かがみの孤城、みんな見て!
こころちゃんかわいい

exit

シェルスクリプトにexitを書くと、そこでスクリプトを終了します。
以降のコマンドは実行されません。

#!/usr/bin/env bash

echo "かがみの孤城、みんな見て!"

exit

echo "こころちゃんかわいい"

exitの後の終了コードの指定を省略すると0(正常終了)です2

$ ./example.sh
かがみの孤城、みんな見て!
$ echo $?
0

異常終了を表すステータスコードを渡す例です:

#!/usr/bin/env bash

echo "かがみの孤城、みんな見て!"

- exit
+ exit 1

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
$ echo $?
1

関数内のexitもそこでスクリプトを終了

関数を導入します。

#!/usr/bin/env bash

function awesome_function() {
    echo "Start function with $1"
    echo "End function"
}

awesome_function 42

exit 1

echo "こころちゃんかわいい"

awesome_function 42と関数を呼び出しました。
その後のexit 1スクリプトを終了します。

$ ./example.sh
Start function with 42
End function

では関数内でexitしたらどうなるでしょうか?

#!/usr/bin/env bash

function awesome_function() {
    echo "Start function with $1"
+    exit $1
    echo "End function"
}

awesome_function 42

exit 1

echo "こころちゃんかわいい"
$ ./example.sh
Start function with 42
$ echo $?
42

関数内のexitによりシェルスクリプト自体が終了しました!
exitを含む関数は、シェルスクリプトを制御することになるわけですね。

小まとめ:シェルスクリプトexit

マスタリングLinuxシェルスクリプト 第2版』1.6.1より

exitはシェルの組み込みコマンドであり、スクリプトを終了するために使われます。
終了ステータスを、整数の引数として指定します。

set -e

シェルスクリプトは途中のコマンドでエラーが送出されても、そのまま動き続けます。

#!/usr/bin/env bash

echo "かがみの孤城、みんな見て!"

# 存在しないファイルのls(故意にエラー送出)
ls spam

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
ls: spam: No such file or directory
こころちゃんかわいい
$ echo $?
0

コマンドでエラーが送出された際、直ちにスクリプトを止める指定がset -eです。

#!/usr/bin/env bash
+ set -e

echo "かがみの孤城、みんな見て!"

# 存在しないファイルのls(故意にエラー送出)
ls spam

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
ls: spam: No such file or directory
$ echo $?
1

「こころちゃんかわいい」が出力されていませんね3
スクリプトの終了コードは、最後に実行されたlsコマンドの終了コード1(No such file or directory)となっています。

小まとめ:シェルスクリプトset -e

『マスタリングLinuxシェルスクリプト 第2版』A.1.7.2より4

-eオプションを付けてsetコマンドを実行するとそれ以降にスクリプト中のコマンドでエラーが発生した場合(コマンドの終了ステータスが0でない場合)にスクリプトの実行を終了します。

trap

trapでエラー送出時に呼び出されるハンドラを指定できることを知りました。

#!/usr/bin/env bash
set -e

function error_handler() {
    echo "エラーハンドラです"
}

trap error_handler ERR

echo "かがみの孤城、みんな見て!"

# 存在しないファイルのls(故意にエラー送出)
ls spam

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
ls: spam: No such file or directory
エラーハンドラです
$ echo $?
1

lsコマンド実行でエラーが送出されると、エラーハンドラを実行してから終了という動きをします。

  • trapで指定したエラーハンドラを実行
  • エラーが送出されているので、set -e指定によりスクリプトを終了

小まとめ:シェルスクリプトtrap

  • スクリプトの中のコマンドでエラーが送出されたときのエラーハンドラを登録できる
  • エラーハンドラはset -eスクリプトが終了する前に実行される

『マスタリングLinuxシェルスクリプト 第2版』A.1.8より

trapコマンドを使用する際は、最初の引数に実行したいコマンドを指定し、2番目以降の引数にコマンドを実行させたいシグナル名またはシグナル番号を指定します。

ERRとは特別なシグナル名の1つ

ERR(コマンド実行時にエラーが発生した場合)

trapコマンドの入り口となったのはこちらのエントリです:
trap コマンドを使ったシェルスクリプトのエラーハンドリング - CUBE SUGAR CONTAINER

これらを調べた背景

この3つについて調べたのは、エラーハンドラでexitしているスクリプトを読み解きたかったからです。

#!/usr/bin/env bash
set -e

function error_handler() {
    error_status=$?
    echo "エラーハンドラです"
    exit $error_status
    echo "エラーハンドラ終了"
}

trap error_handler ERR

echo "かがみの孤城、みんな見て!"

# 存在しないファイルのls(故意にエラー送出)
ls spam

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
ls: spam: No such file or directory
エラーハンドラです
$ echo $?
1

exitset -etrapについて理解していった結果、エラーハンドラでのexitは不要と考えています。
その理由は、エラーハンドラでexitしなくてもset -eで止まるからです。

#!/usr/bin/env bash
set -e

function error_handler() {
    error_status=$?
    echo "エラーハンドラです"
-     exit $error_status
    echo "エラーハンドラ終了"
}

trap error_handler ERR

echo "かがみの孤城、みんな見て!"

# 存在しないファイルのls(故意にエラー送出)
ls spam

echo "こころちゃんかわいい"
$ ./example.sh
かがみの孤城、みんな見て!
ls: spam: No such file or directory
エラーハンドラです
エラーハンドラ終了
$ echo $?
1

シェルスクリプトの知見が豊富ではない(勉強中)ので間違っている可能性もありますが、エラーハンドラがexitする(シェルスクリプトを制御する)のは、責務が大きすぎるように感じます。
なので、set -eがあるならば、trapで設定するエラーハンドラでは(やらなくてもいい)exitは書かないというのが現時点の私の考えです。

終わりに

set -etrapがあれば、エラーハンドラ内でexitは不要!
よく分からないコマンドが複数ありましたが、1つ1つ理解していったことで、簡潔な実装ができることに気付けました。
急がば回れ」とはこのことですね。

そして、『マスタリングLinuxシェルスクリプト 第2版』、これはいい本ですね!5
今まで必要な箇所をWebで調べてシェルスクリプトを書いてきましたが、体系的に整理されていて、理解のムラがならされそうです。

(2023/05/02 追記)trapと一時ファイルを教えていただく

arterminalさん、ありがとうございます!


  1. 氷菓』の折木奉太郎のモットーです。
  2. $?は直前のコマンドの終了コードを確認できるという理解です
  3. この例にした自分が悪いのですが、「こころちゃんかわいい」が出力できなくて残念です
  4. A.1.7.3によると、set -Eとすることで、関数内のエラーに対してtrapコマンドで指定したハンドラが有効になるようです
  5. こちらのエントリでよさそうと思いました:『マスタリングLinuxシェルスクリプト 第2版』、こういう1冊手元に有るとずっと使える本はちゃんと買っておきたいですね - Magnolia Tech

4月のPyCon US 2023にposter sessionしに行きます!! #PyConUS

はじめに

聞いて聞いて! nikkieです。

タイトルがすべてです。
PyCon US 2023でポスター発表の機会をいただきました🙌(ガンバルゾー)

目次

PyCon US 2023

ユタ州Salt Lake Cityで4/19〜4/27の期間に開催されます。

  • 4/19(水)-20(木) Tutorial
  • 4/21(金)-23(日) カンファレンス
    • カンファレンスはOnlineもあるみたいです
  • 4/24(月)-27(木) Sprint

Early Birdチケット発売中です!

自作したSphinx拡張についてポスターとデモで発表します!

リンクがブラウザの新しいタブで開くのは、私にとってはかなり重要です。
過去にsphinx.ext.autodocで検証1しましたが、この拡張を使えば、簡単な設定だけでSphinxで作るHTMLの外部リンクがブラウザの新しいタブで開くようになります。
Sphinxで作ったページやライブラリのドキュメントなど、活躍できそうな箇所は広いように思われ、多くのドキュメントを今よりもちょっとだけ便利に変えていけるとワクワクしています。

まず知ってもらう、そして「簡単に使えるなら試してみよう」と思ってもらえるのを目指して、ポスターとデモを準備していきます。

2019年以来の海外、不安しかない…

2019年にはTaiwanとSingaporeのPyConに行きました。

アメリカってどう行くの?

ひとまず旅程を決めるんだ、nikkie。
ホテルは https://us.pycon.org/2023/about/health-safety-guidelines/ にもリストがあります。

トーク採択ラインの高さも知る

トークプロポーザルも複数出したのですが、採択されませんでした。
今回採択連絡が予定より遅れていて、Twitterを「US PyCon」で検索していたのですが、採択された声を見ると「採択された方の技術力、突出してるな」と思い知らされました(私も頑張ろう)。

Python × Rustか〜、なるほど(この2つの言語使いこなせたら、めっちゃヤバいですね)

すごいPython使いとして認識している方たち

猛者たちと空間を共有できるので、(悔しい気持ちも持ちつつ)楽しんできたいと思います。

終わりに

2023年4月のPyCon US 2023のposter session採択報告・参加表明でした。
2022年に「日本の外:海外のPyConに現地参加(あわよくば現地発表)したい」2と考えていた私にとっては、最大のPyConは非常に刺激的な機会です。
久々すぎる海外で不安しかないですが、時間はありますし、不安は準備で払拭できると考えることにします。
1日1エントリとも絡めて、ポスター発表の準備を積んでいけるように考えてみよう。

P.S. タイムリーなスライドから「カンファレンスドリブン旅行」

カンファレンスのリターンを「学び」で考えない

堤さんの「カンファレンスドリブン旅行」という言い回しにはワクワクしつつ、「学び」で考えないという言葉、消化するのに体験が必要そうです

CLIツールで省略可能な位置引数が複数ある場合、すべてオプション引数に置き換えたい

はじめに

かがみの孤城日本アカデミー賞 優秀アニメーション作品賞 受賞1おめでとうございます!! nikkieです

Pythonargparseを例に、CLIツールにおける省略可能な位置引数について考えていきます。
argparseを使ったコードを書いたことがあることを前提にしています(チュートリアルレベルでかまいません)。

目次

位置引数とオプション引数

※以前argparseについて書いた記事と用語を揃えます

ArgumentParseradd_argumentメソッドには、単一の名前(name)か、複数のフラグ(flags)が渡せます2
ドキュメントの例の抜粋です:

>>> parser.add_argument('-f', '--foo')  # 複数のフラグを渡す例
>>> parser.add_argument('bar')  # 単一の名前を渡す例

parse_args() が呼ばれたとき、オプション引数は接頭辞 - により識別され、それ以外の引数は位置引数として扱われます:

  • 単一の名前👉位置引数
  • 複数のフラグ👉オプション引数

引数の省略

オプション引数の省略

オプション引数は(optionalの名の通り)指定が必須ではありません。
add_argumentメソッドのdefault引数のドキュメント3によると

add_argument() の default キーワード引数 (デフォルト: None) は、コマンドライン引数が存在しなかった場合に利用する値を指定します。

オプション引数では、オプション文字列がコマンドライン上に存在しなかったときに default の値が利用されます:

上の例parser.add_argument('-f', '--foo')だと、-f--fooが指定されないときのデフォルト値はNoneですね。

位置引数の省略

位置引数も省略できます!
引き続きdefault引数のドキュメントによると

nargs が ? か * である位置引数では、コマンドライン引数が指定されなかった場合 default の値が使われます。

>>> parser.add_argument('bar', nargs='?')  # デフォルト値はNone

nargs引数のドキュメント4より

'?' -- 可能なら1つの引数がコマンドラインから取られ、1つのアイテムを作ります。コマンドライン引数が存在しない場合、default の値が生成されます。

引数が省略できる(デフォルト値が使われる)のは、便利ではあります。

複数の位置引数の一部を省略したい

説明用に、以下のようなスクリプトを用意しました(Python 3.10.2で動作確認)。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("x", nargs="?", default="spam")
parser.add_argument("y", nargs="?")
args = parser.parse_args()

print(vars(args))

位置引数xyはどちらも省略できます。
いくつか呼び出してみましょう。

(1) 位置引数を2つとも渡します。

$ python example.py kokoro fuka
{'x': 'kokoro', 'y': 'fuka'}

先に渡した引数がxに渡りますね。

(2) 位置引数を1つも渡しません。

$ python example.py
{'x': 'spam', 'y': None}

デフォルト値が使われました。

(3) 位置引数を1つだけ渡します。

$ python example.py aki
{'x': 'aki', 'y': None}

前の位置引数xに渡りました。

「前の位置引数はデフォルト値を使い、後ろの位置引数に値を渡したい」ってできる?

位置引数を1つだけ指定して、それを後の位置引数y渡すことはできるのでしょうか?
これはできないと考えています。
いくつか試したり、パーサの気持ちを考えたりした上での結論です。
あくまで"位置"引数なので、渡された実引数の数が仮引数の数より少ないとき、前から当てはめていかざるを得ないように思います5(実装を見れば言い切れそうですね)。

では、「前の位置引数はデフォルト値を使い、後ろの位置引数に値を渡す」が全くできないのかというと、方法はあります。
「2つの位置引数を指定。前の位置引数にはデフォルト値を渡す」で可能です。

$ python example.py spam aki
{'x': 'spam', 'y': 'aki'}

ですが、この方法は引数のデフォルト値を知っている必要があり、使い勝手はあまりよくない印象です。

関数の場合はキーワード引数がオススメされる

コマンドライン引数に限らず、関数の引数でも同様と気付きました。
省略可能な引数=デフォルト値を持った(位置またはキーワード)仮引数です。

デフォルト値を持ったオプションの位置またはキーワード引数には、位置引数でもキーワード引数でも値を渡せます。

def f(a, b, x="spam", y="ham", z="egg"): ...

f(101, 23, "beef")ではxに位置引数で"beef"を渡したことになりyには渡せていません。
yを位置引数で渡すためには、1つ前のxも位置引数で渡す必要があります

つまりf(101, 23, "spam", "beef")ということですね。
これはpython example.py spam akiとしたのと似ていますよね。

この場合yはキーワード引数で渡すとスッキリします。

f(101, 23, y="beef")

xは指定していないのでデフォルト値が使われます。

意見:省略可能な複数の位置引数は、オプション引数に置き換えよう

関数の場合、デフォルト値を持つ仮引数(複数)について、実引数を位置引数からキーワード引数に変更すると書きやすくなりました。
これと同じで、CLIツールでデフォルト値を持つ位置引数を複数実装していたら、すべてオプション引数に変更した方が使いやすくなると考えます。

オプション引数はCLIツールにフラグと一緒に渡します。
これにより

  • 必要な引数だけを渡せばいいので、呼び出しやすい(渡さない引数はデフォルト値が使われる)
  • フラグによって実引数の意味が分かりやすい

というメリットがあると考えます。

終わりに

CLIツールにおいて、デフォルト値をもった複数の位置引数は、オプション引数に置き換えたいということを見てきました。
考え方としては、Pythonの関数で「デフォルト値を持った仮引数は、キーワード専用とする」というtipsに通じるように思います。

argparseを例にしていますが、Clickなど他のCLIツールライブラリでも該当するのではないかと思われます。
例えばClickではargument6(位置引数)をrequired=Falseで指定不要にできます。

P.S. その1 vars(args)

ArgumentParserparse_argsメソッド7はnamespaceオブジェクトを返します。

https://docs.python.org/ja/3/library/argparse.html#the-namespace-object

もし属性を辞書のように扱える方が良ければ、標準的な Python のイディオム vars() を利用できます:

組み込み関数varsを使うと辞書に変換できるので、今回使いました。

なおvarsを使った書き方は、argparse自体のテストコードでも使われています8

class NS(object):
    # 省略
    def __eq__(self, other):
        return vars(self) == vars(other)

P.S. その2 add_argumentconst引数!

https://docs.python.org/ja/3/library/argparse.html#const

nargs引数のドキュメントの例ですが

>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
  • --fooが指定されなければデフォルト値'd'
  • --fooフラグだけ指定されたらconstの'c'
  • --foo barと引数も一緒に指定されたら'bar'

となります。


  1. https://docs.python.org/ja/3/library/argparse.html#name-or-flags
  2. https://docs.python.org/ja/3/library/argparse.html#default
  3. https://docs.python.org/ja/3/library/argparse.html#nargs
  4. デフォルト値を指定した位置引数がxyの2個という単純な例で説明しますが、x,y,zと増やして、引数を1つだけ指定してyに値を渡すようなケースを想像するとパースの難しさが分かるのではないかと思います
  5. https://click.palletsprojects.com/en/8.1.x/arguments/
  6. https://docs.python.org/ja/3/library/argparse.html#the-parse-args-method
  7. https://github.com/python/cpython/blob/v3.10.9/Lib/test/test_argparse.py#L88-L89

『The Art of Agile Development』でArlo Belsheeさんをさがして

はじめに

マジカルステージ!!1 nikkieです。

この週末、agile_devsでビデオ鑑賞会がありました。
ビデオ内のゲストの一人がArlo Belsheeさんだったのですが、この方、なんとなく私にとってのヨーダ2感があります。
「Belsheeさんのアウトプットを追ってみよう」と思い立ち、まずは『The Art of Agile Development』で言及されている箇所をリスト化します。

目次

たびたびお名前を見かけていたBelsheeさん

『The Art of Agile Development』では2箇所で見かけていました。

Agile Book Clubビデオでの紹介

「No Bugs」(初版では「7.2 バグなし」3)についてのBook Clubです。
Belsheeさんの紹介は以下:

Arlo Belshee is a 20-year legacy code & DevOps veteran with a passion for zero bugs.

(意訳) Arlo Belsheeは、バグなしへの情熱を持った、レガシーコードとDevOpsの経験20年のベテランだ

Dig Deep Rootsという会社も起こしているそうです。

探したらTwitterアカウントが見つかりました。

お名前を知っている方がゲストの回なので、今回アーカイブを見るのが楽しみでした。
アーカイブを見た感想としては、分かった話も分からなかった話もあるのですが、「今の私にとって重要なことを言っている気がするので、いくつかインプットしてもう1回聴いてみよう」と思いました。

『The Art of Agile Development』におけるBelsheeさん参照箇所 積ん読リスト

上の2つ以外でもBelsheeさんのお名前が登場します!
2版(Kindle)を「Belshee」で検索しています。

WET: When DRY Doesn’t Apply

The Core 6 Refactorings

Naming as a Process

Naked Planning

終わりに

ヨーダ候補Belsheeさんの(私のための)積ん読リストをまとめました。
「バグなし」の考え方がかなり自分にマッチするように感じていて、ゲストのBelsheeさんのお話、もっと分かりたいなあと思っています。
理解が深まった暁には視聴をオススメするエントリが書けたらいいなと思います。

宣伝📣:ビデオ鑑賞会、次回は2/4(土)「System Architecture」です。
アートオブアジャイルデベロップメント第2版 ビデオ鑑賞会 #21 - connpass

P.S. apple sauce

リファクタリングテクニックの「関数の抽出」に関連して、Belsheeさんが「apple sauce」と言っていました4
これは、仮の名前と明らかに分かる名前の関数にまず抽出する(そのあと関数名を更新する)という理解です。

そして、apple sauceという語のルーツは『リファクタリング』にあったのです!(鑑賞会で教えていただきました。ありがとうございます)
第1章の例の中でappleSauce関数に抽出しています。


  1. 大晦日に見た『魔女見習いをさがして』が響きました - nikkie-ftnextの日記
  2. SOFT SKILLS』第31章「メンターを探す:あなたのヨーダを見つける」を意識しています(手元にあるのは初版です)
  3. O'Reilly Japan - アート・オブ・アジャイル デベロップメント

登壇報告 | VS Code Conference Japan 2022 - 2023で15分2本登壇しました #vscodejp

はじめに

わわわ、わたし、にっきー。1

1/21(土)にハイブリッド開催されたVS Code Conference Japan 2022 - 2023でオフライン登壇しました。
15分のトークを2本話しています。
非常に簡単に登壇報告だけします。

目次

VS Code Conference Japan 2022 - 2023

📣connpassに発表資料とアーカイブへのリンクが掲載されています!!2
「気になるかも」という方、ぜひconnpassをご覧ください!

1本目 楽々入門!VS Codeで『リファクタリング

2本目 Awakening Extension (拡張開発はじまるよ🔰)

内容が気になる(でもスライド全部は分量多いな)という方へ

以下のPSをどうぞ。
どんな内容かが簡単に知られるんじゃないかと思います。

終わりに

VS Codeを使った開発のtipsをいくつも教えていただき、あっという間の1日でした。
登壇者の皆さま、運営の皆さま、ご参加の皆さま、ありがとうございました!

実はここ最近の睡眠時間を削って、なんとか2本両立させました。
今日のところはこれくらいにして、いまは休みます。


  1. イベント終了直後ですが、仕事が早い!運営の皆さまありがとうございます

私は「変数の抽出」をリファクタリングテクニックと認識せずにこれまで使っていたのか!

はじめに

秘密はね、最後に明かされるんだよ、nikkieです。

このブログでも何回か取り上げているリファクタリング
直近では「変数の抽出」というテクニックについて気付きがありました。
今回はそれをアウトプットします。

目次

変数の抽出

書籍『リファクタリング』の第6章で紹介される基本のリファクタリングテクニックの1つです。

変数の抽出は、言い換えると式に名前を付けることです。
Pythonで書いたコード例で見ていきましょう。

def price(order):
    # price = base price - quantity discount + shipping
    return (
        order.quantity * order.item_price
        - max(0, order.quantity - 500) * order.item_price * 0.05
        + min(order.quantity * order.item_price * 0.1, 100)
    )

価格(price)を計算する関数です。
コメントはpriceの計算を説明しています。
例えばorder.quantity * order.item_priceがbase priceに当たります。

変数の抽出は

base_price = order.quantity * order.item_price

のように式を変数に抽出します。
コメントの内容をコードで表現するわけですね(この例で変数の抽出を繰り返すと、コメントは不要1になります)。
旧版では「説明用変数の導入」と呼ばれていました。

伝えたいこと:私たちは「変数の抽出」と知らずにこのテクニックを使っているかも

リファクタリング』で「変数の抽出」とカタログに載っているテクニックですが、「変数の抽出」という名前を知らずに使っているケースもありそうです。
今回確認した範囲では、このテクニック自体は以下の本でも紹介されていました。

  • 『リーダブルコード』
  • 『現場で役立つシステム設計の原則』(増田本)
  • 『良いコード/悪いコードで学ぶ設計入門』(ミノ駆動本)

私は「変数の抽出」と認識せずに長らく使っていました。
リファクタリングと思わずに、リファクタリングしていたのです!

『リーダブルコード』 8章 巨大な式を分割する

8.1 説明変数

8.1では、式を表す変数=説明変数が紹介されます。
これはまさにbase_priceの例で示したものです(base_priceは説明変数の例なのです)!

『リーダブルコード』を読んでいるときは、これがリファクタリングテクニックの1つと認識していませんでした。
そして説明変数が使えそうなシーンがあれば、試してコードを読みやすくしてきました。
ただこれはリファクタリングテクニック「変数の抽出」の適用で、立派なリファクタリングです。
私はリファクタリングテクニックと認識せずに、リファクタリングしていたのです!

8.2 要約変数

8.2では「大きなコードの塊を小さな名前に置き換え」ると、要約変数を紹介しています。
私にはこれも「変数の抽出」のように思われます。
「変数の抽出」には説明用の変数だけでなく、要約変数の抽出もあるのですね。

もう1冊『現場で役立つシステム設計の原則』(増田本)第1章

第1章には「目的ごとに変数を用意する」という項目があります。
ここでは変数の使い回しによる、コードの理解しにくさに対処します。
書籍の例は変数priceを3つの用途に使いまわして再代入(破壊的代入)しています。

目的別に専用のローカル変数を用意し、コードの意図を変数名で説明するこのやり方を説明用の変数の導入と呼びます。(Kindle の位置No.514-516)

変数を使いまわして再度代入・繰り返し代入することを「破壊的代入」と呼んでいます。
変数の抽出により破壊的代入をなくし、コードを理解しやすく・変更しやすくしていきます。

ミノ駆動本 第2章でも

増田本での破壊的代入、ミノ駆動本では再代入という言葉でした。
「再代入せずに目的ごとに変数を用意しましょう」と説かれます。
目的ごとの変数を用意するにあたり、「変数の抽出」を適用することになりますね。

また、目的はミノ駆動本のキーワードですね。

終わりに

リファクタリング』を読んで知った「変数の抽出」ですが、同様の操作はすでに他書で学んでいて、認識せずにリファクタリングテクニックを使っていたという気付きをアウトプットしました。
「認識していなかったけれどリファクタリングしていたのか!」というのが私には衝撃でした。

リファクタリングはコードの構造を変えて分かりやすく(=読みやすく)することです。
『リーダブルコード』って読みやすいコードを扱った本と認識していますが、読みやすさにつながるテクニックは何でも紹介しているのですね!

P.S. 1/21(土) VSCodeConJPあります!

発表準備の中での気付きを1日1エントリに回しました。

VSCodeConJP、ハイブリット開催です!
興味深いトークがたくさん2ですので、皆さまよろしければご参加ください!



  1. リファクタリング』の3章 Code Smellの章で「コメントを(Smellを消す)消臭剤として使わない」と説かれます。「コメントの必要性を感じたときにはリファクタリングを行って、コメントを書かなくとも内容がわかるようなコードを目指すこと。(Kindle の位置No.2542-2543)」
  2. 1/21(土)にハイブリッド開催のVS Code Conference Japan 2022 - 2023、プレイベントのセッション紹介を聞いて、私すごく楽しみなんです! #vscodejp - nikkie-ftnextの日記

イベントレポート | みんなのPython勉強会#89「データサイエンティストのキャリアづくり」にスタッフ参加しました #stapy

はじめに

ういっす✌️ nikkieです。

1/19の「みんなのPython勉強会」(オンライン開催)にスタッフ参加してのレポートです。
スタッフ参加と書いてますが、普通に一参加者として楽しんでいました。
どのトークも刺激的で凄くテンション上がっているのですが、まだ言語化できていないこともあり、今後レポートに使う資料集として、ログを残します。

目次

勉強会の概要

みんなのPython勉強会#89 - connpass

「みんなのPython勉強会」では、Pythonを中心としてプログラミングを仕事、研究、趣味など様々なシーンに生かす方法を一緒に学びます。
プログラマ、WEBエンジニアに限らず、初心者からマスターまで様々なレベルの、いろいろな分野の人が集まるので、「みんな」の勉強会です。

データサイエンティストのキャリアづくり」がテーマ!

神沢さん、藤武さん、中川さんの事例はどれも濃く、大変刺激的でした!!
以下に資料を記録するので、興味を持ったものがあればぜひ見てみてください。

神沢さん『わたしとデータサイエンスとあなた:いままでとこれから』

参考文献リスト(4冊)、どれも気になりますね1

答えきれないほどたくさんのご質問もありがとうございました!
神沢さんの回答を以下スレッドで公開しています

  • Q: 機械学習やAIの発展が強みにも脅威もありました。肌感覚として危機感(のようなもの)はありますか?
  • Q: 会社の方でも、データサイエンティストは女性の方は少ない一方、アナリストと呼ばれる方は女性の方は多いです。アナリストまで含めると、どれくらいの割合になりますか?
  • Q: 書籍紹介であった、「戦略的データサイエンス入門」に関してはどこがおすすめですか?
  • Q: 将来的にはマネージャーとしてのキャリアも意識する中で、コードを書くスキルの維持を掲げられているのは、自分で分かる技術をを使っていきたい、という気持ちから来るのでしょうか?
  • Q: スライド内「知識」のネットワークは、主にTCP/IPなのでしょうか。

今週末1/21(土)に神沢さんが運営に関わっているTokyoR、あります!

第103回R勉強会@東京(#TokyoR) - connpass

藤武さん『キャリア形成に向けた継続的な技術習得での気付き』

資料公開いただいたら更新します

事例のお話が生々しかった…!
進め方は非常に共感します。

また、技術習得のマインドセットから気づきがありました。

中川さん『機械学習エンジニアが目指すキャリアパスとその実話』

めちゃめちゃ示唆に富むお話でした!
黒いスライドだけでもみんな見て!!

個人的に刺さったのはマネジメントでモチベートするというお話です2

アフタートークブログもあり、復習も兼ねて資料と合わせて見返したいですね。

来月のデブサミでもご発表(PyCon JP 2022トークの続編とのこと)

ミニトークPythonとネットワークの自動化基礎検定とその思い』

Pythonとネットワークの自動化基礎検定」は1/16開始ということで、ちょうど今週始まったばかりですね!

LT「ウルトラマンのように登場したい」を実現してみた

malo21stさんのLT、素晴らしかったです👏

辻さんのLT

資料公開いただいたら更新します

終わりに

2023年1月のみんなのPython勉強会の資料まとめ(自分用バックアップ)でした。
どのトークも本当に学びが深く、見返してレポートしていく予定です。

来月は機械学習の新刊特集の予定です。
こちらもお楽しみに!

ご参加いただいた皆さま、発表者の皆さま、運営スタッフの皆さま、ありがとうございました。


  1. このスレッドにあります