読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Djangoでログ/ロガーの設定(logging)

Django Python

Djangoを使ってWebサービスを作っているときに、ロガーを導入したときの備忘録。

環境は、Django1.10.1, Python2.7。

Qiitaにsakamossanさんのすてきな記事があったので、ほぼ流用

setting.pyにloggerの設定を書く

LOGGING = {
    'version': 1,   # これを設定しないと怒られる
    'formatters': { # 出力フォーマットを文字列形式で指定する
        'all': {    # 出力フォーマットに`all`という名前をつける
            'format': '\t'.join([
                "[%(levelname)s]",
                "asctime:%(asctime)s",
                "module:%(module)s",
                "message:%(message)s",
                # "process:%(process)d",
                # "thread:%(thread)d",
            ])
        },
    },
    'handlers': {  # ログをどこに出すかの設定
        'file': {  # どこに出すかの設定に名前をつける `file`という名前をつけている
            'level': 'DEBUG',  # DEBUG以上のログを取り扱うという意味
            'class': 'logging.handlers.RotatingFileHandler',  # ログを出力するためのクラスを指定(サイズローテーション
            'filename': os.path.join(BASE_DIR, 'django.log'),  # どこに出すか
            'formatter': 'all',  # どの出力フォーマットで出すかを名前で指定
            'maxBytes': 1024 * 1024 * 10, # 10GBでローテーション
            'backupCount': 10, # バックアップファイルは10ファイルまで
        },
        'console': { # どこに出すかの設定をもう一つ、こちらの設定には`console`という名前
            'level': 'DEBUG',
            # こちらは標準出力に出してくれるクラスを指定
            'class': 'logging.StreamHandler', 
            'formatter': 'all'
        },
    },
    'loggers': {  # どんなloggerがあるかを設定する
        'command': {  # commandという名前のloggerを定義
            'handlers': ['file', 'console'],  # 先述のfile, consoleの設定で出力
            'level': 'DEBUG',
        },
    },
}

ロガーを使う

ロガーは、以下の感じで使う。

logger = logging.getLogger('command')
logger.info("表示するメッセージ")

以上!!

参考にしたサイト様

DjangoでBatch処理(カスタムコマンド)

Django Python

Djangoを使ったWebサービスを作っている際に、バッチ処理が必要になったので、その際の備忘録。

環境は、Django1.10.1とPython2.7

Djangoの機能を利用したバッチを作るならカスタムコマンド

いろいろ調べてみたところ、Djangoの機能を使いつつ、バッチ処理をするには、 manage.pyのカスタムコマンドを作るのがよいよう

refs: 公式のドキュメント(Writing custom django-admin commands | Django documentation | Django)

最終的には、

python manage.py <自作コマンド>

で実行できるようになる。

カスタムコマンドは、BaseCommandを継承したクラスCommandを実装すればOK

自作のコマンドを作るには、BaseCommandを継承したクラスを作成すれば良いらしい。
また、デフォルトでは、ファイルの置き場所はmanagement/commandsでなければならない。それ以外に配置しても認識されなかった。。。

$ cd app
$ mkdir -p management/commands && touch management/__init__.py management/commands/__init__.py

雛形はこんな感じ。あとは、handle()内に処理を書けばOK
これでmodelsなども扱えるので、一括実行系の処理などもできるようになる。

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):

  """ Main """
  def handle(self, *args, **options):
    # ここに実行したい処理を書く
    print "カスタムコマンドを実行"

あとは、cronなどで、よしなに定期実行すれば、良い感じに。

atasatamataraさんの記事(Django のコマンドを作って定期的に実行する - 憧れ駆動開発)で、 「cronにするときはちゃんとシェルスクリプトをつくっておこう」と書いてあったので、そうしよう

#!/bin/bash
export DJANGO_SETTINGS_MODULE=mysite.settings
. /path/to/virtualenv/dev/bin/activate
cd /path/to/src
python manage.py some_command

以上!!

参考にしたサイト様

UnityでCSVファイルを読み込む便利クラス(CsvReader)

Unity C#

UnityでCSVファイルを読み込む必要があったので、その際の備忘録。

こんな感じ

ほぼ、tt-coderさんの記事を流用。素晴らしい記事。 qiita.com

最終的には、区切り文字とかも変更できるようにしてみた。

using System.IO;
using System.Collections.Generic;
using UnityEngine;

public class CsvReader {
    //区切り文字
    public char delim = '\t';

    public List<string[]> ReadFile(string filepath) {

        // Assets/Resources配下のファイルを読み込む
        TextAsset csvFile = Resources.Load(filepath) as TextAsset;

        // StringReaderで一行ずつ読み込んで、区切り文字で分割
        List<string[]> data = new List<string[]>();
        StringReader sr = new StringReader(csvFile.text);
        while(sr.Peek() > -1) {
            string line = sr.ReadLine();
            data.Add(line.Split(delim));
        }

        return data;
    }
}

以上!!

参考にしたサイト様

DjangoとjQueryでAjaxする

front-end javascript

最近、フロントエンドもやるようになり、いまさらjQueryAjaxを使うことに。。

右も左も分からないので、その際の備忘録。

コードはこんなかんじ

formで入力を受け付けて、submitの際に、Ajaxでの通信に切り替える感じ

成功するとdiv配下に、帰ってきたHTMLを挿入する。

<div id="contents"></div>

<form class="form-horizontal" method="post" action="...">
  {% csrf_token %}
  <button type="submit" class="btn">Submit</button>
</form>
$("from").submit(function(event){
    // HTMLでの送信をキャンセル
    event.preventDefault();

    var $form = $(this);
    $.ajax({
        url: $form.attr('action'),
        type: $form.attr('method'),
        data: $form.serialize(),
        timeout: 10000,
        beforeSend: function(xhr, settings) {
           xhr.setRequestHeader("X-CSRFToken", $("input[name='csrfmiddlewaretoken']").val());
        },
    }).done(function(data, textStatus, jqXHR){
        // 成功したときの処理

        var $data = $(data);
        var $root = $('#contents');
        $root.empty();
        $root.append($data);
        $data.ready(function(){
            // DOMを操作をし終えた後にする処理
        });
    }).fail(function(jqXHR, textStatus, errorThrown){
       // 失敗したときの処理
    });
});

とても2017年とは思えないコード。。。ReactとかAngulrとかしたい。。。
が、とりあえず、歴史を辿ってみている感じ。

参考にしたサイト様

(Django小ネタ) Templateのforでたくさん固定回数繰り返す方法

Python Django

最近、Djangoのお仕事をいただけるので、そのときの備忘録

templateで固定回数のループしたいときの小ネタ。

以下のような感じに感じにすると、100回繰り返せる。

{% for file_id in ""|rjust:"100" %}
  (繰り返したいなにか)
{% endfor %}

参考にしたサイト様

Unity×AndroidでmBaaSのニフティクラウド mobile backend(NCMB)を使ってみる

unity android

ひさびさにAndroidアプリをリリース! 初の横スクロールアクション「あざらしロジック」(GooglePlay)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ
「あざらしロジック」で、Nifty Cloud mobile backend(NCMB)を導入したときの話。

NCMBのUnityプラグインのインストール

NCMBのUnityプラグインは、GitHubにて提供されているので、こちらからダウンロード。

ダウンロードしたzip(NCMB.2.2.0.zip)を解凍すると、「NCMB.unitypackage」が入っているので、そちらをインポート。

【注意】ほかにもSupportLibを利用しているプラグインを入れている場合

support-libやgoogle-play-serviceが競合していると、上手く動かないのでインポート時に外しておく。 f:id:wannabe-jellyfish:20170129203102p:plain

特にNCMBの、v2.2.0のライブラリはバージョンが古く、
AdMob/GPGS/Applovinなどと合わせて利用するとバージョンの整合性が合わず、上手く行かなかった。。。

ただ、AndroidManifest.xmlを除いた場合、必要な項目を手動でマージする必要がある。

使い方

基本的な使い方は以下の感じ。 ドキュメントも日本語でまとまっているため、わかりやすい

更新系

// Insert
NCMBObject obj = new NCMBObject ("Book");
obj["test"] = "value";
obj.SaveAsync ((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

// Update(ObjectIdを指定する)
NCMBObject obj = new NCMBObject ("Book");
obj.ObjectId = "xxxxxxxxx";
obj["test"] = "value2";
obj.SaveAsync ((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

// Delete
obj.DeleteAsync((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

参照系

// Search by objectId
NCMBObject obj2 = new NCMBObject ("Book");
obj2.ObjectId = obj.ObjectId;
obj2.FetchAsync ((NCMBException e) => {        
    if (e == null) { //成功時の処理 }
});

// Search Query
//QueryTestを検索するクラスを作成
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
//Scoreの値が7と一致するオブジェクト検索
query.WhereEqualTo ("Score", 7);
//取得件数の指定
query.Limit = 5;
//取得開始位置の指定
query.Skip = 6;
// Sort
query.OrderByDescending ("Score");  //Scoreを降順で並べ替え
query.AddAscendingOrder ("Age");    //さらにAgeを昇順で並べ替え
// 外部参照も合わせて取得
query.Include("Child");

// 検索を実行
query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
    if (e == null) {
        //Scoreが7のオブジェクトを出力
        foreach (NCMBObject obj in objList) {
            Debug.Log ("objectId:" + obj.ObjectId);
        }
    }
});

// 検索件数の取得
query.CountAsync((int count , NCMBException e )=>{
    if(e == null){
        //件数を出力
        Debug.Log("件数 : "+ count);
    }
});

以上!!

参考にしたサイト様

Unity×Android | Admob/Applovinを使ったリワード広告(動画リワード)

unity android

ひさびさにUnityでAndroidアプリを作ってみました! 初の横スクロールアクション「あざらしロジック」!(GooglePlay)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ
「あざらしロジック」で、AdMobApplovinを導入したときの話。

AdMobのUnityプラグインのインストール

AdMobのプラグインは、GitHubに公開されているので、以下からダウンロード。
Release Google Mobile Ads Unity Plugin v3.2.0 · googleads/googleads-mobile-unity · GitHub

※すでに他のプラグインで、AndroidManifest.xmlをインポートしている場合は、追加でインポートしない。

ApplovinのUnityプラグインのインストール

Applovinのプラグインは、Applovinの公式サイトからダウンロード
AppLovin - Sign in

※すでに他のプラグインで、AndroidManifest.xmlをインポートしている場合は、追加でインポートしない。

AndroidMainifest.xmlをインポートしなかった場合

AndroidManifest.xmlに追記が必要。追記する内容は以下の通り。
YOUR_PACKAGE_NAMEYOUR_SDK_KEYは、自分の環境に合わせて。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="YOUR_PACKAGE_NAME"
  ・・・・
  >

  <!-- These permissions are mandatory to run AppLovin SDK -->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>

  <!-- These permissions are strongly recommended and will result in higher performance -->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />

  <application>
    <!-- Applovin's meta-data -->
    <meta-data android:name="applovin.sdk.key" android:value="YOUR_SDK_KEY" />
    <activity android:name="com.applovin.adview.AppLovinInterstitialActivity" android:configChanges="orientation|screenSize"/>
    <activity android:name="com.applovin.adview.AppLovinConfirmationActivity" />
  </application>

</manifest>

リワード広告を表示してみる

使い方は、こんな感じ。(公式のDoc)より
リスナーが用意されているので、動画が表示されたら、報酬を付与するなどの処理ができる。

public class AdRewardManager : MonoBehaviour {

    void Start() {
        // AppLovin SDKの初期化
        AppLovin.InitializeSdk();
        // リワード広告の読み込み
        AppLovin.LoadRewardedInterstitial();
        // リスナーの設定
        AppLovin.SetUnityAdListener(name);
    }

    // リワード広告の表示
    public void ShowAdReward() {
        // 表示の準備ができていたら、広告を表示する
        if(AppLovin.IsIncentInterstitialReady()) {
            AppLovin.ShowRewardedInterstitial();
        }
    }

    // リスナー
    void onAppLovinEventReceived(string ev) {
        if(ev.Contains("REWARDAPPROVEDINFO")) {
            // 動画が再生された
        } else if(ev.Contains("LOADEDREWARDED")) {
            // 読み込み完了
        } else if(ev.Contains("LOADREWARDEDFAILED")) {  
            // 読み込み失敗
        } else if(ev.Contains("HIDDENREWARDED")) {
            //動画の表示し終わり、非表示にされた

            // 次の動画の準備
            AppLovin.LoadRewardedInterstitial();
        }
    }
}

AppLovinは、インタースティシャル広告も表示できる

インタースティシャル広告版はこちら。(公式のDoc)より

public class AdInterstitialManager : MonoBehaviour {

    void Start() {
        // AppLovin SDKの初期化
        AppLovin.InitializeSdk();
        // インタースティシャル広告の読み込み
        AppLovin.PreloadInterstitial();
        // リスナーの設定
        AppLovin.SetUnityAdListener(name);
    }

    // インタースティシャル広告の表示
    public void ShowAdReward(string name) {
        // 表示の準備ができていたら、広告を表示する
        if(AppLovin.HasPreloadedInterstitial()) {
            AppLovin.ShowInterstitial();
        }
    }

    // リスナー
    void onAppLovinEventReceived(string ev) {
        if(ev.Contains("DISPLAYEDINTER")) {
            // 広告が表示された
        } else if(ev.Contains("LOADEDINTER")) {
            // 読み込み完了
        } else if(ev.Contains("LOADINTERFAILED")) {  
            // 読み込み失敗
        } else if(ev.Contains("HIDDENINTER")) {
            // 広告が非表示にされた

            // 次の広告の準備
            AppLovin.PreloadInterstitial();
        }
    }
}

ちなみに、リスナーについては、こっちの公式Docより

以上!!かんたん!!

参考にしたサイト様