なぜMacを使うのか

いいモノ紹介ブログの記事「MacユーザーがMacを使う理由、WinユーザーがMacを使わない理由」を見てたら書きたくなりました。

Windows派、Mac派それぞれ言い分があるかと思いますが、ここでは普段使いのPCをWindowsから完全にMacにスイッチした僕の意見を書いてみようと思います。Windowsメインで使っていたのはWin95からWinVistaが出始めたころぐらいまでですので、Windows歴は10年ぐらいでしょうか。x86のCPUを搭載したMacMacOSX 10.5 Leopardが出てからMacにスイッチしました。ですので計算が正しければMac歴はたぶん5年程度。(もう結構経つな...)

いちおう家ではWindows XPのデスクトップも使ってます。

ユーザフレンドリインタフェース

なにかとわかりやすいです。最近のWindowsのコントロールパネルは複雑化しすぎている気がします。(Vistaになってインタフェースが変わったタイミングで僕がWindowsから離れてしまったというのもあるとは思います。)

  • 安定している。応答不能プロセスを殺す回数はWindowsより少ないかと思います。
  • 閉じてスリープしたノートPCを開いてから使えるようになるまでがとても短い。5秒ぐらいかな。
  • 無線接続機能AirMacのインタフェースがわかりやすい。SSIDを入れたらすぐつながるし、セキュリティもパスワードを入れるだけで簡単です。アクセスしやすいデスクトップ右上にあるのも電波状況がケータイのアイコンみたいにわかりやすく表示されている。無線LANをよく使う人には便利です。もちろん一度入れたSSIDは記録されます。
  • 英数入力/かな入力の切り替えがわかりやすい。半角/全角キーによるトグル方式では今どっちなのかわかりづらいと今では思います。
  • Expose/Spacesが便利。
  • フォントのレンダリングがキレイ。読みやすい。Windowsも、VistaからClearTypeというアンチエイリアス技術とメイリオという新フォントが投入されていますが、僕はMacの方がフォントは好きですね。コンソール用固定幅フォントのMonacoも大好きです。
  • Time Machineによる簡単でロバストなバックアップシステム。ある程度PC触ってる人なら上手にバックアップを取り、それをさらに上手に復元するのにはある程度のノウハウの蓄積が必要なのは理解してもらえると思います。Time Machineは全部自動でやってくれます。
  • 移行アシスタント。新しいMacを買ってきても、今の環境を完全に同じ状態として、ハードだけが置き換わった状態として移行できます。しかも簡単。Time Machineもそうですが、ユーザが日常の重要なシーンでPCを使っている、ユーザはPCを買い替えていく、という現代ではほぼ間違いないシチュエーションにユーザフレンドリなインタフェースでそれなりに満足のいくソリューションが用意されているのがいいですね。
  • Finderの「サーバに接続」がわかりやすい。他のMacのファイル共有やWindowsのファイル共有(Samba)など
  • 画面共有(リモートデスクトップ機能)がわかりやすい。クライアントサイドではサーバに接続やファインダーを使えば接続できる。
  • iPhotoとかiMovieとか使いやすい。
  • Pages(Wordっぽいもの)とかKeyNote(PowerPointっぽいもの)とかNumbers(Excelっぽいもの)使いやすい。手軽にキレイに文書作成できる。
    • スライドはKeyNoteじゃなきゃありえない!ぐらいのテンションの人が居ますが僕は機能自体はMS PowerPointの方がよいと思うのでPowerPoint使ってます。フォントのデフォルトをヒラギノ角ゴにすればだいぶそれっぽいかと思います。


Windowsの方が勝っていると思っている点も書きます。

  • 最小化/最大化ボタンの挙動はwindowsの方が好きです。
  • Alt + Tabの方がウィンドウ単位でアプリケーションを切り替えられるので場合によってはこちらのほうが便利かもしれません。MacでもWitchというアプリケーションを入れたら同じ挙動にはできるようですが僕はインストールしていません。
  • ホットキーによるメニューのアクセスなどは断然Windowsの方が多くアサインされており、キーボードでGUIアプリをサクサク操作できるのはWindowsの方が圧倒的に勝っているかと思います。この点は最初すごくイライラしていたのですが最近はターミナル上での生活が長くなってきたのであまり気にならなくなりました。

普通に使いそうな基本的なソフトが安い

OSXのメジャーバージョンアップも1万円しないですし、iWorkとかiLifeとか安いですよね。

UNIXである

MacOSXカーネルDarwinは由緒正しいUNIXの血筋を持つFreeBSDをベースに作られているので、UNIXのひとつと言って差し支えないかと思います。だからどうしたという話ですが、個人的には以下のようなメリットがあると思ってます。もちろんこれらがメリット足りうるのは自分自身がプログラマ、とくにオープンソースのソフトウェアを使ってシステムを構築する立場にある人間だというのが大きいとは思います。

  • オープンソースのソフトウェアがWindowsに比べて圧倒的にインストールしやすい。ただMac独自のファイルレイアウトなどにはなっているので、ソフト側で多少の差分吸収コードが書かれていないとFreeBSDLinuxでうごくものが100%無修正で動くことはまずないですね。しかし多少の修正でOSXでも動くなら、ということで多くのイケてるオープンソースのプロダクトはOSXをサポートしているように思います。これはオープンソースの開発者達の多くがMacを使っているから、といういい循環もあるような気がします。
  • ターミナルでbashをはじめ本格的なシェルが使える。Windowsコマンドプロンプトには戻れないですね。最近はPowerShellという次世代シェルがwindowsも搭載されたという話を聞いていますがどれほどのものかはよく知りません。
  • ターミナルのファイル操作コマンドもUNIX互換。サーバにファイルを送ったり、ファイルをリネームしたり、圧縮したりという作業もコマンドラインでできます。
  • サーバとして使える。古くなったMacbookとかMac Miniは静かなのでそのままサーバにできますね。共有の設定でチェックを入れればsshでの接続も可能。

このUNIXである、という性質はFreeBSDLinuxのサーバを日常的に利用している人にとってはオペレーションの互換性という意味で非常に魅力が大きいかと思います。オープンソース開発者の多くがMacを使ってるのもここが一番の理由じゃないかと思います。

デザインが美しい

これは主観的な趣味になるかと思いますが、やはり造形物としてきれいだと思います。Macbookに関しては入出力ポートの並びだけをとっても非常に美しいと感じます。全面がフラットなボディも好き。SONYVAIOとかもすごくデザインがんばってると思うんですが、なぜあんなに文字をプリントしてるのかよくわかりません。

ただBAD UIだと思うのはパームレスとの一番手前のエッジがきっかり90度で手首に食い込んで痛いところですね... この点が非常に気になる人にはMacbook Airがおすすめかと思います。

だめぽ

  • Windowsと比べてフリーソフトが少ない。僕も中学生〜高校生のころは毎日ベクターとかを見てフリーソフトを試しては吟味してました。しかし最近は本当に便利で評判のよいものを厳選して使うイメージでソフトを探してます。日常の中で必要な業務はごく少数のソフトで達成できてしまうので、ちょっとしたライフハックというか、日々の業務や操作を改善できるようなソフトを探してます。最近ではあんまり使ってなかったQuickSilverの代わりにAlfredというランチャーを入れてみました。WindowsではOrchisというランチャーソフトを愛用してます。
  • Finderで左ペインにツリー、右ペインにファイルリストというWindowsでおなじみの表示方法ができない。これは慣れの問題かとは思いますが。
  • 最近はAdobe Creative SuiteのメジャーアップデートはWindows優先になってしまいましたね。Mac版はまだ64bit対応ではないようですし...

まとめ

基本的にMac推しなエントリになってしまいましたが、要所要所でWindowsのフォローも入れたつもりです。はてなプログラマというかエンジニア多そうですし、Mac推しの人が多いのかな?Windowsガチ推しな人のエントリも読んでみたいですね。

注: 思いついたら勝手に追記します

かばんの中身

かばんの中身メモ。こうやって改めてリストしてみるとそのへんの女の子より下手したらいろいろ持ち歩いてるかもしれないな...

スタメン

開発/通勤

冬装備

  • マフラー...マフラーが必要な寒さのときはだいたいリュックの中でなく装着してるけど。
  • montbell フリース素材の指出し手袋...十分あったかい&一眼レフの操作がしやすい。
  • ニット帽...耳の寒さをカバー。最近はもういらない程度にあったかくなってきた。

MacOSX10.6でgroongaをソースからインストールする

全文検索エンジンgroongaをMacOSXにインストールする手順をメモ。環境はMacOSX10.6.6とgrooonga-1.1.0です。(MacPorts/Homebrewを使えばもっと楽にインストールできるかもです。一番最後の追記部分を参照してください。groongaの依存ライブラリについての理解を助けるためのメモとしてエントリの内容自体は残しておこうと思います。)

1.ソースを手に入れる

groongaはまだ始まって間もないプロジェクトですのでportなどではインストールできません。(homebrewは知りません...) groongaのソースを手に入れるにはgitリポジトリのmasterから取ってくるか、http://groonga.org/download/からパッケージングされたアーカイブをダウンロードするかのどっちかになります。

gitリポジトリから取得する(masterからcloneする)には以下のようにする。

$ git clone http://github.com/groonga/groonga.git

ソースをwebからダウンロードした場合は解凍するだけでOK

2. 依存ライブラリのインストール

groongaをまともに使うとなると形態素解析ライブラリMeCablibeventZeroMQMessagePackが必要です。MacPortsを使ってこれらを簡単にインストールすることができますが、私がやってみたところMeCabについてはエンコーディングがgroongaが想定しているUTF-8にならず、MeCabだけソースで入れたほうが良好に動作しました。(groongaコミッタの須藤さんが自分のぼやきをtwitterで発見してくださり、さらにユーザフレンドリな修正をgroonga本体にもあててくださいました。感謝。)

まずMecabを他のライブラリとは個別にソースからインストールします。MeCabのソースはMeCabのページのダウンロードのセクションからダウンロードできます。このエントリを書いている時点ではmecab-0.98.tar.gzとなってます。

これをサクっとconfigure > make > make installのいつもの流れでインストールします。

$ tar xvzf ./mecab-0.98.tar.gz
$ cd ./mecab-0.98
$ ./configure
$ make
$ sudo make install

/usr/local/bin/mecabが生まれますので、/usr/local/binにPATHを通してないとmecabとコマンドを叩いたときにcommand missingになるかと思います。

今インストールしたMeCabそのものは形態素解析のエンジン部分で、実際にわかち書きをさせるには形態素の辞書情報が必要なようです。この辞書にUTF-8を使うのが重要っぽいです。デフォルトではEUC-JPで辞書が構築されるようですが、configureオプションを付け加えてやることでUTF-8で構築させることができます。(MeCabのページの「高度な使い方」セクションを参照) ダウンロードする辞書セットのアーカイブMeCabのページのダウンロードのセクションにあるIPA辞書です。

$ tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install

とくにコンパイルっぽい処理はないのでconfigureもmakeもすぐ終わります。これでMeCabはバッチリインストールできているはずで、mecab -Dでcharsetがutf8になっていればOKっぽいです。


$ mecab -D
filename: /usr/local/lib/mecab/dic/ipadic/sys.dic
version: 102
charset: utf8
type: 0
size: 392126
left size: 1316
right size: 1316

これでMeCabのインストールはおしまい。

libevent, ZeroMQ, MessagePackはportでインストールしました。

$ sudo port install zmq msgpack libevent

簡単でいいですね。portしばらく使ってなかった人はsudo port selfupdateを実行してport treeを更新しておいたほうがいいかもしれないですね。

これでMeCab, libevent, ZeroMQ, MessagePackを用意できました。

3. configure

$ ./configure --with-mecab=/usr/local --with-libevent=/opt/local --with-message-pack=/opt/local --with-zmq=/opt/local 

もしかしたら--with-mecabはなくてもいけるかもしれません。configureが終わったら最後の方にちゃんと設定できているかの確認が出ますので、もろもろのライブラリがYesになってればOKかと思います。

4. make && make install

# groongaのソースディレクトリの中で
$ make
$ sudo make install

おしまい!

追記:

groongaチームの方でMacPortsのportsファイル?を準備してくださっているようでした!こちらを使うと簡単にインストールできそうですね。使い方のドキュメントも教えていただきました。こちらのドキュメントにHomebrewの場合:brew install groongaと書かれているのでHomebrewでも簡単にインストールできそうです。groonga始まりつつあるな!

githubを使い始めてみた

Webプログラマーを名乗るのにgithub使ったことないってのはちょっと恥ずかしい気がしたので今更ながらgithubを使い始めてみた。使い方の練習がてらProjectEulerのコードを公開するようのレポジトリを用意してみた。

https://github.com/tomotaka/ProjectEuler

結構手軽に使えるのにびっくり。UNIX系操作とgitに慣れてればかなり簡単にsocial coding開始できますね。Macだったらチュートリアルも充実してるし。

炎上するということ

インターネットはオフラインでの会話では自然にできる、「相手が怒っているようだな。態度を変えよう」というようなことができないメディアだなぁとつくづく感じる。Twitterは気楽にコミュニケーションできる楽しいメディアだと思うけど、いきなり話したことも無い人に偉そうとかその考え方はありえないとか、オフラインではまず起こらないようなことが平気で起きちゃうのはちょっと不思議だし、怖いなぁと思う。

なにか嫌なことがあったら王様の耳はロバの耳を叫ぶ専用のwebサービスもあるようなので、うまく自分自身で消化するように心がけたい。怒り狂っている人間を見て幸せになる人はまずいないと言っていいと思う。

王様の耳はロバの耳: http://lovamimi.com/ja

Rubyでハッシュ操作

配列の操作をまとめたので、ハッシュの操作もまとめておこうかなと思って書いてみた。基本的なデータ構造の扱いをマスターすることは日々のプログラミングのスピードアップに重要ですね。

リテラル

hash1 = { "key1" => "value1", "key2" => "value2" }
hash2 = { :key1 => "value1", :key2 => "value2" } # Railsでよく使われる書き方

# hash2は, Ruby1.9では以下のように記述できる(JavaScriptぽい)
hash2 = { key1: "value1", key2: "value2 }

Hashのキーにはどんなオブジェクトも使える。しかし格納するオブジェクトのクラスはeql?とhashメソッドをきちんと実装していないと結果的に使い物にならない可能性がある。Rubyの組み込みクラスの文字列、シンボルなどがキーとしてはよく利用されていると思われる。もちろん数値を使うこともできる。非常に疎な配列の代わりとしてHashを使うのはそういう意味では有効だろう。

値へのアクセス

値へのアクセスは配列と同じで[]を使う。Perlでは{}を使うので混同しないこと。複数のキーに対応する値の配列を取り出したいときはvalues_atを使う。

a = { "k1" => 10, "k2" => 20 }
p a["k1"] #=> 10
a["k1"] = 11
a["k2"] = 22

p a.values_at("k1", "k2")
my_keys = ["k1", "k2"]
p a.values_at(*my_keys) # a.values_at("k1", "k2")と同じ

ハッシュの大きさ

a = {"k1" => 10, "k2" => 20}
p a.size #=> 2
p a.length #=> 2 sizeの別名

後述するkeysを使ってa.keys.sizeでも正しい

キーの集合, 値の集合

a = {"k1" => 10, "k2" => 20}
p a.keys #=> ["k1", "k2"] 古いrubyでは順番は不定
p a.values #=> [10, 20] 古いrubyでは順番は不定
  • キーの集合(配列)を取り出すにはkeysを使う
  • 値の集合を取り出すにはa.valuesを使う

ハッシュの各キー/値ペアに対して処理を行いたい場合、a.keys.each{...などとして繰り返し処理を行ってもいいのだが、素直にHashクラスにeachといういてレータがあるのでそちらを使うのが楽である。

繰り返し

eachメソッドを使って内容を繰り返せる。

a = {"k1" => 10, "k2" => 20}
a.each do |key, value| # 新しいrubyでは代入した順にイテレートされる
  puts "key=#{key}, value=#{value}"
end

内容のクリア

clearメソッドを呼ぶとレシーバのハッシュの内容が空になる。

a = {"k1" => 10, "k2" => 20}
a.clear
p a #=> {}

フィルタリング

配列と同じようにselectとrejectが使える。delete_ifも。selectとrejectは非破壊的であり、条件に合致する新しいハッシュを生成して返す。

a = { :a => 1, :b => 2, :c => 3 }
p a.select{|k,v| v % 2 == 0} #=> 値が偶数のものを選択: {:b => 2}
p a.reject{|k,v| v % 2 == 0} #=> 値が偶数のものを排除: {:a => 1, :c => 3}
a.delete_if do |key, value|
  value % 2 == 0 # 偶数を削除してみる
end
p a #=> {:a => 1, :c => 3}

別のハッシュの内容をマージ

あるに、別のハッシュの内容を追加するには、mergeメソッドまたはmerge!メソッドを使います。ビックリマーク付きのメソッドはレシーバの変数の内容を書き換えますが、mergeメソッドはレシーバのハッシュと引数のハッシュをマージした新しいハッシュを返すのみで、レシーバは変更しません。

a = { :a => 1 }
b = { :b => 2 }
p a.merge(b) #=> { :a => 1, :b => 2 }
p a #=> #{ :a => 1 }
a.merge!(b)
p a #=> { :a => 1, :b => 2}

キーの存在確認

値がnilなキー/値のペアをセットした場合、デフォルトのHashインスタンスではキーに対応する値がない場合のデフォルト値がnilなので、[]メソッドの返り値がnilであるだけではキーが存在するかどうかが確認できないことがあります。そういう場合はkey?, has_key?, include?, member?の各メソッドを使います。どれも名前が違うだけで働きは一緒です。タイプ数が少ないのでkey?を使うと楽かもしれません。include?はArrayとの対応を考慮して存在しているのでしょうか。

a = { :a => 1, :b => 2 }
p a.key?(:a) #=> true
p a.key?(:b) #=> true
p a.key?(:c) #=> false