【Java】Apache Forrest

以前ちょこっとだけインストールして動かしてみたことがあるのだけど、いまいち使い道が思いつかなかったのでそのまま放置していました。
今使ってみると、うん、なんとなく便利そう。ドキュメント管理と自動ウェブサイト構築ってのはとてもいい感じ。

アーカイブをダウンロードして、解凍、PATHを書いてexportして(.bash_profileあたりに書くのがいい)
あとはウェブサイト公開するディレクトリに行って、

$ forrest seed

$ forrest

とコマンドを打つだけで、Apacheのサイトライクなサイトが出来てしまう。
webのディレクトリ/src/documentation/content/xdocs
へ行くと、index.xmlとsite.xmlがあるので、その中身を修正すればOK。




とても簡単。活用したいです。

【DynamicsAX】2012をインストール

現実逃避でインストール。毎晩0時に帰ってくるような生活はもういや...



Dynamics AX 2012、ぱっと見がちょっと変わった。
64ビット環境でなければインストールできない。
まだローカライズされてない。
”かんばん”方式をサポートしている様子。
とりあえず動きました。
インストールは超めんどくさいです。まる二日間かかったかな。仮想マシンでADもDBも混在してメモリが4GBしかないからかな、遅い遅い。ハードディスク60GBで始めたけれど、Dynamicsが動くようになるまでに、すでに55GBも食ってしまっている。Share PointやらOffice、Visual Studioなどなど。ともかく必要となるものが多すぎです!

生産管理、マスタプラン、在庫管理、売掛金、買掛金管理あたりを一通り動かせるようにしてみたいと思います...

【OS X Lion】httpd.conf

OS X LionにしてからいじってなかったApache
そういやってんでlocalhostでアクセスすると、

"requested URL / was not found on this server"

なんだいどうしたんだってんで、ぐぐってみたら、同じことで悩んでいた方を発見
http://wun.jp/mac/lion/
httpd.confをhttpd.conf.defaultで置き換えたら、It worksとなりました。

ちょっとだけびっくり

(追記)
ユーザーのディレクトリでweb公開のときの設定
やったことがなかったので、メモ
http://eyenote.cocolog-nifty.com/blog/2011/08/mac-os-x-107lio.html
感謝です、ありがとうございます

【iOS】Core Data & TableView 作り方1

以前作ったテストアプリの作り方、最初からあらためて、できるだけ分かり易いようにメモします。ただ、ここで書いたメモの大部分は、オイラはオフィス加減さんの書籍”つくって覚えるObjective-C入門”を読んで実際に手を動かして覚えたことです。この書籍は初心者には大変分かり易いです。オイラのメモを読むよりもむしろこの書籍を買って読むほうがいいです、絶対。
それと、オイラははてなの有料会員ではないので、スクリーンショットを大量にアップできない(制限がある)ので、文字ばかりになってしまいます。環境についてですが、2011年5月30日現在、Mac OS X 10.6.7、Xcodeは4.0.2を使用しています。

1)Xcode(バージョン4.0.2)を立ち上げます
2)File → New → New Project...を選びます
3)iOSのNavigation-based Applicationを選びます
4)Product NameとCompany Nameを入力し、Use Core Dataにチェックします
5)保存場所を指定します

iOSアプリのテンプレートが生成されます。これに手を加えていくわけです。生成されたファイルは
iPhoneTestAppDelegate.h
iPhoneTestAppDelegate.m
MainWindow.xib
RootViewController.h
RootViewController.m
RootViewController.xib
iPhoneTest.xcdatamodeld
デフォルトのままビルドもできます。そうすると、追加ボタン(+)を押すたびに押した時刻のタイムスタンプが追加表示されるだけです。以前おこなったように名前と電話番号を入力できるようにするために、修正していきます。
まずはモデル(iPhoneTest.xcdatamodeld)を修正します。下記画像のように、Attributeを追加修正します。name、phoneともにStringで作成します。

次に、このように修正したモデル(エンティティ)とキーを読みにいけるように、ソースを修正します。修正するファイルはRootViewController.mです。

// 修正箇所1
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

    // モデルを修正したので、それに合わせてキーも修正
    cell.textLabel.text = [managedObject valueForKey:@"name"];
    cell.detailTextLabel.text = [managedObject valueForKey:@"phone"];

}

この修正箇所1は、テーブルに表示させるキーを設定しているところです。デフォルトテンプレートだと、timestampだけを表示させるようになっています。上記のようにvalueForKeyのところを、修正したモデルに合わせて書き直します。

// 修正箇所2
- (void)insertNewObject
{
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = 
        [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
    [newManagedObject setValue:@"Test! Test! Test!" forKey:@"name"];
    [newManagedObject setValue:@"03-0000-0000" forKey:@"phone"];
    
    NSError *error = nil;
    if (![context save:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

この修正箇所2では、追加ボタンを押したときの挙動を修正します。修正箇所1では読み取るキーを書いていますが、こちらではセットするキーの値をハードコードしています。setValueのところがそうです。なので、追加ボタン(+)を押すたびに、"Test! Test! Test!"と"03-0000-0000"が、どんどん追加されます。

// 修正箇所3
- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil)
    {
        return __fetchedResultsController;
    }
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    
    [fetchRequest setFetchBatchSize:20];
    
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    
    [fetchRequest setSortDescriptors:sortDescriptors];
    
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    
    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

	NSError *error = nil;
	if (![self.fetchedResultsController performFetch:&error])
        {
	    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
	    abort();
	}
    
    return __fetchedResultsController;
}

この修正箇所3のメソッドでは、アクセスする エンティティとソートに用いるキーを書いています。それだけではないのですが、今んとこそれだけ分かっていればよさげです。自分もこれから深く説明できるようにしていきます。entityForName:@"Event" でエンティティを設定し、initWithKey:@"name"でソートのキーを設定しています。

// 修正箇所4
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

この修正箇所4で、テーブルビューの見せ方の設定をしています。initWithStyle:UITableViewCellStyleValue1のところがそうです。デフォルトのままだと、タイムスタンプだけを見せる書き方なのですが、上記のように書くことで、名前と電話、2つの属性を表示できるようになります。ほかにもスタイルがあると思うけど、試したことがまだない。

ここまで修正したら、Runボタンを押す事で、iPhoneシミュレータが起動して、アプリをいじることができます。今回は、ハードコードした値だけを追加表示するようにしているので、なあんも面白くないですが、次回は、任意の文字列を登録・表示できるよう修正していきます。

【Access】パスワードを施したら、失念してAccessを使えなくなった!

はい、そのようなことをしてしまったのは私です。
そんなときには C:\Users\ユーザー名\AppData\Roaming\Microsoft\Access この中にある System.mdwを削除しちゃえばOKです。削除しても、Accessを起動すれば、また生成されます。

【DynamicsAX】X++のメモ : ExcelへExportその2

バッチインプットはさておき(いいのか)。フォームを作成して、ボタンを押したらテーブルからExcelへエクスポートってのを。

まずはAOTを立ち上げてFormを新規に作成。ボタンを配置したら、前々回あたりのコードをMethodの中に"clicked"として記述する。

そのFormを立ち上げると、こんなん。

今回読みに行くテーブルはSalesTable。こんなやつ。

んで、ボタンを押して実行してみると、Excelが起動するんす。んで、選んだフィールドのぶん、エクスポートしてくれてます。

次回は、また思いついたものを(てけとうだなあ)。

【DynamicsAX】X++のメモ : ExcelからImport

X++のメモ。
前回の続きで、今度はExcelからインポート。今回参考にさせていただいたサイトはaxapta.blogcu.comさん。Thank you so much!

void ImportFromExcel()
{
    MyTable myTable;
    COMVariant  COMVariant1;
    SysExcelApplication app;
    SysExcelWorkbooks   Workbooks;
    SysExcelWorkbook    Workbook;
    SysExcelWorksheets  Worksheets;
    SysExcelWorksheet   Worksheet;
    SysExcelCells       Cells;
    SysExcelCell        RCell;
    int                 i;
    #excel
    app = SysExcelApplication::construct();
    Workbooks = app.Workbooks();
    COMVariant1 = new COMVariant();
    COMVariant1.bStr("C:\\Users\\ユーザー名\\myExcel.xls");
    Workbook = Workbooks.Add(COMVariant1);
    Worksheets = Workbook.worksheets();
    Worksheet = Worksheets.itemFromName("MyTable");
    Cells = Worksheet.Cells();

    i = 1;

    RCell = Cells.Item(i, 1);
    ttsbegin;
    while(RCell.Value().bStr() != '')
    {
        myTable.strField = RCell.value().bStr();

        RCell = Cells.Item(i, 2);
        myTable.intField = str2int(RCell.value().toString());

        RCell = Cells.Item(i, 3);
        myTable.dateField = RCell.value().date();

        myTable.insert();
        i++;
        RCell = Cells.Item(i, 1);
    }
    ttscommit;
}

次回は...バッチインプット?ジョブで自動的に。