メモと備忘録

メモや備忘録を残します

【Java】HTTPリクエストを想定したJSONの更新【改行、ネストに対応】

・概要
ネストされていたり、パラメータ毎に改行されていたり、パラメータ値にリストが使われていたりするJSONのパラメータ値を更新する事が可能です。

・利用想定
HTTP通信時

・内容
JSONparser クラス

public class JSONparser {

	/*
	 * JSONの更新処理
	 * JSON		JSONデータ
	 * param	更新対象のパラメータ名
	 * value	更新後のパラメータ値
	 * return	更新後のJSONデータ
	 * error	nullを返す
	 */
	public String updateJSON(String JSON, String param, String value){
		String resultStr = null;
		int[] index = JSONIndexOf(JSON, param);
		if(index[0] != -1 && index[1] != -1){
			StringBuilder sb = new StringBuilder(JSON);
			sb.replace(index[0], index[1], value);
			resultStr = sb.toString();
		}
		return resultStr;
	}

	/*
	 * JSONのパラメータ値取得処理
	 * JSON		JSONデータ
	 * param	取得対象のパラメータ名
	 * return	文字列
	 * error	nullを返す
	 */
	public String getJSON(String JSON, String param){
		String resultStr = null;
		int[] index = JSONIndexOf(JSON, param);
		if(index[0] != -1 && index[1] != -1){
			resultStr = JSON.substring(index[0], index[1]);
		}
		return resultStr;
	}

	/*
	 * JSONのパラメータ検索処理
	 * return	int[パラメータ値の開始位置, パラメータ値の終了位置]
	 * error	-1を返す
	 */
	public int[] JSONIndexOf(String JSON, String param){
		int[] resultInt = {-1, -1};

		StringBuilder sb = new StringBuilder();
		sb.append(JSON);

		String searchParam = "\"" + param + "\"";
		int paramIndex = JSON.indexOf(searchParam) + searchParam.length();

		int nextQuotationIndex = JSON.indexOf("\"", paramIndex);
		int nextCommmaIndex = JSON.indexOf(",", paramIndex);
		int nextBraceIndex = JSON.indexOf("}", paramIndex);

		// パラメータ値は文字列か
		boolean isString = nextQuotationIndex < nextCommmaIndex && nextCommmaIndex != -1;
		isString = (isString == true) && (nextQuotationIndex < nextBraceIndex && nextBraceIndex != -1);
		isString = isString == true && nextQuotationIndex != -1;

		if (isString) {
			//	文字列のパラメータ値を取得
			++nextQuotationIndex;
			int endQuotationIndex = JSON.indexOf("\"", nextQuotationIndex);
			int escapeIndex = JSON.indexOf("\\\"", nextQuotationIndex);

			while (endQuotationIndex > escapeIndex && escapeIndex != -1) {
				endQuotationIndex = JSON.indexOf("\"", escapeIndex + 2);
				escapeIndex = JSON.indexOf("\\\"", escapeIndex + 2);

			}
			resultInt[0] = nextQuotationIndex;
			resultInt[1] = endQuotationIndex;

		} else {
			int colonIndex = JSON.indexOf(":", paramIndex) + 1;
			String targetValue = "";
			boolean hasNextParam = nextCommmaIndex < nextBraceIndex && nextCommmaIndex != -1;

			// パラメータ値が数値で、次のパラメータが存在する
			if (hasNextParam) {
				targetValue = JSON.substring(colonIndex, nextCommmaIndex);

			}
			// パラメータ値が数値で、次のパラメータが存在しない
			else {
				targetValue = JSON.substring(colonIndex, nextBraceIndex);

			}

			//	パラメータ値のIndexを取得
			String replaced = targetValue.replaceAll("[ || ||\t||\r\n]", "");
			int beginIndex = JSON.indexOf(replaced, colonIndex);
			int endIndex = beginIndex + replaced.length();
			resultInt[0] = beginIndex;
			resultInt[1] = endIndex;

		}
		return resultInt;
	}
}

・使用例
次のようなJSONデータの場合

{
	"Array":[001,002,003],
	"Nest":{
		"name":"john"
		,"gender":"man"
		,"ID":123
	}
}
// JSON		:JSONデータ
// param	:パラメータ名
// value	:パラメータ値
JSONparser jsonParser = new JSONparser();

String param = "ID";
String param = "XXX";
jsonParser.getJSON(JSON, param));
jsonParser.updateJSON(JSON, param, value);

「ID」を取得します。

jsonParser.getJSON(JSON, param));
//  123

「ID」の値を「XXX」へ更新し、JSONを返却します。

jsonParser.updateJSON(JSON, param, value);
//{
//	"Array":[001,002,003],
//	"Nest":{
//		"name":"john"
//		,"gender":"man"
//		,"ID":XXX
//	}
//}

正規表現でサクラエディタの置換をより便利に

概要

サクラエディタの置換機能で、正規表現を使った置換方法を紹介します。

 

手順

1.『Ctrl+R』で置換ウィンドウを開きます。

2.『正規表現』にチェックを入れます。

 

f:id:usagigozen:20200224033919p:plain

置換ウィンドウを開く

これで置換前と置換後に正規表現が使用できます。

 

実用例

1.行の先頭に文字を追加したい場合

置換前:^

置換後:ID=

結果:001 ⇒ ID=001

 

2.行の末尾に文字を追加したい場合

置換前:$

置換後:円

結果:100 ⇒ 100円

 

3.特定の文字列に挟まれた箇所を置換する場合

置換前:(文章を).*(繋げる)

置換後:$1置換して$2

結果:

文章をサンプルと繋げる
文章を省略して繋げる

↓ 

文章を置換して繋げる
文章を置換して繋げる

 

4.数字の羅列を郵便標記に置換する場合

置換前:([0-9]{3})([0-9]{4})

置換後:$1-$2

結果:

0001234
1115678

000-1234
111-5678

ExcelでA1セルをフォーカスするアドインの作り方

概要

エクセルファイルを更新した場合、次に使う人の事を考えて
「スクロールをトップに合わせる」
「A1セルを選択状態にする」
っていうのが現場プログラマの慣習なんですが、
毎回これをやるのって面倒なんですよね・・・

今回紹介するのは、上記を解決してくれるアドインの作り方です!

手順

1.「ファイル」タブにある「オプション」を開きます。
2.「リボンのユーザ設定」を開きます。
3.「リボンのユーザ設定」の「メインタブ」を選択した状態で「開発」のチェックボックスをONにします。
4.「開発タブ」が表示されるようになったので、そこから「マクロ」を選択します。
5.「Visual Basic」の開発用ウィンドウが開かれるので、下記のソースコードをぺたっと貼り付けます。

Sub ブックを片付ける()
    ' 最後のシートまで移動
    Do While Not ActiveSheet.Next Is Nothing
        ActiveSheet.Next.Activate
    Loop
    
    ' 最初のシートまでA1セルを選択していく
    Do While Not ActiveSheet.Previous Is Nothing
        Range("A1").Select
        ActiveSheet.Previous.Activate
    Loop
    
    ' 最初のシート処理
    Range("A1").Select
    
End Sub

6.「Ctrl + S」を押すと「名前を付けて保存」ダイアログボックスが表示されます。
7.「ファイルの種類」で「Excelアドイン(*.xlam)」を選択します。
  ファイル名はマクロと同じく「ブックを片付ける」にしておくと分かりやすいです。
8.「開発」タブの[アドイン]をクリックします。
9.さきほどの「ブックを片付ける」にチェックを入れて「OK」をクリックします。
10.「ファイル」タブにある「オプション」を開きます。
11.「クイックアクセスツールバー」を開きます。
12.「コマンドの選択」から「マクロ」を選択
   「ブックを片付ける」を選択し「追加」したら「OK」をクリックします。
13.クイックアクセスツールバーに「ブックを片付ける」ボタンが追加され、いつでも使える状態に!


こんな感じで、作業を効率化できるアドオンをどんどん作りましょう!

図解! Excel VBAのツボとコツがゼッタイにわかる本 “超”入門編 [ 立山秀利 ]

価格:1,760円
(2020/2/21 02:25時点)

パスワードは暗号化ではなくハッシュ化!!

とある開発現場で、パスワードが暗号化されてDBに保持されていた事を思い出しました。

パスワードは暗号化ではダメだったはず・・・
という事で調べてみました。

暗号化とは

データを暗号化のアルゴリズムRSA・DES・AES等)に従って、一見解読不能な内容を求めます。
このデータは用意しておいた暗号鍵を用いて、復号する事が出来ます。

ハッシュ化とは

データをハッシュアルゴリズムmd5sha1・sha-256等)に従って、ハッシュ値と呼ばれる規則性のない固定長の値を求めます。
このデータは不可逆変換なので、元のデータへ戻すことは現実的ではありません。

結論

もしも暗号化したパスワードを悪意のある第三者に抜き取られた場合、復号されてしまうかもしれません。
そうでなくとも、パスワードは復元する必要がないものなので、余計なリスクは抱えない方が良いでしょう。
ログイン認証等も、ユーザの入力値をハッシュ化したものと照合すれば可能です。

もちろん、平文で保持なんて事は論外です!

Oracleで使用できる最大年月日

ラクルDBのDATE型で、最大年月日を使用する場面があったので調べてみました。

試した日付は下記の3通りです。

100001231   --10000年12月31日
99991231   --9999年12月31日
99991232   --9999年12月32日

結果、99991231以外はエラーでした。

という事で、最大年月日を記述する必要がある場合は
99991231を使うと良いかと思います。

Windows7を無償でアップグレード

2020年1月14日、ついにWindows7のサポートが終了してしまいましたね。

 今回は、そんなWindows7を無償でWindows10にアップグレードする方法を紹介したいと思います。

※本作業前に、大切なデータのバックアップを取っておくことをお勧めします

 

 1.Microsoftのページからインストールツールをダウンロードします。

下記の『ツールを今すぐダウンロード』をクリックして下さい。

ツールを今すぐダウンロードをクリック

ツールを今すぐダウンロードをクリック

2.保存したMediaCreationTool.exeを起動する

「次へ」「同意する」を選択し、進めて下さい。

 

 3.PCの再起動をする

何度か再起動が繰り返された後、Windows10へのアップグレードが完了です。

ゼロパディング(ゼロ詰め)

コード値や商品番号なんかに使われたりする、
ゼロパディングの方法をご紹介しようかと思います。

ゼロパディングとは?

指定された桁数に満たない場合、0で埋めてしまう事です。
パディングには『詰める』という意味があります。
なので、ゼロパディング(zero padding)ですね。

方法

言語はJavaです。
下記では、6桁のゼロパディングを行っています。

String.format("%06d", 1);
String.format("%06d", 123456);
String.format("%06d", null);

結果

000001
123456
  null

nullの前はスペースでパディングされるようですね。

実装について

WEBアプリケーション等でゼロパディングした値を
DBの操作(登録・変更・削除)に使用する場合、
セキュリティ的な観点では
クライアントサイド(JavaScript等)ではなくサーバサイドで処理を行うのが良いかと思います。

桁数に満たない値が、リクエストされる恐れがありますので...


以上です。