12月3日の学び

式と文に明確な定義があるのかは不明だが、少なくとも「式は値を持つ」が「文は値を持たない」と思う。

式の型の確認

  • :t で型を確認できる
  • :: の記号は「〜の型を持つ」と読む
Prelude> :t 'a'
'a' :: Char

関数headは「任意の型のリストを引数に取り、その型の要素を一つ返す」と読む

Prelude> :t head
head :: [a] -> a

型クラス

  • 型クラスは何らかの振る舞いを定義するインタフェース
  • 型クラスは関数(メソッド)の集まり
  • 型はある型クラスのインスタンス
  • 型はある型クラスの記述する振る舞いを実装する

12月2日の学び(プログラミング言語の分類)

型推論

  • 周囲の文脈から型を推論すること
  • 変数に対する型の記載がなくなるため簡潔に記載ができる(ここ重要!)

静的型付け

  • プログラム実行前に全ての変数の型が決まっている
  • コンパイル言語に多い
  • CとかJavaとか

動的型付け

  • 動的型付けとはプログラム実行中にその変数が呼び出されるときまで変数の型が変わりうる
  • スクリプト言語に多い
  • Pythonとか

型安全

  • 型チェックを行うことにより(文法的には正しくても意味をもたない配列範囲外の処理参照など)動作未定義の処理が存在しないことを保証する
  • 代償として静的型付けでは型を指定するという煩雑さが存在する

例外処理

  • 定義:プログラムの上位の処理から呼び出されている下位の処理で継続不能、または継続すれば支障をきたす異常事態に陥ったとき、制御を呼び出し元の上位の処理に返し安全な状態になるよう回復処理 − 目的:上に記載の通り「異常事態発生の場合安全な状態に回復する」のが最大の目的(ようは回復したい!!)
  • 言語レベルで組み込みの例外処理を持たないC言語などでは、戻り値で(非負や非NULL)などでチェックする
  • 上の場合はデメリットが存在する①. そもそも戻り値は無視できる②. 具体的なエラー情報が不明③. 戻り値チェックの記述が煩雑
  • 例外処理は言語側にないといろいろ困るよね!というのが結論

例外安全

  • 実行中に失敗してもメモリ不足や不正な出力などを引き起こさないこと。例外安全には最低限から実行に失敗しないことの保証まで複数のレベルが存在。 okn-yu.hatenablog.com

例外中立

  • 発生した例外を握りつぶさないこと

dic.nicovideo.jp d.hatena.ne.jp

12月2日の学び①(関数型言語)

 関数型言語のメリット

  • 関数型言語だと「関数は当然値を返すだけ」なので、以下のような関数同士を組み合わせて別の関数の作成は容易である。
  • 同じことを手続き型言語でやろうとすれば、できなくはないけどここまで綺麗にはかけない。
doubleMe x = x + x
doubleUs  x y = doubleMe x + doubleMe y

12月1日の学び(Haskell)

Haskell関連の用語整理

Stack

  • Haskellのパッケージ管理やビルドを実行
  • パッケージ管理においては下のcabal-installの差し替えとして機能
  • ビルド実行においてはCabalをバックエンドで利用
  • 動作としてはJavaMavenに近い?

Cabal

  • ビルドシステム

cabal-install

  • パッケージ管理ツール

ghc

11月30日の学び(セッション①)

  • セッションは端末と関連している概念らしい。
  • やっぱり自前のLinux環境がないと辛い。

セッション

  • セッションはセッションIDという値を共有するプロセスの集まりである
  • 1つのプロセスグループ内のプロセスは同じ値のセッションIDを共有する
  • つまりセッションとプロセスグループで二階層のプロセス階層が形成できる

セッションの生成

  • 新たなセッションの生成はプロセスが setsid(2) を呼び出すことで行う
  • セッションを新しく生成したプロセスはセッションリーダとなる

セッションID

  • 各セッションにはセッションリーダが1つ存在する
  • セッションIDはセッションリーダーのプロセスIDとなる

セションと制御端末

− 各セッションは一つの制御端末(ttyやpts)と紐付いている - セッションリーダーが最初に端末をオープンした際に制御端末は設定される

qiita.com yktwww.hatenablog.com d.hatena.ne.jp プロセスグループ - Wikipedia

11月29日の学び(プロセスグループ)

リペアレンティング

  • Linux/Unixでは親プロセスが死ぬと子プロセスは「孤児プロセス」として取り扱われる
  • 孤児となってしまったプロセスは即座にinitプロセスの配下に紐付けられ生き続けることができる
  • この動作をリペアレンティングと呼び、カーネルによって行われる

equj65.net

プロセスグループ

  • プロセスグループとはLinux/Unixにおけるプロセス管理の仕組みであり、複数のプロセスを束ねた集合のこと
  • プロセスをforkして子プロセスを作成した場合、親、子プロセスは同一プロセスグループに所属
  • 子がさらに子をforkしてもこれらはすべて同一の親にぶら下がる一つのグループとして扱われる
  • パイプでつないだプロセス同士は同じプロセスグループに所属

次回予告

セッショングループに関して勉強する予定

yktwww.hatenablog.com

11月26日の学び(trapコマンド)

trapコマンド

  • 実行中のプロセスに対して送出されたシグナルを補足し、予め指定していた処理を実行するコマンド
  • 使い方としてはシェルスクリプト内部にtrap処理を記載し、実行中のシェルスクリプトに外部からシグナルを送信した際の動作を指定できる
trap 'コマンド' シグナルリスト

次回予告

shellscript.sunone.me ↑明日いろいろなシグナルの送信&トラップで遊んでみる