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」が追加されれば成功です!

TitaniumのMapViewで使えるイベントまとめ

ちょっとTitaniumをいじっているのですが、地図を扱うmapviewで使えるイベントを調べたのでメモ

  • click → 地図をクリックしたとき

  • complete → 地図の読み込みが終わった時

  • dblclick → 地図をダブルクリックした時

  • doubletap → 地図をダブルタップした時 ※ クリックとタップの違いは??

  • error → mapviewでエラーが起きたとき

  • loading → 地図を読み込んでいるとき

  • longclick → 地図を長くクリックしているとき ※ 長押しってどれくらいの時間??

  • longpress → 地図を長く押している時 ※ クリックとの違いは??

  • pinch → 地図をピンチしたとき

  • postlayout → 描画がおわったとき?

  • regionChanged → 地図の表示領域が変わったとき

  • singletap → 地図の表示領域以外でタップしたとき?

  • swipe → 地図の表示領域以外でスワイプしたとき?

  • touchcancel → デバイスによって、イベントがキャンセルされたとき

  • touchend → イベントが終わったとき

  • touchmove → 地図上をタッチしながら動かしているとき

  • touchstart → 地図上をタッチし始めたとき

  • twofingertap → 2本指タッチしているとき

いっぱいありますね。 実機じゃないとわかりづらいものもあるので、実機に転送して試してみることにします。

参考) 公式ドキュメント

ブログ移転しました

ドメインで運用してみたくなったので、ブログを移転しました。

移転先は http://blog.ojimac.com になります。

新しいブログもどうぞよろしくお願いします!

2015/09/29 追記
はてなブログ http://ojimac.hatenablog.com/ に戻ってきました。

WordPress、ブログにも使える月1500円以下のVPS、レンタルサーバー料金・スペックまとめ

見つけ次第、どんどん追記していきます。

VPS

名前 月額料金 初期費用 メモリ(MB) HDD(GB) memo
SaaSes Osukiniサーバー LT 450 3,000 512 30 http://www.saases.jp/hosting/hos_006.html
ServersMan@VPS Entry 490 0 256 10 http://dream.jp/vps/
バックアップ用途として使用中。ターミナルの反応が遅い...
KAGOYA VPS 840 0? 512 50 http://www.kagoya.jp/cloud/vps/
HDDが10G/105円で増やせる
さくらのVPS 512 980 0 512 20 http://vps.sakura.ad.jp/
使ったことあり。快適。
ServersMan@VPS Standard 980 0 512 30 http://dream.jp/vps/
SaaSes Osukiniサーバー ST 980 3,000 1024 100 http://www.saases.jp/hosting/hos_006.html
CloudCore VPS 980 0 2048 100 http://www.cloudcore.jp/vps/
2011/11/15に発表されたばかり。キャンペーンかつ1年契約で月980円
さくらのVPS 1G 1480 2,980 1024 30 http://vps.sakura.ad.jp/

レンタルサーバー(sshログインができるもののみにしています)

名前 月額料金 初期費用 Disk(GB) memo
さくらレンタルサーバー スタンダード 500 1,000 100 https://www.sakura.ne.jp/standard.html
使ったことあり。快適。
CORE SERVER CORE-MINI 400 0 60 https://www.coreserver.jp/
年払にすると2,500円(月208円になる)
CORE SERVER CORE-A 500 0 120 https://www.coreserver.jp
CORE SERVER CORE-B 990 0 240 https://www.coreserver.jp
ロリポップ レンタルサーバー チカッパプラン 500 0? 30 http://lolipop.jp/service/plan-chicappa/
レオサーバー 525 1,050 無制限!? http://www.leosv.jp/
※1ヶ月契約だと月1,050円、1年契約で月525円
KAGOYA 共有サーバー PERSONAL 840 0 50 http://www.kagoya.jp/shared3g/
※ただしDBはオプション
heteml 1500 3,950 42.195 http://heteml.jp/service/function/


[更新履歴]

  • 11/16 VPSにCloudCore VPSを追加
  • 11/14 共有サーバーに「レオサーバー」を追加
  • 11/14 共有サーバーに「ロリポップ レンタルサーバー チカッパプラン」、「heteml」を追加
  • 11/14 エントリ作成

MySQLを5.1から5.5にアップグレードしてハマったのでメモ

MySQL5.5からは、/etc/my.cnfの文字列設定の項目名が変わりました。

5.1は

default-character-set = utf8

だった箇所を、

character-set-server=utf8

としないといけませんでした。

/var/log/mysqld.logに、

[ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'

と出力されていて気づきました。

ひょんなことからiPhoneアプリ作ることにしたので勉強の過程をメモしていきます

手始めに積ん読にしていた「はじめてのiPhoneプログラミング( http://www.amazon.co.jp/dp/4797354011/ )」を読んでいこうかなとおもってパラパラ読んでいると、まずは公式ドキュメント読もうと書いてあったので従うことにしてみました。

まずは「iOSテクノロジーの概要」から

読んだ感想としては、iOSでどんなことができて、それぞれどのドキュメントを読めば解決できるという道しるべを提供してくれるドキュメントという感じでした。
以下、後で見直せるように気になったところをまとめておきます。

iOSテクノロジーの基礎

  • マルチタスクの裏で何が起こっているか
    • アプリAを立ち上げつつ、アプリBを立ち上げると、アプリAはメモリ内に保持され、一時停止状態になる
      → バックグラウンドでも動きつづけていると思っていました... ただし、以下のことはアプリ側でハンドリングできるようです。
      • 一時停止までの時間をアプリ側で制御できる
      • 定期的にバックグラウンドで何かしらの処理をする必要があれば、アプリ側で制御して実行できる
      • 一時停止中でもユーザーへの通知(Local Notification)を行うことができる

また、マルチタスクに対応するには、開発者側でコードを書く必要があるようです。
→ 「iOS Application Programming Guide」 参照

印刷機能(ワイヤレス対応のプリンタと通信してiPhoneのコンテンツを送信できる)
iOS4.2から
→「Drawing and Printing Guide for iOS」 参照


データ暗号化
iOS4.0から
→「iOS Application Programming Guide」 の「Implementing Standard Application Behaviors」参照


Apple Push Notification
→ iOS3.0から
いわゆるPush通知。文字での通知、アイコンバッジ、音声による警告の3種類がある。
→「LocalandPushNotification Programming Guide」参照


Local Notification
iOS4.0から

  • Apple Push Notificationの違いは、ネットワーク的に離れたサーバにプロセスを常駐させるか、ローカル(アプリ内)だけで完結できるか。


Gesture Recognizer
→ iOS3.2から
ジェスチャーのサポートを提供
「Event Handling Guide for iOS」参照


ファイル共有サポート
→ iOS3.2から
「Information Property List Key Reference」参照


ピアツーピアサービス
→ iOS3.2から
Bluetoothを使って、他のデバイスと通信を行う
「GameKitProgrammingGuide」参照 → GameKitについては、「Game Kit Framework」参照


外部ディスプレイのサポート
→ iOS3.2から

Cocoa Touchフレームワーク

Address Book UI
連絡先系
→『Address Book Programming Guide for iOS』および『Address Book UI Framework Reference for iOS』を参照


Event Kit UIフレームワーク
カレンダ関連イベント
→『Event Kit UI Framework Reference』参照


Game Kitフレームワーク
→ iOS3.0から
アプリ間通信


Game Center( Game Kitの拡張 )
iOS4.1から
『Game Kit Programming Guide』および『Game Kit Framework Reference』を参照


iAdフレームワーク
iOS4.0から
アプリからバナー広告配信
『iAd Programming Guide』参照


Map Kitフレームワーク
→ iOS3.0から
スクロール可能な地図
iOS4.0から
ドラッグとオーバーレイ(地図にルート等の情報を重ねる)が可能に
『Location Awareness Programming Guide』参照


Message UIフレームワーク
→ iOS3.0から
Email作成
iOS4.0から
SMSメッセージ作成ができるようになった。


UIKitフレームワーク
イベント管理用
『UIKit Framework Reference』参照

Mediaレイヤ

  • グラフィックス
    • CoreGraphics(Quartz) → 2D画像のレンダリング。『Quartz 2D Programming Guide』、『Core Graphics Framework Reference』参照
    • Core Animation → ビューをアニメーション
    • OpenGL ES → 2D, 3Dのレンダリング補助
    • Core Text → テキストレイアウト、レンダリング
    • Image I/O → 画像の読み書き。『Image I/O Reference Collection』参照
    • Assets Library → フォトライブラリの写真・ビデオにアクセス。iOS 4.0から。 『Assets Library Framework Reference』 参照
  • オーディオ
    • Media Player → iTunesライブラリにアクセス
    • AV Foundation → オーディオの再生、録音を管理。iOS 2.2から。iOS3.0からは録音機能、iOS 4.0からはムービーの再生、ムービーのキャプチャ等が追加。 『AV Foundation Framework Reference』 参照
    • OpenAL → 定位オーディオ(??)を扱う
    • Core Audio → 上3つのフレームワークよりオーディオの細かい制御を行う。『Core Audio Overview』参照
  • ビデオ
    • UIKitのUIImagePickerController → カメラでビデオを録画
    • Media Player → ムービーを表示。『Media Player Framework Reference』参照
    • AV Fundation → ムービーのキャプチャと再生
    • Core Media → 上3つのフレームワークよりビデオの細かい制御を行う

AirPlay

  • アプリからApple TV、AirPlayスピーカーに音楽をストリーミング配信

→ AV Fundation, Core Audioフレームワークで扱う
『Multimedia Programming Guide』を参照

Core Service

  • 上位レベルの機能
    • ブロック ≒ クロージャ
    • Grand Central Dispatch → アプリ内のタスク管理。非同期処理など。『Concurrency Programming Guide』参照
    • In-App Purchase → アプリ内課金。iOS3.0から。『In App Purchase Programming Guide』参照
    • SQLite
    • XML → NSXMLParseクラス
  • Core Services
    • Address Book → 連絡先情報にアクセス
    • CFNetwork → ネットワーク関連(ソケット、SSL通信、HTTP等)
    • Core Data →MVCのMの部分。『Core Data Tutorial for iOS』参照
    • Core Fundation → 配列、文字列、日付、URL等の基本的なデータまわり。『Core Foundation Framework Reference』参照

読み終わっての疑問

  • iOSのバージョンによって、割と使える機能、そうでない機能があるけど、iOSのアップデートはどれくらいのユーザーが行ってくれるものなのか?
  • AV FoundationとCore Audioは何が違う? AV Fundationの方が上位レベルのフレームワークなので、扱いやすい? Core Audioの方が下位なので細かいところまで制御できる?