Route 53 で Zone Apex を ELB に振り向けるときの設定

僕は mahata.org というドメインを所持している。

mahata.org のウェブサーバは ELB の背後にあり、mahata.org を名前解決した結果はこの ELB を指してほしい。これを実現するため AWS 固有の知識が必要だったので、後々のためにメモを残しておく。

直面した課題

Zone Apex とは「サブドメインを含まないドメイン名」を示す言葉である。例えば “www.mahata.org” は Zone Apex ではなく、 “mahata.org” は Zone Apex だ。

Amazon Route 53 では Zone Apex に対して CNAME の設定が許可されていない。mahata.org を ELB の CNAME にしたかったんだけど…。ELB の IP アドレスは動的に変わるので、mahata.org の A レコードを設定するのは筋が悪い。

さあ、どうしよう。

CNAME レコード以外の選択肢

少しぐぐった結果、Amazon Route 53 では ALIAS レコードという DNS レコードを設定できることがわかった。リンク先のオフィシャルドキュメントでは、CNAME レコードとの比較の中で「エイリアスリソースレコードセットは Zone Apex に作成できます」と明記されている。

これを使えばよさそうだ。

ALIAS レコードの設定

ALIAS レコードは限られた AWS リソースにしか設定できない。例えば ELB や CloudFront ディストリビューションなどが「限られた AWS リソース」である。

対象となる AWS リソースによってレコードの設定方法は少しずつ異なる。ALIAS レコードで ELB を指す場合は DNS 値の先頭に dualstack. を付ける。例えば dualstack.elb-example-0000000000.ap-northeast-1.elb.amazonaws.com. のような感じ。

具体的には Amazon Route 53 のコントロールパネルで次のようにする。

  1. Create Record Set をクリックする
  2. “Type: A” で “Alias” は “Yes” にチェックを入れる
  3. “Alias Target” に dualstack.elb-example-0000000000.ap-northeast-1.elb.amazonaws.com. のような値をセットする

これで Zone Apex が ELB を指せるようになる。

個人型確定拠出年金に関する覚書

個人型確定拠出年金 (以下、iDeCo) について関心があり、色々と調べている。ここで調べた内容を公開するけど、内容の正しさは保証できないので、「間違えているのでは?」と思うことがあれば自分で調べなおしてほしいし、さらに一歩ふみこんでコメントなどで指摘してもらえると助かる。

iDeco のメリットとデメリット

特定の金融商品を積み立てで購入する場合と比較して、次の点でメリットがある。

  • 運用益が非課税
  • 掛け金の支払いが所得税/住民税の控除対象になる
  • 運用益が非課税になる
  • 給付金を年金で受け取るときには「公的年金等控除」の対象になる
  • 給付金を一括で受け取るときには「退職所得控除」の対象になる
    • iDeCo に加入していた時期が長いほど退職所得控除額が大きくなる

反対に、デメリットとしては次のような点があげられる。

  • 60才まで引き出せない
  • 掛け金に上限がある

ただし、「60才まで引き出せない」というのはメリットとも言える。老後のための積立金を、意志の弱さから崩してしまうことを防げるため。

金融機関選びのポイント

  • 運営管理費用の安いところ
    • SBI証券 (50万円以上の資産がある場合)、楽天証券 (10万円以上の資産がある場合)、スルガ銀行は運営管理費用が0円
  • 取り扱う投資信託の種類が豊富なところ

個人的なアクションアイテム

  • SBI証券で iDeCo の口座を開設
    • 月あたり2.3万円を拠出して、インデックスファンドに投資する

枝葉の知識

  • (公的年金である) 国民年金において、会社員や公務員など厚生年金の加入者を「第2号被保険者」とよぶ
  • 国民年金は老齢基礎年金 (65才から死ぬまでもらえる年金) の他に、障害を負ったときに支給される障害基礎年金や、死んだときに遺族に支給される遺族基礎年金という機能もある
  • 運用指図者 (新規の掛金を払うことができず、これまで積み上げた試算の運用だけを行う人: 確定拠出年金のある会社から転職した人がなる) も、2017年の1月から iDeCo に加入できる
  • 勤務先に企業年金がない場合、iDeCo の掛金の上限は年に27.6万円 (月額2.3万円)
  • 60才になった時点で iDeCo に10年以上加入していた場合、60才から老齢給付金を受け取れる: 年金 (分割して受け取り) か一時金 (一括で受け取り) かは選択できる
  • iDeCo の口座管理手数料は「国民年金基金連合会」と「事務委託先金融機関」、「運営管理機関」に支払う。前者2つは固定額 (それぞれ103円と63円) だが、運営管理機関に支払う手数料は期間によってまちまちになっている

集中力という限りあるリソース

手持ちの電子機器すべてで、電子メールや SNS からの通知を切ることが、生産性の高い生活を送るための第一歩だと思う。

個人で所有している携帯や PC なら、「えいやっ!」と勢いをつければ、通知を切ることは可能だろう。問題は職場のコミュニケーションツールだ。Slack やら HipChat やら…。今の職場は Slack を採用している。通知を切っても、ドックにある Slack アプリが「新着メッセージ」を伝えてくる。どうしたものだろう…。

よくよく考えてみると、Slack はブラウザで閲覧することができる。Slack 専用のウィンドウを作成して、それを最小化すればいい。これで通知とは無縁な生活を送ることができる。なんという開放感だ!

ところで、僕は Slack などで行われる雑談が嫌いではない。むしろ、職場のコミュニケーションツールが極端に雑談成分が少ない場合、その職場はうまく行っていないんだろうな〜とさえ思う。問題なのは同期的な雑談だ。相手が話したいことを、自分が聞きたいタイミングで聞けることが重要だ。さらに言えば、返事も自分がしたいタイミングでできるとよい。

先日から『Deep Work』を読んでいるのだが、「ノイズの多い現代においては、”何かに集中できること” 自体がスキルとして価値のあるものだ」と書かれていた。その通りだと思う。

集中力を高めること自体も価値のあることだが、仕組み化することで補える部分は積極的に仕組み化していこうと思う。

Lint が通らないコードはコミットしない

新しいバージョンの Git では、Git フックをグローバルに指定できます。グローバルなプレコミットフックには、Linter を仕込むと便利です。わたしは次のようなシェルスクリプトをプレコミットフックで走らせています。

間違えてコーディングスタンダードから外れたコードをコミットすることがなくなり、開発が捗ります。

2011年にカナダで就職したときの話

(「転職 Advent Calendar」の21日目の記事として書いています)

「北米で仕事をしてみたいけど、どうしたらいいのか分からない」と思っている人も少なくないと思います。かつての僕もそうでした。

僕は2011年にカナダに渡航し、幸運にも現地の Hootsuite という会社で仕事に就くことができました。このときの経験を踏まえ、カナダでの就労に興味がある人に向けて記事を書こうと思います。

カナダで仕事をしようと考えた動機

2010年の末に Voyage Group を退職しました。

この時点で既に東京都内で3回ほど転職しており (平均勤続年数は2年弱)、次の職場を決めかねていました。当時の自分には国内で積極的に「この会社で働いてみたい」と思える場所はなく、国外も視野に入れて仕事探しをしようと思うようになりました。

「国外も視野に」となると、多くのソフトウェア開発者が最初に思い浮かべるのはシリコンバレーだと思います。僕もシリコンバレーの会社についてリサーチしましたが、ビザの問題にぶつかりました。アメリカには知人がおらず、日本人の僕にビザ付きのオファーを出してくれる会社が見つからなかったのです。

この問題を回避する方法の一つは、アメリカの大学を卒業することです。アメリカの大学を卒業すると一年間の就労が可能なビザが発行されます。しかも、最短九ヶ月で終わるカリキュラムもあるそうです

ただ、「最短九ヶ月」は僕には短い期間には思えませんでした。もっと手っ取り早くビザを手に入れられる方法はないかと調査したところ、ワーキングホリデービザに行き当たりました。

ワーキングホリデー

ワーキングホリデーについて、多くの人は「名前は聞いたことはあるけど、詳細は知らない」という感じではないかと思います。知人に聞いてみたところ、「海外でアルバイトをしながらバケーションを楽しむ仕組み?」と言われました。大きく外してはいません。

ただ、ワーキングホリデーは「アルバイトができる」程度のシロモノではありません。普通に社員として就労することも可能です。

ワーキングホリデーの仕組みは、渡航先の国によって細部が異なります。残念ながら、アメリカはワーキングホリデー協定国ではないため、ワーキングホリデーで渡航することはできません。代わりに、ここではカナダのワーキングホリデーに絞って書いていきます。カナダはアメリカと地続きであり、文化的にも共通点が多いためです。当時の僕は「とりあえずワーキングホリデーでカナダに引越して、機をみてシリコンバレーに移ろう」と考えました。

カナダのワーキングホリデーは「30才以下の希望者に、就学と就労を無制限に行える一年間有効なビザを発行する仕組み」です。ビザの取得条件は次の通りです。

  • ワーキングホリデービザの発給数が上限に達していないこと (国ごとにビザの発給数に制限があります。また、発給数は年によって変化します)
  • ワーキングホリデービザ引換証の申請時に30才以下であること (30才ちょうどでも大丈夫です)

また、ワーキングホリデービザ引換証の申請からビザの引換まで、一年間の猶予があります。つまり、うまく手続きをすれば31才~32才までの期間をワーキングホリデービザを使ってカナダに滞在することができます。

カナダでの職探し

英語がネイティブではないので、カナダに来て最初は語学を学ぼうと考えました。色々な選択肢がありますが、UBC という大学に付属する ELI という施設に通うことにしました。これにはふたつの理由があります。

  1. UBC の学生がメンターになる
  2. UBC の設備を (ある程度は) 使える

国外で仕事をしたことがないので、「もし就労が難しいようであれば、まずは大学院に通おう」と考えていました。なので、単なる語学学校ではなく、大学付属の施設に通おうと思ったのですが、これは正解でした。UBC は総合大学なので、コンピュータ科学専攻の学生も所属しています。彼らは技術に理解があるので、それを踏まえた上で僕の履歴書を添削してくれました。また、例えば大学図書館を学生と同じ身分で利用できることも便利でした。噂に聞いていた通り、北米の大学生はよく勉強するので、同じキャンパスで時間を過ごすことで刺激を受けられたように思います。

履歴書ができてしまえば、後は日本の転職活動と同じプロセスを踏むだけです。MonsterIndeed などの求人サイトで、自分のスキルにマッチした求人を探して応募します。多くの求人では「legally allowed to work in Canada (法的にカナダで働くことが許可されている)」ことが条件に含まれますが、ワーキングホリデービザを持っているのであれば問題ありません。

また、Meetup などを通して、応募先の企業に知人を作っておくと referral (紹介者) になってもらえる場合があります。北米の有名企業では referral がない場合は最初の書類選考で落とされてしまう確率が高いです。臆せずに色々な Meetup に出かけましょう。

その後のカナダ生活

ソフトウェア技術者は就労ビザの取得が容易です。ワーキングホリデービザが切れるタイミングで、どこかの現地企業に雇用されていれば、就労ビザに切り替えることは難しくないでしょう。カナダは移民に寛容な国なので、数年間滞在すれば永住権の取得もそれほど難しくありません。

もともとの「シリコンバレーで働きたい」という目標は、カナダで働いているうちに薄れていきました。僕が就職した Hootsuite はカナダ西海岸のバンクーバーにある会社です。バンクーバーはシアトル (アメリカのワシントン州) までバスや電車で行ける距離にあり、いわゆる「アメリカ西海岸カルチャー」を感じられる土地柄です。実際に、アメリカとの間での人材流動性も高く、十分にシリコンバレー “っぽさ” は堪能できたように感じます。

ビザや永住権を手にするということは、自由を手にするということです。その国に住み続けるか、日本に戻るか、自分の意志で決めることができます。カナダ渡航前と同じく日本に住んでいても、「自分の意志で、この国に住んでいるのだ」という実感があります。この感覚を得るためだけでも、カナダに滞在してよかったと思います。

カナダ滞在に関する小技

僕がカナダに渡航する前に知っておきたかったことを紹介します。

まず、ワーキングホリデービザを取得するタイミングです。ワーキングホリデービザは一年間のみ有効ですが、日本国籍保持者はビザなしでもカナダに三ヶ月ほど滞在できます。つまり、次のようにすればワーキングホリデービザだけで一年三ヶ月ほどカナダに滞在できます。

  1. カナダにビザなし (観光目的) で入国する
  2. カナダに三ヶ月ほど滞在する
  3. アメリカに移動する (国境を超える)
  4. カナダに戻る (国境でワーキングホリデービザを取得する)
  5. カナダに一年ほど滞在する

注意が必要なのは 2. で就職活動をしてはいけない、ということです。ワーキングホリデービザは就職専門のビザではないので、ビザが発行されるタイミングでは特定の雇用主がいてはならないという規定になっているからです。ただ、これはバレようがないので、実際には雇用主を確保した上で一年間の仕事をはじめるケースも多いようです。

まとめ

カナダでの就職について色々と書いてきました。まとめると次のような内容になるでしょう。

  • (カナダの) ワーキングホリデービザは31~32才まで使える
  • (カナダの) ワーキングホリデービザは就労目的に使える
  • (UBC などの) 総合大学付属の語学施設は、現役の大学生とつながりが持てる
    • 専門的な話で盛り上がれる場合がある
    • 専門的な内容を含む履歴書の作成を手伝ってもらえるときもある
  • Meetup で referral を探せる
  • 日本国籍の保持者であれば三ヶ月はビザなしでカナダに滞在できる
    • ワーキングホリデービザだけで一年三ヶ月まで滞在できる

この記事が、カナダでの就労を考えている方の役に立てば幸いです。

CheckiO で Python を学ぶ

この記事は Python Advent Calendar の15日目の記事として書かれています。

CheckiO とは何か?

CheckiO は Python を書くことでステージを攻略していく、ゲームサービスでした。今は Python と JavaScript のどちらか好きな方でプログラムを書くことができます。

姉妹サービスとして、Empire of Code というものもあります。こちらの方では、日本のソシャゲーのように、現実世界で一定時間が経過すると回復アイテムがもらえる仕組みがあり、定期的にログインさせるインセンティブを持たせたゲームデザインになっています。

この記事では CheckiO に絞って話を進めていきます。

CheckiO のよいところは何か?

ゲームを通じてプログラミングを学ぶというコンセプトはそれほど目新しいものではありません。例えば CodinGameCodeCombat など、様々なプログラミングゲームが存在します。“Programming Games” というクエリで Google 検索する と、このジャンルで一旗揚げようとしているサービスがとても多いことが分かると思います。

このように多数のプログラミングゲームが存在する中で、僕が CheckiO を特に気に入っている理由がいくつかあります。

問題が段階的に難しくなる

このゲームでは、いきなり高難度の問題に取り組むことができないようになっています。

ゲームを攻略していくことでスコアを獲得し、ある一定値を超えた段階で、より難しい問題に挑戦できるようになります。初学者が「どこから初めていいか分からない…」と途方に暮れることのないような設計になっています。

「とりあえず要件を満たすコード」を提出できれば他人のコードを読める

簡単な問題であっても、エキスパートのコードと初心者のコードではアプローチが大きく異なります。

「とりあえず動く」コードさえ提出できれば、エキスパートのコードを読み、どこに改善の余地があるのか学べます。

逆に言うと、「とりあえず動く」ところまでは自分で考え抜かなければなりません。そこまで自力で行ければ、基本的なロジックは理解できているということなので、他人のコードを消化する準備ができたと言えるわけです。よくできています。

時間制限がない

コーディング時間の制約が一切ないので、とことん考え抜くことができます。

仕事では往々にして決められたデッドラインに向けて、妥協をしつつプログラムを作成します。CheckiO では、時間的なプレッシャーがない中、閃きがあるまでずっと問題に取り組むことができます。

再提出回数の制限も存在しないので、「これで万全!」と思ったものであっても、さらに後で改良することができます。

出題に貢献できる

企業がホストしているゲームにも関わらず、問題文に “How to improve this question?” のリンクが存在し、プルリクエストベースで問題文の編集をリクエストすることができます。コミュニティベースでサービスをよくしていきたいという姿勢には好感が持てます。

(必要があれば) ヒントが与えられる

もし全く問題を解く糸口が見つからない場合、”I have no idea how to start solving this mission (どこから手をつけていいか分かりません)” というリンクをクリックすると、出題者からのヒントが読めます。

最初の一歩を踏み出す

CheckiO でアカウントを作ると、まずは「HOME」と「ELEMENTARY」というステージに行けるようになります。例として「ELEMENTARY」にある FizzBuzz の問題を取り上げましょう。

“Fizz buzz” is a word game we will use to teach the robots about division. Let’s learn computers.

You should write a function that will receive a positive integer and return:
“Fizz Buzz” if the number is divisible by 3 and by 5;
“Fizz” if the number is divisible by 3;
“Buzz” if the number is divisible by 5;
The number as a string for other cases.

典型的な FizzBuzz の要件です。”Solve It” ボタンをクリックして、解いてみましょう。

ひな形のコードが次のように与えられています。

def checkio(number):
    #Your code here  (コードはここに書いてください)
    #It's main function. Don't remove this function  (この関数が評価対象なので、削除しないでください)
    #It's using for auto-testing and must return a result for check.  (返り値を自動テストが確認するので、値を返してください)

    #replace this for solution  (ここを書き換えて解答を作成してください)
    return str(number)

ベタに書くと、こんな感じになるでしょうか。

def checkio(number):
    if number % 15 == 0:
        return "Fizz Buzz"
    if number % 5 == 0:
        return "Buzz"
    if number % 3 == 0:
        return "Fizz"

    return str(number)

コードを書き換えたら、画面左上の “Check” をクリックしてみましょう。

正解の場合は添付画像のように “View other solutions (他人の解答を見る)” というリンクが表示されます。

CheckiO の猛者について

“View other solutions (他人の解答を見る)” を実際にクリックしてみましょう。

各人の答えは「Speedy」や「Creative」などのように、カテゴリ分けされます。

本記事の執筆時点で最も Creative なスコアが高い解答は veky による次のコードです。

checkio=lambda n:("Fizz "*(1-n%3)+"Buzz "*(1-n%5))[:-1]or str(n)

ちょっと文章では説明しづらいですが、読解してみましょう。lambda で関数オブジェクトを作り、引数 n が 1-n%3 == 1 のときだけ "Fizz " を、1-n%5 == 1 のときだけ "Buzz " を作り出し文字列結合します。そして、最後の空白を削るために [:-1] しています。"Fizz " でも "Buzz " でもないとき、すなわち "" のときは bool 評価をすると False なので or で結んだ str(n) が返り値になります。

じっくり読めば理解できるけど、これを頭の中からひねり出すのは困難でしょう。勉強になります。

まとめ

「Python を学んで次の一歩を踏み出したいけど、適当なお題が見つからない」なら、CheckiO を試してみるのも一興かもしれません。ゲーム感覚で楽しめるし、他人のコードを読むことでプログラミング力の向上も望めることでしょう。

Linux の /sys 以下のファイル変更を再起動後にも保つ方法

Linux のパフォーマンスチューニングをするとき、/sys ディレクトリ以下のファイルを編集することがままある。しかし、Linux のディストリビューションによっては、ここに書いた設定が再起動時にデフォルトに戻される場合がある。そういうときは、/etc/rc.local にマシン起動時の処理を書けばよい。

例えば Amazon Linux の /etc/rc.local のヘッダコメントには次のように書かれている。

!/bin/sh

 This script will be executed *after* all the other init scripts.
 You can put your own initialization stuff in here if you don't
 want to do the full Sys V style init stuff.

要約すると「Sys V の init とは別にマシン起動 の処理を書きたいときは、このファイルに書いていいんだよ」という感じだ。

ここに書いたシェルスクリプトは、起動するたびに毎回実行される。/sys 以下に存在するファイルの変更などは、ここに書いてしまえばよい。