何の為にブログを書くのか。

学びの方法を変える

初心者エンジニアだから

成長にスピード感を感じたい。焦らず確実に知識を付けたい。

成長の過程を綴り、貯蓄する。ブログの価値を100%引き出し宝物にする。

このブログを通して、やってみようの数を増やしたい。

という想いからブログの再定義を行った。変更点は以下の通り。

何を変えるのか?

  • 技術ブログは日本語表記にする
  • 英語記事で必要な時に翻訳して綴る
  • 時々、PythonでのAI/Data-Science
  • 実際にサービスを作る工程を投稿する
  • サービス工程に関わらずその為に必要な知識も投稿する
  • サービスを構築するために必要な知識を構築過程で詰め込む

 

オブジェクト指向とは

ソフトウェア開発はコードの追加と変更を繰り返し開発が進み、ソフトウェアが使われ始めると想定外の使われ方に対応し、追加と変更の要求に応える為に変更作業が続く。オブジェクト指向はこの変更を楽で安全にする為の実践的な考え方であり工夫である。

変更が大変なプログラムの特徴

  • どこに何が書いてあるのかわからない
  • 同じ修正があちこちで必要

-> 修正に関して経験があった。使用頻度+変更の可能性があるものを一箇所でまとめて管理するように仕様を変更した。あれもオブジェクト指向の一つだったのだと腹落ちした。

  • 変更の副作用が怖くて変更できない / 思わぬ副作用が起きた

->これについての対策を週明けからするのであろうと思っている。(キャンペーン時のモーダル表示でバグが出るという事例があるので解決する。)

この問題の改善に取り組む為には?
  • データの扱い方の工夫
  • 場合分けの書き方の工夫
  • プログラムの分割の仕方の工夫
  • 名前の付け方の工夫

具体的な方法がわかったところで、もう少し詳細に詰めて行こうと思う。

関連するデータとロジックは同じクラスに書く

データとロジック(データ操作)を、1つのクラスにまとめることを重視する。

  • データを操作するロジックは、そのデータをインスタンス変数に持つクラスに一緒にする(データクラスと機能クラスに分けない)

データとロジックを別クラスに分けると、データを操作するロジックが、あちこちに重複しやすくなる

  • オブジェクトを生成するときは、必ず操作対象のデータをコンストラクタの引数として渡す

データを引数で渡すことを繰り返すと、そのデータを使った判断/加工/計算のロジックが、どこに書いてあるのか、見つけ出すのに苦労する

  • オブジェクトに、getXxxx()の形式で内部のインスタンス変数を要求しない
  • オブジェクト内部のインスタンス変数を、外から変更しない(setterメソッドを使わない)

オブジェクトのインスタンス変数を書き換える操作は(状態が変わるので)、プログラムの動作が不安定になりやすい

 

基本のデータ型を使うロジックを用途ごとのクラスにまとめる

データとロジックを同じクラスにまとめる方法としては、プログラミング言語に用意されている汎用的なデータ型を使って、用途を限定した「独自のクラス」を作ることである。基本的なデータ型とそのメソッドは、色々な用途に使えるように汎用的に設計されている。しかし、このようなデータ型と汎用的な操作をそのまま使うと、次のような問題が起きがちである。

  • 業務的に正しくないデータが混入しても動いてしまう
  • プログラムのどこを見ても同じような記述が並ぶ(基本データ型だらけ)
  • 汎用的な操作が、どのような意図なのか、判断しにくい

 

聞いたことあるけど、理解できていない語録

  • 引数

->プログラムにおいて、その外部と値をやりとりするための特別な変数、あるいはその変数の値のことである。Ex:ご飯->食べる->う○こ(*左フローの"ご飯"のこと)

Data Science

Start learning data science.

  • Necessary to download Anaconda first.
  • Execute jupyter notebook in teminal.
  • Select Python3 in jupyter notebook.

*Refered from other site.

 

How to visualize data

  • Necessary to code %matplotlib inline at the first line.
  • All necessary process has been done. Now you can keep codeing like whatever you want to code.

 

What is logistic regression model?

It's much easier to understand what logistic regression model is with thinking about a classifier of a spam e-mail. Basically, a spam e-mail filter classify which is a spam or not. There would be some experiences like an e-mail should be classified as a spam got to through the filter. On the other hands,an email should be classified it's not a spam got to classify as a spam. So we need to take steps to predict with deep learning. Classifying it's not a spam when program thinks the prediction is weak. This is one of methods to reduce the bad possibility such as classifying an e-mail as a spam. For doing this,we need to measure how reliable the prediction is.

 

Review of perceptron.

*Refered from other site.

Frankly to say,perceptron is a binary classifier which predicts which kind of data points with classifying f(x) is plus or minus.

Generating visualized data.

>|python|
%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib.pyplot  as plt
from scipy import optimize

plt.style.use('ggplot')

def make_data(N, draw_plot=True, is_confused=False, confuse_bin=50):
    '''N個のデータセットを生成する関数
    データをわざと複雑にするための機能 is_confusedを実装する
    '''
    np.random.seed(1) # シードを固定して、乱数が毎回同じ出力になるようにする

    feature = np.random.randn(N, 2)
    df = pd.DataFrame(feature, columns=['x', 'y'])

    # 2値分類の付与:人為的な分離線の上下どちらに居るかで機械的に判定
    df['c'] = df.apply(lambda row : 1 if (5*row.x + 3*row.y - 1)>0 else 0,  axis=1)

    # 撹乱:データを少し複雑にするための操作
    if is_confused:
        def get_model_confused(data):
            c = 1 if (data.name % confuse_bin) == 0 else data.c 
            return c

        df['c'] = df.apply(get_model_confused, axis=1)

    # 可視化:どんな感じのデータになったか可視化するモジュール
    # c = df.c つまり2値の0と1で色を分けて表示するようにしてある
    if draw_plot:
        plt.scatter(x=df.x, y=df.y, c=df.c, alpha=0.6)
        plt.xlim([df.x.min() -0.1, df.x.max() +0.1])
        plt.ylim([df.y.min() -0.1, df.y.max() +0.1])

    return df

df = make_data(1000)
df.head(5)
||<

f:id:crown_666:20180603175921p:plain

 

List

<Code>

# Practice Project4

grid=[['.', '.', '.', '.', '.', '.'],
    ['.', 'O', 'O', '.', '.', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['.', 'O', 'O', 'O', 'O', 'O'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['.', 'O', 'O', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']

for x in range(len(grid)):

  for y in range(len(grid)):
    try:
      if y == len(grid)-1:
        print(grid[y][x])

      else:
        print(grid[y][x], end=' ')
    except IndexError:
      break

 

<Result>

.  .  O O . O  O  .  .
. O O O O O O O .
. O O O O O O O .
.  .  O O O O O  .  .
.  .  .  O O O  .  .  .
.  .   .  .  O  .  .  .  .

 

<Comment>

このListがどのような動きをするのかということは、結果からわかったので理解することが出来たが、このプログラム自体がなぜこのような結果をもたらすのかが理解できていない。2重for文の動きは簡単なコードを書いて確認することが出来た。

 

grid = [['.', '.', '.', '.', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['.', 'O', 'O', 'O', 'O', 'O'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['.', '.', '.', '.', '.', '.']]


for x in range(len(grid)):
  for y in range(len(grid)):
    print(x)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(y)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(grid[y][x])
  break

0
0
0
0
0
0
0
0
0
--------------------------------------------------
0
1
2
3
4
5
6
7
8
--------------------------------------------------
.
.
O
O
.
O
O
.
.
--------------------------------------------------

ただ、なぜこうなるという部分が理解できていないので、疑問を解消したい。

 

Automate the boring stuff/Practice Projects

この年で、初めてギックリ腰ならぬギックリ背中を経験し、勉強したくても出来ず、寝れない数日を過ごした。ストレートネックが原因で体を壊したらしい。もうあんな思いは嫌なので、トレーニングはもちろん普段パソコンを使用しているときや、スマホを触るときの姿勢にも気を使いたい。

 

<Code>

# Practice Projects

# Define collatz which has a parameter named number
def collatz(number):

if number%2==0:
return number//2
elif number%2!=0:
return 3*number+1

print("Enter number:")

 

# try~exception statement

try:
number=int(input())

 

# Parmanent repeat

while True:
if collatz(number)!=1:
number=collatz(number)
print(number)
else:
print("Success!")
break

except ValueError:
print("Type an integer, please.")

 

<Result of the execution>

*When I typed 3,this program ran like...

Enter number:
3
10
5
16
8
4
2
Success!

 

*When I typed string,this program ran like...

Enter number:
A
Type an integer, please.

 

このプログラムについては自分なりに理解が出来たが、全くプログラミングに関して知識がない人に教えることが出来るまで深い理解度にはまだ達していないのでこれからも試行錯誤を続けつつ複数のことを熟していきたい。

 

今度こそフローチャート

f:id:crown_666:20171012000421p:plain

name=""

while not name!="":
print("Enter your name:")
name=input()

print("How many guests will you have?")
numOfGuests=int(input())

if numOfGuests:
print("Be sure to have enough room for all your guests.")

print("Done")

 

この問題の答えがあるわけではないが、実際にこのプログラムのフローチャートはどのようになっているのか、フローチャートを見て理解しプログラムをつくることは可能なのか、を個人で検証するためにプログラムを参照し、フローチャートを作成した。

 

作成時に迷ったのは、while not name!="":の部分をどこに描けばよいのかということ、通常であれば、プログラム通りに描いていくのが筋であると考えていることが原因であると思う。

フローチャート

沖縄旅行にオズビジョンの一員として行ってきた。

とりあえず、団体で行ってあんなに楽しい旅行は初めてだった。

初日から、テンションFull-Maxで飲みすぎたのも初めて、旅行先での二日酔いも初めて、タンクトップでのサプライズ内定式も初めて(新卒としては、最初で最後...)、あんなに大勢の前でのカラオケも初めて、アクティブな旅行も初めてだった。

そんなに色々なことをすでに沢山経験させてもらっているし、いい人に囲まれている。ここまで頑張ってきてよかったと思う反面、内定式で宣言した通り、みんなをリードしていけるようなエンジニア(英語の話せるマッスルエンジニア)になるためにこれからのバイトや研究、遊び以外の空いた日は最低でも10時間程度は、エンジニアになるための勉強やビジネスの勉強に充てようと思う。

 

英語習得には1000時間かかるといわれていて、プログラミングの習得には300時間かかるといわれている。なので、この通りに進めることが出来れば、入社までにPythonを完璧に仕上げることが出来る!!!

また、それ以外にもアルゴリズムの勉強や、何かサービスもしくはアプリの開発などやり方は全然わからないけれど、成功するか完成できるかは置いておいて、やってみようと思う。しかし、目標は、どんなヘンテコなアプリでも完成させること。

それこそ、電卓で計算したら結果が全てランボーで返ってくる必ず受けて速攻飽きられてしまうアプリなんかでもいい。とりあえず、やろう!!!

 

オズビジョンに出会えて、心底良かったと思っています。

橋本さんには、ありがとう。と何度でも言いたいです!!!

またすぐに会えると思いますが、入社まで、入社後も、それより後でも、一緒に高めあっていける仲間でいようという言葉しっかり大切に刻んでおきます。

そのためには、越えていける勢いでこれからも前のめりで、ぶっとんで行こうと思います!!! 何事にも全力で!!!

 

本題ですが、今まであまりフローチャートを描いたことが無かったので意識して書くようにしています。なんか、プログラムの動きが分かりやすい。あ、そのためにあるのか。。。 以上です

 

これはたぶん題名を変えた方がよかったと思うが、エンジニアブログであり、勉強の軌跡を残すためなので、ご了承下さい。。。

基本の応用

AIとのチャットのプログラム作成で行き詰ってしまったので、初心に戻るために偶々見つけた無料でプログラミング学習教材を読むことが出来るサイトで、基本からの見直し。英語学習や筋トレと同じで、高いレベルに挑戦したら必ず壁や難題にぶち当たる。そこでそのレベルに挑み続けるというのも一つの手段だけれども、決して後ろを振り返るのではなく今まで手にしてきた地図に見落としはないのか再度確認しに戻る方が力になると思う。人間は、良い意味でも悪い意味でも欲深い生き物であるから、先へ急ごうとするけれども、そうするといずれガタが来る。そうならないためにも手にした地図を参考に行き来し、最強装備を手に入れて、先に進む。最強装備を手に入れる冒険に出かけている間にレベルアップするから、レベルは気にせずに、ひたすら自分を高めることに全力を尽くすのみ。

 

今回の作成プログラムの内容は、名前とパスワードが一致したらアクセスを許可したという一文を表示するというシンプルなものであったが、少し教材の内容を個人的に変更し正確に名前とパスワードを入力するまで、何度も確認し続けるものに変更して、フローチャートを作成した。

 

# This is just a program in order to check who you are.

print('Hello!')
print('What is your name?')
myName=input()
if myName=='Takuya':
print('Hi ' + myName + ' What\'s up?')
print('What is your password?:')

while myName!="Takuya":
print("Try again.")
myName=input()

if myName=="Takuya":
print('Hi ' + myName + ' What\'s up?')
print('What is your password?:')
myPassword=input()

if myPassword=="12345"':
print('Access Granted.')

while myPassword!='12345':
print('Wrong password.Try Again.')
myPassword=input()

if myPassword=='12345'

print('Access Granted.')

 

これで想像したものができあがった。これをさらに応用して、名前とパスワードを登録するプログラムを作成し、そのデータをデータベースに保存。そして、今回作成したようなプログラムとの関連付けを行い、データベースにアクセスし、登録内容との照合を行えばよくあるサインアップとログインのシステムが出来上がりそうだ。