おかゆ++

IT業界の片隅で生き残るブログ

大阪に出張して驚いたこと:地元の刺身がうまかった

f:id:okayu-moka:20170907111844j:plain

刺身がおいしくない!

何年か前に大阪に出張したときのこと。

一緒に出張していた会社の人と居酒屋で飲んでいたときに、 刺身の盛り合わせを注文しました。

一口食べて、びっくりしました。刺身がマズい!

なんだか乾いているし、脂はのっていないし、うーん、全体的に鮮度が低いような……

正直それまで「居酒屋で注文した刺身がマズかった」という経験がなかったので、 「刺身がマズいことって、あるの?」と驚いてしまいました。

結局それ以後は、から揚げとかの揚げ物ばかりを食べました。

愛媛の刺身はうまかった

それもそのはず、刺身となるとどうしても鮮度が味に直結してくるわけで。

私は生まれも育ちも今の住所もずーっと愛媛県で、愛媛以外で生活した経験があんまりないです。 そりゃ瀬戸内海がすぐそばにある愛媛のほうが刺身はおいしいんですよね。 加熱した魚料理であればそこまで差は出ないと思いますが……

普段の飲み会で何気なく食べていた刺身、実はすごくおいしかったんだなぁ。

ということで、愛媛に来た際にはぜひお刺身を食べてくださいね。

愛媛といえば、みかんと鯛

愛媛みかんとかポンジュースとかが有名ですが、実は鯛も名産なので、ぜひぜひ。 おすすめは鯛めしです。

ただし鯛めしには2種類あって、鯛の入った炊き込みご飯タイプと、 白ごはんの上に鯛のお刺身を乗せるタイプがあります。 どっちもおいしいので両方食べ比べするべし。

こんなサイトもありました

www.iyokannet.jp

刺身だけじゃない、おいしい海鮮がたくさんありますので!

いまさら深層学習(TensorFlow)に入門したので参考にしたサイトなど

大まかな進め方

プログラム周りの事前知識としては、PythonFizz Buzzが書ける程度の知識で大丈夫そうでした。

機械学習周りの事前知識として、以下の記事をナナメ読みしました。 この記事でベクトル、テンソル、行列、単純パーセプトロンバックプロパゲーション、Softmax関数、ReLU関数あたりは知っておいたおかげで、スムーズに入門できたと思います。何かしらの資料で勉強しておくことをお勧めします。 とはいえ、あんまり深く理解できなかったところもありました。(大学でもっとちゃんと勉強しておけばよかった!)

qiita.com

事前知識がついたところで、入門記事を探しました。

日本語の情報を参考にしてもよかったですが、今回はTensorFlow公式のGetting Startedで頑張ることにしました。

Getting Started  |  TensorFlow

これらの中でも、MNIST For ML Beginners と Deep MNIST for Experts を理解するところまでをやりました。

「本家のGetting Startedをやるのが難しい、事前学習もまとめて済ませたい」という場合には、以下のブログが丁寧に解説してくれているように見えました。内容はオリジナルっぽいですが、用語から計算式まで説明してくれているので、わかりやすそうでした。

s0sem0y.hatenablog.com

英語

お恥ずかしいことにSEでありながら英語が超苦手なので、Google翻訳で頑張りました。

ブラウザにChrome Extensionsを入れておくと、選択した部分を自動で翻訳して表示してくれます。 わからない単語をすぐ調べたり、場合によっては文章全体を翻訳したりしながら進めました。

chrome.google.com

そういえばGoogle翻訳機械学習になったんでしたっけ。 機械学習の翻訳に機械学習を使ってることになりますね! なんとなく未来を感じます。

どうしてもわからない時は以下の記事で日本語訳してくれていたので、こっちを見て補強しながら進めました。 (でも基本は自力で翻訳しながら進めました。英語の文書に慣れなくては……)

qiita.com

qiita.com

環境構築

今回は環境としては Windows 7Python 3.6.1、TensorFlow 1.3.0 の状態で勉強を進めました。

Pythonは公式からexeでインストール、TensorFlowは公式の記事(Installing TensorFlow on Windows  |  TensorFlow)の通りにpip3でインストールしました。

pip3 install --upgrade tensorflow

GPUを使うとか、そういうのをやるとちょっと面倒なようなので、今回はCPUに頑張ってもらう方針です。

かつてはWindowsだと面倒だったぽいんですが、特に困ることもなく導入できました。 GPUを使わないからかも? いずれ調査ということで。

畳み込みニューラルネットワーク

Getting Started の途中から畳み込みNNによるMNISTになりますが、 そもそも畳み込みNNがわからないと意味不明だったので、以下がとても参考になりました。

deepage.net

とりあえずなんとなくの理解はできたけど、 じゃあ自分でデータ用意して学習させるぜ! というところはまだです。 いずれはそこまでやってみたいですね。

.bash_profileの$PATH設定をミスってlsすらできなくなった時の対処

f:id:okayu-moka:20170901102438j:plain

先日 CentOS 7 の環境で作業していて .bash_profile を変更していたとき、 環境変数 $PATH の設定をミスった状態で保存・読み込みしてしまいました。

# vim .bash_profile

export PATH="$FOO/bin:$HOME"   ←$HOMEじゃなくて$PATH

# source .bash_profile   ←間違ったPATHに
# ls
-bash: ls: コマンドが見つかりません
# vim .bash_profile
-bash: vim: コマンドが見つかりません

command not found! コマンドが! lsが! 見つかりません! orz viも起動できないので .bash_profile を直すこともできません!

なぜか?

lsにパスが通ってないからです! $PATHが死ぬとそんなことになるんですね!orz

あわてず復元

$PATHが死んだ状態なんで、なんとなく元に戻せれば直る……とまではいかなくても、lsやviくらいは動くようになるはず…… ということで以下を実行します。

# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

これでもとに戻ります。よかった!

今回は CentOS 7 だったので、なんとなくもともとのパス設定を覚えていたおかげで直せました。 Ubuntu とかはどうなるのか知らないので、調べといたほうがよさそうですね。

初めての活動量計(Withings Activité Pop)を買いました

初めてのスマートウォッチ(活動量計

前から気になっていたスマートウォッチがAmazonでセールだったので買いました!

Withings スマートウォッチ Activité Pop Shark Grey【日本正規代理店品】

Withings スマートウォッチ Activité Pop Shark Grey【日本正規代理店品】

WithingsはNokiaに買収されて、商品も全部Nokiaブランドに置き換わってます。しかしActivité PopはNokiaになってからラインナップから外れたようで、Nokiaのサイトにも載ってません。

でも、スマホアプリのHealth MateにはしっかりActivité Popの表記もあり、問題なく使えそう。ということで、買ってしましました。

実際のモノ

こちらが実際のモノです。

f:id:okayu-moka:20170829200724j:plain:w300

予想通りWithingsの文字。

印象としては「思ったよりも小さいかな?」というところ。 基本的には大きい時計が好きなんですが、実際に着けてみると邪魔にならないサイズで、これはこれでGoodだと思いました。

アプリとの連携

Nokiaになってから見た目と使い勝手が変わったHealth Mateですが、連携はスムーズにできました。

f:id:okayu-moka:20170905154434p:plain:w300

歩数のカウントについて

つけて行動していると、メインでは万歩計として活躍してくれます。 そこから消費カロリーなんかも計算してくれます。

「1日5000歩を歩く」というような目標を設定すると、目標を達成できたかどうかを教えてくれます。 また、文字盤に目標達成率を示している針があって、パッとみて「あ、今日はまだ50%だ。ちょっと歩いて帰ろうかな?」というような使い方もできます。

ランニングの計測について

つけたまま走ると、ランニングの時間、距離、消費カロリーなんかを算出してくれます。 ボタンなどを押して計測開始するのではなく、勝手にランニング開始を判定するのですが、精度は正直微妙かなと思います。

ランニングではRuntasticやRunKeeperなどのスマホアプリを使っているので、あんまり期待はしていなかったものの、ちょっと残念です。

比較的小さい時計型なので、走るときに邪魔ということがないのは良いところかなと思います。

水泳の計測

水泳はやってないのでわかりません! つけたまま泳げば勝手に測定してくれるらしいですが、果たして……

睡眠の計測

つけたまま寝ると自動で睡眠を検知して、睡眠の深さなどを計測してくれます。 が、これまで5日ほど試しましたが、計測できたのは2日だけでしたorz

私は寝相があまりよくなくて、夜中によく動いていると思われるので、そのせいで計測が始まらないのかもしれません。 まぁこればっかりはしょうがないかなぁと思います。

アラームについて

指定した時間に振動して起こしてくれる機能。 時間幅を指定できるので、おそらく眠りの浅いタイミングを狙って起こしてくれるのでしょう。

振動は結構強いので、普通に起きられました。 普通の目覚ましと違って音がならない(振動音は聞こえますが)ので、 普段使いだけでなく大きな音を出せないような状況ですごく便利そう。

ただ、アラームの時間を1つしか登録できないのはいただけないです…… Activité Pop側の問題なのか、アプリ側の問題なのかわかりませんが、対応できるなら複数件登録したいですね。

まとめ

歩数、ランニング、睡眠、どれも一応測れてはいますが、あまり精確な数値ではないような印象です。 使う人との相性によっても、精確に測れるかどうか変わってくるような気がします。

とはいえ一つの目安としては使えると思います。 また、腕時計と見た目が変わらないというのは非常に良い点で、 デザインもシンプルでかっこいいと思います。

今回はセールで安く買えたので、不満点はあるものの、いい買い物だったかなと思います!

もしかして筋トレって流行ってるんですか?

筋トレって、流行ってるんでしょうか?

最近Twitterやら何やらで筋トレの話をよく見ます。 あと近所にも新しくジムがオープンしたり、プライベートジムなんかも増えてきたように思います。

流行しているのか、自分の関心が高まって目に付くようになっただけなのか……

でも筋トレが流行ると、みんな健康になって、みんなハッピーですね! 流行れ!

筋トレで元気になれました

  • 短期的:筋トレする→なんか脳内物質出る→元気!
  • 長期的:筋トレする→代謝が良くなって痩せる→元気!
  • さらに:筋トレする→痩せる→スタイルが良くなる→自分に自信がつく→精神的にも元気!

ブロガーとかYouTuberとか企業の偉い人とかがこぞって筋トレしている理由がわかりました。 でもこれはやってみないとわからないですね。ということで流行れ!

筋トレ系YouTuber

っていう方がいるんですね! サイヤマングレートとかぷろたんはたまに見てます。

そういえばお盆の時期にサイヤマングレートが愛媛のイベントに来てたみたいです。行けばよかった!

ダイエットのために筋トレをしています

筋トレの目的はダイエットなんですが、これ確実に効くと思います。 むしろ筋トレせずにダイエットすると、筋肉も同時になくなっていってヒョロヒョロに…… なんてこともあるそうです。

「筋トレなんてしんどいこと、やってらんねー」という方は、とりあえずこれを読もう!

筋トレが最強のソリューションである マッチョ社長が教える究極の悩み解決法

筋トレが最強のソリューションである マッチョ社長が教える究極の悩み解決法

筋トレの仕方はほぼ書いてないですが、筋トレへのモチベーションは超上がります。

自宅でダンベルを使っています

自宅でダンベルを使って筋トレしてますが、以下の本を参考にしています!

『自宅で、30分でできるダンベルトレーニング』

『自宅で、30分でできるダンベルトレーニング』

自己流でトレーニングしていると怪我をしてしまうことも多いようですので、しっかり勉強したほうが良さげです!

Flask製アプリケーションをCentOS7+Apache+WSGIで動かす

想定環境

Pythonの導入(pyenv)

pyenvを利用したPythonの導入については過去記事を参照。

okayu-moka.hatenablog.com

今回はPython 3.6.2が導入された状態からスタートします。

Apacheの導入

Apache HTTPサーバについてはyumでインストールした状態だとします。 普通に yum install httpd としてインストールします。

WSGIについて

Wikipediaいわく、WSGIは、WebサーバとPython製Webアプリを接続するためのインターフェース定義らしいです。

JavaでいうところのAJPみたいなものでしょうか。

mod_wsgiの導入

ApacheWSGIするためのモジュールが mod_wsgi です。 普通にyumでインストールすることもできますが、 その場合使用されるPythonyumでインストールしているもの(Python 2.7.x)になってしまうみたいです。

ですので今回はソースからコンパイルして導入します。

まずは公式サイトから最新版を落としてきます。今回は mod_wsgi-4.5.18.tar.gz をダウンロードしました。

pypi.python.org

今回は /usr/local/mod_wsgi-4.5.18 に展開して、ディレクトリに入ります。

$ tar mod_wsgi-4.5.18.tar.gz
$ mv mod_wsgi-4.5.18 /usr/local/
$ cd /usr/local/mod_wsgi-4.5.18

Pythonのパス等を設定し、コンパイルします。

./configure --with-python=/usr/local/pyenv/shims/python
make
make install

これでとりあえずmod_wsgiが手に入りました。ファイルは /usr/lib64/httpd/modules/mod_wsgi.so に作られています。

しかしApacheで読み込むようになっていないので、設定を追加します。 CentOS 7では /etc/conf.module.d の下にモジュール関係の設定ファイルを置くっぽいです。

vim /etc/conf.module.d/10-python.py
# 10-python.pyでmod_wsgi.soを読み込むようにする
LoadModule wsgi_module /etc/httpd/modules/mod_wsgi.so

これでApacheWSGIをする用意ができました。

WSGI用のファイルを作成する

WSGI用のファイルを作成します。 /var/www/html にhtmlファイルがあるとして、Flask製のアプリケーションは /var/www/flask_test_app に配置します。

WSGIのファイルとして、 /var/www/flask_test_app/adapter.wsgi を作成します。

$ vim /var/www/flask_test_app/adapter.wsgi
# adapter.wsgiは以下のように編集

# coding: utf-8

import sys
sys.path.insert(0, '/var/www/flask_test_app')

#from flask_test import app as application
from [Flaskアプリの*.pyファイル] import app as application

[Flaskアプリの*.pyファイル] については、 たとえば作成したFlaskアプリのエントリポイントが flask_test_app.py だった場合は flask_test_app となります。

ApacheWSGIを設定する

作成した adapter.wsgiApacheに設定します。

$ vim /etc/httpd/conf.d/flask_test_app.conf
# flask_test_app.confを以下のように編集
WSGIScriptAlias /flask_test_app /var/www/flask_test_app/adapter.wsgi
<Directory "/var/www/flask_test_app">
  order deny,allow
  Allow from all
</Directory>

これで動くはず

最後はかなり雑でしたがこれで動くはずです。 うまくいかない場合は大体 /var/log/httpd/error_log を見れば大体出ているハズ。

CentOS 7に最新版Pythonを導入する(pyenv)

想定環境

pyenvについて

CentOS 7.xに最初から入っているPythonは2.x系です。 できれば新しめのPythonを使いたいので、pyenvを使って導入します。

pyenvはRubyで言うところのrbenvで、複数バージョンのPythonをインストール・切り替えできるようにするツールのようです。

github.com

This project was forked from rbenv and ruby-build, and modified for Python.

rbenvからフォークしたって書いてますね。そりゃ似てるわけです。というわけで、rbenvを使っている方はそれとほぼ同じなので、さらっと流し読みしてください。

依存関係をインストールしておく

おそらくこのあたりを入れておけば問題ないはずです。

$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install readline-devel zlib-devel bzip2-devel sqlite-devel openssl-devel libXext.x86_64 
libSM.x86_64 libXrender.x86_64 gcc gcc-c++ libffi-devel python-devel

pyenvのインストール

今回は全ユーザに対して導入したいので、pyenv自体の配置場所は /usr/local/pyenv にします。

まずはGitHubからpyenvをクローンしてきます。

$ git clone https://github.com/yyuu/pyenv.git /usr/local/pyenv

シェルの起動時にpyenvを初期化するように設定します。 /etc/profile とかでもいいですが、CentOS 7では /etc/profile.d/ 配下のスクリプトが自動実行されるようになってるようなので、ここに新しく /etc/profile.d/pyenv.sh を作ります。

$ vim /etc/profile.d/pyenv.sh
# pyenv.shの中身には以下のように記載
export PYENV_ROOT="/usr/local/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"

$ source /etc/profile.d/pyenv.sh

これでログイン時に自動読み込みするようになります。今は再ログインも面倒なので、source で実行しておきます。

以上でpyenvの導入は完了です。

pyenvでPythonを導入する

pyenvを用いて最新版のPythonを導入します。

最初に現状のPythonのバージョンを確認してみます。

$ python --version
Python 2.7.x

最終目的はここで最新版のPythonが表示されることです。

まずはpyenvで導入可能なPythonのバージョン一覧を確認します。

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  ...
  3.6.1
  3.6.2
  3.7-dev
  anaconda-1.4.0
  anaconda-1.5.0
  ...

anacondaやpypyなども表示されますが、ただの数字だけのものが通常のPython(CPythonとか呼ぶんだったでしょうか)になります。 3.7の開発版か3.6.2が候補になりそうですね。今回は3.6.2を導入することにします。

以下のコマンドで、Python 3.6.2のダウンロードとインストールが実施されます。ちょっと時間がかかるかもしれません。(コンパイルとかしてるんですかね)

$ pyenv install 3.6.2
Cloning https://github.com/python/cpython...

Installing Python-3.6.2...
Installed Python-3.6.2 to /usr/local/pyenv/versions/3.6.2

バージョンの切り替え

Pythonのインストールまでは完了しましたが、利用するPythonのバージョンを指定していないので、まだ切り替わっていません。

以下の操作で、Python 3.6.2 を利用するように指定します。

$ pyenv global 3.6.2
$ pyenv rehash

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

$ python --version
Python 3.6.2

めでたく最新版のPythonを利用できる環境になりました。

他のバージョンに切り替えるには

今はPython 3.6.2しかインストールしていませんが、pyenv install 3.7-dev のようにして別バージョンのインストールも可能です。

その状態で pyenv global 3.7-devpyenv rehash すれば、Python 3.7.0a が利用できるようになります。