[悲報][上原ひろみ]FUJI ROCK FESTIVAL’13  上原ひろみ 今年は出演しない模様。

FUJI ROCK FESTIVAL’12 でのひろみちゃんトリオのパフォーマンスはオレンジコート史に残るくらいの盛り上がりだったのではないでしょうか。
僕は最前線で見ていましたよ、ええ。一つ前のアーティストがやっているあたりから陣取って、ひろみちゃんのパフォーマンスが終わるまで4時間くらい同じところに立ちっぱなし!!
後ろにピタッと女の子がくっついていて、もうトイレに行こうならば、すぐ場所取られちゃう感じだったなぁww

さて、FUJI ROCKFESTIVAL’13の開催が決まったようですが、ひろみちゃんのスケジュールも決まっているようですので、残念ながら今年の出演は無い模様です。

FUJI ROCKFESTIVAL’13
期 間:  2013年7月26日(金)27日(土)28日(日)
会 場:  新潟県 湯沢町 苗場スキー場
チケット:  発売時期により、入場券の料金が異なります。

ひろみちゃんはヨーロッパにいる模様。
July 27, 2013
Festival Des Nuits (Hiromi:The Trio Project)
Les Beziers, France

July 28, 2013
San Sebastian Jazz Festival (Hiromi:The Trio Project)
San Sebastian, Spain

pre_launch_top

[上原ひろみ]STEVE SMITH and VITAL INFORMATION

スティーヴ・スミスといえば、HIROMI TRIO THE PROJECTのメンバーなんですね。ドラムのサイモン・フィリップスの代役を多く務める方であります。

ひろみちゃんやベースのアンソニー・ジャクソンはTwitterをやっていないのですが、スティーヴ・スミスはTwitterやっていたりします。

https://twitter.com/stevesmithdrums

たまーに、ひろみちゃんが写っている写真とか載せていたりしているので要チェックですね。

そんな、スティーヴ・スミスさんが東京丸の内のコットンクラブでライブがあるそうです。

COTTON CLUB 2013. 1.31.thu – 2.3.sun STEVE SMITH and VITAL INFORMATION
http://www.cottonclubjapan.co.jp/jp/sp/artist/steve-smith/#d_class
Img20130130180924

また、2/2にはドラムクリニックを行うそうです。サイモン・フィリップスも以前やってましたね。
d_class

[雑記]上原ひろみのBlueNote公演取れず→取れた(^O^)/

BlueNoteTokyoの25周年記念としてのひろみちゃんのソロライブ取れなかった(^O^)/

電話すればよかったかなぁ~、ネット予約は以前と画面レイアウト変わったみたいだけど、何度やっても「不正な操作が行われた可能性がございます。」ばっかり。
文字とか「null」とか、酷いのがアーティストの写真が最初、玉置浩二www
ブラウザをリロードする度に予約状況がころころ変わったりして、あーこれバグってんなって2時間くらいしてやっとわかったorz。たぶん、もう完売なのに予約とろうとしてるから不正って言われるんだろうね(´・ω・`)
ブルーノートのサーバがパンクするくらいアクセスが集中しているのだろうけど。予約状況確認のページとかメンテナンス中とかになってたし。やっぱ、ひろみちゃんの人気おそロシア~、特に東京。

ブルーノートは僕が一度すごいヘマをした時、とても親切な対応をしてくれて、すごく好きなクラブなのだけど、この予約システムなんとかしてください(切実)

201947443

(追記)——————————–

自由席1枚とれました!!やたーー!しゃっ!!

[C#,Python]WebSocketを試してみる。その5。

前回作成したチャットソフトに個別送信機能を追加してみる。

やりたいこと。
・ユーザーは名前を付けられる。
・ユーザーは自分の発言に色を使用出来る。
・現在ログインしているユーザー一覧を表示する。なお、ユーザーの増減が生じた場合は自動で更新されること。※ただし異常終了は除く。
・クライアントが異常終了しても、サーバーが落ちないこと。
・MessagePackを通信フォーマットに使用したい。
・ユーザーはアイコンを設定できる。
・シェイクを送信できる。
・「他のユーザが入力中」とか表示できる。
・特定のユーザだけにメッセージを送信できる。←NEW

チャットメッセージクラスを変更

        /// <summary>
        /// チャットメッセージ
        /// </summary>
        public class MessageInfo : ExtensionsClass.ExtensionsClass.IMessage
        {
            public string _1TOGUID { get; set; }
            public int _2COLOR { get; set; }
            public string _3MESSAGESTRING { get; set; }
        }

_1TOGUID変数を追加して、送信先のGUIDを指定できるようにします。尚、送信先が全員の場合は空で送るようにします。

C#チャットメッセージ送信部分を変更
SendMessage関数内でチャットメッセージの送信データ作成時に送信先のGUIDを指定するようにします。

                /// チャットメッセージ送信
                case Interfaces.COMMAND.CMDSENDSTRING:
                    {
                        var data = new Interfaces.MessageInfo();
                        data._1TOGUID = "";
                        if (cBoxToUser.Text != "全員")
                        {
                            var sendUser = _userList.Where(p => p.Value._2NAME == cBoxToUser.Text);
                            if (sendUser.Any())
                            {
                                data._1TOGUID = sendUser.First().Key;
                            }
                            else
                            {
                                MessageBox.Show("送信先エラーです。");
                                cBoxToUser.SelectedIndex = 0;
                                return;
                            }
                        }
                        data._2COLOR = pictureBoxStringColor.BackColor.ToArgb();
                        data._3MESSAGESTRING = textBoxMessage.Text;

                        cmdif._4SENDDATA = data.Object2MessagePack();
                    }
                    break;

cBoxToUserとしてユーザ名が入ったコンボボックスコントロールを追加します。送信時にこのコンボボックスに選択されている名前が送信先になります。デフォルトは”全員”とします。
_userListはGUIDとInterfaces.UserInfoデータクラスのDictionaryなので、送信先の名前からGUIDを特定して_1TOGUIDに指定しています。
ちなみに、名前がかぶった場合の処理が考えてありません。。。

Python側受信処理変更
connection_handle()のメッセージ受信ループの中でチャットメッセージコマンド受信の時の処理を追加します。

    while True:
        msg = ws.receive()
        
        print "Receive Message"
        
        if msg is None:
           break
        
        msgpack_msg = msgpack.unpackb(msg)
        
        cmd = msgpack_msg[0]
        guid = msgpack_msg[1]
        timestr = getTimeStr()
        
        print "\tcmd = " + str(cmd)
        print "\tmsg len = " + str(len(msg))        
        
        sendmsg = []
        sendmsg.append(cmd)
        sendmsg.append(guid)
        sendmsg.append(timestr)
        sendmsg.append(msgpack_msg[3])
        sendmsg_pack = msgpack.packb( sendmsg )
        
        if cmd == CMDLOGIN:
            _userInfo[ id(ws) ] = msgpack_msg[1]
            _userData[ id(ws) ] = msgpack.unpackb( msgpack_msg[3] )
            sendAllUserInfo(ws, SENDONE)
        
        if cmd == CMDMESSAGESTRING:
            data = msgpack.unpackb( msgpack_msg[3] )
            
            touser = wsIdToWs(guidToWsId( data[0] ))
            if touser != None:
                sendMessage(ws, str2bytearray(sendmsg_pack), SENDONE)
                sendMessage(touser, str2bytearray(sendmsg_pack), SENDONE)
            elif len(data[0]) == 0:
                sendMessage(ws, str2bytearray(sendmsg_pack), SENDALL)   
        else:
            sendMessage(ws, str2bytearray(sendmsg_pack), SENDALL)   
    

ヘッダー部分のコマンド番号を解析し、CMDMESSAGESTRING(0x12)の処理を追加します。データ部分をさらに分解し、配列の1番目のGUIDを解析して該当のユーザを特定します。そして、送信ユーザと該当のユーザのみにチャットメッセージを送信します。
guidToWsId()はGUIDからWebSocketのインスタンスIDを特定し、wsIdToWs()はWebSocketのインスタンスIDからWebSocketのインスタンスを返します。

C#メッセージ受信処理変更
RecvMessage()のチャットメッセージ受信処理を変更します。

                /// チャットメッセージ受信
                case Interfaces.COMMAND.CMDSENDSTRING:
                    {
                        var msg = cmdif._4SENDDATA.MessagePack2Object<Interfaces.MessageInfo>();
                        var userData = _userList[ cmdif._2GUID];

                        CtrlAction = new Action(() =>
                            {
                                AddChatMessage(userData.GetIconImage(), userData._2NAME,
                                    msg._3MESSAGESTRING, Color.FromArgb(msg._2COLOR), cmdif._3TIME,msg._1TOGUID);
                            });
                    }
                    break; 

実際にはAddChatMessage関数に引数toguidを追加し、GUIDにより該当ユーザの名前を画面に表示させるようにします。

        private void AddChatMessage(Image icon, string name, string msg, Color msgcolor, string time, string toguid = "")
        {
            var str = time + " :";
            if (toguid != "")
            {
                str += _userList[toguid]._2NAME;
            }
            else
            {
                str += "全員";
            }

            DataGridViewRow dgvrow = new DataGridViewRow();
            
            dgvChatView.Rows.Add(icon, name, str);
            dgvChatView.Rows.Add(null, msg, null);
            dgvChatView.Rows[dgvChatView.Rows.Count - 2].Height = 25;
            dgvChatView.Rows[dgvChatView.Rows.Count - 1].Cells[1].Style.ForeColor = msgcolor;
            
            if (toguid != "")
            {
                dgvChatView.Rows[dgvChatView.Rows.Count - 2].DefaultCellStyle.BackColor = Color.Beige;
                dgvChatView.Rows[dgvChatView.Rows.Count - 1].DefaultCellStyle.BackColor = Color.Beige;
            }
            dgvChatView.FirstDisplayedScrollingRowIndex = dgvChatView.Rows.Count-1;
        }

特定ユーザからのメッセージは背景色を変えています。

実行画面
Img20130123233114

まとめ
今回の機能追加は、サーバ・クライアント間の処理をヘッダー部、データ部に分離してあることによりコアな処理に変更を入れる必要は生じなかったものの、元々拡張性を考えて作っていた割りには、汚いソースとなってしまいました。送信先情報はヘッダー部に入れるべきだったなぁ。サーバ側の元々のサンプルが全てのメッセージをブロードキャストするイメージだったので、個別送信機能は後付になっちゃたなぁ。
やっぱ、設計って大事だなー。

今回作成したソースはこちら

[上原ひろみ]アルバム「Move」の海外向けプロモーションサイト。

マニア必見!ひろみちゃんの超高解像度画像が手に入るのはここだけ!

アルバム「Voice」の時もそうでしたが、concordmusicgruopのアルバム「Move」ページでは、ジャケット写真などの超高解像度写真が手に入ります。
Img20130122235923

見たことない写真があるー♪
もうわたしゃ (*´д`*)ハァハァもんですな。

http://mediakits.concordmusicgroup.com/p/move/index.html

[雑記]群馬って海なし空港なし県だよね。

ここ数ヶ月群馬県前橋市上空がうるさい。

去年夏に実家に帰ってきてから、うるさいなーって思うもの2つ。
・珍走族
・群馬上空を飛んでいる米軍機

群馬上空を飛んでいるのは米軍機でF/A18ホーネットらしい。F/A18は艦隊機で日本では配備されていないからアメリカ海軍機。
なんかで知ったけど、前橋の地形が某国に似ているので、訓練しているらしい。昼間も軍用ヘリとか最近良くトンドル。

群馬は海なし、空港なし県だから、特に軍用機とは無縁かと思っていたけど、これでちょっと軍用基地が近いところに住んでいる人の気持がわかった気がした。

[上原ひろみ]BRUTUS特別編集 ラーメン、そば、うどん。

BRUTUS特別編集 ラーメン、そば、うどん。に上原ひろみちゃんのコメントが載っています。

ひろみちゃんのコメント載せるなんて、よく分かっていますな、BRUTUSさん。

うわー、僕のおすすめの新宿のうどん屋さん「慎」もちょろっと載ってる。

[C#,Python]WebSocketを試してみる。その4。

チャットソフトGUI編。

WebSocketのインタフェース部分が出来上がれば、あとはGUIをコツコツ組み立てるだけです。

やりたいこと。
・ユーザーは名前を付けられる。
・ユーザーは自分の発言に色を使用出来る。
・現在ログインしているユーザー一覧を表示する。なお、ユーザーの増減が生じた場合は自動で更新されること。※ただし異常終了は除く。
・クライアントが異常終了しても、サーバーが落ちないこと。
・MessagePackを通信フォーマットに使用したい。
・ユーザーはアイコンを設定できる。
・シェイクを送信できる。
・「他のユーザが入力中」とか表示できる。 ←NEW

画面
Img20130118221221

実行画面

シェイク!!

あー、シェイクうぜっ!シェイクうぜっ!

DataGirdViewのセル結合とかちょっとぐぐたすをイメージしたりとかして、大変だったけど、アイコンイメージが48X48くらいじゃないとうまく収まらないというww
発言とかコピーできないとか、まぁ、いろいろあるけど、面白かったからいいやヽ(^o^)丿

今回作成したソースはこちらから。

[C#,Python]WebSocketを試してみる。その3。

チャットソフト続き。

MessagePackデータの送受信部
その2の記事でデータモデルを作成しましたが、デタラメ書きました。
MessagePackのシリアライズはシリアライズ可能な型であれば、C#であろうが、Pythonであろうが構わないので、なんでもかんでもbyte[]にする必要はなかったのであります。

次のデータクラスのやりとりを考えます。

        /// <summary>
        /// 送信データヘッダー部
        /// </summary>
        public class CmdInfo : ExtensionsClass.ExtensionsClass.IMessage
        {
            /// <summary>
            /// MessagePackにpackするときに、変数の並びが辞書順に並び替えられるらしいので、変数名に注意する。
            /// </summary>
            public int _1CMDNO { get; set; }
            public string _2GUID { get; set; }
            public string _3TIME { get; set; }
            public byte[] _4SENDDATA { get; set; }
        }
        /// <summary>
        /// チャットメッセージ
        /// </summary>
        public class MessageInfo : ExtensionsClass.ExtensionsClass.IMessage
        {
            public int _1COLOR { get; set; }
            public string _2MESSAGESTRING { get; set; }
        }

※尚、C#のMessagePack実装ライブラリはシリアライズ処理時にクラスのプロパティ名を辞書順に並び替えてシリアライズしているようなので、辞書順のプロパティ名にしてあります。
※object <-> MessagePackの拡張メソッドをExtensionsClass.ExtensionsClass.IMessageインタフェースに適用しています。
C#送信部分ソース

            /// ヘッダーデータの生成
            var cmdif = new Interfaces.CmdInfo();
            cmdif._1CMDNO = (int)cmd;  /// cmd = 0x16とします。
            cmdif._2GUID = _guid.ToString();
            cmdif._3TIME = "";
                    
            var data = new Interfaces.MessageInfo();
            data._1COLOR = pictureBoxStringColor.BackColor.ToArgb();
            data._2MESSAGESTRING = textBoxMessage.Text;
            cmdif._4SENDDATA = data.Object2MessagePack();    /// byte[]メンバに自分で定義したクラスのMessagePackデータを載せる

            /// 送信データの作成
            var msgpackData = cmdif.Object2MessagePack();    /// 最終的にはbyte[]を生成させる

            /// ソケット送信
            _ws.SendMessage(msgpackData);

C#側送信データは各処理に応じてCmdInfo データクラスの_4SENDDATAに自前データのバイト配列を入れ子にしてサーバに送信します。
これにより、_4SENDDATAには色々な構造のデータを載せることが可能になります。

Python受信ソース

msg = ws.receive()
        
print "Receive Message"
        
if msg is None:
   break
        
msgpack_msg = msgpack.unpackb(msg)
        
cmd = msgpack_msg[0]
guid = msgpack_msg[1]
        
print "\tcmd = " + str(cmd)
print "\tmsg len = " + str(len(msg))

Python側受信部では受信時はbytearray型になり、MessagePackでデシリアライズするとstr型の配列として扱われます。
strにはunicode形式で入っています(確か)。このサーバは通信データの中身はコマンド番号ぐらいしか解析しないので良いのですが、str型のデータを操作する場合はちょっとめんどっちぃです。

Python側送信ソース

        sendmsg = []
        sendmsg.append(cmd)
        sendmsg.append(guid)
        sendmsg.append(timestr)
        sendmsg.append(msgpack_msg[3])
        sendmsg_pack = msgpack.packb( sendmsg )
        
        sendMessage(ws, str2bytearray(sendmsg_pack), SENDALL)

str2bytearray変換関数

def str2bytearray(strData):
    barray = bytearray()
    for x in strData:
        barray.append(x)
    return barray

sendMessage関数

def sendMessage(currentWs, msg, target, delclient = True):
    
    print "Send Message"
    
    delSockets = []
    
    i = 0
    memlen = len(_clientSockets)
    
    print "\tsend msg len  =" + str(len(msg))
    print "\tsend user len =" + str(memlen)
    
    while i < memlen:
        ws = _clientSockets[i]
        current = currentWs == ws
        
        if current == True and target == SENDOTHER:
            pass
        elif current == False and target == SENDONE:
            pass
        else:
            try:
                ws.send(msg)
            except:
                print "\tsend except"
                delSockets.append(ws)
            finally:
                if target == SENDONE:
                    break
        i += 1
    
    if delclient == False:
        return
    
    for x in delSockets:
        if _userInfo.has_key( id(x) ):
        
            sendmsg = []
            sendmsg.append(CMDLOGOUT)
            sendmsg.append( _userInfo[id(x)] )
            sendmsg.append( getTimeStr() )
            sendmsg_pack = msgpack.packb( sendmsg )
            sendMessage(x,str2bytearray(sendmsg_pack), SENDOTHER, False)
            
        remove_member(x)

ここでの送信処理は受信したメッセージに時間情報(getTimeStr()は時間情報の文字列を返す)を付加し、各クライアントに送信しています。
重要なポイントはmsgpack.packb()はstr型を返しますが、ソケット送信時はバイナリ(bytearray()型)でないと、クライアントが文字列としてデータを受信してしまうので、送信時はbytearray()にデータを変換してあげます。

C#側受信ソース

            /// ソケット受信時操作
            byte[] rcvData = e.BinaryData;    // ソケット受信データ

            /// コマンドヘッダー部取得
            var cmdif = rcvData.MessagePack2Object<Interfaces.CmdInfo>();

            string rcvMsg =
                string.Format("RcvCmd[{0}],GUID[{1}],TIME[{2}]",
                    Enum.GetName(typeof(Interfaces.COMMAND), cmdif._1CMDNO),
                    cmdif._2GUID,
                    cmdif._3TIME);
            
            Trace.WriteLine(rcvMsg);

          /// データ部分解
          var user = cmdif._4SENDDATA.MessagePack2Object<Interfaces.UserInfo>();

C#でのMessagePackデータの受信は拡張メソッドにより、簡単に解析可能な形になります。

その4へ続く。

[C#,Python]WebSocketを試してみる。その2。

その1のチャットソフトを拡張してみる。

やりたいこと。
・ユーザーは名前を付けられる。
・ユーザーは自分の発言に色を使用出来る。
・現在ログインしているユーザー一覧を表示する。なお、ユーザーの増減が生じた場合は自動で更新されること。※ただし異常終了は除く。
・クライアントが異常終了しても、サーバーが落ちないこと。
・MessagePackを通信フォーマットに使用したい。
・ユーザーはアイコンを設定できる。 ← NEW!
・シェイクを送信できる。 ← NEW!

パケットフォーマットに本格的にMessagePackを使用する。
C#でのMessagePackの使用は、C#用のMessagePack実装ライブラリが自前クラスをシリアライズしてくれるが、Python版はまだ自前クラスのシリアライズは対応していない。そこで、サーバー(Python)側でも認識可能なデータにしてあげることで、MessagePackを効率的に使用することができる

データモデル

PacketFormat
{
    int CMDNO;   /// コマンド番号
    byte[] DATA; /// データ部
}

MessagePackではすべてbyte[]になるので、実際には次のような構造になります。

PacketFormat
{
    byte[] CMDNO;
    byte[] DATA;
}

クライアント側(C#)の送信部分

    int cmd = 0x10;    /// Login
    Message msg = new Message();
    
    msg.USERID = 1010;           /// User ID
    msg.NAME = "むんむんむらむら"; /// User Name
    msg.ICON = imagedata;        /// ICON Data

    // 送信データの作成
    // データモデルに沿った形にする
    var sendData = new List<byte[]>();
    sendData.add( cmd.Object2MessagePack() );
    sendData.add( msg.Object2MessagePack() );

    // WebSocketで送信
    ws.SendMessage( sendData.ToArray().Object2MessagePack() );

サーバー側(Python)の受信部分

import msgpack

msg = ws.receive()

msgpack_msg = msgpack.unpackb( msg )
cmd = msgpack.unpackb( msgpack_msg[0] )

if cmd == 0x10:
    print "Login"

ちょっとサーバー側の実装に合わせたパケットフォーマットになるけど、先頭のCMDNOにより処理の振り分けが可能になり、データ部分のunpackはそれぞれの処理に任せることができるので、コーディングがスマートになる。C,C++とかだとvoid*で受けたデータとかをヘッダー部分だけ読み取って処理を振り分けたりするので、それと同じ。

→その3へ。