しゃちの備忘録

プログラミングを中心とした技術関連の備忘録です(今のところ)

100 numpy exercisesをやる

3日目です.

コードを書くと文章力が下がるので,また文が短くなります….

ネットサーフィンをしていたらたまたま,100 numpy exercisesというものを見つけた.

github.com

もともとnumpy自体はそこそこ触ったことがある程度だったので今後のあれこれのためにやってみる.

今もやってみてます. ただ意外と難しく進捗が悪い……. 一定層溜まったらgistにして投げます.

Yahoo! JAPAN Hack Day 10th Anniv.を見てきた

3日目です. 日記になりつつありますが,毎日インプットしているということでひとつ…….

Hack Dayとは

hackday.jp

Yahoo! JAPAN様主催の日本最大級ハッカソンイベントです. ソフトからハード,個人から企業までさまざまな人が集まり,成果物を披露したり,24時間で作ったものを発表したりするイベントです. 私はその二日目を見てきました.

素敵なノベリティももらえました.

ロボットや声でする紙相撲などのユニークなブースも多かったです(写真忘れた…).

メインのハッカソンステージは前日から24時間で作ったものを90秒で発表するという企画をやっていました. 次から次に出てくるおもしろ技術はとても興味をそそられました. 機械学習関連も結構多くて,ささっと使えて結構制度が出るものが作れる時代なのかなぁと感じました.

何より発表者が楽しそうで,すごくいい刺激になりました. ありがとうございました.

おわりに

これ日記ですね?

DeepLearningで遊びたい話(予告)

2日目です 平穏を得たはずがなぜか加速度的に忙しくなっています,不思議.

今日はやりたいことの予告というかなんというか, やる前に色々調べたことをまとめて起きます.

何をしたい??

ディープラーニングで画像分類をして見たいなーって思ってます. 狙いとしてはディープラーニングに触ることで, 前々からアプリちっくなものを作りたい欲はあったので,それをアプリみたいな形で落とし込めたら嬉しいなって思ってます. 先駆者はいっぱいいるので新規性は皆無ですが,やりたいのでしかたない.

今後何をしていく??

まずはDeepLearningを行うためにChainerまたはCaffeの使い方を勉強して行きたいと思います. どっちを使うとかは決めてないですが,ドキュメントが多い方が嬉しいですね. 機械学習界隈の知識は幸い持っているのでその辺の話もしながら書いていけると,いいなぁとは思ってます.

一通りチュートリアルを試したら, 何を識別するかを決めて,画像収集作業をします. おそらくここでウェブスクレイビング的なことをするのかなぁと考えてます.

画像が収集完了したら,1対象とそれ以外の識別に挑んで,だんだん分類パターンを複雑にしていく風に進めて行きます. それでまぁ一定層できたら,うれしいなぁと.

おわり

短すぎる…(本当はChainerとかCaffeに触ったところまでやりたかったのですが明日朝早いので……(土下座)) 明日は,起きられれば技術ちっくなイベントに参加したいと考えているのでそのレポートでも. 長くなる………はず…….

PEP8とCircleCI

ひとりアドベントカレンダー1日目です. 早速遅刻ですがやって行きます.

なぜこのテーマ??

人にコードを見せる機会があって, しばらくコード規約とかそれを守ることから縁遠くなっていた私が, 改めてそれらをしっかり見直して, コードのシェア等をしやすくして行きたいという気持ちになったです.

ので,こんなこと調べました,備忘録にしておくね程度の記事です.

PEP8とは

PEPというのがPython Emhancement Proposaの略であり,Pythonのあれやこれやがまとまっています. その中の8番目にまとまっている,Pythonで書かれたコードのスタイルガイドがPEP8とのことです. ほかにもモジュールを追加する手続きについてや,バグ修正についてなどいろいろな項目がまとまっています.

PEP全体は一貫して英語で書かれているのですが,一部は有志により日本語化が行われいるようです. Pythonをつかってコードをシェアする予定がある場合や, 色々書き方あるけどどう書くのが正解なんだろう?と言う場合は是非一読するといいと思います.

PEP8 github.com

はじめに — pep8-ja 1.0 ドキュメント

PEPのいろんな部分 PEP(Python Enhancement Proposal) 日本語訳 — PEP Japanese Translation v0.0.7 documentation

ちなみにPEP8と検索すると,よくflake8と呼ばれるものも出てくるのですが, flake8はPEP8の要件を緩和したりカスタマイズするためのラッパーのようなもので, 例えば,PEP8の中にはD***と表記される渓谷があるのですが, これはdocstring,コードの説明に関する記述に関する警告なのですが, 直接コードとは関係ない部分なので,D***エラーは緩和する…みたいな使い方をするらしいです.

PEP8を適用する

PEP8を守って書かれたコードのためにドキュメントを1回1回見直すのは流石に大変なので, エディタや何らかの方法で,PEP8が守られているか確かめようとするのがいいとおもいます.

少し調べると,いろんなエディタでPEP8が守られているかを適用する方法が出てきました. 単純に検査だけではなく,PEP8に準拠したコードになるように書き換えを行なってくれるものもあるらしいです. (こう言うのって勝手にどんどん埋め込んでいいものなのでしょうか……) (もしダメそうなら消します)

qiita.com

ton-up.net

qiita.com

Circle CI

複数人て開発等々をする場合など, どうしてもPEP8に限らずコード規約や記法を守ろうと思った際, どうしても徹底できないことがあると思います. また,コード規約の外,そもそも求められる要件やテストを満たしているのかなど, コードを書く上で繰り返し見て,検証する項目などもあると思います.

そういった,ものに対する仕組みとしてCIと言う言葉があります. CIとはContinuous Integration(継続的インテグレーション)のことであり, ソフトウェア開発上で繰り返し起こるコンパイル,ビルド,テストなどの工程を1日に何度も実行するし,ソフトウェアの品質を向上させようというものです.

それを,実現するサービスの一つがCircleCIになります. Githubと連携して色々でき,一部無料で使えたりができるようです. あえてこれをピックしたのは,私が今回記事を書くにあたって出会ったのがこれだからです.

非常にわかりやすい資料だったので掲載しておきます. (こちらも,もしダメそうなら消します)

www.slideshare.net

おわりに

短い,オチがない,と言った感じの1日目です. 書いてる途中で寝落ちしたのが原因です…….

まぁそれはそれとして, 使うものは一通り知っておきたい欲があるので, 残りの日でCircleCIについて掘り下げようかなとも思ってます. ただ,他にやりたいこともあるので未定です.

ひとまずここまで. ありがとうございました.

ひとりアドベントカレンダーをやる(つもり)

なぜやるか

  • 最近アウトプット活動をしていないから
  • やりたいことタスクが溢れてきたので消化したい
  • ひとりアドベントカレンダーをやってる人が多く熱に当てられた
  • 書きたいから

内容について

主にやりたいと思っていたけど手が出ていなかった内容をなるべく消化するために,色々します. なるべくコード書き,ないしは,しっかりとした解説を目標にします.

内容候補は以下の通り.

  • Djangoでのアプリ開発のためのあれこれ
    • 3ヶ月程度さわったから改めて丁寧に色々書けるはずなのでそのへんを解説
  • Bootstrap4
    • ドキュメント少ないので触って解説したい
    • 一個一個は結構短くなりそう
  • DeepLearning
  • Pythonそもそもについて
    • まぁやっておいていいかなみたいな気持ち
  • PyQはじめたい

いつからやるか

諸事情で8日から予定です.どうしても避けられない予定がですね…….

かみんぐすーん.

Djangoに触る(その7)

7日目です.

チュートリアルの続きに挑みます.

前回まで

teru0rc4.hatenablog.com

ビューのハードコーディング改善,URLの名前空間の改善を行いました.

今日やったところ

はじめての Django アプリ作成、その 4 | Django documentation | Django

フォーム作成とコードの縮小化についてです.

フォームの作成

前回ビューの部分の修正を行いました. 今回はそこにhtmlの formを追加します.

polls/templates/polls/detail.htmlを以下に変更します. 今回はラジオボタンを追加しました.

これの追加で質問の選択肢が追加できたと思います.

<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

送信したデータを処理するための変更を施していきます. polls/urls.pyには,実はすでに必要なものは書かれています.

url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),

なのであとは,polls/view.pyを修正すればOKです. 以下の内容を追記してあげてください.

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse

from .models import Choice, Question
# ...
def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

また質問の投票を行った時のリダイレクト処理も実装します. 同じく,polls/views.pyに対して,追記します

from django.shortcuts import get_object_or_404, render


def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

最後に実際に表示されるwebページのテンプレートとして, polls/templates/polls/result.htmlを作成します.

<h1>{{ question.question_text }}</h1>

<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

これで投票をするとリダイレクトしてくれたり, 選択せずに投票をすると,エラーを吐く仕組みができました. お疲れ様でした.

おわりに

ぼちぼちでチュートリアルが終わるので,実際に手を動かしたいですね….

追記

やっぱり一回自分が何をやってきたか再確認する意味も兼ねて, 明日からは今日までの範囲を改めて見直しながら, 何か作りたいと思います.

ので毎日更新も一度今日までです.

作った何かの進捗を報告することはあるかもしれません.

チュートリアルの続きは詰まったその時にやりたいと思います.

Djangoに触る(その6)

6日目です.

チュートリアルの続きに挑みます

前回まで

teru0rc4.hatenablog.com

404エラーの追加,またDjangoでよく使う操作をまとめてくれたモジュール類についての修正を行いました.

今日やったところ

はじめての Django アプリ作成、その 3 | Django documentation | Django

ここの残り部分,テンプレートシステムの活用についてです. 短い….

テンプレートシステム

前前回辺りにテンプレートをロードし表示するところをやりました. その部分の追記です.

polls/detail.htmlを以下のように修正します. テンプレートシステムでは,次のように辞書検索でquestionの該当物を探したり,forを使う事でquestion内のメソッドを呼び出しています.

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

テンプレート内のハードコーディングを消す

以前にビューのハードコーディングを残すと,のちのち修正が大変になるという話がありました. 具体的にはURLを変更したりするときなどに,変更困難になるなどのことが起きます.

そして現在もpolls/index.html内にはハードコーディングが残ってしまっています.

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

この

 <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

の部分を修正していきたいと思います.

過去にpolls/urls.pyの中で,url関数に関する記述を行いました.

    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

この記述を利用して,polls/index.htmlを以下のように修正します

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

かつて url()関数内でnameを定義認めそれを利用することで,/pollsという記述を消すことに成功しました.

逆に言えば,今後URLに関する変更を行いたいときは,polls/urls.pyを変更すればいいということです. 例えば,polls/12と表示されていたところを, polls/specifics/12というURLに変えたいときは,以下のようにpolls/urls.pyを変更すればいいのです.

...
url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
...

URLの名前空間の管理

先ほどまででURLの追記変更について説明しました. 今回はpollsというアプリケーションしか存在しませんが,実際はこれより多くの数のアプリケーションとビューを管理することになります.

そんなとき,どのようにアプリとそのURLを区別するかについてかいていきます.

結論から言うと,URLconfに対して名前空間を追加すればいいようです. polls/urls.pyのなかのアプリケーションの名前空間の箇所を修正します. 今回はapp_name = 'palls'を追加しました.

from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

続いて,polls/index.htmlテンプレートも修正します.

  <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>    {% endfor %}

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

に変更し,pollsdetailだよと言うことを教えてあげます.

おわりに

チュートリアル3が終わりました.

微妙に忙しくてペースが落ちてますが, もう少し頑張ります.