RealForce87UW

机の上が狭いし!とか思ってアマゾンでRealForce87UWを勢いで買ってしまい、到着したので速攻でMac miniに繋げたらば、右上にあるPrint Screen、NumLock、Pauseのキーがビミョーなことになってしまっていたので(しかもこのキーボードのウリのディップスイッチによる設定変更がうまく働いていない感じ)、KeyRemap4MacBook

<?xml version="1.0"?>
<root>
  <item>
    <name>For Realforce 87UW</name>
    <appendix>This setting is provided by private.xml</appendix>
    <item>
      <name>F13,F14,F15 to Volume Controls</name>
      <appendix>* PrintScreen to Volume Mute</appendix>
      <appendix>* NumLock/ScrollLock to Volume Down</appendix>
      <appendix>* Pause/Break to Volume Up</appendix>
      <identifier>private.realforce87uw_f13_f14_f15_to_volume_controls</identifier>
      <autogen>__KeyToKey__ KeyCode::F13, ConsumerKeyCode::VOLUME_MUTE</autogen>
      <autogen>__KeyToKey__ KeyCode::F14, ConsumerKeyCode::VOLUME_DOWN</autogen>
      <autogen>__KeyToKey__ KeyCode::F15, ConsumerKeyCode::VOLUME_UP</autogen>
      <autogen>__KeyToKey__ KeyCode::KEYPAD_CLEAR, ConsumerKeyCode::VOLUME_DOWN</autogen>
    </item>
  </item>
</root>

で音量関係に割り当てるべく設定ファイルを書いてみました。KeyRemap4MacBookで、”Misc & Uninstall”から”Open private.xml”ボタンを押して、private.xmlというファイルをviとかemacsとかの通なテキストエディタで書き換えて、”Change Key”で”ReloadXML”する感じです。

KeyRemap4MacBookの自由度がなかなか凄いですね。というか、東プレの英語キーボードが全滅状態で危機感を覚える私です。

iOS7の電卓

iOS 7.0.2の電卓を触っていて気がついたことなど。

電卓のそれぞれのボタンをタップすると、クリック音が鳴ってさらに押している間はボタンの背景が薄暗くなりますが、そのアクションが画面一番下に配置されている「0」「 .」「 =」のボタンの下半分をタップし続けたときだけ、なぜか一拍遅れます。

iOS 7の電卓で「0」をタップしている風景

画面の下端は、コントロールセンターを下端からのスワイプで表示するための、OSの特別な判定ゾーンなのかも知れません。

自作アプリで小さいボタンを画面の下端にうっかり置いてしまうと、表示の反応が悪いという報告が上がってきそうで嫌ですね。OSの仕様ですので!。鶴亀鶴亀。

NSImageにEXIFをつけてJPEGで保存

お正月からすっかり放置しておりました。放置している間にも色々とイベントが発生したりフラグが立ったり回収されたりしておりましたが、それはまたの機会に時期を逃しつつ情報漏洩していきたいと思います。

閑話休題。 MacでNSImageをJPEG形式で保存するときに、JPEGの圧縮率(画質)を指定しながら画像の回転方向(Tag ID 0112)を付加したいと思ってコードを書いたら、結構な七転八倒だったのでメモを残しておきますよ。

    NSImage *saveImage = 保存したい画像;

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];
    NSString *exifOriginalDate = [dateFormatter stringFromDate:[NSDate date]];
    NSNumber *exifOrientaion = [NSNumber numberWithInteger:1];
    NSNumber *jpegCompression = [NSNumber numberWithFloat:0.75];

    NSMutableDictionary *metaProperties = [NSMutableDictionary dictionary];
    NSMutableDictionary *tiffProperties = [NSMutableDictionary dictionary];
    NSMutableDictionary *exifProperties = [NSMutableDictionary dictionary];
    [metaProperties setObject:jpegCompression forKey:(NSString *)kCGImageDestinationLossyCompressionQuality];
    [metaProperties setObject:exifOrientaion forKey:(NSString *)kCGImagePropertyOrientation];
    [tiffProperties setObject:exifOrientaion forKey:(NSString *)kCGImagePropertyOrientation];
    [exifProperties setObject:exifOriginalDate forKey:(NSString *) kCGImagePropertyExifDateTimeOriginal];
    [exifProperties setObject:exifOriginalDate forKey:(NSString *) kCGImagePropertyExifDateTimeDigitized];
    [exifProperties setObject:@"Exif user comment" forKey:(NSString *)kCGImagePropertyExifUserComment];
    [metaProperties setObject:tiffProperties forKey:(NSString *)kCGImagePropertyTIFFDictionary];
    [metaProperties setObject:exifProperties forKey:(NSString *)kCGImagePropertyExifDictionary];

    NSMutableData *saveImageData = [[NSMutableData alloc] init];
    CGImageDestinationRef dest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(saveImageData), kUTTypeJPEG, 1, nil);
    CGImageRef recViewImageRef = [saveImage CGImageForProposedRect:nil context:nil hints:nil];
    CGImageDestinationAddImage(dest, recViewImageRef, (__bridge CFDictionaryRef)(metaProperties));
    CGImageDestinationFinalize(dest);

    NSString *path = @"~/Desktop/SavedImage.jpg";
    [saveImageData writeToFile:[path stringByExpandingTildeInPath] atomically:YES];

ARCは有効になっていることが前提です。

回転方向、なぜだかオプションの直下とオプションの下のTIFF情報にそれぞれ設定しないと、QuickLookとプレビューの表示に反映されない気がします。(もしかしたら気のせいかもしれません)

ついでにEXIFのタグ一覧を眺めていたら、むむ、Tag ID BC02 も回転方向に関する情報っぽいですね。使っているカメラとかアプリとかあるのだろうか。値の定義がタグ0112と互換が無いようですし。

そして話がややこしいことに、UIImageOrientationの定義がEXIFで定義されている値と互換が無いという…。