プロトタイプベースとクラスベース
C++、Javaのようにクラス-インスタンスという概念を使用するオブジェクト指向言語のことを、クラスベースオブジェクト指向言語(Class Based Object Oriented Language)と言います。
それとは異なり、JavaScriptでは、クラス-インスタンスという考え方をせず、オブジェクトは別なオブジェクトを元(プロトタイプ)にして独自の特徴を付加することで存在する、という考え方をします。
このようなオブジェクト指向言語のことを、プロトタイプベースオブジェクト指向言語(Prototype Based Object Oriented Language)と言います。
JavaScriptでは、オブジェクト自身が独自の特徴を付加するので、オブジェクトにプロパティを追加したり削除したりすることができます。
コンストラクタという機構
JavaScriptでオブジェクトを生成するには、コンストラクタとnewという演算子を使用します。
実はコンストラクタとは関数オブジェクトの事です、全ての関数はオブジェクトを生成するコンストラクタになる可能性がありますが、まずは一番シンプルな例を見てください。
単純なコンストラクタ
function SimpleConstructor() {} var obj = new SimpleConstructor();
普通にfunction文で定義した関数にnewをつけて呼び出しているだけです。こうすることで、新しいオブジェクトが生成され、戻り値として返されます。
return文を記述しなくても生成されるオブジェクトが返される事に注意してください。
通常、コンストラクタとして呼ばれる関数の中では、生成しようとするオブジェクトの初期化を行います。
function PropSetConstructor() { this.prop1 = 10; this.prop2 = 20; } var obj1 = new PropSetConstructor(); alert(obj1.prop1); // 10 と表示される。 var obj2 = new PropSetConstructor(); alert(obj2.prop1); // 10 と表示される。
コンストラクタとして関数オブジェクトを実行した場合、thisには今新たに生成されようとしているオブジェクトが入ります。
従って、thisにプロパティを設定してやれば、newして作成されるオブジェクトの初期定義を行う事ができます。
こうする事で、同じコンストラクタを用いて複数のオブジェクトを生成すると、同じプロパティを持つオブジェクトを簡単に作成する事ができます。
もちろんdelete演算子を使用すればプロパティを削除できるので、同じコンストラクタから作成されても常に必ず同じプロパティを持つとは限らない事に注意してください。
暗黙の参照
プロトタイプベースのオブジェクト指向言語では、オブジェクトトは別のオブジェクトをプロトタイプとしてできていると考えます。JavaScriptではこれを暗黙の参照という形で実現している。オブジェクトAをプロトタイプとしているオブジェクトBは、オブジェクトAに対し暗黙の参照を持っているという状態になります。
Javaで言うなれば、非staticなinner classのインスタンスがenclosing classのインスタンスに対し、暗黙の参照を持っている状態を考えてもらえば良いです。つまりしたのような状態になります。
暗黙の参照:
var objectA = ... // objectB は objectA に対し暗黙の参照を持っている // (objectAはobjectBのプロトタイプである)。 var objectB = ... objectA.hoge = 10; // objectA の hoge プロパティをここで設定する。 alert(objectB.hoge); // 10 と評価される。
すなわち、あるオブジェクトがプロパティを評価された時、自分自身がそのプロパティを持っていなければ、暗黙の参照をたどって、その先のオブジェクトのプロパティを評価します。
これがJavaScriptにおけるプロトタイプの仕組みです。
prototypeオブジェクト
全ての関数オブジェクトはprototypeというプロパティを保持している。関数オブジェクトを定義した直後では、このprototypeには何もプロパティを持たないシンプルなオブジェクトを参照しているが、別のオブジェクトを代入したり、新たなプロプロパティを設定したりする事が可能です。
その関数オブジェクトをコンストラクタとして生成されたオブジェクトは、コンストラクタのprototypeプロパティに代入されているオブジェクトに対し、暗黙の参照を持つのです。つまりprototypeが指すオブジェクトトがプロトタイプとなるというわけです。
具体的にコードは以下:
prototypeオブジェクト
function PrototypeTestConstructor() {} // prototype オブジェクトに prop1 というプロパティを設定。 PrototypeTestConstructor.prototype.prop1 = 30; var obj = new PrototypeTestConstructor(); alert(obj.prop1); // 30 と表示される。
つまりPrototypeTestConstructorによって生成されたオブジェクトは、PrototypeTestConstructor.prototypeが指すオブジェクトを暗黙的に参照するようになります。
あるコンストラクタをnewしてできるオブジェクトが全てそのprototypeへの暗黙の参照を持つので、そのプロパティはクラス変数の様にnewされたオブジェクトで共有されることとなる。次の例を見てください。
代入はprototypeをたどらない。
function Constructor() {} Constructor.prototype.prop1 = 30; var objA = new Constructor(); var objB = new Constructor(); // [α] alert(objA.prop1) // 30 と表示される。 alert(objB.prop1) // 30 と表示される。 objA.prop1 = 100; // [β] alert(objA.prop1) // 100 と表示される。 alert(objB.prop1) // 30と表示される
というのも、読み取り評価の時は、暗黙の参照をたどるのですが、代入やdelete演算子は、たどらないのである。従って、objA.prop1 = 100;を行った時点で、objAそのものにprop1というプロパティが新たに作られ、そこに100が代入されるのです。よってConstructor.prototype.prop1の値は変わらないままとなります。
この場合、objA.prop1を呼び出すと、objA自身にはprop1があるため、その値である100と評価され、objB.prop1を呼び出すと、暗黙の参照をたどり30と評価されます。
この仕組みがプロトタイプベース言語であるJavaScriptのオブジェクトの根幹となります。
プロトタイプチェーン
コンストラクタのprototypeには、オブジェクトも代入できるので、prototypeに代入したオブジェクトが別のオブジェクトをプロトタイプにしている事もあります。そもそも全てのオブジェクトはObject.prototypeを暗黙的に参照しています。
こうしたプロトタイプの連鎖のことをプロトタイプチェーンと呼びます。
プロトタイプチェーン:
var objA = new Object(); objA.prop1 = 10; function Func1() {} Func1.prototype = objA; var objB = new Func1(); function Func2() {} Func2.prototype = objB; var objC = new Func2(); alert(objC.prop1); // 10 と評価される。
以上までがJavaScriptのプロトタイプのメカニズムです。JavaやC++といったクラスベースの言語には根本的に無い考え方なので若干戸惑うかも知れないが、全てのオブジェクトがが実体を持った別のオブジェクトトに連鎖しているということが分かれば整理できます。
ではあるオブジェクトのプロパティを評価した際、仮に何らかの値が返ってきたとしても、そのオブジェクト自身がプロパティを持っているのか、そのオブジェクトのプロトタイプが持っているのか、判断することができません。 そこで、JavaScriptでは全てのオブジェクトに(すなわちObject.prototypeに)、hasOwnPropertyというメソッドが定義されている。これは引数で与えた文字列に一致するプロパティを、そのオブジェクト自身が持っているかどうかを判断してくれるメソッドです。 具体例を見てください。
function Constructor() {} Constructor.prototype.prop1 = 30; var objA = new Constructor(); // objA 自体は持っていないので false。 alert(objA.hasOwnProperty("prop1")); objA.prop1 = 100; // objA 自体が持っているので true。 alert(objA.hasOwnProperty("prop1"))
このhasOwnPropertyメソッドを使うことで、そのオブジェクトト自身にプロパティがあるかどうかを判断することができます。
継承
継承に関して言えば、 JavaScript には 1 つだけオブジェクトに関する概念があります。あるオブジェクトはプロトタイプと呼ばれる、他のオブジェクト(または null )への内部的な繋がりを持ちます。このオブジェクトは、あるオブジェクトがそのプロトタイプとして null を持つまで、なおプロトタイプを持ちます。このような、オブジェクトが他のオブジェクトのプロトタイプとなることの連鎖を、プロトタイプチェーンと呼びます。
プロパティの継承
JavaScript のオブジェクトはプロパティ(自身のプロパティを指す)の動的な「かばん」で、プロトタイプオブジェクト(または null )への繋がりを持っています。 あるオブジェクトにプロパティをセットすると、自身のプロパティが作られます。この取得と設定の動作の規則の唯一の例外は、 getter または setter とのプロパティの継承が起こるときです。
「メソッド」の継承
JavaScript それ自体に「メソッド」はありません。 JavaScript には関数があり、これらの関数はプロパティの値として使用することができます。 関数の継承(メソッドのオーバーライドの一種)は、上で見せたような property shadowing を含めたどのような値とも、同じように働きます。
関数がオブジェクトのプロプロパティ(自身の、または継承された)であることのたった1つの違いは、関数が実行されるときの this の値です。
JavaScriptは 最初は Sun Microsystems社とNetscape Communications社が開発した、 Webブラウザなどでの利用に適したスクリプト言語です。ブラウザ以外のソフトウェアにも簡易な制御プログラムの記述用言語として移植されており、 Microsoft社のWindowsやMacromedia社の「Flash」などがあります。
各社の実装に微妙な違いがあり、ブラウザによって使えない機能があったり同じプログラムでも挙動が異なったりする問題があったため、ヨーロッパの標準化団体ECMAがソフトウェアメーカーに呼びかけて、通称「ECMAScript」と呼ばれる標準を発行しました。2014年5月現在ECMAScriptの最新バージョンは2009年12月に策定されたECMAScript 5th Editionで6th editionの策定も進みつつあっています。
JavaScriptとECMAScript
以下の表でJavaScriptとECMAScriptのバージョン対応を示します。
JavaScriptバージョン | 公開日 | ECMAScriptとの対応 |
---|---|---|
1.0 | 1996/03 | - |
1.1 | 1996/08 | - |
1.2 | 1997/07 | - |
1.3 | 1998/10 | edition 1 edition 2 |
1.4 | 廃棄 | |
1.5 | 2000/11 | edition 3 |
1.6 | 2005/11 | |
1.7 | 2006/10 | |
1.8 | 2008/06 | |
1.8.5 | 2010/07 | edition 5 |
1.8.6 | - | - |
2.0 | - | edition 6 |
主要ソフトウェアのJavaScript対応
以下の表で主要ソフトウェアのバージョン毎のJavaScript対応を示します。
ソフトウェア | バージョン | 呼称 | 対応するJavaScriptバージョン |
---|---|---|---|
Chrome | 33 | JavaScript | 1.7 |
Firefox | 1.0 | JavaScript | 1.5 |
1.5 | 1.6 | ||
2.0 | 1.7 | ||
3.0 | 1.8 | ||
4 | 1.8.5 | ||
17 | 1.8.6 | ||
IE | 6 | JScript5.6 | 1.5 |
7 | JScript5.7 | ||
8 | JScript5.8 | ||
9 | JScript? | 1.8.5 | |
Adobe Acrobat | 11 | JavaScript | 1.5? |
Javascriptは、ほかの言語と比べると、以下のような特徴を持っております。
完全なオブジェクトベース
JavaScriptでは、数値や文字列、配列、関数などのデータはすべてオブジェクトです。例えばStringオブジェクトは文字列の長さを返すlengthというプロパティを持っていますので、“Hi,world!”.lengthを参照すると、 9がリターン値になります。
JavaScriptのオブジェクトは、単純に言うと「キーと値のペアの集合」です。ですので、これは一般的なプログラミング言語でよくあった連想配列の性質を持っていると言えます。
プロトタイプを使ったオブジェクト指向
Java や C++ といったクラスベースのオブジェクト指向言語はクラスとインスタンスという、2つの異なる実体があるという概念に基づいています。
クラスはあるオブジェクトの集合を特徴付けるすべてのプロパティ(Java ではメソッドとフィールドを、C++ ではメンバをプロパティと見なす)を定義します。
クラスとはそれが表すオブジェクトの集合という抽象的なものです、例えば、Employeeクラスは従業員すべてを含む集合を現します。
一方、インスタンスはクラスを実例にしたものです、例えば、Victoriaさんは、Employeeクラスのインスタンスとなることができます。
JavaScriptのオブジェクト指向は、プロトタイプを利用しています。クラス/インスタンスの区別がなく、単にオブジェクトがあるだけです。但し、原型的なオブジェクトという概念がありまして、このオブジェクトは新しいオブジェクトの初期プロパティを取得する元になるテンプレートとして使用されます。
どのオブジェクトも、作成時にも実行時にもそれ独自のプロパティを指定できます。さらに、どのオブジェクトも別のオブジェクトに対するプロトタイプとして関連付けることができます。
関数型プログラミングの一部サポート
JavaScriptでは関数型言語の一部の機能が備わっています。関数型言語それ自体は難しいかも知れませんが、JavaScriptで関数型を考えるにあたっては、下記三点を抑えられればよいです。
- すべての関数が値を返す
- 関数に副作用がない(参照透過)
- 関数を値として扱える
すべての関数が値を返す
すべての関数は値を返します、明示的な実装がなければ、返却値はundefinedになります。
関数に副作用がない
簡単に考えると、下記2点となります。
- 関数は外側の変数を変更しない
- 参照渡しの引数の値を変更しない
関数が値として扱える
関数が値として扱えるので引数に関数を渡して処理を委譲、もしくは、関数を返り値として処理を委譲する事もできます。
これらの関数を高階関数と言います。
さらに、関数は、すべてクロージャであり、定義された時の環境への参照をもっているため、クロージャの性質を利用して、JavaSript固有のざまざまなカプセル仕組みを実現することができます。
JavaScriptはよく、「少ないソースコードで高機能のロジックを簡潔に実現できる」プログラミング言語として高く評価されていますが、これは、ほとんどこの関数のパワーからできているものと考えれます。
iOS(アイオーエス)は、アップルが開発・提供するOSシーリズです。iPhone、iPod touch、iPad、iPad mini、Apple TVに搭載されています。
元はiPhone OS(アイフォーン オーエス)という名前だったが、2010年6月21日にリリースされたバージョン4.0からは現在のiOSという名称に変更されました。
タイムライン
年月 | 出来事 |
---|---|
2007年6月 | iPhone OS公開 |
2008年7月 | iPhone OS 2公開、AppStore搭載 ソフトバンクからiPhone OS 2が搭載されたiPhone3Gが発売 |
2009年6月 | iPhone OS 3公開 ソフトバンクからiPhone OS 3が搭載されたiPhone3GSが発売、日本で爆発的にiPhoneが流行 |
2010年6月 | iOS4公開、マルチタスクサポート |
2011年10月 | iOS5公開、Siriサポート、iCloud連携 |
2012年9月 | iOS6公開、Apple製の地図アプリ内蔵 |
2013年9月 | iOS7公開、スキュモーフィズムからフラットデザインへ変更 |
2014年9月 | iOS8公開、ファミリー共有機能 |
2015年 | iOS9公開、3D Touch登場 |
2016年 | iOS10公開、日本でもApple Payが利用可能に |
2017年 | iOS11公開、カメラ機能の強化とアニ文字 |
2018年 | iOS12公開 |
Windowsとは、Microsoft社のOSのシリーズ名です。
主な歴史
バージョン1.0は1986年に発売され、1992年に発売されたWindows 3.1がPC/AT互換機用の標準OSとして爆発的に普及しました。
クライアント版のOSとして、その後継のWindows95、Windows98、WindowsMeともMS-DOSを土台にしております。
一方、1993年から発売が開始されたWindows NTシリーズはネットワークサーバ用途を前提に0から開発された、APIレベルでは互換性を持っていながら基本構造がWindows3.x/9xと全く異なるOS系列です。
暫くクライアント版の9x系列とサーバ版のNT系列と共存の時代でしたが、Windows2000からクライアント版のWindowsもNTベースのシステムを採用するようになりました。
この結果、Windows 95/98/Meで採用された9xカーネルベースの製品は現在は存在しません。
2019年現在の最新版は、クライアント版はWindows 10、サーバ版はWindows Server 2019、モバイル版はWindows 10 Mobileです。
タイムライン
下記の表にてWindowsのタイムラインを示します。
年代 | 出来事 |
---|---|
1982~1985年 | Windows 1.0 の登場 |
1987~1990年 | Windows 2.0 ~ 2.11 - より多いウィンドウ、より速いスピード |
1990~1994年 | Windows 3.0 ~ Windows NT - いよいよグラフィックスへ |
1995~1998年 | Windows 95 - PC とインターネットの時代の到来 |
1998~2000年 | Windows が仕事と遊びのために、Windows 98、Windows 2000、そして Windows Me へと進化 |
2001~2005年 | Windows XP - 安定性、使用便利性、高速 |
2006~2008年 | Windows Vista - セキュリティでスマートに |
2009~2011年 | Windows 7 で Windows タッチを導入 |
2012年 | Windows 8 がアプリとタイルを特色に |
2013年 | Windows 8.1 が Windows 8 のビジョンを拡大 Windows Server 2012 R2 |
2015年 | Windows 10 Windows 10 mobile Windows 10 IoT |
2016年 | Windows Server 2016 |
2018年 | Windows Server 2019 |
銀行の主な業務は以下のように分類することができます。
- 固有業務
銀行法で定められた銀行の本業で、銀行の3大業務と呼ばれている「預金業務」「融資業務」「為替業務」から構成されます。- 預金業務
たくさんの預金者から預金という形でお金を集める業務です。 - 融資業務
資金を必要としている会社などに貸し付ける業務です。 - 為替業務
給料や年金の受け取りや、電気代・水道代といった公共料金の支払いなど、会社や個人などの依頼に基づいて、お金を送金したり受け取ったりする業務です、決済業務ともいいます。
- 預金業務
- 付随業務
固有業務以外で銀行法で定められている業務です。以下のような業務があります。- 債務保証
- 社債の募集委託
- 手形引受
- 周辺業務
固有業務以外で銀行法で定められいない業務です。以下のような業務があります。- クレジットカード
- 信用保証
- 貸金庫
銀行は以下のように分類されることが多いです。
- 都市銀行
全国規模で銀行サービスを提供する銀行です。多くの場合国際的な取引も行います。全国的なサービス網を持つことは強みです。 - 地方銀行
地方都市に密着する銀行です。地域密着型のサービスを提供することは強みです。 - 信託銀行
通常の銀行業務に加えて「信託業務」を行うことが許されている銀行です。相続や不動産仲介などに強みを持っています。 - 外国銀行
日本国外に本店がある銀行です。 - 新たな形態の銀行
ネットバンク等 代表的なものが「ネットバンク」あとはATM決済を基本とした「セブン銀行」、商業施設との連携を基本とした「イオン銀行」などがあります。
歴史
SAPのERPソリューションは歴史的にはR/1→R/2→R/3→ERP→S/4 HANAの5世代に分けることができます。
R/1→R/2→R/3の「R」はリアルタイムという意味が含まれていて、S/4のSはシンプルの意味です。
世代 | リリース日 | 特徴 | その他:SAP社/IT世界の出来事 |
---|---|---|---|
R/1 | 1973年 |
|
|
R/2 | 1979年 |
|
|
R/3 | 1991年(初版) |
|
|
1996年 |
| ||
1997年 |
| ||
2002年 |
| ||
2003年 |
| ||
ERP | 2004年 |
|
|
2006年 |
| ||
S/4 HANA | 2015年 | 同社のインメモリーデータベースSAP HANAをプラットフォームに採用 | - |
用途
日時を指定フォーマットで文字列に変換する。
構文
@FormatDateTime(strDateTime, strPattern, strTimeZone, strLocale)
パラメータ
strPattern
javaのSimpleDateFormatクラスの日付パターンに従っています。
文字 | 説明 | 出力例(記述例) |
---|---|---|
G | 紀元 | AD(G) |
y | 年 | 1996(yyyy); 96(yy) |
M | 月 | July(MMMM); Jul(MM); 07(MM) |
w | 年における週 | 27(ww) |
W | 月における週 | 2(W) |
D | 年における日 | 189(DDD) |
d | 月における日 | 10(dd) |
F | 月における曜日 | 2(F) |
E | 曜日の名前 | Tuesday(EEEEEEE); Tue(EEE); |
u | 曜日の番号(1:月曜、・・・7:日曜) | 1(u) |
a | 午前/午後 | PM(a) |
H | 一日における時(0 - 23) | 00(HH) |
k | 一日における時(1 - 24) | 24(kk) |
K | 午前/午後の時(0 - 11) | 00(KK) |
h | 午前/午後の時(1 - 12) | 12(hh) |
m | 分 | 30(mm) |
s | 秒 | 55(ss) |
S | ミリ秒 | 978(SSS) |
z | 一般的なタイムゾーン | Pacific Standard Time; PST; GMT-08:00 |
クリップボードは、データオブジェクト(Pegaではページと呼ばれる)を保持するためのメモリ領域です。
システムページ
システムページはアプリケーションサーバーの起動時に作成され、アプリケーションサーバーがシャットダウンされるまで存続します。このページには、実行時のシステム全体の状態と設定情報が含まれています。
リクエスターページ
リクエスターページは、ユーザー(ゲストまたは認証済み)に関連付けられたデータ、リクエスタページは、リクエスタの存続期間中存在します。
スレッドページ
スレッドページのセットは、pxThreadページ、匿名(名前なし)ページ、および名前付きページで構成されています。
pxThreadページには、スレッドレベルの情報が含まれており、実行時にProcess Commanderに対してユーザーおよび接続固有の状態と構成情報が含まれています。
匿名ページ用のメモリは、Javaの規則に従って自動的に管理されます(JVMがこのメモリへの参照がなくなったことを検出すると、ガベージコレクションの対象としてマークされます)。
名前付きページのメモリは、Process Commanderまたはアプリケーションによって割り当てられ、解放されます。
ユーザーページ
ユーザーページは、Page-Newメソッドなど、いくつかの方法のいずれかを使用してアクティビティが作成する最上位のクリップボードページです。ログアウトすると、(Obj-Saveメソッドで)PegaRULESデータベースに保存されていないユーザーページはメモリから削除されます。