SyntaxHighlighter

StackEdit CSS

2012年12月22日土曜日

Windows7の付箋のデータを取得

普段使ってるWindows7の付箋のデータをバックアップしたくなったので、Win32APIを使って組んでみた。


#include<iostream>
#include<windows.h>

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lp){
    TCHAR name[1024];
    GetClassName(hwnd, name, 1024);
    if(lstrcmp(name, "Sticky_Notes_Note_Window") == 0){
        HWND child;
        child = FindWindowEx(hwnd, NULL, "DirectUIHWND", NULL);
        if(!child) return TRUE;
        child = FindWindowEx(child, NULL, "CtrlNotifySink", NULL);
        if(!child) return TRUE;
        child = FindWindowEx(child, NULL, NULL, NULL);
        if(!child) return TRUE;
        
        TCHAR text[1024];
        SendMessage(child, WM_GETTEXT, 1024, (LPARAM)text);
        std::cout << text << std::endl << std::endl;
    }
    return TRUE;
}

int main(){
    EnumWindows(EnumWindowsProc, 0);
    
    return 0;
}

 Spy++を使って付箋を見たら、"Sticky_Notes_Note_Window" - "DirectUIHWND" - "CtrlNotifySink" - ""のクラス名の順に子になっていた。一番下に、目的のデータがあるということが分かった。 
 目的のデータがあるハンドルを取得して、よしデータを取得しようと思って、17行目に
GetWindowText(child, text, 1024);
と書いたらtextには何も入っていなかった。MSDNをよく見たら、
他のアプリケーションのエディットコントロールのテキストをこの関数で取得することはできません。
とあった。知らなかったorz.. 下にあった、
他のプロセス内のコントロールのテキストを取得するには、GetWindowText 関数を呼び出すのではなく、直接 WM_GETTEXT メッセージを送ります。
の通りにしたら動いた。 やったね!
参考
MSDN GetWindowText

2012年12月19日水曜日

テンポラリを使わずにスワップする

学校でやった勉強会でこんなのがあった。

Q.一時変数を使わずに、値を入れ替える関数を書いてください。

これはどっかでみて、xorを使うとだけ覚えていた。(a, bは変数全体 A, Bはビットが立っていることを示す)

ソース

#include<iostream>
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    
    b ^= a;
    a ^= b;
    b ^= a;
    
    cout << a << ' ' << b << endl;
    return 0;
}



xorを知らなかったら、できなかっただろうなぁ

2012年12月17日月曜日

【死亡】JOI予選参加報告

 昨日、JOIの予選があって、それに参加してきました。まず結果から言うとまずまずでした。具体的には、問1~3は全部できて(正解かどうかは別として)、問4は入力2まで出来ました。
 学校で参加して、何人かまとめて応募したので本選枠が2つもらえたのですが、自分より上の人を目撃したので終わりました。どう見ても予選落ちです。本当にありがとうございました。

2012年12月9日日曜日

[AOJ]#507

もうすぐ情報オリンピックだから、頑張らないとなぁ #DPできません...
#include<iostream>
#include<vector>
using namespace std;

typedef vector<int> data;

vector<data> ans;

void make(data d, int n){
    if(n == 0){
        ans.push_back(d);
        return;
    }
    for(int i = 1;i <= n;i++){
        if(d.size() > 0 && i > d.back()) continue;
        data t(d);
        t.push_back(i);
        make(t, n - i);
    }
}

int main(){
    while(1){
        int n;
        cin >> n;
        if(n == 0) break;
        make(data(), n);
        for(int i = ans.size() - 1;i >= 0;i--){
            for(int j = 0;j < ans[i].size();j++){
                cout << ans[i][j];
                if(j != ans[i].size() - 1) cout << ' ';
            }
            cout << endl;
        }
        ans.clear();
    }
    return 0;
}

OnlineJudge自作1

きっかけ

 今度学校で、ショートコーディング大会を開催しようと思っている。
 最初はあらかじめソースを提出してもらって、当日は結果発表をしようと思っていたが、地味という声があった。
 考え直した結果、簡易ジャッジシステムを作って、当日、リアルタイムでランキングすればそれなりに盛り上がるなぁと思った。そこで前に作った、簡単なオンラインコンパイラをベースに改造していく。

オンラインコンパイラ

Ubuntu 12.10(Server)をVirtualBox上で稼働させて、Windows(ホスト)からアクセスした。
 コンパイルを実行(POST)すると、CGIにソースが流し込まれる。CGIはPerlで書かれており、これは流し込まれたソースをファイルに保存して、コンパイルし、実行して、標準出力に書き込む。返ってきたやつはOutputに書き込まれる。
 さまざまな言語に対応させるためにはどうしたらいいか考えたら、3つのタイプに分けられることに気づいた。

  • C++みたいな、コンパイル→実行のネイティブタイプ。これはコンパイル時にはエラーがあるが、実行時にはない。
  • Javaみたいな、中間言語にコンパイルされるタイプ。こちらは実行時にもエラーがある。
  • Rubyみたいな、コンパイル不要のスクリプトタイプ。いきなりインタプリタを実行する。
 コンパイルと実行を分けていたがあまりにも共通部分があったので考えたら、実行関数の、引数の1つのエラーメッセージを渡したときに、エラー判定をすることで、結構すっきりすることが分かった。Perlは引数を渡さなかったら、undefinedになるのでそれを利用した。C++にも似たようなものに、デフォルト引数があるが、これはあらかじめ値をセットしなければいけない。
 アルゴリズム的にはそんなに難しくないが、サーバー(仮想だが)を立てるところからするのは初めてで、なかなか手間取った。普段使っているC++とは違う文化を感じられていい経験になったと思う。

準備

今回のは前のように無計画にいくわけにはいかないと思ったので、少し考えてから作成に取り掛かることにした。
まず必要な機能の列挙

  • ユーザー識別。これがないとランキングできない。
  • ソース提出&コンパイル。これは前のが活きると思う。
  • ステータスキュー&ランキング表示
これを踏まえ、次の構成にしようと考えた。
ディレクトリ構造は、
という風にすることにした。
 ステータスファイルをどのように持とうかと思ったが、とりあえずXMLにすることにした。持つデータは階層構造にした方がいいと思ったからだ。ちなみに持つデータは、
  • 現在のポイント
  • 問題ごとの情報。コードサイズ、実行時間、使用メモリ
を考えている。
 ステータスキューは、csvにすることにした。これは階層構造は不要で、むしろ2次元データのほうが嬉しいからだ。
 ユーザー識別は、答え(=ググる)を見ずに自分で実装したかった。何か使えそうなものはないかと探していたら、cookieが使えそうなことが分かった。cookieに、エントリーページで入力してもらったユーザーIDをいれておき、ソース提出画面や、ステータスキュー、ランキング画面で、cookieのuseridが空だったら、エントリーページに飛ばすということにした。まぁ使うのはショートコーディング大会のときだけだから、この程度でいいと思った。

思いのほか大変そうだ…

久々の更新

2か月ぶりの更新orz。この間にいろいろなことがあったなぁ。
まず、高専プロコン。あの船のやつの補助をやらせてもらった。補助といっても、モーター全般を担当して、ほぼメンバーだった。今回は計画性がなかったなぁと反省。前日までに間に合わず、当日調整していたのは秘密。こういう大会に行ったのはこれが初めてで、外の世界を見られたという点でよかった。
そして、高専祭。1年生が書いた絵、例の船、先輩が作ったシューティングが人気だったようだ。自分はkinectを使った何かを作ろうと思ってたが結局何もできなかった。さらに前から友人と作っていた、Androidのゲームも高専祭までに何とか体験版を完成させようと思ったが、できずに、友人の提案でコーディング晒しをする羽目となった。これも無計画に起因する。
海外研修もあった。初めて海外に行ったのだが、文化、風土の違いに驚いた。カルチャーショックというやつか。
最近では後期中間テストがあった。眠かった。
そんなこんなで、今度学校で勉強会を開催しようと提案した。自分のコミュ障解消を込めて。そういえばまだスライドできてねえw