stdole32.tlb

訳あってつい先日にPCをクリーンインストールした。
それから初めてExcel 2007を立ち上げたら、見慣れないメッセージボックスが。
"stdole32.tlb"という文言とOKボタンしかない。
そのままOKを押すとMS Office 2007の再セットアップが開始されたので、終わるのを待っていた。

無事セットアップが終わったので、もう一度Excelを起動すると再び同じメッセージボックスが...。
もちろん、OKを押すとセットアップが開始され、永遠にExcelを使う事ができない状況に。
CDからMS Office自体を再インストールしてみるも、解決せず。

ggるとSP当てると治るらしいとの事なので、
Windows Updateで最新のService Pack(SP2)を適用すると問題なく動くようになった。

めでたしめでたし。

ハングしまくりなVisual J#

Javaで何かサンプルプログラム的なコードを書こうと思ったものの、いざ書こうと思うと気が重い。
快適にコーディングをしたいので、私にとってIDEは必須なのだが、どうにもEclipseに抵抗があるのだ。
永らくVisual Studioにどっぷりと浸かっていたせいで、慣れないIDEを使う気になれないのである。
かといって、テキストエディタ+コマンドラインは面倒くさい...。

そこで、Visual J# 2005の出番である。
Javaの構文としては、いささか古いものの私が実現したい事をするには問題にならないはず。
かなり久しぶりにJ# 2005を立ち上げ、ひとまずテンプレートのプロジェクトをビルド。
そしてデバッグ実行すると...

...ハングした。
他にも色んなプロジェクト&コードで試したものの、デバッグできない。
J#で本格的なアプリを作る事はないにせよ、デバッグできないのは不便。
というか、デバッガが使えないならIDEの価値が大きく削がれてしまう...。
ちなみに、デバッガなしで実行すると普通に動く。


デバッグ以外にも、ソリューションに複数のプロジェクトを追加しようとすると同じようにハングした。
使い物にならんと思っていたら...


何もしてないのにハングした。


どうやら、起動してしばらく放置しておいてもハングするらしい。

大人しくEclipse使います...。
やはり、Windows 7(64bit)環境で動かすのに問題があるのかしら。



#J#ってジェネリックもforeachも使えないのね。
#やっぱりだめだ。使えない。

Visual Studioハッカソン(ゆるめ)

Visual Studioハッカソン(ゆるめ)に参加してきました。
Geek気味かつ、Visual Studioや.NET大好きな人達が集い、その場で何かアプリを作ってしまおう、というイベントです。
参加された人達のほとんどが、C#使いだったようです。
IT技術系のイベントに参加するのは初めてだったので、ついていけるかどうか、ちょいと不安だったのですが。
最初の自己紹介から和やかな雰囲気で進行し、そんな心配は全く要らなかったです。

流れとしては、
自己紹介(その時に温めてきたアイデアも発表する)

チーム決め(各々で自由に話し、アイデアに賛同する者を集う)

コーディング

発表

話し合いの結果、5のチームに分かれる事になり、私は「アドイン初心者の会」チームに参加する事にしました。
その名の通り、Visual Studioのアドインを作成する事が目的のチーム。人数は4名。
もちろん、Visual Studioアドインに関しては皆初心者です。

折角Visual Studioのアドインを作るんですから、ドッキングできるウィンドウを表示したいという事に。
だってドッキングできた方がVisual Studioっぽいじゃない。
ですが、なんせアドイン初心者ですからドッキングウィンドウを実装する方法がわからない。
手探り状態からのスタートでした。

その上で何を実現するアドインにするか議論した末、ToDo管理アドインに決定。
他のチームは割と個性的な内容だった中、あまり面白みのない目的だったかも知れません。
良く言えば真面目な目的?

私が用意した環境はVisual C# 2010 Express Editonだったのですが、アドイン作りに関して制約が。

  1. プロジェクト テンプレートを作成できない。
  2. ビルドはできるがデバッグ(実行)できない。

1.はほかの上位エディションを使っている方にテンプレートを作成してもらえば済むので、大した問題ではないのですが、2.は致命的。
アドインを実行するためには親となる外部プログラムとしてdevenv.exeが必要になるのですが、
devenv.exeはProffesional Edition以上にしか含まれない。
製品版なら実行対象の外部プログラムも変更できるみたいですが、Express Editionでは不可能。
 #今更思いついたけど、vcsexpress.exeをdevenv.exeにりネームしたら動いたのかしら?
 #参照してたパスは同じっぽいし、Express Editionでも拡張機能マネージャーからアドイン導入できるみたいだし

詳細は同じアドイン初心者の会の@nara_reimei氏のBlogが詳しいです。
 悩めるエンジニアの技術メモ


チームの4名のうち、私を含めて2人がExpress Editionだったので役割分担をすることになり、
私はToDoの内容を登録するためのフォームを作ることにしました。

そのフォームのクラス名を何にしようか、とチームの方々に聞いたら「素敵な感じで」と言われました。
なので、そのまま「素敵なフォーム」クラスを作りました。

public sealed class 素敵なフォーム : Form

なでしこ以外で初めてマルチバイト文字のクラス作った気がする。
 #「IntelliSenseが効かない」と散々不評を買ったので、マルチバイトな名前をつける時はプリフィックスを付けましょう。

なんか色々問題が発生したりしつつも、17時の発表の時刻と同時に無事完成しました。
とりあえず、楽しかったです。
でも、他のチームの人とあまり話す機会がなかったのは残念。
他のチームが技術的に躓いた話とかはもっと聞きたかったかな。

投票の結果、優勝し賞状とシャンパンを頂きました。
楽しかったので、次回も是非参加したいです。
その時はVisual StudioのUltimate Editionを用意して行きます。

参加された皆様、アドイン初心者の会の皆様、お疲れ様でしたー。

 #だらだら書いてたら適当な文章になりました。

GeekBear 2回目

私にとって2度目となるGeekBear、参加してきました。
んー、とってもGeek


ハードに詳しい方とお話できて、とても勉強になりました。
有線ヘッドホンを自前でBluetooth化しちゃったりとか...。
次にマシンを新調する時は相談しよう。

#半田ごてはセラミック製が良いそうです。

Google Code Jam : Sprint to Google I/O 2012

GeekBearで教えてもらったGoogle Code Jam : Sprint to Google I/O 2012をやってみた。
しかし、提出には至らず。

Cでも書いてみたけど、めんどくさい。
特にProblem-Bは、他の高級言語でやるのに比べて難易度が上がりすぎる気がする。
その後にC++で書き直してみると、C++STLの偉大さが良く分かる。
今回みたいにコーディングスピードが求められる場合、Cはどう考えても向かないんだけど、Cでチマチマ書くのが楽しいのです。
Pythonだとすごく楽に書けるそうな。

冗長なコードになったので、そのうち書き直したい。
Cで書いたコードはカオスすぎるので載せません。



Problem A. Android Figurines

C#

namespace Sprint.to.Google.IO._2012.A
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            var sb = new System.Text.StringBuilder();
            using (var sr = new System.IO.StreamReader(args[0], System.Text.Encoding.ASCII))
            {
                sr.ReadLine();
                for (int i = 1; !sr.EndOfStream; ++i)
                {
                    string[] a = sr.ReadLine().Split(' ');
                    int l = int.Parse(a[0]);
                    int m = int.Parse(a[1]);
                    int t;
                    int max = 0;
                    for (int j = 2; j < a.Length; ++j)
                    {
                        t = int.Parse(a[j]);
                        if (max < t)
                            max = t;
                    }
                    sb.Append(string.Format("Case #{0}: ", i));
                    if (l < max)
                        sb.AppendLine("-1");
                    else
                        sb.AppendLine((m * l - (l - max)).ToString());
                }
            }
            System.IO.File.WriteAllText("A-answer.out", sb.ToString(), System.Text.Encoding.ASCII);
        }
    }
}

C++

#include <fstream>
#include <sstream>
#include <string>
int main(int argc, char** argv)
{
    int l, m, t, c, max;
    std::ifstream ifs(argv[1]);
    std::ofstream ofs("A-answer.out");
    std::stringstream ss;
    std::string s;
    ifs >> c;
    for (int i = 1; i <= c; ++i)
    {
        max = 0;
        ifs >> l >> m;
        std::getline(ifs, s);
        ss << s;
        while (!ss.eof())
        {
            ss >> t;
            if (max < t)
                max = t;
        }
        ss.clear();
        ofs << "Case #" << i << ": ";
        if (l < max)
            ofs << "-1";
        else
            ofs << m * l - (l - max);
        ofs << std::endl;
    }
    return 0;
}


Problem B. Repeated Numbers

C#

namespace Sprint.to.Google.IO._2012.B
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            var sb = new System.Text.StringBuilder();
            var l = new System.Collections.Generic.List<int>();
            using (var sr = new System.IO.StreamReader(args[0], System.Text.Encoding.ASCII))
            {
                sr.ReadLine();
                for (int i = 1; !sr.EndOfStream; ++i)
                {
                    string[] a = sr.ReadLine().Split(' ');
                    int k = int.Parse(a[0]);
                    for (int j = 0; j < a[1].Length && k < a[1].Length - j; ++j)
                    {
                        string t = a[1].Substring(j, k);
                        if (a[1].Substring(a[1].IndexOf(t) + 1).IndexOf(t) != -1)
                        {
                            int n = int.Parse(t);
                            if (l.IndexOf(n) == -1)
                                l.Add(n);
                        }
                    }
                    sb.Append(string.Format("Case #{0}:", i));
                    if (l.Count == 0)
                        sb.Append(" NONE");
                    else
                    {
                        l.Sort();
                        foreach (int it in l)
                            sb.Append(string.Format(" {0}", it));
                        l.Clear();
                    }
                    sb.AppendLine();
                }
            }
            System.IO.File.WriteAllText("B-answer.out", sb.ToString(), System.Text.Encoding.ASCII);
        }
    }
}

C++

#include <algorithm>
#include <vector>
#include <fstream>
#include <string>
#include <cstring>
#include <cstdlib>
int main(int argc, char** argv)
{
    std::ifstream ifs(argv[1]);
    std::ofstream ofs("B-answer.out");
    std::string s, t;
    std::vector<int> v;
    int k, n, c;
    ifs >> c;
    for (int i = 1; i <= c; ++i)
    {
        ifs >> k >> s;
        for (int j = 0, l = s.length(); j < l && k < l - j; ++j)
        {
            t = s.substr(j, k);
            if (strstr(strstr(s.c_str(), t.c_str()) + 1, t.c_str()))
            {
                n = strtol(t.c_str(), NULL, 10);
                bool exist = false;
                for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
                {
                    if (*it == n)
                    {
                        exist = true;
                        break;
                    }
                }
                if (!exist)
                    v.push_back(n);
            }
        }
        ofs << "Case #" << i << ':';
        if (!v.size())
            ofs << " NONE";
        else
        {
            std::sort(v.begin(), v.end());
            for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
                ofs << ' ' << *it;
            v.clear();
        }
        ofs << std::endl;
    }
    return 0;
}

なんか突っ込みどころがあればこっそりと優しく教えて下さい。

GeekBear

職場の方の紹介で、GeekBearに参加しました。
毎週木曜日に大阪北新地のバーで、技術について好きなように語り合うといった感じのイベントだそうです。

イベント名の通り、Geekな人達ばっかーり...。
あまりの凄さに打ちのめされる事が多々ありましたが、こういうイベントに参加する事も初めてだし、
色んな意味で良い刺激になったので、これからも可能な限り参加したいと思います。
他の勉強会とかにも出てみようかしら。

GeekBearに来ていた人達がGoogle CodeJam I/O 2012に参加するという事だったので、私もやってみる事にしました。
それでは、今からやってきまーす。




#あ。そういえば、遂に無職を卒業しました。

悪名高き「Eメール」

Windows Phoneでキャリアメールが使用できるアプリ、その名も「Eメール」。
Windows Phoneアプリの中でも取り分けて悪名高いと思われる。Marketplaceでのレビューもひどいしね。

私が思う致命的な問題は、

・プッシュ機能がない
 通知だけならあるけど、「メールが来た」という通知だけで差出人も件名もわからない。
 受信は結局手動。そして遅い。

・アプリの起動が遅すぎる
 起動するとまず、受信トレイにある受信済みメールを全て読み込む。遅い。これが驚異的なほどに遅い。
 更に引き続いてサーバーから受信を始める。これも遅い。
 特に受信済みメールの読み込みが異様なまでに遅いので、メールが1000件以上あると起動に1分程度かかるそうな。
 フォルダ分けして受信トレイを常に空にしておけば、サーバーからの受信だけなので起動が幾分早くはなるけど、
 ユーザーにここまでの手間とストレスを与えるアプリってどうなんだろうか。
 ちなみに、この手順通りにしててもちょっとマシになる程度で結局遅い事に変わりはない。

・メールの一括削除ができない
 溜まりに溜まった不要なメール。これらを一括して全削除する事ができない。
 例えば、1000件のアイテムを削除したいときは1000回タップする必要がある。
 もちろん、フォルダごと削除なんて粋な事ができるはずがない。

こんな感じかな。
特に最後の「メール一括削除」なんて簡単に実装できそうなんだけどなー。
特にこの辺りの操作性はスマフォアプリにとって重要だと思うので、アプリ開発の反面教師には良いかも。

まぁ、工夫次第でそれなりに使えるけど、決して使いやすい訳ではないし、ストレスが貯まる。
キャリアメールに拘らなければ敢えて使う必要はないアプリ。
今後の改善に期待。

まぁ、私はキャリアメールは頻繁に使わないので、滅多に起動する事はないんだけども。