東大ニート

東大卒のニートが勉強したことをメモするブログ

<Django>shell plusを使う

shell_plusを使えば、通常のshellより便利、という話を聞いて使ってみたいなと思いました。shell_plusを使えば、シェルを使う時に、各モデルが自動的にインポートされるので、インポートの手間が省けるということです。
以下を参考に記載しました。

github.com

 

shell と shell_plusとの違い

自動でインポートを行ってくれる、というのは具体的には以下のようなイメージです。

まず、通常のshellを使う場合、下記のようになります。

(practice)$ ./manage.py shell
Python 2.7.10 (default, Sep 23 2015, 04:34:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

一方、shell_plusを使う場合、下記のようになります。

(practice)$ ./manage.py shell_plus
# Shell Plus Model Imports
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
# Shell Plus Django Imports
from django.utils import timezone
from django.conf import settings
from django.core.cache import cache
from django.db.models import Avg, Count, F, Max, Min, Sum, Q, Prefetch, Case, When
from django.core.urlresolvers import reverse
from django.db import transaction
Python 2.7.10 (default, Sep 23 2015, 04:34:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

※モデルを自分で定義している場合、上記に加え、それらのモデルも自動でインストールされます。

インポートを自動で行ってくれるため、手間が省けます。

 

 shell_plusを使うまでの流れ

以下の様な手順で、shell_plusを使えるようになります。

1. django-extensions のインストール

2. INSTALLED_APPSの設定

3. コマンドの実行

1. django-extensions のインストール

まずは、pipまたはeasy_installでdjango-extensionsをインストールします。

$ pip install django-extensions
or
$ easy_install django-extensions

2. INSTALLED_APPSの設定

次にsettings.pyのINSTALLED_APPSに'django_extensions'を設定します。

INSTALLED_APPS = (
...
'django_extensions',
...
)

3. コマンドの実行

1、2の設定を終えるとshell_plusのコマンドを実行できます。

./manage.py shell_plus

 

以上でshell_plusを使うことができます。

<Django>環境の構築

Django・Pythonを使ってみたいなと思って、環境構築をしたのでメモ。

@eiryplusさんの以下の記事を参考にさせていただきました。

環境を構築しよう — DjangoによるWebアプリケーション開発入門

 

前提

pip、virtualenv、virtualenvwrapper、Pythonがインストールされ、pathが通されている状態

 

目標

・仮想環境を作る

・仮想環境を有効にする

・Djangoをインストールする

 

手順

1. 仮想環境を作る

まずはmkvirtualenvコマンドを使い、仮想環境を作成します。

「practice」という仮想環境を作る場合、

$ mkvirtualenv practice

を実行すればオッケーです。
pythonのバージョンを指定する場合は、「--python」を使って指定します。

仮想環境ができれば、プロジェクト毎に異なるバージョンのDjangoを使用することも簡単です。

2. 仮想環境を有効にする

virtualenvwrapperのworkonコマンドを使い、仮想環境を有効にします。
(virtualenvのsource bin/activateでも大丈夫です。)

$ workon practice

を実行します。

すると以下のように、ターミナルに丸括弧で囲われた仮想環境名が表示されます。

(practice)$

3. Djangoをインストールする

pip installコマンドを使って、仮想環境にDjangoをインストールします。

(practice)$ pip install django

正しくインストールできたか確認するためには、pip freezeコマンドを使います。

(practice)$ pip freeze
Django==1.9.5

のように表示されれば成功です。

(おまけ1)仮想環境を抜ける

仮想環境から抜ける時はdeactivateコマンドを使います。

(practice)$ deactivate

(おまけ2)仮想環境の削除

仮想環境の削除はrmvirtualenvコマンドを使います。

$ rmvirtualenv practice

 

以上で仮想環境の構築とDjangoのインストールが完了です。

 

 

 

<Java> 書き込み用クラス(PrintWriter)の使い方

来週行われるGoogle Code Jamに向けて、ファイル出力のやり方を確認したので、まとめます。

JavaDriveさんの記事を参考にさせていただきました。

www.javadrive.jp

 

PrintWriterクラスの特徴

最も便利な特徴としては、コンソールへの出力を行う時と同じように、"print"メソッドや"println"メソッドが用意されていることです。

そのため、コンソール出力の場合に

  1. System.out.println("Hello World!");

と記載するのと同じように、PrintWriterクラスのpwというインスタンスを使って、

  1. pw.println("Hello World!");

のように書けば、ファイルに出力を行うことができます。

 

PrintWriterクラスの使い方

TestPrintWriter.txtというファイルに"Hello World!"を出力する場合、コードは以下のようになります。

  1. import java.io.File;

  2. import java.io.FileWriter;

  3. import java.io.BufferedWriter;

  4. import java.io.PrintWriter;

  5.  

  6. public class Main {

  7.     public static void main(String[] args) throws Exception {

  8.         File file = new File("TestPrintWriter.txt");

  9.         FileWriter filewriter = new FileWriter(file);

  10.         BufferedWriter bw = new BufferedWriter(filewriter);

  11.         PrintWriter pw = new PrintWriter(bw);

  12.         pw.println("Hello World");

  13.         pw.close();

  14.     }

  15. }

 ポイント1. 必要なクラスのインポート(1〜4行目)

まず、java.ioパッケージに含まれるFile、FileWriter、BufferdWriter、PrintWriterクラスをインポートします。

ポイント2. Fileインスタンスの作成(8行目)

Fileインスタンスを作成し、Fileの出力するファイルのパスを指定します。

上記では相対パスで指定していますが、絶対パスで指定しても大丈夫です。

 

ポイント3. PrintWriterインスタンスの作成(9〜11行目)

PrintWriterインスタンスを作成するために、BufferedWriterインスタンスが必要となり、BufferdWriterインスタンスを作成するために、FileWriterインスタンスが必要となります。

そのため、まず9行目の「FileWriter filewriter = new FileWriter(file);」のようにFileWriterインスタンスを作成し、
次に10行目の「BufferedWriter bw = new BufferedWriter(filewriter);」のようにBufferedWriterインスタンスを作成します。

最後に「PrintWriter pw = new PrintWriter(bw);」のようにPrintWriterインスタンスを作成します。

 

ポイント4. PrintWriterインスタンスへの書き込み(13行目)

「pw.println("Hello World!");」のようにprintlnメソッドを使用して、pwに出力する内容を指定します。for文などを使用して、何行も出力することも可能です。

 

ポイント5. PrintWriterインスタンスのclose(15行目)

「pw.close();」で最後にファイルを閉じて、終了です。

 

 

<アルゴリズム>深さ優先探索

AOJの0118の問題(Property Distribution | Aizu Online Judge)を深さ優先探索で解いてみました。今日は深さ優先探索について、勉強した内容をメモします。

 

深さ優先探索とは

深さ優先探索 - Wikipediaによると、「深さ優先探索(ふかさゆうせんたんさく、英: depth-first search, DFS、バックトラック法ともいう)は、木やグラフを探索するためのアルゴリズムである。アルゴリズムは根から(グラフの場合はどのノードを根にするか決定する)始まり、バックトラックするまで可能な限り探索を行う。」とのことです。

以下のように、子のないノードに行き着くまで順々に深く伸びていくイメージです(ノードの番号が探索される順番です)。

f:id:todai_neet:20150914155755j:plain

使いどころ

現時点での理解なので、少し自信ないですが

  • 全パターン調べたい
  • 漸化式で表現できそう

という時は深さ優先探索が使えないか考えてみるといい気がします。 

アルゴリズムのポイント

使い方のイメージとして、AOJ0118で私がJavaで書いたコードは以下のようになります。

  1. import java.util.Scanner;
  2. import java.util.Deque;
  3. import java.util.ArrayDeque;

  4. public class Main {

  5.    static Scanner sc = new Scanner(System.in);

  6.    static int h, w;

  7.    static char fruitFarm;

  8.    static int dx = {-1, 0, 1, 0};

  9.    static int dy = {0, -1, 0, 1};

  10.    static Deque<int> stack

  11.    public static void main(String args){ 

  12.       while (true) {

  13.          h = sc.nextInt();

  14.          w = sc.nextInt();

  15.          if (h == 0 && w == 0) break;

  16.          //fruitFarm配列の作成

  17.          fruitFarm = new char[h][w];

  18.          for (int i = 0; i < h; i++) {

  19.             String s = sc.next();

  20.             for (int j = 0; j < w; j++) {

  21.                fruitFarm[i][j] = s.charAt(j);

  22.             }

  23.          }

  24.          int answer = 0;

  25.          for (int i = 0; i < h; i++) {

  26.             for (int j = 0; j < w; j++) {

  27.                if (fruitFarm[i][j] != '.') {

  28.                   stack = new ArrayDeque<int>();

  29.                   stack.offerLast(new int{i, j});

  30.                   //stackが空になった=それまで調べていた同じ種類の果物の区画が調べ終わった

  31.                   while (!stack.isEmpty()) {

  32.                      int xy = stack.pollLast();

  33.                      int x = xy[0];

  34.                      int y = xy[1];

  35.                      dfs(x, y);

  36.                   }

  37.                   answer++;

  38.                }

  39.             }

  40.          }

  41.          System.out.println(answer);

  42.       }

  43.    }

  44.  

  45.    static void dfs(int x, int y) {

  46.       char target = fruitFarm[x][y];

  47.       fruitFarm[x][y] = '.';

  48.       //移動する4方向をループ

  49.       for (int k = 0; k < 4; k++) {

  50.          int nx = x + dx[k];

  51.          int ny = y + dy[k];

  52.          //nxnyが区画の範囲内かどうか、同じ種類の果物が植えられているか判定

  53.          if (target != '.' && nx >= 0 && nx <= h - 1 && ny >= 0 && ny <= w - 1 && fruitFarm[nx][ny] == target) {

  54.             stack.offerLast(new int{nx, ny});
  55.          }
  56.       }

  57.    }

  58. }

特にポイントとなるのは

  • 33行目〜38行目のスタックを作成して、最初の位置情報を渡すところ
  • 47行目〜59行目の探索を行い、該当のものがあればスタックに情報を追加するところ

です。

<Java>Dequeインターフェースの使い方

深さ優先探索をする時にスタック使いたいなーと思ったので、Dequeインターフェースについて勉強してみました。Javaでスタックを実装する場合は、どうやらStackクラスを使うより、Dequeインターフェースを使ったほうがよいようです。

Dequeはデックと読みます。Double Ended Queueの略で、Collectionの前方と後方、双方に対して処理を実行できます。

ちなみにキューならQueueインターフェースがありますね。

続きを読む

<アルゴリズム>ワーシャルフロイド法

AOJの0200の問題(Traveling Alone: One-way Ticket of Youth | Aizu Online Judge)が最短経路問題だったのですが、ワーシャルフロイド法で解いてみたので、学んだ内容をメモしておきます。

続きを読む

<Java>Mapインターフェースの使い方

配列とリストについては前に少し調べましたが、マップについてはよくわかっていなかったので調べてみました。

キーと値のセットでマッピングを保持できて便利です。Mapインターフェースの使い方とメソッド、実装クラスについてメモします。

続きを読む