カテゴリー: tech

  • Python の set を使って重複要素を簡単に削除する

    Python の set を使って重複要素を簡単に削除する

    本記事では、Python の set を使用して、リストや他のコレクションから重複要素を効率的に削除する方法について説明します。 また、set による重複削除の使い所や、別のやり方で重複を削除する方法についても触れます。

    Python の set とは?

    Python の set は、順序がなく、ユニークな要素のみを格納するデータ構造です。 それぞれの要素は一度だけ現れます。したがって、set() を使うことで、自動的に重複が削除されることになります。 set を使った重複要素の削除 リストや他のコレクションから重複要素を削除するには、次のように set を使います。

    original_list = [1, 2, 2, 3, 4, 4, 5]
    
    # 重複要素を削除
    unique_list = list(set(original_list))
    
    print(unique_list) # 出力: [1, 2, 3, 4, 5]

    この例では、original_list から重複要素を削除するために、リストを set に変換し、その後再度リストに戻しています。

    使い所

    set を使った重複要素の削除は、以下のようなシチュエーションで役立ちます。 データ解析や前処理で、重複するデータポイントを削除する必要がある場合 ユーザーからの入力データに重複がある場合 データベースや CSV ファイルから取得したデータで、重複したレコードを削除する必要がある場合

    他の重複削除の方法

    set 以外にも、Python では重複要素を削除する方法がいくつかあります。例えば、次のような方法が挙げられます。

    リスト内包表記と if 文を使った方法

    リスト内包表記と if 文を使って、リストから重複要素を削除することもできます。

    original_list = [1, 2, 2, 3, 4, 4, 5]
    
    unique_list = []
    [unique_list.append(x) for x in original_list if x not in unique_list]
    
    print(unique_list) # 出力: [1, 2, 3, 4, 5]

    ただし、この方法はリストの要素数 が大きい場合には、パフォーマンスが低下することがあります。なぜなら、リストの要素を一つずつチェックして重複を削除するため、計算量が増えるからです。

    辞書を使った方法

    辞書を使って、リストから重複要素を削除することもできます。

    original_list = [1, 2, 2, 3, 4, 4, 5]
    
    unique_list = list(dict.fromkeys(original_list).keys())
    
    print(unique_list) # 出力: [1, 2, 3, 4, 5]

    この方法では、リストの要素を辞書のキーとして利用し、dict.fromkeys() を使って新しい辞書を作成します。 その後、keys() メソッドで辞書のキーを取得し、リストに変換します。 ただし、これらの方法は、元のリストの要素がハッシュ可能(つまり、辞書のキーとして使用できる)であることが前提です。 ハッシュ不可能な要素が含まれる場合、set など他の方法で重複を削除する必要があります。

    まとめ

    Python の set を使って、リストや他のコレクションから重複要素を効率的に削除する方法を紹介しました。 また、set による重複削除の使い所や、別のやり方で重複を削除する方法についても触れました。 データ解析や前処理など、様々なシチュエーションで重複要素の削除が求められるため、set などの適切な手法を選択することが重要です。

  • Pythonのforループで現在のループが全体のレコードのうち何レコード目かを知る方法

    Pythonのforループで現在のループが全体のレコードのうち何レコード目かを知る方法

    Pythonのforループで、全体のレコード数が分かっている場合、現在のループが全体のレコードのうち何レコード目かを知ることができます。この記事では、PandasのDataFrameオブジェクトを例に、Pythonのforループで現在のループが全体のレコードのうち何レコード目かを知る方法を解説します。

    方法1:enumerate()を使用する方法

    PandasのDataFrameオブジェクトの場合、以下のようにenumerate()を使用して、現在のループが全体のレコードのうち何レコード目かを取得することができます。

    row_count = df.shape[0]
    
    for i, row in enumerate(df.values):
    print(i + 1) # 現在のレコード数
    print(row_count) # 全体のレコード数

    上記のコードでは、enumerate()を使用してループの各回数を取得し、iという変数に代入しています。そして、ループ内で現在のループが何レコード目なのかを知りたい場合は、i + 1をすればよいです。+1をすることで、インデックス0から始まるPythonの慣習に従い、1から始めることができます。

    方法2:len()とrange()を使用する方法

    enumerate()を使用せずに、以下のようにlen()関数を使用してデータフレームの行数を取得し、ループ内でカウント変数を使用して現在のループが全体のレコードのうち何レコード目かを知ることができます。

    row_count = len(df.index)
    count = 1
    
    for row in df.values:
    # 現在のレコード数と全体のレコード数を出力する
    print(count, "/", row_count)

    # ループ内の処理 count += 1 上記のコードでは、len(df.index)を使用してデータフレームの行数、つまりレコード数を取得し、カウント変数countを使用して現在のループが全体のレコードのうち何レコード目かを数えています。また、ループ内では、countとrow_countを出力して、現在のループが全体のレコードのうち何レコード目かを知ることができます。

    まとめ

    Pythonのforループで現在のループが全体のレコードのうち何レコード目かを知るには、enumerate()を使用する方法と、len()range()を使用する方法があります。 enumerate()を使用する方法は、ループの各回数を取得して、現在のループが何レコード目かを知ることができます。 len()range()を使用する方法は、データフレームの行数を取得して、カウント変数を使用して現在のループが何レコード目かを数えることができます。 どちらの方法を使用するかは、データフレームの行数やループ内の処理内容によって異なります。 enumerate()を使用する場合は、行数が多い場合でも効率的に処理することができますが、len()range()を使用する場合は、行数が多い場合にはパフォーマンスに影響することがあります。 また、enumerate()を使用する場合は、i + 1を使用することで、Pythonの慣習に従ってループの行番号を1から始めることができます。 以上が、Pythonのforループで現在のループが全体のレコードのうち何レコード目かを知る方法の解説でした。

  • PandasのTimestampオブジェクトでNaTTypeエラーを回避する

    PandasのTimestampオブジェクトでNaTTypeエラーを回避する

    PandasのTimestampオブジェクトを使用して日付データを操作する際、不適切なデータが含まれていると、NaTTypeエラーが発生することがあります。 この記事では、PandasのTimestampオブジェクトでNaTTypeエラーを回避する方法について説明します。 (さらに…)

  • Flask と Quart 比較: どちらを選ぶべきか?

    Flask と Quart 比較: どちらを選ぶべきか?

    近年、Flask 以外に Quartも python で API を作る時に選ばれるようになってきました。 それぞれの特徴をまとめます。

    項目 Flask Quart
    作者 Armin Ronacher Philip Jones
    公開年 2010 2017
    ライセンス BSD MIT
    非同期対応 部分的 (サードパーティ製の拡張機能) ネイティブ (async/await 対応)
    コミュニティ 大規模で安定 より小規模で成長中
    ドキュメントの充実度 高い 中程度
    日本語のドキュメント数 多い 少ない
    GitHubのStarの数 55,000以上 (2021年9月時点) 3,000以上 (2021年9月時点)
    対象ユーザー 初心者〜上級者 中級者〜上級者

    Flask はより充実したドキュメントと多くの日本語ドキュメントがあり、GitHub のスター数も多いため、初心者にも中級者や上級者にも適しています。 一方、Quart はドキュメントの充実度がやや劣り、日本語ドキュメントも少ないため、中級者や上級者に向いています。

    サンプルコード

    /hello を叩かれたら、hello world と表示するだけのサンプルコードは以下の通りです   Flask の例:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/hello', methods=['GET'])
    def hello():
    return 'hello world'
    
    if __name__ == '__main__':
    app.run()

    Quart の例:

    from quart import Quart
    
    app = Quart(__name__)
    
    @app.route('/hello', methods=['GET'])
    async def hello():
    return 'hello world'
    
    if __name__ == '__main__':
    app.run()

    Flask はシンプルで軽量なフレームワークで、大きなコミュニティがありますが、非同期処理には部分的な対応しかしていません。 一方、Quart は非同期処理にネイティブで対応しており、より効率的なアプリケーション開発が可能ですが、コミュニティはまだ成長中です。 どちらを選ぶかは、プロジェクトの要件と開発チームの好み、そしてチームメンバーの技術レベルによって異なります。 非同期処理のサポートが重要な要素であれば、Quart の方が適しているかもしれません。   一方、初心者向けのサポートや豊富なリソースが重要であれば、Flask が良い選択肢となるでしょう。

  • Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘json’ from ‘itsdangerous’ (/var/task/itsdangerous/init.py)

    以下は、「Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘json’ from ‘itsdangerous’ (/var/task/itsdangerous/init.py)」に対する解決方法についてのブログ記事です。

    Lambda関数でPythonコードを実行する際に、依存ライブラリのバージョンによって、Runtime.ImportModuleErrorエラーが発生することがあります。

    この記事では、そのうちの1つである「itsdangerous」ライブラリのバージョンに関連するエラーについて解説します。

     

    上記のエラーは、Lambda関数に必要な「itsdangerous」ライブラリが、Lambda環境で正しく動作しないために発生します。

    特に、このエラーは「json」という特定の名前の属性をインポートできないという意味です。

     

    この問題を解決するには、Lambda関数の環境を構成し、互換性のあるバージョンの「itsdangerous」ライブラリを使用する必要があります。

    まず、既存のrequirements.txtファイルに以下のように「itsdangerous」ライブラリをバージョン指定して追加してください。

    itsdangerous==2.0.0

    次に、依存関係を更新する必要があります。Lambda関数のデプロイパッケージ内に既にライブラリがある場合は、パッケージを再度構築する必要があります。以下のコマンドを使用してパッケージを再構築してください。

    pip install -r requirements.txt

    これにより、指定されたバージョンの「itsdangerous」ライブラリがインストールされ、Lambda関数で使用できるようになります。この手順を実行することで、「itsdangerous」ライブラリのバージョンに関連するエラーを解決することができます。

    ただし、Lambda関数で発生するエラーは様々な種類があり、問題の原因を特定することが困難な場合があります。この場合、Lambda関数のログを確認して、詳細な情報を取得することをおすすめします。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘soft_unicode’ from ‘markupsafe’ (/var/task/markupsafe/__init__.py) Traceback (most recent call last):

    以下は、Lambda関数で「markupsafe」ライブラリのバージョンに関連するエラーが発生した場合の対処法についてより自然な文面でまとめたものです。

    このエラーを解決するには、Lambda関数で使用される「markupsafe」ライブラリのバージョンを明示的に指定し、互換性のあるバージョンを使用する必要があります。まず、Lambda関数の「requirements.txt」ファイルを確認し、以下のように「markupsafe」ライブラリのバージョンを指定することで、互換性のあるバージョンがインストールされることを確認できます。

    Copy code
    markupsafe==1.1.1

    次に、Lambda関数に必要な依存関係を更新するために、次のコマンドを実行します。

    pip install -r requirements.txt

    これにより、指定されたバージョンの「markupsafe」ライブラリがインストールされ、Lambda関数で使用できるようになります。この手順を実行することで、このエラーを解決することができます。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘escape’ from ‘jinja2’ (/var/task/jinja2/__init__.py)

    以下は、Jinja2 ライブラリのバージョンに互換性の問題がある場合に発生するエラーについての対処法についての説明です。

    Runtime.ImportModuleError エラーが発生した場合、Lambda 環境で使用される Jinja2 ライブラリのバージョンに互換性の問題がある可能性があります。この問題を解決するには、互換性のあるバージョンの Jinja2 を使用するように環境を構成する必要があります。

    まず、requirements.txt ファイルを確認して、Jinja2 のバージョンが明示的に指定されているかどうかを確認し、以下のようにバージョンを指定します。

    Copy code
    Jinja2==2.10.1

    次に、Lambda 関数にデプロイされる依存関係を更新し、Lambda 関数を再デプロイします。これにより、互換性のあるバージョンの Jinja2 がインストールされ、エラーが解消されるはずです。

    もし最新バージョンの Jinja2 を使用している場合、互換性の問題が発生する可能性があるため、古いバージョンを使用するか、コードを更新する必要があります。それでもエラーが解決しない場合は、Lambda 関数のログを確認し、原因を特定する必要があります。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘BaseRequest’ from ‘werkzeug.wrappers’ (/var/task/werkzeug/wrappers/__init__.py)

    Flask と Werkzeug ライブラリのバージョンに互換性の問題がある場合に発生するエラーについての対処法についての説明です。

    Flask==1.1.2
    Werkzeug==0.16.1

    次に、Lambda 関数にデプロイされる依存関係を更新し、Lambda 関数を再デプロイします。

    これにより、互換性のあるバージョンの Flask と Werkzeug がインストールされ、エラーが解消されるはずです。

     

    もし最新バージョンの Flask と Werkzeug を使用している場合、互換性の問題が発生する可能性があるため、古いバージョンを使用するか、コードを更新する必要があります。それでもエラーが解決しない場合は、Lambda 関数のログを確認し、原因を特定する必要があります。

     

  • Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考:書評

    Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考:書評

    開発者向けの書籍『Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考』を読みました。 本記事では、本書の要点と私の感想も交えてまとめていきます。   この本は初心者から経験豊富なエンジニアまで幅広い読者にとって有益ですが、現実の開発現場ではさまざまな要因が影響を与えるため、適切な判断と柔軟な対応が必要かと思います。  

    はじめに

    近年、ソフトウェア開発の現場では、品質の高いコードを書くことが求められています。 本書『Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考』は、開発者が品質の高いコードを書くための考え方や技術を網羅的に紹介しており、現場で直接活用できる内容が多く含まれています。

    章ごとの要点

    以下に、本書の各章ごとの要点をまとめます。

    第1章: 良いコードと悪いコードの基本的な考え方

    この章では、良いコードと悪いコードの定義やそれらを判断する基準について解説されています。 良いコードとは、可読性、保守性、拡張性が高く、効率的で堅牢なコードのことをこの本では指しています。 一方、悪いコードは、読みにくく、保守や拡張が困難で、パフォーマンスや安全性に問題があるということが特徴です。

    第2章: コード品質を向上させるためのプログラミング原則

    この章では、SOLID原則やDRY原則など、コード品質を向上させるためのプログラミング原則が紹介されています。 これらの原則を遵守することで、可読性や保ち続性、拡張性が高いコードを実現することができます。

    第3章: リファクタリングによるコード改善

    リファクタリングは、コードの構造を変更することなく、可読性や保守性を向上させる手法です。 この章では、リファクタリングの重要性や具体的な手法が紹介されており、Martin Fowlerの「リファクタリング」などの他の資料とも相互補完的な関係があります。

    第4章: チームでのコード品質向上

    チームでのコード品質向上のための取り組みとして、コードレビューやペアプログラミングが紹介されています。 また、コーディングスタイルの統一やドキュメントの整備など、チーム全体での品質向上に役立つアプローチも解説されています。

    第5章: テスト駆動開発と自動化

    この章では、テスト駆動開発(TDD)と自動化の重要性が説明されています。 TDDは、テストを先に書くことで、コードの品質と保守性を向上させる開発手法です。 また、自動化により、ビルドやテスト、デプロイの効率化が実現されます。  

    感想

    私の感想として、本書は非常に読みやすく、実践的な内容が多く含まれているので、ソフトウェアエンジニアにとって有益な1冊だと思います。 特に、SOLID原則やリファクタリングに関する部分は、現場で直接活用できる知識が豊富に紹介されていて、非常に役立ちます。 ただし、実際の開発現場ではさまざまな要因が影響を与えるため、本書の内容を鵜呑みにせず、適切な判断と柔軟な対応が必要です。 また、開発者は継続的な学習やスキルの向上を心がけることが重要であり、本書を参考にしつつ、自身の経験や状況に応じて最適な方法を見つけることが求められます。 ただし、以下の部分は気になりました。

    • 一部の章が他の資料と重複している: 本書の内容の一部は、他の書籍や資料と重複しているため、すでにそれらを読んでいる読者にとっては新規性が低い場合があります。
    • 初心者向けの内容が少ない: 本書は経験豊富なエンジニア向けの内容が多く、初心者にとっては難解である可能性があります。
    • 個々のケースに対する具体的な解説が不足している: 本書では、一般的な原則や技術が紹介されていますが、特定のケースに対する具体的な解説が不足しているところがあるように感じました。
    • 実践のしやすさに関する懸念: 本書では多くの実践的な指南が提供されていますが、これらをすぐに現場で実践することが容易でない場合もあります。例えば、既存のプロジェクトで多くの技術的負債がある場合や、組織の文化が変更に抵抗する場合などです。このような状況では、開発者は段階的に改善を進めることや、組織全体の意識改革を促すことが重要です。
    • 学習の効果に関する懸念: 本書を読むことで、多くの知識や技術を習得できる可能性がありますが、それらを継続的に練習し、実際の開発現場で活用できるようになるまでには、時間と努力が必要かと思います。開発者は、継続的な学習やスキルの向上を心がけるとともに、定期的に知識を見直し、新たな技術や手法を取り入れることが重要と感じました。

    まとめ

    『Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考』は、ソフトウェア開発者にとって有益な書籍であり、多くの実践的な知識や技術が紹介されています。ただし、実際の開発現場ではさまざまな要因が影響を与えるため、適切な判断と柔軟な対応が求められます。 最後に、開発者は本書を参考にしつつ、自身の経験や状況に応じて最適な方法を見つけることが重要です。組織全体で品質向上の取り組みを行い、継続的なスキルアップを目指すことで、持続可能な開発を実現できるのではないかと感じました。  

  • WARNING: The command completed successfully but no settings of ‘sumito.tsukada’ have been modified.

    概要

    powershell を叩いて以下のようなエラーが発生した

    WARNING: The command completed successfully but no settings of 'sumito.tsukada' have been modified.

    調査した結果

    この警告メッセージは、PowerShellで実行されたコマンドが正常に完了したものの、

    「sumito.tsukada」という設定が変更されなかったことを示しています。

    つまり、コマンドは実行されましたが、特定の設定の変更が実際には行われなかった、または変更する必要がなかったということのようです。

    調査した限り、このような状況は、以下のような場合に発生することがあります。

    1. コマンドが正しく実行されましたが、既に設定されている値と同じ値が指定されたため、実際には変更がなかった。
    2. コマンドが正しく実行されましたが、条件に一致する設定が見つからなかったため、変更が行われませんでした。
    3. コマンドが何らかの理由で適用されるべき設定を見逃してしまった。

    この警告メッセージに対処するには、コマンドを再確認し、正しい設定が適用されるように修正するか、

    既に適切な設定がされている場合は、この警告メッセージを無視しても問題ありません。

    ただし、期待した変更が正しく適用されているかどうかを確認するために、関連する設定やログをチェックすることが推奨されているようです。