2016年6月23日木曜日

【コラム】人が足りないなら増やせばいいじゃない。なぜ政府はマリー・アントワネット思考なのか

記事概要

不定期更新のコラム記事。


ハンス・フォン・ゼークト。「無能な働き者は、すぐに銃殺刑に処せ。」という言葉を残した。

総務省の情報通信審議会は、IT人材を10年間で200万人に倍増する報告書案をまとめた。
IT業界が慢性的な人材不足なのは確かだが、この政策には疑念を抱く。

毎日休みなく夜遅くまで頑張っている政治家の皆さんに文句は言いたくない。だが、さすがに言わざるをえない。

なぜ、何度も同じ間違いを繰り返す?

人が集まらない理由をきちんと考えているのだろうか。そもそも、

人を増やして解決する問題なのか?

結果には必ず原因がある。
人を増やしても、IT業界の人材不足問題が解消しないのは、これまでの対策で効果がないことから答えは出ている。
つまり、IT業界は、人を増やすことで人材不足の解消はできない業界なのである。

「人を増やす」
この安易な解決方法の提示は、IT業界に限らない。
人口減少にも移民を入れるべきだという意見があるし、日本の財政問題も税金を増やすことで解決しようとしている。
こんな誰でも出せる解決方法を提示してもらうために、我々国民は税金を払い、議員に3,000万もの年収を支払っているわけではない。
ググれば高校生でも導ける回答に3000万の年収は高すぎる。300万が妥当だ。

問題提起は適切なのか

私は情報通信審議会に属してはいないので、どんな話し合いが行われているかはわからない。だから、

間違ったデータを集めたパワーポイント資料を見て、無駄な議論をしているのではないか。

と疑ってしまう。

当たり前だが、人材不足の会社の経営者に聞けば、「人材が足りない」という答えが返ってくる。
仕事がない会社の経営者に聞けば、「仕事がない」という答えが返ってくる。

1+1=2くらい明確なことである。

表面的な結果から安易な解決方法を見出すことほど無駄なことはない。
お金がないからアルバイトをしよう。将来が不安だから貯金して備えよう。

情報通信審議会の報告結果はまさにこれと同じである。
メジャーリーガーのダルビッシュ選手が言う

無駄な方向への努力

である。

IT人材の解決方法

IT人材不足の解決に必要な議論は、

  • 必要とする技術を身につけるのにかかる時間はどれくらいか
  • どのジャンルのどのくらいのレベルの技術者が何人必要か

である。

どれだけ頭数を増やしても業務をこなせる能力がなければ意味がない。今のプログラムはマンパワーで解決できるレベルにない。
例えば、錦織選手があと3人いれば日本はテニス王国になるからといって、国がテニス人口を3倍にしても意味がないことはわかるだろう。今やってることは全く同じである。

ディープラーニング、つまりAIの技術者が欲しいなら、その人材には統計、ベイズ、アルゴリズム、線形代数、微積の知識が前提として備わっている必要がある。pythonでプログラムが書けることも必要だ。データの集計にはSQLを使うだろう。

何が書いてあるかよくわからないかもしれない。だが、安心して欲しい。ほとんどの人はわからないはずだ。エンジニアでも機械学習を理解できるのは10%というところだろう。

つまり、大切なのは質を備えた人材である。
必要な議論は、そういった人材を育てるのに、どれくらいの期間の教育が必要で、どういった環境を用意するべきなのかということである。

今のやり方では、人材不足はさらに加速するだけだ。増えた100万の人材のうち、欲しい人材は1万程度で、同じことの繰り返しになるだけだ。

まとめ

なんでも量で解決しようとするのは、古い世代の悪い習慣だ。
たとえ、じゃぶじゃぶに刷った金を国民に配っても、ほとんどの国民は将来のためにと貯金するだろう。
多くの移民を招きいれても、未来の基軸産業で活躍できる人はごくわずかだろう。

情報化時代で周りには多くの情報であふれている。情報からノイズを取り除いて、適切な判断を下すのは我々エンジニアでも難しい。

だが、難しくても我々は時代にあった選択をしなければならない。そして、その力は、政府にこそ最も求められているのである。

他のコラム

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

【Rails4.2.6】wheneverを使ってバッチ処理をcronで管理する

  • 公開日:2016年06月23日

記事概要

Railsアプリでwheneverを使ってクーロンバッチを導入する方法をまとめた記事です。

環境

  • rbenv
  • bundler
  • rails 4.2.6
  • ruby 2.3.1
  • whenever 0.9.7
  • capistrano 3.2.1

whenever

wheneverはrailsでcronの設定ができるライブラリです。
railsで作成したバッチの数が増えてきたら、導入を検討すると良いと思います。

素晴らしいことに、wheneverを使っても既存のcronが変更されることはありません。
wheneverで管理するcronは、wheneverで設定しているcron処理のみが対象となります。

capistranoの自動delployにも対応しているので、リリースの自動化に使うのもオススメです。

wheneverインストール

wheneverのGemを導入するためにGemfileに記述します。

Gemfile

# Use whenever as the cron library
gem 'whenever', :require => false

gemをinstallします。

terminal

cd {project_folder}

bundle install

必要なファイルをプロジェクト内で生成します。

terminal

cd {project_folder}

bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!

以上で準備は完了です。

schedule.rbにバッチの設定

wheneverのインンストール時に作成された config/schedule.rb に設定を記述します。

サンプルを用意します。用意したサンプルのバッチ処理を手動実行する場合は

terminal

cd /home/webapp/rails/current

bundle exec rails runner Tasks::Log.execute

のように実行します。
currentはcapistranoを使ってdeployをすると作成されるフォルダです。

また、このバッチ処理はrailsで


lib/tasks/****.rb

に配置します。

このバッチ処理を1日1回夜の23時に実行する処理をwheneverで実現します。
その場合は、以下のように記述します。

{project_folder}/config/schedule.rb

# ログ出力先ファイルを指定
set :output, "log/cron_log.log"
# ジョブ実行環境を指定
# 事故防止の為RAILS_ENVの指定が無い場合にはdevelopmentを使用する
rails_env = ENV['RAILS_ENV'] || :development
set :environment, rails_env

every 1.day, :at => '11:00 pm' do
  runner "Tasks::Log.execute"
end

これでバッチの設定は完了です。

capistranoの設定

wheneverをcapistranoのdeploy時に反映されるようにします。

wheneverを反映させるもっともシンプルな方法は、railsアプリをリリースしたサーバーにログインして


RAILS_ENV=development bundle exec whenever --update-crontab

とすることです。しかし、capistranoを使えば自動化できるので、ここでは自動化にします。
コマンドの打ち忘れや、実行ミスを防ぐためにもなるべく自動化をすることが望ましいです。

まずCapfileに追記します。

{project_folder}/Capfile

require 'whenever/capistrano'

config/deploy.rbにも追加します。

{project_folder}/config/deploy.rb

# whenever setting
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

以上で準備は完了です。

capistranoの実行

上記までの設定を終えたら、いつものcapistranoコマンドでdeployが実行できます。
まずはいつものようにcheckコマンドでdeployができることを確認してください。
ここではステージングを利用します。

terminal

cd {project_folder}

bundle exec cap staging deploy:check

INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).

checkが通ったら、deploy前に現在のcronの状態を確認しておきます。

terminal

crontab -l
no crontab for vagrant

現在はcronの設定がありません。では、deployを実行してみましょう。

terminal

cd {project_folder}

bundle exec cap staging deploy

INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).

deployに成功したら、deploy後のcronの状態を確認します。

terminal

crontab -l

# Begin Whenever generated tasks for: app_staging
0 23 * * * /bin/bash -l -c 'cd /home/webapp/rails/releases/20160622052039 && bundle exec bin/rails runner -e staging '\''Tasks::Log.execute'\'' >> log/cron_log.log 2>&1'

きっちりと設定できています。

まとめ

wheneverを利用してバッチ処理を管理すると、実装ミスやリリースミスを防ぐことができます。
また、cron変更のたびにchefでプロビジョニングするよりも、管理もしやすいと思います。

以上。

PICK UP オススメ書籍

運営サイト(railsで作成しています)


参考サイト

参考記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2016年6月20日月曜日

【Rails4.2.6】deviseなしでGoogle Loginを実装する。

  • 公開日:2016年06月20日

記事概要

RailsでGoogle Loginを実装する方法を記述した記事です。
deviseを使わないやり方になります。

環境

  • rbenv
  • bundler
  • rails 4.2.6
  • ruby 2.3.0

Google Developers Console

まずは、Google Developers ConsoleでGoogle Loginの設定を行います。
必要なのは3点で、

  • プロジェクトの作成
  • 認証情報の設定
  • APIの設定

となります。

認証情報の設定

認証情報の設定は、プラットフォーム別におこないます。
Railsは、WEBアプリケーションの設定になります。

承認済みのJavaScript生成元には、Google Loginのボタンを配置するurlを入力します。

承認済みのJavaScript生成元

// for example
http://www.sample
http://dev.docker.sample

ローカル開発環境で確認する場合も、IPでなくドメインで指定する必要があります。
ドメインは、ローカルPCのhostsファイルに記述すればOKです。

続いて承認済みのリダイレクトURLを入力します。

リダイレクトURL

// for example
http://www.sample/auth/google_oauth2/callback
http://dev.docker.sample/auth/google_oauth2/callback

/auth/google_oauth2/callbackは、railsのライブラリomniauth-google-oauth2を使う場合のおまじないです。
このまま使えば良いです。

APIの設定

Contacts APIとGoogle+ APIを有効にします。
Google Developers Consoleには用意されているAPIがたくさんありますが、検索窓に「Contacts」や「Google」の文字列を入力すると簡単に見つけることができます。

以上でGoogle側の設定は完了です。

omniauth-google-oauth2

RailsアプリでのGoogleの認証ツールには、omniauth-google-oauth2を利用します。
このライブラリを利用すろと、最小限の実装でGoogle認証を実装することができます。

Gemの追加

以下のようにGemfileを修正します。

修正前

{project_folder}/Gemfile

# Use omniauth-google-oauth2 for google aut
gem "omniauth-google-oauth2"
gem "omniauth-oauth2", '~> 1.3.1'

bundleを使ってinstallします。

terminal

bundle install

インストールが正常に完了したら、実装を行います。

実装

omniauthのcallbackを受け取るコントローラーを作成します。

terminal

bundle exec rails generate controller omniauth_callbacks

ルートを設定します。

{project_folder}/Gemfile

  scope "(:locale)", locale: /ja|en/ do
    get 'auth/google_oauth2/callback', to: 'omniauth_callbacks#google_callback'
  end

auth/google_oauth2/callbackは承認済みのリダイレクトURLで設定した値です。

続いて、configを設定します。
config/initializers/omniauth.rbが存在しない場合は、ファイルから作成します。

Google Developers Consoleで記載してある値を設定します。

config/initializers/omniauth.rb

# invalid_omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"]
end

失敗時の処理

config/initializers/omniauth.rb

# invalid_omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"]
end

# failure
OmniAuth.config.on_failure = Proc.new { |env|
  OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}

ルートの設定

{project_folder}/routes.rb

  scope "(:locale)", locale: /ja|en/ do
    get "/auth/failure" => "sessions#failure"
  end

あとは、facebookやtwitterのログインと同じように登録、ログイン処理を記述すればOKです。

まとめ

Railsのomniauth-google-oauth2の記事は少ないので、実装には手間どるかもしれません。

この記事は忘備録も兼ねて、定期的に更新していきたいと思います。

以上。

PICK UP オススメ書籍

運営サイト(railsで作成しています)

関連記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...