ラベル Lion の投稿を表示しています。 すべての投稿を表示
ラベル Lion の投稿を表示しています。 すべての投稿を表示

2011/11/22

iTunes: MacRuby で重複する曲を削除

先日
MacRuby で iTunes から重複する曲を削除するものを作りました。
https://gist.github.com/1382271
(OS X 10.7.2 限定)

-- 参考にさせていただいたサイト

# ファイルを移動させる際の条件など大変参考になりましたし、
# MacRuby についての情報もいろいろありました。
iTunesに重複登録されている音楽ファイルを削除する - Watsonのメモ

# iTunes.app に下記のような機能があったことをこれまで知りませんでした。
iTunes ライブラリで重複した項目を検索し、削除する方法

-- 当初、最も悩んだこと

track.delete
を実行すると なぜか MacRuby がクラッシュしました。
MacRuby バージョンは

% macruby -v
MacRuby 0.11 (ruby 1.9.2) [universal-darwin11.0, x86_64]


重複する曲が 20 個以上あるとき
playlist.tracks の曲を each でまわし一定の条件を満たしたタイミングで
track.delete するとクラッシュしました。
こんな感じ。

myplaylist.tracks.each{|x|
  if ...
  # x がなにかの条件をみたしたら
  x.delete
  # この瞬間にクラーッシュ!
}


それで、オブジェクトを探ってみることに...

test.rb

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
a = i.sources[0].userPlaylists.find{|x| x.name ==  "ミュージック"}.tracks
p b = a[0]
p c = a[0]
p b.equal?(c)

#=>

% macruby test.rb
false

なんと false がかえってきました。
b, c は object としてはイコールでは『ない』とのこと。
a は1度しか定義していないにもかかわらず...。

例えば、Ruby 1.9 では

a = ["a","b","c"]
b = a[0]
c = a[0]
p b.equal?(c)

#=>

% ruby193 -v aaa.rb
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]
true

true がかえってきます。

MacRuby のこの件について理解できておりませんが、ともかく
この事が原因でクラッシュをひきおこしているのかも? と考え
一意の曲オブジェクトを「確実」に指名する方法をとることにしました。
要は

track.databaseID

を使うことにしました。

こんな感じです。

条件をみたした 曲オブジェクトの databaseID を hash に溜め込んでから、
hash を each でまわしつつ
その都度 fileTracks から 指定した databaseID に基づいて曲オブジェクトを検索し
検出できたら
.delete
を実行...

      @h.each{|k,v|
        t = @filetracks.find{|x| x.databaseID == k}
        next unless t
        t.delete
      }


このようにしてみたところ .delete を実行しても
クラッシュしなくなりました。
# あくまでも私の環境下においてでは!です。

# ちなみに .fileTracks と .tracks の 2 種類ありますが
# 上記では .fileTracks を対象にしています。

2011/11/12

Tutorial MacRuby

Tutorial: OS X automation with MacRuby and the Scripting Bridge

One more for the road

以降にある iTunes のサンプルを実行すると

... `<main>': undefined method `playlists' for nil:NilClass (NoMethodError)


playlists がない?
なーんてことはなくて単に日本語システムだからだった。
要素名を日本語に変えればよいのだった。

...
  .find {|s| s.name == "ライブラリ"}
  .playlists.find {|p| p.name == "トップ 25"} #Top 25 Most Played"}
...


この内容を理解する為、基本的な AppleScript を動かす。

 tell application "iTunes"
  repeat with i in playlists
    if name of i is "ミュージック" then
      get tracks
    end if
  end repeat
end tell

AppleScript Editor.app のイベントログで
playlists の要素や tracks の属性を確認できた。
sources にアクセスしなくても、playlists を獲得できた。

MacRuby でも playlists 要素を目視したい為...

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
i.sources.select{|x|
  x.playlists.each{|y|
    puts y.name
    if y.name ==  "トップ 25" # "トップレート", "ミュージック"
      songs = y.tracks.sort{|t1,t2| t2.playedCount <=> t1.playedCount}
      # songs[0..2].map{|t| puts "#{t.artist} - #{t.name} (#{t.playedCount})"}
    end
  }
}

puts y.name でプレイリスト名一覧を確認できた。

ライブラリ
ミュージック
ムービー
テレビ番組
Podcast
iTunes U
ブック
iTunes DJ
90 年代ミュージック
クラシック音楽
トップ 25
トップレート
ミュージックビデオ
最近再生した項目
最近追加した項目
ラジオ


書き換えながらいろいろ試す。

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
ary = i.sources.map{|x| x.playlists}.flatten
top25 = ary.find{|i| i.name == "トップ 25"}
songs = top25.tracks.sort{|t1,t2| t2.playedCount <=> t1.playedCount}
songs.find_all{|t| t.rating > 2}.map{|t| puts "#{t.artist} - #{t.name} (#{t.playedCount})"}


Ruby らしい(つもりの)書き方へ。

framework "ScriptingBridge"

class MyiTunes
  def initialize(str)
    exit if (str.empty? or str.nil?)
    @str = str
    # iTunes Object
    i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
    # playlist Object
    @ary = i.sources.map{|x| x.playlists}.flatten
    @songs = @ary.find{|i| i.name == @str}.tracks
  end

  def debug
    @ary.each{|x| puts x.name}
  end

  def view
    print "-- #{@str}\n"
    find_all
    count_sort
    to_s
  end

  private
  def count_sort
    @songs = @songs.sort {|t1,t2| t2.playedCount <=> t1.playedCount}
  end

  def find_all
    @songs = @songs.find_all{|t| t.rating > 60}
  end

  def to_s
    @songs.each_with_index{|x,n|
      break if n > 2
      puts "#{x.artist} - #{x.name} (#{x.playedCount}) [#{x.rating}]"
    }
  end
end

MyiTunes.new("トップ 25").view
# MyiTunes.new("トップ 25").debug

実行結果

-- トップ 25
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Aria (5) [100]
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Var. 7 (5) [60]
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Var. 5 (4) [80]
% 


MyiTunes クラスは
"トップ25" から、
星が3つ以上の曲を抽出し、
再生回数順にソートし
3行出力したら終わる。

.rating
に注意を払っていなかった。
puts 表示させてよくみてみると
星が 5つだと 100で、
星が 4つだと 80 で、
星が 3つだと 60 に、
なっていた。
星が3つ以上( > 60 )に変えた。
# t.rating > 60

iTunes.app 環境設定で表示する項目を減らして
MyiTunes.new("トップ 25").debug
を実行すると...正しく捕獲できた。

ライブラリ
ミュージック
ブック
90 年代ミュージック
クラシック音楽
トップ 25
トップレート
ミュージックビデオ
最近再生した項目
最近追加した項目
% 

MyiTunes.new("ミュージック")
でも OK だった。

-- 追記
OS X 10.7.2 で自力で MacRuby をインストールしていない為
/System/Library/PrivateFrameworks/MacRuby.framework/Versions/A/usr/bin/macruby
を使った。

最後に、~/Library/Logs/CrashReporter で
MacRuby がクラッシュしていないかみてみたが
大丈夫だった。

[2011-11-12]
最短?

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
top25 = i.sources.flat_map{|x| x.playlists}.find{|t| t.name == "トップ 25"}
p top25.name
songs = top25.tracks
p songs.size
=>
"トップ 25"
25


[2011-11-22]
続き

2011/11/08

OS X 10.7.2: Mobile Processes

Lion になって新しく登場したプロセスにはどのようなものがあるだろうか?と

$ sudo launchctl list

を眺めつつ
% man xxx
しつつ

ふと

% apropos Mobile

を試してみたら...

mdmclient(1)             - MDM (Mobile Device Management) client
mtmd(8)                  - Mobile Time Machine snapshot daemon
mtmfs(8)                 - Mobile Time Machine file system daemon
special_file_handler(8)  - data provider for special files used by Mobile Documents
ubd(8)                   - ubiquity daemon, part of Mobile Documents
% 


Mobile 関連ぽいものがわかった。

#-------------------------
# MDM
#-------------------------
# 1. mdmclient(1) - MDM (Mobile Device Management) client
# 2. mtmd(8) - Mobile Time Machine snapshot daemon
# mtmfs(8) - Mobile Time Machine file system daemon
# 3. special_file_handler(8) - data provider for special files used by Mobile Documents
# 4. ubd(8)
#-------------------------

#-------------------------
# 1. mdmclient
#-------------------------
# man mdclient
# mdmclient -- MDM (Mobile Device Management) client
#
# $ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mdmclient.daemon.plist
# % launchctl unload -w /System/Library/LaunchAgents/com.apple.mdmclient.agent.plist

#-------------------------
# 2. mtmd, mtmfs
#-------------------------
# $ man mtmd
# $ man mtmfs
# $ man tmutil
#
# $ sudo tmutil disable
# $ sudo tmutil disablelocal
# $ sudo launchctl unload -w System/Library/LaunchDaemons/com.apple.mtmd.plist
# $ sudo launchctl unload -w System/Library/LaunchDaemons/com.apple.mtmfs.plist

#-------------------------
# 3. special_file_handler
#-------------------------
# man special_file_handler
# special_file_handler -- data provider for special files used by Mobile Documents
#
# $ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ubiquity.special_files.plist

#-------------------------
# 4. ubd
#-------------------------
# man ubd
# ubd -- ubiquity daemon, part of Mobile Documents
# ubd is the ubiquity server process. It is primarily used for "Mobile Documents".
# SEE ALSO
# special_file_handler(8)

# % launchctl unload -w /System/Library/LaunchAgents/com.apple.ubd.plist

#-------------------------
# findmymac
#-------------------------
# /System/Library/PrivateFrameworks/FindMyMac.framework/Resources/FindMyMacMessenger.app/Contents/MacOS/FindMyMacMessenger
#
# $ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.findmymac.plist
# $ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.findmymacmessenger.plist

# % launchctl unload -w /System/Library/LaunchAgents/com.apple.findmymacmessenger.plist

#-------------------------
# awacsd
#-------------------------
# man awacsd
# awacsd -- Apple Wide Area Connectivity Service daemon
# awacsd is an executable invoked by launchd to facilitate connections between devices using Back to My Mac.
#
# $ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.awacsd.plist

#-------------------------
# talagent
#-------------------------
# man talagent
# The talagent tool provides services related to the Transparent App Lifecycle feature.
#
# % launchctl unload -w /System/Library/LaunchAgents/com.apple.talagent.plist
# % launchctl unload -w /System/Library/LaunchAgents/com.apple.TMLaunchAgent.plist

# [WARNING: 要注意]
# 上記に点在するコマンドを実行すると、iPhone, iPod, iPad などのデバイスと
# うまく連携できなくなるかもしれません。
# また、iTunes も起動できなくなるかもしれません。起動できたとしても
# 思い通りに動かなくなるかもしれません。
# iCloud と一切交信できなくてもよい人向け entry なのです。

-- 至らない説明。

$ で始まる行は管理者ユーザ用。
% で始まる行は一般ユーザ。
実行するといずれも、
/var/db/launchd.db/
にキャッシュされる。

/System/Library/LaunchDaemons/
配下には daemon plist が保存されており、
/System/Library/LaunchAgents/
配下には daemon に対する agent plist が保存されている。

特定の daemon を 起動時に読み込むか読み込まないかは、
sudo launchctl [load|unload] ...
で制御可能(管理者のみ)。
だが、unload されていない daemon
(イコール load していて sudo launchctl list に表示されるdaemon)
が率いる agent を一般ユーザ側が unload しても反映されない。場合がある。

反映しているかしていないかは
一般ユーザで
% launchctl list
を実行すればわかる。
保存された launchctl を確認したい時は
% cat /var/db/launchd.db/.../.../overrides.plist
で確認できる。

-- 私が実行してみたものはこちら。
github.com/1330318
gist.github.com/1330308

-- その他
anonymous.librariand

$ sudo defaults read /System/Library/LaunchAgents/com.apple.librariand

なんのことやら。

$ man librariand
No manual entry for librariand
$ 


-- 感想
Apple は Mac OS X を iCloud やデバイス中心の OS にしてしまった。
Mac OS X 10.7 全ユーザが iCloud にログインすることを前提にしている。
iCloud やデバイスと無関係でいたいマシンも
そのようなプロセスと無関係でいられなくなってしまった。
Mac OS X は Snow Leopard 以降、変わってしまった。

textutil

めったに使わないコマンド textutil
-- rtf file を plain text に変換する方法 --

# /Libray で rtf file をみかけたら適当な名前でホームにコピーする。
% cp /Library/Documentation/AirPort\ Acknowledgements.rtf ~/airport-doc.rtf

# そのファイルの information を表示する。

% textutil -info airport-doc.rtf
File:  airport-doc.rtf
  Type:  rich text format (RTF)
  Size:  43836 bytes
  Length:  39382 characters
  Contents:  Acknowledgments...
% 


# ヘルプで確認する。
% textutil -help

...

-convert fmt convert each input file to format (txt, rtf, rtfd,
html, doc, docx, odt, wordml, or webarchive)


# txt に変換。

% textutil  ~/airport-doc.rtf  -convert txt -output ~/000.txt


# txt ファイルを読む。

% more ~/000.txt

org.vim.MacVim

mymvim.rb
http://midorex.blogspot.com/2011/11/mymvimrb.html
のその後。(いろいろ試してわかったこと)

自分で -g に設定していたものを削除。

% defaults delete -g NSQuitAlwaysKeepsWindows
% defaults delete -g ApplePersistenceIgnoreState

% su admin
$ sudo defaults delete /Library/Preferences/.GlobalPreferences NSQuitAlwaysKeepsWindows
$ sudo defaults delete /Library/Preferences/.GlobalPreferences ApplePersistenceIgnoreState
$


org.vim.MacVim からも追加したものを削除

% defaults delete org.vim.MacVim NSQuitAlwaysKeepsWindows


MacVim の環境設定
[Preference General]
Open untitled window: never
Open files from applications: with a tab for each file
After last window closes: Quit MacVim

% defaults read org.vim.MacVim
{
    MMAutosaveColumns = 150;
    MMAutosaveRows = 45;
    MMCurrentPreferencePane = General;
    MMLastWindowClosedBehavior = 2;
    MMNativeFullScreen = 0;
    MMOpenInCurrentWindow = 1;
    MMTopLeftPoint = "{516, 746}";
    MMUntitledWindow = 0;
    MMUseInlineIm = 0;
    NSNavLastRootDirectory = "~";
    NSNavPanelExpandedSizeForOpenMode = "{585, 418}";
    NSQuotedKeystrokeBinding = "";
    NSRepeatCountBinding = "";
    SUCheckAtStartup = 0;
}


これで、MacVim が起動していない時に、
MacVim 付属の mvim を動かしても shell が終了しないなんてことはなくなった。
mvim の exec は何も悪くなかった!。
せっかく作った mymvim.rb は残念だけど不要だった。

% syslog -w
をみていても変なメッセージはでてこなくなった。

MacVim 起動すると、
~/Library/Saved Application State/org.vim.MacVim.savedState
が生成されるけれど、MacVim を終了すると同時に自動的に消えてなくなってくれるようにもなった!。

感想。
今後 defaults -g に write するのはやめよう。

2011/11/04

mymvim.rb

MacVim 付属のmvim はshell で書かれている。
mvim で存在しないファイルを指定すると新規ファイルを作成する。
Lion で MacVim を起動していない時にうっかり mvim を動かすと
下記のようなエラーが残り shell 終了しない。

... MacVim[451:507] ApplePersistenceIgnoreState: Existing state will not be touched. New state will be written to ....

Ctr + C で終了するはめになる。

defaults write -g ApplePersistenceIgnoreState YES

を実行しているけれど
念のため org.vim.MacVim にも指定。

% defaults write org.vim.MacVim ApplePersistenceIgnoreState YES
% defaults read org.vim.MacVim
{
    ApplePersistenceIgnoreState = YES;
    MMAutosaveColumns = 150;
    MMAutosaveRows = 45;
    MMCurrentPreferencePane = General;
    MMLastWindowClosedBehavior = 1;
    MMNativeFullScreen = 0;
    MMOpenInCurrentWindow = 1;
    MMTopLeftPoint = "{208, 723}";
    MMUntitledWindow = 0;
    MMUseInlineIm = 0;
    NSQuotedKeystrokeBinding = "";
    NSRepeatCountBinding = "";
    SUCheckAtStartup = 0;
}

が...むなしく変化なく shell 終わらず。
そりゃそうかも。
mvim の最後の行あたり exec が怪しいのかも...

それで
Ruby 1.9.3 で mymvim.rb を作るいい口実ができた。
mymvim.rb は
MacVim が起動していなかったら、たぶん?正しく起動し、指定したファイルを開く。
存在しないファイルを指定してしまっても、何もおこらない。
おもったよりも早く動く。

ところが mymvim.rb を実行すると...

% ps aux  |grep task

=>
...(略) grep --color=auto task
...(略) /usr/libexec/taskgated -p -s

必ず /usr/libexec/taskgated が発生する。
数分すると自動的に消える。これは一体なんなのだろう。
Snow Leopard の時もあったような気もする...。

taskgated を sudo で kill しつつ
よくよく試してみると mymvim.rb だけでなく
MacVim 付属の mvim を実行したあとにも taskgated が発生していた。
ということは、
どのような方法で MacVim を起動したかってことは関係なくて、
MacVim を起動したこと、そのこと自体が taskgated を引き起こしている
ようだ。

MacVim をインストールしている ~/Application と
同じ階層にある他の Application を起動してみると...
taskgated が発生した。

dmg をダウンロードしてインストールした
/usr/local/git/bin/git
を動かしてみると、やはり発生した。

% ruby19 -e "puts \"hello\""
hello
% 

を実行しただけでも発生した。

しかし Lion にデフォルトで入っていた ruby 1.8 を動かしても発生しなかった。

% ruby  -e "puts \"hello\""
hello
% 


/Application にある Safari.app などを起動してみると
taskgated は発生しなかった。

つまり
Apple によって署名されていない Application やプログラムを起動すると
taskgated process が発生するってことかな。?

署名されたソフトウエアと、そうじゃないものの違い....

mymvim.rb

# coding: utf-8
# snapshot MacVim 7.3
# OS X Lion 10.7.2
# ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]

module Mymvim
  class Mvim
    def initialize(f)
      @f = f
      @osa = '/usr/bin/osascript'
      macvim = "Tell application \"MacVim\""
      @s1 = "#{macvim} to open (POSIX file \"#{@f}\") as string"
      @s2 = "#{macvim} to activate"
    end
    def base
      run
    end
    def run
      begin
        e = system("#{@osa} -e '#{@s1}' -e '#{@s2}'")
        exit unless e
      ensure
        print "bye\n"
        exit
      end
    end
  end
end

f = ARGV[0]
 unless File.exist?(f)
  print "Not found : #{f}\n"
  exit
end
Mymvim::Mvim.new(f).base

2011/10/22

OS X 10.7.2: networksetup

Lion 10.7.2
優先するネットワークの設定。

# 管理者ユーザでログイン。
# ヘルプをみる。

$ networksetup --help | grep addpreferredwirelessnetworkatindex
networksetup -addpreferredwirelessnetworkatindex <device name> <network> <index> <security type> [password]


# manual で addpreferredwirelessnetworkatindex の詳細をみる。

$ man networksetup
     -addpreferredwirelessnetworkatindex hardwareport network index securitytype [password]
             Add wireless network named <network> to preferred list for <hardwareport> at <index>. Store the optional password in the
             keychain For security type, use OPEN for none, WPA for WPA Personal, WPAE for WPA Enterprise, WPA2 for WPA2 Personal,
             WPA2E for WPA2 Enterprise, WEP for plain WEP, and 8021XWEP for 802.1X WEP.


実行すべきコマンドの雛形は

$ networksetup -addpreferredwirelessnetworkatindex <device name> <network> <index> <security type> [password]

で オプションは

<device name>
en0 とか en1 とか
$ networksetup -listallhardwareports で要確認。
前回
このオプションを間違えていたかも...

<network>
優先的に参加するローカルネットワーク名。

<index>
0 にすると優先順位が 1 番に。
優先順位を 2 番目したければ 1 に。

<security type>
WPA2 Personal で設定しているなら -> 'WPA2'
WPA2 Enterprise -> 'WPA2E'
WPA Personal -> 'WPA'
WPA Enterprise -> 'WPAE'
plain WEP -> 'WEP'
# ノンパスワードでローカルネットワーク解放しているなら
none -> 'OPEN'

[password]
いわずもがな

下記を実行すると...

$ sudo networksetup -addpreferredwirelessnetworkatindex en0 'homearea' 0 'WPA2' 'xxxxxxxxx'
Security type is set to: WPA2 Personal
Added homearea to preferred networks list
$ 


キーチェーンのシステムとログインに Wi-Fi 用鍵が出現。

$ syslog -w をみながら

おもむろに Wi-Fi 電源を On

$ networksetup -setairportpower en0 on

つながりました!

追加された鍵のアクセス制御欄を確認すると

networksetup
AirPort


以前と同様にアクセス制御欄には「システム環境設定」が存在していない。
(GUI から設定した場合は存在する)
若干気になるがうまくいったようなので無視する。

# 実行する前後に注意したこと。

コマンドを実行する前にシステム環境設定ーネットワークを開き
「新しいネットワークに接続するを確認」にチェックが『入っていない』ことを確認。
詳細欄の
「このコンピュータが接続したネットワークを記憶」
「コンピュータとコンピュータネットワークを作成」
「ネットワーク変更」
の3つを On にしておく。

コマンド実行後、
Wi-Fi電源を ON にし優先するローカルネットワークに参加できたことを確認したら、
一旦 Wi-Fi 電源をOFF。
「新しいネットワークに接続するを確認」にチェックを入れて
システム環境設定の鍵をかけ
システム環境設定を終了しキャッシュする。

管理者ユーザからログアウトし一般ユーザでログインしなおす。
メニューバーから Wi-Fi 電源を On にする。
優先するネットワークに参加できることを確認。
一般ユーザのログインキーチェーンには Wi-Fi 用鍵は存在していなくて全然 OK 。

最終確認。

$ networksetup -listpreferredwirelessnetworks en0

を実行すると優先的に参加する無線ローカルネットワーク名が表示される。

# IPv6
OS X 10.7 : IPv6 を切る
$ networksetup -getinfo 'Wi-Fi'
$ sudo networksetup -setv6off 'Wi-Fi'

# DNS
$ networksetup --h | grep dns
networksetup -getdnsservers <networkservice>
networksetup -setdnsservers <networkservice> <dns1> [dns2] [...]

$ networksetup -listnetworkserviceorder
を実行すると <networkservice> がわかる

# Google DNS
$ sudo networksetup -setdnsservers Wi-Fi '8.8.8.8' '8.8.4.4'

2011/10/04

OS X 10.7.1: XProtect

Get Safe Downloads List last update time and current version - Mac OS X Hints
http://hints.macworld.com/article.php?story=20110602091032338

を読んで...

現在の様子 Memo

% defaults read /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta LastModification
Fri, 23 Sep 2011 18:08:25 GMT
% defaults read /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta Version
1003
% cat /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist


強制的にアップデートしたい時。

$ sudo /usr/libexec/XProtectUpdater


# XProtect.plist
# XProtect.meta.plist

2011/09/23

OS X 10.7.1: mtmfs

マックがうなり熱くなるので、

$ top
$ sudo lsof -i


知らないものが Listen していた。気持ち悪い。調べてみると

Lion Running Hot: Apple Support Communities
https://discussions.apple.com/message/15700251#15700251

これかも。
/System/Library/CoreServices/backupd.bundle/Contents/Resources/mtmfs

% man mtmfs

...There are no configurations to mtmfs, and users should not run mtmfs manually.

% man mtmd

ふーん。設定ファイルはないよ。ユーザはいじるな、と。

$ cd /System/Library/LaunchDaemons/
$ grep -R mtmfs .
./com.apple.mtmfs.plist:	<string>com.apple.mtmfs</string>
./com.apple.mtmfs.plist:		<key>com.apple.mtmfs</key>
./com.apple.mtmfs.plist:		<string>/System/Library/CoreServices/backupd.bundle/Contents/Resources/mtmfs</string>

$ sudo launchctl list | grep mtmfs
64	-	com.apple.mtmfs

$ more /System/Library/LaunchDaemons/com.apple.mtmfs.plist 
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mtmfs.plist 
$ sudo lsof -i


消えたわ。
あ、sudo launchctl unload やってからシステム環境のタイムマシン「切」にした。順序間違えたかも。
というか「切」にしておけばマックが熱くなることもなかったのかな...。わからない。
ちなみに、

% mdutil -s /Users/midore/
/Users/midore:
  No index.


[余談]
いい↓事知りました。

Lion Running Hot: Apple Support Communities
https://discussions.apple.com/message/15791385#15791385

% ps -arcwwwxo "command %cpu %mem" | grep -v grep | head -13


[2011.09.25]
mtmd

【コラム】新・OS X ハッキング! (15) Lion備忘録(8) ~タイムマシンにおねがい~ | パソコン | マイコミジャーナル [SP]
http://journal.mycom.co.jp/column/osxhack/015/index.html

(Mac OS X Tips::Lion)mtmd(Mobile Time Machine Daemon)のCPU使用率が異常に高い時の対応 - jitsu102の日記 [SP]
http://d.hatena.ne.jp/jitsu102/20110912/1315834305

[2011.10.02]
tmutil

Disable Time Machine Local Backups in Mac OS X Lion
http://osxdaily.com/2011/09/28/disable-time-machine-local-backups-in-mac-os-x-lion/

Time Machineのローカルスナップショット機能を無効にする方法
http://veadardiary.blog29.fc2.com/blog-entry-3493.html

[2011.10.11]
記事タイトル変更

2011/09/22

OS X 10.7.1: Keychains

Mac OS X 10.4 の重要なファイルをバックアップおよびリストアする方法
http://support.apple.com/kb/HT2980?viewlocale=ja_JP&locale=ja_JP#key

下記は超我流です。

----------------------------------------
ハードディスクを初期化する前に
~/Library/Keychains をバックアップする。
----------------------------------------
# キーチェーン.app が起動していない事を確認。
# デスクトップに /Volume/backupHDD/ がマウントできているとしたら。

$ cp -a ~/Library/keychains  ~/Volume/backupHDD/your-name-backup-keys


[重要]
キーチェーン"ログイン"パスワードにユーザログインパスワード「以外」のパスワードを設定している場合、バックアップから戻す際にはそのパスワードが必要になる事を心にとめておく。

----------------------------------------
バックアップした Keychains を戻す。
----------------------------------------
[重要]
これから行う作業において事故があった場合に備え予め現在の ~/Library/Keychains をバックアップしておく。この時キーチェーン.app は起動していてはいけない。メニューバーにカギアイコンがあればカギをかけておく。

# 現在のキーチェーンカギ束をバックアップする。
$ cp -a ~/Library/Keychains/  ~/now-backup-keys
外付けディスクなどにバックアップしておいた ~/Volume/backupHDD/your-name-backup-keys フォルダを Home 配下 にコピーする。
マウントしている外付けディスクに存在するバックアップしたカギ束を、直接触ることは厳禁。必ずバックアップの「コピー」を操作対象にする。
<pr>
# バックアップの「コピー」を ~/ 以下におく。
$ cp -a ~/Volume/backupHDD/your-name-backup-keys  ~/backup-keys
$ cd ~/backup-keys

# login.keychain があるはず。ファイル名 login を任意の名前(ここでは my)に変更。
$ mv login.keychain my.keychain


/Applications/Utilities/Keychain Access.app を起動する。
キーチェーンアクセス.app のメニューから「キーチェーンを追加」をクリック。
保存しておいたカギ束のコピー ~/backup-keys/my.keychain を選ぶ。
バックアップした時に使用していたパスワードを尋ねられる。
正しいパスワードを入力するとキーチェーンリストに「ログイン」「システム」と共に「my」 が追加されるはず。

キーチェーンリストに追加された"my"キーチェーンは ~/backup-keys 内に存在するカギを参照している。
よって、もし仮に ~/backup-keys を削除してしまうと実体を失ってしまう。

このような状態を解消するには、
# キーチェーンリスト"ログイン"の鍵がロックされていたらはずす。
"my"に追加された鍵、全てを"ログイン"キーチェーン内にドラッグ&ドロップする。もしくは「新規キーチェーン」を追加しておいてその中にドロップする。
キーチェーン"ログイン"に使用しているパスワードを尋ねられる。
"my"キーチェーン内の鍵を全てドラッグ&ドロップで移動したらメニューファイルーから「キーチェーン”my”を削除」をクリックする。
「参照のみ」「実体と参照」の選択肢から「実体と参照」をクリック。
~/backup-keys フォルダの中身は空になっているはず。

全て終了したらカギをかけキーチェーンアクセス.app を終了しライブラリ内を確認する。

$ ls -la ~/Library/Keychains/

アップルメニューからログインログアウトし再度ログインしてからキーチェーンアクセス.app を起動し正常にカギが存在していることを確認する。

# キーチェーンを使用している Application を使用してみるなどして、
# 問題ない事を確認し終えたら不要なバックアップを削除する。
$ srm -rf  ~/now-backup-keys/ ~/backup-keys/

OS X 10.7.1: dscl

最近...

yebo blog: Mac OS X Lionはパスワードクラックが簡単
http://yebo-blog.blogspot.com/2011/09/mac-os-x-lion.html

Change the Password in Mac OS X 10.7 Lion Without Knowing the Current Password
http://osxdaily.com/2011/09/19/change-password-mac-os-x-10-7-lion-without-knowing-current-password/

このような話題を目にしてげげと思っていたところ、

Quick Fix to Prevent dscl Unauthorized Password Changes in OS X Lion
http://osxdaily.com/2011/09/21/quick-fix-to-prevent-dscl-unauthorized-password-changes-in-os-x-lion/

His reasoning is that chmod 100 is too restrictive in that it changes the command to execute only, where as before the root user could read, write, and execute.

# ものすごい意訳。
# 彼の方法(chmod 100)ではとても制限があるので...。root user が読み書き読み書き実行できるよう。

2011/07/25

OS X 10.7 : IPv6 を切る

Mac OS X 10.7 では下記に書かれてある通りにIPv6 を切ることはできなくなってしまった。

Configuring IPv6 in Mac OS X v10.6.7 or later
http://support.apple.com/kb/HT4667

基本的にはできなくなったけどコマンドからはできた。

サービス名デバイス名一覧表示(一般ユーザ実行可能)

$ networksetup -listnetworkserviceorder


IPv6の現況
# <networkservice> には -listnetworkserviceorderで表示されたサービス名を使う。

$ networksetup -getinfo <networkservice>


指定したサービスのIPv6 を OFF にする # 管理者ユーザで実行

$ sudo networksetup -setv6off <networkservice>


確認

$ networksetup -getinfo <networkservice>
...
IPv6: Off


システム環境設定->ネットワークから IPv6の構成をみてみると「切る」になっていた。

もしかして、Apple は
『これからはじゃんじゃんIPv6を使いましょう。よって IPv6 「切る」を選択肢から削除しました』
なーんて意図を持ってるのかもしれない。
できればちゃんとした公式ドキュメントが欲しいところ...。

参照

$ networksetup --help | grep 6
networksetup -setv6off <networkservice>
networksetup -setv6automatic <networkservice>
networksetup -setv6manual <networkservice> <networkservice> <address> <prefixlength> <router>
networksetup -create6to4service <newnetworkservicename> 
networksetup -set6to4automatic <networkservice> 
networksetup -set6to4manual <networkservice> <relayaddress> 

2011/07/24

Mac OS X Lion Install

Mac OS X Lion クリーンインストール。
# App Store から Installer をダウンロードした『直後』でインストール始める『直前』に
# /Applications にダウンロードされた Installer をバックアップとらないといけない。ここはまる。ここ「はまる」の意。
# 詳細は googleへ。 記事末尾参照

PRMA クリアして option を押しながら USB フラッシュメモリーから起動。
ユーティリティ->ディスクユーティリティを使ってパーティションの1つを初期化しインストール。

システム環境とターミナル.appをざっと設定し 3 度目の起動 後。
# ソフトウェアアップデートはしていない。
# Wi-Fi (Lion から メニューバーのAirMac は Wi-Fi になった) に繋がることは確認。
# FileVault はオンにしていない。

# lsof
$ sudo lsof -i
$ sudo launchctl list | more

# grep netbios
$ sudo launchctl list | grep netbios

$ pwd
/System/Library/LaunchDaemons
$
$ grep -R netb  .
./com.apple.netbiosd.plist: <string>com.apple.netbiosd</string>
./com.apple.netbiosd.plist:   <string>/usr/sbin/netbiosd</string>
./com.apple.netbiosd.plist:        <string>_netbios</string>
./com.apple.netbiosd.plist:                <string>netbios-ns</string>
./com.apple.netbiosd.plist:                <string>netbios-dgm</string>
$
$ more com.apple.netbiosd.plist

# unload netbiosd
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.netbiosd.plist 
$ sudo lsof -i

# chmod netbiosd
$ which netbiosd
$ sudo chmod a-x /usr/sbin/netbiosd
$ ls -la /usr/sbin/netbiosd 
# chmod smbd
$ sudo chmod a-x /usr/sbin/smbd
$ ls -la /usr/sbin/smbd

# unload blued
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.blued.plist
# unload RemoteDesktop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.RemoteDesktop.PrivilegeProxy.plist 


# halt
# shift key 押しながら起動。
# login as admin user

# moved RemoteManagement agent
$ sudo mv /System/Library/LaunchAgents/com.apple.RemoteDesktop.plist  ~/backup/com.apple.RemoteDesktop.plist
# moved RemoteManagement
$ sudo mv /System/Library/CoreServices/RemoteManagement/  ~/backup/RemoteManagement/

# moved IOBluetooth
$ cd /System/Library/Extensions
$ sudo mv IOBluetoothFamily.kext/  ~/backup/IOBluetoothFamily.kext/
$ sudo mv IOBluetoothHIDDriver.kext/  ~/backup/IOBluetoothHIDDriver.kext/
$ sudo mv AppleBluetoothMultitouch.kext ~/backup/AppleBluetoothMultitouch.kext

# important touch
$ sudo touch /System/Library/Extensions/

# chmod blued
$ which blued
$ sudo chmod a-x /usr/sbin/blued
$ ls -la /usr/sbin/blued 

# reboot
# login as admin user
# system log
$ syslog -w 200 | more


# system error log

$ syslog -k Level Nle error
Jul 24 10:38:59 localhost UserEventAgent[11] <Error>: CaptiveNetworkSupport:CaptiveSCRebuildCache:81 Failed to get service order
--- last message repeated 3 times ---
Jul 24 10:38:59 localhost airportd[21] <Error>: _processDLILEvent: en0 attached (down)
Jul 24 10:39:00 localhost UserEventAgent[11] <Error>: CaptiveNetworkSupport:CaptiveSCRebuildCache:81 Failed to get service order
--- last message repeated 1 time ---
Jul 24 10:39:00 localhost configd[14] <Error>: bootp_session_transmit: bpf_write(en0) failed: Network is down (50)
Jul 24 10:39:00 localhost configd[14] <Error>: DHCP en0: INIT-REBOOT transmit failed
Jul 24 10:39:01 osx mDNSResponder[47] <Error>: mDNSResponder mDNSResponder-320.5 (Jun 16 2011 17:42:39) starting OSXVers 11
Jul 24 10:39:02 osx mDNSResponder[47] <Error>: D2D_IPC: Loaded
Jul 24 10:39:02 osx mDNSResponder[47] <Error>: D2DInitialize succeeded
Jul 24 10:39:02 osx corestoraged[73] <Error>: .... status = "Locked"
Jul 24 10:39:02 osx systemkeychain[33] <Error>: done file: /var/run/systemkeychaincheck.done
Jul 24 10:39:02 osx loginwindow[49] <Error>: Login Window Application Started
Jul 24 10:39:03 osx mds[46] <Error>: (Normal) FMW: FMW 0 0
Jul 24 10:39:05 osx loginwindow[49] <Error>: Login Window Started Security Agent
Jul 24 10:39:05 osx WindowServer[99] <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.
Jul 24 10:39:05 osx loginwindow[49] <Error>: kCGErrorFailure: CGSPackagesGetWorkspaceType: couldn't get workspace type
Jul 24 10:39:05 osx loginwindow[49] <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.
Jul 24 10:39:06 osx SecurityAgent[118] <Error>: Echo enabled
Jul 24 10:39:08 osx SecurityAgent[118] <Error>: kCGErrorFailure: CGSPackagesGetWorkspaceType: couldn't get workspace type
Jul 24 10:39:08 osx SecurityAgent[118] <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.
Jul 24 10:39:18 osx SecurityAgent[118] <Error>: Login Window login proceeding
Jul 24 10:39:18 osx loginwindow[49] <Error>: Login Window - Returned from Security Agent
$_


# :) を検索
$ syslog -k Message Seq ':)'

[2011-07-25]

yebo blog: OS X Lionのディスクを作成する方法
http://yebo-blog.blogspot.com/2011/06/os-x-lion_18.html

http://osxdaily.com/2011/07/08/make-a-bootable-mac-os-x-10-7-lion-installer-from-a-usb-flash-drive/

Install Mac OS X Lion on More Than One Computer
http://osxdaily.com/2011/07/21/install-mac-os-x-lion-multiple-macs/

OS X Lion: About Lion Recovery
http://support.apple.com/kb/HT4718

OS X Lion: About FileVault 2
http://support.apple.com/kb/HT4790

Inside Mac OS X 10.7 Lion: New Wi-Fi Diagnostics tool
http://www.appleinsider.com/articles/11/03/15/inside_mac_os_x_10_7_lion_new_wifi_diagnostics_tool.html

2011/06/25

networksetup createlocation

[2011-07-25]
追記:OS X Lion から試してみた。結論からいうと、このコマンドを使って「優先するネットワーク」を設定しないほうがいい。と私は思う。
キーチェインのシステムとログインそれぞれに鍵は登録されるものの、その鍵のアクセス制御欄を確認してみると「システム環境設定」が含まれていない。
つまり手動で設定した場合のアクセス制御とは異なる結果が生じてしまう。
また、10.7 でサポートされなくなったオプションもいくつかあるようだ。
----------

コマンドラインから AirMac(AirPort) 設定するメモが出てきた。
7月に OS X Lion になったら試してみようと思う。

下記 Mac OS X 10.6.1 時代の日記より。(2009-09-14)

# --
# help をちゃんと読んでみる
$ /usr/sbin/networksetup -help | more
# 管理者ユーザになる

### 新規ロケーション作成 - デフォルトサービスつき
# Usage: networksetup -createlocation <location name> [populate]

$ sudo networksetup -createlocation test-location populate 
# システム環境設定 - ネットワーク から手動で新規ロケーションを作成したのと同じ結果になる.
# populate をつけると利用可能なサービス(Ethrnet, Airport など)がすべて有効な状態で登録される。

### ロケーションの削除
# sudo networksetup -deletelocation <location name>
$ sudo networksetup -deletelocation test-location
# 成功すると、found it! と表示

### 新規ロケーション作成 - デフォルトサービスなし
$ sudo networksetup -createlocation test-location

### ロケーション一覧をみて新規ロケーションを確認する
$ networksetup -listlocations

### 新しく作ったロケーションへ切替
$ sudo networksetup -switchtolocation test-location

### サービスの作成 - アドレスは自動的に DHCP 参照になる。
# Usage: networksetup -createnetworkservice <newnetworkservicename> <hardwareport>
# <newnetworkservicename> - 自分で自由につける名前.ここでは air2 とした
# <hardwareport> - $ networksetup -listallhardwareports で確認できているもののなかから無線を選ぶ.ここでは AirPort
$ sudo networksetup -createnetworkservice air2 AirPort

# サービスを作成すると途端に AirMac 電源が入り周囲をスキャンしはじめるのですぐ電源を切っておく.
# networksetup -setairportpower <device name> <on off>
$ networksetup -setairportpower AirPort off
or
$ networksetup -setairportpower en0 off

### サービス作成されたことを確認
$ sudo networksetup -listnetworkserviceorder
# <newnetworkservicename> である air2 設定状況表示 - DHCP 参照になっている
$ networksetup -getinfo ai2

### 優先するネットワークの設定
% networksetup -help
# Usage: networksetup -setairportnetwork <network> <device name> [password]
# Set AirPort Network to <network> for <device name>.
# If a password is included, it gets stored in the keychain.

# <device name> -> $ networksetup -listallhardwareports で確認できているもののなかから無線を選ぶ
# <network> -> 参加したい無線LANネットワーク名。SSID ともいう。ここでは homearea 。
# <index> -> 0 を指定すると優先順位が1番になるようだ。末尾にしたい場合は任意の数字
# <security type> -> WEP とか WPA2 とか選ぶ
# [password] - パスワードを入力するとキーチェインの「システム」キーチェインに自動的に登録される。はず?

$ sudo networksetup -addpreferredwirelessnetworkatindex AirPort homearea 0 WPA2 password
# =>
# Security type is set to: WPA2 Personal
# Added homeerea to preferred networks list

# 優先するネットワークの設定のためのコマンドは動くもののキーチェインに key が正しく登録されないようだ。
# 結果、無線につながることはなかった。
# システム環境設定ーネットワークを開き手動で優先するネットワークを設定し無事つながった。
# --