2012-10-25

iPad mini対応は何もやらなくてOK

最近ようやく自作のアプリのいくつかをiPadに対応させました。たとえば一挙に韓国語翻訳などです。
新たにiPad miniなるものが世に出るということで、これの対応も考えなくてはいけないのかと思って、Mac App StoreでXcodeのアップデートを確認して見ましたが、リリースはありませんでした。

これからアップデートがあるかもしれないと思って調べてみたのですが、どうやらiPad mini対応をする必要はまったくなさそうです。シミュレータは新しいのが出るでしょうが、Xcodeの更新はないでしょう。
なぜかというと、iPad miniは画面のサイズがこれまでよりも小さい7.9インチになるものの、画素数はiPad 2と同じ1024×768ドットだからです。つまり、ボタンなどのコントロールや文字がちょっと小さく表示されるだけで、他は従来のiPadなんら変わるところはないということになります。これまで動いていたプログラムは、少しちいさくなった画面の中でまったく同じように動くことでしょう。

2012-10-12

DjangoにDBのマイグレーションを行うプラグインを入れる

Djangoで manage.py syncdb をした場合、すでに存在するテーブルについては何も変更されません。models.pyをいじってスキーマを変更しても、それがDBに反映されません。
そこで、マイグレーションを行うプラグインの出番となります。どうもSouthが定番のようなので、これを入れます。

$ sudo pip install South

インストールに成功したら、settings.py を若干変更します。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', #自作のアプリ
    'south', #southをインストールする
    )
個人的な趣味としては、
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "south_migrations"))
SOUTH_MIGRATION_MODULES = {
    'myapp': 'migrations.myapp',
}
という具合にして、マイグレーションのときに生成されるファイルが、プロジェクトのディレクトリの外につくられるようにしておくのがいいと思います。その方が、ローカルのプロジェクトをサーバー上にあげるときに都合がいいからです。

settings.py の編集が終わったら、普通に、manage.py syncdb をします。これによって、southが利用するDBのテーブルがつくられます。SOUTH_MIGRATION_MODULESを明示的に指定した場合は、親となるモジュール(上記の例ではmigrations)が存在しないとエラーになるので、ここでつくっておきます。ここまでできたら、

$ python ./manage.py convert_to_south myapp

を実行します。これにより、既存のアプリをsouthで管理するように設定できます。今後、モデルに変更があった場合は、

$ python ./manage.py schemamigration myapp --auto
$ python ./manage.py migrate myapp

とやれば、たいていはsouthが何とかしてくれるはずです。

2012-10-06

CentOSにPostgreSQLをインストール

yumでインストールします。
$ sudo yum -y install postgresql-server
依存関係により、

  • postgresql-server
  • postgresql-libs
  • postgresql-server

の3つがインストールされることになります。現在はバージョンは、8.4.13-1.e16_3です。

これでインストールはできているのですが、データベースサーバーが起動していないので、まだ利用することはできません。最初の起動のため、次の2つコマンドを打ちます。
$ sudo service postgresql initdb
$ sudo service postgresql start
ここで、initdbをせずにpostgresqlを起動しようとすると、次のようなエラーになります。
/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
                                                           [失敗]

CentOSを再起動したときにpostgresqlも自動的に起動されるように設定しておきます。
$ sudo chkconfig postgresql on

これでデータベースサーバーの起動はOKです。後は、ユーザーの設定を行います。
PostgreSQLのインストールと同時にpostgresというユーザーがつくられるようです。
$ id postgres
uid=26(postgres) gid=26(postgres) 所属グループ=26(postgres)
このユーザー "postgres" にパスワードを設定します。
$ sudo passwd postgres
パスワードが設定できたら、ユーザーを変更します。デフォルトでは、Ident認証という方式で認証を行うため、CentOSのユーザーとPostgreSQLのユーザーが一致していないとエラーになるようです。
$ su - postgres
後は、createdbでデータベースを作成したり、 psqlで接続したりできます。

Ident認証ではなく、パスワード認証に変更したい場合は、postgresqlにユーザーを追加した後で、設定を変更します。
postgresユーザーでパスワード認証を行いたい場合は、次のようにしてパスワードを設定します。
ALTER  USER  postgres  WITH PASSWORD  'newpassword';
という具合です。postgresユーザーは最初から存在するのでALTER USERですが、新規ユーザーを追加するのであれば代わりに、CREATE USER文を使います。

パスワード認証を行うためには、DBの設定も変更する必要があります。設定ファイルなどは、たいてい「/var/lib/pgsql/data/」以下にあるようです。今回修正するのは、
/var/lib/pgsql/data/pg_hba.conf
というファイルです。「local    all    ident」という行をコメントアウトして「local    all    password」を追加します。
#local   all         all                               ident
local   all         all                               password
これでパスワードで認証することができます。たとえばユーザーがpostgresのときに、
psql  -U  postgres
とやれば、postgresユーザーで接続できます。


DjangoからPostgreSQLに接続する場合は、データベースの設定に、django.db.backends.postgresql_psycopg2を指定します。さらに次のコマンドで必要なモジュールをインストールしなくてはいけません。
$ sudo yum -y install python-psycopg2

2012-10-04

DjangoでImageFieldやFileFieldが空でないか調べる

たとえば、次のようなモデルがあったとします。
class MyModel(models.Model):
    thumbnail = ImageField(upload_to="path", null=True, blank=True)

ここで、ImageFieldにファイルがセットされているかどうか見分けて処理を切り替えたい場合の判定方法ですが、単に、
m = MyModel.objects.get(id=1)
if m.thumbnail:
    file_is_set() #ファイルあり
else:
    file_is_empty() #ファイルが空
という具合に判定すればOKなようです。

2012-10-03

ローカルなプロジェクトを元に共有gitレポジトリを作成する

ローカルに作業していたプロジェクトを管理するgitレポジトリをリモートサーバー上につくるには次のようにします。

まず、サーバー側に、空っぽのgitレポジトリを作成します。
mkdir repo.git
cd repo.git
git init --bare --shared

プロジェクトをローカルでもgitで管理していなかった場合は、git initをしてから、サーバーにデータを転送します。
cd <path_to_project>
git init
git add .
git commit -m "initial commit"
git remote add origin <username>@<host>:<path>/repo.git
git push -u origin master
みたいな感じにやります。リモートサーバーにはsshで接続するので、「<username>@<host>」の部分は、sshのときと同様にユーザ名とホスト名を指定します。「<path>/repo.git」には、先ほどつくったgitレポジトリへのパスを指定します。
pushするときに「-u」を指定していますが、これは、次回から「git push」だけで「git push origin master」と同じことを実行できるようにするためのものです。

上記は、gitレポジトリをローカルに新規作成する場合ですが、場合によってはすでにgitでプロジェクトを管理しているかもしれません。この場合は、
git remote -v
とやって、originが設定されているか調べます。originに関する情報が何も出力されなければ、上と同じくgit remote addをすればよいです。しかし、どこかからcloneしたレポジトリの場合は、
origin xxx.git (fetch)
origin xxx.git (push)
というような表示で、originに関する情報が表示されます。この場合は、すでにoriginが設定されているので、
次のようにしてoriginを書き換えます。
git remote set-url origin <username>@<host>:<path>/repo.git
これでoriginが正しく設定されるので、後は
git push -u origin master
を実行すればよいです。

さくらVPS512をセットアップ

昔の書きかけのメモです。いまは、さくらVPS512というプランは無いと思います。

---

当時のさくらの標準のOSは、CentOS 6.2 x86_64 です。git1.7 、python2.6がすでに入っています。

とりあえず、
yum -y update
します。

ユーザーを追加します。「myaccount」の部分がユーザー名です。
adduser myaccount
passwd myaccount
usermod -g apache myaccount

visudo で
myacount ALL=(ALL) ALL
を追加します。

djangoをapacheで動かせるように、mod_wsgiをインストールします。
yum install -y mod_wsgi

pipも、yumでインストールできるようです。
yum install -y python-pip
ただし、yumでインストールした場合は、「pip」ではなく「pip-python」というコマンドを使うことになるようです。

次に、memcachedと、python用のライブラリをインストールします。
yum install -y memcached
yum install -y python-memcached


/etc/httpd/conf/httpd.conf
を編集します。



yum -y update
yum install -y mod_wsgi
yum install -y python-pip
yum install -y memcached
yum install -y python-memcached

とりあえず、この時点でどのようなデーモンが入っているかを調べてみます。
$ chkconfig --list 
abrt-ccpp       0:off   1:off   2:off   3:off   4:off   5:off   6:off
abrt-oops       0:off   1:off   2:off   3:off   4:off   5:off   6:off
abrtd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
cpuspeed        0:off   1:on    2:off   3:off   4:off   5:off   6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
haldaemon       0:off   1:off   2:off   3:off   4:off   5:off   6:off
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
ip6tables       0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
kdump           0:off   1:off   2:off   3:off   4:off   5:off   6:off
lvm2-monitor    0:off   1:on    2:off   3:off   4:off   5:off   6:off
mdmonitor       0:off   1:off   2:off   3:off   4:off   5:off   6:off
memcached       0:off   1:off   2:off   3:off   4:off   5:off   6:off
messagebus      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpdate         0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
kdump           0:off   1:off   2:off   3:off   4:off   5:off   6:off
lvm2-monitor    0:off   1:on    2:off   3:off   4:off   5:off   6:off
mdmonitor       0:off   1:off   2:off   3:off   4:off   5:off   6:off
memcached       0:off   1:off   2:off   3:off   4:off   5:off   6:off
messagebus      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpdate         0:off   1:off   2:on    3:on    4:on    5:on    6:off
postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off
psacct          0:off   1:off   2:off   3:off   4:off   5:off   6:off
quota_nld       0:off   1:off   2:off   3:off   4:off   5:off   6:off
rdisc           0:off   1:off   2:off   3:off   4:off   5:off   6:off
restorecond     0:off   1:off   2:off   3:off   4:off   5:off   6:off
rngd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
saslauthd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
smartd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:off   3:off   4:off   5:off   6:off

httpdとmemcachedが起動するように設定します。
$ sudo chkconfig httpd on
$ sudo service httpd start
$ sudo chkconfig memcached on
$ sudo service memcached start

$ chkconfig --list | grep 3:on
acpid           0:off 1:off 2:on 3:on 4:on 5:on 6:off
atd             0:off 1:off 2:off 3:on 4:on 5:on 6:off
crond           0:off 1:off 2:on 3:on 4:on 5:on 6:off
httpd           0:off 1:off 2:on 3:on 4:on 5:on 6:off
ip6tables       0:off 1:off 2:on 3:on 4:on 5:on 6:off
iptables        0:off 1:off 2:on 3:on 4:on 5:on 6:off
irqbalance      0:off 1:off 2:off 3:on 4:on 5:on 6:off
memcached       0:off 1:off 2:on 3:on 4:on 5:on 6:off
network         0:off 1:off 2:on 3:on 4:on 5:on 6:off
ntpd            0:off 1:off 2:on 3:on 4:on 5:on 6:off
ntpdate         0:off 1:off 2:on 3:on 4:on 5:on 6:off
postfix         0:off 1:off 2:on 3:on 4:on 5:on 6:off
rsyslog         0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd            0:off 1:off 2:on 3:on 4:on 5:on 6:off
sysstat         0:off 1:on 2:on 3:on 4:on 5:on 6:off