Try T.M Engineer Blog

「アウトプットする事は大事だ」と思って初めたブログ、プログラミング、独り語り、etc

Webエンジニアへ転職後に学んだ事(2回目)

はじめに

このブログ記事は、約11年間、客先常駐で『マネジメント』をメインに続けてきて、技術力が全く無くて後悔していた人が、Webエンジニアへ転職して学んだ事を記録しておくために書いています。自身の振り返りのために書いている記事ですが、30代の方で同じような境遇で技術力が全く無くて後悔している方々にとっても「Webエンジニアになるとこんな事を勉強するんだ・・・」と雰囲気を掴んで貰えれば幸いです。

転職後2週目

1週目でPython3、AWS lambda等を(初めて)使った課題をやったわけですが、まだまだ戦力外・・・
ですが、今度は課題ではなく、保守改善の仕事を頂きました。

保守改善の仕事

課題内容:
1日1回、RSSフィードの情報を取得して、他のサイトでも展開されている情報と突合せ、情報の正確性を確認する。
(一応仕事の内容なので、曖昧な表現で書かせていただきます)

使用言語:
Python3、AWS Lambda

感想

またもやAWS Lambdaです。
使ってみて感じたのですが、AWS Lambdaは凄く便利です。何かをトリガーにして処理が動く(イベントドリブン)は、本当に画期的だと感じました。

Python3もまだまだ勉強中です。今回は初めてWebスクレイピングに挑戦しました。

ちなみに、私の知る限りPython3が得意な先輩が社内にいない・・・
(先輩もPython3を進めておきながら、自分は書かないと言っているし・・・う〜む・・・)

学んだ事

1) [AWS]実はAWS Lambdaは処理速度が遅い
当たり前かもしれませんが、個人環境(以降、ローカル環境)でLambdaを動かすのとAWSからLambdaを動かすのとでは、処理速度が全然違いました。ローカル環境では、3秒で終わる処理が、AWSだと10秒くらいかかります。
これによって何が問題なのかというと、2)になります。

2) [AWS]Lambdaには、デフォルト設定の3秒ルールがある
Lambdaのデフォルト設定では、ファンクションの実行時間は3秒になっています。
もちろん設定の変更は可能ですが、ローカル環境で処理がうまく動いたとしても、AWSへ移植した後にLambdaを動かすとTimeout Errorになる事があるので、注意が必要です。(なお、この3秒ルールはローカル環境でも同じです。しかし、1)で書いた通りローカルとAWSで処理速度に差があるので、AWSへ移植する際には注意が必要です。)

3) [Python3]RSSパースの使い方
Python3のライブラリのfeedparserを使ったのですが、上記1)と2)により、処理速度改善が必要でした。lambdaを動かした時に、どの処理に時間が掛かっているかを調べるには、AWS X-Rayを使用します。私は以下を参考にしました。

qiita.com

X-Rayの結果、RSSのパースに時間がかかっていたことがわかりました。
feedperser.pase(URL)という書き方で実装しましたが、私なりに調べた結果、以下の2つの方法で改善できました。

 1. request.getでオブジェクトを取得した後に、パースする。
 2. 別のライブラリであるspeedparserを使用する。

結果的には、2.のspeedparserを使用するのが一番処理速度が早かったです。しかし、今回はspeedparserを使用せずに、1.のrequest.getで改善しました。
(家で)処理速度も簡単に比較してみました。処理速度の結果に並はありますが、比較的speedparsrが一番早く、次にrequests.getでした。

#### [RSSパースサンプルプログラム]
import datetime
import requests
import feedparser
import speedparser

YAHOO_RSS_URL = "https://news.yahoo.co.jp/pickup/rss.xml"

def main():

    # feedparser.parse(URL)を使用
    f_start = datetime.datetime.now()
    f_yahoo_parser = feedparser.parse(YAHOO_RSS_URL)
    f_end = datetime.datetime.now()
    print("feedparser.parse(URL)を使用")
    print(f_end - f_start)

    # requests.getでオブジェクト取得後、feedparser.parseを使用
    fr_start = datetime.datetime.now()
    r = requests.get(YAHOO_RSS_URL)
    fr_yahoo_parser = feedparser.parse(r.content)
    fr_end = datetime.datetime.now()
    print("requests.getでオブジェクト取得後、feedparser.parseを使用")
    print(fr_end - fr_start)

    # speedparserを使用
    sp_start = datetime.datetime.now()
    r = requests.get(YAHOO_RSS_URL)
    sp_yahoo_parser = speedparser.parse(r.content)
    sp_end = datetime.datetime.now()
    print("speedparserを使用")
    print(sp_end - sp_start)


if __name__=='__main__':
    main()
#### [出力結果]
$ python yahoo_rss_sample.py
feedparser.parse(URL)を使用 ・・・ 3番目に早い
0:00:00.343013
requests.getでオブジェクト取得後、feedparser.parseを使用 ・・・ 2番目に早い
0:00:00.144237
speedparserを使用 ・・・ 1番早い
0:00:00.122377
$

最後に

私事ですが、昨晩、子供が産まれました。
父親として、エンジニアとして、一人前になる様、努めたいと思います。