Mac買った日にやったこと

*大昔にかいて上げ忘れてたもの&かなり適当な自分用

久しぶりに新しいMacを使うことになったので環境構築をメモ
現在使ってるMacはSnowLeopardを少しづつアップデートしながらたどり着いた
Mountain Lionなので色々と新体験。

デスクトップまわり

日本語入力環境

システム環境設定>キーボード
左ペイン下の+ボタンを押して、日本語のことえりを 追加
これでcommand+space で日本語入力可能になる

 ##トラックパッドの設定などなど
トラックパッドの使い方はSnowLepard時代から染み付いてるので
「スクロールの方向:ナチュラル」とかいう不自然な動きの設定を外したり
やたらと指が増えてるジェスチャを調整したりなどする

mission controlを設定

複数のデスクトップを設定するやつ
3(4)本指上スワイプまたはF3キーでmission control 画面が出る 右上隅に+ボタンがあるので、それでデスクトップを増やす なんとデスクトップ毎に壁紙が設定できるようになってて驚く

マシン名の変更

システム環境設定>共有 でマシン名を設定

隠しファイル(ドットファイル)を表示する

$ defaults write com.apple.finder AppleShowAllFiles -boolean true
ファインダー再起動
$ killall Finder

アンチウイルスソフト

clamXavのインストール
http://www.clamxav.com/download.php

clamXavで監視するフォルダ
http://nya-0.hatenablog.com/entry/2014/04/19/172322

開発環境など

xCodeのインストール

AppStore から普通にいれる

command Line tools をいれる

xCodeを立ち上げて xCode > OpenDeveloperTool > MoreDeveloperToolsを選択
ブラウザが開いてDeveloperPageに飛ばれされる
そこからcommandLineToolをDLしてインストール

homebrewをいれる

commandLineToolを入れ終わったらTerminalに以下をうつ
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

Gitをいれる

システムインストールされてるのでもいいが、.bashrcまわりの設定と動作確認を含めて 。
$ git --version
git version 2.0.4

最新のgitをいれる
brew brew install git

.bashrcに以下を追記
alias git="/usr/local/Cellar/git/2.0.4/bin/git"

反映して確認
$ source ~/.bashrc
$ git --version
git version 2.0.4

Terminal起動時に自動で.bashrcの設定を読み込むようにする

~/.bash_progfileに以下を設定する

# Terminal起動時に.bashrcを自動で読み込む  
if [ -f ~/.bashrc ] ; then  
. ~/.bashrc  
fi  

VIM

MacVIM-Kaoriya をいれる

ここからいれる
https://github.com/splhack/macvim/releases/tag/20140805

カラーテーマいれる

この色が好き
https://github.com/vim-scripts/phd
カラースキーマを配置する $ mkdir ~/.vim
$ mkdir ~/.vim/colors
$ mv hoge/phd.vim ~/.vim/colors/phd.vim
vimに設定する(.gvimrcに書く)

colorscheme phd  
set transparency=25

Python環境を作る

pipいれる

システムインストールされてるpythonのpip $sudo easy_install pip

pyenvをいれる

brew install pyenv

pyenv-virtualenvをいれる

brew install pyenv-virtualenv

.bashrcにpyenvを読むよう追記する

#pyenv settings
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

DL可能なpython環境確認

$ pyenv install -l

今回は2.7.8を使う

$ pyenv install 2.7.8
$ pyenv rehash <--大切

pythonのバージョンを指定してenv環境を作る

$ pyenv virtualenv 2.7.8 myTestEnv
envはpipもインストールされる

入れたpythonや作ったenv環境を消すのは以下

$ pyenv uninstall 2.7.8
$ pyenv uninstall myTestEnv

現在利用可能な環境一覧

$ pyenv versions
env環境も,pythonも並列で出るのがちょっと違和感

作った環境を任意の作業ディレクトリ配下に適用する

cd some_pjt_dir
pyenv local myTestEnv ディレクトリに対してmyTestEnv環境が適用されるので
$ workon someenv みたいなコマンドをいちいち打たなくてよい

iPythonいれる

さんこう http://kronus9.sblo.jp/article/72392674.html

Apache

参考(というか9割型そのまま);http://henry.animeo.jp/blog/2013/11/02/web-development-environment-on-mavericks/

アパッチをOS起動時に立ち上がるようにする

アパッチを自動起動するようにしておく
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
再起動する
$ sudo apachectl restart

SSLで通信できるようにする

証明書を作成する

$ sudo mkdir /etc/apache2/ssl
$ cd /etc/apache2/ssl
$ sudo ssh-keygen -f server.key パスフレーズは空でOK
$ sudo openssl req -new -key server.key -out request.csr Common Nameをlocalhostにする。その他は適当に。
$ sudo openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt

/etc/apache2/httpd.confの編集

$ sudo vim /etc/apache2/httpd.conf
490行目からはじまる以下を編集する

# Secure (SSL/TLS) connections
#Include /private/etc/apache2/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.

上記で、
#Include /private/etc/apache2/extra/httpd-ssl.conf
がコメントアウトされてるので、それを外す。
Include /private/etc/apache2/extra/httpd-ssl.conf

/etc/apache2/extra/httpd-ssl.confの編集

sudo vim /etc/apache2/extra/httpd-ssl.conf

110行目あたりから始まる以下を編集する

#   Server Certificate:
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP will prompt again.  Keep
#   in mind that if you have both an RSA and a DSA certificate you
#   can configure both in parallel (to also allow the use of DSA
#   ciphers, etc.)
#   Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
#   require an ECC certificate which can also be configured in
#   parallel.
SSLCertificateFile "/private/etc/apache2/server.crt"
#SSLCertificateFile "/private/etc/apache2/server-dsa.crt"
#SSLCertificateFile "/private/etc/apache2/server-ecc.crt"

上記の下記を SSLCertificateFile "/private/etc/apache2/server.crt"
以下のように書き換える
SSLCertificateFile "/private/etc/apache2/ssl/server.crt"

125行目あたりから始まる以下を編集する

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
#   ECC keys, when in use, can also be configured in parallel
SSLCertificateKeyFile "/private/etc/apache2/server.key"
#SSLCertificateKeyFile "/private/etc/apache2/server-dsa.key"
#SSLCertificateKeyFile "/private/etc/apache2/server-ecc.key"

上記の下記を SSLCertificateFile "/private/etc/apache2/server.crt"
以下のように書き換える
SSLCertificateFile "/private/etc/apache2/ssl/server.crt"

これでSSLで叩けるようになる

PHPを動くようにする

PHPmyAdminを使いたいので

Apacheの設定

$ sudo vim /etc/apache2/httpd.conf
118行目あたりにある、以下のコメントアウトをはずす
LoadModule php5_module libexec/apache2/libphp5.so

PHPの設定

MySQLまわりは、後述のMySQLのところで設定するので、とりあえずタイムゾーンだけ
date.timezone = Asia/Tokyo

仕上げにアパッチ再起動して動くことを確認する
$ sudo apachectl restart

MySQL

MySQLをいれる

このページの通りにしたらよい
http://slackhack.net/186.html

phpMyAdminをいれる

めんどいからここまで

nympyで距離を計算する

numpyのインストール

pipで普通に入る

pip install numpy  

ベクトルの距離を計算するサンプル

サンプルコード

5つのベクトルデータpoint1~point4とindataの距離を測定して出力する

#sample.py
import numpy


class Excercise:
    point0 = [0, 1, 1, 1, 0,
              1, 0, 0, 0, 1,
              1, 0, 0, 0, 1,
              1, 0, 0, 0, 1,
              0, 1, 1, 1, 0]

    point1 = [0, 0, 1, 0, 0,
              0, 0, 1, 0, 0,
              0, 0, 1, 0, 0,
              0, 0, 1, 0, 0,
              0, 0, 1, 0, 0]

    point2 = [0, 1, 1, 1, 1,
              1, 0, 0, 1, 0,
              0, 0, 1, 0, 0,
              0, 1, 0, 0, 0,
              1, 1, 1, 1, 1]

    point3 = [0, 1, 1, 1, 0,
              1, 0, 0, 0, 1,
              0, 0, 1, 1, 0,
              1, 0, 0, 0, 1,
              0, 1, 1, 1, 0]

    point4 = [0, 0, 1, 0, 0,
              0, 1, 0, 0, 0,
              1, 0, 0, 1, 0,
              1, 1, 1, 1, 1,
              0, 0, 0, 1, 0]

    points = [point0, point1, point2, point3, point4]

    @classmethod
    def eg1(cls):
        indata = [0, 0, 0, 1, 0,
                  0, 0, 0, 1, 0,
                  0, 0, 0, 1, 0,
                  0, 0, 0, 1, 0,
                  0, 0, 0, 1, 0]

        distances = {}
        for i, p in enumerate(cls.points):
            dis = numpy.linalg.norm(
                numpy.array(p) - numpy.array(indata)
                )
            distances[i] = dis

        return distances


if __name__ == '__main__':
    ans = Excercise.eg1()
    print ans

結果

point4とindataの距離が一番近いことが分かる

$ python sample.py
{0: 3.6055512754639891, 1: 3.1622776601683795, 2: 3.4641016151377544, 3: 3.3166247903553998, 4: 3.0}

MacにGaucheの環境を作る

作り方

  1. MacにGaucheを入れる
  2. デバッグしやすいようにtraceを使えるようにする
  3. VimからGaucheを叩けるようにする

1.Gaucheのインストール

homebrewで入る
brew install gauche  
インストール後は、コマンドライン上で以下のように使う
$ gosh ;goshに入る  
gosh> (+ 1 2)  
3
gosh> (exit) ;goshから出る

2.Debug用にトレースを入れる

slibのインストール

slibがhomebrewに無いので自分で頑張る

cd ~  
mkdir tmp  
cd tmp  
  
curl -O 'http://groups.csail.mit.edu/mac/ftpdir/scm/slib-3b4.zip'  
unzip slib-3b4.zip  
  
mv slib /usr/local/  
cd /usr/local/slib  
  
./configure  
make  
sudo make install  
traceの使い方
;テスト用関数定義  
(define (inc x) (+ x 1))
(define (dec x) (- x 1))
(define (plus a b)
 (if (= a 0)
     b
     (inc (plus (dec a) b))))

; traceを設定する
(use slib)
(require 'trace)
(trace plus)

;traceを出力する
(print (plus 4 5))
CALL plus 4 5
  CALL plus 3 5
    CALL plus 2 5
      CALL plus 1 5
        CALL plus 0 5
        RETN plus 5
      RETN plus 6
    RETN plus 7
  RETN plus 8
RETN plus 9
9

参考にした記事
Scheme処理系のインストールとデバッグトレース - somemo's diary
404 Blog Not Found:scheme - traceとslib

3.VimからGaucheを叩けるようにする

vimすら怪しい私がEmacsにまで手を広げられるわけないのでvimからGaucheを叩くためのプラグインを入れる。 NeoBundleを使ってインストールするので、.vimrcに以下を書く

" gaucheを呼ぶまではロードしない
NeoBundleLazy "git://github.com/aharisu/vim_goshrepl.git", {
       \ "autoload": {
       \   "commands": ['GoshREPL', 'GoshREPLWithBuffer'],
       \}}
vmap <CR> <Plug>(gosh_repl_send_block)
let s:hooks = neobundle#get_hooks("vim_goshrepl")
  function! s:hooks.on_source(bundle)
    let g:gosh_buffer_direction = 'v'    "垂直分割でバッファを開く
    let g:gosh_buffer_width = 80        "バッファの横幅は80文字
  endfunction
主なコマンドは以下

GoshREPL -> gosh REPLを起動
GoshREPLWithBuffer -> バッファを読見込んでREPLを起動
特にGoshREPLWithBufferは便利
コードが書かれたファイルをvimで開いてから、GoshREPLWithBufferするとファイルで定義しておいた関数などがREPL上で使える

なお、GoshREPLWithBufferはMacVim(Kaoriya)からは使えなかった。
残念。

参考にした記事
Vim上でGaucheのREPLを動かす - aharisuのごみ箱

Herokuでネイキッドドメイン(ルートドメイン)を利用する方法

要約(書いてたらやたら長くなったので)

Herokuではネイキッドドメイン(ルートドメイン)使えないので、使えるようにするツール作りました。
IP-Updater-For-Heroku

利用にはDozensのアカウント(基本無料)が必要です。

Herokuで設定されるデフォルトURLは嫌だ

Heroku上でアプリケーションを作成すると、下記のようなドメインが与えられます。 例)hogeapp.herokuapp.com
hogeapppの部分は自分で決めたアプリ名が入る。
せっかくサービス作ったんだか、独自ドメインを付けたくなるのが人情ですよね。

Herokuではネイキッドドメインを使えない

Herokuではカスタムドメインを設定可能ですが、ネイキッドドメインを使うことができない

お名前ドットコムとかムームードメインあたりでドメイン取得して設定するだけです。
ただし、Herokuではネイキッドドメイン(ルートドメイン)の利用はサポートされていません。

Zone apex domains (aka “naked”, “bare” or “root” domains), e.g., example.com, using conventional DNS A-records are not supported on Heroku. https://devcenter.heroku.com/articles/custom-domains[1]

つまり 、、、

  • www.my-domain.com
    これは簡単に設定できます(サブドメイン付きなので)
  • my-domain.com
    これはネイキッドドメインなのでサポート対象外

なぜネイキッドドメインが使えないか

ネイキッドドメインが設定できない理由は、HerokuがDNSのAレコードに設定するためのIPアドレスを公開していないからです。
(昔は3つぐらいのIPアドレスを公開してたが、現在は公開してない)

昔のブログ記事などでHerokuが公開しているIPアドレスをAレコードに〜というモノがあります。 が、現在では使えない手法なので注意です。

とはいえ、自分のサービスにネイキッドドメインを使いたくなるのが人情なので、以下はHerokuでネイキッドドメインを使う方法を紹介します。

Herokuでネイキッドドメイン(ルートドメイン)を使う方法

1)Dozensを使ってネイキッドドメイン設定する

Dozensを利用してHeroku上のアプリでネイキッドドメインを有効にするためのスクリプトを書いてみました。Heroku上で動くタイマー仕掛けのアプリです。
IP-Updater-For-Heroku
Config.pyを編集して、そのままHerokuにデプロイするだけで、ネイキッドドメインが有効になります
Dozenzのアカウントは事前に取得が必要です。またAレコード以外はDozenzの管理画面で設定してください

良い点:ネイキッドドメインをメインURLに設定できる。無料でできる
悪い点:自動更新用アプリをHerokuにデプロイするなど一手間かかる

以下にある2と3は、Heroku公式に掲載されているネイキッドドメイン利用方法です。が、どうも決め手にかけます。ので、自分でスクリプトを書いたわけですが。。

2) CNAMEぽくAレコードを設定できるDNSサービスを利用する

CNAME functionality at the apex

良い点:お手軽にネイキッドドメインが使えるようになる!
悪い点:お金がかかります

リンク先のDNSサービスを利用すると、IPアドレスが不明でもCNAMEぽくAレコードを設定可能です。ただ、微妙に有料だったりするので、もう1歩感があります。

3)ルートドメインへのアクセスをサブドメイン付きにリダイレクトする

Subdomain redirection

良い点:DNSにサクっとレコード追加するだけでお手軽です
悪い点:メインのURLはサブドメイン付きになります

URLやForwardというレコードを設定できるDNSサービスを利用している場合は、ルートドメインへのアクセスを301でサブドメインにリダイレクトすることができるようです。
こんな感じで設定するようです。

Record Name Target
URL or Forward example.com www.example.com.
CNAME www example.herokuapp.com.

これで、ルートドメイン(example.com)を叩いても繋がるようにはなります。
ただ、結局はサブドメイン付きのwww.example.comへリダイレクトしているだけなので
メインURLをネイキッドドメインにしたいという希望とは違う気がします。

IP-Updater-For-Herokuの仕組み

基本的には、公式から出ているipserver-updaterをPythonで書き直しただけです。Herokuでの利用を想定しています。

具体的には、以下の作業を20分置きに自動実行します。

  1. Herokuから付与されるデフォルトURLに問い合わせを行い、現在のIPアドレスを取得する
  2. 取得したIPアドレスを利用してDozenzにAレコードを設定する

自動実行させるクーロン的な動きをさせるのは、このあたり参考にしました。APScheduler使っています。

Swiftではclassにstatic変数が定義できない

struct, enumであれば、staticなpropetyがかけるけどclassはダメらしい。 computedなpropertyは書ける。

struct SomeStructure {
    static var storedTypeProperty = "Some Struct value."
    static var computedTypeProperty: Int {
        return 1+1
    }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some Enum value."
    static var computedTypeProperty: Int {
        return 2+2
    }
}

class SomeClass {
    //class var ThisIsError = 10
    class var computedTypeProperty: Int {
        return 3+3
    }
}

inoutを使ったfunctionを利用してxcode6を落とす方法

落とすというか、落ちるんだけど。

コレは落ちない

func addTwoInts(a: Int, b: Int) -> Int {  
    return a + b  
}  
var mathFunction: (Int, Int) -> Int = addTwoInts  

inoutを入れると落ちる

func addTwoInts(inout a: Int, b: Int) -> Int {  
    return a + b  
}  
var mathFunction: (inout Int, Int) -> Int = addTwoInts  

Swiftのfallthroughはcaseの条件を評価してくれない

Swiftのswitch文は、どれかcaseに入ると後続のcaseは評価されずにswitch文を出る。

各case毎に暗黙的にbreakが書いてあるのと同じ挙動。

ただ、中には複数のcaseを実行したい場合もあるので、逆break的な意味でfallthroughが用意されている。

ところが、このfallthroughは、本当に直下のcaseをトリガするだけでcaseの条件を評価してくれない。C言語の人には普通らしいけど、なんか違和感。

 

let integerToDescribe = 5
var description = ""
switchintegerToDescribe {

case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " 海"
    fallthrough

case 5:
    description += " ねこ"
    fallthrough

case 6:
    description += " いぬ"
    fallthrough

default:
    description += " "
}

出力:海 ねこ いぬ 山

 

 

C言語的な挙動らしいけど、C言語知らないので、よく分からない。

“NOTEThe fallthrough keyword does not check the case conditions for the switch case that it causes execution to fall into. The fallthrough keyword simply causes code execution to move directly to the statements inside the next case (or default case) block, as in C’s standard switch statement behavior.”抜粋:: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l