読者です 読者をやめる 読者になる 読者になる

kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

過敏性腸症候群という病気

注意 以下は、お腹壊すとかそういう系統の話になりますので、苦手な方は読むのをご遠慮ください。

皆様、こんにちは。@kmizuです。そういえば、今日はScalaMatsuri 2016の2日目でしたね。私は何をしてたかと言えば、風邪&下痢で寝込んでいました。1日目もそうだったのですが、2日目は下痢で寝るのを妨害されたためかなり消耗しています。仮にもScalaMatsuri座長であるのに(今年は象徴座長みたいな面が強いですが(そもそも象徴にすらなっていたのか?))情けない限りです。

起きてみて、ふと唐突に、自分の持病である過敏性腸症候群について整理しておきたいなという気分になったので、これから書いてみることにします。だいたい個人の体験談であり、人によって症状の軽重は違うので私の症状が過敏性腸症候群を代表していると思わないでください。あとまあ、同情してもらう程の大層な病でもないと思っていますが、kmizuが居酒屋で突然トイレに駆け込んだりしたら、だいたいこれの症状だと思ってもらって間違いありません。

皆様、過敏性腸症候群IBS)という病気を聞いたことがある人はおられるでしょうか。結構メジャーな病気らしいので、恥ずかしいからと隠している人も含めると結構な数の人が知っているのではないかと思います。

基本的にWikipediaの記事でおおむねあってるので引用します。

過敏性腸症候群(かびんせいちょうしょうこうぐん、英語:Irritable Bowel Syndrome、略称:IBS)は、主として大腸の運動および分泌機能の異常で起こる病気の総称。検査を行っても炎症や潰瘍といった器質的疾患が認められないにもかかわらず、下痢や便秘、腹痛、ガス過多による下腹部の張りなどの症状が起こる。以前は大腸の機能の異常によって引き起こされる病気ということで「過敏性大腸症候群」と呼ばれていたが、最近では、大腸だけではなく小腸にも関係することなどからこのように呼ばれている。20 - 40歳代に多く、ストレスの多い先進国に多い病気である[1]。

ポイントは、検査を行っても炎症や潰瘍といった器質的疾患が認められないにもかかわらず下痢や便秘、腹痛、ガス過多による下腹部の張りなどの症状が起こることにあります。器質的疾患があったら個別の病名がついてくるはずですからね。

症状によって、大まかに

  • 不安定型(交代型) 腹痛および腹部の違和感、下痢と便秘が複数日間隔で交互に現れる(交代性便通異常)。
  • 慢性下痢型 少しでもストレスや不安を感じると下痢を引き起こす。神経性下痢などとも呼ばれる。
  • 分泌型 強い腹痛の後、大量の粘液が排泄される。
  • ガス型

大別されるようです。自分の場合は、慢性下痢型(だがたまに便秘になる)でしょうか。

この病気になったのは、つくばに居た博士後期課程1年(2008年)の秋頃です。当初はあまりにも下痢が続く(1カ月以上)ので、腸の病気か何かと思い腸の検査を受けたのですが特に何も見つからず、過敏性腸症候群と診断されました。それから約7年、この病気と付き合い続けています。

自分の型(慢性下痢型)が一番やっかいな点は、ちょっとしたストレスで下痢を引き起こすことです。本当にちょっとしたストレスです。たとえば、今日はちょっと身体がだるいなとか、Twitterやっててちょっと💢っとしたとかそのレベルでマジで下痢が起こります。もちろん、100%下痢になるというわけではないのですが、結構な確率で「当たり」ます。これのせいで、自分のメンタル状態を確認する癖がついてしまいました。

社会人になって最初の職場では、会社に到着するなりトイレに駆け込むというのが常態化していました(満員電車にもまれるのがストレスだったのかもしれません)。今の職場はストレスがかなり少ない方だと思いますが、それでも出社後何度かトイレに行くことが普通になっています。

この病気、それなりに歴史があるだけあって、ある程度治療法がありますが、個人差が大きいらしく、自分にはいずれの治療法も大きな効果が見られませんでした。せいぜいが、できるだけストレス源を避ける、くらいでしょうか。また、見ればわかるように、それほど劇的な症状があるわけではなく、単なる慢性下痢(これを単なると言っていいかは人によると思いますが)なので、病気自慢できるほどでもありません。

今でこそ慣れてそれなりに付き合い方を覚えた感じもありますが、日常生活の様々な場面で下痢が突然起こるというのは結構なストレス(また生活の質の低下)になります。そもそも、ストレスを起因として下痢が起こることが多いので、それによるストレスで悪化するという悪循環です。さらに、下痢が頻発するため、何度もお尻をトイレットペーパーで拭くことになり、これは痔にもつながりやすいです(実際に痔になったことがあります)。

また、今日みたいに、下痢が水様便になるくらいまで悪化することもたまにあり、こういう場合、一日トイレに釘付けになるのでそれによる機会損失も馬鹿になりません。この病気の治療法として、薬物療法の他にライフスタイルの改善も効果があるようなので、ちょっと真剣に改善に取り組もうかと考えている今日この頃です。

ここまで書いてきましたが、何かすぐに改善できるものでもなく、知人になんとなく自分の持病について知ってもらいたくて書いたのでした。なんとかなるといいのですが…。

最後に、ScalaMatsuriスタッフという立場でありながら当日参加できず、結果的に迷惑になってしまった他のScalaMatsuriスタッフの方々、申し訳ありませんでした。ともあれ、Twitterの様子を見る限り、成功裏に終わったようで何よりです。

Scalaのマクロは「実験的」(experimental)な機能です

タイトルがほとんど全てを表していますが、念のため説明します。

Scala 2.10からマクロが言語機能として導入され、Scala 2.11でも維持されています。ただし、あくまで現状のマクロは「実験的」な機能であり、ファイル毎に

import scala.language.experimental.macros

と書くか、コンパイラオプションで

-language:experimental.macros

と指定する必要があります。Scalaのライブラリ設計者には、新しい機能を使ってライブラリをもっと便利にしたいという人が多いことからか、マクロを使ったライブラリが既に多く存在しています。しかし、繰り返しますが、現状のマクロは「実験的」です。

Macros - blackbox vs whitebox - Scala Documentation

今の所は、Scala 2.12 ではマクロやリフレクション関連の変更は予定されていない。全機能が Scala 2.10 と 2.11 同様に実験的機能扱いのままで、機能が削除されることもない。本稿が書かれた背景となった状況は変わったが、書かれた内容はまだ生きているのでこのまま読み進んでほしい。

と書かれているので、Scala 2.12でも現状のマクロがそのまま使える可能性は高いですが、あくまで暫定的な判断であって、仕様が固まったわけではありません。マクロを使う事やマクロを使ったライブラリを使うことには多少のリスクが存在することを理解しておいてください。また、(コンパイル時に完全なプログラムを走らせることができる)マクロには、原理的にIDEによるサポートの恩恵が受けにくくなる(現在最良のScala IDEであるIntelliJ IDEAでさえ)というデメリットがあることも考える必要があります。以上を考慮した上でマクロを使うのは自由ですが、トレードオフが存在する事は意識する必要があります。

構文解析勉強会Vol.2 開催します

Parser PEG プログラミング言語

parser.connpass.com

の続編です。

parser.connpass.com

前回は、話題をPEGに限定していましたが、今回は、いわゆるTop-down構文解析全般を扱います。よく知られているLL(1)から、比較的最近のGLLLL(*)までを取り扱えればと思います(あくまで努力目標です)。

第一回を終えた時点では続編は予定していなかったのですが、構文解析の世界という一見狭い世界にも興味深い点がいくつもあることを理解してもらいたいと思い、こうして第二回を開催することにしました。

このまま、第三回(Bottom-up構文解析ができれば…)、第四回とシリーズ化できれば(ネタが保てば)なあなどと思っています。

というわけで、皆様の参加をお待ちしています!

ちなみに、開催当日はバレンタインデーです。バレンタインデーらしいイベントのある方はうっかり登録なされないよう、ご注意を…

Scala doesn't Need Generics! (or You can Encode Generics Using Abstract Type Members)

タイトルは煽りではありません。もちろん、Scalaを実用的に使う上では「直接」Genericsを扱えないのは困ります。しかし、記述の冗長ささえ我慢すればGenericsのほぼ全ての機能をAbstract Type Membersによって表現できます。このことを指して、GenericsはAbstract Type Membersでエンコードできると言ったりします。とりあえずコード出せやといわれそうなので、実際のコードを貼りつけてみます。

gist.github.com

このコードでは、不変Listと、その上の高階関数mapforeachGenericsなしで構築しています。

ポイント:

  • Genericな型 => Abstract Type Memberを持った型
  • Genericなメソッド => Abstract Type Memberとメソッドを持った型
  • 関数 => Abstract Type Member InOutを持った型Function
  • Consセルの生成はCons型の無名サブクラスのインスタンス生成を経由して行う

でしょうか。見ればわかる通り、記述としてはGenericsを使った場合よりかなり冗長になっていますが、機能としては同じ要件を満たしていることがわかります。

さて、このような回りくどいことをする事にどのような意味があるのでしょうか。実用的にScalaを使う上ではこのような事実を知ることには意味がありません。

重要なのは、Scalaの最小のサブセットを理論的に議論したい場合においてです。このようなものには、Featherweight Scala(FS)やその後継と言ってもよいDependent Object Types(DOT) Calculusものがあります。FSもDOTもScalaにとって本質的な機能だけを抜き出した、理論的に議論しやすいためのサブセットですが、どちらもAbstract Type MembersはあるがGenericsはないという特徴があります。これは、Abstract Type Membersを使って、Genericsを使ったコードの(ほとんど)全部をエンコードできるためです。

Genericsを含んだ体系を構築した理論的に議論することは可能ですが、Scalaはその開発の初期段階のモデルであるνObj Calculusの頃から、Type Memberはあっても、Genericsを持たない体系でした。これは、Scalaのモデルをできるだけ議論しやすいシンプルなモデルにしたいからだと思われます。

現実のScala処理系では、JVMとの互換性の問題もあって、GenericsとAbstract Type Membersを共に搭載する必要がありますが、実用性を犠牲にしてよいのならば、Genericsを使ったコードをAbstract Type Membersを使ったコードにコンパイルすることも(おそらく)可能です。

オチはありませんが、そのような事が可能であるということを知っておくのは、Scalaの理論的な基盤が何故DOT CalculusのようなGenericsなしの形になっているかを知る上で有益ではないかと思います。

入門fastparse(1) ~四則演算評価器を作ってみた~

fastparseというScala用パーザコンビネータライブラリがあります。このライブラリ、Scala標準のパーザコンビネータライブラリよりかなり速い(ここの説明によると100倍速いそうな)というウリらしく、Scala標準のパーザコンビネータライブラリから乗り換えてみるために、試してみました。

構文解析器界隈のHello, World!と言えば四則演算評価器だろうということで、四則演算(+変数あり)のパーザと評価器をfastparseで書いてみました。タイトルに入門とありますが、これは私がfastparseに入門してみたという意味で、読者にとっての入門というわけではないのであしからず。

とりあえずソースコードをさらしておきます。

github.com

gistバージョンはこちら:

gist.github.com

ASMを使ってバイトコードコンパイルする評価器を同梱するという、誰得なことしていますが、まあ気にしない方向で。

実行結果は以下のような感じ:

https://i.gyazo.com/571778a50f60c569373f2fe7adf54fa5.png

以下、メモ:

  • Pは構文規則になる式を囲むときに使う。Pで囲まれた式は遅延評価される。
  • "(" ~ exp ~ ")"のように書いたとき、文字列リテラル部分はデフォルトで無視してくれる(semantic valueはexpの部分のみになる。これ、Scala標準のパーザコンビネータライブラリ使うときにウザいなあと思っていた部分なので助かる。
  • (exp).rep(n)で最低n回のexpの繰り返しを表現する。semantic valueはSeq[exp]型になる。この辺の動作はだいたいScala標準のパーザコンビネータライブラリと同じ。
  • (exp).map(...) でsemantic valueを変換できる。^^より直感的でわかりやすい。
  • a ~/ baをパーズした後にCutを発動する。ドキュメントFastParse 0.3.4 読むと

Although in theory it allows you to save on memory usage by discarding earlier portions of the input

と書いてあり、どうも自分の論文のCutから命名したようだ(自分の研究以前で、discarding earlier portions of the inputを目的にしたCutはないはず)

  • a ~ babの連接。Scala標準のと同じ。
  • a | babの選択(aを先に試してからbを試す)。これもScala標準のと同じ。
  • CharIn(Seq[Parser]...)は引数のいずれかを表す(正規表現などの文字クラスと同じ)
  • exp.!は、expを文字列としてパーズした場合の文字列パーザを返す(これは便利!)

こんなもんでしょうか。スペースを無視するいい方法とかScala標準ライブラリでParsers合成するのと同じ効果を持たせる方法とか、もうちょい考える必要のある部分はありますが、基本的にScala標準のパーザコンビネータライブラリとあまり変わらない使い勝手を提供してくれるものと考えてよいでしょう(Cutの導入など、むしろ便利になっている部分もある)。というわけで、安心して移行できそうです。

2015年を振り返ったりする話

大晦日ですね。皆さん、大晦日にはその年の出来事をまとめるのが習わしのようなので、自分も何か書いてみることにします。

今年の振り返り

新人研修(Scala編)のテキストを書いた

既に

ch.nicovideo.jp

で書かれてる公開情報なので書きますが、「エンジニアへの Scala 言語研修」の部分のテキスト、前半部分を主に自分が書きました(後半部分(Play 2部分)は別の方に執筆していただきました)。正直、このプロジェクトが始まったときは、ほんとにこれ完成するんかいなと思ってた部分はあり、まー主に私のせいなのですが、一時期は進捗状況がひやひやものだった時もありました。

ともあれ、なんとか研修までに間に合い、無事にこのテキストを用いたScala言語研修が出来ました(ちなみに、研修時、私は研修部屋の後ろの方に座って、時折巡回して新入質問に答えるTAみたいなことをしていました)。Jekyll + Github Pagesという構成で、修正がリアルタイムに社内GitHubに反映される形になっていたので、typoとか細かい間違いについて、研修中に結構な量のプルリクエストが飛んで来た気がします。研修中、実習課題が不足していたので、その場で思いついた課題を継ぎ足すなどしていたので、来年度はその辺も含めて充実させたいところです。ちなみに、ScalaMatsuri 2016でこの件について、「何か」があるかもしれません(何もないかもしれません)。

研究者への復帰(?)

?がついてるのは、自分でも復帰したといえるか微妙なところだからですが、論文の査読を2本ほど引き受けていました(両方ともしばらく前に完了)。あと、第106回プログラミング研究会 (PRO-2015-3)に参加してきたり。そういえば、PROの席でM出先生に話を聞いたのですが、東京工業大学ではScalaを使った授業をやっているそうです。一度授業風景を見学してみたいものです。久しぶりにお会いする先生方が多くて(PROに参加するのは実に5年ぶり)懐かしい気持ちになりました。

PEGと構文解析に関するアレコレの勉強会 Vol.1 (#peg_study)開催

connpass.com

PEGというドマイナーなテーマを弊社セミナールームで行ったのですが、なんと、100名ほどの方が参加してくれました。 募集開始時点では20~30名くらいかなと思っていたので、募集人数がぐんぐん増えたのには度肝を抜かされました。東京はとにかく人口密度が凄いので、したがってエンジニア密度もすごく、こういうテーマでも人が集まるのは素晴らしいことですね。

このイベントで、Lisper(?)の

@blackenedgoldさん

twitter.com

大学院生でコンパイラ関係?の研究をされている@phenanさん

twitter.com

たちと知り合いになれたのも収穫でした。

PEGについてはもっと布教していきたいので、来年、Vol. 2を開催する…かも?

PEGについての思索

回文っぽいPEGが表現する言語がいかなるものかを@chiguriさん

togetter.com

と一緒に考えたり、HOPEG(Higer Order PEG)(現在はFirst Order)

github.com

なる、PEGの規則をパラメタで拡張した処理系を作成して、(拡張なしPEGでは表現できないと考えられている)回文が表現できる!とか言ってたりしました。HOPEGを本当にHiger Orderにする拡張については、正月の三が日の間にちょっと考えてみたいところです。

ACM & 情報処理学会入会

大学院生のときは、ずっとどちらにも入会していない状態だったのですが、研究への復帰(?)にあたって、特にACMの論文への自由なアクセスがないと困るので両方入会しました(会費は自腹です)。おかげでACM Digital Libraryの論文を自由に読めてホクホクです?

新言語Klassic開発開始!

形式言語とかプログラミング言語を開発するのが自分のライフワークだと勝手に思っているのですが、新しいプログラミング言語をろくに作っていない現状に気が付いて、リポジトリだけ作って放置してた新言語Klassic

github.com

の開発を開始しました(現在は、一部の抽象構文木クラスが定義されているだけですが…)

体調不良(?)

特に今年後半に顕著だったのですが、いわゆる不定愁訴のケがあるようで、それに起因する体調不良には結構悩まされました…。

来年の目標

Klassic 0.0.1公開

最低限、動くものを早めに書き上げて、Version 0.0.1として公開したい。目標としては、来年3月中くらいでしょうか…?このブログでも開発宣言して、スターも現時点で28くらいもらったところですし、意欲は旺盛です。

体調不良を治す

不定愁訴と書いた通り、色々な症状が不定期に出てくるので難しい部分はありますが、まずは、大昔から悩まされている過敏性腸症候群を克服したいところです(これのおかげでQOL有意に下がってる)

論文何か投稿する

研究者に復帰したといえるためにはやっぱ論文投稿しなくちゃねということで、論文少しずつ書き進めてます。来年中に最低一本は投稿(当然、査読付き論文誌/会議に)できたらいいなあ。

てな感じで、とりとめもなく書き連ねてみました。皆さま、来年もよろしくお願いいたします(ぺこり)

チーズがうまい

私生活的なことは、普段このブログには書かずにTwitterで済ませるのですが、ちょっと気がむいたので書いてみます。といっても、タイトル以上のことはほとんどないのですが。

自分の住んでいるアパートの近くには、24時間営業の肉のハナマサがあり、そこで、何種類かのチーズをカットして盛り合わせたチーズオードブルというものが以前売っていました。これが好物で以前は毎週のように買い足していたのですが、しばらくチーズを食べない日が続いた後、ふとハナマサに寄ってみると、チーズオードブルのコーナーが消滅していたのです!

嗚呼、と嘆いていたのですが、今日、ハナマサに寄ってみたら、なんとチーズオードブルが復活していたではありませんか!

f:id:kmizushima:20151229150528j:plain

というわけで、さっそく数個買って来ました。個人的に、パルミジャーノ・レッジャーノとカマンベール、ミモレットがお勧め。