ジョン・モーリー・ショールズ(1948年 - 2019年)はイギリスのコンピュータ科学者でした。彼は職業人生において、プログラミング言語APLの開発に専念しました。彼は直接関数の設計者であり、実装者でもありました。
個人的
ジョン・スコールズは1948年4月24日、ジェリー・スコールズとエイミー・スコールズ夫妻の息子として生まれました。イングランド、ウォリックシャー州レミントン・スパで育ち、 1960年から1966年までレミントン男子大学に通いました。1966年から1969年までマンチェスター大学に進学し、数学の理学士号(優等学位)を取得しました。[ 2 ]
スコールズは生涯を通じて詩的でロマンチックな性質を享受していました。APL以外にも、自然、オペラ、トム・ウェイツの音楽、ジェイムズ・ジョイスの文学[ 3 ]、WBイェイツの詩にも美を見出しました。彼はダブリンのジョイス協会の会員でした。2013年、彼と妻フローラ・ダウリングはスライゴのWBイェイツ・サマースクールに参加し、詩人シェイマス・ヒーニーが亡くなる前の夏に彼と出会いました[ 2 ] 。
APLの側面とロマンティックな側面はしばしば衝突した。深さ優先探索ビデオ[ 4 ](下記)は、 2014年の夏至の夜明け、鳥のさえずりが響く中、彼と妻はティク・ナット・ハン氏が率いるフランスでの21日間の禅リトリートに参加していた。スコールズは、その技術的な内容と状況の両方に満足していた。[ 2 ]
キャリア
ショールズの最初の仕事は、インターナショナル・コンピューターズ・リミテッド(ICL)での研修生コンピュータプログラマー(1969–70)であり、その後、サリー州エプソムのWSアトキンスのオペレーションズリサーチ部門(1971–75)、続いてランカシャー州ウォリントンのセールスサポート部門(1976–77)に移りました。1977年から1978年にかけて、彼はスペインのマドリードで欧州宇宙機関に勤務し、国際紫外線探査計画のプログラマーとして働きました。その後、 ICLデータスキルに戻り、VME/Bオペレーティングシステム用のAPLの開発に取り組みました(1978–82)。1982年に、彼はUnixマシン用のDyalog APLプロジェクトを開始し、[ 5 ] [ 6 ]、1988年にDyalog社のパートナー兼ディレクターになりました。 2004年、ショールズ氏は会社の株式を売却しましたが、コンサルタントとして業務を継続し、彼の言葉を借りれば、APLプログラミング全般、特に関数型プログラミングとDFNSといった様々な数学的トピックへの情熱的な関心を追求し続けました。彼はそれを「オタク」と呼んでいました。[ 2 ]
直接関数(dfns)
APLの発明者であるケネス・E・アイバーソンは、ユーザー関数の定義方法に不満を抱いていました。1974年、彼は説明文で用いる「形式関数定義」または「直接定義」を考案しました。[ 7 ]直接定義は、コロンで区切られた2つまたは4つの部分で構成されます。
直接定義では、⍺左引数と⍵右引数を表します。最初のインスタンスでは、関数の結果はexpression関数の結果です。2番目のインスタンスでは、関数の結果は、0と評価されたexpression0場合はの結果、 1と評価された場合は の結果です。直接定義内の割り当ては動的に局所的です。直接定義の使用例は、1979年のチューリング賞講演[ 8 ]や書籍、応用論文に記載されています。[ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ]propositionexpression1
直接的な定義は、大規模なシステムでの使用には制限が大きすぎました。このアイデアは複数の著者によって複数の研究でさらに発展させられましたが[ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]、結果は扱いにくいものでした。これらの中で、1987年にBundaが提案した「代替APL関数定義」[ 19 ]は、現在の機能に最も近いものでしたが、既存のシンボルとの衝突やエラー処理に欠陥があり、実用上問題が生じる可能性があり、結局実装されませんでした。様々な提案から得られた主な結論は、(a)定義される関数は匿名であり、後続の命名(必要な場合)は代入によって行われること、(b)関数はシンボルで表され、それによって匿名再帰が可能になること、でした[ 13 ]。
1996年、ショールズは直接関数、すなわちdfns(発音は「ディーファン」)を発明しました。これは、21世紀初頭のAPLにおいて、以前のバージョンと比べて大きな進歩でした。[ 21 ] [ 22 ] [ 23 ] [ 24 ] dfnsは、配列プログラミング、高階関数、関数型プログラミングを独自に組み合わせたものです。このアイデアは、1989年に彼がThe Computer Journal誌の関数型プログラミングに関する特集号を読んだ時に生まれました。[ 25 ]その後、彼は関数型プログラミングの研究を続け、これらのアイデアをAPLに取り入れたいという強い意欲(イェイツのように「欲望に駆られて」)を持つようになりました。[ 23 ] [ 24 ]当初、彼は変更が過激すぎると判断され、言語を不必要に複雑化するのではないかと懸念し、ステルス活動を行っていました。しかし、Dyalogの同僚たちはそれほど熱心ではなく、彼が時間を無駄にし、人々に迷惑をかけていると考えていたため、ステルス活動を行っていたという意見もあります。 dfnはAPL '96カンファレンスのDyalogベンダーフォーラムで初めて発表され、1997年初頭にDyalog APLでリリースされました。[ 21 ]受け入れられ、認知されるのは遅かったです。2008年になっても、Dyalog Ltdの25周年を記念した出版物であるDyalog at 25 [6] では、dfnについてはほとんど触れられていませんでした(「動的関数」として2回言及され、詳細は示されていませんでした)。2019年現在、dfnはDyalog APL、[26] NARS2000、[27] ngn/aplに実装されています。[ 28 ]また、 GPU (グラフィックス・プロセッシング・ユニット)の計算能力を活用する取り組みにおいても重要な役割を果たしています。[ 29 ] [ 13 ]
ここでは例を用いてDfnについて説明します。より詳細な説明と例は、直接関数の記事と参考文献に記載されています。[ 22 ] [ 13 ] [ 30 ]
配列のクイックソート⍵は、配列の主要セルの中からランダムに「ピボット」を選択し、比較関数によって決定された、ピボットの直前にあるソート済みの主要セル、ピボットと等しい主要セル、およびピボットの直後にあるソート済みの主要セルを連結することによって機能します⍺⍺。これは、dop(直接演算子)として定義されますQ。
Q ← { 1 ≥≢ ⍵:⍵ ⋄ ( ∇ ⍵ ⌿⍨ 0 > s ) ⍪ ( ⍵ ⌿⍨ 0 = s ) ⍪ ∇ ⍵ ⌿⍨ 0 < s ← ⍵ ⍺⍺ ⍵ ⌷ ⍨ ?≢ ⍵ }⍝ が先行する ⍝ が続く ⍝ が等しい2 ( ×- ) 8 8 ( ×- ) 2 8 ( ×- ) 8 ¯1 1 0× ← 2 19 3 8 3 6 9 4 19 7 0 10 15 14( ×- ) Q x 0 2 3 3 4 6 7 8 9 10 14 15 19 19Q3は、関数自体⊂ではなく、関数で囲まれた3つの部分を連結する変形です。各再帰ステップで生成される3つの部分は、最終結果の構造に明確に表れています。から導出された関数を同じ引数に複数回適用すると、ピボットがランダムに選択されるため、異なる結果が生成されます。結果を順番に走査すると、同じソートされた配列が生成されます。 Q3
Q3 ← { 1 ≥≢ ⍵:⍵ ⋄ ( ⊂ ∇ ⍵ ⌿⍨ 0 > s ) ⍪ ( ⊂ ⍵ ⌿⍨ 0 = s ) ⍪⊂ ∇ ⍵ ⌿⍨ 0 < s ← ⍵ ⍺⍺ ⍵ ⌷ ⍨ ?≢ ⍵ }( ×- ) Q3 × ┌───────────┬┐ │┌────────┬─┬─────────┐│ 19 19 ││ ││┌──────┬───┬─┐│ 6 │┌──────┬─┬─────┐││ ││ │││┌┬─┬─┐│ 3 3 │ 4 ││ ││┌┬─┬─┐│ 9 │┌┬─┬─┬─┐││ ││ ││││ 0 │ 2 ││ │ ││ ││││ 7 │ 8 ││ │││ 10 │┌──┬──┬┐││││ ││ │││└┴─┴─┘│ │ ││ ││└┴─┴─┘│ │││ ││ 14 │ 15 ││││││ ││ ││ ││└──────┴─┴─┘│ ││ │││ │└──┴─┴─┘│││ ││ ││ │└┴──┴────────┘││ ││ ││ │└──────┴─┴──────────┘││ ││ │━━━━━━━━━━━┴─┴───────────────┘│ ││ └──────────────┴─────┴┘ ( ×- ) Q3 × ┌───────────┬─┬───────────┐ │┌┬─┬─────────┐│ 7 │┌─────────┬─────┬┐│ │││ 0 │┌┬─┬─────┐││ ││┌──────┬──┬─┐│ 19 19 │││ │││ │││ │││ 2 │┌────────────┬─┬┐│││ │││┌┬─┬─┐│ 10 │┌──┬──┬┐││ │││ │││ │││ ││┌───────┬─┬┐│ 6 │││││ ││││ 8 │ 9 ││ ││ 14 │ 15 ││││ │││ │││ │││ │││ │││┌┬───┬┐│ 4 │││ │││││ │││└┴─┴─┘│ │└──┴─┴┘││ │││ │││ │││ │││ │││││ 3 3 │││ │││ ││││ ││││ ││└──────┴──┴────────┘│ │││ │││ │││ ││└┴───┴┘│ │││ ││││ │└────────────────┴─────┴┘│ │││ │││ │└──────────────┴─┴┘│ ││││ │ │││ │└──────────────┴─┴┘││ │ │ │││ │└──────────────┴─┴┘││ │ ││└┴─┴──────────────────────┘│ │ │ └──────────────────────────┴─┴──────────────────────────┘上記の定式化は目新しいものではない。例えば、古典的な「コンピュータアルゴリズムの設計と分析」の図3.7を参照のこと。[ 31 ]しかし、図3.7のピジンALGOLプログラムとは異なり、QとQ3が実行可能であり、ソートに使用される半順序がオペランドであるため、上記の例とは異なっている。[ 13 ](×-)
記事とプレゼンテーション
ウィット
スコールズは、その機知、ユーモアのセンス、そしてコミカルなタイミングで同僚の間でよく知られていました。Dyalogカンファレンスでの彼の「ディナー後のプレゼンテーション」は、非常に期待されるイベントでした。上記のリストからいくつか抜粋をご紹介します。
その他の例はスコリズムに見ることができる。[ 86 ]
参考文献
- ^ 「ケネス・E・アイバーソン賞」。Association for Computing Machinery 。2019年9月15日閲覧。
- ^ a b c dジョン・モーリー・スコールズの生涯を祝う式典、2019年3月4日
- ^ショールズ、ジョン(2015年2月3日)、ジョイスの『ユリシーズ』朗読(音声) 、 2019年9月24日閲覧。
- ^ a b Scholes, John (2014年6月21日). APLにおける深さ優先探索(動画). YouTube . 2019年9月21日閲覧。
- ^ポリフカ、レイ(1998年3月)「ピーター・ドネリーとジョン・スコールズへのインタビュー」APL Quote Quad . 28 (3): 7– 12. doi : 10.1145/309730.309731 . S2CID 28437582 .
- ^ a b Dyalog (2008年9月). 「Dyalog 25周年」(PDF) . Vector . 2019年9月20日閲覧。
- ^ Iverson, Kenneth E. (1974)、「第10章 形式関数定義」、Elementary Functions、IBM Corporation 、 2019年9月18日閲覧。
- ^アイバーソン、ケネス・E. (1980年8月). 「思考ツールとしての記法」 Communications of the ACM . 23 (8): 444– 465. doi : 10.1145/358896.358899 . 2016年4月8日閲覧。
- ^アイバーソン、ケネス・E. (1976).初等解析学. APL出版.
- ^ Orth, DL (1976).新しい鍵による微積分学. APL Press.
- ^ Hui, Roger (1987年5月). 「{と}のいくつかの用法」 . APL 87会議録. 2016年4月15日閲覧。
- ^ McDonnell, EE (1987年5月)、「Life: Nasty, Brutish, and Short」、APL 87 Conference Proceedings 、 2019年10月6日閲覧。
- ^ a b c d e Hui, Roger ; Kromberg, Morten (2020年6月). 「APL Since 1978」 . ACM on Programming Languages Proceedings of the ACM on Programming Languages . 4 (HOPL): 1– 108. doi : 10.1145/3386319 . S2CID 218517570 .
- ^ Iverson, Kenneth E. (1978年4月26日)、「演算子と関数、§8」、研究報告書番号#RC7091、IBM Corporation 、 2019年9月19日閲覧。
- ^アイバーソン、ケネス・E. ; ウースター、ピーター (1981年9月). 「関数定義演算子」. APL81 会議録, APL Quote Quad . 12 (1).
- ^ Cheney, Carl M. (1981年3月)、APL*Plusネスト配列システムリファレンスマニュアル、§4.17 (PDF)、STSC, Inc. 、 2019年9月18日閲覧。
- ^ Iverson, Kenneth E. (1983年1月6日)、Rationalized APL、IP Sharp Associates 、 2019年9月19日閲覧。
- ^ Iverson, Kenneth E. (1987年9月). 「A Dictionary of APL」 . APL Quote Quad . 18 (1): 5– 40. doi : 10.1145/36983.36984 . S2CID 18301178. 2019年9月19日閲覧。
- ^ a b Bunda, John (1987年5月). 「APL関数定義表記法」. APL87会議録, APL Quote Quad . 17 (4).
- ^ロジャー・ホイ他 (1990年7月). 「APL? 」 . APL 90会議録:未来に向けて. 第20巻. pp. 192– 200. doi : 10.1145/97808.97845 . ISBN 089791371X. S2CID 235453656 . 2019年9月10日閲覧。
- ^ a b c Scholes, John (1996年10月). 「Dyalog APLにおける直接関数」(PDF) . Vector . 13 (2) . 2019年9月16日閲覧。
- ^ a b Scholes, John (1998–2019)、Direct Functions Workspace 、 2019年9月15日閲覧
- ^ a b c Scholes, John (2018年10月31日). Dfns: Past, Present and Future (ビデオ). Dyalog '18 ユーザーミーティング. 2019年9月21日閲覧。
- ^ a b c Scholes, John (2018年10月31日)、Dfns: Past, Present and Future (text) (PDF)、Dyalog '18 User Meeting 、 2019年9月21日閲覧
- ^ Wadler, Philip L.; et al. (1989年1月1日). 「関数型プログラミング特集号」.コンピュータジャーナル. 32 (2).
- ^ Dyalog (2019年8月15日). Dyalogプログラミングリファレンスガイド、バージョン17.1、Dfns & Dops、pp. 133-147 (PDF) . Dyalog Ltd. 2019年9月30日閲覧。
- ^スミス、ボブ(2006–2019)、NARS2000 、 2019年9月18日閲覧。
- ^ Nickolov, Nick (2013年9月). 「APLをJavaScriptにコンパイルする」 . Vector . 26 (1) . 2019年9月19日閲覧。
- ^ Hsu, Aaron (2019). GPU上でホストされるデータ並列コンパイラ(プレプリントドラフト)(博士論文).インディアナ大学.
- ^ホイ、ロジャー(2016年11月26日)「50の機能で見るAPLの歴史」 、 2019年9月21日閲覧。
- ^ Aho, AV ; Hopcroft, JE ; Ullman, JD (1974)、「コンピュータアルゴリズムの設計と分析」、Addison-Wesley、Bibcode : 1974daca.book.....A
- ^ Scholes, John (1985年7月)、「Dyalog APLにおける演算子とネストされた配列」、Vector、2 (1)
- ^ Curtin, AD; Scholes, JM (1989年8月). 「⎕sm: Dyalog APL用フルスクリーンマネージャ」. APL Quote Quad . 19 (4): 107– 112. doi : 10.1145/75145.75159 .
- ^ Scholes, John (1990年4月)、「定義済み演算子に関するワークショップ」、Vector、6 (4)
- ^ Scholes, John (1990年4月)、「Dyalog APLの新しい開発環境」、Vector、6 (4)
- ^ Scholes, John (1994年7月)、「Meeting: Dyalog APL Namespaces」、Vector、11 (1) 、 2019年9月21日閲覧。
- ^ Scholes, John (1998年10月)、「APL98ワークショップ – Dyalog APLのスレッド」、Vector、15 (2)
- ^ショールズ、ジョン(1998年10月)「スレッド:マルチスレッド入門」、ベクター、15(2)
- ^ Scholes, John (2001年4月)、「D: Dyalog APLの機能的サブセット」、Vector、17 (4) 、2019年9月21日閲覧。
- ^ Scholes, John (2001年7月)、「Dにおけるシステム関数の効果の局所化」、Vector、18 (1)
- ^ショールズ、ジョン(2003年7月)、「dfns@dyalog.com」、ベクター、20(1)
- ^ Scholes, John (2003年7月)、「ハンガリアン法によるコスト割り当て」、Vector、20 (1) 、 2019年9月21日閲覧。
- ^ショールズ、ジョン(2004年4月)「グラフに関するメモ」、ベクター、20(4)
- ^ Scholes, John (2005年5月)、「コンピュータプログラムの書き方」(PDF)、Vector、21 (3) 、2019年9月21日閲覧。
- ^ Scholes, John (2006年10月17日)、「言語拡張」、Dyalog '06 ユーザーカンファレンス
- ^ Scholes, John (2006年10月17日)、「Functions as Results」(PDF)、Dyalog '06ユーザーカンファレンス、 2019年9月21日閲覧
- ^ Delcros, Nicolas; Scholes, John (2007年10月1日)、バージョン11.1パフォーマンス強化、Dyalog '07ユーザーカンファレンス
- ^ Scholes, John (2007年10月1日)、「高水準演算子の調査」、Dyalog '07ユーザーカンファレンス
- ^ Delcros, Nicolas; Scholes, John (2008年10月13日)、通訳パフォーマンス、Dyalog '08ユーザーカンファレンス
- ^ Scholes, John; Smith, Richard (2008年10月13日). Journaled Files (ビデオ). Dyalog '08 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John; Smith, Richard (2008年10月13日)、「Journaled Files」(テキスト)、Dyalog '08 User Conference 、 2019年9月21日閲覧。
- ^ a b Scholes, John (2008年10月13日). A Plea for Simplicity (ビデオ). Dyalog '08 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2009年1月26日). APLでのConwayのライフゲーム(ビデオ). YouTube . 2019年9月21日閲覧。
- ^ Scholes, John (2009年9月13日). D関数入門(ビデオ). Dyalog '09 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2009年9月13日). D関数入門(ビデオ). Dyalog '09 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2009年9月13日)、Session Whizbangs、Dyalog '09 ユーザーカンファレンス
- ^ a b Scholes, John (2009年9月14日).複素数(ビデオ). Dyalog '09 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2010年9月14日).ワークショップ—D関数入門(ビデオ). Dyalog '10 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2010年9月14日).ワークショップ—D関数入門(ビデオ). Dyalog '10 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Foad, Jay; Scholes, John; Hui, Roger (2011年10月2日)、カンファレンスエディションワークショップ、Dyalog '11ユーザーカンファレンス
- ^ Scholes, John; Hui, Roger (2011年10月3日)、「Dyalog '11 カンファレンスエディションの紹介」、Dyalog '11 ユーザーカンファレンス
- ^クロムバーグ、モーテン;ジョン・スコールズ。ジョナサン・マンクテロー(2011年10月3日)。APL# (ビデオ)。 Dyalog '11 ユーザーカンファレンス。2019 年9 月 21 日に取得。
- ^クロムバーグ、モーテン;ジョン・スコールズ。 Manktelow、Jonathan (2011 年 10 月 3 日)、APL# (テキスト)、Dyalog '11 User Conference 、 2019 年9 月 21 日取得
- ^ Scholes, John (2011年10月3日)、「Dyalog APLの関数トレイン」、Dyalog '11ユーザーカンファレンス
- ^ a b Scholes, John; Hui, Roger (2011年10月3日). What is Functional Programming? (ビデオ). Dyalog '11 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2011年10月5日)、Closures、Dyalog '11 ユーザーカンファレンス
- ^ Scholes, John; Hui, Roger (2012年10月15日).潜在的なバージョン14.0言語機能(ビデオ). Dyalog '12 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John; Hui, Roger (2012年10月15日)、潜在的なバージョン14.0言語機能(テキスト)、Dyalog '12ユーザーカンファレンス、 2019年9月21日閲覧
- ^ a b Scholes, John (2012年10月15日). State-Free Programming (ビデオ). Dyalog '12 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ a b Scholes, John (2012年10月15日). Calling Alan Turing (ビデオ). Dyalog '12 ユーザーカンファレンス. 2019年9月22日閲覧。
- ^ Scholes, John (2012年10月27日). A PLでの数独ソルバー(動画). YouTube . 2019年9月21日閲覧。
- ^ Scholes, John (2013年10月22日). Train Spotting in Version 14.0 (ビデオ). Dyalog '13 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ Scholes, John (2013年10月22日)、Train Spotting in Version 14.0 (テキスト) (PDF)、Dyalog '13 ユーザーカンファレンス、 2019年9月21日閲覧
- ^ a b Scholes, John (2013年10月22日).プログラマーのためのソーシャルスキル(ビデオ). Dyalog '13 ユーザーカンファレンス. 2019年9月21日閲覧。
- ^ a b Scholes, John (2014年9月22日). Distractions (ビデオ). Dyalog '14 ユーザーミーティング. 2019年9月21日閲覧。
- ^ Smith, Fiona; Scholes, John; Smith, Richard; Hui, Roger (2015年9月7日). Dya(b)log (ビデオ). Dyalog '15 ユーザーミーティング. 2019年9月21日閲覧。
- ^ Smith, Fiona; Scholes, John; Smith, Richard; Hui, Roger (2015年9月7日)、Dya(b)log (テキスト) (PDF)、Dyalog '15 ユーザーミーティング、2019年9月21日閲覧
- ^ Scholes, John; Hui, Roger (2015年9月10日)、「Future Operator Proposals: Cut, Under, and Merge (video)」、Dyalog '15 User Meeting 、 2019年9月21日閲覧。(文章)
- ^ Scholes, John; Hui, Roger (2015年9月10日)、「Future Operator Proposals: Cut, Under, and Merge (text) 」、Dyalog '15 User Meeting 、 2019年9月21日閲覧。(文章)
- ^ Scholes, John; Hui, Roger (2016年10月10日).新しいプリミティブ関数と演算子(ビデオ). Dyalog '16 ユーザーミーティング. 2019年9月21日閲覧。
- ^ Scholes, John; Hui, Roger (2016年10月10日)、「新しいプリミティブ関数と演算子(テキスト)」、Dyalog '16ユーザーミーティング、 2019年9月21日閲覧。
- ^ Scholes, John; Hui, Roger (2016年10月10日)、「新しいプリミティブ関数と演算子(スクリプト)」、Dyalog '16ユーザーミーティング、 2019年9月21日閲覧。
- ^ Taylor, Stephen; Streeter, Geoff; Scholes, John (2016年10月12日). Dyalog実装:初期の頃(ビデオ). Dyalog '16 ユーザーミーティング. 2019年9月21日閲覧。
- ^ Scholes, John (2017年9月11日).ケーススタディ:手続き型から指示型への再コーディング(ビデオ). Dyalog '17 ユーザーミーティング. 2019年9月21日閲覧。
- ^ Scholes, John (2017年9月11日)、「ケーススタディ—手続き型から指示型への再コーディング」 (PDF)、Dyalog '17 ユーザーミーティング、 2019年9月21日閲覧
- ^ Scholes, John (2019年3月)、Hui, Roger (編)、Scholisms 、 2019年9月20日閲覧。
外部リンク