2016年8月15日月曜日

米国への移住生活の始まり

日本を出てから3日が経ちました。
今回、勤めている会社で、米国の拠点に海外駐在するチャンスを得ることができました。
駐在が決まってから、出国するまでも手続きなどやらなければならないことが多く大変な毎日を過ごしていましたが、出国後も毎日が新しいこととの戦いです。

インターネットからも情報を得ているのですが、情報が古かったりして、「あれ?」となることも多々あります。時間が経てば、手続きなどの方法も変わるため、仕方がないですが・・・。直近に同じ手続きをする人がいればと思い、私の場合の経験を書き残していこうと思います。

ちなみに、私の移住先は米国西海岸にあるシリコンバレー地域です。シリコンバレーという地名があるわけではなく、AppleやGoogleなど昔から多くのIT企業が集まる地域を指した通称のようなものです。

出国までに行った手続きについて

ビザの取得はもちろんですが、出国までにも様々な手続きを行いました。例えば、米国で利用する銀行の口座を開設やクレジットカードの作成など、現地で生活を始めるために必要な手続きもあれば、米国用の携帯電話の契約や日本の携帯電話を解約しないで電話番号を帰国後にも使えるようにする手続きなど、やっておくと後々役立つような手続きも紹介します。


ビザ


私の場合、L1ビザと呼ばれるビザを取得しました。このビザは、米国へ駐在する人が取得するビザの一種です。このビザは米国現地の法人でマネージメントをする人や、専門性の高い能力を備えた人に発給されるビザであるため、基本的には会社が申請手続きを進めていくことになります。
申請者本人が準備する書類としては、証明写真(電子・プリント)、英語版の大学の卒業証明書、家族を帯同させる場合、戸籍謄本(全部証明)がくらいでしょうか。
また、ビザ申請に必要な個人情報はDS-160と呼ばれるフォームへWebで登録します。会社が登録する場合は、会社への個人情報の提供が必要になります。
会社が準備する書類は、申請者本人の職歴、および、なぜ現地へその人を駐在させて働かせないといけないのかを説明するレター、会社リスト、Form I-129S、Form G-28と多種にわたります。

これらの書類を揃えた上で、米国大使館へ面接の予約を行ないます。
米国大使館では、「手荷物検査->受付->書類提出->保証金(500ドル)の支払い->指紋採取->面接」という順番で面接が進みます。混雑状況によりますが、受付までに1時間、面接が終わるまでにさらに2時間と合計3時間かかる人もいるようです。私の場合、朝8時に行ったため、まだ混雑しておらず、待つことなく受付を済ませることができました。さらに、受付後も1時間足らずで手続きを終えることができました。
私の場合、面接は、勤務先の確認と業務内容を聞かれたくらいで数分で終わりました。ここで、入社年度が5年未満と浅い場合、なぜ現地で人を雇うのではなく人を駐在させなければを説明させられるそうです。
面接の最後に、その場でビザが発給されるかどうかがわかるので、発給されない場合、なぜダメだったのかを聞いておけば、理由によっては再申請で発給される可能性は高くなります。
米国大使館へ行く際に気をつけることは、鞄がリュックではダメなこと、電子機器や記録媒体の持込が禁止であることです。できるだけ荷物は駅のコインロッカーに預けるようにして、提出する書類と、待ち時間を潰すための文庫本だけにした方が無難だと思います。


銀行口座開設


私の場合、ユニオンバンクとプレスティア(シティバンクATMを利用可能)の口座を開設しました。現在、日本でこれらの口座を作る場合、ユニオンバンクは東京三菱UFJ銀行が、プレスティアはSMBC信託銀行が窓口となるため、以前に比べてとても作りやすくなったんだと思います。
プレスティアの場合、Webサイトに必要事項を記入し、パスポートなどの身分証明書の情報を添付すると2週間ほどで日本の自宅にカードが届きました。
ユニオンバンクの場合、Webサイトで資料請求し、必要事項を記入の上、返送するとこちらも2週間ほどでカードが届きました。


クレジットカード契約


米国のクレジットカードを作成する場合、クレジットのヒストリーがないと作成が困難となります。そこで日本から米国へ移住する人がよく作成するクレジットカードはANAカードJALカードです。
これらのカードは出国前から申し込みが可能で、日本のヒストリーも参考にされるため、審査が短期間で、かつ、承認を受けやすいカードとなります。私の場合、年会費の安いJALカードだけを作成しました。
手続き方法は、Webサイトで必要な情報を記入すると、電話をかけるようにという旨のメールが数日後に届きます。そして、その番号にかけると、本人確認が行われます。さらに必要な添付書類のコピー(パスポートとビザのコピー)をWebサイトへアップロードすると、審査が開始されます。審査開始時と審査結果が出た際に登録したメールアドレスにFirst Bankcardというところからメールが届きます。(JALからではなかったので、最初はスパムメールかと思いました・・・)
あとは、入国後に登録した住所へカードが届く予定です。
まだ、入国間もないので、私の手元には届いていませんが・・・。


携帯電話契約


米国に入国してから携帯電話を契約する場合、ソーシャル・セキュリティ・ナンバーやクレジットカードが必要となります。そのため、早くても1か月程度かかる可能性があるため、私の場合、日本から現地の電話番号を契約できるKDDI mobile x H2Oを採用しました。私が申し込みをしてから、まだ1か月も経っていませんが、申し込み方法が変わっているようです。私の場合はFAXでしたが、今はWebから申し込みするようになっています。。。

2014年5月10日土曜日

node.jsのgmで画像情報を取得しようとした時のエラー

node.jsのgraphicsmagick用ライブラリgmで画像の縦横の長さを取得しようとしたときにエラーが発生

エラー内容:
{ [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }

原因:
GraphicsMagickでImageMagickをサブクラスとして利用しており、ImageMagickが利用できない

対応方法:
ImageMagickを読み込ませる(ImageMagickがインストールされていない時はインストールする)
var gm = require('gm'); -> var gm = require('gm').subClass({ imageMagick: true });

参考サイト:



2014年4月21日月曜日

mocha/chaiで配列を比較するとき

Node.jsのmochaと言うテストフレームワークでテストを実行し、chaiでassertしようとしたときに、うまくassertされない問題が発生した。こんな感じで。
describe('', function(){
  describe('', function(){
    it('', function(){
      [].should.equal([]);
    });
  });
});
これはequalが配列を1つのオブジェクトとして比較するため、配列内の1つずつのデータを比較しているわけではないために発生しているらしい。
"equal"を"eql"に書き換えることで、正しくassertされるようになった。

ref: http://stackoverflow.com/questions/17526805/chai-test-array-equality-doesnt-work-as-expected

2012年9月2日日曜日

macでjsdomがインストールできなかった

macのnode.js v0.8.8でnpm v1.5.9を使ってjsdomをインストール使用としたら、contentifyというライブラリのmakeに失敗してしまった

原因は、pythonのバージョンが古かったため??
よくわからないが、python v2.5.3をmac用のpythonインストーラを使ってv2.7.3にアップグレードしたら問題なくmakeできるようになった

2012年8月31日金曜日

macでmakeを使えるようにする方法

node.jsでnpmコマンドを使って、モジュールをインストールしようとしたときに、makeがないと怒られたので、macでmakeを使えるようにする手順をメモ

1.XcodeをAppStoreからインストール
2.AppleのMac Dev Centerへアクセス(ログインが必要)
3.DownloadsのAdditional Downloadsにある「View all downloads」を選択
4.Command Line Tools for Xcodeをダウンロードしてインストール

以上で、makeができるようになった。。

XcodeをDev Centerからダウンロードしてインストールすると、Xcodeのpreferencesからインストールできるらしい。。。

2012年8月4日土曜日

bloggerのモバイルテンプレート

bloggerのモバイルテンプレート機能がレスポンシブ・デザインに合うかを調査
公式な情報はうまく見つけられなかったが、どうもブラウザのユーザ・エージェントでPC/モバイルのどちらのテンプレートを利用するかを決めているよう

Safariのデフォルトのユーザ・エージェントでアクセスした場合、
Safariのユーザ・エージェントを「Safari iOS 5.1 - iPhone」に変更した場合、
モバイルテンプレートを適用する場合は、URLに「?m=1」という文字列が自動的に追加された。また、URLに「?m=1」をつけたままSafariのデフォルトのユーザ・エージェントに切り替えても、モバイルテンプレートが適用された。iPadのユーザ・エージェントでは、モバイルテンプレートは適用されず、PCのテンプレートが適用された。

結論としては、表示画面の幅に応じて、デザインを切り替えるレスポンシブ・デザインでは、ユーザ・エージェントによってテンプレートを切り替える方法は適切ではない。
そのため、今回、モバイルテンプレート機能はオフにした。

Safariでユーザ・エージェントを切り替える方法:

・「開発」メニュー > 「ユーザエージェント」から、切り替えたいユーザ・エージェントを選択
・「開発」メニューが表示されない場合、「Safari」メニュー > 「環境設定」を開き、「詳細」タブで「メニューバーに”開発”メニューを表示」にチェックが入っていることを確認する

モバイルテンプレートを無効にする方法:

・bloggerのメニューにある「テンプレート」タブを選択し、表示される画面にある歯車マークを選択して、「いいえ。携帯端末でPCテンプレートを表示する」を選択する

2012年8月2日木曜日

レスポンシブデザインの勉強

最近、Web UIデザインの勉強を始めました。
流行のWeb UIデザインは、Responsive Designというらしく、これを試しに作成してみるため、オトなか れすぽんしぶというbloggerを新しく作成しました。

最新の作成状況は、そちらのサイトで確認できます。

2012年1月4日水曜日

DjangoでDateTimeを月や年でリスト取得する方法

DjangoでDateTimeを月や年でリストとして取得する方法
たとえば、blogなどで投稿がある月のみをリスト化したいときに、年・月のリストを取得するときに利用する方法

Entryというテーブルのpub_dateというカラムをリスト取得する場合、
Entry.objects.dates('pub_date', 'year') -> 年でリスト取得
Entry.objects.dates('pub_date', 'month') -> 年・月でリスト取得
昇順でリストを取得したい場合、order='DESC'を引数に追加する

参考サイト
QuerySet API

DjangoでDateTime型をテンプレート内でフォーマッティングする方法

DjangoでDateTime型のパラメータをテンプレート内で、所望のフォーマットで表示する方法

1.views.pyでは、他の型のパラメータと同じように、Dictionary型をContext型にフォーマッティングして、テンプレートに読み込ませる
import datetime
from django.template import loader, Context
from django.http import HttpResponse

def index(request):
    param1 = 'test'
    param2 = datetime.datetime.now()
    template = loader.get_template('test.html')
    contexts = Context({'param1':param1,
                        'param2':param2,})
    return template.render(contexts)

テンプレート内では、次のようにフォーマッティングする
{{ param2|date:"Y/n/d g:i A" }}
上のように指定すると、「2012/1/4 5:12 PM」と表示される

参考サイト
Built in template tags and filters

2012年1月1日日曜日

DjangoでSTATIC_URLをテンプレートで使う方法

STATIC_URLをテンプレートで参照できるようにする方法

1.settings.pyに割り当てたいURLを記述する
STATIC_URL = 'http://localhost/static'

2.views.pyでテンプレートを呼び出す時にRequestContextを利用する
from django.template import RequestContext, loader
from django.http import HttpResponse

def show(request):
    template = loader.get_template('show.html')
    contexts = RequestContext({})
    return HttpResponse(template.lender(contexts))

3.テンプレートファイル(show.html)でSTATIC_URLを使う
{{STATIC_URL}}と指定すると、settings.pyで定義した値を表示できる

2011年12月29日木曜日

SpringFrameworkでWebアプリ作成

今までは、Python(Django)でWebアプリを作成していたが、これからはJavaで作らなければならなくなった

いろいろとJavaのWebフレームワークを比較して、Spring MVC 3.1.0 Releaseで作成することにした

DI (Dependency Injection)など、慣れない考え方で苦戦中だが、詰まったところを記録に残していく

2011年10月30日日曜日

Google App EngineでDjango

Google App Engineのサイト構築にDjangoフレームワークを利用する方法
詳細はここに書かれている
とりあえず、ヘルパーをダウンロードしてきて、後はデータストア周り以外は普通にDjangoでプログラムを書けばよいみたい?

2011年9月19日月曜日

MacへのOpenCVインストール

MacへOpenCVをインストール
Pythonから呼び出すため、Python 2.7とともにインストール

今回は、ソースコードからではなく、MacPortsを利用してインストール
(依存モジュールが多いため)

1.MacPortsのインストール
http://www.macports.org/からインストーラをダウンロードして、簡単にインストールできる
2.MacPortsでOpenCVをインストール
ターミナルを起動し、次のコマンドを実行すれば、インストールが開始する
# sudo port install opencv +python27

・MacPortsでインストール中にPerlがエラーを起こした
Error: Target org.macports.activate returned: Image error: /opt/local/bin/a2p is being used by the active perl5.8 port.  Please deactivate this port first, or use 'port -f activate perl5' to force the activation.
エラー内にあるport -f activate perl5を実行しても、うまくいかなかった
対策としては、activeなperl5.8をアンインストールして、最新のPerlだけにすればよい

手順は次の通り
1.インストールされているPerlを表示
# sudo port installed | grep perl
 perl5 @5.8.9_0
 perl5 @5.12.3_0+perl5_12
 perl5.8 @5.8.9_3 (active)
 perl5.12 @5.12.3_1 (active)
2.インストールされているPerlの中から、古いバージョンのものをアンインストール
# sudo port uninstall perl5 @5.8.9_0
# sudo port uninstall perl5.8

これで、OpenCVのインストールを再会すればインストールできる
(インストールが完了するまでに、2時間ほどかかった・・・)

2011年8月7日日曜日

HTTPレスポンスコードの取得

Pythonのurllib2を利用してWebサイトへアクセスしたときのHTTPレスポンスコードを利用するために、保存しておく方法
urllib2では、200以外はHTTPExceptionとなってしまうため、例外時の処理として書かなければならない
import urllib2

# HTTPレスポンスコードを格納する変数
http_code = 0
# アクセスするwebサイトのURL
url = 'http://www.yahoo.co.jp'

try:
    # webサイトへアクセス
    web = urllib2.urlopen(url)
    # 成功した場合、この行以下も実行されるのでhttp_codeは200
    http_code = 200
except: HTTPError, e:
    http_code = e.code

print http_code
これで、正しくWebサイトにアクセスできたかを確認できる

参考サイト:


実行ファイルの親ディレクトリのパスを取得

Pythonでプログラムを実行しているファイルの親ディレクトリのパスを取得する方法
import os
parent_path = os.path.abspath(os.path.dirname(__file__))
print parent_path
例えば、/workspace/src/test.pyで実行した場合、parent_pathは'/workspace/src'となる

2011年8月6日土曜日

PythonでWebのリンクリスト取得

BeautifulSoupを利用してWebサイトのページ内にあるリンクをリストとして取得する方法
import urllib2
from BeautifulSoup import BeautifulSoup

if __name__ == '__main__':
    # アクセスするWebサイトのURL
    url = 'http://www.yahoo.co.jp/'

    # Webサイトへアクセス
    web = urllib2.urlopen(url)
    # BeautifulSoupで解析できるよう読み込む
    html = BeautifulSoup(web)

    # 'a'タグの全ての要素をリストとして抽出する
    base_linklist = self.getTagList('a')
    # 抽出した要素リストを1つずつ解析
    for link in base_linklist:
        # 'href'がタグ内に含まれない場合は無視する
        if link.__str__().find('href=') != -1:
            # リンク名:リンクURLと表示
            print link.string.__str__() + ':' + link['href']
リンク名が画像などの場合、link.stringはNoneが得られるため、文字列に変換しておく必要がある

2011年8月5日金曜日

Pythonでスクレイピング(Cookie取得)

urllib2とcookielibでWebサイトへアクセスしたときに、Cookieを取得するサンプル

import urllib2, cookielib
from BeautifulSoup import BeautifulSoup

if __name__ == '__main__':
    # アクセスするWebサイトのURLを設定
    url = 'http://www.google.co.jp'

    # Cookieを格納するオブジェクト
    cookie = cookielib.CookieJar()
    # Webサイトへアクセスするオブジェクト
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    # Webサイトへアクセス
    web = opener.open(url)
    # BeautifulSoupで解析
    html = BeautifulSoup(web)
    # 取得したCookie内容を表示
    print cookie
    # 取得したHTML内容を表示
    print html.prettify()

Cookieが設定されている場合、cookielib.CookieJarオブジェクトとして取得できる

2011年8月3日水曜日

Pythonでスクレイピング

PythonでスクレイピングするライブラリとしてBeautifulSoupを利用

HTMLを取得して、それを表示する簡単なサンプル
import urllib2
from BeautifulSoup import BeautifulSoup

if __name__ == '__main__':
    web = urllib2.urlopen('http://www.google.co.jp/')
    html = BeautifulSoup(web)
    print html.prettify()
これで、指定したWebサイトのHTMLを取得/表示することができる

2011年5月21日土曜日

Djangoのデータベースアクセス(その3)

テーブルのデータを取得する方法
1.データを取得する関数の作成
sampleprj/sampleapp/views.pyにshowという関数を作成し、次のようなコードを書く
# encoding: utf-8
from django.http import HttpResponse 
from sampleprj.sampleapp.models import Memo
def show(request):
    memos = Memo.objects.all()
    for memo in memos:
        print memo.userid
        print memo.title
        print memo.content
    return HttpResponse('データを取得しました')

2.URL割り当て
show関数を割り当てるURLを定義する
sampleprj/urls.pyの最後に次のコードを追加する
urlpatterns += patterns('sampleprj.sampleapp',
url(r'^sampleapp/show/$', 'show'),
)

これでhttp://localhost:8000/sampleapp/show/にアクセスすると、コンソールにMemoテーブル内の全てのデータが表示される

参考サイト:
クエリを生成する

2011年5月14日土曜日

Djangoのデータベースアクセス(その2)

新規データを追加する方法
ユーザが、http://localhost:8000/sampleapp/add/にアクセスした時に、前回作成したテーブルに新規にデータを追加する手順

1.アクセスする関数の作成
sampleprj/sampleapp/views.pyにaddという関数を作成し、次のようなコードを書く
# encoding: utf-8
from django.http import HttpResponse
from sampleprj.sampleapp.models import Memo

def add(request):
    memo = Memo()
    memo.userid = 1
    memo.title = 'first memo'
    memo.content = 'memo content'
    return HttpResponse('データを追加しました')

2.URL割り当て
add関数を割り当てるURLを定義する
sampleprj/urls.pyの最後に次のコードを追加する
urlpatterns += patterns('sampleprj.sampleapp',
    url(r'^sampleapp/add/$', 'add'),
)

これでhttp://localhost:8000/sampleapp/add/にアクセスするとテーブルに追加される。