SimpleBoxes

iPhone/iPad アプリケーション FloatyMemo+ をリリースしました

iPhone/iPad ユニバーサルアプリケーション FloatyMemo+ が公開されました→FloatyMemo+ on iTunes Store (350円)。

[画像] FloatyMemo+ スクリーンショット

FloatyMemo+ は先日公開した FloatyMemo の高機能バージョンになります。

  • 背景画像の変更
  • メモの整列
  • メモの検索
  • メール送信・テキスト書き出し

などの機能が追加されています。

「メモの整列」は画面上に散らばったメモを綺麗に整頓する機能です。

[画像] FloatyMemo+ メモ整列スクリーンショット

どのような順番で整頓させるかは設定画面で設定できます。整列させた場合、画面上の全てのメモは最小化された状態になります。

「メモの検索」は入力されたキーワードにマッチしたメモをハイライト表示する機能です。

[画像] FloatyMemo+ メモ検索スクリーンショット

マッチしたメモだけがアクティブになります。メイン画面だけでなく、ゴミ箱内でも検索が可能です。標準の「メール」アプリケーションのように先頭行の検索バーを引き出すと、検索キーワードを入力することができます。

FloatyMemo からのフィードバックでアニメーションが重いというご意見がありました。

今回公開した FloatyMemo+ はそれらのフィードバックを頂く前に申請していたもので、まだ反映できていません。現在申請中の ver 1.01 ではその辺に関して若干の改善を行っています。

FloatyMemo の公開から日が空いてしまいましたが、実は FloatyMemo+ は一度リジェクトされています。

iPad で動作させたとき、二つの Popover が同時に開かれてしまう場面があり、それがリジェクト理由でした。

スクリーンショットも添付されていて、「ちゃんと iPad ヒューマンインタフェースガイドライン」読んでねと。……すんません、ざっくりとしか読んでいませんでした。

そんな訳で FloatyMemo 共々 FloatyMemo+ もよろしくお願いします。使っていただいた感想やご意見お待ちしています。

スポンサーリンク

iPhone/iPad アプリケーション FloatyMemo をリリースしました

iPhone/iPad ユニバーサルアプリケーション FloatyMemo が公開されました→FloatyMemo on iTunes Store

[画像] FloatyMemo メイン画面スクリーンショット

FloatyMemoは iPhone/iPad 向けに開発されたシンプルなメモアプリケーションです。いわゆる「付箋メモ」アプリケーションで、作成したメモを画面上の好きな位置に「置く」ことができます。

縦画面・横画面どちらの画面モードでも動作します。マルチタッチを活かしてピンチ・回転ジェスチャーでメモのサイズを自由に微調整することができます。

先日リリースされた ATOK pad との連携もサポートしています。設定画面において「連携強化」をオンにすると、メモ編集に常時 ATOK pad を利用するようになります。

検索やメモの整頓などの追加機能のある有償版 FloatyMemo+ も近日公開予定です。

Re: 初めてiPhoneアプリを作る人が使いたがる機能」でも触れましたが、初めてのアプリらしく (?)、ピッカーを使っています。

[画像] FloatyMemo 編集画面スクリーンショット

使い勝手……悪くなったかな?おそらく iPad だと占有面積が大きすぎますね。

FloatyMemo では、利用している nib ファイルは全て iPhone/iPad で共通です。コード内で「iPad なら PopOver を利用する」というような分岐はいくつかの場面で行っていますが、思った以上にほとんどコードは共用できました。

現在 iPad を所有していないので、iPhone のみ対応のつもりで開発はじめたんですが、試しに iPad 向けにビルドしてみたら、何となく動作してしまったので、そのままユニバーサルアプリケーションとしてリリースしています。

編集画面にはモーダルビューを利用しています。メモの拡大アニメーションをさせるので、最初はモーダルビューの表示にアニメーションは利用しないつもりだったんですが、横画面でのビューがずれるという Cocoa Touch のバグ (?) のため、フェードインアニメーションでちょっと妥協。思ったよりも自然なので、結果オーライかな。

というわけで、初めての iPhone/iPad アプリケーション FloatyMemo をよろしくお願いします。使っていただいた感想やご意見お待ちしています。

スポンサーリンク

Objective-C で使っているマクロと Objective-C++ を Xcode で利用するときの副作用

ARRAY マクロ

小さな行列オブジェクトをよく利用するとき、

#define ARRAY(first, ...) [NSArray arrayWithObjects: first, ##__VA_ARGS__ , nil]

のようなマクロを定義しておくと便利かも。

NSArray* array = ARRAY(@"Value1",@"Value2");

のように使います。最後の要素後「nil」はいりません。

問題点は途中に改行を含めることができないこと。一行で全ての要素を定義する必要があります。

マクロといえば、

#define ApplicationName \
[[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]

#define DocumentDirectory \
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

#define SupportDirectory \
[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject]

#define currentOrientation \
[UIApplication sharedApplication].statusBarOrientation

あたりは定義しておくと便利かも。Objective-C はクラス名やメソッド名が長いのが多い……。

Objective-C++ を Xcode で利用したとき

Objective-C で C++ と併用する場合、Objective-C++ を使います。一般的な拡張子は .mm 。

Xcode 3.* で Objective-C++ を利用する場合 (Xcode 4.* では未確認)、ちょっとした副作用があります。

Xcode にはリファクタリング機能があります。クラス名を変更したい時やメンバー変数を変更したい時に該当箇所をほぼ自動で検索・置換してくれる機能です。クラス名を変更したときは必要に応じてファイル名も変更してくれたり……。

なかなか便利な機能ですが、これが Objective-C++ だと動作してくれません。

そんな時は一時的に Objective-C++ のファイルを Objective-C として認識させるのが有効です。

Xcode のプロジェクトに追加されたファイルは、ファイルの拡張子とは独立した形で、ファイルタイプが保持されています。

ファイルを選択して、コンテクストメニューを開いて、General タブにその設定 (File Type) があります。

私は Xcode は英語で利用するようにしているため、日本語版での名称が分かりません。General タブは「一般」タブで、File Type は「ファイルタイプ」でしょうか。

これが

sourcecode.cpp.objcpp

のようになっていると、そのファイルは Objective-C++ の実装ファイルとして設定されていることになります。

これを

sourcecode.c.objc

のように変更すると、Objective-C として認識されるようになります。

ビルド前に戻すことを忘れないようにしてください。そうしないと、Objective-C++ のファイルが Objective-C としてコンパイルされてしまうので、エラーになってしまう場合があります。

スポンサーリンク

Re: 初めてiPhoneアプリを作る人が使いたがる機能

HMDT の木下さん曰く

初めてiPhoneアプリを作る人が使いたがる3つの機能:

  • シェイク
  • フリック入力
  • ピッカーコントローラ(時計アプリとかで使われている、ドラムみたないやつ)

どれも癖があって、これを組み込んで使いやすいユーザインタフェースを作るのは難しいんだけど、みんなやりたがる。使いにくくなるからやめとけって。

[→September 2010 | HMDT Journal]

あぁ、あるあるある……。

とても分かるような気がします。他にも……

  • ピンチ
  • ローテーション (マルチタッチの回転ジェスチャー)

がありませんか?ないですか?ありますよね?多分。

シェイクは、普段ほとんど使わないので、意識しませんでした。フリックは……断念。

[余談] HMDT Journal、RSS 配信して欲しい……シイラでサポートしているので、いずれ RSS 配信してくれると思っていたんですが……。

スポンサーリンク

ブロックを使ったアニメーション処理 (iPhone/iPad, Objective-C 2.0)

iOS4 から UIView クラスにある

+ (void)animateWithDuration:animations:

というクラスメソッドを使ってアニメーション処理を行うことができます。

従来の

+ (void)beginAnimations:context:
+ (void)commitAnimations

などの一連のアニメーション関連のクラスメソッドも引き続きサポートされていますが、discouraged (非推奨) になっています。

animateWithDuration:animations: によるアニメーション処理の特徴的なところは、ブロックと呼ばれるクロージャ機構を利用しているところです。

従来のように終了処理セレクタを用意することなく、アニメーション処理を記述できるので、一般的にコードはより簡潔になります。

例えば、以下のようなアニメーション処理をするコードがあるとします。

- (void)doAnimation
{
  self.alpha = 0.1f;
  self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
  [UIView beginAnimations:nil context:nil];
  [UIView setAnimationDelegate:self];
  [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
  [UIView setAnimationDuration:0.3f];
  self.alpha = 1.0f;
  self.transform = CGAffineTransformMakeScale(1.2f, 1.2f);
  [UIView commitAnimations];
}

- (void)animationFinished:(NSString *)animationID  finished:(BOOL)finished  context:(void *)context
{
  self.transform = CGAffineTransformIdentity;
}

終了処理用のセレクタ animationFinished:finished:context: が必要になっています。また、beginAnimations:context: から始まって 5 つのクラスメソッドを呼んでいるのも分かると思います。

一方、新しいブロックを利用したアニメーション処理では、

- (void)doAnimation
{
  self.alpha = 0.1f;
  self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
  [UIView animateWithDuration:0.3f
                   animations:^{
                     self.alpha = 1.0f;
                     self.transform = CGAffineTransformMakeScale(1.2f, 1.2f);
                   }
                   completion:^(BOOL finished){
                     self.transform = CGAffineTransformIdentity;
                   }];
}

のようになります。

行数的にはそれほど大きな変化はありませんが、利用しているメソッドはひとつだけ。アニメーションとして処理される部分も animations: という引数にまとまっているので、分かりやすくなっています。また、アニメーション終了処理用セレクタも必要ありません。

ブロックを利用したアニメーション処理は、簡潔ですし、なにより分かりやすくなっています。しかしながら、iPhoneOS 3.2 では利用できません。そのため、iPad 向けには今のところ旧来の方式を記述するしかないようです。

でも、一度ブロックを利用した記述に慣れてしまうと、もはや旧来の方式で記述するのは苦痛。同じ動作をプラットフォーム毎に別の記述するのも面倒です。

そこで同じ記述でどちらも動作するコードを考えてみます。方針としては、ブロックを利用したアニメーション処理を iPhoneOS 3.2 でも利用できるようにするのが目標です。

アニメーション処理を行うクラス SBAnimator を作ります。

#import <UIKit/UIKit.h>

@interface SBAnimator : NSObject

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations;

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion;

+ (void)animateWithDuration:(NSTimeInterval)duration
                      delay:(NSTimeInterval)delay
                    options:(NSUInteger)options
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion;

@end

最初の二つのメソッド animateWithDuration:animations:animateWithDuration:animations:completion: は引数を省略したショートカットバージョンです。

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
{
  [SBAnimator animateWithDuration:duration
                            delay:0.f
                          options:UIViewAnimationOptionTransitionNone | UIViewAnimationOptionCurveEaseInOut
                       animations:animations
                       completion:nil];
}

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion
{
  [SBAnimator animateWithDuration:duration
                            delay:0.f
                          options:UIViewAnimationOptionTransitionNone | UIViewAnimationOptionCurveEaseInOut
                       animations:animations
                       completion:completion];
}

実質的には最後のものだけを実装します。

+ (void)animateWithDuration:(NSTimeInterval)duration
                      delay:(NSTimeInterval)delay
                    options:(NSUInteger)options
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion
{
  [UIView beginAnimations:nil
                  context:UIGraphicsGetCurrentContext()];
  if (completion)
  {
    [[[SBAnimationHandler alloc] initWithCompletionAction:completion] autorelease];
  }
  [UIView setAnimationCurve:(options >> 16) & 0x7];
  [UIView setAnimationRepeatAutoreverses:options & UIViewAnimationOptionAutoreverse];
  [UIView setAnimationDelay:delay];
  [UIView setAnimationDuration:duration];
  animations();
  [UIView commitAnimations];
}

ご覧の通り、内部では旧来の方法を利用しています。今のところ、旧来の方式は iOS4 でも利用できるので、これでどちらの環境でも動作します。

基本的には引数として渡された completion ブロックを遅延動作することさえできればいいわけで、それを実現するために SBAnimationHandler というプライベートなクラスを使います。

@interface SBAnimationHandler : NSObject
{
@private
  void (^_completionAction)(BOOL finished);
}

- (id)initWithCompletionAction:(void (^)(BOOL finished))completion;

@end

@implementation SBAnimationHandler

- (id)initWithCompletionAction:(void (^)(BOOL finished))completion
{
  if (self = [super init])
  {
    _completionAction = Block_copy(completion);
    [UIView setAnimationDelegate:[self retain]];
    [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
  }
  return self;
}

- (void)animationFinished:(NSString *)animationID 
                 finished:(BOOL)finished 
                  context:(void *)context
{
  _completionAction(finished);
  [self release];
}

- (void)dealloc
{
  Block_release(_completionAction);
  [super dealloc];
}

@end

SBAnimationHandler 側でアニメーション終了処理用のセレクタを定義しているので、呼び出し側には追加のセレクタは必要ありません。

終了処理セレクタでは、単純に保持していたブロックを実行しているだけ。若干特殊な部分があるとすれば、アニメーション終了処理を実行したら、SBAnimationHandler のインスタンスは必要ないので、[self release]; をコールして、自己破棄しているところぐらいでしょうか。

ブロックはスコープを抜けると破棄されていまうので、_completionAction = Block_copy(completion); で保持するようにしています。

リファレンスカウンタの絡みで [UIView setAnimationDelegate:[self retain]]; と若干ハック的なことをしていますが、あまり突っ込まないでください。

これによって iPhoneOS 3.2 だろうと iOS4 だろうと、どちらも

- (void)doAnimation
{
  self.alpha = 0.1f;
  self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
  [SBAnimator animateWithDuration:0.3f
                       animations:^{
                         self.alpha = 1.0f;
                         self.transform = CGAffineTransformMakeScale(1.2f, 1.2f);
                       }
                       completion:^(BOOL finished){
                         self.transform = CGAffineTransformIdentity;
                       }];
}

のように記述できます。

とりあえず、iPad シミュレータと iPhone シミュレータでのみ動作確認をしています。私の環境では確認していませんが、PLBlocks を利用すれば iPhoneOS 2.2 からでも利用できるようになるんじゃないでしょうか。

今回作成したコードは、アーカイブとして置いてあります。

コード SBAnimtor をダウンロード

スポンサーリンク

Safari on iPhone 対応に関するメモ

Serene Bach 3.00b027 から iPhone/iPod touch 用の Safari 向け管理画面インターフェースをサポートしました。

Android のブラウザも対応したつもりでしたが、先程エミュレータで確認したら、認識されていませんでした。近日中に修正する予定。

iPhone/Android で採用されているブラウザエンジンは Mobile WebKit (Mobile Safari) と呼ばれるもので、WebKit のサブセットになっているようです。

デスクトップ版 Safari と Mobile Safari で挙動が違うことは知られている通り。JavaScript ではマウスイベントハンドラ、実行時間の制限などがあり、読み込める画像のファイルサイズに制限があったりします。

ここでは Windows 版・Mac OS X 版の Safari をデスクトップ版 Safari と呼んでいます。

今回、Serene Bach 3.00b027 開発中に気づいた細かーーい挙動の差異をメモ。

head 要素内で document.write は使えないっぽい

document.write 自体は使える様子ですが、実行場所を選ぶようです。

詳細は検証していないのですが、とりあえず head 要素内に置かれた scriptdocument.write は実行できないようでした。

どうしてそんな場所で document.write を実行しているのかというと、外部 js から別の js ファイルをロードするため。head 要素内に DOM で appendChild する方法もあって、個人的にはこっちの方がしっくりするんですが、やや古い Safari で動作しなかったという経緯があり、document.write を使っていました。

td 要素 (多分 th 要素も) の display スタイルを変更できないっぽい

これも詳細は検証していませんが、例えば、以下のようなスタイル……

table#specific > tbody > tr > td {
  display: block;
}

は動作しませんでした。

ある特定の項をブロック要素として動作させたい意図があったのですが、動作しませんでした。デスクトップ版 Safari では動作するので、Mobile Safari の特徴の様子です。perl スクリプト本体の方は変更なしでいけるかとも思ったのですが、この仕様 (?) のため、ダメでした。

contenteditable は利用できない

Preparing Your Web Content for iPad: Technical Note TN2262: Preparing Your Web Content for iPad でも触れられていますが、contenteditable は利用できないようです。

おそらく designMode もダメでしょう。とりあえず、Serene Bach 3 で利用されているカスタム CodePress は利用できませんでした。

スポンサーリンク

Lightbox plus を使ったスライドショー

  • 2010.06.16 Wednesday
  • dev

toybox で公開している Lightbox Plus ですが、スライドショーは実現できないか?という質問があったので、適当に見つくろってみました。折角なので、公開します。

内容としては、タイマーで次から次へと画像を表示するだけの処理で特に難しい内容ではありません。

公開しているサンプルスクリプト lightbox_plus.js では、末尾で


Spica.Event.run(function() { 
  var lightbox = new Lightbox({
    // ... 省略 ...
  });
});

のようにして Lightbox オブジェクトのインスタンス lightbox を生成しています。この変数 lightbox はローカル変数なので、ブロック外部では参照できません。

スライドショーを実現するために生成したインスタンスにアクセスできるよう、lightbox をグローバル変数にします。

面倒なので、グローバル変数にしましたが、スライドショーを実現するオブジェクトを作って、その中で Lightbox のインスタンスを保持するという方法がおそらくスマートでしょう。

あとは生成したインスタンスに対して、タイマーを使って画像を順に表示していけば良いだけです。

とりあえず、途中で止めるなどの処理は考えず、ページ内の全ての Lightbox 対象の画像を表示したらスライドショーを終わらせるという方針で作成してみます。

サンプルスクリプト lightbox_plus.js の末尾を削除して、代わりに Lightbox を設置する html の末尾に以下のような記述を追加します。


<script type="text/javascript">
var lightbox = new Lightbox({
  // ... 省略 ...
});
var slideCount = 0;
function runSlideShow()
{
  var num = lightbox._open + 1;
  if (num >= lightbox._imgs.length) num = 0;
  if ( slideCount < lightbox._imgs.length )
  {
    if ( slideCount == 0 )
    {
      lightbox._show(num);
    }
    else
    {
      lightbox._close_box();
      lightbox._show(num);
    }
    slideCount++;
    window.setTimeout( function(){ runSlideShow(); }, 5000 );
  }
  else
  {
    lightbox._close();
  }
}
</script>
<div><a href="#" onclick="slideCount = 0; runSlideShow(); return false;">play</a></div>

Lightbox の _show メソッドは画像のインデックスを引数に取ります。有効な数値は 0 から _imgs.length の間です。Lightbox の対象となる画像は _imgs に配列として保持されているので、その length を取れば有効引数の範囲がわかります。

Lightbox オブジェクトの _open 変数は現在開いている、あるいは最後に開いた画像のインデックスです。これを +1 することで次の画像のインデックスを特定できます。初期値は -1 なので、仮にまだ開いていなくても +1 することで 0 になり、問題ありません。

グローバル変数 slideCount はスライドショーで開いた画像の数になります。これが Lightbox 対象の画像点数に達するまでタイマーで順に次の画像を開くようにしています。

今回作成したサンプルはアーカイブとして置いてあります。

「Lightbox plus スライドショー」をダウンロード


    window.setTimeout( function(){ runSlideShow(); }, 5000 );

およそ 5 秒で次の画像を表示するようにしていますが、表示の終了から 5 秒ではなく、_show メソッドをコールしてから 5 秒なので、短すぎるかもしれません。きちんと作るなら、ここは表示し終わってからタイマーを開始すべきです。

スポンサーリンク

solipo 0.09

  • 2010.02.07 Sunday
  • dev

solipo ver 0.09 を公開しています。→ [solipo 紹介ページ]

solipo は、Windows 上で動作する polipo の GUI ラッパーアプリケーションです。

「solipo」をダウンロード

solipo 0.09 では、以下の仕様変更・バグ修正を行いました。

  • polipo から forbidden / uncachable が読み込まれないバグを修正しました。
  • ランタイムがない環境で、solipo が起動しないバグを修正しました。
  • デフォルトのプロセス監視間隔をおおよそ 30 秒に短縮しました。

古いバージョンの solipo からは、 solipo.exe と polipo.exe を差し替えることでバージョンアップできます。

これまでの関連記事

スポンサーリンク

solipo 0.08

  • 2010.02.06 Saturday
  • dev

solipo ver 0.08 を公開しています。→ [solipo 紹介ページ]

solipo は、Windows 上で動作する polipo の GUI ラッパーアプリケーションです。

「solipo」をダウンロード

solipo 0.08 では、先日リリースされた polipo 1.0.4.1 を同梱しています。

solipo 0.07 に付属していた polipo 1.0.5 はプレリリース版ということもあり、動作がやや不安定でしたが、polipo 1.0.4.1 は 1.0.4 からのマイナーフィックス版で動作が安定していると思います。

また、バックグランドで動作している polipo が落ちていないかどうかを solipo 側から監視する機能を追加しています。

定期的に polipo が落ちていないかどうかをチェックして、落ちていたら、自動的に再起動します。

古いバージョンの solipo からは、 solipo.exe と polipo.exe を差し替えることでバージョンアップできます。

これまでの関連記事

スポンサーリンク

Re: Macの基本操作、日本語入力、Tips編

  • 2010.01.05 Tuesday
  • dev

明けましておめでとうございます。

昨年は案の定、後半になって更新頻度ががた落ちしました。今年もマイペースでいこうと思っています。よろしくお願いします。

さて。

最近になって、Windows から Mac OS X に移行したという AppBank さんの記事に少し突っ込み。

とりあえずFirefoxをインストールする。ダウンロードしてアプリケーションフォルダにドラック&ドロップ。終わり。exeファイルを叩いて、インストーラーが立ち上がって・・・って言う流れじゃないので最初は違和感。インストールはドラッグするだけなのだ!

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

最近はパッケージインストーラを利用するアプリケーションも多いです。Windows でも「インストールはドラッグするだけ」なアプリケーションは結構あると思います。

Finderの環境設定>詳細にて、拡張子の表示にチェック。macは拡張子ないけど、Windows人間としては拡張子がないとやっぱりなんだかいや。

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

私は Windows では拡張子の表示がないと嫌なんですが、Mac OS X では拡張子の表示がなくても、拡張子を表示するオプションをファイル毎に設定できますし、Windows などの他の環境からコピーしたりしたファイルは基本的に拡張子が表示された状態になっているので、ほとんど気になりません。

[余談]

以前の Mac OS X では Finder の「拡張子の表示」設定に副作用があって、それ以来、拡張子設定は基本 off で使用しています。

ちなみに Mac OS X の Finder で実際見える内容と OS 側で実際に保存されているもの (実体) が異なるケースが結構あるので、ご注意ください。例えば、ほとんどのアプリケーションは「.app」という拡張子がついていたりしますが、実体はフォルダだったりします。これらはパッケージと呼ばれ、Finder 上ではファイルのように見えます。

Windows と Mac OS X でフォルダのコピー・移動で、動作に違いがありますが、これはおそらくパッケージを正しく扱うための仕様だと個人的に認識しています。

Mac OS X の Finder では、ホームディレクトリのデフォルトフォルダ (例えば「書類」「ダウンロード」「ライブラリ」……) などある特定のフォルダは使用言語に応じて表示が切り替わります。

これは基本的に表示だけを切り替えていて、実体は「Documents」「Download」「Library」……という英語名で変わることがありません。

通常「Documents」というディレクトリを作っても翻訳されたりはしませんが、「.localized」のファイルを含む特定のフォルダは、使用言語に応じて表示が切り替わるようになっています。ここら辺の仕様は以前はややバギーでしたが、Mac OS X 10.5 以降は安定して動作している印象です。

Windows XP では、そもそも OS の GUI 表示言語の切り替えができませんが、Windows Vista / Windows 7 では可能になったはずです。ここら辺の動作はどうなのか少し気になっていたりします。

[余談ここまで]

テキストファイルとかで閉じる際に、保存しない、キャンセル、保存、と選択肢が出ますが、保存しないにフォーカスがあたっててもenter押せば保存してしまいます。保存しないにフォーカスがあたっているときで、素直に保存しないで終了したい時はスペースキーを押すと保存しないで閉じることができます。キャンセルはesc。

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

「保存しない (Don't Save)」のショートカットは「command + D」(もしくは単に「D」) です。これは以前の MacOS から慣例的に……。それ以外にも案外知られていないような気がする Mac OS X のキーボードショートカットがあります。

あと、文字入力中にdeleteボタンはwindowsで言うバックスペース。普通にdeleteしたい時は、fn+deleteで削除できます

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

MacBook やリモートキーボードだとその操作です。純正フルキーボードだと別に「Delete」キーがあります (fn キーがありません)。

アプリケーションのウィンドウを閉じるのは、command+w。アプリケーション自体を終了させるのはcommand+Q

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

Windows でも ctrl+w / ctrl+q のショートカットがアプリケーションによって利用できたりします。Windows の標準 (?) ショートカット alt + F4 は最初戸惑いました。

ブラウザで、command+LでURLの部分にフォーカス。地味に便利。

【Macの基本操作、日本語入力、Tips編】Windows→Macでやったことまとめ。

Windows でも ctrl + l は主要なブラウザの標準的なショートカットのような気がします。Internet Explorer でも利用できます。

Finderでファイルを開くときは、enterだとリネームになってしまって開けない。command+oで開ける。また、ファイルを削除したい時はdeleteボタンだけだと削除できない。command+deleteで削除できる。ここが一番大きな違いかと。説明されないとわかんないよね。

【補足編、FinderとExplorerとか】Windows利用者のためにMacユーザーが気をつけること。

これは昔からの MacOS からの慣例的な部分もあるので「慣れ」になるでしょうか。一応、これらのキーボードショートカットは「ファイル」メニューを見れば、一目で分かるようにはなっています。

逆にWindows の Explorer だと「enter キーで開いて、delete キーでゴミ箱に移動する」のは特に説明がないような……。Windows の Explorer では「shift + delete」で選択項目の削除 (ゴミ箱に移動しない) ですが、これを説明なしに分かる人は少ないと思います。

スポンサーリンク

4/13