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

2017新卒に捧ぐ!ベテランエンジニアのSEの心構え!!

第四回のテーマはタイトルの通り

「2017新卒に捧ぐ!ベテランエンジニアのSEの心構え!!」

です。

最終回なので、弊社のベテランエンジニアから、SEとしての「メンタリティ」の部分を教えていただきます。

今回は3人の方々に協力していただきました。

ぜひゆっくりお読みください。

1, 「たまには人生について考える」

(新規事業開発室 日本版予約トップ10U チーフシステムエンジニア 大野さん)

仕事になれてくると色々と考える時間ができて、「このままで良いんだろうか?」となる時があります。 その時に謎の不安感に襲われないためにも、自分が何のために、どのような理由で今の仕事をしているか それを考えるために時間を作っておくと、心に余裕をもって仕事をすることができます。

2, 「理想を高く楽しもう」

(新規事業開発室 バイステクニカルマネージャー 菊池さん)

システム開発は楽しい。なにせ “Hello World!” だけで楽しめるんだから。
小さいツールから大きなシステムまで、思案を巡らせポチポチとコードを綴り、徐々に形を作って行くその工程に、楽しみを覚える人は多いのではないでしょうか。
僕の知っているすごいエンジニアの多くは、ベテランと呼ばれるようになっても、この純粋な楽しい気持ちを持ち続けています。

そんなすごいエンジニア達は、困難な問題をエレガントに解決し、簡単なことにも手を抜かず丁寧な仕事を心がけ、広い知識と深い造詣を感じさせる話も面白く、気さくに人を楽しませるユーモアのセンスも抜群で、その自由な発想に憧れられることも。 僕もそうなりたいと思っています。

彼らの気さくな雰囲気からは、苦悩した努力の跡を伺うことはできません。夢中になってやっていたら、高みに達していた。とでも言いたげです。実際そうなんでしょう。
美しい設計やコードを積み重ねることを楽しみ。新しい技術が出れば、なにが新しいのか知ることを楽しみ。すごいシステムが公開されれば、いったい中身はどうなってるのか?と調べることを楽しみ。今よりもっと上手くやることに、楽しんでこだわっています。

システム開発の楽しみを忘れずに、たまに思い出してみるといいと思います。ときどき思い通りに行かなくて悩むこともありますが、そんな時は特に。

3, 「80点を維持する」

(インフラストラクチャーDiv シニアテクニカルマネージャー 渡瀬さん)

私の仕事は主に「運用」です。サービスが常に安定して動くことを求められます。その仕事柄、常に合格点を出さなくてはなりません。
なので、残った力をいずれ来るであろう障害などの対策や勉強に使うようにしています。
さらに障害というのはいつ起きるかわからないで、毎日でも仕事ができるくらいのテンションでいるようにしています。  

また、みんなが課題に集中できるようにする環境を整えることにも心がけています。

昔からマルチタスクで仕事をしてきたせいか、1日中1つのことをやるのがあまり得意ではありません。
昔は数名でインフラ・サービスの開発・運用をしつつ24x365対応していたためか、頑張り過ぎてリソースをロスしないようにというのが習性になっています。
なので、1つのことに集中して120点を出せるような突破力のある人が集中できる環境を作れるように心がけています。

一部の人には分かりやすいように説明すると
三国志のゲームにおける張翼や王平のような、城を落とすにはちょっと武力に不安があるが、最前線の一歩後方の太守を任せられるような人間を目指してます。
李厳や満寵くらいになって最前線を一人で維持しつつ、張遼や張飛に突破して出来るのが理想です。

言い換えると、「この人がいるおかげで戦線が維持できる」「いると助かる、いないと地味に困る」と思われるような存在を目指しています。


どれも心に残る金言ばかりですね。
まとめている僕がやる気になってしまいました。

皆さんもいいエンジニアになれるよう、頑張っていきましょう!

2017新卒に捧ぐ!俺の開発環境!!

こんにちは、奥村です。

今回のエンジニアブログも前回に引き続き「新卒に捧ぐ!俺の〇〇」シリーズです (前回の記事はこちら↓)

blog.engineer.adways.net

第三回のテーマはタイトルの通り

「新卒に捧ぐ!俺の開発環境」

です。

新人エンジニアにとって開発環境を準備するのは、どんな環境を用意したら良いのか悩んでしまうことが多いですよね。

本記事では2人のエンジニアがどのような環境で開発しているかを紹介しています。 是非参考にしてみてください。

  • 一人目:メインでscala、たまにHTML,javascriptを扱っている(古川)
  • 二人目:ruby on Railsで開発を行なうことがメイン(足立)

一人目

こんにちは、古川です。PCはMacbook Proをつかっています。

入社して以来色々な言語をさわってきましたが、最近はScala、たまにHTMLやJavascriptを使ってサービスを開発しています。

■ エディター

  • Scalaの開発の場合

他の言語はいくつか選択肢あると思いますが、Scalaに至ってはIntelliJ IDEA一択かと感じています。

なぜなら、補完機能やリファクタリング機能・デバッグ機能などが充実しているからです。

IntelliJ IDEAにはCommunity版とUltimate版がありますが、Scalaメインの開発だけならCommunity版でも十分です。HTMLなどの開発もやりたいのならUltimate版にしたほうが良さそうです。

自分の場合は、WebAPIの開発が多く、HTMLなどを扱うことはそこまで多くないので、Community版で事足りてます。

また、必要に応じてプラグインを入れればDockerやShellスクリプトにも対応してくれるので個人的に便利だと思います。

  • HTMLやJavascriptの開発の場合

こちらは選択肢はたくさんありますが、個人的にはVisual Studio Codeがオススメでしょう。

Javascriptの場合は簡単にデバッグ実行ができますし、コードジャンプやリファクタリング機能も使えるので重宝しています。

■ 開発環境の整備

サービス開発をする際、MySQLやRedisなどミドルウェアを用意しておく必要があったので、かつては「仮想マシンを作り、ミドルウェアと必要なライブラリをインストール」そして他人に渡す場合は、「それをコピーする」なんてことをしていました。

しかし、つぎの問題があって開発がはばかられます。

  • 仮想マシン自体を立ち上げるとPCが重くなっていく
    • 特に複数プロジェクトに関わっていたときは、その分仮想マシンを立ち上げておかないといけなく、そのせいでCPUやメモリを食い尽くすわで、本当に大変でした
  • 仮想マシンをコピーしたとき、オレオレ設定を相手に強要させてしまうことはまだしも、下手すると必要以上の情報が他人に渡ってしまうこともある
  • 仮想マシンを使えば使うほど容量が大きくなるので、HDDを圧迫させてしまうだけでなく、他人に渡すのも時間がかかって大変
  • 仮想マシンの起動に時間がかかるのですぐに開発に取り掛かれない
  • Sambaなどのツールでホストとつなげておかないと、好きな開発環境で開発ができない

そこで最近はDockerを使って、サービス単位でミドルウェアの管理しています。

Dockerを使うことでコレくらいのメリットはあるので、開発環境の整備にはうってつけです。

  • ミドルウェアが必要になったときはコンテナを立ち上げたり落としたりすれば良くなるので、マシン環境を汚すことなくミドルウェアが簡単に扱える
  • 仮想マシンは立ち上げに数十秒以上はかかるものの、コンテナは立ち上がる速度もたったの数秒

さらにDocker Composeを使えば、プロジェクトごとに必要なミドルウェアをコードで設定できるので環境整備がかなり楽になるだけでなく、開発環境の切り替えも楽になります。

具体的には、サービスのプロジェクトごとにこんな感じにdocker-compose.ymlを定義しておき、

version: '2'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: eventapi
      MYSQL_USER: admin
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"

開発時には、このコマンドをうてばサービスに必要なミドルウェアは一発で立ち上がります。

docker-compose up -d

そして、違うプロジェクトの開発をしたい場合は、このコマンドでコンテナを落としておき、違うプロジェクトで同じようにコンテナを立ち上げるだけで良いです。

docker-compose down

なので、プロジェクトの切り替えに時間をあまりかかりません。

また、大体のミドルウェアはDocker Hubに公開されていますので、環境構築自体も時間はかかりません。

もし存在しないバージョンのミドルウェアやサービス専用のコンテナを作りたい場合は、(用意するまでは大変なものの)Dockerfileでコンテナイメージを作っておき、一度公開さえしておけば、他の人もすぐにそのコンテナイメージを利用できるようになります。

ただし、うちの場合は社外に公開したくないコンテナイメージもあるので、その場合は社内に立ててあるGitLabのリポジトリにアップロードしています。

■ その他

Macbook Proは熱くなると極端に重くなります。重くなると本当に仕事にならなくなるので、冷却台を使っています。

自分はこの冷却台を使っています。

冷却台を買う前は、ちょっと重いプロセスを走らせるとすぐカクカクになってしまいましたが、この冷却台をつかっているときは重くなることはだいぶ減りました。

冷却台は正直なんでも良いと思いますが、評判の高そうなものを選んだほうがいいと思います。


二人目

初めまして。社会人2年目エンジニアの足立です。

最近、開発環境をDocker Composeを使って構築するように変更して便利だったので紹介します。 便利な点としては

  • 誰でも同じ環境を作れる
  • テスト環境と同じ環境を準備できる
  • ローカル環境でのミドルウェアの管理が便利
  • 設定さえしっかりすれば、コマンド2つで開発環境が立ち上がる

等が挙げられます。

以下では、デモを通して、この便利な開発環境を手に入れる方法を紹介していきます。

デモのゴール

  • railsでresqueを使用し、workerでjobを回しlogに「HelloWorld」を出力されていることを確認する。

使用環境

Docker for Mac(version 17.03.1-ce-mac5)
docker-compose(version 1.11.2)

■ docker-compose関係のファイル

下記のコンテナを用意するため、

  • Dockerfile
  • Dockerfile-nginx
  • docker-compose.yml

を作成します
〜railsのプロジェクトは用意している前提で話をさせて頂きます。〜

コンテナ 詳細
datastore 永続化、共有したいパス設定
redis redisサーバー
nginx nginxサーバー
rails railsサーバー

・Dockerfile

RUN apt-get update && apt-get install -y vim locales --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN dpkg-reconfigure locales && \
        locale-gen C.UTF-8 && \
        /usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8
ENV TERM xterm
# END: ~~~~~ 日本語対応

RUN mkdir -p /usr/src/docker_compose_app
RUN mkdir -p /usr/src/docker_compose_app/tmp
WORKDIR /usr/src/docker_compose_app

COPY ./Gemfile /usr/src/docker_compose_app/Gemfile
COPY ./Gemfile.lock /usr/src/docker_compose_app/Gemfile.lock

RUN bundle install -j4

EXPOSE 3000

ENV RUN_AT_EXIT_HOOKS=1
ENV VERBOSE=1
ENV PIDFILE=./tmp/resque.pid
ENV TERM_CHILD=1
ENV QUEUE='resque_sample'

CMD bash -c "bundle exec unicorn_rails -c config/unicorn/docker.rb -E docker -D && bundle exec rake resque:work"

DockerfileでCMDが一つしか使えないのを知らなくて少し詰まりました。。

・Dockerfile-nginx

FROM nginx:1.11.0-alpine # Docker Hubからimageを持ってきます

COPY container/nginx/vh-site.conf /etc/nginx/conf.d/default.conf

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

・docker-compose.yml

---
version: '2'
services:
  datastore:
    build: container/datastore
    container_name: docker-test-container
  redis:
    image: redis:3.2.0 # Docker Hubからimageを持ってきます
    ports:
      - '6379:6379'
  nginx:
    build:
      context: .
      dockerfile: Dockerfile-nginx
    ports:
      - '8080:80'
    links:
      - rails
    volumes:
    - .:/usr/src/docker_compose_app
    - ./tmp/logs/:/var/log/nginx # ここでコンテナ内のlogをローカルの/tmp/logs以下にマウント
    volumes_from:
    - datastore
  rails:
    build: .
    ports:
      - '3000:3000'
    links:
      - redis
    environment:
      RAILS_ENV: docker
    volumes:
    - .:/usr/src/docker_compose_app
    volumes_from:
    - datastore

・container/datastore/Dockerfile

FROM busybox:latest

VOLUME /usr/src/app/tmp
VOLUME /usr/src/app/public/system

CMD /bin/sh

・container/nginx/vh-site.conf

upstream docker_compose_app {
  server rails:3000 fail_timeout=0;
}
server {
  listen       80;
  server_name  localhost;
  root /usr/src/docker_compose_app/public;
  location / {
    try_files $uri @webapp;
  }
  location @webapp {
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://docker_compose_app;
  }
  location ~ ^/(assets|uploads)/ {
    gzip_static on;
    gzip_types text/css text/js text/xml;
    add_header  Cache-Control public;
    break;
  }
  error_page 404 /40x.html;
  location = /40x.html {
    index 404.html;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

Dockerfileのオプションの詳細は過去の記事に纏めてあるので下記を参照してください。
Docker Composeを使ってマイクロサービスを作ってみた

■ ファイルの削除・ファイル設定

今回はデータベースは使わないので不要ファイルは削除します

rm config/database.yml

config/application.rbのファイルの require 'rails/all' をコメントアウトし下記を追加し、

config.active_record.raise_in_transactional_callbacks = true こいつもコメントアウトします。

# config/application.rb

# require 'rails/all'

require 'action_controller/railtie'
require 'action_mailer/railtie'
require 'sprockets/railtie'
require 'rails/test_unit/railtie'

module DockerComposeApp
  class Application < Rails::Application
    # config.active_record.raise_in_transactional_callbacks = true
  end
end

config/environments/docker.rbconfig.assets.debug = false に変更します。

# config/environments/docker.rb

config.assets.debug = false # falseに変更

・Resqueの設定

mkdir workers
vim workers/hello.rb
class Hello
  @queue = :resque_sample

  def self.perform(msg)
    sleep 5
    logger = Logger.new(File.join(Rails.root, 'log', 'resque.log'))
    logger.info "HelloWorld!! [#{msg}]"
  end
end

・Rakeタスクを追加

lib/tasks/resque.rake

require 'resque/tasks'
task "resque:setup" => :environment

resqueの設定

config/initializers/resque.rb

require 'resque'
Resque.redis = 'redis:6379' # 環境に合わせて変更必要あり(docker環境のみならOK)

・Railsのルーティング設定

config/routes.rb

require 'resque_web'

Rails.application.routes.draw do
  mount ResqueWeb::Engine => "/"
  get '/resque_web' => redirect('/')
end

■ 開発環境の起動

docker-compose build ← このコマンドでimage作成
docker-compose up -d ← このコマンドでimageを使ってコンテナ作成 + 起動
docker ps ← 起動中のコンテナの確認

docker-compose build  
docker-compose up -d 
docker ps

f:id:AdwaysEngineerBlog:20170419114708p:plain

上記の画像のようにコンテナ

  • nginx
  • rails
  • redis

のコンテナ3台が立ち上がれば成功です。

今のままだとprecompileが通ってないので下記のコマンドを叩いてprecompileを行いrails再起動します。

docker-compose run rails rake assets:precompile && docker-compose restart rails

これで localhost:8080 にアクセスするとResqueのページが無事に表示されるかと思います。

f:id:AdwaysEngineerBlog:20170419115057p:plain

これでようやく準備ができました。
コマンドラインでjobを生成してredis::workerが動くか確認していきましょう。

#jobの生成
docker-compose run rails bundle exec rails runner 'Resque.enqueue(Hello, "hogeee")'[f:id:AdwaysEngineerBlog:20170419114708p:plain]

f:id:AdwaysEngineerBlog:20170419115112p:plain 動いていますね!

ログを見てみましょう

tail -f log/resque.log

f:id:AdwaysEngineerBlog:20170419115125p:plain

しっかりと「HelloWorld!!」が表示されていますね!

ハマりポイント

Already running on PID:14 (or pid=/usr/src/docker_compose_app/tmp/unicorn.pid is stale) (ArgumentError)

このエラーを初めてみたときは、コンテナ立ってないんだから入れなくない??っとパニクりましたが先輩に聞いて解決しました。

上記のエラーが出たら

#コンテナの中に入る
docker-compose run コンテナ名(rails) bash
# ゴミファイルを削除する
rm tmp/unicorn.pid
# railsコンテナを起動させる
docker-compose start rails

まとめ

新しくチームにジョインする人も簡単に開発環境を手に入れられるのがdocker-composeの強みだなと感じています。
( dockerコマンドの学習コストはありますが。。

以上です。ありがとうございました。


以上になります。今の内から開発環境にこだわっておくとあとあと楽になると思います。
色々試して自分が使いやすいものを選択できるようになると良いですね!

2017新卒に捧ぐ!俺のvimの設定!!

奥村です。

今回のエンジニアブログは前回に引き続き「新卒に捧ぐ!俺の〇〇」シリーズです (前回の記事はこちら↓)

blog.engineer.adways.net

第二回のテーマははタイトルの通り

「新卒に捧ぐ!俺のvimの設定」

です。

アドウェイズにはvimを採用している人が多くいます。
「これをするためにこのプラグインを入れている」や「これがあると便利」等のvimの設定をエンジニアから集めてきました。
本記事では4人のオススメvim設定を紹介します。新人vimmerは先人の設定を参考にすると良いでしょう!

それではどんどん紹介していきます。

一人目

こんにちは、井古田です。

設定1: 置換を便利に

開発やリファクタリングしている時に、変数名やメソッド名を置換したいなって思う時ありませんか?
僕はけっこうあるんですよね〜
Sublime TextやAtomでは優れた置換機能がデフォルトでありますが、
Vimだと :%s/◯◯/××/g または :%s/◯◯/××/gc を使ったりすると思います。
ただ :%s だと、置換対象の文字が分かりづらかったり、意図してない部分の文字列が置換されたりして悲しくなったりします。。

そんな時出会ったのが osyo-manga/vim-over です!

github.com

vim-over は置換対象の文字列をハイライトし、その横に変更予定の文字列を表示してくれるという優れものです。
視覚化され、一括で置換を行うことができるため、今年入ってきた新卒にVimでもかっこいい置換を披露することができます(^ ^)

設定ファイル

" ---------- 'osyo-manga/vim-over' ----------
" 全体置換
nnoremap <silent> <Space>o :OverCommandLine<CR>%s//g<Left><Left>

" 選択範囲置換
vnoremap <silent> <Space>o :OverCommandLine<CR>s//g<Left><Left>

" カーソルしたの単語置換
nnoremap sub :OverCommandLine<CR>%s/<C-r><C-w>//g<Left><Left>

実行イメージ

  • 全ての describehogefuga に置換(全体置換)

  • 選択範囲の varlet に置換(選択範囲置換)

  • カーソルしたの testMethodfugaMethod に置換(カーソルした単語変換)

二人目

こんにちは、澤藤です。

設定1:コメントアウトを楽に

開発時にはコメントアウトを結構使ったりするので毎度インサートモードに入ってからコメントを入力するのは面倒です

この設定をすることで\cと打つだけでコメントアウト出来てしまいます(複数行にも対応)

さらにファイルタイプに合わせたコメントアウトをしてくれます

‘tyru/caw.vim.git'というプラグインを使っています

github.com

設定ファイル

NeoBundle 'tyru/caw.vim.git'
" caw comment out
nmap <Leader>c <Plug>(caw:i:toggle)
vmap <Leader>c <Plug>(caw:i:toggle)

実行イメージ

  • ruby

  • html

設定2:日付、時間のショートカット

日付の入力って地味に面倒ですよね

なのでショートカットで今の日付、時間が入力できるようにしたりしています

議事録とかメモとかでも使えたりするので便利です

設定ファイル

inoremap ,todo <C-R>=strftime('%Y-%m-%d %a')<CR>
inoremap ,date <C-R>=strftime('%Y-%m-%d')<CR>
inoremap ,time <C-R>=strftime('%H:%M:%S')<CR>

実行イメージ

その他

色々プラグイン入れたり設定したりしていくとどんどん肥大化して後で見直したときに訳がわからなくなったりします

なのであらかじめファイルを分割してあげておくと後で楽になると思います

私の場合は下記のような設定をしています

  • .vimrc
" 通常設定
source ~/dotfiles/vimrc/rc/basic.vim
" プラグイン一覧
source ~/dotfiles/vimrc/rc/plugins.vim
" キーマッピング
source ~/dotfiles/vimrc/rc/mapping.vim
" タブ関連の設定
source ~/dotfiles/vimrc/rc/tab.vim
" quickhlの設定
source ~/dotfiles/vimrc/plugins/quickhl.vim
" cawの設定
source ~/dotfiles/vimrc/plugins/caw.vim
.....
.....
.....

三人目

こんにちは、清水です。

普段はRubyで開発しているエンジニアです。

使っているプラグインは40個ほどで、syntax, colorshcemeを除くと30個ほどでした。

プラグイン管理には dein.vim、ステータスバーには lightline.vim … など便利で有名なプラグインを使っています。

プラグインの入れ替えを定期的にしていて、vimawesome を探して、入れてみて手に馴染んだら残すようにしています。

設定1:カラースキーム設定

同じカラースキームでコーディングをしていると、言語によっては見づらく、目が疲れるのでよく色を変えています。

そこで設定している「さくさくカラースキーム変更」をご紹介します。

新しいカラースキームを探す時はvimcolors さんが便利です。

こちらからよさそうなカラースキームを探します。

colorschemeの変更は :colorscheme [色の名前] ですが、何度も変更するのは手間なので

unite.vimunite-colorscheme をインストールして :Unite -auto-preview colorscheme を実行すると便利です。

リアルタイムに色の変更が確認できます。

お気に入りのカラースキームがいくつか決まったら、いつでも変更できるようにします。

Hack #228: 見た目を気軽に変更する(その2) ColorRoller版 で紹介されている方法が便利です。

" color roller: "{{{
let ColorRoller = {}
let ColorRoller.colors = [
            \'default'   , 'adaryn'    , 'anotherdark' , 'solarized'   , 'moss'     ,
            \'dante'     , 'golden'    , 'ironman'     , 'jellybeans'  , 'mustang'  ,
            \'softblue'  , 'tir_black' , 'wombat256'   , 'yuroyoro256' , 'molokai'  ,
            \'desert256' , 'mrkn256'   , 'wuye'        , 'lucius'      , 'twilight' ,
            \'onedark',
            \ ]

function! ColorRoller.change()
    let color = get(self.colors, 0)
    silent exe "colorscheme " . color
    redraw
    echo self.colors
endfunction

function! ColorRoller.roll()
    let item = remove(self.colors, 0)
    call insert(self.colors, item, len(self.colors))
    call self.change()
endfunction

function! ColorRoller.unroll()
    let item = remove(self.colors, -1)
    call insert(self.colors, item, 0)
    call self.change()
endfunction
"}}}


" ColorRoller {{{
nnoremap <silent><F9> : <C-u>call ColorRoller.roll()<CR>
nnoremap <silent><F8> : <C-u>call ColorRoller.unroll()<CR>
" }}}

F9, F8 にマッピングして好きな色をいつでも交換できるようにしています。

お気に入りのカラースキームを見つけて、快適コーディングしましょー。

四人目

インフラエンジニアの渡瀬です。

設定1:vim から git を使う

vim-fugitive

Nebundleユーザーなら vimrc

NeoBundle 'tpope/vim-fugitive'

Deinの人は .vim/rc/dein.toml

[[plugins]]
repo = 'tpope/vim-fugitive'

コレだけで vim から git が呼べる様になります。

Screencasts - A complement to command line git

基本的な使い方はこちらのVim Castを見ると理解できると思います。

詳細は :help fugitive してください

使い方

基本的なコマンドだけ紹介します

:Gdiff
git diff %

diffモードで現在開いているファイルのgit diffを開きます。

この機能の為に入れている言っても過言ではないです。

:Gwrite
git add %

今開いているファイルをgit addしてくれます

:Gcommit
git commit

git commitを実行し、コミットメッセージを記述するバッファを開きます。

設定2:markdownのプレビューをみながら編集する

previm

markdownをプレビューを見ながら編集できます。

NeoBundle 'kannokanno/previm'

または

[[plugins]]
repo  = 'kannokanno/previm'
on_ft = ['markdown']

README.mkd に書いてある通り、open-browser.vimと同時に使うと便利です

設定3:markdownのテーブルをいい感じにする

markdwonを編集中にテーブルをいい感じに修正してくれる mdt というツールがあります。

markdownのテーブルは文字を編集するたびに全行を編集することになり、めんどうですよね?

これをサクッと修正してくれるとても素晴らしいツールです。

このコマンドを呼び出すには

command! -range=% Mdt :<line1>,<line2>!mdt

とするか、同じことをしているだけのmdt.vimがあります。

NeoBundle 'ywatase/mdt.vim'

設定後、テキストをvisualモードで選択して、:Mdt すればmdtがいい感じに整形してくれます。

実行イメージ

f:id:AdwaysEngineerBlog:20170414193342g:plain


いかがだったでしょうか。気になったものがあればすぐにでも試してみましょう!
vimmerへの道ははじまったばかりです。

2017新卒に捧ぐ!俺のお勧め技術書!!

久保田です。

こんにちは、桜が咲きましたね。春ですね。

春といえば新しい出会い、我が社にも新卒がたくさん入ってきました。

そこで4月はそんな新卒のために!
先輩方に協力していただき、「新卒に捧ぐ!俺の〇〇」シリーズをやりたいと思います。

少しでも新卒の成長に役に立てば、そしてブログに興味持ってくれたらいいなと思う所存でございます。

記念すべき第一回のテーマは、

「新卒に捧ぐ!俺のお勧め技術書!!」

です。

エンジニアといえば勉強、勉強といえば本!
エンジニアにとって技術書は必ず必要なもの。そんな技術書を、先輩方にお勧めしていただきました!

では、どんどん紹介していきます。

リーダブルコード

(Nさん 4年目 チーフエンジニア)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

  • 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2012/06/23
  • メディア: 単行本(ソフトカバー)
  • 購入: 68人 クリック: 1,802回
  • この商品を含むブログ (136件) を見る

多くの人がおすすめの本にあげる王道の本です。
読みやすいコードを書くためのテクニックをシンプルでわかりやすく書いてあります。
個人的には「少しコードを書けるようになったかなー」と思った時くらいに読むと良いと思います。
一度読んで終わりというよりは「きれいなコードってなんだっけ?」って思った時に読み返したくなるので、手元に置いておきたい本です。

アホでマヌケなプログラミング

(Nさん チーフエンジニア)

アホでマヌケなプログラミング (プログラマーズ叢書)

アホでマヌケなプログラミング (プログラマーズ叢書)

プログラマという職業や、昔のプログラマあるあるとかをゆるーく書いたエッセイです。
ガチガチの技術書という感じではないです(笑)。
勉強するためというよりは軽い読み物で、サクサク読みつつちょっとしたプログラマの歴史や考え方、雑学を学ぶ事ができます。すごく読みやすい本です。

Webを支える技術

(K サーバーサイドエンジニア)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webとはなんぞや、ということがよーくわかる本。
HTTPとは?
HTTPを考えた人は?
HTTPメソッドとは?正しい使い分けとは?
クールなURIとは?
RESTとは?
1つでもわからない人、自信がない人は必ず読むべき一冊です。
なんとなく知っているWebが、よくわかるWebになります。

メタプログラミングRuby 第2版

(K サーバーサイドエンジニア)

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

実践ではほぼ使えないテクニックが満載で避ける人が多い一冊。
しかし、この本のテクニックを知っていると、どのようにRubyが動いているかを垣間見ることができます。
そうだったのか、と何度もうなずかされ、プログラミングがより一層楽しくなること間違い無し!
この本を読み終わった頃にはあなたの目の前にはRubyの定数ツリーがそびえ立っている。はず。

ノンデザイナーズデザインブック

(Uさん アンドロイドアプリエンジニア)

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

  • 作者: Robin Williams,吉川典秀
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2008/11/19
  • メディア: 単行本(ソフトカバー)
  • 購入: 58人 クリック: 1,019回
  • この商品を含むブログ (106件) を見る

アプリエンジニアやフロントエンドエンジニアのようにUIを実装するのにオススメ。
デザイナーさんから貰うUIに対して、今までとちょっと違った見方ができるはず。
個人的には「整列」の話が好き。

ゼロから作るDeep Learning

(Oさん チーフエンジニア)

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ちまたで話題のDeepLearningが、学習の基礎からCNNなどの理論までプログラムで理解できる優れものな一冊。
基本的にライブラリに頼らずPythonで一から書いていくので、数学が苦手なエンジニアにもオススメです。
自分の書いたプログラムで人の顔が分類できるようになったときは感動ものです。

インフラエンジニアの教科書2 スキルアップに効く技術と知識

(Aさん ユニットマネージャー)

インフラエンジニアの教科書2 スキルアップに効く技術と知識

インフラエンジニアの教科書2 スキルアップに効く技術と知識

インフラエンジニアに必須となるハードウェアやOS、ネットワーク、セキュリティ知識がわかりやすく簡潔にまとめられた良書です。 これからインフラエンジニアになる方、目指す方は一読をオススメします。 前作インフラエンジニアの教科書ももちろんオススメです。

フロントエンドエンジニアのための現在とこれからの必須知識

(Tさん フロントエンドエンジニア)

フロントエンドエンジニアのための現在とこれからの必須知識

フロントエンドエンジニアのための現在とこれからの必須知識

  • 作者: 斉藤祐也,水野隼登,谷拓樹,菅原のびすけ,林優一,古沢宏太
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2016/01/28
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る

必須知識が網羅されていて全体像を把握できます。
また、フロントエンドエンジニアの環境や求められる資質、成長戦略などが書かれています。
さらにトレンドが掲載されているため、お勧めの一冊です。

オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方

(Yさん マネージャー)

Rubyで開発を行っているのであれば、読んでおいて間違いがない本です。
オブジェクト指向を使い、どのように保守性を高めていくのか分かりやすく書いてあります。
個人的に、保守性が高いコードが必ずしも理解が容易なコードではないということが書かれていて刺さりました。

Webエンジニアが知っておきたいインフラの基本

(Wさん テクニカルマネージャー)

Webエンジニアが知っておきたいインフラの基本

Webエンジニアが知っておきたいインフラの基本

Webエンジニアとしてインフラ関係を勉強する最初の一冊としてオススメです。
インフラの人と話をする前に読んでおいてくれると嬉しいです。
MySQLのメトリクスについて30pほど割いて書いてあってMySQLにも詳しくなれてお得

闘うプログラマー

(Wさん テクニカルマネージャー)

闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達

闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達

プログラマーを題材としたノンフィクション小説(?)
Windows NTの開発を行ったカトラーのお話です。
昔のMicrosoftの様子が垣間見れてとても面白いです。
息抜きにどうぞ。


いかがでしたでしょうか、中にはレベルの高い本もありますが、どれも面白そうな本ですね。

気になったものは是非先輩に借りたり買ったりしてどんどん勉強しましょう。ではまた来週〜

deviseの独自ストラテジーの作り方

久保田です。

最近、deviseのストラテジー(プラグイン的なもの)を社内の認証システム用に作りました。
その時、古い情報が多く、半泣きになりながらいろいろ模索して作ったので、
備忘録がてら、同じく困る人がいなくなるように記事にします。

devise

Railsで認証つきのアプリケーションを作成したことのある人なら必ず使ったことのあるgemだと思います。
かなり充実したライブラリでデフォルトでよくあるパターンのストラテジーは入っているので、基本的にはそのまま使うことができます。

ストラテジー

deviseではストラテジーという認証のルールを設定することで、必要な機能だけを享受することができます。
例えば、db認証をやりたい時は、

class User < ApplicationRecord
  devise :database_authenticatable

  # ...
end

ロック機能をつけたい時は、

class User < ApplicationRecord
  devise :database_authenticatable, :lockable

  # ...
end

のような感じで宣言します。

今回は、このストラテジーをオリジナルで作ったから作り方を共有します!という話です。

完成イメージ

完成イメージは以下のような感じです。

class User < ApplicationRecord
  devise :foo_authenticatable

  # ...
end

foo_authenticatableというストラテジーを作成します。
これだけで、いつものようにdeviseを使うようにしてオリジナルの認証を通します。

フォルダ構成

最低限必要な構成は以下の通りです。
(lib以下に作りました。)

lib
└── devise
    └── models
        └── foo_authenticatable.rb
    └── strategies
        └── foo_authenticatable.rb

ストラテジーを作るためには、
- modelがincludeするファイル
- 実際に認証を行うstrategyファイル

が必要です。

動作イメージ

動作イメージは、以下のような流れになります。

sessions_controller#create  
↓  
strategies/foo_authenticatable#authenticate!(成功か失敗かを判断する)  
↓  
models/foo_authenticatable.独自のロジック(必要に応じて)  

strategy

まずはstrategyファイルからです。
このファイルは、実際に認証を通していいか、ダメかを判定するロジックを書きます。
以下のような構成になります。

  • strategies/foo_authenticatable.rb
require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    class FooAuthenticatable < Authenticatable
      # optional
      def valid?
        # 事前に行いたいバリデーション。
        # パラメータなどの確認を行う。
        # ex: params['username'] || params['password']
      end
      
      # required
      def authenticate!
        # modelで定義されたメソッドで認証ロジックを通す。modelに書いた方がスッキリするため。
        # mapping.toでストラテジーを宣言したモデルが取得できる。
        res = mapping.to.authenticate(params[scope])
        if res
          success!(res) # 認証成功。
        else
          fail!(:invalid) # 認証失敗。
        end
      end
    end
  end
end

Warden::Strategies.add(:foo_authenticatable, Devise::Strategies::FooAuthenticatable) # ストラテジーの登録

定義されているメソッドは2つ、valid?authenticate!です。
valid?はオプショナルなメソッドなので、あってもなくても大丈夫です。あった場合はauthenticate!の前に動き、
結果がtrueの場合だけauthenticate!を実行します。

authenticate!は必須のメソッドです。
authenticate!の中でsuccess!もしくはfail!を呼び出すことで認証の判定が可能になります。
他のメソッドはこちらです。

これだけで、認証の判定は完成です。
次にmodelに任せた認証ロジックの部分です。

model

次はmodelにロジックを作ります。
modelは最初なくても大丈夫かなーと思っていましたが、ないとないよーってエラーを出しているようでしたので、どうやらいるようです。
そしてこのmodel、自動的にこのストラテジーをdevise :foo_authenticatableのように宣言したモデルにincludeされるようです。
なので、このmodelに実際のロジックを書いていきます。

  • models/foo_authenticatable.rb
require Rails.root.join('lib/devise/strategies/foo_authenticatable')

module Devise
  module Models
    module FooAuthenticatable
      extend ActiveSupport::Concern
            
      module ClassMethods
        def authenticate(attributes)
          # 認証ロジック
          # 仮にデータベースのidで認証
          res = find_by(id: attributes[:id])
          if res.present?
            res
          else
            nil
          end
        end
        
      end
    end
  end
end

最低限はこんな感じです。
extend ActiveSupport::Concernをし、module ClassMethodsを使うと簡単にクラスメソッドが定義できるので、綺麗ですね。
認証が成功したら、インスタンスを返してあげます。後ほどそれがstrategyのsuccess!に渡され、認証ユーザーとなります。

もしaccessorなどを足したい時はincludedを使ってあげましょう。

initializer

最後にinitializer/devise.rbに独自のauthenticationを登録するための処理を書きます。

  • config/initializer/devise.rb
Devise.setup do |config|
  config.warden do |manager|
    manager.default_strategies(scope: :user).unshift :foo_authenticatable
  end

  # ...
end


Devise.add_module(:foo_authenticatable, {
  strategy: true,
  controller: :sessions,
  model: 'devise/models/foo_authenticatable',
  route: :session,
})

これで完了です。
もし独自のストラテジーを作りたくなったらやってみてください。