Mac環境構築メモ

経緯

MacBook Pro Retina 13' を購入。(もうすぐ新しいモデルが出そうなので、出ちゃったら悔しい・・・) 久しぶりにまっさらから構築することにしたのでメモ。

Ansibleを使う

Mac の開発環境構築を自動化する (2015 年初旬編) をとても参考にさせてもらってツール周りはセットアップした。

自分ものもgithubにpushした ojimac/macbook-provisioning

Homebrew Cask 未対応でApp Store.appから直接インストールしたアプリ

  • 050plus
  • DaisyDisk(Caskには入っていたが、インストールには失敗した...)
  • Duet(Caskには入っていたが、起動しない...)
  • EchofonLite
  • LINE
  • MenuMeters(El Capitan対応がまだだった)
  • Memory Clean
  • Pomodoro One
  • PopHub
  • Sunrise Calendar
  • ToyViewer
  • WiFi Explorer

その他

ターミナル

  • テーマをProへ変更
  • フォントサイズを13 -> 14に変更
  • カーソルをオレンジに(目立って分かりやすい)

システム環境設定

  • Energy Saver > Sleepしない設定に
  • Keyboard > Key Repeatを最大に
  • Keyboard > Delay Until Repeatを最大に
  • Keyboard > Modify keys > caps lockをcontrolに割り当て
  • Keyboard > Shortcuts > Keyboard > Move focus to next window のショートカットを alt + tab に変更する
  • TrackPad > タップでクリックになるようにする
  • TrackPad > Tracking speed タップでクリックになるようにする
  • Sharing > コンピュータの名前を設定(デフォルトだと、名前 + 's Macbook Proとかなってダサいので...)
  • Tabキーでボタンなど全てのコントロールへフォーカスを移動させる Keyboard > Shortcuts > All controls のラジオボタンにチェック

ショートカットキー

  • Spotlightのショートカットキー ⌘+Space を無効に。代わりにIMEの切り替えに割り当てる
  • Alfredの起動をCtrl + ;に設定

Finder

  • Preferences > Sidebar > All My Files とか iCloud Driveとか使わないもののチェックを外す
  • Preferences > Advanced > Show all filename extensions にチェックを入れる
  • View > Show Path Bar
  • View > Show Status Bar
  • 不可視ファイルを表示する
    • $ defaults write com.apple.finder AppleShowAllFiles -boolean true
    • $ killall Finder

ステータスバー

  • バッテリー残量%を表示

Alfred

  • 辞書.app と連携。d 調べたい単語 で辞書を引けるように。

開発環境周り

  • それなりのボリュームになりそうなので、別エントリに。

部屋の引っ越しすると荷物が整理されるように、Macも買い換えたタイミングで使ってないアプリや設定等を整理できて良いです :)

El Capitanでgem install pgでエラーになる時の対処

  • エラー内容
ERROR:  Error installing pg:
    ERROR: Failed to build gem native extension.

    /Users/ojimac/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151105-50418-1q1vjzw.rb extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/ojimac/.rbenv/versions/2.2.3/bin/$(RUBY_BASE_NAME)
    --with-pg
    --without-pg
    --enable-windows-cross
    --disable-windows-cross
    --with-pg-config
    --without-pg-config
    --with-pg_config
    --without-pg_config
    --with-pg-dir
    --without-pg-dir
    --with-pg-include
    --without-pg-include=${pg-dir}/include
    --with-pg-lib
    --without-pg-lib=${pg-dir}/lib

extconf failed, exit code 1
  • 以下のオプションをつけることで解決

$ ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install pg

WebエンジニアからiOSエンジニアへ #1

大分間があいてしまった…

直近の投稿を見なおしてみると、PythonRubyかで悩んでいましたが、それもつかの間 ここ半年ばかりは仕事でiOSアプリを作ることになり、やります!と手を挙げて、Obj-Cばかりやってます。

Titanium時代(2012/06~2012/08)

続きを読む

PythonのフレームワークDjango1.4のチュートリアル1章をやってみました

仕事で次のプロジェクトから使う言語をruby or pythonどちらにしようかという話になっています。

日本での盛り上がり方、情報量で言うとrubyだと思うのですが、pythonも海外では実績ありますし、 「やり方は1つ」という思想が継続して保守していかなければならないwebサービスに向いている感じがしました。

また、みんながやっているから自分も、という理由ではなく、自分なりに使ってみて結論を出したいところです。

ということで、pythonを勉強しつつ、ちょっとフレームワークを使って何か作ってみようということで一番メジャーっぽい Djangoを選んでチュートリアルをやってみました。

最新の1.4の1章をやってみたので残しておきます。

プロジェクト作成

$ django-admin.py startproject mysite

プロジェクトの初期構成

  • mysite/
    • manage.py <- コマンドラインツール
    • mysite/
    • \__init__.py <- pythonのパッケージでなくてはいけないもの!?
    • settings.py <- 設定ファイル
    • urls.py <- ルーティング定義
    • wsgi.py <- WSGIに準拠したウェブサーバを使う時のエンドポイント

開発用サーバ起動

$ python manage.py runserver
  • 8000番ポートでアクセス可能

使うポートを変える場合、

$ python manage.py runserver 8080

のようにすることで、8080番ポートでアクセス可能になる

DBのセットアップ

mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': '', # postgreSQL, mysql, sqlite3, oracle等々設定可能
        'NAME': '{sqliteファイルへのパス}'
        # sqlite3を使用する場合は、その他の設定は必要なし
    }
}

TimeZoneの設定

ここを参考に、

mysite/settings.py を変更

TIME_ZONE = 'America/Chicago'
↓
TIME_ZONE = 'Asia/Tokyo Japan'

※ これだとrunserverした時にエラーになった。。

TIME_ZONE = 'Asia/Tokyo'

が正解のようです。

INSTALLED_APPS

使用するモジュールの一覧!?

db作成

$ python manage.py syncdb

すると、ずらずらメッセージが出てくるので質問に答えていく。

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'ojimac'): {Enter}
E-mail address: {メールアドレス}
Password: {パスワード}
Password (again): {パスワード}
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

全部終わると、tableがもろもろ(auth_とかdjango_というテーブル名)出来ている。

モデルの作成

  • プロジェクトの中に複数アプリを作ることができる!?

ex) pollsアプリの作成

$ python manage.py startapp polls

polls/models.py を編集

from django.db import models

class Poll(models.Model): # django.db.models.Modelのサブクラスとしてモデルを定義する
    # フィールド名をモデルクラスにセットしていく
    poll   = models.ForeignKey(Poll)
    choice = models.CharField(max_length = 200)
    votes  = models.IntegerField()

モデルのアクティベーション

settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    ・
    ・
    ・
    'polls', # 追加する
)

djangoの思想として、プラガブルなこと。ここでつくったアプリは、他のプロジェクトでも使えるようにしているみたいです。

$ python manage.py sql polls

で、polls_poll, polls_choiceテーブルのCREATE文が発行される。

djangoの思想として、ちゃんとsqlを明示することが必要と考えているからこのようなコマンドを用意しているみたいです。

その後、

$ python manage.py syncdb

をすることで、polls_poll, polls_choiceテーブルが自動生成される。

APIを動かしてみる

$ python manage.py shell

で、python shellを立ち上げます。

>>> from polls.models import Poll, Choice # Poll, Choiceモデルを使えるようにする
>>> Poll.objects.all() # polls_pollテーブルを全件取得
[] # まだ何もデータがないので空が返ってきます

# レコードを追加してみます
# 時間を扱えるモジュールをインポート
>>> from django.utils import timezone
# questionカラムに"What's new?"を、pub_dateに現在時刻をセット
>>> p = Poll(question="What's new?", pub_date=timezone.now())
# insert
>>> p.save()
# この時点でIDは1
>>> p.id
1
# id=1のquestionカラム値
>>> p.question
"What's new?"
# id=1のpub_dateカラム値
>>> p.pub_date
datetime.datetime(2012, 5, 29, 0, 35, 25, 9851, tzinfo=)
# updateしてみる
>>> p.question = "What's up?"
>>> p.save()

Poll.objects.all()したときの出力

  <Poll: Poll object>

が見づらいので、

polls/models.pyに unicode メソッドを足します。

class Poll(models.Model):

    // snip
    
    def __unicode__(self):
        return self.question
        
class Choice(models.Model):

    // snip
    
    def __unicode__(self):
        return self.choice

すると、Poll.objects.all()の出力は、

Poll.objects.all()

    <Poll: What's up?>

のように見やすくなりました。

時間に関する便利関数を追加してみます。

import datetime
from django.utils import timezone
// snip

class Poll(models.Model):

    // snip

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

python shellから実行して結果を確認します。

$ python manage.py shell
>>> from polls.models import Poll, Choice
>>> Poll.objects.all()

# polls_poll.id = 1のレコードのみ取得
>>> Poll.objects.filter(id=1)

# questionカラムがWhatではじまるレコード取得
>>> Poll.objects.filter(question__startswith='What')

# pub_dateカラムが2012
>>> Poll.objects.get(pub_date__year=2012)

# id=2のレコードはないのでエラーになる
>>> Poll.objects.get(id=2)

# Poll.objects.get(id=1)と等価
>>> Poll.objects.get(pk=1)

# Pollモデルに実装したカスタムメソッドも動きます
>>> p.was_published_recently()

# 関連のあるデータのinsert
>>> p = Poll.objects.get(pk=1)
>>> p.choice_set.all()
# poll_id = 1のレコード追加
>>> p.choice_set.create(choice='Not much', votes=0)
# poll_id = 1のレコードもう1件追加
>>> p.choice_set.create(choice='The sky', votes=0)
# poll_id = 1のレコードもう1件追加
>>> c = p.choice_set.create(choice='Just hacking again', votes=0)

# cオブジェクトに関連のある(poll_id=1)のpolls_pollテーブルの値を抽出
>>> c.poll

# 関連のあるデータ取得
>>> p.choice_set.all()

# count(*)する
>>> p.choice_set.count()

# 関連のあるモデルのプロパティを条件にするには、
__(アンダースコア前後2つ)__
で取得可
>>> Choice.objects.filter(poll__pub_date__year=2012)

# deleteする場合
>>> c = p.choice_set.filter(choice__startswith='Just hacking')
>>> c.delete()

以上です。 2章に続きます。

wordpressのプラグイン、アップデートをssh経由で行う方法

wordpressプラグインをインストール、するには普通、ftpかサーバにログインして指定のディレクトリにプラグインを配置すると思います。 調べていたら、SSH経由でもプラグインのインストール、アップデートができることが分かったのでメモ。

libssh2, pecl ssh2のインストール

yum install libssh2
yum install libssh2-devel
pecl install ssh2-0.11.3

pecl ssh2を有効にする

vi /etc/php.d/ssh2.ini
extension=ssh2.so

を追加します。

SSH公開鍵を作って配置する

ssh-keygen 

その後、 authorized_keysにid_rsa.pubの内容を書きます。

Webサーバを再起動する

/etc/init.d/httpd restart

これで、

wordpress接続情報

のように、接続形式に「ssh2」が追加されれば成功です!