感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

【プログラミング 120.5時間目】キューを使って、順番に処理を実行したい時。

<スポンサーリンク>

処理したい仕事が何個もあるとする。
その処理には順番が大事だ。1つの仕事が終わったら次の仕事。
終わったら次の仕事。というように順に実行しなければならない。

そういうときに「させたい仕事」をキューに詰め込んで、
その詰め込んだ順番に「仕事を処理する」というのを作ってみる。

参考にしたのは結城浩さんのJava言語で学ぶデザインパターン入門【マルチスレッド編】

でも、まだまだ全然使いこなせてない。
本にあるようなスマートなプログラムを書けておらず、ゴリ押しになってしまっている。
そもそも、下の実行例だとマルチスレッドにする必要もなく、普通にListに入れればいい話だ。
でもマルチスレッドの勉強のために色々といじってみた。
難しい。もうちょい考えてみよう。

ちなみに、Queueのメソッドは
remove():キューの先頭から要素を1個取り除き、その要素を返す。もしも要素が1個もなかったら例外を投げる。
offer():キューに要素を付け加える。
peek():キューに要素が存在するなら先頭の要素を返し、なければnullを返す。このメソッドは要素を取り除かない。

★★

まずは、仕事の指示を出すMainクラス。

package guarded.suspension;

public class Main {
	public static void main(String[] args) {
		WorkQueue workQueue = new WorkQueue();
		new ClientThread(workQueue, "WORK REQUEST START!").start();
		//全部の仕事が詰め込み終わったら仕事を処理し始める。
		while(true) {
			if(workQueue.isQueueEnd()) {
				new ServerThread(workQueue, "WORK GET STARTED!").start();
				break;
			}
		}

	}
}

このMainクラスでキュートと、仕事を作るClientThreadと、仕事を処理するServerThreadを作る。
ServerThreadは、すべての仕事が詰め込み終わるまで動かない。

仕事をイメージするWorkはこんな感じ。
このWorkをキューに詰め込むのだ。

package guarded.suspension;

public class Work {
	private String workName;
	/** 仕事が終わったフラグ  */
	private boolean isEnded = false;
	
	private boolean isLastWork = false;
	
	public void setIsLastWork(boolean isLast) {
		this.isLastWork = isLast;
	}
	
	public boolean isLastWork() {
		return isLastWork;
	}
	public boolean isEnded() {
		return isEnded;
	}

	public void setEnded(boolean isEnded) {
		this.isEnded = isEnded;
	}

	public String getWorkName() {
		return workName;
	}

	public void setWorkName(String workName) {
		this.workName = workName;
	}
	
	
	public void doWork() {
		//なんらかの処理のイメージ
		try {
			System.out.println("仕事をしています。やってる仕事→" + workName);
			Thread.sleep(1000);
			System.out.println(workName + " の仕事が終わりました!");
			isEnded = true;
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public String toString() {
		return "[WORK NAME:]" + workName + "]";
	}
	
}

で、ここが肝となるキューのクラス。
キューに仕事を詰め込み、キューから仕事を取り出す。

package guarded.suspension;

import java.util.LinkedList;
import java.util.Queue;

public class WorkQueue {
	//キューに詰め込んだ仕事が全部無くなったらフラグを立てる
	private boolean isQueueEnd = false;
	
	//最初の仕事をキューに詰め込んだときにフラグを立てる
	private boolean isfirstWorkPut = false;
	
	public boolean isfirstWorkPut() {
		return isfirstWorkPut;
	}

	public void setfirstWorkPut(boolean isfirstWorkPut) {
		this.isfirstWorkPut = isfirstWorkPut;
	}

	public boolean isQueueEnd() {
		return isQueueEnd;
	}

	public void setQueueEnd(boolean isQueueEnd) {
		this.isQueueEnd = isQueueEnd;
	}
	//仕事を入れるキュー
	private final Queue<Work> queue = new LinkedList<Work>();
	
	public synchronized Work getFirstWork() {
		while (queue.peek() == null) {
			try {
				wait();
			} catch (InterruptedException e) {
				
			}
		}
		System.out.println("最初の仕事(キューの先頭の)を取得します。→" + queue.peek().getWorkName());
		return queue.remove();
	}
	
	public synchronized Work getNextWork() {
		if ( queue.peek() == null) {
			Work work = queue.peek();
			while(!work.isEnded()) {
				try {
					wait();
				} catch (InterruptedException e) {
				}
			}
		}
		return queue.remove();
	}
	
	public synchronized Work getWork() {
		while(queue.peek() == null) {
			try {
				wait();
			} catch (InterruptedException e) {
				
			}
		}
		return queue.remove();
	}
	public synchronized void putWork(Work work) {
		queue.offer(work);
	}


}

仕事をどんどん入れていくClientThreadはこんな感じ。

package guarded.suspension;

import java.util.Random;

public class ClientThread extends Thread {

	private final WorkQueue workQueue;
	private Random random = new Random();
	
	public ClientThread(WorkQueue workQueue, String workName) {
		super(workName);
		this.workQueue = workQueue;
	}
	
	public void run() {
		//仕事を10個キューに詰め込む
		for (int i = 0; i < 10; i++) {
			Work work = new Work();
			work.setWorkName("WORK:" + i);
			System.out.println("仕事を詰め込んでいます" + i);
			//最後の仕事に印をつけるイメージ
			if(i == 9) {
				work.setIsLastWork(true);
			}
			workQueue.putWork(work);
			try {
				Thread.sleep(random.nextInt(500));
			} catch (InterruptedException e) {	
			}
			/** これはいらなかった
			if(i == 1) {
				//最初の仕事を詰めたらフラグ立てる
				workQueue.setfirstWorkPut(true);
			}
			*/
			if(i == 9) {
				System.out.print("仕事を全部詰め込んだので、");
				workQueue.setQueueEnd(true);
				System.out.println("キューの終了フラグを立てます→" + workQueue.isQueueEnd());
			}
			
		}
	}
}

仕事の終わりに印をつける。
最後。仕事を処理するServerThreadはこんな感じ。

package guarded.suspension;

import java.util.Random;

public class ServerThread extends Thread {

	private final WorkQueue workQueue;
	private Work work;
	public ServerThread(WorkQueue workQueue, String name) {
		super(name);
		this.workQueue = workQueue;
	}
	public void run() {
		System.out.println("仕事が全部キューに詰め終わったようなので、順に処理します");
		while ((work = workQueue.getWork()) != null) {
			work.doWork();
			if(work.isLastWork()) {
				System.out.println("最後の仕事が終わったのでループを抜けます!");
				break;
			}
		}
		System.out.println("すべての仕事が完了しました!");
	}
}

いちおう実行すると順番通りに処理してくれる。

仕事を詰め込んでいます0
仕事を詰め込んでいます1
仕事を詰め込んでいます2
仕事を詰め込んでいます3
仕事を詰め込んでいます4
仕事を詰め込んでいます5
仕事を詰め込んでいます6
仕事を詰め込んでいます7
仕事を詰め込んでいます8
仕事を詰め込んでいます9
仕事を全部詰め込んだので、キューの終了フラグを立てます→true
仕事が全部キューに詰め終わったようなので、順に処理します
仕事をしています。やってる仕事→WORK:0
WORK:0 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:1
WORK:1 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:2
WORK:2 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:3
WORK:3 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:4
WORK:4 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:5
WORK:5 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:6
WORK:6 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:7
WORK:7 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:8
WORK:8 の仕事が終わりました!
仕事をしています。やってる仕事→WORK:9
WORK:9 の仕事が終わりました!
すべての仕事が完了しました!

||

やっぱりなんかすごく違和感があるので、もっとちゃんとマルチスレッドを使いこなしたい。
マルチスレッドのデザインパターンは難しいけど、使いこなしたら便利だと思う。

*1360973639*[英語]【英語 19時間目】ファイナンスの知識と英語を一緒に勉強できる「プロの英語 ファイナンス編」
大学生のとき、ある投資銀行のM&A部門のインターンシップに行った。
そこでは、チームを作ってM&Aの提案をする。
「○○社の買収のご提案」的な。
なんか知らんけど深夜まで残って買収スキーム(?)みたいのを考えて、ほとんど毎日3時間睡眠で資料を作った。

当時ファイナンスの知識はほとんどなかった。今もそんな無いけど。
で、そういうときチームを率いるのはゼミでファイナンスなんかをやっている声のでかい人だ。
「ロジックが大事だ(キリッ)」言いながら、本当に論理的に提案をまとめていく姿に、
「世の中にこんな頭の良い大学生っているのか・・・」なんて感動を覚えた。
と、同時に、頭の良い投資銀行志望の学生達の意識の高さと自己顕示欲の強さに、
「こういう人達と同期だと息苦しいだろうな」
という気持ちになったのをよく覚えている。

さて、そんなインターンシップで優秀な学生がよく言っていたのが
「マルチプル」という単語だ。印象的だった。

マルチプルとは、株価収益率(Price/Earnings ratio)のことで、株価が1株当たり利益(EPS=Earnings Per Share)の何倍で取引されているかを占める。
要は、現在の株価が割安か割高かを論理的に説明するために使う単語だ。

マルチプルがhogehogeだから、この株は割安で、御社に利益がfugafugaみたいな感じ。だったと思う。

そんな用語の理解もできて、しかも英語を学べるのが「プロの英語 ファイナンス編」だ。
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=gomyownway0a-22&o=9&p=8&l=as1&asins=4822243494&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

Part3はゴールドマン・サックスの話。

そういえば金融とは全然別のインターンシップでも、「ゴールドマン・サックスにインターンに行ったことがある人」がいると「すごい人」扱いされていた。
当時、「外銀のインターン参加者」は就活生の間で神扱いされていたのである。
たしかに、ハキハキとしゃべり、ロジカルに質問に回答し、自信に満ちた表情で話す外銀候補生達は、とても魅力的に見えた。
多少怖かったけれど。

■その他
ROEとは、株主資本に対する税引後利益の割合のこと。
企業は株主資本と他人資本を投下して事業を行う。これはバランスシートの右側のことだ。
で、そこから得られた収益の中から、他人資本には利子を支払う。
まず借りたお金を利子をつけて返さなければいけないということだ。
それから税金を差し引いて残った税引き後の利益が株主に帰属する。
これが、利益分配において「株主が1番立場が弱い。それゆえ、株主利益が最大になるように努力するのが正しい」といわれる由縁だ、と思う。

機関投資家の台頭で株主の力が強まった米国では、「投下した資本がどれだけ有効活用して利益を上げられるのか」という点が重視されるようになった。
つまり、ROEがもっとも重視される財務指標の1つになった。
これがROE経営の由来である。

*1360968874*[新聞]【新聞 14.5時間目】グーグルCFO「大事なのはモバイルだけではない。『たくさんの機器がネットにつながる世界』ととらえるべきだ」
休みの日は毎度だが、日経新聞を読んで印象的だった情報をまとめる。

★★
■米グーグルCFOに聞く
・グーグルは2012年に売上高が初めて500億ドル(約4兆6千億円)を超えた
ちなみに電通の2012年売上高は1273億(前年比91.8%)だ。
http://www.dentsu.co.jp/news/release/2012/pdf/2012108-1005.pdf

・人々はスマホ、タブレット、パソコン、テレビ、車さえつながることを望んでいる。
全てがネットにつながる時代になる。テレビも。車も。

・長期的に見て、デジタル経済の流れは止まらない。

■九州電力、賃下げ
・九州電力は15日、組合員の基準内賃金の最大6%削減を労働組合に提案。

・2011年年度に826万円だった九州電力の社員の平均年収を13年〜15年には650万円に引き下げることを表明した。

■6秒ビデオに世界が沸く
・「6秒ビデオ」が世界中で流行している。

・米ツイッターの子会社が1月末に開始した「Vine(ヴァイン)」がサービスの担い手。

・撮影時間は6秒。操作を含めて10秒後には投稿できる手軽さがヒットの理由。

・Vineの開発を進めていたのは社員3人のベンチャー企業。昨年10月にツイッターが買収した。
→社員3人で作ったサービスが世界を席巻!
-----------------------
ツイッターもそうだが、人は手軽さを求める傾向がある。
ブログよりもツイッターのほうが楽だ。日記を書かずにツイートする。
ニコニコのビデオが流行っているようだが、まずは手をかけたコンテンツがネットを席巻する。
かつてのブログのように。
それから、それを見た一般の人も気軽に投稿したいと考える。でも、長々撮影するのは面倒臭い。
手軽に投稿したい。
そういうときニーズに応えるのが、6秒動画だと思う。
手軽に、コンテンツの質の高さなどは求められない。

いずれは、いまツイッターでアルファツイッターラーみたいのがいるように、Vineでも影響力の強いユーザーが現れることだろう。
何はともあれ、もしユーザーを早く獲得したい場合、こういうのは早く始めた方が得だ。
Google+でフォロワー数日本一になった坂口綾優のように。
-------------------------

・日本の乗用車メーカー8社の2013年の販売計画が2500万台を超えた。2年連続で過去最高を更新する見通し。

・なんと、世界販売に占める比率は23%と5年ぶりの高さになる。

・インドは年間に1300本映画が制作され、観客動員数が29億円に達する映画大国である。

・スーパーやコンビニエンスストアが総売上高に占めるネット比率は12年度で3.4%。
音楽ソフトに占めるネット配信の比率は20%だ。

・消費者は時間を節約したがる傾向がある。ファーストリテイリングのパンツのお直しはおおむね1時間以内で完了する。

・眼鏡チェーンの「JIN」も眼鏡の調整に書ける時間は45分程度。

・消費者が「時間を節約したがる」傾向は顕著。
→要は「待たずに手軽」がいい。