UbuntuにObjective-Cをインストール

ubuntuObjective-cをインストールしたときの手順

1. Objective-Cのパッケージ「gobjc」をインストールする

# sudo aptitude install gobjc

2. 関連するパッケージをインストールする。
これらをインストールしていないと、ヘッダファイル「Foundation/NSObject.h」をimportしたクラスをコンパイルした時に「error: Foundation/NSObject.h: No such file or directory」というようなエラーが出る。

# sudo aptitude install libgnustep-base-dev
# sudo apt-get install gnustep
# sudo apt-get install gnustep-devel

3. Objective-Cのサンプルファイルをダウンロードする

$ wget www.otierney.net/files/objc.tar.gz

Objective-Cの簡単な使い方は以下のサイトを参照。
http://www.otierney.net/objective-c.html

4. ダウンロードしたファイルを解凍する

$ tar xzf objc.tar.gz

5. まずはHello Worldを出力するサンプルを動かしてみる
解凍したディレクトリ内にサンプルが色々入っている。helloというディレクトリ下にhello worldを出力するサンプルがある。

$ cd objc/hello/
$ ls
main.m  output

main.mの内容はこんな感じ。

#import <stdio.h>

int main( int argc, const char *argv[] ) {
    printf( "hello world\n" );
    return 0;
}

main.mをコンパイルする。

$ gcc -lobjc main.m

ファイルを確認する。実行ファイルが生成されている。

$ ls
a.exe  main.m  output

生成された実行ファイルを実行する。

$ ./a.exe
hello world
  • 参考サイト

http://d.hatena.ne.jp/ykot/20100625/1277440933
http://l-w-i.net/t/ubuntu/objc_001.txt
http://d.hatena.ne.jp/tomute/20090112/1231809116

ファイルを検索する

拡張子が「txt」で、ファイル名に「linux」を含んでいるファイルを検索するコマンド

例えば「linux-20101214.txt」のようなファイル。

find . -type f -name "*.txt" | xargs grep "Linux"

-type:ファイルの種類を指定して検索。指定する引数は下記の4種類。
    「c」 キャラクタ型特殊ファイル
    「d」 ディレクトリ
    「f」 通常ファイル
    「l」 シンボリックリンク

-name:指定した文字列のファイル・ディレクトリを検索。

warning: class Xxx does not implement the 'AVAudioPlayerDelegate' protocol

オーディオを再生させたりするAVAudioPlayerクラスを使おうとした時に発生した警告

AVAudioPlayerクラスのインスタンスを生成しているところで警告が出た。
ClockAppDelegate.m

@implementation ClockAppDelegate

 - (void) playAnnounce: (NSTimer *) timer {
	
	// AVAudioPlayerのインスタンス生成
	AVAudioPlayer* avap = [ [AVAudioPlayer alloc] initWithContentsOfURL: url
														 error: nil ];
}
@end

■警告の内容

warning: class 'ClockAppDelegate' does not implement the 'AVAudioPlayerDelegate' protocol

警告: ClockAppDelegateクラスはAVAudioPlayerDelegateプロトコルを実装していない

ヘッダファイルのクラスの宣言をしているところで、AVAudioPlayerDelegateというプロトコルを書き忘れているようだ。

ヘッダファイルの構成は以下のようになっている。

@interface クラス名: スーパークラス名<プロトコル, プロトコル, ・・・>
{
    インスタンス変数の宣言
}
    メソッドプロトタイプ宣言
@end

■対応
AVAudioPlayerDelegateプロトコルを追加した。
ClockAppDelegate.h

@interface ClockAppDelegate : NSObject <UIApplicationDelegate, AVAudioPlayerDelegate> {
    IBOutlet UIWindow* window;		
}
    @property (nonatomic, retain) IBOutlet UIWindow *window;
@end

warning: 'Xxx' may not respond to '-xxx'

■下記のクラスをビルドしたら警告が発生した。

ClockAppDelegate.m

@implementation ClockAppDelegate
 - (void) setupTimeAnnounce {
	// 時報用のタイマーを生成
	timerAnnounce = [ NSTimer scheduledTimerWithTimeInterval: 60.0f ];

        ---略---
}
@end

■警告の内容

warning: 'ClockAppDelegate' may not respond to '-setupTimeAnnounce'
warning: Messages without a matching method signature  will be assumed to return 'id' and accept '...' as arguments.

ヘッダファイルにsetupTimeAnnounceメソッドが宣言されていない。
ちなみに、警告なのでビルド、実行することはできる。

■対応
ヘッダファイルにメソッド名を宣言する。

ClockAppDelegate.h

@interface ClockAppDelegate : NSObject <UIApplicationDelegate> {
	
}
	@property (nonatomic, retain) IBOutlet UIWindow *window;

	- (void) setupTimeAnnounce;  // ここに追加

@end

システム監視ツール - watchdog

watchdogとはシステムを監視し、異常が発生したのを観測した場合マシンを再起動するソフトウェアである。異常観測後の動作はリブートのみである。特定の機能、例えばapacheを再起動するなどということはできない。

■インストール

# yum install watchdog
 ---略---
Installed: watchdog.i386 0:5.6-1.el5
Complete!

■構成

/usr/sbin/watchdog
/usr/man/man5/watchdog.conf.5
/usr/man/man8/watchdog.8
/etc/watchdog.conf

■watchdog.confの設定
例として以下のような内容を設定する。

  • Apacheのpidファイルを10秒間隔で監視し、ファイルが存在していれば/dev/watchdogというファイルに書き込む。pidファイルが無い場合、つまりapacheが落ちていた場合はマシンを再起動する。

設定方法は以下の通り。

watchdog.confを開く。

# vi /etc/watchdog.conf

下記3つの設定値を変更する。
-------------------------------------
watchdog-device = /dev/watchdog
interval = 10
pidfile = /var/run/httpd.pid
-------------------------------------

■確認
1. watchdogを起動する。

# /etc/rc.d/init.d/watchdog start
watchdog を起動中:                                         [  OK  ]

2. apatcheを停止する。

# apachectl stop

3. 10秒後、マシンが再起動がされればOK。

■注意:watchdogを自動起動する場合の設定
Watchdogを自動起動に設定する場合、最後に起動するようにしておくこと。
でないと以下のような状態に陥ることになる。
1. マシンが起動
2. watchdogが起動
3. watchdogがapachehttpd.pidの確認をする
4. httpd.pidがないためapacheが異常であると判断する
5. マシンの再起動を開始する

永遠に起動できない。


■設定・監視できるもの

  • 負荷の閾値:1分、5分、15分間隔で設定可能
  • 利用可能仮想メモリサイズの最低値(閾値
  • 温度センサの閾値(デフォルトは120)。限界を超えるとシステム停止。また、この限界値の、90%、95%、98%で警告を発する。
  • 指定されたファイルのstatコール許容戻り時間(デフォルトは1分)
  • pidfileで指定されたpidのプロセス稼動監視
  • プロセス・テーブルの空き状態(watchdog自身のforkプロセス使用)
  • 指定されたIPアドレスに対しpingし、unreachableをチェック
  • 指定インターフェースの受信トラフィックモニタ

問題発生時に、ユーザ定義コマンドの実行やemailで通知することが可能である。


■参照サイト
 Linux/watchdog

[Linux]PATHの設定方法

JDKPostgreSQLなどインストールした際、最後にコマンドのPATHを通す設定があると思う。どのようにPATHを設定するかメモしておく。

例として、/usr/java/jdk1.6.0_18をPATHに設定する方法を記す。

■方法1::bashrcにPATHを追記する方法
1. bashrcを開く
bashrcはユーザのホームディレクトリ直下に隠しファイルとして存在する。
「~/」はホームディレクトリ、「.」が先頭につくファイルは隠しファイルを意味する。

$ vi ~/.bashrc

下記を追記する。

export JAVA_HOME=/usr/java/jdk1.6.0_18
export PATH=$PATH:$JAVA_HOME/bin

パスには優先度がある。「echo $PATH」を実行した時、より左側にあるパスが優先される。例えば、echoコマンドでパスを出力すると下記のようになっていたとする。

$ echo $PATH
/usr/bin/java:/usr/java/jdk1.6.0_18/bin/java

このときjavaコマンドを実行した場合、先頭の/usr/bin/javaが呼び出されることになる。

パスを先頭に追加したい場合:PATH=$PATH:$JAVA_HOME/bin
パスを末尾に追加したい場合:PATH=$JAVA_HOME:$PATH

2. bashrcに追記した設定を有効にする
設定を有効にする方法は2通りあり、1つは新しいターミナルを開くこと、もう1つは現在のターミナルで下記コマンドを実行すること。

$ source ~/.bashrc

3. PATHが設定されたことを確認する

$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.2) (6b18-1.8.2-4ubuntu2)
OpenJDK Client VM (build 16.0-b13, mixed mode, sharing)


■方法2::ターミナル上でPATHを設定するコマンドを実行する方法
現在開いているターミナル上だけにPATHを通したい場合、下記コマンドを実行する。

export JAVA_HOME=/usr/java/jdk1.6.0_18
export PATH=$PATH:$JAVA_HOME/bin

コマンドを実行したターミナル上だけにPATHが通される。

2. PATHが設定されたことを確認する

$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.2) (6b18-1.8.2-4ubuntu2)
OpenJDK Client VM (build 16.0-b13, mixed mode, sharing)

3. 新しいターミナルを開きjavaコマンドを実行してみる

$ java -version
java: command not found

PATHが通っていないのが分かる。