SATySFiの文字列の扱いに対する提案

はじめに

この記事はSATySFi Advent Calendar 2022の25日目の記事です。

様々なパッケージを作ったりする過程で、現状のSATySFiでの文字列の仕様について様々な問題点を感じていたため、それにたいしょするためにSATySFiでの文字列の取り扱いを大幅に変更する提案をこの記事で行いたいと思います。

提案内容は後方互換性を破壊するものであるため、v0.1.0に取り込まれることを想定しています。

すでにSATySFiにchar型を導入しようとするプルリクエスト(#290)を作成していましたが、このプルリクエストへのコメントなどを踏まえたうえで今回この記事を書きました。

現在感じている問題点

以下のような問題点を感じています。

  • 特殊文字を記述するための構文が機能不十分
    • 改行文字などを\n\rで書けるようにしたい
    • よくある"\u{1234}"のようなUnicodeスカラー値で文字を指定できる書き方がしたいときがある
    • 現状ではstring-unexplodeプリミティブで生成して結合させるしかない
  • 文字列を記述する構文やプリミティブにおける改行・空白除去のルールが統一されていない
    • 挙動の一貫性がないことが#233において指摘されている
    • split-into-linesの仕様もあいまって、code.satyhでは「先頭行を捨てる」というアドホックな実装になっている(実装箇所
  • 「文字」という概念が無い(「文字列」はあるのに)
  • 書記素クラスタが無い
    • 結合絵文字などの結合する文字列に対処不可能
    • 行分割できない箇所で文字列の分割を行ってしまったりする可能性がある
  • 各文字のメタデータを取得できない

提案内容

以上の課題を解決するために、以下の修正を行うことを提案します。

対応文字コードの規定と正規化

複雑なコーナーケースをなくすために以下のことを定めます。

  • SATySFiが対応する符号化方式はUTF-8のみとする
    • 他の符号化方式での入力は未定義動作とする
  • SATySFiで取り扱う文字列は事前に正規化を行っておく

char型の導入

「文字列」が存在するのに「文字」が存在しないという問題に対応するために、「一文字」を意味するchar型を導入します。この型は"Unicode characters"に対応させます。

この型のデータに対してはUnicodeで定められているUnicodeスカラー値やその他情報を取得できるようなプリミティブを実装します(必要に応じてその情報に対応する型を新規に作成する必要などがあるかもしれない)。

具体的にはchar-to-unicode-scalar : char -> intchar-to-xxx : char -> xxxのようにプリミティブを作成します。 uucpライブラリを使用することで比較的簡単に実装が可能と思われます。

string型の定義の変更

string型をchar listの糖衣型とします。これにより文字列周りのプリミティブの整理も行えるようになります。

文書記述において文字列という概念の重要度は高いため、廃止はしません。

書記素クラスタの概念の導入

行分割可能位置や結合文字への対応を行うために導入します。

具体的な実装として

  • グループごとに分割するstring -> string listという型のプリミティブを導入する

という方法にすることを考えていますが、これについてはより詳細な検討が必要です。

uusegライブラリを使うことで容易な実装が可能と思われます。

構文の変更

char型やエスケープ記法の導入のために構文を変更する必要があります。

char型の構文は主要なプログラミング言語に倣い'a'のようなシングルクォートで囲む記法とします。型変数の記法とやや被りますが、これはOCamlでも同じであり、使う場面が被らないことやシングルクォートが終端に来るかどうかで容易に見分けが可能であるため、問題が無いと考えます。

前述のchar型を導入しようとするプルリクエストに対してcharリテラルを導入しないべき」というコメントがありましたが

  • パターンマッチでchar型を使うためにはパターンマッチでマクロを使えるようにすための変更が必要であり、それが解決策として適切なのかはかなり疑問である(ユーザー定義リテラルによる解決も同様)
  • char型を扱うのはプログラム層であり、カジュアルなユーザーが記述するマークアップ層ではstring型しか露出しないため問題がない(もちろん引数にchar型を要求するコマンドは定義できるが、それはパッケージ作成者の設計思想の話である)
  • すでにposition情報付きstring記法の導入などリテラルの拡張は行われており、過度に「仕様はコンパクトであるべき」という思想に固執する必要はない
  • 文字列処理・組版の文脈において頻出する「一文字」という情報を記述するために難解なマクロ機能への理解が必要であるのは、カジュアルなパッケージ作成への障害となる

などの理由から、新しく記法を導入するべきであると考えています。

シングルクォート単体を表記したり、改行文字などの頻繁に使う特殊文字Unicodeスカラー値を指定して書いたりするときのためにエスケープ記法も使えるようにします。

などを想定しています。

string型にも専用の構文を与えます。文書記述において文字列という概念の重要度が高いためです。

文字列記法の構文には

  • エスケープ記法が使えるようになってほしい
  • エスケープ記法が不要なモードも欲しい
  • マークダウンでのコード記法と似ている必要がある
  • inline-text中で書くことができるようにする
  • 簡単なルールになってほしい
  • コードを書く時のようにインデントの除去をしたい場合がある

といった要請があります。そこで、文字列の記法に「モード」の情報を入れられるように構文を変更し、これらに対応したいと思います。

#<mode>`<string>`

という記法にすることで、そのモードによってエスケープ記法や空白の除去などの処理を変更できるようにします。

モードは

  • インラインコードモード(デフォルト)(i)
  • ブロックコードモード(b)
  • エスケープモード(e)

の3つを用意します。

インラインコードモード

インラインコードモードはデフォルトで、モードを指定せずに

`string`

と書くと

#i`string`

と書いたことになります。

インラインコードモードでは既存の記法のように、

  • 前後の改行・空白の除去
  • エスケープ無しの記述が可能

となっています。しかし、バッククォートを含ませることはできず、バッククォートが出現した場合はそこで文字列が終了したと認識されます。バッククォートを含ませたい場合は後述のエスケープモードを使用する必要があります。

ブロックコードモード

これはブロックコードを書くときに使うと便利な記法です。

  • バッククォート直前・直後の改行の除去
  • インデントの除去

を自動で行います。例えば

#b`
  hoge1
    \\ fuga
  hoge2
`

と書くと

hoge1
  \\ fuga
hoge2

と評価されます(バッククォート直前・直後の空白行の扱いについては要検討)。これもインラインコードモードと同じく、エスケープ無しの記述(ただし、バッククォートは含ませられない)とします。

エスケープモード

エスケープ記法を使えるようになります。また、バッククォート直後の空白文字が除去されないなどの、一般的なプログラミング言語での文字列記法と同じようになります。エスケープ記法はchar型で使えるものと共通にします。

例えば

#e` 改行\nしたりバッククォート"\`"を入れたり
Unicodeスカラー値で指\u5B9Aしたりできる`

と書くと

 改行
したりバッククォート"`"を入れたり
Unicodeスカラー値で指定したりできる`

と評価されます。

プリミティブの整理

char型の導入に伴って、これに関係するプリミティブを導入する必要があります。 また、string型をchar listとして扱うことができるようになることでプリミティブをライブラリ定義関数とすることができるようになります。

追加する必要があるもの

  • unicode-scalar-to-char : int -> charUnicodeスカラー値から文字を生成する
  • char-to-unicode-scalar : char -> intUnicodeスカラー値を取得する
  • 文字に関する情報を取得するプリミティブ
  • 書記素クラスタ分割用プリミティブ

削除できるもの

  • string-unexplode : int list -> string
  • string-explode : string -> int list
  • string-same : sting -> string -> bool
  • string-sub : string -> int -> int -> string
  • string-length : string -> int
  • split-into-lines : string -> (int * string) list

おわりに

以上が文字列周りを整理して使いやすくするために必要そうな修正の提案でした。

string型の記法の具体的な構文や書記素クラスタの扱いについてはまだ検討が必要な箇所もありますが、大まかな方針としては良いものになっていると思います。

ご意見お待ちしています。

SATySFi Conf 2022まとめ

はじめに

この記事はSATySFi Advent Calender 2022の8日目の記事です

全日はgfnさんによる「SATySFi v0.1.z のライブラリルートでのファイル配置の設計案」でした。

今年もSATySFi Conf 2022の発表まとめをして振り返っていきたいと思います。

発表の録画の音量が小さかったりノイズが入っているかもしれません。気を付けてください。

発表者は敬称略です。

puripuri2100:「ユーザーがカスタマイズできるクラスファイル―v0.0.xとv0.1.xそれぞれでの実装―」

設定用関数とパイプライン演算子を使ってデザインを自由にカスタマイズできるクラスファイル実装について、現行のv0.0.xでの場合とリリースが予定されているv0.1.0での場合についてそれぞれ紹介しました。

gfngfn:「SATySFi v0.1.0開発進展の現状報告」

リリースが予定されているv0.1.0の実装進捗や実装予定の機能についての紹介

コマンド定義用の具象構文がval inlineなどに変わるなど、具象構文の細かい変更があったり、オプション引数がレコード形式のようにラベルを付けて順不同に与えられるようになったり、ファンクタというモジュールを返せるような機能が使えるモジュールシステムが入るなど、様々な変更がある。

この記事執筆時ですでにパッケージシステムについてこの講演から実装の進みがあり、

のような記事になっています。

SnO2WMan:「SATySFi with Nix」

Nixという「生成物をハッシュ値で管理する」というかなり特徴的なパッケージ管理システムでSATySFiとその周辺ツールをインストールする際に頑張ったことについて解説しています。

usagrada:「SATySFiのフォーマッタの紹介」

SATySFiのコードを整形するコードフォーマッタであるsatysfi-formatterの実装の話です。

マークアップ言語の面もあるSATySFiならではの苦労などがあるようです。

pickoba:「SATySFiで卒論を書いた話」

SATySFiを使って卒論を書いた経験についての話と、それの副産物として制作された様々な外部ツールやパッケージについての話です。

おわりに

今年は筆者自身が忙しく、なかなかSATySFiについて関われなかったのですが、SATySFi Confをなんとか開催できて良かったです。

来年も開催したいものです(運営を手伝ってくれる方募集中です!)。

簡単!再帰関数を実装する方法

これはWORDIAN Advent Calendar 2022の1日目の記事です。

2日目はまだ決まっていません。

はじめに

再帰関数と聞くと、その実装に対して「難しい」と思う方が居られるかもしれません。

しかし、再帰関数は慣れてしまえばループ処理よりも簡潔に扱うことができたり、関数の挙動の定義を自然にコードにすることができたりと、とても便利なものです。

今回は、その再帰関数を定義するための考え方を言語化してみました。

サンプルコードはOCamlとRustで実装しています。 Rustのコードはplaygroundへのリンクも置いておくので、好きに弄って挙動を確かめてみてください。

考え方

まずは実装する関数の挙動について、以下の項目のことを考えます。

  • 関数の引数
  • ワンステップ実行後の引数となる値
  • 関数の終了条件
  • 最終的にその関数が返す値・構造
  • 計算後の値
  • 上記の値・構造に対して関数が行う演算
  • 上記の演算の単位元単位元(Wikipedia日本語記事)

例えば「整数のリストの中身を全て足し合わせる関数」では、それぞれ

  • 整数のリスト
  • そのリストのtail
  • リストの中身が空リストになったとき
  • 整数
  • 引数のリストのhead
  • 足し算
  • 0

に相当し、階乗の計算では

  • 自然数
  • 引数より1小さい値
  • 引数の数が1になったとき
  • 整数
  • 引数の値
  • 乗算
  • 1

に相当します。

そしてこれらの項目を使った汎用性のあるコードを書くと、

let rec f <引数> =
  if <関数の終了条件> then
    <単位元>
  else
    <演算> <計算後の値> (f <ワンステップ実行後の引数となる値>)

になります。

実際の実装

では、リストの中身を足すsum関数と階乗の計算をするfactorial関数をそれぞれ書いてみます。

sum関数

OCaml:

let rec sum lst =
  match lst with
  | [] -> 0
  | x::xs -> 1 + (sum xs)

Rust(play ground):

fn sum(lst : &mut Vec<usize>) -> usize {
  let i_opt = lst.pop();
  match i_opt {
    Some(i) => i + sum(lst),
    None => 0
  }
}

factorial関数

OCaml:

let rec factorial n =
  if n == 0 then
    1
  else
    n * (factorial (n - 1))

Rust(play ground):

fn factorial(n : isize) -> isize {
  if n == 0 {
    1
  } else {
    n * (factorial(n - 1))
  }
}

おわりに

いかがだったでしょうか。

関数の挙動を正確に定義すれば、パターンに従って再帰関数は綺麗に書くことができます。

これは返り値がリストになっても木構造になっても同じように終了条件・演算・その単位元を考えれば定義することができます。

もちろん、ループ処理の方が綺麗に書けることもありますが、再帰関数をたまには思い出してあげてください。

SATySFiを大学のレポート課題で使っています

はじめに

今年も始まりましたSATySFi Advent Calendar 2022

今日は1日目の記事です。

今年もSATySFi関係の記事を充実させていきましょう。

そろそろSATySFi v0.1.0のリリースがあるということで、これからも楽しみですね(去年もこれ書いたような気がするけど来年こそは……)。

依存関係解決の話をしようと思ったのですが、ちょっと執筆時間が無いのと「これはOCamlの話では…?」となってやめました。

今年は一年を通してSATySFiでレポートを書き続けていた年でした。そのことについて少し書いてみようと思います。

大学のレポートの要件

自分は筑波大学情報学群情報科学類に所属しており、レポート課題が課される講義は情報数学・確率論・線形代数微分積分などの数学分野です。 これらの講義では指定された演習課題を毎週とき、その解答を書いてPDFファイルで提出、という形でした。SATySFiは数式の組版も綺麗に行うことができてこういう時に数式組版機能のありがたさを実感しますね。

それ以外の講義では穴埋め式のdocxレポートテンプレートが配られるか、授業支援サービスのフォームに書くかしか無く、SATySFiを使う余地が無かったです。残念。

GitHubを使ったレポート管理

複数の環境で作業をすることもあり、レポート類はGitHubのプライベートリポジトリで管理をしています。 適切なリポジトリ名を付けることができなくて困っており、今はtsukuba-[履修した年次]-[授業名のローマ字表記]みたいな感じで管理しています。誰か良い方法を教えてください。

GitHubのプライベートリポジトリでレポートを管理している様子

さて、GitHubでは最近templateという便利機能が使えるようになっており、これは「元リポジトリへの還元を前提としていないfork」みたいな感じです。

改造を前提としたSATySFiのクラスファイルをこのtemplate機能が使えるリポジトリ(puripuri2100/satysfi-class-template)として公開しているため、これを授業ごとにGitHub上で複製してその後必要な改造を施して使っています。

よく使う数学系のコマンドをクラスファイル内に定義してしまえたり、「課題を解き、解答解説を見て答え合わせをし、その両方を書け」のような指定があるときには+kotaeawase : [block-text; block-text]のようなコマンドを定義して使えたりして便利です。

よく使っていたパッケージやコマンドなど

monaqaさんによるazmathパッケージにはとてもお世話になりました。

azmathパッケージのなかでも+alignコマンドや\pmatrixコマンドをよく使いました。 このコマンドで使う、math list形式での引数の書き方が便利でとても良かったです。 「幅が定まっていればmath list listである必要はない」というのはかなりコロンブスの卵でしたね。

実際のレポート

こういう感じでレポートを書いていました。

問題番号を+sectionコマンドに対応させることで入れ子になるような小問などの構造を表すことができて良かったです。

実際のレポート

おわりに

軽めの記事になりましたが、実際にSATySFiを使っているとどういう雰囲気なのか、というのを少しは伝えられたでしょうか(伝えられていたら嬉しい)。

syntax errorやtype errorによって自分のtypoに気が付けるというのは凄く良い体験なんだな~と思いながらレポートを書いています。 来年はもっとレポート課題が増えるでしょうから頑張っていきたいと思います。

SATySFiの最強のビルドツールを作りたい

はじめに

バージョンが異なるパッケージを共存して使うための、SATySFiのビルドツールの設計方法のアイデアです。

2022/10/24加筆:改めて考えを整理したのと、v0.1.z でのパッケージシステムの処理に関する設計という記事が公開され、新しいパッケージシステムの実装が進んでいることを受け、記事内容を色々と追記変更しました。

課題に感じていること

現状のSATySFiでは複数のパッケージが一つのパッケージの別のバージョンに対してそれぞれ依存していた場合、それらを解決する方法が存在しない。

(2022/10/24追記)

これは「一つの文書で」という話だけではなく、opamを通じてインストールしている環境全体の話でもある。

具体的な例としては、enumitemが2.0.0と3.0.0で非互換であり、3.0.0に依存しているパッケージと2.0.0に依存しているパッケージを同時に使うことができなくなっている。 これの影響により、satyrographos-repoで提供されているsatysfi v0.0.6に対応したパッケージのスナップショットがsnapshot-stable-0-0-6snapshot-stable-0-0-6--1の2つ別れてしまっている。

これは現在は解消されているものの、今後似たような事例が発生することは十分にあり得る。

イデアのコア

(2022/10/24追記・修正)

「文書ごとに依存解決を行う」という方法で上記の課題を解決する。

具体的には、

  • 文書のトップライブラリにユーザーが作成した文書の設定ファイルを元に依存解決を行う
  • 文書ごとに環境を作成し、その環境をもとにコンパイルを行う

という方法である。設定ファイルを作成する点は「v0.1.z でのパッケージシステムの処理に関する設計」でも想定されている手法であるが、「文書ごとに環境を作成する」という点が少し違う点である。

これにより、

  • SATySFi自体のバージョンを文書ごとに使い分けることができる
  • lockファイルを生成し、環境ごと保存することで、文書のビルド再現性を保証する事ができる

という効果を得ることができ、SATySFi本体に次々と新しい機能を入れたり、パッケージが新しく追加された機能を使った実装をしたりすることがこれ以上に可能となるという嬉しいことがある。

ユーザーが作成する設定ファイルは「SATySFi v0.1.0開発進展の現状報告」や「v0.1.z でのパッケージシステムの処理に関する設計」で触れられている設定ファイルと同じものになることを想定している。

同一文書内でのバージョンの矛盾の解消方法について

「文書ごとに環境を用意する」というアイデアは、一つの文書が依存するパッケージにバージョン衝突が発生してしまった場合にはそれだけでは解消することができない。

これを解決するために、ダーティーハックではあるものの、

  • 文書ごとに用意される環境内で、バージョンが違う同じパッケージが違う名前で保存されるようにする
  • 依存しているパッケージに書かれた呼び出し文を書き換える

という方法を考えている。

この方法は、SATySFi v0.0.xでは束縛列の上書きが発生してしまい、文書結果を想定ではないものに変えてしまう可能性が指摘されている。

しかし、SATySFi v0.1.xではそれが起きない設計になるため(v0.1.z でのパッケージシステムの処理に関する設計#全体処理)、問題ないと考える。

使用するSATySFiのバージョン情報を設定ファイルから得られるため、satysfi v0.1.x以上であれば複数バージョンの共存を有効化しsatysfi v0.0.xであれば無効化するなどの機能を実装することは容易である。

もちろんSATySFiの仕組みで上手く吸収出来れば(パッケージでの外部ライブラリ呼び出し時点でバージョン情報を指定する、など)それに越したことは無いため、自分の中での実装優先度は低いと考えている。

発展

生成したバージョン依存関係をlockファイルに書き出すことで、文書の生成再現性を保証することができるようになる。

また、グローバルな環境を汚染しないため、「ローカルフォルダ内の自作パッケージの使用」や「リリースされていない、開発中のパッケージのgitリポジトリの特定commit版の使用」といったことも可能になる(設定ファイルの書き方に工夫はいるかもしれないが)。

課題としては、キャッシュ戦略である。特に、文書に使われている画像などは変更が無い限りコピーしたくないため、その判定をどうするかを考える必要がある。

おわりに

実際に実装をしてみて、上手くいきそうであればsatyrographosにプルリクエストを送ってみたいと考えている。

大学入学してすぐに入院手術を2回もしたけどなんとか大学生やれた話

はじめに

こんにちは 今年の4月に筑波大学に入学したpuripuri2100です。

入学して5ヶ月が経ち、春学期が無事に終了して夏休みを満喫しています。

さて、春学期中に自分の身にふりかかった一番大きな出来事は気胸でした。

気胸とは、肺に穴があき、そこから空気が漏れだしてしまう病気です。 突発的になるので対策ができないほか、空気漏れの量が大きい場合には肋骨の間から管を入れて漏れ出ている空気を体外に強制的に排出させなければならず、そうなると管理が必要なため確定で入院です。 また、自然に穴がふさがればそのまま退院となりますが、ふさがらなかった場合は内視鏡を用いて肺の穴をふさぐ手術が行われます。

自分はこの気胸という病気を5月末と6月末に2回も発症し、そのどちらもが入院と手術を要するものでした。

ですが、なんと単位をそれなりに取ることができ、一応「大学生」と言われる身分を保つことができました。

今回は、緊急入院になってしまったときに上手く学業を回すためのテクニックを紹介しつつ、自身の春学期を振り返ってみたいと思います。

ちなみに、ここから先の時刻表記は全て24時間制です。

1回目の気胸

病院に運ばれるまで

2022年の5/17に発症しました。

その日は4時までsksat氏らとVRChatで遊んでいました。

VRChatのスクショ
VRChatのスクショ
VRChatのスクショ

VRChatを終えて布団に入り、起きたのが11時でしたが、どうもそのときには既に穴があいていたようです。

  • 息をするたびに痛みが走る
  • のどの奥の方に痛みがある
  • 呼吸が上手くできず、息を吸うと途中で止まる

という感じの症状がすでにでていました。最初は身体が凝りすぎてるだけじゃないかと思ってお風呂に入ってストレッチをするなどしていましたが、全然痛みは収まりませんでした。そりゃそうですね。

つい一週間くらい前にしみちゃん先輩から気胸という病気になった話を聞いていたため、頭の片隅に「これはもしや気胸というやつでは…?」という懸念は発生していました。

FFの医師の方から受診をお勧めされたので保健管理センターに行こうと思ったものの、午前で診療が終了していたため、諦めました。辛いですね。

さて、肺に穴が既にあいている状況で昼頃に何をしていたかというと、大学でスイカを破壊したり食べたりしていました。青春ですね。

肺に穴が開いた状況でスイカを破壊していたのですが、帰宅しても痛みは収まらず、17時頃には救急車を検討し始めます。記憶ではtactillium先輩やMoneto先輩から救急車を勧められたのがきっかけだったはずです。その節はありがとうございました。

救急車を呼ぶのは人生初で、最初はかなり迷いました。 迷いを晴らすためにも、専門家からアドバイスを貰える#7119に電話をしました。 そこで上記の症状を伝えたところ、救急車を呼ぶべきと言われたため、満を持して119することにしました。

結局通報は17時40分くらいになり、筑波大学附属病院に搬送となりました。

筑波に住む筑波大学生は搬送先の候補として筑波大学付属病院が上位に来るようになっているようなので、救急隊に筑波大学生であることを伝えられると良いでしょう。

救急隊に渡すものは以下のものです。事前に用意してすぐに渡せるようにしておくと良いです。

  • 身分証(学生証や免許証)
  • おくすり手帳
  • 健康保険証
  • 病院の受診カード(ある場合は)

また、自分は入院になることを覚悟していたため、通報の前に

  • 腐りそうなもののゴミ出し
  • 布団などをあげておく
  • 電子機器のシャットダウン
  • 入院に必要そうな着替え・電子機器・暇つぶし用の本

などの準備をしていました。

また、新型コロナウイルス関係で救急隊から色々と聞かれるため、事前に体温測定をしたり、最近の移動や感染者との接触状況などを思い出したりしておきましょう。

入院!

搬送後ベッドに寝かされたまま胸部のレントゲンを撮られたり、胸部CTを撮られたりなどされ、1時間以上経ったあたりで呼吸器外来の先生方が救急救命センターに来て「自然気胸である」と説明されました。

そのまま入院となるかと思っていたのですが、先生方は「帰って自宅で安静」という選択肢も用意していました。ですが、自分が一人暮らしであることや症状がそれなりにきついことから入院を選択しました。治療方針の説明や入院への同意書へのサインなど、法律改正で自分が4月に成人していたことの意味を強く実感するイベントでした。

入院の前に、救急救命センターのベッドで胸にたまった空気を胸に挿入したドレーンと呼ばれる管を通して排出するための処置が行われました。 局部麻酔を注射でかけて胸に穴をあけて管を突っ込まれます。麻酔がきちんと効いていたことと、呼吸器外来の先生方が上手だったこともあって痛みはほとんどありませんでした。痛みがあっても、その旨を伝えればしっかりと追加で麻酔をいれてくれました。

そのような処置などがあり、結局病室に移動して落ち着いたのは20時45分頃とかなり遅い時間になっていました。

ちなみにこのときに同じ筑波大の情報科学類にAC入試で合格した友人が気胸をやっていたことを知り、なんかホッとしたのを覚えています。

管が胸にささっているので寝返りも打てず、初めての入院ということで緊張と興奮で全然眠れなかったです。

当たり前の感想を翌朝にツイートしてますね。

呼吸器外科がメインで使っている病棟に空きが無かったため、リハビリ患者用の病棟に入ることになり、病院食の返却などを自分でやらないといけなかったりと大変でした。

朝起きてすぐにやったのは受講している講義の担当の先生へのメールでした。

このときは気胸を舐めていたため、「直近でヤバそうな課題やテストがあったり、対面や同時双方向の授業がある講義」の先生にのみメールを送っていました。

スマホでメアドを検索するのとてつもなくめんどくさかったです。

メールを発射し終えるとやることが無くなるので、パソコンをカタカタしたりういろうを食べたりしていました。虎屋のういろうは本当にお勧めです。

https://www.torayauiro.com/index.html

講義はオンデマンド授業がほとんどだったので、授業動画を病室で見るなどもして、大学生やってました。

ここらへんで親が駆けつけてきてくれて、家の中からポケットWi-Fiを持ってきてもらったりういろうを回収してもらったり本や着替えを追加で届けてもらったりしました。本当に感謝ですね。

手術

普通は空気を強制的に排出して肺への圧力を緩めていれば自然と穴が塞がるらしいのですが、自分の場合は全く塞がる気配も空気漏れの量が減る気配もなかったらしく、19日の朝の医師の先生方から回診の際に「手術をした方が良いかもしれないけどどうする?」と告げられました。

そしてお昼ごろに「明日手術できるんだけどどうする?」となり、痛みから早く解放されたかった自分は手術を選択しました。

手術前の説明や同意書へのサインなどは別室でやるのですが、そこには陰圧をかける設備が無いので肺にたまった空気を抜くことができず、説明の途中で息苦しさで倒れそうになって病室に移動せざるを得なくなるなどのハプニングもありました。

親は東京に居てすぐにこれなかったため、LINEのビデオ通話で術前の説明に参加してもらいました。自分が成人であるため何も問題ないわけですね。

ちなみに手術前は絶食が必須なので、それまでにカロリーを貯蓄していました。

手術前にはなぜかRustのアップデートを病室でしています。これでポケットWi-Fiの制限に大幅に近づいてしまい、後悔することになります。馬鹿ですね。

手術は昼頃にスタートし、全身麻酔が完全に切れたのが18時頃でした。

手術が終わって最初の覚醒のときに親に頼んで宇多田ヒカルの8thアルバムであるBADモードを流してもらった記憶があります。それを聞きながら再度眠りに落ちてました。

全身麻酔後の辛かったポイントは

  • 誤嚥防止で翌朝医師が回診に来るまで水含めた一切のものが飲めない
  • 尿を尿道カテーテルで排出するが、それがどこかで折れてしまったのか排出が行われなくなり、膀胱に尿が溜まるばかり

の2つでした。後者については運がわるいだけだったのですが、前者は絶対に襲ってくるイベントな上にストレスも凄い勢いでたまるので辛いです。

ちなみに尿道カテーテルを抜かれたときの感覚はマジで面白いので全人類体験するべきです。

退院

手術が終わったあとはういろうを食べたり散歩したり読書したりしていました

術後すぐは「息苦しさはほとんど変わってないけど本当に穴が塞がったのかな」と凄い不安でした。が、時間がたったり散歩をしたりするごとに呼吸が徐々に戻っていっていて、不安も解消されていきました。

23日には胸にささっていた管が抜け、シャワーを浴びられるようになったので、一週間ぶりにシャワーを浴びていました。 一週間シャワーを浴びないとおでこの垢が目に入って凄い辛いんですよね。

手術のときに身体を縫合するのに使われた糸を抜くなど、退院に着実に近づいています。

24日に退院だったのですが、深夜に中途覚醒して徘徊してました

また、24日の1限に知識情報概論という講義の期末テストがオンラインであり、朝食後から回診までの隙間時間で受験していました。 入院のせいで全く復習ができていなかったため、60点という落単を覚悟する非常に厳しい点数を取ってしまい、真っ青になっていました。周りからは「100点いけた」「一問まちがえて95点だった悔しい」「めちゃくちゃやらかした~ 70点だ」などという声しか聞こえておらず、絶望しかなかったです(結論から言うと60というギリギリの評価で単位を取得できました)。

落単の可能性に震えながらも退院の手続きをし、退院できました。 家に着いたのは昼前と結構早かったです。

退院後

退院祝いをしたり、

旅行したり、大学の宿舎祭に行ったりしてました。

楽しかったです。

2回目の気胸

1回目があるということは2回目があるということです。

気胸はもともと再発率が高く、自然治癒だと50%、手術をすると10%と言われています。

なので退院時に担当医の方から「30歳までにまた再発すると思うよ~」と言われており、自分も「大学在学中に再発してもらえるとここに来れて楽なんですけどねw」と返した記憶があります。

ですが、さすがに1か月後に再発するのはさすがに想定してなかったです。

病院に運ばれるまで

6月23日の深夜・早朝に徘徊していたりしていました。

そのまま体育に行こうとシャワーを浴びたあとに部屋に戻ったときに右胸に覚えのある痛みが走りました。8時20分頃のことです。

この瞬間に気胸の再発を確信しています。

今回は前回のこともあったため、ゴミ出しや入院の準備を前回より完璧に行ってすぐに救急搬送されました。

体育の授業が8時40分からあったので一瞬躊躇したのですが、さすがに身体の方が大事です。

さて、搬送されてそのまま入院になるかとおもったら「確かに気胸の再発だが、まだ空気漏れが少ないのでとりあえず様子を見よう」と言われて一旦返されて翌日の朝に受診することになりました。

前回の気胸の時に手術を執刀してくださった担当の先生が救急救命センターに来て僕を見るなりしゃがみこんで「戻ってきちゃったか~」と嘆いてしまったのが記憶に強く残ってます。申し訳ねぇ…。

病院から戻ってまずメールを書きまくりました。 前回無理して病院で受講や受験をした結果、落単ギリギリまで行ってしまったため、今回は全ての教科で一旦休むつもりでした。

ちょうど期末試験期間の一週間前で、期末レポートや対面の期末テストなどが多くあり、ここで「助けてくれ」を出しまくったことが後々の自分を救うことになりました。

ちなみに、こういうのはクラス担任などに一発送って関係各所に一斉にメールを送ってもらうというテクニックも会ったらしいです。

体力に余裕がない場合はそうするべきでしょう。

自宅で待機中の14時頃にsksatさんが牛丼の差し入れを持ってきてくれました。 本当に助かりました……。

徐々に拡大していた空気漏れがここら辺のタイミングでかなり身体に影響を出しはじめ、呼吸がかなり苦しくなってきていました。 sksatさんがミーティングのために帰るあたりでその日二度目の救急搬送を覚悟し始めます。

途中までやっていた課題を終わらせて出す・肉を茹でて冷凍する、などの朝に時間が無くてできなかった入院のための準備を行ったのちに、救急要請をしそのまま筑波大学附属病院に搬送されました。

入院

ここからは1回目の気胸の時と同じく、入院承諾書にサインをしたりドレーンを挿入されたりしました。

ドレーンを挿入する処置を施してくださった先生も前回の入院時と同じだったり、先生や事務の人から「前回と同じで~」というセリフをよく言われたりして「再発したんだなぁ」ということを強く感じていました。しんどかったです。

唯一良かった点は、呼吸器外来の担当病棟に空きが無かったため、循環器系の病棟の個室に運ばれたことです。

4人部屋と同じ料金で過ごせる個室、最高です。間違いない。

結局今回も20時半ごろの入院となりました。

積読を消化したり、音楽を聞いたり、334をしたり、呻いたり、泣いたりしていました。

このころはとにかくメンタルがきつかったです。腰の痛みも酷かったですが。

ここらへんで搬送直前に送っていたメールに返信が返ってきていました。

多くの教科では

  • 課題は提出期限は伸ばす
  • リアルタイム双方向型授業も欠席で大丈夫
  • 期末試験も代替措置を用意する

という措置を取っていただけました。

ですが、一部の講義では

  • そもそもとして返信が来ない(結局春学期が終わっても返ってきていない)
  • 期限は数日だけ伸ばしてあげるが、それまでに出せなかったら強制落単

という感じで、ここはしんどかったです。

GPA計算外とはいえ、後者の講義は結局落単となってしまいました……。

大学の図書館で借りていた本の貸出延長申請をオンランでしようとしたところ一日遅く、延長できずにペナルティを課せられることになっていました。辛いですね。

25日には胸に挿入されたドレーンから薬を入れてわざと肺の周りで炎症を起こして肺と周りの組織を癒着させて穴を閉じさせる、という処置をしてもらっていました。

薬を注入されてから10分ごとに身体を90度ずつ回転させて肺の周りにまんべんなく行き渡らせる、ということをやっていました。

炎症が起きるので滅茶苦茶しんどく、体力も削られていきました。また、炎症の結果、液が大量に排出されており、それもそれできつかったです。

26日には前回の入院では無かった洗髪イベントがありました。 髪が長いのもあり、こういうのは凄いメンタル的に良かったです。

25日に行った処置でも空気漏れが止まらず、28日に手術をすることになってしまいました。

このときも昼の13時頃から手術開始でした。

このときは尿道カテーテルは全く苦にならなかったのですが、飲水禁止措置がとてつもなく辛かったです。

また、痛み止めの麻酔が追加されており、これのせいで意識が朦朧として非常に苦しかったです。結局まともにTwitterができるような精神状態なったのは飲水禁止が解除された翌日の7時頃でした。

退院

術後もドレーンや痛み止めのための点滴が刺さっているため自由に歩けず、コーディングや読書をしていました。

また、手術の前後で締め切りの延長をしてもらえなかったレポートを病室で書いたりしていました。当然質はボロボロで落単に至ってしまったりしています。 なんとかならなかったのかなこれ……。

手術の2日後の30日に「炎症のせいで排液がたまっており、抜かないといけない」ということで胸にもう一本ドレーンが刺さることになりました。

このときの「退院が遠のいた」という感覚は忘れられません。

7/1には洗髪をしてもらえたり、

7/2にはさっそく管が一本抜けたりと意外と順調でした。

4日にはとうとう管も抜け、抗生物質の点滴も必要な時以外は外してもらえたため、ようやく自由に歩けるようになりました。

寝返りを2週間ぶりにしたり、お菓子を買ったり、屋上を歩いたりしていました。

ただ、炎症が治まっていなかったため退院はできず、数日間ずっと散歩と食事と睡眠をするだけの日々でした。

退院を楽しみにしていたところにこれで辛かったほか、退院への焦りなどもありました。

さて、結局退院は8日になりました。

9時半には料金計算や薬の説明など、必要な手続きが終わり、10時頃に退院しました。

凄い嬉しかったです。2週間ぶりの外……。

退院後

退院後はういろうを買ったり選挙に行ったりケーキを食べたり大洗に行ったりしていました。

ですが、7/15に病院に経過観察に行ったところ、空気漏れが発生していることが確認されました。気胸の再々発です。

呼吸が急に苦しくなって病院に行ったりしていました。

途中一回塞がったのですが、また8/12に検査に行ったところ、またあいたらしく

たまに救急搬送されています。

入院中に溜まっていた課題はゆっくりと片づけていき、結局すべての課題が終わったのは8/21でした。

受けられなかった期末試験は追試や代替レポートなどでなんとかなりました。

得た知見

ここからはこの春学期で得た知見を共有したいと思います。

筑波大学附属病院に入院するなら

入院するときにあって便利だったもの・必須だったものは以下の通りです。

  • 大量の割りばし(筑波大学附属病院では病院食に箸やスプーンはついてきません)
  • タオル(ベッド端で乾かせるので一セットで充分)
  • 少しの着替え(入院着を借りられるので退院時用ので充分)
  • それなりに多くの靴下と下着
  • 財布(意外と買い物が必要)
  • 暇つぶし道具
  • お菓子
  • 延長コード・充電ケーブル
  • クリアファイル(結構書類を渡されます)
  • 手提げ袋
  • 洗顔セット

割りばし必須なのは初めての入院時に戸惑いました。意外と着替えは上に羽織るものはいらず、肌着系が必要でした。一応コインランドリーはあるらしいです。

ちなみにですが、筑波大学附属病院の病院食は美味しいので期待していいです。

筑波大学附属病院の病院食
筑波大学附属病院の病院食

また、筑波大学附属病院は屋上のデッキを散歩することができ、良い運動になります。また、このフロアの売店のパンが美味しかったです。

筑波大学附属病院の屋上から見える景色
筑波大学附属病院の屋上

筑波大生が入院に際してするべき連絡

入院時、まずはクラス担任に連絡を入れましょう。

そして自分が受講している講義の先生の名前を伝えるなどをして入院にともなく欠席連絡や課題の猶予の措置を頼む連絡をしてもらいましょう。

自分でできる体力的余裕があるなら自分でやるのもよいですが、数時間はかかるので無理はしない方が良いです。

退院後はすぐに課題ができるわけではなく、溜まっている各講義の課題が一斉に押し寄せてくるため大変です。そのため、この分も含めて配慮をしてもらうよう連絡をした方が良いです。

この点に関してはクラス担任の先生に協力してもらうととてもスムーズです。

学生がメールを送っても返信が無いのにクラス担任の先生が追加でメールを送るとすぐに返信が来る、といった事象は実際にありましたし、先生は内線電話という強い武器も持っています。

成績関係

結構なんとかなります。 適切な配慮をしてくださった先生方に感謝です。

欠席手続きのために診断書などの証拠が必要な場合もあるので、病院で発行しておくと憂いが無いです。3300円でした。

おわりに

気胸はまだ治っていませんが、これ以上悪化する可能性は低いらしく、日常生活は送れています。

成績も結局春学期全体で18.5単位を修得し、GPAも3.06とまともな数字が出て安心しています。

皆さんも身体にはお気をつけて~

フォトギャラリー

ここからは気胸関連の写真を載せます。

見たくない人はここで読むのをやめていただいて大丈夫です。

自分のCT画像です。黒い部分が空気で、画像左側の肺がしぼんでいることがわかります。また、空気漏れが発生しているブラも見えます。

気胸の胸部CT画像

これは管を通して出てきた胸腔にたまっていた排水です。

胸腔から出てたまっている排水

これはドレーンです。この透明な管が細くなっていき、最終的には胸の中に入っていきます。

ここから空気や排水を抜いたり、逆に薬を胸腔内に入れたりします。

胸にささっているドレーン

これはドレーンを通じて空気を抜いているところの写真です。黄色い液に泡が出ていることがわかりますね。これが肺から漏れた空気です。

胸腔からドレーンを通じて空気を抜いているところ

この箱に付いているもう片方の管から空気を抜いて陰圧をかけ、胸腔から空気が出るのを促進しています。 右側の黒いチューブが繋がっている方から空気を抜き、左側の透明なチューブが身体の中に入っています。

空気を抜くための器具

SATySFi Conf 2021まとめ

はじめに

SATySFi Conf 2021の発表まとめをしていなかったので簡単に振り返っていきたいと思います。

発表の録画の音量が小さいかもしれません。気を付けてください。

発表者は敬称略です。

puripuri2100:「mdbook-satysfiを作成しました」

mdbookというRust製のドキュメント作成ツールの外部拡張として、SATySFiのドキュメントファイルを生成するソフトウェアを実装した話です。SATySFiファイルの自動生成をうまくやるテクニックやクラスファイルについてなどを話しました。

monaqa:「SATySFi Language Server の現状と今後」

エディタで言語のサポートをする際にとても便利なLanguage Server Protocol (LSP)という機能を使ってSATySFi用のサポートをするソフトウェアを作成した話です。

  • 診断情報
  • 詳細情報
  • 定義ジャンプ
  • 補完

などの機能がすでに実装されています。

エラー回復機能や型検査などの機能を実装していきたいと考えているようです。

na4zagin3:「Satyrographos 0.0.3 の新機能(予定)」

SATySFi用パッケージマネージャであるsatyrographosに追加する予定の新機能についてです。

文書ファイルの再現性を高めるために、lockファイルなどを生成できるようにしたり、環境情報を取得できるようなライブラリの自動生成機能など、文書作成者用の機能を重点的に追加する予定だそうです。

gfngfn:

SATySFi本体に追加した新規機能:

  • 多段階計算を用いたマクロ機能(エラー報告機能を追加してさらに発展)
  • 多段組

などいろいろある

  • F-ing modulesを入れてモジュールシステムを刷新する
  • フォントのデコーダ・エンコーダを再実装

といった新機能の予定がある。

Yuito Murase:「SATySFi でDSLを作る/使うと便利って話」

コマンドの設定にSATySFiのパイプライン演算子を使用した関数を使っての設定をするとかなりいいよね、という話です。

+cmd ( %設定
  default ()
  |> set-hoge `x`
  |> set-fuga 123
) '<
% 何かしらの内容
>

のような設定方法のことです。

yasuo_ozu:「プログラミング初心者がSATySFi向けパッケージを作ってみた」

LaTeXから移行してくる人用のコマンドを集めたパッケージや学振用のクラスファイルなどの再帰作ったパッケージの紹介や、これから作ってみたいと思っているパッケージ、そしてSATySFiにほしい機能などを紹介しています。

matsud224:「Satyrographos Package Indexの宣伝」

satyrographos-repoに登録されたパッケージの情報を見ることができるサイト、Satyrographos Package Indexの話です。

どのような情報が見られるのかや、実装方法などについて話しています。

Nmatician:「 これからのSATySFiに望むこと」

LaTeXを長い間使っていた人目線のSATySFiについての感想です。

SATySFiのクラスファイルの弄り方のノウハウが知りたいとか、SATySFiで書いた文書をGitHubなどでソースごと公開していけとか、「なるほど確かに」というような内容を話しています。

asya-kawai:「SATySFiのMarkdown機能でCSSを読む込む方法の紹介」

注:機材のトラブルにより、音声なしの発表です

SATySFiのマークダウン入力モードを使用するときにCSS記法でデザインを変えることができたらうれしいよね、という発表です。 がっつりとしたCSSパーサを作ればより発展していくアイデアな気がします。

おわりに

開催から半年も経ってしまい、簡単な振り返りになってしまいましたが、良い刺激を受けられる発表ばかりでしたね。

2022年も開催したいです。