カテゴリー別アーカイブ: 紹介

VPNのプロトコル(IPSec, PPTPなど)について調べた


VPNってなんとなく暗号化通信の技術?!プライベートなネットワークに繋ぐものなど、何となく理解している人も多いと思います。自分もIPSecのVPNをFWに対して設定したことはあるけど、完全に理解しているわけではなかった。この際、調べてみようということで書いてみます。


そもそもVPN(Virtual Private Network)とは・・・

“5分で絶対に分かるVPN”によると

インターネット上の拠点間を専用線のように接続し、のぞき見や改ざんなどの不正アクセスを防ぎ、安全な通信を可能にする技術がVPNだ。パブリックネットワークを使ってプライベートネットワークを実現しようというのである。インターネットを経由しているにもかかわらず、あたかも同一ネットワーク上にいるかのような利便性が得られる。

要するに「 暗号化した拠点間通信のこと。インターネットなどの公衆回線網の中にデータをカプセル化・暗号化することで通信の安全性を保護した仮想の通信トンネルを構成することで専用回線のように利用できるようにした通信回線のこと 」 だと理解しました。各拠点のファイヤーウォールでVPN設定をすることで実現できる。

VPNについての記事は分かりやすいです!!

VPNの種類
  • IP-VPN
    ・・・ 通信インターフェースはインターネット技術(IP -> インターネットプロトコル)を利用している。特定のプロバイダから提供されるIP-VPN専用のネットワーク網の中で利用する。インターネット網と違って限定した専用のネットワーク網の中での通信となる。その際、パケットにMPLS(multiprotocol label switching)と呼ばれる技術でラベルをつけることで自社と他社のデータを区別するため、パケットの暗号化はしません。基本的にはインターネットには繋がっていない。価格はIP-VPN専用のネットワークを別途契約する必要があるのでインターネットVPNと比べて割高。

  • インターネットVPN
    ・・・ 通信経路にインターネットを利用する。インターネット網の中で各パケットを暗号化することで設定した拠点間のルータやファイヤーウォールでのみ復号化できるようにして、擬似的に通信トンネルを構築する。一般的に、VPNとだけ言われるものは「インターネットVPN」を指していることが多いと思います。

    以下は調べて見たいことですが、
    Q, 片方の拠点は動的IPの契約でも利用できる?!相互接続するためにはやっぱり、どちらも固定が必要だろうか?!
    動的グローバルIPアドレスを使用した拠点とのIPsec-VPN接続
    インターネットVPN環境を構築する(動的IPによるVPNは可能?)

【參考】

IP-VPNとインターネットVPNの比較 <= ページ中盤に比較表がある
インターネットVPNとIP-VPNの違いとは?

【余談】

インターネットプロトコル(IP)を用いるのではなく、レイヤ2レベル相当の接続を提供する 広域イーサネット というサービスもある。LANの延長で離れた拠点間をイーサネットで結ぶサービス。
広域イーサネットとIP-VPNを理解


VPNのプロトコルについて

VPNとはということについてだいぶ長く書いてしまった。。。本題のVPNのプロトコルについてまとめてみたいと思います。
IPSecとPPTPという2つのプロトコルがありますが、基本的には以下の手順で通信されます。大きな違いはないです。

  1. 相手のVPN装置が本物かを確認する認証
  2. 送受信データを暗号化するために使う暗号鍵の取り決め(鍵交換)
  3. データの暗号化とカプセル化(パケットを暗号化してIPヘッダーを付与してカプセル化する)
  4. カプセル化したデータの送信

この記事がだいぶ参考になった!!!
2大技術「PPTP」と「IPsec」,3工程に分けて細部まで調査

IPSecの特徴

IKE(internet key exchange)というプロトコルを用いてVPN装置間の認証と暗号鍵を取り決めて暗号化されたトンネルを構築する。
通信は送信用のトンネルと受信用のトンネルを別々に作って使い分ける。それぞれのトンネルを構築する度に認証、暗号鍵の取り決めが行われる。
認証時にはユーザ名で識別するのではなく、接続拠点間のIPアドレスなどを元にVPNの接続先を決める。そのためリモートアクセスVPNには向かない。しかし、「L2TP/IPSec」の機能を持つルータであれば接続ユーザなどを設定すればリモートアクセスVPNとしてモバイル端末(Android,iPhone)などからVPN通信が利用できる。
鍵の生成するハッシュ関数などが動的に決められるなどVPN機器間でネゴシエーションして暗号鍵が決定されるのでPPTPと比較するとセキュリティ面で有利かな?!

PPTPの特徴

米マイクロソフトが開発したMS-CHAP(エムエスチャップ)バージョン2というプロトコルで認証し暗号化されたトンネルを構築する。基本的には接続する拠点間の機器をPPTPサーバとPPTPクライアントとして2つに分けて、クライアントからサーバへ接続要求するというところから認証が始まる。またマイクロソフトの技術なので、WindowsのOSにはPPTPクライアントとしての機能がある。そのため、PC単体などのクライアントからのリモートアクセスVPNとして向いている。
通信は送信と受信を1つのトンネルで実現する。

参加しました「第二回 JetBrainsユーザーグループ in 大阪 #jbugj」


1/30(水) 第二回 JetBrainsユーザーグループ in 大阪 #jbugj に参加しました。

vimとかemacsをメインに使っている会社ではなかなか IDEのネタを共有することがないので、IntelliJ IDEAのかゆいところにも手が届く感じとかとても勉強になったし、楽しかった。


講演者の方のスライドまとめてみました

  • JetBrains製品のライセンス形態 や Community、Ultimate の違いなどとても分かりやすいです。13ページ目にUltimate Editionにしか存在しない機能の説明があります。使えない機能が結構あるのでUltimate Editionを買うべきなんだろうなー!


気になったことのメモ

  • IDEAの読み方は「イデア」じゃなくて「アイデア」

  • Commercial License $499
    業務用

  • Personal License $199
    個人用 (個人で購入してねという事, 業務で使用してもいい)

  • ひとりIntelliJ IDEA Advent Calendar 2012 インデックス

  • ピンチアウト、ピンチインでコードのビューを拡大縮小出来る!

  • Option + Enter => 出来る操作の候補を出す(テスト)

  • Productivity Guide を使おう
    help -> Productivity Guid
    IDEA内でよく使っている機能を抽出してヘルプを一覧できる。
    各ユーザによって表示される機能が違う。
    @mumoshuさんはコードナビゲーション(Goto系)の機能をよく使う

    • Cmd + n => クラス、ファイルを開く
    • Option + Shift + Cmd + n => メソッド名変数名など検索してジャンプ
    • Cmd + b => メソッド、変数の定義元へジャンプする
    • Cmd + Option + F7 => このメソッドを使用している箇所を特定する
    • Cmd + Shift + a => Goto Action (何かしらの機能(Action)を検索する)
    • Cmd + e => 最近使ったファイルを開く
       
  • Docコードのサポートが手厚い

  • Gitの操作

    • ステータスやDiffが見やすい (Cmd + d)

気になるツイートまとめてみました


* やっぱりそういうことかー

[perl] MOP(メタオブジェクトプロトコル)について調べてみた


プログラミングのレベルを1つステップアップするためにメタプログラミングについて調査してみた。 メタプログラミングについては以下の書籍が有名だと思います。。この本はRubyをベースに書かれています。 実は読んだことがないのですが、次に読もう!!

MOP周りの用語

この記事の内容に書かれていることを抜粋
MooseとClass::MOPでメタプログラミング始めた

  • メタプログラミング
    ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法

  • MOP(メタオブジェクトプロトコル)
    メタクラスを通してオブジェクトシステムへアクセスするAPI

  • メタクラス
    クラスの振る舞いを定義したクラスでイントロスペクション(introspection)とインターセッション(itercession)を備える

  • イントロスペクション
    オブジェクトの属性を得る能力 ex) 何のクラスを継承しているかとか、何のメソッドを持ってるかとか

  • インターセッション
    オブジェクトの振る舞いに変更を加える能力 ex) 親クラスを変更するとか、メソッドを追加するとか

メタプログラミングについて

メタプログラミングとはよく「プログラムをプログラムすること」と言われますが、どういうことでしょう?!
まつもとさんの書かれた記事にほぼ書いているのですが、
まつもと直伝 プログラミングのオキテ 第6回メタプログラミング

Perl の Mooseで説明すると、次のコードで説明できる。

■ MooseでHogeモジュール定義、mainで利用する

package Hoge;
use Moose;

has 'message' => (
    is => 'rw',
    required => 1,
);

# Hogeを利用するためのmainモジュール
package main;

my $obj = Hoge->new(message => "HOGE MESSAGE");
print $obj->message;   # HOGE MESSAGE

Hoge を new して message という属性(アトリビュート)のアクアクセサメソッドをつかって属性(アトリビュート)を設定したり、呼び出したりしている。ここでいう「has」メソッドが メタプログラミングされたメソッド となる。Mooseを定義することで自動で「new」メソッドができ、hasメソッドを書くことで message のセッター、ゲッターが暗黙的に利用できる状態になる。
このことをメタプログラミングと言って、「has」メソッドなど、 動的にオブジェクトやクラスにメソッドや属性を追加するための API を MOP という。そのMOPを提供するためのクラスをメタクラスという。
Perlでは Class::MOP が提供する。

Class::MOPを利用してみる

先ほどのHogeクラスをベースClass::MOPを使って動的にメソッドや属性を差し込む処理は以下の様な感じになります。

use strict;
use warnings;

package Hoge;
use Moose;

has 'message' => (
    is => 'rw',
    required => 1,
);

# このMooseのHogeクラスをClass::MOPのみでも作成することができる
# my $person_meta = Class::MOP::Class->create('Person');
#
# $person_meta->add_attribute(
#     'name',
#     accessor => 'name',
# );

##### ここから差し込むための処理 #####

package main;
use Class::MOP;

my $meta = Hoge->meta;  # [1] Hogeのメタクラスを取得

$meta->add_attribute(   # [2] nameという属性とアクセサメソッドの追加
    'name',
    accessor => 'name',
);

$meta->add_method(describe => sub { # [3] describeメソッドの追加
    my $self = shift;
    return "Name: ".$self->name.",  Message: ".$self->message;
});

my $hoge = Hoge->new(message => "I like soccer.", name => "YUSABANA");
  # オブジェクトの生成は以下のように$metaを使っても生成できる
  # $meta->new_object(message => "I like soccer.", name => "YUSABANA");

# 差し込んだメソッドdescribeを実行する
print $hoge->describe."\n";  # [4] Name: YUSABANA,  Message: I like soccer.

  • コード上[1]でHogeモジュールのメタクラスを取得する。
    このメタクラスを操作することで色々出来る。
  • コード上[2]は属性とアクセサメソッドを追加している。
  • コード上[3]はメソッドを追加している。
  • コード上[4]は追加したメソッドを実行して、画面出力する。

MOPを使えばこのように動的に処理を差し込むことができる。
Mooseの hasメソッドを定義している所でも add_attribute とかを使っているんだろ-なと予想できますねー!まだ、実際にコードは見ていないので確実ではないのですが。。。

  1. Class::MOP::Class – クラスに対するプロトコル
  2. Class::MOP::Attribute – アトリビュートに対するプロトコル
  3. Class::MOP::Method – メソッドに対するプロトコル
  4. Class::MOP::Instance – クラスのインスタンス生成に対するプロトコル

Moose::Util::TypeConstraints を使うと更に便利そう
http://idocsq.net/page/370

余談(Groovyでのメタプログラミング例)

■Stringクラスにhogeというメソッドを追加している。

String.metaClass.hoge = {->
    delegate.equals("hoge") ? true : false
}

println "hog".hoge()  //=> false
println "hoge".hoge() //=> true

MacでJava7環境の日本語扱いの問題について(eclipse, IntelliJ IDEA)


Macに標準でインストールされているJavaはAppleから提供されているJDK1.6系のものです。JDK1.7系はすでにリリースされているのでその最新のJDK1.7(java7)を利用するようにしたいと思いますよねー!!
Oracleのサイトから最新のJavaをインストールするには、以下を確認すればインストールできると思います。
http://www.java.com/ja/download/faq/java_mac.xml

■インストール後にバージョンを確認してみる

% java -version
java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

これで、java7系が無事インストールできていると思います。

そこでテストコードを書く時などをわかりやすくするために、 日本語でテストメソッド を書くことも多いと思います。そんな時に日本語がうまく認識できずに「ClassNotFoundException」となってしまいます。どうにか解決するようにちょっと試行錯誤してみました。

EclipseやIntellij IDEAなどのIDEからテストを実行する時に発生する問題で、コマンドラインからテストを実行すればとくに問題はおきません。

自分の場合はMavenを利用してHogeTestというテストを実行するために「mvn test -Dtest=HogeTest」のコマンドを実行しても問題無く実行することが出来ました。


Eclipseでの日本語問題の解決方法

以下の様なテストクラスがあったとします。

public class HogeTest {

    @Test
    public void テストメソッド() {
        assertTrue(true);
    }

}

単純に実行した時点では「ClassNotFoundException」になってしまいます。
次の記事を参考にEclipseで実行時に使用するVMの引数に「-Dsun.jnu.encoding=UTF-8」というオプションを指定してあげれば日本語メソッドも解決出来ます。
JUnit のテストメソッド名に日本語を使ったときの問題の解決法 (Java 7)

しかし、以下のようにEnclosedを用いてネストしたテストクラス名を日本語とした場合

同じく「ClassNotFoundException」になってしまいます。

@RunWith(Enclosed.class)
public class HogeTest { 
    public static class ネストしたテストクラス {
        @Test
        public void ネストテストメソッド() {
            assertTrue(true);
        }
    }
}

これはちょっと、謎なんですが、以下のコマンドでeclipseを起動してあげると解決します。今のところこの方法で起動するようにすればとりあえず日本語のクラス名やメソッド名でも問題無く実行できるようになります。

% open /Application/eclipse/Eclipse.app

なんとなく、腑に落ちないのですがとり上記コマンドをエイリアス貼って起動するようにしています。


Intellij IDEAでの日本語問題の解決方法

基本的にはEclipseと同様に日本語のクラス名やメソッドがある場合「ClassNotFoundException」となってしまいます。
以下の2つの手順を実行すれば解決します!

  1. IntelliJ IDEA の日本語テストメソッド名の実行で再度ハマった話
    Run => Edit Configrations => Defaults => JUnit の VM options に “-Dsun.jnu.encoding=UTF-8” を追加する。

  2. IntelliJ IDEA + Spock で日本語テストメソッド実行時にハマった話
    「/Applications/IntelliJ\ IDEA\ 12\ CE.app/Contents/Info.plist」ファイル(Info.plist)を開いて、VMOptions の string の最後に「-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8」を追加する。 IntelliJ IDEAまでのPathは環境に合わせて適宜変更してください。

「1」 についてはEclipseのVM引数と同じですねー。
「2」 については記事内にもあるのですが、テストクラスでテストメソッドを指定して実行しようとした時の対処です。この設定を入れなくてもテストクラス全体を一気に実行する場合は問題無く実行できます。

これでそれぞれのIDE上でとりあえず日本語の問題は解決できると思います!

TDDBC大阪3.0外伝 参加しました!


2013年はじめのTDD Boot Camp in 大阪 外伝
開催日:2013年01月13日

午前は講演、午後は演習(ペアプロ)の2段構成でした。 10時から18時までと長丁場でしたが本当に楽しかったし、周りの皆さんと色々話もできてモチベーションが上がった!!


午前の講演時のメモ

いろふさん(@irof)、渡辺さん(@shuji_w6e : 資料)のお話を聞きました!

テストの価値は失敗することにある.

  • テストを失敗させる
    • 失敗するバグを埋め込む
      ちゃんと失敗してくれる、 失敗は最小、 失敗をわかりやすく

  • 他人の書いたテストはわかりづらい
    • テストはわかりづらいだから当たり前にしよう
    • 特別なことを当たり前にする

あたりまえのこと(特別なことはない)

  • テストは落ちるもの
  • テストは読みにくいもの

TDDは開発手法

良いプログラムは開発できるが、良いシステムを開発できるわけじゃない。
TDDはテストリストが起点
良いシステム = 顧客の求めるシステム

「何を構築するか?」を考える
顧客の言葉を使ったシステムの使い方
ユースケースユーザストーリ
システムの外部的な振る舞い

ユースケース駆動開発

ユースケースを開発の起点として定義する。

  • システムとユーザインタラクションを記述
  • 一行で一つのアクション
  • 〜すると記述(できるは避ける)

外部設計 => システムを外から見た時の利用者視点

ユースケースから実装を導く

  • ロバストネス分析
    バウンダリ
    コントローラ
    エンティティ

ユースケース中の名詞 -> ドメイン として定義
ユースケース中の動詞 -> メソッド として定義

抽象的なユースケースのシナリオから、具体的な例として変更する => 具体的な値を入れることでユースケースから受け入れテスト(機能テスト)を導く事ができる。ユースケースを用いることでシステム全体を設計する

(例)自動販売機にお金を入れる => 自動販売機に100円入れる


午後の演習

@oota_kenさんと@kyon_mmさんとペアを組ませて頂きました。Groovyを触ってコツを掴んだ気がします。新しい言語でコードを書くときはいつもプログラミングは楽しいなーと感じます。
そして、GroovyとSpockはホントテストが簡潔に書けると実感。これは覚えるべきだなと思いました!!

演習の時のコードをアップしてもらいました。TDDBC Osaka Groovy

和田さんのペアプロでのレビュー

パラレルチェンジ(でかいリファクタリングの時に有効となる方法)でリファクタリングをした。
パラレルチェンジとは(參考

変更箇所が多数ある場合に、リファクタリング前のコードとリファクタリング後のコードを同居させ、1箇所ずつ変更するごとにテストコードで確認しながらリファクタリング後のコードへ移行させていく。

演習中でのパラレルチェンジをする流れ
・お金の扱いをInteger から Moneyクラスにする
・メソッドオーバーロード
・Integerで扱うところをなくしてMoneyを使うことにする

余談(イベント中で印象に残ったこと)

@kyon_mmさんと何気なく話していた時に話していた内容がとても刺激をうけた!!!!

「(@kyon_mm)今日は4時間で20数コミットかー、普段は60コミットくらいはしているけどなー」・・・
なんだって!!!コミット数が全てを物語っていると思う。自分は短時間でこんなにコードに変更を加えた経験はないし、いったとしても4時間で20コミットまで行くか行かないかだと思う。。。こういう所が差なんだろうなーと。

これからは技術書を読むことに加えて、もっとコードに戯れて楽しんでいけるようにしたいなー!!
いろんなコードをコミットしまくれる1年にしたい!