M.Hiroi's Home Page

Linux Programming

[ Home ]

WHAT'S NEW


CONTENTS


はじめに

Linux Programming は、VirtualBox で Linux を動かして、そこでプログラミングを楽しんじゃおう、というお気楽なページです。M.Hiroi (Linux 初心者) の覚え書にすぎませんが、よろしければお付き合いくださいませ。

●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 のデスクトップ環境

Ubuntu はデスクトップ環境に Unity を使っていて、見栄えはとてもかっこいいのですが、非力なマシンだと動作が重くなるようです。仮想マシンで動かすにはちょっときついかもしれません。動作が重たい場合は他のデスクトップ環境を使ってみてください。

Unity 以外の主なデスクトップ環境を簡単に紹介します。

●VirtualBox と Ubuntu のインストール

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 の主観であり、客観的な評価ではありません。興味のある方はご自分の環境で確かめてみてください。

●Guest Additions CD のインストール

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 の画面モード

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 の共有フォルダ

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 とすると、ホームディレクトリから共有フォルダに移動することができます。

●他の軽量 Linux ディストリビューション

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 のインストール

まずは 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

きちんとコンパイルすることができました。

●Ruby のインストール

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 を使わずに計測しました。

表 : tak(22, 11, 0) の結果
処理系
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 派といったほうが正しいかもしれません。

●Ubuntu のエディタ

残念なことに、xyzzy は Unix 系の OS では動作しません。そうなると、Lisp 好きの M.Hiroi が選ぶエディタは Emacs しかありえないのですが、せっかくなので、ほかにエディタがないかちょっと調べてみました。最初に、デスクトップ環境に同梱されている標準のエディタを示します。

Pluma は gedit から派生した MATE 用のエディタです。ネットの評判では、gedit や Kate の人気が高いようです。

これ以外のエディタで、Ubuntu で使えるものがないか調べてみました。

このほかに、Java で動作するものを含めると、jEdit という高機能なエディタがありますし、統合開発環境では有名な Eclipse があります。

もっと探せばいろいろなエディタが見つかるとは思いますが、きりがないのでここまでにしておきましょう。どうも M.Hiroi の好みに合いそうなエディタがなさそうなので、質実剛健に "端末 + Emacs" でプログラミングしてみようかな、と思っております。

●端末 (Terminal) の 256 色化

最近の端末 (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 のファイルマネージャー

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

キーボードで操作するファイラーといえば、Emacs の dired (ディレクトリエディタ) を忘れてはいけません。M-x dired (または C-x d か C-x f) でディレクトリを指定すると、ディレクトリの一覧がバッファに表示されます。このバッファの中でファイルやディレクトリを操作することができます。

基本的なコマンドを簡単に紹介します。

表 : dired の基本的なコマンド
コマンド機能
hhelp の表示
gディレクトリの再読み込み
iサブディレクトリの一覧も表示する
p, ↑カーソルを上へ移動
n, ↓カーソルを下へ移動
f, Retファイル (ディレクトリ) を開く
o別 window でファイル (ディレクトリ) を開く
vファイルを view モードで開く
mマークを付ける
% m正規表現にマッチするファイル名をマーク
uマークの解除
Uマークをすべて解除
tマークの反転
d削除マークを付ける
x削除マークのファイルを削除
Cマークしたファイルをコピー
Dマークしたファイルを削除
Rマークしたファイルを移動
Z圧縮ファイルの展開
!カレントファイルやマーク済みのファイルにコマンドを実行
+ディレクトリの作成
^親ディレクトリに移動
qdired buffer を閉じる

このほかにも便利なコマンドがあります。詳しい説明は GNU Emacs マニュアル, 26. ディレクトリエディタdired をお読みください。また、dired の基本的な使い方は l3msh0@github さん (Qitta) の Emacs標準のファイラdiredの基本的な使い方と便利なTipsいくつか が参考になると思います。

GUI 全盛のこの時代、キーボードで操作するファイラーは使いにくいと思われる方がほとんどでしょうが、この手のツールは使い慣れてくると手放せなくなるものです。興味のある方は一度試してみてください。


参考文献, URL

  1. UNIX実習マニュアル (PDF) (大黒学さん)
  2. Windowsプログラマに贈るLinuxプログラミング入門 (中島能和さん, ITpro)
  3. Debian リファレンス, 第1章 GNU/Linux チュートリアル (青木修さん)
  4. 砂原秀樹, 石井秀治, 植原啓介, 林周志 (共著), 『プロフェッショナルシェルプログラミング』, 株式会社アスキー, 1996

『Linux Programming』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『Linux Programming』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、本ページの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2015-2017 Makoto Hiroi
All rights reserved.

[ Home ]