2015年3月17日火曜日

build.gradleにFacebookSDKを追加

ここでセントラルリポジトリ内のFacebookSDKの最新バージョンをチェックする。


build.gradleに下記を追加
repositories {
…
    mavenCentral()
…
}

dependencies {
…
    compile 'com.facebook.android:facebook-android-sdk:3.23.1'
…
}

2015年3月16日月曜日

not available for offline mode

プロジェクトのgradleのdependenciesに新たにライブラリを追加したとき、

Failed to resolve:~
not available for offline mode
と警告が出たら


Android Studio > Preference > GradleのOffline workのチェックを外して、オフラインモードを解除して、再度ビルドしてみる

2015年3月8日日曜日

EditTextで絵文字を含む文字列の文字数制限処理

絵文字を含む文字列の文字数制限で少しハマりました。
最終的に以下のコードで対応しました。
final int MAX_TEXT_LENGTH = 10;
final EditText editText = (EditText) findViewById(R.id.edit_text);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (unfixInput(s)) {
            return;
        }
        final String str = s.toString();

        final String adjustedText = adjustText(str);
        if (!str.equals(adjustedText)) {
            editText.setText(adjustedText);
            editText.setSelection(editText.getText().length());
            Toast.makeText(getApplicationContext(), String.format("最大%d文字です", MAX_TEXT_LENGTH), Toast.LENGTH_SHORT).show();
            return;
        }
        // TODO 内容保存処理
    }

    /**
     * 入力確定前の文字があるときtrue
     */
    private boolean unfixInput(final Editable s) {
        Object[] spanned = s.getSpans(0, s.length(), Object.class);
        if (spanned != null) {
            for (Object obj : spanned) {
                if ((s.getSpanFlags(obj) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 文字列の調整
     */
    private String adjustText(final String str) {
        if (MAX_TEXT_LENGTH < str.codePointCount(0, str.length())) { // 文字数は、コードポイントで比較
            return adjustText(str.substring(0, (str.length() - 1)));
        }
        return str;
    }
});

ハマった原因

xmlのEditTextに
android:maxLength="10"
と設定しても、 文字数のカウントがサロゲートの文字が配慮されておらず、絵文字など、文字コードがサロゲートの場合、1文字で2文字と認識されてしまいます。
そのため、最大10文字と設定していても、絵文字を含む文字列だと5〜9文字までしか入力できないEditTextになってしまいます。

対処方法

  • EditTextのmaxLengthは使用しない
  • 文字数のカウントは、String#codePointCountメソッドを使用する

コードポイントとは

コードポイントとは、Unicodeで1文字分のコードを示す言い方。Javaではコードポイントはint型で表す。(引用元:http://www.ne.jp/asahi/hishidama/home/tech/java/string.html)

他、参考



2015年3月4日水曜日

Pythonのlintチェック


flake8をインストール

sudo pip3 install flake8


flake8の実行

チェックしたいアプリのディレクトリに移動して、次のコマンドを実行(「.」を忘れずに)
$ flake8 .


こんな感じのメッセージが出てくるので、該当箇所を正しい構文になおしていくとよい。
./Karuta/models.py:14:28: E261 at least two spaces before inline comment
./Karuta/wsgi.py:13:1: E402 module level import not at top of file
./Karuta/views.py:9:75: W292 no newline at end of file
./Karuta/settings.py:86:57: W292 no newline at end of file


個人的課題

pep8について知る

DBのバックアップ

SQLiteの中身をdumpする

$ python3 ./manage.py dumpdata > dump.json


dump内容をSQLiteに反映させる

$ python3 ./manage.py loaddata dump.json

dump内容の反映は、いったんDBをクリアにして反映された状態になる。

2015年3月2日月曜日

DjangoでSqliteのDB作成


  • __init__.pyがあるディレクトリ内でmodels.pyを作成
  • models.pyにテーブル定義を書く
  • 同じディレクトリ内にあるsettings.pyにアプリケーション情報追加
  • コマンドでsyncdbを実行


models.pyにテーブル定義を書く


class Karuta(models.Model):
    kaminoku = models.TextField()
    kaminoku_ruby = models.TextField()
    shimonoku = models.TextField()
    shimonoku_ruby = models.TextField()
    kimarizi = models.TextField()
    class Meta:
        db_table = "karuta" # これを書かないと「Karuta」テーブルが作成される

同じディレクトリ内にあるsettings.pyにアプリケーション情報追加

INSTALLED_APPSにプロジェクト名(今回はKaruta)を追加

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Karuta', # 自分のアプリケーション情報を追加
)

コマンドでsyncdbを実行

python3 ./manage.py syncdb
でDBにmodels.pyで定義したテーブルが作成される

You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no)

は、djangoのスーパーユーザーを追加するかどうかの質問なので、noで大丈夫

PyCharmで最初にする設定


  • 行番号表示
  • ファイル新規作成で自動記述されるauthorの削除
  • gitと連携

行番号表示

File > Editor > General > Appearance > Show line numberにチェック

ファイル新規作成で自動記述されるauthorの削除

__author__ = '(ユーザー名)'
が初期で記入されないようにする方法

File > Editor > File and Code Templatesの
Templatesタブにある「Python Script」と「Python Unit Test」の設定を変更

gitと連携

VCS > Enable Version Control Integration...でgitを選択


2015年3月1日日曜日

djangoでViewを作る

Viewとは

web上で見える部分の定義

やること


  • __init__.pyとかがあるディレクトリ内でviews.pyを作成
  • 同じディレクトリ内のurls.pyの修正
  • views.pyにwebで表示したいものを書く

urls.pyの修正


# url(r'^$', 'Karuta.views.home', name='home'),

url(r'^$', 'Karuta.views.home', name='home'),
コメントアウトを解除

views.pyにwebで表示したいものを書く


例:hello worldの出力
import django.shortcuts

def home(name):
    return django.shortcuts.HttpResponse('hello world')


あとは、python3 ./manage.py runserverを行って、ブラウザでhttp://127.0.0.1:8000を開くと、hello worldが表示される