VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

2010年08月

インターンTreasure開催中!!

こんにちわ。システム本部の吉村(@yes2339)です。
以前 インターン募集!! していましたインターン「Treasure」はじまりました。
プログラム初心者から経験者まで幅広く参加頂いています。

これまでの講義は、
・エディタ操作(vim)
・バージョン管理(subversion)
・HTML・CSS
・データベース(MySQL)  です。

講義風景として数枚掲載致します。
IMG_1740






入り口イメージ

IMG_1728





全体イメージ


受講生には、講義期間中に日報を記載頂いています。 
そちらから一部抜粋。

>【今日やったこと】
>・htmlの基礎とか文法
>・cssの基礎とか
>・課題(タスク管理アプリを作るためのhtmlでの画面の作成)
>【今日の思い】
>・基本的な要素しか使ってないから、もっと多くの要素の使い方を覚えるべきだ
>・課題のhtmlに必死で、cssをほとんど触れる事が出来なかったので、色の変え方とかIDで指定するとかをもっと使って慣れなければ・・・


>HTMLのほうは、基本的な文法、フォーム、リンクのつけ方等を学びました!
>CSSのほうはあまり進展せず・・。
>背景の色だけCSSで変更しました。
>覚えることが多くて大変ですが、実際にページが作られていくのは楽しいですね。

新しい事を学ぶ楽しさ と 受講生同士 教えあいながら日々進んでいます。
今回のTreasureのTwitterのハッシュタグは、 #treasure2010 です。

Happy Scaning(1): 「濃い」漫画「薄い」漫画

こんにちは, 株式会社ECナビ システム本部の春山(@haruyama)です.

KindleやiPadの登場によって, 紙の本をスキャンしてPDF化する(いわゆる自炊)が盛り上っています. 私も今年ScanSnap SI1500とPL-513Lを購入し, 日々本を裁断してはスキャンしています. スキャンした本はPCやNetWalker(PC-Z1)で閲覧しています.

pc-z1

写真では画面を横断する線が入ってますが実際には見えません.

スキャン設定

主に技術書と漫画をスキャンしていて, すべての本に対して以下の設定を利用しています.

画質
スーパーファイン
カラーモードの選択
カラー高圧縮
読み取り面の選択
両面読み取り
ファイル形式
PDF
圧縮率
5(最大)
その他
  • 白紙のページは自動削除
  • 検索可能なPDFにはしない(技術書はあとでしています)
  • カバーはスキャンしていません.
  • 表紙はスキャンする意味のある場合にスキャンしています.
  • マルチフィード検出: 重なりで検出(超音波)

他の方の設定例: ScanSnap S1500 の設定まとめ - 電子書籍を自炊するときの 10 のポイント - 彼女からは、おいちゃんと呼ばれています

カラーモードの選択を「自動」にしていないのは, 漫画のスキャン時に白黒とカラーがいりまじることがあったからです.

マルチフィード検出は, 文庫本などではそれなりに失敗します. スキャン前に原稿の枚数を数えておいてスキャン後に確認し, 枚数が違ったらマルチフィードを見付けてその部分をパッチしています.

漫画のカバーは保存しています(写真はその一部です).

manga_cover

ScanSnap Organizerには技術書と漫画が雑然と並んでいます. 技術書のOCRの間に漫画をスキャンすることが多いからです.

scanscanp_orgnizer

「濃い」漫画「薄い」漫画

こうして作成した190冊の漫画PDFについて, ファイルサイズをページ数で割ったものを計算したデータ(mangapdf_20100824.tsv)を作りました. ファイルサイズ/ページ数が大きいほど「濃い」漫画, 小さいほど「薄い」漫画と呼ぶこととします. なお, ここで挙げている漫画はすべて好きな漫画です. 私は「濃い」漫画も「薄い」漫画もそうでない漫画もすべて好きです. 「濃い」「薄い」は絵柄などの情報量の違いを表す表現です.

ここでは私が持っている漫画のうち「濃い」「薄い」それぞれベスト5を紹介します.

「薄い」漫画ベスト5

まずは「薄い」ほうから.

「薄い」漫画ベスト5
順位漫画漫画家(敬称略)サイズ(kB)/ページ数
1かいしゃいんのメロディー大橋 ツヨシ24
2サカモト山上 たつひこ38
3水木しげる 恐怖貸本名作選 墓をほる男・手袋の怪水木 しげる51
412月生まれの少年施川 ユウキ52
5水木しげる 魍魎貸本名作選 地獄・地底の足音水木 しげる64

圧倒的な強さで「かいしゃいんのメロディー」がベスト1に輝きました. 他にも4コマ系が順当に上位に入っています.

貸本時代の水木しげる先生もランクイン. 「薄い」感じにはみえないのですが...

「濃い」漫画ベスト5

そして「濃い」ほうです.

「濃い」漫画ベスト5
順位漫画漫画家(敬称略)サイズ(kB)/ページ数
1へうげもの山田 芳裕343
2アスカ@未来系島本 和彦280
3ゲキトウ島本 和彦270
4ジャイアントキリングツジトモ248
5涼宮ハルヒちゃんの憂鬱ぷよ242

「へうげもの」が2位に大差を付けました. 山田 芳裕先生の「濃さ」に勝てる漫画はなかなかなさそうです.

2,3位は島本 和彦先生の作品が入りました. 島本先生の作品はスキャンした数が多いので, サイズ/ページ数をながめてみるとなかなかおもしろいです. というわけで次回は島本 和彦先生の漫画の作品ごとの「濃さ」を考察します!Happy Scaning(2): 島本和彦漫画の「濃度」の研究に続く!

【詳細図解】iPhoneの共通モジュールのベストプラクティス(その5)

こんにちは、 株式会社ジェネシックス の徐 廷(@TonnyXu)です。iPhoneの共通モジュールのベストプラクティスに関してです。
 文章が長くなりますので、5回に分けてお届けします。

今回は、5回目となります。

その1

■ 共通プロジェクトを作る

その2

■ コンシューマPJを作る

■ コンシューマPJで共通プロジェクトを引用

その3

■ 引用する後コンシューマPJでの必須設定

その4

■ コンシューマPJを実行する

その5

■ さらに

・ 共通プロジェクトに単体テストを追加

・ オープンソースライブラリを作る

■ さらに

コード品質を向上するために、単体テストは不可欠です。特に共通モジュールでバグがあると、影響は非常に大きなものになるので、単体テストをしっかり作ったほうが良いと思います。

・ 共通プロジェクトに単体テストを追加

iPhone SDKは3.0から、単体テストをサポートしています。では、共通モジュールに追加してみましょう。


adding lib test target.
図23:共通プロジェクトにテストtargetを追加

新しいTargetのタイプは「Unit Test Bundle」です。名前は「LogicTests」にしましょう。まずは図24のように、テストTargetの依存性を指定しましょう。


adding dependency for test target.
図24:テストTargetの依存関係画面

図24の依存関係の下の「+」ボタンを押してください。


select dependency module for test target.
図25:共通モジュールを依存先として追加

これで、単体テストのtargetができました。次はテストケースを追加しましょう。Testというグループを作って、右クリックして、Add New Files...を選択してください。


add test case files.
図26:テストケースを選択


name the test case.
図27:テストケースを追加

注意 所属targetはLogicTest *のみを選択してください。

テストケースのテンプレートが自動的に適用されます。下記のようなヘッダーファイルとコードファイルが自動的に生成されます。

GCDeviceTests.h
//
//  GCDevicesTests.h
//  Common
//
//  Created by Tonny Xu on 10/05/26.
//  Copyright 2010 genesix, Inc. All rights reserved.
//
//  See Also: http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

//  Application unit tests contain unit test code that must be injected into an application to run correctly.
//  Define USE_APPLICATION_UNIT_TEST to 0 if the unit test code is designed to be linked into an independent test executable.

#define USE_APPLICATION_UNIT_TEST 0

#import <SenTestingKit/SenTestingKit.h>
#import <UIKit/UIKit.h>
//#import "application_headers" as required

@interface GCDevicesTests : SenTestCase {

}

#if USE_APPLICATION_UNIT_TEST
- (void) testAppDelegate;       // simple test on application
#else
- (void) testMath;              // simple standalone test
#endif

@end


GCDeviceTests.m
//
//  GCDevicesTests.m
//  Common
//
//  Created by Tonny Xu on 10/05/26.
//  Copyright 2010 genesix, Inc. All rights reserved.
//

#import "GCDevicesTests.h" 

@implementation GCDevicesTests

#if USE_APPLICATION_UNIT_TEST     // all code under test is in the iPhone Application

- (void) testAppDelegate {

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
    STAssertNotNil(yourApplicationDelegate, @"UIApplication failed to find the AppDelegate");

}

#else                           // all code under test must be linked into the Unit Test bundle

- (void) testMath {

    STAssertTrue((1+1)==2, @"Compiler isn't feeling well today :-(" );

}

#endif

@end

ヘッダーファイルの「USE_APPLICATION_UNIT_TEST」を0に設定しましょう。この時点では本番のテストケースをまだ書いていませんが、テストを実行することはできます。では、プロジェクトの実行targetを下図のようにLogicTestに変更しましょう。


select new target.
図28:テストケースのtargetに設定

「テストケースを実行する」というより実はコンパイルするだけです。Active targetをLogicTestに設定したら、コンパイル(Build→build)してみましょう。間違っていなければ、ビルド結果画面を開く(Build->Build Results)と、下図のような画面が出てきます。


compile test target and get the test result.
図29:テストケースの実行結果

クラスGCDeviceをテストするために、GCDevice.mファイルをLogicTests Targetに追加しなければいけません。GCDevice.mファイルを右クリックして, 出てくるメニューのGet Infoをクリックしましょう。下図の画面が出てきます。


add .m files to test target.
図30:テスト対象クラスの.mファイルをテストtargetに追加

図30のように、二つのtargetの左側のチェックボックスを全部チェックしてから、GCDeviceTests.mファイルに新しいテストケースを追加しましょう。

GCDeviceTests.h
//...上省略
#else
- (void) testMath;              // simple standalone test
- (void) testIsIPad;
#endif
//...下省略

GCDeviceTests.m
//...上省略
- (void) testMath {

    STAssertTrue((1+1)==2, @"Compiler isn't feeling well today :-(" );

}

- (void) testIsIPad{
    STAssertFalse( [GCDevice isIPad], @"単体テストとしてはFalseしかない.");
}
//...下省略

追加したテストケースの実行結果を見てみましょう。


new test case running result.
図31:testIsIPadのテストケース実行結果

これで、共通モジュールの作成、利用、テストの説明がすべて終わりました。

・ オープンソースライブラリを作る

この共通モジュールは自分のプロジェクトで使えるだけではなく、ほかの人のプロジェクトでも動きます。もしこの共通モジュールを公開したければ、最低限libCommon.aファイルとすべてのヘッダーファイル(テストケースのヘッダーファイルを除く)を一緒にアーカイブして提供すれば、だれでも手軽に使えます。本文で使用したサンプルコードです。
オープンソースライブラリにするなら、このプロジェクトのすべてのフォルダとファイル(buildフォルダを削除したほうが良いです)をGoogle CodeあるいはGitHubにアップロードしましょう。

皆さんが作ったすばらしいライブラリをお待ちしております。

【詳細図解】iPhoneの共通モジュールのベストプラクティス(その4)

こんにちは、 株式会社ジェネシックス の徐 廷(@TonnyXu)です。 iPhoneの共通モジュールのベストプラクティスに関してです。

文章が長くなりますので、5回に分けてお届けします。

今回は、4回目となります。

その1

■ 共通プロジェクトを作る

その2

■ コンシューマPJを作る

■ コンシューマPJで共通プロジェクトを引用

その3

■ 引用する後コンシューマPJでの必須設定

その4

■ コンシューマPJを実行する

その5

■ さらに

・ 共通プロジェクトに単体テストを追加

・ オープンソースライブラリを作る

 

 

■ コンシューマPJを実行する

まず、 CommonConsumerViewController.xib ファイルを開いて、下記のように、二つのラベルを追加します。


viewController.xib , adding 2 labels
図21:二つのラベルを追加

CommonConsumerViewController.h ファイルに赤いラベルのアウトレット属性を追加します。CommonConsumerViewController.h
//
// CommonConsumerViewController.h
// CommonConsumer
//
// Created by Tonny Xu on 10/05/26.
// Copyright genesix, Inc. 2010. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface CommonConsumerViewController : UIViewController {
UILabel *resultLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *resultLabel;

@end

注意 ヘッダーファイルに@propertyを追加したので、.mファイルに@synthesizeを追加することを忘れないでください。また、xibファイルにアウトレットとラベルの繋がりを忘れないでください。

次に、 CommonConsumerViewController.m- (void)viewDidLoad メソッドに下記のコードを追加してください。

// 下記のimportはファイルの一行目に追加してください。
#import "GCDevice.h"
// 中略...
- (void)viewDidLoad {
[super viewDidLoad];
if ([GCDevice isIPad]) {
resultLabel.text = @"Yes, it is an iPad.";
}else {
resultLabel.text = @"No, it's NOT an iPad.";
}
}

ここまで、共通モジュールの実装は完了しました。アプリケーションを実行してみましょう。


running on simulator.
図22:シミュレーターでの実行結果

Wow! やった!完成しました。これで、この isIPad メソッドはほかのプロジェクトでも使えるようになりました。

本文の最初に設定した目標の1−4はクリアです!

【詳細図解】iPhoneの共通モジュールのベストプラクティス(その3)

こんにちは、 株式会社ジェネシックス の徐 廷(@TonnyXu)です。 iPhoneの共通モジュールのベストプラクティスに関してです。

文章が長くなりますので、5回に分けてお届けします。

今回は、3回目となります。

その1

■ 共通プロジェクトを作る

その2

■ コンシューマPJを作る

■ コンシューマPJで共通プロジェクトを引用

その3

■ 引用後のコンシューマPJでの必須設定

その4

■ コンシューマPJを実行する

その5

■ さらに

・ 共通プロジェクトに単体テストを追加

・ オープンソースライブラリを作る

 

■ 引用後のコンシューマPJでの必須設定

必須となる設定は三つあります。
  1. 共通プロジェクトを利用するために、ヘッダーファイルの置き場所を指定。
  2. コンシューマPJをコンパイルする前に、まず共通モジュールをまずコンパイルするように設定。いわゆる依存関係を設定。
  3. コンシューマPJをリンクする時、共通モジュールをリンク。

まず、1番目の設定を行いましょう。プロジェクトのルートノードCommonConsumerをダブルクリックすると、下図の設定画面が出てきます。


setting 1 for consumer PJ, header search path.
図15:CommonConsumerのプロジェクト設定画面

図15画面上にある検索ボックスに"header"を入力してみましょう。絞り込んだ設定項目画面で Header Search Path項目の右にある空セルをダブルクリックして、"../Common"を入力してください。Recursivelyチェックボックスはそのままでかまいません。完了したら下図の画面と同じかどうかを確認してください。


setting 1, header path.
図16:Header Search Pathの値

図16に、相対Pathを記入しています。画面のOKを押して、次の設定へ行きましょう。

次はプロジェクトの依存関係を設定します。左側のTargetsノードをダブルクリックしてください。


setting 2 for consumer PJ, dependency project.
図17:Targetの設定画面(図15とほぼ同じ、ただし、少し違いがあります)

図17のGeneralタブを選択して、Direct Dependenciesの下にある「+」ボタンを押してください。下記の画面が出てきたら、Commonを選択してください。


setting 2 for consumer PJ, select dependency pj.
図18:依存先を選択

これで、コンパイルができるはずです。コンパイルすると、下図のような画面が出てきます。リストの一番上にCommonプロジェクトをコンパイルしたことが示されています。


setting 2 for consumer PJ, compile OK after adding dependency.
図19:依存関係を設定後、コンパイル結果画面

最後もう一つの設定が不可欠です。コンパイル後、共通モジュールをコンシューマPJにリンクします。コンシューマPJのCommonプロジェクトノードの下に表示される「libCommon.a」をドラッグして、「targets」の「CommonConsumer」の「Link Binary with Libraries」にドロップしてください。結果は下図の画面のようになります。


setting 3 for consumer PJ, adding link option and invoke common module
図20:共通モジュールのバイナリファイルをリンクする

ここまでで、コンシューマPJでの共通モジュールの設定が終わりました。続いて、コンシューマPJで共通モジュールのクラスを利用してみましょう。

記事検索
QRコード
QRコード