furodrive

About

Archive

2014-09-17

ディレクトリ内にあるファイル名をターミナルにて一括で変更する

ディレクトリ内のファイルを一括で変更するいくつかの方法をメモ。 ここではhoge@2x.png,fuga@2x.pngをhoge.png,fuga.pngにリネームする場合について考える。

renameコマンドを使う場合

まずはrenameコマンドをインストール

brew install rename

あとはリネームしたいディレクトリに移動してrenameコマンドを以下のように発行すれば良い。

cd /path/to/will_rename_dir
rename 's/@2x.png/px.png/' *.png

shellスクリプトを使う場合

以下のrename.shをリネームしたいディレクトリに配置して実行すれば良い。

rename.sh

for file in *.png
do
    mv "$file" "${file/@2x.png/.png}"
done

あとはこれを

source rename.sh

で実行するだけ。

2014-09-15

Django経由でAmazon SNSを使ってPush通知を送る(Part4:Django編)

この記事はDjangoでAmazon SNSを使用してiPhoneにPush通知を配信するまでの流れのPart4です。

流れとしては以下のようになります。太字の箇所が今回説明する箇所となります。


Part1(準備編)

1.iOSに通知するメッセージを送るサーバー構築(今回はAmazon SNSサービスを使用)

2.通知サービスが有効になったApp IDを作成

3.Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成

4.Provisioning Profileを作成

Part2(iOS編)

5.iOSアプリに実装して端末識別用のDevice Tokenを取得してサーバーに送信

Part3(Amazon SNS編)

6.Amazon SNSのセットアップ

Part4(Django編)

7.Django側からAmazon SNSを経由して送信


ではDjango側の実装を行なっていきます。 なお今回はPython2.7.5,Django1.6で実装を行なっていきます。 またAmazon WebServiceのライブラリ、botoをインストールしておいてください。

まずはDjangoアプリを作成します。

# プロジェクトの作成
django-admin.py startproject pushserver

# deviceアプリを作成
cd pushserver
django-admin.py startapp devices

次にdeviceモデルを作成します。

pushserver/devices/models.py


import uuid
from django.db import models
from boto.sns import sns_connection

class Device(models.Model, Base):
    device_token = models.CharField(max_length=200, blank=False, unique=True, null=False)


    def register(self):
        '''
        Amazon SNSにデバイストークンを登録します。
        '''

        sns_connection = boto.sns.connect_to_region('ap-northeast-1',
                aws_access_key_id=AWS_ACCESS_KEY,
                aws_secret_access_key=AWS_SECRET_KEY)

        #ARNはAmazon SNS Mobile Pointに記載されています。
        sns_connection.create_platform_endpoint(
                platform_application_arn=ARN,
                token=self.device_token,
                custom_user_data='test')

 

次にpushserver/settings.pyのINSTALLED_APPSの中に'devices'を追記して以下のコマンドでDBを作成します。

python manage.py syncdb

pushserver/urls.py

/devicesで始まるurlに関する処理はdevices/urls.pyに処理をするようにさせます。


from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
                       url(r'^devices/',include('devices.urls')),
                       )

pushserver/devices/urls.py

/devices/tokenのリクエストが来たら、/devices/views.pyのtoken_view()メソッドが呼ばれるようにします。


from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
        url(r'^token$',views.token_view,name='token'),
        )

pushserver/devices/views.py

/devices/tokenにPOSTリクエストが来たら、DeviceTokenを持ったDeviceをDBに保存します。



def token_view(request):
    if request.method == "POST":
        device_token = request.body[1:-1]
        device = Device.get_or_create(device_token =device_token)
        device.register()
        return HttpResponse("success!")
 

ここまでの作業を行ってpython manage.py runserverを行なってサーバーを起動させたままにして Part2で作成したiOSアプリを開くとDeviceTokenがDBに保存されます!

次にAmazon Web ServiceをPython側から簡単に扱えるBotoというライブラリを使ってpython manage.py devices publishというコマンドを入力するとすべてのDeviceにPush通知を行う実装を行います。

devices/management/commands/publish.py



#coding: utf-8
import boto
from django.core.management.base import BaseCommand,CommandError
from devices.models import Device
import re
import os
import boto.sns
from django.conf import settings

class Command(BaseCommand):
    help = 'setup'


    def handle(self,*args,**options):
        AWS_ACCESS_KEY = settings.LOCAL_AWS_ACCESS_KEY
        AWS_SECRET_KEY = settings.LOCAL_AWS_SECRET_KEY

        # Amazon SNS Mobile Pointに記載されているarnを入力
        arn = 'arn:aws:sns:ap-northeast-1.../APP_NAME/APP_SANDBOX'






        sns_connection = boto.sns.connect_to_region('ap-northeast-1',
                                                    aws_access_key_id=AWS_ACCESS_KEY,
                                                    aws_secret_access_key=AWS_SECRET_KEY)

        for device in Device.objects.all():
            res = sns_connection.create_platform_endpoint(
                platform_application_arn= arn,
                token = device.device_token,
                custom_user_data = 'test'
        )

            endpoint = res.get('CreatePlatformEndpointResponse').get('CreatePlatformEndpointResult').get('EndpointArn')



            sns_connection.publish(target_arn=endpoint, message=u"Hello from Django")

 

Done!

ここまでがきちんと出来ていると

python manage.py devices publish

というコマンドを入力すると登録したすべてのデバイスにPush通知が行われます! お疲れ様でした:)

2014-09-12

Django経由でAmazon SNSを使ってPush通知を送る(Part3:Amazon SNS編)

この記事はDjangoでAmazon SNSを使用してiPhoneにPush通知を配信するまでの流れのPart3です。 太字の箇所が今回説明する箇所となります。


Part1(準備編)

1.iOSに通知するメッセージを送るサーバー構築(今回はAmazon SNSサービスを使用)

2.通知サービスが有効になったApp IDを作成

3.Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成

4.Provisioning Profileを作成

Part2(iOS編)

5.iOSアプリに実装して端末識別用のDevice Tokenを取得してサーバーに送信

Part3(Amazon SNS編)

6.Amazon SNSのセットアップ

Part4(Django編)

7.Django側からAmazon SNSを経由して送信


では具体的に手順を見ていきます。

6. Amazon SNSのセットアップ

Amazon SNSのページ → Navigation → Add a new App をクリックすると以下の画面が現れます。

以下の項目を入力します。

  • Application Name: アプリの名前
  • Push Platform: Apple Push Notification Service Sandbox (APNS_SANDBOX)
  • Choose P12 File: Part1で作成したp12ファイルを選択
  • Enter Password: P12 Fileのパスワードを入力

次にLoad Credentials from FileをクリックするとCertificate,Private Keyが挿入されるのでAdd New AppをクリックするとAppが作成されます。

Amazon SNSの管理画面からPush通知を行う

ここで管理画面からPush通知を行なってみます。 Apps → 作ったアプリの名前を選択 → Add Endpoints を選択するとプロンプトにdeviceTokenとuserDataの入力を促されます。deviceTokenにPart2で取得できるDevice Tokenを入力、UserDataにtestを入力してAdd Endpointsをクリックします。

次にEndpoint Action → Publish を選択すると以下のプロンプトが表示されます。

このMessageの項目に好きな文字を入力してみてPublish Messageを入力するとPush通知が送信されます。

Done!

これでAmazon SNSのセットアップ編は終了です。 次回はサーバーサイド(Django)の実装を行なっていきます。

2014-09-12

Django経由でAmazon SNSを使ってPush通知を送る(Part2:iOS編)

この記事はDjangoでAmazon SNSを使用してiPhoneにPush通知を配信するまでの流れのPart2です。

流れとしては以下のようになります。太字の箇所が今回説明する箇所となります。


Part1(準備編)

1.iOSに通知するメッセージを送るサーバー構築(今回はAmazon SNSサービスを使用)

2.通知サービスが有効になったApp IDを作成

3.Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成

4.Provisioning Profileを作成

Part2(iOS編)

5.iOSアプリに実装して端末識別用のDevice Tokenを取得してサーバーに送信

Part3(Amazon SNS編)

6.Amazon SNSのセットアップ

Part4(Django編)

7.Django側からAmazon SNSを経由して送信


では具体的に手順を見ていきます。

UIAppDelegate.h

ヘッダーにUIApplicationDelegate,NSURLConnectionDelegateを追加します。

@interface AppDelegate : UIResponder <UIApplicationDelegate,NSURLConnectionDelegate>

UIAppDelegate.m

PUSH通知が正しく設定されているとdidRegisterForRemoteNotificationWithDeviceToken:(NSData *)deviceTokenというメソッドが呼ばれて、deviceTokenが取得できます。 このdeviceTokenをサーバーにhttp://localhost:5000/devices/tokenに対してPOST送信します。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *deviceTokenValue = [deviceToken description];

    //Send deviceTokenValue to Server.
    NSString *urlForPost = @"http://localhost:5000/devices/token";
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlForPost]];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [deviceTokenValue dataUsingEncoding:NSUTF8StringEncoding];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
}

//deviceTokenが正しくPOST送信されたら呼ばれる。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"Device Token is sent successfully!")
}

Done!

これでiOS側の実装は完了です。 次回はAmazon SNSのセットアップを行います。

2014-09-10

Django経由でAmazon SNSを使ってPush通知を送る(Part1:準備編)

iOSのPush通知は慣れるまでが大変面倒ですので、一覧の流れをまとめてみました。

流れとしては以下のようになります。太字の箇所が今回説明する箇所となります。


Part1(準備編)

1.iOSに通知するメッセージを送るサーバー構築(今回はAmazon SNSサービスを使用)

2.通知サービスが有効になったApp IDを作成

3.Apple Push Notification Service(APNs)とサーバー間でメッセージをやりとりするための証明書を作成

4.Provisioning Profileを作成

Part2(iOS編)

5.iOSアプリに実装して端末識別用のDevice Tokenを取得してサーバーに送信

Part3(Amazon SNS編)

6.Amazon SNSのセットアップ

Part4(Django編)

7.Django側からAmazon SNSを経由して送信


では具体的に手順を見ていきます。

1.iOSに通知するサーバーを準備する

今回Push通知を送るためにAmazon SNSを使用しますのでAWSアカウントを作成していない人はAWSアカウントを作成する必要があります。

2.通知サービスを有効にしたApp IDを作成

iOS Developer Centerに移動してApp Servicesの項目のPush Notificationsを有効にしたApp IDを作成してください。

3. Apple Push Noftificatisons(APNs)とサーバー側でメッセージをやりとりするための証明書を作成

先ほど作成したApp IDをiOS App IDsページからから選択し画面下部にあるEditボタンをクリックします。

以下のようにPushNotificationをONにした状態で

今回は開発用の証明書を作成するのでDevelopment SSL CertificateのCreate Certificateをクリックして、証明書を作成します。

また、証明書を作成する際にCSRのUploadを要求されます。

上のメッセージは要約すると、CSRファイルを作成してくださいという趣旨ですので キーチェーン → 証明書アシスタント → 認証局に証明書を要求をクリックしてCSRファイルを作成しUpload CSRのChoose Fileの箇所に選択し,Generateをクリックしてaps_development.cerファイルをダウンロードが行われます。

これをダブルクリックするとキーチェーンにaps_development.cerが登録されます。

この証明書を選択した状態でキーチェーン→ファイル→書き出すの順に選択して.p12形式で書き出します。

4.Provisioning Profileを作成

iOSDevCenter → Certificates, Identifiers & Profiles → Add Provisioning File → Development用のiOS App Developmentを作成します。この際にApp IDは先ほど作成したApp IDを選択してください。

Done!

これでDjango経由でAmazon SNSを使ってPush通知を送る(Part1:準備編)は完了です。 次回は主にiOS側の実装を行なっていきます。

2014-09-03

localhostをiPhoneの実機でも参照する方法

ローカルホストにiPhone側からでもアクセスできるようにしたのでそのメモ。

Proxyの設定ファイルを作成

/private/etc/apache2/other/proxy.confのファイルを作成して以下のコードを書きます。

<IfModule mod_proxy.c>
    ProxyRequests On
    ProxyVia On
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 192.168.1
    </Proxy>
</IfModule>

Apacheの再起動

$sudo apachectl start

Mac本体のIPアドレスを調べる

$ifconfig

で取得できます。ちなみに自分のIPアドレスは192.168.0.4でした。

これでMac側の設定は完了です。

iPhone側からMacのプロキシを経由して通信を行う

iPhoneのWi-Fi設定画面から接続しているネットワークをタップすると、 画面下部にHTTPプロキシという項目がありますのでそこを以下のように編集します。


これでiPhone側からでもMacのlocalhostを参照できるようになります:)
2014-08-29

Vimでスニペットを作ってみる

Vimでスニペットの作り方を調べたら思ったより簡単だったのでメモ。

例えば,h1と入力すると<h1>ここにカーソル</h1>となるようなスニペットを作成する場合、以下のコードを.vimrcに書く。

map ,h1 i <h1></h1><Esc>4hi

解説しておくと

1.i: インサートモードになる

2.<h1></h1>: h1タグを挿入する

3.<ESC>: エスケープでインサートモードを終了

4.4hi: 4文字分左にカーソルを移動してインサートモードにする

以上!

使いこなせたら,Vimのマクロはなんでも出来て便利そうなので、もうちょっと調べてみます。

2014-08-23

DjangoのAdmin画面でモデルがSaveされた時の挙動をカスタマイズする

Admin画面でモデルをSaveした時の挙動をカスタマイズしたいときは


save_model(self,request,obj,from,change)
 

メソッドをカスタマイズすればいい。 objにはモデルのインスタンスが入っている。

以下は画像のファイル名をユニークな名前に置き換える例。


class YourAdmin(admin.ModelAdmin):
    model = YourModel

    def save_model(self, request,obj, form, change):

        """
        It called when obj save.
        """

        u = str(uuid.uuid4())
        if 'photo' in request.FILES:
            request.FILES['photo'].name = u+'.png'
            monster.photo = request.FILES['photo']
        monster.save()



admin.site.register(YourModel,YourAdmin)
 
2014-08-18

Botoを使ってiOSに対してPush通知を行う

BotoというAmazon Web Serviceを操作するライブラリを使ってAmazon SNSに操作してiOSに対してPush通知を送信する事ができたのでメモしておく。

1.管理画面からPush通知を行うところまで

Push通知を行うために

  • App IDの作成
  • 通知用証明書の作成
  • プロビジョニングファイルの作成
  • Amazon SNSに証明書を登録
  • Xcode上で実装

という諸々の手続きが必要だけど、 Amazon SNS Mobile Pushを使ってiOSのPush Notificationを実装するに従って手順通りに進めていければ、Amazon SNSの管理画面からPush通知を特定のデバイスに送信するとこまで出来る。

2.Botoを使ってPythonからPush通知を行う

特定のデバイスにPush通知を行う例


import boto.sns
AWS_ACCESS_KEY = 'your_aws_access_key'

AWS_SECRET_KEY= 'your_aws_secret_key'


arn = 'arn:aws:sns:ap-northeast-1:313519673286:app/APNS_SANDBOX/...'




client = boto.sns.connect_to_region('ap-northeast-1',
                                                    aws_access_key_id=AWS_ACCESS_KEY,
                                                    aws_secret_access_key=AWS_SECRET_KEY)

token = 'your_device_token'



res = client.create_platform_endpoint(
                platform_application_arn=arn,
                token= token,
                custom_user_data='your_user_data')


endpoint = res.get('CreatePlatformEndpointResponse').get('CreatePlatformEndpointResult').get('EndpointArn')
client.publish(target_arn=endpoint, message=u"Hello,furodrive")

特定のトピックを購読しているユーザーに対してPush通知を行う例


import boto.sns
AWS_ACCESS_KEY = '...'
AWS_SECRET_ACCESS_KEY = '...'
arn = 'arn:aws:sns:ap-northeast-1:0000:app/APNS_SANDBOX/...'

client = boto.sns.connect_to_region('ap-northeast-1',
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY)


res = client.create_platform_endpoint(
                platform_application_arn=arn,
                token= 'your device token',
                custom_user_data='your_user_data')

endpoint = res.get('CreatePlatformEndpointResponse')\
              .get('CreatePlatformEndpointResult').get('EndpointArn')

_topic = client.create_topic('topic_name')
topic = _topic.get('CreateTopicResponse').get('CreateTopicResult').get('TopicArn')

client.publish(topic=topic, message=u"hi, all subscribers.")

topicを購読する場合は


client.subscribe(topic, 'application', endpoint)

で特定のデバイスに購読させることが出来るので


def subscribe(self,topic_name,device_token,user_data):
    client = boto.sns.connect_to_region('ap-northeast-1',
            aws_access_key_id=AWS_ACCESS_KEY,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY)

    res = client.create_platform_endpoint(
                    platform_application_arn=arn,
                    token=  device_token
                    custom_user_data= user_data)

    endpoint = res.get('CreatePlatformEndpointResponse')\
                  .get('CreatePlatformEndpointResult').get('EndpointArn')

    _topic = client.create_topic(topic_name)
    topic = _topic.get('CreateTopicResponse').get('CreateTopicResult').get('TopicArn')


    client.subscribe(topic, 'application', endpoint)

みたいなメソッドを作ってやれば購読させることが出来る。

2014-08-13

Fabricを使ってWebアプリを自動デプロイする

Fabricを使用してローカルのプロジェクトをGithubにPushしてその後リモート側でGit Pullを実行して、動いているGunicornのプロセスを止めてNginxをRestartさせればよい。

コード例は以下。(Port番号は5000と仮定する)

    #coding: utf-8
    from fabric.api import run,env,local,settings
    from fabric.operations import sudo
    from fabric.context_managers import cd
    import os

    def try_cmd(host_type,cmd):
        run_cmd = host_type(cmd)

    def host_type():
        run("uname -s")

    from fabric.api import env, run
    env.use_ssh_config = True

    env.user = "your_name"
    env.hosts = ["name@your_ip_address"]


    def push():
        with settings():
            try_cmd(local,"git push origin master -f")
            with cd("/var/www/blog"):
                try_cmd(sudo,"git pull origin master")
                try_cmd(sudo,"fuser -k tcp 5000/tcp")
                try_cmd(sudo,"gunicorn manage:app -b 0.0.0.0:5000 -D")
                try_cmd(sudo,"sudo service nginx restart")