【技術】javaでSeleniumを使用する
javaでテスト工数を削減する方法としてjunitの利用が考えられますが、プログラムテストには有効であるものの、結合テストのように画面を打鍵してテストをする場合には活用することができません。
画面を一定の法則に基づき自動で操作・試験できるツールがないものかと探していたら無料のツール「Selenium」がありました。
Seleniumとは?
ブラウザを自動で操作できるツールです。
google ChromeやMicrosoft Edge等、複数ブラウザに対応しています。
画面操作をプログラムコードで指定できるので、何度も同じテストを繰り返す際にとても役に立つと思います。
Seleniumの準備
Edge用のWebDriverの準備
まずはEdgeのバージョン確認
Edgeの[設定]->[全般]から一番下までスクロールするとバージョンを確認できます。
EdgeのバージョンにあったWebDriverをダウンロードページからダウンロードします。

「edgedriver_win64.zip」がダウンロードされますので解凍します。
解凍すると「msedgedriver.exe」が確認できると思います。
このファイルがEdgeのWebDriverの実行ファイルとなり、SeleniumでEdgeを操作する場合に利用することになります。
pom.xml
Eclipseを用意し、Java実行環境およびMavenの実行環境を準備します。
pom.xmlにselenium-javaのライブラリを設定します。
基本的に最新バージョンで問題ないかと思います。
※今回はバージョン指定していませんが、
selenium-javaのバージョンはこちらのサイトからご確認ください。
<!-- HTMLのコメント -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</dependency>
Seleniumの実行
今回はJava11で動作確認しています。
Cドライブのoptフォルダにダウンロードした「msedgedriver.exe」を配置します。
以下コードを準備し、Eclipse上から起動すると自動でMicrosoftEdgeが起動されます。
※MicrosoftEdgeを起動した状態でソースコードを実行するとうまく起動できない場合があります。
<!-- HTMLのコメント --> import org.openqa.selenium.edge.EdgeDriver; public class Main2 { public static void main(String args[]) { System.setProperty("webdriver.edge.driver", "C:\\opt\\msedgedriver.exe"); EdgeDriver driver = new EdgeDriver(); // ウィンドウを最大化 driver.manage().window().maximize(); try { driver.navigate().to("https://google.co.jp"); Thread.sleep(15000); } catch (Exception e) { e.printStackTrace(); } finally { driver.quit(); } } }
下記のようにMicrosoft Edgeでgoogleのサイトが開けたと思います。
seleniumではテキストの入力やボタンの実行まで行うことが可能なので今後試してみたいと思います。

【技術】IPAによるプロジェクト工程の比率
プロジェクトの見積作業をする上で確認したいIPAが公開している「ソフトウェア開発データ白書」を抜粋しています。
プロジェクトの特性により各工程の比率は変わると思いますが、ある程度参考として使用できる情報となります。
特に試算見積や概算見積を行う際の指標として活用することで役に立つのではないでしょうか。

上記の内容から中央値を計算すると以下のようになると思います。
| 工程 | 割合 |
|---|---|
| 基本設計 | 18% |
| 詳細設計 | 18% |
| 製造 | 31% |
| 結合テスト | 20% |
| 総合テスト | 13% |
私が最近担当したプロジェクトでは製造がIPA指標よりも低く、総合テストが高かった印象です。
これはテスト計画上、総合テストにおいて行う業務分岐が多いためにテストケースが増加したことが考えられます。
そのため、あくまでも概算見積で極端に見積の割合がIPA指標とズレているかを確認し、実態のプロジェクトに沿った
詳細見積フェーズに進むのが正しいかと思います。
【技術】Javaでマクロ機能が有効なxlsmファイル、パスワード付きxlsxファイルを開く(poiを活用してExcelファイル操作)
はじめに
javaのpoiを活用してxlsm(マクロ付きファイル)とパスワード付きのExcelファイルを開いてみたいと思います。
import java.io.FileInputStream; import java.io.InputStream; import org.apache.poi.poifs.crypt.Decryptor; import org.apache.poi.poifs.crypt.EncryptionInfo; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class TestBook { public static void main(String[] args) { Workbook excel = null; try { excel = new XSSFWorkbook("D:\\temp\\test\\macro.xlsm"); Sheet sheet = excel.getSheetAt(0); for (int i = 0; i < 10; i++) { System.out.println(sheet.getRow(0).getCell(i)); } FileInputStream fi = new FileInputStream("D:\\temp\\test\\password.xlsx"); POIFSFileSystem filesystem = new POIFSFileSystem(fi); EncryptionInfo info = new EncryptionInfo(filesystem); Decryptor d = Decryptor.getInstance(info); if (d.verifyPassword("test") == false) { System.out.println("パスワードを解除できませんでした"); return; } InputStream is = d.getDataStream(filesystem); Workbook wb2 = new XSSFWorkbook(is); Sheet sheet2 = wb2.getSheetAt(0); for (int i = 0; i < 10; i++) { System.out.println(sheet2.getRow(0).getCell(i)); } } catch (Exception e) { e.printStackTrace(); } } }

【技術】Spring Framework(Spring Boot)の脆弱性について
はじめに
近年のJava Frameworkとしては一番有名で多くのWebアプリケーションで利用されているSpringFrameworkの脆弱性が報告されました。
https://news.yahoo.co.jp/articles/7ac22399534170da9792cebfa5e507d68a5f6effnews.yahoo.co.jp
問題について
- JDK9以上で実行されるSpring Frameworkでリモートコード実行が可能な脆弱性が確認されたとのこと。
- Spring FrameworkはJavaで採用される主流なフレームワークの1つのため、Javaで実行されるWebアプリケーションで利用している可能性がある。
- Spring FrameworkはSpring Bootでも使用されており、近年ではSpring Bootを活用したWebアプリケーションが多く実装されており、広範囲のWebアプリに影響が考えられる。
影響を受ける条件
- 実行される環境がJDK9以上
- 影響を受けるSping Frameworkバージョンを利用
- 影響を受けるSpring Frameworkバージョンを包括したSpring Bootを利用
影響を受けるバージョン
- Spring Framework 5.3.0~5.3.17
- Spring Framework 5.2.0~5.2.19
- Spring Boot 2.6
- Spring Boot 2.5
最新版への更新
- 脆弱性へ対応したバージョンに更新する。
■バージョンと推奨対策
Spring Framework 5.3 5.3.18以上に更新
Spring Framework 5.2 5.2.20以上に更新
- Spring Bootを利用している場合はSpring Framework 5.3.18に依存しているため脆弱性対応のバージョンに更新する。
■バージョンと推奨対応策
Spring Boot 2.6 2.6.6以上に更新
Spring Boot 2.5 2.5.12以上に更新
さいごに
インターネットを検索する限り、悪用の実績はまだ見受けられません。
ただし、SpringFrameworkを活用している場合、Webアプリケーションであるため、インターネットシステムは早急な対応が求められると思います。

【今すぐ解約すべき】NHKを解約してから
NHK解約
私は2年前にテレビが故障した際にテレビをリサイクルし、NHKを解約しました。長年毎年徴収されていたお金は手元に残り、もうテレビを買う&見る生活には戻れません。世間がNHKに対する批判をしているのを見かけますが、テレビはリサイクルに出すべきだと思っています。

NHKを解約してから
家にテレビはありませんので、我が家ではiPad等でTVerやamazon prime、YouTubeを映して動画を視聴しています。楽しそうな民放番組はけっこうTVerで放送していますので、これだけあればテレビなんて捨てて良いかと思います。ニュースはネットやTwitterからテレビよりも早く情報が入手できるし、近年コロナ禍において左派によるマインドコントロールが激しいこともあるので、変な番組による誤ったインプットをせずに済むというメリットもあります。
【実践】NHKを解約してみた
最近のNHKについて
最近以下のニュースを目にしました。
受信料制度のあり方などについて議論する総務省の有識者検討会分科会で、両制度の導入に向けた放送法改正を要望した。想定では、未契約者やテレビを持っていない人にテレビ設置の有無についてNHKに報告を求め、応じない人の氏名などを公的機関に照会する流れになっている。最終的には裁判も視野に入れており、国民に負担を強いる内容となっている。
NHKは何様なのでしょうか。内部留保が6000億近くあるというお化け企業にも関わらずわざわざ届け出までさせる必要がありますか?値引きが実現しても数十円。。菅政権になり携帯料金が注目されていますが、携帯は格安スマホを選択できます。でもNHKは契約の選択をすることができません。
そんな事を考えている最中、なんと我が家のテレビが壊れました。38型の10年物です。真っ黒な画面に信号なしが表示された状態で直りそうにありません。
家族会議になりましたが、以下の意見から買い替えは取りやめとなりました。
1. 最近テレビを見ていない。とりあえず映しておくようになっていた。
2. 子供がコロナのニュースを怖がる。
3. アニメはAmazon prime、ニュースはネットがある。
4. メディアの洗脳に騙されることが多くなってきた。
5. 見たいドラマはバラエティ番組Tverアプリで視聴可能。
たしかに冷静に考えればテレビってそこまで重要じゃない世の中になりました。ネットがあれば不要です。
NHKは年間24770円かかる。
そう、NHKは衛星放送込みで年間25,000円くらいかかります。これが死ぬまで続きます。今から50年払い続けた場合どれだけNHKに支払うか計算したことありますか??なんと125万です。あの平均年収1100万の企業に125万も差し出したくありません。なんか腹が立ってきますよね。
NHKの支払い義務
NHKは以下のように放送法により、対象の家庭は支払う義務が発生します。これはNHK放送を受信できるテレビやワンセグ、カーナビなどの機器を持つ全ての人」に支払い義務が発生します。
・放送法 第32条 (受信契約及び受信料)
1、協会の放送を受信することのできる受信設備を設置した者は、協会とその放送の受信についての契約をしなければならない。ただし、放送の受信を目的としない受信設備又はラジオ放送(音声その他の音響を送る放送であって、テレビジョン放送及び多重放送に該当しないものを言う。)若しくは多重放送に限り受信することのできる受信設備のみを設置した者については、この限りでない。
2、協会は、あらかじめ総務大臣の認可を受けた基準によるのでなければ、前項本文の規定により契約を締結したものから徴収する受信料を免除してはならない。
3、協会は、第1項の契約の条項については、あらかじめ総務大臣の認可を受けなければならない。これを変更しようとするときも同様とする。
NHKの支払い義務が発生しない対象とは?
NHKの支払いをする必要のないケースとしては受信機の設置がない方です。テレビや携帯や車のワンセグが無ければ支払う必要はありません。テレビの壊れた私はこれで決意しました。もうテレビを買うのはやめて、NHKを解約しよう。
リサイクル券を郵便局で受け取る
NHKを解約するには受信機を撤去した証明が必要かとなります。そのため我が家はテレビをリサイクルに出し、リサイクル証明書を使用することに決めました。まずは郵便局に行き、リサイクル券を購入します。ここで重要なのが、テレビのメーカーやサイズを把握しておくことです。チェックをつける欄があり、間違えると料金が異なり、リサイクルに出せません。
指定取引所へ
郵便局でリサイクル券入手し、リサイクル料の払込が完了したら都道府県毎に用意されているリサイクル業者まで持ち込みます。私の場合は埼玉県の業者に持ち込みました。
業者に支払済みのリサイクル券とテレビを渡すと受領印を押してもらえますので、これを証明書に使います。
NHKに電話する
私は以下の連絡先に電話しました。きっとなかなかつながりにくいに違いないと思いましたが、案外あっさり繋がりました。
テレビが壊れた旨を伝えると証明書があるか?他に受信機がないか?という質問に対してYes。今後テレビを購入する予定があるか?という質問者にNoと答えたら解約申込書を発送してくれることになりました。
よく聞く「必ず解約させない」ような電話応対は全くありませんでした。真摯に受け答えしていただきとても感謝しています。
解約申込書が到着される
電話から3営業日後、解約申込書到着します。
解約申込書に署名してリサイクル証明書(リサイクル業者押印の控えのコピーと郵便局の支払い領収書のコピー)を同封し、あとは解約されるのを待ちます。
4週間後
4週間後、連絡なし。
いつになっても解約しましたの連絡や書類が届かないので催促の電話をすると解約申込書を送って2週間で解約手続きは完了しているとのこと。解約した場合は何も通知がないの?と驚きましたが、余計なコストをかけないのが正しい姿かもしれません。
感想
思い立ったが吉日。行動に移せば最短3週間でNHKと解約することが可能なことが分かりました。もうテレビを買うことは無いと思います。そして今後も支払うはずだった150万が浮いたことに安堵。家庭の固定費に上がってこないだけで幸せな気分になれます。また、メディアにから嘘の情報を受け取り、洗脳されることもないでしょう。再度テレビを設置するのであれば再契約が必要となりますが、私のように受信機なしの方は解約してみてはいかがでしょうか。
【開発】JavaでExcelのパスワード設定

はじめに
JavaのExcelパスワード対応について色々なサイトを見ながら試してみましたが、POIやJavaのバージョン違いやExcelがxlsだと正常に動作する等古い情報が多く悩んでいましたがなんとか解決しました。コピペでうまく動かないのは記事が古かったりするからバージョン差異が生まれちゃうんですね。。
ソースコードサンプル
実装確認ソースは以下の通りです。
POM.xml
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency>
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.poifs.crypt.Decryptor; import org.apache.poi.poifs.crypt.EncryptionInfo; import org.apache.poi.poifs.crypt.Encryptor; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class ExcelPasswordTest { /** * Excel出力 */ public static void main(String args[]) { FileInputStream fi = null; POIFSFileSystem fileSystem = null; InputStream is = null; Workbook wb = null; try { // パスワード String password = "password"; String baseFile = "C:\\data\\tmp\\input\\input.xlsx"; String outFile = "C:\\data\\tmp\\output\\output.xlsx"; fi = new FileInputStream(baseFile); fileSystem = new POIFSFileSystem(fi); EncryptionInfo info = new EncryptionInfo(fileSystem); Decryptor d = Decryptor.getInstance(info); // inputファイルがパスワードで開けるか検証 if (d.verifyPassword(password) == false) { // inputが開けない場合、エラー throw new Exception("input開けない"); } is = d.getDataStream(fileSystem); wb = WorkbookFactory.create(is); Sheet sheet = wb.getSheet("sheet1"); sheet.getRow(0).getCell(0).setCellValue("test"); // 新規ファイルとして保存(この時点ではパスワード無し) FileOutputStream out = new FileOutputStream(outFile); wb.write(out); is.close(); wb.close(); POIFSFileSystem fs = new POIFSFileSystem(); Encryptor encryptor = info.getEncryptor(); encryptor.confirmPassword(password); OutputStream os = encryptor.getDataStream(fs); OPCPackage opcPackage = OPCPackage.open(new File(outFile), PackageAccess.READ_WRITE); opcPackage.save(os); opcPackage.close(); os.close(); // パスワード付き保存 FileOutputStream fos = new FileOutputStream(outFile); fs.writeFilesystem(fos); fs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (wb != null) { wb.close(); } if (is != null) { is.close(); } if (fi != null) { fi.close(); } } catch (IOException e) { e.printStackTrace(); } } }
【jsp】コメントの書き方に気を付けよう

はじめに
JSPページを作成する場合、HTML文としてのコメント、JSPとしてのコメント、Javaとしてのコメント、の3種類のコメントが最大で含まれる事になります。eclipseのような統合開発環境を使用したとしてもJSPファイルを開くと全てコメント表示されてしまい、実際は動作するソースだった・・・なんてこともありますので、しっかりと復習したいところです。
HTMLのコメント
JSPページ内ではHTML文を直接記述できますので、HTML文の構文に沿ったコメントを記述することも出来ます。HTML文の場合は次のように記述します。
<!-- HTMLのコメント -->
以下のようにでjavascriptを囲むのは要注意
これはHTML4.0の頃からのなごりに近いですが、HTMLがレンダリングされた時にJavascriptコードを見せなくする手法のようです。functionのfuncはコメントアウトされておらず、実行されます。
<script language="JavaScript"> <!-- var test = null; function func(){ console.log(test); } //--> </script>
【Java】var「型推論」を使ってみよう

はじめに
最近Javaを触る機会が多かったのですが、Java1.4からの人間として育ったアラフォーのため、Java6を少しかじっている程度だと非常に効率が悪いことが分かり、少しずつ新機能を勉強していこうと思います。
java10~11の新APIを覚える
今回は型推論と呼ばれているvarというものを学んでいきたいと思います。 Javaは型制約が強く、左と右がしっかりと合っていないとコンパイルエラーや型が明確でないとIDEでは警告扱いになっていたと思います。どうも型「var」はJavascript等のスクリプト言語と同様に左側の型を意識することなく変数を定義できるようになるとのことです。
varを使ってみよう
右辺でインスタンス化している場合
// 右辺に型名がそのまま書いてあるので、何の型か一見してわかる var dateTest = new Date(); var scannerTest = new Scanner(System.in); var listTest = new ArrayList<String>();
すごいですね。今まできっちりと左側の型を明示的にしておく必要があったのにEclipse上で全く怒られません。
型推論とは
この「var」は型推論と呼ばれており、型を推測させる変数名で補ってあげる必要があります。 先ほどの変数名はDate型であれば変数名にdateを用いる、ArrayListであればlistを用いる等、明示的に変数で想定させるような書き方をしてあげる必要があります。そうでないと何の型が入っているのか全く分からなくなってしまいます。
IDEではきちんと型を把握している
ArrayListのvar変数を宣言しているとIDEはArrayListだと認識しているので、アシスト内容もしっかり表示されます。全く問題なくコードは書けそうです。
var listTest = new ArrayList<String>(); listTest.add("a"); listTest.add("b"); listTest.add("c");
varをメソッドの引数定義に指定することはできない。 メソッドの引数の型をvarにしてみたら怒られました。そうですね。何でもありになっちゃうからこれはダメですよね。
/** * 型推論のメソッド定義・・・? * @param date */ public static void funcT(var date) { }
varを引数に渡すことはできる。
これはギリギリOKでした。受け側のメソッド定義をvarの型が合っていればメソッドを呼び出す際にvarを渡すことは可能なようです。安心しました。
/** * テストメソッド * @param str */ public static void funcT1() { var str = "aaa"; funcT2(str); } /** * テストメソッド * @param str */ public static void funcT2(String str) { System.out.println(str); }
varを使用してメソッド内の内部メソッドを定義できる。
これは便利なのか?実際にすごい!と思いましたが、メソッド内にメソッドを簡単に定義できてもそれを外だしのprivateメソッド定義すればよいのではないか?と私は思ってしまうので、良い使い方があれば教えて欲しいです
public static void main(String[] args) { // func.capitalize() で呼び出せる // func はローカル変数なので、このメソッドの外からは呼べない var func = new Object() { private String capitalize(String s) { return s.substring(0, 1).toUpperCase() + s.substring(1, s.length()).toLowerCase(); } }; System.out.println(func.capitalize("tokyo")); // => Tokyo System.out.println(func.capitalize("TOKYO")); // => Tokyo }
【Java】SpringBootのアプリケーションをWindowsサーバーでサービス化する

はじめに
SpringBootのアプリケーションをWindowsサーバーでサービス化します。 LinuxサーバーのサービスとしてSpringbootのJARファイルを指定することは可能ですが、 Windowsの場合、nssmというツールを利用しない限り、サービス化することができません。
サービス化するこのメリット
サービス化することでWindowsサーバーが起動した際に自動でアプリケーションが起動します。 アプリケーションを停止する場合はシャットダウンもしくはサービスの停止で停止が可能です。 起動用のバッチファイルを直接実行してもよいですが、バックグラウンドで起動しているプロセスを 停止する術がコマンドもしくはタスクマネージャしかないのは正直運用に耐えられません。 それではさっそくWindowsサーバーでのサービス化を試してみましょう。
nssmダウンロード
フリーソフトの「NSSM」(http://nssm.cc/download) をダウンロードします。 ダウンロードしたNSSMを所定のフォルダに格納します。 今回は64bit端末のため、「nssm-2.24\win64\nssm.exe」を使用します。
JAR実行用バッチ作成
以下を参考にバッチファイルを作成します。 jarファイル名を置換しておきます。
@echo on setlocal set JAVA_HOME=C:\java set PATH=%JAVA_HOME%\bin;%PATH% set WEBAPP_HOME=C:\apl set WEBAPP_JAR=test.jar set LANG=ja_JP.UTF8 set JAVA_OPTS=-Xms2048M -Xmx2048M set RUN_ARGS=--spring.profiles.active=hon cd /d %WEBAPP_HOME% java -server -jar lib\%WEBAPP_JAR%
サーバーにフォルダを作成する
以下フォルダを作成します。 C:\apl\bat ※バッチファイルを格納します。 C:\apl\java ※実行用Javaを格納します。ここではeclipse同梱のJavaを使用。 C:\apl\lib ※jarファイルを格納します。 C:\apl\logs ※アプリケーションで出力するログフォルダです。logback.xml等で指定が必要。 C:\apl\nssm ※nssmのexeファイルを格納します。
NSSMを実行する
NSSMを実行し、Springbootアプリケーションをサービス化します。 コマンドプロンプトを起動し、以下コマンドを実行します。
cd /d C:\apl\nssm nssm install apl Administrator access is needed to install a service.
以下の画面を起動されるので、起動バッチのパスとディレクトリ、サービス名を指定する。
Successの文字が出力されれば成功です。
* サービス起動
サービスを開くと登録したサービス名が一覧に表示されていますので、試しに起動します。
無事に起動できれば終了です。
失敗した時はバッチファイルのパスの指定やlibフォルダへのJavaファイルの格納ミス等が考えられます。
