2013年2月8日金曜日

LTSVが流行っているみたいなのでパーサーを書いてみた。

C# で動くLTSVパーサーです。


https://github.com/mezashi184/LTSV



using

using LTSV

parse line

Record record = Parser.Line("host:127.0.0.1\tident:-\tuser:frank");
Console.WriteLine(record["host"]); // "127.0.0.1"
Console.WriteLine(record["ident"]); // "-"
Console.WriteLine(record["user"]); // "frank"

parse file

IEnumerable records = Parser.Line("host:127.0.0.1\tident:-\tuser:frank");

foreach (Record record in records)
{
    Console.WriteLine(record); // "host:127.0.0.1\tident:-\tuser:frank"
}

create line

Record record = new Record();
record["test"] = "sample";
record["foo"] = "bar";
Console.WriteLine(record.ToString()); // "test:sample\tfoo:bar"


2013年1月28日月曜日

Jenkinsプラグインを.hpiとして直接ダウンロードする。


以下のURLからダウンロードできます。

http://updates.jenkins-ci.org/download/plugins/


2012年12月11日火曜日

VC2010で.NetFrameworkのバージョンを2.0に変更する

VisualStudio2010で
C++/CLIで.NetFrameworkのバージョンを2.0に変更したかったのですが、
C#はUIで設定できるのにC++はUIで変更は出来ないようです。
(頑張ってUIを探してみたけど見つかりませんでした。。)

検索したら、MSDNに載ってました。
http://msdn.microsoft.com/ja-jp/library/ff770576(v=vs.100).aspx
.vcxprojを直接編集するしかないみたい。

以下のタグの値を変更すればOKとのこと。
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

早速エディタで.vcxprojを開いてみましたが。。。
TargetFrameworkVersionのタグがない!!

それっぽいタグの中に追加。
<PropertyGroup Label="Globals">
  <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
</PropertyGroup>

無事C++/CLIのプロジェクトのプロパティで対象フレームワークにv2.0と表示されました!

早速ビルドしてみると。。。
エラー。
----

error MSB8009: .NET Framework 2.0/3.0/3.5 は、v90 のプラットフォーム ツールセットを対象としています。コンピューターに Visual Studio 2008 がインストールされていることを確認してください。
----
なんという!

VisualStudio2008をインストールするとちゃんとビルドできました。

非常に面倒ですね。GUIで変更できないだけでなく、
古いバージョンのVisualStudioが必要とか。
何とかならないもんですかねぇ~。


2012年12月7日金曜日

文字列に特定の文字が含まれているのをチェックする


バッチファイルで文字列に特定の文字が含まれているのをチェックする方法です。

例:

echo aaa bbb|findstr /C:" ">NUL
if not ERRORLEVEL 1 echo ok




例:バッチファイルを実行したパス(フォルダ)に半角スペースがあるかを調べる

echo %~dp0|findstr /C:" ">NUL
if not ERRORLEVEL 1 echo ok



2012年11月14日水曜日

C# .NET2.0で使えるParserクラスを作ってみた。

HaskellのParsecに触発されて、
C# .NET2.0で使えるParserクラスを作ってみた。


https://github.com/mezashi184/Parq


サンプル
----

   Parser parser = CharParser.Range('0', '9');
   using (StringSource source = new StringSource("012"))
   {
      Assert.That(parser.Run(source), Is.EqualTo('0'));
   }
----



2012年9月1日土曜日

C++/CLIでIEnumerableを実装してみる。


サクッと実装する予定が"明示的なオーバーライド"ではまってしまったので、
残しておきます。


以下のように実装クラスを書いてコンパイル!
public ref class SampleList:public System::Collections::Generic::IEnumerable
{
public :
    virtual System::Collections::Generic::IEnumerator^ GetEnumerator() { return nullptr; }
    virtual System::Collections::IEnumerator^ System::Collections::IEnumerable::GetEnumerator() { return GetEnumerator(); }
};


すると。

エラー、エラー、エラー。。。。

error C3253: 'IEnumerable.GetEnumerator' : 明示的なオーバーライドでエラーが発生しました
error C2838: 'IEnumerable.GetEnumerator' : メンバ宣言内の限定名が間違っています。
error C3648: この明示的なオーバーライド構文には /clr:oldSyntax が必要です


明示的なオーバーライドは /clr オプションでは出来ないみたい。


調べるとMSDNさんにありました。
関数のオーバーライドを別の関数名にして実装が出来るとのこと。
http://msdn.microsoft.com/ja-jp/library/fw0bbh51(v=vs.80).aspx

これで書きなおしたのがこれ!
public ref class SampleList:public System::Collections::Generic::IEnumerable
{
public :
virtual System::Collections::Generic::IEnumerator^ GetEnumerator() { return gcnew Iterator(); }
virtual System::Collections::IEnumerator^ GetEnumeratorImpl() =System::Collections::IEnumerable::GetEnumerator { return GetEnumerator(); }
};


■参考サイト。
http://msdn.microsoft.com/en-us/library/fw0bbh51(v=vs.80).aspx


■おまけIEnumeratorの実装。
ref class Iterator : System::Collections::Generic::IEnumerator
{
    int i;
public:
Iterator()
{
i = -1;
}
virtual ~Iterator()
{
}


property virtual int Current
{
int get()
{
return i;
}
}
virtual System::Object^ CurrentImpl() = System::Collections::IEnumerator::Current::get
{
return Current;
}
virtual void Reset() = System::Collections::IEnumerator::Reset
{
throw gcnew NotImplementedException();
}


virtual bool MoveNext()
{
i++;
return i;
}


};



2012年8月10日金曜日

CentOSでcronの設定

定期的に処理をしたかったので、cronの設定を調べました。


cronの設定を編集する。
# crontab -e
* * * * * 実行するコマンド
例:毎時0分に実行する。
0 * * * * echo test
参考:


ラベル