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の環境を作る
作り方
- MacにGaucheを入れる
- デバッグしやすいようにtraceを使えるようにする
- 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)からは使えなかった。
残念。
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)ルートドメインへのアクセスをサブドメイン付きにリダイレクトする
良い点: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分置きに自動実行します。
- Herokuから付与されるデフォルトURLに問い合わせを行い、現在のIPアドレスを取得する
- 取得した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