読者です 読者をやめる 読者になる 読者になる

気が散るTシャツ。

数学やアルゴリズムの復習帳。その他なんでも書きます。

若手エンジニアの3大要件

毎度お久しぶりです。
12月に新卒で入社した会社を辞めて転職しました。 もうすぐ社会人も3年目も終わりますが、3年間でやっとあるべきエンジニア像みたいなものが自分なりにまとまってきた気がするのでちょっとだけ書いておこうと思います。

1. 基礎の理解

使用する言語やフレームワーク、ライブラリ、ツール等々、どれだけリッチでシームレスになっても基礎はやはり欠かせないと思います。
Webエンジニアであれば下記かなーと。

  • プロトコルの理解(主にHTTP)
  • データ型への理解
  • RESTfulの概念の理解
  • プログラム基礎の理解(メモリとかそのへん)

以前、「Javaのint型は何ビットか」というのが同じ部署のエンジニアでちょっと話題になり、意外に答えられなかった人が多かったのが印象的でした。 こういう基礎知識って、学校で言えば「テストには出ない」ものなんですが、長期的にすごく重要になってくると思います。例えば同じ整数型8ビットでもsignedとunsignedで表現できる範囲が異なるのはなんでか知ってると知らないではものの見え方が全く違うと思うんです。
2進数表現と符号ビットを知ってるか知らないかなんて、多分普段プログラムを書く上で意識している人はいないでしょう。が、何かを判断するときに知ってる/知らないで導き出す結論に大きな差が出ることは多分あります。 そんな小さいことが日々積み重なっていく。だから基礎は大事。流行りの言語やフレームワークはエンジニアとしては興味深いけど、エンジニアリング力の観点からすると二の次だと個人的には思います。

2.英語力

さっきの話と矛盾するようですが、やはり新しいものを選択できることはその会社の強みであり、エンジニア自身の強みであると思います。 新しい情報に触れるには英語を避けることができません。最近はGoogle翻訳の精度が凄く上がっているみたいなので、もしかしたら避けられるかもですが。

  • ドキュメントを読める
  • GitHubのIssueや特定のコミュニティで質問・回答できる

このくらいはできたほうが良いなとよく感じます。得られる情報の量と精度が格段に違います。

3.記録して整理する癖

コード書いてつまったときのよくある解決の流れは【ググる→真似する→よし動いた!】だと思います。
ここで終わらないようにするのは非常に重要。記録しておきましょう。できれば掘り下げて調べると良いです。 自分なりの良い実装ができたらコードスニペットとして保管しておきましょう。kobitoとかに。 できればきちんと整理してチームにシェアしましょう。

ここで出てきた「掘り下げる」とか「整理する」というのは要するに「体系的に理解する」ことだと思っています。
一問一答で公式のように覚えるのも良いですが、そこから体系化できると周りの人も喜びます。評価もされます。

まとめ

簡単にいえば、情報を集めて掘り下げて理解し、発信する力になるんでしょうか。 これができれば応用はいくらでも効くはずです。 まだまだ自分としてもできてなことは多いでので精進してきたいと思ってます。 後半飽きてきた感じが隠しきれずごめんなさい。

フィリピン留学必勝法(1)~準備物編~

11月に2週間セブ島で短期留学をしてきました。 これから語学留学する人のために、そこで得たTIPSを書いていこうと思います。

今回は、「準備物編」です。 滞在時に役立つ3種の神器を紹介していきます。

1. ハンディウォシュレット

「いきなりトイレ事情の話かよ!」というツッコミがあると思いますが、 マズローの欲求5段階説でも言及されているように、 一番根底にある生理的欲求が満たされること無くしては、より高次元の欲求は満たせません。

あなたは「自己実現欲求」に従って語学留学という選択をしたのではないでしょうか。 であれば、まずは地盤から固めましょう。

フィリピンは水道管が細くトイレットペーパーを流すことができません(備え付けのゴミ箱に入れます)。

また、衛生環境も良いとは言えないので、下痢をすることもあるかもしれません。 トイレまわりでは、主に2つの問題が生じます。

臭い問題

使用したトイレットペーパーは備え付けのゴミ箱に入れますが、回収されるまではそのままです。 臭ってくることもあるでしょう。

お尻痛くなる問題

もちろんウォシュレットはありませんので、ペーパーを使うことになります。 ウォシュレット慣れしている日本人にとっては、毎回ペーパーだけで処理することは非常にハードです。 下痢などした日には目も当てられません。 神経質な人ほど切れ痔になるでしょう。 授業中は座っているので集中できなくなったら元も子もありません。

これらの問題を最小化してくれるのがハンディウォシュレットです。 ペーパーの使用量も減るため、節約にもなります。

私はこれを買いました。 電動式の高いやつもありますが、コスパが悪いと思います。 なお、帰国時に廃棄しました。笑

衛生的にも、渡航ごとに買うのがよいでしょう。

「水を入れて持ち歩くな」ということになっていますが、 外出時の緊急事態に備え、水を入れた状態でジップロックに入れて持ちあるていました。 幸い、緊急事態は訪れませんでした。

2. ノートパソコン

PCがあると何かと便利です。 特に社会人の方は他者とのやり取りや作業があるかもしれません。

学習にも役立ちます。 私はreminDoというアプリを使ってその日習ったフレーズや単語を覚えていました。 使い方はユーザ次第ですが、フラッシュカードのように単語と例文をセットで記憶することができます。 スマホでも使えますが、例文を検索して入力するといった作業は明らかにPCのほうが効率的です。 Remindoについては後日続編で詳しく紹介します。

remindo.co

3. SIMフリースマホ+現地SIM

学校にWi-Fiがありますが、現地SIMは重要だと思います。 また、デバイスは、調べ物をしたりお出かけするとにマップを見ることなどを考えると、ガラケーでなくスマホのほうが良いです。

SIMフリースマホ

私は、日本でも使用しているiPhone6SをSIMフリーにしていました。 やり方はかんたん。キャリアのショップに行って手数料を払えばそれで完了です。

SIMの購入

現地の空港に到着すると、しょぼいブースですがSIMを売っていて、お願いすれば差し替えと設定もしてくれます。事前にスマホの言語設定を英語にしておきましょう。 私はフィリピンの大手キャリアであるGlobeのSIMを購入しました。

下記の記事を参考にさせていただきました。

gigazine.net

  • 15日間使い放題で700ペソ(約1,600円)
  • SMS可能
  • ほとんどの場所でLTE使用可能
  • 一日のうち、一定量を使うと3G回線に切り替わる

LTEはさほど速くなかったと思いますが、不自由することはありませんでした。 3Gに切り替わっていまうとブラウジングを諦める程度にスピード落ちます。 ホテルでYoutubeとか見てやっと制限に達するくらいなので、 使い物になるWi-Fiがある環境だと制限に達することはないと思います。 私が滞在したホテルはWi-Fiの回線がおそすぎて使い物になりませんでした。笑

準備物編は以上です。

この3つがあればほとんど特に困ることはないかと思います。

Dockerことはじめ

業務外のプロジェクトでDockerを使うことになったので調べたことをかんたんにメモ。

概要

  • Virtual Boxのようなアプリケーションレベルでの仮想マシンではない
  • ホストマシンのOSを利用して、プロセス上で「コンテナ」が実行される
  • ユーザから見ると、複数のOSが立ち上がっているように見える
  • 1つのOS(Kernel)を複数環境に分離する技術
  • Docker Server/Client, イメージ、コンテナ、レジストリからなる
  • イメージは変更履歴のようなもの(最終的な状態ではない)

利点

  • リソース消費が少ない
  • 高速に立ち上げられる
  • ホストのカーネルを直接使うため、オーバーヘッドが少ない

Yii2.0をインストールする(Mac+homebrew+composer)

日本ではマイナーなPHPフレームワークYii2.0をインストールしてみました。 homebrewとcomposerがインストールされている前提です。 ちょっとつまったのでメモ。

Yiiの特徴

実際に使ってみたり、他と比べてみないとなんとも言えないところはありますが、 こんな感じらしいです。

  • PHP5.4以上
  • Ruby on Railsに似てる
  • DB、キャッシュのサポートが幅広い
  • IDEでの開発に最適化されている
  • REST専用のコントローラがある
  • ドキュメントは豊富だが、日本語の情報が少ない
  • 大規模・高負荷のアプリケーション向け
  • RAD標準で開発がしやすい

詳しくは下記を参照してください。

qiita.com

nal-hr.co.jp

Composerのアップデート

全体的な手順は下記に書いてあります。 github.com

次のコマンドを打つだけです。

composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic

ここで、1つめのコマンドをを実行したときに下記のようなエラーが出ることがあります。

PHP Fatal error:  Call to undefined method Composer\Package\Loader\ArrayLoader::parseLinks() in/Users/yoshitsugu/.composer/vendor/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php on line 279

これは、composerのバージョンが古いため発生します。 私の環境は、1.0.0-alpha10でした。 これを、1.0.0-alpha11にアップデートしてやります。

composer self-update 1.0.0-alpha11

ちなみに、homebrewでアップデートしようとしたらダメでした。

brew upgrade composer

Yii2.0のインストール

これで準備が整ったので、公式にある手順に従えば入ります。

composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic

Getting Startedを読みながら導入します。

Running Applications - Getting Started - The Definitive Guide to Yii 2.0

記憶の闇に葬り去られようとしているlogのことを思い出してみる(2/2)

logのことを思い出してみた前回のエントリの続きになります。
記憶の闇に葬り去られようとしているlogのことを思い出してみる(1/2) - 気が散るTシャツ。

指数・対数における定義や性質を思い出してみる

指数における定義

指数には0乗を1とする定義があります。 {
a ^ 0 = 1 \tag{1}
}

対数の性質

対数では、真数が1のとき0になるという性質があります。 {
\log_a{1} = 0 \tag{2}
}

対数の意味を思い出してみましょう。「底が真数となるために底を累乗する数」でしたね。
ここでは、aが1になるために{a ^ {ここに入る数} }となります。
aが1になるためにaを何乗すれば良いかを考えた時、指数において(1)の定義が存在するので必然的に(2)が導かれます。

グラフで確認してみる

次の2つの関数をグラフに表すとどうなるか見てみましょう。

  • {y = x ^ 2} (緑の線)
  • {y = \log_2{x}} (紫の線)

f:id:gyarasu:20160503145739p:plain

指数関数(緑の線)とy軸の交点で(1)の定義が、対数関数(紫の線)とx軸の交点で(2)の性質が確認できます。

真数 > 0

対数における真数が0より大きいという性質があります。

{log_a{b} (b > 0) \tag{3}}

真数は底を累乗して得られる数です。 先ほどのグラフを見れば一目瞭然ですが、指数関数はどんなにxを小さくしても(マイナスでも)常に0より大きくなります。

{y = a ^ x > 0} \tag{4}

真数の掛け算・割り算の分解

対数においては、真数の掛け算や割り算を対数の和や差の表現に直すことができます。

{\log_a{(m \times n)} = log_a{m} + log_a{n} \tag{5}} {\log_a{(m \div n)} = log_a{m} - log_a{n} \tag{6}}

これらは、指数法則を使って証明することができます。
詳しくはググってみてください! {a ^ {m + n} = a ^ m \times a ^ n} \tag{7} {a ^ {m - n} = a ^ m \div a ^ n} \tag{8}

ちなみに、前回のエントリで出てきた{\log_3{3 ^ x}}は、{x}個の{\log_3{3}}の和に分解できます。

{\log_3{3 ^ x} =  \log_3{3 \times 3 \times 3 \times \dots \times 3} = \log_3{3} \times \log_3{3} \times \dots \times log_3{3} = x \times log_3{3} } \tag{9}

底の変換公式の証明

対数の計算がやりやすくなる、底の変換公式というものがあります。

{\log_a{b} = \frac{\log_c{b}} {\log_c{a}} } \tag{10}

これを証明してみましょう。

{a ^ {\log_a{b}} = b } \tag{11}

この当たり前の式からスタートします。
まずは両辺について{log_c}をとります。

{\log_c{a ^ {\log_a{b}}} = \log_c{b} } \tag{12}

真数の指数は係数として前に出せます。

{\log_a{b} \times \log_c{a} = \log_c{b} } \tag{13}

あとは変形しておしまいです。

{\log_a{b} = \frac{\log_c{b}}{\log_c{a}}} \tag{14}

逆関数

前回のエントリで、「指数と対数は同じようなことを別の方法で表現しているに過ぎない」と書きましたが、この2つは逆関数の関係にあります。
逆関数とは、ある関数を独立変数について解いたものになります。
例えば{y = 2x}の独立変数は{x}、従属変数は{y}になり、逆関数{y = \frac{x}{2}}となります。

指数と対数について確認してみましょう。
この指数関数を{x}について解いて逆関数を求めてみます。

{y = 2 ^ x} \tag{15}

まずは両辺のlogを取ります。底は2とします。

{\log_2{y} = \log_2{2 ^ x}} \tag{16}

右辺を展開します。

{\log_2{2 ^ x} = x} \tag{17}

従って(16)は次のようになります。

{x = \log_2{y} \tag{18}}

ここで、形式的に{x}{y}の文字を入れ替えます。
本質的に意味はありませんが、慣例的に{x}が独立変数、{y}が従属変数に使われる事が多いので、表現を合わせます。

{y = \log_2{x} \tag{19}}

これで(15)の逆関数が求まりました。
最初の方に出したグラフを見ると、{y = x} でそれぞれ対称になっているのがわかります。

f:id:gyarasu:20160503163742p:plain

指数関数の性質をもつ現象を対数に変換して扱いやすくすることもあります。 これでひとまずlogのことを思い出せたので、指数・対数の復習はおしまい。

記憶の闇に葬り去られようとしているlogのことを思い出してみる(1/2)

はじめに

はじめまして。ヨシツグと申します。
普段は某WEB企業でエンジニアとして働いています。

社会人になり、エンジニアとして働いているのにもかかわらず学生時代にやった数学のことをすっかり忘れてしまっている人も少なく無いはず。
現に僕はそうなので、ざっと勉強し直すことにしました。
同じ境遇にあるエンジニアや文系出身の新卒エンジニアでの方向けに「要するにこういうことだよね」というレベルで理解できるように記事を書きたいと思います。
数学的に厳密ではないかもしれないので、詳しい方にコメントいただけると嬉しいです!

今回は指数(exponential)と対数(logarithm)を思い出してみましょう。

指数を思い出しみる

指数は「指数関数的に増加する」みたいな言い回しが普段からよく使われますし比較的馴染みがあるのではないでしょうか。

例えば、2の3乗は下記のように表現されます。
これは「2を3回掛け合わせる」ことを意味します。

{
2 ^ 3
}

対数を思い出してみる

学校では指数→対数の順序で習うと思いますが、僕の場合は対数がすんなり理解できず、出てきて以降はなんとなく数式を暗記して問題を解けるようにしていたのを覚えています。
幸か不幸か、学校のテストではある程度暗記しておきさえすればある程度は点が取れてしまうので、さほど悪い点数もとりませんでした。
「logって結局何ぞ?」のまま進んだ人も少なくないのでは...?

改めて「意味」を覚えなおしてみます。
次の対数は何を意味するか、パッと言えますか?

{
\log_2 16
}

なんとなく数式を暗記して生き延びてきた人はなかなかパッとは答えられなかったのではないでしょうか。
対数は、「底を何乗すれば真数になるか」を表しています。
この例だと、「2を何乗すれば16になるか」です。
答えは4になりますね。

指数と対数の関係

対数を理解するには指数との関係を理解する必要があります。
指数と対数は、下記のような関係性があります。
同じ文字が登場していることから、同じようなことを違った方法で表現しているに過ぎないことがわかります。

{
a ^ x = M ↔ \log_a M = x \tag{0}
}

指数と対数の関係を確認してみる

次の例で「3を何乗すれば243になるか」を対数を使って求めてみましょう。

{
3 ^ x = 243 \tag{1}
}

まずは、両辺の対数を取ります。対数の底は指数の底と合わせます。

{
\log_3 3 ^ x = \log_3 243 \tag{2}
}

左辺は次のように展開できます。(なぜこのように展開できるかは次回の記事で数学的な定義を振り返るときに説明します。)

{
\log_3 3 ^ x = x\log_3 3 = x \tag{3}
}

(3)で展開した結果を(2)に適用します。
まさに「3を何乗(x乗)すれば243になるか」を表していますね。

{
x = \log_3 243 \tag{4}
}

ここで浮上するであろう「で、{ x = log_3 243 }って結局何なの?」という疑問を解消するために243を素因数分解します。
素因数分解は合成数(A×Bで表される数)を素数の積の表現に分解する操作です。

{
243 = 3 \times 81 = 3 \times 3 \times 27 = \ldots = 3 \times 3 \times 3 \times 3 \times 3 = 3 ^ 5 \tag{5}
}

35を右辺に適用し、展開していくと答えが求まります。

{
x = \log_3 3 ^ 5 = 5 \log_3 3 = 5 \tag{6}
}

「3を何乗すれば243になるか」の解答は5になります。
logを計算して答えを求めることはさほど重要ではありません。
本質的には(4)までで十分です。

まとめ

logって何ぞ?

一言で言うと、「底を真数にするために、底を累乗する数」となります。

わかりにくいぞ、ということであれば、これで覚えましょう。

  1. まずは{ \log_a b }を思い浮かべます
  2. そして、「aがbになるための { a ^ {ここに入る数} }」と唱えます。

次回予告

今回で指数や対数のイメージがつかめたと思うので、次回はもう少し数学的に踏み込んでみます。

あたりを取り上げる予定です。