Java 7から導入されたjava.util.Objects#equalsを使うと2つのオブジェクトが等しいか簡単に評価できるようになりました。しかし、特定のプロパティを除き2つのオブジェクトが等しいか評価する用途には使えなかったので書いてみました。

引数obj1と引数obj2のどちらもnullの場合は同じ、どちらか片方だけがnullのときは同じではないと評価します。それ以外の場合はプロパティごとにjava.util.Objects#equalsを使って評価します。

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Objects;

public class BeanCompare {

	/**
	 * 	2つのBeanに含まれるプロパティを比較し同一か判定する。
	 * 	比較の際、excludeProperiesで指定されたプロパティ名は対象から除外する
	 *	
	 *	@param <T> Beanの型
	 *	@param obj1	比較する1つめのBean
	 *	@param obj2	比較する2つめのBean
	 *	@param excludeProperies	比較から除外するプロパティ名
	 *	@return	trueのとき一致
	 *	@see java.util.Objects#equals(Object, Object)
	 *
	 */
	public static <T extends Serializable> boolean equals(T obj1, T obj2, Collection<String>excludeProperies) {
		
		if (obj1 == null && obj2 == null) {
			return true;
		}
		if (obj1 == null || obj2 == null) {
			return false;
		}
		
		try {
			
			BeanInfo bi = Introspector.getBeanInfo(obj1.getClass());
			PropertyDescriptor[] pds = bi.getPropertyDescriptors();
			
			for (PropertyDescriptor pd:pds) {
				
				if (excludeProperies.contains(pd.getName())) {
					continue;
				}
				
				Method getter = pd.getReadMethod();
				Object val1 = getter.invoke(obj1);
				Object val2 = getter.invoke(obj2);
				
				if (!Objects.equals(val1, val2)) {
					return false;
				}
			}
			
			return true;
			
		} catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			throw new RuntimeException(e);
		}
	}
}

JavaのJAX-RSと.NETのAutoRest/Microsoft.REST.ClientRuntimeを使ってRESTを使った連携プログラムを書いているときに、日付データ(JSONのtype=”string” format=”date-time”やformat=”date”なデータ)のシリアライズ/デシリアライズが初期状態では意図したとおりに動かないことがあったので、カスタマイズしたデシリアライザを書いた時のメモです。

Read More

.NET環境からのメール送信について、検証用にいくつかの方法を試したときのメモです。

  • Windowsの規定のアプリで設定されているメーラーを起動

送信先のメールアドレス、件名、本文が設定された状態でWindowsの規定のアプリで設定されているメーラーが起動します。
この方法ではメールの送信を行うことはできませんが、たった1行で編集画面に最低限の初期値を流し込むことができるので便利です。

CCやBCCも「&cc=《CC先メールアドレス》」「&bcc=《BCC先メールアドレス》」とパラメータをつなげることで設定可能です。

System.Diagnostics.Process.Start("mailto:" & 《送信先メールアドレス》 & "?subject=" & Uri.EscapeDataString(《件名》) & "&body=" & Uri.EscapeDataString(《本文》))
  • Outlookを使用してメール送信

WindowsにインストールされているOutlookを使いメールを送信します。
送信に使用するメールサーバなどの設定はOutlookで設定されているものを使用し、送信したメールはOutlookの『送信済みアイテム』に残るので便利です。

Dim app As Object
Dim item As Object

app = CreateObject("Outlook.Application")

item = app.CreateItem(0)    ' 0 = OlItemType.olMailItem
item.To = "《送信先メールアドレス》"
item.Subject = "《件名》"
item.Body = "《本文》"

item.Send()

app.Quit()

  • MailKitを使用してメール送信

MailKit( https://github.com/jstedfast/MailKit )を使いメールを送信します。
MailKitはNuGet経由などであらかじめインストールされている必要があります。
この方法は、依存するライブラリやソフトが非常に少なく.NET Coreでも使用可能です。また、送信に関する多くの項目を自分で設定できるので便利です。

Dim mimeMessage As New MimeKit.MimeMessage

mimeMessage.From.Add(New MimeKit.MailboxAddress("《送信元氏名》", "《送信元メールアドレス》"))
mimeMessage.To.Add(New MimeKit.MailboxAddress("《送信先氏名》", "《送信先メールアドレス》"))
mimeMessage.Subject = "《件名》"
mimeMessage.Body = New MimeKit.TextPart(MimeKit.Text.TextFormat.Plain) With {.Text = "《本文》"}

Using client As New MailKit.Net.Smtp.SmtpClient()
    client.Connect("《SMTPホスト》", 《SMTPポート番号》, MailKit.Security.SecureSocketOptions.Auto)
    client.Authenticate("《SMTPユーザ名》", "《パスワード》")
    client.Send(mimeMessage)
    client.Disconnect(True)
End Using

Androitタブレットの設定を行っているとき、Googleアカウントへのログインでつまづきました。

20200419_020545605_iOS
「時間内にセキュリティキーが見つかりませんでした。もう一度お試しください。」と表示され、そこから先に進めなくなってしまったのです。

これはまずいと試行錯誤し解決したときのメモです。

Read More

icon

宮城県仙台市に本拠地を置く七十七銀行のスマホ向けアプリ『七十七銀行アプリ』を使おうとしたところまったくうまくいかず、窓口で尋ねてわかったことの備忘録です。

スクリーンショットはiPhoneで撮りましたが、実際にはiOS/Androidの両方で試し、同じエラーが出ていますので、おそらく同じ挙動をすると思われます。

Read More

Eclipseのプラグイン、JBoss Toolsに含まれるHibernate Toolsを使いRDBMSのテーブル構造から自動でHibernateのマッピングファイル群を生成(Hibernate Code Generation)しようとしたとき、下図のようにコメントなど日本語部分が文字化けしてしまうことがあります。

image

文字化けに気づかず実行すると下記のようなメッセージで例外が発生することがあります。

Error parsing XML: XML InputStream(5) 1バイトのUTF-8シーケンスのバイト1が無効です。

Read More

Microsoft Access.mdbファイル/.accdbファイルから、テーブル/クエリ/フォーム/レポート/モジュール/マクロの一覧表を作成するプログラムを公開します。

(2020/02/06更新)

2020-02-02 (1) Read More

C#やVB .NETでExcelを使わずにExcelのファイルを読み込むときの定番NPOIを使用せずExcelDataReaderで文字化けなくファイルを読み込むための方法です。

ExcelDataReaderを用いて.xlsファイルを読み込み、文字化けを起こした例

Read More

タミヤの『楽しい工作シリーズ No.227 カムロボット工作セット』と『IchigoJam』の組み合わせで動くサンプルプログラムを作ってみました。

プログラムを実行するとIchigoJamにつながっているキーボードがリモコンになり、キー入力をするとカムロボット(カムロボ)が動きます。

IMG_1215

Read More

KB4497934を適用するとレイアウトが崩れる?」の続きです。

検索キーワードが絞り込めたので、改めてインターネットを検索してみるとQiita@tfukumoriさんの記事が見つかりました。

2019/4/26のWindows 新元号(令和)対応パッチでのフォント変更?での不具合調査(Windows 7, 10 1803, .NET, Excel)』 (https://qiita.com/tfukumori/items/a1fb3984a3488875515e)

@tfukumoriさんの記事を読んでいくと自分が遭遇している現象と同じようです。

自分の場合、KB4497934で現象が起きましたが、俗に「令和対応」と呼ばれるパッチがリリースされたあたりから発生しているようです。

さらに読み進めていくと、この現象を解決するための修正パッチが配布されているようです。

Windows Updateでの修正(5/15追記)

Windows Update 定例パッチ(Bリリース、アメリカ第2火曜日の翌日、日本では5/15)で修正されたようです。

えっ、自分の環境では解決できていない…

ページに書いてあった情報をヒントに試してみたところ、解決ができたので修正方法を以下に記載します。

Read More