Windows10でバックアップ時にエラーが出たので仲間にした

Windows7からWindows10へアップグレードしました。
「バックアップと復元 (Windows 7)」機能を使ってバックアップしようとしたのですが、エラーが発生し、バックアップ完了しませんでした。
バックアップ設定をいじったりなんだりしつつ、何度かバックアップを実行しました。
すると計3つのエラーに出会いました。

エラーとその対処法についてのメモ

  • (0x80070002)指定されたファイルが見つかりません

ユーザーフォルダがおかしかったのが原因でした。
Windows7でマイドキュメントなどの場所を別のディレクトリに指定していたのですが、
そのためかWindows10にアップグレード後、見た目マイドキュメントなどのフォルダが2つ存在していました。Σ⊂(>∀< )なんでやねん!
新しく作られてしまったフォルダの方を削除し1つだけある形にしたところ解決しました。

  • (0x800706ba)RPCサーバーを利用できません

詳しい原因はわかりませんが、Windowsファイアウォールを無効にすることで解決しました。

  • (0x80780169)ソースボリューム上のシャドウコピーが削除されたため、バックアップに失敗しました。

システムイメージ作成時のエラー。システムドライブにシャドウコピーが作成されていなかった(できなかった?)のが原因?
サービス"Volume Shadow Copy"が停止状態になっていたので実行し、またスタートアップの種類を自動にしたところ解決しました。

Skypeの閉じるボタンを押したとき、タスクバーから消えるようにする

OSはWindows7 64bitです。
Skypeをバージョン6.1.73.129にアップデートしました。

以前までは閉じるボタンを押したときにタスクバーからボタンが消え、タスクトレイにのみアイコンが表示されている状態になりました。
しかし、Skypeのアップデートを行ったところ、閉じるボタンを押してもタスクバーにボタンが表示されたままになってしまいました。

解決手順

  1. Skypeを互換モード "Windows Vista (Service Pack 2)" で実行する
  2. (1を行ってもだめなら) Skypeの設定をリセットする


今回、私はSkypeフォルダをリネームすることで解決しました。
ただ、設定をリセットすればいいだけなので、設定ファイルと思われるshared.xmlのみをリネームまたは削除することでも解決するのではないかと思います。

標準出力とファイルにログを出力したい

Iostreamsのtee_deviceを使って2つのデバイスに出力することにしました。

#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/tee.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

namespace myns{
    namespace io = boost::iostreams;

    io::filtering_ostream out(
        io::tee_device<std::ostream, io::file_sink>(
            std::cout, 
            io::file_sink("log.txt", std::ios::out | std::ios::app)
            ));
}

#define LOG(x) myns::out \
    << boost::posix_time::second_clock::local_time() \
    << "    " << x << std::endl

int main(){
    //サンプルのため変数や処理は適当
    bool uploaded = true;
    int heart_rate = 65535;
    bool breathed_deeply = false;

    //...
    
    if(!uploaded){ return 1; }
    LOG("昔の絵をアップロード完了");

    //...
    
    if(heart_rate >= 1000){
        LOG("緊張により心拍数 1000/m オーバー"
            << " (" << heart_rate << "/m)");
    }

    //...

    if(!breathed_deeply){
        LOG("深呼吸に失敗");
        return 1;
    }

    //...

    return 0;
}

標準出力, ファイル "log.txt":

2012-Jul-25 23:14:24    昔の絵をアップロード完了
2012-Jul-25 23:14:24    緊張により心拍数 1000/m オーバー (65535/m)
2012-Jul-25 23:14:24    深呼吸に失敗

範囲を表すときの [A, B) の意味

[A, B)は「A以上・Bより小さい」という意味になります。

角括弧で「~以上~以下」、丸括弧で「~より大きく~より小さい」範囲を表します。

[A, B]    A以上・B以下
(A, B)    Aより大きい・Bより小さい

そして角括弧と丸括弧を組み合わせて「~以上~より小さい」「~より大きく~以下」といった範囲を表します。

[A, B)    A以上・Bより小さい
(A, B]    0より大きい・5以下


区間 (数学) - Wikipedia

'\n'などを含む文字列のパターンマッチ

C++標準の正規表現ライブラリにおいて、'.'は'\n'や'\t'などにマッチしません。
しかしBoost.Regexはデフォルトでは'.'にマッチするようになっています。

#include <iostream>
#include <regex>
#include <boost/regex.hpp>

int main(){
    std::string text = "ABC\nXYZ";

    std::smatch std_result;
    std::regex_search(text, std_result, std::regex("(.*)"));
    std::cout << "標準:\n" << std_result.str(1) << std::endl;

    boost::smatch boost_result;
    boost::regex_search(text, boost_result, boost::regex("(.*)"));
    std::cout << "Boost:\n" << boost_result.str(1) << std::endl;

    return 0;
}

Output:

標準:
ABC
Boost:
ABC
XYZ


".*"ではなく"[\\s\\S]*"とすれば、標準ライブラリでもマッチするかとやってみたのですが結果は同じでした。
あれ、それは正しい動作なんでしょうか…。

Boost1.50.0でリリースされた、Boost.Functional/Overloaded Function

複数の異なる関数を、ひとつの関数オブジェクトにオーバーロードすることができるライブラリです。
同目的で異なる名前、引数の型を持つ関数のあるC時代のライブラリを使うときに重宝しそうです。

#include <iostream>
#include <sstream>
#include <boost/functional/overloaded_function.hpp>

std::string concat_s(const std::string& a, const std::string& b){
    std::string c = a;
    c.append(b);
    return c;
}

int concat_i(int a, int b){
    std::stringstream ss;
    ss << a;
    ss << b;
    int c;
    ss >> c;
    return c;
}

int main(){
    boost::overloaded_function<
        std::string(const std::string&, const std::string&),
        int(int, int)
    > concat(concat_s, concat_i);

    std::string str1 =
        "わぁいBoost.Functional/OverloadedFunction ";
    std::string str2 =
        "あかりBoost.Functional/OverloadedFunction大好き";

    std::cout << concat(65, 535) << std::endl;
    std::cout << concat(str1, str2) << std::endl;

    return 0;
}

Output:

65536
わぁいOverloadedFunction あかりOverloadedFunction大好き


オーバーロードできる関数の数(=テンプレート引数の数)はデフォルトでは5つまでです。
それより多くの関数を扱いたい場合、もしくはそれより少ない数に制限したい場合は、ライブラリをインクルードする前に、マクロBOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAXを定義することで、最大値(2以上)を指定します。

//最大値を10に設定
#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX 10
#include <boost/functional/overloaded_function.hpp>


オーバーロードする関数の引数の最大数も、デフォルトでは5に制限されています。
最大値の設定にはマクロBOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAXを定義します。

#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX 7


ここでは関数しか使いませんでしたが、ラムダ式、operator()を定義したクラスのインスタンス、boost::functionなどの関数オブジェクトもオーバーロードできます。

Boost.IostreamsのFilter作成!

Filterはデータに対して何らかの処理をするために使います。
作成したいコンセプトのクラスを継承し、それに対応するメンバを定義することで、簡単に作ることができます。

ここではデータを逆順に出力するFilterを作成します。

#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/pipeline.hpp>

class ReverseOutputFilter
    : public boost::iostreams::multichar_output_filter{
public:
    template<class Sink>
    std::streamsize write(
        Sink& snk, const char* s, std::streamsize n){
        std::streamsize rest = n;
        while(rest != 0){
            const char c = *(s + rest - 1);
            if(boost::iostreams::put(snk, c)){ break; }

            --rest;
        }

        return n - rest;
    }
};
BOOST_IOSTREAMS_PIPABLE(ReverseOutputFilter, 0);

int main(){
    namespace io = boost::iostreams;

    std::string result;
    io::filtering_ostream out(
        ReverseOutputFilter() | io::back_inserter(result));
    out << "Example String";
    out.flush();

    std::cout << result << std::endl;

    return 0;
}


Output:

gnirtS elpmaxE


multichar_output_filterを継承しました。これで、一度に文字列を処理し、出力するためのFilterを作成できます。
メンバには関数writeを定義します。
Filterからの出力には、boost::iostreams::put、もしくはboost::iostrems::writeを使用します。

ついでに、BOOST_IOSTREAMS_PIPABLEを使って、FilterをPipableにしました。*1
これで|演算子を使ってfiltering_ostreamにFilterやDeviceをセットすることができます。

*1:少しわかりにくいのですが、第2引数はクラスのテンプレート引数の数です