std::shared_ptr の基本動作

初期化、スコープによる解放、明示的解放の確認。

#include <memory>
#include <iostream>

class ToBeShared {
 public:
    ToBeShared() { std::cout << "ToBeShared Constructed. this="
                    << std::hex << this << std::endl; }
    ~ToBeShared() {std::cout << "ToBeShared Destructed. this="
                    << std::hex << this << std::endl; }
 };

int main() {
    auto printone = [](const std::string& name,
                       const std::shared_ptr<ToBeShared>& sp) {
        std::cout << name << "(" << std::hex << sp.get()
        << std::dec << ").use_count()= " << sp.use_count()
        << std::endl;
    };

    std::cout << "Creation" << std::endl;
    auto sp1 = std::make_shared<ToBeShared>();
    printone("sp1[make_shared]", sp1);
    auto sp2 = sp1;
    printone("sp2[copied sp1]", sp2);
    {   std::shared_ptr<ToBeShared> sp3;
        printone("sp3[defined]", sp3);
        sp3 = sp2;
        printone("sp3[copied sp2]", sp3);
    }  // = implicit delete
    std::cout << "sp3 out of scope." << std::endl;

    printone("sp2[before reset]", sp2);
    sp2.reset();  // = explicit delete

    printone("sp1[before reset]", sp1);
    sp1.reset();  // = explicit delete

    return 0;
}

実行結果。

Creation
ToBeShared Constructed. this=0x294f1eb03a0
sp1[make_shared](0x294f1eb03a0).use_count()= 1
sp2[copied sp1](0x294f1eb03a0).use_count()= 2
sp3[defined](0).use_count()= 0
sp3[copied sp2](0x294f1eb03a0).use_count()= 3
sp3 out of scope.
sp2[before reset](0x294f1eb03a0).use_count()= 2
sp1[before reset](0x294f1eb03a0).use_count()= 1
ToBeShared Destructed. this=0x294f1eb03a0

std::function の使い方

備忘録を兼ねて、こんな風に使うんだよというサンプルなど。
クラスのメンバ関数の場合(func1,func2)、
素の関数の場合(func3,func4)、
ラムダ関数を使う場合(func5,func6)。
それぞれ引数なし、ありの時の書き方。

#include <functional>
#include <iostream>

class class1 {
 public:
    void func1() { std::cout << "class1::func1()" << std::endl; }
    void func2(int i1, int i2) { std::cout << "class1::func2(" << i1 << "," << i2 << ")" << std::endl;  }
};

class class2 {
 public:
    std::function<void()> function1;
    std::function<void(int,int)> function2;

    std::function<void()> function3;
    std::function<void(int,int)> function4;

    std::function<void()> function5;
    std::function<void(int,int)> function6;
};

void func3() {
    std::cout << "func3()" << std::endl;
}

void func4(int i1, int i2) { std::cout << "func4(" << i1 << "," << i2 << ")" << std::endl; }

int main() {
    class1 c1;
    class2 c2;

    c2.function1 = std::bind(&class1::func1, &c1);
    c2.function2 = std::bind(&class1::func2, &c1, std::placeholders::_1, std::placeholders::_2);

    c2.function3 = std::function<void()>(func3);
    c2.function4 = std::bind(func4,std::placeholders::_1, std::placeholders::_2);

    c2.function5 = [&]() { std::cout << "lambda func5()" << std::endl; };
    c2.function6 = [&](int i1, int i2) { std::cout << "lambda func6(" << i1 << "," << i2 << ")" << std::endl; };

    c2.function1();
    c2.function2(3, 4);

    c2.function3();
    c2.function4(5, 6);

    c2.function5();
    c2.function6(7, 8);

    return 0;
}

実行結果。

class1::func1()
class1::func2(3,4)
func3()
func4(5,6)
lambda func5()
lambda func6(7,8)

Google Driveへのバックアップ

年が明けてから、WordPressで作っている部分のバックアップをUpdraftPlusというアドインでやるようにしました。バックアップ先にはGoogle Driveを指定して、初回のバックアップは何も問題なくできたのですが、今日、二回目のバックアップをしようとしたら、エラーになってしまいました。アクセストークンがどーのとか、そんなことユーザーに言われてもどうしようもない訳の分からないエラーメッセージが出ています。アドインの作成元含めてWEB検索しても開発者向けの情報がヒットするばかり。そんな難しいことではないはずだと思いつつ。

要するにドライブにログインしようとしてはねられたということのようです。初回はちゃんと動作したのですから、一度Drive側の ツールの登録を解除して再登録、気分新たにリフレッシュしてやってみたところ、ビンゴ、うまくいきました。

前回のGoogle Driveへの接続から時間が経っていたせいか、あるいは単にブラウザを閉じるとこうなるのかは調べていませんが、バックアップに失敗したら都度ツールを再登録するようにしてしばらく使ってみます。ふう。

Windows10 PowerShell の色について

Windows10からコマンドプロンプトがcmd.exeからPowerShellになって、さて使おうとするとまず気になるのが入力行の色です。黄色なんですが、画面のプロパティで背景色を明るい灰色にしているとこれが非常に見にくい。文字色を黒にすると実行されたコマンドからの文字列やプロンプトの色は変わるんですが、肝心の入力した文字の色は変わりません。PowerShell特有のプロパティでもあるのかと思って調べてみても要領を得ないサイトばかりがヒットして時間ばかりが過ぎていきます。細かいことはどうでもいいんです。今やりたいことは、入力行を見やすくしたいだけ。

なので、入力行自体の色を変える方法は心に留めておいておいおい探すとして、とりあえず背景色を変えました。真っ黒は嫌いですが慣れている明るい灰色ではなく暗めの灰色にすることで、黄色でも見やすくなりました。文字色は白にして、こうすると入力行は黄色なのでどれが入力でどれがコマンドの出力なのかもよく分かります。怪我の功名? というやつかも。当面これでいきます。

….. と、思ったんだけど、コマンドラインの引数の色が今度は暗い灰色と被っててよく見えない。こりゃ背景は黒でないと使えないですね、当面。さっさと仕組みを調べなきゃ。ふう。

Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-4 Emacs25のインストールと環境設定)

Emacs25のインストールと環境設定

Emacsのインストール自体は簡単ですがデフォルトだと日本語環境がちょっとおかしいのと、autoinstall.elの設定がちょっと古いので、それを直す必要がありました。Versionは25.2をインストールします。

Emacs25のインストール

下記のコマンドでインストールできます。

sudo apt install emacs25

設定ファイルは基本的にはこれまで使っていたものを引っ越してくれば良いのですが、元環境がWindows版の場合はパスを直接書いているところがあればその部分は修正する必要があります。古いバージョンに合わせた設定ファイルだといろいろobsoleteなところがあるかもしれません。私の場合はauto-installの一部のリポジトリのパスが変わっていて、まずauto-install.elに手を入れる必要がありました。 “Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-4 Emacs25のインストールと環境設定)” の続きを読む

Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-3 Ubuntu18.04LTSのインストールと環境設定)

Ubuntu18.04LTSのインストールと環境設定

インストール開始

OSをインストールするためには、今作ったばかりの仮想マシンを起動します。(ブート順で指定した通り、DVDのブートイメージが実行されます)

Hyper-Vマネージャーの画面で仮想マシンを選択状態にし、右クリックメニュー(又はメニューバーの「操作」メニュー(もしくは右側の「操作」ペイン))の「接続」を選択して仮想マシンと接続するための画面を表示し、そこに出ている「起動」ボタンをクリックします。(下記画面例は右クリックメニュー) “Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-3 Ubuntu18.04LTSのインストールと環境設定)” の続きを読む

Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-2 仮想マシンの作成)

Ubuntu向けの仮想マシンをHyper-Vで作成する

Ubuntu18.04LTSは「Hyper-Vクイック作成」でもサポートされてますが、設定内容をきちんと把握しておく意味で、Hyper-Vマネージャの「操作」→「新規」→「仮想マシン」でコツコツ作っていきます。

Hyper-Vマネージャーを起動

まず、なにはともあれHyper-Vマネージャーを起動します。Hyper-Vマネージャーは、スタートメニューの「Windows管理ツール」フォルダの中に居ます。 “Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-2 仮想マシンの作成)” の続きを読む

Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-1 Hyper-V の有効化)

Hyper-Vの有効化

Windowsで使える仮想環境には VMWareとかOracleのVirutalBoxとかもありますが、 Windows10 ProfessionalにはHyper-Vがあるので、とりあえずはこれを使うのがお手軽だろうということで、これにしました。

必要なBIOS設定

Hyper-VはどんなPCでも使えるという訳ではなく、BIOSというか今はUEFI(Unified Extensible Firmware Interface — 統合拡張ファームウェアインターフェイス)なるものに進化してるらしいですが、このUEFI-BIOSによる仮想化のサポートが必要です。 “Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-1 Hyper-V の有効化)” の続きを読む

Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-0)

ノートPC(Corei7、メモリ8GB、HDD500GBのThinkPad X230) の Windows10 Pro のHyper-V 環境で Ubuntu 18.04LTS を動かして、Ubuntu上のEmacs 25.2.2 からWindows側のファイルを編集するための環境を作るに当たって、いろいろあったことのメモです。

どんなことがあったかというと。 “Emacs25 on Ubuntu18 on Hyper-V on Windows 10 (MEMO-0)” の続きを読む

「プログラミング言語C++第四版」について気が付いたことなど (22)

意味がよく分からない訳、そこまで単純じゃないという誤訳 …


42. 4   タスク ベース の 並行 処理

本章のここまでは、並行タスクを実行するためのメカニズムを中心に解説してきた。すなわち、thread、競合条件の回避、threadの同期である。この点に集中すると、並行タスクを実行する実際のタスクへの注意が散漫になってしまうのが多いことが分かっている。本節では、単純な部類のタスクに焦点を当てる。具体的には、1個の引数を受け取って、1個の結果を返すタスクである。


原文:

So far, this chapter focused on the mechanisms for running concurrent tasks: the focus was on threads, avoiding race conditions, and synchronizing threads. For many concurrent tasks, I find this focus on mechanisms distracting from the real task (sic!) of specifying concurrent tasks. This section focuses on specifying a simple kind of task: a task that does one thing given arguments and produces one result.


試訳:

本章のここまでは、並行タスクを実行するためのメカニズムにフォーカスを当てて解説してきた。すなわち、thread、競合条件の回避、threadの同期である。多くの並行処理の現場で、このような細かなメカニズムに対する集中は並行処理を記述するという本来の(文字通りの!)タスク(=作業)からの逸脱をもたらしがちである。本節では、単純な部類のタスクに焦点を当てる。それは幾つかの引数を与えられて一つのことを実行し、一つの結果を生成するタスクである。


考察:

後ろの方の訳は arguments が複数であることを見落としており、かつ does one thing が訳されていない。”one thing given arguments” を「1個の引数を受け取って」としているのかもしれないが、それはちょっと間違った捉え方。given はtaskにかかる形容詞的過去分詞、たぶん。