今日の自分を支える 技術→マネジメント

技術職→管理職になりました

MANIFEST.MF

jarのMETA-INFフォルダにある謎のファイル。
jarコマンドで生成した際に自動で作成される。

記述内容

「~:~」という形式のエントリを記述する。

「Manifest-Version」エントリ

必須のエントリで、常に1.0を指定する。

「Main-Class」エントリ

そのjarにおけるメインクラスを指定することができ、javaコマンドでの起動時にメインクラスの指定が不要になる。
FQCN(完全限定クラス名)を指定する。

Main-Class: jp.test.Test

クラスパスからファイルを読み込む

クラスパスを基準とした指定でファイルを開く

クラスパスの基準フォルダ内のtestフォルダにある(testパッケージに属する暮らすファイルがおいてあるフォルダ)にfile.datがある場合、以下のように記述する

InputStream is = Main.class.getResourceAsStream("\\test\\file.dat");

まんがで見につく続ける技術

www.asa21.com
おおむね3日坊主なので、なにか変えることができればと思って読んでみた。

結論

行動科学マネジメントを利用することによって、意思の強さなどに左右されず科学的に「目標に向かって行動をし続ける」ことができる。
そのためには
目標を定め
目標を達成するための行動を決定し
行動を実行する(あるいは実行しないようにする)ためにはどうしたらよいか
を考えることで実現する。

続ける技術の概要

英会話を習いたい、ダイエットしたい…など、どうやって目標達成まで挫折することなく続けていくことができるのだろうか?

どうすればよいのか?

行動は3つの要素からできている。
A→先行条件
B→行動
C→結果条件

Bのコントロールしたい行動のことをターゲット行動という。
ターゲット行動は以下の2つに分けられる

過剰行動(やめたい行動のこと)
不足行動(増やしたい行動のこと)

過剰行動、不足行動の先行条件を整えることで、ターゲット行動をコントロールする。 不足行動の場合、阻害するライバル行動の発生を抑えるようにする。
そうすることでターゲット行動を起こしやすく(あるいは起こりにくく)し、目標達成に向けて活動できる。

不足行動をコントロールするには

不足行動をコントロールするためには
1.フロント行動リサーチで先行条件を調査し、どんな時にターゲット行動をとりやすいか考える。
2.フロント行動リサーチでライバル行動がどのように発生するか考える。
3.アフター行動リサーチで結果を調査し、どんなメリットがあるかを考える。
4.リサーチをもとに抑えるべきポイントを確認する
5.ポイントをもとにターゲット行動を増やす環境、ライバル行動を減らす行動を考える。

不足行動のフロント行動リサーチ

発生する頻度、持続時間は?
どのようなときに発生しやすいか?
どのような場所で発生しやすいか?
誰がいるときに発生しやすいか?
発生する前に、あなたが行う行動や出来事は?
発生する前に、あなたの周囲の人が行ったことや行動は?
発生しにくいのはどんなときか?(場所、一緒にいる人、状況など)

ライバル行動のフロント行動リサーチ

不足行動のフロント行動リサーチと項目はほぼ同じ。追加で以下を確認する。
ライバル行動をするために必要なエネルギー

不足行動のアフター行動リサーチ

行動後に生まれるメリットは?
行動後の周囲の人の反応
行動後、あなたは何かをしなくてよくなったり、避けたりできる?
ライバル行動をした後のメリットは?

抑えるべきポイント

ターゲット行動の場合
行動のヘルプを作る 数を増やす助けになる要素
動機づけ条件を作る 行動に対するメリット。ご褒美を設けるなど
行動のハードルを低くする 

ライバル行動の場合
行動のヘルプをとる
動機づけ条件をとる

過剰行動をコントロールするには

過剰行動をコントロールするためには
1.過剰行動のフロント行動リサーチ
2.過剰行動のアフター行動リサーチ
3.リサーチをもとに抑えるべきポイントを確認する。
4.ポイントをもとにターゲット行動を減らす環境を考える。

過剰行動のフロント行動リサーチ

不足行動のフロント行動リサーチと同様に行う

過剰行動のアフター行動リサーチ

不足行動のアフター行動リサーチとほぼ同様だが、ライバル行動のメリットを考える代わりに、チェンジ行動がないかを考える。

さらに続けるコツ

メジャーメント

メジャーメントで行動の増減を計測、測定することで設定した先行条件が正しいかをチェックする。
計測の期間を事前に定めておく。

ラストゴールとスモールゴール

ラストゴールは最終目標、期限と数値を盛り込むようにする。
スモールゴールは中間目標、ハードルはできるだけ低くする。
結果を定めて行動を決め、そのうえで先行条件を整えることが大切。

フィードバックで見える化

目標の進捗状況を視覚的に把握することで行動が促される。

行動契約書を作る

目標を具体的な行動やご褒美、ペナルティを設定。
協力者に定期的にチェックしてもらう

所感

自分の場合、まず行動を起こすための時間を確保すること、マネジメントしてでも達成したい目標を見つけることが先だなぁと感じた。
そこがクリアされたら実践してみたいと思う。

【Java】直列化でクラスの情報をファイルに書き込む

直列化を行うと、現在のクラスの情報をファイルに書き出すことができる。
異常の再現とかに使うのだろうか?

直列化する方法

// 直列化したいクラスでSerializableを実装する
public class Test implements Serializable {

  // シリアルバージョンID
  // クラス設計が変更になった場合に値を変更すること
  // でなければ変更前に直列化していたファイルを復元した際に矛盾が生じた場合、例外検知できなくなる
  private static filal long serialVersionUID = 81923983183821L;

  private String a;
  private String b;
  // TestSubクラスのデータも書込みたければTestSubクラスもSerializableを実装する
  private TestSub t;
  : 
}

// 保存方法
Test test = new Test("あ","べ");
FIleOutputStream fos = new FileOutputStream("C:\\test.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oosWriteObject(test);
oos.flush();
oos.close();

// 復元方法
FileInputStream fis = new FileInputStream("C:\\test.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
Test test2 = (Test) ois.readObject(); 
ois.close();

注意事項

・Serializableを実装していないクラス型のフィールドは直列化されない ・staticがついたフィールドは直列化の対象にならない ・transientキーワードで修飾したフィールドは直列化の対象にならない

PathクラスとFilesクラス

まだFileクラス使ってるんですか?とか後輩に言われないために。

Pathクラス

ファイルやフォルダを指し示すためのクラス

Path p1 = Paths.get("C:\\test.dat");
Path p2 = file.toPath(); //fileはFileクラスのインスタンス

Filesクラス

ファイル、ディレクトリ等のファイルを操作する static メソッドを持つ。
ファイルをコピーしたり削除したりファイルサイズを取得したりできる。

// Fileクラスを使った場合の存在チェック
file.exists();
// Filesクラスを使った場合の存在チェックにはPathクラスのインスタンスが必要
Files.exists(path);

【Java】ファイル読み書き

1回で書ききれなそうなので随時更新していくことにする。

基礎的な概念

ストリームとは

データの入出力が行われる機構のこと。
入出力は小川に例えることができ、文字が流れるなら文字ストリーム。バイト列が流れるならバイトストリームと呼ばれる。

フィルタとは

ストリームの途中に挟み込み、変換処理をする部品。
Filter~クラスを継承している必要がある。主なクラス参照。

バッファリングフィルタ

フィルタの中でもよくつかわれるフィルタ。
通常ストリームは1文字、1バイトずつ流れていくがバッファリングフィルタを使うことで、まとまった量のデータが下流に流れるようになり、パフォーマンスがアップする。

主なクラス

クラス名 内容 備考
FileWriter 文字列書き込み 文字ストリーム
FileReader 文字列読み込み 文字ストリーム
FileOutputStream バイト列書き込み バイトストリーム
FileInputStream バイト列読み込み バイトストリーム
BufferedReader 文字列読み込み用フィルタ
BufferedWriter 文字列書き込み用フィルタ
BufferedInputStream バイト列読み込み用フィルタ
BufferedOutputStream バイト列書き込み用フィルタ
CipherOutputStream 暗号化処理フィルタ FilterOutputStreamを継承

ファイル操作

flushメソッド

バッファにしか書き込まれていない情報を、実際にファイルに書き出す。
これをせずにcloseするとファイルに書き込まれていなかったりする。

closeメソッド

ファイルを閉じる。忘れてはいけない。でも書いてないからといってcloseされていないとは限らないので以下参照 tatsuhi10.hatenablog.com

フィルタ方法

フィルタは既に存在するストリームを接続先としてコンストラクタで指定して生成する。フィルタはいくつ使ってもよい。

// ファイル出力ストリームを生成
FileOutputStream fos = new FileOutputStream("data.txt");
// ファイル出力のストリームを下流にもつ暗号化ストリームを生成
CipherOutputStream cos = new CipherOutputStream(fos, algo);
// フィルタが上流なので、上流側のメソッドを呼び出すことでファイルに書き込まれる
cos.write(65);

あとから追加したフィルタのほうが上流になることに注意。
2つのフィルタを追加した場合も、2つ目に追加したフィルタのほうが上流になる。

ファイルcloseの例外処理(try-with-resources構文)

これを知らずに「closeし忘れてるよ?」とか言ってしまって恥を書く未来が見えたので、絶対に覚える。

Java7以降のファイルclose

try-with-resources構文というらしい

try(FileWriter fw = new FileWriter("test.dat");){
  /* 正常処理*/
} catch(IOException e){
  /* 例外処理 */
}

try直後の()でnewすることで明示的にcloseをしなくてよくなる。
複数のnewを書いてもよいが「;」を忘れずに。
なお、この構文を使えるのはAutoCloseableインタフェース、Closeableインタフェースの実装クラスをnewする場合に限られる。