-
【雑談】 マツタケが栽培できない理由
会津ラボの阿部です。普段はバックエンドエンジニアをしています。今回はソフトウェアには全く関係のない、マツタケに関する雑談です。 出典: 森林総合研究所 九州支所/菌根の話 https://www.ffpri.affrc.go.jp/kys/business/tatuta/kinoko/kinkon.html はじめに 日本におけるマツタケの歴史は古く、縄文時代にはすでに食べられており、平安貴族はマツタケ狩りを楽しみ、江戸時代には大衆向けにマツタケの料理本が発行されていたようです。日本では高級な食用キノコとされる一方で、海外では不快な臭いとみなされて人気は今ひとつのようです。近年では国内市場に流通するほとんどが輸入品で占められ、国産品は貴重な存在です。海外では見向きもされないキノコですが日本では高級品ですので、まさに金のなる木ならぬ金のなるキノコですね。 ここからが本題です。他のキノコのように人口栽培できればみんな嬉しいところですが、マツタケは人口栽培が難しいキノコとされます。一体何が原因で難しいのでしょうか。 シイタケとの違い 同じ食材キノコであるシイタケとの違いを考えてみます。シイタケは枯れ木を養分にして成長するタイプのキノコ(木材腐朽菌)です。自然環境では枯れ木や倒木に根を張って成長します。木や草を腐らせて土に還す、よく知られる自然の分解者です。シイタケ栽培のホダ木はこれを人工的に再現したものですね。 一方でマツタケは樹木の根と一体化し、樹木に土中の水分やリン酸や窒素を渡す代わりに、樹木が光合成で作った養分をもらって成長するタイプのキノコ(菌根菌)です。樹木と共生関係にあり、樹木の成長を促す役割を持ちます。キノコの本体は木の根では届かない、土中の狭い隙間に入り込むことができます。 このようにキノコは、枯れ木に生えるキノコ(シイタケ)と地面に生えるキノコ(マツタケ)の2種類に大別されます。 マツタケは人口栽培が難しい このようにマツタケは樹木と共生関係にあり、生きた樹木がないと成長できません。これが、マツタケの人口栽培を難しくしています。 まず、栽培するスペース的な問題があります。マツタケと一緒に樹木も育てる必要がありますから、シイタケのようにホダ木を並べるわけにはいきません。また、樹木と一緒に成長するため成長速度もゆっくりです。樹木の光合成に依存するため、肥料をあげて直接マツタケの成長を促すことはできません。まるごと温室に入れて成長を加速させることは、あまり現実的ではないでしょう。さらに、キノコを作り出すためのトリガーなど、よくわかっていないことも多くあります。気温や降雨量が影響しているようですが、根本的にそれらをコントロールするのは難しいという問題があります。 マツタケの収穫量はその年によって大きく変動するそうですが、それは天候の影響を強く受けるからなんですね。 TIPS菌類のうち、いわゆる「キノコ」(子実体)を作るようなものがキノコと呼ばれ、それ以外のものはカビと呼ばれます。目に見えるキノコの部分は、繁殖のために胞子を散布するための器官です。つまり植物に例えれば花の部分になります。キノコの本体は枯れ木や地面の中にあるため、あまり目にすることはないでしょう。語源的には、「木+の+子」でキノコだそうです。わかりやすいですね。実際は植物と菌類で全くの別物ですが、シイタケもマツタケも樹木と密接な関係にあります。 おわりに 今回はキノコに関する雑談でした。次回は(あるとすれば)毒キノコに関する話題を取り上げたいと思います。
-
【C#】 System.Span とパフォーマンスの話
みなさんはじめまして、会津ラボの阿部です。普段はバックエンドエンジニアをしています。 今回は C# の啓蒙活動を行おうと思います。 はじめに C# もとい .NET Framework(v1.0、2002年1月) は .NET(v1.0、2016年6月) に名前が変わりました。よりアグレッシブに機能追加するよう舵切りがなされ、特にパフォーマンスが改善されています。今回は .NET のパフォーマンス改善の目玉である System.Span<T> に関する四方山話です。 Note四方山話(よもやまばなし)種々雑多な話。 世間話。 雑談。 よもの話。 C# は生産性を重視した言語であり、パフォーマンス改善の優先度はそれほど高くありませんでした。しかし C# コンパイラが C++ から C# で書かれるようになりパフォーマンスが重視されるようになります。つまり C# におけるパフォーマンス改善の流れは C# 開発チームの内需だったわけです。その他、昨今のクラウドコンピューティングの隆盛によってパフォーマンスがよくないと開発言語として選ばれにくいという側面もあります(最近だと AOT も盛んです)。 Span<T> とは、要は配列 Span<T> は連続したメモリを表します。読み取り専用の ReadOnlySpan<T> もセットで存在します。配列の使いにくかった部分を改善した型です。 後述のとおり Span<T> はパフォーマンス改善に繋がります。しかしながら、リストやシーケンスを使う場面では System.Collections.Generic.IEnumerable<T> を使ったほうがクエリ、並列処理、イテレーターなど自由度が高く、共変性もあります。結論として、Span<T> を使うのはライブラリ作成者が主体になりそうです。一方でライブラリ利用者は、Span<T> を意識せずパフォーマンス改善の恩恵を受けられます。 文字列を例に考える Span<T> によるパフォーマンス改善の例として、文字列を見ていきましょう。 C# の文字列型(string)は不変な参照型です。詳細は省きますが、かなり特殊な型で内部的には読み取り専用の文字配列(char[])のようになっています。これは参照先で書き換えられることがないためコピーを渡す必要がないこと、コードを簡潔にできることが利点としてありますが、意図しないオブジェクトの生成が起こりやすい欠点もあります。 この問題は System.Text.StringBuilder を使うことで回避できます。…