<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ken Okabe</title>
    <description>The latest articles on DEV Community by Ken Okabe (@ken_okabe_jp).</description>
    <link>https://dev.to/ken_okabe_jp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F922036%2Fd71e94c5-8197-4a3f-be0d-94c0c77fd5ef.png</url>
      <title>DEV Community: Ken Okabe</title>
      <link>https://dev.to/ken_okabe_jp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ken_okabe_jp"/>
    <language>en</language>
    <item>
      <title>Node.js やReact、ESM、Viteの説明</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Sun, 22 Jan 2023 07:36:00 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/nodejs-yareact-esm-vitenoshuo-ming-11p5</link>
      <guid>https://dev.to/ken_okabe_jp/nodejs-yareact-esm-vitenoshuo-ming-11p5</guid>
      <description>&lt;p&gt;まず、大元の話をします。&lt;/p&gt;

&lt;p&gt;インターネットというものが登場し、&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8" rel="noopener noreferrer"&gt;ホームページ&lt;/a&gt;あるいは&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88" rel="noopener noreferrer"&gt;ウェブサイト&lt;/a&gt; という代物が登場しました。&lt;/p&gt;

&lt;p&gt;ウェブサイトは、&lt;a href="https://ja.wikipedia.org/wiki/HyperText_Markup_Language" rel="noopener noreferrer"&gt;HyperText Markup Language&lt;/a&gt; HTMLという&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF" rel="noopener noreferrer"&gt;ハイパーリンク&lt;/a&gt;機能がある&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88" rel="noopener noreferrer"&gt;ハイパーテキスト&lt;/a&gt;記述言語、&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E8%A8%80%E8%AA%9E" rel="noopener noreferrer"&gt;マークアップ言語&lt;/a&gt;で書かれています。&lt;/p&gt;

&lt;p&gt;各ウェブサイトは、ハイパーリンク機能でリンクされていますから、世界規模で、まるで蜘蛛の巣（ウェブ）のようなネットワーク構造を形成しはじめます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-6af4492f67d496e7cbf172c15a7057a1-lq" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-6af4492f67d496e7cbf172c15a7057a1-lq" width="602" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.msn.com/en-za/news/techandscience/how-the-world-wide-web-was-born/ar-BBUF3LO" rel="noopener noreferrer"&gt;How the World Wide Web Was Born&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これが&lt;a href="https://ja.wikipedia.org/wiki/World_Wide_Web" rel="noopener noreferrer"&gt;World Wide Web&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;WorldWideWebを自在に移動(Explore/Navigate)しながらウェブサイトを閲覧(Browse)&lt;/p&gt;

&lt;p&gt;するためにWebブラウザというソフトウェアが登場しました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/Netscape_Navigator_(%E3%83%8D%E3%83%83%E3%83%88%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BA)" rel="noopener noreferrer"&gt;Netscape Navigator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/Internet_Explorer" rel="noopener noreferrer"&gt;Microsoft Internet Explorer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-29092ebc0e915be64beea649323698b5" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-29092ebc0e915be64beea649323698b5" width="578" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;の2トップです。Netscape社とMicrosoft社はインターネットというとつてもない新市場を前に苛烈なシェア争いをします。第一次&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%88%A6%E4%BA%89" rel="noopener noreferrer"&gt;ブラウザ戦争&lt;/a&gt; 1990-2000です。&lt;/p&gt;

&lt;p&gt;この頃の最初の最初のウェブサイトは単なるHTMLの文書です。動いたりしません。静的なサイトのみです。&lt;/p&gt;

&lt;p&gt;しかし動いたほうがいいということなり、Netscapeの開発者がスクリプト実行機能を搭載した次世代ブラウザNetscapeNavigator2.0をリリースします。&lt;/p&gt;

&lt;p&gt;そのとき、たまたまJavaが人気を集めていたので、まるで別物ですが単なるマーケティング上の理由からそのスクリプト言語はJavaScriptと名付けられます。&lt;/p&gt;

&lt;p&gt;JavaScriptで動作する動的なWebサイトの登場です。&lt;/p&gt;

&lt;p&gt;遅れをとった競合するMicrosoft社は、自社の次世代ブラウザであるIE3.0にもJavaScriptを搭載しようとしましたが、戦争してるわけでNetscapeはライセンス供与を拒否して、泥沼状態になります。&lt;/p&gt;

&lt;p&gt;結局NetscapeはMicrosoftのWindowsという圧倒的なシェアを誇るOSとIEブラウザの囲い込み戦略により敗退しますが、Firefoxというブラウザにその技術はオープンソースプロジェクトとして継承されます。&lt;/p&gt;

&lt;p&gt;IEのJavaScriptエンジンはクローズドですが、FirefoxのJavaScriptエンジンである&lt;a href="https://ja.wikipedia.org/wiki/SpiderMonkey" rel="noopener noreferrer"&gt;SpiderMonkey&lt;/a&gt; はオープンなのでGoogleが資金援助とかやっていました。&lt;/p&gt;

&lt;p&gt;しかしFirefoxはオープンソース界隈でよくあることですが、開発が停滞するんですね。Googleのエンジニアはイライラします。ちゃんと仕事をしろ。俺達の技術力ならもっとマシなものを全力で作れるのに、と。こいつらへの資金援助は無駄だと。&lt;/p&gt;

&lt;p&gt;Firefoxを見切って開発されたのが&lt;a href="https://ja.wikipedia.org/wiki/Google_V8_JavaScript_Engine" rel="noopener noreferrer"&gt;Google V8 JavaScript Engine&lt;/a&gt;というとんでもない実行スピードを叩き出すJavaScirptエンジンであり、それを搭載したChromeブラウザでした。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-a2238f8f6eaa92618fea7bf0a0c944a2-lq" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-a2238f8f6eaa92618fea7bf0a0c944a2-lq" width="602" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-85d5f5b3572b9eefab5ce3dfea033aa3-pjlq" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-85d5f5b3572b9eefab5ce3dfea033aa3-pjlq" width="512" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript Performance Rundown  (&lt;a href="https://johnresig.com/blog/javascript-performance-rundown/" rel="noopener noreferrer"&gt;https://johnresig.com/blog/javascript-performance-rundown/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;V8エンジンの圧倒的スピードとChromeブラウザのシンプルさはギーク界隈を震撼させます。&lt;/p&gt;

&lt;p&gt;第二次ブラウザ戦争 2004-2014年の勃発です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-f561657f835104890906dc90599d71ae-lq" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-f561657f835104890906dc90599d71ae-lq" width="200" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IE、Firefox、Opera、Safari、Chromeの五択となり当初情勢は混迷を極めますが、ギークだけではなく一般市民までGoogle謹製という信頼性とChromeの筋の良さが評価された結果、現在はご存知のとおりです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-8cbd454476b4448c1136ab5c454490c6-lq" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-8cbd454476b4448c1136ab5c454490c6-lq" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.mynavi.jp/article/20190505-817810/" rel="noopener noreferrer"&gt;IE 11が増加 - 4月ブラウザシェア&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Googleは、V8エンジンだけをChromeブラウザから単体分離してオープンソースで公開しました。自分はリアルタイムでこの辺見てましたが、ああこれはものすごいポテンシャルがあることだなと喜んでいました。これだけ高速なJavaScriptエンジンならばWebブラウザ外でも色々使えるに決まっているからです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-1d5a1f2d39985e9cacb95265b41ef054" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-1d5a1f2d39985e9cacb95265b41ef054" width="602" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qiita.com/umashiba/items/8cb47825624c5cb043d6" rel="noopener noreferrer"&gt;Webブラウザ、レンダリングエンジン、JavaScriptエンジンを整理して図視化してみた - Qiita&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2008- node.jsとnpmの台頭&lt;/p&gt;

&lt;p&gt;同じように感じたギークは世界中にいて、ライアン・ダールがV8エンジンに入出力を扱えるようにC++で書いたイベントループ機構を足して、ブラウザ外の独立した実行環境としてリリースしました。それが&lt;a href="https://ja.wikipedia.org/wiki/Node.js" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-ace5092e5f88213c0c0e7d0273ca7c99" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-ace5092e5f88213c0c0e7d0273ca7c99" width="180" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Node.js は、&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" rel="noopener noreferrer"&gt;イベント化&lt;/a&gt;された&lt;a href="https://ja.wikipedia.org/wiki/%E5%85%A5%E5%87%BA%E5%8A%9B" rel="noopener noreferrer"&gt;入出力&lt;/a&gt;を扱う&lt;a href="https://ja.wikipedia.org/wiki/Unix%E7%B3%BB" rel="noopener noreferrer"&gt;Unix系&lt;/a&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)" rel="noopener noreferrer"&gt;プラットフォーム&lt;/a&gt;上の&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%83%BB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88" rel="noopener noreferrer"&gt;サーバーサイドJavaScript&lt;/a&gt;環境である。&lt;a href="https://ja.wikipedia.org/wiki/Web%E3%82%B5%E3%83%BC%E3%83%90" rel="noopener noreferrer"&gt;Webサーバ&lt;/a&gt;などの&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3" rel="noopener noreferrer"&gt;スケーラブル&lt;/a&gt;な&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF" rel="noopener noreferrer"&gt;ネットワーク&lt;/a&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)" rel="noopener noreferrer"&gt;プログラム&lt;/a&gt;の記述を意図している。ライアン・ダールによって&lt;a href="https://ja.wikipedia.org/wiki/2009%E5%B9%B4" rel="noopener noreferrer"&gt;2009年&lt;/a&gt;に作成され、ダールを雇用している&lt;a href="https://ja.wikipedia.org/wiki/Joyent" rel="noopener noreferrer"&gt;Joyent&lt;/a&gt;の支援により成長している。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/Google_V8_JavaScript_Engine" rel="noopener noreferrer"&gt;V8 JavaScriptエンジン&lt;/a&gt;で動作するが、&lt;a href="https://ja.wikipedia.org/wiki/Chakra#ChakraCore" rel="noopener noreferrer"&gt;ChakraCore&lt;/a&gt;バージョンやMozillaによるSpiderMonkey移植のプロジェクトも存在する。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Node.jsは、だからブラウザから分離したJavaScript実行環境であって、ブラウザのほうの表示がどうとかいうのはまったく関知していません。&lt;/p&gt;

&lt;p&gt;Node.jsは、非常に効率の良いWebサーバとしてサーバーサイドで活用されはじめると同時に、独自のモジュール/パッケージ管理システムである&lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-541b00350bda6f5d5a13c604c6093492" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-541b00350bda6f5d5a13c604c6093492" width="200" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;を発展させ（JavaScriptの標準仕様としてモジュールが存在しないので独自に発展させるしかしようがない）、2019年現在まで一大エコシステム・コミュニティを形成してきました。&lt;/p&gt;

&lt;p&gt;2011- Browserifyの登場　“bundler”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-9531bd1dc0c33791eacc050469a3c4da" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-9531bd1dc0c33791eacc050469a3c4da" width="499" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScriptのモジュール化の標準化が定まらない中、独自のエコを発展させたnodeベースの膨大なJavaScriptモジュール資産（npmエコ）をWebブラウザでも活用すべく&lt;a href="http://browserify.org/" rel="noopener noreferrer"&gt;Browserify&lt;/a&gt;が登場します。これは実際結構な力技で、当初自分はよくこんなハックが出来たなと衝撃を受けたものですが、npmの依存関係に従ってモジュールを単一のJSファイルにつなぎあわせる、というものです。現在は、&lt;a href="https://webpack.js.org/" rel="noopener noreferrer"&gt;webpack&lt;/a&gt;のほうが人気だとは思いますが、いわゆる"bundler"（バンドラ）と呼ばれるものの先駆的存在です。&lt;/p&gt;

&lt;p&gt;2013- Reactの登場&lt;/p&gt;

&lt;p&gt;HTMLはJavaScriptでイジる仕組みになっているわけです。これは現在も一環して揺るぎません。&lt;/p&gt;

&lt;p&gt;HTMLの構造は、&lt;a href="https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model" rel="noopener noreferrer"&gt;ドキュメントオブジェクトモデル (DOM)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-99035530b62f8ad93635fecfc8765db3" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-99035530b62f8ad93635fecfc8765db3" width="330" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;としてツリー構造のオブジェクトモデルとして抽象化されています。&lt;/p&gt;

&lt;p&gt;動的なWebサイトを実現するためには、JavaScirptからは結局HTMLというよりかはこのDOMを操作していくんですが、JavaScriptのDOM操作APIは出来が悪かったのです。&lt;/p&gt;

&lt;p&gt;そして最悪なことに、例のブラウザ戦争の沙汰のせいで、ブラウザによってこのAPIやら挙動が微妙に異なるので、素のDOM操作をして動的なWebサイトの開発は困難を極めました。&lt;/p&gt;

&lt;p&gt;そこで登場したのが、&lt;a href="https://jquery.com/" rel="noopener noreferrer"&gt;jQuery&lt;/a&gt;というライブラリです。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;jQueryには次のような機能・特徴がある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ブラウザに依存しないオープンソースのセレクタエンジン &lt;a href="http://sizzlejs.com/" rel="noopener noreferrer"&gt;Sizzle&lt;/a&gt; を使った&lt;a href="https://ja.wikipedia.org/wiki/Document_Object_Model" rel="noopener noreferrer"&gt;DOM&lt;/a&gt;エレメントの選択（Sizzle は jQuery プロジェクトからスピンアウト）&lt;a href="https://ja.wikipedia.org/wiki/JQuery#cite_note-3" rel="noopener noreferrer"&gt;[3]&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ja.wikipedia.org/wiki/Document_Object_Model" rel="noopener noreferrer"&gt;DOM&lt;/a&gt;操作と変更（CSS 1-3 と基本的な&lt;a href="https://ja.wikipedia.org/wiki/XML_Path_Language" rel="noopener noreferrer"&gt;XPath&lt;/a&gt;のサポートを含む）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;jQueryは開発者コミュニティから絶大な支持を受けていましたが、Facebookのある天才が、とある事実に気づきます。&lt;/p&gt;

&lt;p&gt;そもそもDOMがJavaScriptの外部モデルとして存在していて、JavaScriptの操作対象になっているからやりにくい、と。&lt;/p&gt;

&lt;p&gt;ならばもう、DOMはJavaScriptの値（&lt;a href="https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88" rel="noopener noreferrer"&gt;ファーストクラスオブジェクト&lt;/a&gt;）にしてしまおう。&lt;/p&gt;

&lt;p&gt;そうFacebookの技術者は考えました。&lt;/p&gt;

&lt;p&gt;ぶっちゃけこれはとんでもないコペルニクス的発想であり、&lt;/p&gt;

&lt;p&gt;JavaScriptとは？HTML(DOM)を操作するために生み出されたスクリプト言語&lt;/p&gt;

&lt;p&gt;という存在意義、アイデンティティの根幹をひっくり返すような発明です。&lt;/p&gt;

&lt;p&gt;しかもそれは、JavaScriptの言語仕様を勝手に変更するということに他ならないので、極めて受け入れられにくいことでしょう。Facebookという巨大なバックがある技術者だから言い出せたことで、結果受け入れられたことだと思います。&lt;/p&gt;

&lt;p&gt;要するにこういうことです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-ff73126c182eb0b8b813f463c0d58daa" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-ff73126c182eb0b8b813f463c0d58daa" width="388" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript ＋ HTML（DOM）＝　&lt;a href="https://facebook.github.io/jsx/" rel="noopener noreferrer"&gt;JSX&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-96b13a630788ad5edd1076df4e83125e" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-96b13a630788ad5edd1076df4e83125e" width="602" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.quora.com/How-can-I-learn-React-JS-from-scratch/answer/Swatee-Chand-2" rel="noopener noreferrer"&gt;Swatee Chand's answer to How can I learn React JS from scratch?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScriptでは、HTML(DOM)＝操作する対象&lt;/p&gt;

&lt;p&gt;であったものが、&lt;/p&gt;

&lt;p&gt;JSXでは、HTML(DOM)＝ 拡張されたJavaScript(JSX)の値（ファーストクラスオブジェクト）&lt;/p&gt;

&lt;p&gt;として統合されます。&lt;/p&gt;

&lt;p&gt;具体的には、&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const helloNode = &amp;lt;div&amp;gt;Hello!&amp;lt;/div&amp;gt;;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こう書けます。DOMがJavaScriptの値として組み込まれてしまいます。&lt;/p&gt;

&lt;p&gt;こういうのを、&lt;a href="https://ja.reactjs.org/docs/faq-internals.html" rel="noopener noreferrer"&gt;仮想 DOM&lt;/a&gt; といいます。&lt;/p&gt;

&lt;p&gt;この原理をきちんと理解さえできれば、DOMなんてものは、ただのJS(X)の値なので、いくらでも自由に操作できます。&lt;/p&gt;

&lt;p&gt;単純なWebアプリならば、静的（動的）なHTMLにたいして、適当に外側のJSから操作することが単純だ、と思いがちですが、ちょっと動的に複雑になれば、途端に破綻します。&lt;/p&gt;

&lt;p&gt;プログラムの複雑性に耐久性がなく一貫性もなくなるわけですから、ソフトウェアデザインとして堅牢ではない、ということです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jp.vuejs.org/index.html" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;っていうのもそれですね。Vueっていうのは、こういうJSXがなんたるか？っていうのをイマイチ理解できていない技術者が好む仮想DOMライブラリです。&lt;/p&gt;

&lt;p&gt;他方でJSXは素晴らしいのですが、Reactというライブラリが良いか？というと別に良くもありません。これも複雑に肥大しすぎなので見切られてVueのほうへ流れる開発者が多いという事情は理解します。&lt;/p&gt;

&lt;p&gt;この辺り踏み込むと泥沼で長くなるので割愛し、ここではJSXの仮想DOMの話だけをします。&lt;/p&gt;

&lt;p&gt;たとえば、よくあるToDoリストを考えましょう。&lt;/p&gt;

&lt;p&gt;リストが増えたり減ったりするやつです。この場合、DOM自体が増えたり消えたりするわけで、増えたり、消えたりするDOMに対して、外側のJSからどうやってデータを紐づけたりするんでしょうか？&lt;/p&gt;

&lt;p&gt;はい、DOMを足せ、DOMを消せ、っていう命令を出すしかないんですね。非常にやっかいです。&lt;/p&gt;

&lt;p&gt;一方で、仮想DOMの場合はどうでしょうか？&lt;/p&gt;

&lt;p&gt;DOMってのは単なるJS(X)の値です。まあ普通に考えて、DOMのリストっていうのは、JSの配列(Array)のデータ構造になっているでしょうから、その配列の要素を1個増やしたり減らしたりするだけです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
 &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;removeArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
 &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
 &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;たとえば配列listにToDoのデータが入っていて、これをリストタグに展開したいのであれば、Array.map を使って、以下のように展開してやればよいでしょう。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;}&lt;/span&gt;&lt;span class="err"&gt; 
&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;新しいDOMをこさえるわけですが、こういう新しいDOMを全部ひっくるめる、全部のDOMを構築します。&lt;/p&gt;

&lt;p&gt;そして最後に古い全部のDOMと新しい全部のDOMをバーっと比較計算して、差分だけ書き換えろ、というJSネイティブのDOMの命令を「裏側」でやらせます。プログラマは関知しません。ただ新しいDOMを構築して投げるだけです。&lt;/p&gt;

&lt;p&gt;ちなみにJSXというのはそのままJavaScriptエンジンでは動作しませんから、JavaScriptへトランスパイルしてやります。&lt;/p&gt;

&lt;p&gt;2014- ECMAScript標準化の加速&lt;/p&gt;

&lt;p&gt;ブラウザ戦争が収束するのと並行して、ブラウザ世界でもJavaScriptの標準化= ECMAScript標準化が活発化していきます。&lt;/p&gt;

&lt;p&gt;ES6(ES2015)ではようやく&lt;a href="http://es6-features.org/#ValueExportImport" rel="noopener noreferrer"&gt;モジュールが標準化&lt;/a&gt;され、&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import" rel="noopener noreferrer"&gt;import&lt;/a&gt;と&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export" rel="noopener noreferrer"&gt;export&lt;/a&gt;の仕様が固まりました。今後も、 ES2015-2018と立て続けに続くようで標準化は順調に加速していくようです。&lt;/p&gt;

&lt;p&gt;2018 すべてのモダンブラウザがES6-Module(ESM)を実装完了&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import#Browser_compatibility" rel="noopener noreferrer"&gt;import&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;より関数型プログラミング的な、dynamic import（動的読み込み）がFirefoxにはまだ実装されていませんが、とりあえず基本的なモジュール化はモバイルも含めすべてのモダンブラウザ（EdgeじゃないIE除く）で実装完了されており、プロダクションレベルでも積極的に利用可能な情況になっています。&lt;/p&gt;

&lt;p&gt;Webブラウザがモジュールをそのまま実行してくれるようになってくると（本来そうであるべき）、わざわざなんか面倒で複雑なバンドラって必要？ということになってきます。ReactのJSXをトランスパイルしなければいけないというのも、実はTypeScriptのTSXで書いていたらTypeScriptがやってくれるのでBabelというトランスパイラは不要とかいろいろすっきりしそうな気がします。というか自分はそうしています。&lt;/p&gt;

&lt;p&gt;ESM/NPM(CJS)２つの互換性のないモジュールシステムの問題発生&lt;/p&gt;

&lt;p&gt;2018年になって、ようやくモバイル含めてもうすべてのモダンブラウザがES6-Module(ESM)が普通に使えるようになった、素晴らしい。ではこれから書くライブラリはすべてESMで行こう！それならわざわざwebpackつかって面倒なセットアップと開発フローはなくて済むんでしょ？&lt;/p&gt;

&lt;p&gt;現状はこういう流れになりつつあるのは間違いありません。それが本来の標準化されたモジュール化なのだから。&lt;/p&gt;

&lt;p&gt;しかしここで問題はすでに確立されたnode.モジュールのnpmエコがあるということです。nodeのモジュールフォーマットである&lt;a href="https://ja.wikipedia.org/wiki/CommonJS" rel="noopener noreferrer"&gt;CommonJS(CJS)&lt;/a&gt;ば後発のブラウザ標準のESMと互換性はありません。２つのメジャーなモジュールエコが互換性なく並立しているというのが現状です。&lt;/p&gt;

&lt;p&gt;Reactのコンポーネントはモジュールにそのまま呼応するので、Reactのドキュメンテーションではかなり早くからES6の&lt;code&gt;import&lt;/code&gt;/&lt;code&gt;export&lt;/code&gt;準拠で書かれていました。ブラウザでモジュールが実装される前からこのようにES6準拠となるのは、同時期に台頭したトランスパイラ（&lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;）と上記バンドラ(Browserify/webpack)に依存して技術を先取りできているからです。&lt;/p&gt;

&lt;p&gt;従って、Reactなどの先進的なフロントエンド開発をする際には、もうトランスパイラとバンドラをセットで使うのがデフォという感じになっています。そして驚くべきことに、React開発陣が完全にこの大前提にたっているためにReactライブラリ自体をES6Module(ESM)の仕組みで&lt;code&gt;import&lt;/code&gt;させるのにネイティブにESM対応モジュールをリリースしておらず、トランスパイラとバンドラにNPM用のモジュールを読ませて変換させるというリリースの仕方をしています。&lt;/p&gt;

&lt;p&gt;現状、別に規格化されているわけでもなんでもないnpmというモジュール/パッケージ管理システムとそれを単一ファイルに統合するバンドラを前提にフロントエンド開発が当たり前のように行われている、というのは、すべてブラウザ戦争により標準化されたモジュール化が立ち遅れたことが原因で、なかなか不安定な過渡期であると言えます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/react" rel="noopener noreferrer"&gt;react&lt;/a&gt;ライブラリは現在、&lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npm&lt;/a&gt;というNodeのエコのパッケージマネージャーで配布()されていて、WebPackやらのバンドラでブラウザのコードとするのは間違いないですが、これは劣った設計です。&lt;/p&gt;

&lt;p&gt;すでにnpmエコにおいてもコミュニティは積極的に&lt;code&gt;import&lt;/code&gt;/&lt;code&gt;export&lt;/code&gt;準拠でライブラリ・パッケージをリリースしているのですが、それはもちろんwebpack/browserifyのバンドラが処理してくれるという前提で皆そうしているようです。nodeはそもそもが自前のCJSモジュールベースで実装されているわけで、本来互換性のないESM対応についてはチーム内でもなかなか意見がまとまらないようで現状も混迷を極めており、早急な進展も望めない情況のようです。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2023/01 UPDATE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxch53e9fp8o8x43ex90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxch53e9fp8o8x43ex90.png" alt="image" width="529" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://esbuild.github.io/" rel="noopener noreferrer"&gt;https://esbuild.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;そしてesbuildをベースにした、&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faszlp5it3qx3jtp0w6ud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faszlp5it3qx3jtp0w6ud.png" alt="image" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;https://vitejs.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;が主流になりつつあります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk8v7o5txg0kktdgxudi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk8v7o5txg0kktdgxudi.png" alt="Image description" width="800" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://2022.stateofjs.com/en-US/libraries/build-tools/build_tools_experience_ranking" rel="noopener noreferrer"&gt;https://2022.stateofjs.com/en-US/libraries/build-tools/build_tools_experience_ranking&lt;/a&gt; &lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>discuss</category>
    </item>
    <item>
      <title>VSCodeでF#.NETの開発環境構築する方法を解説</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Fri, 13 Jan 2023 20:53:06 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/vscodedefnetnokai-fa-huan-jing-gou-zhu-surufang-fa-wojie-shuo-5do3</link>
      <guid>https://dev.to/ken_okabe_jp/vscodedefnetnokai-fa-huan-jing-gou-zhu-surufang-fa-wojie-shuo-5do3</guid>
      <description>&lt;h2&gt;
  
  
  事前準備
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://dev.to/ken_okabe_jp/potaburunetpuroziekuto-kai-fa-puroziekutomei-nige-li-saretayi-narunet-framework-sdkbaziyonwoinsutorusurufang-fa-wojie-shuo-5d2n"&gt;ポータブル.NETプロジェクト〜開発プロジェクト毎に隔離された異なる.NET Framework SDKバージョンをインストールする方法を解説&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;VisualStudioCodeが適切にインストールされているとき、&lt;/p&gt;

&lt;p&gt;プロジェクトのルートディレクトリから&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;code ./
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;とすることでVS Codeを立ち上げることが出来ます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2s6ViJ44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212236874-1a274bd7-6749-4144-9112-0cdd4bd7ed19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2s6ViJ44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212236874-1a274bd7-6749-4144-9112-0cdd4bd7ed19.png" alt="image" width="751" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extensionsから&lt;code&gt;net&lt;/code&gt; を検索&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KAgiHwxt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212224528-93ab558a-1254-4849-8770-aaa3d12ed8b2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KAgiHwxt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212224528-93ab558a-1254-4849-8770-aaa3d12ed8b2.png" alt="image" width="389" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.NET Extension Packをインストール。Microsoft公式提供です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yFqp_l6T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212224826-39ce9395-b802-4e57-8c44-7b6d1fc6b59d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yFqp_l6T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212224826-39ce9395-b802-4e57-8c44-7b6d1fc6b59d.png" alt="image" width="880" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;F#開発に必要なのはこのなかで&lt;/p&gt;

&lt;p&gt;Ionide for F#ですが、.NET Extension Packに含まれています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4KZFKIV0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212225124-2c63f847-a98c-4106-a487-2d926bc1e329.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4KZFKIV0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212225124-2c63f847-a98c-4106-a487-2d926bc1e329.png" alt="image" width="588" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;場合によっては必要ないかもしれませんが、VSCodeが（ターミナルから）起動している文脈に関わらず、適切にローカルディレクトリの相対PATHで&lt;code&gt;dotnet&lt;/code&gt;コマンドが使えるように、VSCodeのSettingで&lt;code&gt;dotnet&lt;/code&gt;で検索し、&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d0jUem8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212236496-40b4b2d1-1246-407f-8698-a76da57a647f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d0jUem8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212236496-40b4b2d1-1246-407f-8698-a76da57a647f.png" alt="image" width="880" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./.net/&lt;/code&gt;とSDKの相対ルートPATHを指定しておきます、&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/ja-jp/dotnet/fsharp/get-started/get-started-vscode"&gt;https://learn.microsoft.com/ja-jp/dotnet/fsharp/get-started/get-started-vscode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;カレントディレクトリがプロジェクトルートであることを確認した上で、&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotnet&lt;/code&gt; コマンドの&lt;a href="https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?view=aspnetcore-6.0"&gt;テンプレート機能&lt;/a&gt;を利用して、F#プロジェクトのコンソールプログラムを作成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new console &lt;span class="nt"&gt;-lang&lt;/span&gt; &lt;span class="s2"&gt;"F#"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eceeVI----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212227020-68d8ed08-5690-4f92-a184-203c0bf6a102.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eceeVI----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212227020-68d8ed08-5690-4f92-a184-203c0bf6a102.png" alt="image" width="767" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;結果、以下のようなプロジェクトになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fs-test
├── bin
│   └── Debug
├── fs-test.fsproj
├── .net
│   ├── dotnet
│   ├── host
│   ├── LICENSE.txt
│   ├── packs
│   ├── sdk
│   ├── sdk-manifests
│   ├── shared
│   ├── templates
│   └── ThirdPartyNotices.txt
├── obj
│   ├── Debug
│   ├── fs-test.fsproj.nuget.dgspec.json
│   ├── fs-test.fsproj.nuget.g.props
│   ├── fs-test.fsproj.nuget.g.targets
│   ├── project.assets.json
│   └── project.nuget.cache
└── Program.fs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1WGRiLQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212235013-737a087c-560b-484f-8d04-367f6987953c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1WGRiLQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212235013-737a087c-560b-484f-8d04-367f6987953c.png" alt="image" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Program.fs&lt;/code&gt; に、たとえば以下のようなコードを追加して、&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IrVhX110--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212235885-a74fe965-729e-4845-958c-5d7c221fbdce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IrVhX110--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/212235885-a74fe965-729e-4845-958c-5d7c221fbdce.png" alt="image" width="845" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;結果、自動的に、TypeAnotation（型注釈）が表示されるようになれば成功です。&lt;/p&gt;

&lt;p&gt;初期設定では、異なる表示になると思いますが、好みで上手く調整してみてください。&lt;/p&gt;

&lt;p&gt;コードを実行するには、プロジェクトのルートディレクトリで、&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet run                 
Hello from F#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>ポータブル.NETプロジェクト〜開発プロジェクト毎に隔離された異なる.NET Framework SDKバージョンをインストールする方法を解説</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Fri, 13 Jan 2023 20:46:28 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/potaburunetpuroziekuto-kai-fa-puroziekutomei-nige-li-saretayi-narunet-framework-sdkbaziyonwoinsutorusurufang-fa-wojie-shuo-5d2n</link>
      <guid>https://dev.to/ken_okabe_jp/potaburunetpuroziekuto-kai-fa-puroziekutomei-nige-li-saretayi-narunet-framework-sdkbaziyonwoinsutorusurufang-fa-wojie-shuo-5d2n</guid>
      <description>&lt;h2&gt;
  
  
  .NETの異なるバージョン
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqerji6dqiqree0gvvpjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqerji6dqiqree0gvvpjp.png" alt="image" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/ja-jp/download" rel="noopener noreferrer"&gt;https://dotnet.microsoft.com/ja-jp/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.NETにはバージョンがあります。&lt;/p&gt;

&lt;h2&gt;
  
  
  異なるバージョンの互換性の問題
&lt;/h2&gt;

&lt;p&gt;通常の手順に従うとローカルマシンのグローバル環境にインストールすることになり、たとえば、.NET6.0から.NET7.0にアップグレードする際など、既存の個別の.NETプロジェクトでバージョン互換性の問題が発生してしまいます。&lt;/p&gt;

&lt;p&gt;Dockerなどのコンテナ技術は、このような複数の異なるバージョンを互いに安全に隔離して、異なるバージョンでそれぞれ開発されたプロジェクトやアプリケーションを運用するために開発された技術であると言えます。&lt;/p&gt;

&lt;h2&gt;
  
  
  環境の隔離
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73f0nhzc5p2dhtn0pi2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73f0nhzc5p2dhtn0pi2m.png" alt="docker" width="375" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/Docker" rel="noopener noreferrer"&gt;Docker（ドッカー）&lt;/a&gt;は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである[5]。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  .NET Framework での side-by-side 実行
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/ja-jp/dotnet/framework/deployment/side-by-side-execution" rel="noopener noreferrer"&gt;https://learn.microsoft.com/ja-jp/dotnet/framework/deployment/side-by-side-execution&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;side-by-side 実行は、アプリケーションまたはコンポーネントの複数のバージョンを同じコンピューターで実行する機能です。 共通言語ランタイムの複数のバージョン、および 1 つの共通言語ランタイムを使用するアプリケーションとコンポーネントの複数のバージョンを同じコンピューターで同時に実行できます。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://atmarkit.itmedia.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_01.html" rel="noopener noreferrer"&gt;https://atmarkit.itmedia.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_01.html&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;.NET Frameworkのバージョン・ポリシー&lt;/p&gt;

&lt;p&gt;　これまで、開発者はソフトウェアのバージョンについて、次のような悩みを抱えていた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ユーザーにできるだけ新しいバージョンを使ってもらいたい。&lt;/li&gt;
&lt;li&gt;&lt;p&gt;下位互換性のテストはやりたくないし、完全にはできない。&lt;br&gt;
　また、ユーザーはユーザーで次のような悩みを抱えていた。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;新しいバージョンを入れた結果、既存のアプリケーションが動かなくなるのは困る。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;新バージョンに問題がある場合は、素早く簡単に、うまく動作していた以前のバージョンに戻したい。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;　.NET Frameworkには、これまでの反省が大いに活かされている。ここからは、.NET Frameworkのソフトウェアのバージョン管理方法を解説しよう。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;.NETでは実行時からして、バージョン非互換の問題が発生しないようなバージョン・ポリシーがある優れた設計です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ポータブル.NETプロジェクトの作成が可能
&lt;/h2&gt;

&lt;p&gt;.NET Frameworkでは実行時だけではなく、開発プロジェクト毎に異なるSDKバージョンをインストールすることができます。いわばポータブル.NETプロジェクトが作成可能なのです。&lt;/p&gt;

&lt;p&gt;繰り返しですが、通常の手順に従うとローカルマシンのグローバル環境にインストールすることになり、たとえば、.NET6.0から.NET7.0にアップグレードする際など、既存の個別の.NETプロジェクトでバージョン互換性の問題が発生してしまいます。&lt;/p&gt;

&lt;p&gt;しかし、ちょっとした工夫でDockerのような仕組みを必要とせず、プロジェクト・ディレクトリー毎に異なる.NET Framework環境を安全に隔離することができます。&lt;/p&gt;

&lt;h2&gt;
  
  
  ポータブル.NETプロジェクトの作成アウトライン
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. .NET-SDKダウンロード
&lt;/h4&gt;

&lt;p&gt;公式サイトから任意のプラットフォームの特定バージョンの.NET-SDKのバイナリ（アーカイブ）をダウンロードする&lt;/p&gt;

&lt;h4&gt;
  
  
  2. プロジェクト・ディレクトリにSDKを配置
&lt;/h4&gt;

&lt;p&gt;プロジェクトディレクトリ下に.NET-SDKディレクトリを作成し、そのディレクトリ下で解凍・展開&lt;/p&gt;

&lt;h4&gt;
  
  
  3. PATHを通す
&lt;/h4&gt;

&lt;p&gt;ターミナル環境とVSCodeで.NET-SDKの相対PATHを通す&lt;/p&gt;

&lt;h2&gt;
  
  
  1. .NET-SDKダウンロード
&lt;/h2&gt;

&lt;p&gt;公式サイトから任意のプラットフォームの特定バージョンの.NET-SDKのバイナリ（アーカイブ）をダウンロードします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/ja-jp/download" rel="noopener noreferrer"&gt;https://dotnet.microsoft.com/ja-jp/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwxd5mggd060booiu1g3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwxd5mggd060booiu1g3.png" alt="image" width="381" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;おすすめ&lt;/strong&gt; 、とも書いてあるし、最近安定リリースされた.NET 7.0をLinux環境にインストールすることにします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/ja-jp/download/dotnet/7.0" rel="noopener noreferrer"&gt;全 .NET 7.0 ダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfybrid3hgwoo30ve8zl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfybrid3hgwoo30ve8zl.png" alt="image" width="547" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ここで、通常のインストールならば、OS毎の &lt;strong&gt;インストーラー&lt;/strong&gt; を選択することになるのですが、ポータブルSDKインストールのためにはバイナリを個別に指定してダウンロードします。また、&lt;a href="https://dotnet.microsoft.com/ja-jp/download/dotnet/scripts" rel="noopener noreferrer"&gt;dotnet-install scripts&lt;/a&gt;でもできないことはないかもしれませんが、事前知識やコマンドが煩雑になると思います。&lt;/p&gt;

&lt;p&gt;今回は、LInux/&lt;a href="https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.102-linux-x64-binaries" rel="noopener noreferrer"&gt;x64&lt;/a&gt;プラットフォームのバイナリをダウンロードします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl4kr2dph3bc7na5856p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl4kr2dph3bc7na5856p.png" alt="image" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotnet-sdk-7.0.102-linux-x64.tar.gz&lt;/code&gt; というような特定のバージョンと特定のプラットフォームのアーカイブファイルがダウンロードされるはずです。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. プロジェクト・ディレクトリにSDKを配置
&lt;/h2&gt;

&lt;p&gt;プロジェクトディレクトリ下に.NET-SDKディレクトリを作成し、そのディレクトリ下でダウンローしたアーカイブファイルを解凍・展開していきます。&lt;/p&gt;

&lt;p&gt;任意のプロジェクト・ディレクトリを作成します。今回は&lt;code&gt;fs-test&lt;/code&gt; という名前のF#(.NET)のためのプロジェクトを作成します。&lt;/p&gt;

&lt;p&gt;以下ターミナル環境&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;fs-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;作成したディレクトリへ移動し、さらに.NET-SDKのディレクトリを作成します。なんでも良いのですが、&lt;code&gt;.net&lt;/code&gt;という名前のディレクトリを作成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fs-test
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; .net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;適当なアンアーカイバ−を利用し、すでにダウンロードしているファイルを解凍し、このディレクトリ下に配置します。&lt;/p&gt;

&lt;p&gt;結果、以下のようなディレクトリ構成になるようにします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fs-test
└── .net
    ├── dotnet
    ├── host
    ├── LICENSE.txt
    ├── packs
    ├── sdk
    ├── sdk-manifests
    ├── shared
    ├── templates
    └── ThirdPartyNotices.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. PATHを通す
&lt;/h2&gt;

&lt;p&gt;ターミナル環境とVSCodeで.NET-SDKの相対PATHを通します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.102-linux-x64-binaries" rel="noopener noreferrer"&gt;https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.102-linux-x64-binaries&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;には、&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp76tsivarluniutfzg1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp76tsivarluniutfzg1i.png" alt="image" width="354" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;とありますが、これは&lt;code&gt;$HOME&lt;/code&gt;に配置されたSDKへのPATHを通す方法です。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$HOME/dotnet&lt;/code&gt; の代わりに&lt;code&gt;./.net/dotnet&lt;/code&gt;  と相対パスにする方法もありますが、自分はZSHの&lt;code&gt;.zshrc&lt;/code&gt;で、以下のように&lt;code&gt;dotnet&lt;/code&gt;コマンドのエイリアスを作りました。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;dotnet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.net/dotnet'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ターミナル環境（ZSH）を再度立ち上げるなどして、環境偏向を反映させます。&lt;/p&gt;

&lt;p&gt;カレントディレクトリがプロジェクトルートの &lt;code&gt;fs-test&lt;/code&gt;であることを確認した上で、&lt;code&gt;dotnet&lt;/code&gt;コマンドが通るか？正しいバージョンが表示されるか？確認します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
7.0.102
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで、別の.NETプロジェクトでたとえばNET6.0-SDKを配置した場合、同じコマンドで、相対PATHでプロジェクトローカルのSDK特定されるので、異なる適切な.NETバージョンが表示されるはずです。&lt;/p&gt;

&lt;p&gt;ポータブル.NETプロジェクトのSDKのディレクトリである&lt;code&gt;.net&lt;/code&gt;のサイズは535.6Mでした。&lt;/p&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://dev.to/ken_okabe_jp/vscodedefnetnokai-fa-huan-jing-gou-zhu-surufang-fa-wojie-shuo-5do3"&gt;VSCodeでF#.NETの開発環境構築する方法を解説&lt;/a&gt;
&lt;/h3&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Arch Linuxのインストールが超かんたんになっている ~ Arch Installer</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Fri, 13 Jan 2023 20:39:40 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/arch-linuxnoinsutorugachao-kantanninatuteiru-arch-installer-5d76</link>
      <guid>https://dev.to/ken_okabe_jp/arch-linuxnoinsutorugachao-kantanninatuteiru-arch-installer-5d76</guid>
      <description>&lt;h2&gt;
  
  
  Archはそもそもインストールすることが難しかった
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyk0dq15qxhycvlqsqrwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyk0dq15qxhycvlqsqrwb.png" alt="image" width="600" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f64uuyzevaqqv2wuq4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f64uuyzevaqqv2wuq4k.png" alt="image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpwj32enlm4k2uubrol9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpwj32enlm4k2uubrol9.png" alt="image" width="604" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89" rel="noopener noreferrer"&gt;インストールガイド&lt;/a&gt; (難しい)&lt;/p&gt;

&lt;h2&gt;
  
  
  最近公式からインストールスクリプトが公開
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbl7esdq0wflom606ato.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbl7esdq0wflom606ato.png" width="529" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/archlinux/archinstall" rel="noopener noreferrer"&gt;Arch Installer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;記事を書こうと思っていたら、すでに書いている人がいた。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.debugpoint.com/archinstall-guide/" rel="noopener noreferrer"&gt;Installing Arch Linux Using archinstall Automated Script [Complete Guide]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GUIデスクトップ環境のインストールまで世話をしてくれて、自分の場合はGnomeであるが再起動したらスムーズにGUIデスクトップ環境になった。&lt;/p&gt;

&lt;p&gt;基本、鬼門はWifiネット環境の構築なのだが、足場となるイーサネットLAN環境がなくても、今どきはスマホのテザリングでUSBネット接続が可能なので、それをLAN接続代わりにして、あとはスクリプトでGUIデスクトップまで持っていくと、すでにGUIでWifi設定すればいいだけになっている。&lt;/p&gt;

&lt;p&gt;あと、通常はGRUBブートの設定がかなり難解なのだが、これはLinuxカーネルのスタブ起動みたいなやつを直接設定してくれており、GRUBを介さずに速やかに起動する構成になるのは素晴らしかった。GRUBフリー。&lt;/p&gt;

</description>
      <category>ansible</category>
      <category>automation</category>
      <category>devops</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Manjaroはなぜ人気であり続けたのか？</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Wed, 14 Sep 2022 00:34:18 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/manjarohanazeren-qi-dearisok-ketanoka-35lf</link>
      <guid>https://dev.to/ken_okabe_jp/manjarohanazeren-qi-dearisok-ketanoka-35lf</guid>
      <description>&lt;p&gt;以下の文章は、かつで自分が出没していた某所（Quora）に書いたものです。&lt;br&gt;
2019年&lt;/p&gt;




&lt;p&gt;&lt;a href="https://jp.quora.com/%E6%84%9B%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8BLinux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0/answers/125436805/comment/91783461"&gt;UbuntuよりもManjaroをおすすめしている理由って何ですか?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jp.quora.com/%E6%84%9B%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8BLinux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0/answers/125436805/comment/91783461"&gt;僕は最近はなんとなくUbuntuを使うことが多かったのですが、この回答で初めてManjaroの存在を知って、少し気になっているところです。&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;のA2Aです。&lt;/p&gt;

&lt;p&gt;★短い答え&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.archlinux.org/"&gt;Arch Linux&lt;/a&gt;の血統で毛並みが良い（後述）。&lt;/p&gt;

&lt;p&gt;Archの利点である、シンプルな設計で、&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9"&gt;ローリング・リリース&lt;/a&gt;の「常に最新バージョンでシステムが統合される」という特徴を継承しながら、初心者にとって導入が難しいということや、常に最新すぎて安定性を損なうので自己対処スキルが必須というハードルの高さを解消している。&lt;/p&gt;

&lt;p&gt;Ubuntuで採用されている固定リリースよりも、継続的な使用感をもたらすローリング・リリースのほうが好まれている。またManjaro掘り下げると、Archのシンプル設計の筋の良さがUbuntuよりも優れているし、その情報は確実にArchのドキュメントに存在している。&lt;/p&gt;

&lt;p&gt;★長い答え&lt;/p&gt;

&lt;p&gt;Linuxディストリビューション情報サイトのDistroWatch&lt;/p&gt;

&lt;p&gt;&lt;a href="https://distrowatch.com/?language=JP"&gt;Put the fun back into computing. Use Linux, BSD.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;では、一昔は圧倒的人気であった&lt;a href="https://ja.wikipedia.org/wiki/Ubuntu"&gt;Ubuntu&lt;/a&gt; それからMintを軽く抑えて&lt;a href="https://ja.wikipedia.org/wiki/Manjaro_Linux"&gt;Manjaro Linux&lt;/a&gt;が人気です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S7MAB1CL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-72c21cfd21616955c8c6013e1b3348cb" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S7MAB1CL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-72c21cfd21616955c8c6013e1b3348cb" alt="" width="374" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Manjaroは、&lt;a href="https://www.archlinux.org/"&gt;Arch Linux&lt;/a&gt;がベースになっています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CTcs0E58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-17ecae3d3cdde27c6ce25e24b5f8dbf5" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CTcs0E58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-17ecae3d3cdde27c6ce25e24b5f8dbf5" alt="" width="240" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ArchはLinux上級者に人気のディストリビューションで、シンプリシティ、ミニマリズムの設計哲学があります。&lt;/p&gt;




&lt;p&gt;Arch Linux は、&lt;a href="https://en.wikipedia.org/wiki/ja:x64"&gt;x86_64&lt;/a&gt; 向けに独自に開発された、あらゆる用途に対応できる万能 GNU/Linux ディストリビューションです。その開発は、シンプリシティ、ミニマリズム、およびコードの簡潔性に焦点を当てています。Arch は最小限の基本システムの状態でインストールされ、ユーザー自身が、ユーザーの理想とする環境のために必要なものだけをインストールして構築することができます。GUI の構成設定ツールは公式には提供されず、ほとんどのシステム設定はシェル上でテキストファイルを編集することで行います。Arch はローリングリリースモデルをベースとしており、常に最先端であるように努め、ほとんどのソフトウェアは最新の安定バージョンが提供されます。&lt;/p&gt;




&lt;p&gt;原則&lt;/p&gt;

&lt;p&gt;シンプルであること&lt;/p&gt;

&lt;p&gt;シンプリシティは Arch の開発における絶対的な主たる方針です。多くの GNU/Linux ディストリビューションは自身を「シンプル」だと定義していますが、シンプルであること自身にはいろいろな意味があります。&lt;/p&gt;

&lt;p&gt;Arch Linux はシンプリシティを、「不必要な追加、修正、あるいは複雑化を行わない」ことと定義し、ユーザーごとに、必要に応じた軽量な UNIX ライクベースのシステム構築を可能とします。要するに、エレガントで最小主義なアプローチだということです。&lt;/p&gt;




&lt;p&gt;これは、たとえばPCの上級者が、市販のPCの規定のスペックや、いろいろ不要な仕様には満足できず、ベアボーンから自由に構成して自作PCにする、というのと同じです。とにかくパーツとマニュアルだけ寄越せと。&lt;/p&gt;

&lt;p&gt;それ故、必然的にArchは玄人好みのディストロだし、自作PC同様、初心者にはかなりハードルが高いディストロです。しかし、自分で構成させるので、&lt;a href="https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89"&gt;Wikiが他のディストロを寄せ付けないレベルで充実しています&lt;/a&gt;。Ubuntuコミュニティも強力で情報は豊富ですが、細かい設定の情報はArchのほうが上で、実際Linuxで困ったことがあれば、”arch” とキーワードくっつてググると的を得た情報がヒットすることが多いです。&lt;/p&gt;

&lt;p&gt;１からパーツを組み立てるので勉強にもなります。かといってソースコードから逐一コンパイルする必要もなく、ちゃんとバイナリベースのパッケージシステムがあり、それがローリングリリースされています。&lt;/p&gt;

&lt;p&gt;公式以外にもコミュニティベースのレポジトリは充実しており常に最新にメンテナンスされています。Linuxで使えるアプリでArchで使えなかったアプリは今までにひとつもありませんでした。&lt;/p&gt;

&lt;p&gt;Ubuntu＝メーカーが販売してるPC　素人向けの情報豊富&lt;/p&gt;

&lt;p&gt;Arch = ベアボーンからパーツ組み立てる自作PC　玄人向けの情報豊富&lt;/p&gt;

&lt;p&gt;みたいな棲み分けです。&lt;/p&gt;

&lt;p&gt;Archは素晴らしいので自分も数年ほどずっと使っていました。しかし、不満も出てきました。&lt;/p&gt;

&lt;p&gt;１．ローリングリリースでカーネル含め、あまりにも頻繁に最新バージョンにアップデートするので、更新作業がうっとうしくなる、ちょっとアップデートさぼってたら、カーネル、デスクトップ環境、各種コアライブラリ、軒並み全部アップデートするはめになりしんどい。何よりカーネルもデスクトップ環境もさほど安定してないのを掴まされることはある。&lt;/p&gt;

&lt;p&gt;２．インストールはCUIでいいんだけど、さすがに何回も毎度同じ作業をするのはしんどい。&lt;/p&gt;

&lt;p&gt;これを解消しているのが&lt;a href="https://manjaro.org/"&gt;Manjaro&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lgw3lD5b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-47c19b9f85aabaf754194b250e3d122e" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lgw3lD5b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-47c19b9f85aabaf754194b250e3d122e" alt="" width="250" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Manjaroのレポジトリーは、Archのレポより１テンポくらい遅く管理されていて、ArchのStableバージョンはManjaroのTestバージョン相当、という具合により慎重で安定したバージョンが提供されており、アップデートもさほど頻繁ではありません。&lt;/p&gt;

&lt;p&gt;とにかく足元のカーネルがそんなしょっちゅうアップデートされて安定性も損なったら話にならないわけで、カーネルの安定性が一番重要。&lt;/p&gt;

&lt;p&gt;Manjaroのキラーコンテンツは&lt;a href="https://wiki.manjaro.org/index.php?title=Manjaro_settings_manager%EF%BC%88%E6%97%A5%E6%9C%AC%E8%AA%9E%EF%BC%89"&gt;Manjaro settings manager&lt;/a&gt;で、カーネルのアップデートの状態がわかりやすく、コントロールしやすいことです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sVxJQ_ML--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-8053359cbceaf826c0cfda90515b37c0-pjlq" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sVxJQ_ML--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qph.cf2.quoracdn.net/main-qimg-8053359cbceaf826c0cfda90515b37c0-pjlq" alt="" width="451" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;だいたい、一番新しい、LTS+RecommendedのLinuxカーネルをインストールして走らせておけば間違いありませんし、この選択自体ころころ変わるということもありません。&lt;/p&gt;

&lt;p&gt;後の使い勝手は、Arch長年使ってたのでよくわかりますが、まったく変わりません。コアシステムの部分は上記のとおりManjaro独自のレポですが、非公式のコミュニティレポはArchと共通なので豊富な資産はそのままということになります。&lt;/p&gt;

&lt;p&gt;また、最初からデスクトップ環境とパッケージでGUIインストール環境も提供されているので、初心者への導入ハードルの高さもまったくありません。&lt;/p&gt;

&lt;p&gt;あれ、それなら別にUbuntuじゃなくても良くない？ローリングリリースのほうが良いし、ってのが今の流れだと思います。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>関数型プログラマーにとっての関数型プログラミングと命令型・オブジェクト指向のイメージ</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Sun, 11 Sep 2022 09:33:47 +0000</pubDate>
      <link>https://dev.to/ken_okabe_jp/guan-shu-xing-puroguramanitotutenoguan-shu-xing-puroguramingutoming-ling-xing-obuziekutozhi-xiang-noimezi-1mla</link>
      <guid>https://dev.to/ken_okabe_jp/guan-shu-xing-puroguramanitotutenoguan-shu-xing-puroguramingutoming-ling-xing-obuziekutozhi-xiang-noimezi-1mla</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--auWIk2Lq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/189518941-c6c4262f-a92e-40f4-a0b5-eee26dac5375.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--auWIk2Lq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1316994/189518941-c6c4262f-a92e-40f4-a0b5-eee26dac5375.png" alt="functional programming layer" width="880" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;プログラミングの本質は数学的構造の構築&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;現実世界で時間変化する値に紐づく構造も例外ではない（FRP）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;コンピュータのハードウェアのリソースは有限であり、計算速度、メモリの物理的制約がある&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;したがって数学構造をそのままハードウェアにマッピングするのは無理&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;そもそも命令型プログラミング、オブジェクト指向（定義の流派問題はとばす）は、数学よりもハードウェアの挙動（時間的変化）に素朴な感覚で着想しデザインされている&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;数学は本質的にシンプルで論理構造に無駄がなく間違いがない&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;少なくとも構造を定義するときに間違いがあれば見つけやすい&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;人間の思いつきや発明、方針、設計には間違いが多い、余計な発明をして問題を複雑にする事を好む&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;人間の間違いは見つけにくい&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;間違っていることが明らかであっても間違いを認めず政治的論争になることもある&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;複雑な構造のほうがいいと信奉する人間はプログラマーに向いていないし、時間の無駄だし、&lt;a href="https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87"&gt;KISSの原則&lt;/a&gt;を学べ&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;プログラミング　＝　数学　＋　人間のエンジニアリング&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;いろいろ思いついて発明して人間のエンジニアリングの層を厚くしようとするな、人間はそれほど賢くない&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数学の土台に手を加える人間のエンジニアリングの層（Wrapper）は薄いほうが望ましい&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;なぜならば、そのほうが間違うリスクを最小にできるから&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;だから関数型プログラミングのアプローチはより優れている&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;オブジェクト指向は、本来、関数、代数構造という数学で実現可能なコードをオブジェクト、クラスという人間の発明で実現しようとした&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://betterprogramming.pub/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7"&gt;人間の思いつきや発明、方針、設計には間違いがあるので案の定失敗して、今では回避される傾向にある&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://youtu.be/j71n33A0CkI"&gt;当初のカプセル化、継承によりコードが良くなるという哲学はなかったことにされて「正しいオブジェクト指向」とかゴールポストを動かして正当化しようとする人たちは未だに多いのだが、そういうことじゃないから&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;数学、数学構造は堅牢であり、人間の発想により活用はされるが、時間が経過して、やっぱり使いにくい発明だった、とかゴールポストが動いて元来の方針がチャラになるようなことはない&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;関数型言語の差異は薄いWrapperであり、本質的に習得した数学部分の知識が無駄になることはない、ずっと共通して使い回せる&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;図の左側はC#、右側はF#、Microsoft.Netのツートップではあるが、比較するとF#は極端なまでに使われていないし虐げられてるとすら言える(&lt;a href="https://github.com/dotnet/maui/discussions/115"&gt;MAUI初日からサポートしてくれという嘆き&lt;/a&gt;)、それでも.netの威力で関数型言語の中ではトップクラスに使われている言語なのでもっと増えて欲しいし、MSはもっと大規模な資本投下をF#にむけてすべき&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>関数型プログラミング</category>
    </item>
  </channel>
</rss>
