2016年8月10日水曜日

[MFC] Visual Studioでダイアログ等のリソースをプロジェクト間コピー

はじめに


いまどき使っている人も少ないかもしれないMFC。
MFCプロジェクトを新規ソリューションで作成したけど、別のソリューションのプロジェクトからダイアログを流用したいことがたまにあります。

手動でやると、

  1. リソースファイル(.rc)をテキストエディタで開いて該当ダイアログの部分をコピー。
  2. 必要なリソースIDをresource.hに追加。
  3. ダイアログに対応したソースコード(ヘッダとcpp)をコピー
という感じになります。1.と2.がかなり面倒ですね。

もっと手軽にできないものかと、Visual Studioのリソースビューからダイアログを選択して右クリックしてみると、メニューからコピーは選べます。
しかし新しいソリューションのリソースビューに貼り付けようとするとうまくいきません。。

そんなとき、

同一ソリューション内ならダイアログリソースがコピーできる


とう話を聞いたので試してみました。
使用しているのはVisual Studio 2010です。(古!)

まずコピー元のダイアログを用意します。





新規ソリューション・プロジェクトを作成します。
ソリューションエクスプローラでソリューションを右クリックして既存のプロジェクトを追加を選びます。
上のコピー元ダイアログを含むプロジェクトを選択します。



すると、下のようにソリューション内に2つのプロジェクトが含まれるようになります。


リソースビューを開き、コピー元ダイアログを右クリックして「コピー」


コピー先のプロジェクトの「Dialog」を右クリックして「貼り付け」すると、今回はコピーできました!


コピー元のプロジェクトを新しいソリューションから削除してもこの通り、ダイアログがコピーされています!

2016年5月24日火曜日

Excel VBA最初の一歩: とりあえずメッセージボックスを出す

細かいツールのプログラムを作成する環境として、Excel VBAが結構普及しているようなので、
少し前から勉強しようと思っていました。

簡単なツールを作成する機会があったので、基本から調べたことをメモしています。

まず今回は最初の一歩。とりあえずVBAメッセージボックスを出すところまで。

環境

  • Windows 10
  • Excel 2016 (最近のバージョンなら同じ手順だと思います。)

1. Excel 2016を起動する





2. Visual Basicウィンドウを開く


ショートカットは Alt + F11 (要暗記!)





3. コードを書く場所(標準モジュール)を作成


プロジェクトの右クリックメニューから「挿入」「標準モジュール」を選択


4. コードを書く


4行だけです。
下のコードで、Helloというサブルーチンがマクロとして登録されます。

Option Explicit

Sub Hello()
    MsgBox "Hello"
End Sub



5. Visual Basicウィンドウから入力したコードを実行してみる



 F5で実行できます。
 マクロ名でHelloを選択して、実行ボタンをクリックします。



6. 実行結果


無事メッセージボックスが表示されました。



7. Excelシートからマクロを呼ぶ

普段はわざわざVisual Basicウィンドウを開かずにVBAを実行したいですよね。
そのためにはここではまず図形を追加します。



8. 図形にマクロを登録する


図形を右クリックして、「マクロの登録」を選択します。





9. 登録するマクロを選択します。


ここではHello。



10. 同じようにメッセージボックスが表示されました。






ここまでくれば、あとはVisual Basicウィンドウのエディタでコードを書けばいろいろなことができそうです。









2016年5月11日水曜日

[C++] 引数の型も個数も不定な関数を定義したいのでBoost.Preprocessorを試す

複数の変数の値を適当なフォーマットでログに出す関数を作成しているとします。

呼び出し側はこんな感じ。

int a;
string b;
ClassA c;
logFunction(a, b, c);

色々な型の引数をもつ関数を定義するなら関数テンプレート。
引数が1つの場合こんな感じになります。

template 
void logFunction(T arg) {
  DO_SOMETHING(arg);
}


DO_SOMETHINGは、

std::cout << arg;


みたいないろいろな型を受けられるようにになっているものをイメージしてください。

ですが、さらに引数の型も数も不定な場合、どうしようかと。

最近ならC++11以降の可変長引数テンプレート(Variadic template)でできるのでしょうが、
残念ながらコンパイラのバージョンが古くて使えない状況。。

最初はごり押しで書いてみました。

template <typename T0, typename T1>
void logFunction(T0 arg0, T1 arg1) {
  DO_SOMETHING(arg0);
  DO_SOMETHING(arg1);
}
template <typename T0, typename T1, typename T3>
void logFunction(T0 arg0, T1 arg1, T2 arg2) {
  DO_SOMETHING(arg0);
  DO_SOMETHING(arg1);
  DO_SOMETHING(arg2);
}
.
.
.

しかしいつの間にか引数が数十個まで必要になってしまい冗長にもほどがある状態になってしまいました。


Boost.Preprocessor


ある日、この肥大化した関数たちの処理を修正したいときがきまして、
そろそろなんとかしようかなと適当に検索していたら
Boost.Preprocessorでできそうな気がしてきました。
(繰り返しになりますが最近のコンパイラならVariadic templateでできそう)。

数少ない手に入るサンプルをこねくり回して作成したのが下記のコード。
これで引数25個まで一気に定義できます。
MAX_SIZEを変えればもっと多くてもできそうです。




#include <boost/preprocessor/repetition.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

#define MAX_SIZE 25

#define repSomething(z, n, unused) \
DO_SOMETHING(arg##n);\

#define DefLogFunction(z, n, unused) \
template <typename T BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename T)> \
void logFunction(\
T arg\
BOOST_PP_COMMA_IF(n) \
BOOST_PP_ENUM_BINARY_PARAMS(n,T,arg) \
) {\
DO_SOMETHING(arg);\
BOOST_PP_REPEAT(n, repSomething, ~)\
}\


BOOST_PP_REPEAT(MAX_SIZE, DefLogFunction, ~)


#undef DefLogFunction
#undef repSomething



2016年4月12日火曜日

[C++][MFC]「今後このメッセージを表示しない」付きメッセージボックスはCTaskDialogですぐできる

タイトルの通り、「今後このメッセージを表示しない」付きメッセージボックスの作り方を調べたのでメモ。

Visual Studio 2010以降ではMFCにCTaskDialogという多機能メッセージボックスクラスが追加されています。

CTaskDialog クラス

CString message(_T("何かメッセージ"));
CString title (_T( "警告"));
CString emptyString;
CTaskDialog messageBox(message, emptyString, title , TDCBF_OK_BUTTON);
messageBox.SetMainIcon(TD_WARNING_ICON);
messageBox.SetVerificationCheckboxText (_T( "今後このメッセージを表示しない"));
messageBox.SetVerificationCheckbox (FALSE);
messageBox.DoModal();
if (dlg.GetVerificationCheckboxState()) {
  // フラグをレジストリかどこかに保存
}

こんな感じで表示できます。
あとは、ダイアログ表示前に保存しておいたフラグをチェックして、フラグによってCTaskDialogの表示を制御すればいいだけ。

これは便利!

2016年3月26日土曜日

[Ruby] AmazonのASINからJANコードを取得したい

以前クラウドワークスの募集中の仕事をなんとなく眺めていた時に、
ASINからJANコードを取得するツール作成
の依頼があったと記憶しています。
クラウドワークスは手頃な練習課題を探すのにいいですね。
Rubyで試しにやってみました。

準備


gem install amazon-ecs

この記事執筆時点ではamazon-ecs-2.4.0を使用しています。

コード


ASINから商品情報を取得するAPIはItemLookupです。
gemを使えばとても簡単。
Amazon内ではJANコードのことはEANと呼ばれているようです。
Ecs.item_lookupの第一引数がASINです。


# -*- coding: utf-8 -*-
require 'amazon/ecs'

Amazon::Ecs.options = {
    :associate_tag => 'YOUR_ASSOCIATE_TAG',
    :AWS_access_key_id => 'YOUR_ACCESS_KEY_ID',
    :AWS_secret_key => 'YOUR_SECRET_KEY',
}


res = Amazon::Ecs.item_lookup(
    'B015J4FFRE', :response_group => 'ItemAttributes', :country => 'jp'
)

res.items.each do |item|
  puts item.get('ItemAttributes/Title')
  puts item.get('ASIN')
  puts item.get('ItemAttributes/EAN')
end

実行結果


たまたま目に付いた
を例に実行してみました。
グッドモーニングアメリカ【初回限定盤】
B015J4FFRE
4988001781868
実際のAmazonのページはこちら。
確かに情報が得られているのがわかります。


おわりに


クラウドワークス見てるとExcel VBAでツール作る仕事がよく目に付きます。
今回のネタもユーザー的にはExcelで動くのが便利なんでしょうね。
Rubyコードで納品なんかされようものなら、WindowsだったらRubyのインストールから必要になりますしね。
というわけで、今度VBA化してみようかな。

2016年3月16日水曜日

freeglutをCMakeでビルドする

はじめに


OpenGLでちょっとした実験をするには相変わらず便利なGLUT。
GLUTはマルチプラットフォームでOpenGL描画のためのウィンドウ表示とマウス・キーボード・コンテクストメニューを作成できるライブラリです。
そして、本家は更新止まっているので、オープンソースで代替品がつくられています。
それが、freeglut
久しぶりに使ってみようと思ったら最新版はビルドにCMakeが要るようになったんですね。
以前はVisual Studioのプロジェクトが含まれていたような気がします。
そこで、cmakeを使ってfreeglutをビルドしてみました。
一応ビルドずみのものもこちらから入手できるようです。
(後日freeglutの中を少しいじりたいので今回はソースからビルド)

環境




ビルド

CMakeのGUIバージョン(cmake-gui)を起動します。

「Where is the source code:」欄にfreeglutを解凍したフォルダ(CMakeLists.txtが含まれるフォルダ)を指定します。

ビルドの出力先フォルダを適当に作成し(ここではC:\freeglut-3.0.0\build)、「Were to build the binaries:」欄に指定します。

左下のほうにあるConfigureボタンをクリックします。

使いたいVisual Studioのバージョンを指定して「Finish」ボタンをクリックします。

コンフィグレーションが行われ、しばらくするとビルドオプションが表示されます。
「Advanced」チェックボックスをチェックするとさらに細かいオプションが表示されます。
ここでは何も変更せずにさきほどの「Configure」の右隣の「Generate」をクリックします。

最初に指定したbuildフォルダの下にVisual Studioのソリューションやプロジェクトファイルが作成されます。
Visual Studioを起動し、freeglut.slnを読み込んでビルドします。


とりあえずDebug版をビルドしました。下のようにビルドできているのがわかります。

実行

freeglutのサンプルもビルドされていますので、その中の1つ、Fractalsというプロジェクトを実行してみました。
fractals.datがないとかエラーが出ていますがパスの問題でしょうか。
とりあえずWindowが表示され何かしらOpenGLで描画できているようです。





2016年3月14日月曜日

RapberryPiで学ぶ電子工作メモ - MCP3204について

去年末くらいから「RapberryPiで学ぶ電子工作」
http://www.amazon.co.jp/dp/B00UKG5KRW/
を少しずつ実践しています。
必要なパーツの通販コード等も載っていてとても便利です。

ただし、掲載されているパーツで入手できないものがあったのでメモしておきます。

p.133
6章・AD変換によるアナログ値の利用
12ビットADコンバータ MCP3208-CI/P
「ピンの配置を読み替えれば、MCP3204-BI/Pでも演習可」

このMCP-3208が通販ですぐに見つからず、MCP3204を購入しました。
この場合ピンの配置をを自分で調べる必要があります。

そこで見つけたのが下記のサイト。
https://developer.mbed.org/cookbook/SPI-communication-with-external-ADC-MCP3

MCP-3208とMCP-3204のピン配置図が並んでいてとてもわかりやすいです。
ありがとうございます。