Homebrew パッケージ管理システム Homebrew 以前、OpenCVの導入に使ったMacPortsのようなまた別のパッケージ管理ソフト。MacPortsとは違い、依存関係をいちから導入するのではなく、元からインストールされているもので解決するためMacPortsより軽い……?
Homebrewのコマンドを羅列したテキストファイル。要するにシェルスクリプト。 BrewfileでHomebrewパッケージを管理する
※使えなくなります(下記事参照) 2014-7-30追記 Brewfileで管理するのはもうオワコン
Homebrew Cask phinze/homebrew-cask HomebrewをつかってChromeやVirtuaBoxなどのアプリケーションをインストールするための仕組み。 つまりは、これらでBoxenを置き換えることができる。
$ script/nuke ---all ---force
このスクリプト、中身見れば分かるんだけどRubyで書かれてる。さらばBoxen。
必要な物は
Javaについては必須じゃないけど、それが必要なソフトをインストールするときに必要になる(あたりまえ)
XcodeはMac App Storeからインストールする。 Command Line ToolsはXcodeのPreferencesのDownloadsからインストール。 Mavericksの場合は
$ xcode-select --install
もしくはDownloads for Apple Developersから.dmgをダウンロードしてインストール。 その後、ライセンスに同意しておく。
$ sudo xcodebuild -license
$ java -version
これで、Javaがインストールされていればバージョンが、インストールされていなければインストールを促すダイアログが出る。
Homebrewの一番下のコマンドより、
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
を実行。なんて簡単なんだ。
$ brew tap phinze/cask
$ brew install brew-cask
これでおしまい。もしくは、Brewfileに
tap phinze/homebrew-cask
install brew-cask
と記述して、同じディレクトリで
$ brew bundle
としても同じ。これがBrewfile。
phinze/homebrew-cask/Casks やたらある。MacPortsまである。
とりあえず、自分がほしいものをいろいろ書いたBrewfileをつくった。 unasuke/my-homebrew-setup
$ git clone https://github.com/unasuke/my-homebrew-setup.git
$ cd my-homebrew-setup
$ ./install.sh
$ brew bundle
これでHomebrewのインストールからhomebrew-caskの導入とインストールまでやってくれる。
install.sh内でbrew bundle
してもいいが、念のためbrew doctor
を挟んだ。brew doctor
で指示されたことはやっておくこと。お医者さんの言いつけは守ろうね。
MacVim KaoriyaをsplhackさんのリポジトリにあるFormula(splhack/homebrew-splhack)からビルドしようとしたけど、pythonのあたりでどうしてもこけるのでビルド済の.appをインストールするCasksを作っちゃいました。unasuke/homebrew-unasuke
HomebrewでMacVim Kaoriyaがビルドできるようになったらリポジトリ消します。いや、消します。
ついでにビルドの仕方教えてください。
追記
tapするリポジトリをsupermomongaさんのforkの方にしたらビルドうまく行った。(supermomonga/homebrew-splhack)
それに伴いBrewfileとかも書き換えた。
まずBoxenとはなんぞや? BOXEN なるほど、わからん。 次にこっちを見てほしい。 Boxen使わなくても許されるのは2012年までだよね
つまり、OS installerにとってはありがたいツールであるということだ。2012年も過ぎ去ったし、導入しない手はないだろう。
Boxenを使うには、次のものが必要である。
導入だが、Boxen使わなくても許されるのは2012年までだよねと、GitHubの公式マニュアルを見つつ順を追って僕がやったことを説明していく。複数のやり方がある時は公式マニュアル通りにやった。
今は2014年だし今更解説記事書いてるあたり許されないと思った。
基本的にまっさらな状態からつくり上げることとする。だからすでにhomebrewが入ってたりしたら消さなきゃダメかもね。しらんけど。
で、まずはAppStoreからXcodeをインストールする。インストールが終わったら環境設定からCommand Line Toolsをダウンロードとインストール。
バッテリーは%表示になってないし壁紙は銀河だし本当にOSインストール直後にやってる
Mavericksから、Command Line ToolsがXcodeからインストールできなくなっている。
なので、ターミナルで
$ xcode-select --install
と入力し、インストールしなければならない。 Xcode 5.0 Error installing command line tools Mavericks上のXcode 5.0でCommand Line Toolsがない場合
Boxenがいろいろダウンロードしたり実行したりするフォルダを作る。(と思い込んでる) ターミナルで、
$ sudo mkdir -p /opt/boxen
$ sudo chown ${USER}:staff /opt/boxen
mkdirのpオプションはサブフォルダも一気に作るということ。chownでそのフォルダの所有者を自分に、グループをstaffに設定。間違ってる可能性大。不安なら自分で調べてほしい。
まずはGitHubのほうでリポジトリを作る。中身は空で。
$ git clone https://github.com/boxen/our-boxen /opt/boxen/repo
$ cd /opt/boxen/repo
$ git remote rm origin
$ git remote add origin <the location of my new git repository>
$ git push -u origin master
大本のboxen/our-boxenからそっくり引っ張ってきて、そのままだとpushする先が大元様なのを削除→自分のリポジトリに変更。そんでもってpushする。-uはupstreamの意味。これにより、大元様の変更を取り込むことができる……っぽい? 実際はこんな感じ。
Boxenでは内部でPuppetを使用している。それに関連するファイルなのだろう。Puppetについての詳しくはgihyoで。 boxenフォルダの中にPuppetfileというファイルがある。それを編集していく。
# This file manages Puppet module dependencies.
#
# It works a lot like Bundler. We provide some core modules by
# default. This ensures at least the ability to construct a basic
# environment.
--中略--
## unasuke setting
# web browser
github "chrome", "1.1.2"
github "firefox", "1.1.8"
github "opera", "0.3.2"
# voip
github "skype", "1.0.8"
# memo
github "evernote", "2.0.5"
# player
github "vlc", "1.0.5"
# utility
github "dropbox", "1.2.0"
github "keyremap4macbook", "1.2.2"
github "better_touch_tools", "1.0.0"
# editor
github "sublime_text_2", "1.1.2"
github "macvim_kaoriya", "1.1.0", :repo => "boxelly/puppet-macvim_kaoriya"
パッケージ名の横の数字はここから取ってくる。
最新のやつを選べば大丈夫か?
さて、Puppetfileで記述したパッケージを、実際にインストールさせるという記述をしなければならない。なんでだ……
個人用の設定はmodules/people/manifests/hoge.pp
に書いていく。ここでhogeはgithubのアカウント名。自分の場合だとこう編集する。
$ vim /opt/boxen/repo/modules/people/manifests/unasuke.pp
ほいで、中身はこれ。
class people::unasuke{
# core modules
#include xquartz
# web browser
include chrome
include firefox
include opera
# voip
include skype
# memo
include evernote
# player
include vlc
# utility
include dropbox
include virtualbox
include keyremap4macbook
include better_touch_tools
# editor
include sublime_text_2
include macvim_kaoriya
# raw package
package{
# japanese ime
'GoogleJapaneseInput':
source => "http://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg",
provider => pkgdmg;
# markdown editor
'Kobito':
source => "http://kobito.qiita.com/download/Kobito_v1.2.0.zip",
provider => compressed_app;
# ssd trim
'Trim Enabler':
source => "https://s3.amazonaws.com/groths/TrimEnabler.dmg",
provider => pkgdmg;
# scroll setting
'Scroll Reverser':
source => "https://d20vhy8jiniubf.cloudfront.net/downloads/ScrollReverser-1.6.zip, provider => compressed_app;
# typing sound
# noisy typer
}
}
それぞれに書いてあることは冒頭で紹介したQiitaの記事を見てほしい。簡単に説明すると、上からPuppetfieでincudeしたパッケージのインストール、webのアドレスからダウンロードしてインストールの指定をしている。
さて、このファイルにはすべてのPCに適用される設定が書かれている。というのも、Boxenがもともとチーム向けに作られたものだから。
中を見てみると、複数のバージョンがインストール指定されている部分がある。互換性など配慮しているのだろうが、個人用途というか僕にとっていらないので最新のバージョンのみインストールするようにしてもいいが、なんかあったら嫌なので放っておいた。
ひととおり設定し終わったらgit addとgit commitとgit push origin masterしておく。
では設定のとおりにBoxenに仕事してもらおう。
$ cd /opt/boxen/repo/
$ script/boxen --no-fde
–no-fdeは暗号化無しの場合につけるオプション すると、こんなのがでた。
$ script/boxen --no-fde
Need to install Bundler for system ruby, password for sudo:
Fetching: bundler-1.3.6.gem (100%)
Successfully installed bundler-1.3.6
1 gem installed
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile
make "DESTDIR="
compiling generator.c
linking shared-object json/ext/generator.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [generator.bundle] Error 1
Gem files will remain installed in /opt/boxen/repo/.bundle/ruby/2.0.0/gems/json-1.8.1 for inspection.
Results logged to /opt/boxen/repo/.bundle/ruby/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
An error occurred while installing json (1.8.1), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.
Can't bootstrap, dependencies are outdated.
どうやらjsonのバージョン1.8.1が必要な様子。そこでインストールしようとすると……
$ sudo gem install json -v '1.8.1'
Fetching: json-1.8.1.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile
make "DESTDIR="
compiling generator.c
linking shared-object json/ext/generator.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [generator.bundle] Error 1
Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/json-1.8.1 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
失敗する。
どうやらライセンスに同意しないといけないっぽい。 MavericksでC拡張を含むgemをインストールできない場合の対処法
$ sudo xcodebuild -license
このコマンドでダーーッと出てくるライセンスを読んで最後にagreeと入力。 さてやり直すか。
$ sudo gem install json -v '1.8.1'
Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile
make "DESTDIR="
compiling generator.c
linking shared-object json/ext/generator.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [generator.bundle] Error 1
Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/json-1.8.1 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
は? どうやらclangのところで警告が出ているので、無視するために以下のコマンドで実行。
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install json -v '1.8.1'
Building native extensions. This could take a while...
Successfully installed json-1.8.1
Parsing documentation for json-1.8.1
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for lib/json/ext/generator.bundle, skipping
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for lib/json/ext/parser.bundle, skipping
Installing ri documentation for json-1.8.1
1 gem installed
成功した。
Ruby Gem install Json fails on Mavericks and Xcode 5.1 - unknown argument: ‘-multiply_definedsuppress’
ちなみにこのままscript/boxen
しても同じ警告で止まるので、同様にARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future
を付加して実行する必要がある。
Ruby Gem install Json fails on Mavericks and Xcode 5.1 - unknown argument: ‘-multiply_definedsuppress’ #528
が、しかし。
$ ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future ./script/boxen --no-fde
--> Hey, I need your current GitHub credentials to continue.
GitHub login: |unasuke| unasuke
GitHub password: *
/opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl/receiver.rb:119:in `instance_binding': undefined method `guthub' for #<Librarian::Dsl::Receiver:0x007f962b822c10> (NoMethodError)
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl/receiver.rb:33:in `eval'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl/receiver.rb:33:in `run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl.rb:81:in `block in run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl.rb:71:in `tap'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl.rb:71:in `run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/dsl.rb:17:in `run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/environment.rb:115:in `dsl'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/specfile.rb:14:in `read'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/action/resolve.rb:16:in `run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/cli.rb:161:in `resolve!'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/lib/librarian/puppet/cli.rb:63:in `install'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/base.rb:439:in `start'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/vendor/librarian/lib/librarian/cli.rb:29:in `bin!'
from /opt/boxen/repo/.bundle/ruby/2.0.0/gems/librarian-puppet-0.9.10/bin/librarian-puppet:9:in `<top (required)>'
from /opt/boxen/repo/bin/librarian-puppet:16:in `load'
from /opt/boxen/repo/bin/librarian-puppet:16:in `<main>'
Can't run Puppet, fetching dependencies with librarian failed.
どうしてもCan’t run Puppet, fetching dependencies with librarian failed.で実行ができない。 Can’t run Puppet, fetching dependencies with librarian failed #78 Unable to find module ‘boxen/puppet-githubformac’ on https://github.com Can’t run Puppet, fetching dependencies with librarian failed. #313 苦悶に満ちて溢れ出した Boxen のお話 (Winter ver.) - 弐 など参考にしたが、効果はなかった。 誰か助けて…… 参考までに僕のboxen→unasuke/unasuke-boxen
iPhoneやiPodを使っていると、iTunesの手軽さ、androidの不甲斐なさ(?)に気付く。 さて、iPhoneに機種変した僕の手元には、android端末が数個転がっている。HTC Butterfly jはBeat’s audio搭載だし、Xperia SXはwalkmanアプリ搭載だしで放っておくには少しもったいない。これらandroid端末でも、iTunesのように手軽に音楽の管理ができないものか。
ubuntu 13.10 64bitを使っているが、ディストリビューションで大差はないと思う。 端末は前述のHTC Butterfly jとXperia SXを用いる。
ubuntuにデフォルトでインストールされるrhythmbox、一時期デフォルトだったBansheeがなかなかよい。 amarokは機能はいいだろうが、iTunesから移行しようとなるとUIが変わりすぎて取っ付きにくい(ように感じた)
ぱっと見で似ているのはBansheeだろう。アルバムアートが並んで表示されているところはiTunesそっくりである。rhythmboxではアルバムアートを使って選曲する方法はわからなかった。
どちらもiPodやandroidやその他メディアプレイヤーとの音楽ライブラリ同期機能は備えている。
気のせいか、Bansheeはエラーやフリーズが多い。
見た目似ているのはBansheeだけど、機能や安定性ではrhythmboxのほうがいいと思われる。ubuntuデフォルトだし。
おそらくwindowsで音楽管理するなら転送プロトコル(端末をUSBでつないだ時の設定)は「MTP」になっている。Linux(ubuntu)でも「MTP」でのマウントは可能だが、rhythmbox(Bnashee)で音楽を転送しようとすると転送する楽曲の数だけエラーが出て使いものにならない。 よって、マウントは「MSC」(ファイル転送モード)に設定する必要がある。
Xperiaでは設定→Xperia→USB接続設定から変更。HTC系端末では接続のたびに変更する必要があるかもしれない。
接続プロトコルの変更を行うと、接続した時にただの外部ストレージとして認識され、音楽管理には向かない。 そこで、音楽を同期させる領域(おそらく外部SD)のルートフォルダに「.isaudioplayer」というテキストファイルを作成する(linuxやandroidでは隠しファイルとなるのでファイルエクスプローラからは消えたようにみえる) そして内容を以下のようにする。
audio_folders=Music/
folder_depth=2
output_formats=audio/aac,audio/mp3
内容の意味としては、「音楽を格納するのはMusicフォルダ、フォルダ構成はアーティスト名/アルバム名/音楽ファイルとする。再生できる拡張子はaac(m4a)とmp3」という内容である。拡張子の指定はMIMEで指定する。Wikipediaに載っているもののうちで一般的なものをまとめると以下の通りである。
拡張子 | MIME |
---|---|
wav | audio/x-wav |
mp3 | audio/mpeg |
aac | audio/aac |
mp4(m4a) | audio/mp4 |
flac | audio/x-flac |
ogg | audio/ogg |
wma | audio/x-ms-wma |
今までに貯めこんできたライブラリと、これから取り込んでいくデータとでいろいろ変わる部分がある。
iTunesだとおそらく.m4aなどになっていると思う。Linuxで扱いやすいのは.mp3か.oggか.flacだろう。もちろん.m4aも再生できないわけではないが。
アーティスト/アルバム という構造になっていると思うが、アーティスト情報などが得られないことも予想される。アルバムごとで手打ちが必要になるかもしれない。1アルバム1フォルダ的な。
一番変わるのがここだろう。iTunesはgracenoteからCDの情報を取ってくるが、rhythmboxやBansheeではmusicbrainzから取ってくる?ようなので情報があれば御の字と言ったところ。洋楽のCDなどは情報がある可能性が高い。冊子を見ながら手打ちする必要があるかもしれない。
だいぶ前にやったのを思い出しながら書いてるので間違っている可能性があります。実行は自己責任で。
※リンク貼ってないものについては自力で
au HTL21 HTC J butterfly 1.36.970.1から1.15.970.1へのダウングレードについて (HTC速報Dev) ここを参考にやりました
HTC J butterfly 対策版1.29.970.1 / INFOBAR A02のS-OFFが可能に、新S-OFFツール「revone」DLX向けが公開、利用してみた。 HTL21 HTC J butterfly Sense 5 ポートROMについて (HTC速報Dev) ここを参考に
どうやってやったのか全く覚えてない自分がいる…… SuperCIDは2の連続にした記憶がある。あとHTCのデベロッパーも登録もした。
ポーチがなかなかいい感じ
低音はいい。振動してるのが耳で感じられる。でも低音だけ鳴ってるんじゃなくて全体的に聞こえる。(ボワっとしてない)
音漏れを気にしなくていい 耳が痛いくらいの音量になっても隣の人にはほとんど聞こえてなかったくらい音漏れが少ない。電車の中で大音量で聞いてても安心できる。
でも、なくした……
Macでpkgからアプリケーションのインストールをした時に、アンインストーラがついてくるものとついてこないものがあります。 ただ.appを削除すればいいというものではなく、他のディレクトリにもいろいろインストールしてくれるので不要なファイルが残ります。
pkgutilコマンドを使えば、そのアプリケーションがどのようなファイルをどこにインストールしたのかがわかります。アンインストールするコマンドオプションもあったようですが、現在は削除されています。 参考:新・OS X ハッキング! (94) pkgutilでインストーラパッケージを削除する マイナビニュース
上リンクでもスクリプトを用いてアプリケーションのアンインストールを行う方法を解説してはいますが、見る限りどうも怪しいです。 そこで、Rubyの勉強も兼ねて、pkgからインストールしたアプリケーションのアンインストールを行うpkgUninstaller.rbを作りました。 unasuke/pkgUninstaller
こちらでも動作のテストはしていますが、予期せぬシステムの破損やデータの消去が発生する可能性があります。実行は自己責任でお願いします。 まず、-sコマンドを用いてアンインストールするパッケージのIDを探します。部分一致で判定するので、メーカー名やアプリケーション名(アルファベット)を入力して下さい。 例
$ ruby pkgUninstaller.rb -s goo
shell(#<Th:0x007fcf090bc8b0>): /usr/sbin/pkgutil --pkgs
com.google.pkg.GoogleJapaneseInput
com.google.pkg.GoogleVoiceAndVideo
com.google.pkg.Keystone
お目当てのパッケージIDが見つかったら、-uコマンドでアンインストールを行います。まずは、–noopもつけて、実際にどのようなファイルやディレクトリが削除されようとしているのかを確認して下さい。 例
$ ruby pkgUninstaller.rb -u com.google.pkg.GoogleJapaneseInput -n
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/ReporterIcon.icns
中略
delete /Applications/GoogleJapaneseInput.localized
/Applications/GoogleJapaneseInput.localized is not empty.
delete /Library/Input Methods
/Library/Input Methods is not empty.
delete /Library/LaunchAgents
/Library/LaunchAgents is not empty.
delete /Applications
/Applications is not empty.
delete /Library
/Library is not empty.
160 files and 0 directories deleted.
ほにゃららis not empty.と書かれているディレクトリは、中身が空でないため削除されないディレクトリです。(実際の実行ではないため、本当に削除されないことを保証するものではありません)
それでは実際にアンインストールを行いますが、この時、管理者権限で実行しないとパッケージの情報の削除を行わないままファイルの削除がなされるため、えらいことになります。どんなことになるのかは僕も怖くてやったことがないのでわかりません。 例
$ sudo ruby pkgUninstaller.rb -u com.google.pkg.GoogleJapaneseInput
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputTool.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Localizable.strings
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
delete /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/Resources/English.lproj/Breakpad.nib
中略
delete /Applications/GoogleJapaneseInput.localized
/Applications/GoogleJapaneseInput.localized is not empty.
delete /Library/Input Methods
/Library/Input Methods is not empty.
delete /Library/LaunchAgents
/Library/LaunchAgents is not empty.
delete /Applications
/Applications is not empty.
delete /Library
/Library is not empty.
160 files and 52 directories deleted.
これでアンインストールが完了しました。それでも削除しきれないディレクトリなどが残ることがあるので、明らかに不要だと思われるものは手動で削除して下さい。
パッケージのIDを検索します。部分一致で検索します。
インストールされたファイルとディレクトリを削除します。
–unlinkオプションと併用した時、ファイルとディレクトリの変更、及びパッケージ情報の削除を行いません。最後に削除されたファイル、ディレクトリ数を出力しますが、これは–noopオプション無しの実行と必ずしも一致しません。
–unlinkオプションと併用した時、削除されるファイルとディレクトリの名前、ディレクトリが空かどうかなどの情報を出力しません。削除されたファイル、ディレクトリ数は出力します。
オプション一覧を出力します。
アンインストーラが付属する場合(virtualboxなど)は付属のそれを使って下さい。
といえば、「スナップ」が挙げられるでしょう。 スナップ - Microsoft Windows 画面の端にウィンドウを持って行くと、自動でウィンドウのリサイズを行ってくれる機能。これがMacでも使えたら……
Shiftitを使えば、スナップがMacでも使えるようになります。 検索すると、Google Codeのページを紹介しているサイトが多いですが、今はgithubに移っているようです。 ここからダウンロードしてインストールすれば動作します。更新が1年前なのが気になるけど。
controlとoption(alt)と⌘(command)と矢印などの同時押しでウィンドウのリサイズを行います。 コマンドはメニューバーのShiftitのアイコンをクリックすることで確認することができます。
Xcodeは補完の強力な、iOS開発には欠かせない素晴らしいIDEです。が、MacBookで使うとなると、どうしても気になってくるのが画面の狭さですね。
BBUDebuggerTuckAwayは、入力を開始するとデバッグエリアを自動的に隠してくれるソフトウェアです。
まず、適当なフォルダを作ります。~/workspaceでもなんでも。
$ mkdir ~/workspace
次に、githubのプロジェクトをコピーします。
$ cd ~/workspase
$ git clone https://github.com/neonichu/BBUDebuggerTuckAway.git
gitが入ってない場合やめんどくさい場合はgithubのDownload ZIPからZIPファイルをダウンロードして解凍すればまあ同じことです。ここからもダウンロードできます(Download ZIPへの直リンク)
そしたらフォルダ内の.xcodeprojファイルを開いて……
そしたらコンパイルしてXcodeを再起動すると……
このように、入力開始とともにデバッグエリアが自動的に隠れます。
vimが入っていないと、このようにインストールを促される。
これらのvimの違いはなんだろうか?
vim。
GUIのないvim。今欲しいのはこれじゃない。
コンパクトなvim。これも今欲しいものじゃない。ってかubuntu系ならデフォで入ってる。
ちょっとお引き取り願えますか。
うん。これが欲しかったんだ。
えっ、さっきのと何が違うん?
apt-cacheでそれぞれの違いを見てみよう。(少し整形) vim-gnome
Package: vim-gnome Priority: extra Section: editors Installed-Size: 2530 Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com Original-Maintainer: Debian Vim Maintainers pkg-vim-maintainers@lists.alioth.debian.org Architecture: amd64 Source: vim Version: 2:7.4.000-1ubuntu2 Provides: editor, gvim, vim, vim-lua, vim-perl, vim-python, vim-ruby, vim-tcl Depends: vim-gui-common (= 2:7.4.000-1ubuntu2), vim-common (= 2:7.4.000-1ubuntu2), vim-runtime (= 2:7.4.000-1ubuntu2), libacl1 (>= 2.2.51-8), libbonoboui2-0 (>= 2.15.1), libc6 (>= 2.15), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgnome2-0 (>= 2.17.3), libgnomeui-0 (>= 2.22.0), libgpm2 (>= 1.20.4), libgtk2.0-0 (>= 2.24.0), libice6 (>= 1:1.0.0), liblua5.2-0, libpango-1.0-0 (>= 1.14.0), libperl5.14 (>= 5.14.2), libpython2.7 (>= 2.7), libruby1.9.1 (>= 1.9.2.0), libselinux1 (>= 1.32), libsm6, libtinfo5, libx11-6, libxt6, tcl8.5 (>= 8.5.0) Suggests: cscope, vim-doc, ttf-dejavu, gnome-icon-theme Filename: pool/main/v/vim/vim-gnome7.4.000-1ubuntu2amd64.deb Size: 1084468 MD5sum: b6989046fc1929c55752133fc2f58417 SHA1: 776f256a6b7c2cb88d737e2006f4056456ca6266 SHA256: fd6f7bed4bfdaa13be8b24d3b738f309efb72b93818afd0effa047cc1530ec14 Description-ja: Vi IMproved - enhanced vi editor - with GNOME2 GUI Vim は、UNIX エディタ Vi のほぼ互換版です。 . 多くの新機能が追加されています: 多レベル undo、文法強調、コマンドライン 履歴、オンラインヘルプ、ファイル名補完、ブロック操作、畳み込み、Unicode 対応など。 . This package contains a version of vim compiled with a GNOME2 GUI and support for scripting with Lua, Perl, Python, Ruby, and Tcl. Description-md5: cd4a76134bce59404c52749b68c94208 Homepage: http://www.vim.org/ Description-md5: cd4a76134bce59404c52749b68c94208 Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu Supported: 9m
vim-gtk
Package: vim-gtk Priority: extra Section: universe/editors Installed-Size: 2526 Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com Original-Maintainer: Debian Vim Maintainers pkg-vim-maintainers@lists.alioth.debian.org Architecture: amd64 Source: vim Version: 2:7.4.000-1ubuntu2 Provides: editor, gvim, vim, vim-lua, vim-perl, vim-python, vim-ruby, vim-tcl Depends: vim-gui-common (= 2:7.4.000-1ubuntu2), vim-common (= 2:7.4.000-1ubuntu2), vim-runtime (= 2:7.4.000-1ubuntu2), libacl1 (>= 2.2.51-8), libc6 (>= 2.15), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgpm2 (>= 1.20.4), libgtk2.0-0 (>= 2.24.0), libice6 (>= 1:1.0.0), liblua5.2-0, libpango-1.0-0 (>= 1.14.0), libperl5.14 (>= 5.14.2), libpython2.7 (>= 2.7), libruby1.9.1 (>= 1.9.2.0), libselinux1 (>= 1.32), libsm6, libtinfo5, libx11-6, libxt6, tcl8.5 (>= 8.5.0) Suggests: cscope, vim-doc, ttf-dejavu, gnome-icon-theme Filename: pool/universe/v/vim/vim-gtk7.4.000-1ubuntu2amd64.deb Size: 1084618 MD5sum: 5a27b6e1f70a2848a0787e81d89fa57c SHA1: cbe534640d1977e77874776b92f1be93125019b1 SHA256: cfcb6c33b3dfa119d7fdc79a9397cb0493b172fc4748e280c28b840616a9dd4a Description-ja: Vi IMproved - 強化版 vim エディタ - GTK2 GUI 付き Vim は、UNIX エディタの Vi とほぼ互換のバージョンのエディタです。 . 多くの新機能が追加されています: 複数回のアンドゥ、構文の強調、コマンド ライン履歴、オンラインヘルプ、ファイル名補完、ブロック操作、畳み込み、 Unicode 対応など。 . 本パッケージには GTK2 GUI と、Lua や Perl、Python、Ruby、Tcl でのスクリプ ティングのサポート付きでコンパイルされたバージョンの vim が含まれます。 Description-md5: 2c68094b1efcc4728d91370c494d0111 Homepage: http://www.vim.org/ Description-md5: 2c68094b1efcc4728d91370c494d0111 Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu
よく見ないとわからないが、依存するライブラリで差が生まれている。 vim-gnomeのほうが依存するライブラリが多く、libbonoboui2-0 と libgnome2-0 と ibgnomeui2-0 がvim-gtkで必要なライブラリに加えてインストールされる。 (どれもGNOME関係のライブラリ)
KDEやxfceなどのgnome以外のウィンドウマネージャを使っているならvim-gtk gnome系ならどちらでもいい ……と思う。僕はvim-gtkにした。
ソケット通信でファイル転送その2を参考に、JavaのSocketを用いてテキストの送受信、ファイルの送受信を行うプログラムを作成した。 Java初心者なので「これはおかしい」「これはいくらなんでも変だ」「こんな書き方は許せない」などがあるのは許してほしい。
import java.io.*; //入出力ストリーム
import java.net.*; //socket
public class FileSendServer{
/************************定数宣言***********************/
public static final int INPUT_STREAM_BUFFER = 512; //入力ストリーム格納バッファサイズ
public static final int FILE_READ_BUFFER = 512; //ファイル読み込みバッファサイズ
//引数は使用しない
public static void main(String[] args){
ServerSocket servSock = null;
Socket sock; //socket通信
OutputStream outStream; //送信用ストリーム
InputStream inStream; //受信用ストリーム
FileInputStream fileInStream; //ファイルを読むためのストリーム
byte[] inputBuff = new byte[INPUT_STREAM_BUFFER]; //クライアントからのコマンド入力を受け取る
byte[] fileBuff = new byte[FILE_READ_BUFFER]; //ファイルから読み込むバッファ
String absolutePath = new File("").getAbsolutePath();
File file = new File(absolutePath); //カレントディレクトリでインスタンス作成
String[] fileList = file.list(); //カレントディレクトリのファイル名取得
Boolean hiddenFileFlag; //隠しファイルフラグ
Boolean lsFlag;
int recvByteLength;
//大きすぎるtryは身を滅ぼす
try
{
//6001番ポート
servSock = new ServerSocket(6001);
//ソケットに対する接続要求を待機
sock = servSock.accept();
//入出力ストリーム設定
outStream = sock.getOutputStream();
inStream = sock.getInputStream();
//コマンドの入力があった場合に行う処理(1文字以上読みこんだとする)
while( (recvByteLength = inStream.read(inputBuff)) != -1 )
{
//受け取ったbyte列をStringに変換(構文解析のため)
String buff = new String(inputBuff , 0 , recvByteLength);
//スペースで区切り格納し直す(sscanfのような)
String[] getArgs = buff.split("\\s");
/************************コマンド解析*********************/
//lsの場合
if( getArgs[0].equals("ls") )
{
//ファイル(フォルダ)数繰り返す
for( int i = 0; i < fileList.length; i++)
{
//String→byteに変換して送信
outStream.write( fileList[i].getBytes() );
outStream.write( "\n".getBytes() );
}
}
//getの場合
if( getArgs[0].equals("get") )
{
//受け取ったファイル名のファイルを読み込むストリーム作成
fileInStream = new FileInputStream(getArgs[1]);
int fileLength = 0;
//System.out.println("Create stream " + getArgs[1] );
//最大data長まで読み込む(終端に達し読み込むものがないとき-1を返す)
while( (fileLength = fileInStream.read(fileBuff)) != -1 )
{
//出力ストリームに書き込み
outStream.write( fileBuff , 0 , fileLength );
}
//ファイルの読み込みを終える
//System.out.println("Close stream " + getArgs[1] );
fileInStream.close();
}
//exitの場合
if( getArgs[0].equals("exit") )
{
//ストリームを閉じる
outStream.close();
System.out.println("close server");
break;
}
}
//ソケットやストリームのクローズ
//outStream.close();
inStream.close();
sock.close();
servSock.close();
}
//例外処理
catch( Exception e )
{
System.err.println(e);
System.exit(1);
}
}
}
サーバ側は6001ポートで接続を待機する。接続確認後はクライアントからのコマンド送信まで待機。 コマンドを受信すると、スペースごとに区切り、引数として格納。 コマンドがlsの場合、実行されているフォルダのファイルの一覧をクライアント側に送信。 コマンドがgetの場合、2つ目の引数に格納されているファイルをクライアント側に送信。 コマンドがexitの場合、クライアントからの入力待ちループを抜ける。 ループを抜けたらsocketを閉じて終了する。
import java.io.*;
import java.net.*;
public class FileRecvCliant{
/***************************定数宣言***************************/
public static final int INPUT_STREAM_BUFFER = 512;
public static final int FILE_WRITE_BUFFER = 512;
//引数として、サーバのIPアドレスとポート番号を要求する
public static void main(String[] args){
//引数エラー
if( args.length != 2 ){
System.err.println("argument error");
System.exit(1);
}
OutputStream outStream; //送信用ストリーム
InputStream inStream; //受信用ストリーム
FileOutputStream fileOutStream; //ファイルの書き込むためのストリーム
byte[] inputBuff = new byte[INPUT_STREAM_BUFFER]; //サーバからのls出力を受け取る
byte[] fileBuff = new byte[FILE_WRITE_BUFFER]; //サーバからのファイル出力を受け取る
String command; //キーボードからの入力を格納
int recvFileSize; //InputStreamから受け取ったファイルのサイズ
int recvByteLength = 0; //受信したファイルのバイト数格納
int waitCount = 0; //タイムアウト用
//キーボードからの入力受付
BufferedReader keyInputReader = new BufferedReader( new InputStreamReader(System.in) );
//tryが大きすぎる。訴訟も辞さない。
try
{
//ソケットのコンストラクト
Socket sock = new Socket( args[0] , Integer.parseInt(args[1]) );
//ソケットが生成できたらストリームを開く
outStream = sock.getOutputStream();
inStream = sock.getInputStream();
//ここからループ
while(true)
{
//コマンド入力を促す
System.out.print("cmd:");
//キーボードからのコマンド入力
command = keyInputReader.readLine();
//スペースごとにコマンドを区切る
String[] getArgs = command.split(" ");
//キーボードからの入力をそのまま送信
outStream.write( command.getBytes() , 0 , command.length() );
/************************コマンド解析***********************/
//lsの場合
if( getArgs[0].equals("ls") )
{
waitCount = 0;
//入力を文字列として表示
while( true )
{
//ストリームから読み込める時
if( inStream.available() > 0 )
{
//byte→Stringに変換して標準出力
recvByteLength = inStream.read(inputBuff);
String buff = new String( inputBuff );
System.out.print( buff );
}
//タイムアウト処理
else
{
waitCount++;
Thread.sleep(100);
if( waitCount > 10 )break;
}
}
}
//getの場合
if( getArgs[0].equals("get") )
{
//引数で指定されたファイルを保存するためのストリーム
fileOutStream = new FileOutputStream( getArgs[1] );
waitCount = 0;
//ストリームからの入力をファイルとして書き込む
while( true )
{
//ストリームから読み込める時
if( inStream.available() > 0 )
{
//受け取ったbyteをファイルに書き込み
recvFileSize = inStream.read(fileBuff);
fileOutStream.write( fileBuff , 0 , recvFileSize );
}
//タイムアウト処理
else
{
waitCount++;
Thread.sleep(100);
if (waitCount > 10)break;
}
}
//ファイルの書き込みを閉じる
fileOutStream.close();
//書き込み完了表示
System.out.println( "Download "+ getArgs[1] + " done" );
}
//exitコマンド入力でwhileループを抜ける
if( getArgs[0].equals("exit") )
break;
}
//ストリームのクローズ
outStream.close();
inStream.close();
}
catch(Exception e)
{
//例外表示
System.err.println(e);
System.exit(1);
}
}
}
クライアント側は引数として受け取ったIPアドレスとポート番号に対して接続要求をかける。 接続が確認されると、ユーザからのコマンド入力を待ち、スペースごとに区切り、引数として格納。 コマンドがlsの場合、受け取ったデータをStringとして標準出力に表示する。 コマンドがgetの場合、2つ目の引数に格納されているファイル名で受け取ったデータを保存する。 コマンドがexitの場合、ループを抜ける。 ループを抜けたらsocketを閉じて終了する。 入力はタイムアウト制とする。(InputStreamのreadメソッドの返り値として-1が吐かれるのはストリームが閉じた時であるため)
こんなしょぼいコードにライセンスもクソもあったもんじゃないがあえて言うならMITで。