2020年2月1日土曜日

0から始めるアメリカ留学 Day1 出発、入国、生活準備

2020年1月21日/日本からの出発

メリーランド大学ボルチモア校 UMBCに一番近い空港は、ボルチモア/ワシントン国際空港、通称BWIです。

日本からの直通便は残念ながら出ていません。
今回、成田ーシカゴ、シカゴーBWIの乗り換え便を使いました。
ちなみに前日に新宿でお土産のためのシガールをめっちゃ買っていきました。あと新宿のアクセスチケット?で20万ほどドル円両替。ここが一番レートが良いっぽい。109円-1ドルだったかな。
朝10:50に成田を出発する飛行機だったので、前日は東京のラボに前泊、朝6時に東京駅から出発するアクセス成田という高速バスで成田空港へ。このバスは初めて使いましたが、予めWebで予約ができ、かつ1000円と値段も良心的なのでめっちゃ便利。

成田でチェックイン&荷物預け入れ、23kgを2kgオーバーして追加料金を支払うことに。1kgあたり400円増しかと思っていたら1万円。結構痛い。
両親と妻がお見送りに来てくれて、朝ごはんを食べてさようなら。
シカゴまでは約12時間のフライトでした。JAL。
映画を見まくった記憶、”KingsMan Golden Circle”, *Aladin*, *Alita Battle Angel*, *アルキメデスの大戦*…。

シカゴに着いたらめっちゃ寒い。朝7時くらい。J-1ビザで入国なので、ESTA以外のやつに並ぶ。めっちゃ時間がかかる。2時間くらい。途中で税関の犬がやってきて、ちょっと前の方の人のスーツケースに入っている果物を見つけてめっちゃ褒められてた。みんな動物に対してはああいうふうに接してしまう。

シカゴ乗り換えはめっちゃめんどくさいっぽく、入国後に預け入れ荷物を受け取って、もう一回預けないといけない。ここでタグがついてない問題が発生。超過料100ドルな、って言われたので領収書を出して事なきを得る。たしかにな。預けたらバスか電車でターミナル移動。

で、結局乗り換え時間5時間ぐらいあったのにゲートについたら搭乗1時間前に。周りには日本人0でした。シカゴオヘア空港内で取った写真↓。
slack&zoom。みんな使おう。

国内便はAA。座席2列2列ですんげー狭くてびっくりした。
飛行機、みるからに細いなーって感じだったので思わず撮影した。シカゴからBWIまでは2時間ほど。なにゃかんやで離陸が1時間くらい遅れました。あるある。

BWIには予定16時、実際には17時30分ころに到着。
UMBCに在籍の日本人教授H先生がお出迎えをしてくださった。
感謝してもしきれません。留学初日から住めるシェアハウスを探してくださった。
シェアハウスについてもまた書きたいと思います。

まずはスーツケースを家に置き、ターゲットまで買い出しに。シーツ、毛布、枕、フライパン2枚、キッチン用15点セット、トイレットペーパー、トイレブラシ、洗剤、乾燥ふんわりシート、ティッシュ、流せるウェットティッシュ、バナナ、パン、コンブチャ、シリアル、パスタ、パスタのソース、キャンベル缶×2、スムージー、ヨーグルト、とか?250ドルくらい使った。

で、私の希望でH先生おすすめのベトナム料理屋さんへ。
アボカドタピオカスムージーが優しい甘さでめっちゃ美味しい。

玉子麺のフォーも野菜たっぷりで美味しかった。写真は忘れた。
帰ってきたらば21時くらい。

初日は時差ボケあると思うし10時でどう?との連絡をボスから日本出発前にもらってたのでドキドキしながら0時くらいには寝ました。

google photoつかってるとbloggerと連携するからめっちゃ楽なことに今更気がついた。
便利。

続く。

2020年1月28日火曜日

0から始めるアメリカ留学 Day 0

だいぶ更新が滞っていたこのブログをUniversity of Maryland, Baltimore County (UMBC) 留学に伴って復活させます。

タイトルはひとまず「0から始めるアメリカ留学」とします。
語学力0、コネ0、知り合い0からアメリカでどこまでやれるか。
正直に記録していこうと思います。


なぜコネ0、知り合い0からの留学に…?

そもそもPDに通ったあとで、Max2年は海外で研究していいことがわかっていたのでいい機会だから留学しておこうという気持ちが満々でした。直前にUCLAに留学してた先生がめっちゃ楽しそうだったので同じところに行こうかなっと軽く考えていたんですが、

某A先生曰く、「俺と同じところ行ったってって面白く無いじゃん、誰も行っていないところに行かないと。」
いやあ、全くそのとおりです!

ということで、2019年内に留学開始させてくれる人という条件のもと2019年3月くらいから探し始めました。

CVと共にメールを送り続けるが…

提示する条件は、「期間1年から1年半、自己資金(PD)で生活と研究をします。」
いろいろな先生から「どこだって好きなとこ行けるよ。じゃぱにーずまねー持っていけばさ。」と言われていました。

で、まずはComputational Photography関係でメールを出して見ましたが、ほぼ返信なし。何回送ってもだめでした。(一人だけ、いまはいっぱいだからむり。と返信がありました…それだけでもありがたかった。)

某M先生曰く、「まず知らんやつからメールきてもJunk mailになっちゃうんじゃないかな、ボスから送って貰いなよ。」納得はしたんですが、実行はしていなかったです…。

で、5月くらいの国際学会で出会った先生の知り合いでVRを専門としている人がニュージランドにいると聞き、藁にも縋るの思いで頼んでみたのですが、そちらも連絡来ず。

そんな折、6月にマレーシアであった国際学会にアメリカから来ていた先生の発表後、話しかけに行ってなんとかきっかけを掴みました。会場でポスドクどっか行かないの?とか結構現実的な話を色々したのでまあまあ手応えはありました。後日、大ボスと話して許可もらったよとのメールを頂く。

やっぱりいくらお金を持っていてもno bodyを受け入れてくれる先生は少ないよなあと思いました(このあたりは利根川進先生の著書 確か、精神と物質で述べられていました)。実際に会って話して、信頼を得て、そういうのが大事だなあと。

あとは野となれ山となれ

OKが出たのが6月、そのあとappointment letterやらDS-2019やらと色々書類とか準備してJ-1を取得したのが11月末くらい、ホントは12月中に出発すればよかったのに、グダグタしてしまって結局飛行機を取ったのが12月中旬、年末年始があれほど航空券が高騰するとは思わなかった。僕が今回非常にラッキーだったのは、留学先UMBCに日本人の先生がいた事です。その先生がシェアハウスを紹介してくださったおかげでいまの自分があると言っても過言ではない。今頃研究室に寝泊まりしていたかもしれない。そのうちにどんな家に住んでいるか、どんな研究生活を送っているか書いていきたいと思っています。

ちょっとづつ、思い出した折に書き足すこともあるかもしれませんが。
では。


2018年2月3日土曜日

Processingのbox2dで複数のポリゴンシェイプを組み合わせた場合の表示

Processingにも物理計算をしてくれるライブラリのbox2dがあります。

このライブラリはNature of code、(この教材は素晴らしいもので、0円で入手できる。)でも紹介されている(というよりそのライブラリを作ったヒトが本の作者)のだけれど、box2dは大きなライブラリなので省かれている部分も多いですね。

例えば、polygon shapeを組み合わせてbox2d上の剛体を作った場合に、用意されているサンプルでは組み合わせ順で、最後にcreateFixtureをしたフィクスチャしか表示してくれない。

これはサンプルプログラムのdisplay関数がポリゴンの組み合わせを想定していないため。

わかっているヒトを前提として書きますが、
Fixture f = body.getFixureList();
でとれるフィクスチャは最後に加えたものだけです。
そのフィクスチャの座標だけを描画してしまうので、透明な物体が出来上がってしまう。

であれば、bodyにくっついている他のフィクスチャ(ポリゴン)の座標情報を取り出して、描画したい場合にはf = f.getNext();してボディについている次のフィクスチャを指定する必要があります。ただし、ボディについているフィクスチャの数をlengthやgetSize();で取ってくることができないので、getNext();してみて、nullでないかどうか確認して取ってくる必要があります。

具体的に、二つのポリゴンを組み合わせて描画する場合のprocessing の box2dサンプルにふくまれるPolygonsのCustamShapeというファイルを公開します。
displayの中のwhile文の中身を新しく足しました。

// The Nature of Code
// 
// Spring 2011
// Box2DProcessing example

// A rectangular box
class CustomShape {

  // We need to keep track of a Body and a width and height
  Body body;

  // Constructor
  CustomShape(float x, float y) {
    // Add the box to the box2d world
    makeBody(new Vec2(x, y));
  }

  // This function removes the particle from the box2d world
  void killBody() {
    box2d.destroyBody(body);
  }

  // Is the particle ready for deletion?
  boolean done() {
    // Let's find the screen position of the particle
    Vec2 pos = box2d.getBodyPixelCoord(body);
    // Is it off the bottom of the screen?
    if (pos.y > height) {
      killBody();
      return true;
    }
    return false;
  }

  // Drawing the box
  void display() {
    // We look at each body and get its screen position
    Vec2 pos = box2d.getBodyPixelCoord(body);
    // Get its angle of rotation
    float a = body.getAngle();

    Fixture f = body.getFixtureList();
    PolygonShape ps =  (PolygonShape) f.getShape();
    
    while(true){
      ps = (PolygonShape) f.getShape();
      rectMode(CENTER);
      pushMatrix();
      translate(pos.x, pos.y);
      rotate(-a);
      fill(175);
      stroke(0);
      beginShape();
      //println(vertices.length);
      // For every vertex, convert to pixel vector
      //while(f.getNext() == null){
        for (int i = 0; i < ps.getVertexCount(); i++) {
          Vec2 v = box2d.vectorWorldToPixels(ps.getVertex(i));
          vertex(v.x, v.y);
        }
      endShape(CLOSE);
      popMatrix();
      println(f);
      //f = f.getNext();
      if(f.getNext() == null){
        break;
      }else{
        f = f.getNext();
      }
      
    } 
  }
  // This function adds the rectangle to the box2d world
  void makeBody(Vec2 center) {

    // Define a polygon (this is what we use for a rectangle)
    PolygonShape sd1 = new PolygonShape();

    Vec2[] vertices1 = new Vec2[4];
    vertices1[0] = box2d.vectorPixelsToWorld(new Vec2(0, 3.5));
    vertices1[1] = box2d.vectorPixelsToWorld(new Vec2(10, 6));
    vertices1[2] = box2d.vectorPixelsToWorld(new Vec2(15, 8));
    vertices1[3] = box2d.vectorPixelsToWorld(new Vec2(20, 30.8));

    sd1.set(vertices1, vertices1.length);
    
    PolygonShape sd2 = new PolygonShape();
    Vec2[] vertices2 = new Vec2[4];
    vertices2[0] = box2d.vectorPixelsToWorld(new Vec2(0, -56));
    vertices2[1] = box2d.vectorPixelsToWorld(new Vec2(-5, -6));
    vertices2[2] = box2d.vectorPixelsToWorld(new Vec2(-30, -8));
    vertices2[3] = box2d.vectorPixelsToWorld(new Vec2(-50, -30.8));
    sd2.set(vertices2, vertices2.length);

    // Define the body and make it from the shape
    BodyDef bd = new BodyDef();
    bd.type = BodyType.DYNAMIC;
    bd.position.set(box2d.coordPixelsToWorld(center));
    body = box2d.createBody(bd);

    body.createFixture(sd2, 1.0);
    body.createFixture(sd1, 1.0);
  }
}

Processingでbox2dやってみたいヒトは多そうだけれどこの情報があまりなかったし、この部分で引っかかってたヒトの質問にだれも答えてなかったみたいなので書きました。結構前の質問みたいだったけど、届くといいですね。

https://forum.processing.org/one/topic/jbox2d-problem-i-cannot-render-draw-all-the-polygons-that-are-attached-to-the-body-in-my-code.html