2006.08.21

USBメモリからKnoppixのブート

USBメモリも安くなって、1GBのものが数千円で手に入るようになった。 というわけで、最近、雑誌で話題のLinuxのUSBブートに挑戦してみた。 Linuxのディストリビューションとしては、DebianベースのKnoppixとFedora CoreベースのBerryを選択してみた。

まず、「日経Linux」の2006年9月号の特集「Linuxを持ち歩こう!」のPart3「USBメモリーにはまだまだ工夫の余地がある」を参考に、Knoppixに挑戦したのだけれど、これだけでは、USBメモリからうまく起動しない。 USBメモリに入れるべきファイル自体はOKなのだが、どうやらUSBメモリのパーティションがうまく設定できていないようで、それについては記事では触れられていない。

結局、まとめると以下の方法で実行した。

  1. ELECOMのMF-AU2シリーズの1GBのUSBメモリを用意
  2. USBメモリから、フォーマットのユーティリティFORMAT.EXEをPCにコピーする
  3. FORMAT.EXEを起動して、1パーティションでUSBメモリをフォーマットする
  4. HPのDrive Key Boot Utilityで、USBメモリの領域を確保し、最低限起動可能なLinuxをインストール(ちなみに、USBメモリを挿したマシンはHPのデスクトップ。)
  5. USBメモリの中のファイルを全部消す
  6. 後は、記事通りにKnoppix5.0.1のCDの/boot/isolinuxの中身をUSBメモリのルートにコピーし、isolinux.cfgをsyslinux.cfgと名前を変え、ファイルの中のisolinuxの部分をsyslinuxに変更。 また、/knoppix以下をUSBメモリの/knoppix以下にコピー

以上で、BIOSの設定を変えるとKnoppixは起動するようになった。 HPのDrive Key Boot Utilityで領域確保するとうまくいったのは、USBメモリを挿したマシンがHPのマシンだったからかもしれない。 ちなみに、他にも3台くらい古いPCで試したけれど、USBメモリをBIOSの段階で認識しなかったりしてダメダメだった。

一方、Berryの方は、Berry 0.72のCDを作成し、WindowsからCDを起動し、HPのDrive Key Boot Utilityの処理まで終わったUSBメモリを挿し、「Berry OS をUSBメモリーにインストール」という項目を選べばインストールはOKなのだろうか? これでブートしようとすると、vmlinuzがないと言われてしまってブートしない。 というか、確かに見当たらない。 もしかすると、アーカイブされたイメージの中にはあるのかもしれないけれど。 仕方がないので、Berry OSをCDから起動して、/boot以下のファイルを適当にコピー(記憶があやふやだがvmlinuzとinitrd.gzあたり。この辺はちょうど「日経Linux」の「進め!カーネル探検隊」の連載の第9回「ブート・シーケンス」が参考になった。)してみたところブートするようになったけれど。 もしかするとインストールの方法を間違えているのかも。

| | コメント (5) | トラックバック (0)

2006.08.12

Programming in Objective-C (7)

前々回の続きで、第7章「More on Classes(より詳しいクラスの説明)」。 内容はファイルの分割、複数の引数を持つメソッド、ローカル変数、static、self、メモリリーク(メモリの解放忘れ)に関して。

まず、ファイル分割。 @interface部はクラスが外部からどう見えるかを記述したもので、これは従来のCのヘッダーファイルに相当し、「クラス名.h」というファイルに入れる。 それで、そのクラスを利用するファイルで#import "クラス名.h"としてインポートする。 次に@implementation部は「クラス名.m」などというファイルに分割してやる。 コンパイルするとき、一つのファイルしかなかった場合と違うのは、「.m」ファイルを複数並べて指定すること。

次に、複数の引数を持ったメソッドは「メソッド名:引数2を表すキーワード:引数3を表すキーワード:...」と表される。 宣言は以下のようになる。


メソッドの種類 (返り値の型) メソッド名: (型)仮引数1 引数2を表すキーワード: (型)仮引数2  引数3を表すキーワード: (型)仮引数3...;

実は、この引数を表すキーワードはなくてもいいのだが、あった方がわかりやすい。

それから、メソッドの中で、処理を行なうために、変数を宣言して使うことがある。 この変数は、普通に宣言すると、ローカル変数となり、これはそのメソッドの中で使うことができ、メソッドが呼ばれる度にメモリ上に確保され、メソッドが値を返すと消えてしまう。 メソッドの引数もローカル変数で、引数の元の値が、仮引数にコピーされて使われているので、メソッドの中でいくら値を書き換えても、メソッドを呼び出した側には何も影響しない。 ただし、変数が参照型だったりして、それを使って参照先を直接いじるようにプログラムを書くと、メソッドの外にも影響を及ぼす。 まあ、これはCのポインタの場合と一緒。 また、メソッドの中で変数を宣言するときにstaticを付けてやると、この値は静的にメモリ上に確保され、メソッドが値を返しても消えない。 なお、staticを付けても、この変数の値は、変数が宣言されているメソッドの中でしか使えないことには注意する必要がある。

それから、メソッドの中で、(他の)オブジェクトのメソッドを呼ぶことができる。 自分自身のオブジェクトのメソッドを呼ぶには、オブジェクトにはselfを指定してやればよい。

最後にメモリリーク(メモリの解放忘れ)について。 Cでは、メモリ管理は自分で自覚的に行なう必要がある。 それで注意しなければならないが、オブジェクトにfreeをし損ねることだ。 また、メソッドの中でオブジェクトを作って処理をすることがあるが、そのメソッドが再帰呼び出しされていたりすると、次々とオブジェクトが作られ、どんどんメモリを消費してしまう。 これを解決する万能薬はなさそうで、注意してプログラムを書く必要があるということで。

| | コメント (0) | トラックバック (0)

2006.08.10

Programming in Objective-C 番外編

今回は、番外編ということで、Kathy Sierra、Bert Bates著、夏目大訳、『Head First Java第2版』、オライリージャパン、2006年の前半のプログラムの課題をObjective-Cで作成してみた。

…してみたのだけれど、実は"Programming in Objective-C"の前半では、主に数値を使ったプログラムばかり書いていたことがわかった。 たとえば、文字列を扱う方法は、まだ出てこなかったりする。 ところが、結構、実際のプログラムでは、この文字列の処理がポイントだったりする。 それで、Objective-Cはともかく、Cで文字列を扱うには、文字の配列を用意したり、文字の配列へのポインタを使ったりするのだが、これはなかなか最初はわかりにくい話だったりする。

Javaの場合、Stringクラスを使うとそれなりに安直に文字列を扱うことができて、『Head First Java』の課題では、文字列を使ったものが多い。 そんなこんなで、記憶と確認と定着のために、JavaをObjective-Cに置き換えて、練習しようという目論見ははずれ、ほとんど普通にCでプログラムを書いているのと大差ないハメに陥ってしまった。 それから、Cでは、無理に文字列を使うよりは、整数値を使った方がプログラムとしてはきれいになったりする場合もあり、結構、書き直す感じになった。

たぶん、後の方でNSStringとか出てくるらしいので、それを使えばいいだろうけれど、とりあえず今回はCの作法でという感じ。 それでも、Objective-Cについて、あやふやな理解をしていたところの復習には十分なった。

| | コメント (0) | トラックバック (0)

2006.08.09

Programming in Objective-C (6)

前回の続きで、第6章「Making Decisions(判定を行なう)」。 内容は、if、else、switch、条件演算子で、基本はCと同じ。

それから、ブール値YESかNOという値を取るBOOLという型があり、これはマクロで定義されている。 調べてみると、Xcode2.3では、objc/Object.hをインポートしておけば、インポートされるobjc/objc.hで以下のように定義されていた。


typedef signed char BOOL;
#define YES (BOOL)1
#define NO  (BOOL)0

| | コメント (0) | トラックバック (0)

2006.08.08

Programming in Objective-C (5)

前回の続きで、第5章「Program Looping(繰り返しのプログラム)」。 内容は、for、while、do〜while、breakとcontinueというもので、Cの場合と一緒。

C99では、Javaみたいに、プログラムの途中でいきなり以下のように変数を宣言して使うことができ、これはgccでコンパイルするときには-std=c99とかオプションを付けると通るようになる。


for(int i=0; i<10; i++) {
  処理
}

それから、最大公約数を求めるユークリッドの互除法。 きちんと覚えているわけではないので、メモ。

uとvの最大公約数(gcd = greatest common divisor)は以下の繰り返しで求められる。

  1. vが0になったら、gcdはuである。
  2. temp = u % v、u = v、v = tempを実行し、1に戻る。

本書では、分数を扱うプログラムをだんだん完成度を高めていっているが、ユークリッドの互除法はたぶん後で通分したりするのに役に立つはず。

| | コメント (0) | トラックバック (0)

2006.08.07

Programming in Objective-C (4)

前回の続きで、今回は第4章「Data Types and Expressions(データ型と式)」。

データ型は基本はCと一緒。 大きな違いはid型というのがあり、一般的なオブジェクトを表すということ。

演算子の方も、Cと一緒。 ビット毎のXORで値の入れ替えができるのは知らなかったのでメモ。

普通、xとyの値(たとえば整数値)を入れ替えるには、もう一つ変数(たとえばtmp)を用意しておいて、以下のように書く。


int tmp;
tmp = x;
x = y;
y = tmp;

以下のようにビット毎のXORを使うと、tmpが不要になる。


x ^= y;
y ^= x;
x ^= y;

つまりは、x XOR y = y XOR xという関係があるので、x XOR y XOR x = x XOR x XOR y = 0 XOR y = yとなるということで。

それから、複素数用に_Complexと_Imaginary、ブール値用に_Boolという型もある。 ためしに複素数を使ったプログラムを書いてみた(これで適切かどうかは不明)。


#import <stdio.h>
#import <complex.h>

int main(void)
{
    _Complex double z, w;
    z = 1.0 + 1.0*I;
    w = -12.0 + 0.15*I;

    printf("z = %f + %fi\n", creal(z), cimag(z));
    printf("w = %f + %fi\n", creal(w), cimag(w));

    z *= w;
    printf("z*w = %f + %fi\n", creal(z), cimag(z));

    return 0;
}

ちなみに実行結果は、次のようになった。


z = 1.000000 + 1.000000i
w = -12.000000 + 0.150000i
z*w = -12.150000 + -11.850000i

| | コメント (0) | トラックバック (0)

2006.08.06

Programming in Objective-C (3)

昨日の続き。 今回は第3章「Classes, Objects, and Methods(クラス、オブジェクト、メソッド)」。 内容はオブジェクト指向入門。

オブジェクト指向では、プログラムする対象がどういうモノなのかというところに焦点を当てて考える。

たとえば、自分や家族の車を対象とするプログラムを書きたいとする。自分の車や家族の車は、車の一種である(is-a関係)。 言い方を変えると、車というクラス(種)のインスタンス(実例)である。 車には、ボディの色をはじめとしたステートがあり、このようなステートは各インスタンスの変数が保持する。 また、車に対しては、何かを行なうことができるが、クラスやインスタンスに対するアクションをメソッドという。

クラスやインスタンスにメソッドを適用するには、プログラムでは以下のように書く。


[ クラスやインスタンス メソッド ];

これはレシーバにメッセージを送るとも呼ばれ、以下のようにも書く。


[ レシーバ メッセージ ];

メソッドに引数がある場合には、以下のように書く。


[ クラスやインスタンス メソッド: 引数];

プログラムには、@interface部、@implementation部、プログラム部がある。 @interface部は、クラスが持っている変数とメソッドのプロトタイプ宣言を書く。 @implementation部は、メソッドの処理を実際に書く。 プログラム部では、クラスに属するインスタンスを実際に作って、それを使う。

1つのファイルに全部入れる場合、プログラムの構造は以下のようになる。


#import <stdio.h>
#import <objc/Object.h>

@interface クラス名: Object(ないしは親のクラス名)
{
  型 インスタンス変数名1;
  型 インスタンス変数名2;
  …
}

メソッドの種類(返り値の型) メソッド名1: (型) 仮引数名;
メソッドの種類(返り値の型) メソッド名2: (型) 仮引数名;
…
@end

@implementation クラス名;
メソッドの種類(返り値の型) メソッド名1
{
  処理
  …
}

メソッドの種類(返り値の型) メソッド名2
{
  処理
  …
}
…
@end

int main(int argc, char *argv[])
{
  クラス名 *インスタンスを参照する変数名;
  インスタンスを参照する変数名 = [クラス名 alloc]; //インスタンスをメモリ内に用意
  [インスタンスを参照する変数名 init];  //インスタンスを初期化
  処理
  …
  [インスタンスを参照する変数名 free];  //インスタンスをメモリから消す。
  return 0;
}

ここで、メソッドの種類は、「-」ならインスタンスに対するメソッド、「+」ならクラスに対するメソッド。

allocとinitの2行は、以下の1行でもOK。


  インスタンスを参照する変数名 = [クラス名 new];

インスタンス変数の値をクラスの外から参照できるようにするため、インスタンス変数名を持ち、インスタンス変数の値を返すメソッドを用意することもある。

| | コメント (0) | トラックバック (0)

2006.08.05

Programming in Objective-C (2)

前回の続き。

今回は、第2章「Programming in Objective-C(オブジェクトCによるプログラミング)」。 内容は、Mac OS Xのコマンドライン、Xcode、WindowsのMinGWなどのGCC環境におけるプログラムの作成とコンパイルと実行について。

ポイントは、Objective-Cのソースファイルの拡張子は「.m」。 コマンドラインでコンパイルするには「gcc -o 出力ファイル名 ソースファイル名 -l objc」。 Xcodeの場合は「新規プロジェクト」で「Application」→「Cocoa Application」あたりを選ぶ。 Cとの違いは、#include じゃなくて#import になっていること。 あと、printfの変換指定子%dは、%iと書いても同じで、本書では%iの方が使われている。

| | コメント (0) | トラックバック (0)

2006.08.04

Programming in Objective-C (1)

Stephen G. Kochan, "Programming in Objective-C", Developer's Library, 2003を読む。

とりあえず、第1章「Introduction(はじめに)」はObjective-Cと本書の構成の紹介といったところ。

Objective-Cは、NEXTSTEP由来でMac OS Xのアプリを作るのに使われるけれど、1992年からGCCでもサポートされているし、MinGWとGNUStepの組み合わせでも行けるというのが、個人的にはポイントかも。 ああ、そういえば、GCCをmakeするときにobjcも作るように指定していたなあ(使わなかったが)と思い出すのだった。

| | コメント (0) | トラックバック (0)

2006.06.02

入門Webマッピング

Tyler Mitchell著、大塚恒平他訳、『入門Webマッピング -- 自分で作るオリジナルのデジタル地図』、オライリー・ジャパン、2006年を買う。

本書は、オープンソースのGIS(地図+データベース)システムの入門書。 主にMapServer、OpenEV、PostGISなどを紹介している。

載っている例は、原書通りで、当然アメリカなどのものが多い。 一応、ふろくで日本向けに無料で入手できるデータなども紹介されている。 結構、GISを使ってみたくても、データの入手の方にお金がかかったりするという障壁があるので、この辺はありがたいかも。

本書の内容は、主にはデータの形式や地図の投影法、ツールの使い方などだ。 実際にこう使うと、こういう応用がという部分には踏み込んでいない。 そこは結構、GISの肝のはずなので、そういう本も欲しいところ。 あと、Ajaxなどで地図を提供するサーバのシステムの部分の書き方とかが紹介されている本があるとうれしいかも。

| | コメント (0) | トラックバック (0)

より以前の記事一覧