Memorandums?

This blog is written about technical-discoveries and daily-events.

Windowsとcmdにおける文字処理

Java Windowsプログラムを書いているときに、
なかなかWindowsOSとcmdには苦戦しました。

Windowsでできること

  • ファイル名にゼロ幅文字可能
  • ゼロ幅文字を付加すれば、同名ファイルとならない

Windowsでできないこと

  • ファイル名に特殊文字(",/,\,|,<,>,:)が付けられない
  • 認識できるUnicode上にゼロ幅文字が存在しない
  • ファイル名の末尾に半角空白文字を付けられない
  • 同名ファイルはNG

cmdでできること

cmdでできないこと

  • ゼロ幅文字関連Unicodeは認識不可能
  • 制限される記号文字が多い


以上を念頭において、Javaプログラミングをしなくてはなりません。
今回のプログラムは、

1ファイルを1メッセージとし、ディレクトリ内のファイル一覧を更新し続けることで
コンソール(cmd)上でチャットをおこなう

というものです。

問題1. 同じメッセージ

2個以上同じメッセージがあるときの処理が問題です。
まず、メッセージをファイルに保存しなくてはなりません。
これは、同名メッセージの回数分、ゼロ幅文字を文字列終端に付加することによって解決!!!
と、思いきや!!!
さすがは、ダメダメOS, Windowsです。
ゼロ幅文字Unicodeが認識しません、ダメでした。(Unix環境なら可)
仕方ない、半角スペースを後ろにつけよう!
と、、ダメです、ファイル名の後ろには半角スペースは付けられません。
ということで、結局全角スペースを後ろにつけることで解決しました。
全角スペースは、プログラム中に" "なんて書かずに、'\u3000'と書くことをおすすめします。
そして、コンソール表示時の問題。
全角スペースをつけていると、同じメッセージが大量に来た時、
コンソール上で改行されてしまいます。
よっぽで無い限り、改行しませんが、やっぱりここは完璧主義。全角スペースはなくしましょう。
これは簡単です。

str = str.replaceAll('\u3000'+"+$", "");

正規表現でらくらく解決♪

問題2. 特殊文字対応

特殊文字(",/,\,|,<,>,:)はファイル名につけられないため、
メッセージに打たれると、エラーとなります。ただし!!!
全角はOKです。全角に変換します。コロンの場合、

str = str.replace('\u003a', '\uff1a');

これでOKです。
表示時も全角で表示することを防ぐため、
表示するときは、逆に戻します。

問題3. スケジュール実行の一時停止

一定時間おきに実行させるスレッドを一時停止させる場合、
TimerTaskでは通用しません。

Runnable task = new Read();
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future = scheduler.scheduleAtFixedRate(task, 0, time, TimeUnit.MILLISECONDS);

これで大丈夫です。

問題4. ファイルタイムテーブルの管理

ファイル名と作製時刻を同期させるのに、はじめに思いつくのはMapです。
ただ、Mapはソートが難しいです。
TreeTableなどなら、Keyをテンプレートにしたがって、ソートできますが、
非常に面倒です。
そこで、リストで実装しました。

time = new ArrayList<>();
msg = new ArrayList<>();
list = dir.listFiles();

for (int i=0; i < list.length; i++) {
	lastModified = list[i].lastModified();
	title = list[i].getName();

	if (uploadTime >= lastModified) {
		continue;
	}
	if (time.isEmpty()) {
		time.add(lastModified);
		msg.add(title);

		continue;
	}
	int size = time.size();
	for (int j=0; j < size; j++) {
		if (lastModified < time.get(j)) {
			time.add(j, lastModified);
			msg.add(j, title);
			break;
		} else if (j == size-1) {
			time.add(lastModified);
			msg.add(title);
			break;
		}
	}
}
for (int i=0; i < msg.size(); i++) {
	System.out.println(msg.get(i));
}
if (time.size() != 0)
	uploadTime = time.get(time.size()-1);

こんな感じで実装できます。

問題5. 諸問題

Fileクラスからディレクトリ生成する場合、
最後に\を付けないほうがいいです。たとえば、

C:\Users\Owner\Folder

とします。そのフォルダにファイルを作る場合は、

DIR + File.separator + File.txt

などとします。



結論

Windowsとcmdは面倒。

TeXあれこれ

目次にsubsubsectionまで表示させたい!

\setcounter{tocdepth}{4}

sectionの章番号は表示させたくないけど、目次には表示させたい!

\subsection*{hogehoge}
\setcounter{subsection}{1}
\addcontentsline{toc}{subsection}{hogehoge}

subsection名とaddcontentslineの第3引数に与える文字列は同じにしてください。
setcounterのsubsectionを1にするのは、しなくてもOKです。

表をその場所に表示させる!(後の文章に回り込ませない)

\begin{table}[htbp] % 浮動

では、スペースが開いている、かつ、表がそこには表示できない場合に、
後の文章が回りこんでしまいます。
そんなときに!

\usepackage{here}

\begin{table}[H]

\end{table}

ページ番号を付けない!

\pagestyle{empty}

目次などに使えます。

表の行を結合するときに偶数行の場合、真ん中に表示させたい!

奇数行で真ん中に表示させたいなら、
書きたくないマスは空文字(何も書かない)で、

\cline{n-m}

で横棒を引きたい所にひけば、できます。が、、、!
奇数行の時に真ん中に表示はこの方式ではできませんよね。そこで、、、!

\usepackage{multirow}

\multirow{2}{*}{hogehoge}

と最初の行で記述し、後は、空文字にすればOKです。
multirowの第1引数は、まとめる行数です。
第2引数はよくわかりません(教えてください

図表番号取得

図表内で

\label{tb:hoge}

tbとはtableのことで表を意味します。
そして、表番号を使いたいところで、

\ref{tb:hoge}

とすれば取得できます。

「表1」などの書式を変えたい!

これに関しては、プリアンブルに関することになりますが、
本文中にも記述できます。

\def\thesection{第1節}

javaの疑問を解消しよう part1

問題。

public class C {
	public static void main(String[] args) {
		new B(new A());
	}
}

class B {
	B(C c) {
	}
}

class A extends C {
}

このソースコードは正しいですか?



答え。

正しいです。(もちろんこのソースコードに意味はありません)
Cクラスでは、メインメソッドで、Bクラスのインスタンスを作成しています。
Bクラスのコンストラクタでは、第一引数にCのインスタンスを与えなくてはならないと定義しています。
それなのに、CクラスでのBクラスのインスタンス生成時に、
引数として、Aのインスタンスを渡してしまっています。

これは一見間違いだと思いがちなのですが、
Aクラスのコードを見てください。
Aクラスは、Cクラスを継承しています。
継承しているということは、Cクラスの機能を包括しているということなので、
Aクラスは、Cクラスの代用もできる、
ということになります。

したがって、引数として、Aクラスのインスタンスを渡しても、
それは正しいということになるのです。

太陽光発電 39th-day

Commentary.

太陽光発電(Photo Voltaic)の特徴をまとめる。長年にわたって蓄積された資源を使う必要がなく、クリーンである。

Consideration.

太陽光発電分野は、既存の知識範囲のみで大丈夫かもしれません。
あえて覚えるなら、発電効率10%〜20%程度であるということ。

原子力発電原子炉 38th-day

Commentary.

軽水炉の水の役割は、冷却材と減速材の2つである。
出力が上がり、水の温度が上昇すると、水の密度が減少し、
中性子の減速効果も減少、それに伴い、核分裂する中性子も減少し、
核分裂は抑制される。
抑制されると、水の温度は低下する。
この自己制御性を利用している。

原子力発電には、加圧水型(Pressurized Water Reactor)と沸騰水型(Boiling Water Reactor)の
2種類がある。
加圧水型は、冷却材を沸騰させずに蒸気発生器を介してタービンへ伝達する。
このため、放射線は漏れず、保守管理は楽になるが、構成は複雑になる。
出力の調整は、ホウ素濃度や制御棒の抜き差しによっておこなう。

沸騰水型は、冷却材を沸騰させて、そのままタービンへ送る方式である。
これは、放射線が漏れてしまうため、タービン部分を遮蔽する必要がある。
このため、保守管理は難しいが、構成は単純である。
出力の調整は、再循環流量の調整か制御棒の抜き差しでおこなう。
炉心上部に汽水分離器や蒸気乾燥器があるため、出力容器は、加圧水型よりも大きくなる。

つまり、PWR, BWRの大きな相違点は、蒸気発生器があるかないかである。

制御棒での調整について、
制御棒を挿入すると、出力は低下する。
制御棒を抜くと、出力は増加する。

Consideration.

沸騰水型は、加圧水型に比べて蒸気発生器はないが、
蒸気乾燥器や汽水分離器があるため、大きさは大きくなる。

制御棒は入れると低下、抜くと増加する点に注意が必要である。
これは、制御棒とは、中性子を吸収させる役割があるためである。
中性子が吸収されれば、出力も低下する。

以上の点に注意が必要だ。

原子力発電の計算 37th-day

Question.

熱効率32%の原子力発電において、
 {}^{235}U1gで、質量欠損が0.09%であったとき、
発生電力量[kWh]はいくらか。

Solver.

原子力発電では、核分裂反応の質量欠損分がエネルギーとなる。
この問題を解くために重要なのは、エネルギーの公式である。
 E = mc^2
まずは、質量を求める。
 m = 1 \times 10^{-3} \times 0.09 \times 10^{-2} = 9 \times 10^{-7} [kg]
cは光速であり、 3 \times 10^{8}[m/s]である。
よって、
 E = mc^2 = 9 \times 10^{-5} \times 9 \times 10^{16} = 8.1 \times 10^{10}[J]
 1kWh = 1000 \times 3600 Ws = 3.6 \times 10^6J
なので、
 \frac{8.1 \times 10^{10}}{3.6 \times 10^6} = 7200kWh
となる。


Consideration.

今回は、原子力発電量の計算問題である。
 E = mc^2さえ覚えれば、問題はない。

原子力発電概論 36th-day

Commentary.

日本の原子力発電所は、主に軽水型である。
軽水型原子力発電所の燃料には、低濃縮ウランが用いられる。
原子力発電に使われるウラン235は、天然ウランに0.7%程度しか含まれていない。
よって、これをガス拡散法や遠心分離法などによって濃縮する。
核分裂反応が起きにくいウラン238は、中性子と反応することによって、プルトニウム239に変化し、
その際に発生した、エネルギーが発電に寄与することもある。

核分裂とは、以下の化学式によるものである。
 {}^{235}_{92}H + {}^1_0n \rightarrow A + B + 2.5 {}^1_0n + Energy
原子核中性子を入射すると2種類の原子核に分裂し、
質量欠損分の200MeV(エレクトロンボルト)のエネルギーが発生する現象である。

原子力発電は、発電方式では、汽力発電に似ている。

原子力発電 火力発電
原子炉 ボイラ
原子燃料 化石燃料

原子燃料とは、主に核分裂反応が起きやすいウラン235であるが、
天然では、99%以上が反応が起きにくいウラン238である。


Consideration.

しばらく電験ブログを更新できませんでした。。
試験まで残された時間は短いので、もっとペースをあげていこうと思います!
ただ、ブログに上げるのは、少し遅れるかもしれません。

今日からは、少しの間、原子力発電のはなしです。
軽水型原子力発電は「軽」い水を使うから「低」濃縮ウランを使う。
ウラン238 + 中性子プルトニウム239 + エネルギー
ウラン238も、この変化の際のエネルギーを利用することがある。

ウラン235や238などややこしい。。