書ききれる範囲で

メモ書き集

if文とガード節の規約について

if文の規約とガード節について、有効であるため記録する。

 

要約

・if文を記述する際は、たとえ処理が無くともelse句を記述する規約は意味がない。

・else ifが存在する場合は、else句を必須とする規約に意味がある。

・if文の前などにガード節を記述するのは可読性からも、処理速度からも有効(言語による)。

・if文中にreturnを書くことを禁止する規約があった場合は、ガード節は可読性が落ちて有効でない。

 

カード節と分岐を一緒にするな - リーダブル・コード(19)


if 文(else if 文)には必ず else を付けるというコーディング・ルールが
あります。 このルールは、MECE(ミッシー、Mutually Exclusive and
Collectively Exhaustive)の考えに似ています。 MECE とは、それぞれが
重複することなく、全体としてモレがないという意味で、主に経済学で
言われるロジカル・シンキングの考えです。

プログラムは、どんなデータが入力されても、どのような状態であっても
想定して動かなければなりません。 しかも、どんな異常なデータが入力されても、
異常であることを伝えるという動きを正しく動かさなければなりません。
いわゆる「異常系」の処理です。 しかし、その対策法が、else 節を必ず付ける
ことではないのです。

人間の思考における分岐は、よくあることについて正常にどのように動かすか
という分岐(ケース)から列挙され、後の方に例外的なケースの分岐が列挙されます。
獲物に狙われて生死にかかわる状況では、よくある対処法を早く考えなければ
生き残れなかったでしょうから、人間の思考としてありうるでしょう。 つまり、
暗黙的ではありますが、よくあることからケースが挙げられていくというのは、
MECE の前提条件としてよいでしょう。

しかし、プログラムにおいては逆で、先に例外的なケースが列挙されます。
なぜなら、異常な入力データであることを先に検出しなければ、
アプリケーションが異常終了してしまうからです。
この時点ですでに MECE と前提条件が異なっています。それなのに、
MECE の考えに近い else を必須にするルールを採用してしまうのは、
問題がありそうです。 具体的に見ていきましょう。

よくあるのは、NULL 判定や 0 除算判定を先にすることです。

a = p->attr;
c = 3 / a;

という2行のコードが正しく動くためには、たとえば、次のように例外的な
NULL 判定や 0 除算判定の処理を先に書く必要があります。

if ( p == NULL ) { return ERROR_CODE; }
if ( a == 0 ) { return ERROR_CODE; }

a = p->attr;
c = 3 / a;

前半にあるそれぞれの if の節を、ガード節と呼びます。
めったに起きないが、起きた時には、何もしないで出ていく節のこと、
という定義があるようです。

ガード節には else を付けることはできません。 付けるとしたら次のように
なりますが、わざわざ else を付ける意味はありませんし、メインの処理の
ネストが深くなります。

if ( p == NULL ) { return ERROR_CODE; }
else if ( a == 0 ) { return ERROR_CODE; }
else {
  a = p->attr;
  c = 3 / a;
}

そのため、if 文は else を必須とせず、else if 文だけ else を必須とする
コーディング・ルールも存在します。 これは、よく考えられたルールだと
思いますが、MECE の考えを else 節によって漏れなくするということが
現実的ではないことを1つ認めたということでもあります。

では、もし、人間の思考に近づけるために、else 節に例外的なケースを
処理させるとしたらどうなるでしょう。 次のようなコードになります。

if ( p != NULL ) {
  if ( a != 0 ) {
    a = p->attr;
    c = 3 / a;
  } else {
    return ERROR_CODE;
  }
} else {
  return ERROR_CODE;
}

このコードの読みにくさの原因は、else 節のケースを理解するときに、
if の条件式を参照しなけばならないからです。 それなら、ガード節ですぐに
return した方が、ガード節だけで完結するためシンプルです。
ちなみに、もし、途中で return することを禁止するコーディング・ルール
があると、このような書き方にしかできず、読みにくいコードを強制する
ことになってしまいます。

また、この書き方も、メインの処理がネストの深い位置になってしまっています。

2つの if 文を && で1つの if 文にするような工夫をすれば、1レベル分の
ネストに抑えることは可能ですが、もし、判定式が連続していなければ、
ネストは深くならざるを得なくなります。 たとえば、

a = p->attr;
b = Func( a );
if ( 3 / b == 2 ) { ... }

のコードにガード節を使わないと、次のようになります。

if ( p != NULL ) {
  a = p->attr;
  b = Func( a );
  if ( b != 0 ) {
    if ( 3 / b == 2 ) { ... }
  } else {
    return ERROR_CODE;
  }
} else {
  return ERROR_CODE;
}

このコードは、if 文を1つにまとめることができません。 では、ガード節を
使うどうなるでしょう。

if ( p == NULL ) { return ERROR_CODE; }
a = p->attr;
b = Func( a );
if ( b == 0 ) { return ERROR_CODE; }
if ( 3 / b == 2 ) { ... }

ネストしなくなりましたね。

ここで、ガード節がメインの処理の if 文に混ざって読みにくくなって
しまっていることに気づいたでしょう。 では、ガード節の if を IF に変えて
みましょう。

IF ( p == NULL ) { return ERROR_CODE; }
a = p->attr;
b = Func( a );
IF ( b == 0 ) { return ERROR_CODE; }
if ( 3 / b == 2 ) { ... }

IF はガード節なので、メインの処理を理解するときは読み飛ばすことができます。
その読み方をすれば、メインの処理だけ読めるようになったことが分かるでしょう。

Module Mixer に付属の clib には、条件を満たしたときにブレークする
IF マクロを用意しています。 これは、エラーが発生した瞬間にブレークさせる
ことができる機能で、エラーの原因がすぐに分かる効果があります。 この機能は、
エラーを判定することが多いガード節と相性が良いだけでなく、読みやすさにも
良い影響を与えているのです。

else を必須にすることは否定しますが、MECE の考えは否定しません。
テスト対象のコードではなく、テスト・プログラム(データ)を開発するときに
MECE の考えを導入するのです。

参考:
リーダブル・コード 7.7 ネストを浅くする

 

 

http://www.sage-p.com/news/655.txt

健康づくりのための睡眠指針 2014

厚労省が出している、日本人向けの睡眠ガイドから。

根拠が明確で裏付けがしっかりしているので、ベーシックな知識を得るのに有益。

知識の基礎を疎かにすると胡散臭い商法に引っかかりやすくなると思うので。

  

以下、気になった点を抜粋。

  • 適度な運動を習慣づけることは、入眠を促進し、中途覚醒を減らす
  • しっかりと朝食をとることは朝の目覚めを促す
  • 就寝直前の激しい運動や夜食の摂取は、入眠を妨げる
  • 就寝前の飲酒や喫煙は睡眠の質を悪化させる
  • アルコールは入眠を一時的には促進するが、中途覚醒が増えて熟睡感が得られなくなる
  • ニコチンには覚醒作用があるため、就寝前の喫煙は入眠を妨げ、睡眠を浅くする
  • 就寝前 3~4 時間以内のカフェイン摂取は、入眠を妨げたり、睡眠を浅くする可能性がある

 

  • 日本の成人の平均的な睡眠時間は 6 時間以上 8 時間未満
  • 睡眠時間は日の長い季節では短くなり、日の短い季節では長くなるといった変化を示す
  • 一晩の睡眠量は加齢するにつれて、 20 年ごとに 30 分ぐらいの割合で減少する
  • 寝室の温度や湿度は、季節に応じて、眠りを邪魔しないと範囲に保つべき
  • 寝室の照明が明るすぎたり、特にこれが白っぽい色味であったりすると、睡眠の質が低下する

 

  • 若年世代では、平日と比べて、休日は起床時刻が 2〜3 時間程度遅くなることが世界的に示されており、これは平日の睡眠不足を解消する意味がある
  • 高校生では、起床時刻を 3 時間遅らせた生活を 2 日続けると、体内時計が 45 分程度遅れる
  • 体内時計は、起床直後の太陽の光を手がかりにリセットされる

 

  • 睡眠不足は、注意力や作業能率を低下させ、生産性を下げ、事故やヒューマンエラーの危険性を高める
  • 沢山眠っておくとその後の睡眠不足に耐えられるということはなく、「睡眠」を「ためる」ことはできない
  • 午後の早い時刻に 30 分以内の短い昼寝をすることは、眠気による作業能率の改善に効果的がある

 

  • 高齢者が、長い時間眠ろうと、寝床で過ごす時間を必要以上に長くすると、かえって睡眠が浅くなり、夜中に目覚めやすくなり、結果として熟睡感が得られない

 

  • 一年を通じて毎日同じ時刻に寝つくことが自然なわけではない
  • 意図的に早く寝床に就くと、かえって緊張を高め、寝つきが悪くなることがある
  • その日の眠気に応じて「眠くなってから寝床に就く」ことがスムーズ
    な入眠への近道である
  • 眠りが浅く何度も夜中に目が覚めてしまう場合は、寝床で過ごす時間が長すぎる可能性が考えられる

 

 

出典

 

睡眠対策 |厚生労働省

 

PDF

https://www.mhlw.go.jp/file/06-Seisakujouhou-10900000-Kenkoukyoku/0000047221.pdf

 

 

 

 

 

 

AWSのお勉強2 クラウドプラクティショナー

AWS認定資格の中で最もベーシックな知識を問うものであり、ベーシック過ぎるのでエンジニアは一般的にこの試験をすっとばしてアソシエイトレベルの試験を受ける。

AWSにまったく触ったことがない人には有効と思われる。 

 

認定される能力

  • AWS クラウドとは何かということ、およびベーシックなグローバルインフラストラクチャについて定義できる
  • AWS クラウドのベーシックなアーキテクチャ原理を説明できる
  • AWS クラウドの価値提案について説明できる
  • AWS プラットフォームの主なサービスと一般的なユースケース (例: コンピューティング、分析など) について説明できる
  • AWS プラットフォームのセキュリティとコンプライアンスのベーシックな側面、および共有セキュリティモデルについて説明できる
  • 請求、アカウントマネジメント、料金モデルを明確に理解している
  • ドキュメントや技術サポートのソースを特定できる (例: ホワイトペーパー、サポートチケットなど)
  • AWS クラウドにおけるデプロイと運用のベーシックで重要な特徴を説明できる

 

aws.amazon.com

 

出題範囲と比重

試験における比重
クラウドの概念 28%
セキュリティ 24%
テクノロジー 36%
請求と料金 12%

 AWS 認定クラウドプラクティショナー試験ガイド

 

1: クラウドの概念

1.1 AWS クラウドの概念とその価値提案について説明する

1.2 AWS クラウドエコノミクスの特徴を説明する

1.3 多種多様なクラウドアーキテクチャの設計原理を定義する

 

2: セキュリティ

2.1 AWS の責任共有モデルについて理解する

2.2 AWS クラウドのセキュリティとコンプライアンスに関するコンセプトを理解する

2.3 AWS のアクセス管理機能を特定する

2.4 セキュリティサポートのリソースを特定する

 

3: テクノロジー

3.1 AWS クラウドにおけるデプロイと運用の方法を理解する

3.2 AWS のグローバルインフラストラクチャについて理解する

3.3 AWS の主要なサービスを識別する

3.4 テクノロジーサポートのリソースを特定する

 

4: 請求と料金

4.1 AWS のさまざまな料金モデルを比較対照する

4.2 AWS 請求と料金に関連した多様なアカウント構造を認識する

4.3 請求サポートに利用できるリソースを特定する

 

 

AWSのお勉強1 認定資格

AWSの資格についてまとめる。

情報は2019/12/20時点のもの。

 

AWS認定資格は大きく2種類あり、役割別認定資格と専門知識認定資格に分けられる。

・役割別認定資格にはベーシック、アソシエイト、プロフェッショナルの3段階が設定されている。

・上位資格を受験するための前提条件は無い。下位資格は必須ではない。

 

f:id:takmiy:20191223220253p:plain

aws資格体系

https://aws.amazon.com/jp/certification/

 

 

貯蓄の基本原則

貯蓄の基本のき。

お金持ちには成らずとも、自己満足はできる程度に。

 

バビロンの大富豪 「繁栄と富と幸福」はいかにして築かれるのか

バビロンの大富豪 「繁栄と富と幸福」はいかにして築かれるのか

 

 

1.収入の10分の1を貯蓄せよ

2.欲望に優先順位を付けよ

3.蓄えた資産を働かせよ

4.危険から資産を堅守せよ

5.より良きところに住め

6.未来に備えよ

7.己を最大の資産と捉えよ

 

2002年時点でのプログラミング言語の選択

Joel on Softwareからの引用です。

 
「 開発者が与えられたタスクに対し、いろいろな言語の中から1つのプログラミング言語を選ぶのは、どういう理由によるのだろう?
 私は、非常に速さが要求されるときには、よく生のCを使う。
 Windowsのプログラムで配布ファイルを極力小さくしたい場合には、C++を使い、MFCをスタティックにリンクすることが多い。
 MacWindowsLinuxで動くGUIプログラムであれば、一般的な選択肢はJavaということになる。JavaGUIは完璧ではないけど、とにかく動いてはくれる。
 GUIプログラムの短期開発で、非常にスムーズなUIが求められているなら、私が好んで使うのはVisualBasicだ。ただし、配布ファイルが大きくなるのは避けられず、Windowsにロックインされることになる。
 あらゆるUNIXマシンで動かなければならないが、高速である必要はないコマンドラインツールには、Perlが良い選択肢となる。
 Webブラウザ上で実行する必要があるなら、実際のところJavaScriptが唯一の選択肢だ。SQLストアドプロシージャであれば、通常はベンダのプロプライエタリSQL方言を選ばざるを得ず、それが嫌なら家に帰るしかない。」

Python学習時に利用した書籍について

何をどのように使ったか残しておく。

 

 

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

 

 公式のチュートリアルとリファレンス。

他言語のプログラミング経験者であれば、これを流し読みする程度でとりあえず書くことはできる。

オフィシャルなリファレンスが付いているので、今後も参照していくことになる。

オライリーから出版されているチュートリアルの内容と公式ドキュメントは同じもの。

 

docs.python.org

 

 

 

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

 

 Pythonを独学で学習した 著者が、その過程や知識を記した本。

初めてのプログラミング言語Pythonで学びたい人に最適。

オブジェクト指向などのプログラミングパラダイムにも少し触れている。

他にPythonによる設計方法を記した本がなかなかないため、その点で貴重。

訳注も気が利いていて翻訳版の質が高い。

 

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

 

 Pythonの入門とテクニック集。リファレンスとしても使える。

下記の通り、小さめのスクリプトの作成を前提にしており、ソフトウェアやWebサービスの開発には向いていないが、Excelシートの操作など仕事の中で役に立つ。

"その場限りのコードを書く人向けの本なので、コードのスタイルや美しさにはあまり配慮していません。オブジェクト指向プログラミングやリスト内包、ジェネレータなど、洗練されたプログラミングの考え方は、複雑になるので説明していません。"(まえがきより)

 

 

 

実践 Python 3

実践 Python 3

 

 「実践Python3」というタイトルが良くない。

中身はPythonによるGoFデザインパターン

Pythonオブジェクト指向を学ぶにあたって有効。

Pythonフレームワーク理解にも活用できると思う。

中~上級者向け。

 

デザインパターンを初めて学ぶ場合は、最初から「実践Python3」で学ぶのではなく、結城浩著のデザインパターン入門がわかりやすい。

ただしこれはサンプルの言語がJavaなので、コーディングの部分のみをPythonに読み替えること。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門