VMWare FusionのWindowsアプリへのショートカットを消す

こんにちは。近頃はだいぶ寒くなり、日が暮れるのも早くなってきました。
気づいたら外が暗くなってたってことも結構あって、切ない季節です。。。

さて、VMware FusionWindows仮想マシンファイルを自分の所有する
Macに移し替えていったら、Windowsアプリへのショートカットが
ガシガシ増えてきたので、それを消す方法を書いておきます。
同じアプリケーションが3つや4つも増えて、LaunchPadがそりゃもうひどい状態で。。。(泣

やり方

やり方は至って簡単。仮想マシンファイルを右クリックしてパッケージの中身を表示、
その中に''Application''フォルダがあるのでその中身を消すだけ!
いとも簡単に消し去ることが出来ました。やりー。

最後に

VMWare fusionの設定も忘れずに。仮想マシンの設定にある
デフォルトアプリケーション設定の中の「Mac アプリケーション フォルダから Windows アプリケーションを実行します」的な
チェックボックスを外しておきましょう。これにチェック入れたままだとまたアプリケーションが生成されてしまいます。。。

ICPC予選観戦

7月6日(金)にACM-ICPCプログラミングコンテストが行われました。
今年は参加せず、観戦しながら最初の2問解いたので載せておきます。
しかし、プロコン観戦は地味ですねぇ・・・笑

Problem A ミレニアム

経過した日数を計算して、最終的に1年1月1日から1000年1月1日の経過日数(196471日)から引き算して答えを出しました。

#include <stdio.h>

int solve(int year, int month, int day) {
	int sum_day = 0;
	int i;

	for(i = 1; i < year; i++) {
		if(i % 3 == 0) sum_day += 200;
		else sum_day += 195;
	}
	for(i = 1; i < month; i++) {
		if(year % 3 == 0) sum_day += 20;
		else if(i % 2 == 0) sum_day += 19;
		else sum_day += 20;
	}

	return sum_day + day;
}

int main(void) {
	int i, n;
	int year, month, day;

	scanf("%d", &n);
	for(i = 0; i < n; i++) {
		scanf("%d %d %d", &year, &month, &day);
		printf("%d\n", 196471 - solve(year, month, day));
	}
	return 0;
}

Problem B 繰り返す10進数

数値を桁数に合わせてsprintfで整形。
あとはqsortで文字列をソートしてfor文をまわすだけ。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int comp(const void* a, const void* b) {
	char *aa = (char *)a;
	char *bb = (char *)b;

	return (int)(*bb - *aa);
}

int comp2(const void* a, const void* b) {
	char *aa = (char *)a;
	char *bb = (char *)b;

	return (int)(*aa - *bb);
}

void solve(int a, int L) {
	char str[10], str2[10];
	char fo[10] = "%%0%dd";
	char fo2[10] = "";
	int i, j, a_[20];
	int max, min;

	a_[0] = a;

	sprintf(fo2, fo, L);
	for(i = 1; i <= 19; i++) { 
		sprintf(str, fo2, a_[i - 1]);

		qsort(str, L, sizeof(char), comp);
		max = atoi(str);
		qsort(str, L, sizeof(char), comp2);
		min = atoi(str);
		a_[i] = max - min;
	}

	for(i = 0; i < 20; i++) {
		for(j = i + 1; j < 20; j++) {
			if(a_[i] == a_[j]) {
				printf("%d %d %d\n", i, a_[i], j - i);
				return;
			}
		}
	}
}

int main(void) {
	int a0, L;

	scanf("%d %d", &a0, &L);
	while(a0|L) {
		solve(a0, L);	
		scanf("%d %d", &a0, &L);
	}

	return 0;
}

Problem Aはすぐに解答できたのですが、Bでかなりの凡ミスをしてしまい時間を食ってしまって結局この二つで一時間を費やしました。。。
この時点でトップは3問解いていたので、やっぱすごいなとつくづく思ったり。
精進していきます。はい。

フォーム無しアプリケーションの開発

C#でフォームが不要なアプリ、例えばサービス的なプログラムを作るには、
Mainスレッド内でいろいろ初期化をしてから最終的に Application.Run メソッドを
実行すれば作成できます。

プロジェクトの作成時には Windows フォーム アプリケーションを選びましょう。

namespace WithoutForm
{
    static class Program
    {
        [STAThread]
        static void Main(String[] args)
        {
            // ここでいろいろ初期化

            // アプリケーションの終了時に呼ばれるイベントハンドラを登録
            Application.ApplicationExit += new EventHandler(exitHandler);
            // Run でひたすらループ
            Application.Run();
        }

        public static void exitHandler(object sender, EventArgs e)
        {
            // 終了処理
        }
    }
}

アプリケーションを終了するには Application.Exit メソッドを呼び出せばOKです。

SSHのシェルもどきをつくる

.NETでsshを行うには、SharpSSH(http://www.tamirgal.com/blog/page/SharpSSH.aspx)というライブラリを利用することで実現できます。(他にもあるかもしれないけど一応これだけ)
このSharpSSHを利用して、sshのシェルもどきをGUIで作ってみます。
SharpSSHのソースコードには、sshをコンソールで行うサンプルプログラムが入っていて、それを見ながら組みました。

まず、適当にフォームをデザインして以下のような感じでソースを書きます。

public partial class SSHWnd : Form
{
    private SshShell ss = null;
    private Stream io = null;
    private SshConnectionInfo scInfo;

    private static byte[] buffer;
    private static int bufSize = 256;
    private static AsyncCallback readCallback;

    private delegate void addLineDelegate(string s);

    public SSHWnd(SshConnectionInfo scInfo)
    {
        InitializeComponent();

        this.scInfo = scInfo;
        try
        {
            ss = new SshShell(scInfo.Host, scInfo.User);
            if (scInfo.Pass != null)
            {
                ss.Password = scInfo.Pass;
            }
            if (scInfo.IdentityFile != null)
            {
                ss.AddIdentityFile(scInfo.IdentityFile);
            }
            ss.Connect(22);
            io = ss.GetStream();
            buffer = new byte[bufSize];
            readCallback = new AsyncCallback(OnCompletedRead);
            io.BeginRead(buffer, 0, bufSize, readCallback, null);
        }
        catch
        {
            MessageBox.Show("Error!");
        }
    }

    private void OnCompletedRead(IAsyncResult ar)
    {
        int bytesRead = io.EndRead(ar);

        if (bytesRead > 0)
        {
            String str = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            this.Invoke(new addLineDelegate(addLine), new object[]{str});
            io.BeginRead(buffer, 0, bufSize, readCallback, null);
        }
    }

    void addLine(string s)
    {
        textBox1.AppendText(s);
    }

    private void SSHWnd_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (ss.Connected)
        {
            io.Close();
            ss.Close();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox2.Text != "")
        {
            try
            {
                StreamWriter sw = new StreamWriter(io);
                sw.Write(textBox2.Text);
                sw.Write('\n');
                sw.Flush();
            }
            catch
            {
                MessageBox.Show("Terminated yet!");
                this.Close();
            }

            textBox2.Text = "";
        }
    }
}

と、今回はここまで。
次回解説をば。

listings を利用する

日本語環境で満足にLaTeXのListingsを利用するにはjlisting.styが必要。
下のサイトを見ながらjlisting.styをインストールした。
http://mytexpert.sourceforge.jp/index.php?Listings

使い方

Listingsは主にプログラムのソースをLaTeX文章に挿入するときに便利。
きれいにソースを出力してくれる。

% パッケージ
\usepackage{listings, jlisting}

% Listings設定(フォント指定は適当)
\lstset{language=C,frame=single, stepnumber=1,numbersep=5pt,tabsize=4,%
basicstyle=\small\ttfamily, stringstyle=\small\texttt, commentstyle=\slshape, captionpos=b,%
columns=[l]{fullflexible}}

% Listings本体
\begin{lstlisting}[caption=Source Code, label=src:source, numbers=left, xleftmargin=2cm, xrightmargin=2cm]
プログラムのソースコードとか
\end{lstlisting}

\lstsetでlistingsの全体設定を行う。
\begin{lstlisting}[hogehoge]のhogehogeの中に各listingsの個別の設定ができる。

listingsのくわしい設定はこのサイト(http://tug.ctan.org/tex-archive/macros/latex/contrib/listings/)のlistings.pdfを参照のこと。

説明が必要そうな項目だけピックアップ。

設定項目 効果
captionpos キャプションの位置を上にするか下にするか指定できる。
frame ソースコードに枠をつけるかどうか。陰付きや二重線の枠などいろいろある。
xleftmargin, xrightmargin ソースコードの枠の左側と右側の余白を指定する。これで枠の大きさを調節できる。

枠の大きさの調節がわからず、2時間ぐらい悶絶してました。。。
さて論文の続きをがんばって書きますか!

メディアキットを買ってしまった

Macbook Airを先月頭に買って、「ついでだからWindowsも起動できるようにしよう!」と思い、VMWare Fusion 4も通販で購入した。

で、VMWareが届いて、さあインストールだ!と、インストールDVDを入れて、シリアルナンバーを聞かれたのでシリアルナンバーが書いてあるであろうカードを見ると、、、

シリアルナンバーが書いてない。。。

Serial Numberという欄はあるが、その中身が空白。
えっ、騙された・・・?これは店舗サイトに凸か・・・?
でもめんどくさい(殴

ちょっと冷静になって、DVDに付属していたカードにこのDVDの型番らしきものが書いてあったのでググると、あまり情報が出てこない。。。(ちなみに FUS4-MKIT-CP)

逆にこのVMwareを取り扱っている店がたくさん出てきたので、いろいろ見ていると何やら「メディアキット」という単語がちらほら目につく。
確かに型番にもMKITとあるからそれなんであろう。でもメディアキットってなに・・?

いろいろ調べた結果、Yahoo! 知恵袋のこの質問をみて愕然とした。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1016394885

ここではDisk Kitと書かれているが、Media Kitでも同義であろう。
引用すると、

ディスクキットはインストール用のメディアのみで、ライセンスが付いていません。
ライセンスを別に購入した人用のものです。

ま、マジか。死にたい。そんなこと書いてなかったし。。。
なんかもう買った店舗に言ったって「そんなことわかってる前提で買われていると思いました!」
って対処されそうだからもういいや。しらん。もうあの店舗じゃかわん。あえて店舗名は言いません。ごたごたになりそうな気がするんで。

とりあえずみなさんも購入する際には気をつけてください。
自分はあとでシリアルをオンライン購入でもします;;

はーやるきねぇ。やっぱ公式で買った方がいいな。高くても。