AIっておもしろい?

離職者等再就職訓練でAIを勉強するブログです

存外忙しい

月末だからなのか、

訓練外のことで引き回されている感じで

忙しくて困ります。

 

就職とかに関わる部分なので、

仕方ないです。

むしろありがたい。

 

今日の授業は、予想通り、全部復習でした。

若干新しいこともありましたが、

派生レベルですね。

 

あしたは月一の休校日です。

先週、三連休があったのに、

また三連休です。

明けてテストがあるようなので、

休み中にしっかりと予習したいといけませんね。

 

そんなこんなで、

今日も大したことは書けません。

悪しからず。

 

次回予告

連休中の復習をここにまとめて書きたい

とは思っています。。。

ひと休み

今日は急に予定が入ってしまったので、
ブログはちょびっとだけします。

授業はクラスの継承とか、高度なクラスの使用方法などをやっておりました。
標準クラスなどもあり、
これでざっくり、言語の説明自体はおわりかな?
って感じ。

クラスの雰囲気的に、ついてこれていない人がいそう。
授業の方も、ひと休みか?

次回予告

たぶん、授業は復習につぐ復習でしょう。
ワタシも復習せねばばば。

体調重視

寒暖の差と

コロナ騒ぎで

なんか体調がイマイチです。

 

休むと

医者の診断書が必要になるし、

授業についていけなくなるので、

なんとか騙し騙しいきます。

 

授業は「メソッド」「クラス」「オブジェクト指向」と

だんだん深淵部に入ってきた感じがあります。

ここまでくると、Javaとの違いとかも結構出てきました。

 

理解している範囲で少しずつ

その違いについて書いていきたいと思います。

 

 

pythonは自由だ!

今回は関数・メソッド編。

pythonの関数・メソッドはかなり自由です。

 

そもそも、Javaにおいては、関数もメソッドも

クラス内で定義されるという点で大差ない認識です。

pythonにおいては、関数とメソッドの違いはクラスに属するか属しないかによります。

クラスに属しないのが、関数。

クラスに属するのが、メソッドです。

 

関数には、無名関数「lambda」というものがあり、

これはC言語で見たことがある気がします(うろ覚え)。

メソッドは、振る舞いやスコープなどJavaと同じ感じ。

JavaScript の function と考えると、まぁ、違和感はありません。

 

で、

その関数・メソッドですが、

引数、戻り値が自由です。

 

まずは、引数。

python型推論なので、当然のように引数に型を指定しません。

自由です。

「*」をつけることで、任意の数を引数にできます。

自由です。

「変数名 = 初期値」

を引数に定義しておくと、呼び出す側はそこに値を設定しなくてもよいです。

自由です。

 

続いて、戻り値。

Javaだけでなく、ほとんどの言語は

戻り値を1つだけしか設定できません。

pythonは、戻り値を複数設定し、タプルとしてまとめて返すことができます。

自由です。

まぁ、Javaも、戻り値を List とかのコレクションにしてしまえば、

まとめて返せるので、それは大きなインパクトではない気がします。

 

にしても、

python 自由だなぁ。

読むのが大変そう。。。

 

 

次回予告

引き続き、Javaとの比較で気になったところを書いていきたいと思います。

授業はざんざん進みます。

情報量が多すぎて、そろそろ

「とりあえず、わかったことにしておこう」

となりそうです。

でも、新しいことって楽しいなぁ。

 

 

 

大反省と面白くない話

まず反省

木曜日の日記が更新できていませんでした。
スマホで下書きしたまま、投降したつもりになっていたのが、原因です。
気を付けないと。。。


さて、
きのうは、「ジョブカードの作成」ということで、
事前に作成、提出した履歴書と職務経歴書をアドバイスしていただける日です。
授業はなく、教室を運営する会社のおそらく営業の方と1対1の面談が15分程度で、あとは自習。
自習用の問題集が渡されることもなく、すべからく自習。
仕方がないので、ネットで拾ってきた問題を解くことにします。

面談

ワタシはIT業界経験者ということで、
職務経歴書も書き慣れており、ボリュームもそこそこあるので、
扱い的には「即戦力」というカテゴリーに入ります。

面談では、まず授業の感想などを聞かれ、
どういう内容、条件で就職を考えているのかを聞かれます。

以下は、個人的な感想です。
否定でも、上から目線のつもりでもありません。
最近、SNS界隈で即食いついてこられる方が多くみられるので、予防線を張らせていただきます。

諸々正直にお話をしましたが、
残念ながら先方には熱意を感じませんでした。
一日に何人もの面談をしなければならないから、大変だとは理解しますが、
こちらが想定をしていた、相談者と回答者の関係ではなく、
安く買い叩こうとされているような印象を受けました。
今後の対応スタンスを検討させていただきたいと考えています。

自習

ボーっとしていても仕方がないので、
問題集を漁ります。

以前より、コーディングの練度を上げることを目的として、
以下のサイトを使用しています。

paiza.jp

paiza の「ラーニング」はさまざまな言語に対応し、
レベルに応じた問題を提供しています。
Aレベル以上は、言語関係なく、ロジックの問題のような気がします。
言語の復習をするなら、Cレベル反復がおすすめです。

次回予告

週末は三連休です。
そして、来週は28日が休校日。
つまり、来週は3日しか授業がありません。
こりゃ、のんびりかなぁ。

所用のため、超短文

今日の授業は、半分以上が復習。

 

まあ、そりゃそうですよねー。

復習で同じようなことをやっても、

まだまだ同じような質問が飛ぶ状況ですもの。

 

もちろん、

ワタシも半分くらいしか飲み込めてません、ハイ。

そんなに頻繁に使う物でもないから、

なんとなくわかっておけば良いかな。

 

次回予告

あしたは就職相談で、一日中自習です。

暇つぶしできる問題探しておかなきゃです。

 

壁にぶち当たりました

今日の授業は難解でした。

たぶん、しっかり理解できている人は、半数に満たないんじゃないかな?
満たない側の人間です、はい。

Javaではまず見ない、できないことなので、
「これぞ、python!」
といったところでしょうか?

デコレータ

なにに詰まったかというと、
「デコレータ」
です。

デコレータを一言でいうと、
「ほかの関数に機能を追加する」
「ある関数を修飾するための関数とその仕組み」
「すでにある関数に処理の追加や変更を行う為の機能」
だそうです。

ヨクワカラナイ

形式としては

@追加機能を修飾するデコレータ関数名
def 機能を追加される関数名

とのこと。

例を挙げると

def deco(func) :
    def wrapper(x) :
        wx = "---" + x + "---"
        return func(wx)
    return wrapper

@deco
def printmsg(x) :
    print(x, "を入力しました。")

str = input("メッセージを入力してください。")

printmap(str)

printmsg() を実行する際に、
deco()が呼ばれて、
wrapper()が呼ばれて、
wrapper()のなかで、printmsg()が呼ばれる
カンジ?

複雑です。

いくつか参考になりそうなサイトを見てみます。

qiita.com
www.sejuku.net

う~~~ん

わかったような、わからないような。。。


聞いた話によると、
モジュールに用意されているデコレート関数を使って、
自前の関数(機能を追加される関数)を拡張する用途で使われるらしい。

なんとなく理解。
した、つもり。

いま、これ以上考えても飲み込めなそうなので、
時間をかけて咀嚼することにします。

次回予告

たぶん、あしたもデコレータの復習に時間がとられると予想。
明日には理解できることを期待します!
がんばれ、あしたのワタシ!!

あ、あと、ラムダ式もイマイチしっくりこないんですよね(笑

なんとなくWebスクレイピング

今日の授業は、ほぼ復習でした。

「リスト」「タプル」「ディクショナリ」「セット」
このあたりの再読と確認テスト。

意外と紙に書くタイプのテストだと、
スペルミスとかありえるので、どきどき。

解答例にない書き方をして、一時はNGになったものの
実際にコーディングしたら動いたので、OKにしたり、
なんか学生みたい(笑

最後の一時間で、「関数」に突入。
pythonの関数って、引数と戻り値が自由すぎる!
どこかでJavaと比較したものを整理したいです。
どこかで、ね。

totoスクレイピング

さて、ここからは前回の続き。

JRAに挫折し、totoのサイトをスクレイピングできないかチャレンジします。

https://store.toto-dream.com/dcs/subos/screen/pi04/spin011/PGSPIN01101InitLotResultLsttoto.form


試合結果のページを眺めながら、目標設定をします。

目標
『回数を指定し、対象のページから結果をスクレイピング
 CSVファイルに出力する』

教材っぽい目標ですね。
学習観点でいうと、学びポイントは以下。
・HTML文字列の取得
・パーサークラスを使って、対象データを抽出
・複数ページを走査
CSVファイルにデータ出力

ソースの紹介

とりあえず出来上がったコードは以下。
※行数が表示できると見やすいですね。
 近日、方法を探してみます。

## totoデータ取得 ##
## 清書版 ##

import csv
import urllib.request
from html.parser import HTMLParser

# パーサークラス
class local_HTMLParser(HTMLParser):
    # 初期化メソッド
    def __init__(self):
        HTMLParser.__init__(self)

        # クラス内変数の初期化
        self.table = False
        self.title = False
        self.tr = False
        self.table_cnt = 0
        self.row = []
        self.rows = []

    # 開始タグ取得メソッド
    def handle_starttag(self, tag, attrs):
        # table
        if ( tag == "table" ) and ( len(attrs) == 5 ) and  ( attrs[4][1] == "adjustment" ) :
            self.table_cnt += 1

        if self.table_cnt == 1 :
            self.table = True
        else :
            self.table = False

        # tr
        if ( self.table == True ) and ( tag == "tr" ) :
            if ( len(attrs) == 1 ) and ( attrs[0][1] == "backgray" ) :
                self.tr = True
            else :
                self.tr == False

    # データ取得メソッド
    def handle_data(self, data):
        # タイトル取得
        if self.table == True and self.title == False:
            # toto が実施された回だけデータ取得
            if "回 toto くじ結果" in data :
                self.title = data[1:5]

        # データ取得
        elif self.table == True and self.title != "" and self.tr == True :
            # toto は1回13試合を予想
            ROW_NUM = 13
            # カラム数
            COLMUN_NUM = 7
            
            # データを格納
            dat = data.strip()
            if len(self.rows) < ROW_NUM and dat != "" :
                if len(self.row) < COLMUN_NUM :
                    self.row.append(dat)
                else :
                    self.row.insert(0, self.title)
                    self.rows.append(self.row)
                    self.row = []
                    self.row.append(dat)
                    
## メイン 処理 ## 
# 入力
while True :
    start_time = int(input("取得開始回を入力してください(第260~):"))
    end_time = int(input("取得終了回を入力してください:"))

    if start_time <= end_time :
        break
    else :
        print("入力が不正です。\n開始 <= 終了 で入力してください。\n")

# スクレイピング
for time in range(int(start_time), int(end_time)+1) : 
    # HTML読込
    url = "https://store.toto-dream.com/dcs/subos/screen/pi04/spin011/PGSPIN01101LnkHoldCntLotResultLsttoto.form?holdCntId=" + str(time)
    page = urllib.request.urlopen(url)
    html = page.read()
    page_str = html.decode()

    # HTML解析
    p = local_HTMLParser()
    p.feed(page_str)
 
    # CSVファイル出力
    for csv_row in p.rows :
        if len(p.rows) > 0 :
            with open("C:/WORK/test_data/" + "toto_" + str(start_time) + "-" + str(end_time) + ".csv", "a", newline ="", encoding='utf-8_sig') as f:
                writer = csv.writer(f, lineterminator='\n') # 行末は改行
                writer.writerow(csv_row)

    p.close()
 
# 終了時処理
print("\n処理が終了しました")

解説というか、備忘というか

・HTML文字列の取得

 →# HTML読込
 urlを文字列にして、
 上のほうで import した、 urllib.request の urlopen() でpageを開きます。
 read() で読んだ html をdecode() するのですが、
 ここで、文字コードに注意が必要です。
 JRAのサイトをスクレイピングしたとき、ここで文字コードエラーが発生し、
  page_str = html.decode('CP932')
 としました。
 元のHTMLが s-jis で書かれているってことなんですかね?ワカッテナイ
 

・パーサークラスを使って、対象データを抽出

 →# HTML解析
 ローカルクラス local_HTMLParser を生成して、
 page_str を食わせます。
 local_HTMLParser では以下の処理をしています。
  __init__(self)
   : local_HTMLParser 内で使用する変数を定義しておきます。
    ここで定義することで、クラス内でグローバルに使えます。
  handle_starttag(self, tag, attrs)
   : パラメータの tag と atters からタグと属性を取得、判定し、
    解析を開始、終了をフラグで管理します。
    ちなみに、何とか動いてますが、この部分のアルゴリズムが汚い。。。
  handle_data(self, data)
   : 同一のサイトで「toto」「mini toto A組」「mini toto B組」「totoGoal3」の記述があるため、
     「toto」のみを取得するために、タイトルを判定しています。
     「toto」のデータ(テーブル)構成は行が13(試合)カラムは7つです。
     data.strip() と dat != "" でごみを取り除き、二次元リストに格納します。

・複数ページを走査

 →# スクレイピング
  urlの末尾が「回」の番号となっているので、
  for 文でループさせることで、複数ページを走査します。
  なお、開始回と終了回は input で任意に指定できるようにしました。
  

CSVファイルにデータ出力

 →# CSVファイル出力
 解析した p から、二次元リストを取得し、行単位でループします。
 ファイルを開いて、import した csv モジュールで行単位にCSV形式に変換し、writer で書き込みます。
 Javaと比べると、CSV形式に変換してくれたり、PrintWriter を作る必要がなかったり、
 楽です。

最後に close しているのは、ファイルではなくて、解析したHTMLです。
複数ページを走査するので、ここで close しておく必要があります。

次回予告

授業は淡々と進んでいるため、
ブログに書くネタには乏しいのが悩みです。
面白いことをかけるように、努力します。