Hatena::ブログ(Diary)

TECHNERD::INIT このページをアンテナに追加

2009-02-17 ip6tables このエントリーを含むブックマーク

IPv6フィルタを行うときは以下のようなシェルを作って対応しています。

#!/bin/sh

# 全てのルールを削除
ip6tables -F
# 全てのユーザ定義チェインを削除
ip6tables -X

# 基本的には外部からのパケットの通過を拒否
ip6tables -P INPUT DROP
#ip6tables -P INPUT ACCEPT
# 基本的には外部へのパケットの通過を許可
ip6tables -P OUTPUT ACCEPT
# 基本的には他のインターフェイスへ再送信を拒否
ip6tables -P FORWARD DROP

# lo( ループバック)からのINPUTを許可
ip6tables -A INPUT -i lo -j ACCEPT

#RS,RA,NS,NAを受け入れる
ip6tables -A INPUT -i eth0 -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
ip6tables -A INPUT -i eth0 -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -i eth0 -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -i eth0 -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT

# 個々のアクセス制御を以下に記述
# HTTPアクセスを許可
ip6tables -A INPUT -i eth0 -p tcp -s 2001:1234:1234::/48 --dport 80 -j ACCEPT

# HTTPSアクセスを許可
ip6tables -A INPUT -i eth0 -p tcp -s 2001:1234:1234:1234::cafe/128 --dport 443 -j ACCEPT

# ip6tablesに保存する
ip6tables-save > /etc/sysconfig/ip6tables

このシェルを実行することでルールが適用されます。

# ip6tables -L

でルールを確認することができます。

2008-11-27

簡単Google App Engine入門編

Pythonを知らなかったということもあって、個人的にGoogle App Engine(GAE)がとっつきにくかったので、helloworldまでをまとめてみます。

Python 2.5のインストール

以下のリンクから適当にmsiパッケージをおとしてインストール

no title

補足:基本的なpythonの使い方は以下のサイトが参考になります。

言語習得Pythonへの道

App Engine SDKダウンロードインストール

Download and Install the SDK for App Engine  |  App Engine Documentation  |  Google Cloud

適当なmsiパッケージを選択します。

インストールすると、デフォルトで以下のディレクトリに展開されます。

 C:\Program Files\Google\google_appengine

この中で、重要なスクリプトが以下の二つです。

dev_appserver.py開発環境用のWEBサーバー、ローカルでGoogle App Engineエミュレートしてくれます
appcfg.pyGoogle App Engineにアップするためのスクリプト

これらの使い方は、後ほど・・・

次に、作業用ディレクトリを作ります。

ここでは、C:\gapps\helloworldディレクトリを作成し、その中に以下のファイルを用意します。

 print 'Content-Type: text/plain'
 print ''
 print 'Hello, world!'
 application: helloworld
 version: 1
 runtime: python
 api_version: 1
 
 handlers:
 - url: /.*
   script: helloworld.py

開発用GAEサーバを起動&helloworldデプロイ

DOSプロンプトから、以下のコマンドを実行。

 C:\Program Files\Google\google_appengine\dev_appserver.py C:\gapps\helloworld

dev_appserver.pyの引数デプロイしたいサービスのディレクトリを指定すれば、そのディレクトリデプロイしてサーバが立ち上がります。

私は、面倒くさいんで上記の内容を、dev_appserver.batに上記の内容を記述して起動するようにしています。

ブラウザで表示

続いて、http://localhost:8080/ブラウザでアクセス。

すると・・・

 Hello, world!

と表示されればおめでとう!

次は、Google App Engineへのアカウントの登録とアップロード方法について説明します。

簡単Google App Engine登録編 - TECHNERD::INIT

2008-07-08

Protocol Buffers by Google

Protocol Buffers  |  Google Developers

Protocol Buffersは、XMLデータに比べて1/3〜1/10に小さくなり、20〜100倍高速に処理できるという。

とのこと。


これは、いいです。

今やっている実装の多くは、WSDL,XSDでメソッドとデータ構造を定義して、そこからWSDL2JAVAで実装コードを起こす形に落ち着いているんですが、このProtocol Bufferはそれと比較してもシンプルでよいです。

.protoを用意するだけで、JAVAコードを生成してくれ、さらにそのフィールドに対するgetter/setterも生成してくれました。

WSDLをWSDL2JAVAでコード化する場合とほとんど同じです。

細かいWSDL定義も知らなくてもよいし、XMLのスキーマをいちいち定義しなくてもよいので、かなり楽です。

複雑なデータ構造でなければ、これを使うのがよいです。XMLを用いた階層的なデータでは、従来どおりSOAP/XMLを用いるほうがよさそうですが。

.protoでデータモデルを定義するだけで後はロジックを考えればよくなるので、相当楽になりそうです。

生成されたコードはPOJO(ただのJAVAオブジェクト)になるので、これとDIコンテナを組み合わせるとデータモデルとロジックを分離泥臭いコーディング部分はかなり減らせます。

ちなみに、GoogleもDIコンテナを出しています。

Google Guice - 第1回[前編] Guice 1.0 - GoogleからリリースされたDIフレームワーク:気になる開発プロダクツ|gihyo.jp … 技術評論社

これもかなりよさそうです。

以下に、Protocol Bufferを実行した結果を記します。

  • 準備

http://code.google.com/p/protobuf/downloads/list

から

protoc-2.0.0beta-win32.zip

ダウンロードし、protoc.exeをゲットします。

その後、以下のプロトコルファイルを用意し、コンパイルすればJAVAファイルが生成されます。

  • 実行したコマンド
protoc.exe a.proto --java_out .
  • プロトコルファイル - a.proto
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}
  • 出力ファイル A.java
// Generated by the protocol buffer compiler.  DO NOT EDIT!

public final class A {
  private A() {}
  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static final com.google.protobuf.Descriptors.FileDescriptor
      descriptor = buildDescriptor();
  private static
      com.google.protobuf.Descriptors.FileDescriptor
      buildDescriptor() {
    java.lang.String descriptorData =
      "\n\007a.proto\"\310\001\n\006Person\022\014\n\004name\030\001
\002(\t\022\n\n\002id" +
      "\030\002 \002(\005\022\r\n\005email\030\003
\001(\t\022\"\n\005phone\030\004 \003(\0132\023.P" +
      "erson.PhoneNumber\032D\n\013PhoneNumber\022\016\n\006numb" +
      "er\030\001 \002(\t\022%\n\004type\030\002
\001(\0162\021.Person.PhoneTyp" +

"e:\004HOME\"+\n\tPhoneType\022\n\n\006MOBILE\020\000\022\010\n\004HOME" +
      "\020\001\022\010\n\004WORK\020\002";
    try {
      return com.google.protobuf.Descriptors.FileDescriptor
        .internalBuildGeneratedFileFrom(descriptorData,
          new com.google.protobuf.Descriptors.FileDescriptor[] {
          });
    } catch (Exception e) {
      throw new RuntimeException(
        "Failed to parse protocol buffer descriptor for " +
        "\"a.proto\".", e);
    }
  }

  public static final class Person extends
      com.google.protobuf.GeneratedMessage {
    // Use Person.newBuilder() to construct.
    private Person() {}

    private static final Person defaultInstance = new Person();
    public static Person getDefaultInstance() {
      return defaultInstance;
    }

    public Person getDefaultInstanceForType() {
      return defaultInstance;
    }

    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return A.internal_static_Person_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return A.internal_static_Person_fieldAccessorTable;
    }

    public static enum PhoneType {
      MOBILE(0, 0),
      HOME(1, 1),
      WORK(2, 2),
      ;


      public final int getNumber() { return value; }

      public static PhoneType valueOf(int value) {
        switch (value) {
          case 0: return MOBILE;
          case 1: return HOME;
          case 2: return WORK;
          default: return null;
        }
      }

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return A.Person.getDescriptor().getEnumTypes().get(0);
      }

      private static final PhoneType[] VALUES = {
        MOBILE, HOME, WORK,
      };
      public static PhoneType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }
      private final int index;
      private final int value;
      private PhoneType(int index, int value) {
        this.index = index;
        this.value = value;
      }
    }

    public static final class PhoneNumber extends
        com.google.protobuf.GeneratedMessage {
      // Use PhoneNumber.newBuilder() to construct.
      private PhoneNumber() {}

      private static final PhoneNumber defaultInstance = new PhoneNumber();
      public static PhoneNumber getDefaultInstance() {
        return defaultInstance;
      }

      public PhoneNumber getDefaultInstanceForType() {
        return defaultInstance;
      }

      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return A.internal_static_Person_PhoneNumber_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return A.internal_static_Person_PhoneNumber_fieldAccessorTable;
      }

      // required string number = 1;
      private boolean hasNumber;
      private java.lang.String number_ = "";
      public boolean hasNumber() { return hasNumber; }
      public java.lang.String getNumber() { return number_; }

      // optional .Person.PhoneType type = 2 [default = HOME];
      private boolean hasType;
      private A.Person.PhoneType type_ = A.Person.PhoneType.HOME;
      public boolean hasType() { return hasType; }
      public A.Person.PhoneType getType() { return type_; }

      public static A.Person.PhoneNumber parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistry extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistry extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(java.io.InputStream
input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistry extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static A.Person.PhoneNumber parseFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistry extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }

      public static Builder newBuilder() { return new Builder(); }
      public Builder newBuilderForType() { return new Builder(); }
      public static Builder newBuilder(A.Person.PhoneNumber prototype) {
        return new Builder().mergeFrom(prototype);
      }

      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder<Builder> {
        // Construct using A.Person.PhoneNumber.newBuilder()
        private Builder() {}

        A.Person.PhoneNumber result = new A.Person.PhoneNumber();

        protected A.Person.PhoneNumber internalGetResult() {
          return result;
        }

        public Builder clear() {
          result = new A.Person.PhoneNumber();
          return this;
        }

        public Builder clone() {
          return new Builder().mergeFrom(result);
        }

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return A.Person.PhoneNumber.getDescriptor();
        }

        public A.Person.PhoneNumber getDefaultInstanceForType() {
          return A.Person.PhoneNumber.getDefaultInstance();
        }

        public A.Person.PhoneNumber build() {
          if (!isInitialized()) {
            throw new com.google.protobuf.UninitializedMessageException(
              result);
          }
          return buildPartial();
        }

        private A.Person.PhoneNumber buildParsed()
            throws com.google.protobuf.InvalidProtocolBufferException {
          if (!isInitialized()) {
            throw new com.google.protobuf.UninitializedMessageException(
              result).asInvalidProtocolBufferException();
          }
          return buildPartial();
        }

        public A.Person.PhoneNumber buildPartial() {
          A.Person.PhoneNumber returnMe = result;
          result = null;
          return returnMe;
        }


        // required string number = 1;
        public boolean hasNumber() {
          return result.hasNumber();
        }
        public java.lang.String getNumber() {
          return result.getNumber();
        }
        public Builder setNumber(java.lang.String value) {
          result.hasNumber = true;
          result.number_ = value;
          return this;
        }
        public Builder clearNumber() {
          result.hasNumber = false;
          result.number_ = "";
          return this;
        }

        // optional .Person.PhoneType type = 2 [default = HOME];
        public boolean hasType() {
          return result.hasType();
        }
        public A.Person.PhoneType getType() {
          return result.getType();
        }
        public Builder setType(A.Person.PhoneType value) {
          result.hasType = true;
          result.type_ = value;
          return this;
        }
        public Builder clearType() {
          result.hasType = false;
          result.type_ = A.Person.PhoneType.HOME;
          return this;
        }
      }
    }

    // required string name = 1;
    private boolean hasName;
    private java.lang.String name_ = "";
    public boolean hasName() { return hasName; }
    public java.lang.String getName() { return name_; }

    // required int32 id = 2;
    private boolean hasId;
    private int id_ = 0;
    public boolean hasId() { return hasId; }
    public int getId() { return id_; }

    // optional string email = 3;
    private boolean hasEmail;
    private java.lang.String email_ = "";
    public boolean hasEmail() { return hasEmail; }
    public java.lang.String getEmail() { return email_; }

    // repeated .Person.PhoneNumber phone = 4;
    private java.util.List<A.Person.PhoneNumber> phone_ =
      java.util.Collections.emptyList();
    public java.util.List<A.Person.PhoneNumber> getPhoneList() {
      return phone_;
    }
    public int getPhoneCount() { return phone_.size(); }
    public A.Person.PhoneNumber getPhone(int index) {
      return phone_.get(index);
    }

    public static A.Person parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data).buildParsed();
    }
    public static A.Person parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistry extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data, extensionRegistry)
               .buildParsed();
    }
    public static A.Person parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data).buildParsed();
    }
    public static A.Person parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistry extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data, extensionRegistry)
               .buildParsed();
    }
    public static A.Person parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input).buildParsed();
    }
    public static A.Person parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistry extensionRegistry)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input, extensionRegistry)
               .buildParsed();
    }
    public static A.Person parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input).buildParsed();
    }
    public static A.Person parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistry extensionRegistry)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input, extensionRegistry)
               .buildParsed();
    }

    public static Builder newBuilder() { return new Builder(); }
    public Builder newBuilderForType() { return new Builder(); }
    public static Builder newBuilder(A.Person prototype) {
      return new Builder().mergeFrom(prototype);
    }

    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder> {
      // Construct using A.Person.newBuilder()
      private Builder() {}

      A.Person result = new A.Person();

      protected A.Person internalGetResult() {
        return result;
      }

      public Builder clear() {
        result = new A.Person();
        return this;
      }

      public Builder clone() {
        return new Builder().mergeFrom(result);
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return A.Person.getDescriptor();
      }

      public A.Person getDefaultInstanceForType() {
        return A.Person.getDefaultInstance();
      }

      public A.Person build() {
        if (!isInitialized()) {
          throw new com.google.protobuf.UninitializedMessageException(
            result);
        }
        return buildPartial();
      }

      private A.Person buildParsed()
          throws com.google.protobuf.InvalidProtocolBufferException {
        if (!isInitialized()) {
          throw new com.google.protobuf.UninitializedMessageException(
            result).asInvalidProtocolBufferException();
        }
        return buildPartial();
      }

      public A.Person buildPartial() {
        if (result.phone_ != java.util.Collections.EMPTY_LIST) {
          result.phone_ =
            java.util.Collections.unmodifiableList(result.phone_);
        }
        A.Person returnMe = result;
        result = null;
        return returnMe;
      }


      // required string name = 1;
      public boolean hasName() {
        return result.hasName();
      }
      public java.lang.String getName() {
        return result.getName();
      }
      public Builder setName(java.lang.String value) {
        result.hasName = true;
        result.name_ = value;
        return this;
      }
      public Builder clearName() {
        result.hasName = false;
        result.name_ = "";
        return this;
      }

      // required int32 id = 2;
      public boolean hasId() {
        return result.hasId();
      }
      public int getId() {
        return result.getId();
      }
      public Builder setId(int value) {
        result.hasId = true;
        result.id_ = value;
        return this;
      }
      public Builder clearId() {
        result.hasId = false;
        result.id_ = 0;
        return this;
      }

      // optional string email = 3;
      public boolean hasEmail() {
        return result.hasEmail();
      }
      public java.lang.String getEmail() {
        return result.getEmail();
      }
      public Builder setEmail(java.lang.String value) {
        result.hasEmail = true;
        result.email_ = value;
        return this;
      }
      public Builder clearEmail() {
        result.hasEmail = false;
        result.email_ = "";
        return this;
      }

      // repeated .Person.PhoneNumber phone = 4;
      public java.util.List<A.Person.PhoneNumber> getPhoneList() {
        return java.util.Collections.unmodifiableList(result.phone_);
      }
      public int getPhoneCount() {
        return result.getPhoneCount();
      }
      public A.Person.PhoneNumber getPhone(int index) {
        return result.getPhone(index);
      }
      public Builder setPhone(int index, A.Person.PhoneNumber value) {
        result.phone_.set(index, value);
        return this;
      }
      public Builder setPhone(int index, A.Person.PhoneNumber.Builder
builderForValue) {
        result.phone_.set(index, builderForValue.build());
        return this;
      }
      public Builder addPhone(A.Person.PhoneNumber value) {
        if (result.phone_.isEmpty()) {
          result.phone_ = new java.util.ArrayList<A.Person.PhoneNumber>();
        }
        result.phone_.add(value);
        return this;
      }
      public Builder addPhone(A.Person.PhoneNumber.Builder
builderForValue) {
        if (result.phone_.isEmpty()) {
          result.phone_ = new java.util.ArrayList<A.Person.PhoneNumber>();
        }
        result.phone_.add(builderForValue.build());
        return this;
      }
      public Builder addAllPhone(
          java.lang.Iterable<? extends A.Person.PhoneNumber> values) {
        if (result.phone_.isEmpty()) {
          result.phone_ = new java.util.ArrayList<A.Person.PhoneNumber>();
        }
        super.addAll(values, result.phone_);
        return this;
      }
      public Builder clearPhone() {
        result.phone_ = java.util.Collections.emptyList();
        return this;
      }
    }
  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Person_descriptor =
      getDescriptor().getMessageTypes().get(0);
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_Person_fieldAccessorTable = new
        com.google.protobuf.GeneratedMessage.FieldAccessorTable(
          internal_static_Person_descriptor,
          new java.lang.String[] { "Name", "Id", "Email", "Phone", },
          A.Person.class,
          A.Person.Builder.class);
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Person_PhoneNumber_descriptor =
      internal_static_Person_descriptor.getNestedTypes().get(0);
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_Person_PhoneNumber_fieldAccessorTable = new
        com.google.protobuf.GeneratedMessage.FieldAccessorTable(
          internal_static_Person_PhoneNumber_descriptor,
          new java.lang.String[] { "Number", "Type", },
          A.Person.PhoneNumber.class,
          A.Person.PhoneNumber.Builder.class);
}

2008-03-06

Tcpdump解析スクリプト

とりあえず、簡単なものを。

単純に-xで出力される右列のアスキーをつらつらと表示するだけ。

  • 使い方
# tcpdump port ほげほげ -ieth0  -s 1500 -x  | ./myfilter.pl
  • myfilter.pl
#!/usr/bin/perl

while(<STDIN>){
    if(m/^[ \t]/){
        #print "Line: $_\n";
        @data = (split);
        print "@data[9]";
    } else {
        print "\n\n";
        print "### $_\n";
    }
}

Dmidecode

Dmidecode

LinuxでBIOSやハードウェアのシリアルナンバー等を表示するコマンド。

今日、初めて知りました。

結構詳細に出てきます。

べんりっちゃ便利。

  • 出力のサンプル
 Handle 0x0000
         DMI type 0, 20 bytes.
         BIOS Information
                 Vendor: Dell Computer Corporation
                 Version: A04
                 Release Date: 09/22/2005
                 Address: 0xF0000
                 Runtime Size: 64 kB
                 ROM Size: 1024 kB
          :

2008-02-11

.NETプログラミング

Windowsでのプログラミングは、慣れないと敷居が高く感じてしまいます。

しかし.NET Frameworkになって随分開発しやすくなりました。

さらに最近は、良質なサイトもたくさんありドキュメントも豊富です。

これから開発を始めたい型の導入の手助けとなるようなサイトを以下にピックアップしています。

少しプログラミング経験があるかたならサンプルコードを組み合わせていろいろなアプリケーションが作れると思います。

以下の中でも、個人的にオススメなのがhttp://dobon.net/です。

次に、CodeProjectです。CodeProjectは、なかなかマニアックなコードも多数掲載してあります。しかし、初心者はdobonの方がオススメです。

入門する前に是非読んでおくといいサイト

サンプルコード

その他オススメサイト

C#言語入門

Windows API