Windowsでターミナル環境

oFseminar2014参加メモ

ウィンクルはんだづけ会に参加してきました。

http://atnd.org/events/48259

上記のAndroid日本橋でんでんタウンもくもく会第13回
ウィンクルはんだづけ会に参加してきました。

ウィンクルについてはこちら。
http://www.vinclu.me/

スマホのイヤホンジャックにつけて
ペアリングされたスマホ同士が互いに向き合うと
それぞれに刺さったウィンクルが光る(地球の裏側にある離れた場所のスマホが相手でも)
おしゃれアイテム、ウィンクルです。

今回は、そんなウィンクルのはんだづけ会に参加して
開発用キットを使っての、基盤にハンダ付けするところからの挑戦でした。

完成品はこちら。
半田付け歴半年にしては、わりと上手くできたかなと思います。

f:id:hariganet:20140408235030j:plain

これに自分で樹脂細工や3Dプリンタで外側のカバーを作って基盤を覆えば
ウィンクルの完成ですね。

ちなみにウィンクルはイヤホンジャックから出力される
右耳用、左耳用の音の信号の左右の電圧差から電流を生みだし、LEDを光らせているとのこと。
なので、イヤホンジャック出力の左右の音の信号を制御できれば
ウィンクルの光り方を好きに制御できるとのこと
向き合ったスマホ同士のウィンクルが光る仕組みは
スマホGPSや方位情報をトリガーに、イヤホンジャックから
制御信号を出力して光らせているそうです。
ウィンクルとスマホが一つだけでも
ただ光らすだけなら可能だそう。

と、言う訳でイヤホンジャックならスマホじゃなくてもいけるだろうと
Macのイヤホンジャックにウィンクルを繋ぎ、
音響合成ソフトのMaxを使って、Macから出力する音の左右の周波数を制御して
ウィンクルの光り方を制御できるかためしてみました。

f:id:hariganet:20140408235035j:plain

結果は、写真の通り上手くいきました!
とりあえず光ってます。(動画じゃないので、制御の結果がわかりにくいですね。すみません。)
ちなみにMacのスピーカーのVolumeを下げると電圧が足らなくなるのか光らなくなります。

少し前から、こういうイヤホンジャックの左右の電圧差で制御する
スマホアクセサリーが流行ってるみたいですね。
自分でも作れたらいろいろできそう。

近いウチ、関西でもウィンクルハッカソンが開かれるそうなので
それまでにウィンクルで色々遊んでおきたいですね。

プログラミング事前課題 その9 便利な配列 vector

最後はvectorです。
vectorは以前、解説した配列を少し便利にしたものです。

vectorの解説をする前に、普通の配列を少しおさらいすると

	int num[3] = {0, 1, 2};
	cout << num[0] << endl;		
	cout << num[1] << endl;		
	cout << num[2] << endl;		

とかこういうのでしたね。
実はこの配列には少し不便なところがあって
一度決めた配列の大きさをプログラムの途中で変更することができません。

つまり、一度

int num[3];

で配列を作るとnum配列には数値を3個までしか入れられないんですね。
後から4個したいとか思っても変更は不可です。

これに対してvectorは後から途中で配列の大きさを変えれます。
これむっちゃ便利です。
とりあえずむっちゃ便利だと覚えておいて貰うと良いです。

とりあえずコードを見て行きましょう。

#include <iostream>
#include <vector>
using namespace std;

int main() {
	// your code goes here
	
	vector<int> num;
	
	num.push_back(0);
	num.push_back(1);
	num.push_back(2);

	for(int i=0; i<num.size(); i=i+1){
		cout << num[i] << endl;
	}

	return 0;
}

結果は
0
1
2
と出力されると思います。

では、解説です。

の前に
忘れやすいんですがvector使う時は
2行目の

#include <iostream>
#include <vector>

のように
#include
を追加する必要があります。
これはvectorを使うための設定みたいなものです。


では、解説です。

	vector<int> num;

まず、はじめにここではint型のvectorをnumという名前で宣言してます。
宣言する内容がvectorになっただけで、通常の変数の宣言と同じですね。
普通の配列の宣言と違うのははじめに大きさを指定していませんね。
vectorの特徴の一つははじめに大きさを指定しなくても、
vectorの中に数値を入れたときに、
vectorが大きさを認識して、自動的に大きさを増やしてくれます。便利!

	num.push_back(0);

次に、ここです。
ここでは名前がnumのvectorに0を入れてます。
0を入れることで自動的に名前がnumのvectorの大きさが1増えてます。
その1つ下と2つ下行もそれぞれ、1と2を入れてます。

	for(int i=0; i<num.size(); i=i+1){
		cout << num[i] << endl;
	}

次にここです。いつものforループですね。
ただ条件のところが少し違います。

int i=0;

はいつもと同じですが、

i<num.size();

がいつもと違いますね。

実はnum.size()にはnumの大きさが入ってます。
なので、forループの条件のところにnum.size()を入れると
numの中身の数だけforループを回すという意味になります。
このnum.size()はnumに何か値が追加されて、
numの大きさが変わるたびに自動的に変わってくれるので
何かループをまわす際にはとりあえず回す回数の条件のところには
num.size()を入れておけばループを回す際の条件を気にしなくてよくなるので
便利ですね。

とまぁ、かなり駆け足で説明していきましたが
とりあえず、大きさを後から帰れる配列 vectorっていうのがあって
vectorに値を追加する方法は

vectorの名前.pushback(値) で

vectorの大きさは

vectorの名前.size() で

取れるとなんとなく覚えておいて貰えればOKです。
この辺また解説します。

以上、事前課題は今回で終わりです。
全部はできなかったとか、覚えられてないとこがあるとかは
人によってあるかもしれませんが、勉強会の最中にも解説はするんで
とりあえず、プログラミングにはこういう文法や変数、配列があるんだなと
思って貰えれば大丈夫です。

では、勉強会当日はよろしくお願いします。

プログラミング事前課題 その8 処理をまとめる 関数

関数です。
今までプログラミングする時は

int main() {

	...

	return 0;
}

の中に全部の処理を書いてましたね。
これ一度想像してみて欲しいんですが、
プログラムの内容が長く複雑になってきて
処理をどんどん足して書いてたら、
仮に1万行まで増えてしまったとしましょう。

つまり

int main() {

	...

	return 0;
}

の間に1万行、命令が書かれている訳ですが
こうなってくると、あの変数はどこで宣言しているのか
あの計算はどこか、エラーが出たけど、エラーはどこの行なのか
探すのはもう嫌ですよね。

そこで処理を分割して、意味のある処理ごとに一つにまとめるための
関数という機能がプログラミングには用意されています。

とりあえずコードを見て行きましょう。

#include <iostream>
using namespace std;

float shouhizei(float v, float t){

	float s = v * t;

	return s;
}

int main() {
	// your code goes here
	
	float value = 296000;
	float tax = 1.08;

	float payment;

	payment = shouhizei(value, tax);		
	
	cout << value << "円の物を税率" << tax << "で買うと" << payment << "円払う" << endl;

	return 0;
}

結果は
296000円の物を税率1.08で買うと319680円払う
と出力されると思います。

今回の新しい部分は

float shouhizei(float v, float t){

	float s = v * t;

	return s;
}

	payment = shouhizei(value, tax);		

ですね。

では、解説して行きましょう。

まず

	payment = shouhizei(value, tax);		

です。

これは=の左側は見たことある形ですね。
今paymentはfloat型なので
=の右側から何かの数値を受け取っているのでしょう。
これはpayment = 0.2 + 0.5;
とかと同じ考え方ですね。=の左辺には=の右辺の計算結果が入ります。

つまり、
=の右辺のshouhizei(value, tax);は何かの計算結果を
float型で左辺に渡しているんだろうと推測できます。

解説するとここでは、自分で作った
shouhizeiという名前の関数を呼び出して、
shouhizei関数にvalueとtaxの中の数値を渡して、
shouhizei関数の中で行われた計算結果を左辺に渡すという処理をしています。

この時、気になるのはshouhizei関数の中では
何をしているのという話なんですが
それは少し前に自分で書いてますね。

つまり

float shouhizei(float v, float t){

	float s = v * t;

	return s;
}

これです。
ここでshouhizei関数の中身を書いてます。

中身をひもといて行くと

まず

float shouhizei(float v, float t){

と、書いてます。
これは

	shouhizei(value, tax);		

で、渡されたvalueとtaxの数値の中身をvとtで受け取るという意味です。
つまり

	shouhizei(value, tax);		

と書くと

float shouhizei(float v, float t){

が呼ばれて、同時に

	v = value;
	t = tax;

と同じことがおきて
valueとtaxの中身の数値をvとtに渡していると思って貰えれば大丈夫です。
この後に

float shouhizei(float v, float t){

	float s = v * t;

	return s;
}

の中身が実行されて

float s = v * t;

が実行されます。
今、vはvalueと同じ296000
tはtaxと同じ1.08になっているので
sはそれらの計算結果の319680になります。
次に

	return s;

です。
return s;はsの数値の中身をshouhizei関数を呼び出した場所に渡すという意味です。

つまりここではshouhizei関数を呼び出したのは

	payment = shouhizei(value, tax);		

の=の右辺なので、=の右辺の値がsと等しくなる。
つまり、319680になるということです。
こうして=の右辺の値が319680になったので
その後は普通に=で右辺の値が左辺に代入されて
paymentの中身は319680になります。

このように、処理のひとまとまりを

#include <iostream>
using namespace std;

float shouhizei(float v, float t){
	...
}

int main() {
	...
}


のようにint main(){ }
の外側に書いて呼び出すこと関数を作成する(呼び出す)といいます。
この程度の分量の処理だと、関数のありがたみは
あまり実感してもらえないかもしれませんが
長くなると非常に便利なので覚えておいて貰えばと思います。
一先ず、関数って言うのがあって、処理をまとめられて
関数にはshouhizei(value, tax)みたいに( )で囲んで数値を渡すんだな
と思ってもらえれば大丈夫です。


http://hariganet.hatenablog.com/entry/2014/03/28/221857