2015年7月30日

[Linux] Announcing the general availability of Oracle Linux 6.7

原文はこちら。
https://blogs.oracle.com/linux/entry/announcing_the_general_availability_of

Oracle Linux 6の7回目のアップデート版であるOracle Linux 6 Update 7のリリースを発表できることをうれしく思っています。個々のRPMパッケージはUnbreakable Linux Network (ULN) やパブリックyumリポジトリから入手できます。また、ISOインストールイメージいはOracle Software Delivery Cloudからダウンロードいただけます。
Unbreakable Linux Network (ULN)
https://linux.oracle.com/
public yum repository
http://public-yum.oracle.com/
Oracle Software Delivery Cloud
http://edelivery.oracle.com/new
Oracle Linux 6 Update 7には以下のカーネルが含まれています。
  • Unbreakable Enterprise Kernel (UEK) Release 3 (kernel-uek-3.8.13-68.3.4.el6uek) for x86-64
  • Unbreakable Enterprise Kernel (UEK) Release 2 (kernel-uek-2.6.39-400.250.7.el6uek) for i386 
  • Red Hat Compatible Kernel (kernel-2.6.32-573.el6) for i386 and x86-64
デフォルトでは、特定のアーキテクチャ(i386もしくはx86-64)ではUnbreakable Enterprise KernelおよびRed Hat Compatible Kernelがインストールされ、システムはUnbreakable Enterprise Kernelを起動します。このリリースでの新機能を一部ご紹介しましょう。
  • 強化されたセキュリティ監査およびコンプライアンスのためのOpen Security Content Automation Protocol (OpenSCAP)ならびに oscap ユーティリティ
  • Keepalived と HAProxyによるLoad BalancingおよびHigh Availabilityのサポート(Oracle Linux Premier Supportサブスクリプションのみ)
  • SSSD support for Active DirectoryでのSSSDのサポートを強化。これには以下のものが含まれます。
    • DNSへの動的アップデート
    • グループやユーザのNetBIOS名の検索
    • ドメインコントローラのサイトディスカバリ
    • ユーザやグループの解決。単一ADフォレスト内の信頼されたドメインに対するユーザ認証を含む
  • Updates to the hyper-daemons パッケージへのアップデート。このパッケージにはhypervfcopydhypervkvpdhypervvssdを含む。
Oracle Linux 6 Update 7の新機能や変更点の詳細は、リリースノートをご覧下さい。
Oracle® Linux Release Notes for Release 6 Update 7
http://docs.oracle.com/cd/E37670_01/E64030/html/index.html
Oracle Linux 6 Product Document Library
http://docs.oracle.com/cd/E37670_01/index.html
Oracle Linuxはダウンロード、利用、配布とも無料で、しかもアップデートやerrataも無料でご利用頂けます。サポートに関しては、貴社システムにサポート契約が必要かどうかを判断してください。つまり、Oracle Linuxが貴社の開発、テスト、本番運用システムにとっての理想的な選択肢たり得ます。全てのシステムを最新かつセキュアに保ちながら、どのサポート範囲が個々のシステムにとって最良かを決定してください。Oracle Linux Premier Supportをご契約のお客様であれば、ダウンタイム無しでカーネルのアップデートを可能にするOracle Kspliceもご利用頂けますし、Oracle OpenStack for Oracle Linuxのサポートも受けることができます。
Free Updates and Errata for Oracle Linux
https://blogs.oracle.com/linux/entry/free_updates_and_errata_for
Oracle Linux Support
http://www.oracle.com/us/technologies/linux/support/overview/index.html
Oracle OpenStack for Oracle Linux Now Generally Available
http://www.oracle.com/us/corporate/press/2298602
Oracle Linuxに関する詳細情報は、以下のリンクからどうぞ。
Oracle Linux and Support
(日本語)http://www.oracle.com/jp/technologies/linux/overview/index.html
(英語)http://www.oracle.com/linux

2015年7月26日

[Database, JavaScript] node-oracledb 0.7.0 now supports Result Sets and REF CURSORS

原文はこちら。
https://blogs.oracle.com/opal/entry/node_oracledb_0_7_0

Node.js driver for Oracle Databaseの新しいリリースがnpmjs.comやGitHubからご利用いただけるようになりました。
node-oracledb (npm)
https://www.npmjs.com/package/oracledb
node-oracledb (GitHub)
https://github.com/oracle/node-oracledb
node-oracledb 0.7はNode.js 0.10、Node.js 0.12、io.jsからOracle Databaseに接続できます。数多くのプラットフォームで動作しますnode-oracledbに関する詳細は、GitHubページをご覧ください。
0.7における変更点は以下の通りです。
  • 大きなデータセットの取得で結果セットが使えるようになりました。問い合わせ結果の行をResultsetクラスを使ってバッチで取得することができます。
    ResultSet class
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#resultsetclass
    これを使うことにより、大量の問い合わせ結果を一気に大量のメモリを使わず取得することができます。新たなgetRow()やgetRows()メソッドを繰り返し呼び出して問い合わせ結果をスクロールすることができます。
    getRow()
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#getrow
    getRows()
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#getrows
    一気にすべての行を返すというオリジナルのnode-oracledbの挙動は、デフォルトとして残っています。結果セットを返すには、新たなexecute()オプションである{ resultSet: true} を使う必要があります。以下はその例です。
  • //  (See the full code in examples/resultset2.js)
    
    . . .
    
    var numRows = 10;  // number of rows to return from each call to getRows()
    
    connection.execute(
      "SELECT employee_id, last_name FROM employees ORDER BY employee_id",
      [], // no bind variables
      { resultSet: true }, // return a result set.  Default is false
      function(err, result)
      {
        if (err) { . . . }
        fetchRowsFromRS(connection, result.resultSet, numRows);
      });
    });
    
    . . .
    
    function fetchRowsFromRS(connection, resultSet, numRows)
    {
      resultSet.getRows( // get numRows rows
        numRows,
        function (err, rows)
        {
          if (err) {
             . . .                        // close the result set and release the connection
          } else if (rows.length == 0) {  // no rows, or no more rows
            . . .                         // close the result set and release the connection
          } else if (rows.length > 0) {
            console.log(rows);
            fetchRowsFromRS(connection, resultSet, numRows);  // get next set of rows
          }
        });
    }
    
    もうデータがない、もしくはデータを使わなくなった場合には、新しい結果セットを閉じるclose()メソッドを使って結果セットを閉じることが重要です。
    close()
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#close
    Result Setsの詳細情報はマニュアルをご覧ください。
    Result Set Handling
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#resultsethandling
  • PL/SQLからの問い合わせ結果でREF CURSORが使えるようになりました。バインド変数を使ってREF CURSORの結果を返すPL/SQLコードは、新たなnode-oracledbの型であるOracledb.CURSORにバインドでき、新たなResultSetクラスを使って結果を取得することができます。
    //  (See the full code in examples/refcursor.js)
    
    var oracledb = require('oracledb');
    
    . . .
    
    var numRows = 10;  // number of rows to return from each call to getRows()
    
    var bindvars = {
      sal:  6000,
      cursor:  { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
    }
    
    connection.execute(
      "BEGIN get_emp_rs(:sal, :cursor); END;",  // The PL/SQL has an OUT bind of type SYS_REFCURSOR
      bindvars,
      function(err, result)
      {
        if (err) { . . . }
        fetchRowsFromRS(connection, result.outBinds.cursor, numRows);
      });
    
    . . .
    
    function fetchRowsFromRS(connection, resultSet, numRows)
    {
      resultSet.getRows( // get numRows rows
        numRows,
        function (err, rows)
        {
          if (err) {
             . . .                        // close the result set and release the connection
          } else if (rows.length == 0) {  // no rows, or no more rows
            . . .                         // close the result set and release the connection
          } else if (rows.length > 0) {
            console.log(rows);
            fetchRowsFromRS(connection, resultSet, numRows);  // get next set of rows
          }
        });
    }
    REF CURSORの利用に関する詳細情報は以下のマニュアルをご覧ください。
    REF CURSOR Bind Parameters
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#refcursors
  • 行のプリフェッチができるようになりました。新しいResultSetクラスでは新たな属性 oracledb.prefetchRows と新たな execute() オプションである refetchRows を通じてサポートします。
    oracledb.prefetchRows
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#propdbprefetchrows
    sexecute(): Options
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#executeoptions
    アプリケーションがOracle DatabaseからのResultSetの問い合わせ結果の行やREF CURSORの行を取得する都度、プリフェッチによって下位のOracle Databaseのライブラリに別の行を転送させることができます。これは、データベースやネットワークリソースのより有効な利用を促し、パフォーマンスやスケーラビリティに寄与します。プリフェッチサイズにかかわらず、アプリケーションへ返す行数は変化しません。基盤のOracleクライアントライブラリがバッファリングを司ります。
  • プリフェッチサイズのデフォルト値は100です。アプリケーションは各々のexecute()で所望のパフォーマンスを出すため、不要なメモリの割り当てや初期化を避けるために、プリフェッチサイズを調整すべきです。いくつかのTipsがマニュアルに記載されています。
    node-oracledb: Documentation for the Oracle Database Node.js Driver
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md
    node-oracledb 0.7.0では、非ResultSetクエリは現在プリフェッチサイズを固定値2でプリフェッチしています。これらのクエリで必要なラウンドトリップの回数を削減しています。
  • テストスィートを追加しました。ディレクトリのREADMEをご覧いただいて、テスト実行方法を確認してください。
    Testing node-oracledb
    https://github.com/oracle/node-oracledb/blob/master/test/README.md
    テストスィートを実行すると、各テストには識別が容易になるよう、固有の番号があることに気付くことでしょう。番号は連番とは限りません。
    Linux、Windowsでほとんどのテストをしています。環境やバージョンの違いに由来するテスト結果の差異を確認した場合は、OCAに署名し、修正とその修正が必要な理由とともに、pullリクエストを送ってください。詳細は以下のリンクをご覧ください。
    Contributing to node-oracledb
    https://github.com/oracle/node-oracledb/blob/master/CONTRIBUTING.md
    (OCAに署名後)新たなテストを提示する場合、各テストに対し、テスト済み領域に適用するドキュメント対象範囲のユニークな番号を割り当てます。
  • RETURNING INTOを使うSQL文のエラー処理を修正しました。同じエラーメッセージをレポートするDML RETURNING文を伴うすべてのエラーの発生原因であるバグを修正しました。
  • SQLにRETURNING INTO句がある場合の日付のINSERTを修正しました。INSERTを使ってdateやtimestampをインサートし、SQL句の文字もしくは数値列にRETURNING INTOが含まれる場合、エラーが出ていましたが、これを修正しました。
  • Renumbered the values used by the Oracledb Constantsが用いる値を再割り当てしました。アプリケーションがOracledb.OBJECTやOracledb.BIND_INOUTといった定数を使う場合、変更に気付かないかもしれませんが、何らかの理由で数値を例えば2のようにハードコーディングしている場合、この新しい数字を使って書き換える必要があります。詳細は以下のページをご覧ください。
    lib/oracledb.js
    https://github.com/oracle/node-oracledb/blob/master/lib/oracledb.js
    もしくは、よりよい方法としては、コードを定数を使って書き換えてください。

2015年7月25日

[Java] WebSphere Liberty Now Java EE 7 Compatible!

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/websphere_liberty_now_java_ee

With the greatest pleasure I can report that IBM WebSphere Liberty 8.5が先頃Java EE 7として認定されたことをお伝えできることを非常にうれしく思います。WebSphereがGlassFish 4、WildFly 8、Hitachi Cosminexus、TmaxSoft JEUSに続いてJava EE 7対応したことになります。IBMならびにWebSphereは全世界で非常に幅広いカスタマーベースを持っており、このニュースはJava EEにとって本当に非常に喜ばしいものです。IBMは長い期間にわたって強力なJCPサポーターであり続けており、Java EE 7に含まれる、非常に評判のよいJava Batch APIをリードしました。何十年にもわたるミッションクリティカルなバッチ処理における深い専門知識を注ぎこんでくれました。全てのJava EEの認定製品は、official Java EE compatibilityページからいつでもご覧頂けます。
Java EE Compatibility
http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html
WebSphere Libertyは最新、高速、軽量で高度にモジュール化されたJava EE実装です。実際、モジュラー型アーキテクチャを利用して、WebSphere Libertyはここ数ヶ月の間に完全にサポートされたサービスストリームにJava EE7の一部をリリースしています(ご注意頂きたいのですが、基本的にJavaOne2014でWebLogic12.1.3で同じことをやっています)。Holly CumminsはWebSphere Libertyの進化と、これがゲームチェンジャーであり、特にIBMのお客様にとってのゲームチェンジャーである理由を説明しています。
Growing up with the Little Application Server That Could
https://developer.ibm.com/wasdev/blog/2015/06/29/growing-up-with-the-little-application-server-that-could/
モジュール化に対するLibertyのアプローチにより、再インストールせずにJava EE 7への漸進的なアップグレードが可能で、Java EE 6ランタイムベースラインに対し既存のアプリケーションを実行し続けることすら可能です。Laura CowenからのJava EE7 certificationの発表は、こちらからご覧頂けます。
Java EE 7 has landed in WAS Liberty
https://developer.ibm.com/wasdev/blog/2015/06/25/java-ee-7-has-landed-in-was-liberty/
WebSphere Libertyはこちらからダウンロードできます。
Download the WAS Liberty runtime
https://developer.ibm.com/wasdev/downloads/liberty-profile-using-non-eclipse-environments/
多くの方がご存知のように、来るWebLogic 12.2.1リリースではJava EE 7 full compatibilityを最も重要なゴールの一つとしています。The Apache TomEEチームもまたJava EE 7機能を早期に提供できるよう取り組んでいます。JBoss ASやJBoss EAPの過去のリリースサイクルから判断すると、JBoss EAPが年内にJava EE 7の認定がなされるのではないかと思われます(ご存知ない方に対して補足すると、かつてのJBoss ASのように、JBoss EAPのための立ち上げプロジェクトがWildFlyです)。年内にJava EE 7ユーザーは6個を優に超えるfull compatible platformから選択できるようになることでしょう。
それゆえ、現在の質問は、誰がJava EE 7 compatibilityのフィニッシュラインを超えるのか、ということです。その人達だけがJava EE 8実装をスタートできるのですから。

[Database] Why does a PDB require an upgrade?

原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/why_does_a_pdb_require

version Aから外し、version Bへつなぎ直した時に、Pluggable Database (PDB) をアップグレード(もしくはダウングレード)しなければならない理由は何なのでしょう。
この質問は、Royと共にワークショップ中にUpgrades and Oracle Multitenantを説明する際によくいただく質問の一つです。
ドキュメントを見てみると、以下のような記述があります。
Oracle® Database概要 12cリリース1 (12.1)
マルチテナント・アーキテクチャの概要
CDBのデータ・ディクショナリ・アーキテクチャ
http://docs.oracle.com/cd/E57425_01/121/CNCPT/cdblogic.htm#CIHIBAIE
Oracle® Database Concepts 12c Release 1 (12.1)
Overview of the Multitenant Architecture
Data Dictionary Architecture in a CDB
http://docs.oracle.com/database/121/CNCPT/cdblogic.htm#CIHIBAIE


しかし残念ながらこれは全てのオブジェクトに対して完全にあてはまるとは言えません。
OBJ$のような基本ディクショナリ構造の簡単なクエリを実行すると、PDBが自身でデータディクショナリを持っていることが容易にわかります。実際にPDBとのみ紐付いているものがあります。例えば、DBA_OBJECTSSHARING列です。メタデータ・リンクの場合、DBA_OBJECTSCDB$ROOTにあるDBA_OBJECTSの親と情報を交換することを示しています。しかし、これはPDBが空のメタオブジェクトである、ということを意味するわけではありません。PDBには実際に表が存在しますし、領域を割り当てています。ご自身で確かめてみてください。他のオブジェクトが実際に領域を割り当てているように、PDB内のOBJ$に実際に同じ属性があることがわかるでしょう。しかし、PDBやCDB$ROOTにもセグメントを有しています。もちろんそのオブジェクト定義はPDBにも存在します。
  • CDB$ROOT
    OBJ$ in CDB$ROOT
  • PDB 
    OBJ$ in PDB
ということで、回答はシンプルです。
Pluggable Database (PDB) 自身がデータディクショナリを有しているので、異なるバージョン間を移送する場合、PDBのアップグレード(もしくはダウングレード)が必須です。自動的にアップグレードされることはありません。

2015年7月21日

[Cloud, WebCenter] Get to Know the Latest Feature Updates in Documents Cloud Service

原文はこちら。
https://blogs.oracle.com/webcenter/entry/get_to_know_the_latest

利用者や組織が何かをしなくてもアップデートを自動的に実施すため、Oracle Documents Cloud Serviceの利用者にとってはシームレスですが、とは言いつつも、最新のOracle Documents Cloud Serviceに追加された機能の詳細や、Oracleのクラウドコラボレーションソリューションが急速に業界のベンチマークとなりつつある理由を知りたい方がいらっしゃるかもしれません。弊社の製品エキスパートで製品管理チームメンバーである、Ellen Gravinaがご説明します。

Oracle Documents Cloud Serviceがアップグレードされました。Web、モバイル、デスクトップクライアント用の最新機能が追加されています。追加機能をいくつかご紹介しましょう。

Oracle Documents Presenter

みなさんのお客様や見込み客の方々に最大の効果と結果をもたらす美しいプレゼンテーションを!
  • PowerPointスライドの表示、PDFドキュメントのレビュー、動画の再生など、その他多くのプレゼンテーションフォーマットを利用できます。
  • すべてのプレゼンテーションがタブレットに保存されるので、WiFi Hot Spotを探し求める必要はありません。
  • プレゼンテーションをフォルダ内のマテリアルを編成してデスクトップで編集できます。フォルダの背景とアイコン画像を使用して、ブランドの外観をカスタマイズできます。

Multiple Account Support

  • 複数のアカウントでコンテンツを同期することができます。

  • 複数のアカウントでモバイルデバイスからコンテンツにアクセスすることができます。

Enhancements to Public Link Policy

  • 管理者はパブリックリンクに対し許可された最大限のロールを設定することができます。

  • フォルダ所有者はパブリックリンクをフォルダごとに無効化できます。

Customize Oracle Documents with Your Own Branding

  • ヘッダのロゴを変更できるようになりました。
  • ユーザー・ヘルプのリンク、フィードバックの共有リンク、クライアントアプリケーションのダウンロードに関する情報のリンクを管理できます。


iOS Touch ID Support

  • 指紋を使って自身のコンテンツを保護することができます。
  • ネイティブモバイルアプリケーションやOracle Documents Presenterアプリケーションで利用できます。

Access Version History from Your Mobile Device

  • ドキュメントの旧バージョンを閲覧できます。
  • 旧バージョンを削除できます。
  • 旧バージョンを現行バージョンに変更できます。

Enterprise Installation Support for Desktop Client

  • EXEファイルやMSIインストーラ・パッケージを使い、Desktop Sync Clientソフトウェアを複数のクライアントマシンに展開することができます。
  • Active Directoryのグループポリシーを使って、MSIインストーラを展開できます。
  • 詳細は管理者ガイドをご覧ください。

Learn More

もっと知りたい方は、Oracle Documents Cloud Service Getting Startページをごらんください。
Oracle Documents Cloud Service Get Started
http://docs.oracle.com/cloud/latest/documentcs_welcome/index.html
その他のソリューション情報やマーケット情報はOracle Documents Cloud Serviceのページにアクセスしてください。
Oracle Documents Cloud Service
https://cloud.oracle.com/documents

Questions?

サポートの問い合わせはOracle Supportへどうぞ。
My Oracle Support
https://support.oracle.com
フィードバックはいつでも歓迎します。是非Documents Cloud Serviceのディスカッションフォーラムへどうぞ。
Oracle Documents Cloud Service (OTNのコミュニティフォーラム)
https://community.oracle.com/community/cloud_computing/platform-as-a-service-paas/oracle-documents-cloud-service

2015年7月20日

[FMW, WLS] Accessing WebLogic Logs via REST

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/accessing_weblogic_logs_via_rest

WebLogic Server 12.1.3における最も重要な変化の一つが、RESTによる管理インターフェースの機能改善でしょう。Oracle ACE DirectorにしてWebLogicのエキスパートであるDr. Frank Munzがその変更のまとめて自身のブログで紹介してくれています。
New RESTful Management API in WebLogic 12.1.3
http://www.munzandmore.com/2014/ora/new-restful-management-api-in-weblogic-12-1-3
WLSTや管理コンソールのような既存のDevOps指向の機能に、さらにREST管理機能というすばらしい機能が追加されました。WebLogic Server 12.1.3のREST管理インターフェースで実現できる非常に興味深いものの一つとして、簡単に全てのWebLogic Serverのログにアクセスできる、ということです。Dr. Frank Munzは段階を追って別のエントリで実現方法を説明しています。是非ご一読ください。
Access WebLogic LogFiles with the RESTful Management Interface
http://www.munzandmore.com/2015/ora/log-files-restful-management
REST管理機能を学ぶ最適の方法が、ドキュメントをご覧いただくことであるのは言うまでもありません。
Oracle Fusion Middleware Oracle WebLogic Server RESTful管理インタフェース・リファレンス 12c (12.1.3)
http://docs.oracle.com/cd/E57014_01/wls/WLRMR/toc.htm
Oracle® Fusion Middleware RESTful Management Interface Reference for Oracle WebLogic Server(英語)
http://docs.oracle.com/middleware/1213/wls/WLRMR/index.html
(訳注)
ドキュメントに記載されているので詳細は説明しませんが、REST管理機能を有効化するには、まず、WebLogic Server管理コンソールのドメインの設定画面(左ペインのドメイン名をクリック)します。

右ペインのドメインの設定画面で[詳細]の[RESTful管理サービスの有効化]にチェックを入れます(再起動が必要です)。

このエントリで紹介しているように、サーバログにアクセスするには、
http://{host}:{port}/management/wls/latest/servers/id/{サーバ名}/logs/id/{ログ名}
でアクセスします。
例えば、管理サーバのサーバログにアクセスする場合、
http://{host}:{port}/management/wls/latest/servers/id/AdminServer/logs/id/ServerLog
というURLを使います。このURLでRESTクライアントからGETで呼び出すと、以下のような結果を得ることができます。

2015年7月15日

[Java, Certification] Still Celebrating Java?

原文はこちら。
https://blogs.oracle.com/certification/entry/1131_01

Java生誕20年を祝って、Java認定資格試験の受験料が今なら20%割引です。
Javaの認定資格を取得し、世界に向けて自身のスキルを示してください。
早速今日やりましょう!
  1. スキルレベルや経験に見合うJava認定資格試験を探しましょう。
    Java SE 研修コース & 認定資格
    http://education.oracle.com/pls/web_prod-plq-dad/ou_product_category.getPage?p_cat_id=267#tabs-3&intcmp=WWOUCERTBLOGPOST1131071415
  2. 受験のための準備やトピックを確認しましょう。
  3. Peason VUE社のWebサイトから受験登録しましょう。そのとき、20%割引のプロモーションコードJava20をお忘れなく!
    Peason VUEのWebサイト(英語)
    http://pearsonvue.com/oracle
    ピアソンVUEのWebサイト(日本語)
    http://www.pearsonvue.com/japan/IT/oracle_index.html
 このコードは全世界で有効で、有効期限は2015年12月31日までです。

Terms and Conditions

Oracle Certification’s 20% discount on all Java Certification Exams is available from May 20, 2015, through December 31, 2015. This offer cannot be combined with other Oracle Certification promotions or discounts. The offer does not apply to vouchers purchased from Oracle or Oracle resellers, only exam registrations paid for at Pearson VUE®. Exams must be taken within a Pearson VUE® Authorized Test Center. This offer is not applicable for exams taken within an Oracle Testing Center. Candidates must provide the 20% discount promotional code: Java20 at the time of registration.

Terms and conditions are subject to change without notice.

(訳注)
Terms and Conditionsはあえて原文のままにしています。