並べ替え

昔から良く言われてるのは「近くに質問できる人がいるほう」ですね。他の回答者の皆さんもおっしゃるとおり、後の乗り換えは初学のときほど大変じゃないので、最初のバリアが低い方がいいと思います。

わたしは Linux を SLS

/ Slackware から使い始めて、いまはもっぱら Debian にしていますが(職場・自宅に計 10 台くらい)、CentOS も FreeBSD も管理者をしたことはあります。FreeBSD もよくできていていますよね。

脚注

そもそもLinuxはUNIXじゃないよってツッコミは野暮というものでしょうか…。UNIXなので、そこは大目に見ましょう。

ここはやはりSVR4(System V Release 4.0)の正当な流れを組むものをお勧めしましょう。Linux?ああ、UNIXのパチもんね。BSD?ああ、所詮どっかの大学が作ったオモチャね。AT&Tのベル研究所で作られたUNIXの正統な後継はSVR4であり、SVR4ではないUNIXはUNIXではないと言っても過言ではない!(SVR5?そんなものはしらん)という方にお勧めするのはOpenIndianaです。

OpenIndianaはSolarisを流れを組むオープンソースのOSです。誰でも自由に使うことができます。太陽が滅んでもOSSは滅びぬの言葉の如く、まだ、しぶとく開発が行われています(一時期本当にやばかった…いや、今もか)。本当のUNIXに触りたければOpenIndianaを触ると良いでしょう。GNU化が進んでLinuxと遜色ないというところも利点(?)です。

そんなこだわりは無いし、なんかインストールとか難しいのは嫌だというそんなあなた。わかりました。私が考える最も初心者向けのUNIXをお教えしましょう。それはmacOSです。macOSはSVR4ではありませんが、第二の正統なUNIXであるBSDの一つです。つまり、UNIX以外の何者でもありません。そして

そもそもLinuxはUNIXじゃないよってツッコミは野暮というものでしょうか…。UNIXなので、そこは大目に見ましょう。

ここはやはりSVR4(System V Release 4.0)の正当な流れを組むものをお勧めしましょう。Linux?ああ、UNIXのパチもんね。BSD?ああ、所詮どっかの大学が作ったオモチャね。AT&Tのベル研究所で作られたUNIXの正統な後継はSVR4であり、SVR4ではないUNIXはUNIXではないと言っても過言ではない!(SVR5?そんなものはしらん)という方にお勧めするのはOpenIndianaです。

OpenIndianaはSolarisを流れを組むオープンソースのOSです。誰でも自由に使うことができます。太陽が滅んでもOSSは滅びぬの言葉の如く、まだ、しぶとく開発が行われています(一時期本当にやばかった…いや、今もか)。本当のUNIXに触りたければOpenIndianaを触ると良いでしょう。GNU化が進んでLinuxと遜色ないというところも利点(?)です。

そんなこだわりは無いし、なんかインストールとか難しいのは嫌だというそんなあなた。わかりました。私が考える最も初心者向けのUNIXをお教えしましょう。それはmacOSです。macOSはSVR4ではありませんが、第二の正統なUNIXであるBSDの一つです。つまり、UNIX以外の何者でもありません。そして、MacであればmacOSがプレインストールされていますので、インストールする手間も省けます。素晴らしい!

macOSを使うとき、あなたはきっとUNIXであることを意識することはほとんどありません。それほどmacOSはユーザーフレンドリーで誰でも触れるようになっています。しかし、その根幹はやはりUNIXであり、UNIXを触っていることに他なりません。え、コマンドを触りたいって?と、とりあえず、ターミナルを起動してください。

Macなんて買うお金が無い。Windowsしか持っていない。ふむ、我が儘ですね。では、妥協してLinuxを良しとしましょう。Windows 10の64bitであれば、WSLでUbuntuです。以上です。これ以外で一体何を迷う必要があるのでしょうか?インストールもGUIだけで簡単にできますし、(ファイルシステムはちょっと遅いけど)そんなに重くない。これ一つで十分です。

持っているパソコンがWindows 10の64bitじゃないって?それはパソコンを買い換えた方が良いじゃないですかって思うのですが、ああ、Windows 7がもうすぐなくなるから、OS消してパソコンだけを再利用したい派の方ですね、わかります。それなら、Ubuntu Desktop版あたりが一番いいんじゃ無いですかね。ライブDVD(またはライブUSB)からGUIでポチポチっとインストールできますし、ドキュメントとかユーザーも多いですし、トラブルが一番少ない、かつ、解決しやすいと思います。趣味に走るなら他にもたくさん選択肢があるんですが、自分で解決できるある程度の能力が無いと厳しいですよ。

今あるパソコンはいじりたくないだって!ほんとう、我が儘ばっかりです。では、必要最低限の投資でいきましょう。Raspberry PiにRaspbianです。ディスプレイやキーボードが既にあるなら、本体とその他アダプター等を含めても1万円程度揃えられます。ディスプレイやキーボードがないなら、Chromebookというのもあります。最近のChromebookはLinuxとしても使えるようになっているそうです(又聞き、試してない)。やすいものは2~3万円で買えますので、さわりだけならこんなのでも良いでしょう。

お金はあるって?なら、サーバーでも買って、VMware ESXiでも入れて、興味があるOSを片っ端から入れていったらいいんじゃないですかね。私はそのようにしています。

たくさんあります。

私はアップルでMac OS XにUNIX準拠の認定を取らせるチームでテクニカルリーダーをしていました。そしてこれはThe Open GroupがUNIX™の商標利用を巡って$2億の支払いをアップルに求めた裁判を回避するために行ったことです。

この裁判は、Mac OS Serverのオーナー(訳注:アップル)が、ウェブサイトをはじめとするサーバ製品の広告にUNIXと掲示し続けたことから起こされました。

選択肢としては:

  1. Mac OS Xを本物のUNIX™にして、提訴の根拠を無くす。これはまた、Linuxの台頭で負けつつあるUNIX業界にThe Open Groupを縛ることができるので、選択肢の1つになっていました。
  2. The Open Groupを$10億で買収する。アップルは商標を自由に利用できるようになり、望むなら電源ケーブルにも使えます。ただし既に商標権を許諾しているサン・マイクロシステムズやIBMとの契約を反故にすることはできません。

私は1番目の選択肢を実行するためにチームを統率できるかと聞かれました。私は「はい」と答えましたが、条件として、この準拠プロジェクトを盾に他の部署が持つコードベースを強制的に修正できる権限を持つこと、バグデータベースに修正理由や修正内容の詳細を記録してコードを修正するのではなく、もっと緩いルールでコミットできること、などを挙げました。

私は

たくさんあります。

私はアップルでMac OS XにUNIX準拠の認定を取らせるチームでテクニカルリーダーをしていました。そしてこれはThe Open GroupがUNIX™の商標利用を巡って$2億の支払いをアップルに求めた裁判を回避するために行ったことです。

この裁判は、Mac OS Serverのオーナー(訳注:アップル)が、ウェブサイトをはじめとするサーバ製品の広告にUNIXと掲示し続けたことから起こされました。

選択肢としては:

  1. Mac OS Xを本物のUNIX™にして、提訴の根拠を無くす。これはまた、Linuxの台頭で負けつつあるUNIX業界にThe Open Groupを縛ることができるので、選択肢の1つになっていました。
  2. The Open Groupを$10億で買収する。アップルは商標を自由に利用できるようになり、望むなら電源ケーブルにも使えます。ただし既に商標権を許諾しているサン・マイクロシステムズやIBMとの契約を反故にすることはできません。

私は1番目の選択肢を実行するためにチームを統率できるかと聞かれました。私は「はい」と答えましたが、条件として、この準拠プロジェクトを盾に他の部署が持つコードベースを強制的に修正できる権限を持つこと、バグデータベースに修正理由や修正内容の詳細を記録してコードを修正するのではなく、もっと緩いルールでコミットできること、などを挙げました。

私はゴーサインを受けました。


そして既存のMac OSのソースコードに対し、準拠確認テストスイートを実行したところ、すぐにヘッダーファイルでエラーが出ました。

エド・モイと私は、<stdio.h>にあったある型を、本来あるべき場所に移動するため、2行の変更を加えました。1行は<stdio.h>の中にあり、もう1行はその型が本来あるべき場所であるファイルです。

再度テストを実行すると、ヘッダーファイルのエラーが1つ消えました。

そして私たちは、iTunesを含む、Mac OS Xにある全てのコードをリビルドする「ワールドビルド」を実行しました。

その事実上たった1行の修正で、152個のプロジェクトがビルドに失敗しました(137個だったかもしれません)。

iTunesもダメでした。


エドと私はそれらのプロジェクトを1つ1つ修正して、変更があってもなくてもビルドできるようにしました。

そして再びワールドビルドを実施し、全てビルドされました。

そう、私たちはこの時点で、アップルの全てのソースコードにアクセスできたのです。

最優先で各プロジェクトに修正リクエストを投げたところ、一部はすぐに優先順位を下げられてしまいましたが、私たちが修正済みパッチを提供していたので、すぐに適用してくれたプロジェクトもありました。

そしてエンジニアリング担当副社長のバートランド・サーレイは、下げられてしまった優先順位を再び上げてくれました。

それからヘッダファイルの修正をコミットしました。


ここで私たちはプロジェクト全体の実現可能性を改めて見直さなければなりませんでした。

エドと私は、プロジェクトを引き受ける際に出した条件があれば、期限内に実現できると思っていました。

エドは何でも直接言ってくれました。

私は自分の仕事人生を賭けてイエスと答え、ゴーという返事をもらいました。

話はスティーブのところまで伝わってしまいました。

私たちはゴーをもらいました。

最終的にアップルは$2億だか$10億だかを節約し、Mac OS X Serverの宣伝資料を全て刷新しました。

私たちはこれが完成したら、$2億の1/10、つまり$2000万の株が貰える約束になっていました。私に$1000万、エドに$500万、そしてMac OS Xの開発を望んでいたカレン・クリップスに$500万です。彼女は素晴らしいエンジニアであり、技術的な連絡係として、定期的にテストを実行したり、テストが通らないとエドや私に文句を言ったりする仕事をしていました。

これは私の職を危険に晒すもので、将来この業界で生きていけなくなる可能性があり、だから$1000万を貰ったのです。

また技術リーダーはDRI(直接責任者)ですので、誰も直さないものや、誰も直せないものを、直さなければなりません。

また私は単なる技術リーダーではなく、事実上のプロジェクトマネージャーでもありました。

たくさんの帽子を被りました。(訳注:様々な役目を一挙に引き受けること)

これは長い戦いになりそうでした。


私の見積もりでは5人のチームで1年でした。3人のマウスケテール[*](スペルミスじゃないよ)と2人の契約社員がいました。1人は主にユーザースペースのコードを担当したレン・ラッタンジ。1人は自動テストとバグ報告を担当するジェイミー・デルガディロで、可能であればパッチも作ってくれました。

[*] 訳注:三銃士はムスケテール。60年代のテレビ番組、ミッキーマウス・クラブハウスにムスケテールをもじったマウスケテールが登場する。

臨時の契約社員も2人いて、1人はツールの準拠対応、もう1人はマニュアルページの制作を担当しました。

そしてアップルの社内からも状況に応じて一時的に人を借りることができました。

これは主に、彼らがプロジェクトに協力してくれることを確認することが目的で、実際にコードを書いてもらう必要はありませんでした。


最初の記念日は、全てのヘッダファイルがテストに合格し、テストスイートにある他のテストが実行できるようになった時でした。

この時までにMac OS Xで全てのヘッダファイルへの変更を反映し終えており、Tigerが出荷されるときには、ヘッダだけはUNIXに準拠していました。

この修正によりCore Warriorでビルドできなくなりました。私はこれにもちゃんと対処するつもりでしたが、その機会はありませんでした。Code Warriorは多少の巻き添えを食らいました。

ヘッダファイルがテストを通るようになった日、私たちはIL6(レストランチェーンBJ'sのアップル本社近くにある支店を指す俗称)でお祝いしました。

アップル社内の他の人たちから見れば、私たちは「ヘッダファイル修正」というバグを解決したばかりであり、それぞれのヘッダファイルにはたくさんの新しいバグが含まれていました。

この修正には3か月を要しました。私の約束は(訳注:プロジェクト全体で)1年でしたが。


どうすれば1年という目標を達成できるでしょうか?

ヘッダファイルを修正し、各プロジェクトをこれに強制的に対応させることが、このプロジェクトで一番大きな山になることは最初から分かっていました。

他のテストが実行できるようになり、別の部分にある「簡単に手が届くところにぶら下がっている実(訳注:すぐに直せそうな奴)」が大量に現れました。

この作業には約2か月かかりましたが、さっくりコミットさせてもらえる特別ルールを駆使して、短期間で仕上げられました。エドはlibSystem(libcや他のシステムライブラリが1つにまとまっている奴)の大半を担当し、私が名前空間の外に色々なものを移動するのを手伝ってくれました。例えば/usr/include/sysの中に"_"で始まるヘッダファイルがあるのはそのためです。

申請を待つ間に、並行して別のことができるでしょう。私たちもそうでした。

「低いところにある実」の後には、カーネル内のシグナルシステムの書き直しなど様々な仕事があり、これらはそんなに低いところにはありませんでした。

この時、ウメーシュ(名字は教えないよ)は自分が監督しているpthreadのコードを私たちに触って欲しくないと考えており、私たちはそれに縛られましたが、しかし彼は以前からこのコードを修正したいと思っていたところで、このプロジェクトによりその修正が実現したため、彼にとってはとても喜ばしいことでした。

またマイク・スミス(ええ、あのマイク・スミスです)にもファイルロックのコードを書き直してもらうことで渋々ながらも賛同してもらいました。私は各ファイルシステムからそのレイヤーを上の層に押し上げた人であり、1つの共通コードにまとまりました。でもこれを実現した人はマイクでした。

そして私たちはジョー・ソコルに、トラップパスや、シグナルシステムでスタックフレームを保存している件に関して質問し、彼も仲間に引き入れました。

中でも締め切りに間に合わせるために最も貢献してくれたのはウメーシュでした。


結局全て動作するようになり、テストも通りました。トリガーを引く準備ができました。

しかしインテル対応のコード変更が入ってきて、2週間待つように言われ、全てが台無しになってしまいました。

めちゃくちゃです。

そこで私は3日間をかけ、準拠版ブランチにある全てのパッチをインテル対応版にマージする作業を行いました。

この時私は既にMac OS Xカーネルに含まれる1300万行のカーネルコードのほぼ全てを把握していました。

そしてまたテストをパスすることができたのです。


そしてTigerへのマージはできないと言われました。

私が宣言した期限に間に合わないということです。インテル対応版と同時にやるには変更が多すぎるというのです。

Tigerは毎週のように遅れ、リリースまでにさらに6か月かかりました。これはインテル版固有のバグによるもので、カーネルのせいではありませんでした。

つまり、言い換えれば、Tigerと一緒にリリースすることは可能だったのです。

そして私が宣言した期限にも間に合っていました。


もしLinuxで同じ事をしろと言われたら、5年の期間と20人のスタッフが必要になるでしょう。

Linuxは分断が大きく、数多くの王国がその上に築かれており、Linuxの香りを漂わせるためには全てのものにおしっこをかけないといけません。

FreeBSDで同じことをするのならば、私は1年半ほどで、12人の野郎どもと一緒に変更できるでしょう。

作業の多くはPortsのツリーで起きるでしょう(訳注:FreeBSD Portsのことでしょうか)。


まとめると、Mac OS Xカーネルの4%~6%は私のコードでしょうか?

これはUNIX準拠のための修正でした。

大量のシグナルを変更し、カーネルクラッシュを引き起こすシンプルなシグナルのバグを残し、バグ追跡システムRadarに報告されることになりました。

エドがlibcヘッダファイルやlibc本体に加えたたくさんの変更については、Radarで似たような(訳注:他の開発者を説得するための)「方便」を使いました。


オープンソースのコミュニティでは、特に私たちの修正によりbashのテストをパスできるようになり、大絶賛されました。

このプロジェクトの延長線上で、アップルがオープンソースのコミュニティにどれほど貢献したのか想像もつかないかもしれません。このプロジェクトは少なくともアップル社外の人たちには秘密であり、その事実を公表しませんでした。

でも私は、その開発中に、数百個のオープンソースプロジェクトに対して200万行のコードが(訳注:アップルから)提供されと思います。

たくさんの称賛を受けましたが、組織的なものではなく、アップルは今でも「オープンソースのコードを利用しているくせに貢献がない」と批判されています。

例えば私たちはgccの大きなバグを少なくとも15件修正しています。

あなたは知らないと思いますが。


そして結論は?

準拠するためには、かなり大きなプロジェクトになります。

自己準拠確認、契約、元のOSF/1 Machの例外に基づいた例外テストの取得など、カレンの尽力があった上でのことです。

それは、マジで、長い戦いでした。

生涯使うとか飯を食うとか神になるというなら選択は重要ですが「さわり始める」くらいならどちらでも気の向いた方で良いです、ほんの少しの浮気心があれば翌日から別の方向性に道を変えられます、少なくともfree系のOSや手持ちのハードウエアならね。
3年間FreeBSDを使ってる人がLinuxターミナルの前で固まって泣きべそをかくようなことはありません。

僕が最初に手を出したのはUniOSというオムロンの製品でしたが個人の資金力では買い換えもOSの変更もできませんでしたが時を経てHIUXという日立のOSに移行しても特にナンの問題も無く楽しめました。
その後も各社の商用Unixを経て最終的にはLinuxに行き着きましたが数日間フフーンと眺めてるとどれほど抵抗感無く楽しめます。

なぜかというと全ての人々がUnixという共通の頂上に互換を求めて構築してるからだと思われます。パッケージツールのような個性や野良アプリのような拾いものには少し手間暇がかわりますが。
多少の流派や個性やHW独自の色合いはありますが、ある程度共通のエディタやShellを使えますし、高校や大学や嫁を選ぶような慎重さは必要ないです。

数時間後に目に付いたfreeOSを手にして触りましょう、使い方がワカラン、情報が少ない、親切なユーザが少ないなら数時間後には別のものに変えれば良い。

現在、Unix と呼ばれる OS のカーネルは、AT&T の System V R3 と BSD を統合したもので、BSD は、Version 7 から派生したもの、System V は、Verions 7 をベースに商用として売り出した System Ⅲ の発展形で、いずれにしても大元は、シングルユーザーOS であった Version 1 が出発点です。それを建て増し、拡張してきて現在があるわけですね。

一方、現在の Windows は、元DEC の技術者であったデイビット・カトラーとその同僚や部下が中心になって開発したまったく新しい OS である Windows NT が出発点で、その設計思想には DEC VMS の影響があります。というか、カトラーが DEC で認められなかった VMS の改良を Microsoft でやったみたいな感じですね。もちろん、Windows と VMS は別物なので、同じ部分などありません。一応、米国政府の調達基準を満たすために Posix レイヤーも備えていましたが、まあ付いてますよ、という以上のものではなく、中身は Unix とは似ても似つきません。

従って、どちらが優れているとかいないとか比較できるものではないのです。ですが、Windows NT は後発なだけあって、最初からプリエンプションが優れていたり、ACL が充実していたり、中央での一括管

現在、Unix と呼ばれる OS のカーネルは、AT&T の System V R3 と BSD を統合したもので、BSD は、Version 7 から派生したもの、System V は、Verions 7 をベースに商用として売り出した System Ⅲ の発展形で、いずれにしても大元は、シングルユーザーOS であった Version 1 が出発点です。それを建て増し、拡張してきて現在があるわけですね。

一方、現在の Windows は、元DEC の技術者であったデイビット・カトラーとその同僚や部下が中心になって開発したまったく新しい OS である Windows NT が出発点で、その設計思想には DEC VMS の影響があります。というか、カトラーが DEC で認められなかった VMS の改良を Microsoft でやったみたいな感じですね。もちろん、Windows と VMS は別物なので、同じ部分などありません。一応、米国政府の調達基準を満たすために Posix レイヤーも備えていましたが、まあ付いてますよ、という以上のものではなく、中身は Unix とは似ても似つきません。

従って、どちらが優れているとかいないとか比較できるものではないのです。ですが、Windows NT は後発なだけあって、最初からプリエンプションが優れていたり、ACL が充実していたり、中央での一括管理がしやすい機能が充実しているなど Unix で知られた欠点を多く補っていた一方で、プロセスの生成コストが高い (複数タスクにはスレッド使用が想定されていた)、ドライバをユーザーモードで動かしていたためリング遷移にコストを消費して動作が重い、GUI がシステムと深く結合しているためリモート管理が難しい等の問題も抱えていました(その多くは現在解消されています)。

Unix は Unix で長らくプリエンプションに問題が残ったり(いわゆるジャイアントロック問題)、リソースの割り当てが性善説に基づいていて欠陥もあったり、ファイルシステムがなかなか進化しなかったり(NTは最初からNTFSというジャーナリングファイルシステムだった)と問題も多かったのですが、長年現場で使用されてその必要に応じて拡張されてきたためソフトウェア資産が豊富で、そこは侮れなかったのです。そしてそれらの欠点も時間をかけて克服してきました。

今は商用で数が出ている Unix といえば、macOS (つまり Darwin)になってしまいましたが、Apple の主力製品が iPhone へ移っていて macOS 開発に携わる基礎技術者を減らしているという話もありますから、今後はもしかしたらはっきりと優劣が出るかもしれません。IBM は、AIX を放置している上に、ミドルレンジからローエンドは Linux に任せた!って感じですし、Solaris はオワコンが確定している上、HP-UX とか、Unixware は息してるかな?と心配になるくらいですから、いずれ Unix と Windows の比較は意味がないものになるでしょう。

Linux? ああ、Linux は Unix ではありません。API のソースコード互換性は高いですが、こちらはこちらで独自進化しており、NT が先行していた機能をパクり続けているに留まらず、メインフレーム OS の機能も取り入れようとしていますね。今後は、Linux と Windows のどちらのカーネルが優れているのか、という議論に変化するんじゃないでしょうか。

各種 BSD もまあ往事の勢いがありませんし、Unix の未来はあまり明るくありません。

macOSがUNIX系と呼ばれる際には4通りの意味があると考えて良いと思います。

  1. POSIX準拠
  2. BSD由来カーネル
  3. NeXTStep由来GUI
  4. UNIX標準ツールが入っていること。

1.はUNIXであると公式に名乗ってよい公認であります。これは商用UNIXが乱立した時代にUNIXの最大公約数的な部分を集めた規格と呼んで良いでしょう。アメリカ政府は以前はPOSIX準拠を調達要件にしていました。(そのため、古いWindows NTも準拠しています。) これは、LinuxやFreeBSDなどのオープンソースOSに対するアドバンテージです。

2. macOSのカーネルはdarwinですが、Mach OS 3.0+BSDが由来になっています。Mach OSはマイクロカーネルであり、モノリシックカーネルのOSよりも安定性が高いと言われています。このMach OSはスティーブ・ジョブズがアップル復帰前に作っていたNeXTのコアでもあります。

3. UNIXの標準GUIはXウィンドウであり、その上のウインドウマネージャーは規定されていません。それに対して、macOSはNeXTStep由来のGUIを標準UIとして使用しています。Xウィンドウに関しては独自のアプリケーションを使用しています。これはWindows+Xサーバと同じ構成と言えます。

NeXTStepのGUIはObjectiveCで構築され、設計された時点

macOSがUNIX系と呼ばれる際には4通りの意味があると考えて良いと思います。

  1. POSIX準拠
  2. BSD由来カーネル
  3. NeXTStep由来GUI
  4. UNIX標準ツールが入っていること。

1.はUNIXであると公式に名乗ってよい公認であります。これは商用UNIXが乱立した時代にUNIXの最大公約数的な部分を集めた規格と呼んで良いでしょう。アメリカ政府は以前はPOSIX準拠を調達要件にしていました。(そのため、古いWindows NTも準拠しています。) これは、LinuxやFreeBSDなどのオープンソースOSに対するアドバンテージです。

2. macOSのカーネルはdarwinですが、Mach OS 3.0+BSDが由来になっています。Mach OSはマイクロカーネルであり、モノリシックカーネルのOSよりも安定性が高いと言われています。このMach OSはスティーブ・ジョブズがアップル復帰前に作っていたNeXTのコアでもあります。

3. UNIXの標準GUIはXウィンドウであり、その上のウインドウマネージャーは規定されていません。それに対して、macOSはNeXTStep由来のGUIを標準UIとして使用しています。Xウィンドウに関しては独自のアプリケーションを使用しています。これはWindows+Xサーバと同じ構成と言えます。

NeXTStepのGUIはObjectiveCで構築され、設計された時点では最も洗練されたGUIとも言われていました。見た目はだいぶ変わったのですが、現在のmacOSでもライブラリの接頭文字がNSである等、痕跡は残っています。

4. UNIX標準ツールが入っていることはUNIXをUNIXらしく使う人たちにはとても重要です。現在はコンパイラ等は後からインストールになっていますが、それさえ入れてしまえば、通常のUNIXでやりたいことはだいたい問題なくこなせます。

さて、これらのUNIXとしての特徴・アドバンテージを持ちつつ、他の商用/オープンソースUNIXと違う点が一つあります。それは、クライアントOSとして普及しているというところから来るのですが、Microsoft OfficeやAdobe Creative Cloudなどのアプリケーションがネイティブで動作する点です。Windowsに比べれば少ないのですが、中心的なアプリケーションは移植されているのです。

つまり、日常的にこのようなアプリケーションを使いつつ、UNIXとしても使用できるというのがmacOSのアドバンテージと言っても良いと思います。これは3.のNeXTStep由来のGUIと、旧MacOS時代のライブラリのサブセットであるCarbonのおかげとも言えます。

UNIX系OSを触りたい理由がCLI操作ならば、ある程度のレベルまではどちらも大差なく使えると思います。ターミナルを利用してシェルや各コマンド、Vim,sed,awkなど入門書通り学習を進められます。

Macは公認されたUNIXのターミナルが使えますし、WindowsでもWSLやgit bashのLinux(like)ターミナルが使えます。Windowsのgit bashはUNIX系OSではありませんが、そこからAWS EC2等のクラウドやRaspberry Piに接続すれば、純然たるUNIXやLinuxを扱えます。

最初の学習は、Macをお持ちならMacのターミナル(BSD系)、Windowsならgit bash(Linux系)から始められるのが良いかと思います。そこで基本的なシェルの操作方法を学び、Vimで初歩的なスクリプトを書く程度であればどの系列でも問題ないでしょう。

その後もよほどのこだわりや業務上の都合がない限り、OSを切り替えることもなくUNIX(Linux)ライフを楽しめると思います。

UNIX系OSを触りたい理由がCLI操作ならば、ある程度のレベルまではどちらも大差なく使えると思います。ターミナルを利用してシェルや各コマンド、Vim,sed,awkなど入門書通り学習を進められます。

Macは公認されたUNIXのターミナルが使えますし、WindowsでもWSLやgit bashのLinux(like)ターミナルが使えます。Windowsのgit bashはUNIX系OSではありませんが、そこからAWS EC2等のクラウドやRaspberry Piに接続すれば、純然たるUNIXやLinuxを扱えます。

最初の学習は、Macをお持ちならMacのターミナル(BSD系)、Windowsならgit bash(Linux系)から始められるのが良いかと思います。そこで基本的なシェルの操作方法を学び、Vimで初歩的なスクリプトを書く程度であればどの系列でも問題ないでしょう。

その後もよほどのこだわりや業務上の都合がない限り、OSを切り替えることもなくUNIX(Linux)ライフを楽しめると思います。

「UNIX」がWindowsのNTカーネルより優れているかどうかを比較することはできません。なぜなら現代のUNIXとは仕様であり、NTは実装だからです。OS X(今はmacOSと呼ばれていると思いますが)のDarwinカーネルとNTを比較する場合、いずれもカーネルパニック(NTの場合はBSOD)の原因はドライバのミスや、カーネル拡張機能によるもので、カーネル自身が原因であることはほとんどないため、どちらも堅牢で安定しているということがわかるでしょう(一部の人は「カーネルに設計ミスがあるからドライバが落ちるのだ」というでしょう。しかし実際には、macOSでカーネルパニックが少ないのは、単純にドライバの種類が少なすぎるため、ほとんどのデバイスが汎用ドライバで動作しているからであり、デバイスの本来の機能を発揮できていません)。カーネルについて言えば、数百人の開発者が長年熟成させてきたものであり、実際にカーネルの修正に従事しない限りは、部外者には素晴らしいというしかないのですが(カーネル関連の業務に従事すればこの疑問の答えはおのずと見えてくるでしょう。これは面白いものであり、主なカーネルのソースコードはインターネットで見つけることができ、NTのコードすらもあります)。

しかし、UNIXとNTでどちらのデザインが優れているのかという話は議論の余地があります。UNIXはPOSIX規格に準拠してお

「UNIX」がWindowsのNTカーネルより優れているかどうかを比較することはできません。なぜなら現代のUNIXとは仕様であり、NTは実装だからです。OS X(今はmacOSと呼ばれていると思いますが)のDarwinカーネルとNTを比較する場合、いずれもカーネルパニック(NTの場合はBSOD)の原因はドライバのミスや、カーネル拡張機能によるもので、カーネル自身が原因であることはほとんどないため、どちらも堅牢で安定しているということがわかるでしょう(一部の人は「カーネルに設計ミスがあるからドライバが落ちるのだ」というでしょう。しかし実際には、macOSでカーネルパニックが少ないのは、単純にドライバの種類が少なすぎるため、ほとんどのデバイスが汎用ドライバで動作しているからであり、デバイスの本来の機能を発揮できていません)。カーネルについて言えば、数百人の開発者が長年熟成させてきたものであり、実際にカーネルの修正に従事しない限りは、部外者には素晴らしいというしかないのですが(カーネル関連の業務に従事すればこの疑問の答えはおのずと見えてくるでしょう。これは面白いものであり、主なカーネルのソースコードはインターネットで見つけることができ、NTのコードすらもあります)。

しかし、UNIXとNTでどちらのデザインが優れているのかという話は議論の余地があります。UNIXはPOSIX規格に準拠しており、ここ数年でたくさんの改定がありましたが、しかし数十年の歴史を持つ規格です。NTはUNIXよりも比較的新しいわけですが、いずれも新しいものであるとは言えません。

現在のUNIXカーネルやUNIXライクカーネルは古い技術が使われています(Linuxは例外ですが)。理由は簡単です。一部は利用者が少ないため開発が止まっており、バグの修正が高くついてしまいます。(IBMのAIXなど)一部は基幹業務で使われており、大きな修正はバグを生み、互換性に影響します。

優れた設計のUNIXは存在しますが、macOSのDarwinはその中には含まれないと思います。実際Darwinは純粋な「UNIX」ではありません。BSDとMachを組み合わせたものであり、MachはUNIXのコンポーネントはでありません。アップルのカーネル設計資料を読めば、DarwinにMachを持ち込んだのは失敗で手遅れだったとアップルのカーネルチームも思っていることがわかります。アップルはDarwinからMachを切り離そうともがいてきましたが、それは簡単ではありません。アップルはここ数年システム開発チームの人員を減らしており、ソフトウェアの品質低下を招いていることに皆さんはお気づきでしょうか。Darwinは当時としてはいい試みでしたが、頓挫しているように思われます。

NTカーネルは、まぁあまり話せることはないですね。一般人が合法的にソースコードを入手するには、WRK(Windows Research Kernel)と呼ばれるWindows XPのカーネルくらいしか選択肢がありません。だから最新のカーネルがどうなっているのかは分かりませんが、10年前より改善されているであろうことは間違いないでしょう。

では質問に戻りましょう。UnixのカーネルはWindowsのカーネルより優れているでしょうか? OSを使うだけのほとんどの人にとっては、どちらも変わらないでしょう。ドライバやカーネル拡張の開発者は、私はI/Oキットが好きだとか、WDKが好きだとかみたいな、個人の好みがあるに過ぎないと思われます。しかしカーネル設計について言えば、vim対emacsのような宗教戦争があり、実際にコードを読んで全体を把握した人だけが自分なりの答えを導き出せます(まぁでもmacOSのDarwinは恐らくアップルのソフトウェア歴の中でも過去最大の技術的負債ではないでしょうか)。

情報量、利用機会の数から考えて絶対にLinuxです。特にUbuntuが良いでしょう。

お手軽なのはLinux系です。本も多いし、Webの情報も多いです。ただディストリビューションが多いのでどれを選んだらいいかわからないと言う弊害もあります。

BSDならMacとか(厳密には違う)、FreeBSD、Dragonfly BSD、OpenBSD、NetBSD、TrueOS(元PC BSD)くらいでしょうか。

TrueOSが楽だったのですがデスクトップ版から撤退しました。

TrueOS - Wikipedia

継続は

デスクトップ向け FreeBSD ディストリビューション Project Trident - Qiita

から。

個人的にはBSDを次いでいるFreeBSD系が好きです。

劣っていたからです。

…と言っても、別に悪口ではありません。「悪い方が良い」という経験則があるのです。ある種の正しさというのは逆に足枷になることがあり、絶妙なところで「悪い選択」をした方が結果的に良くなることがある、という話です。まだ出ていないようなので紹介しておきます:

The Rise of "Worse is Better"
デザインの「悪い方がよい」原則 The Rise of "Worse is Better" rpg@lucid.com 日本語訳: daiti-m@is.aist-nara.ac.jp 私や Common Lisp と CLOS のデザイナーのほとんどは、 MIT / Stanford 方式の設計に親しんでいる。 この方式の核心は、「正しい」やり方をせよ、という ことにつきる。デザイナーにとっては、以下の点をすべて正しく満たすことが 重要である。 簡潔性 デザインは実装と使用法の両面において単純でなければならない。 このとき、使用法が単純な方が、実装が単純なことより重要である。 正当性 デザインはすべての点において正しいものでなければならない。 誤りは許されない。 一貫性 デザインは一貫性を欠いたものであってはならない。一貫性を保つ ためには完全性は少しだけ犠牲にしてもよい。一貫性は 正当性と同じぐらい重要である。 完全性 デザインは実際に起こる重要な状況にはすべて対応できなければ ならない。起こることが予想される場合はすべて扱えなければならない。 簡潔さのために完全さが大きく損なわれることがあってはならない。 ほとんどの人がこの条件に同意されることと思う。このデザイン哲学を、以下 「MITアプローチ」と呼ぶことにしたい。Common Lisp (とCLOS) や Scheme はこのデザイン哲学を体現している。 "悪い方がよい"原則はこれと少しだけ異なる: 簡潔性 デザインは実装と使用法の両面において単純でなければ ならない。このとき、実装が単純な方が、使用法が単純なことより重要 である。 単純さがデザインにおいて最も重視されるべき事柄である。 正当性 デザインはすべての点において正しいものでなければならない。 ただし、どちらかといえば、正しいことよりは単純なことの方が重要である。 一貫性 デザインは一貫性を大きく欠いたものであってはならない。 単純さを保つために、一貫性は犠牲にされることがある。しかし、 あまり起こらない状況に対応しようとして実装を複雑にしたり一貫性を欠いた ものにするよりは、それを捨てる方がよい。 完全性 デザインは実際に起こる重要な状況にはすべて対応できなければ ならない。普通に起こると思われる場合はすべて扱えるべきである。ただし、 他の条件のためならば完全さはいつでも犠牲にしてよい。さらに、 実装の単純さが失われる場合には完全さを犠牲にしてもそれを守るべきで ある。単純さが保たれるならば、完全なものにするために一貫性を犠牲に してもよい。 何より意味がないのは、使用法の一貫性を守ることである。 初期の Unix と C 言語はこのデザイン流派の例である。以下、このデザイン戦略を 「New Jersey アプローチ」と呼びたい。私はわざと「悪い方がよい」原則を 悪く書き、これが明らかに悪い哲学であり、New Jersey アプローチが悪い アプローチであることを信じるようにした。 しかし、私は「悪い方がよい」原則のほうが単純な場合でも 「正しい」ことより生き残る哲学であり、ソフトウェア開発については New Jersey アプローチの方が MIT アプローチよりもよいアプローチだと信じている。 まず、MIT/New Jerseyアプローチの区別が妥当なものであり、それぞれの側が 自分の方が優れていると信じていることを示すことから始めよう。 あるとき、MIT 出身と Berkeley 出身(ただし、Unix開発に携わっていた)の二人の有名人が OSの問題を話し合うために集まった。 MITの彼は ITS (MIT 人工知能研究所のOS) に精通しており、 Unix のソースコードを読んでいた。彼は Unix がどのように「PC loser-ing」問題を 解決できるかに興味を持った。「PC loser-ing」問題は ユーザプログラムがI/Oバッファのような状態を内部に持つ、時間のかかる操作を システムに要求したときに起こる。もし実行中の操作が中止されると、 ユーザプログラムの状態は保存される必要がある。しかしシステムの提供する そうしたルーチンは通常1つの命令であるため、ユーザプログラムの 現在の命令の実行位置を示すプログラムカウンタ (PC) はプロセスが中止を 受けたことを把握することができない。そこでシステムはその命令が実行される 前に戻るか、そのまま命令を実行したことにして先に進むかしなければならない。 「正しい」やり方はもちろん、命令の実行前まで戻ってプログラムカウンタを もとの位置に戻し、ユーザプログラムがその後システムルーチンの再実行などが できるようにすることである。 プログラムカウンタがユーザモード (MITではユーザ(user)のことを皮肉をこめて敗者 (loser)と呼ぶ) に強制的に戻されることから、このことを 「PC loser-ing」と呼ぶ。 MITの彼は読んでいた Unix のソースの中にこの問題に対処するコードを見つけられ なかったので、New Jersey 側の彼にどうやってこの問題に対処しているのか 尋ねた。New Jersey の彼は、Unix を使っている人はこの問題に気付いているが、 解決はシステムルーチンを中止を受けてもつねに終了させ、かわりに そのシステムルーチンが実行されなかったことを示すエラーを返すように することだと答えた。したがって、正しいユーザのプログラムは エラーがあるかをチェックしてそのシステムルーチンを再実行するかどうか 自分で決めるものだと彼は言った。 MITの彼はこの解決は気に入らなかったが、それはもちろんこの解決が 「正しい」やり方ではないからだった。 New Jerseyの彼は、このUnixの解決は正しい、なぜならUnixの設計哲学は 単純さにあるのであって、「正しい」ことをするのは複雑過ぎるからだと言った。 それだけでなく、プログラマがここにこの余分なテストとループのコードを 入れることは簡単なことだと。 MITの彼はそれに対して、実装は簡単だが使用法が複雑すぎることを指摘した。 New Jerseyの彼は、ここではUnixの設計哲学に従って適切なトレードオフが 行われていると答えた。すなわち、実装の簡単さの方が使用法の簡単さより 重要なのだと。 MITの彼はそれを聞いて「屈強な男がやわらかい鶏料理を作ることも 時にはあるものなのに」と嘆息したが、New Jerseyの男には理解できない ようだった[筆者もよくわからない]。 ここで私は、「悪い方がよい」原則の方がよりよい原則であると主張したい。 CはUnixを書くためにデザインされたものであり、New Jerseyアプローチに従って デザインされている。従ってCはそれなりに動くコンパイラが書きやすい言語だが、 同時にそれはプログラマがコンパイ

これは業界に長くいるとしばしば経験する話だと思います (尤も、ミッションクリティカルな世界は別の原理があるかもしれませんが。)

lldの作者さんの「悪い方が良い」経験もおもしろいです。一般的には「悪い書き方」とされるような選択も、条件次第では良い結果を生むことがあります。

「悪い方が良い」原則と僕の体験談|Rui Ueyama
ソフトウェアの世界には「悪い方が良い」原則という有名なエッセイがある。キレイにレイヤ分けされた一貫性のある良いデザインよりも、一見手抜きの悪いデザインのほうが実は良いときもあるという話だ。この逆説的なデザイン原則を僕は身をもって体験したことがある。それについてちょっと書いてみようと思う。 僕はlldというリンカの現行バージョンのオリジナル作者だ。リンカというのはコンパイラと組み合わせて使うもので、実行ファイルやDLLを作るのに使用される。lldはプロダクトとしてはかなり成功していて、標準のシステムリンカとして採用しているOSがいくつかあったり、GoogleやFacebookなど皆が知

セキュリティにはネットワークの深い知識が必要になるのですが、これは仕事の中で必ず必要とされるので覚えることができます。しかし、Linuxの知識はある程度まとまった時間がないと学習することが難しく、できるだけ若く実務に追われていないタイミングで学び触ることがなければ、実務の中ではなかなか覚えられないです。

良いネットワークエンジニアは、必ずLinuxの知識があり、そしてセキュリティにも強いです。しかしすべてのネットワークエンジニアにLinuxの知識があるわけではありません。キャリアの早いタイミングで、できるだけ深いLinuxサーバの知識を身につけることをお勧めします。

Linuxを先に学ぶことをおすすめします。

理由は3つあります。

1) 圧倒的にLinuxを使う機会が多く、Unixを使う機会は限定される

私のITエンジニア経験や転職活動経験からの、肌感覚となりますが、Webサービスの99%はLinux系のOSで動作しています。のこり1% もUnixではなくWindows系OSです。

銀行の基幹系システムでさえUnixではなくLinuxで構築される時代です。

肥後銀行とみちのく銀行 Linux勘定系を採用へ

2) Linuxは無料で利用することができ学習リソースも豊富

Linuxはオープンソースで、だれでも無料で使うことができるため、気軽に学習を始めることができます。

Linuxの学習教材は、書籍やオンライン学習など非常に安価に提供されています。

Linuxサーバー構築運用入門 (CentOS7, PHP7, Apache, MySQL, WordPress対応)

それに対して、Unixは有償製品となるため、気軽には扱えませんし、安価で良い教材を探すのは難しいかもしれません。

3) LinuxはUnix互換

LinuxはUnixと、基本的に互換があるので応用が効きます。

よって、Linuxを先に学び、Unixは業務で実際に必要になったタイミングで学習することをおすすめします。

まず、OS XではなくmacOSと書いているじてんで、そうとう詳しい方とお見受けしますので、ある程度ご自分で答えを出されていると思います。

さて、多くの方がご回答されていますが、私はあえてWindowsを推してみようと思います。

理由は、多くの安価なPCが、すでにWindowsをインストールされた状態で売っているからです。

私は作業中のほとんどの時間をEmacsとPerlといういずれもUNIX由来のソフトウェアを使っています。この2つをWindowsで使うのは、一昨年まで塗炭の苦しみでした。

しかし、昨年この状況が一変しました。WSL(Windows Subsystem for Linux)という仕組みでUbuntuなどのLinuxが動作させることが出来るようになったからです。

一方、世間の、ITナードでない人は、平気でWordやExcelのファイルをメールに添付してきます。これがきれいに開けないと、仕事の連絡ができない場合もあります。

また、サンコーレアモノショップのようなところで売っている変なUSB機器は、Windowsにしかつながらない場合が多く、アキバ系のハードオタクの場合もWindowsは(最低一台は)手元にある場合が多いです。

また、パソコンを勉強する用途として、異性の友だちに接近して「スゴーイ」と言われたいというのがどうしようもなくあるんですが、この場合も、非ITナードの人を感心さ

まず、OS XではなくmacOSと書いているじてんで、そうとう詳しい方とお見受けしますので、ある程度ご自分で答えを出されていると思います。

さて、多くの方がご回答されていますが、私はあえてWindowsを推してみようと思います。

理由は、多くの安価なPCが、すでにWindowsをインストールされた状態で売っているからです。

私は作業中のほとんどの時間をEmacsとPerlといういずれもUNIX由来のソフトウェアを使っています。この2つをWindowsで使うのは、一昨年まで塗炭の苦しみでした。

しかし、昨年この状況が一変しました。WSL(Windows Subsystem for Linux)という仕組みでUbuntuなどのLinuxが動作させることが出来るようになったからです。

一方、世間の、ITナードでない人は、平気でWordやExcelのファイルをメールに添付してきます。これがきれいに開けないと、仕事の連絡ができない場合もあります。

また、サンコーレアモノショップのようなところで売っている変なUSB機器は、Windowsにしかつながらない場合が多く、アキバ系のハードオタクの場合もWindowsは(最低一台は)手元にある場合が多いです。

また、パソコンを勉強する用途として、異性の友だちに接近して「スゴーイ」と言われたいというのがどうしようもなくあるんですが、この場合も、非ITナードの人を感心させるためにWindowsの技術が必要です。

以上から、「最低1台は」Windowsマシンを手元においておくことをおすすめします。その後で興味が出たら、いくらでも買い増しすればいいじゃないですか。一つにしぼる必要もないでしょう。

なんか認知バイアスで事実が大きく歪められているような気がするので口を挟ませてください。ご質問者様が初学者であることを想定し、あまり具体的なソフトウェアの名称等は申し上げません。

結論から言いますと、Windowsのままで十二分にプログラミングは学習できます。どのようなアプリケーションを作るのにも依りますが、まずは買いたてホヤホヤのWindowsPCでプログラミング環境を作れば良いです。他の回答者方の言う「WSL」も「仮想環境」も、必要に応じて環境を構築すれば良いでしょう。

「プログラミングをするにはLinux(UNIX系)が良い」については事実ではありません。むしろ業務アプリケーションやクロスプラットフォームアプリケーションの開発にはWindowsが適しているとさえ言えます。その根拠は、エンタープライズにおけるWindowsPCの普及率です。社員全員がMacを使っている会社なんてごく少数で、ほとんどの場合、エンジニアでさえWindowsPCとなんらかの統合開発環境でプログラミングをしています。経験上、Linuxで開発する現場の方が圧倒的に少ないです。

もちろん、WebアプリケーションにおいてはWebサーバソフトウェアとの兼ね合いでLinuxのほうが相性がいい場合もあります。しかしながら、Windowsでもできないことはありません。というか最近は環境構築もラクラクです。

ご質問者様はプログラ

なんか認知バイアスで事実が大きく歪められているような気がするので口を挟ませてください。ご質問者様が初学者であることを想定し、あまり具体的なソフトウェアの名称等は申し上げません。

結論から言いますと、Windowsのままで十二分にプログラミングは学習できます。どのようなアプリケーションを作るのにも依りますが、まずは買いたてホヤホヤのWindowsPCでプログラミング環境を作れば良いです。他の回答者方の言う「WSL」も「仮想環境」も、必要に応じて環境を構築すれば良いでしょう。

「プログラミングをするにはLinux(UNIX系)が良い」については事実ではありません。むしろ業務アプリケーションやクロスプラットフォームアプリケーションの開発にはWindowsが適しているとさえ言えます。その根拠は、エンタープライズにおけるWindowsPCの普及率です。社員全員がMacを使っている会社なんてごく少数で、ほとんどの場合、エンジニアでさえWindowsPCとなんらかの統合開発環境でプログラミングをしています。経験上、Linuxで開発する現場の方が圧倒的に少ないです。

もちろん、WebアプリケーションにおいてはWebサーバソフトウェアとの兼ね合いでLinuxのほうが相性がいい場合もあります。しかしながら、Windowsでもできないことはありません。というか最近は環境構築もラクラクです。

ご質問者様はプログラミングを学習したいということですよね。サーバを学習したいわけではなく。であればとっかかりとしてすぐにでもWindowsで、環境が多少汚くなろうと、今すぐに始められることをするべきです。我々からするとWSLや仮想環境でLinuxを使うことはなんの造作もない日常ですが、初学者にとっては大きなリソースを割くものです。Linuxの学習にも骨が折れることでしょう。

もちろんLinuxの学習はエンジニアになるには必要不可欠です。ある程度プログラミングを学び、コンピュータを学び、LinuxあるいはBSDなどが必要だと感じるようになったらそれを学んでください。プログラミングのオマケではなく。

なんとなくLinuxが良いらしいからなんとなくLinuxでプログラミングしているとなんとなく自信がついてしまうのが一番危険です。

移行ってほどではないですが手元のマシンにはインストールしてあってたまに使います。

私はいわゆるシェル芸みたいなのがあまり好きではありません。あんなクソ言語のバッドノウハウで脳の領域を消費したくないわけですよ。というわけで、ちょっと込み入った処理を書く時には pwsh の出番となります。

この記事が pwsh の良さをよくわかってらっしゃるので 「PowerShell なんて使ってる奴は情弱」とか思ってる方はぜひご一読頂きたい。

PowerShell「全員が全員 /bin/bash だと思うなよ」
! この記事は以前ちょっと株式会社 社員ブログで公開していたものです はじめまして.ちょっと株式会社で技術顧問をしています,池口といいます. 普段は別の会社で働きつつ,副業という形で参画させていただいております. ブログもたまに書こうかと思っておりますので,よろしくお願いします. そもそもシェルとは? さて,みなさんがお使いのシェルは何でしょうか. シェルは, OS の機能を呼び出したり別のアプリケーションを呼び出したりするためのコマンド言語インタプリタです [1] . 具体的には bash や fish , zsh などが挙げられます. macOS の場合,既定のシェルは zsh です.これをそのまま使っているという方も多いでしょう. GNU/Linux の場合はほとんどのディストリビューションで bash が採用されています. bash や zsh は POSIX 互換モードを持っている [2] [3] こともあってか幅広く使われています. しかし,これらのシェルはとても伝統的 (traditional) なインターフェースを持ちます. 入出力はともに文字列が想定されているため,私たちはすべてを文字列として扱う必要があります. したがって私たちの書くシェルスクリプト [4] は,そのスクリプトの持つ機能の拡大に合わせて,とても複雑で冗長なものとなっていました. だから私は,PowerShell ここでみなさんが普段シェルスクリプトで扱うデータを考えてみましょう. 例えば,あるコマンドを実行して(これはビルトインではなく,アプリケーションの実行可能ファイルによって定義されるコマンドとします), その結果から必要な情報を取り出し,集計して書き出す.こういったものを書くことはしばしばあるかと思います. ここで目をつけてほしいのは,私たちが扱いたいものはコマンドが書き出した文字列ではなく,その表現するデータだということです. こういったケースでコマンドが JSON [5] 文字列を書き出す場合は, jq [6] といったコマンドにパイプ [7] することも多いでしょう. そうして得られたデータをまた,他のシェルスクリプトから文字列処理を利用して扱ったりします. シェルスクリプトで実現したいことの本質は JSON 文字列をパースしてデータを取り出すことではなく,データを処理して書き出すロジックにあることを忘れがちです. そこで私が紹介したいのが PowerShell [8] です. この言葉を聞いて「私は Windows ユーザではないので関係ない」と感じた方もいるかと思いますが,実は PowerShell はクロスプラットフォームなツールです. 語弊のないように言うと, PowerShell Core がそうです. Windows 用の共通言語ランタイム (CLR) である .NET Framework から派生した .NET Core というオープンソースプロジェクトがありますが (現在は .NET という名前で合流しました), .NET Core はクロスプラットフォームです. PowerShell が .NET Framework ベースなのに対して, PowerShell Core は .NET Core をベースにして開発されたためにクロスプラットフォームとなりました. この記事ではこれら 2 つをまとめて PowerShell と呼ぶことにします [9] . PowerShell の薀蓄をひとしきり語ったところで,シェルの紹介に戻ります.名前の通り PowerShell もシェルの一つです.PowerShell の特徴というと,データをデータのまま扱うことができる点が一番に挙げられます.コマンドが返すのは文字列ではなく,データなのです.これは正確には .NET におけるオブジェクトです.つまり,シェルでありながら,コマンド間で .NET オブジェクトを渡すことができるのです..NET を扱ったことのある方ならピンときたかもしれませんが, LINQ [10] . を使ったデータの絞り込みなどをすることももちろん可能です. 例 これを分かりやすく説明するために,簡単な例を見てみましょう.マシンに紐付いている IP アドレスのうち, 127. で始まるもの [11] を除いたものを列挙することを考えます 一般的な GNU/Linux システム [12] 上の bash では以下のように書くことができます: ip addr | grep inet | cut -d ' ' -f 6 | grep -v '^127.' ワンライナーで書くことはできるのですが,あまり直感的ではないことが分かります.複雑な条件が増えたり,より高度なフィルタリングの要件ができたときにメンテナンスしづらいでしょう.さらに,文字列処理で必要な値を取り出しているため変更にとても弱い [13] です. PowerShell で同じことをしようとすると,以下のようになります: Get-NetIPAddress | where IPAddress -NotLike "127.*" | select IPAddress かなり直感的に書けることがわかるかと思います. jq などを使ったことのある方なら一目で理解できるでしょう.そして,何よりもデータ目線で絞り込み及び抽出ができていることがおわかりいただけるかと思います.この例から PowerShell の思想のすばらしさが伝われば幸いです. おわりに 今回は PowerShell を紹介しました.普段 bash や zsh しか触れない方も,ぜひ様々なシェルに触れて,自分好みのものを見つけてみてはいかがでしょうか. Cover image by Shutterstock 脚注 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html ↩︎ https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html ↩︎ https://zsh.sourceforge.io/Doc/Release/Invocation.html ↩︎ シェルに実行させるコマンド群をまとめて記述したもの.一括実行できるため環境によってはしばしばバッチスクリプトとも呼ばれます. ↩︎ JavaScript Object Notation ↩︎ https://stedolan.github.io/jq/ ↩︎ あるコマンドの出力を,別のコマンドの入力として扱うようにリダイレクトすること. ↩︎ https://docs.microsoft.com/en-us/powershell/ ↩︎ .NET Framework と .NET Core が合流したように, PowerShell と PowerShell Core もいずれ合流するでしょう.また, PowerShell Core はバージョン 7 から始まったため PowerShell 7

仕事上、LinuxとWindows、メインフレーム、オフコンの開発に従事した経験からです。

UNIXというかLinuxですが、利点は、基本的にタダ、精通すればカスタマイズが楽しめる。小さくできるので組み込み系に向いている、使っていると皆にすごいと言われる。ウィルスを作っても楽しめないので少ない。といったところでしょうか。

ぶっちゃけデメリットが多いです。インストールが大変。バージョンアップとか特に大変で、起動しなくなる可能性がある。今でこそ、そこそこ使えるGUI、ドライバもあるが、以前は落ちると二度と起動しないとか、ドライバがなくて困ったり、とても素人の手の出せるものではなかった。Windowsが不安定というLinux信者に多いが、NTになってからは基本的にOSに問題はなく、問題なのはいつもアプリの作り手。OAアプリも、Windowsに似せたものがあるけど、無料であること以外に素晴らしいなんて言う人はLinux信者でも言わないですね~。

まず手元のコンピュータにLinuxを入れます。

Ubuntuだと楽なんですが、可能ならほかのdistroがいいかもしれませんね。遊ぶという目的の場合、楽すぎるのもよしあしでしょうから。最近だとLinux MintとかArch Linuxとかになるかなと思います。

で、そのパソコンを普段使いとして使います。必要なアプリの代替物をさがしてインストールして管理しましょう。インターネットにもつなげるようにしましょう。Quoraにも書き込んでみましょう。おっと日本語入力環境のセットアップも必要ですね。昨今ならMozcを入れるといいんですかね。


これでそこそこ慣れてきたら次はインターネットにサーバを公開するのをやってみましょう。ただ家庭内のパソコンを公開するのは(現代ではとくに)かなり面倒なので、クラウドを使うのがいいでしょう。

AWSのEC2とかGoogleのGCEでインスタンスを立ち上げます。性能的にはしょぼいけど無料で使えるものがあるのでこれを使いましょう。

ここにWebサーバをいれて、自分のホームページを構築していきます。できたらブログも入れてみましょう。WordPress をいれたりすると、MySQLなども必要になります。そういうものをインストールし、セットアップし、カスタマイズしていきます。

実際に公開するのにはドメイン名を取得して登録する必要があります。これはちょっとお金がかかりますね。無料

まず手元のコンピュータにLinuxを入れます。

Ubuntuだと楽なんですが、可能ならほかのdistroがいいかもしれませんね。遊ぶという目的の場合、楽すぎるのもよしあしでしょうから。最近だとLinux MintとかArch Linuxとかになるかなと思います。

で、そのパソコンを普段使いとして使います。必要なアプリの代替物をさがしてインストールして管理しましょう。インターネットにもつなげるようにしましょう。Quoraにも書き込んでみましょう。おっと日本語入力環境のセットアップも必要ですね。昨今ならMozcを入れるといいんですかね。


これでそこそこ慣れてきたら次はインターネットにサーバを公開するのをやってみましょう。ただ家庭内のパソコンを公開するのは(現代ではとくに)かなり面倒なので、クラウドを使うのがいいでしょう。

AWSのEC2とかGoogleのGCEでインスタンスを立ち上げます。性能的にはしょぼいけど無料で使えるものがあるのでこれを使いましょう。

ここにWebサーバをいれて、自分のホームページを構築していきます。できたらブログも入れてみましょう。WordPress をいれたりすると、MySQLなども必要になります。そういうものをインストールし、セットアップし、カスタマイズしていきます。

実際に公開するのにはドメイン名を取得して登録する必要があります。これはちょっとお金がかかりますね。無料のホスティングサービスからうまく繋いだりもできるでしょうけど、できたらドメイン名も取得したら楽しいですね。そしたらLet's Encryptも作ってhttpsでアクセスできるようにしましょう。

そうしたら自分のホームページの出来上がりです。お友達にでも見てもらったりしましょう。

もちろんホームページを構築するだけなら今はもっと楽でお金のかからない方法もあるのですが、遊ぶ目的なのでこのほうがいいんじゃないかな。そうやってサーバ構築と管理を経験するのもいいんじゃないかなと思います。

絶対にBSDでないといけない理由がない限りはLinux。

Linux vs. BSD usage statistics, November 2019

BSDだけ知っていても仕事はありません。

組み込み機器にBSDを採用するのはライセンスの問題でしょうか。ライセンスにコピーレフト条項がなく、さらに書面上の許可なく開発者の名称を派生物の推奨や販売促進に使用しないという項目もないです。

だいたいUNIXベースとかUNIX系OSという話をするとき、それ=カーネル(kernel)の話になります。

カーネルは大枠で2種類に大別できます。


モノリス(monolith)とは「一枚岩」の意であり、モノリシック(monolithic)とは「一枚板の」という形容詞である。

OSが担う各種機能のうち、必要最小限のみをカーネル空間に残し、残りをユーザーレベルに移すことで全体の設計が簡素化でき、結果的にカスタマイズ性が向上し、性能も向上できるというOSの設計手法のことである。カーネル本体が小規模な機能に限定されるので「マイクロカーネル」と呼ばれるが、必ずしも小さなOSを構成するとは限らない。

マイクロカーネルの出現に伴い、従来型のOSを「モノリシックカーネル(一枚岩のカーネルという意)」と呼ぶようになった。


モノリシックカーネル及びマイクロカーネルのOSの構成

カーネル実装方式とその議論

モノリシックカーネル方式は、より近代的な設計手法とされるマイクロカーネル方式のOSに比べ、OSの機能のほとんどすべてが単一のメモリ空間で行なわれる故、同一の処理を行う際に費やされるコンテキストスイッチプロセス間通信等によるオーバーヘッドは相対的に少ないものとなり、実効パフォーマンスにおいて有利であるといった見解がある。実際にプロセッサの動作クロックが数MHz〜数十MHz程度に留

だいたいUNIXベースとかUNIX系OSという話をするとき、それ=カーネル(kernel)の話になります。

カーネルは大枠で2種類に大別できます。


モノリス(monolith)とは「一枚岩」の意であり、モノリシック(monolithic)とは「一枚板の」という形容詞である。

OSが担う各種機能のうち、必要最小限のみをカーネル空間に残し、残りをユーザーレベルに移すことで全体の設計が簡素化でき、結果的にカスタマイズ性が向上し、性能も向上できるというOSの設計手法のことである。カーネル本体が小規模な機能に限定されるので「マイクロカーネル」と呼ばれるが、必ずしも小さなOSを構成するとは限らない。

マイクロカーネルの出現に伴い、従来型のOSを「モノリシックカーネル(一枚岩のカーネルという意)」と呼ぶようになった。


モノリシックカーネル及びマイクロカーネルのOSの構成

カーネル実装方式とその議論

モノリシックカーネル方式は、より近代的な設計手法とされるマイクロカーネル方式のOSに比べ、OSの機能のほとんどすべてが単一のメモリ空間で行なわれる故、同一の処理を行う際に費やされるコンテキストスイッチプロセス間通信等によるオーバーヘッドは相対的に少ないものとなり、実効パフォーマンスにおいて有利であるといった見解がある。実際にプロセッサの動作クロックが数MHz〜数十MHz程度に留まっていた時代には、乱発されるコンテキストスイッチ等の実行コストの問題は深刻なものであった。1980年代にデビューした商用UNIXは、そのほとんどがモノリシックカーネル方式を採用している。

しかし、プロセッサの処理速度は20世紀末から21世紀初頭にかけて長足の進歩を遂げた。また、マイクロカーネル側の実装における高速化技法の進展、必要に応じて一部パフォーマンスを要求されるサブシステムのみカーネル空間に取り込む実装も登場し、モノリシックカーネルのパフォーマンスにおける原理上の優位性は小さくなった。

2005年現在では、純然たるモノリシックカーネル方式で開発する利点は少ないとする意見に収束して来ている。しかし、同等の機能を実装した場合にその原理上実行時の(コンピュータのメモリ上の)OSカーネルのフットプリントを比較的小さなものに留めておきやすいこと、ノンプリエンプティブ (non-preemptive) 制約を付加すれば、サービス実装を行う時に考慮するべきことが減り、開発が楽になること等が利点として挙げられる。

一方、モノリシックなカーネルに様々な機能を取り込むことで巨大化することによる欠点・弊害としては、OSの機能を動的に切り替えたり更新したりすることが(マイクロカーネルと比較した場合に)困難なものになりやすいこと等が挙げられる。

研究開発の世界では、カーネルの機能を最小限にとどめるマイクロカーネルが主流になった1990年代当初、モノリシックカーネルは時代遅れとされてきた。しかし、実装レベルでの差が動作上の致命的な設計問題であるはずもなく、現在では必要な機能を必要な性能レベルで提供できれば問題ないという形での議論終結が図られている。

Solaris / HP-UX / AIXや日本の国産UNIXの系統も全てモノリシックカーネルを基礎とするカーネルを使用している。また、x86系PCでのUNIX互換機能提供を目指して作られたLinuxでは基本的にモノリシックカーネルを採用しているが、実行時に読み込むカーネルモジュールを設ける等、実行時の柔軟性を高めている。

Windows NTは、当初よりマイクロカーネル方式での実装を模索していたが、オーバーヘッドを削減するためにNT 4.0でWindowsサブシステムとグラフィクスデバイスドライバがカーネル空間から直接見える様に修正された。さらにWindows 2000以降では、ハードウェア管理機能の一部をマイクロカーネル直轄のモジュールとしての外部モジュールからカーネル制御部本体による制御方式に切り替えており、純粋なマイクロカーネルから外れた実装になっている。NT4.0では800キロバイト弱だったNTOSKRNL(Windows NT系のカーネルシステム)のフットプリントは、WindowsXPでは2メガバイト強にまで肥大している(但しWindows Vistaにおいては、動作の安定性やシステム全体の堅牢性に対する配慮から一部「先祖返り」を起こしている)。 マイクロカーネルとしての構造は依然残されているため、マイクロカーネルとモノリシックカーネルの折衷をとったハイブリッドカーネルとでも呼ぶべき実装になっている。

またMachから派生したmacOSも、BSDサブシステムやファイルシステム、ネットワークなどをカーネル空間に統合しており、純粋なマイクロカーネルから離れた実装になっている。Windowsと同様、マイクロカーネルとモノリシックカーネル両方の利点を活かした設計である。

有名な論争

詳細は「アンドリュー・タネンバウムとリーヌス・トーヴァルズの議論」を参照

モノリシックカーネルとマイクロカーネルについては、Linuxの作者リーナス・トーバルズMINIX(ミニックス)の作者アンドリュー・タネンバウム1992年論争が有名である。

引用にあるとおり、基本、

  • Linux(UNIX系OS)は、モノリシックカーネル
  • Windowsは、モノリシックとマイクロの折衷のハイブリッドカーネル
  • macOS(UNIX)も、ハイブリッドカーネル

よりモダンな設計はハイブリッドであり、実際、スティーブ・ジョブズは、MacOSXがもっとも進化したUNIXである!としきりに宣伝していました。

しかし、現状、LinuxはAndroidスマホのOSとしても、デスクトップOSとしても(自分は完全に依存している)、非常に成功しており、もうどちらが良いとか判別するのはギーク的にもかなり難しい状況です。

自分ではまだまだ未熟だと思っていますが、周囲からはLinuxが得意だと思われていました。

今まで20年以上になりますが、公私含めて以下のUNIX/Linux系OSを使ってきました。

・NEC EWS4800

・Sun Solaris 2.6/7/8/9/10

・Redhat Linux

・Fedora Core (たしか 1/3/5)

・Cent OS 4/5/6/7

・Redhat Enterprise Linux 4/5/6/7

・Ubuntu Linux 14.04

・Raspbian OS

結論ですが、OSやバージョンが変わっても、Linux系であれば「それなり」に使えると思います。が、熟知していないOSで業務に使うシステム構築/保守できるかというと、可能かもしれませんが怖くてできません。あくまで「それなり」です。

どの程度で慣れるかという質問ですが、数年単位でかかります。

RHEL/CentOSを4/5/6/7と追いかけてきましたが、慣れた頃に新しいバージョンがリリースされて再学習が必要になっています。また、業務でLinuxをメインとしたシステムを構築したり面倒をみていても、一日中Linuxを触っているわけではないので意外と慣れに時間がかかります。

Linux系ならAndroid、BSD系ならMac OSXですかね。

えっ、もっとUnixっぽいのが良い?ならDebianでWindow Managerにtwmを使うと良いです。めちゃくちゃUnixっぽいでしょう?Linuxだけど。

twm - Wikipedia