「技術」カテゴリーアーカイブ

【C#】【アルゴリズム】素数かどうかを判定するアルゴリズム

値Nが素数かどうかを判定するには、2~√Nで割り切れなければ素数らしい。

        /**
         * 引数Nが素数かどうかを判定する
         * 
         * @oaram N 素数判定する値
         * @return 素数:true/素数でない:false
         */

        public bool isprime(long N)
        {
            for(long i = 2; i * i <= N; i++)
            {
                if(N % i == 0)
                {
                    return false;
                }
            }
            return true;
        }

【数学】【PYTHON】いろいろな関数のグラフを表示する

もっと複雑なグラフを描画するには、もっと細かい単位でxの値を変化させなければなりません。

なので、pythonのnumpyライブラリを使用します。

import matplotlib.pyplot as plt
import numpy as np

def func1(x):
    return 3 * x

x = np.arange(-1.0, 1.01, 0.01)
y = func1(x)

plt.plot(x, y)
plt.grid(color='0.8')
plt.show()

npを使用するもう一つのメリットは、yの計算にfor文を使用する必要がなく、

1行で書くことができるということです。

なるほど、pythonが支持される理由はここにあるかもしれない。

RUST勉強中、8/13の積み上げ

前回の続き。

indexにダミーデータを使用していましたが、

この部分を実際のDBのデータを表示するようにしています。

use actix_web::{get, web, App, HttpResponse, HttpServer, ResponseError};
use thiserror::Error;
use askama::Template;
use r2d2::Pool;
use r2d2_sqlite::SqliteConnectionManager;
use rusqlite::params;

struct TodoEntry {
    id: u32,
    text: String,
}

#[derive(Template)]
#[template(path = "index.html")]
struct IndexTemplate {
    entries: Vec<TodoEntry>,
}

#[derive(Error, Debug)]
enum MyError {
    #[error("Failed to render HTML")]
    AskamaError(#[from] askama::Error),

    #[error("Failed to get connection")]
    ConnectionPoolError(#[from] r2d2::Error),

    #[error("Failed SQL execution")]
    SqliteError(#[from] rusqlite::Error),
}

impl ResponseError for MyError {}

#[get("/")]
async fn index(db: web::Data<Pool<SqliteConnectionManager>>) -> Result<HttpResponse, MyError> {
    let conn = db.get()?;
    let mut statement = conn.prepare("SELECT id, text FROM todo")?;
    let rows = statement.query_map(params![], |row| {
        let id = row.get(0)?;
        let text = row.get(1)?;
        Ok(TodoEntry { id, text })
    })?;

    let mut entries = Vec::new();
    for row in rows {
        entries.push(row?);
    }

    let html = IndexTemplate { entries };
    let response_body = html.render()?;
    Ok(HttpResponse::Ok()
        .content_type("text/html")
        .body(response_body))
}



#[actix_rt::main]
async fn main() -> Result<(), actix_web::Error> {
    let manager = SqliteConnectionManager::file("todo.db");
    let pool = Pool::new(manager).expect("Failed to inithialize the connection pool.");
    let conn = pool.get().expect("Failed to get the connection from the pool.");
    conn.execute(
        "CREATE TABLE IF NOT EXISTS todo (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            text TEXT NOT NULL
        )",
        params![],
    )
    .expect("Failed to create a table 'todo'.");
    HttpServer::new(move || App::new().service(index).app_data(pool.clone()))
        .bind("0.0.0.0:8080")?
        .run()
        .await?;
    Ok(())
}

前回の記事で、

テキストではdata(pool.clone())を使用していましたが、
ワーニングが出るので、調べたところ、
推奨されていない処理なので、app_dataを使え、と言うことでした。

と書きましたが、

app_data()を使用するとうまく動作せず、

解決策が見つからないので、

ひとまずdata()に戻しています。

【数学】【PYTHON】簡単な関数のグラフを表示する

こちらのコードを元に、簡単な関数のグラフを書いてみます。

今回はテキストにあるように、y=3x-24のグラフを表示させてみます。

import matplotlib.pyplot as plt

def func1(x):
    return 3 * x - 24

x = list(range(1,11))
y = []
for i in range(10):
    y.append(func1(x[i]))

plt.plot(x, y)
plt.grid(color='0.8')
plt.show()

簡単な関数(一次関数)ていどならこのコードでも問題無いですが、

二次関数とかになると、きれいなグラフを書くのは難しいです。

次回はそのようなグラフも書けるようにしてみます。

【数学】【PYTHON】グラフを表示する

今回から新しい章に入ります。

関数をグラフに表示しようってやつ。

まずは、グラフを表示するライブラリを使えるようにします。

matplotlibというモジュールを使用します。

$ sudo apt-get install python3-matplotlib
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7]
y = [64.3, 63.8, 63.6, 64.0, 63.5, 63.2, 63.1]

plt.plot(x, y)
plt.grid(color='0.8')
plt.show()

RUST勉強中、7/31の積み上げ

askamaクレートを使用することにより、htmlテンプレートを使用してWebページを作成することができます。

表示するデータは将来的にはデータベースを使用するのですが、

それはまた次回の話なので、今回はダミーデータを使用しています。

[package]
name = "todo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix-web = { version = "4.1" }
actix-rt = { version = "2.7" }
thiserror = { version = "1.0" }
askama = { version = "0.11" }
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>Todo App</Applet></title>
</head>

<body>
    <div>
        {% for entry in entries %}
        <div>
            <div>id: {{ entry.id }}, text: {{ entry.text }}</div>
            <form action="/delete" method="post">
                <input type="hidden" name=""id" value="{{ entry.id }}">
                <button>delete</button>
            </form>
        </div>
        {% endfor %}
    </div>

    <form action="/add" method="post">
        <div>
            <input name="text">
        </div>
        <div>
            <button>add</button>
        </div>
    </form>
</body>
</html>
use actix_web::{get, App, HttpResponse, HttpServer, ResponseError};
use thiserror::Error;
use askama::Template;

struct TodoEntry {
    id: u32,
    text: String,
}

#[derive(Template)]
#[template(path = "index.html")]
struct IndexTemplate {
    entries: Vec<TodoEntry>,
}

#[derive(Error, Debug)]
enum MyError {
    #[error("Failed to render HTML")]
    AskamaError(#[from] askama::Error),
}

impl ResponseError for MyError {}

#[get("/")]
async fn index() -> Result<HttpResponse, MyError> {
    let mut entries = Vec::new();
    entries.push(TodoEntry {
        id: 1,
        text: "First entry".to_string(),
    });
    entries.push(TodoEntry {
        id: 2,
        text: "Second entry".to_string(),
    });

    let html = IndexTemplate { entries };
    let response_body = html.render()?;
    Ok(HttpResponse::Ok()
        .content_type("text/html")
        .body(response_body))
}



#[actix_rt::main]
async fn main() -> Result<(), actix_web::Error> {
    HttpServer::new(move || App::new().service(index))
        .bind("0.0.0.0:8080")?
        .run()
        .await?;
    Ok(())
}

【数学】【PYTHON】10進数に変換する

これも

>>> int('0b11010', 2)
26
>>> int('0x1A', 16)
26

のようにint関数で計算してくれるのですが、

これもコードで書きます。

import sys
import re

args = sys.argv

def aby2dec(target, m):
    n = len(target) - 1
    sum = 0

    for i in range(len(target)):
        alpha_search_result = re.search('[A-F]', target[i])
        if alpha_search_result:
            num = ord(alpha_search_result.group()) - 55
        else:
            num = int(target[i])
        sum += (m ** n) * num
        n -= 1
    return sum

print(aby2dec(args[1], int(args[2])))

サンプルコードでは[A-F]をif文でベタ書きしていたのですが、

ここでは正規表現とASCIIコードで取得するようにしました。

演算子**で階乗計算できるんですね。

RUST勉強中、7/24の積み上げ

エラーのハンドリング定義を追加します。

使用するクレートはthiserrorを使用します。

[package]
name = "todo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix-web = { version = "4.1" }
actix-rt = { version = "2.7" }
thiserror = { version = "1.0" }
use actix_web::{get, App, HttpResponse, HttpServer, ResponseError};
use thiserror::Error;

#[derive(Error, Debug)]
enum MyError {}

impl ResponseError for MyError {}

#[get("/")]
async fn index() -> Result<HttpResponse, MyError> {
    let response_body = "Hello world";
    Ok(HttpResponse::Ok().body(response_body))
}

#[actix_rt::main]
async fn main() -> Result<(), actix_web::Error> {
    HttpServer::new(move || App::new().service(index))
        .bind("0.0.0.0:8080")?
        .run()
        .await?;
    Ok(())
}

この様にMyError等の形にすれば、エラー内容によってことなるエラー型を扱う様にすることができます。

ネーミングセンスはプログラマー永遠の課題。

プログラマーのみなさん。

クラス名、関数名、変数名はきちんと考えて付けていますか?

プログラマーたるもの、ここらへんのネーミングを疎かにしてはいけません。

業務プログラミングならなおさらのこと。

これは、いいかげんな名前を付けると後々可読性が低下する原因になるんですよね。

だって、Webのサンプルコードがこうなってたじゃん!

という指摘もありますが、

あれは解りやすいように書いた、あくまでもサンプルコードなので、

業務プログラミングでfooとかbarとか書かれていたらやり直しさせます。

まぁ、こんな事言っているオイラも結構ダメ出しされてるんですが。

書籍を読んでからネーミング一つ一つにも気を遣うようになりました。

本当にネーミングはプログラマー永遠の課題です。

【数学】【PYTHON】10進数を16進数に変換する

こちらも同じようにhex(26)を実行すれば’0x1a’を出力されますが、

これをPythonのコードで書きます。

import sys

args = sys.argv

def dec2hex(target):
    division = target
    hex = []

    while division != 0:
        remainder_of = division % 16
        division = division // 16
        if remainder_of >= 10:
            hex.append(chr(55 + remainder_of))
        else:
            hex.append(remainder_of)

    hex.reverse()
    return hex

print(dec2hex(int(args[1])))
taki@DESKTOP-4VF3GEO:~/python$ python dec2hex.py 26
[1, 'A']

こちらもサンプルでは[A-F]を愚直にif文で書いていますが、

AはASCIIコードで65(0x41)なので、55に余りを足してchrで変換することで[A-F]に変換しています。