hylom'sWeblog

- hylom's blog
| about hylom / hylom.net | old contents | login

CentOS 7でMojoliciousを使う

posted on 2017/03/09 19:58:29

 最近PerlのWebアプリケーションフレームワークMojoliciousをずっと触っているのだが、CentOS 7の標準リポジトリやEPELではパッケージが提供されていないため、別の方法でインストールする必要がある。まあPerlモジュールなのでCPANを使うのが一般的なのだが、一般的なCentOS 7環境だと依存ライブラリが不足していてインストールに失敗する模様。たとえば次のように実行すると、テスト段階でエラーが出る。

# yum install cpan
# cpan -i Mojolicious

 ということで依存しているモジュールを調べたのだが、とりあえず以下のように2つのパッケージをインストールすれば解決するようだ。

# yum install perl-Digest-MD5 perl-IO-Compress.noarch
# cpan -i Mojolicious

Fedora 25のhttpd(Apache HTTP Server)でLet's Encryptを使う

posted on 2017/02/10 20:22:39

 Fedora 25では、httpdをインストールするとデフォルトで自己署名証明書を作成してSSLを有効にする設定になっている模様。そのため、certbotコマンドでLet's Encryptで証明書を取得しようとすると失敗するようだ。

# dnf install certbot
# certbot --apche
(...ここで設定を入力する)
Failed authorization procedure. test.hylom.net (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Failed to connect to <IPアドレス>:443 for TLS-SNI-01 challenge

 対策としては、まず/etc/httpd/conf.d/ssl.confをssl.conf.orgなどにリネーム後にhttpdを再起動してSSLをいったん無効にした後、certbotコマンドを実行すれば良い。

Windows環境でのRubyのSSLエラー対策(Windowsが管理するルート証明書を使う)

posted on 2016/12/09 19:24:38

 Windows環境でRubyを使う際、以下のようなエラーが出る場合がある。これはSSLアクセスに利用できる適切なルート証明書がないために発生する。

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect
returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLErro
r)

 対策としてはルート証明書を用意すれば良いのだが、ネットから安易にダウンロードしたくないという場合、「certmgr」というツールでWindowsが管理するルート証明書をエクスポートし、opensslコマンドでRubyが扱える形に変換して利用すれば良い。

 まずスタートメニューの「プログラムとファイルの検索」に「certmgr.msc」と入力してEnterキーを押す。certmgrが起動するので、左ペイン内の「信頼されたルート証明機関」-「証明書」を選択する。

 すると証明書一覧が表示されるので、右ペインをクリックし、Ctrl-A等を入力してすべての証明書を選択する。続いて右クリックしてコンテキストメニューの「すべてのタスク」-「エクスポート」メニューを選択する。「証明書のエクスポート ウィザード」が開くので、指示に従って進める。「エクスポートファイルの形式」では「PKCS #12」を選択し、「すべての拡張プロパティをエクスポートする」にチェックを入れておく。エクスポートされたファイルは.pfxという拡張子が付く。

 続いてこのファイルを引数に指定して次のようにopensslコマンドを実行する。Windowsにはデフォルトではopensslコマンドが含まれていないので、別途インストールするか、適当なLinuxマシンにエクスポートした.pfxファイルをコピーして実行しよう。

$ openssl pkcs12 -in <エクスポートしたファイル(.pfx)> -out <適当なファイル名.pem> -nodes

 これでRubyで扱える.pemファイルが出力される(参考:@ITの「*.pfxファイルからPEM形式で証明書や秘密鍵を取り出す」)。

 このファイルを適当な場所に保存し、SSL_CERT_FILE環境変数にそのパスを指定する。たとえばC:\Users\hylom\windows.pemとして保存した場合、以下のようになる。

$ set SSL_CERT_FILE=C:\Users\hylom\windows.pem

英語によるコミットメッセージ文例その3

posted on 2016/09/26 23:45:21

 英語でコミットメッセージを書くときにうまい表現が思い浮かばずに困ることがあるので、色々なリポジトリを見て使えそうな表現をメモしていこうという記事です。

 今回はlibreoffice/coreなどから。LibreOfficeはコミットメッセージのスタイルがバラバラ。行末ピリオドのあり/なしも統一されていない。

fails 〜 becase A

 Aのために〜が失敗する(sal: Mac OS X 10.8 fails test_log1p because its libc log1p() does not return -0.0 unmodified but as +0.0)。

That syntax is fine

 その文法は正しい(That syntax is fine with MSVC 2015 now)。

Remove code that's no longer used

 使われていないコードを削除(Remove code that's no longer used.)。

we shouldn't need explicit 〜

 明示的な〜は不要(we shouldn't need explicit lt_rtl_OUString, etc things anymore)。

Make A not B

 BではなくAを行うようにする(Make createDesktop return XDesktop, not Object)。

why this odd unused assignment thing

 この変な使われていない割り当て処理は何だ(why this odd unused assignment thing

It's called an A

 それはAと呼ばれる(It’s called an asterisk)。「star character」という記述を「asterisk」という記述に置き換えたコミット。

Wrong name on 〜

 〜に間違った名称がある(Wrong name on menu item)。

英語によるコミットメッセージ文例その2

posted on 2016/09/22 01:04:10

 英語でコミットメッセージを書くときにうまい表現が思い浮かばずに困ることがあるので、色々なリポジトリを見て使えそうな表現をメモしていこうという記事です。

 今回はtorvalds/linuxより。コミットメッセージは動詞で始めて、また最初を大文字にはせず、文末のピリオドは無しというスタイルです(そこそこ例外あり)。

Check for 〜

 〜をチェックする(mm: usercopy: Check for module addresses

Duplicate 〜

 〜を複製する(cgroup: duplicate cgroup reference when cloning sockets

Don't clear 〜

 〜を消去しない(mem-hotplug: don't clear the only node in new_node_page()

Only use〜

 〜だけを使う(drm: Only use compat ioctl for addfb2 on X86/IA64

A be not supported

 Aはサポートされない(IB/mlx4: Diagnostic HW counters are not supported in slave mode)。珍しく名詞から始まっているコミット。

Don't allow 〜

 〜を許可しない(IB/ipoib: Don't allow MC joins during light MC flush

Do validate 〜

 〜を検証する(perf/x86/intel/pt: Do validate the size of a kernel address filter

Ignore 〜

 〜を無視する(drm/i915: Ignore OpRegion panel type except on select machines

Require 〜

 〜を必要とする(fscrypto: require write access to mount to set encryption policy

Do not register 〜

 〜を登録しない(dwc_eth_qos: do not register semi-initialized device

Remove 〜

 〜を取り除く(nfp: remove linux/version.h includes

Drop support for 〜

 〜のサポートをやめる(nfp: drop support for old firmware ABIs

英語によるコミットメッセージ文例その1

posted on 2016/09/21 01:20:38

 英語でコミットメッセージを書くときにうまい表現が思い浮かばずに困ることがあるので、色々なリポジトリを見て使えそうな表現をメモしていこうという記事です。

 今回はWordPress/WordPressより。コミットメッセージは動詞で始め、最後にピリオドを付けるというスタイルです。

Correct 〜

 〜を修正する(Docs: Correct the description of `{$taxonomy}_term_new_form_tag` hook, making it more consistent with other `*_form_tag` hooks.)。

Make A 〜

 Aを〜にする(Media: Make media library searchable by filename.)。続く説明文で使われているapply A to B(AをBに適用する)も使えそう。

Let A be 〜

 Aを〜にする(Customize: Let `static_front_page` section be contextually active based on whether there are any published pages.)。

Avoid 〜

 〜を回避する(XML-RPC: Avoid a PHP notice in `::pingback_ping()` if page title was not found.)。

Ensure 〜

 〜を確実にする(Customize: Ensure nav menu items lacking a label use the title from the original object.)。

Improve 〜

 〜を改良する(Media: Improved media titles when created from filename.)。

Enable A to 〜

 〜するようAを有効にする(REST API: Enable sanitize_callback to return WP_Error.)。

Adjust 〜

 〜を調整する(Media: Adjust `test_video_shortcode_body()` after [38597].)。

Implement 〜

 〜を実装する(Customize: Implement previewing of form submissions which use the GET method.)。

Eliminate 〜

 〜を取り除く(Query: Eliminate unnecessary `wp_list_filter()` call in `get_queried_)。

Prevent A from 〜

 Aを〜から防ぐ(Menus: Prevent non-published posts/pages from being returned in search results for adding as nav menu items)。

Sanitize 〜

 〜をサニタイズする。サニタイズは不要な情報を取り除くこと(Media: Sanitize upload filename.)。

Split 〜

 〜を分割する(Role/Capability: Split meta and primitive capabilities in the helper functions in the roles and capability tests so primitive capability tests can be made more accurate.

Deprecate 〜

 〜を廃止する(Multisite: Deprecate `wp_get_network()`.)。

Don't do 〜

 〜しないようにする(Comments: Don't do direct SQL query when fetching decendants.)。

CentOS 7で「firewalld --permanent --change-interface」コマンドが動作しない問題の解決法

posted on 2016/07/12 19:57:27

 CentOS 7のfirewalldで特定のネットワークインターフェイスを特定のゾーンに関連付けるには、「firewall-cmd --zone=<ゾーン> --change-interface=<インターフェイス>」コマンドを使えとmanページに書いてある。このコマンド自体は正常に働くのだが、設定を永続的に保存するための「--permanent」オプションがうまく動かない。具体的には、firewalldを再起動すると設定が消えてしまう。

 実は、CentOSの元になっているRed Hatの「Bug Fix Advisory firewalld bug fix and enhancement update(2015年3月5日付け)を見ると、「The "--permanent --add-interface" option is supposed to be used only for interfaces that are not managed by the NetworkManager utility」と書いてある。つまり、nmtuiなどのツール経由で設定された、NetworkManager下で管理されているネットワークインターフェイスについては、--add-interfaceや--change-interfaceオプション利用時に--permanentオプションを指定しても効果が無いようだ。

 対処策としては、NetworkManager側でネットワークインターフェイスとゾーンの対応付けを行えば良い。ただし、nmtuiコマンドではゾーンの設定項目が無いため、nmcliコマンドでの設定が必要となる。

 まず、「nmcli c」コマンドで認識されているネットワークコネクションを確認する。

# nmcli c
名前                UUID                                  タイプ          デバイス
Wired connection 1  d2ee88e7-2e1c-4168-a1ad-8bd5b6ac4db3  802-3-ethernet  eth1
System eth0         5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  802-3-ethernet  eth0

 ネットワークコネクションの詳細設定は「nmcli c show <コネクション名>」で確認できる。

# nmcli c show "Wired connection 1"
connection.id:                          Wired connection 1
connection.uuid:                        d2ee88e7-2e1c-4168-a1ad-8bd5b6ac4db3
connection.interface-name:              --
connection.type:                        802-3-ethernet
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.timestamp:                   1468320004
connection.read-only:                   no
connection.permissions:
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:
connection.gateway-ping-timeout:        0
connection.metered:                     不明
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          yes
802-3-ethernet.mac-address:             9C:A3:BA:28:8B:E2
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.mac-address-blacklist:
802-3-ethernet.mtu:                     自動
802-3-ethernet.s390-subchannels:
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:
802-3-ethernet.wake-on-lan:             1 (default)
802-3-ethernet.wake-on-lan-password:    --
ipv4.method:                            manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:                         192.168.1.10/24
ipv4.gateway:                           --
ipv4.routes:
ipv4.route-metric:                      -1
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.never-default:                     yes
ipv4.may-fail:                          yes
ipv6.method:                            auto
ipv6.dns:
ipv6.dns-search:
ipv6.addresses:
ipv6.gateway:                           --
ipv6.routes:
ipv6.route-metric:                      -1
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.ip6-privacy:                       -1 (不明)
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --
GENERAL.名前:                           Wired connection 1
GENERAL.UUID:                           d2ee88e7-2e1c-4168-a1ad-8bd5b6ac4db3
GENERAL.デバイス:                       eth1
GENERAL.状態:                           アクティベート済み
GENERAL.デフォルト:                     いいえ
GENERAL.デフォルト6:                    いいえ
GENERAL.VPN:                            いいえ
GENERAL.ゾーン:                         --
GENERAL.DBUS パス:                      /org/freedesktop/NetworkManager/ActiveConnection/679
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/Settings/1
GENERAL.スペックオブジェクト:           /
GENERAL.マスターパス:                   --
IP4.アドレス[1]:                        192.168.1.10/24
IP4.ゲートウェイ:
IP6.アドレス[1]:                        fe80::9ea3:baff:fe28:8be2/64
IP6.ゲートウェイ:

 ここで、「connection.zone」というのがゾーン設定になる。デフォルトではゾーンが指定されていないが、これを変更するには「nmcli c mod <コネクション名> <設定対象> <設定する値>」コマンドを実行する。たとえば、eth1を「internal」ゾーンに指定する場合は次のようになる

# nmcli c mod "Wired connection 1" connection.zone internal

 これでfirewalldを再起動すると、eth1がinternalゾーンに割り当てられるようになる。

# systemctl restart firewalld
# firewall-cmd --get-active-zones
internal
  interfaces: eth1
public
  interfaces: eth0

JenkinsでLet's encryptのSSL証明書を使う

posted on 2016/07/05 22:00:58

 Let's encryptで取得したSSL証明書をJenkinsで使おうとしてハマったので解決法のメモ。

 基本的にはhttps://issues.jenkins-ci.org/browse/JENKINS-22448に書いてあるとおり。まず、次のようなconvert.shを作る。

#!/bin/bash

HOST=<ホスト名>
KEY_PEM=/etc/letsencrypt/live/$HOST/privkey.pem
CERT_PEM=/etc/letsencrypt/live/$HOST/cert.pem
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
KEYSTORE=/var/lib/jenkins/keystore

# convert ky
openssl rsa -des3 -in $KEY_PEM -out key.encrypted.pem
openssl pkcs12 -inkey key.encrypted.pem -in $CERT_PEM -export -out keys.encrypted.pkcs12
keytool -importkeystore -srckeystore keys.encrypted.pkcs12 -srcstoretype pkcs12 -destkeystore $KEYSTORE

 このconvert.shをroot権限で実行すると、/var/lib/jenkins/keystoreというファイルができる。ついでにカレントディレクトリにいくつかの中間ファイルができるが、それは削除してOK。

 次にJenkinsのサーバー設定ファイル(Ubuntuなら/etc/default/jenkins)内の「JENKINS_ARGS」付近を以下のように変更する。

HTTPS_KEYSTORE=/var/lib/jenkins/keystore
HTTPS_KEYSTORE_PASSWORD=<適当なパスワード>
HTTPS_PORT=8443
HTTPS_OPT="--httpsKeyStore=$HTTPS_KEYSTORE --httpsKeyStorePassword=$HTTPS_KEYSTORE_PASSWORD --httpsPort=$HTTPS_PORT"

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT $HTTPS_OPT"

 これでJenkinsを再起動すればhttps://<ホスト名>:8443/での待ち受けが可能。鍵を更新したら毎回この作業が必要なので適当にcronで回すのがよさそう……なんだけど、途中でパスワードの入力を求められるのでそこら辺を自動化しないといけません。

ECMAScript 2015(ES6)でのクラス定義におけるclassキーワードとfunctionキーワードの違い

posted on 2016/06/07 00:58:08

 ECMAScript 2015では、新たにクラスを定義するためのclassキーワードが導入されている。MDNで提供されているドキュメントの「Classes」ページでは、「ECMAScript 6 で導入されたクラス構文は、既存のプロトタイプによるオブジェクト指向の糖衣構文です」と記述されている。しかし、厳密にチェックするとclassキーワードで定義したクラスとfunctionキーワードで定義したクラスは(実用上問題ないレベルで)挙動が微妙に異なる。その違いを検証してみよう。なお、検証に使用した環境はNode.js v6.2.1である。

$ node -v
v6.2.1

宣言方法の違い

 functionキーワードを使ってクラスを定義する場合、次のようにコンストラクタとしてクラス名を持つ関数を定義するのが一般的だ。

> function VectorFunction(x, y) {
... this.x = x;
... this.y = y;
... }
undefined

 いっぽうclassキーワードを利用する場合、次のようにconstructor関数を使ってクラスのコンストラクタを定義する。

> class VectorClass {
... constructor(x, y) {
..... this.x = x;
..... this.y = y;
..... }
... }
[Function: VectorClass]

 classキーワードを利用した場合でも、作成されるのはあくまでFunctionオブジェクト(=関数)である。

newキーワードなしで実行した際の挙動の違い

 これらのクラスのインスタンスを作成するには、この関数をnewキーワード付きで実行する。

> v1 = new VectorFunction(3, 4)
VectorFunction { x: 3, y: 4 }
> v2 = new VectorClass(3, 4)
VectorClass { x: 3, y: 4 }

 この挙動はどちらの場合も同じだ。しかし、newキーワード無しでクラスを関数として実行した場合、functionキーワードを使って定義したクラスとclassキーワードを使って定義したクラスは挙動が異なる。

 functionキーワードを使って定義したクラスは、newキーワード無しで関数として実行すると意図しない結果を生み出すことがある。なぜなら、newキーワード無しで関数を実行した場合、this変数にglobalオブジェクト(strict modeの場合はundefined)が渡されるからだ。

 たとえば今回のケースでは、非strict modeの場合グローバルオブジェクトのプロパティが勝手に変更されてしまう。

> x = 0
0
> y = 0
0
> v1 = VectorFunction(3, 4)
undefined
> x
3
> y
4

 いっぽう、classキーワードで定義したクラスはそのまま実行することはできず、TypeErrorが発生する。

> v2 = VectorClass(3, 4)
TypeError: Class constructor VectorClass cannot be invoked without 'new'
    at repl:1:6
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:224:10)
    at REPLServer.Interface._line (readline.js:566:8)
    at REPLServer.Interface._ttyWrite (readline.js:843:14)

 ECMA-262の「14.5.14 Runtime Semantics: ClassDefinitionEvaluation」および「9.2.9 MakeClassConstructor(F)」で説明されているが、classキーワードでクラスを定義した場合、生成されたFunctionオブジェクトの「FunctionKind」内部スロットに「classConstructor」という値がセットされる。この内部スロットはFunctionオブジェクトの種別を格納するもので、「normal」および「classConstructor」、「generator」のいずれかを持つ(「9.2 ECMAScript Function Objects」)。FunctionKind内部スロットの値がclassConstructorの場合、関数を実行する際に実行される「Call」内部メソッドの実行時にTypeError例外が送出される(「9.2.1 [[Call]] ( thisArgument, argumentsList)」)。なお、FunctionKind内部スロットの値がclassConstructorになるのは、classキーワードでクラスを定義した場合のみである。

所有するプロパティの違い

 classキーワードで定義したクラスは、functionキーワードで定義したクラスと異なり「caller」および「arguments」プロパティを持たない。

> Object.getOwnPropertyNames(VectorFunction)
[ 'length', 'name', 'arguments', 'caller', 'prototype' ]
> Object.getOwnPropertyNames(VectorClass)
[ 'length', 'name', 'prototype' ]

 また、classキーワードで定義したクラスのprototypeプロパティはwritableではないが、functionキーワードで定義したクラスのprototypeプロパティはwritableである。

> Object.getOwnPropertyDescriptor(VectorFunction, "prototype")
{ value: VectorFunction {},
  writable: true,
  enumerable: false,
  configurable: false }
> Object.getOwnPropertyDescriptor(VectorClass, "prototype")
{ value: VectorClass {},
  writable: false,
  enumerable: false,
  configurable: false }

 もちろん、どちらの場合もprototypeオブジェクトにプロパティ/メソッドを追加することは可能だ。

> VectorFunction.prototype.norm = function () {
... return Math.sqrt(this.x * this.x + this.y * this.y);
... }
[Function]
> VectorClass.prototype.norm = function () {
... return Math.sqrt(this.x * this.x + this.y * this.y);
... }
[Function]

 このようにして定義したメソッドは、どちらも同じように実行することが可能だ。

> v1 = new VectorFunction(3, 4)
VectorFunction { x: 3, y: 4 }
> v1.norm()
5
> v2 = new VectorClass(3, 4)
VectorClass { x: 3, y: 4 }
> v2.norm()
5

functionキーワードを使ったクラス宣言でしかできないこと

 classキーワードを使ってクラスを宣言すると、そのクラス自体を関数として実行することができなくなる。多くの場合でこのこと自体にデメリットはないが、意図的に(newキーワードなしに)クラスを関数として実行したいというケースも考えられる。たとえば次の例は、strict modeではnewキーワード無しにクラスを関数として実行した場合にthis変数がundefinedになることを利用し、newキーワード付きで実行した場合とnewキーワード無しで実行した場合とで異なる処理を行わせるものだ。

$ node --use_strict
> function Vector(x, y) {
... if (this === undefined) {
..... return new Vector(x, y);
..... }
... this.x = x;
... this.y = y;
... }
undefined
> Vector(3, 4)
Vector { x: 3, y: 4 }
> new Vector(3, 4)
Vector { x: 3, y: 4 }

 このようにして定義したVectorクラスは、newキーワードがあっても無くとも同様にVectorクラスのインスタンスを返す。

ECMAScript 2015の仕様書を読む(その22)

posted on 2016/06/01 01:27:24

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は付録について(付録A、D、Eについては詳細な内容は割愛)。

付録A

 文法まとめ。本編で説明されている文法がここでまとめられている。とりあえずここを見れば記述可能な文法が分かる。

付録B

 Webブラウザ向けの追加機能について。本来推奨されないが、Webブラウザ上で実行されるコードの互換性を保つために規定されているもので、Webブラウザ以外のECMAScript実行環境では実装しなくてもよい。また、これらはstrict modeでは利用できない。

 規定されているのは下記。

  • 数値リテラルにおける0で始まる8進数表記(本来であれば8進数表記は0Oで始まる必要がある)
  • 8進数表記を使ったエスケープシーケンス(バックスラッシュに続けて[0-8]もしくは[0-3][0-8]、[0-4][0-8]、[0-3][0-8][0-8])
  • HTML風コメント(<!--、-->を利用するもの)
  • Unicodeの基本多言語面(BMP)に関連する正規表現パターン
  • グローバルオブジェクトのescape(string)およびunescape(string)プロパティ
  • Object.prototype.__proto__
  • String.prototype.substr(start, length)
  • String.prototypeのanchor、big、blink、bold、fixed、fontcolor、fontsize、italics、link、small、strike、sub、supメソッド
  • Date.prototypeのgetYear、setYear、toGMTStringメソッド
  • RegExp.prototypeのcompileメソッド
  • オブジェクトの初期化時における__proto__プロパティの利用
  • ラベルを使った関数定義
  • ブロックレベルでの関数定義
  • ifステートメント内での関数定義
  • catchブロック内での重複した変数定義

 なお、escapeプロパティは[A-Za-z0-9@*_+-./]をURLエンコードする。

付録C

 ECMAScriptにおけるstrict modeについて。strict modeでは非strct modeと下記が異なる。

  • 予約語にimplements、interface、let、private、protected、public、static、yieldが追加されている
  • 付録Cで定義されているWebブラウザ向けの互換性維持のための文法や機能が利用できない
  • 宣言されていない識別子や参照先が存在しないリファレンスがグローバルオブジェクトのプロパティとして生成されない
  • 各種構文でeval、argumentsを左手側に置くことはできない
  • 関数内で引数が格納されるオブジェクト(argumentsオブジェクト)のcallerやcalleeプロパティ
  • argumentsオブジェクトに格納されている値と引数として渡される値は別
  • argumentsオブジェクトは変更不可
  • 「識別子 eval」や「識別子 arguments」はSyntaxErrorとなる
  • eval内ではそれを呼び出した環境の変数や関数のインスタンスを生成できない
  • thisの値がnullやundefinedだった場合、これらがグローバルオブジェクトに置き換えられることはく、またプリミティブ値が対応するラッパーオブジェクトに変換されることはない
  • 値や関数引数、関数名に対するdelete演算子の利用がSyntaxErrorに
  • Configurableでないプロパティに対するdelete演算子の利用がSyntaxErrorに
  • with文は利用できない
  • try〜catch文でcatchを構成する識別子がevalやargumentsだった場合、SyntaxErrorに
  • 関数定義の歳の引数パラメータで同じものを2つ以上使うとSyntaxErrorに
  • 関数のcallerやargumentsプロパティについてこの仕様書で規定されている以外の拡張をすべきではない

付録D

 過去のバージョンのECMAScriptから挙動が修正された点について。

付録E

 過去のバージョンのECMAScriptとは互換性のない変更について。