10.いきなりコードを書いてみる。C/C++でコードを書くと成功する。壁にぶち当たった時は、自分の技術と能力で克服していこう。プログラミング初心者にありがちな迷いとして、「何を作ったら良いか分からない」というものがある。これは、作れそうなものならなんでも作っていくのが良いと思う。タブブラウザを作りたいなら、継承で作ったらどうか、インスタンスの包有で作ったらどうかなどを考える。書籍にあるサンプルプログラムを改良して、自分のプログラムとして拡張していく。それくらいの方向が分かったら、僕は「僕なんかが教えるよりも、あなた自身で考えてほしい」と思う。僕はこう見えて、プログラミングが今でも出来ない馬鹿だから、こんな人間の言うことは参考にしない方が良い。プログラミングの王道というものはなくて、往々にして「出来ない人間が適当なことを言っている」という現象が発生する。上の10を無理にやろうとしなくて良い。僕の経験から言って、C++の開発はとても難しい。Pascalの記法が良く分からなかったりして、すぐに挫折してしまった。コードを書くのは、必ずしも正解ではない。僕が本をきちんと読んでいないだけで、「標準C++の基礎知識」などはとても良い本で、これを読めば既にC++のプログラマになっていると書かれている。Windowsなどのプログラミングにおいても、自分の力で習得できるぐらいになるだろうと、この本の最後に書かれている。した本を全否定するのは良いことではない。Ruby作者のmatzも、昔から本を読むのが好きだったという。本を読むのは決して間違いではない。Delphiのように、マイナーな言語をした経験というのは別の場合にも活きてくることがある。僕はC#でプログラムを書いた時に、Delphiの経験が生きて、すぐにネットワークからデータを取得するコードを別のURLで書き変えられるようになった。これによって、2ちゃんねる以外の掲示板で2ちゃんねるブラウザを使えるようにした。(正確に言うと、ログデータを読み込んだりネットワークからダウンロードして閲覧できるようにしただけ。)だが、子供の知識と理解というものには限界があって、そのごろはまだ10代半ばだったが、すぐに問題やバグが発生して、これも挫折してしまった。明らかに、大人の方が、そうした時の問題の対処能力のようなものは存在する。逆に、大人は今までの自分の知識は分かっていても、外部から知識をとり入れるということをしない。よって、僕は今でも15年前のネット知識のままで止まっていて、最新のLinuxの情勢などはきちんと分かっていなかったりする。言えることとしては、「自分独りで全部やろうとするよりも、周りの人と協力したり教え合ったりする環境があった方が良い」ということ。自分独りでプログラムを完成させなくて良い。これは、最近のデザインの経験から言える。ほとんどは他人に教えてもらったことや、データを見てやり方を真似たり盗んだりしたことであって、ネットの文章というものはほとんど読んでいないし、たまにまとまっている書籍を読んで方法を吸収するぐらいで、あとは「現場で自分の力で作る」しかない。これはデザインだけの話ではない。プログラミングについても、みんなで作るべきものを決めていかないといけないし、大学のような場所でも研究室のみんなで本を読んだり実験したりしないといけないのだ。Janeを改造したり、C#でtwintailを改造したり、PHPでp2のコードを参考にしたりしていた。ログデータのダウンロードと閲覧のような改造は、元のプログラムが良く出来ていたせいで、正規表現とC#の少しの知識があれば簡単にできてしまった。Delphiについては、15歳ぐらいでポトペタでGUIを書き、既に書かれていたコードを見ながらコピペで作っていた。PerlのCGIによるゲームのようなものを作って、適当にWindows上のApacheとブラウザ上で動かしていたこともある。それは14歳の、不登校になる前、中学生時代に、ネットのブラウザゲームにハマって、「自分でもこんなゲームを作りたい」と思って始めた。逆にブラウザゲームのようなものに飽きる方が早かった。17歳のごろは、Wikipediaのマクロテンプレートのようなものも書いていた。したプログラムのようなものは作れなかったし、プログラミングの知識もそんなに多くは無かった。逆に、多くの時間をLinuxのシステムを知ることに費やした。Linuxを参考にして書いていた。Windowsよりも本気でLinuxが好きで、Linux向けの何かしらのアプリケーションを作りたかった。無料でオープンという環境は魅力的だったが、インストールしても何も分からず、設定はそんなに意味がなかった。ここでも2ちゃんねるのWikiが参考になった。Linuxをやりだした辺りから、本格的にプログラミングの世界が分かった。それくらいしか、昔は分かっていない。Linuxが好きだった。蛇足になるが、MINIX本はとても良い本だ。僕の知りたかったことがたくさん書いてある。このホームページを読み終えた後は、MINIX本を読んでほしい。OSについて理解したいのであれば、システムコールや実装のことがきちんと書かれているこの本がお勧めだ。リーナス・トーバルズも読んだ本だ。内容はUNIXオペレーティングシステムの概論、プロセス、入出力、メモリ管理、そしてファイルシステムだ。巻末にはMINIXのソースコードが掲載されていて、自分で作ろうと思った時に取り掛かりやすい。この本をきちんと読めば、きちんと分かるだろう。思えば、ここまで文章を書きながら、色んなことがあった。18歳ぐらいから、僕は大量に毎日文章を書くようになった。最初は半ばおかしな戦いをやっていたが、自分の人生から心理学や経済学を考え、哲学や歴史の勉強をし、宗教的な境地に達して、その後はデザイン技術の習得や、科学(人文・社会・自然)やコンピュータのことを学び直した。今29歳だが、そろそろ30歳になる。詩集も出版できたし、きちんと(障害者施設ではあるが)福祉的な労働をしている。これからは、ピアノや英会話について、もっと継続して学校に通いたいと思う。デザイナーになれるかは分からないが、僕は就職したいとはあまり考えていない。教養とスキルを増やして、色んなことが分かる人間になりたい。そのために、このホームページの執筆をやめることはないだろう。本当は、この文章執筆をやめれば、やっと精神の病気がはじめて治るのは分かっている。いつまでも楽しいこの病気を楽しみたい。「楽しい地獄」である。この地獄は神と永遠の時のある、素晴らしい魂の“死”の経験だった。95が世に出た時に、子供心に「すごい。ウィンドウがぐにゅぐにゅ動く。こんなに面白いものはない」と思った方は多いのではないでしょうか。「このOSというものの仕組みを知りたい」とか、「自分でも作ってみたい」と思った方が多いと思います。ペンチや金づちで現実の道具を作るよりも、とても楽しく開発できるかのような印象を抱いた方が多いと思います。テレビゲーム世代には、感動もひとしおだったと思います。Windowsは公開されていません。ソースコードと呼ばれる開発のための設計図は非公開で、マイクロソフトが独占的な権限を持っています。ユーザーは、OSが提供した関数とAPIを使って、Windowsに依頼する形でしか、アプリケーションを作ることができませんし、ウィンドウシステムはどのように動いているのかすら分かりません。PerlやRubyのような高度なプログラミング言語は、たくさんの関数を提供しますが、この関数を使ってプログラミングを行うだけで、それ自体を開発することは多くの場合現実的ではありません。よって、オープンソースの出番です。オープンソースで公開されているLinuxや*BSDならば、自分でプログラミングを行うことができます。C言語やアセンブリ言語を用いてカーネルやウィンドウシステムを開発することは自由にできます。UNIXはシステム管理のOSで、技術的に成熟しています。仕様のほとんどはPOSIXの標準に準拠しており、機能も多く、安定しています。それに、C言語での開発はとても難しく、初心者や独学者にとってはとっつきにくいのではないかと思います。僕が思うに、WindowsでもLinuxでもなく、自分でOSを作ってみる、という発想をすべきではないかと思います。OSというOSがあります。OSはC++とマイクロカーネルで設計されており、一部ではグラフィックやウィンドウシステムの機能やネットワークの機能も実装されています(詳しくは知りません)。OSはオープンソースであるため、2ちゃんねるで批判される覚悟があれば、誰でも参加できます。MonaOS.orgそう、OSを開発することは、現実的に可能なのです。Intelなどの資料を読み解き、自分でコードを書いて実験すれば、書けてしまうのです。僕の何も知らない知識から言って、まずはIBM-PCとあなたのハードウェアで動く、16bitのDOSのようなシングルタスクのようなカーネルを作ります。その前に、FATファイルシステムから起動できるブートローダを作り、それを外部の(既存の)OSからハードウェアにインストールできる必要があります。ブートローダはカーネルを起動します。カーネルは8086アセンブラで作る必要があります。コンパイラは最初はGCCを使いますが、将来的にはC言語をコンパイルできるコンパイラを作ります。FAT互換か、あるいは独自のブロック型のファイルシステムを作り、ハードウェアデバイスを操作することのできるデバイスドライバと割り込み機能を作ります。仮想アドレス空間(物理アドレスとアプリケーションが参照する仮想アドレスの空間を分ける機能)とタイムスライス式のスケジューラ(他のプロセスを実行させる際は今実行しているプロセスを別のメモリに退避して停止させ、時間単位で切り替える機能)を作ってマルチタスクにします。アプリケーションを実装する前に、カーネルモードとユーザーランドのメモリ空間を分離する必要があります。アプリケーションをバイナリファイルから読み取って実行できるようにし、initとコマンドラインシェルを実装して、各種のコマンドを作ります。ウィンドウシステムとネットワーク機能を作ります。最初はフォントは英語を使いますが、将来的に日本語の入力や表示もできるようにします。ネットワークについては、ソケット機能を実装し、OSI標準プロトコルを全て実装します。ネットワークでは、本当に低レベルな部分では、IPアドレス(インターネットのアドレス)とMACアドレス(ハードウェア機器のアドレス)を変換したり、パケット通信の機能を作ってルータとやり取りする機能などが必要です。ウィンドウシステムでは、ユーザーがマウスやキーボードを操作した際にそれをメッセージとしてウィンドウに伝えるための機能や、ボタンやメニューなどのツールキットも必要になるでしょう。あなたがとても素晴らしいOSを作ってくださることを祈っています。オープンソースはバグが無く安定している(のか?)昔から良く言われることとして、「オープンソースはバグが無く安定している」というのがある。これは、バグがあるかどうかチェックする目玉がたくさんあれば、どんなバグも重要ではない、と言うリーナス・トーバルズの言葉から逸脱したものである。実際のところ、Linuxカーネルには昔からバグが少ない。それは、Linuxをきちんとした品質マネジメントで管理しているリーナスの高い技量と、はやめにしょっちゅうリリースしながらみんなの力でバグを無くしていく「バザール開発」の2つの要素があいまって、オープンソースであることや無料であること、そしてGNUツールの品質がUNIXで使われていたことから既に高水準にあったことなど、多くが、「最初期のLinux神話」から言われていることである。今のLinuxでは、2つの要素が言える。それは、1.今では、会社が作るようになって会社員のプログラマによるバグが増えた。初心者が加わったことで、セキュリティ的に狙われるようになり、見つかったセキュリティホールが増えた。2.サーバーやエンタープライズの部門では、とても安定しているが、デスクトップは使われていない分野であるため、不安定かつバグが多い。1つの要素として、3.バグが多かったWindowsが、Microsoftの努力によってバグが減り、NTカーネルは9xカーネルに比べてはるかに安定している。いうわけで、Linuxにバグが少ないとか、セキュアであるという神話は、本当に神話になりつつある。それでも、サーバー用途ではバグが少なく、特に性能や安定性に長けているという特徴はある。企業が開発していることは悪いことではなく、エンタープライズレベルの稼働率やセキュリティ能力は向上しており、またデスクトップの分野ではWindowsと全く同じぐらいのデスクトップやアプリケーション環境がそろいつつある。それ以上はアプリケーションの問題である。MySQLよりもPostgreSQLの方が堅固だとは良く言われるし、PHPはセキュリティ的に不安だとは良く言われる。JavaやPerlと比べてPythonやRubyはものすごく遅いと良く言われる。MozillaはどこでもChromeよりはるかに遅くて重い。Linuxカーネルがいくらバグがないからといって、ミドルウェアまでバグがないわけではなく、LinuxをベースにしているはずのAndroidはバグだらけで出荷している。Linuxカーネルも、機能とコード数が増えてとても巨大になっている。誰も、Linuxカーネル全てのコードに目を通している人間なんか、最近はほとんど居ない。Hatという会社母体が居なければ、Linuxは開発できないものになってきている。企業もデスクトップも悪ではない。5を使うとその最高の使いやすさに感動する人間が多い。その代わり、KDEはまともに動かない。DebianのKDEは、起動すらしない環境が多い。用語集LinuxOSの中核であるLinuxカーネル、あるいは、OSとしてのGNU/Linuxシステムのこと。UNIXAT&Tのベル研究所が開発した、C言語を用いたOSシステムのこと。GNUフリーなUNIXのクローンを開発することを目指しているプロジェクトのこと。GNU/LinuxGNUのユーザーランドとLinuxカーネルを一緒にした、Unixライクなシステムのこと。オープンソースソースコードが公開され、コピーや再配布が可能になっている(二次的著作物のコピーや再配布の制限を許さない場合もある)ソフトウェアのこと。フリーソフトウェアGNUの提唱する、自由にコピーや再配布が出来るソフトウェアのこと。GPLフリーソフトウェアのための、コピーレフトなライセンス。X11UNIXにおける、ウィンドウシステム。これによって、コマンドライン・インターフェースのUNIXでも、GUIによる操作を使用することが出来る。ディストリビューション紹介Debianコミュニティによる、安定したディストリビューション。ユニバーサルオペレーティングシステムUbuntuDebianをベースに、速いサイクルでのリリースを目指す、初心者向けのディストリビューション。Hatが開発する、エンタープライズ・クラスの安定性を持つ、有料のディストリビューション。Hatによる、コミュニティ主導の最先端の技術の搭載と開発を目指したディストリビューション。Hatのライバル会社による、コミュニティ主導のディストリビューション。LinuxPortageと言う、ソースベースのパッケージ管理システムを搭載した、独特のディストリビューション。MintUbuntuをベースに、使いやすくして、独自のMATEとCinnamonと言うデスクトップ環境を搭載したディストリビューション。Linuxローリングリリースモデルを採用し、シンプル第一の概念で開発される、上級者向けのディストリビューション。LinuxCentOSオープンソースのRHELのソースコードを再利用した、コミュニティによるRHELクローン。CentOSインストールインストール方法Linuxのインストール方法。@ITクロの思考ノートVirtualBoxの仮想環境にインストールする高スペックなパソコンなら、VirtualBoxの仮想環境にインストールすることも出来ます。@ITISOイメージCD/DVDへのISOイメージのダウンロードと、その焼き方。