ディスクを取り出しできないときは Disk Utility を使うと...

MacSoft

Finder でディスクを取り出そうとするとそのディスクは使用中だと怒られて拒否されることがある。

そのダイアログには「1 つ以上のプログラム」とか書かれているだけで具体的に誰を終了すればいいのかわからずに困ってしまう。急いでいるときにこれが出ると悩ましいよね。

そんなときは Terminal で lsof コマンドを使って調べる方法があるけど、最近の macOS だと Disk Utility を使って取り出しすると教えてくれる可能性がある。

→ 続きを読む

NeXTSTEP のアイコンを描いた人 - Keith Ohlfs

MacSoft

Mojave で___がなくなって寂しい。個人的には Happy Mac がなくなったとき以来の寂しさだ1。なんだと思う?

正解は Grab。OS X 初期からいつだってユーティリティフォルダの中にいる。Mojave でついに Screenshot というアプリケーションに書き換えられてしまった。

え、そもそもキーボードショートカットを使うからどちらも必要ない? ...まあ自分もそうで起動することなんて滅多にないのだけど、当初から見た目も機能もほとんど変化していないこのアプリケーションには逆に貴重な歴史的遺産が含まれている。実のところ Grab は OS X 初期どころか NeXTSTEP 時代からの存在であり、その頃に描かれたアイコンをそのまま眺められる最後の生き残りだったのだ2

例えばこのカメラアイコン:

今になって見ると色数が少なく HiDPI 非対応、光源が左上で明らかに異質なのだけど、当時のほかの OS のアイコンと比較すると輪郭線が目立たず階調を増やして立体的に表現されていて重みすら感じられる。のちに登場する Mac OS 8 のプラチナアピアランスのアイコンよりもむしろ Mac OS X のリアルなアイコンと方向性が近いのではないだろうか。

今日はこのアイコンを描いた人の話。Flurry の記事(→ 2017.12.12)と同様に藤シローさんの maclalala を思い出しながら翻訳っぽいものを挟んでみる。

→ 続きを読む


  1. 起動音は昔から無効にしていたからそこまででもない。 ↩︎

  2. 隠された NSImage.Name とかシステムの奥深くのファイルを探ればまだあるかもしれないけど、一般ユーザに見える部分としての話。数少ない生き残りも Retina ディスプレイのために作り変えられて消えていった。 ↩︎

Swift の KeyPath を使った Binding

MacDev

Cocoa Bindings は Objective-C 時代にできたものだから String でプロパティのキーパスを指定するけど、 Swift 4 の KeyPath と Generics を組み合わせればすっきりしたコードで書けるのではないかと思いついたので実験。

protocol KeyPathBasedBinding {}
extension KeyPathBasedBinding
{
    /// When the returned object is deinited or invalidated, it will stop binding.
    /// - Parameter targetKeyPath: The KeyPath for target property. Target property must be observable through KVO.
    func bind<Value, Target>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, to targetKeyPath: KeyPath<Target, Value>, of target: Target) -> NSKeyValueObservation where Self: AnyObject, Target: _KeyValueCodingAndObserving
    {
        return target.observe(targetKeyPath, options: [.initial, .new], changeHandler: { [weak self] (sender, change) in
            self?[keyPath: keyPath] = target[keyPath: targetKeyPath]
        })
    }

    /// When the returned object is deinited or invalidated, it will stop binding.
    /// - Parameter targetKeyPath: The KeyPath for target property. Target property must be observable through KVO.
    func bind<Value, Target>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, to targetKeyPath: KeyPath<Target, Optional<Value>>, of target: Target, nullValue: Value) -> NSKeyValueObservation where Self: AnyObject, Target: _KeyValueCodingAndObserving
    {
        return target.observe(targetKeyPath, options: [.initial, .new], changeHandler: { [weak self] (sender, change) in
            self?[keyPath: keyPath] = (target[keyPath: targetKeyPath] ?? nullValue)
        })
    }
}
extension NSObject: KeyPathBasedBinding {}

Cocoa Bindings だと bind(_,to:,withKeyPath:,options) の第一引数には自身のプロパティのキーもしくは特別に用意された NSBindingName の定数を使用することができるけど、今回再現しているのは前者だけだ。

→ 続きを読む

NSVisualEffectView の角を丸くする 2 つの方法

MacDev

画面の端にぴったりくっつけることが多い iOS と違い、macOS だと余白を設けてビューを配置することが多い。そうすると角を丸くしたくなる。木工家具でやすりがけや面取りをするような基本的な話だ。

AppKit の標準コントロールのほとんどはそういう仕上げがしてあるから意識する必要はないのだけど、先日 NSVisualEffectView の角を丸くしたい状況があったのでやり方を考えてみた。

→ 続きを読む

NSAppearance.current の役割

MacDev

なぜか天気予報の全国図で一番気温が高い日が多く 39℃ が当然のように何日も続いていた名古屋にもやっと秋が来た1。秋といえば Apple プラットフォーム開発者が忙しい季節。例によって iOS 12 の話は置いておくとして、ここで取り上げる話題はもちろん macOS Mojave についてだ。

Mojave といえばやはり目玉はダークモード2。WWDC 2018 の関連セッションビデオを見ると NSColor に追加されたシステムカラーの説明に重きが置かれている。

ユーザがいつでもモードを変更できるためこれらのカラーはそれに応じてダイナミックに変化するようになっていて、例えば NSColor.controlBackgroundColor はダークモードで描画すると暗いグレー、そうでなければホワイトとして描画される。

でもどうやって判別しているのか。システム全体が非ダークモード(ライトモード?)であってもダークなウインドウを混ぜることができるし、ライトなウインドウの中に一部だけダークなビューを混ぜることもできてしまう。そのためシステムの設定を取得しても意味がない。

そこで使用されているのが NSAppearance にある current というクラスプロパティ。NSView は draw(_:) とか updateLayer() が呼び出される直前にこれをセットしているため NSColor のシステムカラーは描画相手のことを知らないのに自身の値を変化させることができているようだ。

→ 続きを読む


  1. あのイベントで一人だけ涼しい服装をしていたのは自分が季節感のない人間だからではないと強調しておく。 ↩︎

  2. 個人的にはアクセントカラーが選べるようになったことの方がうれしい。 ↩︎

見た目は変わらずとも

Site

2018 年にもなってホームページの見た目や内部実装をいじくりまわすのが趣味な人間です。

昨日“Mac 開発話が聴ける Podcast エピソードまとめ”を公開(→ 2018.9.8)したけど、それをきっかけとして Web サイト全体のシステムに手を入れたので変更点をメモとして残しておく。

ファイルを加工して表示 - HTML のように管理

Documents に新しいページ(前述のまとめ)を追加するにあたり、この作業を効率化したくなった。Markdown で書きたいし。

→ 続きを読む

“Mac 開発話が聴ける Podcast エピソードまとめ”を公開

MacDev

iOSDC に初参加した勢いで勝手に変なまとめを作ってしまった。

iOS の世界とは異なり、macOS のソフトウェアを開発する人は少ない。さらに Cocoa ネイティブ、国内に限定したら 100 人いるのか不安になるレベル。

そんな開発者がごくまれに Podcast や YouTube に登場して話をしていることがある。どれも滅多に聞けない貴重な内容であり、本当に必要としている人に届かないのはもったいない。

そこで、このページではそんなエピソードを発見次第登録していく。

音声メディアじゃないと発信されないような内容も多いので、少しでも興味がある人は聞かないともったいない!

© 2005-2019 zumuya