Works by

Ren's blog

@rennnosuke_rk 技術ブログです

Android:rotate時のActivity再生成

すごい雑だけどメモ。

Caution: Your activity will be destroyed and recreated each time the user rotates the screen. When the screen changes orientation, the system destroys and recreates the foreground activity because the screen configuration has changed and your activity might need to load alternative resources (such as the layout).

画面回転をアプリ側で許可している時、回転した瞬間にActivityは再生成されている。 再生成される前の情報はBundleオブジェクトに保存され、再度読み込まれる。

再生成するのは、画面回転によるパラメタの変更に際して別のリソースが必要となるため。

あとBundleオブジェクトは各々のViewの情報を保持できるKVS(Key-Value Store)で、Activityがdestroyされても生きている。例えばChromeブラウザを終了しても前回開いたタブ情報がそのまま、といった事が可能になる。

参考サイト

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

文字列switchについて

気になったのでメモメモ。あとこの機能、Java8からのものだと思ってた。

java7実装の文字列switch

文字列switch構文内で分岐するとする。

public static String getSwitchString(String str) {

    switch (str) {
    case "a":
        return "str is a";
    case "b":
        return "str is b";
    default:
        return "str is not a nor b";
    }

}

Stringはオブジェクトである以上nullである可能性がある。 仮に上記のようなswitch文に対してStringのnullオブジェクトが渡った場合、defaultではキャッチされず、そのままぬるぽを吐く。

Exception in thread "main" java.lang.NullPointerException at SwitchTest.getSwitchString(SwitchTest.java:10) at SwitchTest.main(SwitchTest.java:4)

なので、

public static String getSwitchString(String str) {

    if (str == null) {
        return "null...";
    } else
        switch (str) {
        case "a":
            return "str is a";
        case "b":
            return "str is b";
        default:
            return "str is not a nor b";
        }

}

}

のようにしてnullを退避。

switch構文をそのままelseに繋げられるのは初めて知った。

ZigBeeについて

備忘録。通信モデルについて書くとか言って6日も放置した挙句別のこと書いてすんません。

ZigBeeとは

ZigBeeとは近距離の無線通信規格(無線PAN)の一つです。伝送速度は250kbpsと比較的低速なのですが、省電力なのが強みの無線PANです。

通信データが小さく、ネットワーク運用中に端末の移動などが考えられる場合に適しています。主に遠隔監視・制御用のデータを送受信するために使われるらしいです。

またZigBeeネットワークに参加できる最大接続端末数は65535個であり、これはBluetoothWiFiと比較すると非常に多いです(Bluetoothが7個,WiFiが32個)。

なお名前はミツバチがジグザグに飛ぶのに由来しているとのこと。

無線PAN

Personal Area Network- 実用範囲の狭い無線通信ネットワークです。無線LANの小型版のようなものです。ZigBeeのほか、BluetoothIrDAなどがこれに該当します。

ZigBeeのデバイスタイプ

ZigBeeで使われるデバイスには2通りの見方があります。一つは物理デバイス、もうひとつは論理デバイスです。

物理デバイスは、機能を完全に備えたFFD(Full Function Device)と、コスト的に廉価なRFD(Reduced Function Device)に分けられます。FFDはネットワーク上のルータ、コーディネータ(ネットワーク立ち上げ機能を持つ)、エンドポイントとして働く一方で、RFDはエンドポイントとしてしか働きません。

そして論理デバイスはこの物理デバイスの振る舞いによる分類で, 以下のようになります。

  • ZigBeeルータ:ルータとしてデータ転送機能を持つデバイス
  • ZigBeeコーディネータ:コーディネータとしてネットワーク立ち上機能を持つデバイス
  • ZigBeeエンドポイント:その他エンドポイント

これらのデバイスから、ZigBeeネットワークは形成されます。

トポロジ

ZigBeeのネットワークトポロジにはスター型とPeer to Peer(PtoP)型の二種類存在します。

スター型ネットワークはその名の通り星形にノードを配置するネットワークです。中心にZigBeeコーディネータを置き、それを取り巻くようにエンドポイントを接続していきます。

またスター型のネットワーク全体を一つのエンドノードに見立て、階層的にスター型ネットワークを構築することもできます。これをクラスタツリー型ネットワークといいます。

PtoP型ネットワークは全ノードをFFD、つまり転送可能なルータノードとし、あるノードからの送信データが他のノードによって転送されるネットワークを構築します。PtoPとは対等なノード同士が通信を行うというアーキテクチャです。バケツリレーの如く、各ノードが届く範囲のノードへとデータを転々と回していくことで、送信元ノードからの電波が届かないノードへもデータを送信できます。

これらのネットワークトポロジは組み合わせて構築することも可能です(そもそも、クラスタツリー型はスター型の再帰)。

参考サイト

http://www.atmarkit.co.jp/frfid/special/5minzb/01.html http://ja.wikipedia.org/wiki/ZigBee http://tocos-wireless.com/jp/tech/ZigBee/ZigBee.html http://ja.wikipedia.org/wiki/Peer_to_Peer

プロトコルについて

ネットワークについて書くことが多くなりそうなので、ひとまずプロトコルの話をちょいと書いてみようと思います。

プロトコルとは?

プロトコルは一言で言うと「お約束事」です。

例えば私達を取り巻く日常会話を想像してみてください。内容や場所がどうであれ、もし日本人で日本に住んでいるのであれば、少なくとも「日本語」を話しているはずです。私達の普段の会話には、「日本語で話す」という暗黙の了解があります。もちろん外国の人に英語で話しかけられたら、そこには「英語で話す」というルールが生まれるかもしれません。

ここで重要なのは日本語か英語かということではなく、そこに前提となるルールがあることです。そのルールに則っているからこそ、双方向的なコミュニケーションを生むことができます。

コンピュータネットワークも同様で、ある通信のルールに則ることでネットワークを通じてデータの送受信が可能となるわけです。どんなケーブルを使うか、どんなフレームでデータを送信するか、どんな通信経路を経るか・・・いろいろな約束事の上で通信は成り立ちます。逆にこの約束事がを決めず、フレーム長も経路情報もてんでんばらばら、ともなると通信に齟齬が生じます。なんてこった。

なのでこのプロトコルは通信においてとても重要な意味を持ちます。確かに末端のエンドユーザレベルではこのことを意識することなくアプリケーションを利用し、通信を行うことができます。日常会話もおんなじです。「うわ、この人超日本語喋ってる」なんて日本人同士で思うことはそうそうないです。

ですがネットワークに限らず、セキュリティ分野や実際のアプリケーション開発などでも、プロトコルを意識する場面は少なくありません。そういう意味でも、プロトコルに対する知識と理解は重要です。

プロトコルの概略についてさっと書きました。 明日はOSI基本参照モデルについてこりこり書きたいと思います 短めに日中に書き終えて連続記録維持とか全然考えてないです。全然。

PPP(Point-to-Point Protocol) ってなんぞや?

書き始め一発からネットワークです。
何か間違いがあれば指摘していただけると助かります。

PPPとは?

PPPはざっくりというと、2ノード間を一対一で接続するためのプロトコルです。 PPPは主に電話回線やISDN、専用回線やATM回線などの通信で使われます。OSI基本参照モデル第二層、データリンク層に位置するプロトコルです。

通常、LAN上では通信規格としてイーサネットが多く用いられており、MACフレームを使ったMACアドレス交換を行うことができます。これによりローカルな環境で相手先ノードを識別することができるのですが、WAN上ではそうもいきません。というのも、もしWANが公衆電話網であった場合などに、イーサネットを用いることができないからです。

そこでLANからWAN上へ、そして再びLANへとMACアドレスを運搬できるよう、PPPが用いられます。

PPPは隣接ノード間の情報のみを含みます。複雑な制御情報は含みません。そのおかげで、WAN形態の如何にかかわらずIPパケットをPPPにマウントし、送受信することができます。

データリンク層

データリンク層物理層の一段階上位の層であり、ローカルノード間の通信を定義するプロトコルの集合といえます。電気信号やケーブル規格云々は物理層に任せて、いざ通信しようというところはデータリンク層で定義してやろうという寸法です。このようにプロトコルを役割ごとにカテゴライズ・独立させることで、あるプロトコル層の変更が他のプロトコル層に影響を与えにくくできる、共通部分をくくりだしてインタフェースとして定義、互換性を持たせられるといったメリットを享受できます(このへんはOSIモデル全体の話になるので、後日まとめてみたいと思います)。

LCPとNCP

話が少しそれてしまいましたが、またPPPの話にもどります。

PPPはデータ転送を開始する際、事前にPPPレベルでのコネクションを2ノード間で張ります。その際の認証、圧縮、暗号化等の設定に用いるプロトコルがLCP(Linc Control Protocol)とNCP(Network Control Protocol)です。

LCPはコネクションの確立・切断、パケット長の設定、認証プロトコルの設定など、上位層に依存しない部分を規定します。一方NCPでは、IPアドレスTCP/IPヘッダ圧縮の設定を規定します。IPやTCPなどは上位層プロトコルですから、NCPは上位層に依存したプロトコルと言えそうです。

PPPの認証

PPPはコネクションを貼ります。ということは当然相手ノードが真正であることの確認が必要となります。 先程も述べたとおり、PPPはLCPでもって認証プロトコルを設定しています。ここで指定された認証規定がコネクションの際使われるわけですが、どのような認証プロトコルが存在するのでしょうか。代表的なものを見てみます。

PAP(Password Authentication Protocol)

認証のためのユーザIDとパスワードを平文で送信する、最も基本的なプロトコルです。平文なので、なんだか危なっかしい感じです。

CHAP(Challenge Handshake Authentication Protocol)

PAPの問題点を解消すべく考案されたのがこのCHAPです。チャレンジハンドシェイク方式を使って暗号化されたデータ通信を実現します。現在のPPP対応機器のほとんどがこのCHAPを採用しているそうです。


EAP(Extensible Authentication Protocol)

PPPをさらに向上させたプロトコルです。認証方式を平文・MD5TLSワンタイムパスワードなどのなかから選択することができます。

PPPoE(Point-to-Point over Ethernet)

PPPをWAN以外でも使うプロトコルに、PPPoEがあります。

PPPoEはADSLやケーブルテレビなどのインターネットサービスでよく用いられます。元々LANであれば通常のイーサネットでも通信は可能です。安価で高速、使わない手はありません。しかしイーサネットでは認証ができない、コネクションの確立ができないなどの欠点がありました。

しかしこの欠点は、PPPで補うことができます。PPPのWANでの機能を、LANのイーサネット提供してやれば、認証もコネクションの確立も行うことができます。こうしてできたのがPPPoEです。

大まかなPPPのメモは以上です。 書いてるうちに色んなところを掘り下げたくなりました。。。