diff --git a/.github/list_languages b/.github/list_languages new file mode 100755 index 00000000000..27ee2e7999e --- /dev/null +++ b/.github/list_languages @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +import argparse +import json +import os +from pathlib import Path + + +def parse_langs(langs, include_beta): + for line in langs.readlines(): + description = line[3:-7] + code = line[-5:-3] + + if include_beta or 'beta' not in description: + yield code, description + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--include-beta', help='Include beta languages', default='false', + choices=('true', 'false')) + parser.add_argument('--langs-file', help='LANGS.md to use', + type=argparse.FileType('r', encoding='UTF-8'), + default=(Path(__file__).absolute().parent.parent / 'LANGS.md').as_posix()) + args = parser.parse_args() + + languages = dict(parse_langs(args.langs_file, args.include_beta == 'true')) + + if 'GITHUB_ACTION' in os.environ: + print(f'::set-output name=languages::{json.dumps(list(languages.keys()))}') + for code, language in languages.items(): + print(f'{language} ({code})') + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 00000000000..434e1f1aa4e --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,54 @@ +name: Update translations + +on: + workflow_dispatch: + inputs: + include_beta: + type: boolean + default: false + description: Include beta languages + +env: + GIT_AUTHOR_NAME: Django Girls Automation + GIT_AUTHOR_EMAIL: automation@djangogirls.org + +jobs: + list_languages: + name: List languages + runs-on: ubuntu-latest + outputs: + languages: ${{ steps.set_list.outputs.languages }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set the language list + id: set_list + run: ./.github/list_languages --include-beta ${{ inputs.include_beta }} + + update_language: + name: 'Update ${{ matrix.language }} translations from Crowdin' + needs: list_languages + if: ${{ needs.list_languages.outputs.languages != '[]' }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + language: ${{ fromJson(needs.list_languages.outputs.languages) }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Update language + run: | + wget https://crowdin.com/backend/download/project/django-girls-tutorial/${{ matrix.language }}.zip + unzip ${{ matrix.language }}.zip + find ${{ matrix.language }} -name '*.md' -delete + rsync -av master/${{ matrix.language }}*/* ${{ matrix.language }}/ + rm -rf ${{ matrix.language }}.zip master + - name: Open a PR + uses: peter-evans/create-pull-request@v3 + with: + commit-message: "Update ${{ matrix.language }} translations from Crowdin" + branch: "update_translations/${{ matrix.language }}" + title: "Update ${{ matrix.language }} translations from Crowdin" + body: '' + delete-branch: true diff --git a/ja/README.md b/ja/README.md index 165147d1c7e..7da60a87851 100644 --- a/ja/README.md +++ b/ja/README.md @@ -2,13 +2,13 @@ [![Gitter](https://badges.gitter.im/DjangoGirls/tutorial.svg)](https://gitter.im/DjangoGirls/tutorial) -> これは、Creative Commons Attribution-ShareAlike 4.0 International License のライセンスの下で提供しています。ライセンスについてはこちらをご確認ください。 https://creativecommons.org/licenses/by-sa/4.0/ +> これは、Creative Commons Attribution-ShareAlike 4.0 International License のライセンスの下で提供しています。ライセンスについてはこちらをご確認ください。 https://creativecommons.org/licenses/by-sa/4.0/deed.ja ## ウェルカム! -Django Girlsのチュートリアルにようこそ! お会いできて嬉しいです :) このチュートリアルでは、ウェブテクノロジーの中身を見て回る旅へあなたをお連れします。私たちが知っているようにウェブを動かすのに必要なものすべてを垣間見ることができるでしょう。 +Django Girlsのチュートリアルにようこそ! ここでお会いできてうれしいです :) このチュートリアルでは、ウェブテクノロジーの内側を見るたびにお連れします。私たちが知っているように、ウェブを動かすのに必要な技術を垣間見ることができるでしょう。 -知らないことを学ぶことは冒険のようなものです - でも心配はいりません。あなたはすでに勇気を出してここにいらっしゃるのですから、きっとうまくいくでしょう :) +全てが知らないことのように、これは冒険のようになるでしょう。けれど心配しないでください。あなたはすでに勇気をだしてここにいるのですから。上手くいくでしょう :) ## はじめに diff --git a/ja/SUMMARY.md b/ja/SUMMARY.md index 8a92ce208be..8f99cd0d28f 100644 --- a/ja/SUMMARY.md +++ b/ja/SUMMARY.md @@ -8,8 +8,8 @@ * [仮想環境](installation/README.md#virtualenv) * [Django](installation/README.md#django) * [Git](installation/README.md#git) - * [GitHub](installation/README.md#github) - * [PythonAnywhere](installation/README.md#pythonanywhere) + * [GitHub](installation/README.md#github-account) + * [PythonAnywhere](installation/README.md#pythonanywhere-account) * [Chromebookのセットアップ](chromebook_setup/README.md) * [インターネットのしくみ](how_the_internet_works/README.md) * [コマンドラインを使ってみよう](intro_to_command_line/README.md) diff --git a/ja/chromebook_setup/README.md b/ja/chromebook_setup/README.md index ff6832e668e..abcc0c7ed87 100644 --- a/ja/chromebook_setup/README.md +++ b/ja/chromebook_setup/README.md @@ -1,5 +1,5 @@ # Chromebook のセットアップ -> **注意**既にインストール手順を実行している場合は、これをやり直す必要はありません。すぐにスキップして[ Python入門](../python_introduction/README.md)へ進んでください。 +> **注意** 既にインストール手順を実行しているのなら再び行う必要はありません。スキップして[Python入門](../python_introduction/README.md)に進んでください。 {% include "/chromebook_setup/instructions.md" %} \ No newline at end of file diff --git a/ja/chromebook_setup/instructions.md b/ja/chromebook_setup/instructions.md index 92824b85a5b..fe7ec6824d2 100644 --- a/ja/chromebook_setup/instructions.md +++ b/ja/chromebook_setup/instructions.md @@ -1,8 +1,8 @@ Chromebookを使わない場合は、このセクションを飛ばして、[Pythonのインストール](http://tutorial.djangogirls.org/en/installation/#install-python) に進んでください。 もし利用している場合は、普通のインストールの作業とは少し異なります。 インストール手順の残りの部分は無視できます。 -### クラウドIDE (PaizaCloud Cloud IDE, AWS Cloud9) +### クラウドIDE (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com) -クラウドIDEはコードエディタと、インターネットにつながって動作し、ソフトウェアをインストールしたり、書いたり、実行したりできるコンピュータへのアクセスを提供するツールです。 チュートリアルを通して、クラウドIDEはまるであなたの*ローカルマシン*のように動作するでしょう。 みんながOS XやUbuntuやWindowsでやるのと同じようにターミナルからコマンドを実行できますが、そのターミナルはクラウドIDEが準備したどこかのコンピュータに接続されています。 さて、いろいろなクラウドIDE(PaizaCloud Cloud IDE, AWS Cloud9)について見ていきましょう。 クラウドIDEのうちどれかを選んで、指示に従ってください。 +クラウドIDEはコードエディタと、インターネットにつながって動作し、ソフトウェアをインストールしたり、書いたり、実行したりできるコンピュータへのアクセスを提供するツールです。 チュートリアルを通して、クラウドIDEはまるであなたの*ローカルマシン*のように動作するでしょう。 みんながOS XやUbuntuやWindowsでやるのと同じようにターミナルからコマンドを実行できますが、そのターミナルはクラウドIDEが準備したどこかのコンピュータに接続されています。 さて、いろいろなクラウドIDE(PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com)について見ていきましょう。 クラウドIDEのうちどれかを選んで、指示に従ってください。 #### PaizaCloud Cloud IDE @@ -43,31 +43,117 @@ Chromebookを使わない場合は、このセクションを飛ばして、[Pyt この下の部分が、あなたのターミナルです。このターミナルから、遠くにあるCloud 9のコンピュータに指示を送ることができます。ウィンドウのサイズを変更して少し大きくすることもできます。 -### 仮想環境 +#### Glitch.com Cloud IDE -仮想環境 (virtualenvとも呼ばれます) は、取り組んでいるプロジェクト用に、便利なコードを詰め込んでおけるプライベートボックスのようなものです。 様々なプロジェクトの様々なコードがプロジェクト間で混ざってしまわないように、仮想環境を使います。 - -以下を1行ずつ実行してください: - -{% filename %}Cloud 9{% endfilename %} - - mkdir djangogirls - cd djangogirls - python3.6 -mvenv myvenv - source myvenv/bin/activate - pip install django~={{ book.django_version }} +1. Glitch.com<0>に行く - -(最後の行は`~=`とチルダに続けてイコール記号をつけることに注意してください) - -### GitHub - -[GitHub](https://github.com)アカウントを作成してください。 - -### PythonAnywhere - -Django Girls チュートリアルには、デプロイと呼ばれるセクションが含まれています。これはあなたの新しいWebアプリケーションの原動力となるコードを取得して、それを公にアクセス可能なコンピュータ(サーバーと呼ばれます)に移動するプロセスです。これにより、あなたの作ったものを他の人が見られるようになります。 - -Chromebookでチュートリアルを行うとき、(例えばラップトップとは対照的に)インターネットに接続されているコンピュータをすでに使用しているので、この作業は少し変な感じがします。 しかし、Cloud 9のワークスペースを「開発中」の場所、PythonAnywhere をより完成したものを披露する場所として考えると役に立ちます。 - -したがって、[www.pythonanywhere.com](https://www.pythonanywhere.com) へ行って、PythonAnywhereの新規アカウントを作成してください。 \ No newline at end of file + - アカウントをサインアップ(https://glitch.com/signup)するか、GitHubアカウントを持っている場合はそれを使用します。(以下のGitHubの手順を参照してください) + - *新規プロジェクト* をクリックし、 *hello-webpage* を選択します。 + - ツールドロップダウンリスト(ウィンドウの左下にある)をクリックします。 次に、ターミナルのボタンを以下のようなプロンプトとともにターミナルを開くために、ターミナルボタンをクリックします。 + + {% filename %}Terminal{% endfilename %} + + app@name-of-your-glitch-project:~ + + + クラウドIDEとしてGlitch.comを使用する場合、仮想環境を作成する必要はありません。 代わりに、以下のファイルを手動で作成してください。 + + {% filename %}glitch.json{% endfilename %} + + ```json + { + "install": "pip3 install -r requirements.txt --user", + "start": "bash start.sh", + "watch": { + "throttle": 1000 + } + } + ``` + + {% filename %}requirements.txt{% endfilename %} + + Django~={{ book.django_version }} + + + {% filename %}.bash_profile{% endfilename %} + + ```bash + alias python=python3 + alias pip=pip3 + ``` + + {% filename %}start.sh{% endfilename %} + + ```bash + chmod 600 .bash_profile + pip3 install -r requirements.txt --user + python3 manage.py makemigrations + python3 manage.py migrate + python3 manage.py runserver $PORT + ``` + + これらのファイルが作成されたら、ターミナルに行き、次のコマンドを実行して最初のDjangoプロジェクトを作成します。 + + {% filename %}Terminal{% endfilename %} + + django-admin.py startproject mysite . + refresh + + + 詳細なエラーメッセージを表示するには、GlitchアプリケーションのDjangoデバッグログを有効にします。 `mysite/settings.py` ファイルの末尾に以下を追加するだけです。 + + {% filename %}mysite/settings.py{% endfilename %} + + ```python + LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'file': { + 'level': 'DEBUG', + 'class': 'logging.FileHandler', + 'filename': 'debug.log', + }, + }, + 'loggers': { + 'django': { + 'handlers': ['file'], + 'level': 'DEBUG', + 'propagate': True, + }, + }, + } + ``` + + これにより、Djangoの操作や出てくる可能性のあるエラーメッセージを詳細に記述した `debug.log` ファイルが作成されるので、ウェブサイトが動作しない場合の修正がとても簡単になります。 + + Glitch プロジェクトの最初の再起動は失敗するはずです。 (一番上のドロップダウンボタン `Show` をクリックし、`In a New Window` をクリックした場合、`DisallowedHost` のエラーメッセージが表示されます)。 この段階では心配しないでください。`mysite/settings.py` ファイルでプロジェクトのDjango設定を更新すれば、チュートリアルですぐに修正されます。 + + ### 仮想環境 + + 仮想環境 (virtualenvとも呼ばれます) は、取り組んでいるプロジェクト用に、便利なコードを詰め込んでおけるプライベートボックスのようなものです。 様々なプロジェクトの様々なコードがプロジェクト間で混ざってしまわないように、仮想環境を使います。 + + Run: + + {% filename %}Cloud 9{% endfilename %} + + mkdir djangogirls + cd djangogirls + python3 -m venv myvenv + source myvenv/bin/activate + pip install django~={{ book.django_version }} + + + (note that on the last line we use a tilde followed by an equal sign: `~=`). + + ### GitHub + + [GitHub](https://github.com) アカウントを作成します。 + + ### PythonAnywhere + + Django Girlsチュートリアルの目次には、デプロイと呼ばれるものに関するチャプターがあります。これはあなたの新しいWebアプリケーションの原動力となるコードを取得して、それを公にアクセス可能なコンピューター(サーバーと呼ばれます)に移動するプロセスです。これにより、あなたのやったことを他の人が見ることができるようになります。 + + Chromebookでチュートリアルを行うとき、この部分は少し奇妙に感じるかもしれません。 すでにインターネットに接続されているコンピュータを使用しているからです。 (例えば、ノートパソコンだとか) しかし、Cloud 9のワークスペースを「開発中」の場所、PythonAnywhere をより完成したものを披露する場所として考えると分かりやすいです。 + + したがって、新しいPythonAnywhereアカウントにサインアップしてください。 [ www.pythonanywhere.com ](https://www.pythonanywhere.com) \ No newline at end of file diff --git a/ja/code_editor/README.md b/ja/code_editor/README.md index 39a5576f1c2..cfae4e1e399 100644 --- a/ja/code_editor/README.md +++ b/ja/code_editor/README.md @@ -6,6 +6,6 @@ > **補足:** Chromebookを使っている方は、このチャプターは飛ばして、 [Chromebookのセットアップ](../chromebook_setup/README.md) の説明に従ってください。 あなたが選んだクラウドIDE(PaizaCloud Cloud IDE もしくは AWS Cloud9)にはコードエディタが含まれています。IDEのファイルメニューからファイルを開くと、自動的にエディタが使用できます。 > -> **注意** インストールの章で、コードエディタのインストールを前もって済ませた人もいるかもしれません。もしそうなら、飛ばして次の章に進んでください! +> **注意** [インストールの章](../installation/README.md)で既にコードエディターのダウウンロードを済ませてしまっているかもしれません。もしそうなら、スキップして次の章に進んでください! {% include "/code_editor/instructions.md" %} \ No newline at end of file diff --git a/ja/code_editor/instructions.md b/ja/code_editor/instructions.md index c4af07bbb1f..de1d5b879d6 100644 --- a/ja/code_editor/instructions.md +++ b/ja/code_editor/instructions.md @@ -34,4 +34,4 @@ Atomも人気のあるエディタで、無料でオープンソース、そし 2つ目の理由は、コードエディタは、コードを編集することに特化しているので、コードを意味によって色づけして強調したり、引用符を自動的に閉じたりするような、便利な機能があります。 -あとで使ってみて、こういった機能が全てわかるようになります。すぐに、信頼できる使い慣れたコードエディタが、お気に入りのツールになると思いますよ^^ +あとで使ってみて、こういった機能が全てわかるようになります。すぐに、信頼できる使い慣れたコードエディタが、お気に入りのツールになると思いますよ^^ \ No newline at end of file diff --git a/ja/css/README.md b/ja/css/README.md index 34dfdf55505..6019d46fac3 100644 --- a/ja/css/README.md +++ b/ja/css/README.md @@ -21,8 +21,7 @@ Bootstrap をインストールするため、`.html` ファイル (blog/templat {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html - - + ``` これは、あなたのプロジェクトにファイルを追加しているわけではありません。インターネット上にあるファイルを指しているだけです。では、Webサイトを開いてページを再読み込みしてください。 @@ -81,7 +80,7 @@ h1 a, h2 a { `h1 a` はCSSセレクタと呼ばれるものです。 これは、`h1`要素内の`a`要素にスタイルを適用していることを意味します。 `h2 a`セレクタは、`h2`要素に対して同じことを行います。 よって `

link

`となっているとき、 `h1 a` スタイルが適用されます。 この場合、その要素を `#C25100` に、つまり濃いオレンジ色にしようとしています。 あるいは、あなたの好きな色を設定することができますが、それが白い背景に対して良いコントラストを持つことを確認しましょう! -CSSファイルには、HTMLファイルの各要素のスタイルを指定していきます。 まずは要素名でもって、その要素を識別します。 HTMLのタグ名は覚えがあるでしょう。 例えば `a`, `h1`, `body` などが要素名の例です。 また、`class` 属性や、`id` 属性によって要素を識別することができます。 classやidは、あなたが自分で要素につけることができる名前です。 classは要素のグループを定義して、idは特定の要素を指定します。 例えば、次のタグは、タグ名 `a`、class名 `external_link`、id名 ` link_to_wiki_page`、どれを使ってもCSSによって識別されます。 +CSSファイルには、HTMLファイルの各要素のスタイルを指定していきます。 まずは要素名でもって、その要素を識別します。 HTMLのタグ名は覚えがあるでしょう。 例えば `a`, `h1`, `body` などが要素名の例です。 また、`class` 属性や、`id` 属性によって要素を識別することができます。 classやidは、あなたが自分で要素につけることができる名前です。 classは要素のグループを定義して、idは特定の要素を指定します。 例えば次のタグは、タグ名 `a`、class名 `external_link`、id名 ` link_to_wiki_page`、どれを使ってもCSSによって識別されます。 ```html @@ -113,24 +112,24 @@ CSSセレクタについては[CSS Selectors in w3schools](http://www.w3schools. ```html {% load static %} + Django Girls blog - - + -
+

Django Girls Blog

-
+ {% for post in posts %} -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} @@ -181,26 +180,28 @@ h1 a, h2 a { 前述のように、CSSはクラスの概念を持っています。 それにより、HTMLコードの一部に名前を指定し、他の部分に影響を与えずにこの部分にだけスタイルを適用することができます。 なんて便利なんでしょう! 例えば、2つのdiv要素(ヘッダーと記事など)があったとして、これらのそれぞれに違うスタイルを適用することができます。 クラスを利用すると、違う見た目にできるのです。 -先に進んで、HTMLコードの一部に名前をつけましょう。ヘッダーを含む`div` 要素に、`page-header` というクラス名をつけましょう: +先に進み、HTMLコードのいくつかの部分に名前を付けます。ヘッダーを含む `header` 要素を以下に置き換えます。 {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html - + ``` -さらにブログ投稿を含む `div` 要素に `post` というクラス名をつけましょう。 +さらにブログ投稿を含む `article` 要素に `post` というクラス名をつけましょう。 {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ ``` そして、さまざまなセレクタに宣言ブロックを追加します。 `.` で始まるセレクタはクラスに関連します。 Web上にはCSSに関する多くのチュートリアルがあり、それらは以下に示すコードを理解する手助けになるはずです。 今のところは、`blog/static/css/blog.css` のファイルに以下の内容をコピー&ペーストしましょう: @@ -211,20 +212,23 @@ h1 a, h2 a { .page-header { background-color: #C25100; margin-top: 0; + margin-bottom: 40px; padding: 20px 20px 20px 40px; } -.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active { +.page-header h1, +.page-header h1 a, +.page-header h1 a:visited, +.page-header h1 a:active { color: #ffffff; font-size: 36pt; text-decoration: none; } -.content { - margin-left: 40px; -} - -h1, h2, h3, h4 { +h1, +h2, +h3, +h4 { font-family: 'Lobster', cursive; } @@ -236,11 +240,14 @@ h1, h2, h3, h4 { float: right; } -.post-form textarea, .post-form input { +.post-form textarea, +.post-form input { width: 100%; } -.top-menu, .top-menu:hover, .top-menu:visited { +.top-menu, +.top-menu:hover, +.top-menu:visited { color: #ffffff; float: right; font-size: 26pt; @@ -251,9 +258,27 @@ h1, h2, h3, h4 { margin-bottom: 70px; } -.post h2 a, .post h2 a:visited { +.post h2 a, +.post h2 a:visited { color: #000000; } + +.post > .date, +.post > .actions { + float: right; +} + +.btn-secondary, +.btn-secondary:visited { + color: #C25100; + background: none; + border-color: #C25100; +} + +.btn-secondary:hover { + color: #FFFFFF; + background-color: #C25100; +} ``` では、投稿を表示しているHTMLコードをクラス宣言で囲みましょう。 `blog/templates/blog/post_list.html` 中のこの部分を @@ -262,11 +287,11 @@ h1, h2, h3, h4 { ```html {% for post in posts %} -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} ``` @@ -275,21 +300,21 @@ h1, h2, h3, h4 { {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html -
+
-
+
{% for post in posts %} -
-
-

published: {{ post.published_date }}

-
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %}
-
+
``` ファイルを保存してWebサイトを更新してみましょう。 diff --git a/ja/deploy/README.md b/ja/deploy/README.md index 7763c86fd07..a6b9662896d 100644 --- a/ja/deploy/README.md +++ b/ja/deploy/README.md @@ -12,7 +12,7 @@ # Git -> **注:**もし、すでにインストールしていた場合は再度行う必要はありません。次のセクションに進んであなたのGitリポジトリを作り始められます。 +> **注意** もしすでに[インストール手順](../installation/README.md)を行っていた場合は、このステップを再び行う必要はありません。次のステップにスキップして Git リポジトリを作り始めてください。 {% include "/deploy/install_git.md" %} @@ -32,32 +32,75 @@ Gitはコードリポジトリ(または略して「リポジトリ」)と gitリポジトリを初期化することは、プロジェクトごとに1回だけ行う必要があります(ユーザー名と電子メールをもう一度入力する必要はありません)。 -Git はこのディレクトリ内のすべてのファイルとフォルダの変更を追跡しますが、無視してほしいいくつかのファイルがあります。 ベースディレクトリ内で `.gitignore` という名前のファイルを作成することによってこれを行います。 あなたのエディターを開き、次の内容で新しいファイルを作成します。 +### ブランチ名の調整 + +使用しているGitのバージョンが **2.28** よりも古い場合は、ブランチの名前を「main」に変更する必要があります。 Gitのバージョンを調べるには、以下のコマンドを入力してください。 + +{% filename %}command-line{% endfilename %} + + $ git --version + git version 2.xx... + + +上記のように「xx」と表示されているバージョンの2番目の数が28未満の場合のみ、ブランチの名前を変更するために次のコマンドを入力する必要があります。 28以上の場合は「無視するファイル」へ続いてください。 As in "Initializing", this is something we need to do only once per project, as well as only when your version of Git is less than 2.28: + +{% filename %}command-line{% endfilename %} + + $ git branch -M main + + +### Ignoring files + +Git will track changes to all the files and folders in this directory, but there are some files we want it to ignore. We do this by creating a file called `.gitignore` in the base directory. Open up your editor and create a new file with the following contents: {% filename %}.gitignore{% endfilename %} + # Python *.pyc *~ - /.vscode __pycache__ - myvenv + + # Env + .env + myvenv/ + venv/ + + # Database db.sqlite3 - /static + + # Static folder at project root + /static/ + + # macOS + ._* .DS_Store + .fseventsd + .Spotlight-V100 + + # Windows + Thumbs.db* + ehthumbs*.db + [Dd]esktop.ini + $RECYCLE.BIN/ + + # Visual Studio + .vscode/ + .history/ + *.code-workspace -これを "djangogirls" フォルダ内に `.gitignore` という名前で保存します。 +そして"djangogirls"フォルダーに`.gitignore`という名前で保存します。 -> **備考:**ファイル名の先頭のドットは重要です! もしそのファイルを作るのが難しいなら、(Macをお使いの方はFinderからドット( . )で始まるファイルを作れません。)そういう時はエディタでSave Asから作成すれば問題ありません。 `.txt`や `.py`などの拡張子をファイル名に入れないように気をつけてください。 ファイル名が`.gitignore`でないとGitに認識されません。 +> **備考:**ファイル名の先頭のドットは重要です! もしそのファイルを作るのが難しいなら、(Macをお使いの方はFinderからドット( . )で始まるファイルを作れません。)そういう時はエディタでSave Asから作成すれば問題ありません。 `.txt`や `.py`などの拡張子をファイル名に入れないように気をつけてください。 ファイル名が`.gitignore`でないとGitに認識されません。 LinuxとMacOSは、(`.gitignore` のように) `.で始まる名前のファイルを隠しファイルとして扱います。通常のls`コマンドでは、これらのファイルは表示されません。 `.gitignore`fileを見つけるために、代わりに`ls -a`を使います。 > > **備考:** `.gitignore`ファイルで指定したファイルの1つが`db.sqlite3`です。 そのファイルはローカルデータベースで、すべてのユーザーと投稿が保存されます。 私達は標準的なウェブプログラミングの慣習に従います。つまり、ローカルのテストサイトとPythonAnywhere上の本番のウェブサイトでデータベースを分けるということです。 PythonAnywhereのデータベースは開発用のマシンと同じようにSQLiteにすることができますが、通常はMySQLというSQLiteよりもたくさんのサイト訪問者に対処できるデータベースを使用します。 どちらの方法でも、GitHubのコードのコピーではSQLiteデータベースを無視することで、これまでに作成したすべての投稿と管理者はそのままローカルで利用できますが、本番環境(ブログを公開するPythonAnywhereのことです)ではそれらを再び作成する必要があります。 ローカルデータベースは本当のブログ投稿をブログから削除してしまうことを心配せずに、さまざまなことをテストできるよい遊び場として考えるといいでしょう。 -`git add` コマンドを実行する前や、どのような変更を加えたか定かでない時は、 `git status` コマンドを使用する事をおすすめします。 これは間違ったファイルを追加またはコミットなど思いもかけない事を止めるために役立ちます。 `git status` コマンドは、あらゆる追跡されていない/変更されている/ステージされている(untracked/modifed/staged)ファイルや、ブランチの状態などさまざまな情報を返します。 出力は次のようになります。 +It's a good idea to use a `git status` command before `git add` or whenever you find yourself unsure of what has changed. This will help prevent any surprises from happening, such as wrong files being added or committed. The `git status` command returns information about any untracked/modified/staged files, the branch status, and much more. The output should be similar to the following: {% filename %}command-line{% endfilename %} $ git status - On branch master + On branch main No commits yet @@ -73,11 +116,11 @@ Git はこのディレクトリ内のすべてのファイルとフォルダの nothing added to commit but untracked files present (use "git add" to track) -最後に、変更内容を保存します。コンソールに移動し、これらのコマンドを実行します。 +And finally we save our changes. Go to your console and run these commands: {% filename %}command-line{% endfilename %} - $ git add --all . + $ git add . $ git commit -m "My Django Girls app, first commit" [...] 13 files changed, 200 insertions(+) @@ -88,135 +131,51 @@ Git はこのディレクトリ内のすべてのファイルとフォルダの ## GitHubにコードをプッシュする -[GitHub.com](https://www.github.com)にアクセスし、Sign upをクリックして無料の新規アカウントを作成してください。 (ワークショップの前にすでに作成していたら、それは素晴らしいです!) あなたのパスワードを忘れないようにしてください(使っていたら、パスワードマネージャーに入れておいてください) +Go to [GitHub.com](https://www.github.com) and sign up for a new, free user account. (If you already did that in the workshop prep, that is great!) Be sure to remember your password (add it to your password manager, if you use one). -そして、新しいリポジトリに "my-first-blog"の名前で新しいリポジトリを作成します。 "READMEで初期化する"チェックボックスをオフのままにし、.gitignoreオプションを空白にして(手動で行っています)、ライセンスをNoneのままにしておきます。 +Then, create a new repository, giving it the name "my-first-blog". Leave the "initialize with a README" checkbox unchecked, leave the .gitignore option blank (we've done that manually) and leave the License as None. ![](images/new_github_repo.png) > **注** `my-first-blog`という名前は重要です。何か他のものを選択することもできますが、以下の手順では何度も繰り返す必要があります。他の名前を選択した場合は、 毎回それを置き換えてください。 できれば、`my-first-blog` の名前にしておきましょう。 -次の画面では、リポジトリをクローンするためのURLが表示されます。これはこの後のコマンドで利用します。 +On the next screen, you'll be shown your repo's clone URL, which you will use in some of the commands that follow: ![](images/github_get_repo_url_screenshot.png) -そして自分のコンピューター上のGitリポジトリをGitHub上のGitリポジトリに結びつけてあげる必要があります。 +Now we need to hook up the Git repository on your computer to the one up on GitHub. -コンソールに次のように入力します(``をGitHubアカウントの作成時に入力したユーザー名に置き換えます。山カッコ<>を残さないでください。このURLはさっき見たクローンURLと一致する必要があります)。 +Type the following into your console (replace `` with the username you entered when you created your GitHub account, but without the angle-brackets -- the URL should match the clone URL you just saw). {% filename %}command-line{% endfilename %} $ git remote add origin https://github.com//my-first-blog.git - $ git push -u origin master + $ git push -u origin main -GitHubにプッシュするとき、GitHubのユーザー名とパスワードを聞かれます(コマンドライン上かポップアップウィンドウにて)。認証情報を入力したらこんな風に表示されます。 +When you push to GitHub, you'll be asked for your GitHub username and password (either right there in the command-line window or in a pop-up window), and after entering credentials you should see something like this: {% filename %}command-line{% endfilename %} Counting objects: 6, done. Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) - To https://github.com/ola/my-first-blog.git - * [new branch] master -> master - Branch master set up to track remote branch master from origin. - - - - -あなたのコードは今GitHub上にあります。 見に行きましょう! [ Django ](https://github.com/django/django)や[ Django Girls Tutorial ](https://github.com/DjangoGirls/tutorial)、その他たくさんの素晴らしいオープンソースソフトウェアプロジェクトもGitHubでコードをホストしています。 :) - -# PythonAnywhereでブログを設定する - -## PythonAnywhere アカウントにサインアップする - -> **備考:**あなたがすでにPythonAnywhereのアカウントを以前に作成しインストールの手順をふんでいたら、再びそれを行う必要はありません。 - -{% include "/deploy/signup_pythonanywhere.md" %} - -## PythonAnywhere でサイトを設定する - -ロゴをクリックしてメインの[PythonAnywhere Dashboard](https://www.pythonanywhere.com/)に戻り、「Bash」コンソールを起動するボタンをクリックします。これはPythonAnywhereバージョンのコマンドラインで、ちょうどあなたのコンピューターのコマンドラインと同じようなものです。 - -![PythonAnywhereのウェブインターフェースの「New Console」、「bash」ボタン](images/pythonanywhere_bash_console.png) - -> **備考:**PythonAnywhere は Linuxベースなので、Windowsを使っている場合は、コンソールがあなたのものと少し違って見えるでしょう。 - -PythonAnywhereにWebアプリケーションをデプロイするには、コードをGitHubからプルし、PythonAnywhereがそれを認識してWebアプリケーションのサーバを動かし始めるように設定する必要があります。 それを手動で行う方法もありますが、PythonAnywhereはそれをすべて行うヘルパーツールを提供しています。 まず、インストールしてみましょう。 - -{% filename %}PythonAnywhere command-line{% endfilename %} - - $ pip3.6 install --user pythonanywhere - -`Collecting pythonanywhere` のようなメッセージがいくつか出力され、最終的に`Successfully installed (...) pythonanywhere- (...)`という行で終わると思います。 - -GitHub からアプリを自動的に構成するためのヘルパーを実行します。 PythonAnywhereのコンソールに次のように入力します(GitHubからクローンするときのURLと一致するように、``の代わりにご自身のGitHubユーザー名を使用することを忘れないでください): - -{% filename %}PythonAnywhere command-line{% endfilename %} - - $ pa_autoconfigure_django.py --python=3.6 https://github.com//my-first-blog.git + * [new branch] main -> main + Branch main set up to track remote branch main from origin. -実行しているところを見れば、何をしているのかわかるでしょう。 - -- GitHubからコードをダウンロードする -- ちょうどあなたのPC上でやったように、PythonAnywhere上に仮想環境 を作成する -- 一部のデプロイメント設定で設定ファイルを更新する -- `manage.py migrate`コマンドを使ってPythonAnywhere上のデータベースをセットアップする -- 静的ファイルの設定(これについては後で学習します) -- APIを通じてPythonAnywhereがあなたのWebアプリケーションを提供するように設定する - -PythonAnywhereではこれらすべてのステップは自動化されていますが、他のサーバープロバイダーでは同じ手順を自分で実行しなければなりません。 - -今注目すべき重要な点は、PythonAnywhere上のデータベースが、自分のPC上のデータベースとはまったく別物であることです。つまり、異なる投稿と管理者アカウントを持つことができます。 その結果、自分のコンピュータで行ったように、`createsuperuser`で管理者アカウントを初期化する必要があります。 PythonAnywhereがあなたの代わりに仮想環境を自動的に起動したので、あなたがする必要があるのは以下の通りです: - -{% filename %}PythonAnywhere command-line{% endfilename %} - - (ola.pythonanywhere.com) $ python manage.py createsuperuser - - -管理者の詳細を入力します。 PythonAnywhere上のパスワードをより安全にしたい場合を除き、混乱を避けるために自分のコンピュータで使用しているのと同じものを使用することをお勧めします。 - -PythonAnywhereのコードを`ls`を使って見てみることもできます: - -{% filename %}PythonAnywhere command-line{% endfilename %} - - (ola.pythonanywhere.com) $ ls - blog db.sqlite3 manage.py mysite requirements.txt static - (ola.pythonanywhere.com) $ ls blog/ - __init__.py __pycache__ admin.py apps.py migrations models.py - tests.py views.py - - -また、Filesページに移動し、PythonAnywhereに組み込まれているファイルブラウザを使用して閲覧することもできます。 (ConsoleページからPythonAnywhereの他のページには、右上のメニューボタンからいけます。 一度いずれかのページに移動したら、他ページへのリンクは上部にあります。) - -## 動いています! - -あなたのサイトは現在、インターネット上で動作しているはずです! PythonAnywhereのWebページをクリックしてリンクを取得します。 あなたはあなたが望む誰とでもこれを共有することができます:) - -> **注** これは初心者向けのチュートリアルです。このサイトをデプロイする際にはセキュリティの観点からは理想的ではない、いくつかのショートカットをしました。 もしこのプロジェクトを利用すると決めたり、新しいプロジェクトを開始する場合は、あなたのサイトを安全にするいくつかのヒントについて、[Djangoデプロイチェックリスト](https://docs.djangoproject.com/ja/2.2/howto/deployment/checklist/)を注意深く読んでください。 - -## デバッギングのヒント - -`pa_autoconfigure_django.py`スクリプトの実行中にエラーが表示された場合は、次のような原因が考えられます。 - -- PythonAnywhere APIトークンの作成を忘れている -- あなたのGitHubのURLを間違えている -- *Could not find your settings.py*というエラーが表示された場合は、おそらくGitにすべてのファイルを追加できていなかったか、 GitHubにうまくプッシュできていなかった。 この場合はGitセクションをもう一度見てください -- PythonAnywhereのアカウントを以前に作成していてcollectstaticでエラーが起きたとしたら、あなたのアカウントで古いバージョンのSQLite(例えば、3.8.2)を使っている可能性があります。 その場合、新しいアカウントを作成して、上記のPythonAnywhereのセクションに記載しているコマンドを実行してください。 - -サイトにアクセスしようとするとエラーが表示された場合、最初にデバッグ情報を探す場所は**エラーログ**です。 PythonAnywhereの[ Webページ](https://www.pythonanywhere.com/web_app_setup/)には、エラーログへのリンクがあります。 そこにエラーメッセージがあるかどうかを確認してください。 最新のものは一番下にあります。 + -[ PythonAnywhereヘルプサイトの一般的なデバッグのヒント](http://help.pythonanywhere.com/pages/DebuggingImportError)もあります。 +Your code is now on GitHub. Go and check it out! You'll find it's in fine company – [Django](https://github.com/django/django), the [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial), and many other great open source software projects also host their code on GitHub. :) -つまづいた時は、コーチに助けを求めましょう。 +{% include "/deploy/pythonanywhere.md" %} -# あなたのサイトをチェック! +# Check out your site! -サイトのデフォルトページでは、ローカルコンピュータと同じように「It worked!」と表示されます。 URLの最後に`/admin/`を追加すると、管理サイトに移動します。 ユーザー名とパスワードでログインしたら、Postsへのリンクからサーバーに新規投稿を追加できることがわかるでしょう。ローカルのテスト用データベースの投稿は本番環境のブログに送られていないことも忘れないてくださいね。 +The default page for your site should say "It worked!", just like it does on your local computer. Try adding `/admin/` to the end of the URL, and you'll be taken to the admin site. Log in with the username and password, and you'll see you can add new Posts on the server -- remember, the posts from your local test database were not sent to your live blog. -いくつかの投稿を作成したら、ローカル環境(PythonAnywhereではなく)に戻ることができます。 ここから、変更を加えるためにはあなたのローカル環境で作業する必要があります。 これがWeb開発の一般的なワークフローです。ローカルで変更し、それらの変更をGitHubにプッシュし、それからその変更を公開しているWebサーバーにプルしてきます。 これにより、公開しているWebサイトを壊すことなく作業したり試したりできます。 とってもクールでしょ? +Once you have a few posts created, you can go back to your local setup (not PythonAnywhere). From here you should work on your local setup to make changes. This is a common workflow in web development – make changes locally, push those changes to GitHub, and pull your changes down to your live Web server. This allows you to work and experiment without breaking your live Web site. Pretty cool, huh? -自分を*すっごく*褒めてあげてください! サーバーのデプロイはWeb開発の最も難しい部分の1つで、ちゃんと動くようになるまで数日かかることもよくあります。 しかし、あなたは実際のインターネット上で、あなたのサイトを動かす事ができました! \ No newline at end of file +Give yourself a *HUGE* pat on the back! Server deployments are one of the trickiest parts of web development and it often takes people several days before they get them working. But you've got your site live, on the real Internet! \ No newline at end of file diff --git a/ja/deploy/install_git.md b/ja/deploy/install_git.md index f994671fc46..efe2bee0b39 100644 --- a/ja/deploy/install_git.md +++ b/ja/deploy/install_git.md @@ -7,6 +7,8 @@ data-collapse=true ces--> [git-scm.com](https://git-scm.com/) からGitをダウンロードすることができます。 2つのステップを除いて「次へ」を押して進んで大丈夫です。エディタを選ぶステップでは、Nanoを選んでください。「PATH環境を調整する(Adjusting your PATH environment)」というステップでは、「Use Git and optional Unix tools from the Windows Command Prompt(WindowsコマンドプロンプトからGitとオプションのUnixツールを使用する)」(一番下の選択肢)を選択します。 それ以外はデフォルトの設定値で構いません。 改行コードの変換(Configuring the line ending conversions)については、「Checkout Windows-style, commit Unix-style line endings」の選択で大丈夫です。 +インストール中、「Adjusting the name of the initial branch in new repositories(新しいリポジトリの最初のブランチ名を調整する)」オプションが表示されている場合、「Override the default(デフォルトを上書きする)」 を選択し「main」を使用してください。 これにより、あなたがインストールしたGitが世界中の開発者コミュニティの幅広い方向性に沿ったものになります。このチュートリアルの残りの部分では、「main」ブランチを使用します。 この詳細については、https://sfconservancy.org/news/2020/jun/23/gitbranchname/ および https://github.com/github/renamingを参照してください。 + インストールが正常に終了した後、コマンドプロンプトまたはPowerShellを再起動することを忘れないでください。 [git-scm.com](https://git-scm.com/) からGitをダウンロードし、指示に従ってください。 +インストール中、「Adjusting the name of the initial branch in new repositories(新しいリポジトリの最初のブランチ名を調整する)」オプションが表示されている場合、「Override the default(デフォルトを上書きする)」 を選択し「main」を使用してください。 これにより、あなたがインストールしたGitが世界中の開発者コミュニティの幅広い方向性に沿ったものになります。このチュートリアルの残りの部分では、「main」ブランチを使用します。 この詳細については、https://sfconservancy.org/news/2020/jun/23/gitbranchname/ および https://github.com/github/renamingを参照してください。 + > **注** OS X 10.6,10.7、または10.8を実行している場合は、ここからgitのバージョンをインストールする必要があります: [Git installer for OS X Snow Leopard](https://sourceforge.net/projects/git-osx-installer/files/git-2.3.5-intel-universal-snow-leopard.dmg/download) @@ -27,6 +31,15 @@ data-collapse=true ces--> $ sudo apt install git ``` +### デフォルトブランチ名を設定する + +これにより、あなたがインストールしたGitが世界中の開発者コミュニティの幅広い方向性に沿ったものになります。このチュートリアルの残りの部分では、「main」ブランチを使用します。 この詳細については、https://sfconservancy.org/news/2020/jun/23/gitbranchname/ および https://github.com/github/renamingを参照してください。 + +{% filename %}command-line{% endfilename %} + + $ git config --global --add init.defaultBranch main + + $ sudo dnf install git ``` +### デフォルトブランチ名を設定する + +これにより、あなたがインストールしたGitが世界中の開発者コミュニティの幅広い方向性に沿ったものになります。このチュートリアルの残りの部分では、「main」ブランチを使用します。 この詳細については、https://sfconservancy.org/news/2020/jun/23/gitbranchname/ および https://github.com/github/renamingを参照してください。 + +{% filename %}command-line{% endfilename %} + + $ git config --global --add init.defaultBranch main + + $ sudo zypper install git ``` +### デフォルトブランチ名を設定する + +これにより、あなたがインストールしたGitが世界中の開発者コミュニティの幅広い方向性に沿ったものになります。このチュートリアルの残りの部分では、「main」ブランチを使用します。 この詳細については、https://sfconservancy.org/news/2020/jun/23/gitbranchname/ および https://github.com/github/renamingを参照してください。 + +{% filename %}command-line{% endfilename %} + + $ git config --global --add init.defaultBranch main + + \ No newline at end of file diff --git a/ja/deploy/pythonanywhere.md b/ja/deploy/pythonanywhere.md new file mode 100644 index 00000000000..d3d63ae6ae4 --- /dev/null +++ b/ja/deploy/pythonanywhere.md @@ -0,0 +1,88 @@ +# Setting up our blog on PythonAnywhere + +## Sign up for a PythonAnywhere account + +> **Note** You might have already created a PythonAnywhere account earlier during the install steps – if so, no need to do it again. +> +> {% include "/deploy/signup_pythonanywhere.md" %} + + +## Configuring our site on PythonAnywhere + +Go back to the main [PythonAnywhere Dashboard](https://www.pythonanywhere.com/) by clicking on the logo, and choose the option to start a "Bash" console – that's the PythonAnywhere version of a command line, just like the one on your computer. + +![The 'New Console' section on the PythonAnywhere web interface, with a button for 'bash'](images/pythonanywhere_bash_console.png) + +> **Note** PythonAnywhere is based on Linux, so if you're on Windows, the console will look a little different from the one on your computer. Deploying a web app on PythonAnywhere involves pulling down your code from GitHub, and then configuring PythonAnywhere to recognise it and start serving it as a web application. There are manual ways of doing it, but PythonAnywhere provides a helper tool that will do it all for you. Let's install it first: + +{% filename %}PythonAnywhere command-line{% endfilename %} +``` +$ pip{{ book.pa_py_version }} install --user pythonanywhere +``` + +That should print out some things like `Collecting pythonanywhere`, and eventually end with a line saying `Successfully installed (...) pythonanywhere- (...)`. + +Now we run the helper to automatically configure our app from GitHub. Type the following into the console on PythonAnywhere (don't forget to use your GitHub username in place of ``, so that the URL matches the clone URL from GitHub): + +{% filename %}PythonAnywhere command-line{% endfilename %} +``` +$ pa_autoconfigure_django.py --python={{ book.pa_py_version }} https://github.com//my-first-blog.git +``` + +As you watch that running, you'll be able to see what it's doing: + +- Downloading your code from GitHub +- Creating a virtualenv on PythonAnywhere, just like the one on your own computer +- Updating your settings file with some deployment settings +- Setting up a database on PythonAnywhere using the `manage.py migrate` command +- Setting up your static files (we'll learn about these later) +- And configuring PythonAnywhere to serve your web app via its API + +On PythonAnywhere all those steps are automated, but they're the same steps you would have to go through with any other server provider. + +The main thing to notice right now is that your database on PythonAnywhere is actually totally separate from your database on your own computer, so it can have different posts and admin accounts. As a result, just as we did on your own computer, we need to initialize the admin account with `createsuperuser`. PythonAnywhere has automatically activated your virtualenv for you, so all you need to do is run: + +{% filename %}PythonAnywhere command-line{% endfilename %} +``` +(ola.pythonanywhere.com) $ python manage.py createsuperuser +``` + +Type in the details for your admin user. Best to use the same ones as you're using on your own computer to avoid any confusion, unless you want to make the password on PythonAnywhere more secure. + +Now, if you like, you can also take a look at your code on PythonAnywhere using `ls`: + +{% filename %}PythonAnywhere command-line{% endfilename %} +``` +(ola.pythonanywhere.com) $ ls +blog db.sqlite3 manage.py mysite requirements.txt static +(ola.pythonanywhere.com) $ ls blog/ +__init__.py __pycache__ admin.py apps.py migrations models.py +tests.py views.py +``` + +You can also go to the "Files" page and navigate around using PythonAnywhere's built-in file browser. (From the Console page, you can get to other PythonAnywhere pages from the menu button in the upper right corner. Once you're on one of the pages, there are links to the other ones near the top.) + + +## You are now live! + +Your site should now be live on the public Internet! Click through to the PythonAnywhere "Web" page to get a link to it. You can share this with anyone you want. :) + + +> **Note** This is a beginners' tutorial, and in deploying this site we've taken a few shortcuts which aren't ideal from a security point of view. If and when you decide to build on this project, or start a new project, you should review the [Django deployment checklist](https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/) for some tips on securing your site. + +## Debugging tips + + +If you see an error while running the `pa_autoconfigure_django.py` script, here are a few common causes: + +- Forgetting to create your PythonAnywhere API token. +- Making a mistake in your GitHub URL +- If you see an error saying *"Could not find your settings.py"*, it's probably because you didn't manage to add all your files to Git, and/or you didn't push them up to GitHub successfully. Have another look at the Git section above +- If you previously signed up for a PythonAnywhere account and had an error with collectstatic, you probably have an older version of SQLite (eg 3.8.2) for your account. In that case, sign up for a new account and try the commands in the PythonAnywhere section above. + + +If you see an error when you try to visit your site, the first place to look for some debugging info is in your **error log**. You'll find a link to this on the PythonAnywhere ["Web" page](https://www.pythonanywhere.com/web_app_setup/). See if there are any error messages in there; the most recent ones are at the bottom. + +There are also some [general debugging tips on the PythonAnywhere help site](http://help.pythonanywhere.com/pages/DebuggingImportError). + +And remember, your coach is here to help! diff --git a/ja/django_admin/README.md b/ja/django_admin/README.md index 9feaee9d5eb..882c20e3f6f 100644 --- a/ja/django_admin/README.md +++ b/ja/django_admin/README.md @@ -1,6 +1,6 @@ # Django admin -今作成したポストを追加、編集、削除するのにDjango adminを使います。 +ブログの投稿を追加、編集、削除するのにDjango adminを使います。 `blog/admin.py`ファイルをエディタで開いて、内容をこのように変えて下さい: @@ -52,6 +52,6 @@ Postsをクリックして移動し、少し試してみましょう。 5つか6 ![Django admin](images/edit_post3.png) -Django adminについてもっと知りたいときは、Djangoのドキュメントを見るとよいでしょう。https://docs.djangoproject.com/ja/2.2/ref/contrib/admin/ +If you want to know more about Django admin, you should check Django's documentation: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/ ここでそろそろコーヒー(または紅茶)か何か食べるものを摂って自分を元気づけるのにいいタイミングでしょう。最初のDjangoモデルを作ったのだから、少し休みをとっていいところです! \ No newline at end of file diff --git a/ja/django_forms/README.md b/ja/django_forms/README.md index 9137fd1026a..fad20285ea3 100644 --- a/ja/django_forms/README.md +++ b/ja/django_forms/README.md @@ -1,6 +1,6 @@ # Djangoフォーム -私たちのWebサイトで最終的にやりたいことは、記事を追加したり編集したりするためのよい方法を作ることです。 `Django admin`はかなりいいですが、カスタマイズしたりかわいくいい感じにするのはちょっと大変です。 `フォーム` によってインターフェイスを完璧にコントロールできるようになります。想像するほとんど全てのことができます! +私たちのWebサイトで最終的にやりたいことは、投稿を追加したり編集したりするためのよい方法を作ることです。 `Django admin`はかなりいいですが、カスタマイズしたりかわいくいい感じにするのはちょっと大変です。 `フォーム` によってインターフェイスを完璧にコントロールできるようになります。想像するほとんど全てのことができます! Djangoフォームのよいところは、フォームをゼロから定義できたり、フォームの結果をモデルに保存できる`ModelForm`を作れたりするところです。 @@ -36,7 +36,7 @@ class PostForm(forms.ModelForm): 次に`class Meta`ですが、ここでDjangoにフォームを作るときにどのモデルを使えばいいか (`model = Post`) を伝えます。 -最後にフォームのフィールドに何を置くか書きます。 ここでは、私たちは`title`(タイトル)と `text`(本文)のみをフォームで使用します。 `author` は現在ログインしている人(あなた)です。 `created_date` は(コードによって)自動的に記事を書いた日時が設定されます。 +最後にフォームのフィールドに何を置くか書きます。 今回は、私たちは`title`(タイトル)と `text`(本文)のみをフォームで使用します。 `author` は現在ログインしている人(あなた)です。 `created_date` は(コードによって)自動的に投稿を作った日時が設定されます。 ひとまずこれでおしまいです!あとはフォームを*ビュー*で使い、それをテンプレート内に表示しさえすればいいです。 @@ -44,15 +44,23 @@ class PostForm(forms.ModelForm): ## フォームにおけるページへのリンク -`blog/templates/blog/base.html` をエディタで開きましょう。`page-header` と名付けた `div` 中に次のリンクを追加します: +リンクを追加する前に、いくつかのアイコンをリンクのボタンとして使用する必要があります。 このチュートリアルでは、 [file-earmark-plus.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/file-earmark-plus.svg) をダウンロードし、 `blog/templates/blog/icons/` に保存してください。 + +> 注意: SVG 画像をダウンロードするには、リンク上のコンテキストメニュー(通常は右クリックして)を開き、「名前を付けてリンクを保存」を選択します。 ファイルを保存する場所を尋ねるダイアログでは、Djangoプロジェクトの `djangogirls` ディレクトリに移動し、その中のサブディレクトリ `blog/templates/blog/icons/` に移動して、そこにファイルを保存します。 + +`blog/templates/blog/base.html` をエディタで開きましょう。 これで基本テンプレート内のアイコンファイルを以下のように使用できます。 `header` セクション内の `div` 要素では、`h1` 要素の前にリンクを追加します。 {% filename %}blog/templates/blog/base.html{% endfilename %} ```html - + + {% include './icons/file-earmark-plus.svg' %} + ``` -新しいビュー` post_new `を呼び出すことに注意してください。 ` "glyphicon glyphicon-plus" `クラスは、使用しているBootstrapテーマによって提供され、プラス記号を表示します。 +`post_new`という新しいビューを作ります。 SVGアイコン [](https://icons.getbootstrap.com/icons/file-earmark-plus/) は [ブートストラップアイコン](https://icons.getbootstrap.com/) によって提供され、プラス記号のページアイコンが表示されます。 Djangoテンプレートディレクティブの `include` を使います。 これにより、Djangoテンプレートにファイルの内容が挿入されます。 ウェブブラウザは、この種のコンテンツを処理する方法を知っているので、これ以上の処理は必要ありません。 + +> ブートストラップアイコンは [こちら](https://github.com/twbs/icons/releases/download/v1.1.0/bootstrap-icons-1.1.0.zip)からダウンロードできます。 ファイルを解凍し、すべてのSVG画像ファイルを `blog/templates/blog/` の中の `icon` という新しいフォルダにコピーします。 これにより、`blog/templates/blog/icons/pencil-fill.svg` というファイルパスで `pencil-fill.svg` のようなアイコンにアクセスすることができます。 行を追加すると、このような html ファイルになります。 @@ -60,27 +68,31 @@ class PostForm(forms.ModelForm): ```html {% load static %} + Django Girls blog - - + - -
+ +
-
+
{% block content %} {% endblock %}
-
+
``` @@ -97,7 +109,7 @@ class PostForm(forms.ModelForm): path('post/new/', views.post_new, name='post_new'), ``` -すると最終的なコードは次のようになります: +次に、このような内容を追加します。 {% filename %}blog/urls.py{% endfilename %} @@ -134,20 +146,20 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -`Post`フォームを新しく作るには、`PostForm()`を呼び出し、それをテンプレートに渡す必要があります。 あとでこの *ビュー* に戻ってきますが、今はフォームのためのテンプレートをすぐに作ってしまいましょう。 +新しい `Post` フォームを作成するには、 `PostForm()` を呼び出してテンプレートに渡す必要があります。 あとでこの *ビュー* に戻ってきますが、今はフォームのためのテンプレートをすぐに作ってしまいましょう。 ## テンプレート -`blog/templates/blog`ディレクトリに`post_edit.html`ファイルを作り、エディタで開きましょう。フォームを動かすにはいくつかやることがあります。 +`blog/templates/blog` ディレクトリに `post_edit.html` ファイルを作成し、それをコード エディターで開きます。 フォームを動かすにはいくつかやることがあります。 * フォームを表示する必要があります。 私たちは(例えば){% raw %}`{{ form.as_p }}`{% endraw %} でこれを行うことができます。 * 上記の行は HTMLのformタグでラップする必要があります:`
...
` * `Save` ボタンが必要です。これをHTMLのbuttonタグで行います:`` * 最後に`
` タグの開始直後に、 `{% raw %}{% csrf_token %}{% endraw %}`を追加する必要があります。 フォームをセキュアにするためこれは非常に重要です! これを忘れると、Djangoはフォームを保存しようとすると文句を言うでしょう: -![CSFR 禁止のページ](images/csrf2.png) +![CSFR Forbiddenページ](images/csrf2.png) -では、`post_edit.html` のHTMLがどのようになるか見てみましょう: +では、 `post_edit.html` の HTML がどのように見えるか見てみましょう。 {% filename %}blog/templates/blog/post_edit.html{% endfilename %} @@ -158,14 +170,14 @@ def post_new(request):

New post

{% csrf_token %} {{ form.as_p }} - +
{% endblock %} ``` 更新をしてみましょう。やった!フォームが表示されます。 -![New form](images/new_form2.png) +![新規フォーム](images/new_form2.png) ちょっと待ってみて下さい。`title` と `text` フィールドに何か入力して保存するとどうなりますか? @@ -185,9 +197,9 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -フォームを送信したとき、同じビューに戻されていましたが、このとき`request`、もっと詳しくいうと `request.POST` にデータが追加されています (このPOSTという名前はブログ投稿 "post" とは関係ありません。このデータは送られてきたもの、というコトと関係しています) 。 HTMLファイルの `
` タグで、`method="POST"` という変数があったのを覚えていますか? これによってフォームのすべてのフィールドは今 `request.POST` にあります。 `POST` という名前を何か別のものに変えることはできません (他に唯一の有効な `method` の値は `GET` ですが、その違いを説明する時間がありません) 。 +フォームを送信すると、同じビューに戻ります。ただ、今回は `request` にいくつかのデータを足していきます。具体的には `request.POST` です。(ここでいう「POST」はブログの投稿を表す「post」とは関係ありません。「このデータは送られてきたもの」という意味で使われています)。 HTMLファイルの `` タグで、`method="POST"` という変数があったのを覚えていますか? フォームのすべてのフィールドが `request.POST` に入っています。 `POST` という名前を何か別のものに変えることはできません (他に唯一の有効な `method` の値は `GET` ですが、その違いを説明する時間がありません) 。 -私たちの *ビュー* では、扱わなくてはならない2つの別々のシチュエーションがあります: 1つ目は、最初にページにアクセスしてきた時で空白のフォームが必要な場合。2つ目はすべてのフォームデータが入力された状態で*ビュー*に戻ってくる場合です。 したがって条件分岐を追加する必要があります(そのために`if`を使います): +私たちの *ビュー* では、扱わなくてはならない2つの別々のシチュエーションがあります: 1つ目は、最初にページにアクセスしてきた時で空白のフォームが必要な場合。2つ目はすべてのフォームデータが入力された状態で*ビュー*に戻ってくる場合です。 したがって条件分岐を追加する必要があります(そのために`if`を使います)。それでは[...]の部分を埋めていきます。 {% filename %}blog/views.py{% endfilename %} @@ -198,7 +210,7 @@ else: form = PostForm() ``` -ドット `[...]` の部分を埋めていきましょう。 `method`が`POST`の場合、フォームのデータを使って`PostForm`を構築します。 私たちはそれを次のようにします: +`[...]` の部分を埋めていきましょう。 `method`が`POST`の場合、フォームのデータを使って`PostForm`を構築します。 以下のようにします。 {% filename %}blog/views.py{% endfilename %} @@ -220,9 +232,9 @@ if form.is_valid(): post.save() ``` -基本的にここでは2つのことを行います。まず `form.save` でフォームを保存することと author を追加することです (`PostForm` 内に `author` フィールドがありませんし、このフィールドは必須です) 。 `commit=False` は `Post` モデルをまだ保存しないという意味です。保存前に author を追加したいので。 ほとんどの場合、`commit=False`なしで`form.save()`を使用しますが、この場合はそれを指定する必要があります。 `post.save()`は変更を保存し(作成者を追加しつつ)、新しいブログ投稿が作成されます! +基本的にここでは2つのことを行います。まず `form.save` でフォームを保存することと author を追加することです (`PostForm` 内に `author` フィールドがありませんし、このフィールドは必須です) 。 `commit=False` は、`Post` モデルをまだ保存したくない、まず author を追加したいという意味です。 ほとんどの場合、 `commit=False` を指定せずに `form.save()`を使用しますが、この場合はそれを指定する必要があります。 `post.save()` はauthor を追加しつつ変更を保存し、新しいブログ投稿が作成されます! -最後に、新しく作成された記事の `post_detail` ページを表示できれば良いですよね? そのために次のインポートを追加します: +最後に、新しく作成された投稿の `post_detail` ページを表示できれば良いですよね? そのために次のインポートを追加します: {% filename %}blog/views.py{% endfilename %} @@ -230,7 +242,7 @@ if form.is_valid(): from django.shortcuts import redirect ``` -ファイルの先頭に追加します。これで新しく作成されたポストの `post_detail` ページに移動する処理を書けます。 +これをファイルの先頭に追加します。これでようやく、新しく作成されたポストのための `post_detail` ページに移動する処理を書けます。 {% filename %}blog/views.py{% endfilename %} @@ -238,9 +250,9 @@ from django.shortcuts import redirect return redirect('post_detail', pk=post.pk) ``` -`post_detail` は移動したいビューの名前です。 この *ビュー* では `pk` 変数が必須であることを覚えていますか? ビューにそれを渡すため、`pk=post.pk`を使います。この `post` は新しく作られたブログポストです! +`post_detail` は移動したいビューの名前です。 この *ビュー* では `pk` 変数が必須であることを覚えていますか? ビューにそれを渡すため、`pk=post.pk`を使います。この `post` は新しく作られたブログの投稿です! -ふー、たくさんのことを話してきましたが、そろそろ *ビュー* の全体がどんな感じか見てみたい頃じゃないでしょうか? +OK, たくさんのことを説明しました。全体の view は以下のようになります。 {% filename %}blog/views.py{% endfilename %} @@ -259,19 +271,19 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -では動作確認してみましょう。 http://127.0.0.1:8000/post/new/ に行き、 `title` と `text` を追加し、保存すると…… じゃじゃーん! 新しいブログ記事が追加され、post_detail にリダイレクトされます! +うまくいくかどうか見てみましょう。 http://127.0.0.1:8000/post/new/ に行き、 `title` と `text` を追加し、保存すると…… じゃじゃーん! 新しいブログ投稿が追加され、 `post_detail` ページにリダイレクトされます! -ブログ記事を保存する前に公開日をセットしていることに気づいたかもしれません。後ほど、**Django Girls Tutorial: Extensions**にて *公開ボタン* を導入します。 +投稿を保存する前に公開日を設定していることに気づいたかもしれません。 後で、 **Django Girls Tutorial: Extensions** にて *publish button* を紹介します。 素晴らしい! -> 最近までDjango adminを使ってきたので、システム上で今まだログイン状態かと思います。 いくつかの状況ではログアウト状態になることがあります(ブラウザを閉じる、DBを再起動するなど..)。 投稿を作成するときに、ログインユーザーがわからないというエラーが発生した場合は、管理ページhttp://127.0.0.1:8000/admin にアクセスして再度ログインしてください。 その問題は一時的に解決します。 メインチュートリアルの後 **Homework: add security to your website!** の章に恒久的な対策がありますので宿題として取り組んでみてください。 +> Django adminを使ってきたので、システム上で今まだログイン状態かと思います。 いくつかの状況ではログアウト状態になることがあります(ブラウザを閉じる、DBを再起動するなど..)。 投稿を作成するときに、ログインユーザーがわからないというエラーが発生した場合は、管理ページhttp://127.0.0.1:8000/admin にアクセスして再度ログインしてください。 これは一時的に問題を解決します。 メインチュートリアルの後 **Homework: add security to your website!** の章に恒久的な対策がありますので宿題として取り組んでみてください。 ![ログインエラー](images/post_create_error.png) ## フォームのバリデーション(検証) -ここではDjangoのフォームのクールなところを紹介します。 ブログのポストは `title` と `text` のフィールドが必要です。 `Post` モデルではこれらのフィールドがなくてもよいとは書いておらず (`published_date` とは対照的に)、Djangoはその場合、それらのフィールドには何らかの値が設定されることを期待します。 +ここで、Djangoのフォームがいかにクールかをお見せします。 ブログの投稿は `title` と `text` のフィールドが必要です。 Post モデルでは、これらのフィールドがなくてもよいとは書いておらず(デフォルトの値が設定されている published_date とは対照的に)、Djangoではその場合、それらのフィールドには何らかの値が設定されないとエラーが起こるようになっています。 `title` と `text` を入力せずに保存してみましょう。何が起こるでしょうか? @@ -281,14 +293,20 @@ Djangoはフォームのすべてのフィールドが正しいことを検証 ## フォームの編集 -今、私たちは新しいフォームを追加する方法を知っています。 しかし既存のデータを編集するためはどうすれば良いのでしょうか? それは先ほど行ったことと非常に似ています。 すぐにいくつかの重要なものを作成してみましょう。 (もしわからない場合、コーチに尋ねるか、もしくはすでに手順をカバーしているので、前の章を見てください) +今や、私たちはどのように新しい投稿を追加するか知っています。 しかし、既存のものを編集したい場合はどうでしょうか? それは先ほど行ったことと非常に似ています。 すぐに重要なものを作成してみましょう。 (わからないことがあれば、コーチに聞くか、前の章を見てください。これらのステップはすでにすべてカバーしていますので) + +まず、編集ボタンを表すアイコンを保存しましょう。 [pencil-fill.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/pencil-fill.svg) をダウンロードし、 `blog/templates/blog/icons/` に保存します。 -`blog/templates/blog/post_detail.html` をエディタで開いて次の行を追加します +`blog/templates/blog/post_detail.html` をコードエディタで開き、 `article` 要素内に次のコードを追加します。 {% filename %}blog/templates/blog/post_detail.html{% endfilename %} ```html - + ``` テンプレートは次のようになります: @@ -299,16 +317,20 @@ Djangoはフォームのすべてのフィールドが正しいことを検証 {% extends 'blog/base.html' %} {% block content %} -
+
+ {% endblock %} ``` @@ -342,7 +364,7 @@ def post_edit(request, pk): return render(request, 'blog/post_edit.html', {'form': form}) ``` -`post_new` とほとんど同じに見えますか? しかし完全に同じではありません。 まず `urls` から追加の `pk` パラメータを渡します。 次に編集したい`Post` モデルを `get_object_or_404(Post, pk=pk)` で取得し、フォームを作るときは以下の2つのケースのようにそのポストを`instance(インスタンス)`として渡します。フォームを保存するときは… +`post_new` とほとんど同じに見えますか? しかし完全に同じではありません。 まず `urls` から追加の `pk` パラメータを渡します。 次に編集したい`Post` モデルを `get_object_or_404(Post, pk=pk)` で取得し、フォームを作るときは以下の2つのケースのように、その投稿を `instance` として渡します。フォームを保存するときにも… {% filename %}blog/views.py{% endfilename %} @@ -350,7 +372,7 @@ def post_edit(request, pk): form = PostForm(request.POST, instance=post) ``` -…このポストを編集するためにただフォームを開く場合は: +…そしてこの投稿を編集するためにフォームを開いたときもそうです。 {% filename %}blog/views.py{% endfilename %} @@ -362,48 +384,54 @@ form = PostForm(instance=post) ![編集ボタン](images/edit_button2.png) -クリックするとブログ記事のフォームが表示されると思います: +クリックするとブログ投稿のフォームが表示されると思います: -![編集フォーム](images/edit_form2.png) +![フォームの編集](images/edit_form2.png) -あとはお気軽にタイトルやテキストを変更して保存してください! +あとは気軽にタイトルやテキストを変更して保存してください! おめでとう!アプリケーションが完成しました。 -Djangoのフォームについてもっと知りたい場合、Djangoのドキュメントを読んでください。https://docs.djangoproject.com/ja/2.2/topics/forms/ +If you need more information about Django forms, you should read the documentation: https://docs.djangoproject.com/en/3.2/topics/forms/ ## セキュリティ リンクをクリックするだけで新しい投稿を作成できることは素晴らしいことです! しかし、今、あなたのサイトにアクセスした人は誰でも新しいブログ投稿を作成することができます。それはおそらくあなたが望むものではありません。 ボタンはあなたのためには表示されますが、他の人には表示されないようにしましょう。 -`blog/templates/blog/base.html` をエディタで開き、`page-header` と名付けた `div` とそこに以前に入力したアンカータグを見つけます。 これは次のようになっています。 +`blog/templates/blog/base.html` をエディタで開き、`page-header` と名付けた `div` と、そこに以前に入力したアンカータグを見つけます。 これは次のようになっています。 {% filename %}blog/templates/blog/base.html{% endfilename %} ```html - + + {% include './icons/file-earmark-plus.svg' %} + ``` -これに`{% if %}`タグを追加し、管理者でログインしているユーザーのみにリンクを表示します。 今は、あなただけです! `` タグを以下のように変更します: +これに別の `{% if %}` タグを追加します。 このリンクは、管理者にログインしているユーザーのみ表示されます。 今、それはあなただけです! `` タグを以下のように変更します: {% filename %}blog/templates/blog/base.html{% endfilename %} ```html {% if user.is_authenticated %} - + + {% include './icons/file-earmark-plus.svg' %} + {% endif %} ``` -この`{% if %}`は、ページをリクエストしているユーザーがログインしている場合にのみ、リンクがブラウザに送信されるようにします。 これは新しい投稿の作成を完全に保護するものではありませんが、それは良い第一歩です。 私たちは拡張レッスンでより多くのセキュリティをカバーします。 +この `{% if %}` は、ページをリクエストするユーザーがログインしている場合にのみ、リンクをブラウザに送信します。 これは、新しい投稿の作成を完全に保護するものではありませんが、それは良い第一歩です。 エクステンションレッスンでは、より多くのセキュリティをカバーします。 詳細ページに追加した編集アイコンを覚えていますか? 他の人が既存の投稿を編集できないように、同じ変更を追加したいと思います。 -`blog/templates/blog/post_detail.html` をエディタで開いて次の行を見つけてください: +`blog/templates/blog/post_detail.html` をエディタで開いて、次の行を見つけてください: {% filename %}blog/templates/blog/post_detail.html{% endfilename %} ```html - + + {% include './icons/pencil-fill.svg' %} + ``` 以下のように変更してください: @@ -412,7 +440,9 @@ Djangoのフォームについてもっと知りたい場合、Djangoのドキ ```html {% if user.is_authenticated %} - + + {% include './icons/pencil-fill.svg' %} + {% endif %} ``` @@ -427,7 +457,7 @@ Djangoのフォームについてもっと知りたい場合、Djangoのドキ {% filename %}command-line{% endfilename %} $ git status - $ git add --all . + $ git add . $ git status $ git commit -m "Added views to create/edit blog post inside the site." $ git push @@ -442,8 +472,8 @@ Djangoのフォームについてもっと知りたい場合、Djangoのドキ [...] -(``の部分を、自分の実際のPythonAnywhereのサブドメイン名に山カッコをはずして置き換えることを忘れずに) +(忘れずに `` を自分のPythonAnywhereのサブドメイン名に置き換えましょう、<> は不要です。) * 最後に、[Webページ](https://www.pythonanywhere.com/web_app_setup/) に飛んで(コンソールの右上のメニューボタンを使ってもいいですね)それから **Reload** を押しましょう。 変更を見るためにあなたのブログ https://subdomain.pythonanywhere.com を再読み込みしましょう。 -うまくいってるはずです!おめでとう :) \ No newline at end of file +うまくいってるはずです!おめでとうございます! :) \ No newline at end of file diff --git a/ja/django_installation/README.md b/ja/django_installation/README.md index d4eef511648..2024d23ecc2 100644 --- a/ja/django_installation/README.md +++ b/ja/django_installation/README.md @@ -2,6 +2,6 @@ > **補足:** Chromebookを使っている方は、このチャプターは飛ばして、 [Chromebook Setup](../chromebook_setup/README.md) の説明に従ってセットアップしてください。 > -> **補足:**インストールのチャプターで既にインストール済みの方は、このチャプターは飛ばして次に進みましょう。 +> **注意** すでに[](../installation/README.md)インストールステップをすでに行っている場合は、次の章に進みましょう! {% include "/django_installation/instructions.md" %} \ No newline at end of file diff --git a/ja/django_installation/instructions.md b/ja/django_installation/instructions.md index f0700396692..8fe0089f345 100644 --- a/ja/django_installation/instructions.md +++ b/ja/django_installation/instructions.md @@ -37,7 +37,7 @@ data-collapse=true ces--> C:\Users\Name\djangogirls> python -m venv myvenv -`myvenv` というところが、あなたの`virtualenv(仮想環境)` の名前です。 どんな名前でも使うことができますが、必ず小文字で表記し、スペース・アクセント記号・特殊文字は入れないでください。 短い名前にしておくのもいいアイデアですーあなたはこの名前を何度も参照しますから! +`myvenv` というところが、あなたの`virtualenv(仮想環境)` の名前です。 どんな名前でも使うことができますが、必ず小文字で表記し、スペース・アクセント記号・特殊文字は入れないでください。 短い名前にしておくことは、いいアイデアです。今後あなたはこの名前を何度も参照して使いうことになりますからね! @@ -80,7 +80,7 @@ LinuxやOS Xで`virtualenv`を作るときは、`python3 -m venv myvenv`と実 > {% filename %}command-line{% endfilename %} > > $ sudo apt install python-virtualenv -> $ virtualenv --python=python3.6 myvenv +> $ virtualenv --python=python{{ book.py_version }} myvenv > > > **補足:**もし以下のようなエラーがでたら、 @@ -94,14 +94,14 @@ LinuxやOS Xで`virtualenv`を作るときは、`python3 -m venv myvenv`と実 > > {% filename %}command-line{% endfilename %} > -> sudo apt install python3.6-venv +> sudo apt install python{{ book.py_version }}-venv > ## 仮想環境の操作 -上に示したコマンドは仮想環境(基本的には一連のディレクトリとファイル)を含む`myvenv` という名前(あるいはあなたが選んだ名前)のディレクトリを生成します。次に我々がしたいのは、仮想環境を起動することです。 +上に示したコマンドで、`myvenv` という名前(あるいはあなたが選んだ名前)の仮想環境のディレクトリ(基本的には一連のディレクトリとファイルを含む)を作成しました。次に、私たちはこれを実行し開始することが必要です。 @@ -124,7 +124,7 @@ data-collapse=true ces--> -> **補足:** 人気のあるエディタであるVS Codeを使っている方は、VS CodeはWindows Powershellベースの統合ターミナルが一緒になっているので、統合ターミナルを使う場合、仮想環境を有効にするために下記のコマンドを実行してください: +> **補足:**人気のエディタであるVS Codeを使っている方は、Windows Powershellベースの統合型ターミナルが一緒になっているので、もしあなたが統合ターミナルを使い続けたいのであれば以下のコマンドを実行して仮想環境を有効化してください。 > > $ . myvenv\Scripts\activate.ps1 > @@ -145,7 +145,7 @@ data-collapse=true ces--> `myvenv` のところを、あなたが選んだ `仮想環境(virtualenv)` の名前に置き換えることを忘れないで下さいね! -> **備考:** `source` ではできない場合もあります。その場合は、代わりに以下のように入力してみてください: +> **注意:** コマンド `source` が使用できない場合は、代わりにこれを行ってみてください: > > {% filename %}command-line{% endfilename %} > @@ -196,7 +196,7 @@ requirementsファイルは `pip install` でインストールする依存関 (myvenv) ~$ pip install -r requirements.txt Collecting Django~={{ book.django_version }} (from -r requirements.txt (line 1)) - Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.1MB) + Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.9MB) Installing collected packages: Django Successfully installed Django-{{ book.django_version }} @@ -204,14 +204,14 @@ requirementsファイルは `pip install` でインストールする依存関 -> Windowsでpipを実行してエラーが起きた場合は、あなたのプロジェクトのパス名がスペースかアクセント記号か特殊文字を含んでいないか確認して下さい (例 `C:\Users\User Name\djangogirls`)。 もし含んでいる場合は、スペース・アクセント記号・特殊文字を含まない別の場所(`C:\djangogirls`をオススメします)でディレクトリを作成することを検討してみてください。 新しいディレクトリに新しい仮想環境を作成してから、古いディレクトリを削除して、上記のコマンドを試してください。 (仮想環境には絶対パスが使われているので、仮想環境のディレクトリを移動させてもうまくいきません。) +> Windowsでpipを呼んだときにエラーが起きた場合は、あなたのプロジェクトのパス名がスペース・アクセント・特殊文字を含んでいないか確認してみて下さい (例 `C:\Users\User Name\djangogirls`)。 もし含んでいる場合は、スペース・アクセント記号・特殊文字を含まない別の場所(`C:\djangogirls`をオススメします)でディレクトリを作成することを検討してみてください。 新しいディレクトリに新しい仮想環境を作成してから、古いディレクトリを削除して、上記のコマンドを試してください。 (仮想環境には絶対パスが使われているので、仮想環境のディレクトリを移動させてもうまくいきません。) -> Djangoをインストールしようとした後でコマンドラインがフリーズして動かなくなってしまうことがあります。その時は、以下のコマンドを代わりに入力してみてください。 +> Djangoをインストールしようとしてコマンドラインがフリーズして動かなくなってしまうことがあります。その時は、以下のコマンドを代わりに入力してみてください。 > > {% filename %}command-line{% endfilename %} > diff --git a/ja/django_models/README.md b/ja/django_models/README.md index f1e66fcadb3..2dc0f98036e 100644 --- a/ja/django_models/README.md +++ b/ja/django_models/README.md @@ -1,6 +1,6 @@ # Djangoモデル -さて、ブログの中のポストを格納するものが欲しいですよね。そのために `オブジェクト` についてちょっとお話しします。 +さて、ブログの投稿(記事、post ポスト)をためておくものが欲しいですよね。そのために `オブジェクト` についてちょっとお話しします。 ## オブジェクト @@ -30,11 +30,11 @@ つまり、オブジェクト指向とは実際の物を、プロパティ( `オブジェクト・プロパティ` と呼びます)と命令( `メソッド` と呼びます)を持つコードで表現するという考え方です。 -ではブログポストはどういうモデルになるでしょうか。ブログが作りたいんですよね? +ではブログの投稿はどういうモデルになるでしょうか。ブログが作りたいんですよね? -それにはブログポストとは何か、それはどんなプロパティがあるかという問いに答えなければなりません。 +それにはブログの投稿とは何か、それはどんなプロパティがあるかという問いに答えなければなりません。 -まず確実なのはブログポストにはコンテンツとタイトルが必要ですね。 それからそれを書いた人が分かるといいでしょう。 最後に、ポストをいつ作成、公開したかも分かるといいですね。 +まず確実なのはブログの投稿にはコンテンツとタイトルが必要ですね。 それからそれを書いた人が分かるといいでしょう。 最後に、投稿をいつ作成、公開したかも分かるといいですね。 Post -------- @@ -45,7 +45,7 @@ published_date -ではブログポストがどうなればいいですか?ポストが公開されるといいですよね? +ではブログの投稿でどんなことができたらいいでしょうか?投稿が公開されるといいですよね? なので `publish` メソッドが必要です。 @@ -53,9 +53,9 @@ ## Djangoモデル -オブジェクトが何か分かったので、ブログポストのDjangoモデルを作りましょう。 +オブジェクトが何か分かったので、ブログの投稿のDjangoモデルを作りましょう。 -Djangoのモデルは特別なオブジェクトで、`データベース` に格納されます。 データベースはデータの集まりです。 ここにユーザーやブログポストの情報を格納します。 データを格納するのにSQLiteデータベースを使います。 これはDjangoのデフォルトのデータベースで、今はこれで十分です。 +Djangoのモデルは特別なオブジェクトで、`データベース` に格納されます。 データベースはデータの集まりです。 ここにユーザーやブログの投稿の情報を格納します。 データを格納するのにSQLiteデータベースを使います。 これはDjangoのデフォルトのデータベースで、今はこれで十分です。 データベースの中のモデルは、列(フィールド)と行(データ)があるスプレッドシートと思ってもらっても結構です。 @@ -88,6 +88,7 @@ Djangoのモデルは特別なオブジェクトで、`データベース` に ├── db.sqlite3 ├── manage.py ├── mysite + │   ├── asgi.py │   ├── __init__.py │   ├── settings.py │   ├── urls.py @@ -98,7 +99,7 @@ Djangoのモデルは特別なオブジェクトで、`データベース` に -アプリケーションを作ったら、Djangoにそれを使うように伝えないといけません。 それは `mysite/settings.py` でします。エディタでこれを開いてください。 `INSTALLED_APPS` を見つけて `]` の上に `'blog.apps.BlogConfig',` という一行を追加します。 そうすると、最終的には以下のようになりますね。 +アプリケーションを作ったら、Djangoにそれを使うように伝えないといけません。 それは `mysite/settings.py` でします。エディタでこれを開いてください。 We need to find `INSTALLED_APPS` and add a line containing `'blog',` just above `]`. そうすると、最終的には以下のようになりますね。 {% filename %}mysite/settings.py{% endfilename %} @@ -110,13 +111,13 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'blog.apps.BlogConfig', + 'blog', ] ``` -### ブログポストモデルの作成 +### ブログの投稿のモデルの作成 -`blog/models.py` ファイルで `Model` と呼ばれるオブジェクトを全て定義します。これがブログポストを定義する場所です。 +`blog/models.py` ファイルで `Model` と呼ばれるオブジェクトを全て定義します。これがブログの投稿を定義する場所です。 `blog/models.py` をエディタで開いて中身を全部削除し、下のコードを書きましょう。 @@ -153,20 +154,20 @@ class Post(models.Model): - classはオブジェクトを定義してますよ、ということを示すキーワードです。 - `Post` はモデルの名前で、他の名前をつけることもできます(が、特殊文字と空白は避けなければいけません)。モデルの名前は大文字で始めます。 -- `models.Model` はポストがDjango Modelだという意味で、Djangoが、これはデータベースに保存すべきものだと分かるようにしています。 +- `models.Model` はPostがDjango Modelだという意味で、Djangoが、これはデータベースに保存すべきものだと分かるようにしています。 さて今度はプロパティを定義しましょう:`title`、`text`、`created_date`、`published_date`、それに `author` ですね。 それにはまずフィールドのタイプを決めなければいけません。(テキスト? 数値? 日付? 他のオブジェクト、例えばユーザーとの関係?) - `models.CharField` – 文字数が制限されたテキストを定義するフィールド -- `models.TextField` – これは制限無しの長いテキスト用です。ブログポストのコンテンツに理想的なフィールドでしょ? +- `models.TextField` – これは制限無しの長いテキスト用です。ブログの投稿のコンテンツに理想的なフィールドでしょ? - `models.DateTimeField` – 日付と時間のフィールド - `models.ForeignKey` – これは他のモデルへのリンク -コードの細かいところまでは説明し出すと時間がかかるので、ここではしませんが、 モデルのフィールドや上記以外の定義のやり方について知りたい方は是非Djangoドキュメントを見てみて下さい。 (https://docs.djangoproject.com/ja/2.2/ref/models/fields/#field-types) +コードの細かいところまでは説明し出すと時間がかかるので、ここではしませんが、 You should take a look at Django's documentation if you want to know more about Model fields and how to define things other than those described above (https://docs.djangoproject.com/en/3.2/ref/models/fields/#field-types). `def publish(self):` は何かと言うと、 これこそが先程お話ししたブログを公開するメソッドそのものです。 `def` は、これはファンクション(関数)/メソッドという意味です。`publish` はメソッドの名前で、 変えることもできます。 メソッドの名前に使っていいのは、英小文字とアンダースコアで、アンダースコアはスペースの代わりに使います。 (例えば、平均価格を計算するメソッドは `calculate_average_price` っていう名前にします) -メソッドは通常何かを `return` します。 一つの例が `__str__` メソッドにあります。 このシナリオでは、`__str__()` を呼ぶと、ポストのタイトルのテキスト(**string**)が返ってきます。 +メソッドは通常何かを `return` します。 一つの例が `__str__` メソッドにあります。 このシナリオでは、`__str__()` を呼ぶと、投稿のタイトルのテキスト(**string**)が返ってきます。 `def publish(self):` と `def __str__(self):` の両方が class キーワードに続く行でインデントされているのに気づきましたか? Pythonにモデルのメソッドだと伝えるために、class キーワードに続く行ではメソッドをインデントしましょう。 そうしないと、メソッドはモデルのものではなくなり、思ってもみない振る舞いをするでしょう。 @@ -180,9 +181,9 @@ class Post(models.Model): (myvenv) ~/djangogirls$ python manage.py makemigrations blog Migrations for 'blog': - blog/migrations/0001_initial.py: + blog/migrations/0001_initial.py - - Create model Post + - Create model Post **メモ:**編集したファイルを忘れずに保存してくださいね。保存しないと、コンピュータが以前のパージョンのファイルを実行してしまい、思ってもみないエラーメッセージに出くわすかもしれません。 @@ -198,4 +199,4 @@ Djangoが作ってくれた移行ファイルを私たちがデータベース Applying blog.0001_initial... OK -やった~!ポストモデルがデータベースに入りました。どうなったか見たいでしょ?次へ進みましょう! \ No newline at end of file +やった~!Postモデルがデータベースに入りました。どうなったか見たいでしょ?次へ進みましょう! \ No newline at end of file diff --git a/ja/django_orm/README.md b/ja/django_orm/README.md index 7eb762f9740..ef474837506 100644 --- a/ja/django_orm/README.md +++ b/ja/django_orm/README.md @@ -30,7 +30,7 @@ ### すべてのオブジェクト -最初に、ポストデータを全部表示させてみましょう。次のコマンドで、ポストのデータを全部表示させることが出来ます。 +最初に、投稿のデータを全部表示させてみましょう。次のコマンドで、投稿のデータを全部表示させることが出来ます。 {% filename %}command-line{% endfilename %} @@ -58,7 +58,7 @@ NameError: name 'Post' is not defined , ]> ``` -さっきDjangoの管理画面から作ったポストのリストが表示されました。だけど、次はこのコンソール画面から、新たにポストを作ってみたいですよね。それはどうすればいいのでしょうか。 +さっきDjangoの管理画面から作った投稿のリストが表示されました。だけど、次はこのコンソール画面から、新たに投稿を作ってみたいですよね。それはどうすればいいのでしょうか。 ### オブジェクトの作成 @@ -99,7 +99,7 @@ NameError: name 'Post' is not defined ola という `ユーザ名` の `User` モデルのインスタンスを、`取り出せ` たでしょう?よかった! -さあ、遂にコンソール画面から、最初のポストを作成出来ますね。 +さあ、遂にコンソール画面から、投稿を作成出来ますね。 {% filename %}command-line{% endfilename %} @@ -117,15 +117,15 @@ ola という `ユーザ名` の `User` モデルのインスタンスを、`取 , , ]> ``` -出来ていますね!リストに新しいポストが1つ追加されています。 +出来ていますね!リストに新しい投稿が1つ追加されています。 ### さらに投稿を追加しましょう -楽しくなってきたでしょう?理解を深めるためにもう少しポストを作っておきましょう。2〜3個記事を追加したら、次に進みましょう。 +楽しくなってきたでしょう?理解を深めるためにもう少し投稿を作っておきましょう。2〜3個記事を追加したら、次に進みましょう。 ### オブジェクトの抽出 -クエリセットの大部分は、抽出機能だと言えるでしょう。 ユーザolaさんのポストを全部確認してみましょうか。 全部のポストを取り出すのではなく、olaさんのポストだけを取り出したい場合は、`Post.objects.all()` の `all` を `filter` に変更します。 取り出されるブログポストが満たす条件を、カッコ()の中に指定します。 今回の例では、`author` が `me` と等しいという条件です。 Djangoでの表し方は、`author=me` となります。 このようになりますね。 +クエリセットの大部分は、抽出機能だと言えるでしょう。 ユーザolaさんの投稿を全部確認してみましょうか。 全部の投稿を取り出すのではなく、olaさんの投稿だけを取り出したい場合は、`Post.objects.all()` の `all` を `filter` に変更します。 取り出されるブログの投稿が満たす条件を、カッコ()の中に指定します。 今回の例では、`author` が `me` と等しいという条件です。 Djangoでの表し方は、`author=me` となります。 このようになりますね。 {% filename %}command-line{% endfilename %} @@ -134,7 +134,7 @@ ola という `ユーザ名` の `User` モデルのインスタンスを、`取 , , , ]> ``` -もしかすると `title` フィールドに title という単語が含まれているポストだけを取り出したくなるかもしれませんね。 +もしかすると `title` フィールドに title という単語が含まれている投稿だけを取り出したくなるかもしれませんね。 {% filename %}command-line{% endfilename %} @@ -145,7 +145,7 @@ ola という `ユーザ名` の `User` モデルのインスタンスを、`取 > **Note** `title` と `contains` の間に、アンダーバー (`_`) が2個続いていますが、 これはDjangoのORMの構文です。フィールド名のtitleと、照合タイプのcontainsを、2つのアンダーバーで連結させています。 もしアンダーバーが1個だけだと、title_contains というフィールド名だと判断されてしまい、エラーになります。("FieldError: Cannot resolve keyword title_contains") -また、公開済みの全ポストを取り出すことも出来ます。それには、`published_date` が現在以前の全ポストを取り出します。 +また、公開済みの全ての投稿を取り出すことも出来ます。それには、`published_date` が現在以前の全ての投稿を取り出します。 {% filename %}command-line{% endfilename %} @@ -155,7 +155,7 @@ ola という `ユーザ名` の `User` モデルのインスタンスを、`取 ``` -そうでした、残念なことに、コンソールから追加したポストはまだ公開されていませんね。じゃあ、ポストを公開してみるとしましょう。まず公開するポストを決めましょう。 +そうでした、残念なことに、コンソールから追加した投稿はまだ公開されていませんね。じゃあ、投稿を公開してみるとしましょう。まず公開する投稿を決めましょう。 {% filename %}command-line{% endfilename %} @@ -171,7 +171,7 @@ ola という `ユーザ名` の `User` モデルのインスタンスを、`取 >>> post.publish() ``` -じゃあ、もう一度公開済みのポストを取り出しましょう。(上方向キーを3回押せば、さっきのコマンドを呼び出せるでしょう。コマンドを表示出来たら、`Enter` キーを押してみましょう) +じゃあ、もう一度公開済みの投稿を取り出しましょう。(上方向キーを3回押せば、さっきのコマンドを呼び出せるでしょう。コマンドを表示出来たら、`Enter` キーを押してみましょう) {% filename %}command-line{% endfilename %} diff --git a/ja/django_start_project/README.md b/ja/django_start_project/README.md index d8421103b52..b87dddec551 100644 --- a/ja/django_start_project/README.md +++ b/ja/django_start_project/README.md @@ -47,6 +47,7 @@ django-admin.py は、必要なディレクトリとファイルを作成する djangogirls ├── manage.py ├── mysite + │   ├── asgi.py │   ├── __init__.py │   ├── settings.py │   ├── urls.py @@ -82,7 +83,7 @@ django-admin.py は、必要なディレクトリとファイルを作成する TIME_ZONE = 'Asia/Tokyo' ``` -言語コードは、言語(例えば、英語の場合は`en`、ドイツ語の場合は`de`のように表します)と、国コード(例えば、ドイツの場合は`de`、スイスの場合は`ch`のように表します)からできています。 あなたの母国語が英語でない場合、これを追加すると、Djangoのデフォルトのボタンや通知が設定した言語に変更されます。 ですのでたとえば「Cancel」ボタンがここで定義した言語に翻訳されます。 [Djangoは多くの言語に対応しています。](https://docs.djangoproject.com/ja/2.2/ref/settings/#language-code) +言語コードは、言語(例えば、英語の場合は`en`、ドイツ語の場合は`de`のように表します)と、国コード(例えば、ドイツの場合は`de`、スイスの場合は`ch`のように表します)からできています。 あなたの母国語が英語でない場合、これを追加すると、Djangoのデフォルトのボタンや通知が設定した言語に変更されます。 ですのでたとえば「Cancel」ボタンがここで定義した言語に翻訳されます。 [Django comes with a lot of prepared translations](https://docs.djangoproject.com/en/3.2/ref/settings/#language-code). 別の言語を使用する場合は、次の行を変更して言語コードを変更します。 @@ -98,7 +99,7 @@ LANGUAGE_CODE = 'ja' ```python STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_ROOT = BASE_DIR / 'static' ``` `DEBUG` が `True` に設定されていて、`ALLOWED_HOSTS` が空のリストの時は、自動的に `['localhost', '127.0.0.1', '[::1]']` という3つのホストに対してチェックが行われます。 このままの設定では、これから私たちがデプロイして使う PythonAnywhere のホストネームが含まれていません。ですから、次のように設定を変更します。 @@ -112,6 +113,48 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com'] > **メモ**: Chromebook を使っている人は、次の1行を settings.py ファイルの最後に追加してください。 `MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'` > > cloud9を使っている人は、 `ALLOWED_HOSTS` に、`.amazonaws.com` を追加しましょう。 +> +> If you are hosting your project on `Glitch.com`, let us protect the Django secret key that needs to remain confidential (otherwise, anyone remixing your project could see it): +> +> - まず、ランダムな秘密鍵を作成します。 Glitchのターミナル画面を再び開いて、次のコマンドを入力します。 +> +> {% filename %}command-line{% endfilename %} +> +> ```bash +> python -c 'from django.core.management.utils import get_random_secret_key; \ +> print(get_random_secret_key())' +> ``` +> +> このコマンドで、あなたが今回新しく作るDjangoのサイトの秘密鍵として使用するのに最適な、長いランダムな文字列が表示されます。 この秘密鍵のキーを `.env` ファイルにペーストしてください。Glitchで、ウェブサイトのオーナーであるあなただけが見ることができます。 +> +> - プロジェクトのルートに `.env` というファイルを作成し、次のプロパティを追加します。 +> +> {% filename %}.env{% endfilename %} +> +> ```bash +> # シングルクォーテーションの中に、生成されたランダムな鍵をコピー&ペーストします +> SECRET='3!0k#7ds5mp^-x$lqs2%le6v97h#@xopab&oj5y7d=hxe511jl' +> ``` +> +> - 次に、Djangoの設定ファイルを更新して、この秘密の値を挿入し、Djangoのウェブサイト名を設定します: +> +> {% filename %}mysite/settings.py{% endfilename %} +> +> ```python +> import os +> +> SECRET_KEY = os.getenv('SECRET') +> ``` +> +> - そして、同じファイルの少し下に、新しいGlitch ウェブサイトの名前を入れます。 +> +> {% filename %}mysite/settings.py{% endfilename %} +> +> ```python +> ALLOWED_HOSTS = [os.getenv('PROJECT_DOMAIN') + ".glitch.me"] +> ``` +> +> `PROJECT_DOMAIN` の値は Glitch によって自動的に生成されます。 これはプロジェクト名に対応しています。 ## データベースをセットアップする @@ -125,7 +168,7 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'NAME': BASE_DIR / 'db.sqlite3', } } ``` @@ -136,13 +179,13 @@ DATABASES = { (myvenv) ~/djangogirls$ python manage.py migrate Operations to perform: - Apply all migrations: auth, admin, contenttypes, sessions + Apply all migrations: admin, auth, contenttypes, sessions Running migrations: - Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK @@ -152,6 +195,9 @@ DATABASES = { Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK + Applying auth.0010_alter_group_name_max_length... OK + Applying auth.0011_update_proxy_permissions... OK + Applying auth.0012_alter_user_first_name_max_length... OK Applying sessions.0001_initial... OK @@ -173,35 +219,48 @@ Chromebookを使用している場合は、代わりに次のコマンドを使 (myvenv) ~/djangogirls$ python manage.py runserver 0.0.0.0:8080 -Windows上で、`UnicodeDecodeError`で失敗した場合は、代わりに次のコマンドを使用します。 +グリッチを使っている場合は、以下のとおりです。 + +{% filename %}Glitch.com terminal{% endfilename %} + + $ refresh + + + +Windowsを使用していて、 `UnicodeDecodeError`で失敗した場合は、代わりに次のコマンドを使用してください: {% filename %}command-line{% endfilename %} (myvenv) ~/djangogirls$ python manage.py runserver 0:8000 -Webサイトが動いていることを確認してください。ブラウザで以下のアドレスを開いてみましょう。(Firefox, Chrome, Safari, Internet Explorerなど、好きなブラウザを使って大丈夫です) +さて、Webサイトが動いていることを確認してみましょう。ブラウザで以下のアドレスを開いてみましょう。(Firefox, Chrome, Safari, Internet Explorerなど、好きなブラウザを使って大丈夫です) -{% filename %}ブラウザ{% endfilename %} +{% filename %}browser{% endfilename %} http://127.0.0.1:8000/ -Chromebook と Cloud9 を利用している場合は、Webサーバーが起動しているコマンド画面の右上に現れるポップアップウィンドウの中のURLをクリックしましょう。 URLはこんな感じになっていると思います。 +Chromebook と Cloud9 を利用している場合は、Webサーバーが起動しているコマンド画面の右上にあるポップアップウィンドウのURLをクリックしましょう。 URLはこんな感じになっていると思います。 -{% filename %}ブラウザ{% endfilename %} +{% filename %}browser{% endfilename %} https://.vfs.cloud9.us-west-2.amazonaws.com -おめでとう! たった今、あなたは最初のウェブサイトを作って、それをWebサーバーの上で起動しました! 素晴らしいですね! +Glitchを利用している場合: + + https://name-of-your-glitch-project.glitch.me + + +おめでとうございます! たった今、あなたは最初のウェブサイトを作って、それをWebサーバーの上で起動しました! 素晴らしいですね! ![インストールできました!](images/install_worked.png) -コマンド画面は、一度に一つのコマンドしか実行できません。先程開いたコマンド画面では、Webサーバーが今動いています。 Webサーバーが動いている間、次のリクエストを待っています。このコマンドラインに新しいテキストを書いても、新しいコマンドとして実行しません。 +コマンド画面は、一度に一つのコマンドしか実行できません。先程開いたコマンド画面では、Webサーバーが今動いています。 Webサーバーが動いている間、次のリクエストを待っています。このコマンドラインに新しいテキストを書いても、新しいコマンドとして実行はされません。 > Webサーバーの仕組みについては、「インターネットの仕組み」の章を参照してください。 -Webサーバーを動かしながら、新たにコマンドを入力したい場合は、新しいコマンドプロンプトのウィンドウを開いて、仮想環境を起動してから入力しましょう。2つ目のウィンドウを開く方法が分からなくなったら、[コマンドラインを使ってみよう](../intro_to_command_line/README.md)の章に戻ってやり方を確認しましょう。 Webサーバーを停止するには、実行中のウィンドウに戻り、CTRL + C - ControlキーとCキーを同時に押します(WindowsではCtrl + Breakキーを押す必要があります)。 +Webサーバーを動かしながら、新たにコマンドを入力したい場合は、新しいコマンドプロンプトのウィンドウを開いて、仮想環境を起動してから入力しましょう。2つ目のウィンドウを開く方法が分からなくなった場合は、[コマンドラインを使ってみよう](../intro_to_command_line/README.md)の章に戻ってやり方を確認しましょう。 Webサーバーを停止するには、実行中のウィンドウに戻り、CTRL + C 、つまり ControlキーとCキーを同時に押します。(WindowsではCtrl + Breakキーを押す必要があります)。 次のステップに進む準備はできましたか? 今度は実際にコンテンツを作り始めましょう! \ No newline at end of file diff --git a/ja/django_templates/README.md b/ja/django_templates/README.md index 03ab58810c3..d676e25851d 100644 --- a/ja/django_templates/README.md +++ b/ja/django_templates/README.md @@ -20,7 +20,7 @@ Djangoテンプレートで変数を表示するためには、次のように {{ posts }} ``` -これを `blog/templates/blog/post_list.html` テンプレートでやってみましょう。 エディタでこのファイルを開き、2つめの `
` から3つめの `
` までをまるごと `{{ posts }}` に置き換えて下さい。 ファイルを保存してページをリロードすると: +これを `blog/templates/blog/post_list.html` テンプレートでやってみましょう。 Open it up in the code editor, and replace the existing `
{% endfor %} ``` @@ -80,7 +80,7 @@ post変数がさっきと違って、`{{ post.title }}` や `{{ post.text }}` $ git status [...] - $ git add --all . + $ git add . $ git status [...] $ git commit -m "Modified templates to display posts from database." diff --git a/ja/django_urls/README.md b/ja/django_urls/README.md index f87179d680b..62a3b992e2f 100644 --- a/ja/django_urls/README.md +++ b/ja/django_urls/README.md @@ -45,7 +45,7 @@ urlpatterns = [ ## あなたの初めてDjango URL! -さあ最初のURLを作りましょう!'http://127.0.0.1:8000/' をブログの入口ページにして、投稿したブログポストのリストを表示するようにしたいと思います。 +さあ最初のURLを作りましょう!'http://127.0.0.1:8000/' をブログの入口ページにして、ブログの投稿のリストを表示するようにしたいと思います。 `mysite/urls.py` ファイルは簡潔なままにしておきたいので、`mysite/urls.py` では`blog` アプリからURLをインポートするだけにしましょう。 @@ -96,8 +96,20 @@ urlpatterns = [ もし今 http://127.0.0.1:8000/ にアクセスしたら、'web page not available' のようなメッセージが出るでしょう。 これはサーバー( `runserver` ってタイプしたのを覚えていますか?)が動いていないからです。 なぜこうなったのかを知るためにサーバーのコンソール画面を見てみましょう。 -![エラー](images/error1.png) +{% filename %}{{ warning_icon }} command-line{% endfilename %} + + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1030, in _gcd_import + File "", line 1007, in _find_and_load + File "", line 986, in _find_and_load_unlocked + File "", line 680, in _load_unlocked + File "", line 850, in exec_module + File "", line 228, in _call_with_frames_removed + File "/Users/ola/djangogirls/blog/urls.py", line 5, in + path('', views.post_list, name='post_list'), + AttributeError: module 'blog.views' has no attribute 'post_list' + エラーが表示されていますね。でも心配しないで。これはむしろ、結構便利なものなんですよ:ここでは、**'post_list' という属性(attribute)がない**ことを知らせてくれています。 これは *ビュー* の名前で、Djangoが探して使おうとしましたが、私たちはこれをまだ作っていませんでした。 現時点では、`/admin/` も動作していないと思います。 心配しなくて大丈夫です。ちゃんとできますから。 別のエラーメッセージが表示された場合は、Webサーバーを再起動してみてください。 これを行うには、Webサーバーを実行しているコンソールウィンドウで、Ctrl + C(CtrlキーとCキーを同時に押す)で停止します。 Windowsの場合、Ctrl + Breakかもしれません。 その後、`python manage.py runserver`を実行してWebサーバーを再起動します。 -> Django URLconfについてもっと知りたい場合は、公式のドキュメントを見て下さい。 https://docs.djangoproject.com/ja/2.2/topics/http/urls/ \ No newline at end of file +> If you want to know more about Django URLconfs, look at the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/urls/ \ No newline at end of file diff --git a/ja/django_views/README.md b/ja/django_views/README.md index 7b9cc17cb07..7b17767d72d 100644 --- a/ja/django_views/README.md +++ b/ja/django_views/README.md @@ -41,4 +41,4 @@ def post_list(request): サーバーは実行されていることはわかるのですが、正しく表示されないのはなぜでしょう? 心配しないで!ただのエラーページです! コンソールでのエラーメッセージと同じように、これは実際にかなり便利です。 *TemplateDoesNotExist* と書いてありますね。 それでは次の章でテンプレートを作って、エラーを解決しましょう! -> Djangoのビューについてもっと知りたいのなら、公式ドキュメントをぜひ読んでみてください。 https://docs.djangoproject.com/ja/2.2/topics/http/views/ \ No newline at end of file +> Learn more about Django views by reading the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/views/ \ No newline at end of file diff --git a/ja/dynamic_data_in_templates/README.md b/ja/dynamic_data_in_templates/README.md index a65c0258609..f922c1d6a85 100644 --- a/ja/dynamic_data_in_templates/README.md +++ b/ja/dynamic_data_in_templates/README.md @@ -1,6 +1,6 @@ # テンプレート内の動的データ -ポスト内容を保存する為の Post モデルは、 models.py に定義しました。ポストの一覧を表示する post_list は views.py にあり、そこにテンプレートも加わりました。 これらを準備しましたが、実際のところ、ポストをどうやってHTMLファイルに出力すればいいのでしょうか? 大まかなイメージとしては、データベースに保存された記事を取り出して、テンプレートのHTMLファイルの中に行儀よく並べれば良さそうですね。 +記事(投稿)を保存するために `Post` モデルを `models.py` に定義しました。記事の一覧を表示する `post_list` は `views.py` にあり、テンプレートも加わりました。 これらを準備しましたが、実際のところ、記事をどうやってHTMLファイルに出力すればいいのでしょうか? 大まかなイメージとしては、データベースに保存された記事を取り出して、テンプレートのHTMLファイルの中に行儀よく並べれば良さそうですね。 正確には、*ビュー *が モデルとテンプレートの橋渡しをしてくれます。 私達が作業している `post_list ` *ビュー *の場合、表示したいデータを取り出して、テンプレートファイルに渡すことになります。 どのモデルのデータを、どのテンプレートに表示させるかを、 *ビュー*に 記述します。 @@ -56,7 +56,10 @@ def post_list(request): return render(request, 'blog/post_list.html', {}) ``` -最後に残っているのは、クエリセットを参照している変数` posts `をテンプレートに渡す作業です。テンプレートでの表示については次の章でやりましょう。 +ブログ投稿リストにクエリセットを表示するために、あと2つしなければならないことがあります。 + +1. `posts` クエリセット をテンプレートコンテキストに渡し、 `render` 関数呼び出しを変更します。今から行います。 +2. `posts` クエリセットを表示するテンプレートを修正します。後の章で説明します。 作成したクエリセットは、*変数* `posts `で参照できることに、注意しましょう。この 変数 posts を使って、クエリセットのデータにアクセスします。これから先 posts というと、このクエリセットのことです。 @@ -78,4 +81,4 @@ def post_list(request): どうでしたか?次は、このクエリセットをテンプレートで表示させるところを、やってみましょう。 -Djangoのクエリセットについて、もっと知りたければこちらも読んでみてくださいね。 https://docs.djangoproject.com/ja/2.2/ref/models/querysets/ \ No newline at end of file +Want to read a little bit more about QuerySets in Django? You should look here: https://docs.djangoproject.com/en/3.2/ref/models/querysets/ \ No newline at end of file diff --git a/ja/extend_your_application/README.md b/ja/extend_your_application/README.md index b650243e077..e517fecd3e6 100644 --- a/ja/extend_your_application/README.md +++ b/ja/extend_your_application/README.md @@ -19,13 +19,13 @@ {% block content %} {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` @@ -42,7 +42,7 @@ `post_detail`の部分は、Djangoが`blog/urls.py`に書かれた name=post_detail のURLを待ち受けることを表しています。 -そして`pk=post.pk`についてはどうでしょうか? `pk`はプライマリキーの略で、データベースの各レコードのユニークな名前です。 `Post`モデルでプライマリキーを指定しなかったので、Djangoは私たちのために1つのキーを作成し(デフォルトでは、各レコードごとに1ずつ増える数字で、たとえば1、2、3です)、各投稿に`pk`というフィールド名で追加します。 `Post`オブジェクトの他のフィールド(`title`、`author`など)にアクセスするのと同じ方法で、`post.pk`と書くことによってプライマリキーにアクセスします! +そして`pk=post.pk`についてはどうでしょうか? `pk` は primary keyの略で、データベースの各レコードのユニークな名前です。 すべてのDjangoモデルには、そのプライマリーキーとして機能するフィールドがあります。 どのような名前を持っていたとしても、「pk」と呼ばれることもあります `Post`モデルでプライマリキーを指定しなかったので、Djangoは私たちのために1つのキーを作成し(デフォルトでは、"id"という各レコードごとに1ずつ増える数字で、たとえば1、2、3です)、各投稿に`pk`というフィールド名で追加します。 `post.pk`と書くことによってプライマリキーにアクセスします。これは、`Post`オブジェクトの他のフィールド(`title`、`author`など)にアクセスするのと同じ方法ですね! さて、私たちが http://127.0.0.1:8000/ に行くとエラーが出ます(知っての通り、URLも`post_detail`の*ビュー*もまだ作っていないので)。 このようになります: @@ -78,13 +78,25 @@ urlpatterns = [ よし、私たちは `blog/urls.py` に新しい URL パターンを追加しました! ページを更新しましょう:http://127.0.0.1:8000/ ドーン! サーバーが再び実行を停止しました。 コンソールを見てください - 予想通り、もう一つのエラーがあります! -![AttributeError](images/attribute_error2.png) +{% filename %}{{ warning_icon }} command-line{% endfilename %} + + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1030, in _gcd_import + File "", line 1007, in _find_and_load + File "", line 986, in _find_and_load_unlocked + File "", line 680, in _load_unlocked + File "", line 850, in exec_module + File "", line 228, in _call_with_frames_removed + File "/Users/ola/djangogirls/blog/urls.py", line 6, in + path('post//', views.post_detail, name='post_detail'), + AttributeError: module 'blog.views' has no attribute 'post_detail' + あなたは次のステップが何であるか覚えていますか? ビューを追加する!ですね。 ## 投稿の詳細ビューを追加する -今回は*ビュー*に追加のパラメータ`pk`が与えられます。 私たちの*ビュー*はそれを受け取る必要がありますね? そこで関数を`def post_detail(request, pk):`として定義します。 `urls`で指定した名前(`pk`)とまったく同じ名前を使用する必要があることに注意してください。 この変数を省略するのは正しくないのでエラーになってしまいます! +今回は*ビュー*に追加のパラメータ`pk`が与えられます。 私たちの*ビュー*はそれを受け取る必要がありますね? そこで関数を`def post_detail(request, pk):`として定義します。 注意 このパラメーターは`urls` で指定した名前と(`pk`)全く同じものを使用しなければなりません。 そして、この変数を省略することは正しくなく、エラーになってしまします。 今、私たちは1つだけブログ投稿を取得したいと考えています。 これを行うには、次のようなクエリセットが使用できます。 @@ -140,7 +152,7 @@ def post_detail(request, pk): `blog/templates/blog`に`post_detail.html`というファイルを作成し、コードエディタで開きます。 -こんな感じですね。 +以下のコードを入力してください: {% filename %}blog/templates/blog/post_detail.html{% endfilename %} @@ -148,15 +160,15 @@ def post_detail(request, pk): {% extends 'blog/base.html' %} {% block content %} -
+
{% if post.published_date %} -
+
+ {% endif %}

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endblock %} ``` @@ -177,7 +189,7 @@ def post_detail(request, pk): {% filename %}command-line{% endfilename %} $ git status - $ git add --all . + $ git add . $ git status $ git commit -m "Added view and template for detailed blog post as well as CSS for the site." $ git push @@ -211,4 +223,4 @@ PythonAnywhereのようなサーバは、(CSSファイルのような)「静 いずれにしても、[「Web」ページ](https://www.pythonanywhere.com/web_app_setup/)を(コンソールの右上のメニューボタンから)開き、**Reload**をクリックする準備ができました。そうしたらhttps://subdomain.pythonanywhere.comを見て結果を確認しましょう。 -うまくいってるはずです!おめでとう :) \ No newline at end of file +うまくいってるはずです!おめでとうございます! :) \ No newline at end of file diff --git a/ja/html/README.md b/ja/html/README.md index 474f452a69d..43f397f3bd9 100644 --- a/ja/html/README.md +++ b/ja/html/README.md @@ -33,13 +33,14 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 ![図 11.1](images/step1.png) -もうエラーはありませんか!おめでとうございます:)。しかし、あなたのウェブサイトは実際には空白のページ以外は何も表示していないでしょう。テンプレートも空白だからです。それを直していく必要があります。 +もうエラーはありません。おめでとうございます! :) しかし、あなたのウェブサイトは空白ページ以外は何も表示しいません。テンプレートが空白だからです。これを直していく必要があります。 この新しく作ったファイルをコードエディタで開いて、次の内容を書き加えます。 {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html +

Hi there!

@@ -52,10 +53,11 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 ![図 11.2](images/step3.png) -うまく動いています!よくできました:) +動いています。よくできました! :) -* どんなウェブページでも、最も基本的なタグである``から始まり、そして常に、``で終わります。 みなさん見てとれるように、ウェブサイトの全てのコンテンツは、開始タグの``と閉じタグ``の間にあります。 -* `

`は、段落要素のためのタグです; `

` でそれぞれの段落を閉じます。 +* この `` という行は、HTMLタグではありません。 ドキュメントのタイプを宣言しているものです。 ここでは、ドキュメントの種類が [HTML5](https://html.spec.whatwg.org/#the-doctype) であることをブラウザに伝えています。 HTML5 ファイルの先頭は、いつもこれが必要です。 +* htmlの中身は、最も基本的なタグである ``で始まり、 `` で終わります。 ご覧のとおり、ウェブサイトのコンテンツ全体は、開始タグ `` と閉じタグ `` の間にあります。 +* `

` は段落要素のタグです; `

` で各段落を閉じます。 ## HeadとBody @@ -72,6 +74,7 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html + Ola's blog @@ -109,40 +112,49 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 * `リンク` はリンクを生成します * `
  • 第1の項目
  • 第2の項目
` でリストを作成する、こんな感じに! * `
`はページ内のセクションを定義 +* `` はナビゲーションリンクを定義。 +* `
` は、文書内の独立した記事セクションを表します。 +* `
` は、ドキュメント内のセクションを定義 +* `
` ドキュメントやセクションのヘッダーを定義 +* `
` ドキュメント内のメインとなるコンテンツを定義 +* `` は、メインコンテンツと間接的にしか関わらない補足的なコンテンツ(例えば、サイドバー) +* `
` ドキュメントやセクションのフッターを定義 +* `` は特定の時間(あるいは日時)を定義 いろんな要素をまとめたテンプレートの例がこれです。コピーして`blog/templates/blog/post_list.html`に貼り付けてみましょう: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html + Django Girls blog - + -
-

published: 14.06.2014, 12:14

+
+

My first post

-

Aenean eu leo quam. こんにちは! よろしくお願いします!

-
- -
-

公開日: 2014/06/14, 12:14

-

2番目の投稿

-

こんにちは! よろしくお願いします!

-
+

これは最初の投稿です。 こんにちは! よろしくお願いします! これはダミーの文章です。.

+ + +
+ +

My second post

+

Aenean eu leo quam. こんにちは! よろしくお願いします! これは長いダミー文章です。すきな文章に置き換えても大丈夫ですよ。

+
``` -ここで3つの `div` セクションを作成しました。 +`ヘッダー` セクションと `記事` セクションを 2 つ作成しました。 -* 最初の `div` 要素には、私たちのブログのタイトルが含まれています。見出しとリンクです。 -* その他の2つの`div`要素には、このブログにポストされた記事が公開日とともに記載されています。`h2`はクリック可能な記事のタイトルです。2つの`p`(段落) は、1つが日付で、1つがブログにポストされた記事です。 +* 最初の `header` セクションには、ブログのタイトルが含まれています。つまり、見出し1とリンクです。 +* 2つの`article`は、ブログ記事です。まず、`time`タグは投稿日時です。そして、`h2`タグは、記事のタイトルで、これはクリックすることができます。`p`(パラグラフ・段落)タグは、ブログ記事のテキストです。 その結果、次のような結果が得られます。 @@ -169,11 +181,9 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 {% filename %}command-line{% endfilename %} - $ git add --all . + $ git add . -> **ノート** `--all` をつけると、 `git` は、ファイルを削除したかどうかも判定します (これがない初期設定の状態では、新しいファイルと変更されたファイルしか認識しません)。 `.` が、今いるディレクトリを表すということも思い出してくださいね(第3章にありました)。 - 全てのファイルをアップロードする前に、`git`が何をアップロードするのかチェックしておきましょう(`git`がアップロードする全ファイルは緑で表示されます): {% filename %}command-line{% endfilename %} @@ -188,7 +198,7 @@ HTMLは、「HyperText Markup Language」の頭文字を取ったものです。 $ git commit -m "Changed the HTML for the site." -> **ノート** コミットメッセージは二重クォート記号で囲みましょう。 +> **注意** コミットメッセージでダブルクォーテーションを使用していることを確認してください。 ここまで終われば、GitHubに変更部分をアップロード(push) しましょう。 diff --git a/ja/installation/README.md b/ja/installation/README.md index 73a2aacf06f..f01e4ef5d52 100644 --- a/ja/installation/README.md +++ b/ja/installation/README.md @@ -19,14 +19,13 @@ このチュートリアルではブログを作成します。 そのために、チュートリアルを進める中で必要に応じて、さまざまなソフトウェアをコンピュータにインストールする方法や、いくつかのオンラインアカウントを設定する方法について教わります。 このページでは、インストールとアカウント作成の手順すべてを一ヶ所にまとめています(ワークショップのやり方によっては、このページは役に立ちます)。 -{% include "/chromebook_setup/instructions.md" %} +data-id="chromebook_setup" data-collapse=true ces--> {% include "/chromebook_setup/instructions.md" %} + # コマンドラインの簡単な紹介 {#command-line} -以下の手順の多くに、「コンソール」、「ターミナル」、「コマンドウィンドウ」、「コマンドライン」という言葉が出てきます。これらはすべて同じものを意味します。コマンドを入力できる、コンピュータのウィンドウです。 メインのチュートリアルに進むと、コマンドラインについてさらに学ぶことができます。 今は、コマンドウィンドウの開き方と、それがどのように見えるかを覚えましょう: -{% include "/intro_to_command_line/open_instructions.md" %} +以下の手順の多くに、「コンソール」、「ターミナル」、「コマンドウィンドウ」、「コマンドライン」という言葉が出てきます。これらはすべて同じものを意味します。コマンドを入力できる、コンピュータのウィンドウです。 メインのチュートリアルに進むと、コマンドラインについてさらに学ぶことができます。 今は、コマンドウィンドウの開き方と、それがどのように見えるかを覚えましょう: {% include "/intro_to_command_line/open_instructions.md" %} # Pythonのインストール {#python} @@ -44,11 +43,11 @@ data-id="chromebook_setup" data-collapse=true ces--> {% include "/deploy/install_git.md" %} -# GitHubのアカウント作成 {#github} +# GitHubのアカウント作成 {#github-account} [GitHub.com](https://www.github.com)へ行って、新しく無料のユーザーアカウントを登録しましょう。パスワードを忘れないようにしてください(もしパスワードマネージャーを使っているなら、追加しましょう)。 -# PythonAnywhereのアカウント作成 {#pythonanywhere} +# PythonAnywhereのアカウント作成 {#pythonanywhere-account} {% include "/deploy/signup_pythonanywhere.md" %} @@ -66,4 +65,4 @@ data-id="chromebook_setup" data-collapse=true ces--> # ワークショップを楽しんでください! -ここまでで最初の数チャプターの内容を扱ってきたので、ワークショップでは、[プロジェクトを作成しよう!](../django_start_project/README.md)のチャプターからはじめてください。 +ここまでで最初の数チャプターの内容を扱ってきたので、ワークショップでは、[プロジェクトを作成しよう!](../django_start_project/README.md)のチャプターからはじめてください。 \ No newline at end of file diff --git a/ja/intro_to_command_line/README.md b/ja/intro_to_command_line/README.md index 1b50984a573..1de4e9b42e3 100644 --- a/ja/intro_to_command_line/README.md +++ b/ja/intro_to_command_line/README.md @@ -166,10 +166,10 @@ OS X と Linux には、`man` コマンドがあり、それはコマンドの > dir Directory of C:\Users\olasitarska - 05/08/2014 07:28 PM Applications - 05/08/2014 07:28 PM Desktop - 05/08/2014 07:28 PM Downloads - 05/08/2014 07:28 PM Music + 05/08/2020 07:28 PM Applications + 05/08/2020 07:28 PM Desktop + 05/08/2020 07:28 PM Downloads + 05/08/2020 07:28 PM Music ... @@ -291,7 +291,7 @@ Desktop というディレクトリ名は、使用しているLinuxアカウン > cd practice > mkdir test > dir - 05/08/2014 07:28 PM test + 05/08/2020 07:28 PM test diff --git a/ja/intro_to_command_line/open_instructions.md b/ja/intro_to_command_line/open_instructions.md index a1d65f53e1e..a33591cf49a 100644 --- a/ja/intro_to_command_line/open_instructions.md +++ b/ja/intro_to_command_line/open_instructions.md @@ -1,4 +1,3 @@ - 使用しているWindowsのバージョンとキーボードによりますが、以下のいずれかの方法でコマンドラインを開けるはずです(いくつか試す必要があるかもしれませんが、これらの方法のすべてを試す必要はありません): @@ -26,4 +25,4 @@ 使用しているシステムによりますが、[アプリケーション] → [アクセサリ] の下、あるいは [アプリケーション] → [システム] の下に [ターミナル] があるでしょう。 もしそこに見当たらない場合は、Googleで検索してみましょう。 :) - + \ No newline at end of file diff --git a/ja/python_installation/README.md b/ja/python_installation/README.md index 46832893a41..3b4c8382a74 100644 --- a/ja/python_installation/README.md +++ b/ja/python_installation/README.md @@ -10,6 +10,6 @@ Pythonは1980年代の終わりに、人間が読みやすい(機械だけで > **注意:**Chromebookをお使いの場合、このチャプターは飛ばして、[Chromebookのセットアップ](../chromebook_setup/README.md)の章をすすめてください。 > -> **注意:**すでにインストール手順を実行している場合は、これをもう一度行う必要はありません。次の章に進んでください。 +> **注意** すでに[インストール](../installation/README.md)をすでに行っている場合は、次の章に進みましょう! {% include "/python_installation/instructions.md" %} \ No newline at end of file diff --git a/ja/python_installation/instructions.md b/ja/python_installation/instructions.md index f5d9305656e..ab5f678179d 100644 --- a/ja/python_installation/instructions.md +++ b/ja/python_installation/instructions.md @@ -2,7 +2,7 @@ > > このセクションはGeek Girls Carrots (https://github.com/ggcarrots/django-carrots) のチュートリアルをベースに作成しました。 -DjangoはPythonで書かれています。 Djangoを使うにはPythonが必要です。 では、インストールするところから始めましょう! 最新のPython3をインストールしてください。それ以前のPythonがインストールされていたら、アップグレードする必要があります。 3.4以降のバージョンであれば問題ありません。 +DjangoはPythonで書かれています。 Djangoを使うにはPythonが必要です。 では、インストールするところから始めましょう! 最新のPython3をインストールしてください。それ以前のPythonがインストールされていたら、アップグレードする必要があります。 もしあなたが{{ book.py_min_version }}かそれ以上のバージョンを持っているのなら大丈夫です。 下に書いたとおりのやり方で、Pythonをインストールしてください。すでにAnacondaが入っていても以下のとおりにインストールしてください。 @@ -13,63 +13,59 @@ DjangoはPythonで書かれています。 Djangoを使うにはPythonが必要 * WindowsキーとPause/Breakキーを同時に押します。 * Windowsのスタートからコントロールパネルを開き、”システムとセキュリティ”、”システム”と順にクリックします。 * Windowsロゴをクリック、設定 > システム > バージョン情報 とクリックしていきましょう。 +* Windowsのスタートメニューから「システムの詳細設定」を検索します。 これを行うためには、スタートのボタンをクリックするかWindowsキーを押して、`システムの詳細設定`を入力し始めます。 入力するとすぐに候補を提案します。 表示されたら、選択することができます。 https://www.python.org/downloads/windows/ からWindows版のPythonをダウンロードできます。 "Latest Python 3 Release - Python x.x.x" というリンクをクリックします。 あなたのWindowsが**64-bit版**なら、**Windows x86-64 executable installer**をダウンロードしてください。 そうでなければ**Windows x86 executable installer**をダウンロードしてください。 インストーラーがダウンロードできたら、ダブルクリックして実行し、指示に従ってください。 -インストールの途中で、「Setup」というタイトルのウィンドウがでてきたら注意してください。 下にあるとおり、「Add Python 3.6 to PATH」か「Add Python to your environment variables」をチェックしてから「Install Now」をクリックしてください (バージョンが違うと表示が違うこともあります)。 +インストールの途中で、「Setup」というタイトルのウィンドウがでてきたら注意してください。 以下に書かれてあるように(インストールしているバージョンが違った場合は表示されている内容が少し異なるかもしれません)、"Python {{ book.py_version }} to PATH" か "Add Python to your environment variables" のチェックボックスをチェックし、"Install Now"をクリックします。 ![Pythonのパスを通すのを忘れないようにしてください。](../python_installation/images/python-installation-options.png) インストールが終わったら、ダイアログボックスが出てきます。ボックス内のリンクを開くと、Pythonやインストールしたバージョンを説明したページに行けます。 ダイアログは閉じてしまいましょう。Pythonの使い方はこのチュートリアルでたっぷり勉強します! -注意: あなたのWindowsがWindows7、Windows Vistaや、それ以前のバージョンの場合で、Python 3.6.x のインストールがエラーがでて失敗する場合は、下のどちらかのやり方を試してください。 +注意: もしあなたが古いバージョンのWindows(7, Vistaなど)使用している場合、Python {{ book.py_version }} インストーラーはエラーを起こし失敗します。Windowsアップデートをインストールし再度Pythonをインストールしてください。 もしもエラーが起こり続けているのなら、Python バージョン {{ book.py_min_release }} を[Python.org](https://www.python.org/downloads/windows/)からダウンロードしてみてください。 -1. Windows Updateを実行してすべての更新ファイルを入れてから、Pythonを入れ直す -2. [古いバージョンのPython](https://www.python.org/downloads/windows/)をインストールしてみる。例えば[3.4.6](https://www.python.org/downloads/release/python-346/)。 - -古いバージョンのPythonをインストールした場合、インストール画面は上のものと違うことがあります。 下にスクロールして「Add python.exe to Path」の左のボタンをクリックして「Will be installed on local hard drive(ローカルハードドライブにインストールされます)」を選択してください - -![古いバージョンでも、Pythonのパスを通してください。](../python_installation/images/add_python_to_windows_path.png) +> Django {{ book.django_version }} はWindows XP以前のバージョンがサポートしていない Python {{ book.py_min_version }} 以上のバージョンを必要とします。 -> **注意**:OS XにPythonをインストールする前に、Macの設定でApp Store以外のパッケージをインストールできるようにする必要があります。 「システム環境設定」(「アプリケーション」フォルダ内)に移動し、「セキュリティとプライバシー」、「一般」タブの順にクリックします。 「ダウンロードしたアプリを許可する」が「Mac App Store」に設定されている場合は、「Mac App Storeと識別された開発者」に変更します。 +> **注意** OS X にPython をインストールする前に、Mac の設定がApp Store以外からのパッケージのインストールを許可しているか確認してください。 「システム環境設定」(「アプリケーション」フォルダ内)に移動し、「セキュリティとプライバシー」、「一般」タブの順にクリックします。 「ダウンロードしたアプリケーションの実行許可:」が「App Store」に設定されている場合は、「App Storeと確認済みの開発元からのアプリケーションを許可」に変更します。 -https://www.python.org/downloads/release/python-361/ からPythonインストーラーをダウンロードします。 +https://www.python.org/downloads/mac-osx/ のウェブサイトから最新のPython のインストーラーをダウンロードします。 * *Mac OS X 64-bit/32-bit installer* というファイルをダウンロードします。 -* ダウンロードできたら *python-3.6.1-macosx10.6.pkg* をダブルクリックして実行します。 +* *python-{{ book.py_release }}-macosx10.9.pkg*をダブルクリックしてインストーラーを実行してください。 -すでにPythonがインストールされているかもしれません。インストールされているか、そしてどのバージョンが入っているか確かめるには、コンソールを開いて下のコマンドを入力してください。 +おそらく殆どの場合は、すでに Python をインストールしていると思います。Python をインストールしているか確認するために(またどのばーじょんかかを)、コンソールを開いて以下のコマンドをうってください。 {% filename %}command-line{% endfilename %} $ python3 --version - Python 3.6.5 + Python {{ book.py_release }} -表示されたバージョンが違っても、3.4.0以降(例えば 3.6.0など)であれば、アップグレードの必要はありません。 Pythonがインストールされていなかったり、違うバージョンをインストールしたい場合は、下のコマンドを実行して、まずパソコンのLinuxディストリビューションがなにか確かめてください。 +異なるバージョンの Python をインストールしている場合、少なくとも{{ book.py_min_version }} (例: {{ book.py_min_release }})、アップグレードの必要はありません。 Pythonがインストールされていなかったり、異なるバージョンをインストールしたい場合は、はじめに下記のコマンドでどの Linux ディストリビューションを使っているか確認してください。 {% filename %}command-line{% endfilename %} - $ grep ^NAME= /etc/os-release + $ grep '^NAME=' /etc/os-release -表示されたディストリビューション名に従って、以下のインストール方法の1つを実行してください。 +その後、結果によって、以下のセクションのいづれかのインストール手順に従います。 -下のコマンドをコンソールに入力します。 +次のコマンドをコンソールに打ち込みます。 {% filename %}command-line{% endfilename %} @@ -81,21 +77,21 @@ data-collapse=true ces--> -下のコマンドをコンソールに入力します。 +次のコマンドをコンソールで使用します。 {% filename %}command-line{% endfilename %} $ sudo dnf install python3 -Fedoraのバージョンが古い場合、 `dnf` コマンドが見つからないというエラーが出るかもしれません。そんなときは代わりに `yum` コマンドを使ってください。 +Fedora バージョンが古い場合は、`dnf`が見つかりませんというエラーが起きるかもしれません。その場合は、`yum` を変わりに使用してください。 -下のコマンドをコンソールに入力します。 +以下のコマンドをコンソールで使用してください。 {% filename %}command-line{% endfilename %} @@ -104,18 +100,18 @@ data-collapse=true ces--> -インストールがうまくいったか確認するために、コマンドプロンプトを開いて `python3` と打ち込んでください。 +インストールが成功しているか確認するために、コマンドプロンプトを開いて`Python3`コマンドを使用します。 {% filename %}command-line{% endfilename %} $ python3 --version - Python 3.6.1 + Python {{ book.py_release }} -バージョンはあなたがインストールしたものが表示されます。なのでPython 3.6.1 と表示されないかもしれません。 +表示されているバージョンは{{ book.py_release }} と異なるかもしれません。あなたがインストールしたバージョンが表示されています。 -**注意:** Windowsで `python3` を実行して、コマンドが見つからないとエラーが出た場合、代わりに `python` (`3` をコマンドに入れていません) を使ってみてください。そして、3.4.0以降のPythonのバージョンが表示されるか確認してください。 どちらのコマンドもうまく動かない場合は、新しいコマンドプロンプトを開いて同じことを試してください。Pythonのインストール前にコマンドプロンプトを使っていて、それが開きっぱなしだとこういうことが起きます。 +**注意:**Windowsでpython3は見つかりませんというエラーが出たときは、python(`3抜きで`)実行してみてください。そして、{{ book.py_min_version }} 以降のバージョンが表示されているか確認してください。 どちらもうまく行かない場合は、新しくコマンドプロンプトを開いて再び試してみてください。Pythonのインストール前にコマンドプロントを開き続けていると、これが起こります。 * * * -わからないことがあったり、うまくいかなくて次にどうしたらいいかわからなかったりするときは、コーチに質問してください! うまくいかないこともあります。そういうときは、経験豊富な人に聞くといいですよ。 \ No newline at end of file +なにか疑問や上手く行かないことがある時、また次に何をすればいいかわからに時は、コーチに質問しましょう。 時々上手く行かないときもあります。そんなときは、経験豊富な人に聞くのが良いです。 \ No newline at end of file diff --git a/ja/python_introduction/README.md b/ja/python_introduction/README.md index f49369d41c3..232ea62f865 100644 --- a/ja/python_introduction/README.md +++ b/ja/python_introduction/README.md @@ -6,31 +6,15 @@ さあ、コードを書いてみましょう! -## Pythonプロンプト +{% include "/python_introduction/prompt.md" %} -> 家で1人でこのパートに挑戦している方へ:このパートと続くパートは、動画(英語)もあるので参考にしてください。 [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U) +## Your first Python command! -Pythonであそぶために、*コマンドライン* を開きましょう。 やり方は、チャプター [コマンドラインを使ってみよう](../intro_to_command_line/README.md) で学びましたね。 +After running the Python command, the prompt changed to `>>>`. For us this means that for now we may only use commands in the Python language. You don't have to type in `>>>` – Python will do that for you. -準備ができたら、次の指示に従ってやってみましょう。 +If you want to exit the Python console at any point, type `exit()` or use the shortcut `Ctrl + Z` for Windows and `Ctrl + D` for Mac/Linux. Then you won't see `>>>` any longer. -Pythonコンソールを開きましょう。Windowsなら `python` 、Mac OSやLinuxなら `python3` とタイプして `Enter` キーを押してください。 - -{% filename %}command-line{% endfilename %} - - $ python3 - Python 3.6.1 (...) - Type "help", "copyright", "credits" or "license" for more information. - >>> - - -## 最初のPythonコマンド! - -Pythonのコマンドが走ると、プロンプト記号が `>>>` に変わりました。 これは、今Pythonの言語を実行できますという意味です。 `>>>` はタイプしなくていいですよ – Pythonがあなたの代わりにやってくれます。 - -Pythonコンソールを終了したい時は、`exit()` とタイプするか、ショートカット `Ctrl + Z`(Windows)、`Ctrl + D`(Mac/Linux)を使ってください。 そうするともう `>>>` は出なくなります。 - -けど、今はまだコンソールを終了しないで、もっと動かして学びましょう。簡単な計算からはじめましょう。`2 + 3` とタイプして、`Enter` キーを押してください。 +For now, we don't want to exit the Python console. We want to learn more about it. Let's start by typing some math, like `2 + 3` and hitting `enter`. {% filename %}command-line{% endfilename %} @@ -39,26 +23,26 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 5 ``` -できました!答えがでてきましたね。Pythonは計算ができます。他にも、次のようなコマンドを試してみましょう。 +Nice! See how the answer popped out? Python knows math! You could try other commands like: - `4 * 5` - `5 - 1` - `40 / 2` -2の3乗のような指数の計算は、次のようにタイプします。{% filename %}command-line{% endfilename %} +To perform exponential calculation, say 2 to the power 3, we type: {% filename %}command-line{% endfilename %} ```python >>> 2 ** 3 8 ``` -ちょっとの間楽しんであそんでみたら、またココに戻ってきてくださいね。:) +Have fun with this for a little while and then get back here. :) -お分かりのとおり、Pythonはステキな計算機ですね。他になにができるんだろう…と思ったら、次にいってみましょう。 +As you can see, Python is a great calculator. If you're wondering what else you can do… -## 文字列 +## Strings -あなたのお名前を次のようにクォーテーションをつけてタイプしてください。 +How about your name? Type your first name in quotes like this: {% filename %}command-line{% endfilename %} @@ -67,9 +51,9 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 'Ola' ``` -はじめてのString(文字列)が完成です! Stringとは、文字の集合のことです。 シングルクォーテーション (`'`) あるいは、ダブルクォーテーション (`"`) で囲います。 最初と最後は同じ記号にしてください。 クォーテーションの中が文字列であることを意味しています。 +You've now created your first string! It's a sequence of characters that can be processed by a computer. The string must always begin and end with the same character. This may be single (`'`) or double (`"`) quotes (there is no difference!) The quotes tell Python that what's inside of them is a string. -複数の文字列を結合することもできます。次のように試してみましょう。 +Strings can be strung together. Try this: {% filename %}command-line{% endfilename %} @@ -78,7 +62,7 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 'Hi there Ola' ``` -文字列を繰り返すためには、演算子を使って繰り返し回数を指定することもできます。 +You can also multiply strings with a number: {% filename %}command-line{% endfilename %} @@ -87,9 +71,9 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 'OlaOlaOla' ``` -アポストロフィーを文字列の中に含めたい場合は、2通りの方法があります。 +If you need to put an apostrophe inside your string, you have two ways to do it. -まずは、ダブルクォーテーションを使う方法です。 +Using double quotes: {% filename %}command-line{% endfilename %} @@ -98,7 +82,7 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか "Runnin' down the hill" ``` -あるいは、バックスラッシュ (``) を使う方法もあります。 +or escaping the apostrophe with a backslash (`\`): {% filename %}command-line{% endfilename %} @@ -107,7 +91,7 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか "Runnin' down the hill" ``` -できましたか?次に、あなたの名前を大文字に変えてみましょう。次のように記述してください。 +Nice, huh? To see your name in uppercase letters, type: {% filename %}command-line{% endfilename %} @@ -116,9 +100,9 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 'OLA' ``` -ここで `upper` **関数 (function)** を使うことができましたね! 関数 ( `upper()` など) は、呼び出したオブジェクト ( `"Ola"` のことです) に対してどのような手順でどのような処理をするかをひとまとめにしたものです。 +You just used the `upper` **method** on your string! A method (like `upper()`) is a sequence of instructions that Python has to perform on a given object (`"Ola"`) once you call it. -あなたの名前の文字数を知りたいときは、その **関数 (function)** もあります! +If you want to know the number of letters contained in your name, there is a **function** for that too! {% filename %}command-line{% endfilename %} @@ -127,22 +111,22 @@ Pythonコンソールを終了したい時は、`exit()` とタイプするか 3 ``` -どうして、文字列の後に `.` をつけて関数を呼び出したり ( `"Ola".upper()` のように)、あるいは、先に関数を呼び出してかっこの中に文字列をいれているのか、と疑問に思ったかもしれません。 そうですね。時に、オブジェクトに結びついた関数というのがあります。例えば、`upper()` は、文字列にのみ実行される関数です。 私たちはこれを **メソッド (method)** と呼びます。 それとは別に、特定のオブジェクトに関連せず、異なるタイプのオブジェクトに対して実行できる関数があります。例えば `len()` ですね。 `len` 関数の引数として `"Ola"` をかっこの中にいれているのです。 +Wonder why sometimes you call functions with a `.` at the end of a string (like `"Ola".upper()`) and sometimes you first call a function and place the string in parentheses? Well, in some cases, functions belong to objects, like `upper()`, which can only be performed on strings. In this case, we call the function a **method**. Other times, functions don't belong to anything specific and can be used on different types of objects, just like `len()`. That's why we're giving `"Ola"` as a parameter to the `len` function. ### まとめ -文字列はだいじょうぶですね。ここまでに学んだことをまとめましょう。 +OK, enough of strings. So far you've learned about: - **プロンプト** – Pythonプロンプトにコマンド(コード)を入力すると、答えがかえってきます。 - **数値と文字列** – 数値は計算に、文字列はテキストに使われます。 - **演算子** – 例えば `+` や `*` のように、値を計算して新しい値を返します。 - **関数** – `upper()` や `len()` のようにオブジェクトに対して行う機能のことです。 -すべてのプログラミング言語に共通する基礎になります。 もう少し難易度の高いものに挑戦してみましょう。準備はいいですか? +These are the basics of every programming language you learn. Ready for something harder? We bet you are! -## エラー +## Errors -さて、新しいことをやってみましょう。あなたの名前の文字数を数えたように、数字の文字数は数えられるでしょうか? `len(304023)` と記述して、`Enter` キーを押してみましょう。 +Let's try something new. Can we get the length of a number the same way we could find out the length of our name? Type in `len(304023)` and hit `enter`: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -153,9 +137,9 @@ Traceback (most recent call last): TypeError: object of type 'int' has no len() ``` -はじめてのエラーがでました! {{ warning_icon }} アイコンのついたコードは思ったように動かないコードです。 (今回はチュートリアルで用意されていましたが)思ったように動かないことは学ぶ上で大事です! +We got our first error! The {{ warning_icon }} icon is our way of giving you a heads up that the code you are about to run won't work as expected. Making mistakes (even intentional ones) are an important part of learning! -オブジェクトタイプ"int" (integers, 数値) は文字数がありませんと言っています。では、どうすればよいでしょうか?この数字を文字列として扱えれば、文字数を数えられるはずですよね? +It says that objects of type "int" (integers, whole numbers) have no length. So what can we do now? Maybe we can write our number as a string? Strings have a length, right? {% filename %}command-line{% endfilename %} @@ -164,18 +148,18 @@ TypeError: object of type 'int' has no len() 6 ``` -うまく行きました! `str` 関数を `len` のかっこの中に記述しました。`str()` はその中身を文字列に変換します。 +It worked! We used the `str` function inside of the `len` function. `str()` converts everything to strings. - `str` 関数は、**文字列** に変換します。 - `int` 関数は、文字列や数値を **整数** に変換します。 -> 重要!: 数字は文字列にすることはできますが、全ての文字が数字に変換できるわけではありません。 例えば `int('hello')` は数字にはなりませんよね? +> Important: we can convert numbers into text, but we can't necessarily convert text into numbers – what would `int('hello')` be anyway? -## 変数 +## Variables -変数(variables)は、プログラミングの重要なコンセプトです。 後で使うためにつける単なる名札ではありません。 プログラマーは変数を使ってデータを保管したり、 コードを読みやすくして、後でそれが何だったか覚えておかなくてもいいようにします。 +An important concept in programming is variables. A variable is nothing more than a name for something so you can use it later. Programmers use these variables to store data, make their code more readable and so they don't have to keep remembering what things are. -変数 `name` を新しくつくってみましょう。 +Let's say we want to create a new variable called `name`: {% filename %}command-line{% endfilename %} @@ -183,9 +167,9 @@ TypeError: object of type 'int' has no len() >>> name = "Ola" ``` -name イコール(=)"Ola" とタイプします。 +We type name equals Ola. -見てのとおり、プログラムは、なにも返してくれませんね。では、変数がきちんとあるか、どうやって確かめたらいいのでしょうか? `name` とタイプして、`Enter` キーを押してください。 +As you've noticed, your program didn't return anything like it did before. So how do we know that the variable actually exists? Enter `name` and hit `enter`: {% filename %}command-line{% endfilename %} @@ -194,7 +178,7 @@ name イコール(=)"Ola" とタイプします。 'Ola' ``` -やりました!あなたのはじめての変数ができましたね!代入する値を変えることもできます。 +Yippee! Your first variable! :) You can always change what it refers to: {% filename %}command-line{% endfilename %} @@ -204,7 +188,7 @@ name イコール(=)"Ola" とタイプします。 'Sonja' ``` -変数には関数も使えます。 +You can use it in functions too: {% filename %}command-line{% endfilename %} @@ -213,7 +197,7 @@ name イコール(=)"Ola" とタイプします。 5 ``` -素晴らしいですね!変数は、数値にも使えますよ。 +Awesome, right? Now, variables can be anything – numbers too! Try this: {% filename %}command-line{% endfilename %} @@ -224,7 +208,7 @@ name イコール(=)"Ola" とタイプします。 24 ``` -もしも、間違えた変数名を使ってしまったら、どうなるでしょうか?予想できますか?やってみましょう! +But what if we used the wrong name? Can you guess what would happen? Let's try! {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -236,13 +220,13 @@ Traceback (most recent call last): NameError: name 'ctiy' is not defined ``` -エラーになりました! 前回とは違うエラータイプです。**NameError** という、初めてみるエラータイプですね。 作成されていない変数を使った時は、Pythonがエラーを教えてくれます。 もし、このエラーに出くわしたら、記述したコードにタイプミスがないか確認してください。 +An error! As you can see, Python has different types of errors and this one is called a **NameError**. Python will give you this error if you try to use a variable that hasn't been defined yet. If you encounter this error later, check your code to see if you've mistyped any names. -ちょっと遊んで、何ができるか試してみてくださいね! +Play with this for a while and see what you can do! -## print 関数 +## The print function -次に挑戦してみましょう。 +Try this: {% filename %}command-line{% endfilename %} @@ -254,15 +238,15 @@ NameError: name 'ctiy' is not defined Maria ``` -単に `name` とタイプした時は、Pythonインタプリタが、変数'name'の文字列*表現(representation)*を返します。ここでは、シングルクォーテーション('')に囲まれた M-a-r-i-aという文字の集まりです。 しかし、`print(name)`と記述した時は、Pythonは変数の中身を出力します。クォーテーションはありません。 +When you just type `name`, the Python interpreter responds with the string *representation* of the variable 'name', which is the letters M-a-r-i-a, surrounded by single quotes, ''. When you say `print(name)`, Python will "print" the contents of the variable to the screen, without the quotes, which is neater. -これからさらに詳しくみていきますが、`print()` は、関数から出力をする時や、複数行の出力を行うときにも便利です。 +As we'll see later, `print()` is also useful when we want to print things from inside functions, or when we want to print things on multiple lines. -## リスト +## Lists -数値と文字列の他にも、すべてのオブジェクトタイプを勉強しておきましょう。 今から**list** というものを紹介していきます。 リストは、その名のとおり、オブジェクトの並びをもつものですね。 :) +Beside strings and integers, Python has all sorts of different types of objects. Now we're going to introduce one called **list**. Lists are exactly what you think they are: objects which are lists of other objects. :) -まずはリストを作りましょう。 +Go ahead and create a list: {% filename %}command-line{% endfilename %} @@ -271,7 +255,7 @@ Maria [] ``` -はい、このリストは空っぽです。使いにくいですよね。では、くじ引きの番号のリストを作りましょう。 この番号を何度も繰り返し書きたくはないから、同時に変数に代入してしまいましょう。 +Yes, this list is empty. Not very useful, right? Let's create a list of lottery numbers. We don't want to repeat ourselves all the time, so we will put it in a variable, too: {% filename %}command-line{% endfilename %} @@ -279,7 +263,7 @@ Maria >>> lottery = [3, 42, 12, 19, 30, 59] ``` -よし、これでリストができました!このリストで何をしましょうか?では、くじ引きの番号がいくつあるか、数えてみましょう。何の関数を使えばいいか、予想できますか?すでに知っていますよね! +All right, we have a list! What can we do with it? Let's see how many lottery numbers there are in a list. Do you have any idea which function you should use for that? You know this already! {% filename %}command-line{% endfilename %} @@ -288,7 +272,7 @@ Maria 6 ``` -そうです!`len()` がリストにあるオブジェクトの数を取得できます。便利ですね。では、くじ引きの番号をソートしてみましょう。 +Yes! `len()` can give you a number of objects in a list. Handy, right? Maybe we will sort it now: {% filename %}command-line{% endfilename %} @@ -296,7 +280,7 @@ Maria >>> lottery.sort() ``` -これは何も返してきません。これはリストに表示される番号を、順番に並べ替えただけです。再度出力して、確かめてみましょう。 +This doesn't return anything, it just changed the order in which the numbers appear in the list. Let's print it out again and see what happened: {% filename %}command-line{% endfilename %} @@ -305,9 +289,9 @@ Maria [3, 12, 19, 30, 42, 59] ``` -ご覧のとおり、小さい順に並び替えられましたね。おめでとう! +As you can see, the numbers in your list are now sorted from the lowest to highest value. Congrats! -逆順に並び替えてみたくなりましたか?やってみましょう。 +Maybe we want to reverse that order? Let's do that! {% filename %}command-line{% endfilename %} @@ -317,7 +301,7 @@ Maria [59, 42, 30, 19, 12, 3] ``` -リストに何かを追加したいときは、次のようにコマンドを記述してください。 +If you want to add something to your list, you can do this by typing this command: {% filename %}command-line{% endfilename %} @@ -327,7 +311,7 @@ Maria [59, 42, 30, 19, 12, 3, 199] ``` -最初の数字だけを出力したいときは、**インデックス(index)** を使って指定することができます。 インデックスは、アイテムがリストのどこにあるかを指す番号です。 リストの先頭の要素から順に「0」、次に「1」と割り当てられています。 次のとおり試してみてください。 +If you want to show only the first number, you can do this by using **indexes**. An index is the number that says where in a list an item occurs. Programmers prefer to start counting at 0, so the first object in your list is at index 0, the next one is at 1, and so on. Try this: {% filename %}command-line{% endfilename %} @@ -338,9 +322,9 @@ Maria 42 ``` -このように、リスト名と要素のインデックスを [] に記述することで、指定した要素を取り出すことができます。 +As you can see, you can access different objects in your list by using the list's name and the object's index inside of square brackets. -リストから要素を消すには、これまで学んできたインデックスと `pop()` メソッドを使います。 例で試してみましょう。リストの最初の要素を削除しています。 +To delete something from your list you will need to use **indexes** as we learned above and the `pop()` method. Let's try an example and reinforce what we learned previously; we will be deleting the first number of our list. {% filename %}command-line{% endfilename %} @@ -355,17 +339,17 @@ Maria [42, 30, 19, 12, 3, 199] ``` -お見事! +That worked like a charm! -他のインデックスも試して遊んでみてください。例えば、 6, 7, 1000, -1, -6, -1000 などをインデックスに指定するとどうなるでしょうか。コマンドを実行する前に予測してみましょう。結果はどうですか? +For extra fun, try some other indexes: 6, 7, 1000, -1, -6 or -1000. See if you can predict the result before trying the command. Do the results make sense? -ご参考に、こちらのドキュメントにリストメソッドがすべて記されています。 https://docs.python.org/3/tutorial/datastructures.html +You can find a list of all available list methods in this chapter of the Python documentation: https://docs.python.org/3/tutorial/datastructures.html -## 辞書(ディクショナリ) +## Dictionaries -> 家で1人でこのパートに挑戦している方へ:このパートは、動画(英語)もあるので参考にしてください。 [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c) +> For readers at home: this part is covered in the [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c) video. -辞書(ディクショナリ)について確認しましょう。リストに似ていますが、インデックスのかわりにキーと呼ばれる識別子で値を参照します。キーは文字列も数値も使えます。ディクショナリは次のように `{}` 括弧で囲んで作成します。 +A dictionary is similar to a list, but you access values by looking up a key instead of a numeric index. A key can be any string or number. The syntax to define an empty dictionary is: {% filename %}command-line{% endfilename %} @@ -374,9 +358,9 @@ Maria {} ``` -これで中身が空っぽのディクショナリができましたね。やったね! +This shows that you just created an empty dictionary. Hurray! -では、つぎのコマンドを記述してみましょう。 (あなた自身の情報に値をおきかえてみてもいいですよ) +Now, try writing the following command (try substituting your own information, too): {% filename %}command-line{% endfilename %} @@ -384,13 +368,13 @@ Maria >>> participant = {'name': 'Ola', 'country': 'Poland', 'favorite_numbers': [7, 42, 92]} ``` -このコマンドで、`participant` という名前の変数をつくって、3つのキーと値をもつ要素を作成しました。 +With this command, you just created a variable named `participant` with three key–value pairs: - キー `name` が指す値は `'Ola'` (`string` オブジェクト) - キー `country` が指す値は `'Poland'` (`string` オブジェクト) - キー `favorite_numbers` が指す値はリスト `[7, 42, 92]` (数字を3つ持つ`list`) -次のように書くと各キーの値を確認できます。 +You can check the content of individual keys with this syntax: {% filename %}command-line{% endfilename %} @@ -399,9 +383,9 @@ Maria Ola ``` -リストに似ていますね。しかし、ディクショナリでは、インデックスを覚えておく必要がなく、キーの名前でいいのです。 +See, it's similar to a list. But you don't need to remember the index – just the name. -もし存在しないキーを参照しようとすると、どうなるでしょうか?予想できますか?実際にやってみましょう! +What happens if we ask Python the value of a key that doesn't exist? Can you guess? Let's try it and see! {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -412,33 +396,33 @@ Traceback (most recent call last): KeyError: 'age' ``` -またエラーです。今回は **KeyError** というエラーが出ました。Pythonは、このディクショナリにキー `'age'` は存在しませんよ、と教えてくれています。 +Look, another error! This one is a **KeyError**. Python is helpful and tells you that the key `'age'` doesn't exist in this dictionary. -ディクショナリとリストはどう使い分ければよいのでしょうか?そうですね、これはゆっくり考えてみるべきポイントですね!この後の行を読むまえに、答えを考えてみてください。 +When should you use a dictionary or a list? Well, that's a good point to ponder. Think about the answer before looking at it in the next line. - 必要なのは、順序付けられた一連のアイテムですか? リストを使いましょう。 - キーに対応する値が必要?キーから値を参照する? ディクショナリを使いましょう。 -ディクショナリやリストは、作ったあとに変更できるオブジェクトです。これを *mutable* と呼びます。次のように、ディクショナリを作ったあとで、新しいキーと値を追加することができます。 +Like lists, using the `len()` function on the dictionaries returns the number of key–value pairs in the dictionary. Go ahead and type in this command: {% filename %}command-line{% endfilename %} ```python ->>> participant['favorite_language'] = 'Python' +>>> len(participant) +3 ``` -リストと同様に、`len()` 関数をディクショナリに使ってみましょう。ディクショナリでは、キーと値のペアの数を返します。コマンドを入力してやってみましょう。 +Dictionaries, like lists, are *mutable*, meaning that they can be changed after they are created. You can add new key–value pairs to a dictionary after it is created, like this: {% filename %}command-line{% endfilename %} ```python ->>> len(participant) -4 +>>> participant['favorite_language'] = 'Python' ``` -お分かり頂けたでしょうか。 :) では、ディクショナリを使ってもう少し練習してみましょう。準備ができたら、次の行にいってみましょう。 +I hope it makes sense up to now. :) Ready for some more fun with dictionaries? Read on for some amazing things. -ディクショナリの要素を削除する時は、`pop()` メソッドを使います。 例えば、 キー `'favorite_numbers'` の要素を削除するには、次のように記述してください。 +You can use the `pop()` method to delete an item in the dictionary. Say, if you want to delete the entry corresponding to the key `'favorite_numbers'`, type in the following command: {% filename %}command-line{% endfilename %} @@ -449,9 +433,9 @@ KeyError: 'age' {'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'} ``` -このように、`'favorite_numbers'` のキーと値が削除されます。 +As you can see from the output, the key–value pair corresponding to the 'favorite_numbers' key has been deleted. -同様に、次のように記述することで、すでにあるキーの値を変更することができます。 +As well as this, you can also change a value associated with an already-created key in the dictionary. Type this: {% filename %}command-line{% endfilename %} @@ -461,24 +445,24 @@ KeyError: 'age' {'country': 'Germany', 'favorite_language': 'Python', 'name': 'Ola'} ``` -これで、キー `'country'` の値は、`'Poland'` から `'Germany'` に変わりました。面白くなってきましたか?その調子です! +As you can see, the value of the key `'country'` has been altered from `'Poland'` to `'Germany'`. :) Exciting? Hurrah! You just learned another amazing thing. ### まとめ -素晴らしいです!これで、あなたはプログラミングについて沢山のことを学びました。ここまでのところをまとめましょう。 +Awesome! You know a lot about programming now. In this last part you learned about: - **エラー** – あなたのコマンドをPythonが理解できない時にエラーが表示されます。 - **変数** – コードを簡単にまた読みやすくするために、文字や数値などのオブジェクトにつける名札。 - **リスト** – 複数の値(要素)が順に並んでいるもの。 - **ディクショナリ** – キーと値のペアの集合です。 -次に進む準備はいいですか? :) +Excited for the next part? :) -## 比較 +## Compare things -> 家で1人でこのパートに挑戦している方へ:このパートは、動画(英語)もあるので参考にしてください。[Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) +> For readers at home: this part is covered in the [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) video. -比較することは、プログラミングの醍醐味の1つです。簡単に比較できるものといえば、何でしょうか?そうです、数字ですね。さっそくやってみましょう。 +A big part of programming involves comparing things. What's the easiest thing to compare? Numbers! Let's see how that works: {% filename %}command-line{% endfilename %} @@ -493,13 +477,15 @@ True True >>> 5 != 2 True +>>> len([1, 2, 3]) > len([4, 5]) +True ``` -Pythonにいくつか比較する数字をあたえてみました。数字を比較するだけでなく、演算式の答えも比較することができます。便利でしょ? +We gave Python some numbers to compare. As you can see, not only can Python compare numbers, but it can also compare values of mathematical expressions like `2 * 2` and function results like the `2` returned by `len([4, 5])`. Nice, huh? -2つの数字がイコールであるかどうかを比べる時に、イコールの記号が2つ `==` 並んでいます。 Pythonを記述する時、イコール1つ `=`は、変数に値を代入するときに使います。 ですので、値同士が等しいかどうか比較するときは、必ず **必ず** イコール記号2つ `==` を記述してください。 等しくないことを比較するときは、 上記の例のように `!=` と記述します。 +Do you wonder why we put two equal signs `==` next to each other to compare if numbers are equal? We use a single `=` for assigning values to variables. You always, **always** need to put two of them – `==` – if you want to check if things are equal to each other. We can also state that things are unequal to each other. For that, we use the symbol `!=`, as shown in the example above. -次の2つはどうでしょうか。 +Give Python two more tasks: {% filename %}command-line{% endfilename %} @@ -510,14 +496,14 @@ True False ``` -`>` と `<` は簡単でしたね。`>=` と `<=` はどうでしょうか?それぞれの意味は、次のとおりです。 +We've seen `>` and `<`, but what do `>=` and `<=` mean? Read them like this: - x `>` y : x は y より大きい - x `<` y : x は y より小さい - x `<=` y : x は y 以下 - x `>=` y : x は y 以上 -すばらしい! もう少しやってみましょう。 +Awesome! Wanna do one more? Try this: {% filename %}command-line{% endfilename %} @@ -530,12 +516,12 @@ False True ``` -複数の数値を比較して複雑になっても、その答えを出してくれます。とても賢いですね。 +You can give Python as many numbers to compare as you want, and it will give you an answer! Pretty smart, right? - **and** – `and` の左辺と右辺が共にTrueの場合のみ、True。 - **or** – `or` の左辺あるいは右辺の少なくとも1つがTrueの時、True。 -"comparing apples to oranges"という英語の表現を聞いたことはありますか?文字通り訳すと「リンゴとオレンジを比較する」となり、「比較にならないものを比較する」という意味です。Pythonでも同じようなことをやってみましょう。 +Have you heard of the expression "comparing apples to oranges"? Let's try the Python equivalent: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -546,20 +532,20 @@ Traceback (most recent call last): TypeError: '>' not supported between instances of 'int' and 'str' ``` -Pythonは、数値(`int`)と文字列(`str`)の比較はできません。 **TypeError** とエラーが表示され、2つのオブジェクトタイプが比較できないことを教えてくれています。 +Here you see that just like in the expression, Python is not able to compare a number (`int`) and a string (`str`). Instead, it shows a **TypeError** and tells us the two types can't be compared together. -## ブール型(Boolean) +## Boolean -偶然にも、**ブール型 (Boolean)** というあたらしいオブジェクトタイプを学びました。 +Incidentally, you just learned about a new type of object in Python. It's called **Boolean**. -ブール型は、たった2つの値を持ちます。 +There are only two Boolean objects: - True - False -Pythonを記述するときは、Trueの最初は大文字のT、残りは小文字です。 **true, TRUE, tRUE は間違いです。– True と記述してください** (False についても同様です。) +But for Python to understand this, you need to always write it as 'True' (first letter uppercase, with the rest of the letters lowercased). **true, TRUE, and tRUE won't work – only True is correct.** (The same applies to 'False' as well.) -ブール型は、次のように変数に代入することもできます。 +Booleans can be variables, too! See here: {% filename %}command-line{% endfilename %} @@ -569,7 +555,7 @@ Pythonを記述するときは、Trueの最初は大文字のT、残りは小文 True ``` -このようなこともできます。 +You can also do it this way: {% filename %}command-line{% endfilename %} @@ -579,27 +565,27 @@ True False ``` -ブール型を使って、練習して遊んでみましょう。次のコマンドを試してみてください。 +Practice and have fun with Booleans by trying to run the following commands: - `True and True` - `False and True` - `True or 1 == 1` - `1 != 2` -おめでとうございます!ブール型を理解することは、プログラミングでとても大事です。ここまでできましたね! +Congrats! Booleans are one of the coolest features in programming, and you just learned how to use them! # 保存しよう! -> 家で1人でこのパートに挑戦している方へ:このパートと続くパートは、動画(英語)もあるので参考にしてください。[Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) +> For readers at home: this part is covered in the [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) video. -ここまでインタプリタでPythonのコードをかいてきました。つまり、コードを1行ずつしか書くことができませんでした。 普通のプログラムはファイルに保存され、**インタプリタ** あるいは **コンパイラ** でプログラミング言語を処理して実行します。 ここまで、私たちはプログラムを1行ごとにPython **インタプリタ** で実行してきました。 ここからは、1行以上のコードを実行していきましょう。次のような流れになります。 +So far we've been writing all our python code in the interpreter, which limits us to entering one line of code at a time. Normal programs are saved in files and executed by our programming language **interpreter** or **compiler**. So far we've been running our programs one line at a time in the Python **interpreter**. We're going to need more than one line of code for the next few tasks, so we'll quickly need to: - Pythonインタプリタを終了します。 - お好きなエディタを起動します。 - Pythonファイルとしてコードを保存します。 - 実行します! -これまで使っていたPythonインタプリタを終了しましょう。`exit()` 関数を入力してください。 +To exit from the Python interpreter that we've been using, type the `exit()` function {% filename %}command-line{% endfilename %} @@ -608,9 +594,9 @@ False $ ``` -これで、コマンドプロンプトに戻りました。 +This will put you back into the command prompt. -前に、[コードエディタ](../code_editor/README.md)セクションからエディタを選択しました。 ここでエディタを開いて、新しいファイルにコードを書き込んでみましょう(Chromebookを使用している場合は、Cloud IDEで新しいファイルを作成し、そのファイルを開きます。ファイルをcloud IDEに含まれたコードエディタで開いています)。 +Earlier, we picked out a code editor from the [code editor](../code_editor/README.md) section. We'll need to open the editor now and write some code into a new file (or if you're using a Chromebook, create a new file in the cloud IDE and open the file, which will be in the included code editor): {% filename %}editor{% endfilename %} @@ -618,18 +604,18 @@ $ print('Hello, Django girls!') ``` -あなたは、すでにベテランのPython開発者です。今日学んだコードを自由に書いてみてください。 +Obviously, you're a pretty seasoned Python developer now, so feel free to write some code that you've learned today. -コードを書いたら、わかりやすい名前をつけて保存しましょう。 **python_intro.py** と名前をつけて、デスクトップに保存してください。 ファイル名は何でもかまいません。ここで重要なことは、拡張子を **.py** とすることです。 コンピュータにこのファイルは **Pythonで実行するファイルです** とおしえます。 +Now we need to save the file and give it a descriptive name. Let's call the file **python_intro.py** and save it to your desktop. We can name the file anything we want, but the important part here is to make sure the file ends in **.py**. The **.py** extension tells our operating system that this is a **Python executable file** and Python can run it. -> **メモ** コードエディタでは色に注目しましょう!これはとてもクールです。 Pythonコンソールでは、すべての文字は同じ色です。エディタでは、`print` 関数は文字列とは違う色がつきます。 これは「シンタックスハイライト」と呼ばれています。エディタは構文(シンタックス)を強調(ハイライト)します。コードを書くとき、これはとても役に立ちます。 色のおかげで、文字列の最後のクォーテーションの書き忘れや、キーワードの名前(この後学ぶ関数の `def` など)のタイポに気づくことができます。 これが私たちがコードエディタを使う理由の1つです. :) +> **Note** You should notice one of the coolest thing about code editors: colors! In the Python console, everything was the same color; now you should see that the `print` function is a different color from the string. This is called "syntax highlighting", and it's a really useful feature when coding. The color of things will give you hints, such as unclosed strings or a typo in a keyword name (like the `def` in a function, which we'll see below). This is one of the reasons we use a code editor. :) -ファイルを保存したら、実行してみましょう!コマンドラインのセクションで学んだことを思い出して、ターミナルの **ディレクトリを変更** して、デスクトップにしましょう。 +With the file saved, it's time to run it! Using the skills you've learned in the command line section, use the terminal to **change directories** to the desktop. -Macでは、コマンドは次のようになります。 +On a Mac, the command will look something like this: {% filename %}command-line{% endfilename %} @@ -641,20 +627,20 @@ Macでは、コマンドは次のようになります。 -Linuxでは、次のようになります。 +On Linux, it will be like this: {% filename %}command-line{% endfilename %} $ cd ~/Desktop -(「Desktop」という単語はあなたの地域の言語に翻訳される場合があります。) +(Remember that the word "Desktop" might be translated to your local language.) -Windowsのコマンドプロンプトでは、次のようになります。 +On Windows Command Prompt, it will be like this: {% filename %}command-line{% endfilename %} @@ -665,7 +651,7 @@ Windowsのコマンドプロンプトでは、次のようになります。 -WindowsのPowerShellでは、次のようになります。 +And on Windows Powershell, it will be like this: {% filename %}command-line{% endfilename %} @@ -674,9 +660,9 @@ WindowsのPowerShellでは、次のようになります。 -うまくできない時は、質問してください。まさにそのためにコーチがここにいるんです! +If you get stuck, ask for help. That's exactly what the coaches are here for! -ではPythonを使用して、ファイル内のコードを次のように実行します。 +Now use Python to execute the code in the file like this: {% filename %}command-line{% endfilename %} @@ -684,7 +670,7 @@ WindowsのPowerShellでは、次のようになります。 Hello, Django girls! -注:Windowsでは「python3」はコマンドとして認識されません。代わりに「python」を使ってファイルを実行します。 +Note: on Windows 'python3' is not recognized as a command. Instead, use 'python' to execute the file: {% filename %}command-line{% endfilename %} @@ -692,15 +678,15 @@ WindowsのPowerShellでは、次のようになります。 > python python_intro.py ``` -できました!ファイルに保存された初めてのPythonプログラムを実行できたのです。すばらしいですね。 +Alright! You just ran your first Python program that was saved to a file. Feel awesome? -では、ここからプログラミングに不可欠なツールを学んでいきましょう。 +You can now move on to an essential tool in programming: ## If … elif … else -ある条件が成立するときにだけコードを実行したいということがよくあります。そのためにPythonでは **if文** を用います。 +Lots of things in code should be executed only when given conditions are met. That's why Python has something called **if statements**. -**python_intro.py** ファイルのコードを次のように書き換えてください。 +Replace the code in your **python_intro.py** file with this: {% filename %}python_intro.py{% endfilename %} @@ -708,7 +694,7 @@ WindowsのPowerShellでは、次のようになります。 if 3 > 2: ``` -もしこれを保存して実行すると、次のようなエラーが出ます。 +If we were to save and run this, we'd see an error like this: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -718,7 +704,7 @@ if 3 > 2: SyntaxError: unexpected EOF while parsing -`3 > 2` という条件が成立する( `True` となりますね)時に実行される処理を、まだ記述していませんね。 では、Python に “It works!” と出力してもらいましょう。 **python_intro.py** ファイルの中身を、次のとおりに書き換えてください。 +Python expects us to give further instructions to it which are executed if the condition `3 > 2` turns out to be true (or `True` for that matter). Let’s try to make Python print “It works!”. Change your code in your **python_intro.py** file to this: {% filename %}python_intro.py{% endfilename %} @@ -727,9 +713,9 @@ if 3 > 2: print('It works!') ``` -2行目をスペース4つでインデント(字下げ)していることに気が付きましたか? 条件が成り立つ時にどのコードを実行するかPythonが分かるように、インデントする必要があります。 スペース1つでもできますが、Pythonプログラマーはほぼ全員スペース4つとしています。 エディタの設定により、タブ1つもスペース4つと同じになります。 タブかスペースか決めたら、変えないようにしましょう。 例えばスペース4つでインデントしたら、この後もスペース4つでインデントするようにしましょう。インデントにスペースとタブを混ぜてしまうと問題が発生してしまうことがあります。 +Notice how we've indented the next line of code by 4 spaces? We need to do this so Python knows what code to run if the result is true. You can do one space, but nearly all Python programmers do 4 to make things look neat. A single Tab will also count as 4 spaces as long as your text editor is set to do so. When you made your choice, don't change it! If you already indented with 4 spaces, make any future indentation with 4 spaces, too - otherwise you may run into problems. -保存して、もう一度実行してみましょう。 +Save it and give it another run: {% filename %}command-line{% endfilename %} @@ -738,11 +724,11 @@ $ python3 python_intro.py It works! ``` -注:Windowsでは「python3」はコマンドとして認識されないことを思い出してください。これから先、ファイルを実行するときは「python3」の代わりに「python」とタイプしてくださいね。 +Note: Remember that on Windows, 'python3' is not recognized as a command. From now on, replace 'python3' with 'python' to execute the file. ### 条件がTrueじゃないときは? -前述の例では、if文の条件が True の時だけコードが実行されました。Pythonは、`elif` や `else` といった記述もできます。 +In previous examples, code was executed only when the conditions were True. But Python also has `elif` and `else` statements: {% filename %}python_intro.py{% endfilename %} @@ -753,7 +739,7 @@ else: print('5 is not greater than 2') ``` -これを実行した場合、次のように出力されます。 +When this is run it will print out: {% filename %}command-line{% endfilename %} @@ -761,7 +747,7 @@ else: 5 is indeed greater than 2 -もし2が5より大きかったら、4行目のコマンドが実行されます。では、`elif` はどうなるのでしょうか? +If 2 were a greater number than 5, then the second command would be executed. Let's see how `elif` works: {% filename %}python_intro.py{% endfilename %} @@ -775,7 +761,7 @@ else: print('Hey anonymous!') ``` -実行すると... +and executed: {% filename %}command-line{% endfilename %} @@ -783,9 +769,9 @@ else: Hey Sonja! -どうなったかわかりましたか? `elif` を使って、前に書いた条件が成立しない場合に実行される条件を追加することができます。 +See what happened there? `elif` lets you add extra conditions that run if the previous conditions fail. -最初の `if` の後に、好きなだけ `elif` を追加することができます。例えば... +You can add as many `elif` statements as you like after your initial `if` statement. For example: {% filename %}python_intro.py{% endfilename %} @@ -805,7 +791,7 @@ else: print("My ears are hurting! :(") ``` -Pythonは上から順番に各条件をテストして実行し、次のように出力します。 +Python runs through each test in sequence and prints: {% filename %}command-line{% endfilename %} @@ -813,26 +799,26 @@ Pythonは上から順番に各条件をテストして実行し、次のよう Perfect, I can hear all the details -## コメント +## Comments -コメントは `#` で始まる行です。`#` の後にはなんでも書くことができ、Pythonはそれを無視します。コメントを書いたコードは、ほかの人にとってもわかりやすくなります。 +Comments are lines beginning with `#`. You can write whatever you want after the `#` and Python will ignore it. Comments can make your code easier for other people to understand. -実際にはこのようになります。 +Let's see how that looks: {% filename %}python_intro.py{% endfilename %} ```python -# ボリュームが大きすぎたり小さすぎたりしたら変更する +# Change the volume if it's too loud or too quiet if volume < 20 or volume > 80: volume = 50 print("That's better!") ``` -コードのすべての行にコメントを書く必要はありません。コメントには、コードの中である処理をする理由や、複雑なコードの動きのまとめを書くと役に立ちます。 +You don't need to write a comment for every line of code, but they are useful for explaining why your code is doing something, or providing a summary when it's doing something complex. ### まとめ -これらの練習を通して、学んだことは... +In the last few exercises you learned about: - **比較** – 比較に用いる `>`, `>=`, `==`, `<=`, `<` そして`and`, `or` といった演算子があります。 - **ブール型** – `True` と `False` 2つの値のみを持ちます。 @@ -840,15 +826,15 @@ if volume < 20 or volume > 80: - **if … elif … else** – 条件分岐することで、特定の条件によって処理を分けて実行することができます。 - **コメント** – あなたがコードについて記述できる行。Pythonは実行しません。 -では、いよいよこのチャプターの最後のパートです! +Time for the last part of this chapter! -## 自作の関数! +## Your own functions! -> 家で1人でこのパートに挑戦している方へ:このパートは、動画(英語)もあるので参考にしてください。[Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0) +> For readers at home: this part is covered in the [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0) video. -Pythonでは `len()` のように関数が実行できるのを覚えていますか? ここでは、自分で関数を作る方法を学びます。 +Remember functions like `len()` that you can execute in Python? Well, good news – you will learn how to write your own functions now! -関数は、Pythonが実行する一連の命令をひとまとめにしたものです。 Pythonでは、関数は `def` というキーワードからはじまり、名前をつけ、引数を含むことができます。 やってみましょう。 **python_intro.py** の中身を下記のコードに置き換えてください。 +A function is a sequence of instructions that Python should execute. Each function in Python starts with the keyword `def`, is given a name, and can have some parameters. Let's give it a go. Replace the code in **python_intro.py** with the following: {% filename %}python_intro.py{% endfilename %} @@ -860,11 +846,11 @@ def hi(): hi() ``` -よし!あなたの最初の関数を実行する準備ができましたね! +Okay, our first function is ready! -ここであなたは、最後の行になぜ関数の名前を書いたのだろう、と疑問に感じたかもしれません。 これは、Pythonがファイルを読み、上から下へ実行していくからです。 なので、関数を使用するには、一番下に再度書く必要があります。 +You may wonder why we've written the name of the function at the bottom of the file. When we write `def hi():` and the indented lines following, this is us writing instructions for what the `hi()` function should do. Python will read and remember these instructions, but won't run the function yet. To tell Python we want to run the function, we have to call the function with `hi()`. Python reads the file and executes it from top to bottom, so we have to define the function in the file before we call it. -では実行して、どうなるか見てみましょう。 +Let's run this now and see what happens: {% filename %}command-line{% endfilename %} @@ -873,13 +859,13 @@ hi() How are you? -注:思ったように動かなくても慌てないで!画面の出力は動かない理由をつかむのに役立ちます。 +Note: if it didn't work, don't panic! The output will help you to figure why: - `NameError` が出ている場合、おそらく何かミスタイプがあります。同じ名前を使っているかチェックしましょう。関数を定義するときは `def hi():` としていますか?関数を実行するときは `hi()` としていますか? - `IndentationError` が出ている場合、`print` 関数の2行が同じ数のスペースでインデントされているかチェックしましょう。関数の中のコードは同じ数のスベースでインデントされているとPythonは考えます。 - 画面に何も表示されていない場合、最後の `hi()` がインデントされて *いない* かチェックしましょう - もしインデントされていたら、関数の一部になってしまっています。関数が呼び出されていません。 -次に引数をつかった関数を作ってみましょう。先ほどの例を変更し、人の名前を呼んで 'hi' と挨拶をする関数にしてみます。 +Let's build our first function with parameters. We will change the previous example – a function that says 'hi' to the person running it – with a name: {% filename %}python_intro.py{% endfilename %} @@ -887,7 +873,7 @@ hi() def hi(name): ``` -ご覧のように、関数に `name` という引数を与えました。 +As you can see, we now gave our function a parameter that we called `name`: {% filename %}python_intro.py{% endfilename %} @@ -903,7 +889,7 @@ def hi(name): hi() ``` -要確認:`print` 関数は、` if `文の中で4つのスペースでインデントします。 これは、条件が満たされたときに関数が実行されるためです。 では、どのように動くか見てみましょう。 +Remember: The `print` function is indented four spaces within the `if` statement. This is because the function runs when the condition is met. Let's see how it works now: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -914,7 +900,7 @@ hi() TypeError: hi() missing 1 required positional argument: 'name' -おっと、エラーがでてしまいました。 ラッキーなことに、Pythonがかなり役に立つエラーメッセージを表示してくれています。 定義した関数 `hi()` は、`name` という引数が必要ですが、関数を呼び出す時に引数を忘れてしまっているということがわかります。 最後の行を修正しましょう。 +Oops, an error. Luckily, Python gives us a pretty useful error message. It tells us that the function `hi()` (the one we defined) has one required argument (called `name`) and that we forgot to pass it when calling the function. Let's fix it at the bottom of the file: {% filename %}python_intro.py{% endfilename %} @@ -922,7 +908,7 @@ hi() hi("Ola") ``` -実行してください。 +And run it again: {% filename %}command-line{% endfilename %} @@ -930,7 +916,7 @@ hi("Ola") Hi Ola! -では、名前を変えてみたらどうなりますか? +And if we change the name? {% filename %}python_intro.py{% endfilename %} @@ -938,7 +924,7 @@ hi("Ola") hi("Sonja") ``` -実行してください。 +And run it: {% filename %}command-line{% endfilename %} @@ -946,16 +932,16 @@ hi("Sonja") Hi Sonja! -では、OlaやSonja以外の名前に変えた時、どうなるかわかりますか?やってみて、予測が正しいか確認して下さい。このように出力されます。 +Now, what do you think will happen if you write another name in there? (Not Ola or Sonja.) Give it a try and see if you're right. It should print out this: {% filename %}command-line{% endfilename %} Hi anonymous! -すごいでしょ? 挨拶をする人の名前を変えるたびに繰り返しコードを書く必要がなくなりました。 これが関数を作る理由です。何度も繰り返してコードを書きたくないですよね! +This is awesome, right? This way you don't have to repeat yourself every time you want to change the name of the person the function is supposed to greet. And that's exactly why we need functions – you never want to repeat your code! -もっとスマートにしてみましょう。名前が2つよりも多いと、それぞれの名前に対して条件を書くのは大変じゃないですか?ファイルの内容を下記のように書き換えてください。 +Let's do something smarter – there are more names than two, and writing a condition for each would be hard, right? Replace the content of your file with the following: {% filename %}python_intro.py{% endfilename %} @@ -966,7 +952,7 @@ def hi(name): hi("Rachel") ``` -では、実行してみましょう: +Let's call the code now: {% filename %}command-line{% endfilename %} @@ -974,17 +960,17 @@ hi("Rachel") Hi Rachel! -おめでとうございます!関数の書き方を学びましたね!:) +Congratulations! You just learned how to write functions! :) -## ループ +## Loops -> 家で1人でこのパートに挑戦している方へ:このパートは、動画(英語)もあるので参考にしてください。[Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) +> For readers at home: this part is covered in the [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) video. -さぁ、もう最後のパートですよ。あっという間ですね。 :) +This is the last part already. That was quick, right? :) -先ほどお話ししたとおり、プログラマーはめんどくさがりで、同じことを繰り返すのは好きではありません。プログラミングの目的は、物事を自動化することです。名前を呼んで挨拶をする関数をすべての人に対して手で呼び出したくないですよね?こういう時にループが便利です。 +Programmers don't like to repeat themselves. Programming is all about automating things, so we don't want to greet every person by their name manually, right? That's where loops come in handy. -リストを覚えていますか?女の子の名前をリストにしてみましょう: +Still remember lists? Let's do a list of girls: {% filename %}python_intro.py{% endfilename %} @@ -992,7 +978,7 @@ hi("Rachel") girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You'] ``` -名前を呼んで、全員にあいさつをしてみましょう。` hi `関数が使えますね。ループの中で使いましょう: +We want to greet all of them by their name. We have the `hi` function to do that, so let's use it in a loop: {% filename %}python_intro.py{% endfilename %} @@ -1000,9 +986,9 @@ girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You'] for name in girls: ``` -この `for` 文は `if` 文に似ています。これらの下に書くコードは、4つのスペースでインデントする必要があります。 +The `for` statement behaves similarly to the `if` statement; code below both of these need to be indented four spaces. -ファイルに書かれるコードはこのようになります: +Here is the full code that will be in the file: {% filename %}python_intro.py{% endfilename %} @@ -1016,7 +1002,7 @@ for name in girls: print('Next girl') ``` -実行してみましょう: +And when we run it: {% filename %}command-line{% endfilename %} @@ -1033,9 +1019,9 @@ for name in girls: Next girl -ご覧のとおり、`girls` リストのすべての要素に対して、`for` 文の中にインデントして書いたことが繰り返されています。 +As you can see, everything you put inside a `for` statement with an indent will be repeated for every element of the list `girls`. -`range` 関数を使うことで、`for` 文を数値について使うこともできます。 +You can also use `for` on numbers using the `range` function: {% filename %}python_intro.py{% endfilename %} @@ -1044,7 +1030,7 @@ for i in range(1, 6): print(i) ``` -これを実行すると、次のように出力されます: +Which would print: {% filename %}command-line{% endfilename %} @@ -1055,16 +1041,16 @@ for i in range(1, 6): 5 -`range` 関数は、連続する数値を要素とするリストを作ります。引数に指定した開始の数値から終了の数値までのリストです。 +`range` is a function that creates a list of numbers following one after the other (these numbers are provided by you as parameters). -2つ目の引数(終了の数値)は、リストに含まれないことに注意してください(`range(1, 6)`は1から5がカウントされますが、6は含まれません)。 開始に指定した数値は含まれて、終了に指定した値は含まれないのです。 +Note that the second of these two numbers is not included in the list that is output by Python (meaning `range(1, 6)` counts from 1 to 5, but does not include the number 6). That is because "range" is half-open, and by that we mean it includes the first value, but not the last. -## まとめ +## Summary -以上です!**おめでとう!頑張りました!** これは簡単ではなかったと思います。自分を褒めてあげてくださいね。ここまで進めることができたのは、本当にすごいことです! +That's it. **You totally rock!** This was a tricky chapter, so you should feel proud of yourself. We're definitely proud of you for making it this far! -公式の完全なPythonチュートリアルは https://docs.python.org/ja/3/tutorial/ にあります。これを見れば、Pythonについてより綿密で完全な学習ができるでしょう。ばんざい!:) +For official and full python tutorial visit https://docs.python.org/3/tutorial/. This will give you a more thorough and complete study of the language. Cheers! :) -次のチャプターに進む前に、ストレッチしたり、お散歩したり、目を休ませたりして、少しの間リフレッシュしてくださいね。 :) +You might want to briefly do something else – stretch, walk around for a bit, rest your eyes – before going on to the next chapter. :) -![カップケーキ](images/cupcake.png) \ No newline at end of file +![Cupcake](images/cupcake.png) \ No newline at end of file diff --git a/ja/python_introduction/prompt.md b/ja/python_introduction/prompt.md new file mode 100644 index 00000000000..27f422934c0 --- /dev/null +++ b/ja/python_introduction/prompt.md @@ -0,0 +1,17 @@ +## Python prompt + +> For readers at home: this part is covered in the [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U) video. + +To start playing with Python, we need to open up a *command line* on your computer. You should already know how to do that – you learned it in the [Intro to Command Line](../intro_to_command_line/README.md) chapter. + +Once you're ready, follow the instructions below. + +We want to open up a Python console, so type in `python` on Windows or `python3` on Mac OS/Linux and hit `enter`. + +{% filename %}command-line{% endfilename %} +``` +$ python3 +Python {{ book.py_release }} (...) +Type "help", "copyright", "credits" or "license" for more information. +>>> +``` diff --git a/ja/template_extending/README.md b/ja/template_extending/README.md index ab993f155cc..a0e154c31ad 100644 --- a/ja/template_extending/README.md +++ b/ja/template_extending/README.md @@ -23,34 +23,36 @@ Djangoのまた別の素敵なところは**テンプレート拡張**です。 ```html {% load static %} + Django Girls blog - - + - + -
+
-
+
{% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %}
-
+
``` @@ -61,17 +63,19 @@ Djangoのまた別の素敵なところは**テンプレート拡張**です。 ```html - -
+ +
-
+
{% block content %} {% endblock %}
-
+
``` @@ -92,13 +96,13 @@ Djangoのまた別の素敵なところは**テンプレート拡張**です。 ```html {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} ``` @@ -111,13 +115,13 @@ Djangoのまた別の素敵なところは**テンプレート拡張**です。 ```html {% block content %} {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` @@ -131,13 +135,13 @@ Djangoのまた別の素敵なところは**テンプレート拡張**です。 {% block content %} {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` diff --git a/ja/whats_next/README.md b/ja/whats_next/README.md index 44349492ed4..6bc711f933e 100644 --- a/ja/whats_next/README.md +++ b/ja/whats_next/README.md @@ -15,8 +15,9 @@ #### Django - このチュートリアルの続きである[Django Girls Tutorial: Extensions](https://tutorial-extensions.djangogirls.org/) -- [Django 公式チュートリアル](https://docs.djangoproject.com/en/2.2/intro/tutorial01/) +- [Django 公式チュートリアル](https://docs.djangoproject.com/en/3.2/intro/tutorial01/) - [Getting Started With Django 動画レッスン](http://www.gettingstartedwithdjango.com/) +- [Django for Everybody Specialization](https://www.coursera.org/specializations/django) - いくつかのビデオは無料で視聴可能で、Coursea終了証を取得することもできます。 #### HTML, CSS ならびに JavaScript