データの転がる音がする

気が向いたら取り組んだことをまとめて記事にしたいと思います。機械学習やソフトウェアの話、はたまた読んだ本についてなど、内容は気が向くままにです。

修論終了&開発スタート

修論、書き上げたりました。この1ヶ月死ぬ気で頑張った成果だと自負しています。書き上げたとはいえ一旦最後まで文章を成立させた、程度なのでまだまだ推敲しなくてはなりませんが、とにかく卒業までに時間を作りました。

 

その時間を使って開発を始めます。Webサービス人工知能分野で作るつもりです。

人工知能を使った社会課題解決ではなく、むしろその領域を活気づかせるようなサービスにします。

・他社と競争、既存事業の破壊はしません。

・マネタイズはまだ考えません。

・素人感のあるデザインは仕方ないとしてもユーザーに歓迎されるような機能にします。

・できるだけブログに記録を残します。

・今年中に作って開発の仲間を集めます。

 

データサイエンス&文系の世界で食べていこうと思っていましたが、性に合う仕事はこっちなんじゃないかと思う日々です。プロジェクトを始めるのってワクワクしますね。

 

いろいろ勉強中..

今週は勉強詰めの一週間だった・・一覧にするとこんなところだろうか

  • Swift                  :簡単なデモアプリを2つ作成
  • Illustrator           :Instagramのロゴを例に触れるようになった
  • HTML / CSS   :本200p進めてデモサイトをほぼ完成させた
  • Vagrant              :基本的な使い方はマスター
  • Heroku               :まだまだ
  • Ruby & Rails      :まだまだ

成果はポジティブに解釈しているような。しかし、大学受験時よりも勉強しているような気がする。新しく触ったサービスやアプリも今週は桁違いだった、、その分運動が不足していた気がするので、日曜日の今日の夜くらい気楽にランニングでもしてきます。

 

デザインの勉強

WebサイトやiOS/Androidアプリの開発をしようと考えていたら、デザインの勉強が必要だと気づきました。美術はこれまでも好きだったので、この勉強はとても楽しいです。

 

研究室のパソコンにillustratorが入っているので、それの使い方から習っています。

ネット記事だとあんまり良い教材がなかったのですが、YouTubeの動画形式だとすごいわかり易いものがたくさんありますね。こんなのが特に参考になりました。

IllustratorでWebデザインしよう #1(基礎スキル編) - YouTube

15分でわかる! イラストレータの使い方 How to use Adobe Illustrator in 15 min. - YouTube

Create New Instagram Logo in 4 minutes real time!!! Adobe Illustrator Tutorial - YouTube

最後のtutorialは感動ものです!Instagramのロゴをどうやって描いているのかわかります。もちろん、このデザインにたどり着くまでの試行錯誤まではわかりませんが..

 

Webデザインを実際に考えてみると、デザインの盗作が心配になります。いろんなサイトやアプリを参考に見させてもらってますが、良いと思ったデザインにどうしても引っ張られてしまうというか、斬新で画期的なデザインは生み出せないなと痛感しました。

また、盗作とは何か、というのも気になって調べてしまいました。いろんな意見がありましたが、個人的にはこちらの記事“パクリ”と”参考”の違い / ホームページ制作 東京[グリッドネス] / WEBデザイン制作が非常に共感できました。より良いデザインに近づけるよう、初心を忘れないこと、ですかね。

 

(追記)

これも良いね

美しいグラデーションをCSSで実装!配色に使える便利ツールや実例も! | Webクリエイターボックス

colorful gradients

写真を丸く切り抜く(Illustrator CS6) - YouTube

今日は素敵なことが!

今日はとても良いことを思いつきましたー!今ここでは明かせないですが、プロジェクト名「BREW」として、面白いものを作ろうと思います!

※ 強い競合がいたので白紙にしました

 

これまでも良いかなーというアイデアはいくつもありましたが、ここまで実行したくなったのは初めてです。エンジニアリングに詳しい友人にアドバイスを求めたら、いろいろ勉強しないといけないことはわかったので、頑張りながら仕上げていきたいと思います!喜んでもらえるモノになるとよいなー

 

あと、こういうアイデアを話してそれにまっすぐと答えてくれる友人は本当にありがたいですね!とても痛感した1日でした。

 

今朝5時からずっと興奮状態に近い、、寝れるか心配です笑

筋トレのメニューを考える

筋トレを週二回ほど、大学のジムに通って続けてきたのですが、なかなか成果が見られません。

自分としては頑張っているつもりなのに、体重計の数字は全く変化せず、それどころか少しでも食生活が乱れるとあっという間に痩せていってしまうしまう感じです。自分のような体型の人を「ハードゲイナー」と呼ぶそうですが(どこまで一般的な名称かは知らない)、どうやら深刻な問題と捉えて改善する必要がありそうです。パーソナルトレーナーを付けようかと思いましたが、安くても月8万円程度はかかってくるので断念。

 

そこで個人で筋トレについてしっかり考えてみました。筋トレで大事なのが食事とトレーニング内容らしいので、それぞれについてこれまでの反省と対策を考えてみます。

 

1. トレーニング

・トレーニングは週2日ほど

            -> 毎日30分~1時間ほどジムに行くようにする

・その時の気分でメニューを決める (毎日2つ)

            -> メニューは次の種目に固定する

      【上腕周り】ベンチプレス / バーベルカール

      【腹筋】腹筋 / クランチ

      【背筋】デッドリフト / 懸垂

      【下半身】スクワット / ランジ

・回数の目標が変わってしまう 

            ->  15回 x 3セットを基本に

・飲み物なし

            -> スポーツドリンクへの投資は惜しまない

 

2. 食事

・食事を抜いたりしてしまう 

    -> 3食は最低でも食べる、食べたモノは記録にブログに綴る

プロテインを適当に

    -> 筋トレで1回、就寝前に1回

サラダチキンを適当に

    -> サラダチキンへの投資は惜しまない

 

プロからみたらガバガバな対策表かもしれませんが、一旦はこんな感じでよいかな。

頑張ります〜

あ、ちなみにこれはバイブルです。最強。

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

VirtualBox + Vagrant で php, MySQLの練習環境を!

f:id:idkphys-030zzz:20160816104810p:plain

最近IoTのちょっとしたデバイスを作ろうと思っていて、IoTということはデータを常にやりとりできないといけなくて、、と考えていたらサーバサイドの知識が必要みたいでした。 サーバを立てたりしてみるのが一番勉強になるとは思いますが、そこまでの気力もないのでちょっと勉強するための環境を探してみたらVagrantで仮想サーバ環境作ってみるってのが良さそうです。

いろいろエラーが出てつまづいたので、いろいろな記事を参考にさせてもらいながら、なんとか環境構築出来たのでその記録です。特に新しいことはできなかったので、参考記事を書いてる先輩方の後追いというか、廉価版になっています。。

Macにサーバと同じ環境を構築する 〜Vagrant編〜 - Qiita

Vagrantに手動でPHP/Apache/MySQLをいれて動かす、基本的なことのメモ。 - Qiita

Vagrantとは

VirtualBoxと組み合わせて、仮想的なサーバー環境を構築できるツール。ノーパソ1台でも、あたかもサーバを立てたかのようにいろいろ触れるので面白そう。2010年に開発がスタートして、現在ではいろいろな企業で使われているらしい。

Vagrant meetupに行って来ました - Qiita

目標

Apach+MySQL+PHPの実行環境を整える!

実行環境

実行環境は

   OSX El Capitan 10.11.3        Virtual Box 5.1.2

です。

1. Vagrant インストール

公式ページ Vagrant by HashiCorp から、OSを選択してインストール。次のコマンドでバージョンが確認出来る。

$ vagrant -v
Vagrant 1.8.5

2. 仮想サーバの構築

#作業ディレクトリの作成
$ mkdir vagrant_server
$ cd vagrant_server

# Boxの追加
$ vagrant box add https://atlas.hashicorp.com/rafacas/centos62-plain

#==> box: Loading metadata for box 'https://atlas.hashicorp.com/rafacas/centos62-plain'
#==> box: Adding box 'rafacas/centos62-plain' (v1.0.2) for provider: virtualbox
#    box: Downloading: https://atlas.hashicorp.com/rafacas/boxes/centos62-#plain/versions/1.0.2/providers/virtualbox.box
#==> box: Successfully added box 'rafacas/centos62-plain' (v1.0.2) for 'virtualbox'!

#(Vagrant コマンド メモ)
# インストール済みのBox一覧
$ vagrant box list

# インストール済みのBoxの削除
$ vagrant box remove [box_name]

3. 仮想サーバの初期化・起動・ログイン

# 初期化
$ vagrant init rafacas/centos62-plain 
# サーバの起動
$ vagrant up

ここでエラーが出たので、下記の1行をVagrantfileに追加

**Vagrantfile**
...
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
config.ssh.insert_key = false    # この1行を追加
end

これで再度、サーバの起動に挑戦

$ vagrant up
#Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'rafacas/centos62-plain' is up to date...

# サーバ起動に成功したので、sshでログインする
# パスワードを聞かれるので "vagrant" と打ち込む
$ vagrant ssh
vagrant@127.0.0.1's password: 

Last login: Tue Aug 16 00:53:34 2016 from 10.0.2.2
[vagrant@localhost ~]$    # <- プロンプトがこのようになればログイン成功!

4. PHP, Apatch(httpd), MySqlのインストール

全然知らなかったのですが、httpdの”d”ってデーモンの"d"なんですね。 デーモンってなんか怖いイメージありましたが、ぼーっと仕事を待ってるプログラムだと思うとなんだか健気ですね。

# 色々とインストール
[vagrant@localhost ~]$ sudo yum install php
[vagrant@localhost ~]$ sudo yum install httpd
[vagrant@localhost html]$ sudo yum install vim

# Mysqlは最新バージョンを入れるために手間をかける
[vagrant@localhost ~]$ wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
[vagrant@localhost ~]$ sudo rpm -Uvh mysql-community-release-el6-5.noarch.rpm
[vagrant@localhost ~]$ sudo yum install mysql-community-server

# httpdを起動
[vagrant@localhost ~]$ sudo service httpd start
Starting httpd: 
[vagrant@localhost ~]$ sudo service httpd status
httpd (pid  1141) is running...

# MySqlを起動
[vagrant@localhost ~]$ sudo service mysqld start

# ログインした時に自動的に httpd, mysql を起動してくれるように設定
[vagrant@localhost ~]$ sudo chkconfig httpd on
[vagrant@localhost ~]$ sudo chkconfig mysqld on
[vagrant@localhost ~]$ chkconfig  
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off   #こんな風になってくれてればOK!!

最後に、Vagrantfile を reload しようとしたらエラーが..

ここまで色々設定したので、WebブラウザからPHPファイルが動いているのを見たかったのですが、その途中でエラーが発生しました。 Vagrantfile を書き換えて reload しようとすると

$ vagrant reload

   default: Warning: Authentication failure. Retrying...

が延々と続いてしまうという状況に。どうやらSSH秘密鍵と、ゲストOSで設定されている公開鍵があっていないらしいです。次の記事を参考に進めたら治ったので、ぜひ参考にしてみてください。

kiraba.jp

関数の最適化をしたり可視化をしたり

今日は凝縮物理の期末レポートを提出してきました!これで無事卒業できそうです。笑

ベイズ統計や機械学習を扱っていると、尤度の最大化など、関数の大域的な最適化にしばしば出会います。きっと実装には手間がかかるんだろうなと思っていたのですが、Scipyに用意されているoptimizeクラスを用いたら驚くほど簡単でした。

大域的最適化の手法

そもそも大域的最適化ってどうやるのか?大域的最適化のアルゴリズムにはいくつか種類があります。

(1) Basin hopping法

    初期値->局所最適を繰り返す

(2) Brute法

     格子状に力任せで探索 

(3)  Differential_evolution法

     進化的アルゴリズムを使い、上手に探索

今回は最適化にはscipy.optimizeに用意された、differential_evolution関数を用います。実際のコードでは、differential_evolution( 最適化したい関数名 , 変数の定義域 ) と打ち込むだけで結果が帰ってきます。非常に簡単です。

関数の例:自発的対称性を破るワイン型ポテンシャルV(x)

今日は期末レポートでひたすら波動関数微分積分していたので、懐かしの物理の分野から。宇宙論素粒子論には「自発的対称性の破れ」という概念があり、この議論から神の粒子と呼ばれるHiggs粒子の存在が導かれます。この理論で出てくる有名なワインボトル型のポテンシャル関数は、局所最小な値がいくつもある形をしているので、今回は可視化・局所最小探索にこの関数を使ってみます。ただ、実際には局所最小値は1つになって欲しいので、このポテンシャルに、傾きの項を加えてあげます。

Ex1: 1次元ポテンシャル

下のコードを実行するとポテンシャルが可視化されます。左が良く見るワイン型で、右が摂動項を加えて傾かせたポテンシャル。コード後半では、傾きを加えたポテンシャルの最小値探索を実行しています。変数の定義域 = bounds を定めて、それを differential_evolution関数に代入すれば結果が返ってくるので本当に簡単。図の赤い点が大域的最小値です。

# 1次元ポテンシャルの可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import rosen, differential_evolution, minimize, basinhopping
from mpl_toolkits.mplot3d import Axes3D

# パラメータ
mu = 8
lamda = 1

# ポテンシャルの定義
def V1(x):
    return -(mu ** 2)* (x**2) + lamda*(x **4)

def V1pert(x):
    return -(mu ** 2)* (x**2) + lamda*(x **4) - 100*x

# ポテンシャルの可視化
x = np.arange(-10, 10, 0.1)
y = V1(x)
plt.plot(x,y)
plt.show()

y = V1pert(x)
plt.plot(x, y)
plt.show()

# 最適化の実行
bounds = [(-10.0, 10.0)]
res = differential_evolution(V1pert, bounds)
print res

# 最適化の結果の可視化
x = np.arange(-10, 10, 0.1)
y = V1pert(x)
plt.plot(x, y)
plt.scatter(res.x, V1pert(res.x), c="r")
plt.show()

f:id:idkphys-030zzz:20160813021630p:plain f:id:idkphys-030zzz:20160813021829p:plain

Ex2: 2次元ポテンシャル

次に2次元ポテンシャルを解析してみます。こっちの方が見た目に楽しいかも。やっていることはEx1と一緒です。 グリッド上の3次元プロットが新しかったので、その実装の仕方は記憶に留めておこうと思います。

# 2次元ポテンシャルの可視化と最適化
#パラメータ
mu = 12
lamda = 1
alpha = 100

# ポテンシャルの定義
def V2(x):
    return  -(mu ** 2)* (x[0]**2+x[1]**2) + lamda*(x[0]**2+x[1]**2)**2

def V2pert(x):
    return  -(mu ** 2)* (x[0]**2+x[1]**2) + lamda*(x[0]**2+x[1]**2)**2 +alpha*(x[0]+x[1])

# 3次元プロット
x = np.arange(-10.0, 10.0, 1)
y = np.arange(-10.0, 10.0, 1)

xx, yy = np.meshgrid(x, y, sparse=True)
z = -(mu ** 2)* (xx**2+yy**2) + lamda*(xx**2+yy**2)**2

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_wireframe(xx, yy, z)

xx, yy = np.meshgrid(x, y, sparse=True)
z = -(mu ** 2)* (xx**2+yy**2) + lamda*(xx**2+yy**2)**2 + alpha*(xx+yy)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_wireframe(xx, yy, z)

f:id:idkphys-030zzz:20160813021633p:plain f:id:idkphys-030zzz:20160813023218p:plain

疲れたので今日はここまで!