2012年7月アーカイブ

職場に限らず良く聞かれるのですが、一寸面白いので纏めてみました。
情報処理演習で使ったのは、日立の HITAC M-240D でした。スパコンではなく、メインフレームですね。
丁度、ここにあるシステムと同じで、コンソールは1つでした。
HITAC_M-240H.jpg

1.5 MIPS ... Macintosh Classic (MC68K 8MHz 1.0 MIPS)より早いんだけど、現在の Core i7 は、15万MIPS ですから、1万分の1の性能しか無かった訳です。

学生はどうやって入力していたかというと、ゾンデックスという OCR カードに、手書きで書いた FORTRAN プログラムを、専用のリーダーに読み込ませて、パンチカードに出力して、それを、コンソールに繋がった、パンチカードリーダーで読むように成っていました。

結果は、巨大なドットインパクトプリンタに出力されて、※印で書いたグラフだったり、今から
10年後の曜日だったり...昔の学生向けの課題です。

FSSimpleCreateFile (Cocoa)

| コメント(0)
普段は、標準ライブラリ使えばいいんですが、ファイルタイプの指定はまだ必要なので、こんな感じに成ります。
POSIX パス (UTF8) から、FSRef への変換は、FSPathMakeRef 使います。

OSErr FSSimpleCreateFile(FSRef *pfsref, const char* fname, OSType creator,
OSType fileType) {
	OSErr		error = bdNamErr;
	UniChar		utfname[256];
	UniCharCount	utfsize;
	FSRef		tmpRef;
	CFStringRef	cfname;
	FSCatalogInfo	catinfo;
	FileInfo*	fileinfo;
	
	cfname = CFStringCreateWithCString(NULL, fname, kCFStringEncodingUTF8);
	utfsize = (UniCharCount)CFStringGetLength(cfname);
	
	if (utfsize) {
		CFStringGetCharacters(cfname, CFRangeMake(0, utfsize), utfname);
		if (!FSMakeFSRefUnicode(pfsref, utfsize, utfname, 
kTextEncodingUnicodeDefault, &tmpRef))
			FSDeleteObject(&tmpRef);
		
		fileinfo = (FileInfo*)catinfo.finderInfo;
		fileinfo->fileCreator = creator;
		fileinfo->fileType = fileType;
		fileinfo->finderFlags = 0;
		fileinfo->location.h = 0;
		fileinfo->location.v = 0;
		fileinfo->reservedField = 0;
		
		error = FSCreateFileUnicode(pfsref, utfsize, utfname, 
kFSCatInfoFinderInfo, &catinfo, &tmpRef, NULL);
	}
	CFRelease(cfname);
	return error;
}

ちなみにファイルの一覧を取得するのは、FSOpenIterator と、FSGetCatalogInfoBulk を使うのですが、FSRef 自体がデータ構造が公開されておりませんし、ファイル名も保持していませんので、結局、POSIX パスに変換して、保存してしまいます。
POSIX パスの場合は、ディレクトリー名が変更された場合等に対応出来ないのですが、その為に FSGetCatalogInfo 等で、FSSpec を取得するのも後ろ向きな気がしませんか?
以前はそれで問題が出る (MS Word とか) 事もあったのですが、最近はそれが普通なので、もう特に気にしなくても良い気がします。(^^;;

POSIX パスで管理する場合は、opendir を使ってファイル一覧を作成した方が楽ですね。
NSWindowController を使わないと、ややこしいのですが、何故か File Template Library に無いので、嵌りやすい。
オブジェクトライブラリの、Objects & Controrollers にも無いよ。(あったら更に混乱していたと思うけど)

iOS の場合は、モーダルビューだし、MacOS アプリの場合は、Object Controller を作成して、メインのアウトレットに繋いでおけば、簡単に使えるので、実は余り使う機会が無いからかな?

  1. Project に、Cocoa.framework を追加
    Build Phases の、Link Binary With Libraries を開いて、+ボタンを押して追加。
    Build Settings の、LLVM GCC 4.2- Language で、GCC_INPUT_FILETYPE を、Objective-C++ に設定。

  2. File Template Library の、Windows を Project Navigator にドロップして xib ファイルを作成

  3. NSWindowController のサブクラスを作成

    // SampleModalPanel.h
    
    #import <cocoa/cocoa.h>
    
    @interface SampleModalPanel : NSWindowController {
    	// IBOutlet を追加
    }
    - (IBAction)dialogOk:(id)sender;
    @end
    
    // SampleModalPanel.m
    
    #import "SampleModalPanel.h"
    
    @implementation SampleModalPanel
    - (id)initWithWindowNibName:(NSString *)nibNameOrNil {
        self = [super initWithWindowNibName:nibNameOrNil];
        if (self) {
    	// ここに初期化コードを追加
       }
        return self;
    }
    
    - (IBAction)dialogOk:(id)sender {
        [[NSApplication sharedApplication] stopModalWithCode:1];
    }
    @end
    
  4. File's Owner の Identify に指定したサブクラスを設定
    Connection の Outlets → window に、作成したパネルを接続

  5. 呼び出し側のコードはこんな感じ。

    int			result;
    SampleModalPanel*	selectFormatPanel = [[[SampleModalPanel alloc] 
    initWithWindowNibName:@"SampleModalPanel"] autorelease];
    
    result = [[NSApplication sharedApplication]
    	runModalForWindow:[selectFormatPanel window]];
    [[selectFormatPanel window] orderOut:nil];
    

About This Article

このページには、2012年7月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年6月です。

次のアーカイブは2012年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenIDEnabled! What is OpenID?
Powered by Movable Type 5.04