tag:blogger.com,1999:blog-75882478423944267062024-03-07T14:13:25.592+09:00ダメ男のブログMasahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.comBlogger637125tag:blogger.com,1999:blog-7588247842394426706.post-89630844272956511232019-01-21T00:10:00.000+09:002019-01-21T00:10:40.551+09:00【機械学習】設計と実装まとめ<div class="ruby-container">
<ul>
<li>公開日:2019年01月20日</li>
<li>最終更新日:2019年01月20日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>機械学習でデータ分析をするときに気が付いたこと、得た知見のまとめ</p>
<h3 class="paragraph-title-android">記事の対象者</h3>
<ul>
<li>機械学習の基礎を理解している</li>
<li>実務で機械学習を利用している</li>
<li>kaggleで機械学習を利用している</li>
</ul>
<h3 class="paragraph-title-android">記事で使うデータ</h3>
<ul>
<li>kaggleの<a href="https://www.kaggle.com/blastchar/telco-customer-churn" target="blank">telco-customer-churn</a>のデータを使います。</li>
</ul>
<h3 class="paragraph-title-android">Categoricalデータ取得</h3>
<p>Categoricalデータを取得するとき、pandas_profilingで<a href="https://www.codexa.net/basic-exploratory-data-analysis-with-python/" target="blank">EDA(探索的データ解析)</a>でデータを見ながら、必要な変数名をコピペしながら配列に設定していくことが多々あります。</p>
<p>Categoricalデータはone_hot_encode化して分類器にかけることがほとんどだと思うので(特にkaggleとか)、以下のようにdtype=objectのデータを取ってきてしまうと便利です。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
categorical_train = df.select_dtypes(include=object)
</pre>
<p>Categoricalデータは、dtype=objectであることが多いので、とても役に立ちます。</p>
<p>当然データによっては不要なカラムもあるので、その場合、不要なカラムはdropで消しましょう。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
extracted_categorical_train = categorical_train.drop(['customerID', 'TotalCharges', 'Churn'], axis=1)
</pre>
<p>命名する変数名は、実装時にきちんと考えましょう。地雷化したコードが多すます。</p>
<h3 class="paragraph-title-android">モデル実装</h3>
<p>モデルをチューニングしてモデルの性能検証をする場合は、以下の流れで行います。</p>
<ul>
<li>GridSearchCVでモデルのハイパーパラメータを測定</li>
<li>交差検証でモデルの性能を測定</li>
</ul>
<p>モデルの汎化性能を測定するには、交差検証だけでなく、k分割を使うとさらに良いです。</p>
<p>まずはGridSearchCVを使ってハイパーパラメーターを決定します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
# 試行するパラメータを羅列する
params = {
'max_depth': list(range(1, 20)),
'criterion': ['gini', 'entropy']
}
# KFoldクラスで分割数を指定する
kFold = KFold(n_splits=5, shuffle=True, random_state=0)
grid_search = GridSearchCV(clf, # 分類器を渡す
param_grid=params, # 試行してほしいパラメータを渡す
cv=kFold, # KFoldで汎化性能を調べる
)
# グリッドサーチで優れたハイパーパラメータを探す
grid_search.fit(X, y)
# 最も良かったスコア
print(grid_search.best_score_)
# 上記を記録したパラメータの組み合わせ
print(grid_search.best_params_)
</pre>
<p>上記を実行します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
0.8036348147096408
{'criterion': 'entropy', 'max_depth': 8}
</pre>
<p>accuracyとハイパーパラメーターが出力されました。</p>
<p>上記のハイパーパラメーターを使って交差検証でモデルの性能を測定します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
# 引数はdictで渡せないので注意。
clf = RandomForestClassifier(criterion= 'entropy',
max_depth=8)
scores = cross_val_score(clf, X, y, scoring='accuracy', cv=kFold)
print(scores)
print(scores.mean())
</pre>
<p>実行します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
[0.7920511 0.80624556 0.79418027 0.79545455 0.81676136]
0.8009385686173301
</pre>
<p>これでGridSearchCVでモデルのハイパーパラメータを測定して、交差検証でモデルの性能を測定できました。</p>
<h3 class="paragraph-title-android">まとめ</h3>
<p>機械学習は慣れるまで大変ですが、素晴らしい技術なので頑張って身につけてください。</p>
<p>機械学習エンジニアは不要になるとか、クラウドで全部できるようになるとか言う人がいますが、真に受けて学習を怠ってはいけません。<br/>
プログラマーは不要になるとか、大企業は潰れないとか、世の中に流れている通説はほとんど嘘です。<br/>リターンの大きい技術なので、是非頑張ってください。</p>
<p>以上です。</p>
<h3>参照サイト</h3>
<hr/>
<ul>
<li><a href="https://www.kaggle.com/blastchar/telco-customer-churn" target="_blank">telco-customer-churn</a></li>
</ul>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-42826518491667719002018-12-02T23:02:00.000+09:002018-12-05T23:19:21.327+09:00【python】PyCharm CEでAWS Toolkits for PyCharmを使う<div class="ruby-container">
<ul>
<li>公開日:2018年12月02日</li>
<li>最終更新日:2018年12月05日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>PyCharm CEでAWS Toolkits for PyCharmを使ってAws lambdaをlocalで動かす方法を記載した記事です。</p>
<h3 class="paragraph-title-android">記事の対象者</h3>
<ul>
<li>Aws lambdaにpythonアプリをdeployしたことがある</li>
<li>PyCharmを使ってAws lambdaをアプリを実装したい</li>
</ul>
<h3 class="paragraph-title-android">記事で学べること</h3>
<ul>
<li>PyCharmでAws lambdaの開発環境を構築する</li>
</ul>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>macOS Mojavve10.14</li>
<li>Python 3.6.3</li>
<li>aws lambda</li>
<li>Docker Desktop version2.0.0.0-mac81</li>
</ul>
<h3 class="paragraph-title-android">PyCharmインストール</h3>
<p><a href="https://www.jetbrains.com/pycharm/download/#section=mac" target="blank">公式サイト</a>からPyCharm Communityをダウンロード
します。もちろん、Professionalでも問題ありません。</p>
<p>PyCharm CEを立ち上げて適当なプロジェクトを作成します。</p>
<h3 class="paragraph-title-android">Pluginインストール</h3>
<p>PluginでAWS Toolkitをインストールします。操作手順は以下の通り。</p>
<ul>
<li>Preference選択</li>
<li>Plugins選択</li>
<li>AWSで検索</li>
<li>AWS Toolkitをインストール</li>
</ul>
<p>AWS Toolkitのインストールが完了したら、次の作業に進みます。</p>
<h3 class="paragraph-title-android">AWS SAM CLI を導入</h3>
<p>AWS SAM CLIが必要になります。<br/>
<a href="https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-using-pip.html" target="blank">公式サイト</a>に記載してある手順を実行します。
</p>
<p>AWS SAM CLIの導入ついでに、aws-cliも最新にしておくとさらに良いです。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
// 現在バージョン確認
$ aws --version
aws-cli/1.16.47 Python/3.6.3 Darwin/18.0.0 botocore/1.12.37
// AWS CLI を最新バージョンに更新
pip install awscli --upgrade --user
// 更新後のバージョン確認
$ aws --version
aws-cli/1.16.67 Python/3.6.3 Darwin/18.0.0 botocore/1.12.57
// aws-sam-cli install
pip install aws-sam-cli
</pre>
<p>公式サイトだとbrewのコマンドが記載されていますが、brewでpythonを導入していない場合、brewだとインストールに失敗しました。<br/>
なので、私はpipで導入しました。<br/>
自分の環境に合わせてaws-sam-cliを導入してください。</p>
<h3 class="paragraph-title-android">プロジェクト作成</h3>
<p>準備が完了したので、プロジェクトを作成しましょう。</p>
<p>NewProjectを選択すると、AWS Serverless Applicationが出現しています。</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhjLbh2SmSq8Xh7i4u7YQlRoagF6qh4YfJtExF4CddOpgiNXR-qGdAqcuKRCJ48juOw68RyIjYjanJk3Cfkm7QFx9xtalMv4oTwVPh6UiUBLAhKbJF5PeSC2GRFgPXHQQQVxJra_N_uuMg/s1600/2018-12-02_18.23.38.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhjLbh2SmSq8Xh7i4u7YQlRoagF6qh4YfJtExF4CddOpgiNXR-qGdAqcuKRCJ48juOw68RyIjYjanJk3Cfkm7QFx9xtalMv4oTwVPh6UiUBLAhKbJF5PeSC2GRFgPXHQQQVxJra_N_uuMg/s320/2018-12-02_18.23.38.png" width="320" height="236" data-original-width="213" data-original-height="157" /></a></div>
<div style="clear:both" ></div>
<p>択しプロジェクト名、SAM Templateから「AWS SAM Hello World」を選んで作成します。</p>
<p>*注意点1.pythonをVirtualenv環境で利用している場合は、Virtualenv Environmentを選択するようにします。<a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" target="blank">公式サイト</a>に詳しい説明が記載されています。</p>
<p>*注意点2.aws-sam-cliをpipで入れた場合は、pathを自分で設定する必要があります。<br/>
pathはwhichコマンドで確認できます。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
which sam
/Users/{username}/.pyenv/shims/sam
</pre>
<p>上記のpathをCIのpathに設定してください。</p>
<h3 class="paragraph-title-android">lambdaをdockerで動かす。</h3>
<p>プロジェクト作成すると、デフォルトでlambdaプロジェクトが作成されています。</p>
<p>テスト環境で動かす場合はλマークをクリックします。[Run local app]でlambdaをdocker環境で動かすことができます。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
2018-12-02 22:05:01 Found credentials in environment variables.
2018-12-02 22:05:01 Invoking app.lambda_handler (python3.6)
2018-12-02 22:05:01 Decompressing /var/folders/_k/82kvh_6s4bz0w8j8lhkp674c0000gn/T/2220729341239739084.zip
Fetching lambci/lambda:python3.6 Docker container image...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
2018-12-02 22:17:48 Mounting /private/var/folders/_k/82kvh_6s4bz0w8j8lhkp674c0000gn/T/tmpco54kn1p as /var/task:ro inside runtime container
START RequestId: c4106c2a-a762-4881-90c1-d3abf01a9a96 Version: $LATEST
END RequestId: c4106c2a-a762-4881-90c1-d3abf01a9a96
REPORT RequestId: c4106c2a-a762-4881-90c1-d3abf01a9a96 Duration: 1444 ms Billed Duration: 1500 ms Memory Size: 128 MB Max Memory Used: 26 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\", \"location\": \"61.12.128.21\"}"}
</pre>
<p>jsonが取得できています。初回はdockerのイメージを取得してくるので、かなり時間がかかります。気長に待ちましょう。</p>
<h3 class="paragraph-title-android">virtualenvに対応</h3>
<p>プロジェクト毎に使用パッケージをvirtualenvで隔離します。lambdaAPIは量を作るケースが多いので、virtualenvは必須です。</p>
<p>ターミナルで作業します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
// プロジェクトルートへ
cd project_root
// 仮想環境(virtualenv)の構築
$ virtualenv --python="`which python`" virtualenv
// virtualenvのactivate
source virtualenv/bin/activate
(virtualenv)$
</pre>
<p>コマンドをvirtualenv name のようにして名称をつけても問題ありません。</p>
<p>あとは、PyCharm → Preferences → Project Interpreterでaddボタンを押して作った仮想環境を設定すればOKです。</p>
<h3 class="paragraph-title-android">まとめ</h3>
<p>AWS Toolkitを使うと、間違いなく生産性は上がります。<br/>
一日で設定可能なので、是非利用しましょう。
WEB開発者はもちろん、機械学習開発者にもおすすめです。</p>
<p>次は、testコードと本番deployと機械学習のmodel APIを試してみようと思います。</p>
<p>以上です。</p>
<h3>参照サイト</h3>
<hr/>
<ul>
<li><a href="https://qiita.com/chaosm3h/items/27a7bf18adf45108f6a1" target="_blank">AWS Toolkits for PyCharmを試してみた</a></li>
<li><a href="https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-using-pip.html" target="_blank">Install the AWS SAM CLI Using Pip</a></li>
</ul>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-68925013878713320942018-11-25T09:44:00.000+09:002018-11-25T09:44:50.151+09:00【flask】Aws lambda上にflaskをdeployする<ul>
<li>公開日:2018年11月25日</li>
<li>最終更新日:2018年11月25日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>Aws lambdaでflaskアプリをdeployする方法を記載した記事です。</p>
<h3 class="paragraph-title-android">記事の対象者</h3>
<ul>
<li>Aws lambdaでflaskをdeployしたい</li>
<li>flaskを使った実装を理解している</li>
</ul>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>flask</li>
<li>python3.6</li>
<li>aws lambda</li>
<li>zappa</li>
<li>doorkeeper 16.1.0</li>
</ul>
<h3 class="paragraph-title-android">flaskアプリ作成の準備</h3>
<p>アプリ構築用のフォルダを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
mkdir flask-app
</pre>
<p>続いて仮想環境を構築します。Zappaを使ってbuildとdeployをするので、仮想環境の構築が必須になります。</p>
<p>仮想環境の構築には、virtualenvを使います。virtualenvはPythonの仮想的な環境を作ることができます。<br/>
Zappaがpyenvでdeployできるかどうかは確認していません。</p>
<p>virtualenvは、プロジェクトごとにPythonのバージョンを変えたり、必要なパッケージを分けてインストールして動かす事もできます。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
cd flask-app/
$ virtualenv .env
Using base prefix '/Users/{user_name}/.pyenv/versions/3.6.3'
New python executable in /Users/{user_name}/workspace/flask-app/.env/bin/python3.6
Also creating executable in /Users/{user_name}/workspace/flask-app/.env/bin/python
Installing setuptools, pip, wheel...
done.
</pre>
<p>仮想環境に入ります。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
source .env/bin/activate
(.env)
</pre>
<p>terminalのプロンプトの最初が(.env)に変わってれば入れています。</p>
<p>確認のために仮想環境を出ます。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
deactivate
</pre>
<p>terminalのプロンプトから(.env)が消えていれば、仮想環境を出ています。</p>
<h3 class="paragraph-title-android">flaskアプリの作成</h3>
<p>アプリを作成します。requirements.txtを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
// 仮想環境に入る
source .env/bin/activate
touch requirements.txt
</pre>
<p>requirements.txtに必要なパッケージを記載します。</p>
<div class="rails-code-header">flask-app/requirements.txt</div>
<pre class="blogger-code">
flask
zappa
</pre>
<p>ライブラリをpipでinstallします。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
pip install -r requirements.txt
</pre>
<p>Hello worldのアプリを作成します。</p>
<div class="rails-code-header">flask-app/app.py</div>
<pre class="blogger-code">
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def hello_world():
return jsonify({"message": "Hello World!"})
if __name__ == '__main__':
app.run()
</pre>
<p>ローカルで動作することを確認します。<br/>
http://localhost:5000/でブラウザにアクセスします。</p>
<div class="rails-code-header">ブラウザ</div>
<pre class="blogger-code">
{"message":"Hello World!"}
</pre>
<p>問題ありませんね。</p>
<h3 class="paragraph-title-android">flaskアプリをlambdaにdeploy</h3>
<p>ZAPPAを使います。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
$ zappa init
// 全てデフォルト
</pre>
<p>zappa_settings.jsonが作成されていることを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
$ ls -l
total 24
-rw-r--r--@ 1 edy staff 178 11 24 21:57 app.py
-rw-r--r-- 1 edy staff 11 11 24 21:49 requirements.txt
-rw-r--r-- 1 edy staff 240 11 24 23:09 zappa_settings.json
</pre>
<p>内容を確認すると、色々と設定が記載されているはずです。</p>
<p>deployします。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
zappa deploy dev
</pre>
<p>deployします。<br/>
The role defined for the function cannot be assumed by Lambdaというエラーが表示されて
deployに失敗することがありますが、何回か叩くとうまくいくはずです。</p>
<p>URLが返却されたらURLをブラウザで叩いてみてください。</p>
<div class="rails-code-header">ブラウザ</div>
<pre class="blogger-code">
{"message":"Hello World!"}
</pre>
<p>上手くいきました。</p>
<h3 class="paragraph-title-android">flaskアプリをlambdaから削除</h3>
<p>削除もコマンドで行えます。</p>
<div class="rails-code-header">terminal</div>
<pre class="blogger-code">
zappa undeploy
</pre>
<p>これで削除されます。便利ですね。</p>
<h3 class="paragraph-title-android">まとめ</h3>
<p>lambdaを使うと低コストでサーバーを利用することができます。<br/>
シンプルなAPIを作成するなら、これで十分です。機械学習のAPIとかなら、十分ですね。いやー、凄い時代になりました。</p>
<p>以上です。</p>
<h3>参照サイト</h3>
<hr/>
<ul>
<li><a href="https://github.com/Miserlou/Zappa" target="_blank">Zappa</a></li>
<li><a href="https://blog.apcelent.com/Flask-AWS-Lambda.html" target="_blank">Deploying Flask on AWS Lambda</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com12tag:blogger.com,1999:blog-7588247842394426706.post-51821793291854213272018-07-15T09:13:00.001+09:002018-09-30T10:07:19.378+09:00【Compose and Rails】 新規プロジェクト構築でハマった箇所<div class="ruby-container">
<ul>
<li>公開日:2018年07月15日</li>
<li>最終更新日:2018年07月15日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>Compose and Railsを使った新規プロジェクトでdocker-composeとrailsを利用したら構築でハマりました。<br/>
なので以下にメモ。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>Engine: 18.03.1-ce</li>
<li>Rails5.2</li>
<li>ruby2.5.1</li>
</ul>
<p><a href="https://docs.docker.com/compose/rails/#connect-the-database" target="blank">公式サイト</a>通りにやったのに、色々と修正が必要になり無駄な時間がかかってしまいました。なので、修正点をまとめておきます。</p>
<h3 class="paragraph-title-chef">GemfileとGemfile.lock</h3>
<p>公式に通りにやると</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
docker-compose run web rails new . --force --database=postgresql
</pre>
<p>の後に、ローカルに生成されたGemfileとGemfile.lockを、webフォルダの中のGemfileとGemfile.lockと入れ替えることが書いてありません。
コードを読むまで気づきませんでした。なんのためのチュートリアルなのか。</p>
<h3 class="paragraph-title-chef">DB作成</h3>
<p>公式だとDBの作成が、docker-compose upの起動後になっています。<br/>
これだとDBがないので、当たり前ですが、railsが起動しません。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
docker-compose logs
</pre>
<p>でも理由が出てないので焦りました。ちゃんと書いて欲しいですね。</p>
<h3 class="paragraph-title-chef">pidの削除処理</h3>
<p>docker-compose startでpumaを起動していると、docker-compose stopを実行しても、PIDファイルが残ってしまうことがあります。</p>
<p>PIDファイルは、長時間動作し続けるプロセス(例えば MySQL デーモンなど)を、自身のPIDをファイルに書いておき、他のプロセスが参照できるようにしているファイルです。</p>
<p>このPIDファイルを削除する処理を記載します。</p>
<div class="rails-code-header">docker-compose.yml</div>
<pre class="rails-code">
command: bash -c 'rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b "0.0.0.0"'
</pre>
<p>上記のようにすることで、docker-compose startのたびにserver.pidが削除されるようになります。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>公式の通りにやっても、railsの未経験者だと多分すんなりとは立ち上がりません。でも、某キー○の古い情報よりはマシかな。。。という感じです。<br/>
結局最後はコードとログを読むしかないという結論でした。AI時代 or 自動化時代はさらに原因究明が大変になるんだろうなあ。あーイヤダイヤダ。<br/>
あと、dockerのログは、もう少し詳細にして欲しいですね。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" ><img src="https://ecx.images-amazon.com/images/I/5102wwx0VzL._SL160_.jpg" style="border: none;"></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >メタプログラミングRuby 第2版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Paolo Perrotta オライリージャパン 2015-10-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83%81%83%5E%83v%83%8D%83O%83%89%83~%83%93%83ORuby%20%91%E62%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-49564794568663795882018-05-17T23:12:00.000+09:002018-05-30T08:14:18.619+09:00【ethereum】開発前の知識整理<ul>
<li>公開日:2018年05月17日</li>
</ul>
<h3 class="paragraph-title-unity">記事概要</h3>
<p>2018年のGoogle I/Oが残念すぎた(もうスマホは進化しないのでしょうか。新しいライブラリで誤魔化しているだけですね。イノベーションゼロ)ので、コントラクト開発をしようと考えています。ということで、開発に最低限必要なethereumの用語をまとめた記事です。<br/>
gethでの環境構築や仮想通貨の技術的な仕組みは知っている前提です。まだメモ書きの段階です。徐々に増やしていきます。</p>
<h3 class="paragraph-title-unity">環境</h3>
<ul>
<li>ubuntu-17.10</li>
<li>ethereum Geth/v1.7.3</li>
</ul>
<h3 class="paragraph-title-unity">DApps</h3>
<p>「Decentralized Applications(非中央集権・分散型のアプリケーション)」の略です。</p>
<h3 class="paragraph-title-unity">METAMASK</h3>
<p>MetaMaskはChromeの拡張機能として使用するウォレットです。ICOに参加する時やDAppsのオンラインゲームで遊ぶ時、DEXの取引所を使う時に必要になります。git Hubでソースが公開されています。</p>
<h3 class="paragraph-title-unity">DEX</h3>
<p>DEXは分散型取引所のことです。分散型取引所とは、中央管理者がいなくても仮想通貨の取引が可能な取引所の事です。逆に、中央集権型取引所は、日本ではcoincheckやbitFlyer、海外ではpoloniexやbittrexのような中央管理者に仮想通貨を預けて取引を行う取引所のことです。しかし、中央集権型取引所では、秘密鍵の管理を取引所に委任している形になっているため、取引所の内部の人間が顧客の資金を不正に引き出すことが出来てしまう上、秘密鍵を持っている中央管理者へのハッキングリスクがあります。なので、特定の仮想通貨を購入した後は取引所から対応したウォレットに移すことが推奨されています。</p>
<h3 class="paragraph-title-unity">ERC20</h3>
<p>イーサリアムベースのトークンです。トークンに対する技術的に統一された仕様になります。また、ERC20トークンはERC20トークン対応のウォレットでないと管理できません。<br/>
ERC とは「Ethereum RFC (Request for Comment)」の意味で、その20番目だったために「ERC20」と呼ばれているそうです。</p>
<h3 class="paragraph-title-unity">Solidityの学習</h3>
<p>SolidityはEthereum(イーサリアム)上で動くスマートコントラクト開発の言語です。<br/>
まずはローカルに環境を整える前に、<a href="https://cryptozombies.io/jp/" target="blank">CryptoZombies</a>で実装するとスマートコントラクトの理解ができるでしょう。<br/>
また、開発前に<a href="https://metamask.io/" target="blank">METAMASK</a>をChromeにインストールしましょう。章を進めると、Rewardがもらえます。</p>
<h3 class="paragraph-title-unity">Contracts</h3>
<p>コントラクトをイーサリアム上にデプロイすると、イミュータブルになる。つまり編集も更新もできなくなる。コントラクトに何か欠陥があっても、それをあとで修正する方法はない。</p>
<h3 class="paragraph-title-unity">solidity</h3>
<h5>msg.value</h5>
<p>msg.valueは、コントラクトにどのくらいEtherが送られたかを見る。external payable修飾詞を使う</p>
<h3 class="paragraph-title-unity">ECDSA</h3>
<p>デジタル署名アルゴリズム。楕円曲線暗号を使った公開鍵のアルゴリズムで、RSAよりも短い鍵長で安全性を担保できる。<br/>
openSSLのバージョンを確認する。</p>
<pre>
$ openssl version
OpenSSL 1.0.2g 1 Mar 2016
</pre>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>まだ未完成です。</p>
<p>続きます。</p>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3 class="related-article-title">参考記事</h3>
<ul>
<li><a href="https://qiita.com/amachino/items/b59ec8e46863ce2ebd4a" target="_blank">Ethereum スマートコントラクト入門:geth のインストールから Hello World まで</a></li>
<li><a href="http://coinpost.jp/?p=5778#dex_dispersion" target="_blank">分散型取引所(DEX)とは?/中央集権型取引所との違いについて解説</a></li>
<li><a href="https://www.etheremon.com/#/" target="_blank">イーサエモン</a></li>
<li><a href="https://etherscan.io/" target="_blank">Etherscan</a></li>
<li><a href="https://cryptozombies.io/jp/">DApp開発</a></li>
<li><a href="http://blockchain.gunosy.io/entry/ethereum-contracts-system#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA" target="_blank">EthereumとContracts開発を取り巻くエコシステムの概要</a></li>
<li><a href="https://qiita.com/amachino/items/8cf609f6345959ffc450" target="_blank">Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう</a></li>
<li><a href="https://enomotodev.hatenablog.com/entry/2018/02/18/182032" target="_blank">Geth(Go Ethereum)を使って、イーサリアムのプライベートネットを構築し送金までやってみた</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-60818176379394085992018-04-15T23:40:00.000+09:002018-04-21T15:44:08.610+09:00【Rails】きれいなRubyコードは好きですか? Rubocop. Clean Code<ul>
<li>公開日:2018年04月15日</li>
<li>最終更新日:2018年04月21日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>プロジェクトへRubocopを導入する記事です。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>centos6.5</li>
<li>Rails5.2</li>
<li>ruby2.5.1</li>
<li>rbenv</li>
</ul>
<h3 class="paragraph-title-chef">Rubocop</h3>
<p>Rubocopはコード解析ツールです。<br/>デフォルトでは
<a href="https://github.com/bbatsov/ruby-style-guide" target="blank">Ruby Style Guide</a>で示されているガイドラインが適用されます。</p>
<h3 class="paragraph-title-chef">実績</h3>
<p>Ruby on Railsでも<a href="https://github.com/rails/rails/blob/master/.rubocop.yml" target="blank">Rubocopでコードチェック</a>を実行しています。</p>
<h3 class="paragraph-title-chef">Gemfile修正</h3>
<p>Gemfileにrubocopを追記します。</p>
<div class="rails-code-header">{project_folder}/Gemfile</div>
<pre class="rails-code">
group :development do
gem 'rubocop', require: false
end
</pre>
<p>インストールします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
cd {project_root}
bundle install
Fetching rainbow 3.0.0
Installing rainbow 3.0.0
Fetching parallel 1.12.1
Installing parallel 1.12.1
Fetching parser 2.5.1.0
Installing parser 2.5.1.0
Fetching powerpack 0.1.1
Installing powerpack 0.1.1
Fetching ruby-progressbar 1.9.0
Installing ruby-progressbar 1.9.0
Fetching unicode-display_width 1.3.0
Installing unicode-display_width 1.3.0
Fetching rubocop 0.54.0
Installing rubocop 0.54.0
</pre>
<h3 class="paragraph-title-chef">.rubocop.yml</h3>
<p>プロジェクト直下に<a href="https://rubocop.readthedocs.io/en/latest/configuration/" target="blank">.rubocop.yml</a>ファイルを作成します。
.rubocop.ymlはRuboCopの挙動をコントロールできます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
cd ${project_root}
$ touch .rubocop.yml
</pre>
<p>作成した.rubocop.ymlは空なので、<a href="https://github.com/rails/rails/blob/master/.rubocop.yml" target="blank">railsの.rubocop.ymlの内容</a>をコピーして貼り付けます。<br/>
特別な理由がない限り、基本はRailsと同じ設定にすると良いでしょう。</p>
<p>.rubocop.ymlはRuby2.5.1とRails5.2の環境に合わせます。</p>
<div class="rails-code-header">{project_folder}/.rubocop.yml</div>
<pre class="rails-code">
// .ruby-version ファイルからRubyのバージョンは読み込む。
#TargetRubyVersion: 2.5 → 削除
Layout/** → Style/**に置換
Style/SpaceBeforeFirstArg: → Lint/SpaceBeforeFirstArg:
// コメントアウト
#CustomCops/RefuteNot
// コメントアウト
#Style/EmptyLineAfterMagicComment:
# Enabled: true
// コメントアウト
#Style/SpaceAroundKeyword
# Enabled: true
// コメントアウト
#Style/FrozenStringLiteralComment
// コメントアウト
// http://www.rubydoc.info/github/bbatsov/RuboCop/RuboCop/Cop/Lint/BlockAlignment
#EnforcedStyleAlignWith
</pre>
<p>rubocopコマンドの実行で出力されたエラーを修正します。<br/>シングルクォーテーションをダブルクォーテーションへ変換する必要があるので、以下のコマンドを実行します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
$ rubocop -a
</pre>
<p>上記のコマンドを実行すると他のエラーも修正されるので、実行前にgitで状態を保存しておきましょう。</p>
<h3 class="paragraph-title-chef">速度改善</h3>
<p>上記で設定したrailsの.rubocop.ymlの設定だと、rubocopコマンドの実行に時間がかかるので改善します。<br/>
.rubocop.ymlのExcludeの設定を変更します。</p>
<div class="rails-code-header">{project_folder}/.rubocop.yml</div>
<pre class="rails-code">
DisabledByDefault: true
Exclude:
- 'tmp/**/*'
- 'public/**/*'
- 'vendor/**/*'
- 'log/**/*'
- 'actionpack/lib/action_dispatch/journey/parser.rb'
</pre>
<p>rubocopで検査非対象フォルダの配下を/**/*と設定するのがポイントです。<br/>
実行して確認します。</p>
<div class="rails-code-header">{project_folder}/.rubocop.yml</div>
<pre class="rails-code">
$ rubocop
warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.7-compliant syntax, but you are running 2.1.6.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Inspecting 48 files
................................................
48 files inspected, no offenses detected
</pre>
<p>完了です。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>Railsは開発速度に優れたフレームワークですが、ソースコードがカオスになりやすい欠点があります。プロジェクト立ち上げ時は良いのですが、プロジェクトが長くなればなるほどコードを読むのがきつくなります。Rubocopを導入して、ソースコードの可読性を保つようにしましょう。<br/>長い目で見ると、Rubocopを使った方が開発速度は上がるはずです。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51GLBK7MuVL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Ruby on Rails 5 超入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">掌田津耶乃 秀和システム 2016-12-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Ruby%20on%20Rails%205%20%92%B4%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" ><img src="https://ecx.images-amazon.com/images/I/5102wwx0VzL._SL160_.jpg" style="border: none;"></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >メタプログラミングRuby 第2版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Paolo Perrotta オライリージャパン 2015-10-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83%81%83%5E%83v%83%8D%83O%83%89%83~%83%93%83ORuby%20%91%E62%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-1511631234779858072018-02-24T00:03:00.001+09:002018-02-24T00:03:48.713+09:00【Android】ViewPager<ul>
<li>公開日:2018年02月23日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p><a href="http://java-lang-programming.com/" target="blnak">java-programming</a>向けの詳細な記事を書く時間が取れないので、ざっくりとこちらに情報を載せます。<br/>
ViewPagerアニメーションの学習と研究をしていたので、そのまとめ記事です。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>Android Studio 3.0.1</li>
</ul>
<h3 class="paragraph-title-android">概要</h3>
<p>ViewPagerはよく使いますが、きちんと内部コードを追って学習したことはほとんどありませんでした。<br/>
記事の内容は、この<a href="https://developer.android.com/training/animation/screen-slide.html" target="blank">公式ドキュメント</a>がベースです。さらに深掘りしています。</p>
<strong>ViewPagerとPageTransformer</strong>
<p>ViewPagerのアニメーション方法を変更するには、ViewPager.PageTransformerを使います。ViewPager.PageTransformerはtransformPageが宣言されているInterfaceです。</p>
<div class="code_block">
<div class="android-code-header">ViewPager.java</div>
<pre class="android-code">
public interface PageTransformer {
/**
* Apply a property transformation to the given page.
*
* @param page Apply the transformation to this page
* @param position Position of page relative to the current front-and-center
* position of the pager. 0 is front and center. 1 is one full
* page position to the right, and -1 is one page position to the left.
*/
void transformPage(@NonNull View page, float position);
}
</pre>
</div>
<p>画面切り替え時にtransformPageメソッドが呼び出されます。</p>
<p>PageTransformerで実装した内容を有効にするには、setPageTransformerメソッドを使います。</p>
<div class="code_block">
<div class="android-code-header">ViewPager.java</div>
<pre class="android-code">
mPager.setPageTransformer(true, new SamplePageTransformer());
</pre>
</div>
<p>上記のように設定すると、実装した具体的なPageTransformerクラスがmPageTransformer変数に設定され、onPageScrolledメソッドで呼び出されます。</p>
<div class="code_block">
<div class="android-code-header">ViewPager.java</div>
<pre class="android-code">
if (mPageTransformer != null) {
final int scrollX = getScrollX();
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp.isDecor) continue;
final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
mPageTransformer.transformPage(child, transformPos);
}
}
</pre>
</div>
<strong>PageTransformerクラスの実装</strong>
<p>具体的なPageTransformerクラスは、PageTransformerをimplementsして実装します。サンプルとしてZoomOutPageTransformerクラスを実装してみます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/ZoomOutPageTransformer.java</div>
<pre class="android-code">
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f;
@Override
public void transformPage(@NonNull View page, float position) {
int pageWidth = page.getWidth();
int pageHeight = page.getHeight();
Log.d("ZoomOutPage", "position :" + position + ", view id : " + page.getId());
Log.d("ZoomOutPage", "pageWidth :" + pageWidth + ", view id : " + page.getId());
Log.d("ZoomOutPage", "pageWidth :" + pageHeight + ", view id : " + page.getId());
if (position < -1) {
// 透明にする
page.setAlpha(0.0f);
} else if (position <= 1) {
// -1 < posiiton < 1
// 多分、徐々に小さくするため
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
// margin 黒枠のところ
// 縦 top bottomやな
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
// 水平 名前が left rightだと
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
// if (position < 0) {
// // 相対的に動かす。これが無いと画像が動かないのでおかしくなるはず。
// page.setTranslationX(horzMargin - vertMargin / 2);
// } else {
// page.setTranslationX(-horzMargin + vertMargin / 2);
// }
// Scale the page down (between MIN_SCALE and 1)
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
// Fade the page relative to its size.
page.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else {
// 透明にする
page.setAlpha(0.0f);
}
}
}
</pre>
</div>
<p>positionはページ数でなく、引数のページの相対的な位置です。-1 < x < 1までの範囲の値をとり、0が中央, -1が左, 1が右となります。</p>
<p>vertMarginとhorzMarginはページ切り替え時に、ページ間のviewの距離を詰めるための計算に使っています。setTranslationXでviewの位置をずらすことで、ページ移動のアニメーションをスムーズに見せています。名称がわかりにくいので、topBottomMarginとleftRightMarginで実装した方がわかりやすいと思います。</p>
<p>続いて、DepthPageTransformerを実装してみます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/DepthPageTransformer.java</div>
<pre class="android-code">
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(@NonNull View page, float position) {
int pageWidth = page.getWidth();
if (position < -1) {
// 透明にする
page.setAlpha(0.0f);
} else if (position <= 0) {
// [-1 : 0]
// Use the default slide transition when moving to the left page
page.setAlpha(1);
page.setTranslationX(0);
page.setScaleX(1);
page.setScaleY(1);
} else if (position <= 1) {
// [0 : 1]
// Fade the page out.
page.setAlpha(1 - position);
// Counteract the default slide transition
page.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
} else {
// 透明にする
page.setAlpha(0.0f);
}
}
}
</pre>
</div>
<p>こちらの方が理解しやすですね。左と右で綺麗に処理が分割されています。position <= 0, つまり左側はただスライドするだけです。</p>
<p>page.setAlphaで透過状態を管理しています。徐々に薄くなったり、濃くなったりしています。<br/>
ズームも同じで、大から小, 小から大へとviewを変化させています。setScaleX, setScaleYで拡大縮小をしています。</p>
<p>page.setTranslationX(pageWidth * -position);で画面が停止しているように見えるようにしています。</p>
<h3 class="paragraph-title-android">結論</h3>
<p>ViewPager.PageTransformerを使うことで、アニメーションを実装できます。色々とやってみようと思います。</p>
<div class="pick-up-title">PICK UP</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51R7NEaIwDL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-02-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qI%81r%84%9F%84%9F60fps%82%F0%92B%90%AC%82%B7%82%E9%83%82%83_%83%93%82%C8GUI%83V%83X%83e%83%80%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51rrKjgnZRL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" >Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-03-24 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3>参考</h3>
<hr/>
<ul>
<li><a href="https://qiita.com/ksoichiro/items/6a2ae3877bccf1c75860" target="_blank">AndroidのViewPager.PageTransformerでスライドアニメーションを作る</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-71374239192015408202017-11-19T10:19:00.000+09:002017-11-19T10:19:13.323+09:00【Android Studio 3.0】既存アプリをAndroid Studio 3.0に対応させる。<ul>
<li>公開日:2017年11月18日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>kotlinとJavaの混じったアプリを2.3.x系でビルドすると、制約がひどく、ビルドも遅いのでAndroid Studio 3.0に移行しました.<br/>結構色々なエラーと修正が発生したので、今後移行する人の役に立つように作業メモを記載して残しておきます。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>Android Studio 2.3.1 → Android Studio 3.0</li>
</ul>
<h3 class="paragraph-title-android">Android Studio 3.0に対応</h3>
<p>ダイアログで表示されるgradleのversionにアップデートします。ダイアログでOKを押下します。<br/>
自動的にbuild.gradleと/gradle/wrapper/gradle-wrapper.propertiesが上書きされます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/build.gradle</div>
<pre class="android-code">
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.3'
+ classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.google.gms:google-services:3.0.0'
}
</pre>
</div>
<div class="code_block">
<div class="android-code-header">{project_folder}/gradle/wrapper/gradle-wrapper.properties</div>
<pre class="android-code">
-#Fri Jul 28 22:16:36 JST 2017
+#Sat Nov 18 19:40:49 JST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
</pre>
</div>
<h3 class="paragraph-title-android">jackOptionsを無効化</h3>
<p>gradleの変更だけだと、おそらくビルドに失敗します。jackOptionsが有効だと以下のエラーが出力されます。</p>
<div class="code_block">
<div class="android-code-header">Event Log</div>
<pre class="android-code">
Warning:The Jack toolchain is deprecated and will not run. To enable support for Java 8 language features built into the plugin, remove 'jackOptions { ... }' from your build.gradle file, and add
android.compileOptions.sourceCompatibility 1.8
android.compileOptions.targetCompatibility 1.8
Future versions of the plugin will not support usage of 'jackOptions' in build.gradle.
To learn more, go to https://d.android.com/r/tools/java-8-support-message.html
</pre>
</div>
<p>エラーの内容は、<font color="red">jackOptionsはもうすぐサポート終わるから使わないで</font>ってことです。<br/>なので、以下のように変更します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/app/build.gradle</div>
<pre class="android-code">
defaultConfig {
// something...
vectorDrawables.useSupportLibrary = true
- jackOptions {
- enabled true
- }
multiDexEnabled true
// something...
}
</pre>
</div>
<p>jackOptionsを削除するだけです。sourceCompatibilityとtargetCompatibilityは残しておきます。</p>
<h3 class="paragraph-title-android">flavor dimensionsの設定</h3>
<p>Android Studio 3.0からは、単一のflavor dimensionを使用する場合でも、すべてのflavorが名前付きflavor dimensionに属している必要があります。でないと、以下のようなエラーが発生します。</p>
<div class="code_block">
<div class="android-code-header">Event Log</div>
<pre class="android-code">
All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
</pre>
</div>
<p>つまり、<font color="red">dimensionを定義してね。</font>ってことです。正直、ダメな仕様だと思います。大規模なプロジェクトには便利な機能ですが、必須である理由がわかりません。大抵のアプリは小さいアプリなはずです。いずれ元に戻ると思いたいですね。<br/>ビルド周りは大きく変わっているので、面倒でもサンプルプロジェクトを作成して仕様を確認することをお勧めします。<a href="https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?utm_source=android-studio#variant_aware" target="blank">ドキュメント</a>を読むだけだと、ピンと来ないと思います。</p>
<p>私の環境は分ける必要がないので、以下のように名前を一つ追加しただけです。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/app/build.gradle</div>
<pre class="android-code">
+ flavorDimensions 'normal'
productFlavors {
dev {
+ dimension 'normal'
}
prod {
+ dimension 'normal'
}
}
</pre>
</div>
<h3 class="paragraph-title-android">kotlinのバージョンアップ</h3>
<p>jackOptionsが不要になったので、kotlinのバージョン縛りがなくなりました。なので、このままだと以下のエラーが発生します。</p>
<div class="code_block">
<div class="android-code-header">Event Log</div>
<pre class="android-code">
Unable to find method 'com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava/util/List;'. Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem. Stop Gradle build processes (requires restart)
Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
</pre>
</div>
<p>エラーにkotlinの文字が出ないのは良くないですね。いずれは改善して欲しいですね。<br/>kotlinのアップデートはgradleの記載を変更するだけです。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/app/build.gradle</div>
<pre class="android-code">
buildscript {
ext {
- kotlin_version = '1.1.1'
+ kotlin_version = '1.1.51'
}
</pre>
</div>
<h3 class="paragraph-title-android">buildToolのバージョンアップ</h3>
<p>buildToolも更新が必要です。buildToolのバージョンが古いと以下の警告メッセージが表示されます。</p>
<div class="code_block">
<div class="android-code-header">Event Log</div>
<pre class="android-code">
Error:The specified Android SDK Build Tools version (26.0.1) is ignored, as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.0.
Android SDK Build Tools 26.0.2 will be used.
To suppress this warning, remove "buildToolsVersion '26.0.1'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
</pre>
</div>
<p>gradleを更新します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/app/build.gradle</div>
<pre class="android-code">
android {
- compileSdkVersion 26
+ compileSdkVersion 27
buildToolsVersion rootProject.buildToolsVersion
</pre>
</div>
<div class="code_block">
<div class="android-code-header">{project_folder}/build.gradle</div>
<pre class="android-code">
allprojects {
repositories {
+ google()
mavenCentral()
- maven { url 'https://maven.google.com' }
}
}
ext {
- buildToolsVersion = "26.0.1"
- supportLibVersion = "26.1.0"
+ buildToolsVersion = "27.0.1"
+ supportLibVersion = "27.0.1"
multidexVersion = "1.0.0"
- constraintLayoutVersion = "1.0.2"
+ constraintLayoutVersion = "1.1.0-beta3"
rxandroidVersion = "2.0.1"
rxjavaVersion = "2.1.3"
</pre>
</div>
<p>maven { url 'https://maven.google.com' } を google() に書き換えできるようになりました。</p>
<p>また、Android Studio 3.0だと、constraintLayoutが安定してIDEで表示されるようになりました。ConstraintLayoutを使うとviewの入れ子を少なくできて、描写が高速になるので、積極的に利用していきましょう。beta版が嫌な人は1.0.2でも良いと思います。<a href="https://developer.android.com/topic/libraries/support-library/revisions.html" target="blank">サポートライブラリ</a>と<a href="https://developer.android.com/topic/libraries/architecture/adding-components.html" target="blank">Architecture Components</a>の更新も忘れずに。</p>
<h3 class="paragraph-title-android">コード修正</h3>
<p>最後にkotlinのアップデートとsdk27のアップデートのコード対応を行います。<br/>私の環境で発生したエラーと修正方法を記載しておきます。</p>
<h5>Error: style attribute '@android:attr/windowEnterAnimation' not found.</h5>
<p>@が不要になりました。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/app/src/main/res/values/styles.xml</div>
<pre class="android-code">
<style name="Animations.GrowFromBottom">
- <item name="@android:windowEnterAnimation">@anim/grow_from_bottom</item>
- <item name="@android:windowExitAnimation">@anim/shrink_from_top</item>
+ <item name="android:windowEnterAnimation">@anim/grow_from_bottom</item>
+ <item name="android:windowExitAnimation">@anim/shrink_from_top</item>
</style>
<style name="Animations.GrowFromTop">
- <item name="@android:windowEnterAnimation">@anim/grow_from_top</item>
- <item name="@android:windowExitAnimation">@anim/shrink_from_bottom</item>
+ <item name="android:windowEnterAnimation">@anim/grow_from_top</item>
+ <item name="android:windowExitAnimation">@anim/shrink_from_bottom</item>
</style>
<style name="Animations.PopDownMenu">
- <item name="@android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
- <item name="@android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
+ <item name="android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
+ <item name="android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
</style>
</pre>
</div>
<p>Android3.0からは、デフォルトで<a href="https://android.googlesource.com/platform/frameworks/base.git/+/master/tools/aapt2/readme.md" target="blank">AAPT2</a>が有効になったことの影響です。</p>
<h5>Error: Smart cast to 'Bundle' is impossible, because 'arguments' is a mutable property that could have been changed by this time</h5>
<p>getArguments()のSmart castができなくなりました。コードを見ると、sdk27(サポートライブラリ)では以下のように実装されています。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
/**
* Return the arguments supplied when the fragment was instantiated,
* if any.
*/
@Nullable
final public Bundle getArguments() {
return mArguments;
}
</pre>
</div>
<p>sdk26(26.1.0)では以下のような実装でした。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
/**
* Return the arguments supplied when the fragment was instantiated,
* if any.
*/
final public Bundle getArguments() {
return mArguments;
}
</pre>
</div>
<p>@Nullableが追加されています。ブロックの引数を指定する必要があります。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
- arguments?.let {
+ arguments?.let { it ->
</pre>
</div>
<p>というかこれは既存コードに潜在的なバグが含まれていたっぽいです。。。letのブロック内の変数はなるべくitに置き換えるか、名称を変更するべきですね。</p>
<h5>Error: Class 'XYZPagerAdapter' is not abstract and does not implement abstract base class member public abstract fun isViewFromObject(@NonNull p0: View, @NonNull p1: Any): Boolean defined in android.support.v4.view.PagerAdapter</h5>
<p>PagerAdapterにも変更が入ったようです。コードを見ると、sdk27(サポートライブラリ)では以下のように実装されています。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
public abstract boolean isViewFromObject(@NonNull View view, @NonNull Object object);
</pre>
</div>
<p>sdk26(26.1.0)では以下のような実装でした。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
public abstract boolean isViewFromObject(View view, Object object);
</pre>
</div>
<p>これも同じように@Nullableが追加されています。?を削除します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
- override fun isViewFromObject(view: View?, `object`: Any?): Boolean {
+ override fun isViewFromObject(view: View, obj: Any): Boolean {
</pre>
</div>
<p>isViewFromObjectの引数って@NonNullだったんですね。チェックしてコード書いてた時期があったような。</p>
<h5>Error: Fragment</h5>
<p>Fragmentも変更されてますね。これもsdk27で@Nullableのアノテーションが追加されたのではないでしょうか。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return null;
}
</pre>
</div>
<p>sdk26(26.1.0)では以下のような実装でした。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return null;
}
</pre>
</div>
<p>LayoutInflaterが@NonNullになっています。これは良い修正ですね。以下のように修正します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
- override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
- val view = inflater!!.inflate(R.layout.fragment_floating_action, container, false)
+ val view = inflater.inflate(R.layout.fragment_floating_action, container, false)
</pre>
</div>
<h5>Error: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type FragmentActivity?</h5>
<p>FragmentActivityも変更されてますね。これも@Nullableのアノテーションが追加されたのではないでしょうか。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
</pre>
</div>
<p>sdk26(26.1.0)では以下のような実装でした。</p>
<div class="code_block">
<div class="android-code-header">android.support.v4.app.Fragment</div>
<pre class="android-code">
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
/**
* Return the {@link Context} this fragment is currently associated with.
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
</pre>
</div>
<p>Safe-call演算子を使って書き換えます。</p>
<div class="code_block">
<div class="android-code-header">色々</div>
<pre class="android-code">
- activity.supportFragmentManager.popBackStack()
+ activity?.supportFragmentManager?.popBackStack()
- Toast.makeText(context, context.getString(R.string.sample), Toast.LENGTH_SHORT).show()
+ Toast.makeText(context, context?.getString(R.string.sample), Toast.LENGTH_SHORT).show()
</pre>
</div>
<h3 class="paragraph-title-android">gradle修正</h3>
<p>gradleを変更します。</p>
<p>compileをimplementationに変更します。</p>
<p>implementationにすると<font color="red">ビルドが早く</font>なります。<br/>
なぜなら、implementationは、コンパイルする必要がある<font color="red">依存ライブラリだけ</font>をコンパイルします。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/build.gradle</div>
<pre class="android-code">
- compile 'com.android.support:multidex:' + rootProject.multidexVersion
- compile 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion
- compile 'com.android.support:design:' + rootProject.supportLibVersion
- compile 'com.android.support:support-v4:' + rootProject.supportLibVersion
- compile 'com.android.support.constraint:constraint-layout:' + rootProject.constraintLayoutVersion
- compile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion
- compile 'com.android.support:cardview-v7:' + rootProject.supportLibVersion
+ implementation 'com.android.support:multidex:' + rootProject.multidexVersion
+ implementation 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion
+ implementation 'com.android.support:design:' + rootProject.supportLibVersion
+ implementation 'com.android.support:support-v4:' + rootProject.supportLibVersion
+ implementation 'com.android.support.constraint:constraint-layout:' + rootProject.constraintLayoutVersion
+ implementation 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion
+ implementation 'com.android.support:cardview-v7:' + rootProject.supportLibVersion
</pre>
</div>
<p>以上で終了です。お疲れさまでした。<br/>
コンパイルが随分と高速化されました。</p>
<h3 class="paragraph-title-android">結論</h3>
<p>kotlinのNull Safety機能は強力ですね。小さいアプリだとAndroid Architecture Componentsは不要ですね。導入すると無駄にコードも増えますし。</p>
<p>kotlinの導入とconstraintLayoutの導入は本当にお勧めです。8.1のリリースも近いので、そろそろ既存アプリのandroid studio3.0の対応は終了させておきたいですね。</p>
<div class="pick-up-title">PICK UP</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51R7NEaIwDL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-02-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qI%81r%84%9F%84%9F60fps%82%F0%92B%90%AC%82%B7%82%E9%83%82%83_%83%93%82%C8GUI%83V%83X%83e%83%80%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51rrKjgnZRL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" >Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-03-24 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-45391423714337333812017-11-13T07:58:00.000+09:002017-11-29T21:40:08.464+09:00【書評】Kotlinイン・アクション<ul>
<li>公開日:2017年11月13日</li>
<li>最終更新日:2017年11月29日</li>
<li>学習期間:2017年11月06日 - 途中</li>
<li>学習期間:705minites[途中]</li>
</ul>
<div class="article-content">
<h3 class="paragraph-title-drone">初めに</h3>
<p>本格的にkotlinを利用するようになってきたので、詳細な仕様を把握するために本書を購入しました。<br/>この記事は感想とまとめを兼ねています。</p>
<p>本の評価には色々な視点がありますが、私はjavaのサーバーサイド、android, kotlinの開発経験があるので、その視点で本書を評価しています。</p>
<p>また、まとめの量が多くなってきたので、更新しながら感想を書いていきます。つまり、途中の殴り書きです。。。<br/>良書だし、ちゃんと最後にまとめます。</p>
<h3 class="paragraph-title-drone">紙 or 電子書籍</h3>
<p>頻繁に持ち運ぶなら電子書籍。職場や家置いとくなら紙で良いと思います。私はkindleで買いました。kindleだと容量を70Mくらい使うので、空容量に注意しましょう。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4839961743/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51YVxOeBctL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4839961743/masayan11315-22/" target="_blank" >Kotlinイン・アクション</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Dmitry Jemerov,Svetlana Isakova マイナビ出版 2017-10-31 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">本書の対象者</h3>
<p>Javaの実装経験と、簡単なkotlinの実装経験がある人が読む本です。javaやkotlinの実装経験がない人が読む本ではありません。</p>
<p>kotlinの実装経験がない場合は、「Kotlinスタートブック」から読みましょう。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4865940391/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51HzwN0d1iL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4865940391/masayan11315-22/" target="_blank" >Kotlinスタートブック -新しいAndroidプログラミング</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">長澤 太郎 リックテレコム 2016-07-13 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">章別感想とまとめ</h3>
<p>後々開発や復習で見返すようためのメモ書き。気になった事項の調査等。結構無駄に深く読み込んでいる箇所もあるので、そこは無視してください。</p>
<h3 class="paragraph-title-drone">1章</h3>
<p>kotlinは実用主義。アイデアを探求する言語ではない。<br/>多重配列が使いにくいのはそれでかな?<br/>もしくは、 Effective Javaの項目25「 配列よりリストを好む 」が適用されているか。。。</p>
<h3 class="paragraph-title-drone">2章</h3>
<h4>if文(p23 - p24)</h4>
<p>ifは式なので、<font color="red">値を返す</font>。</p>
<p>ブロック本体と式本体で記述可能</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/If.kt</div>
<pre class="android-code">
fun max (a : Int = 0, b : Int = 0) : Int {
return if a > b : a ? b
}
</pre>
</div>
<p><font color="red">{}で囲むことを「ブロック本体を持つ」という。</font> <br/>return文が必要。</p>
<p>式本体だけで書く</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/If.kt</div>
<pre class="android-code">
fun max (a : Int = 0, b : Int = 0) : Int = if a > b : a ? b
</pre>
</div>
<p><font color="red">直接返す場合は「式本体を持つ」という。</font></p>
<p><font color="red">式本体の関数の場合は、戻り値も省略可能</font></p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/If.kt</div>
<pre class="android-code">
fun max (a : Int = 0, b : Int = 0) = if a > b : a ? b
</pre>
</div>
<h4>変数</h4>
<p>なるべくval(イミュータブル(不変))で宣言するべき。</p>
<h4>クラス</h4>
<p>valはイミュータブル(不変)なのでgetterのみ</p>
<p>varはミュータブル(可変)なのでgetterとsetterの両方作成</p>
<p>プロパティを呼び出すとき、実際はgetterを利用している。</p>
<p>greteな仕様だ。</p>
<h4>カスタムアクセサ</h4>
<p>使ったことない。p33</p>
<h4>enum</h4>
<p>私は、Android開発ではenumは使わないで、Support Annotationを使う派です。でも、Android Architecture Componentsでは普通に使われていますね。Lifecycleのpublic enum Stateとか。。。proguardで難読化すれば問題はないのですが。。。</p>
<p>Androidの神と呼ばれているJakeWhartonさんはenum使うべき派だそうです。<a href="https://qiita.com/tomoima525/items/962ec58ad8332e165d17" target="blanks">参考</a><br/>理由は、我々は組み込みエンジニアではなく、Webエンジニアである。との理由だそうです。AndroidエンジニアはWebエンジニアではなく、組み込みエンジニアであるじゃないのかな???よくわかりません。。。</p>
<h4>when</h4>
<p>whenは式なので<font color="red">値を返す</font>。当然、ブロックを使うこともできます。<br/>javaと異なり、オブジェクトも利用可能。本書では、setOfでSetオブジェクトを作成して比較している。</p>
<p>setOfはkotlinで以下のように実装されている。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/If.java</div>
<pre class="android-code">
public fun <T> setOf(vararg elements: T): Set<T> = if (elements.size > 0) elements.toSet() else emptySet()
</pre>
</div>
<p>Setオブジェクトを返していますね。toSetはkotlin.collectionsパッケージで実装されています。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/If.java</div>
<pre class="android-code">
/**
* Returns a [Set] of all elements.
*
* The returned set preserves the element iteration order of the original array.
*/
public fun <T> Array<out T>.toSet(): Set<T> {
return when (size) {
0 -> emptySet()
1 -> setOf(this[0])
else -> toCollection(LinkedHashSet<T>(mapCapacity(size)))
}
}
</pre>
</div>
<p>ここでもwhenを使ってますね。out Tのout 修飾子を利用しています。<a href="https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/generics.html" target="blank">分散アノテーション</a>ともいいます。つまりクラスC は T の プロデューサ であり、 T の コンシューマ ではない、と考えます。</p>
<h4>スマートキャスト</h4>
<p>kotlinの地雷ですね、これ。ネットにもあまり良い説明が載ってない。どうしても好きになれない仕様。</p>
<p>isでチェックとキャストを両方やる。</p>
<p>valで宣言されている必要がある。</p>
<h3 class="paragraph-title-drone">3章</h3>
<h4>トップレベル関数(p64 - 66)</h4>
<p>説明がわかりにくいです。要は、javaのようにクラス宣言をしなくてもメソッドを作成できるし、呼び出せるってことですね。</p>
<p>まずはjavaで乗数を計算するクラスと実行クラスを実装してみます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/Top.java</div>
<pre class="android-code">
package inaction;
public class Top {
public static Double topFunction() {
double a = 2.0;
return Math.pow(a, 2.0);
}
}
</pre>
</div>
<div class="code_block">
<div class="android-code-header">{project_folder}/Jikko.java</div>
<pre class="android-code">
import inaction.Top;
public class Jikko {
public static void main(String []args) {
System.out.println(Top.topFunction());
}
}
</pre>
</div>
<p>実行結果は[4]です。両方ともclassを宣言して、メソッドにstatic宣言をしています。<br/>kotlinの場合は、classとstatic宣言が不要になります。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/Jikko.kt</div>
<pre class="android-code">
import inaction.topFunction
fun main(args : Array<String>) {
System.out.println(topFunction())
}
</pre>
</div>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/Top.java</div>
<pre class="android-code">
package inaction
fun topFunction() : Int {
val a = 2.0
return Math.pow(a, 2.0).toInt()
}
</pre>
</div>
<p>結果は同じように4になります。<font color="red">javaクラスにコンパイルされる時に勝手にクラスが作成されて、メソッドがstaticになります。</font><br/>
さらに、ファイルクラスの名前も変更できます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/Top.java</div>
<pre class="android-code">
@file:JvmName("AnotherTop")
package inaction
fun topFunction() : Int {
val a = 2.0
return Math.pow(a, 2.0).toInt()
}
</pre>
</div>
<p>@file:JvmNameアノテーションでファイル名を変更できます。</p>
<p>呼び出してみます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/Top.java</div>
<pre class="android-code">
import inaction.AnotherTop;
public class Jikko {
public static void main(String []args) {
System.out.println(AnotherTop.topFunction());
}
}
</pre>
</div>
<p>別名AnotherTopで呼び出せています。</p>
<h4>拡張関数</h4>
<p>これはkotlinを使っている人はみんな知っていますね。</p>
<p>拡張関数はオーバーライドは無理なことを覚えておきましょう。静的関数だから、当たり前ですね。</p>
<h4>可変長引数</h4>
<p>使うケースは、まずない気がしますが、忘備録的に記載しておきます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/inaction/Kahen.kt</div>
<pre class="android-code">
fun main(args : Array<String>) {
accept("test1", "test2", "test3")
}
fun accept(vararg msg: String) {
System.out.println(listOf(*msg))
}
</pre>
</div>
<p>可変長引数は、スプレッド演算子「*」を使います。</p>
<h4>to</h4>
<p>mapOfで利用するtoは関数です。中置呼び出しと呼びます。toはPairクラスを返します。ScalaのTupleと同じ機能です。</p>
<div class="android-code-header">{project_folder}/inaction/To.kt</div>
<pre class="android-code">
val map = mapOf(1 to "one", 2 to "two")
for ((key, value) in map.iterator().withIndex()) {
System.out.println("key:${key}, valu:${value}")
}
key:0, valu:1=one
key:1, valu:2=two
</pre>
<h4>トリプルクヴォート</h4>
<p>あまり使い道がなさそう</p>
<h4>ローカル関数</h4>
<p>関数の中で関数の宣言をすることです。javaScriptのような記載が可能です。無駄な宣言を減らせます。</p>
<h3 class="paragraph-title-drone">4章</h3>
<p>kotlinのクラスやメソッドはデフォルトでfinal。継承可能なクラスはopenをつける必要がある。</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
class Button {
fun disable() {}
open fun amimate() {}
fun click() {}
}
// finalエラーが出る。
class TextButton : Button() {
}
</pre>
<p>openを追加します。</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
open class Button {
fun disable() {}
open fun amimate() {}
fun click() {}
}
class TextButton : Button() {
override fun amimate() {
super.amimate()
}
// これはfinalエラー
override fun click() {}
}
</pre>
<p>デフォルトがfinalの利点は、<font color="red">スマートキャストが可能</font>になることです。</p>
<p>ただし、abstractクラスのメソッドは継承前提なので、openは不要。</p>
<h4>sealed class</h4>
<p>暗黙的にopenのついているクラス。クラスの継承を制限するために使います。インタフェースにはsealedがつけられません。子クラスにdataクラスを持つこともできます。<br/>
whenでelse文で使うとelseが必要なくなります。まだあまり使い道が理解できてません。</p>
<h4>クラス移譲 byキーワード</h4>
<p>説明がわかりにくいです。記載してあるコードも動かないし。移譲に関しては、<a href="https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/delegation.html" target="target">公式サイト</a>を読みましょう。クラス移譲は、インターフェースの実装を他のクラスに委譲できます。<br/>
デザインパターンのデリゲートパターンですね。</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
interface Base {
fun onClick()
}
class BaseImpl() : Base {
override fun onClick() {
System.out.println("clicked!!")
}
}
class Application(base: Base) : Base by base
fun main(args: Array<String>) {
val b = Application(BaseImpl())
Application(b).onClick()
}
</pre>
<h4>オブジェクト宣言</h4>
<p>シングルトンを作成する</p>
<h3 class="paragraph-title-drone">5章</h3>
<h4>コレクション操作</h4>
<p>mapは集約</p>
<p>filterはフィルタリング</p>
<h4>遅延コレクション操作</h4>
<p>一時オブジェクトを生成しないコレクションチェーンです。</p>
<p>mapは集約</p>
<h4>SAM</h4>
<p>関数が一つのjava interfaceはラムダで代用できる。</p>
<p>匿名objectでも代用できるが、呼び出しごとにインスタンスを生成する。</p>
<p>インスタンスを何度も生成しないで利用する場合は、以下のように実装する(p168)</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
vae listener = OnClickListener { view - >
// something
}
</pre>
<p>ラムダ内でthisは使えない。なぜならコードブロックだから。</p>
<h4>with</h4>
<p>最初の引数を、二番目の引数のラムダレシーバに変換する。</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
fun alphabet = with(StirngBuilder()) {
// something
toString
}
</pre>
<p>上記のような書き方も可能。。。</p>
<p>ラムダの実行結果を返す。<br/>レシーバ(引数)を返したい場合は、applyを使う</p>
<h4>apply</h4>
<p>レシーバ(引数)を返したい場合に使う。TextViewで複数の値を設定する場合に利用する。(p172)</p>
<h3 class="paragraph-title-drone">6章</h3>
<h4>エルビス演算子</h4>
<p>監獄ロックだろ。知ってるよ。</p>
<p>null値の代わりにデフォルトを返す演算子です。</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
fun alphabet = with(aaa :Stvring?) {
val msg: String? = aaa ?: "hello"
}
</pre>
<h4>as?</h4>
<p>null値の代わりにデフォルトを返す演算子です。</p>
<h4>let</h4>
<p>型のチェック</p>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
if (aaa != null) {
mesoddo(aaa)
}
</pre>
<div class="android-code-header">{project_folder}/inaction/test.kt</div>
<pre class="android-code">
aaa?.let { mesoddo(it)}
</pre>
<div class="related-article-title">関連記事</div>
<ul>
<li class="footer-list-link"><a href="https://github.com/Kotlin/kotlin-in-action" target="blank">git</a></li>
</ul>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-39101733425147685932017-11-08T21:49:00.000+09:002017-11-08T21:49:05.865+09:00【ethereum】ethereumのインストールと動作の確認<ul>
<li>公開日:2017年10月26日</li>
<li>実施日:2017年10月26日 - 2017年11月08日</li>
</ul>
<h3 class="paragraph-title-unity">記事概要</h3>
<p>仮想通貨の仕組みを理解するために、ethereumをインストールして色々と試してみたので、その作業記録です。<br/>
<a href="https://book.ethereum-jp.net/first_use/connect_to_private_net.html#fn_3" target="blank">この記事</a>を使って開発環境を構築しました。<br/>
現在利用できない箇所や足りない部分を記事で補完しています。</p>
<h3 class="paragraph-title-unity">環境</h3>
<ul>
<li>Ubuntu 16.04.3 LTS</li>
<li>ethereum Geth/v1.7.2</li>
</ul>
<h3 class="paragraph-title-unity">ethereumのインストール</h3>
<p>デフォルトのdockerを使う場合は、curlをインストールします。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
apt-get install curl
</pre>
<p>ethereum公式の<a href="https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu" target="blank">Wiki</a>に記載されている通りにethereumをインストールします。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
apt-get install software-properties-common
add-apt-repository -y ppa:ethereum/ethereum
apt-get update
apt-get install ethereum
</pre>
<p>gethコマンドでinstallが成功されたことを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
geth help
NAME:
geth - the go-ethereum command line interface
Copyright 2013-2017 The go-ethereum Authors
USAGE:
geth [options] command [command options] [arguments...]
VERSION:
1.7.2-stable-1db4ecdc
// something
</pre>
<h3 class="paragraph-title-chef">プライベート・ネットに接続</h3>
<p>開発で使うので、プライベート・ネットで動作させます。まずは、ディレクトリを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
cd /home
mkdir -p test_u/eth_private_net
</pre>
<p>myGenesis.jsonを作成します。Genesisは、初期データのことです。つまり、myGenesis.jsonは初期データファイルです。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
apt-get install vi
cd /home/test_u/eth_private_net
vi myGenesis.json
{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
// https://qiita.com/oggata/items/eea4d5e37f38785f6079
</pre>
<p>データ内容はまだ触れないでおきます。gasLimitやcoinbaseの意味は、最初はわからないと思います。</p>
<p>myGenesis.jsonファイルで初期化します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
geth --datadir /home/test_u/eth_private_net2 init /home/test_u/eth_private_net2/myGenesis.json
</pre>
<p>指定オプションの意味はhelpで確認しましょう。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
--datadir "/root/.ethereum" Data directory for the databases and keystore
init Bootstrap and initialize a new genesis block
</pre>
<p>Genesis Block = 一番初めのブロックのことです。</p>
<p>つまり、上記は、一番初めのブロックを初期化していることを示しています。実際に実行します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
geth --datadir /home/test_u/eth_private_net2 init /home/test_u/eth_private_net2/myGenesis.json
WARN [10-25|23:04:56] No etherbase set and no accounts found as default
INFO [10-25|23:04:56] Allocated cache and file handles database=/home/test_u/eth_private_net/geth/chaindata cache=16 handles=16
Fatal: Failed to write genesis block: genesis has no chain configuration
</pre>
<p>chaindataディレクトリが新しく作成されて、その中にgenesisブロックのブロックチェーン情報が保存されていることを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
ls -l geth/chaindata
total 12
-rw-r--r-- 1 root root 0 Oct 25 23:04 000001.log
-rw-r--r-- 1 root root 16 Oct 25 23:04 CURRENT
-rw-r--r-- 1 root root 0 Oct 25 23:04 LOCK
-rw-r--r-- 1 root root 361 Oct 25 23:04 LOG
-rw-r--r-- 1 root root 54 Oct 25 23:04 MANIFEST-000000
</pre>
<p>初期化に成功しました。</p>
<h3 class="paragraph-title-chef">gethの起動</h3>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
geth --dev --networkid "10" --datadir "/home/test_u/eth_private_net2" console 2>> /home/test_u/eth_private_net2/geth_err.log
</pre>
<p><font color="red">テストネットで起動するときは、--networkid を付加します。--networkidオプションで任意の正の整数のIDを指定することで、ライブ・ネットとは異なるネットワークを立ち上げることが可能です。</font></p>
<p>また、--dev を付加して開発用途のプライベートチェーン設定で起動しましょう。--devをつけることで素早く採掘ができます。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
</pre>
<p>起動に成功しました。</p>
<h3 class="paragraph-title-chef">データの確認</h3>
<p>まずは、対話型で動きと仕様を理解していきます。</p>
<p>eth.getBlock(0)で登録データを確認できます。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getBlock(0)
{
difficulty: 17179869184,
extraData: "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
gasLimit: 5000,
gasUsed: 0,
hash: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 540,
stateRoot: "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544",
timestamp: 0,
totalDifficulty: 17179869184,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
</pre>
<p>eth.getBlock(0)は初期データです。</p>
<p>exitコマンドで退出できます。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> exit
root@04a2878d5ace:/home/test_u/eth_private_net#
</pre>
<h3 class="paragraph-title-chef">採掘</h3>
<p>次は採掘してみましょう。ビットコインでいう、マイニングです。</p>
<p>ビットコインは平均10分ごとにブロックを生成しますが、イーサリアムは15秒です。</p>
<p>まず、ノードに登録されたアカウント(EOA)を表示します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.accounts
[]
</pre>
<p>最初は上記のように空です。</p>
<p>EOA(Externally Owned Account)を作成します。<br/>
personal.newAccount("passwd")コマンドを使います。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> personal.newAccount("passwd")
"0xe1a9e49ee272e6ab971b5f6160d8157ff9fe412b"
</pre>
<p>passwdは、本番は実際のパスワードを入力してください。これでEOA(Externally Owned Account)を作成できます。<br/>
実行すると、作成されたEOAの20バイトのアドレスが表示されます。</p>
<p>頭に「0x」が付加されているので16進数のハッシュですね。</p>
<p>もう一つアカウントを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> personal.newAccount("passwd2")
"0x0f8669608765e4df02f2a348d11954696ae5698d"
</pre>
<p>ノードに登録されたアカウント(EOA)を表示します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.accounts
["0xe1a9e49ee272e6ab971b5f6160d8157ff9fe412b", "0x0f8669608765e4df02f2a348d11954696ae5698d"]
</pre>
<p>ノードに登録されたアカウント(EOA)が表示されました。</p>
<h3 class="paragraph-title-chef">etherbase</h3>
<p>etherbaseとは、各ノードで採掘を行う際にその報酬を紐づけるEOAのアドレスを示します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.coinbase
"0xe1a9e49ee272e6ab971b5f6160d8157ff9fe412b"
</pre>
<h3 class="paragraph-title-chef">etherの採掘</h3>
<p>作成したEOAのアドレスがetherbaseとしてセットされていれば、etherの採掘が可能です。 etherの採掘はminer.start(thread_num)コマンドで開始します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> miner.start()
null
</pre>
<p>nullが表示されていますが、採掘は実行されています。これは少しわかりにくい仕様ですね。以前はtrueが返される仕様だったのですが、なぜ変更したのでしょうか?</p>
<p>採掘が実行されてるかを確認するには、eth.hashrateコマンドで、現在の採掘処理のハッシュ・レートを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.hashrate
2096
> eth.hashrate
66704
</pre>
<p>ハッシュ・レートがゼロよりも大きければ、採掘処理が行われていると考えます。続ければ続けるほど数値はどんどん上がっていきます。</p><p>採掘は時間がかかります。しかし、この記事ではdev環境で動かしているので、次々と採掘されます。</p>
<p>また、ログで確認する方法もあります。ログ出力フォルダの指定は起動時に行っておきましょう。dockerの場合は、terminalでps接続で確認できます。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
docker exec -it {name} /bin/sh
</pre>
<h3 class="paragraph-title-chef">採掘状況の確認</h3>
<p>ブロックは次々と採掘されていきます。ブロックチェーンに何番目のブロックまで連なっているのか(=ブロック高)を確認するには、eth.blockNumberコマンドを用います。 </p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.blockNumber
65
> eth.blockNumber
68
> eth.blockNumber
81
> eth.blockNumber
117
> eth.blockNumber
123
</pre>
<p>必要な数のブロックを採掘したら、採掘を停止します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> miner.stop()
true
</pre>
<p>採掘したブロックの情報を確認します。</p>
<p>123のブロックを採掘したので、123番目のブロックを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getBlock(123)
{
difficulty: 139055,
extraData: "0xd583010702846765746885676f312e39856c696e7578",
gasLimit: 4712388,
gasUsed: 0,
hash: "0x8409ba210cf0a933321c9fc9b1d54dd4b39d98833fa412417ab88c6336603be0",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x7a05d8030738af4ffe794d8b3d3b86ee28e11318",
mixHash: "0xb090804669ad4b7922f63f4ed91c05f1dabb29ff609695bd6018de2002a01f05",
nonce: "0x584cd0329f0dd51d",
number: 123,
parentHash: "0x07599d3aeb1dd4f9fb322326e68f89e5bc2cb6a260a82a504ee74929a2f86fab",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 533,
stateRoot: "0x4eab6ed2c31249285c576d0d79bf629bb811750f31e671f71ff0937a2da29aef",
timestamp: 1509576985,
totalDifficulty: 16739304,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
</pre>
<p>まだ採掘されていない124番目のブロックを確認してみます。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getBlock(124)
null
</pre>
<h3 class="paragraph-title-chef">報酬の確認</h3>
<p>採掘した報酬を確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getBalance(eth.accounts[0])
369000000000000000000
</pre>
<p>eth.getBalance(address)は「wei」の単位で出力します。単位をethに変換してみましょう。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
369
</pre>
<h3 class="paragraph-title-chef">送金</h3>
<p>送金の仕組みを理解します。<br/>各アカウントの残高を確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getBalance(eth.accounts[0])
369000000000000000000
> eth.getBalance(eth.accounts[1])
0
</pre>
<p>eth.accounts[0]からeth.accounts[1]に2ether送金してみます。<br/>eth.sendTransactionコマンドを用います</p>
<p>送金の際は、採掘処理をバックグラウンドで実行しておく必要があります。また、ロックの解除も必要です。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
// 採掘
miner.start()
// ロック解除 パスワードが必要
personal.unlockAccount(eth.accounts[0])
// 送金の実行。 パスワードは不要
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(4, "ether")})
// 確認
eth.getBalance(eth.accounts[1])
4000000000000000000
</pre>
<p>今度は逆にaccounts[1]からaccounts[0]に送金します。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
// 採掘
> miner.start()
null
// ロック解除 パスワードが必要
> personal.unlockAccount(eth.accounts[1])
Passphrase:
true
// 送金の実行。 パスワードは不要
> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(2, "ether")})
"0xa0f782ee4245e886f9d79cf682006ac479857b8f43bba3d5b3df022f18cecc30"
// 確認
> eth.getBalance(eth.accounts[1])
2000000000000000000
</pre>
<p>トランザクションを調べます。sendTransaction時に発行されたハッシュを使います。</p>
<div class="rails-code-header">terminal</div>
<pre class="golang-code">
> eth.getTransaction("0xa0f782ee4245e886f9d79cf682006ac479857b8f43bba3d5b3df022f18cecc30")
{
blockHash: "0x2756e0ac42054df3f792b6861f16a9b19392c66b149d6a54dee56eee3ca5eeda",
blockNumber: 315,
from: "0xd286d2666015e7a36d5826bd49f83af4ea922f52",
gas: 90000,
gasPrice: 0,
hash: "0xa0f782ee4245e886f9d79cf682006ac479857b8f43bba3d5b3df022f18cecc30",
input: "0x",
nonce: 0,
r: "0xbba0222bb19a7ad54cb5fd0f9512f256285caeaa98ddb396ed1b256b0e8dab54",
s: "0x2d5329ce25e69ad94709f302c972071cab2a5363bdffacdb19fdb11986ddda71",
to: "0x7a05d8030738af4ffe794d8b3d3b86ee28e11318",
transactionIndex: 0,
v: "0xa95",
value: 2000000000000000000
}
</pre>
<p>トランザクションが表示されました。gasPriceが0なので、トランザクションを生成した際に採掘者に対して支払うトランザクション手数料は無料になっていますね。</p>
<h3 class="paragraph-title-chef">Contract</h3>
<p>やってみたけど、情報が古くてうまくいかないので、penddingします。今はSolcが使えなくなっているので、情報を集める時は注意してください。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>実際に手を動かすと、ethereumの基本が理解できました。<br/>
とはいえ、騒がれているほどの凄さは感じなかったので、これからも少しづつブロックチェーンの学習を進めていきたいと思います。<br/>
railsやスマホのように化けて役立ってくれるかもしれないので。。。</p>
<p>以上。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B073TRC78W/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/41ZBLZWxJIL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B073TRC78W/masayan11315-22/" target="_blank" >ブロックチェーン イーサリアムへの入り口 ビットコインへの入り口 (ブロックチェーン技術書籍)[Kindle版]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">日本電気株式会社 金融システム開発本部 金融デジタルイノベーション技術開発室,コンセンサス・ベイス株式会社 2017-07-09 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B072JJL66R/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/513SahVjL1L._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B072JJL66R/masayan11315-22/" target="_blank" >ビットコインとブロックチェーン[Kindle版]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="https://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">アンドレアス・M・アントノプロス NTT出版 2017-06-01 </div><div class="booklink-link2" style="margin-top:10px;"> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3 class="related-article-title">参考記事</h3>
<ul>
<li><a href="https://qiita.com/amachino/items/b59ec8e46863ce2ebd4a" target="_blank">Ethereum スマートコントラクト入門:geth のインストールから Hello World まで</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-36995973451958518242017-08-13T21:00:00.002+09:002017-08-13T21:00:59.236+09:00【機械学習】AnacondaでOpenCVをinstallする<ul>
<li>公開日:2017年08月13日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>機械学習の環境をdockerで生成して、opencvをinstallする方法を記載した記事です。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>Docker version 17.06.0-ce</li>
<li>ubuntu 16.04.2 LTS</li>
<li>Python 3.6.1 :: Anaconda custom (64-bit)</li>
</ul>
<div class="article-content">
<h3 class="paragraph-title-android">opencvインストール</h3>
<p>opencvをAnacondaでインストールします。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
conda install -c https://conda.anaconda.org/menpo opencv3
</pre>
<p>これだけでopencvを実行しようとすると</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
ImportError: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory
</pre>
<p>が発生しました。<br/>
なので、以下のように対応します。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
apt-get update
apt-get install libgtk2.0-0
</pre>
<p>これでopencvが動きます。</p>
<p>サンプルのopencv.pyファイルを作成して実行します。</p>
<div class="android-code-header">opencv.py</div>
<pre class="android-code">
# -*- coding: utf-8 -*-
import cv2
def main():
print(cv2.__version__)
if __name__ == "__main__":
main()
</pre>
<div class="android-code-header">terminal</div>
<pre class="android-code">
python opencv.py
3.1.0
</pre>
<p>opencvが動作しました。</p>
<p>PS : apt-get install libgtk2.0-0を実行してもdbusのエラーは残ります。conda install dbusしても修正されません。。。調べてみると、ubuntuでは色々と問題があるみたいですね。apt-get updateを実行しても問題ないようなので、このまま利用します。</p>
<h3 class="paragraph-title-android">まとめ</h3>
<p>opencvをdockerとubuntuで利用するのは、あまり相性が良くないようです。opencvが古いバージョンだとうまくいくという情報もあるみたいなので、そちらを利用してもいいでしょう。<br/>
しかし、pythonの環境構築はRubyよりひどい気がします。定期的なライブラリの更新とかできるのでしょうか。</p>
</div>
<div class="pick-up-title">PICK UP オススメ本</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873116074/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51QXhImnmFL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873116074/masayan11315-22/" target="_blank" >実践 コンピュータビジョン</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Jan Erik Solem オライリージャパン 2013-03-23 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873116074/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%8E%C0%91H%20%83R%83%93%83s%83%85%81%5B%83%5E%83r%83W%83%87%83%93&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-52246531373189971082017-07-30T10:04:00.000+09:002017-07-30T10:04:06.499+09:00【Docker】UnicodeEncodeError: 'ascii' codec can't encode characters in position. Dockerのターミナルで日本語を使う<ul>
<li>公開日:2017年07月30日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>機械学習の環境をdockerで生成して、ターミナルに日本語を出力処理するとエラーが発生します。<br/>
この記事はdockerで日本語を出力する方法を記載した記事です。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>Docker version 17.06.0-ce</li>
<li>ubuntu 16.04.2 LTS</li>
<li>Python 3.6.1 :: Anaconda custom (64-bit)</li>
</ul>
<div class="article-content">
<h3 class="paragraph-title-android">ターミナル</h3>
<p>dockerのubuntu環境だと、デフォルトでターミネルの日本語の出力ができません。<br/>MeCabなどを使ってprintで文字を出力しようとすると、<br/>
'ascii' codec can't encode characters in position<br/>
が発生します。</p>
<p>これだと使いにくいので、dockerのターミネルで日本語を利用できるようにします。</p>
<h3 class="paragraph-title-android">locale変更</h3>
<p>localeを日本語に変更します。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
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=
</pre>
<p>dockerのデフォルトは、POSIXです。なので、日本語にします。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
export LC_ALL=ja_JP.UTF-8
</pre>
<p>変更を確認します。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
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
</pre>
<p>これで完了です。pythonのMecabを実行して確認します。</p>
<div class="android-code-header">terminal</div>
<pre class="android-code">
python tolenize_ja.py
第 9 9 回 全国 高校 野球 選手権 埼玉 大会 は 、 花咲 徳 栄 が 3 年 連続 5 回 目 の 優勝 を 果たし 、 県内 1 5 6 チーム ( 1 6 1 校 ) の 頂点 に 立っ た 。
</pre>
<p>正常に日本語が出力されました、</p>
<h3 class="paragraph-title-android">まとめ</h3>
<p>機械学習の環境にDockerを使うのは、とても良い選択です。Dockerの学習は慣れるまで大変ですが、使えば使うほど生産性も向上するので、ぜひ利用してください。</p>
</div>
<div class="pick-up-title">PICK UP オススメ本</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4844339621/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51Rr9x3ASFL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4844339621/masayan11315-22/" target="_blank" >Docker 実践ガイド (impress top gear)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">古賀 政純 インプレス 2015-12-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4844339621/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0191B5FE4/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-32916680408175293632017-07-09T12:26:00.000+09:002017-07-09T12:26:28.622+09:00【Rails5.1.2】 Rails5.1.0からRails5.1.2にアップグレードする。<ul>
<li>公開日:2017年07月09日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>気づいたらRails5.1.2がリリースされたのでアップグレードしました。まとめ記事です。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>centos6.5</li>
<li>Rails5.1.0 → Rails5.1.2</li>
<li>ruby2.3.0</li>
<li>rbenv</li>
<li>unicorn</li>
<li>whenever</li>
</ul>
<h3 class="paragraph-title-chef">移行用の作業branchの作成</h3>
<p>gitでrails5.1.2移行用の作業ブランチを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
cd {project_folder}
git branch feature/rails5.1.2
</pre>
<p>checkoutでブランチを切り替えます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
git checkout feature/rails5.1.2
</pre>
<p>準備完了です。</p>
<h3 class="paragraph-title-chef">Gemfile修正</h3>
<p>まずGemfileを修正します。</p>
<div class="rails-code-header">{project_folder}/Gemfile</div>
<pre class="rails-code">
# 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'
</pre>
<p>gem 'rails', '5.1.2'に修正し、updateします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
// update
bundle update
</pre>
<p>bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。</p>
<p>Bundle updated!が表示されれば成功です。5.1.0に対応してあれば、bundle updateはひっかからないはずです。</p>
<h3 class="paragraph-title-chef">Upgrade 設定ファイル</h3>
<p>Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
bundle exec rails app:update
</pre>
<p>ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。<br/>
私の環境では以下のようにしました。</p>
<ul>
<li>config/routes.rb → 更新しない</li>
<li>config/application.rb → 更新しない</li>
<li>config/secrets.yml → 更新しない</li>
<li>config/cable.yml → <font color="red">更新する</font></li>
<li>config/puma.rb → <font color="red">更新する</font></li>
<li>config/environments/development.rb → 更新しない</li>
<li>config/environments/production.rb → 更新しない</li>
<li>config/environments/test.rb → 更新しない</li>
<li>config/initializers/assets.rb → 更新しない</li>
<li>config/initializers/new_framework_defaults.rb → 更新しない</li>
<li>bin/setup → <font color="red">更新する</font></li>
<li>bin/update → <font color="red">更新する</font></li>
</ul>
<p>更新後は、git diffでファイルを比較して必要な設定だけ元に戻します。<br/>5.1.2は5.1.0とほとんど差異がありません。更新の目的はセキュリティアップデートとなります。</p>
<h3 class="paragraph-title-chef">Rails5.1.2起動</h3>
<p>アプリを起動します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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
</pre>
<p>コンソールにRails 5.1.2 applicationが表示され、画面が表示されれば成功です。</p>
<p>だいたいここまでで10分くらいです。あとは、テストコードを実行してデグレを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
bundle exec rspec
Finished in 2 minutes 4.6 seconds (files took 7.11 seconds to load)
237 examples, 0 failures, 15 pending
</pre>
<p>問題ありませんでした。DEPRECATION WARNINGも発生せず。</p>
<h3 class="paragraph-title-chef">リリース</h3>
<p>capistrano3を使っていつも通りリリースすればOKです。少し時間がかかります。一通りの動作確認はしておきましょう。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>Rails5.1.0からRails5.1.2のアップデートは、20分もあれば完了します。<br/>
さっさと更新しておきましょう。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51GLBK7MuVL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Ruby on Rails 5 超入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">掌田津耶乃 秀和システム 2016-12-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Ruby%20on%20Rails%205%20%92%B4%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" ><img src="http://ecx.images-amazon.com/images/I/5102wwx0VzL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >メタプログラミングRuby 第2版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Paolo Perrotta オライリージャパン 2015-10-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83%81%83%5E%83v%83%8D%83O%83%89%83~%83%93%83ORuby%20%91%E62%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト(railsで作成しています)</h3>
<hr/>
<ul>
<li><a href="http://mountain-channel.com/" target="_blank">マウンテンチャンネル</a></li>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-30908364346218578202017-07-08T23:10:00.000+09:002017-07-08T23:10:12.591+09:00【Docker】DockerでWEBフロント開発の環境を構築<ul>
<li>公開日:2017年07月08日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>今はjavascriptやcssの開発でもコンパイル環境が必要になってきました。</p>
<p>この記事は、Dockerでフロント開発の環境を構築する方法を記載しました。webpackとbabel(とreactやvueやbackborn)を使って開発することを前提に構築します。<br/>
汎用性は求めていないので、dockerファイルは使いません。あくまでメインマシンを汚さないために、dockerで開発環境を用意します。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>macOS Sierra</li>
<li>docker 17.06.0-ce</li>
<li>Ubuntu 16.04.2 LTS</li>
<li>nvm 0.33.2</li>
<li>node v8.1.3</li>
<li>webpack 3.1.0</li>
</ul>
<h3 class="paragraph-title-chef">前提</h3>
<ul>
<li>dockerをインストール済み</li>
<li>webpackやbabelなどのライブラリの多少の知識がある</li>
</ul>
<h3 class="paragraph-title-chef">工数</h3>
<p>blogを書きながらでも2時間くらいで構築できました。<br/>
私はAndroidとRailsアプリをメインで開発しているのでフロントは専門ではありませんが、慣れている人ならあっという間に終わると思います。</p>
<h3 class="paragraph-title-chef">dockerコンテナ起動</h3>
<p>利用するdockerイメージを確認します。</p>
<div class="rails-code-header">terminal(mac)</div>
<pre class="blogger-code">
// フォルダ移動
cd /Users/dameotoko/workspace/docker
// dockerイメージの確認
docker images
ubuntu latest d355ed3537e9 2 weeks ago 119MB
</pre>
<p>ubuntuのイメージを使います。<br/>
ttyでdockerを起動します。</p>
<div class="rails-code-header">terminal(mac)</div>
<pre class="blogger-code">
// ttyで起動
docker run -v /Users/dameotoko/workspace/docker/react:/var/www -i -t ubuntu /bin/bash
</pre>
<p>オプション -v はVOLUME命令です。</p>
<p>Dockerコンテナ内の指定したパスをマウントできるように命令します。</p>
<p>ここではmacの/Users/dameotoko/workspace/docker/reactフォルダ配下と、dockerコンテナの/var/www配下を共有して開発するように指定しています。</p>
<p>共有できているか試してみます。</p>
<div class="rails-code-header">terminal(mac)</div>
<pre class="blogger-code">
// 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
</pre>
<p>macとdockerコンテナでファイルが連携されました。</p>
<h3 class="paragraph-title-chef">nvmインストール</h3>
<p>最新のnode.jsを使えるように、nvmをインストールします。<br/>nvmは、rubyのrbenvとか、pythonのcondaと同じバージョン管理ツールです。
まずはsudoを利用可能にします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
apt-get update
apt-get install -y sudo
</pre>
<p>ソースパッケージをビルドするために必要なパッケージを事前にインストールします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
sudo apt-get install build-essential libssl-dev
</pre>
<p>curlをインストールします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
sudo apt-get install curl
</pre>
<p>nvmをインストールします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 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
</pre>
<p>nvmが正常にインストールされました。</p>
<h3 class="paragraph-title-chef">nodeインストール</h3>
<p>nodeをインストールします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 利用可能なバージョン確認
nvm ls-remote
v8.1.3
// install
nvm install 8.1.3
</pre>
<p>~/.nvm ディレクトリ配下に、指定したバージョンのnode.jsがインストールされます。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
ls -l ~/.nvm/versions/node/
total 4
drwxr-xr-x 7 root root 4096 Jul 8 06:45 v8.1.3
</pre>
<p>デフォルトに設定されていることを確認します。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
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
</pre>
<p>準備完了です。</p>
<h3 class="paragraph-title-chef">プロジェクトHello world作成</h3>
<p>サンプルとしてjsプロジェクを作成します。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// プロジェクトフォルダ
cd /var/www
npm init -y
npm install --save-dev webpack babel-loader babel-core babel-preset-env babel-preset-react babel-preset-es2015
</pre>
<p>プロジェクトが作成されます。バージョン指定していないのでwebpackは3.1.0がインストールされました。<br/>webpack.config.jsは自動作成されないので、生成します。
</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 生成
touch webpack.config.js
</pre>
<p>設定を記載します。</p>
<div class="rails-code-header">root/webpack.config.js</div>
<pre class="blogger-code">
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']
}
}
]
}
};
</pre>
<p>webpack3だとloader: "babel-loader"になっているので注意してください。具体的な設定は<a href="http://qiita.com/HayneRyo/items/74892d3a37ee96a5df60">ここ</a>が参考になります。</p>
<p>簡単なHello worldアプリを作成します。<Br/>まずはエントリーポイントを作成します。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 生成
touch entry.js
</pre>
<p>entry.jsを作成します。</p>
<p>続けてindex.htmlを作成します。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 生成
touch index.html
</pre>
<p>htmlタグを記載します。</p>
<div class="rails-code-header">root/index.html</div>
<pre class="blogger-code">
<!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>
</pre>
<p>ビルドします。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
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]
</pre>
<p>babelを使ってMessageクラスを作成します。</p>
<div class="rails-code-header">terminal(docker)</div>
<pre class="blogger-code">
// 生成
touch message.js
</pre>
<p>コードを記載します。</p>
<div class="rails-code-header">message.js</div>
<pre class="blogger-code">
class Message {
constructor(msg) {
this.msg = msg;
}
}
export default Message;
</pre>
<p>エントリーポイントで利用します。</p>
<div class="rails-code-header">entry.js</div>
<pre class="blogger-code">
import Message from './message';
var message = new Message('Hello world');
console.log(message);
</pre>
<p>htmlをブラウザで開いてコンソールログを確認します。</p>
<div class="rails-code-header">console</div>
<pre class="blogger-code">
Message {msg: "Hello world"}
msg
:
"Hello world"
__proto__
:
Object
</pre>
<p>うまくいきました。あとはアプリの開発をするだけです。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>webpackやbabelを使った開発ができるフロントエンジニアはまだ少ないみたいです。フロントができるといいながら、jqueryしかできない人を未だによく見かけます。時代をちゃんと追いかけましょう。</p>
<p>今後は他の言語と同じように開発環境の構築が求められていくはずです。複雑そうに見えますが、実際に触ってみるとそれほど難しくないので、定期的にキャッチアップしていくといいと思います。<br/>今から学習するなら、TypeScriptとReactの組み合わせが、一番良い選択だと思います。</p>
<p>また、開発環境はdockerじゃなくてvagrantでも良いと思います。ただ、dockerの方が簡単だと(個人的に)思います。</p>
<p>また、サーバーエンジニアやスマホのネイティブエンジニアもフロントを触ってみてください。色々と知識を応用できるようになってきているので、定期的に簡単なアプリを作ると良いと思います。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873113911/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51l0nocFbqL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873113911/masayan11315-22/" target="_blank" >JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Douglas Crockford オライリージャパン 2008-12-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873113911/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=JavaScript%3A%20The%20Good%20Parts%20%81%5C%81u%97%C7%82%A2%83p%81%5B%83c%81v%82%C9%82%E6%82%E9%83x%83X%83g%83v%83%89%83N%83e%83B%83X&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873115736/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51c9uCrhHgL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873115736/masayan11315-22/" target="_blank" >JavaScript 第6版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">David Flanagan オライリージャパン 2012-08-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873115736/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=JavaScript%20%91%E66%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト(railsで作成しています)</h3>
<hr/>
<ul>
<li><a href="http://mountain-channel.com/" target="_blank">マウンテンチャンネル</a></li>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3 class="related-article-title">参考記事</h3>
<ul>
<li><a href="https://github.com/babel/babel-loader" target="_blank">babel/babel-loader</a></li>
<li><a href="http://blog.flup.jp/2016/02/12/devenv_nginx_with_docker/#-v" target="_blank">Dockerでつくる開発環境【nginxコンテナ編】</a></li>
<li><a href="http://qiita.com/HayneRyo/items/74892d3a37ee96a5df60" target="_blank">webpack+babel環境でフロントエンドもES6開発</a></li>
<li><a href="http://azu.github.io/promises-book/" target="_blank">JavaScript Promiseの本</a></li>
<li><a href="http://blog.satotaichi.info/modern-javascript_201701/" target="_blank">Modern JavaScript概観、そしてElectronへ</a></li>
<li><a href="https://mae.chab.in/archives/59782" target="_blank">TypeScriptでReactを書く</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-75116925173910863472017-06-16T22:48:00.000+09:002017-06-16T22:48:05.213+09:00[js] webpack webpack2をインストールする<ul>
<li>公開日:2016年06月16日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>ついにrailsでもwebpackが導入されました。この記事はwebpack2のインストール方法を記載した記事です。<br/>
ここではgemを使わずに導入する方法を説明します。最初はgemを利用しない使い方を覚えた方が、長い目で見て良いと思います。<br/>
環境はcentos6.5です。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>centos6.5</li>
</ul>
<h3 class="paragraph-title-chef">webpackとは</h3>
<p>webpackは、アプリケーションでJavaScriptモジュールをビルドするためのツールです。</p>
<h3 class="paragraph-title-chef">nodeのインストール</h3>
<p>まずはnode.jsをインストールします。ここでは最新版を導入します。<br/>
centos6.5はデフォルトだと古いバージョンのnode.jsをインストールしてしまうので、curlで最新のnodeを取得可能にしておく必要があります。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
sudo yum install nodejs
node -v
v8.1.0
</pre>
<h3 class="paragraph-title-chef">npmのインストール</h3>
<p>npmをインストールします。同じく最新版を導入します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
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
</pre>
<p>以上でwebpackを導入する準備は終了です。</p>
<h3 class="paragraph-title-chef">プロジェクトの作成とwebpackのインストール</h3>
<p>プロジェクトを作成します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
mkdir study2
cd study2
// -yはpackage.jsonのデフォルトのみが使用されて、オプション入力プロンプトは表示されない
npm init -y
// webpackとローカルサーバー
npm install --save-dev webpack webpack-dev-server
</pre>
<p>モジュールはグローバルでなく、--save-devをつけてプロジェクト別に管理することが推奨されています。</p>
<h3 class="paragraph-title-chef">package.json</h3>
<p>package.jsonにはビルドコマンドだけ追記します。</p>
<div class="blogger-code-header">study2/package.json</div>
<pre class="blogger-code">
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
</pre>
<p>npm run buildコマンドでビルドが可能になります。</p>
<h3 class="paragraph-title-chef">webpack.config.js</h3>
<p>最後にwebpack設定ファイルのwebpack.config.jsを作成します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
touch webpack.config.js
module.exports = {
// エントリポイント(最初に読まれるjs)
entry: "./entry.js",
// バンドルされたjsファイル(成果物)
output: {
path: __dirname,
filename: "bundle.js"
}
};
touch entry.js
</pre>
<p>以上でwebpack2の導入は完了です。あとはプロジェクトに応じたライブラリを導入して素敵なJavaScriptライフを送ってください。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>webpack2はとても便利なjsの管理ツールです。<br/>
初めての使用でも、2-3時間で最低限の機能くらいは使えるようになるので、ぜひ導入してみてください。</p>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-65978687933725117882017-05-27T22:29:00.000+09:002017-05-27T22:29:31.682+09:00【Android7.1】Architecture componentsの調査。AppCompatActivityでLifecycleを利用する<ul>
<li>公開日:2017年05月27日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>Google I/O 2017でandroid-architecture-componentsが発表されました。<br/>
なかなか良さそうなライブラリだったので、導入して動かしてみました。</p>
<p>この記事は、android-architecture-componentsを触って感じたことを記載した記事です。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>buildToolsVersion 25.0.3</li>
<li>android.arch.lifecycle 1.0.0-alpha1</li>
</ul>
<h3 class="paragraph-title-android">lifecycleとは</h3>
<p>ActivityやFragmentのライフサイクルに合わせてデータを管理できるライブラリです。<br/>
ドキュメントを読んでgoogle code labのサンプルを実装した感じでは、以下のような感想を持ちました。</p>
<h5>良い点</h5>
<ul>
<li>オブジェクトをActivityやFragmentのライフサイクルに関連づけられるのが良い。onDestory()等の処理が楽になりそう。アプリの停止や生存チェックが減りそう。</li>
<li>SNSや通知アプリなどのpub, subを利用するアプリが作りやすくなりそう。RxJavaのFlowableを使うとよりよくなりそう。</li>
<li>縦画面と横画面の作り分けが楽になる。これが一番大きい。</li>
<li>Roomは、ibatisに似ている。経験者はすぐに使いこなせるのではないだろうか。RxJavaと連携もできる。</li>
</ul>
<h5>悪い点</h5>
<ul>
<li>Observerクラス増えすぎ。どのライブラリもObserverとSubscribeで溢れている。可読性がさらにひどくなる。。</li>
<li>開発者に要求されるハードルがまた上がる。</li>
</ul>
<p>触った印象では、難しくはないので、考え方に慣れることが大事なのかなと思いました。</p>
<h3 class="paragraph-title-android">実装</h3>
<p>1.0.0-alpha1のLifecycleActivityはFragmentActivityを継承しているクラスなので、AppCompatActivityクラスを継承したActivityクラスでは利用できません。かといってLifecycleActivityをそのまま利用するのは機能不足すぎで話になりません。しかも、This class is a temporary implementation detail until Lifecycles are integrated with support library.とあるように、LifecycleActivityは一時的な実装なので利用する意味がありません。<br/>
なので、以下のように改造します。</p>
<h5>変更前</h5>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
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...
}
</pre>
</div>
<h5>変更後</h5>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
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...
}
</pre>
</div>
<p>LifecycleRegistryOwnerをimplementsしてLifecycleRegistryのインスタンスをもたせます。これで、AppCompatActivityでも利用可能になります。<br/>
あとはViewModelProvidersを使えば、ViewModelのオブジェクトを管理できます。</p>
<p>Activityに付加したFragmentでViewModelを管理する場合は、以下のように実装します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/HomeFragment.java</div>
<pre class="android-code">
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...
}
</pre>
</div>
<p>これにより、画面の回転などでonCreate()の再呼び出しをしてもViewModelを継承したモデルから値を取得することが可能になります。</p>
<h3 class="paragraph-title-android">結論</h3>
<p>android-architecture-componentsはsupport libraryと同様、デファクトのライブラリになりそうな気がします。</p>
<p>この他にも、通知やDBでも活躍できそうなので、色々と試していきたいですね。</p>
<div class="pick-up-title">PICK UP</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51R7NEaIwDL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-02-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qI%81r%84%9F%84%9F60fps%82%F0%92B%90%AC%82%B7%82%E9%83%82%83_%83%93%82%C8GUI%83V%83X%83e%83%80%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51AryYzL-iL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >RxJavaリアクティブプログラミング (CodeZine BOOKS)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">須田 智之 翔泳社 2017-02-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=RxJava%83%8A%83A%83N%83e%83B%83u%83v%83%8D%83O%83%89%83~%83%93%83O%20%28CodeZine%20BOOKS%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-52756105235846335582017-05-20T12:13:00.003+09:002017-11-29T21:46:21.838+09:00[git] squashでコミットをまとめる<ul>
<li>公開日:2017年05月20日</li>
<li>最終更新日:2017年11月29日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>gitのsquashを使ってコミットをまとめる時のやり方。ターミナルコマンドを使います。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>git version 2.6.4</li>
</ul>
<h3 class="paragraph-title-chef">やりたいタスク</h3>
<p>直近4つのコミットを一つにまとめます。<br/>
対象は色々な修正を加えたsample.txtです。 </p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
// コマンド
git log --oneline
a108a12 sample/feature completed.
ba18359 deleted comment.
a7711e0 updasted comment.
adf6be6 added comment.
2ca3f88 first commit
</pre>
<p>直近a108a12からadf6be6までの4つのコミットをまとめて、直近a108a12のコメントに変更します。<br/>
開発現場でよくあるパターンです。</p>
<h3 class="paragraph-title-chef">順序</h3>
<p>rebaseコマンドで直近の4つのコミットを選択します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
// コマンド
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
</pre>
<p>古いコミット順で表示されるので、注意してください。一番古いコミット以外をsに変更します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
pick adf6be6 added comment.
s a7711e0 updasted comment.
s ba18359 deleted comment.
s a108a12 sample/feature completed.
</pre>
<p>一番古いコミット以外をsに変更します。最初(一番古い)のコミットはsにしてはいけません。sを指定したコミットの内容が、前のコミットに統合(melt)されるイメージです。時系列が逆なので最初は理解しにくいですが、仕様なので慣れてください。<br/>
修正したら:wqで上書き保存します。</p>
<p>コミット内容が表示されます。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
# 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.
</pre>
<p>残したいコミットメッセージ以外を削除します。もちろんメッセージを変更しても問題ありません。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
# 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.
</pre>
<p>変更したら:wqで上書き保存します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
Successfully rebased and updated refs/heads/master.
</pre>
<p>成功です。ログを確認します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
// コマンド
git log --oneline
4a709e3 sample/feature completed.
2ca3f88 first commit
</pre>
<p>綺麗にログがまとまりました。</p>
<p>ログの内容をすでにpull requestしている場合は、force pushすれば強制的に上書きできます。(他の人がファイルをいじってないことを確認しましょう)</p>
<h3 class="paragraph-title-chef">取り消し</h3>
<p>rebaseで間違ってしまった場合は、以下のように修正します。</p>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
git rebase --abort
</pre>
<p>例えば、merge conflictで修正箇所をまとめる時に、最初のmergeまで入れてrebaseしてしまったとか。。。ですかね。<br/>
これで元どおりになります。</p>
<h3 class="paragraph-title-chef">サーバーのbranchを消す</h3>
<div class="blogger-code-header">terminal</div>
<pre class="blogger-code">
// ローカルbranchを削除
git branch -D branchName
// サーバーに反映
git push origin :branchName
</pre>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>gitはとても便利なのですが、ググっても間違った情報が引っかかるケースが多いと思います。<br/>
周りの人に聞いたり、公式サイトを利用して正しく効率的なやり方を身につけてください。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/427406767X/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/41k7xonwpdL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/427406767X/masayan11315-22/" target="_blank" >入門git</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Travis Swicegood オーム社 2009-08-12 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/427406767X/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01IGW5JD6/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-75433689319523943062017-05-06T13:01:00.000+09:002017-05-06T13:01:19.884+09:00【Unity5.6.0f3】error CS0234: The type or namespace name `CrossPlatformInput' does not exist in the namespace.<ul>
<li>公開日:2017年05月06日</li>
</ul>
<h3 class="paragraph-title-unity">記事概要</h3>
<p>Unityの学習中に発生したエラーの解決メモ。</p>
<h3 class="paragraph-title-unity">環境</h3>
<ul>
<li>macOS Sierra</li>
<li>Unity5.6.0f3</li>
</ul>
<h3 class="paragraph-title-unity">発生</h3>
<p>Unityのチュートリアルでキャラクターを配置したらerror CS0234: The type or namespace name `CrossPlatformInput' does not exist in the namespaceが発生しました。</p>
<h3 class="paragraph-title-unity">原因</h3>
<p>エラーの通りCrossPlatformInputがインポートされていないためです。</p>
<h3 class="paragraph-title-unity">修正方法</h3>
<p>AssetsにCrossPlatformInputを追加します。</p>
<div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuCe7zDJ1v2BskOEphUSh169A2p8h0u5bx8u0M5oJcZpupq_qhkOoUCjbMD1Bhynzw9Kg8auTUq2hMvNDj2VS3iMCQWV4a_bwGgEuwfbeCgP8iDzWXVhZ9bc3x3VVqADMrNBR4r8BEw_zj/s1600/CrossPlatformInput.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuCe7zDJ1v2BskOEphUSh169A2p8h0u5bx8u0M5oJcZpupq_qhkOoUCjbMD1Bhynzw9Kg8auTUq2hMvNDj2VS3iMCQWV4a_bwGgEuwfbeCgP8iDzWXVhZ9bc3x3VVqADMrNBR4r8BEw_zj/s320/CrossPlatformInput.png" width="312" height="320" /></a></div>
<div class="img-caption">fig1:CrossPlatformInputを追加</div>
</div>
<p>AssetsにCrossPlatformInputが追加されていることを確認します。</p>
<div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidg0YSYckRypnmVbmtxLQq0t_FO6jFVNJgX6N2Wkzegjiysgtz49dmqaYzEt78R3-APDRC-5e015IQsyZXHziIG1MSiMjxtiZmaGID0xUTylfREyq0k5kUTrjg94L__DjUanJeV19_UYQ8/s1600/Assets.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidg0YSYckRypnmVbmtxLQq0t_FO6jFVNJgX6N2Wkzegjiysgtz49dmqaYzEt78R3-APDRC-5e015IQsyZXHziIG1MSiMjxtiZmaGID0xUTylfREyq0k5kUTrjg94L__DjUanJeV19_UYQ8/s320/Assets.png" width="320" height="289" /></a></div></div>
<p>コンパイルが可能になり、動作が確認できるようになります。</p>
<div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhldxgIRUISz2tknZiKxILG4pbLZ3MxoBRXzyuJgk4O9NeptBEIxCUqdCycyX1R7_wyO3h3FhFEzqVGxzYg_Zclz7mWDx1htB4OemSdY-ZqJuuy76T8PbqWJt9899D7qpao6UbRQJ4cGvGs/s1600/app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhldxgIRUISz2tknZiKxILG4pbLZ3MxoBRXzyuJgk4O9NeptBEIxCUqdCycyX1R7_wyO3h3FhFEzqVGxzYg_Zclz7mWDx1htB4OemSdY-ZqJuuy76T8PbqWJt9899D7qpao6UbRQJ4cGvGs/s320/app.png" width="320" height="152" /></a></div>
<div class="img-caption">fig3:play</div>
</div>
<p>動作が確認できました。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117577/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51Lfqa9LDpL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117577/masayan11315-22/" target="_blank" >UnityによるVRアプリケーション開発 ―作りながら学ぶバーチャルリアリティ入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Jonathan Linowes オライリージャパン 2016-08-26 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117577/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Unity%82%C9%82%E6%82%E9VR%83A%83v%83%8A%83P%81%5B%83V%83%87%83%93%8AJ%94%AD%20%81%5C%8D%EC%82%E8%82%C8%82%AA%82%E7%8Aw%82%D4%83o%81%5B%83%60%83%83%83%8B%83%8A%83A%83%8A%83e%83B%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト(railsで作成しています)</h3>
<hr/>
<ul>
<li><a href="http://mountain-channel.com/" target="_blank">マウンテンチャンネル</a></li>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-60075085789424157092017-05-05T10:50:00.003+09:002017-05-05T10:50:59.984+09:00【Rails5.1.0】 Rails5.0.1からRails5.1.0にアップグレードする。<ul>
<li>公開日:2017年05月05日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>ようやくRails5.1.0がリリースされたのでアップグレードしました。まとめ記事です。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>centos6.5</li>
<li>Rails5.0.1 → Rails5.1.0</li>
<li>ruby2.3.0</li>
<li>rbenv</li>
<li>unicorn</li>
<li>whenever</li>
</ul>
<h3 class="paragraph-title-chef">はじめに</h3>
<p>Rails5.1.0は、Rails5.0.x系と比較すると変更点が多いです。<a href="http://edywrite.blogspot.jp/2017/03/rails510beta1-rails501rails510beta1.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/uocDA+(%E3%83%80%E3%83%A1%E7%94%B7%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0)" target="blank">以前の記事</a>で5.0.x系との差異を記載しているのでそちらを参考にしてください。</p>
<h3 class="paragraph-title-chef">移行用の作業branchの作成</h3>
<p><a href="http://edywrite.blogspot.jp/2017/03/rails510beta1-rails501rails510beta1.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/uocDA+(%E3%83%80%E3%83%A1%E7%94%B7%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0)" target="blank">以前の記事</a>で記載しているように、2ヶ月ほど前にRails5.1.0 beta1で、移行テスト済みなので一気に作業をやっていきます。<br/>
Railsのバージョンアップをする場合は、betaの段階で1度テストをしておくことをお勧めします。</p>
<p>gitでrails5.1.0移行用の作業ブランチを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
cd {project_folder}
git branch feature/rails5.1.0
</pre>
<p>checkoutでブランチを切り替えます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
git checkout feature/rails5.1.0
</pre>
<p>準備完了です。</p>
<h3 class="paragraph-title-chef">Gemfile修正</h3>
<p>まずGemfileを修正します。</p>
<div class="rails-code-header">{project_folder}/Gemfile</div>
<pre class="rails-code">
# 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'
</pre>
<p>gem 'rails', '5.1.0'に修正し、updateします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
// update
bundle update
</pre>
<p>bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。</p>
<p>Bundle updated!が表示されれば成功です。5.0.1に対応してあれば、bundle updateはひっかからないはずです。</p>
<h3 class="paragraph-title-chef">Upgrade 設定ファイル</h3>
<p>Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
bundle exec rails app:update
</pre>
<p>ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。<br/>
私の環境では以下のようにしました。</p>
<ul>
<li>config/routes.rb → 更新しない</li>
<li>config/application.rb → 更新しない</li>
<li>config/secrets.yml → <font color="red">更新する</font></li>
<li>config/cable.yml → <font color="red">更新する</font></li>
<li>config/puma.rb → <font color="red">更新する</font></li>
<li>config/environments/development.rb → <font color="red">更新する</font></li>
<li>config/environments/production.rb → <font color="red">更新する</font></li>
<li>config/environments/test.rb → <font color="red">更新する</font></li>
<li>config/initializers/assets.rb → <font color="red">更新する</font></li>
<li>config/initializers/new_framework_defaults.rb → 更新しない</li>
<li>bin/setup → 更新しない</li>
<li>bin/update → 更新しない</li>
</ul>
<p>更新後は、git diffでファイルを比較して必要な設定だけ元に戻します。</p>
<h3 class="paragraph-title-chef">config/environments/production.rb</h3>
<p>Rails5.1.0では、config.read_encrypted_secrets = trueが追加されました。<br/>
暗号の管理方法が変わりました。</p>
<p><strong><font color="red">既存のsecrets.ymlでも動くので、Encrypted secretsの導入は少し待ってからの方が良いかもしれません。これだと管理が煩雑になって、まだデメリットの方が多い気がします。</font></strong></p>
<h3 class="paragraph-title-chef">Rails5.1.0 Encrypted secretsの対応</h3>
<p>暗号の管理方法が変更されたので対応します。terminalを開きます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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
</pre>
<p>これだけです。パスワードの入ったsecrets.yml.keyファイルは、.gitignoreに自動で追加されます。
config/secrets.yml.encはgitで管理可能です。pushしてもOKです。</p>
<p>また、config/environments/production.rbにconfig.read_encrypted_secrets = trueが追加されていることも確認してください。<br/>
あとは、本番でconfig/secrets.yml.keyのuploadを忘れないようにしましょう。開発環境で有効にする必要はないとは思いますが、本番と同じにしたい人はconfig.read_encrypted_secrets = trueを追加しても良いと思います。</p>
<p>secrets.yml.keyは紛失しないように忘れずに別管理にします。(この辺がセキュリティのためとはいえ納得いかないとこですね。面倒くさい。)</p>
<h3 class="paragraph-title-chef">Rails5.1.0 rails-ujs対応</h3>
<p>rails-ujsを導入すれば、jquery_ujsが不要になります。jqueryの処理に依存している人は、jqueryの処理も書き換える必要があります。時間をとって乗り換えましょう。</p>
<div class="rails-code-header">config/environments/development.rb</div>
<pre class="rails-code">
# Use jquery as the JavaScript library
#gem 'jquery-rails'
gem 'rails-ujs'
</pre>
<p>インストールします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
// update
bundle update
Installing rails-ujs 0.1.0
</pre>
<p>インストールしたら、application.jsを修正します。</p>
<div class="rails-code-header">assets/javascript/application.js</div>
<pre class="rails-code">
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .
↓
//= require rails-ujs
//= require turbolinks
//= require_tree .
</pre>
<p>せっかく書き換えるなら、今だとTypeScriptに変更するのがいいのではないでしょうか。</p>
<h3 class="paragraph-title-chef">Rails5.1.0起動</h3>
<p>アプリを起動します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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
</pre>
<p>コンソールにRails 5.1.0 applicationが表示され、画面が表示されれば成功です。</p>
<p>だいたいここまでで1時間くらいです。あとは、テストコードを実行してデグレを確認します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
bundle exec rspec
Finished in 1 minute 58.72 seconds (files took 7.84 seconds to load)
230 examples, 0 failures, 14 pending
</pre>
<p>問題ありませんでした。DEPRECATION WARNINGで修正可能なエラーは今のうちに修正します。Rails5.2.0の対応も済ませてしまいましょう。</p>
<h3 class="paragraph-title-chef">capistrano</h3>
<p>capistranoも修正します。config/secrets.yml.keyにもSymbolic linkが作成されるようにします。</p>
<div class="rails-code-header">config/deploy.rb</div>
<pre class="rails-code">
set :linked_files, %w{config/database.yml}
↓
# Default value for :linked_files is []
set :linked_files, %w{config/database.yml config/secrets.yml.key}
</pre>
<p>ググるとupload処理をconfig/deploy.rbに記述しているケースをちょくちょく見かけます。この場合、ファイルがないとdeploy:checkが通らなくなるので、やらない方が良いと思います。ファイルは直接アップロードしておくのがcapistranoの仕様になってます。フォルダは自動生成してくれますが、ファイルはしてくれません。</p>
<h3 class="paragraph-title-chef">リリース</h3>
<p>capistrano3を使っていつも通りリリースすればOKです。少し時間がかかります。一通りの動作確認はしておきましょう。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p></p>
<p>Rails5.0.1からRails5.1.0のアップデートは、それなりに手間がかかると思います。特にフロントエンドが複雑なWEBアプリだと苦戦するかもしれません。<br/>私は既にRails5.1.0にアップロードしましたが、Fix版が出て安定してからでも良いかなと思いました。</p>
<p>あとはそろそろ、Ruby2.4.0への更新とリファクタリングも済ませてしまうと良いでしょう。</p>
<p>あとはdockerがいい感じに枯れてきたので、そろそろ本番で使っても良いかもしれないですね。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51GLBK7MuVL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Ruby on Rails 5 超入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">掌田津耶乃 秀和システム 2016-12-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Ruby%20on%20Rails%205%20%92%B4%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" ><img src="http://ecx.images-amazon.com/images/I/5102wwx0VzL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >メタプログラミングRuby 第2版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Paolo Perrotta オライリージャパン 2015-10-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83%81%83%5E%83v%83%8D%83O%83%89%83~%83%93%83ORuby%20%91%E62%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト(railsで作成しています)</h3>
<hr/>
<ul>
<li><a href="http://mountain-channel.com/" target="_blank">マウンテンチャンネル</a></li>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3 class="related-article-title">関連記事</h3>
<ul>
<li><a href="http://edywrite.blogspot.jp/2016/07/rails500-rails425rails500.html" target="_blank">【Rails5.0.0】 Rails4.2.5からRails5.0.0へのアップグレードでバッチが動かなくなった</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-37524640429285815252017-04-15T13:27:00.000+09:002017-04-15T13:27:37.000+09:00【Android7.1】EventBusまとめ<ul>
<li>公開日:2017年04月15日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>EventBusの調査メモ。取り急ぎのまとめです。<br/>
<a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a>用にソースコード書いてgitにあげたり、動画撮ったり、英語にしてまとめるかは微妙です。純正ライブラリでないですし。アクセス数見て考えます。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>buildToolsVersion 25.0.2</li>
<li>EventBus 3.0.0</li>
<li>Android Studio 2.3.1</li>
</ul>
<h3 class="paragraph-title-android">対象</h3>
<p>pub, subの概念を理解している人。</p>
<h3 class="paragraph-title-android">git</h3>
<p><a href="https://github.com/greenrobot/EventBus" target="_blank">ここ</a>のサイトから取得できます。</p>
<h3 class="paragraph-title-android">特徴(長所)</h3>
<ul>
<li>コンポーネント間の通信を簡素化</li>
<li>イベントの送信者と受信者を切り離す</li>
<li>アクティビティ、フラグメント、およびバックグラウンドスレッドで使える</li>
<li>複雑でエラーを起こしやすい依存関係やライフサイクルの問題を避ける</li>
<li>コードをシンプルにする</li>
<li>速い</li>
<li>小さい(約50k)</li>
</ul>
<h3 class="paragraph-title-android">特徴(欠点)</h3>
<ul>
<li>コードが直感的でない</li>
<li>Eventが増えるとコードのつながりがわかりにくくなる</li>
</ul>
<h3 class="paragraph-title-android">Install</h3>
<p>build.gradleファイルに以下の内容を記述します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/build.gradle</div>
<pre class="android-code">
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
}
</pre>
</div>
<h3 class="paragraph-title-android">Android Studio Plugin</h3>
<p>EventBusの欠点は、コードが直感的で無くなることです。<br/>
なので、Android Studio Pluginを導入して、コードリーディングの軽減を図るのは良い考えです。</p>
<p><a href="https://github.com/likfe/eventbus3-intellij-plugin" target="_blank">ここ</a>のサイトから取得できます。<br/>
もしくはAndroid StudioのPluginでEventBus3で検索しましょう。</p>
<h3 class="paragraph-title-android">Hello EventBus</h3>
<p>実際に実装してみましょう。<br/>fragmentのButtonからActivityに通知してみます。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
@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();
}
</pre>
</div>
<p>コードはSubscribeメソッドから記述します。メソッドには@Subscribeアノテーションを付加します。この時、@Subscribeメソッドの名前はなんでもOKです。</p>
<p>EventBus.getDefault().register(this);でSubscribeを登録します。registerを呼び出したクラスに@Subscribeアノテーションを追加したメソッドがないとエラーが発生します。</p>
<div class="code_block">
<div class="android-code-header">Error</div>
<pre class="android-code">
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
</pre>
</div>
<p>また、複数回registerを呼び出すとクラッシュします。</p>
<div class="code_block">
<div class="android-code-header">Error</div>
<pre class="android-code">
Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.xxxx.MainActivity already registered to event class
</pre>
</div>
<p>以下の実装箇所で引っかかります。</p>
<div class="code_block">
<div class="android-code-header">Error</div>
<pre class="android-code">
if (subscriptions.contains(newSubscription)) {
throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event " + eventType);
}
</pre>
</div>
<p>DialogやカスタムViewを使った場合も実装方法は同じです。</p>
<h3 class="paragraph-title-android">Configuration</h3>
<p>不要だと思います。デフォルト設定で良いでしょう。</p>
<h3 class="paragraph-title-android">Sticky Events</h3>
<p>複雑になるだけです。いりません。</p>
<h3 class="paragraph-title-android">Subscriber Index</h3>
<p>EventBus version3から導入された新機能です。初期Subscribeの登録を高速化して最適化します。最高のパフォーマンスを得るために、使用が推奨されています。<br/>
まあ、使えってことです。</p>
<p>build.gradleファイルに以下の内容を記述します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/build.gradle</div>
<pre class="android-code">
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'
}
</pre>
</div>
<p>初期化してSubscribeを登録してindex化するので、Applicationクラスを使います。無い場合は作成します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/MyApplication.java</div>
<pre class="android-code">
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
EventBus.TAG = "MyApplication-EVENT";
EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
}
}
</pre>
</div>
<p>新規作成の場合は、AndroidManifest.xmlも忘れないで設定します。</p>
<div class="code_block">
<div class="android-code-header">{project_folder}/AndroidManifest.xml</div>
<pre class="android-code">
application
android:name="com.example.xxx.MyApplication"
</pre>
</div>
<p>以上です。pub, subの処理は変わりません。なぜなら、EventBus.getDefault()メソッドでは、EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();で作成したEventBusのインスタンスを使い回すからです。<br/>細かい動きが気になる人はコードを読んで見ると良いでしょう。</p>
<h3 class="paragraph-title-android">結論</h3>
<p>EventBusは便利なライブラリです。とはいえ、コードが読みにくくなるので、階層の離れたviewからAcitivtyに伝えるなどのケース以外ではあんまり使いたくないですね。<br/>
やっぱりcallbackをなるべく使うべきな気がします。でも、RxJavaのPub, Subよりは使いやすいです。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51R7NEaIwDL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-02-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qI%81r%84%9F%84%9F60fps%82%F0%92B%90%AC%82%B7%82%E9%83%82%83_%83%93%82%C8GUI%83V%83X%83e%83%80%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51rrKjgnZRL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" >Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-03-24 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774188611/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qII%81r%84%9F%84%9F%90%5E%82%CC%83%7D%83%8B%83%60%83%5E%83X%83N%82%C9%92%A7%82%F1%82%BE%83%82%83o%83C%83%8BOS%82%CC%90S%91%9F%95%94%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3>参照</h3>
<ul>
<li><a href="http://greenrobot.org/eventbus/documentation/subscriber-index/" target="_blank">http://greenrobot.org/eventbus/documentation/subscriber-index/</a></li>
<li><a href="http://qiita.com/issei_aoki/items/741157291e0413533cf6" target="_blank">http://qiita.com/issei_aoki/items/741157291e0413533cf6</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-1604682285244913982017-03-20T23:42:00.000+09:002017-05-05T10:52:07.819+09:00【Rails5.1.0beta1】 Rails5.0.1からRails5.1.0beta1にアップグレードする。 Rails5.1.0更新の準備と調査<ul>
<li>公開日:2017年03月20日</li>
<li>最終更新日:2017年05月05日</li>
</ul>
<h3 class="paragraph-title-chef">記事概要</h3>
<p>rails5.0.1からRails5.1.0beta1にアップグレードした時の方法をまとめた記事です。</p>
<h3 class="paragraph-title-chef">環境</h3>
<ul>
<li>centos6.5</li>
<li>Rails5.0.1 → Rails5.1.0beta1</li>
<li>ruby2.3.0 → ruby2.4.0</li>
<li>rbenv</li>
<li>unicorn</li>
<li>whenever</li>
</ul>
<h3 class="paragraph-title-chef">はじめに</h3>
<p>Rails5.1.0beta1がリリースされたので、Rails5.1.0の準備を開始しました。<br/>
今回は変更点が多いので、Rails5.1.0beta1の状態ではリリースせず、Rails5.1.0になってからリリースをしたいと思います。<br/>
また、この機会に色々とRailsアプリのリファクタリングをしていこうと思っています。<br/>ずっとAndroid開発で放置状態だったので。出し惜しみしないで、ブログに情報も載せていこうと思います。</p>
<h3 class="paragraph-title-chef">Rails5.1.0の変更点</h3>
<p>Rails5.1.0は、Rails5.0.1と比較すると大きく変わりました。変更点の概要を以下に記述します。</p>
<ul>
<li>YarnでjavaScriptを管理</li>
<li>webpackでビルドが可能</li>
<li>jQueryが不要になった(rails-ujsに書き直された)</li>
<li>機能テスト用のライブラリCapybaraが正式にサポート</li>
<li>暗号の管理方法変更</li>
<li>routesの改良</li>
<li>form_withでform_tag / form_forを統一</li>
<li>4.x以前はサポートしない</li>
</ul>
<p>凄まじい量の変化です。なので、今から少しづつ対応していきましょう。</p>
<h3 class="paragraph-title-chef">作業内容</h3>
<p>今回のRails5.1.0のアップグレードでは、以下のタスクを行っていく予定です。</p>
<ul>
<li>jQueryをrails-ujsに置き換える</li>
<li>Capybaraの導入</li>
<li>CIの設定</li>
<li>暗号の管理方法変更</li>
<li>routesの改善</li>
<li>form_withでform_tag / form_forを統一</li>
<li>Ruby2.4のコードにリファクタリング</li>
</ul>
<p>最低限でこれくらいありますね。Ruby2.4のFixnumの改善も対応したっぽいので、コードも本格的に修正します。頭痛くなってきた。。。</p>
<h3 class="paragraph-title-chef">移行用の作業branchの作成</h3>
<p>gitでrails5.1.0beta1移行用の作業ブランチを作成します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
cd {project_folder}
git branch feature/rails5.1.0beta1
</pre>
<p>checkoutでブランチを切り替えます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
git checkout feature/rails5.1.0beta1
</pre>
<p>準備完了です。</p>
<h3 class="paragraph-title-chef">Gemfile修正</h3>
<p>まずGemfileを修正します。</p>
<div class="rails-code-header">{project_folder}/Gemfile</div>
<pre class="rails-code">
# 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'
</pre>
<p>gem 'rails', '5.1.0.beta1'に修正し、updateします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
// update
bundle update
</pre>
<p>bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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!
</pre>
<p>一発でうまくいきました。5.0.1に対応してあれば、bundle updateはひっかからないようです。</p>
<p>すべてのgemの更新に成功したら、updateの準備は完了です。</p>
<h3 class="paragraph-title-chef">Upgrade to Rails5.1.0beta1</h3>
<p>Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
bundle exec rails app:update
</pre>
<p>ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。<br/>
私の環境では以下のようにしました。</p>
<ul>
<li>config/routes.rb → 更新しない</li>
<li>config/application.rb → 更新しない</li>
<li>config/secrets.yml → <font color="red">更新する</font></li>
<li>config/cable.yml → <font color="red">更新する</font></li>
<li>config/puma.yml → <font color="red">更新する</font></li>
<li>config/environments/development.rb → <font color="red">更新する</font></li>
<li>config/environments/production.rb → <font color="red">更新する</font></li>
<li>config/environments/test.rb → <font color="red">更新する</font></li>
<li>config/initializers/assets.rb → <font color="red">更新する</font></li>
<li>config/initializers/new_framework_defaults.rb → 更新しない</li>
<li>bin/setup → 更新しない</li>
<li>bin/update → 更新しない</li>
</ul>
<p>diffで確認したところ、変更点で気をつける点は以下です。</p>
<h3 class="paragraph-title-chef">config/environments/development.rb</h3>
<p>ActiveSupport::EventedFileUpdateCheckerがデフォルトで有効になっています。<br/>
vagrantやdocker等の仮想環境で開発をしている場合は無効にしておいた方が良いです。更新が反映されなくなることがあります。</p>
<div class="rails-code-header">config/environments/development.rb</div>
<pre class="rails-code">
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
</pre>
<p>config.assets.digest = trueが削除さています。<br/>
これも不要みたいです。毎回コンパイルされるのかな。。。</p>
<h3 class="paragraph-title-chef">config/environments/production.rb</h3>
<p>config.read_encrypted_secrets = trueが追加されました。<br/>
暗号は管理方法が変わりました。</p>
<h3 class="paragraph-title-chef">Rails5.1.0beta1 Encrypted secretsの対応</h3>
<p><strong><font color="red">下記のやり方だと、Rails5.1.0では動作しませんでした。既存のsecrets.ymlでも動くので、Encrypted secretsの導入は少し待ってからの方が良いかもしれません。これだと管理が煩雑になって、デメリットの方が多い気がします。</font></strong></p>
<p>暗号の管理方法が変更されたので対応します。terminalを開きます。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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
</pre>
<p>これだけです。パスワードの入ったsecrets.yml.keyファイルを.gitignoreに自動で追加してくれます。
config/secrets.yml.encはgitで管理可能です。pushしてもOKです。</p>
<p>また、config/environments/production.rbにconfig.read_encrypted_secrets = trueが追加されていることも確認してください。<br/>
あとは、本番でconfig/secrets.yml.keyのuploadを忘れないようにしましょう。開発環境で有効にする必要はないとは思いますが、本番と同じにしたい人はconfig.read_encrypted_secrets = trueを追加しても良いと思います。</p>
<h3 class="paragraph-title-chef">Rails5.1.0beta1 rails-ujs対応</h3>
<p>rails-ujsを導入すれば、jQueryが不要になります。jQueryなしで動くように書き直されたようです。素晴らしい!!</p>
<p><strong><font color="red">デバッグ中にバグが出ました。jqueryに依存しているところは書き直しが必要です。</font></strong></p>
<div class="rails-code-header">config/environments/development.rb</div>
<pre class="rails-code">
# Use jquery as the JavaScript library
#gem 'jquery-rails'
gem 'rails-ujs'
</pre>
<p>インストールします。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
// update
bundle update
Installing rails-ujs 0.1.0
</pre>
<p>インストールしたら、application.jsを修正します。</p>
<div class="rails-code-header">assets/javascript/application.js</div>
<pre class="rails-code">
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .
↓
//= require rails-ujs
//= require turbolinks
//= require_tree .
</pre>
<h3 class="paragraph-title-chef">Rails5.1.0beta1起動</h3>
<p>アプリを起動します。</p>
<div class="rails-code-header">terminal</div>
<pre class="rails-code">
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
</pre>
<p>コンソールにRails 5.1.0.beta1 applicationが表示され、画面が表示されれば成功です。</p>
<p>私の環境では問題なく動いているようです。jqueryがなくなって、rails-ujsになったので、動きが軽くなった気がします。計測はしていませんけどね。<br/>
だいたいここまでで3時間くらいです。とはいえ、ここからが本番ですが。</p>
<h3 class="paragraph-title-chef">まとめ</h3>
<p>Rails5.0.1からRails5.1.0beta1のアップデートは、多くの変更が必要になります。<br/>
4.x以下は切り捨てられるので、早めに更新の準備をしましょう。また、Fixnumの改善も対応済み(らしい)ので、この機会にRuby2.4.0へのリファクタリングも済ませてしまうと良いでしょう。</p>
<p>タスクが完了するまで継続的にブログも更新します。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51GLBK7MuVL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Ruby on Rails 5 超入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">掌田津耶乃 秀和システム 2016-12-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798048321/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Ruby%20on%20Rails%205%20%92%B4%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" ><img src="http://ecx.images-amazon.com/images/I/5102wwx0VzL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >メタプログラミングRuby 第2版</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">Paolo Perrotta オライリージャパン 2015-10-10 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4873117437/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83%81%83%5E%83v%83%8D%83O%83%89%83~%83%93%83ORuby%20%91%E62%94%C5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト(railsで作成しています)</h3>
<hr/>
<ul>
<li><a href="http://mountain-channel.com/" target="_blank">マウンテンチャンネル</a></li>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>
<h3 class="related-article-title">関連記事</h3>
<ul>
<li><a href="http://edywrite.blogspot.jp/2017/05/rails510-rails501rails510.html" target="_blank">Rails5.1.0】 Rails5.0.1からRails5.1.0にアップグレードする。</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-48083279521963754482017-03-11T20:44:00.000+09:002017-03-11T20:44:19.732+09:002017年3月に読んだ本 2/20 - 3/11日まで<ul>
<li>公開日:2017年03月11日</li>
</ul>
<div class="article-content">
<h3 class="paragraph-title-drone">目的</h3>
<p>ネットの情報がテレビ化してつまらなくなってきたので、2017年からは再び読書量を増やそうと思います。<br/>
読書記録のまとめです。</p>
<p><a href="http://edywrite.blogspot.jp/2017/02/20172-22-221.html" target="blank">前回</a>の記録はこちらです。</p>
<p>今年(2017年)の読書数 : 現在 20冊(2017/01/01 - 2017/03/11)</p>
<h3 class="paragraph-title-drone">RxJavaリアクティブプログラミング</h3>
<ul>
<li>開始:2017年02月20日 - 終了 : 2017年02月24日</li>
<li>評価 : A</li>
</ul>
<p>丁寧に説明されていますが、リアクティブプログラミングの経験がないと、理解できない可能性が高いと思います。逆に、リアクティブプログラミングの経験がある人には良書です。Rxjavaを使う開発時には、側に置いておきたい本です。</p>
<p>詳細な<a href="" target="blank">書評</a>も書いています。参考にしてください。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51AryYzL-iL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >RxJavaリアクティブプログラミング (CodeZine BOOKS)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">須田 智之 翔泳社 2017-02-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=RxJava%83%8A%83A%83N%83e%83B%83u%83v%83%8D%83O%83%89%83~%83%93%83O%20%28CodeZine%20BOOKS%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">科学雑誌Newton2017/04月号</h3>
<ul>
<li>開始:2017年02月26日 - 終了 : 2017年02月28日</li>
<li>評価 : A</li>
</ul>
<p>宇宙の特集が面白かったです。シリーズ 炭素の科学の2回目も面白かったです。<br/>全体的に先月より良かったです。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01NAL9EET/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51RLBsdM3pL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01NAL9EET/masayan11315-22/" target="_blank" >Newton(ニュートン) 2017年 04 月号 [雑誌]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;"> ニュートン・プレス 2017-02-25 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01NAL9EET/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Newton%28%83j%83%85%81%5B%83g%83%93%29%202017%94N%2004%20%8C%8E%8D%86%20%5B%8EG%8E%8F%5D&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">ナショナルジオグラフィック2017/03月号</h3>
<ul>
<li>開始:2017年03月01日 - 終了 : 2017年03月08日</li>
<li>評価 : B</li>
</ul>
<p>今月号はイマイチでした。洞窟の特集はよかったです。来月号に期待です。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51i6etGqCTL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" >NATIONAL GEOGRAPHIC (ナショナル ジオグラフィック) 日本版 2017年 3月号 [雑誌]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">ナショナル ジオグラフィック 日経ナショナルジオグラフィック社 2017-02-28 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B06XCFYT9P/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">難しいことはわかりませんが、お金の増やし方を教えてください!</h3>
<ul>
<li>開始:2017年03月11日 - 終了 : 2017年03月11日</li>
<li>評価 : A</li>
</ul>
<p>良い本です。最近はお金の本はあまり読まなくなったのですが、この本は読んでおくべきです。そして、投資未経験の人は少しづつ投資を始めていきましょう。とはいえ、サラリーマンの源泉徴収の仕組みを変えないと日本で投資が活発になるとは思えませんけどね。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4905073243/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51BVSO9ZnWL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4905073243/masayan11315-22/" target="_blank" >難しいことはわかりませんが、お金の増やし方を教えてください!</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">山崎元,大橋弘祐 文響社 2015-11-11 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4905073243/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B018QRMGLY/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">確定拠出年金の教科書</h3>
<ul>
<li>開始:2017年02月28日 - 終了 : 2017年03月12日</li>
<li>評価 : A</li>
</ul>
<p>確定拠出年金の法律が変わったので、基本を抑えるために購入しました。しかし、これだけの仕組みを作ったということは、老後の生活は自分で責任を持ってくれと、政府から国民に暗に伝えているのと同じですね。でも、日本で投資をきちんとお金を運用できるのは人口の1割だと思います。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4534053789/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51tJ5y-PQsL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4534053789/masayan11315-22/" target="_blank" >確定拠出年金の教科書</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">山崎 元 日本実業出版社 2016-06-09 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4534053789/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01IHFLN9Q/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">まとめ</h3>
<p>投資本は最近読んでいなかったのですが、山崎 元さんの本が面白かったので、2冊続けて購入しました。両方ともよかったです。しかし、日本では全然投資が浸透しませんね。僕の周りでも未だにほとんど投資はやってません。お金なんて道具だと思うんですどね。。。</p>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-16775565835831425092017-03-04T23:47:00.000+09:002017-03-04T23:47:09.037+09:00【Android7.1】android.support:designのsetDrawerListenerがdeprecatedになった対応方法<ul>
<li>公開日:2017年03月05日</li>
</ul>
<h3 class="paragraph-title-android">記事概要</h3>
<p>Androidのアプリ開発で、setDrawerListenerがdeprecatedになりました。<br/>
この記事は、その修正方法を記載した記事です。</p>
<h3 class="paragraph-title-android">環境</h3>
<ul>
<li>buildToolsVersion 25.0.2</li>
<li>com.android.support:design 25.1.1</li>
</ul>
<h3 class="paragraph-title-android">事象</h3>
<p>Androidアプリのコードで記載したsetDrawerListenerがdeprecatedになりました。つーかこのメソッド、Android Studioで自動生成されるんですけど……</p>
<h3 class="paragraph-title-android">修正方法</h3>
<p>setDrawerListenerメソッドをaddDrawerListenerメソッドに差し替えます。</p>
<h5>変更前</h5>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
drawer.setDrawerListener(toggle);
</pre>
</div>
<h5>変更後</h5>
<div class="code_block">
<div class="android-code-header">{project_folder}/MainActivity.java</div>
<pre class="android-code">
drawer.addDrawerListener(toggle);
</pre>
</div>
<p>上記の変更でdeprecatedが消えます。<br/>ソースコードを比較して読んでみると、確かにsetDrawerListenerのメソッドは古臭いので、変更しておきましょう。</p>
<h3 class="paragraph-title-android">結論</h3>
<p>簡単な修正なので、<a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a>でなく、ブログで公開しました。<a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a>のサイトも引き続きよろしくお願いしましす。高度な記事もそろそろ追加していきます。</p>
<p>にしても、時々おかしなコード混ざってますよね。オープンソースだから、仕方ないんですけど。でも、railsよりマシかな。。。rails5.1のアップデート大変そうですね。そろそろ取り組んでいかないとダメですね。</p>
<p>PS : Androidを支える技術〈I〉を読んでいます。終わったら感想書くかも。。。</p>
<p>以上です。</p>
<div class="pick-up-title">PICK UP</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51R7NEaIwDL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">有野 和真 技術評論社 2017-02-22 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4774187593/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Android%82%F0%8Ex%82%A6%82%E9%8BZ%8Fp%81qI%81r%84%9F%84%9F60fps%82%F0%92B%90%AC%82%B7%82%E9%83%82%83_%83%93%82%C8GUI%83V%83X%83e%83%80%20%28WEB%2BDB%20PRESS%20plus%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51AryYzL-iL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >RxJavaリアクティブプログラミング (CodeZine BOOKS)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">須田 智之 翔泳社 2017-02-17 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4798149519/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=RxJava%83%8A%83A%83N%83e%83B%83u%83v%83%8D%83O%83%89%83~%83%93%83O%20%28CodeZine%20BOOKS%29&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3>運営サイト</h3>
<hr/>
<ul>
<li><a href="http://java-lang-programming.com/" target="_blank">プログラミングJava</a></li>
</ul>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-63683903839885244382017-02-26T10:43:00.000+09:002017-02-26T10:43:09.561+09:00【コラム】プログラミングと英語は選択制にした方が良いのではないか。 <ul>
<li>公開日:2017年02月26日</li>
</ul>
<hr/>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Hf5AgW1LOBKEVu2pcdSFZmtQjFFJstKAP8aMTqvTxKQEwmAlw1DrHZcASIE_8d11tVd9MLxNF9c2w_jcCCKCIPiOZEWCC2wi0Sh0IPOdrHfr0_gEnbcG0YQLdR-l3gUbWSKfAFbFY_12/s1600/lgf01a201409020900+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Hf5AgW1LOBKEVu2pcdSFZmtQjFFJstKAP8aMTqvTxKQEwmAlw1DrHZcASIE_8d11tVd9MLxNF9c2w_jcCCKCIPiOZEWCC2wi0Sh0IPOdrHfr0_gEnbcG0YQLdR-l3gUbWSKfAFbFY_12/s400/lgf01a201409020900+2.jpg" width="400" height="267" /></a></div>
<div class="article-box-blue">プログラミングと英語は道具。選択制で十分だと思うのだが…</div>
<p>2020年度以降の学習指導要領で、<a href="http://mainichi.jp/articles/20170215/k00/00m/040/119000c" target="blank">小学校から英語が教科化し、プログラミングが必修になる</a>ことが決まりました。</p>
<p>これは愚策だと思います。私は仕事柄プログラミングと英語を使いますが、結局、プログラミングも英語も道具でしかないと思っています。この2つの現代ツールは過大評価されすぎです。</p>
<p>プログラミングや英語は、国語や算数や理科とは根本的に違います。小学生のうちは、道具の使い方よりも基本的な学力を伸ばすのに時間を使った方が、将来の役にたつ能力が身につきます。<br/>というのも、道具は使い手の力量次第で、ゴミにも世界を制する武器にもなるからです。例えば、プログラミングで画像処理をする場合、微分積分と線形代数の理解が必要です。今をときめくAI技術、機械学習ならプラスで確率と統計学です。ハード系に関わるなら解析学や物理学、化学や電気回路の学習が必要です。英語はドキュメントや動画を確認し、より多くの人とコミュニケーションを取るツールとして活躍します。</p>
<p>教育者達がこの提案をした気持ちはわかります。facebookのザッカバークは英語を駆使し、プログラミングで20億人が集まるバーチャルな帝国を創りました。彼はプログラマーとしてもTop Coderの上位に入る腕前です。しかし、ザッカバークはプログラミングができなくても成功したでしょう。彼はfacebookの前にも色々なプロダクトを生み出し、企業から多くのオファーをもらっています。世界最高の大学のハーバード大学にも楽々入学し、フェンシングの腕前も一流です。彼のインタビューを読むと、様々な方面の知識量に驚かされます。彼は元々飛びぬけて優秀な人間なのです。</p>
<p>プログラミングは確かに素晴らしいツールだと思います。しかし、全ての人に必要はありません。<br/>もし、学校でどうしても教えるというのなら、興味がある人だけが受講する選択制にするのが一番良いでしょう。英語も同様です。</p>
<p>これは決して差別なんかではありません。区別です。小学生のうちからあまりにも負担をかけすぎではないでしょうか。教育という言葉で武装して、大人のエゴを子供達に押し付けるのは反対です。</p>
<h3 class="paragraph-title-developer-normal">授業風景を想像する</h3>
<p>さて、プログラミングが必修になったとして、どのように小学生にプログラミングを教えるつもりなのでしょうか。<br/>決めるのは文部科学省だから、実績と汎用性のあるJavaを選定すると仮定して、実際の授業を想定してみます。</p>
<p>授業の初日、先生がパソコンに最初のコードを記述します。</p>
<pre>
public class HelloWorld {
public static void main(String[] args) {
System.out.println("小学生のプログラミング");
}
}
</pre>
<p>手元のモバイルに映るこのコードを見て、小学生はどう行動を取るでしょうか。</p>
<p>「先生。読めません」</p>
<p>と多くの子供達が手を挙げるのではないでしょうか。</p>
<p>とはいえ、今の子供達は早期に英語教育を受け、簡単な英語くらい理解しています。なので、以下の質問が飛んでくるかもしれません。</p>
<p>「先生。argsってなんですか?」</p>
<p>当然の疑問です。しかし、この質問は文部科学省の想定通りです。先生は指導要綱の書き込まれた教科書のマニュアル通りに答えます。</p>
<p>「いい質問ですね、佐藤くん。argsはargumentsの略ですよ」</p>
<p>「そっか。argumentsを省略してargsなんだ」</p>
<p>「はい。佐藤くん正解です。皆さんもわかりましたね?」</p>
<p>子供達はそれを聞いて納得し、授業は進んでいく…</p>
<h3>わけない!!</h3>
<p>いや、今の子供は優秀で好奇心も旺盛です。ほとんどの子供はgoogleでargumentsの意味を検索するはずです。すると、モバイルの画面には答えが表示されます。</p>
<p>arguments 名詞:引数</p>
<p>さて、小学生達はこの漢字を何と読むでしょう。</p>
<p>いんすう?<br/>ひきかず?</p>
<p>残念。<br/>これはひきすうと読みます。<br/>
引数は変数を受けるパラメーターです。sがあるので複数のパラメーターを受けられるのだな、とここまで考えられれば満点です。</p>
<p>ここまで読んだ皆さんは、もう理解したと思います。</p>
<h3>計画に無理がある</h3>
<p>のです。</p>
<p>ちなみにほとんどの初心者用のプログラミング参考書では、public static void main(String[] args)を「おまじない」として認識させます。</p>
<p>十分な学習経験のある大人でさえ、最初はおまじないとして認識しながらゆっくりと学習していくのです。算数や国語で悪戦苦闘している子供達にこんなことをやらせて何の意味があるのでしょうか。優秀で意欲のある子供だけが学習すれば十分ではないでしょうか。</p>
<h3 class="paragraph-title-developer-normal">本当に大切なこと</h3>
<p>子供達が未来を担う宝と考えるのなら、力を入れるべきはプログミングや英語ではありません。</p>
<h3>数学、物理、化学</h3>
<p>です。</p>
<p>現在の我々の生活を支え、豊かにしているのは科学です。そして、科学は高度な学力の上に成り立っています。<br/>英語やプログラミングは、効率的に処理する道具でしかありません。</p>
<p>他の分野、例えば芸術分野だって同じです。</p>
<p>エレキギターがロックを生み、音声技術がボカロを生み、DTMがEDMを生みました。芸術だってイノベーションを起こすには、科学が必要になります。つまり、学力が全ての礎なのです。</p>
<p>つい先日、科学誌Newtonを発行するニュートンプレスが民事再生法の適用を申請しました。社会は科学に興味を失っています。世間で理系の人材は貴重だと言われていますが、言われているだけで実際の現場はどこもひどい人手不足で待遇も良くないです。労働基準法? なにそれ? という雰囲気です。トランプ大統領や安倍政権の行動、芸能人のゴシップではネットのコメント欄が賑わいますが、科学関連は閑古鳥がないています。</p>
<p>日本は岐路に立っていると思います。我々の子供たちは、先進国の人間として豊かな生活を送り続けることができるのでしょうか。今のままでは厳しいと思います。</p>
<p>だからこそ教育は何よりも大切です。教育は、多くの富を生み出し、生活を豊かにし、命を救います。</p>
<p>文部科学省や政治家には、なにが世の中を支えているのかを再考して欲しいと思います。お金が必要なのはわかりますが、あまりに金融政策に偏りすぎです。人類の生み出した英知が手に入るからこそ、お金に価値があるのです。</p>
<p>将来の日本は、少子高齢化が避けられません。だからこそ多くの可能性と時間を持つ子供達の教育は大切です。日本のためにも、良い教育が導入されることを願います。</p>
<div class="pick-up-title">PICK UP オススメ書籍</div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N47GNAR/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/512uOE0m3QL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N47GNAR/masayan11315-22/" target="_blank" >Newton(ニュートン) 2017年 03 月号 [雑誌]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;"> ニュートン・プレス 2017-01-26 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N47GNAR/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=Newton%28%83j%83%85%81%5B%83g%83%93%29%202017%94N%2003%20%8C%8E%8D%86%20%5B%8EG%8E%8F%5D&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51i6etGqCTL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" >NATIONAL GEOGRAPHIC (ナショナル ジオグラフィック) 日本版 2017年 3月号 [雑誌]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">ナショナル ジオグラフィック 日経ナショナルジオグラフィック社 2017-02-28 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01N0XTX1J/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=NATIONAL%20GEOGRAPHIC%20%28%83i%83V%83%87%83i%83%8B%20%83W%83I%83O%83%89%83t%83B%83b%83N%29%20%93%FA%96%7B%94%C5%202017%94N%203%8C%8E%8D%86%20%5B%8EG%8E%8F%5D&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0tag:blogger.com,1999:blog-7588247842394426706.post-49831582864564446422017-02-22T23:19:00.000+09:002017-02-22T23:19:05.213+09:002017年2月に読んだ本 2/2 - 2/21日まで<ul>
<li>公開日:2017年02月22日</li>
</ul>
<div class="article-content">
<h3 class="paragraph-title-drone">目的</h3>
<p>ネットの情報がテレビ化してつまらなくなってきたので、2017年からは再び読書量を増やそうと思います。<br/>
読書記録のまとめです。</p>
<p><a href="http://edywrite.blogspot.jp/2017/02/20171-2-113-201.html" target="blank">前回</a>の記録はこちらです。</p>
<p>今年(2017年)の読書数 : 現在 15冊(2017/01/01 - 2017/02/22)</p>
<h3 class="paragraph-title-drone">科学雑誌Newton2017/03月号</h3>
<ul>
<li>開始:2017年01月26日 - 終了 : 2017年02月02日</li>
<li>評価 : A</li>
</ul>
<p>アルツハイマー病の研究の特集が思った以上に良かったです。アルツハイマー病の名前くらいしか知らない人は、この機会に読んだ学んだ方がいいです。あとは今月から連載がはじまった シリーズ 炭素の科学の1回目が非常に良かったです。<br/>来月号が楽しみです。</p>
<iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?t=masayan11315-22&o=9&p=8&l=as1&asins=B01N47GNAR&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=FFFFFF&bg1=FFFFFF&npa=1&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<h3 class="paragraph-title-drone">ナショナルジオグラフィック2017/02月号</h3>
<ul>
<li>開始:2017年02月02日 - 終了 : 2017年02月05日</li>
<li>評価 : B</li>
</ul>
<p>寡婦の特集が印象に残りました。途上国での寡婦の扱いが中世かと驚くような扱いです。グローバル化してもインドやアフリカが発展するとは思えませんね。モディ首相は有能だと思いますけど。</p>
<iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?t=masayan11315-22&o=9&p=8&l=as1&asins=B01MYWUANT&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=FFFFFF&bg1=FFFFFF&npa=1&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<h3 class="paragraph-title-drone">スバラシク実力がつくと評判の統計学キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!</h3>
<ul>
<li>開始:2017年01月21日 - 終了 : 2017年02月08日</li>
<li>評価 : B</li>
</ul>
<p>微積を理解している人が、統計を理解するのに適した本です。カイ二乗分布やt分布あたりの説明が微積の計算式だらけで、何に利用するかが書いていないのは、どうなんだろうと思いました。あとは、モーメント母関数の説明が少なすぎです。なのにあとで何度も出てくるので、理解できるまでストレスが溜まります。今は、統計の本が沢山でているので、数学が苦手な人はそちらの方が良いでしょう。仕事で知識として利用する人ならもっと良い本があると思います。
とはいえ、数学的な裏付けは重要なので、必要性を感じたらこの本を使うと良いでしょう。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4866150203/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51LRmZ9EjNL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4866150203/masayan11315-22/" target="_blank" >スバラシク実力がつくと評判の統計学キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">馬場 敬之 マセマ 2016-11 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4866150203/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83X%83o%83%89%83V%83N%8E%C0%97%CD%82%AA%82%C2%82%AD%82%C6%95%5D%94%BB%82%CC%93%9D%8Cv%8Aw%83L%83%83%83%93%83p%83X%81E%83%5B%83~%81%5C%91%E5%8Aw%82%CC%90%94%8Aw%82%AA%82%B1%82%F1%82%C8%82%C9%95%AA%82%A9%82%E9%21%92P%88%CA%82%C8%82%F1%82%C4%8Ay%82%C9%8E%E6%82%EA%82%E9%21&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=masayan11315-22" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">サピエンス全史</h3>
<ul>
<li>開始:2017年02月02日 - 終了 : 2017年02月20日</li>
<li>評価 : S</li>
</ul>
<p>色々考えさせられた本でした。</p>
<p>農耕社会や工業社会より、狩猟採集社会のほうが健康によく多様な食物を取り、労働時間も短く、感染症も少なかったらしいです。人の手先も器用で、多様な知識をもっていて、古代の狩猟採集民は、知能と技能の点では、歴史上最も優れていたというのは驚きです。本当でしょうか。</p>
<p>とにもかくにも、我々はこれからも歴史と科学を学び、時代に合わせて変化し続けないといけないということです。<br/>
それが、我々ホモサピエンスに埋め込まれた遺伝子であり、世の中をうまく渡っていく唯一の方法なのだと思います。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01KLAFEZ4/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/518jza90ppL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/B01KLAFEZ4/masayan11315-22/" target="_blank" >サピエンス全史 上下合本版 文明の構造と人類の幸福[Kindle版]</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">ユヴァル・ノア・ハラリ 河出書房新社 2016-09-16 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01KLAFEZ4/masayan11315-22/" target="_blank" >Kindle</a></div><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83T%83s%83G%83%93%83X%91S%8Ej%81%40%8F%E3%89%BA%8D%87%96%7B%94%C5%81%40%95%B6%96%BE%82%CC%8D%5C%91%A2%82%C6%90l%97%DE%82%CC%8DK%95%9F&__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dstripbooks&tag=masayan11315-22" target="_blank" >Amazon[書籍版]</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/430922671X/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51MSnnvzg7L._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/430922671X/masayan11315-22/" target="_blank" >サピエンス全史(上)文明の構造と人類の幸福</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">ユヴァル・ノア・ハラリ 河出書房新社 2016-09-08 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/430922671X/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01LW7JZLC/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4309226728/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51Oiig3u-6L._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4309226728/masayan11315-22/" target="_blank" >サピエンス全史(下)文明の構造と人類の幸福</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">ユヴァル・ノア・ハラリ 河出書房新社 2016-09-08 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/4309226728/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01LVTWOVT/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">すべての疲労は脳が原因</h3>
<ul>
<li>開始:2017年02月21日 - 終了 : 2017年02月21日</li>
<li>評価 : C</li>
<li>1回目</li>
</ul>
<p>すごく売れてますが、個人的に読む意味がないと思います。健康本は当たり外れが大きいですよね。</p>
<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/408720829X/masayan11315-22/" target="_blank" ><img src="https://images-fe.ssl-images-amazon.com/images/I/51QUHgg103L._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/408720829X/masayan11315-22/" target="_blank" >すべての疲労は脳が原因 (集英社新書 829I)</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">梶本 修身 集英社 2016-04-15 </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/asin/408720829X/masayan11315-22/" target="_blank" >Amazon</a></div><div class="shoplinkkindle" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01GTDVII4/masayan11315-22/" target="_blank" >Kindle</a></div> </div></div><div class="booklink-footer" style="clear: left"></div></div>
<h3 class="paragraph-title-drone">まとめ</h3>
<p>サピエンス全史は滅多にお目にかかれないレベルの名著です。量はありますが、読むべきです。</p>
</div>Masahttp://www.blogger.com/profile/11407125730031787409noreply@blogger.com0