Limitlessled

去年の今頃に引っ越しをしまして、その当時照明に凝ってみようと考えていたこともあり、ワイヤレスで制御できるLEDを探していました。この分野で一番名前が売れているのは疑うまでもなくhueだと思いますが、いかんせん高いです。これは自分でも思いましたし、調べていたときいろいろなブログでも同じ考えを持っている人が多数いることがわかりました。そこで代案を調べているとLimitlessledという商品が浮上してきました。milight, easybulbという商品も中身は同じらしいです。そこでヤフオクでそこそこ安くLimitlessledを手に入れ、さらに4灯シーリングライトも買いました。Limitlessledの良い所としては、スマホアプリでの制御や、パソコンからWi-Fi経由での命令を送れること、また赤外線リモコン(別売)でも操作できることです。多様な操作方法があり、なおかつhueよりも安いということで、ネットでよく名前を見かけました。
しかし、マイナー商品であることに変わりはなく、スマホアプリは正直ダサいものしかなく、また当時プログラミングを知らない自分からすれば、パソコン経由からの操作もできませんでした。リモコンがあれば日常使いには問題がないのですが、リモコンもスマホアプリもタイマー設定がありませんでした。2時間程度のタイマーを設定しておいて寝てしまった後でも勝手に消灯してくれるというのが使いたかった機能の一つでもあるので、これは誤算でした。そこで前々から興味がありながらも、なにも勉強してこなかったプログラミングを学んでLimitlessledの操作をより幅広いものにしようという目的でプログラミングをはじめました。

ここまでが一年前の話です。
その後Pythonがわかりやすく解説してあるマイナビニュースの連載記事をもとにPythonを学び始め、それらの腕試し的にpaizaで問題を解き、ある程度Pythonを書けるようになった後、プログラミング言語の基礎的な言語であるC/C++を学びました。文法をある程度学んだぐらいで満足し、数ヶ月プログラミングから離れていた時期もあったのですが、googleのAlphaGoがニュースで話題になり、どうやら機械学習というプログラミングの分野があることを知り、それは今まで学んでいたPythonが使われていることが多いようだということを知り、再度プログラミングを学ぼうという気概が湧いてきたので、また学び始めたというのがここ一年でのプログラミングの勉強の経緯です。この間にもLinuxを通じてUNIX系OSの基礎的な考え方を学んだり、サイト構築のためにhtmlやcssを学んでみたりと、寄り道ばかりしていましたしまだまだ技術が未熟ではありますが、一年でここまで学べるものなのかとこの記事を書きながら驚いています。

まだまだ初心者の域を脱することはできていませんし、学ぶスピードも速い方ではないのでちょっとずつ前進していけたらいいなと思います。

なんていうことない話ではあるのですが、自分がプログラミングを始めたきっかけで、当初の目的でもあるled操作をようやっと修得することができたので、自分の中では少し感慨深いものがあったので記事を書かせて頂きました。

本当は経緯を簡単にまとめて、その後実際のサンプルコードを載せるつもりだったのですが、少し感傷にひたってしまってあまり書く気分ではなくなってしまいました。実際の操作方法は後日もう少し踏み込んだ内容も書けるようになってからにしたいと思います。

BIT演算

C/C++などのサイトでよく見るビット演算と言うものがどういうものかちょっとだけ分かってきたので、そのことについて書きます。

いままでビット演算はどのようにやっているのかそもそもよくわからなかったのですが、単純にint型の変数を宣言してその中に代入されている値を2進数で考えるということだけのようです。

例えば、

int x=1, y = 2, w = 4, z = 8;

と宣言すると、それぞれ2進数ではx = 0b0001, y = 0b0010, w = 0b0100, z = 0b1000と表せられます。(語頭の0bは2進数表記であることを表しています。)

このビット演算をif文の条件式の代わりとして使うことができます。

例えば、

#include <stdio.h>

#define BIT(x) 1 << (x)

typedef struct {
	int id;
	int height;
	int weight;
	int score;
} students;

int main(void) {
	students hanako = {1, 160, 52, 70};
	unsigned int id, height, weight, score;
	
	id     = BIT(0);
	height = BIT(1);
	weight = BIT(2);
	score  = BIT(3);

	printf("Press number for displaying info\n");
	printf("0: id, 1: height, 2: weight, 3: score\n>> ");
	unsigned int info, info_bi;
	scanf("%d", &info);

	info_bi = BIT(info);

	if(info_bi == id) {
		printf("id: %d\n", hanako.id);
	} else if(info_bi == height) {
		printf("height: %d\n", hanako.height);
	} else if (info_bi == weight) {
		printf("weight: %d\n", hanako.weight);
	} else if (info_bi == score) {
		printf("score: %d\n", hanako.score);
	}

	return 0;
}

このコードを実行すると、id, height, weight, scoreの内どの情報を表示しますかと聞いてくるので、見たい情報の番号を入力し、Enterを押すとhanakoの情報が表示されます。

これは簡単なプログラムですので、普通にif文を書いたほうが早いしわかりやすいと思いますが、複雑な論理演算の場合いろんな変数を宣言してそれらの論理演算を条件式に用いるより、スッキリした見た目になるのではないでしょうか。

正直あまり使うことはないかもしれませんが、学習の記録程度にまとめてみました。

非常に初歩的なこと

python環境の構築においてよく目にするPATHを通すということがどういうことかわかっていませんでした。
自分はどのディレクトリにおいてもコマンドにアクセスできるようにすることと理解しています。(初心者なので間違いがあれば訂正していただけると幸いです。)

自分はmacを使っているのですが、Macにはbashの設定ファイルである.bashrcやログイン時に設定を読み込む.bash_profileが設定されていません。それを自分で作成し、その中にPATHの設定項目を書くことで、いわゆるPATHをとおすということができるようになります。

恥ずかしながら、今までAnacondaを使っておきながら、.bashrcを設定していないため長らくPATHを通さず使ってきていました。

先程設定をしたため、ようやっとcondaコマンドを使えるようになりました。

ちなみにPATHはbash_profile内に書いておけばログイン時に読み込まれるそうで、.bashrc内に書く必要はないとのことです。
PATHの通し方等で参考になったサイトは以下です。
gist.github.com
qiita.com
oxynotes.com

np.whereの使い方

np.whereはnumpyに含まれる関数です。

np.where(condition, x, y)と引数を与えると、conditionが真の時にはx, conditionが偽の時にはyを与えるという風に使います。

違う使い方としては、np.where(condition)とだけすると、conditionが真の時のindexを返すようです。

anacondaのアップデート

pythonのパッケージであるAnacondaのアップデートをしました。今までは2.4.1でしたが、今回は4.1.0にアップデートしました。

やり方の説明ではないのですが、Anacondaのアイコンがかっこよくなってました。2.4.1よりは新しいアイコンのほうが好きですね。

ただ起動した後のランチャー画面は若干Window8みたいな感じなのでそれは別のデザインを採用してほしいなとは思いました。全体的にフラットデザインが流行しているようなので、このようなデザインになるのも必然なのかとは思いますが…

またpythonディープラーニングやらプロットやらのコードを勉強していきたいと思います。

matplotlibで3Dプロット

matplotlibの三次元プロットで複数axisを生成する方法がありましたので、コードを書いてみました。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

N = 20

fig = plt.figure(figsize = (8, 6))

ax = fig.add_subplot(2, 2, 1, projection = '3d', azim = 0)
bx = fig.add_subplot(2, 2, 2, projection = '3d', azim = 30)
cx = fig.add_subplot(2, 2, 3, projection = '3d', azim = 120)
dx = fig.add_subplot(2, 2, 4, projection = '3d', azim = 210)

axes = [ax, bx, cx, dx]
colors = ['red', 'blue', 'green', 'orange']
markers = ['o', '^', 'x', 'D']

for axis, i in zip(axes, range(4)):
	np.random.seed(i)
	
	sample = np.random.uniform(0, 3, size = (N, 3))
	
	X = sample[:, 0]
	Y = sample[:, 1]
	Z = sample[:, 2]
	
	axis.scatter(X, Y, Z, color = colors[i], marker = markers[i], alpha = .5)
	
	axis.set_xlabel(r'X axis')
	axis.set_ylabel('Y axis')
	axis.set_zlabel('Z axis')
	
	axis.set_xlim(0, 3.5)
	axis.set_ylim(0, 3.5)
	axis.set_zlim(0, 3.5)
	
	axis.set_xticks(range(4))
	axis.set_yticks(range(4))
	axis.set_zticks(range(4))	
	
	axis.set_xticklabels(range(4))
	axis.set_yticklabels(range(4))
	axis.set_zticklabels(range(4))
	
	
	
	axis.grid(True)


fig.tight_layout()
plt.show()

こんな感じの図が得られると思います。

f:id:jinpei0908:20160822185853p:plain

三次元プロットが一つでいい場合は

ax = Axes3D(fig)

のように書いても大丈夫ですが、いくつか並べる必要があるときには上記のやり方でやったほうがいいと思います。

あと乱数生成の時に先にnp.random.seedと書くとその直後に生成される乱数は固定のものが出てきます。

import numpy as np

np.random.seed(0)

print(np.random.randn(6, 2))
print('\n')

print(np.random.randn(6, 2))
print('\n')
np.random.seed(0)

print(np.random.randn(6, 2))
print('\n')

とすると

[[ 1.76405235 0.40015721]
[ 0.97873798 2.2408932 ]
[ 1.86755799 -0.97727788]
[ 0.95008842 -0.15135721]
[-0.10321885 0.4105985 ]
[ 0.14404357 1.45427351]]


[[ 0.76103773 0.12167502]
[ 0.44386323 0.33367433]
[ 1.49407907 -0.20515826]
[ 0.3130677 -0.85409574]
[-2.55298982 0.6536186 ]
[ 0.8644362 -0.74216502]]


[[ 1.76405235 0.40015721]
[ 0.97873798 2.2408932 ]
[ 1.86755799 -0.97727788]
[ 0.95008842 -0.15135721]
[-0.10321885 0.4105985 ]
[ 0.14404357 1.45427351]]
となります。

参考は以下に

bicycle1885.hatenablog.com

http://d.hatena.ne.jp/sobasobasoba/touch/20131230/1388367688http://d.hatena.ne.jp/sobasobasoba/touch/20131230/1388367688d.hatena.ne.jp

久しぶりに書きます

タイトルのとおりですが久しぶりに書きます。

先日までテストがあったのであまりコードを書く時間もなく、ブログも書けませんでした。
機械学習とか春ぐらいに勉強していたc++について調べたりしてはいましたが…

pythonとかswiftとかと書いておきながら最近はあまりswiftはやってません。どうも今はswift2.0ぐらいらしいのですが、また新しいswift3.0がでて多少仕様が変わるとか。初心者の自分に影響が出るようなほど抜本的な仕様変更ではないと思いますが、あまり解説サイトなどもなくライブラリも豊富ではなさそうなので、swiftは置いといて、同じマルチパラダイムで前まで勉強していて下地のあるc++を勉強しなおしていました。

c/c++の動的配列は未だに理解していません。なんというかイメージがしにくいので、どう書いていいものかと悩みます。

とりあえず、c++pythonで単純パーセプトロンの勉強を目下していこうかと思ってます。