いろきゅう.jp 〜Programmable maiden〜 Tech side このページをアンテナに追加 RSSフィード

2017-11-19

コンテナから目的の要素を抽出できなくて死亡

| 12:56

struct Doll
{
  int        id;
  std::string suffix;
};

void rozen()
{
  std::vector<int>  favIdList = { 202, 707 };  // ソート済み
  std::vector<Doll> dolls     = { // id でソート済み
    { 101, "dawa-"    },
    { 202, "kashira"  },
    { 303, "desu-"    },
    { 404, "dayo"     },
    { 505, "nanodawa" },
    { 606, "nanoyo"   },
    { 707, "..."      },
  };

  // { 202, "kashira" } と { 707, "..." } のインスタンスを抽出したい!
  std::vector<Doll> favDolls;
}

「favIdList ∩ dolls」 的なことをしたいというか、favIdList を利用して dolls を選択だか射影したいというか、こういう時どーするのがセオリーなんですかねぇ…ってのが未だに良くわからなかったりします。

set_intersection() なんていう積集合を取ってくれるマンマな関数はあるんですけど、favIdList と dolls は型が違うので利用できないという話。仕方ないので idList を for で回し id を一つずつ抽出して equal_range() で dolls を lookup する?…といっても、やはり型が違うので無理ゲー

比較元IDだけを格納した Dollsインスタンス作るのもナシとします

// こんなの
const Dolls src = { id };

bool operator < (const Doll& lv, const Doll& rv)
{
  return lv.id < rv.id;
}

// エラーチェックしろよ!
const Dolls& fav = *std::equal_range(dolls.begin(), dolls.end(), src).first;


dolls を id をキーにした map 作るのもナシとします。ソート済みなのになんでソートするコンテナに入れなきゃならんのか!ダサい!

std::map<int, Doll> map;
std::transform(dolls.begin(), dolls.end(),
  std::inserter(map, map.begin()), [](const Doll& d){
    return std::move(std::make_pair(d.id, d));
});

// だからエラー(ry
const Doll& fav = *map.find(favId);

こうするのがシンプルですかねぇ…。線形感がモリモリ出てダサいけど…

auto itDolls = dolls.begin();
for(int id : favIdList)
{
  itDolls = std::find_if(itDolls, dolls.end(),
    [id](const Doll& d){ return id == d.id; }
  );
  favDolls.push_back(*itDolls++);
}

アルゴリズム関数やらなんやら組み合わせれば自前で創らず標準関数類だけで頑張れそうだけど、良くわからず。 umm......

kikairoyakikairoya 2017/11/19 19:38 https://wandbox.org/permlink/9A3qiaf5rszZM7oh

ir9ir9 2017/11/20 02:53 あーなるほど、ありがとうございます。
comp に lambda ぶち込む発想しか出てきてませんでしたわ… 頭硬い…

トラックバック - http://d.hatena.ne.jp/ir9Ex/20171119

2017-09-11

スクリーンセーバーをリモートデバッグしようとして死亡

| 02:33

スクリーンセーバー拡張子 exe を scr にしただけのものなので、exe をリモートデバッグするいつもの要領で環境を構築すればOK!

…なんですが、引数として "/s" が必要でした。 ただ src ファイル名を指定しただけだと -1 (0xffffffff) が返されて起動しませんでしたうそーん!

Explorerからダブルクリックすりゃ起動するので "/s" とかのオプション必要ないのかと思ってたのにィ!

トラックバック - http://d.hatena.ne.jp/ir9Ex/20170911

2017-05-31

Win32エラーコード一覧のページを更新しました!

| 11:37

Windowsのエラーコードを FormatMessage() で抽出しただけのページを更新しました! 忘れてないよ! 更新しようと思い続けてたんだよ!マジで! ちなみに前回は 2005年4月に更新していたらしので、実に12年ぶりの更新となりました。 …そんだけHP続けてるとかマジか…… そんだけ歳食ったとかマジグホァ(血

なお、次の環境で出力しています。

  • Win10 1703 Creators Update
  • VC2017

また、エラーコード一覧を C# / Java にも移植しましたので是非ともご利用しないでくださいC# / Java で WinAPI に用事があるようなコード書いちゃダメデショー!!

どうぞご利用ください (どっちやねん




… "死亡"してない記事書いたの久しぶりなきがするじぇ……

トラックバック - http://d.hatena.ne.jp/ir9Ex/20170531

2017-04-30

Visual Studio 2017 Community のインストーラーが死んで死亡

| 20:08

Visual Studio 2017 Community をメインPCにぶち込むぜ!ヒャッハー!! …ハイテンションwktk全裸でインストーラを実行しましたが、エラーが出てインストールできませんでした…。 が、問題が解決できたのでその報告。

原因

インストーラーを実行すると、次のメッセージが表示されインストールプロセスを実行できません。

インストール ファイルをダウンロードできません。インターネット接続を確認してやり直してください。

http://hdimg.ir9.jp/hd17/0430_00.png


条件

対策

  1. 服を着用します
  2. TSUTAYA で DOG DAYS の DVD をレンタルしてきます
  3. Windowsサービス "CNG Key Isolation" を起動させます。
  4. Visual Studio 2017 のインストーラーを起動します。
  5. 借りてきたDVDを鑑賞しながらインストール完了を待ちます

…というわけで "CNG Key Isolation" のサービスが起動していなかった事が原因でした。


調査方法

%tmp%dd_bootstrapper_*.log なんてログが出力されます。 その中には次のような文言がありました。

VisualStudio Bootstrapper:2017/04/30 16:15:21: Caught Exception: Type = CryptographicException, Message = エンドポイント マッパーから使用できるエンドポイントはこれ以上ありません。
, StackTrace =    場所 System.Security.Cryptography.NCryptNative.OpenStorageProvider(String providerName)
   場所 System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm, String keyName, CngKeyCreationParameters creationParameters)
   場所 System.Security.Cryptography.RSACng.get_Key()
   場所 System.Security.Cryptography.RSACng.Encrypt(Byte[] data, RSAEncryptionPadding padding)
   場所 System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter.CreateKeyExchange(Byte[] rgbData)
   場所 System.Security.Cryptography.CngLightup.DetectRsaCngSupport()

あー、署名周りで死んでるねーと。

…で、ググってみたりもしたんですが、Firewall だか WindowsUpdate だか ActiveDirectory とかが引っかかってなんか違う感。 ぶっちゃけよくわからねぇ(ぉ 仕方ないのでノリでサービス周りだろうなぁという直感を元に一覧から crypt に関係するサービスを起動させてみたらなんか上手くいきました! やったねタエちゃん!! また一つ無駄に Visual Studio が増えるよ!!

VS2015 を1回起動しただけで VS2017 をぶち込んでる程度の能力

トラックバック - http://d.hatena.ne.jp/ir9Ex/20170430