プログラミングGeekなブログ。

日々プログラミングしていて気づいたことのメモ。たまに音楽など。

Visual Studio CodeでC/C++のデバッグ on Mac

MacVisual Studio CodeでC++のコードをデバッグできるようにします。

Visual Studio CodeでC/C++コンパイルをするまで

今回ビルドするC++コードのサンプルはこちら↓

// main.cpp
#include <iostream>

int main() {
  for (auto i : {2, 4, 5}) {
    std::cout << i << std::endl;
  }
  return 0;
}

ターミナルでビルドすると次のようになります。

$ clang++ -std=c++11 main.cpp
$ ./a.out
2
4
5

これをVisual Studio Codeでビルドしてみます。

  1. 拡張機能でcpptoolsを検索して、インストール&有効に f:id:cindy-bass:20161101060451p:plain

  2. tasks.jsonの生成

    1. C/C++のソースのあるディレクトリに移動
    2. コマンドパレットで、Tasks: Configure Task Runner > Othersを選択すると、tasks.jsonが生成される
    3. tasks.jsonの編集
      commandはclang++、argsはcppファイル名とコンパイルオプションを設定:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "clang++",
    "isShellCommand": true,
    "args": [
        "main.cpp",
        "-g",
        "-std=c++11"],
    "showOutput": "always"
}

これでビルドができるようになりました。Command+Shift+Bでビルドを実行すると、a.out(とa.out.dSYM)が生成されます。

デバッグ

  1. launch.jsonの生成
    1. ビューバーのデバッグ > 設定をクリックすると、ドロップダウンメニューが表示されるので、C++ (GDB/LLDB)を選択
      f:id:cindy-bass:20161101061249p:plain
    2. launch.jsonの編集 programを実行ファイル名を指定("program": "{workspaceRoot}/a.out")
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/a.out",
            "args": [],
            "stopAtEntry": false,
            〜省略〜

最低限の設定はこれで完了です。 あとはブレークポイントやウォッチを設定するなりして、Visual Studioと 同様のデバッグができるようになります。 f:id:cindy-bass:20161101061336p:plain

Mac + XcodeでChromiumをビルド

MacChromiumをビルドしたときの備忘録。
ソースを読んでブレークしたりしたいのでXcodeでビルドします。 基本的には以下のガイドに従えばビルドできます。
https://chromium.googlesource.com/chromium/src/+/master/docs/mac_build_instructions.md

dept_toolsのインストール

dept_toolsのクローン。すぐに終わります。

$ mkdir chromium
$ cd chromium
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

このツールを使ってビルドするので、次のようにパスを通しておきます。

export PATH=$PATH:`pwd`/depot_tools

ソースのチェックアウト

ソースをクローンします。一時間ほどかかりました。

$ mkdir chromium
$ cd chromium
$ fetch chromium
$ cd src
$ gclient runhooks

Xcodeワークスペースを生成

Xcodeデバッグしたいので、Xcode用のワークスペースを生成します。コマンドラインオプション--ide=xcodeをつけて、次のようにコマンドを実行します。

$ gn gen out/Default --ide=xcode

ビルド

ワークスペースを開きます。

$ open out/Default/all.xcworkspace

そのままビルドを実行しようとすると、
'The run destination My Mac is not valid for running the scheme...'
というようなエラーが発生。
原因は、ワークスペースで指定されているOSX SDKのバージョンがPCにはインストールされていないからのようで。SDKのバージョンを、[Build Settings] > [Base SDK]より変更します。 f:id:cindy-bass:20161031051442p:plain

後はビルドを実行します。ビルドにはかなりの時間がかかります。私のPCでは9時間かかりました。
最後に実行画面。 f:id:cindy-bass:20161031052548p:plain

これから、ソースを読んでいきます!

macOSのVimにClang Formatプラグインをインストール

macVimにClang Formatプラグインをインストールしたメモ。非常に簡単です。

Clang Formatをインストール

Homebrewでインストールします。

$ brew tap tcr/tcr
$ brew install clang-format

一応、インストールされているかの確認。

$ clang-format -help

Vimプラグインをインストール

私はdeinでプラグインを管理しているので、.vimrcに以下を追記するだけ。

call dein#add('rhysd/vim-clang-format')

C++のstd::binary_searchで構造体を検索&イテレーターを取得

ソート済み構造体の配列を検索して、見つかった位置のイテレーターを取得するというネタです。
タイトルにはstd::binary_searchとありますけど、binary_searchでは見つかった位置は 分からないので、std::lower_boundを使用します。 定番ですけど、いざやろうとするとパッと出てこないので、備忘録も兼ねて。。

検索する関数
#include <algorithm>

template <class ForwardIterator, class T, class Compare>
ForwardIterator bfind(ForwardIterator first, ForwardIterator last, const T &val,
                      Compare comp) {
  ForwardIterator it = std::lower_bound(first, last, val, comp);

  if (it != last && !comp(val, *it)) {
    return it;
  } else {
    return last;
  }
}

構造体などのデータ配列を検索するので、比較関数compも指定してやります。

サンプル
#include <algorithm>
#include <tuple>
#include <vector>

int main() {
  using Data = std::tuple<int, std::string>;
  std::vector<Data> data{
      {4, "a"}, {2, "b"}, {1, "d"},
  };
  auto comp_first = [](const Data &lhs, const Data &rhs) {
    return std::get<0>(lhs) < std::get<0>(rhs);
  };
  auto comp_second = [](const Data &lhs, const Data &rhs) {
    return std::get<1>(lhs) < std::get<1>(rhs);
  };

  auto it = bfind(data.begin(), data.end(), Data{0, "b"}, comp_second);
  if (it != data.end()) {
    std::cout << "Data={" << std::get<0>(*it) << ", "
              << std::get<1>(*it).c_str() << "}" << std::endl;
  }
  it = bfind(data.begin(), data.end(), Data{0, "c"}, comp_second);
  if (it == data.end()) {
    std::cout << "Not found" << std::endl;
  }

  std::sort(data.begin(), data.end());
  it = bfind(data.begin(), data.end(), Data{4, ""}, comp_first);
  if (it != data.end()) {
    std::cout << "Data={" << std::get<0>(*it) << ", "
              << std::get<1>(*it).c_str() << "}" << std::endl;
  }
  it = bfind(data.begin(), data.end(), Data{3, ""}, comp_first);
  if (it == data.end()) {
    std::cout << "Not found" << std::endl;
  }

  return 0;
}
実行結果
Data={2, b}
Not found
Data={4, a}
Not found

簡単ですね。

Android NDK 開発環境の構築

今日はAndroidアプリの開発環境を構築します。

言語の価値≒開発環境と言われることもあるので、しっかりと選んでいきます。

NDKを使う開発環境構築

自分の作成したいアプリはAndroidアプリで、開発環境の要件としては
- C++ & NDKを使用可能
- Windowsでも使用可能
- Vimのキー操作が可能

といったところです。
以前にEclipse+NDKで開発したことがあったのですが、今はAndroid Studioというい選択肢もあるようで。 新しいものを使ってみるのもいいことだと思うので、今回はAndroid Studioを採用することにします。

Android Studioのインストール

  1. こちらから Windowsようのインストーラをダウンロード。
    現時点でのAndroid Studioのバージョンは1.4です。

  2. ここからはガイド に従ってインストールを進めます。
    まずはインストーラを実行。すべてデフォルトのままインストール。
    JDK7が必要とのことですが、自分のPCには既にインストール済みだったのでここはスキップ。

  3. インストールを完了し、Android Studioを起動。初回起動だからなのか、起動に数分間かかりました。
    起動するとSetup Wizardが表示されます。 f:id:cindy-bass:20151029144324j:plain

  4. 次にAndroid SDKをインストールします。Android SDK Managerをクリックします。 f:id:cindy-bass:20151029143729j:plain

  5. ガイドの 説明に合わせやすくするために、SDK Managerを起動します。 f:id:cindy-bass:20151029143808j:plain

  6. 以下をインストールします。

初めてSDK Managerを起動すると、必要なものは選択状態になっているようです。
私はそのままAndroid6.0のものをインストールすることにしました。

f:id:cindy-bass:20151029145336j:plain

Hello Worldアプリ作成

とりあえずは、Hello Worldアプリというか、ウィザードがデフォルトで作成するアプリの ビルドを試してみます。
Setup WizardでStart a new Android Studio projectを選択し、 デフォルト設定のまま進めます。

  1. Start a new Android Studio projectを選択 f:id:cindy-bass:20151029143939j:plain

  2. デフォルトのままNext f:id:cindy-bass:20151029143952j:plain

  3. これもデフォルトのままNext f:id:cindy-bass:20151029144007j:plain

  4. Blank Activityを選択してNext f:id:cindy-bass:20151029144018j:plain

  5. デフォルトのまま、Finish f:id:cindy-bass:20151029144033j:plain

  6. ウィザードを完了すると下のような画面が現れます。 f:id:cindy-bass:20151029144043j:plain

  7. 何も編集せずに、とりあえずアプリケーションをビルド&実行します。
    Android SDKのインストールでAndroid6.0をインストールしているので、 Android virtual deviceにはNexus 5 API 23 x86を選択しました。

f:id:cindy-bass:20151029144055j:plain

f:id:cindy-bass:20151029144104j:plain

これで、アプリが起動するかと思いきや、エミュレーターの速度が異常に遅い!!
それも実用不可能なレベルで!
で、色々ネットで調べると、高速化の手段があるようで。

Android エミュレーターの高速化

エミュレーターの高速化には、Intel x86 Emulator Acceleratorを使用します。

  1. SDK Managerにて、Extra > Intel x86 Emulator Accelerator(HAXM installer)を選択し、 インストールを実行します。 f:id:cindy-bass:20151029144117j:plain

  2. 1ではインストーラーがダウンロードされるだけなので、インストーラーを実行します。
    なお、インストーラーは
    C:\Users\ユーザー名\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager\intelhaxm-android.exe にダウンロードされています。(1のヒントにダウンロードしたフォルダ名の記載あり)

  3. あとは、エミュレーターの作成です。私の場合、最初からインストールされているNexus 5のCPUがx86ということもあり、 これを複製して、設定を変更することにしました。
    AVD Managerを起動します。
    f:id:cindy-bass:20151029144129j:plain

  4. Nexus 5を右クリックしてDuplicateを選択します。
    f:id:cindy-bass:20151029144139j:plain

  5. エミュレーターの設定画面が現れます。 Show Advanced Settingsをクリックして詳細設定を行います。 今回変更するのは次の2点です:

    • Use Host GPUをオン
    • RAMを512MB以下に設定

f:id:cindy-bass:20151029144153j:plain

  1. もう一度、アプリを実行してみます。 高速化がうまく働いているようなら、コンソールに次のようなメッセージが表示されます。
    HAXM is working and emulator runs in fast virt mode

まとめ

これでアプリをビルドをできるようになりました。 エミュレーターは高速化してますけど、それでも少し遅さを感じてしまいます。
業務でアプリを開発されている方は、どうされているのかと思ってしまいます。

Atom + Vimキーバインドでブログ開始

どうもはじめまして、cindy-bassです。
ここはてなブログにてブログを始めることにしました!
自分、プログラマです。メインはC++でガリガリとコード書いてます。 Java, Python, JavaScript, C#になるとC++の半分以下に。。(T_T)
スマホ向けに作りたいアプリができたので、それを作りつつブログを書けたらと思ってます。

Atom

ブログを書くにあたって、何を使って文章を書こうかとあれこれ調べたところ、
Atomを使うことにしました。
何故ならMarkdownが使えて、何よりもVimキーバインドが使用できるから!
私、Vim愛好家なもので(笑)

とりあえずは、次のようにセットアップしました。(プラットフォームはWin8)

  1. 公式サイトよりインストーラーをダウンロード f:id:cindy-bass:20151023231503j:plain

  2. exeファイルを実行するとAtomがインストールされます。 インストールが完了すると、Atomが起動します。

  3. 一応、UIを日本語化。File - Settings を選択します。 f:id:cindy-bass:20151023231759j:plain

  4. Installをクリックし、検索欄にjapanese-menuと入力し、Packageボタンをクリック。 japanese-menuが見つかったら、Installボタンをクリック。 f:id:cindy-bass:20151023232015j:plain

  5. 日本語化すると次のようになりました。 f:id:cindy-bass:20151023232032j:plain

Vimプラグイン

日本語化のときと同様に、vim-modeex-modeをインストール f:id:cindy-bass:20151023232132j:plain

f:id:cindy-bass:20151023232142j:plain

まとめ

というほどのことはないんですけど、しばらくはこれで ブログを書いていこうと思います。 Vimのパッケージですけれど、本物のVimと比べると物足りなさは感じますけど、 ある程度基本的なことろはカバーされているので十分です。