2017年8月13日日曜日

【機械学習】AnacondaでOpenCVをinstallする

  • 公開日:2017年08月13日

記事概要

機械学習の環境をdockerで生成して、opencvをinstallする方法を記載した記事です。

環境

  • Docker version 17.06.0-ce
  • ubuntu 16.04.2 LTS
  • Python 3.6.1 :: Anaconda custom (64-bit)

opencvインストール

opencvをAnacondaでインストールします。

terminal

conda install -c https://conda.anaconda.org/menpo opencv3

これだけでopencvを実行しようとすると

terminal

ImportError: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory

が発生しました。
なので、以下のように対応します。

terminal

apt-get update
apt-get install libgtk2.0-0

これでopencvが動きます。

サンプルのopencv.pyファイルを作成して実行します。

opencv.py
# -*- coding: utf-8 -*-
import cv2

def main():
  print(cv2.__version__)

if __name__ == "__main__":
  main()

terminal

python opencv.py
3.1.0

opencvが動作しました。

PS : apt-get install libgtk2.0-0を実行してもdbusのエラーは残ります。conda install dbusしても修正されません。。。調べてみると、ubuntuでは色々と問題があるみたいですね。apt-get updateを実行しても問題ないようなので、このまま利用します。

まとめ

opencvをdockerとubuntuで利用するのは、あまり相性が良くないようです。opencvが古いバージョンだとうまくいくという情報もあるみたいなので、そちらを利用してもいいでしょう。
しかし、pythonの環境構築はRubyよりひどい気がします。定期的なライブラリの更新とかできるのでしょうか。

PICK UP オススメ本

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

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

2017年7月30日日曜日

【Docker】UnicodeEncodeError: 'ascii' codec can't encode characters in position. Dockerのターミナルで日本語を使う

  • 公開日:2017年07月30日

記事概要

機械学習の環境をdockerで生成して、ターミナルに日本語を出力処理するとエラーが発生します。
この記事はdockerで日本語を出力する方法を記載した記事です。

環境

  • Docker version 17.06.0-ce
  • ubuntu 16.04.2 LTS
  • Python 3.6.1 :: Anaconda custom (64-bit)

ターミナル

dockerのubuntu環境だと、デフォルトでターミネルの日本語の出力ができません。
MeCabなどを使ってprintで文字を出力しようとすると、
'ascii' codec can't encode characters in position
が発生します。

これだと使いにくいので、dockerのターミネルで日本語を利用できるようにします。

locale変更

localeを日本語に変更します。

terminal

locale

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

dockerのデフォルトは、POSIXです。なので、日本語にします。

terminal

export LC_ALL=ja_JP.UTF-8

変更を確認します。

terminal

locale
LANG=
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=ja_JP.UTF-8


これで完了です。pythonのMecabを実行して確認します。

terminal

python tolenize_ja.py
第 9 9 回 全国 高校 野球 選手権 埼玉 大会 は 、 花咲 徳 栄 が 3 年 連続 5 回 目 の 優勝 を 果たし 、 県内 1 5 6 チーム ( 1 6 1 校 ) の 頂点 に 立っ た 。 

正常に日本語が出力されました、

まとめ

機械学習の環境にDockerを使うのは、とても良い選択です。Dockerの学習は慣れるまで大変ですが、使えば使うほど生産性も向上するので、ぜひ利用してください。

PICK UP オススメ本

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

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

2017年7月9日日曜日

【Rails5.1.2】 Rails5.1.0からRails5.1.2にアップグレードする。

  • 公開日:2017年07月09日

記事概要

気づいたらRails5.1.2がリリースされたのでアップグレードしました。まとめ記事です。

環境

  • centos6.5
  • Rails5.1.0 → Rails5.1.2
  • ruby2.3.0
  • rbenv
  • unicorn
  • whenever

移行用の作業branchの作成

gitでrails5.1.2移行用の作業ブランチを作成します。

terminal

cd {project_folder}
git branch feature/rails5.1.2

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

terminal

git checkout feature/rails5.1.2

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

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

↓

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

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

terminal

// update
bundle update 

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

Bundle updated!が表示されれば成功です。5.1.0に対応してあれば、bundle updateはひっかからないはずです。

Upgrade 設定ファイル

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

terminal

bundle exec rails app:update

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

  • config/routes.rb → 更新しない
  • config/application.rb → 更新しない
  • config/secrets.yml → 更新しない
  • config/cable.yml → 更新する
  • config/puma.rb → 更新する
  • config/environments/development.rb → 更新しない
  • config/environments/production.rb → 更新しない
  • config/environments/test.rb → 更新しない
  • config/initializers/assets.rb → 更新しない
  • config/initializers/new_framework_defaults.rb → 更新しない
  • bin/setup → 更新する
  • bin/update → 更新する

更新後は、git diffでファイルを比較して必要な設定だけ元に戻します。
5.1.2は5.1.0とほとんど差異がありません。更新の目的はセキュリティアップデートとなります。

Rails5.1.2起動

アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.1.2 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2017-07-09 02:44:22] INFO  WEBrick 1.3.1
[2017-07-09 02:44:22] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-07-09 02:44:22] INFO  WEBrick::HTTPServer#start: pid=23651 port=3000

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

だいたいここまでで10分くらいです。あとは、テストコードを実行してデグレを確認します。

terminal

bundle exec rspec

Finished in 2 minutes 4.6 seconds (files took 7.11 seconds to load)
237 examples, 0 failures, 15 pending

問題ありませんでした。DEPRECATION WARNINGも発生せず。

リリース

capistrano3を使っていつも通りリリースすればOKです。少し時間がかかります。一通りの動作確認はしておきましょう。

まとめ

Rails5.1.0からRails5.1.2のアップデートは、20分もあれば完了します。
さっさと更新しておきましょう。

以上です。

PICK UP オススメ書籍

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


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

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

2017年7月8日土曜日

【Docker】DockerでWEBフロント開発の環境を構築

  • 公開日:2017年07月08日

記事概要

今はjavascriptやcssの開発でもコンパイル環境が必要になってきました。

この記事は、Dockerでフロント開発の環境を構築する方法を記載しました。webpackとbabel(とreactやvueやbackborn)を使って開発することを前提に構築します。
汎用性は求めていないので、dockerファイルは使いません。あくまでメインマシンを汚さないために、dockerで開発環境を用意します。

環境

  • macOS Sierra
  • docker 17.06.0-ce
  • Ubuntu 16.04.2 LTS
  • nvm 0.33.2
  • node v8.1.3
  • webpack 3.1.0

前提

  • dockerをインストール済み
  • webpackやbabelなどのライブラリの多少の知識がある

工数

blogを書きながらでも2時間くらいで構築できました。
私はAndroidとRailsアプリをメインで開発しているのでフロントは専門ではありませんが、慣れている人ならあっという間に終わると思います。

dockerコンテナ起動

利用するdockerイメージを確認します。

terminal(mac)

// フォルダ移動
cd /Users/dameotoko/workspace/docker

// dockerイメージの確認
docker images

ubuntu                    latest              d355ed3537e9        2 weeks ago         119MB

ubuntuのイメージを使います。
ttyでdockerを起動します。

terminal(mac)

// ttyで起動
docker run -v /Users/dameotoko/workspace/docker/react:/var/www -i -t ubuntu /bin/bash

オプション -v はVOLUME命令です。

Dockerコンテナ内の指定したパスをマウントできるように命令します。

ここではmacの/Users/dameotoko/workspace/docker/reactフォルダ配下と、dockerコンテナの/var/www配下を共有して開発するように指定しています。

共有できているか試してみます。

terminal(mac)

// mac
cd /Users/dameotoko/workspace/docker/react
touch index.html

// docker
cd cd var/www
ls -l
total 0
-rw-r--r-- 1 root root 0 Jul  8 06:07 index.html

macとdockerコンテナでファイルが連携されました。

nvmインストール

最新のnode.jsを使えるように、nvmをインストールします。
nvmは、rubyのrbenvとか、pythonのcondaと同じバージョン管理ツールです。 まずはsudoを利用可能にします。

terminal(docker)

apt-get update
apt-get install -y sudo

ソースパッケージをビルドするために必要なパッケージを事前にインストールします。

terminal(docker)

sudo apt-get install build-essential libssl-dev

curlをインストールします。

terminal(docker)

sudo apt-get install curl

nvmをインストールします。

terminal(docker)

// https://github.com/creationix/nvm
// DL
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

// shellを反映
source ~/.bashrc

nvm --version
0.33.2

nvmが正常にインストールされました。

nodeインストール

nodeをインストールします。

terminal(docker)

// 利用可能なバージョン確認
nvm ls-remote

v8.1.3

// install
nvm install 8.1.3

~/.nvm ディレクトリ配下に、指定したバージョンのnode.jsがインストールされます。

terminal(docker)

ls -l ~/.nvm/versions/node/
total 4
drwxr-xr-x 7 root root 4096 Jul  8 06:45 v8.1.3

デフォルトに設定されていることを確認します。

terminal(docker)

nvm ls
->       v8.1.3
default -> 8.1.3 (-> v8.1.3)
node -> stable (-> v8.1.3) (default)
stable -> 8.1 (-> v8.1.3) (default)


node -v
v8.1.3

npm -v
5.0.3

準備完了です。

プロジェクトHello world作成

サンプルとしてjsプロジェクを作成します。

terminal(docker)

// プロジェクトフォルダ
cd /var/www 

npm init -y

npm install --save-dev webpack babel-loader babel-core babel-preset-env babel-preset-react babel-preset-es2015

プロジェクトが作成されます。バージョン指定していないのでwebpackは3.1.0がインストールされました。
webpack.config.jsは自動作成されないので、生成します。

terminal(docker)

// 生成
touch webpack.config.js

設定を記載します。

root/webpack.config.js

module.exports = {
    // エントリポイント(最初に読まれるjs)
    entry: "./entry.js",
    // バンドルされたjsファイル(成果物)
    output: {
        // 出力先のパスを指定
        path: __dirname,
        // ビルド後のファイル名を指定
        filename: "bundle.js"
    },
    module: {
      loaders: [
        { 
          test: /\.js$/, 
          exclude: /node_modules/, 
          loader: "babel-loader", 
          query:{
            presets: ['react', 'es2015']
          }
        }
      ]
    }
};


webpack3だとloader: "babel-loader"になっているので注意してください。具体的な設定はここが参考になります。

簡単なHello worldアプリを作成します。
まずはエントリーポイントを作成します。

terminal(docker)

// 生成
touch entry.js

entry.jsを作成します。

続けてindex.htmlを作成します。

terminal(docker)

// 生成
touch index.html

htmlタグを記載します。

root/index.html

<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>webpack tutorial</title>
    </head>
    <body>
        <div id="myapp"></div>
        <script src="bundle.js"></script>
    </body>
</html>

ビルドします。

terminal(docker)

npm run build

> www@1.0.0 build /var/www
> webpack

Hash: cc0f9a75acd498c84298
Version: webpack 3.1.0
Time: 2287ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.51 kB       0  [emitted]  main
   [0] ./entry.js 13 bytes {0} [built]

babelを使ってMessageクラスを作成します。

terminal(docker)

// 生成
touch message.js

コードを記載します。

message.js

class Message {
    constructor(msg) {
        this.msg = msg;
    }
}
export default Message;

エントリーポイントで利用します。

entry.js

import Message from './message';

var message = new Message('Hello world');
console.log(message);

htmlをブラウザで開いてコンソールログを確認します。

console

Message {msg: "Hello world"}
msg
:
"Hello world"
__proto__
:
Object

うまくいきました。あとはアプリの開発をするだけです。

まとめ

webpackやbabelを使った開発ができるフロントエンジニアはまだ少ないみたいです。フロントができるといいながら、jqueryしかできない人を未だによく見かけます。時代をちゃんと追いかけましょう。

今後は他の言語と同じように開発環境の構築が求められていくはずです。複雑そうに見えますが、実際に触ってみるとそれほど難しくないので、定期的にキャッチアップしていくといいと思います。
今から学習するなら、TypeScriptとReactの組み合わせが、一番良い選択だと思います。

また、開発環境はdockerじゃなくてvagrantでも良いと思います。ただ、dockerの方が簡単だと(個人的に)思います。

また、サーバーエンジニアやスマホのネイティブエンジニアもフロントを触ってみてください。色々と知識を応用できるようになってきているので、定期的に簡単なアプリを作ると良いと思います。

以上です。

PICK UP オススメ書籍

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


参考記事

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

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

2017年6月16日金曜日

[js] webpack webpack2をインストールする

  • 公開日:2016年06月16日

記事概要

ついにrailsでもwebpackが導入されました。この記事はwebpack2のインストール方法を記載した記事です。
ここではgemを使わずに導入する方法を説明します。最初はgemを利用しない使い方を覚えた方が、長い目で見て良いと思います。
環境はcentos6.5です。

環境

  • centos6.5

webpackとは

webpackは、アプリケーションでJavaScriptモジュールをビルドするためのツールです。

nodeのインストール

まずはnode.jsをインストールします。ここでは最新版を導入します。
centos6.5はデフォルトだと古いバージョンのnode.jsをインストールしてしまうので、curlで最新のnodeを取得可能にしておく必要があります。

terminal

sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

sudo yum install nodejs

node -v
v8.1.0

npmのインストール

npmをインストールします。同じく最新版を導入します。

terminal

sudo yum install npm
sudo rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install nodejs npm --enablerepo=epel
sudo npm install -g npm

npm -v
5.0.3

以上でwebpackを導入する準備は終了です。

プロジェクトの作成とwebpackのインストール

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

terminal

mkdir study2
cd study2
// -yはpackage.jsonのデフォルトのみが使用されて、オプション入力プロンプトは表示されない
npm init -y
// webpackとローカルサーバー
npm install --save-dev webpack webpack-dev-server

モジュールはグローバルでなく、--save-devをつけてプロジェクト別に管理することが推奨されています。

package.json

package.jsonにはビルドコマンドだけ追記します。

study2/package.json

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },

npm run buildコマンドでビルドが可能になります。

webpack.config.js

最後にwebpack設定ファイルのwebpack.config.jsを作成します。

terminal

touch webpack.config.js

module.exports = {
    // エントリポイント(最初に読まれるjs)
    entry: "./entry.js",
    // バンドルされたjsファイル(成果物)
    output: {
        path: __dirname,
        filename: "bundle.js"
    }
};

touch entry.js

以上でwebpack2の導入は完了です。あとはプロジェクトに応じたライブラリを導入して素敵なJavaScriptライフを送ってください。

まとめ

webpack2はとても便利なjsの管理ツールです。
初めての使用でも、2-3時間で最低限の機能くらいは使えるようになるので、ぜひ導入してみてください。

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

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

2017年5月27日土曜日

【Android7.1】Architecture componentsの調査。AppCompatActivityでLifecycleを利用する

  • 公開日:2017年05月27日

記事概要

Google I/O 2017でandroid-architecture-componentsが発表されました。
なかなか良さそうなライブラリだったので、導入して動かしてみました。

この記事は、android-architecture-componentsを触って感じたことを記載した記事です。

環境

  • buildToolsVersion 25.0.3
  • android.arch.lifecycle 1.0.0-alpha1

lifecycleとは

ActivityやFragmentのライフサイクルに合わせてデータを管理できるライブラリです。
ドキュメントを読んでgoogle code labのサンプルを実装した感じでは、以下のような感想を持ちました。

良い点
  • オブジェクトをActivityやFragmentのライフサイクルに関連づけられるのが良い。onDestory()等の処理が楽になりそう。アプリの停止や生存チェックが減りそう。
  • SNSや通知アプリなどのpub, subを利用するアプリが作りやすくなりそう。RxJavaのFlowableを使うとよりよくなりそう。
  • 縦画面と横画面の作り分けが楽になる。これが一番大きい。
  • Roomは、ibatisに似ている。経験者はすぐに使いこなせるのではないだろうか。RxJavaと連携もできる。
悪い点
  • Observerクラス増えすぎ。どのライブラリもObserverとSubscribeで溢れている。可読性がさらにひどくなる。。
  • 開発者に要求されるハードルがまた上がる。

触った印象では、難しくはないので、考え方に慣れることが大事なのかなと思いました。

実装

1.0.0-alpha1のLifecycleActivityはFragmentActivityを継承しているクラスなので、AppCompatActivityクラスを継承したActivityクラスでは利用できません。かといってLifecycleActivityをそのまま利用するのは機能不足すぎで話になりません。しかも、This class is a temporary implementation detail until Lifecycles are integrated with support library.とあるように、LifecycleActivityは一時的な実装なので利用する意味がありません。
なので、以下のように改造します。

変更前
{project_folder}/MainActivity.java

public class MainActivity extends AppCompatActivity implements HomeFragment.OnFragmentInteractionListener, {

    public static final String TAB_HOME = "TAB_HOME";
    public static final String TAB_COLLECTION = "TAB_COLLECTION";
    public static final String TAB_NOTICE = "TAB_NOTICE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    // something...
}

変更後
{project_folder}/MainActivity.java
public class MainActivity extends AppCompatActivity implements LifecycleRegistryOwner, HomeFragment.OnFragmentInteractionListener, {
    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

    @Override
    public LifecycleRegistry getLifecycle() {
        return mRegistry;
    }

    public static final String TAB_HOME = "TAB_HOME";
    public static final String TAB_COLLECTION = "TAB_COLLECTION";
    public static final String TAB_NOTICE = "TAB_NOTICE";

    public static final String TAB_HOME = "TAB_HOME";
    public static final String TAB_COLLECTION = "TAB_COLLECTION";
    public static final String TAB_NOTICE = "TAB_NOTICE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    // something...
}

LifecycleRegistryOwnerをimplementsしてLifecycleRegistryのインスタンスをもたせます。これで、AppCompatActivityでも利用可能になります。
あとはViewModelProvidersを使えば、ViewModelのオブジェクトを管理できます。

Activityに付加したFragmentでViewModelを管理する場合は、以下のように実装します。

{project_folder}/HomeFragment.java
public class HomeFragment extends Fragment {
    public static final String TAG = "HomeFragment";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        homeModel = ViewModelProviders.of(getActivity()).get(HomeModel.class);
    }

    // something...
}

これにより、画面の回転などでonCreate()の再呼び出しをしてもViewModelを継承したモデルから値を取得することが可能になります。

結論

android-architecture-componentsはsupport libraryと同様、デファクトのライブラリになりそうな気がします。

この他にも、通知やDBでも活躍できそうなので、色々と試していきたいですね。

PICK UP

運営サイト


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

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

2017年5月20日土曜日

[git] squashでコミットをまとめる

  • 公開日:2016年05月20日

記事概要

gitのsquashを使ってコミットをまとめる時のやり方。ターミナルコマンドを使います。

環境

  • git version 2.6.4

やりたいタスク

直近4つのコミットを一つにまとめます。
対象は色々な修正を加えたsample.txtです。

terminal

// コマンド
git log --oneline

a108a12 sample/feature completed.
ba18359 deleted comment.
a7711e0 updasted comment.
adf6be6 added comment.
2ca3f88 first commit

直近a108a12からadf6be6までの4つのコミットをまとめて、直近a108a12のコメントに変更します。
開発現場でよくあるパターンです。

順序

rebaseコマンドで直近の4つのコミットを選択します。

terminal

// コマンド
git rebase -i HEAD~4

pick adf6be6 added comment.
pick a7711e0 updasted comment.
pick ba18359 deleted comment.
pick a108a12 sample/feature completed.

# Rebase 2ca3f88..a108a12 onto 2ca3f88 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

古いコミット順で表示されるので、注意してください。一番古いコミット以外をsに変更します。

terminal

pick adf6be6 added comment.
s a7711e0 updasted comment.
s ba18359 deleted comment.
s a108a12 sample/feature completed.

一番古いコミット以外をsに変更します。最初(一番古い)のコミットはsにしてはいけません。sを指定したコミットの内容が、前のコミットに統合(melt)されるイメージです。時系列が逆なので最初は理解しにくいですが、仕様なので慣れてください。
修正したら:wqで上書き保存します。

コミット内容が表示されます。

terminal

# This is a combination of 4 commits.
# The first commit's message is:
added comment.

# This is the 2nd commit message:

updasted comment.

# This is the 3rd commit message:

deleted comment.

# This is the 4th commit message:

sample/feature completed.

残したいコミットメッセージ以外を削除します。もちろんメッセージを変更しても問題ありません。

terminal

# This is a combination of 4 commits.
# The first commit's message is:

# This is the 2nd commit message:


# This is the 3rd commit message:


# This is the 4th commit message:

sample/feature completed.

変更したら:wqで上書き保存します。

terminal

Successfully rebased and updated refs/heads/master.

成功です。ログを確認します。

terminal

// コマンド
git log --oneline

4a709e3 sample/feature completed.
2ca3f88 first commit

綺麗にログがまとまりました。

ログの内容をすでにpull requestしている場合は、force pushすれば強制的に上書きできます。(他の人がファイルをいじってないことを確認しましょう)

まとめ

gitはとても便利なのですが、ググっても間違った情報が引っかかるケースが多いと思います。
周りの人に聞いたり、公式サイトを利用して正しく効率的なやり方を身につけてください。

PICK UP オススメ書籍

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

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

2017年5月6日土曜日

【Unity5.6.0f3】error CS0234: The type or namespace name `CrossPlatformInput' does not exist in the namespace.

  • 公開日:2017年05月06日

記事概要

Unityの学習中に発生したエラーの解決メモ。

環境

  • macOS Sierra
  • Unity5.6.0f3

発生

Unityのチュートリアルでキャラクターを配置したらerror CS0234: The type or namespace name `CrossPlatformInput' does not exist in the namespaceが発生しました。

原因

エラーの通りCrossPlatformInputがインポートされていないためです。

修正方法

AssetsにCrossPlatformInputを追加します。

fig1:CrossPlatformInputを追加

AssetsにCrossPlatformInputが追加されていることを確認します。

コンパイルが可能になり、動作が確認できるようになります。

fig3:play

動作が確認できました。

PICK UP オススメ書籍

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


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

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

2017年5月5日金曜日

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

  • 公開日:2017年05月05日

記事概要

ようやくRails5.1.0がリリースされたのでアップグレードしました。まとめ記事です。

環境

  • centos6.5
  • Rails5.0.1 → Rails5.1.0
  • ruby2.3.0
  • rbenv
  • unicorn
  • whenever

はじめに

Rails5.1.0は、Rails5.0.x系と比較すると変更点が多いです。以前の記事で5.0.x系との差異を記載しているのでそちらを参考にしてください。

移行用の作業branchの作成

以前の記事で記載しているように、2ヶ月ほど前にRails5.1.0 beta1で、移行テスト済みなので一気に作業をやっていきます。
Railsのバージョンアップをする場合は、betaの段階で1度テストをしておくことをお勧めします。

gitでrails5.1.0移行用の作業ブランチを作成します。

terminal

cd {project_folder}
git branch feature/rails5.1.0

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

terminal

git checkout feature/rails5.1.0

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

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

↓

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

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

terminal

// update
bundle update 

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

Bundle updated!が表示されれば成功です。5.0.1に対応してあれば、bundle updateはひっかからないはずです。

Upgrade 設定ファイル

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

terminal

bundle exec rails app:update

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

  • config/routes.rb → 更新しない
  • config/application.rb → 更新しない
  • config/secrets.yml → 更新する
  • config/cable.yml → 更新する
  • config/puma.rb → 更新する
  • config/environments/development.rb → 更新する
  • config/environments/production.rb → 更新する
  • config/environments/test.rb → 更新する
  • config/initializers/assets.rb → 更新する
  • config/initializers/new_framework_defaults.rb → 更新しない
  • bin/setup → 更新しない
  • bin/update → 更新しない

更新後は、git diffでファイルを比較して必要な設定だけ元に戻します。

config/environments/production.rb

Rails5.1.0では、config.read_encrypted_secrets = trueが追加されました。
暗号の管理方法が変わりました。

既存のsecrets.ymlでも動くので、Encrypted secretsの導入は少し待ってからの方が良いかもしれません。これだと管理が煩雑になって、まだデメリットの方が多い気がします。

Rails5.1.0 Encrypted secretsの対応

暗号の管理方法が変更されたので対応します。terminalを開きます。

terminal
bin/rails secrets:setup

config/secrets.yml.key
append  .gitignore
create  config/secrets.yml.enc

You can edit encrypted secrets with `bin/rails secrets:edit`.
Add this to your config/environments/production.rb:
config.read_encrypted_secrets = true

これだけです。パスワードの入ったsecrets.yml.keyファイルは、.gitignoreに自動で追加されます。 config/secrets.yml.encはgitで管理可能です。pushしてもOKです。

また、config/environments/production.rbにconfig.read_encrypted_secrets = trueが追加されていることも確認してください。
あとは、本番でconfig/secrets.yml.keyのuploadを忘れないようにしましょう。開発環境で有効にする必要はないとは思いますが、本番と同じにしたい人はconfig.read_encrypted_secrets = trueを追加しても良いと思います。

secrets.yml.keyは紛失しないように忘れずに別管理にします。(この辺がセキュリティのためとはいえ納得いかないとこですね。面倒くさい。)

Rails5.1.0 rails-ujs対応

rails-ujsを導入すれば、jquery_ujsが不要になります。jqueryの処理に依存している人は、jqueryの処理も書き換える必要があります。時間をとって乗り換えましょう。

config/environments/development.rb
# Use jquery as the JavaScript library
#gem 'jquery-rails'

gem 'rails-ujs'

インストールします。

terminal

// update
bundle update 

Installing rails-ujs 0.1.0

インストールしたら、application.jsを修正します。

assets/javascript/application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

↓

//= require rails-ujs
//= require turbolinks
//= require_tree .

せっかく書き換えるなら、今だとTypeScriptに変更するのがいいのではないでしょうか。

Rails5.1.0起動

アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.1.0.beta1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2017-03-20 14:24:05] INFO  WEBrick 1.3.1
[2017-03-20 14:24:05] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-03-20 14:24:05] INFO  WEBrick::HTTPServer#start: pid=10639 port=3000

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

だいたいここまでで1時間くらいです。あとは、テストコードを実行してデグレを確認します。

terminal

bundle exec rspec

Finished in 1 minute 58.72 seconds (files took 7.84 seconds to load)
230 examples, 0 failures, 14 pending

問題ありませんでした。DEPRECATION WARNINGで修正可能なエラーは今のうちに修正します。Rails5.2.0の対応も済ませてしまいましょう。

capistrano

capistranoも修正します。config/secrets.yml.keyにもSymbolic linkが作成されるようにします。

config/deploy.rb

set :linked_files, %w{config/database.yml}

↓

# Default value for :linked_files is []
set :linked_files, %w{config/database.yml config/secrets.yml.key}

ググるとupload処理をconfig/deploy.rbに記述しているケースをちょくちょく見かけます。この場合、ファイルがないとdeploy:checkが通らなくなるので、やらない方が良いと思います。ファイルは直接アップロードしておくのがcapistranoの仕様になってます。フォルダは自動生成してくれますが、ファイルはしてくれません。

リリース

capistrano3を使っていつも通りリリースすればOKです。少し時間がかかります。一通りの動作確認はしておきましょう。

まとめ

Rails5.0.1からRails5.1.0のアップデートは、それなりに手間がかかると思います。特にフロントエンドが複雑なWEBアプリだと苦戦するかもしれません。
私は既にRails5.1.0にアップロードしましたが、Fix版が出て安定してからでも良いかなと思いました。

あとはそろそろ、Ruby2.4.0への更新とリファクタリングも済ませてしまうと良いでしょう。

あとはdockerがいい感じに枯れてきたので、そろそろ本番で使っても良いかもしれないですね。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2017年4月15日土曜日

【Android7.1】EventBusまとめ

  • 公開日:2017年04月15日

記事概要

EventBusの調査メモ。取り急ぎのまとめです。
プログラミングJava用にソースコード書いてgitにあげたり、動画撮ったり、英語にしてまとめるかは微妙です。純正ライブラリでないですし。アクセス数見て考えます。

環境

  • buildToolsVersion 25.0.2
  • EventBus 3.0.0
  • Android Studio 2.3.1

対象

pub, subの概念を理解している人。

git

ここのサイトから取得できます。

特徴(長所)

  • コンポーネント間の通信を簡素化
  • イベントの送信者と受信者を切り離す
  • アクティビティ、フラグメント、およびバックグラウンドスレッドで使える
  • 複雑でエラーを起こしやすい依存関係やライフサイクルの問題を避ける
  • コードをシンプルにする
  • 速い
  • 小さい(約50k)

特徴(欠点)

  • コードが直感的でない
  • Eventが増えるとコードのつながりがわかりにくくなる

Install

build.gradleファイルに以下の内容を記述します。

{project_folder}/build.gradle

dependencies {
  compile 'org.greenrobot:eventbus:3.0.0'
}

Android Studio Plugin

EventBusの欠点は、コードが直感的で無くなることです。
なので、Android Studio Pluginを導入して、コードリーディングの軽減を図るのは良い考えです。

ここのサイトから取得できます。
もしくはAndroid StudioのPluginでEventBus3で検索しましょう。

Hello EventBus

実際に実装してみましょう。
fragmentのButtonからActivityに通知してみます。

{project_folder}/MainActivity.java

  @Override
  public void onStart() {
      Log.d("MainActivity", "onStart");
      super.onStart();
      EventBus.getDefault().register(this);
  }

  @Override
  public void onStop() {
      Log.d("MainActivity", "onStop");
      super.onStop();
      EventBus.getDefault().unregister(this);
  }

  @Subscribe(threadMode = ThreadMode.MAIN)
  public void onMessageEvent(MainFragment.MessageEvent event) {
      Log.d("MainActivity", "onMessageEvent");
      Toast.makeText(getApplicationContext(), event.msg, Toast.LENGTH_SHORT).show();
  }

コードはSubscribeメソッドから記述します。メソッドには@Subscribeアノテーションを付加します。この時、@Subscribeメソッドの名前はなんでもOKです。

EventBus.getDefault().register(this);でSubscribeを登録します。registerを呼び出したクラスに@Subscribeアノテーションを追加したメソッドがないとエラーが発生します。

Error

super classes have no public methods with the @Subscribe annotation
Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.xxxx.MainActivity and its super classes have no public methods with the @Subscribe annotation

また、複数回registerを呼び出すとクラッシュします。

Error

Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.xxxx.MainActivity already registered to event class

以下の実装箇所で引っかかります。

Error

if (subscriptions.contains(newSubscription)) {
    throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event " + eventType);
}

DialogやカスタムViewを使った場合も実装方法は同じです。

Configuration

不要だと思います。デフォルト設定で良いでしょう。

Sticky Events

複雑になるだけです。いりません。

Subscriber Index

EventBus version3から導入された新機能です。初期Subscribeの登録を高速化して最適化します。最高のパフォーマンスを得るために、使用が推奨されています。
まあ、使えってことです。

build.gradleファイルに以下の内容を記述します。

{project_folder}/build.gradle

android {
  defaultConfig {
    javaCompileOptions {
      annotationProcessorOptions {
        arguments = [ eventBusIndex : 'com.example.xxx.EventBusIndex' ]
      }
    }
  }
}

dependencies {
  compile 'org.greenrobot:eventbus:3.0.0'
  annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}

初期化してSubscribeを登録してindex化するので、Applicationクラスを使います。無い場合は作成します。

{project_folder}/MyApplication.java

public class MyApplication extends Application {
  @Override
  public void onCreate() {
      super.onCreate();
      EventBus.TAG = "MyApplication-EVENT";
      EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
  }
}

新規作成の場合は、AndroidManifest.xmlも忘れないで設定します。

{project_folder}/AndroidManifest.xml

application
  android:name="com.example.xxx.MyApplication"

以上です。pub, subの処理は変わりません。なぜなら、EventBus.getDefault()メソッドでは、EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();で作成したEventBusのインスタンスを使い回すからです。
細かい動きが気になる人はコードを読んで見ると良いでしょう。

結論

EventBusは便利なライブラリです。とはいえ、コードが読みにくくなるので、階層の離れたviewからAcitivtyに伝えるなどのケース以外ではあんまり使いたくないですね。
やっぱりcallbackをなるべく使うべきな気がします。でも、RxJavaのPub, Subよりは使いやすいです。

以上です。

PICK UP

運営サイト


参照

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

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

2017年3月20日月曜日

【Rails5.1.0beta1】 Rails5.0.1からRails5.1.0beta1にアップグレードする。 Rails5.1.0更新の準備と調査

  • 公開日:2017年03月20日
  • 最終更新日:2017年05月05日

記事概要

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

環境

  • centos6.5
  • Rails5.0.1 → Rails5.1.0beta1
  • ruby2.3.0 → ruby2.4.0
  • rbenv
  • unicorn
  • whenever

はじめに

Rails5.1.0beta1がリリースされたので、Rails5.1.0の準備を開始しました。
今回は変更点が多いので、Rails5.1.0beta1の状態ではリリースせず、Rails5.1.0になってからリリースをしたいと思います。
また、この機会に色々とRailsアプリのリファクタリングをしていこうと思っています。
ずっとAndroid開発で放置状態だったので。出し惜しみしないで、ブログに情報も載せていこうと思います。

Rails5.1.0の変更点

Rails5.1.0は、Rails5.0.1と比較すると大きく変わりました。変更点の概要を以下に記述します。

  • YarnでjavaScriptを管理
  • webpackでビルドが可能
  • jQueryが不要になった(rails-ujsに書き直された)
  • 機能テスト用のライブラリCapybaraが正式にサポート
  • 暗号の管理方法変更
  • routesの改良
  • form_withでform_tag / form_forを統一
  • 4.x以前はサポートしない

凄まじい量の変化です。なので、今から少しづつ対応していきましょう。

作業内容

今回のRails5.1.0のアップグレードでは、以下のタスクを行っていく予定です。

  • jQueryをrails-ujsに置き換える
  • Capybaraの導入
  • CIの設定
  • 暗号の管理方法変更
  • routesの改善
  • form_withでform_tag / form_forを統一
  • Ruby2.4のコードにリファクタリング

最低限でこれくらいありますね。Ruby2.4のFixnumの改善も対応したっぽいので、コードも本格的に修正します。頭痛くなってきた。。。

移行用の作業branchの作成

gitでrails5.1.0beta1移行用の作業ブランチを作成します。

terminal

cd {project_folder}
git branch feature/rails5.1.0beta1

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

terminal

git checkout feature/rails5.1.0beta1

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

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

↓

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.1.0.beta1'

gem 'rails', '5.1.0.beta1'に修正し、updateします。

terminal

// update
bundle update 

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

terminal

Fetching git://github.com/capistrano/rbenv.git
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.................
Using rake 12.0.0
Installing concurrent-ruby 1.0.5 (was 1.0.3)
Installing i18n 0.8.1 (was 0.7.0)
Using minitest 5.10.1
Installing thread_safe 0.3.6 (was 0.3.5)
Installing builder 3.2.3 (was 3.2.2)
Installing erubi 1.6.0
Using mini_portile2 2.1.0
Using rack 2.0.1
Installing nio4r 2.0.0 (was 1.2.1) with native extensions
Using websocket-extensions 0.1.2
Using mime-types-data 3.2016.0521
Installing arel 8.0.0 (was 7.1.4)
Installing net-ssh 4.1.0 (was 3.2.0)
Using ast 2.3.0
Using debug_inspector 0.0.2
Using bundler 1.11.2
Installing byebug 9.0.6 (was 9.0.5) with native extensions
Installing capistrano-harrow 0.5.3 (was 0.5.2)
Using chronic 0.10.2
Installing coffee-script-source 1.12.2 (was 1.10.0)
Using execjs 2.7.0
Using method_source 0.8.2
Using thor 0.19.4
Using database_cleaner 1.5.3
Installing diff-lcs 1.3 (was 1.2.5)
Using multipart-post 2.0.0
Installing hashie 3.5.5 (was 3.4.4)
Using multi_json 1.12.1
Installing json 1.8.6 (was 1.8.3) with native extensions
Installing jwt 1.5.6 (was 1.5.4)
Installing kaminari-core 1.0.1
Installing kgio 2.11.0 (was 2.10.0) with native extensions
Installing libv8 3.16.14.19 (was 3.16.14.15)
Installing multi_xml 0.6.0 (was 0.5.5)
Installing mysql2 0.4.5 (was 0.4.4) with native extensions
Using powerpack 0.1.1
Installing rainbow 2.2.1 (was 2.1.0) with native extensions
Installing raindrops 0.17.0 (was 0.16.0) with native extensions
Installing rdoc 4.3.0 (was 4.2.2)
Using ref 2.0.0
Using rspec-support 3.5.0
Using ruby-progressbar 1.8.1
Installing unicode-display_width 1.1.3 (was 1.1.0)
Installing sass 3.4.23 (was 3.4.22)
Installing tilt 2.0.7 (was 2.0.5)
Using turbolinks-source 5.0.0
Using tzinfo 1.2.2
Installing sitemap_generator 5.3.1 (was 5.1.0)
Installing nokogiri 1.7.0.1 (was 1.6.8.1) with native extensions
Using rack-test 0.6.3
Using sprockets 3.7.1
Installing websocket-driver 0.6.5 (was 0.6.4) with native extensions
Using mime-types 3.1
Using net-scp 1.2.1
Installing parser 2.4.0.0 (was 2.3.1.2)
Using binding_of_caller 0.7.2
Using whenever 0.9.7
Using coffee-script 2.4.1
Installing uglifier 3.1.9 (was 3.0.0)
Installing faraday 0.11.0 (was 0.9.2)
Installing omniauth 1.6.1 (was 1.3.1)
Installing unicorn 5.2.0 (was 5.1.0) with native extensions
Installing sdoc 0.4.2 (was 0.4.1)
Installing therubyracer 0.12.3 (was 0.12.2) with native extensions
Installing rspec-core 3.5.4 (was 3.5.1)
Using rspec-expectations 3.5.0
Using rspec-mocks 3.5.0
Installing turbolinks 5.0.1 (was 5.0.0)
Installing activesupport 5.1.0.beta1 (was 5.0.1)
Using loofah 2.0.3
Using mail 2.6.4
Installing sshkit 1.12.0 (was 1.11.1)
Installing rubocop 0.47.1 (was 0.41.2)
Installing oauth2 1.3.1 (was 1.2.0)
Using webpay 3.2.3
Installing rails-dom-testing 2.0.2 (was 2.0.1)
Using globalid 0.3.7
Installing activemodel 5.1.0.beta1 (was 5.0.1)
Installing factory_girl 4.8.0 (was 4.7.0)
Installing jbuilder 2.6.3 (was 2.5.0)
Installing spring 2.0.1 (was 1.7.2)
Using rails-html-sanitizer 1.0.3
Installing airbrussh 1.1.2 (was 1.0.2)
Using omniauth-oauth2 1.4.0
Installing activejob 5.1.0.beta1 (was 5.0.1)
Installing activerecord 5.1.0.beta1 (was 5.0.1)
Installing actionview 5.1.0.beta1 (was 5.0.1)
Using capistrano 3.5.0
Using omniauth-google-oauth2 0.4.1
Installing kaminari-activerecord 1.0.1
Installing actionpack 5.1.0.beta1 (was 5.0.1)
Installing kaminari-actionview 1.0.1
Using capistrano-bundler 1.1.4
Installing capistrano-maintenance 1.2.0 (was 1.0.0)
Using capistrano-rbenv 2.1.0 (was 2.0.4) from git://github.com/capistrano/rbenv.git (at master@4483faf)
Using capistrano-ssh-doctor 1.0.0
Using capistrano3-unicorn 0.2.1
Installing actioncable 5.1.0.beta1 (was 5.0.1)
Installing actionmailer 5.1.0.beta1 (was 5.0.1)
Installing railties 5.1.0.beta1 (was 5.0.1)
Using sprockets-rails 3.2.0
Installing rails-controller-testing 1.0.1 (was 0.1.1)
Installing kaminari 1.0.1 (was 0.17.0)
Installing capistrano-rails 1.2.3 (was 1.1.7)
Using coffee-rails 4.2.1
Installing factory_girl_rails 4.8.0 (was 4.7.0)
Installing jquery-rails 4.2.2 (was 4.1.1)
Installing rails-i18n 5.0.3 (was 5.0.0)
Installing rspec-rails 3.5.2 (was 3.5.1)
Using teaspoon 1.1.5
Installing rails 5.1.0.beta1 (was 5.0.1)
Using sass-rails 5.0.6
Using web-console 2.3.0
Using teaspoon-jasmine 2.3.4
Bundle updated!

一発でうまくいきました。5.0.1に対応してあれば、bundle updateはひっかからないようです。

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

Upgrade to Rails5.1.0beta1

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

terminal

bundle exec rails app:update

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

  • config/routes.rb → 更新しない
  • config/application.rb → 更新しない
  • config/secrets.yml → 更新する
  • config/cable.yml → 更新する
  • config/puma.yml → 更新する
  • config/environments/development.rb → 更新する
  • config/environments/production.rb → 更新する
  • config/environments/test.rb → 更新する
  • config/initializers/assets.rb → 更新する
  • config/initializers/new_framework_defaults.rb → 更新しない
  • bin/setup → 更新しない
  • bin/update → 更新しない

diffで確認したところ、変更点で気をつける点は以下です。

config/environments/development.rb

ActiveSupport::EventedFileUpdateCheckerがデフォルトで有効になっています。
vagrantやdocker等の仮想環境で開発をしている場合は無効にしておいた方が良いです。更新が反映されなくなることがあります。

config/environments/development.rb
  config.file_watcher = ActiveSupport::EventedFileUpdateChecker

  # config.file_watcher = ActiveSupport::EventedFileUpdateChecker 

config.assets.digest = trueが削除さています。
これも不要みたいです。毎回コンパイルされるのかな。。。

config/environments/production.rb

config.read_encrypted_secrets = trueが追加されました。
暗号は管理方法が変わりました。

Rails5.1.0beta1 Encrypted secretsの対応

下記のやり方だと、Rails5.1.0では動作しませんでした。既存のsecrets.ymlでも動くので、Encrypted secretsの導入は少し待ってからの方が良いかもしれません。これだと管理が煩雑になって、デメリットの方が多い気がします。

暗号の管理方法が変更されたので対応します。terminalを開きます。

terminal
bin/rails secrets:setup

config/secrets.yml.key
append  .gitignore
create  config/secrets.yml.enc

You can edit encrypted secrets with `bin/rails secrets:edit`.
Add this to your config/environments/production.rb:
config.read_encrypted_secrets = true

これだけです。パスワードの入ったsecrets.yml.keyファイルを.gitignoreに自動で追加してくれます。 config/secrets.yml.encはgitで管理可能です。pushしてもOKです。

また、config/environments/production.rbにconfig.read_encrypted_secrets = trueが追加されていることも確認してください。
あとは、本番でconfig/secrets.yml.keyのuploadを忘れないようにしましょう。開発環境で有効にする必要はないとは思いますが、本番と同じにしたい人はconfig.read_encrypted_secrets = trueを追加しても良いと思います。

Rails5.1.0beta1 rails-ujs対応

rails-ujsを導入すれば、jQueryが不要になります。jQueryなしで動くように書き直されたようです。素晴らしい!!

デバッグ中にバグが出ました。jqueryに依存しているところは書き直しが必要です。

config/environments/development.rb
# Use jquery as the JavaScript library
#gem 'jquery-rails'

gem 'rails-ujs'

インストールします。

terminal

// update
bundle update 

Installing rails-ujs 0.1.0

インストールしたら、application.jsを修正します。

assets/javascript/application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

↓

//= require rails-ujs
//= require turbolinks
//= require_tree .

Rails5.1.0beta1起動

アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.1.0.beta1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2017-03-20 14:24:05] INFO  WEBrick 1.3.1
[2017-03-20 14:24:05] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-03-20 14:24:05] INFO  WEBrick::HTTPServer#start: pid=10639 port=3000

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

私の環境では問題なく動いているようです。jqueryがなくなって、rails-ujsになったので、動きが軽くなった気がします。計測はしていませんけどね。
だいたいここまでで3時間くらいです。とはいえ、ここからが本番ですが。

まとめ

Rails5.0.1からRails5.1.0beta1のアップデートは、多くの変更が必要になります。
4.x以下は切り捨てられるので、早めに更新の準備をしましょう。また、Fixnumの改善も対応済み(らしい)ので、この機会にRuby2.4.0へのリファクタリングも済ませてしまうと良いでしょう。

タスクが完了するまで継続的にブログも更新します。

以上です。

PICK UP オススメ書籍

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


関連記事

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

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

2017年3月11日土曜日

2017年3月に読んだ本 2/20 - 3/11日まで

  • 公開日:2017年03月11日

目的

ネットの情報がテレビ化してつまらなくなってきたので、2017年からは再び読書量を増やそうと思います。
読書記録のまとめです。

前回の記録はこちらです。

今年(2017年)の読書数 : 現在 20冊(2017/01/01 - 2017/03/11)

RxJavaリアクティブプログラミング

  • 開始:2017年02月20日 - 終了 : 2017年02月24日
  • 評価 : A

丁寧に説明されていますが、リアクティブプログラミングの経験がないと、理解できない可能性が高いと思います。逆に、リアクティブプログラミングの経験がある人には良書です。Rxjavaを使う開発時には、側に置いておきたい本です。

詳細な書評も書いています。参考にしてください。

科学雑誌Newton2017/04月号

  • 開始:2017年02月26日 - 終了 : 2017年02月28日
  • 評価 : A

宇宙の特集が面白かったです。シリーズ 炭素の科学の2回目も面白かったです。
全体的に先月より良かったです。

ナショナルジオグラフィック2017/03月号

  • 開始:2017年03月01日 - 終了 : 2017年03月08日
  • 評価 : B

今月号はイマイチでした。洞窟の特集はよかったです。来月号に期待です。

難しいことはわかりませんが、お金の増やし方を教えてください!

  • 開始:2017年03月11日 - 終了 : 2017年03月11日
  • 評価 : A

良い本です。最近はお金の本はあまり読まなくなったのですが、この本は読んでおくべきです。そして、投資未経験の人は少しづつ投資を始めていきましょう。とはいえ、サラリーマンの源泉徴収の仕組みを変えないと日本で投資が活発になるとは思えませんけどね。

確定拠出年金の教科書

  • 開始:2017年02月28日 - 終了 : 2017年03月12日
  • 評価 : A

確定拠出年金の法律が変わったので、基本を抑えるために購入しました。しかし、これだけの仕組みを作ったということは、老後の生活は自分で責任を持ってくれと、政府から国民に暗に伝えているのと同じですね。でも、日本で投資をきちんとお金を運用できるのは人口の1割だと思います。

まとめ

投資本は最近読んでいなかったのですが、山崎 元さんの本が面白かったので、2冊続けて購入しました。両方ともよかったです。しかし、日本では全然投資が浸透しませんね。僕の周りでも未だにほとんど投資はやってません。お金なんて道具だと思うんですどね。。。

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

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

2017年3月4日土曜日

【Android7.1】android.support:designのsetDrawerListenerがdeprecatedになった対応方法

  • 公開日:2017年03月05日

記事概要

Androidのアプリ開発で、setDrawerListenerがdeprecatedになりました。
この記事は、その修正方法を記載した記事です。

環境

  • buildToolsVersion 25.0.2
  • com.android.support:design 25.1.1

事象

Androidアプリのコードで記載したsetDrawerListenerがdeprecatedになりました。つーかこのメソッド、Android Studioで自動生成されるんですけど……

修正方法

setDrawerListenerメソッドをaddDrawerListenerメソッドに差し替えます。

変更前
{project_folder}/MainActivity.java

        drawer.setDrawerListener(toggle);

変更後
{project_folder}/MainActivity.java

        drawer.addDrawerListener(toggle);

上記の変更でdeprecatedが消えます。
ソースコードを比較して読んでみると、確かにsetDrawerListenerのメソッドは古臭いので、変更しておきましょう。

結論

簡単な修正なので、プログラミングJavaでなく、ブログで公開しました。プログラミングJavaのサイトも引き続きよろしくお願いしましす。高度な記事もそろそろ追加していきます。

にしても、時々おかしなコード混ざってますよね。オープンソースだから、仕方ないんですけど。でも、railsよりマシかな。。。rails5.1のアップデート大変そうですね。そろそろ取り組んでいかないとダメですね。

PS : Androidを支える技術〈I〉を読んでいます。終わったら感想書くかも。。。

以上です。

PICK UP

運営サイト


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

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

2017年2月26日日曜日

【コラム】プログラミングと英語は選択制にした方が良いのではないか。

  • 公開日:2017年02月26日

プログラミングと英語は道具。選択制で十分だと思うのだが…

2020年度以降の学習指導要領で、小学校から英語が教科化し、プログラミングが必修になることが決まりました。

これは愚策だと思います。私は仕事柄プログラミングと英語を使いますが、結局、プログラミングも英語も道具でしかないと思っています。この2つの現代ツールは過大評価されすぎです。

プログラミングや英語は、国語や算数や理科とは根本的に違います。小学生のうちは、道具の使い方よりも基本的な学力を伸ばすのに時間を使った方が、将来の役にたつ能力が身につきます。
というのも、道具は使い手の力量次第で、ゴミにも世界を制する武器にもなるからです。例えば、プログラミングで画像処理をする場合、微分積分と線形代数の理解が必要です。今をときめくAI技術、機械学習ならプラスで確率と統計学です。ハード系に関わるなら解析学や物理学、化学や電気回路の学習が必要です。英語はドキュメントや動画を確認し、より多くの人とコミュニケーションを取るツールとして活躍します。

教育者達がこの提案をした気持ちはわかります。facebookのザッカバークは英語を駆使し、プログラミングで20億人が集まるバーチャルな帝国を創りました。彼はプログラマーとしてもTop Coderの上位に入る腕前です。しかし、ザッカバークはプログラミングができなくても成功したでしょう。彼はfacebookの前にも色々なプロダクトを生み出し、企業から多くのオファーをもらっています。世界最高の大学のハーバード大学にも楽々入学し、フェンシングの腕前も一流です。彼のインタビューを読むと、様々な方面の知識量に驚かされます。彼は元々飛びぬけて優秀な人間なのです。

プログラミングは確かに素晴らしいツールだと思います。しかし、全ての人に必要はありません。
もし、学校でどうしても教えるというのなら、興味がある人だけが受講する選択制にするのが一番良いでしょう。英語も同様です。

これは決して差別なんかではありません。区別です。小学生のうちからあまりにも負担をかけすぎではないでしょうか。教育という言葉で武装して、大人のエゴを子供達に押し付けるのは反対です。

授業風景を想像する

さて、プログラミングが必修になったとして、どのように小学生にプログラミングを教えるつもりなのでしょうか。
決めるのは文部科学省だから、実績と汎用性のあるJavaを選定すると仮定して、実際の授業を想定してみます。

授業の初日、先生がパソコンに最初のコードを記述します。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("小学生のプログラミング");
    }
}
      

手元のモバイルに映るこのコードを見て、小学生はどう行動を取るでしょうか。

「先生。読めません」

と多くの子供達が手を挙げるのではないでしょうか。

とはいえ、今の子供達は早期に英語教育を受け、簡単な英語くらい理解しています。なので、以下の質問が飛んでくるかもしれません。

「先生。argsってなんですか?」

当然の疑問です。しかし、この質問は文部科学省の想定通りです。先生は指導要綱の書き込まれた教科書のマニュアル通りに答えます。

「いい質問ですね、佐藤くん。argsはargumentsの略ですよ」

「そっか。argumentsを省略してargsなんだ」

「はい。佐藤くん正解です。皆さんもわかりましたね?」

子供達はそれを聞いて納得し、授業は進んでいく…

わけない!!

いや、今の子供は優秀で好奇心も旺盛です。ほとんどの子供はgoogleでargumentsの意味を検索するはずです。すると、モバイルの画面には答えが表示されます。

arguments 名詞:引数

さて、小学生達はこの漢字を何と読むでしょう。

いんすう?
ひきかず?

残念。
これはひきすうと読みます。
引数は変数を受けるパラメーターです。sがあるので複数のパラメーターを受けられるのだな、とここまで考えられれば満点です。

ここまで読んだ皆さんは、もう理解したと思います。

計画に無理がある

のです。

ちなみにほとんどの初心者用のプログラミング参考書では、public static void main(String[] args)を「おまじない」として認識させます。

十分な学習経験のある大人でさえ、最初はおまじないとして認識しながらゆっくりと学習していくのです。算数や国語で悪戦苦闘している子供達にこんなことをやらせて何の意味があるのでしょうか。優秀で意欲のある子供だけが学習すれば十分ではないでしょうか。

本当に大切なこと

子供達が未来を担う宝と考えるのなら、力を入れるべきはプログミングや英語ではありません。

数学、物理、化学

です。

現在の我々の生活を支え、豊かにしているのは科学です。そして、科学は高度な学力の上に成り立っています。
英語やプログラミングは、効率的に処理する道具でしかありません。

他の分野、例えば芸術分野だって同じです。

エレキギターがロックを生み、音声技術がボカロを生み、DTMがEDMを生みました。芸術だってイノベーションを起こすには、科学が必要になります。つまり、学力が全ての礎なのです。

つい先日、科学誌Newtonを発行するニュートンプレスが民事再生法の適用を申請しました。社会は科学に興味を失っています。世間で理系の人材は貴重だと言われていますが、言われているだけで実際の現場はどこもひどい人手不足で待遇も良くないです。労働基準法? なにそれ? という雰囲気です。トランプ大統領や安倍政権の行動、芸能人のゴシップではネットのコメント欄が賑わいますが、科学関連は閑古鳥がないています。

日本は岐路に立っていると思います。我々の子供たちは、先進国の人間として豊かな生活を送り続けることができるのでしょうか。今のままでは厳しいと思います。

だからこそ教育は何よりも大切です。教育は、多くの富を生み出し、生活を豊かにし、命を救います。

文部科学省や政治家には、なにが世の中を支えているのかを再考して欲しいと思います。お金が必要なのはわかりますが、あまりに金融政策に偏りすぎです。人類の生み出した英知が手に入るからこそ、お金に価値があるのです。

将来の日本は、少子高齢化が避けられません。だからこそ多くの可能性と時間を持つ子供達の教育は大切です。日本のためにも、良い教育が導入されることを願います。

PICK UP オススメ書籍

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

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