JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2013年03月 / 02月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>04月

アクセスランキング

[ジャンルランキング]
コンピュータ
356位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
34位
アクセスランキングを見る>>

JavaScriptでの配列/オブジェクト同士の比較の方法

今日、JavaScriptを少し書いていたのですが、そこで気づいたことを一つ。
配列同士の比較では、単にオブジェクト同士を比較しても正確な値を得ることができません。
(参照同士の比較を行っているようです。)

例えばこんな感じ。
var a = [1,2,3];
var b = [1,2,3];
document.writeln(a == b); //false

調べてみたところ、JavaScriptでは配列等のオブジェクト同士の比較をする機能は実装されていないようです。(Javaで言うところのequalsメソッド)
追記:文字列や数値型の配列であれば'' + a == bのように文字列に変換してから比較することもできます。

というわけで、比較用のメソッドを書いてみました。
Object.prototype.equals = function(obj){
    if (this instanceof String || typeof this == "boolean" || ! this){
        return (this == obj);
    } else if (this instanceof Number){
        if (!isFinite(this))
            return !isFinite(obj);
        return (this == obj);
    } else if (typeof this == "function"){
        return (this.toString() == obj.toString());
    } else if (this instanceof Array){
        if (this.length !== obj.length)
            return false;
        for(var i=0;i<this.length;i++){
            if (this[i] == null){
                return (obj[i] == null);
            }
            if (! this[i].equals(obj[i])){
                return false;
            }
        }
        return true;
    } else {
        for(var o in this){
            if (this[o] == null){
                return (obj[o] == null);
            }
            if (! this[o].equals(obj[o])){
                return false;
            }
        }
        return true;
    }
}



var a = [1,2,3];
var b = [1,2,3];
document.writeln(a.equals(b)); //true

初めはArray.prototypeに書いていたのですが、配列の内容が何かわからないので、考えられるすべてのオブジェクトに対応できるように書き直しました。

使う機会はあまりないかもしれませんが、このような記述を行わなければいけないということは、一つ覚えておいた方がいいなあと。

#JavaScriptでinstanceofメソッドが使えるということも知りませんでした
   JavaScript    TB(0)    CM(2)    EDIT    ページ↑

VB.NETからSkypeチャットを送受信してみる【続報】

久々にVB.NETでちょっとしたツールを作っています。
今回は、SKYPE4LCOMLibというAPIを通してSkypeを操作する方法について、簡単に記事を書こうと思います。


APIが廃止されたため、現在ではこの方法を使うことはできません。
Microsoftが何か対応してくれることを願いましょう…

導入)

Skype Developer - Desktop API (Accessories)
http://dev.skype.com/accessories

自作プログラムからSkypeを操ろう! - toriimiyukkiの日記
http://d.hatena.ne.jp/toriimiyukki/20100716/1279281599

色々と調べてみましたがチャット関連の情報が少ないようなので、この記事ではチャット中心に書きます。

Skypeのインスタンス化
Skype = New SKYPE4COMLib.Skype

'この時点でSkypeが起動していないと操作不可。7はSkypeのプロトコルのバージョン
Skype.Attach(7, False)

※Skypeの状態の確認
Skype.Client.IsRunning
ブール値です。まあこれは適宜チェックを行えばよいかと。


このAPIでは、取得したチャットオブジェクトをもとに操作を行います。
ということで、目的のチャットオブジェクトを探す関数をいくつか書いてみました。

IDからチャットオブジェクト(個人)の取得
Function GetChatUser(ByVal ID As String) As SKYPE4COMLib.Chat
    For Each e As SKYPE4COMLib.Chat In Skype.Chats
        If e.DialogPartner = ID Then
            Return e
        End If
    Next
    Return Nothing
End Function


表示名からチャットオブジェクト(個人)の取得
Function GetChatUserByName(ByVal Name As String) As SKYPE4COMLib.Chat
    For Each e As SKYPE4COMLib.Chat In Skype.Chats
        If e.Topic = "" Then
            For Each u As SKYPE4COMLib.User In e.ActiveMembers
                If u.FullName = Name Then
                    Return e
                ElseIf e.FriendlyName = Name And e.ActiveMembers.Count = 1 Then
                    Return e
                End If
            Next
        End If
    Next
    Return Nothing
End Function

グループチャットの名前から取得
Function GetChatRoom(ByVal Name As String) As SKYPE4COMLib.Chat
    For Each e As SKYPE4COMLib.Chat In Skype.Chats
        If e.Topic = Name Then
            Return e
        End If
    Next
    Return Nothing
End Function


※なお、すべてのチャットの取得はSkype.Chats、アクティブなもののみ対象であればSkype.ActiveChatsにて可能です。

≪チャットの送信≫
送信は取得したチャットオブジェクトからSendMessageメソッドを呼び出して行います。
Dim c As SKYPE4COMLib.Chat = GetChatUser("echo123")
c.SendMessage("メッセージ本文")


≪チャットの受信≫
こちらはMessageStatusイベントを利用します。なお、WithEventsキーワードの記述も行っておいてください。
'クラスの宣言直後に
Private WithEvents Skype As SKYPE4COMLib.Skype

Sub GotMessage(ByVal Msg As SKYPE4COMLib.ChatMessage, ByVal Status As SKYPE4COMLib.TChatStatus) Handles Skype.MessageStatus
    Console.WriteLine(Msg.Body)
End Sub


こんな感じです。
公式のリファレンスが少し読みにくいですが、APIの構造は比較的わかりやすいので勘で書いてもなんとかなるような気もします。

今作っているツールの公開はまだ考え中ですが
公開するときには、また記事を一つ書こうと思います。

#最近は記事への質問も受け付けています。何かあったらお気軽にー
   VB.NET    TB(0)    CM(0)    EDIT    ページ↑

Torchwood the Complete Collection

先日、TorchwoodのDVD-BOXを購入しました。
日本語吹き替えが入っていませんが、今回そこは気にしないことにしました。
#日本語版を何度か見ているのでだいたいわかります

Season1,2,Children Of Earth,Miracle Dayの4シーズン分が収録されています。
P3030160_R130303.jpg

リージョンコードは日本と同じ2番ですが、リビングのブルーレイレコーダーでは再生できませんでした。信号規格が一般的に日本で使われるNTSCではなくPALだから、ということだそうです。
リージョンコードが一致していれば良い、というだけの問題ではないんですね。

バタバタと倒すタイプでした。
P3030161_R130303.jpg

せっかく英語版字幕もついているということで、改めて、きちんと見てみようと思います。
   TV    TB(0)    CM(0)    EDIT    ページ↑

Picture of the day: 電車

今日は久々に電車に乗りました。名鉄尾西線です。
電車に乗っているときって、スマホやパソコンを弄っているより、本を読んでいる方が落ち着く…のは自分だけでしょうか。

暖かい春の日差しを浴びながら、のどかな時間を過ごしていました。
P3030142_R130303.jpg

この写真、写り方がなんとなく気に入りました。(例によってエフェクトなどはかけていません。)

まだまだ寒いですが、少しずつ、春の訪れを感じる季節になってきていますね、
   Photo    TB(0)    CM(1)    EDIT    ページ↑

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。