無意義なつぶやき

渋谷ではたらくエンジニアブログ。

新卒でエンジニアとしてベンチャーに入社するにあたり2年前考えていたこと、そして今考えていること。

ちょうどいいタイミングなので振り返ります。

1個前の投稿をするまで1年半以上記事を投稿していなかったということに驚きですが、
逆にこの1年半の空白期間はかなり色々あったなーと思ったので転職からしばらくたっていますが、
新卒でベンチャー企業に入ることについて自分なりに振り返ってみたいと思います。

ちなみに1社目、2社目についてはだいたい下記の通り。

1社目:人材系ベンチャーで100人以下の規模
2社目:多角的に事業を行っており1000人規模

入社当時

なぜ入ったかは以下の記事に書いてあります、ここでは一部引用します。
sd08013.hatenablog.com
sd08013.hatenablog.com

ベンチャー企業のエンジニアという職種は特に相手から求められているものと自分ができることが一致していたし、なりたい自分ほどの優先順位ではないが自由にやりたいという自分の理想も実現しやすい環境だと思う。

ベンチャーにおける転職はキャリアアップなど前向きなものよりも採用におけるミスマッチのような後ろ向きなものが原因となることが多いように思う。
.
.
.
エンジニアと営業に職種を分けた場合ベンチャーのビジネスモデルにおいてそのどちらかにパワーバランスが偏りやすく、成長のために入社したにも関わらず自分が選んだ職種が社内で余り重要な役割を担っていなかったといったことが起こりやすいということだ。

いっちょ前に語ってます笑

今思うこと

では結果論的にこの当時を振り返ってみます。

当時はエンジニアとしてキャリアスタートする上で未経験の自分ならどこで働けるかという視点をかなり重視していました。
そういう意味で1つ目の引用のようなことを言っていたんだと思います、
またこの考え自体は今も間違っていなかったなと思います。
そして2つ目について、
入社前にも関わらず2つ目の引用のようなことに言及していたのは、
私が内定をもらった当時社員の方が多く退職をしていたタイミングであったからなのですが、まぁこの辺もそれなりに分析できているなという印象です。

つまり当時の私は未経験エンジニアとしてキャリアをスタートするために、
技術的・キャリア的にそれなりのリスクがあることは理解した上で1社目を選んだということになります。

そしてここからが結果論として私が感じている点になります。

・それなりの学歴や背景があれば未経験でも選択肢は多い
・エンジニアとしての技術力の伸びは自分が考えている以上に環境に依る
・環境はビジネスモデルとプロダクト規模により決定される


1社目が人材系だったこともあり感じることですが、
それなりの大学を修了してさえいればたとえ未経験であっても選択肢はかなり多いです。
また特にベンチャー企業を選択肢に入れていると、成長は自分次第とかそもそも環境は整っていなくて当たり前のような価値観を持ちやすいですが、
ことエンジニアに限った話をさせてもらいますと、
触れるプロダクトや周りの人間が成長に与える影響は自分ひとりで覆そうとしても覆らないほど大きいものだと思います。
そしてその環境はビジネスモデルにより決定されます、
この点は過去の私が言及しているとおりです。
概ね想定通りではありましたが誤算があったとすればその影響力が自分の想定よりはるかに大きかったということになると思います。

ということで過去の自分にアドバイスできるならアドバイスしたいことでもあり、もし学生の方がこの記事を読むことがあればこのことを伝えたいと思います。

エンジニアとして技術力を磨こうと思えばやはり環境は重要です、また環境はビジネスモデルとプロダクト規模で決まります。
自分の可能性を過小評価せず背伸びして幅広い選択肢を持ってください、
もし駄目だったら受かったとこに行けばいいだけです。


入社後、退職後についてはまた後日。

1年ぶりの投稿

新卒で入社した会社をおよそ2年で退職し、別の会社で勤務を行っています。

1社目は人材系の50名規模のベンチャーでエンジニア、デザイナーあわせて10名程度の小規模でしたが、
転職先は1000名規模でほとんどがエンジニア畑の人間となります。

あえてキャリアとして逆に振った感はあって違いは大いに感じているのですが、
そのあたりはまた別の機会に書き込もうかと思います。

また年齢的にも将来を真剣に考える必要が出てきたこともあり、
個人でも色々仕込み始めています。

今年も半分過ぎましたが、これから少し更新ペースを上げていこうと思います。

CakePHP3の開発環境をChefで構築する

CakePHP3がリリースされてからだいぶ経ちましたが、
ついに私もCakePHP3を触り始めたので、
開発環境を構築してみました。
Vagrant+Chefで構築してみたのでご参考ください。

CakePHP2との大きな違いはやはり、Composerを利用するようになったということでしょうか。

公式によると必要な環境は下記の通り。
http://book.cakephp.org/3.0/ja/installation.html

・HTTPサーバー。例: Apachemod_rewriteが推奨されますが、必須ではありません。
PHP 5.4.16以上。
PHP mbstring 拡張
PHP intl 拡張

PHP5.4.16以上という点も注意が必要で、
yumの標準が5.3となっているので何も考えずに、
yum install php とかやると動かなくてしばらく悩むことになります。

・Chefを使わずvagrantで直接入れる場合

1.remiレポジトリの使用

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum install php --enablerepo=remi
sudo yum install php-mbstring --enablerepo=remi
sudo yum install php-mcrypt --enablerepo=remi
sudo yum install php-pdo --enablerepo=remi
sudo yum install php-intl --enablerepo=remi

2.composerでcake3ディレクトリの作成

sudo curl -s https://getcomposer.org/installer | sudo php
php composer.phar create-project --prefer-dist -s dev cakephp/app

3.apacheのdocumentrootを変更
インストールしたcake3ディレクトリのwebrootを指定する。

・Chefレシピの記述

chefディレクトリの構成はsite-cookbooks以下にapache,bash,remi,phpというcookbookを作成しています。

 --site-cookbooks/
    --bash/
       --recipe/
          --default.rb
    --apache
       --recipe/
          --default.rb
       --template/
          --httpd.conf.erb
    --php
       --recipe/
          --default.rb
    --remi
       --recipe/
          --default.rb
1.Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.synced_folder "app", "/home/vagrant/app", owner: "root", group: "root"
end
2.chef recipe

apacheのインストール
site-cookbooks/apache/recipe/default.rb

package "httpd" do
    action :install
end

service "httpd" do
    action [:enable, :start]
end

template "httpd.conf" do
    path "/etc/httpd/conf/httpd.conf"
    owner "root"
    group "root"
    mode 0644
    notifies :reload, 'service[httpd]'
end

site-cookbooks/apache/template/httpd.conf.erb

 DocumentRoot "/home/vagrant/app/webroot"

site-cookbooks/bash/recipe/default.rb

bash "chmod_vagrant" do
    code "chmod -R 755 home/vagrant"
end

bash "chmod_tmp" do
    code "chmod -R 777 home/vagrant/app/tmp"
end

bash "chmod_cache" do
    code "chmod -R 777 home/vagrant/app/tmp/cache"
end

remiレポジトリの追加
site-cookbooks/remi/recipe/default.rb

bash 'add_epel' do
  user 'root'
  code <<-EOC
    rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/epel.repo
  EOC
  creates "/etc/yum.repos.d/epel.repo"
end

bash 'add_rpmforge' do
  user 'root'
  code <<-EOC
    rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/rpmforge.repo
  EOC
  creates "/etc/yum.repos.d/rpmforge.repo"
end

bash 'add_remi' do
  user 'root'
  code <<-EOC
    rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/remi.repo
  EOC
  creates "/etc/yum.repos.d/remi.repo"
end

phpと必要なextensionのインストール
site-cookbooks/php/recipe/default.rb

%w{php php-mcrypt php-mbstring php-intl php-pdo php-mysql}.each do |pkg|
    package pkg do
        action :install
        options "--enablerepo=remi"
    end
end
3.[node名].jsonにcookbookを追加する
{
  "run_list": [
      "recipe[remi]",
      "recipe[apache]",
      "recipe[php]",
      "recipe[bash]"

  ],
  "automatic": {
    "ipaddress": [ここはnode名]
  }
}

あとはknife solo cook [node名]でOKなはずです。
それではよいcake3ライフを!

線形回帰分析と相関係数

1個まえscikit-learnで線形回帰分析 - 無意義なつぶやき
の記事で書いた線形回帰分析について少し詳し目に書きます。


従属変数yと独立変数xが与えられたとき
{ \displaystyle

Y=θX+ε

}

これが線形回帰分析のモデルです。

{ \displaystyle

 Δ=\sum|y_i-θx_i|

}

Δ^2を最小にするようにθを設定します。

簡単のため

{ \displaystyle

y=ax+b

}

で考えることにします。
{ \displaystyle

 Δ^2=\sum|y_i-ax_i-b|^2

=\sum(yi^2-2ax_iy_i-2by_i+a^2x_i^2+2abx_i+b^2)

}
となるので
{ \displaystyle
{A} = \left(
    \begin{array}{c}
      a \\
      b \\
    \end{array}
  \right)
}
でこれを微分
{ \displaystyle
{∂Δ^2/∂θ} = \left(
    \begin{array}{c}
      ∂Δ^2/∂a\\
      ∂Δ^2/∂b \\
    \end{array}
  \right)
=-2(X^tY-X^tXθ)=0
}

{ \displaystyle
{θ} = (X^tX)^{-1}X^tY
}

ここで{ \displaystyle
(X^tX)^{-1}
}は相関行列になります。

ここで各要素の相関が非常に高い場合はどうなるのでしょうか?

irisを例に考えてみます。
slswはsepal lengthとsepal widthを切り出したものです。
これとsepal lengthの相関を考えてみると当然ですが、
以下のようになります。

In [60]: dcoef=np.corrcoef(slsw.T, sl.T)

In [61]: dcoef
Out[61]: 
array([[ 1.        , -0.10936925,  1.        ],
       [-0.10936925,  1.        , -0.10936925],
       [ 1.        , -0.10936925,  1.        ]])

In [62]: np.linalg.eig(dcoef)
Out[62]: 
(array([  2.02337679e+00,   3.33066907e-16,   9.76623209e-01]),
 array([[ -6.99166411e-01,   7.07106781e-01,   1.05670856e-01],
        [  1.49441157e-01,  -1.34995136e-16,   9.88770621e-01],
        [ -6.99166411e-01,  -7.07106781e-01,   1.05670856e-01]]))

In [63]: np.linalg.det(dcoef)
Out[63]: 0.0

determinantが0となるため、{ \displaystyle
(X^tX)^{-1}
}が存在しないことになります。
これは極端な例ですが、相関行列の変数が相関が高いペアが含まれていると
モデル精度が不安定になるようです。

これを解消するために考案されたのがリッジ回帰です。

続きはまた今度

scikit-learnで線形回帰分析

大炎上しながらも大学院を修了し、
4月から社会人をしています。
まだ研修中ですが、本配属後はwebアプリケーションエンジニアです。

またそれとは別に最近趣味でデータ分析をしています。
絶賛勉強中なので今日は線形回帰分析について少し書き残します。

線形回帰分析
scikit-learnのドキュメントで言うOrdinary Least Squaresです。
分析には有名なirisのデータを使いました。


sepal length sepal width petal length petal width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa
10 5.4 3.7 1.5 0.2 Iris-setosa
11 4.8 3.4 1.6 0.2 Iris-setosa
12 4.8 3.0 1.4 0.1 Iris-setosa
13 4.3 3.0 1.1 0.1 Iris-setosa
14 5.8 4.0 1.2 0.2 Iris-setosa
15 5.7 4.4 1.5 0.4 Iris-setosa
16 5.4 3.9 1.3 0.4 Iris-setosa
17 5.1 3.5 1.4 0.3 Iris-setosa
18 5.7 3.8 1.7 0.3 Iris-setosa
19 5.1 3.8 1.5 0.3 Iris-setosa
20 5.4 3.4 1.7 0.2 Iris-setosa
21 5.1 3.7 1.5 0.4 Iris-setosa
22 4.6 3.6 1.0 0.2 Iris-setosa
23 5.1 3.3 1.7 0.5 Iris-setosa
24 4.8 3.4 1.9 0.2 Iris-setosa
25 5.0 3.0 1.6 0.2 Iris-setosa
26 5.0 3.4 1.6 0.4 Iris-setosa
27 5.2 3.5 1.5 0.2 Iris-setosa
28 5.2 3.4 1.4 0.2 Iris-setosa
29 4.7 3.2 1.6 0.2 Iris-setosa

import pandas
import numpy
from sklearn import datasets
from sklearn import linear_model

isis.data

iris=datasets.load_iris()

iris.data[:2]

clf = linear_model.LinearRegression()

#sepal lengthの切り出し
sl=iris.data[:,:1]
#sepal widthの切り出し
sw=iris.data[:,1:2]

clf.fit(sl,sw)
#散布図描写
plt.scatter(sl,sw)
#回帰直線描写
plt.plot(sl, clf.predict(sl), color='blue')

f:id:sd08013:20150418145552p:plain

慣れると結構便利です。

マテリアルデザインに合わせてRobotoフォントを使う

f:id:sd08013:20141124130500p:plain



Android5.0 lolipopが発表され、より直感的な操作が可能なマテリアルデザインが注目を浴びるようになりました。色合いやアニメーションは既に様々なところで取り上げられていますが、せっかくだからフォントにもこだわりたいと思います。
lolipopで採用されているのはRobotoフォントであり様々なデバイスで見やすいように感覚とリズムが調整されているようです。英数字のみで日本語には対応していないようですが一度取り入れてみてはいかがでしょうか?

簡単なので説明するまでもないと思いますが、導入までの手順です。
ここからどうぞ

Google Fonts

1.左上のテキストボックスからrobotoを検索
2.Add to Collectionボタンをクリック
3.下のCollectionにフォントが追加されるのでUseボタンをクリック
4.項目の3つ目 Add this code to your websiteに表示されるコードを貼り付ける
5.HTMLにコード等を記述する
<head>
   <link href='http://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Roboto+Slab' rel='stylesheet' type='text/css'>
   <style>
      body { font-family: 'Roboto'; }
   </style>
</head>

これでRobotoフォントが使用可能になります。

モノづくりの拠点DMM.make AKIBAに潜入してみた part2

モノづくりの拠点DMM.make AKIBAに潜入してみた part1 - 無意義なつぶやき


に続きDMM.make AKIBA studioの所感です。
見学ツアーが個人利用者向けだったこともあり個人利用者目線です。

現状個人利用者向けサービスは不十分

オープン1週間ということもあり個人利用者がハードウェア開発を行う環境としてはまだまだという印象を持った。理由としては2点ありDMM側の見通しの甘さと利用者側の負担の大きさだ。

DMM側の見通しの甘さ

1点目について本来DMMは利用者がどのようなハードウェアを開発するのかある程度想定して機材を導入していくと思うのだけど、導入されている機材に一貫性を感じなかった。具体的には金属加工を行うフライスなどは試作機のようなテストモデルを作成するものであるのに対して基盤に回路をプリントする半田自動印刷機や自動実装機は50〜100枚程度一度に印刷しないと元を取れないような量産を前提とした機材になっていた。つまりハードウェアの外側を作る機材は量産には向かないのに対して、ハードウェアの中身である回路を作る機材は量産向けだったということだ。AKIBA studioで工程の全てをこなすというよりは特定の機材で工程の一部のみをこなすのが現実的だと思う。

個人利用者には負担が大きい?

2点目に利用者側の負担だ。10Fのstudioのみの利用であれば初期費用30000円、月額15000円と手軽に利用できる額だが、オフィス利用のための12Fのbaseも利用するとなると月額30000円とバカにならない。また現状機材が不十分のため必要な機材があれば自分で持ち込まなければならない。一例を挙げるとstudioにはサンドブラストという研磨剤を吹き付けて表面加工を行う装置があるが、現状研磨剤の種類が少なく加工できる材料が少ないとのことで加工したい材料があれば研磨剤を自費で持ち込む必要があるようだ。同じようにフライスやボール盤などの機材についてもミルは口径の大きいものしか用意されておらず、必要とあらば自分で口径の小さいミルの持ち込みが必要なようだ。



モノづくりの場以外としての価値もある

以上のように週末DIYをする程度なら機材は十分だが、負担が割に合わない。逆にここからハードウェアビジネスを行おうと考えると機材は不十分であり、他の施設などである程度形作りDMM.make AKIBAに持ち込み加工を加えるといったことになりそうだ。
これだけを話すとDMM.make AKIBAを利用するメリットは無さそうだが、現在国内にハードウェアビジネスをサポートする施設があまりないことを考えるとやはりこのシェアスペースは貴重だと思う。ツアーは平日の夜であったが12Fのbaseにはちらほら人がいたし情報交換や仲間探しの場としての価値は十分にあると言えると思う。
また担当の方は今後機材の導入を進めていき随時更新していくと仰っていたのでハードウェア開発の場としての価値も今後上がっていくのではないだろうか。

今後に期待のDMM.make AKIBAでした。
ここからモノづくりスタートアップが現れることを祈ります!