[Mac] Homebrewの使い方

Homebrewとは

HomebrewはMac用のパッケージマネージャーです。ソースファイルをダウンロードしてきて、都度コンパイル&インストールを実施します。

似たようなもので有名なものにMacPortsなどがありますが、HomebrewはMacPortsとは異なり、あらかじめOSにインストールされているソフトを
極力利用するように設計されているため、MacPortsに比べて短時間で準備が完了します。

また、rubyで作成されているので、rubyが分かる人には設定ファイルなどが読みやすいという利点もあります。

Homebrewのインストール方法

インストールにはXcodeが必要ですので、あらかじめMac AppStoreからインストール(無料です)しておいて下さい。
Xcodeのインストールが出来ていれば、Homebrewのインストールは以下のコマンドを打つだけで完了します。

# ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

Homebrewの基本的な使い方

(例としてパッケージ名にemacsを指定しています。)

  • バージョンを確認する
$ brew -v
  • インストール可能なパッケージ一覧を表示する
$ brew search
  • パッケージをインストールする
$ brew install emacs
  • インストールされているパッケージ一覧を見る
$ brew list
  • インストール済みのパッケージを削除する
$ brew uninstall emacs
  • Homebrewに関する各種設定を確認する
$ brew –config
  • Homebrew自身のアップデート
$ brew update
  • インストール済みのFormulaで最新でないものを確認
$ brew outdated
  • インストール済みのFormula(パッケージ)を全て最新にアップグレードする
$ brew upgrade
  • 各Formulaに関する情報を表示
$ brew info emacs
  • 各Formulaの内容(インストール手順)を表示/変更するには
$ brew edit emacs

Homebrew Caskについて

Homebrew CaskとはGoogle Chromeなど主にバイナリで配布されていてインストールが面倒なソフトを素早くインストールするためのHomebrewの拡張コマンドです。

以下のコマンドを実行することで、cask拡張をHomebrewに追加することができます。

$ brew tap caskroom/cask

Homebrew Caskの使い方はCaskを使わない場合と似ています。

  • インストール可能なパッケージ一覧を表示する
$ brew cask search
  • パッケージをインストールする
$ brew cask install google-chrome
  • インストールされているパッケージ一覧を見る
$ brew cask list
  • インストール済みのパッケージを削除する
$ brew cask uninstall google-chrome
  • 各Formulaに関する情報を表示
$ brew cask info google-chrome
  • 各Formulaの内容(インストール手順)を表示/変更するには
$ brew cask edit google-chrome

Mac用のGoogle Chromeでオートコンプリートを一部削除する

Google Chromeを使っていると、フォームに入力した内容が勝手に記録されて、次回以降の同じフォームへの入力時には前回入力した内容が表示されて入力が楽になる「オートコンプリート」機能があります。

非常に便利な機能なのですが、間違って入力した場合に項目を消すにはどうすればいいのか分かりませんでした。

ググったところ、ChromeのサポートページにはShift+Deleteで削除できると書いてあったのですが、Macで同じように試しても削除できません。

調べたところ、Mac用のChromeの場合は、削除したいオートコンプリートの項目をカーソルキーで選択しておいてから、「shift – fn – delete」の組み合わせを押すと削除できました。

mysqlのログをlogrotateする

mysqlのログローテートで少しはまったのでメモしておきます。
mysqlではサーバーのエラーログの他にクエリーログやスロークエリーログなどがあり、これらを一日一回logrotateを用いてローテーションさせたいと思いました。

CentOSには /etc/logrotate.d/mysqld が用意されており、内容を確認すると、

# cat /etc/logrotate.d/mysqld
# This logname can be set in /etc/my.cnf
# by setting the variable "err-log"
# in the [safe_mysqld] section as follows:
#
# [safe_mysqld]
# err-log=/var/log/mysqld.log
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
# Then, un-comment the following lines to enable rotation of mysql's log file:
以下略

のように記載がありましたので、その通り実行しました。

まず、mysqladminを用いてflush-logsコマンドを実行するための専用ユーザー(reload)を作成します。

$ mysql -u root -p mysql
> GRANT RELOAD ON *.* TO 'reload'@'localhost' IDENTIFIED BY 'password';

次に、そのユーザーの情報を/root/.my.cnfに記載します。

# cat - > /root/.my.cnf
[mysqladmin]
user=reload
password=<secret>
^C
# chmod 600 /root/.my.cnf

最後に、/etc/logrotate.d/mysqld に次のように記載します。
(保存ファイル数などは目的に合わせて変更してください)

/var/log/mysql/mysqld.log /var/log/mysql/slow.log /var/log/mysql/query.log {
    daily
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    create 640 mysql mysql
    sharedscripts
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
            /usr/bin/mysqladmin ping &>/dev/null
        then
            env HOME=/root/ /usr/bin/mysqladmin flush-logs
        fi
    endscript
}

重要なのは

env HOME=/root/ /usr/bin/mysqladmin flush-logs

この部分で、パッケージインストール時点で用意されていたファイルには
env HOME=/root/
の記述がありませんでした。
logrotateはanacronから起動されるのですが、anacronは /etc/cron.d/0hourlyに記載された内容に従って、cronが/etc/cron.hourly/0anacronを読み込んで実行されます。
しかし、ここで /etc/cron.d/0hourly に

# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

HOME=/の記述があるために、rootユーザーのHOMEが/と認識されてしまいます。
/直下に.my.cnfを置くことでも対応可能でしょうが、上記のようにenvコマンドを用いることで対応できますので、今回はこのように記載しました。

gitで間違ってadd&commit&pushまでしてしまった時の対処方法

gitを使っていて、addしてcommitしてpushまでしてしまってから「しまった!」と気付いてcommitを無かったことにしたい場合があると思います。
この場合の対処方法をメモしておきます(要:gitサーバの管理権限)

まず、ローカルリポジトリの内容を取り消します。

$ git reset --hard HEAD^

–hardを用いることで、ローカルの変更内容が元に戻ります。変更内容を戻したくない場合は–softを使用しましょう。

で、この状態でgit logすると履歴が戻っているのが確認できますが、pushしようとすると

$ git push
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'hogehoge.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.

と言われてしまい、拒否されます。
このため、一旦サーバの内容を削除しちゃいます(笑)

$ git push origin :master
remote: warning: deleting the current branch To hogehoge.git - [deleted] master

もし、このコマンドに失敗する場合は、gitサーバ上の.gitconfigに次の設定を追加します。

[receive]
denyDeleteCurrent = warn

その後、再度pushします。

$ git push origin master
略
To hogehoge.git * [new branch] master -> master

以上です。
結構、危険なことをやってるので、慎重にやってください。

Macのアプリが利用しているフレームワークの調べ方

あるMacのアプリがどんなフレームワークを利用しているか調べたい時があると思います。
その場合は以下のようにすると、アプリが利用しているフレームワークが確認できます。

アプリが利用しているフレームワークの調べ方(例:iTunesの場合)

$ otool -L /Applications/iTunes.app/Contents/MacOS/iTunes

アプリのパッケージではなく、パッケージの中に含まれているプログラム本体を指定するのがコツです。

Yosemiteでosxfuseを起動しようとするとエラーが出た

YosemiteでHomebrewなどを使ってosxfuseをインストールしようとすると、インストールは成功しても、sshfsなどの起動時に以下のようなエラーが出てロードできません。

/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext failed to load – (libkern/kext) not loadable (reason unspecified); check the system/kernel logs for errors or try kextutil(8).
the OSXFUSE file system is not available (71)

ログを見ると以下のようなログも表示されます。

com.apple.kextd\[19\]: ERROR: invalid signature for com.github.osxfuse.filesystems.osxfusefs, will not load

どうも、Yosemiteからはカーネルエクステンション(Kernel EXTension)に開発者の署名が必要になったせいらしく、

$ sudo nvram boot-args="kext-dev-mode=1"

を実行して再起動するとOKみたいな記事を見かけますが、これだと今後怪しいドライバが勝手に組み込まれる恐れが出てきます。
ってことで、せっかくアップルがセキュリティーを向上させてくれているので、
ここは素直に osxfuse公式ホームページ からパッケージをダウンロードするのが得策だと私は思います。

追記:
HomebrewのCaskroomを使うと以下のようにosxfuseと一緒にsshfsまで簡単にインストールできます。

$ brew install Caskroom/cask/sshfs

mysqlのフルダンプファイルから特定のデータベースのみリストアする方法

mysqlのフルダンプしたファイルには全てのデーターベースの情報が含まれています。
cronなどで一定間隔でバックアップする際に便利ですが、開発中に一部のデーターベースの内容のみリストアしたい場合には困ると思います。

この場合は、一旦フルダンプファイルをcsplitを用いて、データベース単位で分割します。

$ csplit dump.sql /CREATE\ DATABASE/ {*}

これを実行すると、カレントディレクトリにデータベース単位にファイルが分割されますので、あとは目的のファイルをgrepなどで探して

$ mysql -u root -p データベース名 < ファイル名

などと実行すればOKです。