空の構造体のサイズ

C++では空の構造体を作ることができます。こんな風に。

struct _EMPTY {};

これは特になにかをしているわけではありません。単純にメンバを持たない構造体なだけです。
果たしてこの構造体のサイズはいくつでしょうか?

struct _EMPTY {};
_tprintf(_T("size: %d\n"), sizeof(_EMPTY));  // size: 1

結果は1バイトとなります。0じゃないのがちょっと不思議ですよね。

次にint型を一つだけもつ構造体を作ってサイズを見てみます。

struct _INTEGER {};
_tprintf(_T("size: %d\n"), sizeof(_INTEGER));  // size: 4

環境にも依りますが4バイトです。1+4にはなりません。

空の構造体はいくら空だと言っても型のサイズがないのもおかしいので最も小さい型のサイズが割り当てられているのでしょうか。環境に依存しそうな値なので1だと思って利用すると失敗しそう...

※プログラムはVisual Studio 2015 Preview版で試しています。

C++でJavaやC#のようにnewを書く方法

タイトルからするとなにを言っているのか分からないかもしれませんが、newの見栄えをJavaC#と同じようにする方法です。
例えばJavaC#Hogeというクラスをnewするときは以下のように書きます。

Hoge hoge = new Hoge();

普通にC++でnewするときは以下のように書きますね。

Hoge* hoge = new Hoge();

C++の場合はポインタを表す間接演算子が付いていますがJavaC#と同様の書き方をするためにそれをはずすことを考えます。
C++Hoge hoge = ...と宣言と同時に代入を行うと、実際には代入ではなくコンストラクタが働いています。

Hoge hoge = a; // 下と同じ
Hoge hoge(a);

これを利用してnew Hogeを受け取れるコンストラクタを作ります。

class Hoge
{
public:
    Hoge(){}
    Hoge(Hoge* hoge){}  // Hoge*を受け取るコンストラクタ

    void method(){}
};

これでC++でもJavaC#のようにnewを書くことができます。

Hoge hoge = new Hoge();
hoge.method();  // ポインタっぽいのにドットでメンバ関数を呼び出して気持ち悪い


ただJavaC#のようにnewを書きたかっただけなのでnewしたポインタは全く意味がありません。

Windows Phone 8にTwitter OAuthを組み込む

Windows Phone 8Twitter OAuthを行う方法です。PINコードをユーザーに入力してもらって認証します。

Twitter Developerですでにアプリケーションを登録していることを前提として進めます。登録したアプリケーションのCallback URLは空にしておいてください。

まずは認証用のライブラリをインストールします。@neueccさんの作られたAsyncOAuthを使います。
NuGetパッケージ管理から検索窓にAsyncOAuthと入力すれば出てきます。インストールボタンをクリックしてインストールします。


次に、MainPage.xamlのContentPanelを以下のように書き換えます。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <phone:WebBrowser x:Name="browser" Height="460" />
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="32">PIN</TextBlock>
            <TextBox Grid.Column="1" x:Name="pinCode"></TextBox>
            <Button Grid.Column="2" HorizontalAlignment="Right" Click="Button_Click">認証</Button>
        </Grid>
    </StackPanel>
</Grid>


その次はMainPage.xaml.csを次のように変更します。
usingを追加します。

using AsyncOAuth;
using System.Security.Cryptography;


最後にメインとなるソースコードです。MainPage.xaml.csに追記します。consumerKeyとconsumerSecretはTwitterに登録した際のAPI keyとAPI secretになります。

static string consumerKey = "API key";
static string consumerSecret = "API secret";

private RequestToken _requestToken = null;

static MainPage()
{
    OAuthUtility.ComputeHash = (key, buffer) => { using (var hmac = new HMACSHA1(key)) { return hmac.ComputeHash(buffer); } };
}

// コンストラクター
public MainPage()
{
    InitializeComponent();

    Loaded += MainPage_Loaded;
}

async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    try
    {
        var authorizer = new OAuthAuthorizer(consumerKey, consumerSecret);

        var tokenResponse = await authorizer.GetRequestToken("https://api.twitter.com/oauth/request_token");

        _requestToken = tokenResponse.Token;

        var pinRequestUrl = authorizer.BuildAuthorizeUrl("https://api.twitter.com/oauth/authorize", _requestToken);

        browser.Navigate(new Uri(pinRequestUrl, UriKind.RelativeOrAbsolute));
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}



private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        var authorizer = new OAuthAuthorizer(consumerKey, consumerSecret);
        var tokenResponse = await authorizer.GetAccessToken("https://api.twitter.com/oauth/access_token", _requestToken, pinCode.Text);

        // ここでAccessTokenを保存する
        var accessToken = tokenResponse.Token;

        // 後はAccessTokenを使ってTwitterのAPIを呼び出すだけ
        // 試しに自分の情報を取得してみます
        var client = OAuthUtility.CreateOAuthClient(consumerKey, consumerSecret, accessToken);
        var json = await client.GetStringAsync("https://api.twitter.com/1.1/account/verify_credentials.json");
        MessageBox.Show(json);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

ここで実行してみましょう。もし例外が発生するようでしたらエミュレータの時刻を合わせてみましょう。時間がずれていると失敗します。うまくいけば以下のような画面が表示されます。

この画面からログインを行いPINコードを入力して認証ボタンを押すと、以下のようなメッセージが取得できていることが確認できます。

アクセストークンを保存しておけば後はTwitterAPIをたたくだけで利用できます。プロジェクトをアップしましたので、好きなようにダウンロードしてください。
TwitterOAuth.zip 直

Ring Clockのv1.4を公開しました

Ring Clock v1.4ではフォントを変更しました。

これまでRing Clockではサンセリフ体が中心でしたが、タイトルなどでセリフ体のフォントを使うようにしました。
それとボタンの色も少し変更しました。明度のコントラストを大きくしています。
最後に一番大事なこと。今回のバージョンアップで価格を下げました。次のバージョンまでは一番安い価格にする予定です!
ということでよろしくお願いします。

インスタンスから静的メンバ関数を呼ぶ

メンバ関数と静的メンバ関数を持つ簡単なクラスを作る

class Hoge
{
public:
	void	Print1()
	{
		_tprintf(_T("Print1\n"));
	}

	static void Print2()
	{
		_tprintf(_T("Print2\n"));
	};
};

これまで静的メンバ関数を呼ぶにはスコープ演算子を用いて呼ぶものだと思っていたのですが、

Hoge::Print2(); // →Print2

インスタンスからも呼ぶことができるみたいですね。いつからだろう?知らなかっただけ??

Hoge hoge;
hoge.Print2(); // →Print2

ただしビルドすると"ローカル変数は 1 度も使われていません。"というメッセージが出るので、コンパイルするときにはインスタンスが呼び出すのではなくHoge::Print2()として呼び出しているのかもしれません。
開発環境はVS2012で試しています。

Ring Clock v1.3を公開しました

かなり時間は空いてしまいましたがバージョン1.3ではリングに影を付ける対応を行いました。単純な更新ですがそれでもいろいろと苦労したのでそれはまた別の記事で書きたいと思います。

実際の画像を載せておきますので参考にしてください。
デフォルトのテーマだとこんな風になります。

有料版を購入している方は黒のテーマにすると逆に光を発しているように見えます。

それとロゴも変えました。変えたのはフォントです。フォントをOptimaに変更して少しだけ高級感のある雰囲気にしてみました。

もしよかったら使ってみてください。

Ring ClockがWindows Phone Storeのトップページに!

先日マイクロソフトから下記のタイトルでメールが来ていました。
「Your app will be Featured in the Windows Phone Store on 21 August 2013」
なにやら自分のアプリがWindows Phone Storeで紹介されるとのこと。メールをよく読んでみるとクエートなどの中東のストアで紹介されると書いてありました。これは記念にスクリーンショットを撮っておくべしということでクエートのロケールIDを調べてクエートのストアを見てみると、なんとビックリ!文字が右から表示されてます。アラビア語は右から読むみたいですね。
それは置いといてストアをよく見てみるとちゃっかり真ん中に「Ring Clock」が紹介されていました!

紹介されたストアはクエートやUAEなどの中東というマイナー?なところでしたが、紹介されるという機会もめったにないのでうれしい限りです。ただ気になるのがなぜ自分のアプリが選ばれたのかということ。それにはそれなりの基準を満たす必要があるようで、そのことについてはこちらのWindows Phone Developer Blogに書いてあります。
http://blogs.windows.com/windows_phone/b/wpdev/archive/2013/01/31/how-to-get-your-app-promoted-in-the-windows-phone-store.aspx
選択の基準となるものを簡単に説明すると、

  • 機能的であること(Functionality)
  • 役立つものであること(Utility)
  • 楽しめるもの(Enjoyment)

のようです。
アプリケーションが紹介されるときは私の場合だと2日前に知らせてもらえたので前もって準備することができました。これからも他の地域で紹介されるそうなのでたくさんと人に使ってもらえればうれしいです。
果たしてこれがどのくらいダウンロード数に影響を与えるのか、気になるところです。