指導について

mixi日記に勢いで書いたエントリをせっかくなので転載。

大学を博士課程まで進んだり、就職した会社でいきなり最年長だったりと、だいたい年下の多い環境で育ってきてるので、立場的には指導をする側の立場でのお話になるかな。

とはいえ、今まで誰かを意識して指導したことはないし、たぶんこれからもない。単純に人にものを教えるほど自分が有能じゃないって言うのを自覚しているだけ。

とはいえ、常に先輩としての立ち振る舞いは要求されてたわけで、そん時(今もか)に心がけてたことが3つある。3つあるって書いたけどいまんとこ2つくらいしか思いついてないなぁ。推敲なしの一発書きが流行ってるらしいのでw

ひとつは、自分が何かに興味を持ったきっかけを他人と共有したい、ということ。成長なんて人から言われてするもんじゃなくて、自分で努力して成長していくもんだと思ってるし、そういうもんじゃないと意味がないとも思っている。なので、そのきっかけを人に伝えることが大事だと思っている。「きっかけを与えてあげる」とか言うつもりはなくて、自分の経験を単純に他人に話すだけ。これは好きでやってることだし、拾ってくれる人がいればうれしいな、という程度。

2つは、自分が成長しなければ意味がないと思っている、ということ。人に何かを与えてあげられるほど偉い人間じゃないので、自分の成長に他人を巻き込むくらいしかできることはないと思っている。

3つめは、ええと、まだ思いつかない。プレゼンの仕方で、何かを列挙するときは必ず奇数にしろ、とか言われたような気がするんだよなぁ、2つしかなくても、「以下の3つがあります」と言い切るような。なんか、奇数って説得力あるらしい。

ああそうだ、じゃあ3つめ。上の2つでも同じことを言ってるんだけど、自分が他人に何かをしてあげてるとは決して思わない、ということ。自分の話を聞いている人間は指導されていると思ってるかもしれないんだけど、自分は単にしゃべってるだけ。だいたい思い付き。その思い付きの積み重ねの中にこそ自分の考えが横たわってるような気がしてるし、人と話すことでそれがだんだんまとまっていく感じ。それを受けて一緒に成長できればいいなぁ、位のつもりで人と話してる。

そう思って考えると、今まで自分がほぼ出来ると思ってることを他人に教えた記憶は非常勤講師の仕事だったり授業のアシスタント以外ではあんまりないなぁ。自分がやりたいこと、問題意識をもってること、これからやろうとしていることを共有しようと人と話してた気がする。

自分に何かを教えてもらおうとしている人とは確かに相性が悪かったなぁ。ほっといても勝手に進んでいくような人で、それでいてちゃんと人の話を聞くような人間とは相性がいいなぁ。まぁ、でもそれは自分に限らず普通のことか。

もし、ひとつだけ自分が他人に指導できることがあるとするならば。

「俺なんかに頼らず、自分で何とかしろ」

ということぐらいかなぁ。自分の能力程度でキャップされて終わりだと思うし、一方的に頼られるのは自分だって面白くない。まぁその程度の教育心のかけらを微塵も持ち合わせていないので。本音を言えば自分で抱えている難題を撒き散らかして、少しでも拾って答えを出してくれる人が回りにいてくれるとうれしいなぁ、程度ですね。

指導される側、としての立場で言うと、本当に今まで周りの人間に恵まれていて、後輩先輩問わずに教わることが多かったと思う。これは本当にありがたいことです。そんだけの幸運があって、ようやく人並み程度にお仕事できる程度の人間なんで、その自覚さえ持ち続けていれば人並み程度には成長できるかなぁと思ってます。

せめて一人で自分の食い扶持が稼げるくらいには成長したいなぁ、とは思うけれども。

5〜6月日程ポスター更新

去年から横浜F・マリノスのフロントとサポーターが協力して行っている日程ポスター掲示活動。フロントが作ったポスターを、サポーターが協力して横浜中の店等に掲示をお願いしまくるってのを地域へのマリノスアピール活動の一環として行ってます。

で、新しい日程ポスターが出来たので、昨日(4/25)更新活動を行ってきました。ちなみに自分は主に綱島地域でポスター活動をやってます。去年くらいに綱島のポスター活動してたときは3〜4人くらいで50近くの店舗を回ってたのですが、今回はなんか10人くらい集まってました。

今回のポスターは超カッコいい坂田大輔選手がでかでかとフィーチャーされてる超カッコいいポスター。去年は若手のプッシュも兼ねて、あえて有名どころの選手は使わなかったのですが、今年は有名どころのターン。前回は中澤選手、今回は坂田選手と、フロントも本気モード。どうみても選挙ポスターにしか見えなかった去年に比べ、デザインにも金かけてる感じです。

↓こんな感じのポスター。
http://www.f-marinos.com/oremari/

自分とこの住んでる町にサッカークラブがあるっていうのを地元民に根付かせるという目的でやってますが、横浜中の美味しい店を掘り出すという副作用もあったりします。


ポスター貼る

サポーター間で話題になる

店にサポーターが来る

ポスター営業への印象が良くなる

的な好循環を起こしている店もあり、地域とチームの融合に向けていい効果が少しずつ出ている感じです。肝心のマリノスの試合結果がアレなんで、更新時になぜか店の人に怒られることもあったりwww

で、そうやって坂田選手のポスターを貼りまくって、その選手がゴール入れた日にはお祭りですよ。

2009 J1 第7節 名古屋 2 - 1 横浜FM

43' 坂田大輔
71' 吉田麻也
81' 小川佳純	

祭りきれなかった…orz

前々節神戸相手に5点とって初勝利後、首位鹿島相手にスコアレスドローで勢いに乗ったと思ったところで躓く。なんつーか、相手がどこだろうと勝ってないのに勢いに乗ったと思うのは間違いだな、と。相手がどこだろうと、勝って初めて勢いも出るんでしょうね。

悩む暇も無く次の試合があるのは、多分いいことなんでしょう。こういうときに次がホーム2連戦ってのはありがたい。たくさんの観客の前でプレーさせてあげられれば、と思います。

というわけで、ゴールデンウィークは是非日産スタジアムへ。

4/29 J1 第8節 横浜FM - 磐田 17:00@日産スタジアム
5/2  J1 第9節 横浜FM - 川崎 15:00@日産スタジアム

まぁ、今シーズン面白くなかった試合は1つもなかったので(全部は見てないけど)来て損は無いと思います。

java.nioに触ってみた(UDP通信編)

大容量のデータを高速通信をしようとして、UDPデータ送受信のプログラムを書いていたのだが、どうにもパフォーマンスが出なくて悩んでいた。所謂、以下にあるようなマルチスレッド型のサーバを書いていた。

...
DatagramSocket socket = new DatagramSocket(4649);
byte[] buffer = new byte[8192];

while(true) {
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    socket.receive(packet);
    
    byte[] receiveData = new byte[8192];
    System.arraycopy(packet.getData(), 0, receiveData, 0, packet.getData().length);
    
    Worker worker = new Worker(receiveData, packet.getSocketAddress());
    pool.execute(worker);
}
...

詳しくは書いてないけど、Workerってのが受け取ったパケット一つを処理するワーキングスレッドで、パケットを受け取るたびにスレッドプールにワーカを渡して処理させている。こんな感じで書いていたのだが、パフォーマンスがちっとも出ない。数十MByteのデータを秒間3MByte/sくらいのスピードで送るとパケットの取りこぼしが大量に発生する。

冷静に考えると、スレッドが多すぎたのだ。8KByteのパケットで秒間1MByte/secを出そうとしたら、単純計算で128スレッドが1秒間に生成されることになる。スレッドプールで使い回しているとはいえ、これではパフォーマンスは出ない。

C言語だと、select()/poll()あたりを利用することで、データを受け取るまでブロックしないということが出来るので、わざわざマルチスレッドにする必要はない。で、Javaでこれを実現するためにはNew IOというパッケージを使う必要があるみたいだ。

というわけで、ざっくり調べつつ書いてみた。TCPでのNew IOの使い方の資料はいっぱいあるんだが、UDPだととたんに少なくなって結構苦労したが、やってみれば実はTCPと大差ない感じだった。

DatagramChannel datagramChannel;
Selector selector;
....
datagramChannel = DatagramChannel.open();
datagramChannel.socket().setReuseAddress(true);
datagramChannel.socket().bind(new InetSocketAddress(port));
datagramChannel.configureBlocking(false);
           
selector = Selector.open();

datagramChannel.register(selector, SelectionKey.OP_READ, new IOHandler());

まずは、上記のような感じでチャンネルとセレクタを初期化する。チャンネルっていうのは入出力をラップするものだと思えばよくって、DatagramChannelだとかServerSocketChannel, SocketChannel, FileChannelなどがある。ファイル記述子とその操作をラップしたオブジェクトだと思えばいいのかな。で、セレクタってのはselect()/poll()に対応するものだと思えばいい。

上記のコードではDatagramChannelを初期化して、セレクタと関連づける。このチャンネルが読み込み可能な状態になる(=パケットを受信する)と、IOHandlerに処理が委譲される。IOHandlerは自分で定義したクラスで、実際にパケットを受信したときの処理を行う。

while (selector.select() > 0) {
    Set<SelectionKey> keys = selector.selectedKeys();
    for(Iterator<SelectionKey> it = keys.iterator(); it.hasNext(); ) {
        SelectionKey key = it.next();
        it.remove();
                    
        Handler handler = (Handler)key.attachment();
        handler.handle(key);
    }
}

上記は実際のサーバプロセスのコード。セレクタのselect()メソッドでイベントを待つ。イベントを取得するとselectedKeys()メソッドで、イベントが発生したチャンネル一覧を取得する。その後のfor分でチャンネル毎に処理を行う感じ。attachment()関数でregister時にアタッチしたオブジェクトを取得可能なので、ここでIOHandlerオブジェクトが取得できる。複数のチャンネルで待っている場合は、ハンドラを別々に登録することで、チャンネル毎の処理を分けて記述することが出来る。ちなみに、UDP通信だと別にいらない気もする…。

interface Handler {
    public void handle(SelectionKey key) throws ClosedChannelException, IOException;
}

class IOHandler implements Handler {
    @Override
    public void handle(SelectionKey key) throws ClosedChannelException, IOException {
        DatagramChannel channel = (DatagramChannel)key.channel();
        ByteBuffer buf = new ByteBuffer(8192);
        SocketAddress address = channel.receive(buf);
        buf.flip();
        channel.send(buf, address);
    }
}

で、実際に処理を行うハンドラクラスが上記のような感じ。別段、handle()メソッドの中身を直接サーバプロセス内のwhile文に書いちゃっても結果は一緒。DatagramChannelでは、receiveとsendを使ってクライアント側とやりとりを行う。receiveの返り値にクライアントのSocketAddressが返ってくるので、それを利用してデータを送り返す感じになる。上記のコード例だと、やってきたデータを熨斗はつけないまでも、そのまま送り返す感じになっている。

これでパケット受信毎にプロセスを作らない仕組みが出来た。select()/poll()っぽい感じのコードがNew IOのライブラリを使うことで書くことが出来る。別段New IOなんて新しいパッケージでもないんだけど、Javaのフィーチャーの中ではあまりメジャーじゃないし、自分でも使ったことが無かったから結構新鮮。

実はtomcatも5.5からNew IOになってるとか。やっぱり有名どころのオープンソースのコードはざっとでいいから目を通しておかないと、世の中の潮流から取り残されちゃうね。そのうちファイル転送におけるNew IOを使った場合と使わなかった場合の性能比較でもやってみようかなと思う。

ちなみに、New IOに関して言えばマイコミジャーナルライトニングJavaあたりに結構詳しく書いてあるので、そっち見た方がいいかも。UDPで書いてる記事が見あたらなかったのでさっくり書いてみた。でもまぁ、大して変わらんよなw

天皇杯準決勝・横浜F・マリノス v. ガンバ大阪

3月の6万人集めた開幕戦で始まった2008シーズン。ガンバ相手に0-1という結果で敗退し、シーズンは終わった。

双方とも死力を尽くした120分はまさに死闘だった。ガンバは強行日程だったし、マリノスは延長で山瀬功治の負傷、清水範久の退場。次に決勝があるとは思えない悲壮感漂う試合だった。

サポーターも声を切らさず、最後まで戦ったと思う。勝負を分けたのは、選手やサポーターの勝ちたい気持ちの差ではなかったと思う。ちょっとした運だとは思うがそれを掴めたのはACLチャンピオンのガンバで、掴めなかったのが4年無冠のマリノスなんだろう。

悔しいし、なにか心にぽっかり穴が空いたような気分だけど、14年ぶりにベスト4まで連れて来てくれた選手達に感謝です。

その後、新潟のオフィシャルから大島加入のニュースを見た。その時になってようやく終わったという実感が沸いた。

そして、新しいシーズンが始まるんだろう。

苦しい話は今後たくさんありそうだけど、どんなときでも不変なのがサポーターじゃないかな。

自分が何も出来ないと思うのは諦念でしかないし、自分には何かが出来ると思うのは思い上がりでしかない。ここ最近の自分の座右の銘です。やればいいんだよ、っていうだけです。結果ってのは次にやることへのフィードバックに過ぎないよね。

来年もその言葉を胸に、頑張ろうと思います。

放置しておくと書かなくなりそうなので

とりあえず箇条書き程度に近況報告。

  • J32節。必死の千葉を気持ちで上回る勝利(0-3)。諦めない千葉の選手とサポーターに好感を持った。
  • J33節。またもや必死の東京ヴェルディ松田直樹ループシュート長谷川アーリアジャスールのプロ初ゴールに狂喜乱舞(2-0)。
  • アメリカに留学するために会社を辞める社員の送別会。ムービー作成初体験。結構楽しい。
  • J34節。浦和ホームで大量得点(1-6)。祭りじゃー。
  • KORG nanoPAD買った。
  • 酷い日本が出てくることで話題のRED ALERT3を買った。
  • 会社の忘年会でXactiもらった。嬉しい。
  • 天皇杯準々決勝。この時期の鳥栖遠征はお財布に優しくない。内容が微妙ながらも無事勝利(1-3)。
  • 久々にドラム叩く。間違いなくアヒトイナザワの影響を受けてる。やっぱりやってて一番楽しい楽器だなぁ。
  • 2年ぶりくらいにP2Pのプログラミング。Webアプリケーション作るよりコードを書いてる気分になれるな。

余裕があればそのうち個別エントリ起こすかもしれんが、多分無いと思うw

またperfumeを聴いてる

ブログのタイトルがこれなんだから、もうちょっとNumber Girlの話に触れろよとか思いつつ、またperfumeの話。

新曲「Dream Fighter」の歌詞がジワジワと自分の心を侵食している感じ。

もし辛い事とかがあったとしてもそれは君がきっとずっと
諦めない強さを持っているから僕らも走り続けるんだ

ここが一番好きな歌詞。なんていうか、下積み生活が長くて、2畳のスペースがあればプロとして完璧な踊りを見せ、先日武道館ライブを成功させた彼女たちに言われると凄くグッと来る。本当に走り続けて来た人が歌ってるからこそ心に響く。アイドルっていうのはやっぱり自分が「こうありたい」と思う姿の偶像であって、きっと見る人によって多様な姿を見せるんだろう。そこでシンクロしてしまったらそれは本当にもう、好きになるしかないよね。