カテゴリー: tech

  • No space left on device エラーへの対処法

    No space left on device エラーへの対処法

    概要

    今回は、Pythonパッケージのインストール時に遭遇する可能性のある一つの問題、 「No space left on device」エラーとその対処法について説明します。 このエラーが発生する場合、最初に疑うべきは、確かにストレージ容量が足りていない可能性です。 しかし、たとえストレージに十分な空き容量がある場合でも、特定の状況下ではこのエラーが発生します。その解決方法を説明します。

    解決策への道筋

    Pythonパッケージのダウンロードやインストール時に、一時的なファイルが作成されます。 これらの一時的なファイルは通常 /tmp ディレクトリに保存され、大規模なパッケージをインストールする際に /tmp の容量を超えてしまうことがあります。これがエラーの原因となります。 解決策としては、一時ファイルの保存場所を /tmp から別のディレクトリに変更します。これは、環境変数 TMPDIR を設定することで実現します:

    export TMPDIR=/var/tmp

    そして、再度パッケージのインストールを試みます:

    pip3 install --no-cache-dir accelerate

    注意点として、この変更は現在のシェルセッションにのみ適用されます。システム全体への恒久的な変更を行いたい場合は、適切な設定ファイル(例えば ~/.bashrc~/.bash_profile)に上記の export 行を追加します。

    まとめ

    本記事では、「No space left on device」エラーが発生する原因と対処法について解説しました。 この情報が皆様の問題解決の一助となり、よりスムーズにPythonを利用してビジネスを推進する助けとなれば幸いです。

  • Docker:未タグ付けイメージの効率的な削除方法

    Docker:未タグ付けイメージの効率的な削除方法

    Dockerの活用において、管理が複雑化しやすい一部分として、未タグ付け(”dangling”または”untagged”とも表現される)のイメージが存在します。 これらのイメージは新たなビルドにより生成される一方で、古いイメージのタグが剥がれることで生じます。 これらの未タグ付けのイメージが増えると、ディスクスペースの消費が増大し、リソースの効率的な使用が妨げられます。 そこで、本記事では未タグ付けのDockerイメージを一括で削除する方法について説明します。具体的な手順は以下の通りです。

    docker rmi $(docker images -f "dangling=true" -q)

    このコマンドについて詳しく見ていきましょう。

    • docker images -f "dangling=true" -q: このコマンドは、未タグ付けのイメージのIDを一覧表示します。フィルタリングオプション-fで”dangling=true”を指定し、出力オプション-qでIDのみを出力します。
    • docker rmi: このコマンドは、指定したイメージを削除します。前述のコマンドで取得したイメージIDをこのコマンドに渡します。

    このコマンドラインを実行することで、未タグ付けのイメージを効率的に削除できます。 ただし、注意すべき点として、この操作にはDockerデーモンへの管理者権限が必要です。 また、使用しているDockerのバージョンによっては、”dangling”ではなく”untagged”という語句を使用する必要があるかもしれません。 以上が、Dockerで未タグ付けのイメージを一括で削除する方法になります。 この方法を用いて、ディスクスペースの有効活用を図り、システムの効率的な運用を実現しましょう。

  • GitHub接続エラーとその解決方法

    GitHub接続エラーとその解決方法

    GitHubへの接続エラーについて書きたいと思います。これは私自身が遭遇した問題で、その解決策を共有したいと思います。

    問題の概要

    ある日、GitHubにSSH経由で接続しようとしたところ、以下のようなエラーメッセージが表示されました。

    The fingerprint for the RSA key sent by the remote host is SHA25

    このメッセージは、GitHubのサーバーから送られてきたRSAキーのフィンガープリントがSHA25と一致しないという意味です。SSHは安全な接続を確保するために、接続先のサーバーから送られてくる公開鍵のフィンガープリントを検証します。しかし、何らかの理由でフィンガープリントが一致しない場合、このようなエラーが表示されます。

    解決策

    この問題の解決策は、ssh-keygenコマンドを用いて、known_hostsファイルからGitHubのエントリを削除することです。以下のコマンドを実行します。

    ssh-keygen -R github.com

    すると、以下のようなメッセージが表示されます。

    # Host github.com found: line 50
    /Users/sumito.tsukada/.ssh/known_hosts updated.
    Original contents retained as /Users/sumito.tsukada/.ssh/known_hosts.old

    このメッセージは、known_hostsファイルからGitHubのエントリが見つかり、 削除されたことを示しています。 また、元のknown_hostsファイルの内容はknown_hosts.oldとして保存されます。 これで問題は解決し、再度GitHubに接続すると新たに公開鍵のフィンガープリントを確認するプロンプトが表示されます。 ここでyesを選択すると、新しいフィンガープリントがknown_hostsファイルに追加され、再度接続する際にはこのフィンガープリントが使用されます。

    まとめ

    今回はGitHubへのSSH接続時に遭遇したエラーとその解決策について説明しました。 この問題は、SSHのフィンガープリント検証がうまくいかない場合に発生します。 解決策はssh-keygen -Rコマンドを用いてknown_hostsから該当のエントリを削除し、再度接続することで新たなフィンガープリントを取得することです。

  • “Request_BadRequest”,”message”:”Invalid target for navigation property update. URI must target an entity.”

    “Request_BadRequest”,”message”:”Invalid target for navigation property update. URI must target an entity.”

    はじめに

    Azure Active Directory (Azure AD) は、マイクロソフトが提供するクラウドベースのディレクトリおよびアイデンティティ管理サービスです。しかし、Azure ADを使用している際にエラーが発生することがあります。この記事では、マネージャー情報の更新中に発生する一般的なエラーについて解説し、対処方法を提案します。

    エラーの概要

    以下のようなエラーメッセージが表示されることがあります。  

    err: Error updating manager: {"error":{"code":"Request_BadRequest","message":"Invalid target for navigation property update. URI must target an entity.","innerError":{"date":"YYYY-MM-DDThh:mm:ss","request-id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","client-request-id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}}

    このエラーは、マネージャー情報の更新リクエストが正しく構成されていないことを示しています。

    原因と対処法

    リクエストが不正であることを示す “Request_BadRequest” このエラーコードは、リクエスト自体に問題があることを示しています。 APIリクエストの構造やパラメータを確認し、ドキュメントに従って正しい形式でリクエストを送信してください。 更新対象として無効なターゲットが指定されていることを示す “Invalid target for navigation property update.” このメッセージは、リクエストで指定されたターゲットが無効であることを示しています。 対象となるエンティティが正しいかどうかを確認し、必要に応じて修正してください。 更新対象となるエンティティを指定するURIが必要であることを示す “URI must target an entity.” このメッセージは、正しいエンティティを指すURIが必要であることを示しています。リクエストのURIを確認し、適切なエンティティを指すように修正してください。

    まとめ

    Azure ADでマネージャー情報の更新エラーが発生した場合、エラーメッセージをよく読み、リクエストの構成やパラメータを適切に設定することで問題を解決できることがあります。

  • 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関数で使用できるようになります。この手順を実行することで、このエラーを解決することができます。