Mac VMを整理中

最近個人的に積極的に断捨離を進めている状況。一時期の段ボール部屋的な状況はかなり改善されており身軽にすることはよいなーとつくづく思っているところです(最近のCD画像も断捨離準備の一環)

いろいろ残っているものの中でかなり比重が大きくなってきているのが中古のMac機材。Mac Plus~MacBook ProまでPowerPC Macを中心におそらく10台以上ある(個人的にはもうMacは避けているというのに仕事で使わざるを得ないことが結構あるのです)

断捨離の過程でこれら馬鹿でかいハードを保存することはありえないものの、自分で作った中のソフトや関わったソフトなど、自分の中で「時代」が含まれているソフトとOS環境はそれなりにあるため、現在Mac VMを整理しつつある。

一時期はVMというと不正利用と表裏な時代もあったが、これだけのクラウドの時代に実機を個人で温存するというのはナンセンスだろう。歴史的な実機保存はパブリックな博物館やホビーストが私より全然よい状態でやるだろうし、そういうところに含まれない個人環境をクラウド/NASに吸い上げて、最新PCの上で動かせる状況のほうがはるかによい「時代」の供養だろう。そこで現用機であるIntel Mac系列はまだそのままとした上で、68K Mac,PPC Macの環境をVMにすいあげる方向で整理をはじめている。

Mac VMについての現時点の一番よい情報先
https://www.emaculation.com/forum/

あわよくば「時代」がうまったフロッピーディスク、MO、ZIP、MD、CD-R、SCSI HDDを朽ちてしまう前の今のうちに吸い上げたいのだ(フロッピーディスクは一部は厳しい状況にある)

[Apache poi]そろそろXSSFがデフォルトでよいんじゃないかな

賛否はあるもののお客さんからはExcel等でドキュメントを要求されることが多いことも事実。なのでApache poi(Apacheで出しているMS Excel.Word等MS文書をJavaで操作するライブラリ)などでドキュメント自動生成みたいなところを結局最近やっているのだが、Excel操作ライブラリはXSSF系APIとHSSF系APIに分かれている。

HSSFは拡張子xlsの旧形式、XSSFは拡張子xlsxの今の形式用のAPI。Excelも長いのでAPIが2系統に分かれているのは仕方ないと思うものの、そろそろXSSFがデフォルトでよいんじゃないかなぁ。

Workbook wb = WorkbookFactory.create("file.xslx")
↓
XSSFWorkbook wb = (XSSFWorkbook)WorkbookFactory.create("file.xslx")
または
XSSFWorkbook wb = new XSSFWorkbook("file.xslx")

IDEのコンテキストメニューでAPIがさくっと出ないし、ネットの情報でもHSSFの情報と混じって小一時間悩むし。

[sbt]あまり複雑なことを考えずに機能を追加する

正直まだsbtは理解できていない。まぁ依存性管理ツールはmakeにしろMSbuildにせよ複雑すぎて中をきちんと使いこなすとかできてなかったし。出来合スクリプトで困らんし。

なので専門家からするとまずいのかもしれないが、とりあえず既存のビルドの動きに何かを付け足すくらいの話向け。

  1. ちょこっと作業をまとめたバッチを作りたいだけなのよ→コマンドを使う
    https://www.scala-sbt.org/1.x/docs/ja/Howto-Sequence-using-Commands.html
build.sbt

commands += Command.command("batchtest") { state =>
  "testOnly somepackage.ValidationSpec > list.txt" ::
  "testOnly somepackage.ExecSpec >> list.txt" ::
    state
}

2. タスクを作りたいのよ、タスクの前後にラベルを出したいのよ→ 単純なタスク作成
https://qiita.com/mtn81/items/ce482ed16a19f770cc68

3. sbtから外部コマンドを呼びたいのよ→ shell起動
https://www.scala-sbt.org/release/docs/Process.html

lazy val batch = taskKey[Unit]("外部バッチ")
batch in Test := {"powershell.exe ls " !}

4. 依存関係は悩まずにタスクからタスクを呼びたいのよ→ runTask, runInputTask
https://stackoverflow.com/questions/32142055/how-to-call-sbt-inputtask-dynamically

build.sbt

lazy val batch2 = taskKey[Unit]("ドキュメント生成呼び")
batch2 in Test := (doc in Test).value

lazy val batch3 = taskKey[Unit]("テスト1つだけ呼び")
batch3 in Test := (testOnly in Test).toTask(" somepackage.ValidationSpec").value
(↑ toTask(" の部分のスペースが重要)

5. 依存関係は悩まずにタスクでタスクを連続実行させたいのよ→Def.sequential
https://www.scala-sbt.org/1.x/docs/ja/Howto-Sequential-Task.html

build.sbt

lazy val batch4 = taskKey[Unit]("タスク連続")
batch4 in Test := {
  Def.sequential(
    Def.task {
      "powershell.exe date" !
    } ,
    Def.task {
      (testOnly in Test).toTask(" somepackage.ValidationSpec").value
  ).value
}

6. プロジェクトにREPL代わりに書いたAppコードをsbtから呼びたいのよ→runMain

Hello.scala

package tools

object Hello extends App {
   println("Hello")
}
build.sbt

lazy val batch5 = taskKey[Unit]("内部ツール呼び出し")
batch5 in Test := (runMain in Test).toTask(" tools.Hello").value
(↑ toTask(" の部分のスペースが重要)