備忘録

備忘録

bashで文字列を数値に変換する方法

Ⅰ. はじめに

bashの変数は全てを文字列として扱う為、そのままでは数値計算ができません。
数値計算を行う方法として以下の2通りあります。

# 概要
1 $(())を使う方法
2 exprを使う方法

Ⅱ. 文字列→数値($(())を使う方法)

$ echo $((10+10))
20

Ⅲ. 文字列→数値(exprを使う方法)

$ echo `expr 10 \+ 10`
20

※ \を使う理由は、構文エラーをさける為です。

  • 10 * 10の掛け算(ダメな例)
$ echo `expr 10 * 10`
expr: 構文エラー
  • 10 * 10の掛け算(正しい例)
$ echo `expr 10 \* 10`
100

Fiddlerで常に特定ホストのログを除外する方法

Ⅰ. はじめに

簡単な方法として、セッションを選択→右クリック→Filter Now→ Hide example.com とする事で除外できます。
しかし、以下の2点が非常に面倒です。

これらを解決する方法です。

Ⅱ. やり方

1. 「Filters」を選択
2. 「Use Filters」にチェックを入れる
3. 「Hide the following Hosts」を選択
4. 除外するホストをセミコロン区切りで入力する
*.appsflyer.com; *.app-adforce.jp; *.adjust.com; *.adzcore.com; *.unity3d.com; *.tapjoy.com; *.tapjoyads.com; *.airdroid.com; *.googleapis.com; *.google.com; *.facebook.com; *.googlesyndication.com; *.doubleclick.net; *.google-analytics.com; *.google.co.jp; *.lobi.co; *.telize.com; *.crashlytics.com; *.aokp.co; *.mobileapptracking.com; *.app-measurement.com; *.metaps.com; *.kochava.com;

C++ リンカエラーを非表示にする方法

Ⅰ. はじめに

タイトルの通り「C++ リンカエラーを非表示にする方法」です。
型キャスト等で出力されるコンパイラ警告は以下の一行で非表示にできますが、リンカエラーは #pragma では不可能です。

#pragma warning(disable:4312)
コンパイラ警告の例

「C4312」が出力されています。
f:id:kagasu:20171011110829p:plain

リンカエラーの例

「LNK4098」と「LNK4049」が出力されています。
f:id:kagasu:20171011110237p:plain

Ⅱ. リンカエラーを非表示にする方法

1. プロジェクトのプロパティを開く
2. 「構成プロパティ」→「リンカー」→「コマンドライン」→「追加のオプション」
/ignore:4049 /ignore:4098


3. ビルドする

C#でSSD/HDDのシリアル番号を取得する方法

Ⅰ. はじめに

以下のコマンドを実行すると記憶媒体SSD/HDD)のシリアル番号を取得する事ができます。

vol c:
ドイブ C のボリューム ラベルがありません。
ボリューム シリアル番号は A8D9-2235 です

このシリアル番号をC#のプログラムで取得する方法です。

Ⅱ. サンプルプログラム

using System.Management;

class Program
{
  static void Main(string[] args)
  {
    var volumes = new ManagementClass("Win32_LogicalDisk").GetInstances();

    foreach (var volume in volumes)
    {
      Console.WriteLine(volume.Properties["VolumeSerialNumber"].Value.ToString());
    }
  }
}

Ⅲ. 実行結果

f:id:kagasu:20171009015038p:plain

Ⅳ. その他

Q. シリアル番号は第三者と重複する?
A. かなり高い確率で重複します。
使用しているパソコンの固有番号、識別番号としての利用は不適切です。
また、シリアル番号は簡単に変更可能です。

cpprestsdk をビルドしてstatic linkする

Ⅰ. はじめに

cpprestsdk の使い方はこちら

cpprestsdk はNuGetで dynamic link 版が配布されています。
static link 版は配布されていません。

static link する為には2017/10/08時点、自分でビルドするしか方法がありません。

Ⅱ. 必要なもの

  • VisualStudio 2015

※VisualStudio 2017でも可能ですが、v140のプラットフォームツールセットのインストールが必須です。
※v140プラットフォームツールセットインストール方法

Ⅲ. スタティックライブラリ(.lib)のビルド方法

1. cloneする
git clone https://github.com/Microsoft/cpprestsdk
2. cpprestsdk140.sln を開く

以下のダイアログが出てもUWP, Android対応等必要無ければスキップする。

3. cpprestsdk140.static プロジェクトのプロパティを開く
  • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」

マルチスレッド(/MT)に変更

4. 構成マネージャを開き、Releaseを選択する

プラットフォームは任意の物を選択して下さい。

5. cpprestsdk140.static プロジェクトだけを右クリックしてビルドを実行する
6. スタティックライブラリ(.lib)が作成されます

f:id:kagasu:20171008013836p:plain

Ⅳ. 作成したスタティックライブラリ(.lib)を使用する方法

1. プロジェクトのプロパティを開く
  • 「構成プロパティ」→「全般」→「プラットフォームツールセット」

Visual Studio 2015 (v140)」を選択

「cpprestsdk/Release/include」を追加

「cpprestsdk/Binaries/x64/Release」を追加

  • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」

マルチスレッド(/MT)に変更

_NO_ASYNCRTIMP」を追加

2. NuGetからzlibをインストールする

このパッケージはパッケージのオーナーが非公開設定している為、検索しても出てきません。
以下のコマンドを実行する必要があります。

Install-Package zlib.v140.windesktop.msvcstl.static.rt-dyn -Version 1.2.8.8
3. サンプルコード
#include <Windows.h>
#include <iostream>
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "bcrypt.lib")
#pragma comment(lib, "winhttp.lib")
#pragma comment(lib, "libcpprest140_2_9.lib")
#include <cpprest/http_client.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

pplx::task<void> Get()
{
  return pplx::create_task([]
  {
    http_client client(L"https://jsonplaceholder.typicode.com/posts/1");
    return client.request(methods::GET);
  }).then([](http_response response)
  {
    if (response.status_code() == status_codes::OK)
    {
      // レスポンスを文字列として取得後、標準出力する
      // auto body = response.extract_string();
      // std::wcout << body.get().c_str() << std::endl;

      // レスポンスをJSONとして解析する
      return response.extract_json();
    }
  }).then([](json::value json)
  {
    // タイトルだけを取得する
    std::wcout << json[L"title"].as_string() << std::endl;
  });
}

int main()
{
  // コマンドプロンプトの文字コードをUTF-8に設定する
  SetConsoleOutputCP(CP_UTF8);

  try
  {
    Get().wait();
  }
  catch (const std::exception &e)
  {
    std::cout << "Error = " << e.what() << std::endl;
  }

  return 0;
}
3. 実行結果

f:id:kagasu:20171007190436p:plain