広告です。クリックいただけると励みになります。

人気記事(昨日)

    2025年11月30日

    pythonのみでwebサーバを建てる方法

    kevin-grieve-1GPfwIgvMMY-unsplash.jpg

    質問

    pythonのみでwebサーバを建てる方法


    解答

    とても良い質問です。
    Pythonだけでも、外部フレームワーク(FlaskやDjangoなど)を使わずに標準ライブラリだけでWebサーバを構築できます。
    ここでは、基本から本格的な実装まで段階的に説明します。


    ① 最も簡単な方法(HTTPサーバを一瞬で建てる)

    Python標準ライブラリの http.server モジュールを使えば、
    1行でHTTPサーバを立ち上げられます。

    python -m http.server 8000

    これで、カレントディレクトリが http://localhost:8000 でアクセス可能になります。
    静的ファイル(HTML, CSS, 画像など)を配信する簡易サーバです。


    ② Pythonコードで書く(最小限のWebサーバ)

    from http.server import HTTPServer, BaseHTTPRequestHandlerclass SimpleHandler(BaseHTTPRequestHandler):    def do_GET(self):        # ステータスコード200を返す        self.send_response(200)        # レスポンスヘッダ        self.send_header("Content-type", "text/html; charset=utf-8")        self.end_headers()        # 本文        self.wfile.write(b"<h1>Hello, Python Web Server!</h1>")# サーバ設定server = HTTPServer(('localhost', 8080), SimpleHandler)print("Server running on http://localhost:8080")server.serve_forever()

    これで http://localhost:8080 にアクセスすると “Hello, Python Web Server!” が表示されます。


    ③ POST通信などを処理するサーバ

    フォーム送信やAPIリクエストを受け取るなら、do_POST を追加します。

    from http.server import HTTPServer, BaseHTTPRequestHandlerimport urllib.parseclass MyHandler(BaseHTTPRequestHandler):    def do_GET(self):        self.send_response(200)        self.send_header("Content-type", "text/html; charset=utf-8")        self.end_headers()        html = """        <form method="POST">          <input name="name">          <input type="submit" value="Send">        </form>        """        self.wfile.write(html.encode("utf-8"))    def do_POST(self):        content_length = int(self.headers['Content-Length'])        post_data = self.rfile.read(content_length)        params = urllib.parse.parse_qs(post_data.decode('utf-8'))        name = params.get('name', [''])[0]        self.send_response(200)        self.send_header("Content-type", "text/html; charset=utf-8")        self.end_headers()        self.wfile.write(f"<h1>Hello, {name}!</h1>".encode("utf-8"))server = HTTPServer(('localhost', 8080), MyHandler)print("Server running on http://localhost:8080")server.serve_forever()

    これでフォームを送信すると、入力値が画面に表示されます。


    ④ 本格的に作るには

    Python標準ライブラリのみでは以下のような制約があります。

    • マルチスレッド/非同期処理に弱い

    • ルーティング機能がない(URLごとの処理を手動で記述)

    • MIMEタイプやセキュリティヘッダ設定が簡易的

    本格的にやるなら、socket モジュールを使って
    HTTPプロトコルを自前で処理することも可能です。


    ⑤ ソケットレベルでの最小HTTPサーバ(完全自作)

    import socketHOST = 'localhost'PORT = 8080with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:    s.bind((HOST, PORT))    s.listen(1)    print(f"Server running on http://{HOST}:{PORT}")    while True:        conn, addr = s.accept()        with conn:            request = conn.recv(1024).decode('utf-8')            print(request)  # 受信内容を表示            response = (                "HTTP/1.1 200 OK\r\n"                "Content-Type: text/html; charset=utf-8\r\n"                "\r\n"                "<h1>Hello from pure socket!</h1>"            )            conn.sendall(response.encode('utf-8'))

    このコードでは、HTTPリクエスト文字列を直接解析してレスポンスを返しています。
    完全な自作HTTPサーバです。


    まとめ

    方法特徴難易度
    python -m http.serverファイル共有向け。1行。★☆☆☆☆
    http.server + BaseHTTPRequestHandler簡単なAPIやフォーム処理可★★☆☆☆
    socket で自作プロトコルレベル理解が深まる★★★★★




    VTuberサプーが教える! Python 初心者のコード/プロのコード [ サプー ]

    価格:2860円
    (2025/11/13 19:45時点)
    感想(2件)


    Rust ECSでゲーム開発 -ゲームエンジンAmethystのススメ-【電子書籍】[ 住田 直樹 ]

    価格:1980円
    (2025/5/1 21:54時点)
    感想(0件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 18:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年11月25日

    runtimeとは

    steve-johnson-MzPPp2ZAAxU-unsplash.jpg

    質問

    runtimeとは、具体的になに?


    解答

    とても良い質問です。
    runtime(ランタイム)」という言葉は、プログラミングやシステム分野で頻繁に使われますが、文脈によって意味が少し異なります。


    しかし本質を突き詰めると、「プログラムが実際に動作しているときに働く仕組み」 のことを指します。

    以下で、抽象的な概念から具体例まで、体系的に解説します。


    1. 基本定義:runtimeとは何か

    runtime(ランタイム) とは、

    「プログラムが実行されている最中に、その動作を支える仕組み・環境・処理のこと」

    を指します。

    つまり「ビルド時(compile time)」や「ロード時(link time)」ではなく、
    実際に動いている間(run time) に関わるすべての要素のことです。


    2. 例で理解する:C言語とPythonの場合

    ● C言語の場合

    Cはコンパイル言語ですが、実行時にも最低限のランタイムがあります。
    たとえば:

    • main() を呼び出す前に、スタックやヒープの初期化を行う

    • 標準入出力(printfなど)をサポートする

    • mallocfree の動作を提供する

    → これらは C runtime(CRT) と呼ばれ、libc(例:glibc, musl) がその役割を担います。

    つまり:

    C言語のruntime = OS + libcなどの実行サポート環境


    ● Pythonの場合

    Pythonでは、スクリプトを実行するときに
    「Pythonインタプリタ」がコードを読み取り、実行時に多くの機能を提供します。

    • メモリ管理(ガーベジコレクション)

    • 例外処理

    • モジュール読み込み

    • 実行スタックの管理

    これらを総称して Python runtime と呼びます。

    つまり:

    Pythonのruntime = Pythonインタプリタ自体と、実行時に動作する仕組み全体


    3. runtimeが行う主な仕事

    機能説明
    メモリ管理変数の割り当て・解放(GCを含む)
    例外処理エラーをキャッチして制御を戻す
    スレッド管理並行処理のスケジューリング
    関数呼び出し管理呼び出しスタックの構築と破棄
    型情報の維持動的型付けや反射を実現(Python, Javaなど)
    I/Oサポート標準入出力・ファイルアクセスなど

    4. runtimeの位置づけ(ソフトウェア構造で見る)

    ┌──────────────────────┐│ アプリケーションコード │ ← 開発者が書く├──────────────────────┤│ ランタイム (runtime)   │ ← 実行時サポート層├──────────────────────┤│ オペレーティングシステム │ ← プロセス・メモリ・I/O管理├──────────────────────┤│ ハードウェア             │└──────────────────────┘

    → runtime はアプリケーションとOSの間に位置し、
    プログラムを「安全かつ抽象的に」動かすための中間層です。


    5. 言語別のruntimeの実体例

    言語runtimeの実体具体例
    C/C++標準ライブラリ(libcなど)glibc, MSVCRT
    JavaJVM(Java Virtual Machine)OpenJDK, HotSpot
    GoGo runtime(独自のスケジューラとGCを含む)runtimeパッケージ
    PythonPythonインタプリタCPython, PyPy
    Rustほぼ無し(OS上で直接動作)一部stdが最低限の初期化を行う
    Node.jsV8 + libuvJavaScript runtime

    6. コンテナやインフラ分野での「runtime」

    Kubernetes や Docker の世界では、
    Container Runtime(コンテナランタイム) という意味でも使われます。

    ● 例:

    • containerd

    • CRI-O

    • runc

    これらは「コンテナを実際に起動・停止・管理する」ための実行基盤です。
    つまりアプリケーション実行の最下層にある "OSレベルのruntime" といえます。


    7. まとめ

    観点内容
    一般定義実行時にプログラムを支える仕組み
    主な役割メモリ管理・例外処理・I/O・スレッド制御
    開発との関係コンパイルやビルドは「準備」、runtimeは「実際の動作」
    言語別実体Python → インタプリタ, Java → JVM, C → libc
    インフラ分野での意味コンテナや仮想環境を実行する基盤(containerdなど)


    詳細!Python3入門ノート [ 大重美幸 ]

    価格:2948円
    (2025/11/7 20:38時点)
    感想(6件)


    Unity2021 3D/2D ゲーム開発実践入門 [ 吉谷 幹人 ]

    価格:2860円
    (2024/2/9 22:38時点)
    感想(2件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 18:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年11月16日

    ラッパーツールとは

    erin-vey-ZIB2EaD7P0s-unsplash.jpg

    質問

    ラッパーツールとはどういうことをするもののことを言いますか?


    解答

    非常に良い質問です。
    ラッパーツール(wrapper tool)」という言葉はITのさまざまな分野で使われますが、
    本質的にはどの分野でも意味は共通しています。


    1. 基本定義

    ラッパーツール(wrapper tool)とは:

    既存のプログラムやコマンド、APIなどを「包み込んで(wrap)」、
    その使い方を簡単にしたり、追加機能を提供するツールのこと。

    つまり「既存の機能を中で呼び出して使いやすくしたり、自動化したりする“かぶせ物”」です。


    2. なぜ「ラッパー」と呼ばれるのか

    “wrap” は英語で「包む」という意味です。
    ラッパーツールは、既存のコマンドやライブラリをそのまま再実装するのではなく、
    外側から包み込んで操作しやすくする ため、「wrapper」と呼ばれます。

    イメージ図で表すと:

    ユーザー   ↓ラッパーツール(wrapper)   ↓既存のツール・API・コマンド

    3. 具体例で理解する

    ① コマンドラインツールのラッパー

    たとえば、git コマンドを自動で実行するPythonスクリプトを作ったとします。
    内部で subprocess.run(["git", "commit", "-m", "msg"]) を呼び出しているだけでも、
    それは Gitコマンドのラッパー です。

    目的:

    • 繰り返し作業を自動化

    • コマンドの引数や出力を整形して使いやすくする


    ② APIラッパー

    多くのプログラミング言語では、外部サービス(例:Twitter, AWS)を操作するための APIラッパーライブラリ が提供されています。

    例:

    • Python の boto3 → AWS API のラッパー

    • JavaScript の axios → HTTP通信のラッパー(fetchを包んで簡単にしている)

    目的:

    • 複雑なHTTPリクエストの処理を隠蔽

    • エラーハンドリングや認証を自動化


    ③ システム運用でのラッパー

    Linux管理者の世界では、よく「ラッパースクリプト」を書いて既存コマンドを便利にします。

    例:

    • service コマンド → systemctl のラッパー

    • kubectl → Kubernetes API のラッパー

    • 独自の運用スクリプト(deploy.shなど)も既存コマンド群のラッパー

    目的:

    • 実際の複雑な処理を隠して安全に操作させる

    • 一貫したインターフェースを提供する


    ④ プログラミング言語のランタイムラッパー

    一部の言語では、他言語のコードを呼び出すために「言語間ラッパー」を作ります。

    例:

    • Python から C関数を呼ぶ → ctypescffi は C のラッパー

    • JavaScript から Rust を呼ぶ → WASM バインディングのラッパー

    目的:

    • 異なる言語・実装間の橋渡しをする


    4. ラッパーのメリットとデメリット

    観点メリットデメリット
    使いやすさ複雑な処理を単純な操作にできる実際の中身が見えづらくなる
    保守性インターフェースを統一できる元のツールが変わると壊れやすい
    再利用性共通処理をまとめて再利用できる層が増えることでオーバーヘッド発生

    5. 技術的な分類

    種類主な用途
    CLIラッパーコマンド操作を自動化kubectl, service, 独自bashスクリプト
    APIラッパー外部サービスAPIの抽象化boto3, axios, google-api-python-client
    言語間ラッパー他言語との連携Python→C, JS→Rust
    ランタイムラッパー実行環境を抽象化Docker, JVM, Node.js
    テストラッパー実行環境を模倣してテストMockライブラリ, Proxyツール

    6. まとめ

    項目内容
    定義既存のプログラムやAPIを包み込み、より便利に使えるようにするもの
    目的使いやすさ・自動化・抽象化・安全性の向上
    CLIスクリプト、APIクライアント、Node.jsのモジュール、運用スクリプトなど
    本質「中身は変えず、外から操作性や利便性を高める」仕組み


    Python[完全]入門 [ 松浦健一郎 ]

    価格:3190円
    (2025/11/7 20:36時点)
    感想(1件)


    Flutterで始めるはじめてのモバイルアプリ開発 [ Tamappe ]

    価格:3080円
    (2025/10/4 12:08時点)
    感想(0件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 17:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年10月07日

    Perlでファイルのバックアップを取るプログラム

    nemo-BLr3YX-8rC0-unsplash.jpg

    質問

    Perlでファイルのバックアップを取るプログラムを書いてください。


    解答

    わかりました。ここでは、Perlで指定したファイルのバックアップを作る簡単なスクリプトを示します。バックアップは元のファイル名に日付・時刻を付けて保存する方式にします。


    #!/usr/bin/perluse strict;use warnings;use File::Copy;     # ファイルコピー用use POSIX qw(strftime);# バックアップ対象ファイルを指定my $file = shift @ARGV or die "使い方: perl backup.pl <ファイル名>\n";# ファイルの存在確認die "ファイル '$file' が存在しません。\n" unless -e $file;# バックアップファイル名作成 (例: original_20250923_1500.bak)my $timestamp = strftime("%Y%m%d_%H%M%S", localtime);my $backup_file = $file . "_" . $timestamp . ".bak";# ファイルをコピーcopy($file, $backup_file) or die "バックアップに失敗しました: $!\n";print "バックアップ成功: $backup_file\n";

    ◆ 使い方

    perl backup.pl example.txt
    • example.txt のバックアップが example.txt_20250923_150001.bak のように作成されます。

    • 日付・時刻で管理できるので複数回バックアップしても上書きされません。


    ◆ 補足

    • ディレクトリ単位でバックアップしたい場合は、File::Copy::Recursive モジュールを使うと便利です。

    • 定期的に自動でバックアップする場合は、cron(Linux)やタスクスケジューラ(Windows)と組み合わせます。




    業務に役立つPerl もっと自在にサーバを使い倒す (Software Design plusシリーズ) [ 木本裕紀 ]

    価格:3058円
    (2025/9/29 19:31時点)
    感想(1件)


    VB(VOICE BRODY) vol.11 (白夜ムック 658)

    価格:1750円
    (2024/2/22 22:11時点)
    感想(1件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 12:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年05月20日

    C#言語の特徴

    geraltyichen-iwgFhVuy5Go-unsplash.jpg

    質問

    C#言語の特徴を教えてください。


    解答

    C#(シーシャープ)は、Microsoftが開発したプログラミング言語で、オブジェクト指向を基本としつつ、さまざまなプログラミングパラダイムをサポートする多目的言語です。

    以下のような特徴があります。


    1. オブジェクト指向プログラミング(OOP)

    C#はクラスや継承、カプセル化、ポリモーフィズムといったオブジェクト指向の概念をしっかりとサポートしています。
    これにより、保守性が高く、拡張しやすいコードを書くことができます。


    2. .NETプラットフォームとの統合

    C#は**.NET(ドットネット)フレームワークおよび.NET Core(現在の.NET 6以降)**と統合されており、以下のような利点があります。

    * Windows、macOS、Linuxで動作するアプリを開発できる(.NET 5以降はクロスプラットフォーム対応)。
    * 豊富なライブラリとAPIを利用でき、開発効率が高い。
    * C#と他の.NET言語(VB.NET、F#など)と相互運用が可能。


    3. 強い型付けと安全性

    C#は静的型付けの言語であり、コンパイル時に型をチェックするため、型エラーを未然に防ぐことができます。
    また、**null許容型(nullable types)**のサポートにより、**Null参照例外(NullReferenceException)**を防ぐ仕組みも強化されています。


    4. 幅広い用途に対応

    C#は以下のようなさまざまな分野の開発に対応できます。

    * デスクトップアプリ開発(WPF、WinForms、UWP)
    * Webアプリ開発(ASP.NET Core)
    * ゲーム開発(Unity)
    * モバイルアプリ開発(Xamarin、.NET MAUI)
    * クラウド開発(Azureとの親和性が高い)
    * IoTや組み込みシステム開発


    5. モダンな言語機能

    C#はバージョンアップごとにモダンな機能を追加しています。

    * ラムダ式(Lambda Expressions)
    * LINQ(統合クエリ)
    * 非同期処理(async/await)
    * パターンマッチング
    * レコード型(C# 9以降)

    これにより、より簡潔で効率的なコードが書けるようになっています。


    6. パフォーマンスとガベージコレクション

    C#は**自動メモリ管理(Garbage Collection, GC)**を備えており、メモリ管理の負担を軽減します。
    ただし、低レベルな最適化も可能で、構造体(struct)やSpanを活用することで、パフォーマンスを向上させることもできます。


    7. 豊富な開発環境

    C#の開発には、Microsoft公式のIDE「Visual Studio」が広く使われています。
    また、Visual Studio CodeやJetBrains RiderといったツールでもC#の開発が可能です。


    まとめ

    * オブジェクト指向言語で、保守性・拡張性が高い。
    * .NETプラットフォームと統合され、多くのライブラリが利用可能。
    * 静的型付けで安全性が高い。
    * Web、ゲーム、デスクトップ、モバイルなど幅広い分野で利用可能。
    * モダンな機能を備えており、開発効率が高い。

    特に、.NETのエコシステムを活かした開発や、Unityを使ったゲーム開発をする場合、C#は非常に有力な選択肢となります。







    独習C# 第5版 [ 山田 祥寛 ]

    価格:4180円
    (2025/5/12 10:59時点)
    感想(0件)


    Unity2021 3D/2D ゲーム開発実践入門 [ 吉谷 幹人 ]

    価格:2860円
    (2024/2/9 22:38時点)
    感想(2件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 14:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年05月09日

    Rust における所有権

    tc-photography-LyFpyS_aMlw-unsplash.jpg

    質問

    Rust における所有権を説明してください。


    解答

    はい、丁寧に説明しますね。


    # Rustにおける所有権(Ownership)とは?

    Rustの**所有権(Ownership)**は、 「**メモリ管理を安全に、かつ手動で管理させずに行うためのルール**」です。
    RustにはCやC++のような**ガベージコレクション**(自動メモリ回収)がありません。
    代わりに、**コンパイル時に所有権ルールをチェック**して、安全にメモリを管理しています。


    # 基本の3つのルール

    Rustの所有権には、基本的なルールが3つあります。

    1. 各値(データ)は必ず**一つの所有者**(変数)を持つ 
    同じデータに対して、所有者は1つだけ。

    2. 所有者がスコープを抜けたら、値は自動的に**破棄(drop)**される
    メモリリークを防ぐ。

    3. 値は、**ムーブ(move)**されるか、**参照(reference)**される
    値を別の変数に渡すと、もとの変数は使えなくなる(基本はムーブ)。



    # 簡単な例

    ```rust

    fn main() { let s1 = String::from("hello");
      let s2 = s1; // s1の所有権がs2に「ムーブ」される

      //println!("{}", s1); // エラー!s1はもう使えない   
      println!("{}", s2); // OK }

    ```

    `s1` が `"hello"` を所有していたけど、
    `let s2 = s1;` とすると、`s1` の所有権が `s2` に移ります。

    以後、`s1` は無効になります。



    # 「借用」(Borrowing)という考え方も重要

    **参照(&)** を使うと、所有権を移さずに中身を読めます(「借りる」イメージ)。
    可変参照(&mut)を使うと、中身を「書き換えながら」借りられます。

    ```rust

    fn main() { let s1 = String::from("hello");
      let len = calculate_length(&s1); // 参照を渡す。所有権は移らない
      println!("Length is {}", len);
    }

    fn calculate_length(s: &String)-> usize {
      s.len()
    }

    ```


    # なぜ所有権が大事か?

    **ダブルフリー(同じメモリを2回解放)**を防げる
    **メモリリーク**や**未定義動作**が減る

    C言語みたいにポインタの事故を手動で防がなくていい Rustはこの**所有権システム**のおかげで、 「**速いのに安全**」というすごい特徴を持っています。





    ごめん、全然わからん。。


    毎日がうまくいく 朝のスイッチーーー1日が変わる25のルーティン【電子書籍】[ 大嶋信頼 ]

    価格:1540円
    (2025/4/28 09:48時点)
    感想(1件)


    Python3年生 機械学習のしくみ 体験してわかる!会話でまなべる! [ 森 巧尚 ]

    価格:2420円
    (2024/4/27 23:41時点)
    感想(1件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 14:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

    2025年05月08日

    Rustにおいて、循環参照を避けるために参照に強弱をつけると、どのようなことが起きますか?

    jean-carlo-emer-3u0RThHRJdI-unsplash.jpg

    質問

    Rustにおいて、循環参照を避けるために参照に強弱をつけると、どのようなことが起きますか?


    解答

    いい質問ですね。

    Rustでは、循環参照(例えば、AがBを参照し、BがまたAを参照する状態)を避けるために、**参照に強弱をつける**という考え方があります。

    具体的には:

    **強い参照(`Rc`や`Arc`)**

    所有権を共有する参照で、参照カウントを持ちます。
    カウントがゼロになるまでデータは破棄されません。

    **弱い参照(`Weak`)**

    データへの非所有参照です。カウントに影響しないので、循環を防ぐ役割を果たします。

    これによって起きることは、
    **「参照関係を持っていても、メモリリークを防ぎながら適切にデータを破棄できる」**という点です。


    例えば:

    ```rust

    use std::rc::{Rc, Weak};
    use std::cell::RefCell;

    struct Node {
      parent: RefCell<Weak>,
      child: RefCell<Option<Rc>>,
    }

    fn main() {
      let leaf = Rc::new(Node {
       parent: RefCell::new(Weak::new()),
       child: RefCell::new(None),
      });

       let branch = Rc::new(Node {
       parent: RefCell::new(Weak::new()),
       child: RefCell::new(Some(leaf.clone())),
      });

       *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
     }

    ```

    ここでは、`branch`が`leaf`を**強参照(`Rc`)**している`leaf`が
    `branch`を**弱参照(`Weak`)**している ので、循環していても問題ありません。

    もしどちらも`Rc`だったら、参照カウントがゼロにならずメモリリークしていました。


    **まとめると:

    ** 参照に強弱をつけると、**「お互いを参照し合う」**状態を作りながらも、**正しくメモリを開放できる**ようになります。




    なるほど、わからん。


    Rust ECSでゲーム開発 -ゲームエンジンAmethystのススメ-【電子書籍】[ 住田 直樹 ]

    価格:1980円
    (2025/5/1 21:54時点)
    感想(0件)


    プログラミング言語大全/クジラ飛行机【3000円以上送料無料】

    価格:1980円
    (2023/11/14 00:20時点)
    感想(0件)


     



    ブログランキング・にほんブログ村へ
    【下記、広告です。クリックいただけると励みになります。】
    posted by モニー at 11:00| Comment(0) | プログラミング | このブログの読者になる | 更新情報をチェックする