第15章 動的プログラミング言語、Web サーバー、およびデータベースサーバー

15.1. 動的プログラミング言語

15.1.1. Python への主な変更点

15.1.1.1. Python 3 が RHEL 8 におけるデフォルトの Python 実装に

Red Hat Enterprise Linux 8 には、Python 3.6 が同梱されています。このパッケージは、デフォルトでインストールされていない可能性があります。Python 3.6 をインストールする場合は、yum install python3 コマンドを使用します。

Python 2.7 は、python2 パッケージで入手できます。ただし、Python 3 への移行をより円滑に進められるように、Python 2 のライフサイクルは短くなっています。

デフォルトの python パッケージまたはバージョンを指定しない /usr/bin/python 実行ファイルは、いずれも RHEL 8 では配布されません。python3 または python2 を直接使用することが推奨されます。もしくは、管理者が、alternatives コマンドを使用して、バージョン管理外の python コマンドを設定できます。

詳細は「Red Hat Enterprise Linux 8 での Python の使用」を参照してください。

15.1.1.2. Python 2 から Python 3 への移行

開発者は、Python 2 で記述したコードを Python 3 に移行できます。大規模なコードベースを Python 3 に移行する方法は「The Conservative Python 3 Porting Guide」を参照してください。

この移行が終了すると、元の Python 2 コードは Python 3 インタープリターにより解釈できるようになり、同様に Python 2 インタープリターは解釈できるままとなることに注意してください。

15.1.1.3. バージョンを指定しない Python の設定

システム管理者は、alternatives コマンドを使用して、バージョンを管理しない python コマンドを設定できます。必要なパッケージ (python3 または python2) は、バージョンを指定しないコマンドを各バージョンに設定する前にインストールする必要があります。

バージョンを指定しない python コマンドを Python 3 に直接設定するには、以下のコマンドを実行します。

alternatives --set python /usr/bin/python3

Python 2 を選択した場合は類似コマンドを使用してください。

もしくは、対話式に、バージョンを指定しない python コマンドを設定できます。

  1. 次のコマンドを実行します。

    alternatives --config python
  2. 表示された一覧から必要なバージョンを選択します。

この設定をリセットし、バージョンを指定しない python をコマンドを削除するには、以下のコマンドを実行します。

alternatives --auto python
警告

その他の Python 関連のコマンド (pip3 など) には、バージョンを指定しないで設定できるバリアントがあります。

15.1.1.4. RPM ビルド時に Python スクリプトで hashbang にメジャーバージョンを指定することが必要

RHEL 8 で実行可能な Python スクリプトでは、主な Python バージョンを明示的に指定する hashbang (shebang) を使用します。

BRP (buildroot policy) スクリプト /usr/lib/rpm/redhat/brp-mangle-shebangs は、RPM パッケージを構築する際に自動的に実行します。このスクリプトは、実行可能なすべてのファイルで hashbang を修正します。スクリプトで、Python のメジャーバージョンを指定しない曖昧な Python の hashbang に遭遇すると、エラーが作成され、RPM の構築に失敗します。このような曖昧な hashbang の例を以下に示します。

  • #! /usr/bin/python
  • #! /usr/bin/env python

Python スクリプトで、RPM ビルド時にエラーが発生する hashbang を修正するには、platform-python-devel パッケージの pathfix.py スクリプトを使用します。

pathfix.py -pn -i %{__python3} PATH ...

複数の PATH を指定できます。PATH がディレクトリーの場合、pathfix.py は Python スクリプトを再帰的にスキャンして、^[a-zA-Z0-9_]+\.py$ パターンに一致するものを探します。これは、曖昧な hashbang があるものだけではありません。%prep セクション、または %install セクションに、pathfix.py を実行するコマンドを追加します。

詳細は「Python スクリプトにおける hashbang の処理」を参照してください。

15.1.1.5. net-snmp パッケージの Python バインディングが利用できない

Net-SNMP のツールスイートは、RHEL 8 のデフォルトの Python の実装である Python 3 にバインディングを提供しません。これにより、python-net-snmp パッケージ、python2-net-snmp パッケージ、または python3-net-snmp パッケージが RHEL 8 では使用できません。

15.1.1.6. 関連資料

15.1.2. PHP への主な変更点

Red Hat Enterprise Linux 8 には PHP 7.2 が同梱されています。このバージョンには、RHEL 7 で利用できた PHP 5.4 に対する重要な変更が追加されています。

  • PHP はデフォルトで FastCGI Process Manager (FPM) を使用します (スレッド化された httpd で安全に使用できます)。
  • php_value 変数と php-flag 変数が httpd 設定ファイルで使用されなくなり、代わりにプール設定の /etc/php-fpm.d/*.conf で設定する必要があります。
  • PHP スクリプトのエラーと警告のログは、/var/log/httpd/error.log ではなく /var/log/php-fpm/www-error.log ファイルに記録されます。
  • PHP の max_execution_time 設定変数を変更する時は、変更した値に合わせて httpd ProxyTimeout 設定を増やす必要があります。
  • PHP スクリプトを実行するユーザーが、FPM プール設定 (apache ユーザーがデフォルトとなる /etc/php-fpm.d/www.conf ファイル) に設定されるようになりました。
  • 設定を変更した場合、または新しい拡張機能をインストールした場合は、php-fpm サービスを再起動する必要があります。
  • zip 拡張が、php-common から、別のパッケージ php-pecl-zip に移動しました。

以下の拡張機能が削除されました。

  • aspell
  • mysql (拡張機能の mysqli および pdo_mysql は、php-mysqlnd パッケージで引き続き利用できます)
  • memcache

15.1.3. Perl への主な変更点

RHEL 8 で提供される Perl 5.26 では、RHEL 7 で提供されていたバージョンに以下のような変更が追加されました。

  • Unicode 9.0 に対応するようになりました。
  • 新しい SystemTap のプローブ op-entryloading-file、および loaded-file が提供されるようになりました。
  • パフォーマンスを向上させるために、スカラーの割り当て時に、コピーオンライトメカニズムが使用されます。
  • IPv4 ソケットおよび IPv6 ソケットを透過的に処理するために IO::Socket::IP モジュールが追加されました。
  • 構造化された方法で perl -V データにアクセスするために、Config::Perl::V モジュールが追加されました。
  • Comprehensive Perl Archive Network (CPAN) リポジトリーからモジュールを取得、抽出、ビルド、およびインストールする cpanm ユーティリティーを同梱する perl-App-cpanminus パッケージが追加されました。
  • セキュリティー上の理由により、@INC モジュールの検索パスから、現在のディレクトリー (.) が削除されました。
  • 上記の動作上の変更によりファイルの読み込みに失敗した時に、do ステートメントが非推奨の警告を返すようになりました。
  • do subroutine(LIST) 呼び出しに対応しなくなり、構文エラーが発生するようになりました。
  • ハッシュがデフォルトでランダム化されるようになりました。ハッシュから鍵と値が返される順序は、perl の実行ごとに変わります。ランダム化を無効にするには、PERL_PERTURB_KEYS 環境変数を 0 に設定します。
  • 正規表現のパターンで、エスケープされていないリテラルの { 文字が使用できなくなりました。
  • $_ 変数に対する語彙的なスコープへの対応が削除されました。
  • 配列またはハッシュに defined 演算子を使用すると、致命的なエラーが発生します。
  • UNIVERSAL モジュールから関数をインポートすると、致命的なエラーが発生します。
  • find2perl ツール、s2p ツール、a2pc2ph ツール、および pstruct ツールが削除されました。
  • ${^ENCODING} 機能が削除されました。encoding プラグマのデフォルトモードに対応しなくなりました。UTF-8 以外のエンコーディングでソースコードを記述する場合は、エンコーディングの Filter オプションを使用します。
  • アップストリームに合わせて、perl パッケージが変更になりました。perl パッケージはコアモジュール群をインストールし、/usr/bin/perl インタープリターは perl-interpreter パッケージで提供されます。以前のリリースでは、perl パッケージに最小限のインタープリターだけが同梱され、perl-core パッケージにインタープリターとコアモジュールの両方が同梱されていました。
  • Perl モジュールの IO::Socket::SSL は、./certs/my-ca.pem ファイルまたは ./ca ディレクトリーから認証局の証明書、./certs/server-key.pem ファイルからサーバーの秘密鍵、./certs/server-cert.pem ファイルからサーバーの証明書、./certs/client-key.pem ファイルからクライアントの秘密鍵、./certs/client-cert.pem ファイルからクライアント証明書を読み込まなくなりました。代わりにファイルのパスを明示的に指定します。

15.1.4. Ruby への主な変更点

RHEL 8 では、RHEL 7 に同梱されていた Ruby 2.5 に新機能および機能強化を追加した Ruby 2.0.0 が提供されます。以下は、主な変更点です。

  • インクリメンタルガベージコレクターが追加されました。
  • Refinements 構文が追加されました。
  • シンボルは、ガベージコレクションが行われるようになりました。
  • 安全レベルの $SAFE=2 および $SAFE=3 が廃止されました。
  • Fixnum クラスと Bignum クラスが、Integer クラスに統合されました。
  • Hash クラスの最適化、インスタンス変数へのアクセスの向上、ならびに Mutex クラスの小型化および高速化により、パフォーマンスが向上しました。
  • 古い API が非推奨になりました。
  • RubyGemsRakeRDocPsychMinitesttest-unit などのバンドルされたライブライリーが更新されました。
  • Ruby とともに配布されていた mathnDLext/tkXMLRPC などのライブラリーは非推奨になり、同梱されなくなりました。
  • SemVer バージョン管理スキームが、Ruby バージョン管理に使用されるようになりました。

15.1.5. SWIG への主な変更点

RHEL 8 には、SWIG (Simplified Wrapper and Interface Generator) バージョン 3.0 が含まれています。RHEL 7 に同梱されていたバージョン 2.0 に新機能、機能拡張、およびバグ修正が数多く追加されました。特に注目すべきは、C++11 標準仕様への対応が実装されたことです。SWIG は、Go 1.6PHP 7Octave 4.2、および Python 3.5 に対応するようになりました。

15.1.6. Node.js が RHEL に新登場

JavaScript プログラミング言語で高速でスケーラブルなネットワークアプリケーションを構築するソフトウェア開発プラットフォームである Node.js が RHEL で初めて提供されます。以前は、Software Collection からしか入手できませんでした。RHEL 8 では Node.js 10 が提供されます。

15.1.7. Tcl

Tool command language (Tcl) は、動的なプログラミング言語です。この言語のインタープリターと C ライブラリーは、tcl パッケージにより提供されます。

Tk とともに Tcl を使用すると (Tcl/Tk)、プラットフォーム間共通の GUI アプリケーションを作成できます。Tk は、tk パッケージから入手できます。

Tk は、以下のいずれかを参照します。

  • 複数言語のプログラミングツールキット
  • Tk C ライブラリーバインディングは、複数の言語 (C、Ruby、Perl、Python など) で利用できます。
  • Tk コンソールのインスタンスを作成する wish インタープリター
  • 特定の Tcl インタープリターに新しいコマンドを多数追加する Tk の拡張

15.1.7.1. Tcl/Tk 8.6 に関する注目すべき変更点

RHEL 8 では、Tcl/Tk バージョン 8.6 が使用されます。Tcl/Tk バージョン 8.5 から、以下のような変更が追加されています。

  • オブジェクト指向のプログラミングサポート
  • スタックレス評価の実装
  • 強化された例外処理
  • Tcl で構築およびインストールしたサードパーティーパッケージのコレクション
  • 有効なマルチスレッド操作
  • SQL データベースを提供するスクリプトサポート
  • IPv6 ネットワーキングサポート
  • ビルドインの zlib 圧縮
  • リスト処理

    新しい 2 つのコマンド lmap および dict map が利用できます。これにより、Tcl コンテナーにおける変換の表現が可能になります。

  • スクリプトにより積み上げられたチャンネル

    新しい 2 つのコマンド chan push および chan pop が利用できるため、I/O チャンネルへ、または I/O チャンネルからの変換を追加または削除できます。

Tcl/Tk version 8.6 の変更点および新機能の詳細は、以下の参考資料を参照してください。

Tcl/Tk 8.6 への移行が必要な場合は、「Tcl/Tk 8.6 への移行」を参照してください。