2016年12月27日火曜日

【Ruby2.4.0 & Rails5.0.1】 rails5.0.1で稼働中のWEBアプリをruby2.3.0からruby2.4.0にアップグレードする その1 chef-client Local modeでruby2.4.0をinstallする

記事概要

rails5.0.1で稼働中のWEBアプリをruby2.3.0からruby2.4.0にアップグレードした方法をまとめた記事です。

環境

  • centos6.5
  • rails5.0.1
  • ruby2.3.0 → ruby2.4.0
  • chef
  • rbenv
  • unicorn

工数

本番導入までの時間を含めて8hくらいです。

作業内容

ruby2.3.0からruby2.4.0のアップグレードでは、以下の作業を行いました。

  • chef-client Local modeでruby2.4.0をinstall
  • railsアプリをruby2.4.0に対応させる
  • リリース

移行用のbranchの作成

gitでruby2.4.0移行用の機能ブランチを作成します。

terminal

cd {project_folder}
git branch feature-ruby2.4.0

checkoutでブランチを切り替えます。

terminal

git checkout feature-rails5.0.1

準備完了です。

chefでruby2.4.0をinstall

まず現在のrubyのversionを確認します。

terminal

ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

rbenvでinstall可能なrubyを確認します。

terminal

rbenv install -l

2.3.0
2.3.1
2.4.0-dev
2.4.0-preview1

現在の状態ではruby2.4.0のinstallはできないので、ruby-buildを更新します。

chefのroles/web.jsonファイルを確認します

roles/web.json
    "ruby_build": {
      "upgrade": "sync"
    },
    "rbenv": {
      "rubies": ["2.2.2", "2.3.0"],
      "global" : "2.3.0",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ],
        "2.3.0" : [
          { "name" : "bundler" }
        ]
      }      
    },

ruby_buildに"upgrade": "sync"が記載されていれば、chef-client Local modeを実行するだけでruby-buildが更新されます。
ruby-buildとrubyのインストールは同時にできないので、まずこの状態でchef-client Local modeを実行します。

terminal

// root化
su -

cd {chef-repo_base}

chef-client -z -j 192.168.33.10.json

実行完了後、rbenvでinstall可能なrubyを確認します。

terminal

rbenv install -l

  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev

ruby2.4.0のインストールが可能になりました。

chefのroles/web.jsonファイルを変更します

roles/web.json
    "ruby_build": {
      "upgrade": "sync"
    },
    "rbenv": {
      "rubies": ["2.2.2", "2.3.0", "2.4.0"],
      "global" : "2.3.0",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ],
        "2.3.0" : [
          { "name" : "bundler" }
        ],
        "2.4.0" : [
          { "name" : "bundler" }
        ]
      }      
    },

ruby2.4.0を追記しました。現在動いているアプリに影響がでないように、globalは2.3.0のままにしておきます。再度chef-client Local modeで実行します。

terminal

// root化
su -

cd {chef-repo_base}

chef-client -z -j 192.168.33.10.json

実行完了後に確認します。

terminal

rbenv versions
  2.2.2
* 2.3.0 (set by /usr/local/rbenv/version)
  2.4.0

ruby2.4.0のinstallに成功しました。

まとめ

ruby2.4.0のinstallは、chefを利用していればファイルの追記とコマンドの実行だけで終了します。
次回はrailsの変更の説明をします。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2016年12月25日日曜日

【Golang】Golang Gin Web Frameworkのインストール

  • 公開日:2016年12月26日

記事概要

新規アプリを学習も兼ねてGoLangのGin Web Frameworkで作ることにしました。
開発の中で得た気づきや知識を記載していきます。

環境

  • Centos6.5
  • Go 1.7.4

GoLangインストール

GoLangをcentos6.5にインストールします。
現在の最新バージョン1.7.4を使います。

terminal

// ダウンロード
wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz

// rootになる
su - 

// /usr/localフィレクトリに解凍
// -C, --directory  ディレクトリ名 指定したディレクトリに移動してから動作を始める
tar -C /usr/local -xzf go1.7.4.linux-amd64.tar.gz

// 環境変数の設定フォルダ
cd /etc/profile.d/

// goの環境変数を読み込むshを作成
touch go.sh

vi go.sh

/etc/profile.d/配下のgo.shは、サーバーログイン時に呼び出されるシェルです。(正しくは、ログイン時にシェルで*.shとして、全てのシェルが呼び出される。)
このgo.shファイルで環境変数を設定します。

/etc/profile.d/go.sh

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

GOPATHはgo getコマンドでライブラリが格納されるディレクトリです。

保存したら、一度サーバーからログアウトします。
再度サーバーにログインして、golangの設定をチェックします。

terminal

// version確認
[vagrant@vagrant-centos65 profile.d]$ go version
go version go1.7.4 linux/amd64

以上でgolangの設定が完了しました。

Gin Web Frameworkインストール

Gin Web Frameworkをインストールします。

go getコマンドは、古いcentos(6.x系)にデフォルトでinstallされているgitだと動作しません。
gitのversionが古い場合は、versionを新しくしてください。やり方がわからない場合は、この記事を参照してください。

terminal

cd $HOME
// install Gin Web Framework
go get gopkg.in/gin-gonic/gin.v1

エラーなく処理が完了すれば成功です。

プロジェクト作成

続けてプロジェクトを作成します。

terminal

cd $GOPATH/src/
mkdir sample
cd sample
touch main.go

main.goにサーバー起動処理を記述します。

main.go
package main

import (
    "os"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.String(200, "hello")
    })

    port := os.Getenv("PORT")
    if len(port) == 0 {
        port = "3000"
    }
    r.Run(":" + port)
}

ビルドして動かします。

terminal

cd $GOPATH/src/sample
go run main.go

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env: export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :3000


ブラウザでhttp:sample.com:3000にアクセスします。

表示されました。

まとめ

Gin Web Frameworkのインストールは非常にシンプルです。
centos6.5だと、gitがデフォルトの古いままだとgo getコマンドが途中で停止してしまうので注意してください。

以上。

PICK UP オススメ書籍

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

関連記事

参考記事

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

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

2016年12月24日土曜日

【Rails5.0.1】 rails5.0.0.1からrails5.0.1にアップグレードする

記事概要

rails5.0.0.1からrails5.0.1にアップグレードした時の方法をまとめた記事です。

環境

  • centos6.5
  • rails5.0.0.1 → rails5.0.1
  • ruby2.3.0
  • rbenv
  • unicorn
  • whenever

工数

全ての修正を含めて1hで完了しました。

作業内容

rails5.0.0.1からrails5.0.1のアップグレードでは、以下の作業を行いました。

  • rails5.0.1へアップデート
  • Rspecの実行

移行用のbranchの作成

gitでrails5.0.1移行用の機能ブランチを作成します。

terminal

cd {project_folder}
git branch feature-rails5.0.1

checkoutでブランチを切り替えます。

terminal

git checkout feature-rails5.0.1

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.0.1'

↓

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.1'

gem 'rails', '5.0.1'に修正し、updateします。

terminal

// update
bundle update 

bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。

念のために影響がありそうなgemのupdateはテキストに記録しておきましょう。

terminal

Installing rake 12.0.0 (was 11.2.2)
Installing arel 7.1.4 (was 7.1.1)
Installing sprockets 3.7.1 (was 3.7.0)
Bundle updated!

今回は変更が少ないですね。
フレームワークとして枯れてきた証拠です。

すべてのgemの更新に成功したら、updateの準備は完了です。

Upgrade to Rails 5.0.1

Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。

terminal

bundle exec rails app:update

ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。
私の環境では以下のようにしました。

  • config/initializers/new_framework_defaults.rb → 更新する
  • config/routes.rb → 更新しない
  • config/application.rb → 更新する
  • config/environment.rb → 更新する
  • secrets.yml → 更新しない
  • config/environments/development.rb → 更新しない
  • config/environments/production.rb → 更新しない
  • config/environments/test.rb → 更新しない
  • config/initializers/assets.rb → 更新しない
  • config/initializers/cookies_serializer.rb → 更新しない
  • config/initializers/wrap_parameters.rb → 更新しない
  • config/locales/en.yml → 更新しない

変更後は、diffで変更部分を確認しましょう。5.0.0.1からの更新の場合は、特に変更はないはずです。

最後にデグレテストとしてRspecを実行します。

terminal

bundle exec rspec

Finished in 2 minutes 0.5 seconds (files took 6.98 seconds to load)
219 examples, 0 failures

私の環境では、テストに問題はありませんでした。
今回はrailsアップデート時に発生する警告もありませんでした。毎回きちんとupdateをしていれば、今回は大きな変更はないはずです。

Rails5.0.1起動

テスト実行後は、アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.0.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2016-12-24 04:26:05] INFO  WEBrick 1.3.1
[2016-12-24 04:26:05] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-24 04:26:05] INFO  WEBrick::HTTPServer#start: pid=23502 port=3000

コンソールにRails 5.0.1 applicationが表示され、画面が表示されれば成功です。

あとはWEBを動かしながら動作を確認しましょう。

確認後は、masterにmergeして完了です。

まとめ

Rails5.0.0.1からRails5.0.1のアップデートは、簡単にアップデートできます。
もうすぐrubyのバージョンも2.4になるので、両方共に対処しておきましょう。

また、Railsのフレームワークは枯れてきて随分と落ち着きました。Ruby好きで新しい技術を習得していきながらWEBサービスを開発したいなら、Go言語 がオススメです。pythonとgoが今後、使う頻度が高くなる言語になる気がします。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2016年10月14日金曜日

【cocos2-dx Android】学習中につまづいた箇所 その2

  • 公開日:2016年10月15日

記事概要

cocos2d-xの学習中に発生したエラーと解決方法のまとめです。
忘備録的なメモですが、なにかの役に立てばと思いUPします。

使用している本(以下、教材)は

です。

環境

  • Android Studio 2.2.0
  • OS X El Capitan
  • android sdk 24
  • cocos2d-x 3.13.1

画面のサイズの調整

教材 p85 の画面のサイズの調整がうまくいかない。
コードは以下の通りです。

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 座標の設定
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

画像をスケールするように、コードを以下のように変更する

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 画像サイズの取得
  CCSize imgSize = bgSprite->getContentSize();
  // スケール
  bgSprite->setScale(visibleSize.width/imgSize.width, visibleSize.height/imgSize.height);
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

上記の実装で、画面がスケールされて表示される。
しかし、コンパイル時に以下のwarningが発生する。

terminal

warning: 'cocos2d::CCSize' is deprecated

CCSizeの実装を変更する

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 画像サイズの取得
  Size imgSize = bgSprite->getContentSize();
  // スケール
  bgSprite->setScale(visibleSize.width/imgSize.width, visibleSize.height/imgSize.height);
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

CCSize から Size にするとwarningが消えます。
ui::Buttonなども同じように画像をスケールすることで対応できました。

画面のサイズの調整2

P104 のゲーム画面の作成で、画面サイズが自分の利用している端末だとうまくいかなくて、思いどおりに作成できない事案が発生。 調べたところ、AppDelegate.cppに以下のコードを発見。

AppDelegate.cpp
static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

  if (frameSize.height > mediumResolutionSize.height)
  {
  director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
  }
  // if the frame's height is larger than the height of small size.
  else if (frameSize.height > smallResolutionSize.height)
  {
  director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
  }
  // if the frame's height is smaller than the height of medium size.
  else
  {
  director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
  }

自動生成のデフォルトコードでは、setContentScaleFactorでスケールサイズを決めている。
これは、端末のディスプレイサイズによらずサイズを指定するために使用する関数なので、学習初期には不要と判断して消して対応した。 マルチサイズは、フレームワークのメソッドの仕様をある程度把握してから取りかかる方が学習効率が良い。

以下のように変更した。

AppDelegate.cpp
static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

// if (frameSize.height > mediumResolutionSize.height)
// {
// director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
// }
  // if the frame's height is larger than the height of small size.
// else if (frameSize.height > smallResolutionSize.height)
// {
// director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
// }
  // if the frame's height is smaller than the height of medium size.
// else
// {
// director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
// }
  }

コメントアウトします。

これを外すと、スケールを考える必要がなくなる。
あとは、setPositionのVec2で微調節します。

以上です

注意

学習中なので、非効率な点があるかもしれませんが、ご容赦ください。 後で見直すので、気がついたら随時修正します。

学習時は、C++未経験ならロベールのC++も一緒に利用しましょう。 本のコード説明部分のreturn部分がよく省略されているのが気になります。

学習本

参考サイト

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

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

2016年10月13日木曜日

【cocos2-dx Android】学習中につまづいた箇所

  • 公開日:2016年10月13日
  • 最終更新日:2016年10月15日

記事概要

cocos2d-xの学習中に発生したエラーと解決方法のまとめです。
忘備録的なメモですが、なにかの役に立てばと思いUPします。

使用している本(以下、教材)は

です。

環境

  • Android Studio 2.2.0
  • OS X El Capitan
  • android sdk 24
  • cocos2d-x 3.13.1

エラー

アプリ作成後、起動するとjava.lang.UnsatisfiedLinkErrorエラーが発生しました。
エラーの発生した手順は以下の通り。

  • cocos new コマンドでcocosプロジェクトを作成
  • Android studioでビルド
  • アプリを起動
  • エラー発生

エラー詳細は以下の通りです。

terminal
/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.sample.SampleGame, PID: 6777
  java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.sample.SampleGame-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libMyGame.so"
  at java.lang.Runtime.loadLibrary(Runtime.java:366)
  at java.lang.System.loadLibrary(System.java:989)
  at org.cocos2dx.lib.Cocos2dxActivity.onLoadNativeLibraries(Cocos2dxActivity.java:248)
  at org.cocos2dx.lib.Cocos2dxActivity.onCreate(Cocos2dxActivity.java:264)
  at android.app.Activity.performCreate(Activity.java:6289)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
  at android.app.ActivityThread.access$900(ActivityThread.java:177)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:145)
  at android.app.ActivityThread.main(ActivityThread.java:5951)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

libMyGame.soがないと怒られています。

解決方法

最初のビルドはcocosコマンドで実行します。

terminal

// プロジェクトフォルダに移動
cd {プロジェクトルート}

// ビルド
cocos run -s  {プロジェクトルート} -p android --android-studio

# ビルドオプション内容
# -s : プロジェクトのベースディレクトリ
# -p : ビルドするプラットフォーム、ios, android, mac, web, win32, linux

上記でビルドすると、

terminal

The directory 'android-13' can't be found in ANDROID_SDK_ROOT/platforms, please use --ap to set needed API level

が発生しました。
対策として、SDK ManagerでAndroid3.2をダウンロードし、build.gradleのminSdkVersionを10から16に変更しました。

変更後はビルドに成功してアプリが立ちあがりました。

まとめ

仕事上の理由で利用することになったcocosですが、結構使い易い印象です。
Unitiyに押され気味ですが、頑張って欲しいです。

以上です

注意

学習中なので、非効率な点があるかもしれませんが、ご容赦ください。 後で見直すので、気がついたら随時修正します。

学習本

参考サイト

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

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

2016年10月3日月曜日

Android開発者にこそオススメの一冊 - 書評 - Java言語で学ぶデザインパターン入門 マルチスレッド編

  • 公開日:2016年10月03日

はじめに

650ページを超える本だが、Javaの知識があれば読破するのに、あまり時間はかからないだろう。 私は演習問題を含めて10時間ほどで読めた。

逆に、Javaの知識がなければ、読むのはかなり厳しいだろう。なお、インタフェースの理解は必須だ。
コードの内容が頭に入ってこない場合は、まだ読むには尚早である。 もっと力をつけてから読むと良い。

特徴

題名にデザインパターンとあるが、Javaスレッドの基本的な使いかたを丁寧に説明した本である。 デザインパターンん本ではない。題名が悪い。
Swingの開発者をターゲットとしているので、Androidアプリ開発者に適している。 スレッドだけでなくリスナーの説明があるのも良い。

一方で、WEBアプリの開発者にはまるで向かない本である。 発売時期を考えると、世に早くですぎた感が否めない。
とはいえ、Android開発者には最高の本である。
また、日本語が原書なので、日本人開発者に非常に読みやすいのも特徴だ。

できれば、手元に著者の本であるデザインパターンもあると、なお理解がしやすいだろう。

ObsevaerパターンやFlyWeightパターンの知識は、よりスレッドの理解を高めてくれる。

まとめ

優れた本はいつの時代でも役立つというお手本のような本である。 ぜひ手にとって、力をつけてほしい。

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

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

2016年9月26日月曜日

【コラム】ビットコインの実装をして見えた仮想通貨の未来

テクノロジーは金融の世界も大きく変えようとしている

フィンテックという言葉が世の中を席巻しています。
フィンテックは造語で

FinTech = Finance(金融)× Technology(技術)

という意味です。
つまり、金融とITを掛けあわせた領域のことを指しています。

日本は、いまだに現金のやりとりがメインです。なので、フィンテックと言われても、あまりピンとこない人も多いかもしれません。
しかし、テクノロジーが金融やマネーの概念を大きく変えていくことは間違いありません。

実際、株式市場ではブロックチェーン関連企業が投資家の注目を集めています。
しかし、識者や経営者のフィンテックに関する未来予想は多いですが、エンジニア視点から語られたフィンテックの未来についてはほとんど見かけません。

これは、テクノロジーに長けた識者や経営者が少ないことにも原因がありそうです。また、実際にブロックチェーンをコードレベルで実装した人が少ないからでしょう。特に、仮想通貨に関しては、技術者でもわかりにくい内容なので、ブロックチェーンという単語が過大評価されているようにも思えます。

私は最近、ビットコインのヴォレット(財布)を実装する機会があったので、ビットコインをコードレベルで把握できました。
なので、この記事では、仮想通貨の可能性についてエンジニア視点で記述しようと思います。

ビットコインと仮想通貨

ビットコインの名称を聞いたことがある人は多いと思います。
いわゆる仮想通貨です。

日本が発行する通貨は「円」で、アメリカが発行する通貨は「ドル」なのは皆さんも知っての通りです。
これら「円」や「ドル」といった通貨は国家が発行し、国家の信頼度により通貨の国際価格が決定します。これが今までの「常識」でした。

一方、ビットコインは国家が発行する通貨ではありません。ビットコインは、世界中のユーザーによって管理されます。
景気が悪いからといって紙幣をじゃぶじゃぶに刷ったりして、通貨の価格をコントロールすることはできません。

ビットコインの通貨の発行は、マイニングと呼ばれる行為を通してしか行うことができません。これは非常に賢明な設計です。

仕様を策定したSatoshi Nakamoto氏がビットコインを作った理由は、「国家の発行する紙幣はインチキだ」という考えからです。
もちろんこの意見に異を唱える人もいるでしょう。現代の資本の仕組みについては色々な意見があると思います。
しかし、今の金融資本の状況を考えると、ビットコインは出現するべくして出現した技術といってよいでしょう。

ビットコインは、現在、日本で使用できる店舗はほとんどありません。しかし、今後は少しづつ広がっていくでしょう。先日、公共料金がビットコインで支払えるようになるというニュースがありましたが、とても良い傾向だと思います。

みなさんに知っておいてほしい大切なことは、国家が保証しない通貨で取り引きが可能になったことです。
これは画期的なことです。これまでは国家が資本を管理してきました。ニクソン・ショックのインチキっぷりからもわかるように、通貨とは取引の道具でしかありません。
取引を円滑に運ぶためのルールなのです。

国が発行量を決める通貨と異なり、ビットコインはオープンソースです。つまり、世界中のあらゆる人が通貨を作成し、取引所をも作成できるようになったのです。

ブロックチェーンの正体

ビットコインといえば、ブロックチェーンという単語がバズワードとなっています。
このブロックチェーンのアルゴリズムには、以下の様なアルゴリズムが利用されています。(プログラミングJavaサイトを運営しています。開発者の人は是非利用してみてください。)

これらのアルゴリズムは昔から存在するアルゴリズムです。つまり、ブロックチェーンは、既存のアルゴリズムを組み合わせて作り出したデータ構造であり、技術なのです。

ビットコインは安全なのか

結論から言うと、「ほぼ」安全です。

今後、ハッキングするスーパーハッカーが出てこないとも限りませんが、バグはすぐに修正されるはずです。
国家がガンガンと発行する紙切れより、はるかに信頼性は高いです。

たとえ不正できても、ハッキングが可能なのは、世界でもごく一部の天才プログラマーだけです。偽札を作るようなことは一般人には不可能です。

日本の通貨「円」のデジタル化

そんな遠くない未来に、日本の通貨である円もデジタル化が検討され、実施されるでしょう。
これは、円だけでなく、ドル、元、ユーロなどもデジタル化されるはずです。

理由は簡単です。それは、

不正がほぼ不可能な上、税収漏れがなくなる

からです。
国家にとってこんな素晴らしいことはありません。

税を納める国民側からは「ふざけるな」という意見も噴出するでしょう。

しかし、ビットコインも含めたデジタル化の利点として、全てのトランザクションを記録できるということがあります。
ブロックチェーンは、あらゆる取引の記録が残ります。それは、闇の世界の取引だろうと、地下ビジネスの取引でも同様です。つまり、個人も国家も脱税は不可能です。未来にはAIを使った不正監視の導入も可能になるでしょう。ビットコインを通した取引を自動仕訳をする仕組みなども実装されるかもしれません。

よくも悪くも、世界中の国民国家による完璧な監視が可能です。

日本の通貨「円」のデジタル化の方法

現状では、通貨の作成は、ビットコインをフォークして、仕様を固めていくのが一番確実です。通貨の流通量に関しては、ビットコインのようにマイニングで国家予算のコントロールをするのは現実的ではありません。もっと柔軟な仕組みにするべきです。

また、取引量も膨大なので、巨大なデータ量のテストが必要になります。試行錯誤が必要だと思います。

もし、案件として取り組む予定がある方は、僕も誘ってくださいw 面白そうなら時間を空けて参加したいので。

強くなる企業と個人

誰でも世界中で通貨が発行できるということは、それだけ企業や個人の力が強くなります。

信用力のある企業や個人は、自らが発行する通貨で取引を完結できるようになります。

一方で、これにより生じる格差については、議論が必要です。権力が収奪的になるとイノベーションが起きなくなり、国家が衰退します。そして、結局は信用力のある企業や個人も力を失います。
日本は社会主義的な側面が強いので、注意が必要だと思います。これらの考察について詳しく学びたい方は、「国家はなぜ衰退するのか」を読んでください。

この本は起業家や資本家を目指す人には必ず読んでもらいたい本です。

まとめ

仮想通貨は、今度どんどん広がっていくでしょう。金本位制からの移行のように、ある日突然置きかわる可能性もあります。

国民が認識しておくべきことは、実装で不正が行われないことに注視することです。例えば、ある条件を満たした取引だけトランザクションから見えないようにする実装ですね。これをやられたら監視できないので、合法的な税の抜け穴になってしまいます。

どんな技術でも扱うのは人です。移行するにしても、ニクソンショックの時のようにいきなりは避けて、徐々に全世界の国民に仕様(ドラフト)を公開して欲しいですね。

PICK UP オススメ書籍

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

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

2016年9月3日土曜日

【Rails5.0.0】 rails5.0.0からrails5.0.0.1にセキュリティアップデートする

記事概要

rails5.0.0からrails5.0.0.1にセキュリティアップデートした時の方法をまとめた記事です。

環境

  • centos6.5
  • rails5.0.0→ rails5.0.0.1
  • ruby2.3.0
  • rbenv
  • unicorn

rails5.0.0.1

rails5.0.0.1はrails5.0.0の重要なセキュリティアップデートです。rails5.0.0を利用していれば、簡単にアップデートできます。
rails5.0.0を利用していない場合、このアップデートは不要です。

Gemfile編集

必要なのはGemfileの修正だけです。

{project_folder}/Gemfile

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.0'

↓

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.0.1'

gem 'rails', '5.0.0.1'に修正し、updateします。

terminal

// update
bundle update rails


Installing actioncable 5.0.0.1 (was 5.0.0)
Installing actionmailer 5.0.0.1 (was 5.0.0)
Installing railties 5.0.0.1 (was 5.0.0)
Using kaminari 0.17.0
Installing sprockets-rails 3.2.0 (was 3.1.1)

Bundle updated!

Rspecを実行します。

terminal

bundle exec rspec

Finished in 1 minute 33.89 seconds (files took 13.35 seconds to load)
201 examples, 0 failures,

動作に問題はありません。
しかし、以下の警告が出力されました。

terminal

DEPRECATION WARNING: Sprockets method `register_engine` is deprecated.
Please register a mime type using `register_mime_type` then
use `register_compressor` or `register_transformer`.
https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors

Sprocketsが3.1.1 → 3.2.0にアップデートされたので、警告が表示されています。
sass-railsを更新することで対応できます。

{project_folder}/Gemfile

# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0.5'

↓

# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0.6'

もう一度updateします。

terminal

// update
bundle update rails

Installing sass-rails 5.0.6 (was 5.0.5)
Using web-console 2.3.0
Using teaspoon-jasmine 2.3.4
Bundle updated!

Rspecで再テストします。

terminal

Finished in 1 minute 20.77 seconds (files took 11.46 seconds to load)
201 examples, 0 failures, 5 pending

完了です。
あとはブラウザで必要なテストをしていつも通りリリースします。

まとめ

以上で、Rails5.0.0.1へのセキュリティアップデート作業は終了です。

定期的に更新していれば10分で完了するので、さっさとアップデートしてしまいましょう。

以上です。

PICK UP オススメ開発環境
PICK UP オススメ書籍

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


関連記事

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

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

2016年7月26日火曜日

【Rails5.0.0】 rails4.2.5からrails5.0.0にアップグレードする その3 capistranoの修正

記事概要

rails4.2.5からrails5.0.0にアップグレードした時の方法をまとめた記事です。
Gemと設定ファイルの修正は、この記事を参考にしてください。
この記事は、capistranoの修正方法について記載しています。

環境

  • centos6.5
  • rails4.2.5 → rails5.0.0
  • ruby2.3.0
  • rbenv
  • unicorn
  • capistrano3.2.1 → capistrano3.5.0
  • whenever

capistranoの実行

capistrano3.2.1でRails5.0.0をstaging環境にリリースします。

terminal

bundle exec cap staging deploy:check

以下のエラーが発生します。

terminal

NoMethodError: undefined method `on' for main:Object

deployできなくなっています。
capistranoのgit logを追うと、このバグは3.5.0で対応されているので、capistrano3.5.0に更新します。

Gemfile修正

Gemfileを修正します。

{project_folder}/Gemfile

gem 'capistrano', '~> 3.2.1'

↓

gem 'capistrano', '~> 3.5.0'

updateします。

terminal

// update
bundle update

アップデートに成功したら、config/deploy.rbを修正します。

{project_folder}/config/deploy.rb

lock '3.2.1'

↓

lock '3.5.0'

以上で修正は完了です。
deploy:checkします。

terminal

bundle exec cap staging deploy:check

正常にdeployが通ります。

その他

その他のcapistranoのdeployツールは正常に動きました。
私の環境では他に、

  • maintenance
  • sitemap
  • whenever

を利用していますが、問題ありませんでした。

導入方法は以下のリンク記事を参考にしてください。

まとめ

以上で、Rails5.0.0の移行作業は終了です。

ここではすでにRails6のアナウンスもされています。

Rails6までには、もっと他の効率的なフレームワークが出ていて欲しいですね。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2016年7月25日月曜日

【Rails5.0.0】 rails4.2.5からrails5.0.0にアップグレードする その2 Rspecの修正

記事概要

rails4.2.5からrails5.0.0にアップグレードした時の方法をまとめた記事です。
Gemと設定ファイルの修正は、この記事を参考にしてください。
この記事は、Rspecの修正方法について記載しています。

環境

  • centos6.5
  • rails4.2.5 → rails5.0.0
  • ruby2.3.0
  • rbenv
  • unicorn
  • capistrano3.2.1 → capistrano3.5.0
  • whenever

Rspecの起動

まずはRspecを動かします。

terminal

bundle exec rspec spec

179 examples, 62 failures, 4 pending

エラーだらけでまともに動きません。修正が必要です。

rails-controller-testingの導入

Rspecを実行すると、コンソールに以下が表示されます。

terminal

NoMethodError:
        assigns has been extracted to a gem. To continue using it,
                add `gem 'rails-controller-testing'` to your Gemfile.

`assigns` and `assert_template` have been remove and extracted to a gem in Rails 5. #1393

Rails 5では、assignsとassert_templateが削除されています。
Gemfileでライブラリを追加する必要があります。

{project_folder}/Gemfile

group :test do
  gem "rails-controller-testing"
end

installします。

terminal

cd {project_folder}/

bundle install

Installing rails-controller-testing 0.1.1

さらに、spec/rails_helper.rbに設定を追加します。

{project_folder}/spec/rails_helper.rb

RSpec.configure do |config|
  [:controller, :view, :request].each do |type|
    config.include ::Rails::Controller::Testing::TestProcess, :type => type
    config.include ::Rails::Controller::Testing::TemplateAssertions, :type => type
    config.include ::Rails::Controller::Testing::Integration, :type => type
  end
end

修正が完了したら、Rspecを実行します。

terminal

bundle exec rspec spec

179 examples, 0 failures, 4 pending
OK

動くようになりました。

まとめ

Rspecは、Railsのアップデートをするたびに動かなくなる印象が強いです。
なので、公式通りに、Minitestを使った方が保守性は高くなると思います。

次回は、capistranoとその他の修正方法について記述します。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2016年7月22日金曜日

【Rails5.0.0】 rails4.2.5からrails5.0.0にアップグレードする その1 Gemと設定ファイルの修正

記事概要

rails4.2.5からrails5.0.0にアップグレードした時の方法をまとめた記事です。

環境

  • centos6.5
  • rails4.2.5 → rails5.0.0
  • ruby2.3.0
  • rbenv
  • unicorn
  • capistrano3.2.1 → capistrano3.5.0
  • whenever

工数

全ての修正を含めて1日で完了しました。

作業内容

rails5.0.0のアップグレードでは、以下の作業を行いました。

  • rails5.0.0へアップデート
  • アプリのコード修正
  • Rspecの修正
  • capistranoの修正

移行用のbranchの作成

gitでrails5移行用の機能ブランチを作成します。

terminal

cd {project_folder}
git branch feature-rails5

checkoutでブランチを切り替えます。

terminal

git branch feature-rails5

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'

↓

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.0'

gem 'rails', '5.0.0'に修正し、updateします。

terminal

// update
bundle update rails

railsの変更だけの場合、私の環境では更新に失敗しました。
以下のようなエラーが表示されました。

terminal

Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    coffee-rails (~> 4.1.0) was resolved to 4.1.1, which depends on
      railties (< 5.1.x, >= 4.0.0)

    factory_girl_rails (>= 4.1.0) was resolved to 4.6.0, which depends on
      railties (>= 3.0.0)

    jquery-rails was resolved to 4.1.0, which depends on
      railties (>= 4.2.0)

    rails (= 5.0.0) was resolved to 5.0.0, which depends on
      railties (= 5.0.0)

    rails-i18n (~> 4.0.0) was resolved to 4.0.8, which depends on
      railties (~> 4.0)

    rspec-rails was resolved to 3.4.2, which depends on
      railties (< 4.3, >= 3.0)

    sass-rails (~> 5.0) was resolved to 5.0.4, which depends on
      railties (< 5.0, >= 4.0.0)

    teaspoon was resolved to 1.1.5, which depends on
      railties (< 6, >= 3.2.5)

    web-console (~> 2.0) was resolved to 2.3.0, which depends on
      railties (>= 4.0)


Bundler could not find compatible versionsは依存関係のエラーです。
更新が必要なGemを順に切り替えていきます。

{project_folder}/Gemfile

gem 'coffee-rails', '~> 4.1.0'

↓

gem 'coffee-rails', '~> 4.2.1'

{project_folder}/Gemfile

gem "factory_girl_rails", ">= 4.1.0"

↓

gem "factory_girl_rails", ">= 4.7.0"

{project_folder}/Gemfile

gem 'rails-i18n', '~> 4.0.0'

↓

gem 'rails-i18n', '~> 5.0.0'

{project_folder}/Gemfile

gem 'sass-rails', '~> 5.0'

↓

gem 'sass-rails', '~> 5.0.5'

再度updateします。

terminal

bundle update 

bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。

terminal

Bundle updated!

すべてのgemの更新に成功したら、updateの準備は完了です。

Upgrade to Rails 5.0.0

Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。

terminal

bundle exec rails app:update

ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。

  • config/boot.rb → 更新する
  • config/routes.rb → 更新しない
  • config/application.rb → 更新する
  • config/environment.rb → 更新する
  • secrets.yml → 更新しない
  • config/environments/development.rb → どちらでも良い(config.serve_static_filesを削除)
  • config/environments/production.rb → どちらでも良い(config.serve_static_filesを削除)
  • config/environments/test.rb → 更新しない
  • config/initializers/assets.rb → 更新しない
  • config/initializers/cookies_serializer.rb → 更新しない
  • config/initializers/wrap_parameters.rb → 更新しない
  • config/locales/en.yml → 更新しない
  • bin/rails → 更新する
  • bin/setup → 更新する

以上で完了です。

Rails5.0.0起動

設定ファイルの修正が終わったら、アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2016-07-15 16:52:59] INFO  WEBrick 1.3.1
[2016-07-15 16:52:59] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-07-15 16:52:59] INFO  WEBrick::HTTPServer#start: pid=21885 port=3000

コンソールにRails 5.0.0 applicationが表示され、画面が表示されれば成功です。

あとはWEBを動かしながらdepressionメッッセージをつぶしていきます。 今後非推奨となる処理は、コンソールにdepressionが表示されます。 そのままでも動作するのですが、5.1.0で動かなうなるので、治せる箇所は今のうちに修正しておきましょう。

まとめ

Rails3からRails4にアップデートするよりは、素早くアップグレードできます。
もちろん、導入しているライブラリ次第ですが、随分と洗練されたという印象です。

この記事の通り、本番でautoloadができなくなっているので、バッチを利用している人は注意してください。
次回は、rspecの修正方法について記述します。

以上です。

追伸:この記事が600本目の記事です。
今後もよろしくお願いします。

PICK UP オススメ書籍

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


関連記事

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

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

2016年7月21日木曜日

【Rails5.0.0】 Rails4.2.5からRails5.0.0へのアップグレードでバッチが動かなくなった

  • 最終更新日:2016年07月23日

記事概要

Rails4.2.5からRails5.0.0にアップグレードしたら、既存バッチが動かなくなりました。
そのエラーの修正方法を記述した記事です。

環境

  • rails5.0.0 & centos6.5
  • ruby2.3.0
  • rbenv
  • unicorn
  • whenever

事象

Rails4.2.5からRails5.0.0へのアップグレードで、バッチが動かなくなりました。
バッチは、


{project_folder}/lib/task

に配置して、config/application.rbに


# bacth
config.autoload_paths += Dir["#{config.root}/lib"]

を記載して、クラスをオートロードしてwheneverで動かしていました。

原因

Rails5.0.0では、production environmentでboot後にautoloadingが行われなくなったためです。
こちらのgitログに変更コードとコメントが記載されています。

Autoloading of classes is now disabled in production environment by default.
If your code is dependent on autoloading in production, then you can opt out by setting `Rails.application.config.enable_dependency_loading` to true.

訳すと、

クラスのAutoloadingは、今、本番環境ではデフォルトで利用できません。
もし、アプリでAutoloadingを有効にしたいのなら、Rails.application.config.enable_dependency_loading = true
を設定してください。

なので、本番でオートロードでバッチを動かすためには、config.enable_dependency_loading = trueの設定が必要になります。

修正方法

config/environments/production.rbに以下の処理を追加します。

{project_folder}/config/environments/production.rb

  # autoloading
  config.enable_dependency_loading = true

これでオートロードが可能になり、バッチが利用できます。

まとめ

今回のRails5.0.0の変更では、config.enable_dependency_loading = trueにする必要があるのは本番環境のみです。開発環境では、設定なしで動作します。
この変更は、最低の改悪だと思うのですが、どうしようもありません。
私の環境と同じように、オートロードでバッチを利用している場合は、設定ファイルを変更して対応してください。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2016年7月5日火曜日

【Nginx】Nginxの更新 CentOS6.XでNginxを更新する

  • 公開日:2016年07月05日

記事概要

centOSでNginxを更新する方法を記述した記事です。

環境

  • Nginx 1.0.15 → 1.10.1
  • centos6.5

条件

centos6.5にNginxのインストールがされている前提

更新方法

現在のバージョンを確認します。

terminal

$ nginx -V
nginx version: nginx/1.0.15

centos6.5はデフォルトのレポジトリだと、上記の1.0.15をインストールするので、現在のリポジトリの状態を確認します。

/etc/yum.repos.d/nginx.repo

vi /etc/yum.repos.d/nginx.repo

# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

baseurlにhttp://nginx.org/packages/centos/6/$basearch/のurlが設定されてれば、updateが可能です。
実際にupdateをしてみましょう。

terminal

sudo yum update -y nginx

updateが終了したら、versionを確認します。

terminal

nginx -V
nginx version: nginx/1.10.1

正常に更新されました。

まとめ

centos6.X系を利用していても、リポジトリさえ有効になっていれば、簡単にnginxを更新できます。
Nginx ver 1.9.5からはHTTP/2もサポートされているので、なるべく最新状態を保つようにしましょう。

以上。

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

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

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

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...