[C++] boost::asyncを使って引数や戻り値のあるタスクを実行する

boost::asyncを使って非同期のタスクを実行することができるのだけど、引数や戻り値の有り無し、タスクがメンバ関数だった時の構文を忘れがちなのでまとめておく

引数も戻り値もない場合

#include <stdio.h>
#include <string>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

// 引数も戻り値もないタスク
void printHelloTask() 
{    
  std::cout << "Hello" << std::endl;
}

int main () 
{    
  //タスク投入
  boost::unique_future<void> f1 = 
      boost::async(boost::launch::async, printHelloTask);
 //タスク完了待ち
  f1.wait();
}

boost::asyncのコンストラクタの第一引数はローンチポリシーで、boost::launch::asyncを渡した場合にはスレッドが作られてそこでタスクが実行されます。
第二引数は実行するタスクを渡します。
実行するタスクに引数も戻り値もない場合は単純です。

戻り値がある場合

#include <stdio.h>
#include <string>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

// 戻り値があるタスク
std::string returnStringTask() 
{
  return "Good Morning";    
}

int main () 
{    
  //タスク投入
  boost::unique_future<std::string> f3 = 
    boost::async(
      boost::launch::async, 
      returnStringTask);
  //タスク完了待ち   
  f3.wait();
  //タスクの戻り値を取得
  std::cout << f3.get() << std::endl;
    
  return 0;
}

戻り値がある場合もほぼ同じです。
ただboost::asyncの戻り値のfutureのテンプレート引数にreturnStringTaskの戻り値のstd::stringを指定します。

引数がある場合

#include <stdio.h>
#include <string>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

// 引数があるタスク
void printStringTask(std::string str) 
{    
  std::cout << str << std::endl;   
}

int main () 
{    
  //タスク投入
  boost::unique_future<void> f2 = 
    boost::async(
      boost::launch::async, 
      boost::bind(printStringTask, "Hey"));
  //タスク完了待ち
 f2.wait();
    
 return 0;
}

引数がある場合少しめんどくさくなります。
boost::asyncにはタスクの関数しか渡せませんが同時に引数の文字列”Hey”を渡さなければならないのでboost::bind()を利用して関数と引数をバインドしています。

boost::bind(printStringTask, "Hey"));

引数も戻り値もあるクラスのメンバ関数を呼び出す場合

#include <stdio.h>
#include <string>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

class Print {
private:
  const std::string name;
public:
  Print(const std::string& name) : name(name){}
  
  //タスク投入を行う関数  
  void run () 
  { 
    //タスク投入      
    boost::unique_future<std::string> f4 =
      boost::async(
        boost::launch::async, 
        boost::bind(
          &Print::returnStringTask, 
          this, "Good Evening"));
    //タスク完了待ち
    f4.wait();
    //タスクの戻り値を取得
    std::cout << f4.get() << std::endl;       
  }
    
  std::string returnStringTask (std::string message) 
  {
    return message + " " + name;
  }
};

int main () 
{    
  Print print("John");
  print.run();
    
  return 0;
}

もっとも面倒くさいけどでもよく使うパターンです。
基本的には戻り値があるパターン、引数があるパターンの複合ですが、関数名にクラス名を付けてPrint::returnStringTaskとしてアドレスを渡しています。
そして、関数の第一引数としてオブジェクトのthisポインターを渡しています。

boost::bind(&Print::returnStringTask, this, "Good Evening"));

[C++] XcodeでBoostライブラリを利用する

MacにBoostをインストールするでMacにBoostをインストールしてみたので早速Xcodeで簡単なBoostを使ったアプリを書いてみたところXcodeでのライブラリ関連の設定につまずいたので書き留めておきます。

実行しようとしたコードは以下のようなもの

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

int main() {
    long sec = 5;
    std::cout << "sleeping " << std::to_string(sec) << " seconds." << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(sec));
}

Boostライブラリを使うためにはコンパイラおよびリンカに以下の設定を行う必要があります

  • Boostのヘッダーパスの追加
  • Boostライブラリのパスの追加
  • リンクするライブラリ名の追加

Boostのヘッダーパスの追加

  1. プロジェクトナビゲータでプロジェクト名をクリック
  2. 検索窓に「header search path」と入力してHeader Search Pathを探す
  3. ダブルクリックしてBoostヘッダーへのパスを指定。
    私は /opt/local以下にBoostを配置したので /opt/local/boost_1_63_0になります

 

Boostライブラリのパスの追加

  1. プロジェクトナビゲータでプロジェクト名をクリック
  2. 検索窓に「library search path」と入力してLibrary  Search Pathを探す
  3. ダブルクリックしてBoostライブラリパスを指定。
    私は /opt/local以下にBoostを配置したので /opt/local/boost_1_63_0/stage/libになります

リンクするライブラリ名の追加

  1. プロジェクトナビゲータでプロジェクト名をクリック
  2. 検索窓に「other linker flags」と入力してOther Linker Flagsを探す
  3. ダブルクリックしてリンクするBoostライブラリ名を指定。
    上記のコードで必要なのは libboost_thread.dynlibとlibboost_system.dynlibなので-lオプションで-lboost_threadと-lboost_systemを指定する

このあと▶ボタンを押すことで実行してみます。

無事実行できました!

 

[C++] MacにBoostをインストールする

Mac上でもBoost使ったコードを書けるようにBoostをインストールしてみました。

まずはBoostのサイトから最新のBoostライブラリをダウンロードしてきます

現時点では1.63.0でした

ダウンロードしたzipファイルを解凍し/opt/localに移動します

$ cd ~/Downloads
$ unzip boost_1_63_0.zip
...
$ sudo mv boost_1_63_0 /opt/local

あらかじめコンパイルが必要なライブラリをビルドします

$ cd /opt/local/boost_1_63_0
$ ./b2 -j2
...
The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/opt/local/boost_1_63_0

The following directory should be added to linker library paths:

/opt/local/boost_1_63_0/stage/lib

$

XcodeでBoostを使う場合にはXcodeでBoostライブラリを利用するも見てみてください

WordPressに貼ったGoogle AdSense の広告の周りに青色の枠が見える

Google Adsenseで200×200の広告ユニットを作成してサイドバーに貼り付けたんですが、このサイズに合わない広告の場合、余白部分が青く見える現象が発生しました。

見た目カッコワルイので困っていた所、どうやら設定しているテーマで使用しているCSSに<ins>タグがありそこで背景色設定されているのが原因であるのがわかりました。

私が使っているのは Twenty Sixteenというテーマですが他のテーマでも同様の問題が発生する可能性もあります。(テーマによっては青以外のいろのこともあると思います)

以下に私が行った確認方法を書きます

サーバ上のWordPressのテーマのフォルダの中にあるstyle.cssファイルを探して編集します。

<親フォルダ>/wp-content/themes/<テーマ名>/style.css

私の環境では以下のパスになります。

/wordpress/wp-content/themes/twentysixteen/style.css

サーバ環境によってどうやってこのファイルをオープンするかは異なりますが、私はロリポップのレンタルサーバを使っているのでロリポップ!FTPでファイルを開きました。

開いたら <ins>タグを探します。

ins {
 background: #007acc;
 color: #fff;
 padding: 0.125em 0.25em;
 text-decoration: none;
}

background(背景)に設定されている 007acc が先程みた枠の青色です。
ここを ffffff(白)にします。

※ もちろんお使いのテーマの背景色が白以外であればその色に設定します。

 background: #ffffff;

これで余白が青い四角で表示されないようになります。

これまでやった英語の勉強法

英語の勉強法について聞かれたので自分でやって効果があったなと思う勉強法を書いておきます。

自分の英語レベルはというと普段仕事は文章の読み書きはほぼ英語で、英語での会話するのは週に数回程度。TOEICスコアは850点です。

シャドーイング

同じ英語の文章をひたすら音声再生に合わせて繰り返し発音し文章を自分の言葉のように話せるように訓練する勉強法です。

私は以下の本で勉強しました。英語のリズムや息をつくタイミング、単語の発音の強弱などはこれで身につきました。(刷新されているのでまったく同じではないかもしれませんが)

同じ文章だと応用がきかないと思われるかもしれませんが全体としては結構いろんな構文がつまっているので単語などをかえるとかなり応用できます。

ほんとにひたすら聴いてシャドーイングして音声どおりのイントネーションで話せるように練習しました。

オンライン英会話

Skypeをつかって主にフィリピン人の英語講師の人と一対一で英会話レッスンを行うものです。

駅前型の英会話スクールと違った利点は

  • 料金が安い (月5,000円で毎日30分など)
  • 時間がフレキシブル(開始30分まえまで予約可能)

私がこれまで利用したのは以下のサービスです。英会話レベル維持のため5-6年くらいは続けてます

これらのオンライン英会話をはじめても数ヶ月でやらなくなってしまう方も多いと聞きます。わたしなりの継続の方法は

  • 先生を選ばない
    とにかく空いてる時間に予約がとれる先生をとる。毎回自己紹介する事もいとわない
  • 夜帰ってきて時間があるならすぐ予約する
    予め予約するのは結構負担です。その代わり時間があるときに1時間くらい後の予約をすぐとるようにしてます
  • できれば毎日
    前日に予約したりすることはあまりないですが時間があれば必ず参加するようにします
  • フリートークだけで無く教材を使ったレッスンも織り交ぜる
    フリートークは最初緊張しますが慣れれば楽です。なので逆に飽きる原因にもなります。だいたい教材をつかったレッスンも選べるはずなのでそういった進捗が見えるレッスンも使いましょう

TOEIC試験対策勉強

TOEICの点数自体にはこだわってなかったのですが、しゃべるだけではやっぱり英会話レベルの向上が難しくなってきたので、正しい文法を身に着け、熟語や単語数を増やす目的で勉強しました。

この本を教えてくれた人からのアドバイスで同じテキストを繰り返し勉強しました。

この本をやる前は740点くらいで伸び悩んでいたんですが、この本を最初から最後まで4回ほど通して勉強したところ100点ほど点数を伸ばすことができました。

その他の英語力向上のために利用したサービス

英辞郎 on the WEB Pro

英辞郎の有償版(300円/月)です。わからなかった単語や熟語を単語登録して定期的に単語帳を見直して忘れやすい単語の復習をしたりしてました。頻出のわりに忘れやすい、ってのが結構あるのでそういうのをチェックするのに使いました。

有償版は小窓モードが便利で普通の辞書としても今でも常時使ってます。

iKnow

英語の学習サイトです。(9,600円/年のコース)

単語や熟語の語彙数を増やすために使っていました。間違えた単語とかをしつこく再学習できるので忘れやすい単語を記憶に定着できました。いろいろ飽きさせない工夫をしてくれてますが、やっぱり飽きやすいので自分でも続ける工夫が必要かもです。

 

[WinDbg/CDB] 不明なシンボル名をワイルドカードで検索する

例) USER32 モジュールにある(はず)の GetDC という文字がつく関数を探す

0:000> x user32!*getdc*
77d053c3 USER32!xxxBNGetDC = <no type information>
77d0c595 USER32!NtUserGetDCEx = <no type information>
77cf86c7 USER32!NtUserGetDC = <no type information>
77d1cfd9 USER32!LBGetDC = <no type information>

Windowsでダンプファイルを取得する

windbg のコマンドプロンプトからプロセスのダンプ(ミニダンプ)を取得できる

0:00> .dump /ma <ダンプのパス>

例)

0:00> .dump /ma C:\myapp.dmp

※ 「/ma」 はミニダンプを取得するオプション。
ちなみに「/f」はフルユーザーモードダンプを取得するオプションだが、名前に反してミニダンプの方が情報量は多いのでこちらを取るほうがよい。

[WinDbg/CDB] 特定のアドレスでブレークを仕掛けてメモリ値やレジスター値を変更する

0:00> bp 6d137998 "R eax = 1;g"

ダブルクォートの中に、ブレイク後に実行したいコマンドを書きます。最後の「;g」は 「再開」の指示です。

  • アドレス 6d137998 でブレークし、アドレス 6d137900 の値を 0x00ff に変更して再開する
0:00> bp 6d137998 "ew 6d137900 0x00ff;g"
  • 関数SomeFuncでブレークし、スタックを一行だけ表示して再開する
0:00> bp Module!SomeFunc "kvn 1;g"

「1」はスタックの行数を表しています。