Linux Programming は、VirtualBox で Linux を動かして、そこでプログラミングを楽しんじゃおう、というお気楽なページです。M.Hiroi (Linux 初心者) の覚え書にすぎませんが、よろしければお付き合いくださいませ。
UNIX はマルチタスク・マルチユーザーのオペレーティングシステム (Operating System, OS) です。UNIX は商標登録されていて、標準化団体 (The Open Group) の認証を受けないと名乗ることができません。認証を受けている UNIX には、商用で AIX, HP-UX, Solaris などがあり、認証を受けていないフリーの Unix 系 (Unix ライク) な OS には Linux, FreeBSD, NetBSD などがあります。
Linux は 1991 年にリーナス・トーバルズ氏が開発した Linux カーネルが起源です。カーネル (kernel) は OS の中心で、これに必要となるシステムソフトウェアや多数のアプリケーションを加えたものが Linux という OS になります。これをパッケージとしてひとまとめにして配布しているものを Linux ディストリビューション (distribution) といいます。
Linux ディストリビューションには多くの種類があります。Linux ディストリビューション - Wikipedia によると、Debian 系、Red Hat 系、Slackware 系、独立系に分けることができるそうです。初心者はどのディストリビューションを選んだらよいか迷うところですが、本稿は初心者でも使いやすいといわれている Ubuntu (Debian 系) を VirtualBox という「仮想マシン」にインストールして、Linux の勉強を進めていくことにします。
Ubuntu はデスクトップ環境に Unity を使っていて、見栄えはとてもかっこいいのですが、非力なマシンだと動作が重くなるようです。仮想マシンで動かすにはちょっときついかもしれません。動作が重たい場合は他のデスクトップ環境を使ってみてください。
Unity 以外の主なデスクトップ環境を簡単に紹介します。
GNOME は Linux ディストリビューションの中でもっとも有名なデスクトップ環境のひとつです。 GNOME3 (ver 3.0) からは "GNOME Shell" になりました。ver 3.0 以前のデスクトップ環境を "GNOME パネル" といい、ver 3.0 以降でも利用することができます。Unity と同様に、GNOME Shell もかっこいいデスクトップなのですが、非力なマシンだと動作が重くなるようです。GNOME Shell をベースにした Ubuntu には Ubuntu GNOME があります。
KDE は GNOME と同様に有名で本格的なデスクトップ環境です。数多くのアプリケーションが搭載されていますが、その分だけ動作も重くなるようです。KDE をベースにした Ubuntu には Kubuntu があります。
Mate は GNOME 2 からフォークしたデスクトップ環境で、Unity 以前の Ubuntu と同じようなイメージになります。Mate をベースにした Ubuntu には Ubuntu MATE があります。
Xfce は軽量で高速なデスクトップ環境を目指して開発されています。Unity や GNOME よりも快適に動作するといわれています。Xfce をベースにした Ubuntu には Xubuntu があります。
LXDE は低スペックのマシンでもスムーズに動作することを目的に開発されたデスクトップ環境です。LXDE をベースにした UBuntu には Lubuntu があります。
VirtualBox と Ubuntu のインストールは簡単です。VirtualBox Ubuntu インストール で検索すると、多数のページがヒットするので、そちらを参考にしてください。また、YouTube で動画を公開されている方もいらっしゃるようです。
どの Ubuntu も VirtualBox にインストールして動かすことができます。ただし、M.Hiroi の環境は Windows7 (32 bit) で、CPU は Core i7-2670QM 2.20GHz ですが、メモリが 2 GB しかありません。仮想マシンの設定をシングルコア、メインメモリ 512 MB にした場合、ストレスを感じないで操作できたのは xubuntu と Lubuntu だけでした。xubuntu は少し重くて、快適に動作するのが Lubuntu です。そこで、本稿では主に Lubuntu を使っていくことにします。
ちなみに、Kubuntu と ubuntu MATE は、シングルコアではとても重いのですが、CPU を 4 つ、メインメモリを 768 MB に設定すると、快適とはいえませんが仮想マシンでも十分に使えるようになります。この条件では Ubuntu もそれなりに動作しますが、やっぱり重たい感じがしますね。なお、これは M.Hiroi の主観であり、客観的な評価ではありません。興味のある方はご自分の環境で確かめてみてください。
OS をインストールして再起動したあと、システムのアップデートを行ってください。Lubuntu の場合、左下隅のアイコンをクリックすると [メニュー] が表示されるので、そこから [システムツール] -> [ソフトウェアの更新] を選ぶか、端末で次のコマンドを実行します。端末はショートカットキー (ホットキー) Ctrl-Alt-T で起動するか、メニューから [アプリケーション] -> [LXTerminal] を選んでください。
sudo apt-get update sudo apt-get upgrade
管理者 (root) 権限が必要なコマンドを実行する場合、Ubuntu では sudo を使います。このとき、自分のパスワードを入力する必要があります。Ubuntu は GNU/Debian から派生したディストリビューションで、コマンド apt や aptitude を使ってパッケージのインストール / アンインストールを簡単に行うことができます。APT の使い方は APT -Wikipedia が簡潔にまとまっていて参考になると思います。
このあと、VirutualBox の Guest Additions CD を挿入します。VirtualBox のメニューの [デバイス] をクリックすると、一番下に [CD イメージの挿入] がありますので、それをクリックしてください。Ubuntu の場合、CD の挿入を検出してプログラムを自動的に実行してくれます。
CD を挿入してもプログラムを自動実行しない場合は、端末で次のコマンドを入力すると Guest Additions を簡単にインストールすることができます。
sudo apt-get install virtualbox-guest-dkms
これで、VirtualBox の拡張機能が使えるようになります。
VirtualBox は 3 種類の画面モードがあります。ひとつは、Windows のアプリケーションと同じように、窓の中にゲスト OS のデスクトップが表示されているモードです。VirtualBox では、これを「スケールモード」といいます。もう一つは「フルスクリーンモード」です。これは説明不要ですね。
最後の一つが「シームレスモード」です。これは VirtualBox の Guest Additions を適用すると可能になるモードで、ゲスト OS のデスクトップが消えて、ホスト OS のデスクトップの中で、ゲスト OS のアプリケーションを動作させることができます。つまり、Windows と Linux (X Window Sysytem) の「窓」を混在させることができるのです。
シームレスモードは他の仮想マシン、たとえば VMware Player では Unity モードといわれています。また、Cygwin の X Window System の場合でも、コマンド startx で起動するとスケールモードと同じように、ひとつの窓の中で X Window System が動作しますが、コマンド startxwin で起動すると、シームレスモードのように、Windows のデスクトップの中で X Window System のアプリケーションを動作させることができます。
VirtulaBox は画面モードをメニュー [ビュー] で切り替えることができますが、ショートカットキーを使ったほうが便利でしょう。
デフォルトの設定では、Host キーは Right Ctrl (右側の Ctrl キー) に割り当てられています。画面モードを変更したあと、おなじホットキーを押すと元のモードに戻ります。なお、Ubuntu 14.10 の Unity では、シームレスモードにすると、窓の外側に Unity の背景がはみ出していて、うまく操作することができませんでした。Ubuntu (Unity) とシームレスモードは相性が悪いのかもしれません。
VirtualBox には「共有フォルダ」という機能があります。これはホスト OS とゲスト OS のフォルダ (ディレクトリ) を共有する機能で、共有フォルダに格納されているファイルは、ゲスト OS とホスト OS のどちらからでもアクセスすることができます。
設定は簡単です。VirtualBox の [設定] -> [共有フォルダ] で、右側の一番上のアイコン (共有フォルダの追加) をクリックして、ゲスト OS と共有するホスト OS のディレクトリを指定します。このとき、[自動マウント] を有効にすると、仮想マシンでホスト OS を起動したとき、自動的に /media のサブディレクトリに共有フォルダ "sf_" + "ホスト OS のディレクトリ名" が作成されます。たとえば、共有フォルダ名が share だとすると、ゲスト OS では /media/sf_share が共有フォルダになります。
ディレクトリ sf_share はパーミッションが次のように設定されています。
drwxrwx--- 1 root vboxsf 0 11月 28 21:46 sf_share
アクセスできるのは管理者 (root) とグループ vboxsf に属しているユーザだけで、一般ユーザはアクセスすることができません。そこで、グループ vboxsf にユーザ (mhiroi は M.Hiroi のユーザ名) を追加することにしましょう。端末で次のコマンドを実行してください。
sudo gpasswd -a mhiroi vboxsf
このあと、ログアウトしてから再度ログインすると、共有フォルダ sf_share にアクセスすることができます。
このままではちょっと不便なので、シンボリックリンクを張りましょう。ホームディレクトリで次のコマンドを実行してください。
ln -s /media/sf_share share
これで cd share とすると、ホームディレクトリから共有フォルダに移動することができます。
Lubuntu のほかにも軽量 Linux と呼ばれているディストリビューションがあります。いくつか試してみましたが、その中で kona cofee さんが作成されているディストリビューション Kona Linux がよさそうです。Kona Linux は Debian wheezy から派生したディストリビューションです。Gnome とか Kde など高機能なデスクトップ環境を搭載したバージョンもありますが、LXDE を搭載した Kona Linux (無印) やメインメモリが 256 MB でも動作する light, black といった軽量版があります。
kona cofee さんによると、軽量化指向なのは light と black で、他のものは軽量化を目指したものではない、とのことですが、無印の場合で起動直後の使用メモリが約 76 MB、VirtualBox (シングルコア、メインメモリ 512 MB) でも快適に動作します。Lubuntu よりも軽いなあと思いました。
Linux 初心者 (M.Hiroi) にとって、Debian は Ubuntu よりも難しいイメージがあるのですが、Kona Linux ならば初心者でも簡単に使うことができそうです。kona cofee さんに感謝いたします。興味のある方は試してみてください。
次は Lubuntu にプログラミング言語をインストールしてみましょう。
まずは GCC (GNU C Compiler) ですね。Lubuntu の場合、Linux にもかかわらず GCC はインストールされていないのですが、Guest Additions のインストールに GCC が必要になるので、Guest Additions を適用すれば自動的にインストールされているはずです。
mhiroi@mhiroi-VirtualBox:~/test$ gcc --version gcc (Ubuntu 4.9.1-16ubuntu6) 4.9.1 Copyright (C) 2014 Free Software Foundation, Inc.
たとえば、hello, Lubuntu と表示するプログラムは次のようになります。
リスト : hello, Lubuntu #include <stdio.h> int main() { printf("hello, Lubuntu\n"); return 0; }
エディタですが、Lubuntu には LeafPad という GUI のエディタがありますが、今回は端末で動作するエディタを使ってみましょう。どの UNIX でも使えるエディタには有名な vi がありますが、初心者には大変難しいので、ここでは GNU nano というエディタを使うことにします。最近では、ほとんどの Linux ディストリビューションで nano が同梱されているようです。nano は高機能なエディタではありませんが、初心者でも直感的に操作することができます。
それではコンパイルしてみましょう。
mhiroi@mhiroi-VirtualBox:~/test$ nano hello.c mhiroi@mhiroi-VirtualBox:~/test$ gcc -O hello.c mhiroi@mhiroi-VirtualBox:~/test$ ls a.out hello.c mhiroi@mhiroi-VirtualBox:~/test$ ./a.out hello, Lubuntu
きちんとコンパイルすることができました。
Lubuntu の場合、Perl と Python はインストールされていますが、Ruby はインストールされていません。
mhiroi@mhiroi-VirtualBox:~/test$ python --version Python 2.7.8 mhiroi@mhiroi-VirtualBox:~/test$ python3 --version Python 3.4.2 mhiroi@mhiroi-VirtualBox:~/test$ perl --version This is perl 5, version 20, subversion 1 (v5.20.1) built for i686-linux-gnu-thread-multi-64int ・・・省略・・・ mhiroi@mhiroi-VirtualBox:~/test$ ruby プログラム 'ruby' はまだインストールされていません。 次のように入力することでインストールできます: sudo apt-get install ruby
sudo apt-get install ruby を実行すると、Ruby 2.1 がインストールされます。
mhiroi@mhiroi-VirtualBox:~/test$ ruby --version ruby 2.1.2p95 (2014-05-08) [i386-linux-gnu] mhiroi@mhiroi-VirtualBox:~/test$ irb irb(main):001:0> 1 + 2 + 3 => 6 irb(main):002:0>
同様に、Gauche (Scheme), SBCL (Common Lisp), SML/NJ, OCaml, Haskell などパッケージが用意されているプログラミング言語であれば簡単にインストールすることができます。
プログラミング言語をインストールするとき、パッケージのバージョンが古いことがあります。たとえば、Gauche の最新バージョンは 0.9.4 ですが、パッケージ版は 0.9.3.3 で少し古いバージョンです。最新バージョンを使いたい場合はソースコードからビルドする必要があります。
Gauche の場合、ソースコードからのビルドは簡単です。Gauche-0.9.4.tgz をダウンロードして、tar zxf Gauche-0.9.4.tgz で解凍します。ソースコートは、ディレクトリ Gauche-0.9.4 に展開されるので、そのディレクトリに移動して次のコマンドを実行します。
./configure make sudo make install
これで Gauche の最新版をインストールすることができます。
それでは、お馴染みの「たらいまわし関数」を使って、実行時間を計測してみましょう。C言語の場合、たらいまわし関数は次のようになります。
リスト : たらいまわし関数 (C言語版) #include <stdio.h> int tak(int x, int y, int z) { if (x <= y) { return z; } else { return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)); } } int main() { printf("%d\n", tak(22, 11, 0)); }
時間計測はコマンド time を使います。
mhiroi@mhiroi-VirtualBox:~/test$ gcc -O2 -o tak tak.c mhiroi@mhiroi-VirtualBox:~/test$ time ./tak 11 real 0m1.975s user 0m1.932s sys 0m0.000s
time で時間を計測する場合、プログラムの起動時間も含まれることに注意してください。実行結果は次のようになりました。Gauche, SBCL, SML/NJ, OCaml は time を使わずに計測しました。
処理系 | 秒 |
---|---|
Python3 (ver 3.4.2) | 98.0 |
Python (ver 2.7.8) | 89.0 |
Ruby (ver 2.1.2p95) | 50.0 |
Gauche (ver 0.9.3.3) | 33.4 |
PyPy (ver 2.3.1) | 29.0 |
ocamlc (ver 4.0.1) | 22.0 |
SBCL (ver 1.2.3) | 6.04 |
SML/NJ (ver 110.76) | 3.99 |
GCC -O (ver 4.9.1) | 2.36 |
GHC -O (ver 7.6.3) | 2.28 |
SBCL (最適化) | 2.07 |
GCC -O2 (ver 4.9.1) | 1.94 |
ocamlopt (ver 4.0.1) | 1.25 |
ホスト OS (Windows) で実行するよりも少しだけ遅くなりましたが、仮想マシンで動作しているとは思えないほど高速に実行することができました。I/O 処理がからむとホストよりもっと遅くなるかもしれませんが、そうでなければ高速な処理を期待してもよさそうです。VirtualBox は本当に凄いですね。OS だけではなくプログラミング言語のインストールも簡単なので、Unix やプログラミング言語の学習には十分すぎる環境だと思いました。
Linux でプログラミングするならば、手に馴染む使いやすいエディタが欲しくなります。エディタの好みは人それぞれですが、M.Hiroi は Emacs 派です。大昔の話ですが X68000 のときは MicroEmacs を使っていて、Windows になってからは xyzzy を使うようになりました。ずっと長い間 xyzzy を使い続けているので、Emacs 派というよりも xyzzy 派といったほうが正しいかもしれません。
残念なことに、xyzzy は Unix 系の OS では動作しません。そうなると、Lisp 好きの M.Hiroi が選ぶエディタは Emacs しかありえないのですが、せっかくなので、ほかにエディタがないかちょっと調べてみました。最初に、デスクトップ環境に同梱されている標準のエディタを示します。
Pluma は gedit から派生した MATE 用のエディタです。ネットの評判では、gedit や Kate の人気が高いようです。
これ以外のエディタで、Ubuntu で使えるものがないか調べてみました。
このほかに、Java で動作するものを含めると、jEdit という高機能なエディタがありますし、統合開発環境では有名な Eclipse があります。
もっと探せばいろいろなエディタが見つかるとは思いますが、きりがないのでここまでにしておきましょう。どうも M.Hiroi の好みに合いそうなエディタがなさそうなので、質実剛健に "端末 + Emacs" でプログラミングしてみようかな、と思っております。
最近の端末 (Terminal) は 256 色に対応しています。Cygwin の端末 (mintty) は 256 色対応です。これは今まで M.Hiroi が試してみた Ubuntu の端末も同じです。各 Ubuntu に同梱されている標準の端末を示します。
Ubuntu : GNOME端末 Kubuntu : Konsole Ubuntu MATE : MATE端末 xubuntu : xfce4-terminal Lubuntu : LXTerminal
Lubuntu の場合、環境変数 TERM の値はデフォルトで xterm になっています。
mhiroi@mhiroi-VirtualBox ~ $ echo $TERM xterm
たとえば、端末で Emacs を起動 (emacs -nw) し、M-x list-colors-display を実行すると、8 色が表示されます。
256 色に変更するには、TERM の値を xterm-256color に変更します。Emacs を次のように起動してください。
mhiroi@mhiroi-VirtualBox ~ $ TERM=xterm-256color emacs -nw
この状態で M-x list-colors-display を実行すると、256 色が表示されます。Linux のシェルは標準で bash が使われています。環境変数 TERM の設定は、ホームディレクトリのファイル .bashrc で行うと簡単です。次の 1 行を書き加えるだけです。
export TERM='xterm-256color'
また、Emacs を端末で起動する場合、-nw オプションを付けなくてもいいように、エイリアスを設定しておくと簡単です。これも .bashrc に次の 1 行を書くだけです。
alias em='emacs -nw'
これで端末で em を実行すると、端末上で Emacs を起動することができます。
ところで、Emacs を端末で使う場合、黒い背景だと青色の文字が見えにくいかと思います。Emacs は色を変更するのがちょっと面倒なのですが、ver 24 からは「テーマ (theme) 」という機能が導入されていて、テーマを切り替えることで色を簡単に変更することができます。aoe-tk さんの Emacs24に最初から同梱されているテーマ には、設定方法とデフォルトでインストールされている 13 種類のテーマが紹介されています。ただし、端末が 256 色表示に設定されていないと、テーマは有効になりません。ご注意くださいませ。
Lubuntu の場合、日本語を選択すると iBus-Anthy がインストールされます。xubuntu のように、派生ディストリビューションによっては日本語入力システムがインストールされていないものもあります。Unix 系の日本語入力は「インプットメソッド」と「かな漢字変換エンジン」を組み合わせて使います。インプットメソッドはキーボードから文字を入力するためのソフトウェアのことで、iBus がインプットメソッドで、Anthy がかな漢字変換を担当します。
iBus-Anthy を使ってもいいのですが、ネットでは Google が開発した変換エンジン Mozc (モズク) の評価が高いようなので、日本語入力を fcitx-mozc に変更してみましょう。ubuntu は日本語入力システムを簡単に変更することができます。
まず最初に、fcitx と mozc をインストールします。次のコマンドを実行してください。
sudo apt-get install fcitx fcitx-mozc
これで必要なものはすべてインストールされるはずです。あとは、[設定] -> [言語サポート] で、[キーボード入力に使う IM システム] をiBus から fcitx に切り替えるだけです。これで日本語入力を fictx-mozc で行うことができます。
Linux はフリーで利用できるフォントが多数あり、デフォルトでインストールされているものだけではなく、パッケージ化されているフォントであればコマンド sudo apt-get install パッケージ名 で簡単にインストールすることができます。
プログラミング用のフォントもいろいろあるのですが、M.Hiroi の好みにあうフォントがなかなか見つかりません。ちなみに、M.Hiroi の好みは線の細いゴシックです。まあ、多少太くてもいいやと思って、いくつかのフォントを試してみたところ、RictyDiminished (GitHub) が M.Hiroi のフィーリングに合いそうです。優れたフォントを作成された遊佐泰紀様に感謝いたします。
パッケージでないフォントをインストールする場合、一番簡単な方法はホームディレクトリに .fonts というディレクトリを作り、そこにフォントファイルを配置することです。GitHub は zip ファイルでダウンロードできるので、そのファイルを .fonts に移動して、コマンド unzip で展開します。RictyDiminished-master というサブディレクトリが作成され、その中にフォントファイルが展開されます。
最近の Linux はコマンド zip / unzip で zip 形式のファイルを扱うことができます。もしくは、Linux に同梱されているアーカイブマネージャ (Lubuntu の場合は File Roller) でも展開することができます。最後に、コマンド fc-cache -fv を実行する、または、ログアウトして再度ログインすると、フォントの設定で RictyDiminished を選択できるようになります。
Windows のファイルマネージャー (ファイラー) は標準でエクスプローラー (Explorer) ですが、M.Hiroi はほとんど使っていません。M.Hiroi の好みはキーボードで操作する二画面ファイラーです。大昔の話ですが、X68000 ユーザーのころは MINT という二画面ファイラーを使っていました。Windows になってからは xyzzy に搭載されている二画面ファイラーを愛用しています。
Linux の場合、各ディストリビューションには GUI のファイルマネージャーが同梱されています。Lubuntu のファイルマネージャー PCManFM はタブ型ファイラーで、ディレクトリに移動するとき、Web ブラウザのように新しいタブにディレクトリの内容を表示させることができます。また、二画面ファイラーのように画面を二分割することもできます。
GUI ではなく端末で動作するファイラーもあります。Midnight Commander (Wikipedia) は典型的な二画面ファイラーです。Debian 系の Linux であれば、次のコマンドでインストールすることができます。
sudo apt-get install mc
起動は端末でコマンド mc を入力します。画面は左右に二分割されていて、TAB キーまたは CTRL-I で移動することができます。カーソルキーでファイルを選択する、または insert キー (または CTRL-T) で複数のファイルをマークして、コピーや削除を一括して行うことができます。主なコマンドはファンクションキーに割り当てられていてるので、簡単に操作することができます。なお、Midnight Commander は Windows 版や Cygwin 版もあります。
MS-DOS 時代に一世を風靡したファイラー「FD」の Unix 版である FDclone もあります。次のコマンドでインストールすることができます。
sudo apt-get install fdclone
コマンド名は fd です。ファイルのマークはスペースキーで行います。man fd は日本語で表示されるので、詳しい説明はマニュアルをお読みください。
キーボードで操作するファイラーといえば、Emacs の dired (ディレクトリエディタ) を忘れてはいけません。M-x dired (または C-x d か C-x f) でディレクトリを指定すると、ディレクトリの一覧がバッファに表示されます。このバッファの中でファイルやディレクトリを操作することができます。
基本的なコマンドを簡単に紹介します。
コマンド | 機能 |
---|---|
h | help の表示 |
g | ディレクトリの再読み込み |
i | サブディレクトリの一覧も表示する |
p, ↑ | カーソルを上へ移動 |
n, ↓ | カーソルを下へ移動 |
f, Ret | ファイル (ディレクトリ) を開く |
o | 別 window でファイル (ディレクトリ) を開く |
v | ファイルを view モードで開く |
m | マークを付ける |
% m | 正規表現にマッチするファイル名をマーク |
u | マークの解除 |
U | マークをすべて解除 |
t | マークの反転 |
d | 削除マークを付ける |
x | 削除マークのファイルを削除 |
C | マークしたファイルをコピー |
D | マークしたファイルを削除 |
R | マークしたファイルを移動 |
Z | 圧縮ファイルの展開 |
! | カレントファイルやマーク済みのファイルにコマンドを実行 |
+ | ディレクトリの作成 |
^ | 親ディレクトリに移動 |
q | dired buffer を閉じる |
このほかにも便利なコマンドがあります。詳しい説明は GNU Emacs マニュアル, 26. ディレクトリエディタdired をお読みください。また、dired の基本的な使い方は l3msh0@github さん (Qitta) の Emacs標準のファイラdiredの基本的な使い方と便利なTipsいくつか が参考になると思います。
GUI 全盛のこの時代、キーボードで操作するファイラーは使いにくいと思われる方がほとんどでしょうが、この手のツールは使い慣れてくると手放せなくなるものです。興味のある方は一度試してみてください。
『Linux Programming』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『Linux Programming』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、本ページの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。