今度こそフローチャート

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.')

 

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

人工知能(2)

<program>

class Dictionary:

def __init__(self):
self.random=
rfile=open('dics/random.txt','r',encoding='Shift-JIS')
r_lines=rfile.readlines()
rfile.close()

self.random=
for line in r_lines:
str=line.rstrip("\n")

if(str!=""):
self.random.append(str)

pfile=open('dics/pattern.txt','r',encoding='Shift-JIS')
p_lines=pfile.readlines()
pfile.close()
self.new_lines=

for line in p_lines:
str=line.rstrip("\n")

if(str!=""):
self.new_lines.append(str)

self.pattern={}

for line in self.new_lines:
ptn,prs=line.split("\t")
self.pattern.setdefault("pattern",).append(ptn)
self.pattern.setdefault("phrases",[]).append(prs)

 

<result>

ValueError: not enough values to unpack (expected 2, got 1)

 

前回の人工知能の記事での疑問点は解消し、かなり頭の悪い人工知能とのチャットを完成させることが出来た。その人工知能に感情を盛り込む勉強をしているが、エラーが出てきてしまい、解決が難しい。恐らく、プログラムの中にreturnか何かが1つ足りないことが原因だと思う。

 

前回の投稿からかなり期間が空いたが、その中で一つ気づいたことが。プログラムの問題は期間を空けて取り組むと解決することが多いなと思った。

人工知能

import tkinter as tk
from ptna import *
"""グローバル変数の定義
"""
entry = None
response_area = None
lb = None
action = None
ptna=Ptna("ptna")
def putlog(str):
  """対話ログをリストボックスに追加する関数
  @str 入力文字列または応答メッセージ
  """
  lb.insert(tk.END, str)
def prompt():
  """ピティナのプロンプトを作る関数
  """
  p=ptna.name
  if(action.get())==0:
    p += ":" + ptna.responder.name
  return p + "> "
def talk():
    """対話を行う関数
    ・Ptnaクラスのdialogue()を実行して応答メッセージを取得
    ・入力文字列および応答メッセージをログに出力
    """
    value = entry.get()
    #入力エリアが未入力の場合
    if not value:
      response_area.configure(text="なに?")
    #入力されていたら対話オブジェクトを実行
    else:
      #入力文字列を引数にしてdialogue()の結果を取得
      response = ptna.dialogue(value)
      #応答メッセージを表示
      response_area.configure(text=response)
      #入力文字列引数にしてputlog()を呼ぶ
      potlog("> " + value)
      #応答メッセージを引数にしてputlog()を呼ぶ
      putlog(prompt() + response)
      #入力エリアをクリア
      entry.delete(0, tk.END)
#==============================================================================
# 画面を描写する関数
#==============================================================================
def run():
  #グローバル変数を利用するための記述
  global entry, response_area, lb, action
  #メインウィンドウを作成
  root = tk.Tk()
  #ウィンドウのサイズを設定
  root.geometry("880x560")
  #ウィンドウのタイトルを設定
  root.title("Intelligent Agent : ")
  #フォントの用意
  font = ("Helevetica", 14)
  font_log = ("Helevetica", 11)
  #メニューバーの作成
  menubar = tk.Menu(root)
  root.config(menu = menubar)
  #「ファイル」メニュー
  filemenu = tk.Menu(menubar)
  menubar.add_cascade(label = "ファイル", menu = filemenu)
  filemenu.add_command(label = "閉じる", command = root.destroy)
  #「オプション」メニュー
  action = tk.IntVar()
  optionmenu = tk.Menu(menubar)
  menubar.add_cascade(label = "オプション", menu = optionmenu)
  optionmenu.add_radiobutton(
    label = "Responderを表示",
    variable = action,
    value = 0
  )
  optionmenu.add_radiobutton(
    label = "Responderを表示しない",
    variable = action,
    value = 1
  )
  #キャンパスの作成
  canvas = tk.Canvas(
    root,
    width = 500,
    height = 300,
    relief = tk.RIDGE,
    bd = 2
  )
  canvas.place(x=370, y=0)
  img = tk.PhotoImage(file = "img1.gif")
  canvas.create_image(
    0,
    0,
    image = img,
    anchor = tk.NW
  )
  #応答エリアを作成
  response_area = tk.Label(
    root,
    width = 500,
    height = 10,
    bg = "yellow",
    font = font,
    relief = tk.RIDGE,
    bd = 2
  )
  response_area.place(x=370, y=305)
  #フレームの作成
  frame = tk.Frame(
    root,
    relief = tk.RIDGE,
    borderwidth = 4
  )
  #入力ボックスの作成
  entry = tk.Entry(
    frame,
    width = 70,
    font = font
  )
  entry.pack(side = tk.LEFT)
  entry.focus_set()
  #ボタンの作成
  button = tk.Button(
    frame,
    width = 15,
    text = "話す",
    command = talk
  )
  button.pack(side = tk.LEFT)
  frame.place(x=30, y=520)
  #リストボックスを作成
  lb = tk.Listbox(
    root,
    width = 42,
    height = 30,
    font = font_log
    )
  #縦のスクロールバーを作成
  sb1 = tk.Scrollbar(
    root,
    orient = tk.VERTICAL,
    command = lb.yview
  )
  #横のスクロールバーを作成
  sb2 = tk.Scrollbar(
    root,
    orient = tk.VERTICAL,
    command = lb.xview
  )
  #リストボックスとスクロールバーを連動させる
  lb.configure(yscrollcommand = sb1.set)
  lb.configure(xscrollcommand = sb2.set)
  #grid()でリストボックス、スクロールバーを画面上に配置
  lb.grid(row = 0, column = 0)
  sb1.grid(row = 0, column = 1, sticky = tk.NS)
  sb2.grid(row = 1, column = 0, sticky = tk.EW)
  #メインループ
  root.mainloop()
#==============================================================================
# プログラムの起点
#==============================================================================
if _name_ == "_main_":
  run()
 
- 実行結果 -
Traceback (most recent call last):
  File "ptnaForm.py", line 179, in <module>
    if _name_ == "_main_":
NameError: name '_name_' is not defined
 
写経を続けたものの '_name_' が定義されていないので、エラーで返って来ているのは理解できるが、問題はどのように定義したらいいのかという事。エラーの改善法を頑張って見つけたいと思います。

人工知能開発へ

Pythonを一通り勉強し終わったので、人工知能を開発するために、参考書の写経を始め、プロトタイプの作成を短時間で終わらせることが出来た。

 

<prototype.py>

# coding: Shift-JIS
class Ptna:
 """ピティナの本体のクラス
 """
 def __init__(self, name):
  """Ptnaオブジェクトの名前をnameに格納
   Responderオブジェクトを生成してresponderに格納
   @param name Ptnaオブジェクトの名前
  """
  self.name=name
  self.responder=Responder("What")
 def dialogue(self, input):
  """応答オブジェクトのresponse()を呼び出して
   応答文字列を取得する
   @param input ユーザーによって入力された文字列
   戻り値 応答文字列
  """
  return self.responder.response(input)
 def get_responder_name(self):
  """応答オブジェクトの名前を返す
  """
  return self.responder.name
 def get_name(self):
  """Ptnaオブジェクトの名前を返す
  """
  return self.name
class Responder:
 """応答クラス
 """
 def __init__(self, name):
  """Responderオブジェクトの名前をnameに格納
   @param name Responderオブジェクトの名前
  """
  self.name=name
 def response(self, input):
  """応答文字列を作って返す
   @param input 入力された文字列
  """
  return "{}ってなに?".format(input)
from ptna import *
#########################################################################################################################
#実行ブロック
#########################################################################################################################
def prompt(obj):
 """ピティナのプロンプトを作る関数
  戻り値 "Ptnaオブジェクト名:応答オブジェクト名 > "
 """
 return obj.get_name() + ":" + obj.get_responder_name() + "> "
print("Ptna System prototype : ptna") # プログラムの情報を表示
ptna = Ptna("ptna")
while True:
 inputs = input(" > ")
 if not inputs:
  print("バイバイ")
  break
 response = ptna.dialogue(inputs) # 応答文字列を取得
 print(prompt(ptna), response) # プロンプトと応答文字列をつなげて表示
 
<ptna.py>
# coding: Shift-JIS
from responder import *
class Ptna:
 """ピティナの本体のクラス
 """
 def __init__(self, name):
  """Ptnaオブジェクトの名前をnameに格納
   Responderオブジェクトを生成してresponderに格納
   @param name Ptnaオブジェクトの名前
  """
  self.name=name
  self.responder=RandomResponder("Random")
 def dialogue(self, input):
  """応答オブジェクトのresponse()を呼び出して
   応答文字列を取得する
   @param input ユーザーによって入力された文字列
   戻り値 応答文字列
  """
  return self.responder.response(input)
 def get_responder_name(self):
  """応答オブジェクトの名前を返す
  """
  return self.responder.name
 def get_name(self):
  """Ptnaオブジェクトの名前を返す
  """
  return self.name
 
<responder.py>
# coding: Shift-JIS
import random
class Responder:
 """ 応答クラスのスーパークラス
 """
 def __init__(self, name):
  """ Responderオブジェクトの名前をnameに格納
   @param name Responderオブジェクトの名前
  """
  self.name=name
 def response(self, input):
  """ オーバーライドを前提としてresponse()メソッド
   @param input 入力された文字列
   戻り値 空の文字列
  """
  return " "
 def get_name(self):
  """応答オブジェクトの名前を返す
  """
  return self.name
class RepeatResponder(Responder):
 """オウム返しのための行うサブクラス
 """
 def response(self, input):
  """ 応答文字列を作って返す
   @param input 入力された文字列
  """
  return "{}ってなに?".format(input)
class RandomResponder(Responder):
 """ ランダムな応答のための行うサブクラス
 """
 def __init__(self, name):
  """ Responderオブジェクトの名前を引数にして
   スーパークラスの__init__()を呼び出す
   ランダムに抽出するメッセージを格納したリストを作成
   @param name Responderオブジェクトの名前
  """
  super().__init__(name)
  self.responses=["いい天気だね","君はパーリーピーポー","10円拾った"]
 def response(self, input):
  """ 応答文字列を作って返す
   @param input 入力された文字列
   戻り値 リストからランダムに抽出した文字列
  """
  return (random.choice(self.responses))
 
この3つのファイルの絡みは、データベースの講義を受けたことがあり、かなり理解が出来ているため。難なく、理解は出来た。
問題は、個々のファイル内の記述である。これを理解するためには、このまま突き進み、一通り参考書を終えて、また戻ってこれば徐々に理解出来ると思う。なので、理解をしようとするのではなくとりあえず受け止めよう。
 
<実行結果>
Ptna System prototype : ptna
 > こんにちは
ptna:Random>  いい天気だね
 > そうだね
ptna:Random>  君はパーリーピーポー
 > まじで
ptna:Random>  10円拾った
 > 良かったね
ptna:Random>  いい天気だね
 > 夜だよ
ptna:Random>  いい天気だね
 > そうだね
ptna:Random>  10円拾った
 > 良かったね
ptna:Random>  10円拾った
 >
バイバイ
 
なんか、これを続けていけば人工知能を開発出来るようになるんだと思って勉強しているので、ワクワクしてしょうがない。
 

ライフガード Becoming a lifesaver

東京へ引っ越し後の資金を調達するため。また、欲しかったモノを買うために、プールの監視員+トレーニングジムのトレーナーのアルバイトを始めた。


まだ、始めて3日目だけれど、プールの仕事は、ほぼほぼ覚えてしまってスムーズに仕事が出来るようになった。スタッフなので、トレーニングジムとプールがタダで使えるから、もう至れり尽くせり。


本題は、ここでは無くて、プールの監視員として働いている以上、事故を目撃する可能性がある。その為、溺者の救助、傷病者への手当て、心肺蘇生や人工呼吸、AEDなど。普通に生活していたら、経験出来ずに、身につくこともない。


しかし、僕はアルバイトと言う形ではあるが、人命救助の指導を受けている。

本当にここで仕事を始めてよかったと思う。何か起きた時に傍観者でいる自分は想像出来ないし、何か起きた時には即座に行動に移せる男になりたい。


ここまで自分は、色々な人に支えられて生きてきた。確かに、酷い事をしている人もいる。人を傷つける人もいる。

自分は、空が飛べるようなヒーローにはなれないけれども、ヒーローと呼ばれたい訳でもないけれども、ただ人を救える立場でありたい。ただそれだけ。人を傷つける事しか出来ない人間たちには出来ない、人を救うと言う事。これは、自分の使命だと肝に命じて。今ここに五体満足で生きていられる事に感謝をして、これからも全力で人命救助の指導を受けて行きます。


そして、どんな形であろうと、人を救える人を増やしていきたいです。しっかり覚えて、家族、大切な人たちをしっかり護れるように。体づくりも!

さて、プログラミング勉強しますか!!!


人は感謝を忘れてしまった途端、人ではなくなる。