Web系ベンチャーに転職します

9月中旬からWeb系企業への転職活動を勧めていたのですが、 昨日先方から内定の通知が来ました。

とりあえず、備忘録として転職に至った経緯、今後やりたいこととかを 書き留めておこうとおもいます。

年齢とか

27歳。男性。

現職の仕事内容

医療系のシステムベンダーで介護関係のシステムを担当、 言語はVB.NETで、Windowsのネイティブアプリを作ってました。

転職先での仕事内容

Ruby on RailsのWebエンジニア

100万人以上のユーザーがいるWebサービスの開発に携わることになります。。 プレッシャー半端ない。

転職理由

ずっとWebエンジニアになりたかった

大学のときもWeb系に進みたいと思っていたのですが、実力不足でその時は 今の会社に就職しました。でも、ずっとWebエンジニアになりたいという気持ちは 消えず、個人的にRailsやSwiftを自習していました。

危機感

今の会社の方針として、言語はVB.NETしか使うことができませんでした。 VB.NET自体はC#の方言みたいなもんで十分先進的な言語だけれど、 世間的には余り使われていない部類の言語だと思います。 また、フレームワークも自社独自のものを使っていました。 この環境で5年、10年と働いていけば、確実にエンジニアとしての市場価値は 低くなっていくだろうな・・と感じていました。 社内の体制変更、入社から3年たったことなど、抜け出すなら今しかないと考え 転職を決意しました。

未経験なのになぜ採用されたか

自作アプリを面接に持っていた

個人的に勉強のためにRuby on Railsで簡単なSNSサイトを、 Swiftで中古本の価格を検索できるアプリを作っていました。 面接でこれを見てもらったのがすごく効果があったと思います。 一次面接で圧迫的だった面接官の態度(内定もらったところとは別の会社)が、 アプリを見せた時にガラッと変わるのはすごく印象的でした。 多分、自作アプリを面接で見せるだけで2倍ぐらいは通過率が上がるんじゃないかな。

入社までに勉強しておくこと

Ruby

抜けている知識を埋めておくために、 Ruby技術認定試験のSilver(できればGold)を取得しておきたいと思います。

Ruby on Rails

Railsチュートリアルを読み返します。 あと、実際にWebサービスを一つ作っておこうと思います。

mongoDB

とりあえずどんなものか触っておこうと思います。

AWS

Railsで作ったWebサービスをデプロイしてみたいと思います。

Git、GitHub

GitHubFlowで開発をしていると聞いているので。。 恥ずかしながらPullRequstを送ったことがないのでそのへんも勉強しておこう。

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

を読んだので重要だと思ったところをメモ。

第一部 キャリアを築こう

専門性はとても大事(p.33)

特定のフレームワークやプラットフォームについて深く掘り下げることによってより高い時給を要求できる。 また、専門分野は時代の流れによって変えていくことが大切。

あなたの習慣を見直そう。自らの1日を観察して、出来る限り多くの習慣を見つけよう。良いものと悪いものに分けてリストアップしよう。次に、いい習慣を考えてそれを身につけるプランを立てよう(p.56)

プロとアマの違いについて、プロになるために習慣の見直しが重要だということ。

第二部 自分を売り込め!

私がソフトウェア開発者に特に勧めたいもっとも効果的なものは、ブログである。ブログはインターネット上のホームベースにすべきだと思う。(p.107)

エンジニアが自分をマーケティングするにはブログをやると良いよという話。実は僕もこれを読んで始めた。

第3部 学ぶことを学ぼう

第33章 教える:学びたいなら教えよう

私がいつも勧めているのは、ブログの解説である。ブログは、あまりプレッシャーを感じずに自分が学んでいることを他人に教えられるすばらしい場だ。(p.185)

第4部 生産性を高めよう

第38章 ポモドーロ・テクニック

著者が実践してきた生産性向上法の紹介。

その日にする仕事の予定を立てて、25分で鳴るタイマーをセットしてから、最初のタスクに取り掛かる。一度に一つのタスクだけを処理し、25分間はそれだけに集中する。・・・25分立ったら5分で鳴るようにタイマーをセットして休憩を取る。これを1ポモドーロとする。4ポモドーロごとにそれよりも長い休憩(通常は15分)を取る。(p.210)

ポモドーロ・テクニックの本当の力は作業量を見積もり、トラッキングするためのツールとして使った時に現れる。1日に実行したポモドーロの数を数え、1日にどれくらい一生懸命仕事をしたか、自分のほんとうの能力はどれだけかを精確に測れるようになる。(p.212)

集中法としての要素もあるけど、タスクの見積もりの精度を向上させるテクニックでもあるよ。

第39章 以前よりも安定して多くの仕事が出来るワケ

著者が実践している「クォータシステム」という生産性向上策の紹介。

あなたが繰り返し行なっているタスクを取り出して、特定の期間内にそのタスクを何回こなすつもりかをクォータとして設定する。期間は、毎月、毎週、毎日のいずれかでもかまわないが、明確に決めて奥。大きなプロジェクトに取り組むときには、それを小さな頒布できるタスクに分割する方法が必要になる。(p.219)

タスクの実行周期を決めるということ。

クォータシステムのルール
・反復可能なタスクを選ぶ。
・タスクを実行しなければならない期間を決める。
・その期間にタスクを何回実行しなければならないかを決める
・コミットする。クォータを必ず達成するように厳格にコミットする。
・調整する。クォータが高すぎたり低すぎたりする場合、期間中にはクォータをいじらない。

これを読んで僕も、「1週間にブログを1記事以上書く」、「1週間に1つCodeIQまたはPaizaの問題を解く」というクォータを設定した。 でも、最近はコミットできない週もあってかなり弛んでたなぁ・・。

第43章 時間を浪費するメカニズム

はっきり言おう。テレビを見るのを止めよう。(p.237)

小飼弾も言ってたなぁ。

弾言 成功する人生とバランスシートの使い方

第5部 お金に強くなろう

第50章 給与交渉の方法

会社があなたのことを知っていて、面接さえせずに直接ポストを提示してくるのが最良の形であることは言うまでもないだろう。その場合、給与交渉はほとんどあなたの言い値だ。(p.282)

第二部の話につながってくる。マーケティングは大切だ。交渉テーブルに付く前に大方の勝負がついている。

数字を先に言ったほうが負け

特に重要なのは、先に数字を言った方が確実に不利になることだ。どのような交渉でも、自分の条件は後から言うようにしたい。(p.282)

例として、予算が8万ドル〜10万ドルのポストに応募した際に、自分から数字を行ったせいで年俸を2万5千ドルも割引いて雇用されてしまった男の話が載っていた。

その他

後半は不動産投資と筋トレの話。。

 

nokogoriの使い方メモ(XPathを使った場合)

Nokogiriのサンプルをメモ。

Youtubeで「Ruby on Rails」と検索して、結果の動画のタイトルの一覧を表示する。

require 'open-uri'
require 'nokogiri'

# Youtubeで「ruby on rails」で検索した結果の動画のタイトルの一覧を取得する。

# youtubeでruby on railsを検索
doc = Nokogiri::HTML(open('https://www.youtube.com/results?q=ruby+on+rails&sp=CAI%253D'))

# 動画のノードの一覧を取得
# ドキュメント全体を検索する場合は「//をつける」
nodes = doc.xpath("//div[@class='yt-lockup-dismissable yt-uix-tile']")

nodes.each do |node|
  # このノード以下のすべての子要素に対して検索を行う場合は「.//」をつける
  title_node = node.xpath(".//h3[@class='yt-lockup-title ']")
  # 子要素のみを検索対象とする場合は何もつけない
  title = title_node.xpath("a")
  puts title.text
end

Rubyで正規表現

Ruby正規表現を扱う方法をまとめておく。

doc = "<html>Lorem ipsum dolor sit amet</html>"

# Loremという文字が出現する位置を調べる
puts doc =~ /Lorem/
# => 6
# 逆でもいい
puts /Lorem/ =~ doc
# => 6

# 正規表現に一致する文字列を取得する
if md = doc.match(/<html>(.+)<\/html>/)
    # これも逆でもいい。→ /.../.match(doc)
    puts md[0]
    # => "<html>Lorem ipsum dolor sit amet</html>"
    #  全体と一致する文字列が入る
    puts md[1]
    # => "Lorem ipsum dolor sit amet"
    #  ()内の文字列が入る
end

# 取得したい文字列が複数ある場合は scan を使う
doc2 = "<html>Lorem ipsum dolor sit amet</html><html>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua</html>"
# 2つあるhtmlタグ内の文字列を取得したい
sd = doc.scan(/<html>([^<]+)<\/html>/)
# => [["Lorem ipsum dolor sit amet"], ["sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"]]

gsubの使い方メモ(Ruby)

gsubを使って、 htmlタグを大文字に変換する方法。

class TagUpper
  def initialize(html)
    @HTML = html.freeze
  end

  def convert()
    @HTML.gsub(/<[a-z|\/]+[>|\s]/){|tag| tag.upcase}
  end
end

tu = TagUpper.new("<html><body><a href='https://www.google.co.jp/?gfe_rd=cr&ei=OcXnV4_WF_T98wf345nADw'></body></html>")
puts tu.convert()

Null参照エラーを撲滅するために

クイックソートの発明者として知られるアントニー・ホーアは同時に、 プログラマにとっては馴染み深い Null の生みの親でもあるが、 氏は次のような後悔を口にしておられる。

これ(Null)は、後に数え切れない過ち、脆弱性、システムクラッシュを引き起こし、 過去40年間で10億ドル相当の苦痛と損害を引き起こしたとみられる。

そうなのである。 多分、Null参照が原因のバグは全体の1割はある気がする(適当)。

そんなわけで、この忌まわしきNull参照を撲滅するための対策を考えみた。

その1 Nullを返さない

メソッドの戻り値としてNullを返さないようにする。 配列を返して、受け手側でループで処理しよう。 また、どうしても配列の先頭要素を取得してそれを返したい場合は、 Nullの時は空のインスタンスを返そう。 (NullObjectパタンを使ってもいいが全部のオブジェクトに対してこれを定義するのはしんどいので、重要なものだけにするのがよいと思う)

その2 Nullを代入しない

値の初期値にNullを代入しない。 stringの場合は空文字列、数値の場合は0、オブジェクトの場合は空のインスタンス(もしくはNullObject)を設定する。 「= nil」は絶対に認めない!

その3 Swiftを使う

人類は学んだ。Nullを代入できなければ、Null参照など発生しないことを。 Swiftはデフォルトの型でNullの代入ができない。 なので、以下のようなコードはエラーになりコンパイルできない。

var normalStr : String = null
=> エラー

Nullを代入するにはオプショナル型を使わなければならない。

var normalStr : String? = null

ビルド時にオプショナル型の使用を検知するような仕組みを作っておけば、 Null参照が起こる可能性を0にできる。

クロスサイトスクリプティングって何だ?

Wikipediaによると

クロスサイトスクリプティング(英: cross site scripting)とは、 ウェブページの部分をユーザからの入力をそのままエコーバック (オウム返し)することによって生成しているアプリケーションの セキュリティ上の不備を利用して、サイト間を横断して悪意のある スクリプトを注入する攻撃のことをいう。また経緯上、 それを許してしまう脆弱性についても、このように呼ばれている。

とのことらしい。 全然わからんかったので、自分でHTMLを書いてみたらようやく理解できた。

超簡単なXSSのサンプル

入力内容をそのままページに表示するプログラムを書いてみる。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
</head>
<body>
  <p></p>
  <h4><a href="http://google.com">Google</a></h4>
  <ul>
    <li>今日はいい天気</li>
  </ul>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <input type="text" name="name" id="inputed_text" value="">
  <input type="button" name="name" id="btnRegist" value="投稿">
  <script type="text/javascript">
    $(function() {
      $('#btnRegist').on('click', function() {
        var inputed_text = $('#inputed_text').val();
        $('ul').append('<li>'+ inputed_text +'</li>');
      });
    });
  </script>
</body>
</html>

f:id:Turing:20160828213528p:plain

投稿ボタンを押すと入力内容がそのままページに表示される。これはサンプルとしてHTMLだけで書いたが、実際には入力内容はサーバーに保存され、このWebサービスを使う全ユーザが同じ内容を共有できるようになっていると仮定する。

この入力欄に下記のような一文を挿れて投稿してみる。

</li>
<script type="text/javascript">
  $('a').attr('href','http://yahoo.co.jp');
</script>
<li>

するとHtmlはこのようになる。

<html lang="ja"><head>
  <meta charset="utf-8">
</head>
<body>
  <p></p>
  <h4><a href="http://yahoo.co.jp">Google</a></h4>
  <ul>
    <li>今日はいい天気</li>
  <li></li> <script type="text/javascript">   $('a').attr('href','http://yahoo.co.jp'); </script> <li></li></ul>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <input type="text" name="name" id="inputed_text" value="">
  <input type="button" name="name" id="btnRegist" value="投稿">
  <script type="text/javascript">
    $(function() {
      $('#btnRegist').on('click', function() {
        var inputed_text = $('#inputed_text').val();
        $('ul').append('<li>'+ inputed_text +'</li>');
      });
    });
  </script>
</body></html>

ul要素(リスト)の中にscriptが埋め込まれ、Googleのリンク先が Yahoo!JAPANに変わっている。

今回のサンプルはリンク先を変えただけだが、input要素のPostの送信先を改ざんしてクレジットカード番号を抜き取るというようなことが行われているらしい。

対策は?

入力内容に含まれる危ない文字(<とか>とか&やら)をエスケープするのが基本的な対策法。

RubyOnRailsはRails2までは、明示的なエスケープ処理を書く必要があったけどRails3からはエスケープがデフォルトになったんだそう。