メモの日々


2001年11月02日(金) 無題

[service][web] Internet Archive Wayback Machine

昔のウェブページを検索できるWayback。What's new about Javaより。会社の昔のウェブページも見れる。でも新館が建つ前のはないみたい。

会社など

  • 10:25 今日もいい天気です。がんばるぞい。

2011年11月02日(水)

[c][math] LAPACKを使って行列の固有値計算

線形代数計算ライブラリのLAPACKを使ったのでちょっとだけメモ。

LAPACKを説明したサイトは色々あるけど、数値計算マニュアル:線型代数 (FAQ)がよくまとまっていてよかった。日本計算工学会誌「計算工学」からリンクされている「BLAS, LAPACKチュートリアル パート1」(Vol16,No.2)、「BLAS, LAPACKチュートリアル パート2」(Vol.16,No.3)も参考になる。

実対称行列の固有値と固有ベクトルを計算してくれる関数 dsyev_() を使ったサンプルを書いてみた。関数の戻り値が何を表すのかが不明。

#include <cmath>
#include <iostream>
#include <stdexcept>
#include <vector>

using std::vector;

// f2c.h, clapack.h から必要な宣言を抜粋
extern "C" {
    typedef long int integer;
    typedef double doublereal;

    int dsyev_(
            char *jobz,
            char *uplo,
            integer *n,
            doublereal *a,
            integer *lda,
            doublereal *w,
            doublereal *work,
            integer *lwork,
            integer *info);
}

/**
 * 実対称行列の固有値/固有ベクトルを計算する
 *
 * @param matrix 計算対象の行列。上三角部分だけが設定されていればよい。
 *               matrixの内容は破壊される(固有ベクトルが設定される)。
 *
 * @return matrixの全固有値からなるvectorと、全固有ベクトルのvector。
 *         戻り値の0番目のvectorが全固有値、
 *         戻り値の1番目のvectorが0番目の固有値に対する固有ベクトル、
 *         戻り値の2番目のvectorが1番目の固有値に対する固有ベクトル、
 *         ...
 */
std::vector<std::vector<double> > eigen(std::vector<double>& matrix) {
    if (matrix.empty()) return vector<vector<double> >();

    char jobz = 'V';                // 固有ベクトルも計算する
    char uplo ='U';                 // 上三角部分を使用。ただし列優先。
    integer n = static_cast<integer>(std::sqrt(matrix.size())); // matrixの行数
    integer lda = n;                // matrixのleading dimension
    vector<doublereal> work(n * 3); // dsyev_()の作業領域
    integer lwork = static_cast<integer>(work.size());          // workのサイズ
    integer info = 0;               // dsyev_()の処理結果

    vector<double> eigenvalues(n);
    dsyev_( &jobz,
            &uplo,
            &n,
            &matrix[0],
            &lda,
            &eigenvalues[0],
            &work[0],
            &lwork,
            &info);

    if (info) {
        throw std::runtime_error("error: dsyev_()");
    }

    vector<vector<double> > result(n + 1, vector<double>(n));
    result[0] = eigenvalues;

    // LAPACKは列優先
    for (integer col = 0; col < n; ++col) {
        for (integer row = 0; row < n; ++row) {
            result[col + 1][row] = matrix[col * n + row];
        }
    }
    return result;
}

int main() {
    vector<double> m;
    m.push_back(0);
    m.push_back(1); // ここの値は使われない
    m.push_back(1);
    m.push_back(-1);

    vector<vector<double> > eigens = eigen(m);

    if (eigens.empty()) {
        throw std::runtime_error("BUG: no eivenvalue.");
    }

    std::cout << "eigenvalues:";
    for (std::size_t i = 0; i < eigens[0].size(); ++i) {
        std::cout << " " << eigens[0][i];
    }
    std::cout << "\n";

    for (std::size_t i = 1; i < eigens.size(); ++i) {
        std::cout << "eigenvector" << i << ":";
        for (std::size_t j = 0; j < eigens[i].size(); ++j) {
            std::cout << " " << eigens[i][j];
        }
        std::cout << "\n";
    }
}

2013年11月02日(土)

[hard] 無線LANルータを買った

無線LANはたまに使うだけなのだけれど、そのときは3年前に買ったUSBに刺す小型の機械を親機モードで使っていた。が、これが「Windows 7(64bit)では親機モードはご利用いただけません」とのことで使えなくなってしまった。

ウェブで検索すると使えるようにする手順が紹介されており試してみたのだけれど、うまく接続できなかったので諦めて新しい機械を買うことにした。

買ったのはI-O DATAのWN-G300Rという無線LANルータ。ヨドバシカメラで一番安い無線LANルータを選んだらこれになった。3190円。 B007MSEUU4

ルータの機能は不要なのでアクセスポイントモードで運用し、無事接続できた。


2021年11月02日(火)

[windows] WSLメモ

WSLについていくつかメモ。

wsl.exe

wsl.exeコマンドによりWindowsからLinuxコマンドを呼び出すことができる。

PS C:\> wsl uname
Linux

wsl.exeにはディストリビューションの管理(インストールしたり停止したり)を行う機能もある。多機能なので詳しくはヘルプやドキュメントを参照のこと。

PS C:\> wsl --help

環境変数WSLENV

環境変数WSLENVに環境変数名を指定することで、WindowsとLinuxで環境変数を共有することができる。

$ abc=100 def=200 cmd.exe /C echo %abc% %def%
%abc% %def%

$ abc=100 def=200 WSLENV=abc cmd.exe /C echo %abc% %def%
100 %def%

$ abc=100 def=200 WSLENV=abc:def cmd.exe /C echo %abc% %def%
100 200

WSLENVに指定する環境変数名にはフラグを付けられるが、/p と /l を使うと現在の自分の環境だとコアダンプしてしまう…。このissueが近い気がするけれどこれは修正済みだと思われる。

$ abc=100 def=200 WSLENV=abc/w:def cmd.exe /C echo %abc% %def%
100 200

$ abc=100 def=200 WSLENV=abc/u:def cmd.exe /C echo %abc% %def%
%abc% 200

$ abc=100 def=200 WSLENV=abc/p:def cmd.exe /C echo %abc% %def%
zsh: segmentation fault  abc=100 def=200 WSLENV=abc/p:def cmd.exe /C echo %abc% %def%

$ abc=100 def=200 WSLENV=abc/l:def cmd.exe /C echo %abc% %def%
zsh: segmentation fault  abc=100 def=200 WSLENV=abc/l:def cmd.exe /C echo %abc% %def%

/bin/wslpath

wslpathコマンドを使うとパスの形式をWindows用とLinux用に相互変換できる。

$ wslpath -u 'C:\abc\def'
/mnt/c/abc/def

$ wslpath -w /home
\\wsl$\Debian\home

$ wslpath -m /home
//wsl$/Debian/home

2022年11月02日(水)

[db] MongoDBでドキュメントのサイズを取得する

Object.bsonsize()を使うとドキュメントのサイズを取得できる。

また、コレクションのstats()でコレクション内のドキュメントの平均サイズが分かる。

> db.createCollection("work")
{ "ok" : 1 }

> db.work.insert({hello: "world"})
WriteResult({ "nInserted" : 1 })

> db.work.find()
{ "_id" : ObjectId("6361c3461ee4e6c67b087af9"), "hello" : "world" }

> Object.bsonsize(db.work.findOne("6361c3461ee4e6c67b087af9"))
39

> Object.bsonsize({ "_id" : ObjectId("6361c3461ee4e6c67b087af9"), "hello" : "world" })
39

> db.work.stats()
{
        "ns" : "direct.work",
        "size" : 39,
        "count" : 1,
        "avgObjSize" : 39,
...