ヒレガス本 20章 課題

20章の課題は以下の2つ。

  1. BigLetterViewの文字にNSShadowを使って影を付ける。
  2. BigLetterViewのの文字にboldやitalicの効果を付けるチェックボックスをつける。

最初の課題は簡単です。メソッドprepareAttributesの末尾にNSShadowに関するコードを追加するだけ。

- (void) prepareAttributes
{
    .
    .
    .

    NSShadow* theShadow = [[NSShadow alloc] init];
    theShadow.shadowOffset = NSMakeSize(3.0, -3.0);

    self.attributes[NSShadowAttributeName] = theShadow;
}

二番目の課題も簡単。以下の手順で実装する。

  • BigLetterViewにboldやitalicのプロパティを追加
  • アクセッサメソッドで、attributesのNSFontAttributeNameキーの値を更新
  • UIはbindingで作成

ヘッダファイルの追加は2行だけ。

@interface BigLetterView : NSView
    .
    .
    .
@property (getter = isBold)   BOOL bold;
@property (getter = isItalic) BOOL italic;
    .
    .
@end

次に実装ファイルに、以下のようなアクセッサを追加。NSFontManagerの説明は、p373を見ればだいたい判る。

@synthesize bold = _bold;

- (void) setBold:(BOOL)inBold
{
    NSFont*        theFont = self.attributes[NSFontAttributeName];
    NSFontManager* theFontManager = [NSFontManager sharedFontManager];

    if( inBold )
    {
        theFont = [theFontManager convertFont:theFont
                                  toHaveTrait:NSBoldFontMask];
    }
    else
    {
        theFont = [theFontManager convertFont:theFont
                               toNotHaveTrait:NSBoldFontMask];
    }

    self.attributes[NSFontAttributeName]            = theFont;

    [self setNeedsDisplay:YES];
}

- (BOOL) isBold
{
    NSFontManager* theFontManager = [NSFontManager sharedFontManager];

    if( [theFontManager traitsOfFont:self.attributes[NSFontAttributeName]] & NSBoldFontMask )
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

italicのアクセッサの説明とコードは省略。

最後のUIの処理は文章では判りにくいので以下の図を参考にしてください。

NSObjectControllerを追加してcontentsにBigLetterViewを指定する。

../../../_images/controller.png

チェックボックスBoldとチェックボックスitalicをObjectController経由でBigLetterViewのboldとitalicにbindingする。

../../../_images/binding1.png

これで、チェックボックスに連動してbigLetterViewの表示が変わるようになります。

プロジェクトファイルは、 Typing_2.zip に置いておきます。

ヒレガス本 19章 課題

19章には課題は無い。無いので、自分で作る事にする。

作成した、アプリケーションTypingTutorに以下の2つの機能を追加する。

  1. BigLetterViewの矩形に入ったら、カーソルをIビームの形にする。
  2. BigLetterViewの矩形に入ったら、バックグラウンド色を変更する。

最初の課題は簡単です。NSViewにはカーソルを変更する時にオーバーライドするメソッドが用意されている。 以下のメソッドを追加すれば良い。

- (void) resetCursorRects
{
    [self addCursorRect:[self bounds]
                 cursor:[NSCursor IBeamCursor]];
}

二番目の課題もp339からのロールオーバーのコードをそのまま入れるだけ。

プロジェクトファイルは、 TypingTutorWithMouse.zip に置いておきます。

ターミナルでちょっとした文字列の暗号化と複号化

MacOSXでは暗号化と複号化の定番はopnesslコマンドです。

ターミナルで以下のようにする事で文字列の暗号化が出来る。暗号化する為のパスワードを聞いてくるので、適当に打ち込む事。

$ echo '暗号化したい文字列' | openssl enc -e -aes128 | base64

base64が必要な理由は、opnesslの出力がバイナリだから。base64を使うと暗号化後のデータが文字列になるので扱いやすい。

使い方は簡単。例えば、文字列「秘密にした大切な事」を暗号化するには、

$ echo '秘密にしたい大切な事' | openssl enc -e -aes128 | base64
enter aes-128-cbc encryption password: (パスワードを入力)
Verifying - enter aes-128-cbc encryption password: (もう一度パスワードを入力)
U2FsdGVkX18W0ERyPHnFu1rLkHnaytOC61ZDX2j+SIsYEXp4tuD5QTg0M5VvBVQS

と行えば良い。最後に出て来た”U2FsdGVk…….”が暗号化後の文字列。

複号化するには、ターミナルで以下のように打ち込めば良い。複号化の為のパスワードを聞いてくるので打ち込む事。

$ echo '暗号化した文字列' | base64 -D | openssl enc -d -aes128

先ほどの暗号化した文字列を複号化するには、以下のようにする。

$ echo 'U2FsdGVkX18W0ERyPHnFu1rLkHnaytOC61ZDX2j+SIsYEXp4tuD5QTg0M5VvBVQS' | base64 -D | openssl enc -d -aes128
enter aes-128-cbc decryption password: (パスワードを入力)
秘密にしたい大切な事

もちろん、暗号化した時に入力したパスワードを忘れたら元に戻せないので気をつける事。

mavericksにアップデートしたらgit-completionが行方不明になった

mavericksにアップデートしたら、ターミナルを立ち上げるたびに

-bash: /usr/share/git-core/git-completion.bash: No such file or directory

とエラーを吐かれる。

git-completion.bashの位置が変わったようだ。findで調べると、

/Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash

/Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

の2カ所に見つかった。

.bash_profilの

# git setting
source /usr/share/git-core/git-completion.bash

# git setting
source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

と書き換える。

エラーも止まり、補完も効くようになり解決。