<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>リューブログ</title>
	<atom:link href="https://ryuusan.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://ryuusan.com</link>
	<description>就活生だった時の気づきや日常の発信のほか、技術ブログとしても運用しています。</description>
	<lastBuildDate>Fri, 30 Oct 2020 02:57:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://ryuusan.com/wp-content/uploads/2020/03/cropped-logo-32x32.png</url>
	<title>リューブログ</title>
	<link>https://ryuusan.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flaskの開発環境をDockerで構築する</title>
		<link>https://ryuusan.com/flaskdocker/</link>
					<comments>https://ryuusan.com/flaskdocker/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Fri, 30 Oct 2020 02:57:19 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[flask]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=383</guid>

					<description><![CDATA[はじめに こんにちは。リューさんです。この記事ではタイトルの通り、DockerでFlaskの開発環境を構築する手順を紹介していきます。Flaskの公式サイトはこちらです。 1. プロジェクトディレクトリを作成する まず、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは。リューさんです。この記事ではタイトルの通り、DockerでFlaskの開発環境を構築する手順を紹介していきます。Flaskの公式サイトは<a href="https://flask.palletsprojects.com/en/1.1.x/">こちら</a>です。</p>



<h2 class="wp-block-heading">1. プロジェクトディレクトリを作成する</h2>



<p>まず、PC上にプロジェクトディレクトリを作成します。mkdirコマンドを使うか、GUIで作成しても構いません。名前は適当で大丈夫です。今回は<strong>testdir</strong>とでもしておきます。</p>



<p>次に、そのディレクトリ内にPythonファイルを作成し、以下のように記述します。この名前はapp.pyとしておきます。別の名前にしても大丈夫ですが、この後使用するので注意してください。</p>



<pre class="wp-block-code"><code>from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello, World!'


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8000)</code></pre>



<p>このファイルの詳細な説明はまた別の記事に書こうと思いますが、Dockerを利用して環境構築をする際にはファイル末尾の、&#8221;<strong>app.run(debug=True, host=&#8217;0.0.0.0&#8242;, port=8000)</strong>&#8220;という記述を忘れないようにしてください。portの部分は変えても大丈夫ですが、<strong>host=&#8217;0.0.0.0&#8242;</strong>が無いとアクセスすることができません。</p>



<p>ちなみに、Flaskのデフォルトポートは5000番らしいです。</p>



<h2 class="wp-block-heading">2. requirements.txtを作成する</h2>



<p><strong>requirements.txt</strong>を1で作成したプロジェクトディレクトリ内に作成します。以下のように記述してください。</p>



<pre class="wp-block-code"><code>flask</code></pre>



<p>このファイルでインストールするパッケージを管理します。</p>



<h2 class="wp-block-heading">3. Dockerfileを作成する</h2>



<p>2.と同様に、プロジェクトディレクトリに<strong>Dockerfile</strong>という名称のファイルを作成します。Dockerfileには以下のように記述してください。</p>



<pre class="wp-block-code"><code>FROM python:3.9-alpine
ADD . /code
WORKDIR /code
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD &#91;"python", "app.py"]</code></pre>



<p>今回はpython3.9のイメージを使います。ファイル末尾のCMD<strong> [&#8220;python&#8221;, &#8220;app.py&#8221;]</strong>の&#8221;app.py&#8221;は1.で作成したpythonのファイル名に置き換えてください。</p>



<h2 class="wp-block-heading">4. docker-compose.ymlを作成する</h2>



<p>docker-compose.ymlというファイルをプロジェクトディレクトリ内に作成し、以下のように記述してください。</p>



<pre class="wp-block-code"><code>version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/code</code></pre>



<h2 class="wp-block-heading">5. 実行する</h2>



<p>プロジェクトディレクトリ上で以下のコマンドを実行してください。コンテナが作成されるはずです。</p>



<pre class="wp-block-code"><code>docker-compose up -d</code></pre>



<p>もしこの時にエラーが出て、requirements.txtなどを修正した場合、上のコマンドを打ち直しても変更されません。そのような場合は、以下のようなコマンドを実行しましょう。</p>



<pre class="wp-block-code"><code>docker-compose build
docker-compose up -d</code></pre>



<p>無事コンテナが作成されたら、docker-machine ip [マシン名]で仮想マシンのipアドレスを取得し、ブラウザ上で</p>



<p><strong>&#8220;http://[取得したipアドレス]:8000&#8221;</strong>にアクセスしてください。マシン名は特に変更してない場合、<strong>default</strong>という名前になっているはずです。</p>



<p>アクセスできたら、app.pyで指定した通りhello world!が表示されていると思います。そうなれば成功です！</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>この記事では、Dockerを利用してFlaskの環境構築を行う手順を紹介しました。使用したOSはWindows10ですが、マック等もそこまで変わらないはずです。</p>



<p>「動かない」「この部分は間違っている」等ご意見ありましたら、僕のTwitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)までご連絡いただければ幸いです。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/flaskdocker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DjangoでAjaxを使っていいねボタンを作る</title>
		<link>https://ryuusan.com/django-ajax/</link>
					<comments>https://ryuusan.com/django-ajax/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Wed, 14 Oct 2020 04:56:15 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Django]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=353</guid>

					<description><![CDATA[こんにちは。リューさん(@Ryu_programs)です。今回の記事ではjQueryを使ってDjangoでAjaxを行っていきたいと思います。 この記事ではDjangoについては詳細な説明をしていないので、Djangoの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。今回の記事ではjQueryを使ってDjangoでAjaxを行っていきたいと思います。</p>



<p>この記事ではDjangoについては詳細な説明をしていないので、Djangoの実装方法などについては以下の記事を読んでみてください。</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<h2 class="wp-block-heading">はじめに &#8211; Ajaxとは？</h2>



<p>Ajax(<strong>Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML</strong>)は、それ自体が技術というわけではなく、一種のアプローチです。このAjaxを利用ことで、表示されているページをすべて更新することなく、一部のみを更新することができ、Webアプリケーションの高速化を行うことができます。</p>



<p>よくGoogle MapsがAjaxを利用している例として挙げられます。Google Mapsはドラッグに合わせて、ページをリロードすることなく表示される範囲が滑らかに移動しますが、それはAjaxを利用しているためです。</p>



<p>また、<strong>Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML</strong>にはXMLの文字が入っていますが、JSONの方が軽く、JavaScriptで扱いやすいなどの理由から最近はXMLよりもJavaScriptの方がよく使われているそうです。今回もJSONを使って実装していきたいと思います。</p>



<h2 class="wp-block-heading">実装</h2>



<p>テンプレートファイルは以下の通りです。今回はjQueryの$.ajaxメソッドを利用しているので、base.htmlでjQueryを読み込んでいます。</p>



<p>getCookieから$.ajaxSetupまでは、csrftokenをいい感じにするために記述しています。送信フォームを使う場合は<strong>{% csrf_token %}</strong>をつけておけばDjangoが良い感じにしてくれるのですが、ajaxでPOSTする場合はこのように<strong>cookieから拾ってきたcsrftokenの内容を<span class="marker-under">X-CSRFToken</span>という名前でヘッダに設定する</strong>必要があります。</p>



<pre class="wp-block-code"><code>{% extends 'article/base.html' %}

{% block title %}
    My test page
{% endblock %}

{% block content %}
    &lt;ul>
        {% for article in article_list %}
            &lt;li>
                {{ article.article_text }}
                &lt;span class="add_good" id={{ article.id }}>&amp;hearts;&lt;/span>
                &lt;span id="good-count-{{article.id}}">{{ article.good_count }}&lt;/span>
            &lt;/li>
        {% endfor %}
    &lt;/ul>
    &lt;button onclick="location.href='{% url 'article:article_create' %}'">
        追加
    &lt;/button>
{% endblock %}

{% block extrajs %}
    &lt;script>
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie &amp;&amp; document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i &lt; cookies.length; i++) {
                    var cookie = jQuery.trim(cookies&#91;i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }

        var csrftoken = getCookie('csrftoken');

        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        $.ajaxSetup({
            beforeSend: function (xhr, settings) {
                if (!csrfSafeMethod(settings.type) &amp;&amp; !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $('.add_good').on('click', function(e) {
            article_id = $(this).attr("id");
            $.ajax({
                'url': '{% url "article:change_count" %}',
                'type': 'POST',
                'data': {
                    'id': article_id,
                },
                'dataType': 'json'
            }).done( response => {
                const response_id = response.id;
                const good_count = response.good_count;
                const element = '#good-count-' + response_id;
                $(element).text(good_count);
            });

        });
    &lt;/script>
{% endblock %}</code></pre>



<p>モデルはこんな感じです。good_countがいいねの数に対応しています。ajaxでArticleのidをもらい、viewで対応するArticleのgood_countを増やしてからjsonで追加後のいいね数を返しています。</p>



<pre class="wp-block-code"><code>from django.db import models

# Create your models here.
class Article(models.Model):
    article_text = models.CharField(max_length=100)
    good_count = models.IntegerField(default=0)
    
    def __str__(self):
        return self.article_text</code></pre>



<p>viewは以下の通りです。<strong>add_good_count_for_article</strong>が主にajaxの処理を行う関数です。<strong>return JsonResponse</strong>でJsonを返却しています。</p>



<pre class="wp-block-code"><code>from django.shortcuts import render
from .models import Article
from django.views.generic import ListView
from django.views.generic.edit import CreateView
from django.urls import reverse
from django.http import JsonResponse

# Create your views here.
class ArticleListView(ListView):
    template_name = 'article_list.html'
    model = Article
    

class ArticleCreateView(CreateView):
    model = Article
    fields = ('article_text', )
    
    def get_success_url(self):
        return reverse('article:article_list')
        

def add_good_count_for_article(request):
    article_id = request.POST.get('id')
    article = Article.objects.get(id=article_id)
    article.good_count += 1
    article.save()
    data = {
        'id': article_id,
        'good_count': article.good_count,
    }
    return JsonResponse(data)</code></pre>



<p>urlは以下のように設定しています。</p>



<pre class="wp-block-code"><code>from django.urls import path
from . import views

app_name = 'article'
urlpatterns = &#91;
    path('', views.ArticleListView.as_view(), name='article_list'),
    path('create/', views.ArticleCreateView.as_view(), name='article_create'),
    path('change/', views.add_good_count_for_article, name='change_count')
]</code></pre>



<p>トリミングと拡大をしているのでだいぶ荒いですが、このようにいいねを押すとリロードを挟まずにいいね数が増えていきます。変更はデータベースにも反映されているので、リロードを行ってもいいね数は変更された値のままです。(ListViewを使っているので、順序は変わるかもしれませんが)</p>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango.png" alt="" class="wp-image-360" width="388" height="196" srcset="https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango.png 322w, https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango-300x152.png 300w, https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango-320x163.png 320w" sizes="(max-width: 388px) 100vw, 388px" /></figure></div>



<h2 class="wp-block-heading">おわりに</h2>



<p>今回はDjangoとajaxを利用していいね!を行うことができる簡単なWebアプリを実装しました。このアプリではいいねを何度も押すことができましたが、ユーザやIPアドレスなどで判別して一度しか押せないようにしたり、いいね！したらcssなどで色を変えたりすればより実用的になると思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django-ajax/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Reactについて -Reactの基本と備忘録</title>
		<link>https://ryuusan.com/react/</link>
					<comments>https://ryuusan.com/react/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Tue, 06 Oct 2020 04:11:13 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=329</guid>

					<description><![CDATA[はじめに 今までDjangoアプリを開発するときは基本的に生のjavascriptかjQueryを使っていたのですが、どうやら少し前から脱jQueryが叫ばれているようですし、実現したい機能を実装する際に便利そうだったの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p>今までDjangoアプリを開発するときは基本的に生のjavascriptかjQueryを使っていたのですが、どうやら少し前から脱jQueryが叫ばれているようですし、実現したい機能を実装する際に便利そうだったのでReactを学習することにしました。</p>



<p>間違っていたら教えてください。(小声)</p>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="267" height="189" src="https://ryuusan.com/wp-content/uploads/2020/10/React.png" alt="" class="wp-image-330"/></figure></div>



<h2 class="wp-block-heading">Reactについて</h2>



<h3 class="wp-block-heading">Reactの特徴</h3>



<p>Reactはユーザインタフェースを構築するためのJavaScriptライブラリです。Reactの特徴は以下の3点です。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>宣言的なView</strong></p>
</div>



<p>Reactはデータの変更を検知し、関連するコンポーネントだけ効率的に更新・描画を行います。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>コンポーネントベース</strong></p>
</div>



<p><strong>Reactは<span class="marker-under">自分自身の状態を管理するカプセル化されたコンポーネントを作成します。</span></strong>コンポーネントはJavaScriptで書くことができるので、DOMに状態を持たせることなく様々なデータを扱うことができるようになります。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>どこでも使える</strong></p>
</div>



<p>Reactを使って新たな機能を実装する際に、既存のソースコードを書き換える必要はありません。また、Nodeを使ったサーバー上やモバイルアプリケーションの中でも動きます。</p>



<h3 class="wp-block-heading">React要素とは？</h3>



<p>React要素とは、下で説明している<strong>JSX</strong>などで構成されるJavaScriptのオブジェクトです。ブラウザのDOM要素とは異なり、低コストで生成することができます。<strong><span class="marker-under">React DOMがReact要素に合致するようにDOM要素を更新します。</span></strong></p>



<p>例えば、HTMLファイルに以下のように記述するとします。</p>



<pre class="wp-block-code"><code>&lt;div id="root">&lt;/div></code></pre>



<p>次にReactで以下のように記述していきます。この時HTMLファイルの中に記述したdivの中はReact DOMで管理されています。このdivのことを<strong>ルートDOMノード</strong>と呼びます。このルートDOMノードの数に制限はありませんが、Reactだけでアプリケーションを構成している場合は通常ひとつだけ持たせるようにします。</p>



<pre class="wp-block-code"><code>const element = &lt;h1>Hello World!&lt;/h1>
ReactDOM.render(element, document.getElementById('root'));</code></pre>



<p>このコードはページに<strong>Hello World!</strong>と見出しで表示します。</p>



<p>React要素はイミュータブルでなければなりません。一度要素を作成すると子要素や属性を変更することは出来ません。そこで、Reactを使ってUIを更新するためには新しい要素を作成してReact DOMに渡す必要があります。ただ、その方法は少し不便であるため、Reactには以下で紹介する<strong><span class="marker-under">ステート付きコンポーネント</span></strong>があり、より簡単にUIを更新することができます。</p>



<h3 class="wp-block-heading">コンポーネントとは？</h3>



<p>以下は簡単なコンポーネントです。&#8221;test&#8221;という文字を受け取り、描写しています。</p>



<p>returnの内部を見てください。HTMLのように書いていますが、これはJSXと呼ばれる構文です。このように、{ }で囲った部分にJavaScriptの式を入れることができます。(<strong>JSXの中ではfor文やif文などは使えません</strong>)</p>



<p class="codepen" data-height="342" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="KKMPpab" style="height: 342px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="KKMPpab">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/KKMPpab">
  KKMPpab</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p>このコードではExampleコンポーネントがデータを受け取り、描画しているだけですが、以下のように<strong><span class="marker-under">コンポーネント内部で状態(state)を保持することも出来ます。その状態が変化するとrender()が再実行され、</span><span class="marker-under">必要な箇所のみ</span><span class="marker-under">再描画されます。</span></strong></p>



<p>右側の入力欄に適当な文字を入力して、エンターやボタンで送信してみてください。入力した値が表示されるはずです。このコードでは、handleSubmit関数で送信された値をstateにセットしています。そうすることで状態が変化し、render()が再実行されて入力値が表示されているのです。</p>



<p class="codepen" data-height="576" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="dyXbVPG" style="height: 576px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="React Example(State)">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/dyXbVPG">
  React Example(State)</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p>handleChange関数を見てください。</p>



<pre class="wp-block-code"><code>this.setState({
  text: e.target.value,
})</code></pre>



<p>このように入力された値をstateのtextにセットし、そのtextをinputのvalueにすることで入力を反映させています。この関数が無ければ入力ができません。JSXの中でinputタグを使うときには注意してください。</p>



<p>次にhandleSubmit関数について説明します。この関数は入力値が送信された際に動作し、<strong>setState</strong>を行う関数ですが、最初に<strong>e.preventDefault();</strong>と記述されています。</p>



<p>入力値はReactで制御しているためサーバに送信する必要はないのですが、ReactではJavaScriptとは違い、<strong>false</strong>を返してもイベントを止めることができません。そこでpreventDefaultを呼び出し、submitイベントを止めています。</p>



<p>また、これらの関数を<strong>constructor</strong>内で以下のようにbindしていますが、JavaScriptの仕様上メソッドの末尾に()をつけずに参照するために必要なことです。</p>



<pre class="wp-block-code"><code>this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);</code></pre>



<p>この方法の他にクラスフィールド構文やアロー関数を使用する方法もありますが、個人的にはbindする方が好きです。(個人の感想です)</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>子要素の出力</strong></p>
</div>



<p>コンポーネントの中にはSidebarやDialogのように事前に子要素を知らないものもあります。このようなコンポーネントでは以下のように<strong><span class="marker-under">children</span></strong>という特別なpropsを使い、子要素を受け取って出力することができます。</p>



<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="WNxNYGP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="WNxNYGP">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/WNxNYGP">
  WNxNYGP</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>まとめ</strong></p>
</div>



<p>Reactは上の<strong>Example</strong>や<strong>MyName</strong>などの状態(state)を持つ<strong><span class="marker-under">クラスコンポーネント</span></strong>や、状態(state)を持たず、propsを受け取って描画するだけの<strong><span class="marker-under">関数コンポーネント</span></strong>を組み合わせることによってUIを構築します。</p>



<h3 class="wp-block-heading">仮想DOMについて</h3>



<p>仮想DOMとは、今までブラウザが持っていたDOMツリーをJavaScriptのオブジェクトとして仮想的に表現し、差分だけリアルDOMに反映させることでレンダリングコストを下げるという技術です。</p>



<p>ReactではReact DOMと呼ばれるライブラリを用いて実装されています。そのため、Reactは必要な箇所のみリアルDOMの更新を行う事ができます。</p>



<h2 class="wp-block-heading">JSXについて</h2>



<h3 class="wp-block-heading">JSXとは</h3>



<p>Exampleクラスコンポーネントのコードを見てください。コードの下の方に以下のように書いていると思います。</p>



<pre class="wp-block-code"><code>const text = "Hello World";
const element = &lt;h1>{text}&lt;/h1>

ReactDOM.render(
  element,
  document.getElementById('example2')
);</code></pre>



<p>この<strong>&lt;h1>{text}&lt;/h1></strong>が<strong>JSX</strong>と呼ばれる構文です。上でも軽く触れましたが、{}の中にはあらゆるJavaScriptの式を使用することができます。例えば、関数はもちろんJSXの外でfor文やif文を使って配列を作って、その配列を呼び出したり、計算したり、stateやpropsを参照したりと様々な用途があります。ただし、<span class="marker-under-red">JSXの<strong>中で</strong>for文やif文を使う場合はひと工夫必要です。</span></p>



<h3 class="wp-block-heading">JSXの中でループや条件分岐を行う方法</h3>



<p class="codepen" data-height="324" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="VwjZrMd" style="height: 324px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="VwjZrMd">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/VwjZrMd">
  VwjZrMd</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p>JSXでfor文やif文を使う方法の１つとして、上のように<span class="marker-under"><strong>即時関数を使う方法</strong></span>が挙げられます。JSXの内部で即時関数を作り、その中でforを回したり、if文で分岐させたりして結果をreturnで返却させます。</p>



<p>また、ループさせたい場合は即時関数を作る以外に<span class="marker-under"><strong>mapを使う方法</strong></span>もあります。例えば配列を既に持っていて、その中の値を順番に表示させたいときなどはmapを使うと便利です。</p>



<p>条件分岐させたい場合は、論理演算子を使う方法や三項演算子を使う方法もあります。</p>



<h3 class="wp-block-heading">keyについて</h3>



<p>このようにループなどでリストをレンダリングするときは、<strong>key</strong>を設定することが推奨されています。例えば、上のコードでは<strong>&lt;li key={i}&gt;{i}&lt;/li&gt;</strong>のように指定しています。keyにはその配列の中で<strong><span class="marker-under">ユニークな値</span></strong>をセットする必要があります。今回の場合は添字ですね。keyを利用することで、Reactはどの要素が変更されたのかを識別できるようになります。</p>



<p>keyは兄弟要素の中で一意であればよく、全体の中でユニークである必要はありません。そのため、今回の例は2つともkeyに同じ値を指定しています。</p>



<h3 class="wp-block-heading">JSXのその他の役割</h3>



<p>JSXはそれ自体もJavaScriptの式のため、if文やfor文の中で使ったり、変数に代入したり、関数から返したりすることができます。さらに、JSXにはインジェクション攻撃を防ぐという役割もあります。</p>



<h3 class="wp-block-heading">JSXを使う際の注意点</h3>



<p>最後にJSXを使うときの注意点です。<span class="marker-under">JSXはHTMLにとても似ていますが、実際はJavaScriptに近い構文です。</span>そのため、React DOMはHTMLの属性(例えば&#8221;class&#8221;など)ではなく、キャメルケースの命名規則(例えば&#8221;className&#8221;など)を使用しています。</p>



<p>ついつい&lt;div class=&#8221;hogehoge&#8221;&gt;と書いてしまうので、気をつけてください。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>まだ学習している最中なので、新たなことを学び次第追記していきます。もし間違えている個所や改善点などありましたら、<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>まで連絡いただければ幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/react/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nginxの設定ファイルまとめ</title>
		<link>https://ryuusan.com/nginxconf/</link>
					<comments>https://ryuusan.com/nginxconf/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Sun, 26 Jul 2020 13:09:08 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Nginx.conf]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=309</guid>

					<description><![CDATA[勉強中ですが学んだことをまとめていきます。 設定コンテキストについて Nginxの設定ファイルは、以下のようにいくつかのコンテキスト(要素)によって構成されます。 コンテキスト名 説明 コアコンテキスト Nginx自体が [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>勉強中ですが学んだことをまとめていきます。</p>



<h2 class="wp-block-heading">設定コンテキストについて</h2>



<p>Nginxの設定ファイルは、以下のようにいくつかのコンテキスト(要素)によって構成されます。</p>



<figure class="wp-block-table"><table><tbody><tr><td><span class="bold">コンテキスト名</span></td><td class="has-text-align-left" data-align="left"><span class="bold">説明</span></td></tr><tr><td>コアコンテキスト</td><td class="has-text-align-left" data-align="left">Nginx自体が使用するコンテキスト。触れる必要はなさそう。</td></tr><tr><td>メインコンテキスト</td><td class="has-text-align-left" data-align="left">コンテキストブロックに含まれない。基本レベルの設定を記述する。</td></tr><tr><td>イベントコンテキスト</td><td class="has-text-align-left" data-align="left">1つだけ定義できる。グローバルオプションを設定を記述する。</td></tr><tr><td>HTTPコンテキスト</td><td class="has-text-align-left" data-align="left">NginxをWebサーバやリバースプロキシとして利用する際に記述。</td></tr><tr><td>サーバコンテキスト</td><td class="has-text-align-left" data-align="left">HTTPコンテキストの子。仮想サーバを定義するために複数宣言も可能。</td></tr><tr><td>ロケーションコンテキスト</td><td class="has-text-align-left" data-align="left">URI内のパスに対しての設定を記述する。</td></tr></tbody></table><figcaption>表1. 各コンテキストの説明</figcaption></figure>



<p>このように、それぞれのコンテキストを正しく設定することでNginxが思い通りの処理をしてくれるようになります。</p>



<h2 class="wp-block-heading">リバースプロキシ</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-18px">リバースプロキシの設定をする</span></span></p>
</div>



<p>リバースプロキシサーバは、Webサーバと利用者の間に置かれ、それぞれの通信を中継するために使われます。今回の僕の目的は、このリバースプロキシサーバを用いてプライベートサーバ上のDockerで動いているアプリケーションを公開することです。</p>



<p>また、リバースプロキシを使うことでセキュリティ向上や負荷分散などが可能になり、メリットもとても大きいです。以下はリバースプロキシを使用するための設定ファイルです。 <span class="bold">/etc/nginx/conf.d</span>に以下のような設定ファイルを置きます。</p>



<pre class="wp-block-code"><code>server {
    listen 80;
    server_name "サーバ名";
    proxy_set_header Host $http_host;
    location /{
        proxy_pass "中継したいURL"
    }
}</code></pre>



<p>ちなみに、中継したいURLの最後にスラッシュをつけるかどうかで動作が変わってくるので注意してください。その後、Nginxを再起動させて変更した設定ファイルを読み込ませます。</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<p>最低限の設定ファイルはこのようになります。さらに、ここからSSL設定等を追記していきます。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-18px">ユーザのIPアドレスを記録するようにする</span></span></p>
</div>



<p>リバースプロキシを行う場合、Webサーバ側にはユーザからのアクセスが全てリバースプロキシからのアクセスとなってしまい、ユーザのIPアドレスなどを確認することができなくなってしまいます。そこで、以下のような設定を行うことでユーザの<span class="bold">痕跡</span>を残すことができるようにします。</p>



<pre class="wp-block-code"><code>server {
    listen 80 default_server;
    server_name "サーバ名";
    
    proxy_redirect   off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass "中継したいURL";
    }
}</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-18px">HTTPSにも対応させる</span></span></p>
</div>



<p>以下のように設定したファイルを<span class="bold">conf.d</span>ディレクトリ下に新しく置きます。</p>



<pre class="wp-block-code"><code>server {
    listen 443 ssl http2 default_server;
    server_name "サーバ名";

    ssl_certificate "/etc/letsencrypt/live/"Domain"/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/"Domain"/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;
    
    proxy_redirect   off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass "中継したいURL";
    }
}</code></pre>



<p>これでHTTPSにも対応ができました。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>websocketをリバースプロキシ</strong></p>
</div>



<p>websocketをリバースプロキシする際はlocationにwsを設定し、その中に以下のように記述しましょう。</p>



<pre class="wp-block-code"><code>location /ws/ {
	proxy_http_version 1.1; #デフォルトはHTTP 1.0
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_pass "中継したいURL"
}</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>アクセスされたURLに応じて振り分け</strong></p>
</div>



<p>例えば、<strong>https://aaa.com</strong>にアクセスされた場合はhttp://bbb.comに、<strong>https://aaa.com/hello/world</strong>にアクセスされた場合はhttp://ccc.com/hello/worldに振り分けたい場合もあるかもしれません。そんな時は以下のように設定しましょう。</p>



<pre class="wp-block-code"><code>location / {
    proxy_pass http://bbb.com/;
}

location /hello/ {
    proxy_pass http://ccc.com;
} </code></pre>



<h2 class="wp-block-heading">リバースプロキシの際、パスが通らなくなる問題</h2>



<p>例えば、<strong>http://hogehoge.com/subdir</strong>というURLにアクセスすることで、プライベートサーバーで稼働しているDjangoアプリ(<strong>http://123.45.678.90:9000</strong>)にリバースプロキシするように設定したとします。</p>



<p>この設定の場合、例えば<strong>http://hogehoge.com/subdir/toppage</strong>にアクセスした場合、Djangoアプリのトップページ(<strong>http://123.45.678.90:9000/toppage</strong>)にアクセスすることができます。</p>



<p>Djangoアプリの方ではトップページから<strong>http://123.45.678.90:9000/aaa</strong>にリンクを張っているのですが、リバースプロキシを行っているので、そのリンクが期待されるURLである<strong>http://hogehoge.com/subdir/aaa</strong>ではなく、<strong>http://hogehoge.com/aaa</strong>のようになってしまいます。これでは404エラーを吐いてしまい、正しいリンク先にアクセスできません。</p>



<p>そこで僕が行ったのは、Djangoアプリ側の設定を変更して以下のように常に<strong>subdir/</strong>を挿入するようにしたことでした。</p>



<pre class="wp-block-code"><code>urlpatterns = &#91;
    path('subdir/admin/', admin.site.urls),
    path('subdir/', include('hoge.urls')),
]</code></pre>



<p>DjangoのURL設定は階層構造のようになっているのでこのような手が取れましたが、本来であればWebサーバー等で解決すべき問題なのかもしれません。ちなみに、railsの場合はサブディレクトリにデプロイする用の設定ができるらしく、Djangoにも同様の設定がないか探しましたが見つけられませんでした。</p>



<p>Webアプリではなくホームページなど静的ファイルの場合は相対パスで行けると思います。</p>



<p>もしより良い方法を知っている方がいらっしゃいましたらtwitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)で教えてくださると助かります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/nginxconf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nginxとは</title>
		<link>https://ryuusan.com/introduce-nginx/</link>
					<comments>https://ryuusan.com/introduce-nginx/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Mon, 01 Jun 2020 05:35:10 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Nginx]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=294</guid>

					<description><![CDATA[こんにちは。リューさんです。この記事では、アウトプットの意も込めてWebサーバであるNginxについて紹介していきます。 Webサーバって？ Webサーバとは、Webシステム上で利用者(クライアント)から要求されたHTM [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。リューさんです。この記事では、アウトプットの意も込めてWebサーバであるNginxについて紹介していきます。</p>



<h2 class="wp-block-heading">Webサーバって？</h2>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/03/question.jpg" alt="" class="wp-image-181" srcset="https://ryuusan.com/wp-content/uploads/2020/03/question.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/03/question-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p>Webサーバとは、Webシステム上で利用者(クライアント)から要求されたHTMLファイルや画像ファイルなどのデータを、ネットワークを通じて送信するコンピュータやソフトウェアのことです。ちなみに、このやり取りの際に用いられる通信規約がHTTPやHTTPSであり、そのデータが格納されている場所の指定に用いられるのがURLやURLです。</p>



<p>そんなWebサーバとして有名なものが以下に紹介するNginxやApatcheです。</p>



<h2 class="wp-block-heading">Nginxとは</h2>



<figure class="wp-block-image alignwide size-large is-style-default"><img loading="lazy" decoding="async" width="352" height="72" src="https://ryuusan.com/wp-content/uploads/2020/06/nginx.png" alt="NGINXロゴ" class="wp-image-295" srcset="https://ryuusan.com/wp-content/uploads/2020/06/nginx.png 352w, https://ryuusan.com/wp-content/uploads/2020/06/nginx-300x61.png 300w" sizes="(max-width: 352px) 100vw, 352px" /></figure>



<p>Nginxは先ほども紹介した通り、有名なWebサーバのうちの1つです。<span class="marker-under">Nginxの強みとして、以下のような点が挙げられます。</span></p>


<div class="good-box common-icon-box">
<ol>
<li>基本的にApacheよりも処理が早く、負荷に強い</li>
<li>処理の違いにより、同時アクセスが多くても維持コストを安く抑えられる</li>
<li>リバースプロキシやロードバランサの機能がある</li>
</ol>
</div>


<p>まず、1つ目の特徴は2つ目や３つ目とも関係するので、飛ばして2つ目の特徴から見ていきましょう。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>リクエストが多くても維持コストを安く抑えられる</strong></span></p>
</div>



<p>そもそも、<span class="marker-blue">Nginxは1プロセスだけで複数のリクエストが処理できる(<strong>シングルスレッド</strong>)ように設計されていますが、Apacheは1プロセスにつき1つのリクエストしか処理できません(<strong>マルチプロセス</strong>)。</span>従って、同時アクセスが多くなってもプロセスが立ち上がる数を抑えることができ、メモリ使用量などを抑えることができるのです。</p>



<p>この特徴は特に、<span class="marker-under">利用した分だけ課金される<strong>クラウド</strong></span>などを利用している際に強みが発揮されます。Apacheよりもコストを大幅に少なくできるのではないでしょうか。</p>



<p>次に3つ目の特徴を見ていきましょう。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>リバースプロキシやロードバランサの機能がある</strong></span></p>
</div>



<p>こちらはそのままですね。Nginxには不特定多数のクライアントのアクセスに備えて設置される、特定のサーバへのリクエストが必ず通過するように設置されたプロキシサーバである<strong>リバースプロキシ</strong>や、負荷分散装置である<strong>ロードバランサ</strong>などの機能が備わっているため、負荷に非常に強くなります。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>基本的にApacheよりも処理が早く、負荷に強い</strong></span></p>
</div>



<p>上記のような特徴もあり、Nginxは基本的にApacheよりも処理が早く、同時アクセスなどの負荷にも強いWebサーバとなっているのです。</p>



<h2 class="wp-block-heading">Apacheの強み</h2>



<p>逆に、Apacheの強みはどのようなところなのでしょうか。以下にまとめました。</p>


<div class="good-box common-icon-box">
<ol>
<li>動画データの処理など、重い処理がNginxよりも得意</li>
<li>機能がモジュール化されているので、機能の追加が容易</li>
<li>Nginxより以前から長く使われており、信頼性が高い</li>
</ol>
</div>


<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>重い処理がNginxよりも得意</strong></span></p>
</div>



<p>マルチプロセスの場合、動画データの処理やデータベースの処理など、重い処理を行う場合であっても他のプロセスに影響を与えないため、重い処理を行う場合はシングルスレッドであるNginxよりもApacheの方が適しています。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>機能の追加が容易</strong></span></p>
</div>



<p>Apacheは、必要な機能だけを持つWebサーバを利用できるように、機能がモジュール化されています。必要な機能があればそのモジュールをインポートすることで使うことができ、一方で不必要な機能を排除することで、使用するリソースを削減することができます。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>信頼性</strong></span></p>
</div>



<p>ApacheはNginxよりも前に登場し、今でも使われ続けられているので、信頼性や安全性が高いと言えます。もちろん、Nginxも何年も使われ、シェアも伸び続けているので、信頼性の面からは同じくらい高いと言えるかもしれません。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>ApacheもNginxもどちらも優れたWebサーバであり、どちらにも得意な場面と苦手な場面があります。場面に合わせて使い分けてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/introduce-nginx/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DjangoのTips</title>
		<link>https://ryuusan.com/django-tips/</link>
					<comments>https://ryuusan.com/django-tips/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Mon, 01 Jun 2020 03:21:23 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=282</guid>

					<description><![CDATA[こんにちは。リューさんです。この記事では、Djangoを用いてWebアプリケーションを作成しているときに詰まったこと、困ったこととその解決方法を書いていきます。 ViewsのTips formが一つの場合、元居たページに [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。リューさんです。この記事では、Djangoを用いてWebアプリケーションを作成しているときに詰まったこと、困ったこととその解決方法を書いていきます。</p>



<h2 class="wp-block-heading">ViewsのTips</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">form入力後、もとのページにリダイレクトさせたい</span></span></p>
</div>



<p>formが一つの場合、元居たページにリダイレクトさせることは簡単です。しかし、複数ページで同じviewを使う場合、元居たページにリダイレクトさせるためには少し工夫が必要になります。</p>



<p>まず、templateに以下のように記述します。以下の例では、inputのvalueにURLを指定しています。</p>



<pre class="wp-block-code"><code>&lt;form action="{% url 'foo:bar' %}" method="post">
    {% csrf_token %}
    &lt;input type="hidden" name="next" value="{{ request.path }}"/>
    &lt;!--　適当なフォーム -->
    &lt;button class="btn btn-outline-primary" type="submit">send&lt;/button>
&lt;/form></code></pre>



<p>次に、viewでその値を受け取り、受け取ったURLにリダイレクトするようにします。views.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from django.http import HttpResponseRedirect
from django.shortcuts import redirect

def foo(request, foo_id):
    # 何らかの処理
    if request.method == "POST":
        next_url = request.POST.get('next', None)
        # 何らかの処理

    if next_url:
        return HttpResponseRedirect(next_url)
    else:
        return redirect('hoge:huga')   #値がうまく取れなかったときの処理</code></pre>



<p>これで上手くいくはずです。試してみてください。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size"><strong>Post送信後、入力した値をclearしたい</strong></p>
</div>



<p>掲示板アプリなど、Post後に同じページに戻るようなページをDjangoで作っているとき、Postした入力値がformに残っているときがありませんか？また、Post後にF5やリロードすると、再び入力値が入っているなんてことはありませんか？</p>



<p>そんな時は、以下のようにviewでformをsave後にHttpResponseRedirectで同じページにリダイレクトするようにしましょう。また、このようにする場合はformが正常に処理できているか、などもユーザに通知すると良いかもしれません。</p>



<pre class="wp-block-code"><code>if request.method == "POST":
    form = forms.TestForm(request.POST)
        if form.is_valid():
            test = form.save(commit=False)
            test.user = request.user
            test.save()
            return HttpResponseRedirect(request.path)</code></pre>



<h2 class="wp-block-heading">FormのTips</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>ラジオボタンをつけたい</strong></span></p>
</div>



<p>こちらは既に素晴らしい記事が多くあるのですが、自分用に書きます。</p>



<p>まず、今回は0,1…のような数字でvalueを管理したいと思っているので、models.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from django.db import models

class Hoge(models.Model):     
     hoge = models.IntegerField(default=0)</code></pre>



<p>次に、forms.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from . import models
from django import forms

hoge_choice = &#91;
    (0, 'hello'),
    (1, 'world'),
    (2, '!!!!!'),
]

class HogeForm(forms.ModelForm):
    hoge = forms.ChoiceField(
        widget=forms.RadioSelect,
        label='hoge',
        choices=hoge_choice,
    )

    class Meta:
        model = models.Hoge
        fields = ('hoge',)
        label = {
            'hoge': 'ほげ',
        }</code></pre>



<p>あとはviews.pyにこのHogeFormを渡して、以下のようにtemplateに記述すればラジオボタンが実装できるはずです。以下の例はbootstrap4を用いた例ですので、適宜修正してください。</p>



<pre class="wp-block-code"><code>{{ form.hoge.label_tag }}
&lt;div class="border-top border-bottom">
{% for radio in form.hoge %}
    &lt;div class="custom-control custom-radio pt-1 pb-1">
        {{ radio.tag }}
        &lt;label class="custom-control-label" for="{{ radio.id_for_label }}">
            {{ radio.choice_label }}
        &lt;/label>
    &lt;/div>
{% endfor %}
&lt;/div></code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-22px">フォームのタイプに合わせてデザインを変えたい</span></strong></p>
</div>



<p>templateファイルに以下のようにif文で分岐させるように記述することで実現できます。</p>



<pre class="wp-block-code"><code>{% for field in form %}
    {% if field.field.widget.input_type == "checkbox" %}
    	&lt;div class="form-check">
    	    {{ field.label_tag }}
            {{ field }}
            {{ field.errors }}
        &lt;/div>  
    {% else %}
    	&lt;div class="form-group">
    	    {{ field.label_tag }}
            {{ field }}
            {{ field.errors }}
        &lt;/div>
    {% endif %}
{% endfor %}</code></pre>



<p>ただ、Bootstrapを使う場合、Djangoはulタグで囲まれたformを返してくるのでいい感じにすることができません。そのような場合はカスタムウイジェットを作ることで対応できます。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-22px">フォームのウィジェットを変更したい</span></strong></p>
</div>



<p>forms.py に以下のように記述します。以下の例は__init__で変更していますが、Metaやviewで変更する方法もあります。</p>



<pre class="wp-block-code"><code>class Meta:
    model = models.Hoge
    fields = ('hoge', 'huga')

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields&#91;'hoge'].widget = forms.CheckboxSelectMultiple()
    self.fields&#91;'hoge'].queryset = self.fields&#91;'hoge'].queryset.filter(hoge__gte=2)</code></pre>



<h2 class="wp-block-heading">ModelのTips</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>カスタムユーザモデルを作成する</strong></span></p>
</div>



<p>Djangoの場合ベースのユーザモデルのままだと、開発している途中で「ユーザモデルに年齢や役職を持たせたい！」と思っても、データベースを初期化したり、マイグレーションをごにょごにょしたりしなければ変更できなかったりします。</p>



<p>そこで、カスタムユーザモデルの出番です。今回はより簡単な<strong>AbstractUser</strong>を継承して作成しましょう。models.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>class CustomUser(AbstractUser):
    UserAuth = &#91;
        (0, 'student'),
        (1, 'TA'),
        (2, 'teacher'),
    ]
    user_auth = models.IntegerField(verbose_name='権限', default=0, choices=UserAuth)</code></pre>



<p>今回は上のようにカスタムユーザモデルに権限のフィールドを追加しました。このように一度カスタムユーザモデルを追加しておけば、以降はそのモデルに追記していけばいいので、必ず作成しておきましょう。</p>



<p>また、追記していくタイプの<strong>AbstractUser</strong>だけではなく、最初から設定されている属性の削除や変更等も行うことができる<strong>AbstractBaseUser</strong>を継承してカスタムユーザモデルを作成することも出来ます。ご自身が作成したいアプリに合わせて利用しましょう。</p>



<h2 class="wp-block-heading">TemplateのTips</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-22px"><strong>submitボタンが押せないとき</strong></span></p>
</div>



<p>ブラウザで検証してみましょう。</p>



<p><span class="bold"><span class="fz-18px">An invalid form control with name=&#8217;hoge&#8217; is not focusable.</span></span></p>



<p>というエラーが出ていませんか？この場合、おそらくformの部品に　<strong><span class="fz-16px">display:none;</span></strong>　というcssが指定されていると思います。display:none;の代わりに、以下のコードを追加しましょう。</p>



<pre class="wp-block-code javascript"><code>var icon_css = {
            visibility:'hidden',
            width:'0',
            height:'0',
        }
$('div.form-group input&#91;name="hoge"]').css(icon_css);</code></pre>



<p>この場合は、jqueryを用いてcssを追加していますが、方法は何でも良いです。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>この記事は公開した後もTipsを学び次第更新していきます。もし、間違えている箇所等ありましたらTwitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)までお願いします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django-tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Djangoで簡単な「文字カウントメモ」を作ってみる</title>
		<link>https://ryuusan.com/django3/</link>
					<comments>https://ryuusan.com/django3/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Sat, 16 May 2020 05:52:48 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=254</guid>

					<description><![CDATA[こんにちは。リューさん(@Ryu_programs)です。この記事では以下のような人に向けてDjangoで簡単なWebアプリを作成していきます。 Djangoの学習をしたいけど、何から始めれば良いのか分からない Pyth [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。この記事では以下のような人に向けてDjangoで簡単なWebアプリを作成していきます。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ul>
<li>Djangoの学習をしたいけど、何から始めれば良いのか分からない</li>
<li>Pythonを使って何か作ってみたい</li>
<li>プログラミングについて興味がある</li>
</ul>
</div>


<p>また、この記事は以前の記事の続きです。まだ読んでいない場合は、是非読んでみてください。</p>



<a href="https://ryuusan.com/django1/" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>


<p>Dockerを用いて環境構築する場合はこの記事がお勧めです。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>


<h2 class="wp-block-heading">アプリケーションを作成する</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">countmemoアプリケーションを作成する</span></span></p>
</div>



<p>まず、manage.pyと同じディレクトリ上で以下のコマンドを実行し、<span class="bold">countmemo</span>アプリケーションを作成しましょう。</p>



<pre class="wp-block-code"><code>$ python3 manage.py startapp countmemo</code></pre>



<p>このコードはDockerを利用している場合、以下のようなコードになります。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py startapp countmemo</code></pre>



<p>上のコードを実行すると、<span class="bold">countmemo</span>ディレクトリが作成され、その中に<span class="bold">models.py</span>や<span class="bold">views.py</span>が入っているはずです。以下は<a href="https://paiza.cloud/ja/">PaizaCloud</a>のスクリーンショットなので、表示形式は少し違うかもしれませんが、このようなファイル構成になっていれば問題ありません。<span class="bold">example</span>はプロジェクト名です。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="211" height="332" src="https://ryuusan.com/wp-content/uploads/2020/05/file.jpg" alt="" class="wp-image-257" srcset="https://ryuusan.com/wp-content/uploads/2020/05/file.jpg 211w, https://ryuusan.com/wp-content/uploads/2020/05/file-191x300.jpg 191w" sizes="(max-width: 211px) 100vw, 211px" /></figure></div>



<h2 class="wp-block-heading"><strong>settings.pyを変更する</strong></h2>



<p>その後、<span class="bold">settings.py</span>に新しいアプリを作成したことを教えてあげましょう。<span class="marker">settings.py内のINSTALLED_APPS</span>に以下のように&#8217;countmemo.apps.CountmemoConfig&#8217;を記述します。</p>



<pre class="wp-block-code python"><code>INSTALLED_APPS = &#91;
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'countmemo.apps.CountmemoConfig',
]</code></pre>



<h2 class="wp-block-heading">モデルを変更する</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">models.pyを変更する</span></span></p>
</div>



<p>次に、<span class="marker">countmemoフォルダ内のmodels.py</span>を書き換えていきます。このmodels.pyを元にDjangoがデータベースを操作してくれるので、非常に大事なファイルです。今回は以下のように記述していきます。</p>



<pre class="wp-block-code python"><code>from django.db import models
from django.utils import timezone

# Create your models here.
class MemoModel(models.Model):
    memo_text = models.CharField(max_length=200)
    up_date = models.DateTimeField(default=timezone.now)
    length = models.IntegerField(default=0)

    def __str__(self):
        return self.memo_text</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">マイグレーションを行う</span></span></p>
</div>



<p>models.pyに追記したらマイグレーションを実行しましょう。こうすることでDBに変更を加えます。<span class="bold">models.py</span>を変更した場合は必ず行っておけば間違いありません。</p>



<p>manage.pyと同階層で以下のコマンドを実行します。</p>



<pre class="wp-block-code"><code>$ python3 manage.py make migrations
$ python3 manage.py migrate</code></pre>



<p>Dockerの場合は、以下のようなコマンドになります。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py make migrations
$ docker-compose run web ./manage.py migrate</code></pre>



<h2 class="wp-block-heading">views.pyを確認用に変更する</h2>



<p>countmemoフォルダ内の<span class="bold">views.py</span>を以下のように変更しましょう。</p>



<pre class="wp-block-code python"><code>from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world!!!!!")</code></pre>



<p><span class="marker-under">views.pyは簡単に言えば<span class="bold">アプリの処理に関する役割</span>を担います。</span>今回は確認のために、<span class="bold">Hello, world!!!!!と表示する</span>ように記述しています。</p>



<h2 class="wp-block-heading">URL関連の設定を行う</h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">countmemoアプリ内にurls.pyを作成する</span></span></p>
</div>



<p><span class="bold">views.py</span>を変更したら、次は<span class="bold">urls.py</span>を変更してアクセスできるようにしましょう。まず、<span class="bold">countmemo</span>フォルダ内に<span class="bold">urls.py</span>というファイルを作成し、以下のように記述します。</p>



<p>また、<span class="bold">app_name</span>を記述することで、アプリが大量になったときにviews.pyやテンプレートファイルからアクセスしやすくなります。記述しておきましょう。</p>



<pre class="wp-block-code python"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.index, name='index'),
]</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="bold"><span class="fz-22px">プロジェクト内のurls.pyを変更する</span></span></p>
</div>



<p>僕の場合は、<span class="bold">example</span>というプロジェクト名なので、<span class="marker">exampleフォルダの中のurls.py</span>を変更していきます。こうすることで、countmemoアプリ内のurls.pyを読み込むようになります。</p>



<pre class="wp-block-code python"><code>from django.contrib import admin
from django.urls import path,include

urlpatterns = &#91;
    path('admin/', admin.site.urls),
    path('', include('countmemo.urls')),
]</code></pre>



<h2 class="wp-block-heading">アプリにアクセスする</h2>



<p>runserverコマンドを実行しましょう。</p>



<p>Dockerの場合は以下の、以前の記事で説明したURLに、それ以外の環境を使っている場合は環境構築時にDjangoのロケットが表示されていたURLにアクセスしてみてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>


<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/05/hello-world-1024x586.jpg" alt="" class="wp-image-261" width="569" height="325" srcset="https://ryuusan.com/wp-content/uploads/2020/05/hello-world-1024x586.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-300x172.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-768x439.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world.jpg 1135w" sizes="(max-width: 569px) 100vw, 569px" /></figure></div>



<p>トリミングしているため分かりづらいですが、上記のようにHello, world!!!!!と表示されていれば成功です。次のステップへと進みましょう。</p>



<h2 class="wp-block-heading">base.htmlを作成する</h2>



<p>次に、base.htmlを作成します。まず、countmemoフォルダの中にtemplatesフォルダを作成し、さらにそのtemplatesフォルダの中にcountmemoフォルダを作成しましょう。</p>



<p>そして、countmemoフォルダの中にbase.htmlを作成します。</p>



<p>現在、<span class="bold">countmemo &gt; templates &gt; countmemo &gt; base.html</span>のようになっているはずです。そうであればbase.htmlに以下のように追記していきます。今回はbootstrap4を使うので、そちらもbase.htmlで読み込んでいきます。</p>



<pre class="wp-block-code"><code>&lt;!doctype html>
&lt;html lang="ja">
    &lt;head>
        &lt;title>{% block title %}{% endblock %}&lt;/title>
        &lt;!-- Required meta tags -->
        &lt;meta charset="utf-8">
        &lt;meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        &lt;!-- Bootstrap CSS -->
        &lt;link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    &lt;/head>
    &lt;body>
        {% block content %}
        {% endblock %}

        &lt;script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous">&lt;/script>
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous">&lt;/script>
        &lt;script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous">&lt;/script>
        {% block extrajs %}
        {% endblock %}
    &lt;/body>
&lt;/html></code></pre>



<p>base.htmlは他のhtmlファイルのひな型のようなものです。用いることで大幅にコードを減らすことができます。</p>



<h2 class="wp-block-heading">一覧表示テンプレートを作成する</h2>



<p><span class="marker-under">countmemoフォルダ内のviews.pyを以下のように変更します。</span>generic.ListViewはデータ一覧を表示したい時に使うと便利です。テンプレートファイルには、object_listという名前でデータが渡されます。</p>



<pre class="wp-block-code"><code>from django.shortcuts import render
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
　　template_name = 'countmemo/memolist.html'</code></pre>



<p>views.pyを変更したので、同じく<span class="marker-under">countmemoフォルダ内のurls.pyを以下のように変更します。</span>classベースのviewを使った場合は、以下のようにas_view()をつけるようにしましょう。</p>



<pre class="wp-block-code"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.MemoListView.as_view(), name='index'),
]</code></pre>



<p>MemoListViewのための<span class="marker-under">memolist.htmlを、templateフォルダ内のcountmemoフォルダ内に作成します。</span>object_listで渡されたデータをfor文を用いて順に取り出し、テーブルの形にまとめています。</p>



<pre class="wp-block-code"><code>{% extends 'countmemo/base.html' %}

{% block title %} memolist {% endblock %}

{% block content %}
    &lt;table class="table">
        &lt;thead>
            &lt;tr>
                &lt;th>#&lt;/th>
                &lt;th>テキスト&lt;/th>
                &lt;th>文字長&lt;/th>
                &lt;th>作成日&lt;/th>
            &lt;/tr>    
        &lt;/thead>
        &lt;tbody>
            {% for data in object_list %}
                &lt;tr>
                    &lt;th>{{ data.id }}&lt;/th>
                    &lt;th>{{ data.memo_text }}&lt;/th>
                    &lt;th>{{ data.length }}&lt;/th>
                    &lt;th>{{ data.up_date }}&lt;/th>
                &lt;/tr>
            {% endfor %}
        &lt;/tbody>
    &lt;/table>
{% endblock %}</code></pre>



<p>ここまで完了したら、以下のコマンドでサーバーを動かしましょう。</p>



<pre class="wp-block-code"><code>$ python3 manage.py runserver</code></pre>



<p>Dockerの場合は次のようなコマンドになります。ただ、Dockerの場合はdocker-compose up -dで既にrunserverを実行していると思うので、必要ないかもしれません。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py runserver</code></pre>



<p>先ほどのURLにアクセスし、以下のようになっていれば成功です。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="437" src="https://ryuusan.com/wp-content/uploads/2020/05/table-example-1024x437.jpg" alt="" class="wp-image-267" srcset="https://ryuusan.com/wp-content/uploads/2020/05/table-example-1024x437.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-300x128.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-768x327.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-1536x655.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/table-example.jpg 1658w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">データを追加できるようにする</h2>



<p>まず、<span class="marker-under">views.pyに次のように記述します</span>。</p>



<pre class="wp-block-code python"><code>from django.shortcuts import render, redirect
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
    template_name = 'countmemo/memolist.html'
    

class CreateMemo(generic.CreateView):
    model = MemoModel
    fields = &#91;'memo_text',]
    template_name = 'countmemo/memoadd.html'
    
    def form_valid(self, form):
        memo = form.save(commit=False)
        memo.length = len(memo.memo_text)
        memo.save()
        return redirect('countmemo:index')</code></pre>



<p>変更点はCreateMemo以下です。この場合、models.pyで指定したmemo_textのみを入力し、lengthに入力された値の文字列長を格納するようにしています。</p>



<p>form_validは入力された文字列が要件を満たすときに呼び出されます。</p>



<p>次に、<span class="marker-under">アプリの方のurls.pyを以下のように変更します。</span></p>



<pre class="wp-block-code python"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.MemoListView.as_view(), name='index'),
    path('add/', views.CreateMemo.as_view(), name='add'),
]</code></pre>



<p>こちらも、変更点はview.CreateMemo.as_view()の部分だけです。</p>



<p><span class="marker-under">以前作成したmemolist.htmlにデータ追加ページに遷移するためのボタンを設置します。</span>追記する場所はどこでもいいです。僕はテーブルの下のところに設置しました。</p>



<pre class="wp-block-code"><code>&lt;a class="btn btn-primary d-block d-md-inline-block mb-2 mb-md-0" 
href="{% url 'countmemo:add' %}" role="button">追加&lt;/a></code></pre>



<p><span class="marker-under">その後、memoadd.htmlをmemolist.htmlやbase.htmlと同じフォルダに作成し、以下のように記述します。</span></p>



<pre class="wp-block-code"><code>{% extends 'countmemo/base.html' %}

{% block title %} memoadd {% endblock %}

{% block content %}
    &lt;form method="post">
    {% csrf_token %}

    {{ form }}
    &lt;button class="btn btn-primary" type="submit">save&lt;/button>
    &lt;/form>
{% endblock %}</code></pre>



<p>bootstrapを適用させるにはformの内容をひとつづつ記述し、classを追加するか、javascriptやforms.py等で自動的に追加するかなどの作業が必要なのですが、今回は省きます。また、それらの記事も書くかもしれません。</p>



<p>ここまで終わったら、runserverコマンドを実行してWebアプリを動かしてみましょう。先ほどの画面に追加ボタンが現れているはずです。そのボタンをクリックしてください。以下の写真のようになっていれば成功です。</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="515" src="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1024x515.jpg" alt="" class="wp-image-271" srcset="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1024x515.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-300x151.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-768x386.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1536x773.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add.jpg 1578w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>上手く動いていたら適当に入力してみてください。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="486" src="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1024x486.jpg" alt="" class="wp-image-273" srcset="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1024x486.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-300x142.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-768x365.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1536x729.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1.jpg 1599w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>このように、うまくカウントできていれば成功です。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>どうでしたか？Djangoを使えば、慣れてしまえば簡単なアプリをこのように30分程度で作れてしまいます。もちろん、今回のアプリはデザインも機能も優れているとは言い難いですが、Djangoのすごさを少しでも分かってもらえたのではないでしょうか。</p>



<p>もし、「ここが分からない」「分かりづらい」などありましたら、Twitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)までよろしくお願いします。</p>



<p>また、今回利用したPythonの学習方法などもブログに書いています。よろしければ読んでみてください。</p>



<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Django学習　～環境構築編～</title>
		<link>https://ryuusan.com/django2/</link>
					<comments>https://ryuusan.com/django2/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Tue, 07 Apr 2020 08:55:07 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=237</guid>

					<description><![CDATA[こんにちは。はじめまして。リューさん(@ryu_programs)です。この記事では以下のような人に向けて、Dockerを利用したDjangoの開発環境構築について説明していきます。 Djangoの学習をしたいけど、どう [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。はじめまして。リューさん(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)です。この記事では以下のような人に向けて、Dockerを利用したDjangoの開発環境構築について説明していきます。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ol>
<li>Djangoの学習をしたいけど、どうすればいいのか分からない</li>
<li>Djangoの環境構築につまづいている</li>
<li>紹介編を見て、Djangoを学習しようと思った</li>
</ol>
</div>


<p>また、Djangoの紹介記事やPythonの勉強方法も書いています。もしまだ読んでいない方がいれば、読んでみてください。</p>



<a href="https://ryuusan.com/django1/" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>

<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<p>また、続編であるWebアプリ作成編も公開しました。良ければ読んでみてください。リンクは最後の方にも載せておきます。</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<h2 class="wp-block-heading">なぜDockerを選んだか</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="400" height="331" src="https://ryuusan.com/wp-content/uploads/2020/04/docker.jpg" alt="" class="wp-image-238" srcset="https://ryuusan.com/wp-content/uploads/2020/04/docker.jpg 400w, https://ryuusan.com/wp-content/uploads/2020/04/docker-300x248.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></figure></div>



<p>まず、Pythonという言語はモジュールをimportすることによって、機械学習やWebクローリング、Django開発など様々なことを行うことができます。また、所謂本家PythonであるPython3だけではなく、科学計算に強いAnacondaや、もしかするとやむにやまれぬ事情があってPython2をいまだに使われている人もいるかもしれません。</p>



<p>こう聞くとPythonを使ってそのまま開発していたら、ライブラリの数や環境がめちゃくちゃなことになると思いませんか？そこで登場するのが仮想マシンやDockerです。仮想マシンとDockerも仕組みが違うのですが、今回は単に僕の好きなツールであり、軽量かつ高速であるDockerを採用しました。</p>



<h2 class="wp-block-heading">最初にすべきこと</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/04/pc-1.jpg" alt="" class="wp-image-240" srcset="https://ryuusan.com/wp-content/uploads/2020/04/pc-1.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/04/pc-1-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p>まず、こちらの公式ドキュメント(<a href="https://docs.docker.com/toolbox/toolbox_install_windows/">https://docs.docker.com/toolbox/toolbox_install_windows/</a>)を参考にしながら、Docker Toolboxをインストールしましょう。ちなみに、僕はWindows10 homeだったのでDocker Toolboxをインストールしたのですが、Macの場合は<a href="https://hub.docker.com/editions/community/docker-ce-desktop-mac">Docker for Mac</a>であったり、Windows10 Proであれば<a href="https://hub.docker.com/editions/community/docker-ce-desktop-windows">Docker for Windows</a>があるので、ご使用のPCによって変えましょう。</p>



<p>また、Docker Toolboxの場合はVirtualBoxを一度アンインストールしてからインストールすると良いかもしれません。Docker Toolboxをインストールすると勝手にVirtualBoxまで付いてくるので、既に存在しているとエラーが出る可能性があります。僕がインストールした時にはそこでエラーが出て躓きました。</p>



<p>詳しいインストール方法を紹介している記事はすでにたくさんありますし、OSによってもインストール方法が違う可能性があるのでこの記事では省略します。Docker Toolboxのインストールの際、参考になった記事を紹介しておきます。</p>



<a rel="noopener" href="https://qiita.com/KIYS/items/8ac37f6757a6b7f84569" title="Windows環境にDocker Toolboxをインストールする - Qiita" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fqiita.com%2FKIYS%2Fitems%2F8ac37f6757a6b7f84569?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Windows環境にDocker Toolboxをインストールする - Qiita</div><div class="blogcard-snippet external-blogcard-snippet">はじめに Docker、非常に便利ですね。Dockerを使用すればローカル環境を汚すことなく、様々なアプリケーションを実行できたりしてしまいます。Dockerに関する記事はネット上に豊富にありますが、いかんせん界隈の技術の進歩も早くすぐに情...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://qiita.com/KIYS/items/8ac37f6757a6b7f84569" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">qiita.com</div></div></div></div></a>


<h2 class="wp-block-heading">Djangoの環境構築</h2>



<p>Dockerのインストールが終わると、次にDjangoの開発環境を整えていきます。この際、もしPycharmやVScodeなどのエディタをインストールしていない場合、しておくことをお勧めします。ちなみに僕はPythonを使うならPycharmが好きです。</p>



<a rel="noopener" href="https://www.jetbrains.com/ja-jp/pycharm/" title=" PyCharm - 唯一の必携 Python IDE " class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/cocoon-resources/blog-card-cache/31f0610a3d1cfde6a8b72227bbdd0107.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title"> PyCharm - 唯一の必携 Python IDE </div><div class="blogcard-snippet external-blogcard-snippet">ウェブ、データ、および AI/ML のプロ開発者向けに構築。 AI による IDE エクスペリエンスで強化されています。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.jetbrains.com/ja-jp/pycharm/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.jetbrains.com</div></div></div></div></a>


<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">1.</span><span class="fz-28px">作業ディレクトリの作成</span></strong></p>
</div>



<p>Djangoプロジェクトが格納されるディレクトリを適当な場所に作成します。ただし、この時は作成するだけでそのディレクトリは空にしておきましょう。そして、Docker Toolboxを起動し、cdコマンドでそのディレクトリに移動します。</p>



<p>この後いくつかのファイルを作成しますが、僕はviコマンドを利用して作成しました。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">2.Dockerfileの作成</span></strong></p>
</div>



<p>次に、Dockerfileをそのディレクトリの中に作成します。Dockerfileは、そこに記述された内容に基づいてDockerイメージを作成します。Dockerfileについて、より詳しく知りたい方は以下の記事を読んでみてください。</p>



<a rel="noopener" href="https://knowledge.sakura.ad.jp/15253/" title="Docker入門（第四回）～Dockerfileについて～  |  さくらのナレッジ" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/cocoon-resources/blog-card-cache/1eceebfd6f1eae9fb4b080a64b8a4b36.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Docker入門（第四回）～Dockerfileについて～  |  さくらのナレッジ</div><div class="blogcard-snippet external-blogcard-snippet">こんにちは、Acroquest Technologyの横山です。 4/19(木)にKubernetesやDockerを中心としたコンテナ活用の現状をひとまとめにした開発者のためのイベントである「Japan Contain</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://knowledge.sakura.ad.jp/15253/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">knowledge.sakura.ad.jp</div></div></div></div></a>


<p>Dockefileには以下のように記述します。</p>



<pre class="wp-block-code"><code>From python:3.7
ENV PYTHONBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code</code></pre>



<p>例えば、</p>



<pre class="wp-block-code"><code>RUN mkdir /code</code></pre>



<p>というコードは、codeディレクトリをmkdirコマンドで作成しています。このようにRUNやADDなどのコマンドと、それに対応する命令を記述しています。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-28px"><strong>3.requirements.txtの</strong></span><span class="fz-28px"><strong>作成</strong></span></p>
</div>



<p>次に、requirements.txtを記述していきます。requirements.txtは、pipを使って指定のパッケージを指定のバージョンでインストールできる設定ファイルです。先ほど作成したディレクトリに、Dockerfileと同様にrequirement.txtを作成して以下のように記述します。</p>



<pre class="wp-block-code"><code>Django
psycopg2</code></pre>



<p>これは、Djangoとpsycopg2をインストールするという意味です。psycopg2の後に改行しないように気をつけてください。また、これは注意点なのですが、このrequirement.txtやdockerfileを更新した場合には、以下のように実行しなければ反映されません。</p>



<pre class="wp-block-code"><code>$ docker-compose up --build -d</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><span class="fz-28px"><strong>4.docker-compose.ymlの作成</strong></span></p>
</div>



<p>こちらも先ほどと同じく、作成したディレクトリにdocker-compose.ymlというファイルを作成して記述していきます。このファイルを作成することで、管理が非常に楽になります。内容は以下の通りです。8000ポートでアクセスできるようにしています。</p>



<pre class="wp-block-code"><code>
version: '3'

services:
  db:
    image: postgres
    volumes:
      - poll_db_data:/var/lib/postgresql/data:Z
    ports:
      - "5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mypassword
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  poll_db_data:
    external: true
</code></pre>



<p>Dockerはコンテナを削除してしまうと、データベースの内容もすべて消えてしまうので、&#8221;poll_db_data&#8221;というvolumeを作成し、このようにZオプションをつけたり、external: trueを指定したりしています。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">5.プロジェクトの作成</span></strong></p>
</div>



<pre class="wp-block-code"><code>$ docker-compose run web django-admin.py startproject &#91;プロジェクト名] .</code></pre>



<p>このようなコマンドを実行することで、manage.pyの他プロジェクトディレクトリが作成されます。プロジェクト名は基本何でも良いです。また、docker-composeコマンドはdocker-compose.ymlが存在するディレクトリの中で実行してください。</p>



<p>次に、作成されたプロジェクトディレクトリの中のsettings.pyを開き、DATABASE=・・・のところを以下のように記述します。USERやPASSWORDは適当です。好きなものを使ってください。</p>



<pre class="wp-block-code"><code>DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'mypassword',
        'HOST': 'db',
        'PORT': 5432,
    }
}</code></pre>



<p>また、同じくsetting.pyのALLOWED_HOSTの部分を以下のように変更します。</p>



<pre class="wp-block-code"><code>ALLOWED_HOSTS = &#91;"*"]</code></pre>



<p>その後、以下のコマンドでDBのマイグレーションを行います。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py makemigrations
$ docker-compose run web ./manage.py migrate</code></pre>



<p>さらに、スーパーユーザーも作成してしまいます。以下のコマンドを実行すると、ユーザ名やメールアドレス、パスワード等の入力を求められると思うので、入力してください。Djangoの管理ページにアクセスするために必要です。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py createsuperuser</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">6.コンテナの作成・起動</span></strong></p>
</div>



<pre class="wp-block-code"><code>$ docker-compose up -d</code></pre>



<p>このコマンドを実行してコンテナを作成・起動しましょう。-dオプションをつけることで、コンテナ起動後もコマンドを実行できます。</p>



<p>そして、次のコマンドでdefaultマシンに割り振られたipアドレスを取得します。僕の場合はdefaultマシンをそのまま使っていますが、別のマシンを使っている方はそのマシンについて調べてください。何もしていなければdefaultマシンを使っているはずです。</p>



<pre class="wp-block-code"><code>$ docker-machine ip default</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">7.アクセス</span></strong></p>
</div>



<p>chrome等で、http://[<strong>6で調べたIPアドレス</strong>]:8000でアクセスしてみてください。(例：http://0.0.0.0:8000)この8000はdocker-compose.ymlで指定した値です。</p>



<p>以下のような画面になれば正しく環境構築ができています。正確には、右上のDjangoは3.0などになっているはずです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="802" height="616" src="https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page.png" alt="" class="wp-image-248" srcset="https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page.png 802w, https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page-300x230.png 300w, https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page-768x590.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></figure>



<h2 class="wp-block-heading">おわりに</h2>



<p>以上で環境構築編は終わりです。開発編に続きます。Pythonの勉強方法やDjangoの紹介、基本情報技術者試験の勉強方法なども分かりやすく書いているので、良ければ読んでみてください。</p>



<a href="https://ryuusan.com/python-study" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>

<a href="https://ryuusan.com/django1" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>

<a href="https://ryuusan.com/ipa-study" title="基本情報技術者試験に合格できた勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/goukaku-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/goukaku-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/goukaku-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/goukaku-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">基本情報技術者試験に合格できた勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">基本情報技術者試験はエンジニアとしての基礎的な知識が問われる試験で、勉強すべき範囲が非常に広く、100時間程度の勉強が必要と言われています。その基本情報技術者試験をこれから受けようと思っている人に向けて、僕が勉強してきたことを紹介します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.02</div></div></div></div></a>


<p>開発編も公開しました！</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p>また、よろしければ僕のTwitter(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)のフォロー等もお願いします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Django学習 ~Django紹介編~</title>
		<link>https://ryuusan.com/django1/</link>
					<comments>https://ryuusan.com/django1/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Mon, 06 Apr 2020 06:10:41 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=214</guid>

					<description><![CDATA[こんにちは、はじめまして。リューさん(@Ryu_programs)です。この記事ではPythonのWebアプリケーションフレームワークであるDjangoについて、以下のような人のために紹介していきます。 Pythonを学 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、はじめまして。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。この記事ではPythonのWebアプリケーションフレームワークである<strong>Django</strong>について、以下のような人のために紹介していきます。</p>


<div class="blank-box bb-tab bb-check bb-blue">
<ol>
<li>Pythonを学習しているけど、Pythonで何ができるのか分からない</li>
<li>Pythonを使って就活にも役立つ成果物を作ってみたい</li>
<li>プログラミングに興味あるけど、何から始めればいいのか分からない</li>
</ol>
</div>


<p>なお、この記事は「環境構築編」や「簡単なアプリケーション作成編」などに続いていく予定です。ぜひこの記事を読み、Djangoについて軽く理解しておいてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>

<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p>また、Pythonの勉強方法については以下の記事で紹介しています。Pythonは基本的なことに関しては覚えやすく、コードも書きやすいので、「プログラミングを学習したい！」と思っている人にはお勧めの言語です。</p>



<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<h2 class="wp-block-heading">Webフレームワークとは</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="386" src="https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails.png" alt="ruby on rails logo" class="wp-image-227" srcset="https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails.png 1024w, https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails-300x113.png 300w, https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails-768x290.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>先ほども書きましたが、DjangoとはPythonのWebフレームワークです。そもそもWebフレームワークとは、<span class="marker-under">便利な機能が用意されており、利用することでWebアプリケーションを簡単に短期間で作成できるようにする</span>といったものです。</p>



<p>WebフレームワークにはDjangoのほか、多くの種類があります。この記事ではその中でも有名でよく使われているWebフレームワークを簡単に紹介します。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">1.Laravel</span></strong></p>
</div>



<p>Laravelは<strong>PHP</strong>という言語のフレームワークです。そもそも、PHPという言語自体がWeb開発に多く使われていたこともあり、LaravelやPHPのもう一つのフレームワークであるCakePHPは非常に人気のWebフレームワークです。</p>



<p>ちなみに、PHPがWeb開発に多く使われると書きましたが、それはPHPが動的にWebページを生成できる、サーバサイドのスクリプト言語であるからです。PHPはWordPressなどにも使われていますね。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-24px"><span class="fz-28px">2.Ruby on rails</span></span></strong></p>
</div>



<p>Ruby on railsは<strong>Ruby</strong>という言語のフレームワークです。僕が大学1年生の夏に初めて学習した言語がRubyでした。プログラミングの基礎知識など全くなかった僕が、1ヵ月で<a href="https://paiza.jp/">Paiza</a>のスキルチェックでBランクを獲得できたのは、ひとえにRubyという言語の書きやすさであったり、分かりやすさのおかげだと思います。Ruby on railsもその特徴を受け継いでいます。</p>



<p>また、Rubyという言語は日本人のまつもとゆきひろさんが開発された言語であり、その影響なのか日本語の説明が多いことも特徴です。分からないことでもググったら大体日本語での解決法がヒットする、というのは安心できますよね。</p>



<h2 class="wp-block-heading">Djangoの特徴</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/04/pc.jpg" alt="pcを操作(装飾)" class="wp-image-230" srcset="https://ryuusan.com/wp-content/uploads/2020/04/pc.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/04/pc-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>Djangoの特徴は以下の3点です。もちろんこれ以外の強みも多くあると思いますが、その中でも特に僕が便利だと感じた点を紹介しています。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ol>
<li><strong>データベースに強い</strong></li>
<li><strong>同じPythonのWebフレームワークであるFlaskよりも大規模開発に向いている</strong></li>
<li><strong>機械学習と組み合わせられる</strong></li>
</ol>
</div>


<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">1.データベースに強い</span></strong></p>
</div>



<p>まず、<span class="marker-under">1つめのデータベースに強い</span>というのは、Djangoは<strong>Oracle</strong>、<strong>SQLite</strong>、<strong>MySQL</strong>、<strong>PostgreSQL</strong>などのデータベースに対応しており、なおかつ簡単にデータベースを操作できるからです。</p>



<p>Djangoドキュメントの<a href="https://docs.djangoproject.com/ja/3.0/intro/tutorial01/">チュートリアル</a>のような簡単なWebアプリの場合、<span class="marker-under">ほとんどデータベースの知識は必要ありません。</span>(あった方が良いのはもちろんですが。）つまり、Pythonの知識さえ最低限あれば、簡単なWebアプリが作れてしまうということです。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">2.大規模開発に向いている</span></strong></p>
</div>



<p>Djangoはログイン機能やセキュリティ対策など必要な機能が全てそろっており、基本的には<span class="marker-under">Django単体でWebアプリを開発すること</span>ができます。このようなフレームワークをフルスタック・フレームワークと呼び、DjangoのほかRuby on railsなどもこのフルスタック・フレームワークです。</p>



<p>一方でFlaskなどはマイクロフレームワークと呼ばれており、必要最低限の機能しか備えていません。そのため、足りない機能は拡張などで補うことになります。ただ、このようなマイクロフレームワークは小規模の開発をする際や初心者には、機能が少ないため分かりやすいというメリットもあります。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">3.機械学習と組み合わせられる</span></strong></p>
</div>



<p>DjangoでWebアプリケーションを開発する際にはPythonという言語を使いますが、そのPythonは機械学習に強い言語です。また、Webクローリング等もPythonを使うことで簡単に行うことができます。</p>



<p>そのため、<span class="marker-under">機械学習やWebクローリングで得られたデータをDjangoを使って表示するWebアプリケーションを、Pythonという言語だけで実装することができる</span>のはDjangoの強みです。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-28px">Djangoを利用しているサービス</span></strong></p>
</div>



<p>例えば、<span class="marker-under">InstagramやMozillaなど</span>がDjangoを利用して開発された有名なサービスです。1度は使ったことがある人も多いのではないでしょうか。Pythonを使って、あのような素晴らしいサービスを作成することができます。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>この記事ではDjangoやWebフレームワークの紹介をしました。参考になれば幸いです。また、もしよろしければTwitter(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)のフォロー等もお願いします。この記事の次は<span class="marker">Dockerを利用したDjango開発環境構築</span>の記事です。</p>



<p>公開しましたので、読んでみてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>

<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>小学校で必修になった『プログラミング』って？</title>
		<link>https://ryuusan.com/prog-introduction/</link>
					<comments>https://ryuusan.com/prog-introduction/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Fri, 13 Mar 2020 05:06:28 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=190</guid>

					<description><![CDATA[こんにちは。このリューブログを運営している、リューさん(@Ryu_programs)です。 この記事では、主に次のような方のために、小学校で必修になった『プログラミング』って？というテーマで小学校で学習するプログラミング [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。このリューブログを運営している、リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。</p>



<p>この記事では、主に次のような方のために、<strong>小学校で必修になった『プログラミング』って？</strong>というテーマで<span class="marker-under">小学校で学習するプログラミング</span>について紹介していきます。</p>


<div class="blank-box bb-tab bb-check bb-blue">
<ul>
<li>小学生のお子様がいるご家族</li>
<li>プログラミングが難しそうで不安に思われているご家族やお子様</li>
<li>将来教職を目指している方</li>
</ul>
</div>


<h2 class="wp-block-heading">そもそも、プログラミングって何？</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="458" src="https://ryuusan.com/wp-content/uploads/2020/03/notepc.jpg" alt="" class="wp-image-180" srcset="https://ryuusan.com/wp-content/uploads/2020/03/notepc.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/03/notepc-300x215.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p>プログラミングとは、<span class="marker-under">コンピュータを動かすための「プログラム」を作ること</span>を意味します。</p>



<p>実はコンピュータは人間の脳とは違い、0か1の信号でしか命令を理解できません。従って、コンピュータに命令して思い通りに動かすためには、0と1の羅列で表現された命令(プログラム)を作らなければいけません。</p>



<p>しかし、そうすると今度は人間が理解しづらくなってしまいます。そこで、命令を人間が理解しやすい形で記述できる<strong><span class="marker-under">プログラミング言語</span></strong>と、プログラミング言語で書かれたプログラムをコンピュータが理解できる形に変換する<strong><span class="marker-under">コンパイラ</span></strong>が登場しました。</p>



<p>現在では主にこのプログラミング言語によってプログラムが作られ、様々なシステムが開発されています。プログラミング言語の例として、機械学習やIoTなどに用いられる<strong>Python</strong>、組込みシステムなどに用いられる<strong>C言語</strong>等が挙げられます。これらはまた別の記事で紹介しますね。</p>



<a href="https://ryuusan.com/python-study" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-4 sbs-think sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ryuusan.com/wp-content/themes/cocoon-master/images/b-woman.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>プログラミングってすごい難しそうだけど、大丈夫かな…？</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-10 sbs-think sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/03/logo-150x150.png" alt="リューさん" class="speech-icon-image"/></figure><div class="speech-name">リューさん</div></div><div class="speech-balloon">
<p>大丈夫ですよ！小学校教育はプログラマーの育成ではなく、「プログラミングの考え方」を身に付けることが目的なんです！</p>
</div></div>



<p>たしかに、プログラマーになるための教育をするのであれば、必要な知識も膨大となりますし、プログラミング言語の基本的な記述の仕方や、コンピュータの構造なども覚える必要があります。</p>



<p>しかし、今回のプログラミング教育では<span class="marker-under">論理的な思考能力</span>や<span class="marker-under">問題解決力</span>などの「プログラミングをすることで身につく力」を養うことが目的ですので、必要となる知識も少なくて済みます。</p>



<p> また、現時点では小学校の授業に新しくプログラミングという科目を作るのではなく、<span class="marker-under">それぞれの科目でプログラミングを用いた授業を組み込む</span>、といった形で学習するようです。</p>



<p>他にも、後で紹介しますが<a href="http://www.nhk.or.jp/school/programming/">ワイワイプログラミング</a>であったり、<a href="https://education.lego.com/ja-jp/product">LEGOの動作制御</a>であったりと、面白くゲーム感覚でプログラミングを学ぶことができる教材も数多くあります。そのような教材を利用することで、子供たちだけでなく、大人も一緒に楽しくプログラミングを学ぶことができるのではないでしょうか。</p>



<h2 class="wp-block-heading">小学校で学ぶプログラミング</h2>



<p>小学校では主に<strong>Scratch</strong>を用いて学習すると考えられます。<a herf="https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1416408.htm">文部科学省のページ</a>でもScratchでの教育実践事例が掲載されています。</p>



<p><span class="marker-under">Scratchは直感的にプログラムを作ることができる</span>ので、子供たちはもちろん、プログラミングを始めたばかりの人にもおすすめです。先ほど紹介した、NHKが作成している<a href="http://www.nhk.or.jp/school/programming/">ワイワイプログラミング</a>で詳しく紹介されているため、閲覧してみてください。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-22px">Scratchとは</span></strong></p>
</div>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/03/scratch-3-1024x755.png" alt="" class="wp-image-203" width="512" height="378" srcset="https://ryuusan.com/wp-content/uploads/2020/03/scratch-3-1024x755.png 1024w, https://ryuusan.com/wp-content/uploads/2020/03/scratch-3-300x221.png 300w, https://ryuusan.com/wp-content/uploads/2020/03/scratch-3-768x566.png 768w, https://ryuusan.com/wp-content/uploads/2020/03/scratch-3.png 1273w" sizes="(max-width: 512px) 100vw, 512px" /></figure></div>



<p>Scratchはブラウザ上で、この写真にあるようなブロックを組み合わせることでプログラミングを行うアプリケーションです。日本語化もされていて、尚且つ無料であるため、プログラミング教育において非常に広く使われています。タブレット端末にも対応しています。</p>



<p>知識などは必要ないため、プログラミングの授業が始まる前にお子様と一緒にゲームなどを作って遊んでみてはどうでしょうか。<a href="https://scratch.mit.edu/">スクラッチ公式サイト</a>で作ることができます。きっと楽しめると思いますし、お子様のプログラミングに対する忌避感を無くす手助けになるでしょう。</p>



<h2 class="wp-block-heading">気を付けるべきこと</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/03/warning.jpg" alt="" class="wp-image-154" srcset="https://ryuusan.com/wp-content/uploads/2020/03/warning.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/03/warning-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p>僕の考えですが、プログラミングは自分で<span class="marker-under">試行錯誤する中で学習する</span>ものだと思っています。ですので、お子様と一緒にプログラミングで遊んでいるときやプログラミングを教えているとき、お子様の分からないことに対して答えを教えてしまうのではなく、ヒントを言うようにしてください。</p>



<p>プログラミングには決まった答えがありません。同じ処理に対して、いろいろなアプローチがあります。試行錯誤の末に思い通りの動作をした時の方が達成感が得られますし、力もつくはずです。</p>



<p>また、プログラミングは楽しんで勉強することが大切です。他のどの教科にも言えますが、面白くないことに対しては苦痛であるだけで、やる気は出ません。<span class="marker-under">「プログラミングって面白い！」と思ってもらえるような工夫</span>をする事が重要です。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p><strong><span class="fz-22px">「プログラミングって面白い!」と思ってもらうためには</span></strong></p>
</div>



<p>幸いにも、プログラミングは自分の書いたプログラムの動きが目に見えて分かるため、面白いと思ってもらいやすいです。</p>



<p>また、<span class="marker-under">プログラミング学習のための教材</span>も多くあり、家でも楽しみながら学ぶことができます。この記事では、それらの教材の中からいくつか紹介します。</p>



<p>例えば、この教材は<span class="marker-under">LEGOでロボットを作り、プログラミングで動かすことでモノづくりやプログラミングを学ぶことができます。</span>自分でロボットを作り、それを動かすような経験はなかなかできないのではないでしょうか。</p>



<a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=3B9EGB+56CP4I+46QO+61JSH">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www26.a8.net/svt/bgt?aid=200312939313&amp;wid=001&amp;eno=01&amp;mid=s00000019536001015000&amp;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=3B9EGB+56CP4I+46QO+61JSH" alt="">



<p>こちらの本は、先ほど紹介した<span class="marker-under">Scratchでゲームを作りながらプログラミングを学習</span>することができます。学校の授業の予習や復習にもなりますね。</p>



<table cellpadding="0" cellspacing="0" border="0" style=" border:1px solid #ccc; width:300px;"><tr style="border-style:none;"><td style="vertical-align:top; border-style:none; padding:10px; width:108px;"><a rel="nofollow" href="https://rpx.a8.net/svt/ejp?a8mat=3B98Y5+C6720I+2HOM+BWGDT&#038;rakuten=y&#038;a8ejpredirect=http%3A%2F%2Fhb.afl.rakuten.co.jp%2Fhgc%2Fg00q0724.2bo11c45.g00q0724.2bo12179%2Fa20030468772_3B98Y5_C6720I_2HOM_BWGDT%3Fpc%3Dhttp%253A%252F%252Fitem.rakuten.co.jp%252Fbook%252F15396645%252F%26m%3Dhttp%253A%252F%252Fm.rakuten.co.jp%252Fbook%252Fi%252F19057509%252F"><img decoding="async" border="0" alt="" src="http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4686/9784816364686.jpg?_ex=128x128" /></a></td><td style="font-size:12px; vertical-align:middle; border-style:none; padding:10px;"><p style="padding:0; margin:0;"><a rel="nofollow" href="https://rpx.a8.net/svt/ejp?a8mat=3B98Y5+C6720I+2HOM+BWGDT&#038;rakuten=y&#038;a8ejpredirect=http%3A%2F%2Fhb.afl.rakuten.co.jp%2Fhgc%2Fg00q0724.2bo11c45.g00q0724.2bo12179%2Fa20030468772_3B98Y5_C6720I_2HOM_BWGDT%3Fpc%3Dhttp%253A%252F%252Fitem.rakuten.co.jp%252Fbook%252F15396645%252F%26m%3Dhttp%253A%252F%252Fm.rakuten.co.jp%252Fbook%252Fi%252F19057509%252F">遊びながら楽しく学ぶ！小学生のScratchプログラミング [ 石戸奈々子 ]</a></p><p style="color:#666; margin-top:5px line-height:1.5;">価格:<span style="font-size:14px; color:#C00; font-weight:bold;">1,980円</span><br/><span style="font-size:10px; font-weight:normal;">(2020/3/12 22:17時点)</span><br/><span style="font-weight:bold;">感想(0件)</span></p></td></tr></table>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=3B98Y5+C6720I+2HOM+BWGDT" alt="">



<p>このような教材を利用して、<span class="marker">プログラミングで何かを作り上げる経験</span>が、面白いと思ってもらうことの1番の近道なのではないかと思います。</p>



<p>他にも、数学や国語などにおける塾のような扱いである、<span class="marker-under">プログラミングスクール</span>を利用する方法もあります。無料体験等も行っているので、もし近くに教室があるなら参加してみてはどうでしょうか。</p>



<p>例えば、<a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=3B9F8B+CO225U+4380+BZ0Z6">コンテスト実績No.1の本格スクール 小学生向けプログラミング教室【テックキッズスクール】					</a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www11.a8.net/0.gif?a8mat=3B9F8B+CO225U+4380+BZ0Z6" alt="">では、東京渋谷校や大阪梅田校など場所が限られてしまいますが、プロにプログラミングを教えてもらうことができます。また、多くのイベントやコンテストなどにも参加できることも強みですね。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>この記事では、そもそもプログラミングとは何か、という話やお子様と一緒にプログラミングを楽しみ、面白いと思ってもらうための方法などを紹介しました。</p>



<p>もし質問等がありましたら、僕のTwitter<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>まで連絡をください。Twitterでも日々の気づきや情報などを発信していくので、良ければフォロー等もお願いします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/prog-introduction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
