Brian J. Cardiff 09 Jun 2020

Crystal 0.35.0 released!

Crystal 0.35.0 has been released!

今回のリリースはみなさんの待ち望んでいた、1.0直前の標準ライブラリに磨きをかけるものです。この中には最近のいくつかの追加やより洗練された実装の繰り返しといった、多くの活動があります。他には、デバッグの改善や Windows のサポート、その他のプラットフォームでのランタイムの安定化などを含みます。

このリリースが最後のバージョン 0.x のリリースになるでしょう。1.0.0-preX のリリースに向けて準備をしていてください。

There are 242 commits since 0.34.0 by 38 contributors.

それでは今回のリリースのハイライトを紹介していきます。たくさんの紹介するものがあります。Don’t miss out on the rest of the release changelog which has a lot of valuable information.

言語の変更

網羅性チェック (テイク2)

前回のリリースで、コンパイラは case 文の条件節の網羅性チェックをするようになりました。ですが、フィーバックを受けて、次のことを決定しました。

  1. case ... when を前のように戻す。暗黙の else nil があって、条件節は網羅的でなくてもよい。
  2. case ... in 文を実験的に導入する。こちらは暗黙の else を持たず、条件の網羅性が確認できなければコンパイルが通らない。実験的というのはフォードバックを元に変更される可能性がある、ということです。たとえマイナーリリースの間でも、その変更は行なわれる可能性があります。

この決定によって case ... when の意味は身近なままとなり、既存のコードに影響することなく網羅性チェックをする case 文を洗練させていくことが可能になります。Read more at #9258 and #9045.

# Compiles! Totally fine
case 1 || "a"
when Int32
end

# Error: missing case String
case 1 || "a"
in Int32
end

この変更によって in が正式なキーワードとなりました。これは破壊的な変更ですが、in はこれまでもマクロ中ではキーワードとして扱われていました。

コンパイラ

コンパイラに破壊的な変更があり、コンパイラの CLI がシバン #! によるスクリプトをより安心して動作させられるようになりました。これからは、コマンドの代わりにファイルを引数にしてコンパイラを実行すると (crystal path/to/file.cr arg1 arg2 のように)、ファイルがコンパイルされて、そしてそれを実行する、という動作をします。このとき、引数はプログラムにだけ影響して、コンパイラに影響しない、ということです。

コンパイラフラグを使いたい場合や引数と共にプログラムを実行したい場合は、次のように run コマンドが使えます。crystal run path/to/file.cr -Dcompiler_flag --release -- arg1 arg2-- はコンパイラのオプションとプログラムのオプションを切り分けます。Read more at #9171.

他の破壊的な変更としては、crystal env がシェル向けにクオートをするようになりました。つまり、eval "$(crystal env)" が安全にできるようになったということです。また、crystal env VARIABLE はこれまでの通りです。Read more at #9428

パーサーはたくさんの愛を受けました。Fixing edge cases, bugs and even a considerable refactor in #9208.

言語のいくつかの機能はより良い動作のために反芻が必要でした。このリリースではオートキャストが多重ディスパッチやユニオンのデフォルト値に対して動作するようになりました。Read more at #9004 and #9366. これはいくつかの場合の予期しない残念な挙動を解決するでしょう。

既存の機能の改善の背景には、Crystal のデバッグ機能の改善を待ち望まれていたことがあります。The story is not yet complete, but in #8538 a huge step forward was made. You can check out an article about how to debug a Crystal program in VS Code article for more information, configuration and screenshots.

@[Link] アノテーションは少しだけ再デザインされました。pkg-config とより統合されて、static: オプションのサポートが無くなりました。これによって将来、デフォルト値をいい感じに提供しつつ、リンクを詳細に設定できるようにすることを見据えています。Read more at #8972.

Crystal パッケージのメンテナにとって、コンパイラをビルドする際にCRYSTAL_CONFIG_PATH が標準ライブラリのパスのみを必要とするようになったという知らせは価値があるでしょう。lib ディレクトリはコンパイラによって常に含まれるようになりました。将来的には shaeds のインストールパスを細かく設定できるようにしたいと考えています。Read more at #9315.

その他の変更として、SOURCE_DATE_EPOCH という環境変数を使うことでコンパイラをビルドする際にソースコードの時刻を伝えることができるようになりました。Read more at #9088.

Shards

Shards v0.11.1 が今回のリリースではバンドルされます。

今回の把握すべき主要な変更は crystal: プロパティが効果的に機能するようになった点です。このプロパティは、有効な shard のバージョンを Crystal 環境に基いて決定するのに使われます。You can check the semantics in shards/SPEC.md.

後方互換性のために crystal: プロパティが shard.yml に無かった場合、< 1.0.0として解釈されます。よって、Crystal 1.0.0 まではそのままでも動作し続けるでしょう。また、この挙動が不便な場合は、--ignore-crystal-version を渡すことでこのチェックを無視できます。

利用者の期待を高めるには、依存するバージョンを明示する必要があると考えられます。そして、標準ライブラリや言語のバージョンもまた依存関係なのです。

crystal: プロパティの動作は依存関係のバージョン指定とほとんど同じように動作します。違いは、利便性のため crystal: x.y.z~> x.y, >= x.y.z のように (つまり、 >= x.y.z, < (x+1).0.0) 解釈されることです。この結果、任意のメジャーリリースで何らかの対応が必要になります。

shards install を現在のプロジェクトで実行することを推奨します。これによって、shard.lock がいくつかの追加の新しいバージョンのフォーマットを持つことに気付くかもしれません。そして、lib/.shards.info ファイルがインストールした依存関係を説明するものとして追加されています。この新しいファイルはバージョン管理システムでトラックする必要はありません。

最後に、依存関係のバージョン指定で version: >= 1.0.0, < 2.0 のように複数の指定を交差させられるようになったことを紹介します。

For a comprehensive list of changes in this shards version you can check its changelog.

標準ライブラリ

このリリースにはいくつもの破壊的変更が含まれます。それらの大半は普通、非推奨の警告が出るようになっています。標準ライブラリの整理なしに1.0へと進むことはないつもりです。このような整理は以前にもあったはずです。これに優先順位を付けることは簡単ではなく、地道に進めています。

計算結果の出力や入力に IO を引数に取る多くのメソッドがあります。In #5916 you can read the motivation to standardize them as the first argument in these functions. It got implemented in #9134 and some follow up PRs.

Related to all these IO methods, on String, instead of returning String values, there are new overloads to emit directly the result to the IO; read more in #9236. この影響を受けるのは #underscore#titleize#capitalize#upcase、そして#downcase といったメソッドです。

Keep an eye on #9291 for a proposal to improve the interpolation of strings so they can emit directly to an IO.

その他の IO の破壊的な変更としては、#skip#write#write_utf8#write_byte#write_bytes、や#skip_to_end がスキップした/書き込んだバイト数の数値を返すようになったことがあります。これは他の言語でもそのようになっており、書き込み中に追加の呼び出しなく現在のストリームを位置を把握できるようになります。Read more at #9233 and #9363.

@[Experimental] アノテーションという、ライブラリや言語、shardの部分に細心の注意と共に使う必要のあるという指定をするためのものが導入されました。実験的な (experimental) 機能は変更や破壊、もしくは削除を Semver の規約に関わらず行なっても良いものとします。今のところ、アノテーションはドキュメントジェネレータで利用されています。ですが、他にも追加の機能のアイディアがあります。Read more at #9244.

Digest 型がリファクタリングされて、いくつかのメソッドの名前が変更されたことに注意する必要があるかもしれません。Read more at #8426.

さて、OptionParser がサブコマンドを定義できるようになりました。Read more at #9009.

Some other clean-ups: Flate, Gzip, Zip, and Zlib were moved inside Compress module in #8886. また、FlateCompress::Deflate に名前が変更されています。require "compress/gzip" として、これらの定数を変更する必要があります。require "gzip" は依然として有効ですが、警告メッセージが表示されることになります。

いくつかの変更が FileFileUtils にあります。これらは整理されて、強制する操作が両方の API で有効になりました。Read more at #9175.

マクロ

クロスコンパイルの際、host_flag? というマクロが追加されたことを知っておくと便利でしょう。これは flag? のようなものですが、ホストのマシンで解決されます。Read more at #9049.

数値計算

符号付きと符号無しの数値の混ざった演算のオーバーフローの検出が修正されました。Read more at #9403.

Int#digits というメソッドが追加されて、一貫性のため BigInt#digits の出力が反転されました。Read more at #9383.

シリアライズ

The JSON.mapping and YAML.mapping migrated to their own packages: github:crystal-lang/json_mapping.cr and github:crystal-lang/yaml_mapping.cr. これらの機能は十分なものでしたが、現在は JSON::SerializableYAML::Serializable がより良いものとしてあるため、標準ライブラリから削除されました。Read more at #9272.

時刻

これからは Time#to_rfc3339 のデフォルトの精度は秒となり、それ以上の精度は出力されません。より細かな精度が必要な場合は fraction_digits という名前付き引数に 0. 3, 6, 9 という精度の桁数を指定してください。In #9283 we are dropping the logic to show the fraction of seconds depending on the time value.

ネットワーク

We’ve updated the SSL server secure defaults in #9026. And fixed some HTTP::Server sporadic failures during SSL handshake in #9177.

そして、HTTP::Serverに2つの破壊的な変更があります。We improved the error handling and logging in #9115 and integrated it with the new logging module. The HTTP::Request#remote_address type was changed to Socket::Address? in #9210.

ログ

まず初めに、0.34.0で導入した新しいログモジールを早期に試してフィードバックを送ってくださった皆様に感謝いたします。破壊的な変更を含むいくつかの変更点がありますが、それらは主要な API には影響しません。これらを組み合わせることで、追加の機能といくつかのユースケースでのパーフォマンスの改善を達成しています。

We renamed Log::Severity::Warning to Warn in #9293. Log.warn { ... } がありましたが、これはそのままで、警告を表します。。この変更は :warning やほとんどの環境変数経由での設定に影響します。Similarly, we dropped Verbose, and added Trace and Notice in #9107.

ログのセットアップがよりシンプルになりました。Log.setup* 系の2つのメソッドがあります。これらのメソッドは常にソースとバックエンドの間のバインディングを完全に設定するでしょう。

Log.setup :debug # will show debug or above in the stdout for all source
Log.setup "db.*", :trace # will show trace or above in the stdout for db.* sources and nothing else
Log.setup_from_env # will grab the value of LOG_LEVEL env variable

Log.setup_from_env が1つの環境変数を受け取って動作するようになったことにも注意してください。より柔軟なものが今後追加されるかもしれませんが、名前付き引数はより良い体験を提供するはずです。Read more at #9145.

各エントリはこれまでより、現在実行しているファイバーから取得したコンテキストの情報を持っていました。その Log::Context の責務を Log::MetadataLog::Metadata::Value に分割することにしました。前者はSymbol から Log::Metadata::Value へのハッシュのようなデータ構造ですが、アロケーションやアルゴリズム的な最適化がされています。The main work was done in #9227 and #9295. これらのリファクタリングによって、クローンによって獲得していた Log::Metadata::Value の不変性 (immutability) が無くなりました。

ログエントリにローカルのメタデータや構造化された情報を追加したいという機能が望まれていました。もちろん、現在のファイバのコンテキストに対する変更や復旧が最小であるものが望ましいです。エントリが出力されていない場合は値の生成を省略するという当初の設計を保って、これを達成しました。

Log.info { "Program started" }
Log.info &.emit("Program started") # same as previous
Log.info &.emit("User logged in", user_id: 42) # local data
Log.info &.emit("User logged in", expr_that_computes_hash_named_tuple_or_metadata)
Log.warn exception: e, &.emit("Oh no!", user_id: 42) # with exception
Log.warn exception: e, &.emit("Oh no!") # with exception, no local data
Log.warn(exception: e) { "Oh no!" } # same as previous
Log.info &.emit(action: "log_in", user_id: 42) # empty message

How to create custom log formatters was revisited in #9211. ブロックや Proc からフォーマッタを作る方法はまだ利用できますが、文字列から直接フォーマッタを定義するシンプルな方法を確認してみてください。

出力するログのエントリーをテストしたい場合、新しく追加された Log.capture というヘルパーが利用できます。Read more at #9201.

並行処理

Concurrent::Future とトップレベルの delayfuturelazy を削除しました。If you want to keep using them, use the github:crystal-community/future.cr shard. Read more at #9093.

Another feature that was dropped is the parallel macro in #9097.

1.0 以降に向けて、より堅牢で様々な利用に耐えうるもの開発したいと考えています。

ランタイム

Process#signal があるので Process#kill を非推奨としました。Read more at #9006.

また fork も非推奨となりました。これはマルチスレッド環境では有効ではありません。この変更が問題である場合は、Process.fork はまだ利用できるのでそちらを使ってください。しかし、このメソッドはもはや公開された API ではありません。Read more at #9136.

プラットフォーム

For macOS users, we fixed some compatibility issues with 10.15 (Catalina) in #9296.

For BSD users, we added support for DragonFly(BSD) in #9178.

For musl users, we fixed some weird segfaults in #9238 and fixed some empty backtraces #9267.

Windows ユーザーへはたくさんのお知らせがあります。To see the ongoing efforts don’t miss the wiki page and #5430.

今回のリリースでの Windows 向けの変更としては次のようなものがあります。

ですが、まだ標準ライブラリのすべての部分が Windows で利用できるというというわけではないことには注意してください。

ツール

主要な変更はドキュメントジェネレータで、バージョンピッカーをサポートするようになりました。外部に .json ファイルを用意して、現在と過去のリリースを指定することでバージョンピッカーに反映できます。Read more at #8792, #9074, and #9254.

次のステップ

Crystal をアップデートしてください。そして、問題の報告を心待ちにしています。私たちは1.0.0に向けての開発を始めています。1.0.0-preX のようなリリースをして、最終的な調整を重ねていくでしょう。

ここ数回のリリースで修正が多かったことは認めます。ですが、不快感は最小になるように心掛けたつもりです。

すべての非推奨にした定義は1.0では削除される予定です。1.0をクリーンなバージョンにしたいと思っています。

We have been able to do all of this thanks to the continued support of 84codes, Nikola Motor Company and every other sponsor. 継続的に開発・メンテナンスを続けていくには、寄付が不可欠です。OpenCollective and Bountysource are two available channels for that. Crystal の直接のスポンサーになりたい場合や、他のサポート方法を探している場合は crystal@manas.tech に連絡してください。それでは、ここまで読んでいただきありがとうございます!

Crystal 0.35.0 has been released!

今回のリリースはみなさんの待ち望んでいた、1.0直前の標準ライブラリに磨きをかけるものです。この中には最近のいくつかの追加やより洗練された実装の繰り返しといった、多くの活動があります。他には、デバッグの改善や Windows のサポート、その他のプラットフォームでのランタイムの安定化などを含みます。

このリリースが最後のバージョン 0.x のリリースになるでしょう。1.0.0-preX のリリースに向けて準備をしていてください。

There are 242 commits since 0.34.0 by 38 contributors.

それでは今回のリリースのハイライトを紹介していきます。たくさんの紹介するものがあります。Don’t miss out on the rest of the release changelog which has a lot of valuable information.

言語の変更

網羅性チェック (テイク2)

前回のリリースで、コンパイラは case 文の条件節の網羅性チェックをするようになりました。ですが、フィーバックを受けて、次のことを決定しました。

  1. case ... when を前のように戻す。暗黙の else nil があって、条件節は網羅的でなくてもよい。
  2. case ... in 文を実験的に導入する。こちらは暗黙の else を持たず、条件の網羅性が確認できなければコンパイルが通らない。実験的というのはフォードバックを元に変更される可能性がある、ということです。たとえマイナーリリースの間でも、その変更は行なわれる可能性があります。

この決定によって case ... when の意味は身近なままとなり、既存のコードに影響することなく網羅性チェックをする case 文を洗練させていくことが可能になります。Read more at #9258 and #9045.

# Compiles! Totally fine
case 1 || "a"
when Int32
end

# Error: missing case String
case 1 || "a"
in Int32
end

この変更によって in が正式なキーワードとなりました。これは破壊的な変更ですが、in はこれまでもマクロ中ではキーワードとして扱われていました。

コンパイラ

コンパイラに破壊的な変更があり、コンパイラの CLI がシバン #! によるスクリプトをより安心して動作させられるようになりました。これからは、コマンドの代わりにファイルを引数にしてコンパイラを実行すると (crystal path/to/file.cr arg1 arg2 のように)、ファイルがコンパイルされて、そしてそれを実行する、という動作をします。このとき、引数はプログラムにだけ影響して、コンパイラに影響しない、ということです。

コンパイラフラグを使いたい場合や引数と共にプログラムを実行したい場合は、次のように run コマンドが使えます。crystal run path/to/file.cr -Dcompiler_flag --release -- arg1 arg2-- はコンパイラのオプションとプログラムのオプションを切り分けます。Read more at #9171.

他の破壊的な変更としては、crystal env がシェル向けにクオートをするようになりました。つまり、eval "$(crystal env)" が安全にできるようになったということです。また、crystal env VARIABLE はこれまでの通りです。Read more at #9428

パーサーはたくさんの愛を受けました。Fixing edge cases, bugs and even a considerable refactor in #9208.

言語のいくつかの機能はより良い動作のために反芻が必要でした。このリリースではオートキャストが多重ディスパッチやユニオンのデフォルト値に対して動作するようになりました。Read more at #9004 and #9366. これはいくつかの場合の予期しない残念な挙動を解決するでしょう。

既存の機能の改善の背景には、Crystal のデバッグ機能の改善を待ち望まれていたことがあります。The story is not yet complete, but in #8538 a huge step forward was made. You can check out an article about how to debug a Crystal program in VS Code article for more information, configuration and screenshots.

@[Link] アノテーションは少しだけ再デザインされました。pkg-config とより統合されて、static: オプションのサポートが無くなりました。これによって将来、デフォルト値をいい感じに提供しつつ、リンクを詳細に設定できるようにすることを見据えています。Read more at #8972.

Crystal パッケージのメンテナにとって、コンパイラをビルドする際にCRYSTAL_CONFIG_PATH が標準ライブラリのパスのみを必要とするようになったという知らせは価値があるでしょう。lib ディレクトリはコンパイラによって常に含まれるようになりました。将来的には shaeds のインストールパスを細かく設定できるようにしたいと考えています。Read more at #9315.

その他の変更として、SOURCE_DATE_EPOCH という環境変数を使うことでコンパイラをビルドする際にソースコードの時刻を伝えることができるようになりました。Read more at #9088.

Shards

Shards v0.11.1 が今回のリリースではバンドルされます。

今回の把握すべき主要な変更は crystal: プロパティが効果的に機能するようになった点です。このプロパティは、有効な shard のバージョンを Crystal 環境に基いて決定するのに使われます。You can check the semantics in shards/SPEC.md.

後方互換性のために crystal: プロパティが shard.yml に無かった場合、< 1.0.0として解釈されます。よって、Crystal 1.0.0 まではそのままでも動作し続けるでしょう。また、この挙動が不便な場合は、--ignore-crystal-version を渡すことでこのチェックを無視できます。

利用者の期待を高めるには、依存するバージョンを明示する必要があると考えられます。そして、標準ライブラリや言語のバージョンもまた依存関係なのです。

crystal: プロパティの動作は依存関係のバージョン指定とほとんど同じように動作します。違いは、利便性のため crystal: x.y.z~> x.y, >= x.y.z のように (つまり、 >= x.y.z, < (x+1).0.0) 解釈されることです。この結果、任意のメジャーリリースで何らかの対応が必要になります。

shards install を現在のプロジェクトで実行することを推奨します。これによって、shard.lock がいくつかの追加の新しいバージョンのフォーマットを持つことに気付くかもしれません。そして、lib/.shards.info ファイルがインストールした依存関係を説明するものとして追加されています。この新しいファイルはバージョン管理システムでトラックする必要はありません。

最後に、依存関係のバージョン指定で version: >= 1.0.0, < 2.0 のように複数の指定を交差させられるようになったことを紹介します。

For a comprehensive list of changes in this shards version you can check its changelog.

標準ライブラリ

このリリースにはいくつもの破壊的変更が含まれます。それらの大半は普通、非推奨の警告が出るようになっています。標準ライブラリの整理なしに1.0へと進むことはないつもりです。このような整理は以前にもあったはずです。これに優先順位を付けることは簡単ではなく、地道に進めています。

計算結果の出力や入力に IO を引数に取る多くのメソッドがあります。In #5916 you can read the motivation to standardize them as the first argument in these functions. It got implemented in #9134 and some follow up PRs.

Related to all these IO methods, on String, instead of returning String values, there are new overloads to emit directly the result to the IO; read more in #9236. この影響を受けるのは #underscore#titleize#capitalize#upcase、そして#downcase といったメソッドです。

Keep an eye on #9291 for a proposal to improve the interpolation of strings so they can emit directly to an IO.

その他の IO の破壊的な変更としては、#skip#write#write_utf8#write_byte#write_bytes、や#skip_to_end がスキップした/書き込んだバイト数の数値を返すようになったことがあります。これは他の言語でもそのようになっており、書き込み中に追加の呼び出しなく現在のストリームを位置を把握できるようになります。Read more at #9233 and #9363.

@[Experimental] アノテーションという、ライブラリや言語、shardの部分に細心の注意と共に使う必要のあるという指定をするためのものが導入されました。実験的な (experimental) 機能は変更や破壊、もしくは削除を Semver の規約に関わらず行なっても良いものとします。今のところ、アノテーションはドキュメントジェネレータで利用されています。ですが、他にも追加の機能のアイディアがあります。Read more at #9244.

Digest 型がリファクタリングされて、いくつかのメソッドの名前が変更されたことに注意する必要があるかもしれません。Read more at #8426.

さて、OptionParser がサブコマンドを定義できるようになりました。Read more at #9009.

Some other clean-ups: Flate, Gzip, Zip, and Zlib were moved inside Compress module in #8886. また、FlateCompress::Deflate に名前が変更されています。require "compress/gzip" として、これらの定数を変更する必要があります。require "gzip" は依然として有効ですが、警告メッセージが表示されることになります。

いくつかの変更が FileFileUtils にあります。これらは整理されて、強制する操作が両方の API で有効になりました。Read more at #9175.

マクロ

クロスコンパイルの際、host_flag? というマクロが追加されたことを知っておくと便利でしょう。これは flag? のようなものですが、ホストのマシンで解決されます。Read more at #9049.

数値計算

符号付きと符号無しの数値の混ざった演算のオーバーフローの検出が修正されました。Read more at #9403.

Int#digits というメソッドが追加されて、一貫性のため BigInt#digits の出力が反転されました。Read more at #9383.

シリアライズ

The JSON.mapping and YAML.mapping migrated to their own packages: github:crystal-lang/json_mapping.cr and github:crystal-lang/yaml_mapping.cr. これらの機能は十分なものでしたが、現在は JSON::SerializableYAML::Serializable がより良いものとしてあるため、標準ライブラリから削除されました。Read more at #9272.

時刻

これからは Time#to_rfc3339 のデフォルトの精度は秒となり、それ以上の精度は出力されません。より細かな精度が必要な場合は fraction_digits という名前付き引数に 0. 3, 6, 9 という精度の桁数を指定してください。In #9283 we are dropping the logic to show the fraction of seconds depending on the time value.

ネットワーク

We’ve updated the SSL server secure defaults in #9026. And fixed some HTTP::Server sporadic failures during SSL handshake in #9177.

そして、HTTP::Serverに2つの破壊的な変更があります。We improved the error handling and logging in #9115 and integrated it with the new logging module. The HTTP::Request#remote_address type was changed to Socket::Address? in #9210.

ログ

まず初めに、0.34.0で導入した新しいログモジールを早期に試してフィードバックを送ってくださった皆様に感謝いたします。破壊的な変更を含むいくつかの変更点がありますが、それらは主要な API には影響しません。これらを組み合わせることで、追加の機能といくつかのユースケースでのパーフォマンスの改善を達成しています。

We renamed Log::Severity::Warning to Warn in #9293. Log.warn { ... } がありましたが、これはそのままで、警告を表します。。この変更は :warning やほとんどの環境変数経由での設定に影響します。Similarly, we dropped Verbose, and added Trace and Notice in #9107.

ログのセットアップがよりシンプルになりました。Log.setup* 系の2つのメソッドがあります。これらのメソッドは常にソースとバックエンドの間のバインディングを完全に設定するでしょう。

Log.setup :debug # will show debug or above in the stdout for all source
Log.setup "db.*", :trace # will show trace or above in the stdout for db.* sources and nothing else
Log.setup_from_env # will grab the value of LOG_LEVEL env variable

Log.setup_from_env が1つの環境変数を受け取って動作するようになったことにも注意してください。より柔軟なものが今後追加されるかもしれませんが、名前付き引数はより良い体験を提供するはずです。Read more at #9145.

各エントリはこれまでより、現在実行しているファイバーから取得したコンテキストの情報を持っていました。その Log::Context の責務を Log::MetadataLog::Metadata::Value に分割することにしました。前者はSymbol から Log::Metadata::Value へのハッシュのようなデータ構造ですが、アロケーションやアルゴリズム的な最適化がされています。The main work was done in #9227 and #9295. これらのリファクタリングによって、クローンによって獲得していた Log::Metadata::Value の不変性 (immutability) が無くなりました。

ログエントリにローカルのメタデータや構造化された情報を追加したいという機能が望まれていました。もちろん、現在のファイバのコンテキストに対する変更や復旧が最小であるものが望ましいです。エントリが出力されていない場合は値の生成を省略するという当初の設計を保って、これを達成しました。

Log.info { "Program started" }
Log.info &.emit("Program started") # same as previous
Log.info &.emit("User logged in", user_id: 42) # local data
Log.info &.emit("User logged in", expr_that_computes_hash_named_tuple_or_metadata)
Log.warn exception: e, &.emit("Oh no!", user_id: 42) # with exception
Log.warn exception: e, &.emit("Oh no!") # with exception, no local data
Log.warn(exception: e) { "Oh no!" } # same as previous
Log.info &.emit(action: "log_in", user_id: 42) # empty message

How to create custom log formatters was revisited in #9211. ブロックや Proc からフォーマッタを作る方法はまだ利用できますが、文字列から直接フォーマッタを定義するシンプルな方法を確認してみてください。

出力するログのエントリーをテストしたい場合、新しく追加された Log.capture というヘルパーが利用できます。Read more at #9201.

並行処理

Concurrent::Future とトップレベルの delayfuturelazy を削除しました。If you want to keep using them, use the github:crystal-community/future.cr shard. Read more at #9093.

Another feature that was dropped is the parallel macro in #9097.

1.0 以降に向けて、より堅牢で様々な利用に耐えうるもの開発したいと考えています。

ランタイム

Process#signal があるので Process#kill を非推奨としました。Read more at #9006.

また fork も非推奨となりました。これはマルチスレッド環境では有効ではありません。この変更が問題である場合は、Process.fork はまだ利用できるのでそちらを使ってください。しかし、このメソッドはもはや公開された API ではありません。Read more at #9136.

プラットフォーム

For macOS users, we fixed some compatibility issues with 10.15 (Catalina) in #9296.

For BSD users, we added support for DragonFly(BSD) in #9178.

For musl users, we fixed some weird segfaults in #9238 and fixed some empty backtraces #9267.

Windows ユーザーへはたくさんのお知らせがあります。To see the ongoing efforts don’t miss the wiki page and #5430.

今回のリリースでの Windows 向けの変更としては次のようなものがあります。

ですが、まだ標準ライブラリのすべての部分が Windows で利用できるというというわけではないことには注意してください。

ツール

主要な変更はドキュメントジェネレータで、バージョンピッカーをサポートするようになりました。外部に .json ファイルを用意して、現在と過去のリリースを指定することでバージョンピッカーに反映できます。Read more at #8792, #9074, and #9254.

次のステップ

Crystal をアップデートしてください。そして、問題の報告を心待ちにしています。私たちは1.0.0に向けての開発を始めています。1.0.0-preX のようなリリースをして、最終的な調整を重ねていくでしょう。

ここ数回のリリースで修正が多かったことは認めます。ですが、不快感は最小になるように心掛けたつもりです。

すべての非推奨にした定義は1.0では削除される予定です。1.0をクリーンなバージョンにしたいと思っています。

We have been able to do all of this thanks to the continued support of 84codes, Nikola Motor Company and every other sponsor. 継続的に開発・メンテナンスを続けていくには、寄付が不可欠です。OpenCollective and Bountysource are two available channels for that. Crystal の直接のスポンサーになりたい場合や、他のサポート方法を探している場合は crystal@manas.tech に連絡してください。それでは、ここまで読んでいただきありがとうございます!