東大理三生のプログラミング奮闘記

初心者プログラマーが半年間でどれだけ成長するか!についてのブログです。勉強方法とか使った本とかについて書いていくと思います!プログラミングをもっと身近に感じてもらえたら嬉しいです!毎日更新を目指します!

プログラミング勉強の近況報告!

お久しぶりです。



最近、勉強といえばインプットするのに精一杯で、なかなかブログでアウトプットすることがなかなか難しいです。



プログラミングの勉強を諦めた訳ではないですよ!笑



夏までの勉強の軸がしっかり定まって来たので、久しぶりの投稿を兼ねて近況報告をしたいと思います。
(勉強を始める人は、よかったらペースとか参考にしてください!)



今どんな感じかを一旦整理すると、


・プログラミングを本格的に初めて3ヶ月を超えました(2月頭にスタート)

・言語は主にPythonマークアップでHTML, CSSも書いてます)


っていう感じです。



これからの軸は主に3つあって、


インターン先の業務をやりながら勉強

・東大のDeepLearning基礎講座(ネットでもバズってます笑)、グローバル消費者インテリジェンス講座

・SecHack365


でやっていきたいと思います。



インターン先の業務をやりながら勉強】


Djangoを使って業務をやらせてもらっています。

技術力的に全然まだまだなので、ひたすらGoogle先生で調べながら頑張ってついて行こうとしています。

Djangoだけではなくて、Dockerとか複数人でのGit開発にも触れられるのでかなりありがたいです。

主にWebエンジニア!っていう感じのことをやらせてもらっています。




【東大のDeepLearning基礎講座・グローバル消費者インテリジェンス講座】

東大の松尾先生の研究所発祥の自己ゼミです。

一つ目のDeep Learning基礎講座は、以下の記事で結構バズってました。

note.mu


ここに書いてある通り、かなり大変で、最近の勉強の大半はこの二つの講座に吸い取られています笑

前者はDeep Learningを半年でできるようになろう!、後者はData Scientistとしての基礎を半年で身につけよう!みたいなイメージです。

例えば前者の講座では今週でTensorflowを使ったMLPモデリングで、MNISTの文字認識の精度を高めてこいみたいな宿題が出てます。

まだ講座開始から1ヶ月でここまで行くのって結構早いですよね(線形代数の計算もちゃんとやってます)。




【SecHack365】

これは先日合格をもらったばかりなので実態はよくわかってないですが、セキュリティの勉強を主にすることになりそうです。

ハッカソンとかも年に6、7回参加するっぽいです。

すごい人がいっぱい来てそうなので、その人たちにいい刺激を受けながら頑張っていきたいと思っています。






こんな感じです。


将来的には医学とITを融合させたいと思っていて、その際「Webエンジニア・Data解析・セキュリティ」の3本はどれもすごく大切になってくると思います。

結構いろんなことに手を出している感はありますが、どれも中途半端にならないように気をつけながら精進していきます。



冒頭でも書いたように、インプットがひたすら多いのでなかなかブログでアウトプットする機会が少ないですが、気長にブログを訪問していただけると嬉しいです。

よろしくお願いします。

近況!

毎日更新とは何処へやら。。

なかなか忙しくて更新できていませんが、気長にお付き合いください!


さて、最近の近況です。


先週からようやく念願のエンジニアチームに入れてもらい、毎日実践でコードを書くようになりました。

フルで入る日は一日10〜12時間、学校がある日でも3、4時間はとって書くようにしています。


初めの1週間はdockerだのGitHubだのに苦しめられてdockerが嫌いになりました笑

何をしてもエラーしか出ず、鬱になりかけていました!笑


そんな中でも、エラーは自分で直せ、と厳しく(ありがたいことです!)言われているので、必死にネット検索をしてデバッグをしていました。

2週間目に入ってだんだん慣れてきて、開発のペースがつかめてきました。



Djangoを本格的に書くようになって、当たり前ですが全然Djangoについて理解できていないってことが露骨に現れてきました。

慣れてきた頃だし、と思って今日から新しく自分のアプリケーションを作りはじめました。


家計簿管理のアプリケーションなのですが、よく使うであろう機能が満載なので、これを一つ作り終えた頃にはだいぶ上達しているだろうと思います。

今日は、POSTの理解と、ユーザ認証の理解(途中)を頑張って進めています。


最近はWebエンジニアのスキル上達に注力していますが、来週からは東大の松尾先生の授業も始まったりと、機械学習のスキルも同時に伸ばして行きたいです。

二兎追うものは...と言いますが、気にしません。笑


インフラ周りの話にも興味があるので、上記の二つが落ち着いてきた頃にDockerとかAWSとかの勉強をしようかなと思います。


こんな感じの近況でした!

それでは〜〜

単なるメモ機能が作れて感動した話

まあ一応つけとくか〜〜ぐらいで作り始めたメモ機能。

こいつにめちゃ苦しめられました。

でもおかげでGETとかPOSTとかのHTTPレスポンスのあたりのお話がちょっとわかった気になったのでよかった。


<成果物>
f:id:gragragrao:20170315132448p:plain

これにメモを書いて更新を押すと、ずっと保存されます。

f:id:gragragrao:20170315132606p:plain



<コード>

models.py

class Note(models.Model):
    worker = models.ForeignKey(Worker, null=True, blank=True)
    content = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.worker.worker_name

    @classmethod
    def get_note(cls, worker):
        notes = cls.objects.filter(worker=worker)
        if notes.count() > 0:
            return notes[0]
        else:
            return None


views.py

# Djangoの組み込みモジュールをインポート
from django.shortcuts import get_object_or_404, render_to_response, redirect
from django.views import generic

# 自分で作ったモジュールをインポート
from managings.models import *
import managings.forms as managings_form_module

class WorkerDetailView(generic.TemplateView):
    model = Worker
    template_name = 'managings/each_worker.html'

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(request, *args, **kwargs)
        return super(WorkerDetailView, self).render_to_response(context)

    def get_context_data(self, request, *args, **kwargs):
        context = super(WorkerDetailView, self).get_context_data(**kwargs)

        worker_id = args[0]
        target_worker = get_object_or_404(Worker, id=int(worker_id))
        context{'worker'] = target_worker

        note = Note.get_note(target_worker)
        redirect_url = "/worker/{}".format(target_worker.id)
        content = note.content if note else ""
        context['note_form'] = managings_form_module.NoteForm(initial={'content':content, 'redirect_url':redirect_url, 'worker_id':target_worker.id})

        return context

def add_note_view(request, *args, *kwargs):
    form_data = request.POST
    if form_data:
        worker_id = int(args[0])
        worker = get_object_or_404(Worker, id=worker_id)
        content = form_data['content']
 
       note = Note.get_note(worker)

        if note:
            note.content = content
        else:
            note = Note(worker=worker, content=content)

        note.save()

        return redirect("/managings/worker/{}".format(worker_id))

    else:
        raise Http404


forms.py

from django import forms
from django.forms import ModelForm

from managings.models import *

class NoteForm(forms.Form):
    content = forms.CharField(widget=forms.Textarea(attrs={'class'="workernote-content"}))
    redirect_url = forms.CharField(widget=forms.HiddenInput())
    worker_id = forms.CharField(widget=forms.HiddenInput())

あとはurlを設定すればできます。



<引っかかったポイント>

>>そもそも、Djangoの組み込みがどれで使い方がわかってなかった

振り返ってみると、これが全てだったような気がします。Djangoのドキュメントも読んだりしてましたが、使ってみないことには実感がわかないし、使ってみようとしたら使い方がわからないしで大変でした。今回で少し足場ができたので、ちょっとは進みがよくなりそうです。


足場が少しできた感じがするので、少しずつドキュメントももう一回読み始めようかな〜と思います。

久しぶりの投稿でした。

ボタンの作り方 CSS編

Djangoの勉強をしているとあんまり書くことないので、調べた小技・小知識とかについても書こうかなと思います。

f:id:gragragrao:20170312124749p:plain

こんなやつを作りたい!っていうとき

HTML

<a class="btn" href="#">Button</a>

CSS

a.btn{
  width: 200px;
  font-size: 24px;
  font-weight: bold;
  text-decoration: none;
  display: block;
  text-align: center;
  padding: 8px 0 10px;
  margin: 0 auto;
  color: white;
  background: rgba(0, 140, 140, 1);
  border-radius: 4px;
}

a.btn:hover{
  background: rgba(0, 140, 140, 0.7);
  cursor: pointer;
}

って感じです!

簡単ですね〜〜

それでは!

ご無沙汰です〜

しばらくブログ更新していませんでした。

この5日間ぐらいは旅行ばっかりで、久しぶりに休みを堪能した感じでした!


スキー旅行も行けたし、楽しかったです(^^)

明日からまた頑張ります!!

Record of study 〜一ヶ月が経過して〜

pythonを勉強してからちょうど一ヶ月が経ちました。月日が経つのは早いですね〜

2月は本当にインターンと勉強に捧げた月でした。笑


得るものもすごく多くて充実していたので、楽しかったです。


3月は少し遊びの予定も入っていて、友達とスキー・釣り・ゴルフとか、彼女さんと箱根とかに出かけます!

f:id:gragragrao:20170301223126j:plain

2月はほぼ遊びがなかったのですごく楽しみです〜



それはさておき、ついに自分のアプリケーションを作る段階に入りました!


というのも、Djangoのdocumentを読んでいたのですが、「何に使うかわからない」+「量が多い」で早速挫折したのです。笑

f:id:gragragrao:20170301223251j:plain


今後は、自分でアプリケーションを作りながら、わからないところを自分で調べたり、社長たちに方法とか調べ方とかを聞いたりして勉強して行きます。


「わからないところ」とか「作りたい機能(現状の技術力じゃ無理なやつ)」をノートに貯めて行くのが主にやることになります。


昨日始めたばかりでやり方はどんどん変わるかもしれませんが、まあぼちぼちやります。


それでは〜

ABC #054 D問題 を python で解いてみた!

今日の晩の体操は AtCoder Biginner Contest の D 問題です。

問題はこちら↓
D: Mixing Experiment - AtCoder Beginner Contest 054 | AtCoder

(解答)

from itertools import combinations

N,Ma,Mb = [int(n) for n in input().split()]
medicine_list = []
for i in range(N):
    medicine_list.append([int(n) for n in input().split()])

money_possible = []
counter = 0

for i in range(1, N+1):
    for medicine_comb in combinations(medicine_list, i):
        sum_a = 0
        sum_b = 0
        sum_c = 0
        for k in range(i):
            sum_a += medicine_comb[k][0]
            sum_b += medicine_comb[k][1]
            sum_c += medicine_comb[k][2]
        if sum_a/sum_b == Ma/Mb:
            money_possible.append(sum_c)

if len(money_possible) == 0:
    print(-1)
else:
    print(str(min(money_possible))+"円")


一応、AtCoderの検証例だとあっていることがわかります。(さすがに少なすぎませんか...)

f:id:gragragrao:20170301221435p:plain


5分強ぐらいで書けましたが、このコードには問題があると思います。

N が最大で 40 にまでなるので、for で回す回数が、約2の40乗回にまで膨れ上がります(二項定理より)。

これは、1099511627776回と、1兆回を超えます。

さらにこの中で i に対する for 文を回しているので、最大で800兆回( 40 × 40 ÷ 2 × 兆?)ぐらいの計算量になると思います。

これはpythonで処理できる範囲を超えているはずです。(Cとかならワンチャン??よくわかりません。)


ですが、この問題では「当てはまる組がなければ "-1" と表示しなければいけない」ので、全通りためさなくてはいけません。


「全通りためす」かつ「計算量を激減させる」方法を考える必要がありますが...どうやればいいんでしょうね〜思いつきません。



「こんな方法あるよ」とかあったら教えてください。

それでは〜

ABC #055 を python で解いてみた!

おはようございます。

朝の準備体操に、AtCoderの#055の D問題をときました。
D: Menagerie - AtCoder Beginner Contest 055 | AtCoder


D問題が解けるようになってきたので、楽しくなってきました!!

でも、よくない傾向なのは、最近はDjangoが少し辛くなってきていて、AtCoderの問題を解く方に逃げてしまうことなんですよね..
朝と晩に1題ずつ解くことにして、その他はDjangoに時間を回すようにしようかな。


問題D

from copy import deepcopy

print("--入力--")

N = int(input())
statement_first = input()
statement = statement_first + statement_first[:2]

animal_arrange = [["S", "S"], ["S", "W"], ["W", "S"], ["W", "W"]]
animal_final_arrange = []

for animal_pattern in animal_arrange:
    i = 0
    while i <= N:
        if animal_pattern[i:] == ["S", "S"]:
            if statement[i+1] == "o":
                animal_pattern.append("S")
            elif statement[i+1] == "x":
                animal_pattern.append("W")
        elif animal_pattern[i:] == ["S", "W"]:
            if statement[i+1] == "o":
                animal_pattern.append("W")
            elif statement[i+1] == "x":
                animal_pattern.append("S")
        elif animal_pattern[i:] == ["W", "S"]:
            if statement[i+1] == "o":
                animal_pattern.append("W")
            elif statement[i+1] == "x":
                animal_pattern.append("S")
        elif animal_pattern[i:] == ["W", "W"]:
            if statement[i+1] == "o":
                animal_pattern.append("S")
            elif statement[i+1] == "x":
                animal_pattern.append("W")
        i += 1
    animal_final_arrange.append(animal_pattern)

animal_final_arrange_copy = deepcopy(animal_final_arrange)
print("--出力--")

counter = 0
for animal_arrange in animal_final_arrange_copy:
    if animal_arrange[:2] == animal_arrange[N: N+2]:
        animal = ""
        for animal_string in animal_arrange[:N]:
            animal += animal_string
        print(animal)
    else:
        counter += 1

if counter == len(animal_final_arrange):
    print(-1)

冗長になってる気もしますが、whileで回しているので輪っかの最後の方は複製せざるを得ませんでした。
他にうまいやり方があるのかな...

それはともかく、一応は正しく動きます。
条件を満たすものが全通り出力されるようにしてます。

〜Test〜
f:id:gragragrao:20170228093526p:plain

うまくいっていますね〜

それでは!