疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【JavaScript】Dateの日付操作

今回はDateについて。

Javaから始めた身なので、JavaScriptのDateは良いような悪いような・・・というイメージがあります。
どっちつかずなんですが。

Dateの使い方

基本的な使い方から。

ソース

var date = new Date();
console.log(date);

実行結果

Tue Sep 03 2019 19:27:30 GMT+0900 (日本標準時) 

new Date()で現在日時の取得が出来ます。

これだけだと実用性は低いので、ここからフォーマットを指定して日時を表示したり、時間だけを表示したりするわけですね。

このあたりはサクッといっちゃいましょう。

時間や分などを個別で取得

ソース

var date = new Date(); // Tue Sep 03 2019 22:38:15 GMT+0900 (日本標準時) 

date.getFullYear(); // 2019
date.getMonth(); // 8
date.getDate(); // 3
date.getHours(); // 22
date.getMinutes(); // 38
date.getSeconds(); // 15

注意するのは月の取得ぐらいですかね。
月だけは-1された状態で取得するので、今月を表示させたいときは

date.getMonth() + 1; // 9

とする必要があります。

フォーマットを指定して日時を表示する

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  format = "YYYY/MM/DD hh:mm:dd";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  format = format.replace(/hh/g, date.getHours());
  format = format.replace(/mm/g, date.getMinutes());
  format = format.replace(/dd/g, date.getSeconds());
  return format;
}

実行結果

2019/9/3 22:29:54 

こんな感じになってしまうんですかね。
formatに対して値を置換していくイメージですね。
JavaであればSimpleDateFormatで1発!って感じなのですが。


正直、この程度のフォーマットなら

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
}

実行結果

2019/9/3 

みたいな感じでもアリかな〜と思っちゃいますよね。
もちろんフォーマット使っている方が可読性もありますしそれっぽくて見栄えは良いですけどね。

日付の加算・減算

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Wed Sep 04 2019 23:25:41 GMT+0900 (日本標準時) 

加算したいセッターに、加算する値を取得するゲッター+加算する数値でOKです。

減算は+をーに変えればOKです。

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() - 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Mon Sep 02 2019 23:25:41 GMT+0900 (日本標準時) 


そして、月末の日付に対し1日加算した場合どうなるか?なのですが。

ソース

var date = new Date();
date.setDate(0);
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Sat Aug 31 2019 23:34:22 GMT+0900 (日本標準時) 
Sun Sep 01 2019 23:34:22 GMT+0900 (日本標準時) 

ちゃんと自動で判断して計算してくれますので使い勝手は良いです。

よく使う日付操作

ソース

var date = new Date();
console.log("本日 : " + dateFormat(date));

var yesterday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);
console.log("昨日 : " + dateFormat(yesterday));

var weekAgo = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 7);
console.log("1週間前 : " + dateFormat(weekAgo));

var monthStart = new Date(date.getFullYear(), date.getMonth(), 1);
console.log("月初 : " + dateFormat(monthStart));

var monthEnd = new Date(date.getFullYear(), date.getMonth() + 1, 0);
console.log("月末 : " + dateFormat(monthEnd));

var dayOfMonthAgo = new Date(date.getFullYear(), date.getMonth(), 0);
var monthAgo = new Date(date.getFullYear(), date.getMonth(), date.getDate() - dayOfMonthAgo.getDate());
console.log("先月 : " + dateFormat(monthAgo));

function dateFormat(date) {
  var format = "YYYY/MM/DD";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  return format;
}

実行結果

本日 : 2019/9/4 
昨日 : 2019/9/3 
1週間前 : 2019/8/28 
月初 : 2019/9/1 
月末 : 2019/9/30 
先月 : 2019/8/4 

先月については「先月の同じ日」という意味で先月としています。
なので、現在の日にちから先月末の日にちを引くことで実現しています。

単純にsetMonth()で月を1引いてしまうと、今月と先月で末日の日にちに差異がある場合はズレる可能性があります。

【HTML】【JavaScript】基本的なインプット系とたまに使うなんやかんや

最近、仕事柄フロントエンドの開発をする機会が増えました。
ようやくある程度は頭に入ってきたので、逐一調べなくても基本的なものは書けるように。
復習と備忘録としてブログにアウトプットしておきます。

テキストフィールド

・基本的なやつ
何でも入力可能。

<input type="text" />


・数字のみ
半角数字と+、-のみしか入力出来ない。
入力欄の右側にスピンボタン(矢印)が表示され、入力欄内の数値を増減出来る。

<input type="number" />


・何でも入力出来るが初期入力時は半角入力になる
telなので電話番号専用かと思っていましたが何でも入力可能です。
入力欄がアクティブになった時点で半角入力になるので、最初から半角入力させたい時はこれ便利。

<input type="tel" />


・値の取得
「値を表示」ボタン押下で入力欄の値を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.valueを付けてあげると中身の値を取得出来ます。

function alertValue() {
	 textFieldValue = document.getElementById("textField").value;
	 alert(textFieldValue);
}
<input type="text" id="textField" />
<input type="button" value="値を表示" onClick="alertValue();" />

 


・初期入力が半角かつ、入力を半角数字のみに制限
JavaScriptで半角数字のみの入力制限を設けます。
半角数字の判定は正規表現で行い、半角数字以外は空白に置換するようにしています。

function checkInput($this) {
	 var replaceValue = $this.value.replace(/[^\d]/,'');
	 if($this.value != replaceValue) {
	 	$this.value = replaceValue;
	 }
}
<input type="tel" onInput="checkInput(this)" />

JavaScriptのif文不要かな?思いつつ、とりあえず書いちゃいました。
やっていることは、置換前と置換後の文字列が違う場合は書き換えるように制御しているだけです。
置換後が同じ場合でも書き換えるように判定なしで直接代入すれば1行で済みますね。
お好みで。

ラジオボタン

・基本的なやつ

<input type="radio" />


・複数
グループ化はnameを統一すればOKです。
各ラジオボタンの識別にはidを使用します。

<input type="radio" id="radio1" name="radioGroup" />
<input type="radio" id="radio2" name="radioGroup" />
<input type="radio" id="radio3" name="radioGroup" />

  


・チェック状態の取得
「チェック状態を表示」ボタン押下でラジオボタンのチェック状態を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.checkedを付けるとチェック状態を取得出来ます。

function alertRadioChecked() {
	checked = document.getElementById("radio1").checked;
	alert(checked);
}
<input type="radio" id="radio1" />
<input type="button" value="チェック状態を表示" onClick="alertRadioChecked()" />

 


・グループでチェックされているものを取得
グループ化されているものを取得するには、document.getElementsByName()を使用します。
何気にElementsなのが注意。

function alertRadiosChecked() {
	radios = document.getElementsByName("radioGroup2");
	for(i = 0; i < radios.length; i++) {
		if(radios[i].checked) {
			alert(radios[i].id + " checked");
			return;
		}
	}
	alert("no checked");
}
<input type="radio" id="radio4" name="radioGroup2" />
<input type="radio" id="radio5" name="radioGroup2" />
<input type="radio" id="radio6" name="radioGroup2" />
<input type="button" value="チェック状態を表示" onClick="alertRadiosChecked()" />

   


・コントロールキー+クリックでオフにする
ちなみにオフの状態でコントロール+クリックをしてもオフのままです。

function offRadio() {
	var ctrlPress = window.event.ctrlKey;
	if(ctrlPress) {
		document.getElementById("ctrlOffRadio").checked = false;
	}
}
<input type="radio" id="ctrlOffRadio" onClick="offRadio()" />


・クリックでチェック状態を反転させる
1つ上と似ていますがオフではなく反転させるパターン。
動きとしてはチェックボックスと同じ様な感じになります。

var radioValue;

function changeRadio($this) {
	if(radioValue) {
		$this.checked = false;
		radioValue = false;
	} else {
		radioValue = true;
	}
}
<input type="radio" onClick="changeRadio(this)" />



チェックボックス

・基本的なやつ

<input type="checkbox" />


・複数
ラジオボタンと同じでnameは統一、idは個別。

<input type="checkbox" id="checkbox1" name="checkboxGroup" />
<input type="checkbox" id="checkbox2" name="checkboxGroup" />
<input type="checkbox" id="checkbox3" name="checkboxGroup" />

  


・チェック状態を取得
「チェック状態を表示」ボタン押下でチェックボックスのチェック状態を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.checkedを付けるとチェック状態を取得出来ます。

function alertCheckboxChecked() {
	checked = document.getElementById("checkBox").checked;
	alert(checked);
}
<input type="checkbox" id="checkBox" />
<input type="button" value="チェック状態を表示" onClick="alertCheckboxChecked()" />

 


・グループでチェックされているものを取得
チェックされていない場合のロジックとか書いて長いファンクションになりましたが、ラジオボタンと同じでdocument.getElementsByName()でグループを取得。
そしてfor文で回してチェック状態を判定します。

function alertCheckboxesChecked() {
	checkboxes = document.getElementsByName("checkboxGroup2");
	checkedId = "";
	for(i = 0; i < checkboxes.length; i++) {
		if(checkboxes[i].checked) {
			if(checkedId != "") {
				checkedId = checkedId + ", ";
			}
			checkedId = checkedId + checkboxes[i].id;
		}
	}
	if(checkedId != "") {
		alert(checkedId + " checked");
	} else {
		alert("no checked");
	}
}
<input type="checkbox" id="checkbox4" name="checkboxGroup2" />
<input type="checkbox" id="checkbox5" name="checkboxGroup2" />
<input type="checkbox" id="checkbox6" name="checkboxGroup2" />
<input type="button" value="チェック状態を表示" onClick="alertCheckboxesChecked()" />

   


随時更新します。

【Java】定数の定義と使用

今回は定数について。

どこかのプロジェクトに参画したら、必ずと言って良いほど目にする定数。
でも、私が参画したプロジェクトには未だ定数を定義しているものがありませんでした。
定数を使わずベタ書きで一旦はリリースを終え、機能追加を行う頃にはもはや全て定数に直すのは遠慮させて頂きたいレベル。

こういうのは気づいた時に直さないと、後々手がつけられなくなってしまいます。
直している暇があれば良いですが。
定数に直すだけでなくテストも必要になりますからね。意外と大変です。

定数とは

まず定数とは、一度代入したら後から変更出来ない値のことです。

対して、後から変更出来る値は変数と言います。
基本的にソースでどんどん宣言していくのは変数です。

ログに出す文字列はソースにベタ書きでも良いかもしれませんが、文字列の比較などに使用する際は定数で定義しておくのが良いと思います。
ベタ書きではスペルミスでバグを生む可能性もありますし、複数のファイルで同じ文字列を修正する場合はGrepして置換する面倒な作業が増えます。

定数は下記の様に記述します。

static final String STR_A = "A";

一般的なルールとしては、
・static finalで宣言する
・命名はは大文字と、区切りはアンダーバー
ぐらいでしょうか。

ちなみに、宣言時はアクセス修飾子(publicやprivate)を基本的に付けます。
その辺りは使用する状況に応じて。

あと、何気に忘れてしまいがちなのが各修飾子の順番。
アクセス修飾子も付けるなら

public static final String STR_A = "A";

となります。

アクセス修飾子 static修飾子 final修飾子」の順です。

クラス内で定数を宣言する方法

比較的使用する敷居は低いかと思います。

クラス内で定数を宣言し、そのクラスでのみ使用します。

Main.java

public class Main {

	private static final String STR_A = "A";
	private static final String SPACE = " ";

	public static void main(String[] args) {
		System.out.println(STR_A + SPACE + STR_A);
	}
}

実行結果

A A

メリットは他のクラスに影響を及ぼさないこと・・・ぐらいでしょうか。
逆に言えば、他のクラスで同じ定数を使いたくても使えないので、同じ定数を色んなクラスで使いまわしたい時はこの方法は避けた方が良いと思います。

既存のソースは定数を使っておらず、新規に改修する部分だけでも定数にしたい!という時はこの方法も選択肢の1つって感じですね。
ただ、それでも恒久対策とは言い難い気はします。
せっかく定数を使用するなら、定数クラスを使用する方が便利です。
コストと相談ですね。

定数クラスを用意する方法

多分一般的。
基本的にどのプロジェクトも定数クラスはあるはず。
ただ単にConstant.javaとかいう名前だったり、もう少し細かく◯◯Constant.javaだったり。
後者の方が、1つのファイルが肥大化しないので良いと思います。
逆に前者の様な名前だと、何でもかんでもそのファイルに定数を定義してしまい、何の定数が定義されているのか分かりづらいですし見るのも大変です。

使用例はこんな感じです。

FruitsConstant.java

public class FruitsConstant {

	public static final String APPLE = "リンゴ";
	public static final String ORANGE = "オレンジ";
}

Main.java

public class Main {
	public static void main(String[] args) {
		System.out.println(FruitsConstant.APPLE + "と" + FruitsConstant.ORANGE + "を買います。");
	}
}

実行結果

リンゴとオレンジを買います。

定数クラスに定義している定数を変更すれば、すべての呼び出し元に影響があります。
これはメリットでもあり、場合によってはデメリットと言うか、気をつけなければならない部分ですね。
こっちのクラスでは変更したかったけど、違うクラスではそのままの定数を使いたかった!みたいなことは避けたいです。

Enumを使用する方法

以前書いたこちらの記事にまとめてあります。

www.chibicat.net

ざっくり説明すると、Enumは複数の定数をまとめておくことが出来る列挙型と言うものです。
定数クラスの代わりにEnumを使用するイメージですね。

紐付けておきたい定数同士がある場合に使用するのが良いかと思います。
DBに格納されている複合キーの値とか。


今回は以上になります。

【Java】いつも悩む正規表現

今回は正規表現についての記事になります。

たまに使う機会があるのですが、毎回1時間ほど試行錯誤してしまうのでメモ的な意味も含めて。
ちゃんと理解しないと意外と扱いが難しいと感じます。

正規表現とは

説明しなくてもご存知だとは思いますが。

正規表現とは文字列のパターンを表現したものです。

何となく意味は伝わりますかね。
言葉よりも実物をお見せした方が早いかもしれません。

例えば、0〜9の数字1文字のパターンを正規表現で表すと[0-9]となります。

上記の正規表現では、例えばJavaで言う所の

String s1 = "1"
String s2 = "123"

など文字列の中に含まれている数字1文字ごとにマッチします。
文字列の中の数字は何がありますか?との問いに対する答えみたいな感じですね。
s1は1だけ、s2は1と2と3があります。それぞれ[0-9]の正規表現にマッチします。

Javaの場合は正規表現を扱う場面がいくつかあります。
単純に文字列の中にマッチする文字が含まれているか、もしくは文字列全体がマッチするか。
そして、正規表現に一致する文字列だけを置換したい場合など様々。

まずは用途別に見ていきましょう。

正規表現と一致する文字列が含まれているか

PatternとMatcherを用いて判定します。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s1 = "1";
		String s2 = "ABC9";
		String s3 = "ABCDE";

		Pattern pattern = Pattern.compile("[0-9]");

		Matcher matcher1 = pattern.matcher(s1);
		Matcher matcher2 = pattern.matcher(s2);
		Matcher matcher3 = pattern.matcher(s3);

		System.out.println(matcher1.find()); // true
		System.out.println(matcher2.find()); // true
		System.out.println(matcher3.find()); // false
	}
}

Patternクラスで正規表現を定義します。
次に、正規表現を定義したPatternクラスのmathcerメソッドの引数に判定を行う文字列を渡しMatcherを生成します。
生成したMatcherのfind()メソッドでは、文字列が正規表現を含んでいればtrueを返します。

文字列が正規表現とすべて一致するか

こちらもPatternとMatcherを用います。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s1 = "1";
		String s2 = "ABC9";
		String s3 = "ABCDE";
		String s4 = "123";

		Pattern pattern = Pattern.compile("[0-9]");

		Matcher matcher1 = pattern.matcher(s1);
		Matcher matcher2 = pattern.matcher(s2);
		Matcher matcher3 = pattern.matcher(s3);
		Matcher matcher4 = pattern.matcher(s4);

		System.out.println(matcher1.matches()); // true
		System.out.println(matcher2.matches()); // false
		System.out.println(matcher3.matches()); // false
		System.out.println(matcher4.matches()); // false
	}
}

Matcherクラスのmatchesメソッドで判定します。
[0-9]は0~9までの数字1文字に合致する正規表現なので、123は合致しません。
123に合致させたい場合は、例えば

Pattern pattern = Pattern.compile("[0-9]*");

としてあげると合致します。
ただし012などの0から始まる数字のみの文字列も合致してしまうので使用用途には注意。
この辺はいつも悩んじゃいます。

そして、PatternとMatcherを使わない方法も存在します。
こっちの方が簡単ですね。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123";		
		System.out.println(s.matches("[0-9]*")); // true
	}
}

これだけです。

どっちが良いかはお好みですかね。
あとは、業務の場合はコーディング規約とか他のソースでどうやっているかで使い分けると良いと思います。

正規表現に一致した部分を取り出す

文字列の中で正規表現と一致するものを取り出す方法です。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s = "123";

		Pattern pattern = Pattern.compile("[0-9]");
		Matcher matcher = pattern.matcher(s);

		while (matcher.find()) {
			System.out.println(matcher.group());
		}
	}
}

実行結果

1
2
3

findメソッドで一致する部分だけループさせ、groupメソッドで取り出します。

正規表現と一致する箇所を置換する

一致した箇所だけを他の文字に置換させます。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123ABC";
		System.out.println(s.replaceAll("[0-9]", "★"));
	}
}

実行結果

★★★ABC

StringのreplaceAllメソッドを使用します。
第1引数に正規表現、第2引数に置換後の文字を指定します。


ちなみにreplaceFirstメソッドで同じことをすると。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "ABC123";
		System.out.println(s.replaceFirst("[0-9]", "★"));
	}
}

実行結果

ABC★23

正規表現と一番最初に一致した箇所が置換されます。

replaceAllやreplaceFirstは、Matcherのfindメソッドと同等の条件となります。
そのため1文字ごとに正規表現と一致するか判定し、一致している場合は置換する動きをします。
もし、123を★に置換したいのであれば

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123ABC";
		System.out.println(s.replaceAll("[0-9]+", "★"));
	}
}

実行結果

★ABC

こんな感じの正規表現になります。
+は1回以上の繰り返し、*は0回以上の繰り返しを意味しています。
[0-9]*でも良いのでは?と思っていたのですが、試してみるとAとBの間などにも★が入っちゃいました。
0回以上なので、文字の間も合致しちゃうんですかね。

個人的正規表現まとめ

今まで苦労した正規表現をいくつかまとめておきます。

1から100までの数値
[1-9]|[1-9][0-9]|100

1から350まで
[1-9]|[1-9][0-9]|[1-2][0-9]{2}|3[0-4][0-9]|350

1から1000までの数値
[1-9]|[1-9][0-9]|[1-9][0-9]{2}|1000

数値の場合、型が変わるところで区切って考えるとわかりやすいと思います。
|(バーティカルバー)で区切ることで、「または」の条件として正規表現を記述出来ます。

ABC.EDFのドットから前の文字列
[A-Z]+\.

これでABC.にマッチします。
.や*など一部の特殊文字を正規表現として扱う場合はエスケープする必要があります。


ちなみに、正規表現を試すとき、1回1回書いてビルドして実行・・・とやっていると時間がかかってしまいます。
そんな時は、Web上で正規表現が完全一致、もしくは部分一致するかを試すことが出来るサイトがあります。

Regex Test Drive | 正規表現オンラインテストサイト

ここで試行錯誤してみるのも良いかもしれません。

エンジニアとして新しい道に挑戦

すっかり梅雨ですね。
でも今年は例年に比べ、降水量は少なめでしょうか。
ずーっと降っている感じではないです。

この度、というか最近。
エンジニアとして次のステップへ挑戦しています。

サーバサイドからフロントエンドへ

私は今までサーバサイドの開発を行なっていました。

サーバサイドとは、DBへの読み書きやファイルの入出力などの処理を担うものです。
画面のボタンをクリックしたりすることで走る処理ですね。
言語で言うとJavaを触っていました。

それに対しフロントエンドとは、画面側の開発を行うことです。
HTMLやCSS、JavaScriptなどを扱います。
実際に目で見える部分であり、私はフロントエンドの方がやっていてやりがいを感じます。


私はITの世界に入ってすぐ、Javaを使ってサーバサイド開発を行いました。
1年半くらいですかね。
画面を触ることはなく、ひたすら中の処理を書いていました。
実際には設計の時間も結構多く、どちらかと言えばプログラムを触っている時間の方が短かったかも。

そして最近、ついに待望のフロント側を経験させてもらえることに。
やったね!!

フロントってどうなの?楽しい?

私は好きです。フロント。

なんでしょう。
今までサーバサイドばかりだったので新鮮に感じるからなのかもしれません。

ただ、個人的にHTMLやCSS、JavaScriptの知識を蓄えられるのはすごく嬉しいです。
Webアプリケーションを作ったり、ブログのデザインをカスタマイズしたりといろいろ役立ちそう。
副業とかするにしてもフロントエンドの経験は活きてきそう。

HTMLは個人的に馴染みがあるので、色んなページのHTMLを見ながら書き進められました。

でもJavaScript。
お前は聞いてないぞ!

実務経験はないですが、研修でJavaScriptは一通り学習しました。
でも苦手だったなー。
そのままのイメージを持ち続けているので、やっぱり苦手意識のままです。

これからJavaScriptの記事も少しずつ書いていこうかな。
何やらやることが多くて手詰まり感はありますけど。
Xcodeでアプリ作成やJava Goldの勉強。
どれをいつやろうかって感じですね。

話が脱線しましたが、楽しいけど難しいっていう先入観はありますね。
結局は何事も慣れが必要なのでひたすら経験を積むしかないですが。

フロント側は値の受け渡しとか頻繁にあって大変だと感じます。
HTMLからJavaScriptへ渡したり、JavaからHTMLへ渡したり。
どこがどの値を紐付いてて・・・というのを考えるとちょっと頭が痛くなります。

今後はどうなりたいか

エンジニアとしては、画面を作るフロントエンドと内部の処理を作るサーバサイド。
そしてサーバの構築を行なったりするインフラもあります。

私の目標は、全て1人で出来る様になること。

そんなに簡単な話ではないと思いますが、そうなりたいと思っています。
単純に色んな世界を知りたいのもありますし、1人でWebアプリケーションやスマホ向けアプリ開発をやりたいからです。

ただ、まずはフロント+サーバの処理を書ければ良いかな。
細かいことは抜きにして、画面と画面の項目に紐付く内部処理を書く。
それが出来れば半人前くらいにはなれそう。


私はここ数年で仕事とか技術に対する考え方が結構変わりました。
以前は仕事なんてお金をもらうためにやっているので、そこそこ頑張っていれば良いと思っていました。
もちろん自主的に勉強なんてせず、すべて業務時間の中で調べたりしていました。

でも今は将来の自分のために必死で業務に取り組んでいます。
今経験を積んでいることは、必ず自分の力になり活かせる時が来るからです。

だから家で業務でつまづいたことを予習したり復習するのは厭わないです。
むしろ詰まって良かった!くらいの気持ち。
わからないことを1つずつ覚えていけるのは非常にありがたいことです。

これからも目標に向かって頑張ろうと思います。