どこでもDooor

参加した勉強会 / 読んだ技術書 / 見聞きした備忘録 を気ままに書いていきます

"【まつもとゆきひろ氏特別講演】若手エンジニアの生存戦略"を聞いたメモと感想

久しぶりに投稿してみます。

まつもとゆきひろさんのお話が聞けるということで参加してきました!

supporterzcolab.com

会の目的

会の目的が

  1. Matzの御尊顔を拝む
  2. エンジニアとしての生き方を考える
  3. 何かを始める

で、

  • 考えるだけでなく何かを始めてみよう
  • アウトプット大事

という話があったので、アウトプットを始めてみます。(これまでも何回も始めるって言ってる気がします・・)

以下メモです

出だし

  • Matzさん「20歳の時は生存戦略考えてなかった笑」

本題

  • 生き残るには死ななければいい

メタ戦略

シリコンバレーで成功した人達の共通点

  • IQの高さと成功することの相関はない
  • スタートアップ業界で成功した人の共通点は「パターン認識」能力
    • 世の中の困ってる人達がいる中で、これがあれば解決できる

jp.techcrunch.com

パターン認識とは、失敗体験を素早く解析して同じ過ちを繰り返さない、成功体験であれば同じ成功が繰り返し発生するための仕組みを素早く作り上げるスキルである。

ロールモデル

Look at the dark side…

「我慢」の価値

  • 目的のある我慢 と 目的のない我慢
  • どうしようもない理由の押しつけ、納得できない理由

プログラマ3大美徳

  1. 怠惰
  2. 短気
  3. 傲慢

moneyforward.com

労働に対する対価

  • 報酬は苦痛の対価ではない
  • 報酬は価値の対価である

Look at the bright side!!

みんながやらないやってもよいこと

  • スーツは着ないといけないと思ってたけど、そんなことはない
  • そんなことができるとは知らなかった -> 裏ワザ

何が必要か

  • 空気を読まない
  • 目的を明確化する
  • 成果を上げる
  • Don’t work hard. Work smart.

理不尽を拒否する

  • 価値観にアプローチ
  • 社会的圧力を自覚する
  • リスベクトできる関係を構築する
  • 7つの習慣

メタ戦略

  • 我慢に価値を置かない
  • 自分を知る
    • 自分の得意は?興味は?好きなことは?
  • 社会的圧力に対して、自覚的に鈍感にならなければならない
  • 思い込みに自覚的になる

Two Hard Thins

  • 価値観がキャッシュされている
  • 意識的にキャッシュをインバリデーションすることは大切
  • バグの95%は思い込み(要出典)

martinfowler.com

プログラマの仕事

  • 問題解決
  • 問題の本質は何か、どうやって解決できるのか、そもそも解決できるのか、もっといい方法はないか
  • 同じアプローチを人生に適用する

インプットとアウトプットのバランス

  • 勉強
  • 鍵になるのはアウトプット
    • 高いハードル(羞恥心、面倒、怖い)
      • 例) YouTuber、芸能人
    • 「誰でもできる」は半分本当、半分は嘘
    • 心理的障壁 -> 思い込みと同じ心理的障壁
  • 人間の可塑性
    • 自分が無理やりそのシチュエーションに追い込むと、人間は意外と何とかなる

まとめ

  • 思い込みを打破する
  • 問題解決を極める
  • 人間心理に興味を持つ

プログラマは勝ち組(になろう!)

以下自分の感想

「若手エンジニアの生存戦略」という話でしたが、職種に関わらず誰にとっても大事な話だなと思いました。

  • パターン認識能力を意識的に鍛えようとしてみる
  • 心理的障壁に負けずアウトプットしてみる
  • プログラミング ✕ ○○ の組み合わせを見つけてみる

↑今日の話を聞いてやってみようと思ったことです。今から始めてみよう。。 特に一番最後のは技術力だけで生きていけると全く思えていないので自分の得意を見つけてきたい。。

今更ながらTerraform入門してみました

Terrafromとは

Terraform enables you to safely and predictably create, change, and improve production infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.

Terraformを使えば

  • 安全かつ予想通りに、インフラの構築・変更ができる
  • チーム内で編集・レビュー・バージョンの管理をコードを通してできる

らしいです。

昨夜初めて触ってみたので、詳しくはわかってないのですが、
インフラ初心者の感想で言うと、毎回毎回ポチポチしてインスタンス作らなくていいだけでも便利だなと感じます。

後はいつの間にかセキュリティーグループなどなどが大量にできちゃってることもなくなるので、
自分のAWSアカウントを清潔に保つことができそうです。

Terraform入門

公式サイトのIntroductionをやってみると、EC2の作成と変更、削除までTerraformでさくっと試せるのでおすすめです。

www.terraform.io

公式サイトの入門では、セキュリティーグループとかVPCの設定とかはしないので、もうちょっとやってみたいよ、という方はこちらやってみるとよさそうです。

dev.classmethod.jp

やってみた

やってみたサンプルがこちらです。

github.com

何の設定が最低限いるのかはQiitaに上がっていたAWS 入門を参考に進めてみました。

qiita.com

感想

さくっとインスタンス立てれて、さくっと消せるので、なんかすごい。

ユーザー管理とか、ELBとか、RDSとかの設定も付け加えていきたいなと思います。

AWSだけじゃなくて、GCPとかでも使えるのでAWS以外のサンプルも作っておきたい。

五反田.rb #15 行って来ました

改めてブログを書き始めようと決意しました、Dooorです。

ブログを更新する内容は、

  • 参加した勉強会について
  • 読んだ技術書について
  • 調べたり聞いたりしたことの備忘録

などを気軽に書いていこうと思います。

今回は、昨日参加した 五反田.rb#15(ruby railsの便利メソッドについて) - connpass について書いてみます。

gotanda-rb.connpass.com

なんで行こうと思ったのか

勉強会はしばらく参加してなかったのですが、

  • 社外のエンジニアの人と接点がないこと
  • 社外のエンジニアの人から情報を知る機会がないこと

に危機感を感じ始めて、ご近所で開催してるRubyの勉強会に行ってみようと思い参加しました。

内容

  • 自己紹介
  • 便利なメソッド紹介
  • Active Support コア拡張機能 | Rails ガイド を読む
  • 雑談

みたいな感じでした。

(遅れて参加したので他の参加者の自己紹介聞けなかったのが後悔・・)

便利なメソッド紹介

今回取り上げられていたのはPryの show-method です。

ActiveSupportなどでRubyのメソッドもかなり拡張されているので、
RubyRails初心者の私は、

  • このメソッドってRubyの・・?Railsの・・?

と悩んだり、

  • ActiveRecordcountsize って何が違うの・・?

と悩んだりしてました。

そんな時に、 show-method を使うとこんな悩み解消されます!

#count

pry(main)> show-method ActiveRecord::Calculations#count

From: /hoge/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb @ line 38:
Owner: ActiveRecord::Calculations
Visibility: public
Number of lines: 12

def count(column_name = nil, options = {})
  if options.present? && !ActiveRecord.const_defined?(:DeprecatedFinders)
    raise ArgumentError, "Relation#count does not support finder options anymore. " \
                         "Please build a scope and then call count on it or use the " \
                         "activerecord-deprecated_finders gem to enable this functionality."

  end

  # TODO: Remove options argument as soon we remove support to
  # activerecord-deprecated_finders.
  calculate(:count, column_name, options)
end

#size

pry(main)> show-method ActiveRecord::Relation#size

From: /hoge/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation.rb @ line 257:
Owner: ActiveRecord::Relation
Visibility: public
Number of lines: 3

def size
  loaded? ? @records.length : count(:all)
end

中の実装がどうなってるのか見る癖付けたいなと思います。

参考

qiita.com

Active Support コア拡張機能 | Rails ガイド を読む

スクリーンに映してみんなで眺めました。

マニアックな便利メソッドあったりでいろんな発見あった気がします。

「知ってるか、知らないか」の差が大きい気がするので、
覚えようとは思わず、こんなメソッドあったんだあくらいで知っておこうと思います。

railsguides.jp

雑談

雑談の中で印象に残ったのが、

  • OSSのコード読むの勉強になる

ということです。

実際に参加者の方で読んでて勉強になると教えていただいたのがGitLabです。

github.com

Railsで書かれているし、実際に使っているサービスなので読んでみようと思います。

まとめ

今回勉強会に参加してみて

  • show-mehtod 使って内部実装どうなってるのか知ってみよう
  • Railsガイドちゃんと読もう
  • OSSのコード読んでみよう

を今後意識してみようと思いました。

ブログに書いておくと「あの勉強会で何話してたっけ・・」って時に思い出すためのメモにもなりそうなのでいいなと思いました。

今後も気楽に続けていけたらいいなあと。

【mongo】mongodによる起動

概要

  • 同一のサーバー内でPortを分けてmongodを起動したい

方法

起動

 $ mongod --fork --logpath ./log/mongo.log --port 27017 --dbpath ./db/mongo

終了

$ ps -ef | grep mongod
$ kill -9 [process id]

(注) mongod.lockというファイルが--dbpathで指定したフォルダ内に生成されている可能性あるので消す必要あり

【npm】sharpのインストール

概要

  • 画像データをwebpに変換するためsharpをインストールする

環境

  • さくらVPS
  • CentOS 6.4
  • npm 3.5.1
  • node 5.3.0

手順

  1. sharpのインストールに必要なもの
  2. clangのインストール
  3. gccのインストール
  4. sharpのインストール

1. sharpのインストールに必要なもの

とりあえずこれをやっておく。

$ curl -s https://raw.githubusercontent.com/lovell/sharp/master/preinstall.sh | sudo bash -

サイトを見ると、

  • Installation - sharp

    Prerequisites
    - C++11 compatible compiler such as gcc 4.6+ (Node v4+ requires gcc 4.8+), clang 3.0+ or MSVC 2013
    - node-gyp

なので、今回はgcc4.8+とclangをインストールします。

2. clangのインストール

$ sudo yum install clang

clang -vで3.0.0以上が入ってればok

3. gccのインストール

sharpのbuildの際、gccは4.6系でなければエラーが起きてしまうので、4.6系をインストールする。 下記ミラーサイトよりリンクをコピーしてインストールする。

今回は4.9.3にします。  

 $ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.3/gcc-4.9.3.tar.bz2

ダウンロードしたbz2を解凍

 $ bzip2 -d gcc-4.9.3.tar.bz2

またまたtarを解凍

$ tar -xf gcc-4.9.3.tar

これで現在のディレクトリにgcc-4.9.3のディレクトリができています。

$ cd gcc-4.9.3
$ ./configure --disable-multilib
$ make
$ sudo make install

makeが相当長い。tmuxとかでやっておくのがいいのかもしれない。

で、gccがインストールされるはずなので

$ gcc -v

でチェックしておきましょう。

4. sharpのインストール

$ sudo npm install sharp

でいけるはず、、!

(注意)

もともと(?)yumgccが入ってる場合つまづくこともあるようで、つまづきました。

$ sudo yum uninstall gcc

アンインストールした上で、

$ gcc -v

4.9.3がでればok、もう一回sharpのインストール行いましょう!

2日くらいかかった。。

【Ruby】正規表現

今まで避けてきた正規表現

避けられない事態になってやっておけばよかったと後悔...

基本

今回使った表現法を一覧に。

表現法 意味
^ 開始位置
$ 終了位置
[abc] abcの1文字
[a-z] aからzの1文字
[a-zA-Z] aからzAからZの1文字
[0-9] 0から9の1文字
[2-7] 2から7の1文字
. 何でも1文字
\d 数字1文字
\D 数字以外の1文字
(...) ...を1つにまとめる
(a|b) aまたはb
a{3} aが3つ(aaa)
a{3,5} aが3~5つ(aaaaaaaaaaaa)
#{variable} variable変数の埋め込み

実際に使う時には、上記の一覧から組み合わせて/で挟んで使います。

実践

Stringという文字列が与えられた場合

str = 'String'
if str =~ /./
  puts "一致"
else
  puts "一致しない"
end

これがどうなるかというと、

結果 => "一致"

一致します。(知らずに苦労しました。)

完全に一致した時だけtrueを返したい時は、

str = 'String'
if str =~ /^.$/
  puts "一致"
else
  puts "一致しない"
end

今回の結果は、

結果 => "一致しない"

^$で挟めば、完全に一致という条件が付きます。

IPアドレス

やりたかったことは、IPアドレスかの判断。

こんな感じになるかと思います。

/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/

【Rails】Grapeで最速API開発

最近、grapeを用いてapiを作っています。
最速と言っても他のを試した事はないんですが、かなり早くできたので...

初期設定のところから記載してきます。
jbuilderを使ってresponseのjson生成してます。

設定

1. Gemfile

# Gemfile
gem 'grape'
gem 'grape-jbuilder'

Gemfileに記入後、いつも通りインストール。

$ bundle install

2. application.rb

apiのフォルダを読み込んでもらうためにパスを追加。

# config/application.rb
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
config.middleware.use(Rack::Config) do |env|
  env['api.tilt.root'] = Rails.root.join 'app', 'views', 'api'
end

3. API

今回は、/app/api/api.rbに作っていきます。 モデルには、親モデルarticle.rbと子モデルcomment.rbを使います。

# /app/api/api.rb
class API < Grape::API

  prefix 'api'

  version 'v1', :using => :path

  format :json
  formatter :json, Grape::Formatter::Jbuilder

  resources "articles" do

    # GET /api/v1/articles
    get '', jbuilder: 'articles/index' do
      @articles = Article.all
    end

    # GET /api/v1/articles/:id
    params do
      requires :id, type: Integer
    end
    get ':id', jbuilder: 'articles/show' do
      @article = Article.find(params[:id])
    end

    # POST /api/v1/articles
    params do
      optional :title, type: String
      optional :body, type: String
    end
    post '', jbuilder: 'articles/new' do
      @article = Article.create(title: params[:title], body: params[:body])
    end

    # ネストを生成
    route_param :id do

      resources "comments" do

        # GET /api/v1/articles/:id/comments
        params do
          requires :id, type: Integer
        end
        get '', jbuilder: 'comments/index' do
          @comments = Article.find(params[:id]).comments.all
        end
      end
    end
  end
end

4. Jbuilder

viewsフォルダ配下に作っていきます。 パスは、/views/api/<モデル名>/<メソッド名>です。

# /views/api/articles/index
json.set! :articles do
  json.array! @articles do |article|
    json.id article.id
    json.title article.title
    json.body article.body
  end
end

テスト

今回は、POSTを試してみる。 まずはコマンドラインからサーバーを起動。

$ rails s

POSTを試す時には、curlを使います。

$ curl -X POST -d <data> <URL> -H "Content-Type: application/json"

-H "Content-Type: application/json"でデータ型を指定しないとサーバー側で読み取ってくれないみたいです... なので、実際にはこんな感じです。

$ curl -X POST -d '{"title": "Test Title", "body": "Test Body"}' http://localhost:3000/api/v1/articles -H "Content-Type: application/json"```

基本的な部分はこれで実装できると思います。 認証とかトークンとかはこれからやっていきます。。。