無駄に英会話教室で何年も学習しても、こんなページすら読めない自分が不甲斐ない。Projctに翻訳があるのでそこに頼っても良いかもしれない。LinuxのインストールLinuxのインストールの前にLinuxのインストールの前に、今のWindowsの環境を残しておきましょう。出来るだけ大切なバックアップを取ることがお勧めされることが多いですが、僕はWindowsのハードディスクごと取り出してしまって、同じ型のハードディスクを装着するのがお勧めです。ハードディスクごと、Windowsの大切な環境を取っておくことが出来ます。isoファイルの焼き方Linuxのインストールは簡単で、ダウンロードしたisoファイルをお好みのCD/DVD書き込みソフトで焼いて、そのディスクから起動し、インストーラーに従ってシステムを構築します。isoをデータとして焼かないように注意しましょう。isoはディスクイメージファイルと呼ばれるもので、正しい設定で焼かないと、その中のイメージを構築してくれません。データファイルとして焼いてしまうと、Windowsで操作するデータアーカイブとして焼かれてしまいます。起動できるディスクにするためには、正しい設定で焼かないといけません。これは書き込みソフトによって違います。isoがきちんと焼けたら、通常はCD/DVDから起動することができる。出来ない時はBIOSでハードディスクよりもCD/DVDディスクの方を優先して起動するように設定する必要がある。・ネットワークの設定。自動設定されても上手くいかない時は自分でネットワークの構成を確認した上で設定する必要がある。Wi-Fiなどに繋ぐ時は、無線のアクセスポイントとそのためのパスワードを入力しなければ、ネットワークにはつながらない。・rootユーザーと使用する一般ユーザーの設定。パスワードを忘れないようにしよう。・パーティションの設定。自動でも動く場合があるが、手動で設定するならば十分なディスク容量を配置しなければならない。・インストールするパッケージの選択。3よりもKDEやMATEをインストールすることが出来る。ここで知っておくべきこととして、「全てのデスクトップを全部入れるのはあまりお勧めしない」ということ。アプリケーションパッケージがたくさん入って、端末やテキストエディタが何種類もあって「とても使い辛い」ものになってしまう。3だけをインストールすること。インストール後の設定として注意すべきなのは、日本語入力。そのままでは日本語入力ができないことがある。3なら、インプットエンジンが統合されているため、その上で設定を行う必要がある。KDEなどの場合は専用のパッケージをインストールする必要があることもある。失敗したらLinuxのインストールに失敗することは本当に日常茶飯事で、僕もUbuntuがインストールできなかったせいで仕方なくDebianを使ったりしたことがある。インストールできても起動しないことや設定の関係で使えるまでのレベルに達しないこともある。あるのは、「GNOMEやKDEが起動しない」ということ。諦めるのも良いが、せっかくだから別のディストリビューションを試してみよう。Windowsに戻すという方法もアリだ。失敗した時のためにも、真面目にWindows環境を残しておこう。僕は、OSとしての設計には、「コンパイル」と「アーキテクチャ」があると思う。アプリケーション・プログラムは、コンパイルした時に動作が変わる部分と、実行時に動作が変わる部分がある。コンパイルオプションと設定ファイル。コンパイルオプションで指定した内容は、再コンパイルした時にしか変わらない。アプリケーションの動作はコンパイルした時に静的に決定される。この場合、設定内容を変えるためには、再コンパイルする必要がある。それと対照的に、実行オプションや設定ファイルで設定する方法なら、実行時に動的に決めることが出来る。これにより、多様なプログラムの動作が期待出来る。これと同じことが、テキストファイルを入出力するプログラムや、モジュールを動的に読み込むプログラムについても言える。スクリプト言語のようなプログラムでは、スクリプトがそのまま動的に読み込むテキストファイルとして扱われる。簡単に言ってしまえば、コンパイルする時に設定を決定するプログラムと、動的に設定を実行時に読み込むプログラムがある。後日注記:つまり、コードを変えなくても、設定ファイルやオプションを変えることで、プログラムの動作を変えることができる。言えば、これをシェルスクリプトのようなインタープリタのプログラムにすることで、単なる設定ファイルではなく、プログラムの実行によって設定を行うことができる。「プログラムによってプログラムの動作を変えられる」。UNIXにはそうした設計思想がある。後日注記:設定ファイルには、UNIX由来のプログラムではシェルから設定できる環境変数や空白やタブによって区切られたプレーンテキストの設定ファイルを用いるほか、JavaやPHPではXMLやINIによる設定ファイルも見られる。GNOMEやKDEでは設定はGUIで行うことができる。コマンドラインのプログラムであっても、GUIによる設定ユーティリティが用意されている場合もある。プログラムによって設定の種類は千差万別である。CPUアーキテクチャ次に、CPUアーキテクチャへの対応がある。Windowsなどでは、x86/x86_64にしかOSは対応しないが、UNIXはC言語で書かれたポータブルなOSであるため、移植性が高いと言われる。これは、プログラム自体をC言語と言う、さまざまなバイナリフォーマットに対応出来るいくらか高水準な言語で書くことによって、移植性を高める、と言う発想だ。カーネルの低レベルな部分で、最小限アーキテクチャ別のCとアセンブリ言語でのプログラムを書いて、高レベルな部分は全て共通のC言語で書く。GCCと言うさまざまなアーキテクチャのバイナリが吐けるコンパイラを使うことで、さまざまなプログラムを違うCPUのLinuxで使うことが出来る。パッケージ管理また、パッケージ管理と言う意味では、「依存性の解決」と「自動更新」を行うことが出来る。低レベルな部分では、パッケージ管理はOSにインストールされている全てのパッケージの依存関係の解決を行うことが出来る。これにより、OSが壊れることを防ぎながら、簡単にUNIX上のユーザーランド・アプリケーションの無数のパッケージを管理することが出来る。Linuxが管理しやすいのは、パッケージ管理のおかげでもある。パッケージ管理があるおかげで、不要なシステムの破壊を防ぎ、簡単にディストリビューションと言う「OS全体」を作って配布することが出来る。先に言う、コンパイルと設定ファイルの考え方のようなものが、パッケージ管理システムにおいても良く似た形態で見ることが出来る。apt-getやyum/dnfに見られるように、パッケージは自動更新され、常に最新のパッケージリストをダウンロードし、最新のパッケージに更新することが出来る。Linuxに注目したい。Linuxでは、Portageと言う独自のパッケージ管理を行っている。使うコマンドはemerge、パッケージの記法はebuildである。常に最新のebuildをダウンロードしておき、emergeを使ってパッケージをインストールする。Linuxの特徴は、「全てのパッケージがソースベース」であることだ。emergeは、ほとんど全てのパッケージをソースコードからコンパイルする。ソースコードからコンパイルすることで、先に言ったようなコンパイルにおける設定をmake.confで変えることが出来る。USEフラグを使うことで、たとえばGTK+サポートをONにするかOFFにするかのような、パッケージのコンパイル依存関係を変えることが出来る。基本的にパッケージは設定ファイルを手動で設定する。rc-updateのようなランレベルとデーモンの設定のようなものはある。Hatでも、ソースパッケージとバイナリパッケージと言うものがある。Linuxと同じであり、そこまで考えると、ソースコードとUNIXシステムの関係が分かりやすく、全貌を掴むことが出来る。カーネルの手動コンパイル最後に、Linuxカーネルである。Linuxカーネルは、手動でコンパイルすることで、さまざまなオプション機能を有効にしたり、無効にしたりすることが出来る。詳しい方法はLinuxカーネル開発の世界観を参照してください。Wiki入出力とパイプ入出力とパイプによって、コマンドを関係で扱うことが出来る。less後日注記:UNIXには、「機能は単一のプログラム単体からではなく、複数のプログラムの関係から生まれる」という哲学がある。上の例では、findで検索したファイル一覧をlessというページャに送って、lessを使ってスクロールしてfindの内容を見ている。findではなくgrepの結果であっても、コマンドの入力を変えるだけで、lessを使ってあらゆるコマンドの出力結果を簡単に閲覧することができる。シェルとX11シェルは、新しいプログラムを実行するためのプログラム。コマンド入力を受け付けて、PATHからバイナリを探し、子プロセスを起動出来る。シェルの初期化ファイルを使うことで、シェルの起動時にシェルの初期化をすることが出来る。X11でも、初期化ファイルを使うことで、Xサーバーの設定をしたり、最初に起動しておくアプリケーションの起動が出来る。コマンドプログラムとX11のGUIプログラムは大きく異なっているが、XクライアントはXサーバーに対する指令・通信を行う、Xプロトコルを使ったアプリケーションである、と理解すると、理解しやすい。CUIとは異なり、プログラムは階層化され、ツールキット・ライブラリであるGTK+やQtからXlibを操作する形になる。これは、命令である、と言うよりは、どのような仕組みを用いてX11を操作するか、と言う、GUIにおけるRailsのようなフレームワークである、と理解すれば良い。パーミッションとユーザーパーミッションは、システムを守る仕組みで、Windowsのような管理者権限を標準で使うOSとは違い、Linuxにはファイルやディレクトリごとにユーザーの権限が決まっている。ユーザーに見せられない機密データの閲覧や、実行してはならない実行ファイルの実行に、制限をかけることが出来る。rootユーザーだけが、全ファイルの全データにアクセス出来る。これは、Linuxのセキュリティに大きく貢献しているが、その反面、サーバーなどでのファイル管理において、ややこしい仕組みとなっている。分かってしまえば簡単だ。SELinux/AppArmorもっとセキュリティを高めたい場合は、SELinuxのようなセキュリティ強化の仕組みを使うことも出来る。HTTP、FTPなどのプロセスごとにアクセス制限をかけ、rootユーザーを含む全ユーザーへのアクセス制限をかけ、rootユーザーへの権限の集中をもっと分散させることが出来る。AppArmorと言うSUSEなどの方式もある。SELinux/AppArmorやSUSE/Novell/Ximianを参照のこと。SELinuxはFedoraやRHELなどでは標準で有効になっている。Hatのやりたいように作っている、と言う側面がある。最後に、関数のレベルでの抽象化がある。関数は自動の実行処理であり、引数に何かの値を設定することで、実行内容が変わる。僕は、関数の本質とは、再利用性にあると思う。ライブラリのように、既に書かれている関数を再利用して、その利用を書く。正しいプログラミング言語とは、Rubyのように、継承やブロックによって、既に書かれているコードの内容を上書き出来るようでなければならない。一度書かれたコードを無駄にせず、再利用と共有を行うために、関数は設計されなければならない。ある意味、オブジェクト指向も、そのように考えれば、「クラスの再利用」であると理解することが出来る。OSLinuxカーネルは常に動くパソコンはOSが無ければただの箱と言うが、言ってしまえば、Linuxをインストールしたパソコンでは、常にLinuxカーネルが動いている。常に動きながら、たくさんのプログラムを「自身の上で実行する」、それがLinuxカーネルだ。GNOMEはX11を使い、X11はカーネルを使い、カーネルはハードウェアを使う。最終的にはCPUとメモリが動いている。それを階層構造で示した時に、メインとなるのは、Linuxカーネルだ。Androidのスマホを実行する場合でも、Linuxのサーバーを利用する場合でも、その環境で常に動いているのは、Linuxカーネルだ。考えると、このLinuxと言うカーネルがオープンソースで技術的に公開されていて、自由に参加出来て、改良やコピー・再配布も自由である、と言うことは、この上なく良いことのように感じられる。Projectのストールマンだと思う。カーネルとは何かカーネルとは、ハードウェアとソフトウェアの橋渡しをするものであり、システムの中で常に実行されながら、特定のプログラムを適切に実行し、それぞれのプログラムにリソース(利用出来るコンピュータ資源)を割り当てると同時に、ソフトウェアからの要求に応じてハードウェアへのアクセス手段を与え、サーバーやアプリケーションのようなプログラムがプログラムとして実行が可能になるための環境を与えるものだ。OSの中で、カーネルとはある意味下層部分と上層部分を繋げるノリのようなものであると同時に、ソフトウェアの仕掛け全体の中核に位置しながら、全てをきちんと成り立たせる、オーケストラで言えばコンダクター(指揮者)のようなものである。主役は基本的にアプリケーションであり、それらが楽器である。OSの中でカーネルは一部分にすぎず、コマンドを入力するシェルや、それぞれの仕事を、UNIXにおいてはそれぞれが単機能に行う、各種のコマンドプログラム、システムに常駐するデーモン、X11のようなハードウェアをグラフィカルな操作インターフェースに変える特殊なアプリケーション、そしてコンパイラやパッケージ管理システムがなければならない。GNU/LinuxにおいてはカーネルはLinuxだが、OSとしてはGNUのさまざまなツールを使うため、GNU/Linuxと言う呼び名が適切であると(少なくともFSFからは)言われている。技術的に見ると、デバイスドライバやメモリマネージメントやCPUの並列処理といったハードウェアの操作と、C言語ライブラリとの関係性、そしてプロセスの作成とリソースの割り当てやタイムスケジューリング、OSの下層システムとして必要なファイルシステムの実現やネットワーク接続(パケットやソケットなどの実現)が多い。ハードウェアをソフトウェアから適切に使うことが主目的であり、ネットワークやグラフィックスで専門的な用途を行うためには、カーネルを用いてハードウェアに接続する「ユーザーランド」が必要となる。Serverのようなシステムに必須の専門プログラムから、専門的アプリケーションに至る広汎なソフトウェア集団となる。カーネルの特殊な用途はネットワークであり、カーネル以外での特殊の用途はグラフィックスであると言える。両者はカーネルとユーザーランドのどちらにも区分されにくい領域であり、WindowsのようなOSではグラフィックスはOSに統合されている。X11はとても巨大であり、X11からKDE/GNOMEに至るGUIデスクトップ環境の領域は、「GUI時代の第二のカーネル(サブカーネル)」と呼んでも良いかもしれない。(サブカーネルは、僕の作った造語にすぎません。)低水準レイヤーと高水準レイヤーLinuxの大きな特徴として、低水準レイヤーと高水準レイヤーがある。UNIXでは、カーネルの上でユーザーランドのプログラムが動く、という比較的単純なレイヤー分けがなされているが、それが大きく様々なプログラムが発達したLinuxでは、もっと複雑になる。Systemがまず最下部にあり、その上でGTKやQtなどのツールキットがあって、その上にGNOMEやKDEのデスクトップ環境がある。プログラミング言語では、Javaの仮想マシンやPerlやPythonやRubyのインタープリタがあって、その上にDjangoやRailsなどのフレームワークがある。ほかにも、ApacheなどのWebサーバや、TomcatやJBossなどのミドルウェア、MySQLやPostgreSQLなどのデータベース管理システムが、低水準レイヤーとして存在する。いう考え方がLinuxには多く見られる。自分でプログラムを開発する場合には、自分のプログラムよりも低水準のレイヤーがどういう技術仕様で実装されているかやAPIなどに習熟しておく必要がある。セキュリティ対策clamavとウィルス対策Linuxでもアンチウィルスソフトウェアを導入したいなら、clamavがある。Linuxのウィルス対策については、以下のサイトが参考になるかもしれない。エンジニアの入り口Linuxではほとんどのアプリケーションがフリーなため、ウィルス対策ソフトのclamavすら無料である。clamavを入れていないからといって不安にならなくても良い。Windowsとは違って、Linuxではウィルス対策ソフトを導入しなくてもウィルスにはかからない。Linuxは普及していないため、ハッカーに狙われにくく、出回っているウイルスもLinuxを対象としたものは少ない。普及しないから安全なだけとは言われるが、本当はもし普及してしまえば、むしろ、セキュリティ対策が商売になる。Linuxのセキュリティサポートをする会社は、少ないながら存在する。Linuxが普及すれば、きっとそういうセキュリティのサポート商売が増えるだろう。Linuxでは、フリーソフトをバイナリだけで怪しいサイトからダウンロードしてインストールすることもなく、また標準のユーザー権限も少ないため、そもそもウイルスにかかり辛い状況にある。考えるべきはデスクトップのウィルス対策よりも、サーバーのセキュリティ管理である。この場合は、ログ機構と監視機構を上手く使って不正なネットワーク通信がないかを確認しながら、以下に示すchkrootkitを早い段階で導入して、定期的にrootkitのチェックをしよう。注意:セキュリティ対策が全く不要なわけではない。サーバーのセキュリティをきちんとすることは必須だ。常にOSとパッケージのアップデートはしておこう。Windowsと同様に、Linuxでもとても多くのセキュリティホールが見つかっている。Linuxのセキュリティ対策Linuxが絶対に安全なわけではなく、時にセキュリティホールが見つかったりすることはある。ネットワークに繋がった環境に、大切な情報の入ったファイルは置かないようにしよう。不要なポートは開けず、開ける場合にもたとえばSSHなどの設定でデフォルトのポートを変更しよう。パッケージの更新は常に最新にしよう。システム管理をしないと、特にビジネスなどの場合では、顧客情報や機密情報が漏れてしまうだろう。ネットサービスを使う時も、Googleなどの大手のサイトを利用し、異なるサービスで共通のパスワードは使わないこと。LinuxでもWindowsでも、そうした「基本的ITリテラシー」は身につけておかないといけない。分からない人間は、絶対に安易な気持ちでサーバーなどを公開してはいけない。PHPなどの勉強がしたいなら、ローカルの環境で行うこと。Linuxを入れるよりも、XAMPPなどの方がお勧めだ。プログラミング入門の用途であれば、Eclipseなどを導入することをおすすめする。Linuxでgccを使うのは、もっと上級者になってからの方が良いだろう。rootkitの定期的なチェックをLinuxでセキュリティを向上させるなら、rootkit(システムに侵入を許すツール)を定期的にチェックしましょう。chkrootkitをインストールすることで可能です。マシン内にバックドアを仕掛ける際に利用されるルートキットを検出するためのツールです。ワームの検出以外に、プロミスキャスモードになっていないか、ログファイル「lastlog/wtmp」は改ざんされていないか、隠蔽されているプロセスはないかといった項目をチェックしてくれます。検出はするけれども、修復はしません。なんらかの異常が検出が発見された場合は、直ちにネットワークを停止してなにが問題になっているのかを調査しましょう。コロのLinuxサーバー構築より引用。)余談オープンソースでプログラミングの勉強がしたいならLinuxやオープンソースでプログラミングの勉強がしたいなら、いくつかの選択肢がある。1.XAMPPなどでWindowsのままでローカル環境でPHPを動かす。→出来るようになってきたらLinuxを入れれば良い。2.Eclipseを使うことでJavaプログラミングをする。→出来るようになってきたら、Tomcatを入れるなりSwingで開発するなりすれば良い。Cloud9でブラウザでさまざまな言語のプログラムを動かす。プログラミング入門におすすめ。4.ドットインストールやProgateなどの入門サイトを閲覧する。→プログラミングの経験が全くなく、基本を知りたい方におすすめ。5.ネットでリファレンス的なホームページを読む。→既に言語のことを知っていて、「詳しいところだけ調べれば作れる」ような中級者におすすめ。makeなどを使って自分で作って勉強する。どのように開発していいか分からない。誰もが6を目指して6で挫折する。Linuxを無計画に入れるよりも、「どんな風に勉強していくか」を良く考えた方が良い。Linuxは行き当たりばったりに開発者へとなる道は存在しない。本当は、7.Linuxの仕組みを知ってMINIX本などを読み、ソフトウェア技術者としての基礎と理解を身につける。いうとても良い「正解の道」が存在する。それが、このホームページだと思えば良い。設計と理論およびMINIXによる実装」というA・S・タネンバウムの書籍)を読むのが一番、ソフトウェアの開発がきちんと分かる。僕はこの7をお勧めする。プログラミングの入門ではない、技術者への道である。Linuxの仕組みを知って、ITライターのみんなが「参考文献」などに挙げている定番の書籍を読めば良い。それが一番、きちんとプログラマになれる。本当は、最近のプログラミング環境というのはとても簡単になってきていて、WindowsでRubyを簡単に動かすこともできるし、あるいはgitなどを使って簡単に既存のオープンソースプロジェクトのリポジトリをクローンしたり、貢献者として参加することが簡単になっている。簡単にはなったものの、それで逆に技術レベルが下がっているところがある。Railsなんか、コードをほとんど書かず、ファイルを自動作成するだけでサービスの7割は完成する。ある意味、Debianのような「玄人向けディストリビューション」を入れることは、エンジニアであっても(特にシステムエンジニアでも、ネットワークエンジニアでも、フロントエンドでもバックエンドでも)、学生であっても、アマチュアやボランティアの開発者であっても良い経験になる。バックエンドを作りたいのであれば、明らかにLinuxは参考になるだろう。いう、「教養のためにLinuxを入れる」のは良いことだが、「Linuxを入れれば魔法のようにIT業界に参入できる」というものではない。「自分次第」という言葉は「自分の能力次第」という言葉だ。自分の能力を高めたい人は、きっとDebianやGentooなどの「手動管理と手動設定」の知識が将来活かせるようになるだろう。知識の全くない人間には、そもそもどういう風に管理して良いか分からない。ネットワークなどの仕組みを勉強し、公式のマニュアルやハンドブックを読むことで、きっとLinuxのことをマスターできるようになると思う。ひとつ、挫折しやすい選択肢として、「本を読む」というのが挙げられる。本を読むのはマスターの道としては王道だが、僕は「きちんと読まなくて良い」という。IT系の本は、きちんと読んでいるとどうでも良いプラクティスやイディオムばかりが載っていて、作りたいものがなかなか作れない。僕は「調べ読み」をすることをおすすめする。開発環境をインストールしたら、本を読むよりも自分の分かる知識だけで「考えてコードを書く」こと。必要になってきたら、その時その時に応じて「調べ読み」をする。した自分の経験は必ず生きる。本を読んでプログラミングの勉強をすると、99%挫折する。本なんか読まずに自分で考えてコードを書くこと。一応番号をつけておくと、8.教養のためにLinuxサーバーの管理方法を学ぶ。Linuxの管理が分かるとネットワークエンジニアになれる。