Windowsとcmdにおける文字処理
Java Windowsプログラムを書いているときに、
なかなかWindowsOSとcmdには苦戦しました。
Windowsでできること
- ファイル名にゼロ幅文字可能
- ゼロ幅文字を付加すれば、同名ファイルとならない
Windowsでできないこと
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引数はよくわかりません(教えてください
「表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クラスのインスタンスを渡しても、
それは正しいということになるのです。
原子力発電原子炉 38th-day
Commentary.
軽水炉の水の役割は、冷却材と減速材の2つである。出力が上がり、水の温度が上昇すると、水の密度が減少し、
中性子の減速効果も減少、それに伴い、核分裂する中性子も減少し、
核分裂は抑制される。
抑制されると、水の温度は低下する。
この自己制御性を利用している。
原子力発電には、加圧水型(Pressurized Water Reactor)と沸騰水型(Boiling Water Reactor)の
2種類がある。
加圧水型は、冷却材を沸騰させずに蒸気発生器を介してタービンへ伝達する。
このため、放射線は漏れず、保守管理は楽になるが、構成は複雑になる。
出力の調整は、ホウ素濃度や制御棒の抜き差しによっておこなう。
沸騰水型は、冷却材を沸騰させて、そのままタービンへ送る方式である。
これは、放射線が漏れてしまうため、タービン部分を遮蔽する必要がある。
このため、保守管理は難しいが、構成は単純である。
出力の調整は、再循環流量の調整か制御棒の抜き差しでおこなう。
炉心上部に汽水分離器や蒸気乾燥器があるため、出力容器は、加圧水型よりも大きくなる。
つまり、PWR, BWRの大きな相違点は、蒸気発生器があるかないかである。
制御棒での調整について、
制御棒を挿入すると、出力は低下する。
制御棒を抜くと、出力は増加する。
Consideration.
沸騰水型は、加圧水型に比べて蒸気発生器はないが、蒸気乾燥器や汽水分離器があるため、大きさは大きくなる。
制御棒は入れると低下、抜くと増加する点に注意が必要である。
これは、制御棒とは、中性子を吸収させる役割があるためである。
中性子が吸収されれば、出力も低下する。
以上の点に注意が必要だ。
原子力発電概論 36th-day
Commentary.
日本の原子力発電所は、主に軽水型である。軽水型原子力発電所の燃料には、低濃縮ウランが用いられる。
原子力発電に使われるウラン235は、天然ウランに0.7%程度しか含まれていない。
よって、これをガス拡散法や遠心分離法などによって濃縮する。
核分裂反応が起きにくいウラン238は、中性子と反応することによって、プルトニウム239に変化し、
その際に発生した、エネルギーが発電に寄与することもある。
核分裂とは、以下の化学式によるものである。
原子核に中性子を入射すると2種類の原子核に分裂し、
質量欠損分の200MeV(エレクトロンボルト)のエネルギーが発生する現象である。
原子力発電は、発電方式では、汽力発電に似ている。
原子力発電 | 火力発電 |
---|---|
原子炉 | ボイラ |
原子燃料 | 化石燃料 |
原子燃料とは、主に核分裂反応が起きやすいウラン235であるが、
天然では、99%以上が反応が起きにくいウラン238である。
Consideration.
しばらく電験ブログを更新できませんでした。。試験まで残された時間は短いので、もっとペースをあげていこうと思います!
ただ、ブログに上げるのは、少し遅れるかもしれません。
今日からは、少しの間、原子力発電のはなしです。
軽水型原子力発電は「軽」い水を使うから「低」濃縮ウランを使う。
ウラン238 + 中性子 → プルトニウム239 + エネルギー
ウラン238も、この変化の際のエネルギーを利用することがある。
ウラン235や238などややこしい。。